ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDFmZDQ1OGMuLjc2YWZiNzcgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMSw1ICsxLDggQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCitpZm5kZWYgV1BBX1NVUFBMSUNBTlRfVkVSU0lPTgorV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiA6PSBWRVJfMF84X1gKK2VuZGlmCiBpZmVxICgkKFdQQV9TVVBQTElDQU5UX1ZFUlNJT04pLFZFUl8wXzhfWCkKICMgVGhlIG9yZGVyIG9mIHRoZSAyIEFuZHJvaWQubWtzIGRvZXMgbWF0dGVyIQogIyBUT0RPOiBDbGVhbiB1cCB0aGUgQW5kcm9pZC5ta3MsIHJlc2V0IGFsbCB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlcyBhdCB0aGUKZGlmZiAtLWdpdCBhL2hvc3RhcGQvQW5kcm9pZC5tayBiL2hvc3RhcGQvQW5kcm9pZC5tawppbmRleCA0NTcxMDAyLi4xMDBlOWNiIDEwMDY0NAotLS0gYS9ob3N0YXBkL0FuZHJvaWQubWsKKysrIGIvaG9zdGFwZC9BbmRyb2lkLm1rCkBAIC0yOSw3ICsyOSw2IEBACiBlbmRpZgogCiBpZmVxICgkKEJPQVJEX1dMQU5fREVWSUNFKSwgcWN3Y24pCi1MX0NGTEFHUyArPSAtREFORFJPSURfUUNPTV9XQ04KIExfQ0ZMQUdTICs9IC1EQU5EUk9JRF9QMlAKIGVuZGlmCiAKQEAgLTg3LDYgKzg2LDcgQEAKIE9CSlMgKz0gc3JjL2FwL2F1dGhzcnYuYwogT0JKUyArPSBzcmMvYXAvaWVlZTgwMl8xeC5jCiBPQkpTICs9IHNyYy9hcC9hcF9jb25maWcuYworT0JKUyArPSBzcmMvYXAvZWFwX3VzZXJfZGIuYwogT0JKUyArPSBzcmMvYXAvaWVlZTgwMl8xMV9hdXRoLmMKIE9CSlMgKz0gc3JjL2FwL3N0YV9pbmZvLmMKIE9CSlMgKz0gc3JjL2FwL3dwYV9hdXRoLmMKQEAgLTIxNSw4ICsyMTUsMTUgQEAKIE5FRURfQUVTX1VOV1JBUD15CiBlbmRpZgogCi1pZmRlZiBDT05GSUdfSUVFRTgwMjExVgotTF9DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExVgoraWZkZWYgQ09ORklHX1NBRQorTF9DRkxBR1MgKz0gLURDT05GSUdfU0FFCitPQkpTICs9IHNyYy9jb21tb24vc2FlLmMKK05FRURfRUNDPXkKK05FRURfREhfR1JPVVBTPXkKK2VuZGlmCisKK2lmZGVmIENPTkZJR19XTk0KK0xfQ0ZMQUdTICs9IC1EQ09ORklHX1dOTQogT0JKUyArPSBzcmMvYXAvd25tX2FwLmMKIGVuZGlmCiAKQEAgLTIyNCwxMCArMjMxLDYgQEAKIExfQ0ZMQUdTICs9IC1EQ09ORklHX0lFRUU4MDIxMU4KIGVuZGlmCiAKLWlmZGVmIENPTkZJR19XTk0KLUxfQ0ZMQUdTICs9IC1EQ09ORklHX1dOTQotZW5kaWYKLQogaWZkZWYgQ09ORklHX0lFRUU4MDIxMUFDCiBMX0NGTEFHUyArPSAtRENPTkZJR19JRUVFODAyMTFBQwogZW5kaWYKQEAgLTQwMiwyNSArNDA1LDEwIEBACiBORUVEX01PREVYUD15CiBDT05GSUdfRUFQPXkKIAotaWZkZWYgQ09ORklHX1dQU19VRkQKLUxfQ0ZMQUdTICs9IC1EQ09ORklHX1dQU19VRkQKLU9CSlMgKz0gc3JjL3dwcy93cHNfdWZkLmMKLU5FRURfV1BTX09PQj15Ci1lbmRpZgotCiBpZmRlZiBDT05GSUdfV1BTX05GQwogTF9DRkxBR1MgKz0gLURDT05GSUdfV1BTX05GQwogT0JKUyArPSBzcmMvd3BzL25kZWYuYwotT0JKUyArPSBzcmMvd3BzL3dwc19uZmMuYwogTkVFRF9XUFNfT09CPXkKLWlmZGVmIENPTkZJR19XUFNfTkZDX1BONTMxCi1QTjUzMV9QQVRIID89IC91c3IvbG9jYWwvc3JjL25mYwotTF9DRkxBR1MgKz0gLURDT05GSUdfV1BTX05GQ19QTjUzMQotTF9DRkxBR1MgKz0gLUkke1BONTMxX1BBVEh9L2luYwotT0JKUyArPSBzcmMvd3BzL3dwc19uZmNfcG41MzEuYwotTElCUyArPSAke1BONTMxX1BBVEh9L2xpYi93cHNuZmMuZGxsCi1MSUJTICs9ICR7UE41MzFfUEFUSH0vbGliL2xpYm5mY19tYXBwaW5nX3BuNTN4LmRsbAotZW5kaWYKIGVuZGlmCiAKIGlmZGVmIE5FRURfV1BTX09PQgpAQCAtNzk0LDYgKzc4MiwxMCBAQAogZW5kaWYKIGVuZGlmCiAKK2lmZGVmIE5FRURfRUNDCitMX0NGTEFHUyArPSAtRENPTkZJR19FQ0MKK2VuZGlmCisKIGlmZGVmIENPTkZJR19OT19SQU5ET01fUE9PTAogTF9DRkxBR1MgKz0gLURDT05GSUdfTk9fUkFORE9NX1BPT0wKIGVsc2UKZGlmZiAtLWdpdCBhL2hvc3RhcGQvQ2hhbmdlTG9nIGIvaG9zdGFwZC9DaGFuZ2VMb2cKaW5kZXggOWZjMDVmNy4uMWE0ZTU2NiAxMDA2NDQKLS0tIGEvaG9zdGFwZC9DaGFuZ2VMb2cKKysrIGIvaG9zdGFwZC9DaGFuZ2VMb2cKQEAgLTEsNSArMSwxMDQgQEAKIENoYW5nZUxvZyBmb3IgaG9zdGFwZAogCis/Pz8/LT8/LT8/IC0gdjIuMQorCSogYWRkZWQgc3VwcG9ydCBmb3Igc2ltdWxhdGFuZW91cyBhdXRoZW50aWNhdGlvbiBvZiBlcXVhbHMgKFNBRSkgZm9yCisJICBzdHJvbmdlciBwYXNzd29yZC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRoIFdQQTItUGVyc29uYWwKKworMjAxMy0wMS0xMiAtIHYyLjAKKwkqIGFkZGVkIEFQLVNUQS1ESVNDT05ORUNURUQgY3RybF9pZmFjZSBldmVudAorCSogaW1wcm92ZWQgZGVidWcgbG9nZ2luZyAoaHVtYW4gcmVhZGFibGUgZXZlbnQgbmFtZXMsIGludGVyZmFjZSBuYW1lCisJICBpbmNsdWRlZCBpbiBtb3JlIGVudHJpZXMpCisJKiBhZGRlZCBudW1iZXIgb2Ygc21hbGwgY2hhbmdlcyB0byBtYWtlIGl0IGVhc2llciBmb3Igc3RhdGljIGFuYWx5emVycworCSAgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKwkqIGFkZGVkIGEgd29ya2Fyb3VuZCBmb3IgV2luZG93cyA3IE1pY2hhZWwgTUlDIGZhaWx1cmUgcmVwb3J0aW5nIGFuZAorCSAgdXNlIG9mIHRoZSBTZWN1cmUgYml0IGluIEVBUE9MLUtleSBtc2cgMy80CisJKiBmaXhlZCBudW1iZXIgb2Ygc21hbGwgYnVncyAoc2VlIGdpdCBsb2dzIGZvciBtb3JlIGRldGFpbHMpCisJKiBjaGFuZ2VkIE9wZW5TU0wgdG8gcmVhZCBmdWxsIGNlcnRpZmljYXRlIGNoYWluIGZyb20gc2VydmVyX2NlcnQgZmlsZQorCSogbmw4MDIxMTogbnVtYmVyIG9mIHVwZGF0ZXMgdG8gdXNlIG5ldyBjZmc4MDIxMS9ubDgwMjExIGZ1bmN0aW9uYWxpdHkKKwkgIC0gcmVwbGFjZSBtb25pdG9yIGludGVyZmFjZSB3aXRoIG5sODAyMTEgY29tbWFuZHMKKwkgIC0gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZHJpdmVyLWJhc2VkIEFQIFNNRQorCSogRUFQLXB3ZDoKKwkgIC0gZml4IEtERiBmb3IgZ3JvdXAgMjEgYW5kIHplcm8tcGFkZGluZworCSAgLSBhZGRlZCBzdXBwb3J0IGZvciBmcmFnbWVudGF0aW9uCisJICAtIGluY3JlYXNlZCBtYXhpbXVtIG51bWJlciBvZiBodW50aW5nLWFuZC1wZWNraW5nIGl0ZXJhdGlvbnMKKwkqIGF2b2lkIGV4Y2Vzc2l2ZSBQcm9iZSBSZXNwb25zZSByZXRyaWVzIGZvciBicm9hZGNhc3QgUHJvYmUgUmVxdWVzdAorCSAgZnJhbWVzIChvbmx5IHdpdGggZHJpdmVycyB1c2luZyBob3N0YXBkIFNNRS9NTE1FKQorCSogYWRkZWQgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgdXNpbmcgVExTIHYxLjIgKENPTkZJR19UTFNWMTI9eSkKKwkqIGZpeGVkIFdQUyBvcGVyYXRpb24gc3RvcHBpbmcgb24gZHVhbCBjb25jdXJyZW50IEFQCisJKiBhZGRlZCB3cHNfcmZfYmFuZHMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZm9yIG92ZXJyaWRpbmcgUkYgQmFuZHMKKwkgIHZhbHVlIGZvciBXUFMKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIGdldHRpbmcgcGVyLWRldmljZSBQU0sgZnJvbSBSQURJVVMgVHVubmVsLVBhc3N3b3JkCisJKiBhZGRlZCBzdXBwb3J0IGZvciBsaWJubCAzLjIgYW5kIG5ld2VyCisJKiBpbmNyZWFzZWQgaW5pdGlhbCBncm91cCBrZXkgaGFuZHNoYWtlIHJldHJhbnNtaXQgdGltZW91dCB0byA1MDAgbXMKKwkqIGFkZGVkIGEgd29ya2Fyb3VuZCBmb3IgNC13YXkgaGFuZHNoYWtlIHRvIHVwZGF0ZSBTTm9uY2UgZXZlbiBhZnRlcgorCSAgaGF2aW5nIHNlbnQgRUFQT0wtS2V5IDMvNCB0byBhdm9pZCBpc3N1ZXMgd2l0aCBzb21lIHN1cHBsaWNhbnQKKwkgIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbiBjaGFuZ2UgU05vbmNlIGZvciBlYWNoIEVBUC1LZXkgMi80CisJKiBhZGRlZCBhIHdvcmthcm91bmQgZm9yIEVBUE9MLUtleSA0LzQgdXNpbmcgaW5jb3JyZWN0IHR5cGUgdmFsdWUgaW4KKwkgIFdQQTIgbW9kZSAoc29tZSBkZXBsb3llZCBzdGF0aW9ucyB1c2UgV1BBIHR5cGUgaW4gdGhhdCBtZXNzYWdlKQorCSogYWRkZWQgYSBXUFMgd29ya2Fyb3VuZCBmb3IgbWl4ZWQgbW9kZSBBUCBTZXR0aW5ncyB3aXRoIFdpbmRvd3MgNworCSogY2hhbmdlZCBXUFMgQVAgUElOIGRpc2FibGluZyBtZWNoYW5pc20gdG8gZGlzYWJsZSB0aGUgUElOIGFmdGVyIDEwCisJICBjb25zZWN1dGl2ZSBmYWlsdXJlcyBpbiBhZGRpdGlvbiB0byB1c2luZyB0aGUgZXhwb25lbnRpYWwgbG9ja291dAorCSAgcGVyaW9kCisJKiBhZGRlZCBzdXBwb3J0IGZvciBXRkEgSG90c3BvdCAyLjAKKwkgIC0gR0FTL0FOUVAgYWR2ZXJ0aXNlbWVudCBvZiBuZXR3b3JrIGluZm9ybWF0aW9uCisJICAtIGRpc2FibGVfZGdhZiBwYXJhbWV0ZXIgdG8gZGlzYWJsZSBkb3duc3RyZWFtIGdyb3VwLWFkZHJlc3NlZAorCSAgICBmb3J3YXJkaW5nCisJKiBzaW1wbGlmaWVkIGxpY2Vuc2luZyB0ZXJtcyBieSBzZWxlY3RpbmcgdGhlIEJTRCBsaWNlbnNlIGFzIHRoZSBvbmx5CisJICBhbHRlcm5hdGl2ZQorCSogRUFQLVNJTTogZml4ZWQgcmUtYXV0aGVudGljYXRpb24gbm90IHRvIHVwZGF0ZSBwc2V1ZG9ueW0KKwkqIEVBUC1TSU06IHVzZSBOb3RpZmljYXRpb24gcm91bmQgYmVmb3JlIEVBUC1GYWlsdXJlCisJKiBFQVAtQUtBOiBhZGRlZCBzdXBwb3J0IGZvciBBVF9DT1VOVEVSX1RPT19TTUFMTAorCSogRUFQLUFLQTogc2tpcCBBS0EvSWRlbnRpdHkgZXhjaGFuZ2UgaWYgRUFQIGlkZW50aXR5IGlzIHJlY29nbml6ZWQKKwkqIEVBUC1BS0EnOiBmaXhlZCBpZGVudGl0eSBmb3IgTUsgZGVyaXZhdGlvbgorCSogRUFQLUFLQSc6IHVwZGF0ZWQgdG8gUkZDIDU0NDggKHVzZXJuYW1lIHByZWZpeGVzIGNoYW5nZWQpOyBub3RlOiB0aGlzCisJICBicmVha3MgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zCisJKiBFQVAtU0lNL0FLQTogYWxsb3cgcHNldWRvbnltIHRvIGJlIHVzZWQgYWZ0ZXIgdW5rbm93biByZWF1dGggaWQKKwkqIGNoYW5nZWQgQU5vbmNlIHRvIGJlIGEgcmFuZG9tIG51bWJlciBpbnN0ZWFkIG9mIENvdW50ZXItYmFzZWQKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIGNhbmNlbGluZyBXUFMgb3BlcmF0aW9ucyB3aXRoIGhvc3RhcGRfY2xpIHdwc19jYW5jZWwKKwkqIGZpeGVkIEVBUC9XUFMgdG8gUFNLIHRyYW5zaXRpb24gb24gcmVhc3NvY2lhdGlvbiBpbiBjYXNlcyB3aGVyZQorCSAgZGVhdXRoZW50aWNhdGlvbiBpcyBtaXNzZWQKKwkqIGhscl9hdWNfZ3cgZW5oYW5jZW1lbnRzOgorCSAgLSBhIG5ldyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIC11IGNhbiBiZSB1c2VkIHRvIGVuYWJsZSB1cGRhdGluZyBvZgorCSAgICBTUU4gaW4gTWlsZW5hZ2UgZmlsZQorCSAgLSB1c2UgNSBiaXQgSU5EIGZvciBTUU4gdXBkYXRlcworCSAgLSBTUUxpdGUgZGF0YWJhc2UgY2FuIG5vdyBiZSB1c2VkIHRvIHN0b3JlIE1pbGVuYWdlIGluZm9ybWF0aW9uCisJKiBFQVAtU0lNL0FLQSBEQjogYWRkZWQgb3B0aW9uYWwgdXNlIG9mIFNRTGl0ZSBkYXRhYmFzZSBmb3IgcHNldWRvbnltcworCSAgYW5kIHJlYXV0aCBkYXRhCisJKiBhZGRlZCBzdXBwb3J0IGZvciBDaGFyZ2VhYmxlLVVzZXItSWRlbnRpdHkgKFJGQyA0MzcyKQorCSogYWRkZWQgcmFkaXVzX2F1dGhfcmVxX2F0dHIgYW5kIHJhZGl1c19hY2N0X3JlcV9hdHRyIGNvbmZpZ3VyYXRpb24KKwkgIHBhcmFtZXRlcnMgdG8gYWxsb3cgYWRkaW5nL292ZXJyaWRpbmcgb2YgUkFESVVTIGF0dHJpYnV0ZXMgaW4KKwkgIEFjY2Vzcy1SZXF1ZXN0IGFuZCBBY2NvdW50aW5nLVJlcXVlc3QgcGFja2V0cworCSogYWRkZWQgc3VwcG9ydCBmb3IgUkFESVVTIGR5bmFtaWMgYXV0aG9yaXphdGlvbiBzZXJ2ZXIgKFJGQyA1MTc2KQorCSogYWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciBXTk0gb3BlcmF0aW9ucworCSAgLSBCU1MgbWF4IGlkbGUgcGVyaW9kCisJICAtIFdOTS1TbGVlcCBNb2RlCisJKiBhZGRlZCBuZXcgV1BTIE5GQyBjdHJsX2lmYWNlIG1lY2hhbmlzbQorCSAgLSByZW1vdmVkIG9ic29sZXRlZCBXUFNfT09CIGNvbW1hbmQgKGluY2x1ZGluZyBzdXBwb3J0IGZvciBkZXByZWNhdGVkCisJICAgIFVGRCBjb25maWdfbWV0aG9kKQorCSogYWRkZWQgRlQgc3VwcG9ydCBmb3IgZHJpdmVycyB0aGF0IGltcGxlbWVudCBNTE1FIGludGVybmFsbHkKKwkqIGFkZGVkIFNBIFF1ZXJ5IHN1cHBvcnQgZm9yIGRyaXZlcnMgdGhhdCBpbXBsZW1lbnQgTUxNRSBpbnRlcm5hbGx5CisJKiByZW1vdmVkIGRlZmF1bHQgQUNNPTEgZnJvbSBBQ19WTyBhbmQgQUNfVkkKKwkqIGNoYW5nZWQgVkVORE9SLVRFU1QgRUFQIG1ldGhvZCB0byB1c2UgcHJvcGVyIHByaXZhdGUgZW50ZXJwcmlzZSBudW1iZXIKKwkgICh0aGlzIHdpbGwgbm90IGludGVyb3BlcmF0ZSB3aXRoIG9sZGVyIHZlcnNpb25zKQorCSogYWRkZWQgaG9zdGFwZC5jb25mIHBhcmFtZXRlciB2ZW5kb3JfZWxlbWVudHMgdG8gYWxsb3cgYXJiaXRyYXJ5IHZlbmRvcgorCSAgc3BlY2lmaWMgZWxlbWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlIEJlYWNvbiBhbmQgUHJvYmUgUmVzcG9uc2UgZnJhbWVzCisJKiBhZGRlZCBzdXBwb3J0IGZvciBjb25maWd1cmluZyBHQ01QIGNpcGhlciBmb3IgSUVFRSA4MDIuMTFhZAorCSogYWRkZWQgc3VwcG9ydCBmb3IgMjU2LWJpdCBBRVMgd2l0aCBpbnRlcm5hbCBUTFMgaW1wbGVtZW50YXRpb24KKwkqIGNoYW5nZWQgRUFQT0wgdHJhbnNtaXNzaW9uIHRvIHVzZSBBQ19WTyBpZiBXTU0gaXMgYWN0aXZlCisJKiBmaXhlZCBFQVAtVExTL1BFQVAvVFRMUy9GQVNUIHNlcnZlciB0byB2YWxpZGF0ZSBUTFMgTWVzc2FnZSBMZW5ndGgKKwkgIGNvcnJlY3RseTsgaW52YWxpZCBtZXNzYWdlcyBjb3VsZCBoYXZlIGNhdXNlZCB0aGUgaG9zdGFwZCBwcm9jZXNzIHRvCisJICB0ZXJtaW5hdGUgYmVmb3JlIHRoaXMgZml4IFtDVkUtMjAxMi00NDQ1XQorCSogbGltaXQgbnVtYmVyIG9mIGFjdGl2ZSB3aWxkY2FyZCBQSU5zIGZvciBXUFMgUmVnaXN0cmFyIHRvIG9uZSB0byBhdm9pZAorCSAgY29uZnVzaW5nIGJlaGF2aW9yIHdpdGggbXVsdGlwbGUgd2lsZGNhcmQgUElOcworCSogYWRkZWQgYSB3b3JrYXJvdW5kIGZvciBXUFMgUEJDIHNlc3Npb24gb3ZlcmxhcCBkZXRlY3Rpb24gdG8gYXZvaWQKKwkgIGludGVyb3AgaXNzdWVzIHdpdGggZGVwbG95ZWQgc3RhdGlvbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3QKKwkgIHJlbW92ZSBhY3RpdmUgUEJDIGluZGljYXRpb24gZnJvbSBQcm9iZSBSZXF1ZXN0IGZyYW1lcyBwcm9wZXJseQorCSogYWRkZWQgc3VwcG9ydCBmb3IgdXNpbmcgU1FMaXRlIGZvciB0aGUgZWFwX3VzZXIgZGF0YWJhc2UKKwkqIGFkZGVkIEFjY3QtU2Vzc2lvbi1JZCBhdHRyaWJ1dGUgaW50byBBY2Nlc3MtUmVxdWVzdCBtZXNzYWdlcworCSogZml4ZWQgRUFQT0wgZnJhbWUgdHJhbnNtaXNzaW9uIHRvIG5vbi1Rb1MgU1RBcyB3aXRoIG5sODAyMTEKKwkgIChkbyBub3Qgc2VuZCBRb1MgZnJhbWVzIGlmIHRoZSBTVEEgZGlkIG5vdCBuZWdvdGlhdGUgdXNlIG9mIFFvUyBmb3IKKwkgIHRoaXMgYXNzb2NpYXRpb24pCisKIDIwMTItMDUtMTAgLSB2MS4wCiAJKiBBZGQgY2hhbm5lbCBzZWxlY3Rpb24gc3VwcG9ydCBpbiBob3N0YXBkLiBTZWUgaG9zdGFwZC5jb25mLgogCSogQWRkIHN1cHBvcnQgZm9yIElFRUUgODAyLjExdiBUaW1lIEFkdmVydGlzZW1lbnQgbWVjaGFuaXNtIHdpdGggVVRDCmRpZmYgLS1naXQgYS9ob3N0YXBkL01ha2VmaWxlIGIvaG9zdGFwZC9NYWtlZmlsZQppbmRleCBmNWRmY2UwLi44NDA0ZTBjIDEwMDY0NAotLS0gYS9ob3N0YXBkL01ha2VmaWxlCisrKyBiL2hvc3RhcGQvTWFrZWZpbGUKQEAgLTQzLDYgKzQzLDcgQEAKIE9CSlMgKz0gLi4vc3JjL2FwL2F1dGhzcnYubwogT0JKUyArPSAuLi9zcmMvYXAvaWVlZTgwMl8xeC5vCiBPQkpTICs9IC4uL3NyYy9hcC9hcF9jb25maWcubworT0JKUyArPSAuLi9zcmMvYXAvZWFwX3VzZXJfZGIubwogT0JKUyArPSAuLi9zcmMvYXAvaWVlZTgwMl8xMV9hdXRoLm8KIE9CSlMgKz0gLi4vc3JjL2FwL3N0YV9pbmZvLm8KIE9CSlMgKz0gLi4vc3JjL2FwL3dwYV9hdXRoLm8KQEAgLTE3MSw4ICsxNzIsMTUgQEAKIE5FRURfQUVTX1VOV1JBUD15CiBlbmRpZgogCi1pZmRlZiBDT05GSUdfSUVFRTgwMjExVgotQ0ZMQUdTICs9IC1EQ09ORklHX0lFRUU4MDIxMVYKK2lmZGVmIENPTkZJR19TQUUKK0NGTEFHUyArPSAtRENPTkZJR19TQUUKK09CSlMgKz0gLi4vc3JjL2NvbW1vbi9zYWUubworTkVFRF9FQ0M9eQorTkVFRF9ESF9HUk9VUFM9eQorZW5kaWYKKworaWZkZWYgQ09ORklHX1dOTQorQ0ZMQUdTICs9IC1EQ09ORklHX1dOTQogT0JKUyArPSAuLi9zcmMvYXAvd25tX2FwLm8KIGVuZGlmCiAKQEAgLTE4MCwxMCArMTg4LDYgQEAKIENGTEFHUyArPSAtRENPTkZJR19JRUVFODAyMTFOCiBlbmRpZgogCi1pZmRlZiBDT05GSUdfV05NCi1DRkxBR1MgKz0gLURDT05GSUdfV05NCi1lbmRpZgotCiBpZmRlZiBDT05GSUdfSUVFRTgwMjExQUMKIENGTEFHUyArPSAtRENPTkZJR19JRUVFODAyMTFBQwogZW5kaWYKQEAgLTM1NywyNSArMzYxLDEwIEBACiBORUVEX01PREVYUD15CiBDT05GSUdfRUFQPXkKIAotaWZkZWYgQ09ORklHX1dQU19VRkQKLUNGTEFHUyArPSAtRENPTkZJR19XUFNfVUZECi1PQkpTICs9IC4uL3NyYy93cHMvd3BzX3VmZC5vCi1ORUVEX1dQU19PT0I9eQotZW5kaWYKLQogaWZkZWYgQ09ORklHX1dQU19ORkMKIENGTEFHUyArPSAtRENPTkZJR19XUFNfTkZDCiBPQkpTICs9IC4uL3NyYy93cHMvbmRlZi5vCi1PQkpTICs9IC4uL3NyYy93cHMvd3BzX25mYy5vCiBORUVEX1dQU19PT0I9eQotaWZkZWYgQ09ORklHX1dQU19ORkNfUE41MzEKLVBONTMxX1BBVEggPz0gL3Vzci9sb2NhbC9zcmMvbmZjCi1DRkxBR1MgKz0gLURDT05GSUdfV1BTX05GQ19QTjUzMQotQ0ZMQUdTICs9IC1JJHtQTjUzMV9QQVRIfS9pbmMKLU9CSlMgKz0gLi4vc3JjL3dwcy93cHNfbmZjX3BuNTMxLm8KLUxJQlMgKz0gJHtQTjUzMV9QQVRIfS9saWIvd3BzbmZjLmRsbAotTElCUyArPSAke1BONTMxX1BBVEh9L2xpYi9saWJuZmNfbWFwcGluZ19wbjUzeC5kbGwKLWVuZGlmCiBlbmRpZgogCiBpZmRlZiBORUVEX1dQU19PT0IKQEAgLTc0NCw2ICs3MzMsMTAgQEAKIGVuZGlmCiBlbmRpZgogCitpZmRlZiBORUVEX0VDQworQ0ZMQUdTICs9IC1EQ09ORklHX0VDQworZW5kaWYKKwogaWZkZWYgQ09ORklHX05PX1JBTkRPTV9QT09MCiBDRkxBR1MgKz0gLURDT05GSUdfTk9fUkFORE9NX1BPT0wKIGVsc2UKZGlmZiAtLWdpdCBhL2hvc3RhcGQvUkVBRE1FIGIvaG9zdGFwZC9SRUFETUUKaW5kZXggMzRkYWQzMC4uMzliNzBjYSAxMDA2NDQKLS0tIGEvaG9zdGFwZC9SRUFETUUKKysrIGIvaG9zdGFwZC9SRUFETUUKQEAgLTIsNyArMiw3IEBACiAJICBBdXRoZW50aWNhdG9yIGFuZCBSQURJVVMgYXV0aGVudGljYXRpb24gc2VydmVyCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLUNvcHlyaWdodCAoYykgMjAwMi0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiBhbmQgY29udHJpYnV0b3JzCitDb3B5cmlnaHQgKGMpIDIwMDItMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4gYW5kIGNvbnRyaWJ1dG9ycwogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgbGljZW5zZSAodGhlIG9uZSB3aXRoCmRpZmYgLS1naXQgYS9ob3N0YXBkL1JFQURNRS1XUFMgYi9ob3N0YXBkL1JFQURNRS1XUFMKaW5kZXggODdhNmY5MS4uNjU0YjViYyAxMDA2NDQKLS0tIGEvaG9zdGFwZC9SRUFETUUtV1BTCisrKyBiL2hvc3RhcGQvUkVBRE1FLVdQUwpAQCAtMzM4LDMgKzMzOCwxNyBAQAogaW50ZXJuYWwgUmVnaXN0cmFyLiBUaGlzIGFsbG93cyBzdGF0aW9uIEVucm9sbGVlIGZyb20gd2hpY2ggdGhlIHBhc3N3b3JkCiB0b2tlbiB3YXMgcmVjZWl2ZWQgdG8gcnVuIHRocm91Z2ggV1BTIHByb3RvY29sIHRvIHByb3Zpc2lvbiB0aGUKIGNyZWRlbnRpYWwuCisKKyJuZmNfZ2V0X2hhbmRvdmVyX3NlbCA8TkRFRj4gPFdQUz4iIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgdGhlCitjb250ZW50cyBvZiBhIEhhbmRvdmVyIFNlbGVjdCBNZXNzYWdlIGZvciBjb25uZWN0aW9uIGhhbmRvdmVyIHdoZW4gdGhpcworZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgSGFuZG92ZXIgUmVxdWVzdCBNZXNzYWdlLiBUaGUKK2ZpcnN0IGFyZ3VtZW50IHNlbGVjdHMgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGRhdGEgYW5kIHRoZSBzZWNvbmQKK2FyZ3VtZW50IHNlbGVjdHMgd2hpY2ggdHlwZSBvZiBjb25uZWN0aW9uIGhhbmRvdmVyIGlzIHJlcXVlc3RlZCAoV1BTID0KK1dpLUZpIGhhbmRvdmVyIGFzIHNwZWNpZmllZCBpbiBXU0MgMi4wKS4KKworIm5mY19yZXBvcnRfaGFuZG92ZXIgPElOSVQvUkVTUD4gV1BTIDxjYXJyaWVyIGZyb20gaGFuZG92ZXIgcmVxdWVzdD4KKzxjYXJyaWVyIGZyb20gaGFuZG92ZXIgc2VsZWN0PiIgaXMgdXNlZCB0byByZXBvcnQgY29tcGxldGVkIE5GQworY29ubmVjdGlvbiBoYW5kb3Zlci4gVGhlIGZpcnN0IHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbG9jYWwKK2RldmljZSBpbml0aWF0ZWQgb3IgcmVzcG9uZGVkIHRvIHRoZSBjb25uZWN0aW9uIGhhbmRvdmVyIGFuZCB0aGUgY2FycmllcgorcmVjb3JkcyBhcmUgdGhlIHNlbGVjdGVkIGNhcnJpZXIgZnJvbSB0aGUgaGFuZG92ZXIgcmVxdWVzdCBhbmQgc2VsZWN0CittZXNzYWdlcyBhcyBhIGhleGR1bXAuCmRpZmYgLS1naXQgYS9ob3N0YXBkL2NvbmZpZ19maWxlLmMgYi9ob3N0YXBkL2NvbmZpZ19maWxlLmMKaW5kZXggMGEyNGVjMy4uZTI5YWUyZiAxMDA2NDQKLS0tIGEvaG9zdGFwZC9jb25maWdfZmlsZS5jCisrKyBiL2hvc3RhcGQvY29uZmlnX2ZpbGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBob3N0YXBkIC8gQ29uZmlndXJhdGlvbiBmaWxlIHBhcnNlcgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMjAwLDYgKzIwMCwxMiBAQAogCWlmICghZm5hbWUpCiAJCXJldHVybiAwOwogCisJaWYgKG9zX3N0cm5jbXAoZm5hbWUsICJzcWxpdGU6IiwgNykgPT0gMCkgeworCQlvc19mcmVlKGNvbmYtPmVhcF91c2VyX3NxbGl0ZSk7CisJCWNvbmYtPmVhcF91c2VyX3NxbGl0ZSA9IG9zX3N0cmR1cChmbmFtZSArIDcpOworCQlyZXR1cm4gMDsKKwl9CisKIAlmID0gZm9wZW4oZm5hbWUsICJyIik7CiAJaWYgKCFmKSB7CiAJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiRUFQIHVzZXIgZmlsZSAnJXMnIG5vdCBmb3VuZC4iLCBmbmFtZSk7CkBAIC02MjQsNiArNjMwLDEyIEBACiAJCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIldQQS1FQVAtU0hBMjU2IikgPT0gMCkKIAkJCXZhbCB8PSBXUEFfS0VZX01HTVRfSUVFRTgwMjFYX1NIQTI1NjsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLworI2lmZGVmIENPTkZJR19TQUUKKwkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiU0FFIikgPT0gMCkKKwkJCXZhbCB8PSBXUEFfS0VZX01HTVRfU0FFOworCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJGVC1TQUUiKSA9PSAwKQorCQkJdmFsIHw9IFdQQV9LRVlfTUdNVF9GVF9TQUU7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCQllbHNlIHsKIAkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogaW52YWxpZCBrZXlfbWdtdCAnJXMnIiwKIAkJCQkgICBsaW5lLCBzdGFydCk7CkBAIC02NDksNDkgKzY2MSwxMiBAQAogCiBzdGF0aWMgaW50IGhvc3RhcGRfY29uZmlnX3BhcnNlX2NpcGhlcihpbnQgbGluZSwgY29uc3QgY2hhciAqdmFsdWUpCiB7Ci0JaW50IHZhbCA9IDAsIGxhc3Q7Ci0JY2hhciAqc3RhcnQsICplbmQsICpidWY7Ci0KLQlidWYgPSBvc19zdHJkdXAodmFsdWUpOwotCWlmIChidWYgPT0gTlVMTCkKKwlpbnQgdmFsID0gd3BhX3BhcnNlX2NpcGhlcih2YWx1ZSk7CisJaWYgKHZhbCA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBpbnZhbGlkIGNpcGhlciAnJXMnLiIsCisJCQkgICBsaW5lLCB2YWx1ZSk7CiAJCXJldHVybiAtMTsKLQlzdGFydCA9IGJ1ZjsKLQotCXdoaWxlICgqc3RhcnQgIT0gJ1wwJykgewotCQl3aGlsZSAoKnN0YXJ0ID09ICcgJyB8fCAqc3RhcnQgPT0gJ1x0JykKLQkJCXN0YXJ0Kys7Ci0JCWlmICgqc3RhcnQgPT0gJ1wwJykKLQkJCWJyZWFrOwotCQllbmQgPSBzdGFydDsKLQkJd2hpbGUgKCplbmQgIT0gJyAnICYmICplbmQgIT0gJ1x0JyAmJiAqZW5kICE9ICdcMCcpCi0JCQllbmQrKzsKLQkJbGFzdCA9ICplbmQgPT0gJ1wwJzsKLQkJKmVuZCA9ICdcMCc7Ci0JCWlmIChvc19zdHJjbXAoc3RhcnQsICJDQ01QIikgPT0gMCkKLQkJCXZhbCB8PSBXUEFfQ0lQSEVSX0NDTVA7Ci0JCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIkdDTVAiKSA9PSAwKQotCQkJdmFsIHw9IFdQQV9DSVBIRVJfR0NNUDsKLQkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiVEtJUCIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9US0lQOwotCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJXRVAxMDQiKSA9PSAwKQotCQkJdmFsIHw9IFdQQV9DSVBIRVJfV0VQMTA0OwotCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJXRVA0MCIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9XRVA0MDsKLQkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiTk9ORSIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9OT05FOwotCQllbHNlIHsKLQkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogaW52YWxpZCBjaXBoZXIgJyVzJy4iLAotCQkJCSAgIGxpbmUsIHN0YXJ0KTsKLQkJCW9zX2ZyZWUoYnVmKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWlmIChsYXN0KQotCQkJYnJlYWs7Ci0JCXN0YXJ0ID0gZW5kICsgMTsKIAl9Ci0Jb3NfZnJlZShidWYpOwotCiAJaWYgKHZhbCA9PSAwKSB7CiAJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogbm8gY2lwaGVyIHZhbHVlcyBjb25maWd1cmVkLiIsCiAJCQkgICBsaW5lKTsKQEAgLTE3NjgsNiArMTc0Myw4IEBACiAJCQkJYnNzLT5zc2lkLnNzaWRfc2V0ID0gMTsKIAkJCX0KIAkJCW9zX2ZyZWUoc3RyKTsKKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAidXRmOF9zc2lkIikgPT0gMCkgeworCQkJYnNzLT5zc2lkLnV0Zjhfc3NpZCA9IGF0b2kocG9zKSA+IDA7CiAJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIm1hY2FkZHJfYWNsIikgPT0gMCkgewogCQkJYnNzLT5tYWNhZGRyX2FjbCA9IGF0b2kocG9zKTsKIAkJCWlmIChic3MtPm1hY2FkZHJfYWNsICE9IEFDQ0VQVF9VTkxFU1NfREVOSUVEICYmCkBAIC0yMjk5LDYgKzIyNzYsOCBAQAogCQkJCWNvbmYtPmh3X21vZGUgPSBIT1NUQVBEX01PREVfSUVFRTgwMjExQjsKIAkJCWVsc2UgaWYgKG9zX3N0cmNtcChwb3MsICJnIikgPT0gMCkKIAkJCQljb25mLT5od19tb2RlID0gSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUc7CisJCQllbHNlIGlmIChvc19zdHJjbXAocG9zLCAiYWQiKSA9PSAwKQorCQkJCWNvbmYtPmh3X21vZGUgPSBIT1NUQVBEX01PREVfSUVFRTgwMjExQUQ7CiAJCQllbHNlIHsKIAkJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IHVua25vd24gIgogCQkJCQkgICAiaHdfbW9kZSAnJXMnIiwgbGluZSwgcG9zKTsKQEAgLTI1MTIsNiArMjQ5MSw5IEBACiAJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgInZodF9vcGVyX2NlbnRyX2ZyZXFfc2VnMF9pZHgiKSA9PSAwKQogCQl7CiAJCQljb25mLT52aHRfb3Blcl9jZW50cl9mcmVxX3NlZzBfaWR4ID0gYXRvaShwb3MpOworCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJ2aHRfb3Blcl9jZW50cl9mcmVxX3NlZzFfaWR4IikgPT0gMCkKKwkJeworCQkJY29uZi0+dmh0X29wZXJfY2VudHJfZnJlcV9zZWcxX2lkeCA9IGF0b2kocG9zKTsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExQUMgKi8KIAkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAibWF4X2xpc3Rlbl9pbnRlcnZhbCIpID09IDApIHsKIAkJCWJzcy0+bWF4X2xpc3Rlbl9pbnRlcnZhbCA9IGF0b2kocG9zKTsKQEAgLTI2NDUsMTUgKzI2MjcsMTkgQEAKIAkJCQkJICAgIndwc19uZmNfZGV2X3B3X2lkIHZhbHVlIiwgbGluZSk7CiAJCQkJZXJyb3JzKys7CiAJCQl9CisJCQlic3MtPndwc19uZmNfcHdfZnJvbV9jb25maWcgPSAxOwogCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJ3cHNfbmZjX2RoX3B1YmtleSIpID09IDApIHsKIAkJCXdwYWJ1Zl9mcmVlKGJzcy0+d3BzX25mY19kaF9wdWJrZXkpOwogCQkJYnNzLT53cHNfbmZjX2RoX3B1YmtleSA9IGhvc3RhcGRfcGFyc2VfYmluKHBvcyk7CisJCQlic3MtPndwc19uZmNfcHdfZnJvbV9jb25maWcgPSAxOwogCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJ3cHNfbmZjX2RoX3ByaXZrZXkiKSA9PSAwKSB7CiAJCQl3cGFidWZfZnJlZShic3MtPndwc19uZmNfZGhfcHJpdmtleSk7CiAJCQlic3MtPndwc19uZmNfZGhfcHJpdmtleSA9IGhvc3RhcGRfcGFyc2VfYmluKHBvcyk7CisJCQlic3MtPndwc19uZmNfcHdfZnJvbV9jb25maWcgPSAxOwogCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJ3cHNfbmZjX2Rldl9wdyIpID09IDApIHsKIAkJCXdwYWJ1Zl9mcmVlKGJzcy0+d3BzX25mY19kZXZfcHcpOwogCQkJYnNzLT53cHNfbmZjX2Rldl9wdyA9IGhvc3RhcGRfcGFyc2VfYmluKHBvcyk7CisJCQlic3MtPndwc19uZmNfcHdfZnJvbV9jb25maWcgPSAxOwogI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCiAjZW5kaWYgLyogQ09ORklHX1dQUyAqLwogI2lmZGVmIENPTkZJR19QMlBfTUFOQUdFUgpAQCAtMjcwMiw2ICsyNjg4LDEyIEBACiAJCQlic3MtPnRpbWVfem9uZSA9IG9zX3N0cmR1cChwb3MpOwogCQkJaWYgKGJzcy0+dGltZV96b25lID09IE5VTEwpCiAJCQkJZXJyb3JzKys7CisjaWZkZWYgQ09ORklHX1dOTQorCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJ3bm1fc2xlZXBfbW9kZSIpID09IDApIHsKKwkJCWJzcy0+d25tX3NsZWVwX21vZGUgPSBhdG9pKHBvcyk7CisJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgImJzc190cmFuc2l0aW9uIikgPT0gMCkgeworCQkJYnNzLT5ic3NfdHJhbnNpdGlvbiA9IGF0b2kocG9zKTsKKyNlbmRpZiAvKiBDT05GSUdfV05NICovCiAjaWZkZWYgQ09ORklHX0lOVEVSV09SS0lORwogCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJpbnRlcndvcmtpbmciKSA9PSAwKSB7CiAJCQlic3MtPmludGVyd29ya2luZyA9IGF0b2kocG9zKTsKQEAgLTI5MTAsNiArMjkwMiwxNCBAQAogCiAJCQl3cGFidWZfZnJlZShic3MtPnZlbmRvcl9lbGVtZW50cyk7CiAJCQlic3MtPnZlbmRvcl9lbGVtZW50cyA9IGVsZW1zOworCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJzYWVfYW50aV9jbG9nZ2luZ190aHJlc2hvbGQiKSA9PSAwKSB7CisJCQlic3MtPnNhZV9hbnRpX2Nsb2dnaW5nX3RocmVzaG9sZCA9IGF0b2kocG9zKTsKKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAic2FlX2dyb3VwcyIpID09IDApIHsKKwkJCWlmIChob3N0YXBkX3BhcnNlX3JhdGVzKCZic3MtPnNhZV9ncm91cHMsIHBvcykpIHsKKwkJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IEludmFsaWQgIgorCQkJCQkgICAic2FlX2dyb3VwcyB2YWx1ZSAnJXMnIiwgbGluZSwgcG9zKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogdW5rbm93biBjb25maWd1cmF0aW9uICIKIAkJCQkgICAiaXRlbSAnJXMnIiwgbGluZSwgYnVmKTsKQEAgLTI5MjMsMzEgKzI5MjMsMTYgQEAKIAogc3RhdGljIHZvaWQgaG9zdGFwZF9zZXRfc2VjdXJpdHlfcGFyYW1zKHN0cnVjdCBob3N0YXBkX2Jzc19jb25maWcgKmJzcykKIHsKLQlpbnQgcGFpcndpc2U7Ci0KIAlpZiAoYnNzLT5pbmRpdmlkdWFsX3dlcF9rZXlfbGVuID09IDApIHsKIAkJLyogaW5kaXZpZHVhbCBrZXlzIGFyZSBub3QgdXNlOyBjYW4gdXNlIGtleSBpZHgwIGZvcgogCQkgKiBicm9hZGNhc3Qga2V5cyAqLwogCQlic3MtPmJyb2FkY2FzdF9rZXlfaWR4X21pbiA9IDA7CiAJfQogCi0JLyogU2VsZWN0IGdyb3VwIGNpcGhlciBiYXNlZCBvbiB0aGUgZW5hYmxlZCBwYWlyd2lzZSBjaXBoZXIKLQkgKiBzdWl0ZXMgKi8KLQlwYWlyd2lzZSA9IDA7Ci0JaWYgKGJzcy0+d3BhICYgMSkKLQkJcGFpcndpc2UgfD0gYnNzLT53cGFfcGFpcndpc2U7Ci0JaWYgKGJzcy0+d3BhICYgMikgewotCQlpZiAoYnNzLT5yc25fcGFpcndpc2UgPT0gMCkKLQkJCWJzcy0+cnNuX3BhaXJ3aXNlID0gYnNzLT53cGFfcGFpcndpc2U7Ci0JCXBhaXJ3aXNlIHw9IGJzcy0+cnNuX3BhaXJ3aXNlOwotCX0KLQlpZiAocGFpcndpc2UgJiBXUEFfQ0lQSEVSX1RLSVApCi0JCWJzcy0+d3BhX2dyb3VwID0gV1BBX0NJUEhFUl9US0lQOwotCWVsc2UgaWYgKChwYWlyd2lzZSAmIChXUEFfQ0lQSEVSX0NDTVAgfCBXUEFfQ0lQSEVSX0dDTVApKSA9PQotCQkgV1BBX0NJUEhFUl9HQ01QKQotCQlic3MtPndwYV9ncm91cCA9IFdQQV9DSVBIRVJfR0NNUDsKLQllbHNlCi0JCWJzcy0+d3BhX2dyb3VwID0gV1BBX0NJUEhFUl9DQ01QOworCWlmICgoYnNzLT53cGEgJiAyKSAmJiBic3MtPnJzbl9wYWlyd2lzZSA9PSAwKQorCQlic3MtPnJzbl9wYWlyd2lzZSA9IGJzcy0+d3BhX3BhaXJ3aXNlOworCWJzcy0+d3BhX2dyb3VwID0gd3BhX3NlbGVjdF9hcF9ncm91cF9jaXBoZXIoYnNzLT53cGEsIGJzcy0+d3BhX3BhaXJ3aXNlLAorCQkJCQkJICAgIGJzcy0+cnNuX3BhaXJ3aXNlKTsKIAogCWJzcy0+cmFkaXVzLT5hdXRoX3NlcnZlciA9IGJzcy0+cmFkaXVzLT5hdXRoX3NlcnZlcnM7CiAJYnNzLT5yYWRpdXMtPmFjY3Rfc2VydmVyID0gYnNzLT5yYWRpdXMtPmFjY3Rfc2VydmVyczsKZGlmZiAtLWdpdCBhL2hvc3RhcGQvY3RybF9pZmFjZS5jIGIvaG9zdGFwZC9jdHJsX2lmYWNlLmMKaW5kZXggMWI4YmVkZS4uZjIwNzIxYiAxMDA2NDQKLS0tIGEvaG9zdGFwZC9jdHJsX2lmYWNlLmMKKysrIGIvaG9zdGFwZC9jdHJsX2lmYWNlLmMKQEAgLTI1MCwzMCArMjUwLDYgQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX1dQU19PT0IKLXN0YXRpYyBpbnQgaG9zdGFwZF9jdHJsX2lmYWNlX3dwc19vb2Ioc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgY2hhciAqdHh0KQotewotCWNoYXIgKnBhdGgsICptZXRob2QsICpuYW1lOwotCi0JcGF0aCA9IG9zX3N0cmNocih0eHQsICcgJyk7Ci0JaWYgKHBhdGggPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCSpwYXRoKysgPSAnXDAnOwotCi0JbWV0aG9kID0gb3Nfc3RyY2hyKHBhdGgsICcgJyk7Ci0JaWYgKG1ldGhvZCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JKm1ldGhvZCsrID0gJ1wwJzsKLQotCW5hbWUgPSBvc19zdHJjaHIobWV0aG9kLCAnICcpOwotCWlmIChuYW1lICE9IE5VTEwpCi0JCSpuYW1lKysgPSAnXDAnOwotCi0JcmV0dXJuIGhvc3RhcGRfd3BzX3N0YXJ0X29vYihoYXBkLCB0eHQsIHBhdGgsIG1ldGhvZCwgbmFtZSk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KLQotCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKIHN0YXRpYyBpbnQgaG9zdGFwZF9jdHJsX2lmYWNlX3dwc19uZmNfdGFnX3JlYWQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKIAkJCQkJICAgICAgIGNoYXIgKnBvcykKQEAgLTM3Niw2ICszNTIsNTkgQEAKIAogCXJldHVybiAtMTsKIH0KKworCitzdGF0aWMgaW50IGhvc3RhcGRfY3RybF9pZmFjZV9uZmNfZ2V0X2hhbmRvdmVyX3NlbChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJCQkJICAgY2hhciAqY21kLCBjaGFyICpyZXBseSwKKwkJCQkJCSAgIHNpemVfdCBtYXhfbGVuKQoreworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKwlpbnQgcmVzOworCWNoYXIgKnBvczsKKwlpbnQgbmRlZjsKKworCXBvcyA9IG9zX3N0cmNocihjbWQsICcgJyk7CisJaWYgKHBvcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJKnBvcysrID0gJ1wwJzsKKworCWlmIChvc19zdHJjbXAoY21kLCAiV1BTIikgPT0gMCkKKwkJbmRlZiA9IDA7CisJZWxzZSBpZiAob3Nfc3RyY21wKGNtZCwgIk5ERUYiKSA9PSAwKQorCQluZGVmID0gMTsKKwllbHNlCisJCXJldHVybiAtMTsKKworCWlmIChvc19zdHJjbXAocG9zLCAiV1BTLUNSIikgPT0gMCkKKwkJYnVmID0gaG9zdGFwZF93cHNfbmZjX2hzX2NyKGhhcGQsIG5kZWYpOworCWVsc2UKKwkJYnVmID0gTlVMTDsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXJlcyA9IHdwYV9zbnByaW50Zl9oZXhfdXBwZXJjYXNlKHJlcGx5LCBtYXhfbGVuLCB3cGFidWZfaGVhZChidWYpLAorCQkJCQkgd3BhYnVmX2xlbihidWYpKTsKKwlyZXBseVtyZXMrK10gPSAnXG4nOworCXJlcGx5W3Jlc10gPSAnXDAnOworCisJd3BhYnVmX2ZyZWUoYnVmKTsKKworCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIGludCBob3N0YXBkX2N0cmxfaWZhY2VfbmZjX3JlcG9ydF9oYW5kb3ZlcihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJCQkJICBjaGFyICpjbWQpCit7CisJLyoKKwkgKiBTaW5jZSBORkMgY29ubmVjdGlvbiBoYW5kb3ZlciBwcm92aWRlZCBmdWxsIFdQUyBDcmVkZW50aWFsLCB0aGVyZSBpcworCSAqIG5vIG5lZWQgZm9yIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB3aXRoaW4gaG9zdGFwZC4gSnVzdCByZXBvcnQgdGhpcyBpbgorCSAqIGRlYnVnIGxvZy4KKwkgKi8KKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIk5GQzogQ29ubmVjdGlvbiBoYW5kb3ZlciByZXBvcnRlZDogJXMiLCBjbWQpOworCXJldHVybiAwOworfQorCiAjZW5kaWYgLyogQ09ORklHX1dQU19ORkMgKi8KIAogCkBAIC00NjAsNiArNDg5LDUwIEBACiAjZW5kaWYgLyogQ09ORklHX1dQUyAqLwogCiAKKyNpZmRlZiBDT05GSUdfV05NCisKK3N0YXRpYyBpbnQgaG9zdGFwZF9jdHJsX2lmYWNlX2Rpc2Fzc29jX2ltbWluZW50KHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCisJCQkJCQljb25zdCBjaGFyICpjbWQpCit7CisJdTggYWRkcltFVEhfQUxFTl07CisJdTggYnVmWzEwMDBdLCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKKwlpbnQgZGlzYXNzb2NfdGltZXI7CisKKwlpZiAoaHdhZGRyX2F0b24oY21kLCBhZGRyKSkKKwkJcmV0dXJuIC0xOworCWlmIChjbWRbMTddICE9ICcgJykKKwkJcmV0dXJuIC0xOworCWRpc2Fzc29jX3RpbWVyID0gYXRvaShjbWQgKyAxNyk7CisKKwlvc19tZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgYnVmOworCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfRkMoV0xBTl9GQ19UWVBFX01HTVQsCisJCQkJCSAgIFdMQU5fRkNfU1RZUEVfQUNUSU9OKTsKKwlvc19tZW1jcHkobWdtdC0+ZGEsIGFkZHIsIEVUSF9BTEVOKTsKKwlvc19tZW1jcHkobWdtdC0+c2EsIGhhcGQtPm93bl9hZGRyLCBFVEhfQUxFTik7CisJb3NfbWVtY3B5KG1nbXQtPmJzc2lkLCBoYXBkLT5vd25fYWRkciwgRVRIX0FMRU4pOworCW1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID0gV0xBTl9BQ1RJT05fV05NOworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3JlcS5hY3Rpb24gPSBXTk1fQlNTX1RSQU5TX01HTVRfUkVROworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3JlcS5kaWFsb2dfdG9rZW4gPSAxOworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3JlcS5yZXFfbW9kZSA9CisJCVdOTV9CU1NfVE1fUkVRX0RJU0FTU09DX0lNTUlORU5UOworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3JlcS5kaXNhc3NvY190aW1lciA9CisJCWhvc3RfdG9fbGUxNihkaXNhc3NvY190aW1lcik7CisJbWdtdC0+dS5hY3Rpb24udS5ic3NfdG1fcmVxLnZhbGlkaXR5X2ludGVydmFsID0gMDsKKworCXBvcyA9IG1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3JlcS52YXJpYWJsZTsKKworCWlmIChob3N0YXBkX2Rydl9zZW5kX21sbWUoaGFwZCwgYnVmLCBwb3MgLSBidWYsIDApIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkZhaWxlZCB0byBzZW5kIEJTUyBUcmFuc2l0aW9uICIKKwkJCSAgICJNYW5hZ2VtZW50IFJlcXVlc3QgZnJhbWUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgaG9zdGFwZF9jdHJsX2lmYWNlX2Vzc19kaXNhc3NvYyhzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAogCQkJCQkgICBjb25zdCBjaGFyICpjbWQpCiB7CkBAIC01MTAsNiArNTgzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KKwogCiBzdGF0aWMgaW50IGhvc3RhcGRfY3RybF9pZmFjZV9nZXRfY29uZmlnKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkJCSBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCkBAIC02MTMsMjAgKzY4OCw5IEBACiAJCXBvcyArPSByZXQ7CiAJfQogCi0JaWYgKGhhcGQtPmNvbmYtPndwYSAmJiBoYXBkLT5jb25mLT53cGFfZ3JvdXAgPT0gV1BBX0NJUEhFUl9DQ01QKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiZ3JvdXBfY2lwaGVyPUNDTVBcbiIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKLQkJcG9zICs9IHJldDsKLQl9IGVsc2UgaWYgKGhhcGQtPmNvbmYtPndwYSAmJgotCQkgICBoYXBkLT5jb25mLT53cGFfZ3JvdXAgPT0gV1BBX0NJUEhFUl9HQ01QKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiZ3JvdXBfY2lwaGVyPUdDTVBcbiIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKLQkJcG9zICs9IHJldDsKLQl9IGVsc2UgaWYgKGhhcGQtPmNvbmYtPndwYSAmJgotCQkgICBoYXBkLT5jb25mLT53cGFfZ3JvdXAgPT0gV1BBX0NJUEhFUl9US0lQKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiZ3JvdXBfY2lwaGVyPVRLSVBcbiIpOworCWlmIChoYXBkLT5jb25mLT53cGEpIHsKKwkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJncm91cF9jaXBoZXI9JXNcbiIsCisJCQkJICB3cGFfY2lwaGVyX3R4dChoYXBkLT5jb25mLT53cGFfZ3JvdXApKTsKIAkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKIAkJCXJldHVybiBwb3MgLSBidWY7CiAJCXBvcyArPSByZXQ7CkBAIC02MzgsMjQgKzcwMiwxMSBAQAogCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKIAkJcG9zICs9IHJldDsKIAotCQlpZiAoaGFwZC0+Y29uZi0+cnNuX3BhaXJ3aXNlICYgV1BBX0NJUEhFUl9DQ01QKSB7Ci0JCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIkNDTVAgIik7Ci0JCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJCXJldHVybiBwb3MgLSBidWY7Ci0JCQlwb3MgKz0gcmV0OwotCQl9Ci0JCWlmIChoYXBkLT5jb25mLT5yc25fcGFpcndpc2UgJiBXUEFfQ0lQSEVSX0dDTVApIHsKLQkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiR0NNUCAiKTsKLQkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCi0JCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKLQkJCXBvcyArPSByZXQ7Ci0JCX0KLQkJaWYgKGhhcGQtPmNvbmYtPnJzbl9wYWlyd2lzZSAmIFdQQV9DSVBIRVJfVEtJUCkgewotCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJUS0lQICIpOwotCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKLQkJCQlyZXR1cm4gcG9zIC0gYnVmOwotCQkJcG9zICs9IHJldDsKLQkJfQorCQlyZXQgPSB3cGFfd3JpdGVfY2lwaGVycyhwb3MsIGVuZCwgaGFwZC0+Y29uZi0+cnNuX3BhaXJ3aXNlLAorCQkJCQkiICIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiBwb3MgLSBidWY7CisJCXBvcyArPSByZXQ7CiAKIAkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJcbiIpOwogCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQpAQCAtNjY5LDI0ICs3MjAsMTEgQEAKIAkJCXJldHVybiBwb3MgLSBidWY7CiAJCXBvcyArPSByZXQ7CiAKLQkJaWYgKGhhcGQtPmNvbmYtPndwYV9wYWlyd2lzZSAmIFdQQV9DSVBIRVJfQ0NNUCkgewotCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJDQ01QICIpOwotCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKLQkJCQlyZXR1cm4gcG9zIC0gYnVmOwotCQkJcG9zICs9IHJldDsKLQkJfQotCQlpZiAoaGFwZC0+Y29uZi0+d3BhX3BhaXJ3aXNlICYgV1BBX0NJUEhFUl9HQ01QKSB7Ci0JCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIkdDTVAgIik7Ci0JCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJCXJldHVybiBwb3MgLSBidWY7Ci0JCQlwb3MgKz0gcmV0OwotCQl9Ci0JCWlmIChoYXBkLT5jb25mLT53cGFfcGFpcndpc2UgJiBXUEFfQ0lQSEVSX1RLSVApIHsKLQkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiVEtJUCAiKTsKLQkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCi0JCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKLQkJCXBvcyArPSByZXQ7Ci0JCX0KKwkJcmV0ID0gd3BhX3dyaXRlX2NpcGhlcnMocG9zLCBlbmQsIGhhcGQtPmNvbmYtPnJzbl9wYWlyd2lzZSwKKwkJCQkJIiAiKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcG9zIC0gYnVmOworCQlwb3MgKz0gcmV0OwogCiAJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiXG4iKTsKIAkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKQEAgLTkxMiwxMSArOTUwLDYgQEAKIAl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJXUFNfQ0FOQ0VMIikgPT0gMCkgewogCQlpZiAoaG9zdGFwZF93cHNfY2FuY2VsKGhhcGQpKQogCQkJcmVwbHlfbGVuID0gLTE7Ci0jaWZkZWYgQ09ORklHX1dQU19PT0IKLQl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX09PQiAiLCA4KSA9PSAwKSB7Ci0JCWlmIChob3N0YXBkX2N0cmxfaWZhY2Vfd3BzX29vYihoYXBkLCBidWYgKyA4KSkKLQkJCXJlcGx5X2xlbiA9IC0xOwotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCiAJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIldQU19BUF9QSU4gIiwgMTEpID09IDApIHsKIAkJcmVwbHlfbGVuID0gaG9zdGFwZF9jdHJsX2lmYWNlX3dwc19hcF9waW4oaGFwZCwgYnVmICsgMTEsCiAJCQkJCQkJICByZXBseSwgcmVwbHlfc2l6ZSk7CkBAIC05MzMsMTEgKzk2NiwyMiBAQAogCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJXUFNfTkZDX1RPS0VOICIsIDE0KSA9PSAwKSB7CiAJCXJlcGx5X2xlbiA9IGhvc3RhcGRfY3RybF9pZmFjZV93cHNfbmZjX3Rva2VuKAogCQkJaGFwZCwgYnVmICsgMTQsIHJlcGx5LCByZXBseV9zaXplKTsKKwl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiTkZDX0dFVF9IQU5ET1ZFUl9TRUwgIiwgMjEpID09IDApIHsKKwkJcmVwbHlfbGVuID0gaG9zdGFwZF9jdHJsX2lmYWNlX25mY19nZXRfaGFuZG92ZXJfc2VsKAorCQkJaGFwZCwgYnVmICsgMjEsIHJlcGx5LCByZXBseV9zaXplKTsKKwl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiTkZDX1JFUE9SVF9IQU5ET1ZFUiAiLCAyMCkgPT0gMCkgeworCQlpZiAoaG9zdGFwZF9jdHJsX2lmYWNlX25mY19yZXBvcnRfaGFuZG92ZXIoaGFwZCwgYnVmICsgMjApKQorCQkJcmVwbHlfbGVuID0gLTE7CiAjZW5kaWYgLyogQ09ORklHX1dQU19ORkMgKi8KICNlbmRpZiAvKiBDT05GSUdfV1BTICovCisjaWZkZWYgQ09ORklHX1dOTQorCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJESVNBU1NPQ19JTU1JTkVOVCAiLCAxOCkgPT0gMCkgeworCQlpZiAoaG9zdGFwZF9jdHJsX2lmYWNlX2Rpc2Fzc29jX2ltbWluZW50KGhhcGQsIGJ1ZiArIDE4KSkKKwkJCXJlcGx5X2xlbiA9IC0xOwogCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJFU1NfRElTQVNTT0MgIiwgMTMpID09IDApIHsKIAkJaWYgKGhvc3RhcGRfY3RybF9pZmFjZV9lc3NfZGlzYXNzb2MoaGFwZCwgYnVmICsgMTMpKQogCQkJcmVwbHlfbGVuID0gLTE7CisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIkdFVF9DT05GSUciKSA9PSAwKSB7CiAJCXJlcGx5X2xlbiA9IGhvc3RhcGRfY3RybF9pZmFjZV9nZXRfY29uZmlnKGhhcGQsIHJlcGx5LAogCQkJCQkJCSAgcmVwbHlfc2l6ZSk7CkBAIC0xMDI2LDEyICsxMDcwLDI3IEBACiAJfQogCiAJaWYgKGhhcGQtPmNvbmYtPmN0cmxfaW50ZXJmYWNlX2dpZF9zZXQgJiYKLQkgICAgY2hvd24oaGFwZC0+Y29uZi0+Y3RybF9pbnRlcmZhY2UsIDAsCisJICAgIGNob3duKGhhcGQtPmNvbmYtPmN0cmxfaW50ZXJmYWNlLCAtMSwKIAkJICBoYXBkLT5jb25mLT5jdHJsX2ludGVyZmFjZV9naWQpIDwgMCkgewogCQlwZXJyb3IoImNob3duW2N0cmxfaW50ZXJmYWNlXSIpOwogCQlyZXR1cm4gLTE7CiAJfQogCisjaWZkZWYgQU5EUk9JRAorCS8qCisJICogQW5kcm9pZCBpcyB1c2luZyB1bWFzayAwMDc3IHdoaWNoIHdvdWxkIGxlYXZlIHRoZSBjb250cm9sIGludGVyZmFjZQorCSAqIGRpcmVjdG9yeSB3aXRob3V0IGdyb3VwIGFjY2Vzcy4gVGhpcyBicmVha3MgdGhpbmdzIHNpbmNlIFdpLUZpCisJICogZnJhbWV3b3JrIGFzc3VtZXMgdGhhdCB0aGlzIGRpcmVjdG9yeSBjYW4gYmUgYWNjZXNzZWQgYnkgb3RoZXIKKwkgKiBhcHBsaWNhdGlvbnMgaW4gdGhlIHdpZmkgZ3JvdXAuIEZpeCB0aGlzIGJ5IGFkZGluZyBncm91cCBhY2Nlc3MgZXZlbgorCSAqIGlmIHVtYXNrIHZhbHVlIHdvdWxkIHByZXZlbnQgdGhpcy4KKwkgKi8KKwlpZiAoY2htb2QoaGFwZC0+Y29uZi0+Y3RybF9pbnRlcmZhY2UsIFNfSVJXWFUgfCBTX0lSV1hHKSA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJDVFJMOiBDb3VsZCBub3QgY2htb2QgZGlyZWN0b3J5OiAlcyIsCisJCQkgICBzdHJlcnJvcihlcnJubykpOworCQkvKiBUcnkgdG8gY29udGludWUgYW55d2F5ICovCisJfQorI2VuZGlmIC8qIEFORFJPSUQgKi8KKwogCWlmIChvc19zdHJsZW4oaGFwZC0+Y29uZi0+Y3RybF9pbnRlcmZhY2UpICsgMSArCiAJICAgIG9zX3N0cmxlbihoYXBkLT5jb25mLT5pZmFjZSkgPj0gc2l6ZW9mKGFkZHIuc3VuX3BhdGgpKQogCQlnb3RvIGZhaWw7CkBAIC0xMDg0LDcgKzExNDMsNyBAQAogCX0KIAogCWlmIChoYXBkLT5jb25mLT5jdHJsX2ludGVyZmFjZV9naWRfc2V0ICYmCi0JICAgIGNob3duKGZuYW1lLCAwLCBoYXBkLT5jb25mLT5jdHJsX2ludGVyZmFjZV9naWQpIDwgMCkgeworCSAgICBjaG93bihmbmFtZSwgLTEsIGhhcGQtPmNvbmYtPmN0cmxfaW50ZXJmYWNlX2dpZCkgPCAwKSB7CiAJCXBlcnJvcigiY2hvd25bY3RybF9pbnRlcmZhY2UvaWZuYW1lXSIpOwogCQlnb3RvIGZhaWw7CiAJfQpkaWZmIC0tZ2l0IGEvaG9zdGFwZC9kZWZjb25maWcgYi9ob3N0YXBkL2RlZmNvbmZpZwppbmRleCAyMDRhYTc2Li5iNWRkY2EzIDEwMDY0NAotLS0gYS9ob3N0YXBkL2RlZmNvbmZpZworKysgYi9ob3N0YXBkL2RlZmNvbmZpZwpAQCAtMjY1LDUgKzI2NSw1IEBACiAjIEhvdHNwb3QgMi4wCiAjQ09ORklHX0hTMjA9eQogCi0jIEVuYWJsZSBTUUxpdGUgZGF0YWJhc2Ugc3VwcG9ydCBpbiBobHJfYXVjX2d3CisjIEVuYWJsZSBTUUxpdGUgZGF0YWJhc2Ugc3VwcG9ydCBpbiBobHJfYXVjX2d3LCBFQVAtU0lNIERCLCBhbmQgZWFwX3VzZXJfZmlsZQogI0NPTkZJR19TUUxJVEU9eQpkaWZmIC0tZ2l0IGEvaG9zdGFwZC9kdW1wX3N0YXRlLmMgYi9ob3N0YXBkL2R1bXBfc3RhdGUuYwppbmRleCBkMzNlMDVmLi5mY2Q5ODkwIDEwMDY0NAotLS0gYS9ob3N0YXBkL2R1bXBfc3RhdGUuYworKysgYi9ob3N0YXBkL2R1bXBfc3RhdGUuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgImFwL2FwX2NvbmZpZy5oIgogI2luY2x1ZGUgImFwL3N0YV9pbmZvLmgiCiAjaW5jbHVkZSAiZHVtcF9zdGF0ZS5oIgorI2luY2x1ZGUgImFwL2FwX2Rydl9vcHMuaCIKIAogCiBzdGF0aWMgdm9pZCBmcHJpbnRfY2hhcihGSUxFICpmLCBjaGFyIGMpCkBAIC03Miw2ICs3Myw3IEBACiAjaWZuZGVmIENPTkZJR19OT19SQURJVVMKIAljaGFyICpidWY7CiAjZW5kaWYgLyogQ09ORklHX05PX1JBRElVUyAqLworCXN0cnVjdCBob3N0YXBfc3RhX2RyaXZlcl9kYXRhIGRhdGE7CiAKIAlpZiAoIWhhcGQtPmNvbmYtPmR1bXBfbG9nX25hbWUpIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJEdW1wIGZpbGUgbm90IGRlZmluZWQgLSBpZ25vcmluZyBkdW1wICIKQEAgLTEzOSw2ICsxNDEsMTMgQEAKIAkJCSAgIkRFQVVUSCIpKSk7CiAKIAkJaWVlZTgwMl8xeF9kdW1wX3N0YXRlKGYsICIgICIsIHN0YSk7CisKKwkJaWYgKGhvc3RhcGRfZHJ2X3JlYWRfc3RhX2RhdGEoaGFwZCwgJmRhdGEsIHN0YS0+YWRkcikgPT0gMCkgeworCQkJZnByaW50ZihmLCAiICByeF9wa3Q9JWx1IHR4X3BrdD0lbHVcbiIKKwkJCQkiICByeF9ieXRlPSVsdSB0eF9ieXRlPSVsdVxuIiwKKwkJCQlkYXRhLnJ4X3BhY2tldHMsIGRhdGEudHhfcGFja2V0cywKKwkJCQlkYXRhLnJ4X2J5dGVzLCBkYXRhLnR4X2J5dGVzKTsKKwkJfQogCX0KIAogI2lmbmRlZiBDT05GSUdfTk9fUkFESVVTCmRpZmYgLS1naXQgYS9ob3N0YXBkL2hvc3RhcGQuY29uZiBiL2hvc3RhcGQvaG9zdGFwZC5jb25mCmluZGV4IGVkYmQ3NzIuLmVjYTM5OTYgMTAwNjQ0Ci0tLSBhL2hvc3RhcGQvaG9zdGFwZC5jb25mCisrKyBiL2hvc3RhcGQvaG9zdGFwZC5jb25mCkBAIC05MCw2ICs5MCw5IEBACiAjc3NpZDI9NzQ2NTczNzQKICNzc2lkMj1QImhlbGxvXG50aGVyZSIKIAorIyBVVEYtOCBTU0lEOiBXaGV0aGVyIHRoZSBTU0lEIGlzIHRvIGJlIGludGVycHJldGVkIHVzaW5nIFVURi04IGVuY29kaW5nCisjdXRmOF9zc2lkPTEKKwogIyBDb3VudHJ5IGNvZGUgKElTTy9JRUMgMzE2Ni0xKS4gVXNlZCB0byBzZXQgcmVndWxhdG9yeSBkb21haW4uCiAjIFNldCBhcyBuZWVkZWQgdG8gaW5kaWNhdGUgY291bnRyeSBpbiB3aGljaCBkZXZpY2UgaXMgb3BlcmF0aW5nLgogIyBUaGlzIGNhbiBsaW1pdCBhdmFpbGFibGUgY2hhbm5lbHMgYW5kIHRyYW5zbWl0IHBvd2VyLgpAQCAtMTAzLDYgKzEwNiw4IEBACiAjaWVlZTgwMjExZD0xCiAKICMgT3BlcmF0aW9uIG1vZGUgKGEgPSBJRUVFIDgwMi4xMWEsIGIgPSBJRUVFIDgwMi4xMWIsIGcgPSBJRUVFIDgwMi4xMWcsCisjIGFkID0gSUVFRSA4MDIuMTFhZCAoNjAgR0h6KTsgYS9nIG9wdGlvbnMgYXJlIHVzZWQgd2l0aCBJRUVFIDgwMi4xMW4sIHRvbywgdG8KKyMgc3BlY2lmeSBiYW5kKQogIyBEZWZhdWx0OiBJRUVFIDgwMi4xMWIKIGh3X21vZGU9ZwogCkBAIC01NzIsNiArNTc3LDEyIEBACiAjIHdoaWNoIGlzIGNoYW5uZWwgNDIgaW4gNUcgYmFuZAogIwogI3ZodF9vcGVyX2NlbnRyX2ZyZXFfc2VnMF9pZHg9NDIKKyMKKyMgY2VudGVyIGZyZXEgPSA1IEdIeiArICg1ICogaW5kZXgpCisjIFNvIGluZGV4IDE1OSBnaXZlcyBjZW50ZXIgZnJlcSA1Ljc5NSBHSHoKKyMgd2hpY2ggaXMgY2hhbm5lbCAxNTkgaW4gNUcgYmFuZAorIworI3ZodF9vcGVyX2NlbnRyX2ZyZXFfc2VnMV9pZHg9MTU5CiAKICMjIyMjIElFRUUgODAyLjFYLTIwMDQgcmVsYXRlZCBjb25maWd1cmF0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtNjI5LDYgKzY0MCw4IEBACiBlYXBfc2VydmVyPTAKIAogIyBQYXRoIGZvciBFQVAgc2VydmVyIHVzZXIgZGF0YWJhc2UKKyMgSWYgU1FMaXRlIHN1cHBvcnQgaXMgaW5jbHVkZWQsIHRoaXMgY2FuIGJlIHNldCB0byAic3FsaXRlOi9wYXRoL3RvL3NxbGl0ZS5kYiIKKyMgdG8gdXNlIFNRTGl0ZSBkYXRhYmFzZSBpbnN0ZWFkIG9mIGEgdGV4dCBmaWxlLgogI2VhcF91c2VyX2ZpbGU9L2V0Yy9ob3N0YXBkLmVhcF91c2VyCiAKICMgQ0EgY2VydGlmaWNhdGUgKFBFTSBvciBERVIgZmlsZSkgZm9yIEVBUC1UTFMvUEVBUC9UVExTCkBAIC0xMDI0LDYgKzEwMzcsMTkgQEAKICMgMSA9IGVuYWJsZWQKICNva2M9MQogCisjIFNBRSB0aHJlc2hvbGQgZm9yIGFudGktY2xvZ2dpbmcgbWVjaGFuaXNtIChkb3QxMVJTTkFTQUVBbnRpQ2xvZ2dpbmdUaHJlc2hvbGQpCisjIFRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaG93IG1hbnkgb3BlbiBTQUUgaW5zdGFuY2VzIGNhbiBiZSBpbiBwcm9ncmVzcyBhdCB0aGUKKyMgc2FtZSB0aW1lIGJlZm9yZSB0aGUgYW50aS1jbG9nZ2luZyBtZWNoYW5pc20gaXMgdGFrZW4gaW50byB1c2UuCisjc2FlX2FudGlfY2xvZ2dpbmdfdGhyZXNob2xkPTUKKworIyBFbmFibGVkIFNBRSBmaW5pdGUgY3ljbGljIGdyb3VwcworIyBTQUUgaW1wbGVtZW50YXRpb24gYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQgZ3JvdXAgMTkgKEVDQyBncm91cCBkZWZpbmVkIG92ZXIgYQorIyAyNTYtYml0IHByaW1lIG9yZGVyIGZpZWxkKS4gQWxsIGdyb3VwcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlCisjIGltcGxlbWVudGF0aW9uIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuIFRoaXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgY2FuIGJlCisjIHVzZWQgdG8gc3BlY2lmeSBhIGxpbWl0ZWQgc2V0IG9mIGFsbG93ZWQgZ3JvdXBzLiBUaGUgZ3JvdXAgdmFsdWVzIGFyZSBsaXN0ZWQKKyMgaW4gdGhlIElBTkEgcmVnaXN0cnk6CisjIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvaXBzZWMtcmVnaXN0cnkvaXBzZWMtcmVnaXN0cnkueG1sI2lwc2VjLXJlZ2lzdHJ5LTkKKyNzYWVfZ3JvdXBzPTE5IDIwIDIxIDI1IDI2CiAKICMjIyMjIElFRUUgODAyLjExciBjb25maWd1cmF0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtMTI5Miw2ICsxMzE4LDE2IEBACiAjIHN0ZG9mZnNldFtkc3Rbb2Zmc2V0XVssc3RhcnRbL3RpbWVdLGVuZFsvdGltZV1dXQogI3RpbWVfem9uZT1FU1Q1CiAKKyMgV05NLVNsZWVwIE1vZGUgKGV4dGVuZGVkIHNsZWVwIG1vZGUgZm9yIHN0YXRpb25zKQorIyAwID0gZGlzYWJsZWQgKGRlZmF1bHQpCisjIDEgPSBlbmFibGVkIChhbGxvdyBzdGF0aW9ucyB0byB1c2UgV05NLVNsZWVwIE1vZGUpCisjd25tX3NsZWVwX21vZGU9MQorCisjIEJTUyBUcmFuc2l0aW9uIE1hbmFnZW1lbnQKKyMgMCA9IGRpc2FibGVkIChkZWZhdWx0KQorIyAxID0gZW5hYmxlZAorI2Jzc190cmFuc2l0aW9uPTEKKwogIyMjIyMgSUVFRSA4MDIuMTF1LTIwMTEgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAjIEVuYWJsZSBJbnRlcndvcmtpbmcgc2VydmljZQpkaWZmIC0tZ2l0IGEvaG9zdGFwZC9ob3N0YXBkLmVhcF91c2VyX3NxbGl0ZSBiL2hvc3RhcGQvaG9zdGFwZC5lYXBfdXNlcl9zcWxpdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4ODMyNwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RhcGQvaG9zdGFwZC5lYXBfdXNlcl9zcWxpdGUKQEAgLTAsMCArMSwxNyBAQAorQ1JFQVRFIFRBQkxFIHVzZXJzKAorCWlkZW50aXR5IFRFWFQgUFJJTUFSWSBLRVksCisJbWV0aG9kcyBURVhULAorCXBhc3N3b3JkIFRFWFQsCisJcGhhc2UyIElOVEVHRVIKKyk7CisKK0NSRUFURSBUQUJMRSB3aWxkY2FyZHMoCisJaWRlbnRpdHkgVEVYVCBQUklNQVJZIEtFWSwKKwltZXRob2RzIFRFWFQKKyk7CisKK0lOU0VSVCBJTlRPIHVzZXJzKGlkZW50aXR5LG1ldGhvZHMscGFzc3dvcmQscGhhc2UyKSBWQUxVRVMgKCd1c2VyJywnVFRMUy1NU0NIQVBWMicsJ3Bhc3N3b3JkJywxKTsKK0lOU0VSVCBJTlRPIHVzZXJzKGlkZW50aXR5LG1ldGhvZHMscGFzc3dvcmQscGhhc2UyKSBWQUxVRVMgKCdET01BSU5cbXNjaGFwdjIgdXNlcicsJ1RUTFMtTVNDSEFQVjInLCdwYXNzd29yZCcsMSk7CisKK0lOU0VSVCBJTlRPIHdpbGRjYXJkcyhpZGVudGl0eSxtZXRob2RzKSBWQUxVRVMgKCcnLCdUVExTLFRMUycpOworSU5TRVJUIElOVE8gd2lsZGNhcmRzKGlkZW50aXR5LG1ldGhvZHMpIFZBTFVFUyAoJzAnLCdBS0EnKTsKZGlmZiAtLWdpdCBhL2hvc3RhcGQvaG9zdGFwZF9jbGkuYyBiL2hvc3RhcGQvaG9zdGFwZF9jbGkuYwppbmRleCAyN2JlYTJhLi4xNTM3Mjc1IDEwMDY0NAotLS0gYS9ob3N0YXBkL2hvc3RhcGRfY2xpLmMKKysrIGIvaG9zdGFwZC9ob3N0YXBkX2NsaS5jCkBAIC0xOCw3ICsxOCw3IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpob3N0YXBkX2NsaV92ZXJzaW9uID0KICJob3N0YXBkX2NsaSB2IiBWRVJTSU9OX1NUUiAiXG4iCi0iQ29weXJpZ2h0IChjKSAyMDA0LTIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+IGFuZCBjb250cmlidXRvcnMiOworIkNvcHlyaWdodCAoYykgMjAwNC0yMDEzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiBhbmQgY29udHJpYnV0b3JzIjsKIAogCiBzdGF0aWMgY29uc3QgY2hhciAqaG9zdGFwZF9jbGlfbGljZW5zZSA9CkBAIC03Miw5ICs3Miw2IEBACiAiICAgd3BzX2NoZWNrX3BpbiA8UElOPiAgdmVyaWZ5IFBJTiBjaGVja3N1bVxuIgogIiAgIHdwc19wYmMgICAgICAgICAgICAgIGluZGljYXRlIGJ1dHRvbiBwdXNoZWQgdG8gaW5pdGlhdGUgUEJDXG4iCiAiICAgd3BzX2NhbmNlbCAgICAgICAgICAgY2FuY2VsIHRoZSBwZW5kaW5nIFdQUyBvcGVyYXRpb25cbiIKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotIiAgIHdwc19vb2IgPHR5cGU+IDxwYXRoPiA8bWV0aG9kPiAgdXNlIFdQUyB3aXRoIG91dC1vZi1iYW5kIChVRkQpXG4iCi0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KICNpZmRlZiBDT05GSUdfV1BTX05GQwogIiAgIHdwc19uZmNfdGFnX3JlYWQgPGhleGR1bXA+ICByZXBvcnQgcmVhZCBORkMgdGFnIHdpdGggV1BTIGRhdGFcbiIKICIgICB3cHNfbmZjX2NvbmZpZ190b2tlbiA8V1BTL05ERUY+ICBidWlsZCBORkMgY29uZmlndXJhdGlvbiB0b2tlblxuIgpAQCAtNDEwLDQwICs0MDcsNiBAQAogfQogCiAKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotc3RhdGljIGludCBob3N0YXBkX2NsaV9jbWRfd3BzX29vYihzdHJ1Y3Qgd3BhX2N0cmwgKmN0cmwsIGludCBhcmdjLAotCQkJCSAgIGNoYXIgKmFyZ3ZbXSkKLXsKLQljaGFyIGNtZFsyNTZdOwotCWludCByZXM7Ci0KLQlpZiAoYXJnYyAhPSAzICYmIGFyZ2MgIT0gNCkgewotCQlwcmludGYoIkludmFsaWQgV1BTX09PQiBjb21tYW5kOiBuZWVkIHRocmVlIG9yIGZvdXIgIgotCQkgICAgICAgImFyZ3VtZW50czpcbiIKLQkJICAgICAgICItIERFVl9UWVBFOiB1c2UgJ3VmZCcgb3IgJ25mYydcbiIKLQkJICAgICAgICItIFBBVEg6IHBhdGggb2YgT09CIGRldmljZSBsaWtlICcvbW50J1xuIgotCQkgICAgICAgIi0gTUVUSE9EOiBPT0IgbWV0aG9kICdwaW4tZScgb3IgJ3Bpbi1yJywgIgotCQkgICAgICAgIidjcmVkJ1xuIgotCQkgICAgICAgIi0gREVWX05BTUU6IChvbmx5IGZvciBORkMpIGRldmljZSBuYW1lIGxpa2UgIgotCQkgICAgICAgIidwbjUzMSdcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGFyZ2MgPT0gMykKLQkJcmVzID0gb3Nfc25wcmludGYoY21kLCBzaXplb2YoY21kKSwgIldQU19PT0IgJXMgJXMgJXMiLAotCQkJCSAgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7Ci0JZWxzZQotCQlyZXMgPSBvc19zbnByaW50ZihjbWQsIHNpemVvZihjbWQpLCAiV1BTX09PQiAlcyAlcyAlcyAlcyIsCi0JCQkJICBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdLCBhcmd2WzNdKTsKLQlpZiAocmVzIDwgMCB8fCAoc2l6ZV90KSByZXMgPj0gc2l6ZW9mKGNtZCkgLSAxKSB7Ci0JCXByaW50ZigiVG9vIGxvbmcgV1BTX09PQiBjb21tYW5kLlxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIHdwYV9jdHJsX2NvbW1hbmQoY3RybCwgY21kKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfV1BTX09PQiAqLwotCi0KICNpZmRlZiBDT05GSUdfV1BTX05GQwogc3RhdGljIGludCBob3N0YXBkX2NsaV9jbWRfd3BzX25mY190YWdfcmVhZChzdHJ1Y3Qgd3BhX2N0cmwgKmN0cmwsIGludCBhcmdjLAogCQkJCQkgICAgY2hhciAqYXJndltdKQpAQCAtNTEyLDYgKzQ3NSwyOSBAQAogCX0KIAlyZXR1cm4gd3BhX2N0cmxfY29tbWFuZChjdHJsLCBjbWQpOwogfQorCisKK3N0YXRpYyBpbnQgaG9zdGFwZF9jbGlfY21kX25mY19nZXRfaGFuZG92ZXJfc2VsKHN0cnVjdCB3cGFfY3RybCAqY3RybCwKKwkJCQkJCWludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY2hhciBjbWRbNjRdOworCWludCByZXM7CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCXByaW50ZigiSW52YWxpZCAnbmZjX2dldF9oYW5kb3Zlcl9zZWwnIGNvbW1hbmQgLSB0d28gYXJndW1lbnRzICIKKwkJICAgICAgICJhcmUgcmVxdWlyZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlcyA9IG9zX3NucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICJORkNfR0VUX0hBTkRPVkVSX1NFTCAlcyAlcyIsCisJCQkgIGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWlmIChyZXMgPCAwIHx8IChzaXplX3QpIHJlcyA+PSBzaXplb2YoY21kKSAtIDEpIHsKKwkJcHJpbnRmKCJUb28gbG9uZyBORkNfR0VUX0hBTkRPVkVSX1NFTCBjb21tYW5kLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHdwYV9jdHJsX2NvbW1hbmQoY3RybCwgY21kKTsKK30KKwogI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCiAKIApAQCAtNTgxLDYgKzU2NywyNiBAQAogI2VuZGlmIC8qIENPTkZJR19XUFMgKi8KIAogCitzdGF0aWMgaW50IGhvc3RhcGRfY2xpX2NtZF9kaXNhc3NvY19pbW1pbmVudChzdHJ1Y3Qgd3BhX2N0cmwgKmN0cmwsIGludCBhcmdjLAorCQkJCQkgICAgIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyIGJ1ZlszMDBdOworCWludCByZXM7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJcHJpbnRmKCJJbnZhbGlkICdkaXNhc3NvY19pbW1pbmVudCcgY29tbWFuZCAtIHR3byBhcmd1bWVudHMgIgorCQkgICAgICAgIihTVEEgYWRkciBhbmQgRGlzYXNzb2NpYXRpb24gVGltZXIpIGFyZSBuZWVkZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzID0gb3Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkRJU0FTU09DX0lNTUlORU5UICVzICVzIiwKKwkJCSAgYXJndlswXSwgYXJndlsxXSk7CisJaWYgKHJlcyA8IDAgfHwgcmVzID49IChpbnQpIHNpemVvZihidWYpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHdwYV9jdHJsX2NvbW1hbmQoY3RybCwgYnVmKTsKK30KKworCiBzdGF0aWMgaW50IGhvc3RhcGRfY2xpX2NtZF9lc3NfZGlzYXNzb2Moc3RydWN0IHdwYV9jdHJsICpjdHJsLCBpbnQgYXJnYywKIAkJCQkJY2hhciAqYXJndltdKQogewpAQCAtODA5LDE3ICs4MTUsMTYgQEAKIAl7ICJ3cHNfY2hlY2tfcGluIiwgaG9zdGFwZF9jbGlfY21kX3dwc19jaGVja19waW4gfSwKIAl7ICJ3cHNfcGJjIiwgaG9zdGFwZF9jbGlfY21kX3dwc19wYmMgfSwKIAl7ICJ3cHNfY2FuY2VsIiwgaG9zdGFwZF9jbGlfY21kX3dwc19jYW5jZWwgfSwKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotCXsgIndwc19vb2IiLCBob3N0YXBkX2NsaV9jbWRfd3BzX29vYiB9LAotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKIAl7ICJ3cHNfbmZjX3RhZ19yZWFkIiwgaG9zdGFwZF9jbGlfY21kX3dwc19uZmNfdGFnX3JlYWQgfSwKIAl7ICJ3cHNfbmZjX2NvbmZpZ190b2tlbiIsIGhvc3RhcGRfY2xpX2NtZF93cHNfbmZjX2NvbmZpZ190b2tlbiB9LAogCXsgIndwc19uZmNfdG9rZW4iLCBob3N0YXBkX2NsaV9jbWRfd3BzX25mY190b2tlbiB9LAorCXsgIm5mY19nZXRfaGFuZG92ZXJfc2VsIiwgaG9zdGFwZF9jbGlfY21kX25mY19nZXRfaGFuZG92ZXJfc2VsIH0sCiAjZW5kaWYgLyogQ09ORklHX1dQU19ORkMgKi8KIAl7ICJ3cHNfYXBfcGluIiwgaG9zdGFwZF9jbGlfY21kX3dwc19hcF9waW4gfSwKIAl7ICJ3cHNfY29uZmlnIiwgaG9zdGFwZF9jbGlfY21kX3dwc19jb25maWcgfSwKICNlbmRpZiAvKiBDT05GSUdfV1BTICovCisJeyAiZGlzYXNzb2NfaW1taW5lbnQiLCBob3N0YXBkX2NsaV9jbWRfZGlzYXNzb2NfaW1taW5lbnQgfSwKIAl7ICJlc3NfZGlzYXNzb2MiLCBob3N0YXBkX2NsaV9jbWRfZXNzX2Rpc2Fzc29jIH0sCiAJeyAiZ2V0X2NvbmZpZyIsIGhvc3RhcGRfY2xpX2NtZF9nZXRfY29uZmlnIH0sCiAJeyAiaGVscCIsIGhvc3RhcGRfY2xpX2NtZF9oZWxwIH0sCmRpZmYgLS1naXQgYS9ob3N0YXBkL21haW4uYyBiL2hvc3RhcGQvbWFpbi5jCmluZGV4IDU2ZjAwMDIuLmQ0MjU2ZDAgMTAwNjQ0Ci0tLSBhL2hvc3RhcGQvbWFpbi5jCisrKyBiL2hvc3RhcGQvbWFpbi5jCkBAIC00NjgsNyArNDY4LDcgQEAKIAkJImhvc3RhcGQgdiIgVkVSU0lPTl9TVFIgIlxuIgogCQkiVXNlciBzcGFjZSBkYWVtb24gZm9yIElFRUUgODAyLjExIEFQIG1hbmFnZW1lbnQsXG4iCiAJCSJJRUVFIDgwMi4xWC9XUEEvV1BBMi9FQVAvUkFESVVTIEF1dGhlbnRpY2F0b3JcbiIKLQkJIkNvcHlyaWdodCAoYykgMjAwMi0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiAiCisJCSJDb3B5cmlnaHQgKGMpIDIwMDItMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4gIgogCQkiYW5kIGNvbnRyaWJ1dG9yc1xuIik7CiB9CiAKZGlmZiAtLWdpdCBhL2hvc3RhcGQvd3BzLWFwLW5mYy5weSBiL2hvc3RhcGQvd3BzLWFwLW5mYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YWQwYjQzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdGFwZC93cHMtYXAtbmZjLnB5CkBAIC0wLDAgKzEsMjc0IEBACisjIS91c3IvYmluL3B5dGhvbgorIworIyBFeGFtcGxlIG5mY3B5IHRvIGhvc3RhcGQgd3JhcHBlciBmb3IgV1BTIE5GQyBvcGVyYXRpb25zCisjIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorIworIyBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorIyBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworaW1wb3J0IG5mYworaW1wb3J0IG5mYy5uZGVmCitpbXBvcnQgbmZjLmxsY3AKK2ltcG9ydCBuZmMuaGFuZG92ZXIKKworaW1wb3J0IGxvZ2dpbmcKK2xvZ2dpbmcuYmFzaWNDb25maWcoKQorCitpbXBvcnQgd3BhY3RybAorCit3cGFzX2N0cmwgPSAnL3Zhci9ydW4vaG9zdGFwZCcKKworZGVmIHdwYXNfY29ubmVjdCgpOgorICAgIGlmYWNlcyA9IFtdCisgICAgaWYgb3MucGF0aC5pc2Rpcih3cGFzX2N0cmwpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZmFjZXMgPSBbb3MucGF0aC5qb2luKHdwYXNfY3RybCwgaSkgZm9yIGkgaW4gb3MubGlzdGRpcih3cGFzX2N0cmwpXQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZXJyb3I6CisgICAgICAgICAgICBwcmludCAiQ291bGQgbm90IGZpbmQgaG9zdGFwZDogIiwgZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBpZiBsZW4oaWZhY2VzKSA8IDE6CisgICAgICAgIHByaW50ICJObyBob3N0YXBkIGNvbnRyb2wgaW50ZXJmYWNlIGZvdW5kIgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZm9yIGN0cmwgaW4gaWZhY2VzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3cGFzID0gd3BhY3RybC5XUEFDdHJsKGN0cmwpCisgICAgICAgICAgICByZXR1cm4gd3BhcworICAgICAgICBleGNlcHQgd3BhY3RybC5lcnJvciwgZXJyb3I6CisgICAgICAgICAgICBwcmludCAiRXJyb3I6ICIsIGVycm9yCisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgd3Bhc190YWdfcmVhZChtZXNzYWdlKToKKyAgICB3cGFzID0gd3Bhc19jb25uZWN0KCkKKyAgICBpZiAod3BhcyA9PSBOb25lKToKKyAgICAgICAgcmV0dXJuCisgICAgcHJpbnQgd3Bhcy5yZXF1ZXN0KCJXUFNfTkZDX1RBR19SRUFEICIgKyBtZXNzYWdlLmVuY29kZSgiaGV4IikpCisKKworZGVmIHdwYXNfZ2V0X2NvbmZpZ190b2tlbigpOgorICAgIHdwYXMgPSB3cGFzX2Nvbm5lY3QoKQorICAgIGlmICh3cGFzID09IE5vbmUpOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiB3cGFzLnJlcXVlc3QoIldQU19ORkNfQ09ORklHX1RPS0VOIE5ERUYiKS5yc3RyaXAoKS5kZWNvZGUoImhleCIpCisKKworZGVmIHdwYXNfZ2V0X3Bhc3N3b3JkX3Rva2VuKCk6CisgICAgd3BhcyA9IHdwYXNfY29ubmVjdCgpCisgICAgaWYgKHdwYXMgPT0gTm9uZSk6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIHdwYXMucmVxdWVzdCgiV1BTX05GQ19UT0tFTiBOREVGIikucnN0cmlwKCkuZGVjb2RlKCJoZXgiKQorCisKK2RlZiB3cGFzX2dldF9oYW5kb3Zlcl9zZWwoKToKKyAgICB3cGFzID0gd3Bhc19jb25uZWN0KCkKKyAgICBpZiAod3BhcyA9PSBOb25lKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gd3Bhcy5yZXF1ZXN0KCJORkNfR0VUX0hBTkRPVkVSX1NFTCBOREVGIFdQUy1DUiIpLnJzdHJpcCgpLmRlY29kZSgiaGV4IikKKworCitkZWYgd3Bhc19yZXBvcnRfaGFuZG92ZXIocmVxLCBzZWwpOgorICAgIHdwYXMgPSB3cGFzX2Nvbm5lY3QoKQorICAgIGlmICh3cGFzID09IE5vbmUpOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiB3cGFzLnJlcXVlc3QoIk5GQ19SRVBPUlRfSEFORE9WRVIgUkVTUCBXUFMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIocmVxKS5lbmNvZGUoImhleCIpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cihzZWwpLmVuY29kZSgiaGV4IikpCisKKworY2xhc3MgSGFuZG92ZXJTZXJ2ZXIobmZjLmhhbmRvdmVyLkhhbmRvdmVyU2VydmVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cGVyKEhhbmRvdmVyU2VydmVyLCBzZWxmKS5fX2luaXRfXygpCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpOgorICAgICAgICBwcmludCAiSGFuZG92ZXJTZXJ2ZXIgLSByZXF1ZXN0IHJlY2VpdmVkIgorICAgICAgICBwcmludCAiUGFyc2VkIGhhbmRvdmVyIHJlcXVlc3Q6ICIgKyByZXF1ZXN0LnByZXR0eSgpCisKKyAgICAgICAgc2VsID0gbmZjLm5kZWYuSGFuZG92ZXJTZWxlY3RNZXNzYWdlKHZlcnNpb249IjEuMiIpCisKKyAgICAgICAgZm9yIGNhcnJpZXIgaW4gcmVxdWVzdC5jYXJyaWVyczoKKyAgICAgICAgICAgIHByaW50ICJSZW1vdGUgY2FycmllciB0eXBlOiAiICsgY2Fycmllci50eXBlCisgICAgICAgICAgICBpZiBjYXJyaWVyLnR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC53ZmEud3NjIjoKKyAgICAgICAgICAgICAgICBwcmludCAiV1BTIGNhcnJpZXIgdHlwZSBtYXRjaCAtIGFkZCBXUFMgY2FycmllciByZWNvcmQiCisgICAgICAgICAgICAgICAgc2VsZi5yZWNlaXZlZF9jYXJyaWVyID0gY2Fycmllci5yZWNvcmQKKyAgICAgICAgICAgICAgICBkYXRhID0gd3Bhc19nZXRfaGFuZG92ZXJfc2VsKCkKKyAgICAgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJDb3VsZCBub3QgZ2V0IGhhbmRvdmVyIHNlbGVjdCBjYXJyaWVyIHJlY29yZCBmcm9tIGhvc3RhcGQiCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcHJpbnQgIkhhbmRvdmVyIHNlbGVjdCBjYXJyaWVyIHJlY29yZCBmcm9tIGhvc3RhcGQ6IgorICAgICAgICAgICAgICAgIHByaW50IGRhdGEuZW5jb2RlKCJoZXgiKQorICAgICAgICAgICAgICAgIHNlbGYuc2VudF9jYXJyaWVyID0gZGF0YQorCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5mYy5uZGVmLk1lc3NhZ2UoZGF0YSk7CisgICAgICAgICAgICAgICAgc2VsLmFkZF9jYXJyaWVyKG1lc3NhZ2VbMF0sICJhY3RpdmUiLCBtZXNzYWdlWzE6XSkKKworICAgICAgICBwcmludCAiSGFuZG92ZXIgc2VsZWN0OiIKKyAgICAgICAgcHJpbnQgc2VsLnByZXR0eSgpCisgICAgICAgIHByaW50IHN0cihzZWwpLmVuY29kZSgiaGV4IikKKworICAgICAgICBwcmludCAiU2VuZGluZyBoYW5kb3ZlciBzZWxlY3QiCisgICAgICAgIHJldHVybiBzZWwKKworCitkZWYgd3BzX2hhbmRvdmVyX3Jlc3AocGVlcik6CisgICAgcHJpbnQgIlRyeWluZyB0byBoYW5kbGUgV1BTIGhhbmRvdmVyIgorCisgICAgc3J2ID0gSGFuZG92ZXJTZXJ2ZXIoKQorICAgIHNydi5zZW50X2NhcnJpZXIgPSBOb25lCisKKyAgICBuZmMubGxjcC5hY3RpdmF0ZShwZWVyKTsKKworICAgIHRyeToKKyAgICAgICAgcHJpbnQgIlRyeWluZyBoYW5kb3ZlciI7CisgICAgICAgIHNydi5zdGFydCgpCisgICAgICAgIHByaW50ICJXYWl0IGZvciBkaXNjb25uZWN0IgorICAgICAgICB3aGlsZSBuZmMubGxjcC5jb25uZWN0ZWQoKToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICBwcmludCAiRGlzY29ubmVjdGVkIGFmdGVyIGhhbmRvdmVyIgorICAgIGV4Y2VwdCBuZmMubGxjcC5Db25uZWN0UmVmdXNlZDoKKyAgICAgICAgcHJpbnQgIkhhbmRvdmVyIGNvbm5lY3Rpb24gcmVmdXNlZCIKKyAgICAgICAgbmZjLmxsY3Auc2h1dGRvd24oKQorICAgICAgICByZXR1cm4KKworICAgIGlmIHNydi5zZW50X2NhcnJpZXI6CisgICAgICAgIHdwYXNfcmVwb3J0X2hhbmRvdmVyKHNydi5yZWNlaXZlZF9jYXJyaWVyLCBzcnYuc2VudF9jYXJyaWVyKQorCisgICAgcHJpbnQgIlJlbW92ZSBwZWVyIgorICAgIG5mYy5sbGNwLnNodXRkb3duKCkKKyAgICBwcmludCAiRG9uZSB3aXRoIGhhbmRvdmVyIgorCisKK2RlZiB3cHNfdGFnX3JlYWQodGFnKToKKyAgICBpZiBsZW4odGFnLm5kZWYubWVzc2FnZSk6CisgICAgICAgIG1lc3NhZ2UgPSBuZmMubmRlZi5NZXNzYWdlKHRhZy5uZGVmLm1lc3NhZ2UpCisgICAgICAgIHByaW50ICJtZXNzYWdlIHR5cGUgIiArIG1lc3NhZ2UudHlwZQorCisgICAgICAgIGZvciByZWNvcmQgaW4gbWVzc2FnZToKKyAgICAgICAgICAgIHByaW50ICJyZWNvcmQgdHlwZSAiICsgcmVjb3JkLnR5cGUKKyAgICAgICAgICAgIGlmIHJlY29yZC50eXBlID09ICJhcHBsaWNhdGlvbi92bmQud2ZhLndzYyI6CisgICAgICAgICAgICAgICAgcHJpbnQgIldQUyB0YWcgLSBzZW5kIHRvIGhvc3RhcGQiCisgICAgICAgICAgICAgICAgd3Bhc190YWdfcmVhZCh0YWcubmRlZi5tZXNzYWdlKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgIkVtcHR5IHRhZyIKKworICAgIHByaW50ICJSZW1vdmUgdGFnIgorICAgIHdoaWxlIHRhZy5pc19wcmVzZW50OgorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworCitkZWYgd3BzX3dyaXRlX2NvbmZpZ190YWcoY2xmKToKKyAgICBwcmludCAiV3JpdGUgV1BTIGNvbmZpZyB0b2tlbiIKKyAgICBkYXRhID0gd3Bhc19nZXRfY29uZmlnX3Rva2VuKCkKKyAgICBpZiAoZGF0YSA9PSBOb25lKToKKyAgICAgICAgcHJpbnQgIkNvdWxkIG5vdCBnZXQgV1BTIGNvbmZpZyB0b2tlbiBmcm9tIGhvc3RhcGQiCisgICAgICAgIHJldHVybgorCisgICAgcHJpbnQgIlRvdWNoIGFuIE5GQyB0YWciCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdGFnID0gY2xmLnBvbGwoKQorICAgICAgICBpZiB0YWcgPT0gTm9uZToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYnJlYWsKKworICAgIHByaW50ICJUYWcgZm91bmQgLSB3cml0aW5nIgorICAgIHRhZy5uZGVmLm1lc3NhZ2UgPSBkYXRhCisgICAgcHJpbnQgIkRvbmUgLSByZW1vdmUgdGFnIgorICAgIHdoaWxlIHRhZy5pc19wcmVzZW50OgorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworCitkZWYgd3BzX3dyaXRlX3Bhc3N3b3JkX3RhZyhjbGYpOgorICAgIHByaW50ICJXcml0ZSBXUFMgcGFzc3dvcmQgdG9rZW4iCisgICAgZGF0YSA9IHdwYXNfZ2V0X3Bhc3N3b3JkX3Rva2VuKCkKKyAgICBpZiAoZGF0YSA9PSBOb25lKToKKyAgICAgICAgcHJpbnQgIkNvdWxkIG5vdCBnZXQgV1BTIHBhc3N3b3JkIHRva2VuIGZyb20gaG9zdGFwZCIKKyAgICAgICAgcmV0dXJuCisKKyAgICBwcmludCAiVG91Y2ggYW4gTkZDIHRhZyIKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0YWcgPSBjbGYucG9sbCgpCisgICAgICAgIGlmIHRhZyA9PSBOb25lOgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBicmVhaworCisgICAgcHJpbnQgIlRhZyBmb3VuZCAtIHdyaXRpbmciCisgICAgdGFnLm5kZWYubWVzc2FnZSA9IGRhdGEKKyAgICBwcmludCAiRG9uZSAtIHJlbW92ZSB0YWciCisgICAgd2hpbGUgdGFnLmlzX3ByZXNlbnQ6CisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisKK2RlZiBmaW5kX3BlZXIoY2xmKToKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBpZiBuZmMubGxjcC5jb25uZWN0ZWQoKToKKyAgICAgICAgICAgIHByaW50ICJMTENQIGNvbm5lY3RlZCIKKyAgICAgICAgZ2VuZXJhbF9ieXRlcyA9IG5mYy5sbGNwLnN0YXJ0dXAoe30pCisgICAgICAgIHBlZXIgPSBjbGYubGlzdGVuKG9yZChvcy51cmFuZG9tKDEpKSArIDI1MCwgZ2VuZXJhbF9ieXRlcykKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwZWVyLCBuZmMuREVQKToKKyAgICAgICAgICAgIHByaW50ICJsaXN0ZW4gLT4gREVQIjsKKyAgICAgICAgICAgIGlmIHBlZXIuZ2VuZXJhbF9ieXRlcy5zdGFydHN3aXRoKCJGZm0iKToKKyAgICAgICAgICAgICAgICBwcmludCAiRm91bmQgREVQIgorICAgICAgICAgICAgICAgIHJldHVybiBwZWVyCisgICAgICAgICAgICBwcmludCAibWlzbWF0Y2ggaW4gZ2VuZXJhbF9ieXRlcyIKKyAgICAgICAgICAgIHByaW50IHBlZXIuZ2VuZXJhbF9ieXRlcworCisgICAgICAgIHBlZXIgPSBjbGYucG9sbChnZW5lcmFsX2J5dGVzKQorICAgICAgICBpZiBpc2luc3RhbmNlKHBlZXIsIG5mYy5ERVApOgorICAgICAgICAgICAgcHJpbnQgInBvbGwgLT4gREVQIjsKKyAgICAgICAgICAgIGlmIHBlZXIuZ2VuZXJhbF9ieXRlcy5zdGFydHN3aXRoKCJGZm0iKToKKyAgICAgICAgICAgICAgICBwcmludCAiRm91bmQgREVQIgorICAgICAgICAgICAgICAgIHJldHVybiBwZWVyCisgICAgICAgICAgICBwcmludCAibWlzbWF0Y2ggaW4gZ2VuZXJhbF9ieXRlcyIKKyAgICAgICAgICAgIHByaW50IHBlZXIuZ2VuZXJhbF9ieXRlcworCisgICAgICAgIGlmIHBlZXI6CisgICAgICAgICAgICBwcmludCAiRm91bmQgdGFnIgorICAgICAgICAgICAgcmV0dXJuIHBlZXIKKworCitkZWYgbWFpbigpOgorICAgIGNsZiA9IG5mYy5Db250YWN0bGVzc0Zyb250ZW5kKCkKKworICAgIHRyeToKKyAgICAgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDEgYW5kIHN5cy5hcmd2WzFdID09ICJ3cml0ZS1jb25maWciOgorICAgICAgICAgICAgd3BzX3dyaXRlX2NvbmZpZ190YWcoY2xmKQorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorCisgICAgICAgIGlmIGxlbihzeXMuYXJndikgPiAxIGFuZCBzeXMuYXJndlsxXSA9PSAid3JpdGUtcGFzc3dvcmQiOgorICAgICAgICAgICAgd3BzX3dyaXRlX3Bhc3N3b3JkX3RhZyhjbGYpCisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHByaW50ICJXYWl0aW5nIGZvciBhIHRhZyBvciBwZWVyIHRvIGJlIHRvdWNoZWQiCisKKyAgICAgICAgICAgIHRhZyA9IGZpbmRfcGVlcihjbGYpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRhZywgbmZjLkRFUCk6CisgICAgICAgICAgICAgICAgd3BzX2hhbmRvdmVyX3Jlc3AodGFnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIHRhZy5uZGVmOgorICAgICAgICAgICAgICAgIHdwc190YWdfcmVhZCh0YWcpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgcHJpbnQgIk5vdCBhbiBOREVGIHRhZyAtIHJlbW92ZSB0YWciCisgICAgICAgICAgICB3aGlsZSB0YWcuaXNfcHJlc2VudDoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorICAgIGZpbmFsbHk6CisgICAgICAgIGNsZi5jbG9zZSgpCisKKyAgICByYWlzZSBTeXN0ZW1FeGl0CisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9zcmMvYXAvYWNjb3VudGluZy5jIGIvc3JjL2FwL2FjY291bnRpbmcuYwppbmRleCA3NTYzYjUyLi45NTQwNTMxIDEwMDY0NAotLS0gYS9zcmMvYXAvYWNjb3VudGluZy5jCisrKyBiL3NyYy9hcC9hY2NvdW50aW5nLmMKQEAgLTI2LDggKzI2LDYgQEAKICAqIGlucHV0L291dHB1dCBvY3RldHMgYW5kIHVwZGF0ZXMgQWNjdC17SW5wdXQsT3V0cHV0fS1HaWdhd29yZHMuICovCiAjZGVmaW5lIEFDQ1RfREVGQVVMVF9VUERBVEVfSU5URVJWQUwgMzAwCiAKLXN0YXRpYyB2b2lkIGFjY291bnRpbmdfc3RhX2dldF9pZChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAotCQkJCSAgc3RydWN0IHN0YV9pbmZvICpzdGEpOwogc3RhdGljIHZvaWQgYWNjb3VudGluZ19zdGFfaW50ZXJpbShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAogCQkJCSAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKIApAQCAtMjEwLDcgKzIwOCw2IEBACiAJaWYgKHN0YS0+YWNjdF9zZXNzaW9uX3N0YXJ0ZWQpCiAJCXJldHVybjsKIAotCWFjY291bnRpbmdfc3RhX2dldF9pZChoYXBkLCBzdGEpOwogCWhvc3RhcGRfbG9nZ2VyKGhhcGQsIHN0YS0+YWRkciwgSE9TVEFQRF9NT0RVTEVfUkFESVVTLAogCQkgICAgICAgSE9TVEFQRF9MRVZFTF9JTkZPLAogCQkgICAgICAgInN0YXJ0aW5nIGFjY291bnRpbmcgc2Vzc2lvbiAlMDhYLSUwOFgiLApAQCAtMzc3LDcgKzM3NCw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgYWNjb3VudGluZ19zdGFfZ2V0X2lkKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCit2b2lkIGFjY291bnRpbmdfc3RhX2dldF9pZChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAogCQkJCSAgc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7CiAJc3RhLT5hY2N0X3Nlc3Npb25faWRfbG8gPSBoYXBkLT5hY2N0X3Nlc3Npb25faWRfbG8rKzsKZGlmZiAtLWdpdCBhL3NyYy9hcC9hY2NvdW50aW5nLmggYi9zcmMvYXAvYWNjb3VudGluZy5oCmluZGV4IDlkMTNkMDEuLmRjYzU0ZWUgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9hY2NvdW50aW5nLmgKKysrIGIvc3JjL2FwL2FjY291bnRpbmcuaApAQCAtMTAsNiArMTAsMTEgQEAKICNkZWZpbmUgQUNDT1VOVElOR19ICiAKICNpZmRlZiBDT05GSUdfTk9fQUNDT1VOVElORworc3RhdGljIGlubGluZSB2b2lkIGFjY291bnRpbmdfc3RhX2dldF9pZChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJCQkgc3RydWN0IHN0YV9pbmZvICpzdGEpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY2NvdW50aW5nX3N0YV9zdGFydChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAogCQkJCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKQEAgLTI5LDYgKzM0LDcgQEAKIHsKIH0KICNlbHNlIC8qIENPTkZJR19OT19BQ0NPVU5USU5HICovCit2b2lkIGFjY291bnRpbmdfc3RhX2dldF9pZChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CiB2b2lkIGFjY291bnRpbmdfc3RhX3N0YXJ0KHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKIHZvaWQgYWNjb3VudGluZ19zdGFfc3RvcChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CiBpbnQgYWNjb3VudGluZ19pbml0KHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQpOwpkaWZmIC0tZ2l0IGEvc3JjL2FwL2FwX2NvbmZpZy5jIGIvc3JjL2FwL2FwX2NvbmZpZy5jCmluZGV4IDMxZTFjMTkuLjkyMmY1NjQgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9hcF9jb25maWcuYworKysgYi9zcmMvYXAvYXBfY29uZmlnLmMKQEAgLTg5LDYgKzg5LDggQEAKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLwogCiAJYnNzLT5yYWRpdXNfZGFzX3RpbWVfd2luZG93ID0gMzAwOworCisJYnNzLT5zYWVfYW50aV9jbG9nZ2luZ190aHJlc2hvbGQgPSA1OwogfQogCiAKQEAgLTE1OCw2ICsxNjAsOSBAQAogCiAJY29uZi0+aHRfY2FwYWIgPSBIVF9DQVBfSU5GT19TTVBTX0RJU0FCTEVEOwogCisJY29uZi0+YXBfdGFibGVfbWF4X3NpemUgPSAyNTU7CisJY29uZi0+YXBfdGFibGVfZXhwaXJhdGlvbl90aW1lID0gNjA7CisKIAlyZXR1cm4gY29uZjsKIH0KIApAQCAtNDA4LDYgKzQxMyw3IEBACiAJCXVzZXIgPSB1c2VyLT5uZXh0OwogCQlob3N0YXBkX2NvbmZpZ19mcmVlX2VhcF91c2VyKHByZXZfdXNlcik7CiAJfQorCW9zX2ZyZWUoY29uZi0+ZWFwX3VzZXJfc3FsaXRlKTsKIAogCW9zX2ZyZWUoY29uZi0+ZHVtcF9sb2dfbmFtZSk7CiAJb3NfZnJlZShjb25mLT5lYXBfcmVxX2lkX3RleHQpOwpAQCAtNTE1LDYgKzUyMSw4IEBACiAjZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KIAogCXdwYWJ1Zl9mcmVlKGNvbmYtPnZlbmRvcl9lbGVtZW50cyk7CisKKwlvc19mcmVlKGNvbmYtPnNhZV9ncm91cHMpOwogfQogCiAKQEAgLTYxOSw1NyArNjI3LDMgQEAKIAogCXJldHVybiBOVUxMOwogfQotCi0KLWNvbnN0IHN0cnVjdCBob3N0YXBkX2VhcF91c2VyICoKLWhvc3RhcGRfZ2V0X2VhcF91c2VyKGNvbnN0IHN0cnVjdCBob3N0YXBkX2Jzc19jb25maWcgKmNvbmYsIGNvbnN0IHU4ICppZGVudGl0eSwKLQkJICAgICBzaXplX3QgaWRlbnRpdHlfbGVuLCBpbnQgcGhhc2UyKQotewotCXN0cnVjdCBob3N0YXBkX2VhcF91c2VyICp1c2VyID0gY29uZi0+ZWFwX3VzZXI7Ci0KLSNpZmRlZiBDT05GSUdfV1BTCi0JaWYgKGNvbmYtPndwc19zdGF0ZSAmJiBpZGVudGl0eV9sZW4gPT0gV1NDX0lEX0VOUk9MTEVFX0xFTiAmJgotCSAgICBvc19tZW1jbXAoaWRlbnRpdHksIFdTQ19JRF9FTlJPTExFRSwgV1NDX0lEX0VOUk9MTEVFX0xFTikgPT0gMCkgewotCQlzdGF0aWMgc3RydWN0IGhvc3RhcGRfZWFwX3VzZXIgd3NjX2Vucm9sbGVlOwotCQlvc19tZW1zZXQoJndzY19lbnJvbGxlZSwgMCwgc2l6ZW9mKHdzY19lbnJvbGxlZSkpOwotCQl3c2NfZW5yb2xsZWUubWV0aG9kc1swXS5tZXRob2QgPSBlYXBfc2VydmVyX2dldF90eXBlKAotCQkJIldTQyIsICZ3c2NfZW5yb2xsZWUubWV0aG9kc1swXS52ZW5kb3IpOwotCQlyZXR1cm4gJndzY19lbnJvbGxlZTsKLQl9Ci0KLQlpZiAoY29uZi0+d3BzX3N0YXRlICYmIGlkZW50aXR5X2xlbiA9PSBXU0NfSURfUkVHSVNUUkFSX0xFTiAmJgotCSAgICBvc19tZW1jbXAoaWRlbnRpdHksIFdTQ19JRF9SRUdJU1RSQVIsIFdTQ19JRF9SRUdJU1RSQVJfTEVOKSA9PSAwKSB7Ci0JCXN0YXRpYyBzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciB3c2NfcmVnaXN0cmFyOwotCQlvc19tZW1zZXQoJndzY19yZWdpc3RyYXIsIDAsIHNpemVvZih3c2NfcmVnaXN0cmFyKSk7Ci0JCXdzY19yZWdpc3RyYXIubWV0aG9kc1swXS5tZXRob2QgPSBlYXBfc2VydmVyX2dldF90eXBlKAotCQkJIldTQyIsICZ3c2NfcmVnaXN0cmFyLm1ldGhvZHNbMF0udmVuZG9yKTsKLQkJd3NjX3JlZ2lzdHJhci5wYXNzd29yZCA9ICh1OCAqKSBjb25mLT5hcF9waW47Ci0JCXdzY19yZWdpc3RyYXIucGFzc3dvcmRfbGVuID0gY29uZi0+YXBfcGluID8KLQkJCW9zX3N0cmxlbihjb25mLT5hcF9waW4pIDogMDsKLQkJcmV0dXJuICZ3c2NfcmVnaXN0cmFyOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfV1BTICovCi0KLQl3aGlsZSAodXNlcikgewotCQlpZiAoIXBoYXNlMiAmJiB1c2VyLT5pZGVudGl0eSA9PSBOVUxMKSB7Ci0JCQkvKiBXaWxkY2FyZCBtYXRjaCAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodXNlci0+cGhhc2UyID09ICEhcGhhc2UyICYmIHVzZXItPndpbGRjYXJkX3ByZWZpeCAmJgotCQkgICAgaWRlbnRpdHlfbGVuID49IHVzZXItPmlkZW50aXR5X2xlbiAmJgotCQkgICAgb3NfbWVtY21wKHVzZXItPmlkZW50aXR5LCBpZGVudGl0eSwgdXNlci0+aWRlbnRpdHlfbGVuKSA9PQotCQkgICAgMCkgewotCQkJLyogV2lsZGNhcmQgcHJlZml4IG1hdGNoICovCi0JCQlicmVhazsKLQkJfQotCi0JCWlmICh1c2VyLT5waGFzZTIgPT0gISFwaGFzZTIgJiYKLQkJICAgIHVzZXItPmlkZW50aXR5X2xlbiA9PSBpZGVudGl0eV9sZW4gJiYKLQkJICAgIG9zX21lbWNtcCh1c2VyLT5pZGVudGl0eSwgaWRlbnRpdHksIGlkZW50aXR5X2xlbikgPT0gMCkKLQkJCWJyZWFrOwotCQl1c2VyID0gdXNlci0+bmV4dDsKLQl9Ci0KLQlyZXR1cm4gdXNlcjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9hcC9hcF9jb25maWcuaCBiL3NyYy9hcC9hcF9jb25maWcuaAppbmRleCBmNWU0YTZhLi42NjA2ZjcyIDEwMDY0NAotLS0gYS9zcmMvYXAvYXBfY29uZmlnLmgKKysrIGIvc3JjL2FwL2FwX2NvbmZpZy5oCkBAIC01MSw3ICs1MSw4IEBACiBzdHJ1Y3QgaG9zdGFwZF9zc2lkIHsKIAl1OCBzc2lkW0hPU1RBUERfTUFYX1NTSURfTEVOXTsKIAlzaXplX3Qgc3NpZF9sZW47Ci0JaW50IHNzaWRfc2V0OworCXVuc2lnbmVkIGludCBzc2lkX3NldDoxOworCXVuc2lnbmVkIGludCB1dGY4X3NzaWQ6MTsKIAogCWNoYXIgdmxhbltJRk5BTVNJWiArIDFdOwogCXNlY3BvbGljeSBzZWN1cml0eV9wb2xpY3k7CkBAIC05Niw2ICs5NywxMSBAQAogfTsKIAogI2RlZmluZSBQTUtfTEVOIDMyCitzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCB7CisJc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKm5leHQ7CisJdTggcHNrW1BNS19MRU5dOworfTsKKwogc3RydWN0IGhvc3RhcGRfd3BhX3BzayB7CiAJc3RydWN0IGhvc3RhcGRfd3BhX3BzayAqbmV4dDsKIAlpbnQgZ3JvdXA7CkBAIC0xOTIsNiArMTk4LDcgQEAKIAlpbnQgZWFwX3NlcnZlcjsgLyogVXNlIGludGVybmFsIEVBUCBzZXJ2ZXIgaW5zdGVhZCBvZiBleHRlcm5hbAogCQkJICogUkFESVVTIHNlcnZlciAqLwogCXN0cnVjdCBob3N0YXBkX2VhcF91c2VyICplYXBfdXNlcjsKKwljaGFyICplYXBfdXNlcl9zcWxpdGU7CiAJY2hhciAqZWFwX3NpbV9kYjsKIAlzdHJ1Y3QgaG9zdGFwZF9pcF9hZGRyIG93bl9pcF9hZGRyOwogCWNoYXIgKm5hc19pZGVudGlmaWVyOwpAQCAtMzU4LDYgKzM2NSw3IEBACiAJY2hhciAqbW9kZWxfdXJsOwogCWNoYXIgKnVwYzsKIAlzdHJ1Y3Qgd3BhYnVmICp3cHNfdmVuZG9yX2V4dFtNQVhfV1BTX1ZFTkRPUl9FWFRFTlNJT05TXTsKKwlpbnQgd3BzX25mY19wd19mcm9tX2NvbmZpZzsKIAlpbnQgd3BzX25mY19kZXZfcHdfaWQ7CiAJc3RydWN0IHdwYWJ1ZiAqd3BzX25mY19kaF9wdWJrZXk7CiAJc3RydWN0IHdwYWJ1ZiAqd3BzX25mY19kaF9wcml2a2V5OwpAQCAtMzg0LDYgKzM5Miw4IEBACiAJLyogSUVFRSA4MDIuMTF2ICovCiAJaW50IHRpbWVfYWR2ZXJ0aXNlbWVudDsKIAljaGFyICp0aW1lX3pvbmU7CisJaW50IHdubV9zbGVlcF9tb2RlOworCWludCBic3NfdHJhbnNpdGlvbjsKIAogCS8qIElFRUUgODAyLjExdSAtIEludGVyd29ya2luZyAqLwogCWludCBpbnRlcndvcmtpbmc7CkBAIC00NDYsNiArNDU2LDkgQEAKICNlbmRpZiAvKiBDT05GSUdfUkFESVVTX1RFU1QgKi8KIAogCXN0cnVjdCB3cGFidWYgKnZlbmRvcl9lbGVtZW50czsKKworCXVuc2lnbmVkIGludCBzYWVfYW50aV9jbG9nZ2luZ190aHJlc2hvbGQ7CisJaW50ICpzYWVfZ3JvdXBzOwogfTsKIAogCkBAIC01MDUsNiArNTE4LDcgQEAKIAlpbnQgcmVxdWlyZV92aHQ7CiAJdTggdmh0X29wZXJfY2h3aWR0aDsKIAl1OCB2aHRfb3Blcl9jZW50cl9mcmVxX3NlZzBfaWR4OworCXU4IHZodF9vcGVyX2NlbnRyX2ZyZXFfc2VnMV9pZHg7CiB9OwogCiAKQEAgLTUyMyw5ICs1MzcsNiBAQAogaW50IGhvc3RhcGRfc2V0dXBfd3BhX3BzayhzdHJ1Y3QgaG9zdGFwZF9ic3NfY29uZmlnICpjb25mKTsKIGNvbnN0IGNoYXIgKiBob3N0YXBkX2dldF92bGFuX2lkX2lmbmFtZShzdHJ1Y3QgaG9zdGFwZF92bGFuICp2bGFuLAogCQkJCQlpbnQgdmxhbl9pZCk7Ci1jb25zdCBzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciAqCi1ob3N0YXBkX2dldF9lYXBfdXNlcihjb25zdCBzdHJ1Y3QgaG9zdGFwZF9ic3NfY29uZmlnICpjb25mLCBjb25zdCB1OCAqaWRlbnRpdHksCi0JCSAgICAgc2l6ZV90IGlkZW50aXR5X2xlbiwgaW50IHBoYXNlMik7CiBzdHJ1Y3QgaG9zdGFwZF9yYWRpdXNfYXR0ciAqCiBob3N0YXBkX2NvbmZpZ19nZXRfcmFkaXVzX2F0dHIoc3RydWN0IGhvc3RhcGRfcmFkaXVzX2F0dHIgKmF0dHIsIHU4IHR5cGUpOwogCmRpZmYgLS1naXQgYS9zcmMvYXAvYXBfZHJ2X29wcy5jIGIvc3JjL2FwL2FwX2Rydl9vcHMuYwppbmRleCAwMmRhMjViLi5iNzFkNTFkIDEwMDY0NAotLS0gYS9zcmMvYXAvYXBfZHJ2X29wcy5jCisrKyBiL3NyYy9hcC9hcF9kcnZfb3BzLmMKQEAgLTMzOCw2ICszMzgsNyBAQAogCQkgICAgY29uc3QgdTggKnN1cHBfcmF0ZXMsIHNpemVfdCBzdXBwX3JhdGVzX2xlbiwKIAkJICAgIHUxNiBsaXN0ZW5faW50ZXJ2YWwsCiAJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyAqaHRfY2FwYWIsCisJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3ZodF9jYXBhYmlsaXRpZXMgKnZodF9jYXBhYiwKIAkJICAgIHUzMiBmbGFncywgdTggcW9zaW5mbykKIHsKIAlzdHJ1Y3QgaG9zdGFwZF9zdGFfYWRkX3BhcmFtcyBwYXJhbXM7CkBAIC0zNTUsNiArMzU2LDcgQEAKIAlwYXJhbXMuc3VwcF9yYXRlc19sZW4gPSBzdXBwX3JhdGVzX2xlbjsKIAlwYXJhbXMubGlzdGVuX2ludGVydmFsID0gbGlzdGVuX2ludGVydmFsOwogCXBhcmFtcy5odF9jYXBhYmlsaXRpZXMgPSBodF9jYXBhYjsKKwlwYXJhbXMudmh0X2NhcGFiaWxpdGllcyA9IHZodF9jYXBhYjsKIAlwYXJhbXMuZmxhZ3MgPSBob3N0YXBkX3N0YV9mbGFnc190b19kcnYoZmxhZ3MpOwogCXBhcmFtcy5xb3NpbmZvID0gcW9zaW5mbzsKIAlyZXR1cm4gaGFwZC0+ZHJpdmVyLT5zdGFfYWRkKGhhcGQtPmRydl9wcml2LCAmcGFyYW1zKTsKQEAgLTQ1NCwxOSArNDU2LDc2IEBACiAKIAogaW50IGhvc3RhcGRfc2V0X2ZyZXEoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgaW50IG1vZGUsIGludCBmcmVxLAotCQkgICAgIGludCBjaGFubmVsLCBpbnQgaHRfZW5hYmxlZCwgaW50IHNlY19jaGFubmVsX29mZnNldCkKKwkJICAgICBpbnQgY2hhbm5lbCwgaW50IGh0X2VuYWJsZWQsIGludCB2aHRfZW5hYmxlZCwKKwkJICAgICBpbnQgc2VjX2NoYW5uZWxfb2Zmc2V0LCBpbnQgdmh0X29wZXJfY2h3aWR0aCwKKwkJICAgICBpbnQgY2VudGVyX3NlZ21lbnQwLCBpbnQgY2VudGVyX3NlZ21lbnQxKQogewogCXN0cnVjdCBob3N0YXBkX2ZyZXFfcGFyYW1zIGRhdGE7Ci0JaWYgKGhhcGQtPmRyaXZlciA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAoaGFwZC0+ZHJpdmVyLT5zZXRfZnJlcSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKwlpbnQgdG1wOworCiAJb3NfbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOwogCWRhdGEubW9kZSA9IG1vZGU7CiAJZGF0YS5mcmVxID0gZnJlcTsKIAlkYXRhLmNoYW5uZWwgPSBjaGFubmVsOwogCWRhdGEuaHRfZW5hYmxlZCA9IGh0X2VuYWJsZWQ7CisJZGF0YS52aHRfZW5hYmxlZCA9IHZodF9lbmFibGVkOwogCWRhdGEuc2VjX2NoYW5uZWxfb2Zmc2V0ID0gc2VjX2NoYW5uZWxfb2Zmc2V0OworCWRhdGEuY2VudGVyX2ZyZXExID0gZnJlcSArIHNlY19jaGFubmVsX29mZnNldCAqIDEwOworCWRhdGEuY2VudGVyX2ZyZXEyID0gMDsKKwlkYXRhLmJhbmR3aWR0aCA9IHNlY19jaGFubmVsX29mZnNldCA/IDQwIDogMjA7CisKKwkvKgorCSAqIFRoaXMgdmFsaWRhdGlvbiBjb2RlIGlzIHByb2JhYmx5IG1pc3BsYWNlZCwgbWF5YmUgaXQgc2hvdWxkIGJlCisJICogaW4gc3JjL2FwL2h3X2ZlYXR1cmVzLmMgYW5kIGNoZWNrIHRoZSBoYXJkd2FyZSBzdXBwb3J0IGFzIHdlbGwuCisJICovCisJaWYgKGRhdGEudmh0X2VuYWJsZWQpIHN3aXRjaCAodmh0X29wZXJfY2h3aWR0aCkgeworCWNhc2UgVkhUX0NIQU5XSURUSF9VU0VfSFQ6CisJCWlmIChjZW50ZXJfc2VnbWVudDEpCisJCQlyZXR1cm4gLTE7CisJCWlmICg1MDAwICsgY2VudGVyX3NlZ21lbnQwICogNSAhPSBkYXRhLmNlbnRlcl9mcmVxMSkKKwkJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJY2FzZSBWSFRfQ0hBTldJRFRIXzgwUDgwTUhaOgorCQlpZiAoY2VudGVyX3NlZ21lbnQxID09IGNlbnRlcl9zZWdtZW50MCArIDQgfHwKKwkJICAgIGNlbnRlcl9zZWdtZW50MSA9PSBjZW50ZXJfc2VnbWVudDAgLSA0KQorCQkJcmV0dXJuIC0xOworCQlkYXRhLmNlbnRlcl9mcmVxMiA9IDUwMDAgKyBjZW50ZXJfc2VnbWVudDEgKiA1OworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFZIVF9DSEFOV0lEVEhfODBNSFo6CisJCWRhdGEuYmFuZHdpZHRoID0gODA7CisJCWlmICh2aHRfb3Blcl9jaHdpZHRoID09IDEgJiYgY2VudGVyX3NlZ21lbnQxKQorCQkJcmV0dXJuIC0xOworCQlpZiAodmh0X29wZXJfY2h3aWR0aCA9PSAzICYmICFjZW50ZXJfc2VnbWVudDEpCisJCQlyZXR1cm4gLTE7CisJCWlmICghc2VjX2NoYW5uZWxfb2Zmc2V0KQorCQkJcmV0dXJuIC0xOworCQkvKiBwcmltYXJ5IDQwIHBhcnQgbXVzdCBtYXRjaCB0aGUgSFQgY29uZmlndXJhdGlvbiAqLworCQl0bXAgPSAoMzAgKyBmcmVxIC0gNTAwMCAtIGNlbnRlcl9zZWdtZW50MCAqIDUpLzIwOworCQl0bXAgLz0gMjsKKwkJaWYgKGRhdGEuY2VudGVyX2ZyZXExICE9IDUwMDAgKworCQkJCQkgY2VudGVyX3NlZ21lbnQwICogNSAtIDIwICsgNDAgKiB0bXApCisJCQlyZXR1cm4gLTE7CisJCWRhdGEuY2VudGVyX2ZyZXExID0gNTAwMCArIGNlbnRlcl9zZWdtZW50MCAqIDU7CisJCWJyZWFrOworCWNhc2UgVkhUX0NIQU5XSURUSF8xNjBNSFo6CisJCWRhdGEuYmFuZHdpZHRoID0gMTYwOworCQlpZiAoY2VudGVyX3NlZ21lbnQxKQorCQkJcmV0dXJuIC0xOworCQlpZiAoIXNlY19jaGFubmVsX29mZnNldCkKKwkJCXJldHVybiAtMTsKKwkJLyogcHJpbWFyeSA0MCBwYXJ0IG11c3QgbWF0Y2ggdGhlIEhUIGNvbmZpZ3VyYXRpb24gKi8KKwkJdG1wID0gKDcwICsgZnJlcSAtIDUwMDAgLSBjZW50ZXJfc2VnbWVudDAgKiA1KS8yMDsKKwkJdG1wIC89IDI7CisJCWlmIChkYXRhLmNlbnRlcl9mcmVxMSAhPSA1MDAwICsKKwkJCQkJIGNlbnRlcl9zZWdtZW50MCAqIDUgLSA2MCArIDQwICogdG1wKQorCQkJcmV0dXJuIC0xOworCQlkYXRhLmNlbnRlcl9mcmVxMSA9IDUwMDAgKyBjZW50ZXJfc2VnbWVudDAgKiA1OworCQlicmVhazsKKwl9CisJaWYgKGhhcGQtPmRyaXZlciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoaGFwZC0+ZHJpdmVyLT5zZXRfZnJlcSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKIAlyZXR1cm4gaGFwZC0+ZHJpdmVyLT5zZXRfZnJlcShoYXBkLT5kcnZfcHJpdiwgJmRhdGEpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvYXAvYXBfZHJ2X29wcy5oIGIvc3JjL2FwL2FwX2Rydl9vcHMuaAppbmRleCA5YzUzYjk5Li5jZWI3ZTY4IDEwMDY0NAotLS0gYS9zcmMvYXAvYXBfZHJ2X29wcy5oCisrKyBiL3NyYy9hcC9hcF9kcnZfb3BzLmgKQEAgLTEzLDYgKzEzLDcgQEAKIHN0cnVjdCB3cGFfYnNzX3BhcmFtczsKIHN0cnVjdCB3cGFfZHJpdmVyX3NjYW5fcGFyYW1zOwogc3RydWN0IGllZWU4MDIxMV9odF9jYXBhYmlsaXRpZXM7CitzdHJ1Y3QgaWVlZTgwMjExX3ZodF9jYXBhYmlsaXRpZXM7CiAKIHUzMiBob3N0YXBkX3N0YV9mbGFnc190b19kcnYodTMyIGZsYWdzKTsKIGludCBob3N0YXBkX2J1aWxkX2FwX2V4dHJhX2llcyhzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLApAQCAtMzcsNiArMzgsNyBAQAogCQkgICAgY29uc3QgdTggKnN1cHBfcmF0ZXMsIHNpemVfdCBzdXBwX3JhdGVzX2xlbiwKIAkJICAgIHUxNiBsaXN0ZW5faW50ZXJ2YWwsCiAJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyAqaHRfY2FwYWIsCisJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3ZodF9jYXBhYmlsaXRpZXMgKnZodF9jYXBhYiwKIAkJICAgIHUzMiBmbGFncywgdTggcW9zaW5mbyk7CiBpbnQgaG9zdGFwZF9zZXRfcHJpdmFjeShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBpbnQgZW5hYmxlZCk7CiBpbnQgaG9zdGFwZF9zZXRfZ2VuZXJpY19lbGVtKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICplbGVtLApAQCAtNTUsNyArNTcsOSBAQAogCQkgICAgICAgY29uc3QgdTggKmFkZHIsIGludCBpZHgsIHU4ICpzZXEpOwogaW50IGhvc3RhcGRfZmx1c2goc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCk7CiBpbnQgaG9zdGFwZF9zZXRfZnJlcShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBpbnQgbW9kZSwgaW50IGZyZXEsCi0JCSAgICAgaW50IGNoYW5uZWwsIGludCBodF9lbmFibGVkLCBpbnQgc2VjX2NoYW5uZWxfb2Zmc2V0KTsKKwkJICAgICBpbnQgY2hhbm5lbCwgaW50IGh0X2VuYWJsZWQsIGludCB2aHRfZW5hYmxlZCwKKwkJICAgICBpbnQgc2VjX2NoYW5uZWxfb2Zmc2V0LCBpbnQgdmh0X29wZXJfY2h3aWR0aCwKKwkJICAgICBpbnQgY2VudGVyX3NlZ21lbnQwLCBpbnQgY2VudGVyX3NlZ21lbnQxKTsKIGludCBob3N0YXBkX3NldF9ydHMoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgaW50IHJ0cyk7CiBpbnQgaG9zdGFwZF9zZXRfZnJhZyhzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBpbnQgZnJhZyk7CiBpbnQgaG9zdGFwZF9zdGFfc2V0X2ZsYWdzKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIHU4ICphZGRyLApkaWZmIC0tZ2l0IGEvc3JjL2FwL2F1dGhzcnYuYyBiL3NyYy9hcC9hdXRoc3J2LmMKaW5kZXggNWMwM2Y0NS4uZDY2ZDk3ZSAxMDA2NDQKLS0tIGEvc3JjL2FwL2F1dGhzcnYuYworKysgYi9zcmMvYXAvYXV0aHNydi5jCkBAIC05Miw3ICs5Miw3IEBACiAJb3NfbWVtc2V0KCZzcnYsIDAsIHNpemVvZihzcnYpKTsKIAlzcnYuY2xpZW50X2ZpbGUgPSBjb25mLT5yYWRpdXNfc2VydmVyX2NsaWVudHM7CiAJc3J2LmF1dGhfcG9ydCA9IGNvbmYtPnJhZGl1c19zZXJ2ZXJfYXV0aF9wb3J0OwotCXNydi5jb25mX2N0eCA9IGNvbmY7CisJc3J2LmNvbmZfY3R4ID0gaGFwZDsKIAlzcnYuZWFwX3NpbV9kYl9wcml2ID0gaGFwZC0+ZWFwX3NpbV9kYl9wcml2OwogCXNydi5zc2xfY3R4ID0gaGFwZC0+c3NsX2N0eDsKIAlzcnYubXNnX2N0eCA9IGhhcGQtPm1zZ19jdHg7CmRpZmYgLS1naXQgYS9zcmMvYXAvYmVhY29uLmMgYi9zcmMvYXAvYmVhY29uLmMKaW5kZXggZjc2MWJmNS4uNGM0N2M3NSAxMDA2NDQKLS0tIGEvc3JjL2FwL2JlYWNvbi5jCisrKyBiL3NyYy9hcC9iZWFjb24uYwpAQCAtMiw3ICsyLDcgQEAKICAqIGhvc3RhcGQgLyBJRUVFIDgwMi4xMSBNYW5hZ2VtZW50OiBCZWFjb24gYW5kIFByb2JlIFJlcXVlc3QvUmVzcG9uc2UKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0LCBJbnN0YW50ODAyIE5ldHdvcmtzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgRGV2aWNlc2NhcGUgU29mdHdhcmUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0zMTAsNiArMzEwLDQ2IEBACiB9CiAKIAorZW51bSBzc2lkX21hdGNoX3Jlc3VsdCB7CisJTk9fU1NJRF9NQVRDSCwKKwlFWEFDVF9TU0lEX01BVENILAorCVdJTERDQVJEX1NTSURfTUFUQ0gKK307CisKK3N0YXRpYyBlbnVtIHNzaWRfbWF0Y2hfcmVzdWx0IHNzaWRfbWF0Y2goc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKKwkJCQkJIGNvbnN0IHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4sCisJCQkJCSBjb25zdCB1OCAqc3NpZF9saXN0LAorCQkJCQkgc2l6ZV90IHNzaWRfbGlzdF9sZW4pCit7CisJY29uc3QgdTggKnBvcywgKmVuZDsKKwlpbnQgd2lsZGNhcmQgPSAwOworCisJaWYgKHNzaWRfbGVuID09IDApCisJCXdpbGRjYXJkID0gMTsKKwlpZiAoc3NpZF9sZW4gPT0gaGFwZC0+Y29uZi0+c3NpZC5zc2lkX2xlbiAmJgorCSAgICBvc19tZW1jbXAoc3NpZCwgaGFwZC0+Y29uZi0+c3NpZC5zc2lkLCBzc2lkX2xlbikgPT0gMCkKKwkJcmV0dXJuIEVYQUNUX1NTSURfTUFUQ0g7CisKKwlpZiAoc3NpZF9saXN0ID09IE5VTEwpCisJCXJldHVybiB3aWxkY2FyZCA/IFdJTERDQVJEX1NTSURfTUFUQ0ggOiBOT19TU0lEX01BVENIOworCisJcG9zID0gc3NpZF9saXN0OworCWVuZCA9IHNzaWRfbGlzdCArIHNzaWRfbGlzdF9sZW47CisJd2hpbGUgKHBvcyArIDEgPD0gZW5kKSB7CisJCWlmIChwb3MgKyAyICsgcG9zWzFdID4gZW5kKQorCQkJYnJlYWs7CisJCWlmIChwb3NbMV0gPT0gMCkKKwkJCXdpbGRjYXJkID0gMTsKKwkJaWYgKHBvc1sxXSA9PSBoYXBkLT5jb25mLT5zc2lkLnNzaWRfbGVuICYmCisJCSAgICBvc19tZW1jbXAocG9zICsgMiwgaGFwZC0+Y29uZi0+c3NpZC5zc2lkLCBwb3NbMV0pID09IDApCisJCQlyZXR1cm4gRVhBQ1RfU1NJRF9NQVRDSDsKKwkJcG9zICs9IDIgKyBwb3NbMV07CisJfQorCisJcmV0dXJuIHdpbGRjYXJkID8gV0lMRENBUkRfU1NJRF9NQVRDSCA6IE5PX1NTSURfTUFUQ0g7Cit9CisKKwogdm9pZCBoYW5kbGVfcHJvYmVfcmVxKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgc2l6ZV90IGxlbiwKIAkJICAgICAgaW50IHNzaV9zaWduYWwpCkBAIC0zMjEsNiArMzYxLDcgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IE5VTEw7CiAJc2l6ZV90IGksIHJlc3BfbGVuOwogCWludCBub2FjazsKKwllbnVtIHNzaWRfbWF0Y2hfcmVzdWx0IHJlczsKIAogCWllID0gbWdtdC0+dS5wcm9iZV9yZXEudmFyaWFibGU7CiAJaWYgKGxlbiA8IElFRUU4MDIxMV9IRFJMRU4gKyBzaXplb2YobWdtdC0+dS5wcm9iZV9yZXEpKQpAQCAtMzc2LDcgKzQxNyw4IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KIAotCWlmIChoYXBkLT5jb25mLT5pZ25vcmVfYnJvYWRjYXN0X3NzaWQgJiYgZWxlbXMuc3NpZF9sZW4gPT0gMCkgeworCWlmIChoYXBkLT5jb25mLT5pZ25vcmVfYnJvYWRjYXN0X3NzaWQgJiYgZWxlbXMuc3NpZF9sZW4gPT0gMCAmJgorCSAgICBlbGVtcy5zc2lkX2xpc3RfbGVuID09IDApIHsKIAkJd3BhX3ByaW50ZihNU0dfTVNHRFVNUCwgIlByb2JlIFJlcXVlc3QgZnJvbSAiIE1BQ1NUUiAiIGZvciAiCiAJCQkgICAiYnJvYWRjYXN0IFNTSUQgaWdub3JlZCIsIE1BQzJTVFIobWdtdC0+c2EpKTsKIAkJcmV0dXJuOwpAQCAtMzk0LDEwICs0MzYsOSBAQAogCX0KICNlbmRpZiAvKiBDT05GSUdfUDJQICovCiAKLQlpZiAoZWxlbXMuc3NpZF9sZW4gPT0gMCB8fAotCSAgICAoZWxlbXMuc3NpZF9sZW4gPT0gaGFwZC0+Y29uZi0+c3NpZC5zc2lkX2xlbiAmJgotCSAgICAgb3NfbWVtY21wKGVsZW1zLnNzaWQsIGhhcGQtPmNvbmYtPnNzaWQuc3NpZCwgZWxlbXMuc3NpZF9sZW4pID09Ci0JICAgICAwKSkgeworCXJlcyA9IHNzaWRfbWF0Y2goaGFwZCwgZWxlbXMuc3NpZCwgZWxlbXMuc3NpZF9sZW4sCisJCQkgZWxlbXMuc3NpZF9saXN0LCBlbGVtcy5zc2lkX2xpc3RfbGVuKTsKKwlpZiAocmVzICE9IE5PX1NTSURfTUFUQ0gpIHsKIAkJaWYgKHN0YSkKIAkJCXN0YS0+c3NpZF9wcm9iZSA9ICZoYXBkLT5jb25mLT5zc2lkOwogCX0gZWxzZSB7CkBAIC00MDYsOSArNDQ3LDEwIEBACiAJCQlpZWVlODAyXzExX3ByaW50X3NzaWQoc3NpZF90eHQsIGVsZW1zLnNzaWQsCiAJCQkJCSAgICAgIGVsZW1zLnNzaWRfbGVuKTsKIAkJCXdwYV9wcmludGYoTVNHX01TR0RVTVAsICJQcm9iZSBSZXF1ZXN0IGZyb20gIiBNQUNTVFIKLQkJCQkgICAiIGZvciBmb3JlaWduIFNTSUQgJyVzJyAoREEgIiBNQUNTVFIgIikiLAorCQkJCSAgICIgZm9yIGZvcmVpZ24gU1NJRCAnJXMnIChEQSAiIE1BQ1NUUiAiKSVzIiwKIAkJCQkgICBNQUMyU1RSKG1nbXQtPnNhKSwgc3NpZF90eHQsCi0JCQkJICAgTUFDMlNUUihtZ210LT5kYSkpOworCQkJCSAgIE1BQzJTVFIobWdtdC0+ZGEpLAorCQkJCSAgIGVsZW1zLnNzaWRfbGlzdCA/ICIgKFNTSUQgbGlzdCkiIDogIiIpOwogCQl9CiAJCXJldHVybjsKIAl9CkBAIC00NTUsNyArNDk3LDggQEAKIAkgKiBJZiB0aGlzIGlzIGEgYnJvYWRjYXN0IHByb2JlIHJlcXVlc3QsIGFwcGx5IG5vIGFjayBwb2xpY3kgdG8gYXZvaWQKIAkgKiBleGNlc3NpdmUgcmV0cmllcy4KIAkgKi8KLQlub2FjayA9ICEhKGVsZW1zLnNzaWRfbGVuID09IDAgJiYgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIobWdtdC0+ZGEpKTsKKwlub2FjayA9ICEhKHJlcyA9PSBXSUxEQ0FSRF9TU0lEX01BVENIICYmCisJCSAgIGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1nbXQtPmRhKSk7CiAKIAlpZiAoaG9zdGFwZF9kcnZfc2VuZF9tbG1lKGhhcGQsIHJlc3AsIHJlc3BfbGVuLCBub2FjaykgPCAwKQogCQlwZXJyb3IoImhhbmRsZV9wcm9iZV9yZXE6IHNlbmQiKTsKZGlmZiAtLWdpdCBhL3NyYy9hcC9jdHJsX2lmYWNlX2FwLmMgYi9zcmMvYXAvY3RybF9pZmFjZV9hcC5jCmluZGV4IGFiOWM4M2UuLjFjYjdlNzMgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9jdHJsX2lmYWNlX2FwLmMKKysrIGIvc3JjL2FwL2N0cmxfaWZhY2VfYXAuYwpAQCAtMjEsNiArMjEsMjggQEAKICNpbmNsdWRlICJhcF9kcnZfb3BzLmgiCiAKIAorc3RhdGljIGludCBob3N0YXBkX2dldF9zdGFfY29ubl90aW1lKHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJCSAgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCXN0cnVjdCBvc190aW1lIG5vdywgYWdlOworCWludCBsZW4gPSAwLCByZXQ7CisKKwlpZiAoIXN0YS0+Y29ubmVjdGVkX3RpbWUuc2VjKQorCQlyZXR1cm4gMDsKKworCW9zX2dldF90aW1lKCZub3cpOworCW9zX3RpbWVfc3ViKCZub3csICZzdGEtPmNvbm5lY3RlZF90aW1lLCAmYWdlKTsKKworCXJldCA9IG9zX3NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmbGVuIC0gbGVuLCAiY29ubmVjdGVkX3RpbWU9JXVcbiIsCisJCQkgICh1bnNpZ25lZCBpbnQpIGFnZS5zZWMpOworCWlmIChyZXQgPCAwIHx8IChzaXplX3QpIHJldCA+PSBidWZsZW4gLSBsZW4pCisJCXJldHVybiBsZW47CisJbGVuICs9IHJldDsKKworCXJldHVybiBsZW47Cit9CisKKwogc3RhdGljIGludCBob3N0YXBkX2N0cmxfaWZhY2Vfc3RhX21pYihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAogCQkJCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLAogCQkJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKQEAgLTU4LDYgKzgwLDEwIEBACiAJaWYgKHJlcyA+PSAwKQogCQlsZW4gKz0gcmVzOwogCisJcmVzID0gaG9zdGFwZF9nZXRfc3RhX2Nvbm5fdGltZShzdGEsIGJ1ZiArIGxlbiwgYnVmbGVuIC0gbGVuKTsKKwlpZiAocmVzID49IDApCisJCWxlbiArPSByZXM7CisKIAlyZXR1cm4gbGVuOwogfQogCkBAIC0xNjMsNiArMTg5LDcgQEAKIAl1OCBhZGRyW0VUSF9BTEVOXTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAljb25zdCBjaGFyICpwb3M7CisJdTE2IHJlYXNvbiA9IFdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQ7CiAKIAl3cGFfZGJnKGhhcGQtPm1zZ19jdHgsIE1TR19ERUJVRywgIkNUUkxfSUZBQ0UgREVBVVRIRU5USUNBVEUgJXMiLAogCQl0eHRhZGRyKTsKQEAgLTIwMiwxMSArMjI5LDE0IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19QMlBfTUFOQUdFUiAqLwogCi0JaG9zdGFwZF9kcnZfc3RhX2RlYXV0aChoYXBkLCBhZGRyLCBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEKTsKKwlwb3MgPSBvc19zdHJzdHIodHh0YWRkciwgIiByZWFzb249Iik7CisJaWYgKHBvcykKKwkJcmVhc29uID0gYXRvaShwb3MgKyA4KTsKKworCWhvc3RhcGRfZHJ2X3N0YV9kZWF1dGgoaGFwZCwgYWRkciwgcmVhc29uKTsKIAlzdGEgPSBhcF9nZXRfc3RhKGhhcGQsIGFkZHIpOwogCWlmIChzdGEpCi0JCWFwX3N0YV9kZWF1dGhlbnRpY2F0ZShoYXBkLCBzdGEsCi0JCQkJICAgICAgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCk7CisJCWFwX3N0YV9kZWF1dGhlbnRpY2F0ZShoYXBkLCBzdGEsIHJlYXNvbik7CiAJZWxzZSBpZiAoYWRkclswXSA9PSAweGZmKQogCQlob3N0YXBkX2ZyZWVfc3RhcyhoYXBkKTsKIApAQCAtMjIwLDYgKzI1MCw3IEBACiAJdTggYWRkcltFVEhfQUxFTl07CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJY29uc3QgY2hhciAqcG9zOworCXUxNiByZWFzb24gPSBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEOwogCiAJd3BhX2RiZyhoYXBkLT5tc2dfY3R4LCBNU0dfREVCVUcsICJDVFJMX0lGQUNFIERJU0FTU09DSUFURSAlcyIsCiAJCXR4dGFkZHIpOwpAQCAtMjU5LDExICsyOTAsMTQgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX1AyUF9NQU5BR0VSICovCiAKLQlob3N0YXBkX2Rydl9zdGFfZGlzYXNzb2MoaGFwZCwgYWRkciwgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCk7CisJcG9zID0gb3Nfc3Ryc3RyKHR4dGFkZHIsICIgcmVhc29uPSIpOworCWlmIChwb3MpCisJCXJlYXNvbiA9IGF0b2kocG9zICsgOCk7CisKKwlob3N0YXBkX2Rydl9zdGFfZGlzYXNzb2MoaGFwZCwgYWRkciwgcmVhc29uKTsKIAlzdGEgPSBhcF9nZXRfc3RhKGhhcGQsIGFkZHIpOwogCWlmIChzdGEpCi0JCWFwX3N0YV9kaXNhc3NvY2lhdGUoaGFwZCwgc3RhLAotCQkJCSAgICBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEKTsKKwkJYXBfc3RhX2Rpc2Fzc29jaWF0ZShoYXBkLCBzdGEsIHJlYXNvbik7CiAJZWxzZSBpZiAoYWRkclswXSA9PSAweGZmKQogCQlob3N0YXBkX2ZyZWVfc3RhcyhoYXBkKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2FwL2Rydl9jYWxsYmFja3MuYyBiL3NyYy9hcC9kcnZfY2FsbGJhY2tzLmMKaW5kZXggMjNmYTI0MS4uNmQyMmQ0OSAxMDA2NDQKLS0tIGEvc3JjL2FwL2Rydl9jYWxsYmFja3MuYworKysgYi9zcmMvYXAvZHJ2X2NhbGxiYWNrcy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAiZHJpdmVycy9kcml2ZXIuaCIKICNpbmNsdWRlICJjb21tb24vaWVlZTgwMl8xMV9kZWZzLmgiCiAjaW5jbHVkZSAiY29tbW9uL2llZWU4MDJfMTFfY29tbW9uLmgiCisjaW5jbHVkZSAiY29tbW9uL3dwYV9jdHJsLmgiCiAjaW5jbHVkZSAiY3J5cHRvL3JhbmRvbS5oIgogI2luY2x1ZGUgInAycC9wMnAuaCIKICNpbmNsdWRlICJ3cHMvd3BzLmgiCkBAIC0xMDksNiArMTEwLDE1IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KIAorI2lmZGVmIENPTkZJR19IUzIwCisJd3BhYnVmX2ZyZWUoc3RhLT5oczIwX2llKTsKKwlpZiAoZWxlbXMuaHMyMCAmJiBlbGVtcy5oczIwX2xlbiA+IDQpIHsKKwkJc3RhLT5oczIwX2llID0gd3BhYnVmX2FsbG9jX2NvcHkoZWxlbXMuaHMyMCArIDQsCisJCQkJCQkgZWxlbXMuaHMyMF9sZW4gLSA0KTsKKwl9IGVsc2UKKwkJc3RhLT5oczIwX2llID0gTlVMTDsKKyNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLworCiAJaWYgKGhhcGQtPmNvbmYtPndwYSkgewogCQlpZiAoaWUgPT0gTlVMTCB8fCBpZWxlbiA9PSAwKSB7CiAjaWZkZWYgQ09ORklHX1dQUwpAQCAtMzg0LDYgKzM5NCwyMiBAQAogfQogCiAKK3ZvaWQgaG9zdGFwZF9ldmVudF9jb25uZWN0X2ZhaWxlZF9yZWFzb24oc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKKwkJCQkJIGNvbnN0IHU4ICphZGRyLCBpbnQgcmVhc29uX2NvZGUpCit7CisJc3dpdGNoIChyZWFzb25fY29kZSkgeworCWNhc2UgTUFYX0NMSUVOVF9SRUFDSEVEOgorCQl3cGFfbXNnKGhhcGQtPm1zZ19jdHgsIE1TR19JTkZPLCBBUF9SRUpFQ1RFRF9NQVhfU1RBIE1BQ1NUUiwKKwkJCU1BQzJTVFIoYWRkcikpOworCQlicmVhazsKKwljYXNlIEJMT0NLRURfQ0xJRU5UOgorCQl3cGFfbXNnKGhhcGQtPm1zZ19jdHgsIE1TR19JTkZPLCBBUF9SRUpFQ1RFRF9CTE9DS0VEX1NUQSBNQUNTVFIsCisJCQlNQUMyU1RSKGFkZHIpKTsKKwkJYnJlYWs7CisJfQorfQorCisKIGludCBob3N0YXBkX3Byb2JlX3JlcV9yeChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqc2EsIGNvbnN0IHU4ICpkYSwKIAkJCSBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwKIAkJCSBpbnQgc3NpX3NpZ25hbCkKQEAgLTUwMywxMyArNTI5LDEzIEBACiAJCQkJCSAgIGFjdGlvbi0+ZGF0YSArIDIpOwogCX0KICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCisjaWZkZWYgQ09ORklHX1dOTQogCWlmIChhY3Rpb24tPmNhdGVnb3J5ID09IFdMQU5fQUNUSU9OX1dOTSkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIiVzOiBXTk1fQUNUSU9OIGxlbmd0aCAlZCIsCiAJCQkgICBfX2Z1bmNfXywgKGludCkgYWN0aW9uLT5sZW4pOwogCQlpZWVlODAyXzExX3J4X3dubV9hY3Rpb25fYXAoaGFwZCwgYWN0aW9uKTsKIAl9Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KKyNlbmRpZiAvKiBDT05GSUdfV05NICovCiB9CiAKIApAQCAtNjcyLDEyICs2OTgsMTUgQEAKIAkJCQkgICBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKQogewogCXN0cnVjdCBob3N0YXBkX2lmYWNlICppZmFjZSA9IGhhcGQtPmlmYWNlOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCXNpemVfdCBqOwogCiAJZm9yIChqID0gMDsgaiA8IGlmYWNlLT5udW1fYnNzOyBqKyspIHsKLQkJaWYgKGFwX2dldF9zdGEoaWZhY2UtPmJzc1tqXSwgc3JjKSkgewotCQkJaGFwZCA9IGlmYWNlLT5ic3Nbal07Ci0JCQlicmVhazsKKwkJaWYgKChzdGEgPSBhcF9nZXRfc3RhKGlmYWNlLT5ic3Nbal0sIHNyYykpKSB7CisJCQlpZiAoc3RhLT5mbGFncyAmIFdMQU5fU1RBX0FTU09DKSB7CisJCQkJaGFwZCA9IGlmYWNlLT5ic3Nbal07CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTgxNiw2ICs4NDUsMTMgQEAKIAkJCQkJZGF0YS0+Y2hfc3dpdGNoLmh0X2VuYWJsZWQsCiAJCQkJCWRhdGEtPmNoX3N3aXRjaC5jaF9vZmZzZXQpOwogCQlicmVhazsKKwljYXNlIEVWRU5UX0NPTk5FQ1RfRkFJTEVEX1JFQVNPTjoKKwkJaWYgKCFkYXRhKQorCQkJYnJlYWs7CisJCWhvc3RhcGRfZXZlbnRfY29ubmVjdF9mYWlsZWRfcmVhc29uKAorCQkJaGFwZCwgZGF0YS0+Y29ubmVjdF9mYWlsZWRfcmVhc29uLmFkZHIsCisJCQlkYXRhLT5jb25uZWN0X2ZhaWxlZF9yZWFzb24uY29kZSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiVW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9zcmMvYXAvZWFwX3VzZXJfZGIuYyBiL3NyYy9hcC9lYXBfdXNlcl9kYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDUwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYXAvZWFwX3VzZXJfZGIuYwpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIGhvc3RhcGQgLyBFQVAgdXNlciBkYXRhYmFzZQorICogQ29weXJpZ2h0IChjKSAyMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaWZkZWYgQ09ORklHX1NRTElURQorI2luY2x1ZGUgPHNxbGl0ZTMuaD4KKyNlbmRpZiAvKiBDT05GSUdfU1FMSVRFICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJlYXBfY29tbW9uL2VhcF93c2NfY29tbW9uLmgiCisjaW5jbHVkZSAiZWFwX3NlcnZlci9lYXBfbWV0aG9kcy5oIgorI2luY2x1ZGUgImVhcF9zZXJ2ZXIvZWFwLmgiCisjaW5jbHVkZSAiYXBfY29uZmlnLmgiCisjaW5jbHVkZSAiaG9zdGFwZC5oIgorCisjaWZkZWYgQ09ORklHX1NRTElURQorCitzdGF0aWMgdm9pZCBzZXRfdXNlcl9tZXRob2RzKHN0cnVjdCBob3N0YXBkX2VhcF91c2VyICp1c2VyLCBjb25zdCBjaGFyICptZXRob2RzKQoreworCWNoYXIgKmJ1ZiwgKnN0YXJ0OworCWludCBudW1fbWV0aG9kczsKKworCWJ1ZiA9IG9zX3N0cmR1cChtZXRob2RzKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybjsKKworCW9zX21lbXNldCgmdXNlci0+bWV0aG9kcywgMCwgc2l6ZW9mKHVzZXItPm1ldGhvZHMpKTsKKwludW1fbWV0aG9kcyA9IDA7CisJc3RhcnQgPSBidWY7CisJd2hpbGUgKCpzdGFydCkgeworCQljaGFyICpwb3MzID0gb3Nfc3RyY2hyKHN0YXJ0LCAnLCcpOworCQlpZiAocG9zMykKKwkJCSpwb3MzKysgPSAnXDAnOworCQl1c2VyLT5tZXRob2RzW251bV9tZXRob2RzXS5tZXRob2QgPQorCQkJZWFwX3NlcnZlcl9nZXRfdHlwZShzdGFydCwKKwkJCQkJICAgICZ1c2VyLT5tZXRob2RzW251bV9tZXRob2RzXS52ZW5kb3IpOworCQlpZiAodXNlci0+bWV0aG9kc1tudW1fbWV0aG9kc10udmVuZG9yID09IEVBUF9WRU5ET1JfSUVURiAmJgorCQkgICAgdXNlci0+bWV0aG9kc1tudW1fbWV0aG9kc10ubWV0aG9kID09IEVBUF9UWVBFX05PTkUpIHsKKwkJCWlmIChvc19zdHJjbXAoc3RhcnQsICJUVExTLVBBUCIpID09IDApIHsKKwkJCQl1c2VyLT50dGxzX2F1dGggfD0gRUFQX1RUTFNfQVVUSF9QQVA7CisJCQkJZ290byBza2lwX2VhcDsKKwkJCX0KKwkJCWlmIChvc19zdHJjbXAoc3RhcnQsICJUVExTLUNIQVAiKSA9PSAwKSB7CisJCQkJdXNlci0+dHRsc19hdXRoIHw9IEVBUF9UVExTX0FVVEhfQ0hBUDsKKwkJCQlnb3RvIHNraXBfZWFwOworCQkJfQorCQkJaWYgKG9zX3N0cmNtcChzdGFydCwgIlRUTFMtTVNDSEFQIikgPT0gMCkgeworCQkJCXVzZXItPnR0bHNfYXV0aCB8PSBFQVBfVFRMU19BVVRIX01TQ0hBUDsKKwkJCQlnb3RvIHNraXBfZWFwOworCQkJfQorCQkJaWYgKG9zX3N0cmNtcChzdGFydCwgIlRUTFMtTVNDSEFQVjIiKSA9PSAwKSB7CisJCQkJdXNlci0+dHRsc19hdXRoIHw9IEVBUF9UVExTX0FVVEhfTVNDSEFQVjI7CisJCQkJZ290byBza2lwX2VhcDsKKwkJCX0KKwkJCXdwYV9wcmludGYoTVNHX0lORk8sICJEQjogVW5zdXBwb3J0ZWQgRUFQIHR5cGUgJyVzJyIsCisJCQkJICAgc3RhcnQpOworCQkJb3NfZnJlZShidWYpOworCQkJcmV0dXJuOworCQl9CisKKwkJbnVtX21ldGhvZHMrKzsKKwkJaWYgKG51bV9tZXRob2RzID49IEVBUF9NQVhfTUVUSE9EUykKKwkJCWJyZWFrOworCXNraXBfZWFwOgorCQlpZiAocG9zMyA9PSBOVUxMKQorCQkJYnJlYWs7CisJCXN0YXJ0ID0gcG9zMzsKKwl9CisKKwlvc19mcmVlKGJ1Zik7Cit9CisKKworc3RhdGljIGludCBnZXRfdXNlcl9jYih2b2lkICpjdHgsIGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgKmNvbFtdKQoreworCXN0cnVjdCBob3N0YXBkX2VhcF91c2VyICp1c2VyID0gY3R4OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAob3Nfc3RyY21wKGNvbFtpXSwgInBhc3N3b3JkIikgPT0gMCAmJiBhcmd2W2ldKSB7CisJCQlvc19mcmVlKHVzZXItPnBhc3N3b3JkKTsKKwkJCXVzZXItPnBhc3N3b3JkX2xlbiA9IG9zX3N0cmxlbihhcmd2W2ldKTsKKwkJCXVzZXItPnBhc3N3b3JkID0gKHU4ICopIG9zX3N0cmR1cChhcmd2W2ldKTsKKwkJCXVzZXItPm5leHQgPSAodm9pZCAqKSAxOworCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChjb2xbaV0sICJtZXRob2RzIikgPT0gMCAmJiBhcmd2W2ldKSB7CisJCQlzZXRfdXNlcl9tZXRob2RzKHVzZXIsIGFyZ3ZbaV0pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBnZXRfd2lsZGNhcmRfY2Iodm9pZCAqY3R4LCBpbnQgYXJnYywgY2hhciAqYXJndltdLCBjaGFyICpjb2xbXSkKK3sKKwlzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciAqdXNlciA9IGN0eDsKKwlpbnQgaSwgaWQgPSAtMSwgbWV0aG9kcyA9IC0xOworCXNpemVfdCBsZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmIChvc19zdHJjbXAoY29sW2ldLCAiaWRlbnRpdHkiKSA9PSAwICYmIGFyZ3ZbaV0pCisJCQlpZCA9IGk7CisJCWVsc2UgaWYgKG9zX3N0cmNtcChjb2xbaV0sICJtZXRob2RzIikgPT0gMCAmJiBhcmd2W2ldKQorCQkJbWV0aG9kcyA9IGk7CisJfQorCisJaWYgKGlkIDwgMCB8fCBtZXRob2RzIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBvc19zdHJsZW4oYXJndltpZF0pOworCWlmIChsZW4gPD0gdXNlci0+aWRlbnRpdHlfbGVuICYmCisJICAgIG9zX21lbWNtcChhcmd2W2lkXSwgdXNlci0+aWRlbnRpdHksIGxlbikgPT0gMCAmJgorCSAgICAodXNlci0+cGFzc3dvcmQgPT0gTlVMTCB8fCBsZW4gPiB1c2VyLT5wYXNzd29yZF9sZW4pKSB7CisJCW9zX2ZyZWUodXNlci0+cGFzc3dvcmQpOworCQl1c2VyLT5wYXNzd29yZF9sZW4gPSBvc19zdHJsZW4oYXJndltpZF0pOworCQl1c2VyLT5wYXNzd29yZCA9ICh1OCAqKSBvc19zdHJkdXAoYXJndltpZF0pOworCQl1c2VyLT5uZXh0ID0gKHZvaWQgKikgMTsKKwkJc2V0X3VzZXJfbWV0aG9kcyh1c2VyLCBhcmd2W21ldGhvZHNdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhvc3RhcGRfZWFwX3VzZXIgKgorZWFwX3VzZXJfc3FsaXRlX2dldChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqaWRlbnRpdHksCisJCSAgICBzaXplX3QgaWRlbnRpdHlfbGVuLCBpbnQgcGhhc2UyKQoreworCXNxbGl0ZTMgKmRiOworCXN0cnVjdCBob3N0YXBkX2VhcF91c2VyICp1c2VyID0gTlVMTDsKKwljaGFyIGlkX3N0clsyNTZdLCBjbWRbMzAwXTsKKwlzaXplX3QgaTsKKworCWlmIChpZGVudGl0eV9sZW4gPj0gc2l6ZW9mKGlkX3N0cikpCisJCXJldHVybiBOVUxMOworCW9zX21lbWNweShpZF9zdHIsIGlkZW50aXR5LCBpZGVudGl0eV9sZW4pOworCWlkX3N0cltpZGVudGl0eV9sZW5dID0gJ1wwJzsKKwlmb3IgKGkgPSAwOyBpIDwgaWRlbnRpdHlfbGVuOyBpKyspIHsKKwkJaWYgKGlkX3N0cltpXSA+PSAnYScgJiYgaWRfc3RyW2ldIDw9ICd6JykKKwkJCWNvbnRpbnVlOworCQlpZiAoaWRfc3RyW2ldID49ICdBJyAmJiBpZF9zdHJbaV0gPD0gJ1onKQorCQkJY29udGludWU7CisJCWlmIChpZF9zdHJbaV0gPj0gJzAnICYmIGlkX3N0cltpXSA8PSAnOScpCisJCQljb250aW51ZTsKKwkJaWYgKGlkX3N0cltpXSA9PSAnLScgfHwgaWRfc3RyW2ldID09ICdfJyB8fCBpZF9zdHJbaV0gPT0gJy4nIHx8CisJCSAgICBpZF9zdHJbaV0gPT0gJywnIHx8IGlkX3N0cltpXSA9PSAnQCcgfHwgaWRfc3RyW2ldID09ICdcXCcgfHwKKwkJICAgIGlkX3N0cltpXSA9PSAnIScgfHwgaWRfc3RyW2ldID09ICcjJyB8fCBpZF9zdHJbaV0gPT0gJyUnIHx8CisJCSAgICBpZF9zdHJbaV0gPT0gJz0nIHx8IGlkX3N0cltpXSA9PSAnICcpCisJCQljb250aW51ZTsKKwkJd3BhX3ByaW50ZihNU0dfSU5GTywgIkRCOiBVbnN1cHBvcnRlZCBjaGFyYWN0ZXIgaW4gaWRlbnRpdHkiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJb3NfZnJlZShoYXBkLT50bXBfZWFwX3VzZXIuaWRlbnRpdHkpOworCW9zX2ZyZWUoaGFwZC0+dG1wX2VhcF91c2VyLnBhc3N3b3JkKTsKKwlvc19tZW1zZXQoJmhhcGQtPnRtcF9lYXBfdXNlciwgMCwgc2l6ZW9mKGhhcGQtPnRtcF9lYXBfdXNlcikpOworCWhhcGQtPnRtcF9lYXBfdXNlci5waGFzZTIgPSBwaGFzZTI7CisJaGFwZC0+dG1wX2VhcF91c2VyLmlkZW50aXR5ID0gb3NfemFsbG9jKGlkZW50aXR5X2xlbiArIDEpOworCWlmIChoYXBkLT50bXBfZWFwX3VzZXIuaWRlbnRpdHkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJb3NfbWVtY3B5KGhhcGQtPnRtcF9lYXBfdXNlci5pZGVudGl0eSwgaWRlbnRpdHksIGlkZW50aXR5X2xlbik7CisKKwlpZiAoc3FsaXRlM19vcGVuKGhhcGQtPmNvbmYtPmVhcF91c2VyX3NxbGl0ZSwgJmRiKSkgeworCQl3cGFfcHJpbnRmKE1TR19JTkZPLCAiREI6IEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlICVzOiAlcyIsCisJCQkgICBoYXBkLT5jb25mLT5lYXBfdXNlcl9zcWxpdGUsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CisJCXNxbGl0ZTNfY2xvc2UoZGIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlvc19zbnByaW50ZihjbWQsIHNpemVvZihjbWQpLAorCQkgICAgIlNFTEVDVCBwYXNzd29yZCxtZXRob2RzIEZST00gdXNlcnMgV0hFUkUgIgorCQkgICAgImlkZW50aXR5PSclcycgQU5EIHBoYXNlMj0lZDsiLCBpZF9zdHIsIHBoYXNlMik7CisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJEQjogJXMiLCBjbWQpOworCWlmIChzcWxpdGUzX2V4ZWMoZGIsIGNtZCwgZ2V0X3VzZXJfY2IsICZoYXBkLT50bXBfZWFwX3VzZXIsIE5VTEwpICE9CisJICAgIFNRTElURV9PSykgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkRCOiBGYWlsZWQgdG8gY29tcGxldGUgU1FMIG9wZXJhdGlvbiIpOworCX0gZWxzZSBpZiAoaGFwZC0+dG1wX2VhcF91c2VyLm5leHQpCisJCXVzZXIgPSAmaGFwZC0+dG1wX2VhcF91c2VyOworCisJaWYgKHVzZXIgPT0gTlVMTCAmJiAhcGhhc2UyKSB7CisJCW9zX3NucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksCisJCQkgICAgIlNFTEVDVCBpZGVudGl0eSxtZXRob2RzIEZST00gd2lsZGNhcmRzOyIpOworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkRCOiAlcyIsIGNtZCk7CisJCWlmIChzcWxpdGUzX2V4ZWMoZGIsIGNtZCwgZ2V0X3dpbGRjYXJkX2NiLCAmaGFwZC0+dG1wX2VhcF91c2VyLAorCQkJCSBOVUxMKSAhPSBTUUxJVEVfT0spIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiREI6IEZhaWxlZCB0byBjb21wbGV0ZSBTUUwgIgorCQkJCSAgICJvcGVyYXRpb24iKTsKKwkJfSBlbHNlIGlmIChoYXBkLT50bXBfZWFwX3VzZXIubmV4dCkgeworCQkJdXNlciA9ICZoYXBkLT50bXBfZWFwX3VzZXI7CisJCQlvc19mcmVlKHVzZXItPmlkZW50aXR5KTsKKwkJCXVzZXItPmlkZW50aXR5ID0gdXNlci0+cGFzc3dvcmQ7CisJCQl1c2VyLT5pZGVudGl0eV9sZW4gPSB1c2VyLT5wYXNzd29yZF9sZW47CisJCQl1c2VyLT5wYXNzd29yZCA9IE5VTEw7CisJCQl1c2VyLT5wYXNzd29yZF9sZW4gPSAwOworCQl9CisJfQorCisJc3FsaXRlM19jbG9zZShkYik7CisKKwlyZXR1cm4gdXNlcjsKK30KKworI2VuZGlmIC8qIENPTkZJR19TUUxJVEUgKi8KKworCitjb25zdCBzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciAqCitob3N0YXBkX2dldF9lYXBfdXNlcihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqaWRlbnRpdHksCisJCSAgICAgc2l6ZV90IGlkZW50aXR5X2xlbiwgaW50IHBoYXNlMikKK3sKKwljb25zdCBzdHJ1Y3QgaG9zdGFwZF9ic3NfY29uZmlnICpjb25mID0gaGFwZC0+Y29uZjsKKwlzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciAqdXNlciA9IGNvbmYtPmVhcF91c2VyOworCisjaWZkZWYgQ09ORklHX1dQUworCWlmIChjb25mLT53cHNfc3RhdGUgJiYgaWRlbnRpdHlfbGVuID09IFdTQ19JRF9FTlJPTExFRV9MRU4gJiYKKwkgICAgb3NfbWVtY21wKGlkZW50aXR5LCBXU0NfSURfRU5ST0xMRUUsIFdTQ19JRF9FTlJPTExFRV9MRU4pID09IDApIHsKKwkJc3RhdGljIHN0cnVjdCBob3N0YXBkX2VhcF91c2VyIHdzY19lbnJvbGxlZTsKKwkJb3NfbWVtc2V0KCZ3c2NfZW5yb2xsZWUsIDAsIHNpemVvZih3c2NfZW5yb2xsZWUpKTsKKwkJd3NjX2Vucm9sbGVlLm1ldGhvZHNbMF0ubWV0aG9kID0gZWFwX3NlcnZlcl9nZXRfdHlwZSgKKwkJCSJXU0MiLCAmd3NjX2Vucm9sbGVlLm1ldGhvZHNbMF0udmVuZG9yKTsKKwkJcmV0dXJuICZ3c2NfZW5yb2xsZWU7CisJfQorCisJaWYgKGNvbmYtPndwc19zdGF0ZSAmJiBpZGVudGl0eV9sZW4gPT0gV1NDX0lEX1JFR0lTVFJBUl9MRU4gJiYKKwkgICAgb3NfbWVtY21wKGlkZW50aXR5LCBXU0NfSURfUkVHSVNUUkFSLCBXU0NfSURfUkVHSVNUUkFSX0xFTikgPT0gMCkgeworCQlzdGF0aWMgc3RydWN0IGhvc3RhcGRfZWFwX3VzZXIgd3NjX3JlZ2lzdHJhcjsKKwkJb3NfbWVtc2V0KCZ3c2NfcmVnaXN0cmFyLCAwLCBzaXplb2Yod3NjX3JlZ2lzdHJhcikpOworCQl3c2NfcmVnaXN0cmFyLm1ldGhvZHNbMF0ubWV0aG9kID0gZWFwX3NlcnZlcl9nZXRfdHlwZSgKKwkJCSJXU0MiLCAmd3NjX3JlZ2lzdHJhci5tZXRob2RzWzBdLnZlbmRvcik7CisJCXdzY19yZWdpc3RyYXIucGFzc3dvcmQgPSAodTggKikgY29uZi0+YXBfcGluOworCQl3c2NfcmVnaXN0cmFyLnBhc3N3b3JkX2xlbiA9IGNvbmYtPmFwX3BpbiA/CisJCQlvc19zdHJsZW4oY29uZi0+YXBfcGluKSA6IDA7CisJCXJldHVybiAmd3NjX3JlZ2lzdHJhcjsKKwl9CisjZW5kaWYgLyogQ09ORklHX1dQUyAqLworCisJd2hpbGUgKHVzZXIpIHsKKwkJaWYgKCFwaGFzZTIgJiYgdXNlci0+aWRlbnRpdHkgPT0gTlVMTCkgeworCQkJLyogV2lsZGNhcmQgbWF0Y2ggKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHVzZXItPnBoYXNlMiA9PSAhIXBoYXNlMiAmJiB1c2VyLT53aWxkY2FyZF9wcmVmaXggJiYKKwkJICAgIGlkZW50aXR5X2xlbiA+PSB1c2VyLT5pZGVudGl0eV9sZW4gJiYKKwkJICAgIG9zX21lbWNtcCh1c2VyLT5pZGVudGl0eSwgaWRlbnRpdHksIHVzZXItPmlkZW50aXR5X2xlbikgPT0KKwkJICAgIDApIHsKKwkJCS8qIFdpbGRjYXJkIHByZWZpeCBtYXRjaCAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodXNlci0+cGhhc2UyID09ICEhcGhhc2UyICYmCisJCSAgICB1c2VyLT5pZGVudGl0eV9sZW4gPT0gaWRlbnRpdHlfbGVuICYmCisJCSAgICBvc19tZW1jbXAodXNlci0+aWRlbnRpdHksIGlkZW50aXR5LCBpZGVudGl0eV9sZW4pID09IDApCisJCQlicmVhazsKKwkJdXNlciA9IHVzZXItPm5leHQ7CisJfQorCisjaWZkZWYgQ09ORklHX1NRTElURQorCWlmICh1c2VyID09IE5VTEwgJiYgY29uZi0+ZWFwX3VzZXJfc3FsaXRlKSB7CisJCXJldHVybiBlYXBfdXNlcl9zcWxpdGVfZ2V0KGhhcGQsIGlkZW50aXR5LCBpZGVudGl0eV9sZW4sCisJCQkJCSAgIHBoYXNlMik7CisJfQorI2VuZGlmIC8qIENPTkZJR19TUUxJVEUgKi8KKworCXJldHVybiB1c2VyOworfQpkaWZmIC0tZ2l0IGEvc3JjL2FwL2dhc19zZXJ2LmMgYi9zcmMvYXAvZ2FzX3NlcnYuYwppbmRleCA4NTFjMTgzLi5iMzU3NGJhIDEwMDY0NAotLS0gYS9zcmMvYXAvZ2FzX3NlcnYuYworKysgYi9zcmMvYXAvZ2FzX3NlcnYuYwpAQCAtMTE1OCw4ICsxMTU4LDggQEAKIAogaW50IGdhc19zZXJ2X2luaXQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCkKIHsKLQloYXBkLT5wdWJsaWNfYWN0aW9uX2NiID0gZ2FzX3NlcnZfcnhfcHVibGljX2FjdGlvbjsKLQloYXBkLT5wdWJsaWNfYWN0aW9uX2NiX2N0eCA9IGhhcGQ7CisJaGFwZC0+cHVibGljX2FjdGlvbl9jYjIgPSBnYXNfc2Vydl9yeF9wdWJsaWNfYWN0aW9uOworCWhhcGQtPnB1YmxpY19hY3Rpb25fY2IyX2N0eCA9IGhhcGQ7CiAJaGFwZC0+Z2FzX2ZyYWdfbGltaXQgPSAxNDAwOwogCWlmIChoYXBkLT5jb25mLT5nYXNfZnJhZ19saW1pdCA+IDApCiAJCWhhcGQtPmdhc19mcmFnX2xpbWl0ID0gaGFwZC0+Y29uZi0+Z2FzX2ZyYWdfbGltaXQ7CmRpZmYgLS1naXQgYS9zcmMvYXAvaG9zdGFwZC5jIGIvc3JjL2FwL2hvc3RhcGQuYwppbmRleCAzNDI5MjU4Li45MmZkYTU2IDEwMDY0NAotLS0gYS9zcmMvYXAvaG9zdGFwZC5jCisrKyBiL3NyYy9hcC9ob3N0YXBkLmMKQEAgLTI3Myw2ICsyNzMsMTEgQEAKICNpZmRlZiBDT05GSUdfSU5URVJXT1JLSU5HCiAJZ2FzX3NlcnZfZGVpbml0KGhhcGQpOwogI2VuZGlmIC8qIENPTkZJR19JTlRFUldPUktJTkcgKi8KKworI2lmZGVmIENPTkZJR19TUUxJVEUKKwlvc19mcmVlKGhhcGQtPnRtcF9lYXBfdXNlci5pZGVudGl0eSk7CisJb3NfZnJlZShoYXBkLT50bXBfZWFwX3VzZXIucGFzc3dvcmQpOworI2VuZGlmIC8qIENPTkZJR19TUUxJVEUgKi8KIH0KIAogCkBAIC04ODksNyArODk0LDExIEBACiAJCWlmIChob3N0YXBkX3NldF9mcmVxKGhhcGQsIGhhcGQtPmljb25mLT5od19tb2RlLCBpZmFjZS0+ZnJlcSwKIAkJCQkgICAgIGhhcGQtPmljb25mLT5jaGFubmVsLAogCQkJCSAgICAgaGFwZC0+aWNvbmYtPmllZWU4MDIxMW4sCi0JCQkJICAgICBoYXBkLT5pY29uZi0+c2Vjb25kYXJ5X2NoYW5uZWwpKSB7CisJCQkJICAgICBoYXBkLT5pY29uZi0+aWVlZTgwMjExYWMsCisJCQkJICAgICBoYXBkLT5pY29uZi0+c2Vjb25kYXJ5X2NoYW5uZWwsCisJCQkJICAgICBoYXBkLT5pY29uZi0+dmh0X29wZXJfY2h3aWR0aCwKKwkJCQkgICAgIGhhcGQtPmljb25mLT52aHRfb3Blcl9jZW50cl9mcmVxX3NlZzBfaWR4LAorCQkJCSAgICAgaGFwZC0+aWNvbmYtPnZodF9vcGVyX2NlbnRyX2ZyZXFfc2VnMV9pZHgpKSB7CiAJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkNvdWxkIG5vdCBzZXQgY2hhbm5lbCBmb3IgIgogCQkJCSAgICJrZXJuZWwgZHJpdmVyIik7CiAJCQlyZXR1cm4gLTE7CkBAIC0xMTEzLDEyICsxMTIyLDEzIEBACiBpbnQgaG9zdGFwZF9kaXNhYmxlX2lmYWNlKHN0cnVjdCBob3N0YXBkX2lmYWNlICpoYXBkX2lmYWNlKQogewogCXNpemVfdCBqOwotCXN0cnVjdCBob3N0YXBkX2Jzc19jb25maWcgKmJzcyA9IGhhcGRfaWZhY2UtPmJzc1swXS0+Y29uZjsKKwlzdHJ1Y3QgaG9zdGFwZF9ic3NfY29uZmlnICpic3M7CiAJY29uc3Qgc3RydWN0IHdwYV9kcml2ZXJfb3BzICpkcml2ZXI7CiAJdm9pZCAqZHJ2X3ByaXY7CiAKIAlpZiAoaGFwZF9pZmFjZSA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CisJYnNzID0gaGFwZF9pZmFjZS0+YnNzWzBdLT5jb25mOwogCWRyaXZlciA9IGhhcGRfaWZhY2UtPmJzc1swXS0+ZHJpdmVyOwogCWRydl9wcml2ID0gaGFwZF9pZmFjZS0+YnNzWzBdLT5kcnZfcHJpdjsKIApAQCAtMTM3Myw4ICsxMzgzLDEwIEBACiAJLyogU3RhcnQgYWNjb3VudGluZyBoZXJlLCBpZiBJRUVFIDgwMi4xWCBhbmQgV1BBIGFyZSBub3QgdXNlZC4KIAkgKiBJRUVFIDgwMi4xWC9XUEEgY29kZSB3aWxsIHN0YXJ0IGFjY291bnRpbmcgYWZ0ZXIgdGhlIHN0YXRpb24gaGFzCiAJICogYmVlbiBhdXRob3JpemVkLiAqLwotCWlmICghaGFwZC0+Y29uZi0+aWVlZTgwMl8xeCAmJiAhaGFwZC0+Y29uZi0+d3BhKQorCWlmICghaGFwZC0+Y29uZi0+aWVlZTgwMl8xeCAmJiAhaGFwZC0+Y29uZi0+d3BhKSB7CisJCW9zX2dldF90aW1lKCZzdGEtPmNvbm5lY3RlZF90aW1lKTsKIAkJYWNjb3VudGluZ19zdGFfc3RhcnQoaGFwZCwgc3RhKTsKKwl9CiAKIAkvKiBTdGFydCBJRUVFIDgwMi4xWCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGZvciBuZXcgc3RhdGlvbnMgKi8KIAlpZWVlODAyXzF4X25ld19zdGF0aW9uKGhhcGQsIHN0YSk7CmRpZmYgLS1naXQgYS9zcmMvYXAvaG9zdGFwZC5oIGIvc3JjL2FwL2hvc3RhcGQuaAppbmRleCA3MWY0NzZjLi44YWI0ZjNlIDEwMDY0NAotLS0gYS9zcmMvYXAvaG9zdGFwZC5oCisrKyBiL3NyYy9hcC9ob3N0YXBkLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNkZWZpbmUgSE9TVEFQRF9ICiAKICNpbmNsdWRlICJjb21tb24vZGVmcy5oIgorI2luY2x1ZGUgImFwX2NvbmZpZy5oIgogCiBzdHJ1Y3Qgd3BhX2RyaXZlcl9vcHM7CiBzdHJ1Y3Qgd3BhX2N0cmxfZHN0OwpAQCAtMTUwLDYgKzE1MSw5IEBACiAJdm9pZCAoKnB1YmxpY19hY3Rpb25fY2IpKHZvaWQgKmN0eCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwKIAkJCQkgaW50IGZyZXEpOwogCXZvaWQgKnB1YmxpY19hY3Rpb25fY2JfY3R4OworCXZvaWQgKCpwdWJsaWNfYWN0aW9uX2NiMikodm9pZCAqY3R4LCBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLAorCQkJCSAgaW50IGZyZXEpOworCXZvaWQgKnB1YmxpY19hY3Rpb25fY2IyX2N0eDsKIAogCWludCAoKnZlbmRvcl9hY3Rpb25fY2IpKHZvaWQgKmN0eCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwKIAkJCQlpbnQgZnJlcSk7CkBAIC0xODcsNiArMTkxLDE2IEBACiAjaWZkZWYgQ09ORklHX0lOVEVSV09SS0lORwogCXNpemVfdCBnYXNfZnJhZ19saW1pdDsKICNlbmRpZiAvKiBDT05GSUdfSU5URVJXT1JLSU5HICovCisKKyNpZmRlZiBDT05GSUdfU1FMSVRFCisJc3RydWN0IGhvc3RhcGRfZWFwX3VzZXIgdG1wX2VhcF91c2VyOworI2VuZGlmIC8qIENPTkZJR19TUUxJVEUgKi8KKworI2lmZGVmIENPTkZJR19TQUUKKwkvKiogS2V5IHVzZWQgZm9yIGdlbmVyYXRpbmcgU0FFIGFudGktY2xvZ2dpbmcgdG9rZW5zICovCisJdTggc2FlX3Rva2VuX2tleVs4XTsKKwlvc190aW1lX3QgbGFzdF9zYWVfdG9rZW5fa2V5X3VwZGF0ZTsKKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiB9OwogCiAKQEAgLTI5MSwxMCArMzA1LDE2IEBACiAJCQljb25zdCB1OCAqaWUsIHNpemVfdCBpZWxlbiwgaW50IHJlYXNzb2MpOwogdm9pZCBob3N0YXBkX25vdGlmX2Rpc2Fzc29jKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyKTsKIHZvaWQgaG9zdGFwZF9ldmVudF9zdGFfbG93X2FjayhzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqYWRkcik7Cit2b2lkIGhvc3RhcGRfZXZlbnRfY29ubmVjdF9mYWlsZWRfcmVhc29uKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCisJCQkJCSBjb25zdCB1OCAqYWRkciwgaW50IHJlYXNvbl9jb2RlKTsKIGludCBob3N0YXBkX3Byb2JlX3JlcV9yeChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqc2EsIGNvbnN0IHU4ICpkYSwKIAkJCSBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwKIAkJCSBpbnQgc3NpX3NpZ25hbCk7CiB2b2lkIGhvc3RhcGRfZXZlbnRfY2hfc3dpdGNoKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGludCBmcmVxLCBpbnQgaHQsCiAJCQkgICAgIGludCBvZmZzZXQpOwogCitjb25zdCBzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciAqCitob3N0YXBkX2dldF9lYXBfdXNlcihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqaWRlbnRpdHksCisJCSAgICAgc2l6ZV90IGlkZW50aXR5X2xlbiwgaW50IHBoYXNlMik7CisKICNlbmRpZiAvKiBIT1NUQVBEX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9hcC9od19mZWF0dXJlcy5jIGIvc3JjL2FwL2h3X2ZlYXR1cmVzLmMKaW5kZXggOTdlMTIzOC4uMzcxMTJiZCAxMDA2NDQKLS0tIGEvc3JjL2FwL2h3X2ZlYXR1cmVzLmMKKysrIGIvc3JjL2FwL2h3X2ZlYXR1cmVzLmMKQEAgLTEyMiw2ICsxMjIsOCBAQAogCWNhc2UgSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUc6CiAJCWJhc2ljX3JhdGVzID0gYmFzaWNfcmF0ZXNfZzsKIAkJYnJlYWs7CisJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExQUQ6CisJCXJldHVybiAwOyAvKiBObyBiYXNpYyByYXRlcyBmb3IgMTFhZCAqLwogCWRlZmF1bHQ6CiAJCXJldHVybiAtMTsKIAl9CkBAIC00NDEsNyArNDQzLDYgQEAKIAkJCSAgIGlmYWNlLT5jb25mLT5jaGFubmVsICsKIAkJCSAgIGlmYWNlLT5jb25mLT5zZWNvbmRhcnlfY2hhbm5lbCAqIDQpOwogCQlpZmFjZS0+Y29uZi0+c2Vjb25kYXJ5X2NoYW5uZWwgPSAwOwotCQlpZmFjZS0+Y29uZi0+aHRfY2FwYWIgJj0gfkhUX0NBUF9JTkZPX1NVUFBfQ0hBTk5FTF9XSURUSF9TRVQ7CiAJfQogCiAJcmVzID0gaWVlZTgwMjExbl9hbGxvd2VkX2h0NDBfY2hhbm5lbF9wYWlyKGlmYWNlKTsKQEAgLTc1Niw2ICs3NTcsOCBAQAogCQlyZXR1cm4gIklFRUUgODAyLjExYiI7CiAJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExRzoKIAkJcmV0dXJuICJJRUVFIDgwMi4xMWciOworCWNhc2UgSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUFEOgorCQlyZXR1cm4gIklFRUUgODAyLjExYWQiOwogCWRlZmF1bHQ6CiAJCXJldHVybiAiVU5LTk9XTiI7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL2FwL2llZWU4MDJfMTEuYyBiL3NyYy9hcC9pZWVlODAyXzExLmMKaW5kZXggY2UyMGU1Zi4uOGJhYTE1ZSAxMDA2NDQKLS0tIGEvc3JjL2FwL2llZWU4MDJfMTEuYworKysgYi9zcmMvYXAvaWVlZTgwMl8xMS5jCkBAIC0xMywxMCArMTMsMTMgQEAKICNpbmNsdWRlICJ1dGlscy9jb21tb24uaCIKICNpbmNsdWRlICJ1dGlscy9lbG9vcC5oIgogI2luY2x1ZGUgImNyeXB0by9jcnlwdG8uaCIKKyNpbmNsdWRlICJjcnlwdG8vc2hhMjU2LmgiCisjaW5jbHVkZSAiY3J5cHRvL3JhbmRvbS5oIgogI2luY2x1ZGUgImRyaXZlcnMvZHJpdmVyLmgiCiAjaW5jbHVkZSAiY29tbW9uL2llZWU4MDJfMTFfZGVmcy5oIgogI2luY2x1ZGUgImNvbW1vbi9pZWVlODAyXzExX2NvbW1vbi5oIgogI2luY2x1ZGUgImNvbW1vbi93cGFfY3RybC5oIgorI2luY2x1ZGUgImNvbW1vbi9zYWUuaCIKICNpbmNsdWRlICJyYWRpdXMvcmFkaXVzLmgiCiAjaW5jbHVkZSAicmFkaXVzL3JhZGl1c19jbGllbnQuaCIKICNpbmNsdWRlICJwMnAvcDJwLmgiCkBAIC0zNCw2ICszNyw3IEBACiAjaW5jbHVkZSAiYXBfbWxtZS5oIgogI2luY2x1ZGUgInAycF9ob3N0YXBkLmgiCiAjaW5jbHVkZSAiYXBfZHJ2X29wcy5oIgorI2luY2x1ZGUgIndubV9hcC5oIgogI2luY2x1ZGUgImllZWU4MDJfMTEuaCIKIAogCkBAIC00OSw2ICs1Myw4IEBACiAJbnVtID0gaGFwZC0+aWZhY2UtPm51bV9yYXRlczsKIAlpZiAoaGFwZC0+aWNvbmYtPmllZWU4MDIxMW4gJiYgaGFwZC0+aWNvbmYtPnJlcXVpcmVfaHQpCiAJCW51bSsrOworCWlmIChoYXBkLT5pY29uZi0+aWVlZTgwMjExYWMgJiYgaGFwZC0+aWNvbmYtPnJlcXVpcmVfdmh0KQorCQludW0rKzsKIAlpZiAobnVtID4gOCkgewogCQkvKiByZXN0IG9mIHRoZSByYXRlcyBhcmUgZW5jb2RlZCBpbiBFeHRlbmRlZCBzdXBwb3J0ZWQKIAkJICogcmF0ZXMgZWxlbWVudCAqLwpAQCAtNjYsOSArNzIsMTUgQEAKIAkJcG9zKys7CiAJfQogCi0JaWYgKGhhcGQtPmljb25mLT5pZWVlODAyMTFuICYmIGhhcGQtPmljb25mLT5yZXF1aXJlX2h0ICYmCi0JICAgIGhhcGQtPmlmYWNlLT5udW1fcmF0ZXMgPCA4KQorCWlmIChoYXBkLT5pY29uZi0+aWVlZTgwMjExbiAmJiBoYXBkLT5pY29uZi0+cmVxdWlyZV9odCAmJiBjb3VudCA8IDgpIHsKKwkJY291bnQrKzsKIAkJKnBvcysrID0gMHg4MCB8IEJTU19NRU1CRVJTSElQX1NFTEVDVE9SX0hUX1BIWTsKKwl9CisKKwlpZiAoaGFwZC0+aWNvbmYtPmllZWU4MDIxMWFjICYmIGhhcGQtPmljb25mLT5yZXF1aXJlX3ZodCAmJiBjb3VudCA8IDgpIHsKKwkJY291bnQrKzsKKwkJKnBvcysrID0gMHg4MCB8IEJTU19NRU1CRVJTSElQX1NFTEVDVE9SX1ZIVF9QSFk7CisJfQogCiAJcmV0dXJuIHBvczsKIH0KQEAgLTg1LDYgKzk3LDggQEAKIAludW0gPSBoYXBkLT5pZmFjZS0+bnVtX3JhdGVzOwogCWlmIChoYXBkLT5pY29uZi0+aWVlZTgwMjExbiAmJiBoYXBkLT5pY29uZi0+cmVxdWlyZV9odCkKIAkJbnVtKys7CisJaWYgKGhhcGQtPmljb25mLT5pZWVlODAyMTFhYyAmJiBoYXBkLT5pY29uZi0+cmVxdWlyZV92aHQpCisJCW51bSsrOwogCWlmIChudW0gPD0gOCkKIAkJcmV0dXJuIGVpZDsKIAludW0gLT0gODsKQEAgLTEwMyw5ICsxMTcsMTcgQEAKIAkJcG9zKys7CiAJfQogCi0JaWYgKGhhcGQtPmljb25mLT5pZWVlODAyMTFuICYmIGhhcGQtPmljb25mLT5yZXF1aXJlX2h0ICYmCi0JICAgIGhhcGQtPmlmYWNlLT5udW1fcmF0ZXMgPj0gOCkKLQkJKnBvcysrID0gMHg4MCB8IEJTU19NRU1CRVJTSElQX1NFTEVDVE9SX0hUX1BIWTsKKwlpZiAoaGFwZC0+aWNvbmYtPmllZWU4MDIxMW4gJiYgaGFwZC0+aWNvbmYtPnJlcXVpcmVfaHQpIHsKKwkJY291bnQrKzsKKwkJaWYgKGNvdW50ID4gOCkKKwkJCSpwb3MrKyA9IDB4ODAgfCBCU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9IVF9QSFk7CisJfQorCisJaWYgKGhhcGQtPmljb25mLT5pZWVlODAyMTFhYyAmJiBoYXBkLT5pY29uZi0+cmVxdWlyZV92aHQpIHsKKwkJY291bnQrKzsKKwkJaWYgKGNvdW50ID4gOCkKKwkJCSpwb3MrKyA9IDB4ODAgfCBCU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9WSFRfUEhZOworCX0KIAogCXJldHVybiBwb3M7CiB9CkBAIC0yOTYsNiArMzE4LDIyMiBAQAogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFSICovCiAKIAorI2lmZGVmIENPTkZJR19TQUUKKworc3RhdGljIHN0cnVjdCB3cGFidWYgKiBhdXRoX3Byb2Nlc3Nfc2FlX2NvbW1pdChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJCQkgICAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCit7CisJc3RydWN0IHdwYWJ1ZiAqYnVmOworCisJaWYgKGhhcGQtPmNvbmYtPnNzaWQud3BhX3Bhc3NwaHJhc2UgPT0gTlVMTCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogTm8gcGFzc3dvcmQgYXZhaWxhYmxlIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChzYWVfcHJlcGFyZV9jb21taXQoaGFwZC0+b3duX2FkZHIsIHN0YS0+YWRkciwKKwkJCSAgICAgICAodTggKikgaGFwZC0+Y29uZi0+c3NpZC53cGFfcGFzc3BocmFzZSwKKwkJCSAgICAgICBvc19zdHJsZW4oaGFwZC0+Y29uZi0+c3NpZC53cGFfcGFzc3BocmFzZSksCisJCQkgICAgICAgc3RhLT5zYWUpIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogQ291bGQgbm90IHBpY2sgUFdFIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChzYWVfcHJvY2Vzc19jb21taXQoc3RhLT5zYWUpIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogRmFpbGVkIHRvIHByb2Nlc3MgcGVlciBjb21taXQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYnVmID0gd3BhYnVmX2FsbG9jKFNBRV9DT01NSVRfTUFYX0xFTik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlzYWVfd3JpdGVfY29tbWl0KHN0YS0+c2FlLCBidWYsIE5VTEwpOworCisJcmV0dXJuIGJ1ZjsKK30KKworCitzdGF0aWMgc3RydWN0IHdwYWJ1ZiAqIGF1dGhfYnVpbGRfc2FlX2NvbmZpcm0oc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKKwkJCQkJICAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCit7CisJc3RydWN0IHdwYWJ1ZiAqYnVmOworCisJYnVmID0gd3BhYnVmX2FsbG9jKFNBRV9DT05GSVJNX01BWF9MRU4pOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzYWVfd3JpdGVfY29uZmlybShzdGEtPnNhZSwgYnVmKTsKKworCXJldHVybiBidWY7Cit9CisKKworc3RhdGljIGludCB1c2Vfc2FlX2FudGlfY2xvZ2dpbmcoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCkKK3sKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwl1bnNpZ25lZCBpbnQgb3BlbiA9IDA7CisKKwlpZiAoaGFwZC0+Y29uZi0+c2FlX2FudGlfY2xvZ2dpbmdfdGhyZXNob2xkID09IDApCisJCXJldHVybiAxOworCisJZm9yIChzdGEgPSBoYXBkLT5zdGFfbGlzdDsgc3RhOyBzdGEgPSBzdGEtPm5leHQpIHsKKwkJaWYgKCFzdGEtPnNhZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RhLT5zYWUtPnN0YXRlICE9IFNBRV9DT01NSVRURUQgJiYKKwkJICAgIHN0YS0+c2FlLT5zdGF0ZSAhPSBTQUVfQ09ORklSTUVEKQorCQkJY29udGludWU7CisJCW9wZW4rKzsKKwkJaWYgKG9wZW4gPj0gaGFwZC0+Y29uZi0+c2FlX2FudGlfY2xvZ2dpbmdfdGhyZXNob2xkKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjaGVja19zYWVfdG9rZW4oc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgY29uc3QgdTggKmFkZHIsCisJCQkgICBjb25zdCB1OCAqdG9rZW4sIHNpemVfdCB0b2tlbl9sZW4pCit7CisJdTggbWFjW1NIQTI1Nl9NQUNfTEVOXTsKKworCWlmICh0b2tlbl9sZW4gIT0gU0hBMjU2X01BQ19MRU4pCisJCXJldHVybiAtMTsKKwlpZiAoaG1hY19zaGEyNTYoaGFwZC0+c2FlX3Rva2VuX2tleSwgc2l6ZW9mKGhhcGQtPnNhZV90b2tlbl9rZXkpLAorCQkJYWRkciwgRVRIX0FMRU4sIG1hYykgPCAwIHx8CisJICAgIG9zX21lbWNtcCh0b2tlbiwgbWFjLCBTSEEyNTZfTUFDX0xFTikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCB3cGFidWYgKiBhdXRoX2J1aWxkX3Rva2VuX3JlcShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJCQkgICAgY29uc3QgdTggKmFkZHIpCit7CisJc3RydWN0IHdwYWJ1ZiAqYnVmOworCXU4ICp0b2tlbjsKKwlzdHJ1Y3Qgb3NfdGltZSB0OworCisJb3NfZ2V0X3RpbWUoJnQpOworCWlmIChoYXBkLT5sYXN0X3NhZV90b2tlbl9rZXlfdXBkYXRlID09IDAgfHwKKwkgICAgdC5zZWMgPiBoYXBkLT5sYXN0X3NhZV90b2tlbl9rZXlfdXBkYXRlICsgNjApIHsKKwkJaWYgKHJhbmRvbV9nZXRfYnl0ZXMoaGFwZC0+c2FlX3Rva2VuX2tleSwKKwkJCQkgICAgIHNpemVvZihoYXBkLT5zYWVfdG9rZW5fa2V5KSkgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIlNBRTogVXBkYXRlZCB0b2tlbiBrZXkiLAorCQkJICAgIGhhcGQtPnNhZV90b2tlbl9rZXksIHNpemVvZihoYXBkLT5zYWVfdG9rZW5fa2V5KSk7CisJCWhhcGQtPmxhc3Rfc2FlX3Rva2VuX2tleV91cGRhdGUgPSB0LnNlYzsKKwl9CisKKwlidWYgPSB3cGFidWZfYWxsb2MoU0hBMjU2X01BQ19MRU4pOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0b2tlbiA9IHdwYWJ1Zl9wdXQoYnVmLCBTSEEyNTZfTUFDX0xFTik7CisJaG1hY19zaGEyNTYoaGFwZC0+c2FlX3Rva2VuX2tleSwgc2l6ZW9mKGhhcGQtPnNhZV90b2tlbl9rZXkpLAorCQkgICAgYWRkciwgRVRIX0FMRU4sIHRva2VuKTsKKworCXJldHVybiBidWY7Cit9CisKKworc3RhdGljIHZvaWQgaGFuZGxlX2F1dGhfc2FlKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgc2l6ZV90IGxlbiwKKwkJCSAgICB1OCBhdXRoX3RyYW5zYWN0aW9uKQoreworCXUxNiByZXNwID0gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3Qgd3BhYnVmICpkYXRhID0gTlVMTDsKKworCWlmICghc3RhLT5zYWUpIHsKKwkJaWYgKGF1dGhfdHJhbnNhY3Rpb24gIT0gMSkKKwkJCXJldHVybjsKKwkJc3RhLT5zYWUgPSBvc196YWxsb2Moc2l6ZW9mKCpzdGEtPnNhZSkpOworCQlpZiAoc3RhLT5zYWUgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJc3RhLT5zYWUtPnN0YXRlID0gU0FFX05PVEhJTkc7CisJfQorCisJaWYgKGF1dGhfdHJhbnNhY3Rpb24gPT0gMSkgeworCQljb25zdCB1OCAqdG9rZW4gPSBOVUxMOworCQlzaXplX3QgdG9rZW5fbGVuID0gMDsKKwkJaG9zdGFwZF9sb2dnZXIoaGFwZCwgc3RhLT5hZGRyLCBIT1NUQVBEX01PRFVMRV9JRUVFODAyMTEsCisJCQkgICAgICAgSE9TVEFQRF9MRVZFTF9ERUJVRywKKwkJCSAgICAgICAic3RhcnQgU0FFIGF1dGhlbnRpY2F0aW9uIChSWCBjb21taXQpIik7CisJCXJlc3AgPSBzYWVfcGFyc2VfY29tbWl0KHN0YS0+c2FlLCBtZ210LT51LmF1dGgudmFyaWFibGUsCisJCQkJCSgoY29uc3QgdTggKikgbWdtdCkgKyBsZW4gLQorCQkJCQltZ210LT51LmF1dGgudmFyaWFibGUsICZ0b2tlbiwKKwkJCQkJJnRva2VuX2xlbiwgaGFwZC0+Y29uZi0+c2FlX2dyb3Vwcyk7CisJCWlmICh0b2tlbiAmJiBjaGVja19zYWVfdG9rZW4oaGFwZCwgc3RhLT5hZGRyLCB0b2tlbiwgdG9rZW5fbGVuKQorCQkgICAgPCAwKSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogRHJvcCBjb21taXQgbWVzc2FnZSB3aXRoICIKKwkJCQkgICAiaW5jb3JyZWN0IHRva2VuIGZyb20gIiBNQUNTVFIsCisJCQkJICAgTUFDMlNUUihzdGEtPmFkZHIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChyZXNwID09IFdMQU5fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWlmICghdG9rZW4gJiYgdXNlX3NhZV9hbnRpX2Nsb2dnaW5nKGhhcGQpKSB7CisJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IFJlcXVlc3QgYW50aS0iCisJCQkJCSAgICJjbG9nZ2luZyB0b2tlbiBmcm9tICIgTUFDU1RSLAorCQkJCQkgICBNQUMyU1RSKHN0YS0+YWRkcikpOworCQkJCWRhdGEgPSBhdXRoX2J1aWxkX3Rva2VuX3JlcShoYXBkLCBzdGEtPmFkZHIpOworCQkJCXJlc3AgPSBXTEFOX1NUQVRVU19BTlRJX0NMT0dHSU5HX1RPS0VOX1JFUTsKKwkJCX0gZWxzZSB7CisJCQkJZGF0YSA9IGF1dGhfcHJvY2Vzc19zYWVfY29tbWl0KGhhcGQsIHN0YSk7CisJCQkJaWYgKGRhdGEgPT0gTlVMTCkKKwkJCQkJcmVzcCA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJCQkJZWxzZQorCQkJCQlzdGEtPnNhZS0+c3RhdGUgPSBTQUVfQ09NTUlUVEVEOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChhdXRoX3RyYW5zYWN0aW9uID09IDIpIHsKKwkJaWYgKHN0YS0+c2FlLT5zdGF0ZSAhPSBTQUVfQ09NTUlUVEVEKSB7CisJCQlob3N0YXBkX2xvZ2dlcihoYXBkLCBzdGEtPmFkZHIsCisJCQkJICAgICAgIEhPU1RBUERfTU9EVUxFX0lFRUU4MDIxMSwKKwkJCQkgICAgICAgSE9TVEFQRF9MRVZFTF9ERUJVRywKKwkJCQkgICAgICAgIlNBRSBjb25maXJtIGJlZm9yZSBjb21taXQiKTsKKwkJCXJlc3AgPSBXTEFOX1NUQVRVU19VTktOT1dOX0FVVEhfVFJBTlNBQ1RJT047CisJCX0KKwkJaG9zdGFwZF9sb2dnZXIoaGFwZCwgc3RhLT5hZGRyLCBIT1NUQVBEX01PRFVMRV9JRUVFODAyMTEsCisJCQkgICAgICAgSE9TVEFQRF9MRVZFTF9ERUJVRywKKwkJCSAgICAgICAiU0FFIGF1dGhlbnRpY2F0aW9uIChSWCBjb25maXJtKSIpOworCQlpZiAoc2FlX2NoZWNrX2NvbmZpcm0oc3RhLT5zYWUsIG1nbXQtPnUuYXV0aC52YXJpYWJsZSwKKwkJCQkgICAgICAgKCh1OCAqKSBtZ210KSArIGxlbiAtCisJCQkJICAgICAgIG1nbXQtPnUuYXV0aC52YXJpYWJsZSkgPCAwKSB7CisJCQlyZXNwID0gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwkJfSBlbHNlIHsKKwkJCXJlc3AgPSBXTEFOX1NUQVRVU19TVUNDRVNTOworCQkJc3RhLT5mbGFncyB8PSBXTEFOX1NUQV9BVVRIOworCQkJd3BhX2F1dGhfc21fZXZlbnQoc3RhLT53cGFfc20sIFdQQV9BVVRIKTsKKwkJCXN0YS0+YXV0aF9hbGcgPSBXTEFOX0FVVEhfU0FFOworCQkJbWxtZV9hdXRoZW50aWNhdGVfaW5kaWNhdGlvbihoYXBkLCBzdGEpOworCisJCQlkYXRhID0gYXV0aF9idWlsZF9zYWVfY29uZmlybShoYXBkLCBzdGEpOworCQkJaWYgKGRhdGEgPT0gTlVMTCkKKwkJCQlyZXNwID0gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwkJCWVsc2UgeworCQkJCXN0YS0+c2FlLT5zdGF0ZSA9IFNBRV9BQ0NFUFRFRDsKKwkJCQlzYWVfY2xlYXJfdGVtcF9kYXRhKHN0YS0+c2FlKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWhvc3RhcGRfbG9nZ2VyKGhhcGQsIHN0YS0+YWRkciwgSE9TVEFQRF9NT0RVTEVfSUVFRTgwMjExLAorCQkJICAgICAgIEhPU1RBUERfTEVWRUxfREVCVUcsCisJCQkgICAgICAgInVuZXhwZWN0ZWQgU0FFIGF1dGhlbnRpY2F0aW9uIHRyYW5zYWN0aW9uICV1IiwKKwkJCSAgICAgICBhdXRoX3RyYW5zYWN0aW9uKTsKKwkJcmVzcCA9IFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTjsKKwl9CisKKwlzdGEtPmF1dGhfYWxnID0gV0xBTl9BVVRIX1NBRTsKKworCXNlbmRfYXV0aF9yZXBseShoYXBkLCBtZ210LT5zYSwgbWdtdC0+YnNzaWQsIFdMQU5fQVVUSF9TQUUsCisJCQlhdXRoX3RyYW5zYWN0aW9uLCByZXNwLAorCQkJZGF0YSA/IHdwYWJ1Zl9oZWFkKGRhdGEpIDogKHU4ICopICIiLAorCQkJZGF0YSA/IHdwYWJ1Zl9sZW4oZGF0YSkgOiAwKTsKKwl3cGFidWZfZnJlZShkYXRhKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCisKKwogc3RhdGljIHZvaWQgaGFuZGxlX2F1dGgoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKIAkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgc2l6ZV90IGxlbikKIHsKQEAgLTMwNyw4ICs1NDUsNyBAQAogCWNvbnN0IHU4ICpjaGFsbGVuZ2UgPSBOVUxMOwogCXUzMiBzZXNzaW9uX3RpbWVvdXQsIGFjY3RfaW50ZXJpbV9pbnRlcnZhbDsKIAlpbnQgdmxhbl9pZCA9IDA7Ci0JdTggcHNrW1BNS19MRU5dOwotCWludCBoYXNfcHNrID0gMDsKKwlzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCAqcHNrID0gTlVMTDsKIAl1OCByZXNwX2llc1syICsgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU5dOwogCXNpemVfdCByZXNwX2llc19sZW4gPSAwOwogCWNoYXIgKmlkZW50aXR5ID0gTlVMTDsKQEAgLTM0OCw2ICs1ODUsMTAgQEAKIAkgICAgICAoaGFwZC0+Y29uZi0+d3BhICYmIHdwYV9rZXlfbWdtdF9mdChoYXBkLT5jb25mLT53cGFfa2V5X21nbXQpICYmCiAJICAgICAgIGF1dGhfYWxnID09IFdMQU5fQVVUSF9GVCkgfHwKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLworI2lmZGVmIENPTkZJR19TQUUKKwkgICAgICAoaGFwZC0+Y29uZi0+d3BhICYmIHdwYV9rZXlfbWdtdF9zYWUoaGFwZC0+Y29uZi0+d3BhX2tleV9tZ210KSAmJgorCSAgICAgICBhdXRoX2FsZyA9PSBXTEFOX0FVVEhfU0FFKSB8fAorI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KIAkgICAgICAoKGhhcGQtPmNvbmYtPmF1dGhfYWxncyAmIFdQQV9BVVRIX0FMR19TSEFSRUQpICYmCiAJICAgICAgIGF1dGhfYWxnID09IFdMQU5fQVVUSF9TSEFSRURfS0VZKSkpIHsKIAkJcHJpbnRmKCJVbnN1cHBvcnRlZCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gKCVkKVxuIiwKQEAgLTM1Niw3ICs1OTcsNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKCEoYXV0aF90cmFuc2FjdGlvbiA9PSAxIHx8CisJaWYgKCEoYXV0aF90cmFuc2FjdGlvbiA9PSAxIHx8IGF1dGhfYWxnID09IFdMQU5fQVVUSF9TQUUgfHwKIAkgICAgICAoYXV0aF9hbGcgPT0gV0xBTl9BVVRIX1NIQVJFRF9LRVkgJiYgYXV0aF90cmFuc2FjdGlvbiA9PSAzKSkpIHsKIAkJcHJpbnRmKCJVbmtub3duIGF1dGhlbnRpY2F0aW9uIHRyYW5zYWN0aW9uIG51bWJlciAoJWQpXG4iLAogCQkgICAgICAgYXV0aF90cmFuc2FjdGlvbik7CkBAIC0zNzQsNyArNjE1LDcgQEAKIAlyZXMgPSBob3N0YXBkX2FsbG93ZWRfYWRkcmVzcyhoYXBkLCBtZ210LT5zYSwgKHU4ICopIG1nbXQsIGxlbiwKIAkJCQkgICAgICAmc2Vzc2lvbl90aW1lb3V0LAogCQkJCSAgICAgICZhY2N0X2ludGVyaW1faW50ZXJ2YWwsICZ2bGFuX2lkLAotCQkJCSAgICAgIHBzaywgJmhhc19wc2ssICZpZGVudGl0eSwgJnJhZGl1c19jdWkpOworCQkJCSAgICAgICZwc2ssICZpZGVudGl0eSwgJnJhZGl1c19jdWkpOwogCiAJaWYgKHJlcyA9PSBIT1NUQVBEX0FDTF9SRUpFQ1QpIHsKIAkJcHJpbnRmKCJTdGF0aW9uICIgTUFDU1RSICIgbm90IGFsbG93ZWQgdG8gYXV0aGVudGljYXRlLlxuIiwKQEAgLTQxMywxMyArNjU0LDExIEBACiAJCQkgICAgICAgSE9TVEFQRF9MRVZFTF9JTkZPLCAiVkxBTiBJRCAlZCIsIHN0YS0+dmxhbl9pZCk7CiAJfQogCi0JaWYgKGhhc19wc2sgJiYgaGFwZC0+Y29uZi0+d3BhX3Bza19yYWRpdXMgIT0gUFNLX1JBRElVU19JR05PUkVEKSB7Ci0JCW9zX2ZyZWUoc3RhLT5wc2spOwotCQlzdGEtPnBzayA9IG9zX21hbGxvYyhQTUtfTEVOKTsKLQkJaWYgKHN0YS0+cHNrKQotCQkJb3NfbWVtY3B5KHN0YS0+cHNrLCBwc2ssIFBNS19MRU4pOworCWhvc3RhcGRfZnJlZV9wc2tfbGlzdChzdGEtPnBzayk7CisJaWYgKGhhcGQtPmNvbmYtPndwYV9wc2tfcmFkaXVzICE9IFBTS19SQURJVVNfSUdOT1JFRCkgeworCQlzdGEtPnBzayA9IHBzazsKKwkJcHNrID0gTlVMTDsKIAl9IGVsc2UgewotCQlvc19mcmVlKHN0YS0+cHNrKTsKIAkJc3RhLT5wc2sgPSBOVUxMOwogCX0KIApAQCAtNDg2LDExICs3MjUsMTcgQEAKIAkJLyogaGFuZGxlX2F1dGhfZnRfZmluaXNoKCkgY2FsbGJhY2sgd2lsbCBjb21wbGV0ZSBhdXRoLiAqLwogCQlyZXR1cm47CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KKyNpZmRlZiBDT05GSUdfU0FFCisJY2FzZSBXTEFOX0FVVEhfU0FFOgorCQloYW5kbGVfYXV0aF9zYWUoaGFwZCwgc3RhLCBtZ210LCBsZW4sIGF1dGhfdHJhbnNhY3Rpb24pOworCQlyZXR1cm47CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCX0KIAogIGZhaWw6CiAJb3NfZnJlZShpZGVudGl0eSk7CiAJb3NfZnJlZShyYWRpdXNfY3VpKTsKKwlob3N0YXBkX2ZyZWVfcHNrX2xpc3QocHNrKTsKIAogCXNlbmRfYXV0aF9yZXBseShoYXBkLCBtZ210LT5zYSwgbWdtdC0+YnNzaWQsIGF1dGhfYWxnLAogCQkJYXV0aF90cmFuc2FjdGlvbiArIDEsIHJlc3AsIHJlc3BfaWVzLCByZXNwX2llc19sZW4pOwpAQCAtNzc5LDYgKzEwMjQsMTYgQEAKIAkJfQogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFSICovCiAKKyNpZmRlZiBDT05GSUdfU0FFCisJCWlmICh3cGFfYXV0aF91c2VzX3NhZShzdGEtPndwYV9zbSkgJiYKKwkJICAgIHN0YS0+YXV0aF9hbGcgIT0gV0xBTl9BVVRIX1NBRSkgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6ICIgTUFDU1RSICIgdHJpZWQgdG8gdXNlICIKKwkJCQkgICAiU0FFIEFLTSBhZnRlciBub24tU0FFIGF1dGhfYWxnICV1IiwKKwkJCQkgICBNQUMyU1RSKHN0YS0+YWRkciksIHN0YS0+YXV0aF9hbGcpOworCQkJcmV0dXJuIFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEc7CisJCX0KKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCisKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExTgogCQlpZiAoKHN0YS0+ZmxhZ3MgJiAoV0xBTl9TVEFfSFQgfCBXTEFOX1NUQV9WSFQpKSAmJgogCQkgICAgd3BhX2F1dGhfZ2V0X3BhaXJ3aXNlKHN0YS0+d3BhX3NtKSA9PSBXUEFfQ0lQSEVSX1RLSVApIHsKQEAgLTgwNyw2ICsxMDYyLDE1IEBACiAJcDJwX2dyb3VwX25vdGlmX2Fzc29jKGhhcGQtPnAycF9ncm91cCwgc3RhLT5hZGRyLCBpZXMsIGllc19sZW4pOwogI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KIAorI2lmZGVmIENPTkZJR19IUzIwCisJd3BhYnVmX2ZyZWUoc3RhLT5oczIwX2llKTsKKwlpZiAoZWxlbXMuaHMyMCAmJiBlbGVtcy5oczIwX2xlbiA+IDQpIHsKKwkJc3RhLT5oczIwX2llID0gd3BhYnVmX2FsbG9jX2NvcHkoZWxlbXMuaHMyMCArIDQsCisJCQkJCQkgZWxlbXMuaHMyMF9sZW4gLSA0KTsKKwl9IGVsc2UKKwkJc3RhLT5oczIwX2llID0gTlVMTDsKKyNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLworCiAJcmV0dXJuIFdMQU5fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKQEAgLTEyNTQsMTMgKzE1MTgsMzIgQEAKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwogCiAKKyNpZmRlZiBDT05GSUdfV05NCitzdGF0aWMgdm9pZCBob3N0YXBkX3dubV9hY3Rpb24oc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LAorCQkJICAgICAgIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHJ4X2FjdGlvbiBhY3Rpb247CisJaWYgKGxlbiA8IElFRUU4MDIxMV9IRFJMRU4gKyAyKQorCQlyZXR1cm47CisJb3NfbWVtc2V0KCZhY3Rpb24sIDAsIHNpemVvZihhY3Rpb24pKTsKKwlhY3Rpb24uZGEgPSBtZ210LT5kYTsKKwlhY3Rpb24uc2EgPSBtZ210LT5zYTsKKwlhY3Rpb24uYnNzaWQgPSBtZ210LT5ic3NpZDsKKwlhY3Rpb24uY2F0ZWdvcnkgPSBtZ210LT51LmFjdGlvbi5jYXRlZ29yeTsKKwlhY3Rpb24uZGF0YSA9IChjb25zdCB1OCAqKSAmbWdtdC0+dS5hY3Rpb24udS53bm1fc2xlZXBfcmVxLmFjdGlvbjsKKwlhY3Rpb24ubGVuID0gbGVuIC0gSUVFRTgwMjExX0hEUkxFTiAtIDE7CisJYWN0aW9uLmZyZXEgPSBoYXBkLT5pZmFjZS0+ZnJlcTsKKwlpZWVlODAyXzExX3J4X3dubV9hY3Rpb25fYXAoaGFwZCwgJmFjdGlvbik7Cit9CisjZW5kaWYgLyogQ09ORklHX1dOTSAqLworCisKIHN0YXRpYyB2b2lkIGhhbmRsZV9hY3Rpb24oc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKIAkJCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LCBzaXplX3QgbGVuKQogewotI2lmIGRlZmluZWQoQ09ORklHX0lFRUU4MDIxMVcpIHx8IGRlZmluZWQoQ09ORklHX0lFRUU4MDIxMVIpCiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJc3RhID0gYXBfZ2V0X3N0YShoYXBkLCBtZ210LT5zYSk7Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgfHwgQ09ORklHX0lFRUU4MDIxMVIgKi8KIAogCWlmIChsZW4gPCBJRUVFODAyMTFfSERSTEVOICsgMSkgewogCQlob3N0YXBkX2xvZ2dlcihoYXBkLCBtZ210LT5zYSwgSE9TVEFQRF9NT0RVTEVfSUVFRTgwMjExLApAQCAtMTI3MCw2ICsxNTUzLDE0IEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAobWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgIT0gV0xBTl9BQ1RJT05fUFVCTElDICYmCisJICAgIChzdGEgPT0gTlVMTCB8fCAhKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BU1NPQykpKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiSUVFRSA4MDIuMTE6IElnbm9yZWQgQWN0aW9uICIKKwkJCSAgICJmcmFtZSAoY2F0ZWdvcnk9JXUpIGZyb20gdW5hc3NvY2lhdGVkIFNUQSAiIE1BQ1NUUiwKKwkJCSAgIE1BQzJTVFIobWdtdC0+c2EpLCBtZ210LT51LmFjdGlvbi5jYXRlZ29yeSk7CisJCXJldHVybjsKKwl9CisKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwogCWlmIChzdGEgJiYgKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9NRlApICYmCiAJICAgICEobWdtdC0+ZnJhbWVfY29udHJvbCAmIGhvc3RfdG9fbGUxNihXTEFOX0ZDX0lTV0VQKSAmJgpAQCAtMTI4NSwyMCArMTU3NiwxMCBAQAogCXN3aXRjaCAobWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkpIHsKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExUgogCWNhc2UgV0xBTl9BQ1RJT05fRlQ6Ci0JewotCQlpZiAoc3RhID09IE5VTEwgfHwgIShzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVNTT0MpKSB7Ci0JCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIklFRUUgODAyLjExOiBJZ25vcmVkIEZUIEFjdGlvbiAiCi0JCQkJICAgImZyYW1lIGZyb20gdW5hc3NvY2lhdGVkIFNUQSAiIE1BQ1NUUiwKLQkJCQkgICBNQUMyU1RSKG1nbXQtPnNhKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQogCQlpZiAod3BhX2Z0X2FjdGlvbl9yeChzdGEtPndwYV9zbSwgKHU4ICopICZtZ210LT51LmFjdGlvbiwKIAkJCQkgICAgIGxlbiAtIElFRUU4MDIxMV9IRFJMRU4pKQogCQkJYnJlYWs7Ci0KIAkJcmV0dXJuOwotCX0KICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLwogCWNhc2UgV0xBTl9BQ1RJT05fV01NOgogCQlob3N0YXBkX3dtbV9hY3Rpb24oaGFwZCwgbWdtdCwgbGVuKTsKQEAgLTEzMDgsMTMgKzE1ODksMjQgQEAKIAkJaG9zdGFwZF9zYV9xdWVyeV9hY3Rpb24oaGFwZCwgbWdtdCwgbGVuKTsKIAkJcmV0dXJuOwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCisjaWZkZWYgQ09ORklHX1dOTQorCWNhc2UgV0xBTl9BQ1RJT05fV05NOgorCQlob3N0YXBkX3dubV9hY3Rpb24oaGFwZCwgc3RhLCBtZ210LCBsZW4pOworCQlyZXR1cm47CisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogCWNhc2UgV0xBTl9BQ1RJT05fUFVCTElDOgogCQlpZiAoaGFwZC0+cHVibGljX2FjdGlvbl9jYikgewogCQkJaGFwZC0+cHVibGljX2FjdGlvbl9jYihoYXBkLT5wdWJsaWNfYWN0aW9uX2NiX2N0eCwKIAkJCQkJICAgICAgICh1OCAqKSBtZ210LCBsZW4sCiAJCQkJCSAgICAgICBoYXBkLT5pZmFjZS0+ZnJlcSk7Ci0JCQlyZXR1cm47CiAJCX0KKwkJaWYgKGhhcGQtPnB1YmxpY19hY3Rpb25fY2IyKSB7CisJCQloYXBkLT5wdWJsaWNfYWN0aW9uX2NiMihoYXBkLT5wdWJsaWNfYWN0aW9uX2NiMl9jdHgsCisJCQkJCQkodTggKikgbWdtdCwgbGVuLAorCQkJCQkJaGFwZC0+aWZhY2UtPmZyZXEpOworCQl9CisJCWlmIChoYXBkLT5wdWJsaWNfYWN0aW9uX2NiIHx8IGhhcGQtPnB1YmxpY19hY3Rpb25fY2IyKQorCQkJcmV0dXJuOwogCQlicmVhazsKIAljYXNlIFdMQU5fQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQzoKIAkJaWYgKGhhcGQtPnZlbmRvcl9hY3Rpb25fY2IpIHsKQEAgLTE1MDUsNiArMTc5Nyw3IEBACiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJaW50IG5ld19hc3NvYyA9IDE7CiAJc3RydWN0IGllZWU4MDIxMV9odF9jYXBhYmlsaXRpZXMgaHRfY2FwOworCXN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllcyB2aHRfY2FwOwogCiAJaWYgKGxlbiA8IElFRUU4MDIxMV9IRFJMRU4gKyAocmVhc3NvYyA/IHNpemVvZihtZ210LT51LnJlYXNzb2NfcmVzcCkgOgogCQkJCSAgICAgIHNpemVvZihtZ210LT51LmFzc29jX3Jlc3ApKSkgewpAQCAtMTU3NywxMSArMTg3MCwxNiBAQAogCWlmIChzdGEtPmZsYWdzICYgV0xBTl9TVEFfSFQpCiAJCWhvc3RhcGRfZ2V0X2h0X2NhcGFiKGhhcGQsIHN0YS0+aHRfY2FwYWJpbGl0aWVzLCAmaHRfY2FwKTsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExTiAqLworI2lmZGVmIENPTkZJR19JRUVFODAyMTFBQworCWlmIChzdGEtPmZsYWdzICYgV0xBTl9TVEFfVkhUKQorCQlob3N0YXBkX2dldF92aHRfY2FwYWIoaGFwZCwgc3RhLT52aHRfY2FwYWJpbGl0aWVzLCAmdmh0X2NhcCk7CisjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMUFDICovCiAKIAlpZiAoaG9zdGFwZF9zdGFfYWRkKGhhcGQsIHN0YS0+YWRkciwgc3RhLT5haWQsIHN0YS0+Y2FwYWJpbGl0eSwKIAkJCSAgICBzdGEtPnN1cHBvcnRlZF9yYXRlcywgc3RhLT5zdXBwb3J0ZWRfcmF0ZXNfbGVuLAogCQkJICAgIHN0YS0+bGlzdGVuX2ludGVydmFsLAogCQkJICAgIHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9IVCA/ICZodF9jYXAgOiBOVUxMLAorCQkJICAgIHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9WSFQgPyAmdmh0X2NhcCA6IE5VTEwsCiAJCQkgICAgc3RhLT5mbGFncywgc3RhLT5xb3NpbmZvKSkgewogCQlob3N0YXBkX2xvZ2dlcihoYXBkLCBzdGEtPmFkZHIsIEhPU1RBUERfTU9EVUxFX0lFRUU4MDIxMSwKIAkJCSAgICAgICBIT1NUQVBEX0xFVkVMX05PVElDRSwKZGlmZiAtLWdpdCBhL3NyYy9hcC9pZWVlODAyXzExLmggYi9zcmMvYXAvaWVlZTgwMl8xMS5oCmluZGV4IDFlNTgwMGQuLjJhYWI1NmQgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9pZWVlODAyXzExLmgKKysrIGIvc3JjL2FwL2llZWU4MDJfMTEuaApAQCAtNTMsNiArNTMsOSBAQAogdm9pZCBob3N0YXBkX2dldF9odF9jYXBhYihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyAqaHRfY2FwLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyAqbmVnX2h0X2NhcCk7Cit2b2lkIGhvc3RhcGRfZ2V0X3ZodF9jYXBhYihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwYWJpbGl0aWVzICp2aHRfY2FwLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwYWJpbGl0aWVzICpuZWdfdmh0X2NhcCk7CiB1MTYgY29weV9zdGFfaHRfY2FwYWIoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgc3RydWN0IHN0YV9pbmZvICpzdGEsCiAJCSAgICAgIGNvbnN0IHU4ICpodF9jYXBhYiwgc2l6ZV90IGh0X2NhcGFiX2xlbik7CiB2b2lkIHVwZGF0ZV9odF9zdGF0ZShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CmRpZmYgLS1naXQgYS9zcmMvYXAvaWVlZTgwMl8xMV9hdXRoLmMgYi9zcmMvYXAvaWVlZTgwMl8xMV9hdXRoLmMKaW5kZXggNjNhZTM0NS4uYzMxMWU1NSAxMDA2NDQKLS0tIGEvc3JjL2FwL2llZWU4MDJfMTFfYXV0aC5jCisrKyBiL3NyYy9hcC9pZWVlODAyXzExX2F1dGguYwpAQCAtMzYsOCArMzYsNyBAQAogCXUzMiBzZXNzaW9uX3RpbWVvdXQ7CiAJdTMyIGFjY3RfaW50ZXJpbV9pbnRlcnZhbDsKIAlpbnQgdmxhbl9pZDsKLQlpbnQgaGFzX3BzazsKLQl1OCBwc2tbUE1LX0xFTl07CisJc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKnBzazsKIAljaGFyICppZGVudGl0eTsKIAljaGFyICpyYWRpdXNfY3VpOwogfTsKQEAgLTU4LDYgKzU3LDcgQEAKIHsKIAlvc19mcmVlKGUtPmlkZW50aXR5KTsKIAlvc19mcmVlKGUtPnJhZGl1c19jdWkpOworCWhvc3RhcGRfZnJlZV9wc2tfbGlzdChlLT5wc2spOwogCW9zX2ZyZWUoZSk7CiB9CiAKQEAgLTc0LDExICs3NCwzNCBAQAogfQogCiAKK3N0YXRpYyB2b2lkIGNvcHlfcHNrX2xpc3Qoc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKipwc2ssCisJCQkgIHN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICpzcmMpCit7CisJc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKipjb3B5X3RvOworCXN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICpjb3B5X2Zyb207CisKKwkvKiBDb3B5IFBTSyBsaW5rZWQgbGlzdCAqLworCWNvcHlfdG8gPSBwc2s7CisJY29weV9mcm9tID0gc3JjOworCXdoaWxlIChjb3B5X2Zyb20gJiYgY29weV90bykgeworCQkqY29weV90byA9IG9zX3phbGxvYyhzaXplb2Yoc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQpKTsKKwkJaWYgKCpjb3B5X3RvID09IE5VTEwpCisJCQlicmVhazsKKwkJb3NfbWVtY3B5KCpjb3B5X3RvLCBjb3B5X2Zyb20sCisJCQkgIHNpemVvZihzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCkpOworCQljb3B5X2Zyb20gPSBjb3B5X2Zyb20tPm5leHQ7CisJCWNvcHlfdG8gPSAmKCgqY29weV90byktPm5leHQpOworCX0KKwlpZiAoY29weV90bykKKwkJKmNvcHlfdG8gPSBOVUxMOworfQorCisKIHN0YXRpYyBpbnQgaG9zdGFwZF9hY2xfY2FjaGVfZ2V0KHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyLAogCQkJCSB1MzIgKnNlc3Npb25fdGltZW91dCwKIAkJCQkgdTMyICphY2N0X2ludGVyaW1faW50ZXJ2YWwsIGludCAqdmxhbl9pZCwKLQkJCQkgdTggKnBzaywgaW50ICpoYXNfcHNrLCBjaGFyICoqaWRlbnRpdHksCi0JCQkJIGNoYXIgKipyYWRpdXNfY3VpKQorCQkJCSBzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCAqKnBzaywKKwkJCQkgY2hhciAqKmlkZW50aXR5LCBjaGFyICoqcmFkaXVzX2N1aSkKIHsKIAlzdHJ1Y3QgaG9zdGFwZF9jYWNoZWRfcmFkaXVzX2FjbCAqZW50cnk7CiAJc3RydWN0IG9zX3RpbWUgbm93OwpAQCAtOTksMTAgKzEyMiw3IEBACiAJCQkJZW50cnktPmFjY3RfaW50ZXJpbV9pbnRlcnZhbDsKIAkJaWYgKHZsYW5faWQpCiAJCQkqdmxhbl9pZCA9IGVudHJ5LT52bGFuX2lkOwotCQlpZiAocHNrKQotCQkJb3NfbWVtY3B5KHBzaywgZW50cnktPnBzaywgUE1LX0xFTik7Ci0JCWlmIChoYXNfcHNrKQotCQkJKmhhc19wc2sgPSBlbnRyeS0+aGFzX3BzazsKKwkJY29weV9wc2tfbGlzdChwc2ssIGVudHJ5LT5wc2spOwogCQlpZiAoaWRlbnRpdHkpIHsKIAkJCWlmIChlbnRyeS0+aWRlbnRpdHkpCiAJCQkJKmlkZW50aXR5ID0gb3Nfc3RyZHVwKGVudHJ5LT5pZGVudGl0eSk7CkBAIC0yMDAsOCArMjIwLDcgQEAKICAqIEBzZXNzaW9uX3RpbWVvdXQ6IEJ1ZmZlciBmb3IgcmV0dXJuaW5nIHNlc3Npb24gdGltZW91dCAoZnJvbSBSQURJVVMpCiAgKiBAYWNjdF9pbnRlcmltX2ludGVydmFsOiBCdWZmZXIgZm9yIHJldHVybmluZyBhY2NvdW50IGludGVydmFsIChmcm9tIFJBRElVUykKICAqIEB2bGFuX2lkOiBCdWZmZXIgZm9yIHJldHVybmluZyBWTEFOIElECi0gKiBAcHNrOiBCdWZmZXIgZm9yIHJldHVybmluZyBXUEEgUFNLCi0gKiBAaGFzX3BzazogQnVmZmVyIGZvciBpbmRpY2F0aW5nIHdoZXRoZXIgcHNrIHdhcyBmaWxsZWQKKyAqIEBwc2s6IExpbmtlZCBsaXN0IGJ1ZmZlciBmb3IgcmV0dXJuaW5nIFdQQSBQU0sKICAqIEBpZGVudGl0eTogQnVmZmVyIGZvciByZXR1cm5pbmcgaWRlbnRpdHkgKGZyb20gUkFESVVTKQogICogQHJhZGl1c19jdWk6IEJ1ZmZlciBmb3IgcmV0dXJuaW5nIENVSSAoZnJvbSBSQURJVVMpCiAgKiBSZXR1cm5zOiBIT1NUQVBEX0FDTF9BQ0NFUFQsIEhPU1RBUERfQUNMX1JFSkVDVCwgb3IgSE9TVEFQRF9BQ0xfUEVORElORwpAQCAtMjEyLDggKzIzMSw4IEBACiBpbnQgaG9zdGFwZF9hbGxvd2VkX2FkZHJlc3Moc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgY29uc3QgdTggKmFkZHIsCiAJCQkgICAgY29uc3QgdTggKm1zZywgc2l6ZV90IGxlbiwgdTMyICpzZXNzaW9uX3RpbWVvdXQsCiAJCQkgICAgdTMyICphY2N0X2ludGVyaW1faW50ZXJ2YWwsIGludCAqdmxhbl9pZCwKLQkJCSAgICB1OCAqcHNrLCBpbnQgKmhhc19wc2ssIGNoYXIgKippZGVudGl0eSwKLQkJCSAgICBjaGFyICoqcmFkaXVzX2N1aSkKKwkJCSAgICBzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCAqKnBzaywKKwkJCSAgICBjaGFyICoqaWRlbnRpdHksIGNoYXIgKipyYWRpdXNfY3VpKQogewogCWlmIChzZXNzaW9uX3RpbWVvdXQpCiAJCSpzZXNzaW9uX3RpbWVvdXQgPSAwOwpAQCAtMjIxLDEwICsyNDAsOCBAQAogCQkqYWNjdF9pbnRlcmltX2ludGVydmFsID0gMDsKIAlpZiAodmxhbl9pZCkKIAkJKnZsYW5faWQgPSAwOwotCWlmIChoYXNfcHNrKQotCQkqaGFzX3BzayA9IDA7CiAJaWYgKHBzaykKLQkJb3NfbWVtc2V0KHBzaywgMCwgUE1LX0xFTik7CisJCSpwc2sgPSBOVUxMOwogCWlmIChpZGVudGl0eSkKIAkJKmlkZW50aXR5ID0gTlVMTDsKIAlpZiAocmFkaXVzX2N1aSkKQEAgLTI1Myw3ICsyNzAsNyBAQAogCQkvKiBDaGVjayB3aGV0aGVyIEFDTCBjYWNoZSBoYXMgYW4gZW50cnkgZm9yIHRoaXMgc3RhdGlvbiAqLwogCQlpbnQgcmVzID0gaG9zdGFwZF9hY2xfY2FjaGVfZ2V0KGhhcGQsIGFkZHIsIHNlc3Npb25fdGltZW91dCwKIAkJCQkJCWFjY3RfaW50ZXJpbV9pbnRlcnZhbCwKLQkJCQkJCXZsYW5faWQsIHBzaywgaGFzX3BzaywKKwkJCQkJCXZsYW5faWQsIHBzaywKIAkJCQkJCWlkZW50aXR5LCByYWRpdXNfY3VpKTsKIAkJaWYgKHJlcyA9PSBIT1NUQVBEX0FDTF9BQ0NFUFQgfHwKIAkJICAgIHJlcyA9PSBIT1NUQVBEX0FDTF9BQ0NFUFRfVElNRU9VVCkKQEAgLTM5Niw2ICs0MTMsNTQgQEAKIH0KIAogCitzdGF0aWMgdm9pZCBkZWNvZGVfdHVubmVsX3Bhc3N3b3JkcyhzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJCSAgICBjb25zdCB1OCAqc2hhcmVkX3NlY3JldCwKKwkJCQkgICAgc2l6ZV90IHNoYXJlZF9zZWNyZXRfbGVuLAorCQkJCSAgICBzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLAorCQkJCSAgICBzdHJ1Y3QgcmFkaXVzX21zZyAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgaG9zdGFwZF9jYWNoZWRfcmFkaXVzX2FjbCAqY2FjaGUpCit7CisJaW50IHBhc3NwaHJhc2VsZW47CisJY2hhciAqcGFzc3BocmFzZSwgKnN0cnBhc3NwaHJhc2U7CisJc2l6ZV90IGk7CisJc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKnBzazsKKworCS8qCisJICogRGVjb2RlIGFsbCB0dW5uZWwgcGFzc3dvcmRzIGFzIFBTSyBhbmQgc2F2ZSB0aGVtIGludG8gYSBsaW5rZWQgbGlzdC4KKwkgKi8KKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQlwYXNzcGhyYXNlID0gcmFkaXVzX21zZ19nZXRfdHVubmVsX3Bhc3N3b3JkKAorCQkJbXNnLCAmcGFzc3BocmFzZWxlbiwgc2hhcmVkX3NlY3JldCwgc2hhcmVkX3NlY3JldF9sZW4sCisJCQlyZXEsIGkpOworCQkvKgorCQkgKiBQYXNzcGhyYXNlIGlzIE5VTEwgaWZmIHRoZXJlIGlzIG5vIGktdGggVHVubmVsLVBhc3N3b3JkCisJCSAqIGF0dHJpYnV0ZSBpbiBtc2cuCisJCSAqLworCQlpZiAocGFzc3BocmFzZSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIHBhc3NwaHJhc2UgZG9lcyBub3QgY29udGFpbiB0aGUgTlVMTCB0ZXJtaW5hdGlvbi4KKwkJICogQWRkIGl0IGhlcmUgYXMgcGJrZGYyX3NoYTEoKSByZXF1aXJlcyBpdC4KKwkJICovCisJCXN0cnBhc3NwaHJhc2UgPSBvc196YWxsb2MocGFzc3BocmFzZWxlbiArIDEpOworCQlwc2sgPSBvc196YWxsb2Moc2l6ZW9mKHN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0KSk7CisJCWlmIChzdHJwYXNzcGhyYXNlICYmIHBzaykgeworCQkJb3NfbWVtY3B5KHN0cnBhc3NwaHJhc2UsIHBhc3NwaHJhc2UsIHBhc3NwaHJhc2VsZW4pOworCQkJcGJrZGYyX3NoYTEoc3RycGFzc3BocmFzZSwKKwkJCQkgICAgaGFwZC0+Y29uZi0+c3NpZC5zc2lkLAorCQkJCSAgICBoYXBkLT5jb25mLT5zc2lkLnNzaWRfbGVuLCA0MDk2LAorCQkJCSAgICBwc2stPnBzaywgUE1LX0xFTik7CisJCQlwc2stPm5leHQgPSBjYWNoZS0+cHNrOworCQkJY2FjaGUtPnBzayA9IHBzazsKKwkJCXBzayA9IE5VTEw7CisJCX0KKwkJb3NfZnJlZShzdHJwYXNzcGhyYXNlKTsKKwkJb3NfZnJlZShwc2spOworCQlvc19mcmVlKHBhc3NwaHJhc2UpOworCX0KK30KKworCiAvKioKICAqIGhvc3RhcGRfYWNsX3JlY3ZfcmFkaXVzIC0gUHJvY2VzcyBpbmNvbWluZyBSQURJVVMgQXV0aGVudGljYXRpb24gbWVzc2FnZXMKICAqIEBtc2c6IFJBRElVUyByZXNwb25zZSBtZXNzYWdlCkBAIC00NTQsOCArNTE5LDYgQEAKIAljYWNoZS0+dGltZXN0YW1wID0gdC5zZWM7CiAJb3NfbWVtY3B5KGNhY2hlLT5hZGRyLCBxdWVyeS0+YWRkciwgc2l6ZW9mKGNhY2hlLT5hZGRyKSk7CiAJaWYgKGhkci0+Y29kZSA9PSBSQURJVVNfQ09ERV9BQ0NFU1NfQUNDRVBUKSB7Ci0JCWludCBwYXNzcGhyYXNlbGVuOwotCQljaGFyICpwYXNzcGhyYXNlOwogCQl1OCAqYnVmOwogCQlzaXplX3QgbGVuOwogCkBAIC00NzgsMjcgKzU0MSw5IEBACiAKIAkJY2FjaGUtPnZsYW5faWQgPSByYWRpdXNfbXNnX2dldF92bGFuaWQobXNnKTsKIAotCQlwYXNzcGhyYXNlID0gcmFkaXVzX21zZ19nZXRfdHVubmVsX3Bhc3N3b3JkKAotCQkJbXNnLCAmcGFzc3BocmFzZWxlbiwKLQkJCWhhcGQtPmNvbmYtPnJhZGl1cy0+YXV0aF9zZXJ2ZXItPnNoYXJlZF9zZWNyZXQsCi0JCQloYXBkLT5jb25mLT5yYWRpdXMtPmF1dGhfc2VydmVyLT5zaGFyZWRfc2VjcmV0X2xlbiwKLQkJCXJlcSk7Ci0JCWNhY2hlLT5oYXNfcHNrID0gcGFzc3BocmFzZSAhPSBOVUxMOwotCQlpZiAocGFzc3BocmFzZSAhPSBOVUxMKSB7Ci0JCQkvKiBwYXNzcGhyYXNlIGRvZXMgbm90IGNvbnRhaW4gdGhlIE5VTEwgdGVybWluYXRpb24uCi0JCQkgKiBBZGQgaXQgaGVyZSBhcyBwYmtkZjJfc2hhMSByZXF1aXJlcyBpdC4gKi8KLQkJCWNoYXIgKnN0cnBhc3NwaHJhc2UgPSBvc196YWxsb2MocGFzc3BocmFzZWxlbiArIDEpOwotCQkJaWYgKHN0cnBhc3NwaHJhc2UpIHsKLQkJCQlvc19tZW1jcHkoc3RycGFzc3BocmFzZSwgcGFzc3BocmFzZSwKLQkJCQkJICBwYXNzcGhyYXNlbGVuKTsKLQkJCQlwYmtkZjJfc2hhMShzdHJwYXNzcGhyYXNlLAotCQkJCQkgICAgaGFwZC0+Y29uZi0+c3NpZC5zc2lkLAotCQkJCQkgICAgaGFwZC0+Y29uZi0+c3NpZC5zc2lkX2xlbiwgNDA5NiwKLQkJCQkJICAgIGNhY2hlLT5wc2ssIFBNS19MRU4pOwotCQkJCW9zX2ZyZWUoc3RycGFzc3BocmFzZSk7Ci0JCQl9Ci0JCQlvc19mcmVlKHBhc3NwaHJhc2UpOwotCQl9CisJCWRlY29kZV90dW5uZWxfcGFzc3dvcmRzKGhhcGQsIHNoYXJlZF9zZWNyZXQsIHNoYXJlZF9zZWNyZXRfbGVuLAorCQkJCQltc2csIHJlcSwgY2FjaGUpOworCiAJCWlmIChyYWRpdXNfbXNnX2dldF9hdHRyX3B0cihtc2csIFJBRElVU19BVFRSX1VTRVJfTkFNRSwKIAkJCQkJICAgICZidWYsICZsZW4sIE5VTEwpID09IDApIHsKIAkJCWNhY2hlLT5pZGVudGl0eSA9IG9zX3phbGxvYyhsZW4gKyAxKTsKQEAgLTUxNCw3ICs1NTksNyBAQAogCQl9CiAKIAkJaWYgKGhhcGQtPmNvbmYtPndwYV9wc2tfcmFkaXVzID09IFBTS19SQURJVVNfUkVRVUlSRUQgJiYKLQkJICAgICFjYWNoZS0+aGFzX3BzaykKKwkJICAgICFjYWNoZS0+cHNrKQogCQkJY2FjaGUtPmFjY2VwdGVkID0gSE9TVEFQRF9BQ0xfUkVKRUNUOwogCX0gZWxzZQogCQljYWNoZS0+YWNjZXB0ZWQgPSBIT1NUQVBEX0FDTF9SRUpFQ1Q7CkBAIC01ODYsMyArNjMxLDEzIEBACiAJCWhvc3RhcGRfYWNsX3F1ZXJ5X2ZyZWUocHJldik7CiAJfQogfQorCisKK3ZvaWQgaG9zdGFwZF9mcmVlX3Bza19saXN0KHN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICpwc2spCit7CisJd2hpbGUgKHBzaykgeworCQlzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCAqcHJldiA9IHBzazsKKwkJcHNrID0gcHNrLT5uZXh0OworCQlvc19mcmVlKHByZXYpOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9hcC9pZWVlODAyXzExX2F1dGguaCBiL3NyYy9hcC9pZWVlODAyXzExX2F1dGguaAppbmRleCAwZThkMWNiLi4yYmMxMDY1IDEwMDY0NAotLS0gYS9zcmMvYXAvaWVlZTgwMl8xMV9hdXRoLmgKKysrIGIvc3JjL2FwL2llZWU4MDJfMTFfYXV0aC5oCkBAIC0xOSw5ICsxOSwxMCBAQAogaW50IGhvc3RhcGRfYWxsb3dlZF9hZGRyZXNzKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyLAogCQkJICAgIGNvbnN0IHU4ICptc2csIHNpemVfdCBsZW4sIHUzMiAqc2Vzc2lvbl90aW1lb3V0LAogCQkJICAgIHUzMiAqYWNjdF9pbnRlcmltX2ludGVydmFsLCBpbnQgKnZsYW5faWQsCi0JCQkgICAgdTggKnBzaywgaW50ICpoYXNfcHNrLCBjaGFyICoqaWRlbnRpdHksCi0JCQkgICAgY2hhciAqKnJhZGl1c19jdWkpOworCQkJICAgIHN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICoqcHNrLAorCQkJICAgIGNoYXIgKippZGVudGl0eSwgY2hhciAqKnJhZGl1c19jdWkpOwogaW50IGhvc3RhcGRfYWNsX2luaXQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCk7CiB2b2lkIGhvc3RhcGRfYWNsX2RlaW5pdChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkKTsKK3ZvaWQgaG9zdGFwZF9mcmVlX3Bza19saXN0KHN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICpwc2spOwogCiAjZW5kaWYgLyogSUVFRTgwMl8xMV9BVVRIX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9hcC9pZWVlODAyXzExX2h0LmMgYi9zcmMvYXAvaWVlZTgwMl8xMV9odC5jCmluZGV4IDZjMzY5NmYuLjY0ODNlMWMgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9pZWVlODAyXzExX2h0LmMKKysrIGIvc3JjL2FwL2llZWU4MDJfMTFfaHQuYwpAQCAtMTMzLDggKzEzMyw3IEBACiAJbmV3X29wX21vZGUgPSAwOwogCWlmIChpZmFjZS0+bnVtX3N0YV9ub19odCkKIAkJbmV3X29wX21vZGUgPSBPUF9NT0RFX01JWEVEOwotCWVsc2UgaWYgKChpZmFjZS0+Y29uZi0+aHRfY2FwYWIgJiBIVF9DQVBfSU5GT19TVVBQX0NIQU5ORUxfV0lEVEhfU0VUKQotCQkgJiYgaWZhY2UtPm51bV9zdGFfaHRfMjBtaHopCisJZWxzZSBpZiAoaWZhY2UtPmNvbmYtPnNlY29uZGFyeV9jaGFubmVsICYmIGlmYWNlLT5udW1fc3RhX2h0XzIwbWh6KQogCQluZXdfb3BfbW9kZSA9IE9QX01PREVfMjBNSFpfSFRfU1RBX0FTU09DRUQ7CiAJZWxzZSBpZiAoaWZhY2UtPm9sYmNfaHQpCiAJCW5ld19vcF9tb2RlID0gT1BfTU9ERV9NQVlfQkVfTEVHQUNZX1NUQVM7CmRpZmYgLS1naXQgYS9zcmMvYXAvaWVlZTgwMl8xMV9zaGFyZWQuYyBiL3NyYy9hcC9pZWVlODAyXzExX3NoYXJlZC5jCmluZGV4IGIzZmRmM2QuLjc2Zjc4YTcgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9pZWVlODAyXzExX3NoYXJlZC5jCisrKyBiL3NyYy9hcC9pZWVlODAyXzExX3NoYXJlZC5jCkBAIC0xNzMsNiArMTczLDE0IEBACiAJCWxlbiA9IDU7CiAJaWYgKGxlbiA8IDQgJiYgaGFwZC0+Y29uZi0+aW50ZXJ3b3JraW5nKQogCQlsZW4gPSA0OworCWlmIChsZW4gPCAzICYmIGhhcGQtPmNvbmYtPndubV9zbGVlcF9tb2RlKQorCQlsZW4gPSAzOworCWlmIChsZW4gPCA3ICYmIGhhcGQtPmNvbmYtPnNzaWQudXRmOF9zc2lkKQorCQlsZW4gPSA3OworI2lmZGVmIENPTkZJR19XTk0KKwlpZiAobGVuIDwgNCkKKwkJbGVuID0gNDsKKyNlbmRpZiAvKiBDT05GSUdfV05NICovCiAJaWYgKGxlbiA9PSAwKQogCQlyZXR1cm4gZWlkOwogCkBAIC0xODAsOSArMTg4LDIwIEBACiAJKnBvcysrID0gbGVuOwogCSpwb3MrKyA9IDB4MDA7CiAJKnBvcysrID0gMHgwMDsKLQkqcG9zKysgPSAweDAwOwogCiAJKnBvcyA9IDB4MDA7CisJaWYgKGhhcGQtPmNvbmYtPndubV9zbGVlcF9tb2RlKQorCQkqcG9zIHw9IDB4MDI7IC8qIEJpdCAxNyAtIFdOTS1TbGVlcCBNb2RlICovCisJaWYgKGhhcGQtPmNvbmYtPmJzc190cmFuc2l0aW9uKQorCQkqcG9zIHw9IDB4MDg7IC8qIEJpdCAxOSAtIEJTUyBUcmFuc2l0aW9uICovCisJcG9zKys7CisKKwlpZiAobGVuIDwgNCkKKwkJcmV0dXJuIHBvczsKKwkqcG9zID0gMHgwMDsKKyNpZmRlZiBDT05GSUdfV05NCisJKnBvcyB8PSAweDAyOyAvKiBCaXQgMjUgLSBTU0lEIExpc3QgKi8KKyNlbmRpZiAvKiBDT05GSUdfV05NICovCiAJaWYgKGhhcGQtPmNvbmYtPnRpbWVfYWR2ZXJ0aXNlbWVudCA9PSAyKQogCQkqcG9zIHw9IDB4MDg7IC8qIEJpdCAyNyAtIFVUQyBUU0YgT2Zmc2V0ICovCiAJaWYgKGhhcGQtPmNvbmYtPmludGVyd29ya2luZykKQEAgLTE5OCw2ICsyMTcsMTggQEAKIAkJKnBvcyB8PSAweDgwOyAvKiBCaXQgMzkgLSBURExTIENoYW5uZWwgU3dpdGNoaW5nIFByb2hpYml0ZWQgKi8KIAlwb3MrKzsKIAorCWlmIChsZW4gPCA2KQorCQlyZXR1cm4gcG9zOworCSpwb3MgPSAweDAwOworCXBvcysrOworCisJaWYgKGxlbiA8IDcpCisJCXJldHVybiBwb3M7CisJKnBvcyA9IDB4MDA7CisJaWYgKGhhcGQtPmNvbmYtPnNzaWQudXRmOF9zc2lkKQorCQkqcG9zIHw9IDB4MDE7IC8qIEJpdCA0OCAtIFVURi04IFNTSUQgKi8KKwlwb3MrKzsKKwogCXJldHVybiBwb3M7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9hcC9pZWVlODAyXzExX3ZodC5jIGIvc3JjL2FwL2llZWU4MDJfMTFfdmh0LmMKaW5kZXggNzU5OWVmOC4uZjZjYzVkNiAxMDA2NDQKLS0tIGEvc3JjL2FwL2llZWU4MDJfMTFfdmh0LmMKKysrIGIvc3JjL2FwL2llZWU4MDJfMTFfdmh0LmMKQEAgLTY4LDYgKzY4LDggQEAKIAkgKi8KIAlvcGVyLT52aHRfb3BfaW5mb19jaGFuX2NlbnRlcl9mcmVxX3NlZzBfaWR4ID0KIAkJaGFwZC0+aWNvbmYtPnZodF9vcGVyX2NlbnRyX2ZyZXFfc2VnMF9pZHg7CisJb3Blci0+dmh0X29wX2luZm9fY2hhbl9jZW50ZXJfZnJlcV9zZWcxX2lkeCA9CisJCWhhcGQtPmljb25mLT52aHRfb3Blcl9jZW50cl9mcmVxX3NlZzFfaWR4OwogCiAJb3Blci0+dmh0X29wX2luZm9fY2h3aWR0aCA9IGhhcGQtPmljb25mLT52aHRfb3Blcl9jaHdpZHRoOwogCkBAIC0xMDYsMyArMTA4LDE0IEBACiAKIAlyZXR1cm4gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKIH0KKwordm9pZCBob3N0YXBkX2dldF92aHRfY2FwYWIoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllcyAqdmh0X2NhcCwKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllcyAqbmVnX3ZodF9jYXApCit7CisJaWYgKHZodF9jYXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCW9zX21lbWNweShuZWdfdmh0X2NhcCwgdmh0X2NhcCwgc2l6ZW9mKCpuZWdfdmh0X2NhcCkpOworCisJLyogVE9ETzogbWFzayBvd24gY2FwYWJpbGl0aWVzLCBsaWtlIGdldF9odF9jYXBhYigpICovCit9CmRpZmYgLS1naXQgYS9zcmMvYXAvaWVlZTgwMl8xeC5jIGIvc3JjL2FwL2llZWU4MDJfMXguYwppbmRleCBjNGQzZGE4Li5hODMyYTczIDEwMDY0NAotLS0gYS9zcmMvYXAvaWVlZTgwMl8xeC5jCisrKyBiL3NyYy9hcC9pZWVlODAyXzF4LmMKQEAgLTY2LDggKzY2LDkgQEAKIAlpZiAoc3RhLT5mbGFncyAmIFdMQU5fU1RBX1BSRUFVVEgpIHsKIAkJcnNuX3ByZWF1dGhfc2VuZChoYXBkLCBzdGEsIGJ1ZiwgbGVuKTsKIAl9IGVsc2UgewotCQlob3N0YXBkX2Rydl9oYXBkX3NlbmRfZWFwb2woaGFwZCwgc3RhLT5hZGRyLCBidWYsIGxlbiwKLQkJCQkJICAgIGVuY3J5cHQsIHN0YS0+ZmxhZ3MpOworCQlob3N0YXBkX2Rydl9oYXBkX3NlbmRfZWFwb2woCisJCQloYXBkLCBzdGEtPmFkZHIsIGJ1ZiwgbGVuLAorCQkJZW5jcnlwdCwgaG9zdGFwZF9zdGFfZmxhZ3NfdG9fZHJ2KHN0YS0+ZmxhZ3MpKTsKIAl9CiAKIAlvc19mcmVlKGJ1Zik7CkBAIC05OSw4ICsxMDAsMTAgQEAKIAkJICAgICAgICJkcml2ZXIgKGVycm5vPSVkKS5cbiIsIE1BQzJTVFIoc3RhLT5hZGRyKSwgZXJybm8pOwogCX0KIAotCWlmIChhdXRob3JpemVkKQorCWlmIChhdXRob3JpemVkKSB7CisJCW9zX2dldF90aW1lKCZzdGEtPmNvbm5lY3RlZF90aW1lKTsKIAkJYWNjb3VudGluZ19zdGFfc3RhcnQoaGFwZCwgc3RhKTsKKwl9CiB9CiAKIApAQCAtMzUyLDYgKzM1NSw4IEBACiBjb25zdCBjaGFyICpyYWRpdXNfbW9kZV90eHQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCkKIHsKIAlzd2l0Y2ggKGhhcGQtPmlmYWNlLT5jb25mLT5od19tb2RlKSB7CisJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExQUQ6CisJCXJldHVybiAiODAyLjExYWQiOwogCWNhc2UgSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUE6CiAJCXJldHVybiAiODAyLjExYSI7CiAJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExRzoKQEAgLTQ1MCw2ICs0NTUsMTYgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAorCWlmIChzdGEtPmFjY3Rfc2Vzc2lvbl9pZF9oaSB8fCBzdGEtPmFjY3Rfc2Vzc2lvbl9pZF9sbykgeworCQlvc19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJTA4WC0lMDhYIiwKKwkJCSAgICBzdGEtPmFjY3Rfc2Vzc2lvbl9pZF9oaSwgc3RhLT5hY2N0X3Nlc3Npb25faWRfbG8pOworCQlpZiAoIXJhZGl1c19tc2dfYWRkX2F0dHIobXNnLCBSQURJVVNfQVRUUl9BQ0NUX1NFU1NJT05fSUQsCisJCQkJCSAodTggKikgYnVmLCBvc19zdHJsZW4oYnVmKSkpIHsKKwkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiQ291bGQgbm90IGFkZCBBY2N0LVNlc3Npb24tSWQiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xNjg0LDggKzE2OTksNyBAQAogCWNvbnN0IHN0cnVjdCBob3N0YXBkX2VhcF91c2VyICplYXBfdXNlcjsKIAlpbnQgaTsKIAotCWVhcF91c2VyID0gaG9zdGFwZF9nZXRfZWFwX3VzZXIoaGFwZC0+Y29uZiwgaWRlbnRpdHksCi0JCQkJCWlkZW50aXR5X2xlbiwgcGhhc2UyKTsKKwllYXBfdXNlciA9IGhvc3RhcGRfZ2V0X2VhcF91c2VyKGhhcGQsIGlkZW50aXR5LCBpZGVudGl0eV9sZW4sIHBoYXNlMik7CiAJaWYgKGVhcF91c2VyID09IE5VTEwpCiAJCXJldHVybiAtMTsKIApkaWZmIC0tZ2l0IGEvc3JjL2FwL3Bta3NhX2NhY2hlX2F1dGguYyBiL3NyYy9hcC9wbWtzYV9jYWNoZV9hdXRoLmMKaW5kZXggYmEyYzAzMy4uZDI3ZmQzMCAxMDA2NDQKLS0tIGEvc3JjL2FwL3Bta3NhX2NhY2hlX2F1dGguYworKysgYi9zcmMvYXAvcG1rc2FfY2FjaGVfYXV0aC5jCkBAIC05NSwxMSArOTUsOSBAQAogCiAJb3NfZ2V0X3RpbWUoJm5vdyk7CiAJd2hpbGUgKHBta3NhLT5wbWtzYSAmJiBwbWtzYS0+cG1rc2EtPmV4cGlyYXRpb24gPD0gbm93LnNlYykgewotCQlzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlX2VudHJ5ICplbnRyeSA9IHBta3NhLT5wbWtzYTsKLQkJcG1rc2EtPnBta3NhID0gZW50cnktPm5leHQ7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUlNOOiBleHBpcmVkIFBNS1NBIGNhY2hlIGVudHJ5IGZvciAiCi0JCQkgICBNQUNTVFIsIE1BQzJTVFIoZW50cnktPnNwYSkpOwotCQlwbWtzYV9jYWNoZV9mcmVlX2VudHJ5KHBta3NhLCBlbnRyeSk7CisJCQkgICBNQUNTVFIsIE1BQzJTVFIocG1rc2EtPnBta3NhLT5zcGEpKTsKKwkJcG1rc2FfY2FjaGVfZnJlZV9lbnRyeShwbWtzYSwgcG1rc2EtPnBta3NhKTsKIAl9CiAKIAlwbWtzYV9jYWNoZV9zZXRfZXhwaXJhdGlvbihwbWtzYSk7CkBAIC0yMTEsNiArMjA5LDggQEAKIAlwbWtzYS0+cG1raWRbUE1LSURfSEFTSChlbnRyeS0+cG1raWQpXSA9IGVudHJ5OwogCiAJcG1rc2EtPnBta3NhX2NvdW50Kys7CisJaWYgKHByZXYgPT0gTlVMTCkKKwkJcG1rc2FfY2FjaGVfc2V0X2V4cGlyYXRpb24ocG1rc2EpOwogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUlNOOiBhZGRlZCBQTUtTQSBjYWNoZSBlbnRyeSBmb3IgIiBNQUNTVFIsCiAJCSAgIE1BQzJTVFIoZW50cnktPnNwYSkpOwogCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIlJTTjogYWRkZWQgUE1LSUQiLCBlbnRyeS0+cG1raWQsIFBNS0lEX0xFTik7CmRpZmYgLS1naXQgYS9zcmMvYXAvc3RhX2luZm8uYyBiL3NyYy9hcC9zdGFfaW5mby5jCmluZGV4IGQ2MTE3N2YuLjhhZGExMjEgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9zdGFfaW5mby5jCisrKyBiL3NyYy9hcC9zdGFfaW5mby5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSAidXRpbHMvZWxvb3AuaCIKICNpbmNsdWRlICJjb21tb24vaWVlZTgwMl8xMV9kZWZzLmgiCiAjaW5jbHVkZSAiY29tbW9uL3dwYV9jdHJsLmgiCisjaW5jbHVkZSAiY29tbW9uL3NhZS5oIgogI2luY2x1ZGUgInJhZGl1cy9yYWRpdXMuaCIKICNpbmNsdWRlICJyYWRpdXMvcmFkaXVzX2NsaWVudC5oIgogI2luY2x1ZGUgImRyaXZlcnMvZHJpdmVyLmgiCkBAIC0yMCw2ICsyMSw3IEBACiAjaW5jbHVkZSAiYWNjb3VudGluZy5oIgogI2luY2x1ZGUgImllZWU4MDJfMXguaCIKICNpbmNsdWRlICJpZWVlODAyXzExLmgiCisjaW5jbHVkZSAiaWVlZTgwMl8xMV9hdXRoLmgiCiAjaW5jbHVkZSAid3BhX2F1dGguaCIKICNpbmNsdWRlICJwcmVhdXRoX2F1dGguaCIKICNpbmNsdWRlICJhcF9jb25maWcuaCIKQEAgLTIzMiwxMiArMjM0LDE4IEBACiAKIAl3cGFidWZfZnJlZShzdGEtPndwc19pZSk7CiAJd3BhYnVmX2ZyZWUoc3RhLT5wMnBfaWUpOworCXdwYWJ1Zl9mcmVlKHN0YS0+aHMyMF9pZSk7CiAKIAlvc19mcmVlKHN0YS0+aHRfY2FwYWJpbGl0aWVzKTsKLQlvc19mcmVlKHN0YS0+cHNrKTsKKwlob3N0YXBkX2ZyZWVfcHNrX2xpc3Qoc3RhLT5wc2spOwogCW9zX2ZyZWUoc3RhLT5pZGVudGl0eSk7CiAJb3NfZnJlZShzdGEtPnJhZGl1c19jdWkpOwogCisjaWZkZWYgQ09ORklHX1NBRQorCXNhZV9jbGVhcl9kYXRhKHN0YS0+c2FlKTsKKwlvc19mcmVlKHN0YS0+c2FlKTsKKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCisKIAlvc19mcmVlKHN0YSk7CiB9CiAKQEAgLTQ5MSw2ICs0OTksNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAJc3RhLT5hY2N0X2ludGVyaW1faW50ZXJ2YWwgPSBoYXBkLT5jb25mLT5hY2N0X2ludGVyaW1faW50ZXJ2YWw7CisJYWNjb3VudGluZ19zdGFfZ2V0X2lkKGhhcGQsIHN0YSk7CiAKIAkvKiBpbml0aWFsaXplIFNUQSBpbmZvIGRhdGEgKi8KIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIiVzOiByZWdpc3RlciBhcF9oYW5kbGVfdGltZXIgdGltZW91dCAiCmRpZmYgLS1naXQgYS9zcmMvYXAvc3RhX2luZm8uaCBiL3NyYy9hcC9zdGFfaW5mby5oCmluZGV4IGIzYzU3YjQuLjMyZWE0NmUgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9zdGFfaW5mby5oCisrKyBiL3NyYy9hcC9zdGFfaW5mby5oCkBAIC05NSw3ICs5NSw4IEBACiAJc3RydWN0IGhvc3RhcGRfc3NpZCAqc3NpZF9wcm9iZTsgLyogU1NJRCBzZWxlY3Rpb24gYmFzZWQgb24gUHJvYmVSZXEgKi8KIAogCWludCB2bGFuX2lkOwotCXU4ICpwc2s7IC8qIFBTSyBmcm9tIFJBRElVUyBhdXRoZW50aWNhdGlvbiBzZXJ2ZXIgKi8KKwkgLyogUFNLcyBmcm9tIFJBRElVUyBhdXRoZW50aWNhdGlvbiBzZXJ2ZXIgKi8KKwlzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCAqcHNrOwogCiAJY2hhciAqaWRlbnRpdHk7IC8qIFVzZXItTmFtZSBmcm9tIFJBRElVUyAqLwogCWNoYXIgKnJhZGl1c19jdWk7IC8qIENoYXJnZWFibGUtVXNlci1JZGVudGl0eSBmcm9tIFJBRElVUyAqLwpAQCAtMTIxLDYgKzEyMiwxMyBAQAogCiAJc3RydWN0IHdwYWJ1ZiAqd3BzX2llOyAvKiBXUFMgSUUgZnJvbSAoUmUpQXNzb2NpYXRpb24gUmVxdWVzdCAqLwogCXN0cnVjdCB3cGFidWYgKnAycF9pZTsgLyogUDJQIElFIGZyb20gKFJlKUFzc29jaWF0aW9uIFJlcXVlc3QgKi8KKwlzdHJ1Y3Qgd3BhYnVmICpoczIwX2llOyAvKiBIUyAyLjAgSUUgZnJvbSAoUmUpQXNzb2NpYXRpb24gUmVxdWVzdCAqLworCisJc3RydWN0IG9zX3RpbWUgY29ubmVjdGVkX3RpbWU7CisKKyNpZmRlZiBDT05GSUdfU0FFCisJc3RydWN0IHNhZV9kYXRhICpzYWU7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogfTsKIAogCmRpZmYgLS1naXQgYS9zcmMvYXAvdGtpcF9jb3VudGVybWVhc3VyZXMuYyBiL3NyYy9hcC90a2lwX2NvdW50ZXJtZWFzdXJlcy5jCmluZGV4IGRkNWFhNjguLjRhMmVhMDYgMTAwNjQ0Ci0tLSBhL3NyYy9hcC90a2lwX2NvdW50ZXJtZWFzdXJlcy5jCisrKyBiL3NyYy9hcC90a2lwX2NvdW50ZXJtZWFzdXJlcy5jCkBAIC02Niw5ICs2NiwxMCBAQAogfQogCiAKLXZvaWQgbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqYWRkciwgaW50IGxvY2FsKQoraW50IG1pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgY29uc3QgdTggKmFkZHIsIGludCBsb2NhbCkKIHsKIAlzdHJ1Y3Qgb3NfdGltZSBub3c7CisJaW50IHJldCA9IDA7CiAKIAlpZiAoYWRkciAmJiBsb2NhbCkgewogCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGFwX2dldF9zdGEoaGFwZCwgYWRkcik7CkBAIC04NCw3ICs4NSw3IEBACiAJCQkJICAgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiAiCiAJCQkJICAgImZvciBub3QgYXNzb2NpYXRlZCBTVEEgKCIgTUFDU1RSCiAJCQkJICAgIikgaWdub3JlZCIsIE1BQzJTVFIoYWRkcikpOwotCQkJcmV0dXJuOworCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIApAQCAtOTMsOCArOTQsMTIgQEAKIAkJaGFwZC0+bWljaGFlbF9taWNfZmFpbHVyZXMgPSAxOwogCX0gZWxzZSB7CiAJCWhhcGQtPm1pY2hhZWxfbWljX2ZhaWx1cmVzKys7Ci0JCWlmIChoYXBkLT5taWNoYWVsX21pY19mYWlsdXJlcyA+IDEpCisJCWlmIChoYXBkLT5taWNoYWVsX21pY19mYWlsdXJlcyA+IDEpIHsKIAkJCWllZWU4MDIxMV90a2lwX2NvdW50ZXJtZWFzdXJlc19zdGFydChoYXBkKTsKKwkJCXJldCA9IDE7CisJCX0KIAl9CiAJaGFwZC0+bWljaGFlbF9taWNfZmFpbHVyZSA9IG5vdy5zZWM7CisKKwlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvc3JjL2FwL3RraXBfY291bnRlcm1lYXN1cmVzLmggYi9zcmMvYXAvdGtpcF9jb3VudGVybWVhc3VyZXMuaAppbmRleCBmN2E2NjI0Li5kM2VhZWQzIDEwMDY0NAotLS0gYS9zcmMvYXAvdGtpcF9jb3VudGVybWVhc3VyZXMuaAorKysgYi9zcmMvYXAvdGtpcF9jb3VudGVybWVhc3VyZXMuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBob3N0YXBkIC8gVEtJUCBjb3VudGVybWVhc3VyZXMKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDExLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KICAqIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KQEAgLTksNyArOSw3IEBACiAjaWZuZGVmIFRLSVBfQ09VTlRFUk1FQVNVUkVTX0gKICNkZWZpbmUgVEtJUF9DT1VOVEVSTUVBU1VSRVNfSAogCi12b2lkIG1pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgY29uc3QgdTggKmFkZHIsIGludCBsb2NhbCk7CitpbnQgbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqYWRkciwgaW50IGxvY2FsKTsKIHZvaWQgaWVlZTgwMjExX3RraXBfY291bnRlcm1lYXN1cmVzX2RlaW5pdChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkKTsKIAogI2VuZGlmIC8qIFRLSVBfQ09VTlRFUk1FQVNVUkVTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9hcC93bm1fYXAuYyBiL3NyYy9hcC93bm1fYXAuYwppbmRleCAyNTk0NDA0Li41NGE2Yjg1IDEwMDY0NAotLS0gYS9zcmMvYXAvd25tX2FwLmMKKysrIGIvc3JjL2FwL3dubV9hcC5jCkBAIC0xOSw3ICsxOSw2IEBACiAKICNkZWZpbmUgTUFYX1RGU19JRV9MRU4gIDEwMjQKIAotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCiAKIC8qIGdldCB0aGUgVEZTIElFIGZyb20gZHJpdmVyICovCiBzdGF0aWMgaW50IGllZWU4MDIxMV8xMV9nZXRfdGZzX2llKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyLApAQCAtNTcsOCArNTYsOCBAQAogCXUxNiB3bm10ZnNfaWVfbGVuOwogCXU4ICpwb3M7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0JZW51bSB3bm1fb3BlciB0ZnNfb3BlciA9IGFjdGlvbl90eXBlID09IDAgPyBXTk1fU0xFRVBfVEZTX1JFU1BfSUVfQUREIDoKLQkJV05NX1NMRUVQX1RGU19SRVNQX0lFX05PTkU7CisJZW51bSB3bm1fb3BlciB0ZnNfb3BlciA9IGFjdGlvbl90eXBlID09IFdOTV9TTEVFUF9NT0RFX0VOVEVSID8KKwkJV05NX1NMRUVQX1RGU19SRVNQX0lFX0FERCA6IFdOTV9TTEVFUF9URlNfUkVTUF9JRV9OT05FOwogCiAJc3RhID0gYXBfZ2V0X3N0YShoYXBkLCBhZGRyKTsKIAlpZiAoc3RhID09IE5VTEwpIHsKQEAgLTEwNSw3ICsxMDQsOCBAQAogCW1nbXQtPnUuYWN0aW9uLnUud25tX3NsZWVwX3Jlc3AuZGlhbG9ndG9rZW4gPSBkaWFsb2dfdG9rZW47CiAJcG9zID0gKHU4ICopbWdtdC0+dS5hY3Rpb24udS53bm1fc2xlZXBfcmVzcC52YXJpYWJsZTsKIAkvKiBhZGQga2V5IGRhdGEgaWYgTUZQIGlzIGVuYWJsZWQgKi8KLQlpZiAod3BhX2F1dGhfdXNlc19tZnAoc3RhLT53cGFfc20pIHx8IGFjdGlvbl90eXBlICE9IDEpeworCWlmICghd3BhX2F1dGhfdXNlc19tZnAoc3RhLT53cGFfc20pIHx8CisJICAgIGFjdGlvbl90eXBlICE9IFdOTV9TTEVFUF9NT0RFX0VYSVQpIHsKIAkJbWdtdC0+dS5hY3Rpb24udS53bm1fc2xlZXBfcmVzcC5rZXlkYXRhX2xlbiA9IDA7CiAJfSBlbHNlIHsKIAkJZ3RrX2VsZW1fbGVuID0gd3BhX3dubXNsZWVwX2d0a19zdWJlbGVtKHN0YS0+d3BhX3NtLCBwb3MpOwpAQCAtMTMyLDcgKzEzMiw4IEBACiAJb3NfbWVtY3B5KHBvcywgJndubXNsZWVwX2llLCB3bm1zbGVlcF9pZV9sZW4pOwogCS8qIGNvcHkgVEZTIElFIGhlcmUgKi8KIAlwb3MgKz0gd25tc2xlZXBfaWVfbGVuOwotCW9zX21lbWNweShwb3MsIHdubXRmc19pZSwgd25tdGZzX2llX2xlbik7CisJaWYgKHdubXRmc19pZSkKKwkJb3NfbWVtY3B5KHBvcywgd25tdGZzX2llLCB3bm10ZnNfaWVfbGVuKTsKIAogCWxlbiA9IDEgKyBzaXplb2YobWdtdC0+dS5hY3Rpb24udS53bm1fc2xlZXBfcmVzcCkgKyBndGtfZWxlbV9sZW4gKwogCQlpZ3RrX2VsZW1fbGVuICsgd25tc2xlZXBfaWVfbGVuICsgd25tdGZzX2llX2xlbjsKQEAgLTE1Miw3ICsxNTMsNyBAQAogCQkgKiBXTk0gU2xlZXAKIAkJICovCiAJCWlmICh3bm1zbGVlcF9pZS5zdGF0dXMgPT0gV05NX1NUQVRVU19TTEVFUF9BQ0NFUFQgJiYKLQkJICAgIHdubXNsZWVwX2llLmFjdGlvbl90eXBlID09IDApIHsKKwkJICAgIHdubXNsZWVwX2llLmFjdGlvbl90eXBlID09IFdOTV9TTEVFUF9NT0RFX0VOVEVSKSB7CiAJCQlob3N0YXBkX2Rydl93bm1fb3BlcihoYXBkLCBXTk1fU0xFRVBfRU5URVJfQ09ORklSTSwKIAkJCQkJICAgICBhZGRyLCBOVUxMLCBOVUxMKTsKIAkJCXdwYV9zZXRfd25tc2xlZXAoc3RhLT53cGFfc20sIDEpOwpAQCAtMTYyLDEyICsxNjMsMTQgQEAKIAkJICogMi4gc3RhcnQgR1RLL0lHVEsgdXBkYXRlIGlmIE1GUCBpcyBub3QgdXNlZAogCQkgKiAzLiB1bnBhdXNlIHRoZSBub2RlIGluIGRyaXZlcgogCQkgKi8KLQkJaWYgKHdubXNsZWVwX2llLnN0YXR1cyA9PSBXTk1fU1RBVFVTX1NMRUVQX0FDQ0VQVCAmJgotCQkgICAgd25tc2xlZXBfaWUuYWN0aW9uX3R5cGUgPT0gMSkgeworCQlpZiAoKHdubXNsZWVwX2llLnN0YXR1cyA9PSBXTk1fU1RBVFVTX1NMRUVQX0FDQ0VQVCB8fAorCQkgICAgIHdubXNsZWVwX2llLnN0YXR1cyA9PQorCQkgICAgIFdOTV9TVEFUVVNfU0xFRVBfRVhJVF9BQ0NFUFRfR1RLX1VQREFURSkgJiYKKwkJICAgIHdubXNsZWVwX2llLmFjdGlvbl90eXBlID09IFdOTV9TTEVFUF9NT0RFX0VYSVQpIHsKIAkJCXdwYV9zZXRfd25tc2xlZXAoc3RhLT53cGFfc20sIDApOwogCQkJaG9zdGFwZF9kcnZfd25tX29wZXIoaGFwZCwgV05NX1NMRUVQX0VYSVRfQ09ORklSTSwKIAkJCQkJICAgICBhZGRyLCBOVUxMLCBOVUxMKTsKLQkJCWlmICh3cGFfYXV0aF91c2VzX21mcChzdGEtPndwYV9zbSkgJiYgYWN0aW9uX3R5cGUgPT0gMSkKKwkJCWlmICghd3BhX2F1dGhfdXNlc19tZnAoc3RhLT53cGFfc20pKQogCQkJCXdwYV93bm1zbGVlcF9yZWtleV9ndGsoc3RhLT53cGFfc20pOwogCQl9CiAJfSBlbHNlCkBAIC0xODQsMjkgKzE4NywyOSBAQAogc3RhdGljIHZvaWQgaWVlZTgwMl8xMV9yeF93bm1zbGVlcF9yZXEoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKIAkJCQkgICAgICAgY29uc3QgdTggKmFkZHIsIGNvbnN0IHU4ICpmcm0sIGludCBsZW4pCiB7Ci0JLyoKLQkgKiBBY3Rpb24gWzFdIHwgRGlhbG9nIFRva2VuIFsxXSB8IFdOTS1TbGVlcCBNb2RlIElFIHwKLQkgKiBURlMgUmVzcG9uc2UgSUUKLQkgKi8KLQl1OCAqcG9zID0gKHU4ICopIGZybTsgLyogcG9pbnQgdG8gYWN0aW9uIGZpZWxkICovCi0JdTggZGlhbG9nX3Rva2VuID0gcG9zWzFdOworCS8qIERpYWxvZyBUb2tlbiBbMV0gfCBXTk0tU2xlZXAgTW9kZSBJRSB8IFRGUyBSZXNwb25zZSBJRSAqLworCWNvbnN0IHU4ICpwb3MgPSBmcm07CisJdTggZGlhbG9nX3Rva2VuOwogCXN0cnVjdCB3bm1fc2xlZXBfZWxlbWVudCAqd25tc2xlZXBfaWUgPSBOVUxMOwogCS8qIG11bHRpcGxlIFRGUyBSZXEgSUUgKGFzc3VtaW5nIGNvbnNlY3V0aXZlKSAqLwogCXU4ICp0ZnNyZXFfaWVfc3RhcnQgPSBOVUxMOwogCXU4ICp0ZnNyZXFfaWVfZW5kID0gTlVMTDsKIAl1MTYgdGZzcmVxX2llX2xlbiA9IDA7CiAKLQlwb3MgKz0gMSArIDE7Ci0Jd2hpbGUgKHBvcyAtIGZybSA8IGxlbiAtIDEpIHsKLQkJdTggaWVfbGVuID0gKihwb3MrMSk7CisJZGlhbG9nX3Rva2VuID0gKnBvcysrOworCXdoaWxlIChwb3MgKyAxIDwgZnJtICsgbGVuKSB7CisJCXU4IGllX2xlbiA9IHBvc1sxXTsKKwkJaWYgKHBvcyArIDIgKyBpZV9sZW4gPiBmcm0gKyBsZW4pCisJCQlicmVhazsKIAkJaWYgKCpwb3MgPT0gV0xBTl9FSURfV05NU0xFRVApCi0JCQl3bm1zbGVlcF9pZSA9IChzdHJ1Y3Qgd25tX3NsZWVwX2VsZW1lbnQgKilwb3M7CisJCQl3bm1zbGVlcF9pZSA9IChzdHJ1Y3Qgd25tX3NsZWVwX2VsZW1lbnQgKikgcG9zOwogCQllbHNlIGlmICgqcG9zID09IFdMQU5fRUlEX1RGU19SRVEpIHsKIAkJCWlmICghdGZzcmVxX2llX3N0YXJ0KQotCQkJCXRmc3JlcV9pZV9zdGFydCA9IHBvczsKLQkJCXRmc3JlcV9pZV9lbmQgPSBwb3M7CisJCQkJdGZzcmVxX2llX3N0YXJ0ID0gKHU4ICopIHBvczsKKwkJCXRmc3JlcV9pZV9lbmQgPSAodTggKikgcG9zOwogCQl9IGVsc2UKLQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiRUlEICVkIG5vdCByZWNvZ25pemVkIiwgKnBvcyk7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogRUlEICVkIG5vdCByZWNvZ25pemVkIiwKKwkJCQkgICAqcG9zKTsKIAkJcG9zICs9IGllX2xlbiArIDI7CiAJfQogCkBAIC0yMTUsOCArMjE4LDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICh3bm1zbGVlcF9pZS0+YWN0aW9uX3R5cGUgPT0gMCAmJiB0ZnNyZXFfaWVfc3RhcnQgJiYKLQkgICAgdGZzcmVxX2llX2VuZCAmJiB0ZnNyZXFfaWVfZW5kIC0gdGZzcmVxX2llX3N0YXJ0ID49IDApIHsKKwlpZiAod25tc2xlZXBfaWUtPmFjdGlvbl90eXBlID09IFdOTV9TTEVFUF9NT0RFX0VOVEVSICYmCisJICAgIHRmc3JlcV9pZV9zdGFydCAmJiB0ZnNyZXFfaWVfZW5kICYmCisJICAgIHRmc3JlcV9pZV9lbmQgLSB0ZnNyZXFfaWVfc3RhcnQgPj0gMCkgewogCQl0ZnNyZXFfaWVfbGVuID0gKHRmc3JlcV9pZV9lbmQgKyB0ZnNyZXFfaWVfZW5kWzFdICsgMikgLQogCQkJdGZzcmVxX2llX3N0YXJ0OwogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlRGUyBSZXEgSUUocykgZm91bmQiKTsKQEAgLTIzMSw3ICsyMzUsNyBAQAogCQkJCSAgICAgIHdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSwKIAkJCQkgICAgICB3bm1zbGVlcF9pZS0+aW50dmFsKTsKIAotCWlmICh3bm1zbGVlcF9pZS0+YWN0aW9uX3R5cGUgPT0gMSkgeworCWlmICh3bm1zbGVlcF9pZS0+YWN0aW9uX3R5cGUgPT0gV05NX1NMRUVQX01PREVfRVhJVCkgewogCQkvKiBjbGVhciB0aGUgdGZzIGFmdGVyIHNlbmRpbmcgdGhlIHJlc3AgZnJhbWUgKi8KIAkJaWVlZTgwMjExXzExX3NldF90ZnNfaWUoaGFwZCwgYWRkciwgdGZzcmVxX2llX3N0YXJ0LAogCQkJCQkmdGZzcmVxX2llX2xlbiwgV05NX1NMRUVQX1RGU19JRV9ERUwpOwpAQCAtMjM5LDIwICsyNDMsMjkgQEAKIH0KIAogCi12b2lkIGllZWU4MDJfMTFfcnhfd25tX2FjdGlvbl9hcChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAotCQkJCSBzdHJ1Y3QgcnhfYWN0aW9uICphY3Rpb24pCitpbnQgaWVlZTgwMl8xMV9yeF93bm1fYWN0aW9uX2FwKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCisJCQkJc3RydWN0IHJ4X2FjdGlvbiAqYWN0aW9uKQogewotCXU4ICpwb3MgPSAodTggKikgYWN0aW9uLT5kYXRhICsgMTsgLyogcG9pbnQgdG8gdGhlIGFjdGlvbiBmaWVsZCAqLwotCXU4IGFjdCA9ICpwb3M7CisJaWYgKGFjdGlvbi0+bGVuIDwgMSB8fCBhY3Rpb24tPmRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOwogCi0Jc3dpdGNoIChhY3QpIHsKKwlzd2l0Y2ggKGFjdGlvbi0+ZGF0YVswXSkgeworCWNhc2UgV05NX0JTU19UUkFOU19NR01UX1FVRVJZOgorCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogQlNTIFRyYW5zaXRpb24gTWFuYWdlbWVudCBRdWVyeSIpOworCQkvKiBUT0RPICovCisJCXJldHVybiAtMTsKKwljYXNlIFdOTV9CU1NfVFJBTlNfTUdNVF9SRVNQOgorCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogQlNTIFRyYW5zaXRpb24gTWFuYWdlbWVudCAiCisJCQkgICAiUmVzcG9uc2UiKTsKKwkJLyogVE9ETyAqLworCQlyZXR1cm4gLTE7CiAJY2FzZSBXTk1fU0xFRVBfTU9ERV9SRVE6CiAJCWllZWU4MDJfMTFfcnhfd25tc2xlZXBfcmVxKGhhcGQsIGFjdGlvbi0+c2EsIGFjdGlvbi0+ZGF0YSArIDEsCi0JCQkJCSAgIGFjdGlvbi0+bGVuKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CisJCQkJCSAgIGFjdGlvbi0+bGVuIC0gMSk7CisJCXJldHVybiAwOwogCX0KLX0KIAotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IFVuc3VwcG9ydGVkIFdOTSBBY3Rpb24gJXUgZnJvbSAiIE1BQ1NUUiwKKwkJICAgYWN0aW9uLT5kYXRhWzBdLCBNQUMyU1RSKGFjdGlvbi0+c2EpKTsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9zcmMvYXAvd25tX2FwLmggYi9zcmMvYXAvd25tX2FwLmgKaW5kZXggYWI3YzRmMS4uZjA1NzI2ZSAxMDA2NDQKLS0tIGEvc3JjL2FwL3dubV9hcC5oCisrKyBiL3NyYy9hcC93bm1fYXAuaApAQCAtMTEsNyArMTEsNyBAQAogCiBzdHJ1Y3QgcnhfYWN0aW9uOwogCi12b2lkIGllZWU4MDJfMTFfcnhfd25tX2FjdGlvbl9hcChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAotCQkJCSBzdHJ1Y3QgcnhfYWN0aW9uICphY3Rpb24pOworaW50IGllZWU4MDJfMTFfcnhfd25tX2FjdGlvbl9hcChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJCXN0cnVjdCByeF9hY3Rpb24gKmFjdGlvbik7CiAKICNlbmRpZiAvKiBXTk1fQVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2FwL3dwYV9hdXRoLmMgYi9zcmMvYXAvd3BhX2F1dGguYwppbmRleCA0OWQ4MTc1Li5mYTRiMWNiIDEwMDY0NAotLS0gYS9zcmMvYXAvd3BhX2F1dGguYworKysgYi9zcmMvYXAvd3BhX2F1dGguYwpAQCAtNTQsMTEgKzU0LDEyIEBACiBzdGF0aWMgY29uc3QgaW50IGRvdDExUlNOQUNvbmZpZ1NBVGltZW91dCA9IDYwOwogCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3cGFfYXV0aF9taWNfZmFpbHVyZV9yZXBvcnQoCitzdGF0aWMgaW5saW5lIGludCB3cGFfYXV0aF9taWNfZmFpbHVyZV9yZXBvcnQoCiAJc3RydWN0IHdwYV9hdXRoZW50aWNhdG9yICp3cGFfYXV0aCwgY29uc3QgdTggKmFkZHIpCiB7CiAJaWYgKHdwYV9hdXRoLT5jYi5taWNfZmFpbHVyZV9yZXBvcnQpCi0JCXdwYV9hdXRoLT5jYi5taWNfZmFpbHVyZV9yZXBvcnQod3BhX2F1dGgtPmNiLmN0eCwgYWRkcik7CisJCXJldHVybiB3cGFfYXV0aC0+Y2IubWljX2ZhaWx1cmVfcmVwb3J0KHdwYV9hdXRoLT5jYi5jdHgsIGFkZHIpOworCXJldHVybiAwOwogfQogCiAKQEAgLTI4MSw4ICsyODIsOSBAQAogc3RhdGljIGludCB3cGFfZ3JvdXBfaW5pdF9nbWtfYW5kX2NvdW50ZXIoc3RydWN0IHdwYV9hdXRoZW50aWNhdG9yICp3cGFfYXV0aCwKIAkJCQkJICBzdHJ1Y3Qgd3BhX2dyb3VwICpncm91cCkKIHsKLQl1OCBidWZbRVRIX0FMRU4gKyA4ICsgc2l6ZW9mKGdyb3VwKV07CisJdTggYnVmW0VUSF9BTEVOICsgOCArIHNpemVvZih1bnNpZ25lZCBsb25nKV07CiAJdTggcmtleVszMl07CisJdW5zaWduZWQgbG9uZyBwdHI7CiAKIAlpZiAocmFuZG9tX2dldF9ieXRlcyhncm91cC0+R01LLCBXUEFfR01LX0xFTikgPCAwKQogCQlyZXR1cm4gLTE7CkBAIC0yOTQsNyArMjk2LDggQEAKIAkgKi8KIAlvc19tZW1jcHkoYnVmLCB3cGFfYXV0aC0+YWRkciwgRVRIX0FMRU4pOwogCXdwYV9nZXRfbnRwX3RpbWVzdGFtcChidWYgKyBFVEhfQUxFTik7Ci0Jb3NfbWVtY3B5KGJ1ZiArIEVUSF9BTEVOICsgOCwgJmdyb3VwLCBzaXplb2YoZ3JvdXApKTsKKwlwdHIgPSAodW5zaWduZWQgbG9uZykgZ3JvdXA7CisJb3NfbWVtY3B5KGJ1ZiArIEVUSF9BTEVOICsgOCwgJnB0ciwgc2l6ZW9mKHB0cikpOwogCWlmIChyYW5kb21fZ2V0X2J5dGVzKHJrZXksIHNpemVvZihya2V5KSkgPCAwKQogCQlyZXR1cm4gLTE7CiAKQEAgLTcwMCw4ICs3MDMsOCBAQAogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFSICovCiAKIAotc3RhdGljIHZvaWQgd3BhX3JlY2VpdmVfZXJyb3JfcmVwb3J0KHN0cnVjdCB3cGFfYXV0aGVudGljYXRvciAqd3BhX2F1dGgsCi0JCQkJICAgICBzdHJ1Y3Qgd3BhX3N0YXRlX21hY2hpbmUgKnNtLCBpbnQgZ3JvdXApCitzdGF0aWMgaW50IHdwYV9yZWNlaXZlX2Vycm9yX3JlcG9ydChzdHJ1Y3Qgd3BhX2F1dGhlbnRpY2F0b3IgKndwYV9hdXRoLAorCQkJCSAgICBzdHJ1Y3Qgd3BhX3N0YXRlX21hY2hpbmUgKnNtLCBpbnQgZ3JvdXApCiB7CiAJLyogU3VwcGxpY2FudCByZXBvcnRlZCBhIE1pY2hhZWwgTUlDIGVycm9yICovCiAJd3BhX2F1dGhfdmxvZ2dlcih3cGFfYXV0aCwgc20tPmFkZHIsIExPR0dFUl9JTkZPLApAQCAtNzE4LDcgKzcyMSw4IEBACiAJCQkJImlnbm9yZSBNaWNoYWVsIE1JQyBmYWlsdXJlIHJlcG9ydCBzaW5jZSAiCiAJCQkJInBhaXJ3aXNlIGNpcGhlciBpcyBub3QgVEtJUCIpOwogCX0gZWxzZSB7Ci0JCXdwYV9hdXRoX21pY19mYWlsdXJlX3JlcG9ydCh3cGFfYXV0aCwgc20tPmFkZHIpOworCQlpZiAod3BhX2F1dGhfbWljX2ZhaWx1cmVfcmVwb3J0KHdwYV9hdXRoLCBzbS0+YWRkcikgPiAwKQorCQkJcmV0dXJuIDE7IC8qIFNUQSBlbnRyeSB3YXMgcmVtb3ZlZCAqLwogCQlzbS0+ZG90MTFSU05BU3RhdHNUS0lQUmVtb3RlTUlDRmFpbHVyZXMrKzsKIAkJd3BhX2F1dGgtPmRvdDExUlNOQVN0YXRzVEtJUFJlbW90ZU1JQ0ZhaWx1cmVzKys7CiAJfQpAQCAtNzI4LDYgKzczMiw3IEBACiAJICogQXV0aGVudGljYXRvciBtYXkgZG8gaXQsIGxldCdzIGNoYW5nZSB0aGUga2V5cyBub3cgYW55d2F5LgogCSAqLwogCXdwYV9yZXF1ZXN0X25ld19wdGsoc20pOworCXJldHVybiAwOwogfQogCiAKQEAgLTEwODEsOSArMTA4NiwxMCBAQAogI2VuZGlmIC8qIENPTkZJR19QRUVSS0VZICovCiAJCQlyZXR1cm47CiAJCX0gZWxzZSBpZiAoa2V5X2luZm8gJiBXUEFfS0VZX0lORk9fRVJST1IpIHsKLQkJCXdwYV9yZWNlaXZlX2Vycm9yX3JlcG9ydCgKLQkJCQl3cGFfYXV0aCwgc20sCi0JCQkJIShrZXlfaW5mbyAmIFdQQV9LRVlfSU5GT19LRVlfVFlQRSkpOworCQkJaWYgKHdwYV9yZWNlaXZlX2Vycm9yX3JlcG9ydCgKKwkJCQkgICAgd3BhX2F1dGgsIHNtLAorCQkJCSAgICAhKGtleV9pbmZvICYgV1BBX0tFWV9JTkZPX0tFWV9UWVBFKSkgPiAwKQorCQkJCXJldHVybjsgLyogU1RBIGVudHJ5IHdhcyByZW1vdmVkICovCiAJCX0gZWxzZSBpZiAoa2V5X2luZm8gJiBXUEFfS0VZX0lORk9fS0VZX1RZUEUpIHsKIAkJCXdwYV9hdXRoX2xvZ2dlcih3cGFfYXV0aCwgc20tPmFkZHIsIExPR0dFUl9JTkZPLAogCQkJCQkicmVjZWl2ZWQgRUFQT0wtS2V5IFJlcXVlc3QgZm9yIG5ldyAiCkBAIC0yNDA5LDExICsyNDE1LDkgQEAKIAkJCQkibWFya2luZyBzdGF0aW9uIGZvciBHVEsgcmVrZXlpbmciKTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVgotCS8qIERvIG5vdCByZWtleSBHVEsvSUdUSyB3aGVuIFNUQSBpcyBpbiB3bm1zbGVlcCAqLworCS8qIERvIG5vdCByZWtleSBHVEsvSUdUSyB3aGVuIFNUQSBpcyBpbiBXTk0tU2xlZXAgTW9kZSAqLwogCWlmIChzbS0+aXNfd25tc2xlZXApCiAJCXJldHVybiAwOwotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCiAKIAlzbS0+Z3JvdXAtPkdLZXlEb25lU3RhdGlvbnMrKzsKIAlzbS0+R1VwZGF0ZVN0YXRpb25LZXlzID0gVFJVRTsKQEAgLTI0MjMsOCArMjQyNyw4IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCi0vKiB1cGRhdGUgR1RLIHdoZW4gZXhpdGluZyB3bm1zbGVlcCBtb2RlICovCisjaWZkZWYgQ09ORklHX1dOTQorLyogdXBkYXRlIEdUSyB3aGVuIGV4aXRpbmcgV05NLVNsZWVwIE1vZGUgKi8KIHZvaWQgd3BhX3dubXNsZWVwX3Jla2V5X2d0ayhzdHJ1Y3Qgd3BhX3N0YXRlX21hY2hpbmUgKnNtKQogewogCWlmIChzbS0+aXNfd25tc2xlZXApCkBAIC0yNDQyLDExMSArMjQ0Niw2NSBAQAogCiBpbnQgd3BhX3dubXNsZWVwX2d0a19zdWJlbGVtKHN0cnVjdCB3cGFfc3RhdGVfbWFjaGluZSAqc20sIHU4ICpwb3MpCiB7Ci0JdTggKnN1YmVsZW07CiAJc3RydWN0IHdwYV9ncm91cCAqZ3NtID0gc20tPmdyb3VwOwotCXNpemVfdCBzdWJlbGVtX2xlbiwgcGFkX2xlbjsKLQljb25zdCB1OCAqa2V5OwotCXNpemVfdCBrZXlfbGVuOwotCXU4IGtleWJ1ZlszMl07Ci0KLQkvKiBHVEsgc3Vic2xlbWVudCAqLwotCWtleV9sZW4gPSBnc20tPkdUS19sZW47Ci0JaWYgKGtleV9sZW4gPiBzaXplb2Yoa2V5YnVmKSkKLQkJcmV0dXJuIDA7CisJdTggKnN0YXJ0ID0gcG9zOwogCiAJLyoKLQkgKiBQYWQga2V5IGZvciBBRVMgS2V5IFdyYXAgaWYgaXQgaXMgbm90IG11bHRpcGxlIG9mIDggYnl0ZXMgb3IgaXMgbGVzcwotCSAqIHRoYW4gMTYgYnl0ZXMuCi0JICovCi0JcGFkX2xlbiA9IGtleV9sZW4gJSA4OwotCWlmIChwYWRfbGVuKQotCQlwYWRfbGVuID0gOCAtIHBhZF9sZW47Ci0JaWYgKGtleV9sZW4gKyBwYWRfbGVuIDwgMTYpCi0JCXBhZF9sZW4gKz0gODsKLQlpZiAocGFkX2xlbikgewotCQlvc19tZW1jcHkoa2V5YnVmLCBnc20tPkdUS1tnc20tPkdOIC0gMV0sIGtleV9sZW4pOwotCQlvc19tZW1zZXQoa2V5YnVmICsga2V5X2xlbiwgMCwgcGFkX2xlbik7Ci0JCWtleWJ1ZltrZXlfbGVuXSA9IDB4ZGQ7Ci0JCWtleV9sZW4gKz0gcGFkX2xlbjsKLQkJa2V5ID0ga2V5YnVmOwotCX0gZWxzZQotCQlrZXkgPSBnc20tPkdUS1tnc20tPkdOIC0gMV07Ci0KLQkvKgorCSAqIEdUSyBzdWJlbGVtZW50OgogCSAqIFN1Yi1lbGVtIElEWzFdIHwgTGVuZ3RoWzFdIHwgS2V5IEluZm9bMl0gfCBLZXkgTGVuZ3RoWzFdIHwgUlNDWzhdIHwKLQkgKiBLZXlbNS4uMzJdIHwgOCBwYWRkaW5nLgorCSAqIEtleVs1Li4zMl0KIAkgKi8KLQlzdWJlbGVtX2xlbiA9IDEzICsga2V5X2xlbiArIDg7Ci0Jc3ViZWxlbSA9IG9zX3phbGxvYyhzdWJlbGVtX2xlbik7Ci0JaWYgKHN1YmVsZW0gPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlzdWJlbGVtWzBdID0gV05NX1NMRUVQX1NVQkVMRU1fR1RLOwotCXN1YmVsZW1bMV0gPSAxMSArIGtleV9sZW4gKyA4OworCSpwb3MrKyA9IFdOTV9TTEVFUF9TVUJFTEVNX0dUSzsKKwkqcG9zKysgPSAxMSArIGdzbS0+R1RLX2xlbjsKIAkvKiBLZXkgSUQgaW4gQjAtQjEgb2YgS2V5IEluZm8gKi8KLQlXUEFfUFVUX0xFMTYoJnN1YmVsZW1bMl0sIGdzbS0+R04gJiAweDAzKTsKLQlzdWJlbGVtWzRdID0gZ3NtLT5HVEtfbGVuOwotCWlmICh3cGFfYXV0aF9nZXRfc2VxbnVtKHNtLT53cGFfYXV0aCwgTlVMTCwgZ3NtLT5HTiwgc3ViZWxlbSArIDUpICE9IDApCi0JewotCQlvc19mcmVlKHN1YmVsZW0pOworCVdQQV9QVVRfTEUxNihwb3MsIGdzbS0+R04gJiAweDAzKTsKKwlwb3MgKz0gMjsKKwkqcG9zKysgPSBnc20tPkdUS19sZW47CisJaWYgKHdwYV9hdXRoX2dldF9zZXFudW0oc20tPndwYV9hdXRoLCBOVUxMLCBnc20tPkdOLCBwb3MpICE9IDApCiAJCXJldHVybiAwOwotCX0KLQlpZiAoYWVzX3dyYXAoc20tPlBUSy5rZWssIGtleV9sZW4gLyA4LCBrZXksIHN1YmVsZW0gKyAxMykpIHsKLQkJb3NfZnJlZShzdWJlbGVtKTsKLQkJcmV0dXJuIDA7Ci0JfQorCXBvcyArPSA4OworCW9zX21lbWNweShwb3MsIGdzbS0+R1RLW2dzbS0+R04gLSAxXSwgZ3NtLT5HVEtfbGVuKTsKKwlwb3MgKz0gZ3NtLT5HVEtfbGVuOwogCi0Jb3NfbWVtY3B5KHBvcywgc3ViZWxlbSwgc3ViZWxlbV9sZW4pOwotCi0Jd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIlBsYWludGV4dCBHVEsiLAorCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBHVEsgS2V5IElEICV1IGluIFdOTS1TbGVlcCBNb2RlIGV4aXQiLAorCQkgICBnc20tPkdOKTsKKwl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiV05NOiBHVEsgaW4gV05NLVNsZWVwIE1vZGUgZXhpdCIsCiAJCQlnc20tPkdUS1tnc20tPkdOIC0gMV0sIGdzbS0+R1RLX2xlbik7Ci0Jb3NfZnJlZShzdWJlbGVtKTsKIAotCXJldHVybiBzdWJlbGVtX2xlbjsKKwlyZXR1cm4gcG9zIC0gc3RhcnQ7CiB9CiAKIAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCiBpbnQgd3BhX3dubXNsZWVwX2lndGtfc3ViZWxlbShzdHJ1Y3Qgd3BhX3N0YXRlX21hY2hpbmUgKnNtLCB1OCAqcG9zKQogewotCXU4ICpzdWJlbGVtLCAqcHRyOwogCXN0cnVjdCB3cGFfZ3JvdXAgKmdzbSA9IHNtLT5ncm91cDsKLQlzaXplX3Qgc3ViZWxlbV9sZW47CisJdTggKnN0YXJ0ID0gcG9zOwogCi0JLyogSUdUSyBzdWJlbGVtZW50Ci0JICogU3ViLWVsZW0gSURbMV0gfCBMZW5ndGhbMV0gfCBLZXlJRFsyXSB8IFBOWzZdIHwKLQkgKiBLZXlbMTZdIHwgOCBwYWRkaW5nICovCi0Jc3ViZWxlbV9sZW4gPSAxICsgMSArIDIgKyA2ICsgV1BBX0lHVEtfTEVOICsgODsKLQlzdWJlbGVtID0gb3NfemFsbG9jKHN1YmVsZW1fbGVuKTsKLQlpZiAoc3ViZWxlbSA9PSBOVUxMKQorCS8qCisJICogSUdUSyBzdWJlbGVtZW50OgorCSAqIFN1Yi1lbGVtIElEWzFdIHwgTGVuZ3RoWzFdIHwgS2V5SURbMl0gfCBQTls2XSB8IEtleVsxNl0KKwkgKi8KKwkqcG9zKysgPSBXTk1fU0xFRVBfU1VCRUxFTV9JR1RLOworCSpwb3MrKyA9IDIgKyA2ICsgV1BBX0lHVEtfTEVOOworCVdQQV9QVVRfTEUxNihwb3MsIGdzbS0+R05faWd0ayk7CisJcG9zICs9IDI7CisJaWYgKHdwYV9hdXRoX2dldF9zZXFudW0oc20tPndwYV9hdXRoLCBOVUxMLCBnc20tPkdOX2lndGssIHBvcykgIT0gMCkKIAkJcmV0dXJuIDA7CisJcG9zICs9IDY7CiAKLQlwdHIgPSBzdWJlbGVtOwotCSpwdHIrKyA9IFdOTV9TTEVFUF9TVUJFTEVNX0lHVEs7Ci0JKnB0cisrID0gc3ViZWxlbV9sZW4gLSAyOwotCVdQQV9QVVRfTEUxNihwdHIsIGdzbS0+R05faWd0ayk7Ci0JcHRyICs9IDI7Ci0JaWYgKHdwYV9hdXRoX2dldF9zZXFudW0oc20tPndwYV9hdXRoLCBOVUxMLCBnc20tPkdOX2lndGssIHB0cikgIT0gMCkgewotCQlvc19mcmVlKHN1YmVsZW0pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcHRyICs9IDY7Ci0JaWYgKGFlc193cmFwKHNtLT5QVEsua2VrLCBXUEFfSUdUS19MRU4gLyA4LAotCQkgICAgIGdzbS0+SUdUS1tnc20tPkdOX2lndGsgLSA0XSwgcHRyKSkgewotCQlvc19mcmVlKHN1YmVsZW0pOwotCQlyZXR1cm4gLTE7Ci0JfQorCW9zX21lbWNweShwb3MsIGdzbS0+SUdUS1tnc20tPkdOX2lndGsgLSA0XSwgV1BBX0lHVEtfTEVOKTsKKwlwb3MgKz0gV1BBX0lHVEtfTEVOOwogCi0Jb3NfbWVtY3B5KHBvcywgc3ViZWxlbSwgc3ViZWxlbV9sZW4pOwotCi0Jd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIlBsYWludGV4dCBJR1RLIiwKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogSUdUSyBLZXkgSUQgJXUgaW4gV05NLVNsZWVwIE1vZGUgZXhpdCIsCisJCSAgIGdzbS0+R05faWd0ayk7CisJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIldOTTogSUdUSyBpbiBXTk0tU2xlZXAgTW9kZSBleGl0IiwKIAkJCWdzbS0+SUdUS1tnc20tPkdOX2lndGsgLSA0XSwgV1BBX0lHVEtfTEVOKTsKLQlvc19mcmVlKHN1YmVsZW0pOwogCi0JcmV0dXJuIHN1YmVsZW1fbGVuOworCXJldHVybiBwb3MgLSBzdGFydDsKIH0KICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogCiAKIHN0YXRpYyB2b2lkIHdwYV9ncm91cF9zZXRrZXlzKHN0cnVjdCB3cGFfYXV0aGVudGljYXRvciAqd3BhX2F1dGgsCkBAIC0zMDU2LDMgKzMwMTQsMTEgQEAKIAkJCQkgICAgICAgd3BhX3NlbmRfZWFwb2xfdGltZW91dCwgd3BhX2F1dGgsIHNtKTsKIAl9CiB9CisKKworaW50IHdwYV9hdXRoX3VzZXNfc2FlKHN0cnVjdCB3cGFfc3RhdGVfbWFjaGluZSAqc20pCit7CisJaWYgKHNtID09IE5VTEwpCisJCXJldHVybiAwOworCXJldHVybiB3cGFfa2V5X21nbXRfc2FlKHNtLT53cGFfa2V5X21nbXQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2FwL3dwYV9hdXRoLmggYi9zcmMvYXAvd3BhX2F1dGguaAppbmRleCA5MWJhNDk5Li40NjVlZWM2IDEwMDY0NAotLS0gYS9zcmMvYXAvd3BhX2F1dGguaAorKysgYi9zcmMvYXAvd3BhX2F1dGguaApAQCAtMTc3LDcgKzE3Nyw3IEBACiAJdm9pZCAoKmxvZ2dlcikodm9pZCAqY3R4LCBjb25zdCB1OCAqYWRkciwgbG9nZ2VyX2xldmVsIGxldmVsLAogCQkgICAgICAgY29uc3QgY2hhciAqdHh0KTsKIAl2b2lkICgqZGlzY29ubmVjdCkodm9pZCAqY3R4LCBjb25zdCB1OCAqYWRkciwgdTE2IHJlYXNvbik7Ci0Jdm9pZCAoKm1pY19mYWlsdXJlX3JlcG9ydCkodm9pZCAqY3R4LCBjb25zdCB1OCAqYWRkcik7CisJaW50ICgqbWljX2ZhaWx1cmVfcmVwb3J0KSh2b2lkICpjdHgsIGNvbnN0IHU4ICphZGRyKTsKIAl2b2lkICgqc2V0X2VhcG9sKSh2b2lkICpjdHgsIGNvbnN0IHU4ICphZGRyLCB3cGFfZWFwb2xfdmFyaWFibGUgdmFyLAogCQkJICBpbnQgdmFsdWUpOwogCWludCAoKmdldF9lYXBvbCkodm9pZCAqY3R4LCBjb25zdCB1OCAqYWRkciwgd3BhX2VhcG9sX3ZhcmlhYmxlIHZhcik7CkBAIC0yODIsMTMgKzI4MiwxMSBAQAogdm9pZCB3cGFfZnRfcHVzaF9wbWtfcjEoc3RydWN0IHdwYV9hdXRoZW50aWNhdG9yICp3cGFfYXV0aCwgY29uc3QgdTggKmFkZHIpOwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFSICovCiAKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVgogdm9pZCB3cGFfd25tc2xlZXBfcmVrZXlfZ3RrKHN0cnVjdCB3cGFfc3RhdGVfbWFjaGluZSAqc20pOwogdm9pZCB3cGFfc2V0X3dubXNsZWVwKHN0cnVjdCB3cGFfc3RhdGVfbWFjaGluZSAqc20sIGludCBmbGFnKTsKIGludCB3cGFfd25tc2xlZXBfZ3RrX3N1YmVsZW0oc3RydWN0IHdwYV9zdGF0ZV9tYWNoaW5lICpzbSwgdTggKnBvcyk7Ci0jaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKIGludCB3cGFfd25tc2xlZXBfaWd0a19zdWJlbGVtKHN0cnVjdCB3cGFfc3RhdGVfbWFjaGluZSAqc20sIHU4ICpwb3MpOwotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCi0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KKworaW50IHdwYV9hdXRoX3VzZXNfc2FlKHN0cnVjdCB3cGFfc3RhdGVfbWFjaGluZSAqc20pOwogCiAjZW5kaWYgLyogV1BBX0FVVEhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2FwL3dwYV9hdXRoX2Z0LmMgYi9zcmMvYXAvd3BhX2F1dGhfZnQuYwppbmRleCA0OGJmNzliLi5jY2IzZjgyIDEwMDY0NAotLS0gYS9zcmMvYXAvd3BhX2F1dGhfZnQuYworKysgYi9zcmMvYXAvd3BhX2F1dGhfZnQuYwpAQCAtNDE2LDcgKzQxNiw3IEBACiAJCXBhZF9sZW4gPSA4IC0gcGFkX2xlbjsKIAlpZiAoa2V5X2xlbiArIHBhZF9sZW4gPCAxNikKIAkJcGFkX2xlbiArPSA4OwotCWlmIChwYWRfbGVuKSB7CisJaWYgKHBhZF9sZW4gJiYga2V5X2xlbiA8IHNpemVvZihrZXlidWYpKSB7CiAJCW9zX21lbWNweShrZXlidWYsIGdzbS0+R1RLW2dzbS0+R04gLSAxXSwga2V5X2xlbik7CiAJCW9zX21lbXNldChrZXlidWYgKyBrZXlfbGVuLCAwLCBwYWRfbGVuKTsKIAkJa2V5YnVmW2tleV9sZW5dID0gMHhkZDsKZGlmZiAtLWdpdCBhL3NyYy9hcC93cGFfYXV0aF9nbHVlLmMgYi9zcmMvYXAvd3BhX2F1dGhfZ2x1ZS5jCmluZGV4IGJkYzg5ZTQuLmZkYWFhZmYgMTAwNjQ0Ci0tLSBhL3NyYy9hcC93cGFfYXV0aF9nbHVlLmMKKysrIGIvc3JjL2FwL3dwYV9hdXRoX2dsdWUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBob3N0YXBkIC8gV1BBIGF1dGhlbnRpY2F0b3IgZ2x1ZSBjb2RlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMSwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlICJ1dGlscy9jb21tb24uaCIKICNpbmNsdWRlICJjb21tb24vaWVlZTgwMl8xMV9kZWZzLmgiCisjaW5jbHVkZSAiY29tbW9uL3NhZS5oIgogI2luY2x1ZGUgImVhcG9sX2F1dGgvZWFwb2xfYXV0aF9zbS5oIgogI2luY2x1ZGUgImVhcG9sX2F1dGgvZWFwb2xfYXV0aF9zbV9pLmgiCiAjaW5jbHVkZSAiZWFwX3NlcnZlci9lYXAuaCIKQEAgLTExMiwxMCArMTEzLDEwIEBACiB9CiAKIAotc3RhdGljIHZvaWQgaG9zdGFwZF93cGFfYXV0aF9taWNfZmFpbHVyZV9yZXBvcnQodm9pZCAqY3R4LCBjb25zdCB1OCAqYWRkcikKK3N0YXRpYyBpbnQgaG9zdGFwZF93cGFfYXV0aF9taWNfZmFpbHVyZV9yZXBvcnQodm9pZCAqY3R4LCBjb25zdCB1OCAqYWRkcikKIHsKIAlzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkID0gY3R4OwotCW1pY2hhZWxfbWljX2ZhaWx1cmUoaGFwZCwgYWRkciwgMCk7CisJcmV0dXJuIG1pY2hhZWxfbWljX2ZhaWx1cmUoaGFwZCwgYWRkciwgMCk7CiB9CiAKIApAQCAtMTg0LDE0ICsxODUsMzIgQEAKIHsKIAlzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkID0gY3R4OwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gYXBfZ2V0X3N0YShoYXBkLCBhZGRyKTsKLQljb25zdCB1OCAqcHNrID0gaG9zdGFwZF9nZXRfcHNrKGhhcGQtPmNvbmYsIGFkZHIsIHByZXZfcHNrKTsKKwljb25zdCB1OCAqcHNrOworCisjaWZkZWYgQ09ORklHX1NBRQorCWlmIChzdGEgJiYgc3RhLT5hdXRoX2FsZyA9PSBXTEFOX0FVVEhfU0FFKSB7CisJCWlmICghc3RhLT5zYWUgfHwgcHJldl9wc2spCisJCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIHN0YS0+c2FlLT5wbWs7CisJfQorI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KKworCXBzayA9IGhvc3RhcGRfZ2V0X3BzayhoYXBkLT5jb25mLCBhZGRyLCBwcmV2X3Bzayk7CiAJLyoKIAkgKiBUaGlzIGlzIGFib3V0IHRvIGl0ZXJhdGUgb3ZlciBhbGwgcHNrcywgcHJldl9wc2sgZ2l2ZXMgdGhlIGxhc3QKIAkgKiByZXR1cm5lZCBwc2sgd2hpY2ggc2hvdWxkIG5vdCBiZSByZXR1cm5lZCBhZ2Fpbi4KLQkgKiBsb2dpYyBsaXN0IChhbGwgaG9zdGFwZF9nZXRfcHNrOyBzdGEtPnBzaykKKwkgKiBsb2dpYyBsaXN0IChhbGwgaG9zdGFwZF9nZXRfcHNrOyBhbGwgc3RhLT5wc2spCiAJICovCi0JaWYgKHN0YSAmJiBzdGEtPnBzayAmJiAhcHNrICYmIHN0YS0+cHNrICE9IHByZXZfcHNrKQotCQlwc2sgPSBzdGEtPnBzazsKKwlpZiAoc3RhICYmIHN0YS0+cHNrICYmICFwc2spIHsKKwkJc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKnBvczsKKwkJcHNrID0gc3RhLT5wc2stPnBzazsKKwkJZm9yIChwb3MgPSBzdGEtPnBzazsgcG9zOyBwb3MgPSBwb3MtPm5leHQpIHsKKwkJCWlmIChwb3MtPnBzayA9PSBwcmV2X3BzaykgeworCQkJCXBzayA9IHBvcy0+bmV4dCA/IHBvcy0+bmV4dC0+cHNrIDogTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KIAlyZXR1cm4gcHNrOwogfQogCmRpZmYgLS1naXQgYS9zcmMvYXAvd3BhX2F1dGhfaS5oIGIvc3JjL2FwL3dwYV9hdXRoX2kuaAppbmRleCBkNWNmMmM1Li45NzQ4OWQzIDEwMDY0NAotLS0gYS9zcmMvYXAvd3BhX2F1dGhfaS5oCisrKyBiL3NyYy9hcC93cGFfYXV0aF9pLmgKQEAgLTg3LDkgKzg3LDcgQEAKIAl1bnNpZ25lZCBpbnQgZnRfY29tcGxldGVkOjE7CiAJdW5zaWduZWQgaW50IHBta19yMV9uYW1lX3ZhbGlkOjE7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVgogCXVuc2lnbmVkIGludCBpc193bm1zbGVlcDoxOwotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCiAKIAl1OCByZXFfcmVwbGF5X2NvdW50ZXJbV1BBX1JFUExBWV9DT1VOVEVSX0xFTl07CiAJaW50IHJlcV9yZXBsYXlfY291bnRlcl91c2VkOwpkaWZmIC0tZ2l0IGEvc3JjL2FwL3dwYV9hdXRoX2llLmMgYi9zcmMvYXAvd3BhX2F1dGhfaWUuYwppbmRleCAxNzg2MjMwLi5jZGZjY2ExIDEwMDY0NAotLS0gYS9zcmMvYXAvd3BhX2F1dGhfaWUuYworKysgYi9zcmMvYXAvd3BhX2F1dGhfaWUuYwpAQCAtMTg4LDYgKzE4OCwxOCBAQAogCQludW1fc3VpdGVzKys7CiAJfQogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCisjaWZkZWYgQ09ORklHX1NBRQorCWlmIChjb25mLT53cGFfa2V5X21nbXQgJiBXUEFfS0VZX01HTVRfU0FFKSB7CisJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBSU05fQVVUSF9LRVlfTUdNVF9TQUUpOworCQlwb3MgKz0gUlNOX1NFTEVDVE9SX0xFTjsKKwkJbnVtX3N1aXRlcysrOworCX0KKwlpZiAoY29uZi0+d3BhX2tleV9tZ210ICYgV1BBX0tFWV9NR01UX0ZUX1NBRSkgeworCQlSU05fU0VMRUNUT1JfUFVUKHBvcywgUlNOX0FVVEhfS0VZX01HTVRfRlRfU0FFKTsKKwkJcG9zICs9IFJTTl9TRUxFQ1RPUl9MRU47CisJCW51bV9zdWl0ZXMrKzsKKwl9CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCiAjaWZkZWYgQ09ORklHX1JTTl9URVNUSU5HCiAJaWYgKHJzbl90ZXN0aW5nKSB7CkBAIC00MDcsNiArNDE5LDEyIEBACiAJCWVsc2UgaWYgKGRhdGEua2V5X21nbXQgJiBXUEFfS0VZX01HTVRfUFNLX1NIQTI1NikKIAkJCXNlbGVjdG9yID0gUlNOX0FVVEhfS0VZX01HTVRfUFNLX1NIQTI1NjsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLworI2lmZGVmIENPTkZJR19TQUUKKwkJZWxzZSBpZiAoZGF0YS5rZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9TQUUpCisJCQlzZWxlY3RvciA9IFJTTl9BVVRIX0tFWV9NR01UX1NBRTsKKwkJZWxzZSBpZiAoZGF0YS5rZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9GVF9TQUUpCisJCQlzZWxlY3RvciA9IFJTTl9BVVRIX0tFWV9NR01UX0ZUX1NBRTsKKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiAJCWVsc2UgaWYgKGRhdGEua2V5X21nbXQgJiBXUEFfS0VZX01HTVRfSUVFRTgwMjFYKQogCQkJc2VsZWN0b3IgPSBSU05fQVVUSF9LRVlfTUdNVF9VTlNQRUNfODAyXzFYOwogCQllbHNlIGlmIChkYXRhLmtleV9tZ210ICYgV1BBX0tFWV9NR01UX1BTSykKQEAgLTQ3OSw2ICs0OTcsMTIgQEAKIAllbHNlIGlmIChrZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9QU0tfU0hBMjU2KQogCQlzbS0+d3BhX2tleV9tZ210ID0gV1BBX0tFWV9NR01UX1BTS19TSEEyNTY7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KKyNpZmRlZiBDT05GSUdfU0FFCisJZWxzZSBpZiAoa2V5X21nbXQgJiBXUEFfS0VZX01HTVRfU0FFKQorCQlzbS0+d3BhX2tleV9tZ210ID0gV1BBX0tFWV9NR01UX1NBRTsKKwllbHNlIGlmIChrZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9GVF9TQUUpCisJCXNtLT53cGFfa2V5X21nbXQgPSBXUEFfS0VZX01HTVRfRlRfU0FFOworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KIAllbHNlIGlmIChrZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9JRUVFODAyMVgpCiAJCXNtLT53cGFfa2V5X21nbXQgPSBXUEFfS0VZX01HTVRfSUVFRTgwMjFYOwogCWVsc2UKQEAgLTU0MCwxMiArNTY0LDkgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KIAotCWlmIChjaXBoZXJzICYgV1BBX0NJUEhFUl9DQ01QKQotCQlzbS0+cGFpcndpc2UgPSBXUEFfQ0lQSEVSX0NDTVA7Ci0JZWxzZSBpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfR0NNUCkKLQkJc20tPnBhaXJ3aXNlID0gV1BBX0NJUEhFUl9HQ01QOwotCWVsc2UKLQkJc20tPnBhaXJ3aXNlID0gV1BBX0NJUEhFUl9US0lQOworCXNtLT5wYWlyd2lzZSA9IHdwYV9waWNrX3BhaXJ3aXNlX2NpcGhlcihjaXBoZXJzLCAwKTsKKwlpZiAoc20tPnBhaXJ3aXNlIDwgMCkKKwkJcmV0dXJuIFdQQV9JTlZBTElEX1BBSVJXSVNFOwogCiAJLyogVE9ETzogY2xlYXIgV1BBL1dQQTIgc3RhdGUgaWYgU1RBIGNoYW5nZXMgZnJvbSBvbmUgdG8gYW5vdGhlciAqLwogCWlmICh3cGFfaWVbMF0gPT0gV0xBTl9FSURfUlNOKQpkaWZmIC0tZ2l0IGEvc3JjL2FwL3dwc19ob3N0YXBkLmMgYi9zcmMvYXAvd3BzX2hvc3RhcGQuYwppbmRleCA1ZTQ0YzcyLi5lMDE3OTcyIDEwMDY0NAotLS0gYS9zcmMvYXAvd3BzX2hvc3RhcGQuYworKysgYi9zcmMvYXAvd3BzX2hvc3RhcGQuYwpAQCAtMTEsOCArMTEsNiBAQAogI2luY2x1ZGUgInV0aWxzL2NvbW1vbi5oIgogI2luY2x1ZGUgInV0aWxzL2Vsb29wLmgiCiAjaW5jbHVkZSAidXRpbHMvdXVpZC5oIgotI2luY2x1ZGUgImNyeXB0by9kaF9ncm91cHMuaCIKLSNpbmNsdWRlICJjcnlwdG8vZGhfZ3JvdXA1LmgiCiAjaW5jbHVkZSAiY29tbW9uL3dwYV9jdHJsLmgiCiAjaW5jbHVkZSAiY29tbW9uL2llZWU4MDJfMTFfZGVmcy5oIgogI2luY2x1ZGUgImNvbW1vbi9pZWVlODAyXzExX2NvbW1vbi5oIgpAQCAtOTU5LDYgKzk1Nyw5IEBACiAJaWYgKGNvbmYtPnNzaWQuc2VjdXJpdHlfcG9saWN5ID09IFNFQ1VSSVRZX1NUQVRJQ19XRVApCiAJCWNmZy5zdGF0aWNfd2VwX29ubHkgPSAxOwogCWNmZy5kdWFsYmFuZCA9IGludGVyZmFjZV9jb3VudChoYXBkLT5pZmFjZSkgPiAxOworCWlmICgod3BzLT5kZXYucmZfYmFuZHMgJiAoV1BTX1JGXzUwR0haIHwgV1BTX1JGXzI0R0haKSkgPT0KKwkgICAgKFdQU19SRl81MEdIWiB8IFdQU19SRl8yNEdIWikpCisJCWNmZy5kdWFsYmFuZCA9IDE7CiAJaWYgKGNmZy5kdWFsYmFuZCkKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IER1YWxiYW5kIEFQIik7CiAKQEAgLTEwMzYsOCArMTAzNyw2IEBACiAJd3BzX2RldmljZV9kYXRhX2ZyZWUoJmhhcGQtPndwcy0+ZGV2KTsKIAl3cGFidWZfZnJlZShoYXBkLT53cHMtPmRoX3B1YmtleSk7CiAJd3BhYnVmX2ZyZWUoaGFwZC0+d3BzLT5kaF9wcml2a2V5KTsKLQl3cGFidWZfZnJlZShoYXBkLT53cHMtPm9vYl9jb25mLnB1YmtleV9oYXNoKTsKLQl3cGFidWZfZnJlZShoYXBkLT53cHMtPm9vYl9jb25mLmRldl9wYXNzd29yZCk7CiAJd3BzX2ZyZWVfcGVuZGluZ19tc2dzKGhhcGQtPndwcy0+dXBucF9tc2dzKTsKIAlob3N0YXBkX3dwc19uZmNfY2xlYXIoaGFwZC0+d3BzKTsKIAlvc19mcmVlKGhhcGQtPndwcyk7CkBAIC0xMTU1LDYwICsxMTU0LDYgQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX1dQU19PT0IKLWludCBob3N0YXBkX3dwc19zdGFydF9vb2Ioc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgY2hhciAqZGV2aWNlX3R5cGUsCi0JCQkgIGNoYXIgKnBhdGgsIGNoYXIgKm1ldGhvZCwgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3Qgd3BzX2NvbnRleHQgKndwcyA9IGhhcGQtPndwczsKLQlzdHJ1Y3Qgb29iX2RldmljZV9kYXRhICpvb2JfZGV2OwotCi0Jb29iX2RldiA9IHdwc19nZXRfb29iX2RldmljZShkZXZpY2VfdHlwZSk7Ci0JaWYgKG9vYl9kZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCW9vYl9kZXYtPmRldmljZV9wYXRoID0gcGF0aDsKLQlvb2JfZGV2LT5kZXZpY2VfbmFtZSA9IG5hbWU7Ci0Jd3BzLT5vb2JfY29uZi5vb2JfbWV0aG9kID0gd3BzX2dldF9vb2JfbWV0aG9kKG1ldGhvZCk7Ci0KLQlpZiAod3BzLT5vb2JfY29uZi5vb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfREVWX1BXRF9SKSB7Ci0JCS8qCi0JCSAqIFVzZSBwcmUtY29uZmlndXJlZCBESCBrZXlzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gd3JpdGUgdGhlCi0JCSAqIGtleSBoYXNoIGludG8gdGhlIE9PQiBmaWxlLgotCQkgKi8KLQkJd3BhYnVmX2ZyZWUod3BzLT5kaF9wdWJrZXkpOwotCQl3cGFidWZfZnJlZSh3cHMtPmRoX3ByaXZrZXkpOwotCQl3cHMtPmRoX3ByaXZrZXkgPSBOVUxMOwotCQl3cHMtPmRoX3B1YmtleSA9IGRoX2luaXQoZGhfZ3JvdXBzX2dldChXUFNfREhfR1JPVVApLAotCQkJCQkgJndwcy0+ZGhfcHJpdmtleSk7Ci0JCXdwcy0+ZGhfcHVia2V5ID0gd3BhYnVmX3plcm9wYWQod3BzLT5kaF9wdWJrZXksIDE5Mik7Ci0JCWlmICh3cHMtPmRoX3B1YmtleSA9PSBOVUxMKSB7Ci0JCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogRmFpbGVkIHRvIGluaXRpYWxpemUgIgotCQkJCSAgICJEaWZmaWUtSGVsbG1hbiBoYW5kc2hha2UiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCWlmICh3cHNfcHJvY2Vzc19vb2Iod3BzLCBvb2JfZGV2LCAxKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAoKHdwcy0+b29iX2NvbmYub29iX21ldGhvZCA9PSBPT0JfTUVUSE9EX0RFVl9QV0RfRSB8fAotCSAgICAgd3BzLT5vb2JfY29uZi5vb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfREVWX1BXRF9SKSAmJgotCSAgICBob3N0YXBkX3dwc19hZGRfcGluKGhhcGQsIE5VTEwsICJhbnkiLAotCQkJCXdwYWJ1Zl9oZWFkKHdwcy0+b29iX2NvbmYuZGV2X3Bhc3N3b3JkKSwgMCkgPAotCSAgICAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yOgotCXdwYWJ1Zl9mcmVlKHdwcy0+ZGhfcHVia2V5KTsKLQl3cHMtPmRoX3B1YmtleSA9IE5VTEw7Ci0Jd3BhYnVmX2ZyZWUod3BzLT5kaF9wcml2a2V5KTsKLQl3cHMtPmRoX3ByaXZrZXkgPSBOVUxMOwotCXJldHVybiAtMTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfV1BTX09PQiAqLwotCi0KIHN0YXRpYyBpbnQgaG9zdGFwZF93cHNfcHJvYmVfcmVxX3J4KHZvaWQgKmN0eCwgY29uc3QgdTggKmFkZHIsIGNvbnN0IHU4ICpkYSwKIAkJCQkgICAgY29uc3QgdTggKmJzc2lkLAogCQkJCSAgICBjb25zdCB1OCAqaWUsIHNpemVfdCBpZV9sZW4sCkBAIC0xNjM4LDggKzE1ODMsMjUgQEAKIH0KIAogCitzdHJ1Y3Qgd3BhYnVmICogaG9zdGFwZF93cHNfbmZjX2hzX2NyKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGludCBuZGVmKQoreworCS8qCisJICogSGFuZG92ZXIgU2VsZWN0IGNhcnJpZXIgcmVjb3JkIGZvciBXUFMgdXNlcyB0aGUgc2FtZSBmb3JtYXQgYXMKKwkgKiBjb25maWd1cmF0aW9uIHRva2VuLgorCSAqLworCXJldHVybiBob3N0YXBkX3dwc19uZmNfY29uZmlnX3Rva2VuKGhhcGQsIG5kZWYpOworfQorCisKIHN0cnVjdCB3cGFidWYgKiBob3N0YXBkX3dwc19uZmNfdG9rZW5fZ2VuKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGludCBuZGVmKQogeworCWlmIChoYXBkLT5jb25mLT53cHNfbmZjX3B3X2Zyb21fY29uZmlnKSB7CisJCXJldHVybiB3cHNfbmZjX3Rva2VuX2J1aWxkKG5kZWYsCisJCQkJCSAgIGhhcGQtPmNvbmYtPndwc19uZmNfZGV2X3B3X2lkLAorCQkJCQkgICBoYXBkLT5jb25mLT53cHNfbmZjX2RoX3B1YmtleSwKKwkJCQkJICAgaGFwZC0+Y29uZi0+d3BzX25mY19kZXZfcHcpOworCX0KKwogCXJldHVybiB3cHNfbmZjX3Rva2VuX2dlbihuZGVmLCAmaGFwZC0+Y29uZi0+d3BzX25mY19kZXZfcHdfaWQsCiAJCQkJICZoYXBkLT5jb25mLT53cHNfbmZjX2RoX3B1YmtleSwKIAkJCQkgJmhhcGQtPmNvbmYtPndwc19uZmNfZGhfcHJpdmtleSwKQEAgLTE2NTAsNiArMTYxMiw3IEBACiBpbnQgaG9zdGFwZF93cHNfbmZjX3Rva2VuX2VuYWJsZShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkKQogewogCXN0cnVjdCB3cHNfY29udGV4dCAqd3BzID0gaGFwZC0+d3BzOworCXN0cnVjdCB3cGFidWYgKnB3OwogCiAJaWYgKHdwcyA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CkBAIC0xNjY0LDcgKzE2MjcsMTYgQEAKIAl3cHMtPmFwX25mY19kZXZfcHdfaWQgPSBoYXBkLT5jb25mLT53cHNfbmZjX2Rldl9wd19pZDsKIAl3cHMtPmFwX25mY19kaF9wdWJrZXkgPSB3cGFidWZfZHVwKGhhcGQtPmNvbmYtPndwc19uZmNfZGhfcHVia2V5KTsKIAl3cHMtPmFwX25mY19kaF9wcml2a2V5ID0gd3BhYnVmX2R1cChoYXBkLT5jb25mLT53cHNfbmZjX2RoX3ByaXZrZXkpOwotCXdwcy0+YXBfbmZjX2Rldl9wdyA9IHdwYWJ1Zl9kdXAoaGFwZC0+Y29uZi0+d3BzX25mY19kZXZfcHcpOworCXB3ID0gaGFwZC0+Y29uZi0+d3BzX25mY19kZXZfcHc7CisJd3BzLT5hcF9uZmNfZGV2X3B3ID0gd3BhYnVmX2FsbG9jKAorCQl3cGFidWZfbGVuKHB3KSAqIDIgKyAxKTsKKwlpZiAod3BzLT5hcF9uZmNfZGV2X3B3KSB7CisJCXdwYV9zbnByaW50Zl9oZXhfdXBwZXJjYXNlKAorCQkJKGNoYXIgKikgd3BhYnVmX3B1dCh3cHMtPmFwX25mY19kZXZfcHcsCisJCQkJCSAgICB3cGFidWZfbGVuKHB3KSAqIDIpLAorCQkJd3BhYnVmX2xlbihwdykgKiAyICsgMSwKKwkJCXdwYWJ1Zl9oZWFkKHB3KSwgd3BhYnVmX2xlbihwdykpOworCX0KIAogCWlmICghd3BzLT5hcF9uZmNfZGhfcHVia2V5IHx8ICF3cHMtPmFwX25mY19kaF9wcml2a2V5IHx8CiAJICAgICF3cHMtPmFwX25mY19kZXZfcHcpIHsKZGlmZiAtLWdpdCBhL3NyYy9hcC93cHNfaG9zdGFwZC5oIGIvc3JjL2FwL3dwc19ob3N0YXBkLmgKaW5kZXggZjk2OGUxNS4uYTJjMmNmMCAxMDA2NDQKLS0tIGEvc3JjL2FwL3dwc19ob3N0YXBkLmgKKysrIGIvc3JjL2FwL3dwc19ob3N0YXBkLmgKQEAgLTIxLDggKzIxLDYgQEAKIGludCBob3N0YXBkX3dwc19idXR0b25fcHVzaGVkKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkgICAgICBjb25zdCB1OCAqcDJwX2Rldl9hZGRyKTsKIGludCBob3N0YXBkX3dwc19jYW5jZWwoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCk7Ci1pbnQgaG9zdGFwZF93cHNfc3RhcnRfb29iKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNoYXIgKmRldmljZV90eXBlLAotCQkJICBjaGFyICpwYXRoLCBjaGFyICptZXRob2QsIGNoYXIgKm5hbWUpOwogaW50IGhvc3RhcGRfd3BzX2dldF9taWJfc3RhKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyLAogCQkJICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CiB2b2lkIGhvc3RhcGRfd3BzX2FwX3Bpbl9kaXNhYmxlKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQpOwpAQCAtMzcsNiArMzUsNyBAQAogCQkJICAgICBjb25zdCBzdHJ1Y3Qgd3BhYnVmICpkYXRhKTsKIHN0cnVjdCB3cGFidWYgKiBob3N0YXBkX3dwc19uZmNfY29uZmlnX3Rva2VuKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkJCSAgICAgaW50IG5kZWYpOworc3RydWN0IHdwYWJ1ZiAqIGhvc3RhcGRfd3BzX25mY19oc19jcihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBpbnQgbmRlZik7CiBzdHJ1Y3Qgd3BhYnVmICogaG9zdGFwZF93cHNfbmZjX3Rva2VuX2dlbihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBpbnQgbmRlZik7CiBpbnQgaG9zdGFwZF93cHNfbmZjX3Rva2VuX2VuYWJsZShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkKTsKIHZvaWQgaG9zdGFwZF93cHNfbmZjX3Rva2VuX2Rpc2FibGUoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCk7CmRpZmYgLS1naXQgYS9zcmMvY29tbW9uL2RlZnMuaCBiL3NyYy9jb21tb24vZGVmcy5oCmluZGV4IGRiMjliNWQuLjI4MWRkOGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb21tb24vZGVmcy5oCisrKyBiL3NyYy9jb21tb24vZGVmcy5oCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVmaW5lIFdQQV9DSVBIRVJfQUVTXzEyOF9DTUFDIEJJVCg1KQogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCiAjZGVmaW5lIFdQQV9DSVBIRVJfR0NNUCBCSVQoNikKKyNkZWZpbmUgV1BBX0NJUEhFUl9TTVM0IEJJVCg3KQogCiAjZGVmaW5lIFdQQV9LRVlfTUdNVF9JRUVFODAyMVggQklUKDApCiAjZGVmaW5lIFdQQV9LRVlfTUdNVF9QU0sgQklUKDEpCkBAIC0zOCwxMSArMzksMTcgQEAKICNkZWZpbmUgV1BBX0tFWV9NR01UX0lFRUU4MDIxWF9TSEEyNTYgQklUKDcpCiAjZGVmaW5lIFdQQV9LRVlfTUdNVF9QU0tfU0hBMjU2IEJJVCg4KQogI2RlZmluZSBXUEFfS0VZX01HTVRfV1BTIEJJVCg5KQorI2RlZmluZSBXUEFfS0VZX01HTVRfU0FFIEJJVCgxMCkKKyNkZWZpbmUgV1BBX0tFWV9NR01UX0ZUX1NBRSBCSVQoMTEpCisjZGVmaW5lIFdQQV9LRVlfTUdNVF9XQVBJX1BTSyBCSVQoMTIpCisjZGVmaW5lIFdQQV9LRVlfTUdNVF9XQVBJX0NFUlQgQklUKDEzKQorI2RlZmluZSBXUEFfS0VZX01HTVRfQ0NLTSBCSVQoMTQpCiAKIHN0YXRpYyBpbmxpbmUgaW50IHdwYV9rZXlfbWdtdF93cGFfaWVlZTgwMjF4KGludCBha20pCiB7CiAJcmV0dXJuICEhKGFrbSAmIChXUEFfS0VZX01HTVRfSUVFRTgwMjFYIHwKIAkJCSBXUEFfS0VZX01HTVRfRlRfSUVFRTgwMjFYIHwKKwkJCSBXUEFfS0VZX01HTVRfQ0NLTSB8CiAJCQkgV1BBX0tFWV9NR01UX0lFRUU4MDIxWF9TSEEyNTYpKTsKIH0KIApAQCAtNTAsMTMgKzU3LDIxIEBACiB7CiAJcmV0dXJuICEhKGFrbSAmIChXUEFfS0VZX01HTVRfUFNLIHwKIAkJCSBXUEFfS0VZX01HTVRfRlRfUFNLIHwKLQkJCSBXUEFfS0VZX01HTVRfUFNLX1NIQTI1NikpOworCQkJIFdQQV9LRVlfTUdNVF9QU0tfU0hBMjU2IHwKKwkJCSBXUEFfS0VZX01HTVRfU0FFKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHdwYV9rZXlfbWdtdF9mdChpbnQgYWttKQogewogCXJldHVybiAhIShha20gJiAoV1BBX0tFWV9NR01UX0ZUX1BTSyB8Ci0JCQkgV1BBX0tFWV9NR01UX0ZUX0lFRUU4MDIxWCkpOworCQkJIFdQQV9LRVlfTUdNVF9GVF9JRUVFODAyMVggfAorCQkJIFdQQV9LRVlfTUdNVF9GVF9TQUUpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd3BhX2tleV9tZ210X3NhZShpbnQgYWttKQoreworCXJldHVybiAhIShha20gJiAoV1BBX0tFWV9NR01UX1NBRSB8CisJCQkgV1BBX0tFWV9NR01UX0ZUX1NBRSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB3cGFfa2V5X21nbXRfc2hhMjU2KGludCBha20pCkBAIC03NiwxNCArOTEsMjEgQEAKIAlyZXR1cm4gd3BhX2tleV9tZ210X3dwYShha20pIHx8IChha20gJiBXUEFfS0VZX01HTVRfV1BBX05PTkUpOwogfQogCitzdGF0aWMgaW5saW5lIGludCB3cGFfa2V5X21nbXRfY2NrbShpbnQgYWttKQoreworCXJldHVybiBha20gPT0gV1BBX0tFWV9NR01UX0NDS007Cit9CisKIAogI2RlZmluZSBXUEFfUFJPVE9fV1BBIEJJVCgwKQogI2RlZmluZSBXUEFfUFJPVE9fUlNOIEJJVCgxKQorI2RlZmluZSBXUEFfUFJPVE9fV0FQSSBCSVQoMikKIAogI2RlZmluZSBXUEFfQVVUSF9BTEdfT1BFTiBCSVQoMCkKICNkZWZpbmUgV1BBX0FVVEhfQUxHX1NIQVJFRCBCSVQoMSkKICNkZWZpbmUgV1BBX0FVVEhfQUxHX0xFQVAgQklUKDIpCiAjZGVmaW5lIFdQQV9BVVRIX0FMR19GVCBCSVQoMykKKyNkZWZpbmUgV1BBX0FVVEhfQUxHX1NBRSBCSVQoNCkKIAogCiBlbnVtIHdwYV9hbGcgewpAQCAtOTMsNyArMTE1LDkgQEAKIAlXUEFfQUxHX0NDTVAsCiAJV1BBX0FMR19JR1RLLAogCVdQQV9BTEdfUE1LLAotCVdQQV9BTEdfR0NNUAorCVdQQV9BTEdfR0NNUCwKKwlXUEFfQUxHX1NNUzQsCisJV1BBX0FMR19LUksKIH07CiAKIC8qKgpAQCAtMTA1LDcgKzEyOSw4IEBACiAJQ0lQSEVSX1RLSVAsCiAJQ0lQSEVSX0NDTVAsCiAJQ0lQSEVSX1dFUDEwNCwKLQlDSVBIRVJfR0NNUAorCUNJUEhFUl9HQ01QLAorCUNJUEhFUl9TTVM0CiB9OwogCiAvKioKQEAgLTEyMSw3ICsxNDYsMTIgQEAKIAlLRVlfTUdNVF9GVF9QU0ssCiAJS0VZX01HTVRfODAyXzFYX1NIQTI1NiwKIAlLRVlfTUdNVF9QU0tfU0hBMjU2LAotCUtFWV9NR01UX1dQUworCUtFWV9NR01UX1dQUywKKwlLRVlfTUdNVF9TQUUsCisJS0VZX01HTVRfRlRfU0FFLAorCUtFWV9NR01UX1dBUElfUFNLLAorCUtFWV9NR01UX1dBUElfQ0VSVCwKKwlLRVlfTUdNVF9DQ0tNCiB9OwogCiAvKioKQEAgLTI1Niw4ICsyODYsOSBAQAogZW51bSBtZnBfb3B0aW9ucyB7CiAJTk9fTUdNVF9GUkFNRV9QUk9URUNUSU9OID0gMCwKIAlNR01UX0ZSQU1FX1BST1RFQ1RJT05fT1BUSU9OQUwgPSAxLAotCU1HTVRfRlJBTUVfUFJPVEVDVElPTl9SRVFVSVJFRCA9IDIKKwlNR01UX0ZSQU1FX1BST1RFQ1RJT05fUkVRVUlSRUQgPSAyLAogfTsKKyNkZWZpbmUgTUdNVF9GUkFNRV9QUk9URUNUSU9OX0RFRkFVTFQgMwogCiAvKioKICAqIGVudW0gaG9zdGFwZF9od19tb2RlIC0gSGFyZHdhcmUgbW9kZQpAQCAtMjY2LDYgKzI5Nyw3IEBACiAJSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUIsCiAJSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUcsCiAJSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUEsCisJSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUFELAogCU5VTV9IT1NUQVBEX01PREVTCiB9OwogCmRpZmYgLS1naXQgYS9zcmMvY29tbW9uL2llZWU4MDJfMTFfY29tbW9uLmMgYi9zcmMvY29tbW9uL2llZWU4MDJfMTFfY29tbW9uLmMKaW5kZXggZDlkM2NkMC4uOThmYWRkYSAxMDA2NDQKLS0tIGEvc3JjL2NvbW1vbi9pZWVlODAyXzExX2NvbW1vbi5jCisrKyBiL3NyYy9jb21tb24vaWVlZTgwMl8xMV9jb21tb24uYwpAQCAtMjg0LDYgKzI4NCwxMCBAQAogCQkJCWJyZWFrOwogCQkJZWxlbXMtPmJzc19tYXhfaWRsZV9wZXJpb2QgPSBwb3M7CiAJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9TU0lEX0xJU1Q6CisJCQllbGVtcy0+c3NpZF9saXN0ID0gcG9zOworCQkJZWxlbXMtPnNzaWRfbGlzdF9sZW4gPSBlbGVuOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQl1bmtub3duKys7CiAJCQlpZiAoIXNob3dfZXJyb3JzKQpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi9pZWVlODAyXzExX2NvbW1vbi5oIGIvc3JjL2NvbW1vbi9pZWVlODAyXzExX2NvbW1vbi5oCmluZGV4IGJmYzNlYjIuLjU1ZmE0OWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb21tb24vaWVlZTgwMl8xMV9jb21tb24uaAorKysgYi9zcmMvY29tbW9uL2llZWU4MDJfMTFfY29tbW9uLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogSUVFRSA4MDIuMTEgQ29tbW9uIHJvdXRpbmVzCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwOSwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCkBAIC00Myw2ICs0Myw3IEBACiAJY29uc3QgdTggKmhzMjA7CiAJY29uc3QgdTggKmV4dF9jYXBhYjsKIAljb25zdCB1OCAqYnNzX21heF9pZGxlX3BlcmlvZDsKKwljb25zdCB1OCAqc3NpZF9saXN0OwogCiAJdTggc3NpZF9sZW47CiAJdTggc3VwcF9yYXRlc19sZW47CkBAIC03NCw2ICs3NSw3IEBACiAJdTggaW50ZXJ3b3JraW5nX2xlbjsKIAl1OCBoczIwX2xlbjsKIAl1OCBleHRfY2FwYWJfbGVuOworCXU4IHNzaWRfbGlzdF9sZW47CiB9OwogCiB0eXBlZGVmIGVudW0geyBQYXJzZU9LID0gMCwgUGFyc2VVbmtub3duID0gMSwgUGFyc2VGYWlsZWQgPSAtMSB9IFBhcnNlUmVzOwpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi9pZWVlODAyXzExX2RlZnMuaCBiL3NyYy9jb21tb24vaWVlZTgwMl8xMV9kZWZzLmgKaW5kZXggMmFiN2ZiZi4uNmE3ZmZmNiAxMDA2NDQKLS0tIGEvc3JjL2NvbW1vbi9pZWVlODAyXzExX2RlZnMuaAorKysgYi9zcmMvY29tbW9uL2llZWU4MDJfMTFfZGVmcy5oCkBAIC03Niw2ICs3Niw3IEBACiAjZGVmaW5lIFdMQU5fQVVUSF9PUEVOCQkJMAogI2RlZmluZSBXTEFOX0FVVEhfU0hBUkVEX0tFWQkJMQogI2RlZmluZSBXTEFOX0FVVEhfRlQJCQkyCisjZGVmaW5lIFdMQU5fQVVUSF9TQUUJCQkzCiAjZGVmaW5lIFdMQU5fQVVUSF9MRUFQCQkJMTI4CiAKICNkZWZpbmUgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4gMTI4CkBAIC0xNTcsNiArMTU4LDggQEAKICNkZWZpbmUgV0xBTl9TVEFUVVNfUkVRX1JFRlVTRURfU1NQTiA2NwogI2RlZmluZSBXTEFOX1NUQVRVU19SRVFfUkVGVVNFRF9VTkFVVEhfQUNDRVNTIDY4CiAjZGVmaW5lIFdMQU5fU1RBVFVTX0lOVkFMSURfUlNOSUUgNzIKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQU5USV9DTE9HR0lOR19UT0tFTl9SRVEgNzYKKyNkZWZpbmUgV0xBTl9TVEFUVVNfRklOSVRFX0NZQ0xJQ19HUk9VUF9OT1RfU1VQUE9SVEVEIDc3CiAjZGVmaW5lIFdMQU5fU1RBVFVTX1RSQU5TTUlTU0lPTl9GQUlMVVJFIDc5CiAKIC8qIFJlYXNvbiBjb2RlcyAoSUVFRSA4MDIuMTEtMjAwNywgNy4zLjEuNywgVGFibGUgNy0yMikgKi8KQEAgLTIxNSw2ICsyMTgsNyBAQAogLyogRUlEcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExaCAtIEVORCAqLwogI2RlZmluZSBXTEFOX0VJRF9FUlBfSU5GTyA0MgogI2RlZmluZSBXTEFOX0VJRF9IVF9DQVAgNDUKKyNkZWZpbmUgV0xBTl9FSURfUU9TIDQ2CiAjZGVmaW5lIFdMQU5fRUlEX1JTTiA0OAogI2RlZmluZSBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUyA1MAogI2RlZmluZSBXTEFOX0VJRF9NT0JJTElUWV9ET01BSU4gNTQKQEAgLTIyMywxMSArMjI3LDEzIEBACiAjZGVmaW5lIFdMQU5fRUlEX1JJQ19EQVRBIDU3CiAjZGVmaW5lIFdMQU5fRUlEX0hUX09QRVJBVElPTiA2MQogI2RlZmluZSBXTEFOX0VJRF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVQgNjIKKyNkZWZpbmUgV0xBTl9FSURfV0FQSSA2OAogI2RlZmluZSBXTEFOX0VJRF9USU1FX0FEVkVSVElTRU1FTlQgNjkKICNkZWZpbmUgV0xBTl9FSURfMjBfNDBfQlNTX0NPRVhJU1RFTkNFIDcyCiAjZGVmaW5lIFdMQU5fRUlEXzIwXzQwX0JTU19JTlRPTEVSQU5UIDczCiAjZGVmaW5lIFdMQU5fRUlEX09WRVJMQVBQSU5HX0JTU19TQ0FOX1BBUkFNUyA3NAogI2RlZmluZSBXTEFOX0VJRF9NTUlFIDc2CisjZGVmaW5lIFdMQU5fRUlEX1NTSURfTElTVCA4NAogI2RlZmluZSBXTEFOX0VJRF9CU1NfTUFYX0lETEVfUEVSSU9EIDkwCiAjZGVmaW5lIFdMQU5fRUlEX1RGU19SRVEgOTEKICNkZWZpbmUgV0xBTl9FSURfVEZTX1JFU1AgOTIKQEAgLTIzOCw2ICsyNDQsNyBAQAogI2RlZmluZSBXTEFOX0VJRF9BRFZfUFJPVE8gMTA4CiAjZGVmaW5lIFdMQU5fRUlEX1JPQU1JTkdfQ09OU09SVElVTSAxMTEKICNkZWZpbmUgV0xBTl9FSURfRVhUX0NBUEFCIDEyNworI2RlZmluZSBXTEFOX0VJRF9DQ0tNIDE1NgogI2RlZmluZSBXTEFOX0VJRF9WSFRfQ0FQIDE5MQogI2RlZmluZSBXTEFOX0VJRF9WSFRfT1BFUkFUSU9OIDE5MgogI2RlZmluZSBXTEFOX0VJRF9WSFRfRVhURU5ERURfQlNTX0xPQUQgMTkzCkBAIC01MzIsNiArNTM5LDE2IEBACiAJCQkJCSAqIEVudHJpZXMgKi8KIAkJCQkJdTggdmFyaWFibGVbMF07CiAJCQkJfSBTVFJVQ1RfUEFDS0VEIGJzc190bV9yZXE7CisJCQkJc3RydWN0IHsKKwkJCQkJdTggYWN0aW9uOyAvKiA4ICovCisJCQkJCXU4IGRpYWxvZ190b2tlbjsKKwkJCQkJdTggc3RhdHVzX2NvZGU7CisJCQkJCXU4IGJzc190ZXJtaW5hdGlvbl9kZWxheTsKKwkJCQkJLyogVGFyZ2V0IEJTU0lEIChvcHRpb25hbCksCisJCQkJCSAqIEJTUyBUcmFuc2l0aW9uIENhbmRpZGF0ZSBMaXN0CisJCQkJCSAqIEVudHJpZXMgKG9wdGlvbmFsKSAqLworCQkJCQl1OCB2YXJpYWJsZVswXTsKKwkJCQl9IFNUUlVDVF9QQUNLRUQgYnNzX3RtX3Jlc3A7CiAJCQl9IHU7CiAJCX0gU1RSVUNUX1BBQ0tFRCBhY3Rpb247CiAJfSB1OwpAQCAtNjY2LDYgKzY4Myw3IEBACiAjZGVmaW5lIEhUX0lORk9fU1RCQ19QQVJBTV9QQ09fQUNUSVZFCQkJKCh1MTYpIEJJVCgxMCkpCiAjZGVmaW5lIEhUX0lORk9fU1RCQ19QQVJBTV9QQ09fUEhBU0UJCQkoKHUxNikgQklUKDExKSkKIAorI2RlZmluZSBCU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9WSFRfUEhZIDEyNgogI2RlZmluZSBCU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9IVF9QSFkgMTI3CiAKIC8qIFZIVCBEZWZpbmVzICovCkBAIC02OTUsNiArNzEzLDEyIEBACiAjZGVmaW5lIFZIVF9DQVBfUlhfQU5URU5OQV9QQVRURVJOICAgICAgICAgICAgICAgICAgKCh1MzIpIEJJVCgyOCkpCiAjZGVmaW5lIFZIVF9DQVBfVFhfQU5URU5OQV9QQVRURVJOICAgICAgICAgICAgICAgICAgKCh1MzIpIEJJVCgyOSkpCiAKKy8qIFZIVCBjaGFubmVsIHdpZHRocyAqLworI2RlZmluZSBWSFRfQ0hBTldJRFRIX1VTRV9IVAkwCisjZGVmaW5lIFZIVF9DSEFOV0lEVEhfODBNSFoJMQorI2RlZmluZSBWSFRfQ0hBTldJRFRIXzE2ME1IWgkyCisjZGVmaW5lIFZIVF9DSEFOV0lEVEhfODBQODBNSFoJMworCiAjZGVmaW5lIE9VSV9NSUNST1NPRlQgMHgwMDUwZjIgLyogTWljcm9zb2Z0IChhbHNvIHVzZWQgaW4gV2ktRmkgc3BlY3MpCiAJCQkJKiAwMDo1MDpGMiAqLwogI2RlZmluZSBXUEFfSUVfVkVORE9SX1RZUEUgMHgwMDUwZjIwMQpAQCAtOTY2LDkgKzk5MCwxNyBAQAogI2RlZmluZSBXTEFOX0NJUEhFUl9TVUlURV9OT19HUk9VUF9BRERSCTB4MDAwRkFDMDcKICNkZWZpbmUgV0xBTl9DSVBIRVJfU1VJVEVfR0NNUAkJMHgwMDBGQUMwOAogCisjZGVmaW5lIFdMQU5fQ0lQSEVSX1NVSVRFX1NNUzQJCTB4MDAxNDcyMDEKKworI2RlZmluZSBXTEFOX0NJUEhFUl9TVUlURV9DS0lQCQkweDAwNDA5NjAwCisjZGVmaW5lIFdMQU5fQ0lQSEVSX1NVSVRFX0NLSVBfQ01JQwkweDAwNDA5NjAxCisjZGVmaW5lIFdMQU5fQ0lQSEVSX1NVSVRFX0NNSUMJCTB4MDA0MDk2MDIKKyNkZWZpbmUgV0xBTl9DSVBIRVJfU1VJVEVfS1JLCQkweDAwNDA5NkZGIC8qIGZvciBubDgwMjExIHVzZSBvbmx5ICovCisKIC8qIEFLTSBzdWl0ZSBzZWxlY3RvcnMgKi8KICNkZWZpbmUgV0xBTl9BS01fU1VJVEVfODAyMVgJCTB4MDAwRkFDMDEKICNkZWZpbmUgV0xBTl9BS01fU1VJVEVfUFNLCQkweDAwMEZBQzAyCisjZGVmaW5lIFdMQU5fQUtNX1NVSVRFX0NDS00JCTB4MDA0MDk2MDAKIAogCiAvKiBJRUVFIDgwMi4xMXYgLSBXTk0gQWN0aW9uIGZpZWxkIHZhbHVlcyAqLwpAQCAtMTAzNCwxMSArMTA2NiwxNCBAQAogc3RydWN0IHdubV9zbGVlcF9lbGVtZW50IHsKIAl1OCBlaWQ7ICAgICAvKiBXTEFOX0VJRF9XTk1TTEVFUCAqLwogCXU4IGxlbjsKLQl1OCBhY3Rpb25fdHlwZTsgLyogV0xBTl9XTk1fU0xFRVBfRU5URVIvRVhJVCAqLworCXU4IGFjdGlvbl90eXBlOyAvKiBXTk1fU0xFRVBfRU5URVIvV05NX1NMRUVQX01PREVfRVhJVCAqLwogCXU4IHN0YXR1czsKIAlsZTE2IGludHZhbDsKIH0gU1RSVUNUX1BBQ0tFRDsKIAorI2RlZmluZSBXTk1fU0xFRVBfTU9ERV9FTlRFUiAwCisjZGVmaW5lIFdOTV9TTEVFUF9NT0RFX0VYSVQgMQorCiBlbnVtIHdubV9zbGVlcF9tb2RlX3Jlc3BvbnNlX3N0YXR1cyB7CiAJV05NX1NUQVRVU19TTEVFUF9BQ0NFUFQgPSAwLAogCVdOTV9TVEFUVVNfU0xFRVBfRVhJVF9BQ0NFUFRfR1RLX1VQREFURSA9IDEsCmRpZmYgLS1naXQgYS9zcmMvY29tbW9uL3NhZS5jIGIvc3JjL2NvbW1vbi9zYWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGZmY2QwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvbW1vbi9zYWUuYwpAQCAtMCwwICsxLDEwMjggQEAKKy8qCisgKiBTaW11bHRhbmVvdXMgYXV0aGVudGljYXRpb24gb2YgZXF1YWxzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiY3J5cHRvL2NyeXB0by5oIgorI2luY2x1ZGUgImNyeXB0by9zaGEyNTYuaCIKKyNpbmNsdWRlICJjcnlwdG8vcmFuZG9tLmgiCisjaW5jbHVkZSAiY3J5cHRvL2RoX2dyb3Vwcy5oIgorI2luY2x1ZGUgImllZWU4MDJfMTFfZGVmcy5oIgorI2luY2x1ZGUgInNhZS5oIgorCisKK2ludCBzYWVfc2V0X2dyb3VwKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBpbnQgZ3JvdXApCit7CisJc3RydWN0IHNhZV90ZW1wb3JhcnlfZGF0YSAqdG1wOworCisJc2FlX2NsZWFyX2RhdGEoc2FlKTsKKwl0bXAgPSBzYWUtPnRtcCA9IG9zX3phbGxvYyhzaXplb2YoKnRtcCkpOworCWlmICh0bXAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJLyogRmlyc3QsIGNoZWNrIGlmIHRoaXMgaXMgYW4gRUNDIGdyb3VwICovCisJdG1wLT5lYyA9IGNyeXB0b19lY19pbml0KGdyb3VwKTsKKwlpZiAodG1wLT5lYykgeworCQlzYWUtPmdyb3VwID0gZ3JvdXA7CisJCXRtcC0+cHJpbWVfbGVuID0gY3J5cHRvX2VjX3ByaW1lX2xlbih0bXAtPmVjKTsKKwkJdG1wLT5wcmltZSA9IGNyeXB0b19lY19nZXRfcHJpbWUodG1wLT5lYyk7CisJCXRtcC0+b3JkZXIgPSBjcnlwdG9fZWNfZ2V0X29yZGVyKHRtcC0+ZWMpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBOb3QgYW4gRUNDIGdyb3VwLCBjaGVjayBGRkMgKi8KKwl0bXAtPmRoID0gZGhfZ3JvdXBzX2dldChncm91cCk7CisJaWYgKHRtcC0+ZGgpIHsKKwkJc2FlLT5ncm91cCA9IGdyb3VwOworCQl0bXAtPnByaW1lX2xlbiA9IHRtcC0+ZGgtPnByaW1lX2xlbjsKKwkJaWYgKHRtcC0+cHJpbWVfbGVuID4gU0FFX01BWF9QUklNRV9MRU4pIHsKKwkJCXNhZV9jbGVhcl9kYXRhKHNhZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl0bXAtPnByaW1lX2J1ZiA9IGNyeXB0b19iaWdudW1faW5pdF9zZXQodG1wLT5kaC0+cHJpbWUsCisJCQkJCQkJdG1wLT5wcmltZV9sZW4pOworCQlpZiAodG1wLT5wcmltZV9idWYgPT0gTlVMTCkgeworCQkJc2FlX2NsZWFyX2RhdGEoc2FlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl0bXAtPnByaW1lID0gdG1wLT5wcmltZV9idWY7CisKKwkJdG1wLT5vcmRlcl9idWYgPSBjcnlwdG9fYmlnbnVtX2luaXRfc2V0KHRtcC0+ZGgtPm9yZGVyLAorCQkJCQkJCXRtcC0+ZGgtPm9yZGVyX2xlbik7CisJCWlmICh0bXAtPm9yZGVyX2J1ZiA9PSBOVUxMKSB7CisJCQlzYWVfY2xlYXJfZGF0YShzYWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXRtcC0+b3JkZXIgPSB0bXAtPm9yZGVyX2J1ZjsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBVbnN1cHBvcnRlZCBncm91cCAqLworCXJldHVybiAtMTsKK30KKworCit2b2lkIHNhZV9jbGVhcl90ZW1wX2RhdGEoc3RydWN0IHNhZV9kYXRhICpzYWUpCit7CisJc3RydWN0IHNhZV90ZW1wb3JhcnlfZGF0YSAqdG1wOworCWlmIChzYWUgPT0gTlVMTCB8fCBzYWUtPnRtcCA9PSBOVUxMKQorCQlyZXR1cm47CisJdG1wID0gc2FlLT50bXA7CisJY3J5cHRvX2VjX2RlaW5pdCh0bXAtPmVjKTsKKwljcnlwdG9fYmlnbnVtX2RlaW5pdCh0bXAtPnByaW1lX2J1ZiwgMCk7CisJY3J5cHRvX2JpZ251bV9kZWluaXQodG1wLT5vcmRlcl9idWYsIDApOworCWNyeXB0b19iaWdudW1fZGVpbml0KHRtcC0+c2FlX3JhbmQsIDEpOworCWNyeXB0b19iaWdudW1fZGVpbml0KHRtcC0+cHdlX2ZmYywgMSk7CisJY3J5cHRvX2JpZ251bV9kZWluaXQodG1wLT5vd25fY29tbWl0X3NjYWxhciwgMCk7CisJY3J5cHRvX2JpZ251bV9kZWluaXQodG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZmZjLCAwKTsKKwljcnlwdG9fYmlnbnVtX2RlaW5pdCh0bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZmZjLCAwKTsKKwljcnlwdG9fZWNfcG9pbnRfZGVpbml0KHRtcC0+cHdlX2VjYywgMSk7CisJY3J5cHRvX2VjX3BvaW50X2RlaW5pdCh0bXAtPm93bl9jb21taXRfZWxlbWVudF9lY2MsIDApOworCWNyeXB0b19lY19wb2ludF9kZWluaXQodG1wLT5wZWVyX2NvbW1pdF9lbGVtZW50X2VjYywgMCk7CisJb3NfZnJlZShzYWUtPnRtcCk7CisJc2FlLT50bXAgPSBOVUxMOworfQorCisKK3ZvaWQgc2FlX2NsZWFyX2RhdGEoc3RydWN0IHNhZV9kYXRhICpzYWUpCit7CisJaWYgKHNhZSA9PSBOVUxMKQorCQlyZXR1cm47CisJc2FlX2NsZWFyX3RlbXBfZGF0YShzYWUpOworCWNyeXB0b19iaWdudW1fZGVpbml0KHNhZS0+cGVlcl9jb21taXRfc2NhbGFyLCAwKTsKKwlvc19tZW1zZXQoc2FlLCAwLCBzaXplb2YoKnNhZSkpOworfQorCisKK3N0YXRpYyB2b2lkIGJ1Zl9zaGlmdF9yaWdodCh1OCAqYnVmLCBzaXplX3QgbGVuLCBzaXplX3QgYml0cykKK3sKKwlzaXplX3QgaTsKKwlmb3IgKGkgPSBsZW4gLSAxOyBpID4gMDsgaS0tKQorCQlidWZbaV0gPSAoYnVmW2kgLSAxXSA8PCAoOCAtIGJpdHMpKSB8IChidWZbaV0gPj4gYml0cyk7CisJYnVmWzBdID4+PSBiaXRzOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqIHNhZV9nZXRfcmFuZChzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSkKK3sKKwl1OCB2YWxbU0FFX01BWF9QUklNRV9MRU5dOworCWludCBpdGVyID0gMDsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYm4gPSBOVUxMOworCWludCBvcmRlcl9sZW5fYml0cyA9IGNyeXB0b19iaWdudW1fYml0cyhzYWUtPnRtcC0+b3JkZXIpOworCXNpemVfdCBvcmRlcl9sZW4gPSAob3JkZXJfbGVuX2JpdHMgKyA3KSAvIDg7CisKKwlpZiAob3JkZXJfbGVuID4gc2l6ZW9mKHZhbCkpCisJCXJldHVybiBOVUxMOworCisJZm9yICg7OykgeworCQlpZiAoaXRlcisrID4gMTAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChyYW5kb21fZ2V0X2J5dGVzKHZhbCwgb3JkZXJfbGVuKSA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKG9yZGVyX2xlbl9iaXRzICUgOCkKKwkJCWJ1Zl9zaGlmdF9yaWdodCh2YWwsIG9yZGVyX2xlbiwgOCAtIG9yZGVyX2xlbl9iaXRzICUgOCk7CisJCWJuID0gY3J5cHRvX2JpZ251bV9pbml0X3NldCh2YWwsIG9yZGVyX2xlbik7CisJCWlmIChibiA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChjcnlwdG9fYmlnbnVtX2lzX3plcm8oYm4pIHx8CisJCSAgICBjcnlwdG9fYmlnbnVtX2lzX29uZShibikgfHwKKwkJICAgIGNyeXB0b19iaWdudW1fY21wKGJuLCBzYWUtPnRtcC0+b3JkZXIpID49IDApCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCisJb3NfbWVtc2V0KHZhbCwgMCwgb3JkZXJfbGVuKTsKKwlyZXR1cm4gYm47Cit9CisKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYmlnbnVtICogc2FlX2dldF9yYW5kX2FuZF9tYXNrKHN0cnVjdCBzYWVfZGF0YSAqc2FlKQoreworCWNyeXB0b19iaWdudW1fZGVpbml0KHNhZS0+dG1wLT5zYWVfcmFuZCwgMSk7CisJc2FlLT50bXAtPnNhZV9yYW5kID0gc2FlX2dldF9yYW5kKHNhZSk7CisJaWYgKHNhZS0+dG1wLT5zYWVfcmFuZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2FlX2dldF9yYW5kKHNhZSk7Cit9CisKKworc3RhdGljIHZvaWQgc2FlX3B3ZF9zZWVkX2tleShjb25zdCB1OCAqYWRkcjEsIGNvbnN0IHU4ICphZGRyMiwgdTggKmtleSkKK3sKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogUFdFIGRlcml2YXRpb24gLSBhZGRyMT0iIE1BQ1NUUgorCQkgICAiIGFkZHIyPSIgTUFDU1RSLCBNQUMyU1RSKGFkZHIxKSwgTUFDMlNUUihhZGRyMikpOworCWlmIChvc19tZW1jbXAoYWRkcjEsIGFkZHIyLCBFVEhfQUxFTikgPiAwKSB7CisJCW9zX21lbWNweShrZXksIGFkZHIxLCBFVEhfQUxFTik7CisJCW9zX21lbWNweShrZXkgKyBFVEhfQUxFTiwgYWRkcjIsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQlvc19tZW1jcHkoa2V5LCBhZGRyMiwgRVRIX0FMRU4pOworCQlvc19tZW1jcHkoa2V5ICsgRVRIX0FMRU4sIGFkZHIxLCBFVEhfQUxFTik7CisJfQorfQorCisKK3N0YXRpYyBpbnQgc2FlX3Rlc3RfcHdkX3NlZWRfZWNjKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqcHdkX3NlZWQsCisJCQkJIHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnB3ZSkKK3sKKwl1OCBwd2RfdmFsdWVbU0FFX01BWF9FQ0NfUFJJTUVfTEVOXSwgcHJpbWVbU0FFX01BWF9FQ0NfUFJJTUVfTEVOXTsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqeDsKKwlpbnQgeV9iaXQ7CisJc2l6ZV90IGJpdHM7CisKKwlpZiAoY3J5cHRvX2JpZ251bV90b19iaW4oc2FlLT50bXAtPnByaW1lLCBwcmltZSwgc2l6ZW9mKHByaW1lKSwKKwkJCQkgc2FlLT50bXAtPnByaW1lX2xlbikgPCAwKQorCQlyZXR1cm4gLTE7CisKKwl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiU0FFOiBwd2Qtc2VlZCIsIHB3ZF9zZWVkLCBTSEEyNTZfTUFDX0xFTik7CisKKwkvKiBwd2QtdmFsdWUgPSBLREYteihwd2Qtc2VlZCwgIlNBRSBIdW50aW5nIGFuZCBQZWNraW5nIiwgcCkgKi8KKwliaXRzID0gY3J5cHRvX2VjX3ByaW1lX2xlbl9iaXRzKHNhZS0+dG1wLT5lYyk7CisJc2hhMjU2X3ByZl9iaXRzKHB3ZF9zZWVkLCBTSEEyNTZfTUFDX0xFTiwgIlNBRSBIdW50aW5nIGFuZCBQZWNraW5nIiwKKwkJCXByaW1lLCBzYWUtPnRtcC0+cHJpbWVfbGVuLCBwd2RfdmFsdWUsIGJpdHMpOworCWlmIChiaXRzICUgOCkKKwkJYnVmX3NoaWZ0X3JpZ2h0KHB3ZF92YWx1ZSwgc2l6ZW9mKHB3ZF92YWx1ZSksIDggLSBiaXRzICUgOCk7CisJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIlNBRTogcHdkLXZhbHVlIiwKKwkJCXB3ZF92YWx1ZSwgc2FlLT50bXAtPnByaW1lX2xlbik7CisKKwlpZiAob3NfbWVtY21wKHB3ZF92YWx1ZSwgcHJpbWUsIHNhZS0+dG1wLT5wcmltZV9sZW4pID49IDApCisJCXJldHVybiAwOworCisJeV9iaXQgPSBwd2Rfc2VlZFtTSEEyNTZfTUFDX0xFTiAtIDFdICYgMHgwMTsKKworCXggPSBjcnlwdG9fYmlnbnVtX2luaXRfc2V0KHB3ZF92YWx1ZSwgc2FlLT50bXAtPnByaW1lX2xlbik7CisJaWYgKHggPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWlmIChjcnlwdG9fZWNfcG9pbnRfc29sdmVfeV9jb29yZChzYWUtPnRtcC0+ZWMsIHB3ZSwgeCwgeV9iaXQpIDwgMCkgeworCQljcnlwdG9fYmlnbnVtX2RlaW5pdCh4LCAwKTsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IE5vIHNvbHV0aW9uIGZvdW5kIik7CisJCXJldHVybiAwOworCX0KKwljcnlwdG9fYmlnbnVtX2RlaW5pdCh4LCAwKTsKKworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBQV0UgZm91bmQiKTsKKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgc2FlX3Rlc3RfcHdkX3NlZWRfZmZjKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqcHdkX3NlZWQsCisJCQkJIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpwd2UpCit7CisJdTggcHdkX3ZhbHVlW1NBRV9NQVhfUFJJTUVfTEVOXTsKKwlzaXplX3QgYml0cyA9IHNhZS0+dG1wLT5wcmltZV9sZW4gKiA4OworCXU4IGV4cFsxXTsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwgKmI7CisJaW50IHJlczsKKworCXdwYV9oZXhkdW1wX2tleShNU0dfREVCVUcsICJTQUU6IHB3ZC1zZWVkIiwgcHdkX3NlZWQsIFNIQTI1Nl9NQUNfTEVOKTsKKworCS8qIHB3ZC12YWx1ZSA9IEtERi16KHB3ZC1zZWVkLCAiU0FFIEh1bnRpbmcgYW5kIFBlY2tpbmciLCBwKSAqLworCXNoYTI1Nl9wcmZfYml0cyhwd2Rfc2VlZCwgU0hBMjU2X01BQ19MRU4sICJTQUUgSHVudGluZyBhbmQgUGVja2luZyIsCisJCQlzYWUtPnRtcC0+ZGgtPnByaW1lLCBzYWUtPnRtcC0+cHJpbWVfbGVuLCBwd2RfdmFsdWUsCisJCQliaXRzKTsKKwlpZiAoYml0cyAlIDgpCisJCWJ1Zl9zaGlmdF9yaWdodChwd2RfdmFsdWUsIHNpemVvZihwd2RfdmFsdWUpLCA4IC0gYml0cyAlIDgpOworCXdwYV9oZXhkdW1wX2tleShNU0dfREVCVUcsICJTQUU6IHB3ZC12YWx1ZSIsIHB3ZF92YWx1ZSwKKwkJCXNhZS0+dG1wLT5wcmltZV9sZW4pOworCisJaWYgKG9zX21lbWNtcChwd2RfdmFsdWUsIHNhZS0+dG1wLT5kaC0+cHJpbWUsIHNhZS0+dG1wLT5wcmltZV9sZW4pID49IDApCisJeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogcHdkLXZhbHVlID49IHAiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUFdFID0gcHdkLXZhbHVlXigocC0xKS9yKSBtb2R1bG8gcCAqLworCisJYSA9IGNyeXB0b19iaWdudW1faW5pdF9zZXQocHdkX3ZhbHVlLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKworCWlmIChzYWUtPnRtcC0+ZGgtPnNhZmVfcHJpbWUpIHsKKwkJLyoKKwkJICogciA9IChwLTEpLzIgZm9yIHRoZSBncm91cCB1c2VkIGhlcmUsIHNvIHRoaXMgYmVjb21lczoKKwkJICogUFdFID0gcHdkLXZhbHVlXjIgbW9kdWxvIHAKKwkJICovCisJCWV4cFswXSA9IDI7CisJCWIgPSBjcnlwdG9fYmlnbnVtX2luaXRfc2V0KGV4cCwgc2l6ZW9mKGV4cCkpOworCX0gZWxzZSB7CisJCS8qIENhbGN1bGF0ZSBleHBvbmVudDogKHAtMSkvciAqLworCQlleHBbMF0gPSAxOworCQliID0gY3J5cHRvX2JpZ251bV9pbml0X3NldChleHAsIHNpemVvZihleHApKTsKKwkJaWYgKGIgPT0gTlVMTCB8fAorCQkgICAgY3J5cHRvX2JpZ251bV9zdWIoc2FlLT50bXAtPnByaW1lLCBiLCBiKSA8IDAgfHwKKwkJICAgIGNyeXB0b19iaWdudW1fZGl2KGIsIHNhZS0+dG1wLT5vcmRlciwgYikgPCAwKSB7CisJCQljcnlwdG9fYmlnbnVtX2RlaW5pdChiLCAwKTsKKwkJCWIgPSBOVUxMOworCQl9CisJfQorCisJaWYgKGEgPT0gTlVMTCB8fCBiID09IE5VTEwpCisJCXJlcyA9IC0xOworCWVsc2UKKwkJcmVzID0gY3J5cHRvX2JpZ251bV9leHB0bW9kKGEsIGIsIHNhZS0+dG1wLT5wcmltZSwgcHdlKTsKKworCWNyeXB0b19iaWdudW1fZGVpbml0KGEsIDApOworCWNyeXB0b19iaWdudW1fZGVpbml0KGIsIDApOworCisJaWYgKHJlcyA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IEZhaWxlZCB0byBjYWxjdWxhdGUgUFdFIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBpZiAoUFdFID4gMSkgLS0+IGZvdW5kICovCisJaWYgKGNyeXB0b19iaWdudW1faXNfemVybyhwd2UpIHx8IGNyeXB0b19iaWdudW1faXNfb25lKHB3ZSkpIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IFBXRSA8PSAxIik7CisJCXJldHVybiAwOworCX0KKworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBQV0UgZm91bmQiKTsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHNhZV9kZXJpdmVfcHdlX2VjYyhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKmFkZHIxLAorCQkJICAgICAgY29uc3QgdTggKmFkZHIyLCBjb25zdCB1OCAqcGFzc3dvcmQsCisJCQkgICAgICBzaXplX3QgcGFzc3dvcmRfbGVuKQoreworCXU4IGNvdW50ZXIsIGsgPSA0OworCXU4IGFkZHJzWzIgKiBFVEhfQUxFTl07CisJY29uc3QgdTggKmFkZHJbMl07CisJc2l6ZV90IGxlblsyXTsKKwlpbnQgZm91bmQgPSAwOworCXN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnB3ZV90bXA7CisKKwlpZiAoc2FlLT50bXAtPnB3ZV9lY2MgPT0gTlVMTCkgeworCQlzYWUtPnRtcC0+cHdlX2VjYyA9IGNyeXB0b19lY19wb2ludF9pbml0KHNhZS0+dG1wLT5lYyk7CisJCWlmIChzYWUtPnRtcC0+cHdlX2VjYyA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCX0KKwlwd2VfdG1wID0gY3J5cHRvX2VjX3BvaW50X2luaXQoc2FlLT50bXAtPmVjKTsKKwlpZiAocHdlX3RtcCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwl3cGFfaGV4ZHVtcF9hc2NpaV9rZXkoTVNHX0RFQlVHLCAiU0FFOiBwYXNzd29yZCIsCisJCQkgICAgICBwYXNzd29yZCwgcGFzc3dvcmRfbGVuKTsKKworCS8qCisJICogSChzYWx0LCBpa20pID0gSE1BQy1TSEEyNTYoc2FsdCwgaWttKQorCSAqIHB3ZC1zZWVkID0gSChNQVgoU1RBLUEtTUFDLCBTVEEtQi1NQUMpIHx8IE1JTihTVEEtQS1NQUMsIFNUQS1CLU1BQyksCisJICogICAgICAgICAgICAgIHBhc3N3b3JkIHx8IGNvdW50ZXIpCisJICovCisJc2FlX3B3ZF9zZWVkX2tleShhZGRyMSwgYWRkcjIsIGFkZHJzKTsKKworCWFkZHJbMF0gPSBwYXNzd29yZDsKKwlsZW5bMF0gPSBwYXNzd29yZF9sZW47CisJYWRkclsxXSA9ICZjb3VudGVyOworCWxlblsxXSA9IHNpemVvZihjb3VudGVyKTsKKworCS8qCisJICogQ29udGludWUgZm9yIGF0IGxlYXN0IGsgaXRlcmF0aW9ucyB0byBwcm90ZWN0IGFnYWluc3Qgc2lkZS1jaGFubmVsCisJICogYXR0YWNrcyB0aGF0IGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyByZXF1aXJlZAorCSAqIGluIHRoZSBsb29wLgorCSAqLworCWZvciAoY291bnRlciA9IDE7IGNvdW50ZXIgPCBrIHx8ICFmb3VuZDsgY291bnRlcisrKSB7CisJCXU4IHB3ZF9zZWVkW1NIQTI1Nl9NQUNfTEVOXTsKKwkJaW50IHJlczsKKworCQlpZiAoY291bnRlciA+IDIwMCkgeworCQkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiBwcmFjdGljZSAqLworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IEZhaWxlZCB0byBkZXJpdmUgUFdFIik7CisJCQlicmVhazsKKwkJfQorCisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBjb3VudGVyID0gJXUiLCBjb3VudGVyKTsKKwkJaWYgKGhtYWNfc2hhMjU2X3ZlY3RvcihhZGRycywgc2l6ZW9mKGFkZHJzKSwgMiwgYWRkciwgbGVuLAorCQkJCSAgICAgICBwd2Rfc2VlZCkgPCAwKQorCQkJYnJlYWs7CisJCXJlcyA9IHNhZV90ZXN0X3B3ZF9zZWVkX2VjYyhzYWUsIHB3ZF9zZWVkLAorCQkJCQkgICAgZm91bmQgPyBwd2VfdG1wIDoKKwkJCQkJICAgIHNhZS0+dG1wLT5wd2VfZWNjKTsKKwkJaWYgKHJlcyA8IDApCisJCQlicmVhazsKKwkJaWYgKHJlcyA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChmb3VuZCkgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IElnbm9yZSB0aGlzIFBXRSAob25lIHdhcyAiCisJCQkJICAgImFscmVhZHkgc2VsZWN0ZWQpIik7CisJCX0gZWxzZSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogVXNlIHRoaXMgUFdFIik7CisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisKKwljcnlwdG9fZWNfcG9pbnRfZGVpbml0KHB3ZV90bXAsIDEpOworCisJcmV0dXJuIGZvdW5kID8gMCA6IC0xOworfQorCisKK3N0YXRpYyBpbnQgc2FlX2Rlcml2ZV9wd2VfZmZjKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqYWRkcjEsCisJCQkgICAgICBjb25zdCB1OCAqYWRkcjIsIGNvbnN0IHU4ICpwYXNzd29yZCwKKwkJCSAgICAgIHNpemVfdCBwYXNzd29yZF9sZW4pCit7CisJdTggY291bnRlcjsKKwl1OCBhZGRyc1syICogRVRIX0FMRU5dOworCWNvbnN0IHU4ICphZGRyWzJdOworCXNpemVfdCBsZW5bMl07CisJaW50IGZvdW5kID0gMDsKKworCWlmIChzYWUtPnRtcC0+cHdlX2ZmYyA9PSBOVUxMKSB7CisJCXNhZS0+dG1wLT5wd2VfZmZjID0gY3J5cHRvX2JpZ251bV9pbml0KCk7CisJCWlmIChzYWUtPnRtcC0+cHdlX2ZmYyA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCX0KKworCXdwYV9oZXhkdW1wX2FzY2lpX2tleShNU0dfREVCVUcsICJTQUU6IHBhc3N3b3JkIiwKKwkJCSAgICAgIHBhc3N3b3JkLCBwYXNzd29yZF9sZW4pOworCisJLyoKKwkgKiBIKHNhbHQsIGlrbSkgPSBITUFDLVNIQTI1NihzYWx0LCBpa20pCisJICogcHdkLXNlZWQgPSBIKE1BWChTVEEtQS1NQUMsIFNUQS1CLU1BQykgfHwgTUlOKFNUQS1BLU1BQywgU1RBLUItTUFDKSwKKwkgKiAgICAgICAgICAgICAgcGFzc3dvcmQgfHwgY291bnRlcikKKwkgKi8KKwlzYWVfcHdkX3NlZWRfa2V5KGFkZHIxLCBhZGRyMiwgYWRkcnMpOworCisJYWRkclswXSA9IHBhc3N3b3JkOworCWxlblswXSA9IHBhc3N3b3JkX2xlbjsKKwlhZGRyWzFdID0gJmNvdW50ZXI7CisJbGVuWzFdID0gc2l6ZW9mKGNvdW50ZXIpOworCisJZm9yIChjb3VudGVyID0gMTsgIWZvdW5kOyBjb3VudGVyKyspIHsKKwkJdTggcHdkX3NlZWRbU0hBMjU2X01BQ19MRU5dOworCQlpbnQgcmVzOworCisJCWlmIChjb3VudGVyID4gMjAwKSB7CisJCQkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGluIHByYWN0aWNlICovCisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogRmFpbGVkIHRvIGRlcml2ZSBQV0UiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IGNvdW50ZXIgPSAldSIsIGNvdW50ZXIpOworCQlpZiAoaG1hY19zaGEyNTZfdmVjdG9yKGFkZHJzLCBzaXplb2YoYWRkcnMpLCAyLCBhZGRyLCBsZW4sCisJCQkJICAgICAgIHB3ZF9zZWVkKSA8IDApCisJCQlicmVhazsKKwkJcmVzID0gc2FlX3Rlc3RfcHdkX3NlZWRfZmZjKHNhZSwgcHdkX3NlZWQsIHNhZS0+dG1wLT5wd2VfZmZjKTsKKwkJaWYgKHJlcyA8IDApCisJCQlicmVhazsKKwkJaWYgKHJlcyA+IDApIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBVc2UgdGhpcyBQV0UiKTsKKwkJCWZvdW5kID0gMTsKKwkJfQorCX0KKworCXJldHVybiBmb3VuZCA/IDAgOiAtMTsKK30KKworCitzdGF0aWMgaW50IHNhZV9kZXJpdmVfY29tbWl0X2VsZW1lbnRfZWNjKHN0cnVjdCBzYWVfZGF0YSAqc2FlLAorCQkJCQkgc3RydWN0IGNyeXB0b19iaWdudW0gKm1hc2spCit7CisJLyogQ09NTUlULUVMRU1FTlQgPSBpbnZlcnNlKHNjYWxhci1vcChtYXNrLCBQV0UpKSAqLworCWlmICghc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9lY2MpIHsKKwkJc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9lY2MgPQorCQkJY3J5cHRvX2VjX3BvaW50X2luaXQoc2FlLT50bXAtPmVjKTsKKwkJaWYgKCFzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2VjYykKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY3J5cHRvX2VjX3BvaW50X211bChzYWUtPnRtcC0+ZWMsIHNhZS0+dG1wLT5wd2VfZWNjLCBtYXNrLAorCQkJCXNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZWNjKSA8IDAgfHwKKwkgICAgY3J5cHRvX2VjX3BvaW50X2ludmVydChzYWUtPnRtcC0+ZWMsCisJCQkJICAgc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9lY2MpIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogQ291bGQgbm90IGNvbXB1dGUgY29tbWl0LWVsZW1lbnQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2FlX2Rlcml2ZV9jb21taXRfZWxlbWVudF9mZmMoc3RydWN0IHNhZV9kYXRhICpzYWUsCisJCQkJCSBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqbWFzaykKK3sKKwkvKiBDT01NSVQtRUxFTUVOVCA9IGludmVyc2Uoc2NhbGFyLW9wKG1hc2ssIFBXRSkpICovCisJaWYgKCFzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2ZmYykgeworCQlzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2ZmYyA9IGNyeXB0b19iaWdudW1faW5pdCgpOworCQlpZiAoIXNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZmZjKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChjcnlwdG9fYmlnbnVtX2V4cHRtb2Qoc2FlLT50bXAtPnB3ZV9mZmMsIG1hc2ssIHNhZS0+dG1wLT5wcmltZSwKKwkJCQkgIHNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZmZjKSA8IDAgfHwKKwkgICAgY3J5cHRvX2JpZ251bV9pbnZlcnNlKHNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZmZjLAorCQkJCSAgc2FlLT50bXAtPnByaW1lLAorCQkJCSAgc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9mZmMpIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogQ291bGQgbm90IGNvbXB1dGUgY29tbWl0LWVsZW1lbnQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2FlX2Rlcml2ZV9jb21taXQoc3RydWN0IHNhZV9kYXRhICpzYWUpCit7CisJc3RydWN0IGNyeXB0b19iaWdudW0gKm1hc2s7CisJaW50IHJldCA9IC0xOworCisJbWFzayA9IHNhZV9nZXRfcmFuZF9hbmRfbWFzayhzYWUpOworCWlmIChtYXNrID09IE5VTEwpIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IENvdWxkIG5vdCBnZXQgcmFuZC9tYXNrIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjb21taXQtc2NhbGFyID0gKHJhbmQgKyBtYXNrKSBtb2R1bG8gciAqLworCWlmICghc2FlLT50bXAtPm93bl9jb21taXRfc2NhbGFyKSB7CisJCXNhZS0+dG1wLT5vd25fY29tbWl0X3NjYWxhciA9IGNyeXB0b19iaWdudW1faW5pdCgpOworCQlpZiAoIXNhZS0+dG1wLT5vd25fY29tbWl0X3NjYWxhcikKKwkJCWdvdG8gZmFpbDsKKwl9CisJY3J5cHRvX2JpZ251bV9hZGQoc2FlLT50bXAtPnNhZV9yYW5kLCBtYXNrLAorCQkJICBzYWUtPnRtcC0+b3duX2NvbW1pdF9zY2FsYXIpOworCWNyeXB0b19iaWdudW1fbW9kKHNhZS0+dG1wLT5vd25fY29tbWl0X3NjYWxhciwgc2FlLT50bXAtPm9yZGVyLAorCQkJICBzYWUtPnRtcC0+b3duX2NvbW1pdF9zY2FsYXIpOworCisJaWYgKHNhZS0+dG1wLT5lYyAmJiBzYWVfZGVyaXZlX2NvbW1pdF9lbGVtZW50X2VjYyhzYWUsIG1hc2spIDwgMCkKKwkJZ290byBmYWlsOworCWlmIChzYWUtPnRtcC0+ZGggJiYgc2FlX2Rlcml2ZV9jb21taXRfZWxlbWVudF9mZmMoc2FlLCBtYXNrKSA8IDApCisJCWdvdG8gZmFpbDsKKworCXJldCA9IDA7CitmYWlsOgorCWNyeXB0b19iaWdudW1fZGVpbml0KG1hc2ssIDEpOworCXJldHVybiByZXQ7Cit9CisKKworaW50IHNhZV9wcmVwYXJlX2NvbW1pdChjb25zdCB1OCAqYWRkcjEsIGNvbnN0IHU4ICphZGRyMiwKKwkJICAgICAgIGNvbnN0IHU4ICpwYXNzd29yZCwgc2l6ZV90IHBhc3N3b3JkX2xlbiwKKwkJICAgICAgIHN0cnVjdCBzYWVfZGF0YSAqc2FlKQoreworCWlmIChzYWUtPnRtcC0+ZWMgJiYgc2FlX2Rlcml2ZV9wd2VfZWNjKHNhZSwgYWRkcjEsIGFkZHIyLCBwYXNzd29yZCwKKwkJCQkJICBwYXNzd29yZF9sZW4pIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmIChzYWUtPnRtcC0+ZGggJiYgc2FlX2Rlcml2ZV9wd2VfZmZjKHNhZSwgYWRkcjEsIGFkZHIyLCBwYXNzd29yZCwKKwkJCQkJICBwYXNzd29yZF9sZW4pIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmIChzYWVfZGVyaXZlX2NvbW1pdChzYWUpIDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2FlX2Rlcml2ZV9rX2VjYyhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgdTggKmspCit7CisJc3RydWN0IGNyeXB0b19lY19wb2ludCAqSzsKKwlpbnQgcmV0ID0gLTE7CisKKwlLID0gY3J5cHRvX2VjX3BvaW50X2luaXQoc2FlLT50bXAtPmVjKTsKKwlpZiAoSyA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoIWNyeXB0b19lY19wb2ludF9pc19vbl9jdXJ2ZShzYWUtPnRtcC0+ZWMsCisJCQkJCSBzYWUtPnRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9lY2MpKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBQZWVyIGVsZW1lbnQgaXMgbm90IG9uIGN1cnZlIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIEsgPSBzY2FsYXItb3AocmFuZCwgKGVsZW0tb3Aoc2NhbGFyLW9wKHBlZXItY29tbWl0LXNjYWxhciwgUFdFKSwKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUVSLUNPTU1JVC1FTEVNRU5UKSkpCisJICogSWYgSyBpcyBpZGVudGl0eSBlbGVtZW50IChwb2ludC1hdC1pbmZpbml0eSksIHJlamVjdAorCSAqIGsgPSBGKEspICg9IHggY29vcmRpbmF0ZSkKKwkgKi8KKworCWlmIChjcnlwdG9fZWNfcG9pbnRfbXVsKHNhZS0+dG1wLT5lYywgc2FlLT50bXAtPnB3ZV9lY2MsCisJCQkJc2FlLT5wZWVyX2NvbW1pdF9zY2FsYXIsIEspIDwgMCB8fAorCSAgICBjcnlwdG9fZWNfcG9pbnRfYWRkKHNhZS0+dG1wLT5lYywgSywKKwkJCQlzYWUtPnRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9lY2MsIEspIDwgMCB8fAorCSAgICBjcnlwdG9fZWNfcG9pbnRfbXVsKHNhZS0+dG1wLT5lYywgSywgc2FlLT50bXAtPnNhZV9yYW5kLCBLKSA8IDAgfHwKKwkgICAgY3J5cHRvX2VjX3BvaW50X2lzX2F0X2luZmluaXR5KHNhZS0+dG1wLT5lYywgSykgfHwKKwkgICAgY3J5cHRvX2VjX3BvaW50X3RvX2JpbihzYWUtPnRtcC0+ZWMsIEssIGssIE5VTEwpIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogRmFpbGVkIHRvIGNhbGN1bGF0ZSBLIGFuZCBrIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiU0FFOiBrIiwgaywgc2FlLT50bXAtPnByaW1lX2xlbik7CisKKwlyZXQgPSAwOworZmFpbDoKKwljcnlwdG9fZWNfcG9pbnRfZGVpbml0KEssIDEpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBzYWVfZGVyaXZlX2tfZmZjKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCB1OCAqaykKK3sKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqSzsKKwlpbnQgcmV0ID0gLTE7CisKKwlLID0gY3J5cHRvX2JpZ251bV9pbml0KCk7CisJaWYgKEsgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCisJLyoKKwkgKiBLID0gc2NhbGFyLW9wKHJhbmQsIChlbGVtLW9wKHNjYWxhci1vcChwZWVyLWNvbW1pdC1zY2FsYXIsIFBXRSksCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVFUi1DT01NSVQtRUxFTUVOVCkpKQorCSAqIElmIEsgaXMgaWRlbnRpdHkgZWxlbWVudCAob25lKSwgcmVqZWN0LgorCSAqIGsgPSBGKEspICg9IHggY29vcmRpbmF0ZSkKKwkgKi8KKworCWlmIChjcnlwdG9fYmlnbnVtX2V4cHRtb2Qoc2FlLT50bXAtPnB3ZV9mZmMsIHNhZS0+cGVlcl9jb21taXRfc2NhbGFyLAorCQkJCSAgc2FlLT50bXAtPnByaW1lLCBLKSA8IDAgfHwKKwkgICAgY3J5cHRvX2JpZ251bV9tdWxtb2QoSywgc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZmZjLAorCQkJCSBzYWUtPnRtcC0+cHJpbWUsIEspIDwgMCB8fAorCSAgICBjcnlwdG9fYmlnbnVtX2V4cHRtb2QoSywgc2FlLT50bXAtPnNhZV9yYW5kLCBzYWUtPnRtcC0+cHJpbWUsIEspIDwgMAorCSAgICB8fAorCSAgICBjcnlwdG9fYmlnbnVtX2lzX29uZShLKSB8fAorCSAgICBjcnlwdG9fYmlnbnVtX3RvX2JpbihLLCBrLCBTQUVfTUFYX1BSSU1FX0xFTiwgc2FlLT50bXAtPnByaW1lX2xlbikgPAorCSAgICAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBGYWlsZWQgdG8gY2FsY3VsYXRlIEsgYW5kIGsiKTsKKwkJZ290byBmYWlsOworCX0KKworCXdwYV9oZXhkdW1wX2tleShNU0dfREVCVUcsICJTQUU6IGsiLCBrLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKworCXJldCA9IDA7CitmYWlsOgorCWNyeXB0b19iaWdudW1fZGVpbml0KEssIDEpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBzYWVfZGVyaXZlX2tleXMoc3RydWN0IHNhZV9kYXRhICpzYWUsIGNvbnN0IHU4ICprKQoreworCXU4IG51bGxfa2V5W1NBRV9LRVlTRUVEX0tFWV9MRU5dLCB2YWxbU0FFX01BWF9QUklNRV9MRU5dOworCXU4IGtleXNlZWRbU0hBMjU2X01BQ19MRU5dOworCXU4IGtleXNbU0FFX0tDS19MRU4gKyBTQUVfUE1LX0xFTl07CisJc3RydWN0IGNyeXB0b19iaWdudW0gKnRtcDsKKwlpbnQgcmV0ID0gLTE7CisKKwl0bXAgPSBjcnlwdG9fYmlnbnVtX2luaXQoKTsKKwlpZiAodG1wID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCS8qIGtleXNlZWQgPSBIKDwwPjMyLCBrKQorCSAqIEtDSyB8fCBQTUsgPSBLREYtNTEyKGtleXNlZWQsICJTQUUgS0NLIGFuZCBQTUsiLAorCSAqICAgICAgICAgICAgICAgICAgICAgIChjb21taXQtc2NhbGFyICsgcGVlci1jb21taXQtc2NhbGFyKSBtb2R1bG8gcikKKwkgKiBQTUtJRCA9IEwoKGNvbW1pdC1zY2FsYXIgKyBwZWVyLWNvbW1pdC1zY2FsYXIpIG1vZHVsbyByLCAwLCAxMjgpCisJICovCisKKwlvc19tZW1zZXQobnVsbF9rZXksIDAsIHNpemVvZihudWxsX2tleSkpOworCWhtYWNfc2hhMjU2KG51bGxfa2V5LCBzaXplb2YobnVsbF9rZXkpLCBrLCBzYWUtPnRtcC0+cHJpbWVfbGVuLAorCQkgICAga2V5c2VlZCk7CisJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIlNBRToga2V5c2VlZCIsIGtleXNlZWQsIHNpemVvZihrZXlzZWVkKSk7CisKKwljcnlwdG9fYmlnbnVtX2FkZChzYWUtPnRtcC0+b3duX2NvbW1pdF9zY2FsYXIsIHNhZS0+cGVlcl9jb21taXRfc2NhbGFyLAorCQkJICB0bXApOworCWNyeXB0b19iaWdudW1fbW9kKHRtcCwgc2FlLT50bXAtPm9yZGVyLCB0bXApOworCWNyeXB0b19iaWdudW1fdG9fYmluKHRtcCwgdmFsLCBzaXplb2YodmFsKSwgc2FlLT50bXAtPnByaW1lX2xlbik7CisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiU0FFOiBQTUtJRCIsIHZhbCwgU0FFX1BNS0lEX0xFTik7CisJc2hhMjU2X3ByZihrZXlzZWVkLCBzaXplb2Yoa2V5c2VlZCksICJTQUUgS0NLIGFuZCBQTUsiLAorCQkgICB2YWwsIHNhZS0+dG1wLT5wcmltZV9sZW4sIGtleXMsIHNpemVvZihrZXlzKSk7CisJb3NfbWVtY3B5KHNhZS0+dG1wLT5rY2ssIGtleXMsIFNBRV9LQ0tfTEVOKTsKKwlvc19tZW1jcHkoc2FlLT5wbWssIGtleXMgKyBTQUVfS0NLX0xFTiwgU0FFX1BNS19MRU4pOworCXdwYV9oZXhkdW1wX2tleShNU0dfREVCVUcsICJTQUU6IEtDSyIsIHNhZS0+dG1wLT5rY2ssIFNBRV9LQ0tfTEVOKTsKKwl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiU0FFOiBQTUsiLCBzYWUtPnBtaywgU0FFX1BNS19MRU4pOworCisJcmV0ID0gMDsKK2ZhaWw6CisJY3J5cHRvX2JpZ251bV9kZWluaXQodG1wLCAwKTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBzYWVfcHJvY2Vzc19jb21taXQoc3RydWN0IHNhZV9kYXRhICpzYWUpCit7CisJdTgga1tTQUVfTUFYX1BSSU1FX0xFTl07CisJaWYgKChzYWUtPnRtcC0+ZWMgJiYgc2FlX2Rlcml2ZV9rX2VjYyhzYWUsIGspIDwgMCkgfHwKKwkgICAgKHNhZS0+dG1wLT5kaCAmJiBzYWVfZGVyaXZlX2tfZmZjKHNhZSwgaykgPCAwKSB8fAorCSAgICBzYWVfZGVyaXZlX2tleXMoc2FlLCBrKSA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHNhZV93cml0ZV9jb21taXQoc3RydWN0IHNhZV9kYXRhICpzYWUsIHN0cnVjdCB3cGFidWYgKmJ1ZiwKKwkJICAgICAgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqdG9rZW4pCit7CisJdTggKnBvczsKKwl3cGFidWZfcHV0X2xlMTYoYnVmLCBzYWUtPmdyb3VwKTsgLyogRmluaXRlIEN5Y2xpYyBHcm91cCAqLworCWlmICh0b2tlbikKKwkJd3BhYnVmX3B1dF9idWYoYnVmLCB0b2tlbik7CisJcG9zID0gd3BhYnVmX3B1dChidWYsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCWNyeXB0b19iaWdudW1fdG9fYmluKHNhZS0+dG1wLT5vd25fY29tbWl0X3NjYWxhciwgcG9zLAorCQkJICAgICBzYWUtPnRtcC0+cHJpbWVfbGVuLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IG93biBjb21taXQtc2NhbGFyIiwKKwkJICAgIHBvcywgc2FlLT50bXAtPnByaW1lX2xlbik7CisJaWYgKHNhZS0+dG1wLT5lYykgeworCQlwb3MgPSB3cGFidWZfcHV0KGJ1ZiwgMiAqIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCQljcnlwdG9fZWNfcG9pbnRfdG9fYmluKHNhZS0+dG1wLT5lYywKKwkJCQkgICAgICAgc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9lY2MsCisJCQkJICAgICAgIHBvcywgcG9zICsgc2FlLT50bXAtPnByaW1lX2xlbik7CisJCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIlNBRTogb3duIGNvbW1pdC1lbGVtZW50KHgpIiwKKwkJCSAgICBwb3MsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IG93biBjb21taXQtZWxlbWVudCh5KSIsCisJCQkgICAgcG9zICsgc2FlLT50bXAtPnByaW1lX2xlbiwgc2FlLT50bXAtPnByaW1lX2xlbik7CisJfSBlbHNlIHsKKwkJcG9zID0gd3BhYnVmX3B1dChidWYsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCQljcnlwdG9fYmlnbnVtX3RvX2JpbihzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2ZmYywgcG9zLAorCQkJCSAgICAgc2FlLT50bXAtPnByaW1lX2xlbiwgc2FlLT50bXAtPnByaW1lX2xlbik7CisJCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIlNBRTogb3duIGNvbW1pdC1lbGVtZW50IiwKKwkJCSAgICBwb3MsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCX0KK30KKworCitzdGF0aWMgdTE2IHNhZV9ncm91cF9hbGxvd2VkKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBpbnQgKmFsbG93ZWRfZ3JvdXBzLAorCQkJICAgICB1MTYgZ3JvdXApCit7CisJaWYgKGFsbG93ZWRfZ3JvdXBzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBhbGxvd2VkX2dyb3Vwc1tpXSA+PSAwOyBpKyspIHsKKwkJCWlmIChhbGxvd2VkX2dyb3Vwc1tpXSA9PSBncm91cCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoYWxsb3dlZF9ncm91cHNbaV0gIT0gZ3JvdXApIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBQcm9wb3NlZCBncm91cCAldSBub3QgIgorCQkJCSAgICJlbmFibGVkIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24iLAorCQkJCSAgIGdyb3VwKTsKKwkJCXJldHVybiBXTEFOX1NUQVRVU19GSU5JVEVfQ1lDTElDX0dST1VQX05PVF9TVVBQT1JURUQ7CisJCX0KKwl9CisKKwlpZiAoc2FlLT5zdGF0ZSA9PSBTQUVfQ09NTUlUVEVEICYmIGdyb3VwICE9IHNhZS0+Z3JvdXApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IERvIG5vdCBhbGxvdyBncm91cCB0byBiZSBjaGFuZ2VkIik7CisJCXJldHVybiBXTEFOX1NUQVRVU19GSU5JVEVfQ1lDTElDX0dST1VQX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGdyb3VwICE9IHNhZS0+Z3JvdXAgJiYgc2FlX3NldF9ncm91cChzYWUsIGdyb3VwKSA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IFVuc3VwcG9ydGVkIEZpbml0ZSBDeWNsaWMgR3JvdXAgJXUiLAorCQkJICAgZ3JvdXApOworCQlyZXR1cm4gV0xBTl9TVEFUVVNfRklOSVRFX0NZQ0xJQ19HUk9VUF9OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChzYWUtPnRtcC0+ZGggJiYgIWFsbG93ZWRfZ3JvdXBzKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBEbyBub3QgYWxsb3cgRkZDIGdyb3VwICV1IHdpdGhvdXQgIgorCQkJICAgImV4cGxpY2l0IGNvbmZpZ3VyYXRpb24gZW5hYmxpbmcgaXQiLCBncm91cCk7CisJCXJldHVybiBXTEFOX1NUQVRVU19GSU5JVEVfQ1lDTElDX0dST1VQX05PVF9TVVBQT1JURUQ7CisJfQorCisJcmV0dXJuIFdMQU5fU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIHZvaWQgc2FlX3BhcnNlX2NvbW1pdF90b2tlbihzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKipwb3MsCisJCQkJICAgY29uc3QgdTggKmVuZCwgY29uc3QgdTggKip0b2tlbiwKKwkJCQkgICBzaXplX3QgKnRva2VuX2xlbikKK3sKKwlpZiAoKnBvcyArIChzYWUtPnRtcC0+ZWMgPyAzIDogMikgKiBzYWUtPnRtcC0+cHJpbWVfbGVuIDwgZW5kKSB7CisJCXNpemVfdCB0bGVuID0gZW5kIC0gKCpwb3MgKyAoc2FlLT50bXAtPmVjID8gMyA6IDIpICoKKwkJCQkgICAgIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IEFudGktQ2xvZ2dpbmcgVG9rZW4iLCAqcG9zLCB0bGVuKTsKKwkJaWYgKHRva2VuKQorCQkJKnRva2VuID0gKnBvczsKKwkJaWYgKHRva2VuX2xlbikKKwkJCSp0b2tlbl9sZW4gPSB0bGVuOworCQkqcG9zICs9IHRsZW47CisJfSBlbHNlIHsKKwkJaWYgKHRva2VuKQorCQkJKnRva2VuID0gTlVMTDsKKwkJaWYgKHRva2VuX2xlbikKKwkJCSp0b2tlbl9sZW4gPSAwOworCX0KK30KKworCitzdGF0aWMgdTE2IHNhZV9wYXJzZV9jb21taXRfc2NhbGFyKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqKnBvcywKKwkJCQkgICBjb25zdCB1OCAqZW5kKQoreworCXN0cnVjdCBjcnlwdG9fYmlnbnVtICpwZWVyX3NjYWxhcjsKKworCWlmICgqcG9zICsgc2FlLT50bXAtPnByaW1lX2xlbiA+IGVuZCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogTm90IGVub3VnaCBkYXRhIGZvciBzY2FsYXIiKTsKKwkJcmV0dXJuIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJfQorCisJcGVlcl9zY2FsYXIgPSBjcnlwdG9fYmlnbnVtX2luaXRfc2V0KCpwb3MsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCWlmIChwZWVyX3NjYWxhciA9PSBOVUxMKQorCQlyZXR1cm4gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKworCS8qCisJICogSUVFRSBTdGQgODAyLjExLTIwMTIsIDExLjMuOC42LjE6IElmIHRoZXJlIGlzIGEgcHJvdG9jb2wgaW5zdGFuY2UgZm9yCisJICogdGhlIHBlZXIgYW5kIGl0IGlzIGluIEF1dGhlbnRpY2F0ZWQgc3RhdGUsIHRoZSBuZXcgQ29tbWl0IE1lc3NhZ2UKKwkgKiBzaGFsbCBiZSBkcm9wcGVkIGlmIHRoZSBwZWVyLXNjYWxhciBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB1c2VkIGluCisJICogdGhlIGV4aXN0aW5nIHByb3RvY29sIGluc3RhbmNlLgorCSAqLworCWlmIChzYWUtPnN0YXRlID09IFNBRV9BQ0NFUFRFRCAmJiBzYWUtPnBlZXJfY29tbWl0X3NjYWxhciAmJgorCSAgICBjcnlwdG9fYmlnbnVtX2NtcChzYWUtPnBlZXJfY29tbWl0X3NjYWxhciwgcGVlcl9zY2FsYXIpID09IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IERvIG5vdCBhY2NlcHQgcmUtdXNlIG9mIHByZXZpb3VzICIKKwkJCSAgICJwZWVyLWNvbW1pdC1zY2FsYXIiKTsKKwkJY3J5cHRvX2JpZ251bV9kZWluaXQocGVlcl9zY2FsYXIsIDApOworCQlyZXR1cm4gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwl9CisKKwkvKiAwIDwgc2NhbGFyIDwgciAqLworCWlmIChjcnlwdG9fYmlnbnVtX2lzX3plcm8ocGVlcl9zY2FsYXIpIHx8CisJICAgIGNyeXB0b19iaWdudW1fY21wKHBlZXJfc2NhbGFyLCBzYWUtPnRtcC0+b3JkZXIpID49IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IEludmFsaWQgcGVlciBzY2FsYXIiKTsKKwkJY3J5cHRvX2JpZ251bV9kZWluaXQocGVlcl9zY2FsYXIsIDApOworCQlyZXR1cm4gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwl9CisKKworCWNyeXB0b19iaWdudW1fZGVpbml0KHNhZS0+cGVlcl9jb21taXRfc2NhbGFyLCAwKTsKKwlzYWUtPnBlZXJfY29tbWl0X3NjYWxhciA9IHBlZXJfc2NhbGFyOworCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIlNBRTogUGVlciBjb21taXQtc2NhbGFyIiwKKwkJICAgICpwb3MsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCSpwb3MgKz0gc2FlLT50bXAtPnByaW1lX2xlbjsKKworCXJldHVybiBXTEFOX1NUQVRVU19TVUNDRVNTOworfQorCisKK3N0YXRpYyB1MTYgc2FlX3BhcnNlX2NvbW1pdF9lbGVtZW50X2VjYyhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKnBvcywKKwkJCQkJY29uc3QgdTggKmVuZCkKK3sKKwl1OCBwcmltZVtTQUVfTUFYX0VDQ19QUklNRV9MRU5dOworCisJaWYgKHBvcyArIDIgKiBzYWUtPnRtcC0+cHJpbWVfbGVuID4gZW5kKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBOb3QgZW5vdWdoIGRhdGEgZm9yICIKKwkJCSAgICJjb21taXQtZWxlbWVudCIpOworCQlyZXR1cm4gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwl9CisKKwlpZiAoY3J5cHRvX2JpZ251bV90b19iaW4oc2FlLT50bXAtPnByaW1lLCBwcmltZSwgc2l6ZW9mKHByaW1lKSwKKwkJCQkgc2FlLT50bXAtPnByaW1lX2xlbikgPCAwKQorCQlyZXR1cm4gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKworCS8qIGVsZW1lbnQgeCBhbmQgeSBjb29yZGluYXRlcyA8IHAgKi8KKwlpZiAob3NfbWVtY21wKHBvcywgcHJpbWUsIHNhZS0+dG1wLT5wcmltZV9sZW4pID49IDAgfHwKKwkgICAgb3NfbWVtY21wKHBvcyArIHNhZS0+dG1wLT5wcmltZV9sZW4gKyBzYWUtPnRtcC0+cHJpbWVfbGVuLCBwcmltZSwKKwkJICAgICAgc2FlLT50bXAtPnByaW1lX2xlbikgPj0gMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogSW52YWxpZCBjb29yZGluYXRlcyBpbiBwZWVyICIKKwkJCSAgICJlbGVtZW50Iik7CisJCXJldHVybiBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCX0KKworCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIlNBRTogUGVlciBjb21taXQtZWxlbWVudCh4KSIsCisJCSAgICBwb3MsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIlNBRTogUGVlciBjb21taXQtZWxlbWVudCh5KSIsCisJCSAgICBwb3MgKyBzYWUtPnRtcC0+cHJpbWVfbGVuLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKworCWNyeXB0b19lY19wb2ludF9kZWluaXQoc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZWNjLCAwKTsKKwlzYWUtPnRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9lY2MgPQorCQljcnlwdG9fZWNfcG9pbnRfZnJvbV9iaW4oc2FlLT50bXAtPmVjLCBwb3MpOworCWlmIChzYWUtPnRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9lY2MgPT0gTlVMTCkKKwkJcmV0dXJuIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisKKwlyZXR1cm4gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgdTE2IHNhZV9wYXJzZV9jb21taXRfZWxlbWVudF9mZmMoc3RydWN0IHNhZV9kYXRhICpzYWUsIGNvbnN0IHU4ICpwb3MsCisJCQkJCWNvbnN0IHU4ICplbmQpCit7CisJaWYgKHBvcyArIHNhZS0+dG1wLT5wcmltZV9sZW4gPiBlbmQpIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IE5vdCBlbm91Z2ggZGF0YSBmb3IgIgorCQkJICAgImNvbW1pdC1lbGVtZW50Iik7CisJCXJldHVybiBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCX0KKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IFBlZXIgY29tbWl0LWVsZW1lbnQiLCBwb3MsCisJCSAgICBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKworCWNyeXB0b19iaWdudW1fZGVpbml0KHNhZS0+dG1wLT5wZWVyX2NvbW1pdF9lbGVtZW50X2ZmYywgMCk7CisJc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZmZjID0KKwkJY3J5cHRvX2JpZ251bV9pbml0X3NldChwb3MsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCWlmIChzYWUtPnRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9mZmMgPT0gTlVMTCkKKwkJcmV0dXJuIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJaWYgKGNyeXB0b19iaWdudW1faXNfemVybyhzYWUtPnRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9mZmMpIHx8CisJICAgIGNyeXB0b19iaWdudW1faXNfb25lKHNhZS0+dG1wLT5wZWVyX2NvbW1pdF9lbGVtZW50X2ZmYykgfHwKKwkgICAgY3J5cHRvX2JpZ251bV9jbXAoc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZmZjLAorCQkJICAgICAgc2FlLT50bXAtPnByaW1lKSA+PSAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBJbnZhbGlkIHBlZXIgZWxlbWVudCIpOworCQlyZXR1cm4gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgdTE2IHNhZV9wYXJzZV9jb21taXRfZWxlbWVudChzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKnBvcywKKwkJCQkgICAgY29uc3QgdTggKmVuZCkKK3sKKwlpZiAoc2FlLT50bXAtPmRoKQorCQlyZXR1cm4gc2FlX3BhcnNlX2NvbW1pdF9lbGVtZW50X2ZmYyhzYWUsIHBvcywgZW5kKTsKKwlyZXR1cm4gc2FlX3BhcnNlX2NvbW1pdF9lbGVtZW50X2VjYyhzYWUsIHBvcywgZW5kKTsKK30KKworCit1MTYgc2FlX3BhcnNlX2NvbW1pdChzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKmRhdGEsIHNpemVfdCBsZW4sCisJCSAgICAgY29uc3QgdTggKip0b2tlbiwgc2l6ZV90ICp0b2tlbl9sZW4sIGludCAqYWxsb3dlZF9ncm91cHMpCit7CisJY29uc3QgdTggKnBvcyA9IGRhdGEsICplbmQgPSBkYXRhICsgbGVuOworCXUxNiByZXM7CisKKwkvKiBDaGVjayBGaW5pdGUgQ3ljbGljIEdyb3VwICovCisJaWYgKHBvcyArIDIgPiBlbmQpCisJCXJldHVybiBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCXJlcyA9IHNhZV9ncm91cF9hbGxvd2VkKHNhZSwgYWxsb3dlZF9ncm91cHMsIFdQQV9HRVRfTEUxNihwb3MpKTsKKwlpZiAocmVzICE9IFdMQU5fU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiByZXM7CisJcG9zICs9IDI7CisKKwkvKiBPcHRpb25hbCBBbnRpLUNsb2dnaW5nIFRva2VuICovCisJc2FlX3BhcnNlX2NvbW1pdF90b2tlbihzYWUsICZwb3MsIGVuZCwgdG9rZW4sIHRva2VuX2xlbik7CisKKwkvKiBjb21taXQtc2NhbGFyICovCisJcmVzID0gc2FlX3BhcnNlX2NvbW1pdF9zY2FsYXIoc2FlLCAmcG9zLCBlbmQpOworCWlmIChyZXMgIT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIHJlczsKKworCS8qIGNvbW1pdC1lbGVtZW50ICovCisJcmV0dXJuIHNhZV9wYXJzZV9jb21taXRfZWxlbWVudChzYWUsIHBvcywgZW5kKTsKK30KKworCitzdGF0aWMgdm9pZCBzYWVfY25fY29uZmlybShzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKnNjLAorCQkJICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKnNjYWxhcjEsCisJCQkgICBjb25zdCB1OCAqZWxlbWVudDEsIHNpemVfdCBlbGVtZW50MV9sZW4sCisJCQkgICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqc2NhbGFyMiwKKwkJCSAgIGNvbnN0IHU4ICplbGVtZW50Miwgc2l6ZV90IGVsZW1lbnQyX2xlbiwKKwkJCSAgIHU4ICpjb25maXJtKQoreworCWNvbnN0IHU4ICphZGRyWzVdOworCXNpemVfdCBsZW5bNV07CisJdTggc2NhbGFyX2IxW1NBRV9NQVhfUFJJTUVfTEVOXSwgc2NhbGFyX2IyW1NBRV9NQVhfUFJJTUVfTEVOXTsKKworCS8qIENvbmZpcm0KKwkgKiBDTihrZXksIFgsIFksIFosIC4uLikgPQorCSAqICAgIEhNQUMtU0hBMjU2KGtleSwgRDJPUyhYKSB8fCBEMk9TKFkpIHx8IEQyT1MoWikgfCAuLi4pCisJICogY29uZmlybSA9IENOKEtDSywgc2VuZC1jb25maXJtLCBjb21taXQtc2NhbGFyLCBDT01NSVQtRUxFTUVOVCwKKwkgKiAgICAgICAgICAgICAgcGVlci1jb21taXQtc2NhbGFyLCBQRUVSLUNPTU1JVC1FTEVNRU5UKQorCSAqIHZlcmlmaWVyID0gQ04oS0NLLCBwZWVyLXNlbmQtY29uZmlybSwgcGVlci1jb21taXQtc2NhbGFyLAorCSAqICAgICAgICAgICAgICAgUEVFUi1DT01NSVQtRUxFTUVOVCwgY29tbWl0LXNjYWxhciwgQ09NTUlULUVMRU1FTlQpCisJICovCisJYWRkclswXSA9IHNjOworCWxlblswXSA9IDI7CisJY3J5cHRvX2JpZ251bV90b19iaW4oc2NhbGFyMSwgc2NhbGFyX2IxLCBzaXplb2Yoc2NhbGFyX2IxKSwKKwkJCSAgICAgc2FlLT50bXAtPnByaW1lX2xlbik7CisJYWRkclsxXSA9IHNjYWxhcl9iMTsKKwlsZW5bMV0gPSBzYWUtPnRtcC0+cHJpbWVfbGVuOworCWFkZHJbMl0gPSBlbGVtZW50MTsKKwlsZW5bMl0gPSBlbGVtZW50MV9sZW47CisJY3J5cHRvX2JpZ251bV90b19iaW4oc2NhbGFyMiwgc2NhbGFyX2IyLCBzaXplb2Yoc2NhbGFyX2IyKSwKKwkJCSAgICAgc2FlLT50bXAtPnByaW1lX2xlbik7CisJYWRkclszXSA9IHNjYWxhcl9iMjsKKwlsZW5bM10gPSBzYWUtPnRtcC0+cHJpbWVfbGVuOworCWFkZHJbNF0gPSBlbGVtZW50MjsKKwlsZW5bNF0gPSBlbGVtZW50Ml9sZW47CisJaG1hY19zaGEyNTZfdmVjdG9yKHNhZS0+dG1wLT5rY2ssIHNpemVvZihzYWUtPnRtcC0+a2NrKSwgNSwgYWRkciwgbGVuLAorCQkJICAgY29uZmlybSk7Cit9CisKKworc3RhdGljIHZvaWQgc2FlX2NuX2NvbmZpcm1fZWNjKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqc2MsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKnNjYWxhcjEsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqZWxlbWVudDEsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKnNjYWxhcjIsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqZWxlbWVudDIsCisJCQkgICAgICAgdTggKmNvbmZpcm0pCit7CisJdTggZWxlbWVudF9iMVsyICogU0FFX01BWF9FQ0NfUFJJTUVfTEVOXTsKKwl1OCBlbGVtZW50X2IyWzIgKiBTQUVfTUFYX0VDQ19QUklNRV9MRU5dOworCisJY3J5cHRvX2VjX3BvaW50X3RvX2JpbihzYWUtPnRtcC0+ZWMsIGVsZW1lbnQxLCBlbGVtZW50X2IxLAorCQkJICAgICAgIGVsZW1lbnRfYjEgKyBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwljcnlwdG9fZWNfcG9pbnRfdG9fYmluKHNhZS0+dG1wLT5lYywgZWxlbWVudDIsIGVsZW1lbnRfYjIsCisJCQkgICAgICAgZWxlbWVudF9iMiArIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCisJc2FlX2NuX2NvbmZpcm0oc2FlLCBzYywgc2NhbGFyMSwgZWxlbWVudF9iMSwgMiAqIHNhZS0+dG1wLT5wcmltZV9sZW4sCisJCSAgICAgICBzY2FsYXIyLCBlbGVtZW50X2IyLCAyICogc2FlLT50bXAtPnByaW1lX2xlbiwgY29uZmlybSk7Cit9CisKKworc3RhdGljIHZvaWQgc2FlX2NuX2NvbmZpcm1fZmZjKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqc2MsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKnNjYWxhcjEsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmVsZW1lbnQxLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpzY2FsYXIyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICplbGVtZW50MiwKKwkJCSAgICAgICB1OCAqY29uZmlybSkKK3sKKwl1OCBlbGVtZW50X2IxW1NBRV9NQVhfUFJJTUVfTEVOXTsKKwl1OCBlbGVtZW50X2IyW1NBRV9NQVhfUFJJTUVfTEVOXTsKKworCWNyeXB0b19iaWdudW1fdG9fYmluKGVsZW1lbnQxLCBlbGVtZW50X2IxLCBzaXplb2YoZWxlbWVudF9iMSksCisJCQkgICAgIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCWNyeXB0b19iaWdudW1fdG9fYmluKGVsZW1lbnQyLCBlbGVtZW50X2IyLCBzaXplb2YoZWxlbWVudF9iMiksCisJCQkgICAgIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCisJc2FlX2NuX2NvbmZpcm0oc2FlLCBzYywgc2NhbGFyMSwgZWxlbWVudF9iMSwgc2FlLT50bXAtPnByaW1lX2xlbiwKKwkJICAgICAgIHNjYWxhcjIsIGVsZW1lbnRfYjIsIHNhZS0+dG1wLT5wcmltZV9sZW4sIGNvbmZpcm0pOworfQorCisKK3ZvaWQgc2FlX3dyaXRlX2NvbmZpcm0oc3RydWN0IHNhZV9kYXRhICpzYWUsIHN0cnVjdCB3cGFidWYgKmJ1ZikKK3sKKwljb25zdCB1OCAqc2M7CisKKwkvKiBTZW5kLUNvbmZpcm0gKi8KKwlzYyA9IHdwYWJ1Zl9wdXQoYnVmLCAwKTsKKwl3cGFidWZfcHV0X2xlMTYoYnVmLCBzYWUtPnNlbmRfY29uZmlybSk7CisJc2FlLT5zZW5kX2NvbmZpcm0rKzsKKworCWlmIChzYWUtPnRtcC0+ZWMpCisJCXNhZV9jbl9jb25maXJtX2VjYyhzYWUsIHNjLCBzYWUtPnRtcC0+b3duX2NvbW1pdF9zY2FsYXIsCisJCQkJICAgc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9lY2MsCisJCQkJICAgc2FlLT5wZWVyX2NvbW1pdF9zY2FsYXIsCisJCQkJICAgc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZWNjLAorCQkJCSAgIHdwYWJ1Zl9wdXQoYnVmLCBTSEEyNTZfTUFDX0xFTikpOworCWVsc2UKKwkJc2FlX2NuX2NvbmZpcm1fZmZjKHNhZSwgc2MsIHNhZS0+dG1wLT5vd25fY29tbWl0X3NjYWxhciwKKwkJCQkgICBzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2ZmYywKKwkJCQkgICBzYWUtPnBlZXJfY29tbWl0X3NjYWxhciwKKwkJCQkgICBzYWUtPnRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9mZmMsCisJCQkJICAgd3BhYnVmX3B1dChidWYsIFNIQTI1Nl9NQUNfTEVOKSk7Cit9CisKKworaW50IHNhZV9jaGVja19jb25maXJtKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwl1OCB2ZXJpZmllcltTSEEyNTZfTUFDX0xFTl07CisKKwlpZiAobGVuIDwgMiArIFNIQTI1Nl9NQUNfTEVOKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBUb28gc2hvcnQgY29uZmlybSBtZXNzYWdlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogcGVlci1zZW5kLWNvbmZpcm0gJXUiLCBXUEFfR0VUX0xFMTYoZGF0YSkpOworCisJaWYgKHNhZS0+dG1wLT5lYykKKwkJc2FlX2NuX2NvbmZpcm1fZWNjKHNhZSwgZGF0YSwgc2FlLT5wZWVyX2NvbW1pdF9zY2FsYXIsCisJCQkJICAgc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZWNjLAorCQkJCSAgIHNhZS0+dG1wLT5vd25fY29tbWl0X3NjYWxhciwKKwkJCQkgICBzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2VjYywKKwkJCQkgICB2ZXJpZmllcik7CisJZWxzZQorCQlzYWVfY25fY29uZmlybV9mZmMoc2FlLCBkYXRhLCBzYWUtPnBlZXJfY29tbWl0X3NjYWxhciwKKwkJCQkgICBzYWUtPnRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9mZmMsCisJCQkJICAgc2FlLT50bXAtPm93bl9jb21taXRfc2NhbGFyLAorCQkJCSAgIHNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZmZjLAorCQkJCSAgIHZlcmlmaWVyKTsKKworCWlmIChvc19tZW1jbXAodmVyaWZpZXIsIGRhdGEgKyAyLCBTSEEyNTZfTUFDX0xFTikgIT0gMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogQ29uZmlybSBtaXNtYXRjaCIpOworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IFJlY2VpdmVkIGNvbmZpcm0iLAorCQkJICAgIGRhdGEgKyAyLCBTSEEyNTZfTUFDX0xFTik7CisJCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIlNBRTogQ2FsY3VsYXRlZCB2ZXJpZmllciIsCisJCQkgICAgdmVyaWZpZXIsIFNIQTI1Nl9NQUNfTEVOKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi9zYWUuaCBiL3NyYy9jb21tb24vc2FlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyYTk4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb21tb24vc2FlLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFNpbXVsdGFuZW91cyBhdXRoZW50aWNhdGlvbiBvZiBlcXVhbHMKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBTQUVfSAorI2RlZmluZSBTQUVfSAorCisjZGVmaW5lIFNBRV9LQ0tfTEVOIDMyCisjZGVmaW5lIFNBRV9QTUtfTEVOIDMyCisjZGVmaW5lIFNBRV9QTUtJRF9MRU4gMTYKKyNkZWZpbmUgU0FFX0tFWVNFRURfS0VZX0xFTiAzMgorI2RlZmluZSBTQUVfTUFYX1BSSU1FX0xFTiA1MTIKKyNkZWZpbmUgU0FFX01BWF9FQ0NfUFJJTUVfTEVOIDY2CisjZGVmaW5lIFNBRV9DT01NSVRfTUFYX0xFTiAoMiArIDMgKiBTQUVfTUFYX1BSSU1FX0xFTikKKyNkZWZpbmUgU0FFX0NPTkZJUk1fTUFYX0xFTiAoMiArIFNBRV9NQVhfUFJJTUVfTEVOKQorCitzdHJ1Y3Qgc2FlX3RlbXBvcmFyeV9kYXRhIHsKKwl1OCBrY2tbU0FFX0tDS19MRU5dOworCXN0cnVjdCBjcnlwdG9fYmlnbnVtICpvd25fY29tbWl0X3NjYWxhcjsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqb3duX2NvbW1pdF9lbGVtZW50X2ZmYzsKKwlzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpvd25fY29tbWl0X2VsZW1lbnRfZWNjOworCXN0cnVjdCBjcnlwdG9fYmlnbnVtICpwZWVyX2NvbW1pdF9lbGVtZW50X2ZmYzsKKwlzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpwZWVyX2NvbW1pdF9lbGVtZW50X2VjYzsKKwlzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpwd2VfZWNjOworCXN0cnVjdCBjcnlwdG9fYmlnbnVtICpwd2VfZmZjOworCXN0cnVjdCBjcnlwdG9fYmlnbnVtICpzYWVfcmFuZDsKKwlzdHJ1Y3QgY3J5cHRvX2VjICplYzsKKwlpbnQgcHJpbWVfbGVuOworCWNvbnN0IHN0cnVjdCBkaF9ncm91cCAqZGg7CisJY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKnByaW1lOworCWNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpvcmRlcjsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqcHJpbWVfYnVmOworCXN0cnVjdCBjcnlwdG9fYmlnbnVtICpvcmRlcl9idWY7Cit9OworCitzdHJ1Y3Qgc2FlX2RhdGEgeworCWVudW0geyBTQUVfTk9USElORywgU0FFX0NPTU1JVFRFRCwgU0FFX0NPTkZJUk1FRCwgU0FFX0FDQ0VQVEVEIH0gc3RhdGU7CisJdTE2IHNlbmRfY29uZmlybTsKKwl1OCBwbWtbU0FFX1BNS19MRU5dOworCXN0cnVjdCBjcnlwdG9fYmlnbnVtICpwZWVyX2NvbW1pdF9zY2FsYXI7CisJaW50IGdyb3VwOworCXN0cnVjdCBzYWVfdGVtcG9yYXJ5X2RhdGEgKnRtcDsKK307CisKK2ludCBzYWVfc2V0X2dyb3VwKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBpbnQgZ3JvdXApOwordm9pZCBzYWVfY2xlYXJfdGVtcF9kYXRhKHN0cnVjdCBzYWVfZGF0YSAqc2FlKTsKK3ZvaWQgc2FlX2NsZWFyX2RhdGEoc3RydWN0IHNhZV9kYXRhICpzYWUpOworCitpbnQgc2FlX3ByZXBhcmVfY29tbWl0KGNvbnN0IHU4ICphZGRyMSwgY29uc3QgdTggKmFkZHIyLAorCQkgICAgICAgY29uc3QgdTggKnBhc3N3b3JkLCBzaXplX3QgcGFzc3dvcmRfbGVuLAorCQkgICAgICAgc3RydWN0IHNhZV9kYXRhICpzYWUpOworaW50IHNhZV9wcm9jZXNzX2NvbW1pdChzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSk7Cit2b2lkIHNhZV93cml0ZV9jb21taXQoc3RydWN0IHNhZV9kYXRhICpzYWUsIHN0cnVjdCB3cGFidWYgKmJ1ZiwKKwkJICAgICAgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqdG9rZW4pOwordTE2IHNhZV9wYXJzZV9jb21taXQoc3RydWN0IHNhZV9kYXRhICpzYWUsIGNvbnN0IHU4ICpkYXRhLCBzaXplX3QgbGVuLAorCQkgICAgIGNvbnN0IHU4ICoqdG9rZW4sIHNpemVfdCAqdG9rZW5fbGVuLCBpbnQgKmFsbG93ZWRfZ3JvdXBzKTsKK3ZvaWQgc2FlX3dyaXRlX2NvbmZpcm0oc3RydWN0IHNhZV9kYXRhICpzYWUsIHN0cnVjdCB3cGFidWYgKmJ1Zik7CitpbnQgc2FlX2NoZWNrX2NvbmZpcm0oc3RydWN0IHNhZV9kYXRhICpzYWUsIGNvbnN0IHU4ICpkYXRhLCBzaXplX3QgbGVuKTsKKworI2VuZGlmIC8qIFNBRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29tbW9uL3ZlcnNpb24uaCBiL3NyYy9jb21tb24vdmVyc2lvbi5oCmluZGV4IDdhZmJhNDguLjJmYWE4YzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb21tb24vdmVyc2lvbi5oCisrKyBiL3NyYy9jb21tb24vdmVyc2lvbi5oCkBAIC01LDYgKzUsNiBAQAogI2RlZmluZSBWRVJTSU9OX1NUUl9QT1NURklYICIiCiAjZW5kaWYgLyogVkVSU0lPTl9TVFJfUE9TVEZJWCAqLwogCi0jZGVmaW5lIFZFUlNJT05fU1RSICIyLjAtZGV2ZWwiIFZFUlNJT05fU1RSX1BPU1RGSVgKKyNkZWZpbmUgVkVSU0lPTl9TVFIgIjIuMS1kZXZlbCIgVkVSU0lPTl9TVFJfUE9TVEZJWAogCiAjZW5kaWYgLyogVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29tbW9uL3dwYV9jb21tb24uYyBiL3NyYy9jb21tb24vd3BhX2NvbW1vbi5jCmluZGV4IDM2YzMwOGEuLmE4Y2Y2YmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb21tb24vd3BhX2NvbW1vbi5jCisrKyBiL3NyYy9jb21tb24vd3BhX2NvbW1vbi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFdQQS9SU04gLSBTaGFyZWQgZnVuY3Rpb25zIGZvciBzdXBwbGljYW50IGFuZCBhdXRoZW50aWNhdG9yCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwOCwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDEzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCkBAIC0zNzYsNiArMzc2LDEyIEBACiAJaWYgKFJTTl9TRUxFQ1RPUl9HRVQocykgPT0gUlNOX0FVVEhfS0VZX01HTVRfUFNLX1NIQTI1NikKIAkJcmV0dXJuIFdQQV9LRVlfTUdNVF9QU0tfU0hBMjU2OwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCisjaWZkZWYgQ09ORklHX1NBRQorCWlmIChSU05fU0VMRUNUT1JfR0VUKHMpID09IFJTTl9BVVRIX0tFWV9NR01UX1NBRSkKKwkJcmV0dXJuIFdQQV9LRVlfTUdNVF9TQUU7CisJaWYgKFJTTl9TRUxFQ1RPUl9HRVQocykgPT0gUlNOX0FVVEhfS0VZX01HTVRfRlRfU0FFKQorCQlyZXR1cm4gV1BBX0tFWV9NR01UX0ZUX1NBRTsKKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX05PX1dQQTIgKi8KQEAgLTExMjYsNiArMTEzMiwyNiBAQAogfQogCiAKK2VudW0gd3BhX2NpcGhlciB3cGFfY2lwaGVyX3RvX3N1aXRlX2RyaXZlcihpbnQgY2lwaGVyKQoreworCXN3aXRjaCAoY2lwaGVyKSB7CisJY2FzZSBXUEFfQ0lQSEVSX05PTkU6CisJCXJldHVybiBDSVBIRVJfTk9ORTsKKwljYXNlIFdQQV9DSVBIRVJfV0VQNDA6CisJCXJldHVybiBDSVBIRVJfV0VQNDA7CisJY2FzZSBXUEFfQ0lQSEVSX1dFUDEwNDoKKwkJcmV0dXJuIENJUEhFUl9XRVAxMDQ7CisJY2FzZSBXUEFfQ0lQSEVSX0NDTVA6CisJCXJldHVybiBDSVBIRVJfQ0NNUDsKKwljYXNlIFdQQV9DSVBIRVJfR0NNUDoKKwkJcmV0dXJuIENJUEhFUl9HQ01QOworCWNhc2UgV1BBX0NJUEhFUl9US0lQOgorCWRlZmF1bHQ6CisJCXJldHVybiBDSVBIRVJfVEtJUDsKKwl9Cit9CisKKwogaW50IHdwYV9jaXBoZXJfdmFsaWRfcGFpcndpc2UoaW50IGNpcGhlcikKIHsKIAlyZXR1cm4gY2lwaGVyID09IFdQQV9DSVBIRVJfQ0NNUCB8fApAQCAtMTIwOCwzICsxMjM0LDE1MCBAQAogCiAJcmV0dXJuIG51bV9zdWl0ZXM7CiB9CisKKworaW50IHdwYV9waWNrX3BhaXJ3aXNlX2NpcGhlcihpbnQgY2lwaGVycywgaW50IG5vbmVfYWxsb3dlZCkKK3sKKwlpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfQ0NNUCkKKwkJcmV0dXJuIFdQQV9DSVBIRVJfQ0NNUDsKKwlpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfR0NNUCkKKwkJcmV0dXJuIFdQQV9DSVBIRVJfR0NNUDsKKwlpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfVEtJUCkKKwkJcmV0dXJuIFdQQV9DSVBIRVJfVEtJUDsKKwlpZiAobm9uZV9hbGxvd2VkICYmIChjaXBoZXJzICYgV1BBX0NJUEhFUl9OT05FKSkKKwkJcmV0dXJuIFdQQV9DSVBIRVJfTk9ORTsKKwlyZXR1cm4gLTE7Cit9CisKKworaW50IHdwYV9waWNrX2dyb3VwX2NpcGhlcihpbnQgY2lwaGVycykKK3sKKwlpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfQ0NNUCkKKwkJcmV0dXJuIFdQQV9DSVBIRVJfQ0NNUDsKKwlpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfR0NNUCkKKwkJcmV0dXJuIFdQQV9DSVBIRVJfR0NNUDsKKwlpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfVEtJUCkKKwkJcmV0dXJuIFdQQV9DSVBIRVJfVEtJUDsKKwlpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfV0VQMTA0KQorCQlyZXR1cm4gV1BBX0NJUEhFUl9XRVAxMDQ7CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX1dFUDQwKQorCQlyZXR1cm4gV1BBX0NJUEhFUl9XRVA0MDsKKwlyZXR1cm4gLTE7Cit9CisKKworaW50IHdwYV9wYXJzZV9jaXBoZXIoY29uc3QgY2hhciAqdmFsdWUpCit7CisJaW50IHZhbCA9IDAsIGxhc3Q7CisJY2hhciAqc3RhcnQsICplbmQsICpidWY7CisKKwlidWYgPSBvc19zdHJkdXAodmFsdWUpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXN0YXJ0ID0gYnVmOworCisJd2hpbGUgKCpzdGFydCAhPSAnXDAnKSB7CisJCXdoaWxlICgqc3RhcnQgPT0gJyAnIHx8ICpzdGFydCA9PSAnXHQnKQorCQkJc3RhcnQrKzsKKwkJaWYgKCpzdGFydCA9PSAnXDAnKQorCQkJYnJlYWs7CisJCWVuZCA9IHN0YXJ0OworCQl3aGlsZSAoKmVuZCAhPSAnICcgJiYgKmVuZCAhPSAnXHQnICYmICplbmQgIT0gJ1wwJykKKwkJCWVuZCsrOworCQlsYXN0ID0gKmVuZCA9PSAnXDAnOworCQkqZW5kID0gJ1wwJzsKKwkJaWYgKG9zX3N0cmNtcChzdGFydCwgIkNDTVAiKSA9PSAwKQorCQkJdmFsIHw9IFdQQV9DSVBIRVJfQ0NNUDsKKwkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiR0NNUCIpID09IDApCisJCQl2YWwgfD0gV1BBX0NJUEhFUl9HQ01QOworCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJUS0lQIikgPT0gMCkKKwkJCXZhbCB8PSBXUEFfQ0lQSEVSX1RLSVA7CisJCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIldFUDEwNCIpID09IDApCisJCQl2YWwgfD0gV1BBX0NJUEhFUl9XRVAxMDQ7CisJCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIldFUDQwIikgPT0gMCkKKwkJCXZhbCB8PSBXUEFfQ0lQSEVSX1dFUDQwOworCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJOT05FIikgPT0gMCkKKwkJCXZhbCB8PSBXUEFfQ0lQSEVSX05PTkU7CisJCWVsc2UgeworCQkJb3NfZnJlZShidWYpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKGxhc3QpCisJCQlicmVhazsKKwkJc3RhcnQgPSBlbmQgKyAxOworCX0KKwlvc19mcmVlKGJ1Zik7CisKKwlyZXR1cm4gdmFsOworfQorCisKK2ludCB3cGFfd3JpdGVfY2lwaGVycyhjaGFyICpzdGFydCwgY2hhciAqZW5kLCBpbnQgY2lwaGVycywgY29uc3QgY2hhciAqZGVsaW0pCit7CisJY2hhciAqcG9zID0gc3RhcnQ7CisJaW50IHJldDsKKworCWlmIChjaXBoZXJzICYgV1BBX0NJUEhFUl9DQ01QKSB7CisJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNDQ01QIiwKKwkJCQkgIHBvcyA9PSBzdGFydCA/ICIiIDogZGVsaW0pOworCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQorCQkJcmV0dXJuIC0xOworCQlwb3MgKz0gcmV0OworCX0KKwlpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfR0NNUCkgeworCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzR0NNUCIsCisJCQkJICBwb3MgPT0gc3RhcnQgPyAiIiA6IGRlbGltKTsKKwkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKKwkJCXJldHVybiAtMTsKKwkJcG9zICs9IHJldDsKKwl9CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX1RLSVApIHsKKwkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc1RLSVAiLAorCQkJCSAgcG9zID09IHN0YXJ0ID8gIiIgOiBkZWxpbSk7CisJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQlyZXR1cm4gLTE7CisJCXBvcyArPSByZXQ7CisJfQorCWlmIChjaXBoZXJzICYgV1BBX0NJUEhFUl9XRVAxMDQpIHsKKwkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc1dFUDEwNCIsCisJCQkJICBwb3MgPT0gc3RhcnQgPyAiIiA6IGRlbGltKTsKKwkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKKwkJCXJldHVybiAtMTsKKwkJcG9zICs9IHJldDsKKwl9CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX1dFUDQwKSB7CisJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNXRVA0MCIsCisJCQkJICBwb3MgPT0gc3RhcnQgPyAiIiA6IGRlbGltKTsKKwkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKKwkJCXJldHVybiAtMTsKKwkJcG9zICs9IHJldDsKKwl9CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX05PTkUpIHsKKwkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc05PTkUiLAorCQkJCSAgcG9zID09IHN0YXJ0ID8gIiIgOiBkZWxpbSk7CisJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQlyZXR1cm4gLTE7CisJCXBvcyArPSByZXQ7CisJfQorCisJcmV0dXJuIHBvcyAtIHN0YXJ0OworfQorCisKK2ludCB3cGFfc2VsZWN0X2FwX2dyb3VwX2NpcGhlcihpbnQgd3BhLCBpbnQgd3BhX3BhaXJ3aXNlLCBpbnQgcnNuX3BhaXJ3aXNlKQoreworCWludCBwYWlyd2lzZSA9IDA7CisKKwkvKiBTZWxlY3QgZ3JvdXAgY2lwaGVyIGJhc2VkIG9uIHRoZSBlbmFibGVkIHBhaXJ3aXNlIGNpcGhlciBzdWl0ZXMgKi8KKwlpZiAod3BhICYgMSkKKwkJcGFpcndpc2UgfD0gd3BhX3BhaXJ3aXNlOworCWlmICh3cGEgJiAyKQorCQlwYWlyd2lzZSB8PSByc25fcGFpcndpc2U7CisKKwlpZiAocGFpcndpc2UgJiBXUEFfQ0lQSEVSX1RLSVApCisJCXJldHVybiBXUEFfQ0lQSEVSX1RLSVA7CisJaWYgKChwYWlyd2lzZSAmIChXUEFfQ0lQSEVSX0NDTVAgfCBXUEFfQ0lQSEVSX0dDTVApKSA9PSBXUEFfQ0lQSEVSX0dDTVApCisJCXJldHVybiBXUEFfQ0lQSEVSX0dDTVA7CisJcmV0dXJuIFdQQV9DSVBIRVJfQ0NNUDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb21tb24vd3BhX2NvbW1vbi5oIGIvc3JjL2NvbW1vbi93cGFfY29tbW9uLmgKaW5kZXggNjAzMTY2Yi4uMmQ2MzY2MiAxMDA2NDQKLS0tIGEvc3JjL2NvbW1vbi93cGFfY29tbW9uLmgKKysrIGIvc3JjL2NvbW1vbi93cGFfY29tbW9uLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogV1BBIGRlZmluaXRpb25zIHNoYXJlZCBiZXR3ZWVuIGhvc3RhcGQgYW5kIHdwYV9zdXBwbGljYW50Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwOCwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDEzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCkBAIC0yMCw2ICsyMCwxMiBAQAogI2RlZmluZSBXUEFfR01LX0xFTiAzMgogI2RlZmluZSBXUEFfR1RLX01BWF9MRU4gMzIKIAorI2RlZmluZSBXUEFfQUxMT1dFRF9QQUlSV0lTRV9DSVBIRVJTIFwKKyhXUEFfQ0lQSEVSX0NDTVAgfCBXUEFfQ0lQSEVSX0dDTVAgfCBXUEFfQ0lQSEVSX1RLSVAgfCBXUEFfQ0lQSEVSX05PTkUpCisjZGVmaW5lIFdQQV9BTExPV0VEX0dST1VQX0NJUEhFUlMgXAorKFdQQV9DSVBIRVJfQ0NNUCB8IFdQQV9DSVBIRVJfR0NNUCB8IFdQQV9DSVBIRVJfVEtJUCB8IFdQQV9DSVBIRVJfV0VQMTA0IHwgXAorV1BBX0NJUEhFUl9XRVA0MCkKKwogI2RlZmluZSBXUEFfU0VMRUNUT1JfTEVOIDQKICNkZWZpbmUgV1BBX1ZFUlNJT04gMQogI2RlZmluZSBSU05fU0VMRUNUT1JfTEVOIDQKQEAgLTMyLDYgKzM4LDcgQEAKICNkZWZpbmUgV1BBX0FVVEhfS0VZX01HTVRfTk9ORSBSU05fU0VMRUNUT1IoMHgwMCwgMHg1MCwgMHhmMiwgMCkKICNkZWZpbmUgV1BBX0FVVEhfS0VZX01HTVRfVU5TUEVDXzgwMl8xWCBSU05fU0VMRUNUT1IoMHgwMCwgMHg1MCwgMHhmMiwgMSkKICNkZWZpbmUgV1BBX0FVVEhfS0VZX01HTVRfUFNLX09WRVJfODAyXzFYIFJTTl9TRUxFQ1RPUigweDAwLCAweDUwLCAweGYyLCAyKQorI2RlZmluZSBXUEFfQVVUSF9LRVlfTUdNVF9DQ0tNIFJTTl9TRUxFQ1RPUigweDAwLCAweDQwLCAweDk2LCAwKQogI2RlZmluZSBXUEFfQ0lQSEVSX1NVSVRFX05PTkUgUlNOX1NFTEVDVE9SKDB4MDAsIDB4NTAsIDB4ZjIsIDApCiAjZGVmaW5lIFdQQV9DSVBIRVJfU1VJVEVfV0VQNDAgUlNOX1NFTEVDVE9SKDB4MDAsIDB4NTAsIDB4ZjIsIDEpCiAjZGVmaW5lIFdQQV9DSVBIRVJfU1VJVEVfVEtJUCBSU05fU0VMRUNUT1IoMHgwMCwgMHg1MCwgMHhmMiwgMikKQEAgLTUxLDYgKzU4LDkgQEAKICNkZWZpbmUgUlNOX0FVVEhfS0VZX01HTVRfODAyXzFYX1NIQTI1NiBSU05fU0VMRUNUT1IoMHgwMCwgMHgwZiwgMHhhYywgNSkKICNkZWZpbmUgUlNOX0FVVEhfS0VZX01HTVRfUFNLX1NIQTI1NiBSU05fU0VMRUNUT1IoMHgwMCwgMHgwZiwgMHhhYywgNikKICNkZWZpbmUgUlNOX0FVVEhfS0VZX01HTVRfVFBLX0hBTkRTSEFLRSBSU05fU0VMRUNUT1IoMHgwMCwgMHgwZiwgMHhhYywgNykKKyNkZWZpbmUgUlNOX0FVVEhfS0VZX01HTVRfU0FFIFJTTl9TRUxFQ1RPUigweDAwLCAweDBmLCAweGFjLCA4KQorI2RlZmluZSBSU05fQVVUSF9LRVlfTUdNVF9GVF9TQUUgUlNOX1NFTEVDVE9SKDB4MDAsIDB4MGYsIDB4YWMsIDkpCisjZGVmaW5lIFJTTl9BVVRIX0tFWV9NR01UX0NDS00gUlNOX1NFTEVDVE9SKDB4MDAsIDB4NDAsIDB4OTYsIDB4MDApCiAKICNkZWZpbmUgUlNOX0NJUEhFUl9TVUlURV9OT05FIFJTTl9TRUxFQ1RPUigweDAwLCAweDBmLCAweGFjLCAwKQogI2RlZmluZSBSU05fQ0lQSEVSX1NVSVRFX1dFUDQwIFJTTl9TRUxFQ1RPUigweDAwLCAweDBmLCAweGFjLCAxKQpAQCAtMzgyLDkgKzM5MiwxNSBAQAogaW50IHdwYV9jaXBoZXJfa2V5X2xlbihpbnQgY2lwaGVyKTsKIGludCB3cGFfY2lwaGVyX3JzY19sZW4oaW50IGNpcGhlcik7CiBpbnQgd3BhX2NpcGhlcl90b19hbGcoaW50IGNpcGhlcik7CitlbnVtIHdwYV9jaXBoZXIgd3BhX2NpcGhlcl90b19zdWl0ZV9kcml2ZXIoaW50IGNpcGhlcik7CiBpbnQgd3BhX2NpcGhlcl92YWxpZF9wYWlyd2lzZShpbnQgY2lwaGVyKTsKIHUzMiB3cGFfY2lwaGVyX3RvX3N1aXRlKGludCBwcm90bywgaW50IGNpcGhlcik7CiBpbnQgcnNuX2NpcGhlcl9wdXRfc3VpdGVzKHU4ICpwb3MsIGludCBjaXBoZXJzKTsKIGludCB3cGFfY2lwaGVyX3B1dF9zdWl0ZXModTggKnBvcywgaW50IGNpcGhlcnMpOworaW50IHdwYV9waWNrX3BhaXJ3aXNlX2NpcGhlcihpbnQgY2lwaGVycywgaW50IG5vbmVfYWxsb3dlZCk7CitpbnQgd3BhX3BpY2tfZ3JvdXBfY2lwaGVyKGludCBjaXBoZXJzKTsKK2ludCB3cGFfcGFyc2VfY2lwaGVyKGNvbnN0IGNoYXIgKnZhbHVlKTsKK2ludCB3cGFfd3JpdGVfY2lwaGVycyhjaGFyICpzdGFydCwgY2hhciAqZW5kLCBpbnQgY2lwaGVycywgY29uc3QgY2hhciAqZGVsaW0pOworaW50IHdwYV9zZWxlY3RfYXBfZ3JvdXBfY2lwaGVyKGludCB3cGEsIGludCB3cGFfcGFpcndpc2UsIGludCByc25fcGFpcndpc2UpOwogCiAjZW5kaWYgLyogV1BBX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29tbW9uL3dwYV9jdHJsLmggYi9zcmMvY29tbW9uL3dwYV9jdHJsLmgKaW5kZXggODRmMTE5NS4uNzdjNDhjZiAxMDA2NDQKLS0tIGEvc3JjL2NvbW1vbi93cGFfY3RybC5oCisrKyBiL3NyYy9jb21tb24vd3BhX2N0cmwuaApAQCAtMTUwLDYgKzE1MCw4IEBACiAjZGVmaW5lIEFQX1NUQV9DT05ORUNURUQgIkFQLVNUQS1DT05ORUNURUQgIgogI2RlZmluZSBBUF9TVEFfRElTQ09OTkVDVEVEICJBUC1TVEEtRElTQ09OTkVDVEVEICIKIAorI2RlZmluZSBBUF9SRUpFQ1RFRF9NQVhfU1RBICJBUC1SRUpFQ1RFRC1NQVgtU1RBICIKKyNkZWZpbmUgQVBfUkVKRUNURURfQkxPQ0tFRF9TVEEgIkFQLVJFSkVDVEVELUJMT0NLRUQtU1RBICIKIAogLyogQlNTIGNvbW1hbmQgaW5mb3JtYXRpb24gbWFza3MgKi8KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jcnlwdG8uaCBiL3NyYy9jcnlwdG8vY3J5cHRvLmgKaW5kZXggMjZiOWFjZi4uOWJjY2FhYSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jcnlwdG8uaAorKysgYi9zcmMvY3J5cHRvL2NyeXB0by5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIFdQQSBTdXBwbGljYW50IC8gd3JhcHBlciBmdW5jdGlvbnMgZm9yIGNyeXB0byBsaWJyYXJpZXMKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA5LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogV3JhcHBlciBmdW5jdGlvbnMgZm9yIGNyeXB0byBsaWJyYXJpZXMKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDEzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCkBAIC00NTcsNCArNDU3LDMyOSBAQAogICovCiBpbnQgY3J5cHRvX2dldF9yYW5kb20odm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKIAorCisvKioKKyAqIHN0cnVjdCBjcnlwdG9fYmlnbnVtIC0gYmlnbnVtCisgKgorICogSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgZm9yIGJpZ251bSBpbXBsZW1lbnRhdGlvbi4gVGhlIGNvbnRlbnRzIGlzIHNwZWNpZmljCisgKiB0byB0aGUgdXNlZCBjcnlwdG8gbGlicmFyeS4KKyAqLworc3RydWN0IGNyeXB0b19iaWdudW07CisKKy8qKgorICogY3J5cHRvX2JpZ251bV9pbml0IC0gQWxsb2NhdGUgbWVtb3J5IGZvciBiaWdudW0KKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gYWxsb2NhdGVkIGJpZ251bSBvciAlTlVMTCBvbiBmYWlsdXJlCisgKi8KK3N0cnVjdCBjcnlwdG9fYmlnbnVtICogY3J5cHRvX2JpZ251bV9pbml0KHZvaWQpOworCisvKioKKyAqIGNyeXB0b19iaWdudW1faW5pdF9zZXQgLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIGJpZ251bSBhbmQgc2V0IHRoZSB2YWx1ZQorICogQGJ1ZjogQnVmZmVyIHdpdGggdW5zaWduZWQgYmluYXJ5IHZhbHVlCisgKiBAbGVuOiBMZW5ndGggb2YgYnVmIGluIG9jdGV0cworICogUmV0dXJuczogUG9pbnRlciB0byBhbGxvY2F0ZWQgYmlnbnVtIG9yICVOVUxMIG9uIGZhaWx1cmUKKyAqLworc3RydWN0IGNyeXB0b19iaWdudW0gKiBjcnlwdG9fYmlnbnVtX2luaXRfc2V0KGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pOworCisvKioKKyAqIGNyeXB0b19iaWdudW1fZGVpbml0IC0gRnJlZSBiaWdudW0KKyAqIEBuOiBCaWdudW0gZnJvbSBjcnlwdG9fYmlnbnVtX2luaXQoKSBvciBjcnlwdG9fYmlnbnVtX2luaXRfc2V0KCkKKyAqIEBjbGVhcjogV2hldGhlciB0byBjbGVhciB0aGUgdmFsdWUgZnJvbSBtZW1vcnkKKyAqLwordm9pZCBjcnlwdG9fYmlnbnVtX2RlaW5pdChzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqbiwgaW50IGNsZWFyKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX3RvX2JpbiAtIFNldCBiaW5hcnkgYnVmZmVyIHRvIHVuc2lnbmVkIGJpZ251bQorICogQGE6IEJpZ251bQorICogQGJ1ZjogQnVmZmVyIGZvciB0aGUgYmluYXJ5IG51bWJlcgorICogQGxlbjogTGVuZ3RoIG9mIEBidWYgaW4gb2N0ZXRzCisgKiBAcGFkbGVuOiBMZW5ndGggaW4gb2N0ZXRzIHRvIHBhZCB0aGUgcmVzdWx0IHRvIG9yIDAgdG8gaW5kaWNhdGUgbm8gcGFkZGluZworICogUmV0dXJuczogTnVtYmVyIG9mIG9jdGV0cyB3cml0dGVuIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19iaWdudW1fdG9fYmluKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkJIHU4ICpidWYsIHNpemVfdCBidWZsZW4sIHNpemVfdCBwYWRsZW4pOworCisvKioKKyAqIGNyeXB0b19iaWdudW1fYWRkIC0gYyA9IGEgKyBiCisgKiBAYTogQmlnbnVtCisgKiBAYjogQmlnbnVtCisgKiBAYzogQmlnbnVtOyB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgYSArIGIKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitpbnQgY3J5cHRvX2JpZ251bV9hZGQoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpiLAorCQkgICAgICBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYyk7CisKKy8qKgorICogY3J5cHRvX2JpZ251bV9tb2QgLSBjID0gYSAlIGIKKyAqIEBhOiBCaWdudW0KKyAqIEBiOiBCaWdudW0KKyAqIEBjOiBCaWdudW07IHVzZWQgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiBhICUgYgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBjcnlwdG9fYmlnbnVtX21vZChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCSAgICAgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX2V4cHRtb2QgLSBNb2R1bGFyIGV4cG9uZW50aWF0aW9uOiBkID0gYV5iIChtb2QgYykKKyAqIEBhOiBCaWdudW07IGJhc2UKKyAqIEBiOiBCaWdudW07IGV4cG9uZW50CisgKiBAYzogQmlnbnVtOyBtb2R1bHVzCisgKiBAZDogQmlnbnVtOyB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgYV5iIChtb2QgYykKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitpbnQgY3J5cHRvX2JpZ251bV9leHB0bW9kKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkJICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJCSAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmMsCisJCQkgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpkKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX3JzaGlmdCAtIGIgPSBhID4+IG4KKyAqIEBhOiBCaWdudW0KKyAqIEBuOiBOdW1iZXIgb2YgYml0cyB0byBzaGlmdAorICogQGI6IEJpZ251bTsgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIGEgPj4gbgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBjcnlwdG9fYmlnbnVtX3JzaGlmdChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwgaW50IG4sCisJCQkgc3RydWN0IGNyeXB0b19iaWdudW0gKmIpOworCisvKioKKyAqIGNyeXB0b19iaWdudW1faW52ZXJzZSAtIEludmVyc2UgYSBiaWdudW0gc28gdGhhdCBhICogYyA9IDEgKG1vZCBiKQorICogQGE6IEJpZ251bQorICogQGI6IEJpZ251bQorICogQGM6IEJpZ251bTsgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0CisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19iaWdudW1faW52ZXJzZShjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJCSAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCQkgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX3N1YiAtIGMgPSBhIC0gYgorICogQGE6IEJpZ251bQorICogQGI6IEJpZ251bQorICogQGM6IEJpZ251bTsgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIGEgLSBiCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19iaWdudW1fc3ViKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJICAgICAgc3RydWN0IGNyeXB0b19iaWdudW0gKmMpOworCisvKioKKyAqIGNyeXB0b19iaWdudW1fZGl2IC0gYyA9IGEgLyBiCisgKiBAYTogQmlnbnVtCisgKiBAYjogQmlnbnVtCisgKiBAYzogQmlnbnVtOyB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgYSAvIGIKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitpbnQgY3J5cHRvX2JpZ251bV9kaXYoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpiLAorCQkgICAgICBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYyk7CisKKy8qKgorICogY3J5cHRvX2JpZ251bV9tdWxtb2QgLSBkID0gYSAqIGIgKG1vZCBjKQorICogQGE6IEJpZ251bQorICogQGI6IEJpZ251bQorICogQGM6IEJpZ251bQorICogQGQ6IEJpZ251bTsgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIChhICogYikgJSBjCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19iaWdudW1fbXVsbW9kKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkJIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpiLAorCQkJIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjLAorCQkJIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpkKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX2NtcCAtIENvbXBhcmUgdHdvIGJpZ251bXMKKyAqIEBhOiBCaWdudW0KKyAqIEBiOiBCaWdudW0KKyAqIFJldHVybnM6IC0xIGlmIGEgPCBiLCAwIGlmIGEgPT0gYiwgb3IgMSBpZiBhID4gYgorICovCitpbnQgY3J5cHRvX2JpZ251bV9jbXAoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpiKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX2JpdHMgLSBHZXQgc2l6ZSBvZiBhIGJpZ251bSBpbiBiaXRzCisgKiBAYTogQmlnbnVtCisgKiBSZXR1cm5zOiBOdW1iZXIgb2YgYml0cyBpbiB0aGUgYmlnbnVtCisgKi8KK2ludCBjcnlwdG9fYmlnbnVtX2JpdHMoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEpOworCisvKioKKyAqIGNyeXB0b19iaWdudW1faXNfemVybyAtIElzIHRoZSBnaXZlbiBiaWdudW0gemVybworICogQGE6IEJpZ251bQorICogUmV0dXJuczogMSBpZiBAYSBpcyB6ZXJvIG9yIDAgaWYgbm90CisgKi8KK2ludCBjcnlwdG9fYmlnbnVtX2lzX3plcm8oY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEpOworCisvKioKKyAqIGNyeXB0b19iaWdudW1faXNfb25lIC0gSXMgdGhlIGdpdmVuIGJpZ251bSBvbmUKKyAqIEBhOiBCaWdudW0KKyAqIFJldHVybnM6IDEgaWYgQGEgaXMgb25lIG9yIDAgaWYgbm90CisgKi8KK2ludCBjcnlwdG9fYmlnbnVtX2lzX29uZShjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSk7CisKKy8qKgorICogc3RydWN0IGNyeXB0b19lYyAtIEVsbGlwdGljIGN1cnZlIGNvbnRleHQKKyAqCisgKiBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBmb3IgRUMgaW1wbGVtZW50YXRpb24uIFRoZSBjb250ZW50cyBpcyBzcGVjaWZpYworICogdG8gdGhlIHVzZWQgY3J5cHRvIGxpYnJhcnkuCisgKi8KK3N0cnVjdCBjcnlwdG9fZWM7CisKKy8qKgorICogY3J5cHRvX2VjX2luaXQgLSBJbml0aWFsaXplIGVsbGlwdGljIGN1cnZlIGNvbnRleHQKKyAqIEBncm91cDogSWRlbnRpZnlpbmcgbnVtYmVyIGZvciB0aGUgRUNDIGdyb3VwIChJQU5BICJHcm91cCBEZXNjcmlwdGlvbiIKKyAqCWF0dHJpYnV0ZSByZWdpc3RydHkgZm9yIFJGQyAyNDA5KQorICogUmV0dXJuczogUG9pbnRlciB0byBFQyBjb250ZXh0IG9yICVOVUxMIG9uIGZhaWx1cmUKKyAqLworc3RydWN0IGNyeXB0b19lYyAqIGNyeXB0b19lY19pbml0KGludCBncm91cCk7CisKKy8qKgorICogY3J5cHRvX2VjX2RlaW5pdCAtIERlaW5pdGlhbGl6ZSBlbGxpcHRpYyBjdXJ2ZSBjb250ZXh0CisgKiBAZTogRUMgY29udGV4dCBmcm9tIGNyeXB0b19lY19pbml0KCkKKyAqLwordm9pZCBjcnlwdG9fZWNfZGVpbml0KHN0cnVjdCBjcnlwdG9fZWMgKmUpOworCisvKioKKyAqIGNyeXB0b19lY19wcmltZV9sZW4gLSBHZXQgbGVuZ3RoIG9mIHRoZSBwcmltZSBpbiBvY3RldHMKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogUmV0dXJuczogTGVuZ3RoIG9mIHRoZSBwcmltZSBkZWZpbmluZyB0aGUgZ3JvdXAKKyAqLworc2l6ZV90IGNyeXB0b19lY19wcmltZV9sZW4oc3RydWN0IGNyeXB0b19lYyAqZSk7CisKKy8qKgorICogY3J5cHRvX2VjX3ByaW1lX2xlbl9iaXRzIC0gR2V0IGxlbmd0aCBvZiB0aGUgcHJpbWUgaW4gYml0cworICogQGU6IEVDIGNvbnRleHQgZnJvbSBjcnlwdG9fZWNfaW5pdCgpCisgKiBSZXR1cm5zOiBMZW5ndGggb2YgdGhlIHByaW1lIGRlZmluaW5nIHRoZSBncm91cCBpbiBiaXRzCisgKi8KK3NpemVfdCBjcnlwdG9fZWNfcHJpbWVfbGVuX2JpdHMoc3RydWN0IGNyeXB0b19lYyAqZSk7CisKKy8qKgorICogY3J5cHRvX2VjX2dldF9wcmltZSAtIEdldCBwcmltZSBkZWZpbmluZyBhbiBFQyBncm91cAorICogQGU6IEVDIGNvbnRleHQgZnJvbSBjcnlwdG9fZWNfaW5pdCgpCisgKiBSZXR1cm5zOiBQcmltZSAoYmlnbnVtKSBkZWZpbmluZyB0aGUgZ3JvdXAKKyAqLworY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKiBjcnlwdG9fZWNfZ2V0X3ByaW1lKHN0cnVjdCBjcnlwdG9fZWMgKmUpOworCisvKioKKyAqIGNyeXB0b19lY19nZXRfb3JkZXIgLSBHZXQgb3JkZXIgb2YgYW4gRUMgZ3JvdXAKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogUmV0dXJuczogT3JkZXIgKGJpZ251bSkgb2YgdGhlIGdyb3VwCisgKi8KK2NvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICogY3J5cHRvX2VjX2dldF9vcmRlcihzdHJ1Y3QgY3J5cHRvX2VjICplKTsKKworLyoqCisgKiBzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50IC0gRWxsaXB0aWMgY3VydmUgcG9pbnQKKyAqCisgKiBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBmb3IgRUMgaW1wbGVtZW50YXRpb24gdG8gcmVwcmVzZW50IGEgcG9pbnQuIFRoZQorICogY29udGVudHMgaXMgc3BlY2lmaWMgdG8gdGhlIHVzZWQgY3J5cHRvIGxpYnJhcnkuCisgKi8KK3N0cnVjdCBjcnlwdG9fZWNfcG9pbnQ7CisKKy8qKgorICogY3J5cHRvX2VjX3BvaW50X2luaXQgLSBJbml0aWFsaXplIGRhdGEgZm9yIGFuIEVDIHBvaW50CisgKiBAZTogRUMgY29udGV4dCBmcm9tIGNyeXB0b19lY19pbml0KCkKKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gRUMgcG9pbnQgZGF0YSBvciAlTlVMTCBvbiBmYWlsdXJlCisgKi8KK3N0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKiBjcnlwdG9fZWNfcG9pbnRfaW5pdChzdHJ1Y3QgY3J5cHRvX2VjICplKTsKKworLyoqCisgKiBjcnlwdG9fZWNfcG9pbnRfZGVpbml0IC0gRGVpbml0aWFsaXplIEVDIHBvaW50IGRhdGEKKyAqIEBwOiBFQyBwb2ludCBkYXRhIGZyb20gY3J5cHRvX2VjX3BvaW50X2luaXQoKQorICogQGNsZWFyOiBXaGV0aGVyIHRvIGNsZWFyIHRoZSBFQyBwb2ludCB2YWx1ZSBmcm9tIG1lbW9yeQorICovCit2b2lkIGNyeXB0b19lY19wb2ludF9kZWluaXQoc3RydWN0IGNyeXB0b19lY19wb2ludCAqcCwgaW50IGNsZWFyKTsKKworLyoqCisgKiBjcnlwdG9fZWNfcG9pbnRfdG9fYmluIC0gV3JpdGUgRUMgcG9pbnQgdmFsdWUgYXMgYmluYXJ5IGRhdGEKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogQHA6IEVDIHBvaW50IGRhdGEgZnJvbSBjcnlwdG9fZWNfcG9pbnRfaW5pdCgpCisgKiBAeDogQnVmZmVyIGZvciB3cml0aW5nIHRoZSBiaW5hcnkgZGF0YSBmb3IgeCBjb29yZGluYXRlIG9yICVOVUxMIGlmIG5vdCB1c2VkCisgKiBAeTogQnVmZmVyIGZvciB3cml0aW5nIHRoZSBiaW5hcnkgZGF0YSBmb3IgeSBjb29yZGluYXRlIG9yICVOVUxMIGlmIG5vdCB1c2VkCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGFuIEVDIHBvaW50IGFzIGJpbmFyeSBkYXRhIGluIGEgZm9ybWF0CisgKiB0aGF0IGhhcyB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIgZmllbGRzIHBhZGRlZCB0bworICogdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWUgZGVmaW5pbmcgdGhlIGdyb3VwLgorICovCitpbnQgY3J5cHRvX2VjX3BvaW50X3RvX2JpbihzdHJ1Y3QgY3J5cHRvX2VjICplLAorCQkJICAgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqcG9pbnQsIHU4ICp4LCB1OCAqeSk7CisKKy8qKgorICogY3J5cHRvX2VjX3BvaW50X2Zyb21fYmluIC0gQ3JlYXRlIEVDIHBvaW50IGZyb20gYmluYXJ5IGRhdGEKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogQHZhbDogQmluYXJ5IGRhdGEgdG8gcmVhZCB0aGUgRUMgcG9pbnQgZnJvbQorICogUmV0dXJuczogUG9pbnRlciB0byBFQyBwb2ludCBkYXRhIG9yICVOVUxMIG9uIGZhaWx1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRlcnMgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgRUMgcG9pbnQgZnJvbSB0aGUgcHJvdmlkZWQKKyAqIGJ1ZmZlciBhc3N1bWluZyB0aGUgdmFsdWVzIGFyZSBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIgd2l0aCBmaWVsZHMgcGFkZGVkIHRvCisgKiB0aGUgbGVuZ3RoIG9mIHRoZSBwcmltZSBkZWZpbmluZyB0aGUgZ3JvdXAuCisgKi8KK3N0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKiBjcnlwdG9fZWNfcG9pbnRfZnJvbV9iaW4oc3RydWN0IGNyeXB0b19lYyAqZSwKKwkJCQkJCSAgY29uc3QgdTggKnZhbCk7CisKKy8qKgorICogY3J5cHRvX2JpZ251bV9hZGQgLSBjID0gYSArIGIKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogQGE6IEJpZ251bQorICogQGI6IEJpZ251bQorICogQGM6IEJpZ251bTsgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIGEgKyBiCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19lY19wb2ludF9hZGQoc3RydWN0IGNyeXB0b19lYyAqZSwgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqYSwKKwkJCWNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKmIsCisJCQlzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpjKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX211bCAtIHJlcyA9IGIgKiBwCisgKiBAZTogRUMgY29udGV4dCBmcm9tIGNyeXB0b19lY19pbml0KCkKKyAqIEBwOiBFQyBwb2ludAorICogQGI6IEJpZ251bQorICogQHJlczogRUMgcG9pbnQ7IHVzZWQgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiBiICogcAorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBjcnlwdG9fZWNfcG9pbnRfbXVsKHN0cnVjdCBjcnlwdG9fZWMgKmUsIGNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnAsCisJCQljb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJCXN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnJlcyk7CisKKy8qKgorICogY3J5cHRvX2VjX3BvaW50X2ludmVydCAtIENvbXB1dGUgaW52ZXJzZSBvZiBhbiBFQyBwb2ludAorICogQGU6IEVDIGNvbnRleHQgZnJvbSBjcnlwdG9fZWNfaW5pdCgpCisgKiBAcDogRUMgcG9pbnQgdG8gaW52ZXJ0IChhbmQgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24pCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19lY19wb2ludF9pbnZlcnQoc3RydWN0IGNyeXB0b19lYyAqZSwgc3RydWN0IGNyeXB0b19lY19wb2ludCAqcCk7CisKKy8qKgorICogY3J5cHRvX2VjX3BvaW50X3NvbHZlX3lfY29vcmQgLSBTb2x2ZSB5IGNvb3JkaW5hdGUgZm9yIGFuIHggY29vcmRpbmF0ZQorICogQGU6IEVDIGNvbnRleHQgZnJvbSBjcnlwdG9fZWNfaW5pdCgpCisgKiBAcDogRUMgcG9pbnQgdG8gdXNlIGZvciB0aGUgcmV0dXJuaW5nIHRoZSByZXN1bHQKKyAqIEB4OiB4IGNvb3JkaW5hdGUKKyAqIEB5X2JpdDogeS1iaXQgKDAgb3IgMSkgZm9yIHNlbGVjdGluZyB0aGUgeSB2YWx1ZSB0byB1c2UKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitpbnQgY3J5cHRvX2VjX3BvaW50X3NvbHZlX3lfY29vcmQoc3RydWN0IGNyeXB0b19lYyAqZSwKKwkJCQkgIHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnAsCisJCQkJICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqeCwgaW50IHlfYml0KTsKKworLyoqCisgKiBjcnlwdG9fZWNfcG9pbnRfaXNfYXRfaW5maW5pdHkgLSBDaGVjayB3aGV0aGVyIEVDIHBvaW50IGlzIG5ldXRyYWwgZWxlbWVudAorICogQGU6IEVDIGNvbnRleHQgZnJvbSBjcnlwdG9fZWNfaW5pdCgpCisgKiBAcDogRUMgcG9pbnQKKyAqIFJldHVybnM6IDEgaWYgdGhlIHNwZWNpZmllZCBFQyBwb2ludCBpcyB0aGUgbmV1dHJhbCBlbGVtZW50IG9mIHRoZSBncm91cCBvcgorICoJMCBpZiBub3QKKyAqLworaW50IGNyeXB0b19lY19wb2ludF9pc19hdF9pbmZpbml0eShzdHJ1Y3QgY3J5cHRvX2VjICplLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnApOworCisvKioKKyAqIGNyeXB0b19lY19wb2ludF9pc19vbl9jdXJ2ZSAtIENoZWNrIHdoZXRoZXIgRUMgcG9pbnQgaXMgb24gY3VydmUKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogQHA6IEVDIHBvaW50CisgKiBSZXR1cm5zOiAxIGlmIHRoZSBzcGVjaWZpZWQgRUMgcG9pbnQgaXMgb24gdGhlIGN1cnZlIG9yIDAgaWYgbm90CisgKi8KK2ludCBjcnlwdG9fZWNfcG9pbnRfaXNfb25fY3VydmUoc3RydWN0IGNyeXB0b19lYyAqZSwKKwkJCQljb25zdCBzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpwKTsKKwogI2VuZGlmIC8qIENSWVBUT19IICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NyeXB0b19vcGVuc3NsLmMgYi9zcmMvY3J5cHRvL2NyeXB0b19vcGVuc3NsLmMKaW5kZXggNzExZTMxMi4uNTIxNWMwMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jcnlwdG9fb3BlbnNzbC5jCisrKyBiL3NyYy9jcnlwdG8vY3J5cHRvX29wZW5zc2wuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBXUEEgU3VwcGxpY2FudCAvIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBsaWJjcnlwdG8KLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogV3JhcHBlciBmdW5jdGlvbnMgZm9yIE9wZW5TU0wgbGliY3J5cHRvCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMTksNiArMTksOSBAQAogI2lmZGVmIENPTkZJR19PUEVOU1NMX0NNQUMKICNpbmNsdWRlIDxvcGVuc3NsL2NtYWMuaD4KICNlbmRpZiAvKiBDT05GSUdfT1BFTlNTTF9DTUFDICovCisjaWZkZWYgQ09ORklHX0VDQworI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNlbmRpZiAvKiBDT05GSUdfRUNDICovCiAKICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJ3cGFidWYuaCIKQEAgLTgxOCwzICs4MjEsNDEzIEBACiAJcmV0dXJuIG9tYWMxX2Flc18xMjhfdmVjdG9yKGtleSwgMSwgJmRhdGEsICZkYXRhX2xlbiwgbWFjKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfT1BFTlNTTF9DTUFDICovCisKKworc3RydWN0IGNyeXB0b19iaWdudW0gKiBjcnlwdG9fYmlnbnVtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBjcnlwdG9fYmlnbnVtICopIEJOX25ldygpOworfQorCisKK3N0cnVjdCBjcnlwdG9fYmlnbnVtICogY3J5cHRvX2JpZ251bV9pbml0X3NldChjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKQoreworCUJJR05VTSAqYm4gPSBCTl9iaW4yYm4oYnVmLCBsZW4sIE5VTEwpOworCXJldHVybiAoc3RydWN0IGNyeXB0b19iaWdudW0gKikgYm47Cit9CisKKwordm9pZCBjcnlwdG9fYmlnbnVtX2RlaW5pdChzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqbiwgaW50IGNsZWFyKQoreworCWlmIChjbGVhcikKKwkJQk5fY2xlYXJfZnJlZSgoQklHTlVNICopIG4pOworCWVsc2UKKwkJQk5fZnJlZSgoQklHTlVNICopIG4pOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX3RvX2Jpbihjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJCSB1OCAqYnVmLCBzaXplX3QgYnVmbGVuLCBzaXplX3QgcGFkbGVuKQoreworCWludCBudW1fYnl0ZXMsIG9mZnNldDsKKworCWlmIChwYWRsZW4gPiBidWZsZW4pCisJCXJldHVybiAtMTsKKworCW51bV9ieXRlcyA9IEJOX251bV9ieXRlcygoY29uc3QgQklHTlVNICopIGEpOworCWlmICgoc2l6ZV90KSBudW1fYnl0ZXMgPiBidWZsZW4pCisJCXJldHVybiAtMTsKKwlpZiAocGFkbGVuID4gKHNpemVfdCkgbnVtX2J5dGVzKQorCQlvZmZzZXQgPSBwYWRsZW4gLSBudW1fYnl0ZXM7CisJZWxzZQorCQlvZmZzZXQgPSAwOworCisJb3NfbWVtc2V0KGJ1ZiwgMCwgb2Zmc2V0KTsKKwlCTl9ibjJiaW4oKGNvbnN0IEJJR05VTSAqKSBhLCBidWYgKyBvZmZzZXQpOworCisJcmV0dXJuIG51bV9ieXRlcyArIG9mZnNldDsKK30KKworCitpbnQgY3J5cHRvX2JpZ251bV9hZGQoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpiLAorCQkgICAgICBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYykKK3sKKwlyZXR1cm4gQk5fYWRkKChCSUdOVU0gKikgYywgKGNvbnN0IEJJR05VTSAqKSBhLCAoY29uc3QgQklHTlVNICopIGIpID8KKwkJMCA6IC0xOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX21vZChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCSAgICAgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjKQoreworCWludCByZXM7CisJQk5fQ1RYICpibmN0eDsKKworCWJuY3R4ID0gQk5fQ1RYX25ldygpOworCWlmIChibmN0eCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcmVzID0gQk5fbW9kKChCSUdOVU0gKikgYywgKGNvbnN0IEJJR05VTSAqKSBhLCAoY29uc3QgQklHTlVNICopIGIsCisJCSAgICAgYm5jdHgpOworCUJOX0NUWF9mcmVlKGJuY3R4KTsKKworCXJldHVybiByZXMgPyAwIDogLTE7Cit9CisKKworaW50IGNyeXB0b19iaWdudW1fZXhwdG1vZChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJCSAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCQkgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjLAorCQkJICBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqZCkKK3sKKwlpbnQgcmVzOworCUJOX0NUWCAqYm5jdHg7CisKKwlibmN0eCA9IEJOX0NUWF9uZXcoKTsKKwlpZiAoYm5jdHggPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXJlcyA9IEJOX21vZF9leHAoKEJJR05VTSAqKSBkLCAoY29uc3QgQklHTlVNICopIGEsIChjb25zdCBCSUdOVU0gKikgYiwKKwkJCSAoY29uc3QgQklHTlVNICopIGMsIGJuY3R4KTsKKwlCTl9DVFhfZnJlZShibmN0eCk7CisKKwlyZXR1cm4gcmVzID8gMCA6IC0xOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX3JzaGlmdChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwgaW50IG4sCisJCQkgc3RydWN0IGNyeXB0b19iaWdudW0gKmIpCit7CisJcmV0dXJuIEJOX3JzaGlmdCgoQklHTlVNICopIGIsIChjb25zdCBCSUdOVU0gKikgYSwgbikgPyAwIDogLTE7Cit9CisKKworaW50IGNyeXB0b19iaWdudW1faW52ZXJzZShjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJCSAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCQkgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjKQoreworCUJJR05VTSAqcmVzOworCUJOX0NUWCAqYm5jdHg7CisKKwlibmN0eCA9IEJOX0NUWF9uZXcoKTsKKwlpZiAoYm5jdHggPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXJlcyA9IEJOX21vZF9pbnZlcnNlKChCSUdOVU0gKikgYywgKGNvbnN0IEJJR05VTSAqKSBhLAorCQkJICAgICAoY29uc3QgQklHTlVNICopIGIsIGJuY3R4KTsKKwlCTl9DVFhfZnJlZShibmN0eCk7CisKKwlyZXR1cm4gcmVzID8gMCA6IC0xOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX3N1Yihjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCSAgICAgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjKQoreworCXJldHVybiBCTl9zdWIoKEJJR05VTSAqKSBjLCAoY29uc3QgQklHTlVNICopIGEsIChjb25zdCBCSUdOVU0gKikgYikgPworCQkwIDogLTE7Cit9CisKKworaW50IGNyeXB0b19iaWdudW1fZGl2KGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJICAgICAgc3RydWN0IGNyeXB0b19iaWdudW0gKmMpCit7CisJaW50IHJlczsKKworCUJOX0NUWCAqYm5jdHg7CisKKwlibmN0eCA9IEJOX0NUWF9uZXcoKTsKKwlpZiAoYm5jdHggPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXJlcyA9IEJOX2RpdigoQklHTlVNICopIGMsIE5VTEwsIChjb25zdCBCSUdOVU0gKikgYSwKKwkJICAgICAoY29uc3QgQklHTlVNICopIGIsIGJuY3R4KTsKKwlCTl9DVFhfZnJlZShibmN0eCk7CisKKwlyZXR1cm4gcmVzID8gMCA6IC0xOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX211bG1vZChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJCSBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJCSBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYywKKwkJCSBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqZCkKK3sKKwlpbnQgcmVzOworCisJQk5fQ1RYICpibmN0eDsKKworCWJuY3R4ID0gQk5fQ1RYX25ldygpOworCWlmIChibmN0eCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcmVzID0gQk5fbW9kX211bCgoQklHTlVNICopIGQsIChjb25zdCBCSUdOVU0gKikgYSwgKGNvbnN0IEJJR05VTSAqKSBiLAorCQkJIChjb25zdCBCSUdOVU0gKikgYywgYm5jdHgpOworCUJOX0NUWF9mcmVlKGJuY3R4KTsKKworCXJldHVybiByZXMgPyAwIDogLTE7Cit9CisKKworaW50IGNyeXB0b19iaWdudW1fY21wKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYikKK3sKKwlyZXR1cm4gQk5fY21wKChjb25zdCBCSUdOVU0gKikgYSwgKGNvbnN0IEJJR05VTSAqKSBiKTsKK30KKworCitpbnQgY3J5cHRvX2JpZ251bV9iaXRzKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphKQoreworCXJldHVybiBCTl9udW1fYml0cygoY29uc3QgQklHTlVNICopIGEpOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX2lzX3plcm8oY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEpCit7CisJcmV0dXJuIEJOX2lzX3plcm8oKGNvbnN0IEJJR05VTSAqKSBhKTsKK30KKworCitpbnQgY3J5cHRvX2JpZ251bV9pc19vbmUoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEpCit7CisJcmV0dXJuIEJOX2lzX29uZSgoY29uc3QgQklHTlVNICopIGEpOworfQorCisKKyNpZmRlZiBDT05GSUdfRUNDCisKK3N0cnVjdCBjcnlwdG9fZWMgeworCUVDX0dST1VQICpncm91cDsKKwlCTl9DVFggKmJuY3R4OworCUJJR05VTSAqcHJpbWU7CisJQklHTlVNICpvcmRlcjsKK307CisKK3N0cnVjdCBjcnlwdG9fZWMgKiBjcnlwdG9fZWNfaW5pdChpbnQgZ3JvdXApCit7CisJc3RydWN0IGNyeXB0b19lYyAqZTsKKwlpbnQgbmlkOworCisJLyogTWFwIGZyb20gSUFOQSByZWdpc3RyeSBmb3IgSUtFIEQtSCBncm91cHMgdG8gT3BlblNTTCBOSUQgKi8KKwlzd2l0Y2ggKGdyb3VwKSB7CisJY2FzZSAxOToKKwkJbmlkID0gTklEX1g5XzYyX3ByaW1lMjU2djE7CisJCWJyZWFrOworCWNhc2UgMjA6CisJCW5pZCA9IE5JRF9zZWNwMzg0cjE7CisJCWJyZWFrOworCWNhc2UgMjE6CisJCW5pZCA9IE5JRF9zZWNwNTIxcjE7CisJCWJyZWFrOworCWNhc2UgMjU6CisJCW5pZCA9IE5JRF9YOV82Ml9wcmltZTE5MnYxOworCQlicmVhazsKKwljYXNlIDI2OgorCQluaWQgPSBOSURfc2VjcDIyNHIxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwllID0gb3NfemFsbG9jKHNpemVvZigqZSkpOworCWlmIChlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZS0+Ym5jdHggPSBCTl9DVFhfbmV3KCk7CisJZS0+Z3JvdXAgPSBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShuaWQpOworCWUtPnByaW1lID0gQk5fbmV3KCk7CisJZS0+b3JkZXIgPSBCTl9uZXcoKTsKKwlpZiAoZS0+Z3JvdXAgPT0gTlVMTCB8fCBlLT5ibmN0eCA9PSBOVUxMIHx8IGUtPnByaW1lID09IE5VTEwgfHwKKwkgICAgZS0+b3JkZXIgPT0gTlVMTCB8fAorCSAgICAhRUNfR1JPVVBfZ2V0X2N1cnZlX0dGcChlLT5ncm91cCwgZS0+cHJpbWUsIE5VTEwsIE5VTEwsIGUtPmJuY3R4KSB8fAorCSAgICAhRUNfR1JPVVBfZ2V0X29yZGVyKGUtPmdyb3VwLCBlLT5vcmRlciwgZS0+Ym5jdHgpKSB7CisJCWNyeXB0b19lY19kZWluaXQoZSk7CisJCWUgPSBOVUxMOworCX0KKworCXJldHVybiBlOworfQorCisKK3ZvaWQgY3J5cHRvX2VjX2RlaW5pdChzdHJ1Y3QgY3J5cHRvX2VjICplKQoreworCWlmIChlID09IE5VTEwpCisJCXJldHVybjsKKwlCTl9mcmVlKGUtPm9yZGVyKTsKKwlFQ19HUk9VUF9mcmVlKGUtPmdyb3VwKTsKKwlCTl9DVFhfZnJlZShlLT5ibmN0eCk7CisJb3NfZnJlZShlKTsKK30KKworCitzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICogY3J5cHRvX2VjX3BvaW50X2luaXQoc3RydWN0IGNyeXB0b19lYyAqZSkKK3sKKwlpZiAoZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gKHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKikgRUNfUE9JTlRfbmV3KGUtPmdyb3VwKTsKK30KKworCitzaXplX3QgY3J5cHRvX2VjX3ByaW1lX2xlbihzdHJ1Y3QgY3J5cHRvX2VjICplKQoreworCXJldHVybiBCTl9udW1fYnl0ZXMoZS0+cHJpbWUpOworfQorCisKK3NpemVfdCBjcnlwdG9fZWNfcHJpbWVfbGVuX2JpdHMoc3RydWN0IGNyeXB0b19lYyAqZSkKK3sKKwlyZXR1cm4gQk5fbnVtX2JpdHMoZS0+cHJpbWUpOworfQorCisKK2NvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICogY3J5cHRvX2VjX2dldF9wcmltZShzdHJ1Y3QgY3J5cHRvX2VjICplKQoreworCXJldHVybiAoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKikgZS0+cHJpbWU7Cit9CisKKworY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKiBjcnlwdG9fZWNfZ2V0X29yZGVyKHN0cnVjdCBjcnlwdG9fZWMgKmUpCit7CisJcmV0dXJuIChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqKSBlLT5vcmRlcjsKK30KKworCit2b2lkIGNyeXB0b19lY19wb2ludF9kZWluaXQoc3RydWN0IGNyeXB0b19lY19wb2ludCAqcCwgaW50IGNsZWFyKQoreworCWlmIChjbGVhcikKKwkJRUNfUE9JTlRfY2xlYXJfZnJlZSgoRUNfUE9JTlQgKikgcCk7CisJZWxzZQorCQlFQ19QT0lOVF9mcmVlKChFQ19QT0lOVCAqKSBwKTsKK30KKworCitpbnQgY3J5cHRvX2VjX3BvaW50X3RvX2JpbihzdHJ1Y3QgY3J5cHRvX2VjICplLAorCQkJICAgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqcG9pbnQsIHU4ICp4LCB1OCAqeSkKK3sKKwlCSUdOVU0gKnhfYm4sICp5X2JuOworCWludCByZXQgPSAtMTsKKwlpbnQgbGVuID0gQk5fbnVtX2J5dGVzKGUtPnByaW1lKTsKKworCXhfYm4gPSBCTl9uZXcoKTsKKwl5X2JuID0gQk5fbmV3KCk7CisKKwlpZiAoeF9ibiAmJiB5X2JuICYmCisJICAgIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGUtPmdyb3VwLCAoRUNfUE9JTlQgKikgcG9pbnQsCisJCQkJCQl4X2JuLCB5X2JuLCBlLT5ibmN0eCkpIHsKKwkJaWYgKHgpIHsKKwkJCWNyeXB0b19iaWdudW1fdG9fYmluKChzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqKSB4X2JuLAorCQkJCQkgICAgIHgsIGxlbiwgbGVuKTsKKwkJfQorCQlpZiAoeSkgeworCQkJY3J5cHRvX2JpZ251bV90b19iaW4oKHN0cnVjdCBjcnlwdG9fYmlnbnVtICopIHlfYm4sCisJCQkJCSAgICAgeSwgbGVuLCBsZW4pOworCQl9CisJCXJldCA9IDA7CisJfQorCisJQk5fZnJlZSh4X2JuKTsKKwlCTl9mcmVlKHlfYm4pOworCXJldHVybiByZXQ7Cit9CisKKworc3RydWN0IGNyeXB0b19lY19wb2ludCAqIGNyeXB0b19lY19wb2ludF9mcm9tX2JpbihzdHJ1Y3QgY3J5cHRvX2VjICplLAorCQkJCQkJICBjb25zdCB1OCAqdmFsKQoreworCUJJR05VTSAqeCwgKnk7CisJRUNfUE9JTlQgKmVsZW07CisJaW50IGxlbiA9IEJOX251bV9ieXRlcyhlLT5wcmltZSk7CisKKwl4ID0gQk5fYmluMmJuKHZhbCwgbGVuLCBOVUxMKTsKKwl5ID0gQk5fYmluMmJuKHZhbCArIGxlbiwgbGVuLCBOVUxMKTsKKwllbGVtID0gRUNfUE9JTlRfbmV3KGUtPmdyb3VwKTsKKwlpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCB8fCBlbGVtID09IE5VTEwpIHsKKwkJQk5fZnJlZSh4KTsKKwkJQk5fZnJlZSh5KTsKKwkJRUNfUE9JTlRfZnJlZShlbGVtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChlLT5ncm91cCwgZWxlbSwgeCwgeSwKKwkJCQkJCSBlLT5ibmN0eCkpIHsKKwkJRUNfUE9JTlRfZnJlZShlbGVtKTsKKwkJZWxlbSA9IE5VTEw7CisJfQorCisJQk5fZnJlZSh4KTsKKwlCTl9mcmVlKHkpOworCisJcmV0dXJuIChzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICopIGVsZW07Cit9CisKKworaW50IGNyeXB0b19lY19wb2ludF9hZGQoc3RydWN0IGNyeXB0b19lYyAqZSwgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqYSwKKwkJCWNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKmIsCisJCQlzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpjKQoreworCXJldHVybiBFQ19QT0lOVF9hZGQoZS0+Z3JvdXAsIChFQ19QT0lOVCAqKSBjLCAoY29uc3QgRUNfUE9JTlQgKikgYSwKKwkJCSAgICAoY29uc3QgRUNfUE9JTlQgKikgYiwgZS0+Ym5jdHgpID8gMCA6IC0xOworfQorCisKK2ludCBjcnlwdG9fZWNfcG9pbnRfbXVsKHN0cnVjdCBjcnlwdG9fZWMgKmUsIGNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnAsCisJCQljb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJCXN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnJlcykKK3sKKwlyZXR1cm4gRUNfUE9JTlRfbXVsKGUtPmdyb3VwLCAoRUNfUE9JTlQgKikgcmVzLCBOVUxMLAorCQkJICAgIChjb25zdCBFQ19QT0lOVCAqKSBwLCAoY29uc3QgQklHTlVNICopIGIsIGUtPmJuY3R4KQorCQk/IDAgOiAtMTsKK30KKworCitpbnQgY3J5cHRvX2VjX3BvaW50X2ludmVydChzdHJ1Y3QgY3J5cHRvX2VjICplLCBzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpwKQoreworCXJldHVybiBFQ19QT0lOVF9pbnZlcnQoZS0+Z3JvdXAsIChFQ19QT0lOVCAqKSBwLCBlLT5ibmN0eCkgPyAwIDogLTE7Cit9CisKKworaW50IGNyeXB0b19lY19wb2ludF9zb2x2ZV95X2Nvb3JkKHN0cnVjdCBjcnlwdG9fZWMgKmUsCisJCQkJICBzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpwLAorCQkJCSAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKngsIGludCB5X2JpdCkKK3sKKwlpZiAoIUVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcChlLT5ncm91cCwgKEVDX1BPSU5UICopIHAsCisJCQkJCQkgICAgIChjb25zdCBCSUdOVU0gKikgeCwgeV9iaXQsCisJCQkJCQkgICAgIGUtPmJuY3R4KSB8fAorCSAgICAhRUNfUE9JTlRfaXNfb25fY3VydmUoZS0+Z3JvdXAsIChFQ19QT0lOVCAqKSBwLCBlLT5ibmN0eCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgY3J5cHRvX2VjX3BvaW50X2lzX2F0X2luZmluaXR5KHN0cnVjdCBjcnlwdG9fZWMgKmUsCisJCQkJICAgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqcCkKK3sKKwlyZXR1cm4gRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZS0+Z3JvdXAsIChjb25zdCBFQ19QT0lOVCAqKSBwKTsKK30KKworCitpbnQgY3J5cHRvX2VjX3BvaW50X2lzX29uX2N1cnZlKHN0cnVjdCBjcnlwdG9fZWMgKmUsCisJCQkJY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqcCkKK3sKKwlyZXR1cm4gRUNfUE9JTlRfaXNfb25fY3VydmUoZS0+Z3JvdXAsIChjb25zdCBFQ19QT0lOVCAqKSBwLCBlLT5ibmN0eCk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRUNDICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2RoX2dyb3Vwcy5jIGIvc3JjL2NyeXB0by9kaF9ncm91cHMuYwppbmRleCBmNzU3YjZiLi4zYTY3NWRmIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2RoX2dyb3Vwcy5jCisrKyBiL3NyYy9jcnlwdG8vZGhfZ3JvdXBzLmMKQEAgLTM1LDYgKzM1LDIwIEBACiAJMHhGNCwgMHg0QywgMHg0MiwgMHhFOSwgMHhBNiwgMHgzQSwgMHgzNiwgMHgyMCwKIAkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCiB9Oworc3RhdGljIGNvbnN0IHU4IGRoX2dyb3VwMV9vcmRlcls5Nl0gPSB7CisJMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweEU0LCAweDg3LCAweEVELCAweDUxLCAweDEwLCAweEI0LCAweDYxLCAweDFBLAorCTB4NjIsIDB4NjMsIDB4MzEsIDB4NDUsIDB4QzAsIDB4NkUsIDB4MEUsIDB4NjgsCisJMHg5NCwgMHg4MSwgMHgyNywgMHgwNCwgMHg0NSwgMHgzMywgMHhFNiwgMHgzQSwKKwkweDAxLCAweDA1LCAweERGLCAweDUzLCAweDFELCAweDg5LCAweENELCAweDkxLAorCTB4MjgsIDB4QTUsIDB4MDQsIDB4M0MsIDB4QzcsIDB4MUEsIDB4MDIsIDB4NkUsCisJMHhGNywgMHhDQSwgMHg4QywgMHhEOSwgMHhFNiwgMHg5RCwgMHgyMSwgMHg4RCwKKwkweDk4LCAweDE1LCAweDg1LCAweDM2LCAweEY5LCAweDJGLCAweDhBLCAweDFCLAorCTB4QTcsIDB4RjAsIDB4OUEsIDB4QjYsIDB4QjYsIDB4QTgsIDB4RTEsIDB4MjIsCisJMHhGMiwgMHg0MiwgMHhEQSwgMHhCQiwgMHgzMSwgMHgyRiwgMHgzRiwgMHg2MywKKwkweDdBLCAweDI2LCAweDIxLCAweDc0LCAweEQzLCAweDFELCAweDFCLCAweDEwLAorCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKK307CiAKIC8qIFJGQyA0MzA2LCBCLjIuIEdyb3VwIDIgLSAxMDI0IEJpdCBNT0RQCiAgKiBHZW5lcmF0b3I6IDIKQEAgLTU5LDYgKzczLDI0IEBACiAJMHg0OSwgMHgyOCwgMHg2NiwgMHg1MSwgMHhFQywgMHhFNiwgMHg1MywgMHg4MSwKIAkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCiB9Oworc3RhdGljIGNvbnN0IHU4IGRoX2dyb3VwMl9vcmRlclsxMjhdID0geworCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhFNCwgMHg4NywgMHhFRCwgMHg1MSwgMHgxMCwgMHhCNCwgMHg2MSwgMHgxQSwKKwkweDYyLCAweDYzLCAweDMxLCAweDQ1LCAweEMwLCAweDZFLCAweDBFLCAweDY4LAorCTB4OTQsIDB4ODEsIDB4MjcsIDB4MDQsIDB4NDUsIDB4MzMsIDB4RTYsIDB4M0EsCisJMHgwMSwgMHgwNSwgMHhERiwgMHg1MywgMHgxRCwgMHg4OSwgMHhDRCwgMHg5MSwKKwkweDI4LCAweEE1LCAweDA0LCAweDNDLCAweEM3LCAweDFBLCAweDAyLCAweDZFLAorCTB4RjcsIDB4Q0EsIDB4OEMsIDB4RDksIDB4RTYsIDB4OUQsIDB4MjEsIDB4OEQsCisJMHg5OCwgMHgxNSwgMHg4NSwgMHgzNiwgMHhGOSwgMHgyRiwgMHg4QSwgMHgxQiwKKwkweEE3LCAweEYwLCAweDlBLCAweEI2LCAweEI2LCAweEE4LCAweEUxLCAweDIyLAorCTB4RjIsIDB4NDIsIDB4REEsIDB4QkIsIDB4MzEsIDB4MkYsIDB4M0YsIDB4NjMsCisJMHg3QSwgMHgyNiwgMHgyMSwgMHg3NCwgMHhEMywgMHgxQiwgMHhGNiwgMHhCNSwKKwkweDg1LCAweEZGLCAweEFFLCAweDVCLCAweDdBLCAweDAzLCAweDVCLCAweEY2LAorCTB4RjcsIDB4MUMsIDB4MzUsIDB4RkQsIDB4QUQsIDB4NDQsIDB4Q0YsIDB4RDIsCisJMHhENywgMHg0RiwgMHg5MiwgMHgwOCwgMHhCRSwgMHgyNSwgMHg4RiwgMHhGMywKKwkweDI0LCAweDk0LCAweDMzLCAweDI4LCAweEY2LCAweDczLCAweDI5LCAweEMwLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKK307CiAKICNlbmRpZiAvKiBBTExfREhfR1JPVVBTICovCiAKQEAgLTkzLDYgKzEyNSwzMiBAQAogCTB4RjEsIDB4NzQsIDB4NkMsIDB4MDgsIDB4Q0EsIDB4MjMsIDB4NzMsIDB4MjcsCiAJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgogfTsKK3N0YXRpYyBjb25zdCB1OCBkaF9ncm91cDVfb3JkZXJbMTkyXSA9IHsKKwkweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCTB4RTQsIDB4ODcsIDB4RUQsIDB4NTEsIDB4MTAsIDB4QjQsIDB4NjEsIDB4MUEsCisJMHg2MiwgMHg2MywgMHgzMSwgMHg0NSwgMHhDMCwgMHg2RSwgMHgwRSwgMHg2OCwKKwkweDk0LCAweDgxLCAweDI3LCAweDA0LCAweDQ1LCAweDMzLCAweEU2LCAweDNBLAorCTB4MDEsIDB4MDUsIDB4REYsIDB4NTMsIDB4MUQsIDB4ODksIDB4Q0QsIDB4OTEsCisJMHgyOCwgMHhBNSwgMHgwNCwgMHgzQywgMHhDNywgMHgxQSwgMHgwMiwgMHg2RSwKKwkweEY3LCAweENBLCAweDhDLCAweEQ5LCAweEU2LCAweDlELCAweDIxLCAweDhELAorCTB4OTgsIDB4MTUsIDB4ODUsIDB4MzYsIDB4RjksIDB4MkYsIDB4OEEsIDB4MUIsCisJMHhBNywgMHhGMCwgMHg5QSwgMHhCNiwgMHhCNiwgMHhBOCwgMHhFMSwgMHgyMiwKKwkweEYyLCAweDQyLCAweERBLCAweEJCLCAweDMxLCAweDJGLCAweDNGLCAweDYzLAorCTB4N0EsIDB4MjYsIDB4MjEsIDB4NzQsIDB4RDMsIDB4MUIsIDB4RjYsIDB4QjUsCisJMHg4NSwgMHhGRiwgMHhBRSwgMHg1QiwgMHg3QSwgMHgwMywgMHg1QiwgMHhGNiwKKwkweEY3LCAweDFDLCAweDM1LCAweEZELCAweEFELCAweDQ0LCAweENGLCAweEQyLAorCTB4RDcsIDB4NEYsIDB4OTIsIDB4MDgsIDB4QkUsIDB4MjUsIDB4OEYsIDB4RjMsCisJMHgyNCwgMHg5NCwgMHgzMywgMHgyOCwgMHhGNiwgMHg3MiwgMHgyRCwgMHg5RSwKKwkweEUxLCAweDAwLCAweDNFLCAweDVDLCAweDUwLCAweEIxLCAweERGLCAweDgyLAorCTB4Q0MsIDB4NkQsIDB4MjQsIDB4MUIsIDB4MEUsIDB4MkEsIDB4RTksIDB4Q0QsCisJMHgzNCwgMHg4QiwgMHgxRiwgMHhENCwgMHg3RSwgMHg5MiwgMHg2NywgMHhBRiwKKwkweEMxLCAweEIyLCAweEFFLCAweDkxLCAweEVFLCAweDUxLCAweEQ2LCAweENCLAorCTB4MEUsIDB4MzEsIDB4NzksIDB4QUIsIDB4MTAsIDB4NDIsIDB4QTksIDB4NUQsCisJMHhDRiwgMHg2QSwgMHg5NCwgMHg4MywgMHhCOCwgMHg0QiwgMHg0QiwgMHgzNiwKKwkweEIzLCAweDg2LCAweDFBLCAweEE3LCAweDI1LCAweDVFLCAweDRDLCAweDAyLAorCTB4NzgsIDB4QkEsIDB4MzYsIDB4MDQsIDB4NjUsIDB4MTEsIDB4QjksIDB4OTMsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgorfTsKIAogI2lmZGVmIEFMTF9ESF9HUk9VUFMKIApAQCAtMTM1LDYgKzE5Myw0MCBAQAogCTB4MTUsIDB4NzIsIDB4OEUsIDB4NUEsIDB4OEEsIDB4QUMsIDB4QUEsIDB4NjgsCiAJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgogfTsKK3N0YXRpYyBjb25zdCB1OCBkaF9ncm91cDE0X29yZGVyWzI1Nl0gPSB7CisJMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweEU0LCAweDg3LCAweEVELCAweDUxLCAweDEwLCAweEI0LCAweDYxLCAweDFBLAorCTB4NjIsIDB4NjMsIDB4MzEsIDB4NDUsIDB4QzAsIDB4NkUsIDB4MEUsIDB4NjgsCisJMHg5NCwgMHg4MSwgMHgyNywgMHgwNCwgMHg0NSwgMHgzMywgMHhFNiwgMHgzQSwKKwkweDAxLCAweDA1LCAweERGLCAweDUzLCAweDFELCAweDg5LCAweENELCAweDkxLAorCTB4MjgsIDB4QTUsIDB4MDQsIDB4M0MsIDB4QzcsIDB4MUEsIDB4MDIsIDB4NkUsCisJMHhGNywgMHhDQSwgMHg4QywgMHhEOSwgMHhFNiwgMHg5RCwgMHgyMSwgMHg4RCwKKwkweDk4LCAweDE1LCAweDg1LCAweDM2LCAweEY5LCAweDJGLCAweDhBLCAweDFCLAorCTB4QTcsIDB4RjAsIDB4OUEsIDB4QjYsIDB4QjYsIDB4QTgsIDB4RTEsIDB4MjIsCisJMHhGMiwgMHg0MiwgMHhEQSwgMHhCQiwgMHgzMSwgMHgyRiwgMHgzRiwgMHg2MywKKwkweDdBLCAweDI2LCAweDIxLCAweDc0LCAweEQzLCAweDFCLCAweEY2LCAweEI1LAorCTB4ODUsIDB4RkYsIDB4QUUsIDB4NUIsIDB4N0EsIDB4MDMsIDB4NUIsIDB4RjYsCisJMHhGNywgMHgxQywgMHgzNSwgMHhGRCwgMHhBRCwgMHg0NCwgMHhDRiwgMHhEMiwKKwkweEQ3LCAweDRGLCAweDkyLCAweDA4LCAweEJFLCAweDI1LCAweDhGLCAweEYzLAorCTB4MjQsIDB4OTQsIDB4MzMsIDB4MjgsIDB4RjYsIDB4NzIsIDB4MkQsIDB4OUUsCisJMHhFMSwgMHgwMCwgMHgzRSwgMHg1QywgMHg1MCwgMHhCMSwgMHhERiwgMHg4MiwKKwkweENDLCAweDZELCAweDI0LCAweDFCLCAweDBFLCAweDJBLCAweEU5LCAweENELAorCTB4MzQsIDB4OEIsIDB4MUYsIDB4RDQsIDB4N0UsIDB4OTIsIDB4NjcsIDB4QUYsCisJMHhDMSwgMHhCMiwgMHhBRSwgMHg5MSwgMHhFRSwgMHg1MSwgMHhENiwgMHhDQiwKKwkweDBFLCAweDMxLCAweDc5LCAweEFCLCAweDEwLCAweDQyLCAweEE5LCAweDVELAorCTB4Q0YsIDB4NkEsIDB4OTQsIDB4ODMsIDB4QjgsIDB4NEIsIDB4NEIsIDB4MzYsCisJMHhCMywgMHg4NiwgMHgxQSwgMHhBNywgMHgyNSwgMHg1RSwgMHg0QywgMHgwMiwKKwkweDc4LCAweEJBLCAweDM2LCAweDA0LCAweDY1LCAweDBDLCAweDEwLCAweEJFLAorCTB4MTksIDB4NDgsIDB4MkYsIDB4MjMsIDB4MTcsIDB4MUIsIDB4NjcsIDB4MUQsCisJMHhGMSwgMHhDRiwgMHgzQiwgMHg5NiwgMHgwQywgMHgwNywgMHg0MywgMHgwMSwKKwkweENELCAweDkzLCAweEMxLCAweEQxLCAweDc2LCAweDAzLCAweEQxLCAweDQ3LAorCTB4REEsIDB4RTIsIDB4QUUsIDB4RjgsIDB4MzcsIDB4QTYsIDB4MjksIDB4NjQsCisJMHhFRiwgMHgxNSwgMHhFNSwgMHhGQiwgMHg0QSwgMHhBQywgMHgwQiwgMHg4QywKKwkweDFDLCAweENBLCAweEE0LCAweEJFLCAweDc1LCAweDRBLCAweEI1LCAweDcyLAorCTB4OEEsIDB4RTksIDB4MTMsIDB4MEMsIDB4NEMsIDB4N0QsIDB4MDIsIDB4ODgsCisJMHgwQSwgMHhCOSwgMHg0NywgMHgyRCwgMHg0NSwgMHg1NiwgMHg1NSwgMHgzNCwKKwkweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCit9OwogCiAvKiBSRkMgMzUyNiwgNC4gR3JvdXAgMTUgLSAzMDcyIEJpdCBNT0RQCiAgKiBHZW5lcmF0b3I6IDIKQEAgLTE5MSw2ICsyODMsNTYgQEAKIAkweDRCLCAweDgyLCAweEQxLCAweDIwLCAweEE5LCAweDNBLCAweEQyLCAweENBLAogCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKIH07CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAxNV9vcmRlclszODRdID0geworCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhFNCwgMHg4NywgMHhFRCwgMHg1MSwgMHgxMCwgMHhCNCwgMHg2MSwgMHgxQSwKKwkweDYyLCAweDYzLCAweDMxLCAweDQ1LCAweEMwLCAweDZFLCAweDBFLCAweDY4LAorCTB4OTQsIDB4ODEsIDB4MjcsIDB4MDQsIDB4NDUsIDB4MzMsIDB4RTYsIDB4M0EsCisJMHgwMSwgMHgwNSwgMHhERiwgMHg1MywgMHgxRCwgMHg4OSwgMHhDRCwgMHg5MSwKKwkweDI4LCAweEE1LCAweDA0LCAweDNDLCAweEM3LCAweDFBLCAweDAyLCAweDZFLAorCTB4RjcsIDB4Q0EsIDB4OEMsIDB4RDksIDB4RTYsIDB4OUQsIDB4MjEsIDB4OEQsCisJMHg5OCwgMHgxNSwgMHg4NSwgMHgzNiwgMHhGOSwgMHgyRiwgMHg4QSwgMHgxQiwKKwkweEE3LCAweEYwLCAweDlBLCAweEI2LCAweEI2LCAweEE4LCAweEUxLCAweDIyLAorCTB4RjIsIDB4NDIsIDB4REEsIDB4QkIsIDB4MzEsIDB4MkYsIDB4M0YsIDB4NjMsCisJMHg3QSwgMHgyNiwgMHgyMSwgMHg3NCwgMHhEMywgMHgxQiwgMHhGNiwgMHhCNSwKKwkweDg1LCAweEZGLCAweEFFLCAweDVCLCAweDdBLCAweDAzLCAweDVCLCAweEY2LAorCTB4RjcsIDB4MUMsIDB4MzUsIDB4RkQsIDB4QUQsIDB4NDQsIDB4Q0YsIDB4RDIsCisJMHhENywgMHg0RiwgMHg5MiwgMHgwOCwgMHhCRSwgMHgyNSwgMHg4RiwgMHhGMywKKwkweDI0LCAweDk0LCAweDMzLCAweDI4LCAweEY2LCAweDcyLCAweDJELCAweDlFLAorCTB4RTEsIDB4MDAsIDB4M0UsIDB4NUMsIDB4NTAsIDB4QjEsIDB4REYsIDB4ODIsCisJMHhDQywgMHg2RCwgMHgyNCwgMHgxQiwgMHgwRSwgMHgyQSwgMHhFOSwgMHhDRCwKKwkweDM0LCAweDhCLCAweDFGLCAweEQ0LCAweDdFLCAweDkyLCAweDY3LCAweEFGLAorCTB4QzEsIDB4QjIsIDB4QUUsIDB4OTEsIDB4RUUsIDB4NTEsIDB4RDYsIDB4Q0IsCisJMHgwRSwgMHgzMSwgMHg3OSwgMHhBQiwgMHgxMCwgMHg0MiwgMHhBOSwgMHg1RCwKKwkweENGLCAweDZBLCAweDk0LCAweDgzLCAweEI4LCAweDRCLCAweDRCLCAweDM2LAorCTB4QjMsIDB4ODYsIDB4MUEsIDB4QTcsIDB4MjUsIDB4NUUsIDB4NEMsIDB4MDIsCisJMHg3OCwgMHhCQSwgMHgzNiwgMHgwNCwgMHg2NSwgMHgwQywgMHgxMCwgMHhCRSwKKwkweDE5LCAweDQ4LCAweDJGLCAweDIzLCAweDE3LCAweDFCLCAweDY3LCAweDFELAorCTB4RjEsIDB4Q0YsIDB4M0IsIDB4OTYsIDB4MEMsIDB4MDcsIDB4NDMsIDB4MDEsCisJMHhDRCwgMHg5MywgMHhDMSwgMHhEMSwgMHg3NiwgMHgwMywgMHhEMSwgMHg0NywKKwkweERBLCAweEUyLCAweEFFLCAweEY4LCAweDM3LCAweEE2LCAweDI5LCAweDY0LAorCTB4RUYsIDB4MTUsIDB4RTUsIDB4RkIsIDB4NEEsIDB4QUMsIDB4MEIsIDB4OEMsCisJMHgxQywgMHhDQSwgMHhBNCwgMHhCRSwgMHg3NSwgMHg0QSwgMHhCNSwgMHg3MiwKKwkweDhBLCAweEU5LCAweDEzLCAweDBDLCAweDRDLCAweDdELCAweDAyLCAweDg4LAorCTB4MEEsIDB4QjksIDB4NDcsIDB4MkQsIDB4NDUsIDB4NTUsIDB4NjIsIDB4MTYsCisJMHhENiwgMHg5OSwgMHg4QiwgMHg4NiwgMHg4MiwgMHgyOCwgMHgzRCwgMHgxOSwKKwkweEQ0LCAweDJBLCAweDkwLCAweEQ1LCAweEVGLCAweDhFLCAweDVELCAweDMyLAorCTB4NzYsIDB4N0QsIDB4QzIsIDB4ODIsIDB4MkMsIDB4NkQsIDB4RjcsIDB4ODUsCisJMHg0NSwgMHg3NSwgMHgzOCwgMHhBQiwgMHhBRSwgMHg4MywgMHgwNiwgMHgzRSwKKwkweEQ5LCAweENCLCAweDg3LCAweEMyLCAweEQzLCAweDcwLCAweEYyLCAweDYzLAorCTB4RDUsIDB4RkEsIDB4RDcsIDB4NDYsIDB4NkQsIDB4ODQsIDB4OTksIDB4RUIsCisJMHg4RiwgMHg0NiwgMHg0QSwgMHg3MCwgMHgyNSwgMHgxMiwgMHhCMCwgMHhDRSwKKwkweEU3LCAweDcxLCAweEU5LCAweDEzLCAweDBELCAweDY5LCAweDc3LCAweDM1LAorCTB4RjgsIDB4OTcsIDB4RkQsIDB4MDMsIDB4NkMsIDB4QzUsIDB4MDQsIDB4MzIsCisJMHg2QywgMHgzQiwgMHgwMSwgMHgzOSwgMHg5RiwgMHg2NCwgMHgzNSwgMHgzMiwKKwkweDI5LCAweDBGLCAweDk1LCAweDhDLCAweDBCLCAweEJELCAweDkwLCAweDA2LAorCTB4NUQsIDB4RjAsIDB4OEIsIDB4QUIsIDB4QkQsIDB4MzAsIDB4QUUsIDB4QjYsCisJMHgzQiwgMHg4NCwgMHhDNCwgMHg2MCwgMHg1RCwgMHg2QywgMHhBMywgMHg3MSwKKwkweDA0LCAweDcxLCAweDI3LCAweEQwLCAweDNBLCAweDcyLCAweEQ1LCAweDk4LAorCTB4QTEsIDB4RUQsIDB4QUQsIDB4RkUsIDB4NzAsIDB4N0UsIDB4ODgsIDB4NDcsCisJMHgyNSwgMHhDMSwgMHg2OCwgMHg5MCwgMHg1NCwgMHg5RCwgMHg2OSwgMHg2NSwKKwkweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCit9OwogCiAvKiBSRkMgMzUyNiwgNS4gR3JvdXAgMTYgLSA0MDk2IEJpdCBNT0RQCiAgKiBHZW5lcmF0b3I6IDIKQEAgLTI2Myw2ICs0MDUsNzIgQEAKIAkweDRELCAweEY0LCAweDM1LCAweEM5LCAweDM0LCAweDA2LCAweDMxLCAweDk5LAogCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKIH07CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAxNl9vcmRlcls1MTJdID0geworCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhFNCwgMHg4NywgMHhFRCwgMHg1MSwgMHgxMCwgMHhCNCwgMHg2MSwgMHgxQSwKKwkweDYyLCAweDYzLCAweDMxLCAweDQ1LCAweEMwLCAweDZFLCAweDBFLCAweDY4LAorCTB4OTQsIDB4ODEsIDB4MjcsIDB4MDQsIDB4NDUsIDB4MzMsIDB4RTYsIDB4M0EsCisJMHgwMSwgMHgwNSwgMHhERiwgMHg1MywgMHgxRCwgMHg4OSwgMHhDRCwgMHg5MSwKKwkweDI4LCAweEE1LCAweDA0LCAweDNDLCAweEM3LCAweDFBLCAweDAyLCAweDZFLAorCTB4RjcsIDB4Q0EsIDB4OEMsIDB4RDksIDB4RTYsIDB4OUQsIDB4MjEsIDB4OEQsCisJMHg5OCwgMHgxNSwgMHg4NSwgMHgzNiwgMHhGOSwgMHgyRiwgMHg4QSwgMHgxQiwKKwkweEE3LCAweEYwLCAweDlBLCAweEI2LCAweEI2LCAweEE4LCAweEUxLCAweDIyLAorCTB4RjIsIDB4NDIsIDB4REEsIDB4QkIsIDB4MzEsIDB4MkYsIDB4M0YsIDB4NjMsCisJMHg3QSwgMHgyNiwgMHgyMSwgMHg3NCwgMHhEMywgMHgxQiwgMHhGNiwgMHhCNSwKKwkweDg1LCAweEZGLCAweEFFLCAweDVCLCAweDdBLCAweDAzLCAweDVCLCAweEY2LAorCTB4RjcsIDB4MUMsIDB4MzUsIDB4RkQsIDB4QUQsIDB4NDQsIDB4Q0YsIDB4RDIsCisJMHhENywgMHg0RiwgMHg5MiwgMHgwOCwgMHhCRSwgMHgyNSwgMHg4RiwgMHhGMywKKwkweDI0LCAweDk0LCAweDMzLCAweDI4LCAweEY2LCAweDcyLCAweDJELCAweDlFLAorCTB4RTEsIDB4MDAsIDB4M0UsIDB4NUMsIDB4NTAsIDB4QjEsIDB4REYsIDB4ODIsCisJMHhDQywgMHg2RCwgMHgyNCwgMHgxQiwgMHgwRSwgMHgyQSwgMHhFOSwgMHhDRCwKKwkweDM0LCAweDhCLCAweDFGLCAweEQ0LCAweDdFLCAweDkyLCAweDY3LCAweEFGLAorCTB4QzEsIDB4QjIsIDB4QUUsIDB4OTEsIDB4RUUsIDB4NTEsIDB4RDYsIDB4Q0IsCisJMHgwRSwgMHgzMSwgMHg3OSwgMHhBQiwgMHgxMCwgMHg0MiwgMHhBOSwgMHg1RCwKKwkweENGLCAweDZBLCAweDk0LCAweDgzLCAweEI4LCAweDRCLCAweDRCLCAweDM2LAorCTB4QjMsIDB4ODYsIDB4MUEsIDB4QTcsIDB4MjUsIDB4NUUsIDB4NEMsIDB4MDIsCisJMHg3OCwgMHhCQSwgMHgzNiwgMHgwNCwgMHg2NSwgMHgwQywgMHgxMCwgMHhCRSwKKwkweDE5LCAweDQ4LCAweDJGLCAweDIzLCAweDE3LCAweDFCLCAweDY3LCAweDFELAorCTB4RjEsIDB4Q0YsIDB4M0IsIDB4OTYsIDB4MEMsIDB4MDcsIDB4NDMsIDB4MDEsCisJMHhDRCwgMHg5MywgMHhDMSwgMHhEMSwgMHg3NiwgMHgwMywgMHhEMSwgMHg0NywKKwkweERBLCAweEUyLCAweEFFLCAweEY4LCAweDM3LCAweEE2LCAweDI5LCAweDY0LAorCTB4RUYsIDB4MTUsIDB4RTUsIDB4RkIsIDB4NEEsIDB4QUMsIDB4MEIsIDB4OEMsCisJMHgxQywgMHhDQSwgMHhBNCwgMHhCRSwgMHg3NSwgMHg0QSwgMHhCNSwgMHg3MiwKKwkweDhBLCAweEU5LCAweDEzLCAweDBDLCAweDRDLCAweDdELCAweDAyLCAweDg4LAorCTB4MEEsIDB4QjksIDB4NDcsIDB4MkQsIDB4NDUsIDB4NTUsIDB4NjIsIDB4MTYsCisJMHhENiwgMHg5OSwgMHg4QiwgMHg4NiwgMHg4MiwgMHgyOCwgMHgzRCwgMHgxOSwKKwkweEQ0LCAweDJBLCAweDkwLCAweEQ1LCAweEVGLCAweDhFLCAweDVELCAweDMyLAorCTB4NzYsIDB4N0QsIDB4QzIsIDB4ODIsIDB4MkMsIDB4NkQsIDB4RjcsIDB4ODUsCisJMHg0NSwgMHg3NSwgMHgzOCwgMHhBQiwgMHhBRSwgMHg4MywgMHgwNiwgMHgzRSwKKwkweEQ5LCAweENCLCAweDg3LCAweEMyLCAweEQzLCAweDcwLCAweEYyLCAweDYzLAorCTB4RDUsIDB4RkEsIDB4RDcsIDB4NDYsIDB4NkQsIDB4ODQsIDB4OTksIDB4RUIsCisJMHg4RiwgMHg0NiwgMHg0QSwgMHg3MCwgMHgyNSwgMHgxMiwgMHhCMCwgMHhDRSwKKwkweEU3LCAweDcxLCAweEU5LCAweDEzLCAweDBELCAweDY5LCAweDc3LCAweDM1LAorCTB4RjgsIDB4OTcsIDB4RkQsIDB4MDMsIDB4NkMsIDB4QzUsIDB4MDQsIDB4MzIsCisJMHg2QywgMHgzQiwgMHgwMSwgMHgzOSwgMHg5RiwgMHg2NCwgMHgzNSwgMHgzMiwKKwkweDI5LCAweDBGLCAweDk1LCAweDhDLCAweDBCLCAweEJELCAweDkwLCAweDA2LAorCTB4NUQsIDB4RjAsIDB4OEIsIDB4QUIsIDB4QkQsIDB4MzAsIDB4QUUsIDB4QjYsCisJMHgzQiwgMHg4NCwgMHhDNCwgMHg2MCwgMHg1RCwgMHg2QywgMHhBMywgMHg3MSwKKwkweDA0LCAweDcxLCAweDI3LCAweEQwLCAweDNBLCAweDcyLCAweEQ1LCAweDk4LAorCTB4QTEsIDB4RUQsIDB4QUQsIDB4RkUsIDB4NzAsIDB4N0UsIDB4ODgsIDB4NDcsCisJMHgyNSwgMHhDMSwgMHg2OCwgMHg5MCwgMHg1NCwgMHg5MCwgMHg4NCwgMHgwMCwKKwkweDhELCAweDM5LCAweDFFLCAweDA5LCAweDUzLCAweEMzLCAweEYzLCAweDZCLAorCTB4QzQsIDB4MzgsIDB4Q0QsIDB4MDgsIDB4NUUsIDB4REQsIDB4MkQsIDB4OTMsCisJMHg0QywgMHhFMSwgMHg5MywgMHg4QywgMHgzNSwgMHg3QSwgMHg3MSwgMHgxRSwKKwkweDBELCAweDRBLCAweDM0LCAweDFBLCAweDVCLCAweDBBLCAweDg1LCAweEVELAorCTB4MTIsIDB4QzEsIDB4RjQsIDB4RTUsIDB4MTUsIDB4NkEsIDB4MjYsIDB4NzQsCisJMHg2RCwgMHhERCwgMHhFMSwgMHg2RCwgMHg4MiwgMHg2RiwgMHg0NywgMHg3QywKKwkweDk3LCAweDQ3LCAweDdFLCAweDBBLCAweDBGLCAweERGLCAweDY1LCAweDUzLAorCTB4MTQsIDB4M0UsIDB4MkMsIDB4QTMsIDB4QTcsIDB4MzUsIDB4RTAsIDB4MkUsCisJMHhDQywgMHhEOSwgMHg0QiwgMHgyNywgMHhEMCwgMHg0OCwgMHg2MSwgMHhEMSwKKwkweDExLCAweDlELCAweEQwLCAweEMzLCAweDI4LCAweEFELCAweEYzLCAweEY2LAorCTB4OEYsIDB4QjAsIDB4OTQsIDB4QjgsIDB4NjcsIDB4NzEsIDB4NkIsIDB4RDcsCisJMHhEQywgMHgwRCwgMHhFRSwgMHhCQiwgMHgxMCwgMHhCOCwgMHgyNCwgMHgwRSwKKwkweDY4LCAweDAzLCAweDQ4LCAweDkzLCAweEVBLCAweEQ4LCAweDJELCAweDU0LAorCTB4QzksIDB4REEsIDB4NzUsIDB4NEMsIDB4NDYsIDB4QzcsIDB4RUUsIDB4RTAsCisJMHhDMywgMHg3RiwgMHhEQiwgMHhFRSwgMHg0OCwgMHg1MywgMHg2MCwgMHg0NywKKwkweEE2LCAweEZBLCAweDFBLCAweEU0LCAweDlBLCAweDAzLCAweDE4LCAweENDLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKK307CiAKIC8qIFJGQyAzNTI2LCA2LiBHcm91cCAxNyAtIDYxNDQgQml0IE1PRFAKICAqIEdlbmVyYXRvcjogMgpAQCAtMzY3LDYgKzU3NSwxMDQgQEAKIAkweEU2LCAweDk0LCAweEY5LCAweDFFLCAweDZELCAweENDLCAweDQwLCAweDI0LAogCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKIH07CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAxN19vcmRlcls3NjhdID0geworCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhFNCwgMHg4NywgMHhFRCwgMHg1MSwgMHgxMCwgMHhCNCwgMHg2MSwgMHgxQSwKKwkweDYyLCAweDYzLCAweDMxLCAweDQ1LCAweEMwLCAweDZFLCAweDBFLCAweDY4LAorCTB4OTQsIDB4ODEsIDB4MjcsIDB4MDQsIDB4NDUsIDB4MzMsIDB4RTYsIDB4M0EsCisJMHgwMSwgMHgwNSwgMHhERiwgMHg1MywgMHgxRCwgMHg4OSwgMHhDRCwgMHg5MSwKKwkweDI4LCAweEE1LCAweDA0LCAweDNDLCAweEM3LCAweDFBLCAweDAyLCAweDZFLAorCTB4RjcsIDB4Q0EsIDB4OEMsIDB4RDksIDB4RTYsIDB4OUQsIDB4MjEsIDB4OEQsCisJMHg5OCwgMHgxNSwgMHg4NSwgMHgzNiwgMHhGOSwgMHgyRiwgMHg4QSwgMHgxQiwKKwkweEE3LCAweEYwLCAweDlBLCAweEI2LCAweEI2LCAweEE4LCAweEUxLCAweDIyLAorCTB4RjIsIDB4NDIsIDB4REEsIDB4QkIsIDB4MzEsIDB4MkYsIDB4M0YsIDB4NjMsCisJMHg3QSwgMHgyNiwgMHgyMSwgMHg3NCwgMHhEMywgMHgxQiwgMHhGNiwgMHhCNSwKKwkweDg1LCAweEZGLCAweEFFLCAweDVCLCAweDdBLCAweDAzLCAweDVCLCAweEY2LAorCTB4RjcsIDB4MUMsIDB4MzUsIDB4RkQsIDB4QUQsIDB4NDQsIDB4Q0YsIDB4RDIsCisJMHhENywgMHg0RiwgMHg5MiwgMHgwOCwgMHhCRSwgMHgyNSwgMHg4RiwgMHhGMywKKwkweDI0LCAweDk0LCAweDMzLCAweDI4LCAweEY2LCAweDcyLCAweDJELCAweDlFLAorCTB4RTEsIDB4MDAsIDB4M0UsIDB4NUMsIDB4NTAsIDB4QjEsIDB4REYsIDB4ODIsCisJMHhDQywgMHg2RCwgMHgyNCwgMHgxQiwgMHgwRSwgMHgyQSwgMHhFOSwgMHhDRCwKKwkweDM0LCAweDhCLCAweDFGLCAweEQ0LCAweDdFLCAweDkyLCAweDY3LCAweEFGLAorCTB4QzEsIDB4QjIsIDB4QUUsIDB4OTEsIDB4RUUsIDB4NTEsIDB4RDYsIDB4Q0IsCisJMHgwRSwgMHgzMSwgMHg3OSwgMHhBQiwgMHgxMCwgMHg0MiwgMHhBOSwgMHg1RCwKKwkweENGLCAweDZBLCAweDk0LCAweDgzLCAweEI4LCAweDRCLCAweDRCLCAweDM2LAorCTB4QjMsIDB4ODYsIDB4MUEsIDB4QTcsIDB4MjUsIDB4NUUsIDB4NEMsIDB4MDIsCisJMHg3OCwgMHhCQSwgMHgzNiwgMHgwNCwgMHg2NSwgMHgwQywgMHgxMCwgMHhCRSwKKwkweDE5LCAweDQ4LCAweDJGLCAweDIzLCAweDE3LCAweDFCLCAweDY3LCAweDFELAorCTB4RjEsIDB4Q0YsIDB4M0IsIDB4OTYsIDB4MEMsIDB4MDcsIDB4NDMsIDB4MDEsCisJMHhDRCwgMHg5MywgMHhDMSwgMHhEMSwgMHg3NiwgMHgwMywgMHhEMSwgMHg0NywKKwkweERBLCAweEUyLCAweEFFLCAweEY4LCAweDM3LCAweEE2LCAweDI5LCAweDY0LAorCTB4RUYsIDB4MTUsIDB4RTUsIDB4RkIsIDB4NEEsIDB4QUMsIDB4MEIsIDB4OEMsCisJMHgxQywgMHhDQSwgMHhBNCwgMHhCRSwgMHg3NSwgMHg0QSwgMHhCNSwgMHg3MiwKKwkweDhBLCAweEU5LCAweDEzLCAweDBDLCAweDRDLCAweDdELCAweDAyLCAweDg4LAorCTB4MEEsIDB4QjksIDB4NDcsIDB4MkQsIDB4NDUsIDB4NTUsIDB4NjIsIDB4MTYsCisJMHhENiwgMHg5OSwgMHg4QiwgMHg4NiwgMHg4MiwgMHgyOCwgMHgzRCwgMHgxOSwKKwkweEQ0LCAweDJBLCAweDkwLCAweEQ1LCAweEVGLCAweDhFLCAweDVELCAweDMyLAorCTB4NzYsIDB4N0QsIDB4QzIsIDB4ODIsIDB4MkMsIDB4NkQsIDB4RjcsIDB4ODUsCisJMHg0NSwgMHg3NSwgMHgzOCwgMHhBQiwgMHhBRSwgMHg4MywgMHgwNiwgMHgzRSwKKwkweEQ5LCAweENCLCAweDg3LCAweEMyLCAweEQzLCAweDcwLCAweEYyLCAweDYzLAorCTB4RDUsIDB4RkEsIDB4RDcsIDB4NDYsIDB4NkQsIDB4ODQsIDB4OTksIDB4RUIsCisJMHg4RiwgMHg0NiwgMHg0QSwgMHg3MCwgMHgyNSwgMHgxMiwgMHhCMCwgMHhDRSwKKwkweEU3LCAweDcxLCAweEU5LCAweDEzLCAweDBELCAweDY5LCAweDc3LCAweDM1LAorCTB4RjgsIDB4OTcsIDB4RkQsIDB4MDMsIDB4NkMsIDB4QzUsIDB4MDQsIDB4MzIsCisJMHg2QywgMHgzQiwgMHgwMSwgMHgzOSwgMHg5RiwgMHg2NCwgMHgzNSwgMHgzMiwKKwkweDI5LCAweDBGLCAweDk1LCAweDhDLCAweDBCLCAweEJELCAweDkwLCAweDA2LAorCTB4NUQsIDB4RjAsIDB4OEIsIDB4QUIsIDB4QkQsIDB4MzAsIDB4QUUsIDB4QjYsCisJMHgzQiwgMHg4NCwgMHhDNCwgMHg2MCwgMHg1RCwgMHg2QywgMHhBMywgMHg3MSwKKwkweDA0LCAweDcxLCAweDI3LCAweEQwLCAweDNBLCAweDcyLCAweEQ1LCAweDk4LAorCTB4QTEsIDB4RUQsIDB4QUQsIDB4RkUsIDB4NzAsIDB4N0UsIDB4ODgsIDB4NDcsCisJMHgyNSwgMHhDMSwgMHg2OCwgMHg5MCwgMHg1NCwgMHg5MCwgMHg4NCwgMHgwMCwKKwkweDhELCAweDM5LCAweDFFLCAweDA5LCAweDUzLCAweEMzLCAweEYzLCAweDZCLAorCTB4QzQsIDB4MzgsIDB4Q0QsIDB4MDgsIDB4NUUsIDB4REQsIDB4MkQsIDB4OTMsCisJMHg0QywgMHhFMSwgMHg5MywgMHg4QywgMHgzNSwgMHg3QSwgMHg3MSwgMHgxRSwKKwkweDBELCAweDRBLCAweDM0LCAweDFBLCAweDVCLCAweDBBLCAweDg1LCAweEVELAorCTB4MTIsIDB4QzEsIDB4RjQsIDB4RTUsIDB4MTUsIDB4NkEsIDB4MjYsIDB4NzQsCisJMHg2RCwgMHhERCwgMHhFMSwgMHg2RCwgMHg4MiwgMHg2RiwgMHg0NywgMHg3QywKKwkweDk3LCAweDQ3LCAweDdFLCAweDBBLCAweDBGLCAweERGLCAweDY1LCAweDUzLAorCTB4MTQsIDB4M0UsIDB4MkMsIDB4QTMsIDB4QTcsIDB4MzUsIDB4RTAsIDB4MkUsCisJMHhDQywgMHhEOSwgMHg0QiwgMHgyNywgMHhEMCwgMHg0OCwgMHg2MSwgMHhEMSwKKwkweDExLCAweDlELCAweEQwLCAweEMzLCAweDI4LCAweEFELCAweEYzLCAweEY2LAorCTB4OEYsIDB4QjAsIDB4OTQsIDB4QjgsIDB4NjcsIDB4NzEsIDB4NkIsIDB4RDcsCisJMHhEQywgMHgwRCwgMHhFRSwgMHhCQiwgMHgxMCwgMHhCOCwgMHgyNCwgMHgwRSwKKwkweDY4LCAweDAzLCAweDQ4LCAweDkzLCAweEVBLCAweEQ4LCAweDJELCAweDU0LAorCTB4QzksIDB4REEsIDB4NzUsIDB4NEMsIDB4NDYsIDB4QzcsIDB4RUUsIDB4RTAsCisJMHhDMywgMHg3RiwgMHhEQiwgMHhFRSwgMHg0OCwgMHg1MywgMHg2MCwgMHg0NywKKwkweEE2LCAweEZBLCAweDFBLCAweEU0LCAweDlBLCAweDAxLCAweDQyLCAweDQ5LAorCTB4MUIsIDB4NjEsIDB4RkQsIDB4NUEsIDB4NjksIDB4M0UsIDB4MzgsIDB4MTMsCisJMHg2MCwgMHhFQSwgMHg2RSwgMHg1OSwgMHgzMCwgMHgxMywgMHgyMywgMHg2RiwKKwkweDY0LCAweEJBLCAweDhGLCAweDNCLCAweDFFLCAweERELCAweDFCLCAweERFLAorCTB4RkMsIDB4N0YsIDB4Q0EsIDB4MDMsIDB4NTYsIDB4Q0YsIDB4MjksIDB4ODcsCisJMHg3MiwgMHhFRCwgMHg5QywgMHgxNywgMHhBMCwgMHg5OCwgMHgwMCwgMHhENywKKwkweDU4LCAweDM1LCAweDI5LCAweEY2LCAweEM4LCAweDEzLCAweEVDLCAweDE4LAorCTB4OEIsIDB4Q0IsIDB4OTMsIDB4RDgsIDB4NDMsIDB4MkQsIDB4NDQsIDB4OEMsCisJMHg2RCwgMHgxRiwgMHg2RCwgMHhGNSwgMHhFNywgMHhDRCwgMHg4QSwgMHg3NiwKKwkweEEyLCAweDY3LCAweDM2LCAweDVELCAweDY3LCAweDZBLCAweDVELCAweDhELAorCTB4RUQsIDB4QkYsIDB4OEEsIDB4MjMsIDB4RjMsIDB4NjYsIDB4MTIsIDB4QTUsCisJMHg5OSwgMHg5MCwgMHgyOCwgMHhBOCwgMHg5NSwgMHhFQiwgMHhENywgMHhBMSwKKwkweDM3LCAweERDLCAweDdBLCAweDAwLCAweDlCLCAweEM2LCAweDY5LCAweDVGLAorCTB4QUMsIDB4QzEsIDB4RTUsIDB4MDAsIDB4RTMsIDB4MjUsIDB4QzksIDB4NzYsCisJMHg3OCwgMHgxOSwgMHg3NSwgMHgwQSwgMHhFOCwgMHhCOSwgMHgwRSwgMHg4MSwKKwkweEZBLCAweDQxLCAweDZCLCAweEU3LCAweDM3LCAweDNBLCAweDdGLCAweDdCLAorCTB4NkEsIDB4QUYsIDB4MzgsIDB4MTcsIDB4QTMsIDB4NEMsIDB4MDYsIDB4NDEsCisJMHg1QSwgMHhENCwgMHgyMCwgMHgxOCwgMHhDOCwgMHgwNSwgMHg4RSwgMHg0RiwKKwkweDJDLCAweEYzLCAweEU0LCAweEJGLCAweERGLCAweDYzLCAweEY0LCAweDc5LAorCTB4OTEsIDB4RDQsIDB4QkQsIDB4M0YsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NUYsCisJMHgwNywgMHg4RSwgMHhBMiwgMHhEQiwgMHhGRiwgMHhBQywgMHgyRCwgMHg2MiwKKwkweEE1LCAweEVBLCAweDAzLCAweEQ5LCAweDE1LCAweEEwLCAweEFBLCAweDU1LAorCTB4NjYsIDB4NDcsIDB4QjYsIDB4QkYsIDB4NUYsIDB4QTQsIDB4NzAsIDB4RUMsCisJMHgwQSwgMHg2NiwgMHgyRiwgMHg2OSwgMHgwNywgMHhDMCwgMHgxQiwgMHhGMCwKKwkweDUzLCAweENCLCAweDhBLCAweEY3LCAweDc5LCAweDRELCAweEYxLCAweDk0LAorCTB4MDMsIDB4NTAsIDB4RUEsIDB4QzUsIDB4REIsIDB4RTIsIDB4RUQsIDB4M0IsCisJMHg3QSwgMHhBOCwgMHg1NSwgMHgxRSwgMHhDNSwgMHgwRiwgMHhERiwgMHhGOCwKKwkweDc1LCAweDhDLCAweEU2LCAweDU4LCAweEQxLCAweDg5LCAweEVBLCAweEFFLAorCTB4NkQsIDB4MkIsIDB4NjQsIDB4RjYsIDB4MTcsIDB4NzksIDB4NEIsIDB4MTksCisJMHgxQywgMHgzRiwgMHhGNCwgMHg2QiwgMHhCNywgMHgxRSwgMHgwMiwgMHgzNCwKKwkweDAyLCAweDFGLCAweDQ3LCAweEIzLCAweDFGLCAweEE0LCAweDMwLCAweDc3LAorCTB4MDksIDB4NUYsIDB4OTYsIDB4QUQsIDB4ODUsIDB4QkEsIDB4M0EsIDB4NkIsCisJMHg3MywgMHg0QSwgMHg3QywgMHg4RiwgMHgzNiwgMHhFNiwgMHgyMCwgMHgxMiwKKwkweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCit9OwogCiAvKiBSRkMgMzUyNiwgNy4gR3JvdXAgMTggLSA4MTkyIEJpdCBNT0RQCiAgKiBHZW5lcmF0b3I6IDIKQEAgLTUwMywyNSArODA5LDM2MyBAQAogCTB4NjAsIDB4QzksIDB4ODAsIDB4REQsIDB4OTgsIDB4RUQsIDB4RDMsIDB4REYsCiAJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgogfTsKK3N0YXRpYyBjb25zdCB1OCBkaF9ncm91cDE4X29yZGVyWzEwMjRdID0geworCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhFNCwgMHg4NywgMHhFRCwgMHg1MSwgMHgxMCwgMHhCNCwgMHg2MSwgMHgxQSwKKwkweDYyLCAweDYzLCAweDMxLCAweDQ1LCAweEMwLCAweDZFLCAweDBFLCAweDY4LAorCTB4OTQsIDB4ODEsIDB4MjcsIDB4MDQsIDB4NDUsIDB4MzMsIDB4RTYsIDB4M0EsCisJMHgwMSwgMHgwNSwgMHhERiwgMHg1MywgMHgxRCwgMHg4OSwgMHhDRCwgMHg5MSwKKwkweDI4LCAweEE1LCAweDA0LCAweDNDLCAweEM3LCAweDFBLCAweDAyLCAweDZFLAorCTB4RjcsIDB4Q0EsIDB4OEMsIDB4RDksIDB4RTYsIDB4OUQsIDB4MjEsIDB4OEQsCisJMHg5OCwgMHgxNSwgMHg4NSwgMHgzNiwgMHhGOSwgMHgyRiwgMHg4QSwgMHgxQiwKKwkweEE3LCAweEYwLCAweDlBLCAweEI2LCAweEI2LCAweEE4LCAweEUxLCAweDIyLAorCTB4RjIsIDB4NDIsIDB4REEsIDB4QkIsIDB4MzEsIDB4MkYsIDB4M0YsIDB4NjMsCisJMHg3QSwgMHgyNiwgMHgyMSwgMHg3NCwgMHhEMywgMHgxQiwgMHhGNiwgMHhCNSwKKwkweDg1LCAweEZGLCAweEFFLCAweDVCLCAweDdBLCAweDAzLCAweDVCLCAweEY2LAorCTB4RjcsIDB4MUMsIDB4MzUsIDB4RkQsIDB4QUQsIDB4NDQsIDB4Q0YsIDB4RDIsCisJMHhENywgMHg0RiwgMHg5MiwgMHgwOCwgMHhCRSwgMHgyNSwgMHg4RiwgMHhGMywKKwkweDI0LCAweDk0LCAweDMzLCAweDI4LCAweEY2LCAweDcyLCAweDJELCAweDlFLAorCTB4RTEsIDB4MDAsIDB4M0UsIDB4NUMsIDB4NTAsIDB4QjEsIDB4REYsIDB4ODIsCisJMHhDQywgMHg2RCwgMHgyNCwgMHgxQiwgMHgwRSwgMHgyQSwgMHhFOSwgMHhDRCwKKwkweDM0LCAweDhCLCAweDFGLCAweEQ0LCAweDdFLCAweDkyLCAweDY3LCAweEFGLAorCTB4QzEsIDB4QjIsIDB4QUUsIDB4OTEsIDB4RUUsIDB4NTEsIDB4RDYsIDB4Q0IsCisJMHgwRSwgMHgzMSwgMHg3OSwgMHhBQiwgMHgxMCwgMHg0MiwgMHhBOSwgMHg1RCwKKwkweENGLCAweDZBLCAweDk0LCAweDgzLCAweEI4LCAweDRCLCAweDRCLCAweDM2LAorCTB4QjMsIDB4ODYsIDB4MUEsIDB4QTcsIDB4MjUsIDB4NUUsIDB4NEMsIDB4MDIsCisJMHg3OCwgMHhCQSwgMHgzNiwgMHgwNCwgMHg2NSwgMHgwQywgMHgxMCwgMHhCRSwKKwkweDE5LCAweDQ4LCAweDJGLCAweDIzLCAweDE3LCAweDFCLCAweDY3LCAweDFELAorCTB4RjEsIDB4Q0YsIDB4M0IsIDB4OTYsIDB4MEMsIDB4MDcsIDB4NDMsIDB4MDEsCisJMHhDRCwgMHg5MywgMHhDMSwgMHhEMSwgMHg3NiwgMHgwMywgMHhEMSwgMHg0NywKKwkweERBLCAweEUyLCAweEFFLCAweEY4LCAweDM3LCAweEE2LCAweDI5LCAweDY0LAorCTB4RUYsIDB4MTUsIDB4RTUsIDB4RkIsIDB4NEEsIDB4QUMsIDB4MEIsIDB4OEMsCisJMHgxQywgMHhDQSwgMHhBNCwgMHhCRSwgMHg3NSwgMHg0QSwgMHhCNSwgMHg3MiwKKwkweDhBLCAweEU5LCAweDEzLCAweDBDLCAweDRDLCAweDdELCAweDAyLCAweDg4LAorCTB4MEEsIDB4QjksIDB4NDcsIDB4MkQsIDB4NDUsIDB4NTUsIDB4NjIsIDB4MTYsCisJMHhENiwgMHg5OSwgMHg4QiwgMHg4NiwgMHg4MiwgMHgyOCwgMHgzRCwgMHgxOSwKKwkweEQ0LCAweDJBLCAweDkwLCAweEQ1LCAweEVGLCAweDhFLCAweDVELCAweDMyLAorCTB4NzYsIDB4N0QsIDB4QzIsIDB4ODIsIDB4MkMsIDB4NkQsIDB4RjcsIDB4ODUsCisJMHg0NSwgMHg3NSwgMHgzOCwgMHhBQiwgMHhBRSwgMHg4MywgMHgwNiwgMHgzRSwKKwkweEQ5LCAweENCLCAweDg3LCAweEMyLCAweEQzLCAweDcwLCAweEYyLCAweDYzLAorCTB4RDUsIDB4RkEsIDB4RDcsIDB4NDYsIDB4NkQsIDB4ODQsIDB4OTksIDB4RUIsCisJMHg4RiwgMHg0NiwgMHg0QSwgMHg3MCwgMHgyNSwgMHgxMiwgMHhCMCwgMHhDRSwKKwkweEU3LCAweDcxLCAweEU5LCAweDEzLCAweDBELCAweDY5LCAweDc3LCAweDM1LAorCTB4RjgsIDB4OTcsIDB4RkQsIDB4MDMsIDB4NkMsIDB4QzUsIDB4MDQsIDB4MzIsCisJMHg2QywgMHgzQiwgMHgwMSwgMHgzOSwgMHg5RiwgMHg2NCwgMHgzNSwgMHgzMiwKKwkweDI5LCAweDBGLCAweDk1LCAweDhDLCAweDBCLCAweEJELCAweDkwLCAweDA2LAorCTB4NUQsIDB4RjAsIDB4OEIsIDB4QUIsIDB4QkQsIDB4MzAsIDB4QUUsIDB4QjYsCisJMHgzQiwgMHg4NCwgMHhDNCwgMHg2MCwgMHg1RCwgMHg2QywgMHhBMywgMHg3MSwKKwkweDA0LCAweDcxLCAweDI3LCAweEQwLCAweDNBLCAweDcyLCAweEQ1LCAweDk4LAorCTB4QTEsIDB4RUQsIDB4QUQsIDB4RkUsIDB4NzAsIDB4N0UsIDB4ODgsIDB4NDcsCisJMHgyNSwgMHhDMSwgMHg2OCwgMHg5MCwgMHg1NCwgMHg5MCwgMHg4NCwgMHgwMCwKKwkweDhELCAweDM5LCAweDFFLCAweDA5LCAweDUzLCAweEMzLCAweEYzLCAweDZCLAorCTB4QzQsIDB4MzgsIDB4Q0QsIDB4MDgsIDB4NUUsIDB4REQsIDB4MkQsIDB4OTMsCisJMHg0QywgMHhFMSwgMHg5MywgMHg4QywgMHgzNSwgMHg3QSwgMHg3MSwgMHgxRSwKKwkweDBELCAweDRBLCAweDM0LCAweDFBLCAweDVCLCAweDBBLCAweDg1LCAweEVELAorCTB4MTIsIDB4QzEsIDB4RjQsIDB4RTUsIDB4MTUsIDB4NkEsIDB4MjYsIDB4NzQsCisJMHg2RCwgMHhERCwgMHhFMSwgMHg2RCwgMHg4MiwgMHg2RiwgMHg0NywgMHg3QywKKwkweDk3LCAweDQ3LCAweDdFLCAweDBBLCAweDBGLCAweERGLCAweDY1LCAweDUzLAorCTB4MTQsIDB4M0UsIDB4MkMsIDB4QTMsIDB4QTcsIDB4MzUsIDB4RTAsIDB4MkUsCisJMHhDQywgMHhEOSwgMHg0QiwgMHgyNywgMHhEMCwgMHg0OCwgMHg2MSwgMHhEMSwKKwkweDExLCAweDlELCAweEQwLCAweEMzLCAweDI4LCAweEFELCAweEYzLCAweEY2LAorCTB4OEYsIDB4QjAsIDB4OTQsIDB4QjgsIDB4NjcsIDB4NzEsIDB4NkIsIDB4RDcsCisJMHhEQywgMHgwRCwgMHhFRSwgMHhCQiwgMHgxMCwgMHhCOCwgMHgyNCwgMHgwRSwKKwkweDY4LCAweDAzLCAweDQ4LCAweDkzLCAweEVBLCAweEQ4LCAweDJELCAweDU0LAorCTB4QzksIDB4REEsIDB4NzUsIDB4NEMsIDB4NDYsIDB4QzcsIDB4RUUsIDB4RTAsCisJMHhDMywgMHg3RiwgMHhEQiwgMHhFRSwgMHg0OCwgMHg1MywgMHg2MCwgMHg0NywKKwkweEE2LCAweEZBLCAweDFBLCAweEU0LCAweDlBLCAweDAxLCAweDQyLCAweDQ5LAorCTB4MUIsIDB4NjEsIDB4RkQsIDB4NUEsIDB4NjksIDB4M0UsIDB4MzgsIDB4MTMsCisJMHg2MCwgMHhFQSwgMHg2RSwgMHg1OSwgMHgzMCwgMHgxMywgMHgyMywgMHg2RiwKKwkweDY0LCAweEJBLCAweDhGLCAweDNCLCAweDFFLCAweERELCAweDFCLCAweERFLAorCTB4RkMsIDB4N0YsIDB4Q0EsIDB4MDMsIDB4NTYsIDB4Q0YsIDB4MjksIDB4ODcsCisJMHg3MiwgMHhFRCwgMHg5QywgMHgxNywgMHhBMCwgMHg5OCwgMHgwMCwgMHhENywKKwkweDU4LCAweDM1LCAweDI5LCAweEY2LCAweEM4LCAweDEzLCAweEVDLCAweDE4LAorCTB4OEIsIDB4Q0IsIDB4OTMsIDB4RDgsIDB4NDMsIDB4MkQsIDB4NDQsIDB4OEMsCisJMHg2RCwgMHgxRiwgMHg2RCwgMHhGNSwgMHhFNywgMHhDRCwgMHg4QSwgMHg3NiwKKwkweEEyLCAweDY3LCAweDM2LCAweDVELCAweDY3LCAweDZBLCAweDVELCAweDhELAorCTB4RUQsIDB4QkYsIDB4OEEsIDB4MjMsIDB4RjMsIDB4NjYsIDB4MTIsIDB4QTUsCisJMHg5OSwgMHg5MCwgMHgyOCwgMHhBOCwgMHg5NSwgMHhFQiwgMHhENywgMHhBMSwKKwkweDM3LCAweERDLCAweDdBLCAweDAwLCAweDlCLCAweEM2LCAweDY5LCAweDVGLAorCTB4QUMsIDB4QzEsIDB4RTUsIDB4MDAsIDB4RTMsIDB4MjUsIDB4QzksIDB4NzYsCisJMHg3OCwgMHgxOSwgMHg3NSwgMHgwQSwgMHhFOCwgMHhCOSwgMHgwRSwgMHg4MSwKKwkweEZBLCAweDQxLCAweDZCLCAweEU3LCAweDM3LCAweDNBLCAweDdGLCAweDdCLAorCTB4NkEsIDB4QUYsIDB4MzgsIDB4MTcsIDB4QTMsIDB4NEMsIDB4MDYsIDB4NDEsCisJMHg1QSwgMHhENCwgMHgyMCwgMHgxOCwgMHhDOCwgMHgwNSwgMHg4RSwgMHg0RiwKKwkweDJDLCAweEYzLCAweEU0LCAweEJGLCAweERGLCAweDYzLCAweEY0LCAweDc5LAorCTB4OTEsIDB4RDQsIDB4QkQsIDB4M0YsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NUYsCisJMHgwNywgMHg4RSwgMHhBMiwgMHhEQiwgMHhGRiwgMHhBQywgMHgyRCwgMHg2MiwKKwkweEE1LCAweEVBLCAweDAzLCAweEQ5LCAweDE1LCAweEEwLCAweEFBLCAweDU1LAorCTB4NjYsIDB4NDcsIDB4QjYsIDB4QkYsIDB4NUYsIDB4QTQsIDB4NzAsIDB4RUMsCisJMHgwQSwgMHg2NiwgMHgyRiwgMHg2OSwgMHgwNywgMHhDMCwgMHgxQiwgMHhGMCwKKwkweDUzLCAweENCLCAweDhBLCAweEY3LCAweDc5LCAweDRELCAweEYxLCAweDk0LAorCTB4MDMsIDB4NTAsIDB4RUEsIDB4QzUsIDB4REIsIDB4RTIsIDB4RUQsIDB4M0IsCisJMHg3QSwgMHhBOCwgMHg1NSwgMHgxRSwgMHhDNSwgMHgwRiwgMHhERiwgMHhGOCwKKwkweDc1LCAweDhDLCAweEU2LCAweDU4LCAweEQxLCAweDg5LCAweEVBLCAweEFFLAorCTB4NkQsIDB4MkIsIDB4NjQsIDB4RjYsIDB4MTcsIDB4NzksIDB4NEIsIDB4MTksCisJMHgxQywgMHgzRiwgMHhGNCwgMHg2QiwgMHhCNywgMHgxRSwgMHgwMiwgMHgzNCwKKwkweDAyLCAweDFGLCAweDQ3LCAweEIzLCAweDFGLCAweEE0LCAweDMwLCAweDc3LAorCTB4MDksIDB4NUYsIDB4OTYsIDB4QUQsIDB4ODUsIDB4QkEsIDB4M0EsIDB4NkIsCisJMHg3MywgMHg0QSwgMHg3QywgMHg4RiwgMHgzNiwgMHhERiwgMHgwOCwgMHhBQywKKwkweEJBLCAweDUxLCAweEM5LCAweDM3LCAweDg5LCAweDdGLCAweDcyLCAweEYyLAorCTB4MUMsIDB4M0IsIDB4QkUsIDB4NUIsIDB4NTQsIDB4OTksIDB4NkYsIDB4QzYsCisJMHg2QywgMHg1RiwgMHg2MiwgMHg2OCwgMHgzOSwgMHhEQywgMHg5OCwgMHhERCwKKwkweDFELCAweEU0LCAweDE5LCAweDVCLCAweDQ2LCAweENFLCAweEU5LCAweDgwLAorCTB4M0EsIDB4MEYsIDB4RDMsIDB4REYsIDB4QzUsIDB4N0UsIDB4MjMsIDB4RjYsCisJMHg5MiwgMHhCQiwgMHg3QiwgMHg0OSwgMHhCNSwgMHhEMiwgMHgxMiwgMHgzMywKKwkweDFELCAweDU1LCAweEIxLCAweENFLCAweDJELCAweDcyLCAweDdBLCAweEI0LAorCTB4MUEsIDB4MTEsIDB4REEsIDB4M0EsIDB4MTUsIDB4RjgsIDB4RTQsIDB4QkMsCisJMHgxMSwgMHhDNywgMHg4QiwgMHg2NSwgMHhGMSwgMHhDRSwgMHhCMiwgMHg5NiwKKwkweEYxLCAweEZFLCAweERDLCAweDVGLCAweDdFLCAweDQyLCAweDQ1LCAweDZDLAorCTB4OTEsIDB4MTEsIDB4MTcsIDB4MDIsIDB4NTIsIDB4MDEsIDB4QkUsIDB4MDMsCisJMHg4OSwgMHhGNSwgMHhBQiwgMHhENCwgMHgwRCwgMHgxMSwgMHhGOCwgMHg2MywKKwkweDlBLCAweDM5LCAweEZFLCAweDMyLCAweDM2LCAweDc1LCAweDE4LCAweDM1LAorCTB4QTUsIDB4RTUsIDB4RTQsIDB4NDMsIDB4MTcsIDB4QzEsIDB4QzIsIDB4RUUsCisJMHhGRCwgMHg0RSwgMHhBNSwgMHhCRiwgMHhEMSwgMHg2MCwgMHg0MywgMHhGNCwKKwkweDNDLCAweEI0LCAweDE5LCAweDgxLCAweEY2LCAweEFELCAweEVFLCAweDlELAorCTB4MDMsIDB4MTUsIDB4OUUsIDB4N0EsIDB4RDksIDB4RDEsIDB4M0MsIDB4NTMsCisJMHgzNiwgMHg5NSwgMHgwOSwgMHhGQywgMHgxRiwgMHhBMiwgMHg3QywgMHgxNiwKKwkweEVGLCAweDk4LCAweDg3LCAweDcwLCAweDNBLCAweDU1LCAweEI1LCAweDFCLAorCTB4MjIsIDB4Q0IsIDB4RjQsIDB4NEMsIDB4RDAsIDB4MTIsIDB4QUUsIDB4RTAsCisJMHhCMiwgMHg3OSwgMHg4RSwgMHg2MiwgMHg4NCwgMHgyMywgMHg0MiwgMHg4RSwKKwkweEZDLCAweEQ1LCAweEE0LCAweDBDLCAweEFFLCAweEY2LCAweEJGLCAweDUwLAorCTB4RDgsIDB4RUEsIDB4ODgsIDB4NUUsIDB4QkYsIDB4NzMsIDB4QTYsIDB4QjksCisJMHhGRCwgMHg3OSwgMHhCNSwgMHhFMSwgMHg4RiwgMHg2NywgMHhEMSwgMHgzNCwKKwkweDFBLCAweEM4LCAweDIzLCAweDdBLCAweDc1LCAweEMzLCAweENGLCAweEM5LAorCTB4MjAsIDB4MDQsIDB4QTEsIDB4QzUsIDB4QTQsIDB4MEUsIDB4MzYsIDB4NkIsCisJMHhDNCwgMHg0RCwgMHgwMCwgMHgxNywgMHg2QSwgMHhGNywgMHgxQywgMHgxNSwKKwkweEU0LCAweDhDLCAweDg2LCAweEQzLCAweDdFLCAweDAxLCAweDM3LCAweDIzLAorCTB4Q0EsIDB4QUMsIDB4NzIsIDB4MjMsIDB4QUIsIDB4M0IsIDB4RjQsIDB4RDUsCisJMHg0RiwgMHgxOCwgMHgyOCwgMHg3MSwgMHgzQiwgMHgyQiwgMHg0QSwgMHg2RiwKKwkweEU0LCAweDBGLCAweEFCLCAweDc0LCAweDQwLCAweDVDLCAweEI3LCAweDM4LAorCTB4QjAsIDB4NjQsIDB4QzAsIDB4NkUsIDB4Q0MsIDB4NzYsIDB4RTksIDB4RUYsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgorfTsKKworLyoKKyAqIFJGQyA1MTE0LCAyLjEuCisgKiBHcm91cCAyMiAtIDEwMjQtYml0IE1PRFAgR3JvdXAgd2l0aCAxNjAtYml0IFByaW1lIE9yZGVyIFN1Ymdyb3VwCisgKi8KK3N0YXRpYyBjb25zdCB1OCBkaF9ncm91cDIyX2dlbmVyYXRvcltdID0geworCTB4QTQsIDB4RDEsIDB4Q0IsIDB4RDUsIDB4QzMsIDB4RkQsIDB4MzQsIDB4MTIsCisJMHg2NywgMHg2NSwgMHhBNCwgMHg0MiwgMHhFRiwgMHhCOSwgMHg5OSwgMHgwNSwKKwkweEY4LCAweDEwLCAweDRELCAweEQyLCAweDU4LCAweEFDLCAweDUwLCAweDdGLAorCTB4RDYsIDB4NDAsIDB4NkMsIDB4RkYsIDB4MTQsIDB4MjYsIDB4NkQsIDB4MzEsCisJMHgyNiwgMHg2RiwgMHhFQSwgMHgxRSwgMHg1QywgMHg0MSwgMHg1NiwgMHg0QiwKKwkweDc3LCAweDdFLCAweDY5LCAweDBGLCAweDU1LCAweDA0LCAweEYyLCAweDEzLAorCTB4MTYsIDB4MDIsIDB4MTcsIDB4QjQsIDB4QjAsIDB4MUIsIDB4ODgsIDB4NkEsCisJMHg1RSwgMHg5MSwgMHg1NCwgMHg3RiwgMHg5RSwgMHgyNywgMHg0OSwgMHhGNCwKKwkweEQ3LCAweEZCLCAweEQ3LCAweEQzLCAweEI5LCAweEE5LCAweDJFLCAweEUxLAorCTB4OTAsIDB4OUQsIDB4MEQsIDB4MjIsIDB4NjMsIDB4RjgsIDB4MEEsIDB4NzYsCisJMHhBNiwgMHhBMiwgMHg0QywgMHgwOCwgMHg3QSwgMHgwOSwgMHgxRiwgMHg1MywKKwkweDFELCAweEJGLCAweDBBLCAweDAxLCAweDY5LCAweEI2LCAweEEyLCAweDhBLAorCTB4RDYsIDB4NjIsIDB4QTQsIDB4RDEsIDB4OEUsIDB4NzMsIDB4QUYsIDB4QTMsCisJMHgyRCwgMHg3NywgMHg5RCwgMHg1OSwgMHgxOCwgMHhEMCwgMHg4QiwgMHhDOCwKKwkweDg1LCAweDhGLCAweDRELCAweENFLCAweEY5LCAweDdDLCAweDJBLCAweDI0LAorCTB4ODUsIDB4NUUsIDB4NkUsIDB4RUIsIDB4MjIsIDB4QjMsIDB4QjIsIDB4RTUKK307CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAyMl9wcmltZVtdID0geworCTB4QjEsIDB4MEIsIDB4OEYsIDB4OTYsIDB4QTAsIDB4ODAsIDB4RTAsIDB4MUQsCisJMHhERSwgMHg5MiwgMHhERSwgMHg1RSwgMHhBRSwgMHg1RCwgMHg1NCwgMHhFQywKKwkweDUyLCAweEM5LCAweDlGLCAweEJDLCAweEZCLCAweDA2LCAweEEzLCAweEM2LAorCTB4OUEsIDB4NkEsIDB4OUQsIDB4Q0EsIDB4NTIsIDB4RDIsIDB4M0IsIDB4NjEsCisJMHg2MCwgMHg3MywgMHhFMiwgMHg4NiwgMHg3NSwgMHhBMiwgMHgzRCwgMHgxOCwKKwkweDk4LCAweDM4LCAweEVGLCAweDFFLCAweDJFLCAweEU2LCAweDUyLCAweEMwLAorCTB4MTMsIDB4RUMsIDB4QjQsIDB4QUUsIDB4QTksIDB4MDYsIDB4MTEsIDB4MjMsCisJMHgyNCwgMHg5NywgMHg1QywgMHgzQywgMHhENCwgMHg5QiwgMHg4MywgMHhCRiwKKwkweEFDLCAweENCLCAweERELCAweDdELCAweDkwLCAweEM0LCAweEJELCAweDcwLAorCTB4OTgsIDB4NDgsIDB4OEUsIDB4OUMsIDB4MjEsIDB4OUEsIDB4NzMsIDB4NzIsCisJMHg0RSwgMHhGRiwgMHhENiwgMHhGQSwgMHhFNSwgMHg2NCwgMHg0NywgMHgzOCwKKwkweEZBLCAweEEzLCAweDFBLCAweDRGLCAweEY1LCAweDVCLCAweENDLCAweEMwLAorCTB4QTEsIDB4NTEsIDB4QUYsIDB4NUYsIDB4MEQsIDB4QzgsIDB4QjQsIDB4QkQsCisJMHg0NSwgMHhCRiwgMHgzNywgMHhERiwgMHgzNiwgMHg1QywgMHgxQSwgMHg2NSwKKwkweEU2LCAweDhDLCAweEZELCAweEE3LCAweDZELCAweDRELCAweEE3LCAweDA4LAorCTB4REYsIDB4MUYsIDB4QjIsIDB4QkMsIDB4MkUsIDB4NEEsIDB4NDMsIDB4NzEKK307CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAyMl9vcmRlcltdID0geworCTB4RjUsIDB4MTgsIDB4QUEsIDB4ODcsIDB4ODEsIDB4QTgsIDB4REYsIDB4MjcsCisJMHg4QSwgMHhCQSwgMHg0RSwgMHg3RCwgMHg2NCwgMHhCNywgMHhDQiwgMHg5RCwKKwkweDQ5LCAweDQ2LCAweDIzLCAweDUzCit9OworCisvKgorICogUkZDIDUxMTQsIDIuMi4KKyAqIEdyb3VwIDIzIC0gMjA0OC1iaXQgTU9EUCBHcm91cCB3aXRoIDIyNC1iaXQgUHJpbWUgT3JkZXIgU3ViZ3JvdXAKKyAqLworc3RhdGljIGNvbnN0IHU4IGRoX2dyb3VwMjNfZ2VuZXJhdG9yW10gPSB7CisJMHhBQywgMHg0MCwgMHgzMiwgMHhFRiwgMHg0RiwgMHgyRCwgMHg5QSwgMHhFMywKKwkweDlELCAweEYzLCAweDBCLCAweDVDLCAweDhGLCAweEZELCAweEFDLCAweDUwLAorCTB4NkMsIDB4REUsIDB4QkUsIDB4N0IsIDB4ODksIDB4OTksIDB4OEMsIDB4QUYsCisJMHg3NCwgMHg4NiwgMHg2QSwgMHgwOCwgMHhDRiwgMHhFNCwgMHhGRiwgMHhFMywKKwkweEE2LCAweDgyLCAweDRBLCAweDRFLCAweDEwLCAweEI5LCAweEE2LCAweEYwLAorCTB4REQsIDB4OTIsIDB4MUYsIDB4MDEsIDB4QTcsIDB4MEMsIDB4NEEsIDB4RkEsCisJMHhBQiwgMHg3MywgMHg5RCwgMHg3NywgMHgwMCwgMHhDMiwgMHg5RiwgMHg1MiwKKwkweEM1LCAweDdELCAweEIxLCAweDdDLCAweDYyLCAweDBBLCAweDg2LCAweDUyLAorCTB4QkUsIDB4NUUsIDB4OTAsIDB4MDEsIDB4QTgsIDB4RDYsIDB4NkEsIDB4RDcsCisJMHhDMSwgMHg3NiwgMHg2OSwgMHgxMCwgMHgxOSwgMHg5OSwgMHgwMiwgMHg0QSwKKwkweEY0LCAweEQwLCAweDI3LCAweDI3LCAweDVBLCAweEMxLCAweDM0LCAweDhCLAorCTB4QjgsIDB4QTcsIDB4NjIsIDB4RDAsIDB4NTIsIDB4MUIsIDB4QzksIDB4OEEsCisJMHhFMiwgMHg0NywgMHgxNSwgMHgwNCwgMHgyMiwgMHhFQSwgMHgxRSwgMHhENCwKKwkweDA5LCAweDkzLCAweDlELCAweDU0LCAweERBLCAweDc0LCAweDYwLCAweENELAorCTB4QjUsIDB4RjYsIDB4QzYsIDB4QjIsIDB4NTAsIDB4NzEsIDB4N0MsIDB4QkUsCisJMHhGMSwgMHg4MCwgMHhFQiwgMHgzNCwgMHgxMSwgMHg4RSwgMHg5OCwgMHhEMSwKKwkweDE5LCAweDUyLCAweDlBLCAweDQ1LCAweEQ2LCAweEY4LCAweDM0LCAweDU2LAorCTB4NkUsIDB4MzAsIDB4MjUsIDB4RTMsIDB4MTYsIDB4QTMsIDB4MzAsIDB4RUYsCisJMHhCQiwgMHg3NywgMHhBOCwgMHg2RiwgMHgwQywgMHgxQSwgMHhCMSwgMHg1QiwKKwkweDA1LCAweDFBLCAweEUzLCAweEQ0LCAweDI4LCAweEM4LCAweEY4LCAweEFDLAorCTB4QjcsIDB4MEEsIDB4ODEsIDB4MzcsIDB4MTUsIDB4MEIsIDB4OEUsIDB4RUIsCisJMHgxMCwgMHhFMSwgMHg4MywgMHhFRCwgMHhEMSwgMHg5OSwgMHg2MywgMHhERCwKKwkweEQ5LCAweEUyLCAweDYzLCAweEU0LCAweDc3LCAweDA1LCAweDg5LCAweEVGLAorCTB4NkEsIDB4QTIsIDB4MUUsIDB4N0YsIDB4NUYsIDB4MkYsIDB4RjMsIDB4ODEsCisJMHhCNSwgMHgzOSwgMHhDQywgMHhFMywgMHg0MCwgMHg5RCwgMHgxMywgMHhDRCwKKwkweDU2LCAweDZBLCAweEZCLCAweEI0LCAweDhELCAweDZDLCAweDAxLCAweDkxLAorCTB4ODEsIDB4RTEsIDB4QkMsIDB4RkUsIDB4OTQsIDB4QjMsIDB4MDIsIDB4NjksCisJMHhFRCwgMHhGRSwgMHg3MiwgMHhGRSwgMHg5QiwgMHg2QSwgMHhBNCwgMHhCRCwKKwkweDdCLCAweDVBLCAweDBGLCAweDFDLCAweDcxLCAweENGLCAweEZGLCAweDRDLAorCTB4MTksIDB4QzQsIDB4MTgsIDB4RTEsIDB4RjYsIDB4RUMsIDB4MDEsIDB4NzksCisJMHg4MSwgMHhCQywgMHgwOCwgMHg3RiwgMHgyQSwgMHg3MCwgMHg2NSwgMHhCMywKKwkweDg0LCAweEI4LCAweDkwLCAweEQzLCAweDE5LCAweDFGLCAweDJCLCAweEZBCit9Oworc3RhdGljIGNvbnN0IHU4IGRoX2dyb3VwMjNfcHJpbWVbXSA9IHsKKwkweEFELCAweDEwLCAweDdFLCAweDFFLCAweDkxLCAweDIzLCAweEE5LCAweEQwLAorCTB4RDYsIDB4NjAsIDB4RkEsIDB4QTcsIDB4OTUsIDB4NTksIDB4QzUsIDB4MUYsCisJMHhBMiwgMHgwRCwgMHg2NCwgMHhFNSwgMHg2OCwgMHgzQiwgMHg5RiwgMHhEMSwKKwkweEI1LCAweDRCLCAweDE1LCAweDk3LCAweEI2LCAweDFELCAweDBBLCAweDc1LAorCTB4RTYsIDB4RkEsIDB4MTQsIDB4MUQsIDB4RjksIDB4NUEsIDB4NTYsIDB4REIsCisJMHhBRiwgMHg5QSwgMHgzQywgMHg0MCwgMHg3QiwgMHhBMSwgMHhERiwgMHgxNSwKKwkweEVCLCAweDNELCAweDY4LCAweDhBLCAweDMwLCAweDlDLCAweDE4LCAweDBFLAorCTB4MUQsIDB4RTYsIDB4QjgsIDB4NUEsIDB4MTIsIDB4NzQsIDB4QTAsIDB4QTYsCisJMHg2RCwgMHgzRiwgMHg4MSwgMHg1MiwgMHhBRCwgMHg2QSwgMHhDMiwgMHgxMiwKKwkweDkwLCAweDM3LCAweEM5LCAweEVELCAweEVGLCAweERBLCAweDRELCAweEY4LAorCTB4RDksIDB4MUUsIDB4OEYsIDB4RUYsIDB4NTUsIDB4QjcsIDB4MzksIDB4NEIsCisJMHg3QSwgMHhENSwgMHhCNywgMHhEMCwgMHhCNiwgMHhDMSwgMHgyMiwgMHgwNywKKwkweEM5LCAweEY5LCAweDhELCAweDExLCAweEVELCAweDM0LCAweERCLCAweEY2LAorCTB4QzYsIDB4QkEsIDB4MEIsIDB4MkMsIDB4OEIsIDB4QkMsIDB4MjcsIDB4QkUsCisJMHg2QSwgMHgwMCwgMHhFMCwgMHhBMCwgMHhCOSwgMHhDNCwgMHg5NywgMHgwOCwKKwkweEIzLCAweEJGLCAweDhBLCAweDMxLCAweDcwLCAweDkxLCAweDg4LCAweDM2LAorCTB4ODEsIDB4MjgsIDB4NjEsIDB4MzAsIDB4QkMsIDB4ODksIDB4ODUsIDB4REIsCisJMHgxNiwgMHgwMiwgMHhFNywgMHgxNCwgMHg0MSwgMHg1RCwgMHg5MywgMHgzMCwKKwkweDI3LCAweDgyLCAweDczLCAweEM3LCAweERFLCAweDMxLCAweEVGLCAweERDLAorCTB4NzMsIDB4MTAsIDB4RjcsIDB4MTIsIDB4MUYsIDB4RDUsIDB4QTAsIDB4NzQsCisJMHgxNSwgMHg5OCwgMHg3RCwgMHg5QSwgMHhEQywgMHgwQSwgMHg0OCwgMHg2RCwKKwkweENELCAweEY5LCAweDNBLCAweENDLCAweDQ0LCAweDMyLCAweDgzLCAweDg3LAorCTB4MzEsIDB4NUQsIDB4NzUsIDB4RTEsIDB4OTgsIDB4QzYsIDB4NDEsIDB4QTQsCisJMHg4MCwgMHhDRCwgMHg4NiwgMHhBMSwgMHhCOSwgMHhFNSwgMHg4NywgMHhFOCwKKwkweEJFLCAweDYwLCAweEU2LCAweDlDLCAweEM5LCAweDI4LCAweEIyLCAweEI5LAorCTB4QzUsIDB4MjEsIDB4NzIsIDB4RTQsIDB4MTMsIDB4MDQsIDB4MkUsIDB4OUIsCisJMHgyMywgMHhGMSwgMHgwQiwgMHgwRSwgMHgxNiwgMHhFNywgMHg5NywgMHg2MywKKwkweEM5LCAweEI1LCAweDNELCAweENGLCAweDRCLCAweEE4LCAweDBBLCAweDI5LAorCTB4RTMsIDB4RkIsIDB4NzMsIDB4QzEsIDB4NkIsIDB4OEUsIDB4NzUsIDB4QjksCisJMHg3RSwgMHhGMywgMHg2MywgMHhFMiwgMHhGRiwgMHhBMywgMHgxRiwgMHg3MSwKKwkweENGLCAweDlELCAweEU1LCAweDM4LCAweDRFLCAweDcxLCAweEI4LCAweDFDLAorCTB4MEEsIDB4QzQsIDB4REYsIDB4RkUsIDB4MEMsIDB4MTAsIDB4RTYsIDB4NEYKK307CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAyM19vcmRlcltdID0geworCTB4ODAsIDB4MUMsIDB4MEQsIDB4MzQsIDB4QzUsIDB4OEQsIDB4OTMsIDB4RkUsCisJMHg5OSwgMHg3MSwgMHg3NywgMHgxMCwgMHgxRiwgMHg4MCwgMHg1MywgMHg1QSwKKwkweDQ3LCAweDM4LCAweENFLCAweEJDLCAweEJGLCAweDM4LCAweDlBLCAweDk5LAorCTB4QjMsIDB4NjMsIDB4NzEsIDB4RUIKK307CisKKy8qCisgKiBSRkMgNTExNCwgMi4zLgorICogR3JvdXAgMjQgLSAyMDQ4LWJpdCBNT0RQIEdyb3VwIHdpdGggMjU2LWJpdCBQcmltZSBPcmRlciBTdWJncm91cAorICovCitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAyNF9nZW5lcmF0b3JbXSA9IHsKKwkweDNGLCAweEIzLCAweDJDLCAweDlCLCAweDczLCAweDEzLCAweDRELCAweDBCLAorCTB4MkUsIDB4NzcsIDB4NTAsIDB4NjYsIDB4NjAsIDB4RUQsIDB4QkQsIDB4NDgsCisJMHg0QywgMHhBNywgMHhCMSwgMHg4RiwgMHgyMSwgMHhFRiwgMHgyMCwgMHg1NCwKKwkweDA3LCAweEY0LCAweDc5LCAweDNBLCAweDFBLCAweDBCLCAweEExLCAweDI1LAorCTB4MTAsIDB4REIsIDB4QzEsIDB4NTAsIDB4NzcsIDB4QkUsIDB4NDYsIDB4M0YsCisJMHhGRiwgMHg0RiwgMHhFRCwgMHg0QSwgMHhBQywgMHgwQiwgMHhCNSwgMHg1NSwKKwkweEJFLCAweDNBLCAweDZDLCAweDFCLCAweDBDLCAweDZCLCAweDQ3LCAweEIxLAorCTB4QkMsIDB4MzcsIDB4NzMsIDB4QkYsIDB4N0UsIDB4OEMsIDB4NkYsIDB4NjIsCisJMHg5MCwgMHgxMiwgMHgyOCwgMHhGOCwgMHhDMiwgMHg4QywgMHhCQiwgMHgxOCwKKwkweEE1LCAweDVBLCAweEUzLCAweDEzLCAweDQxLCAweDAwLCAweDBBLCAweDY1LAorCTB4MDEsIDB4OTYsIDB4RjksIDB4MzEsIDB4QzcsIDB4N0EsIDB4NTcsIDB4RjIsCisJMHhERCwgMHhGNCwgMHg2MywgMHhFNSwgMHhFOSwgMHhFQywgMHgxNCwgMHg0QiwKKwkweDc3LCAweDdELCAweEU2LCAweDJBLCAweEFBLCAweEI4LCAweEE4LCAweDYyLAorCTB4OEEsIDB4QzMsIDB4NzYsIDB4RDIsIDB4ODIsIDB4RDYsIDB4RUQsIDB4MzgsCisJMHg2NCwgMHhFNiwgMHg3OSwgMHg4MiwgMHg0MiwgMHg4RSwgMHhCQywgMHg4MywKKwkweDFELCAweDE0LCAweDM0LCAweDhGLCAweDZGLCAweDJGLCAweDkxLCAweDkzLAorCTB4QjUsIDB4MDQsIDB4NUEsIDB4RjIsIDB4NzYsIDB4NzEsIDB4NjQsIDB4RTEsCisJMHhERiwgMHhDOSwgMHg2NywgMHhDMSwgMHhGQiwgMHgzRiwgMHgyRSwgMHg1NSwKKwkweEE0LCAweEJELCAweDFCLCAweEZGLCAweEU4LCAweDNCLCAweDlDLCAweDgwLAorCTB4RDAsIDB4NTIsIDB4QjksIDB4ODUsIDB4RDEsIDB4ODIsIDB4RUEsIDB4MEEsCisJMHhEQiwgMHgyQSwgMHgzQiwgMHg3MywgMHgxMywgMHhEMywgMHhGRSwgMHgxNCwKKwkweEM4LCAweDQ4LCAweDRCLCAweDFFLCAweDA1LCAweDI1LCAweDg4LCAweEI5LAorCTB4QjcsIDB4RDIsIDB4QkIsIDB4RDIsIDB4REYsIDB4MDEsIDB4NjEsIDB4OTksCisJMHhFQywgMHhEMCwgMHg2RSwgMHgxNSwgMHg1NywgMHhDRCwgMHgwOSwgMHgxNSwKKwkweEIzLCAweDM1LCAweDNCLCAweEJCLCAweDY0LCAweEUwLCAweEVDLCAweDM3LAorCTB4N0YsIDB4RDAsIDB4MjgsIDB4MzcsIDB4MEQsIDB4RjksIDB4MkIsIDB4NTIsCisJMHhDNywgMHg4OSwgMHgxNCwgMHgyOCwgMHhDRCwgMHhDNiwgMHg3RSwgMHhCNiwKKwkweDE4LCAweDRCLCAweDUyLCAweDNELCAweDFELCAweEIyLCAweDQ2LCAweEMzLAorCTB4MkYsIDB4NjMsIDB4MDcsIDB4ODQsIDB4OTAsIDB4RjAsIDB4MEUsIDB4RjgsCisJMHhENiwgMHg0NywgMHhEMSwgMHg0OCwgMHhENCwgMHg3OSwgMHg1NCwgMHg1MSwKKwkweDVFLCAweDIzLCAweDI3LCAweENGLCAweEVGLCAweDk4LCAweEM1LCAweDgyLAorCTB4NjYsIDB4NEIsIDB4NEMsIDB4MEYsIDB4NkMsIDB4QzQsIDB4MTYsIDB4NTkKK307CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAyNF9wcmltZVtdID0geworCTB4ODcsIDB4QTgsIDB4RTYsIDB4MUQsIDB4QjQsIDB4QjYsIDB4NjYsIDB4M0MsCisJMHhGRiwgMHhCQiwgMHhEMSwgMHg5QywgMHg2NSwgMHgxOSwgMHg1OSwgMHg5OSwKKwkweDhDLCAweEVFLCAweEY2LCAweDA4LCAweDY2LCAweDBELCAweEQwLCAweEYyLAorCTB4NUQsIDB4MkMsIDB4RUUsIDB4RDQsIDB4NDMsIDB4NUUsIDB4M0IsIDB4MDAsCisJMHhFMCwgMHgwRCwgMHhGOCwgMHhGMSwgMHhENiwgMHgxOSwgMHg1NywgMHhENCwKKwkweEZBLCAweEY3LCAweERGLCAweDQ1LCAweDYxLCAweEIyLCAweEFBLCAweDMwLAorCTB4MTYsIDB4QzMsIDB4RDksIDB4MTEsIDB4MzQsIDB4MDksIDB4NkYsIDB4QUEsCisJMHgzQiwgMHhGNCwgMHgyOSwgMHg2RCwgMHg4MywgMHgwRSwgMHg5QSwgMHg3QywKKwkweDIwLCAweDlFLCAweDBDLCAweDY0LCAweDk3LCAweDUxLCAweDdBLCAweEJELAorCTB4NUEsIDB4OEEsIDB4OUQsIDB4MzAsIDB4NkIsIDB4Q0YsIDB4NjcsIDB4RUQsCisJMHg5MSwgMHhGOSwgMHhFNiwgMHg3MiwgMHg1QiwgMHg0NywgMHg1OCwgMHhDMCwKKwkweDIyLCAweEUwLCAweEIxLCAweEVGLCAweDQyLCAweDc1LCAweEJGLCAweDdCLAorCTB4NkMsIDB4NUIsIDB4RkMsIDB4MTEsIDB4RDQsIDB4NUYsIDB4OTAsIDB4ODgsCisJMHhCOSwgMHg0MSwgMHhGNSwgMHg0RSwgMHhCMSwgMHhFNSwgMHg5QiwgMHhCOCwKKwkweEJDLCAweDM5LCAweEEwLCAweEJGLCAweDEyLCAweDMwLCAweDdGLCAweDVDLAorCTB4NEYsIDB4REIsIDB4NzAsIDB4QzUsIDB4ODEsIDB4QjIsIDB4M0YsIDB4NzYsCisJMHhCNiwgMHgzQSwgMHhDQSwgMHhFMSwgMHhDQSwgMHhBNiwgMHhCNywgMHg5MCwKKwkweDJELCAweDUyLCAweDUyLCAweDY3LCAweDM1LCAweDQ4LCAweDhBLCAweDBFLAorCTB4RjEsIDB4M0MsIDB4NkQsIDB4OUEsIDB4NTEsIDB4QkYsIDB4QTQsIDB4QUIsCisJMHgzQSwgMHhEOCwgMHgzNCwgMHg3NywgMHg5NiwgMHg1MiwgMHg0RCwgMHg4RSwKKwkweEY2LCAweEExLCAweDY3LCAweEI1LCAweEE0LCAweDE4LCAweDI1LCAweEQ5LAorCTB4NjcsIDB4RTEsIDB4NDQsIDB4RTUsIDB4MTQsIDB4MDUsIDB4NjQsIDB4MjUsCisJMHgxQywgMHhDQSwgMHhDQiwgMHg4MywgMHhFNiwgMHhCNCwgMHg4NiwgMHhGNiwKKwkweEIzLCAweENBLCAweDNGLCAweDc5LCAweDcxLCAweDUwLCAweDYwLCAweDI2LAorCTB4QzAsIDB4QjgsIDB4NTcsIDB4RjYsIDB4ODksIDB4OTYsIDB4MjgsIDB4NTYsCisJMHhERSwgMHhENCwgMHgwMSwgMHgwQSwgMHhCRCwgMHgwQiwgMHhFNiwgMHgyMSwKKwkweEMzLCAweEEzLCAweDk2LCAweDBBLCAweDU0LCAweEU3LCAweDEwLCAweEMzLAorCTB4NzUsIDB4RjIsIDB4NjMsIDB4NzUsIDB4RDcsIDB4MDEsIDB4NDEsIDB4MDMsCisJMHhBNCwgMHhCNSwgMHg0MywgMHgzMCwgMHhDMSwgMHg5OCwgMHhBRiwgMHgxMiwKKwkweDYxLCAweDE2LCAweEQyLCAweDI3LCAweDZFLCAweDExLCAweDcxLCAweDVGLAorCTB4NjksIDB4MzgsIDB4NzcsIDB4RkEsIDB4RDcsIDB4RUYsIDB4MDksIDB4Q0EsCisJMHhEQiwgMHgwOSwgMHg0QSwgMHhFOSwgMHgxRSwgMHgxQSwgMHgxNSwgMHg5NworfTsKK3N0YXRpYyBjb25zdCB1OCBkaF9ncm91cDI0X29yZGVyW10gPSB7CisJMHg4QywgMHhGOCwgMHgzNiwgMHg0MiwgMHhBNywgMHgwOSwgMHhBMCwgMHg5NywKKwkweEI0LCAweDQ3LCAweDk5LCAweDc2LCAweDQwLCAweDEyLCAweDlELCAweEEyLAorCTB4OTksIDB4QjEsIDB4QTQsIDB4N0QsIDB4MUUsIDB4QjMsIDB4NzUsIDB4MEIsCisJMHhBMywgMHgwOCwgMHhCMCwgMHhGRSwgMHg2NCwgMHhGNSwgMHhGQiwgMHhEMworfTsKIAogI2VuZGlmIC8qIEFMTF9ESF9HUk9VUFMgKi8KIAogCi0jZGVmaW5lIERIX0dST1VQKGlkKSBcCisjZGVmaW5lIERIX0dST1VQKGlkLHNhZmUpIFwKIHsgaWQsIGRoX2dyb3VwICMjIGlkICMjIF9nZW5lcmF0b3IsIHNpemVvZihkaF9ncm91cCAjIyBpZCAjIyBfZ2VuZXJhdG9yKSwgXAotZGhfZ3JvdXAgIyMgaWQgIyMgX3ByaW1lLCBzaXplb2YoZGhfZ3JvdXAgIyMgaWQgIyMgX3ByaW1lKSB9CitkaF9ncm91cCAjIyBpZCAjIyBfcHJpbWUsIHNpemVvZihkaF9ncm91cCAjIyBpZCAjIyBfcHJpbWUpLCBcCitkaF9ncm91cCAjIyBpZCAjIyBfb3JkZXIsIHNpemVvZihkaF9ncm91cCAjIyBpZCAjIyBfb3JkZXIpLCBzYWZlIH0KIAkJCiAKIHN0YXRpYyBzdHJ1Y3QgZGhfZ3JvdXAgZGhfZ3JvdXBzW10gPSB7Ci0JREhfR1JPVVAoNSksCisJREhfR1JPVVAoNSwgMSksCiAjaWZkZWYgQUxMX0RIX0dST1VQUwotCURIX0dST1VQKDEpLAotCURIX0dST1VQKDIpLAotCURIX0dST1VQKDE0KSwKLQlESF9HUk9VUCgxNSksCi0JREhfR1JPVVAoMTYpLAotCURIX0dST1VQKDE3KSwKLQlESF9HUk9VUCgxOCkKKwlESF9HUk9VUCgxLCAxKSwKKwlESF9HUk9VUCgyLCAxKSwKKwlESF9HUk9VUCgxNCwgMSksCisJREhfR1JPVVAoMTUsIDEpLAorCURIX0dST1VQKDE2LCAxKSwKKwlESF9HUk9VUCgxNywgMSksCisJREhfR1JPVVAoMTgsIDEpLAorCURIX0dST1VQKDIyLCAwKSwKKwlESF9HUk9VUCgyMywgMCksCisJREhfR1JPVVAoMjQsIDApCiAjZW5kaWYgLyogQUxMX0RIX0dST1VQUyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9kaF9ncm91cHMuaCBiL3NyYy9jcnlwdG8vZGhfZ3JvdXBzLmgKaW5kZXggMjI1ZjAwNi4uZDBlNzRiOSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kaF9ncm91cHMuaAorKysgYi9zcmMvY3J5cHRvL2RoX2dyb3Vwcy5oCkBAIC0xNSw2ICsxNSw5IEBACiAJc2l6ZV90IGdlbmVyYXRvcl9sZW47CiAJY29uc3QgdTggKnByaW1lOwogCXNpemVfdCBwcmltZV9sZW47CisJY29uc3QgdTggKm9yZGVyOworCXNpemVfdCBvcmRlcl9sZW47CisJdW5zaWduZWQgaW50IHNhZmVfcHJpbWU6MTsKIH07CiAKIGNvbnN0IHN0cnVjdCBkaF9ncm91cCAqIGRoX2dyb3Vwc19nZXQoaW50IGlkKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbWQ1LWludGVybmFsLmMgYi9zcmMvY3J5cHRvL21kNS1pbnRlcm5hbC5jCmluZGV4IDc5MGE2ZjMuLmYwYTJhNWQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbWQ1LWludGVybmFsLmMKKysrIGIvc3JjL2NyeXB0by9tZDUtaW50ZXJuYWwuYwpAQCAtMTc2LDggKzE3Niw4IEBACiAgICAgYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTQpOwogCiAgICAgLyogQXBwZW5kIGxlbmd0aCBpbiBiaXRzIGFuZCB0cmFuc2Zvcm0gKi8KLSAgICAoKHUzMiAqKSBjdHgtPmluKVsxNF0gPSBjdHgtPmJpdHNbMF07Ci0gICAgKCh1MzIgKikgY3R4LT5pbilbMTVdID0gY3R4LT5iaXRzWzFdOworICAgICgodTMyICopIGFsaWFzaW5nX2hpZGVfdHlwZWNhc3QoY3R4LT5pbiwgdTMyKSlbMTRdID0gY3R4LT5iaXRzWzBdOworICAgICgodTMyICopIGFsaWFzaW5nX2hpZGVfdHlwZWNhc3QoY3R4LT5pbiwgdTMyKSlbMTVdID0gY3R4LT5iaXRzWzFdOwogCiAgICAgTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAodTMyICopIGN0eC0+aW4pOwogICAgIGJ5dGVSZXZlcnNlKCh1bnNpZ25lZCBjaGFyICopIGN0eC0+YnVmLCA0KTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vc2hhMjU2LXByZi5jIGIvc3JjL2NyeXB0by9zaGEyNTYtcHJmLmMKaW5kZXggMGRhNmQxMy4uOWExMTIwOCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9zaGEyNTYtcHJmLmMKKysrIGIvc3JjL2NyeXB0by9zaGEyNTYtcHJmLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogU0hBMjU2LWJhc2VkIFBSRiAoSUVFRSA4MDIuMTFyKQotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMjksMTIgKzI5LDM2IEBACiB2b2lkIHNoYTI1Nl9wcmYoY29uc3QgdTggKmtleSwgc2l6ZV90IGtleV9sZW4sIGNvbnN0IGNoYXIgKmxhYmVsLAogCQljb25zdCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqYnVmLCBzaXplX3QgYnVmX2xlbikKIHsKKwlzaGEyNTZfcHJmX2JpdHMoa2V5LCBrZXlfbGVuLCBsYWJlbCwgZGF0YSwgZGF0YV9sZW4sIGJ1ZiwgYnVmX2xlbiAqIDgpOworfQorCisKKy8qKgorICogc2hhMjU2X3ByZl9iaXRzIC0gSUVFRSBTdGQgODAyLjExLTIwMTIsIDExLjYuMS43LjIgS2V5IGRlcml2YXRpb24gZnVuY3Rpb24KKyAqIEBrZXk6IEtleSBmb3IgS0RGCisgKiBAa2V5X2xlbjogTGVuZ3RoIG9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBsYWJlbDogQSB1bmlxdWUgbGFiZWwgZm9yIGVhY2ggcHVycG9zZSBvZiB0aGUgUFJGCisgKiBAZGF0YTogRXh0cmEgZGF0YSB0byBiaW5kIGludG8gdGhlIGtleQorICogQGRhdGFfbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEKKyAqIEBidWY6IEJ1ZmZlciBmb3IgdGhlIGdlbmVyYXRlZCBwc2V1ZG8tcmFuZG9tIGtleQorICogQGJ1Zl9sZW46IE51bWJlciBvZiBiaXRzIG9mIGtleSB0byBnZW5lcmF0ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXJpdmUgbmV3LCBjcnlwdG9ncmFwaGljYWxseSBzZXBhcmF0ZSBrZXlzIGZyb20gYQorICogZ2l2ZW4ga2V5LiBJZiB0aGUgcmVxdWVzdGVkIGJ1Zl9sZW4gaXMgbm90IGRpdmlzaWJsZSBieSBlaWdodCwgdGhlIGxlYXN0CisgKiBzaWduaWZpY2FudCAxLTcgYml0cyBvZiB0aGUgbGFzdCBvY3RldCBpbiB0aGUgb3V0cHV0IGFyZSBub3QgcGFydCBvZiB0aGUKKyAqIHJlcXVlc3RlZCBvdXRwdXQuCisgKi8KK3ZvaWQgc2hhMjU2X3ByZl9iaXRzKGNvbnN0IHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCBjb25zdCBjaGFyICpsYWJlbCwKKwkJICAgICBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqYnVmLAorCQkgICAgIHNpemVfdCBidWZfbGVuX2JpdHMpCit7CiAJdTE2IGNvdW50ZXIgPSAxOwogCXNpemVfdCBwb3MsIHBsZW47CiAJdTggaGFzaFtTSEEyNTZfTUFDX0xFTl07CiAJY29uc3QgdTggKmFkZHJbNF07CiAJc2l6ZV90IGxlbls0XTsKIAl1OCBjb3VudGVyX2xlWzJdLCBsZW5ndGhfbGVbMl07CisJc2l6ZV90IGJ1Zl9sZW4gPSAoYnVmX2xlbl9iaXRzICsgNykgLyA4OwogCiAJYWRkclswXSA9IGNvdW50ZXJfbGU7CiAJbGVuWzBdID0gMjsKQEAgLTQ1LDcgKzY5LDcgQEAKIAlhZGRyWzNdID0gbGVuZ3RoX2xlOwogCWxlblszXSA9IHNpemVvZihsZW5ndGhfbGUpOwogCi0JV1BBX1BVVF9MRTE2KGxlbmd0aF9sZSwgYnVmX2xlbiAqIDgpOworCVdQQV9QVVRfTEUxNihsZW5ndGhfbGUsIGJ1Zl9sZW5fYml0cyk7CiAJcG9zID0gMDsKIAl3aGlsZSAocG9zIDwgYnVmX2xlbikgewogCQlwbGVuID0gYnVmX2xlbiAtIHBvczsKQEAgLTU3LDggKzgxLDE4IEBACiAJCX0gZWxzZSB7CiAJCQlobWFjX3NoYTI1Nl92ZWN0b3Ioa2V5LCBrZXlfbGVuLCA0LCBhZGRyLCBsZW4sIGhhc2gpOwogCQkJb3NfbWVtY3B5KCZidWZbcG9zXSwgaGFzaCwgcGxlbik7CisJCQlwb3MgKz0gcGxlbjsKIAkJCWJyZWFrOwogCQl9CiAJCWNvdW50ZXIrKzsKIAl9CisKKwkvKgorCSAqIE1hc2sgb3V0IHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IG9jdGV0IGlmIGl0IGRvZXMgbm90IHVzZSBhbGwgdGhlCisJICogYml0cy4KKwkgKi8KKwlpZiAoYnVmX2xlbl9iaXRzICUgOCkgeworCQl1OCBtYXNrID0gMHhmZiA8PCAoOCAtIGJ1Zl9sZW5fYml0cyAlIDgpOworCQlidWZbcG9zIC0gMV0gJj0gbWFzazsKKwl9CiB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3NoYTI1Ni5oIGIvc3JjL2NyeXB0by9zaGEyNTYuaAppbmRleCBmY2FjODAwLi43NTk2YTUyIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYTI1Ni5oCisrKyBiL3NyYy9jcnlwdG8vc2hhMjU2LmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogU0hBMjU2IGhhc2ggaW1wbGVtZW50YXRpb24gYW5kIGludGVyZmFjZSBmdW5jdGlvbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDExLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTMsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KICAqIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KQEAgLTE3LDYgKzE3LDkgQEAKIAkJc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKTsKIHZvaWQgc2hhMjU2X3ByZihjb25zdCB1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgY29uc3QgY2hhciAqbGFiZWwsCiAJICAgICAgY29uc3QgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4pOwordm9pZCBzaGEyNTZfcHJmX2JpdHMoY29uc3QgdTggKmtleSwgc2l6ZV90IGtleV9sZW4sIGNvbnN0IGNoYXIgKmxhYmVsLAorCQkgICAgIGNvbnN0IHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICpidWYsCisJCSAgICAgc2l6ZV90IGJ1Zl9sZW5fYml0cyk7CiB2b2lkIHRsc19wcmZfc2hhMjU2KGNvbnN0IHU4ICpzZWNyZXQsIHNpemVfdCBzZWNyZXRfbGVuLAogCQkgICAgY29uc3QgY2hhciAqbGFiZWwsIGNvbnN0IHU4ICpzZWVkLCBzaXplX3Qgc2VlZF9sZW4sCiAJCSAgICB1OCAqb3V0LCBzaXplX3Qgb3V0bGVuKTsKZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL2RyaXZlci5oIGIvc3JjL2RyaXZlcnMvZHJpdmVyLmgKaW5kZXggZTlmOTI2Zi4uNWRlZTJlNiAxMDA2NDQKLS0tIGEvc3JjL2RyaXZlcnMvZHJpdmVyLmgKKysrIGIvc3JjL2RyaXZlcnMvZHJpdmVyLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAkvKioKIAkgKiBmcmVxIC0gRnJlcXVlbmN5IGluIE1IegogCSAqLwotCXNob3J0IGZyZXE7CisJaW50IGZyZXE7CiAKIAkvKioKIAkgKiBmbGFnIC0gQ2hhbm5lbCBmbGFncyAoSE9TVEFQRF9DSEFOXyopCkBAIC0xMjIsNiArMTIyLDEzIEBACiAjZGVmaW5lIElFRUU4MDIxMV9DQVBfSUJTUwkweDAwMDIKICNkZWZpbmUgSUVFRTgwMjExX0NBUF9QUklWQUNZCTB4MDAxMAogCisvKiBETUcgKDYwIEdIeikgSUVFRSA4MDIuMTFhZCAqLworLyogdHlwZSAtIGJpdHMgMC4uMSAqLworI2RlZmluZSBJRUVFODAyMTFfQ0FQX0RNR19NQVNLCTB4MDAwMworI2RlZmluZSBJRUVFODAyMTFfQ0FQX0RNR19JQlNTCTB4MDAwMSAvKiBUeCBieTogU1RBICovCisjZGVmaW5lIElFRUU4MDIxMV9DQVBfRE1HX1BCU1MJMHgwMDAyIC8qIFR4IGJ5OiBQQ1AgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NBUF9ETUdfQVAJMHgwMDAzIC8qIFR4IGJ5OiBBUCAqLworCiAjZGVmaW5lIFdQQV9TQ0FOX1FVQUxfSU5WQUxJRAkJQklUKDApCiAjZGVmaW5lIFdQQV9TQ0FOX05PSVNFX0lOVkFMSUQJCUJJVCgxKQogI2RlZmluZSBXUEFfU0NBTl9MRVZFTF9JTlZBTElECQlCSVQoMikKQEAgLTE4MCwxMCArMTg3LDEyIEBACiAgKiBzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0cyAtIFNjYW4gcmVzdWx0cwogICogQHJlczogQXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsb2NhdGVkIHZhcmlhYmxlIGxlbmd0aCBzY2FuIHJlc3VsdCBlbnRyaWVzCiAgKiBAbnVtOiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2NhbiByZXN1bHQgYXJyYXkKKyAqIEBmZXRjaF90aW1lOiBUaW1lIHdoZW4gdGhlIHJlc3VsdHMgd2VyZSBmZXRjaGVkIGZyb20gdGhlIGRyaXZlcgogICovCiBzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0cyB7CiAJc3RydWN0IHdwYV9zY2FuX3JlcyAqKnJlczsKIAlzaXplX3QgbnVtOworCXN0cnVjdCBvc190aW1lIGZldGNoX3RpbWU7CiB9OwogCiAvKioKQEAgLTMxNCw2ICszMjMsOSBAQAogCSAqLwogCWludCBwMnA7CiAKKwljb25zdCB1OCAqc2FlX2RhdGE7CisJc2l6ZV90IHNhZV9kYXRhX2xlbjsKKwogfTsKIAogZW51bSB3cHNfbW9kZSB7CkBAIC03NTgsNiArNzcwLDcgQEAKICNkZWZpbmUgV1BBX0RSSVZFUl9DQVBBX0tFWV9NR01UX1dQQV9OT05FCTB4MDAwMDAwMTAKICNkZWZpbmUgV1BBX0RSSVZFUl9DQVBBX0tFWV9NR01UX0ZUCQkweDAwMDAwMDIwCiAjZGVmaW5lIFdQQV9EUklWRVJfQ0FQQV9LRVlfTUdNVF9GVF9QU0sJCTB4MDAwMDAwNDAKKyNkZWZpbmUgV1BBX0RSSVZFUl9DQVBBX0tFWV9NR01UX1dBUElfUFNLCTB4MDAwMDAwODAKIAl1bnNpZ25lZCBpbnQga2V5X21nbXQ7CiAKICNkZWZpbmUgV1BBX0RSSVZFUl9DQVBBX0VOQ19XRVA0MAkweDAwMDAwMDAxCkBAIC04MzQsNiArODQ3LDEwIEBACiAjZGVmaW5lIFdQQV9EUklWRVJfRkxBR1NfSU5BQ1RJVklUWV9USU1FUgkJMHgwMDgwMDAwMAogLyogRHJpdmVyIGV4cGVjdHMgdXNlciBzcGFjZSBpbXBsZW1lbnRhdGlvbiBvZiBNTE1FIGluIEFQIG1vZGUgKi8KICNkZWZpbmUgV1BBX0RSSVZFUl9GTEFHU19BUF9NTE1FCQkJMHgwMTAwMDAwMAorLyogRHJpdmVyIHN1cHBvcnRzIFNBRSB3aXRoIHVzZXIgc3BhY2UgU01FICovCisjZGVmaW5lIFdQQV9EUklWRVJfRkxBR1NfU0FFCQkJCTB4MDIwMDAwMDAKKy8qIERyaXZlciBtYWtlcyB1c2Ugb2YgT0JTUyBzY2FuIG1lY2hhbmlzbSBpbiB3cGFfc3VwcGxpY2FudCAqLworI2RlZmluZSBXUEFfRFJJVkVSX0ZMQUdTX09CU1NfU0NBTgkJCTB4MDQwMDAwMDAKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAKIAlpbnQgbWF4X3NjYW5fc3NpZHM7CkBAIC04OTAsMTkgKzkwNywzMSBAQAogCXNpemVfdCBzdXBwX3JhdGVzX2xlbjsKIAl1MTYgbGlzdGVuX2ludGVydmFsOwogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwYWJpbGl0aWVzICpodF9jYXBhYmlsaXRpZXM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwYWJpbGl0aWVzICp2aHRfY2FwYWJpbGl0aWVzOwogCXUzMiBmbGFnczsgLyogYml0bWFzayBvZiBXUEFfU1RBXyogZmxhZ3MgKi8KIAlpbnQgc2V0OyAvKiBTZXQgU1RBIHBhcmFtZXRlcnMgaW5zdGVhZCBvZiBhZGQgKi8KIAl1OCBxb3NpbmZvOworCWNvbnN0IHU4ICpleHRfY2FwYWI7CisJc2l6ZV90IGV4dF9jYXBhYl9sZW47CiB9OwogCiBzdHJ1Y3QgaG9zdGFwZF9mcmVxX3BhcmFtcyB7CiAJaW50IG1vZGU7CiAJaW50IGZyZXE7CiAJaW50IGNoYW5uZWw7CisJLyogZm9yIEhUICovCiAJaW50IGh0X2VuYWJsZWQ7CiAJaW50IHNlY19jaGFubmVsX29mZnNldDsgLyogMCA9IEhUNDAgZGlzYWJsZWQsIC0xID0gSFQ0MCBlbmFibGVkLAogCQkJCSAqIHNlY29uZGFyeSBjaGFubmVsIGJlbG93IHByaW1hcnksIDEgPSBIVDQwCiAJCQkJICogZW5hYmxlZCwgc2Vjb25kYXJ5IGNoYW5uZWwgYWJvdmUgcHJpbWFyeSAqLworCisJLyogZm9yIFZIVCAqLworCWludCB2aHRfZW5hYmxlZDsKKworCS8qIHZhbGlkIGZvciBib3RoIEhUIGFuZCBWSFQsIGNlbnRlcl9mcmVxMiBpcyBub24temVybworCSAqIG9ubHkgZm9yIGJhbmR3aWR0aCA4MCBhbmQgYW4gODArODAgY2hhbm5lbCAqLworCWludCBjZW50ZXJfZnJlcTEsIGNlbnRlcl9mcmVxMjsKKwlpbnQgYmFuZHdpZHRoOwogfTsKIAogZW51bSB3cGFfZHJpdmVyX2lmX3R5cGUgewpAQCAtMTE5NSwxNyArMTIyNCw2IEBACiAJaW50ICgqZGVhdXRoZW50aWNhdGUpKHZvaWQgKnByaXYsIGNvbnN0IHU4ICphZGRyLCBpbnQgcmVhc29uX2NvZGUpOwogCiAJLyoqCi0JICogZGlzYXNzb2NpYXRlIC0gUmVxdWVzdCBkcml2ZXIgdG8gZGlzYXNzb2NpYXRlCi0JICogQHByaXY6IHByaXZhdGUgZHJpdmVyIGludGVyZmFjZSBkYXRhCi0JICogQGFkZHI6IHBlZXIgYWRkcmVzcyAoQlNTSUQgb2YgdGhlIEFQKQotCSAqIEByZWFzb25fY29kZTogMTYtYml0IHJlYXNvbiBjb2RlIHRvIGJlIHNlbnQgaW4gdGhlIGRpc2Fzc29jaWF0aW9uCi0JICoJZnJhbWUKLQkgKgotCSAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotCSAqLwotCWludCAoKmRpc2Fzc29jaWF0ZSkodm9pZCAqcHJpdiwgY29uc3QgdTggKmFkZHIsIGludCByZWFzb25fY29kZSk7Ci0KLQkvKioKIAkgKiBhc3NvY2lhdGUgLSBSZXF1ZXN0IGRyaXZlciB0byBhc3NvY2lhdGUKIAkgKiBAcHJpdjogcHJpdmF0ZSBkcml2ZXIgaW50ZXJmYWNlIGRhdGEKIAkgKiBAcGFyYW1zOiBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzCkBAIC0zMDYwLDcgKzMwNzgsMTYgQEAKIAkgKgogCSAqIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBhIFdOTSBvcGVyYXRpb24gdG8gYmUgcGVyZm9ybWVkLgogCSAqLwotCUVWRU5UX1dOTQorCUVWRU5UX1dOTSwKKworCS8qKgorCSAqIEVWRU5UX0NPTk5FQ1RfRkFJTEVEX1JFQVNPTiAtIENvbm5lY3Rpb24gZmFpbHVyZSByZWFzb24gaW4gQVAgbW9kZQorCSAqCisJICogVGhpcyBldmVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgZHJpdmVyIHJlcG9ydGVkIGEgY29ubmVjdGlvbiBmYWlsdXJlCisJICogd2l0aCB0aGUgc3BlY2lmaWVkIGNsaWVudCAoZm9yIGV4YW1wbGUsIG1heCBjbGllbnQgcmVhY2hlZCwgZXRjLikgaW4KKwkgKiBBUCBtb2RlLgorCSAqLworCUVWRU5UX0NPTk5FQ1RfRkFJTEVEX1JFQVNPTgogfTsKIAogCkBAIC0zNjg1LDYgKzM3MTIsMTkgQEAKIAkJaW50IGh0X2VuYWJsZWQ7CiAJCWludCBjaF9vZmZzZXQ7CiAJfSBjaF9zd2l0Y2g7CisKKwkvKioKKwkgKiBzdHJ1Y3QgY29ubmVjdF9mYWlsZWQgLSBEYXRhIGZvciBFVkVOVF9DT05ORUNUX0ZBSUxFRF9SRUFTT04KKwkgKiBAYWRkcjogUmVtb3RlIGNsaWVudCBhZGRyZXNzCisJICogQGNvZGU6IFJlYXNvbiBjb2RlIGZvciBjb25uZWN0aW9uIGZhaWx1cmUKKwkgKi8KKwlzdHJ1Y3QgY29ubmVjdF9mYWlsZWRfcmVhc29uIHsKKwkJdTggYWRkcltFVEhfQUxFTl07CisJCWVudW0geworCQkJTUFYX0NMSUVOVF9SRUFDSEVELAorCQkJQkxPQ0tFRF9DTElFTlQKKwkJfSBjb2RlOworCX0gY29ubmVjdF9mYWlsZWRfcmVhc29uOwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9zcmMvZHJpdmVycy9kcml2ZXJfYXRoZXJvcy5jIGIvc3JjL2RyaXZlcnMvZHJpdmVyX2F0aGVyb3MuYwppbmRleCA1ZjJlNjc1Li5jMmY1OTM0IDEwMDY0NAotLS0gYS9zcmMvZHJpdmVycy9kcml2ZXJfYXRoZXJvcy5jCisrKyBiL3NyYy9kcml2ZXJzL2RyaXZlcl9hdGhlcm9zLmMKQEAgLTg3NCw3ICs4NzQsNyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19IUzIwICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19JRUVFODAyMTFWKSAmJiAhZGVmaW5lZChDT05GSUdfSUVFRTgwMjExUikKKyNpZiBkZWZpbmVkKENPTkZJR19XTk0pICYmICFkZWZpbmVkKENPTkZJR19JRUVFODAyMTFSKQogc3RhdGljIHZvaWQgYXRoZXJvc19yYXdfcmVjdl8xMXYodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjX2FkZHIsIGNvbnN0IHU4ICpidWYsCiAJCQkJIHNpemVfdCBsZW4pCiB7CkBAIC05MjEsOSArOTIxLDkgQEAKIAkJYnJlYWs7CiAJfQogfQotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfV1BTKSB8fCBkZWZpbmVkKENPTkZJR19JRUVFODAyMTFSKSB8fCBkZWZpbmVkKENPTkZJR19JRUVFODAyMTFWKQorI2lmIGRlZmluZWQoQ09ORklHX1dQUykgfHwgZGVmaW5lZChDT05GSUdfSUVFRTgwMjExUikgfHwgZGVmaW5lZChDT05GSUdfV05NKQogc3RhdGljIHZvaWQgYXRoZXJvc19yYXdfcmVjZWl2ZSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmNfYWRkciwgY29uc3QgdTggKmJ1ZiwKIAkJCQlzaXplX3QgbGVuKQogewpAQCAtOTMzLDkgKzkzMyw5IEBACiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVIKIAlhdGhlcm9zX3Jhd19yZWN2XzExcihjdHgsIHNyY19hZGRyLCBidWYsIGxlbik7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19JRUVFODAyMTFWKSAmJiAhZGVmaW5lZChDT05GSUdfSUVFRTgwMjExUikKKyNpZiBkZWZpbmVkKENPTkZJR19XTk0pICYmICFkZWZpbmVkKENPTkZJR19JRUVFODAyMTFSKQogCWF0aGVyb3NfcmF3X3JlY3ZfMTF2KGN0eCwgc3JjX2FkZHIsIGJ1ZiwgbGVuKTsKLSNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExViAqLworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KICNpZmRlZiBDT05GSUdfSFMyMAogCWF0aGVyb3NfcmF3X3JlY3ZfaHMyMChjdHgsIHNyY19hZGRyLCBidWYsIGxlbik7CiAjZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KQEAgLTk1Nyw5ICs5NTcsOSBAQAogCQkJICAgICAgIElFRUU4MDIxMV9GSUxURVJfVFlQRV9BVVRIIHwKIAkJCSAgICAgICBJRUVFODAyMTFfRklMVEVSX1RZUEVfQUNUSU9OKTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCisjaWZkZWYgQ09ORklHX1dOTQogCWZpbHQuYXBwX2ZpbHRlcnlwZSB8PSBJRUVFODAyMTFfRklMVEVSX1RZUEVfQUNUSU9OOwotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogI2lmZGVmIENPTkZJR19IUzIwCiAJZmlsdC5hcHBfZmlsdGVyeXBlIHw9IElFRUU4MDIxMV9GSUxURVJfVFlQRV9BQ1RJT047CiAjZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KQEAgLTk3Niw4ICs5NzYsNiBAQAogCWlmIChkcnYtPnNvY2tfcmF3ID09IE5VTEwpCiAJCXJldHVybiAtMTsKICNlbmRpZiAvKiBDT05GSUdfV1BTIHx8IENPTkZJR19JRUVFODAyMTFSICovCi0JaWYgKGwyX3BhY2tldF9nZXRfb3duX2FkZHIoZHJ2LT5zb2NrX3htaXQsIGRydi0+b3duX2FkZHIpKQotCQlyZXR1cm4gLTE7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTY1Niw2ICsxNjU0LDcgQEAKIAkJZ290byBiYWQ7CiAJaWYgKGwyX3BhY2tldF9nZXRfb3duX2FkZHIoZHJ2LT5zb2NrX3htaXQsIHBhcmFtcy0+b3duX2FkZHIpKQogCQlnb3RvIGJhZDsKKwlvc19tZW1jcHkoZHJ2LT5vd25fYWRkciwgcGFyYW1zLT5vd25fYWRkciwgRVRIX0FMRU4pOwogCWlmIChwYXJhbXMtPmJyaWRnZVswXSkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNvbmZpZ3VyZSBicmlkZ2UgJXMgZm9yIEVBUE9MIHRyYWZmaWMuIiwKIAkJCSAgIHBhcmFtcy0+YnJpZGdlWzBdKTsKQEAgLTE2ODksMTMgKzE2ODgsMTcgQEAKIAlsaW51eF9zZXRfaWZhY2VfZmxhZ3MoZHJ2LT5pb2N0bF9zb2NrLCBkcnYtPmlmYWNlLCAwKTsKIAlhdGhlcm9zX3NldF9wcml2YWN5KGRydiwgMCk7IC8qIGRlZmF1bHQgdG8gbm8gcHJpdmFjeSAqLwogCi0JYXRoZXJvc19yZWNlaXZlX3BrdChkcnYpOworCWlmIChhdGhlcm9zX3JlY2VpdmVfcGt0KGRydikpCisJCWdvdG8gYmFkOwogCiAJaWYgKGF0aGVyb3Nfd2lyZWxlc3NfZXZlbnRfaW5pdChkcnYpKQogCQlnb3RvIGJhZDsKIAogCXJldHVybiBkcnY7CiBiYWQ6CisJYXRoZXJvc19yZXNldF9hcHBmaWx0ZXIoZHJ2KTsKKwlpZiAoZHJ2LT5zb2NrX3JhdykKKwkJbDJfcGFja2V0X2RlaW5pdChkcnYtPnNvY2tfcmF3KTsKIAlpZiAoZHJ2LT5zb2NrX3JlY3YgIT0gTlVMTCAmJiBkcnYtPnNvY2tfcmVjdiAhPSBkcnYtPnNvY2tfeG1pdCkKIAkJbDJfcGFja2V0X2RlaW5pdChkcnYtPnNvY2tfcmVjdik7CiAJaWYgKGRydi0+c29ja194bWl0ICE9IE5VTEwpCkBAIC0xOTYwLDcgKzE5NjMsNyBAQAogfQogCiAKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVgorI2lmZGVmIENPTkZJR19XTk0KIHN0YXRpYyBpbnQgYXRocl93bm1fdGZzKHN0cnVjdCBhdGhlcm9zX2RyaXZlcl9kYXRhICpkcnYsIGNvbnN0IHU4KiBwZWVyLAogCQkJdTggKmllLCB1MTYgKmxlbiwgZW51bSB3bm1fb3BlciBvcGVyKQogewpAQCAtMjExMyw3ICsyMTE2LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIH0KLSNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExViAqLworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KIAogCiBjb25zdCBzdHJ1Y3Qgd3BhX2RyaXZlcl9vcHMgd3BhX2RyaXZlcl9hdGhlcm9zX29wcyA9IHsKQEAgLTIxNDcsNyArMjE1MCw3IEBACiAJLmFkZF9zdGFfbm9kZSAgICAJPSBhdGhlcm9zX2FkZF9zdGFfbm9kZSwKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLwogCS5zZW5kX2FjdGlvbgkJPSBhdGhlcm9zX3NlbmRfYWN0aW9uLAotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCisjaWZkZWYgQ09ORklHX1dOTQogCS53bm1fb3BlcgkJPSBhdGhlcm9zX3dubV9vcGVyLAotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogfTsKZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL2RyaXZlcl9ic2QuYyBiL3NyYy9kcml2ZXJzL2RyaXZlcl9ic2QuYwppbmRleCBhMmIzNGMxLi45ZDg2OWIxIDEwMDY0NAotLS0gYS9zcmMvZHJpdmVycy9kcml2ZXJfYnNkLmMKKysrIGIvc3JjL2RyaXZlcnMvZHJpdmVyX2JzZC5jCkBAIC05NzMsMTMgKzk3Myw2IEBACiB9CiAKIHN0YXRpYyBpbnQKLXdwYV9kcml2ZXJfYnNkX2Rpc2Fzc29jaWF0ZSh2b2lkICpwcml2LCBjb25zdCB1OCAqYWRkciwgaW50IHJlYXNvbl9jb2RlKQotewotCXJldHVybiBic2Rfc2VuZF9tbG1lX3BhcmFtKHByaXYsIElFRUU4MDIxMV9NTE1FX0RJU0FTU09DLCByZWFzb25fY29kZSwKLQkJCQkgICBhZGRyKTsKLX0KLQotc3RhdGljIGludAogd3BhX2RyaXZlcl9ic2Rfc2V0X2F1dGhfYWxnKHZvaWQgKnByaXYsIGludCBhdXRoX2FsZykKIHsKIAlpbnQgYXV0aG1vZGU7CkBAIC0xNTY0LDcgKzE1NTcsNiBAQAogCS5zY2FuMgkJCT0gd3BhX2RyaXZlcl9ic2Rfc2NhbiwKIAkuZ2V0X3NjYW5fcmVzdWx0czIJPSB3cGFfZHJpdmVyX2JzZF9nZXRfc2Nhbl9yZXN1bHRzMiwKIAkuZGVhdXRoZW50aWNhdGUJCT0gd3BhX2RyaXZlcl9ic2RfZGVhdXRoZW50aWNhdGUsCi0JLmRpc2Fzc29jaWF0ZQkJPSB3cGFfZHJpdmVyX2JzZF9kaXNhc3NvY2lhdGUsCiAJLmFzc29jaWF0ZQkJPSB3cGFfZHJpdmVyX2JzZF9hc3NvY2lhdGUsCiAJLmdldF9jYXBhCQk9IHdwYV9kcml2ZXJfYnNkX2dldF9jYXBhLAogI2VuZGlmIC8qIEhPU1RBUEQgKi8KZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL2RyaXZlcl9jb21tb24uYyBiL3NyYy9kcml2ZXJzL2RyaXZlcl9jb21tb24uYwppbmRleCA0MThjZjFhLi41NjVhMDFiIDEwMDY0NAotLS0gYS9zcmMvZHJpdmVycy9kcml2ZXJfY29tbW9uLmMKKysrIGIvc3JjL2RyaXZlcnMvZHJpdmVyX2NvbW1vbi5jCkBAIC03OSw2ICs3OSw3IEBACiAJRTJTKEVBUE9MX1RYX1NUQVRVUyk7CiAJRTJTKENIX1NXSVRDSCk7CiAJRTJTKFdOTSk7CisJRTJTKENPTk5FQ1RfRkFJTEVEX1JFQVNPTik7CiAJfQogCiAJcmV0dXJuICJVTktOT1dOIjsKZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL2RyaXZlcl9uZGlzLmMgYi9zcmMvZHJpdmVycy9kcml2ZXJfbmRpcy5jCmluZGV4IGI5ZTA5NmMuLjdhZjMzMTcgMTAwNjQ0Ci0tLSBhL3NyYy9kcml2ZXJzL2RyaXZlcl9uZGlzLmMKKysrIGIvc3JjL2RyaXZlcnMvZHJpdmVyX25kaXMuYwpAQCAtNzI1LDE0ICs3MjUsNiBAQAogfQogCiAKLXN0YXRpYyBpbnQgd3BhX2RyaXZlcl9uZGlzX2Rpc2Fzc29jaWF0ZSh2b2lkICpwcml2LCBjb25zdCB1OCAqYWRkciwKLQkJCQkJaW50IHJlYXNvbl9jb2RlKQotewotCXN0cnVjdCB3cGFfZHJpdmVyX25kaXNfZGF0YSAqZHJ2ID0gcHJpdjsKLQlyZXR1cm4gd3BhX2RyaXZlcl9uZGlzX2Rpc2Nvbm5lY3QoZHJ2KTsKLX0KLQotCiBzdGF0aWMgdm9pZCB3cGFfZHJpdmVyX25kaXNfc2Nhbl90aW1lb3V0KHZvaWQgKmVsb29wX2N0eCwgdm9pZCAqdGltZW91dF9jdHgpCiB7CiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTY2FuIHRpbWVvdXQgLSB0cnkgdG8gZ2V0IHJlc3VsdHMiKTsKQEAgLTMyMjMsNyArMzIxNSw2IEBACiAJd3BhX2RyaXZlcl9uZGlzX29wcy5pbml0ID0gd3BhX2RyaXZlcl9uZGlzX2luaXQ7CiAJd3BhX2RyaXZlcl9uZGlzX29wcy5kZWluaXQgPSB3cGFfZHJpdmVyX25kaXNfZGVpbml0OwogCXdwYV9kcml2ZXJfbmRpc19vcHMuZGVhdXRoZW50aWNhdGUgPSB3cGFfZHJpdmVyX25kaXNfZGVhdXRoZW50aWNhdGU7Ci0Jd3BhX2RyaXZlcl9uZGlzX29wcy5kaXNhc3NvY2lhdGUgPSB3cGFfZHJpdmVyX25kaXNfZGlzYXNzb2NpYXRlOwogCXdwYV9kcml2ZXJfbmRpc19vcHMuYXNzb2NpYXRlID0gd3BhX2RyaXZlcl9uZGlzX2Fzc29jaWF0ZTsKIAl3cGFfZHJpdmVyX25kaXNfb3BzLmFkZF9wbWtpZCA9IHdwYV9kcml2ZXJfbmRpc19hZGRfcG1raWQ7CiAJd3BhX2RyaXZlcl9uZGlzX29wcy5yZW1vdmVfcG1raWQgPSB3cGFfZHJpdmVyX25kaXNfcmVtb3ZlX3Bta2lkOwpkaWZmIC0tZ2l0IGEvc3JjL2RyaXZlcnMvZHJpdmVyX25sODAyMTEuYyBiL3NyYy9kcml2ZXJzL2RyaXZlcl9ubDgwMjExLmMKaW5kZXggNDU3NDkzOC4uYTEzNDk5MiAxMDA2NDQKLS0tIGEvc3JjL2RyaXZlcnMvZHJpdmVyX25sODAyMTEuYworKysgYi9zcmMvZHJpdmVycy9kcml2ZXJfbmw4MDIxMS5jCkBAIC0xNzgsNyArMTc4LDYgQEAKIH07CiAKIHN0YXRpYyB2b2lkIG5sODAyMTFfZ2xvYmFsX2RlaW5pdCh2b2lkICpwcml2KTsKLXN0YXRpYyB2b2lkIHdwYV9kcml2ZXJfbmw4MDIxMV9kZWluaXQodm9pZCAqcHJpdik7CiAKIHN0cnVjdCBpODAyX2JzcyB7CiAJc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnY7CkBAIC0xOTUsNiArMTk0LDcgQEAKIAogCWludCBmcmVxOwogCisJdm9pZCAqY3R4OwogCXN0cnVjdCBubF9oYW5kbGUgKm5sX3ByZXEsICpubF9tZ210OwogCXN0cnVjdCBubF9jYiAqbmxfY2I7CiAKQEAgLTI0NCw2ICsyNDQsNyBAQAogCXVuc2lnbmVkIGludCBzY2FuX2Zvcl9hdXRoOjE7CiAJdW5zaWduZWQgaW50IHJldHJ5X2F1dGg6MTsKIAl1bnNpZ25lZCBpbnQgdXNlX21vbml0b3I6MTsKKwl1bnNpZ25lZCBpbnQgaWdub3JlX25leHRfbG9jYWxfZGlzY29ubmVjdDoxOwogCiAJdTY0IHJlbWFpbl9vbl9jaGFuX2Nvb2tpZTsKIAl1NjQgc2VuZF9hY3Rpb25fY29va2llOwpAQCAtMjg0LDYgKzI4NSw3IEBACiB9OwogCiAKK3N0YXRpYyB2b2lkIHdwYV9kcml2ZXJfbmw4MDIxMV9kZWluaXQoc3RydWN0IGk4MDJfYnNzICpic3MpOwogc3RhdGljIHZvaWQgd3BhX2RyaXZlcl9ubDgwMjExX3NjYW5fdGltZW91dCh2b2lkICplbG9vcF9jdHgsCiAJCQkJCSAgICB2b2lkICp0aW1lb3V0X2N0eCk7CiBzdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfbW9kZShzdHJ1Y3QgaTgwMl9ic3MgKmJzcywKQEAgLTI5OSw3ICszMDEsOCBAQAogCQkJCSAgdW5zaWduZWQgaW50IGZyZXEsIHVuc2lnbmVkIGludCB3YWl0LAogCQkJCSAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sIHU2NCAqY29va2llLAogCQkJCSAgaW50IG5vX2NjaywgaW50IG5vX2FjaywgaW50IG9mZmNoYW5vayk7Ci1zdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9wcm9iZV9yZXFfcmVwb3J0KHZvaWQgKnByaXYsIGludCByZXBvcnQpOworc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfcHJvYmVfcmVxX3JlcG9ydChzdHJ1Y3QgaTgwMl9ic3MgKmJzcywKKwkJCQkJICAgICAgIGludCByZXBvcnQpOwogI2lmZGVmIEFORFJPSUQKIHN0YXRpYyBpbnQgYW5kcm9pZF9wbm9fc3RhcnQoc3RydWN0IGk4MDJfYnNzICpic3MsCiAJCQkgICAgIHN0cnVjdCB3cGFfZHJpdmVyX3NjYW5fcGFyYW1zICpwYXJhbXMpOwpAQCAtMzE4LDcgKzMyMSw3IEBACiBzdGF0aWMgdm9pZCBhZGRfaWZpZHgoc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsIGludCBpZmlkeCk7CiBzdGF0aWMgdm9pZCBkZWxfaWZpZHgoc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsIGludCBpZmlkeCk7CiBzdGF0aWMgaW50IGhhdmVfaWZpZHgoc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsIGludCBpZmlkeCk7Ci1zdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9pZl9yZW1vdmUodm9pZCAqcHJpdiwKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl9ubDgwMjExX2lmX3JlbW92ZShzdHJ1Y3QgaTgwMl9ic3MgKmJzcywKIAkJCQkJZW51bSB3cGFfZHJpdmVyX2lmX3R5cGUgdHlwZSwKIAkJCQkJY29uc3QgY2hhciAqaWZuYW1lKTsKICNlbHNlIC8qIEhPU1RBUEQgKi8KQEAgLTM0MCw3ICszNDMsOCBAQAogCQkJCQkgc2l6ZV90IGJ1Zl9sZW4pOwogI2VuZGlmCiAKLXN0YXRpYyBpbnQgaTgwMl9zZXRfZnJlcSh2b2lkICpwcml2LCBzdHJ1Y3QgaG9zdGFwZF9mcmVxX3BhcmFtcyAqZnJlcSk7CitzdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfZnJlcShzdHJ1Y3QgaTgwMl9ic3MgKmJzcywKKwkJCQkgICAgICAgc3RydWN0IGhvc3RhcGRfZnJlcV9wYXJhbXMgKmZyZXEpOwogc3RhdGljIGludCBubDgwMjExX2Rpc2FibGVfMTFiX3JhdGVzKHN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LAogCQkJCSAgICAgaW50IGlmaW5kZXgsIGludCBkaXNhYmxlZCk7CiAKQEAgLTEwMzgsNiArMTA0Miw3IEBACiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCXVuaW9uIHdwYV9ldmVudF9kYXRhIGV2ZW50OwogCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBBdXRoZW50aWNhdGUgZXZlbnQiKTsKIAltZ210ID0gKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBmcmFtZTsKIAlpZiAobGVuIDwgMjQgKyBzaXplb2YobWdtdC0+dS5hdXRoKSkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFRvbyBzaG9ydCBhc3NvY2lhdGlvbiBldmVudCAiCkBAIC0xMDQ5LDYgKzEwNTQsOCBAQAogCW9zX21lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOwogCW9zX21lbWNweShldmVudC5hdXRoLnBlZXIsIG1nbXQtPnNhLCBFVEhfQUxFTik7CiAJZXZlbnQuYXV0aC5hdXRoX3R5cGUgPSBsZV90b19ob3N0MTYobWdtdC0+dS5hdXRoLmF1dGhfYWxnKTsKKwlldmVudC5hdXRoLmF1dGhfdHJhbnNhY3Rpb24gPQorCQlsZV90b19ob3N0MTYobWdtdC0+dS5hdXRoLmF1dGhfdHJhbnNhY3Rpb24pOwogCWV2ZW50LmF1dGguc3RhdHVzX2NvZGUgPSBsZV90b19ob3N0MTYobWdtdC0+dS5hdXRoLnN0YXR1c19jb2RlKTsKIAlpZiAobGVuID4gMjQgKyBzaXplb2YobWdtdC0+dS5hdXRoKSkgewogCQlldmVudC5hdXRoLmllcyA9IG1nbXQtPnUuYXV0aC52YXJpYWJsZTsKQEAgLTEwOTcsNiArMTEwNCw3IEBACiAJdW5pb24gd3BhX2V2ZW50X2RhdGEgZXZlbnQ7CiAJdTE2IHN0YXR1czsKIAorCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogQXNzb2NpYXRlIGV2ZW50Iik7CiAJbWdtdCA9IChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgZnJhbWU7CiAJaWYgKGxlbiA8IDI0ICsgc2l6ZW9mKG1nbXQtPnUuYXNzb2NfcmVzcCkpIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBUb28gc2hvcnQgYXNzb2NpYXRpb24gZXZlbnQgIgpAQCAtMTE1Myw2ICsxMTYxLDExIEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAoY21kID09IE5MODAyMTFfQ01EX0NPTk5FQ1QpCisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogQ29ubmVjdCBldmVudCIpOworCWVsc2UgaWYgKGNtZCA9PSBOTDgwMjExX0NNRF9ST0FNKQorCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFJvYW0gZXZlbnQiKTsKKwogCW9zX21lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOwogCWlmIChjbWQgPT0gTkw4MDIxMV9DTURfQ09OTkVDVCAmJgogCSAgICBubGFfZ2V0X3UxNihzdGF0dXMpICE9IFdMQU5fU1RBVFVTX1NVQ0NFU1MpIHsKQEAgLTExOTEsNiArMTIwNCw3IEBACiAJCQkJICBzdHJ1Y3QgbmxhdHRyICpieV9hcCkKIHsKIAl1bmlvbiB3cGFfZXZlbnRfZGF0YSBkYXRhOworCXVuc2lnbmVkIGludCBsb2NhbGx5X2dlbmVyYXRlZCA9IGJ5X2FwID09IE5VTEw7CiAKIAlpZiAoZHJ2LT5jYXBhLmZsYWdzICYgV1BBX0RSSVZFUl9GTEFHU19TTUUpIHsKIAkJLyoKQEAgLTEyMDIsNiArMTIxNiwxOSBAQAogCQlyZXR1cm47CiAJfQogCisJaWYgKGRydi0+aWdub3JlX25leHRfbG9jYWxfZGlzY29ubmVjdCkgeworCQlkcnYtPmlnbm9yZV9uZXh0X2xvY2FsX2Rpc2Nvbm5lY3QgPSAwOworCQlpZiAobG9jYWxseV9nZW5lcmF0ZWQpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogSWdub3JlIGRpc2Nvbm5lY3QgIgorCQkJCSAgICJldmVudCB0cmlnZ2VyZWQgZHVyaW5nIHJlYXNzb2NpYXRpb24iKTsKKwkJCXJldHVybjsKKwkJfQorCQl3cGFfcHJpbnRmKE1TR19XQVJOSU5HLCAibmw4MDIxMTogV2FzIGV4cGVjdGluZyBsb2NhbCAiCisJCQkgICAiZGlzY29ubmVjdCBidXQgZ290IGFub3RoZXIgZGlzY29ubmVjdCAiCisJCQkgICAiZXZlbnQgZmlyc3QiKTsKKwl9CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IERpc2Nvbm5lY3QgZXZlbnQiKTsKIAlkcnYtPmFzc29jaWF0ZWQgPSAwOwogCW9zX21lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKIAlpZiAocmVhc29uKQpAQCAtMTI3OSw2ICsxMzA2LDcgQEAKIAl1MTYgZmMsIHN0eXBlOwogCWludCBzc2lfc2lnbmFsID0gMDsKIAorCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogRnJhbWUgZXZlbnQiKTsKIAltZ210ID0gKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBmcmFtZTsKIAlpZiAobGVuIDwgMjQpIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBUb28gc2hvcnQgYWN0aW9uIGZyYW1lIik7CkBAIC0xMzIxLDYgKzEzNDksNyBAQAogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJdTE2IGZjOwogCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBGcmFtZSBUWCBzdGF0dXMgZXZlbnQiKTsKIAlpZiAoIWlzX2FwX2ludGVyZmFjZShkcnYtPm5sbW9kZSkpIHsKIAkJdTY0IGNvb2tpZV92YWw7CiAKQEAgLTEzNjAsNiArMTM4OSwxMSBAQAogCWNvbnN0IHU4ICpic3NpZCA9IE5VTEw7CiAJdTE2IHJlYXNvbl9jb2RlID0gMDsKIAorCWlmICh0eXBlID09IEVWRU5UX0RFQVVUSCkKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBEZWF1dGhlbnRpY2F0ZSBldmVudCIpOworCWVsc2UKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBEaXNhc3NvY2lhdGUgZXZlbnQiKTsKKwogCW1nbXQgPSAoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICopIGZyYW1lOwogCWlmIChsZW4gPj0gMjQpIHsKIAkJYnNzaWQgPSBtZ210LT5ic3NpZDsKQEAgLTE0MjAsNiArMTQ1NCwxMSBAQAogCXVuaW9uIHdwYV9ldmVudF9kYXRhIGV2ZW50OwogCXUxNiByZWFzb25fY29kZSA9IDA7CiAKKwlpZiAodHlwZSA9PSBFVkVOVF9VTlBST1RfREVBVVRIKQorCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFVucHJvdCBEZWF1dGhlbnRpY2F0ZSBldmVudCIpOworCWVsc2UKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBVbnByb3QgRGlzYXNzb2NpYXRlIGV2ZW50Iik7CisKIAlpZiAobGVuIDwgMjQpCiAJCXJldHVybjsKIApAQCAtMTUwMiw3ICsxNTQxLDcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBtbG1lX2V2ZW50X21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsCitzdGF0aWMgdm9pZCBtbG1lX2V2ZW50X21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IGk4MDJfYnNzICpic3MsCiAJCQkJCSAgIHN0cnVjdCBubGF0dHIgKnRiW10pCiB7CiAJdW5pb24gd3BhX2V2ZW50X2RhdGEgZGF0YTsKQEAgLTE1MzQsNyArMTU3Myw3IEBACiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogS2V5IElkICVkIiwga2V5X2lkKTsKIAl9CiAKLQl3cGFfc3VwcGxpY2FudF9ldmVudChkcnYtPmN0eCwgRVZFTlRfTUlDSEFFTF9NSUNfRkFJTFVSRSwgJmRhdGEpOworCXdwYV9zdXBwbGljYW50X2V2ZW50KGJzcy0+Y3R4LCBFVkVOVF9NSUNIQUVMX01JQ19GQUlMVVJFLCAmZGF0YSk7CiB9CiAKIApAQCAtMjA0Niw2ICsyMDg1LDggQEAKIAl9OwogCXVuaW9uIHdwYV9ldmVudF9kYXRhIGRhdGE7CiAKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFBNS1NBIGNhbmRpZGF0ZSBldmVudCIpOworCiAJaWYgKCF0YltOTDgwMjExX0FUVFJfUE1LU0FfQ0FORElEQVRFXSkKIAkJcmV0dXJuOwogCWlmIChubGFfcGFyc2VfbmVzdGVkKGNhbmQsIE1BWF9OTDgwMjExX1BNS1NBX0NBTkRJREFURSwKQEAgLTIwNzEsNiArMjExMiw4IEBACiB7CiAJdW5pb24gd3BhX2V2ZW50X2RhdGEgZGF0YTsKIAorCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogUHJvYmUgY2xpZW50IGV2ZW50Iik7CisKIAlpZiAoIXRiW05MODAyMTFfQVRUUl9NQUNdIHx8ICF0YltOTDgwMjExX0FUVFJfQUNLXSkKIAkJcmV0dXJuOwogCkBAIC0yMDgyLDYgKzIxMjUsODAgQEAKIH0KIAogCitzdGF0aWMgdm9pZCBubDgwMjExX3RkbHNfb3Blcl9ldmVudChzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiwKKwkJCQkgICAgc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXVuaW9uIHdwYV9ldmVudF9kYXRhIGRhdGE7CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFRETFMgb3BlcmF0aW9uIGV2ZW50Iik7CisKKwlpZiAoIXRiW05MODAyMTFfQVRUUl9NQUNdIHx8ICF0YltOTDgwMjExX0FUVFJfVERMU19PUEVSQVRJT05dKQorCQlyZXR1cm47CisKKwlvc19tZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJb3NfbWVtY3B5KGRhdGEudGRscy5wZWVyLCBubGFfZGF0YSh0YltOTDgwMjExX0FUVFJfTUFDXSksIEVUSF9BTEVOKTsKKwlzd2l0Y2ggKG5sYV9nZXRfdTgodGJbTkw4MDIxMV9BVFRSX1RETFNfT1BFUkFUSU9OXSkpIHsKKwljYXNlIE5MODAyMTFfVERMU19TRVRVUDoKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBURExTIHNldHVwIHJlcXVlc3QgZm9yIHBlZXIgIgorCQkJICAgTUFDU1RSLCBNQUMyU1RSKGRhdGEudGRscy5wZWVyKSk7CisJCWRhdGEudGRscy5vcGVyID0gVERMU19SRVFVRVNUX1NFVFVQOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfVERMU19URUFSRE9XTjoKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBURExTIHRlYXJkb3duIHJlcXVlc3QgZm9yIHBlZXIgIgorCQkJICAgTUFDU1RSLCBNQUMyU1RSKGRhdGEudGRscy5wZWVyKSk7CisJCWRhdGEudGRscy5vcGVyID0gVERMU19SRVFVRVNUX1RFQVJET1dOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFVuc3VwcG9ydGVkIFRETFMgb3BlcmF0aW9uZSAiCisJCQkgICAiZXZlbnQiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodGJbTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFXSkgeworCQlkYXRhLnRkbHMucmVhc29uX2NvZGUgPQorCQkJbmxhX2dldF91MTYodGJbTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFXSk7CisJfQorCisJd3BhX3N1cHBsaWNhbnRfZXZlbnQoZHJ2LT5jdHgsIEVWRU5UX1RETFMsICZkYXRhKTsKK30KKworCitzdGF0aWMgdm9pZCBubDgwMjExX2Nvbm5lY3RfZmFpbGVkX2V2ZW50KHN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LAorCQkJCQkgc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXVuaW9uIHdwYV9ldmVudF9kYXRhIGRhdGE7CisJdTMyIHJlYXNvbjsKKworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogQ29ubmVjdCBmYWlsZWQgZXZlbnQiKTsKKworCWlmICghdGJbTkw4MDIxMV9BVFRSX01BQ10gfHwgIXRiW05MODAyMTFfQVRUUl9DT05OX0ZBSUxFRF9SRUFTT05dKQorCQlyZXR1cm47CisKKwlvc19tZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJb3NfbWVtY3B5KGRhdGEuY29ubmVjdF9mYWlsZWRfcmVhc29uLmFkZHIsCisJCSAgbmxhX2RhdGEodGJbTkw4MDIxMV9BVFRSX01BQ10pLCBFVEhfQUxFTik7CisKKwlyZWFzb24gPSBubGFfZ2V0X3UzMih0YltOTDgwMjExX0FUVFJfQ09OTl9GQUlMRURfUkVBU09OXSk7CisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIE5MODAyMTFfQ09OTl9GQUlMX01BWF9DTElFTlRTOgorCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IE1heCBjbGllbnQgcmVhY2hlZCIpOworCQlkYXRhLmNvbm5lY3RfZmFpbGVkX3JlYXNvbi5jb2RlID0gTUFYX0NMSUVOVF9SRUFDSEVEOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ09OTl9GQUlMX0JMT0NLRURfQ0xJRU5UOgorCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IEJsb2NrZWQgY2xpZW50ICIgTUFDU1RSCisJCQkgICAiIHRyaWVkIHRvIGNvbm5lY3QiLAorCQkJICAgTUFDMlNUUihkYXRhLmNvbm5lY3RfZmFpbGVkX3JlYXNvbi5hZGRyKSk7CisJCWRhdGEuY29ubmVjdF9mYWlsZWRfcmVhc29uLmNvZGUgPSBCTE9DS0VEX0NMSUVOVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjFsOiBVbmtub3duIGNvbm5lY3QgZmFpbGVkIHJlYXNvbiAiCisJCQkgICAiJXUiLCByZWFzb24pOworCQlyZXR1cm47CisJfQorCisJd3BhX3N1cHBsaWNhbnRfZXZlbnQoZHJ2LT5jdHgsIEVWRU5UX0NPTk5FQ1RfRkFJTEVEX1JFQVNPTiwgJmRhdGEpOworfQorCisKIHN0YXRpYyB2b2lkIG5sODAyMTFfc3B1cmlvdXNfZnJhbWUoc3RydWN0IGk4MDJfYnNzICpic3MsIHN0cnVjdCBubGF0dHIgKip0YiwKIAkJCQkgICBpbnQgd2RzKQogewpAQCAtMjEwMCw5ICsyMjE3LDExIEBACiB9CiAKIAotc3RhdGljIHZvaWQgZG9fcHJvY2Vzc19kcnZfZXZlbnQoc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsCi0JCQkJIGludCBjbWQsIHN0cnVjdCBubGF0dHIgKip0YikKK3N0YXRpYyB2b2lkIGRvX3Byb2Nlc3NfZHJ2X2V2ZW50KHN0cnVjdCBpODAyX2JzcyAqYnNzLCBpbnQgY21kLAorCQkJCSBzdHJ1Y3QgbmxhdHRyICoqdGIpCiB7CisJc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYgPSBic3MtPmRydjsKKwogCWlmIChkcnYtPmFwX3NjYW5fYXNfc3RhdGlvbiAhPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRCAmJgogCSAgICAoY21kID09IE5MODAyMTFfQ01EX05FV19TQ0FOX1JFU1VMVFMgfHwKIAkgICAgIGNtZCA9PSBOTDgwMjExX0NNRF9TQ0FOX0FCT1JURUQpKSB7CkBAIC0yMTc1LDcgKzIyOTQsNyBAQAogCQkJCSAgICAgIHRiW05MODAyMTFfQVRUUl9ESVNDT05ORUNURURfQllfQVBdKTsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0NNRF9NSUNIQUVMX01JQ19GQUlMVVJFOgotCQltbG1lX2V2ZW50X21pY2hhZWxfbWljX2ZhaWx1cmUoZHJ2LCB0Yik7CisJCW1sbWVfZXZlbnRfbWljaGFlbF9taWNfZmFpbHVyZShic3MsIHRiKTsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0NNRF9KT0lOX0lCU1M6CiAJCW1sbWVfZXZlbnRfam9pbl9pYnNzKGRydiwgdGIpOwpAQCAtMjIxNCw2ICsyMzMzLDEyIEBACiAJY2FzZSBOTDgwMjExX0NNRF9QUk9CRV9DTElFTlQ6CiAJCW5sODAyMTFfY2xpZW50X3Byb2JlX2V2ZW50KGRydiwgdGIpOwogCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ01EX1RETFNfT1BFUjoKKwkJbmw4MDIxMV90ZGxzX29wZXJfZXZlbnQoZHJ2LCB0Yik7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9DTURfQ09OTl9GQUlMRUQ6CisJCW5sODAyMTFfY29ubmVjdF9mYWlsZWRfZXZlbnQoZHJ2LCB0Yik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogSWdub3JlZCB1bmtub3duIGV2ZW50ICIKIAkJCSAgICIoY21kPSVkKSIsIGNtZCk7CkBAIC0yMjI3LDIxICsyMzUyLDI1IEBACiAJc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYgPSBhcmc7CiAJc3RydWN0IGdlbmxtc2doZHIgKmdubGggPSBubG1zZ19kYXRhKG5sbXNnX2hkcihtc2cpKTsKIAlzdHJ1Y3QgbmxhdHRyICp0YltOTDgwMjExX0FUVFJfTUFYICsgMV07CisJc3RydWN0IGk4MDJfYnNzICpic3M7CisJaW50IGlmaWR4ID0gLTE7CiAKIAlubGFfcGFyc2UodGIsIE5MODAyMTFfQVRUUl9NQVgsIGdlbmxtc2dfYXR0cmRhdGEoZ25saCwgMCksCiAJCSAgZ2VubG1zZ19hdHRybGVuKGdubGgsIDApLCBOVUxMKTsKIAotCWlmICh0YltOTDgwMjExX0FUVFJfSUZJTkRFWF0pIHsKLQkJaW50IGlmaW5kZXggPSBubGFfZ2V0X3UzMih0YltOTDgwMjExX0FUVFJfSUZJTkRFWF0pOwotCQlpZiAoaWZpbmRleCAhPSBkcnYtPmlmaW5kZXggJiYgIWhhdmVfaWZpZHgoZHJ2LCBpZmluZGV4KSkgewotCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBJZ25vcmVkIGV2ZW50IChjbWQ9JWQpIgotCQkJCSAgICIgZm9yIGZvcmVpZ24gaW50ZXJmYWNlIChpZmluZGV4ICVkKSIsCi0JCQkJICAgZ25saC0+Y21kLCBpZmluZGV4KTsKKwlpZiAodGJbTkw4MDIxMV9BVFRSX0lGSU5ERVhdKQorCQlpZmlkeCA9IG5sYV9nZXRfdTMyKHRiW05MODAyMTFfQVRUUl9JRklOREVYXSk7CisKKwlmb3IgKGJzcyA9ICZkcnYtPmZpcnN0X2JzczsgYnNzOyBic3MgPSBic3MtPm5leHQpIHsKKwkJaWYgKGlmaWR4ID09IC0xIHx8IGlmaWR4ID09IGJzcy0+aWZpbmRleCkgeworCQkJZG9fcHJvY2Vzc19kcnZfZXZlbnQoYnNzLCBnbmxoLT5jbWQsIHRiKTsKIAkJCXJldHVybiBOTF9TS0lQOwogCQl9CiAJfQogCi0JZG9fcHJvY2Vzc19kcnZfZXZlbnQoZHJ2LCBnbmxoLT5jbWQsIHRiKTsKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IElnbm9yZWQgZXZlbnQgKGNtZD0lZCkgZm9yIGZvcmVpZ24gIgorCQkgICAiaW50ZXJmYWNlIChpZmluZGV4ICVkKSIsIGdubGgtPmNtZCwgaWZpZHgpOworCiAJcmV0dXJuIE5MX1NLSVA7CiB9CiAKQEAgLTIyNTMsNiArMjM4Miw3IEBACiAJc3RydWN0IG5sYXR0ciAqdGJbTkw4MDIxMV9BVFRSX01BWCArIDFdOwogCXN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LCAqdG1wOwogCWludCBpZmlkeCA9IC0xOworCXN0cnVjdCBpODAyX2JzcyAqYnNzOwogCiAJbmxhX3BhcnNlKHRiLCBOTDgwMjExX0FUVFJfTUFYLCBnZW5sbXNnX2F0dHJkYXRhKGdubGgsIDApLAogCQkgIGdlbmxtc2dfYXR0cmxlbihnbmxoLCAwKSwgTlVMTCk7CkBAIC0yMjYyLDkgKzIzOTIsMTIgQEAKIAogCWRsX2xpc3RfZm9yX2VhY2hfc2FmZShkcnYsIHRtcCwgJmdsb2JhbC0+aW50ZXJmYWNlcywKIAkJCSAgICAgIHN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSwgbGlzdCkgewotCQlpZiAoaWZpZHggPT0gLTEgfHwgaWZpZHggPT0gZHJ2LT5pZmluZGV4IHx8Ci0JCSAgICBoYXZlX2lmaWR4KGRydiwgaWZpZHgpKQotCQkJZG9fcHJvY2Vzc19kcnZfZXZlbnQoZHJ2LCBnbmxoLT5jbWQsIHRiKTsKKwkJZm9yIChic3MgPSAmZHJ2LT5maXJzdF9ic3M7IGJzczsgYnNzID0gYnNzLT5uZXh0KSB7CisJCQlpZiAoaWZpZHggPT0gLTEgfHwgaWZpZHggPT0gYnNzLT5pZmluZGV4KSB7CisJCQkJZG9fcHJvY2Vzc19kcnZfZXZlbnQoYnNzLCBnbmxoLT5jbWQsIHRiKTsKKwkJCQlyZXR1cm4gTkxfU0tJUDsKKwkJCX0KKwkJfQogCX0KIAogCXJldHVybiBOTF9TS0lQOwpAQCAtMjU4Nyw2ICsyNzIwLDEyIEBACiAKIAkJaWYgKGZsYWdzICYgTkw4MDIxMV9GRUFUVVJFX0lOQUNUSVZJVFlfVElNRVIpCiAJCQljYXBhLT5mbGFncyB8PSBXUEFfRFJJVkVSX0ZMQUdTX0lOQUNUSVZJVFlfVElNRVI7CisKKwkJaWYgKGZsYWdzICYgTkw4MDIxMV9GRUFUVVJFX1NBRSkKKwkJCWNhcGEtPmZsYWdzIHw9IFdQQV9EUklWRVJfRkxBR1NfU0FFOworCisJCWlmIChmbGFncyAmIE5MODAyMTFfRkVBVFVSRV9ORUVEX09CU1NfU0NBTikKKwkJCWNhcGEtPmZsYWdzIHw9IFdQQV9EUklWRVJfRkxBR1NfT0JTU19TQ0FOOwogCX0KIAogCWlmICh0YltOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF9PRkZMT0FEXSkgewpAQCAtMzAwMSw2ICszMTQwLDggQEAKIAlkcnYtPmN0eCA9IGN0eDsKIAlic3MgPSAmZHJ2LT5maXJzdF9ic3M7CiAJYnNzLT5kcnYgPSBkcnY7CisJYnNzLT5jdHggPSBjdHg7CisKIAlvc19zdHJsY3B5KGJzcy0+aWZuYW1lLCBpZm5hbWUsIHNpemVvZihic3MtPmlmbmFtZSkpOwogCWRydi0+bW9uaXRvcl9pZmlkeCA9IC0xOwogCWRydi0+bW9uaXRvcl9zb2NrID0gLTE7CkBAIC0zMTk4LDYgKzMzMzksOSBAQAogCS8qIFdOTSAtIEJTUyBUcmFuc2l0aW9uIE1hbmFnZW1lbnQgUmVxdWVzdCAqLwogCWlmIChubDgwMjExX3JlZ2lzdGVyX2FjdGlvbl9mcmFtZShic3MsICh1OCAqKSAiXHgwYVx4MDciLCAyKSA8IDApCiAJCXJldHVybiAtMTsKKwkvKiBXTk0tU2xlZXAgTW9kZSBSZXNwb25zZSAqLworCWlmIChubDgwMjExX3JlZ2lzdGVyX2FjdGlvbl9mcmFtZShic3MsICh1OCAqKSAiXHgwYVx4MTEiLCAyKSA8IDApCisJCXJldHVybiAtMTsKIAogCXJldHVybiAwOwogfQpAQCAtMzM5NywxNCArMzU0MSwxMyBAQAogCiAvKioKICAqIHdwYV9kcml2ZXJfbmw4MDIxMV9kZWluaXQgLSBEZWluaXRpYWxpemUgbmw4MDIxMSBkcml2ZXIgaW50ZXJmYWNlCi0gKiBAcHJpdjogUG9pbnRlciB0byBwcml2YXRlIG5sODAyMTEgZGF0YSBmcm9tIHdwYV9kcml2ZXJfbmw4MDIxMV9pbml0KCkKKyAqIEBic3M6IFBvaW50ZXIgdG8gcHJpdmF0ZSBubDgwMjExIGRhdGEgZnJvbSB3cGFfZHJpdmVyX25sODAyMTFfaW5pdCgpCiAgKgogICogU2h1dCBkb3duIGRyaXZlciBpbnRlcmZhY2UgYW5kIHByb2Nlc3Npbmcgb2YgZHJpdmVyIGV2ZW50cy4gRnJlZQogICogcHJpdmF0ZSBkYXRhIGJ1ZmZlciBpZiBvbmUgd2FzIGFsbG9jYXRlZCBpbiB3cGFfZHJpdmVyX25sODAyMTFfaW5pdCgpLgogICovCi1zdGF0aWMgdm9pZCB3cGFfZHJpdmVyX25sODAyMTFfZGVpbml0KHZvaWQgKnByaXYpCitzdGF0aWMgdm9pZCB3cGFfZHJpdmVyX25sODAyMTFfZGVpbml0KHN0cnVjdCBpODAyX2JzcyAqYnNzKQogewotCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwogCiAJYnNzLT5pbl9kZWluaXQgPSAxOwpAQCAtMzQ0MCw3ICszNTgzLDcgQEAKIAkJc3RydWN0IGhvc3RhcGRfZnJlcV9wYXJhbXMgZnJlcTsKIAkJb3NfbWVtc2V0KCZmcmVxLCAwLCBzaXplb2YoZnJlcSkpOwogCQlmcmVxLmZyZXEgPSBkcnYtPmxhc3RfZnJlcTsKLQkJaTgwMl9zZXRfZnJlcShwcml2LCAmZnJlcSk7CisJCXdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfZnJlcShic3MsICZmcmVxKTsKIAl9CiAKIAlpZiAoZHJ2LT5lYXBvbF9zb2NrID49IDApIHsKQEAgLTM1ODAsMTQgKzM3MjMsMTMgQEAKIAogLyoqCiAgKiB3cGFfZHJpdmVyX25sODAyMTFfc2NhbiAtIFJlcXVlc3QgdGhlIGRyaXZlciB0byBpbml0aWF0ZSBzY2FuCi0gKiBAcHJpdjogUG9pbnRlciB0byBwcml2YXRlIGRyaXZlciBkYXRhIGZyb20gd3BhX2RyaXZlcl9ubDgwMjExX2luaXQoKQorICogQGJzczogUG9pbnRlciB0byBwcml2YXRlIGRyaXZlciBkYXRhIGZyb20gd3BhX2RyaXZlcl9ubDgwMjExX2luaXQoKQogICogQHBhcmFtczogU2NhbiBwYXJhbWV0ZXJzCiAgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKICAqLwotc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfc2Nhbih2b2lkICpwcml2LAorc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfc2NhbihzdHJ1Y3QgaTgwMl9ic3MgKmJzcywKIAkJCQkgICBzdHJ1Y3Qgd3BhX2RyaXZlcl9zY2FuX3BhcmFtcyAqcGFyYW1zKQogewotCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwogCWludCByZXQgPSAtMSwgdGltZW91dDsKIAlzdHJ1Y3QgbmxfbXNnICptc2csICpyYXRlcyA9IE5VTEw7CkBAIC0zNjM1LDcgKzM3NzcsNyBAQAogCQkJCSAgICBic3MsIE5MODAyMTFfSUZUWVBFX1NUQVRJT04pKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JCQlpZiAod3BhX2RyaXZlcl9ubDgwMjExX3NjYW4oZHJ2LCBwYXJhbXMpKSB7CisJCQlpZiAod3BhX2RyaXZlcl9ubDgwMjExX3NjYW4oYnNzLCBwYXJhbXMpKSB7CiAJCQkJd3BhX2RyaXZlcl9ubDgwMjExX3NldF9tb2RlKGJzcywgZHJ2LT5ubG1vZGUpOwogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQkJfQpAQCAtNDE3MiwxMyArNDMxNCwxMiBAQAogfQogCiAKLXN0YXRpYyBpbnQgd3BhX2RyaXZlcl9ubDgwMjExX3NldF9rZXkoY29uc3QgY2hhciAqaWZuYW1lLCB2b2lkICpwcml2LAorc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfc2V0X2tleShjb25zdCBjaGFyICppZm5hbWUsIHN0cnVjdCBpODAyX2JzcyAqYnNzLAogCQkJCSAgICAgIGVudW0gd3BhX2FsZyBhbGcsIGNvbnN0IHU4ICphZGRyLAogCQkJCSAgICAgIGludCBrZXlfaWR4LCBpbnQgc2V0X3R4LAogCQkJCSAgICAgIGNvbnN0IHU4ICpzZXEsIHNpemVfdCBzZXFfbGVuLAogCQkJCSAgICAgIGNvbnN0IHU4ICprZXksIHNpemVfdCBrZXlfbGVuKQogewotCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwogCWludCBpZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoaWZuYW1lKTsKIAlzdHJ1Y3QgbmxfbXNnICptc2c7CkBAIC00MjI3LDYgKzQzNjgsMTQgQEAKIAkJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0tFWV9DSVBIRVIsCiAJCQkJICAgIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDKTsKIAkJCWJyZWFrOworCQljYXNlIFdQQV9BTEdfU01TNDoKKwkJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0tFWV9DSVBIRVIsCisJCQkJICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1NNUzQpOworCQkJYnJlYWs7CisJCWNhc2UgV1BBX0FMR19LUks6CisJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9LRVlfQ0lQSEVSLAorCQkJCSAgICBXTEFOX0NJUEhFUl9TVUlURV9LUkspOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIiVzOiBVbnN1cHBvcnRlZCBlbmNyeXB0aW9uICIKIAkJCQkgICAiYWxnb3JpdGhtICVkIiwgX19mdW5jX18sIGFsZyk7CkBAIC00NDY0LDcgKzQ2MTMsOCBAQAogCiAJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgZHJ2LT5pZmluZGV4KTsKIAlOTEFfUFVUX1UxNihtc2csIE5MODAyMTFfQVRUUl9SRUFTT05fQ09ERSwgcmVhc29uX2NvZGUpOwotCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfTUFDLCBFVEhfQUxFTiwgYWRkcik7CisJaWYgKGFkZHIpCisJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfTUFDLCBFVEhfQUxFTiwgYWRkcik7CiAJaWYgKGxvY2FsX3N0YXRlX2NoYW5nZSkKIAkJTkxBX1BVVF9GTEFHKG1zZywgTkw4MDIxMV9BVFRSX0xPQ0FMX1NUQVRFX0NIQU5HRSk7CiAKQEAgLTQ0ODUsMjMgKzQ2MzUsMjMgQEAKIAogCiBzdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9kaXNjb25uZWN0KHN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LAotCQkJCQkgY29uc3QgdTggKmFkZHIsIGludCByZWFzb25fY29kZSkKKwkJCQkJIGludCByZWFzb25fY29kZSkKIHsKLQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIiVzKGFkZHI9IiBNQUNTVFIgIiByZWFzb25fY29kZT0lZCkiLAotCQkgICBfX2Z1bmNfXywgTUFDMlNUUihhZGRyKSwgcmVhc29uX2NvZGUpOworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXMocmVhc29uX2NvZGU9JWQpIiwgX19mdW5jX18sIHJlYXNvbl9jb2RlKTsKIAlkcnYtPmFzc29jaWF0ZWQgPSAwOwotCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfbWxtZShkcnYsIGFkZHIsIE5MODAyMTFfQ01EX0RJU0NPTk5FQ1QsCisJZHJ2LT5pZ25vcmVfbmV4dF9sb2NhbF9kaXNjb25uZWN0ID0gMDsKKwkvKiBEaXNjb25uZWN0IGNvbW1hbmQgZG9lc24ndCBuZWVkIEJTU0lEIC0gaXQgdXNlcyBjYWNoZWQgdmFsdWUgKi8KKwlyZXR1cm4gd3BhX2RyaXZlcl9ubDgwMjExX21sbWUoZHJ2LCBOVUxMLCBOTDgwMjExX0NNRF9ESVNDT05ORUNULAogCQkJCSAgICAgICByZWFzb25fY29kZSwgMCk7CiB9CiAKIAotc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfZGVhdXRoZW50aWNhdGUodm9pZCAqcHJpdiwgY29uc3QgdTggKmFkZHIsCi0JCQkJCSAgICAgaW50IHJlYXNvbl9jb2RlKQorc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfZGVhdXRoZW50aWNhdGUoc3RydWN0IGk4MDJfYnNzICpic3MsCisJCQkJCSAgICAgY29uc3QgdTggKmFkZHIsIGludCByZWFzb25fY29kZSkKIHsKLQlzdHJ1Y3QgaTgwMl9ic3MgKmJzcyA9IHByaXY7CiAJc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYgPSBic3MtPmRydjsKIAlpZiAoIShkcnYtPmNhcGEuZmxhZ3MgJiBXUEFfRFJJVkVSX0ZMQUdTX1NNRSkpCi0JCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfZGlzY29ubmVjdChkcnYsIGFkZHIsIHJlYXNvbl9jb2RlKTsKKwkJcmV0dXJuIHdwYV9kcml2ZXJfbmw4MDIxMV9kaXNjb25uZWN0KGRydiwgcmVhc29uX2NvZGUpOwogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXMoYWRkcj0iIE1BQ1NUUiAiIHJlYXNvbl9jb2RlPSVkKSIsCiAJCSAgIF9fZnVuY19fLCBNQUMyU1RSKGFkZHIpLCByZWFzb25fY29kZSk7CiAJZHJ2LT5hc3NvY2lhdGVkID0gMDsKQEAgLTQ1MTIsMjAgKzQ2NjIsNiBAQAogfQogCiAKLXN0YXRpYyBpbnQgd3BhX2RyaXZlcl9ubDgwMjExX2Rpc2Fzc29jaWF0ZSh2b2lkICpwcml2LCBjb25zdCB1OCAqYWRkciwKLQkJCQkJICAgaW50IHJlYXNvbl9jb2RlKQotewotCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKLQlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwotCWlmICghKGRydi0+Y2FwYS5mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfU01FKSkKLQkJcmV0dXJuIHdwYV9kcml2ZXJfbmw4MDIxMV9kaXNjb25uZWN0KGRydiwgYWRkciwgcmVhc29uX2NvZGUpOwotCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXMiLCBfX2Z1bmNfXyk7Ci0JZHJ2LT5hc3NvY2lhdGVkID0gMDsKLQlyZXR1cm4gd3BhX2RyaXZlcl9ubDgwMjExX21sbWUoZHJ2LCBhZGRyLCBOTDgwMjExX0NNRF9ESVNBU1NPQ0lBVEUsCi0JCQkJICAgICAgIHJlYXNvbl9jb2RlLCAwKTsKLX0KLQotCiBzdGF0aWMgdm9pZCBubDgwMjExX2NvcHlfYXV0aF9wYXJhbXMoc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsCiAJCQkJICAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl9hdXRoX3BhcmFtcyAqcGFyYW1zKQogewpAQCAtNDU3Myw5ICs0NzA5LDggQEAKIAogCiBzdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9hdXRoZW50aWNhdGUoCi0Jdm9pZCAqcHJpdiwgc3RydWN0IHdwYV9kcml2ZXJfYXV0aF9wYXJhbXMgKnBhcmFtcykKKwlzdHJ1Y3QgaTgwMl9ic3MgKmJzcywgc3RydWN0IHdwYV9kcml2ZXJfYXV0aF9wYXJhbXMgKnBhcmFtcykKIHsKLQlzdHJ1Y3QgaTgwMl9ic3MgKmJzcyA9IHByaXY7CiAJc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYgPSBic3MtPmRydjsKIAlpbnQgcmV0ID0gLTEsIGk7CiAJc3RydWN0IG5sX21zZyAqbXNnOwpAQCAtNDU5Myw3ICs0NzI4LDcgQEAKIAlubG1vZGUgPSBwYXJhbXMtPnAycCA/CiAJCU5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQgOiBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwogCWlmIChkcnYtPm5sbW9kZSAhPSBubG1vZGUgJiYKLQkgICAgd3BhX2RyaXZlcl9ubDgwMjExX3NldF9tb2RlKHByaXYsIG5sbW9kZSkgPCAwKQorCSAgICB3cGFfZHJpdmVyX25sODAyMTFfc2V0X21vZGUoYnNzLCBubG1vZGUpIDwgMCkKIAkJcmV0dXJuIC0xOwogCiByZXRyeToKQEAgLTQ2MDksNyArNDc0NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlpZiAoIXBhcmFtcy0+d2VwX2tleVtpXSkKIAkJCWNvbnRpbnVlOwotCQl3cGFfZHJpdmVyX25sODAyMTFfc2V0X2tleShic3MtPmlmbmFtZSwgcHJpdiwgV1BBX0FMR19XRVAsCisJCXdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfa2V5KGJzcy0+aWZuYW1lLCBic3MsIFdQQV9BTEdfV0VQLAogCQkJCQkgICBOVUxMLCBpLAogCQkJCQkgICBpID09IHBhcmFtcy0+d2VwX3R4X2tleWlkeCwgTlVMTCwgMCwKIAkJCQkJICAgcGFyYW1zLT53ZXBfa2V5W2ldLApAQCAtNDY0Miw2ICs0Nzc3LDEyIEBACiAJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiICAqIElFcyIsIHBhcmFtcy0+aWUsIHBhcmFtcy0+aWVfbGVuKTsKIAlpZiAocGFyYW1zLT5pZSkKIAkJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9JRSwgcGFyYW1zLT5pZV9sZW4sIHBhcmFtcy0+aWUpOworCWlmIChwYXJhbXMtPnNhZV9kYXRhKSB7CisJCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIiAgKiBTQUUgZGF0YSIsIHBhcmFtcy0+c2FlX2RhdGEsCisJCQkgICAgcGFyYW1zLT5zYWVfZGF0YV9sZW4pOworCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX1NBRV9EQVRBLCBwYXJhbXMtPnNhZV9kYXRhX2xlbiwKKwkJCXBhcmFtcy0+c2FlX2RhdGEpOworCX0KIAlpZiAocGFyYW1zLT5hdXRoX2FsZyAmIFdQQV9BVVRIX0FMR19PUEVOKQogCQl0eXBlID0gTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTTsKIAllbHNlIGlmIChwYXJhbXMtPmF1dGhfYWxnICYgV1BBX0FVVEhfQUxHX1NIQVJFRCkKQEAgLTQ2NTAsNiArNDc5MSw4IEBACiAJCXR5cGUgPSBOTDgwMjExX0FVVEhUWVBFX05FVFdPUktfRUFQOwogCWVsc2UgaWYgKHBhcmFtcy0+YXV0aF9hbGcgJiBXUEFfQVVUSF9BTEdfRlQpCiAJCXR5cGUgPSBOTDgwMjExX0FVVEhUWVBFX0ZUOworCWVsc2UgaWYgKHBhcmFtcy0+YXV0aF9hbGcgJiBXUEFfQVVUSF9BTEdfU0FFKQorCQl0eXBlID0gTkw4MDIxMV9BVVRIVFlQRV9TQUU7CiAJZWxzZQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIiAgKiBBdXRoIFR5cGUgJWQiLCB0eXBlKTsKQEAgLTQ4OTksMTkgKzUwNDIsMzUgQEAKIAkJCQkvKiBjcnVkZSBoZXVyaXN0aWMgKi8KIAkJCQlpZiAobW9kZS0+Y2hhbm5lbHNbaWR4XS5mcmVxIDwgNDAwMCkKIAkJCQkJbW9kZS0+bW9kZSA9IEhPU1RBUERfTU9ERV9JRUVFODAyMTFCOworCQkJCWVsc2UgaWYgKG1vZGUtPmNoYW5uZWxzW2lkeF0uZnJlcSA+IDUwMDAwKQorCQkJCQltb2RlLT5tb2RlID0gSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUFEOwogCQkJCWVsc2UKIAkJCQkJbW9kZS0+bW9kZSA9IEhPU1RBUERfTU9ERV9JRUVFODAyMTFBOwogCQkJCW1vZGVfaXNfc2V0ID0gMTsKIAkJCX0KIAotCQkJLyogY3J1ZGUgaGV1cmlzdGljICovCi0JCQlpZiAobW9kZS0+Y2hhbm5lbHNbaWR4XS5mcmVxIDwgNDAwMCkKKwkJCXN3aXRjaCAobW9kZS0+bW9kZSkgeworCQkJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExQUQ6CisJCQkJbW9kZS0+Y2hhbm5lbHNbaWR4XS5jaGFuID0KKwkJCQkJKG1vZGUtPmNoYW5uZWxzW2lkeF0uZnJlcSAtIDU2MTYwKSAvCisJCQkJCTIxNjA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhPU1RBUERfTU9ERV9JRUVFODAyMTFBOgorCQkJCW1vZGUtPmNoYW5uZWxzW2lkeF0uY2hhbiA9CisJCQkJCW1vZGUtPmNoYW5uZWxzW2lkeF0uZnJlcSAvIDUgLSAxMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExQjoKKwkJCWNhc2UgSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUc6CiAJCQkJaWYgKG1vZGUtPmNoYW5uZWxzW2lkeF0uZnJlcSA9PSAyNDg0KQogCQkJCQltb2RlLT5jaGFubmVsc1tpZHhdLmNoYW4gPSAxNDsKIAkJCQllbHNlCi0JCQkJCW1vZGUtPmNoYW5uZWxzW2lkeF0uY2hhbiA9IChtb2RlLT5jaGFubmVsc1tpZHhdLmZyZXEgLSAyNDA3KSAvIDU7Ci0JCQllbHNlCi0JCQkJbW9kZS0+Y2hhbm5lbHNbaWR4XS5jaGFuID0gbW9kZS0+Y2hhbm5lbHNbaWR4XS5mcmVxLzUgLSAxMDAwOworCQkJCQltb2RlLT5jaGFubmVsc1tpZHhdLmNoYW4gPQorCQkJCQkJKG1vZGUtPmNoYW5uZWxzW2lkeF0uZnJlcSAtCisJCQkJCQkgMjQwNykgLyA1OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KIAogCQkJaWYgKHRiX2ZyZXFbTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9ESVNBQkxFRF0pCiAJCQkJbW9kZS0+Y2hhbm5lbHNbaWR4XS5mbGFnIHw9CkBAIC01MjY3LDcgKzU0MjYsNyBAQAogCiAJaWYgKG5vYWNrKQogCQl0eGZsYWdzIHw9IElFRUU4MDIxMV9SQURJT1RBUF9GX1RYX05PQUNLOwotCSoobGUxNiAqKSAmcnRhcF9oZHJbMTJdID0gaG9zdF90b19sZTE2KHR4ZmxhZ3MpOworCVdQQV9QVVRfTEUxNigmcnRhcF9oZHJbMTJdLCB0eGZsYWdzKTsKIAogCXJlcyA9IHNlbmRtc2coZHJ2LT5tb25pdG9yX3NvY2ssICZtc2csIDApOwogCWlmIChyZXMgPCAwKSB7CkBAIC01Mjk5LDEyICs1NDU4LDExIEBACiB9CiAKIAotc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfc2VuZF9tbG1lX2ZyZXEoc3RydWN0IGk4MDJfYnNzICpic3MsCi0JCQkJCSAgICAgY29uc3QgdTggKmRhdGEsCi0JCQkJCSAgICAgc2l6ZV90IGRhdGFfbGVuLCBpbnQgbm9hY2ssCi0JCQkJCSAgICAgdW5zaWduZWQgaW50IGZyZXEsIGludCBub19jY2ssCi0JCQkJCSAgICAgaW50IG9mZmNoYW5vaywKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgd2FpdF90aW1lKQorc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfc2VuZF9tbG1lKHN0cnVjdCBpODAyX2JzcyAqYnNzLCBjb25zdCB1OCAqZGF0YSwKKwkJCQkJc2l6ZV90IGRhdGFfbGVuLCBpbnQgbm9hY2ssCisJCQkJCXVuc2lnbmVkIGludCBmcmVxLCBpbnQgbm9fY2NrLAorCQkJCQlpbnQgb2ZmY2hhbm9rLAorCQkJCQl1bnNpZ25lZCBpbnQgd2FpdF90aW1lKQogewogCXN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2ID0gYnNzLT5kcnY7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwpAQCAtNTM2MCwxNSArNTUxOCw2IEBACiB9CiAKIAotc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfc2VuZF9tbG1lKHZvaWQgKnByaXYsIGNvbnN0IHU4ICpkYXRhLAotCQkJCQlzaXplX3QgZGF0YV9sZW4sIGludCBub2FjaykKLXsKLQlzdHJ1Y3QgaTgwMl9ic3MgKmJzcyA9IHByaXY7Ci0JcmV0dXJuIHdwYV9kcml2ZXJfbmw4MDIxMV9zZW5kX21sbWVfZnJlcShic3MsIGRhdGEsIGRhdGFfbGVuLCBub2FjaywKLQkJCQkJCSAwLCAwLCAwLCAwKTsKLX0KLQotCiBzdGF0aWMgaW50IG5sODAyMTFfc2V0X2JzcyhzdHJ1Y3QgaTgwMl9ic3MgKmJzcywgaW50IGN0cywgaW50IHByZWFtYmxlLAogCQkJICAgaW50IHNsb3QsIGludCBodF9vcG1vZGUsIGludCBhcF9pc29sYXRlLAogCQkJICAgaW50ICpiYXNpY19yYXRlcykKQEAgLTU1NzUsMTYgKzU3MjQsMTYgQEAKIAogCiBzdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfZnJlcShzdHJ1Y3QgaTgwMl9ic3MgKmJzcywKLQkJCQkgICAgICAgaW50IGZyZXEsIGludCBodF9lbmFibGVkLAotCQkJCSAgICAgICBpbnQgc2VjX2NoYW5uZWxfb2Zmc2V0KQorCQkJCSAgICAgICBzdHJ1Y3QgaG9zdGFwZF9mcmVxX3BhcmFtcyAqZnJlcSkKIHsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwogCXN0cnVjdCBubF9tc2cgKm1zZzsKIAlpbnQgcmV0OwogCi0Jd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBTZXQgZnJlcSAlZCAoaHRfZW5hYmxlZD0lZCAiCi0JCSAgICJzZWNfY2hhbm5lbF9vZmZzZXQ9JWQpIiwKLQkJICAgZnJlcSwgaHRfZW5hYmxlZCwgc2VjX2NoYW5uZWxfb2Zmc2V0KTsKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFNldCBmcmVxICVkIChodF9lbmFibGVkPSVkLCB2aHRfZW5hYmxlZD0lZCwiCisJCSAgICIgYmFuZHdpZHRoPSVkIE1IeiwgY2YxPSVkIE1IeiwgY2YyPSVkIE1IeikiLAorCQkgICBmcmVxLT5mcmVxLCBmcmVxLT5odF9lbmFibGVkLCBmcmVxLT52aHRfZW5hYmxlZCwKKwkJICAgZnJlcS0+YmFuZHdpZHRoLCBmcmVxLT5jZW50ZXJfZnJlcTEsIGZyZXEtPmNlbnRlcl9mcmVxMik7CiAJbXNnID0gbmxtc2dfYWxsb2MoKTsKIAlpZiAoIW1zZykKIAkJcmV0dXJuIC0xOwpAQCAtNTU5Miw5ICs1NzQxLDM4IEBACiAJbmw4MDIxMV9jbWQoZHJ2LCBtc2csIDAsIE5MODAyMTFfQ01EX1NFVF9XSVBIWSk7CiAKIAlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBkcnYtPmlmaW5kZXgpOwotCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEsIGZyZXEpOwotCWlmIChodF9lbmFibGVkKSB7Ci0JCXN3aXRjaCAoc2VjX2NoYW5uZWxfb2Zmc2V0KSB7CisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSwgZnJlcS0+ZnJlcSk7CisJaWYgKGZyZXEtPnZodF9lbmFibGVkKSB7CisJCXN3aXRjaCAoZnJlcS0+YmFuZHdpZHRoKSB7CisJCWNhc2UgMjA6CisJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9DSEFOTkVMX1dJRFRILAorCQkJCSAgICBOTDgwMjExX0NIQU5fV0lEVEhfMjApOworCQkJYnJlYWs7CisJCWNhc2UgNDA6CisJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9DSEFOTkVMX1dJRFRILAorCQkJCSAgICBOTDgwMjExX0NIQU5fV0lEVEhfNDApOworCQkJYnJlYWs7CisJCWNhc2UgODA6CisJCQlpZiAoZnJlcS0+Y2VudGVyX2ZyZXEyKQorCQkJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0NIQU5ORUxfV0lEVEgsCisJCQkJCSAgICBOTDgwMjExX0NIQU5fV0lEVEhfODBQODApOworCQkJZWxzZQorCQkJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0NIQU5ORUxfV0lEVEgsCisJCQkJCSAgICBOTDgwMjExX0NIQU5fV0lEVEhfODApOworCQkJYnJlYWs7CisJCWNhc2UgMTYwOgorCQkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfQ0hBTk5FTF9XSURUSCwKKwkJCQkgICAgTkw4MDIxMV9DSEFOX1dJRFRIXzE2MCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJfQorCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTEsIGZyZXEtPmNlbnRlcl9mcmVxMSk7CisJCWlmIChmcmVxLT5jZW50ZXJfZnJlcTIpCisJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTIsCisJCQkJICAgIGZyZXEtPmNlbnRlcl9mcmVxMik7CisJfSBlbHNlIGlmIChmcmVxLT5odF9lbmFibGVkKSB7CisJCXN3aXRjaCAoZnJlcS0+c2VjX2NoYW5uZWxfb2Zmc2V0KSB7CiAJCWNhc2UgLTE6CiAJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUsCiAJCQkJICAgIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVMpOwpAQCAtNTYxMywxMSArNTc5MSwxMSBAQAogCXJldCA9IHNlbmRfYW5kX3JlY3ZfbXNncyhkcnYsIG1zZywgTlVMTCwgTlVMTCk7CiAJbXNnID0gTlVMTDsKIAlpZiAocmV0ID09IDApIHsKLQkJYnNzLT5mcmVxID0gZnJlcTsKKwkJYnNzLT5mcmVxID0gZnJlcS0+ZnJlcTsKIAkJcmV0dXJuIDA7CiAJfQogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogRmFpbGVkIHRvIHNldCBjaGFubmVsIChmcmVxPSVkKTogIgotCQkgICAiJWQgKCVzKSIsIGZyZXEsIHJldCwgc3RyZXJyb3IoLXJldCkpOworCQkgICAiJWQgKCVzKSIsIGZyZXEtPmZyZXEsIHJldCwgc3RyZXJyb3IoLXJldCkpOwogbmxhX3B1dF9mYWlsdXJlOgogCW5sbXNnX2ZyZWUobXNnKTsKIAlyZXR1cm4gLTE7CkBAIC01NjYwLDYgKzU4MzgsOCBAQAogCWlmICghbXNnKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogJXMgU1RBICIgTUFDU1RSLAorCQkgICBwYXJhbXMtPnNldCA/ICJTZXQiIDogIkFkZCIsIE1BQzJTVFIocGFyYW1zLT5hZGRyKSk7CiAJbmw4MDIxMV9jbWQoZHJ2LCBtc2csIDAsIHBhcmFtcy0+c2V0ID8gTkw4MDIxMV9DTURfU0VUX1NUQVRJT04gOgogCQkgICAgTkw4MDIxMV9DTURfTkVXX1NUQVRJT04pOwogCkBAIC01NjY3LDIwICs1ODQ3LDQ5IEBACiAJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9NQUMsIEVUSF9BTEVOLCBwYXJhbXMtPmFkZHIpOwogCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFUywgcGFyYW1zLT5zdXBwX3JhdGVzX2xlbiwKIAkJcGFyYW1zLT5zdXBwX3JhdGVzKTsKKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICIgICogc3VwcG9ydGVkIHJhdGVzIiwgcGFyYW1zLT5zdXBwX3JhdGVzLAorCQkgICAgcGFyYW1zLT5zdXBwX3JhdGVzX2xlbik7CiAJaWYgKCFwYXJhbXMtPnNldCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIiAgKiBhaWQ9JXUiLCBwYXJhbXMtPmFpZCk7CiAJCU5MQV9QVVRfVTE2KG1zZywgTkw4MDIxMV9BVFRSX1NUQV9BSUQsIHBhcmFtcy0+YWlkKTsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICIgICogbGlzdGVuX2ludGVydmFsPSV1IiwKKwkJCSAgIHBhcmFtcy0+bGlzdGVuX2ludGVydmFsKTsKIAkJTkxBX1BVVF9VMTYobXNnLCBOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTCwKIAkJCSAgICBwYXJhbXMtPmxpc3Rlbl9pbnRlcnZhbCk7CiAJfQogCWlmIChwYXJhbXMtPmh0X2NhcGFiaWxpdGllcykgeworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICIgICogaHRfY2FwYWJpbGl0aWVzIiwKKwkJCSAgICAodTggKikgcGFyYW1zLT5odF9jYXBhYmlsaXRpZXMsCisJCQkgICAgc2l6ZW9mKCpwYXJhbXMtPmh0X2NhcGFiaWxpdGllcykpOwogCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFksCiAJCQlzaXplb2YoKnBhcmFtcy0+aHRfY2FwYWJpbGl0aWVzKSwKIAkJCXBhcmFtcy0+aHRfY2FwYWJpbGl0aWVzKTsKIAl9CiAKKwlpZiAocGFyYW1zLT52aHRfY2FwYWJpbGl0aWVzKSB7CisJCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIiAgKiB2aHRfY2FwYWJpbGl0aWVzIiwKKwkJCSAgICAodTggKikgcGFyYW1zLT52aHRfY2FwYWJpbGl0aWVzLAorCQkJICAgIHNpemVvZigqcGFyYW1zLT52aHRfY2FwYWJpbGl0aWVzKSk7CisJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfVkhUX0NBUEFCSUxJVFksCisJCQlzaXplb2YoKnBhcmFtcy0+dmh0X2NhcGFiaWxpdGllcyksCisJCQlwYXJhbXMtPnZodF9jYXBhYmlsaXRpZXMpOworCX0KKworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiICAqIGNhcGFiaWxpdHk9MHgleCIsIHBhcmFtcy0+Y2FwYWJpbGl0eSk7CisJTkxBX1BVVF9VMTYobXNnLCBOTDgwMjExX0FUVFJfU1RBX0NBUEFCSUxJVFksIHBhcmFtcy0+Y2FwYWJpbGl0eSk7CisKKwlpZiAocGFyYW1zLT5leHRfY2FwYWIpIHsKKwkJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiICAqIGV4dF9jYXBhYiIsCisJCQkgICAgcGFyYW1zLT5leHRfY2FwYWIsIHBhcmFtcy0+ZXh0X2NhcGFiX2xlbik7CisJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfU1RBX0VYVF9DQVBBQklMSVRZLAorCQkJcGFyYW1zLT5leHRfY2FwYWJfbGVuLCBwYXJhbXMtPmV4dF9jYXBhYik7CisJfQorCiAJb3NfbWVtc2V0KCZ1cGQsIDAsIHNpemVvZih1cGQpKTsKIAl1cGQubWFzayA9IHN0YV9mbGFnc19ubDgwMjExKHBhcmFtcy0+ZmxhZ3MpOwogCXVwZC5zZXQgPSB1cGQubWFzazsKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIiAgKiBmbGFncyBzZXQ9MHgleCBtYXNrPTB4JXgiLAorCQkgICB1cGQuc2V0LCB1cGQubWFzayk7CiAJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9TVEFfRkxBR1MyLCBzaXplb2YodXBkKSwgJnVwZCk7CiAKIAlpZiAocGFyYW1zLT5mbGFncyAmIFdQQV9TVEFfV01NKSB7CkBAIC01Njg4LDEwICs1ODk3LDExIEBACiAJCWlmICghd21lKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICIgICogcW9zaW5mbz0weCV4IiwgcGFyYW1zLT5xb3NpbmZvKTsKIAkJTkxBX1BVVF9VOCh3bWUsIE5MODAyMTFfU1RBX1dNRV9VQVBTRF9RVUVVRVMsCiAJCQkJcGFyYW1zLT5xb3NpbmZvICYgV01NX1FPU0lORk9fU1RBX0FDX01BU0spOwogCQlOTEFfUFVUX1U4KHdtZSwgTkw4MDIxMV9TVEFfV01FX01BWF9TUCwKLQkJCQkocGFyYW1zLT5xb3NpbmZvID4gV01NX1FPU0lORk9fU1RBX1NQX1NISUZUKSAmCisJCQkJKHBhcmFtcy0+cW9zaW5mbyA+PiBXTU1fUU9TSU5GT19TVEFfU1BfU0hJRlQpICYKIAkJCQlXTU1fUU9TSU5GT19TVEFfU1BfTUFTSyk7CiAJCWlmIChubGFfcHV0X25lc3RlZChtc2csIE5MODAyMTFfQVRUUl9TVEFfV01FLCB3bWUpIDwgMCkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtNTcxMiw5ICs1OTIyLDggQEAKIH0KIAogCi1zdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9zdGFfcmVtb3ZlKHZvaWQgKnByaXYsIGNvbnN0IHU4ICphZGRyKQorc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfc3RhX3JlbW92ZShzdHJ1Y3QgaTgwMl9ic3MgKmJzcywgY29uc3QgdTggKmFkZHIpCiB7Ci0Jc3RydWN0IGk4MDJfYnNzICpic3MgPSBwcml2OwogCXN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2ID0gYnNzLT5kcnY7CiAJc3RydWN0IG5sX21zZyAqbXNnOwogCWludCByZXQ7CkBAIC02NTEzLDcgKzY3MjIsMTAgQEAKIHN0YXRpYyBpbnQgd3BhX2RyaXZlcl9ubDgwMjExX2FwKHN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LAogCQkJCSBzdHJ1Y3Qgd3BhX2RyaXZlcl9hc3NvY2lhdGVfcGFyYW1zICpwYXJhbXMpCiB7Ci0JZW51bSBubDgwMjExX2lmdHlwZSBubG1vZGU7CisJZW51bSBubDgwMjExX2lmdHlwZSBubG1vZGUsIG9sZF9tb2RlOworCXN0cnVjdCBob3N0YXBkX2ZyZXFfcGFyYW1zIGZyZXEgPSB7CisJCS5mcmVxID0gcGFyYW1zLT5mcmVxLAorCX07CiAKIAlpZiAocGFyYW1zLT5wMnApIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBTZXR1cCBBUCBvcGVyYXRpb25zIGZvciBQMlAgIgpAQCAtNjUyMiw4ICs2NzM0LDE1IEBACiAJfSBlbHNlCiAJCW5sbW9kZSA9IE5MODAyMTFfSUZUWVBFX0FQOwogCi0JaWYgKHdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfbW9kZSgmZHJ2LT5maXJzdF9ic3MsIG5sbW9kZSkgfHwKLQkgICAgd3BhX2RyaXZlcl9ubDgwMjExX3NldF9mcmVxKCZkcnYtPmZpcnN0X2JzcywgcGFyYW1zLT5mcmVxLCAwLCAwKSkgeworCW9sZF9tb2RlID0gZHJ2LT5ubG1vZGU7CisJaWYgKHdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfbW9kZSgmZHJ2LT5maXJzdF9ic3MsIG5sbW9kZSkpIHsKKwkJbmw4MDIxMV9yZW1vdmVfbW9uaXRvcl9pbnRlcmZhY2UoZHJ2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh3cGFfZHJpdmVyX25sODAyMTFfc2V0X2ZyZXEoJmRydi0+Zmlyc3RfYnNzLCAmZnJlcSkpIHsKKwkJaWYgKG9sZF9tb2RlICE9IG5sbW9kZSkKKwkJCXdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfbW9kZSgmZHJ2LT5maXJzdF9ic3MsIG9sZF9tb2RlKTsKIAkJbmw4MDIxMV9yZW1vdmVfbW9uaXRvcl9pbnRlcmZhY2UoZHJ2KTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTY2NDgsNTYgKzY4NjcsNyBAQAogfQogCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbmw4MDIxMV9nZXRfYXNzb2NfYnNzaWQoc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsCi0JCQkJCSAgICB1OCAqYnNzaWQpCi17Ci0Jc3RydWN0IG5sX21zZyAqbXNnOwotCWludCByZXQ7Ci0Jc3RydWN0IG5sODAyMTFfYnNzX2luZm9fYXJnIGFyZzsKLQotCW9zX21lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7Ci0JbXNnID0gbmxtc2dfYWxsb2MoKTsKLQlpZiAoIW1zZykKLQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0KLQlubDgwMjExX2NtZChkcnYsIG1zZywgTkxNX0ZfRFVNUCwgTkw4MDIxMV9DTURfR0VUX1NDQU4pOwotCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0lGSU5ERVgsIGRydi0+aWZpbmRleCk7Ci0KLQlhcmcuZHJ2ID0gZHJ2OwotCXJldCA9IHNlbmRfYW5kX3JlY3ZfbXNncyhkcnYsIG1zZywgYnNzX2luZm9faGFuZGxlciwgJmFyZyk7Ci0JbXNnID0gTlVMTDsKLQlpZiAocmV0ID09IDApIHsKLQkJaWYgKGlzX3plcm9fZXRoZXJfYWRkcihhcmcuYXNzb2NfYnNzaWQpKQotCQkJcmV0dXJuIC1FTk9UQ09OTjsKLQkJb3NfbWVtY3B5KGJzc2lkLCBhcmcuYXNzb2NfYnNzaWQsIEVUSF9BTEVOKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogU2NhbiByZXN1bHQgZmV0Y2ggZmFpbGVkOiByZXQ9JWQgIgotCQkgICAiKCVzKSIsIHJldCwgc3RyZXJyb3IoLXJldCkpOwotbmxhX3B1dF9mYWlsdXJlOgotCW5sbXNnX2ZyZWUobXNnKTsKLQlyZXR1cm4gZHJ2LT5hc3NvY19mcmVxOwotfQotCi0KLXN0YXRpYyBpbnQgbmw4MDIxMV9kaXNjb25uZWN0KHN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LAotCQkJICAgICAgY29uc3QgdTggKmJzc2lkKQotewotCXU4IGFkZHJbRVRIX0FMRU5dOwotCi0JaWYgKGJzc2lkID09IE5VTEwpIHsKLQkJaW50IHJlcyA9IG5sODAyMTFfZ2V0X2Fzc29jX2Jzc2lkKGRydiwgYWRkcik7Ci0JCWlmIChyZXMpCi0JCQlyZXR1cm4gcmVzOwotCQlic3NpZCA9IGFkZHI7Ci0JfQotCi0JcmV0dXJuIHdwYV9kcml2ZXJfbmw4MDIxMV9kaXNjb25uZWN0KGRydiwgYnNzaWQsCi0JCQkJCSAgICAgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCk7Ci19Ci0KLQotc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfY29ubmVjdCgKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl9ubDgwMjExX3RyeV9jb25uZWN0KAogCXN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LAogCXN0cnVjdCB3cGFfZHJpdmVyX2Fzc29jaWF0ZV9wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTY3ODgsNiArNjk1OCw5IEBACiAJCWludCBjaXBoZXI7CiAKIAkJc3dpdGNoIChwYXJhbXMtPnBhaXJ3aXNlX3N1aXRlKSB7CisJCWNhc2UgQ0lQSEVSX1NNUzQ6CisJCQljaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0OworCQkJYnJlYWs7CiAJCWNhc2UgQ0lQSEVSX1dFUDQwOgogCQkJY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7CiAJCQlicmVhazsKQEAgLTY4MTIsNiArNjk4NSw5IEBACiAJCWludCBjaXBoZXI7CiAKIAkJc3dpdGNoIChwYXJhbXMtPmdyb3VwX3N1aXRlKSB7CisJCWNhc2UgQ0lQSEVSX1NNUzQ6CisJCQljaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0OworCQkJYnJlYWs7CiAJCWNhc2UgQ0lQSEVSX1dFUDQwOgogCQkJY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7CiAJCQlicmVhazsKQEAgLTY4MzMsMTAgKzcwMDksMTQgQEAKIAl9CiAKIAlpZiAocGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSA9PSBLRVlfTUdNVF84MDJfMVggfHwKLQkgICAgcGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSA9PSBLRVlfTUdNVF9QU0spIHsKKwkgICAgcGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSA9PSBLRVlfTUdNVF9QU0sgfHwKKwkgICAgcGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSA9PSBLRVlfTUdNVF9DQ0tNKSB7CiAJCWludCBtZ210ID0gV0xBTl9BS01fU1VJVEVfUFNLOwogCiAJCXN3aXRjaCAocGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSkgeworCQljYXNlIEtFWV9NR01UX0NDS006CisJCQltZ210ID0gV0xBTl9BS01fU1VJVEVfQ0NLTTsKKwkJCWJyZWFrOwogCQljYXNlIEtFWV9NR01UXzgwMl8xWDoKIAkJCW1nbXQgPSBXTEFOX0FLTV9TVUlURV84MDIxWDsKIAkJCWJyZWFrOwpAQCAtNjg0OCw2ICs3MDI4LDExIEBACiAJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMsIG1nbXQpOwogCX0KIAorI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCisJaWYgKHBhcmFtcy0+bWdtdF9mcmFtZV9wcm90ZWN0aW9uID09IE1HTVRfRlJBTUVfUFJPVEVDVElPTl9SRVFVSVJFRCkKKwkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfVVNFX01GUCwgTkw4MDIxMV9NRlBfUkVRVUlSRUQpOworI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCisKIAlpZiAocGFyYW1zLT5kaXNhYmxlX2h0KQogCQlOTEFfUFVUX0ZMQUcobXNnLCBOTDgwMjExX0FUVFJfRElTQUJMRV9IVCk7CiAKQEAgLTY4NjcsMTQgKzcwNTIsNiBAQAogCWlmIChyZXQpIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBNTE1FIGNvbm5lY3QgZmFpbGVkOiByZXQ9JWQgIgogCQkJICAgIiglcykiLCByZXQsIHN0cmVycm9yKC1yZXQpKTsKLQkJLyoKLQkJICogY2ZnODAyMTEgZG9lcyBub3QgY3VycmVudGx5IGFjY2VwdCBuZXcgY29ubmVjdGlvbiBpZiB3ZSBhcmUKLQkJICogYWxyZWFkeSBjb25uZWN0ZWQuIEFzIGEgd29ya2Fyb3VuZCwgZm9yY2UgZGlzY29ubmVjdGlvbiBhbmQKLQkJICogdHJ5IGFnYWluIG9uY2UgdGhlIGRyaXZlciBpbmRpY2F0ZXMgaXQgY29tcGxldGVkCi0JCSAqIGRpc2Nvbm5lY3Rpb24uCi0JCSAqLwotCQlpZiAocmV0ID09IC1FQUxSRUFEWSkKLQkJCW5sODAyMTFfZGlzY29ubmVjdChkcnYsIHBhcmFtcy0+YnNzaWQpOwogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAl9CiAJcmV0ID0gMDsKQEAgLTY4ODcsNiArNzA2NCwzMSBAQAogfQogCiAKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl9ubDgwMjExX2Nvbm5lY3QoCisJc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsCisJc3RydWN0IHdwYV9kcml2ZXJfYXNzb2NpYXRlX3BhcmFtcyAqcGFyYW1zKQoreworCWludCByZXQgPSB3cGFfZHJpdmVyX25sODAyMTFfdHJ5X2Nvbm5lY3QoZHJ2LCBwYXJhbXMpOworCWlmIChyZXQgPT0gLUVBTFJFQURZKSB7CisJCS8qCisJCSAqIGNmZzgwMjExIGRvZXMgbm90IGN1cnJlbnRseSBhY2NlcHQgbmV3IGNvbm5lY3Rpb25zIGlmCisJCSAqIHdlIGFyZSBhbHJlYWR5IGNvbm5lY3RlZC4gQXMgYSB3b3JrYXJvdW5kLCBmb3JjZQorCQkgKiBkaXNjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uCisJCSAqLworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IEV4cGxpY2l0bHkgIgorCQkJICAgImRpc2Nvbm5lY3RpbmcgYmVmb3JlIHJlYXNzb2NpYXRpb24gIgorCQkJICAgImF0dGVtcHQiKTsKKwkJaWYgKHdwYV9kcml2ZXJfbmw4MDIxMV9kaXNjb25uZWN0KAorCQkJICAgIGRydiwgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCkpCisJCQlyZXR1cm4gLTE7CisJCS8qIElnbm9yZSB0aGUgbmV4dCBsb2NhbCBkaXNjb25uZWN0IG1lc3NhZ2UuICovCisJCWRydi0+aWdub3JlX25leHRfbG9jYWxfZGlzY29ubmVjdCA9IDE7CisJCXJldCA9IHdwYV9kcml2ZXJfbmw4MDIxMV90cnlfY29ubmVjdChkcnYsIHBhcmFtcyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKwogc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfYXNzb2NpYXRlKAogCXZvaWQgKnByaXYsIHN0cnVjdCB3cGFfZHJpdmVyX2Fzc29jaWF0ZV9wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTcyMzIsOCArNzQzNCw3IEBACiBzdGF0aWMgaW50IGk4MDJfc2V0X2ZyZXEodm9pZCAqcHJpdiwgc3RydWN0IGhvc3RhcGRfZnJlcV9wYXJhbXMgKmZyZXEpCiB7CiAJc3RydWN0IGk4MDJfYnNzICpic3MgPSBwcml2OwotCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfc2V0X2ZyZXEoYnNzLCBmcmVxLT5mcmVxLCBmcmVxLT5odF9lbmFibGVkLAotCQkJCQkgICBmcmVxLT5zZWNfY2hhbm5lbF9vZmZzZXQpOworCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfc2V0X2ZyZXEoYnNzLCBmcmVxKTsKIH0KIAogCkBAIC03NDQ5LDEwICs3NjUwLDEwIEBACiAJcmV0dXJuIE5MX1NLSVA7CiB9CiAKLXN0YXRpYyBpbnQgaTgwMl9yZWFkX3N0YV9kYXRhKHZvaWQgKnByaXYsIHN0cnVjdCBob3N0YXBfc3RhX2RyaXZlcl9kYXRhICpkYXRhLAorc3RhdGljIGludCBpODAyX3JlYWRfc3RhX2RhdGEoc3RydWN0IGk4MDJfYnNzICpic3MsCisJCQkgICAgICBzdHJ1Y3QgaG9zdGFwX3N0YV9kcml2ZXJfZGF0YSAqZGF0YSwKIAkJCSAgICAgIGNvbnN0IHU4ICphZGRyKQogewotCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwogCXN0cnVjdCBubF9tc2cgKm1zZzsKIApAQCAtNzUzNCwxMCArNzczNSw5IEBACiB9CiAKIAotc3RhdGljIGludCBpODAyX3NldF9zdGFfdmxhbih2b2lkICpwcml2LCBjb25zdCB1OCAqYWRkciwKK3N0YXRpYyBpbnQgaTgwMl9zZXRfc3RhX3ZsYW4oc3RydWN0IGk4MDJfYnNzICpic3MsIGNvbnN0IHU4ICphZGRyLAogCQkJICAgICBjb25zdCBjaGFyICppZm5hbWUsIGludCB2bGFuX2lkKQogewotCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwogCXN0cnVjdCBubF9tc2cgKm1zZzsKIAlpbnQgcmV0ID0gLUVOT0JVRlM7CkBAIC03NjA5LDcgKzc4MDksOCBAQAogCW1nbXQudS5kZWF1dGgucmVhc29uX2NvZGUgPSBob3N0X3RvX2xlMTYocmVhc29uKTsKIAlyZXR1cm4gd3BhX2RyaXZlcl9ubDgwMjExX3NlbmRfbWxtZShic3MsICh1OCAqKSAmbWdtdCwKIAkJCQkJICAgIElFRUU4MDIxMV9IRFJMRU4gKwotCQkJCQkgICAgc2l6ZW9mKG1nbXQudS5kZWF1dGgpLCAwKTsKKwkJCQkJICAgIHNpemVvZihtZ210LnUuZGVhdXRoKSwgMCwgMCwgMCwgMCwKKwkJCQkJICAgIDApOwogfQogCiAKQEAgLTc2MzIsNyArNzgzMyw4IEBACiAJbWdtdC51LmRpc2Fzc29jLnJlYXNvbl9jb2RlID0gaG9zdF90b19sZTE2KHJlYXNvbik7CiAJcmV0dXJuIHdwYV9kcml2ZXJfbmw4MDIxMV9zZW5kX21sbWUoYnNzLCAodTggKikgJm1nbXQsCiAJCQkJCSAgICBJRUVFODAyMTFfSERSTEVOICsKLQkJCQkJICAgIHNpemVvZihtZ210LnUuZGlzYXNzb2MpLCAwKTsKKwkJCQkJICAgIHNpemVvZihtZ210LnUuZGlzYXNzb2MpLCAwLCAwLCAwLCAwLAorCQkJCQkgICAgMCk7CiB9CiAKICNlbmRpZiAvKiBIT1NUQVBEIHx8IENPTkZJR19BUCAqLwpAQCAtNzkxMCw3ICs4MTEyLDggQEAKIAogc3RhdGljIHZvaWQgaTgwMl9kZWluaXQodm9pZCAqcHJpdikKIHsKLQl3cGFfZHJpdmVyX25sODAyMTFfZGVpbml0KHByaXYpOworCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKKwl3cGFfZHJpdmVyX25sODAyMTFfZGVpbml0KGJzcyk7CiB9CiAKICNlbmRpZiAvKiBIT1NUQVBEICovCkBAIC04MDY5LDYgKzgyNzIsNyBAQAogCQluZXdfYnNzLT5kcnYgPSBkcnY7CiAJCW5ld19ic3MtPm5leHQgPSBkcnYtPmZpcnN0X2Jzcy5uZXh0OwogCQluZXdfYnNzLT5mcmVxID0gZHJ2LT5maXJzdF9ic3MuZnJlcTsKKwkJbmV3X2Jzcy0+Y3R4ID0gYnNzX2N0eDsKIAkJZHJ2LT5maXJzdF9ic3MubmV4dCA9IG5ld19ic3M7CiAJCWlmIChkcnZfcHJpdikKIAkJCSpkcnZfcHJpdiA9IG5ld19ic3M7CkBAIC04MDg3LDExICs4MjkxLDEwIEBACiB9CiAKIAotc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfaWZfcmVtb3ZlKHZvaWQgKnByaXYsCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9pZl9yZW1vdmUoc3RydWN0IGk4MDJfYnNzICpic3MsCiAJCQkJCWVudW0gd3BhX2RyaXZlcl9pZl90eXBlIHR5cGUsCiAJCQkJCWNvbnN0IGNoYXIgKmlmbmFtZSkKIHsKLQlzdHJ1Y3QgaTgwMl9ic3MgKmJzcyA9IHByaXY7CiAJc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYgPSBic3MtPmRydjsKIAlpbnQgaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KGlmbmFtZSk7CiAKQEAgLTgyMTIsMTQgKzg0MTUsMTQgQEAKIH0KIAogCi1zdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9zZW5kX2FjdGlvbih2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgZnJlcSwKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl9ubDgwMjExX3NlbmRfYWN0aW9uKHN0cnVjdCBpODAyX2JzcyAqYnNzLAorCQkJCQkgIHVuc2lnbmVkIGludCBmcmVxLAogCQkJCQkgIHVuc2lnbmVkIGludCB3YWl0X3RpbWUsCiAJCQkJCSAgY29uc3QgdTggKmRzdCwgY29uc3QgdTggKnNyYywKIAkJCQkJICBjb25zdCB1OCAqYnNzaWQsCiAJCQkJCSAgY29uc3QgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwKIAkJCQkJICBpbnQgbm9fY2NrKQogewotCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwogCWludCByZXQgPSAtMTsKIAl1OCAqYnVmOwpAQCAtODI0MSwxMCArODQ0NCw5IEBACiAJb3NfbWVtY3B5KGhkci0+YWRkcjMsIGJzc2lkLCBFVEhfQUxFTik7CiAKIAlpZiAoaXNfYXBfaW50ZXJmYWNlKGRydi0+bmxtb2RlKSkKLQkJcmV0ID0gd3BhX2RyaXZlcl9ubDgwMjExX3NlbmRfbWxtZV9mcmVxKHByaXYsIGJ1ZiwKLQkJCQkJCQkyNCArIGRhdGFfbGVuLAotCQkJCQkJCTAsIGZyZXEsIG5vX2NjaywgMSwKLQkJCQkJCQl3YWl0X3RpbWUpOworCQlyZXQgPSB3cGFfZHJpdmVyX25sODAyMTFfc2VuZF9tbG1lKGJzcywgYnVmLCAyNCArIGRhdGFfbGVuLAorCQkJCQkJICAgMCwgZnJlcSwgbm9fY2NrLCAxLAorCQkJCQkJICAgd2FpdF90aW1lKTsKIAllbHNlCiAJCXJldCA9IG5sODAyMTFfc2VuZF9mcmFtZV9jbWQoYnNzLCBmcmVxLCB3YWl0X3RpbWUsIGJ1ZiwKIAkJCQkJICAgICAyNCArIGRhdGFfbGVuLApAQCAtODM2MCw5ICs4NTYyLDggQEAKIH0KIAogCi1zdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9wcm9iZV9yZXFfcmVwb3J0KHZvaWQgKnByaXYsIGludCByZXBvcnQpCitzdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9wcm9iZV9yZXFfcmVwb3J0KHN0cnVjdCBpODAyX2JzcyAqYnNzLCBpbnQgcmVwb3J0KQogewotCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwogCiAJaWYgKCFyZXBvcnQpIHsKQEAgLTg4NzcsNyArOTA3OCw4IEBACiAJb3NfbWVtY3B5KG51bGxkYXRhLmhkci5JRUVFODAyMTFfQlNTSURfRlJPTURTLCBvd25fYWRkciwgRVRIX0FMRU4pOwogCW9zX21lbWNweShudWxsZGF0YS5oZHIuSUVFRTgwMjExX1NBX0ZST01EUywgb3duX2FkZHIsIEVUSF9BTEVOKTsKIAotCWlmICh3cGFfZHJpdmVyX25sODAyMTFfc2VuZF9tbG1lKGJzcywgKHU4ICopICZudWxsZGF0YSwgc2l6ZSwgMCkgPCAwKQorCWlmICh3cGFfZHJpdmVyX25sODAyMTFfc2VuZF9tbG1lKGJzcywgKHU4ICopICZudWxsZGF0YSwgc2l6ZSwgMCwgMCwgMCwKKwkJCQkJIDAsIDApIDwgMCkKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExX3NlbmRfbnVsbF9mcmFtZTogRmFpbGVkIHRvICIKIAkJCSAgICJzZW5kIHBvbGwgZnJhbWUiKTsKIH0KQEAgLTkxNzUsMzUgKzkzNzcsMTQwIEBACiAjZW5kaWYgLyogQU5EUk9JRCAqLwogCiAKK3N0YXRpYyBpbnQgZHJpdmVyX25sODAyMTFfc2V0X2tleShjb25zdCBjaGFyICppZm5hbWUsIHZvaWQgKnByaXYsCisJCQkJICBlbnVtIHdwYV9hbGcgYWxnLCBjb25zdCB1OCAqYWRkciwKKwkJCQkgIGludCBrZXlfaWR4LCBpbnQgc2V0X3R4LAorCQkJCSAgY29uc3QgdTggKnNlcSwgc2l6ZV90IHNlcV9sZW4sCisJCQkJICBjb25zdCB1OCAqa2V5LCBzaXplX3Qga2V5X2xlbikKK3sKKwlzdHJ1Y3QgaTgwMl9ic3MgKmJzcyA9IHByaXY7CisJcmV0dXJuIHdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfa2V5KGlmbmFtZSwgYnNzLCBhbGcsIGFkZHIsIGtleV9pZHgsCisJCQkJCSAgc2V0X3R4LCBzZXEsIHNlcV9sZW4sIGtleSwga2V5X2xlbik7Cit9CisKKworc3RhdGljIGludCBkcml2ZXJfbmw4MDIxMV9zY2FuMih2b2lkICpwcml2LAorCQkJCXN0cnVjdCB3cGFfZHJpdmVyX3NjYW5fcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGk4MDJfYnNzICpic3MgPSBwcml2OworCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfc2Nhbihic3MsIHBhcmFtcyk7Cit9CisKKworc3RhdGljIGludCBkcml2ZXJfbmw4MDIxMV9kZWF1dGhlbnRpY2F0ZSh2b2lkICpwcml2LCBjb25zdCB1OCAqYWRkciwKKwkJCQkJIGludCByZWFzb25fY29kZSkKK3sKKwlzdHJ1Y3QgaTgwMl9ic3MgKmJzcyA9IHByaXY7CisJcmV0dXJuIHdwYV9kcml2ZXJfbmw4MDIxMV9kZWF1dGhlbnRpY2F0ZShic3MsIGFkZHIsIHJlYXNvbl9jb2RlKTsKK30KKworCitzdGF0aWMgaW50IGRyaXZlcl9ubDgwMjExX2F1dGhlbnRpY2F0ZSh2b2lkICpwcml2LAorCQkJCSAgICAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl9hdXRoX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKKwlyZXR1cm4gd3BhX2RyaXZlcl9ubDgwMjExX2F1dGhlbnRpY2F0ZShic3MsIHBhcmFtcyk7Cit9CisKKworc3RhdGljIHZvaWQgZHJpdmVyX25sODAyMTFfZGVpbml0KHZvaWQgKnByaXYpCit7CisJc3RydWN0IGk4MDJfYnNzICpic3MgPSBwcml2OworCXdwYV9kcml2ZXJfbmw4MDIxMV9kZWluaXQoYnNzKTsKK30KKworCitzdGF0aWMgaW50IGRyaXZlcl9ubDgwMjExX2lmX3JlbW92ZSh2b2lkICpwcml2LCBlbnVtIHdwYV9kcml2ZXJfaWZfdHlwZSB0eXBlLAorCQkJCSAgICBjb25zdCBjaGFyICppZm5hbWUpCit7CisJc3RydWN0IGk4MDJfYnNzICpic3MgPSBwcml2OworCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfaWZfcmVtb3ZlKGJzcywgdHlwZSwgaWZuYW1lKTsKK30KKworCitzdGF0aWMgaW50IGRyaXZlcl9ubDgwMjExX3NlbmRfbWxtZSh2b2lkICpwcml2LCBjb25zdCB1OCAqZGF0YSwKKwkJCQkgICAgc2l6ZV90IGRhdGFfbGVuLCBpbnQgbm9hY2spCit7CisJc3RydWN0IGk4MDJfYnNzICpic3MgPSBwcml2OworCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfc2VuZF9tbG1lKGJzcywgZGF0YSwgZGF0YV9sZW4sIG5vYWNrLAorCQkJCQkgICAgMCwgMCwgMCwgMCk7Cit9CisKKworc3RhdGljIGludCBkcml2ZXJfbmw4MDIxMV9zdGFfcmVtb3ZlKHZvaWQgKnByaXYsIGNvbnN0IHU4ICphZGRyKQoreworCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKKwlyZXR1cm4gd3BhX2RyaXZlcl9ubDgwMjExX3N0YV9yZW1vdmUoYnNzLCBhZGRyKTsKK30KKworCisjaWYgZGVmaW5lZChIT1NUQVBEKSB8fCBkZWZpbmVkKENPTkZJR19BUCkKK3N0YXRpYyBpbnQgZHJpdmVyX25sODAyMTFfc2V0X3N0YV92bGFuKHZvaWQgKnByaXYsIGNvbnN0IHU4ICphZGRyLAorCQkJCSAgICAgICBjb25zdCBjaGFyICppZm5hbWUsIGludCB2bGFuX2lkKQoreworCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKKwlyZXR1cm4gaTgwMl9zZXRfc3RhX3ZsYW4oYnNzLCBhZGRyLCBpZm5hbWUsIHZsYW5faWQpOworfQorI2VuZGlmIC8qIEhPU1RBUEQgfHwgQ09ORklHX0FQICovCisKKworc3RhdGljIGludCBkcml2ZXJfbmw4MDIxMV9yZWFkX3N0YV9kYXRhKHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCBob3N0YXBfc3RhX2RyaXZlcl9kYXRhICpkYXRhLAorCQkJCQljb25zdCB1OCAqYWRkcikKK3sKKwlzdHJ1Y3QgaTgwMl9ic3MgKmJzcyA9IHByaXY7CisJcmV0dXJuIGk4MDJfcmVhZF9zdGFfZGF0YShic3MsIGRhdGEsIGFkZHIpOworfQorCisKK3N0YXRpYyBpbnQgZHJpdmVyX25sODAyMTFfc2VuZF9hY3Rpb24odm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGZyZXEsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHdhaXRfdGltZSwKKwkJCQkgICAgICBjb25zdCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAorCQkJCSAgICAgIGNvbnN0IHU4ICpic3NpZCwKKwkJCQkgICAgICBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLAorCQkJCSAgICAgIGludCBub19jY2spCit7CisJc3RydWN0IGk4MDJfYnNzICpic3MgPSBwcml2OworCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfc2VuZF9hY3Rpb24oYnNzLCBmcmVxLCB3YWl0X3RpbWUsIGRzdCwgc3JjLAorCQkJCQkgICAgICBic3NpZCwgZGF0YSwgZGF0YV9sZW4sIG5vX2Njayk7Cit9CisKKworc3RhdGljIGludCBkcml2ZXJfbmw4MDIxMV9wcm9iZV9yZXFfcmVwb3J0KHZvaWQgKnByaXYsIGludCByZXBvcnQpCit7CisJc3RydWN0IGk4MDJfYnNzICpic3MgPSBwcml2OworCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfcHJvYmVfcmVxX3JlcG9ydChic3MsIHJlcG9ydCk7Cit9CisKKwogY29uc3Qgc3RydWN0IHdwYV9kcml2ZXJfb3BzIHdwYV9kcml2ZXJfbmw4MDIxMV9vcHMgPSB7CiAJLm5hbWUgPSAibmw4MDIxMSIsCiAJLmRlc2MgPSAiTGludXggbmw4MDIxMS9jZmc4MDIxMSIsCiAJLmdldF9ic3NpZCA9IHdwYV9kcml2ZXJfbmw4MDIxMV9nZXRfYnNzaWQsCiAJLmdldF9zc2lkID0gd3BhX2RyaXZlcl9ubDgwMjExX2dldF9zc2lkLAotCS5zZXRfa2V5ID0gd3BhX2RyaXZlcl9ubDgwMjExX3NldF9rZXksCi0JLnNjYW4yID0gd3BhX2RyaXZlcl9ubDgwMjExX3NjYW4sCisJLnNldF9rZXkgPSBkcml2ZXJfbmw4MDIxMV9zZXRfa2V5LAorCS5zY2FuMiA9IGRyaXZlcl9ubDgwMjExX3NjYW4yLAogCS5zY2hlZF9zY2FuID0gd3BhX2RyaXZlcl9ubDgwMjExX3NjaGVkX3NjYW4sCiAJLnN0b3Bfc2NoZWRfc2NhbiA9IHdwYV9kcml2ZXJfbmw4MDIxMV9zdG9wX3NjaGVkX3NjYW4sCiAJLmdldF9zY2FuX3Jlc3VsdHMyID0gd3BhX2RyaXZlcl9ubDgwMjExX2dldF9zY2FuX3Jlc3VsdHMsCi0JLmRlYXV0aGVudGljYXRlID0gd3BhX2RyaXZlcl9ubDgwMjExX2RlYXV0aGVudGljYXRlLAotCS5kaXNhc3NvY2lhdGUgPSB3cGFfZHJpdmVyX25sODAyMTFfZGlzYXNzb2NpYXRlLAotCS5hdXRoZW50aWNhdGUgPSB3cGFfZHJpdmVyX25sODAyMTFfYXV0aGVudGljYXRlLAorCS5kZWF1dGhlbnRpY2F0ZSA9IGRyaXZlcl9ubDgwMjExX2RlYXV0aGVudGljYXRlLAorCS5hdXRoZW50aWNhdGUgPSBkcml2ZXJfbmw4MDIxMV9hdXRoZW50aWNhdGUsCiAJLmFzc29jaWF0ZSA9IHdwYV9kcml2ZXJfbmw4MDIxMV9hc3NvY2lhdGUsCiAJLmdsb2JhbF9pbml0ID0gbmw4MDIxMV9nbG9iYWxfaW5pdCwKIAkuZ2xvYmFsX2RlaW5pdCA9IG5sODAyMTFfZ2xvYmFsX2RlaW5pdCwKIAkuaW5pdDIgPSB3cGFfZHJpdmVyX25sODAyMTFfaW5pdCwKLQkuZGVpbml0ID0gd3BhX2RyaXZlcl9ubDgwMjExX2RlaW5pdCwKKwkuZGVpbml0ID0gZHJpdmVyX25sODAyMTFfZGVpbml0LAogCS5nZXRfY2FwYSA9IHdwYV9kcml2ZXJfbmw4MDIxMV9nZXRfY2FwYSwKIAkuc2V0X29wZXJzdGF0ZSA9IHdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfb3BlcnN0YXRlLAogCS5zZXRfc3VwcF9wb3J0ID0gd3BhX2RyaXZlcl9ubDgwMjExX3NldF9zdXBwX3BvcnQsCiAJLnNldF9jb3VudHJ5ID0gd3BhX2RyaXZlcl9ubDgwMjExX3NldF9jb3VudHJ5LAogCS5zZXRfYXAgPSB3cGFfZHJpdmVyX25sODAyMTFfc2V0X2FwLAogCS5pZl9hZGQgPSB3cGFfZHJpdmVyX25sODAyMTFfaWZfYWRkLAotCS5pZl9yZW1vdmUgPSB3cGFfZHJpdmVyX25sODAyMTFfaWZfcmVtb3ZlLAotCS5zZW5kX21sbWUgPSB3cGFfZHJpdmVyX25sODAyMTFfc2VuZF9tbG1lLAorCS5pZl9yZW1vdmUgPSBkcml2ZXJfbmw4MDIxMV9pZl9yZW1vdmUsCisJLnNlbmRfbWxtZSA9IGRyaXZlcl9ubDgwMjExX3NlbmRfbWxtZSwKIAkuZ2V0X2h3X2ZlYXR1cmVfZGF0YSA9IHdwYV9kcml2ZXJfbmw4MDIxMV9nZXRfaHdfZmVhdHVyZV9kYXRhLAogCS5zdGFfYWRkID0gd3BhX2RyaXZlcl9ubDgwMjExX3N0YV9hZGQsCi0JLnN0YV9yZW1vdmUgPSB3cGFfZHJpdmVyX25sODAyMTFfc3RhX3JlbW92ZSwKKwkuc3RhX3JlbW92ZSA9IGRyaXZlcl9ubDgwMjExX3N0YV9yZW1vdmUsCiAJLmhhcGRfc2VuZF9lYXBvbCA9IHdwYV9kcml2ZXJfbmw4MDIxMV9oYXBkX3NlbmRfZWFwb2wsCiAJLnN0YV9zZXRfZmxhZ3MgPSB3cGFfZHJpdmVyX25sODAyMTFfc3RhX3NldF9mbGFncywKICNpZmRlZiBIT1NUQVBECkBAIC05MjE5LDE4ICs5NTI2LDE4IEBACiAJLnNldF9ydHMgPSBpODAyX3NldF9ydHMsCiAJLnNldF9mcmFnID0gaTgwMl9zZXRfZnJhZywKIAkuc2V0X3R4X3F1ZXVlX3BhcmFtcyA9IGk4MDJfc2V0X3R4X3F1ZXVlX3BhcmFtcywKLQkuc2V0X3N0YV92bGFuID0gaTgwMl9zZXRfc3RhX3ZsYW4sCisJLnNldF9zdGFfdmxhbiA9IGRyaXZlcl9ubDgwMjExX3NldF9zdGFfdmxhbiwKIAkuc3RhX2RlYXV0aCA9IGk4MDJfc3RhX2RlYXV0aCwKIAkuc3RhX2Rpc2Fzc29jID0gaTgwMl9zdGFfZGlzYXNzb2MsCiAjZW5kaWYgLyogSE9TVEFQRCB8fCBDT05GSUdfQVAgKi8KLQkucmVhZF9zdGFfZGF0YSA9IGk4MDJfcmVhZF9zdGFfZGF0YSwKKwkucmVhZF9zdGFfZGF0YSA9IGRyaXZlcl9ubDgwMjExX3JlYWRfc3RhX2RhdGEsCiAJLnNldF9mcmVxID0gaTgwMl9zZXRfZnJlcSwKLQkuc2VuZF9hY3Rpb24gPSB3cGFfZHJpdmVyX25sODAyMTFfc2VuZF9hY3Rpb24sCisJLnNlbmRfYWN0aW9uID0gZHJpdmVyX25sODAyMTFfc2VuZF9hY3Rpb24sCiAJLnNlbmRfYWN0aW9uX2NhbmNlbF93YWl0ID0gd3BhX2RyaXZlcl9ubDgwMjExX3NlbmRfYWN0aW9uX2NhbmNlbF93YWl0LAogCS5yZW1haW5fb25fY2hhbm5lbCA9IHdwYV9kcml2ZXJfbmw4MDIxMV9yZW1haW5fb25fY2hhbm5lbCwKIAkuY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsID0KIAl3cGFfZHJpdmVyX25sODAyMTFfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsLAotCS5wcm9iZV9yZXFfcmVwb3J0ID0gd3BhX2RyaXZlcl9ubDgwMjExX3Byb2JlX3JlcV9yZXBvcnQsCisJLnByb2JlX3JlcV9yZXBvcnQgPSBkcml2ZXJfbmw4MDIxMV9wcm9iZV9yZXFfcmVwb3J0LAogCS5kZWluaXRfYXAgPSB3cGFfZHJpdmVyX25sODAyMTFfZGVpbml0X2FwLAogCS5kZWluaXRfcDJwX2NsaSA9IHdwYV9kcml2ZXJfbmw4MDIxMV9kZWluaXRfcDJwX2NsaSwKIAkucmVzdW1lID0gd3BhX2RyaXZlcl9ubDgwMjExX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL2RyaXZlcl9vcGVuYnNkLmMgYi9zcmMvZHJpdmVycy9kcml2ZXJfb3BlbmJzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NGVkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZHJpdmVycy9kcml2ZXJfb3BlbmJzZC5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogRHJpdmVyIGludGVyYWN0aW9uIHdpdGggT3BlbkJTRCBuZXQ4MDIxMSBsYXllcgorICogQ29weXJpZ2h0IChjKSAyMDEzLCBNYXJrIEtldHRlbmlzCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyAqIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9jcnlwdG8uaD4KKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfaW9jdGwuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorCitzdHJ1Y3Qgb3BlbmJzZF9kcml2ZXJfZGF0YSB7CisJY2hhciBpZm5hbWVbSUZOQU1TSVogKyAxXTsKKwl2b2lkICpjdHg7CisKKwlpbnQgc29jazsJCQkvKiBvcGVuIHNvY2tldCBmb3IgODAyLjExIGlvY3RscyAqLworfTsKKworCitzdGF0aWMgaW50Cit3cGFfZHJpdmVyX29wZW5ic2RfZ2V0X3NzaWQodm9pZCAqcHJpdiwgdTggKnNzaWQpCit7CisJc3RydWN0IG9wZW5ic2RfZHJpdmVyX2RhdGEgKmRydiA9IHByaXY7CisJc3RydWN0IGllZWU4MDIxMV9ud2lkIG53aWQ7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCW9zX21lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJb3Nfc3RybGNweShpZnIuaWZyX25hbWUsIGRydi0+aWZuYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJaWZyLmlmcl9kYXRhID0gKHZvaWQgKikmbndpZDsKKwlpZiAoaW9jdGwoZHJ2LT5zb2NrLCBTSU9DRzgwMjExTldJRCwgJmlmcikgPCAwIHx8CisJICAgIG53aWQuaV9sZW4gPiBJRUVFODAyMTFfTldJRF9MRU4pCisJCXJldHVybiAtMTsKKworCW9zX21lbWNweShzc2lkLCBud2lkLmlfbndpZCwgbndpZC5pX2xlbik7CisJcmV0dXJuIG53aWQuaV9sZW47Cit9CisKK3N0YXRpYyBpbnQKK3dwYV9kcml2ZXJfb3BlbmJzZF9nZXRfYnNzaWQodm9pZCAqcHJpdiwgdTggKmJzc2lkKQoreworCXN0cnVjdCBvcGVuYnNkX2RyaXZlcl9kYXRhICpkcnYgPSBwcml2OworCXN0cnVjdCBpZWVlODAyMTFfYnNzaWQgaWQ7CisKKwlvc19zdHJsY3B5KGlkLmlfbmFtZSwgZHJ2LT5pZm5hbWUsIHNpemVvZihpZC5pX25hbWUpKTsKKwlpZiAoaW9jdGwoZHJ2LT5zb2NrLCBTSU9DRzgwMjExQlNTSUQsICZpZCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlvc19tZW1jcHkoYnNzaWQsIGlkLmlfYnNzaWQsIElFRUU4MDIxMV9BRERSX0xFTik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAord3BhX2RyaXZlcl9vcGVuYnNkX2dldF9jYXBhKHZvaWQgKnByaXYsIHN0cnVjdCB3cGFfZHJpdmVyX2NhcGEgKmNhcGEpCit7CisJb3NfbWVtc2V0KGNhcGEsIDAsIHNpemVvZigqY2FwYSkpOworCWNhcGEtPmZsYWdzID0gV1BBX0RSSVZFUl9GTEFHU180V0FZX0hBTkRTSEFLRTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50Cit3cGFfZHJpdmVyX29wZW5ic2Rfc2V0X2tleShjb25zdCBjaGFyICppZm5hbWUsIHZvaWQgKnByaXYsIGVudW0gd3BhX2FsZyBhbGcsCisJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIGludCBrZXlfaWR4LCBpbnQgc2V0X3R4LCBjb25zdCB1OCAqc2VxLAorCSAgICBzaXplX3Qgc2VxX2xlbiwgY29uc3QgdTggKmtleSwgc2l6ZV90IGtleV9sZW4pCit7CisJc3RydWN0IG9wZW5ic2RfZHJpdmVyX2RhdGEgKmRydiA9IHByaXY7CisJc3RydWN0IGllZWU4MDIxMV9rZXlhdmFpbCBrZXlhdmFpbDsKKworCWlmIChhbGcgIT0gV1BBX0FMR19QTUsgfHwga2V5X2xlbiA+IElFRUU4MDIxMV9QTUtfTEVOKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoJmtleWF2YWlsLCAwLCBzaXplb2Yoa2V5YXZhaWwpKTsKKwlvc19zdHJsY3B5KGtleWF2YWlsLmlfbmFtZSwgZHJ2LT5pZm5hbWUsIHNpemVvZihrZXlhdmFpbC5pX25hbWUpKTsKKwlpZiAod3BhX2RyaXZlcl9vcGVuYnNkX2dldF9ic3NpZChwcml2LCBrZXlhdmFpbC5pX21hY2FkZHIpIDwgMCkKKwkJcmV0dXJuIC0xOworCW1lbWNweShrZXlhdmFpbC5pX2tleSwga2V5LCBrZXlfbGVuKTsKKworCWlmIChpb2N0bChkcnYtPnNvY2ssIFNJT0NTODAyMTFLRVlBVkFJTCwgJmtleWF2YWlsKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqCit3cGFfZHJpdmVyX29wZW5ic2RfaW5pdCh2b2lkICpjdHgsIGNvbnN0IGNoYXIgKmlmbmFtZSkKK3sKKwlzdHJ1Y3Qgb3BlbmJzZF9kcml2ZXJfZGF0YSAqZHJ2OworCisJZHJ2ID0gb3NfemFsbG9jKHNpemVvZigqZHJ2KSk7CisJaWYgKGRydiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWRydi0+c29jayA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZHJ2LT5zb2NrIDwgMCkKKwkJZ290byBmYWlsOworCisJZHJ2LT5jdHggPSBjdHg7CisJb3Nfc3RybGNweShkcnYtPmlmbmFtZSwgaWZuYW1lLCBzaXplb2YoZHJ2LT5pZm5hbWUpKTsKKworCXJldHVybiBkcnY7CisKK2ZhaWw6CisJb3NfZnJlZShkcnYpOworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkCit3cGFfZHJpdmVyX29wZW5ic2RfZGVpbml0KHZvaWQgKnByaXYpCit7CisJc3RydWN0IG9wZW5ic2RfZHJpdmVyX2RhdGEgKmRydiA9IHByaXY7CisKKwljbG9zZShkcnYtPnNvY2spOworCW9zX2ZyZWUoZHJ2KTsKK30KKworCitjb25zdCBzdHJ1Y3Qgd3BhX2RyaXZlcl9vcHMgd3BhX2RyaXZlcl9vcGVuYnNkX29wcyA9IHsKKwkubmFtZSA9ICJvcGVuYnNkIiwKKwkuZGVzYyA9ICJPcGVuQlNEIDgwMi4xMSBzdXBwb3J0IiwKKwkuZ2V0X3NzaWQgPSB3cGFfZHJpdmVyX29wZW5ic2RfZ2V0X3NzaWQsCisJLmdldF9ic3NpZCA9IHdwYV9kcml2ZXJfb3BlbmJzZF9nZXRfYnNzaWQsCisJLmdldF9jYXBhID0gd3BhX2RyaXZlcl9vcGVuYnNkX2dldF9jYXBhLAorCS5zZXRfa2V5ID0gd3BhX2RyaXZlcl9vcGVuYnNkX3NldF9rZXksCisJLmluaXQgPSB3cGFfZHJpdmVyX29wZW5ic2RfaW5pdCwKKwkuZGVpbml0ID0gd3BhX2RyaXZlcl9vcGVuYnNkX2RlaW5pdCwKK307CmRpZmYgLS1naXQgYS9zcmMvZHJpdmVycy9kcml2ZXJfcHJpdnNlcC5jIGIvc3JjL2RyaXZlcnMvZHJpdmVyX3ByaXZzZXAuYwppbmRleCA5NDgxY2JmLi5lZDg4ZTcxIDEwMDY0NAotLS0gYS9zcmMvZHJpdmVycy9kcml2ZXJfcHJpdnNlcC5jCisrKyBiL3NyYy9kcml2ZXJzL2RyaXZlcl9wcml2c2VwLmMKQEAgLTMwNCwxNyArMzA0LDYgQEAKIH0KIAogCi1zdGF0aWMgaW50IHdwYV9kcml2ZXJfcHJpdnNlcF9kaXNhc3NvY2lhdGUodm9pZCAqcHJpdiwgY29uc3QgdTggKmFkZHIsCi0JCQkJCWludCByZWFzb25fY29kZSkKLXsKLQkvL3N0cnVjdCB3cGFfZHJpdmVyX3ByaXZzZXBfZGF0YSAqZHJ2ID0gcHJpdjsKLQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIiVzIGFkZHI9IiBNQUNTVFIgIiByZWFzb25fY29kZT0lZCIsCi0JCSAgIF9fZnVuY19fLCBNQUMyU1RSKGFkZHIpLCByZWFzb25fY29kZSk7Ci0Jd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyAtIFRPRE8iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQogc3RhdGljIHZvaWQgd3BhX2RyaXZlcl9wcml2c2VwX2V2ZW50X2Fzc29jKHZvaWQgKmN0eCwKIAkJCQkJICAgZW51bSB3cGFfZXZlbnRfdHlwZSBldmVudCwKIAkJCQkJICAgdTggKmJ1Ziwgc2l6ZV90IGxlbikKQEAgLTczNiw3ICs3MjUsNiBAQAogCS5zZXRfcGFyYW0gPSB3cGFfZHJpdmVyX3ByaXZzZXBfc2V0X3BhcmFtLAogCS5zY2FuMiA9IHdwYV9kcml2ZXJfcHJpdnNlcF9zY2FuLAogCS5kZWF1dGhlbnRpY2F0ZSA9IHdwYV9kcml2ZXJfcHJpdnNlcF9kZWF1dGhlbnRpY2F0ZSwKLQkuZGlzYXNzb2NpYXRlID0gd3BhX2RyaXZlcl9wcml2c2VwX2Rpc2Fzc29jaWF0ZSwKIAkuYXNzb2NpYXRlID0gd3BhX2RyaXZlcl9wcml2c2VwX2Fzc29jaWF0ZSwKIAkuZ2V0X2NhcGEgPSB3cGFfZHJpdmVyX3ByaXZzZXBfZ2V0X2NhcGEsCiAJLmdldF9tYWNfYWRkciA9IHdwYV9kcml2ZXJfcHJpdnNlcF9nZXRfbWFjX2FkZHIsCmRpZmYgLS1naXQgYS9zcmMvZHJpdmVycy9kcml2ZXJfdGVzdC5jIGIvc3JjL2RyaXZlcnMvZHJpdmVyX3Rlc3QuYwppbmRleCBlN2JmMTk1Li5jOTk4MDJhIDEwMDY0NAotLS0gYS9zcmMvZHJpdmVycy9kcml2ZXJfdGVzdC5jCisrKyBiL3NyYy9kcml2ZXJzL2RyaXZlcl90ZXN0LmMKQEAgLTEzMTgsMTAgKzEzMTgsMTIgQEAKIAlpZiAoZHJ2LT5wZW5kaW5nX3AycF9zY2FuICYmIGRydi0+cDJwKSB7CiAjaWZkZWYgQ09ORklHX1AyUAogCQlzaXplX3QgaTsKKwkJc3RydWN0IG9zX3RpbWUgbm93OworCQlvc19nZXRfdGltZSgmbm93KTsKIAkJZm9yIChpID0gMDsgaSA8IGRydi0+bnVtX3NjYW5yZXM7IGkrKykgewogCQkJc3RydWN0IHdwYV9zY2FuX3JlcyAqYnNzID0gZHJ2LT5zY2FucmVzW2ldOwogCQkJaWYgKHAycF9zY2FuX3Jlc19oYW5kbGVyKGRydi0+cDJwLCBic3MtPmJzc2lkLAotCQkJCQkJIGJzcy0+ZnJlcSwgYnNzLT5sZXZlbCwKKwkJCQkJCSBic3MtPmZyZXEsICZub3csIGJzcy0+bGV2ZWwsCiAJCQkJCQkgKGNvbnN0IHU4ICopIChic3MgKyAxKSwKIAkJCQkJCSBic3MtPmllX2xlbikgPiAwKQogCQkJCXJldHVybjsKQEAgLTE3MTQsMjAgKzE3MTYsNiBAQAogfQogCiAKLXN0YXRpYyBpbnQgd3BhX2RyaXZlcl90ZXN0X2Rpc2Fzc29jaWF0ZSh2b2lkICpwcml2LCBjb25zdCB1OCAqYWRkciwKLQkJCQkJaW50IHJlYXNvbl9jb2RlKQotewotCXN0cnVjdCB0ZXN0X2RyaXZlcl9ic3MgKmRic3MgPSBwcml2OwotCXN0cnVjdCB3cGFfZHJpdmVyX3Rlc3RfZGF0YSAqZHJ2ID0gZGJzcy0+ZHJ2OwotCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXMgYWRkcj0iIE1BQ1NUUiAiIHJlYXNvbl9jb2RlPSVkIiwKLQkJICAgX19mdW5jX18sIE1BQzJTVFIoYWRkciksIHJlYXNvbl9jb2RlKTsKLQlvc19tZW1zZXQoZGJzcy0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKLQlkcnYtPmFzc29jaWF0ZWQgPSAwOwotCXdwYV9zdXBwbGljYW50X2V2ZW50KGRydi0+Y3R4LCBFVkVOVF9ESVNBU1NPQywgTlVMTCk7Ci0JcmV0dXJuIHdwYV9kcml2ZXJfdGVzdF9zZW5kX2Rpc2Fzc29jKGRydik7Ci19Ci0KLQogc3RhdGljIGNvbnN0IHU4ICogd3BhX3NjYW5fZ2V0X2llKGNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcywgdTggaWUpCiB7CiAJY29uc3QgdTggKmVuZCwgKnBvczsKQEAgLTI4NzAsNyArMjg1OCw3IEBACiAJCXJldHVybiAtMTsKIAlyZXR1cm4gcDJwX2Nvbm5lY3QoZHJ2LT5wMnAsIHBlZXJfYWRkciwgd3BzX21ldGhvZCwgZ29faW50ZW50LAogCQkJICAgb3duX2ludGVyZmFjZV9hZGRyLCBmb3JjZV9mcmVxLCBwZXJzaXN0ZW50X2dyb3VwLAotCQkJICAgTlVMTCwgMCwgMCk7CisJCQkgICBOVUxMLCAwLCAwLCAwKTsKIH0KIAogCkBAIC0zMjk5LDcgKzMyODcsNiBAQAogCS5kZWluaXQgPSB3cGFfZHJpdmVyX3Rlc3RfZGVpbml0LAogCS5zZXRfcGFyYW0gPSB3cGFfZHJpdmVyX3Rlc3Rfc2V0X3BhcmFtLAogCS5kZWF1dGhlbnRpY2F0ZSA9IHdwYV9kcml2ZXJfdGVzdF9kZWF1dGhlbnRpY2F0ZSwKLQkuZGlzYXNzb2NpYXRlID0gd3BhX2RyaXZlcl90ZXN0X2Rpc2Fzc29jaWF0ZSwKIAkuYXNzb2NpYXRlID0gd3BhX2RyaXZlcl90ZXN0X2Fzc29jaWF0ZSwKIAkuZ2V0X2NhcGEgPSB3cGFfZHJpdmVyX3Rlc3RfZ2V0X2NhcGEsCiAJLmdldF9tYWNfYWRkciA9IHdwYV9kcml2ZXJfdGVzdF9nZXRfbWFjX2FkZHIsCmRpZmYgLS1naXQgYS9zcmMvZHJpdmVycy9kcml2ZXJfd2V4dC5jIGIvc3JjL2RyaXZlcnMvZHJpdmVyX3dleHQuYwppbmRleCBiZDM3Y2ExLi45NzMzZTAxIDEwMDY0NAotLS0gYS9zcmMvZHJpdmVycy9kcml2ZXJfd2V4dC5jCisrKyBiL3NyYy9kcml2ZXJzL2RyaXZlcl93ZXh0LmMKQEAgLTE5MzgsMTggKzE5MzgsNiBAQAogfQogCiAKLXN0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X2Rpc2Fzc29jaWF0ZSh2b2lkICpwcml2LCBjb25zdCB1OCAqYWRkciwKLQkJCQkJaW50IHJlYXNvbl9jb2RlKQotewotCXN0cnVjdCB3cGFfZHJpdmVyX3dleHRfZGF0YSAqZHJ2ID0gcHJpdjsKLQlpbnQgcmV0OwotCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXMiLCBfX0ZVTkNUSU9OX18pOwotCXJldCA9IHdwYV9kcml2ZXJfd2V4dF9tbG1lKGRydiwgYWRkciwgSVdfTUxNRV9ESVNBU1NPQywgcmVhc29uX2NvZGUpOwotCXdwYV9kcml2ZXJfd2V4dF9kaXNjb25uZWN0KGRydik7Ci0JcmV0dXJuIHJldDsKLX0KLQotCiBzdGF0aWMgaW50IHdwYV9kcml2ZXJfd2V4dF9zZXRfZ2VuX2llKHZvaWQgKnByaXYsIGNvbnN0IHU4ICppZSwKIAkJCQkgICAgICBzaXplX3QgaWVfbGVuKQogewpAQCAtMjQ4NSw3ICsyNDczLDYgQEAKIAkuc2NhbjIgPSB3cGFfZHJpdmVyX3dleHRfc2NhbiwKIAkuZ2V0X3NjYW5fcmVzdWx0czIgPSB3cGFfZHJpdmVyX3dleHRfZ2V0X3NjYW5fcmVzdWx0cywKIAkuZGVhdXRoZW50aWNhdGUgPSB3cGFfZHJpdmVyX3dleHRfZGVhdXRoZW50aWNhdGUsCi0JLmRpc2Fzc29jaWF0ZSA9IHdwYV9kcml2ZXJfd2V4dF9kaXNhc3NvY2lhdGUsCiAJLmFzc29jaWF0ZSA9IHdwYV9kcml2ZXJfd2V4dF9hc3NvY2lhdGUsCiAJLmluaXQgPSB3cGFfZHJpdmVyX3dleHRfaW5pdCwKIAkuZGVpbml0ID0gd3BhX2RyaXZlcl93ZXh0X2RlaW5pdCwKZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL2RyaXZlcnMuYyBiL3NyYy9kcml2ZXJzL2RyaXZlcnMuYwppbmRleCBhOTJlZGRmLi4xZDBmZjZlIDEwMDY0NAotLS0gYS9zcmMvZHJpdmVycy9kcml2ZXJzLmMKKysrIGIvc3JjL2RyaXZlcnMvZHJpdmVycy5jCkBAIC0yNCw2ICsyNCw5IEBACiAjaWZkZWYgQ09ORklHX0RSSVZFUl9CU0QKIGV4dGVybiBzdHJ1Y3Qgd3BhX2RyaXZlcl9vcHMgd3BhX2RyaXZlcl9ic2Rfb3BzOyAvKiBkcml2ZXJfYnNkLmMgKi8KICNlbmRpZiAvKiBDT05GSUdfRFJJVkVSX0JTRCAqLworI2lmZGVmIENPTkZJR19EUklWRVJfT1BFTkJTRAorZXh0ZXJuIHN0cnVjdCB3cGFfZHJpdmVyX29wcyB3cGFfZHJpdmVyX29wZW5ic2Rfb3BzOyAvKiBkcml2ZXJfb3BlbmJzZC5jICovCisjZW5kaWYgLyogQ09ORklHX0RSSVZFUl9PUEVOQlNEICovCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9ORElTCiBleHRlcm4gc3RydWN0IHdwYV9kcml2ZXJfb3BzIHdwYV9kcml2ZXJfbmRpc19vcHM7IC8qIGRyaXZlcl9uZGlzLmMgKi8KICNlbmRpZiAvKiBDT05GSUdfRFJJVkVSX05ESVMgKi8KQEAgLTYyLDYgKzY1LDkgQEAKICNpZmRlZiBDT05GSUdfRFJJVkVSX0JTRAogCSZ3cGFfZHJpdmVyX2JzZF9vcHMsCiAjZW5kaWYgLyogQ09ORklHX0RSSVZFUl9CU0QgKi8KKyNpZmRlZiBDT05GSUdfRFJJVkVSX09QRU5CU0QKKwkmd3BhX2RyaXZlcl9vcGVuYnNkX29wcywKKyNlbmRpZiAvKiBDT05GSUdfRFJJVkVSX09QRU5CU0QgKi8KICNpZmRlZiBDT05GSUdfRFJJVkVSX05ESVMKIAkmd3BhX2RyaXZlcl9uZGlzX29wcywKICNlbmRpZiAvKiBDT05GSUdfRFJJVkVSX05ESVMgKi8KZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL2RyaXZlcnMubWFrIGIvc3JjL2RyaXZlcnMvZHJpdmVycy5tYWsKaW5kZXggYzdhOThkMy4uNjhmZjkxMCAxMDA2NDQKLS0tIGEvc3JjL2RyaXZlcnMvZHJpdmVycy5tYWsKKysrIGIvc3JjL2RyaXZlcnMvZHJpdmVycy5tYWsKQEAgLTU1LDYgKzU1LDE0IEBACiBDT05GSUdfRE5FVF9QQ0FQPXkKIGVuZGlmCiAKK2lmZGVmIENPTkZJR19EUklWRVJfT1BFTkJTRAoraWZuZGVmIENPTkZJR19MMl9QQUNLRVQKK0NPTkZJR19MMl9QQUNLRVQ9ZnJlZWJzZAorZW5kaWYKK0RSVl9DRkxBR1MgKz0gLURDT05GSUdfRFJJVkVSX09QRU5CU0QKK0RSVl9PQkpTICs9IC4uL3NyYy9kcml2ZXJzL2RyaXZlcl9vcGVuYnNkLm8KK2VuZGlmCisKIGlmZGVmIENPTkZJR19EUklWRVJfVEVTVAogRFJWX0NGTEFHUyArPSAtRENPTkZJR19EUklWRVJfVEVTVAogRFJWX09CSlMgKz0gLi4vc3JjL2RyaXZlcnMvZHJpdmVyX3Rlc3QubwpkaWZmIC0tZ2l0IGEvc3JjL2RyaXZlcnMvZHJpdmVycy5tayBiL3NyYy9kcml2ZXJzL2RyaXZlcnMubWsKaW5kZXggMjNmY2JiNy4uZGI4NTYxYSAxMDA2NDQKLS0tIGEvc3JjL2RyaXZlcnMvZHJpdmVycy5taworKysgYi9zcmMvZHJpdmVycy9kcml2ZXJzLm1rCkBAIC01NSw2ICs1NSwxNCBAQAogQ09ORklHX0RORVRfUENBUD15CiBlbmRpZgogCitpZmRlZiBDT05GSUdfRFJJVkVSX09QRU5CU0QKK2lmbmRlZiBDT05GSUdfTDJfUEFDS0VUCitDT05GSUdfTDJfUEFDS0VUPWZyZWVic2QKK2VuZGlmCitEUlZfQ0ZMQUdTICs9IC1EQ09ORklHX0RSSVZFUl9PUEVOQlNECitEUlZfT0JKUyArPSBzcmMvZHJpdmVycy9kcml2ZXJfb3BlbmJzZC5jCitlbmRpZgorCiBpZmRlZiBDT05GSUdfRFJJVkVSX1RFU1QKIERSVl9DRkxBR1MgKz0gLURDT05GSUdfRFJJVkVSX1RFU1QKIERSVl9PQkpTICs9IHNyYy9kcml2ZXJzL2RyaXZlcl90ZXN0LmMKZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL25ldGxpbmsuYyBiL3NyYy9kcml2ZXJzL25ldGxpbmsuYwppbmRleCBkZDY2MmYzLi42YzYwNTUwIDEwMDY0NAotLS0gYS9zcmMvZHJpdmVycy9uZXRsaW5rLmMKKysrIGIvc3JjL2RyaXZlcnMvbmV0bGluay5jCkBAIC05Nyw4ICs5Nyw2IEBACiAJaWYgKG5ldGxpbmsgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQluZXRsaW5rLT5jZmcgPSBjZmc7Ci0KIAluZXRsaW5rLT5zb2NrID0gc29ja2V0KFBGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX1JPVVRFKTsKIAlpZiAobmV0bGluay0+c29jayA8IDApIHsKIAkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJuZXRsaW5rOiBGYWlsZWQgdG8gb3BlbiBuZXRsaW5rICIKQEAgLTEyMSw2ICsxMTksOCBAQAogCWVsb29wX3JlZ2lzdGVyX3JlYWRfc29jayhuZXRsaW5rLT5zb2NrLCBuZXRsaW5rX3JlY2VpdmUsIG5ldGxpbmssCiAJCQkJIE5VTEwpOwogCisJbmV0bGluay0+Y2ZnID0gY2ZnOworCiAJcmV0dXJuIG5ldGxpbms7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL25sODAyMTFfY29weS5oIGIvc3JjL2RyaXZlcnMvbmw4MDIxMV9jb3B5LmgKaW5kZXggMmYzODc4OC4uYzQ2YmIwMSAxMDA2NDQKLS0tIGEvc3JjL2RyaXZlcnMvbmw4MDIxMV9jb3B5LmgKKysrIGIvc3JjL2RyaXZlcnMvbmw4MDIxMV9jb3B5LmgKQEAgLTExOCw4ICsxMTgsOSBAQAogICoJdG8gZ2V0IGEgbGlzdCBvZiBhbGwgcHJlc2VudCB3aXBoeXMuCiAgKiBATkw4MDIxMV9DTURfU0VUX1dJUEhZOiBzZXQgd2lwaHkgcGFyYW1ldGVycywgbmVlZHMgJU5MODAyMTFfQVRUUl9XSVBIWSBvcgogICoJJU5MODAyMTFfQVRUUl9JRklOREVYOyBjYW4gYmUgdXNlZCB0byBzZXQgJU5MODAyMTFfQVRUUl9XSVBIWV9OQU1FLAotICoJJU5MODAyMTFfQVRUUl9XSVBIWV9UWFFfUEFSQU1TLCAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEsCi0gKgklTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRSwgJU5MODAyMTFfQVRUUl9XSVBIWV9SRVRSWV9TSE9SVCwKKyAqCSVOTDgwMjExX0FUVFJfV0lQSFlfVFhRX1BBUkFNUywgJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIChhbmQgdGhlCisgKglhdHRyaWJ1dGVzIGRldGVybWluaW5nIHRoZSBjaGFubmVsIHdpZHRoOyB0aGlzIGlzIHVzZWQgZm9yIHNldHRpbmcKKyAqCW1vbml0b3IgbW9kZSBjaGFubmVsKSwgICVOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfU0hPUlQsCiAgKgklTkw4MDIxMV9BVFRSX1dJUEhZX1JFVFJZX0xPTkcsICVOTDgwMjExX0FUVFJfV0lQSFlfRlJBR19USFJFU0hPTEQsCiAgKglhbmQvb3IgJU5MODAyMTFfQVRUUl9XSVBIWV9SVFNfVEhSRVNIT0xELgogICoJSG93ZXZlciwgZm9yIHNldHRpbmcgdGhlIGNoYW5uZWwsIHNlZSAlTkw4MDIxMV9DTURfU0VUX0NIQU5ORUwKQEAgLTE2OSw5ICsxNzAsMTAgQEAKICAqCSVOTDgwMjExX0FUVFJfSElEREVOX1NTSUQsICVOTDgwMjExX0FUVFJfQ0lQSEVSU19QQUlSV0lTRSwKICAqCSVOTDgwMjExX0FUVFJfQ0lQSEVSX0dST1VQLCAlTkw4MDIxMV9BVFRSX1dQQV9WRVJTSU9OUywKICAqCSVOTDgwMjExX0FUVFJfQUtNX1NVSVRFUywgJU5MODAyMTFfQVRUUl9QUklWQUNZLAotICoJJU5MODAyMTFfQVRUUl9BVVRIX1RZUEUgYW5kICVOTDgwMjExX0FUVFJfSU5BQ1RJVklUWV9USU1FT1VULgorICoJJU5MODAyMTFfQVRUUl9BVVRIX1RZUEUsICVOTDgwMjExX0FUVFJfSU5BQ1RJVklUWV9USU1FT1VULAorICoJJU5MODAyMTFfQVRUUl9BQ0xfUE9MSUNZIGFuZCAlTkw4MDIxMV9BVFRSX01BQ19BRERSUy4KICAqCVRoZSBjaGFubmVsIHRvIHVzZSBjYW4gYmUgc2V0IG9uIHRoZSBpbnRlcmZhY2Ugb3IgYmUgZ2l2ZW4gdXNpbmcgdGhlCi0gKgklTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEgYW5kICVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFIGF0dHJzLgorICoJJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIGFuZCB0aGUgYXR0cmlidXRlcyBkZXRlcm1pbmluZyBjaGFubmVsIHdpZHRoLgogICogQE5MODAyMTFfQ01EX05FV19CRUFDT046IG9sZCBhbGlhcyBmb3IgJU5MODAyMTFfQ01EX1NUQVJUX0FQCiAgKiBATkw4MDIxMV9DTURfU1RPUF9BUDogU3RvcCBBUCBvcGVyYXRpb24gb24gdGhlIGdpdmVuIGludGVyZmFjZQogICogQE5MODAyMTFfQ01EX0RFTF9CRUFDT046IG9sZCBhbGlhcyBmb3IgJU5MODAyMTFfQ01EX1NUT1BfQVAKQEAgLTM3Myw4ICszNzUsOCBAQAogICoJcmVxdWVzdHMgdG8gY29ubmVjdCB0byBhIHNwZWNpZmllZCBuZXR3b3JrIGJ1dCB3aXRob3V0IHNlcGFyYXRpbmcKICAqCWF1dGggYW5kIGFzc29jIHN0ZXBzLiBGb3IgdGhpcywgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgU1NJRCBpbiBhCiAgKgklTkw4MDIxMV9BVFRSX1NTSUQgYXR0cmlidXRlLCBhbmQgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYXNzb2NpYXRpb24KLSAqCUlFcyBpbiAlTkw4MDIxMV9BVFRSX0lFLCAlTkw4MDIxMV9BVFRSX0FVVEhfVFlQRSwgJU5MODAyMTFfQVRUUl9NQUMsCi0gKgklTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEsICVOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JULAorICoJSUVzIGluICVOTDgwMjExX0FUVFJfSUUsICVOTDgwMjExX0FUVFJfQVVUSF9UWVBFLCAlTkw4MDIxMV9BVFRSX1VTRV9NRlAsCisgKgklTkw4MDIxMV9BVFRSX01BQywgJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLCAlTkw4MDIxMV9BVFRSX0NPTlRST0xfUE9SVCwKICAqCSVOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX0VUSEVSVFlQRSBhbmQKICAqCSVOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX05PX0VOQ1JZUFQuCiAgKglCYWNrZ3JvdW5kIHNjYW4gcGVyaW9kIGNhbiBvcHRpb25hbGx5IGJlCkBAIC00MDEsOCArNDAzLDcgQEAKICAqCWEgcmVzcG9uc2Ugd2hpbGUgYmVpbmcgYXNzb2NpYXRlZCB0byBhbiBBUCBvbiBhbm90aGVyIGNoYW5uZWwuCiAgKgklTkw4MDIxMV9BVFRSX0lGSU5ERVggaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGludGVyZmFjZSAoYW5kIHRodXMKICAqCXJhZGlvKSBpcyB1c2VkLiAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotICoJZnJlcXVlbmN5IGZvciB0aGUgb3BlcmF0aW9uIGFuZCAlTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRSBtYXkgYmUKLSAqCW9wdGlvbmFsbHkgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgY2hhbm5lbCBwYXJhbWV0ZXJzLgorICoJZnJlcXVlbmN5IGZvciB0aGUgb3BlcmF0aW9uLgogICoJJU5MODAyMTFfQVRUUl9EVVJBVElPTiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcwogICoJdG8gcmVtYWluIG9uIHRoZSBjaGFubmVsLiBUaGlzIGNvbW1hbmQgaXMgYWxzbyB1c2VkIGFzIGFuIGV2ZW50IHRvCiAgKglub3RpZnkgd2hlbiB0aGUgcmVxdWVzdGVkIGR1cmF0aW9uIHN0YXJ0cyAoaXQgbWF5IHRha2UgYSB3aGlsZSBmb3IgdGhlCkBAIC00NDAsMTIgKzQ0MSwxMSBAQAogICoJYXMgYW4gZXZlbnQgaW5kaWNhdGluZyByZWNlcHRpb24gb2YgYSBmcmFtZSB0aGF0IHdhcyBub3QgcHJvY2Vzc2VkIGluCiAgKglrZXJuZWwgY29kZSwgYnV0IGlzIGZvciB1cyAoaS5lLiwgd2hpY2ggbWF5IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGluIGEKICAqCXVzZXIgc3BhY2UgYXBwbGljYXRpb24pLiAlTkw4MDIxMV9BVFRSX0ZSQU1FIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKLSAqCWZyYW1lIGNvbnRlbnRzIChpbmNsdWRpbmcgaGVhZGVyKS4gJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIChhbmQKLSAqCW9wdGlvbmFsbHkgJU5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUpIGlzIHVzZWQgdG8gaW5kaWNhdGUgb24KLSAqCXdoaWNoIGNoYW5uZWwgdGhlIGZyYW1lIGlzIHRvIGJlIHRyYW5zbWl0dGVkIG9yIHdhcyByZWNlaXZlZC4gSWYgdGhpcwotICoJY2hhbm5lbCBpcyBub3QgdGhlIGN1cnJlbnQgY2hhbm5lbCAocmVtYWluLW9uLWNoYW5uZWwgb3IgdGhlCi0gKglvcGVyYXRpb25hbCBjaGFubmVsKSB0aGUgZGV2aWNlIHdpbGwgc3dpdGNoIHRvIHRoZSBnaXZlbiBjaGFubmVsIGFuZAotICoJdHJhbnNtaXQgdGhlIGZyYW1lLCBvcHRpb25hbGx5IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZm9yIHRoZSB0aW1lCisgKglmcmFtZSBjb250ZW50cyAoaW5jbHVkaW5nIGhlYWRlcikuICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSBpcyB1c2VkCisgKgl0byBpbmRpY2F0ZSBvbiB3aGljaCBjaGFubmVsIHRoZSBmcmFtZSBpcyB0byBiZSB0cmFuc21pdHRlZCBvciB3YXMKKyAqCXJlY2VpdmVkLiBJZiB0aGlzIGNoYW5uZWwgaXMgbm90IHRoZSBjdXJyZW50IGNoYW5uZWwgKHJlbWFpbi1vbi1jaGFubmVsCisgKglvciB0aGUgb3BlcmF0aW9uYWwgY2hhbm5lbCkgdGhlIGRldmljZSB3aWxsIHN3aXRjaCB0byB0aGUgZ2l2ZW4gY2hhbm5lbAorICoJYW5kIHRyYW5zbWl0IHRoZSBmcmFtZSwgb3B0aW9uYWxseSB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIGZvciB0aGUgdGltZQogICoJc3BlY2lmaWVkIHVzaW5nICVOTDgwMjExX0FUVFJfRFVSQVRJT04uIFdoZW4gY2FsbGVkLCB0aGlzIG9wZXJhdGlvbgogICoJcmV0dXJucyBhIGNvb2tpZSAoJU5MODAyMTFfQVRUUl9DT09LSUUpIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZQogICoJVFggc3RhdHVzIGV2ZW50IHBlcnRhaW5pbmcgdG8gdGhlIFRYIHJlcXVlc3QuCkBAIC00NzMsOCArNDczLDggQEAKICAqCWNvbW1hbmQgaXMgdXNlZCBhcyBhbiBldmVudCB0byBpbmRpY2F0ZSB0aGUgdGhhdCBhIHRyaWdnZXIgbGV2ZWwgd2FzCiAgKglyZWFjaGVkLgogICogQE5MODAyMTFfQ01EX1NFVF9DSEFOTkVMOiBTZXQgdGhlIGNoYW5uZWwgKHVzaW5nICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUQotICoJYW5kICVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFKSB0aGUgZ2l2ZW4gaW50ZXJmYWNlIChpZGVudGlmZWQKLSAqCWJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWCkgc2hhbGwgb3BlcmF0ZSBvbi4KKyAqCWFuZCB0aGUgYXR0cmlidXRlcyBkZXRlcm1pbmluZyBjaGFubmVsIHdpZHRoKSB0aGUgZ2l2ZW4gaW50ZXJmYWNlCisgKgkoaWRlbnRpZmVkIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWCkgc2hhbGwgb3BlcmF0ZSBvbi4KICAqCUluIGNhc2UgbXVsdGlwbGUgY2hhbm5lbHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLCB0aGUgbWVjaGFuaXNtCiAgKgl3aXRoIHdoaWNoIGl0IHN3aXRjaGVzIGNoYW5uZWxzIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCiAgKglXaGVuIGEgbW9uaXRvciBpbnRlcmZhY2UgaXMgZ2l2ZW4sIGl0IGNhbiBvbmx5IHN3aXRjaCBjaGFubmVsIHdoaWxlCkBAIC01MTMsNiArNTEzLDEyIEBACiAgKgljb21tYW5kIHdpdGggdGhlICVOTDgwMjExX0FUVFJfV09XTEFOX1RSSUdHRVJTIGF0dHJpYnV0ZS4gRm9yCiAgKgltb3JlIGJhY2tncm91bmQgaW5mb3JtYXRpb24sIHNlZQogICoJaHR0cDovL3dpcmVsZXNzLmtlcm5lbC5vcmcvZW4vdXNlcnMvRG9jdW1lbnRhdGlvbi9Xb1dMQU4uCisgKglUaGUgQE5MODAyMTFfQ01EX1NFVF9XT1dMQU4gY29tbWFuZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgbm90aWZpY2F0aW9uCisgKglmcm9tIHRoZSBkcml2ZXIgcmVwb3J0aW5nIHRoZSB3YWtldXAgcmVhc29uLiBJbiB0aGlzIGNhc2UsIHRoZQorICoJQE5MODAyMTFfQVRUUl9XT1dMQU5fVFJJR0dFUlMgYXR0cmlidXRlIHdpbGwgY29udGFpbiB0aGUgcmVhc29uCisgKglmb3IgdGhlIHdha2V1cCwgaWYgaXQgd2FzIGNhdXNlZCBieSB3aXJlbGVzcy4gSWYgaXQgaXMgbm90IHByZXNlbnQKKyAqCWluIHRoZSB3YWtldXAgbm90aWZpY2F0aW9uLCB0aGUgd2lyZWxlc3MgZGV2aWNlIGRpZG4ndCBjYXVzZSB0aGUKKyAqCXdha2V1cCBidXQgcmVwb3J0cyB0aGF0IGl0IHdhcyB3b2tlbiB1cC4KICAqCiAgKiBATkw4MDIxMV9DTURfU0VUX1JFS0VZX09GRkxPQUQ6IFRoaXMgY29tbWFuZCBpcyB1c2VkIGdpdmUgdGhlIGRyaXZlcgogICoJdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3Igc3VwcG9ydGluZyBHVEsgcmVrZXkgb2ZmbG9hZC4gVGhpcwpAQCAtNTI2LDYgKzUzMiwxMiBAQAogICoJb2YgUE1LU0EgY2FjaGluZyBkYW5kaWRhdGVzLgogICoKICAqIEBOTDgwMjExX0NNRF9URExTX09QRVI6IFBlcmZvcm0gYSBoaWdoLWxldmVsIFRETFMgY29tbWFuZCAoZS5nLiBsaW5rIHNldHVwKS4KKyAqCUluIGFkZGl0aW9uLCB0aGlzIGNhbiBiZSB1c2VkIGFzIGFuIGV2ZW50IHRvIHJlcXVlc3QgdXNlcnNwYWNlIHRvIHRha2UKKyAqCWFjdGlvbnMgb24gVERMUyBsaW5rcyAoc2V0IHVwIGEgbmV3IGxpbmsgb3IgdGVhciBkb3duIGFuIGV4aXN0aW5nIG9uZSkuCisgKglJbiBzdWNoIGV2ZW50cywgJU5MODAyMTFfQVRUUl9URExTX09QRVJBVElPTiBpbmRpY2F0ZXMgdGhlIHJlcXVlc3RlZAorICoJb3BlcmF0aW9uLCAlTkw4MDIxMV9BVFRSX01BQyBjb250YWlucyB0aGUgcGVlciBNQUMgYWRkcmVzcywgYW5kCisgKgklTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFIHRoZSByZWFzb24gY29kZSB0byBiZSB1c2VkIChvbmx5IHdpdGgKKyAqCSVOTDgwMjExX1RETFNfVEVBUkRPV04pLgogICogQE5MODAyMTFfQ01EX1RETFNfTUdNVDogU2VuZCBhIFRETFMgbWFuYWdlbWVudCBmcmFtZS4KICAqCiAgKiBATkw4MDIxMV9DTURfVU5FWFBFQ1RFRF9GUkFNRTogVXNlZCBieSBhbiBhcHBsaWNhdGlvbiBjb250cm9sbGluZyBhbiBBUApAQCAtNTYyLDggKzU3NCw0MiBAQAogICoKICAqIEBOTDgwMjExX0NNRF9DSF9TV0lUQ0hfTk9USUZZOiBBbiBBUCBvciBHTyBtYXkgZGVjaWRlIHRvIHN3aXRjaCBjaGFubmVscwogICoJaW5kZXBlbmRlbnRseSBvZiB0aGUgdXNlcnNwYWNlIFNNRSwgc2VuZCB0aGlzIGV2ZW50IGluZGljYXRpbmcKLSAqCSVOTDgwMjExX0FUVFJfSUZJTkRFWCBpcyBub3cgb24gJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIHdpdGgKLSAqCSVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFLgorICoJJU5MODAyMTFfQVRUUl9JRklOREVYIGlzIG5vdyBvbiAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEgYW5kIHRoZQorICoJYXR0cmlidXRlcyBkZXRlcm1pbmluZyBjaGFubmVsIHdpZHRoLgorICoKKyAqIEBOTDgwMjExX0NNRF9TVEFSVF9QMlBfREVWSUNFOiBTdGFydCB0aGUgZ2l2ZW4gUDJQIERldmljZSwgaWRlbnRpZmllZCBieQorICoJaXRzICVOTDgwMjExX0FUVFJfV0RFViBpZGVudGlmaWVyLiBJdCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGgKKyAqCSVOTDgwMjExX0NNRF9ORVdfSU5URVJGQUNFIHByZXZpb3VzbHkuIEFmdGVyIGl0IGhhcyBiZWVuIHN0YXJ0ZWQsIHRoZQorICoJUDJQIERldmljZSBjYW4gYmUgdXNlZCBmb3IgUDJQIG9wZXJhdGlvbnMsIGUuZy4gcmVtYWluLW9uLWNoYW5uZWwgYW5kCisgKglwdWJsaWMgYWN0aW9uIGZyYW1lIFRYLgorICogQE5MODAyMTFfQ01EX1NUT1BfUDJQX0RFVklDRTogU3RvcCB0aGUgZ2l2ZW4gUDJQIERldmljZSwgaWRlbnRpZmllZCBieQorICoJaXRzICVOTDgwMjExX0FUVFJfV0RFViBpZGVudGlmaWVyLgorICoKKyAqIEBOTDgwMjExX0NNRF9DT05OX0ZBSUxFRDogY29ubmVjdGlvbiByZXF1ZXN0IHRvIGFuIEFQIGZhaWxlZDsgdXNlZCB0bworICoJbm90aWZ5IHVzZXJzcGFjZSB0aGF0IEFQIGhhcyByZWplY3RlZCB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGZyb20gYQorICoJc3RhdGlvbiwgZHVlIHRvIHBhcnRpY3VsYXIgcmVhc29uLiAlTkw4MDIxMV9BVFRSX0NPTk5fRkFJTEVEX1JFQVNPTgorICoJaXMgdXNlZCBmb3IgdGhpcy4KKyAqCisgKiBATkw4MDIxMV9DTURfU0VUX01DQVNUX1JBVEU6IENoYW5nZSB0aGUgcmF0ZSB1c2VkIHRvIHNlbmQgbXVsdGljYXN0IGZyYW1lcworICoJZm9yIElCU1Mgb3IgTUVTSCB2aWYuCisgKgorICogQE5MODAyMTFfQ01EX1NFVF9NQUNfQUNMOiBzZXRzIEFDTCBmb3IgTUFDIGFkZHJlc3MgYmFzZWQgYWNjZXNzIGNvbnRyb2wuCisgKglUaGlzIGlzIHRvIGJlIHVzZWQgd2l0aCB0aGUgZHJpdmVycyBhZHZlcnRpc2luZyB0aGUgc3VwcG9ydCBvZiBNQUMKKyAqCWFkZHJlc3MgYmFzZWQgYWNjZXNzIGNvbnRyb2wuIExpc3Qgb2YgTUFDIGFkZHJlc3NlcyBpcyBwYXNzZWQgaW4KKyAqCSVOTDgwMjExX0FUVFJfTUFDX0FERFJTIGFuZCBBQ0wgcG9saWN5IGlzIHBhc3NlZCBpbgorICoJJU5MODAyMTFfQVRUUl9BQ0xfUE9MSUNZLiBEcml2ZXIgd2lsbCBlbmFibGUgQUNMIHdpdGggdGhpcyBsaXN0LCBpZiBpdAorICoJaXMgbm90IGFscmVhZHkgZG9uZS4gVGhlIG5ldyBsaXN0IHdpbGwgcmVwbGFjZSBhbnkgZXhpc3RpbmcgbGlzdC4gRHJpdmVyCisgKgl3aWxsIGNsZWFyIGl0cyBBQ0wgd2hlbiB0aGUgbGlzdCBvZiBNQUMgYWRkcmVzc2VzIHBhc3NlZCBpcyBlbXB0eS4gVGhpcworICoJY29tbWFuZCBpcyB1c2VkIGluIEFQL1AyUCBHTyBtb2RlLiBEcml2ZXIgaGFzIHRvIG1ha2Ugc3VyZSB0byBjbGVhciBpdHMKKyAqCUFDTCBsaXN0IGR1cmluZyAlTkw4MDIxMV9DTURfU1RPUF9BUC4KKyAqCisgKiBATkw4MDIxMV9DTURfUkFEQVJfREVURUNUOiBTdGFydCBhIENoYW5uZWwgYXZhaWxhYmlsaXR5IGNoZWNrIChDQUMpLiBPbmNlCisgKglhIHJhZGFyIGlzIGRldGVjdGVkIG9yIHRoZSBjaGFubmVsIGF2YWlsYWJpbGl0eSBzY2FuIChDQUMpIGhhcyBmaW5pc2hlZAorICoJb3Igd2FzIGFib3J0ZWQsIG9yIGEgcmFkYXIgd2FzIGRldGVjdGVkLCB1c2VybW9kZSB3aWxsIGJlIG5vdGlmaWVkIHdpdGgKKyAqCXRoaXMgZXZlbnQuIFRoaXMgY29tbWFuZCBpcyBhbHNvIHVzZWQgdG8gbm90aWZ5IHVzZXJzcGFjZSBhYm91dCByYWRhcnMKKyAqCXdoaWxlIG9wZXJhdGluZyBvbiB0aGlzIGNoYW5uZWwuCisgKgklTkw4MDIxMV9BVFRSX1JBREFSX0VWRU5UIGlzIHVzZWQgdG8gaW5mb3JtIGFib3V0IHRoZSB0eXBlIG9mIHRoZQorICoJZXZlbnQuCiAgKgogICogQE5MODAyMTFfQ01EX01BWDogaGlnaGVzdCB1c2VkIGNvbW1hbmQgbnVtYmVyCiAgKiBAX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKQEAgLTcwOCw2ICs3NTQsMTcgQEAKIAogCU5MODAyMTFfQ01EX0NIX1NXSVRDSF9OT1RJRlksCiAKKwlOTDgwMjExX0NNRF9TVEFSVF9QMlBfREVWSUNFLAorCU5MODAyMTFfQ01EX1NUT1BfUDJQX0RFVklDRSwKKworCU5MODAyMTFfQ01EX0NPTk5fRkFJTEVELAorCisJTkw4MDIxMV9DTURfU0VUX01DQVNUX1JBVEUsCisKKwlOTDgwMjExX0NNRF9TRVRfTUFDX0FDTCwKKworCU5MODAyMTFfQ01EX1JBREFSX0RFVEVDVCwKKwogCS8qIGFkZCBuZXcgY29tbWFuZHMgYWJvdmUgaGVyZSAqLwogCiAJLyogdXNlZCB0byBkZWZpbmUgTkw4MDIxMV9DTURfTUFYIGJlbG93ICovCkBAIC03NDQsMTQgKzgwMSwyNiBAQAogICoJL3N5cy9jbGFzcy9pZWVlODAyMTEvPHBoeW5hbWU+L2luZGV4CiAgKiBATkw4MDIxMV9BVFRSX1dJUEhZX05BTUU6IHdpcGh5IG5hbWUgKHVzZWQgZm9yIHJlbmFtaW5nKQogICogQE5MODAyMTFfQVRUUl9XSVBIWV9UWFFfUEFSQU1TOiBhIG5lc3RlZCBhcnJheSBvZiBUWCBxdWV1ZSBwYXJhbWV0ZXJzCi0gKiBATkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVE6IGZyZXF1ZW5jeSBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBpbiBNSHoKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUTogZnJlcXVlbmN5IG9mIHRoZSBzZWxlY3RlZCBjaGFubmVsIGluIE1IeiwKKyAqCWRlZmluZXMgdGhlIGNoYW5uZWwgdG9nZXRoZXIgd2l0aCB0aGUgKGRlcHJlY2F0ZWQpCisgKgklTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRSBhdHRyaWJ1dGUgb3IgdGhlIGF0dHJpYnV0ZXMKKyAqCSVOTDgwMjExX0FUVFJfQ0hBTk5FTF9XSURUSCBhbmQgaWYgbmVlZGVkICVOTDgwMjExX0FUVFJfQ0VOVEVSX0ZSRVExCisgKglhbmQgJU5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTIKKyAqIEBOTDgwMjExX0FUVFJfQ0hBTk5FTF9XSURUSDogdTMyIGF0dHJpYnV0ZSBjb250YWluaW5nIG9uZSBvZiB0aGUgdmFsdWVzCisgKglvZiAmZW51bSBubDgwMjExX2NoYW5fd2lkdGgsIGRlc2NyaWJpbmcgdGhlIGNoYW5uZWwgd2lkdGguIFNlZSB0aGUKKyAqCWRvY3VtZW50YXRpb24gb2YgdGhlIGVudW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKiBATkw4MDIxMV9BVFRSX0NFTlRFUl9GUkVRMTogQ2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgZmlyc3QgcGFydCBvZiB0aGUKKyAqCWNoYW5uZWwsIHVzZWQgZm9yIGFueXRoaW5nIGJ1dCAyMCBNSHogYmFuZHdpZHRoCisgKiBATkw4MDIxMV9BVFRSX0NFTlRFUl9GUkVRMjogQ2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlCisgKgljaGFubmVsLCB1c2VkIG9ubHkgZm9yIDgwKzgwIE1IeiBiYW5kd2lkdGgKICAqIEBOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFOiBpbmNsdWRlZCB3aXRoIE5MODAyMTFfQVRUUl9XSVBIWV9GUkVRCi0gKglpZiBIVDIwIG9yIEhUNDAgYXJlIGFsbG93ZWQgKGkuZS4sIDgwMi4xMW4gZGlzYWJsZWQgaWYgbm90IGluY2x1ZGVkKToKKyAqCWlmIEhUMjAgb3IgSFQ0MCBhcmUgdG8gYmUgdXNlZCAoaS5lLiwgSFQgZGlzYWJsZWQgaWYgbm90IGluY2x1ZGVkKToKICAqCU5MODAyMTFfQ0hBTl9OT19IVCA9IEhUIG5vdCBhbGxvd2VkIChpLmUuLCBzYW1lIGFzIG5vdCBpbmNsdWRpbmcKICAqCQl0aGlzIGF0dHJpYnV0ZSkKICAqCU5MODAyMTFfQ0hBTl9IVDIwID0gSFQyMCBvbmx5CiAgKglOTDgwMjExX0NIQU5fSFQ0ME1JTlVTID0gc2Vjb25kYXJ5IGNoYW5uZWwgaXMgYmVsb3cgdGhlIHByaW1hcnkgY2hhbm5lbAogICoJTkw4MDIxMV9DSEFOX0hUNDBQTFVTID0gc2Vjb25kYXJ5IGNoYW5uZWwgaXMgYWJvdmUgdGhlIHByaW1hcnkgY2hhbm5lbAorICoJVGhpcyBhdHRyaWJ1dGUgaXMgbm93IGRlcHJlY2F0ZWQuCiAgKiBATkw4MDIxMV9BVFRSX1dJUEhZX1JFVFJZX1NIT1JUOiBUWCByZXRyeSBsaW1pdCBmb3IgZnJhbWVzIHdob3NlIGxlbmd0aCBpcwogICoJbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBSVFMgdGhyZXNob2xkOyBhbGxvd2VkIHJhbmdlOiAxLi4yNTU7CiAgKglkb3QxMVNob3J0UmV0cnlMaW1pdDsgdTgKQEAgLTkxOCw3ICs5ODcsNyBAQAogICogQE5MODAyMTFfQVRUUl9VU0VfTUZQOiBXaGV0aGVyIG1hbmFnZW1lbnQgZnJhbWUgcHJvdGVjdGlvbiAoSUVFRSA4MDIuMTF3KSBpcwogICoJdXNlZCBmb3IgdGhlIGFzc29jaWF0aW9uICgmZW51bSBubDgwMjExX21mcCwgcmVwcmVzZW50ZWQgYXMgYSB1MzIpOwogICoJdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQKLSAqCXdpdGggJU5MODAyMTFfQ01EX0FTU09DSUFURSByZXF1ZXN0CisgKgl3aXRoICVOTDgwMjExX0NNRF9BU1NPQ0lBVEUgYW5kICVOTDgwMjExX0NNRF9DT05ORUNUIHJlcXVlc3RzCiAgKgogICogQE5MODAyMTFfQVRUUl9TVEFfRkxBR1MyOiBBdHRyaWJ1dGUgY29udGFpbmluZyBhCiAgKgkmc3RydWN0IG5sODAyMTFfc3RhX2ZsYWdfdXBkYXRlLgpAQCAtMTI1MSw2ICsxMzIwLDU0IEBACiAgKgl3YXMgdXNlZCB0byBwcm92aWRlIHRoZSBoaW50LiBGb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZgogICoJYWxsb3dlZCB1c2VyIHJlZ3VsYXRvcnkgaGludHMgc2VlIG5sODAyMTFfdXNlcl9yZWdfaGludF90eXBlLgogICoKKyAqIEBOTDgwMjExX0FUVFJfQ09OTl9GQUlMRURfUkVBU09OOiBUaGUgcmVhc29uIGZvciB3aGljaCBBUCBoYXMgcmVqZWN0ZWQKKyAqCXRoZSBjb25uZWN0aW9uIHJlcXVlc3QgZnJvbSBhIHN0YXRpb24uIG5sODAyMTFfY29ubmVjdF9mYWlsZWRfcmVhc29uCisgKgllbnVtIGhhcyBkaWZmZXJlbnQgcmVhc29ucyBvZiBjb25uZWN0aW9uIGZhaWx1cmUuCisgKgorICogQE5MODAyMTFfQVRUUl9TQUVfREFUQTogU0FFIGVsZW1lbnRzIGluIEF1dGhlbnRpY2F0aW9uIGZyYW1lcy4gVGhpcyBzdGFydHMKKyAqCXdpdGggdGhlIEF1dGhlbnRpY2F0aW9uIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlciBmaWVsZC4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1ZIVF9DQVBBQklMSVRZOiBWSFQgQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBlbGVtZW50IChmcm9tCisgKglhc3NvY2lhdGlvbiByZXF1ZXN0IHdoZW4gdXNlZCB3aXRoIE5MODAyMTFfQ01EX05FV19TVEFUSU9OKQorICoKKyAqIEBOTDgwMjExX0FUVFJfU0NBTl9GTEFHUzogc2NhbiByZXF1ZXN0IGNvbnRyb2wgZmxhZ3MgKHUzMikKKyAqCisgKiBATkw4MDIxMV9BVFRSX1AyUF9DVFdJTkRPVzogUDJQIEdPIENsaWVudCBUcmFmZmljIFdpbmRvdyAodTgpLCB1c2VkIHdpdGgKKyAqCXRoZSBTVEFSVF9BUCBhbmQgU0VUX0JTUyBjb21tYW5kcworICogQE5MODAyMTFfQVRUUl9QMlBfT1BQUFM6IFAyUCBHTyBvcHBvcnR1bmlzdGljIFBTICh1OCksIHVzZWQgd2l0aCB0aGUKKyAqCVNUQVJUX0FQIGFuZCBTRVRfQlNTIGNvbW1hbmRzLiBUaGlzIGNhbiBoYXZlIHRoZSB2YWx1ZXMgMCBvciAxOworICoJaWYgbm90IGdpdmVuIGluIFNUQVJUX0FQIDAgaXMgYXNzdW1lZCwgaWYgbm90IGdpdmVuIGluIFNFVF9CU1MKKyAqCW5vIGNoYW5nZSBpcyBtYWRlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTE9DQUxfTUVTSF9QT1dFUl9NT0RFOiBsb2NhbCBtZXNoIFNUQSBsaW5rLXNwZWNpZmljIHBvd2VyIG1vZGUKKyAqCWRlZmluZWQgaW4gJmVudW0gbmw4MDIxMV9tZXNoX3Bvd2VyX21vZGUuCisgKgorICogQE5MODAyMTFfQVRUUl9BQ0xfUE9MSUNZOiBBQ0wgcG9saWN5LCBzZWUgJmVudW0gbmw4MDIxMV9hY2xfcG9saWN5LAorICoJY2FycmllZCBpbiBhIHUzMiBhdHRyaWJ1dGUKKyAqCisgKiBATkw4MDIxMV9BVFRSX01BQ19BRERSUzogQXJyYXkgb2YgbmVzdGVkIE1BQyBhZGRyZXNzZXMsIHVzZWQgZm9yCisgKglNQUMgQUNMLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUFDX0FDTF9NQVg6IHUzMiBhdHRyaWJ1dGUgdG8gYWR2ZXJ0aXNlIHRoZSBtYXhpbXVtCisgKgludW1iZXIgb2YgTUFDIGFkZHJlc3NlcyB0aGF0IGEgZGV2aWNlIGNhbiBzdXBwb3J0IGZvciBNQUMKKyAqCUFDTC4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1JBREFSX0VWRU5UOiBUeXBlIG9mIHJhZGFyIGV2ZW50IGZvciBub3RpZmljYXRpb24gdG8gdXNlcnNwYWNlLAorICoJY29udGFpbnMgYSB2YWx1ZSBvZiBlbnVtIG5sODAyMTFfcmFkYXJfZXZlbnQgKHUzMikuCisgKgorICogQE5MODAyMTFfQVRUUl9FWFRfQ0FQQTogODAyLjExIGV4dGVuZGVkIGNhcGFiaWxpdGllcyB0aGF0IHRoZSBrZXJuZWwgZHJpdmVyCisgKgloYXMgYW5kIGhhbmRsZXMuIFRoZSBmb3JtYXQgaXMgdGhlIHNhbWUgYXMgdGhlIElFIGNvbnRlbnRzLiBTZWUKKyAqCTgwMi4xMS0yMDEyIDguNC4yLjI5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICogQE5MODAyMTFfQVRUUl9FWFRfQ0FQQV9NQVNLOiBFeHRlbmRlZCBjYXBhYmlsaXRpZXMgdGhhdCB0aGUga2VybmVsIGRyaXZlcgorICoJaGFzIHNldCBpbiB0aGUgJU5MODAyMTFfQVRUUl9FWFRfQ0FQQSB2YWx1ZSwgZm9yIG11bHRpYml0IGZpZWxkcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1NUQV9DQVBBQklMSVRZOiBTdGF0aW9uIGNhcGFiaWxpdGllcyAodTE2KSBhcmUgYWR2ZXJ0aXNlZCB0bworICoJdGhlIGRyaXZlciwgZS5nLiwgdG8gZW5hYmxlIFRETFMgcG93ZXIgc2F2ZSAoUFUtQVBTRCkuCisgKgorICogQE5MODAyMTFfQVRUUl9TVEFfRVhUX0NBUEFCSUxJVFk6IFN0YXRpb24gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzIGFyZQorICoJYWR2ZXJ0aXNlZCB0byB0aGUgZHJpdmVyLCBlLmcuLCB0byBlbmFibGUgVERMUyBvZmYgY2hhbm5lbCBvcGVyYXRpb25zCisgKglhbmQgUFUtQVBTRC4KKyAqCiAgKiBATkw4MDIxMV9BVFRSX01BWDogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCiAgKiBAX19OTDgwMjExX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KQEAgLTE1MDYsNiArMTYyMywzNyBAQAogCiAJTkw4MDIxMV9BVFRSX1VTRVJfUkVHX0hJTlRfVFlQRSwKIAorCU5MODAyMTFfQVRUUl9DT05OX0ZBSUxFRF9SRUFTT04sCisKKwlOTDgwMjExX0FUVFJfU0FFX0RBVEEsCisKKwlOTDgwMjExX0FUVFJfVkhUX0NBUEFCSUxJVFksCisKKwlOTDgwMjExX0FUVFJfU0NBTl9GTEFHUywKKworCU5MODAyMTFfQVRUUl9DSEFOTkVMX1dJRFRILAorCU5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTEsCisJTkw4MDIxMV9BVFRSX0NFTlRFUl9GUkVRMiwKKworCU5MODAyMTFfQVRUUl9QMlBfQ1RXSU5ET1csCisJTkw4MDIxMV9BVFRSX1AyUF9PUFBQUywKKworCU5MODAyMTFfQVRUUl9MT0NBTF9NRVNIX1BPV0VSX01PREUsCisKKwlOTDgwMjExX0FUVFJfQUNMX1BPTElDWSwKKworCU5MODAyMTFfQVRUUl9NQUNfQUREUlMsCisKKwlOTDgwMjExX0FUVFJfTUFDX0FDTF9NQVgsCisKKwlOTDgwMjExX0FUVFJfUkFEQVJfRVZFTlQsCisKKwlOTDgwMjExX0FUVFJfRVhUX0NBUEEsCisJTkw4MDIxMV9BVFRSX0VYVF9DQVBBX01BU0ssCisKKwlOTDgwMjExX0FUVFJfU1RBX0NBUEFCSUxJVFksCisJTkw4MDIxMV9BVFRSX1NUQV9FWFRfQ0FQQUJJTElUWSwKKwogCS8qIGFkZCBhdHRyaWJ1dGVzIGhlcmUsIHVwZGF0ZSB0aGUgcG9saWN5IGluIG5sODAyMTEuYyAqLwogCiAJX19OTDgwMjExX0FUVFJfQUZURVJfTEFTVCwKQEAgLTE1NDksNiArMTY5Nyw3IEBACiAjZGVmaW5lIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9UWF9NSUNfS0VZCTE2CiAjZGVmaW5lIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9SWF9NSUNfS0VZCTI0CiAjZGVmaW5lIE5MODAyMTFfSFRfQ0FQQUJJTElUWV9MRU4JCTI2CisjZGVmaW5lIE5MODAyMTFfVkhUX0NBUEFCSUxJVFlfTEVOCQkxMgogCiAjZGVmaW5lIE5MODAyMTFfTUFYX05SX0NJUEhFUl9TVUlURVMJCTUKICNkZWZpbmUgTkw4MDIxMV9NQVhfTlJfQUtNX1NVSVRFUwkJMgpAQCAtMTU3NSw2ICsxNzI0LDEwIEBACiAgKiBATkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDogbWVzaCBwb2ludAogICogQE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6IFAyUCBjbGllbnQKICAqIEBOTDgwMjExX0lGVFlQRV9QMlBfR086IFAyUCBncm91cCBvd25lcgorICogQE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6IFAyUCBkZXZpY2UgaW50ZXJmYWNlIHR5cGUsIHRoaXMgaXMgbm90IGEgbmV0ZGV2CisgKglhbmQgdGhlcmVmb3JlIGNhbid0IGJlIGNyZWF0ZWQgaW4gdGhlIG5vcm1hbCB3YXlzLCB1c2UgdGhlCisgKgklTkw4MDIxMV9DTURfU1RBUlRfUDJQX0RFVklDRSBhbmQgJU5MODAyMTFfQ01EX1NUT1BfUDJQX0RFVklDRQorICoJY29tbWFuZHMgdG8gY3JlYXRlIGFuZCBkZXN0cm95IG9uZQogICogQE5MODAyMTFfSUZUWVBFX01BWDogaGlnaGVzdCBpbnRlcmZhY2UgdHlwZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKICAqIEBOVU1fTkw4MDIxMV9JRlRZUEVTOiBudW1iZXIgb2YgZGVmaW5lZCBpbnRlcmZhY2UgdHlwZXMKICAqCkBAIC0xNTkzLDYgKzE3NDYsNyBAQAogCU5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQsCiAJTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCwKIAlOTDgwMjExX0lGVFlQRV9QMlBfR08sCisJTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSwKIAogCS8qIGtlZXAgbGFzdCAqLwogCU5VTV9OTDgwMjExX0lGVFlQRVMsCkBAIC0xNjE3LDYgKzE3NzEsOSBAQAogICoJZmxhZyBjYW4ndCBiZSBjaGFuZ2VkLCBpdCBpcyBvbmx5IHZhbGlkIHdoaWxlIGFkZGluZyBhIHN0YXRpb24sIGFuZAogICoJYXR0ZW1wdHMgdG8gY2hhbmdlIGl0IHdpbGwgc2lsZW50bHkgYmUgaWdub3JlZCAocmF0aGVyIHRoYW4gcmVqZWN0ZWQKICAqCWFzIGVycm9ycy4pCisgKiBATkw4MDIxMV9TVEFfRkxBR19BU1NPQ0lBVEVEOiBzdGF0aW9uIGlzIGFzc29jaWF0ZWQ7IHVzZWQgd2l0aCBkcml2ZXJzCisgKgl0aGF0IHN1cHBvcnQgJU5MODAyMTFfRkVBVFVSRV9GVUxMX0FQX0NMSUVOVF9TVEFURSB0byB0cmFuc2l0aW9uIGEKKyAqCXByZXZpb3VzbHkgYWRkZWQgc3RhdGlvbiBpbnRvIGFzc29jaWF0ZWQgc3RhdGUKICAqIEBOTDgwMjExX1NUQV9GTEFHX01BWDogaGlnaGVzdCBzdGF0aW9uIGZsYWcgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCiAgKiBAX19OTDgwMjExX1NUQV9GTEFHX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQogICovCkBAIC0xNjI4LDYgKzE3ODUsNyBAQAogCU5MODAyMTFfU1RBX0ZMQUdfTUZQLAogCU5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCwKIAlOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUiwKKwlOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQsCiAKIAkvKiBrZWVwIGxhc3QgKi8KIAlfX05MODAyMTFfU1RBX0ZMQUdfQUZURVJfTEFTVCwKQEAgLTE2NjQsMTAgKzE4MjIsMTUgQEAKICAqIEBfX05MODAyMTFfUkFURV9JTkZPX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAogICogQE5MODAyMTFfUkFURV9JTkZPX0JJVFJBVEU6IHRvdGFsIGJpdHJhdGUgKHUxNiwgMTAwa2JpdC9zKQogICogQE5MODAyMTFfUkFURV9JTkZPX01DUzogbWNzIGluZGV4IGZvciA4MDIuMTFuICh1OCkKLSAqIEBOTDgwMjExX1JBVEVfSU5GT180MF9NSFpfV0lEVEg6IDQwIE1oeiBkdWFsY2hhbm5lbCBiaXRyYXRlCisgKiBATkw4MDIxMV9SQVRFX0lORk9fNDBfTUhaX1dJRFRIOiA0MCBNSHogZHVhbGNoYW5uZWwgYml0cmF0ZQogICogQE5MODAyMTFfUkFURV9JTkZPX1NIT1JUX0dJOiA0MDBucyBndWFyZCBpbnRlcnZhbAogICogQE5MODAyMTFfUkFURV9JTkZPX0JJVFJBVEUzMjogdG90YWwgYml0cmF0ZSAodTMyLCAxMDBrYml0L3MpCiAgKiBATkw4MDIxMV9SQVRFX0lORk9fTUFYOiBoaWdoZXN0IHJhdGVfaW5mbyBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBOTDgwMjExX1JBVEVfSU5GT19WSFRfTUNTOiBNQ1MgaW5kZXggZm9yIFZIVCAodTgpCisgKiBATkw4MDIxMV9SQVRFX0lORk9fVkhUX05TUzogbnVtYmVyIG9mIHN0cmVhbXMgaW4gVkhUICh1OCkKKyAqIEBOTDgwMjExX1JBVEVfSU5GT184MF9NSFpfV0lEVEg6IDgwIE1IeiBWSFQgcmF0ZQorICogQE5MODAyMTFfUkFURV9JTkZPXzgwUDgwX01IWl9XSURUSDogODArODAgTUh6IFZIVCByYXRlCisgKiBATkw4MDIxMV9SQVRFX0lORk9fMTYwX01IWl9XSURUSDogMTYwIE1IeiBWSFQgcmF0ZQogICogQF9fTkw4MDIxMV9SQVRFX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KIGVudW0gbmw4MDIxMV9yYXRlX2luZm8gewpAQCAtMTY3Nyw2ICsxODQwLDExIEBACiAJTkw4MDIxMV9SQVRFX0lORk9fNDBfTUhaX1dJRFRILAogCU5MODAyMTFfUkFURV9JTkZPX1NIT1JUX0dJLAogCU5MODAyMTFfUkFURV9JTkZPX0JJVFJBVEUzMiwKKwlOTDgwMjExX1JBVEVfSU5GT19WSFRfTUNTLAorCU5MODAyMTFfUkFURV9JTkZPX1ZIVF9OU1MsCisJTkw4MDIxMV9SQVRFX0lORk9fODBfTUhaX1dJRFRILAorCU5MODAyMTFfUkFURV9JTkZPXzgwUDgwX01IWl9XSURUSCwKKwlOTDgwMjExX1JBVEVfSU5GT18xNjBfTUhaX1dJRFRILAogCiAJLyoga2VlcCBsYXN0ICovCiAJX19OTDgwMjExX1JBVEVfSU5GT19BRlRFUl9MQVNULApAQCAtMTcyMyw2ICsxODkxLDggQEAKICAqIEBOTDgwMjExX1NUQV9JTkZPX0lOQUNUSVZFX1RJTUU6IHRpbWUgc2luY2UgbGFzdCBhY3Rpdml0eSAodTMyLCBtc2VjcykKICAqIEBOTDgwMjExX1NUQV9JTkZPX1JYX0JZVEVTOiB0b3RhbCByZWNlaXZlZCBieXRlcyAodTMyLCBmcm9tIHRoaXMgc3RhdGlvbikKICAqIEBOTDgwMjExX1NUQV9JTkZPX1RYX0JZVEVTOiB0b3RhbCB0cmFuc21pdHRlZCBieXRlcyAodTMyLCB0byB0aGlzIHN0YXRpb24pCisgKiBATkw4MDIxMV9TVEFfSU5GT19SWF9CWVRFUzY0OiB0b3RhbCByZWNlaXZlZCBieXRlcyAodTY0LCBmcm9tIHRoaXMgc3RhdGlvbikKKyAqIEBOTDgwMjExX1NUQV9JTkZPX1RYX0JZVEVTNjQ6IHRvdGFsIHRyYW5zbWl0dGVkIGJ5dGVzICh1NjQsIHRvIHRoaXMgc3RhdGlvbikKICAqIEBOTDgwMjExX1NUQV9JTkZPX1NJR05BTDogc2lnbmFsIHN0cmVuZ3RoIG9mIGxhc3QgcmVjZWl2ZWQgUFBEVSAodTgsIGRCbSkKICAqIEBOTDgwMjExX1NUQV9JTkZPX1RYX0JJVFJBVEU6IGN1cnJlbnQgdW5pY2FzdCB0eCByYXRlLCBuZXN0ZWQgYXR0cmlidXRlCiAgKiAJY29udGFpbmluZyBpbmZvIGFzIHBvc3NpYmxlLCBzZWUgJmVudW0gbmw4MDIxMV9yYXRlX2luZm8KQEAgLTE3NDQsNiArMTkxNCwxMCBAQAogICogQE5MODAyMTFfU1RBX0lORk9fU1RBX0ZMQUdTOiBDb250YWlucyBhIHN0cnVjdCBubDgwMjExX3N0YV9mbGFnX3VwZGF0ZS4KICAqIEBOTDgwMjExX1NUQV9JTkZPX0JFQUNPTl9MT1NTOiBjb3VudCBvZiB0aW1lcyBiZWFjb24gbG9zcyB3YXMgZGV0ZWN0ZWQgKHUzMikKICAqIEBOTDgwMjExX1NUQV9JTkZPX1RfT0ZGU0VUOiB0aW1pbmcgb2Zmc2V0IHdpdGggcmVzcGVjdCB0byB0aGlzIFNUQSAoczY0KQorICogQE5MODAyMTFfU1RBX0lORk9fTE9DQUxfUE06IGxvY2FsIG1lc2ggU1RBIGxpbmstc3BlY2lmaWMgcG93ZXIgbW9kZQorICogQE5MODAyMTFfU1RBX0lORk9fUEVFUl9QTTogcGVlciBtZXNoIFNUQSBsaW5rLXNwZWNpZmljIHBvd2VyIG1vZGUKKyAqIEBOTDgwMjExX1NUQV9JTkZPX05PTlBFRVJfUE06IG5laWdoYm9yIG1lc2ggU1RBIHBvd2VyIHNhdmUgbW9kZSB0b3dhcmRzCisgKglub24tcGVlciBTVEEKICAqIEBfX05MODAyMTFfU1RBX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwKICAqIEBOTDgwMjExX1NUQV9JTkZPX01BWDogaGlnaGVzdCBwb3NzaWJsZSBzdGF0aW9uIGluZm8gYXR0cmlidXRlCiAgKi8KQEAgLTE3NjgsNiArMTk0MiwxMSBAQAogCU5MODAyMTFfU1RBX0lORk9fU1RBX0ZMQUdTLAogCU5MODAyMTFfU1RBX0lORk9fQkVBQ09OX0xPU1MsCiAJTkw4MDIxMV9TVEFfSU5GT19UX09GRlNFVCwKKwlOTDgwMjExX1NUQV9JTkZPX0xPQ0FMX1BNLAorCU5MODAyMTFfU1RBX0lORk9fUEVFUl9QTSwKKwlOTDgwMjExX1NUQV9JTkZPX05PTlBFRVJfUE0sCisJTkw4MDIxMV9TVEFfSU5GT19SWF9CWVRFUzY0LAorCU5MODAyMTFfU1RBX0lORk9fVFhfQllURVM2NCwKIAogCS8qIGtlZXAgbGFzdCAqLwogCV9fTkw4MDIxMV9TVEFfSU5GT19BRlRFUl9MQVNULApAQCAtMTg3Nyw2ICsyMDU2LDIwIEBACiAgKglvbiB0aGlzIGNoYW5uZWwgaW4gY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbi4KICAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWF9UWF9QT1dFUjogTWF4aW11bSB0cmFuc21pc3Npb24gcG93ZXIgaW4gbUJtCiAgKgkoMTAwICogZEJtKS4KKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0RGU19TVEFURTogY3VycmVudCBzdGF0ZSBmb3IgREZTCisgKgkoZW51bSBubDgwMjExX2Rmc19zdGF0ZSkKKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0RGU19USU1FOiB0aW1lIGluIG1pbGlzZWNvbmRzIGZvciBob3cgbG9uZworICoJdGhpcyBjaGFubmVsIGlzIGluIHRoaXMgREZTIHN0YXRlLgorICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTk9fSFQ0MF9NSU5VUzogSFQ0MC0gaXNuJ3QgcG9zc2libGUgd2l0aCB0aGlzCisgKgljaGFubmVsIGFzIHRoZSBjb250cm9sIGNoYW5uZWwKKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PX0hUNDBfUExVUzogSFQ0MCsgaXNuJ3QgcG9zc2libGUgd2l0aCB0aGlzCisgKgljaGFubmVsIGFzIHRoZSBjb250cm9sIGNoYW5uZWwKKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PXzgwTUhaOiBhbnkgODAgTUh6IGNoYW5uZWwgdXNpbmcgdGhpcyBjaGFubmVsCisgKglhcyB0aGUgcHJpbWFyeSBvciBhbnkgb2YgdGhlIHNlY29uZGFyeSBjaGFubmVscyBpc24ndCBwb3NzaWJsZSwKKyAqCXRoaXMgaW5jbHVkZXMgODArODAgY2hhbm5lbHMKKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PXzE2ME1IWjogYW55IDE2MCBNSHogKGJ1dCBub3QgODArODApIGNoYW5uZWwKKyAqCXVzaW5nIHRoaXMgY2hhbm5lbCBhcyB0aGUgcHJpbWFyeSBvciBhbnkgb2YgdGhlIHNlY29uZGFyeSBjaGFubmVscworICoJaXNuJ3QgcG9zc2libGUKICAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWDogaGlnaGVzdCBmcmVxdWVuY3kgYXR0cmlidXRlIG51bWJlcgogICoJY3VycmVudGx5IGRlZmluZWQKICAqIEBfX05MODAyMTFfRlJFUVVFTkNZX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCkBAIC0xODg5LDYgKzIwODIsMTIgQEAKIAlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PX0lCU1MsCiAJTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9SQURBUiwKIAlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWF9UWF9QT1dFUiwKKwlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0RGU19TVEFURSwKKwlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0RGU19USU1FLAorCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTk9fSFQ0MF9NSU5VUywKKwlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PX0hUNDBfUExVUywKKwlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PXzgwTUhaLAorCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTk9fMTYwTUhaLAogCiAJLyoga2VlcCBsYXN0ICovCiAJX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0FGVEVSX0xBU1QsCkBAIC0yMTU5LDYgKzIzNTgsMzQgQEAKIH07CiAKIC8qKgorICogZW51bSBubDgwMjExX21lc2hfcG93ZXJfbW9kZSAtIG1lc2ggcG93ZXIgc2F2ZSBtb2RlcworICoKKyAqIEBOTDgwMjExX01FU0hfUE9XRVJfVU5LTk9XTjogVGhlIG1lc2ggcG93ZXIgbW9kZSBvZiB0aGUgbWVzaCBTVEEgaXMKKyAqCW5vdCBrbm93biBvciBoYXMgbm90IGJlZW4gc2V0IHlldC4KKyAqIEBOTDgwMjExX01FU0hfUE9XRVJfQUNUSVZFOiBBY3RpdmUgbWVzaCBwb3dlciBtb2RlLiBUaGUgbWVzaCBTVEEgaXMKKyAqCWluIEF3YWtlIHN0YXRlIGFsbCB0aGUgdGltZS4KKyAqIEBOTDgwMjExX01FU0hfUE9XRVJfTElHSFRfU0xFRVA6IExpZ2h0IHNsZWVwIG1vZGUuIFRoZSBtZXNoIFNUQSB3aWxsCisgKglhbHRlcm5hdGUgYmV0d2VlbiBBY3RpdmUgYW5kIERvemUgc3RhdGVzLCBidXQgd2lsbCB3YWtlIHVwIGZvcgorICoJbmVpZ2hib3IncyBiZWFjb25zLgorICogQE5MODAyMTFfTUVTSF9QT1dFUl9ERUVQX1NMRUVQOiBEZWVwIHNsZWVwIG1vZGUuIFRoZSBtZXNoIFNUQSB3aWxsCisgKglhbHRlcm5hdGUgYmV0d2VlbiBBY3RpdmUgYW5kIERvemUgc3RhdGVzLCBidXQgbWF5IG5vdCB3YWtlIHVwCisgKglmb3IgbmVpZ2hib3IncyBiZWFjb25zLgorICoKKyAqIEBfX05MODAyMTFfTUVTSF9QT1dFUl9BRlRFUl9MQVNUIC0gaW50ZXJuYWwgdXNlCisgKiBATkw4MDIxMV9NRVNIX1BPV0VSX01BWCAtIGhpZ2hlc3QgcG9zc2libGUgcG93ZXIgc2F2ZSBsZXZlbAorICovCisKK2VudW0gbmw4MDIxMV9tZXNoX3Bvd2VyX21vZGUgeworCU5MODAyMTFfTUVTSF9QT1dFUl9VTktOT1dOLAorCU5MODAyMTFfTUVTSF9QT1dFUl9BQ1RJVkUsCisJTkw4MDIxMV9NRVNIX1BPV0VSX0xJR0hUX1NMRUVQLAorCU5MODAyMTFfTUVTSF9QT1dFUl9ERUVQX1NMRUVQLAorCisJX19OTDgwMjExX01FU0hfUE9XRVJfQUZURVJfTEFTVCwKKwlOTDgwMjExX01FU0hfUE9XRVJfTUFYID0gX19OTDgwMjExX01FU0hfUE9XRVJfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgogICogZW51bSBubDgwMjExX21lc2hjb25mX3BhcmFtcyAtIG1lc2ggY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgKgogICogTWVzaCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuIFRoZXNlIGNhbiBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBtZXNoIGlzCkBAIC0yMjUyLDYgKzI0NzksMTEgQEAKICAqCShpbiBUVXMpIGR1cmluZyB3aGljaCBhIG1lc2ggU1RBIGNhbiBzZW5kIG9ubHkgb25lIEFjdGlvbiBmcmFtZQogICoJY29udGFpbmluZyBhIFBSRVEgZWxlbWVudCBmb3Igcm9vdCBwYXRoIGNvbmZpcm1hdGlvbi4KICAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9QT1dFUl9NT0RFOiBEZWZhdWx0IG1lc2ggcG93ZXIgbW9kZSBmb3IgbmV3IHBlZXIgbGlua3MuCisgKgl0eXBlICZlbnVtIG5sODAyMTFfbWVzaF9wb3dlcl9tb2RlICh1MzIpCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfQVdBS0VfV0lORE9XOiBhd2FrZSB3aW5kb3cgZHVyYXRpb24gKGluIFRVcykKKyAqCiAgKiBAX19OTDgwMjExX01FU0hDT05GX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KIGVudW0gbmw4MDIxMV9tZXNoY29uZl9wYXJhbXMgewpAQCAtMjI4MSw2ICsyNTEzLDggQEAKIAlOTDgwMjExX01FU0hDT05GX0hXTVBfUEFUSF9UT19ST09UX1RJTUVPVVQsCiAJTkw4MDIxMV9NRVNIQ09ORl9IV01QX1JPT1RfSU5URVJWQUwsCiAJTkw4MDIxMV9NRVNIQ09ORl9IV01QX0NPTkZJUk1BVElPTl9JTlRFUlZBTCwKKwlOTDgwMjExX01FU0hDT05GX1BPV0VSX01PREUsCisJTkw4MDIxMV9NRVNIQ09ORl9BV0FLRV9XSU5ET1csCiAKIAkvKiBrZWVwIGxhc3QgKi8KIAlfX05MODAyMTFfTUVTSENPTkZfQVRUUl9BRlRFUl9MQVNULApAQCAtMjM4NSw2ICsyNjE5LDE1IEBACiAjZGVmaW5lIE5MODAyMTFfVFhRX1FfQkUJTkw4MDIxMV9BQ19CRQogI2RlZmluZSBOTDgwMjExX1RYUV9RX0JLCU5MODAyMTFfQUNfQksKIAorLyoqCisgKiBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIC0gY2hhbm5lbCB0eXBlCisgKiBATkw4MDIxMV9DSEFOX05PX0hUOiAyMCBNSHosIG5vbi1IVCBjaGFubmVsCisgKiBATkw4MDIxMV9DSEFOX0hUMjA6IDIwIE1IeiBIVCBjaGFubmVsCisgKiBATkw4MDIxMV9DSEFOX0hUNDBNSU5VUzogSFQ0MCBjaGFubmVsLCBzZWNvbmRhcnkgY2hhbm5lbAorICoJYmVsb3cgdGhlIGNvbnRyb2wgY2hhbm5lbAorICogQE5MODAyMTFfQ0hBTl9IVDQwUExVUzogSFQ0MCBjaGFubmVsLCBzZWNvbmRhcnkgY2hhbm5lbAorICoJYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbAorICovCiBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIHsKIAlOTDgwMjExX0NIQU5fTk9fSFQsCiAJTkw4MDIxMV9DSEFOX0hUMjAsCkBAIC0yMzkzLDYgKzI2MzYsMzIgQEAKIH07CiAKIC8qKgorICogZW51bSBubDgwMjExX2NoYW5fd2lkdGggLSBjaGFubmVsIHdpZHRoIGRlZmluaXRpb25zCisgKgorICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHdpdGggdGhlICVOTDgwMjExX0FUVFJfQ0hBTk5FTF9XSURUSAorICogYXR0cmlidXRlLgorICoKKyAqIEBOTDgwMjExX0NIQU5fV0lEVEhfMjBfTk9IVDogMjAgTUh6LCBub24tSFQgY2hhbm5lbAorICogQE5MODAyMTFfQ0hBTl9XSURUSF8yMDogMjAgTUh6IEhUIGNoYW5uZWwKKyAqIEBOTDgwMjExX0NIQU5fV0lEVEhfNDA6IDQwIE1IeiBjaGFubmVsLCB0aGUgJU5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTEKKyAqCWF0dHJpYnV0ZSBtdXN0IGJlIHByb3ZpZGVkIGFzIHdlbGwKKyAqIEBOTDgwMjExX0NIQU5fV0lEVEhfODA6IDgwIE1IeiBjaGFubmVsLCB0aGUgJU5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTEKKyAqCWF0dHJpYnV0ZSBtdXN0IGJlIHByb3ZpZGVkIGFzIHdlbGwKKyAqIEBOTDgwMjExX0NIQU5fV0lEVEhfODBQODA6IDgwKzgwIE1IeiBjaGFubmVsLCB0aGUgJU5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTEKKyAqCWFuZCAlTkw4MDIxMV9BVFRSX0NFTlRFUl9GUkVRMiBhdHRyaWJ1dGVzIG11c3QgYmUgcHJvdmlkZWQgYXMgd2VsbAorICogQE5MODAyMTFfQ0hBTl9XSURUSF8xNjA6IDE2MCBNSHogY2hhbm5lbCwgdGhlICVOTDgwMjExX0FUVFJfQ0VOVEVSX0ZSRVExCisgKglhdHRyaWJ1dGUgbXVzdCBiZSBwcm92aWRlZCBhcyB3ZWxsCisgKi8KK2VudW0gbmw4MDIxMV9jaGFuX3dpZHRoIHsKKwlOTDgwMjExX0NIQU5fV0lEVEhfMjBfTk9IVCwKKwlOTDgwMjExX0NIQU5fV0lEVEhfMjAsCisJTkw4MDIxMV9DSEFOX1dJRFRIXzQwLAorCU5MODAyMTFfQ0hBTl9XSURUSF84MCwKKwlOTDgwMjExX0NIQU5fV0lEVEhfODBQODAsCisJTkw4MDIxMV9DSEFOX1dJRFRIXzE2MCwKK307CisKKy8qKgogICogZW51bSBubDgwMjExX2JzcyAtIG5ldGxpbmsgYXR0cmlidXRlcyBmb3IgYSBCU1MKICAqCiAgKiBAX19OTDgwMjExX0JTU19JTlZBTElEOiBpbnZhbGlkCkBAIC0yNDYwLDYgKzI3MjksNyBAQAogICogQE5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWTogU2hhcmVkIEtleSBhdXRoZW50aWNhdGlvbiAoV0VQIG9ubHkpCiAgKiBATkw4MDIxMV9BVVRIVFlQRV9GVDogRmFzdCBCU1MgVHJhbnNpdGlvbiAoSUVFRSA4MDIuMTFyKQogICogQE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA6IE5ldHdvcmsgRUFQIChzb21lIENpc2NvIEFQcyBhbmQgbWFpbmx5IExFQVApCisgKiBATkw4MDIxMV9BVVRIVFlQRV9TQUU6IFNpbXVsdGFuZW91cyBhdXRoZW50aWNhdGlvbiBvZiBlcXVhbHMKICAqIEBfX05MODAyMTFfQVVUSFRZUEVfTlVNOiBpbnRlcm5hbAogICogQE5MODAyMTFfQVVUSFRZUEVfTUFYOiBtYXhpbXVtIHZhbGlkIGF1dGggYWxnb3JpdGhtCiAgKiBATkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUM6IGRldGVybWluZSBhdXRvbWF0aWNhbGx5IChpZiBuZWNlc3NhcnkgYnkKQEAgLTI0NzEsNiArMjc0MSw3IEBACiAJTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZLAogCU5MODAyMTFfQVVUSFRZUEVfRlQsCiAJTkw4MDIxMV9BVVRIVFlQRV9ORVRXT1JLX0VBUCwKKwlOTDgwMjExX0FVVEhUWVBFX1NBRSwKIAogCS8qIGtlZXAgbGFzdCAqLwogCV9fTkw4MDIxMV9BVVRIVFlQRV9OVU0sCkBAIC0yNjg5LDEwICsyOTYwLDEyIEBACiAgKgljb3JyZXNwb25kcyB0byB0aGUgbG93ZXN0LW9yZGVyIGJpdCBpbiB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIG1hc2suCiAgKglGb3IgZXhhbXBsZTogVGhlIG1hdGNoIDAwOnh4OjAwOjAwOnh4OjAwOjAwOjAwOjAwOnh4Onh4Onh4ICh3aGVyZQogICoJeHggaW5kaWNhdGVzICJkb24ndCBjYXJlIikgd291bGQgYmUgcmVwcmVzZW50ZWQgYnkgYSBwYXR0ZXJuIG9mCi0gKgl0d2VsdmUgemVybyBieXRlcywgYW5kIGEgbWFzayBvZiAiMHhlZCwweDA3Ii4KKyAqCXR3ZWx2ZSB6ZXJvIGJ5dGVzLCBhbmQgYSBtYXNrIG9mICIweGVkLDB4MDEiLgogICoJTm90ZSB0aGF0IHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGlzIGRvbmUgYXMgdGhvdWdoIGZyYW1lcyB3ZXJlIG5vdAogICoJODAyLjExIGZyYW1lcyBidXQgODAyLjMgZnJhbWVzLCBpLmUuIHRoZSBmcmFtZSBpcyBmdWxseSB1bnBhY2tlZAogICoJZmlyc3QgKGluY2x1ZGluZyBTTkFQIGhlYWRlciB1bnBhY2tpbmcpIGFuZCB0aGVuIG1hdGNoZWQuCisgKiBATkw4MDIxMV9XT1dMQU5fUEtUUEFUX09GRlNFVDogcGFja2V0IG9mZnNldCwgcGF0dGVybiBpcyBtYXRjaGVkIGFmdGVyCisgKgl0aGVzZSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMgb2YgcmVjZWl2ZWQgcGFja2V0CiAgKiBATlVNX05MODAyMTFfV09XTEFOX1BLVFBBVDogbnVtYmVyIG9mIGF0dHJpYnV0ZXMKICAqIEBNQVhfTkw4MDIxMV9XT1dMQU5fUEtUUEFUOiBtYXggYXR0cmlidXRlIG51bWJlcgogICovCkBAIC0yNzAwLDYgKzI5NzMsNyBAQAogCV9fTkw4MDIxMV9XT1dMQU5fUEtUUEFUX0lOVkFMSUQsCiAJTkw4MDIxMV9XT1dMQU5fUEtUUEFUX01BU0ssCiAJTkw4MDIxMV9XT1dMQU5fUEtUUEFUX1BBVFRFUk4sCisJTkw4MDIxMV9XT1dMQU5fUEtUUEFUX09GRlNFVCwKIAogCU5VTV9OTDgwMjExX1dPV0xBTl9QS1RQQVQsCiAJTUFYX05MODAyMTFfV09XTEFOX1BLVFBBVCA9IE5VTV9OTDgwMjExX1dPV0xBTl9QS1RQQVQgLSAxLApAQCAtMjcxMCw2ICsyOTg0LDcgQEAKICAqIEBtYXhfcGF0dGVybnM6IG1heGltdW0gbnVtYmVyIG9mIHBhdHRlcm5zIHN1cHBvcnRlZAogICogQG1pbl9wYXR0ZXJuX2xlbjogbWluaW11bSBsZW5ndGggb2YgZWFjaCBwYXR0ZXJuCiAgKiBAbWF4X3BhdHRlcm5fbGVuOiBtYXhpbXVtIGxlbmd0aCBvZiBlYWNoIHBhdHRlcm4KKyAqIEBtYXhfcGt0X29mZnNldDogbWF4aW11bSBSeCBwYWNrZXQgb2Zmc2V0CiAgKgogICogVGhpcyBzdHJ1Y3QgaXMgY2FycmllZCBpbiAlTkw4MDIxMV9XT1dMQU5fVFJJR19QS1RfUEFUVEVSTiB3aGVuCiAgKiB0aGF0IGlzIHBhcnQgb2YgJU5MODAyMTFfQVRUUl9XT1dMQU5fVFJJR0dFUlNfU1VQUE9SVEVEIGluIHRoZQpAQCAtMjcxOSw2ICsyOTk0LDcgQEAKIAlfX3UzMiBtYXhfcGF0dGVybnM7CiAJX191MzIgbWluX3BhdHRlcm5fbGVuOwogCV9fdTMyIG1heF9wYXR0ZXJuX2xlbjsKKwlfX3UzMiBtYXhfcGt0X29mZnNldDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qKgpAQCAtMjczNCwxMiArMzAxMCwxNyBAQAogICogQE5MODAyMTFfV09XTEFOX1RSSUdfUEtUX1BBVFRFUk46IHdha2UgdXAgb24gdGhlIHNwZWNpZmllZCBwYWNrZXQgcGF0dGVybnMKICAqCXdoaWNoIGFyZSBwYXNzZWQgaW4gYW4gYXJyYXkgb2YgbmVzdGVkIGF0dHJpYnV0ZXMsIGVhY2ggbmVzdGVkIGF0dHJpYnV0ZQogICoJZGVmaW5pbmcgYSB3aXRoIGF0dHJpYnV0ZXMgZnJvbSAmc3RydWN0IG5sODAyMTFfd293bGFuX3RyaWdfcGt0X3BhdHRlcm4uCi0gKglFYWNoIHBhdHRlcm4gZGVmaW5lcyBhIHdha2V1cCBwYWNrZXQuIFRoZSBtYXRjaGluZyBpcyBkb25lIG9uIHRoZSBNU0RVLAotICoJaS5lLiBhcyB0aG91Z2ggdGhlIHBhY2tldCB3YXMgYW4gODAyLjMgcGFja2V0LCBzbyB0aGUgcGF0dGVybiBtYXRjaGluZwotICoJaXMgZG9uZSBhZnRlciB0aGUgcGFja2V0IGlzIGNvbnZlcnRlZCB0byB0aGUgTVNEVS4KKyAqCUVhY2ggcGF0dGVybiBkZWZpbmVzIGEgd2FrZXVwIHBhY2tldC4gUGFja2V0IG9mZnNldCBpcyBhc3NvY2lhdGVkIHdpdGgKKyAqCWVhY2ggcGF0dGVybiB3aGljaCBpcyB1c2VkIHdoaWxlIG1hdGNoaW5nIHRoZSBwYXR0ZXJuLiBUaGUgbWF0Y2hpbmcgaXMKKyAqCWRvbmUgb24gdGhlIE1TRFUsIGkuZS4gYXMgdGhvdWdoIHRoZSBwYWNrZXQgd2FzIGFuIDgwMi4zIHBhY2tldCwgc28gdGhlCisgKglwYXR0ZXJuIG1hdGNoaW5nIGlzIGRvbmUgYWZ0ZXIgdGhlIHBhY2tldCBpcyBjb252ZXJ0ZWQgdG8gdGhlIE1TRFUuCiAgKgogICoJSW4gJU5MODAyMTFfQVRUUl9XT1dMQU5fVFJJR0dFUlNfU1VQUE9SVEVELCBpdCBpcyBhIGJpbmFyeSBhdHRyaWJ1dGUKICAqCWNhcnJ5aW5nIGEgJnN0cnVjdCBubDgwMjExX3dvd2xhbl9wYXR0ZXJuX3N1cHBvcnQuCisgKgorICoJV2hlbiByZXBvcnRpbmcgd2FrZXVwLiBpdCBpcyBhIHUzMiBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgMC1iYXNlZAorICoJaW5kZXggb2YgdGhlIHBhdHRlcm4gdGhhdCBjYXVzZWQgdGhlIHdha2V1cCwgaW4gdGhlIHBhdHRlcm5zIHBhc3NlZAorICoJdG8gdGhlIGtlcm5lbCB3aGVuIGNvbmZpZ3VyaW5nLgogICogQE5MODAyMTFfV09XTEFOX1RSSUdfR1RLX1JFS0VZX1NVUFBPUlRFRDogTm90IGEgcmVhbCB0cmlnZ2VyLCBhbmQgY2Fubm90IGJlCiAgKgl1c2VkIHdoZW4gc2V0dGluZywgdXNlZCBvbmx5IHRvIGluZGljYXRlIHRoYXQgR1RLIHJla2V5aW5nIGlzIHN1cHBvcnRlZAogICoJYnkgdGhlIGRldmljZSAoZmxhZykKQEAgLTI3NTAsOCArMzAzMSwzNiBAQAogICogQE5MODAyMTFfV09XTEFOX1RSSUdfNFdBWV9IQU5EU0hBS0U6IHdha2UgdXAgb24gNC13YXkgaGFuZHNoYWtlIChmbGFnKQogICogQE5MODAyMTFfV09XTEFOX1RSSUdfUkZLSUxMX1JFTEVBU0U6IHdha2UgdXAgd2hlbiByZmtpbGwgaXMgcmVsZWFzZWQKICAqCShvbiBkZXZpY2VzIHRoYXQgaGF2ZSByZmtpbGwgaW4gdGhlIGRldmljZSkgKGZsYWcpCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19XQUtFVVBfUEtUXzgwMjExOiBGb3Igd2FrZXVwIHJlcG9ydGluZyBvbmx5LCBjb250YWlucworICoJdGhlIDgwMi4xMSBwYWNrZXQgdGhhdCBjYXVzZWQgdGhlIHdha2V1cCwgZS5nLiBhIGRlYXV0aCBmcmFtZS4gVGhlIGZyYW1lCisgKgltYXkgYmUgdHJ1bmNhdGVkLCB0aGUgQE5MODAyMTFfV09XTEFOX1RSSUdfV0FLRVVQX1BLVF84MDIxMV9MRU4KKyAqCWF0dHJpYnV0ZSBjb250YWlucyB0aGUgb3JpZ2luYWwgbGVuZ3RoLgorICogQE5MODAyMTFfV09XTEFOX1RSSUdfV0FLRVVQX1BLVF84MDIxMV9MRU46IE9yaWdpbmFsIGxlbmd0aCBvZiB0aGUgODAyLjExCisgKglwYWNrZXQsIG1heSBiZSBiaWdnZXIgdGhhbiB0aGUgQE5MODAyMTFfV09XTEFOX1RSSUdfV0FLRVVQX1BLVF84MDIxMQorICoJYXR0cmlidXRlIGlmIHRoZSBwYWNrZXQgd2FzIHRydW5jYXRlZCBzb21ld2hlcmUuCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19XQUtFVVBfUEtUXzgwMjM6IEZvciB3YWtldXAgcmVwb3J0aW5nIG9ubHksIGNvbnRhaW5zIHRoZQorICoJODAyLjExIHBhY2tldCB0aGF0IGNhdXNlZCB0aGUgd2FrZXVwLCBlLmcuIGEgbWFnaWMgcGFja2V0LiBUaGUgZnJhbWUgbWF5CisgKgliZSB0cnVuY2F0ZWQsIHRoZSBATkw4MDIxMV9XT1dMQU5fVFJJR19XQUtFVVBfUEtUXzgwMjNfTEVOIGF0dHJpYnV0ZQorICoJY29udGFpbnMgdGhlIG9yaWdpbmFsIGxlbmd0aC4KKyAqIEBOTDgwMjExX1dPV0xBTl9UUklHX1dBS0VVUF9QS1RfODAyM19MRU46IE9yaWdpbmFsIGxlbmd0aCBvZiB0aGUgODAyLjMKKyAqCXBhY2tldCwgbWF5IGJlIGJpZ2dlciB0aGFuIHRoZSBATkw4MDIxMV9XT1dMQU5fVFJJR19XQUtFVVBfUEtUXzgwMjMKKyAqCWF0dHJpYnV0ZSBpZiB0aGUgcGFja2V0IHdhcyB0cnVuY2F0ZWQgc29tZXdoZXJlLgorICogQE5MODAyMTFfV09XTEFOX1RSSUdfVENQX0NPTk5FQ1RJT046IFRDUCBjb25uZWN0aW9uIHdha2UsIHNlZSBET0Mgc2VjdGlvbgorICoJIlRDUCBjb25uZWN0aW9uIHdha2V1cCIgZm9yIG1vcmUgZGV0YWlscy4gVGhpcyBpcyBhIG5lc3RlZCBhdHRyaWJ1dGUKKyAqCWNvbnRhaW5pbmcgdGhlIGV4YWN0IGluZm9ybWF0aW9uIGZvciBlc3RhYmxpc2hpbmcgYW5kIGtlZXBpbmcgYWxpdmUKKyAqCXRoZSBUQ1AgY29ubmVjdGlvbi4KKyAqIEBOTDgwMjExX1dPV0xBTl9UUklHX1RDUF9XQUtFVVBfTUFUQ0g6IEZvciB3YWtldXAgcmVwb3J0aW5nIG9ubHksIHRoZQorICoJd2FrZXVwIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFRDUCBjb25uZWN0aW9uCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19XQUtFVVBfVENQX0NPTk5MT1NUOiBGb3Igd2FrZXVwIHJlcG9ydGluZyBvbmx5LCB0aGUKKyAqCVRDUCBjb25uZWN0aW9uIHdhcyBsb3N0IG9yIGZhaWxlZCB0byBiZSBlc3RhYmxpc2hlZAorICogQE5MODAyMTFfV09XTEFOX1RSSUdfV0FLRVVQX1RDUF9OT01PUkVUT0tFTlM6IEZvciB3YWtldXAgcmVwb3J0aW5nIG9ubHksCisgKgl0aGUgVENQIGNvbm5lY3Rpb24gcmFuIG91dCBvZiB0b2tlbnMgdG8gdXNlIGZvciBkYXRhIHRvIHNlbmQgdG8gdGhlCisgKglzZXJ2aWNlCiAgKiBATlVNX05MODAyMTFfV09XTEFOX1RSSUc6IG51bWJlciBvZiB3YWtlIG9uIHdpcmVsZXNzIHRyaWdnZXJzCiAgKiBATUFYX05MODAyMTFfV09XTEFOX1RSSUc6IGhpZ2hlc3Qgd293bGFuIHRyaWdnZXIgYXR0cmlidXRlIG51bWJlcgorICoKKyAqIFRoZXNlIG5lc3RlZCBhdHRyaWJ1dGVzIGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgd2FrZXVwIHRyaWdnZXJzIGFuZAorICogdG8gcmVwb3J0IHRoZSB3YWtldXAgcmVhc29uKHMpLgogICovCiBlbnVtIG5sODAyMTFfd293bGFuX3RyaWdnZXJzIHsKIAlfX05MODAyMTFfV09XTEFOX1RSSUdfSU5WQUxJRCwKQEAgLTI3NjQsNiArMzA3MywxNCBAQAogCU5MODAyMTFfV09XTEFOX1RSSUdfRUFQX0lERU5UX1JFUVVFU1QsCiAJTkw4MDIxMV9XT1dMQU5fVFJJR180V0FZX0hBTkRTSEFLRSwKIAlOTDgwMjExX1dPV0xBTl9UUklHX1JGS0lMTF9SRUxFQVNFLAorCU5MODAyMTFfV09XTEFOX1RSSUdfV0FLRVVQX1BLVF84MDIxMSwKKwlOTDgwMjExX1dPV0xBTl9UUklHX1dBS0VVUF9QS1RfODAyMTFfTEVOLAorCU5MODAyMTFfV09XTEFOX1RSSUdfV0FLRVVQX1BLVF84MDIzLAorCU5MODAyMTFfV09XTEFOX1RSSUdfV0FLRVVQX1BLVF84MDIzX0xFTiwKKwlOTDgwMjExX1dPV0xBTl9UUklHX1RDUF9DT05ORUNUSU9OLAorCU5MODAyMTFfV09XTEFOX1RSSUdfV0FLRVVQX1RDUF9NQVRDSCwKKwlOTDgwMjExX1dPV0xBTl9UUklHX1dBS0VVUF9UQ1BfQ09OTkxPU1QsCisJTkw4MDIxMV9XT1dMQU5fVFJJR19XQUtFVVBfVENQX05PTU9SRVRPS0VOUywKIAogCS8qIGtlZXAgbGFzdCAqLwogCU5VTV9OTDgwMjExX1dPV0xBTl9UUklHLApAQCAtMjc3MSw2ICszMDg4LDExNiBAQAogfTsKIAogLyoqCisgKiBET0M6IFRDUCBjb25uZWN0aW9uIHdha2V1cAorICoKKyAqIFNvbWUgZGV2aWNlcyBjYW4gZXN0YWJsaXNoIGEgVENQIGNvbm5lY3Rpb24gaW4gb3JkZXIgdG8gYmUgd29rZW4gdXAgYnkgYQorICogcGFja2V0IGNvbWluZyBpbiBmcm9tIG91dHNpZGUgdGhlaXIgbmV0d29yayBzZWdtZW50LCBvciBiZWhpbmQgTkFULiBJZgorICogY29uZmlndXJlZCwgdGhlIGRldmljZSB3aWxsIGVzdGFibGlzaCBhIFRDUCBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbgorICogc2VydmljZSwgYW5kIHBlcmlvZGljYWxseSBzZW5kIGRhdGEgdG8gdGhhdCBzZXJ2aWNlLiBUaGUgZmlyc3QgZGF0YQorICogcGFja2V0IGlzIHVzdWFsbHkgdHJhbnNtaXR0ZWQgYWZ0ZXIgU1lOL0FDSywgYWxzbyBBQ0tpbmcgdGhlIFNZTi9BQ0suCisgKiBUaGUgZGF0YSBwYWNrZXRzIGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgYSAobGl0dGxlIGVuZGlhbikgc2VxdWVuY2UKKyAqIG51bWJlciAoaW4gdGhlIFRDUCBwYXlsb2FkISkgdGhhdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIGRldmljZSwgYW5kLCBhbHNvCisgKiBvcHRpb25hbGx5LCBhIHRva2VuIGZyb20gYSBsaXN0IG9mIHRva2Vucy4gVGhpcyBzZXJ2ZXMgYXMgYSBrZWVwLWFsaXZlCisgKiB3aXRoIHRoZSBzZXJ2aWNlLCBhbmQgZm9yIE5BVGVkIGNvbm5lY3Rpb25zLCBldGMuCisgKgorICogRHVyaW5nIHRoaXMga2VlcC1hbGl2ZSBwZXJpb2QsIHRoZSBzZXJ2ZXIgZG9lc24ndCBzZW5kIGFueSBkYXRhIHRvIHRoZQorICogY2xpZW50LiBXaGVuIHJlY2VpdmluZyBkYXRhLCBpdCBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSB3YWtldXAgcGF0dGVybgorICogKGFuZCBtYXNrKSBhbmQgaWYgaXQgbWF0Y2hlcywgdGhlIGhvc3QgaXMgd29rZW4gdXAuIFNpbWlsYXJseSwgaWYgdGhlCisgKiBjb25uZWN0aW9uIGJyZWFrcyBvciBjYW5ub3QgYmUgZXN0YWJsaXNoZWQgdG8gc3RhcnQgd2l0aCwgdGhlIGhvc3QgaXMKKyAqIGFsc28gd29rZW4gdXAuCisgKgorICogRGV2ZWxvcGVyJ3Mgbm90ZTogQVJQIG9mZmxvYWQgaXMgcmVxdWlyZWQgZm9yIHRoaXMsIG90aGVyd2lzZSBUQ1AKKyAqIHJlc3BvbnNlIHBhY2tldHMgbWlnaHQgbm90IGdvIHRocm91Z2ggY29ycmVjdGx5LgorICovCisKKy8qKgorICogc3RydWN0IG5sODAyMTFfd293bGFuX3RjcF9kYXRhX3NlcSAtIFdvV0xBTiBUQ1AgZGF0YSBzZXF1ZW5jZQorICogQHN0YXJ0OiBzdGFydGluZyB2YWx1ZQorICogQG9mZnNldDogb2Zmc2V0IG9mIHNlcXVlbmNlIG51bWJlciBpbiBwYWNrZXQKKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdmFsdWUgdG8gd3JpdGUsIDEgdGhyb3VnaCA0CisgKgorICogTm90ZTogZG9uJ3QgY29uZnVzZSB3aXRoIHRoZSBUQ1Agc2VxdWVuY2UgbnVtYmVyKHMpLCB0aGlzIGlzIGZvciB0aGUKKyAqIGtlZXBhbGl2ZSBwYWNrZXQgcGF5bG9hZC4gVGhlIGFjdHVhbCB2YWx1ZSBpcyB3cml0dGVuIGludG8gdGhlIHBhY2tldAorICogaW4gbGl0dGxlIGVuZGlhbi4KKyAqLworc3RydWN0IG5sODAyMTFfd293bGFuX3RjcF9kYXRhX3NlcSB7CisJX191MzIgc3RhcnQsIG9mZnNldCwgbGVuOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgbmw4MDIxMV93b3dsYW5fdGNwX2RhdGFfdG9rZW4gLSBXb1dMQU4gVENQIGRhdGEgdG9rZW4gY29uZmlnCisgKiBAb2Zmc2V0OiBvZmZzZXQgb2YgdG9rZW4gaW4gcGFja2V0CisgKiBAbGVuOiBsZW5ndGggb2YgZWFjaCB0b2tlbgorICogQHRva2VuX3N0cmVhbTogc3RyZWFtIG9mIGRhdGEgdG8gYmUgdXNlZCBmb3IgdGhlIHRva2VucywgdGhlIGxlbmd0aCBtdXN0CisgKgliZSBhIG11bHRpcGxlIG9mIEBsZW4gZm9yIHRoaXMgdG8gbWFrZSBzZW5zZQorICovCitzdHJ1Y3Qgbmw4MDIxMV93b3dsYW5fdGNwX2RhdGFfdG9rZW4geworCV9fdTMyIG9mZnNldCwgbGVuOworCV9fdTggdG9rZW5fc3RyZWFtW107Cit9OworCisvKioKKyAqIHN0cnVjdCBubDgwMjExX3dvd2xhbl90Y3BfZGF0YV90b2tlbl9mZWF0dXJlIC0gZGF0YSB0b2tlbiBmZWF0dXJlcworICogQG1pbl9sZW46IG1pbmltdW0gdG9rZW4gbGVuZ3RoCisgKiBAbWF4X2xlbjogbWF4aW11bSB0b2tlbiBsZW5ndGgKKyAqIEBidWZzaXplOiB0b3RhbCBhdmFpbGFibGUgdG9rZW4gYnVmZmVyIHNpemUgKG1heCBzaXplIG9mIEB0b2tlbl9zdHJlYW0pCisgKi8KK3N0cnVjdCBubDgwMjExX3dvd2xhbl90Y3BfZGF0YV90b2tlbl9mZWF0dXJlIHsKKwlfX3UzMiBtaW5fbGVuLCBtYXhfbGVuLCBidWZzaXplOworfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfd293bGFuX3RjcF9hdHRycyAtIFdvV0xBTiBUQ1AgY29ubmVjdGlvbiBwYXJhbWV0ZXJzCisgKiBAX19OTDgwMjExX1dPV0xBTl9UQ1BfSU5WQUxJRDogaW52YWxpZCBudW1iZXIgZm9yIG5lc3RlZCBhdHRyaWJ1dGVzCisgKiBATkw4MDIxMV9XT1dMQU5fVENQX1NSQ19JUFY0OiBzb3VyY2UgSVB2NCBhZGRyZXNzIChpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpCisgKiBATkw4MDIxMV9XT1dMQU5fVENQX0RTVF9JUFY0OiBkZXN0aW5hdGlvbiBJUHY0IGFkZHJlc3MKKyAqCShpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpCisgKiBATkw4MDIxMV9XT1dMQU5fVENQX0RTVF9NQUM6IGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzLCB0aGlzIGlzIGdpdmVuIGJlY2F1c2UKKyAqCXJvdXRlIGxvb2t1cCB3aGVuIGNvbmZpZ3VyZWQgbWlnaHQgYmUgaW52YWxpZCBieSB0aGUgdGltZSB3ZSBzdXNwZW5kLAorICoJYW5kIGRvaW5nIGEgcm91dGUgbG9va3VwIHdoZW4gc3VzcGVuZGluZyBpcyBubyBsb25nZXIgcG9zc2libGUgYXMgaXQKKyAqCW1pZ2h0IHJlcXVpcmUgQVJQIHF1ZXJ5aW5nLgorICogQE5MODAyMTFfV09XTEFOX1RDUF9TUkNfUE9SVDogc291cmNlIHBvcnQgKHUxNik7IG9wdGlvbmFsLCBpZiBub3QgZ2l2ZW4gYQorICoJc29ja2V0IGFuZCBwb3J0IHdpbGwgYmUgYWxsb2NhdGVkCisgKiBATkw4MDIxMV9XT1dMQU5fVENQX0RTVF9QT1JUOiBkZXN0aW5hdGlvbiBwb3J0ICh1MTYpCisgKiBATkw4MDIxMV9XT1dMQU5fVENQX0RBVEFfUEFZTE9BRDogZGF0YSBwYWNrZXQgcGF5bG9hZCwgYXQgbGVhc3Qgb25lIGJ5dGUuCisgKglGb3IgZmVhdHVyZSBhZHZlcnRpc2luZywgYSB1MzIgYXR0cmlidXRlIGhvbGRpbmcgdGhlIG1heGltdW0gbGVuZ3RoCisgKglvZiB0aGUgZGF0YSBwYXlsb2FkLgorICogQE5MODAyMTFfV09XTEFOX1RDUF9EQVRBX1BBWUxPQURfU0VROiBkYXRhIHBhY2tldCBzZXF1ZW5jZSBjb25maWd1cmF0aW9uCisgKgkoaWYgZGVzaXJlZCksIGEgJnN0cnVjdCBubDgwMjExX3dvd2xhbl90Y3BfZGF0YV9zZXEuIEZvciBmZWF0dXJlCisgKglhZHZlcnRpc2luZyBpdCBpcyBqdXN0IGEgZmxhZworICogQE5MODAyMTFfV09XTEFOX1RDUF9EQVRBX1BBWUxPQURfVE9LRU46IGRhdGEgcGFja2V0IHRva2VuIGNvbmZpZ3VyYXRpb24sCisgKglzZWUgJnN0cnVjdCBubDgwMjExX3dvd2xhbl90Y3BfZGF0YV90b2tlbiBhbmQgZm9yIGFkdmVydGlzaW5nIHNlZQorICoJJnN0cnVjdCBubDgwMjExX3dvd2xhbl90Y3BfZGF0YV90b2tlbl9mZWF0dXJlLgorICogQE5MODAyMTFfV09XTEFOX1RDUF9EQVRBX0lOVEVSVkFMOiBkYXRhIGludGVydmFsIGluIHNlY29uZHMsIG1heGltdW0KKyAqCWludGVydmFsIGluIGZlYXR1cmUgYWR2ZXJ0aXNpbmcgKHUzMikKKyAqIEBOTDgwMjExX1dPV0xBTl9UQ1BfV0FLRV9QQVlMT0FEOiB3YWtlIHBhY2tldCBwYXlsb2FkLCBmb3IgYWR2ZXJ0aXNpbmcgYQorICoJdTMyIGF0dHJpYnV0ZSBob2xkaW5nIHRoZSBtYXhpbXVtIGxlbmd0aAorICogQE5MODAyMTFfV09XTEFOX1RDUF9XQUtFX01BU0s6IFdha2UgcGFja2V0IHBheWxvYWQgbWFzaywgbm90IHVzZWQgZm9yCisgKglmZWF0dXJlIGFkdmVydGlzaW5nLiBUaGUgbWFzayB3b3JrcyBsaWtlIEBOTDgwMjExX1dPV0xBTl9QS1RQQVRfTUFTSworICoJYnV0IG9uIHRoZSBUQ1AgcGF5bG9hZCBvbmx5LgorICogQE5VTV9OTDgwMjExX1dPV0xBTl9UQ1A6IG51bWJlciBvZiBUQ1AgYXR0cmlidXRlcworICogQE1BWF9OTDgwMjExX1dPV0xBTl9UQ1A6IGhpZ2hlc3QgYXR0cmlidXRlIG51bWJlcgorICovCitlbnVtIG5sODAyMTFfd293bGFuX3RjcF9hdHRycyB7CisJX19OTDgwMjExX1dPV0xBTl9UQ1BfSU5WQUxJRCwKKwlOTDgwMjExX1dPV0xBTl9UQ1BfU1JDX0lQVjQsCisJTkw4MDIxMV9XT1dMQU5fVENQX0RTVF9JUFY0LAorCU5MODAyMTFfV09XTEFOX1RDUF9EU1RfTUFDLAorCU5MODAyMTFfV09XTEFOX1RDUF9TUkNfUE9SVCwKKwlOTDgwMjExX1dPV0xBTl9UQ1BfRFNUX1BPUlQsCisJTkw4MDIxMV9XT1dMQU5fVENQX0RBVEFfUEFZTE9BRCwKKwlOTDgwMjExX1dPV0xBTl9UQ1BfREFUQV9QQVlMT0FEX1NFUSwKKwlOTDgwMjExX1dPV0xBTl9UQ1BfREFUQV9QQVlMT0FEX1RPS0VOLAorCU5MODAyMTFfV09XTEFOX1RDUF9EQVRBX0lOVEVSVkFMLAorCU5MODAyMTFfV09XTEFOX1RDUF9XQUtFX1BBWUxPQUQsCisJTkw4MDIxMV9XT1dMQU5fVENQX1dBS0VfTUFTSywKKworCS8qIGtlZXAgbGFzdCAqLworCU5VTV9OTDgwMjExX1dPV0xBTl9UQ1AsCisJTUFYX05MODAyMTFfV09XTEFOX1RDUCA9IE5VTV9OTDgwMjExX1dPV0xBTl9UQ1AgLSAxCit9OworCisvKioKICAqIGVudW0gbmw4MDIxMV9pZmFjZV9saW1pdF9hdHRycyAtIGxpbWl0IGF0dHJpYnV0ZXMKICAqIEBOTDgwMjExX0lGQUNFX0xJTUlUX1VOU1BFQzogKHJlc2VydmVkKQogICogQE5MODAyMTFfSUZBQ0VfTElNSVRfTUFYOiBtYXhpbXVtIG51bWJlciBvZiBpbnRlcmZhY2VzIHRoYXQKQEAgLTI4MDYsNiArMzIzMyw4IEBACiAgKgl0aGUgaW5mcmFzdHJ1Y3R1cmUgbmV0d29yaydzIGJlYWNvbiBpbnRlcnZhbC4KICAqIEBOTDgwMjExX0lGQUNFX0NPTUJfTlVNX0NIQU5ORUxTOiB1MzIgYXR0cmlidXRlIHNwZWNpZnlpbmcgaG93IG1hbnkKICAqCWRpZmZlcmVudCBjaGFubmVscyBtYXkgYmUgdXNlZCB3aXRoaW4gdGhpcyBncm91cC4KKyAqIEBOTDgwMjExX0lGQUNFX0NPTUJfUkFEQVJfREVURUNUX1dJRFRIUzogdTMyIGF0dHJpYnV0ZSBjb250YWluaW5nIHRoZSBiaXRtYXAKKyAqCW9mIHN1cHBvcnRlZCBjaGFubmVsIHdpZHRocyBmb3IgcmFkYXIgZGV0ZWN0aW9uLgogICogQE5VTV9OTDgwMjExX0lGQUNFX0NPTUI6IG51bWJlciBvZiBhdHRyaWJ1dGVzCiAgKiBATUFYX05MODAyMTFfSUZBQ0VfQ09NQjogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyCiAgKgpAQCAtMjgzOCw2ICszMjY3LDcgQEAKIAlOTDgwMjExX0lGQUNFX0NPTUJfTUFYTlVNLAogCU5MODAyMTFfSUZBQ0VfQ09NQl9TVEFfQVBfQklfTUFUQ0gsCiAJTkw4MDIxMV9JRkFDRV9DT01CX05VTV9DSEFOTkVMUywKKwlOTDgwMjExX0lGQUNFX0NPTUJfUkFEQVJfREVURUNUX1dJRFRIUywKIAogCS8qIGtlZXAgbGFzdCAqLwogCU5VTV9OTDgwMjExX0lGQUNFX0NPTUIsCkBAIC0yOTk0LDEyICszNDI0LDU2IEBACiAgKiBATkw4MDIxMV9GRUFUVVJFX0NFTExfQkFTRV9SRUdfSElOVFM6IFRoaXMgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZAogICoJdG8gd29yayBwcm9wZXJseSB0byBzdXBwcG9ydCByZWNlaXZpbmcgcmVndWxhdG9yeSBoaW50cyBmcm9tCiAgKgljZWxsdWxhciBiYXNlIHN0YXRpb25zLgorICogQE5MODAyMTFfRkVBVFVSRV9QMlBfREVWSUNFX05FRURTX0NIQU5ORUw6IElmIHRoaXMgaXMgc2V0LCBhbiBhY3RpdmUKKyAqCVAyUCBEZXZpY2UgKCVOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSByZXF1aXJlcyBpdHMgb3duIGNoYW5uZWwKKyAqCWluIHRoZSBpbnRlcmZhY2UgY29tYmluYXRpb25zLCBldmVuIHdoZW4gaXQncyBvbmx5IHVzZWQgZm9yIHNjYW4KKyAqCWFuZCByZW1haW4tb24tY2hhbm5lbC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8sIGZvciBleGFtcGxlLCB0aGUKKyAqCXJlbWFpbi1vbi1jaGFubmVsIGltcGxlbWVudGF0aW9uIHJlcXVpcmluZyBhIGNoYW5uZWwgY29udGV4dC4KKyAqIEBOTDgwMjExX0ZFQVRVUkVfU0FFOiBUaGlzIGRyaXZlciBzdXBwb3J0cyBzaW11bHRhbmVvdXMgYXV0aGVudGljYXRpb24gb2YKKyAqCWVxdWFscyAoU0FFKSB3aXRoIHVzZXIgc3BhY2UgU01FIChOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUpIGluIHN0YXRpb24KKyAqCW1vZGUKKyAqIEBOTDgwMjExX0ZFQVRVUkVfTE9XX1BSSU9SSVRZX1NDQU46IFRoaXMgZHJpdmVyIHN1cHBvcnRzIGxvdyBwcmlvcml0eSBzY2FuCisgKiBATkw4MDIxMV9GRUFUVVJFX1NDQU5fRkxVU0g6IFNjYW4gZmx1c2ggaXMgc3VwcG9ydGVkCisgKiBATkw4MDIxMV9GRUFUVVJFX0FQX1NDQU46IFN1cHBvcnQgc2Nhbm5pbmcgdXNpbmcgYW4gQVAgdmlmCisgKiBATkw4MDIxMV9GRUFUVVJFX1ZJRl9UWFBPV0VSOiBUaGUgZHJpdmVyIHN1cHBvcnRzIHBlci12aWYgVFggcG93ZXIgc2V0dGluZworICogQE5MODAyMTFfRkVBVFVSRV9ORUVEX09CU1NfU0NBTjogVGhlIGRyaXZlciBleHBlY3RzIHVzZXJzcGFjZSB0byBwZXJmb3JtCisgKglPQlNTIHNjYW5zIGFuZCBnZW5lcmF0ZSAyMC80MCBCU1MgY29leCByZXBvcnRzLiBUaGlzIGZsYWcgaXMgdXNlZCBvbmx5CisgKglmb3IgZHJpdmVycyBpbXBsZW1lbnRpbmcgdGhlIENPTk5FQ1QgQVBJLCBmb3IgQVVUSC9BU1NPQyBpdCBpcyBpbXBsaWVkLgorICogQE5MODAyMTFfRkVBVFVSRV9QMlBfR09fQ1RXSU46IFAyUCBHTyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBDVCBXaW5kb3cKKyAqCXNldHRpbmcKKyAqIEBOTDgwMjExX0ZFQVRVUkVfUDJQX0dPX09QUFBTOiBQMlAgR08gaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb3Bwb3J0dW5pc3RpYworICoJcG93ZXJzYXZlCisgKiBATkw4MDIxMV9GRUFUVVJFX0ZVTExfQVBfQ0xJRU5UX1NUQVRFOiBUaGUgZHJpdmVyIHN1cHBvcnRzIGZ1bGwgc3RhdGUKKyAqCXRyYW5zaXRpb25zIGZvciBBUCBjbGllbnRzLiBXaXRob3V0IHRoaXMgZmxhZyAoYW5kIGlmIHRoZSBkcml2ZXIKKyAqCWRvZXNuJ3QgaGF2ZSB0aGUgQVAgU01FIGluIHRoZSBkZXZpY2UpIHRoZSBkcml2ZXIgc3VwcG9ydHMgYWRkaW5nCisgKglzdGF0aW9ucyBvbmx5IHdoZW4gdGhleSdyZSBhc3NvY2lhdGVkIGFuZCBhZGRzIHRoZW0gaW4gYXNzb2NpYXRlZAorICoJc3RhdGUgKHRvIGxhdGVyIGJlIHRyYW5zaXRpb25lZCBpbnRvIGF1dGhvcml6ZWQpLCB3aXRoIHRoaXMgZmxhZworICoJdGhleSBzaG91bGQgYmUgYWRkZWQgYmVmb3JlIGV2ZW4gc2VuZGluZyB0aGUgYXV0aGVudGljYXRpb24gcmVwbHkKKyAqCWFuZCB0aGVuIHRyYW5zaXRpb25lZCBpbnRvIGF1dGhlbnRpY2F0ZWQsIGFzc29jaWF0ZWQgYW5kIGF1dGhvcml6ZWQKKyAqCXN0YXRlcyB1c2luZyBzdGF0aW9uIGZsYWdzLgorICoJTm90ZSB0aGF0IGV2ZW4gZm9yIGRyaXZlcnMgdGhhdCBzdXBwb3J0IHRoaXMsIHRoZSBkZWZhdWx0IGlzIHRvIGFkZAorICoJc3RhdGlvbnMgaW4gYXV0aGVudGljYXRlZC9hc3NvY2lhdGVkIHN0YXRlLCBzbyB0byBhZGQgdW5hdXRoZW50aWNhdGVkCisgKglzdGF0aW9ucyB0aGUgYXV0aGVudGljYXRlZC9hc3NvY2lhdGVkIGJpdHMgaGF2ZSB0byBiZSBzZXQgaW4gdGhlIG1hc2suCisgKiBATkw4MDIxMV9GRUFUVVJFX0FEVkVSVElTRV9DSEFOX0xJTUlUUzogY2ZnODAyMTEgYWR2ZXJ0aXNlcyBjaGFubmVsIGxpbWl0cworICoJKEhUNDAsIFZIVCA4MC8xNjAgTUh6KSBpZiB0aGlzIGZsYWcgaXMgc2V0CiAgKi8KIGVudW0gbmw4MDIxMV9mZWF0dXJlX2ZsYWdzIHsKLQlOTDgwMjExX0ZFQVRVUkVfU0tfVFhfU1RBVFVTCT0gMSA8PCAwLAotCU5MODAyMTFfRkVBVFVSRV9IVF9JQlNTCQk9IDEgPDwgMSwKLQlOTDgwMjExX0ZFQVRVUkVfSU5BQ1RJVklUWV9USU1FUiA9IDEgPDwgMiwKLQlOTDgwMjExX0ZFQVRVUkVfQ0VMTF9CQVNFX1JFR19ISU5UUyA9IDEgPDwgMywKKwlOTDgwMjExX0ZFQVRVUkVfU0tfVFhfU1RBVFVTCQkJPSAxIDw8IDAsCisJTkw4MDIxMV9GRUFUVVJFX0hUX0lCU1MJCQkJPSAxIDw8IDEsCisJTkw4MDIxMV9GRUFUVVJFX0lOQUNUSVZJVFlfVElNRVIJCT0gMSA8PCAyLAorCU5MODAyMTFfRkVBVFVSRV9DRUxMX0JBU0VfUkVHX0hJTlRTCQk9IDEgPDwgMywKKwlOTDgwMjExX0ZFQVRVUkVfUDJQX0RFVklDRV9ORUVEU19DSEFOTkVMCT0gMSA8PCA0LAorCU5MODAyMTFfRkVBVFVSRV9TQUUJCQkJPSAxIDw8IDUsCisJTkw4MDIxMV9GRUFUVVJFX0xPV19QUklPUklUWV9TQ0FOCQk9IDEgPDwgNiwKKwlOTDgwMjExX0ZFQVRVUkVfU0NBTl9GTFVTSAkJCT0gMSA8PCA3LAorCU5MODAyMTFfRkVBVFVSRV9BUF9TQ0FOCQkJCT0gMSA8PCA4LAorCU5MODAyMTFfRkVBVFVSRV9WSUZfVFhQT1dFUgkJCT0gMSA8PCA5LAorCU5MODAyMTFfRkVBVFVSRV9ORUVEX09CU1NfU0NBTgkJCT0gMSA8PCAxMCwKKwlOTDgwMjExX0ZFQVRVUkVfUDJQX0dPX0NUV0lOCQkJPSAxIDw8IDExLAorCU5MODAyMTFfRkVBVFVSRV9QMlBfR09fT1BQUFMJCQk9IDEgPDwgMTIsCisJLyogYml0IDEzIGlzIHJlc2VydmVkICovCisJTkw4MDIxMV9GRUFUVVJFX0FEVkVSVElTRV9DSEFOX0xJTUlUUwkJPSAxIDw8IDE0LAorCU5MODAyMTFfRkVBVFVSRV9GVUxMX0FQX0NMSUVOVF9TVEFURQkJPSAxIDw8IDE1LAogfTsKIAogLyoqCkBAIC0zMDIzLDQgKzM0OTcsOTQgQEAKIAlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUXzgwMjExVSA9CTE8PDMsCiB9OwogCisvKioKKyAqIGVudW0gbmw4MDIxMV9jb25uZWN0X2ZhaWxlZF9yZWFzb24gLSBjb25uZWN0aW9uIHJlcXVlc3QgZmFpbGVkIHJlYXNvbnMKKyAqIEBOTDgwMjExX0NPTk5fRkFJTF9NQVhfQ0xJRU5UUzogTWF4aW11bSBudW1iZXIgb2YgY2xpZW50cyB0aGF0IGNhbiBiZQorICoJaGFuZGxlZCBieSB0aGUgQVAgaXMgcmVhY2hlZC4KKyAqIEBOTDgwMjExX0NPTk5fRkFJTF9CTE9DS0VEX0NMSUVOVDogQ29ubmVjdGlvbiByZXF1ZXN0IGlzIHJlamVjdGVkIGR1ZSB0byBBQ0wuCisgKi8KK2VudW0gbmw4MDIxMV9jb25uZWN0X2ZhaWxlZF9yZWFzb24geworCU5MODAyMTFfQ09OTl9GQUlMX01BWF9DTElFTlRTLAorCU5MODAyMTFfQ09OTl9GQUlMX0JMT0NLRURfQ0xJRU5ULAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfc2Nhbl9mbGFncyAtICBzY2FuIHJlcXVlc3QgY29udHJvbCBmbGFncworICoKKyAqIFNjYW4gcmVxdWVzdCBjb250cm9sIGZsYWdzIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGhhbmRsaW5nCisgKiBvZiBOTDgwMjExX0NNRF9UUklHR0VSX1NDQU4gYW5kIE5MODAyMTFfQ01EX1NUQVJUX1NDSEVEX1NDQU4KKyAqIHJlcXVlc3RzLgorICoKKyAqIEBOTDgwMjExX1NDQU5fRkxBR19MT1dfUFJJT1JJVFk6IHNjYW4gcmVxdWVzdCBoYXMgbG93IHByaW9yaXR5CisgKiBATkw4MDIxMV9TQ0FOX0ZMQUdfRkxVU0g6IGZsdXNoIGNhY2hlIGJlZm9yZSBzY2FubmluZworICogQE5MODAyMTFfU0NBTl9GTEFHX0FQOiBmb3JjZSBhIHNjYW4gZXZlbiBpZiB0aGUgaW50ZXJmYWNlIGlzIGNvbmZpZ3VyZWQKKyAqCWFzIEFQIGFuZCB0aGUgYmVhY29uaW5nIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZC4gVGhpcyBhdHRyaWJ1dGUgaXMKKyAqCWRhbmdlcm91cyBiZWNhdXNlIHdpbGwgZGVzdHJveSBzdGF0aW9ucyBwZXJmb3JtYW5jZSBhcyBhIGxvdCBvZiBmcmFtZXMKKyAqCXdpbGwgYmUgbG9zdCB3aGlsZSBzY2FubmluZyBvZmYtY2hhbm5lbCwgdGhlcmVmb3JlIGl0IG11c3QgYmUgdXNlZCBvbmx5CisgKgl3aGVuIHJlYWxseSBuZWVkZWQKKyAqLworZW51bSBubDgwMjExX3NjYW5fZmxhZ3MgeworCU5MODAyMTFfU0NBTl9GTEFHX0xPV19QUklPUklUWQkJCT0gMTw8MCwKKwlOTDgwMjExX1NDQU5fRkxBR19GTFVTSAkJCQk9IDE8PDEsCisJTkw4MDIxMV9TQ0FOX0ZMQUdfQVAJCQkJPSAxPDwyLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfYWNsX3BvbGljeSAtIGFjY2VzcyBjb250cm9sIHBvbGljeQorICoKKyAqIEFjY2VzcyBjb250cm9sIHBvbGljeSBpcyBhcHBsaWVkIG9uIGEgTUFDIGxpc3Qgc2V0IGJ5CisgKiAlTkw4MDIxMV9DTURfU1RBUlRfQVAgYW5kICVOTDgwMjExX0NNRF9TRVRfTUFDX0FDTCwgdG8KKyAqIGJlIHVzZWQgd2l0aCAlTkw4MDIxMV9BVFRSX0FDTF9QT0xJQ1kuCisgKgorICogQE5MODAyMTFfQUNMX1BPTElDWV9BQ0NFUFRfVU5MRVNTX0xJU1RFRDogRGVueSBzdGF0aW9ucyB3aGljaCBhcmUKKyAqCWxpc3RlZCBpbiBBQ0wsIGkuZS4gYWxsb3cgYWxsIHRoZSBzdGF0aW9ucyB3aGljaCBhcmUgbm90IGxpc3RlZAorICoJaW4gQUNMIHRvIGF1dGhlbnRpY2F0ZS4KKyAqIEBOTDgwMjExX0FDTF9QT0xJQ1lfREVOWV9VTkxFU1NfTElTVEVEOiBBbGxvdyB0aGUgc3RhdGlvbnMgd2hpY2ggYXJlIGxpc3RlZAorICoJaW4gQUNMLCBpLmUuIGRlbnkgYWxsIHRoZSBzdGF0aW9ucyB3aGljaCBhcmUgbm90IGxpc3RlZCBpbiBBQ0wuCisgKi8KK2VudW0gbmw4MDIxMV9hY2xfcG9saWN5IHsKKwlOTDgwMjExX0FDTF9QT0xJQ1lfQUNDRVBUX1VOTEVTU19MSVNURUQsCisJTkw4MDIxMV9BQ0xfUE9MSUNZX0RFTllfVU5MRVNTX0xJU1RFRCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3JhZGFyX2V2ZW50IC0gdHlwZSBvZiByYWRhciBldmVudCBmb3IgREZTIG9wZXJhdGlvbgorICoKKyAqIFR5cGUgb2YgZXZlbnQgdG8gYmUgdXNlZCB3aXRoIE5MODAyMTFfQVRUUl9SQURBUl9FVkVOVCB0byBpbmZvcm0gdXNlcnNwYWNlCisgKiBhYm91dCBkZXRlY3RlZCByYWRhcnMgb3Igc3VjY2VzcyBvZiB0aGUgY2hhbm5lbCBhdmFpbGFibGUgY2hlY2sgKENBQykKKyAqCisgKiBATkw4MDIxMV9SQURBUl9ERVRFQ1RFRDogQSByYWRhciBwYXR0ZXJuIGhhcyBiZWVuIGRldGVjdGVkLiBUaGUgY2hhbm5lbCBpcworICoJbm93IHVudXNhYmxlLgorICogQE5MODAyMTFfUkFEQVJfQ0FDX0ZJTklTSEVEOiBDaGFubmVsIEF2YWlsYWJpbGl0eSBDaGVjayBoYXMgYmVlbiBmaW5pc2hlZCwKKyAqCXRoZSBjaGFubmVsIGlzIG5vdyBhdmFpbGFibGUuCisgKiBATkw4MDIxMV9SQURBUl9DQUNfQUJPUlRFRDogQ2hhbm5lbCBBdmFpbGFiaWxpdHkgQ2hlY2sgaGFzIGJlZW4gYWJvcnRlZCwgbm8KKyAqCWNoYW5nZSB0byB0aGUgY2hhbm5lbCBzdGF0dXMuCisgKiBATkw4MDIxMV9SQURBUl9OT1BfRklOSVNIRUQ6IFRoZSBOb24tT2NjdXBhbmN5IFBlcmlvZCBmb3IgdGhpcyBjaGFubmVsIGlzCisgKglvdmVyLCBjaGFubmVsIGJlY29tZXMgdXNhYmxlLgorICovCitlbnVtIG5sODAyMTFfcmFkYXJfZXZlbnQgeworCU5MODAyMTFfUkFEQVJfREVURUNURUQsCisJTkw4MDIxMV9SQURBUl9DQUNfRklOSVNIRUQsCisJTkw4MDIxMV9SQURBUl9DQUNfQUJPUlRFRCwKKwlOTDgwMjExX1JBREFSX05PUF9GSU5JU0hFRCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2Rmc19zdGF0ZSAtIERGUyBzdGF0ZXMgZm9yIGNoYW5uZWxzCisgKgorICogQ2hhbm5lbCBzdGF0ZXMgdXNlZCBieSB0aGUgREZTIGNvZGUuCisgKgorICogQElFRUU4MDIxMV9ERlNfVVNBQkxFOiBUaGUgY2hhbm5lbCBjYW4gYmUgdXNlZCwgYnV0IGNoYW5uZWwgYXZhaWxhYmlsaXR5CisgKgljaGVjayAoQ0FDKSBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdXNpbmcgaXQgZm9yIEFQIG9yIElCU1MuCisgKiBASUVFRTgwMjExX0RGU19VTkFWQUlMQUJMRTogQSByYWRhciBoYXMgYmVlbiBkZXRlY3RlZCBvbiB0aGlzIGNoYW5uZWwsIGl0CisgKglpcyB0aGVyZWZvcmUgbWFya2VkIGFzIG5vdCBhdmFpbGFibGUuCisgKiBASUVFRTgwMjExX0RGU19BVkFJTEFCTEU6IFRoZSBjaGFubmVsIGhhcyBiZWVuIENBQyBjaGVja2VkIGFuZCBpcyBhdmFpbGFibGUuCisgKi8KKworZW51bSBubDgwMjExX2Rmc19zdGF0ZSB7CisJTkw4MDIxMV9ERlNfVVNBQkxFLAorCU5MODAyMTFfREZTX1VOQVZBSUxBQkxFLAorCU5MODAyMTFfREZTX0FWQUlMQUJMRSwKK307CisKICNlbmRpZiAvKiBfX0xJTlVYX05MODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9jb21tb24vZWFwX2dwc2tfY29tbW9uLmMgYi9zcmMvZWFwX2NvbW1vbi9lYXBfZ3Bza19jb21tb24uYwppbmRleCA3ZDEwNmRkLi43YTMzMjE1IDEwMDY0NAotLS0gYS9zcmMvZWFwX2NvbW1vbi9lYXBfZ3Bza19jb21tb24uYworKysgYi9zcmMvZWFwX2NvbW1vbi9lYXBfZ3Bza19jb21tb24uYwpAQCAtMzQwLDYgKzM0MCwxNDEgQEAKIH0KIAogCitzdGF0aWMgaW50IGVhcF9ncHNrX2Rlcml2ZV9taWRfaGVscGVyKHUzMiBjc3VpdGVfc3BlY2lmaWVyLAorCQkJCSAgICAgIHU4ICprZGZfb3V0LCBzaXplX3Qga2RmX291dF9sZW4sCisJCQkJICAgICAgY29uc3QgdTggKnBzaywgY29uc3QgdTggKnNlZWQsCisJCQkJICAgICAgc2l6ZV90IHNlZWRfbGVuLCB1OCBtZXRob2RfdHlwZSkKK3sKKwl1OCAqcG9zLCAqZGF0YTsKKwlzaXplX3QgZGF0YV9sZW47CisJaW50ICgqZ2tkZikoY29uc3QgdTggKl9wc2ssIGNvbnN0IHU4ICpfZGF0YSwgc2l6ZV90IF9kYXRhX2xlbiwKKwkJICAgIHU4ICpidWYsIHNpemVfdCBsZW4pOworCisJZ2tkZiA9IE5VTEw7CisJc3dpdGNoIChjc3VpdGVfc3BlY2lmaWVyKSB7CisJY2FzZSBFQVBfR1BTS19DSVBIRVJfQUVTOgorCQlna2RmID0gZWFwX2dwc2tfZ2tkZl9jbWFjOworCQlicmVhazsKKyNpZmRlZiBFQVBfR1BTS19TSEEyNTYKKwljYXNlIEVBUF9HUFNLX0NJUEhFUl9TSEEyNTY6CisJCWdrZGYgPSBlYXBfZ3Bza19na2RmX3NoYTI1NjsKKwkJYnJlYWs7CisjZW5kaWYgLyogRUFQX0dQU0tfU0hBMjU2ICovCisJZGVmYXVsdDoKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJFQVAtR1BTSzogVW5rbm93biBjaXBoZXIgJWQgdXNlZCBpbiAiCisJCQkgICAiU2Vzc2lvbi1JZCBkZXJpdmF0aW9uIiwgY3N1aXRlX3NwZWNpZmllcik7CisJCXJldHVybiAtMTsKKwl9CisKKyNkZWZpbmUgU0lEX0xBQkVMICJNZXRob2QgSUQiCisJLyogIk1ldGhvZCBJRCIgfHwgRUFQX01ldGhvZF9UeXBlIHx8IENTdWl0ZV9TZWwgfHwgaW5wdXRTdHJpbmcgKi8KKwlkYXRhX2xlbiA9IHN0cmxlbihTSURfTEFCRUwpICsgMSArIDYgKyBzZWVkX2xlbjsKKwlkYXRhID0gb3NfbWFsbG9jKGRhdGFfbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcG9zID0gZGF0YTsKKwlvc19tZW1jcHkocG9zLCBTSURfTEFCRUwsIHN0cmxlbihTSURfTEFCRUwpKTsKKwlwb3MgKz0gc3RybGVuKFNJRF9MQUJFTCk7CisjdW5kZWYgU0lEX0xBQkVMCisJb3NfbWVtY3B5KHBvcywgJm1ldGhvZF90eXBlLCAxKTsKKwlwb3MgKz0gMTsKKwlXUEFfUFVUX0JFMzIocG9zLCBFQVBfR1BTS19WRU5ET1JfSUVURik7IC8qIENTdWl0ZS9WZW5kb3IgPSBJRVRGICovCisJcG9zICs9IDQ7CisJV1BBX1BVVF9CRTE2KHBvcywgY3N1aXRlX3NwZWNpZmllcik7IC8qIENTdWl0ZS9TcGVjaWZpZXIgKi8KKwlwb3MgKz0gMjsKKwlvc19tZW1jcHkocG9zLCBzZWVkLCBzZWVkX2xlbik7IC8qIGlucHV0U3RyaW5nICovCisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiRUFQLUdQU0s6IERhdGEgdG8gTWV0aG9kIElEIGRlcml2YXRpb24iLAorCQkgICAgZGF0YSwgZGF0YV9sZW4pOworCisJaWYgKGdrZGYocHNrLCBkYXRhLCBkYXRhX2xlbiwga2RmX291dCwga2RmX291dF9sZW4pIDwgMCkgeworCQlvc19mcmVlKGRhdGEpOworCQlyZXR1cm4gLTE7CisJfQorCW9zX2ZyZWUoZGF0YSk7CisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiRUFQLUdQU0s6IE1ldGhvZCBJRCIsIGtkZl9vdXQsIGtkZl9vdXRfbGVuKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogZWFwX2dwc2tfc2Vzc2lvbl9pZCAtIERlcml2ZSBFQVAtR1BTSyBTZXNzaW9uIElECisgKiBAcHNrOiBQcmUtc2hhcmVkIGtleQorICogQHBza19sZW46IExlbmd0aCBvZiBwc2sgaW4gYnl0ZXMKKyAqIEB2ZW5kb3I6IENTdWl0ZS9WZW5kb3IKKyAqIEBzcGVjaWZpZXI6IENTdWl0ZS9TcGVjaWZpZXIKKyAqIEByYW5kX3BlZXI6IDMyLWJ5dGUgUkFORF9QZWVyCisgKiBAcmFuZF9zZXJ2ZXI6IDMyLWJ5dGUgUkFORF9TZXJ2ZXIKKyAqIEBpZF9wZWVyOiBJRF9QZWVyCisgKiBAaWRfcGVlcl9sZW46IExlbmd0aCBvZiBJRF9QZWVyCisgKiBAaWRfc2VydmVyOiBJRF9TZXJ2ZXIKKyAqIEBpZF9zZXJ2ZXJfbGVuOiBMZW5ndGggb2YgSURfU2VydmVyCisgKiBAbWV0aG9kX3R5cGU6IEVBUCBBdXRoZW50aWNhdGlvbiBNZXRob2QgVHlwZQorICogQHNpZDogQnVmZmVyIGZvciAxNy1ieXRlIFNlc3Npb24gSUQKKyAqIEBzaWRfbGVuOiBCdWZmZXIgZm9yIHJldHVybmluZyBsZW5ndGggb2YgU2Vzc2lvbiBJRAorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBlYXBfZ3Bza19kZXJpdmVfc2Vzc2lvbl9pZChjb25zdCB1OCAqcHNrLCBzaXplX3QgcHNrX2xlbiwgaW50IHZlbmRvciwKKwkJCSAgICAgICBpbnQgc3BlY2lmaWVyLAorCQkJICAgICAgIGNvbnN0IHU4ICpyYW5kX3BlZXIsIGNvbnN0IHU4ICpyYW5kX3NlcnZlciwKKwkJCSAgICAgICBjb25zdCB1OCAqaWRfcGVlciwgc2l6ZV90IGlkX3BlZXJfbGVuLAorCQkJICAgICAgIGNvbnN0IHU4ICppZF9zZXJ2ZXIsIHNpemVfdCBpZF9zZXJ2ZXJfbGVuLAorCQkJICAgICAgIHU4IG1ldGhvZF90eXBlLCB1OCAqc2lkLCBzaXplX3QgKnNpZF9sZW4pCit7CisJdTggKnNlZWQsICpwb3M7CisJdTgga2RmX291dFsxNl07CisJc2l6ZV90IHNlZWRfbGVuOworCWludCByZXQ7CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkVBUC1HUFNLOiBEZXJpdmluZyBTZXNzaW9uIElEKCVkOiVkKSIsCisJCSAgIHZlbmRvciwgc3BlY2lmaWVyKTsKKworCWlmICh2ZW5kb3IgIT0gRUFQX0dQU0tfVkVORE9SX0lFVEYpCisJCXJldHVybiAtMTsKKworCXdwYV9oZXhkdW1wX2tleShNU0dfREVCVUcsICJFQVAtR1BTSzogUFNLIiwgcHNrLCBwc2tfbGVuKTsKKworCS8qCisJICogaW5wdXRTdHJpbmcgPSBSQU5EX1BlZXIgfHwgSURfUGVlciB8fCBSQU5EX1NlcnZlciB8fCBJRF9TZXJ2ZXIKKwkgKiAgICAgICAgICAgICg9IHNlZWQpCisJICogS1MgPSAxNiwgQ1N1aXRlX1NlbCA9IDB4MDAwMDAwMDAgMHgwMDAxCisJICogTWV0aG9kLUlEID0gR0tERi0xNiAoemVybywgIk1ldGhvZCBJRCIgfHwgRUFQX01ldGhvZF9UeXBlIHx8CisJICogICAgICAgICAgICAgICAgICAgICAgQ1N1aXRlX1NlbCB8fCBpbnB1dFN0cmluZykKKwkgKi8KKwlzZWVkX2xlbiA9IDIgKiBFQVBfR1BTS19SQU5EX0xFTiArIGlkX3NlcnZlcl9sZW4gKyBpZF9wZWVyX2xlbjsKKwlzZWVkID0gb3NfbWFsbG9jKHNlZWRfbGVuKTsKKwlpZiAoc2VlZCA9PSBOVUxMKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiRUFQLUdQU0s6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgIgorCQkJICAgImZvciBTZXNzaW9uLUlkIGRlcml2YXRpb24iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBvcyA9IHNlZWQ7CisJb3NfbWVtY3B5KHBvcywgcmFuZF9wZWVyLCBFQVBfR1BTS19SQU5EX0xFTik7CisJcG9zICs9IEVBUF9HUFNLX1JBTkRfTEVOOworCW9zX21lbWNweShwb3MsIGlkX3BlZXIsIGlkX3BlZXJfbGVuKTsKKwlwb3MgKz0gaWRfcGVlcl9sZW47CisJb3NfbWVtY3B5KHBvcywgcmFuZF9zZXJ2ZXIsIEVBUF9HUFNLX1JBTkRfTEVOKTsKKwlwb3MgKz0gRUFQX0dQU0tfUkFORF9MRU47CisJb3NfbWVtY3B5KHBvcywgaWRfc2VydmVyLCBpZF9zZXJ2ZXJfbGVuKTsKKwlwb3MgKz0gaWRfc2VydmVyX2xlbjsKKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJFQVAtR1BTSzogU2VlZCIsIHNlZWQsIHNlZWRfbGVuKTsKKworCXJldCA9IGVhcF9ncHNrX2Rlcml2ZV9taWRfaGVscGVyKHNwZWNpZmllciwKKwkJCQkJIGtkZl9vdXQsIHNpemVvZihrZGZfb3V0KSwKKwkJCQkJIHBzaywgc2VlZCwgc2VlZF9sZW4sCisJCQkJCSBtZXRob2RfdHlwZSk7CisKKwlzaWRbMF0gPSBtZXRob2RfdHlwZTsKKwlvc19tZW1jcHkoc2lkICsgMSwga2RmX291dCwgc2l6ZW9mKGtkZl9vdXQpKTsKKwkqc2lkX2xlbiA9IDEgKyBzaXplb2Yoa2RmX291dCk7CisKKwlvc19mcmVlKHNlZWQpOworCisJcmV0dXJuIHJldDsKK30KKworCiAvKioKICAqIGVhcF9ncHNrX21pY19sZW4gLSBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgTUlDCiAgKiBAdmVuZG9yOiBDU3VpdGUvVmVuZG9yCmRpZmYgLS1naXQgYS9zcmMvZWFwX2NvbW1vbi9lYXBfZ3Bza19jb21tb24uaCBiL3NyYy9lYXBfY29tbW9uL2VhcF9ncHNrX2NvbW1vbi5oCmluZGV4IGUzZDJiNmIuLmZiY2Q1NDcgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfY29tbW9uL2VhcF9ncHNrX2NvbW1vbi5oCisrKyBiL3NyYy9lYXBfY29tbW9uL2VhcF9ncHNrX2NvbW1vbi5oCkBAIC01Myw2ICs1MywxMiBAQAogCQkJIGNvbnN0IHU4ICppZF9zZXJ2ZXIsIHNpemVfdCBpZF9zZXJ2ZXJfbGVuLAogCQkJIHU4ICptc2ssIHU4ICplbXNrLCB1OCAqc2ssIHNpemVfdCAqc2tfbGVuLAogCQkJIHU4ICpwaywgc2l6ZV90ICpwa19sZW4pOworaW50IGVhcF9ncHNrX2Rlcml2ZV9zZXNzaW9uX2lkKGNvbnN0IHU4ICpwc2ssIHNpemVfdCBwc2tfbGVuLCBpbnQgdmVuZG9yLAorCQkJICAgICAgIGludCBzcGVjaWZpZXIsCisJCQkgICAgICAgY29uc3QgdTggKnJhbmRfcGVlciwgY29uc3QgdTggKnJhbmRfc2VydmVyLAorCQkJICAgICAgIGNvbnN0IHU4ICppZF9wZWVyLCBzaXplX3QgaWRfcGVlcl9sZW4sCisJCQkgICAgICAgY29uc3QgdTggKmlkX3NlcnZlciwgc2l6ZV90IGlkX3NlcnZlcl9sZW4sCisJCQkgICAgICAgdTggbWV0aG9kX3R5cGUsIHU4ICpzaWQsIHNpemVfdCAqc2lkX2xlbik7CiBzaXplX3QgZWFwX2dwc2tfbWljX2xlbihpbnQgdmVuZG9yLCBpbnQgc3BlY2lmaWVyKTsKIGludCBlYXBfZ3Bza19jb21wdXRlX21pYyhjb25zdCB1OCAqc2ssIHNpemVfdCBza19sZW4sIGludCB2ZW5kb3IsCiAJCQkgaW50IHNwZWNpZmllciwgY29uc3QgdTggKmRhdGEsIHNpemVfdCBsZW4sIHU4ICptaWMpOwpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9wZWVyL2VhcC5jIGIvc3JjL2VhcF9wZWVyL2VhcC5jCmluZGV4IGE0YzliMjUuLjRkZjg4NTMgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfcGVlci9lYXAuYworKysgYi9zcmMvZWFwX3BlZXIvZWFwLmMKQEAgLTE2MSw2ICsxNjEsOCBAQAogCWVhcG9sX3NldF9ib29sKHNtLCBFQVBPTF9lYXBGYWlsLCBGQUxTRSk7CiAJb3NfZnJlZShzbS0+ZWFwS2V5RGF0YSk7CiAJc20tPmVhcEtleURhdGEgPSBOVUxMOworCW9zX2ZyZWUoc20tPmVhcFNlc3Npb25JZCk7CisJc20tPmVhcFNlc3Npb25JZCA9IE5VTEw7CiAJc20tPmVhcEtleUF2YWlsYWJsZSA9IEZBTFNFOwogCWVhcG9sX3NldF9ib29sKHNtLCBFQVBPTF9lYXBSZXN0YXJ0LCBGQUxTRSk7CiAJc20tPmxhc3RJZCA9IC0xOyAvKiBuZXcgc2Vzc2lvbiAtIG1ha2Ugc3VyZSB0aGlzIGRvZXMgbm90IG1hdGNoIHdpdGgKQEAgLTQwMyw2ICs0MDUsMTMgQEAKIAkJb3NfZnJlZShzbS0+ZWFwS2V5RGF0YSk7CiAJCXNtLT5lYXBLZXlEYXRhID0gc20tPm0tPmdldEtleShzbSwgc20tPmVhcF9tZXRob2RfcHJpdiwKIAkJCQkJICAgICAgICZzbS0+ZWFwS2V5RGF0YUxlbik7CisJCW9zX2ZyZWUoc20tPmVhcFNlc3Npb25JZCk7CisJCXNtLT5lYXBTZXNzaW9uSWQgPSBzbS0+bS0+Z2V0U2Vzc2lvbklkKHNtLCBzbS0+ZWFwX21ldGhvZF9wcml2LAorCQkJCQkJICAgICAgICZzbS0+ZWFwU2Vzc2lvbklkTGVuKTsKKwkJaWYgKHNtLT5lYXBTZXNzaW9uSWQpIHsKKwkJCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIkVBUDogU2Vzc2lvbi1JZCIsCisJCQkJICAgIHNtLT5lYXBTZXNzaW9uSWQsIHNtLT5lYXBTZXNzaW9uSWRMZW4pOworCQl9CiAJfQogfQogCkBAIC04OTEsNiArOTAwLDcgQEAKIAogCXdwYV9tc2coc20tPm1zZ19jdHgsIE1TR19JTkZPLCBXUEFfRVZFTlRfRUFQX1NUQVJURUQKIAkJIkVBUCBhdXRoZW50aWNhdGlvbiBzdGFydGVkIik7CisJZWFwX25vdGlmeV9zdGF0dXMoc20sICJzdGFydGVkIiwgIiIpOwogCiAJcG9zID0gZWFwX2hkcl92YWxpZGF0ZShFQVBfVkVORE9SX0lFVEYsIEVBUF9UWVBFX0lERU5USVRZLCByZXEsCiAJCQkgICAgICAgJm1zZ19sZW4pOwpAQCAtMTQ2MSw2ICsxNDcxLDggQEAKIAlzbS0+ZWFwUmVzcERhdGEgPSBOVUxMOwogCW9zX2ZyZWUoc20tPmVhcEtleURhdGEpOwogCXNtLT5lYXBLZXlEYXRhID0gTlVMTDsKKwlvc19mcmVlKHNtLT5lYXBTZXNzaW9uSWQpOworCXNtLT5lYXBTZXNzaW9uSWQgPSBOVUxMOwogCiAJLyogVGhpcyBpcyBub3QgY2xlYXJseSBzcGVjaWZpZWQgaW4gdGhlIEVBUCBzdGF0ZW1hY2hpbmVzIGRyYWZ0LCBidXQKIAkgKiBpdCBzZWVtcyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIHRoYXQgc29tZSBvZiB0aGUgRUFQT0wgdmFyaWFibGVzIGdldApAQCAtMjE1OCw2ICsyMTcwLDI4IEBACiAKIAogLyoqCisgKiBlYXBfZ2V0X2VhcFNlc3Npb25JZCAtIEdldCBTZXNzaW9uLUlkIGZyb20gRUFQIHN0YXRlIG1hY2hpbmUKKyAqIEBzbTogUG9pbnRlciB0byBFQVAgc3RhdGUgbWFjaGluZSBhbGxvY2F0ZWQgd2l0aCBlYXBfcGVlcl9zbV9pbml0KCkKKyAqIEBsZW46IFBvaW50ZXIgdG8gdmFyaWFibGUgdGhhdCB3aWxsIGJlIHNldCB0byBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNlc3Npb24KKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gdGhlIEVBUCBTZXNzaW9uLUlkIG9yICVOVUxMIG9uIGZhaWx1cmUKKyAqCisgKiBGZXRjaCBFQVAgU2Vzc2lvbi1JZCBmcm9tIHRoZSBFQVAgc3RhdGUgbWFjaGluZS4gVGhlIFNlc3Npb24tSWQgaXMgYXZhaWxhYmxlCisgKiBvbmx5IGFmdGVyIGEgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbi4gRUFQIHN0YXRlIG1hY2hpbmUgY29udGludWVzIHRvIG1hbmFnZQorICogdGhlIFNlc3Npb24tSWQgYW5kIHRoZSBjYWxsZXIgbXVzdCBub3QgY2hhbmdlIG9yIGZyZWUgdGhlIHJldHVybmVkIGRhdGEuCisgKi8KK2NvbnN0IHU4ICogZWFwX2dldF9lYXBTZXNzaW9uSWQoc3RydWN0IGVhcF9zbSAqc20sIHNpemVfdCAqbGVuKQoreworCWlmIChzbSA9PSBOVUxMIHx8IHNtLT5lYXBTZXNzaW9uSWQgPT0gTlVMTCkgeworCQkqbGVuID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKmxlbiA9IHNtLT5lYXBTZXNzaW9uSWRMZW47CisJcmV0dXJuIHNtLT5lYXBTZXNzaW9uSWQ7Cit9CisKKworLyoqCiAgKiBlYXBfZ2V0X2VhcEtleURhdGEgLSBHZXQgbWFzdGVyIHNlc3Npb24ga2V5IChNU0spIGZyb20gRUFQIHN0YXRlIG1hY2hpbmUKICAqIEBzbTogUG9pbnRlciB0byBFQVAgc3RhdGUgbWFjaGluZSBhbGxvY2F0ZWQgd2l0aCBlYXBfcGVlcl9zbV9pbml0KCkKICAqIEBsZW46IFBvaW50ZXIgdG8gdmFyaWFibGUgdGhhdCB3aWxsIGJlIHNldCB0byBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGtleQpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9wZWVyL2VhcC5oIGIvc3JjL2VhcF9wZWVyL2VhcC5oCmluZGV4IDhiY2NlZjEuLmY4N2Y5YjMgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfcGVlci9lYXAuaAorKysgYi9zcmMvZWFwX3BlZXIvZWFwLmgKQEAgLTMwNiw2ICszMDYsNyBAQAogaW50IGVhcF9rZXlfYXZhaWxhYmxlKHN0cnVjdCBlYXBfc20gKnNtKTsKIHZvaWQgZWFwX25vdGlmeV9zdWNjZXNzKHN0cnVjdCBlYXBfc20gKnNtKTsKIHZvaWQgZWFwX25vdGlmeV9sb3dlcl9sYXllcl9zdWNjZXNzKHN0cnVjdCBlYXBfc20gKnNtKTsKK2NvbnN0IHU4ICogZWFwX2dldF9lYXBTZXNzaW9uSWQoc3RydWN0IGVhcF9zbSAqc20sIHNpemVfdCAqbGVuKTsKIGNvbnN0IHU4ICogZWFwX2dldF9lYXBLZXlEYXRhKHN0cnVjdCBlYXBfc20gKnNtLCBzaXplX3QgKmxlbik7CiBzdHJ1Y3Qgd3BhYnVmICogZWFwX2dldF9lYXBSZXNwRGF0YShzdHJ1Y3QgZWFwX3NtICpzbSk7CiB2b2lkIGVhcF9yZWdpc3Rlcl9zY2FyZF9jdHgoc3RydWN0IGVhcF9zbSAqc20sIHZvaWQgKmN0eCk7CmRpZmYgLS1naXQgYS9zcmMvZWFwX3BlZXIvZWFwX2FrYS5jIGIvc3JjL2VhcF9wZWVyL2VhcF9ha2EuYwppbmRleCA1OTg2MWNiLi5kYzQyNGQ3IDEwMDY0NAotLS0gYS9zcmMvZWFwX3BlZXIvZWFwX2FrYS5jCisrKyBiL3NyYy9lYXBfcGVlci9lYXBfYWthLmMKQEAgLTEzNDAsNiArMTM0MCwyOCBAQAogfQogCiAKK3N0YXRpYyB1OCAqIGVhcF9ha2FfZ2V0X3Nlc3Npb25faWQoc3RydWN0IGVhcF9zbSAqc20sIHZvaWQgKnByaXYsIHNpemVfdCAqbGVuKQoreworCXN0cnVjdCBlYXBfYWthX2RhdGEgKmRhdGEgPSBwcml2OworCXU4ICppZDsKKworCWlmIChkYXRhLT5zdGF0ZSAhPSBTVUNDRVNTKQorCQlyZXR1cm4gTlVMTDsKKworCSpsZW4gPSAxICsgRUFQX0FLQV9SQU5EX0xFTiArIEVBUF9BS0FfQVVUTl9MRU47CisJaWQgPSBvc19tYWxsb2MoKmxlbik7CisJaWYgKGlkID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWRbMF0gPSBkYXRhLT5lYXBfbWV0aG9kOworCW9zX21lbWNweShpZCArIDEsIGRhdGEtPnJhbmQsIEVBUF9BS0FfUkFORF9MRU4pOworCW9zX21lbWNweShpZCArIDEgKyBFQVBfQUtBX1JBTkRfTEVOLCBkYXRhLT5hdXRuLCBFQVBfQUtBX0FVVE5fTEVOKTsKKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJFQVAtQUtBOiBEZXJpdmVkIFNlc3Npb24tSWQiLCBpZCwgKmxlbik7CisKKwlyZXR1cm4gaWQ7Cit9CisKKwogc3RhdGljIHU4ICogZWFwX2FrYV9nZXRfZW1zayhzdHJ1Y3QgZWFwX3NtICpzbSwgdm9pZCAqcHJpdiwgc2l6ZV90ICpsZW4pCiB7CiAJc3RydWN0IGVhcF9ha2FfZGF0YSAqZGF0YSA9IHByaXY7CkBAIC0xMzc0LDYgKzEzOTYsNyBAQAogCWVhcC0+cHJvY2VzcyA9IGVhcF9ha2FfcHJvY2VzczsKIAllYXAtPmlzS2V5QXZhaWxhYmxlID0gZWFwX2FrYV9pc0tleUF2YWlsYWJsZTsKIAllYXAtPmdldEtleSA9IGVhcF9ha2FfZ2V0S2V5OworCWVhcC0+Z2V0U2Vzc2lvbklkID0gZWFwX2FrYV9nZXRfc2Vzc2lvbl9pZDsKIAllYXAtPmhhc19yZWF1dGhfZGF0YSA9IGVhcF9ha2FfaGFzX3JlYXV0aF9kYXRhOwogCWVhcC0+ZGVpbml0X2Zvcl9yZWF1dGggPSBlYXBfYWthX2RlaW5pdF9mb3JfcmVhdXRoOwogCWVhcC0+aW5pdF9mb3JfcmVhdXRoID0gZWFwX2FrYV9pbml0X2Zvcl9yZWF1dGg7CkBAIC0xNDA0LDYgKzE0MjcsNyBAQAogCWVhcC0+cHJvY2VzcyA9IGVhcF9ha2FfcHJvY2VzczsKIAllYXAtPmlzS2V5QXZhaWxhYmxlID0gZWFwX2FrYV9pc0tleUF2YWlsYWJsZTsKIAllYXAtPmdldEtleSA9IGVhcF9ha2FfZ2V0S2V5OworCWVhcC0+Z2V0U2Vzc2lvbklkID0gZWFwX2FrYV9nZXRfc2Vzc2lvbl9pZDsKIAllYXAtPmhhc19yZWF1dGhfZGF0YSA9IGVhcF9ha2FfaGFzX3JlYXV0aF9kYXRhOwogCWVhcC0+ZGVpbml0X2Zvcl9yZWF1dGggPSBlYXBfYWthX2RlaW5pdF9mb3JfcmVhdXRoOwogCWVhcC0+aW5pdF9mb3JfcmVhdXRoID0gZWFwX2FrYV9pbml0X2Zvcl9yZWF1dGg7CmRpZmYgLS1naXQgYS9zcmMvZWFwX3BlZXIvZWFwX2Zhc3QuYyBiL3NyYy9lYXBfcGVlci9lYXBfZmFzdC5jCmluZGV4IDdjYTUyODguLjNiOGQ4MDMgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfcGVlci9lYXBfZmFzdC5jCisrKyBiL3NyYy9lYXBfcGVlci9lYXBfZmFzdC5jCkBAIC01Myw2ICs1Myw4IEBACiAJaW50IHNlc3Npb25fdGlja2V0X3VzZWQ7CiAKIAl1OCBrZXlfZGF0YVtFQVBfRkFTVF9LRVlfTEVOXTsKKwl1OCAqc2Vzc2lvbl9pZDsKKwlzaXplX3QgaWRfbGVuOwogCXU4IGVtc2tbRUFQX0VNU0tfTEVOXTsKIAlpbnQgc3VjY2VzczsKIApAQCAtMjM4LDYgKzI0MCw3IEBACiAJCXBhYyA9IHBhYy0+bmV4dDsKIAkJZWFwX2Zhc3RfZnJlZV9wYWMocHJldik7CiAJfQorCW9zX2ZyZWUoZGF0YS0+c2Vzc2lvbl9pZCk7CiAJd3BhYnVmX2ZyZWUoZGF0YS0+cGVuZGluZ19waGFzZTJfcmVxKTsKIAlvc19mcmVlKGRhdGEpOwogfQpAQCAtNzg1LDYgKzc4OCwyMSBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlpZiAoIWRhdGEtPmFub25fcHJvdmlzaW9uaW5nICYmIGRhdGEtPnBoYXNlMl9zdWNjZXNzKSB7CisJCW9zX2ZyZWUoZGF0YS0+c2Vzc2lvbl9pZCk7CisJCWRhdGEtPnNlc3Npb25faWQgPSBlYXBfcGVlcl90bHNfZGVyaXZlX3Nlc3Npb25faWQoCisJCQlzbSwgJmRhdGEtPnNzbCwgRUFQX1RZUEVfRkFTVCwgJmRhdGEtPmlkX2xlbik7CisJCWlmIChkYXRhLT5zZXNzaW9uX2lkKSB7CisJCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJFQVAtRkFTVDogRGVyaXZlZCBTZXNzaW9uLUlkIiwKKwkJCQkgICAgZGF0YS0+c2Vzc2lvbl9pZCwgZGF0YS0+aWRfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiRUFQLUZBU1Q6IEZhaWxlZCB0byBkZXJpdmUgIgorCQkJCSAgICJTZXNzaW9uLUlkIik7CisJCQl3cGFidWZfZnJlZShyZXNwKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCiAJcG9zID0gd3BhYnVmX3B1dChyZXNwLCBzaXplb2Yoc3RydWN0IGVhcF90bHZfY3J5cHRvX2JpbmRpbmdfdGx2KSk7CiAJZWFwX2Zhc3Rfd3JpdGVfY3J5cHRvX2JpbmRpbmcoKHN0cnVjdCBlYXBfdGx2X2NyeXB0b19iaW5kaW5nX3RsdiAqKQogCQkJCSAgICAgIHBvcywgX2JpbmQsIGNtayk7CkBAIC0xNjA0LDYgKzE2MjIsOCBAQAogCQlvc19mcmVlKGRhdGEpOwogCQlyZXR1cm4gTlVMTDsKIAl9CisJb3NfZnJlZShkYXRhLT5zZXNzaW9uX2lkKTsKKwlkYXRhLT5zZXNzaW9uX2lkID0gTlVMTDsKIAlpZiAoZGF0YS0+cGhhc2UyX3ByaXYgJiYgZGF0YS0+cGhhc2UyX21ldGhvZCAmJgogCSAgICBkYXRhLT5waGFzZTJfbWV0aG9kLT5pbml0X2Zvcl9yZWF1dGgpCiAJCWRhdGEtPnBoYXNlMl9tZXRob2QtPmluaXRfZm9yX3JlYXV0aChzbSwgZGF0YS0+cGhhc2UyX3ByaXYpOwpAQCAtMTY2Miw2ICsxNjgyLDI1IEBACiB9CiAKIAorc3RhdGljIHU4ICogZWFwX2Zhc3RfZ2V0X3Nlc3Npb25faWQoc3RydWN0IGVhcF9zbSAqc20sIHZvaWQgKnByaXYsIHNpemVfdCAqbGVuKQoreworCXN0cnVjdCBlYXBfZmFzdF9kYXRhICpkYXRhID0gcHJpdjsKKwl1OCAqaWQ7CisKKwlpZiAoIWRhdGEtPnN1Y2Nlc3MpCisJCXJldHVybiBOVUxMOworCisJaWQgPSBvc19tYWxsb2MoZGF0YS0+aWRfbGVuKTsKKwlpZiAoaWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkqbGVuID0gZGF0YS0+aWRfbGVuOworCW9zX21lbWNweShpZCwgZGF0YS0+c2Vzc2lvbl9pZCwgZGF0YS0+aWRfbGVuKTsKKworCXJldHVybiBpZDsKK30KKworCiBzdGF0aWMgdTggKiBlYXBfZmFzdF9nZXRfZW1zayhzdHJ1Y3QgZWFwX3NtICpzbSwgdm9pZCAqcHJpdiwgc2l6ZV90ICpsZW4pCiB7CiAJc3RydWN0IGVhcF9mYXN0X2RhdGEgKmRhdGEgPSBwcml2OwpAQCAtMTY5Niw2ICsxNzM1LDcgQEAKIAllYXAtPnByb2Nlc3MgPSBlYXBfZmFzdF9wcm9jZXNzOwogCWVhcC0+aXNLZXlBdmFpbGFibGUgPSBlYXBfZmFzdF9pc0tleUF2YWlsYWJsZTsKIAllYXAtPmdldEtleSA9IGVhcF9mYXN0X2dldEtleTsKKwllYXAtPmdldFNlc3Npb25JZCA9IGVhcF9mYXN0X2dldF9zZXNzaW9uX2lkOwogCWVhcC0+Z2V0X3N0YXR1cyA9IGVhcF9mYXN0X2dldF9zdGF0dXM7CiAjaWYgMAogCWVhcC0+aGFzX3JlYXV0aF9kYXRhID0gZWFwX2Zhc3RfaGFzX3JlYXV0aF9kYXRhOwpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9wZWVyL2VhcF9mYXN0X3BhYy5jIGIvc3JjL2VhcF9wZWVyL2VhcF9mYXN0X3BhYy5jCmluZGV4IGZjOTg3ZGEuLjhjNDgwYjkgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfcGVlci9lYXBfZmFzdF9wYWMuYworKysgYi9zcmMvZWFwX3BlZXIvZWFwX2Zhc3RfcGFjLmMKQEAgLTQyMiw4ICs0MjIsMTIgQEAKIAlpZiAoZWFwX2Zhc3RfaW5pdF9wYWNfZGF0YShzbSwgcGFjX2ZpbGUsICZyYykgPCAwKQogCQlyZXR1cm4gMDsKIAotCWlmIChlYXBfZmFzdF9yZWFkX2xpbmUoJnJjLCAmcG9zKSA8IDAgfHwKLQkgICAgb3Nfc3RyY21wKHBhY19maWxlX2hkciwgcmMuYnVmKSAhPSAwKQorCWlmIChlYXBfZmFzdF9yZWFkX2xpbmUoJnJjLCAmcG9zKSA8IDApIHsKKwkJLyogZW1wdHkgZmlsZSAtIGFzc3VtZSBpdCBpcyBmaW5lIHRvIG92ZXJ3cml0ZSAqLworCQllYXBfZmFzdF9kZWluaXRfcGFjX2RhdGEoJnJjKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChvc19zdHJjbXAocGFjX2ZpbGVfaGRyLCByYy5idWYpICE9IDApCiAJCWVyciA9ICJVbnJlY29nbml6ZWQgaGVhZGVyIGxpbmUiOwogCiAJd2hpbGUgKCFlcnIgJiYgZWFwX2Zhc3RfcmVhZF9saW5lKCZyYywgJnBvcykgPT0gMCkgewpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9wZWVyL2VhcF9ncHNrLmMgYi9zcmMvZWFwX3BlZXIvZWFwX2dwc2suYwppbmRleCAyYmQwZDQ4Li44YTA2NDRkIDEwMDY0NAotLS0gYS9zcmMvZWFwX3BlZXIvZWFwX2dwc2suYworKysgYi9zcmMvZWFwX3BlZXIvZWFwX2dwc2suYwpAQCAtMjMsOCArMjMsOCBAQAogCXNpemVfdCBza19sZW47CiAJdTggcGtbRUFQX0dQU0tfTUFYX1BLX0xFTl07CiAJc2l6ZV90IHBrX2xlbjsKLQl1OCBzZXNzaW9uX2lkOwotCWludCBzZXNzaW9uX2lkX3NldDsKKwl1OCBzZXNzaW9uX2lkWzEyOF07CisJc2l6ZV90IGlkX2xlbjsKIAl1OCAqaWRfcGVlcjsKIAlzaXplX3QgaWRfcGVlcl9sZW47CiAJdTggKmlkX3NlcnZlcjsKQEAgLTM1NCw2ICszNTQsMjEgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCisJaWYgKGVhcF9ncHNrX2Rlcml2ZV9zZXNzaW9uX2lkKGRhdGEtPnBzaywgZGF0YS0+cHNrX2xlbiwKKwkJCQkgICAgICAgZGF0YS0+dmVuZG9yLCBkYXRhLT5zcGVjaWZpZXIsCisJCQkJICAgICAgIGRhdGEtPnJhbmRfcGVlciwgZGF0YS0+cmFuZF9zZXJ2ZXIsCisJCQkJICAgICAgIGRhdGEtPmlkX3BlZXIsIGRhdGEtPmlkX3BlZXJfbGVuLAorCQkJCSAgICAgICBkYXRhLT5pZF9zZXJ2ZXIsIGRhdGEtPmlkX3NlcnZlcl9sZW4sCisJCQkJICAgICAgIEVBUF9UWVBFX0dQU0ssCisJCQkJICAgICAgIGRhdGEtPnNlc3Npb25faWQsICZkYXRhLT5pZF9sZW4pIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkVBUC1HUFNLOiBGYWlsZWQgdG8gZGVyaXZlIFNlc3Npb24tSWQiKTsKKwkJZWFwX2dwc2tfc3RhdGUoZGF0YSwgRkFJTFVSRSk7CisJCXdwYWJ1Zl9mcmVlKHJlc3ApOworCQlyZXR1cm4gTlVMTDsKKwl9CisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiRUFQLUdQU0s6IERlcml2ZWQgU2Vzc2lvbi1JZCIsCisJCSAgICBkYXRhLT5zZXNzaW9uX2lkLCBkYXRhLT5pZF9sZW4pOworCiAJLyogTm8gUERfUGF5bG9hZF8xICovCiAJd3BhYnVmX3B1dF9iZTE2KHJlc3AsIDApOwogCkBAIC03MDgsNiArNzIzLDI0IEBACiB9CiAKIAorc3RhdGljIHU4ICogZWFwX2dwc2tfZ2V0X3Nlc3Npb25faWQoc3RydWN0IGVhcF9zbSAqc20sIHZvaWQgKnByaXYsIHNpemVfdCAqbGVuKQoreworCXN0cnVjdCBlYXBfZ3Bza19kYXRhICpkYXRhID0gcHJpdjsKKwl1OCAqc2lkOworCisJaWYgKGRhdGEtPnN0YXRlICE9IFNVQ0NFU1MpCisJCXJldHVybiBOVUxMOworCisJc2lkID0gb3NfbWFsbG9jKGRhdGEtPmlkX2xlbik7CisJaWYgKHNpZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlvc19tZW1jcHkoc2lkLCBkYXRhLT5zZXNzaW9uX2lkLCBkYXRhLT5pZF9sZW4pOworCSpsZW4gPSBkYXRhLT5pZF9sZW47CisKKwlyZXR1cm4gc2lkOworfQorCisKIGludCBlYXBfcGVlcl9ncHNrX3JlZ2lzdGVyKHZvaWQpCiB7CiAJc3RydWN0IGVhcF9tZXRob2QgKmVhcDsKQEAgLTcyNCw2ICs3NTcsNyBAQAogCWVhcC0+aXNLZXlBdmFpbGFibGUgPSBlYXBfZ3Bza19pc0tleUF2YWlsYWJsZTsKIAllYXAtPmdldEtleSA9IGVhcF9ncHNrX2dldEtleTsKIAllYXAtPmdldF9lbXNrID0gZWFwX2dwc2tfZ2V0X2Vtc2s7CisJZWFwLT5nZXRTZXNzaW9uSWQgPSBlYXBfZ3Bza19nZXRfc2Vzc2lvbl9pZDsKIAogCXJldCA9IGVhcF9wZWVyX21ldGhvZF9yZWdpc3RlcihlYXApOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9zcmMvZWFwX3BlZXIvZWFwX2kuaCBiL3NyYy9lYXBfcGVlci9lYXBfaS5oCmluZGV4IGRkOTQzMTcuLjYyYzg2N2MgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfcGVlci9lYXBfaS5oCisrKyBiL3NyYy9lYXBfcGVlci9lYXBfaS5oCkBAIC0yNjEsNiArMjYxLDE5IEBACiAJICogcHJpdmF0ZSBkYXRhIG9yIHRoaXMgZnVuY3Rpb24gbWF5IGRlcml2ZSB0aGUga2V5LgogCSAqLwogCXU4ICogKCpnZXRfZW1zaykoc3RydWN0IGVhcF9zbSAqc20sIHZvaWQgKnByaXYsIHNpemVfdCAqbGVuKTsKKworCS8qKgorCSAqIGdldFNlc3Npb25JZCAtIEdldCBFQVAgbWV0aG9kIHNwZWNpZmljIFNlc3Npb24tSWQKKwkgKiBAc206IFBvaW50ZXIgdG8gRUFQIHN0YXRlIG1hY2hpbmUgYWxsb2NhdGVkIHdpdGggZWFwX3BlZXJfc21faW5pdCgpCisJICogQHByaXY6IFBvaW50ZXIgdG8gcHJpdmF0ZSBFQVAgbWV0aG9kIGRhdGEgZnJvbSBlYXBfbWV0aG9kOjppbml0KCkKKwkgKiBAbGVuOiBQb2ludGVyIHRvIGEgdmFyaWFibGUgdG8gc3RvcmUgU2Vzc2lvbi1JZCBsZW5ndGgKKwkgKiBSZXR1cm5zOiBTZXNzaW9uLUlkIG9yICVOVUxMIGlmIG5vdCBhdmFpbGFibGUKKwkgKgorCSAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBTZXNzaW9uLUlkIGZyb20gdGhlIEVBUCBtZXRob2QuCisJICogVGhlIFNlc3Npb24tSWQgbWF5IGFscmVhZHkgYmUgc3RvcmVkIGluIHRoZSBtZXRob2Qtc3BlY2lmaWMgcHJpdmF0ZQorCSAqIGRhdGEgb3IgdGhpcyBmdW5jdGlvbiBtYXkgZGVyaXZlIHRoZSBTZXNzaW9uLUlkLgorCSAqLworCXU4ICogKCpnZXRTZXNzaW9uSWQpKHN0cnVjdCBlYXBfc20gKnNtLCB2b2lkICpwcml2LCBzaXplX3QgKmxlbik7CiB9OwogCiAKQEAgLTI5OCw2ICszMTEsOCBAQAogCUJvb2xlYW4gZWFwS2V5QXZhaWxhYmxlOyAvKiBwZWVyIHRvIGxvd2VyIGxheWVyICovCiAJdTggKmVhcEtleURhdGE7IC8qIHBlZXIgdG8gbG93ZXIgbGF5ZXIgKi8KIAlzaXplX3QgZWFwS2V5RGF0YUxlbjsgLyogcGVlciB0byBsb3dlciBsYXllciAqLworCXU4ICplYXBTZXNzaW9uSWQ7IC8qIHBlZXIgdG8gbG93ZXIgbGF5ZXIgKi8KKwlzaXplX3QgZWFwU2Vzc2lvbklkTGVuOyAvKiBwZWVyIHRvIGxvd2VyIGxheWVyICovCiAJY29uc3Qgc3RydWN0IGVhcF9tZXRob2QgKm07IC8qIHNlbGVjdGVkIEVBUCBtZXRob2QgKi8KIAkvKiBub3QgZGVmaW5lZCBpbiBSRkMgNDEzNyAqLwogCUJvb2xlYW4gY2hhbmdlZDsKZGlmZiAtLWdpdCBhL3NyYy9lYXBfcGVlci9lYXBfaWtldjIuYyBiL3NyYy9lYXBfcGVlci9lYXBfaWtldjIuYwppbmRleCBhMjI3ZjhiLi4wOWE2NTVlIDEwMDY0NAotLS0gYS9zcmMvZWFwX3BlZXIvZWFwX2lrZXYyLmMKKysrIGIvc3JjL2VhcF9wZWVyL2VhcF9pa2V2Mi5jCkBAIC00NzUsNiArNDc1LDM2IEBACiB9CiAKIAorc3RhdGljIHU4ICogZWFwX2lrZXYyX2dldF9zZXNzaW9uX2lkKHN0cnVjdCBlYXBfc20gKnNtLCB2b2lkICpwcml2LCBzaXplX3QgKmxlbikKK3sKKwlzdHJ1Y3QgZWFwX2lrZXYyX2RhdGEgKmRhdGEgPSBwcml2OworCXU4ICpzaWQ7CisJc2l6ZV90IHNpZF9sZW47CisJc2l6ZV90IG9mZnNldDsKKworCWlmIChkYXRhLT5zdGF0ZSAhPSBET05FIHx8ICFkYXRhLT5rZXltYXRfb2spCisJCXJldHVybiBOVUxMOworCisJc2lkX2xlbiA9IDEgKyBkYXRhLT5pa2V2Mi5pX25vbmNlX2xlbiArIGRhdGEtPmlrZXYyLnJfbm9uY2VfbGVuOworCXNpZCA9IG9zX21hbGxvYyhzaWRfbGVuKTsKKwlpZiAoc2lkKSB7CisJCW9mZnNldCA9IDA7CisJCXNpZFtvZmZzZXRdID0gRUFQX1RZUEVfSUtFVjI7CisJCW9mZnNldCsrOworCQlvc19tZW1jcHkoc2lkICsgb2Zmc2V0LCBkYXRhLT5pa2V2Mi5pX25vbmNlLAorCQkJICBkYXRhLT5pa2V2Mi5pX25vbmNlX2xlbik7CisJCW9mZnNldCArPSBkYXRhLT5pa2V2Mi5pX25vbmNlX2xlbjsKKwkJb3NfbWVtY3B5KHNpZCArIG9mZnNldCwgZGF0YS0+aWtldjIucl9ub25jZSwKKwkJCSAgZGF0YS0+aWtldjIucl9ub25jZV9sZW4pOworCQkqbGVuID0gc2lkX2xlbjsKKwkJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiRUFQLUlLRVYyOiBEZXJpdmVkIFNlc3Npb24tSWQiLAorCQkJICAgIHNpZCwgc2lkX2xlbik7CisJfQorCisJcmV0dXJuIHNpZDsKK30KKworCiBpbnQgZWFwX3BlZXJfaWtldjJfcmVnaXN0ZXIodm9pZCkKIHsKIAlzdHJ1Y3QgZWFwX21ldGhvZCAqZWFwOwpAQCAtNDkyLDYgKzUyMiw3IEBACiAJZWFwLT5pc0tleUF2YWlsYWJsZSA9IGVhcF9pa2V2Ml9pc0tleUF2YWlsYWJsZTsKIAllYXAtPmdldEtleSA9IGVhcF9pa2V2Ml9nZXRLZXk7CiAJZWFwLT5nZXRfZW1zayA9IGVhcF9pa2V2Ml9nZXRfZW1zazsKKwllYXAtPmdldFNlc3Npb25JZCA9IGVhcF9pa2V2Ml9nZXRfc2Vzc2lvbl9pZDsKIAogCXJldCA9IGVhcF9wZWVyX21ldGhvZF9yZWdpc3RlcihlYXApOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9zcmMvZWFwX3BlZXIvZWFwX3BlYXAuYyBiL3NyYy9lYXBfcGVlci9lYXBfcGVhcC5jCmluZGV4IDdmZmYxNDUuLjNiOTMyMDkgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfcGVlci9lYXBfcGVhcC5jCisrKyBiL3NyYy9lYXBfcGVlci9lYXBfcGVhcC5jCkBAIC01Niw2ICs1Niw4IEBACiAJaW50IHJlc3VtaW5nOyAvKiBzdGFydGluZyBhIHJlc3VtZWQgc2Vzc2lvbiAqLwogCWludCByZWF1dGg7IC8qIHJlYXV0aGVudGljYXRpb24gKi8KIAl1OCAqa2V5X2RhdGE7CisJdTggKnNlc3Npb25faWQ7CisJc2l6ZV90IGlkX2xlbjsKIAogCXN0cnVjdCB3cGFidWYgKnBlbmRpbmdfcGhhc2UyX3JlcTsKIAllbnVtIHsgTk9fQklORElORywgT1BUSU9OQUxfQklORElORywgUkVRVUlSRV9CSU5ESU5HIH0gY3J5cHRvX2JpbmRpbmc7CkBAIC0xNzksNiArMTgxLDcgQEAKIAlvc19mcmVlKGRhdGEtPnBoYXNlMl90eXBlcyk7CiAJZWFwX3BlZXJfdGxzX3NzbF9kZWluaXQoc20sICZkYXRhLT5zc2wpOwogCW9zX2ZyZWUoZGF0YS0+a2V5X2RhdGEpOworCW9zX2ZyZWUoZGF0YS0+c2Vzc2lvbl9pZCk7CiAJd3BhYnVmX2ZyZWUoZGF0YS0+cGVuZGluZ19waGFzZTJfcmVxKTsKIAlvc19mcmVlKGRhdGEpOwogfQpAQCAtMTEwNyw2ICsxMTEwLDIwIEBACiAJCQkJCSAgICJkZXJpdmUga2V5Iik7CiAJCQl9CiAKKwkJCW9zX2ZyZWUoZGF0YS0+c2Vzc2lvbl9pZCk7CisJCQlkYXRhLT5zZXNzaW9uX2lkID0KKwkJCQllYXBfcGVlcl90bHNfZGVyaXZlX3Nlc3Npb25faWQoc20sICZkYXRhLT5zc2wsCisJCQkJCQkJICAgICAgIEVBUF9UWVBFX1BFQVAsCisJCQkJCQkJICAgICAgICZkYXRhLT5pZF9sZW4pOworCQkJaWYgKGRhdGEtPnNlc3Npb25faWQpIHsKKwkJCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsCisJCQkJCSAgICAiRUFQLVBFQVA6IERlcml2ZWQgU2Vzc2lvbi1JZCIsCisJCQkJCSAgICBkYXRhLT5zZXNzaW9uX2lkLCBkYXRhLT5pZF9sZW4pOworCQkJfSBlbHNlIHsKKwkJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkVBUC1QRUFQOiBGYWlsZWQgdG8gIgorCQkJCQkgICAiZGVyaXZlIFNlc3Npb24tSWQiKTsKKwkJCX0KKwogCQkJaWYgKHNtLT53b3JrYXJvdW5kICYmIGRhdGEtPnJlc3VtaW5nKSB7CiAJCQkJLyoKIAkJCQkgKiBBdCBsZWFzdCBmZXcgUkFESVVTIHNlcnZlcnMgKEFlZ2lzIHYxLjEuNjsKQEAgLTExNzgsNiArMTE5NSw4IEBACiAJc3RydWN0IGVhcF9wZWFwX2RhdGEgKmRhdGEgPSBwcml2OwogCW9zX2ZyZWUoZGF0YS0+a2V5X2RhdGEpOwogCWRhdGEtPmtleV9kYXRhID0gTlVMTDsKKwlvc19mcmVlKGRhdGEtPnNlc3Npb25faWQpOworCWRhdGEtPnNlc3Npb25faWQgPSBOVUxMOwogCWlmIChlYXBfcGVlcl90bHNfcmVhdXRoX2luaXQoc20sICZkYXRhLT5zc2wpKSB7CiAJCW9zX2ZyZWUoZGF0YSk7CiAJCXJldHVybiBOVUxMOwpAQCAtMTI2MCw2ICsxMjc5LDI1IEBACiB9CiAKIAorc3RhdGljIHU4ICogZWFwX3BlYXBfZ2V0X3Nlc3Npb25faWQoc3RydWN0IGVhcF9zbSAqc20sIHZvaWQgKnByaXYsIHNpemVfdCAqbGVuKQoreworCXN0cnVjdCBlYXBfcGVhcF9kYXRhICpkYXRhID0gcHJpdjsKKwl1OCAqaWQ7CisKKwlpZiAoZGF0YS0+c2Vzc2lvbl9pZCA9PSBOVUxMIHx8ICFkYXRhLT5waGFzZTJfc3VjY2VzcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZCA9IG9zX21hbGxvYyhkYXRhLT5pZF9sZW4pOworCWlmIChpZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCSpsZW4gPSBkYXRhLT5pZF9sZW47CisJb3NfbWVtY3B5KGlkLCBkYXRhLT5zZXNzaW9uX2lkLCBkYXRhLT5pZF9sZW4pOworCisJcmV0dXJuIGlkOworfQorCisKIGludCBlYXBfcGVlcl9wZWFwX3JlZ2lzdGVyKHZvaWQpCiB7CiAJc3RydWN0IGVhcF9tZXRob2QgKmVhcDsKQEAgLTEyNzksNiArMTMxNyw3IEBACiAJZWFwLT5oYXNfcmVhdXRoX2RhdGEgPSBlYXBfcGVhcF9oYXNfcmVhdXRoX2RhdGE7CiAJZWFwLT5kZWluaXRfZm9yX3JlYXV0aCA9IGVhcF9wZWFwX2RlaW5pdF9mb3JfcmVhdXRoOwogCWVhcC0+aW5pdF9mb3JfcmVhdXRoID0gZWFwX3BlYXBfaW5pdF9mb3JfcmVhdXRoOworCWVhcC0+Z2V0U2Vzc2lvbklkID0gZWFwX3BlYXBfZ2V0X3Nlc3Npb25faWQ7CiAKIAlyZXQgPSBlYXBfcGVlcl9tZXRob2RfcmVnaXN0ZXIoZWFwKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9wZWVyL2VhcF9wcm94eS5oIGIvc3JjL2VhcF9wZWVyL2VhcF9wcm94eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNGRjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZWFwX3BlZXIvZWFwX3Byb3h5LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIEVBUCBwcm94eSBkZWZpbml0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTMgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBFQVBfUFJPWFlfSAorI2RlZmluZSBFQVBfUFJPWFlfSAorCitzdHJ1Y3QgZWFwX3Byb3h5X3NtOworc3RydWN0IGVhcG9sX2NhbGxiYWNrczsKK3N0cnVjdCBlYXBfc207CitzdHJ1Y3QgZWFwX3BlZXJfY29uZmlnOworCitlbnVtIGVhcF9wcm94eV9zdGF0dXMgeworCUVBUF9QUk9YWV9GQUlMVVJFID0gMHgwMCwKKwlFQVBfUFJPWFlfU1VDQ0VTUworfTsKKworc3RydWN0IGVhcF9wcm94eV9zbSAqCitlYXBfcHJveHlfaW5pdCh2b2lkICplYXBvbF9jdHgsIHN0cnVjdCBlYXBvbF9jYWxsYmFja3MgKmVhcG9sX2NiLAorCSAgICAgICB2b2lkICptc2dfY3R4KTsKKwordm9pZCBlYXBfcHJveHlfZGVpbml0KHN0cnVjdCBlYXBfcHJveHlfc20gKmVhcF9wcm94eSk7CisKK2ludCBlYXBfcHJveHlfa2V5X2F2YWlsYWJsZShzdHJ1Y3QgZWFwX3Byb3h5X3NtICpzbSk7CisKK2NvbnN0IHU4ICogZWFwX3Byb3h5X2dldF9lYXBLZXlEYXRhKHN0cnVjdCBlYXBfcHJveHlfc20gKnNtLCBzaXplX3QgKmxlbik7CisKK3N0cnVjdCB3cGFidWYgKiBlYXBfcHJveHlfZ2V0X2VhcFJlc3BEYXRhKHN0cnVjdCBlYXBfcHJveHlfc20gKnNtKTsKKworaW50IGVhcF9wcm94eV9zbV9zdGVwKHN0cnVjdCBlYXBfcHJveHlfc20gKnNtLCBzdHJ1Y3QgZWFwX3NtICplYXBfc20pOworCitlbnVtIGVhcF9wcm94eV9zdGF0dXMKK2VhcF9wcm94eV9wYWNrZXRfdXBkYXRlKHN0cnVjdCBlYXBfcHJveHlfc20gKmVhcF9wcm94eSwgdTggKmVhcFJlcURhdGEsCisJCQlpbnQgZWFwUmVxRGF0YUxlbik7CisKK2ludCBlYXBfcHJveHlfc21fZ2V0X3N0YXR1cyhzdHJ1Y3QgZWFwX3Byb3h5X3NtICpzbSwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLAorCQkJICAgIGludCB2ZXJib3NlKTsKKworaW50IGVhcF9wcm94eV9nZXRfaW1zaShjaGFyICppbXNpX2J1Ziwgc2l6ZV90ICppbXNpX2xlbik7CisKK2ludCBlYXBfcHJveHlfbm90aWZ5X2NvbmZpZyhzdHJ1Y3QgZWFwX3Byb3h5X3NtICpzbSwKKwkJCSAgICBzdHJ1Y3QgZWFwX3BlZXJfY29uZmlnICpjb25maWcpOworCisjZW5kaWYgLyogRUFQX1BST1hZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9lYXBfcGVlci9lYXBfcHJveHlfZHVtbXkuYyBiL3NyYy9lYXBfcGVlci9lYXBfcHJveHlfZHVtbXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDk3ZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2VhcF9wZWVyL2VhcF9wcm94eV9kdW1teS5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBFQVAgcHJveHkgLSBkdW1teSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVpbGQgdGVzdGluZworICogQ29weXJpZ2h0IChjKSAyMDEzIFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZWFwX3Byb3h5LmgiCisKK3N0cnVjdCBlYXBfcHJveHlfc20gKgorZWFwX3Byb3h5X2luaXQodm9pZCAqZWFwb2xfY3R4LCBzdHJ1Y3QgZWFwb2xfY2FsbGJhY2tzICplYXBvbF9jYiwKKwkgICAgICAgdm9pZCAqbXNnX2N0eCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworCit2b2lkIGVhcF9wcm94eV9kZWluaXQoc3RydWN0IGVhcF9wcm94eV9zbSAqZWFwX3Byb3h5KQoreworfQorCisKK2ludCBlYXBfcHJveHlfa2V5X2F2YWlsYWJsZShzdHJ1Y3QgZWFwX3Byb3h5X3NtICpzbSkKK3sKKwlyZXR1cm4gMDsKK30KKworCitjb25zdCB1OCAqIGVhcF9wcm94eV9nZXRfZWFwS2V5RGF0YShzdHJ1Y3QgZWFwX3Byb3h5X3NtICpzbSwgc2l6ZV90ICpsZW4pCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RydWN0IHdwYWJ1ZiAqIGVhcF9wcm94eV9nZXRfZWFwUmVzcERhdGEoc3RydWN0IGVhcF9wcm94eV9zbSAqc20pCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKworaW50IGVhcF9wcm94eV9zbV9zdGVwKHN0cnVjdCBlYXBfcHJveHlfc20gKnNtLCBzdHJ1Y3QgZWFwX3NtICplYXBfc20pCit7CisJcmV0dXJuIDA7Cit9CisKKworZW51bSBlYXBfcHJveHlfc3RhdHVzCitlYXBfcHJveHlfcGFja2V0X3VwZGF0ZShzdHJ1Y3QgZWFwX3Byb3h5X3NtICplYXBfcHJveHksIHU4ICplYXBSZXFEYXRhLAorCQkJaW50IGVhcFJlcURhdGFMZW4pCit7CisJcmV0dXJuIEVBUF9QUk9YWV9GQUlMVVJFOworfQorCisKK2ludCBlYXBfcHJveHlfc21fZ2V0X3N0YXR1cyhzdHJ1Y3QgZWFwX3Byb3h5X3NtICpzbSwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLAorCQkJICAgIGludCB2ZXJib3NlKQoreworCXJldHVybiAwOworfQorCisKK2ludCBlYXBfcHJveHlfZ2V0X2ltc2koY2hhciAqaW1zaV9idWYsIHNpemVfdCAqaW1zaV9sZW4pCit7CisJcmV0dXJuIC0xOworfQorCisKK2ludCBlYXBfcHJveHlfbm90aWZ5X2NvbmZpZyhzdHJ1Y3QgZWFwX3Byb3h5X3NtICpzbSwKKwkJCSAgICBzdHJ1Y3QgZWFwX3BlZXJfY29uZmlnICpjb25maWcpCit7CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9wZWVyL2VhcF9wc2suYyBiL3NyYy9lYXBfcGVlci9lYXBfcHNrLmMKaW5kZXggZDYxOGZjZi4uY2QwZTNmOSAxMDA2NDQKLS0tIGEvc3JjL2VhcF9wZWVyL2VhcF9wc2suYworKysgYi9zcmMvZWFwX3BlZXIvZWFwX3Bzay5jCkBAIC0yMSw2ICsyMSw3IEBACiBzdHJ1Y3QgZWFwX3Bza19kYXRhIHsKIAllbnVtIHsgUFNLX0lOSVQsIFBTS19NQUNfU0VOVCwgUFNLX0RPTkUgfSBzdGF0ZTsKIAl1OCByYW5kX3BbRUFQX1BTS19SQU5EX0xFTl07CisJdTggcmFuZF9zW0VBUF9QU0tfUkFORF9MRU5dOwogCXU4IGFrW0VBUF9QU0tfQUtfTEVOXSwga2RrW0VBUF9QU0tfS0RLX0xFTl0sIHRla1tFQVBfUFNLX1RFS19MRU5dOwogCXU4ICppZF9zLCAqaWRfcDsKIAlzaXplX3QgaWRfc19sZW4sIGlkX3BfbGVuOwpAQCAtMTEyLDYgKzExMyw3IEBACiAJfQogCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIkVBUC1QU0s6IFJBTkRfUyIsIGhkcjEtPnJhbmRfcywKIAkJICAgIEVBUF9QU0tfUkFORF9MRU4pOworCW9zX21lbWNweShkYXRhLT5yYW5kX3MsIGhkcjEtPnJhbmRfcywgRUFQX1BTS19SQU5EX0xFTik7CiAJb3NfZnJlZShkYXRhLT5pZF9zKTsKIAlkYXRhLT5pZF9zX2xlbiA9IGxlbiAtIHNpemVvZigqaGRyMSk7CiAJZGF0YS0+aWRfcyA9IG9zX21hbGxvYyhkYXRhLT5pZF9zX2xlbik7CkBAIC00MzQsNiArNDM2LDI4IEBACiB9CiAKIAorc3RhdGljIHU4ICogZWFwX3Bza19nZXRfc2Vzc2lvbl9pZChzdHJ1Y3QgZWFwX3NtICpzbSwgdm9pZCAqcHJpdiwgc2l6ZV90ICpsZW4pCit7CisJc3RydWN0IGVhcF9wc2tfZGF0YSAqZGF0YSA9IHByaXY7CisJdTggKmlkOworCisJaWYgKGRhdGEtPnN0YXRlICE9IFBTS19ET05FKQorCQlyZXR1cm4gTlVMTDsKKworCSpsZW4gPSAxICsgMiAqIEVBUF9QU0tfUkFORF9MRU47CisJaWQgPSBvc19tYWxsb2MoKmxlbik7CisJaWYgKGlkID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWRbMF0gPSBFQVBfVFlQRV9QU0s7CisJb3NfbWVtY3B5KGlkICsgMSwgZGF0YS0+cmFuZF9wLCBFQVBfUFNLX1JBTkRfTEVOKTsKKwlvc19tZW1jcHkoaWQgKyAxICsgRUFQX1BTS19SQU5EX0xFTiwgZGF0YS0+cmFuZF9zLCBFQVBfUFNLX1JBTkRfTEVOKTsKKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJFQVAtUFNLOiBEZXJpdmVkIFNlc3Npb24tSWQiLCBpZCwgKmxlbik7CisKKwlyZXR1cm4gaWQ7Cit9CisKKwogc3RhdGljIHU4ICogZWFwX3Bza19nZXRfZW1zayhzdHJ1Y3QgZWFwX3NtICpzbSwgdm9pZCAqcHJpdiwgc2l6ZV90ICpsZW4pCiB7CiAJc3RydWN0IGVhcF9wc2tfZGF0YSAqZGF0YSA9IHByaXY7CkBAIC00NjgsNiArNDkyLDcgQEAKIAllYXAtPnByb2Nlc3MgPSBlYXBfcHNrX3Byb2Nlc3M7CiAJZWFwLT5pc0tleUF2YWlsYWJsZSA9IGVhcF9wc2tfaXNLZXlBdmFpbGFibGU7CiAJZWFwLT5nZXRLZXkgPSBlYXBfcHNrX2dldEtleTsKKwllYXAtPmdldFNlc3Npb25JZCA9IGVhcF9wc2tfZ2V0X3Nlc3Npb25faWQ7CiAJZWFwLT5nZXRfZW1zayA9IGVhcF9wc2tfZ2V0X2Vtc2s7CiAKIAlyZXQgPSBlYXBfcGVlcl9tZXRob2RfcmVnaXN0ZXIoZWFwKTsKZGlmZiAtLWdpdCBhL3NyYy9lYXBfcGVlci9lYXBfc2FrZS5jIGIvc3JjL2VhcF9wZWVyL2VhcF9zYWtlLmMKaW5kZXggZTA3MmY0Ni4uNDMxNTE5YyAxMDA2NDQKLS0tIGEvc3JjL2VhcF9wZWVyL2VhcF9zYWtlLmMKKysrIGIvc3JjL2VhcF9wZWVyL2VhcF9zYWtlLmMKQEAgLTQ1Miw2ICs0NTIsMjggQEAKIH0KIAogCitzdGF0aWMgdTggKiBlYXBfc2FrZV9nZXRfc2Vzc2lvbl9pZChzdHJ1Y3QgZWFwX3NtICpzbSwgdm9pZCAqcHJpdiwgc2l6ZV90ICpsZW4pCit7CisJc3RydWN0IGVhcF9zYWtlX2RhdGEgKmRhdGEgPSBwcml2OworCXU4ICppZDsKKworCWlmIChkYXRhLT5zdGF0ZSAhPSBTVUNDRVNTKQorCQlyZXR1cm4gTlVMTDsKKworCSpsZW4gPSAxICsgMiAqIEVBUF9TQUtFX1JBTkRfTEVOOworCWlkID0gb3NfbWFsbG9jKCpsZW4pOworCWlmIChpZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlkWzBdID0gRUFQX1RZUEVfU0FLRTsKKwlvc19tZW1jcHkoaWQgKyAxLCBkYXRhLT5yYW5kX3MsIEVBUF9TQUtFX1JBTkRfTEVOKTsKKwlvc19tZW1jcHkoaWQgKyAxICsgRUFQX1NBS0VfUkFORF9MRU4sIGRhdGEtPnJhbmRfcywgRUFQX1NBS0VfUkFORF9MRU4pOworCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIkVBUC1TQUtFOiBEZXJpdmVkIFNlc3Npb24tSWQiLCBpZCwgKmxlbik7CisKKwlyZXR1cm4gaWQ7Cit9CisKKwogc3RhdGljIHU4ICogZWFwX3Nha2VfZ2V0X2Vtc2soc3RydWN0IGVhcF9zbSAqc20sIHZvaWQgKnByaXYsIHNpemVfdCAqbGVuKQogewogCXN0cnVjdCBlYXBfc2FrZV9kYXRhICpkYXRhID0gcHJpdjsKQEAgLTQ4NSw2ICs1MDcsNyBAQAogCWVhcC0+cHJvY2VzcyA9IGVhcF9zYWtlX3Byb2Nlc3M7CiAJZWFwLT5pc0tleUF2YWlsYWJsZSA9IGVhcF9zYWtlX2lzS2V5QXZhaWxhYmxlOwogCWVhcC0+Z2V0S2V5ID0gZWFwX3Nha2VfZ2V0S2V5OworCWVhcC0+Z2V0U2Vzc2lvbklkID0gZWFwX3Nha2VfZ2V0X3Nlc3Npb25faWQ7CiAJZWFwLT5nZXRfZW1zayA9IGVhcF9zYWtlX2dldF9lbXNrOwogCiAJcmV0ID0gZWFwX3BlZXJfbWV0aG9kX3JlZ2lzdGVyKGVhcCk7CmRpZmYgLS1naXQgYS9zcmMvZWFwX3BlZXIvZWFwX3NpbS5jIGIvc3JjL2VhcF9wZWVyL2VhcF9zaW0uYwppbmRleCBjOTM2YTQ0Li44MmVhMThkIDEwMDY0NAotLS0gYS9zcmMvZWFwX3BlZXIvZWFwX3NpbS5jCisrKyBiL3NyYy9lYXBfcGVlci9lYXBfc2ltLmMKQEAgLTEwODQsNiArMTA4NCwyOSBAQAogfQogCiAKK3N0YXRpYyB1OCAqIGVhcF9zaW1fZ2V0X3Nlc3Npb25faWQoc3RydWN0IGVhcF9zbSAqc20sIHZvaWQgKnByaXYsIHNpemVfdCAqbGVuKQoreworCXN0cnVjdCBlYXBfc2ltX2RhdGEgKmRhdGEgPSBwcml2OworCXU4ICppZDsKKworCWlmIChkYXRhLT5zdGF0ZSAhPSBTVUNDRVNTKQorCQlyZXR1cm4gTlVMTDsKKworCSpsZW4gPSAxICsgZGF0YS0+bnVtX2NoYWwgKiBHU01fUkFORF9MRU4gKyBFQVBfU0lNX05PTkNFX01UX0xFTjsKKwlpZCA9IG9zX21hbGxvYygqbGVuKTsKKwlpZiAoaWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZFswXSA9IEVBUF9UWVBFX1NJTTsKKwlvc19tZW1jcHkoaWQgKyAxLCBkYXRhLT5yYW5kLCBkYXRhLT5udW1fY2hhbCAqIEdTTV9SQU5EX0xFTik7CisJb3NfbWVtY3B5KGlkICsgMSArIGRhdGEtPm51bV9jaGFsICogR1NNX1JBTkRfTEVOLCBkYXRhLT5ub25jZV9tdCwKKwkJICBFQVBfU0lNX05PTkNFX01UX0xFTik7CisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiRUFQLVNJTTogRGVyaXZlZCBTZXNzaW9uLUlkIiwgaWQsICpsZW4pOworCisJcmV0dXJuIGlkOworfQorCisKIHN0YXRpYyB1OCAqIGVhcF9zaW1fZ2V0X2Vtc2soc3RydWN0IGVhcF9zbSAqc20sIHZvaWQgKnByaXYsIHNpemVfdCAqbGVuKQogewogCXN0cnVjdCBlYXBfc2ltX2RhdGEgKmRhdGEgPSBwcml2OwpAQCAtMTExOCw2ICsxMTQxLDcgQEAKIAllYXAtPnByb2Nlc3MgPSBlYXBfc2ltX3Byb2Nlc3M7CiAJZWFwLT5pc0tleUF2YWlsYWJsZSA9IGVhcF9zaW1faXNLZXlBdmFpbGFibGU7CiAJZWFwLT5nZXRLZXkgPSBlYXBfc2ltX2dldEtleTsKKwllYXAtPmdldFNlc3Npb25JZCA9IGVhcF9zaW1fZ2V0X3Nlc3Npb25faWQ7CiAJZWFwLT5oYXNfcmVhdXRoX2RhdGEgPSBlYXBfc2ltX2hhc19yZWF1dGhfZGF0YTsKIAllYXAtPmRlaW5pdF9mb3JfcmVhdXRoID0gZWFwX3NpbV9kZWluaXRfZm9yX3JlYXV0aDsKIAllYXAtPmluaXRfZm9yX3JlYXV0aCA9IGVhcF9zaW1faW5pdF9mb3JfcmVhdXRoOwpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9wZWVyL2VhcF90bHMuYyBiL3NyYy9lYXBfcGVlci9lYXBfdGxzLmMKaW5kZXggMDYxYTcyYi4uZDIwNjZjZCAxMDA2NDQKLS0tIGEvc3JjL2VhcF9wZWVyL2VhcF90bHMuYworKysgYi9zcmMvZWFwX3BlZXIvZWFwX3Rscy5jCkBAIC0yMSw2ICsyMSw4IEBACiBzdHJ1Y3QgZWFwX3Rsc19kYXRhIHsKIAlzdHJ1Y3QgZWFwX3NzbF9kYXRhIHNzbDsKIAl1OCAqa2V5X2RhdGE7CisJdTggKnNlc3Npb25faWQ7CisJc2l6ZV90IGlkX2xlbjsKIAl2b2lkICpzc2xfY3R4OwogCXU4IGVhcF90eXBlOwogfTsKQEAgLTEwMyw2ICsxMDUsNyBAQAogCQlyZXR1cm47CiAJZWFwX3BlZXJfdGxzX3NzbF9kZWluaXQoc20sICZkYXRhLT5zc2wpOwogCW9zX2ZyZWUoZGF0YS0+a2V5X2RhdGEpOworCW9zX2ZyZWUoZGF0YS0+c2Vzc2lvbl9pZCk7CiAJb3NfZnJlZShkYXRhKTsKIH0KIApAQCAtMTY1LDYgKzE2OCwxNyBAQAogCX0gZWxzZSB7CiAJCXdwYV9wcmludGYoTVNHX0lORk8sICJFQVAtVExTOiBGYWlsZWQgdG8gZGVyaXZlIGtleSIpOwogCX0KKworCW9zX2ZyZWUoZGF0YS0+c2Vzc2lvbl9pZCk7CisJZGF0YS0+c2Vzc2lvbl9pZCA9IGVhcF9wZWVyX3Rsc19kZXJpdmVfc2Vzc2lvbl9pZChzbSwgJmRhdGEtPnNzbCwKKwkJCQkJCQkgIEVBUF9UWVBFX1RMUywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+aWRfbGVuKTsKKwlpZiAoZGF0YS0+c2Vzc2lvbl9pZCkgeworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJFQVAtVExTOiBEZXJpdmVkIFNlc3Npb24tSWQiLAorCQkJICAgIGRhdGEtPnNlc3Npb25faWQsIGRhdGEtPmlkX2xlbik7CisJfSBlbHNlIHsKKwkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJFQVAtVExTOiBGYWlsZWQgdG8gZGVyaXZlIFNlc3Npb24tSWQiKTsKKwl9CiB9CiAKIApAQCAtMjI4LDYgKzI0Miw4IEBACiAJc3RydWN0IGVhcF90bHNfZGF0YSAqZGF0YSA9IHByaXY7CiAJb3NfZnJlZShkYXRhLT5rZXlfZGF0YSk7CiAJZGF0YS0+a2V5X2RhdGEgPSBOVUxMOworCW9zX2ZyZWUoZGF0YS0+c2Vzc2lvbl9pZCk7CisJZGF0YS0+c2Vzc2lvbl9pZCA9IE5VTEw7CiAJaWYgKGVhcF9wZWVyX3Rsc19yZWF1dGhfaW5pdChzbSwgJmRhdGEtPnNzbCkpIHsKIAkJb3NfZnJlZShkYXRhKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yODksNiArMzA1LDI1IEBACiB9CiAKIAorc3RhdGljIHU4ICogZWFwX3Rsc19nZXRfc2Vzc2lvbl9pZChzdHJ1Y3QgZWFwX3NtICpzbSwgdm9pZCAqcHJpdiwgc2l6ZV90ICpsZW4pCit7CisJc3RydWN0IGVhcF90bHNfZGF0YSAqZGF0YSA9IHByaXY7CisJdTggKmlkOworCisJaWYgKGRhdGEtPnNlc3Npb25faWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZCA9IG9zX21hbGxvYyhkYXRhLT5pZF9sZW4pOworCWlmIChpZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCSpsZW4gPSBkYXRhLT5pZF9sZW47CisJb3NfbWVtY3B5KGlkLCBkYXRhLT5zZXNzaW9uX2lkLCBkYXRhLT5pZF9sZW4pOworCisJcmV0dXJuIGlkOworfQorCisKIGludCBlYXBfcGVlcl90bHNfcmVnaXN0ZXIodm9pZCkKIHsKIAlzdHJ1Y3QgZWFwX21ldGhvZCAqZWFwOwpAQCAtMzA0LDYgKzMzOSw3IEBACiAJZWFwLT5wcm9jZXNzID0gZWFwX3Rsc19wcm9jZXNzOwogCWVhcC0+aXNLZXlBdmFpbGFibGUgPSBlYXBfdGxzX2lzS2V5QXZhaWxhYmxlOwogCWVhcC0+Z2V0S2V5ID0gZWFwX3Rsc19nZXRLZXk7CisJZWFwLT5nZXRTZXNzaW9uSWQgPSBlYXBfdGxzX2dldF9zZXNzaW9uX2lkOwogCWVhcC0+Z2V0X3N0YXR1cyA9IGVhcF90bHNfZ2V0X3N0YXR1czsKIAllYXAtPmhhc19yZWF1dGhfZGF0YSA9IGVhcF90bHNfaGFzX3JlYXV0aF9kYXRhOwogCWVhcC0+ZGVpbml0X2Zvcl9yZWF1dGggPSBlYXBfdGxzX2RlaW5pdF9mb3JfcmVhdXRoOwpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9wZWVyL2VhcF90bHNfY29tbW9uLmMgYi9zcmMvZWFwX3BlZXIvZWFwX3Rsc19jb21tb24uYwppbmRleCA3ZWVmZThjLi5hNzc3YmIwIDEwMDY0NAotLS0gYS9zcmMvZWFwX3BlZXIvZWFwX3Rsc19jb21tb24uYworKysgYi9zcmMvZWFwX3BlZXIvZWFwX3Rsc19jb21tb24uYwpAQCAtMzQwLDYgKzM0MCw1MiBAQAogCiAKIC8qKgorICogZWFwX3BlZXJfdGxzX2Rlcml2ZV9zZXNzaW9uX2lkIC0gRGVyaXZlIGEgU2Vzc2lvbi1JZCBiYXNlZCBvbiBUTFMgZGF0YQorICogQHNtOiBQb2ludGVyIHRvIEVBUCBzdGF0ZSBtYWNoaW5lIGFsbG9jYXRlZCB3aXRoIGVhcF9wZWVyX3NtX2luaXQoKQorICogQGRhdGE6IERhdGEgZm9yIFRMUyBwcm9jZXNzaW5nCisgKiBAZWFwX3R5cGU6IEVBUCBtZXRob2QgdXNlZCBpbiBQaGFzZSAxIChFQVBfVFlQRV9UTFMvUEVBUC9UVExTL0ZBU1QpCisgKiBAbGVuOiBQb2ludGVyIHRvIGxlbmd0aCBvZiB0aGUgc2Vzc2lvbiBJRCBnZW5lcmF0ZWQKKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gYWxsb2NhdGVkIFNlc3Npb24tSWQgb24gc3VjY2VzcyBvciAlTlVMTCBvbiBmYWlsdXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBkZXJpdmUgdGhlIFNlc3Npb24tSWQgYmFzZWQgb24gdGhlIFRMUyBzZXNzaW9uIGRhdGEKKyAqIChjbGllbnQvc2VydmVyIHJhbmRvbSBhbmQgbWV0aG9kIHR5cGUpLgorICoKKyAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIHJldHVybmVkIGJ1ZmZlci4KKyAqLwordTggKiBlYXBfcGVlcl90bHNfZGVyaXZlX3Nlc3Npb25faWQoc3RydWN0IGVhcF9zbSAqc20sCisJCQkJICAgIHN0cnVjdCBlYXBfc3NsX2RhdGEgKmRhdGEsIHU4IGVhcF90eXBlLAorCQkJCSAgICBzaXplX3QgKmxlbikKK3sKKwlzdHJ1Y3QgdGxzX2tleXMga2V5czsKKwl1OCAqb3V0OworCisJLyoKKwkgKiBUTFMgbGlicmFyeSBkaWQgbm90IHN1cHBvcnQgc2Vzc2lvbiBJRCBnZW5lcmF0aW9uLAorCSAqIHNvIGdldCB0aGUgbmVlZGVkIFRMUyBzZXNzaW9uIHBhcmFtZXRlcnMKKwkgKi8KKwlpZiAodGxzX2Nvbm5lY3Rpb25fZ2V0X2tleXMoc20tPnNzbF9jdHgsIGRhdGEtPmNvbm4sICZrZXlzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoa2V5cy5jbGllbnRfcmFuZG9tID09IE5VTEwgfHwga2V5cy5zZXJ2ZXJfcmFuZG9tID09IE5VTEwgfHwKKwkgICAga2V5cy5tYXN0ZXJfa2V5ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJKmxlbiA9IDEgKyBrZXlzLmNsaWVudF9yYW5kb21fbGVuICsga2V5cy5zZXJ2ZXJfcmFuZG9tX2xlbjsKKwlvdXQgPSBvc19tYWxsb2MoKmxlbik7CisJaWYgKG91dCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFNlc3Npb24tSWQgPSBFQVAgdHlwZSB8fCBjbGllbnQucmFuZG9tIHx8IHNlcnZlci5yYW5kb20gKi8KKwlvdXRbMF0gPSBlYXBfdHlwZTsKKwlvc19tZW1jcHkob3V0ICsgMSwga2V5cy5jbGllbnRfcmFuZG9tLCBrZXlzLmNsaWVudF9yYW5kb21fbGVuKTsKKwlvc19tZW1jcHkob3V0ICsgMSArIGtleXMuY2xpZW50X3JhbmRvbV9sZW4sIGtleXMuc2VydmVyX3JhbmRvbSwKKwkgICAgICAgICAga2V5cy5zZXJ2ZXJfcmFuZG9tX2xlbik7CisKKwlyZXR1cm4gb3V0OworfQorCisKKy8qKgogICogZWFwX3BlZXJfdGxzX3JlYXNzZW1ibGVfZnJhZ21lbnQgLSBSZWFzc2VtYmxlIGEgcmVjZWl2ZWQgZnJhZ21lbnQKICAqIEBkYXRhOiBEYXRhIGZvciBUTFMgcHJvY2Vzc2luZwogICogQGluX2RhdGE6IE5leHQgaW5jb21pbmcgVExTIHNlZ21lbnQKQEAgLTgyOSw2ICs4NzUsMTQgQEAKIAkJfQogCQlwb3MgKz0gNDsKIAkJbGVmdCAtPSA0OworCisJCWlmIChsZWZ0ID4gdGxzX21zZ19sZW4pIHsKKwkJCXdwYV9wcmludGYoTVNHX0lORk8sICJTU0w6IFRMUyBNZXNzYWdlIExlbmd0aCAoJWQgIgorCQkJCSAgICJieXRlcykgc21hbGxlciB0aGFuIHRoaXMgZnJhZ21lbnQgKCVkICIKKwkJCQkgICAiYnl0ZXMpIiwgKGludCkgdGxzX21zZ19sZW4sIChpbnQpIGxlZnQpOworCQkJcmV0LT5pZ25vcmUgPSBUUlVFOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAl9CiAKIAlyZXQtPmlnbm9yZSA9IEZBTFNFOwpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9wZWVyL2VhcF90bHNfY29tbW9uLmggYi9zcmMvZWFwX3BlZXIvZWFwX3Rsc19jb21tb24uaAppbmRleCA5MWQzYTI1Li4xYTVlMGY4IDEwMDY0NAotLS0gYS9zcmMvZWFwX3BlZXIvZWFwX3Rsc19jb21tb24uaAorKysgYi9zcmMvZWFwX3BlZXIvZWFwX3Rsc19jb21tb24uaApAQCAtOTQsNiArOTQsOSBAQAogdm9pZCBlYXBfcGVlcl90bHNfc3NsX2RlaW5pdChzdHJ1Y3QgZWFwX3NtICpzbSwgc3RydWN0IGVhcF9zc2xfZGF0YSAqZGF0YSk7CiB1OCAqIGVhcF9wZWVyX3Rsc19kZXJpdmVfa2V5KHN0cnVjdCBlYXBfc20gKnNtLCBzdHJ1Y3QgZWFwX3NzbF9kYXRhICpkYXRhLAogCQkJICAgICBjb25zdCBjaGFyICpsYWJlbCwgc2l6ZV90IGxlbik7Cit1OCAqIGVhcF9wZWVyX3Rsc19kZXJpdmVfc2Vzc2lvbl9pZChzdHJ1Y3QgZWFwX3NtICpzbSwKKwkJCQkgICAgc3RydWN0IGVhcF9zc2xfZGF0YSAqZGF0YSwgdTggZWFwX3R5cGUsCisJCQkJICAgIHNpemVfdCAqbGVuKTsKIGludCBlYXBfcGVlcl90bHNfcHJvY2Vzc19oZWxwZXIoc3RydWN0IGVhcF9zbSAqc20sIHN0cnVjdCBlYXBfc3NsX2RhdGEgKmRhdGEsCiAJCQkJRWFwVHlwZSBlYXBfdHlwZSwgaW50IHBlYXBfdmVyc2lvbiwKIAkJCQl1OCBpZCwgY29uc3QgdTggKmluX2RhdGEsIHNpemVfdCBpbl9sZW4sCmRpZmYgLS1naXQgYS9zcmMvZWFwX3BlZXIvZWFwX3R0bHMuYyBiL3NyYy9lYXBfcGVlci9lYXBfdHRscy5jCmluZGV4IDkzNjBhNDIuLjUwOTFiZjAgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfcGVlci9lYXBfdHRscy5jCisrKyBiL3NyYy9lYXBfcGVlci9lYXBfdHRscy5jCkBAIC01NCw2ICs1NCw4IEBACiAJaW50IHJlc3VtaW5nOyAvKiBzdGFydGluZyBhIHJlc3VtZWQgc2Vzc2lvbiAqLwogCWludCByZWF1dGg7IC8qIHJlYXV0aGVudGljYXRpb24gKi8KIAl1OCAqa2V5X2RhdGE7CisJdTggKnNlc3Npb25faWQ7CisJc2l6ZV90IGlkX2xlbjsKIAogCXN0cnVjdCB3cGFidWYgKnBlbmRpbmdfcGhhc2UyX3JlcTsKIApAQCAtMTQwLDYgKzE0Miw3IEBACiAJb3NfZnJlZShkYXRhLT5waGFzZTJfZWFwX3R5cGVzKTsKIAllYXBfcGVlcl90bHNfc3NsX2RlaW5pdChzbSwgJmRhdGEtPnNzbCk7CiAJb3NfZnJlZShkYXRhLT5rZXlfZGF0YSk7CisJb3NfZnJlZShkYXRhLT5zZXNzaW9uX2lkKTsKIAl3cGFidWZfZnJlZShkYXRhLT5wZW5kaW5nX3BoYXNlMl9yZXEpOwogCW9zX2ZyZWUoZGF0YSk7CiB9CkBAIC0yMjIsNiArMjI1LDE3IEBACiAJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIkVBUC1UVExTOiBEZXJpdmVkIGtleSIsCiAJCQlkYXRhLT5rZXlfZGF0YSwgRUFQX1RMU19LRVlfTEVOKTsKIAorCW9zX2ZyZWUoZGF0YS0+c2Vzc2lvbl9pZCk7CisJZGF0YS0+c2Vzc2lvbl9pZCA9IGVhcF9wZWVyX3Rsc19kZXJpdmVfc2Vzc2lvbl9pZChzbSwgJmRhdGEtPnNzbCwKKwkJCQkJCQkgIEVBUF9UWVBFX1RUTFMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+aWRfbGVuKTsKKwlpZiAoZGF0YS0+c2Vzc2lvbl9pZCkgeworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJFQVAtVFRMUzogRGVyaXZlZCBTZXNzaW9uLUlkIiwKKwkJCSAgICBkYXRhLT5zZXNzaW9uX2lkLCBkYXRhLT5pZF9sZW4pOworCX0gZWxzZSB7CisJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiRUFQLVRUTFM6IEZhaWxlZCB0byBkZXJpdmUgU2Vzc2lvbi1JZCIpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xNTI4LDYgKzE1NDIsOCBAQAogCXN0cnVjdCBlYXBfdHRsc19kYXRhICpkYXRhID0gcHJpdjsKIAlvc19mcmVlKGRhdGEtPmtleV9kYXRhKTsKIAlkYXRhLT5rZXlfZGF0YSA9IE5VTEw7CisJb3NfZnJlZShkYXRhLT5zZXNzaW9uX2lkKTsKKwlkYXRhLT5zZXNzaW9uX2lkID0gTlVMTDsKIAlpZiAoZWFwX3BlZXJfdGxzX3JlYXV0aF9pbml0KHNtLCAmZGF0YS0+c3NsKSkgewogCQlvc19mcmVlKGRhdGEpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTE2MTIsNiArMTYyOCwyNSBAQAogfQogCiAKK3N0YXRpYyB1OCAqIGVhcF90dGxzX2dldF9zZXNzaW9uX2lkKHN0cnVjdCBlYXBfc20gKnNtLCB2b2lkICpwcml2LCBzaXplX3QgKmxlbikKK3sKKwlzdHJ1Y3QgZWFwX3R0bHNfZGF0YSAqZGF0YSA9IHByaXY7CisJdTggKmlkOworCisJaWYgKGRhdGEtPnNlc3Npb25faWQgPT0gTlVMTCB8fCAhZGF0YS0+cGhhc2UyX3N1Y2Nlc3MpCisJCXJldHVybiBOVUxMOworCisJaWQgPSBvc19tYWxsb2MoZGF0YS0+aWRfbGVuKTsKKwlpZiAoaWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkqbGVuID0gZGF0YS0+aWRfbGVuOworCW9zX21lbWNweShpZCwgZGF0YS0+c2Vzc2lvbl9pZCwgZGF0YS0+aWRfbGVuKTsKKworCXJldHVybiBpZDsKK30KKworCiBpbnQgZWFwX3BlZXJfdHRsc19yZWdpc3Rlcih2b2lkKQogewogCXN0cnVjdCBlYXBfbWV0aG9kICplYXA7CkBAIC0xNjI3LDYgKzE2NjIsNyBAQAogCWVhcC0+cHJvY2VzcyA9IGVhcF90dGxzX3Byb2Nlc3M7CiAJZWFwLT5pc0tleUF2YWlsYWJsZSA9IGVhcF90dGxzX2lzS2V5QXZhaWxhYmxlOwogCWVhcC0+Z2V0S2V5ID0gZWFwX3R0bHNfZ2V0S2V5OworCWVhcC0+Z2V0U2Vzc2lvbklkID0gZWFwX3R0bHNfZ2V0X3Nlc3Npb25faWQ7CiAJZWFwLT5nZXRfc3RhdHVzID0gZWFwX3R0bHNfZ2V0X3N0YXR1czsKIAllYXAtPmhhc19yZWF1dGhfZGF0YSA9IGVhcF90dGxzX2hhc19yZWF1dGhfZGF0YTsKIAllYXAtPmRlaW5pdF9mb3JfcmVhdXRoID0gZWFwX3R0bHNfZGVpbml0X2Zvcl9yZWF1dGg7CmRpZmYgLS1naXQgYS9zcmMvZWFwX3BlZXIvZWFwX3dzYy5jIGIvc3JjL2VhcF9wZWVyL2VhcF93c2MuYwppbmRleCBkMDA3YTU3Li44MWFkMGNlIDEwMDY0NAotLS0gYS9zcmMvZWFwX3BlZXIvZWFwX3dzYy5jCisrKyBiL3NyYy9lYXBfcGVlci9lYXBfd3NjLmMKQEAgLTEzNyw3ICsxMzcsNiBAQAogCXN0cnVjdCB3cHNfY29udGV4dCAqd3BzOwogCXN0cnVjdCB3cHNfY3JlZGVudGlhbCBuZXdfYXBfc2V0dGluZ3M7CiAJaW50IHJlczsKLQl1OCBkZXZfcHdbV1BTX09PQl9ERVZJQ0VfUEFTU1dPUkRfTEVOXTsKIAlpbnQgbmZjID0gMDsKIAogCXdwcyA9IHNtLT53cHM7CkBAIC0xODYsMTUgKzE4NSw4IEBACiAJCXdoaWxlICgqcG9zICE9ICdcMCcgJiYgKnBvcyAhPSAnICcpCiAJCQlwb3MrKzsKIAkJY2ZnLnBpbl9sZW4gPSBwb3MgLSAoY29uc3QgY2hhciAqKSBjZmcucGluOwotCQlpZiAoY2ZnLnBpbl9sZW4gPj0gV1BTX09PQl9ERVZJQ0VfUEFTU1dPUkRfTUlOX0xFTiAqIDIgJiYKLQkJICAgIGNmZy5waW5fbGVuIDw9IFdQU19PT0JfREVWSUNFX1BBU1NXT1JEX0xFTiAqIDIgJiYKLQkJICAgIGhleHN0cjJiaW4oKGNvbnN0IGNoYXIgKikgY2ZnLnBpbiwgZGV2X3B3LAotCQkJICAgICAgIGNmZy5waW5fbGVuIC8gMikgPT0gMCkgewotCQkJLyogQ29udmVydCBPT0IgRGV2aWNlIFBhc3N3b3JkIHRvIGJpbmFyeSAqLwotCQkJY2ZnLnBpbiA9IGRldl9wdzsKLQkJCWNmZy5waW5fbGVuIC89IDI7Ci0JCX0KLQkJaWYgKGNmZy5waW5fbGVuID09IDYgJiYgb3Nfc3RybmNtcChwb3MsICJuZmMtcHciLCA2KSA9PSAwKSB7CisJCWlmIChjZmcucGluX2xlbiA9PSA2ICYmCisJCSAgICBvc19zdHJuY21wKChjb25zdCBjaGFyICopIGNmZy5waW4sICJuZmMtcHciLCA2KSA9PSAwKSB7CiAJCQljZmcucGluID0gTlVMTDsKIAkJCWNmZy5waW5fbGVuID0gMDsKIAkJCW5mYyA9IDE7CmRpZmYgLS1naXQgYS9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX2FrYS5jIGIvc3JjL2VhcF9zZXJ2ZXIvZWFwX3NlcnZlcl9ha2EuYwppbmRleCBhOTY1Y2FjLi40NjliOWEwIDEwMDY0NAotLS0gYS9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX2FrYS5jCisrKyBiL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfYWthLmMKQEAgLTM2NSw2ICszNjUsNyBAQAogCQllYXBfc2ltX21zZ19hZGQobXNnLCBFQVBfU0lNX0FUX0FOWV9JRF9SRVEsIDAsIE5VTEwsIDApOwogCX0gZWxzZSBpZiAoZGF0YS0+aWRlbnRpdHlfcm91bmQgPiAzKSB7CiAJCS8qIENhbm5vdCB1c2UgbW9yZSB0aGFuIHRocmVlIHJvdW5kcyBvZiBJZGVudGl0eSBtZXNzYWdlcyAqLworCQllYXBfc2ltX21zZ19mcmVlKG1zZyk7CiAJCXJldHVybiBOVUxMOwogCX0gZWxzZSBpZiAoc20tPmlkZW50aXR5ICYmIHNtLT5pZGVudGl0eV9sZW4gPiAwICYmCiAJCSAgIChzbS0+aWRlbnRpdHlbMF0gPT0gRUFQX0FLQV9SRUFVVEhfSURfUFJFRklYIHx8CkBAIC03MzAsNiArNzMxLDE3IEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAoKChkYXRhLT5lYXBfbWV0aG9kID09IEVBUF9UWVBFX0FLQV9QUklNRSAmJgorCSAgICAgIHVzZXJuYW1lWzBdID09IEVBUF9BS0FfUFJJTUVfUkVBVVRIX0lEX1BSRUZJWCkgfHwKKwkgICAgIChkYXRhLT5lYXBfbWV0aG9kID09IEVBUF9UWVBFX0FLQSAmJgorCSAgICAgIHVzZXJuYW1lWzBdID09IEVBUF9BS0FfUkVBVVRIX0lEX1BSRUZJWCkpICYmCisJICAgIGRhdGEtPmlkZW50aXR5X3JvdW5kID09IDEpIHsKKwkJLyogUmVtYWluIGluIElERU5USVRZIHN0YXRlIGZvciBhbm90aGVyIHJvdW5kIHRvIHJlcXVlc3QgZnVsbAorCQkgKiBhdXRoIGlkZW50aXR5IHNpbmNlIHdlIGRpZCBub3QgcmVjb2duaXplIHJlYXV0aCBpZCAqLworCQlvc19mcmVlKHVzZXJuYW1lKTsKKwkJcmV0dXJuOworCX0KKwogCWlmICgoZGF0YS0+ZWFwX21ldGhvZCA9PSBFQVBfVFlQRV9BS0FfUFJJTUUgJiYKIAkgICAgIHVzZXJuYW1lWzBdID09IEVBUF9BS0FfUFJJTUVfUFNFVURPTllNX1BSRUZJWCkgfHwKIAkgICAgKGRhdGEtPmVhcF9tZXRob2QgPT0gRUFQX1RZUEVfQUtBICYmCmRpZmYgLS1naXQgYS9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3NpbS5jIGIvc3JjL2VhcF9zZXJ2ZXIvZWFwX3NlcnZlcl9zaW0uYwppbmRleCBmODNjM2NiLi5iNTMxMjQxIDEwMDY0NAotLS0gYS9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3NpbS5jCisrKyBiL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfc2ltLmMKQEAgLTExNyw2ICsxMTcsNyBAQAogCQllYXBfc2ltX21zZ19hZGQobXNnLCBFQVBfU0lNX0FUX0FOWV9JRF9SRVEsIDAsIE5VTEwsIDApOwogCX0gZWxzZSBpZiAoZGF0YS0+c3RhcnRfcm91bmQgPiAzKSB7CiAJCS8qIENhbm5vdCB1c2UgbW9yZSB0aGFuIHRocmVlIHJvdW5kcyBvZiBTdGFydCBtZXNzYWdlcyAqLworCQllYXBfc2ltX21zZ19mcmVlKG1zZyk7CiAJCXJldHVybiBOVUxMOwogCX0gZWxzZSBpZiAoZGF0YS0+c3RhcnRfcm91bmQgPT0gMCkgewogCQkvKgpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9zZXJ2ZXIvZWFwX3NlcnZlcl90bHNfY29tbW9uLmMgYi9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3Rsc19jb21tb24uYwppbmRleCAzMWJlMmVjLi45ZWZiNWIyIDEwMDY0NAotLS0gYS9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3Rsc19jb21tb24uYworKysgYi9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3Rsc19jb21tb24uYwpAQCAtMjI4LDYgKzIyOCwxNCBAQAogCQkJcmV0dXJuIC0xOwogCQl9CiAKKwkJaWYgKGxlbiA+IG1lc3NhZ2VfbGVuZ3RoKSB7CisJCQl3cGFfcHJpbnRmKE1TR19JTkZPLCAiU1NMOiBUb28gbXVjaCBkYXRhICglZCBieXRlcykgaW4gIgorCQkJCSAgICJmaXJzdCBmcmFnbWVudCBvZiBmcmFtZSAoVExTIE1lc3NhZ2UgIgorCQkJCSAgICJMZW5ndGggJWQgYnl0ZXMpIiwKKwkJCQkgICAoaW50KSBsZW4sIChpbnQpIG1lc3NhZ2VfbGVuZ3RoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCiAJCWRhdGEtPnRsc19pbiA9IHdwYWJ1Zl9hbGxvYyhtZXNzYWdlX2xlbmd0aCk7CiAJCWlmIChkYXRhLT50bHNfaW4gPT0gTlVMTCkgewogCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTU0w6IE5vIG1lbW9yeSBmb3IgbWVzc2FnZSIpOwpAQCAtMjg5LDYgKzI5NywxMyBAQAogCQkJICAgdGxzX21zZ19sZW4pOwogCQkqcG9zICs9IDQ7CiAJCSpsZWZ0IC09IDQ7CisKKwkJaWYgKCpsZWZ0ID4gdGxzX21zZ19sZW4pIHsKKwkJCXdwYV9wcmludGYoTVNHX0lORk8sICJTU0w6IFRMUyBNZXNzYWdlIExlbmd0aCAoJWQgIgorCQkJCSAgICJieXRlcykgc21hbGxlciB0aGFuIHRoaXMgZnJhZ21lbnQgKCVkICIKKwkJCQkgICAiYnl0ZXMpIiwgKGludCkgdGxzX21zZ19sZW4sIChpbnQpICpsZWZ0KTsKKwkJCXJldHVybiAtMTsKKwkJfQogCX0KIAogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU1NMOiBSZWNlaXZlZCBwYWNrZXQ6IEZsYWdzIDB4JXggIgpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9zZXJ2ZXIvaWtldjIuYyBiL3NyYy9lYXBfc2VydmVyL2lrZXYyLmMKaW5kZXggMGU3N2VmYi4uNTEyYmEzMCAxMDA2NDQKLS0tIGEvc3JjL2VhcF9zZXJ2ZXIvaWtldjIuYworKysgYi9zcmMvZWFwX3NlcnZlci9pa2V2Mi5jCkBAIC05OTAsNyArOTkwLDcgQEAKIAkgKi8KIAl3cGFidWZfcHV0KG1zZywgZGF0YS0+ZGgtPnByaW1lX2xlbiAtIHdwYWJ1Zl9sZW4ocHYpKTsKIAl3cGFidWZfcHV0X2J1Zihtc2csIHB2KTsKLQlvc19mcmVlKHB2KTsKKwl3cGFidWZfZnJlZShwdik7CiAKIAlwbGVuID0gKHU4ICopIHdwYWJ1Zl9wdXQobXNnLCAwKSAtICh1OCAqKSBwaGRyOwogCVdQQV9QVVRfQkUxNihwaGRyLT5wYXlsb2FkX2xlbmd0aCwgcGxlbik7CmRpZmYgLS1naXQgYS9zcmMvZWFwb2xfc3VwcC9lYXBvbF9zdXBwX3NtLmMgYi9zcmMvZWFwb2xfc3VwcC9lYXBvbF9zdXBwX3NtLmMKaW5kZXggODUxY2Y0OS4uMmU1NjA4NiAxMDA2NDQKLS0tIGEvc3JjL2VhcG9sX3N1cHAvZWFwb2xfc3VwcF9zbS5jCisrKyBiL3NyYy9lYXBvbF9zdXBwL2VhcG9sX3N1cHBfc20uYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgImNyeXB0by9tZDUuaCIKICNpbmNsdWRlICJjb21tb24vZWFwb2xfY29tbW9uLmgiCiAjaW5jbHVkZSAiZWFwX3BlZXIvZWFwLmgiCisjaW5jbHVkZSAiZWFwX3BlZXIvZWFwX3Byb3h5LmgiCiAjaW5jbHVkZSAiZWFwb2xfc3VwcF9zbS5oIgogCiAjZGVmaW5lIFNUQVRFX01BQ0hJTkVfREFUQSBzdHJ1Y3QgZWFwb2xfc20KQEAgLTEzNiw2ICsxMzcsMTAgQEAKIAlCb29sZWFuIGNhY2hlZF9wbWs7CiAKIAlCb29sZWFuIHVuaWNhc3Rfa2V5X3JlY2VpdmVkLCBicm9hZGNhc3Rfa2V5X3JlY2VpdmVkOworI2lmZGVmIENPTkZJR19FQVBfUFJPWFkKKwlCb29sZWFuIHVzZV9lYXBfcHJveHk7CisJc3RydWN0IGVhcF9wcm94eV9zbSAqZWFwX3Byb3h5OworI2VuZGlmIC8qIENPTkZJR19FQVBfUFJPWFkgKi8KIH07CiAKIApAQCAtNDYzLDYgKzQ2OCwxNyBAQAogCXNtLT5rZXlSdW4gPSBUUlVFOwogCXNtLT5zdXBwU3VjY2VzcyA9IFRSVUU7CiAKKyNpZmRlZiBDT05GSUdfRUFQX1BST1hZCisJaWYgKHNtLT51c2VfZWFwX3Byb3h5KSB7CisJCWlmIChlYXBfcHJveHlfa2V5X2F2YWlsYWJsZShzbS0+ZWFwX3Byb3h5KSkgeworCQkJLyogTmV3IGtleSByZWNlaXZlZCAtIGNsZWFyIElFRUUgODAyLjFYIEVBUE9MLUtleSByZXBsYXkKKwkJCSAqIGNvdW50ZXIgKi8KKwkJCXNtLT5yZXBsYXlfY291bnRlcl92YWxpZCA9IEZBTFNFOworCQl9CisJCXJldHVybjsKKwl9CisjZW5kaWYgLyogQ09ORklHX0VBUF9QUk9YWSAqLworCiAJaWYgKGVhcF9rZXlfYXZhaWxhYmxlKHNtLT5lYXApKSB7CiAJCS8qIE5ldyBrZXkgcmVjZWl2ZWQgLSBjbGVhciBJRUVFIDgwMi4xWCBFQVBPTC1LZXkgcmVwbGF5CiAJCSAqIGNvdW50ZXIgKi8KQEAgLTgwNiw2ICs4MjIsMTkgQEAKIAlzdHJ1Y3Qgd3BhYnVmICpyZXNwOwogCiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJFQVBPTDogdHhTdXBwUnNwIik7CisKKyNpZmRlZiBDT05GSUdfRUFQX1BST1hZCisJaWYgKHNtLT51c2VfZWFwX3Byb3h5KSB7CisJCS8qIEdldCBFQVAgUmVzcG9uc2UgZnJvbSBFQVAgUHJveHkgKi8KKwkJcmVzcCA9IGVhcF9wcm94eV9nZXRfZWFwUmVzcERhdGEoc20tPmVhcF9wcm94eSk7CisJCWlmIChyZXNwID09IE5VTEwpIHsKKwkJCXdwYV9wcmludGYoTVNHX1dBUk5JTkcsICJFQVBPTDogdHhTdXBwUnNwIC0gRUFQIFByb3h5ICIKKwkJCQkgICAicmVzcG9uc2UgZGF0YSBub3QgYXZhaWxhYmxlIik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UKKyNlbmRpZiAvKiBDT05GSUdfRUFQX1BST1hZICovCisKIAlyZXNwID0gZWFwX2dldF9lYXBSZXNwRGF0YShzbS0+ZWFwKTsKIAlpZiAocmVzcCA9PSBOVUxMKSB7CiAJCXdwYV9wcmludGYoTVNHX1dBUk5JTkcsICJFQVBPTDogdHhTdXBwUnNwIC0gRUFQIHJlc3BvbnNlIGRhdGEgIgpAQCAtODgzLDYgKzkxMiwxMyBAQAogCQlTTV9TVEVQX1JVTihTVVBQX1BBRSk7CiAJCVNNX1NURVBfUlVOKEtFWV9SWCk7CiAJCVNNX1NURVBfUlVOKFNVUFBfQkUpOworI2lmZGVmIENPTkZJR19FQVBfUFJPWFkKKwkJaWYgKHNtLT51c2VfZWFwX3Byb3h5KSB7CisJCQkvKiBEcml2ZSB0aGUgRUFQIHByb3h5IHN0YXRlIG1hY2hpbmUgKi8KKwkJCWlmIChlYXBfcHJveHlfc21fc3RlcChzbS0+ZWFwX3Byb3h5LCBzbS0+ZWFwKSkKKwkJCQlzbS0+Y2hhbmdlZCA9IFRSVUU7CisJCX0gZWxzZQorI2VuZGlmIC8qIENPTkZJR19FQVBfUFJPWFkgKi8KIAkJaWYgKGVhcF9wZWVyX3NtX3N0ZXAoc20tPmVhcCkpCiAJCQlzbS0+Y2hhbmdlZCA9IFRSVUU7CiAJCWlmICghc20tPmNoYW5nZWQpCkBAIC0xMDcwLDYgKzExMDYsMTMgQEAKIAkJbGVuICs9IHJldDsKIAl9CiAKKyNpZmRlZiBDT05GSUdfRUFQX1BST1hZCisJaWYgKHNtLT51c2VfZWFwX3Byb3h5KQorCQlsZW4gKz0gZWFwX3Byb3h5X3NtX2dldF9zdGF0dXMoc20tPmVhcF9wcm94eSwKKwkJCQkJICAgICAgIGJ1ZiArIGxlbiwgYnVmbGVuIC0gbGVuLAorCQkJCQkgICAgICAgdmVyYm9zZSk7CisJZWxzZQorI2VuZGlmIC8qIENPTkZJR19FQVBfUFJPWFkgKi8KIAlsZW4gKz0gZWFwX3NtX2dldF9zdGF0dXMoc20tPmVhcCwgYnVmICsgbGVuLCBidWZsZW4gLSBsZW4sIHZlcmJvc2UpOwogCiAJcmV0dXJuIGxlbjsKQEAgLTEyMjcsNiArMTI3MCwxNiBAQAogCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJFQVBPTDogUmVjZWl2ZWQgRUFQLVBhY2tldCAiCiAJCQkJICAgImZyYW1lIik7CiAJCQlzbS0+ZWFwb2xFYXAgPSBUUlVFOworI2lmZGVmIENPTkZJR19FQVBfUFJPWFkKKwkJCWlmIChzbS0+dXNlX2VhcF9wcm94eSkgeworCQkJCWVhcF9wcm94eV9wYWNrZXRfdXBkYXRlKAorCQkJCQlzbS0+ZWFwX3Byb3h5LAorCQkJCQl3cGFidWZfbWhlYWRfdTgoc20tPmVhcFJlcURhdGEpLAorCQkJCQl3cGFidWZfbGVuKHNtLT5lYXBSZXFEYXRhKSk7CisJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJFQVBPTDogZWFwX3Byb3h5ICIKKwkJCQkJICAgIkVBUCBSZXEgdXBkYXRlZCIpOworCQkJfQorI2VuZGlmIC8qIENPTkZJR19FQVBfUFJPWFkgKi8KIAkJCWVhcG9sX3NtX3N0ZXAoc20pOwogCQl9CiAJCWJyZWFrOwpAQCAtMTM4Nyw2ICsxNDQwLDkgQEAKIAkJcmV0dXJuOwogCiAJc20tPmNvbmZpZyA9IGNvbmZpZzsKKyNpZmRlZiBDT05GSUdfRUFQX1BST1hZCisJc20tPnVzZV9lYXBfcHJveHkgPSBlYXBfcHJveHlfbm90aWZ5X2NvbmZpZyhzbS0+ZWFwX3Byb3h5LCBjb25maWcpID4gMDsKKyNlbmRpZiAvKiBDT05GSUdfRUFQX1BST1hZICovCiAKIAlpZiAoY29uZiA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xMzk1LDYgKzE0NTEsMTIgQEAKIAlzbS0+Y29uZi5yZXF1aXJlZF9rZXlzID0gY29uZi0+cmVxdWlyZWRfa2V5czsKIAlzbS0+Y29uZi5mYXN0X3JlYXV0aCA9IGNvbmYtPmZhc3RfcmVhdXRoOwogCXNtLT5jb25mLndvcmthcm91bmQgPSBjb25mLT53b3JrYXJvdW5kOworI2lmZGVmIENPTkZJR19FQVBfUFJPWFkKKwlpZiAoc20tPnVzZV9lYXBfcHJveHkpIHsKKwkJLyogVXNpbmcgRUFQIFByb3h5LCBzbyBza2lwIEVBUCBzdGF0ZSBtYWNoaW5lIHVwZGF0ZSAqLworCQlyZXR1cm47CisJfQorI2VuZGlmIC8qIENPTkZJR19FQVBfUFJPWFkgKi8KIAlpZiAoc20tPmVhcCkgewogCQllYXBfc2V0X2Zhc3RfcmVhdXRoKHNtLT5lYXAsIGNvbmYtPmZhc3RfcmVhdXRoKTsKIAkJZWFwX3NldF93b3JrYXJvdW5kKHNtLT5lYXAsIGNvbmYtPndvcmthcm91bmQpOwpAQCAtMTQxOSw2ICsxNDgxLDIyIEBACiAJY29uc3QgdTggKmVhcF9rZXk7CiAJc2l6ZV90IGVhcF9sZW47CiAKKyNpZmRlZiBDT05GSUdfRUFQX1BST1hZCisJaWYgKHNtLT51c2VfZWFwX3Byb3h5KSB7CisJCS8qIEdldCBrZXkgZnJvbSBFQVAgcHJveHkgKi8KKwkJaWYgKHNtID09IE5VTEwgfHwgIWVhcF9wcm94eV9rZXlfYXZhaWxhYmxlKHNtLT5lYXBfcHJveHkpKSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkVBUE9MOiBFQVAga2V5IG5vdCBhdmFpbGFibGUiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQllYXBfa2V5ID0gZWFwX3Byb3h5X2dldF9lYXBLZXlEYXRhKHNtLT5lYXBfcHJveHksICZlYXBfbGVuKTsKKwkJaWYgKGVhcF9rZXkgPT0gTlVMTCkgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJFQVBPTDogRmFpbGVkIHRvIGdldCAiCisJCQkJICAgImVhcEtleURhdGEiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlnb3RvIGtleV9mZXRjaGVkOworCX0KKyNlbmRpZiAvKiBDT05GSUdfRUFQX1BST1hZICovCiAJaWYgKHNtID09IE5VTEwgfHwgIWVhcF9rZXlfYXZhaWxhYmxlKHNtLT5lYXApKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiRUFQT0w6IEVBUCBrZXkgbm90IGF2YWlsYWJsZSIpOwogCQlyZXR1cm4gLTE7CkBAIC0xNDI4LDYgKzE1MDYsOSBAQAogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkVBUE9MOiBGYWlsZWQgdG8gZ2V0IGVhcEtleURhdGEiKTsKIAkJcmV0dXJuIC0xOwogCX0KKyNpZmRlZiBDT05GSUdfRUFQX1BST1hZCitrZXlfZmV0Y2hlZDoKKyNlbmRpZiAvKiBDT05GSUdfRUFQX1BST1hZICovCiAJaWYgKGxlbiA+IGVhcF9sZW4pIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJFQVBPTDogUmVxdWVzdGVkIGtleSBsZW5ndGggKCVsdSkgbm90ICIKIAkJCSAgICJhdmFpbGFibGUgKGxlbj0lbHUpIiwKQEAgLTE0NjksMTAgKzE1NTAsNyBAQAogCWlmIChzbSA9PSBOVUxMKQogCQlyZXR1cm47CiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJFQVBPTDogUE1LU0EgY2FjaGluZyB3YXMgdXNlZCAtIHNraXAgRUFQT0wiKTsKLQlzbS0+U1VQUF9QQUVfc3RhdGUgPSBTVVBQX1BBRV9BVVRIRU5USUNBVEVEOwotCXNtLT5zdXBwUG9ydFN0YXR1cyA9IEF1dGhvcml6ZWQ7Ci0JZWFwb2xfc21fc2V0X3BvcnRfYXV0aG9yaXplZChzbSk7Ci0Jc20tPnBvcnRWYWxpZCA9IFRSVUU7CisJc20tPmVhcFN1Y2Nlc3MgPSBUUlVFOwogCWVhcF9ub3RpZnlfc3VjY2VzcyhzbS0+ZWFwKTsKIAllYXBvbF9zbV9zdGVwKHNtKTsKIH0KQEAgLTE4OTIsNiArMTk3MCwxNCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKyNpZmRlZiBDT05GSUdfRUFQX1BST1hZCisJc20tPnVzZV9lYXBfcHJveHkgPSBGQUxTRTsKKwlzbS0+ZWFwX3Byb3h5ID0gZWFwX3Byb3h5X2luaXQoc20sICZlYXBvbF9jYiwgc20tPmN0eC0+bXNnX2N0eCk7CisJaWYgKHNtLT5lYXBfcHJveHkgPT0gTlVMTCkgeworCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIlVuYWJsZSB0byBpbml0aWFsaXplIEVBUCBQcm94eSIpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfRUFQX1BST1hZICovCisKIAkvKiBJbml0aWFsaXplIEVBUE9MIHN0YXRlIG1hY2hpbmVzICovCiAJc20tPmluaXRpYWxpemUgPSBUUlVFOwogCWVhcG9sX3NtX3N0ZXAoc20pOwpAQCAtMTkxOCw2ICsyMDA0LDkgQEAKIAllbG9vcF9jYW5jZWxfdGltZW91dChlYXBvbF9zbV9zdGVwX3RpbWVvdXQsIE5VTEwsIHNtKTsKIAllbG9vcF9jYW5jZWxfdGltZW91dChlYXBvbF9wb3J0X3RpbWVyc190aWNrLCBOVUxMLCBzbSk7CiAJZWFwX3BlZXJfc21fZGVpbml0KHNtLT5lYXApOworI2lmZGVmIENPTkZJR19FQVBfUFJPWFkKKwllYXBfcHJveHlfZGVpbml0KHNtLT5lYXBfcHJveHkpOworI2VuZGlmIC8qIENPTkZJR19FQVBfUFJPWFkgKi8KIAlvc19mcmVlKHNtLT5sYXN0X3J4X2tleSk7CiAJd3BhYnVmX2ZyZWUoc20tPmVhcFJlcURhdGEpOwogCW9zX2ZyZWUoc20tPmN0eCk7CmRpZmYgLS1naXQgYS9zcmMvcDJwL3AycC5jIGIvc3JjL3AycC9wMnAuYwppbmRleCBhM2VhYThjLi42ZGU1MGYyIDEwMDY0NAotLS0gYS9zcmMvcDJwL3AycC5jCisrKyBiL3NyYy9wMnAvcDJwLmMKQEAgLTI1Niw3ICsyNTYsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHAycF9saXN0ZW5faW5fZmluZChzdHJ1Y3QgcDJwX2RhdGEgKnAycCkKK3N0YXRpYyB2b2lkIHAycF9saXN0ZW5faW5fZmluZChzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgaW50IGRldl9kaXNjKQogewogCXVuc2lnbmVkIGludCByLCB0dTsKIAlpbnQgZnJlcTsKQEAgLTI3Nyw2ICsyNzcsMTkgQEAKIAlvc19nZXRfcmFuZG9tKCh1OCAqKSAmciwgc2l6ZW9mKHIpKTsKIAl0dSA9IChyICUgKChwMnAtPm1heF9kaXNjX2ludCAtIHAycC0+bWluX2Rpc2NfaW50KSArIDEpICsKIAkgICAgICBwMnAtPm1pbl9kaXNjX2ludCkgKiAxMDA7CisJaWYgKHAycC0+bWF4X2Rpc2NfdHUgPj0gMCAmJiB0dSA+ICh1bnNpZ25lZCBpbnQpIHAycC0+bWF4X2Rpc2NfdHUpCisJCXR1ID0gcDJwLT5tYXhfZGlzY190dTsKKwlpZiAoIWRldl9kaXNjICYmIHR1IDwgMTAwKQorCQl0dSA9IDEwMDsgLyogTmVlZCB0byB3YWl0IGluIG5vbi1kZXZpY2UgZGlzY292ZXJ5IHVzZSBjYXNlcyAqLworCWlmIChwMnAtPmNmZy0+bWF4X2xpc3RlbiAmJiAxMDI0ICogdHUgLyAxMDAwID4gcDJwLT5jZmctPm1heF9saXN0ZW4pCisJCXR1ID0gcDJwLT5jZmctPm1heF9saXN0ZW4gKiAxMDAwIC8gMTAyNDsKKworCWlmICh0dSA9PSAwKSB7CisJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlAyUDogU2tpcCBsaXN0ZW4gc3RhdGUgIgorCQkJInNpbmNlIGR1cmF0aW9uIHdhcyAwIFRVIik7CisJCXAycF9zZXRfdGltZW91dChwMnAsIDAsIDApOworCQlyZXR1cm47CisJfQogCiAJcDJwLT5wZW5kaW5nX2xpc3Rlbl9mcmVxID0gZnJlcTsKIAlwMnAtPnBlbmRpbmdfbGlzdGVuX3NlYyA9IDA7CkBAIC02MDQsOCArNjE3LDE4IEBACiAJfQogCiAJaWYgKCFwcm9iZV9yZXEpIHsKLQkJZGV2LT5pbmZvLmNvbmZpZ19tZXRob2RzID0gbXNnLT5jb25maWdfbWV0aG9kcyA/CisJCXUxNiBuZXdfY29uZmlnX21ldGhvZHM7CisJCW5ld19jb25maWdfbWV0aG9kcyA9IG1zZy0+Y29uZmlnX21ldGhvZHMgPwogCQkJbXNnLT5jb25maWdfbWV0aG9kcyA6IG1zZy0+d3BzX2NvbmZpZ19tZXRob2RzOworCQlpZiAobmV3X2NvbmZpZ19tZXRob2RzICYmCisJCSAgICBkZXYtPmluZm8uY29uZmlnX21ldGhvZHMgIT0gbmV3X2NvbmZpZ19tZXRob2RzKSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogVXBkYXRlIHBlZXIgIiBNQUNTVFIKKwkJCQkgICAiIGNvbmZpZ19tZXRob2RzIDB4JXggLT4gMHgleCIsCisJCQkJICAgTUFDMlNUUihkZXYtPmluZm8ucDJwX2RldmljZV9hZGRyKSwKKwkJCQkgICBkZXYtPmluZm8uY29uZmlnX21ldGhvZHMsCisJCQkJICAgbmV3X2NvbmZpZ19tZXRob2RzKTsKKwkJCWRldi0+aW5mby5jb25maWdfbWV0aG9kcyA9IG5ld19jb25maWdfbWV0aG9kczsKKwkJfQogCX0KIH0KIApAQCAtNjE3LDYgKzY0MCw3IEBACiAgKglQMlAgRGV2aWNlIEFkZHJlc3Mgb3IgUDJQIEludGVyZmFjZSBBZGRyZXNzKQogICogQGxldmVsOiBTaWduYWwgbGV2ZWwgKHNpZ25hbCBzdHJlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgZnJhbWUgZnJvbSB0aGUgcGVlcikKICAqIEBmcmVxOiBGcmVxdWVuY3kgb24gd2hpY2ggdGhlIEJlYWNvbiBvciBQcm9iZSBSZXNwb25zZSBmcmFtZSB3YXMgcmVjZWl2ZWQKKyAqIEByeF90aW1lOiBUaW1lIHdoZW4gdGhlIHJlc3VsdCB3YXMgcmVjZWl2ZWQKICAqIEBpZXM6IElFcyBmcm9tIHRoZSBCZWFjb24gb3IgUHJvYmUgUmVzcG9uc2UgZnJhbWUKICAqIEBpZXNfbGVuOiBMZW5ndGggb2YgaWVzIGJ1ZmZlciBpbiBvY3RldHMKICAqIEBzY2FuX3JlczogV2hldGhlciB0aGlzIHdhcyBiYXNlZCBvbiBzY2FuIHJlc3VsdHMKQEAgLTYyNywxMyArNjUxLDE1IEBACiAgKiBsaWtlIFByb3Zpc2lvbiBEaXNjb3ZlcnkgUmVxdWVzdCB0aGF0IGNvbnRhaW5zIFAyUCBDYXBhYmlsaXR5IGFuZCBQMlAgRGV2aWNlCiAgKiBJbmZvIGF0dHJpYnV0ZXMuCiAgKi8KLWludCBwMnBfYWRkX2RldmljZShzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgY29uc3QgdTggKmFkZHIsIGludCBmcmVxLCBpbnQgbGV2ZWwsCi0JCSAgIGNvbnN0IHU4ICppZXMsIHNpemVfdCBpZXNfbGVuLCBpbnQgc2Nhbl9yZXMpCitpbnQgcDJwX2FkZF9kZXZpY2Uoc3RydWN0IHAycF9kYXRhICpwMnAsIGNvbnN0IHU4ICphZGRyLCBpbnQgZnJlcSwKKwkJICAgc3RydWN0IG9zX3RpbWUgKnJ4X3RpbWUsIGludCBsZXZlbCwgY29uc3QgdTggKmllcywKKwkJICAgc2l6ZV90IGllc19sZW4sIGludCBzY2FuX3JlcykKIHsKIAlzdHJ1Y3QgcDJwX2RldmljZSAqZGV2OwogCXN0cnVjdCBwMnBfbWVzc2FnZSBtc2c7CiAJY29uc3QgdTggKnAycF9kZXZfYWRkcjsKIAlpbnQgaTsKKwlzdHJ1Y3Qgb3NfdGltZSB0aW1lX25vdzsKIAogCW9zX21lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CiAJaWYgKHAycF9wYXJzZV9pZXMoaWVzLCBpZXNfbGVuLCAmbXNnKSkgewpAQCAtNjYwLDYgKzY4Niw3IEBACiAJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlAyUDogRG8gbm90IGFkZCBwZWVyICIKIAkJCSJmaWx0ZXIgZm9yICIgTUFDU1RSICIgZHVlIHRvIHBlZXIgZmlsdGVyIiwKIAkJCU1BQzJTVFIocDJwX2Rldl9hZGRyKSk7CisJCXAycF9wYXJzZV9mcmVlKCZtc2cpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTY2OCw3ICs2OTUsMzEgQEAKIAkJcDJwX3BhcnNlX2ZyZWUoJm1zZyk7CiAJCXJldHVybiAtMTsKIAl9Ci0Jb3NfZ2V0X3RpbWUoJmRldi0+bGFzdF9zZWVuKTsKKworCWlmIChyeF90aW1lID09IE5VTEwpIHsKKwkJb3NfZ2V0X3RpbWUoJnRpbWVfbm93KTsKKwkJcnhfdGltZSA9ICZ0aW1lX25vdzsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgZGV2aWNlIGVudHJ5IG9ubHkgaWYgdGhlIG5ldyBwZWVyCisJICogZW50cnkgaXMgbmV3ZXIgdGhhbiB0aGUgb25lIHByZXZpb3VzbHkgc3RvcmVkLgorCSAqLworCWlmIChkZXYtPmxhc3Rfc2Vlbi5zZWMgPiAwICYmCisJICAgIG9zX3RpbWVfYmVmb3JlKHJ4X3RpbWUsICZkZXYtPmxhc3Rfc2VlbikpIHsKKwkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLCAiUDJQOiBEbyBub3QgdXBkYXRlIHBlZXIgIgorCQkJImVudHJ5IGJhc2VkIG9uIG9sZCBmcmFtZSAocnhfdGltZT0ldS4lMDZ1ICIKKwkJCSJsYXN0X3NlZW49JXUuJTA2dSkiLAorCQkJKHVuc2lnbmVkIGludCkgcnhfdGltZS0+c2VjLAorCQkJKHVuc2lnbmVkIGludCkgcnhfdGltZS0+dXNlYywKKwkJCSh1bnNpZ25lZCBpbnQpIGRldi0+bGFzdF9zZWVuLnNlYywKKwkJCSh1bnNpZ25lZCBpbnQpIGRldi0+bGFzdF9zZWVuLnVzZWMpOworCQlwMnBfcGFyc2VfZnJlZSgmbXNnKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW9zX21lbWNweSgmZGV2LT5sYXN0X3NlZW4sIHJ4X3RpbWUsIHNpemVvZihzdHJ1Y3Qgb3NfdGltZSkpOworCiAJZGV2LT5mbGFncyAmPSB+KFAyUF9ERVZfUFJPQkVfUkVRX09OTFkgfCBQMlBfREVWX0dST1VQX0NMSUVOVF9PTkxZKTsKIAogCWlmIChvc19tZW1jbXAoYWRkciwgcDJwX2Rldl9hZGRyLCBFVEhfQUxFTikgIT0gMCkKQEAgLTc0NiwxMyArNzk3LDM3IEBACiAJCXJldHVybiAwOwogCiAJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAotCQkiUDJQOiBQZWVyIGZvdW5kIHdpdGggTGlzdGVuIGZyZXF1ZW5jeSAlZCBNSHoiLCBmcmVxKTsKKwkJIlAyUDogUGVlciBmb3VuZCB3aXRoIExpc3RlbiBmcmVxdWVuY3kgJWQgTUh6ICIKKwkJIihyeF90aW1lPSV1LiUwNnUpIiwgZnJlcSwgKHVuc2lnbmVkIGludCkgcnhfdGltZS0+c2VjLAorCQkodW5zaWduZWQgaW50KSByeF90aW1lLT51c2VjKTsKIAlpZiAoZGV2LT5mbGFncyAmIFAyUF9ERVZfVVNFUl9SRUpFQ1RFRCkgewogCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCiAJCQkiUDJQOiBEbyBub3QgcmVwb3J0IHJlamVjdGVkIGRldmljZSIpOwogCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAoZGV2LT5pbmZvLmNvbmZpZ19tZXRob2RzID09IDAgJiYKKwkgICAgKGZyZXEgPT0gMjQxMiB8fCBmcmVxID09IDI0MzcgfHwgZnJlcSA9PSAyNDYyKSkgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIG9ubHkgc2VlbiBhIEJlYWNvbiBmcmFtZSBmcm9tIGEgR08sIHdlIGRvIG5vdCB5ZXQKKwkJICoga25vdyB3aGF0IFdQUyBjb25maWcgbWV0aG9kcyBpdCBzdXBwb3J0cy4gU2luY2Ugc29tZQorCQkgKiBhcHBsaWNhdGlvbnMgdXNlIGNvbmZpZ19tZXRob2RzIHZhbHVlIGZyb20gUDJQLURFVklDRS1GT1VORAorCQkgKiBldmVudHMsIHBvc3Rwb25lIHJlcG9ydGluZyB0aGlzIHBlZXIgdW50aWwgd2UndmUgZnVsbHkKKwkJICogZGlzY292ZXJlZCBpdHMgY2FwYWJpbGl0aWVzLgorCQkgKgorCQkgKiBBdCBsZWFzdCBmb3Igbm93LCBkbyB0aGlzIG9ubHkgaWYgdGhlIHBlZXIgd2FzIGRldGVjdGVkIG9uCisJCSAqIG9uZSBvZiB0aGUgc29jaWFsIGNoYW5uZWxzIHNpbmNlIHRoYXQgcGVlciBjYW4gYmUgZWFzaWx5IGJlCisJCSAqIGZvdW5kIGFnYWluIGFuZCB0aGVyZSBhcmUgbm8gbGltaXRhdGlvbnMgb2YgaGF2aW5nIHRvIHVzZQorCQkgKiBwYXNzaXZlIHNjYW4gb24gdGhpcyBjaGFubmVscywgc28gdGhpcyBjYW4gYmUgZG9uZSB0aHJvdWdoCisJCSAqIFByb2JlIFJlc3BvbnNlIGZyYW1lIHRoYXQgaW5jbHVkZXMgdGhlIGNvbmZpZ19tZXRob2RzCisJCSAqIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAorCQkJIlAyUDogRG8gbm90IHJlcG9ydCBwZWVyICIgTUFDU1RSICIgd2l0aCB1bmtub3duICIKKwkJCSJjb25maWcgbWV0aG9kcyIsIE1BQzJTVFIoYWRkcikpOworCQlyZXR1cm4gMDsKKwl9CisKIAlwMnAtPmNmZy0+ZGV2X2ZvdW5kKHAycC0+Y2ZnLT5jYl9jdHgsIGFkZHIsICZkZXYtPmluZm8sCiAJCQkgICAgIShkZXYtPmZsYWdzICYgUDJQX0RFVl9SRVBPUlRFRF9PTkNFKSk7CiAJZGV2LT5mbGFncyB8PSBQMlBfREVWX1JFUE9SVEVEIHwgUDJQX0RFVl9SRVBPUlRFRF9PTkNFOwpAQCAtOTk3LDYgKzEwNzIsNyBAQAogCiAJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLCAiUDJQOiBTdGFydGluZyBmaW5kICh0eXBlPSVkKSIsCiAJCXR5cGUpOworCW9zX2dldF90aW1lKCZwMnAtPmZpbmRfc3RhcnQpOwogCWlmIChwMnAtPnAycF9zY2FuX3J1bm5pbmcpIHsKIAkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLCAiUDJQOiBwMnBfc2NhbiBpcyAiCiAJCQkiYWxyZWFkeSBydW5uaW5nIik7CkBAIC0xMDk5LDggKzExNzUsMTAgQEAKIAkJIm5vdyB0aGF0IHByZXZpb3VzIHNjYW4gd2FzIGNvbXBsZXRlZCIpOwogCWlmIChwMnBfZmluZChwMnAsIHAycC0+bGFzdF9wMnBfZmluZF90aW1lb3V0LCBwMnAtPmZpbmRfdHlwZSwKIAkJICAgICBwMnAtPm51bV9yZXFfZGV2X3R5cGVzLCBwMnAtPnJlcV9kZXZfdHlwZXMsCi0JCSAgICAgcDJwLT5maW5kX2Rldl9pZCwgcDJwLT5zZWFyY2hfZGVsYXkpIDwgMCkKKwkJICAgICBwMnAtPmZpbmRfZGV2X2lkLCBwMnAtPnNlYXJjaF9kZWxheSkgPCAwKSB7CisJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19JTkZPLCBQMlBfRVZFTlRfRklORF9TVE9QUEVEKTsKIAkJcmV0dXJuIDA7CisJfQogCXJldHVybiAxOwogfQogCkBAIC0xMTEwLDcgKzExODgsOSBAQAogCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlAyUDogU3RvcHBpbmcgZmluZCIpOwogCWVsb29wX2NhbmNlbF90aW1lb3V0KHAycF9maW5kX3RpbWVvdXQsIHAycCwgTlVMTCk7CiAJcDJwX2NsZWFyX3RpbWVvdXQocDJwKTsKLQlpZiAocDJwLT5zdGF0ZSA9PSBQMlBfU0VBUkNIKQorCWlmIChwMnAtPnN0YXRlID09IFAyUF9TRUFSQ0ggfHwKKwkgICAgcDJwLT5zdGF0ZSA9PSBQMlBfQ09OVElOVUVfU0VBUkNIX1dIRU5fUkVBRFkgfHwKKwkgICAgcDJwLT5zdGF0ZSA9PSBQMlBfU0VBUkNIX1dIRU5fUkVBRFkpCiAJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19JTkZPLCBQMlBfRVZFTlRfRklORF9TVE9QUEVEKTsKIAlwMnBfc2V0X3N0YXRlKHAycCwgUDJQX0lETEUpOwogCXAycF9mcmVlX3JlcV9kZXZfdHlwZXMocDJwKTsKQEAgLTExNTMsMTAzICsxMjMzLDExNSBAQAogfQogCiAKLXN0YXRpYyBpbnQgcDJwX3ByZXBhcmVfY2hhbm5lbChzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgdW5zaWduZWQgaW50IGZvcmNlX2ZyZXEpCitzdGF0aWMgaW50IHAycF9wcmVwYXJlX2NoYW5uZWxfcHJlZihzdHJ1Y3QgcDJwX2RhdGEgKnAycCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGZvcmNlX2ZyZXEsCisJCQkJICAgIHVuc2lnbmVkIGludCBwcmVmX2ZyZXEpCiB7CisJdTggb3BfY2xhc3MsIG9wX2NoYW5uZWw7CisJdW5zaWduZWQgaW50IGZyZXEgPSBmb3JjZV9mcmVxID8gZm9yY2VfZnJlcSA6IHByZWZfZnJlcTsKKworCWlmIChwMnBfZnJlcV90b19jaGFubmVsKHAycC0+Y2ZnLT5jb3VudHJ5LCBmcmVxLAorCQkJCSZvcF9jbGFzcywgJm9wX2NoYW5uZWwpIDwgMCkgeworCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCisJCQkiUDJQOiBVbnN1cHBvcnRlZCBmcmVxdWVuY3kgJXUgTUh6IiwgZnJlcSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIXAycF9jaGFubmVsc19pbmNsdWRlcygmcDJwLT5jZmctPmNoYW5uZWxzLCBvcF9jbGFzcywgb3BfY2hhbm5lbCkpIHsKKwkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAorCQkJIlAyUDogRnJlcXVlbmN5ICV1IE1IeiAob3Blcl9jbGFzcyAldSBjaGFubmVsICV1KSBub3QgIgorCQkJImFsbG93ZWQgZm9yIFAyUCIsIGZyZXEsIG9wX2NsYXNzLCBvcF9jaGFubmVsKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXAycC0+b3BfcmVnX2NsYXNzID0gb3BfY2xhc3M7CisJcDJwLT5vcF9jaGFubmVsID0gb3BfY2hhbm5lbDsKKwogCWlmIChmb3JjZV9mcmVxKSB7Ci0JCXU4IG9wX3JlZ19jbGFzcywgb3BfY2hhbm5lbDsKLQkJaWYgKHAycF9mcmVxX3RvX2NoYW5uZWwocDJwLT5jZmctPmNvdW50cnksIGZvcmNlX2ZyZXEsCi0JCQkJCSZvcF9yZWdfY2xhc3MsICZvcF9jaGFubmVsKSA8IDApIHsKLQkJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKLQkJCQkiUDJQOiBVbnN1cHBvcnRlZCBmcmVxdWVuY3kgJXUgTUh6IiwKLQkJCQlmb3JjZV9mcmVxKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoIXAycF9jaGFubmVsc19pbmNsdWRlcygmcDJwLT5jZmctPmNoYW5uZWxzLCBvcF9yZWdfY2xhc3MsCi0JCQkJCSAgIG9wX2NoYW5uZWwpKSB7Ci0JCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCi0JCQkJIlAyUDogRnJlcXVlbmN5ICV1IE1IeiAob3Blcl9jbGFzcyAldSAiCi0JCQkJImNoYW5uZWwgJXUpIG5vdCBhbGxvd2VkIGZvciBQMlAiLAotCQkJCWZvcmNlX2ZyZXEsIG9wX3JlZ19jbGFzcywgb3BfY2hhbm5lbCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcDJwLT5vcF9yZWdfY2xhc3MgPSBvcF9yZWdfY2xhc3M7Ci0JCXAycC0+b3BfY2hhbm5lbCA9IG9wX2NoYW5uZWw7Ci0jaWZuZGVmIEFORFJPSURfUDJQCiAJCXAycC0+Y2hhbm5lbHMucmVnX2NsYXNzZXMgPSAxOwogCQlwMnAtPmNoYW5uZWxzLnJlZ19jbGFzc1swXS5jaGFubmVscyA9IDE7CiAJCXAycC0+Y2hhbm5lbHMucmVnX2NsYXNzWzBdLnJlZ19jbGFzcyA9IHAycC0+b3BfcmVnX2NsYXNzOwogCQlwMnAtPmNoYW5uZWxzLnJlZ19jbGFzc1swXS5jaGFubmVsWzBdID0gcDJwLT5vcF9jaGFubmVsOwotI2Vsc2UKLQkJaWYocDJwLT5jZmctPnAycF9jb25jdXJyZW5jeSA9PSBQMlBfTVVMVElfQ0hBTk5FTF9DT05DVVJSRU5UKSB7Ci0JCQkvKiBXZSB3ZSBhcmUgcmVxdWVzdGluZyBmb3IgYSBwcmVmZXJyZWQgY2hhbm5lbC4gQnV0IHNpbmNlCi0JCQkgKiBhcmUgbXVsdGljaGFubmVsIGNvbmN1cnJlbnQsIHdlIGhhdmUgdG8gcG9wbHVsYXRlIHRoZQotCQkJICogcDJwX2NoYW5uZWxzIHdpdGggbGlzdCBvZiBjaGFubmVscyB0aGF0IHdlIHN1cHBvcnQuCi0JCQkgKi8KLSNpZmRlZiBBTkRST0lEX1AyUAotCQkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLCAiRnVsbCBjaGFubmVsIGxpc3QiKTsKLSNlbmRpZgotCQkJb3NfbWVtY3B5KCZwMnAtPmNoYW5uZWxzLCAmcDJwLT5jZmctPmNoYW5uZWxzLAotCQkJCXNpemVvZihzdHJ1Y3QgcDJwX2NoYW5uZWxzKSk7Ci0JCX0gZWxzZSB7Ci0jaWZkZWYgQU5EUk9JRF9QMlAKLQkJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlNpbmdsZSBjaGFubmVsIGxpc3QgJWQiLCBwMnAtPm9wX2NoYW5uZWwpOwotI2VuZGlmCi0JCQlwMnAtPmNoYW5uZWxzLnJlZ19jbGFzc2VzID0gMTsKLQkJCXAycC0+Y2hhbm5lbHMucmVnX2NsYXNzWzBdLmNoYW5uZWxzID0gMTsKLQkJCXAycC0+Y2hhbm5lbHMucmVnX2NsYXNzWzBdLnJlZ19jbGFzcyA9IHAycC0+b3BfcmVnX2NsYXNzOwotCQkJcDJwLT5jaGFubmVscy5yZWdfY2xhc3NbMF0uY2hhbm5lbFswXSA9IHAycC0+b3BfY2hhbm5lbDsKLQkJfQotI2VuZGlmCiAJfSBlbHNlIHsKLQkJdTggb3BfcmVnX2NsYXNzLCBvcF9jaGFubmVsOwotCi0JCWlmICghcDJwLT5jZmctPmNmZ19vcF9jaGFubmVsICYmIHAycC0+YmVzdF9mcmVxX292ZXJhbGwgPiAwICYmCi0JCSAgICBwMnBfc3VwcG9ydGVkX2ZyZXEocDJwLCBwMnAtPmJlc3RfZnJlcV9vdmVyYWxsKSAmJgotCQkgICAgcDJwX2ZyZXFfdG9fY2hhbm5lbChwMnAtPmNmZy0+Y291bnRyeSwKLQkJCQkJcDJwLT5iZXN0X2ZyZXFfb3ZlcmFsbCwKLQkJCQkJJm9wX3JlZ19jbGFzcywgJm9wX2NoYW5uZWwpID09IDApIHsKLQkJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKLQkJCQkiUDJQOiBTZWxlY3QgYmVzdCBvdmVyYWxsIGNoYW5uZWwgYXMgIgotCQkJCSJvcGVyYXRpbmcgY2hhbm5lbCBwcmVmZXJlbmNlIik7Ci0JCQlwMnAtPm9wX3JlZ19jbGFzcyA9IG9wX3JlZ19jbGFzczsKLQkJCXAycC0+b3BfY2hhbm5lbCA9IG9wX2NoYW5uZWw7Ci0JCX0gZWxzZSBpZiAoIXAycC0+Y2ZnLT5jZmdfb3BfY2hhbm5lbCAmJiBwMnAtPmJlc3RfZnJlcV81ID4gMCAmJgotCQkJICAgcDJwX3N1cHBvcnRlZF9mcmVxKHAycCwgcDJwLT5iZXN0X2ZyZXFfNSkgJiYKLQkJCSAgIHAycF9mcmVxX3RvX2NoYW5uZWwocDJwLT5jZmctPmNvdW50cnksCi0JCQkJCSAgICAgICBwMnAtPmJlc3RfZnJlcV81LAotCQkJCQkgICAgICAgJm9wX3JlZ19jbGFzcywgJm9wX2NoYW5uZWwpID09Ci0JCQkgICAwKSB7Ci0JCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCi0JCQkJIlAyUDogU2VsZWN0IGJlc3QgNSBHSHogY2hhbm5lbCBhcyAiCi0JCQkJIm9wZXJhdGluZyBjaGFubmVsIHByZWZlcmVuY2UiKTsKLQkJCXAycC0+b3BfcmVnX2NsYXNzID0gb3BfcmVnX2NsYXNzOwotCQkJcDJwLT5vcF9jaGFubmVsID0gb3BfY2hhbm5lbDsKLQkJfSBlbHNlIGlmICghcDJwLT5jZmctPmNmZ19vcF9jaGFubmVsICYmCi0JCQkgICBwMnAtPmJlc3RfZnJlcV8yNCA+IDAgJiYKLQkJCSAgIHAycF9zdXBwb3J0ZWRfZnJlcShwMnAsIHAycC0+YmVzdF9mcmVxXzI0KSAmJgotCQkJICAgcDJwX2ZyZXFfdG9fY2hhbm5lbChwMnAtPmNmZy0+Y291bnRyeSwKLQkJCQkJICAgICAgIHAycC0+YmVzdF9mcmVxXzI0LAotCQkJCQkgICAgICAgJm9wX3JlZ19jbGFzcywgJm9wX2NoYW5uZWwpID09Ci0JCQkgICAwKSB7Ci0JCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCi0JCQkJIlAyUDogU2VsZWN0IGJlc3QgMi40IEdIeiBjaGFubmVsIGFzICIKLQkJCQkib3BlcmF0aW5nIGNoYW5uZWwgcHJlZmVyZW5jZSIpOwotCQkJcDJwLT5vcF9yZWdfY2xhc3MgPSBvcF9yZWdfY2xhc3M7Ci0JCQlwMnAtPm9wX2NoYW5uZWwgPSBvcF9jaGFubmVsOwotCQl9IGVsc2UgewotCQkJcDJwLT5vcF9yZWdfY2xhc3MgPSBwMnAtPmNmZy0+b3BfcmVnX2NsYXNzOwotCQkJcDJwLT5vcF9jaGFubmVsID0gcDJwLT5jZmctPm9wX2NoYW5uZWw7Ci0JCX0KLQogCQlvc19tZW1jcHkoJnAycC0+Y2hhbm5lbHMsICZwMnAtPmNmZy0+Y2hhbm5lbHMsCiAJCQkgIHNpemVvZihzdHJ1Y3QgcDJwX2NoYW5uZWxzKSk7CiAJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcDJwX3ByZXBhcmVfY2hhbm5lbF9iZXN0KHN0cnVjdCBwMnBfZGF0YSAqcDJwKQoreworCXU4IG9wX2NsYXNzLCBvcF9jaGFubmVsOworCisJaWYgKCFwMnAtPmNmZy0+Y2ZnX29wX2NoYW5uZWwgJiYgcDJwLT5iZXN0X2ZyZXFfb3ZlcmFsbCA+IDAgJiYKKwkgICAgcDJwX3N1cHBvcnRlZF9mcmVxKHAycCwgcDJwLT5iZXN0X2ZyZXFfb3ZlcmFsbCkgJiYKKwkgICAgcDJwX2ZyZXFfdG9fY2hhbm5lbChwMnAtPmNmZy0+Y291bnRyeSwgcDJwLT5iZXN0X2ZyZXFfb3ZlcmFsbCwKKwkJCQkmb3BfY2xhc3MsICZvcF9jaGFubmVsKSA9PSAwKSB7CisJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlAyUDogU2VsZWN0IGJlc3QgIgorCQkJIm92ZXJhbGwgY2hhbm5lbCBhcyBvcGVyYXRpbmcgY2hhbm5lbCBwcmVmZXJlbmNlIik7CisJCXAycC0+b3BfcmVnX2NsYXNzID0gb3BfY2xhc3M7CisJCXAycC0+b3BfY2hhbm5lbCA9IG9wX2NoYW5uZWw7CisJfSBlbHNlIGlmICghcDJwLT5jZmctPmNmZ19vcF9jaGFubmVsICYmIHAycC0+YmVzdF9mcmVxXzUgPiAwICYmCisJCSAgIHAycF9zdXBwb3J0ZWRfZnJlcShwMnAsIHAycC0+YmVzdF9mcmVxXzUpICYmCisJCSAgIHAycF9mcmVxX3RvX2NoYW5uZWwocDJwLT5jZmctPmNvdW50cnksIHAycC0+YmVzdF9mcmVxXzUsCisJCQkJICAgICAgICZvcF9jbGFzcywgJm9wX2NoYW5uZWwpID09IDApIHsKKwkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLCAiUDJQOiBTZWxlY3QgYmVzdCA1IEdIeiAiCisJCQkiY2hhbm5lbCBhcyBvcGVyYXRpbmcgY2hhbm5lbCBwcmVmZXJlbmNlIik7CisJCXAycC0+b3BfcmVnX2NsYXNzID0gb3BfY2xhc3M7CisJCXAycC0+b3BfY2hhbm5lbCA9IG9wX2NoYW5uZWw7CisJfSBlbHNlIGlmICghcDJwLT5jZmctPmNmZ19vcF9jaGFubmVsICYmIHAycC0+YmVzdF9mcmVxXzI0ID4gMCAmJgorCQkgICBwMnBfc3VwcG9ydGVkX2ZyZXEocDJwLCBwMnAtPmJlc3RfZnJlcV8yNCkgJiYKKwkJICAgcDJwX2ZyZXFfdG9fY2hhbm5lbChwMnAtPmNmZy0+Y291bnRyeSwgcDJwLT5iZXN0X2ZyZXFfMjQsCisJCQkJICAgICAgICZvcF9jbGFzcywgJm9wX2NoYW5uZWwpID09IDApIHsKKwkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLCAiUDJQOiBTZWxlY3QgYmVzdCAyLjQgIgorCQkJIkdIeiBjaGFubmVsIGFzIG9wZXJhdGluZyBjaGFubmVsIHByZWZlcmVuY2UiKTsKKwkJcDJwLT5vcF9yZWdfY2xhc3MgPSBvcF9jbGFzczsKKwkJcDJwLT5vcF9jaGFubmVsID0gb3BfY2hhbm5lbDsKKwl9IGVsc2UgeworCQlwMnAtPm9wX3JlZ19jbGFzcyA9IHAycC0+Y2ZnLT5vcF9yZWdfY2xhc3M7CisJCXAycC0+b3BfY2hhbm5lbCA9IHAycC0+Y2ZnLT5vcF9jaGFubmVsOworCX0KKworCW9zX21lbWNweSgmcDJwLT5jaGFubmVscywgJnAycC0+Y2ZnLT5jaGFubmVscywKKwkJICBzaXplb2Yoc3RydWN0IHAycF9jaGFubmVscykpOworfQorCisKKy8qKgorICogcDJwX3ByZXBhcmVfY2hhbm5lbCAtIFNlbGVjdCBvcGVyYXRpbmcgY2hhbm5lbCBmb3IgR08gTmVnb3RpYXRpb24KKyAqIEBwMnA6IFAyUCBtb2R1bGUgY29udGV4dCBmcm9tIHAycF9pbml0KCkKKyAqIEBkZXY6IFNlbGVjdGVkIHBlZXIgZGV2aWNlCisgKiBAZm9yY2VfZnJlcTogRm9yY2VkIGZyZXF1ZW5jeSBpbiBNSHogb3IgMCBpZiBub3QgZm9yY2VkCisgKiBAcHJlZl9mcmVxOiBQcmVmZXJyZWQgZnJlcXVlbmN5IGluIE1IeiBvciAwIGlmIG5vIHByZWZlcmVuY2UKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAoY2hhbm5lbCBub3Qgc3VwcG9ydGVkIGZvciBQMlApCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRvIGluaXRpYWwgb3BlcmF0aW5nIGNoYW5uZWwgc2VsZWN0aW9uIGZvciBHTworICogTmVnb3RpYXRpb24gcHJpb3IgdG8gaGF2aW5nIHJlY2VpdmVkIHBlZXIgaW5mb3JtYXRpb24uIFRoZSBzZWxlY3RlZCBjaGFubmVsCisgKiBtYXkgYmUgZnVydGhlciBvcHRpbWl6ZWQgaW4gcDJwX3Jlc2VsZWN0X2NoYW5uZWwoKSBvbmNlIHRoZSBwZWVyIGluZm9ybWF0aW9uCisgKiBpcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQgcDJwX3ByZXBhcmVfY2hhbm5lbChzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgc3RydWN0IHAycF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm9yY2VfZnJlcSwgdW5zaWduZWQgaW50IHByZWZfZnJlcSkKK3sKKwlpZiAoZm9yY2VfZnJlcSB8fCBwcmVmX2ZyZXEpIHsKKwkJaWYgKHAycF9wcmVwYXJlX2NoYW5uZWxfcHJlZihwMnAsIGZvcmNlX2ZyZXEsIHByZWZfZnJlcSkgPCAwKQorCQkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCXAycF9wcmVwYXJlX2NoYW5uZWxfYmVzdChwMnApOworCX0KIAl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCiAJCSJQMlA6IE93biBwcmVmZXJlbmNlIGZvciBvcGVyYXRpb24gY2hhbm5lbDogIgogCQkiT3BlcmF0aW5nIENsYXNzICV1IENoYW5uZWwgJXUlcyIsCiAJCXAycC0+b3BfcmVnX2NsYXNzLCBwMnAtPm9wX2NoYW5uZWwsCiAJCWZvcmNlX2ZyZXEgPyAiIChmb3JjZWQpIiA6ICIiKTsKIAorCWlmIChmb3JjZV9mcmVxKQorCQlkZXYtPmZsYWdzIHw9IFAyUF9ERVZfRk9SQ0VfRlJFUTsKKwllbHNlCisJCWRldi0+ZmxhZ3MgJj0gflAyUF9ERVZfRk9SQ0VfRlJFUTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMjc5LDE5ICsxMzcxLDE2IEBACiAJCWludCBnb19pbnRlbnQsIGNvbnN0IHU4ICpvd25faW50ZXJmYWNlX2FkZHIsCiAJCXVuc2lnbmVkIGludCBmb3JjZV9mcmVxLCBpbnQgcGVyc2lzdGVudF9ncm91cCwKIAkJY29uc3QgdTggKmZvcmNlX3NzaWQsIHNpemVfdCBmb3JjZV9zc2lkX2xlbiwKLQkJaW50IHBkX2JlZm9yZV9nb19uZWcpCisJCWludCBwZF9iZWZvcmVfZ29fbmVnLCB1bnNpZ25lZCBpbnQgcHJlZl9mcmVxKQogewogCXN0cnVjdCBwMnBfZGV2aWNlICpkZXY7CiAKIAl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCiAJCSJQMlA6IFJlcXVlc3QgdG8gc3RhcnQgZ3JvdXAgbmVnb3RpYXRpb24gLSBwZWVyPSIgTUFDU1RSCiAJCSIgIEdPIEludGVudD0lZCAgSW50ZW5kZWQgSW50ZXJmYWNlIEFkZHJlc3M9IiBNQUNTVFIKLQkJIiB3cHNfbWV0aG9kPSVkIHBlcnNpc3RlbnRfZ3JvdXA9JWQgcGRfYmVmb3JlX2dvX25lZz0lZCBmb3JjZV9mcmVxICVkIiwKKwkJIiB3cHNfbWV0aG9kPSVkIHBlcnNpc3RlbnRfZ3JvdXA9JWQgcGRfYmVmb3JlX2dvX25lZz0lZCIsCiAJCU1BQzJTVFIocGVlcl9hZGRyKSwgZ29faW50ZW50LCBNQUMyU1RSKG93bl9pbnRlcmZhY2VfYWRkciksCi0JCXdwc19tZXRob2QsIHBlcnNpc3RlbnRfZ3JvdXAsIHBkX2JlZm9yZV9nb19uZWcsIGZvcmNlX2ZyZXEpOwotCi0JaWYgKHAycF9wcmVwYXJlX2NoYW5uZWwocDJwLCBmb3JjZV9mcmVxKSA8IDApCi0JCXJldHVybiAtMTsKKwkJd3BzX21ldGhvZCwgcGVyc2lzdGVudF9ncm91cCwgcGRfYmVmb3JlX2dvX25lZyk7CiAKIAlkZXYgPSBwMnBfZ2V0X2RldmljZShwMnAsIHBlZXJfYWRkcik7CiAJaWYgKGRldiA9PSBOVUxMIHx8IChkZXYtPmZsYWdzICYgUDJQX0RFVl9QUk9CRV9SRVFfT05MWSkpIHsKQEAgLTEzMDEsNiArMTM5MCw5IEBACiAJCXJldHVybiAtMTsKIAl9CiAKKwlpZiAocDJwX3ByZXBhcmVfY2hhbm5lbChwMnAsIGRldiwgZm9yY2VfZnJlcSwgcHJlZl9mcmVxKSA8IDApCisJCXJldHVybiAtMTsKKwogCWlmIChkZXYtPmZsYWdzICYgUDJQX0RFVl9HUk9VUF9DTElFTlRfT05MWSkgewogCQlpZiAoIShkZXYtPmluZm8uZGV2X2NhcGFiICYKIAkJICAgICAgUDJQX0RFVl9DQVBBQl9DTElFTlRfRElTQ09WRVJBQklMSVRZKSkgewpAQCAtMTM0MCw4ICsxNDMyLDE4IEBACiAJZGV2LT5mbGFncyAmPSB+UDJQX0RFVl9XQUlUX0dPX05FR19DT05GSVJNOwogCWlmIChwZF9iZWZvcmVfZ29fbmVnKQogCQlkZXYtPmZsYWdzIHw9IFAyUF9ERVZfUERfQkVGT1JFX0dPX05FRzsKLQllbHNlCisJZWxzZSB7CiAJCWRldi0+ZmxhZ3MgJj0gflAyUF9ERVZfUERfQkVGT1JFX0dPX05FRzsKKwkJLyoKKwkJICogQXNzaWduIGRpYWxvZyB0b2tlbiBhbmQgdGllIGJyZWFrZXIgaGVyZSB0byB1c2UgdGhlIHNhbWUKKwkJICogdmFsdWVzIGluIGVhY2ggcmV0cnkgd2l0aGluIHRoZSBzYW1lIEdPIE5lZ290aWF0aW9uIGV4Y2hhbmdlLgorCQkgKi8KKwkJZGV2LT5kaWFsb2dfdG9rZW4rKzsKKwkJaWYgKGRldi0+ZGlhbG9nX3Rva2VuID09IDApCisJCQlkZXYtPmRpYWxvZ190b2tlbiA9IDE7CisJCWRldi0+dGllX2JyZWFrZXIgPSBwMnAtPm5leHRfdGllX2JyZWFrZXI7CisJCXAycC0+bmV4dF90aWVfYnJlYWtlciA9ICFwMnAtPm5leHRfdGllX2JyZWFrZXI7CisJfQogCWRldi0+Y29ubmVjdF9yZXFzID0gMDsKIAlkZXYtPmdvX25lZ19yZXFfc2VudCA9IDA7CiAJZGV2LT5nb19zdGF0ZSA9IFVOS05PV05fR087CkBAIC0xMzY4LDExICsxNDcwLDYgQEAKIAlkZXYtPndwc19tZXRob2QgPSB3cHNfbWV0aG9kOwogCWRldi0+c3RhdHVzID0gUDJQX1NDX1NVQ0NFU1M7CiAKLQlpZiAoZm9yY2VfZnJlcSkKLQkJZGV2LT5mbGFncyB8PSBQMlBfREVWX0ZPUkNFX0ZSRVE7Ci0JZWxzZQotCQlkZXYtPmZsYWdzICY9IH5QMlBfREVWX0ZPUkNFX0ZSRVE7Ci0KIAlpZiAocDJwLT5wMnBfc2Nhbl9ydW5uaW5nKSB7CiAJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKIAkJCSJQMlA6IHAycF9zY2FuIHJ1bm5pbmcgLSBkZWxheSBjb25uZWN0IHNlbmQiKTsKQEAgLTEzOTAsNyArMTQ4Nyw4IEBACiAJCSAgZW51bSBwMnBfd3BzX21ldGhvZCB3cHNfbWV0aG9kLAogCQkgIGludCBnb19pbnRlbnQsIGNvbnN0IHU4ICpvd25faW50ZXJmYWNlX2FkZHIsCiAJCSAgdW5zaWduZWQgaW50IGZvcmNlX2ZyZXEsIGludCBwZXJzaXN0ZW50X2dyb3VwLAotCQkgIGNvbnN0IHU4ICpmb3JjZV9zc2lkLCBzaXplX3QgZm9yY2Vfc3NpZF9sZW4pCisJCSAgY29uc3QgdTggKmZvcmNlX3NzaWQsIHNpemVfdCBmb3JjZV9zc2lkX2xlbiwKKwkJICB1bnNpZ25lZCBpbnQgcHJlZl9mcmVxKQogewogCXN0cnVjdCBwMnBfZGV2aWNlICpkZXY7CiAKQEAgLTE0MDEsOSArMTQ5OSw2IEBACiAJCU1BQzJTVFIocGVlcl9hZGRyKSwgZ29faW50ZW50LCBNQUMyU1RSKG93bl9pbnRlcmZhY2VfYWRkciksCiAJCXdwc19tZXRob2QsIHBlcnNpc3RlbnRfZ3JvdXApOwogCi0JaWYgKHAycF9wcmVwYXJlX2NoYW5uZWwocDJwLCBmb3JjZV9mcmVxKSA8IDApCi0JCXJldHVybiAtMTsKLQogCWRldiA9IHAycF9nZXRfZGV2aWNlKHAycCwgcGVlcl9hZGRyKTsKIAlpZiAoZGV2ID09IE5VTEwpIHsKIAkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLApAQCAtMTQxMiw2ICsxNTA3LDkgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAorCWlmIChwMnBfcHJlcGFyZV9jaGFubmVsKHAycCwgZGV2LCBmb3JjZV9mcmVxLCBwcmVmX2ZyZXEpIDwgMCkKKwkJcmV0dXJuIC0xOworCiAJcDJwLT5zc2lkX3NldCA9IDA7CiAJaWYgKGZvcmNlX3NzaWQpIHsKIAkJd3BhX2hleGR1bXBfYXNjaWkoTVNHX0RFQlVHLCAiUDJQOiBGb3JjZWQgU1NJRCIsCkBAIC0xNDMyLDExICsxNTMwLDYgQEAKIAlkZXYtPndwc19tZXRob2QgPSB3cHNfbWV0aG9kOwogCWRldi0+c3RhdHVzID0gUDJQX1NDX1NVQ0NFU1M7CiAKLQlpZiAoZm9yY2VfZnJlcSkKLQkJZGV2LT5mbGFncyB8PSBQMlBfREVWX0ZPUkNFX0ZSRVE7Ci0JZWxzZQotCQlkZXYtPmZsYWdzICY9IH5QMlBfREVWX0ZPUkNFX0ZSRVE7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE0MCwxMSArMjIzMywxMyBAQAogCWlmICgocDJwLT5zdGF0ZSA9PSBQMlBfQ09OTkVDVCB8fCBwMnAtPnN0YXRlID09IFAyUF9DT05ORUNUX0xJU1RFTikgJiYKIAkgICAgcDJwLT5nb19uZWdfcGVlciAmJgogCSAgICBvc19tZW1jbXAoYWRkciwgcDJwLT5nb19uZWdfcGVlci0+aW5mby5wMnBfZGV2aWNlX2FkZHIsIEVUSF9BTEVOKQotCSAgICA9PSAwKSB7CisJICAgID09IDAgJiYKKwkgICAgIShwMnAtPmdvX25lZ19wZWVyLT5mbGFncyAmIFAyUF9ERVZfV0FJVF9HT19ORUdfQ09ORklSTSkpIHsKIAkJLyogUmVjZWl2ZWQgYSBQcm9iZSBSZXF1ZXN0IGZyb20gR08gTmVnb3RpYXRpb24gcGVlciAqLwogCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCiAJCQkiUDJQOiBGb3VuZCBHTyBOZWdvdGlhdGlvbiBwZWVyIC0gdHJ5IHRvIHN0YXJ0IEdPICIKIAkJCSJuZWdvdGlhdGlvbiBmcm9tIHRpbWVvdXQiKTsKKwkJZWxvb3BfY2FuY2VsX3RpbWVvdXQocDJwX2dvX25lZ19zdGFydCwgcDJwLCBOVUxMKTsKIAkJZWxvb3BfcmVnaXN0ZXJfdGltZW91dCgwLCAwLCBwMnBfZ29fbmVnX3N0YXJ0LCBwMnAsIE5VTEwpOwogCQlyZXR1cm4gUDJQX1BSRVFfUFJPQ0VTU0VEOwogCX0KQEAgLTI0MTYsNiArMjUxMSw3IEBACiAJcDJwLT5taW5fZGlzY19pbnQgPSAxOwogI2VuZGlmCiAJcDJwLT5tYXhfZGlzY19pbnQgPSAzOworCXAycC0+bWF4X2Rpc2NfdHUgPSAtMTsKIAogCW9zX2dldF9yYW5kb20oJnAycC0+bmV4dF90aWVfYnJlYWtlciwgMSk7CiAJcDJwLT5uZXh0X3RpZV9icmVha2VyICY9IDB4MDE7CkBAIC0yNDU3LDYgKzI1NTMsNyBAQAogCWVsb29wX2NhbmNlbF90aW1lb3V0KHAycF9leHBpcmF0aW9uX3RpbWVvdXQsIHAycCwgTlVMTCk7CiAJZWxvb3BfY2FuY2VsX3RpbWVvdXQocDJwX2V4dF9saXN0ZW5fdGltZW91dCwgcDJwLCBOVUxMKTsKIAllbG9vcF9jYW5jZWxfdGltZW91dChwMnBfc2Nhbl90aW1lb3V0LCBwMnAsIE5VTEwpOworCWVsb29wX2NhbmNlbF90aW1lb3V0KHAycF9nb19uZWdfc3RhcnQsIHAycCwgTlVMTCk7CiAJcDJwX2ZsdXNoKHAycCk7CiAJcDJwX2ZyZWVfcmVxX2Rldl90eXBlcyhwMnApOwogCW9zX2ZyZWUocDJwLT5jZmctPmRldl9uYW1lKTsKQEAgLTI3MTIsNyArMjgwOSw3IEBACiAJCX0KIAl9CiAKLQlwMnBfbGlzdGVuX2luX2ZpbmQocDJwKTsKKwlwMnBfbGlzdGVuX2luX2ZpbmQocDJwLCAxKTsKIH0KIAogCkBAIC0yNzU4LDggKzI4NTUsNyBAQAogCiAJLyoKIAkgKiBSZXRyeSB0aGUgcHJvdiBkaXNjIHJlcSBhdHRlbXB0IG9ubHkgZm9yIHRoZSBwZWVyIHRoYXQgdGhlIHVzZXIgaGFkCi0JICogcmVxdWVzdGVkIGZvciBhbmQgcHJvdmlkZWQgYSBqb2luIGhhcyBub3QgYmVlbiBpbml0aWF0ZWQgb24gaXQKLQkgKiBpbiB0aGUgbWVhbnRpbWUuCisJICogcmVxdWVzdGVkLgogCSAqLwogCiAJZGxfbGlzdF9mb3JfZWFjaChkZXYsICZwMnAtPmRldmljZXMsIHN0cnVjdCBwMnBfZGV2aWNlLCBsaXN0KSB7CkBAIC0yNzY4LDE1ICsyODY0LDE0IEBACiAJCQljb250aW51ZTsKIAkJaWYgKCFkZXYtPnJlcV9jb25maWdfbWV0aG9kcykKIAkJCWNvbnRpbnVlOwotCQlpZiAoZGV2LT5mbGFncyAmIFAyUF9ERVZfUERfRk9SX0pPSU4pCi0JCQljb250aW51ZTsKIAogCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsICJQMlA6IFNlbmQgIgogCQkJInBlbmRpbmcgUHJvdmlzaW9uIERpc2NvdmVyeSBSZXF1ZXN0IHRvICIKIAkJCU1BQ1NUUiAiIChjb25maWcgbWV0aG9kcyAweCV4KSIsCiAJCQlNQUMyU1RSKGRldi0+aW5mby5wMnBfZGV2aWNlX2FkZHIpLAogCQkJZGV2LT5yZXFfY29uZmlnX21ldGhvZHMpOwotCQlwMnBfc2VuZF9wcm92X2Rpc2NfcmVxKHAycCwgZGV2LCAwLCAwKTsKKwkJcDJwX3NlbmRfcHJvdl9kaXNjX3JlcShwMnAsIGRldiwKKwkJCQkgICAgICAgZGV2LT5mbGFncyAmIFAyUF9ERVZfUERfRk9SX0pPSU4sIDApOwogCQlyZXR1cm47CiAJfQogfQpAQCAtMjg0MSw5ICsyOTM2LDI1IEBACiAKIAogaW50IHAycF9zY2FuX3Jlc19oYW5kbGVyKHN0cnVjdCBwMnBfZGF0YSAqcDJwLCBjb25zdCB1OCAqYnNzaWQsIGludCBmcmVxLAotCQkJIGludCBsZXZlbCwgY29uc3QgdTggKmllcywgc2l6ZV90IGllc19sZW4pCisJCQkgc3RydWN0IG9zX3RpbWUgKnJ4X3RpbWUsIGludCBsZXZlbCwgY29uc3QgdTggKmllcywKKwkJCSBzaXplX3QgaWVzX2xlbikKIHsKLQlwMnBfYWRkX2RldmljZShwMnAsIGJzc2lkLCBmcmVxLCBsZXZlbCwgaWVzLCBpZXNfbGVuLCAxKTsKKwlpZiAob3NfdGltZV9iZWZvcmUocnhfdGltZSwgJnAycC0+ZmluZF9zdGFydCkpIHsKKwkJLyoKKwkJICogVGhlIGRyaXZlciBtYXkgaGF2ZSBjYWNoZWQgKGUuZy4sIGluIGNmZzgwMjExIEJTUyB0YWJsZSkgdGhlCisJCSAqIHNjYW4gcmVzdWx0cyBmb3IgcmVsYXRpdmVseSBsb25nIHRpbWUuIFRvIGF2b2lkIHJlcG9ydGluZworCQkgKiBzdGFsZSBpbmZvcm1hdGlvbiwgdXBkYXRlIFAyUCBwZWVycyBvbmx5IGJhc2VkIG9uIHJlc3VsdHMKKwkJICogdGhhdCBoYXZlIGJhc2VkIG9uIGZyYW1lcyByZWNlaXZlZCBhZnRlciB0aGUgbGFzdCBwMnBfZmluZAorCQkgKiBvcGVyYXRpb24gd2FzIHN0YXJ0ZWQuCisJCSAqLworCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsICJQMlA6IElnbm9yZSBvbGQgc2NhbiAiCisJCQkicmVzdWx0IGZvciAiIE1BQ1NUUiAiIChyeF90aW1lPSV1LiUwNnUpIiwKKwkJCU1BQzJTVFIoYnNzaWQpLCAodW5zaWduZWQgaW50KSByeF90aW1lLT5zZWMsCisJCQkodW5zaWduZWQgaW50KSByeF90aW1lLT51c2VjKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcDJwX2FkZF9kZXZpY2UocDJwLCBic3NpZCwgZnJlcSwgcnhfdGltZSwgbGV2ZWwsIGllcywgaWVzX2xlbiwgMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMxOTgsNyArMzMwOSw3IEBACiAJCXJldHVybjsKIAl9CiAJcDJwX3NldF9zdGF0ZShwMnAsIFAyUF9DT05ORUNUX0xJU1RFTik7Ci0JcDJwX2xpc3Rlbl9pbl9maW5kKHAycCk7CisJcDJwX2xpc3Rlbl9pbl9maW5kKHAycCwgMCk7CiB9CiAKIApAQCAtMzI2Miw3ICszMzczLDcgQEAKIAkJIlAyUDogR28gdG8gTGlzdGVuIHN0YXRlIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBwZWVyIHRvIGJlY29tZSAiCiAJCSJyZWFkeSBmb3IgR08gTmVnb3RpYXRpb24iKTsKIAlwMnBfc2V0X3N0YXRlKHAycCwgUDJQX1dBSVRfUEVFUl9DT05ORUNUKTsKLQlwMnBfbGlzdGVuX2luX2ZpbmQocDJwKTsKKwlwMnBfbGlzdGVuX2luX2ZpbmQocDJwLCAwKTsKIH0KIAogCkBAIC0zMzA3LDkgKzM0MTgsMjMgQEAKIAkJcDJwLT5wZF9yZXRyaWVzLS07CiAJCXAycF9yZXRyeV9wZChwMnApOwogCX0gZWxzZSB7CisJCXN0cnVjdCBwMnBfZGV2aWNlICpkZXY7CisJCWludCBmb3Jfam9pbiA9IDA7CisKKwkJZGxfbGlzdF9mb3JfZWFjaChkZXYsICZwMnAtPmRldmljZXMsIHN0cnVjdCBwMnBfZGV2aWNlLCBsaXN0KSB7CisJCQlpZiAob3NfbWVtY21wKHAycC0+cGVuZGluZ19wZF9kZXZhZGRyLAorCQkJCSAgICAgIGRldi0+aW5mby5wMnBfZGV2aWNlX2FkZHIsIEVUSF9BTEVOKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGRldi0+cmVxX2NvbmZpZ19tZXRob2RzICYmCisJCQkgICAgKGRldi0+ZmxhZ3MgJiBQMlBfREVWX1BEX0ZPUl9KT0lOKSkKKwkJCQlmb3Jfam9pbiA9IDE7CisJCX0KKwogCQlpZiAocDJwLT5jZmctPnByb3ZfZGlzY19mYWlsKQogCQkJcDJwLT5jZmctPnByb3ZfZGlzY19mYWlsKHAycC0+Y2ZnLT5jYl9jdHgsCiAJCQkJCQkgcDJwLT5wZW5kaW5nX3BkX2RldmFkZHIsCisJCQkJCQkgZm9yX2pvaW4gPworCQkJCQkJIFAyUF9QUk9WX0RJU0NfVElNRU9VVF9KT0lOIDoKIAkJCQkJCSBQMlBfUFJPVl9ESVNDX1RJTUVPVVQpOwogCQlwMnBfcmVzZXRfcGVuZGluZ19wZChwMnApOwogCX0KQEAgLTMzMzAsNyArMzQ1NSw3IEBACiAJCXAycF9zZXRfdGltZW91dChwMnAsIDAsIDEwMDAwMCk7CiAJCXJldHVybjsKIAl9Ci0JcDJwX2xpc3Rlbl9pbl9maW5kKHAycCk7CisJcDJwX2xpc3Rlbl9pbl9maW5kKHAycCwgMCk7CiB9CiAKIApAQCAtNDM4NCwzICs0NTA5LDIwIEBACiB9CiAKICNlbmRpZiAvKiBDT05GSUdfV0lGSV9ESVNQTEFZICovCisKKworaW50IHAycF9zZXRfZGlzY19pbnQoc3RydWN0IHAycF9kYXRhICpwMnAsIGludCBtaW5fZGlzY19pbnQsIGludCBtYXhfZGlzY19pbnQsCisJCSAgICAgaW50IG1heF9kaXNjX3R1KQoreworCWlmIChtaW5fZGlzY19pbnQgPiBtYXhfZGlzY19pbnQgfHwgbWluX2Rpc2NfaW50IDwgMCB8fCBtYXhfZGlzY19pbnQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlwMnAtPm1pbl9kaXNjX2ludCA9IG1pbl9kaXNjX2ludDsKKwlwMnAtPm1heF9kaXNjX2ludCA9IG1heF9kaXNjX2ludDsKKwlwMnAtPm1heF9kaXNjX3R1ID0gbWF4X2Rpc2NfdHU7CisJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLCAiUDJQOiBTZXQgZGlzY292ZXJhYmxlIGludGVydmFsOiAiCisJCSJtaW49JWQgbWF4PSVkIG1heF90dT0lZCIsIG1pbl9kaXNjX2ludCwgbWF4X2Rpc2NfaW50LAorCQltYXhfZGlzY190dSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9wMnAvcDJwLmggYi9zcmMvcDJwL3AycC5oCmluZGV4IGI4MGY4OTguLjA2NjNmYmIgMTAwNjQ0Ci0tLSBhL3NyYy9wMnAvcDJwLmgKKysrIGIvc3JjL3AycC9wMnAuaApAQCAtOTIsNiArOTIsMTYgQEAKIAlzaXplX3Qgc3NpZF9sZW47CiAKIAkvKioKKwkgKiBwc2sgLSBXUEEgcHJlLXNoYXJlZCBrZXkgKDI1NiBiaXRzKSAoR08gb25seSkKKwkgKi8KKwl1OCBwc2tbMzJdOworCisJLyoqCisJICogcHNrX3NldCAtIFdoZXRoZXIgUFNLIGZpZWxkIGlzIGNvbmZpZ3VyZWQgKEdPIG9ubHkpCisJICovCisJaW50IHBza19zZXQ7CisKKwkvKioKIAkgKiBwYXNzcGhyYXNlIC0gV1BBMi1QZXJzb25hbCBwYXNzcGhyYXNlIGZvciB0aGUgZ3JvdXAgKEdPIG9ubHkpCiAJICovCiAJY2hhciBwYXNzcGhyYXNlWzY0XTsKQEAgLTIyNyw2ICsyMzcsNyBAQAogCVAyUF9QUk9WX0RJU0NfU1VDQ0VTUywKIAlQMlBfUFJPVl9ESVNDX1RJTUVPVVQsCiAJUDJQX1BST1ZfRElTQ19SRUpFQ1RFRCwKKwlQMlBfUFJPVl9ESVNDX1RJTUVPVVRfSk9JTiwKIH07CiAKIHN0cnVjdCBwMnBfY2hhbm5lbCB7CkBAIC0zNTksNiArMzcwLDExIEBACiAJICovCiAJc2l6ZV90IHNzaWRfcG9zdGZpeF9sZW47CiAKKwkvKioKKwkgKiBtYXhfbGlzdGVuIC0gTWF4aW11bSBsaXN0ZW4gZHVyYXRpb24gaW4gbXMKKwkgKi8KKwl1bnNpZ25lZCBpbnQgbWF4X2xpc3RlbjsKKwogI2lmZGVmIEFORFJPSURfUDJQCiAJZW51bSBwMnBfY29uY3VycmVuY3lfdHlwZSB7CiAJCVAyUF9OT05fQ09OQ1VSUkVOVCwKQEAgLTkwMiw2ICs5MTgsOCBAQAogICogQHBkX2JlZm9yZV9nb19uZWc6IFdoZXRoZXIgdG8gc2VuZCBQcm92aXNpb24gRGlzY292ZXJ5IHByaW9yIHRvIEdPCiAgKglOZWdvdGlhdGlvbiBhcyBhbiBpbnRlcm9wZXJhYmlsaXR5IHdvcmthcm91bmQgd2hlbiBpbml0aWF0aW5nIGdyb3VwCiAgKglmb3JtYXRpb24KKyAqIEBwcmVmX2ZyZXE6IFByZWZlcnJlZCBvcGVyYXRpbmcgZnJlcXVlbmN5IGluIE1IeiBvciAwICh0aGlzIGlzIG9ubHkgdXNlZCBpZgorICoJZm9yY2VfZnJlcSA9PSAwKQogICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCiAgKi8KIGludCBwMnBfY29ubmVjdChzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgY29uc3QgdTggKnBlZXJfYWRkciwKQEAgLTkwOSw3ICs5MjcsNyBAQAogCQlpbnQgZ29faW50ZW50LCBjb25zdCB1OCAqb3duX2ludGVyZmFjZV9hZGRyLAogCQl1bnNpZ25lZCBpbnQgZm9yY2VfZnJlcSwgaW50IHBlcnNpc3RlbnRfZ3JvdXAsCiAJCWNvbnN0IHU4ICpmb3JjZV9zc2lkLCBzaXplX3QgZm9yY2Vfc3NpZF9sZW4sCi0JCWludCBwZF9iZWZvcmVfZ29fbmVnKTsKKwkJaW50IHBkX2JlZm9yZV9nb19uZWcsIHVuc2lnbmVkIGludCBwcmVmX2ZyZXEpOwogCiAvKioKICAqIHAycF9hdXRob3JpemUgLSBBdXRob3JpemUgUDJQIGdyb3VwIGZvcm1hdGlvbiAoR08gbmVnb3RpYXRpb24pCkBAIC05MjUsNiArOTQzLDggQEAKICAqIEBmb3JjZV9zc2lkOiBGb3JjZWQgU1NJRCBmb3IgdGhlIGdyb3VwIGlmIHdlIGJlY29tZSBHTyBvciAlTlVMTCB0byBnZW5lcmF0ZQogICoJYSBuZXcgU1NJRAogICogQGZvcmNlX3NzaWRfbGVuOiBMZW5ndGggb2YgJGZvcmNlX3NzaWQgYnVmZmVyCisgKiBAcHJlZl9mcmVxOiBQcmVmZXJyZWQgb3BlcmF0aW5nIGZyZXF1ZW5jeSBpbiBNSHogb3IgMCAodGhpcyBpcyBvbmx5IHVzZWQgaWYKKyAqCWZvcmNlX2ZyZXEgPT0gMCkKICAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQogICoKICAqIFRoaXMgaXMgbGlrZSBwMnBfY29ubmVjdCgpLCBidXQgdGhlIGFjdHVhbCBncm91cCBuZWdvdGlhdGlvbiBpcyBub3QKQEAgLTkzNCw3ICs5NTQsOCBAQAogCQkgIGVudW0gcDJwX3dwc19tZXRob2Qgd3BzX21ldGhvZCwKIAkJICBpbnQgZ29faW50ZW50LCBjb25zdCB1OCAqb3duX2ludGVyZmFjZV9hZGRyLAogCQkgIHVuc2lnbmVkIGludCBmb3JjZV9mcmVxLCBpbnQgcGVyc2lzdGVudF9ncm91cCwKLQkJICBjb25zdCB1OCAqZm9yY2Vfc3NpZCwgc2l6ZV90IGZvcmNlX3NzaWRfbGVuKTsKKwkJICBjb25zdCB1OCAqZm9yY2Vfc3NpZCwgc2l6ZV90IGZvcmNlX3NzaWRfbGVuLAorCQkgIHVuc2lnbmVkIGludCBwcmVmX2ZyZXEpOwogCiAvKioKICAqIHAycF9yZWplY3QgLSBSZWplY3QgcGVlciBkZXZpY2UgKGV4cGxpY2l0bHkgYmxvY2sgY29ubmVjdGlvbiBhdHRlbXB0cykKQEAgLTk1MSw2ICs5NzIsNyBAQAogICogQGNvbmZpZ19tZXRob2RzOiBXUFMgQ29uZmlnIE1ldGhvZHMgdmFsdWUgKG9ubHkgb25lIGJpdCBzZXQpCiAgKiBAam9pbjogV2hldGhlciB0aGlzIGlzIHVzZWQgYnkgYSBjbGllbnQgam9pbmluZyBhbiBhY3RpdmUgZ3JvdXAKICAqIEBmb3JjZV9mcmVxOiBGb3JjZWQgVFggZnJlcXVlbmN5IGZvciB0aGUgZnJhbWUgKG1haW5seSBmb3IgdGhlIGpvaW4gY2FzZSkKKyAqIEB1c2VyX2luaXRpYXRlZF9wZDogRmxhZyB0byBpbmRpY2F0ZSBpZiBpbml0aWF0ZWQgYnkgdXNlciBvciBub3QKICAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQogICoKICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBhIGRpc2NvdmVyZWQgUDJQIHBlZXIgdG8gZGlzcGxheSBhIFBJTgpAQCAtOTYyLDcgKzk4NCw4IEBACiAgKiBpbmRpY2F0ZWQgd2l0aCB0aGUgcDJwX2NvbmZpZzo6cHJvdl9kaXNjX3Jlc3AoKSBjYWxsYmFjay4KICAqLwogaW50IHAycF9wcm92X2Rpc2NfcmVxKHN0cnVjdCBwMnBfZGF0YSAqcDJwLCBjb25zdCB1OCAqcGVlcl9hZGRyLAotCQkgICAgICB1MTYgY29uZmlnX21ldGhvZHMsIGludCBqb2luLCBpbnQgZm9yY2VfZnJlcSk7CisJCSAgICAgIHUxNiBjb25maWdfbWV0aG9kcywgaW50IGpvaW4sIGludCBmb3JjZV9mcmVxLAorCQkgICAgICBpbnQgdXNlcl9pbml0aWF0ZWRfcGQpOwogCiAvKioKICAqIHAycF9zZF9yZXF1ZXN0IC0gU2NoZWR1bGUgYSBzZXJ2aWNlIGRpc2NvdmVyeSBxdWVyeQpAQCAtMTE3Nyw2ICsxMjAwLDcgQEAKICAqIEBwMnA6IFAyUCBtb2R1bGUgY29udGV4dCBmcm9tIHAycF9pbml0KCkKICAqIEBic3NpZDogQlNTSUQgb2YgdGhlIHNjYW4gcmVzdWx0CiAgKiBAZnJlcTogRnJlcXVlbmN5IG9mIHRoZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBkZXZpY2Ugd2FzIGZvdW5kIGluIE1IegorICogQHJ4X3RpbWU6IFRpbWUgd2hlbiB0aGUgcmVzdWx0IHdhcyByZWNlaXZlZAogICogQGxldmVsOiBTaWduYWwgbGV2ZWwgKHNpZ25hbCBzdHJlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgQmVhY29uL1Byb2JlIFJlc3BvbnNlCiAgKglmcmFtZSkKICAqIEBpZXM6IFBvaW50ZXIgdG8gSUVzIGZyb20gdGhlIHNjYW4gcmVzdWx0CkBAIC0xMTk4LDcgKzEyMjIsOCBAQAogICogc3RhcnQgb2YgYSBwZW5kaW5nIG9wZXJhdGlvbiwgZS5nLiwgdG8gc3RhcnQgYSBwZW5kaW5nIEdPIG5lZ290aWF0aW9uLgogICovCiBpbnQgcDJwX3NjYW5fcmVzX2hhbmRsZXIoc3RydWN0IHAycF9kYXRhICpwMnAsIGNvbnN0IHU4ICpic3NpZCwgaW50IGZyZXEsCi0JCQkgaW50IGxldmVsLCBjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVzX2xlbik7CisJCQkgc3RydWN0IG9zX3RpbWUgKnJ4X3RpbWUsIGludCBsZXZlbCwgY29uc3QgdTggKmllcywKKwkJCSBzaXplX3QgaWVzX2xlbik7CiAKIC8qKgogICogcDJwX3NjYW5fcmVzX2hhbmRsZWQgLSBJbmRpY2F0ZSBlbmQgb2Ygc2NhbiByZXN1bHRzCkBAIC0xNzY3LDQgKzE3OTIsMjUgQEAKIAkJCQkgIGNvbnN0IHN0cnVjdCB3cGFidWYgKmVsZW0pOwogc3RydWN0IHdwYWJ1ZiAqIHdpZmlfZGlzcGxheV9lbmNhcHMoc3RydWN0IHdwYWJ1ZiAqc3ViZWxlbXMpOwogCisvKioKKyAqIHAycF9zZXRfZGlzY19pbnQgLSBTZXQgbWluL21heCBkaXNjb3ZlcmFibGUgaW50ZXJ2YWwgZm9yIHAycF9maW5kCisgKiBAcDJwOiBQMlAgbW9kdWxlIGNvbnRleHQgZnJvbSBwMnBfaW5pdCgpCisgKiBAbWluX2Rpc2NfaW50OiBtaW5EaXNjb3ZlcmFibGVJbnRlcnZhbCAoaW4gdW5pdHMgb2YgMTAwIFRVKTsgZGVmYXVsdCAxCisgKiBAbWF4X2Rpc2NfaW50OiBtYXhEaXNjb3ZlcmFibGVJbnRlcnZhbCAoaW4gdW5pdHMgb2YgMTAwIFRVKTsgZGVmYXVsdCAzCisgKiBAbWF4X2Rpc2NfdHU6IE1heGltdW0gbnVtYmVyIG9mIFRVcyAoMS4wMjQgbXMpIGZvciBkaXNjb3ZlcmFibGUgaW50ZXJ2YWw7IG9yCisgKgktMSBub3QgdG8gbGltaXQKKyAqIFJldHVybnM6IDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIG1pbkRpc2NvdmVyYWJsZUludGVydmFsIGFuZAorICogbWF4RGlzY292ZXJhYmxlSW50ZXJ2YWwgcGFyYW1ldGVycyBmb3IgdGhlIExpc3RlbiBzdGF0ZSBkdXJpbmcgZGV2aWNlCisgKiBkaXNjb3ZlcnkgKHAycF9maW5kKS4gQSByYW5kb20gbnVtYmVyIG9mIDEwMCBUVSB1bml0cyBpcyBwaWNrZWQgZm9yIGVhY2gKKyAqIExpc3RlbiBzdGF0ZSBpdGVyYXRpb24gZnJvbSBbbWluX2Rpc2NfaW50LG1heF9kaXNjX2ludF0gcmFuZ2UuCisgKgorICogbWF4X2Rpc2NfdHUgY2FuIGJlIHVzZWQgdG8gZnV0aGVyIGxpbWl0IHRoZSBkaXNjb3ZlcmFibGUgZHVyYXRpb24uIEhvd2V2ZXIsCisgKiBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB1c2Ugb2YgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHJlY29tbWVuZGVkIHNpbmNlIGl0CisgKiB3b3VsZCBub3QgYmUgY29tcGxpYW50IHdpdGggdGhlIFAyUCBzcGVjaWZpY2F0aW9uLgorICovCitpbnQgcDJwX3NldF9kaXNjX2ludChzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgaW50IG1pbl9kaXNjX2ludCwgaW50IG1heF9kaXNjX2ludCwKKwkJICAgICBpbnQgbWF4X2Rpc2NfdHUpOworCiAjZW5kaWYgLyogUDJQX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9wMnAvcDJwX2J1aWxkLmMgYi9zcmMvcDJwL3AycF9idWlsZC5jCmluZGV4IGJlMDY5YTUuLjU4MzhkMzUgMTAwNjQ0Ci0tLSBhL3NyYy9wMnAvcDJwX2J1aWxkLmMKKysrIGIvc3JjL3AycC9wMnBfYnVpbGQuYwpAQCAtMTM2LDYgKzEzNiw3IEBACiAJCSAgICBsZW4gKyAyLCAodTggKikgd3BhYnVmX3B1dChidWYsIDApIC0gbGVuIC0gMik7CiB9CiAKKwogdm9pZCBwMnBfYnVmX2FkZF9zdGF0dXMoc3RydWN0IHdwYWJ1ZiAqYnVmLCB1OCBzdGF0dXMpCiB7CiAJLyogU3RhdHVzICovCmRpZmYgLS1naXQgYS9zcmMvcDJwL3AycF9nb19uZWcuYyBiL3NyYy9wMnAvcDJwX2dvX25lZy5jCmluZGV4IGIyMWQ5N2MuLmJjMjdlNmUgMTAwNjQ0Ci0tLSBhL3NyYy9wMnAvcDJwX2dvX25lZy5jCisrKyBiL3NyYy9wMnAvcDJwX2dvX25lZy5jCkBAIC0xNDUsOSArMTQ1LDYgQEAKIAlpZiAoYnVmID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JcGVlci0+ZGlhbG9nX3Rva2VuKys7Ci0JaWYgKHBlZXItPmRpYWxvZ190b2tlbiA9PSAwKQotCQlwZWVyLT5kaWFsb2dfdG9rZW4gPSAxOwogCXAycF9idWZfYWRkX3B1YmxpY19hY3Rpb25faGRyKGJ1ZiwgUDJQX0dPX05FR19SRVEsIHBlZXItPmRpYWxvZ190b2tlbik7CiAKIAlsZW4gPSBwMnBfYnVmX2FkZF9pZV9oZHIoYnVmKTsKQEAgLTE2NCw5ICsxNjEsNyBAQAogCXAycF9idWZfYWRkX2NhcGFiaWxpdHkoYnVmLCBwMnAtPmRldl9jYXBhYiAmCiAJCQkgICAgICAgflAyUF9ERVZfQ0FQQUJfQ0xJRU5UX0RJU0NPVkVSQUJJTElUWSwKIAkJCSAgICAgICBncm91cF9jYXBhYik7Ci0JcDJwX2J1Zl9hZGRfZ29faW50ZW50KGJ1ZiwgKHAycC0+Z29faW50ZW50IDw8IDEpIHwKLQkJCSAgICAgIHAycC0+bmV4dF90aWVfYnJlYWtlcik7Ci0JcDJwLT5uZXh0X3RpZV9icmVha2VyID0gIXAycC0+bmV4dF90aWVfYnJlYWtlcjsKKwlwMnBfYnVmX2FkZF9nb19pbnRlbnQoYnVmLCAocDJwLT5nb19pbnRlbnQgPDwgMSkgfCBwZWVyLT50aWVfYnJlYWtlcik7CiAJcDJwX2J1Zl9hZGRfY29uZmlnX3RpbWVvdXQoYnVmLCBwMnAtPmdvX3RpbWVvdXQsIHAycC0+Y2xpZW50X3RpbWVvdXQpOwogCXAycF9idWZfYWRkX2xpc3Rlbl9jaGFubmVsKGJ1ZiwgcDJwLT5jZmctPmNvdW50cnksIHAycC0+Y2ZnLT5yZWdfY2xhc3MsCiAJCQkJICAgcDJwLT5jZmctPmNoYW5uZWwpOwpAQCAtMjExLDcgKzIwNiw3IEBACiAJCWVsc2UKIAkJCXJldHVybiAtMTsKIAkJcmV0dXJuIHAycF9wcm92X2Rpc2NfcmVxKHAycCwgZGV2LT5pbmZvLnAycF9kZXZpY2VfYWRkciwKLQkJCQkJIGNvbmZpZ19tZXRob2QsIDAsIDApOworCQkJCQkgY29uZmlnX21ldGhvZCwgMCwgMCwgMSk7CiAJfQogCiAJZnJlcSA9IGRldi0+bGlzdGVuX2ZyZXEgPiAwID8gZGV2LT5saXN0ZW5fZnJlcSA6IGRldi0+b3Blcl9mcmVxOwpAQCAtMzAyLDcgKzI5Nyw2IEBACiAJCQkJCSAgICAgIHAycC0+b3BfY2hhbm5lbCk7CiAJfQogCXAycF9idWZfYWRkX2ludGVuZGVkX2FkZHIoYnVmLCBwMnAtPmludGVuZGVkX2FkZHIpOwotCiAJaWYgKHN0YXR1cyB8fCBwZWVyID09IE5VTEwpIHsKIAkJcDJwX2J1Zl9hZGRfY2hhbm5lbF9saXN0KGJ1ZiwgcDJwLT5jZmctPmNvdW50cnksCiAJCQkJCSAmcDJwLT5jaGFubmVscyk7CkBAIC0zMTUsNyArMzA5LDYgQEAKIAkJCQkgICAgICAgJnJlcyk7CiAJCXAycF9idWZfYWRkX2NoYW5uZWxfbGlzdChidWYsIHAycC0+Y2ZnLT5jb3VudHJ5LCAmcmVzKTsKIAl9Ci0KIAlwMnBfYnVmX2FkZF9kZXZpY2VfaW5mbyhidWYsIHAycCwgcGVlcik7CiAJaWYgKHBlZXIgJiYgcGVlci0+Z29fc3RhdGUgPT0gTE9DQUxfR08pIHsKIAkJcDJwX2J1Zl9hZGRfZ3JvdXBfaWQoYnVmLCBwMnAtPmNmZy0+ZGV2X2FkZHIsIHAycC0+c3NpZCwKQEAgLTMzOCw2ICszMzEsMTcgQEAKIH0KIAogCisvKioKKyAqIHAycF9yZXNlbGVjdF9jaGFubmVsIC0gUmUtc2VsZWN0IG9wZXJhdGluZyBjaGFubmVsIGJhc2VkIG9uIHBlZXIgaW5mb3JtYXRpb24KKyAqIEBwMnA6IFAyUCBtb2R1bGUgY29udGV4dCBmcm9tIHAycF9pbml0KCkKKyAqIEBpbnRlcnNlY3Rpb246IFN1cHBvcnQgY2hhbm5lbCBsaXN0IGludGVyc2VjdGlvbiBmcm9tIGxvY2FsIGFuZCBwZWVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlLXNlbGVjdCB0aGUgYmVzdCBjaGFubmVsIGFmdGVyIGhhdmluZyByZWNlaXZlZAorICogaW5mb3JtYXRpb24gZnJvbSB0aGUgcGVlciB0byBhbGxvdyBzdXBwb3J0ZWQgY2hhbm5lbCBsaXN0cyB0byBiZSBpbnRlcnNlY3RlZC4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSBpbml0aWFsIGNoYW5uZWwgc2VsZWN0aW9uIGRvbmUgaW4KKyAqIHAycF9wcmVwYXJlX2NoYW5uZWwoKSBwcmlvciB0byB0aGUgc3RhcnQgb2YgR08gTmVnb3RpYXRpb24uIEluIGFkZGl0aW9uLCB0aGlzCisgKiBjYW4gYmUgdXNlZCBmb3IgSW52aXRhdGlvbiBjYXNlLgorICovCiB2b2lkIHAycF9yZXNlbGVjdF9jaGFubmVsKHN0cnVjdCBwMnBfZGF0YSAqcDJwLAogCQkJICBzdHJ1Y3QgcDJwX2NoYW5uZWxzICppbnRlcnNlY3Rpb24pCiB7CkBAIC0zOTIsNiArMzk2LDM1IEBACiAJCX0KIAl9CiAKKwkvKiBUcnkgYSBjaGFubmVsIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gdXNlIEhUNDAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW50ZXJzZWN0aW9uLT5yZWdfY2xhc3NlczsgaSsrKSB7CisJCXN0cnVjdCBwMnBfcmVnX2NsYXNzICpjID0gJmludGVyc2VjdGlvbi0+cmVnX2NsYXNzW2ldOworCQlpZiAoYy0+cmVnX2NsYXNzID09IDExNiB8fCBjLT5yZWdfY2xhc3MgPT0gMTE3IHx8CisJCSAgICBjLT5yZWdfY2xhc3MgPT0gMTI2IHx8IGMtPnJlZ19jbGFzcyA9PSAxMjcpIHsKKwkJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKKwkJCQkiUDJQOiBQaWNrIHBvc3NpYmxlIEhUNDAgY2hhbm5lbCAocmVnX2NsYXNzICIKKwkJCQkiJXUgY2hhbm5lbCAldSkgZnJvbSBpbnRlcnNlY3Rpb24iLAorCQkJCWMtPnJlZ19jbGFzcywgYy0+Y2hhbm5lbFswXSk7CisJCQlwMnAtPm9wX3JlZ19jbGFzcyA9IGMtPnJlZ19jbGFzczsKKwkJCXAycC0+b3BfY2hhbm5lbCA9IGMtPmNoYW5uZWxbMF07CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIFRyeSB0byBzZWUgaWYgdGhlIG9yaWdpbmFsIGNoYW5uZWwgaXMgaW4gdGhlIGludGVyc2VjdGlvbi4gSWYKKwkgKiBzbywgbm8gbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcsIGFzIGl0IGFscmVhZHkgY29udGFpbnMgc29tZQorCSAqIHJhbmRvbW5lc3MuCisJICovCisJaWYgKHAycF9jaGFubmVsc19pbmNsdWRlcyhpbnRlcnNlY3Rpb24sIHAycC0+b3BfcmVnX2NsYXNzLAorCQkJCSAgcDJwLT5vcF9jaGFubmVsKSkgeworCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCisJCQkiUDJQOiBVc2luZyBvcmlnaW5hbCBvcGVyYXRpbmcgY2xhc3MgYW5kIGNoYW5uZWwgIgorCQkJIihvcF9jbGFzcyAldSBjaGFubmVsICV1KSBmcm9tIGludGVyc2VjdGlvbiIsCisJCQlwMnAtPm9wX3JlZ19jbGFzcywgcDJwLT5vcF9jaGFubmVsKTsKKwkJcmV0dXJuOworCX0KKwogCS8qCiAJICogRmFsbCBiYWNrIHRvIHdoYXRldmVyIGlzIGluY2x1ZGVkIGluIHRoZSBjaGFubmVsIGludGVyc2VjdGlvbiBzaW5jZQogCSAqIG5vIGJldHRlciBvcHRpb25zIHNlZW1zIHRvIGJlIGF2YWlsYWJsZS4KQEAgLTQwNSw2ICs0MzgsNjAgQEAKIH0KIAogCitzdGF0aWMgaW50IHAycF9nb19zZWxlY3RfY2hhbm5lbChzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgc3RydWN0IHAycF9kZXZpY2UgKmRldiwKKwkJCQkgdTggKnN0YXR1cykKK3sKKwlzdHJ1Y3QgcDJwX2NoYW5uZWxzIGludGVyc2VjdGlvbjsKKwlzaXplX3QgaTsKKworCXAycF9jaGFubmVsc19pbnRlcnNlY3QoJnAycC0+Y2hhbm5lbHMsICZkZXYtPmNoYW5uZWxzLCAmaW50ZXJzZWN0aW9uKTsKKwlpZiAoaW50ZXJzZWN0aW9uLnJlZ19jbGFzc2VzID09IDAgfHwKKwkgICAgaW50ZXJzZWN0aW9uLnJlZ19jbGFzc1swXS5jaGFubmVscyA9PSAwKSB7CisJCSpzdGF0dXMgPSBQMlBfU0NfRkFJTF9OT19DT01NT05fQ0hBTk5FTFM7CisJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKKwkJCSJQMlA6IE5vIGNvbW1vbiBjaGFubmVscyBmb3VuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGludGVyc2VjdGlvbi5yZWdfY2xhc3NlczsgaSsrKSB7CisJCXN0cnVjdCBwMnBfcmVnX2NsYXNzICpjOworCQljID0gJmludGVyc2VjdGlvbi5yZWdfY2xhc3NbaV07CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiByZWdfY2xhc3MgJXUiLCBjLT5yZWdfY2xhc3MpOworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJQMlA6IGNoYW5uZWxzIiwKKwkJCSAgICBjLT5jaGFubmVsLCBjLT5jaGFubmVscyk7CisJfQorCisJaWYgKCFwMnBfY2hhbm5lbHNfaW5jbHVkZXMoJmludGVyc2VjdGlvbiwgcDJwLT5vcF9yZWdfY2xhc3MsCisJCQkJICAgcDJwLT5vcF9jaGFubmVsKSkgeworCQlpZiAoZGV2LT5mbGFncyAmIFAyUF9ERVZfRk9SQ0VfRlJFUSkgeworCQkJKnN0YXR1cyA9IFAyUF9TQ19GQUlMX05PX0NPTU1PTl9DSEFOTkVMUzsKKwkJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlAyUDogUGVlciBkb2VzICIKKwkJCQkibm90IHN1cHBvcnQgdGhlIGZvcmNlZCBjaGFubmVsIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsICJQMlA6IFNlbGVjdGVkIG9wZXJhdGluZyAiCisJCQkiY2hhbm5lbCAob3BfY2xhc3MgJXUgY2hhbm5lbCAldSkgbm90IGFjY2VwdGFibGUgdG8gIgorCQkJInRoZSBwZWVyIiwgcDJwLT5vcF9yZWdfY2xhc3MsIHAycC0+b3BfY2hhbm5lbCk7CisJCXAycF9yZXNlbGVjdF9jaGFubmVsKHAycCwgJmludGVyc2VjdGlvbik7CisJfSBlbHNlIGlmICghKGRldi0+ZmxhZ3MgJiBQMlBfREVWX0ZPUkNFX0ZSRVEpICYmCisJCSAgICFwMnAtPmNmZy0+Y2ZnX29wX2NoYW5uZWwpIHsKKwkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLCAiUDJQOiBUcnkgdG8gb3B0aW1pemUgIgorCQkJImNoYW5uZWwgc2VsZWN0aW9uIHdpdGggcGVlciBpbmZvcm1hdGlvbiByZWNlaXZlZDsgIgorCQkJInByZXZpb3VzbHkgc2VsZWN0ZWQgb3BfY2xhc3MgJXUgY2hhbm5lbCAldSIsCisJCQlwMnAtPm9wX3JlZ19jbGFzcywgcDJwLT5vcF9jaGFubmVsKTsKKwkJcDJwX3Jlc2VsZWN0X2NoYW5uZWwocDJwLCAmaW50ZXJzZWN0aW9uKTsKKwl9CisKKwlpZiAoIXAycC0+c3NpZF9zZXQpIHsKKwkJcDJwX2J1aWxkX3NzaWQocDJwLCBwMnAtPnNzaWQsICZwMnAtPnNzaWRfbGVuKTsKKwkJcDJwLT5zc2lkX3NldCA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwogdm9pZCBwMnBfcHJvY2Vzc19nb19uZWdfcmVxKHN0cnVjdCBwMnBfZGF0YSAqcDJwLCBjb25zdCB1OCAqc2EsCiAJCQkgICAgY29uc3QgdTggKmRhdGEsIHNpemVfdCBsZW4sIGludCByeF9mcmVxKQogewpAQCAtNjIxLDM2ICs3MDgsOCBAQAogCQkJZ290byBmYWlsOwogCQl9CiAKLQkJaWYgKGdvKSB7Ci0JCQlzdHJ1Y3QgcDJwX2NoYW5uZWxzIGludGVyc2VjdGlvbjsKLQkJCXNpemVfdCBpOwotCQkJcDJwX2NoYW5uZWxzX2ludGVyc2VjdCgmcDJwLT5jaGFubmVscywgJmRldi0+Y2hhbm5lbHMsCi0JCQkJCSAgICAgICAmaW50ZXJzZWN0aW9uKTsKLQkJCWlmIChpbnRlcnNlY3Rpb24ucmVnX2NsYXNzZXMgPT0gMCB8fAotCQkJICAgIGludGVyc2VjdGlvbi5yZWdfY2xhc3NbMF0uY2hhbm5lbHMgPT0gMCkgewotCQkJCXN0YXR1cyA9IFAyUF9TQ19GQUlMX05PX0NPTU1PTl9DSEFOTkVMUzsKLQkJCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCi0JCQkJCSJQMlA6IE5vIGNvbW1vbiBjaGFubmVscyBmb3VuZCIpOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCWZvciAoaSA9IDA7IGkgPCBpbnRlcnNlY3Rpb24ucmVnX2NsYXNzZXM7IGkrKykgewotCQkJCXN0cnVjdCBwMnBfcmVnX2NsYXNzICpjOwotCQkJCWMgPSAmaW50ZXJzZWN0aW9uLnJlZ19jbGFzc1tpXTsKLQkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogcmVnX2NsYXNzICV1IiwKLQkJCQkJICAgYy0+cmVnX2NsYXNzKTsKLQkJCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJQMlA6IGNoYW5uZWxzIiwKLQkJCQkJICAgIGMtPmNoYW5uZWwsIGMtPmNoYW5uZWxzKTsKLQkJCX0KLQkJCWlmICghcDJwX2NoYW5uZWxzX2luY2x1ZGVzKCZpbnRlcnNlY3Rpb24sCi0JCQkJCQkgICBwMnAtPm9wX3JlZ19jbGFzcywKLQkJCQkJCSAgIHAycC0+b3BfY2hhbm5lbCkpCi0JCQkJcDJwX3Jlc2VsZWN0X2NoYW5uZWwocDJwLCAmaW50ZXJzZWN0aW9uKTsKLQotCQkJaWYgKCFwMnAtPnNzaWRfc2V0KSB7Ci0JCQkJcDJwX2J1aWxkX3NzaWQocDJwLCBwMnAtPnNzaWQsICZwMnAtPnNzaWRfbGVuKTsKLQkJCQlwMnAtPnNzaWRfc2V0ID0gMTsKLQkJCX0KLQkJfQorCQlpZiAoZ28gJiYgcDJwX2dvX3NlbGVjdF9jaGFubmVsKHAycCwgZGV2LCAmc3RhdHVzKSA8IDApCisJCQlnb3RvIGZhaWw7CiAKIAkJZGV2LT5nb19zdGF0ZSA9IGdvID8gTE9DQUxfR08gOiBSRU1PVEVfR087CiAJCWRldi0+b3Blcl9mcmVxID0gcDJwX2NoYW5uZWxfdG9fZnJlcSgoY29uc3QgY2hhciAqKQpAQCAtOTI0LDEwICs5ODMsOCBAQAogCQkJIlAyUDogTWFuZGF0b3J5IFAyUCBHcm91cCBJRCBhdHRyaWJ1dGUgbWlzc2luZyBmcm9tICIKIAkJCSJHTyBOZWdvdGlhdGlvbiBSZXNwb25zZSIpOwogCQlwMnAtPnNzaWRfbGVuID0gMDsKLSNpZmRlZiBDT05GSUdfUDJQX1NUUklDVAogCQlzdGF0dXMgPSBQMlBfU0NfRkFJTF9JTlZBTElEX1BBUkFNUzsKIAkJZ290byBmYWlsOwotI2VuZGlmIC8qIENPTkZJR19QMlBfU1RSSUNUICovCiAJfQogCiAJaWYgKCFtc2cuY29uZmlnX3RpbWVvdXQpIHsKQEAgLTEwMjMsMzUgKzEwODAsOCBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKGdvKSB7Ci0JCXN0cnVjdCBwMnBfY2hhbm5lbHMgaW50ZXJzZWN0aW9uOwotCQlzaXplX3QgaTsKLQkJcDJwX2NoYW5uZWxzX2ludGVyc2VjdCgmcDJwLT5jaGFubmVscywgJmRldi0+Y2hhbm5lbHMsCi0JCQkJICAgICAgICZpbnRlcnNlY3Rpb24pOwotCQlpZiAoaW50ZXJzZWN0aW9uLnJlZ19jbGFzc2VzID09IDAgfHwKLQkJICAgIGludGVyc2VjdGlvbi5yZWdfY2xhc3NbMF0uY2hhbm5lbHMgPT0gMCkgewotCQkJc3RhdHVzID0gUDJQX1NDX0ZBSUxfTk9fQ09NTU9OX0NIQU5ORUxTOwotCQkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAotCQkJCSJQMlA6IE5vIGNvbW1vbiBjaGFubmVscyBmb3VuZCIpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBpbnRlcnNlY3Rpb24ucmVnX2NsYXNzZXM7IGkrKykgewotCQkJc3RydWN0IHAycF9yZWdfY2xhc3MgKmM7Ci0JCQljID0gJmludGVyc2VjdGlvbi5yZWdfY2xhc3NbaV07Ci0JCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogcmVnX2NsYXNzICV1IiwKLQkJCQkgICBjLT5yZWdfY2xhc3MpOwotCQkJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiUDJQOiBjaGFubmVscyIsCi0JCQkJICAgIGMtPmNoYW5uZWwsIGMtPmNoYW5uZWxzKTsKLQkJfQotCQlpZiAoIXAycF9jaGFubmVsc19pbmNsdWRlcygmaW50ZXJzZWN0aW9uLCBwMnAtPm9wX3JlZ19jbGFzcywKLQkJCQkJICAgcDJwLT5vcF9jaGFubmVsKSkKLQkJCXAycF9yZXNlbGVjdF9jaGFubmVsKHAycCwgJmludGVyc2VjdGlvbik7Ci0KLQkJaWYgKCFwMnAtPnNzaWRfc2V0KSB7Ci0JCQlwMnBfYnVpbGRfc3NpZChwMnAsIHAycC0+c3NpZCwgJnAycC0+c3NpZF9sZW4pOwotCQkJcDJwLT5zc2lkX3NldCA9IDE7Ci0JCX0KLQl9CisJaWYgKGdvICYmIHAycF9nb19zZWxlY3RfY2hhbm5lbChwMnAsIGRldiwgJnN0YXR1cykgPCAwKQorCQlnb3RvIGZhaWw7CiAKIAlwMnBfc2V0X3N0YXRlKHAycCwgUDJQX0dPX05FRyk7CiAJcDJwX2NsZWFyX3RpbWVvdXQocDJwKTsKQEAgLTEwODQsNiArMTExNCwxMSBAQAogCQlwMnBfZ29fbmVnX2ZhaWxlZChwMnAsIGRldiwgLTEpOwogCX0KIAl3cGFidWZfZnJlZShjb25mKTsKKwlpZiAoc3RhdHVzICE9IFAyUF9TQ19TVUNDRVNTKSB7CisJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKKwkJCSJQMlA6IEdPIE5lZ290aWF0aW9uIGZhaWxlZCIpOworCQlwMnBfZ29fbmVnX2ZhaWxlZChwMnAsIGRldiwgc3RhdHVzKTsKKwl9CiB9CiAKIApAQCAtMTE0MSw2ICsxMTc2LDcgQEAKIAkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAogCQkJIlAyUDogR08gTmVnb3RpYXRpb24gcmVqZWN0ZWQ6IHN0YXR1cyAlZCIsCiAJCQkqbXNnLnN0YXR1cyk7CisJCXAycF9nb19uZWdfZmFpbGVkKHAycCwgZGV2LCAqbXNnLnN0YXR1cyk7CiAJCXAycF9wYXJzZV9mcmVlKCZtc2cpOwogCQlyZXR1cm47CiAJfQpAQCAtMTE1NCwxMCArMTE5MCw5IEBACiAJCQkiUDJQOiBNYW5kYXRvcnkgUDJQIEdyb3VwIElEIGF0dHJpYnV0ZSBtaXNzaW5nIGZyb20gIgogCQkJIkdPIE5lZ290aWF0aW9uIENvbmZpcm1hdGlvbiIpOwogCQlwMnAtPnNzaWRfbGVuID0gMDsKLSNpZmRlZiBDT05GSUdfUDJQX1NUUklDVAorCQlwMnBfZ29fbmVnX2ZhaWxlZChwMnAsIGRldiwgUDJQX1NDX0ZBSUxfSU5WQUxJRF9QQVJBTVMpOwogCQlwMnBfcGFyc2VfZnJlZSgmbXNnKTsKIAkJcmV0dXJuOwotI2VuZGlmIC8qIENPTkZJR19QMlBfU1RSSUNUICovCiAJfQogCiAJaWYgKCFtc2cub3BlcmF0aW5nX2NoYW5uZWwpIHsKZGlmZiAtLWdpdCBhL3NyYy9wMnAvcDJwX2dyb3VwLmMgYi9zcmMvcDJwL3AycF9ncm91cC5jCmluZGV4IDg2ODczMjAuLjk1NTllNDQgMTAwNjQ0Ci0tLSBhL3NyYy9wMnAvcDJwX2dyb3VwLmMKKysrIGIvc3JjL3AycC9wMnBfZ3JvdXAuYwpAQCAtMTY5LDYgKzE2OSwzOSBAQAogfQogCiAKK3N0YXRpYyBzdHJ1Y3Qgd3BhYnVmICogcDJwX2dyb3VwX2VuY2Fwc19wcm9iZV9yZXNwKHN0cnVjdCB3cGFidWYgKnN1YmVsZW1zKQoreworCXN0cnVjdCB3cGFidWYgKmllOworCWNvbnN0IHU4ICpwb3MsICplbmQ7CisJc2l6ZV90IGxlbjsKKworCWlmIChzdWJlbGVtcyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHdwYWJ1Zl9sZW4oc3ViZWxlbXMpICsgMTAwOworCisJaWUgPSB3cGFidWZfYWxsb2MobGVuKTsKKwlpZiAoaWUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwb3MgPSB3cGFidWZfaGVhZChzdWJlbGVtcyk7CisJZW5kID0gcG9zICsgd3BhYnVmX2xlbihzdWJlbGVtcyk7CisKKwl3aGlsZSAoZW5kID4gcG9zKSB7CisJCXNpemVfdCBmcmFnX2xlbiA9IGVuZCAtIHBvczsKKwkJaWYgKGZyYWdfbGVuID4gMjUxKQorCQkJZnJhZ19sZW4gPSAyNTE7CisJCXdwYWJ1Zl9wdXRfdTgoaWUsIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQyk7CisJCXdwYWJ1Zl9wdXRfdTgoaWUsIDQgKyBmcmFnX2xlbik7CisJCXdwYWJ1Zl9wdXRfYmUzMihpZSwgUDJQX0lFX1ZFTkRPUl9UWVBFKTsKKwkJd3BhYnVmX3B1dF9kYXRhKGllLCBwb3MsIGZyYWdfbGVuKTsKKwkJcG9zICs9IGZyYWdfbGVuOworCX0KKworCXJldHVybiBpZTsKK30KKworCiBzdGF0aWMgc3RydWN0IHdwYWJ1ZiAqIHAycF9ncm91cF9idWlsZF9iZWFjb25faWUoc3RydWN0IHAycF9ncm91cCAqZ3JvdXApCiB7CiAJc3RydWN0IHdwYWJ1ZiAqaWU7CkBAIC0zNjcsNDMgKzQwMCwzNyBAQAogc3RhdGljIHN0cnVjdCB3cGFidWYgKiBwMnBfZ3JvdXBfYnVpbGRfcHJvYmVfcmVzcF9pZShzdHJ1Y3QgcDJwX2dyb3VwICpncm91cCkKIHsKIAl1OCAqZ3JvdXBfaW5mbzsKLQlzdHJ1Y3Qgd3BhYnVmICppZTsKKwlzdHJ1Y3Qgd3BhYnVmICpwMnBfc3ViZWxlbXMsICppZTsKIAlzdHJ1Y3QgcDJwX2dyb3VwX21lbWJlciAqbTsKLQl1OCAqbGVuOwotCXNpemVfdCBleHRyYSA9IDA7CiAKLSNpZmRlZiBDT05GSUdfV0lGSV9ESVNQTEFZCi0JaWYgKGdyb3VwLT53ZmRfaWUpCi0JCWV4dHJhICs9IHdwYWJ1Zl9sZW4oZ3JvdXAtPndmZF9pZSk7Ci0jZW5kaWYgLyogQ09ORklHX1dJRklfRElTUExBWSAqLwotCi0JaWUgPSB3cGFidWZfYWxsb2MoMjU3ICsgZXh0cmEpOwotCWlmIChpZSA9PSBOVUxMKQorCXAycF9zdWJlbGVtcyA9IHdwYWJ1Zl9hbGxvYyg1MDApOworCWlmIChwMnBfc3ViZWxlbXMgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLSNpZmRlZiBDT05GSUdfV0lGSV9ESVNQTEFZCi0JaWYgKGdyb3VwLT53ZmRfaWUpCi0JCXdwYWJ1Zl9wdXRfYnVmKGllLCBncm91cC0+d2ZkX2llKTsKLSNlbmRpZiAvKiBDT05GSUdfV0lGSV9ESVNQTEFZICovCi0KLQlsZW4gPSBwMnBfYnVmX2FkZF9pZV9oZHIoaWUpOwotCi0JcDJwX2dyb3VwX2FkZF9jb21tb25faWVzKGdyb3VwLCBpZSk7Ci0JcDJwX2dyb3VwX2FkZF9ub2EoaWUsIGdyb3VwLT5ub2EpOworCXAycF9ncm91cF9hZGRfY29tbW9uX2llcyhncm91cCwgcDJwX3N1YmVsZW1zKTsKKwlwMnBfZ3JvdXBfYWRkX25vYShwMnBfc3ViZWxlbXMsIGdyb3VwLT5ub2EpOwogCiAJLyogUDJQIERldmljZSBJbmZvICovCi0JcDJwX2J1Zl9hZGRfZGV2aWNlX2luZm8oaWUsIGdyb3VwLT5wMnAsIE5VTEwpOworCXAycF9idWZfYWRkX2RldmljZV9pbmZvKHAycF9zdWJlbGVtcywgZ3JvdXAtPnAycCwgTlVMTCk7CiAKIAkvKiBQMlAgR3JvdXAgSW5mbyAqLwotCWdyb3VwX2luZm8gPSB3cGFidWZfcHV0KGllLCAwKTsKLQl3cGFidWZfcHV0X3U4KGllLCBQMlBfQVRUUl9HUk9VUF9JTkZPKTsKLQl3cGFidWZfcHV0X2xlMTYoaWUsIDApOyAvKiBMZW5ndGggdG8gYmUgZmlsbGVkICovCisJZ3JvdXBfaW5mbyA9IHdwYWJ1Zl9wdXQocDJwX3N1YmVsZW1zLCAwKTsKKwl3cGFidWZfcHV0X3U4KHAycF9zdWJlbGVtcywgUDJQX0FUVFJfR1JPVVBfSU5GTyk7CisJd3BhYnVmX3B1dF9sZTE2KHAycF9zdWJlbGVtcywgMCk7IC8qIExlbmd0aCB0byBiZSBmaWxsZWQgKi8KIAlmb3IgKG0gPSBncm91cC0+bWVtYmVyczsgbTsgbSA9IG0tPm5leHQpCi0JCXAycF9jbGllbnRfaW5mbyhpZSwgbSk7CisJCXAycF9jbGllbnRfaW5mbyhwMnBfc3ViZWxlbXMsIG0pOwogCVdQQV9QVVRfTEUxNihncm91cF9pbmZvICsgMSwKLQkJICAgICAodTggKikgd3BhYnVmX3B1dChpZSwgMCkgLSBncm91cF9pbmZvIC0gMyk7CisJCSAgICAgKHU4ICopIHdwYWJ1Zl9wdXQocDJwX3N1YmVsZW1zLCAwKSAtIGdyb3VwX2luZm8gLSAzKTsKIAotCXAycF9idWZfdXBkYXRlX2llX2hkcihpZSwgbGVuKTsKKwlpZSA9IHAycF9ncm91cF9lbmNhcHNfcHJvYmVfcmVzcChwMnBfc3ViZWxlbXMpOworCXdwYWJ1Zl9mcmVlKHAycF9zdWJlbGVtcyk7CisKKyNpZmRlZiBDT05GSUdfV0lGSV9ESVNQTEFZCisJaWYgKGdyb3VwLT53ZmRfaWUpIHsKKwkJc3RydWN0IHdwYWJ1ZiAqd2ZkID0gd3BhYnVmX2R1cChncm91cC0+d2ZkX2llKTsKKwkJaWUgPSB3cGFidWZfY29uY2F0KHdmZCwgaWUpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfV0lGSV9ESVNQTEFZICovCiAKIAlyZXR1cm4gaWU7CiB9CmRpZmYgLS1naXQgYS9zcmMvcDJwL3AycF9pLmggYi9zcmMvcDJwL3AycF9pLmgKaW5kZXggNjczYzRjMS4uZDU5YThhYyAxMDA2NDQKLS0tIGEvc3JjL3AycC9wMnBfaS5oCisrKyBiL3NyYy9wMnAvcDJwX2kuaApAQCAtNTIsNiArNTIsNyBAQAogCWludCBnb19uZWdfcmVxX3NlbnQ7CiAJZW51bSBwMnBfZ29fc3RhdGUgZ29fc3RhdGU7CiAJdTggZGlhbG9nX3Rva2VuOworCXU4IHRpZV9icmVha2VyOwogCXU4IGludGVuZGVkX2FkZHJbRVRIX0FMRU5dOwogCiAJY2hhciBjb3VudHJ5WzNdOwpAQCAtMjI2LDYgKzIyNywxMSBAQAogCWludCBtYXhfZGlzY19pbnQ7CiAKIAkvKioKKwkgKiBtYXhfZGlzY190dSAtIE1heGltdW0gbnVtYmVyIG9mIFRVcyBmb3IgZGlzY292ZXJhYmxlIGludGVydmFsCisJICovCisJaW50IG1heF9kaXNjX3R1OworCisJLyoqCiAJICogZGV2aWNlcyAtIExpc3Qgb2Yga25vd24gUDJQIERldmljZSBwZWVycwogCSAqLwogCXN0cnVjdCBkbF9saXN0IGRldmljZXM7CkBAIC0zOTgsNiArNDA0LDggQEAKIAl1OCAqZmluZF9kZXZfaWQ7CiAJdTggZmluZF9kZXZfaWRfYnVmW0VUSF9BTEVOXTsKIAorCXN0cnVjdCBvc190aW1lIGZpbmRfc3RhcnQ7IC8qIHRpbWUgb2YgbGFzdCBwMnBfZmluZCBzdGFydCAqLworCiAJc3RydWN0IHAycF9ncm91cCAqKmdyb3VwczsKIAlzaXplX3QgbnVtX2dyb3VwczsKIApAQCAtNzAwLDggKzcwOCw5IEBACiAJCQkJCQlzdHJ1Y3QgcDJwX21lc3NhZ2UgKm1zZyk7CiB2b2lkIHAycF9hZGRfZGV2X2luZm8oc3RydWN0IHAycF9kYXRhICpwMnAsIGNvbnN0IHU4ICphZGRyLAogCQkgICAgICBzdHJ1Y3QgcDJwX2RldmljZSAqZGV2LCBzdHJ1Y3QgcDJwX21lc3NhZ2UgKm1zZyk7Ci1pbnQgcDJwX2FkZF9kZXZpY2Uoc3RydWN0IHAycF9kYXRhICpwMnAsIGNvbnN0IHU4ICphZGRyLCBpbnQgZnJlcSwgaW50IGxldmVsLAotCQkgICBjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVzX2xlbiwgaW50IHNjYW5fcmVzKTsKK2ludCBwMnBfYWRkX2RldmljZShzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgY29uc3QgdTggKmFkZHIsIGludCBmcmVxLAorCQkgICBzdHJ1Y3Qgb3NfdGltZSAqcnhfdGltZSwgaW50IGxldmVsLCBjb25zdCB1OCAqaWVzLAorCQkgICBzaXplX3QgaWVzX2xlbiwgaW50IHNjYW5fcmVzKTsKIHN0cnVjdCBwMnBfZGV2aWNlICogcDJwX2dldF9kZXZpY2Uoc3RydWN0IHAycF9kYXRhICpwMnAsIGNvbnN0IHU4ICphZGRyKTsKIHN0cnVjdCBwMnBfZGV2aWNlICogcDJwX2dldF9kZXZpY2VfaW50ZXJmYWNlKHN0cnVjdCBwMnBfZGF0YSAqcDJwLAogCQkJCQkgICAgIGNvbnN0IHU4ICphZGRyKTsKZGlmZiAtLWdpdCBhL3NyYy9wMnAvcDJwX2ludml0YXRpb24uYyBiL3NyYy9wMnAvcDJwX2ludml0YXRpb24uYwppbmRleCA3YmY2NjAwLi45MjgzMTEzIDEwMDY0NAotLS0gYS9zcmMvcDJwL3AycF9pbnZpdGF0aW9uLmMKKysrIGIvc3JjL3AycC9wMnBfaW52aXRhdGlvbi5jCkBAIC0xNzYsOCArMTc2LDggQEAKIAkJCSJQMlA6IEludml0YXRpb24gUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciAiCiAJCQlNQUNTVFIsIE1BQzJTVFIoc2EpKTsKIAotCQlpZiAocDJwX2FkZF9kZXZpY2UocDJwLCBzYSwgcnhfZnJlcSwgMCwgZGF0YSArIDEsIGxlbiAtIDEsIDApKQotCQl7CisJCWlmIChwMnBfYWRkX2RldmljZShwMnAsIHNhLCByeF9mcmVxLCBOVUxMLCAwLCBkYXRhICsgMSwgbGVuIC0gMSwKKwkJCQkgICAwKSkgewogCQkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAogCQkJCSJQMlA6IEludml0YXRpb24gUmVxdWVzdCBhZGQgZGV2aWNlIGZhaWxlZCAiCiAJCQkJTUFDU1RSLCBNQUMyU1RSKHNhKSk7CmRpZmYgLS1naXQgYS9zcmMvcDJwL3AycF9wZC5jIGIvc3JjL3AycC9wMnBfcGQuYwppbmRleCA0MjQ0N2U1Li40NGRiNjgyIDEwMDY0NAotLS0gYS9zcmMvcDJwL3AycF9wZC5jCisrKyBiL3NyYy9wMnAvcDJwX3BkLmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqIE51bWJlciBvZiByZXRyaWVzIHRvIGF0dGVtcHQgZm9yIHByb3Zpc2lvbiBkaXNjb3ZlcnkgcmVxdWVzdHMKICAqIGluIGNhc2UgdGhlIHBlZXIgaXMgbm90IGxpc3RlbmluZy4KICAqLwotI2RlZmluZSBNQVhfUFJPVl9ESVNDX1JFUV9SRVRSSUVTIDEwCisjZGVmaW5lIE1BWF9QUk9WX0RJU0NfUkVRX1JFVFJJRVMgMTIwCiAKIAogc3RhdGljIHZvaWQgcDJwX2J1aWxkX3dwc19pZV9jb25maWdfbWV0aG9kcyhzdHJ1Y3Qgd3BhYnVmICpidWYsCkBAIC0xNTEsOCArMTUxLDkgQEAKIAkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAogCQkJIlAyUDogUHJvdmlzaW9uIERpc2NvdmVyeSBSZXF1ZXN0IGZyb20gIgogCQkJInVua25vd24gcGVlciAiIE1BQ1NUUiwgTUFDMlNUUihzYSkpOwotCQlpZiAocDJwX2FkZF9kZXZpY2UocDJwLCBzYSwgcnhfZnJlcSwgMCwgZGF0YSArIDEsIGxlbiAtIDEsIDApKQotCQl7CisKKwkJaWYgKHAycF9hZGRfZGV2aWNlKHAycCwgc2EsIHJ4X2ZyZXEsIE5VTEwsIDAsIGRhdGEgKyAxLCBsZW4gLSAxLAorCQkJCSAgIDApKSB7CiAJCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCiAJCQkgICAgICAgICJQMlA6IFByb3Zpc2lvbiBEaXNjb3ZlcnkgUmVxdWVzdCBhZGQgZGV2aWNlICIKIAkJCQkiZmFpbGVkICIgTUFDU1RSLCBNQUMyU1RSKHNhKSk7CkBAIC0zNzksOSArMzgwLDYgQEAKIAkJLyogVE9ETzogdXNlIGRldmljZSBkaXNjb3ZlcmFiaWxpdHkgcmVxdWVzdCB0aHJvdWdoIEdPICovCiAJfQogCi0JZGV2LT5kaWFsb2dfdG9rZW4rKzsKLQlpZiAoZGV2LT5kaWFsb2dfdG9rZW4gPT0gMCkKLQkJZGV2LT5kaWFsb2dfdG9rZW4gPSAxOwogCXJlcSA9IHAycF9idWlsZF9wcm92X2Rpc2NfcmVxKHAycCwgZGV2LT5kaWFsb2dfdG9rZW4sCiAJCQkJICAgICAgZGV2LT5yZXFfY29uZmlnX21ldGhvZHMsCiAJCQkJICAgICAgam9pbiA/IGRldiA6IE5VTEwpOwpAQCAtNDA4LDcgKzQwNiw4IEBACiAKIAogaW50IHAycF9wcm92X2Rpc2NfcmVxKHN0cnVjdCBwMnBfZGF0YSAqcDJwLCBjb25zdCB1OCAqcGVlcl9hZGRyLAotCQkgICAgICB1MTYgY29uZmlnX21ldGhvZHMsIGludCBqb2luLCBpbnQgZm9yY2VfZnJlcSkKKwkJICAgICAgdTE2IGNvbmZpZ19tZXRob2RzLCBpbnQgam9pbiwgaW50IGZvcmNlX2ZyZXEsCisJCSAgICAgIGludCB1c2VyX2luaXRpYXRlZF9wZCkKIHsKIAlzdHJ1Y3QgcDJwX2RldmljZSAqZGV2OwogCkBAIC00NDYsMTUgKzQ0NSwxOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKgotCSAqIFdlIHVzZSB0aGUgam9pbiBwYXJhbSBhcyBhIGN1ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdXNlcgotCSAqIGluaXRpYXRlZCBQRCByZXF1ZXN0IGFuZCBvbmUgaXNzdWVkIGR1cmluZyBmaW5kcyAoaW50ZXJuYWwpLgotCSAqLwotCXAycC0+dXNlcl9pbml0aWF0ZWRfcGQgPSAham9pbjsKKwlwMnAtPnVzZXJfaW5pdGlhdGVkX3BkID0gdXNlcl9pbml0aWF0ZWRfcGQ7CiAKIAlpZiAocDJwLT51c2VyX2luaXRpYXRlZF9wZCkKIAkJcDJwLT5wZF9yZXRyaWVzID0gTUFYX1BST1ZfRElTQ19SRVFfUkVUUklFUzsKIAorCS8qCisJICogQXNzaWduIGRpYWxvZyB0b2tlbiBoZXJlIHRvIHVzZSB0aGUgc2FtZSB2YWx1ZSBpbiBlYWNoIHJldHJ5IHdpdGhpbgorCSAqIHRoZSBzYW1lIFBEIGV4Y2hhbmdlLgorCSAqLworCWRldi0+ZGlhbG9nX3Rva2VuKys7CisJaWYgKGRldi0+ZGlhbG9nX3Rva2VuID09IDApCisJCWRldi0+ZGlhbG9nX3Rva2VuID0gMTsKKwogCXJldHVybiBwMnBfc2VuZF9wcm92X2Rpc2NfcmVxKHAycCwgZGV2LCBqb2luLCBmb3JjZV9mcmVxKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3JhZGl1cy9yYWRpdXMuYyBiL3NyYy9yYWRpdXMvcmFkaXVzLmMKaW5kZXggZDVlZGZkOC4uZDFmZWVjOSAxMDA2NDQKLS0tIGEvc3JjL3JhZGl1cy9yYWRpdXMuYworKysgYi9zcmMvcmFkaXVzL3JhZGl1cy5jCkBAIC0xNDA2LDExICsxNDA2LDEyIEBACiAgKiBAc2VjcmV0OiBSQURJVVMgc2hhcmVkIHNlY3JldAogICogQHNlY3JldF9sZW46IExlbmd0aCBvZiBzZWNyZXQKICAqIEBzZW50X21zZzogU2VudCBSQURJVVMgbWVzc2FnZQotICogUmV0dXJuczogcG9pbnRlciB0byBwYXNzd29yZCAoZnJlZSB3aXRoIG9zX2ZyZWUpIG9yICVOVUxMCisgKiBAbjogTnVtYmVyIG9mIHBhc3N3b3JkIGF0dHJpYnV0ZSB0byByZXR1cm4gKHN0YXJ0aW5nIHdpdGggMCkKKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gbi10aCBwYXNzd29yZCAoZnJlZSB3aXRoIG9zX2ZyZWUpIG9yICVOVUxMCiAgKi8KIGNoYXIgKiByYWRpdXNfbXNnX2dldF90dW5uZWxfcGFzc3dvcmQoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgaW50ICprZXlsZW4sCiAJCQkJICAgICAgY29uc3QgdTggKnNlY3JldCwgc2l6ZV90IHNlY3JldF9sZW4sCi0JCQkJICAgICAgc3RydWN0IHJhZGl1c19tc2cgKnNlbnRfbXNnKQorCQkJCSAgICAgIHN0cnVjdCByYWRpdXNfbXNnICpzZW50X21zZywgc2l6ZV90IG4pCiB7CiAJdTggKmJ1ZiA9IE5VTEw7CiAJc2l6ZV90IGJ1ZmxlbjsKQEAgLTE0MjAsNyArMTQyMSw3IEBACiAJc2l6ZV90IGxlblszXTsKIAl1OCBoYXNoWzE2XTsKIAl1OCAqcG9zOwotCXNpemVfdCBpOworCXNpemVfdCBpLCBqID0gMDsKIAlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICphdHRyOwogCWNvbnN0IHU4ICpkYXRhOwogCXNpemVfdCBkbGVuOwpAQCAtMTQyOCw3ICsxNDI5LDcgQEAKIAlzaXplX3QgZmRsZW4gPSAtMTsKIAljaGFyICpyZXQgPSBOVUxMOwogCi0JLyogZmluZCBhdHRyaWJ1dGUgd2l0aCBsb3dlc3QgdGFnIGFuZCBjaGVjayBpdCAqLworCS8qIGZpbmQgbi10aCB2YWxpZCBUdW5uZWwtUGFzc3dvcmQgYXR0cmlidXRlICovCiAJZm9yIChpID0gMDsgaSA8IG1zZy0+YXR0cl91c2VkOyBpKyspIHsKIAkJYXR0ciA9IHJhZGl1c19nZXRfYXR0cl9oZHIobXNnLCBpKTsKIAkJaWYgKGF0dHIgPT0gTlVMTCB8fApAQCAtMTQ0MSwxMSArMTQ0MiwxMyBAQAogCQlkbGVuID0gYXR0ci0+bGVuZ3RoIC0gc2l6ZW9mKCphdHRyKTsKIAkJaWYgKGRsZW4gPD0gMyB8fCBkbGVuICUgMTYgIT0gMykKIAkJCWNvbnRpbnVlOwotCQlpZiAoZmRhdGEgIT0gTlVMTCAmJiBmZGF0YVswXSA8PSBkYXRhWzBdKQorCQlqKys7CisJCWlmIChqIDw9IG4pCiAJCQljb250aW51ZTsKIAogCQlmZGF0YSA9IGRhdGE7CiAJCWZkbGVuID0gZGxlbjsKKwkJYnJlYWs7CiAJfQogCWlmIChmZGF0YSA9PSBOVUxMKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL3NyYy9yYWRpdXMvcmFkaXVzLmggYi9zcmMvcmFkaXVzL3JhZGl1cy5oCmluZGV4IDcyNzY0MGIuLjIwMzEwNTQgMTAwNjQ0Ci0tLSBhL3NyYy9yYWRpdXMvcmFkaXVzLmgKKysrIGIvc3JjL3JhZGl1cy9yYWRpdXMuaApAQCAtMjQyLDcgKzI0Miw3IEBACiBpbnQgcmFkaXVzX21zZ19nZXRfdmxhbmlkKHN0cnVjdCByYWRpdXNfbXNnICptc2cpOwogY2hhciAqIHJhZGl1c19tc2dfZ2V0X3R1bm5lbF9wYXNzd29yZChzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCBpbnQgKmtleWxlbiwKIAkJCQkgICAgICBjb25zdCB1OCAqc2VjcmV0LCBzaXplX3Qgc2VjcmV0X2xlbiwKLQkJCQkgICAgICBzdHJ1Y3QgcmFkaXVzX21zZyAqc2VudF9tc2cpOworCQkJCSAgICAgIHN0cnVjdCByYWRpdXNfbXNnICpzZW50X21zZywgc2l6ZV90IG4pOwogCiBzdGF0aWMgaW5saW5lIGludCByYWRpdXNfbXNnX2FkZF9hdHRyX2ludDMyKHN0cnVjdCByYWRpdXNfbXNnICptc2csIHU4IHR5cGUsCiAJCQkJCSAgICB1MzIgdmFsdWUpCmRpZmYgLS1naXQgYS9zcmMvcnNuX3N1cHAvcGVlcmtleS5jIGIvc3JjL3Jzbl9zdXBwL3BlZXJrZXkuYwppbmRleCBmMmJhYzM0Li43ODlhYzI1IDEwMDY0NAotLS0gYS9zcmMvcnNuX3N1cHAvcGVlcmtleS5jCisrKyBiL3NyYy9yc25fc3VwcC9wZWVya2V5LmMKQEAgLTIxNywyMyArMjE3LDE3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQljaXBoZXIgPSBpZS5wYWlyd2lzZV9jaXBoZXIgJiBzbS0+YWxsb3dlZF9wYWlyd2lzZV9jaXBoZXI7Ci0JaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfQ0NNUCkgewotCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJTTjogVXNpbmcgQ0NNUCBmb3IgUGVlcktleSIpOwotCQljaXBoZXIgPSBXUEFfQ0lQSEVSX0NDTVA7Ci0JfSBlbHNlIGlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX0dDTVApIHsKLQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSU046IFVzaW5nIEdDTVAgZm9yIFBlZXJLZXkiKTsKLQkJY2lwaGVyID0gV1BBX0NJUEhFUl9HQ01QOwotCX0gZWxzZSBpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQKSB7Ci0JCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUlNOOiBVc2luZyBUS0lQIGZvciBQZWVyS2V5Iik7Ci0JCWNpcGhlciA9IFdQQV9DSVBIRVJfVEtJUDsKLQl9IGVsc2UgeworCWNpcGhlciA9IHdwYV9waWNrX3BhaXJ3aXNlX2NpcGhlcihpZS5wYWlyd2lzZV9jaXBoZXIgJgorCQkJCQkgIHNtLT5hbGxvd2VkX3BhaXJ3aXNlX2NpcGhlciwgMCk7CisJaWYgKGNpcGhlciA8IDApIHsKIAkJd3BhX3ByaW50ZihNU0dfSU5GTywgIlJTTjogTm8gYWNjZXB0YWJsZSBjaXBoZXIgaW4gU01LIE0yIik7CiAJCXdwYV9zdXBwbGljYW50X3NlbmRfc21rX2Vycm9yKHNtLCBzcmNfYWRkciwga2RlLm1hY19hZGRyLAogCQkJCQkgICAgICBTVEtfTVVJX1NNSywgU1RLX0VSUl9DUEhSX05TLAogCQkJCQkgICAgICB2ZXIpOwogCQlyZXR1cm4gLTE7CiAJfQorCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUlNOOiBVc2luZyAlcyBmb3IgUGVlcktleSIsCisJCSAgIHdwYV9jaXBoZXJfdHh0KGNpcGhlcikpOwogCiAJLyogVE9ETzogZmluZCBleGlzdGluZyBlbnRyeSBhbmQgaWYgZm91bmQsIHVzZSB0aGF0IGluc3RlYWQgb2YgYWRkaW5nCiAJICogYSBuZXcgb25lOyBob3cgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGJvdGggZW5kcyBpbml0aWF0ZSBhdCB0aGUKQEAgLTQ5NiwxNyArNDkwLDkgQEAKIAlwZWVya2V5LT5yc25pZV9wX2xlbiA9IGtkZS0+cnNuX2llX2xlbjsKIAlvc19tZW1jcHkocGVlcmtleS0+cG5vbmNlLCBrZGUtPm5vbmNlLCBXUEFfTk9OQ0VfTEVOKTsKIAotCWNpcGhlciA9IGllLnBhaXJ3aXNlX2NpcGhlciAmIHNtLT5hbGxvd2VkX3BhaXJ3aXNlX2NpcGhlcjsKLQlpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9DQ01QKSB7Ci0JCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUlNOOiBVc2luZyBDQ01QIGZvciBQZWVyS2V5Iik7Ci0JCXBlZXJrZXktPmNpcGhlciA9IFdQQV9DSVBIRVJfQ0NNUDsKLQl9IGVsc2UgaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfR0NNUCkgewotCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJTTjogVXNpbmcgR0NNUCBmb3IgUGVlcktleSIpOwotCQlwZWVya2V5LT5jaXBoZXIgPSBXUEFfQ0lQSEVSX0dDTVA7Ci0JfSBlbHNlIGlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX1RLSVApIHsKLQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSU046IFVzaW5nIFRLSVAgZm9yIFBlZXJLZXkiKTsKLQkJcGVlcmtleS0+Y2lwaGVyID0gV1BBX0NJUEhFUl9US0lQOwotCX0gZWxzZSB7CisJY2lwaGVyID0gd3BhX3BpY2tfcGFpcndpc2VfY2lwaGVyKGllLnBhaXJ3aXNlX2NpcGhlciAmCisJCQkJCSAgc20tPmFsbG93ZWRfcGFpcndpc2VfY2lwaGVyLCAwKTsKKwlpZiAoY2lwaGVyIDwgMCkgewogCQl3cGFfcHJpbnRmKE1TR19JTkZPLCAiUlNOOiBTTUsgUGVlciBTVEEgIiBNQUNTVFIgIiBzZWxlY3RlZCAiCiAJCQkgICAidW5hY2NlcHRhYmxlIGNpcGhlciIsIE1BQzJTVFIoa2RlLT5tYWNfYWRkcikpOwogCQl3cGFfc3VwcGxpY2FudF9zZW5kX3Nta19lcnJvcihzbSwgc3JjX2FkZHIsIGtkZS0+bWFjX2FkZHIsCkBAIC01MTUsNiArNTAxLDkgQEAKIAkJLyogVE9ETzogYWJvcnQgbmVnb3RpYXRpb24gKi8KIAkJcmV0dXJuIC0xOwogCX0KKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJTTjogVXNpbmcgJXMgZm9yIFBlZXJLZXkiLAorCQkgICB3cGFfY2lwaGVyX3R4dChjaXBoZXIpKTsKKwlwZWVya2V5LT5jaXBoZXIgPSBjaXBoZXI7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9yc25fc3VwcC9wbWtzYV9jYWNoZS5jIGIvc3JjL3Jzbl9zdXBwL3Bta3NhX2NhY2hlLmMKaW5kZXggOTc4M2U3Yy4uZGY2NzU4MyAxMDA2NDQKLS0tIGEvc3JjL3Jzbl9zdXBwL3Bta3NhX2NhY2hlLmMKKysrIGIvc3JjL3Jzbl9zdXBwL3Bta3NhX2NhY2hlLmMKQEAgLTI1LDcgKzI1LDcgQEAKIAlzdHJ1Y3Qgd3BhX3NtICpzbTsgLyogVE9ETzogZ2V0IHJpZCBvZiB0aGlzIHJlZmVyZW5jZSg/KSAqLwogCiAJdm9pZCAoKmZyZWVfY2IpKHN0cnVjdCByc25fcG1rc2FfY2FjaGVfZW50cnkgKmVudHJ5LCB2b2lkICpjdHgsCi0JCQlpbnQgcmVwbGFjZSk7CisJCQllbnVtIHBta3NhX2ZyZWVfcmVhc29uIHJlYXNvbik7CiAJdm9pZCAqY3R4OwogfTsKIApAQCAtNDEsMTEgKzQxLDExIEBACiAKIHN0YXRpYyB2b2lkIHBta3NhX2NhY2hlX2ZyZWVfZW50cnkoc3RydWN0IHJzbl9wbWtzYV9jYWNoZSAqcG1rc2EsCiAJCQkJICAgc3RydWN0IHJzbl9wbWtzYV9jYWNoZV9lbnRyeSAqZW50cnksCi0JCQkJICAgaW50IHJlcGxhY2UpCisJCQkJICAgZW51bSBwbWtzYV9mcmVlX3JlYXNvbiByZWFzb24pCiB7CiAJd3BhX3NtX3JlbW92ZV9wbWtpZChwbWtzYS0+c20sIGVudHJ5LT5hYSwgZW50cnktPnBta2lkKTsKIAlwbWtzYS0+cG1rc2FfY291bnQtLTsKLQlwbWtzYS0+ZnJlZV9jYihlbnRyeSwgcG1rc2EtPmN0eCwgcmVwbGFjZSk7CisJcG1rc2EtPmZyZWVfY2IoZW50cnksIHBta3NhLT5jdHgsIHJlYXNvbik7CiAJX3Bta3NhX2NhY2hlX2ZyZWVfZW50cnkoZW50cnkpOwogfQogCkBAIC02MSw3ICs2MSw3IEBACiAJCXBta3NhLT5wbWtzYSA9IGVudHJ5LT5uZXh0OwogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJTTjogZXhwaXJlZCBQTUtTQSBjYWNoZSBlbnRyeSBmb3IgIgogCQkJICAgTUFDU1RSLCBNQUMyU1RSKGVudHJ5LT5hYSkpOwotCQlwbWtzYV9jYWNoZV9mcmVlX2VudHJ5KHBta3NhLCBlbnRyeSwgMCk7CisJCXBta3NhX2NhY2hlX2ZyZWVfZW50cnkocG1rc2EsIGVudHJ5LCBQTUtTQV9FWFBJUkUpOwogCX0KIAogCXBta3NhX2NhY2hlX3NldF9leHBpcmF0aW9uKHBta3NhKTsKQEAgLTE2NCwyMiArMTY0LDkgQEAKIAkJCQlwbWtzYS0+cG1rc2EgPSBwb3MtPm5leHQ7CiAJCQllbHNlCiAJCQkJcHJldi0+bmV4dCA9IHBvcy0+bmV4dDsKLQkJCWlmIChwb3MgPT0gcG1rc2EtPnNtLT5jdXJfcG1rc2EpIHsKLQkJCQkvKiBXZSBhcmUgYWJvdXQgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBQTUtTQQotCQkJCSAqIGNhY2hlIGVudHJ5LiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgUE1LU0EKLQkJCQkgKiBjYWNoaW5nIGF0dGVtcHQgZmFpbHMsIHNvIHdlIGRvbid0IHdhbnQgdG8KLQkJCQkgKiBmb3JjZSBwbWtzYV9jYWNoZV9mcmVlX2VudHJ5KCkgdG8gZGlzY29ubmVjdAotCQkJCSAqIGF0IHRoaXMgcG9pbnQuIExldCdzIGp1c3QgbWFrZSBzdXJlIHRoZSBvbGQKLQkJCQkgKiBQTUtTQSBjYWNoZSBlbnRyeSB3aWxsIG5vdCBiZSB1c2VkIGluIHRoZQotCQkJCSAqIGZ1dHVyZS4KLQkJCQkgKi8KLQkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJTTjogcmVwbGFjaW5nIGN1cnJlbnQgIgotCQkJCQkgICAiUE1LU0EgZW50cnkiKTsKLQkJCQlwbWtzYS0+c20tPmN1cl9wbWtzYSA9IE5VTEw7Ci0JCQl9CiAJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJTTjogUmVwbGFjZSBQTUtTQSBlbnRyeSBmb3IgIgogCQkJCSAgICJ0aGUgY3VycmVudCBBUCIpOwotCQkJcG1rc2FfY2FjaGVfZnJlZV9lbnRyeShwbWtzYSwgcG9zLCAxKTsKKwkJCXBta3NhX2NhY2hlX2ZyZWVfZW50cnkocG1rc2EsIHBvcywgUE1LU0FfUkVQTEFDRSk7CiAKIAkJCS8qCiAJCQkgKiBJZiBPS0MgaXMgdXNlZCwgdGhlcmUgbWF5IGJlIG90aGVyIFBNS1NBIGNhY2hlCkBAIC0yMTQsNyArMjAxLDcgQEAKIAkJCQkgICAiUE1LU0EgY2FjaGUgZW50cnkgKGZvciAiIE1BQ1NUUiAiKSB0byAiCiAJCQkJICAgIm1ha2Ugcm9vbSBmb3IgbmV3IG9uZSIsCiAJCQkJICAgTUFDMlNUUihwb3MtPmFhKSk7Ci0JCQlwbWtzYV9jYWNoZV9mcmVlX2VudHJ5KHBta3NhLCBwb3MsIDApOworCQkJcG1rc2FfY2FjaGVfZnJlZV9lbnRyeShwbWtzYSwgcG9zLCBQTUtTQV9GUkVFKTsKIAkJfQogCX0KIApAQCAtMjY1LDcgKzI1Miw3IEBACiAJCQkJcG1rc2EtPnBta3NhID0gZW50cnktPm5leHQ7CiAJCQl0bXAgPSBlbnRyeTsKIAkJCWVudHJ5ID0gZW50cnktPm5leHQ7Ci0JCQlwbWtzYV9jYWNoZV9mcmVlX2VudHJ5KHBta3NhLCB0bXAsIDApOworCQkJcG1rc2FfY2FjaGVfZnJlZV9lbnRyeShwbWtzYSwgdG1wLCBQTUtTQV9GUkVFKTsKIAkJCXJlbW92ZWQrKzsKIAkJfSBlbHNlIHsKIAkJCXByZXYgPSBlbnRyeTsKQEAgLTUwNyw3ICs0OTQsNyBAQAogICovCiBzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlICoKIHBta3NhX2NhY2hlX2luaXQodm9pZCAoKmZyZWVfY2IpKHN0cnVjdCByc25fcG1rc2FfY2FjaGVfZW50cnkgKmVudHJ5LAotCQkJCSB2b2lkICpjdHgsIGludCByZXBsYWNlKSwKKwkJCQkgdm9pZCAqY3R4LCBlbnVtIHBta3NhX2ZyZWVfcmVhc29uIHJlYXNvbiksCiAJCSB2b2lkICpjdHgsIHN0cnVjdCB3cGFfc20gKnNtKQogewogCXN0cnVjdCByc25fcG1rc2FfY2FjaGUgKnBta3NhOwpkaWZmIC0tZ2l0IGEvc3JjL3Jzbl9zdXBwL3Bta3NhX2NhY2hlLmggYi9zcmMvcnNuX3N1cHAvcG1rc2FfY2FjaGUuaAppbmRleCA5MjQ1YWFiLi42ZjNkZmIzIDEwMDY0NAotLS0gYS9zcmMvcnNuX3N1cHAvcG1rc2FfY2FjaGUuaAorKysgYi9zcmMvcnNuX3N1cHAvcG1rc2FfY2FjaGUuaApAQCAtMzgsMTEgKzM4LDE3IEBACiAKIHN0cnVjdCByc25fcG1rc2FfY2FjaGU7CiAKK2VudW0gcG1rc2FfZnJlZV9yZWFzb24geworCVBNS1NBX0ZSRUUsCisJUE1LU0FfUkVQTEFDRSwKKwlQTUtTQV9FWFBJUkUsCit9OworCiAjaWYgZGVmaW5lZChJRUVFODAyMVhfRUFQT0wpICYmICFkZWZpbmVkKENPTkZJR19OT19XUEEyKQogCiBzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlICoKIHBta3NhX2NhY2hlX2luaXQodm9pZCAoKmZyZWVfY2IpKHN0cnVjdCByc25fcG1rc2FfY2FjaGVfZW50cnkgKmVudHJ5LAotCQkJCSB2b2lkICpjdHgsIGludCByZXBsYWNlKSwKKwkJCQkgdm9pZCAqY3R4LCBlbnVtIHBta3NhX2ZyZWVfcmVhc29uIHJlYXNvbiksCiAJCSB2b2lkICpjdHgsIHN0cnVjdCB3cGFfc20gKnNtKTsKIHZvaWQgcG1rc2FfY2FjaGVfZGVpbml0KHN0cnVjdCByc25fcG1rc2FfY2FjaGUgKnBta3NhKTsKIHN0cnVjdCByc25fcG1rc2FfY2FjaGVfZW50cnkgKiBwbWtzYV9jYWNoZV9nZXQoc3RydWN0IHJzbl9wbWtzYV9jYWNoZSAqcG1rc2EsCkBAIC02Niw3ICs3Miw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJzbl9wbWtzYV9jYWNoZSAqCiBwbWtzYV9jYWNoZV9pbml0KHZvaWQgKCpmcmVlX2NiKShzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlX2VudHJ5ICplbnRyeSwKLQkJCQkgdm9pZCAqY3R4LCBpbnQgcmVwbGFjZSksCisJCQkJIHZvaWQgKmN0eCwgZW51bSBwbWtzYV9mcmVlX3JlYXNvbiByZWFzb24pLAogCQkgdm9pZCAqY3R4LCBzdHJ1Y3Qgd3BhX3NtICpzbSkKIHsKIAlyZXR1cm4gKHZvaWQgKikgLTE7CmRpZmYgLS1naXQgYS9zcmMvcnNuX3N1cHAvdGRscy5jIGIvc3JjL3Jzbl9zdXBwL3RkbHMuYwppbmRleCA3NjQ2Y2E4Li4wOWFiZGJiIDEwMDY0NAotLS0gYS9zcmMvcnNuX3N1cHAvdGRscy5jCisrKyBiL3NyYy9yc25fc3VwcC90ZGxzLmMKQEAgLTEyMCw2ICsxMjAsMTQgQEAKIAogCXU4IHN1cHBfcmF0ZXNbSUVFRTgwMjExX01BWF9TVVBQX1JBVEVTXTsKIAlzaXplX3Qgc3VwcF9yYXRlc19sZW47CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyAqaHRfY2FwYWJpbGl0aWVzOworCXN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllcyAqdmh0X2NhcGFiaWxpdGllczsKKworCXU4IHFvc19pbmZvOworCisJdTggKmV4dF9jYXBhYjsKKwlzaXplX3QgZXh0X2NhcGFiX2xlbjsKIH07CiAKIApAQCAtNjExLDYgKzYxOSwxMiBAQAogCXBlZXItPmluaXRpYXRvciA9IDA7CiAJb3NfZnJlZShwZWVyLT5zbV90bXIuYnVmKTsKIAlwZWVyLT5zbV90bXIuYnVmID0gTlVMTDsKKwlvc19mcmVlKHBlZXItPmh0X2NhcGFiaWxpdGllcyk7CisJcGVlci0+aHRfY2FwYWJpbGl0aWVzID0gTlVMTDsKKwlvc19mcmVlKHBlZXItPnZodF9jYXBhYmlsaXRpZXMpOworCXBlZXItPnZodF9jYXBhYmlsaXRpZXMgPSBOVUxMOworCW9zX2ZyZWUocGVlci0+ZXh0X2NhcGFiKTsKKwlwZWVyLT5leHRfY2FwYWIgPSBOVUxMOwogCXBlZXItPnJzbmllX2lfbGVuID0gcGVlci0+cnNuaWVfcF9sZW4gPSAwOwogCXBlZXItPmNpcGhlciA9IDA7CiAJcGVlci0+dHBrX3NldCA9IHBlZXItPnRwa19zdWNjZXNzID0gMDsKQEAgLTY4MCw4ICs2OTQsMTMgQEAKIAkJcmV0dXJuIC0xOwogCXBvcyA9IHJidWY7CiAKLQlpZiAoIXdwYV90ZGxzX2dldF9wcml2YWN5KHNtKSB8fCAhcGVlci0+dHBrX3NldCB8fCAhcGVlci0+dHBrX3N1Y2Nlc3MpCisJaWYgKCF3cGFfdGRsc19nZXRfcHJpdmFjeShzbSkgfHwgIXBlZXItPnRwa19zZXQgfHwgIXBlZXItPnRwa19zdWNjZXNzKSB7CisJCWlmIChyZWFzb25fY29kZSAhPSBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORykgeworCQkJLyogT3ZlcndyaXRlIHRoZSByZWFzb24gY29kZSAqLworCQkJcmVhc29uX2NvZGUgPSBXTEFOX1JFQVNPTl9URExTX1RFQVJET1dOX1VOU1BFQ0lGSUVEOworCQl9CiAJCWdvdG8gc2tpcF9pZXM7CisJfQogCiAJZnRpZSA9IChzdHJ1Y3Qgd3BhX3RkbHNfZnRpZSAqKSBwb3M7CiAJZnRpZS0+aWVfdHlwZSA9IFdMQU5fRUlEX0ZBU1RfQlNTX1RSQU5TSVRJT047CkBAIC03MTUsOCArNzM0LDcgQEAKIAogCS8qIHJlcXVlc3QgZHJpdmVyIHRvIHNlbmQgVGVhcmRvd24gdXNpbmcgdGhpcyBGVElFICovCiAJd3BhX3RkbHNfdHBrX3NlbmQoc20sIGFkZHIsIFdMQU5fVERMU19URUFSRE9XTiwgMCwKLQkJCSAgV0xBTl9SRUFTT05fVERMU19URUFSRE9XTl9VTlNQRUNJRklFRCwgcmJ1ZiwKLQkJCSAgcG9zIC0gcmJ1Zik7CisJCQkgIHJlYXNvbl9jb2RlLCByYnVmLCBwb3MgLSByYnVmKTsKIAlvc19mcmVlKHJidWYpOwogCiAJLyogY2xlYXIgdGhlIFBlZXJrZXkgc3RhdGVtYWNoaW5lICovCkBAIC04NjgsMTAgKzg4NiwyMCBAQAogCiAKIHN0YXRpYyBzdHJ1Y3Qgd3BhX3RkbHNfcGVlciAqCi13cGFfdGRsc19hZGRfcGVlcihzdHJ1Y3Qgd3BhX3NtICpzbSwgY29uc3QgdTggKmFkZHIpCit3cGFfdGRsc19hZGRfcGVlcihzdHJ1Y3Qgd3BhX3NtICpzbSwgY29uc3QgdTggKmFkZHIsIGludCAqZXhpc3RpbmcpCiB7CiAJc3RydWN0IHdwYV90ZGxzX3BlZXIgKnBlZXI7CiAKKwlpZiAoZXhpc3RpbmcpCisJCSpleGlzdGluZyA9IDA7CisJZm9yIChwZWVyID0gc20tPnRkbHM7IHBlZXI7IHBlZXIgPSBwZWVyLT5uZXh0KSB7CisJCWlmIChvc19tZW1jbXAocGVlci0+YWRkciwgYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJCWlmIChleGlzdGluZykKKwkJCQkqZXhpc3RpbmcgPSAxOworCQkJcmV0dXJuIHBlZXI7IC8qIHJlLXVzZSBleGlzdGluZyBlbnRyeSAqLworCQl9CisJfQorCiAJd3BhX3ByaW50ZihNU0dfSU5GTywgIlRETFM6IENyZWF0aW5nIHBlZXIgZW50cnkgZm9yICIgTUFDU1RSLAogCQkgICBNQUMyU1RSKGFkZHIpKTsKIApAQCAtMTI4Miw3ICsxMzEwLDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXBlZXIgPSB3cGFfdGRsc19hZGRfcGVlcihzbSwgYWRkcik7CisJcGVlciA9IHdwYV90ZGxzX2FkZF9wZWVyKHNtLCBhZGRyLCBOVUxMKTsKIAlpZiAocGVlciA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKQEAgLTEzMDksMjEgKzEzMzcsOTAgQEAKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJURExTOiBObyBzdXBwb3J0ZWQgcmF0ZXMgcmVjZWl2ZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KKwlwZWVyLT5zdXBwX3JhdGVzX2xlbiA9IG1lcmdlX2J5dGVfYXJyYXlzKAorCQlwZWVyLT5zdXBwX3JhdGVzLCBzaXplb2YocGVlci0+c3VwcF9yYXRlcyksCisJCWtkZS0+c3VwcF9yYXRlcyArIDIsIGtkZS0+c3VwcF9yYXRlc19sZW4gLSAyLAorCQlrZGUtPmV4dF9zdXBwX3JhdGVzICsgMiwga2RlLT5leHRfc3VwcF9yYXRlc19sZW4gLSAyKTsKKwlyZXR1cm4gMDsKK30KIAotCXBlZXItPnN1cHBfcmF0ZXNfbGVuID0ga2RlLT5zdXBwX3JhdGVzX2xlbiAtIDI7Ci0JaWYgKHBlZXItPnN1cHBfcmF0ZXNfbGVuID4gSUVFRTgwMjExX01BWF9TVVBQX1JBVEVTKQotCQlwZWVyLT5zdXBwX3JhdGVzX2xlbiA9IElFRUU4MDIxMV9NQVhfU1VQUF9SQVRFUzsKLQlvc19tZW1jcHkocGVlci0+c3VwcF9yYXRlcywga2RlLT5zdXBwX3JhdGVzICsgMiwgcGVlci0+c3VwcF9yYXRlc19sZW4pOwogCi0JaWYgKGtkZS0+ZXh0X3N1cHBfcmF0ZXMpIHsKLQkJaW50IGNsZW4gPSBrZGUtPmV4dF9zdXBwX3JhdGVzX2xlbiAtIDI7Ci0JCWlmIChwZWVyLT5zdXBwX3JhdGVzX2xlbiArIGNsZW4gPiBJRUVFODAyMTFfTUFYX1NVUFBfUkFURVMpCi0JCQljbGVuID0gSUVFRTgwMjExX01BWF9TVVBQX1JBVEVTIC0gcGVlci0+c3VwcF9yYXRlc19sZW47Ci0JCW9zX21lbWNweShwZWVyLT5zdXBwX3JhdGVzICsgcGVlci0+c3VwcF9yYXRlc19sZW4sCi0JCQkgIGtkZS0+ZXh0X3N1cHBfcmF0ZXMgKyAyLCBjbGVuKTsKLQkJcGVlci0+c3VwcF9yYXRlc19sZW4gKz0gY2xlbjsKK3N0YXRpYyBpbnQgY29weV9wZWVyX2h0X2NhcGFiKGNvbnN0IHN0cnVjdCB3cGFfZWFwb2xfaWVfcGFyc2UgKmtkZSwKKwkJCSAgICAgIHN0cnVjdCB3cGFfdGRsc19wZWVyICpwZWVyKQoreworCWlmICgha2RlLT5odF9jYXBhYmlsaXRpZXMgfHwKKwkgICAga2RlLT5odF9jYXBhYmlsaXRpZXNfbGVuIDwKKwkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwYWJpbGl0aWVzKSApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJURExTOiBObyBzdXBwb3J0ZWQgaHQgY2FwYWJpbGl0aWVzICIKKwkJCSAgICJyZWNlaXZlZCIpOworCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAoIXBlZXItPmh0X2NhcGFiaWxpdGllcykgeworCQlwZWVyLT5odF9jYXBhYmlsaXRpZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgb3NfemFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcykpOworCQlpZiAocGVlci0+aHRfY2FwYWJpbGl0aWVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisJb3NfbWVtY3B5KHBlZXItPmh0X2NhcGFiaWxpdGllcywga2RlLT5odF9jYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXBhYmlsaXRpZXMpKTsKKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJURExTOiBQZWVyIEhUIGNhcGFiaWxpdGllcyIsCisJCSAgICAodTggKikgcGVlci0+aHRfY2FwYWJpbGl0aWVzLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwYWJpbGl0aWVzKSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNvcHlfcGVlcl92aHRfY2FwYWIoY29uc3Qgc3RydWN0IHdwYV9lYXBvbF9pZV9wYXJzZSAqa2RlLAorCQkJICAgICAgc3RydWN0IHdwYV90ZGxzX3BlZXIgKnBlZXIpCit7CisJaWYgKCFrZGUtPnZodF9jYXBhYmlsaXRpZXMgfHwKKwkgICAga2RlLT52aHRfY2FwYWJpbGl0aWVzX2xlbiA8CisJICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3ZodF9jYXBhYmlsaXRpZXMpICkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlRETFM6IE5vIHN1cHBvcnRlZCB2aHQgY2FwYWJpbGl0aWVzICIKKwkJCSAgICJyZWNlaXZlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXBlZXItPnZodF9jYXBhYmlsaXRpZXMpIHsKKwkJcGVlci0+dmh0X2NhcGFiaWxpdGllcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBvc196YWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllcykpOworCQlpZiAocGVlci0+dmh0X2NhcGFiaWxpdGllcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCX0KKworCW9zX21lbWNweShwZWVyLT52aHRfY2FwYWJpbGl0aWVzLCBrZGUtPnZodF9jYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV92aHRfY2FwYWJpbGl0aWVzKSk7CisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiVERMUzogUGVlciBWSFQgY2FwYWJpbGl0aWVzIiwKKwkJICAgICh1OCAqKSBwZWVyLT52aHRfY2FwYWJpbGl0aWVzLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllcykpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjb3B5X3BlZXJfZXh0X2NhcGFiKGNvbnN0IHN0cnVjdCB3cGFfZWFwb2xfaWVfcGFyc2UgKmtkZSwKKwkJCSAgICAgICBzdHJ1Y3Qgd3BhX3RkbHNfcGVlciAqcGVlcikKK3sKKwlpZiAoIWtkZS0+ZXh0X2NhcGFiKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiVERMUzogTm8gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzICIKKwkJCSAgICJyZWNlaXZlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXBlZXItPmV4dF9jYXBhYiB8fCBwZWVyLT5leHRfY2FwYWJfbGVuIDwga2RlLT5leHRfY2FwYWJfbGVuIC0gMikgeworCQkvKiBOZWVkIHRvIGFsbG9jYXRlIGJ1ZmZlciB0byBmaXQgdGhlIG5ldyBpbmZvcm1hdGlvbiAqLworCQlvc19mcmVlKHBlZXItPmV4dF9jYXBhYik7CisJCXBlZXItPmV4dF9jYXBhYiA9IG9zX3phbGxvYyhrZGUtPmV4dF9jYXBhYl9sZW4gLSAyKTsKKwkJaWYgKHBlZXItPmV4dF9jYXBhYiA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCX0KKworCXBlZXItPmV4dF9jYXBhYl9sZW4gPSBrZGUtPmV4dF9jYXBhYl9sZW4gLSAyOworCW9zX21lbWNweShwZWVyLT5leHRfY2FwYWIsIGtkZS0+ZXh0X2NhcGFiICsgMiwgcGVlci0+ZXh0X2NhcGFiX2xlbik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM2MywxOCArMTQ2MCw5IEBACiAKIAl3cGFfcHJpbnRmKE1TR19JTkZPLCAiVERMUzogRGlhbG9nIFRva2VuIGluIFRQSyBNMSAlZCIsIGR0b2tlbik7CiAKLQlmb3IgKHBlZXIgPSBzbS0+dGRsczsgcGVlcjsgcGVlciA9IHBlZXItPm5leHQpIHsKLQkJaWYgKG9zX21lbWNtcChwZWVyLT5hZGRyLCBzcmNfYWRkciwgRVRIX0FMRU4pID09IDApIHsKLQkJCWV4aXN0aW5nX3BlZXIgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAocGVlciA9PSBOVUxMKSB7Ci0JCXBlZXIgPSB3cGFfdGRsc19hZGRfcGVlcihzbSwgc3JjX2FkZHIpOwotCQlpZiAocGVlciA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQl9CisJcGVlciA9IHdwYV90ZGxzX2FkZF9wZWVyKHNtLCBzcmNfYWRkciwgJmV4aXN0aW5nX3BlZXIpOworCWlmIChwZWVyID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CiAKIAkvKiBjYXBhYmlsaXR5IGluZm9ybWF0aW9uICovCiAJcGVlci0+Y2FwYWJpbGl0eSA9IFdQQV9HRVRfTEUxNihjcG9zKTsKQEAgLTE0MDYsMTcgKzE0OTQsMjIgQEAKIAlpZiAoY29weV9zdXBwX3JhdGVzKCZrZGUsIHBlZXIpIDwgMCkKIAkJZ290byBlcnJvcjsKIAorCWlmIChjb3B5X3BlZXJfaHRfY2FwYWIoJmtkZSwgcGVlcikgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKGNvcHlfcGVlcl92aHRfY2FwYWIoJmtkZSwgcGVlcikgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKGNvcHlfcGVlcl9leHRfY2FwYWIoJmtkZSwgcGVlcikgPCAwKQorCQlnb3RvIGVycm9yOworCisJcGVlci0+cW9zX2luZm8gPSBrZGUucW9zaW5mbzsKKwogI2lmZGVmIENPTkZJR19URExTX1RFU1RJTkcKIAlpZiAodGRsc190ZXN0aW5nICYgVERMU19URVNUSU5HX0NPTkNVUlJFTlRfSU5JVCkgewotCQlmb3IgKHBlZXIgPSBzbS0+dGRsczsgcGVlcjsgcGVlciA9IHBlZXItPm5leHQpIHsKLQkJCWlmIChvc19tZW1jbXAocGVlci0+YWRkciwgc3JjX2FkZHIsIEVUSF9BTEVOKSA9PSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChwZWVyID09IE5VTEwpIHsKLQkJCXBlZXIgPSB3cGFfdGRsc19hZGRfcGVlcihzbSwgc3JjX2FkZHIpOwotCQkJaWYgKHBlZXIgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQl9CisJCXBlZXIgPSB3cGFfdGRsc19hZGRfcGVlcihzbSwgc3JjX2FkZHIsIE5VTEwpOworCQlpZiAocGVlciA9PSBOVUxMKQorCQkJZ290byBlcnJvcjsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJURExTOiBUZXN0aW5nIGNvbmN1cnJlbnQgaW5pdGlhdGlvbiBvZiAiCiAJCQkgICAiVERMUyBzZXR1cCAtIHNlbmQgb3duIHJlcXVlc3QiKTsKIAkJcGVlci0+aW5pdGlhdG9yID0gMTsKQEAgLTE2MzUsNyArMTcyOCw4IEBACiAKIHNraXBfcnNuX2NoZWNrOgogCS8qIGFkZCB0aGUgcGVlciB0byB0aGUgZHJpdmVyIGFzIGEgInNldHVwIGluIHByb2dyZXNzIiBwZWVyICovCi0Jd3BhX3NtX3RkbHNfcGVlcl9hZGRzZXQoc20sIHBlZXItPmFkZHIsIDEsIDAsIE5VTEwsIDApOworCXdwYV9zbV90ZGxzX3BlZXJfYWRkc2V0KHNtLCBwZWVyLT5hZGRyLCAxLCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMLCAwLAorCQkJCU5VTEwsIDApOwogCiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJURExTOiBTZW5kaW5nIFRETFMgU2V0dXAgUmVzcG9uc2UgLyBUUEsgTTIiKTsKIAlpZiAod3BhX3RkbHNfc2VuZF90cGtfbTIoc20sIHNyY19hZGRyLCBkdG9rZW4sIGxua2lkLCBwZWVyKSA8IDApIHsKQEAgLTE2NzUsOSArMTc2OSwxMiBAQAogI2VuZGlmIC8qIENPTkZJR19URExTX1RFU1RJTkcgKi8KIAl9CiAKLQkvKiBhZGQgc3VwcG9ydGVkIHJhdGVzIGFuZCBjYXBhYmlsaXRpZXMgdG8gdGhlIFRETFMgcGVlciAqLworCS8qIGFkZCBzdXBwb3J0ZWQgcmF0ZXMsIGNhcGFiaWxpdGllcywgYW5kIHFvc19pbmZvIHRvIHRoZSBURExTIHBlZXIgKi8KIAl3cGFfc21fdGRsc19wZWVyX2FkZHNldChzbSwgcGVlci0+YWRkciwgMCwgcGVlci0+Y2FwYWJpbGl0eSwKLQkJCQlwZWVyLT5zdXBwX3JhdGVzLCBwZWVyLT5zdXBwX3JhdGVzX2xlbik7CisJCQkJcGVlci0+c3VwcF9yYXRlcywgcGVlci0+c3VwcF9yYXRlc19sZW4sCisJCQkJcGVlci0+aHRfY2FwYWJpbGl0aWVzLCBwZWVyLT52aHRfY2FwYWJpbGl0aWVzLAorCQkJCXBlZXItPnFvc19pbmZvLCBwZWVyLT5leHRfY2FwYWIsCisJCQkJcGVlci0+ZXh0X2NhcGFiX2xlbik7CiAKIAl3cGFfc21fdGRsc19vcGVyKHNtLCBURExTX0VOQUJMRV9MSU5LLCBwZWVyLT5hZGRyKTsKIH0KQEAgLTE3NzMsNiArMTg3MCwxNyBAQAogCWlmIChjb3B5X3N1cHBfcmF0ZXMoJmtkZSwgcGVlcikgPCAwKQogCQlnb3RvIGVycm9yOwogCisJaWYgKGNvcHlfcGVlcl9odF9jYXBhYigma2RlLCBwZWVyKSA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoY29weV9wZWVyX3ZodF9jYXBhYigma2RlLCBwZWVyKSA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoY29weV9wZWVyX2V4dF9jYXBhYigma2RlLCBwZWVyKSA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlwZWVyLT5xb3NfaW5mbyA9IGtkZS5xb3NpbmZvOworCiAJaWYgKCF3cGFfdGRsc19nZXRfcHJpdmFjeShzbSkpIHsKIAkJcGVlci0+cnNuaWVfcF9sZW4gPSAwOwogCQlwZWVyLT5jaXBoZXIgPSBXUEFfQ0lQSEVSX05PTkU7CkBAIC0yMDY5LDIzICsyMTc3LDE1IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQkvKiBGaW5kIGV4aXN0aW5nIGVudHJ5IGFuZCBpZiBmb3VuZCwgdXNlIHRoYXQgaW5zdGVhZCBvZiBhZGRpbmcKLQkgKiBhIG5ldyBvbmUgKi8KLQlmb3IgKHBlZXIgPSBzbS0+dGRsczsgcGVlcjsgcGVlciA9IHBlZXItPm5leHQpIHsKLQkJaWYgKG9zX21lbWNtcChwZWVyLT5hZGRyLCBhZGRyLCBFVEhfQUxFTikgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChwZWVyID09IE5VTEwpIHsKLQkJcGVlciA9IHdwYV90ZGxzX2FkZF9wZWVyKHNtLCBhZGRyKTsKLQkJaWYgKHBlZXIgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9CisJcGVlciA9IHdwYV90ZGxzX2FkZF9wZWVyKHNtLCBhZGRyLCBOVUxMKTsKKwlpZiAocGVlciA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CiAKIAlwZWVyLT5pbml0aWF0b3IgPSAxOwogCiAJLyogYWRkIHRoZSBwZWVyIHRvIHRoZSBkcml2ZXIgYXMgYSAic2V0dXAgaW4gcHJvZ3Jlc3MiIHBlZXIgKi8KLQl3cGFfc21fdGRsc19wZWVyX2FkZHNldChzbSwgcGVlci0+YWRkciwgMSwgMCwgTlVMTCwgMCk7CisJd3BhX3NtX3RkbHNfcGVlcl9hZGRzZXQoc20sIHBlZXItPmFkZHIsIDEsIDAsIE5VTEwsIDAsIE5VTEwsIE5VTEwsIDAsCisJCQkJTlVMTCwgMCk7CiAKIAlpZiAod3BhX3RkbHNfc2VuZF90cGtfbTEoc20sIHBlZXIpIDwgMCkgewogCQl3cGFfdGRsc19kaXNhYmxlX2xpbmsoc20sIHBlZXItPmFkZHIpOwpAQCAtMjA5NiwxMiArMjE5NiwxMiBAQAogfQogCiAKLWludCB3cGFfdGRsc19yZW5lZyhzdHJ1Y3Qgd3BhX3NtICpzbSwgY29uc3QgdTggKmFkZHIpCit2b2lkIHdwYV90ZGxzX3JlbW92ZShzdHJ1Y3Qgd3BhX3NtICpzbSwgY29uc3QgdTggKmFkZHIpCiB7CiAJc3RydWN0IHdwYV90ZGxzX3BlZXIgKnBlZXI7CiAKIAlpZiAoc20tPnRkbHNfZGlzYWJsZWQgfHwgIXNtLT50ZGxzX3N1cHBvcnRlZCkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm47CiAKIAlmb3IgKHBlZXIgPSBzbS0+dGRsczsgcGVlcjsgcGVlciA9IHBlZXItPm5leHQpIHsKIAkJaWYgKG9zX21lbWNtcChwZWVyLT5hZGRyLCBhZGRyLCBFVEhfQUxFTikgPT0gMCkKQEAgLTIxMDksNyArMjIwOSw3IEBACiAJfQogCiAJaWYgKHBlZXIgPT0gTlVMTCB8fCAhcGVlci0+dHBrX3N1Y2Nlc3MpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuOwogCiAJaWYgKHNtLT50ZGxzX2V4dGVybmFsX3NldHVwKSB7CiAJCS8qCkBAIC0yMTE4LDggKzIyMTgsNiBAQAogCQkgKi8KIAkJd3BhX3NtX3RkbHNfb3BlcihzbSwgVERMU19ESVNBQkxFX0xJTkssIHBlZXItPmFkZHIpOwogCX0KLQotCXJldHVybiB3cGFfdGRsc19zdGFydChzbSwgYWRkcik7CiB9CiAKIApAQCAtMjIzMiw2ICsyMzMwLDI4IEBACiB9CiAKIAordm9pZCB3cGFfdGRsc190ZWFyZG93bl9wZWVycyhzdHJ1Y3Qgd3BhX3NtICpzbSkKK3sKKwlzdHJ1Y3Qgd3BhX3RkbHNfcGVlciAqcGVlcjsKKworCXBlZXIgPSBzbS0+dGRsczsKKworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiVERMUzogVGVhciBkb3duIHBlZXJzIik7CisKKwl3aGlsZSAocGVlcikgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlRETFM6IFRlYXIgZG93biBwZWVyICIgTUFDU1RSLAorCQkJICAgTUFDMlNUUihwZWVyLT5hZGRyKSk7CisJCWlmIChzbS0+dGRsc19leHRlcm5hbF9zZXR1cCkKKwkJCXdwYV90ZGxzX3NlbmRfdGVhcmRvd24oc20sIHBlZXItPmFkZHIsCisJCQkJCSAgICAgICBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CisJCWVsc2UKKwkJCXdwYV9zbV90ZGxzX29wZXIoc20sIFRETFNfVEVBUkRPV04sIHBlZXItPmFkZHIpOworCisJCXBlZXIgPSBwZWVyLT5uZXh0OworCX0KK30KKworCiBzdGF0aWMgdm9pZCB3cGFfdGRsc19yZW1vdmVfcGVlcnMoc3RydWN0IHdwYV9zbSAqc20pCiB7CiAJc3RydWN0IHdwYV90ZGxzX3BlZXIgKnBlZXIsICp0bXA7CmRpZmYgLS1naXQgYS9zcmMvcnNuX3N1cHAvd3BhLmMgYi9zcmMvcnNuX3N1cHAvd3BhLmMKaW5kZXggNWNmMzJkZi4uZTUwNDA0YyAxMDA2NDQKLS0tIGEvc3JjL3Jzbl9zdXBwL3dwYS5jCisrKyBiL3NyYy9yc25fc3VwcC93cGEuYwpAQCAtNzgzLDcgKzc4Myw3IEBACiAJCQkgICAgcnNuX2llLCByc25faWVfbGVuKTsKIAl9CiAKLQl3cGFfc21fZGlzYXNzb2NpYXRlKHNtLCBXTEFOX1JFQVNPTl9JRV9JTl80V0FZX0RJRkZFUlMpOworCXdwYV9zbV9kZWF1dGhlbnRpY2F0ZShzbSwgV0xBTl9SRUFTT05fSUVfSU5fNFdBWV9ESUZGRVJTKTsKIH0KIAogCkBAIC0xODM2LDYgKzE4MzYsMTAgQEAKIAljYXNlIFdQQV9LRVlfTUdNVF9QU0tfU0hBMjU2OgogCQlyZXR1cm4gUlNOX0FVVEhfS0VZX01HTVRfUFNLX1NIQTI1NjsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLworCWNhc2UgV1BBX0tFWV9NR01UX0NDS006CisJCXJldHVybiAoc20tPnByb3RvID09IFdQQV9QUk9UT19SU04gPworCQkJUlNOX0FVVEhfS0VZX01HTVRfQ0NLTToKKwkJCVdQQV9BVVRIX0tFWV9NR01UX0NDS00pOwogCWNhc2UgV1BBX0tFWV9NR01UX1dQQV9OT05FOgogCQlyZXR1cm4gV1BBX0FVVEhfS0VZX01HTVRfTk9ORTsKIAlkZWZhdWx0OgpAQCAtMTkzMSwyNSArMTkzNSw0MCBAQAogCiAKIHN0YXRpYyB2b2lkIHdwYV9zbV9wbWtzYV9mcmVlX2NiKHN0cnVjdCByc25fcG1rc2FfY2FjaGVfZW50cnkgKmVudHJ5LAotCQkJCSB2b2lkICpjdHgsIGludCByZXBsYWNlKQorCQkJCSB2b2lkICpjdHgsIGVudW0gcG1rc2FfZnJlZV9yZWFzb24gcmVhc29uKQogewogCXN0cnVjdCB3cGFfc20gKnNtID0gY3R4OworCWludCBkZWF1dGggPSAwOwogCi0JaWYgKHNtLT5jdXJfcG1rc2EgPT0gZW50cnkgfHwKKwl3cGFfZGJnKHNtLT5jdHgtPm1zZ19jdHgsIE1TR19ERUJVRywgIlJTTjogUE1LU0EgY2FjaGUgZW50cnkgZnJlZV9jYjogIgorCQlNQUNTVFIgIiByZWFzb249JWQiLCBNQUMyU1RSKGVudHJ5LT5hYSksIHJlYXNvbik7CisKKwlpZiAoc20tPmN1cl9wbWtzYSA9PSBlbnRyeSkgeworCQl3cGFfZGJnKHNtLT5jdHgtPm1zZ19jdHgsIE1TR19ERUJVRywKKwkJCSJSU046ICVzIGN1cnJlbnQgUE1LU0EgZW50cnkiLAorCQkJcmVhc29uID09IFBNS1NBX1JFUExBQ0UgPyAicmVwbGFjZWQiIDogInJlbW92ZWQiKTsKKwkJcG1rc2FfY2FjaGVfY2xlYXJfY3VycmVudChzbSk7CisKKwkJLyoKKwkJICogSWYgYW4gZW50cnkgaXMgc2ltcGx5IGJlaW5nIHJlcGxhY2VkLCB0aGVyZSdzIG5vIG5lZWQgdG8KKwkJICogZGVhdXRoZW50aWNhdGUgYmVjYXVzZSBpdCB3aWxsIGJlIGltbWVkaWF0ZWx5IHJlLWFkZGVkLgorCQkgKiBUaGlzIGhhcHBlbnMgd2hlbiBFQVAgYXV0aGVudGljYXRpb24gaXMgY29tcGxldGVkIGFnYWluCisJCSAqIChyZWF1dGggb3IgZmFpbGVkIFBNS1NBIGNhY2hpbmcgYXR0ZW1wdCkuCisJCSAqLworCQlpZiAocmVhc29uICE9IFBNS1NBX1JFUExBQ0UpCisJCQlkZWF1dGggPSAxOworCX0KKworCWlmIChyZWFzb24gPT0gUE1LU0FfRVhQSVJFICYmCiAJICAgIChzbS0+cG1rX2xlbiA9PSBlbnRyeS0+cG1rX2xlbiAmJgogCSAgICAgb3NfbWVtY21wKHNtLT5wbWssIGVudHJ5LT5wbWssIHNtLT5wbWtfbGVuKSA9PSAwKSkgewogCQl3cGFfZGJnKHNtLT5jdHgtPm1zZ19jdHgsIE1TR19ERUJVRywKLQkJCSJSU046IHJlbW92ZWQgY3VycmVudCBQTUtTQSBlbnRyeSIpOwotCQlzbS0+Y3VyX3Bta3NhID0gTlVMTDsKKwkJCSJSU046IGRlYXV0aGVudGljYXRpbmcgZHVlIHRvIGV4cGlyZWQgUE1LIik7CisJCXBta3NhX2NhY2hlX2NsZWFyX2N1cnJlbnQoc20pOworCQlkZWF1dGggPSAxOworCX0KIAotCQlpZiAocmVwbGFjZSkgewotCQkJLyogQSBuZXcgZW50cnkgaXMgYmVpbmcgYWRkZWQsIHNvIG5vIG5lZWQgdG8KLQkJCSAqIGRlYXV0aGVudGljYXRlIGluIHRoaXMgY2FzZS4gVGhpcyBoYXBwZW5zIHdoZW4gRUFQCi0JCQkgKiBhdXRoZW50aWNhdGlvbiBpcyBjb21wbGV0ZWQgYWdhaW4gKHJlYXV0aCBvciBmYWlsZWQKLQkJCSAqIFBNS1NBIGNhY2hpbmcgYXR0ZW1wdCkuICovCi0JCQlyZXR1cm47Ci0JCX0KLQorCWlmIChkZWF1dGgpIHsKIAkJb3NfbWVtc2V0KHNtLT5wbWssIDAsIHNpemVvZihzbS0+cG1rKSk7CiAJCXdwYV9zbV9kZWF1dGhlbnRpY2F0ZShzbSwgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQpOwogCX0KQEAgLTIwODAsNiArMjA5OSw3IEBACiB2b2lkIHdwYV9zbV9ub3RpZnlfZGlzYXNzb2Moc3RydWN0IHdwYV9zbSAqc20pCiB7CiAJcnNuX3ByZWF1dGhfZGVpbml0KHNtKTsKKwlwbWtzYV9jYWNoZV9jbGVhcl9jdXJyZW50KHNtKTsKIAlpZiAod3BhX3NtX2dldF9zdGF0ZShzbSkgPT0gV1BBXzRXQVlfSEFORFNIQUtFKQogCQlzbS0+ZG90MTFSU05BNFdheUhhbmRzaGFrZUZhaWx1cmVzKys7CiAjaWZkZWYgQ09ORklHX1RETFMKQEAgLTIzNzIsNiArMjM5MiwyMiBAQAogCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCiAJCXJldHVybiBwb3MgLSBidWY7CiAJcG9zICs9IHJldDsKKworCWlmIChzbS0+bWZwICE9IE5PX01HTVRfRlJBTUVfUFJPVEVDVElPTiAmJiBzbS0+YXBfcnNuX2llKSB7CisJCXN0cnVjdCB3cGFfaWVfZGF0YSByc247CisJCWlmICh3cGFfcGFyc2Vfd3BhX2llX3JzbihzbS0+YXBfcnNuX2llLCBzbS0+YXBfcnNuX2llX2xlbiwgJnJzbikKKwkJICAgID49IDAgJiYKKwkJICAgIHJzbi5jYXBhYmlsaXRpZXMgJiAoV1BBX0NBUEFCSUxJVFlfTUZQUiB8CisJCQkJCVdQQV9DQVBBQklMSVRZX01GUEMpKSB7CisJCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgInBtZj0lZFxuIiwKKwkJCQkJICAocnNuLmNhcGFiaWxpdGllcyAmCisJCQkJCSAgIFdQQV9DQVBBQklMSVRZX01GUFIpID8gMiA6IDEpOworCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKKwkJCQlyZXR1cm4gcG9zIC0gYnVmOworCQkJcG9zICs9IHJldDsKKwkJfQorCX0KKwogCXJldHVybiBwb3MgLSBidWY7CiB9CiAKQEAgLTI1OTEsNyArMjYyNyw3IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCisjaWZkZWYgQ09ORklHX1dOTQogaW50IHdwYV93bm1zbGVlcF9pbnN0YWxsX2tleShzdHJ1Y3Qgd3BhX3NtICpzbSwgdTggc3ViZWxlbV9pZCwgdTggKmJ1ZikKIHsKIAlzdHJ1Y3Qgd3BhX2d0a19kYXRhIGdkOwpAQCAtMjYwMSw3ICsyNjM3LDYgQEAKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwogCXUxNiBrZXlpbmZvOwogCXU4IGtleWxlbjsgIC8qIHBsYWludGV4dCBrZXkgbGVuICovCi0JdTgga2V5ZGF0YWxlbjsKIAl1OCAqa2V5X3JzYzsKIAogCW9zX21lbXNldCgmZ2QsIDAsIHNpemVvZihnZCkpOwpAQCAtMjYxOSw4ICsyNjU0LDcgQEAKIAogCWlmIChzdWJlbGVtX2lkID09IFdOTV9TTEVFUF9TVUJFTEVNX0dUSykgewogCQlrZXlfcnNjID0gYnVmICsgNTsKLQkJa2V5aW5mbyA9IFdQQV9HRVRfTEUxNihidWYrMik7Ci0JCWtleWRhdGFsZW4gPSBidWZbMV0gLSAxMSAtIDg7CisJCWtleWluZm8gPSBXUEFfR0VUX0xFMTYoYnVmICsgMik7CiAJCWdkLmd0a19sZW4gPSBrZXlsZW47CiAJCWlmIChnZC5ndGtfbGVuICE9IGJ1Zls0XSkgewogCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJHVEsgbGVuIG1pc21hdGNoIGxlbiAlZCB2cyAlZCIsCkBAIC0yNjMxLDE4ICsyNjY1LDcgQEAKIAkJZ2QudHggPSB3cGFfc3VwcGxpY2FudF9ndGtfdHhfYml0X3dvcmthcm91bmQoCiAJCSAgICAgICAgIHNtLCAhIShrZXlpbmZvICYgV1BBX0tFWV9JTkZPX1RYUlgpKTsKIAotCQlpZiAoa2V5ZGF0YWxlbiAlIDgpIHsKLQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BBOiBVbnN1cHBvcnRlZCBBRVMtV1JBUCBsZW4gIgotCQkJCSAgICIlZCIsIGtleWRhdGFsZW4pOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaWYgKGFlc191bndyYXAoc20tPnB0ay5rZWssIGtleWRhdGFsZW4gLyA4LCBidWYgKyAxMywgZ2QuZ3RrKSkKLQkJewotCQkJd3BhX3ByaW50ZihNU0dfV0FSTklORywgIldOTTogQUVTIHVud3JhcCBmYWlsZWQgLSAiCi0JCQkJICAgImNvdWxkIG5vdCBkZWNyeXB0IEdUSyIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisJCW9zX21lbWNweShnZC5ndGssIGJ1ZiArIDEzLCBnZC5ndGtfbGVuKTsKIAogCQl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiSW5zdGFsbCBHVEsgKFdOTSBTTEVFUCkiLAogCQkJCWdkLmd0aywgZ2QuZ3RrX2xlbik7CkBAIC0yNjUzLDIyICsyNjc2LDExIEBACiAJCX0KICNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwogCX0gZWxzZSBpZiAoc3ViZWxlbV9pZCA9PSBXTk1fU0xFRVBfU1VCRUxFTV9JR1RLKSB7Ci0JCWlmIChidWZbMV0gIT0gMiArIDYgKyBXUEFfSUdUS19MRU4gKyA4KSB7Ci0JCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQQTogVW5zdXBwb3J0ZWQgQUVTLVdSQVAgbGVuICIKLQkJCQkgICAiJWQiLCBidWZbMV0gLSAyIC0gNiAtIDgpOwotCQkJcmV0dXJuIC0xOwotCQl9CiAJCW9zX21lbWNweShpZ2Qua2V5aWQsIGJ1ZiArIDIsIDIpOwogCQlvc19tZW1jcHkoaWdkLnBuLCBidWYgKyA0LCA2KTsKIAogCQlrZXlpZHggPSBXUEFfR0VUX0xFMTYoaWdkLmtleWlkKTsKLQotCQlpZiAoYWVzX3Vud3JhcChzbS0+cHRrLmtlaywgV1BBX0lHVEtfTEVOIC8gOCwgYnVmICsgMTAsCi0JCQkgICAgICAgaWdkLmlndGspKSB7Ci0JCQl3cGFfcHJpbnRmKE1TR19XQVJOSU5HLCAiV05NOiBBRVMgdW53cmFwIGZhaWxlZCAtICIKLQkJCQkgICAiY291bGQgbm90IGRlY3J5cHIgSUdUSyIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisJCW9zX21lbWNweShpZ2QuaWd0aywgYnVmICsgMTAsIFdQQV9JR1RLX0xFTik7CiAKIAkJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIkluc3RhbGwgSUdUSyAoV05NIFNMRUVQKSIsCiAJCQkJaWdkLmlndGssIFdQQV9JR1RLX0xFTik7CkBAIC0yNjg3LDQgKzI2OTksNCBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KKyNlbmRpZiAvKiBDT05GSUdfV05NICovCmRpZmYgLS1naXQgYS9zcmMvcnNuX3N1cHAvd3BhLmggYi9zcmMvcnNuX3N1cHAvd3BhLmgKaW5kZXggMTA3N2I1YS4uZGJiNDkzZSAxMDA2NDQKLS0tIGEvc3JjL3Jzbl9zdXBwL3dwYS5oCisrKyBiL3NyYy9yc25fc3VwcC93cGEuaApAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImNvbW1vbi9kZWZzLmgiCiAjaW5jbHVkZSAiY29tbW9uL2VhcG9sX2NvbW1vbi5oIgogI2luY2x1ZGUgImNvbW1vbi93cGFfY29tbW9uLmgiCisjaW5jbHVkZSAiY29tbW9uL2llZWU4MDJfMTFfZGVmcy5oIgogCiBzdHJ1Y3Qgd3BhX3NtOwogc3RydWN0IGVhcG9sX3NtOwpAQCAtMjQsNyArMjUsNiBAQAogCXZvaWQgKCpzZXRfc3RhdGUpKHZvaWQgKmN0eCwgZW51bSB3cGFfc3RhdGVzIHN0YXRlKTsKIAllbnVtIHdwYV9zdGF0ZXMgKCpnZXRfc3RhdGUpKHZvaWQgKmN0eCk7CiAJdm9pZCAoKmRlYXV0aGVudGljYXRlKSh2b2lkICogY3R4LCBpbnQgcmVhc29uX2NvZGUpOyAKLQl2b2lkICgqZGlzYXNzb2NpYXRlKSh2b2lkICpjdHgsIGludCByZWFzb25fY29kZSk7CiAJaW50ICgqc2V0X2tleSkodm9pZCAqY3R4LCBlbnVtIHdwYV9hbGcgYWxnLAogCQkgICAgICAgY29uc3QgdTggKmFkZHIsIGludCBrZXlfaWR4LCBpbnQgc2V0X3R4LAogCQkgICAgICAgY29uc3QgdTggKnNlcSwgc2l6ZV90IHNlcV9sZW4sCkBAIC01OCw3ICs1OCwxMSBAQAogCWludCAoKnRkbHNfb3Blcikodm9pZCAqY3R4LCBpbnQgb3BlciwgY29uc3QgdTggKnBlZXIpOwogCWludCAoKnRkbHNfcGVlcl9hZGRzZXQpKHZvaWQgKmN0eCwgY29uc3QgdTggKmFkZHIsIGludCBhZGQsCiAJCQkJdTE2IGNhcGFiaWxpdHksIGNvbnN0IHU4ICpzdXBwX3JhdGVzLAotCQkJCXNpemVfdCBzdXBwX3JhdGVzX2xlbik7CisJCQkJc2l6ZV90IHN1cHBfcmF0ZXNfbGVuLAorCQkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwYWJpbGl0aWVzICpodF9jYXBhYiwKKwkJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3ZodF9jYXBhYmlsaXRpZXMgKnZodF9jYXBhYiwKKwkJCQl1OCBxb3NpbmZvLCBjb25zdCB1OCAqZXh0X2NhcGFiLAorCQkJCXNpemVfdCBleHRfY2FwYWJfbGVuKTsKICNlbmRpZiAvKiBDT05GSUdfVERMUyAqLwogCXZvaWQgKCpzZXRfcmVrZXlfb2ZmbG9hZCkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2VrLCBjb25zdCB1OCAqa2NrLAogCQkJCSAgY29uc3QgdTggKnJlcGxheV9jdHIpOwpAQCAtMzU2LDE4ICszNjAsMTcgQEAKIHZvaWQgd3BhX3RkbHNfYXBfaWVzKHN0cnVjdCB3cGFfc20gKnNtLCBjb25zdCB1OCAqaWVzLCBzaXplX3QgbGVuKTsKIHZvaWQgd3BhX3RkbHNfYXNzb2NfcmVzcF9pZXMoc3RydWN0IHdwYV9zbSAqc20sIGNvbnN0IHU4ICppZXMsIHNpemVfdCBsZW4pOwogaW50IHdwYV90ZGxzX3N0YXJ0KHN0cnVjdCB3cGFfc20gKnNtLCBjb25zdCB1OCAqYWRkcik7Ci1pbnQgd3BhX3RkbHNfcmVuZWcoc3RydWN0IHdwYV9zbSAqc20sIGNvbnN0IHU4ICphZGRyKTsKK3ZvaWQgd3BhX3RkbHNfcmVtb3ZlKHN0cnVjdCB3cGFfc20gKnNtLCBjb25zdCB1OCAqYWRkcik7CiBpbnQgd3BhX3RkbHNfc2VuZF90ZWFyZG93bihzdHJ1Y3Qgd3BhX3NtICpzbSwgY29uc3QgdTggKmFkZHIsIHUxNiByZWFzb25fY29kZSk7CiBpbnQgd3BhX3RkbHNfdGVhcmRvd25fbGluayhzdHJ1Y3Qgd3BhX3NtICpzbSwgY29uc3QgdTggKmFkZHIsIHUxNiByZWFzb25fY29kZSk7CiBpbnQgd3BhX3RkbHNfc2VuZF9kaXNjb3ZlcnlfcmVxdWVzdChzdHJ1Y3Qgd3BhX3NtICpzbSwgY29uc3QgdTggKmFkZHIpOwogaW50IHdwYV90ZGxzX2luaXQoc3RydWN0IHdwYV9zbSAqc20pOwordm9pZCB3cGFfdGRsc190ZWFyZG93bl9wZWVycyhzdHJ1Y3Qgd3BhX3NtICpzbSk7CiB2b2lkIHdwYV90ZGxzX2RlaW5pdChzdHJ1Y3Qgd3BhX3NtICpzbSk7CiB2b2lkIHdwYV90ZGxzX2VuYWJsZShzdHJ1Y3Qgd3BhX3NtICpzbSwgaW50IGVuYWJsZWQpOwogdm9pZCB3cGFfdGRsc19kaXNhYmxlX2xpbmsoc3RydWN0IHdwYV9zbSAqc20sIGNvbnN0IHU4ICphZGRyKTsKIGludCB3cGFfdGRsc19pc19leHRlcm5hbF9zZXR1cChzdHJ1Y3Qgd3BhX3NtICpzbSk7CiAKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVgogaW50IHdwYV93bm1zbGVlcF9pbnN0YWxsX2tleShzdHJ1Y3Qgd3BhX3NtICpzbSwgdTggc3ViZWxlbV9pZCwgdTggKmJ1Zik7Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KIAogI2VuZGlmIC8qIFdQQV9IICovCmRpZmYgLS1naXQgYS9zcmMvcnNuX3N1cHAvd3BhX2kuaCBiL3NyYy9yc25fc3VwcC93cGFfaS5oCmluZGV4IGMzMGQwOWUuLjg3N2U2ZGUgMTAwNjQ0Ci0tLSBhL3NyYy9yc25fc3VwcC93cGFfaS5oCisrKyBiL3NyYy9yc25fc3VwcC93cGFfaS5oCkBAIC0xNDMsMTIgKzE0Myw2IEBACiAJc20tPmN0eC0+ZGVhdXRoZW50aWNhdGUoc20tPmN0eC0+Y3R4LCByZWFzb25fY29kZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3cGFfc21fZGlzYXNzb2NpYXRlKHN0cnVjdCB3cGFfc20gKnNtLCBpbnQgcmVhc29uX2NvZGUpCi17Ci0JV1BBX0FTU0VSVChzbS0+Y3R4LT5kaXNhc3NvY2lhdGUpOwotCXNtLT5jdHgtPmRpc2Fzc29jaWF0ZShzbS0+Y3R4LT5jdHgsIHJlYXNvbl9jb2RlKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgd3BhX3NtX3NldF9rZXkoc3RydWN0IHdwYV9zbSAqc20sIGVudW0gd3BhX2FsZyBhbGcsCiAJCQkJIGNvbnN0IHU4ICphZGRyLCBpbnQga2V5X2lkeCwgaW50IHNldF90eCwKIAkJCQkgY29uc3QgdTggKnNlcSwgc2l6ZV90IHNlcV9sZW4sCkBAIC0yODksMTIgKzI4MywxNyBAQAogc3RhdGljIGlubGluZSBpbnQKIHdwYV9zbV90ZGxzX3BlZXJfYWRkc2V0KHN0cnVjdCB3cGFfc20gKnNtLCBjb25zdCB1OCAqYWRkciwgaW50IGFkZCwKIAkJCXUxNiBjYXBhYmlsaXR5LCBjb25zdCB1OCAqc3VwcF9yYXRlcywKLQkJCXNpemVfdCBzdXBwX3JhdGVzX2xlbikKKwkJCXNpemVfdCBzdXBwX3JhdGVzX2xlbiwKKwkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwYWJpbGl0aWVzICpodF9jYXBhYiwKKwkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllcyAqdmh0X2NhcGFiLAorCQkJdTggcW9zaW5mbywgY29uc3QgdTggKmV4dF9jYXBhYiwgc2l6ZV90IGV4dF9jYXBhYl9sZW4pCiB7CiAJaWYgKHNtLT5jdHgtPnRkbHNfcGVlcl9hZGRzZXQpCiAJCXJldHVybiBzbS0+Y3R4LT50ZGxzX3BlZXJfYWRkc2V0KHNtLT5jdHgtPmN0eCwgYWRkciwgYWRkLAogCQkJCQkJIGNhcGFiaWxpdHksIHN1cHBfcmF0ZXMsCi0JCQkJCQkgc3VwcF9yYXRlc19sZW4pOworCQkJCQkJIHN1cHBfcmF0ZXNfbGVuLCBodF9jYXBhYiwKKwkJCQkJCSB2aHRfY2FwYWIsIHFvc2luZm8sCisJCQkJCQkgZXh0X2NhcGFiLCBleHRfY2FwYWJfbGVuKTsKIAlyZXR1cm4gLTE7CiB9CiAjZW5kaWYgLyogQ09ORklHX1RETFMgKi8KZGlmZiAtLWdpdCBhL3NyYy9yc25fc3VwcC93cGFfaWUuYyBiL3NyYy9yc25fc3VwcC93cGFfaWUuYwppbmRleCA2YThmOWYxLi42NTIxOTdmIDEwMDY0NAotLS0gYS9zcmMvcnNuX3N1cHAvd3BhX2llLmMKKysrIGIvc3JjL3Jzbl9zdXBwL3dwYV9pZS5jCkBAIC04Myw2ICs4Myw4IEBACiAJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBXUEFfQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVgpOwogCX0gZWxzZSBpZiAoa2V5X21nbXQgPT0gV1BBX0tFWV9NR01UX1dQQV9OT05FKSB7CiAJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBXUEFfQVVUSF9LRVlfTUdNVF9OT05FKTsKKwl9IGVsc2UgaWYgKGtleV9tZ210ID09IFdQQV9LRVlfTUdNVF9DQ0tNKSB7CisJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBXUEFfQVVUSF9LRVlfTUdNVF9DQ0tNKTsKIAl9IGVsc2UgewogCQl3cGFfcHJpbnRmKE1TR19XQVJOSU5HLCAiSW52YWxpZCBrZXkgbWFuYWdlbWVudCB0eXBlICglZCkuIiwKIAkJCSAgIGtleV9tZ210KTsKQEAgLTE1Miw2ICsxNTQsOCBAQAogCQlSU05fU0VMRUNUT1JfUFVUKHBvcywgUlNOX0FVVEhfS0VZX01HTVRfVU5TUEVDXzgwMl8xWCk7CiAJfSBlbHNlIGlmIChrZXlfbWdtdCA9PSBXUEFfS0VZX01HTVRfUFNLKSB7CiAJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBSU05fQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVgpOworCX0gZWxzZSBpZiAoa2V5X21nbXQgPT0gV1BBX0tFWV9NR01UX0NDS00pIHsKKwkJUlNOX1NFTEVDVE9SX1BVVChwb3MsIFJTTl9BVVRIX0tFWV9NR01UX0NDS00pOwogI2lmZGVmIENPTkZJR19JRUVFODAyMTFSCiAJfSBlbHNlIGlmIChrZXlfbWdtdCA9PSBXUEFfS0VZX01HTVRfRlRfSUVFRTgwMjFYKSB7CiAJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBSU05fQVVUSF9LRVlfTUdNVF9GVF84MDJfMVgpOwpAQCAtMTY0LDYgKzE2OCwxMiBAQAogCX0gZWxzZSBpZiAoa2V5X21nbXQgPT0gV1BBX0tFWV9NR01UX1BTS19TSEEyNTYpIHsKIAkJUlNOX1NFTEVDVE9SX1BVVChwb3MsIFJTTl9BVVRIX0tFWV9NR01UX1BTS19TSEEyNTYpOwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCisjaWZkZWYgQ09ORklHX1NBRQorCX0gZWxzZSBpZiAoa2V5X21nbXQgPT0gV1BBX0tFWV9NR01UX1NBRSkgeworCQlSU05fU0VMRUNUT1JfUFVUKHBvcywgUlNOX0FVVEhfS0VZX01HTVRfU0FFKTsKKwl9IGVsc2UgaWYgKGtleV9tZ210ID09IFdQQV9LRVlfTUdNVF9GVF9TQUUpIHsKKwkJUlNOX1NFTEVDVE9SX1BVVChwb3MsIFJTTl9BVVRIX0tFWV9NR01UX0ZUX1NBRSk7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCX0gZWxzZSB7CiAJCXdwYV9wcmludGYoTVNHX1dBUk5JTkcsICJJbnZhbGlkIGtleSBtYW5hZ2VtZW50IHR5cGUgKCVkKS4iLAogCQkJICAga2V5X21nbXQpOwpAQCAtNDE3LDYgKzQyNywxNCBAQAogCQl9IGVsc2UgaWYgKCpwb3MgPT0gV0xBTl9FSURfRVhUX1NVUFBfUkFURVMpIHsKIAkJCWllLT5leHRfc3VwcF9yYXRlcyA9IHBvczsKIAkJCWllLT5leHRfc3VwcF9yYXRlc19sZW4gPSBwb3NbMV0gKyAyOworCQl9IGVsc2UgaWYgKCpwb3MgPT0gV0xBTl9FSURfSFRfQ0FQKSB7CisJCQlpZS0+aHRfY2FwYWJpbGl0aWVzID0gcG9zICsgMjsKKwkJCWllLT5odF9jYXBhYmlsaXRpZXNfbGVuID0gcG9zWzFdOworCQl9IGVsc2UgaWYgKCpwb3MgPT0gV0xBTl9FSURfVkhUX0NBUCkgeworCQkJaWUtPnZodF9jYXBhYmlsaXRpZXMgPSBwb3MgKyAyOworCQkJaWUtPnZodF9jYXBhYmlsaXRpZXNfbGVuID0gcG9zWzFdOworCQl9IGVsc2UgaWYgKCpwb3MgPT0gV0xBTl9FSURfUU9TICYmIHBvc1sxXSA+PSAxKSB7CisJCQlpZS0+cW9zaW5mbyA9IHBvc1syXTsKIAkJfSBlbHNlIGlmICgqcG9zID09IFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQykgewogCQkJcmV0ID0gd3BhX3BhcnNlX2dlbmVyaWMocG9zLCBlbmQsIGllKTsKIAkJCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvc3JjL3Jzbl9zdXBwL3dwYV9pZS5oIGIvc3JjL3Jzbl9zdXBwL3dwYV9pZS5oCmluZGV4IDVhZmRmZTkuLjgyYTVjMDggMTAwNjQ0Ci0tLSBhL3NyYy9yc25fc3VwcC93cGFfaWUuaAorKysgYi9zcmMvcnNuX3N1cHAvd3BhX2llLmgKQEAgLTQ5LDYgKzQ5LDExIEBACiAJc2l6ZV90IHN1cHBfcmF0ZXNfbGVuOwogCWNvbnN0IHU4ICpleHRfc3VwcF9yYXRlczsKIAlzaXplX3QgZXh0X3N1cHBfcmF0ZXNfbGVuOworCWNvbnN0IHU4ICpodF9jYXBhYmlsaXRpZXM7CisJc2l6ZV90IGh0X2NhcGFiaWxpdGllc19sZW47CisJY29uc3QgdTggKnZodF9jYXBhYmlsaXRpZXM7CisJc2l6ZV90IHZodF9jYXBhYmlsaXRpZXNfbGVuOworCXU4IHFvc2luZm87CiB9OwogCiBpbnQgd3BhX3N1cHBsaWNhbnRfcGFyc2VfaWVzKGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sCmRpZmYgLS1naXQgYS9zcmMvdXRpbHMvY29tbW9uLmggYi9zcmMvdXRpbHMvY29tbW9uLmgKaW5kZXggNWZjOTE2Yy4uYTg1OTA0MiAxMDA2NDQKLS0tIGEvc3JjL3V0aWxzL2NvbW1vbi5oCisrKyBiL3NyYy91dGlscy9jb21tb24uaApAQCAtMjI0LDY5ICsyMjQsMTA1IEBACiAKIC8qIE1hY3JvcyBmb3IgaGFuZGxpbmcgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3NlcyAqLwogCi0jZGVmaW5lIFdQQV9HRVRfQkUxNihhKSAoKHUxNikgKCgoYSlbMF0gPDwgOCkgfCAoYSlbMV0pKQotI2RlZmluZSBXUEFfUFVUX0JFMTYoYSwgdmFsKQkJCVwKLQlkbyB7CQkJCQlcCi0JCShhKVswXSA9ICgodTE2KSAodmFsKSkgPj4gODsJXAotCQkoYSlbMV0gPSAoKHUxNikgKHZhbCkpICYgMHhmZjsJXAotCX0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHUxNiBXUEFfR0VUX0JFMTYoY29uc3QgdTggKmEpCit7CisJcmV0dXJuIChhWzBdIDw8IDgpIHwgYVsxXTsKK30KIAotI2RlZmluZSBXUEFfR0VUX0xFMTYoYSkgKCh1MTYpICgoKGEpWzFdIDw8IDgpIHwgKGEpWzBdKSkKLSNkZWZpbmUgV1BBX1BVVF9MRTE2KGEsIHZhbCkJCQlcCi0JZG8gewkJCQkJXAotCQkoYSlbMV0gPSAoKHUxNikgKHZhbCkpID4+IDg7CVwKLQkJKGEpWzBdID0gKCh1MTYpICh2YWwpKSAmIDB4ZmY7CVwKLQl9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSB2b2lkIFdQQV9QVVRfQkUxNih1OCAqYSwgdTE2IHZhbCkKK3sKKwlhWzBdID0gdmFsID4+IDg7CisJYVsxXSA9IHZhbCAmIDB4ZmY7Cit9CiAKLSNkZWZpbmUgV1BBX0dFVF9CRTI0KGEpICgoKCh1MzIpIChhKVswXSkgPDwgMTYpIHwgKCgodTMyKSAoYSlbMV0pIDw8IDgpIHwgXAotCQkJICgodTMyKSAoYSlbMl0pKQotI2RlZmluZSBXUEFfUFVUX0JFMjQoYSwgdmFsKQkJCQkJXAotCWRvIHsJCQkJCQkJXAotCQkoYSlbMF0gPSAodTgpICgoKCh1MzIpICh2YWwpKSA+PiAxNikgJiAweGZmKTsJXAotCQkoYSlbMV0gPSAodTgpICgoKCh1MzIpICh2YWwpKSA+PiA4KSAmIDB4ZmYpOwlcCi0JCShhKVsyXSA9ICh1OCkgKCgodTMyKSAodmFsKSkgJiAweGZmKTsJCVwKLQl9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSB1MTYgV1BBX0dFVF9MRTE2KGNvbnN0IHU4ICphKQoreworCXJldHVybiAoYVsxXSA8PCA4KSB8IGFbMF07Cit9CiAKLSNkZWZpbmUgV1BBX0dFVF9CRTMyKGEpICgoKCh1MzIpIChhKVswXSkgPDwgMjQpIHwgKCgodTMyKSAoYSlbMV0pIDw8IDE2KSB8IFwKLQkJCSAoKCh1MzIpIChhKVsyXSkgPDwgOCkgfCAoKHUzMikgKGEpWzNdKSkKLSNkZWZpbmUgV1BBX1BVVF9CRTMyKGEsIHZhbCkJCQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJKGEpWzBdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gMjQpICYgMHhmZik7CVwKLQkJKGEpWzFdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gMTYpICYgMHhmZik7CVwKLQkJKGEpWzJdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gOCkgJiAweGZmKTsJXAotCQkoYSlbM10gPSAodTgpICgoKHUzMikgKHZhbCkpICYgMHhmZik7CQlcCi0JfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBXUEFfUFVUX0xFMTYodTggKmEsIHUxNiB2YWwpCit7CisJYVsxXSA9IHZhbCA+PiA4OworCWFbMF0gPSB2YWwgJiAweGZmOworfQogCi0jZGVmaW5lIFdQQV9HRVRfTEUzMihhKSAoKCgodTMyKSAoYSlbM10pIDw8IDI0KSB8ICgoKHUzMikgKGEpWzJdKSA8PCAxNikgfCBcCi0JCQkgKCgodTMyKSAoYSlbMV0pIDw8IDgpIHwgKCh1MzIpIChhKVswXSkpCi0jZGVmaW5lIFdQQV9QVVRfTEUzMihhLCB2YWwpCQkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCShhKVszXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDI0KSAmIDB4ZmYpOwlcCi0JCShhKVsyXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDE2KSAmIDB4ZmYpOwlcCi0JCShhKVsxXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDgpICYgMHhmZik7CVwKLQkJKGEpWzBdID0gKHU4KSAoKCh1MzIpICh2YWwpKSAmIDB4ZmYpOwkJXAotCX0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHUzMiBXUEFfR0VUX0JFMjQoY29uc3QgdTggKmEpCit7CisJcmV0dXJuIChhWzBdIDw8IDE2KSB8IChhWzFdIDw8IDgpIHwgYVsyXTsKK30KIAotI2RlZmluZSBXUEFfR0VUX0JFNjQoYSkgKCgoKHU2NCkgKGEpWzBdKSA8PCA1NikgfCAoKCh1NjQpIChhKVsxXSkgPDwgNDgpIHwgXAotCQkJICgoKHU2NCkgKGEpWzJdKSA8PCA0MCkgfCAoKCh1NjQpIChhKVszXSkgPDwgMzIpIHwgXAotCQkJICgoKHU2NCkgKGEpWzRdKSA8PCAyNCkgfCAoKCh1NjQpIChhKVs1XSkgPDwgMTYpIHwgXAotCQkJICgoKHU2NCkgKGEpWzZdKSA8PCA4KSB8ICgodTY0KSAoYSlbN10pKQotI2RlZmluZSBXUEFfUFVUX0JFNjQoYSwgdmFsKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJKGEpWzBdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA1Nik7CVwKLQkJKGEpWzFdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA0OCk7CVwKLQkJKGEpWzJdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA0MCk7CVwKLQkJKGEpWzNdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiAzMik7CVwKLQkJKGEpWzRdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiAyNCk7CVwKLQkJKGEpWzVdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiAxNik7CVwKLQkJKGEpWzZdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA4KTsJXAotCQkoYSlbN10gPSAodTgpICgoKHU2NCkgKHZhbCkpICYgMHhmZik7CVwKLQl9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSB2b2lkIFdQQV9QVVRfQkUyNCh1OCAqYSwgdTMyIHZhbCkKK3sKKwlhWzBdID0gKHZhbCA+PiAxNikgJiAweGZmOworCWFbMV0gPSAodmFsID4+IDgpICYgMHhmZjsKKwlhWzJdID0gdmFsICYgMHhmZjsKK30KIAotI2RlZmluZSBXUEFfR0VUX0xFNjQoYSkgKCgoKHU2NCkgKGEpWzddKSA8PCA1NikgfCAoKCh1NjQpIChhKVs2XSkgPDwgNDgpIHwgXAotCQkJICgoKHU2NCkgKGEpWzVdKSA8PCA0MCkgfCAoKCh1NjQpIChhKVs0XSkgPDwgMzIpIHwgXAotCQkJICgoKHU2NCkgKGEpWzNdKSA8PCAyNCkgfCAoKCh1NjQpIChhKVsyXSkgPDwgMTYpIHwgXAotCQkJICgoKHU2NCkgKGEpWzFdKSA8PCA4KSB8ICgodTY0KSAoYSlbMF0pKQorc3RhdGljIGlubGluZSB1MzIgV1BBX0dFVF9CRTMyKGNvbnN0IHU4ICphKQoreworCXJldHVybiAoYVswXSA8PCAyNCkgfCAoYVsxXSA8PCAxNikgfCAoYVsyXSA8PCA4KSB8IGFbM107Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBXUEFfUFVUX0JFMzIodTggKmEsIHUzMiB2YWwpCit7CisJYVswXSA9ICh2YWwgPj4gMjQpICYgMHhmZjsKKwlhWzFdID0gKHZhbCA+PiAxNikgJiAweGZmOworCWFbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKKwlhWzNdID0gdmFsICYgMHhmZjsKK30KKworc3RhdGljIGlubGluZSB1MzIgV1BBX0dFVF9MRTMyKGNvbnN0IHU4ICphKQoreworCXJldHVybiAoYVszXSA8PCAyNCkgfCAoYVsyXSA8PCAxNikgfCAoYVsxXSA8PCA4KSB8IGFbMF07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBXUEFfUFVUX0xFMzIodTggKmEsIHUzMiB2YWwpCit7CisJYVszXSA9ICh2YWwgPj4gMjQpICYgMHhmZjsKKwlhWzJdID0gKHZhbCA+PiAxNikgJiAweGZmOworCWFbMV0gPSAodmFsID4+IDgpICYgMHhmZjsKKwlhWzBdID0gdmFsICYgMHhmZjsKK30KKworc3RhdGljIGlubGluZSB1NjQgV1BBX0dFVF9CRTY0KGNvbnN0IHU4ICphKQoreworCXJldHVybiAoKCh1NjQpIGFbMF0pIDw8IDU2KSB8ICgoKHU2NCkgYVsxXSkgPDwgNDgpIHwKKwkJKCgodTY0KSBhWzJdKSA8PCA0MCkgfCAoKCh1NjQpIGFbM10pIDw8IDMyKSB8CisJCSgoKHU2NCkgYVs0XSkgPDwgMjQpIHwgKCgodTY0KSBhWzVdKSA8PCAxNikgfAorCQkoKCh1NjQpIGFbNl0pIDw8IDgpIHwgKCh1NjQpIGFbN10pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgV1BBX1BVVF9CRTY0KHU4ICphLCB1NjQgdmFsKQoreworCWFbMF0gPSB2YWwgPj4gNTY7CisJYVsxXSA9IHZhbCA+PiA0ODsKKwlhWzJdID0gdmFsID4+IDQwOworCWFbM10gPSB2YWwgPj4gMzI7CisJYVs0XSA9IHZhbCA+PiAyNDsKKwlhWzVdID0gdmFsID4+IDE2OworCWFbNl0gPSB2YWwgPj4gODsKKwlhWzddID0gdmFsICYgMHhmZjsKK30KKworc3RhdGljIGlubGluZSB1NjQgV1BBX0dFVF9MRTY0KGNvbnN0IHU4ICphKQoreworCXJldHVybiAoKCh1NjQpIGFbN10pIDw8IDU2KSB8ICgoKHU2NCkgYVs2XSkgPDwgNDgpIHwKKwkJKCgodTY0KSBhWzVdKSA8PCA0MCkgfCAoKCh1NjQpIGFbNF0pIDw8IDMyKSB8CisJCSgoKHU2NCkgYVszXSkgPDwgMjQpIHwgKCgodTY0KSBhWzJdKSA8PCAxNikgfAorCQkoKCh1NjQpIGFbMV0pIDw8IDgpIHwgKCh1NjQpIGFbMF0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgV1BBX1BVVF9MRTY0KHU4ICphLCB1NjQgdmFsKQoreworCWFbN10gPSB2YWwgPj4gNTY7CisJYVs2XSA9IHZhbCA+PiA0ODsKKwlhWzVdID0gdmFsID4+IDQwOworCWFbNF0gPSB2YWwgPj4gMzI7CisJYVszXSA9IHZhbCA+PiAyNDsKKwlhWzJdID0gdmFsID4+IDE2OworCWFbMV0gPSB2YWwgPj4gODsKKwlhWzBdID0gdmFsICYgMHhmZjsKK30KIAogCiAjaWZuZGVmIEVUSF9BTEVOCmRpZmYgLS1naXQgYS9zcmMvdXRpbHMvZWxvb3AuYyBiL3NyYy91dGlscy9lbG9vcC5jCmluZGV4IGQwMWFlNjQuLjJkZTNlMDEgMTAwNjQ0Ci0tLSBhL3NyYy91dGlscy9lbG9vcC5jCisrKyBiL3NyYy91dGlscy9lbG9vcC5jCkBAIC01NTYsNiArNTU2LDMzIEBACiB9CiAKIAoraW50IGVsb29wX2NhbmNlbF90aW1lb3V0X29uZShlbG9vcF90aW1lb3V0X2hhbmRsZXIgaGFuZGxlciwKKwkJCSAgICAgdm9pZCAqZWxvb3BfZGF0YSwgdm9pZCAqdXNlcl9kYXRhLAorCQkJICAgICBzdHJ1Y3Qgb3NfdGltZSAqcmVtYWluaW5nKQoreworCXN0cnVjdCBlbG9vcF90aW1lb3V0ICp0aW1lb3V0LCAqcHJldjsKKwlpbnQgcmVtb3ZlZCA9IDA7CisJc3RydWN0IG9zX3RpbWUgbm93OworCisJb3NfZ2V0X3RpbWUoJm5vdyk7CisJcmVtYWluaW5nLT5zZWMgPSByZW1haW5pbmctPnVzZWMgPSAwOworCisJZGxfbGlzdF9mb3JfZWFjaF9zYWZlKHRpbWVvdXQsIHByZXYsICZlbG9vcC50aW1lb3V0LAorCQkJICAgICAgc3RydWN0IGVsb29wX3RpbWVvdXQsIGxpc3QpIHsKKwkJaWYgKHRpbWVvdXQtPmhhbmRsZXIgPT0gaGFuZGxlciAmJgorCQkgICAgKHRpbWVvdXQtPmVsb29wX2RhdGEgPT0gZWxvb3BfZGF0YSkgJiYKKwkJICAgICh0aW1lb3V0LT51c2VyX2RhdGEgPT0gdXNlcl9kYXRhKSkgeworCQkJcmVtb3ZlZCA9IDE7CisJCQlpZiAob3NfdGltZV9iZWZvcmUoJm5vdywgJnRpbWVvdXQtPnRpbWUpKQorCQkJCW9zX3RpbWVfc3ViKCZ0aW1lb3V0LT50aW1lLCAmbm93LCByZW1haW5pbmcpOworCQkJZWxvb3BfcmVtb3ZlX3RpbWVvdXQodGltZW91dCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmVtb3ZlZDsKK30KKworCiBpbnQgZWxvb3BfaXNfdGltZW91dF9yZWdpc3RlcmVkKGVsb29wX3RpbWVvdXRfaGFuZGxlciBoYW5kbGVyLAogCQkJCXZvaWQgKmVsb29wX2RhdGEsIHZvaWQgKnVzZXJfZGF0YSkKIHsKZGlmZiAtLWdpdCBhL3NyYy91dGlscy9lbG9vcC5oIGIvc3JjL3V0aWxzL2Vsb29wLmgKaW5kZXggZGIwM2E3My4uMDAzN2M2MyAxMDA2NDQKLS0tIGEvc3JjL3V0aWxzL2Vsb29wLmgKKysrIGIvc3JjL3V0aWxzL2Vsb29wLmgKQEAgLTE5NSw2ICsxOTUsMjEgQEAKIAkJCSB2b2lkICplbG9vcF9kYXRhLCB2b2lkICp1c2VyX2RhdGEpOwogCiAvKioKKyAqIGVsb29wX2NhbmNlbF90aW1lb3V0X29uZSAtIENhbmNlbCBhIHNpbmdsZSB0aW1lb3V0CisgKiBAaGFuZGxlcjogTWF0Y2hpbmcgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBlbG9vcF9kYXRhOiBNYXRjaGluZyBlbG9vcF9kYXRhCisgKiBAdXNlcl9kYXRhOiBNYXRjaGluZyB1c2VyX2RhdGEKKyAqIEByZW1haW5pbmc6IFRpbWUgbGVmdCBvbiB0aGUgY2FuY2VsbGVkIHRpbWVyCisgKiBSZXR1cm5zOiBOdW1iZXIgb2YgY2FuY2VsbGVkIHRpbWVvdXRzCisgKgorICogQ2FuY2VsIG1hdGNoaW5nIDxoYW5kbGVyLGVsb29wX2RhdGEsdXNlcl9kYXRhPiB0aW1lb3V0IHJlZ2lzdGVyZWQgd2l0aAorICogZWxvb3BfcmVnaXN0ZXJfdGltZW91dCgpIGFuZCByZXR1cm4gdGhlIHJlbWFpbmluZyB0aW1lIGxlZnQuCisgKi8KK2ludCBlbG9vcF9jYW5jZWxfdGltZW91dF9vbmUoZWxvb3BfdGltZW91dF9oYW5kbGVyIGhhbmRsZXIsCisJCQkgICAgIHZvaWQgKmVsb29wX2RhdGEsIHZvaWQgKnVzZXJfZGF0YSwKKwkJCSAgICAgc3RydWN0IG9zX3RpbWUgKnJlbWFpbmluZyk7CisKKy8qKgogICogZWxvb3BfaXNfdGltZW91dF9yZWdpc3RlcmVkIC0gQ2hlY2sgaWYgYSB0aW1lb3V0IGlzIGFscmVhZHkgcmVnaXN0ZXJlZAogICogQGhhbmRsZXI6IE1hdGNoaW5nIGNhbGxiYWNrIGZ1bmN0aW9uCiAgKiBAZWxvb3BfZGF0YTogTWF0Y2hpbmcgZWxvb3BfZGF0YQpkaWZmIC0tZ2l0IGEvc3JjL3V0aWxzL2Vsb29wX25vbmUuYyBiL3NyYy91dGlscy9lbG9vcF9ub25lLmMKaW5kZXggYzY3ZWNlNC4uY2I1ZTkyMiAxMDA2NDQKLS0tIGEvc3JjL3V0aWxzL2Vsb29wX25vbmUuYworKysgYi9zcmMvdXRpbHMvZWxvb3Bfbm9uZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIEV2ZW50IGxvb3AgLSBlbXB0eSB0ZW1wbGF0ZSAoYmFzaWMgc3RydWN0dXJlLCBidXQgbm8gT1Mgc3BlY2lmaWMgb3BlcmF0aW9ucykKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDksIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KICAqIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSAiaW5jbHVkZXMuaCIKIAogI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImxpc3QuaCIKICNpbmNsdWRlICJlbG9vcC5oIgogCiAKQEAgLTE2LDIxICsxNywyMSBAQAogCWludCBzb2NrOwogCXZvaWQgKmVsb29wX2RhdGE7CiAJdm9pZCAqdXNlcl9kYXRhOwotCXZvaWQgKCpoYW5kbGVyKShpbnQgc29jaywgdm9pZCAqZWxvb3BfY3R4LCB2b2lkICpzb2NrX2N0eCk7CisJZWxvb3Bfc29ja19oYW5kbGVyIGhhbmRsZXI7CiB9OwogCiBzdHJ1Y3QgZWxvb3BfdGltZW91dCB7CisJc3RydWN0IGRsX2xpc3QgbGlzdDsKIAlzdHJ1Y3Qgb3NfdGltZSB0aW1lOwogCXZvaWQgKmVsb29wX2RhdGE7CiAJdm9pZCAqdXNlcl9kYXRhOwotCXZvaWQgKCpoYW5kbGVyKSh2b2lkICplbG9vcF9jdHgsIHZvaWQgKnNvY2tfY3R4KTsKLQlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqbmV4dDsKKwllbG9vcF90aW1lb3V0X2hhbmRsZXIgaGFuZGxlcjsKIH07CiAKIHN0cnVjdCBlbG9vcF9zaWduYWwgewogCWludCBzaWc7CiAJdm9pZCAqdXNlcl9kYXRhOwotCXZvaWQgKCpoYW5kbGVyKShpbnQgc2lnLCB2b2lkICplbG9vcF9jdHgsIHZvaWQgKnNpZ25hbF9jdHgpOworCWVsb29wX3NpZ25hbF9oYW5kbGVyIGhhbmRsZXI7CiAJaW50IHNpZ25hbGVkOwogfTsKIApAQCAtMzgsNyArMzksNyBAQAogCWludCBtYXhfc29jaywgcmVhZGVyX2NvdW50OwogCXN0cnVjdCBlbG9vcF9zb2NrICpyZWFkZXJzOwogCi0Jc3RydWN0IGVsb29wX3RpbWVvdXQgKnRpbWVvdXQ7CisJc3RydWN0IGRsX2xpc3QgdGltZW91dDsKIAogCWludCBzaWduYWxfY291bnQ7CiAJc3RydWN0IGVsb29wX3NpZ25hbCAqc2lnbmFsczsKQEAgLTU0LDIxICs1NSwxOSBAQAogCiBpbnQgZWxvb3BfaW5pdCh2b2lkKQogewotCW1lbXNldCgmZWxvb3AsIDAsIHNpemVvZihlbG9vcCkpOworCW9zX21lbXNldCgmZWxvb3AsIDAsIHNpemVvZihlbG9vcCkpOworCWRsX2xpc3RfaW5pdCgmZWxvb3AudGltZW91dCk7CiAJcmV0dXJuIDA7CiB9CiAKIAotaW50IGVsb29wX3JlZ2lzdGVyX3JlYWRfc29jayhpbnQgc29jaywKLQkJCSAgICAgdm9pZCAoKmhhbmRsZXIpKGludCBzb2NrLCB2b2lkICplbG9vcF9jdHgsCi0JCQkJCSAgICAgdm9pZCAqc29ja19jdHgpLAoraW50IGVsb29wX3JlZ2lzdGVyX3JlYWRfc29jayhpbnQgc29jaywgZWxvb3Bfc29ja19oYW5kbGVyIGhhbmRsZXIsCiAJCQkgICAgIHZvaWQgKmVsb29wX2RhdGEsIHZvaWQgKnVzZXJfZGF0YSkKIHsKIAlzdHJ1Y3QgZWxvb3Bfc29jayAqdG1wOwogCi0JdG1wID0gKHN0cnVjdCBlbG9vcF9zb2NrICopCi0JCXJlYWxsb2MoZWxvb3AucmVhZGVycywKLQkJCShlbG9vcC5yZWFkZXJfY291bnQgKyAxKSAqIHNpemVvZihzdHJ1Y3QgZWxvb3Bfc29jaykpOworCXRtcCA9IG9zX3JlYWxsb2NfYXJyYXkoZWxvb3AucmVhZGVycywgZWxvb3AucmVhZGVyX2NvdW50ICsgMSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGVsb29wX3NvY2spKTsKIAlpZiAodG1wID09IE5VTEwpCiAJCXJldHVybiAtMTsKIApAQCAtMTAwLDkgKzk5LDkgQEAKIAlpZiAoaSA9PSBlbG9vcC5yZWFkZXJfY291bnQpCiAJCXJldHVybjsKIAlpZiAoaSAhPSBlbG9vcC5yZWFkZXJfY291bnQgLSAxKSB7Ci0JCW1lbW1vdmUoJmVsb29wLnJlYWRlcnNbaV0sICZlbG9vcC5yZWFkZXJzW2kgKyAxXSwKLQkJCShlbG9vcC5yZWFkZXJfY291bnQgLSBpIC0gMSkgKgotCQkJc2l6ZW9mKHN0cnVjdCBlbG9vcF9zb2NrKSk7CisJCW9zX21lbW1vdmUoJmVsb29wLnJlYWRlcnNbaV0sICZlbG9vcC5yZWFkZXJzW2kgKyAxXSwKKwkJCSAgIChlbG9vcC5yZWFkZXJfY291bnQgLSBpIC0gMSkgKgorCQkJICAgc2l6ZW9mKHN0cnVjdCBlbG9vcF9zb2NrKSk7CiAJfQogCWVsb29wLnJlYWRlcl9jb3VudC0tOwogCWVsb29wLnJlYWRlcl90YWJsZV9jaGFuZ2VkID0gMTsKQEAgLTExMCwxNiArMTA5LDMxIEBACiAKIAogaW50IGVsb29wX3JlZ2lzdGVyX3RpbWVvdXQodW5zaWduZWQgaW50IHNlY3MsIHVuc2lnbmVkIGludCB1c2VjcywKLQkJCSAgIHZvaWQgKCpoYW5kbGVyKSh2b2lkICplbG9vcF9jdHgsIHZvaWQgKnRpbWVvdXRfY3R4KSwKKwkJCSAgIGVsb29wX3RpbWVvdXRfaGFuZGxlciBoYW5kbGVyLAogCQkJICAgdm9pZCAqZWxvb3BfZGF0YSwgdm9pZCAqdXNlcl9kYXRhKQogewotCXN0cnVjdCBlbG9vcF90aW1lb3V0ICp0aW1lb3V0LCAqdG1wLCAqcHJldjsKKwlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqdGltZW91dCwgKnRtcDsKKwlvc190aW1lX3Qgbm93X3NlYzsKIAotCXRpbWVvdXQgPSAoc3RydWN0IGVsb29wX3RpbWVvdXQgKikgbWFsbG9jKHNpemVvZigqdGltZW91dCkpOworCXRpbWVvdXQgPSBvc196YWxsb2Moc2l6ZW9mKCp0aW1lb3V0KSk7CiAJaWYgKHRpbWVvdXQgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwotCW9zX2dldF90aW1lKCZ0aW1lb3V0LT50aW1lKTsKKwlpZiAob3NfZ2V0X3RpbWUoJnRpbWVvdXQtPnRpbWUpIDwgMCkgeworCQlvc19mcmVlKHRpbWVvdXQpOworCQlyZXR1cm4gLTE7CisJfQorCW5vd19zZWMgPSB0aW1lb3V0LT50aW1lLnNlYzsKIAl0aW1lb3V0LT50aW1lLnNlYyArPSBzZWNzOworCWlmICh0aW1lb3V0LT50aW1lLnNlYyA8IG5vd19zZWMpIHsKKwkJLyoKKwkJICogSW50ZWdlciBvdmVyZmxvdyAtIGFzc3VtZSBsb25nIGVub3VnaCB0aW1lb3V0IHRvIGJlIGFzc3VtZWQKKwkJICogdG8gYmUgaW5maW5pdGUsIGkuZS4sIHRoZSB0aW1lb3V0IHdvdWxkIG5ldmVyIGhhcHBlbi4KKwkJICovCisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiRUxPT1A6IFRvbyBsb25nIHRpbWVvdXQgKHNlY3M9JXUpIHRvICIKKwkJCSAgICJldmVyIGhhcHBlbiAtIGlnbm9yZSBpdCIsIHNlY3MpOworCQlvc19mcmVlKHRpbWVvdXQpOworCQlyZXR1cm4gMDsKKwl9CiAJdGltZW91dC0+dGltZS51c2VjICs9IHVzZWNzOwogCXdoaWxlICh0aW1lb3V0LT50aW1lLnVzZWMgPj0gMTAwMDAwMCkgewogCQl0aW1lb3V0LT50aW1lLnNlYysrOwpAQCAtMTI4LDgwICsxNDIsODYgQEAKIAl0aW1lb3V0LT5lbG9vcF9kYXRhID0gZWxvb3BfZGF0YTsKIAl0aW1lb3V0LT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CiAJdGltZW91dC0+aGFuZGxlciA9IGhhbmRsZXI7Ci0JdGltZW91dC0+bmV4dCA9IE5VTEw7CiAKLQlpZiAoZWxvb3AudGltZW91dCA9PSBOVUxMKSB7Ci0JCWVsb29wLnRpbWVvdXQgPSB0aW1lb3V0OwotCQlyZXR1cm4gMDsKKwkvKiBNYWludGFpbiB0aW1lb3V0cyBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHRpbWUgKi8KKwlkbF9saXN0X2Zvcl9lYWNoKHRtcCwgJmVsb29wLnRpbWVvdXQsIHN0cnVjdCBlbG9vcF90aW1lb3V0LCBsaXN0KSB7CisJCWlmIChvc190aW1lX2JlZm9yZSgmdGltZW91dC0+dGltZSwgJnRtcC0+dGltZSkpIHsKKwkJCWRsX2xpc3RfYWRkKHRtcC0+bGlzdC5wcmV2LCAmdGltZW91dC0+bGlzdCk7CisJCQlyZXR1cm4gMDsKKwkJfQogCX0KLQotCXByZXYgPSBOVUxMOwotCXRtcCA9IGVsb29wLnRpbWVvdXQ7Ci0Jd2hpbGUgKHRtcCAhPSBOVUxMKSB7Ci0JCWlmIChvc190aW1lX2JlZm9yZSgmdGltZW91dC0+dGltZSwgJnRtcC0+dGltZSkpCi0JCQlicmVhazsKLQkJcHJldiA9IHRtcDsKLQkJdG1wID0gdG1wLT5uZXh0OwotCX0KLQotCWlmIChwcmV2ID09IE5VTEwpIHsKLQkJdGltZW91dC0+bmV4dCA9IGVsb29wLnRpbWVvdXQ7Ci0JCWVsb29wLnRpbWVvdXQgPSB0aW1lb3V0OwotCX0gZWxzZSB7Ci0JCXRpbWVvdXQtPm5leHQgPSBwcmV2LT5uZXh0OwotCQlwcmV2LT5uZXh0ID0gdGltZW91dDsKLQl9CisJZGxfbGlzdF9hZGRfdGFpbCgmZWxvb3AudGltZW91dCwgJnRpbWVvdXQtPmxpc3QpOwogCiAJcmV0dXJuIDA7CiB9CiAKIAotaW50IGVsb29wX2NhbmNlbF90aW1lb3V0KHZvaWQgKCpoYW5kbGVyKSh2b2lkICplbG9vcF9jdHgsIHZvaWQgKnNvY2tfY3R4KSwKK3N0YXRpYyB2b2lkIGVsb29wX3JlbW92ZV90aW1lb3V0KHN0cnVjdCBlbG9vcF90aW1lb3V0ICp0aW1lb3V0KQoreworCWRsX2xpc3RfZGVsKCZ0aW1lb3V0LT5saXN0KTsKKwlvc19mcmVlKHRpbWVvdXQpOworfQorCisKK2ludCBlbG9vcF9jYW5jZWxfdGltZW91dChlbG9vcF90aW1lb3V0X2hhbmRsZXIgaGFuZGxlciwKIAkJCSB2b2lkICplbG9vcF9kYXRhLCB2b2lkICp1c2VyX2RhdGEpCiB7Ci0Jc3RydWN0IGVsb29wX3RpbWVvdXQgKnRpbWVvdXQsICpwcmV2LCAqbmV4dDsKKwlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqdGltZW91dCwgKnByZXY7CiAJaW50IHJlbW92ZWQgPSAwOwogCi0JcHJldiA9IE5VTEw7Ci0JdGltZW91dCA9IGVsb29wLnRpbWVvdXQ7Ci0Jd2hpbGUgKHRpbWVvdXQgIT0gTlVMTCkgewotCQluZXh0ID0gdGltZW91dC0+bmV4dDsKLQorCWRsX2xpc3RfZm9yX2VhY2hfc2FmZSh0aW1lb3V0LCBwcmV2LCAmZWxvb3AudGltZW91dCwKKwkJCSAgICAgIHN0cnVjdCBlbG9vcF90aW1lb3V0LCBsaXN0KSB7CiAJCWlmICh0aW1lb3V0LT5oYW5kbGVyID09IGhhbmRsZXIgJiYKIAkJICAgICh0aW1lb3V0LT5lbG9vcF9kYXRhID09IGVsb29wX2RhdGEgfHwKIAkJICAgICBlbG9vcF9kYXRhID09IEVMT09QX0FMTF9DVFgpICYmCiAJCSAgICAodGltZW91dC0+dXNlcl9kYXRhID09IHVzZXJfZGF0YSB8fAogCQkgICAgIHVzZXJfZGF0YSA9PSBFTE9PUF9BTExfQ1RYKSkgewotCQkJaWYgKHByZXYgPT0gTlVMTCkKLQkJCQllbG9vcC50aW1lb3V0ID0gbmV4dDsKLQkJCWVsc2UKLQkJCQlwcmV2LT5uZXh0ID0gbmV4dDsKLQkJCWZyZWUodGltZW91dCk7CisJCQllbG9vcF9yZW1vdmVfdGltZW91dCh0aW1lb3V0KTsKIAkJCXJlbW92ZWQrKzsKLQkJfSBlbHNlCi0JCQlwcmV2ID0gdGltZW91dDsKLQotCQl0aW1lb3V0ID0gbmV4dDsKKwkJfQogCX0KIAogCXJldHVybiByZW1vdmVkOwogfQogCiAKLWludCBlbG9vcF9pc190aW1lb3V0X3JlZ2lzdGVyZWQodm9pZCAoKmhhbmRsZXIpKHZvaWQgKmVsb29wX2N0eCwKLQkJCQkJCXZvaWQgKnRpbWVvdXRfY3R4KSwKK2ludCBlbG9vcF9jYW5jZWxfdGltZW91dF9vbmUoZWxvb3BfdGltZW91dF9oYW5kbGVyIGhhbmRsZXIsCisJCQkgICAgIHZvaWQgKmVsb29wX2RhdGEsIHZvaWQgKnVzZXJfZGF0YSwKKwkJCSAgICAgc3RydWN0IG9zX3RpbWUgKnJlbWFpbmluZykKK3sKKwlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqdGltZW91dCwgKnByZXY7CisJaW50IHJlbW92ZWQgPSAwOworCXN0cnVjdCBvc190aW1lIG5vdzsKKworCW9zX2dldF90aW1lKCZub3cpOworCXJlbWFpbmluZy0+c2VjID0gcmVtYWluaW5nLT51c2VjID0gMDsKKworCWRsX2xpc3RfZm9yX2VhY2hfc2FmZSh0aW1lb3V0LCBwcmV2LCAmZWxvb3AudGltZW91dCwKKwkJCSAgICAgIHN0cnVjdCBlbG9vcF90aW1lb3V0LCBsaXN0KSB7CisJCWlmICh0aW1lb3V0LT5oYW5kbGVyID09IGhhbmRsZXIgJiYKKwkJICAgICh0aW1lb3V0LT5lbG9vcF9kYXRhID09IGVsb29wX2RhdGEpICYmCisJCSAgICAodGltZW91dC0+dXNlcl9kYXRhID09IHVzZXJfZGF0YSkpIHsKKwkJCXJlbW92ZWQgPSAxOworCQkJaWYgKG9zX3RpbWVfYmVmb3JlKCZub3csICZ0aW1lb3V0LT50aW1lKSkKKwkJCQlvc190aW1lX3N1YigmdGltZW91dC0+dGltZSwgJm5vdywgcmVtYWluaW5nKTsKKwkJCWVsb29wX3JlbW92ZV90aW1lb3V0KHRpbWVvdXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJlbW92ZWQ7Cit9CisKKworaW50IGVsb29wX2lzX3RpbWVvdXRfcmVnaXN0ZXJlZChlbG9vcF90aW1lb3V0X2hhbmRsZXIgaGFuZGxlciwKIAkJCQl2b2lkICplbG9vcF9kYXRhLCB2b2lkICp1c2VyX2RhdGEpCiB7CiAJc3RydWN0IGVsb29wX3RpbWVvdXQgKnRtcDsKIAotCXRtcCA9IGVsb29wLnRpbWVvdXQ7Ci0Jd2hpbGUgKHRtcCAhPSBOVUxMKSB7CisJZGxfbGlzdF9mb3JfZWFjaCh0bXAsICZlbG9vcC50aW1lb3V0LCBzdHJ1Y3QgZWxvb3BfdGltZW91dCwgbGlzdCkgewogCQlpZiAodG1wLT5oYW5kbGVyID09IGhhbmRsZXIgJiYKIAkJICAgIHRtcC0+ZWxvb3BfZGF0YSA9PSBlbG9vcF9kYXRhICYmCiAJCSAgICB0bXAtPnVzZXJfZGF0YSA9PSB1c2VyX2RhdGEpCiAJCQlyZXR1cm4gMTsKLQotCQl0bXAgPSB0bXAtPm5leHQ7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yNDEsMjQgKzI2MSwxOSBAQAogCQlpZiAoZWxvb3Auc2lnbmFsc1tpXS5zaWduYWxlZCkgewogCQkJZWxvb3Auc2lnbmFsc1tpXS5zaWduYWxlZCA9IDA7CiAJCQllbG9vcC5zaWduYWxzW2ldLmhhbmRsZXIoZWxvb3Auc2lnbmFsc1tpXS5zaWcsCi0JCQkJCQkgZWxvb3AudXNlcl9kYXRhLAogCQkJCQkJIGVsb29wLnNpZ25hbHNbaV0udXNlcl9kYXRhKTsKIAkJfQogCX0KIH0KIAogCi1pbnQgZWxvb3BfcmVnaXN0ZXJfc2lnbmFsKGludCBzaWcsCi0JCQkgIHZvaWQgKCpoYW5kbGVyKShpbnQgc2lnLCB2b2lkICplbG9vcF9jdHgsCi0JCQkJCSAgdm9pZCAqc2lnbmFsX2N0eCksCitpbnQgZWxvb3BfcmVnaXN0ZXJfc2lnbmFsKGludCBzaWcsIGVsb29wX3NpZ25hbF9oYW5kbGVyIGhhbmRsZXIsCiAJCQkgIHZvaWQgKnVzZXJfZGF0YSkKIHsKIAlzdHJ1Y3QgZWxvb3Bfc2lnbmFsICp0bXA7CiAKLQl0bXAgPSAoc3RydWN0IGVsb29wX3NpZ25hbCAqKQotCQlyZWFsbG9jKGVsb29wLnNpZ25hbHMsCi0JCQkoZWxvb3Auc2lnbmFsX2NvdW50ICsgMSkgKgotCQkJc2l6ZW9mKHN0cnVjdCBlbG9vcF9zaWduYWwpKTsKKwl0bXAgPSBvc19yZWFsbG9jX2FycmF5KGVsb29wLnNpZ25hbHMsIGVsb29wLnNpZ25hbF9jb3VudCArIDEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBlbG9vcF9zaWduYWwpKTsKIAlpZiAodG1wID09IE5VTEwpCiAJCXJldHVybiAtMTsKIApAQCAtMjc1LDggKzI5MCw3IEBACiB9CiAKIAotaW50IGVsb29wX3JlZ2lzdGVyX3NpZ25hbF90ZXJtaW5hdGUodm9pZCAoKmhhbmRsZXIpKGludCBzaWcsIHZvaWQgKmVsb29wX2N0eCwKLQkJCQkJCSAgICB2b2lkICpzaWduYWxfY3R4KSwKK2ludCBlbG9vcF9yZWdpc3Rlcl9zaWduYWxfdGVybWluYXRlKGVsb29wX3NpZ25hbF9oYW5kbGVyIGhhbmRsZXIsCiAJCQkJICAgIHZvaWQgKnVzZXJfZGF0YSkKIHsKICNpZiAwCkBAIC0yOTAsOCArMzA0LDcgQEAKIH0KIAogCi1pbnQgZWxvb3BfcmVnaXN0ZXJfc2lnbmFsX3JlY29uZmlnKHZvaWQgKCpoYW5kbGVyKShpbnQgc2lnLCB2b2lkICplbG9vcF9jdHgsCi0JCQkJCQkgICB2b2lkICpzaWduYWxfY3R4KSwKK2ludCBlbG9vcF9yZWdpc3Rlcl9zaWduYWxfcmVjb25maWcoZWxvb3Bfc2lnbmFsX2hhbmRsZXIgaGFuZGxlciwKIAkJCQkgICB2b2lkICp1c2VyX2RhdGEpCiB7CiAjaWYgMApAQCAtMzA4LDExICszMjEsMTQgQEAKIAlzdHJ1Y3Qgb3NfdGltZSB0diwgbm93OwogCiAJd2hpbGUgKCFlbG9vcC50ZXJtaW5hdGUgJiYKLQkJKGVsb29wLnRpbWVvdXQgfHwgZWxvb3AucmVhZGVyX2NvdW50ID4gMCkpIHsKLQkJaWYgKGVsb29wLnRpbWVvdXQpIHsKKwkJKCFkbF9saXN0X2VtcHR5KCZlbG9vcC50aW1lb3V0KSB8fCBlbG9vcC5yZWFkZXJfY291bnQgPiAwKSkgeworCQlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqdGltZW91dDsKKwkJdGltZW91dCA9IGRsX2xpc3RfZmlyc3QoJmVsb29wLnRpbWVvdXQsIHN0cnVjdCBlbG9vcF90aW1lb3V0LAorCQkJCQlsaXN0KTsKKwkJaWYgKHRpbWVvdXQpIHsKIAkJCW9zX2dldF90aW1lKCZub3cpOwotCQkJaWYgKG9zX3RpbWVfYmVmb3JlKCZub3csICZlbG9vcC50aW1lb3V0LT50aW1lKSkKLQkJCQlvc190aW1lX3N1YigmZWxvb3AudGltZW91dC0+dGltZSwgJm5vdywgJnR2KTsKKwkJCWlmIChvc190aW1lX2JlZm9yZSgmbm93LCAmdGltZW91dC0+dGltZSkpCisJCQkJb3NfdGltZV9zdWIoJnRpbWVvdXQtPnRpbWUsICZub3csICZ0dik7CiAJCQllbHNlCiAJCQkJdHYuc2VjID0gdHYudXNlYyA9IDA7CiAJCX0KQEAgLTMyNiwxNiArMzQyLDE3IEBACiAJCWVsb29wX3Byb2Nlc3NfcGVuZGluZ19zaWduYWxzKCk7CiAKIAkJLyogY2hlY2sgaWYgc29tZSByZWdpc3RlcmVkIHRpbWVvdXRzIGhhdmUgb2NjdXJyZWQgKi8KLQkJaWYgKGVsb29wLnRpbWVvdXQpIHsKLQkJCXN0cnVjdCBlbG9vcF90aW1lb3V0ICp0bXA7Ci0KKwkJdGltZW91dCA9IGRsX2xpc3RfZmlyc3QoJmVsb29wLnRpbWVvdXQsIHN0cnVjdCBlbG9vcF90aW1lb3V0LAorCQkJCQlsaXN0KTsKKwkJaWYgKHRpbWVvdXQpIHsKIAkJCW9zX2dldF90aW1lKCZub3cpOwotCQkJaWYgKCFvc190aW1lX2JlZm9yZSgmbm93LCAmZWxvb3AudGltZW91dC0+dGltZSkpIHsKLQkJCQl0bXAgPSBlbG9vcC50aW1lb3V0OwotCQkJCWVsb29wLnRpbWVvdXQgPSBlbG9vcC50aW1lb3V0LT5uZXh0OwotCQkJCXRtcC0+aGFuZGxlcih0bXAtPmVsb29wX2RhdGEsCi0JCQkJCSAgICAgdG1wLT51c2VyX2RhdGEpOwotCQkJCWZyZWUodG1wKTsKKwkJCWlmICghb3NfdGltZV9iZWZvcmUoJm5vdywgJnRpbWVvdXQtPnRpbWUpKSB7CisJCQkJdm9pZCAqZWxvb3BfZGF0YSA9IHRpbWVvdXQtPmVsb29wX2RhdGE7CisJCQkJdm9pZCAqdXNlcl9kYXRhID0gdGltZW91dC0+dXNlcl9kYXRhOworCQkJCWVsb29wX3RpbWVvdXRfaGFuZGxlciBoYW5kbGVyID0KKwkJCQkJdGltZW91dC0+aGFuZGxlcjsKKwkJCQllbG9vcF9yZW1vdmVfdGltZW91dCh0aW1lb3V0KTsKKwkJCQloYW5kbGVyKGVsb29wX2RhdGEsIHVzZXJfZGF0YSk7CiAJCQl9CiAKIAkJfQpAQCAtMzY5LDE0ICszODYsMTIgQEAKIHsKIAlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqdGltZW91dCwgKnByZXY7CiAKLQl0aW1lb3V0ID0gZWxvb3AudGltZW91dDsKLQl3aGlsZSAodGltZW91dCAhPSBOVUxMKSB7Ci0JCXByZXYgPSB0aW1lb3V0OwotCQl0aW1lb3V0ID0gdGltZW91dC0+bmV4dDsKLQkJZnJlZShwcmV2KTsKKwlkbF9saXN0X2Zvcl9lYWNoX3NhZmUodGltZW91dCwgcHJldiwgJmVsb29wLnRpbWVvdXQsCisJCQkgICAgICBzdHJ1Y3QgZWxvb3BfdGltZW91dCwgbGlzdCkgeworCQllbG9vcF9yZW1vdmVfdGltZW91dCh0aW1lb3V0KTsKIAl9Ci0JZnJlZShlbG9vcC5yZWFkZXJzKTsKLQlmcmVlKGVsb29wLnNpZ25hbHMpOworCW9zX2ZyZWUoZWxvb3AucmVhZGVycyk7CisJb3NfZnJlZShlbG9vcC5zaWduYWxzKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvdXRpbHMvZWxvb3Bfd2luLmMgYi9zcmMvdXRpbHMvZWxvb3Bfd2luLmMKaW5kZXggMWZhZmViMi4uZWRhNDEyZiAxMDA2NDQKLS0tIGEvc3JjL3V0aWxzL2Vsb29wX3dpbi5jCisrKyBiL3NyYy91dGlscy9lbG9vcF93aW4uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBFdmVudCBsb29wIGJhc2VkIG9uIFdpbmRvd3MgZXZlbnRzIGFuZCBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA5LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8d2luc29jazIuaD4KIAogI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImxpc3QuaCIKICNpbmNsdWRlICJlbG9vcC5oIgogCiAKQEAgLTI5LDExICszMCwxMSBAQAogfTsKIAogc3RydWN0IGVsb29wX3RpbWVvdXQgeworCXN0cnVjdCBkbF9saXN0IGxpc3Q7CiAJc3RydWN0IG9zX3RpbWUgdGltZTsKIAl2b2lkICplbG9vcF9kYXRhOwogCXZvaWQgKnVzZXJfZGF0YTsKIAllbG9vcF90aW1lb3V0X2hhbmRsZXIgaGFuZGxlcjsKLQlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqbmV4dDsKIH07CiAKIHN0cnVjdCBlbG9vcF9zaWduYWwgewpAQCAtNTEsNyArNTIsNyBAQAogCXNpemVfdCBldmVudF9jb3VudDsKIAlzdHJ1Y3QgZWxvb3BfZXZlbnQgKmV2ZW50czsKIAotCXN0cnVjdCBlbG9vcF90aW1lb3V0ICp0aW1lb3V0OworCXN0cnVjdCBkbF9saXN0IHRpbWVvdXQ7CiAKIAlpbnQgc2lnbmFsX2NvdW50OwogCXN0cnVjdCBlbG9vcF9zaWduYWwgKnNpZ25hbHM7CkBAIC03NCw2ICs3NSw3IEBACiBpbnQgZWxvb3BfaW5pdCh2b2lkKQogewogCW9zX21lbXNldCgmZWxvb3AsIDAsIHNpemVvZihlbG9vcCkpOworCWRsX2xpc3RfaW5pdCgmZWxvb3AudGltZW91dCk7CiAJZWxvb3AubnVtX2hhbmRsZXMgPSAxOwogCWVsb29wLmhhbmRsZXMgPSBvc19tYWxsb2MoZWxvb3AubnVtX2hhbmRsZXMgKgogCQkJCSAgc2l6ZW9mKGVsb29wLmhhbmRsZXNbMF0pKTsKQEAgLTIzNiwxMyArMjM4LDE2IEBACiAJCQkgICBlbG9vcF90aW1lb3V0X2hhbmRsZXIgaGFuZGxlciwKIAkJCSAgIHZvaWQgKmVsb29wX2RhdGEsIHZvaWQgKnVzZXJfZGF0YSkKIHsKLQlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqdGltZW91dCwgKnRtcCwgKnByZXY7CisJc3RydWN0IGVsb29wX3RpbWVvdXQgKnRpbWVvdXQsICp0bXA7CiAJb3NfdGltZV90IG5vd19zZWM7CiAKLQl0aW1lb3V0ID0gb3NfbWFsbG9jKHNpemVvZigqdGltZW91dCkpOworCXRpbWVvdXQgPSBvc196YWxsb2Moc2l6ZW9mKCp0aW1lb3V0KSk7CiAJaWYgKHRpbWVvdXQgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwotCW9zX2dldF90aW1lKCZ0aW1lb3V0LT50aW1lKTsKKwlpZiAob3NfZ2V0X3RpbWUoJnRpbWVvdXQtPnRpbWUpIDwgMCkgeworCQlvc19mcmVlKHRpbWVvdXQpOworCQlyZXR1cm4gLTE7CisJfQogCW5vd19zZWMgPSB0aW1lb3V0LT50aW1lLnNlYzsKIAl0aW1lb3V0LT50aW1lLnNlYyArPSBzZWNzOwogCWlmICh0aW1lb3V0LT50aW1lLnNlYyA8IG5vd19zZWMpIHsKQEAgLTI2Myw3OSArMjY4LDg2IEBACiAJdGltZW91dC0+ZWxvb3BfZGF0YSA9IGVsb29wX2RhdGE7CiAJdGltZW91dC0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOwogCXRpbWVvdXQtPmhhbmRsZXIgPSBoYW5kbGVyOwotCXRpbWVvdXQtPm5leHQgPSBOVUxMOwogCi0JaWYgKGVsb29wLnRpbWVvdXQgPT0gTlVMTCkgewotCQllbG9vcC50aW1lb3V0ID0gdGltZW91dDsKLQkJcmV0dXJuIDA7CisJLyogTWFpbnRhaW4gdGltZW91dHMgaW4gb3JkZXIgb2YgaW5jcmVhc2luZyB0aW1lICovCisJZGxfbGlzdF9mb3JfZWFjaCh0bXAsICZlbG9vcC50aW1lb3V0LCBzdHJ1Y3QgZWxvb3BfdGltZW91dCwgbGlzdCkgeworCQlpZiAob3NfdGltZV9iZWZvcmUoJnRpbWVvdXQtPnRpbWUsICZ0bXAtPnRpbWUpKSB7CisJCQlkbF9saXN0X2FkZCh0bXAtPmxpc3QucHJldiwgJnRpbWVvdXQtPmxpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KIAl9Ci0KLQlwcmV2ID0gTlVMTDsKLQl0bXAgPSBlbG9vcC50aW1lb3V0OwotCXdoaWxlICh0bXAgIT0gTlVMTCkgewotCQlpZiAob3NfdGltZV9iZWZvcmUoJnRpbWVvdXQtPnRpbWUsICZ0bXAtPnRpbWUpKQotCQkJYnJlYWs7Ci0JCXByZXYgPSB0bXA7Ci0JCXRtcCA9IHRtcC0+bmV4dDsKLQl9Ci0KLQlpZiAocHJldiA9PSBOVUxMKSB7Ci0JCXRpbWVvdXQtPm5leHQgPSBlbG9vcC50aW1lb3V0OwotCQllbG9vcC50aW1lb3V0ID0gdGltZW91dDsKLQl9IGVsc2UgewotCQl0aW1lb3V0LT5uZXh0ID0gcHJldi0+bmV4dDsKLQkJcHJldi0+bmV4dCA9IHRpbWVvdXQ7Ci0JfQorCWRsX2xpc3RfYWRkX3RhaWwoJmVsb29wLnRpbWVvdXQsICZ0aW1lb3V0LT5saXN0KTsKIAogCXJldHVybiAwOwogfQogCiAKK3N0YXRpYyB2b2lkIGVsb29wX3JlbW92ZV90aW1lb3V0KHN0cnVjdCBlbG9vcF90aW1lb3V0ICp0aW1lb3V0KQoreworCWRsX2xpc3RfZGVsKCZ0aW1lb3V0LT5saXN0KTsKKwlvc19mcmVlKHRpbWVvdXQpOworfQorCisKIGludCBlbG9vcF9jYW5jZWxfdGltZW91dChlbG9vcF90aW1lb3V0X2hhbmRsZXIgaGFuZGxlciwKIAkJCSB2b2lkICplbG9vcF9kYXRhLCB2b2lkICp1c2VyX2RhdGEpCiB7Ci0Jc3RydWN0IGVsb29wX3RpbWVvdXQgKnRpbWVvdXQsICpwcmV2LCAqbmV4dDsKKwlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqdGltZW91dCwgKnByZXY7CiAJaW50IHJlbW92ZWQgPSAwOwogCi0JcHJldiA9IE5VTEw7Ci0JdGltZW91dCA9IGVsb29wLnRpbWVvdXQ7Ci0Jd2hpbGUgKHRpbWVvdXQgIT0gTlVMTCkgewotCQluZXh0ID0gdGltZW91dC0+bmV4dDsKLQorCWRsX2xpc3RfZm9yX2VhY2hfc2FmZSh0aW1lb3V0LCBwcmV2LCAmZWxvb3AudGltZW91dCwKKwkJCSAgICAgIHN0cnVjdCBlbG9vcF90aW1lb3V0LCBsaXN0KSB7CiAJCWlmICh0aW1lb3V0LT5oYW5kbGVyID09IGhhbmRsZXIgJiYKIAkJICAgICh0aW1lb3V0LT5lbG9vcF9kYXRhID09IGVsb29wX2RhdGEgfHwKIAkJICAgICBlbG9vcF9kYXRhID09IEVMT09QX0FMTF9DVFgpICYmCiAJCSAgICAodGltZW91dC0+dXNlcl9kYXRhID09IHVzZXJfZGF0YSB8fAogCQkgICAgIHVzZXJfZGF0YSA9PSBFTE9PUF9BTExfQ1RYKSkgewotCQkJaWYgKHByZXYgPT0gTlVMTCkKLQkJCQllbG9vcC50aW1lb3V0ID0gbmV4dDsKLQkJCWVsc2UKLQkJCQlwcmV2LT5uZXh0ID0gbmV4dDsKLQkJCW9zX2ZyZWUodGltZW91dCk7CisJCQllbG9vcF9yZW1vdmVfdGltZW91dCh0aW1lb3V0KTsKIAkJCXJlbW92ZWQrKzsKLQkJfSBlbHNlCi0JCQlwcmV2ID0gdGltZW91dDsKLQotCQl0aW1lb3V0ID0gbmV4dDsKKwkJfQogCX0KIAogCXJldHVybiByZW1vdmVkOwogfQogCiAKK2ludCBlbG9vcF9jYW5jZWxfdGltZW91dF9vbmUoZWxvb3BfdGltZW91dF9oYW5kbGVyIGhhbmRsZXIsCisJCQkgICAgIHZvaWQgKmVsb29wX2RhdGEsIHZvaWQgKnVzZXJfZGF0YSwKKwkJCSAgICAgc3RydWN0IG9zX3RpbWUgKnJlbWFpbmluZykKK3sKKwlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqdGltZW91dCwgKnByZXY7CisJaW50IHJlbW92ZWQgPSAwOworCXN0cnVjdCBvc190aW1lIG5vdzsKKworCW9zX2dldF90aW1lKCZub3cpOworCXJlbWFpbmluZy0+c2VjID0gcmVtYWluaW5nLT51c2VjID0gMDsKKworCWRsX2xpc3RfZm9yX2VhY2hfc2FmZSh0aW1lb3V0LCBwcmV2LCAmZWxvb3AudGltZW91dCwKKwkJCSAgICAgIHN0cnVjdCBlbG9vcF90aW1lb3V0LCBsaXN0KSB7CisJCWlmICh0aW1lb3V0LT5oYW5kbGVyID09IGhhbmRsZXIgJiYKKwkJICAgICh0aW1lb3V0LT5lbG9vcF9kYXRhID09IGVsb29wX2RhdGEpICYmCisJCSAgICAodGltZW91dC0+dXNlcl9kYXRhID09IHVzZXJfZGF0YSkpIHsKKwkJCXJlbW92ZWQgPSAxOworCQkJaWYgKG9zX3RpbWVfYmVmb3JlKCZub3csICZ0aW1lb3V0LT50aW1lKSkKKwkJCQlvc190aW1lX3N1YigmdGltZW91dC0+dGltZSwgJm5vdywgcmVtYWluaW5nKTsKKwkJCWVsb29wX3JlbW92ZV90aW1lb3V0KHRpbWVvdXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJlbW92ZWQ7Cit9CisKKwogaW50IGVsb29wX2lzX3RpbWVvdXRfcmVnaXN0ZXJlZChlbG9vcF90aW1lb3V0X2hhbmRsZXIgaGFuZGxlciwKIAkJCQl2b2lkICplbG9vcF9kYXRhLCB2b2lkICp1c2VyX2RhdGEpCiB7CiAJc3RydWN0IGVsb29wX3RpbWVvdXQgKnRtcDsKIAotCXRtcCA9IGVsb29wLnRpbWVvdXQ7Ci0Jd2hpbGUgKHRtcCAhPSBOVUxMKSB7CisJZGxfbGlzdF9mb3JfZWFjaCh0bXAsICZlbG9vcC50aW1lb3V0LCBzdHJ1Y3QgZWxvb3BfdGltZW91dCwgbGlzdCkgewogCQlpZiAodG1wLT5oYW5kbGVyID09IGhhbmRsZXIgJiYKIAkJICAgIHRtcC0+ZWxvb3BfZGF0YSA9PSBlbG9vcF9kYXRhICYmCiAJCSAgICB0bXAtPnVzZXJfZGF0YSA9PSB1c2VyX2RhdGEpCiAJCQlyZXR1cm4gMTsKLQotCQl0bXAgPSB0bXAtPm5leHQ7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00NTcsMTcgKzQ2OSwyMCBAQAogdm9pZCBlbG9vcF9ydW4odm9pZCkKIHsKIAlzdHJ1Y3Qgb3NfdGltZSB0diwgbm93OwotCURXT1JEIGNvdW50LCByZXQsIHRpbWVvdXQsIGVycjsKKwlEV09SRCBjb3VudCwgcmV0LCB0aW1lb3V0X3ZhbCwgZXJyOwogCXNpemVfdCBpOwogCiAJd2hpbGUgKCFlbG9vcC50ZXJtaW5hdGUgJiYKLQkgICAgICAgKGVsb29wLnRpbWVvdXQgfHwgZWxvb3AucmVhZGVyX2NvdW50ID4gMCB8fAorCSAgICAgICAoIWRsX2xpc3RfZW1wdHkoJmVsb29wLnRpbWVvdXQpIHx8IGVsb29wLnJlYWRlcl9jb3VudCA+IDAgfHwKIAkJZWxvb3AuZXZlbnRfY291bnQgPiAwKSkgeworCQlzdHJ1Y3QgZWxvb3BfdGltZW91dCAqdGltZW91dDsKIAkJdHYuc2VjID0gdHYudXNlYyA9IDA7Ci0JCWlmIChlbG9vcC50aW1lb3V0KSB7CisJCXRpbWVvdXQgPSBkbF9saXN0X2ZpcnN0KCZlbG9vcC50aW1lb3V0LCBzdHJ1Y3QgZWxvb3BfdGltZW91dCwKKwkJCQkJbGlzdCk7CisJCWlmICh0aW1lb3V0KSB7CiAJCQlvc19nZXRfdGltZSgmbm93KTsKLQkJCWlmIChvc190aW1lX2JlZm9yZSgmbm93LCAmZWxvb3AudGltZW91dC0+dGltZSkpCi0JCQkJb3NfdGltZV9zdWIoJmVsb29wLnRpbWVvdXQtPnRpbWUsICZub3csICZ0dik7CisJCQlpZiAob3NfdGltZV9iZWZvcmUoJm5vdywgJnRpbWVvdXQtPnRpbWUpKQorCQkJCW9zX3RpbWVfc3ViKCZ0aW1lb3V0LT50aW1lLCAmbm93LCAmdHYpOwogCQl9CiAKIAkJY291bnQgPSAwOwpAQCAtNDgwLDEwICs0OTUsMTAgQEAKIAkJaWYgKGVsb29wLnRlcm1fZXZlbnQpCiAJCQllbG9vcC5oYW5kbGVzW2NvdW50KytdID0gZWxvb3AudGVybV9ldmVudDsKIAotCQlpZiAoZWxvb3AudGltZW91dCkKLQkJCXRpbWVvdXQgPSB0di5zZWMgKiAxMDAwICsgdHYudXNlYyAvIDEwMDA7CisJCWlmICh0aW1lb3V0KQorCQkJdGltZW91dF92YWwgPSB0di5zZWMgKiAxMDAwICsgdHYudXNlYyAvIDEwMDA7CiAJCWVsc2UKLQkJCXRpbWVvdXQgPSBJTkZJTklURTsKKwkJCXRpbWVvdXRfdmFsID0gSU5GSU5JVEU7CiAKIAkJaWYgKGNvdW50ID4gTUFYSU1VTV9XQUlUX09CSkVDVFMpIHsKIAkJCXByaW50ZigiV2FpdEZvck11bHRpcGxlT2JqZWN0czogVG9vIG1hbnkgZXZlbnRzOiAiCkBAIC00OTMsMjYgKzUwOCwyNyBAQAogCQl9CiAjaWZkZWYgX1dJTjMyX1dDRQogCQlyZXQgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKGNvdW50LCBlbG9vcC5oYW5kbGVzLCBGQUxTRSwKLQkJCQkJICAgICB0aW1lb3V0KTsKKwkJCQkJICAgICB0aW1lb3V0X3ZhbCk7CiAjZWxzZSAvKiBfV0lOMzJfV0NFICovCiAJCXJldCA9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHNFeChjb3VudCwgZWxvb3AuaGFuZGxlcywgRkFMU0UsCi0JCQkJCSAgICAgICB0aW1lb3V0LCBUUlVFKTsKKwkJCQkJICAgICAgIHRpbWVvdXRfdmFsLCBUUlVFKTsKICNlbmRpZiAvKiBfV0lOMzJfV0NFICovCiAJCWVyciA9IEdldExhc3RFcnJvcigpOwogCiAJCWVsb29wX3Byb2Nlc3NfcGVuZGluZ19zaWduYWxzKCk7CiAKIAkJLyogY2hlY2sgaWYgc29tZSByZWdpc3RlcmVkIHRpbWVvdXRzIGhhdmUgb2NjdXJyZWQgKi8KLQkJaWYgKGVsb29wLnRpbWVvdXQpIHsKLQkJCXN0cnVjdCBlbG9vcF90aW1lb3V0ICp0bXA7Ci0KKwkJdGltZW91dCA9IGRsX2xpc3RfZmlyc3QoJmVsb29wLnRpbWVvdXQsIHN0cnVjdCBlbG9vcF90aW1lb3V0LAorCQkJCQlsaXN0KTsKKwkJaWYgKHRpbWVvdXQpIHsKIAkJCW9zX2dldF90aW1lKCZub3cpOwotCQkJaWYgKCFvc190aW1lX2JlZm9yZSgmbm93LCAmZWxvb3AudGltZW91dC0+dGltZSkpIHsKLQkJCQl0bXAgPSBlbG9vcC50aW1lb3V0OwotCQkJCWVsb29wLnRpbWVvdXQgPSBlbG9vcC50aW1lb3V0LT5uZXh0OwotCQkJCXRtcC0+aGFuZGxlcih0bXAtPmVsb29wX2RhdGEsCi0JCQkJCSAgICAgdG1wLT51c2VyX2RhdGEpOwotCQkJCW9zX2ZyZWUodG1wKTsKKwkJCWlmICghb3NfdGltZV9iZWZvcmUoJm5vdywgJnRpbWVvdXQtPnRpbWUpKSB7CisJCQkJdm9pZCAqZWxvb3BfZGF0YSA9IHRpbWVvdXQtPmVsb29wX2RhdGE7CisJCQkJdm9pZCAqdXNlcl9kYXRhID0gdGltZW91dC0+dXNlcl9kYXRhOworCQkJCWVsb29wX3RpbWVvdXRfaGFuZGxlciBoYW5kbGVyID0KKwkJCQkJdGltZW91dC0+aGFuZGxlcjsKKwkJCQllbG9vcF9yZW1vdmVfdGltZW91dCh0aW1lb3V0KTsKKwkJCQloYW5kbGVyKGVsb29wX2RhdGEsIHVzZXJfZGF0YSk7CiAJCQl9CiAKIAkJfQpAQCAtNTcxLDExICs1ODcsOSBAQAogewogCXN0cnVjdCBlbG9vcF90aW1lb3V0ICp0aW1lb3V0LCAqcHJldjsKIAotCXRpbWVvdXQgPSBlbG9vcC50aW1lb3V0OwotCXdoaWxlICh0aW1lb3V0ICE9IE5VTEwpIHsKLQkJcHJldiA9IHRpbWVvdXQ7Ci0JCXRpbWVvdXQgPSB0aW1lb3V0LT5uZXh0OwotCQlvc19mcmVlKHByZXYpOworCWRsX2xpc3RfZm9yX2VhY2hfc2FmZSh0aW1lb3V0LCBwcmV2LCAmZWxvb3AudGltZW91dCwKKwkJCSAgICAgIHN0cnVjdCBlbG9vcF90aW1lb3V0LCBsaXN0KSB7CisJCWVsb29wX3JlbW92ZV90aW1lb3V0KHRpbWVvdXQpOwogCX0KIAlvc19mcmVlKGVsb29wLnJlYWRlcnMpOwogCW9zX2ZyZWUoZWxvb3Auc2lnbmFscyk7CmRpZmYgLS1naXQgYS9zcmMvdXRpbHMvb3NfdW5peC5jIGIvc3JjL3V0aWxzL29zX3VuaXguYwppbmRleCAxZTIxZmI3Li5lYjdmNWYyIDEwMDY0NAotLS0gYS9zcmMvdXRpbHMvb3NfdW5peC5jCisrKyBiL3NyYy91dGlscy9vc191bml4LmMKQEAgLTI1Nyw3ICsyNTcsMTEgQEAKIAkgKiBXZSBpZ25vcmUgZXJyb3JzIGhlcmUgc2luY2UgZXJyb3JzIGFyZSBub3JtYWwgaWYgd2UKIAkgKiBhcmUgYWxyZWFkeSBydW5uaW5nIGFzIG5vbi1yb290LgogCSAqLworI2lmZGVmIEFORFJPSURfU0VUR1JPVVBTX09WRVJSSURFCisJZ2lkX3QgZ3JvdXBzW10gPSB7IEFORFJPSURfU0VUR1JPVVBTX09WRVJSSURFIH07CisjZWxzZSAvKiBBTkRST0lEX1NFVEdST1VQU19PVkVSUklERSAqLwogCWdpZF90IGdyb3Vwc1tdID0geyBBSURfSU5FVCwgQUlEX1dJRkksIEFJRF9LRVlTVE9SRSB9OworI2VuZGlmIC8qIEFORFJPSURfU0VUR1JPVVBTX09WRVJSSURFICovCiAJc3RydWN0IF9fdXNlcl9jYXBfaGVhZGVyX3N0cnVjdCBoZWFkZXI7CiAJc3RydWN0IF9fdXNlcl9jYXBfZGF0YV9zdHJ1Y3QgY2FwOwogCmRpZmYgLS1naXQgYS9zcmMvd3BzL25kZWYuYyBiL3NyYy93cHMvbmRlZi5jCmluZGV4IDc2MzBlY2IuLjk2Njg1ZDIgMTAwNjQ0Ci0tLSBhL3NyYy93cHMvbmRlZi5jCisrKyBiL3NyYy93cHMvbmRlZi5jCkBAIC0xMCwxMyArMTAsMTMgQEAKICNpbmNsdWRlICJpbmNsdWRlcy5oIgogI2luY2x1ZGUgImNvbW1vbi5oIgogI2luY2x1ZGUgIndwcy93cHMuaCIKLSNpbmNsdWRlICJ3cHMvd3BzX2kuaCIKIAogI2RlZmluZSBGTEFHX01FU1NBR0VfQkVHSU4gKDEgPDwgNykKICNkZWZpbmUgRkxBR19NRVNTQUdFX0VORCAoMSA8PCA2KQogI2RlZmluZSBGTEFHX0NIVU5LICgxIDw8IDUpCiAjZGVmaW5lIEZMQUdfU0hPUlRfUkVDT1JEICgxIDw8IDQpCiAjZGVmaW5lIEZMQUdfSURfTEVOR1RIX1BSRVNFTlQgKDEgPDwgMykKKyNkZWZpbmUgRkxBR19UTkZfTkZDX0ZPUlVNICgweDAxKQogI2RlZmluZSBGTEFHX1RORl9SRkMyMDQ2ICgweDAyKQogCiBzdHJ1Y3QgbmRlZl9yZWNvcmQgewpAQCAtMTY4LDMgKzE2OCw4NyBAQAogCQkJCSBGTEFHX1RORl9SRkMyMDQ2LCB3aWZpX2hhbmRvdmVyX3R5cGUsCiAJCQkJIG9zX3N0cmxlbih3aWZpX2hhbmRvdmVyX3R5cGUpLCBOVUxMLCAwLCBidWYpOwogfQorCisKK3N0cnVjdCB3cGFidWYgKiBuZGVmX2J1aWxkX3dpZmlfaGMoaW50IGJlZ2luKQoreworCXN0cnVjdCB3cGFidWYgKmhjLCAqY2FycmllcjsKKworCWNhcnJpZXIgPSB3cGFidWZfYWxsb2MoMiArIG9zX3N0cmxlbih3aWZpX2hhbmRvdmVyX3R5cGUpKTsKKwlpZiAoY2FycmllciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwl3cGFidWZfcHV0X3U4KGNhcnJpZXIsIDB4MDIpOyAvKiBDYXJyaWVyIFR5cGUgRm9ybWF0ICovCisJd3BhYnVmX3B1dF91OChjYXJyaWVyLCBvc19zdHJsZW4od2lmaV9oYW5kb3Zlcl90eXBlKSk7CisJd3BhYnVmX3B1dF9zdHIoY2Fycmllciwgd2lmaV9oYW5kb3Zlcl90eXBlKTsKKworCWhjID0gbmRlZl9idWlsZF9yZWNvcmQoKGJlZ2luID8gRkxBR19NRVNTQUdFX0JFR0lOIDogMCkgfAorCQkJICAgICAgIEZMQUdfTUVTU0FHRV9FTkQgfCBGTEFHX1RORl9ORkNfRk9SVU0sICJIYyIsIDIsCisJCQkgICAgICAgIjAiLCAxLCBjYXJyaWVyKTsKKwl3cGFidWZfZnJlZShjYXJyaWVyKTsKKworCXJldHVybiBoYzsKK30KKworCitzdHJ1Y3Qgd3BhYnVmICogbmRlZl9idWlsZF93aWZpX2hyKHZvaWQpCit7CisJc3RydWN0IHdwYWJ1ZiAqcm4sICpjciwgKmFjX3BheWxvYWQsICphYywgKmhyX3BheWxvYWQsICpocjsKKwlzdHJ1Y3Qgd3BhYnVmICpoYzsKKworCXJuID0gd3BhYnVmX2FsbG9jKDIpOworCWlmIChybiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwl3cGFidWZfcHV0X2JlMTYocm4sIG9zX3JhbmRvbSgpICYgMHhmZmZmKTsKKworCWNyID0gbmRlZl9idWlsZF9yZWNvcmQoRkxBR19NRVNTQUdFX0JFR0lOIHwgRkxBR19UTkZfTkZDX0ZPUlVNLCAiY3IiLCAyLAorCQkJICAgICAgIE5VTEwsIDAsIHJuKTsKKwl3cGFidWZfZnJlZShybik7CisKKwlpZiAoY3IgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlhY19wYXlsb2FkID0gd3BhYnVmX2FsbG9jKDQpOworCWlmIChhY19wYXlsb2FkID09IE5VTEwpIHsKKwkJd3BhYnVmX2ZyZWUoY3IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJd3BhYnVmX3B1dF91OChhY19wYXlsb2FkLCAweDAxKTsgLyogQ2FycmllciBGbGFnczogQ1JTPTEgImFjdGl2ZSIgKi8KKwl3cGFidWZfcHV0X3U4KGFjX3BheWxvYWQsIDB4MDEpOyAvKiBDYXJyaWVyIERhdGEgUmVmZXJlbmNlIExlbmd0aCAqLworCXdwYWJ1Zl9wdXRfdTgoYWNfcGF5bG9hZCwgJzAnKTsgLyogQ2FycmllciBEYXRhIFJlZmVyZW5jZTogIjAiICovCisJd3BhYnVmX3B1dF91OChhY19wYXlsb2FkLCAwKTsgLyogQXV4IERhdGEgUmVmZXJlbmNlIENvdW50ICovCisKKwlhYyA9IG5kZWZfYnVpbGRfcmVjb3JkKEZMQUdfTUVTU0FHRV9FTkQgfCBGTEFHX1RORl9ORkNfRk9SVU0sICJhYyIsIDIsCisJCQkgICAgICAgTlVMTCwgMCwgYWNfcGF5bG9hZCk7CisJd3BhYnVmX2ZyZWUoYWNfcGF5bG9hZCk7CisJaWYgKGFjID09IE5VTEwpIHsKKwkJd3BhYnVmX2ZyZWUoY3IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlocl9wYXlsb2FkID0gd3BhYnVmX2FsbG9jKDEgKyB3cGFidWZfbGVuKGNyKSArIHdwYWJ1Zl9sZW4oYWMpKTsKKwlpZiAoaHJfcGF5bG9hZCA9PSBOVUxMKSB7CisJCXdwYWJ1Zl9mcmVlKGNyKTsKKwkJd3BhYnVmX2ZyZWUoYWMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3cGFidWZfcHV0X3U4KGhyX3BheWxvYWQsIDB4MTIpOyAvKiBDb25uZWN0aW9uIEhhbmRvdmVyIFZlcnNpb24gMS4yICovCisJd3BhYnVmX3B1dF9idWYoaHJfcGF5bG9hZCwgY3IpOworCXdwYWJ1Zl9wdXRfYnVmKGhyX3BheWxvYWQsIGFjKTsKKwl3cGFidWZfZnJlZShjcik7CisJd3BhYnVmX2ZyZWUoYWMpOworCisJaHIgPSBuZGVmX2J1aWxkX3JlY29yZChGTEFHX01FU1NBR0VfQkVHSU4gfCBGTEFHX1RORl9ORkNfRk9SVU0sICJIciIsIDIsCisJCQkgICAgICAgTlVMTCwgMCwgaHJfcGF5bG9hZCk7CisJd3BhYnVmX2ZyZWUoaHJfcGF5bG9hZCk7CisJaWYgKGhyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaGMgPSBuZGVmX2J1aWxkX3dpZmlfaGMoMCk7CisJaWYgKGhjID09IE5VTEwpIHsKKwkJd3BhYnVmX2ZyZWUoaHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gd3BhYnVmX2NvbmNhdChociwgaGMpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHMuYyBiL3NyYy93cHMvd3BzLmMKaW5kZXggNGMyMzIyZC4uZmY0YjIwZCAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHMuYworKysgYi9zcmMvd3BzL3dwcy5jCkBAIC00NSw4ICs0NSw3IEBACiAJCW9zX21lbWNweShkYXRhLT51dWlkX2UsIGNmZy0+d3BzLT51dWlkLCBXUFNfVVVJRF9MRU4pOwogCX0KIAlpZiAoY2ZnLT5waW4pIHsKLQkJZGF0YS0+ZGV2X3B3X2lkID0gZGF0YS0+d3BzLT5vb2JfZGV2X3B3X2lkID09IDAgPwotCQkJY2ZnLT5kZXZfcHdfaWQgOiBkYXRhLT53cHMtPm9vYl9kZXZfcHdfaWQ7CisJCWRhdGEtPmRldl9wd19pZCA9IGNmZy0+ZGV2X3B3X2lkOwogCQlkYXRhLT5kZXZfcGFzc3dvcmQgPSBvc19tYWxsb2MoY2ZnLT5waW5fbGVuKTsKIAkJaWYgKGRhdGEtPmRldl9wYXNzd29yZCA9PSBOVUxMKSB7CiAJCQlvc19mcmVlKGRhdGEpOwpAQCAtNTQsMTIgKzUzLDE4IEBACiAJCX0KIAkJb3NfbWVtY3B5KGRhdGEtPmRldl9wYXNzd29yZCwgY2ZnLT5waW4sIGNmZy0+cGluX2xlbik7CiAJCWRhdGEtPmRldl9wYXNzd29yZF9sZW4gPSBjZmctPnBpbl9sZW47CisJCXdwYV9oZXhkdW1wX2tleShNU0dfREVCVUcsICJXUFM6IEFQIFBJTiBkZXZfcGFzc3dvcmQiLAorCQkJCWRhdGEtPmRldl9wYXNzd29yZCwgZGF0YS0+ZGV2X3Bhc3N3b3JkX2xlbik7CiAJfQogCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKIAlpZiAoY2ZnLT53cHMtPmFwICYmICFjZmctPnJlZ2lzdHJhciAmJiBjZmctPndwcy0+YXBfbmZjX2Rldl9wd19pZCkgeworCQkvKiBLZWVwIEFQIFBJTiBhcyBhbHRlcm5hdGl2ZSBEZXZpY2UgUGFzc3dvcmQgKi8KKwkJZGF0YS0+YWx0X2Rldl9wd19pZCA9IGRhdGEtPmRldl9wd19pZDsKKwkJZGF0YS0+YWx0X2Rldl9wYXNzd29yZCA9IGRhdGEtPmRldl9wYXNzd29yZDsKKwkJZGF0YS0+YWx0X2Rldl9wYXNzd29yZF9sZW4gPSBkYXRhLT5kZXZfcGFzc3dvcmRfbGVuOworCiAJCWRhdGEtPmRldl9wd19pZCA9IGNmZy0+d3BzLT5hcF9uZmNfZGV2X3B3X2lkOwotCQlvc19mcmVlKGRhdGEtPmRldl9wYXNzd29yZCk7CiAJCWRhdGEtPmRldl9wYXNzd29yZCA9CiAJCQlvc19tYWxsb2Mod3BhYnVmX2xlbihjZmctPndwcy0+YXBfbmZjX2Rldl9wdykpOwogCQlpZiAoZGF0YS0+ZGV2X3Bhc3N3b3JkID09IE5VTEwpIHsKQEAgLTcwLDYgKzc1LDggQEAKIAkJCSAgd3BhYnVmX2hlYWQoY2ZnLT53cHMtPmFwX25mY19kZXZfcHcpLAogCQkJICB3cGFidWZfbGVuKGNmZy0+d3BzLT5hcF9uZmNfZGV2X3B3KSk7CiAJCWRhdGEtPmRldl9wYXNzd29yZF9sZW4gPSB3cGFidWZfbGVuKGNmZy0+d3BzLT5hcF9uZmNfZGV2X3B3KTsKKwkJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIldQUzogTkZDIGRldl9wYXNzd29yZCIsCisJCQkgICAgZGF0YS0+ZGV2X3Bhc3N3b3JkLCBkYXRhLT5kZXZfcGFzc3dvcmRfbGVuKTsKIAl9CiAjZW5kaWYgLyogQ09ORklHX1dQU19ORkMgKi8KIApAQCAtMTEwLDYgKzExNyw3IEBACiAJCWRhdGEtPm5ld19hcF9zZXR0aW5ncyA9CiAJCQlvc19tYWxsb2Moc2l6ZW9mKCpkYXRhLT5uZXdfYXBfc2V0dGluZ3MpKTsKIAkJaWYgKGRhdGEtPm5ld19hcF9zZXR0aW5ncyA9PSBOVUxMKSB7CisJCQlvc19mcmVlKGRhdGEtPmRldl9wYXNzd29yZCk7CiAJCQlvc19mcmVlKGRhdGEpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTE1NSw2ICsxNjMsNyBAQAogCXdwYWJ1Zl9mcmVlKGRhdGEtPmRoX3B1YmtleV9yKTsKIAl3cGFidWZfZnJlZShkYXRhLT5sYXN0X21zZyk7CiAJb3NfZnJlZShkYXRhLT5kZXZfcGFzc3dvcmQpOworCW9zX2ZyZWUoZGF0YS0+YWx0X2Rldl9wYXNzd29yZCk7CiAJb3NfZnJlZShkYXRhLT5uZXdfcHNrKTsKIAl3cHNfZGV2aWNlX2RhdGFfZnJlZSgmZGF0YS0+cGVlcl9kZXYpOwogCW9zX2ZyZWUoZGF0YS0+bmV3X2FwX3NldHRpbmdzKTsKZGlmZiAtLWdpdCBhL3NyYy93cHMvd3BzLmggYi9zcmMvd3BzL3dwcy5oCmluZGV4IGM0NWI2OGMuLjM5ZmNlNTYgMTAwNjQ0Ci0tLSBhL3NyYy93cHMvd3BzLmgKKysrIGIvc3JjL3dwcy93cHMuaApAQCAtNDIsNiArNDIsNyBAQAogICogQGNyZWRfYXR0cjogVW5wYXJzZWQgQ3JlZGVudGlhbCBhdHRyaWJ1dGUgZGF0YSAodXNlZCBvbmx5IGluIGNyZWRfY2IoKSk7CiAgKgl0aGlzIG1heSBiZSAlTlVMTCwgaWYgbm90IHVzZWQKICAqIEBjcmVkX2F0dHJfbGVuOiBMZW5ndGggb2YgY3JlZF9hdHRyIGluIG9jdGV0cworICogQGFwX2NoYW5uZWw6IEFQIGNoYW5uZWwKICAqLwogc3RydWN0IHdwc19jcmVkZW50aWFsIHsKIAl1OCBzc2lkWzMyXTsKQEAgLTU0LDYgKzU1LDcgQEAKIAl1OCBtYWNfYWRkcltFVEhfQUxFTl07CiAJY29uc3QgdTggKmNyZWRfYXR0cjsKIAlzaXplX3QgY3JlZF9hdHRyX2xlbjsKKwl1MTYgYXBfY2hhbm5lbDsKIH07CiAKICNkZWZpbmUgV1BTX0RFVl9UWVBFX0xFTiA4CkBAIC0xMDEsMTcgKzEwMyw2IEBACiAJaW50IHAycDsKIH07CiAKLXN0cnVjdCBvb2JfY29uZl9kYXRhIHsKLQllbnVtIHsKLQkJT09CX01FVEhPRF9VTktOT1dOID0gMCwKLQkJT09CX01FVEhPRF9ERVZfUFdEX0UsCi0JCU9PQl9NRVRIT0RfREVWX1BXRF9SLAotCQlPT0JfTUVUSE9EX0NSRUQsCi0JfSBvb2JfbWV0aG9kOwotCXN0cnVjdCB3cGFidWYgKmRldl9wYXNzd29yZDsKLQlzdHJ1Y3Qgd3BhYnVmICpwdWJrZXlfaGFzaDsKLX07Ci0KIC8qKgogICogc3RydWN0IHdwc19jb25maWcgLSBXUFMgY29uZmlndXJhdGlvbiBmb3IgYSBzaW5nbGUgcmVnaXN0cmF0aW9uIHByb3RvY29sIHJ1bgogICovCkBAIC02MTcsMTYgKzYwOCw2IEBACiAJc3RydWN0IHdwc19kZXZpY2VfZGF0YSBkZXY7CiAKIAkvKioKLQkgKiBvb2JfY29uZiAtIE9PQiBDb25maWcgZGF0YQotCSAqLwotCXN0cnVjdCBvb2JfY29uZl9kYXRhIG9vYl9jb25mOwotCi0JLyoqCi0JICogb29iX2Rldl9wd19pZCAtIE9PQiBEZXZpY2UgcGFzc3dvcmQgaWQKLQkgKi8KLQl1MTYgb29iX2Rldl9wd19pZDsKLQotCS8qKgogCSAqIGRoX2N0eCAtIENvbnRleHQgZGF0YSBmb3IgRGlmZmllLUhlbGxtYW4gb3BlcmF0aW9uCiAJICovCiAJdm9pZCAqZGhfY3R4OwpAQCAtNzY0LDIzICs3NDUsNiBAQAogCXN0cnVjdCB3cGFidWYgKmFwX25mY19kZXZfcHc7CiB9OwogCi1zdHJ1Y3Qgb29iX2RldmljZV9kYXRhIHsKLQljaGFyICpkZXZpY2VfbmFtZTsKLQljaGFyICpkZXZpY2VfcGF0aDsKLQl2b2lkICogKCppbml0X2Z1bmMpKHN0cnVjdCB3cHNfY29udGV4dCAqLCBzdHJ1Y3Qgb29iX2RldmljZV9kYXRhICosCi0JCQkgICAgaW50KTsKLQlzdHJ1Y3Qgd3BhYnVmICogKCpyZWFkX2Z1bmMpKHZvaWQgKik7Ci0JaW50ICgqd3JpdGVfZnVuYykodm9pZCAqLCBzdHJ1Y3Qgd3BhYnVmICopOwotCXZvaWQgKCpkZWluaXRfZnVuYykodm9pZCAqKTsKLX07Ci0KLXN0cnVjdCBvb2JfbmZjX2RldmljZV9kYXRhIHsKLQlpbnQgKCppbml0X2Z1bmMpKGNoYXIgKik7Ci0Jdm9pZCAqICgqcmVhZF9mdW5jKShzaXplX3QgKik7Ci0JaW50ICgqd3JpdGVfZnVuYykodm9pZCAqLCBzaXplX3QpOwotCXZvaWQgKCpkZWluaXRfZnVuYykodm9pZCk7Ci19OwotCiBzdHJ1Y3Qgd3BzX3JlZ2lzdHJhciAqCiB3cHNfcmVnaXN0cmFyX2luaXQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsCiAJCSAgIGNvbnN0IHN0cnVjdCB3cHNfcmVnaXN0cmFyX2NvbmZpZyAqY2ZnKTsKQEAgLTgxOSwxMSArNzgzLDYgQEAKIGludCB3cHNfcGluX3N0cl92YWxpZChjb25zdCBjaGFyICpwaW4pOwogdm9pZCB3cHNfZnJlZV9wZW5kaW5nX21zZ3Moc3RydWN0IHVwbnBfcGVuZGluZ19tZXNzYWdlICptc2dzKTsKIAotc3RydWN0IG9vYl9kZXZpY2VfZGF0YSAqIHdwc19nZXRfb29iX2RldmljZShjaGFyICpkZXZpY2VfdHlwZSk7Ci1zdHJ1Y3Qgb29iX25mY19kZXZpY2VfZGF0YSAqIHdwc19nZXRfb29iX25mY19kZXZpY2UoY2hhciAqZGV2aWNlX25hbWUpOwotaW50IHdwc19nZXRfb29iX21ldGhvZChjaGFyICptZXRob2QpOwotaW50IHdwc19wcm9jZXNzX29vYihzdHJ1Y3Qgd3BzX2NvbnRleHQgKndwcywgc3RydWN0IG9vYl9kZXZpY2VfZGF0YSAqb29iX2RldiwKLQkJICAgIGludCByZWdpc3RyYXIpOwogc3RydWN0IHdwYWJ1ZiAqIHdwc19nZXRfb29iX2NyZWQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMpOwogaW50IHdwc19vb2JfdXNlX2NyZWQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsIHN0cnVjdCB3cHNfcGFyc2VfYXR0ciAqYXR0cik7CiBpbnQgd3BzX2F0dHJfdGV4dChzdHJ1Y3Qgd3BhYnVmICpkYXRhLCBjaGFyICpidWYsIGNoYXIgKmVuZCk7CkBAIC04NTEsNiArODEwLDggQEAKIHN0cnVjdCB3cGFidWYgKiB3cHNfYnVpbGRfbmZjX3B3X3Rva2VuKHUxNiBkZXZfcHdfaWQsCiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCB3cGFidWYgKnB1YmtleSwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqZGV2X3B3KTsKK3N0cnVjdCB3cGFidWYgKiB3cHNfbmZjX3Rva2VuX2J1aWxkKGludCBuZGVmLCBpbnQgaWQsIHN0cnVjdCB3cGFidWYgKnB1YmtleSwKKwkJCQkgICAgc3RydWN0IHdwYWJ1ZiAqZGV2X3B3KTsKIHN0cnVjdCB3cGFidWYgKiB3cHNfbmZjX3Rva2VuX2dlbihpbnQgbmRlZiwgaW50ICppZCwgc3RydWN0IHdwYWJ1ZiAqKnB1YmtleSwKIAkJCQkgIHN0cnVjdCB3cGFidWYgKipwcml2a2V5LAogCQkJCSAgc3RydWN0IHdwYWJ1ZiAqKmRldl9wdyk7CkBAIC04NTgsNiArODE5LDggQEAKIC8qIG5kZWYuYyAqLwogc3RydWN0IHdwYWJ1ZiAqIG5kZWZfcGFyc2Vfd2lmaShjb25zdCBzdHJ1Y3Qgd3BhYnVmICpidWYpOwogc3RydWN0IHdwYWJ1ZiAqIG5kZWZfYnVpbGRfd2lmaShjb25zdCBzdHJ1Y3Qgd3BhYnVmICpidWYpOworc3RydWN0IHdwYWJ1ZiAqIG5kZWZfYnVpbGRfd2lmaV9oYyhpbnQgYmVnaW4pOworc3RydWN0IHdwYWJ1ZiAqIG5kZWZfYnVpbGRfd2lmaV9ocih2b2lkKTsKIAogI2lmZGVmIENPTkZJR19XUFNfU1RSSUNUCiBpbnQgd3BzX3ZhbGlkYXRlX2JlYWNvbihjb25zdCBzdHJ1Y3Qgd3BhYnVmICp3cHNfaWUpOwpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfYXR0cl9idWlsZC5jIGIvc3JjL3dwcy93cHNfYXR0cl9idWlsZC5jCmluZGV4IDliZTMwYjkuLjI5YWVlOGUgMTAwNjQ0Ci0tLSBhL3NyYy93cHMvd3BzX2F0dHJfYnVpbGQuYworKysgYi9zcmMvd3BzL3dwc19hdHRyX2J1aWxkLmMKQEAgLTM2OCwzOCArMzY4LDYgQEAKIAogCXJldHVybiAwOwogfQotCi0KLWludCB3cHNfYnVpbGRfb29iX2Rldl9wYXNzd29yZChzdHJ1Y3Qgd3BhYnVmICptc2csIHN0cnVjdCB3cHNfY29udGV4dCAqd3BzKQotewotCXU4IGRldl9wYXNzd29yZF9iaW5bV1BTX09PQl9ERVZJQ0VfUEFTU1dPUkRfTEVOXTsKLQotCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BTOiAgKiBPT0IgRGV2aWNlIFBhc3N3b3JkIik7Ci0KLQlpZiAob3NfZ2V0X3JhbmRvbSgodTggKikgJndwcy0+b29iX2Rldl9wd19pZCwgc2l6ZW9mKHUxNikpIDwgMCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogZGV2aWNlIHBhc3N3b3JkIGlkICIKLQkJCSAgICJnZW5lcmF0aW9uIGVycm9yIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jd3BzLT5vb2JfZGV2X3B3X2lkIHw9IDB4MDAxMDsKLQotCWlmIChyYW5kb21fZ2V0X2J5dGVzKGRldl9wYXNzd29yZF9iaW4sIFdQU19PT0JfREVWSUNFX1BBU1NXT1JEX0xFTikgPAotCSAgICAwKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTOiBPT0IgZGV2aWNlIHBhc3N3b3JkICIKLQkJCSAgICJnZW5lcmF0aW9uIGVycm9yIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl3cGFfc25wcmludGZfaGV4X3VwcGVyY2FzZSgKLQkJd3BhYnVmX3B1dCh3cHMtPm9vYl9jb25mLmRldl9wYXNzd29yZCwKLQkJCSAgIHdwYWJ1Zl9zaXplKHdwcy0+b29iX2NvbmYuZGV2X3Bhc3N3b3JkKSksCi0JCXdwYWJ1Zl9zaXplKHdwcy0+b29iX2NvbmYuZGV2X3Bhc3N3b3JkKSwKLQkJZGV2X3Bhc3N3b3JkX2JpbiwgV1BTX09PQl9ERVZJQ0VfUEFTU1dPUkRfTEVOKTsKLQotCXJldHVybiB3cHNfYnVpbGRfb29iX2Rldl9wdyhtc2csIHdwcy0+b29iX2Rldl9wd19pZCwgd3BzLT5kaF9wdWJrZXksCi0JCQkJICAgIGRldl9wYXNzd29yZF9iaW4sCi0JCQkJICAgIFdQU19PT0JfREVWSUNFX1BBU1NXT1JEX0xFTik7Ci19CiAjZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KIAogCmRpZmYgLS1naXQgYS9zcmMvd3BzL3dwc19hdHRyX3BhcnNlLmMgYi9zcmMvd3BzL3dwc19hdHRyX3BhcnNlLmMKaW5kZXggNWFhOWIwMC4uMzk5OWIxYiAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHNfYXR0cl9wYXJzZS5jCisrKyBiL3NyYy93cHMvd3BzX2F0dHJfcGFyc2UuYwpAQCAtNTQyLDYgKzU0MiwxNCBAQAogCQlpZiAod3BzX3BhcnNlX3ZlbmRvcl9leHQoYXR0ciwgcG9zLCBsZW4pIDwgMCkKIAkJCXJldHVybiAtMTsKIAkJYnJlYWs7CisJY2FzZSBBVFRSX0FQX0NIQU5ORUw6CisJCWlmIChsZW4gIT0gMikgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IEludmFsaWQgQVAgQ2hhbm5lbCAiCisJCQkJICAgImxlbmd0aCAldSIsIGxlbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXR0ci0+YXBfY2hhbm5lbCA9IHBvczsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IFVuc3VwcG9ydGVkIGF0dHJpYnV0ZSB0eXBlIDB4JXggIgogCQkJICAgImxlbj0ldSIsIHR5cGUsIGxlbik7CmRpZmYgLS1naXQgYS9zcmMvd3BzL3dwc19hdHRyX3BhcnNlLmggYi9zcmMvd3BzL3dwc19hdHRyX3BhcnNlLmgKaW5kZXggMzMyZTk2Ni4uODhlNTFhNCAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHNfYXR0cl9wYXJzZS5oCisrKyBiL3NyYy93cHMvd3BzX2F0dHJfcGFyc2UuaApAQCAtNTYsNiArNTYsNyBAQAogCWNvbnN0IHU4ICpzZXR0aW5nc19kZWxheV90aW1lOyAvKiAxIG9jdGV0ICovCiAJY29uc3QgdTggKm5ldHdvcmtfa2V5X3NoYXJlYWJsZTsgLyogMSBvY3RldCAoQm9vbCkgKi8KIAljb25zdCB1OCAqcmVxdWVzdF90b19lbnJvbGw7IC8qIDEgb2N0ZXQgKEJvb2wpICovCisJY29uc3QgdTggKmFwX2NoYW5uZWw7IC8qIDIgb2N0ZXRzICovCiAKIAkvKiB2YXJpYWJsZSBsZW5ndGggZmllbGRzICovCiAJY29uc3QgdTggKm1hbnVmYWN0dXJlcjsKZGlmZiAtLWdpdCBhL3NyYy93cHMvd3BzX2F0dHJfcHJvY2Vzcy5jIGIvc3JjL3dwcy93cHNfYXR0cl9wcm9jZXNzLmMKaW5kZXggZDRjNmU4OC4uYjgxZjEwNiAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHNfYXR0cl9wcm9jZXNzLmMKKysrIGIvc3JjL3dwcy93cHNfYXR0cl9wcm9jZXNzLmMKQEAgLTI1OCw2ICsyNTgsMTkgQEAKIH0KIAogCitzdGF0aWMgaW50IHdwc19wcm9jZXNzX2NyZWRfYXBfY2hhbm5lbChzdHJ1Y3Qgd3BzX2NyZWRlbnRpYWwgKmNyZWQsCisJCQkJICAgICAgIGNvbnN0IHU4ICphcF9jaGFubmVsKQoreworCWlmIChhcF9jaGFubmVsID09IE5VTEwpCisJCXJldHVybiAwOyAvKiBvcHRpb25hbCBhdHRyaWJ1dGUgKi8KKworCWNyZWQtPmFwX2NoYW5uZWwgPSBXUEFfR0VUX0JFMTYoYXBfY2hhbm5lbCk7CisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IEFQIENoYW5uZWw6ICV1IiwgY3JlZC0+YXBfY2hhbm5lbCk7CisKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgaW50IHdwc193b3JrYXJvdW5kX2NyZWRfa2V5KHN0cnVjdCB3cHNfY3JlZGVudGlhbCAqY3JlZCkKIHsKIAlpZiAoY3JlZC0+YXV0aF90eXBlICYgKFdQU19BVVRIX1dQQVBTSyB8IFdQU19BVVRIX1dQQTJQU0spICYmCkBAIC0zMDMsNyArMzE2LDggQEAKIAkgICAgd3BzX3Byb2Nlc3NfY3JlZF9lYXBfaWRlbnRpdHkoY3JlZCwgYXR0ci0+ZWFwX2lkZW50aXR5LAogCQkJCQkgIGF0dHItPmVhcF9pZGVudGl0eV9sZW4pIHx8CiAJICAgIHdwc19wcm9jZXNzX2NyZWRfa2V5X3Byb3ZfYXV0byhjcmVkLCBhdHRyLT5rZXlfcHJvdl9hdXRvKSB8fAotCSAgICB3cHNfcHJvY2Vzc19jcmVkXzgwMl8xeF9lbmFibGVkKGNyZWQsIGF0dHItPmRvdDF4X2VuYWJsZWQpKQorCSAgICB3cHNfcHJvY2Vzc19jcmVkXzgwMl8xeF9lbmFibGVkKGNyZWQsIGF0dHItPmRvdDF4X2VuYWJsZWQpIHx8CisJICAgIHdwc19wcm9jZXNzX2NyZWRfYXBfY2hhbm5lbChjcmVkLCBhdHRyLT5hcF9jaGFubmVsKSkKIAkJcmV0dXJuIC0xOwogCiAJcmV0dXJuIHdwc193b3JrYXJvdW5kX2NyZWRfa2V5KGNyZWQpOwpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfY29tbW9uLmMgYi9zcmMvd3BzL3dwc19jb21tb24uYwppbmRleCA1YTg4MTdmLi4wODk3YjdiIDEwMDY0NAotLS0gYS9zcmMvd3BzL3dwc19jb21tb24uYworKysgYi9zcmMvd3BzL3dwc19jb21tb24uYwpAQCAtMzc1LDg0ICszNzUsNiBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgd3BhYnVmICogd3BzX2dldF9vb2JfZGV2X3B3ZChzdHJ1Y3Qgd3BzX2NvbnRleHQgKndwcykKLXsKLQlzdHJ1Y3Qgd3BhYnVmICpkYXRhOwotCi0JZGF0YSA9IHdwYWJ1Zl9hbGxvYygyMDApOwotCWlmIChkYXRhID09IE5VTEwpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIE9PQiAiCi0JCQkgICAiZGV2aWNlIHBhc3N3b3JkIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQl3cGFidWZfZnJlZSh3cHMtPm9vYl9jb25mLmRldl9wYXNzd29yZCk7Ci0Jd3BzLT5vb2JfY29uZi5kZXZfcGFzc3dvcmQgPQotCQl3cGFidWZfYWxsb2MoV1BTX09PQl9ERVZJQ0VfUEFTU1dPUkRfTEVOICogMiArIDEpOwotCWlmICh3cHMtPm9vYl9jb25mLmRldl9wYXNzd29yZCA9PSBOVUxMKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBPT0IgIgotCQkJICAgImRldmljZSBwYXNzd29yZCIpOwotCQl3cGFidWZfZnJlZShkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKHdwc19idWlsZF92ZXJzaW9uKGRhdGEpIHx8Ci0JICAgIHdwc19idWlsZF9vb2JfZGV2X3Bhc3N3b3JkKGRhdGEsIHdwcykgfHwKLQkgICAgd3BzX2J1aWxkX3dmYV9leHQoZGF0YSwgMCwgTlVMTCwgMCkpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IEJ1aWxkIE9PQiBkZXZpY2UgcGFzc3dvcmQgIgotCQkJICAgImF0dHJpYnV0ZSBlcnJvciIpOwotCQl3cGFidWZfZnJlZShkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLQotc3RhdGljIGludCB3cHNfcGFyc2Vfb29iX2Rldl9wd2Qoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsCi0JCQkJIHN0cnVjdCB3cGFidWYgKmRhdGEpCi17Ci0Jc3RydWN0IG9vYl9jb25mX2RhdGEgKm9vYl9jb25mID0gJndwcy0+b29iX2NvbmY7Ci0Jc3RydWN0IHdwc19wYXJzZV9hdHRyIGF0dHI7Ci0JY29uc3QgdTggKnBvczsKLQlzaXplX3QgcHdfbGVuOwotCi0JaWYgKHdwc19wYXJzZV9tc2coZGF0YSwgJmF0dHIpIDwgMCB8fAotCSAgICBhdHRyLm9vYl9kZXZfcGFzc3dvcmQgPT0gTlVMTCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogT09CIGRldmljZSBwYXNzd29yZCBub3QgZm91bmQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXBvcyA9IGF0dHIub29iX2Rldl9wYXNzd29yZDsKLQotCXdwYWJ1Zl9mcmVlKG9vYl9jb25mLT5wdWJrZXlfaGFzaCk7Ci0Jb29iX2NvbmYtPnB1YmtleV9oYXNoID0KLQkJd3BhYnVmX2FsbG9jX2NvcHkocG9zLCBXUFNfT09CX1BVQktFWV9IQVNIX0xFTik7Ci0JaWYgKG9vYl9jb25mLT5wdWJrZXlfaGFzaCA9PSBOVUxMKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBPT0IgIgotCQkJICAgInB1YmxpYyBrZXkgaGFzaCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBvcyArPSBXUFNfT09CX1BVQktFWV9IQVNIX0xFTjsKLQotCXdwcy0+b29iX2Rldl9wd19pZCA9IFdQQV9HRVRfQkUxNihwb3MpOwotCXBvcyArPSBzaXplb2Yod3BzLT5vb2JfZGV2X3B3X2lkKTsKLQotCXB3X2xlbiA9IGF0dHIub29iX2Rldl9wYXNzd29yZF9sZW4gLSBXUFNfT09CX1BVQktFWV9IQVNIX0xFTiAtIDI7Ci0Jb29iX2NvbmYtPmRldl9wYXNzd29yZCA9IHdwYWJ1Zl9hbGxvYyhwd19sZW4gKiAyICsgMSk7Ci0JaWYgKG9vYl9jb25mLT5kZXZfcGFzc3dvcmQgPT0gTlVMTCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgT09CICIKLQkJCSAgICJkZXZpY2UgcGFzc3dvcmQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl3cGFfc25wcmludGZfaGV4X3VwcGVyY2FzZSh3cGFidWZfcHV0KG9vYl9jb25mLT5kZXZfcGFzc3dvcmQsCi0JCQkJCSAgICAgIHB3X2xlbiAqIDIgKyAxKSwKLQkJCQkgICBwd19sZW4gKiAyICsgMSwgcG9zLCBwd19sZW4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQogaW50IHdwc19vb2JfdXNlX2NyZWQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsIHN0cnVjdCB3cHNfcGFyc2VfYXR0ciAqYXR0cikKIHsKIAlzdHJ1Y3Qgd3BhYnVmIG1zZzsKQEAgLTQ3NywxMDcgKzM5OSw2IEBACiB9CiAKIAotc3RhdGljIGludCB3cHNfcGFyc2Vfb29iX2NyZWQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsIHN0cnVjdCB3cGFidWYgKmRhdGEpCi17Ci0Jc3RydWN0IHdwc19wYXJzZV9hdHRyIGF0dHI7Ci0KLQlpZiAod3BzX3BhcnNlX21zZyhkYXRhLCAmYXR0cikgPCAwIHx8IGF0dHIubnVtX2NyZWQgPD0gMCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogT09CIGNyZWRlbnRpYWwgbm90IGZvdW5kIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gd3BzX29vYl91c2VfY3JlZCh3cHMsICZhdHRyKTsKLX0KLQotCi1pbnQgd3BzX3Byb2Nlc3Nfb29iKHN0cnVjdCB3cHNfY29udGV4dCAqd3BzLCBzdHJ1Y3Qgb29iX2RldmljZV9kYXRhICpvb2JfZGV2LAotCQkgICAgaW50IHJlZ2lzdHJhcikKLXsKLQlzdHJ1Y3Qgd3BhYnVmICpkYXRhOwotCWludCByZXQsIHdyaXRlX2YsIG9vYl9tZXRob2QgPSB3cHMtPm9vYl9jb25mLm9vYl9tZXRob2Q7Ci0Jdm9pZCAqb29iX3ByaXY7Ci0KLQl3cml0ZV9mID0gb29iX21ldGhvZCA9PSBPT0JfTUVUSE9EX0RFVl9QV0RfRSA/ICFyZWdpc3RyYXIgOiByZWdpc3RyYXI7Ci0KLQlvb2JfcHJpdiA9IG9vYl9kZXYtPmluaXRfZnVuYyh3cHMsIG9vYl9kZXYsIHJlZ2lzdHJhcik7Ci0JaWYgKG9vYl9wcml2ID09IE5VTEwpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IEZhaWxlZCB0byBpbml0aWFsaXplIE9PQiBkZXZpY2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICh3cml0ZV9mKSB7Ci0JCWlmIChvb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfQ1JFRCkKLQkJCWRhdGEgPSB3cHNfZ2V0X29vYl9jcmVkKHdwcyk7Ci0JCWVsc2UKLQkJCWRhdGEgPSB3cHNfZ2V0X29vYl9kZXZfcHdkKHdwcyk7Ci0KLQkJcmV0ID0gMDsKLQkJaWYgKGRhdGEgPT0gTlVMTCB8fCBvb2JfZGV2LT53cml0ZV9mdW5jKG9vYl9wcml2LCBkYXRhKSA8IDApCi0JCQlyZXQgPSAtMTsKLQl9IGVsc2UgewotCQlkYXRhID0gb29iX2Rldi0+cmVhZF9mdW5jKG9vYl9wcml2KTsKLQkJaWYgKGRhdGEgPT0gTlVMTCkKLQkJCXJldCA9IC0xOwotCQllbHNlIHsKLQkJCWlmIChvb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfQ1JFRCkKLQkJCQlyZXQgPSB3cHNfcGFyc2Vfb29iX2NyZWQod3BzLCBkYXRhKTsKLQkJCWVsc2UKLQkJCQlyZXQgPSB3cHNfcGFyc2Vfb29iX2Rldl9wd2Qod3BzLCBkYXRhKTsKLQkJfQotCX0KLQl3cGFidWZfZnJlZShkYXRhKTsKLQlvb2JfZGV2LT5kZWluaXRfZnVuYyhvb2JfcHJpdik7Ci0KLQlpZiAocmV0IDwgMCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogRmFpbGVkIHRvIHByb2Nlc3MgT09CIGRhdGEiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLXN0cnVjdCBvb2JfZGV2aWNlX2RhdGEgKiB3cHNfZ2V0X29vYl9kZXZpY2UoY2hhciAqZGV2aWNlX3R5cGUpCi17Ci0jaWZkZWYgQ09ORklHX1dQU19VRkQKLQlpZiAob3Nfc3Ryc3RyKGRldmljZV90eXBlLCAidWZkIikgIT0gTlVMTCkKLQkJcmV0dXJuICZvb2JfdWZkX2RldmljZV9kYXRhOwotI2VuZGlmIC8qIENPTkZJR19XUFNfVUZEICovCi0jaWZkZWYgQ09ORklHX1dQU19ORkMKLQlpZiAob3Nfc3Ryc3RyKGRldmljZV90eXBlLCAibmZjIikgIT0gTlVMTCkKLQkJcmV0dXJuICZvb2JfbmZjX2RldmljZV9kYXRhOwotI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCi0KLQlyZXR1cm4gTlVMTDsKLX0KLQotCi0jaWZkZWYgQ09ORklHX1dQU19ORkMKLXN0cnVjdCBvb2JfbmZjX2RldmljZV9kYXRhICogd3BzX2dldF9vb2JfbmZjX2RldmljZShjaGFyICpkZXZpY2VfbmFtZSkKLXsKLQlpZiAoZGV2aWNlX25hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0jaWZkZWYgQ09ORklHX1dQU19ORkNfUE41MzEKLQlpZiAob3Nfc3Ryc3RyKGRldmljZV9uYW1lLCAicG41MzEiKSAhPSBOVUxMKQotCQlyZXR1cm4gJm9vYl9uZmNfcG41MzFfZGV2aWNlX2RhdGE7Ci0jZW5kaWYgLyogQ09ORklHX1dQU19ORkNfUE41MzEgKi8KLQotCXJldHVybiBOVUxMOwotfQotI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCi0KLQotaW50IHdwc19nZXRfb29iX21ldGhvZChjaGFyICptZXRob2QpCi17Ci0JaWYgKG9zX3N0cnN0cihtZXRob2QsICJwaW4tZSIpICE9IE5VTEwpCi0JCXJldHVybiBPT0JfTUVUSE9EX0RFVl9QV0RfRTsKLQlpZiAob3Nfc3Ryc3RyKG1ldGhvZCwgInBpbi1yIikgIT0gTlVMTCkKLQkJcmV0dXJuIE9PQl9NRVRIT0RfREVWX1BXRF9SOwotCWlmIChvc19zdHJzdHIobWV0aG9kLCAiY3JlZCIpICE9IE5VTEwpCi0JCXJldHVybiBPT0JfTUVUSE9EX0NSRUQ7Ci0JcmV0dXJuIE9PQl9NRVRIT0RfVU5LTk9XTjsKLX0KLQogI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCiAKIApAQCAtNjU3LDE1ICs0NzgsMTAgQEAKICNpZmRlZiBDT05GSUdfV1BTMgogCQltZXRob2RzIHw9IFdQU19DT05GSUdfVklSVF9ESVNQTEFZOwogI2VuZGlmIC8qIENPTkZJR19XUFMyICovCi0jaWZkZWYgQ09ORklHX1dQU19VRkQKLQkJbWV0aG9kcyB8PSBXUFNfQ09ORklHX1VTQkE7Ci0jZW5kaWYgLyogQ09ORklHX1dQU19VRkQgKi8KICNpZmRlZiBDT05GSUdfV1BTX05GQwogCQltZXRob2RzIHw9IFdQU19DT05GSUdfTkZDX0lOVEVSRkFDRTsKICNlbmRpZiAvKiBDT05GSUdfV1BTX05GQyAqLwogCX0gZWxzZSB7Ci0JCWlmIChvc19zdHJzdHIoc3RyLCAidXNiYSIpKQotCQkJbWV0aG9kcyB8PSBXUFNfQ09ORklHX1VTQkE7CiAJCWlmIChvc19zdHJzdHIoc3RyLCAiZXRoZXJuZXQiKSkKIAkJCW1ldGhvZHMgfD0gV1BTX0NPTkZJR19FVEhFUk5FVDsKIAkJaWYgKG9zX3N0cnN0cihzdHIsICJsYWJlbCIpKQpAQCAtNzQ2LDExICs1NjIsMzQgQEAKIAogCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKKworc3RydWN0IHdwYWJ1ZiAqIHdwc19uZmNfdG9rZW5fYnVpbGQoaW50IG5kZWYsIGludCBpZCwgc3RydWN0IHdwYWJ1ZiAqcHVia2V5LAorCQkJCSAgICBzdHJ1Y3Qgd3BhYnVmICpkZXZfcHcpCit7CisJc3RydWN0IHdwYWJ1ZiAqcmV0OworCisJaWYgKHB1YmtleSA9PSBOVUxMIHx8IGRldl9wdyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJldCA9IHdwc19idWlsZF9uZmNfcHdfdG9rZW4oaWQsIHB1YmtleSwgZGV2X3B3KTsKKwlpZiAobmRlZiAmJiByZXQpIHsKKwkJc3RydWN0IHdwYWJ1ZiAqdG1wOworCQl0bXAgPSBuZGVmX2J1aWxkX3dpZmkocmV0KTsKKwkJd3BhYnVmX2ZyZWUocmV0KTsKKwkJaWYgKHRtcCA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCXJldCA9IHRtcDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKIHN0cnVjdCB3cGFidWYgKiB3cHNfbmZjX3Rva2VuX2dlbihpbnQgbmRlZiwgaW50ICppZCwgc3RydWN0IHdwYWJ1ZiAqKnB1YmtleSwKIAkJCQkgIHN0cnVjdCB3cGFidWYgKipwcml2a2V5LAogCQkJCSAgc3RydWN0IHdwYWJ1ZiAqKmRldl9wdykKIHsKLQlzdHJ1Y3Qgd3BhYnVmICpwcml2ID0gTlVMTCwgKnB1YiA9IE5VTEwsICpwdywgKnJldDsKKwlzdHJ1Y3Qgd3BhYnVmICpwcml2ID0gTlVMTCwgKnB1YiA9IE5VTEwsICpwdzsKIAl2b2lkICpkaF9jdHg7CiAJdTE2IHZhbDsKIApAQCAtNzgwLDE2ICs2MTksNyBAQAogCXdwYWJ1Zl9mcmVlKCpkZXZfcHcpOwogCSpkZXZfcHcgPSBwdzsKIAotCXJldCA9IHdwc19idWlsZF9uZmNfcHdfdG9rZW4oKmlkLCAqcHVia2V5LCAqZGV2X3B3KTsKLQlpZiAobmRlZiAmJiByZXQpIHsKLQkJc3RydWN0IHdwYWJ1ZiAqdG1wOwotCQl0bXAgPSBuZGVmX2J1aWxkX3dpZmkocmV0KTsKLQkJd3BhYnVmX2ZyZWUocmV0KTsKLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldCA9IHRtcDsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiB3cHNfbmZjX3Rva2VuX2J1aWxkKG5kZWYsICppZCwgKnB1YmtleSwgKmRldl9wdyk7CiB9CisKICNlbmRpZiAvKiBDT05GSUdfV1BTX05GQyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfZW5yb2xsZWUuYyBiL3NyYy93cHMvd3BzX2Vucm9sbGVlLmMKaW5kZXggMzg5YWE4NC4uOWMwY2ViYiAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHNfZW5yb2xsZWUuYworKysgYi9zcmMvd3BzL3dwc19lbnJvbGxlZS5jCkBAIC01MjMsMjMgKzUyMyw2IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotCWlmICh3cHMtPmRldl9wd19pZCAhPSBERVZfUFdfREVGQVVMVCAmJgotCSAgICB3cHMtPndwcy0+b29iX2NvbmYucHVia2V5X2hhc2gpIHsKLQkJY29uc3QgdTggKmFkZHJbMV07Ci0JCXU4IGhhc2hbV1BTX0hBU0hfTEVOXTsKLQotCQlhZGRyWzBdID0gcGs7Ci0JCXNoYTI1Nl92ZWN0b3IoMSwgYWRkciwgJnBrX2xlbiwgaGFzaCk7Ci0JCWlmIChvc19tZW1jbXAoaGFzaCwKLQkJCSAgICAgIHdwYWJ1Zl9oZWFkKHdwcy0+d3BzLT5vb2JfY29uZi5wdWJrZXlfaGFzaCksCi0JCQkgICAgICBXUFNfT09CX1BVQktFWV9IQVNIX0xFTikgIT0gMCkgewotCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IFB1YmxpYyBLZXkgaGFzaCBlcnJvciIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCi0KIAl3cGFidWZfZnJlZSh3cHMtPmRoX3B1YmtleV9yKTsKIAl3cHMtPmRoX3B1YmtleV9yID0gd3BhYnVmX2FsbG9jX2NvcHkocGssIHBrX2xlbik7CiAJaWYgKHdwcy0+ZGhfcHVia2V5X3IgPT0gTlVMTCkKQEAgLTY2NSw2ICs2NDgsNyBAQAogewogCXN0cnVjdCB3cHNfcGFyc2VfYXR0ciBhdHRyOwogCXN0cnVjdCB3cGFidWYgbXNnOworCWludCByZXQgPSAwOwogCiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IFJlY2VpdmVkIENyZWRlbnRpYWwiKTsKIAlvc19tZW1zZXQoJndwcy0+Y3JlZCwgMCwgc2l6ZW9mKHdwcy0+Y3JlZCkpOwpAQCAtNzE0LDEyICs2OTgsMTIgQEAKIAlpZiAod3BzLT53cHMtPmNyZWRfY2IpIHsKIAkJd3BzLT5jcmVkLmNyZWRfYXR0ciA9IGNyZWQgLSA0OwogCQl3cHMtPmNyZWQuY3JlZF9hdHRyX2xlbiA9IGNyZWRfbGVuICsgNDsKLQkJd3BzLT53cHMtPmNyZWRfY2Iod3BzLT53cHMtPmNiX2N0eCwgJndwcy0+Y3JlZCk7CisJCXJldCA9IHdwcy0+d3BzLT5jcmVkX2NiKHdwcy0+d3BzLT5jYl9jdHgsICZ3cHMtPmNyZWQpOwogCQl3cHMtPmNyZWQuY3JlZF9hdHRyID0gTlVMTDsKIAkJd3BzLT5jcmVkLmNyZWRfYXR0cl9sZW4gPSAwOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtODUzLDYgKzgzNywzOSBAQAogfQogCiAKK3N0YXRpYyBpbnQgd3BzX3Byb2Nlc3NfZGV2X3B3X2lkKHN0cnVjdCB3cHNfZGF0YSAqd3BzLCBjb25zdCB1OCAqZGV2X3B3X2lkKQoreworCXUxNiBpZDsKKworCWlmIChkZXZfcHdfaWQgPT0gTlVMTCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogRGV2aWNlIFBhc3N3b3JkIElEIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZCA9IFdQQV9HRVRfQkUxNihkZXZfcHdfaWQpOworCWlmICh3cHMtPmRldl9wd19pZCA9PSBpZCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogRGV2aWNlIFBhc3N3b3JkIElEICV1IiwgaWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogUmVnaXN0cmFyIHRyeWluZyB0byBjaGFuZ2UgRGV2aWNlIFBhc3N3b3JkICIKKwkJICAgIklEIGZyb20gJXUgdG8gJXUiLCB3cHMtPmRldl9wd19pZCwgaWQpOworCisJaWYgKHdwcy0+YWx0X2Rldl9wYXNzd29yZCAmJiB3cHMtPmFsdF9kZXZfcHdfaWQgPT0gaWQpIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IEZvdW5kIGEgbWF0Y2hpbmcgRGV2aWNlIFBhc3N3b3JkIik7CisJCW9zX2ZyZWUod3BzLT5kZXZfcGFzc3dvcmQpOworCQl3cHMtPmRldl9wd19pZCA9IHdwcy0+YWx0X2Rldl9wd19pZDsKKwkJd3BzLT5kZXZfcGFzc3dvcmQgPSB3cHMtPmFsdF9kZXZfcGFzc3dvcmQ7CisJCXdwcy0+ZGV2X3Bhc3N3b3JkX2xlbiA9IHdwcy0+YWx0X2Rldl9wYXNzd29yZF9sZW47CisJCXdwcy0+YWx0X2Rldl9wYXNzd29yZCA9IE5VTEw7CisJCXdwcy0+YWx0X2Rldl9wYXNzd29yZF9sZW4gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKwogc3RhdGljIGVudW0gd3BzX3Byb2Nlc3NfcmVzIHdwc19wcm9jZXNzX20yKHN0cnVjdCB3cHNfZGF0YSAqd3BzLAogCQkJCQkgICBjb25zdCBzdHJ1Y3Qgd3BhYnVmICptc2csCiAJCQkJCSAgIHN0cnVjdCB3cHNfcGFyc2VfYXR0ciAqYXR0cikKQEAgLTg2OCw3ICs4ODUsOCBAQAogCiAJaWYgKHdwc19wcm9jZXNzX3JlZ2lzdHJhcl9ub25jZSh3cHMsIGF0dHItPnJlZ2lzdHJhcl9ub25jZSkgfHwKIAkgICAgd3BzX3Byb2Nlc3NfZW5yb2xsZWVfbm9uY2Uod3BzLCBhdHRyLT5lbnJvbGxlZV9ub25jZSkgfHwKLQkgICAgd3BzX3Byb2Nlc3NfdXVpZF9yKHdwcywgYXR0ci0+dXVpZF9yKSkgeworCSAgICB3cHNfcHJvY2Vzc191dWlkX3Iod3BzLCBhdHRyLT51dWlkX3IpIHx8CisJICAgIHdwc19wcm9jZXNzX2Rldl9wd19pZCh3cHMsIGF0dHItPmRldl9wYXNzd29yZF9pZCkpIHsKIAkJd3BzLT5zdGF0ZSA9IFNFTkRfV1NDX05BQ0s7CiAJCXJldHVybiBXUFNfQ09OVElOVUU7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfaS5oIGIvc3JjL3dwcy93cHNfaS5oCmluZGV4IDg2YWQyNDguLjZlZmMzYmYgMTAwNjQ0Ci0tLSBhL3NyYy93cHMvd3BzX2kuaAorKysgYi9zcmMvd3BzL3dwc19pLmgKQEAgLTcxLDYgKzcxLDkgQEAKIAlzaXplX3QgZGV2X3Bhc3N3b3JkX2xlbjsKIAl1MTYgZGV2X3B3X2lkOwogCWludCBwYmM7CisJdTggKmFsdF9kZXZfcGFzc3dvcmQ7CisJc2l6ZV90IGFsdF9kZXZfcGFzc3dvcmRfbGVuOworCXUxNiBhbHRfZGV2X3B3X2lkOwogCiAJLyoqCiAJICogcmVxdWVzdF90eXBlIC0gUmVxdWVzdCBUeXBlIGF0dHJpYnV0ZSBmcm9tIChSZSlBc3NvY1JlcQpAQCAtMTM3LDEwICsxNDAsNiBAQAogdm9pZCB3cHNfcGJjX292ZXJsYXBfZXZlbnQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMpOwogdm9pZCB3cHNfcGJjX3RpbWVvdXRfZXZlbnQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMpOwogCi1leHRlcm4gc3RydWN0IG9vYl9kZXZpY2VfZGF0YSBvb2JfdWZkX2RldmljZV9kYXRhOwotZXh0ZXJuIHN0cnVjdCBvb2JfZGV2aWNlX2RhdGEgb29iX25mY19kZXZpY2VfZGF0YTsKLWV4dGVybiBzdHJ1Y3Qgb29iX25mY19kZXZpY2VfZGF0YSBvb2JfbmZjX3BuNTMxX2RldmljZV9kYXRhOwotCiBzdHJ1Y3Qgd3BhYnVmICogd3BzX2J1aWxkX3dzY19hY2soc3RydWN0IHdwc19kYXRhICp3cHMpOwogc3RydWN0IHdwYWJ1ZiAqIHdwc19idWlsZF93c2NfbmFjayhzdHJ1Y3Qgd3BzX2RhdGEgKndwcyk7CiAKQEAgLTE2OSw3ICsxNjgsNiBAQAogaW50IHdwc19idWlsZF9vb2JfZGV2X3B3KHN0cnVjdCB3cGFidWYgKm1zZywgdTE2IGRldl9wd19pZCwKIAkJCSBjb25zdCBzdHJ1Y3Qgd3BhYnVmICpwdWJrZXksIGNvbnN0IHU4ICpkZXZfcHcsCiAJCQkgc2l6ZV90IGRldl9wd19sZW4pOwotaW50IHdwc19idWlsZF9vb2JfZGV2X3Bhc3N3b3JkKHN0cnVjdCB3cGFidWYgKm1zZywgc3RydWN0IHdwc19jb250ZXh0ICp3cHMpOwogc3RydWN0IHdwYWJ1ZiAqIHdwc19pZV9lbmNhcHN1bGF0ZShzdHJ1Y3Qgd3BhYnVmICpkYXRhKTsKIAogLyogd3BzX2F0dHJfcHJvY2Vzcy5jICovCmRpZmYgLS1naXQgYS9zcmMvd3BzL3dwc19uZmMuYyBiL3NyYy93cHMvd3BzX25mYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODA0MzUwLi4wMDAwMDAwCi0tLSBhL3NyYy93cHMvd3BzX25mYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBORkMgcm91dGluZXMgZm9yIFdpLUZpIFByb3RlY3RlZCBTZXR1cAotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIE1hc2FzaGkgSG9ubWEgPG1hc2FzaGkuaG9ubWFAZ21haWwuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCi0gKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLSNpbmNsdWRlICJ3cHMvd3BzLmgiCi0jaW5jbHVkZSAid3BzX2kuaCIKLQotCi1zdHJ1Y3Qgd3BzX25mY19kYXRhIHsKLQlzdHJ1Y3Qgb29iX25mY19kZXZpY2VfZGF0YSAqb29iX25mY19kZXY7Ci19OwotCi0KLXN0YXRpYyB2b2lkICogaW5pdF9uZmMoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsCi0JCSAgICAgICBzdHJ1Y3Qgb29iX2RldmljZV9kYXRhICpvb2JfZGV2LCBpbnQgcmVnaXN0cmFyKQotewotCXN0cnVjdCBvb2JfbmZjX2RldmljZV9kYXRhICpvb2JfbmZjX2RldjsKLQlzdHJ1Y3Qgd3BzX25mY19kYXRhICpkYXRhOwotCi0Jb29iX25mY19kZXYgPSB3cHNfZ2V0X29vYl9uZmNfZGV2aWNlKG9vYl9kZXYtPmRldmljZV9uYW1lKTsKLQlpZiAob29iX25mY19kZXYgPT0gTlVMTCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoTkZDKTogVW5rbm93biBORkMgZGV2aWNlICglcykiLAotCQkJICAgb29iX2Rldi0+ZGV2aWNlX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAob29iX25mY19kZXYtPmluaXRfZnVuYyhvb2JfZGV2LT5kZXZpY2VfcGF0aCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQotCWRhdGEgPSBvc196YWxsb2Moc2l6ZW9mKCpkYXRhKSk7Ci0JaWYgKGRhdGEgPT0gTlVMTCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoTkZDKTogRmFpbGVkIHRvIGFsbG9jYXRlICIKLQkJCSAgICJuZmMgZGF0YSBhcmVhIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkYXRhLT5vb2JfbmZjX2RldiA9IG9vYl9uZmNfZGV2OwotCXJldHVybiBkYXRhOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3Qgd3BhYnVmICogcmVhZF9uZmModm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3Qgd3BzX25mY19kYXRhICpkYXRhID0gcHJpdjsKLQlzdHJ1Y3Qgd3BhYnVmICp3aWZpLCAqYnVmOwotCWNoYXIgKnJhd19kYXRhOwotCXNpemVfdCBsZW47Ci0KLQlyYXdfZGF0YSA9IGRhdGEtPm9vYl9uZmNfZGV2LT5yZWFkX2Z1bmMoJmxlbik7Ci0JaWYgKHJhd19kYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0Jd2lmaSA9IHdwYWJ1Zl9hbGxvY19jb3B5KHJhd19kYXRhLCBsZW4pOwotCW9zX2ZyZWUocmF3X2RhdGEpOwotCWlmICh3aWZpID09IE5VTEwpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKE5GQyk6IEZhaWxlZCB0byBhbGxvY2F0ZSAiCi0JCQkgICAibmZjIHJlYWQgYXJlYSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlidWYgPSBuZGVmX3BhcnNlX3dpZmkod2lmaSk7Ci0Jd3BhYnVmX2ZyZWUod2lmaSk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoTkZDKTogRmFpbGVkIHRvIHVud3JhcCIpOwotCXJldHVybiBidWY7Ci19Ci0KLQotc3RhdGljIGludCB3cml0ZV9uZmModm9pZCAqcHJpdiwgc3RydWN0IHdwYWJ1ZiAqYnVmKQotewotCXN0cnVjdCB3cHNfbmZjX2RhdGEgKmRhdGEgPSBwcml2OwotCXN0cnVjdCB3cGFidWYgKndpZmk7Ci0JaW50IHJldDsKLQotCXdpZmkgPSBuZGVmX2J1aWxkX3dpZmkoYnVmKTsKLQlpZiAod2lmaSA9PSBOVUxMKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTIChORkMpOiBGYWlsZWQgdG8gd3JhcCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0ID0gZGF0YS0+b29iX25mY19kZXYtPndyaXRlX2Z1bmMod3BhYnVmX21oZWFkKHdpZmkpLAotCQkJCQkgICAgd3BhYnVmX2xlbih3aWZpKSk7Ci0Jd3BhYnVmX2ZyZWUod2lmaSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgdm9pZCBkZWluaXRfbmZjKHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IHdwc19uZmNfZGF0YSAqZGF0YSA9IHByaXY7Ci0KLQlkYXRhLT5vb2JfbmZjX2Rldi0+ZGVpbml0X2Z1bmMoKTsKLQotCW9zX2ZyZWUoZGF0YSk7Ci19Ci0KLQotc3RydWN0IG9vYl9kZXZpY2VfZGF0YSBvb2JfbmZjX2RldmljZV9kYXRhID0gewotCS5kZXZpY2VfbmFtZQk9IE5VTEwsCi0JLmRldmljZV9wYXRoCT0gTlVMTCwKLQkuaW5pdF9mdW5jCT0gaW5pdF9uZmMsCi0JLnJlYWRfZnVuYwk9IHJlYWRfbmZjLAotCS53cml0ZV9mdW5jCT0gd3JpdGVfbmZjLAotCS5kZWluaXRfZnVuYwk9IGRlaW5pdF9uZmMsCi19OwpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfbmZjX3BuNTMxLmMgYi9zcmMvd3BzL3dwc19uZmNfcG41MzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiZjQ1Ny4uMDAwMDAwMAotLS0gYS9zcmMvd3BzL3dwc19uZmNfcG41MzEuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTkZDIFBONTMxIHJvdXRpbmVzIGZvciBXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBNYXNhc2hpIEhvbm1hIDxtYXNhc2hpLmhvbm1hQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgotICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2luY2x1ZGUgImNvbW1vbi5oIgotCi0jaW5jbHVkZSAid3BzL3dwcy5oIgotI2luY2x1ZGUgIndwc19pLmgiCi0KLSNpbmNsdWRlICJXcHNOZmNUeXBlLmgiCi0jaW5jbHVkZSAiV3BzTmZjLmgiCi0KLQotc3RhdGljIGludCBpbml0X25mY19wbjUzMShjaGFyICpwYXRoKQotewotCXUzMiByZXQ7Ci0KLQlyZXQgPSBXcHNOZmNJbml0KCk7Ci0JaWYgKHJldCAhPSBXUFNfTkZDTElCX0VSUl9TVUNDRVNTKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTIChQTjUzMSk6IEZhaWxlZCB0byBpbml0aWFsaXplICIKLQkJCSAgICJORkMgTGlicmFyeTogMHglMDh4IiwgcmV0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldCA9IFdwc05mY09wZW5EZXZpY2UoKGludDggKikgcGF0aCk7Ci0JaWYgKHJldCAhPSBXUFNfTkZDTElCX0VSUl9TVUNDRVNTKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTIChQTjUzMSk6IEZhaWxlZCB0byBvcGVuICIKLQkJCSAgICJORkMgRGV2aWNlKCVzKTogMHglMDh4IiwgcGF0aCwgcmV0KTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IFdwc05mY1Rva2VuRGlzY292ZXJ5KCk7Ci0JaWYgKHJldCAhPSBXUFNfTkZDTElCX0VSUl9TVUNDRVNTKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTIChQTjUzMSk6IEZhaWxlZCB0byBkaXNjb3ZlciAiCi0JCQkgICAidG9rZW46IDB4JTA4eCIsIHJldCk7Ci0JCVdwc05mY0Nsb3NlRGV2aWNlKCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZmFpbDoKLQlXcHNOZmNEZWluaXQoKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLQotc3RhdGljIHZvaWQgKiByZWFkX25mY19wbjUzMShzaXplX3QgKnNpemUpCi17Ci0JdWludDMyIGxlbjsKLQl1MzIgcmV0OwotCWludDggKmRhdGE7Ci0KLQlyZXQgPSBXcHNOZmNSYXdSZWFkVG9rZW4oJmRhdGEsICZsZW4pOwotCWlmIChyZXQgIT0gV1BTX05GQ0xJQl9FUlJfU1VDQ0VTUykgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoUE41MzEpOiBGYWlsZWQgdG8gcmVhZDogMHglMDh4IiwKLQkJCSAgIHJldCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCSpzaXplID0gbGVuOwotCXJldHVybiBkYXRhOwotfQotCi0KLXN0YXRpYyBpbnQgd3JpdGVfbmZjX3BuNTMxKHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCi17Ci0JdTMyIHJldDsKLQotCXJldCA9IFdwc05mY1Jhd1dyaXRlVG9rZW4oZGF0YSwgbGVuKTsKLQlpZiAocmV0ICE9IFdQU19ORkNMSUJfRVJSX1NVQ0NFU1MpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFBONTMxKTogRmFpbGVkIHRvIHdyaXRlOiAweCUwOHgiLAotCQkJICAgcmV0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGRlaW5pdF9uZmNfcG41MzEodm9pZCkKLXsKLQl1MzIgcmV0OwotCi0JcmV0ID0gV3BzTmZjQ2xvc2VEZXZpY2UoKTsKLQlpZiAocmV0ICE9IFdQU19ORkNMSUJfRVJSX1NVQ0NFU1MpCi0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTIChQTjUzMSk6IEZhaWxlZCB0byBjbG9zZSAiCi0JCQkgICAiTkZDIERldmljZTogMHglMDh4IiwgcmV0KTsKLQotCXJldCA9IFdwc05mY0RlaW5pdCgpOwotCWlmIChyZXQgIT0gV1BTX05GQ0xJQl9FUlJfU1VDQ0VTUykKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFBONTMxKTogRmFpbGVkIHRvIGRlaW5pdGlhbGl6ZSAiCi0JCQkgICAiTkZDIExpYnJhcnk6IDB4JTA4eCIsIHJldCk7Ci19Ci0KLQotc3RydWN0IG9vYl9uZmNfZGV2aWNlX2RhdGEgb29iX25mY19wbjUzMV9kZXZpY2VfZGF0YSA9IHsKLQkuaW5pdF9mdW5jCT0gaW5pdF9uZmNfcG41MzEsCi0JLnJlYWRfZnVuYwk9IHJlYWRfbmZjX3BuNTMxLAotCS53cml0ZV9mdW5jCT0gd3JpdGVfbmZjX3BuNTMxLAotCS5kZWluaXRfZnVuYwk9IGRlaW5pdF9uZmNfcG41MzEsCi19OwpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfcmVnaXN0cmFyLmMgYi9zcmMvd3BzL3dwc19yZWdpc3RyYXIuYwppbmRleCA1MzY4NGQ2Li44NmVmMDIyIDEwMDY0NAotLS0gYS9zcmMvd3BzL3dwc19yZWdpc3RyYXIuYworKysgYi9zcmMvd3BzL3dwc19yZWdpc3RyYXIuYwpAQCAtMzIsNyArMzIsNyBAQAogCXN0cnVjdCBkbF9saXN0IGxpc3Q7CiAJdTggcHVia2V5X2hhc2hbV1BTX09PQl9QVUJLRVlfSEFTSF9MRU5dOwogCXUxNiBwd19pZDsKLQl1OCBkZXZfcHdbV1BTX09PQl9ERVZJQ0VfUEFTU1dPUkRfTEVOXTsKKwl1OCBkZXZfcHdbV1BTX09PQl9ERVZJQ0VfUEFTU1dPUkRfTEVOICogMiArIDFdOwogCXNpemVfdCBkZXZfcHdfbGVuOwogfTsKIApAQCAtMTgwLDYgKzE4MCw5IEBACiAJdTggYXV0aG9yaXplZF9tYWNzX3VuaW9uW1dQU19NQVhfQVVUSE9SSVpFRF9NQUNTXVtFVEhfQUxFTl07CiAKIAl1OCBwMnBfZGV2X2FkZHJbRVRIX0FMRU5dOworCisJdTggcGJjX2lnbm9yZV91dWlkW1dQU19VVUlEX0xFTl07CisJc3RydWN0IG9zX3RpbWUgcGJjX2lnbm9yZV9zdGFydDsKIH07CiAKIApAQCAtMTg3LDYgKzE5MCw4IEBACiBzdGF0aWMgdm9pZCB3cHNfcmVnaXN0cmFyX3BiY190aW1lb3V0KHZvaWQgKmVsb29wX2N0eCwgdm9pZCAqdGltZW91dF9jdHgpOwogc3RhdGljIHZvaWQgd3BzX3JlZ2lzdHJhcl9zZXRfc2VsZWN0ZWRfdGltZW91dCh2b2lkICplbG9vcF9jdHgsCiAJCQkJCSAgICAgICB2b2lkICp0aW1lb3V0X2N0eCk7CitzdGF0aWMgdm9pZCB3cHNfcmVnaXN0cmFyX3JlbW92ZV9waW4oc3RydWN0IHdwc19yZWdpc3RyYXIgKnJlZywKKwkJCQkgICAgIHN0cnVjdCB3cHNfdXVpZF9waW4gKnBpbik7CiAKIAogc3RhdGljIHZvaWQgd3BzX3JlZ2lzdHJhcl9hZGRfYXV0aG9yaXplZF9tYWMoc3RydWN0IHdwc19yZWdpc3RyYXIgKnJlZywKQEAgLTY5Niw2ICs3MDEsMjEgQEAKIH0KIAogCitzdGF0aWMgdm9pZCB3cHNfcmVnaXN0cmFyX2ludmFsaWRhdGVfdW51c2VkKHN0cnVjdCB3cHNfcmVnaXN0cmFyICpyZWcpCit7CisJc3RydWN0IHdwc191dWlkX3BpbiAqcGluOworCisJZGxfbGlzdF9mb3JfZWFjaChwaW4sICZyZWctPnBpbnMsIHN0cnVjdCB3cHNfdXVpZF9waW4sIGxpc3QpIHsKKwkJaWYgKHBpbi0+d2lsZGNhcmRfdXVpZCA9PSAxICYmICEocGluLT5mbGFncyAmIFBJTl9MT0NLRUQpKSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogSW52YWxpZGF0ZSBwcmV2aW91c2x5ICIKKwkJCQkgICAiY29uZmlndXJlZCB3aWxkY2FyZCBQSU4iKTsKKwkJCXdwc19yZWdpc3RyYXJfcmVtb3ZlX3BpbihyZWcsIHBpbik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCiAvKioKICAqIHdwc19yZWdpc3RyYXJfYWRkX3BpbiAtIENvbmZpZ3VyZSBhIG5ldyBQSU4gZm9yIFJlZ2lzdHJhcgogICogQHJlZzogUmVnaXN0cmFyIGRhdGEgZnJvbSB3cHNfcmVnaXN0cmFyX2luaXQoKQpAQCAtNzM1LDYgKzc1NSw5IEBACiAJCXAtPmV4cGlyYXRpb24uc2VjICs9IHRpbWVvdXQ7CiAJfQogCisJaWYgKHAtPndpbGRjYXJkX3V1aWQpCisJCXdwc19yZWdpc3RyYXJfaW52YWxpZGF0ZV91bnVzZWQocmVnKTsKKwogCWRsX2xpc3RfYWRkKCZyZWctPnBpbnMsICZwLT5saXN0KTsKIAogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BTOiBBIG5ldyBQSU4gY29uZmlndXJlZCAodGltZW91dD0lZCkiLApAQCAtMTAxNSw2ICsxMDM4LDggQEAKIAkJd3BzX3JlZ2lzdHJhcl9yZW1vdmVfcGJjX3Nlc3Npb24ocmVnaXN0cmFyLAogCQkJCQkJIHV1aWRfZSwgTlVMTCk7CiAJCXdwc19yZWdpc3RyYXJfcGJjX2NvbXBsZXRlZChyZWdpc3RyYXIpOworCQlvc19nZXRfdGltZSgmcmVnaXN0cmFyLT5wYmNfaWdub3JlX3N0YXJ0KTsKKwkJb3NfbWVtY3B5KHJlZ2lzdHJhci0+cGJjX2lnbm9yZV91dWlkLCB1dWlkX2UsIFdQU19VVUlEX0xFTik7CiAJfSBlbHNlIHsKIAkJd3BzX3JlZ2lzdHJhcl9waW5fY29tcGxldGVkKHJlZ2lzdHJhcik7CiAJfQpAQCAtMTA2MSw2ICsxMDg2LDcgQEAKIAkJCQlpbnQgcDJwX3dpbGRjYXJkKQogewogCXN0cnVjdCB3cHNfcGFyc2VfYXR0ciBhdHRyOworCWludCBza2lwX2FkZCA9IDA7CiAKIAl3cGFfaGV4ZHVtcF9idWYoTVNHX01TR0RVTVAsCiAJCQkiV1BTOiBQcm9iZSBSZXF1ZXN0IHdpdGggV1BTIGRhdGEgcmVjZWl2ZWQiLApAQCAtMTExMiw3ICsxMTM4LDI0IEBACiAJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiV1BTOiBVVUlELUUgZnJvbSBQcm9iZSBSZXF1ZXN0IiwgYXR0ci51dWlkX2UsCiAJCSAgICBXUFNfVVVJRF9MRU4pOwogCi0Jd3BzX3JlZ2lzdHJhcl9hZGRfcGJjX3Nlc3Npb24ocmVnLCBhZGRyLCBhdHRyLnV1aWRfZSk7CisjaWZkZWYgV1BTX1dPUktBUk9VTkRTCisJaWYgKHJlZy0+cGJjX2lnbm9yZV9zdGFydC5zZWMgJiYKKwkgICAgb3NfbWVtY21wKGF0dHIudXVpZF9lLCByZWctPnBiY19pZ25vcmVfdXVpZCwgV1BTX1VVSURfTEVOKSA9PSAwKSB7CisJCXN0cnVjdCBvc190aW1lIG5vdywgZHVyOworCQlvc19nZXRfdGltZSgmbm93KTsKKwkJb3NfdGltZV9zdWIoJm5vdywgJnJlZy0+cGJjX2lnbm9yZV9zdGFydCwgJmR1cik7CisJCWlmIChkdXIuc2VjID49IDAgJiYgZHVyLnNlYyA8IDUpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BTOiBJZ25vcmUgUEJDIGFjdGl2YXRpb24gIgorCQkJCSAgICJiYXNlZCBvbiBQcm9iZSBSZXF1ZXN0IGZyb20gdGhlIEVucm9sbGVlICIKKwkJCQkgICAidGhhdCBqdXN0IGNvbXBsZXRlZCBQQkMgcHJvdmlzaW9uaW5nIik7CisJCQlza2lwX2FkZCA9IDE7CisJCX0gZWxzZQorCQkJcmVnLT5wYmNfaWdub3JlX3N0YXJ0LnNlYyA9IDA7CisJfQorI2VuZGlmIC8qIFdQU19XT1JLQVJPVU5EUyAqLworCisJaWYgKCFza2lwX2FkZCkKKwkJd3BzX3JlZ2lzdHJhcl9hZGRfcGJjX3Nlc3Npb24ocmVnLCBhZGRyLCBhdHRyLnV1aWRfZSk7CiAJaWYgKHdwc19yZWdpc3RyYXJfcGJjX292ZXJsYXAocmVnLCBhZGRyLCBhdHRyLnV1aWRfZSkpIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IFBCQyBzZXNzaW9uIG92ZXJsYXAgZGV0ZWN0ZWQiKTsKIAkJcmVnLT5mb3JjZV9wYmNfb3ZlcmxhcCA9IDE7CkBAIC0xMjU1LDcgKzEyOTgsNyBAQAogCSAgICB3cHNfYnVpbGRfdXVpZF9lKHByb2JlLCByZWctPndwcy0+dXVpZCkgfHwKIAkgICAgd3BzX2J1aWxkX2RldmljZV9hdHRycygmcmVnLT53cHMtPmRldiwgcHJvYmUpIHx8CiAJICAgIHdwc19idWlsZF9wcm9iZV9jb25maWdfbWV0aG9kcyhyZWcsIHByb2JlKSB8fAotCSAgICB3cHNfYnVpbGRfcmZfYmFuZHMoJnJlZy0+d3BzLT5kZXYsIHByb2JlKSB8fAorCSAgICAocmVnLT5kdWFsYmFuZCAmJiB3cHNfYnVpbGRfcmZfYmFuZHMoJnJlZy0+d3BzLT5kZXYsIHByb2JlKSkgfHwKIAkgICAgd3BzX2J1aWxkX3dmYV9leHQocHJvYmUsIDAsIGF1dGhfbWFjcywgY291bnQpIHx8CiAJICAgIHdwc19idWlsZF92ZW5kb3JfZXh0KCZyZWctPndwcy0+ZGV2LCBwcm9iZSkpIHsKIAkJd3BhYnVmX2ZyZWUoYmVhY29uKTsKQEAgLTEzMjAsNiArMTM2MywxNCBAQAogCX0gZWxzZSB7CiAJCXBpbiA9IHdwc19yZWdpc3RyYXJfZ2V0X3Bpbih3cHMtPndwcy0+cmVnaXN0cmFyLCB3cHMtPnV1aWRfZSwKIAkJCQkJICAgICZwaW5fbGVuKTsKKwkJaWYgKHBpbiAmJiB3cHMtPmRldl9wd19pZCA+PSAweDEwKSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogTm8gbWF0Y2ggZm9yIE9PQiBEZXZpY2UgIgorCQkJCSAgICJQYXNzd29yZCBJRCwgYnV0IFBJTiBmb3VuZCIpOworCQkJLyoKKwkJCSAqIFNlZSB3aGV0aGVyIEVucm9sbGVlIGlzIHdpbGxpbmcgdG8gdXNlIFBJTiBpbnN0ZWFkLgorCQkJICovCisJCQl3cHMtPmRldl9wd19pZCA9IERFVl9QV19ERUZBVUxUOworCQl9CiAJfQogCWlmIChwaW4gPT0gTlVMTCkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogTm8gRGV2aWNlIFBhc3N3b3JkIGF2YWlsYWJsZSBmb3IgIgpAQCAtMjIxOCwyMiArMjI2OSw2IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotCWlmICh3cHMtPndwcy0+b29iX2NvbmYucHVia2V5X2hhc2ggIT0gTlVMTCkgewotCQljb25zdCB1OCAqYWRkclsxXTsKLQkJdTggaGFzaFtXUFNfSEFTSF9MRU5dOwotCi0JCWFkZHJbMF0gPSBwazsKLQkJc2hhMjU2X3ZlY3RvcigxLCBhZGRyLCAmcGtfbGVuLCBoYXNoKTsKLQkJaWYgKG9zX21lbWNtcChoYXNoLAotCQkJICAgICAgd3BhYnVmX2hlYWQod3BzLT53cHMtPm9vYl9jb25mLnB1YmtleV9oYXNoKSwKLQkJCSAgICAgIFdQU19PT0JfUFVCS0VZX0hBU0hfTEVOKSAhPSAwKSB7Ci0JCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogUHVibGljIEtleSBoYXNoIGVycm9yIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KLQogCXdwYWJ1Zl9mcmVlKHdwcy0+ZGhfcHVia2V5X2UpOwogCXdwcy0+ZGhfcHVia2V5X2UgPSB3cGFidWZfYWxsb2NfY29weShwaywgcGtfbGVuKTsKIAlpZiAod3BzLT5kaF9wdWJrZXlfZSA9PSBOVUxMKQpAQCAtMjUyOSwxNiArMjU2NCw2IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCiAKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotCWlmICh3cHMtPmRldl9wd19pZCA+PSAweDEwICYmIHdwcy0+bmZjX3B3X3Rva2VuID09IE5VTEwgJiYKLQkgICAgd3BzLT5kZXZfcHdfaWQgIT0gd3BzLT53cHMtPm9vYl9kZXZfcHdfaWQpIHsKLQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IE9PQiBEZXZpY2UgUGFzc3dvcmQgSUQgIgotCQkJICAgIiVkIG1pc21hdGNoIiwgd3BzLT5kZXZfcHdfaWQpOwotCQl3cHMtPnN0YXRlID0gU0VORF9NMkQ7Ci0JCXJldHVybiBXUFNfQ09OVElOVUU7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCi0KIAlpZiAod3BzLT5kZXZfcHdfaWQgPT0gREVWX1BXX1BVU0hCVVRUT04pIHsKIAkJaWYgKCh3cHMtPndwcy0+cmVnaXN0cmFyLT5mb3JjZV9wYmNfb3ZlcmxhcCB8fAogCQkgICAgIHdwc19yZWdpc3RyYXJfcGJjX292ZXJsYXAod3BzLT53cHMtPnJlZ2lzdHJhciwKQEAgLTMxNjgsNiArMzE5Myw5IEBACiAJCQkJCQkgd3BzLT51dWlkX2UsCiAJCQkJCQkgd3BzLT5wMnBfZGV2X2FkZHIpOwogCQl3cHNfcmVnaXN0cmFyX3BiY19jb21wbGV0ZWQod3BzLT53cHMtPnJlZ2lzdHJhcik7CisJCW9zX2dldF90aW1lKCZ3cHMtPndwcy0+cmVnaXN0cmFyLT5wYmNfaWdub3JlX3N0YXJ0KTsKKwkJb3NfbWVtY3B5KHdwcy0+d3BzLT5yZWdpc3RyYXItPnBiY19pZ25vcmVfdXVpZCwgd3BzLT51dWlkX2UsCisJCQkgIFdQU19VVUlEX0xFTik7CiAJfSBlbHNlIHsKIAkJd3BzX3JlZ2lzdHJhcl9waW5fY29tcGxldGVkKHdwcy0+d3BzLT5yZWdpc3RyYXIpOwogCX0KQEAgLTM0NzUsOCArMzUwMywxMCBAQAogCiAJb3NfbWVtY3B5KHRva2VuLT5wdWJrZXlfaGFzaCwgcHVia2V5X2hhc2gsIFdQU19PT0JfUFVCS0VZX0hBU0hfTEVOKTsKIAl0b2tlbi0+cHdfaWQgPSBwd19pZDsKLQlvc19tZW1jcHkodG9rZW4tPmRldl9wdywgZGV2X3B3LCBkZXZfcHdfbGVuKTsKLQl0b2tlbi0+ZGV2X3B3X2xlbiA9IGRldl9wd19sZW47CisJd3BhX3NucHJpbnRmX2hleF91cHBlcmNhc2UoKGNoYXIgKikgdG9rZW4tPmRldl9wdywKKwkJCQkgICBzaXplb2YodG9rZW4tPmRldl9wdyksCisJCQkJICAgZGV2X3B3LCBkZXZfcHdfbGVuKTsKKwl0b2tlbi0+ZGV2X3B3X2xlbiA9IGRldl9wd19sZW4gKiAyOwogCiAJZGxfbGlzdF9hZGQoJnJlZy0+bmZjX3B3X3Rva2VucywgJnRva2VuLT5saXN0KTsKIApkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfdWZkLmMgYi9zcmMvd3BzL3dwc191ZmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzYmRmNC4uMDAwMDAwMAotLS0gYS9zcmMvd3BzL3dwc191ZmQuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogVUZEIHJvdXRpbmVzIGZvciBXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBNYXNhc2hpIEhvbm1hIDxtYXNhc2hpLmhvbm1hQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgotICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLQotI2luY2x1ZGUgIndwcy93cHMuaCIKLSNpbmNsdWRlICJ3cHMvd3BzX2kuaCIKLQotI2lmZGVmIENPTkZJR19OQVRJVkVfV0lORE9XUwotI2RlZmluZSBVRkRfRElSMSAiJXNcXFNNUlROVEtZIgotI2RlZmluZSBVRkRfRElSMiBVRkRfRElSMSAiXFxXRkFXU0MiCi0jZGVmaW5lIFVGRF9GSUxFIFVGRF9ESVIyICJcXCVzIgotI2Vsc2UgLyogQ09ORklHX05BVElWRV9XSU5ET1dTICovCi0jZGVmaW5lIFVGRF9ESVIxICIlcy9TTVJUTlRLWSIKLSNkZWZpbmUgVUZEX0RJUjIgVUZEX0RJUjEgIi9XRkFXU0MiCi0jZGVmaW5lIFVGRF9GSUxFIFVGRF9ESVIyICIvJXMiCi0jZW5kaWYgLyogQ09ORklHX05BVElWRV9XSU5ET1dTICovCi0KLQotc3RydWN0IHdwc191ZmRfZGF0YSB7Ci0JaW50IHVmZF9mZDsKLX07Ci0KLQotc3RhdGljIGludCBkZXZfcHdkX2VfZmlsZV9maWx0ZXIoY29uc3Qgc3RydWN0IGRpcmVudCAqZW50cnkpCi17Ci0JdW5zaWduZWQgaW50IHByZWZpeDsKLQljaGFyIGV4dFs1XTsKLQotCWlmIChzc2NhbmYoZW50cnktPmRfbmFtZSwgIiU4eC4lNHMiLCAmcHJlZml4LCBleHQpICE9IDIpCi0JCXJldHVybiAwOwotCWlmIChwcmVmaXggPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKG9zX3N0cmNhc2VjbXAoZXh0LCAiV0ZBIikgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50IHdwc19nZXRfZGV2X3B3ZF9lX2ZpbGVfbmFtZShjaGFyICpwYXRoLCBjaGFyICpmaWxlX25hbWUpCi17Ci0Jc3RydWN0IGRpcmVudCAqKm5hbWVsaXN0OwotCWludCBpLCBmaWxlX251bTsKLQotCWZpbGVfbnVtID0gc2NhbmRpcihwYXRoLCAmbmFtZWxpc3QsICZkZXZfcHdkX2VfZmlsZV9maWx0ZXIsCi0JCQkgICBhbHBoYXNvcnQpOwotCWlmIChmaWxlX251bSA8IDApIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IE9PQiBmaWxlIG5vdCBmb3VuZDogJWQgKCVzKSIsCi0JCQkgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoZmlsZV9udW0gPT0gMCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogT09CIGZpbGUgbm90IGZvdW5kIik7Ci0JCW9zX2ZyZWUobmFtZWxpc3QpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW9zX3N0cmxjcHkoZmlsZV9uYW1lLCBuYW1lbGlzdFswXS0+ZF9uYW1lLCAxMyk7Ci0JZm9yIChpID0gMDsgaSA8IGZpbGVfbnVtOyBpKyspCi0JCW9zX2ZyZWUobmFtZWxpc3RbaV0pOwotCW9zX2ZyZWUobmFtZWxpc3QpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgZ2V0X2ZpbGVfbmFtZShzdHJ1Y3Qgd3BzX2NvbnRleHQgKndwcywgaW50IHJlZ2lzdHJhciwKLQkJCSBjb25zdCBjaGFyICpwYXRoLCBjaGFyICpmaWxlX25hbWUpCi17Ci0Jc3dpdGNoICh3cHMtPm9vYl9jb25mLm9vYl9tZXRob2QpIHsKLQljYXNlIE9PQl9NRVRIT0RfQ1JFRDoKLQkJb3Nfc25wcmludGYoZmlsZV9uYW1lLCAxMywgIjAwMDAwMDAwLldTQyIpOwotCQlicmVhazsKLQljYXNlIE9PQl9NRVRIT0RfREVWX1BXRF9FOgotCQlpZiAocmVnaXN0cmFyKSB7Ci0JCQljaGFyIHRlbXBbMTI4XTsKLQkJCW9zX3NucHJpbnRmKHRlbXAsIHNpemVvZih0ZW1wKSwgVUZEX0RJUjIsIHBhdGgpOwotCQkJaWYgKHdwc19nZXRfZGV2X3B3ZF9lX2ZpbGVfbmFtZSh0ZW1wLCBmaWxlX25hbWUpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0gZWxzZSB7Ci0JCQl1OCAqbWFjX2FkZHIgPSB3cHMtPmRldi5tYWNfYWRkcjsKLQotCQkJb3Nfc25wcmludGYoZmlsZV9uYW1lLCAxMywgIiUwMlglMDJYJTAyWCUwMlguV0ZBIiwKLQkJCQkgICAgbWFjX2FkZHJbMl0sIG1hY19hZGRyWzNdLCBtYWNfYWRkcls0XSwKLQkJCQkgICAgbWFjX2FkZHJbNV0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgT09CX01FVEhPRF9ERVZfUFdEX1I6Ci0JCW9zX3NucHJpbnRmKGZpbGVfbmFtZSwgMTMsICIwMDAwMDAwMC5XRkEiKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IEludmFsaWQgVVNCQSBPT0IgbWV0aG9kIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCB1ZmRfbWtkaXIoY29uc3QgY2hhciAqcGF0aCkKLXsKLQlpZiAobWtkaXIocGF0aCwgU19JUldYVSkgPCAwICYmIGVycm5vICE9IEVFWElTVCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoVUZEKTogRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgIgotCQkJICAgIiclcyc6ICVkICglcykiLCBwYXRoLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCAqIGluaXRfdWZkKHN0cnVjdCB3cHNfY29udGV4dCAqd3BzLAotCQkgICAgICAgc3RydWN0IG9vYl9kZXZpY2VfZGF0YSAqb29iX2RldiwgaW50IHJlZ2lzdHJhcikKLXsKLQlpbnQgd3JpdGVfZjsKLQljaGFyIHRlbXBbMTI4XTsKLQljaGFyICpwYXRoID0gb29iX2Rldi0+ZGV2aWNlX3BhdGg7Ci0JY2hhciBmaWxlbmFtZVsxM107Ci0Jc3RydWN0IHdwc191ZmRfZGF0YSAqZGF0YTsKLQlpbnQgdWZkX2ZkOwotCi0JaWYgKHBhdGggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQl3cml0ZV9mID0gd3BzLT5vb2JfY29uZi5vb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfREVWX1BXRF9FID8KLQkJIXJlZ2lzdHJhciA6IHJlZ2lzdHJhcjsKLQotCWlmIChnZXRfZmlsZV9uYW1lKHdwcywgcmVnaXN0cmFyLCBwYXRoLCBmaWxlbmFtZSkgPCAwKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTIChVRkQpOiBGYWlsZWQgdG8gZ2V0IGZpbGUgbmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAod3JpdGVfZikgewotCQlvc19zbnByaW50Zih0ZW1wLCBzaXplb2YodGVtcCksIFVGRF9ESVIxLCBwYXRoKTsKLQkJaWYgKHVmZF9ta2Rpcih0ZW1wKSkKLQkJCXJldHVybiBOVUxMOwotCQlvc19zbnByaW50Zih0ZW1wLCBzaXplb2YodGVtcCksIFVGRF9ESVIyLCBwYXRoKTsKLQkJaWYgKHVmZF9ta2Rpcih0ZW1wKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCW9zX3NucHJpbnRmKHRlbXAsIHNpemVvZih0ZW1wKSwgVUZEX0ZJTEUsIHBhdGgsIGZpbGVuYW1lKTsKLQlpZiAod3JpdGVfZikKLQkJdWZkX2ZkID0gb3Blbih0ZW1wLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAotCQkJICAgICAgU19JUlVTUiB8IFNfSVdVU1IpOwotCWVsc2UKLQkJdWZkX2ZkID0gb3Blbih0ZW1wLCBPX1JET05MWSk7Ci0JaWYgKHVmZF9mZCA8IDApIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFVGRCk6IEZhaWxlZCB0byBvcGVuICVzOiAlcyIsCi0JCQkgICB0ZW1wLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlkYXRhID0gb3NfemFsbG9jKHNpemVvZigqZGF0YSkpOwotCWlmIChkYXRhID09IE5VTEwpIHsKLQkJY2xvc2UodWZkX2ZkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRhdGEtPnVmZF9mZCA9IHVmZF9mZDsKLQlyZXR1cm4gZGF0YTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHdwYWJ1ZiAqIHJlYWRfdWZkKHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IHdwc191ZmRfZGF0YSAqZGF0YSA9IHByaXY7Ci0Jc3RydWN0IHdwYWJ1ZiAqYnVmOwotCXN0cnVjdCBzdGF0IHM7Ci0Jc2l6ZV90IGZpbGVfc2l6ZTsKLQotCWlmIChmc3RhdChkYXRhLT51ZmRfZmQsICZzKSA8IDApIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFVGRCk6IEZhaWxlZCB0byBnZXQgZmlsZSBzaXplIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWZpbGVfc2l6ZSA9IHMuc3Rfc2l6ZTsKLQlidWYgPSB3cGFidWZfYWxsb2MoZmlsZV9zaXplKTsKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFVGRCk6IEZhaWxlZCB0byBhbGxvYyByZWFkICIKLQkJCSAgICJidWZmZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKHJlYWQoZGF0YS0+dWZkX2ZkLCB3cGFidWZfbWhlYWQoYnVmKSwgZmlsZV9zaXplKSAhPQotCSAgICAoaW50KSBmaWxlX3NpemUpIHsKLQkJd3BhYnVmX2ZyZWUoYnVmKTsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFVGRCk6IEZhaWxlZCB0byByZWFkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl3cGFidWZfcHV0KGJ1ZiwgZmlsZV9zaXplKTsKLQlyZXR1cm4gYnVmOwotfQotCi0KLXN0YXRpYyBpbnQgd3JpdGVfdWZkKHZvaWQgKnByaXYsIHN0cnVjdCB3cGFidWYgKmJ1ZikKLXsKLQlzdHJ1Y3Qgd3BzX3VmZF9kYXRhICpkYXRhID0gcHJpdjsKLQotCWlmICh3cml0ZShkYXRhLT51ZmRfZmQsIHdwYWJ1Zl9taGVhZChidWYpLCB3cGFidWZfbGVuKGJ1ZikpICE9Ci0JICAgIChpbnQpIHdwYWJ1Zl9sZW4oYnVmKSkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoVUZEKTogRmFpbGVkIHRvIHdyaXRlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgZGVpbml0X3VmZCh2b2lkICpwcml2KQotewotCXN0cnVjdCB3cHNfdWZkX2RhdGEgKmRhdGEgPSBwcml2OwotCWNsb3NlKGRhdGEtPnVmZF9mZCk7Ci0Jb3NfZnJlZShkYXRhKTsKLX0KLQotCi1zdHJ1Y3Qgb29iX2RldmljZV9kYXRhIG9vYl91ZmRfZGV2aWNlX2RhdGEgPSB7Ci0JLmRldmljZV9uYW1lCT0gTlVMTCwKLQkuZGV2aWNlX3BhdGgJPSBOVUxMLAotCS5pbml0X2Z1bmMJPSBpbml0X3VmZCwKLQkucmVhZF9mdW5jCT0gcmVhZF91ZmQsCi0JLndyaXRlX2Z1bmMJPSB3cml0ZV91ZmQsCi0JLmRlaW5pdF9mdW5jCT0gZGVpbml0X3VmZCwKLX07CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9BbmRyb2lkLm1rIGIvd3BhX3N1cHBsaWNhbnQvQW5kcm9pZC5tawppbmRleCAzM2U0NTc5Li40MzMyZDgyIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9BbmRyb2lkLm1rCisrKyBiL3dwYV9zdXBwbGljYW50L0FuZHJvaWQubWsKQEAgLTMxLDEwICszMSwxMCBAQAogCiBpZmVxICgkKEJPQVJEX1dMQU5fREVWSUNFKSwgYmNtZGhkKQogTF9DRkxBR1MgKz0gLURBTkRST0lEX1AyUAorTF9DRkxBR1MgKz0gLURQMlBfQ09OQ1VSUkVOVF9TRUFSQ0hfREVMQVk9MAogZW5kaWYKIAogaWZlcSAoJChCT0FSRF9XTEFOX0RFVklDRSksIHFjd2NuKQotTF9DRkxBR1MgKz0gLURBTkRST0lEX1FDT01fV0NOCiBMX0NGTEFHUyArPSAtREFORFJPSURfUDJQCiBlbmRpZgogCkBAIC0xOTMsOCArMTkzLDE1IEBACiBORUVEX0FFU19PTUFDMT15CiBlbmRpZgogCi1pZmRlZiBDT05GSUdfSUVFRTgwMjExVgotTF9DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExVgoraWZkZWYgQ09ORklHX1NBRQorTF9DRkxBR1MgKz0gLURDT05GSUdfU0FFCitPQkpTICs9IHNyYy9jb21tb24vc2FlLmMKK05FRURfRUNDPXkKK05FRURfREhfR1JPVVBTPXkKK2VuZGlmCisKK2lmZGVmIENPTkZJR19XTk0KK0xfQ0ZMQUdTICs9IC1EQ09ORklHX1dOTQogT0JKUyArPSB3bm1fc3RhLmMKIGVuZGlmCiAKQEAgLTMzMyw2ICszNDAsMTcgQEAKIENPTkZJR19JRUVFODAyMVhfRUFQT0w9eQogZW5kaWYKIAoraWZkZWYgQ09ORklHX0VBUF9VTkFVVEhfVExTCisjIEVBUC1VTkFVVEgtVExTCitMX0NGTEFHUyArPSAtREVBUF9VTkFVVEhfVExTCitpZm5kZWYgQ09ORklHX0VBUF9VTkFVVEhfVExTCitPQkpTICs9IHNyYy9lYXBfcGVlci9lYXBfdGxzLmMKK09CSlNfaCArPSBzcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3Rscy5jCitUTFNfRlVOQ1M9eQorZW5kaWYKK0NPTkZJR19JRUVFODAyMVhfRUFQT0w9eQorZW5kaWYKKwogaWZkZWYgQ09ORklHX0VBUF9QRUFQCiAjIEVBUC1QRUFQCiBpZmVxICgkKENPTkZJR19FQVBfUEVBUCksIGR5bikKQEAgLTQ4Niw2ICs1MDQsMTMgQEAKIE5FRURfQUVTX0NCQz15CiBlbmRpZgogCitpZmRlZiBDT05GSUdfRUFQX1BST1hZCitMX0NGTEFHUyArPSAtRENPTkZJR19FQVBfUFJPWFkKK09CSlMgKz0gc3JjL2VhcF9wZWVyL2VhcF9wcm94eV8kKENPTkZJR19FQVBfUFJPWFkpLmMKK2luY2x1ZGUgZWFwX3Byb3h5XyQoQ09ORklHX0VBUF9QUk9YWSkubWsKK0NPTkZJR19JRUVFODAyMVhfRUFQT0w9eQorZW5kaWYKKwogaWZkZWYgQ09ORklHX0VBUF9BS0FfUFJJTUUKICMgRUFQLUFLQScKIGlmZXEgKCQoQ09ORklHX0VBUF9BS0FfUFJJTUUpLCBkeW4pCkBAIC01NjcsNyArNTkyLDcgQEAKIGlmZGVmIENPTkZJR19FQVBfUFdECiBMX0NGTEFHUyArPSAtREVBUF9QV0QKIE9CSlMgKz0gc3JjL2VhcF9wZWVyL2VhcF9wd2QuYyBzcmMvZWFwX2NvbW1vbi9lYXBfcHdkX2NvbW1vbi5jCi1PQkpTX2ggKz0gc3JjL2VhcF9zZXJ2ZXIvZWFwX3B3ZC5jCitPQkpTX2ggKz0gc3JjL2VhcF9zZXJ2ZXIvZWFwX3NlcnZlcl9wd2QuYwogQ09ORklHX0lFRUU4MDIxWF9FQVBPTD15CiBORUVEX1NIQTI1Nj15CiBlbmRpZgpAQCAtNTk5LDI1ICs2MjQsMTAgQEAKIE5FRURfQUVTX0NCQz15CiBORUVEX01PREVYUD15CiAKLWlmZGVmIENPTkZJR19XUFNfVUZECi1MX0NGTEFHUyArPSAtRENPTkZJR19XUFNfVUZECi1PQkpTICs9IHNyYy93cHMvd3BzX3VmZC5jCi1ORUVEX1dQU19PT0I9eQotZW5kaWYKLQogaWZkZWYgQ09ORklHX1dQU19ORkMKIExfQ0ZMQUdTICs9IC1EQ09ORklHX1dQU19ORkMKIE9CSlMgKz0gc3JjL3dwcy9uZGVmLmMKLU9CSlMgKz0gc3JjL3dwcy93cHNfbmZjLmMKIE5FRURfV1BTX09PQj15Ci1pZmRlZiBDT05GSUdfV1BTX05GQ19QTjUzMQotUE41MzFfUEFUSCA/PSAvdXNyL2xvY2FsL3NyYy9uZmMKLUxfQ0ZMQUdTICs9IC1EQ09ORklHX1dQU19ORkNfUE41MzEKLUxfQ0ZMQUdTICs9IC1JJHtQTjUzMV9QQVRIfS9pbmMKLU9CSlMgKz0gc3JjL3dwcy93cHNfbmZjX3BuNTMxLmMKLUxJQlMgKz0gJHtQTjUzMV9QQVRIfS9saWIvd3BzbmZjLmRsbAotTElCUyArPSAke1BONTMxX1BBVEh9L2xpYi9saWJuZmNfbWFwcGluZ19wbjUzeC5kbGwKLWVuZGlmCiBlbmRpZgogCiBpZmRlZiBORUVEX1dQU19PT0IKQEAgLTc0Myw5ICs3NTMsMTMgQEAKIE9CSlMgKz0gc3JjL2FwL2Rydl9jYWxsYmFja3MuYwogT0JKUyArPSBzcmMvYXAvYXBfZHJ2X29wcy5jCiBPQkpTICs9IHNyYy9hcC9iZWFjb24uYworT0JKUyArPSBzcmMvYXAvZWFwX3VzZXJfZGIuYwogaWZkZWYgQ09ORklHX0lFRUU4MDIxMU4KIE9CSlMgKz0gc3JjL2FwL2llZWU4MDJfMTFfaHQuYwogZW5kaWYKK2lmZGVmIENPTkZJR19XTk0KK09CSlMgKz0gc3JjL2FwL3dubV9hcC5jCitlbmRpZgogaWZkZWYgQ09ORklHX0NUUkxfSUZBQ0UKIE9CSlMgKz0gc3JjL2FwL2N0cmxfaWZhY2VfYXAuYwogZW5kaWYKQEAgLTc1OSwxMCArNzczLDYgQEAKIExfQ0ZMQUdTICs9IC1EQ09ORklHX0lFRUU4MDIxMU4KIGVuZGlmCiAKLWlmZGVmIENPTkZJR19XTk0KLUxfQ0ZMQUdTICs9IC1EQ09ORklHX1dOTQotZW5kaWYKLQogaWZkZWYgTkVFRF9BUF9NTE1FCiBPQkpTICs9IHNyYy9hcC93bW0uYwogT0JKUyArPSBzcmMvYXAvYXBfbGlzdC5jCkBAIC04ODEsNiArODkxLDggQEAKIE9CSlNfaCArPSBzcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3Rsc19jb21tb24uYwogaWZuZGVmIENPTkZJR19GSVBTCiBORUVEX1RMU19QUkY9eQorTkVFRF9TSEExPXkKK05FRURfTUQ1PXkKIGVuZGlmCiBlbmRpZgogCkBAIC05MTAsNiArOTIyLDEwIEBACiBlbmRpZgogTElCUyArPSAtbGNyeXB0bwogTElCU19wICs9IC1sY3J5cHRvCitpZmRlZiBDT05GSUdfVExTX0FERF9ETAorTElCUyArPSAtbGRsCitMSUJTX3AgKz0gLWxkbAorZW5kaWYKIGVuZGlmCiAKIGlmZXEgKCQoQ09ORklHX1RMUyksIGdudXRscykKQEAgLTExMzksMTAgKzExNTUsNyBAQAogZW5kaWYKIGVuZGlmCiAKLU1ENU9CSlMgPQotaWZuZGVmIENPTkZJR19GSVBTCi1NRDVPQkpTICs9IHNyYy9jcnlwdG8vbWQ1LmMKLWVuZGlmCitNRDVPQkpTID0gc3JjL2NyeXB0by9tZDUuYwogaWZkZWYgTkVFRF9NRDUKIGlmZGVmIENPTkZJR19JTlRFUk5BTF9NRDUKIE1ENU9CSlMgKz0gc3JjL2NyeXB0by9tZDUtaW50ZXJuYWwuYwpAQCAtMTE5OCw2ICsxMjExLDEwIEBACiBlbmRpZgogZW5kaWYKIAoraWZkZWYgTkVFRF9FQ0MKK0xfQ0ZMQUdTICs9IC1EQ09ORklHX0VDQworZW5kaWYKKwogaWZkZWYgQ09ORklHX05PX1JBTkRPTV9QT09MCiBMX0NGTEFHUyArPSAtRENPTkZJR19OT19SQU5ET01fUE9PTAogZWxzZQpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvQ2hhbmdlTG9nIGIvd3BhX3N1cHBsaWNhbnQvQ2hhbmdlTG9nCmluZGV4IDY1MGI4YTAuLjNmMTBlMTEgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L0NoYW5nZUxvZworKysgYi93cGFfc3VwcGxpY2FudC9DaGFuZ2VMb2cKQEAgLTEsNSArMSwyMzkgQEAKIENoYW5nZUxvZyBmb3Igd3BhX3N1cHBsaWNhbnQKIAorPz8/Py0/Py0/PyAtIHYyLjEKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIHNpbXVsYXRhbmVvdXMgYXV0aGVudGljYXRpb24gb2YgZXF1YWxzIChTQUUpIGZvcgorCSAgc3Ryb25nZXIgcGFzc3dvcmQtYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aCBXUEEyLVBlcnNvbmFsCisKKzIwMTMtMDEtMTIgLSB2Mi4wCisJKiByZW1vdmVkIFF0My1iYXNlZCB3cGFfZ3VpIChvYnNvbGV0ZWQgYnkgd3BhX3F1aS1xdDQpCisJKiByZW1vdmVkIHVubWFpbnRhaW5lZCBkcml2ZXIgd3JhcHBlcnMgYnJvYWRjb20sIGlwaG9uZSwgb3N4LCByYWxpbmssCisJICBob3N0YXAsIG1hZHdpZmkgKGhvc3RhcCBhbmQgbWFkd2lmaSByZW1haW4gYXZhaWxhYmxlIGZvciBob3N0YXBkOworCSAgdGhlaXIgd3BhX3N1cHBsaWNhbnQgZnVuY3Rpb25hbGl0eSBpcyBvYnNvbGV0ZWQgYnkgd2V4dCkKKwkqIGltcHJvdmVkIGRlYnVnIGxvZ2dpbmcgKGh1bWFuIHJlYWRhYmxlIGV2ZW50IG5hbWVzLCBpbnRlcmZhY2UgbmFtZQorCSAgaW5jbHVkZWQgaW4gbW9yZSBlbnRyaWVzKQorCSogY2hhbmdlZCBBUCBtb2RlIGJlaGF2aW9yIHRvIGVuYWJsZSBXUFMgb25seSBmb3Igb3BlbiBhbmQKKwkgIFdQQS9XUEEyLVBlcnNvbmFsIGNvbmZpZ3VyYXRpb24KKwkqIGltcHJvdmVkIFAyUCBjb25jdXJyZW5jeSBvcGVyYXRpb25zCisJICAtIGJldHRlciBjb29yZGluYXRpb24gb2YgY29uY3VycmVudCBzY2FuIGFuZCBQMlAgc2VhcmNoIG9wZXJhdGlvbnMKKwkgIC0gYXZvaWQgY29uY3VycmVudCByZW1haW4tb24tY2hhbm5lbCBvcGVyYXRpb24gcmVxdWVzdHMgYnkgY2FuY2VsaW5nCisJICAgIHByZXZpb3VzIG9wZXJhdGlvbnMgcHJpb3IgdG8gc3RhcnRpbmcgYSBuZXcgb25lCisJICAtIHJlamVjdCBvcGVyYXRpb25zIHRoYXQgd291bGQgcmVxdWlyZSBtdWx0aS1jaGFubmVsIGNvbmN1cnJlbmN5IGlmCisJICAgIHRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBpdAorCSAgLSBhZGQgcGFyYW1ldGVyIHRvIHNlbGVjdCB3aGV0aGVyIFNUQSBvciBQMlAgY29ubmVjdGlvbiBpcyBwcmVmZXJyZWQKKwkgICAgaWYgdGhlIGRyaXZlciBjYW5ub3Qgc3VwcG9ydCBib3RoIGF0IHRoZSBzYW1lIHRpbWUKKwkgIC0gYWxsb3cgZHJpdmVyIHRvIGluZGljYXRlIGNoYW5uZWwgY2hhbmdlcworCSAgLSBhZGRlZCBvcHRpb25hbCBkZWxheT08c2VhcmNoIGRlbGF5IGluIG1pbGxpc2Vjb25kcz4gcGFyYW1ldGVyIGZvcgorCSAgICBwMnBfZmluZCB0byBhdm9pZCB0YWtpbmcgYWxsIHJhZGlvIHJlc291cmNlcworCSAgLSB1c2UgNTAwIG1zIHAycF9maW5kIHNlYXJjaCBkZWxheSBieSBkZWZhdWx0IGR1cmluZyBjb25jdXJyZW50CisJICAgIG9wZXJhdGlvbnMKKwkgIC0gYWxsb3cgYWxsIGNoYW5uZWxzIGluIEdPIE5lZ290aWF0aW9uIGlmIHRoZSBkcml2ZXIgc3VwcG9ydHMKKwkgICAgbXVsdGktY2hhbm5lbCBjb25jdXJyZW5jeQorCSogYWRkZWQgbnVtYmVyIG9mIHNtYWxsIGNoYW5nZXMgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHN0YXRpYyBhbmFseXplcnMKKwkgIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uCisJKiBmaXhlZCBudW1iZXIgb2Ygc21hbGwgYnVncyAoc2VlIGdpdCBsb2dzIGZvciBtb3JlIGRldGFpbHMpCisJKiBubDgwMjExOiBudW1iZXIgb2YgdXBkYXRlcyB0byB1c2UgbmV3IGNmZzgwMjExL25sODAyMTEgZnVuY3Rpb25hbGl0eQorCSAgLSByZXBsYWNlIG1vbml0b3IgaW50ZXJmYWNlIHdpdGggbmw4MDIxMSBjb21tYW5kcyBmb3IgQVAgbW9kZQorCSAgLSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBkcml2ZXItYmFzZWQgQVAgU01FCisJICAtIFNUQSBlbnRyeSBhdXRob3JpemF0aW9uIGluIFJTTiBJQlNTCisJKiBFQVAtcHdkOgorCSAgLSBmaXhlZCBLREYgZm9yIGdyb3VwIDIxIGFuZCB6ZXJvLXBhZGRpbmcKKwkgIC0gYWRkZWQgc3VwcG9ydCBmb3IgZnJhZ21lbnRhdGlvbgorCSAgLSBpbmNyZWFzZWQgbWF4aW11bSBudW1iZXIgb2YgaHVudGluZy1hbmQtcGVja2luZyBpdGVyYXRpb25zCisJKiBhdm9pZCBleGNlc3NpdmUgUHJvYmUgUmVzcG9uc2UgcmV0cmllcyBmb3IgYnJvYWRjYXN0IFByb2JlIFJlcXVlc3QKKwkgIGZyYW1lcyAob25seSB3aXRoIGRyaXZlcnMgdXNpbmcgd3BhX3N1cHBsaWNhbnQgQVAgbW9kZSBTTUUvTUxNRSkKKwkqIGFkZGVkICJHRVQgY291bnRyeSIgY3RybF9pZmFjZSBjb21tYW5kCisJKiBkbyBub3Qgc2F2ZSBhbiBpbnZhbGlkIG5ldHdvcmsgYmxvY2sgaW4gd3BhX3N1cHBsaWNhbnQuY29uZiB0byBhdm9pZAorCSAgcHJvYmxlbXMgcmVhZGluZyB0aGUgZmlsZSBvbiBuZXh0IHN0YXJ0CisJKiBzZW5kIFNUQSBjb25uZWN0ZWQvZGlzY29ubmVjdGVkIGN0cmxfaWZhY2UgZXZlbnRzIHRvIGJvdGggdGhlIFAyUAorCSAgZ3JvdXAgYW5kIHBhcmVudCBpbnRlcmZhY2VzCisJKiBhZGRlZCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB1c2luZyBUTFMgdjEuMiAoQ09ORklHX1RMU1YxMj15KQorCSogYWRkZWQgIlNFVCBwbm8gPDEvMD4iIGN0cmxfaWZhY2UgY29tbWFuZCB0byBzdGFydC9zdG9wIHByZWZlcnJlZAorCSAgbmV0d29yayBvZmZsb2FkIHdpdGggc2NoZWRfc2NhbiBkcml2ZXIgY29tbWFuZAorCSogbWVyZ2VkIGluIG51bWJlciBvZiBjaGFuZ2VzIGZyb20gQW5kcm9pZCByZXBvc2l0b3J5IGZvciBQMlAsIG5sODAyMTEsCisJICBhbmQgYnVpbGQgcGFyYW1ldGVycworCSogY2hhbmdlZCBQMlAgR08gbW9kZSBjb25maWd1cmF0aW9uIHRvIHVzZSBkcml2ZXIgY2FwYWJpbGl0aWVzIHRvCisJICBhdXRvbWF0aWNhbGx5IGVuYWJsZSBIVCBvcGVyYXRpb25zIHdoZW4gc3VwcG9ydGVkCisJKiBhZGRlZCAid3BhX2NsaSBzdGF0dXMgd3BzIiBjb21tYW5kIHRvIGZldGNoIFdQQTItUGVyc29uYWwgcGFzc2hyYXNlCisJICBmb3IgV1BTIHVzZSBjYXNlcyBpbiBBUCBtb2RlCisJKiBFQVAtQUtBOiBrZWVwIHBzZXVkb255bSBpZGVudGl0eSBhY3Jvc3MgRUFQIGV4Y2hhbmdlcyB0byBtYXRjaCBFQVAtU0lNCisJICBiZWhhdmlvcgorCSogaW1wcm92ZWQgcmVhc3NvY2lhdGlvbiBiZWhhdmlvciBpbiBjYXNlcyB3aGVyZSBhc3NvY2lhdGlvbiBpcyByZWplY3RlZAorCSAgb3Igd2hlbiBhbiBBUCBkaXNjb25uZWN0cyB1cyB0byBoYW5kbGUgY29tbW9uIGxvYWQgYmFsYW5jaW5nCisJICBtZWNoYW5pc21zCisJICAtIHRyeSB0byBhdm9pZCBleHRyYSBzY2FucyB3aGVuIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCisJKiBhZGRlZCBvcHRpb25hbCAiam9pbiIgYXJndW1lbnQgZm9yIHAycF9wcm92X2Rpc2MgY3RybF9pZmFjZSBjb21tYW5kCisJKiBhZGRlZCBncm91cCBpZm5hbWUgdG8gUDJQLVBST1YtRElTQy0qIGV2ZW50cworCSogYWRkZWQgUDJQIERldmljZSBBZGRyZXNzIHRvIEFQLVNUQS1ESVNDT05ORUNURUQgZXZlbnQgYW5kIHVzZQorCSAgcDJwX2Rldl9hZGRyIHBhcmFtZXRlciBuYW1lIHdpdGggQVAtU1RBLUNPTk5FQ1RFRAorCSogYWRkZWQgd29ya2Fyb3VuZHMgZm9yIFdQUyBQQkMgb3ZlcmxhcCBkZXRlY3Rpb24gZm9yIHNvbWUgUDJQIHVzZSBjYXNlcworCSAgd2hlcmUgZGVwbG95ZWQgc3RhdGlvbnMgd29yayBpbmNvcnJlY3RseQorCSogb3B0aW1pemUgV1BTIGNvbm5lY3Rpb24gc3BlZWQgYnkgZGlzY29ubmVjdGluZyBwcmlvciB0byBXUFMgc2NhbiBhbmQKKwkgIGJ5IHVzaW5nIHNpbmdsZSBjaGFubmVsIHNjYW5zIHdoZW4gQVAgY2hhbm5lbCBpcyBrbm93bgorCSogUENTQyBhbmQgU0lNL1VTSU0gaW1wcm92ZW1lbnRzOgorCSAgLSBhY2NlcHQgMHg2NyAoV3JvbmcgbGVuZ3RoKSBhcyBhIHJlc3BvbnNlIHRvIFJFQUQgUkVDT1JEIHRvIGZpeAorCSAgICBpc3N1ZXMgd2l0aCBzb21lIFVTSU0gY2FyZHMKKwkgIC0gdHJ5IHRvIHJlYWQgTU5DIGxlbmd0aCBmcm9tIFNJTS9VU0lNCisJICAtIGJ1aWxkIHJlYWxtIGFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAwMyB3aXRoIGlkZW50aXR5IGZyb20gdGhlIFNJTQorCSAgLSBhbGxvdyBUMSBwcm90b2NvbCB0byBiZSBlbmFibGVkCisJKiBhZGRlZCBtb3JlIFdQUyBhbmQgUDJQIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0aHJvdWdoIEQtQnVzCisJKiBpbXByb3ZlIFAyUCBuZWdvdGlhdGlvbiByb2J1c3RuZXNzCisJICAtIGV4dHJhIHdhaXRzIHRvIGdldCBBQ0sgZnJhbWVzIHRocm91Z2gKKwkgIC0gbG9uZ2VyIHRpbWVvdXRzIGZvciBjYXNlcyB3aGVyZSBkZXBsb3llZCBkZXZpY2VzIGhhdmUgYmVlbgorCSAgICBpZGVudGlmaWVkIGhhdmUgaXNzdWVzIG1lZXRpbmcgdGhlIHNwZWNpZmljYXRpb24gcmVxdWlyZW1lbnRzCisJICAtIG1vcmUgcmV0cmllcyBmb3Igc29tZSBQMlAgZnJhbWVzCisJICAtIGhhbmRsZSByYWNlIGNvbmRpdGlvbnMgaW4gR08gTmVnb3RpYXRpb24gc3RhcnQgYnkgYm90aCBkZXZpY2VzCisJICAtIGlnbm9yZSB1bmV4cGVjdGVkIEdPIE5lZ290aWF0aW9uIFJlc3BvbnNlIGZyYW1lCisJKiBhZGRlZCBzdXBwb3J0IGZvciBsaWJubCAzLjIgYW5kIG5ld2VyCisJKiBhZGRlZCBQMlAgcGVyc2lzdGVudCBncm91cCBpbmZvIHRvIFAyUF9QRUVSIGRhdGEKKwkqIG1haW50YWluIGEgbGlzdCBvZiBQMlAgQ2xpZW50cyBmb3IgcGVyc2lzdGVudCBncm91cCBvbiBHTworCSogQVA6IGluY3JlYXNlZCBpbml0aWFsIGdyb3VwIGtleSBoYW5kc2hha2UgcmV0cmFuc21pdCB0aW1lb3V0IHRvIDUwMCBtcworCSogYWRkZWQgb3B0aW9uYWwgZGV2X2lkIHBhcmFtZXRlciBmb3IgcDJwX2ZpbmQKKwkqIGFkZGVkIFAyUC1GSU5ELVNUT1BQRUQgY3RybF9pZmFjZSBldmVudAorCSogZml4ZWQgaXNzdWVzIGluIFdQQS9SU04gZWxlbWVudCB2YWxpZGF0aW9uIHdoZW4gcm9hbWluZyB3aXRoIGFwX3NjYW49MQorCSAgYW5kIGRyaXZlci1iYXNlZCBCU1Mgc2VsZWN0aW9uCisJKiBkbyBub3QgZXhwaXJlIFAyUCBwZWVyIGVudHJpZXMgd2hpbGUgY29ubmVjdGVkIHdpdGggdGhlIHBlZXIgaW4gYQorCSAgZ3JvdXAKKwkqIGZpeGVkIFdTQyBlbGVtZW50IGluY2x1c2lvbiBpbiBjYXNlcyB3aGVyZSBQMlAgaXMgZGlzYWJsZWQKKwkqIEFQOiBhZGRlZCBhIFdQUyB3b3JrYXJvdW5kIGZvciBtaXhlZCBtb2RlIEFQIFNldHRpbmdzIHdpdGggV2luZG93cyA3CisJKiBFQVAtU0lNOiBmaXhlZCBBVF9DT1VOVEVSX1RPT19TTUFMTCB1c2UKKwkqIEVBUC1TSU0vQUtBOiBhcHBlbmQgcmVhbG0gdG8gcHNldWRvbnltIGlkZW50aXR5CisJKiBFQVAtU0lNL0FLQTogc3RvcmUgcHNldWRvbnltIGlkZW50aXR5IGluIG5ldHdvcmsgY29uZmlndXJhdGlvbiB0bworCSAgYWxsb3cgaXQgdG8gcGVyc2lzdCBvdmVyIG11bHRpcGxlIEVBUCBzZXNzaW9ucyBhbmQgd3BhX3N1cHBsaWNhbnQKKwkgIHJlc3RhcnRzCisJKiBFQVAtQUtBJzogdXBkYXRlZCB0byBSRkMgNTQ0OCAodXNlcm5hbWUgcHJlZml4ZXMgY2hhbmdlZCk7IG5vdGU6IHRoaXMKKwkgIGJyZWFrcyBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIFdGQSBIb3RzcG90IDIuMAorCSAgLSBHQVMvQU5RUCB0byBmZXRjaCBuZXR3b3JrIGluZm9ybWF0aW9uCisJICAtIGNyZWRlbnRpYWwgY29uZmlndXJhdGlvbiBhbmQgYXV0b21hdGljIG5ldHdvcmsgc2VsZWN0aW9ucyBiYXNlZCBvbgorCSAgICBjcmVkZW50aWFsIG1hdGNoIHdpdGggQU5RUCBpbmZvcm1hdGlvbgorCSogbGltaXRlZCBQTUtTQSBjYWNoZSBlbnRyaWVzIHRvIGJlIHVzZWQgb25seSB3aXRoIHRoZSBuZXR3b3JrIGNvbnRleHQKKwkgIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZW0KKwkqIGltcHJvdmVkIFBNS1NBIGNhY2hlIGV4cGlyYXRpb24gdG8gYXZvaWQgdW5uZWNlc3NhcnkgZGlzY29ubmVjdGlvbnMKKwkqIGFkanVzdGVkIGJnc2Nhbl9zaW1wbGUgZmFzdC1zY2FuIGJhY2tvZmYgdG8gYXZvaWQgdG9vIGZyZXF1ZW50CisJICBiYWNrZ3JvdW5kIHNjYW5zCisJKiByZW1vdmVkIGN0cmxfaWZhY2UgZXZlbnQgb24gUDJQIFBEIFJlc3BvbnNlIGluIGpvaW4tZ3JvdXAgY2FzZQorCSogYWRkZWQgb3B0aW9uIHRvIGZldGNoIEJTUyB0YWJsZSBlbnRyeSBiYXNlZCBvbiBQMlAgRGV2aWNlIEFkZHJlc3MKKwkgICgiQlNTIHAycF9kZXZfYWRkcj08UDJQIERldmljZSBBZGRyZXNzPiIpCisJKiBhZGRlZCBCU1MgZW50cnkgYWdlIHRvIGN0cmxfaWZhY2UgQlNTIGNvbW1hbmQgb3V0cHV0CisJKiBhZGRlZCBvcHRpb25hbCBNQVNLPTB4SCBvcHRpb24gZm9yIGN0cmxfaWZhY2UgQlNTIGNvbW1hbmQgdG8gc2VsZWN0CisJICB3aGljaCBmaWVsZHMgYXJlIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZQorCSogYWRkZWQgb3B0aW9uYWwgUkFOR0U9QUxMfE4xLU4yIG9wdGlvbiBmb3IgY3RybF9pZmFjZSBCU1MgY29tbWFuZCB0bworCSAgZmV0Y2ggaW5mb3JtYXRpb24gYWJvdXQgc2V2ZXJhbCBCU1NlcyBpbiBvbmUgY2FsbAorCSogc2ltcGxpZmllZCBsaWNlbnNpbmcgdGVybXMgYnkgc2VsZWN0aW5nIHRoZSBCU0QgbGljZW5zZSBhcyB0aGUgb25seQorCSAgYWx0ZXJuYXRpdmUKKwkqIGFkZGVkICJQMlBfU0VUIGRpc2FsbG93X2ZyZXEgPGZyZXEgbGlzdD4iIGN0cmxfaWZhY2UgY29tbWFuZCB0bworCSAgZGlzYWJsZSBjaGFubmVscyBmcm9tIFAyUCB1c2UKKwkqIGFkZGVkIHAycF9wcmVmX2NoYW4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgdG8gYWxsb3cgcHJlZmVycmVkIFAyUAorCSAgY2hhbm5lbHMgdG8gYmUgc3BlY2lmaWVkCisJKiBhZGRlZCBzdXBwb3J0IGZvciBhZHZlcnRpc2luZyBpbW1lZGlhdGUgYXZhaWxhYmlsaXR5IG9mIGEgV1BTCisJICBjcmVkZW50aWFsIGZvciBQMlAgdXNlIGNhc2VzCisJKiBvcHRpbWl6ZWQgc2NhbiBvcGVyYXRpb25zIGZvciBQMlAgdXNlIGNhc2VzICh1c2Ugc2luZ2xlIGNoYW5uZWwgc2NhbgorCSAgZm9yIGEgc3BlY2lmaWMgU1NJRCB3aGVuIHBvc3NpYmxlKQorCSogRUFQLVRUTFM6IGZpeGVkIHBlZXIgY2hhbGxlbmdlIGdlbmVyYXRpb24gZm9yIE1TQ0hBUHYyCisJKiBTTUU6IGRvIG5vdCB1c2UgcmVhc3NvY2lhdGlvbiBhZnRlciBleHBsaWNpdCBkaXNjb25uZWN0aW9uIHJlcXVlc3QKKwkgIChsb2NhbCBvciBhIG5vdGlmaWNhdGlvbiBmcm9tIGFuIEFQKQorCSogYWRkZWQgc3VwcG9ydCBmb3Igc2VuZGluZyBkZWJ1ZyBpbmZvIHRvIExpbnV4IHRyYWNpbmcgKC1UIG9uIGNvbW1hbmQKKwkgIGxpbmUpCisJKiBhZGRlZCBzdXBwb3J0IGZvciB1c2luZyBEZWF1dGhlbnRpY2F0aW9uIHJlYXNvbiBjb2RlIDMgYXMgYW4KKwkgIGluZGljYXRpb24gb2YgUDJQIGdyb3VwIHRlcm1pbmF0aW9uCisJKiBhZGRlZCB3cHNfdmVuZG9yX2V4dF9tMSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB0byBhbGxvdyB2ZW5kb3IKKwkgIHNwZWNpZmljIGF0dHJpYnV0ZXMgdG8gYmUgYWRkZWQgdG8gV1BTIE0xCisJKiBzdGFydGVkIHVzaW5nIHNlcGFyYXRlIFRMUyBsaWJyYXJ5IGNvbnRleHQgZm9yIHR1bm5lbGVkIFRMUworCSAgKEVBUC1QRUFQL1RMUywgRUFQLVRUTFMvVExTLCBFQVAtRkFTVC9UTFMpIHRvIHN1cHBvcnQgZGlmZmVyZW50IENBCisJICBjZXJ0aWZpY2F0ZSBjb25maWd1cmF0aW9uIGJldHdlZW4gUGhhc2UgMSBhbmQgUGhhc2UgMgorCSogYWRkZWQgb3B0aW9uYWwgImF1dG8iIHBhcmFtZXRlciBmb3IgcDJwX2Nvbm5lY3QgdG8gcmVxdWVzdCBhdXRvbWF0aWMKKwkgIEdPIE5lZ290aWF0aW9uIHZzLiBqb2luLWEtZ3JvdXAgc2VsZWN0aW9uCisJKiBhZGRlZCBkaXNhYmxlZF9zY2FuX29mZmxvYWQgcGFyYW1ldGVyIHRvIGRpc2FibGUgYXV0b21hdGljIHNjYW4KKwkgIG9mZmxvYWRpbmcgKHNjaGVkX3NjYW4pCisJKiBhZGRlZCBvcHRpb25hbCBwZXJzaXN0ZW50PTxuZXR3b3JrIGlkPiBwYXJhbWV0ZXIgZm9yIHAycF9jb25uZWN0IHRvCisJICBhbGxvdyBmb3JjaW5nIG9mIGEgc3BlY2lmaWMgU1NJRC9wYXNzcGhyYXNlIGZvciBHTyBOZWdvdGlhdGlvbgorCSogYWRkZWQgc3VwcG9ydCBmb3IgT0JTUyBzY2FuIHJlcXVlc3RzIGFuZCAyMC80MCBCU1MgY29leGlzdGVuY2UgcmVwb3J0cworCSogcmVqZWN0IFBEIFJlcXVlc3QgZm9yIHVua25vd24gZ3JvdXAKKwkqIHJlbW92ZWQgc2NyaXB0cyBhbmQgbm90ZXMgcmVsYXRlZCB0byBXaW5kb3dzIGJpbmFyeSByZWxlYXNlcyAod2hpY2gKKwkgIGhhdmUgbm90IGJlZW4gdXNlZCBzdGFydGluZyBmcm9tIDEueCkKKwkqIGFkZGVkIGluaXRpYWwgc3VwcG9ydCBmb3IgV05NIG9wZXJhdGlvbnMKKwkgIC0gS2VlcC1hbGl2ZSBiYXNlZCBvbiBCU1MgbWF4IGlkbGUgcGVyaW9kCisJICAtIFdOTS1TbGVlcCBNb2RlCisJICAtIG1pbmltYWwgQlNTIFRyYW5zaXRpb24gTWFuYWdlbWVudCBwcm9jZXNzaW5nCisJKiBhZGRlZCBhdXRvc2NhbiBtb2R1bGUgdG8gY29udHJvbCBzY2FubmluZyBiZWhhdmlvciB3aGlsZSBub3QgY29ubmVjdGVkCisJICAtIGF1dG9zY2FuX3BlcmlvZGljIGFuZCBhdXRvc2Nhbl9leHBvbmVudGlhbCBtb2R1bGVzCisJKiBhZGRlZCBuZXcgV1BTIE5GQyBjdHJsX2lmYWNlIG1lY2hhbmlzbQorCSAgLSBhZGRlZCBpbml0aWFsIHN1cHBvcnQgTkZDIGNvbm5lY3Rpb24gaGFuZG92ZXIKKwkgIC0gcmVtb3ZlZCBvYnNvbGV0ZWQgV1BTX09PQiBjb21tYW5kIChpbmNsdWRpbmcgc3VwcG9ydCBmb3IgZGVwcmVjYXRlZAorCSAgICBVRkQgY29uZmlnX21ldGhvZCkKKwkqIGFkZGVkIG9wdGlvbmFsIGZyYW1ld29yayBmb3IgZXh0ZXJuYWwgcGFzc3dvcmQgc3RvcmFnZSAoImV4dDo8bmFtZT4iKQorCSogd3BhX2NsaTogYWRkZWQgb3B0aW9uYWwgc3VwcG9ydCBmb3IgY29udHJvbGxpbmcgd3BhX3N1cHBsaWNhbnQKKwkgIHJlbW90ZWx5IG92ZXIgVURQIChDT05GSUdfQ1RSTF9JRkFDRT11ZHAtcmVtb3RlKSBmb3IgdGVzdGluZyBwdXJwb3NlcworCSogd3BhX2NsaTogZXh0ZW5kZWQgdGFiIGNvbXBsZXRpb24gdG8gbW9yZSBjb21tYW5kcworCSogY2hhbmdlZCBTU0lEIG91dHB1dCB0byB1c2UgcHJpbnRmLWVzY2FwZWQgc3RyaW5ncyBpbnN0ZWFkIG9mIG1hc2tpbmcKKwkgIG9mIG5vbi1BU0NJSSBjaGFyYWN0ZXJzCisJICAtIFNTSUQgY2FuIG5vdyBiZSBjb25maWd1cmVkIGluIHRoZSBzYW1lIGZvcm1hdDogc3NpZD1QImFiY1x4MDB0ZXN0IgorCSogcmVtb3ZlZCBkZWZhdWx0IEFDTT0xIGZyb20gQUNfVk8gYW5kIEFDX1ZJCisJKiBhZGRlZCBvcHRpb25hbCAiaHQ0MCIgYXJndW1lbnQgZm9yIFAyUCBjdHJsX2lmYWNlIGNvbW1hbmRzIHRvIGFsbG93CisJICA0MCBNSHogY2hhbm5lbHMgdG8gYmUgcmVxdWVzdGVkIG9uIHRoZSA1IEdIeiBiYW5kCisJKiBhZGRlZCBvcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBwMnBfaW52aXRlIGNvbW1hbmQgdG8gc3BlY2lmeSBjaGFubmVsCisJICB3aGVuIHJlaW52b2tpbmcgYSBwZXJzaXN0ZW50IGdyb3VwIGFzIHRoZSBHTworCSogaW1wcm92ZWQgRklQUyBtb2RlIGJ1aWxkcyB3aXRoIE9wZW5TU0wKKwkgIC0gIm1ha2UgZmlwcyIgd2l0aCBDT05GSUdfRklQUz15IHRvIGJ1aWxkIHdwYV9zdXBwbGljYW50IHdpdGggdGhlCisJICAgIE9wZW5TU0wgRklQUyBvYmplY3QgbW9kdWxlCisJICAtIHJlcGxhY2UgbG93IGxldmVsIE9wZW5TU0wgQUVTIEFQSSBjYWxscyB0byB1c2UgRVZQCisJICAtIHVzZSBPcGVuU1NMIGtleWluZyBtYXRlcmlhbCBleHBvcnRlciB3aGVuIHBvc3NpYmxlCisJICAtIGRvIG5vdCBleHBvcnQgVExTIGtleXMgaW4gRklQUyBtb2RlCisJICAtIHJlbW92ZSBNRDUgZnJvbSBDT05GSUdfRklQUz15IGJ1aWxkcworCSAgLSB1c2UgT3BlblNTTCBmdW5jdGlvbiBmb3IgUEtCREYyIHBhc3NwaHJhc2UtdG8tUFNLCisJICAtIHVzZSBPcGVuU1NMIEhNQUMgaW1wbGVtZW50YXRpb24KKwkgIC0gbWl4IFJBTkRfYnl0ZXMoKSBvdXRwdXQgaW50byByYW5kb21fZ2V0X2J5dGVzKCkgdG8gZm9yY2UgT3BlblNTTAorCSAgICBEUkJHIHRvIGJlIHVzZWQgaW4gRklQUyBtb2RlCisJICAtIHVzZSBPcGVuU1NMIENNQUMgaW1wbGVtZW50YXRpb24KKwkqIGFkZGVkIG1lY2hhbmlzbSB0byBkaXNhYmxlIFRMUyBTZXNzaW9uIFRpY2tldCBleHRlbnNpb24KKwkgIC0gYSB3b3JrYXJvdW5kIGZvciBzZXJ2ZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgVExTIGV4dGVuc2lvbnMgdGhhdAorCSAgICB3YXMgZW5hYmxlZCBieSBkZWZhdWx0IGluIHJlY2VudCBPcGVuU1NMIHZlcnNpb25zCisJICAtIHRsc19kaXNhYmxlX3Nlc3Npb25fdGlja2V0PTEKKwkgIC0gYXV0b21hdGljYWxseSBkaXNhYmxlIFRMUyBTZXNzaW9uIFRpY2tldCBleHRlbnNpb24gYnkgZGVmYXVsdCB3aGVuCisJICAgIHVzaW5nIEVBUC1UTFMvUEVBUC9UVExTIChpLmUuLCBvbmx5IHVzZSBpdCB3aXRoIEVBUC1GQVNUKQorCSogY2hhbmdlZCBWRU5ET1ItVEVTVCBFQVAgbWV0aG9kIHRvIHVzZSBwcm9wZXIgcHJpdmF0ZSBlbnRlcnByaXNlIG51bWJlcgorCSAgKHRoaXMgd2lsbCBub3QgaW50ZXJvcGVyYXRlIHdpdGggb2xkZXIgdmVyc2lvbnMpCisJKiBkaXNhYmxlIG5ldHdvcmsgYmxvY2sgdGVtcG9yYXJpbHkgb24gYXV0aGVudGljYXRpb24gZmFpbHVyZXMKKwkqIGltcHJvdmVkIFdQUyBBUCBzZWxlY3Rpb24gZHVyaW5nIFdQUyBQSU4gaXRlcmF0aW9uCisJKiBhZGRlZCBzdXBwb3J0IGZvciBjb25maWd1cmluZyBHQ01QIGNpcGhlciBmb3IgSUVFRSA4MDIuMTFhZAorCSogYWRkZWQgc3VwcG9ydCBmb3IgV2ktRmkgRGlzcGxheSBleHRlbnNpb25zCisJICAtIFdGRF9TVUJFTEVNRU5UX1NFVCBjdHJsX2lmYWNlIGNvbW1hbmQgdG8gY29uZmlndXJlIFdGRCBzdWJlbGVtZW50cworCSAgLSBTRVQgd2lmaV9kaXNwbGF5IDwwLzE+IHRvIGRpc2FibGUvZW5hYmxlIFdGRCBzdXBwb3J0CisJICAtIFdGRCBzZXJ2aWNlIGRpc2NvdmVyeQorCSAgLSBhbiBleHRlcm5hbCBwcm9ncmFtIGlzIG5lZWRlZCB0byBtYW5hZ2UgdGhlIGF1ZGlvL3ZpZGVvIHN0cmVhbWluZworCSAgICBhbmQgY29kZWNzCisJKiBvcHRpbWl6ZWQgc2NhbiByZXN1bHQgdXNlIGZvciBuZXR3b3JrIHNlbGVjdGlvbgorCSAgLSB1c2UgdGhlIGludGVybmFsIEJTUyB0YWJsZSBpbnN0ZWFkIG9mIHJhdyBzY2FuIHJlc3VsdHMKKwkgIC0gYWxsb3cgdW5uZWNlc3Nhcnkgc2NhbnMgdG8gYmUgc2tpcHBlZCBpZiBmcmVzaCBpbmZvcm1hdGlvbiBpcworCSAgICBhdmFpbGFibGUgKGUuZy4sIGFmdGVyIEdBUy9BTlFQIHJvdW5kIGZvciBJbnRlcndvcmtpbmcpCisJKiBhZGRlZCBzdXBwb3J0IGZvciAyNTYtYml0IEFFUyB3aXRoIGludGVybmFsIFRMUyBpbXBsZW1lbnRhdGlvbgorCSogYWxsb3cgcGVlciB0byBwcm9wb3NlIGNoYW5uZWwgaW4gUDJQIGludml0YXRpb24gcHJvY2VzcyBmb3IgYQorCSAgcGVyc2lzdGVudCBncm91cAorCSogYWRkZWQgZGlzYWxsb3dfYXBzIHBhcmFtZXRlciB0byBhbGxvdyBCU1NJRHMvU1NJRHMgdG8gYmUgZGlzYWxsb3dlZAorCSAgZnJvbSBuZXR3b3JrIHNlbGVjdGlvbgorCSogcmUtZW5hYmxlIHRoZSBuZXR3b3JrcyBkaXNhYmxlZCBkdXJpbmcgV1BTIG9wZXJhdGlvbnMKKwkqIGFsbG93IFAyUCBmdW5jdGlvbmFsaXR5IHRvIGJlIGRpc2FibGVkIHBlciBpbnRlcmZhY2UgKHAycF9kaXNhYmxlZD0xKQorCSogYWRkZWQgc2Vjb25kYXJ5IGRldmljZSB0eXBlcyBpbnRvIFAyUF9QRUVSIG91dHB1dAorCSogYWRkZWQgYW4gb3B0aW9uIHRvIGRpc2FibGUgdXNlIG9mIGEgc2VwYXJhdGUgUDJQIGdyb3VwIGludGVyZmFjZQorCSAgKHAycF9ub19ncm91cF9pZmFjZT0xKQorCSogZml4ZWQgUDJQIEJvbmpvdXIgU0QgdG8gbWF0Y2ggZW50cmllcyB3aXRoIGJvdGggY29tcHJlc3NlZCBhbmQgbm90CisJICBjb21wcmVzc2VkIGRvbWFpbiBuYW1lIGZvcm1hdCBhbmQgc3VwcG9ydCBtdWx0aXBsZSBCb25qb3VyIFBUUiBtYXRjaGVzCisJICBmb3IgdGhlIHNhbWUga2V5CisJKiB1c2UgZGVhdXRoZW50aWNhdGlvbiBpbnN0ZWFkIG9mIGRpc2Fzc29jaWF0aW9uIGZvciBhbGwgZGlzY29ubmVjdGlvbgorCSAgb3BlcmF0aW9uczsgdGhpcyByZW1vdmVzIHRoZSBub3cgdW51c2VkIGRpc2Fzc29jaWF0ZSgpIHdwYV9kcml2ZXJfb3BzCisJICBjYWxsYmFjaworCSogb3B0aW1pemVkIFBTSyBnZW5lcmF0aW9uIG9uIFAyUCBHTyBieSBjYWNoaW5nIHJlc3VsdHMgdG8gYXZvaWQKKwkgIG11bHRpcGxlIFBCS0RGMiBvcGVyYXRpb25zCisJKiBhZGRlZCBva2M9MSBnbG9iYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgdG8gYWxsb3cgT0tDIHRvIGJlIGVuYWJsZWQKKwkgIGJ5IGRlZmF1bHQgZm9yIGFsbCBuZXR3b3JrIGJsb2NrcworCSogYWRkZWQgYSB3b3JrYXJvdW5kIGZvciBXUFMgUEJDIHNlc3Npb24gb3ZlcmxhcCBkZXRlY3Rpb24gdG8gYXZvaWQKKwkgIGludGVyb3AgaXNzdWVzIHdpdGggZGVwbG95ZWQgc3RhdGlvbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3QKKwkgIHJlbW92ZSBhY3RpdmUgUEJDIGluZGljYXRpb24gZnJvbSBQcm9iZSBSZXF1ZXN0IGZyYW1lcyBwcm9wZXJseQorCSogYWRkZWQgYmFzaWMgc3VwcG9ydCBmb3IgNjAgR0h6IGJhbmQKKwkqIGV4dGVuZCBFQVBPTCBmcmFtZXMgcHJvY2Vzc2luZyB3b3JrYXJvdW5kIGZvciByb2FtaW5nIGNhc2VzCisJICAocG9zdHBvbmUgcHJvY2Vzc2luZyBvZiB1bmV4cGVjdGVkIEVBUE9MIGZyYW1lIHVudGlsIGFzc29jaWF0aW9uCisJICBldmVudCB0byBoYW5kbGUgcmVvcmRlcmVkIGV2ZW50cykKKwogMjAxMi0wNS0xMCAtIHYxLjAKIAkqIGJzZDogQWRkIHN1cHBvcnQgZm9yIHNldHRpbmcgSFQgdmFsdWVzIGluIElGTV9NTUFTSy4KIAkqIERlbGF5IFNUQSBlbnRyeSByZW1vdmFsIHVudGlsIERlYXV0aC9EaXNhc3NvYyBUWCBzdGF0dXMgaW4gQVAgbW9kZS4KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L01ha2VmaWxlIGIvd3BhX3N1cHBsaWNhbnQvTWFrZWZpbGUKaW5kZXggMjI3ZmI0Zi4uZGEyYWJmYyAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvTWFrZWZpbGUKKysrIGIvd3BhX3N1cHBsaWNhbnQvTWFrZWZpbGUKQEAgLTE3Miw4ICsxNzIsMTUgQEAKIE5FRURfQUVTX09NQUMxPXkKIGVuZGlmCiAKLWlmZGVmIENPTkZJR19JRUVFODAyMTFWCi1DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExVgoraWZkZWYgQ09ORklHX1NBRQorQ0ZMQUdTICs9IC1EQ09ORklHX1NBRQorT0JKUyArPSAuLi9zcmMvY29tbW9uL3NhZS5vCitORUVEX0VDQz15CitORUVEX0RIX0dST1VQUz15CitlbmRpZgorCitpZmRlZiBDT05GSUdfV05NCitDRkxBR1MgKz0gLURDT05GSUdfV05NCiBPQkpTICs9IHdubV9zdGEubwogZW5kaWYKIApAQCAtNDc1LDYgKzQ4MiwxMyBAQAogTkVFRF9BRVNfQ0JDPXkKIGVuZGlmCiAKK2lmZGVmIENPTkZJR19FQVBfUFJPWFkKK0NGTEFHUyArPSAtRENPTkZJR19FQVBfUFJPWFkKK09CSlMgKz0gLi4vc3JjL2VhcF9wZWVyL2VhcF9wcm94eV8kKENPTkZJR19FQVBfUFJPWFkpLm8KK2luY2x1ZGUgZWFwX3Byb3h5XyQoQ09ORklHX0VBUF9QUk9YWSkubWsKK0NPTkZJR19JRUVFODAyMVhfRUFQT0w9eQorZW5kaWYKKwogaWZkZWYgQ09ORklHX0VBUF9BS0FfUFJJTUUKICMgRUFQLUFLQScKIGlmZXEgKCQoQ09ORklHX0VBUF9BS0FfUFJJTUUpLCBkeW4pCkBAIC01NTYsNyArNTcwLDcgQEAKIGlmZGVmIENPTkZJR19FQVBfUFdECiBDRkxBR1MgKz0gLURFQVBfUFdECiBPQkpTICs9IC4uL3NyYy9lYXBfcGVlci9lYXBfcHdkLm8gLi4vc3JjL2VhcF9jb21tb24vZWFwX3B3ZF9jb21tb24ubwotT0JKU19oICs9IC4uL3NyYy9lYXBfc2VydmVyL2VhcF9wd2QubworT0JKU19oICs9IC4uL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfcHdkLm8KIENPTkZJR19JRUVFODAyMVhfRUFQT0w9eQogTkVFRF9TSEEyNTY9eQogZW5kaWYKQEAgLTU4OCwyNSArNjAyLDEwIEBACiBORUVEX0FFU19DQkM9eQogTkVFRF9NT0RFWFA9eQogCi1pZmRlZiBDT05GSUdfV1BTX1VGRAotQ0ZMQUdTICs9IC1EQ09ORklHX1dQU19VRkQKLU9CSlMgKz0gLi4vc3JjL3dwcy93cHNfdWZkLm8KLU5FRURfV1BTX09PQj15Ci1lbmRpZgotCiBpZmRlZiBDT05GSUdfV1BTX05GQwogQ0ZMQUdTICs9IC1EQ09ORklHX1dQU19ORkMKIE9CSlMgKz0gLi4vc3JjL3dwcy9uZGVmLm8KLU9CSlMgKz0gLi4vc3JjL3dwcy93cHNfbmZjLm8KIE5FRURfV1BTX09PQj15Ci1pZmRlZiBDT05GSUdfV1BTX05GQ19QTjUzMQotUE41MzFfUEFUSCA/PSAvdXNyL2xvY2FsL3NyYy9uZmMKLUNGTEFHUyArPSAtRENPTkZJR19XUFNfTkZDX1BONTMxCi1DRkxBR1MgKz0gLUkke1BONTMxX1BBVEh9L2luYwotT0JKUyArPSAuLi9zcmMvd3BzL3dwc19uZmNfcG41MzEubwotTElCUyArPSAke1BONTMxX1BBVEh9L2xpYi93cHNuZmMuZGxsCi1MSUJTICs9ICR7UE41MzFfUEFUSH0vbGliL2xpYm5mY19tYXBwaW5nX3BuNTN4LmRsbAotZW5kaWYKIGVuZGlmCiAKIGlmZGVmIE5FRURfV1BTX09PQgpAQCAtNzMyLDkgKzczMSwxMyBAQAogT0JKUyArPSAuLi9zcmMvYXAvZHJ2X2NhbGxiYWNrcy5vCiBPQkpTICs9IC4uL3NyYy9hcC9hcF9kcnZfb3BzLm8KIE9CSlMgKz0gLi4vc3JjL2FwL2JlYWNvbi5vCitPQkpTICs9IC4uL3NyYy9hcC9lYXBfdXNlcl9kYi5vCiBpZmRlZiBDT05GSUdfSUVFRTgwMjExTgogT0JKUyArPSAuLi9zcmMvYXAvaWVlZTgwMl8xMV9odC5vCiBlbmRpZgoraWZkZWYgQ09ORklHX1dOTQorT0JKUyArPSAuLi9zcmMvYXAvd25tX2FwLm8KK2VuZGlmCiBpZmRlZiBDT05GSUdfQ1RSTF9JRkFDRQogT0JKUyArPSAuLi9zcmMvYXAvY3RybF9pZmFjZV9hcC5vCiBlbmRpZgpAQCAtNzQ4LDEwICs3NTEsNiBAQAogQ0ZMQUdTICs9IC1EQ09ORklHX0lFRUU4MDIxMU4KIGVuZGlmCiAKLWlmZGVmIENPTkZJR19XTk0KLUNGTEFHUyArPSAtRENPTkZJR19XTk0KLWVuZGlmCi0KIGlmZGVmIE5FRURfQVBfTUxNRQogT0JKUyArPSAuLi9zcmMvYXAvd21tLm8KIE9CSlMgKz0gLi4vc3JjL2FwL2FwX2xpc3QubwpAQCAtODcwLDYgKzg2OSw4IEBACiBPQkpTX2ggKz0gLi4vc3JjL2VhcF9zZXJ2ZXIvZWFwX3NlcnZlcl90bHNfY29tbW9uLm8KIGlmbmRlZiBDT05GSUdfRklQUwogTkVFRF9UTFNfUFJGPXkKK05FRURfU0hBMT15CitORUVEX01ENT15CiBlbmRpZgogZW5kaWYKIApAQCAtMTE4OSw2ICsxMTkwLDEwIEBACiBlbmRpZgogZW5kaWYKIAoraWZkZWYgTkVFRF9FQ0MKK0NGTEFHUyArPSAtRENPTkZJR19FQ0MKK2VuZGlmCisKIGlmZGVmIENPTkZJR19OT19SQU5ET01fUE9PTAogQ0ZMQUdTICs9IC1EQ09ORklHX05PX1JBTkRPTV9QT09MCiBlbHNlCkBAIC0xNDE2LDYgKzE0MjEsNyBAQAogZW5kaWYKIAogT0JKUyArPSAuLi9zcmMvZHJpdmVycy9kcml2ZXJfY29tbW9uLm8KK09CSlNfcHJpdiArPSAuLi9zcmMvZHJpdmVycy9kcml2ZXJfY29tbW9uLm8KIAogT0JKU193cGFfcm0gOj0gY3RybF9pZmFjZS5vIGN0cmxfaWZhY2VfdW5peC5vCiBPQkpTX3dwYSA6PSAkKGZpbHRlci1vdXQgJChPQkpTX3dwYV9ybSksJChPQkpTKSkgJChPQkpTX2gpIHRlc3RzL3Rlc3Rfd3BhLm8KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L1JFQURNRSBiL3dwYV9zdXBwbGljYW50L1JFQURNRQppbmRleCBhMDZlNWMxLi5kODRlNjFlIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9SRUFETUUKKysrIGIvd3BhX3N1cHBsaWNhbnQvUkVBRE1FCkBAIC0xLDcgKzEsNyBAQAogV1BBIFN1cHBsaWNhbnQKID09PT09PT09PT09PT09CiAKLUNvcHlyaWdodCAoYykgMjAwMy0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiBhbmQgY29udHJpYnV0b3JzCitDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4gYW5kIGNvbnRyaWJ1dG9ycwogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgbGljZW5zZSAodGhlIG9uZSB3aXRoCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9SRUFETUUtSFMyMCBiL3dwYV9zdXBwbGljYW50L1JFQURNRS1IUzIwCmluZGV4IGZlYjkwNDkuLjU2NjljNTUgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L1JFQURNRS1IUzIwCisrKyBiL3dwYV9zdXBwbGljYW50L1JFQURNRS1IUzIwCkBAIC0xOTAsNiArMTkwLDExIEBACiAjIHBoYXNlMjogUHJlLWNvbmZpZ3VyZSBQaGFzZSAyIChpbm5lciBhdXRoZW50aWNhdGlvbikgcGFyYW1ldGVycwogIwlUaGlzIG9wdGlvbmFsIGZpZWxkIGlzIHVzZWQgd2l0aCBsaWtlIHRoZSAnZWFwJyBwYXJhbWV0ZXIuCiAjCisjIGV4Y2x1ZGVkX3NzaWQ6IEV4Y2x1ZGVkIFNTSUQKKyMJVGhpcyBvcHRpb25hbCBmaWVsZCBjYW4gYmUgdXNlZCB0byBleGNsdWRlZCBzcGVjaWZpYyBTU0lEKHMpIGZyb20KKyMJbWF0Y2hpbmcgd2l0aCB0aGUgbmV0d29yay4gTXVsdGlwbGUgZW50cmllcyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG1vcmUKKyMJdGhhbiBvbmUgU1NJRC4KKyMKICMgZm9yIGV4YW1wbGU6CiAjCiAjY3JlZD17CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9SRUFETUUtUDJQIGIvd3BhX3N1cHBsaWNhbnQvUkVBRE1FLVAyUAppbmRleCA0YWJjMmYyLi5mYjk5YzdiIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9SRUFETUUtUDJQCisrKyBiL3dwYV9zdXBwbGljYW50L1JFQURNRS1QMlAKQEAgLTE5MSw3ICsxOTEsMTMgQEAKIAogcDJwX2NhbmNlbAogCi1DYW5jZWwgYW4gb25nb2luZyBQMlAgZ3JvdXAgZm9ybWF0aW9uIHJlbGF0ZWQgb3BlcmF0aW9uLgorQ2FuY2VsIGFuIG9uZ29pbmcgUDJQIGdyb3VwIGZvcm1hdGlvbiBhbmQgam9pbmluZy1hLWdyb3VwIHJlbGF0ZWQKK29wZXJhdGlvbi4gVGhpcyBvcGVyYXRpb25zIHVuYXV0aG9yaXplcyB0aGUgc3BlY2lmaWMgcGVlciBkZXZpY2UgKGlmIGFueQoraGFkIGJlZW4gYXV0aG9yaXplZCB0byBzdGFydCBncm91cCBmb3JtYXRpb24pLCBzdG9wcyBQMlAgZmluZCAoaWYgaW4KK3Byb2dyZXNzKSwgc3RvcHMgcGVuZGluZyBvcGVyYXRpb25zIGZvciBqb2luLWEtZ3JvdXAsIGFuZCByZW1vdmVzIHRoZQorUDJQIGdyb3VwIGludGVyZmFjZSAoaWYgb25lIHdhcyB1c2VkKSB0aGF0IGlzIGluIHRoZSBXUFMgcHJvdmlzaW9uaW5nCitzdGVwLiBJZiB0aGUgV1BTIHByb3Zpc2lvbmluZyBzdGVwIGhhcyBiZWVuIGNvbXBsZXRlZCwgdGhlIGdyb3VwIGlzIG5vdAordGVybWluYXRlZC4KIAogU2VydmljZSBEaXNjb3ZlcnkKIApAQCAtMjE5LDYgKzIyNSwxOSBAQAogd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHBlZXIgaGFzIHJlcGxpZWQgdG8KIGl0LgogCitTZXJ2aWNlIFF1ZXJ5IFRMViBoYXMgZm9sbG93aW5nIGZvcm1hdDoKK0xlbmd0aCAoMiBvY3RldHMsIGxpdHRsZSBlbmRpYW4pIC0gbGVuZ3RoIG9mIGZvbGxvd2luZyBkYXRhCitTZXJ2aWNlIFByb3RvY29sIFR5cGUgKDEgb2N0ZXQpIC0gc2VlIHRoZSB0YWJsZSBiZWxvdworU2VydmljZSBUcmFuc2FjdGlvbiBJRCAoMSBvY3RldCkgLSBub256ZXJvIGlkZW50aWZpZXIgZm9yIHRoZSBUTFYKK1F1ZXJ5IERhdGEgKExlbmd0aCAtIDIgb2N0ZXRzIG9mIGRhdGEpIC0gc2VydmljZSBwcm90b2NvbCBzcGVjaWZpYyBkYXRhCisKK1NlcnZpY2UgUHJvdG9jb2wgVHlwZXM6CiswID0gQWxsIHNlcnZpY2UgcHJvdG9jb2xzCisxID0gQm9uam91cgorMiA9IFVQblAKKzMgPSBXUy1EaXNjb3ZlcnkKKzQgPSBXaS1GaSBEaXNwbGF5CisKIEZvciBVUG5QLCBhbiBhbHRlcm5hdGl2ZSBjb21tYW5kIGZvcm1hdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEKIHNpbmdsZSBxdWVyeSBUTFYgKGkuZS4sIGEgc2VydmljZSBkaXNjb3ZlcnkgZm9yIGEgc3BlY2lmaWMgVVBuUAogc2VydmljZSk6CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9SRUFETUUtV1BTIGIvd3BhX3N1cHBsaWNhbnQvUkVBRE1FLVdQUwppbmRleCA2OTJkNWY1Li4yYTFkZGE1IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9SRUFETUUtV1BTCisrKyBiL3dwYV9zdXBwbGljYW50L1JFQURNRS1XUFMKQEAgLTEzMCw2ICsxMzAsMTIgQEAKIFRoaXMgc3RhcnRzIHRoZSBXUFMgbmVnb3RpYXRpb24gaW4gdGhlIHNhbWUgd2F5IGFzIGFib3ZlIHdpdGggdGhlCiBnZW5lcmF0ZWQgUElOLgogCitXaGVuIHRoZSB3cHNfcGluIGNvbW1hbmQgaXMgaXNzdWVkIGZvciBhbiBBUCAoaW5jbHVkaW5nIFAyUCBHTykgbW9kZQoraW50ZXJmYWNlLCBhbiBvcHRpb25hbCB0aW1lb3V0IHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CitleHBpcmF0aW9uIHRpbWVvdXQgZm9yIHRoZSBQSU4gaW4gc2Vjb25kcy4gRm9yIGV4YW1wbGU6CisKK3dwYV9jbGkgd3BzX3BpbiBhbnkgMTIzNDU2NzAgMzAwCisKIAogSWYgYSByYW5kb20gUElOIGlzIG5lZWRlZCBmb3IgYSB1c2VyIGludGVyZmFjZSwgIndwYV9jbGkgd3BzX3BpbiBnZXQiCiBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBQSU4gd2l0aG91dCBzdGFydGluZyBXUFMgbmVnb3RpYXRpb24uCkBAIC0zMzAsNiArMzM2LDE2IEBACiB0b2tlbnMgZHVyaW5nIG1hbnVmYWN0dXJpbmcgKGVhY2ggc3RhdGlvbiBuZWVkcyB0byBoYXZlIGl0cyBvd24gcmFuZG9tCiBrZXlzKS4KIAorVGhlICJ3cHNfbmZjX2NvbmZpZ190b2tlbiA8V1BTL05ERUY+IiBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGFuCitORkMgY29uZmlndXJhdGlvbiB0b2tlbiB3aGVuIHdwYV9zdXBwbGljYW50IGlzIGNvbnRyb2xsaW5nIGFuIEFQCitpbnRlcmZhY2UgKEFQIG9yIFAyUCBHTykuIFRoZSBvdXRwdXQgdmFsdWUgZnJvbSB0aGlzIGNvbW1hbmQgaXMgYQoraGV4ZHVtcCBvZiB0aGUgY3VycmVudCBBUCBjb25maWd1cmF0aW9uIChXUFMgcGFyYW1ldGVyIHJlcXVlc3RzIHRoaXMgdG8KK2luY2x1ZGUgb25seSB0aGUgV1BTIGF0dHJpYnV0ZXM7IE5ERUYgcGFyYW1ldGVyIHJlcXVlc3RzIGFkZGl0aW9uYWwgTkRFRgorZW5jYXBzdWxhdGlvbiB0byBiZSBpbmNsdWRlZCkuIFRoaXMgZGF0YSBuZWVkcyB0byBiZSB3cml0dGVuIHRvIGFuIE5GQwordGFnIHdpdGggYW4gZXh0ZXJuYWwgcHJvZ3JhbS4gT25jZSB3cml0dGVuLCB0aGUgTkZDIGNvbmZpZ3VyYXRpb24gdG9rZW4KK2NhbiBiZSB1c2VkIHRvIHRvdWNoIGFuIE5GQyBpbnRlcmZhY2Ugb24gYSBzdGF0aW9uIHRvIHByb3Zpc2lvbiB0aGUKK2NyZWRlbnRpYWxzIG5lZWRlZCB0byBhY2Nlc3MgdGhlIG5ldHdvcmsuCisKIElmIHRoZSBzdGF0aW9uIGluY2x1ZGVzIE5GQyBpbnRlcmZhY2UgYW5kIHJlYWRzIGFuIE5GQyB0YWcgd2l0aCBhIE1JTUUKIG1lZGlhIHR5cGUgImFwcGxpY2F0aW9uL3ZuZC53ZmEud3NjIiwgdGhlIE5ERUYgbWVzc2FnZSBwYXlsb2FkICh3aXRoIG9yCiB3aXRob3V0IE5ERUYgZW5jYXBzdWxhdGlvbikgY2FuIGJlIGRlbGl2ZXJlZCB0byB3cGFfc3VwcGxpY2FudCB1c2luZyB0aGUKQEAgLTM0NSwzICszNjEsMzQgQEAKIHRoZSBFUiBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIHN0YXJ0ZWQgKHdwc19lcl9zdGFydCksIHRoZSBORkMgcGFzc3dvcmQKIHRva2VuIGlzIHVzZWQgdG8gZW5hYmxlIGVucm9sbG1lbnQgb2YgYSBuZXcgc3RhdGlvbiAodGhhdCB3YXMgdGhlIHNvdXJjZQogb2YgdGhlIE5GQyBwYXNzd29yZCB0b2tlbikuCisKKyJuZmNfZ2V0X2hhbmRvdmVyX3JlcSA8TkRFRj4gPFdQUz4iIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgdGhlCitjb250ZW50cyBvZiBhIEhhbmRvdmVyIFJlcXVlc3QgTWVzc2FnZSBmb3IgY29ubmVjdGlvbiBoYW5kb3Zlci4gVGhlCitmaXJzdCBhcmd1bWVudCBzZWxlY3RzIHRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBkYXRhIGFuZCB0aGUgc2Vjb25kCithcmd1bWVudCBzZWxlY3RzIHdoaWNoIHR5cGUgb2YgY29ubmVjdGlvbiBoYW5kb3ZlciBpcyByZXF1ZXN0ZWQgKFdQUyA9CitXaS1GaSBoYW5kb3ZlciBhcyBzcGVjaWZpZWQgaW4gV1NDIDIuMCkuCisKKyJuZmNfZ2V0X2hhbmRvdmVyX3NlbCA8TkRFRj4gPFdQUz4iIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgdGhlCitjb250ZW50cyBvZiBhIEhhbmRvdmVyIFNlbGVjdCBNZXNzYWdlIGZvciBjb25uZWN0aW9uIGhhbmRvdmVyIHdoZW4gdGhpcworZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgSGFuZG92ZXIgUmVxdWVzdCBNZXNzYWdlLiBUaGUKK2ZpcnN0IGFyZ3VtZW50IHNlbGVjdHMgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGRhdGEgYW5kIHRoZSBzZWNvbmQKK2FyZ3VtZW50IHNlbGVjdHMgd2hpY2ggdHlwZSBvZiBjb25uZWN0aW9uIGhhbmRvdmVyIGlzIHJlcXVlc3RlZCAoV1BTID0KK1dpLUZpIGhhbmRvdmVyIGFzIHNwZWNpZmllZCBpbiBXU0MgMi4wKS4KKworIm5mY19yeF9oYW5kb3Zlcl9yZXEgPGhleGR1bXAgb2YgcGF5bG9hZD4iIGlzIHVzZWQgdG8gaW5kaWNhdGUgcmVjZWlwdAorb2YgTkZDIGNvbm5lY3Rpb24gaGFuZG92ZXIgcmVxdWVzdC4gVGhlIHBheWxvYWQgbWF5IGluY2x1ZGUgbXVsdGlwbGUKK2NhcnJpZXJzIHRoZSB0aGUgYXBwbGljYWJsZSBvbmVzIGFyZSBtYXRjaGVkIGJhc2VkIG9uIHRoZSBtZWRpYQordHlwZS4gVGhlIHJlcGx5IGRhdGEgaXMgY29udGVudHMgZm9yIHRoZSBIYW5kb3ZlciBTZWxlY3QgTWVzc2FnZQorKGhleGR1bXApLgorCisibmZjX3J4X2hhbmRvdmVyX3NlbCA8aGV4ZHVtcCBvZiBwYXlsb2FkPiIgaXMgdXNlZCB0byBpbmRpY2F0ZSByZWNlaXB0CitvZiBORkMgY29ubmVjdGlvbiBoYW5kb3ZlciBzZWxlY3QuIFRoZSBwYXlsb2FkIG1heSBpbmNsdWRlIG11bHRpcGxlCitjYXJyaWVycyB0aGUgdGhlIGFwcGxpY2FibGUgb25lcyBhcmUgbWF0Y2hlZCBiYXNlZCBvbiB0aGUgbWVkaWEKK3R5cGUuCisKKyJuZmNfcmVwb3J0X2hhbmRvdmVyIDxJTklUL1JFU1A+IFdQUyA8Y2FycmllciBmcm9tIGhhbmRvdmVyIHJlcXVlc3Q+Cis8Y2FycmllciBmcm9tIGhhbmRvdmVyIHNlbGVjdD4iIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIHdheSBmb3IKK3JlcG9ydGluZyBjb21wbGV0ZWQgTkZDIGNvbm5lY3Rpb24gaGFuZG92ZXIuIFRoZSBmaXJzdCBwYXJhbWV0ZXIKK2luZGljYXRlcyB3aGV0aGVyIHRoZSBsb2NhbCBkZXZpY2UgaW5pdGlhdGVkIG9yIHJlc3BvbmRlZCB0byB0aGUKK2Nvbm5lY3Rpb24gaGFuZG92ZXIgYW5kIHRoZSBjYXJyaWVyIHJlY29yZHMgYXJlIHRoZSBzZWxlY3RlZCBjYXJyaWVyCitmcm9tIHRoZSBoYW5kb3ZlciByZXF1ZXN0IGFuZCBzZWxlY3QgbWVzc2FnZXMgYXMgYSBoZXhkdW1wLgpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvYXAuYyBiL3dwYV9zdXBwbGljYW50L2FwLmMKaW5kZXggMzc5OGY1YS4uODJiN2UxOSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvYXAuYworKysgYi93cGFfc3VwcGxpY2FudC9hcC5jCkBAIC00Niw3ICs0Niw2IEBACiAJCQkJICBzdHJ1Y3QgaG9zdGFwZF9jb25maWcgKmNvbmYpCiB7CiAJc3RydWN0IGhvc3RhcGRfYnNzX2NvbmZpZyAqYnNzID0gJmNvbmYtPmJzc1swXTsKLQlpbnQgcGFpcndpc2U7CiAKIAljb25mLT5kcml2ZXIgPSB3cGFfcy0+ZHJpdmVyOwogCkBAIC02Myw2ICs2MiwxMCBAQAogCQkgICAoc3NpZC0+ZnJlcXVlbmN5ID49IDU3NDUgJiYgc3NpZC0+ZnJlcXVlbmN5IDw9IDU4MjUpKSB7CiAJCWNvbmYtPmh3X21vZGUgPSBIT1NUQVBEX01PREVfSUVFRTgwMjExQTsKIAkJY29uZi0+Y2hhbm5lbCA9IChzc2lkLT5mcmVxdWVuY3kgLSA1MDAwKSAvIDU7CisJfSBlbHNlIGlmIChzc2lkLT5mcmVxdWVuY3kgPj0gNTYxNjAgKyAyMTYwICogMSAmJgorCQkgICBzc2lkLT5mcmVxdWVuY3kgPD0gNTYxNjAgKyAyMTYwICogNCkgeworCQljb25mLT5od19tb2RlID0gSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUFEOworCQljb25mLT5jaGFubmVsID0gKHNzaWQtPmZyZXF1ZW5jeSAtIDU2MTYwKSAvIDIxNjA7CiAJfSBlbHNlIHsKIAkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJVbnN1cHBvcnRlZCBBUCBtb2RlIGZyZXF1ZW5jeTogJWQgTUh6IiwKIAkJCSAgIHNzaWQtPmZyZXF1ZW5jeSk7CkBAIC0xNzQsMTUgKzE3NywxNSBAQAogCQlic3MtPndwYSA9IHNzaWQtPnByb3RvOwogCWJzcy0+d3BhX2tleV9tZ210ID0gc3NpZC0+a2V5X21nbXQ7CiAJYnNzLT53cGFfcGFpcndpc2UgPSBzc2lkLT5wYWlyd2lzZV9jaXBoZXI7Ci0JaWYgKHNzaWQtPnBhc3NwaHJhc2UpIHsKLQkJYnNzLT5zc2lkLndwYV9wYXNzcGhyYXNlID0gb3Nfc3RyZHVwKHNzaWQtPnBhc3NwaHJhc2UpOwotCX0gZWxzZSBpZiAoc3NpZC0+cHNrX3NldCkgeworCWlmIChzc2lkLT5wc2tfc2V0KSB7CiAJCW9zX2ZyZWUoYnNzLT5zc2lkLndwYV9wc2spOwogCQlic3MtPnNzaWQud3BhX3BzayA9IG9zX3phbGxvYyhzaXplb2Yoc3RydWN0IGhvc3RhcGRfd3BhX3BzaykpOwogCQlpZiAoYnNzLT5zc2lkLndwYV9wc2sgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKIAkJb3NfbWVtY3B5KGJzcy0+c3NpZC53cGFfcHNrLT5wc2ssIHNzaWQtPnBzaywgUE1LX0xFTik7CiAJCWJzcy0+c3NpZC53cGFfcHNrLT5ncm91cCA9IDE7CisJfSBlbHNlIGlmIChzc2lkLT5wYXNzcGhyYXNlKSB7CisJCWJzcy0+c3NpZC53cGFfcGFzc3BocmFzZSA9IG9zX3N0cmR1cChzc2lkLT5wYXNzcGhyYXNlKTsKIAl9IGVsc2UgaWYgKHNzaWQtPndlcF9rZXlfbGVuWzBdIHx8IHNzaWQtPndlcF9rZXlfbGVuWzFdIHx8CiAJCSAgIHNzaWQtPndlcF9rZXlfbGVuWzJdIHx8IHNzaWQtPndlcF9rZXlfbGVuWzNdKSB7CiAJCXN0cnVjdCBob3N0YXBkX3dlcF9rZXlzICp3ZXAgPSAmYnNzLT5zc2lkLndlcDsKQEAgLTIwNywyMiArMjEwLDEwIEBACiAJaWYgKHNzaWQtPmR0aW1fcGVyaW9kKQogCQlic3MtPmR0aW1fcGVyaW9kID0gc3NpZC0+ZHRpbV9wZXJpb2Q7CiAKLQkvKiBTZWxlY3QgZ3JvdXAgY2lwaGVyIGJhc2VkIG9uIHRoZSBlbmFibGVkIHBhaXJ3aXNlIGNpcGhlciBzdWl0ZXMgKi8KLQlwYWlyd2lzZSA9IDA7Ci0JaWYgKGJzcy0+d3BhICYgMSkKLQkJcGFpcndpc2UgfD0gYnNzLT53cGFfcGFpcndpc2U7Ci0JaWYgKGJzcy0+d3BhICYgMikgewotCQlpZiAoYnNzLT5yc25fcGFpcndpc2UgPT0gMCkKLQkJCWJzcy0+cnNuX3BhaXJ3aXNlID0gYnNzLT53cGFfcGFpcndpc2U7Ci0JCXBhaXJ3aXNlIHw9IGJzcy0+cnNuX3BhaXJ3aXNlOwotCX0KLQlpZiAocGFpcndpc2UgJiBXUEFfQ0lQSEVSX1RLSVApCi0JCWJzcy0+d3BhX2dyb3VwID0gV1BBX0NJUEhFUl9US0lQOwotCWVsc2UgaWYgKChwYWlyd2lzZSAmIChXUEFfQ0lQSEVSX0NDTVAgfCBXUEFfQ0lQSEVSX0dDTVApKSA9PQotCQkgV1BBX0NJUEhFUl9HQ01QKQotCQlic3MtPndwYV9ncm91cCA9IFdQQV9DSVBIRVJfR0NNUDsKLQllbHNlCi0JCWJzcy0+d3BhX2dyb3VwID0gV1BBX0NJUEhFUl9DQ01QOworCWlmICgoYnNzLT53cGEgJiAyKSAmJiBic3MtPnJzbl9wYWlyd2lzZSA9PSAwKQorCQlic3MtPnJzbl9wYWlyd2lzZSA9IGJzcy0+d3BhX3BhaXJ3aXNlOworCWJzcy0+d3BhX2dyb3VwID0gd3BhX3NlbGVjdF9hcF9ncm91cF9jaXBoZXIoYnNzLT53cGEsIGJzcy0+d3BhX3BhaXJ3aXNlLAorCQkJCQkJICAgIGJzcy0+cnNuX3BhaXJ3aXNlKTsKIAogCWlmIChic3MtPndwYSAmJiBic3MtPmllZWU4MDJfMXgpCiAJCWJzcy0+c3NpZC5zZWN1cml0eV9wb2xpY3kgPSBTRUNVUklUWV9XUEE7CkBAIC0yNjQsNyArMjU1LDcgQEAKIAkJZ290byBub193cHM7CiAjaWZkZWYgQ09ORklHX1dQUzIKIAlpZiAoYnNzLT5zc2lkLnNlY3VyaXR5X3BvbGljeSA9PSBTRUNVUklUWV9XUEFfUFNLICYmCi0JICAgICghKHBhaXJ3aXNlICYgV1BBX0NJUEhFUl9DQ01QKSB8fCAhKGJzcy0+d3BhICYgMikpKQorCSAgICAoIShic3MtPnJzbl9wYWlyd2lzZSAmIFdQQV9DSVBIRVJfQ0NNUCkgfHwgIShic3MtPndwYSAmIDIpKSkKIAkJZ290byBub193cHM7IC8qIFdQUzIgZG9lcyBub3QgYWxsb3cgV1BBL1RLSVAtb25seQogCQkJICAgICAgKiBjb25maWd1cmF0aW9uICovCiAjZW5kaWYgLyogQ09ORklHX1dQUzIgKi8KQEAgLTQ2MiwyMCArNDUzLDE1IEBACiAJCXdwYV9zLT5rZXlfbWdtdCA9IFdQQV9LRVlfTUdNVF9OT05FOwogCXBhcmFtcy5rZXlfbWdtdF9zdWl0ZSA9IGtleV9tZ210MmRyaXZlcih3cGFfcy0+a2V5X21nbXQpOwogCi0JaWYgKHNzaWQtPnBhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfQ0NNUCkKLQkJd3BhX3MtPnBhaXJ3aXNlX2NpcGhlciA9IFdQQV9DSVBIRVJfQ0NNUDsKLQllbHNlIGlmIChzc2lkLT5wYWlyd2lzZV9jaXBoZXIgJiBXUEFfQ0lQSEVSX0dDTVApCi0JCXdwYV9zLT5wYWlyd2lzZV9jaXBoZXIgPSBXUEFfQ0lQSEVSX0dDTVA7Ci0JZWxzZSBpZiAoc3NpZC0+cGFpcndpc2VfY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQKQotCQl3cGFfcy0+cGFpcndpc2VfY2lwaGVyID0gV1BBX0NJUEhFUl9US0lQOwotCWVsc2UgaWYgKHNzaWQtPnBhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfTk9ORSkKLQkJd3BhX3MtPnBhaXJ3aXNlX2NpcGhlciA9IFdQQV9DSVBIRVJfTk9ORTsKLQllbHNlIHsKKwl3cGFfcy0+cGFpcndpc2VfY2lwaGVyID0gd3BhX3BpY2tfcGFpcndpc2VfY2lwaGVyKHNzaWQtPnBhaXJ3aXNlX2NpcGhlciwKKwkJCQkJCQkgIDEpOworCWlmICh3cGFfcy0+cGFpcndpc2VfY2lwaGVyIDwgMCkgewogCQl3cGFfcHJpbnRmKE1TR19XQVJOSU5HLCAiV1BBOiBGYWlsZWQgdG8gc2VsZWN0IHBhaXJ3aXNlICIKIAkJCSAgICJjaXBoZXIuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JcGFyYW1zLnBhaXJ3aXNlX3N1aXRlID0gY2lwaGVyX3N1aXRlMmRyaXZlcih3cGFfcy0+cGFpcndpc2VfY2lwaGVyKTsKKwlwYXJhbXMucGFpcndpc2Vfc3VpdGUgPQorCQl3cGFfY2lwaGVyX3RvX3N1aXRlX2RyaXZlcih3cGFfcy0+cGFpcndpc2VfY2lwaGVyKTsKIAlwYXJhbXMuZ3JvdXBfc3VpdGUgPSBwYXJhbXMucGFpcndpc2Vfc3VpdGU7CiAKICNpZmRlZiBDT05GSUdfUDJQCkBAIC01OTksNyArNTg1LDYgQEAKIAogCXdwYV9zLT5jdXJyZW50X3NzaWQgPSBOVUxMOwogCXdwYV9zLT5hc3NvY19mcmVxID0gMDsKLQl3cGFfcy0+cmVhc3NvY2lhdGVkX2Nvbm5lY3Rpb24gPSAwOwogI2lmZGVmIENPTkZJR19QMlAKIAlpZiAod3BhX3MtPmFwX2lmYWNlLT5ic3MpCiAJCXdwYV9zLT5hcF9pZmFjZS0+YnNzWzBdLT5wMnBfZ3JvdXAgPSBOVUxMOwpAQCAtNzI0LDcgKzcwOSw4IEBACiAKIAogaW50IHdwYV9zdXBwbGljYW50X2FwX3dwc19waW4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmJzc2lkLAotCQkJICAgICAgY29uc3QgY2hhciAqcGluLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCisJCQkgICAgICBjb25zdCBjaGFyICpwaW4sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwKKwkJCSAgICAgIGludCB0aW1lb3V0KQogewogCWludCByZXQsIHJldF9sZW4gPSAwOwogCkBAIC03MzksNyArNzI1LDcgQEAKIAkJcmV0X2xlbiA9IG9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMiLCBwaW4pOwogCiAJcmV0ID0gaG9zdGFwZF93cHNfYWRkX3Bpbih3cGFfcy0+YXBfaWZhY2UtPmJzc1swXSwgYnNzaWQsICJhbnkiLCBwaW4sCi0JCQkJICAwKTsKKwkJCQkgIHRpbWVvdXQpOwogCWlmIChyZXQpCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gcmV0X2xlbjsKQEAgLTg2Miw2ICs4NDgsMzQgQEAKIAloYXBkLT5jb25mLT5hcF9waW4gPSBOVUxMOwogfQogCisKKyNpZmRlZiBDT05GSUdfV1BTX05GQworCitzdHJ1Y3Qgd3BhYnVmICogd3Bhc19hcF93cHNfbmZjX2NvbmZpZ190b2tlbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCQkgICAgIGludCBuZGVmKQoreworCXN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQ7CisKKwlpZiAod3BhX3MtPmFwX2lmYWNlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWhhcGQgPSB3cGFfcy0+YXBfaWZhY2UtPmJzc1swXTsKKwlyZXR1cm4gaG9zdGFwZF93cHNfbmZjX2NvbmZpZ190b2tlbihoYXBkLCBuZGVmKTsKK30KKworCitzdHJ1Y3Qgd3BhYnVmICogd3Bhc19hcF93cHNfbmZjX2hhbmRvdmVyX3NlbChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCQkgICAgIGludCBuZGVmKQoreworCXN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQ7CisKKwlpZiAod3BhX3MtPmFwX2lmYWNlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWhhcGQgPSB3cGFfcy0+YXBfaWZhY2UtPmJzc1swXTsKKwlyZXR1cm4gaG9zdGFwZF93cHNfbmZjX2hzX2NyKGhhcGQsIG5kZWYpOworfQorCisjZW5kaWYgLyogQ09ORklHX1dQU19ORkMgKi8KKwogI2VuZGlmIC8qIENPTkZJR19XUFMgKi8KIAogCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9hcC5oIGIvd3BhX3N1cHBsaWNhbnQvYXAuaAppbmRleCBiYzk1M2Q5Li5mZDRjMjVhIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9hcC5oCisrKyBiL3dwYV9zdXBwbGljYW50L2FwLmgKQEAgLTE4LDcgKzE4LDggQEAKIGludCB3cGFfc3VwcGxpY2FudF9hcF93cHNfcGJjKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNvbnN0IHU4ICpic3NpZCwKIAkJCSAgICAgIGNvbnN0IHU4ICpwMnBfZGV2X2FkZHIpOwogaW50IHdwYV9zdXBwbGljYW50X2FwX3dwc19waW4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmJzc2lkLAotCQkJICAgICAgY29uc3QgY2hhciAqcGluLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pOworCQkJICAgICAgY29uc3QgY2hhciAqcGluLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4sCisJCQkgICAgICBpbnQgdGltZW91dCk7CiBpbnQgd3BhX3N1cHBsaWNhbnRfYXBfd3BzX2NhbmNlbChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIHZvaWQgd3Bhc193cHNfYXBfcGluX2Rpc2FibGUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CiBjb25zdCBjaGFyICogd3Bhc193cHNfYXBfcGluX3JhbmRvbShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBpbnQgdGltZW91dCk7CkBAIC01MSw1ICs1Miw5IEBACiB2b2lkIHdwYV9zdXBwbGljYW50X2FwX3B3ZF9hdXRoX2ZhaWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CiB2b2lkIHdwYXNfYXBfY2hfc3dpdGNoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGludCBmcmVxLCBpbnQgaHQsCiAJCSAgICAgICBpbnQgb2Zmc2V0KTsKK3N0cnVjdCB3cGFidWYgKiB3cGFzX2FwX3dwc19uZmNfY29uZmlnX3Rva2VuKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJCSAgICAgaW50IG5kZWYpOworc3RydWN0IHdwYWJ1ZiAqIHdwYXNfYXBfd3BzX25mY19oYW5kb3Zlcl9zZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJICAgICBpbnQgbmRlZik7CiAKICNlbmRpZiAvKiBBUF9IICovCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9hdXRvc2Nhbi5jIGIvd3BhX3N1cHBsaWNhbnQvYXV0b3NjYW4uYwppbmRleCBkMGMwNDBhLi5hMmNmN2E1IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9hdXRvc2Nhbi5jCisrKyBiL3dwYV9zdXBwbGljYW50L2F1dG9zY2FuLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogc3RhdGljIHZvaWQgcmVxdWVzdF9zY2FuKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7Ci0Jd3BhX3MtPnNjYW5fcmVxID0gMjsKKwl3cGFfcy0+c2Nhbl9yZXEgPSBNQU5VQUxfU0NBTl9SRVE7CiAKIAlpZiAod3BhX3N1cHBsaWNhbnRfcmVxX3NjaGVkX3NjYW4od3BhX3MpKQogCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgd3BhX3MtPnNjYW5faW50ZXJ2YWwsIDApOwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvYmdzY2FuX2xlYXJuLmMgYi93cGFfc3VwcGxpY2FudC9iZ3NjYW5fbGVhcm4uYwppbmRleCBhZGY4MmQ4Li4wN2QzMWU0IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9iZ3NjYW5fbGVhcm4uYworKysgYi93cGFfc3VwcGxpY2FudC9iZ3NjYW5fbGVhcm4uYwpAQCAtMjQyLDggKzI0MiwxMSBAQAogCiAJaWR4ID0gZGF0YS0+cHJvYmVfaWR4ICsgMTsKIAl3aGlsZSAoaWR4ICE9IGRhdGEtPnByb2JlX2lkeCkgewotCQlpZiAoZGF0YS0+c3VwcF9mcmVxc1tpZHhdID09IDApCisJCWlmIChkYXRhLT5zdXBwX2ZyZXFzW2lkeF0gPT0gMCkgeworCQkJaWYgKGRhdGEtPnByb2JlX2lkeCA9PSAwKQorCQkJCWJyZWFrOwogCQkJaWR4ID0gMDsKKwkJfQogCQlpZiAoIWluX2FycmF5KGZyZXFzLCBkYXRhLT5zdXBwX2ZyZXFzW2lkeF0pKSB7CiAJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgImJnc2NhbiBsZWFybjogUHJvYmUgbmV3IGZyZXEgIgogCQkJCSAgICIldSIsIGRhdGEtPnN1cHBfZnJlcXNbaWR4XSk7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9ibGFja2xpc3QuYyBiL3dwYV9zdXBwbGljYW50L2JsYWNrbGlzdC5jCmluZGV4IDJlMDFlN2YuLmU1M2RjMzggMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2JsYWNrbGlzdC5jCisrKyBiL3dwYV9zdXBwbGljYW50L2JsYWNrbGlzdC5jCkBAIC0xMjMsMTQgKzEyMywxOSBAQAogdm9pZCB3cGFfYmxhY2tsaXN0X2NsZWFyKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CiAJc3RydWN0IHdwYV9ibGFja2xpc3QgKmUsICpwcmV2OworCWludCBtYXhfY291bnQgPSAwOwogCiAJZSA9IHdwYV9zLT5ibGFja2xpc3Q7CiAJd3BhX3MtPmJsYWNrbGlzdCA9IE5VTEw7CiAJd2hpbGUgKGUpIHsKKwkJaWYgKGUtPmNvdW50ID4gbWF4X2NvdW50KQorCQkJbWF4X2NvdW50ID0gZS0+Y291bnQ7CiAJCXByZXYgPSBlOwogCQllID0gZS0+bmV4dDsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSZW1vdmVkIEJTU0lEICIgTUFDU1RSICIgZnJvbSAiCiAJCQkgICAiYmxhY2tsaXN0IChjbGVhcikiLCBNQUMyU1RSKHByZXYtPmJzc2lkKSk7CiAJCW9zX2ZyZWUocHJldik7CiAJfQorCisJd3BhX3MtPmV4dHJhX2JsYWNrbGlzdF9jb3VudCArPSBtYXhfY291bnQ7CiB9CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9ic3MuYyBiL3dwYV9zdXBwbGljYW50L2Jzcy5jCmluZGV4IDYyMjNiZWIuLmM1MGRlNTMgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2Jzcy5jCisrKyBiL3dwYV9zdXBwbGljYW50L2Jzcy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIEJTUyB0YWJsZQotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtNTEsNiArNTEsMTQgQEAKIH0KIAogCisvKioKKyAqIHdwYV9ic3NfYW5xcF9hbGxvYyAtIEFsbG9jYXRlIEFOUVAgZGF0YSBzdHJ1Y3R1cmUgZm9yIGEgQlNTIGVudHJ5CisgKiBSZXR1cm5zOiBBbGxvY2F0ZWQgQU5RUCBkYXRhIHN0cnVjdHVyZSBvciAlTlVMTCBvbiBmYWlsdXJlCisgKgorICogVGhlIGFsbG9jYXRlZCBBTlFQIGRhdGEgc3RydWN0dXJlIGhhcyBpdHMgdXNlcnMgY291bnQgc2V0IHRvIDEuIEl0IG1heSBiZQorICogc2hhcmVkIGJ5IG11bHRpcGxlIEJTUyBlbnRyaWVzIGFuZCBlYWNoIHNoYXJlZCBlbnRyeSBpcyBmcmVlZCB3aXRoCisgKiB3cGFfYnNzX2FucXBfZnJlZSgpLgorICovCiBzdHJ1Y3Qgd3BhX2Jzc19hbnFwICogd3BhX2Jzc19hbnFwX2FsbG9jKHZvaWQpCiB7CiAJc3RydWN0IHdwYV9ic3NfYW5xcCAqYW5xcDsKQEAgLTYyLDYgKzcwLDc3IEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX2FucXBfY2xvbmUgLSBDbG9uZSBhbiBBTlFQIGRhdGEgc3RydWN0dXJlCisgKiBAYW5xcDogQU5RUCBkYXRhIHN0cnVjdHVyZSBmcm9tIHdwYV9ic3NfYW5xcF9hbGxvYygpCisgKiBSZXR1cm5zOiBDbG9uZWQgQU5RUCBkYXRhIHN0cnVjdHVyZSBvciAlTlVMTCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgd3BhX2Jzc19hbnFwICogd3BhX2Jzc19hbnFwX2Nsb25lKHN0cnVjdCB3cGFfYnNzX2FucXAgKmFucXApCit7CisJc3RydWN0IHdwYV9ic3NfYW5xcCAqbjsKKworCW4gPSBvc196YWxsb2Moc2l6ZW9mKCpuKSk7CisJaWYgKG4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKyNkZWZpbmUgQU5RUF9EVVAoZikgaWYgKGFucXAtPmYpIG4tPmYgPSB3cGFidWZfZHVwKGFucXAtPmYpCisjaWZkZWYgQ09ORklHX0lOVEVSV09SS0lORworCUFOUVBfRFVQKHZlbnVlX25hbWUpOworCUFOUVBfRFVQKG5ldHdvcmtfYXV0aF90eXBlKTsKKwlBTlFQX0RVUChyb2FtaW5nX2NvbnNvcnRpdW0pOworCUFOUVBfRFVQKGlwX2FkZHJfdHlwZV9hdmFpbGFiaWxpdHkpOworCUFOUVBfRFVQKG5haV9yZWFsbSk7CisJQU5RUF9EVVAoYW5xcF8zZ3BwKTsKKwlBTlFQX0RVUChkb21haW5fbmFtZSk7CisjZW5kaWYgLyogQ09ORklHX0lOVEVSV09SS0lORyAqLworI2lmZGVmIENPTkZJR19IUzIwCisJQU5RUF9EVVAoaHMyMF9vcGVyYXRvcl9mcmllbmRseV9uYW1lKTsKKwlBTlFQX0RVUChoczIwX3dhbl9tZXRyaWNzKTsKKwlBTlFQX0RVUChoczIwX2Nvbm5lY3Rpb25fY2FwYWJpbGl0eSk7CisJQU5RUF9EVVAoaHMyMF9vcGVyYXRpbmdfY2xhc3MpOworI2VuZGlmIC8qIENPTkZJR19IUzIwICovCisjdW5kZWYgQU5RUF9EVVAKKworCXJldHVybiBuOworfQorCisKKy8qKgorICogd3BhX2Jzc19hbnFwX3Vuc2hhcmVfYWxsb2MgLSBVbnNoYXJlIEFOUVAgZGF0YSAoaWYgc2hhcmVkKSBpbiBhIEJTUyBlbnRyeQorICogQGJzczogQlNTIGVudHJ5CisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgdGhlIHNwZWNpZmljIEJTUyBlbnRyeSBoYXMgYW4gQU5RUCBkYXRhIHN0cnVjdHVyZSB0aGF0CisgKiBpcyBub3Qgc2hhcmVkIHdpdGggYW55IG90aGVyIEJTUyBlbnRyeS4KKyAqLworaW50IHdwYV9ic3NfYW5xcF91bnNoYXJlX2FsbG9jKHN0cnVjdCB3cGFfYnNzICpic3MpCit7CisJc3RydWN0IHdwYV9ic3NfYW5xcCAqYW5xcDsKKworCWlmIChic3MtPmFucXAgJiYgYnNzLT5hbnFwLT51c2VycyA+IDEpIHsKKwkJLyogYWxsb2NhdGVkLCBidXQgc2hhcmVkIC0gY2xvbmUgYW4gdW5zaGFyZWQgY29weSAqLworCQlhbnFwID0gd3BhX2Jzc19hbnFwX2Nsb25lKGJzcy0+YW5xcCk7CisJCWlmIChhbnFwID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCWFucXAtPnVzZXJzID0gMTsKKwkJYnNzLT5hbnFwLT51c2Vycy0tOworCQlic3MtPmFucXAgPSBhbnFwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYnNzLT5hbnFwKQorCQlyZXR1cm4gMDsgLyogYWxyZWFkeSBhbGxvY2F0ZWQgYW5kIG5vdCBzaGFyZWQgKi8KKworCS8qIG5vdCBhbGxvY2F0ZWQgLSBhbGxvY2F0ZSBhIG5ldyBzdG9yYWdlIGFyZWEgKi8KKwlic3MtPmFucXAgPSB3cGFfYnNzX2FucXBfYWxsb2MoKTsKKwlyZXR1cm4gYnNzLT5hbnFwID8gMCA6IC0xOworfQorCisKKy8qKgorICogd3BhX2Jzc19hbnFwX2ZyZWUgLSBGcmVlIGFuIEFOUVAgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBhbnFwOiBBTlFQIGRhdGEgc3RydWN0dXJlIGZyb20gd3BhX2Jzc19hbnFwX2FsbG9jKCkgb3Igd3BhX2Jzc19hbnFwX2Nsb25lKCkKKyAqLwogc3RhdGljIHZvaWQgd3BhX2Jzc19hbnFwX2ZyZWUoc3RydWN0IHdwYV9ic3NfYW5xcCAqYW5xcCkKIHsKIAlpZiAoYW5xcCA9PSBOVUxMKQpAQCAtMTIxLDYgKzIwMCwxNCBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc19nZXQgLSBGZXRjaCBhIEJTUyB0YWJsZSBlbnRyeSBiYXNlZCBvbiBCU1NJRCBhbmQgU1NJRAorICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBic3NpZDogQlNTSUQKKyAqIEBzc2lkOiBTU0lECisgKiBAc3NpZF9sZW46IExlbmd0aCBvZiBAc3NpZAorICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgQlNTIGVudHJ5IG9yICVOVUxMIGlmIG5vdCBmb3VuZAorICovCiBzdHJ1Y3Qgd3BhX2JzcyAqIHdwYV9ic3NfZ2V0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNvbnN0IHU4ICpic3NpZCwKIAkJCSAgICAgY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbikKIHsKQEAgLTEzNyw3ICsyMjQsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHdwYV9ic3NfY29weV9yZXMoc3RydWN0IHdwYV9ic3MgKmRzdCwgc3RydWN0IHdwYV9zY2FuX3JlcyAqc3JjKQorc3RhdGljIHZvaWQgd3BhX2Jzc19jb3B5X3JlcyhzdHJ1Y3Qgd3BhX2JzcyAqZHN0LCBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpzcmMsCisJCQkgICAgIHN0cnVjdCBvc190aW1lICpmZXRjaF90aW1lKQogewogCW9zX3RpbWVfdCB1c2VjOwogCkBAIC0xNTEsNyArMjM5LDggQEAKIAlkc3QtPmxldmVsID0gc3JjLT5sZXZlbDsKIAlkc3QtPnRzZiA9IHNyYy0+dHNmOwogCi0Jb3NfZ2V0X3RpbWUoJmRzdC0+bGFzdF91cGRhdGUpOworCWRzdC0+bGFzdF91cGRhdGUuc2VjID0gZmV0Y2hfdGltZS0+c2VjOworCWRzdC0+bGFzdF91cGRhdGUudXNlYyA9IGZldGNoX3RpbWUtPnVzZWM7CiAJZHN0LT5sYXN0X3VwZGF0ZS5zZWMgLT0gc3JjLT5hZ2UgLyAxMDAwOwogCXVzZWMgPSAoc3JjLT5hZ2UgJSAxMDAwKSAqIDEwMDA7CiAJaWYgKGRzdC0+bGFzdF91cGRhdGUudXNlYyA8IHVzZWMpIHsKQEAgLTIyOCw3ICszMTcsOCBAQAogCiBzdGF0aWMgc3RydWN0IHdwYV9ic3MgKiB3cGFfYnNzX2FkZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCSAgICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAotCQkJCSAgICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpyZXMpCisJCQkJICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcywKKwkJCQkgICAgc3RydWN0IG9zX3RpbWUgKmZldGNoX3RpbWUpCiB7CiAJc3RydWN0IHdwYV9ic3MgKmJzczsKIApAQCAtMjM3LDcgKzMyNyw3IEBACiAJCXJldHVybiBOVUxMOwogCWJzcy0+aWQgPSB3cGFfcy0+YnNzX25leHRfaWQrKzsKIAlic3MtPmxhc3RfdXBkYXRlX2lkeCA9IHdwYV9zLT5ic3NfdXBkYXRlX2lkeDsKLQl3cGFfYnNzX2NvcHlfcmVzKGJzcywgcmVzKTsKKwl3cGFfYnNzX2NvcHlfcmVzKGJzcywgcmVzLCBmZXRjaF90aW1lKTsKIAlvc19tZW1jcHkoYnNzLT5zc2lkLCBzc2lkLCBzc2lkX2xlbik7CiAJYnNzLT5zc2lkX2xlbiA9IHNzaWRfbGVuOwogCWJzcy0+aWVfbGVuID0gcmVzLT5pZV9sZW47CkBAIC0zOTMsMTQgKzQ4MywxNCBAQAogCiBzdGF0aWMgc3RydWN0IHdwYV9ic3MgKgogd3BhX2Jzc191cGRhdGUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgc3RydWN0IHdwYV9ic3MgKmJzcywKLQkgICAgICAgc3RydWN0IHdwYV9zY2FuX3JlcyAqcmVzKQorCSAgICAgICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpyZXMsIHN0cnVjdCBvc190aW1lICpmZXRjaF90aW1lKQogewogCXUzMiBjaGFuZ2VzOwogCiAJY2hhbmdlcyA9IHdwYV9ic3NfY29tcGFyZV9yZXMoYnNzLCByZXMpOwogCWJzcy0+c2Nhbl9taXNzX2NvdW50ID0gMDsKIAlic3MtPmxhc3RfdXBkYXRlX2lkeCA9IHdwYV9zLT5ic3NfdXBkYXRlX2lkeDsKLQl3cGFfYnNzX2NvcHlfcmVzKGJzcywgcmVzKTsKKwl3cGFfYnNzX2NvcHlfcmVzKGJzcywgcmVzLCBmZXRjaF90aW1lKTsKIAkvKiBNb3ZlIHRoZSBlbnRyeSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCiAJZGxfbGlzdF9kZWwoJmJzcy0+bGlzdCk7CiAJaWYgKGJzcy0+aWVfbGVuICsgYnNzLT5iZWFjb25faWVfbGVuID49CkBAIC00NDIsNiArNTMyLDE1IEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX3VwZGF0ZV9zdGFydCAtIFN0YXJ0IGEgQlNTIHRhYmxlIHVwZGF0ZSBmcm9tIHNjYW4gcmVzdWx0cworICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBCU1MgdGFibGUgdXBkYXRlIHJvdW5kIGZvciBuZXcKKyAqIHNjYW4gcmVzdWx0cy4gVGhlIGFjdHVhbCBzY2FuIHJlc3VsdCBlbnRyaWVzIGFyZSBpbmRpY2F0ZWQgd2l0aCBjYWxscyB0bworICogd3BhX2Jzc191cGRhdGVfc2Nhbl9yZXMoKSBhbmQgdGhlIHVwZGF0ZSByb3VuZCBpcyBmaW5pc2hlZCB3aXRoIGEgY2FsbCB0bworICogd3BhX2Jzc191cGRhdGVfZW5kKCkuCisgKi8KIHZvaWQgd3BhX2Jzc191cGRhdGVfc3RhcnQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAl3cGFfcy0+YnNzX3VwZGF0ZV9pZHgrKzsKQEAgLTQ1MSw4ICs1NTAsMTkgQEAKIH0KIAogCisvKioKKyAqIHdwYV9ic3NfdXBkYXRlX3NjYW5fcmVzIC0gVXBkYXRlIGEgQlNTIHRhYmxlIGVudHJ5IGJhc2VkIG9uIGEgc2NhbiByZXN1bHQKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBAcmVzOiBTY2FuIHJlc3VsdAorICogQGZldGNoX3RpbWU6IFRpbWUgd2hlbiB0aGUgcmVzdWx0IHdhcyBmZXRjaGVkIGZyb20gdGhlIGRyaXZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBhIEJTUyB0YWJsZSBlbnRyeSAob3IgYWRkcyBvbmUpIGJhc2VkIG9uIGEgc2NhbiByZXN1bHQuCisgKiBUaGlzIGlzIGNhbGxlZCBzZXBhcmF0ZWx5IGZvciBlYWNoIHNjYW4gcmVzdWx0IGJldHdlZW4gdGhlIGNhbGxzIHRvCisgKiB3cGFfYnNzX3VwZGF0ZV9zdGFydCgpIGFuZCB3cGFfYnNzX3VwZGF0ZV9lbmQoKS4KKyAqLwogdm9pZCB3cGFfYnNzX3VwZGF0ZV9zY2FuX3JlcyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAotCQkJICAgICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpyZXMpCisJCQkgICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcywKKwkJCSAgICAgc3RydWN0IG9zX3RpbWUgKmZldGNoX3RpbWUpCiB7CiAJY29uc3QgdTggKnNzaWQsICpwMnA7CiAJc3RydWN0IHdwYV9ic3MgKmJzczsKQEAgLTQ5MCw5ICs2MDAsOSBAQAogCSAqICh0byBzYXZlIG1lbW9yeSkgKi8KIAlic3MgPSB3cGFfYnNzX2dldCh3cGFfcywgcmVzLT5ic3NpZCwgc3NpZCArIDIsIHNzaWRbMV0pOwogCWlmIChic3MgPT0gTlVMTCkKLQkJYnNzID0gd3BhX2Jzc19hZGQod3BhX3MsIHNzaWQgKyAyLCBzc2lkWzFdLCByZXMpOworCQlic3MgPSB3cGFfYnNzX2FkZCh3cGFfcywgc3NpZCArIDIsIHNzaWRbMV0sIHJlcywgZmV0Y2hfdGltZSk7CiAJZWxzZQotCQlic3MgPSB3cGFfYnNzX3VwZGF0ZSh3cGFfcywgYnNzLCByZXMpOworCQlic3MgPSB3cGFfYnNzX3VwZGF0ZSh3cGFfcywgYnNzLCByZXMsIGZldGNoX3RpbWUpOwogCiAJaWYgKGJzcyA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC01NTYsNiArNjY2LDE2IEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX3VwZGF0ZV9lbmQgLSBFbmQgYSBCU1MgdGFibGUgdXBkYXRlIGZyb20gc2NhbiByZXN1bHRzCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQGluZm86IEluZm9ybWF0aW9uIGFib3V0IHNjYW4gcGFyYW1ldGVycworICogQG5ld19zY2FuOiBXaGV0aGVyIHRoaXMgdXBkYXRlIHJvdW5kIHdhcyBiYXNlZCBvbiBhIG5ldyBzY2FuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBlYWNoIEJTUyB0YWJsZSB1cGRhdGUgcm91bmQgZm9yIG5ldworICogc2NhbiByZXN1bHRzLiBUaGUgc3RhcnQgb2YgdGhlIHVwZGF0ZSB3YXMgaW5kaWNhdGVkIHdpdGggYSBjYWxsIHRvCisgKiB3cGFfYnNzX3VwZGF0ZV9zdGFydCgpLgorICovCiB2b2lkIHdwYV9ic3NfdXBkYXRlX2VuZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBzdHJ1Y3Qgc2Nhbl9pbmZvICppbmZvLAogCQkJaW50IG5ld19zY2FuKQogewpAQCAtNjAxLDYgKzcyMSwxMyBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc19mbHVzaF9ieV9hZ2UgLSBGbHVzaCBvbGQgQlNTIGVudHJpZXMKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBAYWdlOiBNYXhpbXVtIGVudHJ5IGFnZSBpbiBzZWNvbmRzCisgKgorICogUmVtb3ZlIEJTUyBlbnRyaWVzIHRoYXQgaGF2ZSBub3QgYmVlbiB1cGRhdGVkIGR1cmluZyB0aGUgbGFzdCBAYWdlIHNlY29uZHMuCisgKi8KIHZvaWQgd3BhX2Jzc19mbHVzaF9ieV9hZ2Uoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgaW50IGFnZSkKIHsKIAlzdHJ1Y3Qgd3BhX2JzcyAqYnNzLCAqbjsKQEAgLTYzNCw2ICs3NjEsMTQgQEAKIH0KIAogCisvKioKKyAqIHdwYV9ic3NfaW5pdCAtIEluaXRpYWxpemUgQlNTIHRhYmxlCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKgorICogVGhpcyBwcmVwYXJlcyBCU1MgdGFibGUgbGlzdHMgYW5kIHRpbWVyIGZvciBwZXJpb2RpYyB1cGRhdGVzLiBUaGUgQlNTIHRhYmxlCisgKiBpcyBkZWluaXRpYWxpemVkIHdpdGggd3BhX2Jzc19kZWluaXQoKSBvbmNlIG5vdCBuZWVkZWQgYW55bW9yZS4KKyAqLwogaW50IHdwYV9ic3NfaW5pdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQogewogCWRsX2xpc3RfaW5pdCgmd3BhX3MtPmJzcyk7CkBAIC02NDQsNiArNzc5LDEwIEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX2ZsdXNoIC0gRmx1c2ggYWxsIHVudXNlZCBCU1MgZW50cmllcworICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqLwogdm9pZCB3cGFfYnNzX2ZsdXNoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CiAJc3RydWN0IHdwYV9ic3MgKmJzcywgKm47CkBAIC02NTksNiArNzk4LDEwIEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX2RlaW5pdCAtIERlaW5pdGlhbGl6ZSBCU1MgdGFibGUKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKi8KIHZvaWQgd3BhX2Jzc19kZWluaXQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAllbG9vcF9jYW5jZWxfdGltZW91dCh3cGFfYnNzX3RpbWVvdXQsIHdwYV9zLCBOVUxMKTsKQEAgLTY2Niw2ICs4MDksMTIgQEAKIH0KIAogCisvKioKKyAqIHdwYV9ic3NfZ2V0X2Jzc2lkIC0gRmV0Y2ggYSBCU1MgdGFibGUgZW50cnkgYmFzZWQgb24gQlNTSUQKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBAYnNzaWQ6IEJTU0lECisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIHRoZSBCU1MgZW50cnkgb3IgJU5VTEwgaWYgbm90IGZvdW5kCisgKi8KIHN0cnVjdCB3cGFfYnNzICogd3BhX2Jzc19nZXRfYnNzaWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkgICBjb25zdCB1OCAqYnNzaWQpCiB7CkBAIC02ODEsNiArODMwLDEyIEBACiAKIAogI2lmZGVmIENPTkZJR19QMlAKKy8qKgorICogd3BhX2Jzc19nZXRfcDJwX2Rldl9hZGRyIC0gRmV0Y2ggYSBCU1MgdGFibGUgZW50cnkgYmFzZWQgb24gUDJQIERldmljZSBBZGRyCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQGRldl9hZGRyOiBQMlAgRGV2aWNlIEFkZHJlc3Mgb2YgdGhlIEdPCisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIHRoZSBCU1MgZW50cnkgb3IgJU5VTEwgaWYgbm90IGZvdW5kCisgKi8KIHN0cnVjdCB3cGFfYnNzICogd3BhX2Jzc19nZXRfcDJwX2Rldl9hZGRyKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJCSAgY29uc3QgdTggKmRldl9hZGRyKQogewpAQCAtNjk3LDYgKzg1MiwxMiBAQAogI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KIAogCisvKioKKyAqIHdwYV9ic3NfZ2V0X2lkIC0gRmV0Y2ggYSBCU1MgdGFibGUgZW50cnkgYmFzZWQgb24gaWRlbnRpZmllcgorICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBpZDogVW5pcXVlIGlkZW50aWZpZXIgKHN0cnVjdCB3cGFfYnNzOjppZCkgYXNzaWduZWQgZm9yIHRoZSBlbnRyeQorICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgQlNTIGVudHJ5IG9yICVOVUxMIGlmIG5vdCBmb3VuZAorICovCiBzdHJ1Y3Qgd3BhX2JzcyAqIHdwYV9ic3NfZ2V0X2lkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHVuc2lnbmVkIGludCBpZCkKIHsKIAlzdHJ1Y3Qgd3BhX2JzcyAqYnNzOwpAQCAtNzA4LDYgKzg2OSwzOCBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc19nZXRfaWRfcmFuZ2UgLSBGZXRjaCBhIEJTUyB0YWJsZSBlbnRyeSBiYXNlZCBvbiBpZGVudGlmaWVyIHJhbmdlCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQGlkZjogU21hbGxlc3QgYWxsb3dlZCBpZGVudGlmaWVyIGFzc2lnbmVkIGZvciB0aGUgZW50cnkKKyAqIEBpZGY6IExhcmdlc3QgYWxsb3dlZCBpZGVudGlmaWVyIGFzc2lnbmVkIGZvciB0aGUgZW50cnkKKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gdGhlIEJTUyBlbnRyeSBvciAlTlVMTCBpZiBub3QgZm91bmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gd3BhX2Jzc19nZXRfaWQoKSBidXQgYWxsb3dzIGEgQlNTIGVudHJ5IHdpdGggdGhlCisgKiBzbWFsbGVzdCBpZCB2YWx1ZSB0byBiZSBmZXRjaGVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlIHdpdGhvdXQgdGhlCisgKiBjYWxsZXIgaGF2aW5nIHRvIGtub3cgdGhlIGV4YWN0IGlkLgorICovCitzdHJ1Y3Qgd3BhX2JzcyAqIHdwYV9ic3NfZ2V0X2lkX3JhbmdlKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGlkZiwgdW5zaWduZWQgaW50IGlkbCkKK3sKKwlzdHJ1Y3Qgd3BhX2JzcyAqYnNzOworCWRsX2xpc3RfZm9yX2VhY2goYnNzLCAmd3BhX3MtPmJzc19pZCwgc3RydWN0IHdwYV9ic3MsIGxpc3RfaWQpIHsKKwkJaWYgKGJzcy0+aWQgPj0gaWRmICYmIGJzcy0+aWQgPD0gaWRsKQorCQkJcmV0dXJuIGJzczsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoqCisgKiB3cGFfYnNzX2dldF9pZSAtIEZldGNoIGEgc3BlY2lmaWVkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSBhIEJTUyBlbnRyeQorICogQGJzczogQlNTIHRhYmxlIGVudHJ5CisgKiBAaWU6IEluZm9ybWF0aW9uIGVsZW1lbnQgaWRlbnRpdGlmaWVyIChXTEFOX0VJRF8qKQorICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCAoaWQgZmllbGQpIG9yICVOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgaW5mb3JtYXRpb24gZWxlbWVudCBpbiB0aGUgQlNTCisgKiBlbnRyeS4KKyAqLwogY29uc3QgdTggKiB3cGFfYnNzX2dldF9pZShjb25zdCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzLCB1OCBpZSkKIHsKIAljb25zdCB1OCAqZW5kLCAqcG9zOwpAQCAtNzI3LDYgKzkyMCwxNSBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc19nZXRfdmVuZG9yX2llIC0gRmV0Y2ggYSB2ZW5kb3IgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIGEgQlNTIGVudHJ5CisgKiBAYnNzOiBCU1MgdGFibGUgZW50cnkKKyAqIEB2ZW5kb3JfdHlwZTogVmVuZG9yIHR5cGUgKGZvdXIgb2N0ZXRzIHN0YXJ0aW5nIHRoZSBJRSBwYXlsb2FkKQorICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCAoaWQgZmllbGQpIG9yICVOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgaW5mb3JtYXRpb24gZWxlbWVudCBpbiB0aGUgQlNTCisgKiBlbnRyeS4KKyAqLwogY29uc3QgdTggKiB3cGFfYnNzX2dldF92ZW5kb3JfaWUoY29uc3Qgc3RydWN0IHdwYV9ic3MgKmJzcywgdTMyIHZlbmRvcl90eXBlKQogewogCWNvbnN0IHU4ICplbmQsICpwb3M7CkBAIC03NDcsNiArOTQ5LDE2IEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX2dldF92ZW5kb3JfaWVfbXVsdGkgLSBGZXRjaCB2ZW5kb3IgSUUgZGF0YSBmcm9tIGEgQlNTIGVudHJ5CisgKiBAYnNzOiBCU1MgdGFibGUgZW50cnkKKyAqIEB2ZW5kb3JfdHlwZTogVmVuZG9yIHR5cGUgKGZvdXIgb2N0ZXRzIHN0YXJ0aW5nIHRoZSBJRSBwYXlsb2FkKQorICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCBwYXlsb2FkIG9yICVOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBjb25jYXRlbmF0ZWQgcGF5bG9hZCBvZiBwb3NzaWJseSBmcmFnbWVudGVkIHZlbmRvcgorICogc3BlY2lmaWMgaW5mb3JtYXRpb24gZWxlbWVudHMgaW4gdGhlIEJTUyBlbnRyeS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGZyZWVpbmcgdGhlIHJldHVybmVkIGJ1ZmZlci4KKyAqLwogc3RydWN0IHdwYWJ1ZiAqIHdwYV9ic3NfZ2V0X3ZlbmRvcl9pZV9tdWx0aShjb25zdCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzLAogCQkJCQkgICAgdTMyIHZlbmRvcl90eXBlKQogewpAQCAtNzc4LDYgKzk5MCwxOSBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc19nZXRfdmVuZG9yX2llX211bHRpX2JlYWNvbiAtIEZldGNoIHZlbmRvciBJRSBkYXRhIGZyb20gYSBCU1MgZW50cnkKKyAqIEBic3M6IEJTUyB0YWJsZSBlbnRyeQorICogQHZlbmRvcl90eXBlOiBWZW5kb3IgdHlwZSAoZm91ciBvY3RldHMgc3RhcnRpbmcgdGhlIElFIHBheWxvYWQpCisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IHBheWxvYWQgb3IgJU5VTEwgaWYgbm90IGZvdW5kCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGNvbmNhdGVuYXRlZCBwYXlsb2FkIG9mIHBvc3NpYmx5IGZyYWdtZW50ZWQgdmVuZG9yCisgKiBzcGVjaWZpYyBpbmZvcm1hdGlvbiBlbGVtZW50cyBpbiB0aGUgQlNTIGVudHJ5LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogZnJlZWluZyB0aGUgcmV0dXJuZWQgYnVmZmVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSB3cGFfYnNzX2dldF92ZW5kb3JfaWVfbXVsdGkoKSwgYnV0IHVzZXMgSUUgYnVmZmVyIG9ubHkKKyAqIGZyb20gQmVhY29uIGZyYW1lcyBpbnN0ZWFkIG9mIGVpdGhlciBCZWFjb24gb3IgUHJvYmUgUmVzcG9uc2UgZnJhbWVzLgorICovCiBzdHJ1Y3Qgd3BhYnVmICogd3BhX2Jzc19nZXRfdmVuZG9yX2llX211bHRpX2JlYWNvbihjb25zdCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzLAogCQkJCQkJICAgdTMyIHZlbmRvcl90eXBlKQogewpAQCAtODEwLDYgKzEwMzUsMTEgQEAKIH0KIAogCisvKioKKyAqIHdwYV9ic3NfZ2V0X21heF9yYXRlIC0gR2V0IG1heGltdW0gbGVnYWN5IFRYIHJhdGUgc3VwcG9ydGVkIGluIGEgQlNTCisgKiBAYnNzOiBCU1MgdGFibGUgZW50cnkKKyAqIFJldHVybnM6IE1heGltdW0gbGVnYWN5IHJhdGUgaW4gdW5pdHMgb2YgNTAwIGticHMKKyAqLwogaW50IHdwYV9ic3NfZ2V0X21heF9yYXRlKGNvbnN0IHN0cnVjdCB3cGFfYnNzICpic3MpCiB7CiAJaW50IHJhdGUgPSAwOwpAQCAtODMyLDYgKzEwNjIsMTUgQEAKIH0KIAogCisvKioKKyAqIHdwYV9ic3NfZ2V0X2JpdF9yYXRlcyAtIEdldCBsZWdhY3kgVFggcmF0ZXMgc3VwcG9ydGVkIGluIGEgQlNTCisgKiBAYnNzOiBCU1MgdGFibGUgZW50cnkKKyAqIEByYXRlczogQnVmZmVyIGZvciByZXR1cm5pbmcgYSBwb2ludGVyIHRvIHRoZSByYXRlcyBsaXN0ICh1bml0cyBvZiA1MDAga2JwcykKKyAqIFJldHVybnM6IG51bWJlciBvZiBsZWdhY3kgVFggcmF0ZXMgb3IgLTEgb24gZmFpbHVyZQorICoKKyAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIHJldHVybmVkIGJ1ZmZlciB3aXRoIG9zX2ZyZWUoKSBpbgorICogY2FzZSBvZiBzdWNjZXNzLgorICovCiBpbnQgd3BhX2Jzc19nZXRfYml0X3JhdGVzKGNvbnN0IHN0cnVjdCB3cGFfYnNzICpic3MsIHU4ICoqcmF0ZXMpCiB7CiAJY29uc3QgdTggKmllLCAqaWUyOwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvYnNzLmggYi93cGFfc3VwcGxpY2FudC9ic3MuaAppbmRleCA0YTM4NmI2Li45ZjE0ZDBlIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9ic3MuaAorKysgYi93cGFfc3VwcGxpY2FudC9ic3MuaApAQCAtMTksNyArMTksMTEgQEAKICNkZWZpbmUgV1BBX0JTU19BU1NPQ0lBVEVECQlCSVQoNSkKICNkZWZpbmUgV1BBX0JTU19BTlFQX0ZFVENIX1RSSUVECUJJVCg2KQogCisvKioKKyAqIHN0cnVjdCB3cGFfYnNzX2FucXAgLSBBTlFQIGRhdGEgZm9yIGEgQlNTIGVudHJ5IChzdHJ1Y3Qgd3BhX2JzcykKKyAqLwogc3RydWN0IHdwYV9ic3NfYW5xcCB7CisJLyoqIE51bWJlciBvZiBCU1MgZW50cmllcyByZWZlcnJpbmcgdG8gdGhpcyBBTlFQIGRhdGEgaW5zdGFuY2UgKi8KIAl1bnNpZ25lZCBpbnQgdXNlcnM7CiAjaWZkZWYgQ09ORklHX0lOVEVSV09SS0lORwogCXN0cnVjdCB3cGFidWYgKnZlbnVlX25hbWU7CkBAIC00MCw0OSArNDQsNTIgQEAKIAogLyoqCiAgKiBzdHJ1Y3Qgd3BhX2JzcyAtIEJTUyB0YWJsZQotICogQGxpc3Q6IExpc3QgZW50cnkgZm9yIHN0cnVjdCB3cGFfc3VwcGxpY2FudDo6YnNzCi0gKiBAbGlzdF9pZDogTGlzdCBlbnRyeSBmb3Igc3RydWN0IHdwYV9zdXBwbGljYW50Ojpic3NfaWQKLSAqIEBpZDogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgQlNTIGVudHJ5Ci0gKiBAc2Nhbl9taXNzX2NvdW50OiBOdW1iZXIgb2YgY291bnRzIHdpdGhvdXQgc2VlaW5nIHRoaXMgQlNTCi0gKiBAZmxhZ3M6IGluZm9ybWF0aW9uIGZsYWdzIGFib3V0IHRoZSBCU1MvSUJTUyAoV1BBX0JTU18qKQotICogQGxhc3RfdXBkYXRlX2lkeDogSW5kZXggb2YgdGhlIGxhc3Qgc2NhbiB1cGRhdGUKLSAqIEBic3NpZDogQlNTSUQKLSAqIEBoZXNzaWQ6IEhFU1NJRAotICogQGZyZXE6IGZyZXF1ZW5jeSBvZiB0aGUgY2hhbm5lbCBpbiBNSHogKGUuZy4sIDI0MTIgPSBjaGFubmVsIDEpCi0gKiBAYmVhY29uX2ludDogYmVhY29uIGludGVydmFsIGluIFRVcyAoaG9zdCBieXRlIG9yZGVyKQotICogQGNhcHM6IGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gZmllbGQgaW4gaG9zdCBieXRlIG9yZGVyCi0gKiBAcXVhbDogc2lnbmFsIHF1YWxpdHkKLSAqIEBub2lzZTogbm9pc2UgbGV2ZWwKLSAqIEBsZXZlbDogc2lnbmFsIGxldmVsCi0gKiBAdHNmOiBUaW1lc3RhbXAgb2YgbGFzdCBCZWFjb24vUHJvYmUgUmVzcG9uc2UgZnJhbWUKLSAqIEBsYXN0X3VwZGF0ZTogVGltZSBvZiB0aGUgbGFzdCB1cGRhdGUgKGkuZS4sIEJlYWNvbiBvciBQcm9iZSBSZXNwb25zZSBSWCkKLSAqIEBpZV9sZW46IGxlbmd0aCBvZiB0aGUgZm9sbG93aW5nIElFIGZpZWxkIGluIG9jdGV0cyAoZnJvbSBQcm9iZSBSZXNwb25zZSkKLSAqIEBiZWFjb25faWVfbGVuOiBsZW5ndGggb2YgdGhlIGZvbGxvd2luZyBCZWFjb24gSUUgZmllbGQgaW4gb2N0ZXRzCiAgKgogICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBuZWlnaGJvcmluZyBCU1NlcyBpbgogICogZ2VuZXJpYyBmb3JtYXQuIEl0IGlzIG1haW5seSB1cGRhdGVkIGJhc2VkIG9uIHNjYW4gcmVzdWx0cyBmcm9tIHRoZSBkcml2ZXIuCiAgKi8KIHN0cnVjdCB3cGFfYnNzIHsKKwkvKiogTGlzdCBlbnRyeSBmb3Igc3RydWN0IHdwYV9zdXBwbGljYW50Ojpic3MgKi8KIAlzdHJ1Y3QgZGxfbGlzdCBsaXN0OworCS8qKiBMaXN0IGVudHJ5IGZvciBzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQ6OmJzc19pZCAqLwogCXN0cnVjdCBkbF9saXN0IGxpc3RfaWQ7CisJLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIEJTUyBlbnRyeSAqLwogCXVuc2lnbmVkIGludCBpZDsKKwkvKiogTnVtYmVyIG9mIGNvdW50cyB3aXRob3V0IHNlZWluZyB0aGlzIEJTUyAqLwogCXVuc2lnbmVkIGludCBzY2FuX21pc3NfY291bnQ7CisJLyoqIEluZGV4IG9mIHRoZSBsYXN0IHNjYW4gdXBkYXRlICovCiAJdW5zaWduZWQgaW50IGxhc3RfdXBkYXRlX2lkeDsKKwkvKiogSW5mb3JtYXRpb24gZmxhZ3MgYWJvdXQgdGhlIEJTUy9JQlNTIChXUEFfQlNTXyopICovCiAJdW5zaWduZWQgaW50IGZsYWdzOworCS8qKiBCU1NJRCAqLwogCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwkvKiogSEVTU0lEICovCiAJdTggaGVzc2lkW0VUSF9BTEVOXTsKKwkvKiogU1NJRCAqLwogCXU4IHNzaWRbMzJdOworCS8qKiBMZW5ndGggb2YgU1NJRCAqLwogCXNpemVfdCBzc2lkX2xlbjsKKwkvKiogRnJlcXVlbmN5IG9mIHRoZSBjaGFubmVsIGluIE1IeiAoZS5nLiwgMjQxMiA9IGNoYW5uZWwgMSkgKi8KIAlpbnQgZnJlcTsKKwkvKiogQmVhY29uIGludGVydmFsIGluIFRVcyAoaG9zdCBieXRlIG9yZGVyKSAqLwogCXUxNiBiZWFjb25faW50OworCS8qKiBDYXBhYmlsaXR5IGluZm9ybWF0aW9uIGZpZWxkIGluIGhvc3QgYnl0ZSBvcmRlciAqLwogCXUxNiBjYXBzOworCS8qKiBTaWduYWwgcXVhbGl0eSAqLwogCWludCBxdWFsOworCS8qKiBOb2lzZSBsZXZlbCAqLwogCWludCBub2lzZTsKKwkvKiogU2lnbmFsIGxldmVsICovCiAJaW50IGxldmVsOworCS8qKiBUaW1lc3RhbXAgb2YgbGFzdCBCZWFjb24vUHJvYmUgUmVzcG9uc2UgZnJhbWUgKi8KIAl1NjQgdHNmOworCS8qKiBUaW1lIG9mIHRoZSBsYXN0IHVwZGF0ZSAoaS5lLiwgQmVhY29uIG9yIFByb2JlIFJlc3BvbnNlIFJYKSAqLwogCXN0cnVjdCBvc190aW1lIGxhc3RfdXBkYXRlOworCS8qKiBBTlFQIGRhdGEgKi8KIAlzdHJ1Y3Qgd3BhX2Jzc19hbnFwICphbnFwOworCS8qKiBMZW5ndGggb2YgdGhlIGZvbGxvd2luZyBJRSBmaWVsZCBpbiBvY3RldHMgKGZyb20gUHJvYmUgUmVzcG9uc2UpICovCiAJc2l6ZV90IGllX2xlbjsKKwkvKiogTGVuZ3RoIG9mIHRoZSBmb2xsb3dpbmcgQmVhY29uIElFIGZpZWxkIGluIG9jdGV0cyAqLwogCXNpemVfdCBiZWFjb25faWVfbGVuOwogCS8qIGZvbGxvd2VkIGJ5IGllX2xlbiBvY3RldHMgb2YgSUVzICovCiAJLyogZm9sbG93ZWQgYnkgYmVhY29uX2llX2xlbiBvY3RldHMgb2YgSUVzICovCkBAIC05MCw3ICs5Nyw4IEBACiAKIHZvaWQgd3BhX2Jzc191cGRhdGVfc3RhcnQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CiB2b2lkIHdwYV9ic3NfdXBkYXRlX3NjYW5fcmVzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCi0JCQkgICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcyk7CisJCQkgICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcywKKwkJCSAgICAgc3RydWN0IG9zX3RpbWUgKmZldGNoX3RpbWUpOwogdm9pZCB3cGFfYnNzX3VwZGF0ZV9lbmQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgc3RydWN0IHNjYW5faW5mbyAqaW5mbywKIAkJCWludCBuZXdfc2Nhbik7CiBpbnQgd3BhX2Jzc19pbml0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOwpAQCAtMTA0LDYgKzExMiw4IEBACiBzdHJ1Y3Qgd3BhX2JzcyAqIHdwYV9ic3NfZ2V0X3AycF9kZXZfYWRkcihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCQkgIGNvbnN0IHU4ICpkZXZfYWRkcik7CiBzdHJ1Y3Qgd3BhX2JzcyAqIHdwYV9ic3NfZ2V0X2lkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHVuc2lnbmVkIGludCBpZCk7CitzdHJ1Y3Qgd3BhX2JzcyAqIHdwYV9ic3NfZ2V0X2lkX3JhbmdlKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGlkZiwgdW5zaWduZWQgaW50IGlkbCk7CiBjb25zdCB1OCAqIHdwYV9ic3NfZ2V0X2llKGNvbnN0IHN0cnVjdCB3cGFfYnNzICpic3MsIHU4IGllKTsKIGNvbnN0IHU4ICogd3BhX2Jzc19nZXRfdmVuZG9yX2llKGNvbnN0IHN0cnVjdCB3cGFfYnNzICpic3MsIHUzMiB2ZW5kb3JfdHlwZSk7CiBzdHJ1Y3Qgd3BhYnVmICogd3BhX2Jzc19nZXRfdmVuZG9yX2llX211bHRpKGNvbnN0IHN0cnVjdCB3cGFfYnNzICpic3MsCkBAIC0xMTMsNSArMTIzLDYgQEAKIGludCB3cGFfYnNzX2dldF9tYXhfcmF0ZShjb25zdCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzKTsKIGludCB3cGFfYnNzX2dldF9iaXRfcmF0ZXMoY29uc3Qgc3RydWN0IHdwYV9ic3MgKmJzcywgdTggKipyYXRlcyk7CiBzdHJ1Y3Qgd3BhX2Jzc19hbnFwICogd3BhX2Jzc19hbnFwX2FsbG9jKHZvaWQpOworaW50IHdwYV9ic3NfYW5xcF91bnNoYXJlX2FsbG9jKHN0cnVjdCB3cGFfYnNzICpic3MpOwogCiAjZW5kaWYgLyogQlNTX0ggKi8KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2NvbmZpZy5jIGIvd3BhX3N1cHBsaWNhbnQvY29uZmlnLmMKaW5kZXggYmUyMTAyOS4uZWU2MzRhNSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvY29uZmlnLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvY29uZmlnLmMKQEAgLTUwNCw2ICs1MDQsMTIgQEAKIAkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiV1BTIikgPT0gMCkKIAkJCXZhbCB8PSBXUEFfS0VZX01HTVRfV1BTOwogI2VuZGlmIC8qIENPTkZJR19XUFMgKi8KKyNpZmRlZiBDT05GSUdfU0FFCisJCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIlNBRSIpID09IDApCisJCQl2YWwgfD0gV1BBX0tFWV9NR01UX1NBRTsKKwkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiRlQtU0FFIikgPT0gMCkKKwkJCXZhbCB8PSBXUEFfS0VZX01HTVRfRlRfU0FFOworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KIAkJZWxzZSB7CiAJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IGludmFsaWQga2V5X21nbXQgJyVzJyIsCiAJCQkJICAgbGluZSwgc3RhcnQpOwpAQCAtNjIzLDQ5ICs2MjksMTIgQEAKIAogc3RhdGljIGludCB3cGFfY29uZmlnX3BhcnNlX2NpcGhlcihpbnQgbGluZSwgY29uc3QgY2hhciAqdmFsdWUpCiB7Ci0JaW50IHZhbCA9IDAsIGxhc3Q7Ci0JY2hhciAqc3RhcnQsICplbmQsICpidWY7Ci0KLQlidWYgPSBvc19zdHJkdXAodmFsdWUpOwotCWlmIChidWYgPT0gTlVMTCkKKwlpbnQgdmFsID0gd3BhX3BhcnNlX2NpcGhlcih2YWx1ZSk7CisJaWYgKHZhbCA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBpbnZhbGlkIGNpcGhlciAnJXMnLiIsCisJCQkgICBsaW5lLCB2YWx1ZSk7CiAJCXJldHVybiAtMTsKLQlzdGFydCA9IGJ1ZjsKLQotCXdoaWxlICgqc3RhcnQgIT0gJ1wwJykgewotCQl3aGlsZSAoKnN0YXJ0ID09ICcgJyB8fCAqc3RhcnQgPT0gJ1x0JykKLQkJCXN0YXJ0Kys7Ci0JCWlmICgqc3RhcnQgPT0gJ1wwJykKLQkJCWJyZWFrOwotCQllbmQgPSBzdGFydDsKLQkJd2hpbGUgKCplbmQgIT0gJyAnICYmICplbmQgIT0gJ1x0JyAmJiAqZW5kICE9ICdcMCcpCi0JCQllbmQrKzsKLQkJbGFzdCA9ICplbmQgPT0gJ1wwJzsKLQkJKmVuZCA9ICdcMCc7Ci0JCWlmIChvc19zdHJjbXAoc3RhcnQsICJDQ01QIikgPT0gMCkKLQkJCXZhbCB8PSBXUEFfQ0lQSEVSX0NDTVA7Ci0JCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIkdDTVAiKSA9PSAwKQotCQkJdmFsIHw9IFdQQV9DSVBIRVJfR0NNUDsKLQkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiVEtJUCIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9US0lQOwotCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJXRVAxMDQiKSA9PSAwKQotCQkJdmFsIHw9IFdQQV9DSVBIRVJfV0VQMTA0OwotCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJXRVA0MCIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9XRVA0MDsKLQkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiTk9ORSIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9OT05FOwotCQllbHNlIHsKLQkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogaW52YWxpZCBjaXBoZXIgJyVzJy4iLAotCQkJCSAgIGxpbmUsIHN0YXJ0KTsKLQkJCW9zX2ZyZWUoYnVmKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWlmIChsYXN0KQotCQkJYnJlYWs7Ci0JCXN0YXJ0ID0gZW5kICsgMTsKIAl9Ci0Jb3NfZnJlZShidWYpOwotCiAJaWYgKHZhbCA9PSAwKSB7CiAJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogbm8gY2lwaGVyIHZhbHVlcyBjb25maWd1cmVkLiIsCiAJCQkgICBsaW5lKTsKQEAgLTY3OCw3MiArNjQ3LDEzIEBACiAjaWZuZGVmIE5PX0NPTkZJR19XUklURQogc3RhdGljIGNoYXIgKiB3cGFfY29uZmlnX3dyaXRlX2NpcGhlcihpbnQgY2lwaGVyKQogewotCWNoYXIgKmJ1ZiwgKnBvcywgKmVuZDsKLQlpbnQgcmV0OwotCi0JcG9zID0gYnVmID0gb3NfemFsbG9jKDUwKTsKKwljaGFyICpidWYgPSBvc196YWxsb2MoNTApOwogCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JZW5kID0gYnVmICsgNTA7CiAKLQlpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9DQ01QKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNDQ01QIiwKLQkJCQkgIHBvcyA9PSBidWYgPyAiIiA6ICIgIik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpIHsKLQkJCWVuZFstMV0gPSAnXDAnOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQlwb3MgKz0gcmV0OwotCX0KLQotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX0dDTVApIHsKLQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc0dDTVAiLAotCQkJCSAgcG9zID09IGJ1ZiA/ICIiIDogIiAiKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykgewotCQkJZW5kWy0xXSA9ICdcMCc7Ci0JCQlyZXR1cm4gYnVmOwotCQl9Ci0JCXBvcyArPSByZXQ7Ci0JfQotCi0JaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfVEtJUCkgewotCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzVEtJUCIsCi0JCQkJICBwb3MgPT0gYnVmID8gIiIgOiAiICIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKSB7Ci0JCQllbmRbLTFdID0gJ1wwJzsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQkJcG9zICs9IHJldDsKLQl9Ci0KLQlpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9XRVAxMDQpIHsKLQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc1dFUDEwNCIsCi0JCQkJICBwb3MgPT0gYnVmID8gIiIgOiAiICIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKSB7Ci0JCQllbmRbLTFdID0gJ1wwJzsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQkJcG9zICs9IHJldDsKLQl9Ci0KLQlpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9XRVA0MCkgewotCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzV0VQNDAiLAotCQkJCSAgcG9zID09IGJ1ZiA/ICIiIDogIiAiKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykgewotCQkJZW5kWy0xXSA9ICdcMCc7Ci0JCQlyZXR1cm4gYnVmOwotCQl9Ci0JCXBvcyArPSByZXQ7Ci0JfQotCi0JaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfTk9ORSkgewotCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzTk9ORSIsCi0JCQkJICBwb3MgPT0gYnVmID8gIiIgOiAiICIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKSB7Ci0JCQllbmRbLTFdID0gJ1wwJzsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQkJcG9zICs9IHJldDsKKwlpZiAod3BhX3dyaXRlX2NpcGhlcnMoYnVmLCBidWYgKyA1MCwgY2lwaGVyLCAiICIpIDwgMCkgeworCQlvc19mcmVlKGJ1Zik7CisJCXJldHVybiBOVUxMOwogCX0KIAogCXJldHVybiBidWY7CkBAIC03NTksOCArNjY5LDcgQEAKIAl2YWwgPSB3cGFfY29uZmlnX3BhcnNlX2NpcGhlcihsaW5lLCB2YWx1ZSk7CiAJaWYgKHZhbCA9PSAtMSkKIAkJcmV0dXJuIC0xOwotCWlmICh2YWwgJiB+KFdQQV9DSVBIRVJfQ0NNUCB8IFdQQV9DSVBIRVJfR0NNUCB8IFdQQV9DSVBIRVJfVEtJUCB8Ci0JCSAgICBXUEFfQ0lQSEVSX05PTkUpKSB7CisJaWYgKHZhbCAmIH5XUEFfQUxMT1dFRF9QQUlSV0lTRV9DSVBIRVJTKSB7CiAJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogbm90IGFsbG93ZWQgcGFpcndpc2UgY2lwaGVyICIKIAkJCSAgICIoMHgleCkuIiwgbGluZSwgdmFsKTsKIAkJcmV0dXJuIC0xOwpAQCAtNzg5LDggKzY5OCw3IEBACiAJdmFsID0gd3BhX2NvbmZpZ19wYXJzZV9jaXBoZXIobGluZSwgdmFsdWUpOwogCWlmICh2YWwgPT0gLTEpCiAJCXJldHVybiAtMTsKLQlpZiAodmFsICYgfihXUEFfQ0lQSEVSX0NDTVAgfCBXUEFfQ0lQSEVSX0dDTVAgfCBXUEFfQ0lQSEVSX1RLSVAgfAotCQkgICAgV1BBX0NJUEhFUl9XRVAxMDQgfCBXUEFfQ0lQSEVSX1dFUDQwKSkgeworCWlmICh2YWwgJiB+V1BBX0FMTE9XRURfR1JPVVBfQ0lQSEVSUykgewogCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IG5vdCBhbGxvd2VkIGdyb3VwIGNpcGhlciAiCiAJCQkgICAiKDB4JXgpLiIsIGxpbmUsIHZhbCk7CiAJCXJldHVybiAtMTsKQEAgLTkxMCw5ICs4MTgsNyBAQAogI2VuZGlmIC8qIE5PX0NPTkZJR19XUklURSAqLwogCiAKLXN0YXRpYyBpbnQgKiB3cGFfY29uZmlnX3BhcnNlX2ZyZXFzKGNvbnN0IHN0cnVjdCBwYXJzZV9kYXRhICpkYXRhLAotCQkJCSAgICBzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQsIGludCBsaW5lLAotCQkJCSAgICBjb25zdCBjaGFyICp2YWx1ZSkKK3N0YXRpYyBpbnQgKiB3cGFfY29uZmlnX3BhcnNlX2ludF9hcnJheShjb25zdCBjaGFyICp2YWx1ZSkKIHsKIAlpbnQgKmZyZXFzOwogCXNpemVfdCB1c2VkLCBsZW47CkBAIC05NTksNyArODY1LDcgQEAKIHsKIAlpbnQgKmZyZXFzOwogCi0JZnJlcXMgPSB3cGFfY29uZmlnX3BhcnNlX2ZyZXFzKGRhdGEsIHNzaWQsIGxpbmUsIHZhbHVlKTsKKwlmcmVxcyA9IHdwYV9jb25maWdfcGFyc2VfaW50X2FycmF5KHZhbHVlKTsKIAlpZiAoZnJlcXMgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCW9zX2ZyZWUoc3NpZC0+c2Nhbl9mcmVxKTsKQEAgLTk3NSw3ICs4ODEsNyBAQAogewogCWludCAqZnJlcXM7CiAKLQlmcmVxcyA9IHdwYV9jb25maWdfcGFyc2VfZnJlcXMoZGF0YSwgc3NpZCwgbGluZSwgdmFsdWUpOworCWZyZXFzID0gd3BhX2NvbmZpZ19wYXJzZV9pbnRfYXJyYXkodmFsdWUpOwogCWlmIChmcmVxcyA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAJb3NfZnJlZShzc2lkLT5mcmVxX2xpc3QpOwpAQCAtMTYyMSw3ICsxNTI3LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwogCXsgSU5UX1JBTkdFKHBlZXJrZXksIDAsIDEpIH0sCiAJeyBJTlRfUkFOR0UobWl4ZWRfY2VsbCwgMCwgMSkgfSwKLQl7IElOVF9SQU5HRShmcmVxdWVuY3ksIDAsIDEwMDAwKSB9LAorCXsgSU5UX1JBTkdFKGZyZXF1ZW5jeSwgMCwgNjUwMDApIH0sCiAJeyBJTlQod3BhX3B0a19yZWtleSkgfSwKIAl7IFNUUihiZ3NjYW4pIH0sCiAJeyBJTlRfUkFOR0UoaWdub3JlX2Jyb2FkY2FzdF9zc2lkLCAwLCAyKSB9LApAQCAtMTYzMSw2ICsxNTM3LDcgQEAKICNpZmRlZiBDT05GSUdfSFRfT1ZFUlJJREVTCiAJeyBJTlRfUkFOR0UoZGlzYWJsZV9odCwgMCwgMSkgfSwKIAl7IElOVF9SQU5HRShkaXNhYmxlX2h0NDAsIC0xLCAxKSB9LAorCXsgSU5UX1JBTkdFKGRpc2FibGVfc2dpLCAwLCAxKSB9LAogCXsgSU5UX1JBTkdFKGRpc2FibGVfbWF4X2Ftc2R1LCAtMSwgMSkgfSwKIAl7IElOVF9SQU5HRShhbXBkdV9mYWN0b3IsIC0xLCAzKSB9LAogCXsgSU5UX1JBTkdFKGFtcGR1X2RlbnNpdHksIC0xLCA3KSB9LApAQCAtMTgyOSw2ICsxNzM2LDcgQEAKIAlvc19mcmVlKGNyZWQtPmVhcF9tZXRob2QpOwogCW9zX2ZyZWUoY3JlZC0+cGhhc2UxKTsKIAlvc19mcmVlKGNyZWQtPnBoYXNlMik7CisJb3NfZnJlZShjcmVkLT5leGNsdWRlZF9zc2lkKTsKIAlvc19mcmVlKGNyZWQpOwogfQogCkBAIC0xODk1LDYgKzE4MDMsNyBAQAogCXdwYWJ1Zl9mcmVlKGNvbmZpZy0+d3BzX25mY19kaF9wcml2a2V5KTsKIAl3cGFidWZfZnJlZShjb25maWctPndwc19uZmNfZGV2X3B3KTsKIAlvc19mcmVlKGNvbmZpZy0+ZXh0X3Bhc3N3b3JkX2JhY2tlbmQpOworCW9zX2ZyZWUoY29uZmlnLT5zYWVfZ3JvdXBzKTsKIAlvc19mcmVlKGNvbmZpZyk7CiB9CiAKQEAgLTIwMzEsMTAgKzE5NDAsMTUgQEAKICNpZmRlZiBDT05GSUdfSFRfT1ZFUlJJREVTCiAJc3NpZC0+ZGlzYWJsZV9odCA9IERFRkFVTFRfRElTQUJMRV9IVDsKIAlzc2lkLT5kaXNhYmxlX2h0NDAgPSBERUZBVUxUX0RJU0FCTEVfSFQ0MDsKKwlzc2lkLT5kaXNhYmxlX3NnaSA9IERFRkFVTFRfRElTQUJMRV9TR0k7CiAJc3NpZC0+ZGlzYWJsZV9tYXhfYW1zZHUgPSBERUZBVUxUX0RJU0FCTEVfTUFYX0FNU0RVOwogCXNzaWQtPmFtcGR1X2ZhY3RvciA9IERFRkFVTFRfQU1QRFVfRkFDVE9SOwogCXNzaWQtPmFtcGR1X2RlbnNpdHkgPSBERUZBVUxUX0FNUERVX0RFTlNJVFk7CiAjZW5kaWYgLyogQ09ORklHX0hUX09WRVJSSURFUyAqLworCXNzaWQtPnByb2FjdGl2ZV9rZXlfY2FjaGluZyA9IC0xOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCisJc3NpZC0+aWVlZTgwMjExdyA9IE1HTVRfRlJBTUVfUFJPVEVDVElPTl9ERUZBVUxUOworI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCiB9CiAKIApAQCAtMjQwMSw2ICsyMzE1LDM0IEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmIChvc19zdHJjbXAodmFyLCAiZXhjbHVkZWRfc3NpZCIpID09IDApIHsKKwkJc3RydWN0IGV4Y2x1ZGVkX3NzaWQgKmU7CisKKwkJaWYgKGxlbiA+IE1BWF9TU0lEX0xFTikgeworCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBpbnZhbGlkICIKKwkJCQkgICAiZXhjbHVkZWRfc3NpZCBsZW5ndGggJWQiLCBsaW5lLCAoaW50KSBsZW4pOworCQkJb3NfZnJlZSh2YWwpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJZSA9IG9zX3JlYWxsb2NfYXJyYXkoY3JlZC0+ZXhjbHVkZWRfc3NpZCwKKwkJCQkgICAgIGNyZWQtPm51bV9leGNsdWRlZF9zc2lkICsgMSwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgZXhjbHVkZWRfc3NpZCkpOworCQlpZiAoZSA9PSBOVUxMKSB7CisJCQlvc19mcmVlKHZhbCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY3JlZC0+ZXhjbHVkZWRfc3NpZCA9IGU7CisKKwkJZSA9ICZjcmVkLT5leGNsdWRlZF9zc2lkW2NyZWQtPm51bV9leGNsdWRlZF9zc2lkKytdOworCQlvc19tZW1jcHkoZS0+c3NpZCwgdmFsLCBsZW4pOworCQllLT5zc2lkX2xlbiA9IGxlbjsKKworCQlvc19mcmVlKHZhbCk7CisKKwkJcmV0dXJuIDA7CisJfQorCiAJaWYgKGxpbmUpIHsKIAkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiB1bmtub3duIGNyZWQgZmllbGQgJyVzJy4iLAogCQkJICAgbGluZSwgdmFyKTsKQEAgLTI5MzcsNiArMjg3OSwyNCBAQAogfQogCiAKK3N0YXRpYyBpbnQgd3BhX2NvbmZpZ19wcm9jZXNzX3NhZV9ncm91cHMoCisJY29uc3Qgc3RydWN0IGdsb2JhbF9wYXJzZV9kYXRhICpkYXRhLAorCXN0cnVjdCB3cGFfY29uZmlnICpjb25maWcsIGludCBsaW5lLCBjb25zdCBjaGFyICpwb3MpCit7CisJaW50ICpncm91cHMgPSB3cGFfY29uZmlnX3BhcnNlX2ludF9hcnJheShwb3MpOworCWlmIChncm91cHMgPT0gTlVMTCkgeworCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IEludmFsaWQgc2FlX2dyb3VwcyAnJXMnIiwKKwkJCSAgIGxpbmUsIHBvcyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlvc19mcmVlKGNvbmZpZy0+c2FlX2dyb3Vwcyk7CisJY29uZmlnLT5zYWVfZ3JvdXBzID0gZ3JvdXBzOworCisJcmV0dXJuIDA7Cit9CisKKwogI2lmZGVmIE9GRlNFVAogI3VuZGVmIE9GRlNFVAogI2VuZGlmIC8qIE9GRlNFVCAqLwpAQCAtMzAwMCw2ICsyOTYwLDkgQEAKIAl7IElOVF9SQU5HRShwMnBfaW50cmFfYnNzLCAwLCAxKSwgQ0ZHX0NIQU5HRURfUDJQX0lOVFJBX0JTUyB9LAogCXsgSU5UKHAycF9ncm91cF9pZGxlKSwgMCB9LAogCXsgRlVOQyhwMnBfcHJlZl9jaGFuKSwgQ0ZHX0NIQU5HRURfUDJQX1BSRUZfQ0hBTiB9LAorCXsgSU5UKHAycF9nb19odDQwKSwgMCB9LAorCXsgSU5UKHAycF9kaXNhYmxlZCksIDAgfSwKKwl7IElOVChwMnBfbm9fZ3JvdXBfaWZhY2UpLCAwIH0sCiAjZW5kaWYgLyogQ09ORklHX1AyUCAqLwogCXsgRlVOQyhjb3VudHJ5KSwgQ0ZHX0NIQU5HRURfQ09VTlRSWSB9LAogCXsgSU5UKGJzc19tYXhfY291bnQpLCAwIH0sCkBAIC0zMDE3LDEzICsyOTgwLDE3IEBACiAJeyBJTlRfUkFOR0UoYWNjZXNzX25ldHdvcmtfdHlwZSwgMCwgMTUpLCAwIH0sCiAJeyBJTlRfUkFOR0UocGJjX2luX20xLCAwLCAxKSwgMCB9LAogCXsgU1RSKGF1dG9zY2FuKSwgMCB9LAotCXsgSU5UX1JBTkdFKHdwc19uZmNfZGV2X3B3X2lkLCAweDEwLCAweGZmZmYpLCAwIH0sCi0JeyBCSU4od3BzX25mY19kaF9wdWJrZXkpLCAwIH0sCi0JeyBCSU4od3BzX25mY19kaF9wcml2a2V5KSwgMCB9LAotCXsgQklOKHdwc19uZmNfZGV2X3B3KSwgMCB9LAorCXsgSU5UX1JBTkdFKHdwc19uZmNfZGV2X3B3X2lkLCAweDEwLCAweGZmZmYpLAorCSAgQ0ZHX0NIQU5HRURfTkZDX1BBU1NXT1JEX1RPS0VOIH0sCisJeyBCSU4od3BzX25mY19kaF9wdWJrZXkpLCBDRkdfQ0hBTkdFRF9ORkNfUEFTU1dPUkRfVE9LRU4gfSwKKwl7IEJJTih3cHNfbmZjX2RoX3ByaXZrZXkpLCBDRkdfQ0hBTkdFRF9ORkNfUEFTU1dPUkRfVE9LRU4gfSwKKwl7IEJJTih3cHNfbmZjX2Rldl9wdyksIENGR19DSEFOR0VEX05GQ19QQVNTV09SRF9UT0tFTiB9LAogCXsgU1RSKGV4dF9wYXNzd29yZF9iYWNrZW5kKSwgQ0ZHX0NIQU5HRURfRVhUX1BXX0JBQ0tFTkQgfSwKIAl7IElOVChwMnBfZ29fbWF4X2luYWN0aXZpdHkpLCAwIH0sCiAJeyBJTlRfUkFOR0UoYXV0b19pbnRlcndvcmtpbmcsIDAsIDEpLCAwIH0sCisJeyBJTlQob2tjKSwgMCB9LAorCXsgSU5UKHBtZiksIDAgfSwKKwl7IEZVTkMoc2FlX2dyb3VwcyksIDAgfSwKIH07CiAKICN1bmRlZiBGVU5DCkBAIC0zMDU0LDYgKzMwMjEsOCBAQAogCQkJCSAgICJwYXJzZSAnJXMnLiIsIGxpbmUsIHBvcyk7CiAJCQlyZXQgPSAtMTsKIAkJfQorCQlpZiAoZmllbGQtPmNoYW5nZWRfZmxhZyA9PSBDRkdfQ0hBTkdFRF9ORkNfUEFTU1dPUkRfVE9LRU4pCisJCQljb25maWctPndwc19uZmNfcHdfZnJvbV9jb25maWcgPSAxOwogCQljb25maWctPmNoYW5nZWRfcGFyYW1ldGVycyB8PSBmaWVsZC0+Y2hhbmdlZF9mbGFnOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9jb25maWcuaCBiL3dwYV9zdXBwbGljYW50L2NvbmZpZy5oCmluZGV4IGI4ODlhYjguLjJiODhiYjUgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2NvbmZpZy5oCisrKyBiL3dwYV9zdXBwbGljYW50L2NvbmZpZy5oCkBAIC0xOTYsNiArMTk2LDEyIEBACiAJICogUHJlLWNvbmZpZ3VyZWQgRUFQIHBhcmFtZXRlcnMgb3IgJU5VTEwuCiAJICovCiAJY2hhciAqcGhhc2UyOworCisJc3RydWN0IGV4Y2x1ZGVkX3NzaWQgeworCQl1OCBzc2lkW01BWF9TU0lEX0xFTl07CisJCXNpemVfdCBzc2lkX2xlbjsKKwl9ICpleGNsdWRlZF9zc2lkOworCXNpemVfdCBudW1fZXhjbHVkZWRfc3NpZDsKIH07CiAKIApAQCAtMjE0LDYgKzIyMCw3IEBACiAjZGVmaW5lIENGR19DSEFOR0VEX1AyUF9PUEVSX0NIQU5ORUwgQklUKDEyKQogI2RlZmluZSBDRkdfQ0hBTkdFRF9QMlBfUFJFRl9DSEFOIEJJVCgxMykKICNkZWZpbmUgQ0ZHX0NIQU5HRURfRVhUX1BXX0JBQ0tFTkQgQklUKDE0KQorI2RlZmluZSBDRkdfQ0hBTkdFRF9ORkNfUEFTU1dPUkRfVE9LRU4gQklUKDE1KQogCiAvKioKICAqIHN0cnVjdCB3cGFfY29uZmlnIC0gd3BhX3N1cHBsaWNhbnQgY29uZmlndXJhdGlvbiBkYXRhCkBAIC03MDAsNiArNzA3LDE1IEBACiAJY2hhciAqYXV0b3NjYW47CiAKIAkvKioKKwkgKiB3cHNfbmZjX3B3X2Zyb21fY29uZmlnIC0gTkZDIERldmljZSBQYXNzd29yZCB3YXMgcmVhZCBmcm9tIGNvbmZpZworCSAqCisJICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGRldGVybWluZWQgd2hldGhlciB0aGUgTkZDIERldmljZSBQYXNzd29yZCB3YXMKKwkgKiBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbiAoMSkgb3IgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5ICgwKS4gT25seQorCSAqIHRoZSBmb3JtZXIgY2FzZSBpcyByZS13cml0dGVuIGJhY2sgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKwkgKi8KKwlpbnQgd3BzX25mY19wd19mcm9tX2NvbmZpZzsKKworCS8qKgogCSAqIHdwc19uZmNfZGV2X3B3X2lkIC0gTkZDIERldmljZSBQYXNzd29yZCBJRCBmb3IgcGFzc3dvcmQgdG9rZW4KIAkgKi8KIAlpbnQgd3BzX25mY19kZXZfcHdfaWQ7CkBAIC03MTAsMTIgKzcyNiwxMiBAQAogCXN0cnVjdCB3cGFidWYgKndwc19uZmNfZGhfcHVia2V5OwogCiAJLyoqCi0JICogd3BzX25mY19kaF9wdWJrZXkgLSBORkMgREggUHJpdmF0ZSBLZXkgZm9yIHBhc3N3b3JkIHRva2VuCisJICogd3BzX25mY19kaF9wcml2a2V5IC0gTkZDIERIIFByaXZhdGUgS2V5IGZvciBwYXNzd29yZCB0b2tlbgogCSAqLwogCXN0cnVjdCB3cGFidWYgKndwc19uZmNfZGhfcHJpdmtleTsKIAogCS8qKgotCSAqIHdwc19uZmNfZGhfcHVia2V5IC0gTkZDIERldmljZSBQYXNzd29yZCBmb3IgcGFzc3dvcmQgdG9rZW4KKwkgKiB3cHNfbmZjX2Rldl9wdyAtIE5GQyBEZXZpY2UgUGFzc3dvcmQgZm9yIHBhc3N3b3JkIHRva2VuCiAJICovCiAJc3RydWN0IHdwYWJ1ZiAqd3BzX25mY19kZXZfcHc7CiAKQEAgLTc0Nyw2ICs3NjMsNjAgQEAKIAkgKiAgICAgbWF0Y2hpbmcgbmV0d29yayBibG9jawogCSAqLwogCWludCBhdXRvX2ludGVyd29ya2luZzsKKworCS8qKgorCSAqIHAycF9nb19odDQwIC0gRGVmYXVsdCBtb2RlIGZvciBIVDQwIGVuYWJsZSB3aGVuIG9wZXJhdGluZyBhcyBHTy4KKwkgKgorCSAqIFRoaXMgd2lsbCB0YWtlIGVmZmVjdCBmb3IgcDJwX2dyb3VwX2FkZCwgcDJwX2Nvbm5lY3QsIGFuZCBwMnBfaW52aXRlLgorCSAqIE5vdGUgdGhhdCByZWd1bGF0b3J5IGNvbnN0cmFpbnRzIGFuZCBkcml2ZXIgY2FwYWJpbGl0aWVzIGFyZQorCSAqIGNvbnN1bHRlZCBhbnl3YXksIHNvIHNldHRpbmcgaXQgdG8gMSBjYW4ndCBkbyByZWFsIGhhcm0uCisJICogQnkgZGVmYXVsdDogMCAoZGlzYWJsZWQpCisJICovCisJaW50IHAycF9nb19odDQwOworCisJLyoqCisJICogcDJwX2Rpc2FibGVkIC0gV2hldGhlciBQMlAgb3BlcmF0aW9ucyBhcmUgZGlzYWJsZWQgZm9yIHRoaXMgaW50ZXJmYWNlCisJICovCisJaW50IHAycF9kaXNhYmxlZDsKKworCS8qKgorCSAqIHAycF9ub19ncm91cF9pZmFjZSAtIFdoZXRoZXIgZ3JvdXAgaW50ZXJmYWNlcyBjYW4gYmUgdXNlZAorCSAqCisJICogQnkgZGVmYXVsdCwgd3BhX3N1cHBsaWNhbnQgd2lsbCBjcmVhdGUgYSBzZXBhcmF0ZSBpbnRlcmZhY2UgZm9yIFAyUAorCSAqIGdyb3VwIG9wZXJhdGlvbnMgaWYgdGhlIGRyaXZlciBzdXBwb3J0cyB0aGlzLiBUaGlzIGZ1bmN0aW9uYWxpdHkgY2FuCisJICogYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byAxLiBJbiB0aGF0IGNhc2UsIHRoZSBzYW1lCisJICogaW50ZXJmYWNlIHRoYXQgd2FzIHVzZWQgZm9yIHRoZSBQMlAgbWFuYWdlbWVudCBvcGVyYXRpb25zIGlzIHVzZWQKKwkgKiBhbHNvIGZvciB0aGUgZ3JvdXAgb3BlcmF0aW9uLgorCSAqLworCWludCBwMnBfbm9fZ3JvdXBfaWZhY2U7CisKKwkvKioKKwkgKiBva2MgLSBXaGV0aGVyIHRvIGVuYWJsZSBvcHBvcnR1bmlzdGljIGtleSBjYWNoaW5nIGJ5IGRlZmF1bHQKKwkgKgorCSAqIEJ5IGRlZmF1bHQsIE9LQyBpcyBkaXNhYmxlZCB1bmxlc3MgZW5hYmxlZCBieSB0aGUgcGVyLW5ldHdvcmsKKwkgKiBwcm9hY3RpdmVfa2V5X2NhY2hpbmc9MSBwYXJhbWV0ZXIuIG9rYz0xIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGlzCisJICogZGVmYXVsdCBiZWhhdmlvci4KKwkgKi8KKwlpbnQgb2tjOworCisJLyoqCisJICogcG1mIC0gV2hldGhlciB0byBlbmFibGUvcmVxdWlyZSBQTUYgYnkgZGVmYXVsdAorCSAqCisJICogQnkgZGVmYXVsdCwgUE1GIGlzIGRpc2FibGVkIHVubGVzcyBlbmFibGVkIGJ5IHRoZSBwZXItbmV0d29yaworCSAqIGllZWU4MDIxMXc9MSBvciBpZWVlODAyMTF3PTIgcGFyYW1ldGVyLiBwbWY9MS8yIGNhbiBiZSB1c2VkIHRvIGNoYW5nZQorCSAqIHRoaXMgZGVmYXVsdCBiZWhhdmlvci4KKwkgKi8KKwllbnVtIG1mcF9vcHRpb25zIHBtZjsKKworCS8qKgorCSAqIHNhZV9ncm91cHMgLSBQcmVmZXJlbmNlIGxpc3Qgb2YgZW5hYmxlZCBncm91cHMgZm9yIFNBRQorCSAqCisJICogQnkgZGVmYXVsdCAoaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHNldCksIHRoZSBtYW5kYXRvcnkgZ3JvdXAgMTkKKwkgKiAoRUNDIGdyb3VwIGRlZmluZWQgb3ZlciBhIDI1Ni1iaXQgcHJpbWUgb3JkZXIgZmllbGQpIGlzIHByZWZlcnJlZCwKKwkgKiBidXQgb3RoZXIgZ3JvdXBzIGFyZSBhbHNvIGVuYWJsZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCwgdGhlCisJICogZ3JvdXBzIHdpbGwgYmUgdHJpZWQgaW4gdGhlIGluZGljYXRlZCBvcmRlci4KKwkgKi8KKwlpbnQgKnNhZV9ncm91cHM7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2NvbmZpZ19maWxlLmMgYi93cGFfc3VwcGxpY2FudC9jb25maWdfZmlsZS5jCmluZGV4IDUzMTk1N2EuLmYyOWY3YTYgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2NvbmZpZ19maWxlLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvY29uZmlnX2ZpbGUuYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgImJhc2U2NC5oIgogI2luY2x1ZGUgInV1aWQuaCIKICNpbmNsdWRlICJwMnAvcDJwLmgiCisjaW5jbHVkZSAiZWFwX3BlZXIvZWFwX21ldGhvZHMuaCIKKyNpbmNsdWRlICJlYXBfcGVlci9lYXAuaCIKIAogCiBzdGF0aWMgaW50IG5ld2xpbmVfdGVybWluYXRlZChjb25zdCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCkBAIC02NzYsMTEgKzY3OCwxMyBAQAogCUlOVF9ERUZlKGZyYWdtZW50X3NpemUsIERFRkFVTFRfRlJBR01FTlRfU0laRSk7CiAjZW5kaWYgLyogSUVFRTgwMjFYX0VBUE9MICovCiAJSU5UKG1vZGUpOwotCUlOVChwcm9hY3RpdmVfa2V5X2NhY2hpbmcpOworCUlOVChmcmVxdWVuY3kpOworCXdyaXRlX2ludChmLCAicHJvYWN0aXZlX2tleV9jYWNoaW5nIiwgc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nLCAtMSk7CiAJSU5UKGRpc2FibGVkKTsKIAlJTlQocGVlcmtleSk7CiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKLQlJTlQoaWVlZTgwMjExdyk7CisJd3JpdGVfaW50KGYsICJpZWVlODAyMTF3Iiwgc3NpZC0+aWVlZTgwMjExdywKKwkJICBNR01UX0ZSQU1FX1BST1RFQ1RJT05fREVGQVVMVCk7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KIAlTVFIoaWRfc3RyKTsKICNpZmRlZiBDT05GSUdfUDJQCkBAIC03MDMsMTYgKzcwNyw1MiBAQAogCQlmcHJpbnRmKGYsICJcdHJlYWxtPVwiJXNcIlxuIiwgY3JlZC0+cmVhbG0pOwogCWlmIChjcmVkLT51c2VybmFtZSkKIAkJZnByaW50ZihmLCAiXHR1c2VybmFtZT1cIiVzXCJcbiIsIGNyZWQtPnVzZXJuYW1lKTsKLQlpZiAoY3JlZC0+cGFzc3dvcmQpCisJaWYgKGNyZWQtPnBhc3N3b3JkICYmIGNyZWQtPmV4dF9wYXNzd29yZCkKKwkJZnByaW50ZihmLCAiXHRwYXNzd29yZD1leHQ6JXNcbiIsIGNyZWQtPnBhc3N3b3JkKTsKKwllbHNlIGlmIChjcmVkLT5wYXNzd29yZCkKIAkJZnByaW50ZihmLCAiXHRwYXNzd29yZD1cIiVzXCJcbiIsIGNyZWQtPnBhc3N3b3JkKTsKIAlpZiAoY3JlZC0+Y2FfY2VydCkKIAkJZnByaW50ZihmLCAiXHRjYV9jZXJ0PVwiJXNcIlxuIiwgY3JlZC0+Y2FfY2VydCk7CisJaWYgKGNyZWQtPmNsaWVudF9jZXJ0KQorCQlmcHJpbnRmKGYsICJcdGNsaWVudF9jZXJ0PVwiJXNcIlxuIiwgY3JlZC0+Y2xpZW50X2NlcnQpOworCWlmIChjcmVkLT5wcml2YXRlX2tleSkKKwkJZnByaW50ZihmLCAiXHRwcml2YXRlX2tleT1cIiVzXCJcbiIsIGNyZWQtPnByaXZhdGVfa2V5KTsKKwlpZiAoY3JlZC0+cHJpdmF0ZV9rZXlfcGFzc3dkKQorCQlmcHJpbnRmKGYsICJcdHByaXZhdGVfa2V5X3Bhc3N3ZD1cIiVzXCJcbiIsCisJCQljcmVkLT5wcml2YXRlX2tleV9wYXNzd2QpOwogCWlmIChjcmVkLT5pbXNpKQogCQlmcHJpbnRmKGYsICJcdGltc2k9XCIlc1wiXG4iLCBjcmVkLT5pbXNpKTsKIAlpZiAoY3JlZC0+bWlsZW5hZ2UpCiAJCWZwcmludGYoZiwgIlx0bWlsZW5hZ2U9XCIlc1wiXG4iLCBjcmVkLT5taWxlbmFnZSk7CiAJaWYgKGNyZWQtPmRvbWFpbikKIAkJZnByaW50ZihmLCAiXHRkb21haW49XCIlc1wiXG4iLCBjcmVkLT5kb21haW4pOworCWlmIChjcmVkLT5yb2FtaW5nX2NvbnNvcnRpdW1fbGVuKSB7CisJCXNpemVfdCBpOworCQlmcHJpbnRmKGYsICJcdHJvYW1pbmdfY29uc29ydGl1bT0iKTsKKwkJZm9yIChpID0gMDsgaSA8IGNyZWQtPnJvYW1pbmdfY29uc29ydGl1bV9sZW47IGkrKykKKwkJCWZwcmludGYoZiwgIiUwMngiLCBjcmVkLT5yb2FtaW5nX2NvbnNvcnRpdW1baV0pOworCQlmcHJpbnRmKGYsICJcbiIpOworCX0KKwlpZiAoY3JlZC0+ZWFwX21ldGhvZCkgeworCQljb25zdCBjaGFyICpuYW1lOworCQluYW1lID0gZWFwX2dldF9uYW1lKGNyZWQtPmVhcF9tZXRob2RbMF0udmVuZG9yLAorCQkJCSAgICBjcmVkLT5lYXBfbWV0aG9kWzBdLm1ldGhvZCk7CisJCWZwcmludGYoZiwgIlx0ZWFwPSVzXG4iLCBuYW1lKTsKKwl9CisJaWYgKGNyZWQtPnBoYXNlMSkKKwkJZnByaW50ZihmLCAiXHRwaGFzZTE9XCIlc1wiXG4iLCBjcmVkLT5waGFzZTEpOworCWlmIChjcmVkLT5waGFzZTIpCisJCWZwcmludGYoZiwgIlx0cGhhc2UyPVwiJXNcIlxuIiwgY3JlZC0+cGhhc2UyKTsKKwlpZiAoY3JlZC0+ZXhjbHVkZWRfc3NpZCkgeworCQlzaXplX3QgaSwgajsKKwkJZm9yIChpID0gMDsgaSA8IGNyZWQtPm51bV9leGNsdWRlZF9zc2lkOyBpKyspIHsKKwkJCXN0cnVjdCBleGNsdWRlZF9zc2lkICplID0gJmNyZWQtPmV4Y2x1ZGVkX3NzaWRbaV07CisJCQlmcHJpbnRmKGYsICJcdGV4Y2x1ZGVkX3NzaWQ9Iik7CisJCQlmb3IgKGogPSAwOyBqIDwgZS0+c3NpZF9sZW47IGorKykKKwkJCQlmcHJpbnRmKGYsICIlMDJ4IiwgZS0+c3NpZFtqXSk7CisJCQlmcHJpbnRmKGYsICJcbiIpOworCQl9CisJfQogfQogCiAKQEAgLTg2OCw2ICs5MDgsMTMgQEAKIAkJfQogCQlmcHJpbnRmKGYsICJcbiIpOwogCX0KKwlpZiAoY29uZmlnLT5wMnBfZ29faHQ0MCkKKwkJZnByaW50ZihmLCAicDJwX2dvX2h0NDA9JXVcbiIsIGNvbmZpZy0+cDJwX2dvX2h0NDApOworCWlmIChjb25maWctPnAycF9kaXNhYmxlZCkKKwkJZnByaW50ZihmLCAicDJwX2Rpc2FibGVkPSV1XG4iLCBjb25maWctPnAycF9kaXNhYmxlZCk7CisJaWYgKGNvbmZpZy0+cDJwX25vX2dyb3VwX2lmYWNlKQorCQlmcHJpbnRmKGYsICJwMnBfbm9fZ3JvdXBfaWZhY2U9JXVcbiIsCisJCQljb25maWctPnAycF9ub19ncm91cF9pZmFjZSk7CiAjZW5kaWYgLyogQ09ORklHX1AyUCAqLwogCWlmIChjb25maWctPmNvdW50cnlbMF0gJiYgY29uZmlnLT5jb3VudHJ5WzFdKSB7CiAJCWZwcmludGYoZiwgImNvdW50cnk9JWMlY1xuIiwKQEAgLTkwMywxMiArOTUwLDE2IEBACiAjZW5kaWYgLyogQ09ORklHX0lOVEVSV09SS0lORyAqLwogCWlmIChjb25maWctPnBiY19pbl9tMSkKIAkJZnByaW50ZihmLCAicGJjX2luX20xPSV1XG4iLCBjb25maWctPnBiY19pbl9tMSk7Ci0JaWYgKGNvbmZpZy0+d3BzX25mY19kZXZfcHdfaWQpCi0JCWZwcmludGYoZiwgIndwc19uZmNfZGV2X3B3X2lkPSVkXG4iLAotCQkJY29uZmlnLT53cHNfbmZjX2Rldl9wd19pZCk7Ci0Jd3JpdGVfZ2xvYmFsX2JpbihmLCAid3BzX25mY19kaF9wdWJrZXkiLCBjb25maWctPndwc19uZmNfZGhfcHVia2V5KTsKLQl3cml0ZV9nbG9iYWxfYmluKGYsICJ3cHNfbmZjX2RoX3ByaXZrZXkiLCBjb25maWctPndwc19uZmNfZGhfcHJpdmtleSk7Ci0Jd3JpdGVfZ2xvYmFsX2JpbihmLCAid3BzX25mY19kZXZfcHciLCBjb25maWctPndwc19uZmNfZGV2X3B3KTsKKwlpZiAoY29uZmlnLT53cHNfbmZjX3B3X2Zyb21fY29uZmlnKSB7CisJCWlmIChjb25maWctPndwc19uZmNfZGV2X3B3X2lkKQorCQkJZnByaW50ZihmLCAid3BzX25mY19kZXZfcHdfaWQ9JWRcbiIsCisJCQkJY29uZmlnLT53cHNfbmZjX2Rldl9wd19pZCk7CisJCXdyaXRlX2dsb2JhbF9iaW4oZiwgIndwc19uZmNfZGhfcHVia2V5IiwKKwkJCQkgY29uZmlnLT53cHNfbmZjX2RoX3B1YmtleSk7CisJCXdyaXRlX2dsb2JhbF9iaW4oZiwgIndwc19uZmNfZGhfcHJpdmtleSIsCisJCQkJIGNvbmZpZy0+d3BzX25mY19kaF9wcml2a2V5KTsKKwkJd3JpdGVfZ2xvYmFsX2JpbihmLCAid3BzX25mY19kZXZfcHciLCBjb25maWctPndwc19uZmNfZGV2X3B3KTsKKwl9CiAKIAlpZiAoY29uZmlnLT5leHRfcGFzc3dvcmRfYmFja2VuZCkKIAkJZnByaW50ZihmLCAiZXh0X3Bhc3N3b3JkX2JhY2tlbmQ9JXNcbiIsCkBAIC05MTksNiArOTcwLDIwIEBACiAJaWYgKGNvbmZpZy0+YXV0b19pbnRlcndvcmtpbmcpCiAJCWZwcmludGYoZiwgImF1dG9faW50ZXJ3b3JraW5nPSVkXG4iLAogCQkJY29uZmlnLT5hdXRvX2ludGVyd29ya2luZyk7CisJaWYgKGNvbmZpZy0+b2tjKQorCQlmcHJpbnRmKGYsICJva2M9JWRcbiIsIGNvbmZpZy0+b2tjKTsKKwlpZiAoY29uZmlnLT5wbWYpCisJCWZwcmludGYoZiwgInBtZj0lZFxuIiwgY29uZmlnLT5wbWYpOworCisJaWYgKGNvbmZpZy0+c2FlX2dyb3VwcykgeworCQlpbnQgaTsKKwkJZnByaW50ZihmLCAic2FlX2dyb3Vwcz0iKTsKKwkJZm9yIChpID0gMDsgY29uZmlnLT5zYWVfZ3JvdXBzW2ldID49IDA7IGkrKykgeworCQkJZnByaW50ZihmLCAiJXMlZCIsIGkgPiAwID8gIiAiIDogIiIsCisJCQkJY29uZmlnLT5zYWVfZ3JvdXBzW2ldKTsKKwkJfQorCQlmcHJpbnRmKGYsICJcbiIpOworCX0KIH0KIAogI2VuZGlmIC8qIENPTkZJR19OT19DT05GSUdfV1JJVEUgKi8KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2NvbmZpZ19zc2lkLmggYi93cGFfc3VwcGxpY2FudC9jb25maWdfc3NpZC5oCmluZGV4IGZmOTczNzkuLmQwNzk4NjMgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2NvbmZpZ19zc2lkLmgKKysrIGIvd3BhX3N1cHBsaWNhbnQvY29uZmlnX3NzaWQuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBERUZBVUxUX0JHX1NDQU5fUEVSSU9EIC0xCiAjZGVmaW5lIERFRkFVTFRfRElTQUJMRV9IVCAwCiAjZGVmaW5lIERFRkFVTFRfRElTQUJMRV9IVDQwIDAKKyNkZWZpbmUgREVGQVVMVF9ESVNBQkxFX1NHSSAwCiAjZGVmaW5lIERFRkFVTFRfRElTQUJMRV9NQVhfQU1TRFUgLTEgLyogbm8gY2hhbmdlICovCiAjZGVmaW5lIERFRkFVTFRfQU1QRFVfRkFDVE9SIC0xIC8qIG5vIGNoYW5nZSAqLwogI2RlZmluZSBERUZBVUxUX0FNUERVX0RFTlNJVFkgLTEgLyogbm8gY2hhbmdlICovCkBAIC0yMjgsMTMgKzIyOSwxOCBAQAogCSAqCiAJICogVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCB0byBlbmFibGUgcHJvYWN0aXZlIGtleSBjYWNoaW5nIHdoaWNoIGlzIGFsc28KIAkgKiBrbm93biBhcyBvcHBvcnR1bmlzdGljIFBNS1NBIGNhY2hpbmcgZm9yIFdQQTIuIFRoaXMgaXMgZGlzYWJsZWQgKDApCi0JICogYnkgZGVmYXVsdC4gRW5hYmxlIGJ5IHNldHRpbmcgdGhpcyB0byAxLgorCSAqIGJ5IGRlZmF1bHQgdW5sZXNzIGRlZmF1bHQgdmFsdWUgaXMgY2hhbmdlZCB3aXRoIHRoZSBnbG9iYWwgb2tjPTEKKwkgKiBwYXJhbWV0ZXIuIEVuYWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gMS4KIAkgKgogCSAqIFByb2FjdGl2ZSBrZXkgY2FjaGluZyBpcyB1c2VkIHRvIG1ha2Ugc3VwcGxpY2FudCBhc3N1bWUgdGhhdCB0aGUgQVBzCiAJICogYXJlIHVzaW5nIHRoZSBzYW1lIFBNSyBhbmQgZ2VuZXJhdGUgUE1LU0EgY2FjaGUgZW50cmllcyB3aXRob3V0CiAJICogZG9pbmcgUlNOIHByZS1hdXRoZW50aWNhdGlvbi4gVGhpcyByZXF1aXJlcyBzdXBwb3J0IGZyb20gdGhlIEFQIHNpZGUKIAkgKiBhbmQgaXMgbm9ybWFsbHkgdXNlZCB3aXRoIHdpcmVsZXNzIHN3aXRjaGVzIHRoYXQgY28tbG9jYXRlIHRoZQogCSAqIGF1dGhlbnRpY2F0b3IuCisJICoKKwkgKiBJbnRlcm5hbGx5LCBzcGVjaWFsIHZhbHVlIC0xIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcGFyYW1ldGVyCisJICogd2FzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gKGkuZS4sIGRlZmF1bHQgYmVoYXZpb3IgaXMKKwkgKiBmb2xsb3dlZCkuCiAJICovCiAJaW50IHByb2FjdGl2ZV9rZXlfY2FjaGluZzsKIApAQCAtMzIzLDYgKzMyOSwxNCBAQAogCWludCBkaXNhYmxlZDsKIAogCS8qKgorCSAqIGRpc2FibGVkX2Zvcl9jb25uZWN0IC0gV2hldGhlciB0aGlzIG5ldHdvcmsgd2FzIHRlbXBvcmFyaWx5IGRpc2FibGVkCisJICoKKwkgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byByZWVuYWJsZSBhbGwgdGhlIHRlbXBvcmFyaWx5IGRpc2FibGVkIG5ldHdvcmtzCisJICogYWZ0ZXIgZWl0aGVyIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgYSBXUFMgY29ubmVjdGlvbi4KKwkgKi8KKwlpbnQgZGlzYWJsZWRfZm9yX2Nvbm5lY3Q7CisKKwkvKioKIAkgKiBwZWVya2V5IC0gIFdoZXRoZXIgUGVlcktleSBoYW5kc2hha2UgZm9yIGRpcmVjdCBsaW5rcyBpcyBhbGxvd2VkCiAJICoKIAkgKiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIGJvdGggUlNOL1dQQTIgYW5kIElFRUUgODAyLjExZSAoUW9TKSBhcmUKQEAgLTM0OCw2ICszNjIsMTIgQEAKIAkgKgogCSAqIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBjb25maWd1cmUgcG9saWN5IGZvciBtYW5hZ2VtZW50IGZyYW1lCiAJICogcHJvdGVjdGlvbiAoSUVFRSA4MDIuMTF3KS4gMCA9IGRpc2FibGVkLCAxID0gb3B0aW9uYWwsIDIgPSByZXF1aXJlZC4KKwkgKiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBkZWZhdWx0IHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQKKwkgKiB3aXRoIHRoZSBnbG9iYWwgcG1mPTEvMiBwYXJhbWV0ZXIuCisJICoKKwkgKiBJbnRlcm5hbGx5LCBzcGVjaWFsIHZhbHVlIDMgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwYXJhbWV0ZXIKKwkgKiB3YXMgbm90IHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiAoaS5lLiwgZGVmYXVsdCBiZWhhdmlvciBpcworCSAqIGZvbGxvd2VkKS4KIAkgKi8KIAllbnVtIG1mcF9vcHRpb25zIGllZWU4MDIxMXc7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KQEAgLTQ4Myw2ICs1MDMsMTQgQEAKIAlpbnQgZGlzYWJsZV9odDQwOwogCiAJLyoqCisJICogZGlzYWJsZV9zZ2kgLSBEaXNhYmxlIFNHSSAoU2hvcnQgR3VhcmQgSW50ZXJ2YWwpIGZvciB0aGlzIG5ldHdvcmsKKwkgKgorCSAqIEJ5IGRlZmF1bHQsIHVzZSBpdCBpZiBpdCBpcyBhdmFpbGFibGUsIGJ1dCB0aGlzIGNhbiBiZSBjb25maWd1cmVkCisJICogdG8gMSB0byBoYXZlIGl0IGRpc2FibGVkLgorCSAqLworCWludCBkaXNhYmxlX3NnaTsKKworCS8qKgogCSAqIGRpc2FibGVfbWF4X2Ftc2R1IC0gRGlzYWJsZSBNQVggQS1NU0RVCiAJICoKIAkgKiBBLU1EU1Ugd2lsbCBiZSAzODM5IGJ5dGVzIHdoZW4gZGlzYWJsZWQsIG9yIDc5MzUKQEAgLTUzNiw2ICs1NjQsMTUgQEAKIAkgKiBkaXNhYmxlZF91bnRpbCAtIE5ldHdvcmsgYmxvY2sgZGlzYWJsZWQgdW50aWwgdGhpcyB0aW1lIGlmIG5vbi16ZXJvCiAJICovCiAJc3RydWN0IG9zX3RpbWUgZGlzYWJsZWRfdW50aWw7CisKKwkvKioKKwkgKiBwYXJlbnRfY3JlZCAtIFBvaW50ZXIgdG8gcGFyZW50IHdwYV9jcmVkIGVudHJ5CisJICoKKwkgKiBUaGlzIHBvaW50ZXIgY2FuIGJlIHVzZWQgdG8gZGVsZXRlIHRlbXBvcmFyeSBuZXR3b3JrcyB3aGVuIGEgd3BhX2NyZWQKKwkgKiB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGVtIGlzIHJlbW92ZWQuIFRoaXMgcG9pbnRlciBzaG91bGQgbm90IGJlCisJICogZGVyZWZlcmVuY2VzIHNpbmNlIGl0IG1heSBub3QgYmUgdXBkYXRlZCBpbiBhbGwgY2FzZXMuCisJICovCisJdm9pZCAqcGFyZW50X2NyZWQ7CiB9OwogCiAjZW5kaWYgLyogQ09ORklHX1NTSURfSCAqLwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvY29uZmlnX3dpbnJlZy5jIGIvd3BhX3N1cHBsaWNhbnQvY29uZmlnX3dpbnJlZy5jCmluZGV4IDZkOTg3NmMuLjI3NTBiNjMgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2NvbmZpZ193aW5yZWcuYworKysgYi93cGFfc3VwcGxpY2FudC9jb25maWdfd2lucmVnLmMKQEAgLTIwMiw2ICsyMDIsNyBAQAogc3RhdGljIGludCB3cGFfY29uZmlnX3JlYWRfZ2xvYmFsKHN0cnVjdCB3cGFfY29uZmlnICpjb25maWcsIEhLRVkgaGspCiB7CiAJaW50IGVycm9ycyA9IDA7CisJaW50IHZhbDsKIAogCXdwYV9jb25maWdfcmVhZF9yZWdfZHdvcmQoaGssIFRFWFQoImFwX3NjYW4iKSwgJmNvbmZpZy0+YXBfc2Nhbik7CiAJd3BhX2NvbmZpZ19yZWFkX3JlZ19kd29yZChoaywgVEVYVCgiZmFzdF9yZWF1dGgiKSwKQEAgLTI3MSw2ICsyNzIsMTAgQEAKIAl3cGFfY29uZmlnX3JlYWRfcmVnX2R3b3JkKGhrLCBURVhUKCJkaXNhc3NvY19sb3dfYWNrIiksCiAJCQkJICAoaW50ICopICZjb25maWctPmRpc2Fzc29jX2xvd19hY2spOwogCisJd3BhX2NvbmZpZ19yZWFkX3JlZ19kd29yZChoaywgVEVYVCgib2tjIiksICZjb25maWctPm9rYyk7CisJd3BhX2NvbmZpZ19yZWFkX3JlZ19kd29yZChoaywgVEVYVCgicG1mIiksICZ2YWwpOworCWNvbmZpZy0+cG1mID0gdmFsOworCiAJcmV0dXJuIGVycm9ycyA/IC0xIDogMDsKIH0KIApAQCAtNjA5LDYgKzYxNCw5IEBACiAJd3BhX2NvbmZpZ193cml0ZV9yZWdfZHdvcmQoaGssIFRFWFQoImRpc2Fzc29jX2xvd19hY2siKSwKIAkJCQkgICBjb25maWctPmRpc2Fzc29jX2xvd19hY2ssIDApOwogCisJd3BhX2NvbmZpZ193cml0ZV9yZWdfZHdvcmQoaGssIFRFWFQoIm9rYyIpLCBjb25maWctPm9rYywgMCk7CisJd3BhX2NvbmZpZ193cml0ZV9yZWdfZHdvcmQoaGssIFRFWFQoInBtZiIpLCBjb25maWctPnBtZiwgMCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTA0LDExICs5MTIsMTMgQEAKIAlJTlRfREVGZShmcmFnbWVudF9zaXplLCBERUZBVUxUX0ZSQUdNRU5UX1NJWkUpOwogI2VuZGlmIC8qIElFRUU4MDIxWF9FQVBPTCAqLwogCUlOVChtb2RlKTsKLQlJTlQocHJvYWN0aXZlX2tleV9jYWNoaW5nKTsKKwl3cml0ZV9pbnQobmV0dywgInByb2FjdGl2ZV9rZXlfY2FjaGluZyIsIHNzaWQtPnByb2FjdGl2ZV9rZXlfY2FjaGluZywKKwkJICAtMSk7CiAJSU5UKGRpc2FibGVkKTsKIAlJTlQocGVlcmtleSk7CiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKLQlJTlQoaWVlZTgwMjExdyk7CisJd3JpdGVfaW50KG5ldHcsICJpZWVlODAyMTF3Iiwgc3NpZC0+aWVlZTgwMjExdywKKwkJICBNR01UX0ZSQU1FX1BST1RFQ1RJT05fREVGQVVMVCk7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KIAlTVFIoaWRfc3RyKTsKIApkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvY3RybF9pZmFjZS5jIGIvd3BhX3N1cHBsaWNhbnQvY3RybF9pZmFjZS5jCmluZGV4IGJjZjI3YmUuLjk0MGNkNzQgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2N0cmxfaWZhY2UuYworKysgYi93cGFfc3VwcGxpY2FudC9jdHJsX2lmYWNlLmMKQEAgLTM3LDggKzM3LDggQEAKICNpbmNsdWRlICJjdHJsX2lmYWNlLmgiCiAjaW5jbHVkZSAiaW50ZXJ3b3JraW5nLmgiCiAjaW5jbHVkZSAiYmxhY2tsaXN0LmgiCi0jaW5jbHVkZSAid3Bhc19nbHVlLmgiCiAjaW5jbHVkZSAiYXV0b3NjYW4uaCIKKyNpbmNsdWRlICJ3bm1fc3RhLmgiCiAKIGV4dGVybiBzdHJ1Y3Qgd3BhX2RyaXZlcl9vcHMgKndwYV9kcml2ZXJzW107CiAKQEAgLTU4LDYgKzU4LDExIEBACiAJaWYgKHdwYV9zLT5wbm8pCiAJCXJldHVybiAwOwogCisJaWYgKHdwYV9zLT53cGFfc3RhdGUgPT0gV1BBX1NDQU5OSU5HKSB7CisJCXdwYV9zdXBwbGljYW50X2NhbmNlbF9zY2hlZF9zY2FuKHdwYV9zKTsKKwkJd3BhX3N1cHBsaWNhbnRfY2FuY2VsX3NjYW4od3BhX3MpOworCX0KKwogCW9zX21lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CiAKIAludW1fc3NpZCA9IDA7CkBAIC0xMTMsMTEgKzExOCwxNyBAQAogCiBzdGF0aWMgaW50IHBub19zdG9wKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CisJaW50IHJldCA9IDA7CisKIAlpZiAod3BhX3MtPnBubykgewogCQl3cGFfcy0+cG5vID0gMDsKLQkJcmV0dXJuIHdwYV9kcnZfc3RvcF9zY2hlZF9zY2FuKHdwYV9zKTsKKwkJcmV0ID0gd3BhX2Rydl9zdG9wX3NjaGVkX3NjYW4od3BhX3MpOwogCX0KLQlyZXR1cm4gMDsKKworCWlmICh3cGFfcy0+d3BhX3N0YXRlID09IFdQQV9TQ0FOTklORykKKwkJd3BhX3N1cHBsaWNhbnRfcmVxX3NjYW4od3BhX3MsIDAsIDApOworCisJcmV0dXJuIHJldDsKIH0KIAogCkBAIC0xNTgsNiArMTY5LDEyOCBAQAogfQogCiAKK3N0YXRpYyBpbnQgc2V0X2Rpc2FsbG93X2FwcyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICp2YWwpCit7CisJY2hhciAqcG9zOworCXU4IGFkZHJbRVRIX0FMRU5dLCAqYnNzaWQgPSBOVUxMLCAqbjsKKwlzdHJ1Y3Qgd3BhX3NzaWRfdmFsdWUgKnNzaWQgPSBOVUxMLCAqbnM7CisJc2l6ZV90IGNvdW50ID0gMCwgc3NpZF9jb3VudCA9IDA7CisJc3RydWN0IHdwYV9zc2lkICpjOworCisJLyoKKwkgKiBkaXNhbGxvd19saXN0IDo6PSA8c3NpZF9zcGVjPiB8IDxic3NpZF9zcGVjPiB8IDxkaXNhbGxvd19saXN0PiB8IJOUCisJICogU1NJRF9TUEVDIDo6PSBzc2lkIDxTU0lEX0hFWD4KKwkgKiBCU1NJRF9TUEVDIDo6PSBic3NpZCA8QlNTSURfSEVYPgorCSAqLworCisJcG9zID0gdmFsOworCXdoaWxlIChwb3MpIHsKKwkJaWYgKCpwb3MgPT0gJ1wwJykKKwkJCWJyZWFrOworCQlpZiAob3Nfc3RybmNtcChwb3MsICJic3NpZCAiLCA2KSA9PSAwKSB7CisJCQlpbnQgcmVzOworCQkJcG9zICs9IDY7CisJCQlyZXMgPSBod2FkZHJfYXRvbjIocG9zLCBhZGRyKTsKKwkJCWlmIChyZXMgPCAwKSB7CisJCQkJb3NfZnJlZShzc2lkKTsKKwkJCQlvc19mcmVlKGJzc2lkKTsKKwkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkludmFsaWQgZGlzYWxsb3dfYXBzICIKKwkJCQkJICAgIkJTU0lEIHZhbHVlICclcyciLCBwb3MpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXBvcyArPSByZXM7CisJCQluID0gb3NfcmVhbGxvY19hcnJheShic3NpZCwgY291bnQgKyAxLCBFVEhfQUxFTik7CisJCQlpZiAobiA9PSBOVUxMKSB7CisJCQkJb3NfZnJlZShzc2lkKTsKKwkJCQlvc19mcmVlKGJzc2lkKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlic3NpZCA9IG47CisJCQlvc19tZW1jcHkoYnNzaWQgKyBjb3VudCAqIEVUSF9BTEVOLCBhZGRyLCBFVEhfQUxFTik7CisJCQljb3VudCsrOworCQl9IGVsc2UgaWYgKG9zX3N0cm5jbXAocG9zLCAic3NpZCAiLCA1KSA9PSAwKSB7CisJCQljaGFyICplbmQ7CisJCQlwb3MgKz0gNTsKKworCQkJZW5kID0gcG9zOworCQkJd2hpbGUgKCplbmQpIHsKKwkJCQlpZiAoKmVuZCA9PSAnXDAnIHx8ICplbmQgPT0gJyAnKQorCQkJCQlicmVhazsKKwkJCQllbmQrKzsKKwkJCX0KKworCQkJbnMgPSBvc19yZWFsbG9jX2FycmF5KHNzaWQsIHNzaWRfY291bnQgKyAxLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHdwYV9zc2lkX3ZhbHVlKSk7CisJCQlpZiAobnMgPT0gTlVMTCkgeworCQkJCW9zX2ZyZWUoc3NpZCk7CisJCQkJb3NfZnJlZShic3NpZCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc3NpZCA9IG5zOworCisJCQlpZiAoKGVuZCAtIHBvcykgJiAweDAxIHx8IGVuZCAtIHBvcyA+IDIgKiAzMiB8fAorCQkJICAgIGhleHN0cjJiaW4ocG9zLCBzc2lkW3NzaWRfY291bnRdLnNzaWQsCisJCQkJICAgICAgIChlbmQgLSBwb3MpIC8gMikgPCAwKSB7CisJCQkJb3NfZnJlZShzc2lkKTsKKwkJCQlvc19mcmVlKGJzc2lkKTsKKwkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkludmFsaWQgZGlzYWxsb3dfYXBzICIKKwkJCQkJICAgIlNTSUQgdmFsdWUgJyVzJyIsIHBvcyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc3NpZFtzc2lkX2NvdW50XS5zc2lkX2xlbiA9IChlbmQgLSBwb3MpIC8gMjsKKwkJCXdwYV9oZXhkdW1wX2FzY2lpKE1TR19ERUJVRywgImRpc2FsbG93X2FwcyBTU0lEIiwKKwkJCQkJICBzc2lkW3NzaWRfY291bnRdLnNzaWQsCisJCQkJCSAgc3NpZFtzc2lkX2NvdW50XS5zc2lkX2xlbik7CisJCQlzc2lkX2NvdW50Kys7CisJCQlwb3MgPSBlbmQ7CisJCX0gZWxzZSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlVuZXhwZWN0ZWQgZGlzYWxsb3dfYXBzIHZhbHVlICIKKwkJCQkgICAiJyVzJyIsIHBvcyk7CisJCQlvc19mcmVlKHNzaWQpOworCQkJb3NfZnJlZShic3NpZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlwb3MgPSBvc19zdHJjaHIocG9zLCAnICcpOworCQlpZiAocG9zKQorCQkJcG9zKys7CisJfQorCisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiZGlzYWxsb3dfYXBzX2Jzc2lkIiwgYnNzaWQsIGNvdW50ICogRVRIX0FMRU4pOworCW9zX2ZyZWUod3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZCk7CisJd3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZCA9IGJzc2lkOworCXdwYV9zLT5kaXNhbGxvd19hcHNfYnNzaWRfY291bnQgPSBjb3VudDsKKworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiZGlzYWxsb3dfYXBzX3NzaWRfY291bnQgJWQiLCAoaW50KSBzc2lkX2NvdW50KTsKKwlvc19mcmVlKHdwYV9zLT5kaXNhbGxvd19hcHNfc3NpZCk7CisJd3BhX3MtPmRpc2FsbG93X2Fwc19zc2lkID0gc3NpZDsKKwl3cGFfcy0+ZGlzYWxsb3dfYXBzX3NzaWRfY291bnQgPSBzc2lkX2NvdW50OworCisJaWYgKCF3cGFfcy0+Y3VycmVudF9zc2lkIHx8IHdwYV9zLT53cGFfc3RhdGUgPCBXUEFfQVVUSEVOVElDQVRJTkcpCisJCXJldHVybiAwOworCisJYyA9IHdwYV9zLT5jdXJyZW50X3NzaWQ7CisJaWYgKGMtPm1vZGUgIT0gV1BBU19NT0RFX0lORlJBICYmIGMtPm1vZGUgIT0gV1BBU19NT0RFX0lCU1MpCisJCXJldHVybiAwOworCisJaWYgKCFkaXNhbGxvd2VkX2Jzc2lkKHdwYV9zLCB3cGFfcy0+YnNzaWQpICYmCisJICAgICFkaXNhbGxvd2VkX3NzaWQod3BhX3MsIGMtPnNzaWQsIGMtPnNzaWRfbGVuKSkKKwkJcmV0dXJuIDA7CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkRpc2Nvbm5lY3QgYW5kIHRyeSB0byBmaW5kIGFub3RoZXIgbmV0d29yayAiCisJCSAgICJiZWNhdXNlIGN1cnJlbnQgQVAgd2FzIG1hcmtlZCBkaXNhbGxvd2VkIik7CisKKyNpZmRlZiBDT05GSUdfU01FCisJd3BhX3MtPnNtZS5wcmV2X2Jzc2lkX3NldCA9IDA7CisjZW5kaWYgLyogQ09ORklHX1NNRSAqLworCXdwYV9zLT5yZWFzc29jaWF0ZSA9IDE7CisJd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUod3BhX3MsIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKKwl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc2V0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJCSBjaGFyICpjbWQpCiB7CkBAIC0yOTEsNiArNDI0LDEwIEBACiAjZW5kaWYgLyogQ09ORklHX1dJRklfRElTUExBWSAqLwogCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJic3NpZF9maWx0ZXIiKSA9PSAwKSB7CiAJCXJldCA9IHNldF9ic3NpZF9maWx0ZXIod3BhX3MsIHZhbHVlKTsKKwl9IGVsc2UgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAiZGlzYWxsb3dfYXBzIikgPT0gMCkgeworCQlyZXQgPSBzZXRfZGlzYWxsb3dfYXBzKHdwYV9zLCB2YWx1ZSk7CisJfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgIm5vX2tlZXBfYWxpdmUiKSA9PSAwKSB7CisJCXdwYV9zLT5ub19rZWVwX2FsaXZlID0gISFhdG9pKHZhbHVlKTsKIAl9IGVsc2UgewogCQl2YWx1ZVstMV0gPSAnPSc7CiAJCXJldCA9IHdwYV9jb25maWdfcHJvY2Vzc19nbG9iYWwod3BhX3MtPmNvbmYsIGNtZCwgLTEpOwpAQCAtNDE3LDEzICs1NTQsMTIgQEAKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0UgVERMU19TRVRVUCAiIE1BQ1NUUiwKIAkJICAgTUFDMlNUUihwZWVyKSk7CiAKLQlyZXQgPSB3cGFfdGRsc19yZW5lZyh3cGFfcy0+d3BhLCBwZWVyKTsKLQlpZiAocmV0KSB7Ci0JCWlmICh3cGFfdGRsc19pc19leHRlcm5hbF9zZXR1cCh3cGFfcy0+d3BhKSkKLQkJCXJldCA9IHdwYV90ZGxzX3N0YXJ0KHdwYV9zLT53cGEsIHBlZXIpOwotCQllbHNlCi0JCQlyZXQgPSB3cGFfZHJ2X3RkbHNfb3Blcih3cGFfcywgVERMU19TRVRVUCwgcGVlcik7Ci0JfQorCXdwYV90ZGxzX3JlbW92ZSh3cGFfcy0+d3BhLCBwZWVyKTsKKworCWlmICh3cGFfdGRsc19pc19leHRlcm5hbF9zZXR1cCh3cGFfcy0+d3BhKSkKKwkJcmV0ID0gd3BhX3RkbHNfc3RhcnQod3BhX3MtPndwYSwgcGVlcik7CisJZWxzZQorCQlyZXQgPSB3cGFfZHJ2X3RkbHNfb3Blcih3cGFfcywgVERMU19TRVRVUCwgcGVlcik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTQwLDkgKzY3NiwyMSBAQAogCX0KIAogI2lmZGVmIENPTkZJR19BUAotCWlmICh3cGFfcy0+YXBfaWZhY2UpCisJaWYgKHdwYV9zLT5hcF9pZmFjZSkgeworCQlpbnQgdGltZW91dCA9IDA7CisJCWNoYXIgKnBvczsKKworCQlpZiAocGluKSB7CisJCQlwb3MgPSBvc19zdHJjaHIocGluLCAnICcpOworCQkJaWYgKHBvcykgeworCQkJCSpwb3MrKyA9ICdcMCc7CisJCQkJdGltZW91dCA9IGF0b2kocG9zKTsKKwkJCX0KKwkJfQorCiAJCXJldHVybiB3cGFfc3VwcGxpY2FudF9hcF93cHNfcGluKHdwYV9zLCBfYnNzaWQsIHBpbiwKLQkJCQkJCSBidWYsIGJ1Zmxlbik7CisJCQkJCQkgYnVmLCBidWZsZW4sIHRpbWVvdXQpOworCX0KICNlbmRpZiAvKiBDT05GSUdfQVAgKi8KIAogCWlmIChwaW4pIHsKQEAgLTYxNCwzMSArNzYyLDYgQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX1dQU19PT0IKLXN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfb29iKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCi0JCQkJCSAgICAgY2hhciAqY21kKQotewotCWNoYXIgKnBhdGgsICptZXRob2QsICpuYW1lOwotCi0JcGF0aCA9IG9zX3N0cmNocihjbWQsICcgJyk7Ci0JaWYgKHBhdGggPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCSpwYXRoKysgPSAnXDAnOwotCi0JbWV0aG9kID0gb3Nfc3RyY2hyKHBhdGgsICcgJyk7Ci0JaWYgKG1ldGhvZCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JKm1ldGhvZCsrID0gJ1wwJzsKLQotCW5hbWUgPSBvc19zdHJjaHIobWV0aG9kLCAnICcpOwotCWlmIChuYW1lICE9IE5VTEwpCi0JCSpuYW1lKysgPSAnXDAnOwotCi0JcmV0dXJuIHdwYXNfd3BzX3N0YXJ0X29vYih3cGFfcywgY21kLCBwYXRoLCBtZXRob2QsIG5hbWUpOwotfQotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCi0KLQogI2lmZGVmIENPTkZJR19XUFNfTkZDCiAKIHN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfbmZjKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCkBAIC02NTUsNiArNzc4LDM1IEBACiB9CiAKIAorc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19uZmNfY29uZmlnX3Rva2VuKAorCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCwgY2hhciAqcmVwbHksIHNpemVfdCBtYXhfbGVuKQoreworCWludCBuZGVmOworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKwlpbnQgcmVzOworCisJaWYgKG9zX3N0cmNtcChjbWQsICJXUFMiKSA9PSAwKQorCQluZGVmID0gMDsKKwllbHNlIGlmIChvc19zdHJjbXAoY21kLCAiTkRFRiIpID09IDApCisJCW5kZWYgPSAxOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJYnVmID0gd3Bhc193cHNfbmZjX2NvbmZpZ190b2tlbih3cGFfcywgbmRlZik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlyZXMgPSB3cGFfc25wcmludGZfaGV4X3VwcGVyY2FzZShyZXBseSwgbWF4X2xlbiwgd3BhYnVmX2hlYWQoYnVmKSwKKwkJCQkJIHdwYWJ1Zl9sZW4oYnVmKSk7CisJcmVwbHlbcmVzKytdID0gJ1xuJzsKKwlyZXBseVtyZXNdID0gJ1wwJzsKKworCXdwYWJ1Zl9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmVzOworfQorCisKIHN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfbmZjX3Rva2VuKAogCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCwgY2hhciAqcmVwbHksIHNpemVfdCBtYXhfbGVuKQogewpAQCAtNzEwLDYgKzg2MiwyMzAgQEAKIAlyZXR1cm4gcmV0OwogfQogCisKK3N0YXRpYyBpbnQgd3Bhc19jdHJsX25mY19nZXRfaGFuZG92ZXJfcmVxX3dwcyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCQkgICAgICBjaGFyICpyZXBseSwgc2l6ZV90IG1heF9sZW4sCisJCQkJCSAgICAgIGludCBjcikKK3sKKwlzdHJ1Y3Qgd3BhYnVmICpidWY7CisJaW50IHJlczsKKworCWJ1ZiA9IHdwYXNfd3BzX25mY19oYW5kb3Zlcl9yZXEod3BhX3MsIGNyKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXJlcyA9IHdwYV9zbnByaW50Zl9oZXhfdXBwZXJjYXNlKHJlcGx5LCBtYXhfbGVuLCB3cGFidWZfaGVhZChidWYpLAorCQkJCQkgd3BhYnVmX2xlbihidWYpKTsKKwlyZXBseVtyZXMrK10gPSAnXG4nOworCXJlcGx5W3Jlc10gPSAnXDAnOworCisJd3BhYnVmX2ZyZWUoYnVmKTsKKworCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIGludCB3cGFzX2N0cmxfbmZjX2dldF9oYW5kb3Zlcl9yZXEoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJICBjaGFyICpjbWQsIGNoYXIgKnJlcGx5LAorCQkJCQkgIHNpemVfdCBtYXhfbGVuKQoreworCWNoYXIgKnBvczsKKworCXBvcyA9IG9zX3N0cmNocihjbWQsICcgJyk7CisJaWYgKHBvcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJKnBvcysrID0gJ1wwJzsKKworCWlmIChvc19zdHJjbXAoY21kLCAiTkRFRiIpICE9IDApCisJCXJldHVybiAtMTsKKworCWlmIChvc19zdHJjbXAocG9zLCAiV1BTIikgPT0gMCB8fCBvc19zdHJjbXAocG9zLCAiV1BTLUNSIikgPT0gMCkgeworCQlyZXR1cm4gd3Bhc19jdHJsX25mY19nZXRfaGFuZG92ZXJfcmVxX3dwcygKKwkJCXdwYV9zLCByZXBseSwgbWF4X2xlbiwgb3Nfc3RyY21wKHBvcywgIldQUy1DUiIpID09IDApOworCX0KKworCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgaW50IHdwYXNfY3RybF9uZmNfZ2V0X2hhbmRvdmVyX3NlbF93cHMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJICAgICAgY2hhciAqcmVwbHksIHNpemVfdCBtYXhfbGVuLAorCQkJCQkgICAgICBpbnQgbmRlZiwgaW50IGNyLCBjaGFyICp1dWlkKQoreworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKwlpbnQgcmVzOworCisJYnVmID0gd3Bhc193cHNfbmZjX2hhbmRvdmVyX3NlbCh3cGFfcywgbmRlZiwgY3IsIHV1aWQpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcmVzID0gd3BhX3NucHJpbnRmX2hleF91cHBlcmNhc2UocmVwbHksIG1heF9sZW4sIHdwYWJ1Zl9oZWFkKGJ1ZiksCisJCQkJCSB3cGFidWZfbGVuKGJ1ZikpOworCXJlcGx5W3JlcysrXSA9ICdcbic7CisJcmVwbHlbcmVzXSA9ICdcMCc7CisKKwl3cGFidWZfZnJlZShidWYpOworCisJcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgaW50IHdwYXNfY3RybF9uZmNfZ2V0X2hhbmRvdmVyX3NlbChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCQkgIGNoYXIgKmNtZCwgY2hhciAqcmVwbHksCisJCQkJCSAgc2l6ZV90IG1heF9sZW4pCit7CisJY2hhciAqcG9zLCAqcG9zMjsKKwlpbnQgbmRlZjsKKworCXBvcyA9IG9zX3N0cmNocihjbWQsICcgJyk7CisJaWYgKHBvcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJKnBvcysrID0gJ1wwJzsKKworCWlmIChvc19zdHJjbXAoY21kLCAiV1BTIikgPT0gMCkKKwkJbmRlZiA9IDA7CisJZWxzZSBpZiAob3Nfc3RyY21wKGNtZCwgIk5ERUYiKSA9PSAwKQorCQluZGVmID0gMTsKKwllbHNlCisJCXJldHVybiAtMTsKKworCXBvczIgPSBvc19zdHJjaHIocG9zLCAnICcpOworCWlmIChwb3MyKQorCQkqcG9zMisrID0gJ1wwJzsKKwlpZiAob3Nfc3RyY21wKHBvcywgIldQUyIpID09IDAgfHwgb3Nfc3RyY21wKHBvcywgIldQUy1DUiIpID09IDApIHsKKwkJcmV0dXJuIHdwYXNfY3RybF9uZmNfZ2V0X2hhbmRvdmVyX3NlbF93cHMoCisJCQl3cGFfcywgcmVwbHksIG1heF9sZW4sIG5kZWYsCisJCQlvc19zdHJjbXAocG9zLCAiV1BTLUNSIikgPT0gMCwgcG9zMik7CisJfQorCisJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBpbnQgd3Bhc19jdHJsX25mY19yeF9oYW5kb3Zlcl9yZXEoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJIGNoYXIgKmNtZCwgY2hhciAqcmVwbHksCisJCQkJCSBzaXplX3QgbWF4X2xlbikKK3sKKwlzaXplX3QgbGVuOworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKwlpbnQgcmV0OworCisJbGVuID0gb3Nfc3RybGVuKGNtZCk7CisJaWYgKGxlbiAmIDB4MDEpCisJCXJldHVybiAtMTsKKwlsZW4gLz0gMjsKKworCWJ1ZiA9IHdwYWJ1Zl9hbGxvYyhsZW4pOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWlmIChoZXhzdHIyYmluKGNtZCwgd3BhYnVmX3B1dChidWYsIGxlbiksIGxlbikgPCAwKSB7CisJCXdwYWJ1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSB3cGFzX3dwc19uZmNfcnhfaGFuZG92ZXJfcmVxKHdwYV9zLCBidWYpOworCXdwYWJ1Zl9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgd3Bhc19jdHJsX25mY19yeF9oYW5kb3Zlcl9zZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJIGNoYXIgKmNtZCkKK3sKKwlzaXplX3QgbGVuOworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKwlpbnQgcmV0OworCisJbGVuID0gb3Nfc3RybGVuKGNtZCk7CisJaWYgKGxlbiAmIDB4MDEpCisJCXJldHVybiAtMTsKKwlsZW4gLz0gMjsKKworCWJ1ZiA9IHdwYWJ1Zl9hbGxvYyhsZW4pOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWlmIChoZXhzdHIyYmluKGNtZCwgd3BhYnVmX3B1dChidWYsIGxlbiksIGxlbikgPCAwKSB7CisJCXdwYWJ1Zl9mcmVlKGJ1Zik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSB3cGFzX3dwc19uZmNfcnhfaGFuZG92ZXJfc2VsKHdwYV9zLCBidWYpOworCXdwYWJ1Zl9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgd3Bhc19jdHJsX25mY19yZXBvcnRfaGFuZG92ZXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJIGNoYXIgKmNtZCkKK3sKKwlzaXplX3QgbGVuOworCXN0cnVjdCB3cGFidWYgKnJlcSwgKnNlbDsKKwlpbnQgcmV0OworCWNoYXIgKnBvcywgKnJvbGUsICp0eXBlLCAqcG9zMjsKKworCXJvbGUgPSBjbWQ7CisJcG9zID0gb3Nfc3RyY2hyKHJvbGUsICcgJyk7CisJaWYgKHBvcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJKnBvcysrID0gJ1wwJzsKKworCXR5cGUgPSBwb3M7CisJcG9zID0gb3Nfc3RyY2hyKHR5cGUsICcgJyk7CisJaWYgKHBvcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJKnBvcysrID0gJ1wwJzsKKworCXBvczIgPSBvc19zdHJjaHIocG9zLCAnICcpOworCWlmIChwb3MyID09IE5VTEwpCisJCXJldHVybiAtMTsKKwkqcG9zMisrID0gJ1wwJzsKKworCWxlbiA9IG9zX3N0cmxlbihwb3MpOworCWlmIChsZW4gJiAweDAxKQorCQlyZXR1cm4gLTE7CisJbGVuIC89IDI7CisKKwlyZXEgPSB3cGFidWZfYWxsb2MobGVuKTsKKwlpZiAocmVxID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlpZiAoaGV4c3RyMmJpbihwb3MsIHdwYWJ1Zl9wdXQocmVxLCBsZW4pLCBsZW4pIDwgMCkgeworCQl3cGFidWZfZnJlZShyZXEpOworCQlyZXR1cm4gLTE7CisJfQorCisJbGVuID0gb3Nfc3RybGVuKHBvczIpOworCWlmIChsZW4gJiAweDAxKSB7CisJCXdwYWJ1Zl9mcmVlKHJlcSk7CisJCXJldHVybiAtMTsKKwl9CisJbGVuIC89IDI7CisKKwlzZWwgPSB3cGFidWZfYWxsb2MobGVuKTsKKwlpZiAoc2VsID09IE5VTEwpIHsKKwkJd3BhYnVmX2ZyZWUocmVxKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoaGV4c3RyMmJpbihwb3MyLCB3cGFidWZfcHV0KHNlbCwgbGVuKSwgbGVuKSA8IDApIHsKKwkJd3BhYnVmX2ZyZWUocmVxKTsKKwkJd3BhYnVmX2ZyZWUoc2VsKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChvc19zdHJjbXAocm9sZSwgIklOSVQiKSA9PSAwICYmIG9zX3N0cmNtcCh0eXBlLCAiV1BTIikgPT0gMCkgeworCQlyZXQgPSB3cGFzX3dwc19uZmNfcmVwb3J0X2hhbmRvdmVyKHdwYV9zLCByZXEsIHNlbCk7CisJfSBlbHNlIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJORkM6IFVuc3VwcG9ydGVkIGNvbm5lY3Rpb24gaGFuZG92ZXIgIgorCQkJICAgInJlcG9ydGVkOiByb2xlPSVzIHR5cGU9JXMiLCByb2xlLCB0eXBlKTsKKwkJcmV0ID0gLTE7CisJfQorCXdwYWJ1Zl9mcmVlKHJlcSk7CisJd3BhYnVmX2ZyZWUoc2VsKTsKKworCXJldHVybiByZXQ7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfV1BTX05GQyAqLwogCiAKQEAgLTExMDYsNiArMTQ4MiwxNiBAQAogI2VuZGlmIC8qIENPTkZJR19BUCAqLwogCQlwb3MgKz0gd3BhX3NtX2dldF9zdGF0dXMod3BhX3MtPndwYSwgcG9zLCBlbmQgLSBwb3MsIHZlcmJvc2UpOwogCX0KKyNpZmRlZiBDT05GSUdfU0FFCisJaWYgKHdwYV9zLT53cGFfc3RhdGUgPj0gV1BBX0FTU09DSUFURUQgJiYKKwkgICAgd3BhX3MtPnNtZS5zYWUuc3RhdGUgPT0gU0FFX0FDQ0VQVEVEICYmICF3cGFfcy0+YXBfaWZhY2UpIHsKKwkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJzYWVfZ3JvdXA9JWRcbiIsCisJCQkJICB3cGFfcy0+c21lLnNhZS5ncm91cCk7CisJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQlyZXR1cm4gcG9zIC0gYnVmOworCQlwb3MgKz0gcmV0OworCX0KKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiAJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJ3cGFfc3RhdGU9JXNcbiIsCiAJCQkgIHdwYV9zdXBwbGljYW50X3N0YXRlX3R4dCh3cGFfcy0+d3BhX3N0YXRlKSk7CiAJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKQEAgLTExNDYsNiArMTUzMiw0NSBAQAogCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKIAkJcG9zICs9IHJldDsKIAl9CisKKwlpZiAod3BhX3MtPmN1cnJlbnRfc3NpZCkgeworCQlzdHJ1Y3Qgd3BhX2NyZWQgKmNyZWQ7CisJCWNoYXIgKnR5cGU7CisKKwkJZm9yIChjcmVkID0gd3BhX3MtPmNvbmYtPmNyZWQ7IGNyZWQ7IGNyZWQgPSBjcmVkLT5uZXh0KSB7CisJCQlpZiAod3BhX3MtPmN1cnJlbnRfc3NpZC0+cGFyZW50X2NyZWQgIT0gY3JlZCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghY3JlZC0+ZG9tYWluKQorCQkJCWNvbnRpbnVlOworCisJCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgImhvbWVfc3A9JXNcbiIsCisJCQkJCSAgY3JlZC0+ZG9tYWluKTsKKwkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKKwkJCXBvcyArPSByZXQ7CisKKwkJCWlmICh3cGFfcy0+Y3VycmVudF9ic3MgPT0gTlVMTCB8fAorCQkJICAgIHdwYV9zLT5jdXJyZW50X2Jzcy0+YW5xcCA9PSBOVUxMKQorCQkJCXJlcyA9IC0xOworCQkJZWxzZQorCQkJCXJlcyA9IGludGVyd29ya2luZ19ob21lX3NwX2NyZWQoCisJCQkJCXdwYV9zLCBjcmVkLAorCQkJCQl3cGFfcy0+Y3VycmVudF9ic3MtPmFucXAtPmRvbWFpbl9uYW1lKTsKKwkJCWlmIChyZXMgPiAwKQorCQkJCXR5cGUgPSAiaG9tZSI7CisJCQllbHNlIGlmIChyZXMgPT0gMCkKKwkJCQl0eXBlID0gInJvYW1pbmciOworCQkJZWxzZQorCQkJCXR5cGUgPSAidW5rbm93biI7CisKKwkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAic3BfdHlwZT0lc1xuIiwgdHlwZSk7CisJCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQorCQkJCXJldHVybiBwb3MgLSBidWY7CisJCQlwb3MgKz0gcmV0OworCisJCQlicmVhazsKKwkJfQorCX0KICNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLwogCiAJaWYgKHdwYV9rZXlfbWdtdF93cGFfaWVlZTgwMjF4KHdwYV9zLT5rZXlfbWdtdCkgfHwKQEAgLTExNzMsOCArMTU5OCw3IEBACiAJCXN0cnVjdCB3cGFfc3NpZCAqc3NpZCA9IHdwYV9zLT5jdXJyZW50X3NzaWQ7CiAJCXdwYV9tc2dfY3RybCh3cGFfcywgTVNHX0lORk8sIFdQQV9FVkVOVF9DT05ORUNURUQgIi0gY29ubmVjdGlvbiB0byAiCiAJCQlNQUNTVFIgIiBjb21wbGV0ZWQgJXMgW2lkPSVkIGlkX3N0cj0lc10iLAotCQkJTUFDMlNUUih3cGFfcy0+YnNzaWQpLCB3cGFfcy0+cmVhc3NvY2lhdGVkX2Nvbm5lY3Rpb24gPwotCQkJIihyZWF1dGgpIiA6ICIoYXV0aCkiLAorCQkJTUFDMlNUUih3cGFfcy0+YnNzaWQpLCAiKGF1dGgpIiwKIAkJCXNzaWQgPyBzc2lkLT5pZCA6IC0xLAogCQkJc3NpZCAmJiBzc2lkLT5pZF9zdHIgPyBzc2lkLT5pZF9zdHIgOiAiIik7CiAJfQpAQCAtMTQyMSw1NCArMTg0NSwxNSBAQAogCiBzdGF0aWMgY2hhciAqIHdwYV9zdXBwbGljYW50X2NpcGhlcl90eHQoY2hhciAqcG9zLCBjaGFyICplbmQsIGludCBjaXBoZXIpCiB7Ci0JaW50IGZpcnN0ID0gMSwgcmV0OworCWludCByZXQ7CiAJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICItIik7CiAJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKIAkJcmV0dXJuIHBvczsKIAlwb3MgKz0gcmV0OwotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX05PTkUpIHsKLQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc05PTkUiLCBmaXJzdCA/ICIiIDogIisiKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKLQkJCXJldHVybiBwb3M7Ci0JCXBvcyArPSByZXQ7Ci0JCWZpcnN0ID0gMDsKLQl9Ci0JaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfV0VQNDApIHsKLQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc1dFUDQwIiwgZmlyc3QgPyAiIiA6ICIrIik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCi0JCQlyZXR1cm4gcG9zOwotCQlwb3MgKz0gcmV0OwotCQlmaXJzdCA9IDA7Ci0JfQotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX1dFUDEwNCkgewotCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzV0VQMTA0IiwKLQkJCQkgIGZpcnN0ID8gIiIgOiAiKyIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJcmV0dXJuIHBvczsKLQkJcG9zICs9IHJldDsKLQkJZmlyc3QgPSAwOwotCX0KLQlpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNUS0lQIiwgZmlyc3QgPyAiIiA6ICIrIik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCi0JCQlyZXR1cm4gcG9zOwotCQlwb3MgKz0gcmV0OwotCQlmaXJzdCA9IDA7Ci0JfQotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX0NDTVApIHsKLQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc0NDTVAiLCBmaXJzdCA/ICIiIDogIisiKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKLQkJCXJldHVybiBwb3M7Ci0JCXBvcyArPSByZXQ7Ci0JCWZpcnN0ID0gMDsKLQl9Ci0JaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfR0NNUCkgewotCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzR0NNUCIsIGZpcnN0ID8gIiIgOiAiKyIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJcmV0dXJuIHBvczsKLQkJcG9zICs9IHJldDsKLQkJZmlyc3QgPSAwOwotCX0KKwlyZXQgPSB3cGFfd3JpdGVfY2lwaGVycyhwb3MsIGVuZCwgY2lwaGVyLCAiKyIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcG9zOworCXBvcyArPSByZXQ7CiAJcmV0dXJuIHBvczsKIH0KIApAQCAtMTg1NCwxNCArMjIzOSw2IEBACiAJLyogY21kOiAiPG5ldHdvcmsgaWQ+IiBvciAiYWxsIiAqLwogCWlmIChvc19zdHJjbXAoY21kLCAiYWxsIikgPT0gMCkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IFJFTU9WRV9ORVRXT1JLIGFsbCIpOwotCQlzc2lkID0gd3BhX3MtPmNvbmYtPnNzaWQ7Ci0JCXdoaWxlIChzc2lkKSB7Ci0JCQlzdHJ1Y3Qgd3BhX3NzaWQgKnJlbW92ZV9zc2lkID0gc3NpZDsKLQkJCWlkID0gc3NpZC0+aWQ7Ci0JCQlzc2lkID0gc3NpZC0+bmV4dDsKLQkJCXdwYXNfbm90aWZ5X25ldHdvcmtfcmVtb3ZlZCh3cGFfcywgcmVtb3ZlX3NzaWQpOwotCQkJd3BhX2NvbmZpZ19yZW1vdmVfbmV0d29yayh3cGFfcy0+Y29uZiwgaWQpOwotCQl9CiAJCWVhcG9sX3NtX2ludmFsaWRhdGVfY2FjaGVkX3Nlc3Npb24od3BhX3MtPmVhcG9sKTsKIAkJaWYgKHdwYV9zLT5jdXJyZW50X3NzaWQpIHsKICNpZmRlZiBDT05GSUdfU01FCkBAIC0xODY5LDggKzIyNDYsMTYgQEAKICNlbmRpZiAvKiBDT05GSUdfU01FICovCiAJCQl3cGFfc21fc2V0X2NvbmZpZyh3cGFfcy0+d3BhLCBOVUxMKTsKIAkJCWVhcG9sX3NtX25vdGlmeV9jb25maWcod3BhX3MtPmVhcG9sLCBOVUxMLCBOVUxMKTsKLQkJCXdwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZSh3cGFfcywKLQkJCQkgICAgICAgICAgICAgICAgICAgIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKKwkJCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKAorCQkJCXdwYV9zLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CisJCX0KKwkJc3NpZCA9IHdwYV9zLT5jb25mLT5zc2lkOworCQl3aGlsZSAoc3NpZCkgeworCQkJc3RydWN0IHdwYV9zc2lkICpyZW1vdmVfc3NpZCA9IHNzaWQ7CisJCQlpZCA9IHNzaWQtPmlkOworCQkJc3NpZCA9IHNzaWQtPm5leHQ7CisJCQl3cGFzX25vdGlmeV9uZXR3b3JrX3JlbW92ZWQod3BhX3MsIHJlbW92ZV9zc2lkKTsKKwkJCXdwYV9jb25maWdfcmVtb3ZlX25ldHdvcmsod3BhX3MtPmNvbmYsIGlkKTsKIAkJfQogCQlyZXR1cm4gMDsKIAl9CkBAIC0xOTAyLDcgKzIyODcsOCBAQAogCQl3cGFfc21fc2V0X2NvbmZpZyh3cGFfcy0+d3BhLCBOVUxMKTsKIAkJZWFwb2xfc21fbm90aWZ5X2NvbmZpZyh3cGFfcy0+ZWFwb2wsIE5VTEwsIE5VTEwpOwogCi0JCXdwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZSh3cGFfcywgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOworCQl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSh3cGFfcywKKwkJCQkJICAgICAgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwogCX0KIAogCWlmICh3cGFfY29uZmlnX3JlbW92ZV9uZXR3b3JrKHdwYV9zLT5jb25mLCBpZCkgPCAwKSB7CkBAIC0xOTUyLDcgKzIzMzgsOSBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0Jd3BhX3NtX3Bta3NhX2NhY2hlX2ZsdXNoKHdwYV9zLT53cGEsIHNzaWQpOworCWlmIChvc19zdHJjbXAobmFtZSwgImJzc2lkIikgIT0gMCAmJgorCSAgICBvc19zdHJjbXAobmFtZSwgInByaW9yaXR5IikgIT0gMCkKKwkJd3BhX3NtX3Bta3NhX2NhY2hlX2ZsdXNoKHdwYV9zLT53cGEsIHNzaWQpOwogCiAJaWYgKHdwYV9zLT5jdXJyZW50X3NzaWQgPT0gc3NpZCB8fCB3cGFfcy0+Y3VycmVudF9zc2lkID09IE5VTEwpIHsKIAkJLyoKQEAgLTIwNjksMjAgKzI0NTcsNjIgQEAKIH0KIAogCitzdGF0aWMgaW50IHdwYXNfY3RybF9yZW1vdmVfY3JlZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCSBzdHJ1Y3Qgd3BhX2NyZWQgKmNyZWQpCit7CisJc3RydWN0IHdwYV9zc2lkICpzc2lkOworCWNoYXIgc3RyWzIwXTsKKworCWlmIChjcmVkID09IE5VTEwgfHwgd3BhX2NvbmZpZ19yZW1vdmVfY3JlZCh3cGFfcy0+Y29uZiwgY3JlZC0+aWQpIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IENvdWxkIG5vdCBmaW5kIGNyZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFJlbW92ZSBhbnkgbmV0d29yayBlbnRyeSBjcmVhdGVkIGJhc2VkIG9uIHRoZSByZW1vdmVkIGNyZWRlbnRpYWwgKi8KKwlzc2lkID0gd3BhX3MtPmNvbmYtPnNzaWQ7CisJd2hpbGUgKHNzaWQpIHsKKwkJaWYgKHNzaWQtPnBhcmVudF9jcmVkID09IGNyZWQpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUmVtb3ZlIG5ldHdvcmsgaWQgJWQgc2luY2UgaXQgIgorCQkJCSAgICJ1c2VkIHRoZSByZW1vdmVkIGNyZWRlbnRpYWwiLCBzc2lkLT5pZCk7CisJCQlvc19zbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJWQiLCBzc2lkLT5pZCk7CisJCQlzc2lkID0gc3NpZC0+bmV4dDsKKwkJCXdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfcmVtb3ZlX25ldHdvcmsod3BhX3MsIHN0cik7CisJCX0gZWxzZQorCQkJc3NpZCA9IHNzaWQtPm5leHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3JlbW92ZV9jcmVkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJCQkgY2hhciAqY21kKQogewogCWludCBpZDsKLQlzdHJ1Y3Qgd3BhX2NyZWQgKmNyZWQ7CisJc3RydWN0IHdwYV9jcmVkICpjcmVkLCAqcHJldjsKIAotCS8qIGNtZDogIjxjcmVkIGlkPiIgb3IgImFsbCIgKi8KKwkvKiBjbWQ6ICI8Y3JlZCBpZD4iLCAiYWxsIiwgb3IgInNwX2ZxZG49PEZRRE4+IiAqLwogCWlmIChvc19zdHJjbXAoY21kLCAiYWxsIikgPT0gMCkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IFJFTU9WRV9DUkVEIGFsbCIpOwogCQljcmVkID0gd3BhX3MtPmNvbmYtPmNyZWQ7CiAJCXdoaWxlIChjcmVkKSB7Ci0JCQlpZCA9IGNyZWQtPmlkOworCQkJcHJldiA9IGNyZWQ7CiAJCQljcmVkID0gY3JlZC0+bmV4dDsKLQkJCXdwYV9jb25maWdfcmVtb3ZlX2NyZWQod3BhX3MtPmNvbmYsIGlkKTsKKwkJCXdwYXNfY3RybF9yZW1vdmVfY3JlZCh3cGFfcywgcHJldik7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9zX3N0cm5jbXAoY21kLCAic3BfZnFkbj0iLCA4KSA9PSAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogUkVNT1ZFX0NSRUQgU1AgRlFETiAnJXMnIiwKKwkJCSAgIGNtZCArIDgpOworCQljcmVkID0gd3BhX3MtPmNvbmYtPmNyZWQ7CisJCXdoaWxlIChjcmVkKSB7CisJCQlwcmV2ID0gY3JlZDsKKwkJCWNyZWQgPSBjcmVkLT5uZXh0OworCQkJaWYgKHByZXYtPmRvbWFpbiAmJgorCQkJICAgIG9zX3N0cmNtcChwcmV2LT5kb21haW4sIGNtZCArIDgpID09IDApCisJCQkJd3Bhc19jdHJsX3JlbW92ZV9jcmVkKHdwYV9zLCBwcmV2KTsKIAkJfQogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMDkxLDE0ICsyNTIxLDcgQEAKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IFJFTU9WRV9DUkVEIGlkPSVkIiwgaWQpOwogCiAJY3JlZCA9IHdwYV9jb25maWdfZ2V0X2NyZWQod3BhX3MtPmNvbmYsIGlkKTsKLQlpZiAoY3JlZCA9PSBOVUxMIHx8Ci0JICAgIHdwYV9jb25maWdfcmVtb3ZlX2NyZWQod3BhX3MtPmNvbmYsIGlkKSA8IDApIHsKLQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBDb3VsZCBub3QgZmluZCBjcmVkIGlkPSVkIiwKLQkJCSAgIGlkKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOworCXJldHVybiB3cGFzX2N0cmxfcmVtb3ZlX2NyZWQod3BhX3MsIGNyZWQpOwogfQogCiAKQEAgLTI0NTQsNiArMjg3Nyw5IEBACiAJCWNhc2UgSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUE6CiAJCQlobW9kZSA9ICJBIjsKIAkJCWJyZWFrOworCQljYXNlIEhPU1RBUERfTU9ERV9JRUVFODAyMTFBRDoKKwkJCWhtb2RlID0gIkFEIjsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJY29udGludWU7CiAJCX0KQEAgLTI4NTgsMTAgKzMyODQsMTcgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAotCQkJaWQxID0gYXRvaShjbWQgKyA2KTsKLQkJCWJzcyA9IHdwYV9ic3NfZ2V0X2lkKHdwYV9zLCBpZDEpOwotCQkJaWQyID0gYXRvaShjdG1wICsgMSk7Ci0JCQlpZiAoaWQyID09IDApCisJCQlpZiAoKihjbWQgKyA2KSA9PSAnLScpCisJCQkJaWQxID0gMDsKKwkJCWVsc2UKKwkJCQlpZDEgPSBhdG9pKGNtZCArIDYpOworCQkJY3RtcCsrOworCQkJaWYgKCpjdG1wID49ICcwJyAmJiAqY3RtcCA8PSAnOScpCisJCQkJaWQyID0gYXRvaShjdG1wKTsKKwkJCWVsc2UKKwkJCQlpZDIgPSAodW5zaWduZWQgaW50KSAtMTsKKwkJCWJzcyA9IHdwYV9ic3NfZ2V0X2lkX3JhbmdlKHdwYV9zLCBpZDEsIGlkMik7CisJCQlpZiAoaWQyID09ICh1bnNpZ25lZCBpbnQpIC0xKQogCQkJCWJzc2xhc3QgPSBkbF9saXN0X2xhc3QoJndwYV9zLT5ic3NfaWQsCiAJCQkJCQkgICAgICAgc3RydWN0IHdwYV9ic3MsCiAJCQkJCQkgICAgICAgbGlzdF9pZCk7CkBAIC0yODgzLDggKzMzMTYsMTAgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQl9IGVsc2UgaWYgKG9zX3N0cmNtcChjbWQsICJGSVJTVCIpID09IDApCisJfSBlbHNlIGlmIChvc19zdHJuY21wKGNtZCwgIkZJUlNUIiwgNSkgPT0gMCkKIAkJYnNzID0gZGxfbGlzdF9maXJzdCgmd3BhX3MtPmJzc19pZCwgc3RydWN0IHdwYV9ic3MsIGxpc3RfaWQpOworCWVsc2UgaWYgKG9zX3N0cm5jbXAoY21kLCAiTEFTVCIsIDQpID09IDApCisJCWJzcyA9IGRsX2xpc3RfbGFzdCgmd3BhX3MtPmJzc19pZCwgc3RydWN0IHdwYV9ic3MsIGxpc3RfaWQpOwogCWVsc2UgaWYgKG9zX3N0cm5jbXAoY21kLCAiSUQtIiwgMykgPT0gMCkgewogCQlpID0gYXRvaShjbWQgKyAzKTsKIAkJYnNzID0gd3BhX2Jzc19nZXRfaWQod3BhX3MsIGkpOwpAQCAtMzE0NCw3ICszNTc5LDcgQEAKIAlhdXRoID0gb3Nfc3Ryc3RyKHBvcywgIiBhdXRoIikgIT0gTlVMTDsKIAlhdXRvbWF0aWMgPSBvc19zdHJzdHIocG9zLCAiIGF1dG8iKSAhPSBOVUxMOwogCXBkID0gb3Nfc3Ryc3RyKHBvcywgIiBwcm92ZGlzYyIpICE9IE5VTEw7Ci0JaHQ0MCA9IG9zX3N0cnN0cihwb3MsICIgaHQ0MCIpICE9IE5VTEw7CisJaHQ0MCA9IChvc19zdHJzdHIoY21kLCAiIGh0NDAiKSAhPSBOVUxMKSB8fCB3cGFfcy0+Y29uZi0+cDJwX2dvX2h0NDA7CiAKIAlwb3MyID0gb3Nfc3Ryc3RyKHBvcywgIiBnb19pbnRlbnQ9Iik7CiAJaWYgKHBvczIpIHsKQEAgLTM1NzUsNyArNDAxMCw3IEBACiAJCQlyZXR1cm4gLTE7CiAJfQogCi0JaHQ0MCA9IG9zX3N0cnN0cihjbWQsICIgaHQ0MCIpICE9IE5VTEw7CisJaHQ0MCA9IChvc19zdHJzdHIoY21kLCAiIGh0NDAiKSAhPSBOVUxMKSB8fCB3cGFfcy0+Y29uZi0+cDJwX2dvX2h0NDA7CiAKIAlyZXR1cm4gd3Bhc19wMnBfaW52aXRlKHdwYV9zLCBfcGVlciwgc3NpZCwgTlVMTCwgZnJlcSwgaHQ0MCk7CiB9CkBAIC0zNjUxLDcgKzQwODYsNyBAQAogCWlmIChwb3MpCiAJCWZyZXEgPSBhdG9pKHBvcyArIDUpOwogCi0JaHQ0MCA9IG9zX3N0cnN0cihjbWQsICJodDQwIikgIT0gTlVMTDsKKwlodDQwID0gKG9zX3N0cnN0cihjbWQsICJodDQwIikgIT0gTlVMTCkgfHwgd3BhX3MtPmNvbmYtPnAycF9nb19odDQwOwogCiAJaWYgKG9zX3N0cm5jbXAoY21kLCAicGVyc2lzdGVudD0iLCAxMSkgPT0gMCkKIAkJcmV0dXJuIHAycF9jdHJsX2dyb3VwX2FkZF9wZXJzaXN0ZW50KHdwYV9zLCBjbWQgKyAxMSwgZnJlcSwKQEAgLTM2NzksNiArNDExNCw3IEBACiAJY2hhciAqcG9zLCAqZW5kOwogCWNoYXIgZGV2dHlwZVtXUFNfREVWX1RZUEVfQlVGU0laRV07CiAJc3RydWN0IHdwYV9zc2lkICpzc2lkOworCXNpemVfdCBpOwogCiAJaWYgKCF3cGFfcy0+Z2xvYmFsLT5wMnApCiAJCXJldHVybiAtMTsKQEAgLTM3MzIsNiArNDE2OCwxOCBAQAogCQlyZXR1cm4gcG9zIC0gYnVmOwogCXBvcyArPSByZXM7CiAKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+d3BzX3NlY19kZXZfdHlwZV9saXN0X2xlbiAvIFdQU19ERVZfVFlQRV9MRU47IGkrKykKKwl7CisJCWNvbnN0IHU4ICp0OworCQl0ID0gJmluZm8tPndwc19zZWNfZGV2X3R5cGVfbGlzdFtpICogV1BTX0RFVl9UWVBFX0xFTl07CisJCXJlcyA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAic2VjX2Rldl90eXBlPSVzXG4iLAorCQkJCSAgd3BzX2Rldl90eXBlX2JpbjJzdHIodCwgZGV2dHlwZSwKKwkJCQkJCSAgICAgICBzaXplb2YoZGV2dHlwZSkpKTsKKwkJaWYgKHJlcyA8IDAgfHwgcmVzID49IGVuZCAtIHBvcykKKwkJCXJldHVybiBwb3MgLSBidWY7CisJCXBvcyArPSByZXM7CisJfQorCiAJc3NpZCA9IHdwYXNfcDJwX2dldF9wZXJzaXN0ZW50KHdwYV9zLCBpbmZvLT5wMnBfZGV2aWNlX2FkZHIsIE5VTEwsIDApOwogCWlmIChzc2lkKSB7CiAJCXJlcyA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAicGVyc2lzdGVudD0lZFxuIiwgc3NpZC0+aWQpOwpAQCAtMzk2MCw2ICs0NDA4LDMwIEBACiAJaWYgKG9zX3N0cmNtcChjbWQsICJkaXNhbGxvd19mcmVxIikgPT0gMCkKIAkJcmV0dXJuIHAycF9jdHJsX2Rpc2FsbG93X2ZyZXEod3BhX3MsIHBhcmFtKTsKIAorCWlmIChvc19zdHJjbXAoY21kLCAiZGlzY19pbnQiKSA9PSAwKSB7CisJCWludCBtaW5fZGlzY19pbnQsIG1heF9kaXNjX2ludCwgbWF4X2Rpc2NfdHU7CisJCWNoYXIgKnBvczsKKworCQlwb3MgPSBwYXJhbTsKKworCQltaW5fZGlzY19pbnQgPSBhdG9pKHBvcyk7CisJCXBvcyA9IG9zX3N0cmNocihwb3MsICcgJyk7CisJCWlmIChwb3MgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJKnBvcysrID0gJ1wwJzsKKworCQltYXhfZGlzY19pbnQgPSBhdG9pKHBvcyk7CisJCXBvcyA9IG9zX3N0cmNocihwb3MsICcgJyk7CisJCWlmIChwb3MgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJKnBvcysrID0gJ1wwJzsKKworCQltYXhfZGlzY190dSA9IGF0b2kocG9zKTsKKworCQlyZXR1cm4gcDJwX3NldF9kaXNjX2ludCh3cGFfcy0+Z2xvYmFsLT5wMnAsIG1pbl9kaXNjX2ludCwKKwkJCQkJbWF4X2Rpc2NfaW50LCBtYXhfZGlzY190dSk7CisJfQorCiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBVbmtub3duIFAyUF9TRVQgZmllbGQgdmFsdWUgJyVzJyIsCiAJCSAgIGNtZCk7CiAKQEAgLTQzMzEsNiArNDgwMyw2MCBAQAogI2VuZGlmIC8qIENPTkZJR19BVVRPU0NBTiAqLwogCiAKKyNpZmRlZiBDT05GSUdfV05NCisKK3N0YXRpYyBpbnQgd3Bhc19jdHJsX2lmYWNlX3dubV9zbGVlcChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCit7CisJaW50IGVudGVyOworCWludCBpbnR2YWwgPSAwOworCWNoYXIgKnBvczsKKwlpbnQgcmV0OworCXN0cnVjdCB3cGFidWYgKnRmc19yZXEgPSBOVUxMOworCisJaWYgKG9zX3N0cm5jbXAoY21kLCAiZW50ZXIiLCA1KSA9PSAwKQorCQllbnRlciA9IDE7CisJZWxzZSBpZiAob3Nfc3RybmNtcChjbWQsICJleGl0IiwgNCkgPT0gMCkKKwkJZW50ZXIgPSAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJcG9zID0gb3Nfc3Ryc3RyKGNtZCwgIiBpbnRlcnZhbD0iKTsKKwlpZiAocG9zKQorCQlpbnR2YWwgPSBhdG9pKHBvcyArIDEwKTsKKworCXBvcyA9IG9zX3N0cnN0cihjbWQsICIgdGZzX3JlcT0iKTsKKwlpZiAocG9zKSB7CisJCWNoYXIgKmVuZDsKKwkJc2l6ZV90IGxlbjsKKwkJcG9zICs9IDk7CisJCWVuZCA9IG9zX3N0cmNocihwb3MsICcgJyk7CisJCWlmIChlbmQpCisJCQlsZW4gPSBlbmQgLSBwb3M7CisJCWVsc2UKKwkJCWxlbiA9IG9zX3N0cmxlbihwb3MpOworCQlpZiAobGVuICYgMSkKKwkJCXJldHVybiAtMTsKKwkJbGVuIC89IDI7CisJCXRmc19yZXEgPSB3cGFidWZfYWxsb2MobGVuKTsKKwkJaWYgKHRmc19yZXEgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGhleHN0cjJiaW4ocG9zLCB3cGFidWZfcHV0KHRmc19yZXEsIGxlbiksIGxlbikgPCAwKSB7CisJCQl3cGFidWZfZnJlZSh0ZnNfcmVxKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldCA9IGllZWU4MDJfMTFfc2VuZF93bm1zbGVlcF9yZXEod3BhX3MsIGVudGVyID8gV05NX1NMRUVQX01PREVfRU5URVIgOgorCQkJCQkgICBXTk1fU0xFRVBfTU9ERV9FWElULCBpbnR2YWwsCisJCQkJCSAgIHRmc19yZXEpOworCXdwYWJ1Zl9mcmVlKHRmc19yZXEpOworCisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KKworCiBzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X3NpZ25hbF9wb2xsKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmJ1ZiwKIAkJCQkgICAgICBzaXplX3QgYnVmbGVuKQogewpAQCAtNDM5Miw3ICs0OTE4LDEwIEBACiAJaW50IHJlcGx5X2xlbjsKIAogCWlmIChvc19zdHJuY21wKGJ1ZiwgV1BBX0NUUkxfUlNQLCBvc19zdHJsZW4oV1BBX0NUUkxfUlNQKSkgPT0gMCB8fAotCSAgICBvc19zdHJuY21wKGJ1ZiwgIlNFVF9ORVRXT1JLICIsIDEyKSA9PSAwKSB7CisJICAgIG9zX3N0cm5jbXAoYnVmLCAiU0VUX05FVFdPUksgIiwgMTIpID09IDAgfHwKKwkgICAgb3Nfc3RybmNtcChidWYsICJXUFNfTkZDX1RBR19SRUFEIiwgMTYpID09IDAgfHwKKwkgICAgb3Nfc3RybmNtcChidWYsICJORkNfUkVQT1JUX0hBTkRPVkVSIiwgMTkpID09IDAgfHwKKwkgICAgb3Nfc3RybmNtcChidWYsICJORkNfUlhfSEFORE9WRVJfU0VMIiwgMTkpID09IDApIHsKIAkJd3BhX2hleGR1bXBfYXNjaWlfa2V5KE1TR19ERUJVRywgIlJYIGN0cmxfaWZhY2UiLAogCQkJCSAgICAgIChjb25zdCB1OCAqKSBidWYsIG9zX3N0cmxlbihidWYpKTsKIAl9IGVsc2UgewpAQCAtNDQ1MiwyNSArNDk4MSwxNSBAQAogCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIkxPR09GRiIpID09IDApIHsKIAkJZWFwb2xfc21fbm90aWZ5X2xvZ29mZih3cGFfcy0+ZWFwb2wsIFRSVUUpOwogCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIlJFQVNTT0NJQVRFIikgPT0gMCkgewotCQl3cGFfcy0+bm9ybWFsX3NjYW5zID0gMDsKLQkJd3BhX3N1cHBsaWNhbnRfcmVpbml0X2F1dG9zY2FuKHdwYV9zKTsKIAkJaWYgKHdwYV9zLT53cGFfc3RhdGUgPT0gV1BBX0lOVEVSRkFDRV9ESVNBQkxFRCkKIAkJCXJlcGx5X2xlbiA9IC0xOwotCQllbHNlIHsKLQkJCXdwYV9zLT5kaXNjb25uZWN0ZWQgPSAwOwotCQkJd3BhX3MtPnJlYXNzb2NpYXRlID0gMTsKLQkJCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKLQkJfQorCQllbHNlCisJCQl3cGFzX3JlcXVlc3RfY29ubmVjdGlvbih3cGFfcyk7CiAJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiUkVDT05ORUNUIikgPT0gMCkgewotCQl3cGFfcy0+bm9ybWFsX3NjYW5zID0gMDsKLQkJd3BhX3N1cHBsaWNhbnRfcmVpbml0X2F1dG9zY2FuKHdwYV9zKTsKIAkJaWYgKHdwYV9zLT53cGFfc3RhdGUgPT0gV1BBX0lOVEVSRkFDRV9ESVNBQkxFRCkKIAkJCXJlcGx5X2xlbiA9IC0xOwotCQllbHNlIGlmICh3cGFfcy0+ZGlzY29ubmVjdGVkKSB7Ci0JCQl3cGFfcy0+ZGlzY29ubmVjdGVkID0gMDsKLQkJCXdwYV9zLT5yZWFzc29jaWF0ZSA9IDE7Ci0JCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7Ci0JCX0KKwkJZWxzZSBpZiAod3BhX3MtPmRpc2Nvbm5lY3RlZCkKKwkJCXdwYXNfcmVxdWVzdF9jb25uZWN0aW9uKHdwYV9zKTsKICNpZmRlZiBJRUVFODAyMVhfRUFQT0wKIAl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiUFJFQVVUSCAiLCA4KSA9PSAwKSB7CiAJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3ByZWF1dGgod3BhX3MsIGJ1ZiArIDgpKQpAQCAtNDUxMSwxMSArNTAzMCw2IEBACiAJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiV1BTX0NBTkNFTCIpID09IDApIHsKIAkJaWYgKHdwYXNfd3BzX2NhbmNlbCh3cGFfcykpCiAJCQlyZXBseV9sZW4gPSAtMTsKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJXUFNfT09CICIsIDgpID09IDApIHsKLQkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX29vYih3cGFfcywgYnVmICsgOCkpCi0JCQlyZXBseV9sZW4gPSAtMTsKLSNlbmRpZiAvKiBDT05GSUdfV1BTX09PQiAqLwogI2lmZGVmIENPTkZJR19XUFNfTkZDCiAJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiV1BTX05GQyIpID09IDApIHsKIAkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX25mYyh3cGFfcywgTlVMTCkpCkBAIC00NTIzLDYgKzUwMzcsOSBAQAogCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJXUFNfTkZDICIsIDgpID09IDApIHsKIAkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX25mYyh3cGFfcywgYnVmICsgOCkpCiAJCQlyZXBseV9sZW4gPSAtMTsKKwl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX05GQ19DT05GSUdfVE9LRU4gIiwgMjEpID09IDApIHsKKwkJcmVwbHlfbGVuID0gd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfbmZjX2NvbmZpZ190b2tlbigKKwkJCXdwYV9zLCBidWYgKyAyMSwgcmVwbHksIHJlcGx5X3NpemUpOwogCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJXUFNfTkZDX1RPS0VOICIsIDE0KSA9PSAwKSB7CiAJCXJlcGx5X2xlbiA9IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX25mY190b2tlbigKIAkJCXdwYV9zLCBidWYgKyAxNCwgcmVwbHksIHJlcGx5X3NpemUpOwpAQCAtNDUzMCw2ICs1MDQ3LDIxIEBACiAJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19uZmNfdGFnX3JlYWQod3BhX3MsCiAJCQkJCQkJICAgICAgIGJ1ZiArIDE3KSkKIAkJCXJlcGx5X2xlbiA9IC0xOworCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJORkNfR0VUX0hBTkRPVkVSX1JFUSAiLCAyMSkgPT0gMCkgeworCQlyZXBseV9sZW4gPSB3cGFzX2N0cmxfbmZjX2dldF9oYW5kb3Zlcl9yZXEoCisJCQl3cGFfcywgYnVmICsgMjEsIHJlcGx5LCByZXBseV9zaXplKTsKKwl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiTkZDX0dFVF9IQU5ET1ZFUl9TRUwgIiwgMjEpID09IDApIHsKKwkJcmVwbHlfbGVuID0gd3Bhc19jdHJsX25mY19nZXRfaGFuZG92ZXJfc2VsKAorCQkJd3BhX3MsIGJ1ZiArIDIxLCByZXBseSwgcmVwbHlfc2l6ZSk7CisJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIk5GQ19SWF9IQU5ET1ZFUl9SRVEgIiwgMjApID09IDApIHsKKwkJcmVwbHlfbGVuID0gd3Bhc19jdHJsX25mY19yeF9oYW5kb3Zlcl9yZXEoCisJCQl3cGFfcywgYnVmICsgMjAsIHJlcGx5LCByZXBseV9zaXplKTsKKwl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiTkZDX1JYX0hBTkRPVkVSX1NFTCAiLCAyMCkgPT0gMCkgeworCQlpZiAod3Bhc19jdHJsX25mY19yeF9oYW5kb3Zlcl9zZWwod3BhX3MsIGJ1ZiArIDIwKSkKKwkJCXJlcGx5X2xlbiA9IC0xOworCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJORkNfUkVQT1JUX0hBTkRPVkVSICIsIDIwKSA9PSAwKSB7CisJCWlmICh3cGFzX2N0cmxfbmZjX3JlcG9ydF9oYW5kb3Zlcih3cGFfcywgYnVmICsgMjApKQorCQkJcmVwbHlfbGVuID0gLTE7CiAjZW5kaWYgLyogQ09ORklHX1dQU19ORkMgKi8KIAl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX1JFRyAiLCA4KSA9PSAwKSB7CiAJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19yZWcod3BhX3MsIGJ1ZiArIDgpKQpAQCAtNDc1NCwyMiArNTI4NiwyNiBAQAogCQl3cGFfc3VwcGxpY2FudF9jYW5jZWxfc2Nhbih3cGFfcyk7CiAJCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKHdwYV9zLAogCQkJCQkgICAgICBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Ci0JfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiU0NBTiIpID09IDApIHsKKwl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJTQ0FOIikgPT0gMCB8fAorCQkgICBvc19zdHJuY21wKGJ1ZiwgIlNDQU4gIiwgNSkgPT0gMCkgewogCQlpZiAod3BhX3MtPndwYV9zdGF0ZSA9PSBXUEFfSU5URVJGQUNFX0RJU0FCTEVEKQogCQkJcmVwbHlfbGVuID0gLTE7CiAJCWVsc2UgewotCQkJaWYgKCF3cGFfcy0+c2Nhbm5pbmcgJiYKKwkJCWlmIChvc19zdHJsZW4oYnVmKSA+IDQgJiYKKwkJCSAgICBvc19zdHJuY2FzZWNtcChidWYgKyA1LCAiVFlQRT1PTkxZIiwgOSkgPT0gMCkKKwkJCQl3cGFfcy0+c2Nhbl9yZXNfaGFuZGxlciA9IHNjYW5fb25seV9oYW5kbGVyOworCQkJaWYgKCF3cGFfcy0+c2NoZWRfc2Nhbm5pbmcgJiYgIXdwYV9zLT5zY2FubmluZyAmJgogCQkJICAgICgod3BhX3MtPndwYV9zdGF0ZSA8PSBXUEFfU0NBTk5JTkcpIHx8CiAJCQkgICAgICh3cGFfcy0+d3BhX3N0YXRlID09IFdQQV9DT01QTEVURUQpKSkgewogCQkJCXdwYV9zLT5ub3JtYWxfc2NhbnMgPSAwOwotCQkJCXdwYV9zLT5zY2FuX3JlcSA9IDI7CisJCQkJd3BhX3MtPnNjYW5fcmVxID0gTUFOVUFMX1NDQU5fUkVROwogCQkJCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKIAkJCX0gZWxzZSBpZiAod3BhX3MtPnNjaGVkX3NjYW5uaW5nKSB7CiAJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTdG9wIG9uZ29pbmcgIgogCQkJCQkgICAic2NoZWRfc2NhbiB0byBhbGxvdyByZXF1ZXN0ZWQgIgogCQkJCQkgICAiZnVsbCBzY2FuIHRvIHByb2NlZWQiKTsKIAkJCQl3cGFfc3VwcGxpY2FudF9jYW5jZWxfc2NoZWRfc2Nhbih3cGFfcyk7Ci0JCQkJd3BhX3MtPnNjYW5fcmVxID0gMjsKKwkJCQl3cGFfcy0+c2Nhbl9yZXEgPSBNQU5VQUxfU0NBTl9SRVE7CiAJCQkJd3BhX3N1cHBsaWNhbnRfcmVxX3NjYW4od3BhX3MsIDAsIDApOwogCQkJfSBlbHNlIHsKIAkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIk9uZ29pbmcgc2NhbiBhY3Rpb24gLSAiCkBAIC00OTAzLDcgKzU0MzksMTMgQEAKIAkJCQkJCSAgICAgIHJlcGx5X3NpemUpOwogI2VuZGlmCiAJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiUkVBVVRIRU5USUNBVEUiKSA9PSAwKSB7CisJCXBta3NhX2NhY2hlX2NsZWFyX2N1cnJlbnQod3BhX3MtPndwYSk7CiAJCWVhcG9sX3NtX3JlcXVlc3RfcmVhdXRoKHdwYV9zLT5lYXBvbCk7CisjaWZkZWYgQ09ORklHX1dOTQorCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJXTk1fU0xFRVAgIiwgMTApID09IDApIHsKKwkJaWYgKHdwYXNfY3RybF9pZmFjZV93bm1fc2xlZXAod3BhX3MsIGJ1ZiArIDEwKSkKKwkJCXJlcGx5X2xlbiA9IC0xOworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KIAl9IGVsc2UgewogCQlvc19tZW1jcHkocmVwbHksICJVTktOT1dOIENPTU1BTkRcbiIsIDE2KTsKIAkJcmVwbHlfbGVuID0gMTY7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9jdHJsX2lmYWNlX3VuaXguYyBiL3dwYV9zdXBwbGljYW50L2N0cmxfaWZhY2VfdW5peC5jCmluZGV4IDgwZGIyN2UuLjRkZmFiYzggMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2N0cmxfaWZhY2VfdW5peC5jCisrKyBiL3dwYV9zdXBwbGljYW50L2N0cmxfaWZhY2VfdW5peC5jCkBAIC0zMjksNiArMzI5LDIyIEBACiAJCX0KIAl9CiAKKyNpZmRlZiBBTkRST0lECisJLyoKKwkgKiB3cGFfc3VwcGxpY2FudCBpcyBzdGFydGVkIGZyb20gL2luaXQuKi5yYyBvbiBBbmRyb2lkIGFuZCB0aGF0IHNlZW1zCisJICogdG8gYmUgdXNpbmcgdW1hc2sgMDA3NyB3aGljaCB3b3VsZCBsZWF2ZSB0aGUgY29udHJvbCBpbnRlcmZhY2UKKwkgKiBkaXJlY3Rvcnkgd2l0aG91dCBncm91cCBhY2Nlc3MuIFRoaXMgYnJlYWtzIHRoaW5ncyBzaW5jZSBXaS1GaQorCSAqIGZyYW1ld29yayBhc3N1bWVzIHRoYXQgdGhpcyBkaXJlY3RvcnkgY2FuIGJlIGFjY2Vzc2VkIGJ5IG90aGVyCisJICogYXBwbGljYXRpb25zIGluIHRoZSB3aWZpIGdyb3VwLiBGaXggdGhpcyBieSBhZGRpbmcgZ3JvdXAgYWNjZXNzIGV2ZW4KKwkgKiBpZiB1bWFzayB2YWx1ZSB3b3VsZCBwcmV2ZW50IHRoaXMuCisJICovCisJaWYgKGNobW9kKGRpciwgU19JUldYVSB8IFNfSVJXWEcpIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkNUUkw6IENvdWxkIG5vdCBjaG1vZCBkaXJlY3Rvcnk6ICVzIiwKKwkJCSAgIHN0cmVycm9yKGVycm5vKSk7CisJCS8qIFRyeSB0byBjb250aW51ZSBhbnl3YXkgKi8KKwl9CisjZW5kaWYgLyogQU5EUk9JRCAqLworCiAJaWYgKGdpZF9zdHIpIHsKIAkJZ3JwID0gZ2V0Z3JuYW0oZ2lkX3N0cik7CiAJCWlmIChncnApIHsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXcuYyBiL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXcuYwppbmRleCA0ZWViOTNhLi41YjRhMGE0IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3LmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ldy5jCkBAIC0xODA4LDYgKzE4MDgsOSBAQAogCWNhc2UgV1BBU19EQlVTX0JTU19QUk9QX1JTTjoKIAkJcHJvcCA9ICJSU04iOwogCQlicmVhazsKKwljYXNlIFdQQVNfREJVU19CU1NfUFJPUF9XUFM6CisJCXByb3AgPSAiV1BTIjsKKwkJYnJlYWs7CiAJY2FzZSBXUEFTX0RCVVNfQlNTX1BST1BfSUVTOgogCQlwcm9wID0gIklFcyI7CiAJCWJyZWFrOwpAQCAtMTk1MCw2ICsxOTUzLDEwIEBACiAJICB3cGFzX2RidXNfZ2V0dGVyX2VhcF9tZXRob2RzLAogCSAgTlVMTAogCX0sCisJeyAiQ2FwYWJpbGl0aWVzIiwgV1BBU19EQlVTX05FV19JTlRFUkZBQ0UsICJhcyIsCisJICB3cGFzX2RidXNfZ2V0dGVyX2dsb2JhbF9jYXBhYmlsaXRpZXMsCisJICBOVUxMCisJfSwKIAl7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQogfTsKIApAQCAtMjIzMiw2ICsyMjM5LDEwIEBACiAJICB3cGFzX2RidXNfZ2V0dGVyX2Jzc19yc24sCiAJICBOVUxMCiAJfSwKKwl7ICJXUFMiLCBXUEFTX0RCVVNfTkVXX0lGQUNFX0JTUywgImF7c3Z9IiwKKwkgIHdwYXNfZGJ1c19nZXR0ZXJfYnNzX3dwcywKKwkgIE5VTEwKKwl9LAogCXsgIklFcyIsIFdQQVNfREJVU19ORVdfSUZBQ0VfQlNTLCAiYXkiLAogCSAgd3Bhc19kYnVzX2dldHRlcl9ic3NfaWVzLAogCSAgTlVMTApkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ldy5oIGIvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ldy5oCmluZGV4IDQ0Y2RlNDIuLjM2M2E3ZTUgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXcuaAorKysgYi93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3LmgKQEAgLTM5LDYgKzM5LDcgQEAKIAlXUEFTX0RCVVNfQlNTX1BST1BfUkFURVMsCiAJV1BBU19EQlVTX0JTU19QUk9QX1dQQSwKIAlXUEFTX0RCVVNfQlNTX1BST1BfUlNOLAorCVdQQVNfREJVU19CU1NfUFJPUF9XUFMsCiAJV1BBU19EQlVTX0JTU19QUk9QX0lFUywKIH07CiAKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXdfaGFuZGxlcnMuYyBiL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXdfaGFuZGxlcnMuYwppbmRleCA1NjY4ZTFhLi41ZTA2OTMyIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3X2hhbmRsZXJzLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ld19oYW5kbGVycy5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiLi4vbm90aWZ5LmgiCiAjaW5jbHVkZSAiLi4vYnNzLmgiCiAjaW5jbHVkZSAiLi4vc2Nhbi5oIgotI2luY2x1ZGUgIi4uL2N0cmxfaWZhY2UuaCIKICNpbmNsdWRlICIuLi9hdXRvc2Nhbi5oIgogI2luY2x1ZGUgImRidXNfbmV3X2hlbHBlcnMuaCIKICNpbmNsdWRlICJkYnVzX25ldy5oIgpAQCAtMTI0LDcgKzEyMyw3IEBACiBzdGF0aWMgY29uc3QgY2hhciAqZG9udF9xdW90ZVtdID0gewogCSJrZXlfbWdtdCIsICJwcm90byIsICJwYWlyd2lzZSIsICJhdXRoX2FsZyIsICJncm91cCIsICJlYXAiLAogCSJvcGVuc2NfZW5naW5lX3BhdGgiLCAicGtjczExX2VuZ2luZV9wYXRoIiwgInBrY3MxMV9tb2R1bGVfcGF0aCIsCi0JImJzc2lkIiwgTlVMTAorCSJic3NpZCIsICJzY2FuX2ZyZXEiLCAiZnJlcV9saXN0IiwgTlVMTAogfTsKIAogc3RhdGljIGRidXNfYm9vbF90IHNob3VsZF9xdW90ZV9vcHQoY29uc3QgY2hhciAqa2V5KQpAQCAtOTI0LDYgKzkyMyw0NCBAQAogfQogCiAKKy8qKgorICogd3Bhc19kYnVzX2dldHRlcl9nbG9iYWxfY2FwYWJpbGl0aWVzIC0gUmVxdWVzdCBzdXBwb3J0ZWQgZ2xvYmFsIGNhcGFiaWxpdGllcworICogQGl0ZXI6IFBvaW50ZXIgdG8gaW5jb21pbmcgZGJ1cyBtZXNzYWdlIGl0ZXIKKyAqIEBlcnJvcjogTG9jYXRpb24gdG8gc3RvcmUgZXJyb3Igb24gZmFpbHVyZQorICogQHVzZXJfZGF0YTogRnVuY3Rpb24gc3BlY2lmaWMgZGF0YQorICogUmV0dXJuczogVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlCisgKgorICogR2V0dGVyIGZvciAiQ2FwYWJpbGl0aWVzIiBwcm9wZXJ0eS4gSGFuZGxlcyByZXF1ZXN0cyBieSBkYnVzIGNsaWVudHMgdG8KKyAqIHJldHVybiBhIGxpc3Qgb2Ygc3RyaW5ncyB3aXRoIHN1cHBvcnRlZCBjYXBhYmlsaXRpZXMgbGlrZSBBUCwgUlNOIElCU1MsCisgKiBhbmQgUDJQIHRoYXQgYXJlIGRldGVybWluZWQgYXQgY29tcGlsZSB0aW1lLgorICovCitkYnVzX2Jvb2xfdCB3cGFzX2RidXNfZ2V0dGVyX2dsb2JhbF9jYXBhYmlsaXRpZXMoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorCQkJCQkgICAgICAgICBEQnVzRXJyb3IgKmVycm9yLAorCQkJCQkgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisJY29uc3QgY2hhciAqY2FwYWJpbGl0aWVzWzVdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJc2l6ZV90IG51bV9pdGVtcyA9IDA7CisKKyNpZmRlZiBDT05GSUdfQVAKKwljYXBhYmlsaXRpZXNbbnVtX2l0ZW1zKytdID0gImFwIjsKKyNlbmRpZiAvKiBDT05GSUdfQVAgKi8KKyNpZmRlZiBDT05GSUdfSUJTU19SU04KKwljYXBhYmlsaXRpZXNbbnVtX2l0ZW1zKytdID0gImlic3MtcnNuIjsKKyNlbmRpZiAvKiBDT05GSUdfSUJTU19SU04gKi8KKyNpZmRlZiBDT05GSUdfUDJQCisJY2FwYWJpbGl0aWVzW251bV9pdGVtcysrXSA9ICJwMnAiOworI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KKyNpZmRlZiBDT05GSUdfSU5URVJXT1JLSU5HCisJY2FwYWJpbGl0aWVzW251bV9pdGVtcysrXSA9ICJpbnRlcndvcmtpbmciOworI2VuZGlmIC8qIENPTkZJR19JTlRFUldPUktJTkcgKi8KKworCXJldHVybiB3cGFzX2RidXNfc2ltcGxlX2FycmF5X3Byb3BlcnR5X2dldHRlcihpdGVyLAorCQkJCQkJICAgICAgREJVU19UWVBFX1NUUklORywKKwkJCQkJCSAgICAgIGNhcGFiaWxpdGllcywKKwkJCQkJCSAgICAgIG51bV9pdGVtcywgZXJyb3IpOworfQorCisKIHN0YXRpYyBpbnQgd3Bhc19kYnVzX2dldF9zY2FuX3R5cGUoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsIERCdXNNZXNzYWdlSXRlciAqdmFyLAogCQkJCSAgIGNoYXIgKip0eXBlLCBEQnVzTWVzc2FnZSAqKnJlcGx5KQogewpAQCAtMTI3NSw3ICsxMzEyLDcgQEAKIAkJfSBlbHNlIGlmIChwYXJhbXMuZnJlcXMgJiYgcGFyYW1zLmZyZXFzWzBdKSB7CiAJCQl3cGFfc3VwcGxpY2FudF90cmlnZ2VyX3NjYW4od3BhX3MsICZwYXJhbXMpOwogCQl9IGVsc2UgewotCQkJd3BhX3MtPnNjYW5fcmVxID0gMjsKKwkJCXdwYV9zLT5zY2FuX3JlcSA9IE1BTlVBTF9TQ0FOX1JFUTsKIAkJCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKIAkJfQogCX0gZWxzZSBpZiAoIW9zX3N0cmNtcCh0eXBlLCAiYWN0aXZlIikpIHsKQEAgLTE0MTcsMTIgKzE0NTQsNyBAQAogCQkJCQkgICAgc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAlpZiAod3BhX3MtPmN1cnJlbnRfc3NpZCAhPSBOVUxMKSB7Ci0JCXdwYV9zLT5ub3JtYWxfc2NhbnMgPSAwOwotCQl3cGFfc3VwcGxpY2FudF9yZWluaXRfYXV0b3NjYW4od3BhX3MpOwotCQl3cGFfcy0+ZGlzY29ubmVjdGVkID0gMDsKLQkJd3BhX3MtPnJlYXNzb2NpYXRlID0gMTsKLQkJd3BhX3N1cHBsaWNhbnRfcmVxX3NjYW4od3BhX3MsIDAsIDApOwotCisJCXdwYXNfcmVxdWVzdF9jb25uZWN0aW9uKHdwYV9zKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xNDU0LDEzICsxNDg2LDE1IEBACiAJLyogRXh0cmFjdCB0aGUgbmV0d29yayBJRCBhbmQgZW5zdXJlIHRoZSBuZXR3b3JrICovCiAJLyogaXMgYWN0dWFsbHkgYSBjaGlsZCBvZiB0aGlzIGludGVyZmFjZSAqLwogCWlmYWNlID0gd3Bhc19kYnVzX25ld19kZWNvbXBvc2Vfb2JqZWN0X3BhdGgob3AsIDAsICZuZXRfaWQsIE5VTEwpOwotCWlmIChpZmFjZSA9PSBOVUxMIHx8IG9zX3N0cmNtcChpZmFjZSwgd3BhX3MtPmRidXNfbmV3X3BhdGgpICE9IDApIHsKKwlpZiAoaWZhY2UgPT0gTlVMTCB8fCBuZXRfaWQgPT0gTlVMTCB8fAorCSAgICBvc19zdHJjbXAoaWZhY2UsIHdwYV9zLT5kYnVzX25ld19wYXRoKSAhPSAwKSB7CiAJCXJlcGx5ID0gd3Bhc19kYnVzX2Vycm9yX2ludmFsaWRfYXJncyhtZXNzYWdlLCBvcCk7CiAJCWdvdG8gb3V0OwogCX0KIAorCWVycm5vID0gMDsKIAlpZCA9IHN0cnRvdWwobmV0X2lkLCBOVUxMLCAxMCk7Ci0JaWYgKGVycm5vID09IEVJTlZBTCkgeworCWlmIChlcnJubyAhPSAwKSB7CiAJCXJlcGx5ID0gd3Bhc19kYnVzX2Vycm9yX2ludmFsaWRfYXJncyhtZXNzYWdlLCBvcCk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE1MDksNyArMTU0Myw4IEBACiAJfQogCiAJaWYgKHNzaWQgPT0gd3BhX3MtPmN1cnJlbnRfc3NpZCkKLQkJd3BhX3N1cHBsaWNhbnRfZGlzYXNzb2NpYXRlKHdwYV9zLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CisJCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKHdwYV9zLAorCQkJCQkgICAgICBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CiB9CiAKIApAQCAtMTU1MywxMyArMTU4OCwxNSBAQAogCS8qIEV4dHJhY3QgdGhlIG5ldHdvcmsgSUQgYW5kIGVuc3VyZSB0aGUgbmV0d29yayAqLwogCS8qIGlzIGFjdHVhbGx5IGEgY2hpbGQgb2YgdGhpcyBpbnRlcmZhY2UgKi8KIAlpZmFjZSA9IHdwYXNfZGJ1c19uZXdfZGVjb21wb3NlX29iamVjdF9wYXRoKG9wLCAwLCAmbmV0X2lkLCBOVUxMKTsKLQlpZiAoaWZhY2UgPT0gTlVMTCB8fCBvc19zdHJjbXAoaWZhY2UsIHdwYV9zLT5kYnVzX25ld19wYXRoKSAhPSAwKSB7CisJaWYgKGlmYWNlID09IE5VTEwgfHwgbmV0X2lkID09IE5VTEwgfHwKKwkgICAgb3Nfc3RyY21wKGlmYWNlLCB3cGFfcy0+ZGJ1c19uZXdfcGF0aCkgIT0gMCkgewogCQlyZXBseSA9IHdwYXNfZGJ1c19lcnJvcl9pbnZhbGlkX2FyZ3MobWVzc2FnZSwgb3ApOwogCQlnb3RvIG91dDsKIAl9CiAKKwllcnJubyA9IDA7CiAJaWQgPSBzdHJ0b3VsKG5ldF9pZCwgTlVMTCwgMTApOwotCWlmIChlcnJubyA9PSBFSU5WQUwpIHsKKwlpZiAoZXJybm8gIT0gMCkgewogCQlyZXBseSA9IHdwYXNfZGJ1c19lcnJvcl9pbnZhbGlkX2FyZ3MobWVzc2FnZSwgb3ApOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNjA4LDEzICsxNjQ1LDE1IEBACiAJLyogRXh0cmFjdCB0aGUgbmV0d29yayBJRCBhbmQgZW5zdXJlIHRoZSBuZXR3b3JrICovCiAJLyogaXMgYWN0dWFsbHkgYSBjaGlsZCBvZiB0aGlzIGludGVyZmFjZSAqLwogCWlmYWNlID0gd3Bhc19kYnVzX25ld19kZWNvbXBvc2Vfb2JqZWN0X3BhdGgob3AsIDAsICZuZXRfaWQsIE5VTEwpOwotCWlmIChpZmFjZSA9PSBOVUxMIHx8IG9zX3N0cmNtcChpZmFjZSwgd3BhX3MtPmRidXNfbmV3X3BhdGgpICE9IDApIHsKKwlpZiAoaWZhY2UgPT0gTlVMTCB8fCBuZXRfaWQgPT0gTlVMTCB8fAorCSAgICBvc19zdHJjbXAoaWZhY2UsIHdwYV9zLT5kYnVzX25ld19wYXRoKSAhPSAwKSB7CiAJCXJlcGx5ID0gd3Bhc19kYnVzX2Vycm9yX2ludmFsaWRfYXJncyhtZXNzYWdlLCBvcCk7CiAJCWdvdG8gb3V0OwogCX0KIAorCWVycm5vID0gMDsKIAlpZCA9IHN0cnRvdWwobmV0X2lkLCBOVUxMLCAxMCk7Ci0JaWYgKGVycm5vID09IEVJTlZBTCkgeworCWlmIChlcnJubyAhPSAwKSB7CiAJCXJlcGx5ID0gd3Bhc19kYnVzX2Vycm9yX2ludmFsaWRfYXJncyhtZXNzYWdlLCBuZXRfaWQpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zMzY2LDYgKzM0MDUsNjMgQEAKIAogCiAvKioKKyAqIHdwYXNfZGJ1c19nZXR0ZXJfYnNzX3dwcyAtIFJldHVybiB0aGUgV1BTIG9wdGlvbnMgb2YgYSBCU1MKKyAqIEBpdGVyOiBQb2ludGVyIHRvIGluY29taW5nIGRidXMgbWVzc2FnZSBpdGVyCisgKiBAZXJyb3I6IExvY2F0aW9uIHRvIHN0b3JlIGVycm9yIG9uIGZhaWx1cmUKKyAqIEB1c2VyX2RhdGE6IEZ1bmN0aW9uIHNwZWNpZmljIGRhdGEKKyAqIFJldHVybnM6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQorICoKKyAqIEdldHRlciBmb3IgIldQUyIgcHJvcGVydHkuCisgKi8KK2RidXNfYm9vbF90IHdwYXNfZGJ1c19nZXR0ZXJfYnNzX3dwcyhEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIERCdXNFcnJvciAqZXJyb3IsCisJCQkJICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisJc3RydWN0IGJzc19oYW5kbGVyX2FyZ3MgKmFyZ3MgPSB1c2VyX2RhdGE7CisJc3RydWN0IHdwYV9ic3MgKnJlczsKKyNpZmRlZiBDT05GSUdfV1BTCisJc3RydWN0IHdwYWJ1ZiAqd3BzX2llOworI2VuZGlmIC8qIENPTkZJR19XUFMgKi8KKwlEQnVzTWVzc2FnZUl0ZXIgaXRlcl9kaWN0LCB2YXJpYW50X2l0ZXI7CisJY29uc3QgY2hhciAqdHlwZSA9ICIiOworCisJcmVzID0gZ2V0X2Jzc19oZWxwZXIoYXJncywgZXJyb3IsIF9fZnVuY19fKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcihpdGVyLCBEQlVTX1RZUEVfVkFSSUFOVCwKKwkJCQkJICAgICAgImF7c3Z9IiwgJnZhcmlhbnRfaXRlcikpCisJCWdvdG8gbm9tZW07CisKKwlpZiAoIXdwYV9kYnVzX2RpY3Rfb3Blbl93cml0ZSgmdmFyaWFudF9pdGVyLCAmaXRlcl9kaWN0KSkKKwkJZ290byBub21lbTsKKworI2lmZGVmIENPTkZJR19XUFMKKwl3cHNfaWUgPSB3cGFfYnNzX2dldF92ZW5kb3JfaWVfbXVsdGkocmVzLCBXUFNfSUVfVkVORE9SX1RZUEUpOworCWlmICh3cHNfaWUpIHsKKwkJaWYgKHdwc19pc19zZWxlY3RlZF9wYmNfcmVnaXN0cmFyKHdwc19pZSkpCisJCQl0eXBlID0gInBiYyI7CisJCWVsc2UgaWYgKHdwc19pc19zZWxlY3RlZF9waW5fcmVnaXN0cmFyKHdwc19pZSkpCisJCQl0eXBlID0gInBpbiI7CisJfQorI2VuZGlmIC8qIENPTkZJR19XUFMgKi8KKworCWlmICghd3BhX2RidXNfZGljdF9hcHBlbmRfc3RyaW5nKCZpdGVyX2RpY3QsICJUeXBlIiwgdHlwZSkpCisJCWdvdG8gbm9tZW07CisKKwlpZiAoIXdwYV9kYnVzX2RpY3RfY2xvc2Vfd3JpdGUoJnZhcmlhbnRfaXRlciwgJml0ZXJfZGljdCkpCisJCWdvdG8gbm9tZW07CisJaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIoaXRlciwgJnZhcmlhbnRfaXRlcikpCisJCWdvdG8gbm9tZW07CisKKwlyZXR1cm4gVFJVRTsKKworbm9tZW06CisJZGJ1c19zZXRfZXJyb3JfY29uc3QoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCAibm8gbWVtb3J5Iik7CisJcmV0dXJuIEZBTFNFOworfQorCisKKy8qKgogICogd3Bhc19kYnVzX2dldHRlcl9ic3NfaWVzIC0gUmV0dXJuIGFsbCBJRXMgb2YgYSBCU1MKICAqIEBpdGVyOiBQb2ludGVyIHRvIGluY29taW5nIGRidXMgbWVzc2FnZSBpdGVyCiAgKiBAZXJyb3I6IExvY2F0aW9uIHRvIHN0b3JlIGVycm9yIG9uIGZhaWx1cmUKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXdfaGFuZGxlcnMuaCBiL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXdfaGFuZGxlcnMuaAppbmRleCAxNzhhNzZiLi5hYTU2NTUwIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3X2hhbmRsZXJzLmgKKysrIGIvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ld19oYW5kbGVycy5oCkBAIC04MCw2ICs4MCwxMCBAQAogZGJ1c19ib29sX3Qgd3Bhc19kYnVzX2dldHRlcl9lYXBfbWV0aG9kcyhEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCiAJCQkJCSBEQnVzRXJyb3IgKmVycm9yLCB2b2lkICp1c2VyX2RhdGEpOwogCitkYnVzX2Jvb2xfdCB3cGFzX2RidXNfZ2V0dGVyX2dsb2JhbF9jYXBhYmlsaXRpZXMoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorCQkJCQkJIERCdXNFcnJvciAqZXJyb3IsCisJCQkJCQkgdm9pZCAqdXNlcl9kYXRhKTsKKwogREJ1c01lc3NhZ2UgKiB3cGFzX2RidXNfaGFuZGxlcl9zY2FuKERCdXNNZXNzYWdlICptZXNzYWdlLAogCQkJCSAgICAgc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CiAKQEAgLTIzOCw2ICsyNDIsOSBAQAogZGJ1c19ib29sX3Qgd3Bhc19kYnVzX2dldHRlcl9ic3NfcnNuKERCdXNNZXNzYWdlSXRlciAqaXRlciwgREJ1c0Vycm9yICplcnJvciwKIAkJCQkgICAgIHZvaWQgKnVzZXJfZGF0YSk7CiAKK2RidXNfYm9vbF90IHdwYXNfZGJ1c19nZXR0ZXJfYnNzX3dwcyhEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIERCdXNFcnJvciAqZXJyb3IsCisJCQkJICAgICB2b2lkICp1c2VyX2RhdGEpOworCiBkYnVzX2Jvb2xfdCB3cGFzX2RidXNfZ2V0dGVyX2Jzc19pZXMoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBEQnVzRXJyb3IgKmVycm9yLAogCQkJCSAgICAgdm9pZCAqdXNlcl9kYXRhKTsKIApkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ld19oYW5kbGVyc193cHMuYyBiL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXdfaGFuZGxlcnNfd3BzLmMKaW5kZXggODQ4OWNlNy4uNGFkNWU3ZSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ld19oYW5kbGVyc193cHMuYworKysgYi93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3X2hhbmRsZXJzX3dwcy5jCkBAIC0yNzMsNyArMjczLDcgQEAKIAkJCXJldCA9IHdwYV9zdXBwbGljYW50X2FwX3dwc19waW4od3BhX3MsCiAJCQkJCQkJcGFyYW1zLmJzc2lkLAogCQkJCQkJCXBhcmFtcy5waW4sCi0JCQkJCQkJbnBpbiwgc2l6ZW9mKG5waW4pKTsKKwkJCQkJCQlucGluLCBzaXplb2YobnBpbiksIDApOwogCQllbHNlCiAjZW5kaWYgLyogQ09ORklHX0FQICovCiAJCXsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19vbGRfaGFuZGxlcnMuYyBiL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19vbGRfaGFuZGxlcnMuYwppbmRleCBlMjE3YTcyLi42OGU1NTE1IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfb2xkX2hhbmRsZXJzLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX29sZF9oYW5kbGVycy5jCkBAIC0zMzEsNyArMzMxLDcgQEAKIERCdXNNZXNzYWdlICogd3Bhc19kYnVzX2lmYWNlX3NjYW4oREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCiAJCQkJICAgc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKLQl3cGFfcy0+c2Nhbl9yZXEgPSAyOworCXdwYV9zLT5zY2FuX3JlcSA9IE1BTlVBTF9TQ0FOX1JFUTsKIAl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7CiAJcmV0dXJuIHdwYXNfZGJ1c19uZXdfc3VjY2Vzc19yZXBseShtZXNzYWdlKTsKIH0KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2RyaXZlcl9pLmggYi93cGFfc3VwcGxpY2FudC9kcml2ZXJfaS5oCmluZGV4IGJjMTQ4Y2EuLjZiYWIxOWMgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2RyaXZlcl9pLmgKKysrIGIvd3BhX3N1cHBsaWNhbnQvZHJpdmVyX2kuaApAQCAtMTM5LDE2ICsxMzksNiBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgd3BhX2Rydl9kaXNhc3NvY2lhdGUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKLQkJCQkgICAgICAgY29uc3QgdTggKmFkZHIsIGludCByZWFzb25fY29kZSkKLXsKLQlpZiAod3BhX3MtPmRyaXZlci0+ZGlzYXNzb2NpYXRlKSB7Ci0JCXJldHVybiB3cGFfcy0+ZHJpdmVyLT5kaXNhc3NvY2lhdGUod3BhX3MtPmRydl9wcml2LCBhZGRyLAotCQkJCQkJICAgcmVhc29uX2NvZGUpOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHdwYV9kcnZfYWRkX3Bta2lkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJICAgIGNvbnN0IHU4ICpic3NpZCwgY29uc3QgdTggKnBta2lkKQogewpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvZWFwX3Byb3h5X2R1bW15Lm1rIGIvd3BhX3N1cHBsaWNhbnQvZWFwX3Byb3h5X2R1bW15Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi93cGFfc3VwcGxpY2FudC9lYXBfcHJveHlfZHVtbXkubWsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2VhcG9sX3Rlc3QuYyBiL3dwYV9zdXBwbGljYW50L2VhcG9sX3Rlc3QuYwppbmRleCAwM2I4YzdlLi44N2UzOTljIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9lYXBvbF90ZXN0LmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvZWFwb2xfdGVzdC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiZWxvb3AuaCIKICNpbmNsdWRlICJ1dGlscy9iYXNlNjQuaCIKICNpbmNsdWRlICJyc25fc3VwcC93cGEuaCIKLSNpbmNsdWRlICJlYXBfcGVlci9lYXBfaS5oIgogI2luY2x1ZGUgIndwYV9zdXBwbGljYW50X2kuaCIKICNpbmNsdWRlICJyYWRpdXMvcmFkaXVzLmgiCiAjaW5jbHVkZSAicmFkaXVzL3JhZGl1c19jbGllbnQuaCIKQEAgLTk4LDcgKzk3LDcgQEAKIAlzaXplX3QgbGVuOwogCWNoYXIgKnBvczsKIAl1MzIgdmFsOwotCWNoYXIgYnVmWzEyOF07CisJY2hhciBidWZbUkFESVVTX01BWF9BVFRSX0xFTiArIDFdOwogCiAJc3dpdGNoIChhdHRyLT5zeW50YXgpIHsKIAljYXNlICdzJzoKQEAgLTExNCw3ICsxMTMsNyBAQAogCQlpZiAocG9zWzBdID09ICcwJyAmJiBwb3NbMV0gPT0gJ3gnKQogCQkJcG9zICs9IDI7CiAJCWxlbiA9IG9zX3N0cmxlbihwb3MpOwotCQlpZiAoKGxlbiAmIDEpIHx8IChsZW4gLyAyKSA+IHNpemVvZihidWYpKSB7CisJCWlmICgobGVuICYgMSkgfHwgKGxlbiAvIDIpID4gUkFESVVTX01BWF9BVFRSX0xFTikgewogCQkJcHJpbnRmKCJJbnZhbGlkIGV4dHJhIGF0dHJpYnV0ZSBoZXhzdHJpbmdcbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0xNzEsNyArMTcwLDcgQEAKIAkJCQkJICBjb25zdCB1OCAqZWFwLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCByYWRpdXNfbXNnICptc2c7Ci0JY2hhciBidWZbMTI4XTsKKwljaGFyIGJ1ZltSQURJVVNfTUFYX0FUVFJfTEVOICsgMV07CiAJY29uc3Qgc3RydWN0IGVhcF9oZHIgKmhkcjsKIAljb25zdCB1OCAqcG9zOwogCkBAIC0xMTczLDcgKzExNzIsNyBAQAogCQkJd2FpdF9mb3JfbW9uaXRvcisrOwogCQkJYnJlYWs7CiAJCWNhc2UgJ04nOgotCQkJcDEgPSBvc196YWxsb2Moc2l6ZW9mKHAxKSk7CisJCQlwMSA9IG9zX3phbGxvYyhzaXplb2YoKnAxKSk7CiAJCQlpZiAocDEgPT0gTlVMTCkKIAkJCQlicmVhazsKIAkJCWlmICghcCkKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2V2ZW50cy5jIGIvd3BhX3N1cHBsaWNhbnQvZXZlbnRzLmMKaW5kZXggNGIxZDk5Mi4uODcxZTk5YyAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvZXZlbnRzLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvZXZlbnRzLmMKQEAgLTQ0LDYgKzQ0LDkgQEAKICNpbmNsdWRlICJpbnRlcndvcmtpbmcuaCIKIAogCitzdGF0aWMgaW50IHdwYXNfc2VsZWN0X25ldHdvcmtfZnJvbV9sYXN0X3NjYW4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CisKKwogc3RhdGljIGludCB3cGFzX3RlbXBfZGlzYWJsZWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCSAgICAgIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCkKIHsKQEAgLTg0LDYgKzg3LDEyIEBACiAJCXJldHVybiAtMTsKIAl9CiAKKwlpZiAoZGlzYWxsb3dlZF9ic3NpZCh3cGFfcywgd3BhX3MtPmJzc2lkKSB8fAorCSAgICBkaXNhbGxvd2VkX3NzaWQod3BhX3MsIHNzaWQtPnNzaWQsIHNzaWQtPnNzaWRfbGVuKSkgeworCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTZWxlY3RlZCBCU1MgaXMgZGlzYWxsb3dlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCiAJcmVzID0gd3Bhc190ZW1wX2Rpc2FibGVkKHdwYV9zLCBzc2lkKTsKIAlpZiAocmVzID4gMCkgewogCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTZWxlY3RlZCBuZXR3b3JrIGlzIHRlbXBvcmFyaWx5ICIKQEAgLTk2LDggKzEwNSw5IEBACiAJaWYgKHdwYV9rZXlfbWdtdF93cGFfYW55KHNzaWQtPmtleV9tZ210KSkgewogCQl1OCB3cGFfaWVbODBdOwogCQlzaXplX3Qgd3BhX2llX2xlbiA9IHNpemVvZih3cGFfaWUpOwotCQl3cGFfc3VwcGxpY2FudF9zZXRfc3VpdGVzKHdwYV9zLCBOVUxMLCBzc2lkLAotCQkJCQkgIHdwYV9pZSwgJndwYV9pZV9sZW4pOworCQlpZiAod3BhX3N1cHBsaWNhbnRfc2V0X3N1aXRlcyh3cGFfcywgTlVMTCwgc3NpZCwKKwkJCQkJICAgICAgd3BhX2llLCAmd3BhX2llX2xlbikgPCAwKQorCQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiQ291bGQgbm90IHNldCBXUEEgc3VpdGVzIik7CiAJfSBlbHNlIHsKIAkJd3BhX3N1cHBsaWNhbnRfc2V0X25vbl93cGFfcG9saWN5KHdwYV9zLCBzc2lkKTsKIAl9CkBAIC00MjMsNyArNDMzLDkgQEAKIAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCiAJCWlmICghKGllLmNhcGFiaWxpdGllcyAmIFdQQV9DQVBBQklMSVRZX01GUEMpICYmCi0JCSAgICBzc2lkLT5pZWVlODAyMTF3ID09IE1HTVRfRlJBTUVfUFJPVEVDVElPTl9SRVFVSVJFRCkgeworCQkgICAgKHNzaWQtPmllZWU4MDIxMXcgPT0gTUdNVF9GUkFNRV9QUk9URUNUSU9OX0RFRkFVTFQgPworCQkgICAgIHdwYV9zLT5jb25mLT5wbWYgOiBzc2lkLT5pZWVlODAyMTF3KSA9PQorCQkgICAgTUdNVF9GUkFNRV9QUk9URUNUSU9OX1JFUVVJUkVEKSB7CiAJCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICIgICBza2lwIFJTTiBJRSAtIG5vIG1nbXQgIgogCQkJCSJmcmFtZSBwcm90ZWN0aW9uIik7CiAJCQlicmVhazsKQEAgLTYyNyw2ICs2MzksMjggQEAKIH0KIAogCitzdGF0aWMgaW50IGJzc19pc19kbWcoc3RydWN0IHdwYV9ic3MgKmJzcykKK3sKKwlyZXR1cm4gYnNzLT5mcmVxID4gNDUwMDA7Cit9CisKKworLyoKKyAqIFRlc3Qgd2hldGhlciBCU1MgaXMgaW4gYW4gRVNTLgorICogVGhpcyBpcyBkb25lIGRpZmZlcmVudGx5IGluIERNRyAoNjAgR0h6KSBhbmQgbm9uLURNRyBiYW5kcworICovCitzdGF0aWMgaW50IGJzc19pc19lc3Moc3RydWN0IHdwYV9ic3MgKmJzcykKK3sKKwlpZiAoYnNzX2lzX2RtZyhic3MpKSB7CisJCXJldHVybiAoYnNzLT5jYXBzICYgSUVFRTgwMjExX0NBUF9ETUdfTUFTSykgPT0KKwkJCUlFRUU4MDIxMV9DQVBfRE1HX0FQOworCX0KKworCXJldHVybiAoKGJzcy0+Y2FwcyAmIChJRUVFODAyMTFfQ0FQX0VTUyB8IElFRUU4MDIxMV9DQVBfSUJTUykpID09CisJCUlFRUU4MDIxMV9DQVBfRVNTKTsKK30KKworCiBzdGF0aWMgc3RydWN0IHdwYV9zc2lkICogd3BhX3NjYW5fcmVzX21hdGNoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJCSAgICBpbnQgaSwgc3RydWN0IHdwYV9ic3MgKmJzcywKIAkJCQkJICAgIHN0cnVjdCB3cGFfc3NpZCAqZ3JvdXApCkBAIC02NzUsNiArNzA5LDE2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCWlmIChkaXNhbGxvd2VkX2Jzc2lkKHdwYV9zLCBic3MtPmJzc2lkKSkgeworCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICIgICBza2lwIC0gQlNTSUQgZGlzYWxsb3dlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZGlzYWxsb3dlZF9zc2lkKHdwYV9zLCBic3MtPnNzaWQsIGJzcy0+c3NpZF9sZW4pKSB7CisJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIiAgIHNraXAgLSBTU0lEIGRpc2FsbG93ZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCiAJd3BhID0gd3BhX2llX2xlbiA+IDAgfHwgcnNuX2llX2xlbiA+IDA7CiAKIAlmb3IgKHNzaWQgPSBncm91cDsgc3NpZDsgc3NpZCA9IHNzaWQtPnBuZXh0KSB7CkBAIC03NTAsOSArNzk0LDggQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKGJzcy0+Y2FwcyAmIElFRUU4MDIxMV9DQVBfSUJTUykgewotCQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiICAgc2tpcCAtIElCU1MgKGFkaG9jKSAiCi0JCQkJIm5ldHdvcmsiKTsKKwkJaWYgKCFic3NfaXNfZXNzKGJzcykpIHsKKwkJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIiAgIHNraXAgLSBub3QgRVNTIG5ldHdvcmsiKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTg2Miw2ICs5MDUsOCBAQAogI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KIAkJcmV0dXJuOwogCX0KKworCXdwYV9zLT5zY2FuX2Zvcl9jb25uZWN0aW9uID0gMTsKIAl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgdGltZW91dF9zZWMsIHRpbWVvdXRfdXNlYyk7CiB9CiAKQEAgLTEwMTIsNiArMTA1NywxMiBAQAogCQlyZXR1cm4gMTsKIAl9CiAKKwlpZiAoY3VycmVudF9ic3MtPmxldmVsIDwgMCAmJiBjdXJyZW50X2Jzcy0+bGV2ZWwgPiBzZWxlY3RlZC0+bGV2ZWwpIHsKKwkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiU2tpcCByb2FtIC0gQ3VycmVudCBCU1MgaGFzIGJldHRlciAiCisJCQkic2lnbmFsIGxldmVsIik7CisJCXJldHVybiAwOworCX0KKwogCW1pbl9kaWZmID0gMjsKIAlpZiAoY3VycmVudF9ic3MtPmxldmVsIDwgMCkgewogCQlpZiAoY3VycmVudF9ic3MtPmxldmVsIDwgLTg1KQpAQCAtMTA4Miw3ICsxMTMzLDggQEAKIAkJCQkJCSAgIGRhdGEgPyAmZGF0YS0+c2Nhbl9pbmZvIDoKIAkJCQkJCSAgIE5VTEwsIDEpOwogCWlmIChzY2FuX3JlcyA9PSBOVUxMKSB7Ci0JCWlmICh3cGFfcy0+Y29uZi0+YXBfc2NhbiA9PSAyIHx8IGFwKQorCQlpZiAod3BhX3MtPmNvbmYtPmFwX3NjYW4gPT0gMiB8fCBhcCB8fAorCQkgICAgd3BhX3MtPnNjYW5fcmVzX2hhbmRsZXIgPT0gc2Nhbl9vbmx5X2hhbmRsZXIpCiAJCQlyZXR1cm4gLTE7CiAJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIkZhaWxlZCB0byBnZXQgc2NhbiByZXN1bHRzIC0gdHJ5ICIKIAkJCSJzY2FubmluZyBhZ2FpbiIpOwpAQCAtMTE3Nyw3ICsxMjI5LDcgQEAKIH0KIAogCi1pbnQgd3Bhc19zZWxlY3RfbmV0d29ya19mcm9tX2xhc3Rfc2NhbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQorc3RhdGljIGludCB3cGFzX3NlbGVjdF9uZXR3b3JrX2Zyb21fbGFzdF9zY2FuKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CiAJc3RydWN0IHdwYV9ic3MgKnNlbGVjdGVkOwogCXN0cnVjdCB3cGFfc3NpZCAqc3NpZCA9IE5VTEw7CkBAIC0xMzIwLDYgKzEzNzIsMjYgQEAKICNlbmRpZiAvKiBDT05GSUdfTk9fU0NBTl9QUk9DRVNTSU5HICovCiAKIAoraW50IHdwYV9zdXBwbGljYW50X2Zhc3RfYXNzb2NpYXRlKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisjaWZkZWYgQ09ORklHX05PX1NDQU5fUFJPQ0VTU0lORworCXJldHVybiAtMTsKKyNlbHNlIC8qIENPTkZJR19OT19TQ0FOX1BST0NFU1NJTkcgKi8KKwlzdHJ1Y3Qgb3NfdGltZSBub3c7CisKKwlpZiAod3BhX3MtPmxhc3Rfc2Nhbl9yZXNfdXNlZCA8PSAwKQorCQlyZXR1cm4gLTE7CisKKwlvc19nZXRfdGltZSgmbm93KTsKKwlpZiAobm93LnNlYyAtIHdwYV9zLT5sYXN0X3NjYW4uc2VjID4gNSkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkZhc3QgYXNzb2NpYXRlOiBPbGQgc2NhbiByZXN1bHRzIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gd3Bhc19zZWxlY3RfbmV0d29ya19mcm9tX2xhc3Rfc2Nhbih3cGFfcyk7CisjZW5kaWYgLyogQ09ORklHX05PX1NDQU5fUFJPQ0VTU0lORyAqLworfQorCiAjaWZkZWYgQ09ORklHX1dOTQogCiBzdGF0aWMgdm9pZCB3bm1fYnNzX2tlZXBfYWxpdmUodm9pZCAqZWxvb3BfY3R4LCB2b2lkICpzb2NrX2N0eCkKQEAgLTEzMjksMTIgKzE0MDEsMTYgQEAKIAlpZiAod3BhX3MtPndwYV9zdGF0ZSA8IFdQQV9BU1NPQ0lBVEVEKQogCQlyZXR1cm47CiAKLQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogU2VuZCBrZWVwLWFsaXZlIHRvIEFQICIgTUFDU1RSLAotCQkgICBNQUMyU1RSKHdwYV9zLT5ic3NpZCkpOwotCS8qIFRPRE86IGNvdWxkIHNraXAgdGhpcyBpZiBub3JtYWwgZGF0YSB0cmFmZmljIGhhcyBiZWVuIHNlbnQgKi8KLQkvKiBUT0RPOiBDb25zaWRlciB1c2luZyBzb21lIG1vcmUgYXBwcm9wcmlhdGUgZGF0YSBmcmFtZSBmb3IgdGhpcyAqLwotCWlmICh3cGFfcy0+bDIpCi0JCWwyX3BhY2tldF9zZW5kKHdwYV9zLT5sMiwgd3BhX3MtPmJzc2lkLCAweDA4MDAsICh1OCAqKSAiIiwgMCk7CisJaWYgKCF3cGFfcy0+bm9fa2VlcF9hbGl2ZSkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogU2VuZCBrZWVwLWFsaXZlIHRvIEFQICIgTUFDU1RSLAorCQkJICAgTUFDMlNUUih3cGFfcy0+YnNzaWQpKTsKKwkJLyogVE9ETzogY291bGQgc2tpcCB0aGlzIGlmIG5vcm1hbCBkYXRhIHRyYWZmaWMgaGFzIGJlZW4gc2VudCAqLworCQkvKiBUT0RPOiBDb25zaWRlciB1c2luZyBzb21lIG1vcmUgYXBwcm9wcmlhdGUgZGF0YSBmcmFtZSBmb3IKKwkJICogdGhpcyAqLworCQlpZiAod3BhX3MtPmwyKQorCQkJbDJfcGFja2V0X3NlbmQod3BhX3MtPmwyLCB3cGFfcy0+YnNzaWQsIDB4MDgwMCwKKwkJCQkgICAgICAgKHU4ICopICIiLCAwKTsKKwl9CiAKICNpZmRlZiBDT05GSUdfU01FCiAJaWYgKHdwYV9zLT5zbWUuYnNzX21heF9pZGxlX3BlcmlvZCkgewpAQCAtMTYzMiw3ICsxNzA4LDcgQEAKIAogCWlmICh3cGFfZHJ2X2dldF9ic3NpZCh3cGFfcywgYnNzaWQpIDwgMCkgewogCQl3cGFfZGJnKHdwYV9zLCBNU0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IEJTU0lEIik7Ci0JCXdwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZSgKKwkJd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUoCiAJCQl3cGFfcywgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwogCQlyZXR1cm47CiAJfQpAQCAtMTY1MCw3ICsxNzI2LDcgQEAKIAkJCXdwYV9jbGVhcl9rZXlzKHdwYV9zLCBic3NpZCk7CiAJCX0KIAkJaWYgKHdwYV9zdXBwbGljYW50X3NlbGVjdF9jb25maWcod3BhX3MpIDwgMCkgewotCQkJd3BhX3N1cHBsaWNhbnRfZGlzYXNzb2NpYXRlKAorCQkJd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUoCiAJCQkJd3BhX3MsIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTY2OSw4ICsxNzQ1LDEyIEBACiAJCQkJd3BhX3MtPmN1cnJlbnRfYnNzID0gYnNzOwogCQl9CiAKKyNpZmRlZiBBTkRST0lECisJCWlmICh3cGFfcy0+Y29uZi0+YXBfc2NhbiA9PSAxKSB7CisjZWxzZQogCQlpZiAod3BhX3MtPmNvbmYtPmFwX3NjYW4gPT0gMSAmJgogCQkgICAgd3BhX3MtPmRydl9mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfQlNTX1NFTEVDVElPTikgeworI2VuZGlmCiAJCQlpZiAod3BhX3N1cHBsaWNhbnRfYXNzb2NfdXBkYXRlX2llKHdwYV9zKSA8IDApCiAJCQkJd3BhX21zZyh3cGFfcywgTVNHX1dBUk5JTkcsCiAJCQkJCSJXUEEvUlNOIElFcyBub3QgdXBkYXRlZCIpOwpAQCAtMTc1Miw2ICsxODMyLDggQEAKIAkJZWFwb2xfc21fbm90aWZ5X2VhcF9zdWNjZXNzKHdwYV9zLT5lYXBvbCwgVFJVRSk7CiAJfQogCisJd3BhX3MtPmxhc3RfZWFwb2xfbWF0Y2hlc19ic3NpZCA9IDA7CisKIAlpZiAod3BhX3MtPnBlbmRpbmdfZWFwb2xfcngpIHsKIAkJc3RydWN0IG9zX3RpbWUgbm93LCBhZ2U7CiAJCW9zX2dldF90aW1lKCZub3cpOwpAQCAtMTgzOCw2ICsxOTIwLDI4IEBACiB9CiAKIAorc3RhdGljIGludCBjb3VsZF9iZV9wc2tfbWlzbWF0Y2goc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgdTE2IHJlYXNvbl9jb2RlLAorCQkJCSBpbnQgbG9jYWxseV9nZW5lcmF0ZWQpCit7CisJaWYgKHdwYV9zLT53cGFfc3RhdGUgIT0gV1BBXzRXQVlfSEFORFNIQUtFIHx8CisJICAgICF3cGFfa2V5X21nbXRfd3BhX3Bzayh3cGFfcy0+a2V5X21nbXQpKQorCQlyZXR1cm4gMDsgLyogTm90IGluIDQtd2F5IGhhbmRzaGFrZSB3aXRoIFBTSyAqLworCisJLyoKKwkgKiBJdCBsb29rcyBsaWtlIGNvbm5lY3Rpb24gd2FzIGxvc3Qgd2hpbGUgdHJ5aW5nIHRvIGdvIHRocm91Z2ggUFNLCisJICogNC13YXkgaGFuZHNoYWtlLiBGaWx0ZXIgb3V0IGtub3duIGRpc2Nvbm5lY3Rpb24gY2FzZXMgdGhhdCBhcmUgY2F1c2VkCisJICogYnkgc29tZXRoaW5nIGVsc2UgdGhhbiBQU0sgbWlzbWF0Y2ggdG8gYXZvaWQgY29uZnVzaW5nIHJlcG9ydHMuCisJICovCisKKwlpZiAobG9jYWxseV9nZW5lcmF0ZWQpIHsKKwkJaWYgKHJlYXNvbl9jb2RlID09IFdMQU5fUkVBU09OX0lFX0lOXzRXQVlfRElGRkVSUykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisKIHN0YXRpYyB2b2lkIHdwYV9zdXBwbGljYW50X2V2ZW50X2Rpc2Fzc29jX2ZpbmlzaChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCQkJIHUxNiByZWFzb25fY29kZSwKIAkJCQkJCSBpbnQgbG9jYWxseV9nZW5lcmF0ZWQpCkBAIC0xODYzLDggKzE5NjcsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHdwYV9zLT53cGFfc3RhdGUgPT0gV1BBXzRXQVlfSEFORFNIQUtFICYmCi0JICAgIHdwYV9rZXlfbWdtdF93cGFfcHNrKHdwYV9zLT5rZXlfbWdtdCkpIHsKKwlpZiAoY291bGRfYmVfcHNrX21pc21hdGNoKHdwYV9zLCByZWFzb25fY29kZSwgbG9jYWxseV9nZW5lcmF0ZWQpKSB7CiAJCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCAiV1BBOiA0LVdheSBIYW5kc2hha2UgZmFpbGVkIC0gIgogCQkJInByZS1zaGFyZWQga2V5IG1heSBiZSBpbmNvcnJlY3QiKTsKIAkJd3Bhc19hdXRoX2ZhaWxlZCh3cGFfcyk7CkBAIC0yMTIzLDEwICsyMjI2LDE0IEBACiAJCXJldHVybjsKIAlzd2l0Y2ggKGRhdGEtPnRkbHMub3BlcikgewogCWNhc2UgVERMU19SRVFVRVNUX1NFVFVQOgotCQl3cGFfdGRsc19zdGFydCh3cGFfcy0+d3BhLCBkYXRhLT50ZGxzLnBlZXIpOworCQl3cGFfdGRsc19yZW1vdmUod3BhX3MtPndwYSwgZGF0YS0+dGRscy5wZWVyKTsKKwkJaWYgKHdwYV90ZGxzX2lzX2V4dGVybmFsX3NldHVwKHdwYV9zLT53cGEpKQorCQkJd3BhX3RkbHNfc3RhcnQod3BhX3MtPndwYSwgZGF0YS0+dGRscy5wZWVyKTsKKwkJZWxzZQorCQkJd3BhX2Rydl90ZGxzX29wZXIod3BhX3MsIFRETFNfU0VUVVAsIGRhdGEtPnRkbHMucGVlcik7CiAJCWJyZWFrOwogCWNhc2UgVERMU19SRVFVRVNUX1RFQVJET1dOOgotCQl3cGFfdGRsc19zZW5kX3RlYXJkb3duKHdwYV9zLT53cGEsIGRhdGEtPnRkbHMucGVlciwKKwkJd3BhX3RkbHNfdGVhcmRvd25fbGluayh3cGFfcy0+d3BhLCBkYXRhLT50ZGxzLnBlZXIsCiAJCQkJICAgICAgIGRhdGEtPnRkbHMucmVhc29uX2NvZGUpOwogCQlicmVhazsKIAl9CkBAIC0yMTM0LDcgKzIyNDEsNyBAQAogI2VuZGlmIC8qIENPTkZJR19URExTICovCiAKIAotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCisjaWZkZWYgQ09ORklHX1dOTQogc3RhdGljIHZvaWQgd3BhX3N1cHBsaWNhbnRfZXZlbnRfd25tKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJICAgICB1bmlvbiB3cGFfZXZlbnRfZGF0YSAqZGF0YSkKIHsKQEAgLTIxNDYsMTEgKzIyNTMsMTEgQEAKIAkJCSAgICIoYWN0aW9uPSVkLCBpbnR2YWw9JWQpIiwKIAkJCSAgIGRhdGEtPndubS5zbGVlcF9hY3Rpb24sIGRhdGEtPndubS5zbGVlcF9pbnR2YWwpOwogCQlpZWVlODAyXzExX3NlbmRfd25tc2xlZXBfcmVxKHdwYV9zLCBkYXRhLT53bm0uc2xlZXBfYWN0aW9uLAotCQkJCQkgICAgIGRhdGEtPndubS5zbGVlcF9pbnR2YWwpOworCQkJCQkgICAgIGRhdGEtPndubS5zbGVlcF9pbnR2YWwsIE5VTEwpOwogCQlicmVhazsKIAl9CiB9Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KKyNlbmRpZiAvKiBDT05GSUdfV05NICovCiAKIAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFSCkBAIC0yMjczLDUwICsyMzgwLDYgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCB3bm1fYWN0aW9uX3J4KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHN0cnVjdCByeF9hY3Rpb24gKnJ4KQotewotCXU4IGFjdGlvbiwgbW9kZTsKLQljb25zdCB1OCAqcG9zLCAqZW5kOwotCi0JaWYgKHJ4LT5kYXRhID09IE5VTEwgfHwgcngtPmxlbiA9PSAwKQotCQlyZXR1cm47Ci0KLQlwb3MgPSByeC0+ZGF0YTsKLQllbmQgPSBwb3MgKyByeC0+bGVuOwotCWFjdGlvbiA9ICpwb3MrKzsKLQotCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBSWCBhY3Rpb24gJXUgZnJvbSAiIE1BQ1NUUiwKLQkJICAgYWN0aW9uLCBNQUMyU1RSKHJ4LT5zYSkpOwotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBXTk1fQlNTX1RSQU5TX01HTVRfUkVROgotCQlpZiAocG9zICsgNSA+IGVuZCkKLQkJCWJyZWFrOwotCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogQlNTIFRyYW5zaXRpb24gTWFuYWdlbWVudCAiCi0JCQkgICAiUmVxdWVzdDogZGlhbG9nX3Rva2VuPSV1IHJlcXVlc3RfbW9kZT0weCV4ICIKLQkJCSAgICJkaXNhc3NvY190aW1lcj0ldSB2YWxpZGl0eV9pbnRlcnZhbD0ldSIsCi0JCQkgICBwb3NbMF0sIHBvc1sxXSwgV1BBX0dFVF9MRTE2KHBvcyArIDIpLCBwb3NbNF0pOwotCQltb2RlID0gcG9zWzFdOwotCQlwb3MgKz0gNTsKLQkJaWYgKG1vZGUgJiAweDA4KQotCQkJcG9zICs9IDEyOyAvKiBCU1MgVGVybWluYXRpb24gRHVyYXRpb24gKi8KLQkJaWYgKG1vZGUgJiAweDEwKSB7Ci0JCQljaGFyIHVybFsyNTZdOwotCQkJaWYgKHBvcyArIDEgPiBlbmQgfHwgcG9zICsgMSArIHBvc1swXSA+IGVuZCkgewotCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBJbnZhbGlkIEJTUyAiCi0JCQkJCSAgICJUcmFuc2l0aW9uIE1hbmFnZW1lbnQgUmVxdWVzdCAiCi0JCQkJCSAgICIoVVJMKSIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJb3NfbWVtY3B5KHVybCwgcG9zICsgMSwgcG9zWzBdKTsKLQkJCXVybFtwb3NbMF1dID0gJ1wwJzsKLQkJCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCAiV05NOiBFU1MgRGlzYXNzb2NpYXRpb24gIgotCQkJCSJJbW1pbmVudCAtIHNlc3Npb25faW5mb191cmw9JXMiLCB1cmwpOwotCQl9Ci0JCWJyZWFrOwotCX0KLX0KLQotCiB2b2lkIHdwYV9zdXBwbGljYW50X2V2ZW50KHZvaWQgKmN0eCwgZW51bSB3cGFfZXZlbnRfdHlwZSBldmVudCwKIAkJCSAgdW5pb24gd3BhX2V2ZW50X2RhdGEgKmRhdGEpCiB7CkBAIC0yNTAzLDExICsyNTY2LDExIEBACiAJCXdwYV9zdXBwbGljYW50X2V2ZW50X3RkbHMod3BhX3MsIGRhdGEpOwogCQlicmVhazsKICNlbmRpZiAvKiBDT05GSUdfVERMUyAqLwotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCisjaWZkZWYgQ09ORklHX1dOTQogCWNhc2UgRVZFTlRfV05NOgogCQl3cGFfc3VwcGxpY2FudF9ldmVudF93bm0od3BhX3MsIGRhdGEpOwogCQlicmVhazsKLSNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExViAqLworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KICNpZmRlZiBDT05GSUdfSUVFRTgwMjExUgogCWNhc2UgRVZFTlRfRlRfUkVTUE9OU0U6CiAJCXdwYV9zdXBwbGljYW50X2V2ZW50X2Z0X3Jlc3BvbnNlKHdwYV9zLCBkYXRhKTsKQEAgLTI1MzAsOSArMjU5Myw4IEBACiAJCQkJZGF0YS0+YXNzb2NfcmVqZWN0LnN0YXR1c19jb2RlKTsKIAkJaWYgKHdwYV9zLT5kcnZfZmxhZ3MgJiBXUEFfRFJJVkVSX0ZMQUdTX1NNRSkKIAkJCXNtZV9ldmVudF9hc3NvY19yZWplY3Qod3BhX3MsIGRhdGEpOwotI2lmZGVmIEFORFJPSURfUDJQCi0jaWZkZWYgQ09ORklHX1AyUAogCQllbHNlIHsKKyNpZmRlZiBBTkRST0lEX1AyUAogCQkJaWYoIXdwYV9zLT5jdXJyZW50X3NzaWQpIHsKIAkJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgImN1cnJlbnRfc3NpZCA9PSBOVUxMIik7CiAJCQkJYnJlYWs7CkBAIC0yNTcxLDkgKzI2MzMsMTQgQEAKIAkJCQl3cGFfc3VwcGxpY2FudF9kaXNhYmxlX25ldHdvcmsod3BhX3MsIHdwYV9zLT5jdXJyZW50X3NzaWQpOwogCQkJCXdwYXNfcDJwX2dyb3VwX3JlbW92ZSh3cGFfcywgd3BhX3MtPmlmbmFtZSk7CiAJCQl9Ci0JCX0KLSNlbmRpZgorI2Vsc2UKKwkJCWNvbnN0IHU4ICpic3NpZCA9IGRhdGEtPmFzc29jX3JlamVjdC5ic3NpZDsKKwkJCWlmIChic3NpZCA9PSBOVUxMIHx8IGlzX3plcm9fZXRoZXJfYWRkcihic3NpZCkpCisJCQkJYnNzaWQgPSB3cGFfcy0+cGVuZGluZ19ic3NpZDsKKwkJCXdwYXNfY29ubmVjdGlvbl9mYWlsZWQod3BhX3MsIGJzc2lkKTsKKwkJCXdwYV9zdXBwbGljYW50X21hcmtfZGlzYXNzb2Mod3BhX3MpOwogI2VuZGlmIC8qIEFORFJPSURfUDJQICovCisJCX0KIAkJYnJlYWs7CiAJY2FzZSBFVkVOVF9BVVRIX1RJTUVEX09VVDoKIAkJaWYgKHdwYV9zLT5kcnZfZmxhZ3MgJiBXUEFfRFJJVkVSX0ZMQUdTX1NNRSkKQEAgLTI3NDIsMTIgKzI4MDksMTIgQEAKIAkJfQogI2VuZGlmIC8qIENPTkZJR19TTUUgKi8KICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCisjaWZkZWYgQ09ORklHX1dOTQogCQlpZiAoZGF0YS0+cnhfYWN0aW9uLmNhdGVnb3J5ID09IFdMQU5fQUNUSU9OX1dOTSkgewogCQkJaWVlZTgwMl8xMV9yeF93bm1fYWN0aW9uKHdwYV9zLCAmZGF0YS0+cnhfYWN0aW9uKTsKIAkJCWJyZWFrOwogCQl9Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KKyNlbmRpZiAvKiBDT05GSUdfV05NICovCiAjaWZkZWYgQ09ORklHX0dBUwogCQlpZiAoZGF0YS0+cnhfYWN0aW9uLmNhdGVnb3J5ID09IFdMQU5fQUNUSU9OX1BVQkxJQyAmJgogCQkgICAgZ2FzX3F1ZXJ5X3J4KHdwYV9zLT5nYXMsIGRhdGEtPnJ4X2FjdGlvbi5kYSwKQEAgLTI3NTYsMTAgKzI4MjMsNiBAQAogCQkJCSBkYXRhLT5yeF9hY3Rpb24uZnJlcSkgPT0gMCkKIAkJCWJyZWFrOwogI2VuZGlmIC8qIENPTkZJR19HQVMgKi8KLQkJaWYgKGRhdGEtPnJ4X2FjdGlvbi5jYXRlZ29yeSA9PSBXTEFOX0FDVElPTl9XTk0pIHsKLQkJCXdubV9hY3Rpb25fcngod3BhX3MsICZkYXRhLT5yeF9hY3Rpb24pOwotCQkJYnJlYWs7Ci0JCX0KICNpZmRlZiBDT05GSUdfVERMUwogCQlpZiAoZGF0YS0+cnhfYWN0aW9uLmNhdGVnb3J5ID09IFdMQU5fQUNUSU9OX1BVQkxJQyAmJgogCQkgICAgZGF0YS0+cnhfYWN0aW9uLmxlbiA+PSA0ICYmCkBAIC0zMDA5LDYgKzMwNzIsMTYgQEAKIAkJd3Bhc193cHNfc3RhcnRfcGJjKHdwYV9zLCBOVUxMLCAwKTsKICNlbmRpZiAvKiBDT05GSUdfV1BTICovCiAJCWJyZWFrOworCWNhc2UgRVZFTlRfQ09OTkVDVF9GQUlMRURfUkVBU09OOgorI2lmZGVmIENPTkZJR19BUAorCQlpZiAoIXdwYV9zLT5hcF9pZmFjZSB8fCAhZGF0YSkKKwkJCWJyZWFrOworCQlob3N0YXBkX2V2ZW50X2Nvbm5lY3RfZmFpbGVkX3JlYXNvbigKKwkJCXdwYV9zLT5hcF9pZmFjZS0+YnNzWzBdLAorCQkJZGF0YS0+Y29ubmVjdF9mYWlsZWRfcmVhc29uLmFkZHIsCisJCQlkYXRhLT5jb25uZWN0X2ZhaWxlZF9yZWFzb24uY29kZSk7CisjZW5kaWYgLyogQ09ORklHX0FQICovCisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCAiVW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9leGFtcGxlcy93cHMtbmZjLnB5IGIvd3BhX3N1cHBsaWNhbnQvZXhhbXBsZXMvd3BzLW5mYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YTZkYTVmCi0tLSAvZGV2L251bGwKKysrIGIvd3BhX3N1cHBsaWNhbnQvZXhhbXBsZXMvd3BzLW5mYy5weQpAQCAtMCwwICsxLDQwNSBAQAorIyEvdXNyL2Jpbi9weXRob24KKyMKKyMgRXhhbXBsZSBuZmNweSB0byB3cGFfc3VwcGxpY2FudCB3cmFwcGVyIGZvciBXUFMgTkZDIG9wZXJhdGlvbnMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisjCisjIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IFN0cmluZ0lPCisKK2ltcG9ydCBuZmMKK2ltcG9ydCBuZmMubmRlZgoraW1wb3J0IG5mYy5sbGNwCitpbXBvcnQgbmZjLmhhbmRvdmVyCisKK2ltcG9ydCBsb2dnaW5nCitsb2dnaW5nLmJhc2ljQ29uZmlnKCkKKworaW1wb3J0IHdwYWN0cmwKKword3Bhc19jdHJsID0gJy92YXIvcnVuL3dwYV9zdXBwbGljYW50JworCitkZWYgd3Bhc19jb25uZWN0KCk6CisgICAgaWZhY2VzID0gW10KKyAgICBpZiBvcy5wYXRoLmlzZGlyKHdwYXNfY3RybCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmYWNlcyA9IFtvcy5wYXRoLmpvaW4od3Bhc19jdHJsLCBpKSBmb3IgaSBpbiBvcy5saXN0ZGlyKHdwYXNfY3RybCldCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlcnJvcjoKKyAgICAgICAgICAgIHByaW50ICJDb3VsZCBub3QgZmluZCB3cGFfc3VwcGxpY2FudDogIiwgZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBpZiBsZW4oaWZhY2VzKSA8IDE6CisgICAgICAgIHByaW50ICJObyB3cGFfc3VwcGxpY2FudCBjb250cm9sIGludGVyZmFjZSBmb3VuZCIKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGZvciBjdHJsIGluIGlmYWNlczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3BhcyA9IHdwYWN0cmwuV1BBQ3RybChjdHJsKQorICAgICAgICAgICAgcmV0dXJuIHdwYXMKKyAgICAgICAgZXhjZXB0IHdwYWN0cmwuZXJyb3IsIGVycm9yOgorICAgICAgICAgICAgcHJpbnQgIkVycm9yOiAiLCBlcnJvcgorICAgICAgICAgICAgcGFzcworICAgIHJldHVybiBOb25lCisKKworZGVmIHdwYXNfdGFnX3JlYWQobWVzc2FnZSk6CisgICAgd3BhcyA9IHdwYXNfY29ubmVjdCgpCisgICAgaWYgKHdwYXMgPT0gTm9uZSk6CisgICAgICAgIHJldHVybgorICAgIHByaW50IHdwYXMucmVxdWVzdCgiV1BTX05GQ19UQUdfUkVBRCAiICsgbWVzc2FnZS5lbmNvZGUoImhleCIpKQorCisKK2RlZiB3cGFzX2dldF9jb25maWdfdG9rZW4oKToKKyAgICB3cGFzID0gd3Bhc19jb25uZWN0KCkKKyAgICBpZiAod3BhcyA9PSBOb25lKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gd3Bhcy5yZXF1ZXN0KCJXUFNfTkZDX0NPTkZJR19UT0tFTiBOREVGIikucnN0cmlwKCkuZGVjb2RlKCJoZXgiKQorCisKK2RlZiB3cGFzX2dldF9lcl9jb25maWdfdG9rZW4odXVpZCk6CisgICAgd3BhcyA9IHdwYXNfY29ubmVjdCgpCisgICAgaWYgKHdwYXMgPT0gTm9uZSk6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIHdwYXMucmVxdWVzdCgiV1BTX0VSX05GQ19DT05GSUdfVE9LRU4gTkRFRiAiICsgdXVpZCkucnN0cmlwKCkuZGVjb2RlKCJoZXgiKQorCisKK2RlZiB3cGFzX2dldF9wYXNzd29yZF90b2tlbigpOgorICAgIHdwYXMgPSB3cGFzX2Nvbm5lY3QoKQorICAgIGlmICh3cGFzID09IE5vbmUpOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiB3cGFzLnJlcXVlc3QoIldQU19ORkNfVE9LRU4gTkRFRiIpLnJzdHJpcCgpLmRlY29kZSgiaGV4IikKKworCitkZWYgd3Bhc19nZXRfaGFuZG92ZXJfcmVxKCk6CisgICAgd3BhcyA9IHdwYXNfY29ubmVjdCgpCisgICAgaWYgKHdwYXMgPT0gTm9uZSk6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIHdwYXMucmVxdWVzdCgiTkZDX0dFVF9IQU5ET1ZFUl9SRVEgTkRFRiBXUFMtQ1IiKS5yc3RyaXAoKS5kZWNvZGUoImhleCIpCisKKworZGVmIHdwYXNfZ2V0X2hhbmRvdmVyX3NlbCh1dWlkKToKKyAgICB3cGFzID0gd3Bhc19jb25uZWN0KCkKKyAgICBpZiAod3BhcyA9PSBOb25lKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBpZiB1dWlkIGlzIE5vbmU6CisgICAgICAgIHJldHVybiB3cGFzLnJlcXVlc3QoIk5GQ19HRVRfSEFORE9WRVJfU0VMIE5ERUYgV1BTLUNSIikucnN0cmlwKCkuZGVjb2RlKCJoZXgiKQorICAgIHJldHVybiB3cGFzLnJlcXVlc3QoIk5GQ19HRVRfSEFORE9WRVJfU0VMIE5ERUYgV1BTLUNSICIgKyB1dWlkKS5yc3RyaXAoKS5kZWNvZGUoImhleCIpCisKKworZGVmIHdwYXNfcmVwb3J0X2hhbmRvdmVyKHJlcSwgc2VsLCB0eXBlKToKKyAgICB3cGFzID0gd3Bhc19jb25uZWN0KCkKKyAgICBpZiAod3BhcyA9PSBOb25lKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gd3Bhcy5yZXF1ZXN0KCJORkNfUkVQT1JUX0hBTkRPVkVSICIgKyB0eXBlICsgIiBXUFMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIocmVxKS5lbmNvZGUoImhleCIpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cihzZWwpLmVuY29kZSgiaGV4IikpCisKKworY2xhc3MgSGFuZG92ZXJTZXJ2ZXIobmZjLmhhbmRvdmVyLkhhbmRvdmVyU2VydmVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cGVyKEhhbmRvdmVyU2VydmVyLCBzZWxmKS5fX2luaXRfXygpCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpOgorICAgICAgICBwcmludCAiSGFuZG92ZXJTZXJ2ZXIgLSByZXF1ZXN0IHJlY2VpdmVkIgorICAgICAgICBwcmludCAiUGFyc2VkIGhhbmRvdmVyIHJlcXVlc3Q6ICIgKyByZXF1ZXN0LnByZXR0eSgpCisKKyAgICAgICAgc2VsID0gbmZjLm5kZWYuSGFuZG92ZXJTZWxlY3RNZXNzYWdlKHZlcnNpb249IjEuMiIpCisKKyAgICAgICAgZm9yIGNhcnJpZXIgaW4gcmVxdWVzdC5jYXJyaWVyczoKKyAgICAgICAgICAgIHByaW50ICJSZW1vdGUgY2FycmllciB0eXBlOiAiICsgY2Fycmllci50eXBlCisgICAgICAgICAgICBpZiBjYXJyaWVyLnR5cGUgPT0gImFwcGxpY2F0aW9uL3ZuZC53ZmEud3NjIjoKKyAgICAgICAgICAgICAgICBwcmludCAiV1BTIGNhcnJpZXIgdHlwZSBtYXRjaCAtIGFkZCBXUFMgY2FycmllciByZWNvcmQiCisgICAgICAgICAgICAgICAgc2VsZi5yZWNlaXZlZF9jYXJyaWVyID0gY2Fycmllci5yZWNvcmQKKyAgICAgICAgICAgICAgICBkYXRhID0gd3Bhc19nZXRfaGFuZG92ZXJfc2VsKHNlbGYudXVpZCkKKyAgICAgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJDb3VsZCBub3QgZ2V0IGhhbmRvdmVyIHNlbGVjdCBjYXJyaWVyIHJlY29yZCBmcm9tIHdwYV9zdXBwbGljYW50IgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHByaW50ICJIYW5kb3ZlciBzZWxlY3QgY2FycmllciByZWNvcmQgZnJvbSB3cGFfc3VwcGxpY2FudDoiCisgICAgICAgICAgICAgICAgcHJpbnQgZGF0YS5lbmNvZGUoImhleCIpCisgICAgICAgICAgICAgICAgc2VsZi5zZW50X2NhcnJpZXIgPSBkYXRhCisKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmZjLm5kZWYuTWVzc2FnZShkYXRhKTsKKyAgICAgICAgICAgICAgICBzZWwuYWRkX2NhcnJpZXIobWVzc2FnZVswXSwgImFjdGl2ZSIsIG1lc3NhZ2VbMTpdKQorCisgICAgICAgIHByaW50ICJIYW5kb3ZlciBzZWxlY3Q6IgorICAgICAgICBwcmludCBzZWwucHJldHR5KCkKKyAgICAgICAgcHJpbnQgc3RyKHNlbCkuZW5jb2RlKCJoZXgiKQorCisgICAgICAgIHByaW50ICJTZW5kaW5nIGhhbmRvdmVyIHNlbGVjdCIKKyAgICAgICAgcmV0dXJuIHNlbAorCisKK2RlZiB3cHNfaGFuZG92ZXJfcmVzcChwZWVyLCB1dWlkKToKKyAgICBpZiB1dWlkIGlzIE5vbmU6CisgICAgICAgIHByaW50ICJUcnlpbmcgdG8gaGFuZGxlIFdQUyBoYW5kb3ZlciIKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiVHJ5aW5nIHRvIGhhbmRsZSBXUFMgaGFuZG92ZXIgd2l0aCBBUCAiICsgdXVpZAorCisgICAgc3J2ID0gSGFuZG92ZXJTZXJ2ZXIoKQorICAgIHNydi5zZW50X2NhcnJpZXIgPSBOb25lCisgICAgc3J2LnV1aWQgPSB1dWlkCisKKyAgICBuZmMubGxjcC5hY3RpdmF0ZShwZWVyKTsKKworICAgIHRyeToKKyAgICAgICAgcHJpbnQgIlRyeWluZyBoYW5kb3ZlciI7CisgICAgICAgIHNydi5zdGFydCgpCisgICAgICAgIHByaW50ICJXYWl0IGZvciBkaXNjb25uZWN0IgorICAgICAgICB3aGlsZSBuZmMubGxjcC5jb25uZWN0ZWQoKToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICBwcmludCAiRGlzY29ubmVjdGVkIGFmdGVyIGhhbmRvdmVyIgorICAgIGV4Y2VwdCBuZmMubGxjcC5Db25uZWN0UmVmdXNlZDoKKyAgICAgICAgcHJpbnQgIkhhbmRvdmVyIGNvbm5lY3Rpb24gcmVmdXNlZCIKKyAgICAgICAgbmZjLmxsY3Auc2h1dGRvd24oKQorICAgICAgICByZXR1cm4KKworICAgIGlmIHNydi5zZW50X2NhcnJpZXI6CisgICAgICAgIHdwYXNfcmVwb3J0X2hhbmRvdmVyKHNydi5yZWNlaXZlZF9jYXJyaWVyLCBzcnYuc2VudF9jYXJyaWVyLCAiUkVTUCIpCisKKyAgICBwcmludCAiUmVtb3ZlIHBlZXIiCisgICAgbmZjLmxsY3Auc2h1dGRvd24oKQorICAgIHByaW50ICJEb25lIHdpdGggaGFuZG92ZXIiCisgICAgdGltZS5zbGVlcCgxKQorCisKK2RlZiB3cHNfaGFuZG92ZXJfaW5pdChwZWVyKToKKyAgICBwcmludCAiVHJ5aW5nIHRvIGluaXRpYXRlIFdQUyBoYW5kb3ZlciIKKworICAgIGRhdGEgPSB3cGFzX2dldF9oYW5kb3Zlcl9yZXEoKQorICAgIGlmIChkYXRhID09IE5vbmUpOgorICAgICAgICBwcmludCAiQ291bGQgbm90IGdldCBoYW5kb3ZlciByZXF1ZXN0IGNhcnJpZXIgcmVjb3JkIGZyb20gd3BhX3N1cHBsaWNhbnQiCisgICAgICAgIHJldHVybgorICAgIHByaW50ICJIYW5kb3ZlciByZXF1ZXN0IGNhcnJpZXIgcmVjb3JkIGZyb20gd3BhX3N1cHBsaWNhbnQ6ICIgKyBkYXRhLmVuY29kZSgiaGV4IikKKyAgICByZWNvcmQgPSBuZmMubmRlZi5SZWNvcmQoKQorICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQorICAgIHJlY29yZC5fcmVhZChmKQorICAgIHJlY29yZCA9IG5mYy5uZGVmLkhhbmRvdmVyQ2FycmllclJlY29yZChyZWNvcmQpCisgICAgcHJpbnQgIlBhcnNlZCBoYW5kb3ZlciByZXF1ZXN0IGNhcnJpZXIgcmVjb3JkOiIKKyAgICBwcmludCByZWNvcmQucHJldHR5KCkKKworICAgIG1lc3NhZ2UgPSBuZmMubmRlZi5IYW5kb3ZlclJlcXVlc3RNZXNzYWdlKHZlcnNpb249IjEuMiIpCisgICAgbWVzc2FnZS5ub25jZSA9IHJhbmRvbS5yYW5kaW50KDAsIDB4ZmZmZikKKyAgICBtZXNzYWdlLmFkZF9jYXJyaWVyKHJlY29yZCwgImFjdGl2ZSIpCisKKyAgICBwcmludCAiSGFuZG92ZXIgcmVxdWVzdDoiCisgICAgcHJpbnQgbWVzc2FnZS5wcmV0dHkoKQorCisgICAgbmZjLmxsY3AuYWN0aXZhdGUocGVlcik7CisKKyAgICBjbGllbnQgPSBuZmMuaGFuZG92ZXIuSGFuZG92ZXJDbGllbnQoKQorICAgIHRyeToKKyAgICAgICAgcHJpbnQgIlRyeWluZyBoYW5kb3ZlciI7CisgICAgICAgIGNsaWVudC5jb25uZWN0KCkKKyAgICAgICAgcHJpbnQgIkNvbm5lY3RlZCBmb3IgaGFuZG92ZXIiCisgICAgZXhjZXB0IG5mYy5sbGNwLkNvbm5lY3RSZWZ1c2VkOgorICAgICAgICBwcmludCAiSGFuZG92ZXIgY29ubmVjdGlvbiByZWZ1c2VkIgorICAgICAgICBuZmMubGxjcC5zaHV0ZG93bigpCisgICAgICAgIGNsaWVudC5jbG9zZSgpCisgICAgICAgIHJldHVybgorCisgICAgcHJpbnQgIlNlbmRpbmcgaGFuZG92ZXIgcmVxdWVzdCIKKworICAgIGlmIG5vdCBjbGllbnQuc2VuZChtZXNzYWdlKToKKyAgICAgICAgcHJpbnQgIkZhaWxlZCB0byBzZW5kIGhhbmRvdmVyIHJlcXVlc3QiCisKKyAgICBwcmludCAiUmVjZWl2aW5nIGhhbmRvdmVyIHJlc3BvbnNlIgorICAgIG1lc3NhZ2UgPSBjbGllbnQuX3JlY3YoKQorICAgIGlmIG1lc3NhZ2UgaXMgTm9uZToKKyAgICAgICAgcHJpbnQgIk5vIHJlc3BvbnNlIHJlY2VpdmVkIgorICAgICAgICBuZmMubGxjcC5zaHV0ZG93bigpCisgICAgICAgIGNsaWVudC5jbG9zZSgpCisgICAgICAgIHJldHVybgorICAgIGlmIG1lc3NhZ2UudHlwZSAhPSAidXJuOm5mYzp3a3Q6SHMiOgorICAgICAgICBwcmludCAiUmVzcG9uc2Ugd2FzIG5vdCBIcyAtIHJlY2VpdmVkOiAiICsgbWVzc2FnZS50eXBlCisgICAgICAgIG5mYy5sbGNwLnNodXRkb3duKCkKKyAgICAgICAgY2xpZW50LmNsb3NlKCkKKyAgICAgICAgcmV0dXJuCisKKyAgICBwcmludCAiUmVjZWl2ZWQgbWVzc2FnZSIKKyAgICBwcmludCBtZXNzYWdlLnByZXR0eSgpCisgICAgbWVzc2FnZSA9IG5mYy5uZGVmLkhhbmRvdmVyU2VsZWN0TWVzc2FnZShtZXNzYWdlKQorICAgIHByaW50ICJIYW5kb3ZlciBzZWxlY3QgcmVjZWl2ZWQiCisgICAgcHJpbnQgbWVzc2FnZS5wcmV0dHkoKQorCisgICAgZm9yIGNhcnJpZXIgaW4gbWVzc2FnZS5jYXJyaWVyczoKKyAgICAgICAgcHJpbnQgIlJlbW90ZSBjYXJyaWVyIHR5cGU6ICIgKyBjYXJyaWVyLnR5cGUKKyAgICAgICAgaWYgY2Fycmllci50eXBlID09ICJhcHBsaWNhdGlvbi92bmQud2ZhLndzYyI6CisgICAgICAgICAgICBwcmludCAiV1BTIGNhcnJpZXIgdHlwZSBtYXRjaCAtIHNlbmQgdG8gd3BhX3N1cHBsaWNhbnQiCisgICAgICAgICAgICB3cGFzX3JlcG9ydF9oYW5kb3ZlcihkYXRhLCBjYXJyaWVyLnJlY29yZCwgIklOSVQiKQorICAgICAgICAgICAgd2lmaSA9IG5mYy5uZGVmLldpZmlDb25maWdSZWNvcmQoY2Fycmllci5yZWNvcmQpCisgICAgICAgICAgICBwcmludCB3aWZpLnByZXR0eSgpCisKKyAgICBwcmludCAiUmVtb3ZlIHBlZXIiCisgICAgbmZjLmxsY3Auc2h1dGRvd24oKQorICAgIGNsaWVudC5jbG9zZSgpCisgICAgcHJpbnQgIkRvbmUgd2l0aCBoYW5kb3ZlciIKKworCitkZWYgd3BzX3RhZ19yZWFkKHRhZyk6CisgICAgaWYgbGVuKHRhZy5uZGVmLm1lc3NhZ2UpOgorICAgICAgICBtZXNzYWdlID0gbmZjLm5kZWYuTWVzc2FnZSh0YWcubmRlZi5tZXNzYWdlKQorICAgICAgICBwcmludCAibWVzc2FnZSB0eXBlICIgKyBtZXNzYWdlLnR5cGUKKworICAgICAgICBmb3IgcmVjb3JkIGluIG1lc3NhZ2U6CisgICAgICAgICAgICBwcmludCAicmVjb3JkIHR5cGUgIiArIHJlY29yZC50eXBlCisgICAgICAgICAgICBpZiByZWNvcmQudHlwZSA9PSAiYXBwbGljYXRpb24vdm5kLndmYS53c2MiOgorICAgICAgICAgICAgICAgIHByaW50ICJXUFMgdGFnIC0gc2VuZCB0byB3cGFfc3VwcGxpY2FudCIKKyAgICAgICAgICAgICAgICB3cGFzX3RhZ19yZWFkKHRhZy5uZGVmLm1lc3NhZ2UpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiRW1wdHkgdGFnIgorCisgICAgcHJpbnQgIlJlbW92ZSB0YWciCisgICAgd2hpbGUgdGFnLmlzX3ByZXNlbnQ6CisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisKK2RlZiB3cHNfd3JpdGVfY29uZmlnX3RhZyhjbGYpOgorICAgIHByaW50ICJXcml0ZSBXUFMgY29uZmlnIHRva2VuIgorICAgIGRhdGEgPSB3cGFzX2dldF9jb25maWdfdG9rZW4oKQorICAgIGlmIChkYXRhID09IE5vbmUpOgorICAgICAgICBwcmludCAiQ291bGQgbm90IGdldCBXUFMgY29uZmlnIHRva2VuIGZyb20gd3BhX3N1cHBsaWNhbnQiCisgICAgICAgIHJldHVybgorCisgICAgcHJpbnQgIlRvdWNoIGFuIE5GQyB0YWciCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdGFnID0gY2xmLnBvbGwoKQorICAgICAgICBpZiB0YWcgPT0gTm9uZToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYnJlYWsKKworICAgIHByaW50ICJUYWcgZm91bmQgLSB3cml0aW5nIgorICAgIHRhZy5uZGVmLm1lc3NhZ2UgPSBkYXRhCisgICAgcHJpbnQgIkRvbmUgLSByZW1vdmUgdGFnIgorICAgIHdoaWxlIHRhZy5pc19wcmVzZW50OgorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworCitkZWYgd3BzX3dyaXRlX2VyX2NvbmZpZ190YWcoY2xmLCB1dWlkKToKKyAgICBwcmludCAiV3JpdGUgV1BTIEVSIGNvbmZpZyB0b2tlbiIKKyAgICBkYXRhID0gd3Bhc19nZXRfZXJfY29uZmlnX3Rva2VuKHV1aWQpCisgICAgaWYgKGRhdGEgPT0gTm9uZSk6CisgICAgICAgIHByaW50ICJDb3VsZCBub3QgZ2V0IFdQUyBjb25maWcgdG9rZW4gZnJvbSB3cGFfc3VwcGxpY2FudCIKKyAgICAgICAgcmV0dXJuCisKKyAgICBwcmludCAiVG91Y2ggYW4gTkZDIHRhZyIKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0YWcgPSBjbGYucG9sbCgpCisgICAgICAgIGlmIHRhZyA9PSBOb25lOgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBicmVhaworCisgICAgcHJpbnQgIlRhZyBmb3VuZCAtIHdyaXRpbmciCisgICAgdGFnLm5kZWYubWVzc2FnZSA9IGRhdGEKKyAgICBwcmludCAiRG9uZSAtIHJlbW92ZSB0YWciCisgICAgd2hpbGUgdGFnLmlzX3ByZXNlbnQ6CisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisKK2RlZiB3cHNfd3JpdGVfcGFzc3dvcmRfdGFnKGNsZik6CisgICAgcHJpbnQgIldyaXRlIFdQUyBwYXNzd29yZCB0b2tlbiIKKyAgICBkYXRhID0gd3Bhc19nZXRfcGFzc3dvcmRfdG9rZW4oKQorICAgIGlmIChkYXRhID09IE5vbmUpOgorICAgICAgICBwcmludCAiQ291bGQgbm90IGdldCBXUFMgcGFzc3dvcmQgdG9rZW4gZnJvbSB3cGFfc3VwcGxpY2FudCIKKyAgICAgICAgcmV0dXJuCisKKyAgICBwcmludCAiVG91Y2ggYW4gTkZDIHRhZyIKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0YWcgPSBjbGYucG9sbCgpCisgICAgICAgIGlmIHRhZyA9PSBOb25lOgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBicmVhaworCisgICAgcHJpbnQgIlRhZyBmb3VuZCAtIHdyaXRpbmciCisgICAgdGFnLm5kZWYubWVzc2FnZSA9IGRhdGEKKyAgICBwcmludCAiRG9uZSAtIHJlbW92ZSB0YWciCisgICAgd2hpbGUgdGFnLmlzX3ByZXNlbnQ6CisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisKK2RlZiBmaW5kX3BlZXIoY2xmKToKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBpZiBuZmMubGxjcC5jb25uZWN0ZWQoKToKKyAgICAgICAgICAgIHByaW50ICJMTENQIGNvbm5lY3RlZCIKKyAgICAgICAgZ2VuZXJhbF9ieXRlcyA9IG5mYy5sbGNwLnN0YXJ0dXAoe30pCisgICAgICAgIHBlZXIgPSBjbGYubGlzdGVuKG9yZChvcy51cmFuZG9tKDEpKSArIDI1MCwgZ2VuZXJhbF9ieXRlcykKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwZWVyLCBuZmMuREVQKToKKyAgICAgICAgICAgIHByaW50ICJsaXN0ZW4gLT4gREVQIjsKKyAgICAgICAgICAgIGlmIHBlZXIuZ2VuZXJhbF9ieXRlcy5zdGFydHN3aXRoKCJGZm0iKToKKyAgICAgICAgICAgICAgICBwcmludCAiRm91bmQgREVQIgorICAgICAgICAgICAgICAgIHJldHVybiBwZWVyCisgICAgICAgICAgICBwcmludCAibWlzbWF0Y2ggaW4gZ2VuZXJhbF9ieXRlcyIKKyAgICAgICAgICAgIHByaW50IHBlZXIuZ2VuZXJhbF9ieXRlcworCisgICAgICAgIHBlZXIgPSBjbGYucG9sbChnZW5lcmFsX2J5dGVzKQorICAgICAgICBpZiBpc2luc3RhbmNlKHBlZXIsIG5mYy5ERVApOgorICAgICAgICAgICAgcHJpbnQgInBvbGwgLT4gREVQIjsKKyAgICAgICAgICAgIGlmIHBlZXIuZ2VuZXJhbF9ieXRlcy5zdGFydHN3aXRoKCJGZm0iKToKKyAgICAgICAgICAgICAgICBwcmludCAiRm91bmQgREVQIgorICAgICAgICAgICAgICAgIHJldHVybiBwZWVyCisgICAgICAgICAgICBwcmludCAibWlzbWF0Y2ggaW4gZ2VuZXJhbF9ieXRlcyIKKyAgICAgICAgICAgIHByaW50IHBlZXIuZ2VuZXJhbF9ieXRlcworCisgICAgICAgIGlmIHBlZXI6CisgICAgICAgICAgICBwcmludCAiRm91bmQgdGFnIgorICAgICAgICAgICAgcmV0dXJuIHBlZXIKKworCitkZWYgbWFpbigpOgorICAgIGNsZiA9IG5mYy5Db250YWN0bGVzc0Zyb250ZW5kKCkKKworICAgIHRyeToKKyAgICAgICAgYXJnX3V1aWQgPSBOb25lCisgICAgICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgorICAgICAgICAgICAgYXJnX3V1aWQgPSBzeXMuYXJndlsxXQorCisgICAgICAgIGlmIGxlbihzeXMuYXJndikgPiAxIGFuZCBzeXMuYXJndlsxXSA9PSAid3JpdGUtY29uZmlnIjoKKyAgICAgICAgICAgIHdwc193cml0ZV9jb25maWdfdGFnKGNsZikKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQKKworICAgICAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMiBhbmQgc3lzLmFyZ3ZbMV0gPT0gIndyaXRlLWVyLWNvbmZpZyI6CisgICAgICAgICAgICB3cHNfd3JpdGVfZXJfY29uZmlnX3RhZyhjbGYsIHN5cy5hcmd2WzJdKQorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorCisgICAgICAgIGlmIGxlbihzeXMuYXJndikgPiAxIGFuZCBzeXMuYXJndlsxXSA9PSAid3JpdGUtcGFzc3dvcmQiOgorICAgICAgICAgICAgd3BzX3dyaXRlX3Bhc3N3b3JkX3RhZyhjbGYpCisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHByaW50ICJXYWl0aW5nIGZvciBhIHRhZyBvciBwZWVyIHRvIGJlIHRvdWNoZWQiCisKKyAgICAgICAgICAgIHRhZyA9IGZpbmRfcGVlcihjbGYpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRhZywgbmZjLkRFUCk6CisgICAgICAgICAgICAgICAgaWYgYXJnX3V1aWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgd3BzX2hhbmRvdmVyX2luaXQodGFnKQorICAgICAgICAgICAgICAgIGVsaWYgYXJnX3V1aWQgaXMgImFwIjoKKyAgICAgICAgICAgICAgICAgICAgd3BzX2hhbmRvdmVyX3Jlc3AodGFnLCBOb25lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHdwc19oYW5kb3Zlcl9yZXNwKHRhZywgYXJnX3V1aWQpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgdGFnLm5kZWY6CisgICAgICAgICAgICAgICAgd3BzX3RhZ19yZWFkKHRhZykKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBwcmludCAiTm90IGFuIE5ERUYgdGFnIC0gcmVtb3ZlIHRhZyIKKyAgICAgICAgICAgIHdoaWxlIHRhZy5pc19wcmVzZW50OgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisgICAgZmluYWxseToKKyAgICAgICAgY2xmLmNsb3NlKCkKKworICAgIHJhaXNlIFN5c3RlbUV4aXQKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2dhc19xdWVyeS5jIGIvd3BhX3N1cHBsaWNhbnQvZ2FzX3F1ZXJ5LmMKaW5kZXggZWZhOWJlOC4uMjdiY2M3YSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvZ2FzX3F1ZXJ5LmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvZ2FzX3F1ZXJ5LmMKQEAgLTE5LDkgKzE5LDEzIEBACiAjaW5jbHVkZSAiZ2FzX3F1ZXJ5LmgiCiAKIAorLyoqIEdBUyBxdWVyeSB0aW1lb3V0IGluIHNlY29uZHMgKi8KICNkZWZpbmUgR0FTX1FVRVJZX1RJTUVPVVRfUEVSSU9EIDUKIAogCisvKioKKyAqIHN0cnVjdCBnYXNfcXVlcnlfcGVuZGluZyAtIFBlbmRpbmcgR0FTIHF1ZXJ5CisgKi8KIHN0cnVjdCBnYXNfcXVlcnlfcGVuZGluZyB7CiAJc3RydWN0IGRsX2xpc3QgbGlzdDsKIAl1OCBhZGRyW0VUSF9BTEVOXTsKQEAgLTQwLDYgKzQ0LDkgQEAKIAl2b2lkICpjdHg7CiB9OwogCisvKioKKyAqIHN0cnVjdCBnYXNfcXVlcnkgLSBJbnRlcm5hbCBHQVMgcXVlcnkgZGF0YQorICovCiBzdHJ1Y3QgZ2FzX3F1ZXJ5IHsKIAlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zOwogCXN0cnVjdCBkbF9saXN0IHBlbmRpbmc7IC8qIHN0cnVjdCBnYXNfcXVlcnlfcGVuZGluZyAqLwpAQCAtNTAsNiArNTcsMTEgQEAKIHN0YXRpYyB2b2lkIGdhc19xdWVyeV90aW1lb3V0KHZvaWQgKmVsb29wX2RhdGEsIHZvaWQgKnVzZXJfY3R4KTsKIAogCisvKioKKyAqIGdhc19xdWVyeV9pbml0IC0gSW5pdGlhbGl6ZSBHQVMgcXVlcnkgY29tcG9uZW50CisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogUmV0dXJuczogUG9pbnRlciB0byBHQVMgcXVlcnkgZGF0YSBvciAlTlVMTCBvbiBmYWlsdXJlCisgKi8KIHN0cnVjdCBnYXNfcXVlcnkgKiBnYXNfcXVlcnlfaW5pdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQogewogCXN0cnVjdCBnYXNfcXVlcnkgKmdhczsKQEAgLTgyLDYgKzk0LDEwIEBACiB9CiAKIAorLyoqCisgKiBnYXNfcXVlcnlfZGVpbml0IC0gRGVpbml0aWFsaXplIEdBUyBxdWVyeSBjb21wb25lbnQKKyAqIEBnYXM6IEdBUyBxdWVyeSBkYXRhIGZyb20gZ2FzX3F1ZXJ5X2luaXQoKQorICovCiB2b2lkIGdhc19xdWVyeV9kZWluaXQoc3RydWN0IGdhc19xdWVyeSAqZ2FzKQogewogCXN0cnVjdCBnYXNfcXVlcnlfcGVuZGluZyAqcXVlcnksICpuZXh0OwpAQCAtMjc0LDYgKzI5MCwxNyBAQAogfQogCiAKKy8qKgorICogZ2FzX3F1ZXJ5X3J4IC0gSW5kaWNhdGUgcmVjZXB0aW9uIG9mIGEgUHVibGljIEFjdGlvbiBmcmFtZQorICogQGdhczogR0FTIHF1ZXJ5IGRhdGEgZnJvbSBnYXNfcXVlcnlfaW5pdCgpCisgKiBAZGE6IERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIG9mIHRoZSBBY3Rpb24gZnJhbWUKKyAqIEBzYTogU291cmNlIE1BQyBhZGRyZXNzIG9mIHRoZSBBY3Rpb24gZnJhbWUKKyAqIEBic3NpZDogQlNTSUQgb2YgdGhlIEFjdGlvbiBmcmFtZQorICogQGRhdGE6IFBheWxvYWQgb2YgdGhlIEFjdGlvbiBmcmFtZQorICogQGxlbjogTGVuZ3RoIG9mIEBkYXRhCisgKiBAZnJlcTogRnJlcXVlbmN5IChpbiBNSHopIG9uIHdoaWNoIHRoZSBmcmFtZSB3YXMgcmVjZWl2ZWQKKyAqIFJldHVybnM6IDAgaWYgdGhlIFB1YmxpYyBBY3Rpb24gZnJhbWUgd2FzIGEgR0FTIGZyYW1lIG9yIC0xIGlmIG5vdAorICovCiBpbnQgZ2FzX3F1ZXJ5X3J4KHN0cnVjdCBnYXNfcXVlcnkgKmdhcywgY29uc3QgdTggKmRhLCBjb25zdCB1OCAqc2EsCiAJCSBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpkYXRhLCBzaXplX3QgbGVuLCBpbnQgZnJlcSkKIHsKQEAgLTQxNCw2ICs0NDEsMTYgQEAKIH0KIAogCisvKioKKyAqIGdhc19xdWVyeV9yZXEgLSBSZXF1ZXN0IGEgR0FTIHF1ZXJ5CisgKiBAZ2FzOiBHQVMgcXVlcnkgZGF0YSBmcm9tIGdhc19xdWVyeV9pbml0KCkKKyAqIEBkc3Q6IERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIGZvciB0aGUgcXVlcnkKKyAqIEBmcmVxOiBGcmVxdWVuY3kgKGluIE1IeikgZm9yIHRoZSBjaGFubmVsIG9uIHdoaWNoIHRvIHNlbmQgdGhlIHF1ZXJ5CisgKiBAcmVxOiBHQVMgcXVlcnkgcGF5bG9hZAorICogQGNiOiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgcmVwb3J0aW5nIEdBUyBxdWVyeSByZXN1bHQgYW5kIHJlc3BvbnNlCisgKiBAY3R4OiBDb250ZXh0IHBvaW50ZXIgdG8gdXNlIHdpdGggdGhlIEBjYiBjYWxsCisgKiBSZXR1cm5zOiBkaWFsb2cgdG9rZW4gKD49IDApIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZQorICovCiBpbnQgZ2FzX3F1ZXJ5X3JlcShzdHJ1Y3QgZ2FzX3F1ZXJ5ICpnYXMsIGNvbnN0IHU4ICpkc3QsIGludCBmcmVxLAogCQkgIHN0cnVjdCB3cGFidWYgKnJlcSwKIAkJICB2b2lkICgqY2IpKHZvaWQgKmN0eCwgY29uc3QgdTggKmRzdCwgdTggZGlhbG9nX3Rva2VuLApAQCAtNDUzLDYgKzQ5MCw3IEBACiAJaWYgKGdhc19xdWVyeV90eChnYXMsIHF1ZXJ5LCByZXEpIDwgMCkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkdBUzogRmFpbGVkIHRvIHNlbmQgQWN0aW9uIGZyYW1lIHRvICIKIAkJCSAgIE1BQ1NUUiwgTUFDMlNUUihxdWVyeS0+YWRkcikpOworCQlkbF9saXN0X2RlbCgmcXVlcnktPmxpc3QpOwogCQlvc19mcmVlKHF1ZXJ5KTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTQ2NCw2ICs1MDIsMTIgQEAKIH0KIAogCisvKioKKyAqIGdhc19xdWVyeV9jYW5jZWwgLSBDYW5jZWwgYSBwZW5kaW5nIEdBUyBxdWVyeQorICogQGdhczogR0FTIHF1ZXJ5IGRhdGEgZnJvbSBnYXNfcXVlcnlfaW5pdCgpCisgKiBAZHN0OiBEZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyBmb3IgdGhlIHF1ZXJ5CisgKiBAZGlhbG9nX3Rva2VuOiBEaWFsb2cgdG9rZW4gZnJvbSBnYXNfcXVlcnlfcmVxKCkKKyAqLwogdm9pZCBnYXNfcXVlcnlfY2FuY2VsKHN0cnVjdCBnYXNfcXVlcnkgKmdhcywgY29uc3QgdTggKmRzdCwgdTggZGlhbG9nX3Rva2VuKQogewogCXN0cnVjdCBnYXNfcXVlcnlfcGVuZGluZyAqcXVlcnk7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9nYXNfcXVlcnkuaCBiL3dwYV9zdXBwbGljYW50L2dhc19xdWVyeS5oCmluZGV4IDAxYWJhNmUuLjVjM2QxNjEgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2dhc19xdWVyeS5oCisrKyBiL3dwYV9zdXBwbGljYW50L2dhc19xdWVyeS5oCkBAIC0xOSw2ICsxOSw5IEBACiBpbnQgZ2FzX3F1ZXJ5X3J4KHN0cnVjdCBnYXNfcXVlcnkgKmdhcywgY29uc3QgdTggKmRhLCBjb25zdCB1OCAqc2EsCiAJCSBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpkYXRhLCBzaXplX3QgbGVuLCBpbnQgZnJlcSk7CiAKKy8qKgorICogZW51bSBnYXNfcXVlcnlfcmVzdWx0IC0gR0FTIHF1ZXJ5IHJlc3VsdAorICovCiBlbnVtIGdhc19xdWVyeV9yZXN1bHQgewogCUdBU19RVUVSWV9TVUNDRVNTLAogCUdBU19RVUVSWV9GQUlMVVJFLApkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvaHMyMF9zdXBwbGljYW50LmMgYi93cGFfc3VwcGxpY2FudC9oczIwX3N1cHBsaWNhbnQuYwppbmRleCAwZWI2MTE5Li4xNDA0MjQxIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9oczIwX3N1cHBsaWNhbnQuYworKysgYi93cGFfc3VwcGxpY2FudC9oczIwX3N1cHBsaWNhbnQuYwpAQCAtNzksOCArNzksMTAgQEAKIAogCWZyZXEgPSB3cGFfcy0+YXNzb2NfZnJlcTsKIAlic3MgPSB3cGFfYnNzX2dldF9ic3NpZCh3cGFfcywgZHN0KTsKLQlpZiAoYnNzKQorCWlmIChic3MpIHsKKwkJd3BhX2Jzc19hbnFwX3Vuc2hhcmVfYWxsb2MoYnNzKTsKIAkJZnJlcSA9IGJzcy0+ZnJlcTsKKwl9CiAJaWYgKGZyZXEgPD0gMCkKIAkJcmV0dXJuIC0xOwogCkBAIC0xNDEsOSArMTQzLDE2IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBIUzIwX1NUWVBFX1dBTl9NRVRSSUNTOgorCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJXQU4gTWV0cmljcyIsIHBvcywgc2xlbik7CisJCWlmIChzbGVuIDwgMTMpIHsKKwkJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIkhTIDIuMDogVG9vIHNob3J0IFdBTiAiCisJCQkJIk1ldHJpY3MgdmFsdWUgZnJvbSAiIE1BQ1NUUiwgTUFDMlNUUihzYSkpOworCQkJYnJlYWs7CisJCX0KIAkJd3BhX21zZyh3cGFfcywgTVNHX0lORk8sICJSWC1IUzIwLUFOUVAgIiBNQUNTVFIKLQkJCSIgV0FOIE1ldHJpY3MiLCBNQUMyU1RSKHNhKSk7Ci0JCXdwYV9oZXhkdW1wX2FzY2lpKE1TR19ERUJVRywgIldBTiBNZXRyaWNzIiwgcG9zLCBzbGVuKTsKKwkJCSIgV0FOIE1ldHJpY3MgJTAyeDoldToldToldToldToldSIsIE1BQzJTVFIoc2EpLAorCQkJcG9zWzBdLCBXUEFfR0VUX0xFMzIocG9zICsgMSksIFdQQV9HRVRfTEUzMihwb3MgKyA1KSwKKwkJCXBvc1s5XSwgcG9zWzEwXSwgV1BBX0dFVF9MRTE2KHBvcyArIDExKSk7CiAJCWlmIChhbnFwKSB7CiAJCQl3cGFidWZfZnJlZShhbnFwLT5oczIwX3dhbl9tZXRyaWNzKTsKIAkJCWFucXAtPmhzMjBfd2FuX21ldHJpY3MgPSB3cGFidWZfYWxsb2NfY29weShwb3MsIHNsZW4pOwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvaW50ZXJ3b3JraW5nLmMgYi93cGFfc3VwcGxpY2FudC9pbnRlcndvcmtpbmcuYwppbmRleCAyMmY3MDlmLi4zNjAyYjA3IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9pbnRlcndvcmtpbmcuYworKysgYi93cGFfc3VwcGxpY2FudC9pbnRlcndvcmtpbmcuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgImNvbW1vbi9nYXMuaCIKICNpbmNsdWRlICJjb21tb24vd3BhX2N0cmwuaCIKICNpbmNsdWRlICJ1dGlscy9wY3NjX2Z1bmNzLmgiCisjaW5jbHVkZSAidXRpbHMvZWxvb3AuaCIKICNpbmNsdWRlICJkcml2ZXJzL2RyaXZlci5oIgogI2luY2x1ZGUgImVhcF9jb21tb24vZWFwX2RlZnMuaCIKICNpbmNsdWRlICJlYXBfcGVlci9lYXAuaCIKQEAgLTQxLDYgKzQyLDEwIEBACiAjZW5kaWYKIAogc3RhdGljIHZvaWQgaW50ZXJ3b3JraW5nX25leHRfYW5xcF9mZXRjaChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKK3N0YXRpYyBzdHJ1Y3Qgd3BhX2NyZWQgKiBpbnRlcndvcmtpbmdfY3JlZGVudGlhbHNfYXZhaWxhYmxlX3JlYWxtKAorCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHN0cnVjdCB3cGFfYnNzICpic3MpOworc3RhdGljIHN0cnVjdCB3cGFfY3JlZCAqIGludGVyd29ya2luZ19jcmVkZW50aWFsc19hdmFpbGFibGVfM2dwcCgKKwlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzKTsKIAogCiBzdGF0aWMgdm9pZCBpbnRlcndvcmtpbmdfcmVjb25uZWN0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCkBAIC01MywxNiArNTgsOCBAQAogCXdwYV9zLT5kaXNjb25uZWN0ZWQgPSAwOwogCXdwYV9zLT5yZWFzc29jaWF0ZSA9IDE7CiAKLQlpZiAod3BhX3MtPmxhc3Rfc2Nhbl9yZXNfdXNlZCA+IDApIHsKLQkJc3RydWN0IG9zX3RpbWUgbm93OwotCQlvc19nZXRfdGltZSgmbm93KTsKLQkJaWYgKG5vdy5zZWMgLSB3cGFfcy0+bGFzdF9zY2FuLnNlYyA8PSA1KSB7Ci0JCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkludGVyd29ya2luZzogT2xkIHNjYW4gcmVzdWx0cyAiCi0JCQkJICAgImFyZSBmcmVzaCAtIGNvbm5lY3Qgd2l0aG91dCBuZXcgc2NhbiIpOwotCQkJaWYgKHdwYXNfc2VsZWN0X25ldHdvcmtfZnJvbV9sYXN0X3NjYW4od3BhX3MpID49IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JfQorCWlmICh3cGFfc3VwcGxpY2FudF9mYXN0X2Fzc29jaWF0ZSh3cGFfcykgPj0gMCkKKwkJcmV0dXJuOwogCiAJd3BhX3N1cHBsaWNhbnRfcmVxX3NjYW4od3BhX3MsIDAsIDApOwogfQpAQCAtMTcwLDYgKzE2NywxMyBAQAogfQogCiAKK3N0YXRpYyB2b2lkIGludGVyd29ya2luZ19jb250aW51ZV9hbnFwKHZvaWQgKmVsb29wX2N0eCwgdm9pZCAqc29ja19jdHgpCit7CisJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyA9IGVsb29wX2N0eDsKKwlpbnRlcndvcmtpbmdfbmV4dF9hbnFwX2ZldGNoKHdwYV9zKTsKK30KKworCiBzdGF0aWMgaW50IGludGVyd29ya2luZ19hbnFwX3NlbmRfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJICAgICAgc3RydWN0IHdwYV9ic3MgKmJzcykKIHsKQEAgLTIzOCw2ICsyNDIsOCBAQAogCWlmIChyZXMgPCAwKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQU5RUDogRmFpbGVkIHRvIHNlbmQgUXVlcnkgUmVxdWVzdCIpOwogCQlyZXQgPSAtMTsKKwkJZWxvb3BfcmVnaXN0ZXJfdGltZW91dCgwLCAwLCBpbnRlcndvcmtpbmdfY29udGludWVfYW5xcCwgd3BhX3MsCisJCQkJICAgICAgIE5VTEwpOwogCX0gZWxzZQogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkFOUVA6IFF1ZXJ5IHN0YXJ0ZWQgd2l0aCBkaWFsb2cgdG9rZW4gIgogCQkJICAgIiV1IiwgcmVzKTsKQEAgLTUxNiwxMyArNTIyLDE4IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChlYXAtPm1ldGhvZCA9PSBFQVBfVFlQRV9QRUFQICYmCi0JICAgIGVhcF9nZXRfbmFtZShFQVBfVkVORE9SX0lFVEYsIGVhcC0+aW5uZXJfbWV0aG9kKSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKwlpZiAoZWFwLT5tZXRob2QgPT0gRUFQX1RZUEVfUEVBUCkgeworCQlpZiAoZWFwLT5pbm5lcl9tZXRob2QgJiYKKwkJICAgIGVhcF9nZXRfbmFtZShFQVBfVkVORE9SX0lFVEYsIGVhcC0+aW5uZXJfbWV0aG9kKSA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWlmICghZWFwLT5pbm5lcl9tZXRob2QgJiYKKwkJICAgIGVhcF9nZXRfbmFtZShFQVBfVkVORE9SX0lFVEYsIEVBUF9UWVBFX01TQ0hBUFYyKSA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQogCiAJaWYgKGVhcC0+bWV0aG9kID09IEVBUF9UWVBFX1RUTFMpIHsKIAkJaWYgKGVhcC0+aW5uZXJfbWV0aG9kID09IDAgJiYgZWFwLT5pbm5lcl9ub25fZWFwID09IDApCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiAxOyAvKiBBc3N1bWUgVFRMUy9NU0NIQVB2MiBpcyB1c2VkICovCiAJCWlmIChlYXAtPmlubmVyX21ldGhvZCAmJgogCQkgICAgZWFwX2dldF9uYW1lKEVBUF9WRU5ET1JfSUVURiwgZWFwLT5pbm5lcl9tZXRob2QpID09IE5VTEwpCiAJCQlyZXR1cm4gMDsKQEAgLTcxNyw5ICs3MjgsMTIgQEAKICNlbmRpZiAvKiBJTlRFUldPUktJTkdfM0dQUCAqLwogCiAKLXN0YXRpYyBpbnQgaW50ZXJ3b3JraW5nX3NldF9oczIwX3BhcmFtcyhzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQpCitzdGF0aWMgaW50IGludGVyd29ya2luZ19zZXRfaHMyMF9wYXJhbXMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJc3RydWN0IHdwYV9zc2lkICpzc2lkKQogewotCWlmICh3cGFfY29uZmlnX3NldChzc2lkLCAia2V5X21nbXQiLCAiV1BBLUVBUCIsIDApIDwgMCkKKwlpZiAod3BhX2NvbmZpZ19zZXQoc3NpZCwgImtleV9tZ210IiwKKwkJCSAgIHdwYV9zLT5jb25mLT5wbWYgIT0gTk9fTUdNVF9GUkFNRV9QUk9URUNUSU9OID8KKwkJCSAgICJXUEEtRUFQIFdQQS1FQVAtU0hBMjU2IiA6ICJXUEEtRUFQIiwgMCkgPCAwKQogCQlyZXR1cm4gLTE7CiAJaWYgKHdwYV9jb25maWdfc2V0KHNzaWQsICJwcm90byIsICJSU04iLCAwKSA8IDApCiAJCXJldHVybiAtMTsKQEAgLTczMCwxMCArNzQ0LDEwIEBACiAKIAogc3RhdGljIGludCBpbnRlcndvcmtpbmdfY29ubmVjdF8zZ3BwKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJICAgICBzdHJ1Y3Qgd3BhX2NyZWQgKmNyZWQsCiAJCQkJICAgICBzdHJ1Y3Qgd3BhX2JzcyAqYnNzKQogewogI2lmZGVmIElOVEVSV09SS0lOR18zR1BQCi0Jc3RydWN0IHdwYV9jcmVkICpjcmVkOwogCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKIAljb25zdCB1OCAqaWU7CiAJaW50IGVhcF90eXBlOwpAQCAtNzQzLDQwICs3NTcsNiBAQAogCWlmIChic3MtPmFucXAgPT0gTlVMTCB8fCBic3MtPmFucXAtPmFucXBfM2dwcCA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKLQlmb3IgKGNyZWQgPSB3cGFfcy0+Y29uZi0+Y3JlZDsgY3JlZDsgY3JlZCA9IGNyZWQtPm5leHQpIHsKLQkJY2hhciAqc2VwOwotCQljb25zdCBjaGFyICppbXNpOwotCQlpbnQgbW5jX2xlbjsKLQotI2lmZGVmIFBDU0NfRlVOQ1MKLQkJaWYgKGNyZWQtPnBjc2MgJiYgd3BhX3MtPmNvbmYtPnBjc2NfcmVhZGVyICYmIHdwYV9zLT5zY2FyZCAmJgotCQkgICAgd3BhX3MtPmltc2lbMF0pIHsKLQkJCWltc2kgPSB3cGFfcy0+aW1zaTsKLQkJCW1uY19sZW4gPSB3cGFfcy0+bW5jX2xlbjsKLQkJCWdvdG8gY29tcGFyZTsKLQkJfQotI2VuZGlmIC8qIFBDU0NfRlVOQ1MgKi8KLQotCQlpZiAoY3JlZC0+aW1zaSA9PSBOVUxMIHx8ICFjcmVkLT5pbXNpWzBdIHx8Ci0JCSAgICBjcmVkLT5taWxlbmFnZSA9PSBOVUxMIHx8ICFjcmVkLT5taWxlbmFnZVswXSkKLQkJCWNvbnRpbnVlOwotCi0JCXNlcCA9IG9zX3N0cmNocihjcmVkLT5pbXNpLCAnLScpOwotCQlpZiAoc2VwID09IE5VTEwgfHwKLQkJICAgIChzZXAgLSBjcmVkLT5pbXNpICE9IDUgJiYgc2VwIC0gY3JlZC0+aW1zaSAhPSA2KSkKLQkJCWNvbnRpbnVlOwotCQltbmNfbGVuID0gc2VwIC0gY3JlZC0+aW1zaSAtIDM7Ci0JCWltc2kgPSBjcmVkLT5pbXNpOwotCi0jaWZkZWYgUENTQ19GVU5DUwotCWNvbXBhcmU6Ci0jZW5kaWYgLyogUENTQ19GVU5DUyAqLwotCQlpZiAocGxtbl9pZF9tYXRjaChic3MtPmFucXAtPmFucXBfM2dwcCwgaW1zaSwgbW5jX2xlbikpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGNyZWQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCiAJaWUgPSB3cGFfYnNzX2dldF9pZShic3MsIFdMQU5fRUlEX1NTSUQpOwogCWlmIChpZSA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CkBAIC03ODYsNiArNzY2LDcgQEAKIAlzc2lkID0gd3BhX2NvbmZpZ19hZGRfbmV0d29yayh3cGFfcy0+Y29uZik7CiAJaWYgKHNzaWQgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOworCXNzaWQtPnBhcmVudF9jcmVkID0gY3JlZDsKIAogCXdwYXNfbm90aWZ5X25ldHdvcmtfYWRkZWQod3BhX3MsIHNzaWQpOwogCXdwYV9jb25maWdfc2V0X25ldHdvcmtfZGVmYXVsdHMoc3NpZCk7CkBAIC03OTcsNyArNzc4LDcgQEAKIAlvc19tZW1jcHkoc3NpZC0+c3NpZCwgaWUgKyAyLCBpZVsxXSk7CiAJc3NpZC0+c3NpZF9sZW4gPSBpZVsxXTsKIAotCWlmIChpbnRlcndvcmtpbmdfc2V0X2hzMjBfcGFyYW1zKHNzaWQpIDwgMCkKKwlpZiAoaW50ZXJ3b3JraW5nX3NldF9oczIwX3BhcmFtcyh3cGFfcywgc3NpZCkgPCAwKQogCQlnb3RvIGZhaWw7CiAKIAllYXBfdHlwZSA9IEVBUF9UWVBFX1NJTTsKQEAgLTk0NCw2ICs5MjUsMjQgQEAKIH0KIAogCitzdGF0aWMgaW50IGNyZWRfZXhjbHVkZWRfc3NpZChzdHJ1Y3Qgd3BhX2NyZWQgKmNyZWQsIHN0cnVjdCB3cGFfYnNzICpic3MpCit7CisJc2l6ZV90IGk7CisKKwlpZiAoIWNyZWQtPmV4Y2x1ZGVkX3NzaWQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGNyZWQtPm51bV9leGNsdWRlZF9zc2lkOyBpKyspIHsKKwkJc3RydWN0IGV4Y2x1ZGVkX3NzaWQgKmUgPSAmY3JlZC0+ZXhjbHVkZWRfc3NpZFtpXTsKKwkJaWYgKGJzcy0+c3NpZF9sZW4gPT0gZS0+c3NpZF9sZW4gJiYKKwkJICAgIG9zX21lbWNtcChic3MtPnNzaWQsIGUtPnNzaWQsIGUtPnNzaWRfbGVuKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIHN0cnVjdCB3cGFfY3JlZCAqIGludGVyd29ya2luZ19jcmVkZW50aWFsc19hdmFpbGFibGVfcm9hbWluZ19jb25zb3J0aXVtKAogCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHN0cnVjdCB3cGFfYnNzICpic3MpCiB7CkBAIC05NzEsNiArOTcwLDkgQEAKIAkJCQkJICAgICAgY3JlZC0+cm9hbWluZ19jb25zb3J0aXVtX2xlbikpCiAJCQljb250aW51ZTsKIAorCQlpZiAoY3JlZF9leGNsdWRlZF9zc2lkKGNyZWQsIGJzcykpCisJCQljb250aW51ZTsKKwogCQlpZiAoc2VsZWN0ZWQgPT0gTlVMTCB8fAogCQkgICAgc2VsZWN0ZWQtPnByaW9yaXR5IDwgY3JlZC0+cHJpb3JpdHkpCiAJCQlzZWxlY3RlZCA9IGNyZWQ7CkBAIC0xMDQ2LDYgKzEwNDgsMTcgQEAKIAkgICAgd3BhX2NvbmZpZ19zZXRfcXVvdGVkKHNzaWQsICJjbGllbnRfY2VydCIsIGNyZWQtPmNsaWVudF9jZXJ0KSA8IDApCiAJCXJldHVybiAtMTsKIAorI2lmZGVmIEFORFJPSUQKKwlpZiAoY3JlZC0+cHJpdmF0ZV9rZXkgJiYKKwkgICAgb3Nfc3RybmNtcChjcmVkLT5wcml2YXRlX2tleSwgImtleXN0b3JlOi8vIiwgMTEpID09IDApIHsKKwkJLyogVXNlIE9wZW5TU0wgZW5naW5lIGNvbmZpZ3VyYXRpb24gZm9yIEFuZHJvaWQga2V5c3RvcmUgKi8KKwkJaWYgKHdwYV9jb25maWdfc2V0X3F1b3RlZChzc2lkLCAiZW5naW5lX2lkIiwgImtleXN0b3JlIikgPCAwIHx8CisJCSAgICB3cGFfY29uZmlnX3NldF9xdW90ZWQoc3NpZCwgImtleV9pZCIsCisJCQkJCSAgY3JlZC0+cHJpdmF0ZV9rZXkgKyAxMSkgPCAwIHx8CisJCSAgICB3cGFfY29uZmlnX3NldChzc2lkLCAiZW5naW5lIiwgIjEiLCAwKSA8IDApCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlCisjZW5kaWYgLyogQU5EUk9JRCAqLwogCWlmIChjcmVkLT5wcml2YXRlX2tleSAmJiBjcmVkLT5wcml2YXRlX2tleVswXSAmJgogCSAgICB3cGFfY29uZmlnX3NldF9xdW90ZWQoc3NpZCwgInByaXZhdGVfa2V5IiwgY3JlZC0+cHJpdmF0ZV9rZXkpIDwgMCkKIAkJcmV0dXJuIC0xOwpAQCAtMTA4NCw2ICsxMDk3LDcgQEAKIAlzc2lkID0gd3BhX2NvbmZpZ19hZGRfbmV0d29yayh3cGFfcy0+Y29uZik7CiAJaWYgKHNzaWQgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOworCXNzaWQtPnBhcmVudF9jcmVkID0gY3JlZDsKIAl3cGFzX25vdGlmeV9uZXR3b3JrX2FkZGVkKHdwYV9zLCBzc2lkKTsKIAl3cGFfY29uZmlnX3NldF9uZXR3b3JrX2RlZmF1bHRzKHNzaWQpOwogCXNzaWQtPnByaW9yaXR5ID0gY3JlZC0+cHJpb3JpdHk7CkBAIC0xMDk0LDcgKzExMDgsNyBAQAogCW9zX21lbWNweShzc2lkLT5zc2lkLCBzc2lkX2llICsgMiwgc3NpZF9pZVsxXSk7CiAJc3NpZC0+c3NpZF9sZW4gPSBzc2lkX2llWzFdOwogCi0JaWYgKGludGVyd29ya2luZ19zZXRfaHMyMF9wYXJhbXMoc3NpZCkgPCAwKQorCWlmIChpbnRlcndvcmtpbmdfc2V0X2hzMjBfcGFyYW1zKHdwYV9zLCBzc2lkKSA8IDApCiAJCWdvdG8gZmFpbDsKIAogCWlmIChjcmVkLT5lYXBfbWV0aG9kID09IE5VTEwpIHsKQEAgLTExMjMsNyArMTEzNyw3IEBACiAKIGludCBpbnRlcndvcmtpbmdfY29ubmVjdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzKQogewotCXN0cnVjdCB3cGFfY3JlZCAqY3JlZDsKKwlzdHJ1Y3Qgd3BhX2NyZWQgKmNyZWQsICpjcmVkX3JjLCAqY3JlZF8zZ3BwOwogCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKIAlzdHJ1Y3QgbmFpX3JlYWxtICpyZWFsbTsKIAlzdHJ1Y3QgbmFpX3JlYWxtX2VhcCAqZWFwID0gTlVMTDsKQEAgLTExNTAsMzkgKzExNjQsNjEgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWNyZWQgPSBpbnRlcndvcmtpbmdfY3JlZGVudGlhbHNfYXZhaWxhYmxlX3JvYW1pbmdfY29uc29ydGl1bSh3cGFfcywKLQkJCQkJCQkJICAgICBic3MpOwotCWlmIChjcmVkKQotCQlyZXR1cm4gaW50ZXJ3b3JraW5nX2Nvbm5lY3Rfcm9hbWluZ19jb25zb3J0aXVtKHdwYV9zLCBjcmVkLAorCWNyZWRfcmMgPSBpbnRlcndvcmtpbmdfY3JlZGVudGlhbHNfYXZhaWxhYmxlX3JvYW1pbmdfY29uc29ydGl1bSh3cGFfcywKKwkJCQkJCQkJCWJzcyk7CisJaWYgKGNyZWRfcmMpIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJJbnRlcndvcmtpbmc6IEhpZ2hlc3Qgcm9hbWluZyAiCisJCQkgICAiY29uc29ydGl1bSBtYXRjaGluZyBjcmVkZW50aWFsIHByaW9yaXR5ICVkIiwKKwkJCSAgIGNyZWRfcmMtPnByaW9yaXR5KTsKKwl9CisKKwljcmVkID0gaW50ZXJ3b3JraW5nX2NyZWRlbnRpYWxzX2F2YWlsYWJsZV9yZWFsbSh3cGFfcywgYnNzKTsKKwlpZiAoY3JlZCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkludGVyd29ya2luZzogSGlnaGVzdCBOQUkgUmVhbG0gbGlzdCAiCisJCQkgICAibWF0Y2hpbmcgY3JlZGVudGlhbCBwcmlvcml0eSAlZCIsCisJCQkgICBjcmVkLT5wcmlvcml0eSk7CisJfQorCisJY3JlZF8zZ3BwID0gaW50ZXJ3b3JraW5nX2NyZWRlbnRpYWxzX2F2YWlsYWJsZV8zZ3BwKHdwYV9zLCBic3MpOworCWlmIChjcmVkXzNncHApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJJbnRlcndvcmtpbmc6IEhpZ2hlc3QgM0dQUCBtYXRjaGluZyAiCisJCQkgICAiY3JlZGVudGlhbCBwcmlvcml0eSAlZCIsIGNyZWRfM2dwcC0+cHJpb3JpdHkpOworCX0KKworCWlmIChjcmVkX3JjICYmCisJICAgIChjcmVkID09IE5VTEwgfHwgY3JlZF9yYy0+cHJpb3JpdHkgPj0gY3JlZC0+cHJpb3JpdHkpICYmCisJICAgIChjcmVkXzNncHAgPT0gTlVMTCB8fCBjcmVkX3JjLT5wcmlvcml0eSA+PSBjcmVkXzNncHAtPnByaW9yaXR5KSkKKwkJcmV0dXJuIGludGVyd29ya2luZ19jb25uZWN0X3JvYW1pbmdfY29uc29ydGl1bSh3cGFfcywgY3JlZF9yYywKIAkJCQkJCQkgICAgICAgYnNzLCBpZSk7CiAKKwlpZiAoY3JlZF8zZ3BwICYmCisJICAgIChjcmVkID09IE5VTEwgfHwgY3JlZF8zZ3BwLT5wcmlvcml0eSA+PSBjcmVkLT5wcmlvcml0eSkpIHsKKwkJcmV0dXJuIGludGVyd29ya2luZ19jb25uZWN0XzNncHAod3BhX3MsIGNyZWRfM2dwcCwgYnNzKTsKKwl9CisKKwlpZiAoY3JlZCA9PSBOVUxMKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiSW50ZXJ3b3JraW5nOiBObyBtYXRjaGluZyBjcmVkZW50aWFscyAiCisJCQkgICAiZm91bmQgZm9yICIgTUFDU1RSLCBNQUMyU1RSKGJzcy0+YnNzaWQpKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCXJlYWxtID0gbmFpX3JlYWxtX3BhcnNlKGJzcy0+YW5xcCA/IGJzcy0+YW5xcC0+bmFpX3JlYWxtIDogTlVMTCwKIAkJCQkmY291bnQpOwogCWlmIChyZWFsbSA9PSBOVUxMKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiSW50ZXJ3b3JraW5nOiBDb3VsZCBub3QgcGFyc2UgTkFJICIKIAkJCSAgICJSZWFsbSBsaXN0IGZyb20gIiBNQUNTVFIsIE1BQzJTVFIoYnNzLT5ic3NpZCkpOwotCQljb3VudCA9IDA7CisJCXJldHVybiAtMTsKIAl9CiAKLQlmb3IgKGNyZWQgPSB3cGFfcy0+Y29uZi0+Y3JlZDsgY3JlZDsgY3JlZCA9IGNyZWQtPm5leHQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWlmICghbmFpX3JlYWxtX21hdGNoKCZyZWFsbVtpXSwgY3JlZC0+cmVhbG0pKQotCQkJCWNvbnRpbnVlOwotCQkJZWFwID0gbmFpX3JlYWxtX2ZpbmRfZWFwKGNyZWQsICZyZWFsbVtpXSk7Ci0JCQlpZiAoZWFwKQotCQkJCWJyZWFrOwotCQl9CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKCFuYWlfcmVhbG1fbWF0Y2goJnJlYWxtW2ldLCBjcmVkLT5yZWFsbSkpCisJCQljb250aW51ZTsKKwkJZWFwID0gbmFpX3JlYWxtX2ZpbmRfZWFwKGNyZWQsICZyZWFsbVtpXSk7CiAJCWlmIChlYXApCiAJCQlicmVhazsKIAl9CiAKIAlpZiAoIWVhcCkgewotCQlpZiAoaW50ZXJ3b3JraW5nX2Nvbm5lY3RfM2dwcCh3cGFfcywgYnNzKSA9PSAwKSB7Ci0JCQlpZiAocmVhbG0pCi0JCQkJbmFpX3JlYWxtX2ZyZWUocmVhbG0sIGNvdW50KTsKLQkJCXJldHVybiAwOwotCQl9Ci0KIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJJbnRlcndvcmtpbmc6IE5vIG1hdGNoaW5nIGNyZWRlbnRpYWxzICIKIAkJCSAgICJhbmQgRUFQIG1ldGhvZCBmb3VuZCBmb3IgIiBNQUNTVFIsCiAJCQkgICBNQUMyU1RSKGJzcy0+YnNzaWQpKTsKQEAgLTExOTgsNiArMTIzNCw3IEBACiAJCW5haV9yZWFsbV9mcmVlKHJlYWxtLCBjb3VudCk7CiAJCXJldHVybiAtMTsKIAl9CisJc3NpZC0+cGFyZW50X2NyZWQgPSBjcmVkOwogCXdwYXNfbm90aWZ5X25ldHdvcmtfYWRkZWQod3BhX3MsIHNzaWQpOwogCXdwYV9jb25maWdfc2V0X25ldHdvcmtfZGVmYXVsdHMoc3NpZCk7CiAJc3NpZC0+cHJpb3JpdHkgPSBjcmVkLT5wcmlvcml0eTsKQEAgLTEyMDgsNyArMTI0NSw3IEBACiAJb3NfbWVtY3B5KHNzaWQtPnNzaWQsIGllICsgMiwgaWVbMV0pOwogCXNzaWQtPnNzaWRfbGVuID0gaWVbMV07CiAKLQlpZiAoaW50ZXJ3b3JraW5nX3NldF9oczIwX3BhcmFtcyhzc2lkKSA8IDApCisJaWYgKGludGVyd29ya2luZ19zZXRfaHMyMF9wYXJhbXMod3BhX3MsIHNzaWQpIDwgMCkKIAkJZ290byBmYWlsOwogCiAJaWYgKHdwYV9jb25maWdfc2V0KHNzaWQsICJlYXAiLCBlYXBfZ2V0X25hbWUoRUFQX1ZFTkRPUl9JRVRGLApAQCAtMTI0NiwxMSArMTI4MywyMCBAQAogCQkJCQkgICAwKSA8IDApCiAJCQkJZ290byBmYWlsOwogCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBFQVAgcGFyYW1zIHdlcmUgbm90IHNldCAtIGFzc3VtZSBUVExTL01TQ0hBUHYyICovCisJCQlpZiAod3BhX2NvbmZpZ19zZXQoc3NpZCwgInBoYXNlMiIsICJcImF1dGg9TVNDSEFQVjJcIiIsCisJCQkJCSAgIDApIDwgMCkKKwkJCQlnb3RvIGZhaWw7CisJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAljYXNlIEVBUF9UWVBFX1BFQVA6CiAJCW9zX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJcImF1dGg9JXNcIiIsCi0JCQkgICAgZWFwX2dldF9uYW1lKEVBUF9WRU5ET1JfSUVURiwgZWFwLT5pbm5lcl9tZXRob2QpKTsKKwkJCSAgICBlYXBfZ2V0X25hbWUoRUFQX1ZFTkRPUl9JRVRGLAorCQkJCQkgZWFwLT5pbm5lcl9tZXRob2QgPworCQkJCQkgZWFwLT5pbm5lcl9tZXRob2QgOgorCQkJCQkgRUFQX1RZUEVfTVNDSEFQVjIpKTsKIAkJaWYgKHdwYV9jb25maWdfc2V0KHNzaWQsICJwaGFzZTIiLCBidWYsIDApIDwgMCkKIAkJCWdvdG8gZmFpbDsKIAkJYnJlYWs7CkBAIC0xMzIwLDYgKzEzNjYsOCBAQAogCQlyZXQgPSBwbG1uX2lkX21hdGNoKGJzcy0+YW5xcC0+YW5xcF8zZ3BwLCBpbXNpLCBtbmNfbGVuKTsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQTE1OIG1hdGNoICVzZm91bmQiLCByZXQgPyAiIiA6ICJub3QgIik7CiAJCWlmIChyZXQpIHsKKwkJCWlmIChjcmVkX2V4Y2x1ZGVkX3NzaWQoY3JlZCwgYnNzKSkKKwkJCQljb250aW51ZTsKIAkJCWlmIChzZWxlY3RlZCA9PSBOVUxMIHx8CiAJCQkgICAgc2VsZWN0ZWQtPnByaW9yaXR5IDwgY3JlZC0+cHJpb3JpdHkpCiAJCQkJc2VsZWN0ZWQgPSBjcmVkOwpAQCAtMTM2MCw2ICsxNDA4LDggQEAKIAkJCWlmICghbmFpX3JlYWxtX21hdGNoKCZyZWFsbVtpXSwgY3JlZC0+cmVhbG0pKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKG5haV9yZWFsbV9maW5kX2VhcChjcmVkLCAmcmVhbG1baV0pKSB7CisJCQkJaWYgKGNyZWRfZXhjbHVkZWRfc3NpZChjcmVkLCBic3MpKQorCQkJCQljb250aW51ZTsKIAkJCQlpZiAoc2VsZWN0ZWQgPT0gTlVMTCB8fAogCQkJCSAgICBzZWxlY3RlZC0+cHJpb3JpdHkgPCBjcmVkLT5wcmlvcml0eSkKIAkJCQkJc2VsZWN0ZWQgPSBjcmVkOwpAQCAtMTQyNCw1MCArMTQ3NCw2MSBAQAogfQogCiAKK2ludCBpbnRlcndvcmtpbmdfaG9tZV9zcF9jcmVkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkgICAgICBzdHJ1Y3Qgd3BhX2NyZWQgKmNyZWQsCisJCQkgICAgICBzdHJ1Y3Qgd3BhYnVmICpkb21haW5fbmFtZXMpCit7CisjaWZkZWYgSU5URVJXT1JLSU5HXzNHUFAKKwljaGFyIG5haVsxMDBdLCAqcmVhbG07CisKKwljaGFyICppbXNpID0gTlVMTDsKKwlpbnQgbW5jX2xlbiA9IDA7CisJaWYgKGNyZWQtPmltc2kpCisJCWltc2kgPSBjcmVkLT5pbXNpOworI2lmZGVmIENPTkZJR19QQ1NDCisJZWxzZSBpZiAoY3JlZC0+cGNzYyAmJiB3cGFfcy0+Y29uZi0+cGNzY19yZWFkZXIgJiYKKwkJIHdwYV9zLT5zY2FyZCAmJiB3cGFfcy0+aW1zaVswXSkgeworCQlpbXNpID0gd3BhX3MtPmltc2k7CisJCW1uY19sZW4gPSB3cGFfcy0+bW5jX2xlbjsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BDU0MgKi8KKwlpZiAoZG9tYWluX25hbWVzICYmCisJICAgIGltc2kgJiYgYnVpbGRfcm9vdF9uYWkobmFpLCBzaXplb2YobmFpKSwgaW1zaSwgbW5jX2xlbiwgMCkgPT0gMCkgeworCQlyZWFsbSA9IG9zX3N0cmNocihuYWksICdAJyk7CisJCWlmIChyZWFsbSkKKwkJCXJlYWxtKys7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiSW50ZXJ3b3JraW5nOiBTZWFyY2ggZm9yIG1hdGNoICIKKwkJCSAgICJ3aXRoIFNJTS9VU0lNIGRvbWFpbiAlcyIsIHJlYWxtKTsKKwkJaWYgKHJlYWxtICYmCisJCSAgICBkb21haW5fbmFtZV9saXN0X2NvbnRhaW5zKGRvbWFpbl9uYW1lcywgcmVhbG0pKQorCQkJcmV0dXJuIDE7CisJfQorI2VuZGlmIC8qIElOVEVSV09SS0lOR18zR1BQICovCisKKwlpZiAoZG9tYWluX25hbWVzID09IE5VTEwgfHwgY3JlZC0+ZG9tYWluID09IE5VTEwpCisJCXJldHVybiAwOworCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJJbnRlcndvcmtpbmc6IFNlYXJjaCBmb3IgbWF0Y2ggd2l0aCAiCisJCSAgICJob21lIFNQIEZRRE4gJXMiLCBjcmVkLT5kb21haW4pOworCWlmIChkb21haW5fbmFtZV9saXN0X2NvbnRhaW5zKGRvbWFpbl9uYW1lcywgY3JlZC0+ZG9tYWluKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgaW50IGludGVyd29ya2luZ19ob21lX3NwKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJc3RydWN0IHdwYWJ1ZiAqZG9tYWluX25hbWVzKQogewogCXN0cnVjdCB3cGFfY3JlZCAqY3JlZDsKLSNpZmRlZiBJTlRFUldPUktJTkdfM0dQUAotCWNoYXIgbmFpWzEwMF0sICpyZWFsbTsKLSNlbmRpZiAvKiBJTlRFUldPUktJTkdfM0dQUCAqLwogCiAJaWYgKGRvbWFpbl9uYW1lcyA9PSBOVUxMIHx8IHdwYV9zLT5jb25mLT5jcmVkID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAogCWZvciAoY3JlZCA9IHdwYV9zLT5jb25mLT5jcmVkOyBjcmVkOyBjcmVkID0gY3JlZC0+bmV4dCkgewotI2lmZGVmIElOVEVSV09SS0lOR18zR1BQCi0JCWNoYXIgKmltc2kgPSBOVUxMOwotCQlpbnQgbW5jX2xlbiA9IDA7Ci0JCWlmIChjcmVkLT5pbXNpKQotCQkJaW1zaSA9IGNyZWQtPmltc2k7Ci0jaWZkZWYgQ09ORklHX1BDU0MKLQkJZWxzZSBpZiAoY3JlZC0+cGNzYyAmJiB3cGFfcy0+Y29uZi0+cGNzY19yZWFkZXIgJiYKLQkJCSB3cGFfcy0+c2NhcmQgJiYgd3BhX3MtPmltc2lbMF0pIHsKLQkJCWltc2kgPSB3cGFfcy0+aW1zaTsKLQkJCW1uY19sZW4gPSB3cGFfcy0+bW5jX2xlbjsKLQkJfQotI2VuZGlmIC8qIENPTkZJR19QQ1NDICovCi0JCWlmIChpbXNpICYmIGJ1aWxkX3Jvb3RfbmFpKG5haSwgc2l6ZW9mKG5haSksIGltc2ksIG1uY19sZW4sIDApCi0JCSAgICA9PSAwKSB7Ci0JCQlyZWFsbSA9IG9zX3N0cmNocihuYWksICdAJyk7Ci0JCQlpZiAocmVhbG0pCi0JCQkJcmVhbG0rKzsKLQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiSW50ZXJ3b3JraW5nOiBTZWFyY2ggZm9yIG1hdGNoICIKLQkJCQkgICAid2l0aCBTSU0vVVNJTSBkb21haW4gJXMiLCByZWFsbSk7Ci0JCQlpZiAocmVhbG0gJiYKLQkJCSAgICBkb21haW5fbmFtZV9saXN0X2NvbnRhaW5zKGRvbWFpbl9uYW1lcywgcmVhbG0pKQotCQkJCXJldHVybiAxOwotCQl9Ci0jZW5kaWYgLyogSU5URVJXT1JLSU5HXzNHUFAgKi8KLQotCQlpZiAoY3JlZC0+ZG9tYWluID09IE5VTEwpCi0JCQljb250aW51ZTsKLQotCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkludGVyd29ya2luZzogU2VhcmNoIGZvciBtYXRjaCB3aXRoICIKLQkJCSAgICJob21lIFNQIEZRRE4gJXMiLCBjcmVkLT5kb21haW4pOwotCQlpZiAoZG9tYWluX25hbWVfbGlzdF9jb250YWlucyhkb21haW5fbmFtZXMsIGNyZWQtPmRvbWFpbikpCi0JCQlyZXR1cm4gMTsKKwkJaW50IHJlcyA9IGludGVyd29ya2luZ19ob21lX3NwX2NyZWQod3BhX3MsIGNyZWQsIGRvbWFpbl9uYW1lcyk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTYwMyw2ICsxNjY0LDExIEBACiAJCQljb250aW51ZTsKIAkJaWYgKG90aGVyLT5hbnFwID09IE5VTEwpCiAJCQljb250aW51ZTsKKwkJaWYgKG90aGVyLT5hbnFwLT5yb2FtaW5nX2NvbnNvcnRpdW0gPT0gTlVMTCAmJgorCQkgICAgb3RoZXItPmFucXAtPm5haV9yZWFsbSA9PSBOVUxMICYmCisJCSAgICBvdGhlci0+YW5xcC0+YW5xcF8zZ3BwID09IE5VTEwgJiYKKwkJICAgIG90aGVyLT5hbnFwLT5kb21haW5fbmFtZSA9PSBOVUxMKQorCQkJY29udGludWU7CiAJCWlmICghKG90aGVyLT5mbGFncyAmIFdQQV9CU1NfQU5RUF9GRVRDSF9UUklFRCkpCiAJCQljb250aW51ZTsKIAkJaWYgKG9zX21lbWNtcChic3MtPmhlc3NpZCwgb3RoZXItPmhlc3NpZCwgRVRIX0FMRU4pICE9IDApCkBAIC0xNjI4LDcgKzE2OTQsNyBAQAogCWludCBmb3VuZCA9IDA7CiAJY29uc3QgdTggKmllOwogCi0JaWYgKCF3cGFfcy0+ZmV0Y2hfYW5xcF9pbl9wcm9ncmVzcykKKwlpZiAoZWxvb3BfdGVybWluYXRlZCgpIHx8ICF3cGFfcy0+ZmV0Y2hfYW5xcF9pbl9wcm9ncmVzcykKIAkJcmV0dXJuOwogCiAJZGxfbGlzdF9mb3JfZWFjaChic3MsICZ3cGFfcy0+YnNzLCBzdHJ1Y3Qgd3BhX2JzcywgbGlzdCkgewpAQCAtMTcxNCw4ICsxNzgwLDEwIEBACiAKIAlmcmVxID0gd3BhX3MtPmFzc29jX2ZyZXE7CiAJYnNzID0gd3BhX2Jzc19nZXRfYnNzaWQod3BhX3MsIGRzdCk7Ci0JaWYgKGJzcykKKwlpZiAoYnNzKSB7CisJCXdwYV9ic3NfYW5xcF91bnNoYXJlX2FsbG9jKGJzcyk7CiAJCWZyZXEgPSBic3MtPmZyZXE7CisJfQogCWlmIChmcmVxIDw9IDApCiAJCXJldHVybiAtMTsKIApAQCAtMTkzNSw3ICsyMDAzLDcgQEAKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkludGVyd29ya2luZzogU3RhcnQgc2NhbiBmb3IgbmV0d29yayAiCiAJCSAgICJzZWxlY3Rpb24iKTsKIAl3cGFfcy0+c2Nhbl9yZXNfaGFuZGxlciA9IGludGVyd29ya2luZ19zY2FuX3Jlc19oYW5kbGVyOwotCXdwYV9zLT5zY2FuX3JlcSA9IDI7CisJd3BhX3MtPnNjYW5fcmVxID0gTUFOVUFMX1NDQU5fUkVROwogCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvaW50ZXJ3b3JraW5nLmggYi93cGFfc3VwcGxpY2FudC9pbnRlcndvcmtpbmcuaAppbmRleCBjYjg0MzhlLi40YTRhZjgyIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9pbnRlcndvcmtpbmcuaAorKysgYi93cGFfc3VwcGxpY2FudC9pbnRlcndvcmtpbmcuaApAQCAtMjUsNSArMjUsOCBAQAogaW50IGludGVyd29ya2luZ19zZWxlY3Qoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgaW50IGF1dG9fc2VsZWN0KTsKIGludCBpbnRlcndvcmtpbmdfY29ubmVjdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzKTsKIHZvaWQgaW50ZXJ3b3JraW5nX3N0YXJ0X2ZldGNoX2FucXAoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CitpbnQgaW50ZXJ3b3JraW5nX2hvbWVfc3BfY3JlZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJICAgICAgc3RydWN0IHdwYV9jcmVkICpjcmVkLAorCQkJICAgICAgc3RydWN0IHdwYWJ1ZiAqZG9tYWluX25hbWVzKTsKIAogI2VuZGlmIC8qIElOVEVSV09SS0lOR19IICovCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9ub3RpZnkuYyBiL3dwYV9zdXBwbGljYW50L25vdGlmeS5jCmluZGV4IDc3MDkwN2MuLjQ0NzljMDkgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L25vdGlmeS5jCisrKyBiL3dwYV9zdXBwbGljYW50L25vdGlmeS5jCkBAIC0zMjcsNiArMzI3LDkgQEAKIHZvaWQgd3Bhc19ub3RpZnlfYnNzX3dwc19jaGFuZ2VkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJIHVuc2lnbmVkIGludCBpZCkKIHsKKyNpZmRlZiBDT05GSUdfV1BTCisJd3Bhc19kYnVzX2Jzc19zaWduYWxfcHJvcF9jaGFuZ2VkKHdwYV9zLCBXUEFTX0RCVVNfQlNTX1BST1BfV1BTLCBpZCk7CisjZW5kaWYgLyogQ09ORklHX1dQUyAqLwogfQogCiAKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L29mZmNoYW5uZWwuYyBiL3dwYV9zdXBwbGljYW50L29mZmNoYW5uZWwuYwppbmRleCBiODhlYWIxLi44NTZlY2E3IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9vZmZjaGFubmVsLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvb2ZmY2hhbm5lbC5jCkBAIC0xMzIsNiArMTMyLDE3IEBACiB9CiAKIAorLyoqCisgKiBvZmZjaGFubmVsX3NlbmRfYWN0aW9uX3R4X3N0YXR1cyAtIFRYIHN0YXR1cyBjYWxsYmFjaworICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBkc3Q6IERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIG9mIHRoZSB0cmFuc21pdHRlZCBBY3Rpb24gZnJhbWUKKyAqIEBkYXRhOiBUcmFuc21pdHRlZCBmcmFtZSBwYXlsb2FkCisgKiBAZGF0YV9sZW46IExlbmd0aCBvZiBAZGF0YSBpbiBieXRlcworICogQHJlc3VsdDogVFggc3RhdHVzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGRyaXZlciBpbmRpY2F0ZXMgYSBUWCBzdGF0dXMgZXZlbnQgZm9yCisgKiBhIGZyYW1lIHNlbnQgYnkgb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbigpIHVzaW5nIHdwYV9kcnZfc2VuZF9hY3Rpb24oKS4KKyAqLwogdm9pZCBvZmZjaGFubmVsX3NlbmRfYWN0aW9uX3R4X3N0YXR1cygKIAlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqZHN0LCBjb25zdCB1OCAqZGF0YSwKIAlzaXplX3QgZGF0YV9sZW4sIGVudW0gb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbl9yZXN1bHQgcmVzdWx0KQpAQCAtMTY0LDYgKzE3NSwyNyBAQAogfQogCiAKKy8qKgorICogb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbiAtIFJlcXVlc3Qgb2ZmLWNoYW5uZWwgQWN0aW9uIGZyYW1lIFRYCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQGZyZXE6IFRoZSBmcmVxdWVuY3kgaW4gTUh6IGluZGljYXRpbmcgdGhlIGNoYW5uZWwgb24gd2hpY2ggdGhlIGZyYW1lIGlzIHRvCisgKgl0cmFuc21pdHRlZCBvciAwIGZvciB0aGUgY3VycmVudCBjaGFubmVsIChvbmx5IGlmIGFzc29jaWF0ZWQpCisgKiBAZHN0OiBBY3Rpb24gZnJhbWUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKyAqIEBzcmM6IEFjdGlvbiBmcmFtZSBzb3VyY2UgTUFDIGFkZHJlc3MKKyAqIEBic3NpZDogQWN0aW9uIGZyYW1lIEJTU0lECisgKiBAYnVmOiBGcmFtZSB0byB0cmFuc21pdCBzdGFydGluZyBmcm9tIHRoZSBDYXRlZ29yeSBmaWVsZAorICogQGxlbjogTGVuZ3RoIG9mIEBidWYgaW4gYnl0ZXMKKyAqIEB3YWl0X3RpbWU6IFdhaXQgdGltZSBmb3IgcmVzcG9uc2UgaW4gbWlsbGlzZWNvbmRzCisgKiBAdHhfY2I6IENhbGxiYWNrIGZ1bmN0aW9uIGZvciBpbmRpY2F0aW5nIFRYIHN0YXR1cyBvciAlTlVMTCBmb3Igbm93IGNhbGxiYWNrCisgKiBAbm9fY2NrOiBXaGV0aGVyIENDSyByYXRlcyBhcmUgdG8gYmUgZGlzYWxsb3dlZCBmb3IgVFggcmF0ZSBzZWxlY3Rpb24KKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcyBvciAtMSBvbiBmYWlsdXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlcXVlc3QgYW4gQWN0aW9uIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkIG9uIHRoZQorICogY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbCBvciBvbiBhbm90aGVyIGNoYW5uZWwgKG9mZi1jaGFubmVsKS4gVGhlIGFjdHVhbAorICogZnJhbWUgdHJhbnNtaXNzaW9uIHdpbGwgYmUgZGVsYXllZCB1bnRpbCB0aGUgZHJpdmVyIGlzIHJlYWR5IG9uIHRoZSBzcGVjaWZpZWQKKyAqIGNoYW5uZWwuIFRoZSBAd2FpdF90aW1lIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IHRoZSBkcml2ZXIgdG8gcmVtYWluCisgKiBhd2FrZSBvbiB0aGUgY2hhbm5lbCB0byB3YWl0IGZvciBhIHJlc3BvbnNlLgorICovCiBpbnQgb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCB1bnNpZ25lZCBpbnQgZnJlcSwKIAkJCSAgIGNvbnN0IHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsIGNvbnN0IHU4ICpic3NpZCwKIAkJCSAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCB3YWl0X3RpbWUsCkBAIC0yNjYsNiArMjk4LDEzIEBACiB9CiAKIAorLyoqCisgKiBvZmZjaGFubmVsX3NlbmRfc2VuZF9hY3Rpb25fZG9uZSAtIE5vdGlmeSBjb21wbGV0aW9uIG9mIEFjdGlvbiBmcmFtZSBzZXF1ZW5jZQorICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNhbmNlbCBhIHdhaXQgZm9yIGFkZGl0aW9uYWwgcmVzcG9uc2UgZnJhbWVzIG9uCisgKiB0aGUgY2hhbm5lbCB0aGF0IHdhcyB1c2VkIHdpdGggb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbigpLgorICovCiB2b2lkIG9mZmNoYW5uZWxfc2VuZF9hY3Rpb25fZG9uZShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQogewogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiT2ZmLWNoYW5uZWw6IEFjdGlvbiBmcmFtZSBzZXF1ZW5jZSBkb25lICIKQEAgLTI4NCw2ICszMjMsMTUgQEAKIH0KIAogCisvKioKKyAqIG9mZmNoYW5uZWxfcmVtYWluX29uX2NoYW5uZWxfY2IgLSBSZW1haW4tb24tY2hhbm5lbCBjYWxsYmFjayBmdW5jdGlvbgorICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBmcmVxOiBGcmVxdWVuY3kgKGluIE1Ieikgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwKKyAqIEBkdXJhdGlvbjogRHVyYXRpb24gb2YgdGhlIHJlbWFpbi1vbi1jaGFubmVsIG9wZXJhdGlvbiBpbiBtaWxsaXNlY29uZHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgZHJpdmVyIG5vdGlmaWVzIGJlZ2lubmluZyBvZiBhCisgKiByZW1haW4tb24tY2hhbm5lbCBvcGVyYXRpb24uCisgKi8KIHZvaWQgb2ZmY2hhbm5lbF9yZW1haW5fb25fY2hhbm5lbF9jYihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCSAgICAgdW5zaWduZWQgaW50IGZyZXEsIHVuc2lnbmVkIGludCBkdXJhdGlvbikKIHsKQEAgLTI5Myw2ICszNDEsMTQgQEAKIH0KIAogCisvKioKKyAqIG9mZmNoYW5uZWxfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsX2NiIC0gUmVtYWluLW9uLWNoYW5uZWwgc3RvcHBlZCBjYWxsYmFjaworICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBmcmVxOiBGcmVxdWVuY3kgKGluIE1Ieikgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgZHJpdmVyIG5vdGlmaWVzIHRlcm1pbmF0aW9uIG9mIGEKKyAqIHJlbWFpbi1vbi1jaGFubmVsIG9wZXJhdGlvbi4KKyAqLwogdm9pZCBvZmZjaGFubmVsX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbF9jYihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCQkgICAgdW5zaWduZWQgaW50IGZyZXEpCiB7CkBAIC0zMDAsOSArMzU2LDQyIEBACiB9CiAKIAotdm9pZCBvZmZjaGFubmVsX2RlaW5pdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQorLyoqCisgKiBvZmZjaGFubmVsX3BlbmRpbmdfYWN0aW9uX3R4IC0gQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIHBlbmRpbmcgQWN0aW9uIFRYCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogUmV0dXJuczogUG9pbnRlciB0byBwZW5kaW5nIGZyYW1lIG9yICVOVUxMIGlmIG5vIHBlbmRpbmcgb3BlcmF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgcGVuZGluZyBBY3Rpb24gZnJhbWUgVFgKKyAqIG9wZXJhdGlvbi4gVGhlIHJldHVybmVkIHBvaW50ZXIgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgY2hlY2tpbmcgd2hldGhlciBpdAorICogaXMgJU5VTEwgKG5vIHBlbmRpbmcgZnJhbWUpIG9yIHRvIHByaW50IHRoZSBwb2ludGVyIHZhbHVlIGluIGRlYnVnCisgKiBpbmZvcm1hdGlvbiAoaS5lLiwgdGhlIHBvaW50ZXIgc2hvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQpLgorICovCitjb25zdCB2b2lkICogb2ZmY2hhbm5lbF9wZW5kaW5nX2FjdGlvbl90eChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQoreworCXJldHVybiB3cGFfcy0+cGVuZGluZ19hY3Rpb25fdHg7Cit9CisKKworLyoqCisgKiBvZmZjaGFubmVsX2NsZWFyX3BlbmRpbmdfYWN0aW9uX3R4IC0gQ2xlYXIgcGVuZGluZyBBY3Rpb24gZnJhbWUgVFgKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKi8KK3ZvaWQgb2ZmY2hhbm5lbF9jbGVhcl9wZW5kaW5nX2FjdGlvbl90eChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQogewogCXdwYWJ1Zl9mcmVlKHdwYV9zLT5wZW5kaW5nX2FjdGlvbl90eCk7CiAJd3BhX3MtPnBlbmRpbmdfYWN0aW9uX3R4ID0gTlVMTDsKK30KKworCisvKioKKyAqIG9mZmNoYW5uZWxfZGVpbml0IC0gRGVpbml0IG9mZi1jaGFubmVsIG9wZXJhdGlvbnMKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZyZWUgdXAgYW55IGFsbG9jYXRlZCByZXNvdXJjZXMgZm9yIG9mZi1jaGFubmVsCisgKiBvcGVyYXRpb25zLgorICovCit2b2lkIG9mZmNoYW5uZWxfZGVpbml0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisJb2ZmY2hhbm5lbF9jbGVhcl9wZW5kaW5nX2FjdGlvbl90eCh3cGFfcyk7CiAJZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc19zZW5kX2FjdGlvbl9jYiwgd3BhX3MsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvb2ZmY2hhbm5lbC5oIGIvd3BhX3N1cHBsaWNhbnQvb2ZmY2hhbm5lbC5oCmluZGV4IDFkMzk0OGMuLjBhZDdlMTggMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L29mZmNoYW5uZWwuaAorKysgYi93cGFfc3VwcGxpY2FudC9vZmZjaGFubmVsLmgKQEAgLTI5LDUgKzI5LDcgQEAKIHZvaWQgb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbl90eF9zdGF0dXMoCiAJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmRzdCwgY29uc3QgdTggKmRhdGEsCiAJc2l6ZV90IGRhdGFfbGVuLCBlbnVtIG9mZmNoYW5uZWxfc2VuZF9hY3Rpb25fcmVzdWx0IHJlc3VsdCk7Citjb25zdCB2b2lkICogb2ZmY2hhbm5lbF9wZW5kaW5nX2FjdGlvbl90eChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKK3ZvaWQgb2ZmY2hhbm5lbF9jbGVhcl9wZW5kaW5nX2FjdGlvbl90eChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIAogI2VuZGlmIC8qIE9GRkNIQU5ORUxfSCAqLwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvcDJwX3N1cHBsaWNhbnQuYyBiL3dwYV9zdXBwbGljYW50L3AycF9zdXBwbGljYW50LmMKaW5kZXggZTZiMDEyOC4uNmNmZjU3NyAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvcDJwX3N1cHBsaWNhbnQuYworKysgYi93cGFfc3VwcGxpY2FudC9wMnBfc3VwcGxpY2FudC5jCkBAIC04OSwxNCArODksMTUgQEAKIHN0YXRpYyBpbnQgd3Bhc19wMnBfam9pbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqaWZhY2VfYWRkciwKIAkJCSBjb25zdCB1OCAqZGV2X2FkZHIsIGVudW0gcDJwX3dwc19tZXRob2Qgd3BzX21ldGhvZCwKIAkJCSBpbnQgYXV0b19qb2luKTsKLXN0YXRpYyB2b2lkIHdwYXNfcDJwX3BkX2JlZm9yZV9qb2luX3RpbWVvdXQodm9pZCAqZWxvb3BfY3R4LAotCQkJCQkgICAgdm9pZCAqdGltZW91dF9jdHgpOwogc3RhdGljIGludCB3cGFzX3AycF9jcmVhdGVfaWZhY2Uoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CiBzdGF0aWMgdm9pZCB3cGFzX3AycF9jcm9zc19jb25uZWN0X3NldHVwKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOwogc3RhdGljIHZvaWQgd3Bhc19wMnBfZ3JvdXBfaWRsZV90aW1lb3V0KHZvaWQgKmVsb29wX2N0eCwgdm9pZCAqdGltZW91dF9jdHgpOwogc3RhdGljIHZvaWQgd3Bhc19wMnBfc2V0X2dyb3VwX2lkbGVfdGltZW91dChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKK3N0YXRpYyB2b2lkIHdwYXNfcDJwX2dyb3VwX2Zvcm1hdGlvbl90aW1lb3V0KHZvaWQgKmVsb29wX2N0eCwKKwkJCQkJICAgICB2b2lkICp0aW1lb3V0X2N0eCk7CiBzdGF0aWMgdm9pZCB3cGFzX3AycF9mYWxsYmFja190b19nb19uZWcoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkJaW50IGdyb3VwX2FkZGVkKTsKK3N0YXRpYyBpbnQgd3Bhc19wMnBfc3RvcF9maW5kX29wZXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CiAKIAogc3RhdGljIHZvaWQgd3Bhc19wMnBfc2Nhbl9yZXNfaGFuZGxlcihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLApAQCAtMTEyLDggKzExMywxMiBAQAogCiAJZm9yIChpID0gMDsgaSA8IHNjYW5fcmVzLT5udW07IGkrKykgewogCQlzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpic3MgPSBzY2FuX3Jlcy0+cmVzW2ldOworCQlzdHJ1Y3Qgb3NfdGltZSB0aW1lX3RtcF9hZ2UsIGVudHJ5X3RzOworCQl0aW1lX3RtcF9hZ2Uuc2VjID0gYnNzLT5hZ2UgLyAxMDAwOworCQl0aW1lX3RtcF9hZ2UudXNlYyA9IChic3MtPmFnZSAlIDEwMDApICogMTAwMDsKKwkJb3NfdGltZV9zdWIoJnNjYW5fcmVzLT5mZXRjaF90aW1lLCAmdGltZV90bXBfYWdlLCAmZW50cnlfdHMpOwogCQlpZiAocDJwX3NjYW5fcmVzX2hhbmRsZXIod3BhX3MtPmdsb2JhbC0+cDJwLCBic3MtPmJzc2lkLAotCQkJCQkgYnNzLT5mcmVxLCBic3MtPmxldmVsLAorCQkJCQkgYnNzLT5mcmVxLCAmZW50cnlfdHMsIGJzcy0+bGV2ZWwsCiAJCQkJCSAoY29uc3QgdTggKikgKGJzcyArIDEpLAogCQkJCQkgYnNzLT5pZV9sZW4pID4gMCkKIAkJCWJyZWFrOwpAQCAtMzM0LDYgKzMzOSwxMCBAQAogCiAJaWYgKGVsb29wX2NhbmNlbF90aW1lb3V0KHdwYXNfcDJwX2dyb3VwX2lkbGVfdGltZW91dCwgd3BhX3MsIE5VTEwpID4gMCkKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IENhbmNlbGxlZCBQMlAgZ3JvdXAgaWRsZSB0aW1lb3V0Iik7CisJaWYgKGVsb29wX2NhbmNlbF90aW1lb3V0KHdwYXNfcDJwX2dyb3VwX2Zvcm1hdGlvbl90aW1lb3V0LAorCQkJCSB3cGFfcy0+cGFyZW50LCBOVUxMKSA+IDApCisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBDYW5jZWxsZWQgUDJQIGdyb3VwIGZvcm1hdGlvbiAiCisJCQkgICAidGltZW91dCIpOwogCiAJaWYgKHJlbW92YWxfcmVhc29uICE9IFAyUF9HUk9VUF9SRU1PVkFMX1NJTEVOVCAmJiBzc2lkKQogCQl3cGFzX25vdGlmeV9wMnBfZ3JvdXBfcmVtb3ZlZCh3cGFfcywgc3NpZCwgZ3R5cGUpOwpAQCAtNzQ2LDE5ICs3NTUsMTMgQEAKIAlpZiAocmVzdWx0ICE9IE9GRkNIQU5ORUxfU0VORF9BQ1RJT05fU1VDQ0VTUyAmJgogCSAgICB3cGFfcy0+cGVuZGluZ19wZF9iZWZvcmVfam9pbiAmJgogCSAgICAob3NfbWVtY21wKGRzdCwgd3BhX3MtPnBlbmRpbmdfam9pbl9kZXZfYWRkciwgRVRIX0FMRU4pID09IDAgfHwKLQkgICAgIG9zX21lbWNtcChkc3QsIHdwYV9zLT5wZW5kaW5nX2pvaW5faWZhY2VfYWRkciwgRVRIX0FMRU4pID09IDApKSB7CisJICAgICBvc19tZW1jbXAoZHN0LCB3cGFfcy0+cGVuZGluZ19qb2luX2lmYWNlX2FkZHIsIEVUSF9BTEVOKSA9PSAwKSAmJgorCSAgICB3cGFfcy0+cDJwX2ZhbGxiYWNrX3RvX2dvX25lZykgewogCQl3cGFfcy0+cGVuZGluZ19wZF9iZWZvcmVfam9pbiA9IDA7Ci0JCWlmICh3cGFfcy0+cDJwX2ZhbGxiYWNrX3RvX2dvX25lZykgewotCQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiUDJQOiBObyBBQ0sgZm9yIFBEIFJlcSAiCi0JCQkJImR1cmluZyBwMnBfY29ubmVjdC1hdXRvIik7Ci0JCQl3cGFzX3AycF9mYWxsYmFja190b19nb19uZWcod3BhX3MsIDApOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFN0YXJ0aW5nIHBlbmRpbmcgIgotCQkJICAgImpvaW4tZXhpc3RpbmctZ3JvdXAgb3BlcmF0aW9uIChubyBBQ0sgZm9yIFBEICIKLQkJCSAgICJSZXEpIik7Ci0JCXdwYXNfcDJwX2pvaW5fc3RhcnQod3BhX3MpOworCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJQMlA6IE5vIEFDSyBmb3IgUEQgUmVxICIKKwkJCSJkdXJpbmcgcDJwX2Nvbm5lY3QtYXV0byIpOworCQl3cGFzX3AycF9mYWxsYmFja190b19nb19uZWcod3BhX3MsIDApOworCQlyZXR1cm47CiAJfQogfQogCkBAIC04MjcsMTUgKzgzMCwyOCBAQAogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogR3JvdXAgc2V0dXAgd2l0aG91dCBwcm92aXNpb25pbmciKTsKIAkJaWYgKHdwYV9zLT5nbG9iYWwtPnAycF9ncm91cF9mb3JtYXRpb24gPT0gd3BhX3MpCiAJCQl3cGFfcy0+Z2xvYmFsLT5wMnBfZ3JvdXBfZm9ybWF0aW9uID0gTlVMTDsKLQkJd3BhX21zZyh3cGFfcy0+cGFyZW50LCBNU0dfSU5GTywgUDJQX0VWRU5UX0dST1VQX1NUQVJURUQKLQkJCSIlcyBHTyBzc2lkPVwiJXNcIiBmcmVxPSVkIHBhc3NwaHJhc2U9XCIlc1wiICIKLQkJCSJnb19kZXZfYWRkcj0iIE1BQ1NUUiAiJXMiLAotCQkJd3BhX3MtPmlmbmFtZSwKLQkJCXdwYV9zc2lkX3R4dChzc2lkLT5zc2lkLCBzc2lkLT5zc2lkX2xlbiksCi0JCQlzc2lkLT5mcmVxdWVuY3ksCi0JCQlwYXJhbXMtPnBhc3NwaHJhc2UgPyBwYXJhbXMtPnBhc3NwaHJhc2UgOiAiIiwKLQkJCU1BQzJTVFIod3BhX3MtPmdsb2JhbC0+cDJwX2Rldl9hZGRyKSwKLQkJCXBhcmFtcy0+cGVyc2lzdGVudF9ncm91cCA/ICIgW1BFUlNJU1RFTlRdIiA6ICIiKTsKKwkJaWYgKG9zX3N0cmxlbihwYXJhbXMtPnBhc3NwaHJhc2UpID4gMCkgeworCQkJd3BhX21zZyh3cGFfcy0+cGFyZW50LCBNU0dfSU5GTywgUDJQX0VWRU5UX0dST1VQX1NUQVJURUQKKwkJCQkiJXMgR08gc3NpZD1cIiVzXCIgZnJlcT0lZCBwYXNzcGhyYXNlPVwiJXNcIiAiCisJCQkJImdvX2Rldl9hZGRyPSIgTUFDU1RSICIlcyIsIHdwYV9zLT5pZm5hbWUsCisJCQkJd3BhX3NzaWRfdHh0KHNzaWQtPnNzaWQsIHNzaWQtPnNzaWRfbGVuKSwKKwkJCQlzc2lkLT5mcmVxdWVuY3ksIHBhcmFtcy0+cGFzc3BocmFzZSwKKwkJCQlNQUMyU1RSKHdwYV9zLT5nbG9iYWwtPnAycF9kZXZfYWRkciksCisJCQkJcGFyYW1zLT5wZXJzaXN0ZW50X2dyb3VwID8gIiBbUEVSU0lTVEVOVF0iIDoKKwkJCQkiIik7CisJCX0gZWxzZSB7CisJCQljaGFyIHBza1s2NV07CisJCQl3cGFfc25wcmludGZfaGV4KHBzaywgc2l6ZW9mKHBzayksIHBhcmFtcy0+cHNrLAorCQkJCQkgc2l6ZW9mKHBhcmFtcy0+cHNrKSk7CisJCQl3cGFfbXNnKHdwYV9zLT5wYXJlbnQsIE1TR19JTkZPLCBQMlBfRVZFTlRfR1JPVVBfU1RBUlRFRAorCQkJCSIlcyBHTyBzc2lkPVwiJXNcIiBmcmVxPSVkIHBzaz0lcyAiCisJCQkJImdvX2Rldl9hZGRyPSIgTUFDU1RSICIlcyIsIHdwYV9zLT5pZm5hbWUsCisJCQkJd3BhX3NzaWRfdHh0KHNzaWQtPnNzaWQsIHNzaWQtPnNzaWRfbGVuKSwKKwkJCQlzc2lkLT5mcmVxdWVuY3ksIHBzaywKKwkJCQlNQUMyU1RSKHdwYV9zLT5nbG9iYWwtPnAycF9kZXZfYWRkciksCisJCQkJcGFyYW1zLT5wZXJzaXN0ZW50X2dyb3VwID8gIiBbUEVSU0lTVEVOVF0iIDoKKwkJCQkiIik7CisJCX0KIAogCQlpZiAocGFyYW1zLT5wZXJzaXN0ZW50X2dyb3VwKQogCQkJbmV0d29ya19pZCA9IHdwYXNfcDJwX3N0b3JlX3BlcnNpc3RlbnRfZ3JvdXAoCkBAIC04NjEsNyArODc3LDcgQEAKIAkJCQkJICBwYXJhbXMtPnBlZXJfZGV2aWNlX2FkZHIpOwogCWVsc2UgaWYgKHdwYV9zLT5wMnBfcGluWzBdKQogCQl3cGFfc3VwcGxpY2FudF9hcF93cHNfcGluKHdwYV9zLCBwYXJhbXMtPnBlZXJfaW50ZXJmYWNlX2FkZHIsCi0JCQkJCSAgd3BhX3MtPnAycF9waW4sIE5VTEwsIDApOworCQkJCQkgIHdwYV9zLT5wMnBfcGluLCBOVUxMLCAwLCAwKTsKIAlvc19mcmVlKHdwYV9zLT5nb19wYXJhbXMpOwogCXdwYV9zLT5nb19wYXJhbXMgPSBOVUxMOwogfQpAQCAtOTA1LDE0ICs5MjEsMjEgQEAKIAlzc2lkLT5rZXlfbWdtdCA9IFdQQV9LRVlfTUdNVF9QU0s7CiAJc3NpZC0+cHJvdG8gPSBXUEFfUFJPVE9fUlNOOwogCXNzaWQtPnBhaXJ3aXNlX2NpcGhlciA9IFdQQV9DSVBIRVJfQ0NNUDsKLQlzc2lkLT5wYXNzcGhyYXNlID0gb3Nfc3RyZHVwKHBhcmFtcy0+cGFzc3BocmFzZSk7Ci0JaWYgKHNzaWQtPnBhc3NwaHJhc2UgPT0gTlVMTCkgewotCQl3cGFfbXNnKHdwYV9zLCBNU0dfRVJST1IsICJQMlA6IEZhaWxlZCB0byBjb3B5IHBhc3NwaHJhc2UgZm9yICIKLQkJCSJHTyIpOwotCQl3cGFfY29uZmlnX3JlbW92ZV9uZXR3b3JrKHdwYV9zLT5jb25mLCBzc2lkLT5pZCk7Ci0JCXJldHVybjsKLQl9Ci0Jd3BhX2NvbmZpZ191cGRhdGVfcHNrKHNzaWQpOworCWlmIChvc19zdHJsZW4ocGFyYW1zLT5wYXNzcGhyYXNlKSA+IDApIHsKKwkJc3NpZC0+cGFzc3BocmFzZSA9IG9zX3N0cmR1cChwYXJhbXMtPnBhc3NwaHJhc2UpOworCQlpZiAoc3NpZC0+cGFzc3BocmFzZSA9PSBOVUxMKSB7CisJCQl3cGFfbXNnKHdwYV9zLCBNU0dfRVJST1IsICJQMlA6IEZhaWxlZCB0byBjb3B5ICIKKwkJCQkicGFzc3BocmFzZSBmb3IgR08iKTsKKwkJCXdwYV9jb25maWdfcmVtb3ZlX25ldHdvcmsod3BhX3MtPmNvbmYsIHNzaWQtPmlkKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZQorCQlzc2lkLT5wYXNzcGhyYXNlID0gTlVMTDsKKwlzc2lkLT5wc2tfc2V0ID0gcGFyYW1zLT5wc2tfc2V0OworCWlmIChzc2lkLT5wc2tfc2V0KQorCQlvc19tZW1jcHkoc3NpZC0+cHNrLCBwYXJhbXMtPnBzaywgc2l6ZW9mKHNzaWQtPnBzaykpOworCWVsc2UgaWYgKHNzaWQtPnBhc3NwaHJhc2UpCisJCXdwYV9jb25maWdfdXBkYXRlX3Bzayhzc2lkKTsKIAlzc2lkLT5hcF9tYXhfaW5hY3Rpdml0eSA9IHdwYV9zLT5wYXJlbnQtPmNvbmYtPnAycF9nb19tYXhfaW5hY3Rpdml0eTsKIAogCXdwYV9zLT5hcF9jb25maWd1cmVkX2NiID0gcDJwX2dvX2NvbmZpZ3VyZWQ7CkBAIC0xMjY4LDYgKzEyOTEsMTM1IEBACiB9CiAKIAorLyoKKyAqIEROUyBIZWFkZXIgc2VjdGlvbiBpcyB1c2VkIG9ubHkgdG8gY2FsY3VsYXRlIGNvbXByZXNzaW9uIHBvaW50ZXJzLCBzbyB0aGUKKyAqIGNvbnRlbnRzIG9mIHRoaXMgZGF0YSBkb2VzIG5vdCBtYXR0ZXIsIGJ1dCB0aGUgbGVuZ3RoIG5lZWRzIHRvIGJlIHJlc2VydmVkCisgKiBpbiB0aGUgdmlydHVhbCBwYWNrZXQuCisgKi8KKyNkZWZpbmUgRE5TX0hFQURFUl9MRU4gMTIKKworLyoKKyAqIDI3LW9jdGV0IGluLW1lbW9yeSBwYWNrZXQgZnJvbSBQMlAgc3BlY2lmaWNhdGlvbiBjb250YWluaW5nIHR3byBpbXBsaWVkCisgKiBxdWVyaWVzIGZvciBfdGNwLmxjb2FsLiBQVFIgSU4gYW5kIF91ZHAubG9jYWwuIFBUUiBJTgorICovCisjZGVmaW5lIFAyUF9TRF9JTl9NRU1PUllfTEVOIDI3CisKK3N0YXRpYyBpbnQgcDJwX3NkX2Ruc191bmNvbXByZXNzX2xhYmVsKGNoYXIgKip1cG9zLCBjaGFyICp1ZW5kLCB1OCAqc3RhcnQsCisJCQkJICAgICAgIHU4ICoqc3BvcywgY29uc3QgdTggKmVuZCkKK3sKKwl3aGlsZSAoKnNwb3MgPCBlbmQpIHsKKwkJdTggdmFsID0gKCgqc3BvcylbMF0gJiAweGMwKSA+PiA2OworCQlpbnQgbGVuOworCisJCWlmICh2YWwgPT0gMSB8fCB2YWwgPT0gMikgeworCQkJLyogVGhlc2UgYXJlIHJlc2VydmVkIHZhbHVlcyBpbiBSRkMgMTAzNSAqLworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IEludmFsaWQgZG9tYWluIG5hbWUgIgorCQkJCSAgICJzZXF1ZW5jZSBzdGFydGluZyB3aXRoIDB4JXgiLCB2YWwpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKHZhbCA9PSAzKSB7CisJCQl1MTYgb2Zmc2V0OworCQkJdTggKnNwb3NfdG1wOworCisJCQkvKiBPZmZzZXQgKi8KKwkJCWlmICgqc3BvcyArIDIgPiBlbmQpIHsKKwkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogTm8gcm9vbSBmb3IgZnVsbCAiCisJCQkJCSAgICJETlMgb2Zmc2V0IGZpZWxkIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlvZmZzZXQgPSAoKCgqc3BvcylbMF0gJiAweDNmKSA8PCA4KSB8ICgqc3BvcylbMV07CisJCQlpZiAob2Zmc2V0ID49ICpzcG9zIC0gc3RhcnQpIHsKKwkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogSW52YWxpZCBETlMgIgorCQkJCQkgICAicG9pbnRlciBvZmZzZXQgJXUiLCBvZmZzZXQpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJKCpzcG9zKSArPSAyOworCQkJc3Bvc190bXAgPSBzdGFydCArIG9mZnNldDsKKwkJCXJldHVybiBwMnBfc2RfZG5zX3VuY29tcHJlc3NfbGFiZWwodXBvcywgdWVuZCwgc3RhcnQsCisJCQkJCQkJICAgJnNwb3NfdG1wLAorCQkJCQkJCSAgICpzcG9zIC0gMik7CisJCX0KKworCQkvKiBMYWJlbCAqLworCQlsZW4gPSAoKnNwb3MpWzBdICYgMHgzZjsKKwkJaWYgKGxlbiA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJKCpzcG9zKSsrOworCQlpZiAoKnNwb3MgKyBsZW4gPiBlbmQpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBJbnZhbGlkIGRvbWFpbiBuYW1lICIKKwkJCQkgICAic2VxdWVuY2UgLSBubyByb29tIGZvciBsYWJlbCB3aXRoIGxlbmd0aCAiCisJCQkJICAgIiV1IiwgbGVuKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmICgqdXBvcyArIGxlbiArIDIgPiB1ZW5kKQorCQkJcmV0dXJuIC0yOworCisJCW9zX21lbWNweSgqdXBvcywgKnNwb3MsIGxlbik7CisJCSpzcG9zICs9IGxlbjsKKwkJKnVwb3MgKz0gbGVuOworCQkoKnVwb3MpWzBdID0gJy4nOworCQkoKnVwb3MpKys7CisJCSgqdXBvcylbMF0gPSAnXDAnOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIFVuY29tcHJlc3MgZG9tYWluIG5hbWVzIHBlciBSRkMgMTAzNSB1c2luZyB0aGUgUDJQIFNEIGluLW1lbW9yeSBwYWNrZXQuCisgKiBSZXR1cm5zIC0xIG9uIHBhcnNpbmcgZXJyb3IgKGludmFsaWQgaW5wdXQgc2VxdWVuY2UpLCAtMiBpZiBvdXRwdXQgYnVmZmVyIGlzCisgKiBub3QgbGFyZ2UgZW5vdWdoICovCitzdGF0aWMgaW50IHAycF9zZF9kbnNfdW5jb21wcmVzcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLCBjb25zdCB1OCAqbXNnLAorCQkJCSBzaXplX3QgbXNnX2xlbiwgc2l6ZV90IG9mZnNldCkKK3sKKwkvKiAyNy1vY3RldCBpbi1tZW1vcnkgcGFja2V0IGZyb20gUDJQIHNwZWNpZmljYXRpb24gKi8KKwljb25zdCBjaGFyICpwcmVmaXggPSAiXHgwNF90Y3BceDA1bG9jYWxceDAwXHgwMFx4MENceDAwXHgwMSIKKwkJIlx4MDRfdWRwXHhDMFx4MTFceDAwXHgwQ1x4MDBceDAxIjsKKwl1OCAqdG1wLCAqZW5kLCAqc3BvczsKKwljaGFyICp1cG9zLCAqdWVuZDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChidWZfbGVuIDwgMikKKwkJcmV0dXJuIC0xOworCWlmIChvZmZzZXQgPiBtc2dfbGVuKQorCQlyZXR1cm4gLTE7CisKKwl0bXAgPSBvc19tYWxsb2MoRE5TX0hFQURFUl9MRU4gKyBQMlBfU0RfSU5fTUVNT1JZX0xFTiArIG1zZ19sZW4pOworCWlmICh0bXAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXNwb3MgPSB0bXAgKyBETlNfSEVBREVSX0xFTiArIFAyUF9TRF9JTl9NRU1PUllfTEVOOworCWVuZCA9IHNwb3MgKyBtc2dfbGVuOworCXNwb3MgKz0gb2Zmc2V0OworCisJb3NfbWVtc2V0KHRtcCwgMCwgRE5TX0hFQURFUl9MRU4pOworCW9zX21lbWNweSh0bXAgKyBETlNfSEVBREVSX0xFTiwgcHJlZml4LCBQMlBfU0RfSU5fTUVNT1JZX0xFTik7CisJb3NfbWVtY3B5KHRtcCArIEROU19IRUFERVJfTEVOICsgUDJQX1NEX0lOX01FTU9SWV9MRU4sIG1zZywgbXNnX2xlbik7CisKKwl1cG9zID0gYnVmOworCXVlbmQgPSBidWYgKyBidWZfbGVuOworCisJcmV0ID0gcDJwX3NkX2Ruc191bmNvbXByZXNzX2xhYmVsKCZ1cG9zLCB1ZW5kLCB0bXAsICZzcG9zLCBlbmQpOworCWlmIChyZXQpIHsKKwkJb3NfZnJlZSh0bXApOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICh1cG9zID09IGJ1ZikgeworCQl1cG9zWzBdID0gJy4nOworCQl1cG9zWzFdID0gJ1wwJzsKKwl9IGVsc2UgaWYgKHVwb3NbLTFdID09ICcuJykKKwkJdXBvc1stMV0gPSAnXDAnOworCisJb3NfZnJlZSh0bXApOworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBzdHJ1Y3QgcDJwX3Nydl9ib25qb3VyICoKIHdwYXNfcDJwX3NlcnZpY2VfZ2V0X2JvbmpvdXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCSAgICAgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqcXVlcnkpCkBAIC0xMzU4LDEzICsxNTEwLDQwIEBACiB9CiAKIAorc3RhdGljIGludCBtYXRjaF9ib25qb3VyX3F1ZXJ5KHN0cnVjdCBwMnBfc3J2X2JvbmpvdXIgKmJzcnYsIGNvbnN0IHU4ICpxdWVyeSwKKwkJCSAgICAgICBzaXplX3QgcXVlcnlfbGVuKQoreworCWNoYXIgc3RyX3J4WzI1Nl0sIHN0cl9zcnZbMjU2XTsKKworCWlmIChxdWVyeV9sZW4gPCAzIHx8IHdwYWJ1Zl9sZW4oYnNydi0+cXVlcnkpIDwgMykKKwkJcmV0dXJuIDA7IC8qIFRvbyBzaG9ydCB0byBpbmNsdWRlIEROUyBUeXBlIGFuZCBWZXJzaW9uICovCisJaWYgKG9zX21lbWNtcChxdWVyeSArIHF1ZXJ5X2xlbiAtIDMsCisJCSAgICAgIHdwYWJ1Zl9oZWFkX3U4KGJzcnYtPnF1ZXJ5KSArIHdwYWJ1Zl9sZW4oYnNydi0+cXVlcnkpIC0gMywKKwkJICAgICAgMykgIT0gMCkKKwkJcmV0dXJuIDA7IC8qIE1pc21hdGNoIGluIEROUyBUeXBlIG9yIFZlcnNpb24gKi8KKwlpZiAocXVlcnlfbGVuID09IHdwYWJ1Zl9sZW4oYnNydi0+cXVlcnkpICYmCisJICAgIG9zX21lbWNtcChxdWVyeSwgd3BhYnVmX2hlYWQoYnNydi0+cXVlcnkpLCBxdWVyeV9sZW4gLSAzKSA9PSAwKQorCQlyZXR1cm4gMTsgLyogQmluYXJ5IG1hdGNoICovCisKKwlpZiAocDJwX3NkX2Ruc191bmNvbXByZXNzKHN0cl9yeCwgc2l6ZW9mKHN0cl9yeCksIHF1ZXJ5LCBxdWVyeV9sZW4gLSAzLAorCQkJCSAgMCkpCisJCXJldHVybiAwOyAvKiBGYWlsZWQgdG8gdW5jb21wcmVzcyBxdWVyeSAqLworCWlmIChwMnBfc2RfZG5zX3VuY29tcHJlc3Moc3RyX3Nydiwgc2l6ZW9mKHN0cl9zcnYpLAorCQkJCSAgd3BhYnVmX2hlYWQoYnNydi0+cXVlcnkpLAorCQkJCSAgd3BhYnVmX2xlbihic3J2LT5xdWVyeSkgLSAzLCAwKSkKKwkJcmV0dXJuIDA7IC8qIEZhaWxlZCB0byB1bmNvbXByZXNzIHNlcnZpY2UgKi8KKworCXJldHVybiBvc19zdHJjbXAoc3RyX3J4LCBzdHJfc3J2KSA9PSAwOworfQorCisKIHN0YXRpYyB2b2lkIHdwYXNfc2RfcmVxX2JvbmpvdXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQlzdHJ1Y3Qgd3BhYnVmICpyZXNwLCB1OCBzcnZfdHJhbnNfaWQsCiAJCQkJY29uc3QgdTggKnF1ZXJ5LCBzaXplX3QgcXVlcnlfbGVuKQogewogCXN0cnVjdCBwMnBfc3J2X2JvbmpvdXIgKmJzcnY7Ci0Jc3RydWN0IHdwYWJ1ZiBidWY7CiAJdTggKmxlbl9wb3M7CisJaW50IG1hdGNoZXMgPSAwOwogCiAJd3BhX2hleGR1bXBfYXNjaWkoTVNHX0RFQlVHLCAiUDJQOiBTRCBSZXF1ZXN0IGZvciBCb25qb3VyIiwKIAkJCSAgcXVlcnksIHF1ZXJ5X2xlbik7CkBAIC0xMzgwLDM5ICsxNTU5LDUyIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAod3BhYnVmX3RhaWxyb29tKHJlc3ApIDwgNSkKLQkJcmV0dXJuOwotCS8qIExlbmd0aCAodG8gYmUgZmlsbGVkKSAqLwotCWxlbl9wb3MgPSB3cGFidWZfcHV0KHJlc3AsIDIpOwotCXdwYWJ1Zl9wdXRfdTgocmVzcCwgUDJQX1NFUlZfQk9OSk9VUik7Ci0Jd3BhYnVmX3B1dF91OChyZXNwLCBzcnZfdHJhbnNfaWQpOworCWRsX2xpc3RfZm9yX2VhY2goYnNydiwgJndwYV9zLT5nbG9iYWwtPnAycF9zcnZfYm9uam91ciwKKwkJCSBzdHJ1Y3QgcDJwX3Nydl9ib25qb3VyLCBsaXN0KSB7CisJCWlmICghbWF0Y2hfYm9uam91cl9xdWVyeShic3J2LCBxdWVyeSwgcXVlcnlfbGVuKSkKKwkJCWNvbnRpbnVlOwogCi0Jd3BhYnVmX3NldCgmYnVmLCBxdWVyeSwgcXVlcnlfbGVuKTsKLQlic3J2ID0gd3Bhc19wMnBfc2VydmljZV9nZXRfYm9uam91cih3cGFfcywgJmJ1Zik7Ci0JaWYgKGJzcnYgPT0gTlVMTCkgeworCQlpZiAod3BhYnVmX3RhaWxyb29tKHJlc3ApIDwKKwkJICAgIDUgKyBxdWVyeV9sZW4gKyB3cGFidWZfbGVuKGJzcnYtPnJlc3ApKQorCQkJcmV0dXJuOworCisJCW1hdGNoZXMrKzsKKworCQkvKiBMZW5ndGggKHRvIGJlIGZpbGxlZCkgKi8KKwkJbGVuX3BvcyA9IHdwYWJ1Zl9wdXQocmVzcCwgMik7CisJCXdwYWJ1Zl9wdXRfdTgocmVzcCwgUDJQX1NFUlZfQk9OSk9VUik7CisJCXdwYWJ1Zl9wdXRfdTgocmVzcCwgc3J2X3RyYW5zX2lkKTsKKworCQkvKiBTdGF0dXMgQ29kZSAqLworCQl3cGFidWZfcHV0X3U4KHJlc3AsIFAyUF9TRF9TVUNDRVNTKTsKKwkJd3BhX2hleGR1bXBfYXNjaWkoTVNHX0RFQlVHLCAiUDJQOiBNYXRjaGluZyBCb25qb3VyIHNlcnZpY2UiLAorCQkJCSAgd3BhYnVmX2hlYWQoYnNydi0+cmVzcCksCisJCQkJICB3cGFidWZfbGVuKGJzcnYtPnJlc3ApKTsKKworCQkvKiBSZXNwb25zZSBEYXRhICovCisJCXdwYWJ1Zl9wdXRfZGF0YShyZXNwLCBxdWVyeSwgcXVlcnlfbGVuKTsgLyogS2V5ICovCisJCXdwYWJ1Zl9wdXRfYnVmKHJlc3AsIGJzcnYtPnJlc3ApOyAvKiBWYWx1ZSAqLworCisJCVdQQV9QVVRfTEUxNihsZW5fcG9zLCAodTggKikgd3BhYnVmX3B1dChyZXNwLCAwKSAtIGxlbl9wb3MgLSAyKTsKKwl9CisKKwlpZiAobWF0Y2hlcyA9PSAwKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBSZXF1ZXN0ZWQgQm9uam91ciBzZXJ2aWNlIG5vdCAiCiAJCQkgICAiYXZhaWxhYmxlIik7CisJCWlmICh3cGFidWZfdGFpbHJvb20ocmVzcCkgPCA1KQorCQkJcmV0dXJuOworCisJCS8qIExlbmd0aCAodG8gYmUgZmlsbGVkKSAqLworCQlsZW5fcG9zID0gd3BhYnVmX3B1dChyZXNwLCAyKTsKKwkJd3BhYnVmX3B1dF91OChyZXNwLCBQMlBfU0VSVl9CT05KT1VSKTsKKwkJd3BhYnVmX3B1dF91OChyZXNwLCBzcnZfdHJhbnNfaWQpOwogCiAJCS8qIFN0YXR1cyBDb2RlICovCiAJCXdwYWJ1Zl9wdXRfdTgocmVzcCwgUDJQX1NEX1JFUVVFU1RFRF9JTkZPX05PVF9BVkFJTEFCTEUpOwogCQkvKiBSZXNwb25zZSBEYXRhOiBlbXB0eSAqLwogCQlXUEFfUFVUX0xFMTYobGVuX3BvcywgKHU4ICopIHdwYWJ1Zl9wdXQocmVzcCwgMCkgLSBsZW5fcG9zIC0KIAkJCSAgICAgMik7Ci0JCXJldHVybjsKIAl9Ci0KLQkvKiBTdGF0dXMgQ29kZSAqLwotCXdwYWJ1Zl9wdXRfdTgocmVzcCwgUDJQX1NEX1NVQ0NFU1MpOwotCXdwYV9oZXhkdW1wX2FzY2lpKE1TR19ERUJVRywgIlAyUDogTWF0Y2hpbmcgQm9uam91ciBzZXJ2aWNlIiwKLQkJCSAgd3BhYnVmX2hlYWQoYnNydi0+cmVzcCksIHdwYWJ1Zl9sZW4oYnNydi0+cmVzcCkpOwotCi0JaWYgKHdwYWJ1Zl90YWlscm9vbShyZXNwKSA+PQotCSAgICB3cGFidWZfbGVuKGJzcnYtPnF1ZXJ5KSArIHdwYWJ1Zl9sZW4oYnNydi0+cmVzcCkpIHsKLQkJLyogUmVzcG9uc2UgRGF0YSAqLwotCQl3cGFidWZfcHV0X2J1ZihyZXNwLCBic3J2LT5xdWVyeSk7IC8qIEtleSAqLwotCQl3cGFidWZfcHV0X2J1ZihyZXNwLCBic3J2LT5yZXNwKTsgLyogVmFsdWUgKi8KLQl9Ci0JV1BBX1BVVF9MRTE2KGxlbl9wb3MsICh1OCAqKSB3cGFidWZfcHV0KHJlc3AsIDApIC0gbGVuX3BvcyAtIDIpOwogfQogCiAKQEAgLTE5NzMsMTQgKzIxNjUsNiBAQAogewogCXN0cnVjdCBwMnBfc3J2X2JvbmpvdXIgKmJzcnY7CiAKLQlic3J2ID0gd3Bhc19wMnBfc2VydmljZV9nZXRfYm9uam91cih3cGFfcywgcXVlcnkpOwotCWlmIChic3J2KSB7Ci0JCXdwYWJ1Zl9mcmVlKHF1ZXJ5KTsKLQkJd3BhYnVmX2ZyZWUoYnNydi0+cmVzcCk7Ci0JCWJzcnYtPnJlc3AgPSByZXNwOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlic3J2ID0gb3NfemFsbG9jKHNpemVvZigqYnNydikpOwogCWlmIChic3J2ID09IE5VTEwpCiAJCXJldHVybiAtMTsKQEAgLTIxODUsMTggKzIzNjksMTUgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmZGVmIEFORFJPSURfUDJQCi0JLyogSWYgcHJvdmlzaW9uIGRpc2NvdmVyeSBmYWlsZWQgaXQgaXMgc2FmZSB0byBjYW5jZWwgdGhlIHRpbWVyIGhlcmUgYW5kCi0JICogYWxzbyBkbyBub3Qgc3RhcnQgdGhlIGpvaW4gKi8KLQlpZiAod3BhX3MtPnBlbmRpbmdfcGRfYmVmb3JlX2pvaW4gJiYKLQkgICAgKG9zX21lbWNtcChwZWVyLCB3cGFfcy0+cGVuZGluZ19qb2luX2Rldl9hZGRyLCBFVEhfQUxFTikgPT0gMCB8fAotCSAgICAgb3NfbWVtY21wKHBlZXIsIHdwYV9zLT5wZW5kaW5nX2pvaW5faWZhY2VfYWRkciwgRVRIX0FMRU4pID09IDApKSB7CisJaWYgKHN0YXR1cyA9PSBQMlBfUFJPVl9ESVNDX1RJTUVPVVRfSk9JTikgewogCQl3cGFfcy0+cGVuZGluZ19wZF9iZWZvcmVfam9pbiA9IDA7Ci0JCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBEbyBub3QgU3RhcnQgcGVuZGluZyAiCi0JCQkgICAiam9pbi1leGlzdGluZy1ncm91cCBvcGVyYXRpb24iKTsKLQkJZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc19wMnBfcGRfYmVmb3JlX2pvaW5fdGltZW91dCwgd3BhX3MsIE5VTEwpOworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogU3RhcnRpbmcgcGVuZGluZyAiCisJCQkgICAiam9pbi1leGlzdGluZy1ncm91cCBvcGVyYXRpb24gKG5vIEFDSyBmb3IgUEQgIgorCQkJICAgIlJlcSBhdHRlbXB0cykiKTsKKwkJd3Bhc19wMnBfam9pbl9zdGFydCh3cGFfcyk7CisJCXJldHVybjsKIAl9Ci0jZW5kaWYgLyogQU5EUk9JRF9QMlAgKi8KKwogCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCBQMlBfRVZFTlRfUFJPVl9ESVNDX0ZBSUxVUkUKIAkJIiBwMnBfZGV2X2FkZHI9IiBNQUNTVFIgIiBzdGF0dXM9JWQiLAogCQlNQUMyU1RSKHBlZXIpLCBzdGF0dXMpOwpAQCAtMjMyNyw2ICsyNTA4LDcgQEAKIAkJCXdwYXNfcDJwX2dyb3VwX2FkZF9wZXJzaXN0ZW50KAogCQkJCXdwYV9zLCBzLCBnbywgZ28gPyBvcF9mcmVxIDogMCwgMCk7CiAJCX0gZWxzZSBpZiAoYnNzaWQpIHsKKwkJCXdwYV9zLT51c2VyX2luaXRpYXRlZF9wZCA9IDA7CiAJCQl3cGFzX3AycF9qb2luKHdwYV9zLCBic3NpZCwgZ29fZGV2X2FkZHIsCiAJCQkJICAgICAgd3BhX3MtPnAycF93cHNfbWV0aG9kLCAwKTsKIAkJfQpAQCAtMjgzOSw2ICszMDIxLDggQEAKIAogCXAycC5wMnBfaW50cmFfYnNzID0gd3BhX3MtPmNvbmYtPnAycF9pbnRyYV9ic3M7CiAKKwlwMnAubWF4X2xpc3RlbiA9IHdwYV9zLT5tYXhfcmVtYWluX29uX2NoYW47CisKICNpZmRlZiBBTkRST0lEX1AyUAogCWlmKHdwYV9zLT5kcnZfZmxhZ3MgJiBXUEFfRFJJVkVSX0ZMQUdTX01VTFRJX0NIQU5ORUxfQ09OQ1VSUkVOVCkgewogCQlwMnAucDJwX2NvbmN1cnJlbmN5ID0gUDJQX01VTFRJX0NIQU5ORUxfQ09OQ1VSUkVOVDsKQEAgLTI4ODgsNyArMzA3Miw2IEBACiAJd3BhX3MtPmdvX3BhcmFtcyA9IE5VTEw7CiAJZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc19wMnBfZ3JvdXBfZm9ybWF0aW9uX3RpbWVvdXQsIHdwYV9zLCBOVUxMKTsKIAllbG9vcF9jYW5jZWxfdGltZW91dCh3cGFzX3AycF9qb2luX3NjYW4sIHdwYV9zLCBOVUxMKTsKLQllbG9vcF9jYW5jZWxfdGltZW91dCh3cGFzX3AycF9wZF9iZWZvcmVfam9pbl90aW1lb3V0LCB3cGFfcywgTlVMTCk7CiAJd3BhX3MtPnAycF9sb25nX2xpc3RlbiA9IDA7CiAJZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc19wMnBfbG9uZ19saXN0ZW5fdGltZW91dCwgd3BhX3MsIE5VTEwpOwogCWVsb29wX2NhbmNlbF90aW1lb3V0KHdwYXNfcDJwX2dyb3VwX2lkbGVfdGltZW91dCwgd3BhX3MsIE5VTEwpOwpAQCAtMjk0OSw2ICszMTMyLDggQEAKIAogc3RhdGljIGludCB3cGFzX3AycF9jcmVhdGVfaWZhY2Uoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKKwlpZiAod3BhX3MtPmNvbmYtPnAycF9ub19ncm91cF9pZmFjZSkKKwkJcmV0dXJuIDA7IC8qIHNlcGFyYXRlIGludGVyZmFjZSBkaXNhYmxlZCBwZXIgY29uZmlndXJhdGlvbiAqLwogCWlmICh3cGFfcy0+ZHJ2X2ZsYWdzICYKIAkgICAgKFdQQV9EUklWRVJfRkxBR1NfUDJQX0RFRElDQVRFRF9JTlRFUkZBQ0UgfAogCSAgICAgV1BBX0RSSVZFUl9GTEFHU19QMlBfTUdNVF9BTkRfTk9OX1AyUCkpCkBAIC0yOTY5LDcgKzMxNTQsNyBAQAogCQkJCSBlbnVtIHAycF93cHNfbWV0aG9kIHdwc19tZXRob2QsCiAJCQkJIGludCBnb19pbnRlbnQsIGNvbnN0IHU4ICpvd25faW50ZXJmYWNlX2FkZHIsCiAJCQkJIHVuc2lnbmVkIGludCBmb3JjZV9mcmVxLCBpbnQgcGVyc2lzdGVudF9ncm91cCwKLQkJCQkgc3RydWN0IHdwYV9zc2lkICpzc2lkKQorCQkJCSBzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQsIHVuc2lnbmVkIGludCBwcmVmX2ZyZXEpCiB7CiAJaWYgKHBlcnNpc3RlbnRfZ3JvdXAgJiYgd3BhX3MtPmNvbmYtPnBlcnNpc3RlbnRfcmVjb25uZWN0KQogCQlwZXJzaXN0ZW50X2dyb3VwID0gMjsKQEAgLTI5OTEsNyArMzE3Niw3IEBACiAJCQkgICBnb19pbnRlbnQsIG93bl9pbnRlcmZhY2VfYWRkciwgZm9yY2VfZnJlcSwKIAkJCSAgIHBlcnNpc3RlbnRfZ3JvdXAsIHNzaWQgPyBzc2lkLT5zc2lkIDogTlVMTCwKIAkJCSAgIHNzaWQgPyBzc2lkLT5zc2lkX2xlbiA6IDAsCi0JCQkgICB3cGFfcy0+cDJwX3BkX2JlZm9yZV9nb19uZWcpOworCQkJICAgd3BhX3MtPnAycF9wZF9iZWZvcmVfZ29fbmVnLCBwcmVmX2ZyZXEpOwogfQogCiAKQEAgLTMwMDAsNyArMzE4NSw3IEBACiAJCQkJZW51bSBwMnBfd3BzX21ldGhvZCB3cHNfbWV0aG9kLAogCQkJCWludCBnb19pbnRlbnQsIGNvbnN0IHU4ICpvd25faW50ZXJmYWNlX2FkZHIsCiAJCQkJdW5zaWduZWQgaW50IGZvcmNlX2ZyZXEsIGludCBwZXJzaXN0ZW50X2dyb3VwLAotCQkJCXN0cnVjdCB3cGFfc3NpZCAqc3NpZCkKKwkJCQlzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQsIHVuc2lnbmVkIGludCBwcmVmX2ZyZXEpCiB7CiAJaWYgKHBlcnNpc3RlbnRfZ3JvdXAgJiYgd3BhX3MtPmNvbmYtPnBlcnNpc3RlbnRfcmVjb25uZWN0KQogCQlwZXJzaXN0ZW50X2dyb3VwID0gMjsKQEAgLTMwMTEsNyArMzE5Niw3IEBACiAJcmV0dXJuIHAycF9hdXRob3JpemUod3BhX3MtPmdsb2JhbC0+cDJwLCBwZWVyX2FkZHIsIHdwc19tZXRob2QsCiAJCQkgICAgIGdvX2ludGVudCwgb3duX2ludGVyZmFjZV9hZGRyLCBmb3JjZV9mcmVxLAogCQkJICAgICBwZXJzaXN0ZW50X2dyb3VwLCBzc2lkID8gc3NpZC0+c3NpZCA6IE5VTEwsCi0JCQkgICAgIHNzaWQgPyBzc2lkLT5zc2lkX2xlbiA6IDApOworCQkJICAgICBzc2lkID8gc3NpZC0+c3NpZF9sZW4gOiAwLCBwcmVmX2ZyZXEpOwogfQogCiAKQEAgLTMwMzgsMjEgKzMyMjMsNiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHdwYXNfcDJwX3BkX2JlZm9yZV9qb2luX3RpbWVvdXQodm9pZCAqZWxvb3BfY3R4LCB2b2lkICp0aW1lb3V0X2N0eCkKLXsKLQlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zID0gZWxvb3BfY3R4OwotCWlmICghd3BhX3MtPnBlbmRpbmdfcGRfYmVmb3JlX2pvaW4pCi0JCXJldHVybjsKLQkvKgotCSAqIFByb3Zpc2lvbiBEaXNjb3ZlcnkgUmVzcG9uc2UgbWF5IGhhdmUgYmVlbiBsb3N0IC0gdHJ5IHRvIGNvbm5lY3QKLQkgKiBhbnl3YXkgc2luY2Ugd2UgZG8gbm90IG5lZWQgYW55IGluZm9ybWF0aW9uIGZyb20gdGhpcyBQRC4KLQkgKi8KLQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogUEQgdGltZW91dCBmb3Igam9pbi1leGlzdGluZy1ncm91cCAtICIKLQkJICAgInRyeSB0byBjb25uZWN0IGFueXdheSIpOwotCXdwYXNfcDJwX2pvaW5fc3RhcnQod3BhX3MpOwotfQotCi0KIHN0YXRpYyBpbnQgd3Bhc19jaGVja19mcmVxX2NvbmZsaWN0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGludCBmcmVxKQogewogCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqaWZhY2U7CkBAIC0zMTcwLDcgKzMzNDAsNyBAQAogCQlpZiAocDJwX3Byb3ZfZGlzY19yZXEod3BhX3MtPmdsb2JhbC0+cDJwLAogCQkJCSAgICAgIHdwYV9zLT5wZW5kaW5nX2pvaW5fZGV2X2FkZHIsCiAJCQkJICAgICAgd3BhX3MtPnBlbmRpbmdfcGRfY29uZmlnX21ldGhvZHMsIGpvaW4sCi0JCQkJICAgICAgMCkgPCAwKSB7CisJCQkJICAgICAgMCwgd3BhX3MtPnVzZXJfaW5pdGlhdGVkX3BkKSA8IDApIHsKIAkJCXdwYV9zLT5wMnBfYXV0b19wZCA9IDA7CiAJCQl3cGFfbXNnKHdwYV9zLCBNU0dfSU5GTywgUDJQX0VWRU5UX1BST1ZfRElTQ19GQUlMVVJFCiAJCQkJIiBwMnBfZGV2X2FkZHI9IiBNQUNTVFIgIiBzdGF0dXM9Ti9BIiwKQEAgLTMyODAsMjUgKzM0NTAsMTMgQEAKIAogCQlpZiAocDJwX3Byb3ZfZGlzY19yZXEod3BhX3MtPmdsb2JhbC0+cDJwLAogCQkJCSAgICAgIHdwYV9zLT5wZW5kaW5nX2pvaW5fZGV2X2FkZHIsIG1ldGhvZCwgMSwKLQkJCQkgICAgICBmcmVxKSA8IDApIHsKKwkJCQkgICAgICBmcmVxLCB3cGFfcy0+dXNlcl9pbml0aWF0ZWRfcGQpIDwgMCkgewogCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IEZhaWxlZCB0byBzZW5kIFByb3Zpc2lvbiAiCiAJCQkJICAgIkRpc2NvdmVyeSBSZXF1ZXN0IGJlZm9yZSBqb2luaW5nIGFuICIKIAkJCQkgICAiZXhpc3RpbmcgZ3JvdXAiKTsKIAkJCXdwYV9zLT5wZW5kaW5nX3BkX2JlZm9yZV9qb2luID0gMDsKIAkJCWdvdG8gc3RhcnQ7CiAJCX0KLQotCQkvKgotCQkgKiBBY3R1YWwgam9pbiBvcGVyYXRpb24gd2lsbCBiZSBzdGFydGVkIGZyb20gdGhlIEFjdGlvbiBmcmFtZQotCQkgKiBUWCBzdGF0dXMgY2FsbGJhY2sgKGlmIG5vIEFDSyBpcyByZWNlaXZlZCkgb3Igd2hlbiB0aGUKLQkJICogUHJvdmlzaW9uIERpc2NvdmVyeSBSZXNwb25zZSBpcyByZWNlaXZlZC4gVXNlIGEgc2hvcnQKLQkJICogdGltZW91dCBhcyBhIGJhY2t1cCBtZWNoYW5pc20gc2hvdWxkIHRoZSBQcm92aXNpb24gRGlzY292ZXJ5Ci0JCSAqIFJlc3BvbnNlIGJlIGxvc3QgZm9yIGFueSByZWFzb24uCi0JCSAqLwotCQllbG9vcF9jYW5jZWxfdGltZW91dCh3cGFzX3AycF9wZF9iZWZvcmVfam9pbl90aW1lb3V0LCB3cGFfcywKLQkJCQkgICAgIE5VTEwpOwotCQllbG9vcF9yZWdpc3Rlcl90aW1lb3V0KDIsIDAsIHdwYXNfcDJwX3BkX2JlZm9yZV9qb2luX3RpbWVvdXQsCi0JCQkJICAgICAgIHdwYV9zLCBOVUxMKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzQyNSw3ICszNTgzLDYgQEAKIAlzdHJ1Y3QgcDJwX2dvX25lZ19yZXN1bHRzIHJlczsKIAlzdHJ1Y3Qgd3BhX2JzcyAqYnNzOwogCi0JZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc19wMnBfcGRfYmVmb3JlX2pvaW5fdGltZW91dCwgd3BhX3MsIE5VTEwpOwogCWdyb3VwID0gd3Bhc19wMnBfZ2V0X2dyb3VwX2lmYWNlKHdwYV9zLCAwLCAwKTsKIAlpZiAoZ3JvdXAgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwpAQCAtMzQzMyw2ICszNTkwLDE1IEBACiAJCW9zX21lbWNweShncm91cC0+cDJwX3Bpbiwgd3BhX3MtPnAycF9waW4sCiAJCQkgIHNpemVvZihncm91cC0+cDJwX3BpbikpOwogCQlncm91cC0+cDJwX3dwc19tZXRob2QgPSB3cGFfcy0+cDJwX3dwc19tZXRob2Q7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTmVlZCB0byBtYXJrIHRoZSBjdXJyZW50IGludGVyZmFjZSBmb3IgcDJwX2dyb3VwX2Zvcm1hdGlvbgorCQkgKiB3aGVuIGEgc2VwYXJhdGUgZ3JvdXAgaW50ZXJmYWNlIGlzIG5vdCB1c2VkLiBUaGlzIGlzIG5lZWRlZAorCQkgKiB0byBhbGxvdyBwMnBfY2FuY2VsIHN0b3AgYSBwZW5kaW5nIHAycF9jb25uZWN0LWpvaW4uCisJCSAqIHdwYXNfcDJwX2luaXRfZ3JvdXBfaW50ZXJmYWNlKCkgYWRkcmVzc2VzIHRoaXMgZm9yIHRoZSBjYXNlCisJCSAqIHdoZXJlIGEgc2VwYXJhdGUgZ3JvdXAgaW50ZXJmYWNlIGlzIHVzZWQuCisJCSAqLworCQl3cGFfcy0+Z2xvYmFsLT5wMnBfZ3JvdXBfZm9ybWF0aW9uID0gd3BhX3M7CiAJfQogCiAJZ3JvdXAtPnAycF9pbl9wcm92aXNpb25pbmcgPSAxOwpAQCAtMzQ5OSw3ICszNjY1LDcgQEAKIAkJICAgICBpbnQgZ29faW50ZW50LCBpbnQgZnJlcSwgaW50IHBlcnNpc3RlbnRfaWQsIGludCBwZCwKIAkJICAgICBpbnQgaHQ0MCkKIHsKLQlpbnQgZm9yY2VfZnJlcSA9IDAsIG9wZXJfZnJlcSA9IDA7CisJaW50IGZvcmNlX2ZyZXEgPSAwLCBwcmVmX2ZyZXEgPSAwLCBvcGVyX2ZyZXEgPSAwOwogCXU4IGJzc2lkW0VUSF9BTEVOXTsKIAlpbnQgcmV0ID0gMDsKIAllbnVtIHdwYV9kcml2ZXJfaWZfdHlwZSBpZnR5cGU7CkBAIC0zNTY1LDYgKzM3MzEsNyBAQAogCQkJCSAgIHdwYV9zLT5wMnBfYXV0b19zdGFydGVkLnNlYywKIAkJCQkgICB3cGFfcy0+cDJwX2F1dG9fc3RhcnRlZC51c2VjKTsKIAkJfQorCQl3cGFfcy0+dXNlcl9pbml0aWF0ZWRfcGQgPSAxOwogCQlpZiAod3Bhc19wMnBfam9pbih3cGFfcywgaWZhY2VfYWRkciwgZGV2X2FkZHIsIHdwc19tZXRob2QsCiAJCQkJICBhdXRvX2pvaW4pIDwgMCkKIAkJCXJldHVybiAtMTsKQEAgLTM2MTIsNiArMzc3OSwxMyBAQAogCQkJICAgIigldSBNSHopIG5vdCBhdmFpbGFibGUgZm9yIFAyUCAtIHRyeSB0byB1c2UgIgogCQkJICAgImFub3RoZXIgY2hhbm5lbCIsIG9wZXJfZnJlcSk7CiAJCWZvcmNlX2ZyZXEgPSAwOworCX0gZWxzZSBpZiAob3Blcl9mcmVxID4gMCAmJgorCQkgICAod3BhX3MtPmRydl9mbGFncyAmCisJCSAgICBXUEFfRFJJVkVSX0ZMQUdTX01VTFRJX0NIQU5ORUxfQ09OQ1VSUkVOVCkpIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFRyeWluZyB0byBwcmVmZXIgdGhlIGNoYW5uZWwgd2UgIgorCQkJICAgImFyZSBhbHJlYWR5IHVzaW5nICgldSBNSHopIG9uIGFub3RoZXIgaW50ZXJmYWNlIiwKKwkJCSAgIG9wZXJfZnJlcSk7CisJCXByZWZfZnJlcSA9IG9wZXJfZnJlcTsKIAl9IGVsc2UgaWYgKG9wZXJfZnJlcSA+IDApIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFRyeWluZyB0byBmb3JjZSB1cyB0byB1c2UgdGhlICIKIAkJCSAgICJjaGFubmVsIHdlIGFyZSBhbHJlYWR5IHVzaW5nICgldSBNSHopIG9uIGFub3RoZXIgIgpAQCAtMzYzOSwxNSArMzgxMywxNSBAQAogCWlmIChhdXRoKSB7CiAJCWlmICh3cGFzX3AycF9hdXRoX2dvX25lZyh3cGFfcywgcGVlcl9hZGRyLCB3cHNfbWV0aG9kLAogCQkJCQkgZ29faW50ZW50LCBpZl9hZGRyLAotCQkJCQkgZm9yY2VfZnJlcSwgcGVyc2lzdGVudF9ncm91cCwgc3NpZCkgPAotCQkgICAgMCkKKwkJCQkJIGZvcmNlX2ZyZXEsIHBlcnNpc3RlbnRfZ3JvdXAsIHNzaWQsCisJCQkJCSBwcmVmX2ZyZXEpIDwgMCkKIAkJCXJldHVybiAtMTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlpZiAod3Bhc19wMnBfc3RhcnRfZ29fbmVnKHdwYV9zLCBwZWVyX2FkZHIsIHdwc19tZXRob2QsCiAJCQkJICBnb19pbnRlbnQsIGlmX2FkZHIsIGZvcmNlX2ZyZXEsCi0JCQkJICBwZXJzaXN0ZW50X2dyb3VwLCBzc2lkKSA8IDApIHsKKwkJCQkgIHBlcnNpc3RlbnRfZ3JvdXAsIHNzaWQsIHByZWZfZnJlcSkgPCAwKSB7CiAJCWlmICh3cGFfcy0+Y3JlYXRlX3AycF9pZmFjZSkKIAkJCXdwYXNfcDJwX3JlbW92ZV9wZW5kaW5nX2dyb3VwX2ludGVyZmFjZSh3cGFfcyk7CiAJCXJldHVybiAtMTsKQEAgLTM3MDYsMTIgKzM4ODAsMTIgQEAKIHsKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogQ2FuY2VsIHJlbWFpbi1vbi1jaGFubmVsIGNhbGxiYWNrICIKIAkJICAgIihwMnBfbG9uZ19saXN0ZW49JWQgbXMgcGVuZGluZ19hY3Rpb25fdHg9JXApIiwKLQkJICAgd3BhX3MtPnAycF9sb25nX2xpc3Rlbiwgd3BhX3MtPnBlbmRpbmdfYWN0aW9uX3R4KTsKKwkJICAgd3BhX3MtPnAycF9sb25nX2xpc3Rlbiwgb2ZmY2hhbm5lbF9wZW5kaW5nX2FjdGlvbl90eCh3cGFfcykpOwogCWlmICh3cGFfcy0+Z2xvYmFsLT5wMnBfZGlzYWJsZWQgfHwgd3BhX3MtPmdsb2JhbC0+cDJwID09IE5VTEwpCiAJCXJldHVybjsKIAlpZiAocDJwX2xpc3Rlbl9lbmQod3BhX3MtPmdsb2JhbC0+cDJwLCBmcmVxKSA+IDApCiAJCXJldHVybjsgLyogUDJQIG1vZHVsZSBzdGFydGVkIGEgbmV3IG9wZXJhdGlvbiAqLwotCWlmICh3cGFfcy0+cGVuZGluZ19hY3Rpb25fdHgpCisJaWYgKG9mZmNoYW5uZWxfcGVuZGluZ19hY3Rpb25fdHgod3BhX3MpKQogCQlyZXR1cm47CiAJaWYgKHdwYV9zLT5wMnBfbG9uZ19saXN0ZW4gPiAwKQogCQl3cGFfcy0+cDJwX2xvbmdfbGlzdGVuIC09IHdwYV9zLT5tYXhfcmVtYWluX29uX2NoYW47CkBAIC0zNzgwLDcgKzM5NTQsMTEgQEAKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFNldCBHTyBmcmVxIGJhc2VkIG9uIGNvbmZpZ3VyZWQgIgogCQkJICAgImZyZXF1ZW5jeSAlZCBNSHoiLCBwYXJhbXMtPmZyZXEpOwogCX0gZWxzZSBpZiAod3BhX3MtPmNvbmYtPnAycF9vcGVyX3JlZ19jbGFzcyA9PSAxMTUgfHwKLQkJICAgd3BhX3MtPmNvbmYtPnAycF9vcGVyX3JlZ19jbGFzcyA9PSAxMjQpIHsKKwkJICAgd3BhX3MtPmNvbmYtPnAycF9vcGVyX3JlZ19jbGFzcyA9PSAxMTYgfHwKKwkJICAgd3BhX3MtPmNvbmYtPnAycF9vcGVyX3JlZ19jbGFzcyA9PSAxMTcgfHwKKwkJICAgd3BhX3MtPmNvbmYtPnAycF9vcGVyX3JlZ19jbGFzcyA9PSAxMjQgfHwKKwkJICAgd3BhX3MtPmNvbmYtPnAycF9vcGVyX3JlZ19jbGFzcyA9PSAxMjYgfHwKKwkJICAgd3BhX3MtPmNvbmYtPnAycF9vcGVyX3JlZ19jbGFzcyA9PSAxMjcpIHsKIAkJcGFyYW1zLT5mcmVxID0gNTAwMCArIDUgKiB3cGFfcy0+Y29uZi0+cDJwX29wZXJfY2hhbm5lbDsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFNldCBHTyBmcmVxIGJhc2VkIG9uIGNvbmZpZ3VyZWQgIgogCQkJICAgImZyZXF1ZW5jeSAlZCBNSHoiLCBwYXJhbXMtPmZyZXEpOwpAQCAtMzg5OSw3ICs0MDc3LDcgQEAKIAogCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IHJ1bm5pbmcgZmluZCBkdXJpbmcgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50ICovCiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFN0b3AgYW55IG9uLWdvaW5nIFAyUCBGSU5EIik7Ci0Jd3Bhc19wMnBfc3RvcF9maW5kKHdwYV9zKTsKKwl3cGFzX3AycF9zdG9wX2ZpbmRfb3Blcih3cGFfcyk7CiAKIAlpZiAoZnJlcSA9PSAyKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBSZXF1ZXN0IHRvIHN0YXJ0IEdPIG9uIDIuNCBHSHogIgpAQCAtNDAzMCw3ICs0MjA4LDcgQEAKIAl9CiAKIAkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBydW5uaW5nIGZpbmQgZHVyaW5nIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCAqLwotCXdwYXNfcDJwX3N0b3BfZmluZCh3cGFfcyk7CisJd3Bhc19wMnBfc3RvcF9maW5kX29wZXIod3BhX3MpOwogCiAJd3BhX3MtPnAycF9mYWxsYmFja190b19nb19uZWcgPSAwOwogCkBAIC00MDQ0LDE0ICs0MjIyLDE4IEBACiAJCXJldHVybiAtMTsKIAogCXBhcmFtcy5yb2xlX2dvID0gMTsKLQlpZiAoc3NpZC0+cGFzc3BocmFzZSA9PSBOVUxMIHx8Ci0JICAgIG9zX3N0cmxlbihzc2lkLT5wYXNzcGhyYXNlKSA+PSBzaXplb2YocGFyYW1zLnBhc3NwaHJhc2UpKSB7Ci0JCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBJbnZhbGlkIHBhc3NwaHJhc2UgaW4gcGVyc2lzdGVudCAiCi0JCQkgICAiZ3JvdXAiKTsKLQkJcmV0dXJuIC0xOworCXBhcmFtcy5wc2tfc2V0ID0gc3NpZC0+cHNrX3NldDsKKwlpZiAocGFyYW1zLnBza19zZXQpCisJCW9zX21lbWNweShwYXJhbXMucHNrLCBzc2lkLT5wc2ssIHNpemVvZihwYXJhbXMucHNrKSk7CisJaWYgKHNzaWQtPnBhc3NwaHJhc2UpIHsKKwkJaWYgKG9zX3N0cmxlbihzc2lkLT5wYXNzcGhyYXNlKSA+PSBzaXplb2YocGFyYW1zLnBhc3NwaHJhc2UpKSB7CisJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIlAyUDogSW52YWxpZCBwYXNzcGhyYXNlIGluICIKKwkJCQkgICAicGVyc2lzdGVudCBncm91cCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW9zX3N0cmxjcHkocGFyYW1zLnBhc3NwaHJhc2UsIHNzaWQtPnBhc3NwaHJhc2UsCisJCQkgICBzaXplb2YocGFyYW1zLnBhc3NwaHJhc2UpKTsKIAl9Ci0Jb3Nfc3RybGNweShwYXJhbXMucGFzc3BocmFzZSwgc3NpZC0+cGFzc3BocmFzZSwKLQkJICAgc2l6ZW9mKHBhcmFtcy5wYXNzcGhyYXNlKSk7CiAJb3NfbWVtY3B5KHBhcmFtcy5zc2lkLCBzc2lkLT5zc2lkLCBzc2lkLT5zc2lkX2xlbik7CiAJcGFyYW1zLnNzaWRfbGVuID0gc3NpZC0+c3NpZF9sZW47CiAJcGFyYW1zLnBlcnNpc3RlbnRfZ3JvdXAgPSAxOwpAQCAtNDI1Myw3ICs0NDM1LDcgQEAKIAogCXJldHVybiBwMnBfcHJvdl9kaXNjX3JlcSh3cGFfcy0+Z2xvYmFsLT5wMnAsIHBlZXJfYWRkciwKIAkJCQkgY29uZmlnX21ldGhvZHMsIHVzZSA9PSBXUEFTX1AyUF9QRF9GT1JfSk9JTiwKLQkJCQkgMCk7CisJCQkJIDAsIDEpOwogfQogCiAKQEAgLTQyNjYsMTMgKzQ0NDgsMTIgQEAKIAogc3RhdGljIHZvaWQgd3Bhc19wMnBfY2xlYXJfcGVuZGluZ19hY3Rpb25fdHgoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKLQlpZiAoIXdwYV9zLT5wZW5kaW5nX2FjdGlvbl90eCkKKwlpZiAoIW9mZmNoYW5uZWxfcGVuZGluZ19hY3Rpb25fdHgod3BhX3MpKQogCQlyZXR1cm47CiAKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogRHJvcCBwZW5kaW5nIEFjdGlvbiBUWCBkdWUgdG8gbmV3ICIKIAkJICAgIm9wZXJhdGlvbiByZXF1ZXN0Iik7Ci0Jd3BhYnVmX2ZyZWUod3BhX3MtPnBlbmRpbmdfYWN0aW9uX3R4KTsKLQl3cGFfcy0+cGVuZGluZ19hY3Rpb25fdHggPSBOVUxMOworCW9mZmNoYW5uZWxfY2xlYXJfcGVuZGluZ19hY3Rpb25fdHgod3BhX3MpOwogfQogCiAKQEAgLTQyOTksNyArNDQ4MCw3IEBACiB9CiAKIAotdm9pZCB3cGFzX3AycF9zdG9wX2ZpbmQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKK3N0YXRpYyBpbnQgd3Bhc19wMnBfc3RvcF9maW5kX29wZXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAl3cGFzX3AycF9jbGVhcl9wZW5kaW5nX2FjdGlvbl90eCh3cGFfcyk7CiAJd3BhX3MtPnAycF9sb25nX2xpc3RlbiA9IDA7CkBAIC00MzA5LDEyICs0NDkwLDIwIEBACiAKIAlpZiAod3BhX3MtPmRydl9mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfUDJQX01HTVQpIHsKIAkJd3BhX2Rydl9wMnBfc3RvcF9maW5kKHdwYV9zKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAl9CiAKIAlpZiAod3BhX3MtPmdsb2JhbC0+cDJwKQogCQlwMnBfc3RvcF9maW5kKHdwYV9zLT5nbG9iYWwtPnAycCk7CiAKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHdwYXNfcDJwX3N0b3BfZmluZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQoreworCWlmICh3cGFzX3AycF9zdG9wX2ZpbmRfb3Blcih3cGFfcykgPiAwKQorCQlyZXR1cm47CiAJd3Bhc19wMnBfcmVtb3ZlX3BlbmRpbmdfZ3JvdXBfaW50ZXJmYWNlKHdwYV9zKTsKIH0KIApAQCAtNDc0Myw4ICs0OTMyLDE1IEBACiAKIHN0YXRpYyBpbnQgd3Bhc19wMnBfaXNfY2xpZW50KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7Ci0JcmV0dXJuIHdwYV9zLT5jdXJyZW50X3NzaWQgIT0gTlVMTCAmJgotCQl3cGFfcy0+Y3VycmVudF9zc2lkLT5wMnBfZ3JvdXAgJiYKKwlpZiAod3BhX3MtPmN1cnJlbnRfc3NpZCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIGN1cnJlbnRfc3NpZCBjYW4gYmUgY2xlYXJlZCB3aGVuIFAyUCBjbGllbnQgaW50ZXJmYWNlIGdldHMKKwkJICogZGlzY29ubmVjdGVkLCBzbyBhc3N1bWUgdGhpcyBpbnRlcmZhY2Ugd2FzIHVzZWQgYXMgUDJQCisJCSAqIGNsaWVudC4KKwkJICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gd3BhX3MtPmN1cnJlbnRfc3NpZC0+cDJwX2dyb3VwICYmCiAJCXdwYV9zLT5jdXJyZW50X3NzaWQtPm1vZGUgPT0gV1BBU19NT0RFX0lORlJBOwogfQogCkBAIC01MTc5LDYgKzUzNzUsMTMgQEAKIH0KIAogCitzdGF0aWMgdm9pZCB3cGFzX3AycF9zY2FuX3Jlc19pZ25vcmUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkgICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHRzICpzY2FuX3JlcykKK3sKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogSWdub3JlIHNjYW4gcmVzdWx0cyIpOworfQorCisKIGludCB3cGFzX3AycF9jYW5jZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAlzdHJ1Y3Qgd3BhX2dsb2JhbCAqZ2xvYmFsID0gd3BhX3MtPmdsb2JhbDsKQEAgLTUyMDIsNiArNTQwNSwxOCBAQAogCQlmb3VuZCA9IDE7CiAJfQogCisJaWYgKHdwYV9zLT5zY2FuX3Jlc19oYW5kbGVyID09IHdwYXNfcDJwX3NjYW5fcmVzX2pvaW4pIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFN0b3AgcGVuZGluZyBzY2FuIGZvciBqb2luIik7CisJCXdwYV9zLT5zY2FuX3Jlc19oYW5kbGVyID0gd3Bhc19wMnBfc2Nhbl9yZXNfaWdub3JlOworCQlmb3VuZCA9IDE7CisJfQorCisJaWYgKHdwYV9zLT5wZW5kaW5nX3BkX2JlZm9yZV9qb2luKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBTdG9wIHBlbmRpbmcgUEQgYmVmb3JlIGpvaW4iKTsKKwkJd3BhX3MtPnBlbmRpbmdfcGRfYmVmb3JlX2pvaW4gPSAwOworCQlmb3VuZCA9IDE7CisJfQorCiAJd3Bhc19wMnBfc3RvcF9maW5kKHdwYV9zKTsKIAogCWZvciAod3BhX3MgPSBnbG9iYWwtPmlmYWNlczsgd3BhX3M7IHdwYV9zID0gd3BhX3MtPm5leHQpIHsKQEAgLTUyOTQsMTAgKzU1MDksMjkgQEAKIAogaW50IHdwYXNfcDJwX2luX3Byb2dyZXNzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CisJaW50IHJldDsKKwogCWlmICh3cGFfcy0+Z2xvYmFsLT5wMnBfZGlzYWJsZWQgfHwgd3BhX3MtPmdsb2JhbC0+cDJwID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIHAycF9pbl9wcm9ncmVzcyh3cGFfcy0+Z2xvYmFsLT5wMnApOworCXJldCA9IHAycF9pbl9wcm9ncmVzcyh3cGFfcy0+Z2xvYmFsLT5wMnApOworCWlmIChyZXQgPT0gMCkgeworCQkvKgorCQkgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFuIG9uZ29pbmcgV1BTIHByb3Zpc2lvbmluZyBzdGVwIChvcgorCQkgKiBvdGhlciBwYXJ0cyBvZiBncm91cCBmb3JtYXRpb24pIG9uIGFub3RoZXIgaW50ZXJmYWNlIHNpbmNlCisJCSAqIHAycF9pbl9wcm9ncmVzcygpIGRvZXMgbm90IHJlcG9ydCB0aGlzIHRvIGF2b2lkIGlzc3VlcyBmb3IKKwkJICogc2NhbnMgZHVyaW5nIHN1Y2ggcHJvdmlzaW9uaW5nIHN0ZXAuCisJCSAqLworCQlpZiAod3BhX3MtPmdsb2JhbC0+cDJwX2dyb3VwX2Zvcm1hdGlvbiAmJgorCQkgICAgd3BhX3MtPmdsb2JhbC0+cDJwX2dyb3VwX2Zvcm1hdGlvbiAhPSB3cGFfcykgeworCQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiUDJQOiBBbm90aGVyIGludGVyZmFjZSAoJXMpICIKKwkJCQkiaW4gZ3JvdXAgZm9ybWF0aW9uIiwKKwkJCQl3cGFfcy0+Z2xvYmFsLT5wMnBfZ3JvdXBfZm9ybWF0aW9uLT5pZm5hbWUpOworCQkJcmV0ID0gMTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtNTM2Niw3ICs1NjAwLDYgQEAKIAkJCQkJaW50IGdyb3VwX2FkZGVkKQogewogCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqZ3JvdXAgPSB3cGFfczsKLQllbG9vcF9jYW5jZWxfdGltZW91dCh3cGFzX3AycF9wZF9iZWZvcmVfam9pbl90aW1lb3V0LCB3cGFfcywgTlVMTCk7CiAJaWYgKHdwYV9zLT5nbG9iYWwtPnAycF9ncm91cF9mb3JtYXRpb24pCiAJCWdyb3VwID0gd3BhX3MtPmdsb2JhbC0+cDJwX2dyb3VwX2Zvcm1hdGlvbjsKIAl3cGFfcyA9IHdwYV9zLT5wYXJlbnQ7CkBAIC01NDM4LDcgKzU2NzEsOCBAQAogfQogCiAjaWZkZWYgQU5EUk9JRF9QMlAKLWludCB3cGFzX3AycF9oYW5kbGVfZnJlcXVlbmN5X2NvbmZsaWN0cyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBpbnQgZnJlcSkKK2ludCB3cGFzX3AycF9oYW5kbGVfZnJlcXVlbmN5X2NvbmZsaWN0cyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBpbnQgZnJlcSwKKwlzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQpCiB7CiAJc3RydWN0IHdwYV9zdXBwbGljYW50ICppZmFjZSA9IE5VTEw7CiAJc3RydWN0IHAycF9kYXRhICpwMnAgPSB3cGFfcy0+Z2xvYmFsLT5wMnA7CkBAIC01NDY0LDE3ICs1Njk4LDMyIEBACiAJCQkvKiBJZiBHTyBjYW5ub3QgYmUgbW92ZWQgb3IgaWYgdGhlIGNvbmZsaWN0aW5nIGludGVyZmFjZSBpcyBhCiAJCQkgKiBQMlAgQ2xpZW50LCByZW1vdmUgdGhlIGludGVyZmFjZSBkZXBlbmRpbmcgdXAgb24gdGhlIGNvbm5lY3Rpb24KIAkJCSAqIHByaW9yaXR5ICovCi0JCQlpZiAoIXdwYXNfaXNfcDJwX3ByaW9yaXRpemVkKHdwYV9zKSkgeworCQkJaWYoIXdwYXNfaXNfcDJwX3ByaW9yaXRpemVkKGlmYWNlKSkgewogCQkJCS8qIFNUQSBjb25uZWN0aW9uIGhhcyBwcmlvcml0eSBvdmVyIGV4aXN0aW5nCiAJCQkJICogUDJQIGNvbm5lY3Rpb24uIFNvIHJlbW92ZSB0aGUgaW50ZXJmYWNlICovCi0JCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFJlbW92aW5nIFAyUCBjb25uZWN0aW9uIGR1ZSB0byBTaW5nbGUgY2hhbm5lbCAiCisJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFJlbW92aW5nIFAyUCBjb25uZWN0aW9uIGR1ZSB0byBTaW5nbGUgY2hhbm5lbCIKIAkJCQkJCSJjb25jdXJyZW50IG1vZGUgZnJlcXVlbmN5IGNvbmZsaWN0Iik7CiAJCQkJd3Bhc19wMnBfZ3JvdXBfZGVsZXRlKGlmYWNlLCBQMlBfR1JPVVBfUkVNT1ZBTF9GUkVRX0NPTkZMSUNUKTsKKwkJCQkvKiBJZiBjb25uZWN0aW9uIGluIHByb2dyZXNzIGlzIHAycCBjb25uZWN0aW9uLCBkbyBub3QgcHJvY2VlZCBmb3IgdGhlIGNvbm5lY3Rpb24gKi8KKwkJCQlpZiAod3BhX3MgPT0gaWZhY2UpCisJCQkJCXJldHVybiAtMTsKKwkJCQllbHNlCisJCQkJCS8qIElmIGNvbm5lY3Rpb24gaW4gcHJvZ3Jlc3MgaXMgU1RBIGNvbm5lY3Rpb24sIHByb2NlZWQgZm9yIHRoZSBjb25uZWN0aW9uICovCisJCQkJCXJldHVybiAwOwogCQkJfSBlbHNlIHsKLQkJCQkvKiBFeGlzdGluZyBjb25uZWN0aW9uIGhhcyB0aGUgcHJpb3JpdHkuIERpc2FibGUgdGhlIG5ld2x5Ci0JCQkJICogc2VsZWN0ZWQgbmV0d29yayBhbmQgbGV0IHRoZSBhcHBsaWNhdGlvbiBrbm93IGFib3V0IGl0LgotIAkJCQkgKi8KLQkJCQlyZXR1cm4gLTE7CisJCQkJLyogUDJwIGNvbm5lY3Rpb24gaGFzIHByaW9yaXR5LCBkaXNhYmxlIHRoZSBTVEEgbmV0d29yayovCisJCQkJd3BhX3N1cHBsaWNhbnRfZGlzYWJsZV9uZXR3b3JrKHdwYV9zLT5nbG9iYWwtPmlmYWNlcywgc3NpZCk7CisJCQkJd3BhX21zZyh3cGFfcy0+Z2xvYmFsLT5pZmFjZXMsIE1TR19JTkZPLCBXUEFfRVZFTlRfRlJFUV9DT05GTElDVAorCQkJCQkiIGlkPSVkIiwgc3NpZC0+aWQpOworCQkJCW9zX21lbXNldCh3cGFfcy0+Z2xvYmFsLT5pZmFjZXMtPnBlbmRpbmdfYnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJCQlpZiAod3BhX3MgPT0gaWZhY2UpIHsKKwkJCQkJLyogcDJwIGNvbm5lY3Rpb24gaXMgaW4gcHJvZ3Jlc3MsIGNvbnRpbnVlIGNvbm5lY3RpbmcuLi4qLworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCS8qIFNUQSBjb25uZWN0aW9uIGlzIGluIHByb2dyZXNzLCBkbyBub3QgYWxsb3cgdG8gY29udGludWUgKi8KKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3AycF9zdXBwbGljYW50LmggYi93cGFfc3VwcGxpY2FudC9wMnBfc3VwcGxpY2FudC5oCmluZGV4IDZlNGNjMWQuLmEyN2MxYjYgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3AycF9zdXBwbGljYW50LmgKKysrIGIvd3BhX3N1cHBsaWNhbnQvcDJwX3N1cHBsaWNhbnQuaApAQCAtMjgsNyArMjgsNyBAQAogCQkJCQkgIHVuc2lnbmVkIGludCBmcmVxKTsKICNpZmRlZiBBTkRST0lEX1AyUAogaW50IHdwYXNfcDJwX2hhbmRsZV9mcmVxdWVuY3lfY29uZmxpY3RzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcSwgc3RydWN0IHdwYV9zc2lkICpzc2lkKTsKICNlbmRpZgogaW50IHdwYXNfcDJwX2dyb3VwX3JlbW92ZShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCBjaGFyICppZm5hbWUpOwogaW50IHdwYXNfcDJwX2dyb3VwX2FkZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBpbnQgcGVyc2lzdGVudF9ncm91cCwKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3ByZWF1dGhfdGVzdC5jIGIvd3BhX3N1cHBsaWNhbnQvcHJlYXV0aF90ZXN0LmMKaW5kZXggNjJiNzUzOC4uMzUwM2U2NSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvcHJlYXV0aF90ZXN0LmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvcHJlYXV0aF90ZXN0LmMKQEAgLTM4LDEyICszOCw2IEBACiB9OwogCiAKLXN0YXRpYyB2b2lkIF93cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUodm9pZCAqd3BhX3MsIGludCByZWFzb25fY29kZSkKLXsKLQl3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUod3BhX3MsIHJlYXNvbl9jb2RlKTsKLX0KLQotCiBzdGF0aWMgdm9pZCBfd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUodm9pZCAqd3BhX3MsIGludCByZWFzb25fY29kZSkKIHsKIAl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSh3cGFfcywgcmVhc29uX2NvZGUpOwpAQCAtMjM4LDcgKzIzMiw2IEBACiAJY3R4LT5zZXRfc3RhdGUgPSBfd3BhX3N1cHBsaWNhbnRfc2V0X3N0YXRlOwogCWN0eC0+Z2V0X3N0YXRlID0gX3dwYV9zdXBwbGljYW50X2dldF9zdGF0ZTsKIAljdHgtPmRlYXV0aGVudGljYXRlID0gX3dwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlOwotCWN0eC0+ZGlzYXNzb2NpYXRlID0gX3dwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZTsKIAljdHgtPnNldF9rZXkgPSB3cGFfc3VwcGxpY2FudF9zZXRfa2V5OwogCWN0eC0+Z2V0X25ldHdvcmtfY3R4ID0gd3BhX3N1cHBsaWNhbnRfZ2V0X25ldHdvcmtfY3R4OwogCWN0eC0+Z2V0X2Jzc2lkID0gd3BhX3N1cHBsaWNhbnRfZ2V0X2Jzc2lkOwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvc2Nhbi5jIGIvd3BhX3N1cHBsaWNhbnQvc2Nhbi5jCmluZGV4IDBmNjQzM2IuLjkxYTQzNmEgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3NjYW4uYworKysgYi93cGFfc3VwcGxpY2FudC9zY2FuLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogV1BBIFN1cHBsaWNhbnQgLSBTY2FubmluZwotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTAsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMiwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgInV0aWxzL2NvbW1vbi5oIgogI2luY2x1ZGUgInV0aWxzL2Vsb29wLmgiCiAjaW5jbHVkZSAiY29tbW9uL2llZWU4MDJfMTFfZGVmcy5oIgorI2luY2x1ZGUgImNvbW1vbi93cGFfY3RybC5oIgogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIndwYV9zdXBwbGljYW50X2kuaCIKICNpbmNsdWRlICJkcml2ZXJfaS5oIgpAQCAtNjYsNyArNjcsOCBAQAogCX0KIAogI2lmZGVmIENPTkZJR19QMlAKLQlpZiAoIXdwYV9zLT5nbG9iYWwtPnAycF9kaXNhYmxlZCAmJiB3cGFfcy0+Z2xvYmFsLT5wMnApIHsKKwlpZiAoIXdwYV9zLT5nbG9iYWwtPnAycF9kaXNhYmxlZCAmJiB3cGFfcy0+Z2xvYmFsLT5wMnAgJiYKKwkgICAgIXdwYV9zLT5jb25mLT5wMnBfZGlzYWJsZWQpIHsKIAkJd3BhX3MtPndwcy0+ZGV2LnAycCA9IDE7CiAJCWlmICghd3BzKSB7CiAJCQl3cHMgPSAxOwpAQCAtODAsNiArODIsMTUgQEAKICNlbmRpZiAvKiBDT05GSUdfV1BTICovCiAKIAorLyoqCisgKiB3cGFfc3VwcGxpY2FudF9lbmFibGVkX25ldHdvcmtzIC0gQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgZW5hYmxlZCBuZXR3b3JrcworICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIFJldHVybnM6IDAgaWYgbm8gbmV0d29ya3MgYXJlIGVuYWJsZWQsID4wIGlmIG5ldHdvcmtzIGFyZSBlbmFibGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZpZ3VyZSBvdXQgd2hldGhlciBhbnkgbmV0d29ya3MgKG9yIEludGVyd29ya2luZworICogd2l0aCBlbmFibGVkIGNyZWRlbnRpYWxzIGFuZCBhdXRvX2ludGVyd29ya2luZykgYXJlIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQKKyAqIGNvbmZpZ3VyYXRpb24uCisgKi8KIGludCB3cGFfc3VwcGxpY2FudF9lbmFibGVkX25ldHdvcmtzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CiAJc3RydWN0IHdwYV9zc2lkICpzc2lkID0gd3BhX3MtPmNvbmYtPnNzaWQ7CkBAIC0xOTgsNiArMjA5LDEyIEBACiB9CiAKIAorLyoqCisgKiB3cGFfc3VwcGxpY2FudF90cmlnZ2VyX3NjYW4gLSBSZXF1ZXN0IGRyaXZlciB0byBzdGFydCBhIHNjYW4KKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBAcGFyYW1zOiBTY2FuIHBhcmFtZXRlcnMKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCiBpbnQgd3BhX3N1cHBsaWNhbnRfdHJpZ2dlcl9zY2FuKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJc3RydWN0IHdwYV9kcml2ZXJfc2Nhbl9wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTQzOSwxMSArNDU2LDc4IEBACiB9CiAKIAorI2lmZGVmIENPTkZJR19QMlAKKworLyoKKyAqIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBlbmFibGVkIG5ldHdvcmtzIG9yIGNyZWRlbnRpYWxzIHRoYXQgY291bGQgYmUKKyAqIHVzZWQgZm9yIGEgbm9uLVAyUCBjb25uZWN0aW9uLgorICovCitzdGF0aWMgaW50IG5vbl9wMnBfbmV0d29ya19lbmFibGVkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisJc3RydWN0IHdwYV9zc2lkICpzc2lkOworCisJZm9yIChzc2lkID0gd3BhX3MtPmNvbmYtPnNzaWQ7IHNzaWQ7IHNzaWQgPSBzc2lkLT5uZXh0KSB7CisJCWlmICh3cGFzX25ldHdvcmtfZGlzYWJsZWQod3BhX3MsIHNzaWQpKQorCQkJY29udGludWU7CisJCWlmICghc3NpZC0+cDJwX2dyb3VwKQorCQkJcmV0dXJuIDE7CisJfQorCisJaWYgKHdwYV9zLT5jb25mLT5jcmVkICYmIHdwYV9zLT5jb25mLT5pbnRlcndvcmtpbmcgJiYKKwkgICAgd3BhX3MtPmNvbmYtPmF1dG9faW50ZXJ3b3JraW5nKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBGaW5kIHRoZSBvcGVyYXRpbmcgZnJlcXVlbmN5IG9mIGFueSBvdGhlciB2aXJ0dWFsIGludGVyZmFjZSB0aGF0IGlzIHVzaW5nCisgKiB0aGUgc2FtZSByYWRpbyBjb25jdXJyZW50bHkuCisgKi8KK3N0YXRpYyBpbnQgc2hhcmVkX3ZpZl9vcGVyX2ZyZXEoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKK3sKKwljb25zdCBjaGFyICpybiwgKnJuMjsKKwlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKmlmczsKKwl1OCBic3NpZFtFVEhfQUxFTl07CisKKwlpZiAoIXdwYV9zLT5kcml2ZXItPmdldF9yYWRpb19uYW1lKQorCQlyZXR1cm4gLTE7CisKKwlybiA9IHdwYV9zLT5kcml2ZXItPmdldF9yYWRpb19uYW1lKHdwYV9zLT5kcnZfcHJpdik7CisJaWYgKHJuID09IE5VTEwgfHwgcm5bMF0gPT0gJ1wwJykKKwkJcmV0dXJuIC0xOworCisJZm9yIChpZnMgPSB3cGFfcy0+Z2xvYmFsLT5pZmFjZXM7IGlmczsgaWZzID0gaWZzLT5uZXh0KSB7CisJCWlmIChpZnMgPT0gd3BhX3MgfHwgIWlmcy0+ZHJpdmVyLT5nZXRfcmFkaW9fbmFtZSkKKwkJCWNvbnRpbnVlOworCisJCXJuMiA9IGlmcy0+ZHJpdmVyLT5nZXRfcmFkaW9fbmFtZShpZnMtPmRydl9wcml2KTsKKwkJaWYgKCFybjIgfHwgb3Nfc3RyY21wKHJuLCBybjIpICE9IDApCisJCQljb250aW51ZTsKKworCQlpZiAoaWZzLT5jdXJyZW50X3NzaWQgPT0gTlVMTCB8fCBpZnMtPmFzc29jX2ZyZXEgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpZnMtPmN1cnJlbnRfc3NpZC0+bW9kZSA9PSBXUEFTX01PREVfQVAgfHwKKwkJICAgIGlmcy0+Y3VycmVudF9zc2lkLT5tb2RlID09IFdQQVNfTU9ERV9QMlBfR08pCisJCQlyZXR1cm4gaWZzLT5jdXJyZW50X3NzaWQtPmZyZXF1ZW5jeTsKKwkJaWYgKHdwYV9kcnZfZ2V0X2Jzc2lkKGlmcywgYnNzaWQpID09IDApCisJCQlyZXR1cm4gaWZzLT5hc3NvY19mcmVxOworCX0KKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1AyUCAqLworCisKIHN0YXRpYyB2b2lkIHdwYV9zdXBwbGljYW50X3NjYW4odm9pZCAqZWxvb3BfY3R4LCB2b2lkICp0aW1lb3V0X2N0eCkKIHsKIAlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zID0gZWxvb3BfY3R4OwogCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKLQlpbnQgc2Nhbl9yZXEgPSAwLCByZXQ7CisJZW51bSBzY2FuX3JlcV90eXBlIHNjYW5fcmVxID0gTk9STUFMX1NDQU5fUkVROworCWludCByZXQ7CiAJc3RydWN0IHdwYWJ1ZiAqZXh0cmFfaWUgPSBOVUxMOwogCXN0cnVjdCB3cGFfZHJpdmVyX3NjYW5fcGFyYW1zIHBhcmFtczsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9zY2FuX3BhcmFtcyAqc2Nhbl9wYXJhbXM7CkBAIC00NTUsNyArNTM5LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICh3cGFfcy0+ZGlzY29ubmVjdGVkICYmICF3cGFfcy0+c2Nhbl9yZXEpIHsKKwlpZiAod3BhX3MtPmRpc2Nvbm5lY3RlZCAmJiB3cGFfcy0+c2Nhbl9yZXEgPT0gTk9STUFMX1NDQU5fUkVRKSB7CiAJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIkRpc2Nvbm5lY3RlZCAtIGRvIG5vdCBzY2FuIik7CiAJCXdwYV9zdXBwbGljYW50X3NldF9zdGF0ZSh3cGFfcywgV1BBX0RJU0NPTk5FQ1RFRCk7CiAJCXJldHVybjsKQEAgLTQ2OCw3ICs1NTIsNyBAQAogCX0KICNlbmRpZgogCWlmICghd3BhX3N1cHBsaWNhbnRfZW5hYmxlZF9uZXR3b3Jrcyh3cGFfcykgJiYKLQkgICAgIXdwYV9zLT5zY2FuX3JlcSkgeworCSAgICB3cGFfcy0+c2Nhbl9yZXEgPT0gTk9STUFMX1NDQU5fUkVRKSB7CiAJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIk5vIGVuYWJsZWQgbmV0d29ya3MgLSBkbyBub3Qgc2NhbiIpOwogCQl3cGFfc3VwcGxpY2FudF9zZXRfc3RhdGUod3BhX3MsIFdQQV9JTkFDVElWRSk7CiAjaWZkZWYgQ09ORklHX1AyUApAQCAtNTE2LDcgKzYwMCw3IEBACiAJfQogCiAJc2Nhbl9yZXEgPSB3cGFfcy0+c2Nhbl9yZXE7Ci0Jd3BhX3MtPnNjYW5fcmVxID0gMDsKKwl3cGFfcy0+c2Nhbl9yZXEgPSBOT1JNQUxfU0NBTl9SRVE7CiAKIAlvc19tZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwogCkBAIC01MzMsNyArNjE3LDcgQEAKIAkJZ290byBzY2FuOwogCX0KIAotCWlmIChzY2FuX3JlcSAhPSAyICYmIHdwYV9zLT5jb25uZWN0X3dpdGhvdXRfc2NhbikgeworCWlmIChzY2FuX3JlcSAhPSBNQU5VQUxfU0NBTl9SRVEgJiYgd3BhX3MtPmNvbm5lY3Rfd2l0aG91dF9zY2FuKSB7CiAJCWZvciAoc3NpZCA9IHdwYV9zLT5jb25mLT5zc2lkOyBzc2lkOyBzc2lkID0gc3NpZC0+bmV4dCkgewogCQkJaWYgKHNzaWQgPT0gd3BhX3MtPmNvbm5lY3Rfd2l0aG91dF9zY2FuKQogCQkJCWJyZWFrOwpAQCAtNTcxLDcgKzY1NSw3IEBACiAJCX0KIAl9CiAKLQlpZiAoc2Nhbl9yZXEgIT0gMiAmJiB3cGFfcy0+Y29uZi0+YXBfc2NhbiA9PSAyKSB7CisJaWYgKHNjYW5fcmVxICE9IE1BTlVBTF9TQ0FOX1JFUSAmJiB3cGFfcy0+Y29uZi0+YXBfc2NhbiA9PSAyKSB7CiAJCXdwYV9zLT5jb25uZWN0X3dpdGhvdXRfc2NhbiA9IE5VTEw7CiAJCXdwYV9zLT5wcmV2X3NjYW5fd2lsZGNhcmQgPSAwOwogCQl3cGFfc3VwcGxpY2FudF9hc3NvY190cnkod3BhX3MsIHNzaWQpOwpAQCAtNjY1LDcgKzc0OSw3IEBACiAJZXh0cmFfaWUgPSB3cGFfc3VwcGxpY2FudF9leHRyYV9pZXMod3BhX3MpOwogCiAjaWZkZWYgQ09ORklHX0hTMjAKLQlpZiAod3BhX3MtPmNvbmYtPmhzMjAgJiYgd3BhYnVmX3Jlc2l6ZSgmZXh0cmFfaWUsIDYpID09IDApCisJaWYgKHdwYV9zLT5jb25mLT5oczIwICYmIHdwYWJ1Zl9yZXNpemUoJmV4dHJhX2llLCA3KSA9PSAwKQogCQl3cGFzX2hzMjBfYWRkX2luZGljYXRpb24oZXh0cmFfaWUpOwogI2VuZGlmIC8qIENPTkZJR19IUzIwICovCiAKQEAgLTY5OCw2ICs3ODIsMzUgQEAKIAlzY2FuX3BhcmFtcyA9ICZwYXJhbXM7CiAKIHNjYW46CisjaWZkZWYgQ09ORklHX1AyUAorCS8qCisJICogSWYgdGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IG11bHRpLWNoYW5uZWwgY29uY3VycmVuY3kgYW5kIGEKKwkgKiB2aXJ0dWFsIGludGVyZmFjZSB0aGF0IHNoYXJlcyB0aGUgc2FtZSByYWRpbyB3aXRoIHRoZSB3cGFfcyBpbnRlcmZhY2UKKwkgKiBpcyBvcGVyYXRpbmcgdGhlcmUgbWF5IG5vdCBiZSBuZWVkIHRvIHNjYW4gb3RoZXIgY2hhbm5lbHMgYXBhcnQgZnJvbQorCSAqIHRoZSBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsIG9uIHRoZSBvdGhlciB2aXJ0dWFsIGludGVyZmFjZS4gRmlsdGVyCisJICogb3V0IG90aGVyIGNoYW5uZWxzIGluIGNhc2Ugd2UgYXJlIHRyeWluZyB0byBmaW5kIGEgY29ubmVjdGlvbiBmb3IgYQorCSAqIHN0YXRpb24gaW50ZXJmYWNlIHdoZW4gd2UgYXJlIG5vdCBjb25maWd1cmVkIHRvIHByZWZlciBzdGF0aW9uCisJICogY29ubmVjdGlvbiBhbmQgYSBjb25jdXJyZW50IG9wZXJhdGlvbiBpcyBhbHJlYWR5IGluIHByb2Nlc3MuCisJICovCisJaWYgKHdwYV9zLT5zY2FuX2Zvcl9jb25uZWN0aW9uICYmIHNjYW5fcmVxID09IE5PUk1BTF9TQ0FOX1JFUSAmJgorCSAgICAhc2Nhbl9wYXJhbXMtPmZyZXFzICYmICFwYXJhbXMuZnJlcXMgJiYKKwkgICAgd3Bhc19pc19wMnBfcHJpb3JpdGl6ZWQod3BhX3MpICYmCisJICAgICEod3BhX3MtPmRydl9mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfTVVMVElfQ0hBTk5FTF9DT05DVVJSRU5UKSAmJgorCSAgICB3cGFfcy0+cDJwX2dyb3VwX2ludGVyZmFjZSA9PSBOT1RfUDJQX0dST1VQX0lOVEVSRkFDRSAmJgorCSAgICBub25fcDJwX25ldHdvcmtfZW5hYmxlZCh3cGFfcykpIHsKKwkJaW50IGZyZXEgPSBzaGFyZWRfdmlmX29wZXJfZnJlcSh3cGFfcyk7CisJCWlmIChmcmVxID4gMCkgeworCQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiUDJQOiBTY2FuIG9ubHkgdGhlIGN1cnJlbnQgIgorCQkJCSJvcGVyYXRpbmcgY2hhbm5lbCAoJWQgTUh6KSBzaW5jZSBkcml2ZXIgZG9lcyAiCisJCQkJIm5vdCBzdXBwb3J0IG11bHRpLWNoYW5uZWwgY29uY3VycmVuY3kiLCBmcmVxKTsKKwkJCXBhcmFtcy5mcmVxcyA9IG9zX3phbGxvYyhzaXplb2YoaW50KSAqIDIpOworCQkJaWYgKHBhcmFtcy5mcmVxcykKKwkJCQlwYXJhbXMuZnJlcXNbMF0gPSBmcmVxOworCQkJc2Nhbl9wYXJhbXMtPmZyZXFzID0gcGFyYW1zLmZyZXFzOworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KKwogCXJldCA9IHdwYV9zdXBwbGljYW50X3RyaWdnZXJfc2Nhbih3cGFfcywgc2Nhbl9wYXJhbXMpOwogCiAJd3BhYnVmX2ZyZWUoZXh0cmFfaWUpOwpAQCAtNzA2LDE5ICs4MTksMzggQEAKIAogCWlmIChyZXQpIHsKIAkJd3BhX21zZyh3cGFfcywgTVNHX1dBUk5JTkcsICJGYWlsZWQgdG8gaW5pdGlhdGUgQVAgc2NhbiIpOwotI2lmZGVmIEFORFJPSURfUDJQCi0JCS8qIFJlc3RvcmUgYmFjayB0aGUgd3BhX3MtPnNjYW5fcmVxIGlmIHdlIGZhaWxlZCB0aGUgc2NhbiBiZWNhdXNlIG9mIGFueSByZWFzb24gKi8KLQkJd3BhX21zZyh3cGFfcywgTVNHX0RFQlVHLCAiUmVzdG9yaW5nIGJhY2sgdGhlIHdwYV9zLT5zY2FuX3JlcSAiCi0JCQkidG8gdGhlIG9yaWdpbmFsIHZhbHVlICVkIiwgc2Nhbl9yZXEpOwotCQl3cGFfcy0+c2Nhbl9yZXEgPSBzY2FuX3JlcTsKLSNlbmRpZgogCQlpZiAocHJldl9zdGF0ZSAhPSB3cGFfcy0+d3BhX3N0YXRlKQogCQkJd3BhX3N1cHBsaWNhbnRfc2V0X3N0YXRlKHdwYV9zLCBwcmV2X3N0YXRlKTsKKwkJLyogUmVzdG9yZSBzY2FuX3JlcSBzaW5jZSB3ZSB3aWxsIHRyeSB0byBzY2FuIGFnYWluICovCisJCXdwYV9zLT5zY2FuX3JlcSA9IHNjYW5fcmVxOwogCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMSwgMCk7CisJfSBlbHNlIHsKKwkJd3BhX3MtPnNjYW5fZm9yX2Nvbm5lY3Rpb24gPSAwOwogCX0KIH0KIAogCit2b2lkIHdwYV9zdXBwbGljYW50X3VwZGF0ZV9zY2FuX2ludChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBpbnQgc2VjKQoreworCXN0cnVjdCBvc190aW1lIHJlbWFpbmluZywgbmV3X2ludDsKKwlpbnQgY2FuY2VsbGVkOworCisJY2FuY2VsbGVkID0gZWxvb3BfY2FuY2VsX3RpbWVvdXRfb25lKHdwYV9zdXBwbGljYW50X3NjYW4sIHdwYV9zLCBOVUxMLAorCQkJCQkgICAgICZyZW1haW5pbmcpOworCisJbmV3X2ludC5zZWMgPSBzZWM7CisJbmV3X2ludC51c2VjID0gMDsKKwlpZiAoY2FuY2VsbGVkICYmIG9zX3RpbWVfYmVmb3JlKCZyZW1haW5pbmcsICZuZXdfaW50KSkgeworCQluZXdfaW50LnNlYyA9IHJlbWFpbmluZy5zZWM7CisJCW5ld19pbnQudXNlYyA9IHJlbWFpbmluZy51c2VjOworCX0KKworCWVsb29wX3JlZ2lzdGVyX3RpbWVvdXQobmV3X2ludC5zZWMsIG5ld19pbnQudXNlYywgd3BhX3N1cHBsaWNhbnRfc2NhbiwKKwkJCSAgICAgICB3cGFfcywgTlVMTCk7CisJd3BhX3MtPnNjYW5faW50ZXJ2YWwgPSBzZWM7Cit9CisKKwogLyoqCiAgKiB3cGFfc3VwcGxpY2FudF9yZXFfc2NhbiAtIFNjaGVkdWxlIGEgc2NhbiBmb3IgbmVpZ2hib3JpbmcgYWNjZXNzIHBvaW50cwogICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKQEAgLTc2Niw2ICs4OTgsNyBAQAogICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKICAqIEBzZWM6IE51bWJlciBvZiBzZWNvbmRzIGFmdGVyIHdoaWNoIHRvIHNjYW4KICAqIEB1c2VjOiBOdW1iZXIgb2YgbWljcm9zZWNvbmRzIGFmdGVyIHdoaWNoIHRvIHNjYW4KKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcyBvciAtMSBvdGhlcndpc2UKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2NoZWR1bGUgcGVyaW9kaWMgc2NhbnMgZm9yIG5laWdoYm9yaW5nCiAgKiBhY2Nlc3MgcG9pbnRzIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZS4KQEAgLTc4Nyw2ICs5MjAsNyBAQAogLyoqCiAgKiB3cGFfc3VwcGxpY2FudF9yZXFfc2NoZWRfc2NhbiAtIFN0YXJ0IGEgcGVyaW9kaWMgc2NoZWR1bGVkIHNjYW4KICAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBSZXR1cm5zOiAwIGlzIHNjaGVkX3NjYW4gd2FzIHN0YXJ0ZWQgb3IgLTEgb3RoZXJ3aXNlCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNjaGVkdWxlIHBlcmlvZGljIHNjYW5zIGZvciBuZWlnaGJvcmluZwogICogYWNjZXNzIHBvaW50cyByZXBlYXRpbmcgdGhlIHNjYW4gY29udGludW91c2x5LgpAQCAtMTA0MCw2ICsxMTc0LDE2IEBACiB9CiAKIAorLyoqCisgKiB3cGFfc3VwcGxpY2FudF9ub3RpZnlfc2Nhbm5pbmcgLSBJbmRpY2F0ZSBwb3NzaWJsZSBzY2FuIHN0YXRlIGNoYW5nZQorICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBzY2FubmluZzogV2hldGhlciBzY2FubmluZyBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIGdlbmVyYXRlIHNjYW5uaW5nIG5vdGlmeWNhdGlvbnMuIEl0IGlzIGNhbGxlZCB3aGVuZXZlcgorICogdGhlcmUgbWF5IGhhdmUgYmVlbiBhIGNoYW5nZSBpbiBzY2FubmluZyAoc2NhbiBzdGFydGVkLCBjb21wbGV0ZWQsIHN0b3BwZWQpLgorICogd3Bhc19ub3RpZnlfc2Nhbm5pbmcoKSBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHNjYW5uaW5nIHN0YXRlIGNoYW5nZWQgZnJvbSB0aGUKKyAqIHByZXZpb3VzbHkgbm90aWZpZWQgc3RhdGUuCisgKi8KIHZvaWQgd3BhX3N1cHBsaWNhbnRfbm90aWZ5X3NjYW5uaW5nKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJICAgIGludCBzY2FubmluZykKIHsKQEAgLTEwNzcsNiArMTIyMSwxNSBAQAogfQogCiAKKy8qKgorICogd3BhX3NjYW5fZ2V0X2llIC0gRmV0Y2ggYSBzcGVjaWZpZWQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIGEgc2NhbiByZXN1bHQKKyAqIEByZXM6IFNjYW4gcmVzdWx0IGVudHJ5CisgKiBAaWU6IEluZm9ybWF0aW9uIGVsZW1lbnQgaWRlbnRpdGlmaWVyIChXTEFOX0VJRF8qKQorICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCAoaWQgZmllbGQpIG9yICVOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgaW5mb3JtYXRpb24gZWxlbWVudCBpbiB0aGUgc2NhbgorICogcmVzdWx0LgorICovCiBjb25zdCB1OCAqIHdwYV9zY2FuX2dldF9pZShjb25zdCBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpyZXMsIHU4IGllKQogewogCWNvbnN0IHU4ICplbmQsICpwb3M7CkBAIC0xMDk2LDYgKzEyNDksMTUgQEAKIH0KIAogCisvKioKKyAqIHdwYV9zY2FuX2dldF92ZW5kb3JfaWUgLSBGZXRjaCB2ZW5kb3IgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIGEgc2NhbiByZXN1bHQKKyAqIEByZXM6IFNjYW4gcmVzdWx0IGVudHJ5CisgKiBAdmVuZG9yX3R5cGU6IFZlbmRvciB0eXBlIChmb3VyIG9jdGV0cyBzdGFydGluZyB0aGUgSUUgcGF5bG9hZCkKKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gdGhlIGluZm9ybWF0aW9uIGVsZW1lbnQgKGlkIGZpZWxkKSBvciAlTlVMTCBpZiBub3QgZm91bmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IG1hdGNoaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gdGhlIHNjYW4KKyAqIHJlc3VsdC4KKyAqLwogY29uc3QgdTggKiB3cGFfc2Nhbl9nZXRfdmVuZG9yX2llKGNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcywKIAkJCQkgIHUzMiB2ZW5kb3JfdHlwZSkKIHsKQEAgLTExMTcsNiArMTI3OSwxNiBAQAogfQogCiAKKy8qKgorICogd3BhX3NjYW5fZ2V0X3ZlbmRvcl9pZV9tdWx0aSAtIEZldGNoIHZlbmRvciBJRSBkYXRhIGZyb20gYSBzY2FuIHJlc3VsdAorICogQHJlczogU2NhbiByZXN1bHQgZW50cnkKKyAqIEB2ZW5kb3JfdHlwZTogVmVuZG9yIHR5cGUgKGZvdXIgb2N0ZXRzIHN0YXJ0aW5nIHRoZSBJRSBwYXlsb2FkKQorICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCBwYXlsb2FkIG9yICVOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBjb25jYXRlbmF0ZWQgcGF5bG9hZCBvZiBwb3NzaWJseSBmcmFnbWVudGVkIHZlbmRvcgorICogc3BlY2lmaWMgaW5mb3JtYXRpb24gZWxlbWVudHMgaW4gdGhlIHNjYW4gcmVzdWx0LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCisgKiBmb3IgZnJlZWluZyB0aGUgcmV0dXJuZWQgYnVmZmVyLgorICovCiBzdHJ1Y3Qgd3BhYnVmICogd3BhX3NjYW5fZ2V0X3ZlbmRvcl9pZV9tdWx0aShjb25zdCBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpyZXMsCiAJCQkJCSAgICAgdTMyIHZlbmRvcl90eXBlKQogewpAQCAtMTE0OCw0MCArMTMyMCw2IEBACiB9CiAKIAotc3RydWN0IHdwYWJ1ZiAqIHdwYV9zY2FuX2dldF92ZW5kb3JfaWVfbXVsdGlfYmVhY29uKAotCWNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcywgdTMyIHZlbmRvcl90eXBlKQotewotCXN0cnVjdCB3cGFidWYgKmJ1ZjsKLQljb25zdCB1OCAqZW5kLCAqcG9zOwotCi0JaWYgKHJlcy0+YmVhY29uX2llX2xlbiA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlidWYgPSB3cGFidWZfYWxsb2MocmVzLT5iZWFjb25faWVfbGVuKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcG9zID0gKGNvbnN0IHU4ICopIChyZXMgKyAxKTsKLQlwb3MgKz0gcmVzLT5pZV9sZW47Ci0JZW5kID0gcG9zICsgcmVzLT5iZWFjb25faWVfbGVuOwotCi0Jd2hpbGUgKHBvcyArIDEgPCBlbmQpIHsKLQkJaWYgKHBvcyArIDIgKyBwb3NbMV0gPiBlbmQpCi0JCQlicmVhazsKLQkJaWYgKHBvc1swXSA9PSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMgJiYgcG9zWzFdID49IDQgJiYKLQkJICAgIHZlbmRvcl90eXBlID09IFdQQV9HRVRfQkUzMigmcG9zWzJdKSkKLQkJCXdwYWJ1Zl9wdXRfZGF0YShidWYsIHBvcyArIDIgKyA0LCBwb3NbMV0gLSA0KTsKLQkJcG9zICs9IDIgKyBwb3NbMV07Ci0JfQotCi0JaWYgKHdwYWJ1Zl9sZW4oYnVmKSA9PSAwKSB7Ci0JCXdwYWJ1Zl9mcmVlKGJ1Zik7Ci0JCWJ1ZiA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIGJ1ZjsKLX0KLQotCiAvKgogICogQ2hhbm5lbHMgd2l0aCBhIGdyZWF0IFNOUiBjYW4gb3BlcmF0ZSBhdCBmdWxsIHJhdGUuIFdoYXQgaXMgYSBncmVhdCBTTlI/CiAgKiBUaGlzIGRvYyBodHRwczovL3N1cHBvcnRmb3J1bXMuY2lzY28uY29tL2RvY3MvRE9DLTEyOTU0IHNheXMsICJ0aGUgZ2VuZXJhbApAQCAtMTMyMywxNSArMTQ2MSwxNyBAQAogCQkgICAgPT0gV1BBX1NDQU5fTEVWRUxfREJNKSB7CiAJCQlpbnQgc25yID0gci0+bGV2ZWwgLSByLT5ub2lzZTsKIAkJCXdwYV9wcmludGYoTVNHX0VYQ0VTU0lWRSwgTUFDU1RSICIgZnJlcT0lZCBxdWFsPSVkICIKLQkJCQkgICAibm9pc2U9JWQgbGV2ZWw9JWQgc25yPSVkJXMgZmxhZ3M9MHgleCIsCisJCQkJICAgIm5vaXNlPSVkIGxldmVsPSVkIHNucj0lZCVzIGZsYWdzPTB4JXggIgorCQkJCSAgICJhZ2U9JXUiLAogCQkJCSAgIE1BQzJTVFIoci0+YnNzaWQpLCByLT5mcmVxLCByLT5xdWFsLAogCQkJCSAgIHItPm5vaXNlLCByLT5sZXZlbCwgc25yLAotCQkJCSAgIHNuciA+PSBHUkVBVF9TTlIgPyAiKiIgOiAiIiwgci0+ZmxhZ3MpOworCQkJCSAgIHNuciA+PSBHUkVBVF9TTlIgPyAiKiIgOiAiIiwgci0+ZmxhZ3MsCisJCQkJICAgci0+YWdlKTsKIAkJfSBlbHNlIHsKIAkJCXdwYV9wcmludGYoTVNHX0VYQ0VTU0lWRSwgTUFDU1RSICIgZnJlcT0lZCBxdWFsPSVkICIKLQkJCQkgICAibm9pc2U9JWQgbGV2ZWw9JWQgZmxhZ3M9MHgleCIsCisJCQkJICAgIm5vaXNlPSVkIGxldmVsPSVkIGZsYWdzPTB4JXggYWdlPSV1IiwKIAkJCQkgICBNQUMyU1RSKHItPmJzc2lkKSwgci0+ZnJlcSwgci0+cXVhbCwKLQkJCQkgICByLT5ub2lzZSwgci0+bGV2ZWwsIHItPmZsYWdzKTsKKwkJCQkgICByLT5ub2lzZSwgci0+bGV2ZWwsIHItPmZsYWdzLCByLT5hZ2UpOwogCQl9CiAJCXBvcyA9ICh1OCAqKSAociArIDEpOwogCQlpZiAoci0+aWVfbGVuKQpAQCAtMTM0NSw2ICsxNDg1LDE1IEBACiB9CiAKIAorLyoqCisgKiB3cGFfc3VwcGxpY2FudF9maWx0ZXJfYnNzaWRfbWF0Y2ggLSBJcyB0aGUgc3BlY2lmaWVkIEJTU0lEIGFsbG93ZWQKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBAYnNzaWQ6IEJTU0lEIHRvIGNoZWNrCisgKiBSZXR1cm5zOiAwIGlmIHRoZSBCU1NJRCBpcyBmaWx0ZXJlZCBvciAxIGlmIG5vdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmaWx0ZXIgb3V0IHNwZWNpZmljIEJTU0lEcyBmcm9tIHNjYW4gcmVzbHRzIG1haW5seQorICogZm9yIHRlc3RpbmcgcHVycG9zZXMgKFNFVCBic3NpZF9maWx0ZXIgY3RybF9pZmFjZSBjb21tYW5kKS4KKyAqLwogaW50IHdwYV9zdXBwbGljYW50X2ZpbHRlcl9ic3NpZF9tYXRjaChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCSAgICAgIGNvbnN0IHU4ICpic3NpZCkKIHsKQEAgLTE0MTMsNiArMTU2MiwxMyBAQAogCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJGYWlsZWQgdG8gZ2V0IHNjYW4gcmVzdWx0cyIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CisJaWYgKHNjYW5fcmVzLT5mZXRjaF90aW1lLnNlYyA9PSAwKSB7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgdGltZXN0YW1wIGlmIHRoZSBkcml2ZXIgd3JhcHBlcgorCQkgKiBkb2VzIG5vdCBzZXQgdGhpcy4KKwkJICovCisJCW9zX2dldF90aW1lKCZzY2FuX3Jlcy0+ZmV0Y2hfdGltZSk7CisJfQogCWZpbHRlcl9zY2FuX3Jlcyh3cGFfcywgc2Nhbl9yZXMpOwogCiAjaWZkZWYgQ09ORklHX1dQUwpAQCAtMTQyOSwxMyArMTU4NSwyNiBAQAogCiAJd3BhX2Jzc191cGRhdGVfc3RhcnQod3BhX3MpOwogCWZvciAoaSA9IDA7IGkgPCBzY2FuX3Jlcy0+bnVtOyBpKyspCi0JCXdwYV9ic3NfdXBkYXRlX3NjYW5fcmVzKHdwYV9zLCBzY2FuX3Jlcy0+cmVzW2ldKTsKKwkJd3BhX2Jzc191cGRhdGVfc2Nhbl9yZXMod3BhX3MsIHNjYW5fcmVzLT5yZXNbaV0sCisJCQkJCSZzY2FuX3Jlcy0+ZmV0Y2hfdGltZSk7CiAJd3BhX2Jzc191cGRhdGVfZW5kKHdwYV9zLCBpbmZvLCBuZXdfc2Nhbik7CiAKIAlyZXR1cm4gc2Nhbl9yZXM7CiB9CiAKIAorLyoqCisgKiB3cGFfc3VwcGxpY2FudF91cGRhdGVfc2Nhbl9yZXN1bHRzIC0gVXBkYXRlIHNjYW4gcmVzdWx0cyBmcm9tIHRoZSBkcml2ZXIKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIEJTUyB0YWJsZSB3aXRoaW4gd3BhX3N1cHBsaWNhbnQgYmFzZWQgb24gdGhlCisgKiBjdXJyZW50bHkgYXZhaWxhYmxlIHNjYW4gcmVzdWx0cyBmcm9tIHRoZSBkcml2ZXIgd2l0aG91dCByZXF1ZXN0aW5nIGEgbmV3CisgKiBzY2FuLiBUaGlzIGlzIHVzZWQgaW4gY2FzZXMgd2hlcmUgdGhlIGRyaXZlciBpbmRpY2F0ZXMgYW4gYXNzb2NpYXRpb24KKyAqIChpbmNsdWRpbmcgcm9hbWluZyB3aXRoaW4gRVNTKSBhbmQgd3BhX3N1cHBsaWNhbnQgZG9lcyBub3QgeWV0IGhhdmUgdGhlCisgKiBuZWVkZWQgaW5mb3JtYXRpb24gdG8gY29tcGxldGUgdGhlIGNvbm5lY3Rpb24gKGUuZy4sIHRvIHBlcmZvcm0gdmFsaWRhdGlvbgorICogc3RlcHMgaW4gNC13YXkgaGFuZHNoYWtlKS4KKyAqLwogaW50IHdwYV9zdXBwbGljYW50X3VwZGF0ZV9zY2FuX3Jlc3VsdHMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAlzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0cyAqc2Nhbl9yZXM7CkBAIC0xNDQ2LDMgKzE2MTUsMTYgQEAKIAogCXJldHVybiAwOwogfQorCisKKy8qKgorICogc2Nhbl9vbmx5X2hhbmRsZXIgLSBSZXBvcnRzIHNjYW4gcmVzdWx0cworICovCit2b2lkIHNjYW5fb25seV9oYW5kbGVyKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCSAgICAgICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0cyAqc2Nhbl9yZXMpCit7CisJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiU2Nhbi1vbmx5IHJlc3VsdHMgcmVjZWl2ZWQiKTsKKwl3cGFfbXNnX2N0cmwod3BhX3MsIE1TR19JTkZPLCBXUEFfRVZFTlRfU0NBTl9SRVNVTFRTKTsKKwl3cGFzX25vdGlmeV9zY2FuX3Jlc3VsdHMod3BhX3MpOworCXdwYXNfbm90aWZ5X3NjYW5fZG9uZSh3cGFfcywgMSk7Cit9CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9zY2FuLmggYi93cGFfc3VwcGxpY2FudC9zY2FuLmgKaW5kZXggYjBkZGY5Ny4uNWVjZmEwMCAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvc2Nhbi5oCisrKyBiL3dwYV9zdXBwbGljYW50L3NjYW4uaApAQCAtMzAsOSArMzAsMTAgQEAKIAkJCQkgIHUzMiB2ZW5kb3JfdHlwZSk7CiBzdHJ1Y3Qgd3BhYnVmICogd3BhX3NjYW5fZ2V0X3ZlbmRvcl9pZV9tdWx0aShjb25zdCBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpyZXMsCiAJCQkJCSAgICAgdTMyIHZlbmRvcl90eXBlKTsKLXN0cnVjdCB3cGFidWYgKiB3cGFfc2Nhbl9nZXRfdmVuZG9yX2llX211bHRpX2JlYWNvbigKLQljb25zdCBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpyZXMsIHUzMiB2ZW5kb3JfdHlwZSk7CiBpbnQgd3BhX3N1cHBsaWNhbnRfZmlsdGVyX2Jzc2lkX21hdGNoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJICAgICAgY29uc3QgdTggKmJzc2lkKTsKK3ZvaWQgd3BhX3N1cHBsaWNhbnRfdXBkYXRlX3NjYW5faW50KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGludCBzZWMpOwordm9pZCBzY2FuX29ubHlfaGFuZGxlcihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkgICAgICAgc3RydWN0IHdwYV9zY2FuX3Jlc3VsdHMgKnNjYW5fcmVzKTsKIAogI2VuZGlmIC8qIFNDQU5fSCAqLwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvc21lLmMgYi93cGFfc3VwcGxpY2FudC9zbWUuYwppbmRleCBiMDllNWYxLi4zMGY5Nzc5IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9zbWUuYworKysgYi93cGFfc3VwcGxpY2FudC9zbWUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiB3cGFfc3VwcGxpY2FudCAtIFNNRQotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgImNvbW1vbi9pZWVlODAyXzExX2NvbW1vbi5oIgogI2luY2x1ZGUgImVhcG9sX3N1cHAvZWFwb2xfc3VwcF9zbS5oIgogI2luY2x1ZGUgImNvbW1vbi93cGFfY29tbW9uLmgiCisjaW5jbHVkZSAiY29tbW9uL3NhZS5oIgogI2luY2x1ZGUgInJzbl9zdXBwL3dwYS5oIgogI2luY2x1ZGUgInJzbl9zdXBwL3Bta3NhX2NhY2hlLmgiCiAjaW5jbHVkZSAiY29uZmlnLmgiCkBAIC0zOSw4ICs0MCwxMDYgQEAKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwogCiAKLXZvaWQgc21lX2F1dGhlbnRpY2F0ZShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAotCQkgICAgICBzdHJ1Y3Qgd3BhX2JzcyAqYnNzLCBzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQpCisjaWZkZWYgQ09ORklHX1NBRQorCitzdGF0aWMgaW50IGluZGV4X3dpdGhpbl9hcnJheShjb25zdCBpbnQgKmFycmF5LCBpbnQgaWR4KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBpZHg7IGkrKykgeworCQlpZiAoYXJyYXlbaV0gPT0gLTEpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBzbWVfc2V0X3NhZV9ncm91cChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQoreworCWludCAqZ3JvdXBzID0gd3BhX3MtPmNvbmYtPnNhZV9ncm91cHM7CisJaW50IGRlZmF1bHRfZ3JvdXBzW10gPSB7IDE5LCAyMCwgMjEsIDI1LCAyNiB9OworCisJaWYgKCFncm91cHMpCisJCWdyb3VwcyA9IGRlZmF1bHRfZ3JvdXBzOworCisJLyogQ29uZmlndXJhdGlvbiBtYXkgaGF2ZSBjaGFuZ2VkLCBzbyB2YWxpZGF0ZSBjdXJyZW50IGluZGV4ICovCisJaWYgKCFpbmRleF93aXRoaW5fYXJyYXkoZ3JvdXBzLCB3cGFfcy0+c21lLnNhZV9ncm91cF9pbmRleCkpCisJCXJldHVybiAtMTsKKworCWZvciAoOzspIHsKKwkJaW50IGdyb3VwID0gZ3JvdXBzW3dwYV9zLT5zbWUuc2FlX2dyb3VwX2luZGV4XTsKKwkJaWYgKGdyb3VwIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoc2FlX3NldF9ncm91cCgmd3BhX3MtPnNtZS5zYWUsIGdyb3VwKSA9PSAwKSB7CisJCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTTUU6IFNlbGVjdGVkIFNBRSBncm91cCAlZCIsCisJCQkJd3BhX3MtPnNtZS5zYWUuZ3JvdXApOworCQkgICAgICAgcmV0dXJuIDA7CisJCX0KKwkJd3BhX3MtPnNtZS5zYWVfZ3JvdXBfaW5kZXgrKzsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIHN0cnVjdCB3cGFidWYgKiBzbWVfYXV0aF9idWlsZF9zYWVfY29tbWl0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJCQkgc3RydWN0IHdwYV9zc2lkICpzc2lkLAorCQkJCQkJIGNvbnN0IHU4ICpic3NpZCkKK3sKKwlzdHJ1Y3Qgd3BhYnVmICpidWY7CisJc2l6ZV90IGxlbjsKKworCWlmIChzc2lkLT5wYXNzcGhyYXNlID09IE5VTEwpIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IE5vIHBhc3N3b3JkIGF2YWlsYWJsZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc21lX3NldF9zYWVfZ3JvdXAod3BhX3MpIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogRmFpbGVkIHRvIHNlbGVjdCBncm91cCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc2FlX3ByZXBhcmVfY29tbWl0KHdwYV9zLT5vd25fYWRkciwgYnNzaWQsCisJCQkgICAgICAgKHU4ICopIHNzaWQtPnBhc3NwaHJhc2UsCisJCQkgICAgICAgb3Nfc3RybGVuKHNzaWQtPnBhc3NwaHJhc2UpLAorCQkJICAgICAgICZ3cGFfcy0+c21lLnNhZSkgPCAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBDb3VsZCBub3QgcGljayBQV0UiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGVuID0gd3BhX3MtPnNtZS5zYWVfdG9rZW4gPyB3cGFidWZfbGVuKHdwYV9zLT5zbWUuc2FlX3Rva2VuKSA6IDA7CisJYnVmID0gd3BhYnVmX2FsbG9jKDQgKyBTQUVfQ09NTUlUX01BWF9MRU4gKyBsZW4pOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwl3cGFidWZfcHV0X2xlMTYoYnVmLCAxKTsgLyogVHJhbnNhY3Rpb24gc2VxIyAqLworCXdwYWJ1Zl9wdXRfbGUxNihidWYsIFdMQU5fU1RBVFVTX1NVQ0NFU1MpOworCXNhZV93cml0ZV9jb21taXQoJndwYV9zLT5zbWUuc2FlLCBidWYsIHdwYV9zLT5zbWUuc2FlX3Rva2VuKTsKKworCXJldHVybiBidWY7Cit9CisKKworc3RhdGljIHN0cnVjdCB3cGFidWYgKiBzbWVfYXV0aF9idWlsZF9zYWVfY29uZmlybShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQoreworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKworCWJ1ZiA9IHdwYWJ1Zl9hbGxvYyg0ICsgU0FFX0NPTkZJUk1fTUFYX0xFTik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXdwYWJ1Zl9wdXRfbGUxNihidWYsIDIpOyAvKiBUcmFuc2FjdGlvbiBzZXEjICovCisJd3BhYnVmX3B1dF9sZTE2KGJ1ZiwgV0xBTl9TVEFUVVNfU1VDQ0VTUyk7CisJc2FlX3dyaXRlX2NvbmZpcm0oJndwYV9zLT5zbWUuc2FlLCBidWYpOworCisJcmV0dXJuIGJ1ZjsKK30KKworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KKworCitzdGF0aWMgdm9pZCBzbWVfc2VuZF9hdXRoZW50aWNhdGlvbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCSAgICBzdHJ1Y3Qgd3BhX2JzcyAqYnNzLCBzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQsCisJCQkJICAgIGludCBzdGFydCkKIHsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9hdXRoX3BhcmFtcyBwYXJhbXM7CiAJc3RydWN0IHdwYV9zc2lkICpvbGRfc3NpZDsKQEAgLTUxLDYgKzE1MCw5IEBACiAJY29uc3QgdTggKm1kID0gTlVMTDsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLwogCWludCBpLCBic3NpZF9jaGFuZ2VkOworCXN0cnVjdCB3cGFidWYgKnJlc3AgPSBOVUxMOworCXU4IGV4dF9jYXBhYlsxMF07CisJaW50IGV4dF9jYXBhYl9sZW47CiAKIAlpZiAoYnNzID09IE5VTEwpIHsKIAkJd3BhX21zZyh3cGFfcywgTVNHX0VSUk9SLCAiU01FOiBObyBzY2FuIHJlc3VsdCBhdmFpbGFibGUgZm9yICIKQEAgLTk1LDYgKzE5NywyMSBAQAogCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJPdmVycmlkaW5nIGF1dGhfYWxnIHNlbGVjdGlvbjogIgogCQkJIjB4JXgiLCBwYXJhbXMuYXV0aF9hbGcpOwogCX0KKyNpZmRlZiBDT05GSUdfU0FFCisJaWYgKHdwYV9rZXlfbWdtdF9zYWUoc3NpZC0+a2V5X21nbXQpKSB7CisJCWNvbnN0IHU4ICpyc247CisJCXN0cnVjdCB3cGFfaWVfZGF0YSBpZWQ7CisKKwkJcnNuID0gd3BhX2Jzc19nZXRfaWUoYnNzLCBXTEFOX0VJRF9SU04pOworCQlpZiAocnNuICYmCisJCSAgICB3cGFfcGFyc2Vfd3BhX2llKHJzbiwgMiArIHJzblsxXSwgJmllZCkgPT0gMCkgeworCQkJaWYgKHdwYV9rZXlfbWdtdF9zYWUoaWVkLmtleV9tZ210KSkgeworCQkJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIlVzaW5nIFNBRSBhdXRoX2FsZyIpOworCQkJCXBhcmFtcy5hdXRoX2FsZyA9IFdQQV9BVVRIX0FMR19TQUU7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9XRVBfS0VZUzsgaSsrKSB7CiAJCWlmIChzc2lkLT53ZXBfa2V5X2xlbltpXSkKQEAgLTExMyw3ICsyMzAsOSBAQAogCSAgICAgd3BhX2Jzc19nZXRfaWUoYnNzLCBXTEFOX0VJRF9SU04pKSAmJgogCSAgICB3cGFfa2V5X21nbXRfd3BhKHNzaWQtPmtleV9tZ210KSkgewogCQlpbnQgdHJ5X29wcG9ydHVuaXN0aWM7Ci0JCXRyeV9vcHBvcnR1bmlzdGljID0gc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nICYmCisJCXRyeV9vcHBvcnR1bmlzdGljID0gKHNzaWQtPnByb2FjdGl2ZV9rZXlfY2FjaGluZyA8IDAgPworCQkJCSAgICAgd3BhX3MtPmNvbmYtPm9rYyA6CisJCQkJICAgICBzc2lkLT5wcm9hY3RpdmVfa2V5X2NhY2hpbmcpICYmCiAJCQkoc3NpZC0+cHJvdG8gJiBXUEFfUFJPVE9fUlNOKTsKIAkJaWYgKHBta3NhX2NhY2hlX3NldF9jdXJyZW50KHdwYV9zLT53cGEsIE5VTEwsIGJzcy0+YnNzaWQsCiAJCQkJCSAgICB3cGFfcy0+Y3VycmVudF9zc2lkLApAQCAtMjAzLDggKzMyMiw5IEBACiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KIAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCi0Jd3BhX3MtPnNtZS5tZnAgPSBzc2lkLT5pZWVlODAyMTF3OwotCWlmIChzc2lkLT5pZWVlODAyMTF3ICE9IE5PX01HTVRfRlJBTUVfUFJPVEVDVElPTikgeworCXdwYV9zLT5zbWUubWZwID0gc3NpZC0+aWVlZTgwMjExdyA9PSBNR01UX0ZSQU1FX1BST1RFQ1RJT05fREVGQVVMVCA/CisJCXdwYV9zLT5jb25mLT5wbWYgOiBzc2lkLT5pZWVlODAyMTF3OworCWlmICh3cGFfcy0+c21lLm1mcCAhPSBOT19NR01UX0ZSQU1FX1BST1RFQ1RJT04pIHsKIAkJY29uc3QgdTggKnJzbiA9IHdwYV9ic3NfZ2V0X2llKGJzcywgV0xBTl9FSURfUlNOKTsKIAkJc3RydWN0IHdwYV9pZV9kYXRhIF9pZTsKIAkJaWYgKHJzbiAmJiB3cGFfcGFyc2Vfd3BhX2llKHJzbiwgMiArIHJzblsxXSwgJl9pZSkgPT0gMCAmJgpAQCAtMjQ3LDIzICszNjcsMzIgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KIAotI2lmZGVmIENPTkZJR19JTlRFUldPUktJTkcKLQlpZiAod3BhX3MtPmNvbmYtPmludGVyd29ya2luZykgeworCWV4dF9jYXBhYl9sZW4gPSB3cGFzX2J1aWxkX2V4dF9jYXBhYih3cGFfcywgZXh0X2NhcGFiKTsKKwlpZiAoZXh0X2NhcGFiX2xlbiA+IDApIHsKIAkJdTggKnBvcyA9IHdwYV9zLT5zbWUuYXNzb2NfcmVxX2llOwogCQlpZiAod3BhX3MtPnNtZS5hc3NvY19yZXFfaWVfbGVuID4gMCAmJiBwb3NbMF0gPT0gV0xBTl9FSURfUlNOKQogCQkJcG9zICs9IDIgKyBwb3NbMV07Ci0JCW9zX21lbW1vdmUocG9zICsgNiwgcG9zLAorCQlvc19tZW1tb3ZlKHBvcyArIGV4dF9jYXBhYl9sZW4sIHBvcywKIAkJCSAgIHdwYV9zLT5zbWUuYXNzb2NfcmVxX2llX2xlbiAtCiAJCQkgICAocG9zIC0gd3BhX3MtPnNtZS5hc3NvY19yZXFfaWUpKTsKLQkJd3BhX3MtPnNtZS5hc3NvY19yZXFfaWVfbGVuICs9IDY7Ci0JCSpwb3MrKyA9IFdMQU5fRUlEX0VYVF9DQVBBQjsKLQkJKnBvcysrID0gNDsKLQkJKnBvcysrID0gMHgwMDsKLQkJKnBvcysrID0gMHgwMDsKLQkJKnBvcysrID0gMHgwMDsKLQkJKnBvcysrID0gMHg4MDsgLyogQml0IDMxIC0gSW50ZXJ3b3JraW5nICovCisJCXdwYV9zLT5zbWUuYXNzb2NfcmVxX2llX2xlbiArPSBleHRfY2FwYWJfbGVuOworCQlvc19tZW1jcHkocG9zLCBleHRfY2FwYWIsIGV4dF9jYXBhYl9sZW4pOwogCX0KLSNlbmRpZiAvKiBDT05GSUdfSU5URVJXT1JLSU5HICovCisKKyNpZmRlZiBDT05GSUdfU0FFCisJaWYgKHBhcmFtcy5hdXRoX2FsZyA9PSBXUEFfQVVUSF9BTEdfU0FFKSB7CisJCWlmIChzdGFydCkKKwkJCXJlc3AgPSBzbWVfYXV0aF9idWlsZF9zYWVfY29tbWl0KHdwYV9zLCBzc2lkLAorCQkJCQkJCSBic3MtPmJzc2lkKTsKKwkJZWxzZQorCQkJcmVzcCA9IHNtZV9hdXRoX2J1aWxkX3NhZV9jb25maXJtKHdwYV9zKTsKKwkJaWYgKHJlc3AgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJcGFyYW1zLnNhZV9kYXRhID0gd3BhYnVmX2hlYWQocmVzcCk7CisJCXBhcmFtcy5zYWVfZGF0YV9sZW4gPSB3cGFidWZfbGVuKHJlc3ApOworCQl3cGFfcy0+c21lLnNhZS5zdGF0ZSA9IHN0YXJ0ID8gU0FFX0NPTU1JVFRFRCA6IFNBRV9DT05GSVJNRUQ7CisJfQorI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KIAogCXdwYV9zdXBwbGljYW50X2NhbmNlbF9zY2hlZF9zY2FuKHdwYV9zKTsKIAl3cGFfc3VwcGxpY2FudF9jYW5jZWxfc2Nhbih3cGFfcyk7CkBAIC0yODcsNiArNDE2LDcgQEAKIAkJCSJkcml2ZXIgZmFpbGVkIik7CiAJCXdwYXNfY29ubmVjdGlvbl9mYWlsZWQod3BhX3MsIGJzcy0+YnNzaWQpOwogCQl3cGFfc3VwcGxpY2FudF9tYXJrX2Rpc2Fzc29jKHdwYV9zKTsKKwkJd3BhYnVmX2ZyZWUocmVzcCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI5Nyw5ICs0MjcsOTkgQEAKIAkgKiBBc3NvY2lhdGlvbiB3aWxsIGJlIHN0YXJ0ZWQgYmFzZWQgb24gdGhlIGF1dGhlbnRpY2F0aW9uIGV2ZW50IGZyb20KIAkgKiB0aGUgZHJpdmVyLgogCSAqLworCisJd3BhYnVmX2ZyZWUocmVzcCk7CiB9CiAKIAordm9pZCBzbWVfYXV0aGVudGljYXRlKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCSAgICAgIHN0cnVjdCB3cGFfYnNzICpic3MsIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCkKK3sKKyNpZmRlZiBDT05GSUdfU0FFCisJd3BhX3MtPnNtZS5zYWUuc3RhdGUgPSBTQUVfTk9USElORzsKKwl3cGFfcy0+c21lLnNhZS5zZW5kX2NvbmZpcm0gPSAwOworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KKwlzbWVfc2VuZF9hdXRoZW50aWNhdGlvbih3cGFfcywgYnNzLCBzc2lkLCAxKTsKK30KKworCisjaWZkZWYgQ09ORklHX1NBRQorCitzdGF0aWMgaW50IHNtZV9zYWVfYXV0aChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCB1MTYgYXV0aF90cmFuc2FjdGlvbiwKKwkJCXUxNiBzdGF0dXNfY29kZSwgY29uc3QgdTggKmRhdGEsIHNpemVfdCBsZW4pCit7CisJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiU01FOiBTQUUgYXV0aGVudGljYXRpb24gdHJhbnNhY3Rpb24gJXUgIgorCQkic3RhdHVzIGNvZGUgJXUiLCBhdXRoX3RyYW5zYWN0aW9uLCBzdGF0dXNfY29kZSk7CisKKwlpZiAoYXV0aF90cmFuc2FjdGlvbiA9PSAxICYmCisJICAgIHN0YXR1c19jb2RlID09IFdMQU5fU1RBVFVTX0FOVElfQ0xPR0dJTkdfVE9LRU5fUkVRICYmCisJICAgIHdwYV9zLT5zbWUuc2FlLnN0YXRlID09IFNBRV9DT01NSVRURUQgJiYKKwkgICAgd3BhX3MtPmN1cnJlbnRfYnNzICYmIHdwYV9zLT5jdXJyZW50X3NzaWQpIHsKKwkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiU01FOiBTQUUgYW50aS1jbG9nZ2luZyB0b2tlbiAiCisJCQkicmVxdWVzdGVkIik7CisJCXdwYWJ1Zl9mcmVlKHdwYV9zLT5zbWUuc2FlX3Rva2VuKTsKKwkJd3BhX3MtPnNtZS5zYWVfdG9rZW4gPSB3cGFidWZfYWxsb2NfY29weShkYXRhLCBsZW4pOworCQlzbWVfc2VuZF9hdXRoZW50aWNhdGlvbih3cGFfcywgd3BhX3MtPmN1cnJlbnRfYnNzLAorCQkJCQl3cGFfcy0+Y3VycmVudF9zc2lkLCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGF1dGhfdHJhbnNhY3Rpb24gPT0gMSAmJgorCSAgICBzdGF0dXNfY29kZSA9PSBXTEFOX1NUQVRVU19GSU5JVEVfQ1lDTElDX0dST1VQX05PVF9TVVBQT1JURUQgJiYKKwkgICAgd3BhX3MtPnNtZS5zYWUuc3RhdGUgPT0gU0FFX0NPTU1JVFRFRCAmJgorCSAgICB3cGFfcy0+Y3VycmVudF9ic3MgJiYgd3BhX3MtPmN1cnJlbnRfc3NpZCkgeworCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTTUU6IFNBRSBncm91cCBub3Qgc3VwcG9ydGVkIik7CisJCXdwYV9zLT5zbWUuc2FlX2dyb3VwX2luZGV4Kys7CisJCWlmIChzbWVfc2V0X3NhZV9ncm91cCh3cGFfcykgPCAwKQorCQkJcmV0dXJuIC0xOyAvKiBubyBvdGhlciBncm91cHMgZW5hYmxlZCAqLworCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTTUU6IFRyeSBuZXh0IGVuYWJsZWQgU0FFIGdyb3VwIik7CisJCXNtZV9zZW5kX2F1dGhlbnRpY2F0aW9uKHdwYV9zLCB3cGFfcy0+Y3VycmVudF9ic3MsCisJCQkJCXdwYV9zLT5jdXJyZW50X3NzaWQsIDEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RhdHVzX2NvZGUgIT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIC0xOworCisJaWYgKGF1dGhfdHJhbnNhY3Rpb24gPT0gMSkgeworCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTTUUgU0FFIGNvbW1pdCIpOworCQlpZiAod3BhX3MtPmN1cnJlbnRfYnNzID09IE5VTEwgfHwKKwkJICAgIHdwYV9zLT5jdXJyZW50X3NzaWQgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKHdwYV9zLT5zbWUuc2FlLnN0YXRlICE9IFNBRV9DT01NSVRURUQpCisJCQlyZXR1cm4gLTE7CisJCWlmIChzYWVfcGFyc2VfY29tbWl0KCZ3cGFfcy0+c21lLnNhZSwgZGF0YSwgbGVuLCBOVUxMLCBOVUxMLAorCQkJCSAgICAgd3BhX3MtPmNvbmYtPnNhZV9ncm91cHMpICE9CisJCSAgICBXTEFOX1NUQVRVU19TVUNDRVNTKQorCQkJcmV0dXJuIC0xOworCisJCWlmIChzYWVfcHJvY2Vzc19jb21taXQoJndwYV9zLT5zbWUuc2FlKSA8IDApIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBGYWlsZWQgdG8gcHJvY2VzcyBwZWVyICIKKwkJCQkgICAiY29tbWl0Iik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl3cGFidWZfZnJlZSh3cGFfcy0+c21lLnNhZV90b2tlbik7CisJCXdwYV9zLT5zbWUuc2FlX3Rva2VuID0gTlVMTDsKKwkJc21lX3NlbmRfYXV0aGVudGljYXRpb24od3BhX3MsIHdwYV9zLT5jdXJyZW50X2JzcywKKwkJCQkJd3BhX3MtPmN1cnJlbnRfc3NpZCwgMCk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoYXV0aF90cmFuc2FjdGlvbiA9PSAyKSB7CisJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIlNNRSBTQUUgY29uZmlybSIpOworCQlpZiAod3BhX3MtPnNtZS5zYWUuc3RhdGUgIT0gU0FFX0NPTkZJUk1FRCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKHNhZV9jaGVja19jb25maXJtKCZ3cGFfcy0+c21lLnNhZSwgZGF0YSwgbGVuKSA8IDApCisJCQlyZXR1cm4gLTE7CisJCXdwYV9zLT5zbWUuc2FlLnN0YXRlID0gU0FFX0FDQ0VQVEVEOworCQlzYWVfY2xlYXJfdGVtcF9kYXRhKCZ3cGFfcy0+c21lLnNhZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAtMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCisKKwogdm9pZCBzbWVfZXZlbnRfYXV0aChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCB1bmlvbiB3cGFfZXZlbnRfZGF0YSAqZGF0YSkKIHsKIAlzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQgPSB3cGFfcy0+Y3VycmVudF9zc2lkOwpAQCAtMzI0LDE0ICs1NDQsMzQgQEAKIAl9CiAKIAl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTTUU6IEF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlOiBwZWVyPSIgTUFDU1RSCi0JCSIgYXV0aF90eXBlPSVkIHN0YXR1c19jb2RlPSVkIiwKKwkJIiBhdXRoX3R5cGU9JWQgYXV0aF90cmFuc2FjdGlvbj0lZCBzdGF0dXNfY29kZT0lZCIsCiAJCU1BQzJTVFIoZGF0YS0+YXV0aC5wZWVyKSwgZGF0YS0+YXV0aC5hdXRoX3R5cGUsCi0JCWRhdGEtPmF1dGguc3RhdHVzX2NvZGUpOworCQlkYXRhLT5hdXRoLmF1dGhfdHJhbnNhY3Rpb24sIGRhdGEtPmF1dGguc3RhdHVzX2NvZGUpOwogCXdwYV9oZXhkdW1wKE1TR19NU0dEVU1QLCAiU01FOiBBdXRoZW50aWNhdGlvbiByZXNwb25zZSBJRXMiLAogCQkgICAgZGF0YS0+YXV0aC5pZXMsIGRhdGEtPmF1dGguaWVzX2xlbik7CiAKIAllbG9vcF9jYW5jZWxfdGltZW91dChzbWVfYXV0aF90aW1lciwgd3BhX3MsIE5VTEwpOwogCisjaWZkZWYgQ09ORklHX1NBRQorCWlmIChkYXRhLT5hdXRoLmF1dGhfdHlwZSA9PSBXTEFOX0FVVEhfU0FFKSB7CisJCWludCByZXM7CisJCXJlcyA9IHNtZV9zYWVfYXV0aCh3cGFfcywgZGF0YS0+YXV0aC5hdXRoX3RyYW5zYWN0aW9uLAorCQkJCSAgIGRhdGEtPmF1dGguc3RhdHVzX2NvZGUsIGRhdGEtPmF1dGguaWVzLAorCQkJCSAgIGRhdGEtPmF1dGguaWVzX2xlbik7CisJCWlmIChyZXMgPCAwKSB7CisJCQl3cGFzX2Nvbm5lY3Rpb25fZmFpbGVkKHdwYV9zLCB3cGFfcy0+cGVuZGluZ19ic3NpZCk7CisJCQl3cGFfc3VwcGxpY2FudF9zZXRfc3RhdGUod3BhX3MsIFdQQV9ESVNDT05ORUNURUQpOworCisJCX0KKwkJaWYgKHJlcyAhPSAxKQorCQkJcmV0dXJuOworCisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU01FOiBTQUUgY29tcGxldGVkIC0gc2V0dGluZyBQTUsgZm9yICIKKwkJCSAgICI0LXdheSBoYW5kc2hha2UiKTsKKwkJd3BhX3NtX3NldF9wbWsod3BhX3MtPndwYSwgd3BhX3MtPnNtZS5zYWUucG1rLCBQTUtfTEVOKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLworCiAJaWYgKGRhdGEtPmF1dGguc3RhdHVzX2NvZGUgIT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykgewogCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTTUU6IEF1dGhlbnRpY2F0aW9uIGZhaWxlZCAoc3RhdHVzICIKIAkJCSJjb2RlICVkKSIsIGRhdGEtPmF1dGguc3RhdHVzX2NvZGUpOwpAQCAtNDAzLDggKzY0Myw5IEBACiAJcGFyYW1zLndwYV9pZSA9IHdwYV9zLT5zbWUuYXNzb2NfcmVxX2llX2xlbiA/CiAJCXdwYV9zLT5zbWUuYXNzb2NfcmVxX2llIDogTlVMTDsKIAlwYXJhbXMud3BhX2llX2xlbiA9IHdwYV9zLT5zbWUuYXNzb2NfcmVxX2llX2xlbjsKLQlwYXJhbXMucGFpcndpc2Vfc3VpdGUgPSBjaXBoZXJfc3VpdGUyZHJpdmVyKHdwYV9zLT5wYWlyd2lzZV9jaXBoZXIpOwotCXBhcmFtcy5ncm91cF9zdWl0ZSA9IGNpcGhlcl9zdWl0ZTJkcml2ZXIod3BhX3MtPmdyb3VwX2NpcGhlcik7CisJcGFyYW1zLnBhaXJ3aXNlX3N1aXRlID0KKwkJd3BhX2NpcGhlcl90b19zdWl0ZV9kcml2ZXIod3BhX3MtPnBhaXJ3aXNlX2NpcGhlcik7CisJcGFyYW1zLmdyb3VwX3N1aXRlID0gd3BhX2NpcGhlcl90b19zdWl0ZV9kcml2ZXIod3BhX3MtPmdyb3VwX2NpcGhlcik7CiAjaWZkZWYgQ09ORklHX0hUX09WRVJSSURFUwogCW9zX21lbXNldCgmaHRjYXBzLCAwLCBzaXplb2YoaHRjYXBzKSk7CiAJb3NfbWVtc2V0KCZodGNhcHNfbWFzaywgMCwgc2l6ZW9mKGh0Y2Fwc19tYXNrKSk7CkBAIC02MzEsNiArODcyLDExIEBACiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKIAlzbWVfc3RvcF9zYV9xdWVyeSh3cGFfcyk7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KKyNpZmRlZiBDT05GSUdfU0FFCisJd3BhYnVmX2ZyZWUod3BhX3MtPnNtZS5zYWVfdG9rZW4pOworCXdwYV9zLT5zbWUuc2FlX3Rva2VuID0gTlVMTDsKKwlzYWVfY2xlYXJfZGF0YSgmd3BhX3MtPnNtZS5zYWUpOworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KIAogCWVsb29wX2NhbmNlbF90aW1lb3V0KHNtZV9hc3NvY190aW1lciwgd3BhX3MsIE5VTEwpOwogCWVsb29wX2NhbmNlbF90aW1lb3V0KHNtZV9hdXRoX3RpbWVyLCB3cGFfcywgTlVMTCk7CkBAIC04NjAsOSArMTEwNiwxNCBAQAogCWlmICghZW5hYmxlKQogCQlyZXR1cm47CiAKLQlpZiAoISh3cGFfcy0+ZHJ2X2ZsYWdzICYgV1BBX0RSSVZFUl9GTEFHU19TTUUpIHx8IHNzaWQgPT0gTlVMTCB8fAotCSAgICBzc2lkLT5tb2RlICE9IElFRUU4MDIxMV9NT0RFX0lORlJBKQotCQlyZXR1cm47IC8qIE5vdCB1c2luZyBzdGF0aW9uIFNNRSBpbiB3cGFfc3VwcGxpY2FudCAqLworCS8qCisJICogU2NoZWR1bGUgT0JTUyBzY2FuIGlmIGRyaXZlciBpcyB1c2luZyBzdGF0aW9uIFNNRSBpbiB3cGFfc3VwcGxpY2FudAorCSAqIG9yIGl0IGV4cGVjdHMgT0JTUyBzY2FuIHRvIGJlIHBlcmZvcm1lZCBieSB3cGFfc3VwcGxpY2FudC4KKwkgKi8KKwlpZiAoISgod3BhX3MtPmRydl9mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfU01FKSB8fAorCSAgICAgICh3cGFfcy0+ZHJ2X2ZsYWdzICYgV1BBX0RSSVZFUl9GTEFHU19PQlNTX1NDQU4pKSB8fAorCSAgICBzc2lkID09IE5VTEwgfHwgc3NpZC0+bW9kZSAhPSBJRUVFODAyMTFfTU9ERV9JTkZSQSkKKwkJcmV0dXJuOwogCiAJaWYgKCF3cGFfcy0+aHcubW9kZXMpCiAJCXJldHVybjsKQEAgLTEwMTIsNyArMTI2Myw5IEBACiAJaWYgKHdwYV9zLT53cGFfc3RhdGUgIT0gV1BBX0NPTVBMRVRFRCkKIAkJcmV0dXJuOwogCXNzaWQgPSB3cGFfcy0+Y3VycmVudF9zc2lkOwotCWlmIChzc2lkID09IE5VTEwgfHwgc3NpZC0+aWVlZTgwMjExdyA9PSAwKQorCWlmIChzc2lkID09IE5VTEwgfHwKKwkgICAgKHNzaWQtPmllZWU4MDIxMXcgPT0gTUdNVF9GUkFNRV9QUk9URUNUSU9OX0RFRkFVTFQgPworCSAgICAgd3BhX3MtPmNvbmYtPnBtZiA6IHNzaWQtPmllZWU4MDIxMXcpID09IE5PX01HTVRfRlJBTUVfUFJPVEVDVElPTikKIAkJcmV0dXJuOwogCWlmIChvc19tZW1jbXAoc2EsIHdwYV9zLT5ic3NpZCwgRVRIX0FMRU4pICE9IDApCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3N5c3RlbWQvd3BhX3N1cHBsaWNhbnQtbmw4MDIxMS5zZXJ2aWNlLmFyZy5pbiBiL3dwYV9zdXBwbGljYW50L3N5c3RlbWQvd3BhX3N1cHBsaWNhbnQtbmw4MDIxMS5zZXJ2aWNlLmFyZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmFiYTEyCi0tLSAvZGV2L251bGwKKysrIGIvd3BhX3N1cHBsaWNhbnQvc3lzdGVtZC93cGFfc3VwcGxpY2FudC1ubDgwMjExLnNlcnZpY2UuYXJnLmluCkBAIC0wLDAgKzEsMTMgQEAKK1tVbml0XQorRGVzY3JpcHRpb249V1BBIHN1cHBsaWNhbnQgZGFlbW9uIChpbnRlcmZhY2UtIGFuZCBubDgwMjExIGRyaXZlci1zcGVjaWZpYyB2ZXJzaW9uKQorUmVxdWlyZXM9c3lzLXN1YnN5c3RlbS1uZXQtZGV2aWNlcy0laS5kZXZpY2UKK0FmdGVyPXN5cy1zdWJzeXN0ZW0tbmV0LWRldmljZXMtJWkuZGV2aWNlCisKKyMgTmV0d29ya01hbmFnZXIgdXNlcnMgd2lsbCBwcm9iYWJseSB3YW50IHRoZSBkYnVzIHZlcnNpb24gaW5zdGVhZC4KKworW1NlcnZpY2VdCitUeXBlPXNpbXBsZQorRXhlY1N0YXJ0PUBCSU5ESVJAL3dwYV9zdXBwbGljYW50IC1jL2V0Yy93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudC1ubDgwMjExLSVJLmNvbmYgLURubDgwMjExIC1pJUkKKworW0luc3RhbGxdCitBbGlhcz1tdWx0aS11c2VyLnRhcmdldC53YW50cy93cGFfc3VwcGxpY2FudC1ubDgwMjExQHdsYW4wLnNlcnZpY2UKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3N5c3RlbWQvd3BhX3N1cHBsaWNhbnQtd2lyZWQuc2VydmljZS5hcmcuaW4gYi93cGFfc3VwcGxpY2FudC9zeXN0ZW1kL3dwYV9zdXBwbGljYW50LXdpcmVkLnNlcnZpY2UuYXJnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzg0YWUKLS0tIC9kZXYvbnVsbAorKysgYi93cGFfc3VwcGxpY2FudC9zeXN0ZW1kL3dwYV9zdXBwbGljYW50LXdpcmVkLnNlcnZpY2UuYXJnLmluCkBAIC0wLDAgKzEsMTMgQEAKK1tVbml0XQorRGVzY3JpcHRpb249V1BBIHN1cHBsaWNhbnQgZGFlbW9uIChpbnRlcmZhY2UtIGFuZCB3aXJlZCBkcml2ZXItc3BlY2lmaWMgdmVyc2lvbikKK1JlcXVpcmVzPXN5cy1zdWJzeXN0ZW0tbmV0LWRldmljZXMtJWkuZGV2aWNlCitBZnRlcj1zeXMtc3Vic3lzdGVtLW5ldC1kZXZpY2VzLSVpLmRldmljZQorCisjIE5ldHdvcmtNYW5hZ2VyIHVzZXJzIHdpbGwgcHJvYmFibHkgd2FudCB0aGUgZGJ1cyB2ZXJzaW9uIGluc3RlYWQuCisKK1tTZXJ2aWNlXQorVHlwZT1zaW1wbGUKK0V4ZWNTdGFydD1AQklORElSQC93cGFfc3VwcGxpY2FudCAtYy9ldGMvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnQtd2lyZWQtJUkuY29uZiAtRHdpcmVkIC1pJUkKKworW0luc3RhbGxdCitBbGlhcz1tdWx0aS11c2VyLnRhcmdldC53YW50cy93cGFfc3VwcGxpY2FudC13aXJlZEB3bGFuMC5zZXJ2aWNlCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9zeXN0ZW1kL3dwYV9zdXBwbGljYW50LnNlcnZpY2UuYXJnLmluIGIvd3BhX3N1cHBsaWNhbnQvc3lzdGVtZC93cGFfc3VwcGxpY2FudC5zZXJ2aWNlLmFyZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjE1NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvd3BhX3N1cHBsaWNhbnQvc3lzdGVtZC93cGFfc3VwcGxpY2FudC5zZXJ2aWNlLmFyZy5pbgpAQCAtMCwwICsxLDEzIEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPVdQQSBzdXBwbGljYW50IGRhZW1vbiAoaW50ZXJmYWNlLXNwZWNpZmljIHZlcnNpb24pCitSZXF1aXJlcz1zeXMtc3Vic3lzdGVtLW5ldC1kZXZpY2VzLSVpLmRldmljZQorQWZ0ZXI9c3lzLXN1YnN5c3RlbS1uZXQtZGV2aWNlcy0laS5kZXZpY2UKKworIyBOZXR3b3JrTWFuYWdlciB1c2VycyB3aWxsIHByb2JhYmx5IHdhbnQgdGhlIGRidXMgdmVyc2lvbiBpbnN0ZWFkLgorCitbU2VydmljZV0KK1R5cGU9c2ltcGxlCitFeGVjU3RhcnQ9QEJJTkRJUkAvd3BhX3N1cHBsaWNhbnQgLWMvZXRjL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50LSVJLmNvbmYgLWklSQorCitbSW5zdGFsbF0KK0FsaWFzPW11bHRpLXVzZXIudGFyZ2V0LndhbnRzL3dwYV9zdXBwbGljYW50QHdsYW4wLnNlcnZpY2UKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3N5c3RlbWQvd3BhX3N1cHBsaWNhbnQuc2VydmljZS5pbiBiL3dwYV9zdXBwbGljYW50L3N5c3RlbWQvd3BhX3N1cHBsaWNhbnQuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzUxYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvd3BhX3N1cHBsaWNhbnQvc3lzdGVtZC93cGFfc3VwcGxpY2FudC5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsMTEgQEAKK1tVbml0XQorRGVzY3JpcHRpb249V1BBIHN1cHBsaWNhbnQKKworW1NlcnZpY2VdCitUeXBlPWRidXMKK0J1c05hbWU9ZmkuZXBpdGVzdC5ob3N0YXAuV1BBU3VwcGxpY2FudAorRXhlY1N0YXJ0PUBCSU5ESVJAL3dwYV9zdXBwbGljYW50IC11CisKK1tJbnN0YWxsXQorV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQKK0FsaWFzPWRidXMtZmkuZXBpdGVzdC5ob3N0YXAuV1BBU3VwcGxpY2FudC5zZXJ2aWNlCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC90ZXN0cy90ZXN0X3dwYS5jIGIvd3BhX3N1cHBsaWNhbnQvdGVzdHMvdGVzdF93cGEuYwppbmRleCAwZDY1OWFkLi5iYTJiZTZmIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC90ZXN0cy90ZXN0X3dwYS5jCisrKyBiL3dwYV9zdXBwbGljYW50L3Rlc3RzL3Rlc3Rfd3BhLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlICIuLi9jb25maWcuaCIKICNpbmNsdWRlICJyc25fc3VwcC93cGEuaCIKICNpbmNsdWRlICJyc25fc3VwcC93cGFfaWUuaCIKLSNpbmNsdWRlICIuLi9ob3N0YXBkL3dwYS5oIgorI2luY2x1ZGUgImFwL3dwYV9hdXRoLmgiCiAKIAogZXh0ZXJuIGludCB3cGFfZGVidWdfbGV2ZWw7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC91dGlscy9sb2cycGNhcC5weSBiL3dwYV9zdXBwbGljYW50L3V0aWxzL2xvZzJwY2FwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1ZTJmYTEKLS0tIC9kZXYvbnVsbAorKysgYi93cGFfc3VwcGxpY2FudC91dGlscy9sb2cycGNhcC5weQpAQCAtMCwwICsxLDU0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3I6IEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisjCisjIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KKworaW1wb3J0IHN5cywgc3RydWN0LCByZQorCitkZWYgd3JpdGVfcGNhcF9oZWFkZXIocGNhcF9maWxlKToKKyAgICBwY2FwX2ZpbGUud3JpdGUoCisgICAgICAgIHN0cnVjdC5wYWNrKCc8SUhISUlJSScsCisgICAgICAgICAgICAgICAgICAgIDB4YTFiMmMzZDQsIDIsIDQsIDAsIDAsIDY1NTM1LAorICAgICAgICAgICAgICAgICAgICAxMDUgIyByYXcgODAyLjExIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICApKQorCitkZWYgcGNhcF9hZGRwYWNrZXQocGNhcF9maWxlLCB0cywgZGF0YSk6CisgICAgIyB0cyBpbiBzZWNvbmRzLCBmbG9hdAorICAgIHBjYXBfZmlsZS53cml0ZShzdHJ1Y3QucGFjaygnPElJSUknLAorICAgICAgICBpbnQodHMpLCBpbnQoMTAwMDAwMCAqIHRzKSAlIDEwMDAwMDAsCisgICAgICAgIGxlbihkYXRhKSwgbGVuKGRhdGEpKSkKKyAgICBwY2FwX2ZpbGUud3JpdGUoZGF0YSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0cnk6CisgICAgICAgIGlucHV0ID0gc3lzLmFyZ3ZbMV0KKyAgICAgICAgcGNhcCA9IHN5cy5hcmd2WzJdCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHByaW50ICJVc2FnZTogJXMgPGxvZyBmaWxlPiA8cGNhcCBmaWxlPiIgJSBzeXMuYXJndlswXQorICAgICAgICBzeXMuZXhpdCgyKQorCisgICAgaW5wdXRfZmlsZSA9IG9wZW4oaW5wdXQsICdyJykKKyAgICBwY2FwX2ZpbGUgPSBvcGVuKHBjYXAsICd3JykKKyAgICBmcmFtZV9yZSA9IHJlLmNvbXBpbGUocicoKFswLTldKy5bMC05XXs2fSk6XHMqKT9ubDgwMjExOiBNTE1FIGV2ZW50IGZyYW1lIC0gaGV4ZHVtcFwobGVuPVswLTldKlwpOigoXHMqWzAtOWEtZkEtRl17Mn0pKiknKQorCisgICAgd3JpdGVfcGNhcF9oZWFkZXIocGNhcF9maWxlKQorCisgICAgZm9yIGxpbmUgaW4gaW5wdXRfZmlsZToKKyAgICAgICAgbSA9IGZyYW1lX3JlLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIG0uZ3JvdXAoMik6CisgICAgICAgICAgICB0cyA9IGZsb2F0KG0uZ3JvdXAoMikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cyA9IDAKKyAgICAgICAgaGV4ZGF0YSA9IG0uZ3JvdXAoMykKKyAgICAgICAgaGV4ZGF0YSA9IGhleGRhdGEuc3BsaXQoKQorICAgICAgICBkYXRhID0gJycuam9pbihbY2hyKGludCh4LCAxNikpIGZvciB4IGluIGhleGRhdGFdKQorICAgICAgICBwY2FwX2FkZHBhY2tldChwY2FwX2ZpbGUsIHRzLCBkYXRhKQorCisgICAgaW5wdXRfZmlsZS5jbG9zZSgpCisgICAgcGNhcF9maWxlLmNsb3NlKCkKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3dubV9zdGEuYyBiL3dwYV9zdXBwbGljYW50L3dubV9zdGEuYwppbmRleCA5OGNlOTY2Li40ZDllNDUzIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC93bm1fc3RhLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvd25tX3N0YS5jCkBAIC0xMSwxMiArMTEsMTIgQEAKICNpbmNsdWRlICJ1dGlscy9jb21tb24uaCIKICNpbmNsdWRlICJjb21tb24vaWVlZTgwMl8xMV9kZWZzLmgiCiAjaW5jbHVkZSAicnNuX3N1cHAvd3BhLmgiCi0jaW5jbHVkZSAiLi4vd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnRfaS5oIgotI2luY2x1ZGUgIi4uL3dwYV9zdXBwbGljYW50L2RyaXZlcl9pLmgiCisjaW5jbHVkZSAid3BhX3N1cHBsaWNhbnRfaS5oIgorI2luY2x1ZGUgImRyaXZlcl9pLmgiCisjaW5jbHVkZSAic2Nhbi5oIgogCiAjZGVmaW5lIE1BWF9URlNfSUVfTEVOICAxMDI0CiAKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVgogCiAvKiBnZXQgdGhlIFRGUyBJRSBmcm9tIGRyaXZlciAqLwogc3RhdGljIGludCBpZWVlODAyMTFfMTFfZ2V0X3Rmc19pZShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCB1OCAqYnVmLApAQCAtNDEsNyArNDEsNyBAQAogCiAvKiBNTE1FLVNMRUVQTU9ERS5yZXF1ZXN0ICovCiBpbnQgaWVlZTgwMl8xMV9zZW5kX3dubXNsZWVwX3JlcShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAotCQkJCSB1OCBhY3Rpb24sIHU4IGludHZhbCkKKwkJCQkgdTggYWN0aW9uLCB1MTYgaW50dmFsLCBzdHJ1Y3Qgd3BhYnVmICp0ZnNfcmVxKQogewogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKIAlpbnQgcmVzOwpAQCAtNTMsNiArNTMsMTEgQEAKIAllbnVtIHdubV9vcGVyIHRmc19vcGVyID0gYWN0aW9uID09IDAgPyBXTk1fU0xFRVBfVEZTX1JFUV9JRV9BREQgOgogCQlXTk1fU0xFRVBfVEZTX1JFUV9JRV9OT05FOwogCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IFJlcXVlc3QgdG8gc2VuZCBXTk0tU2xlZXAgTW9kZSBSZXF1ZXN0ICIKKwkJICAgImFjdGlvbj0lcyB0byAiIE1BQ1NUUiwKKwkJICAgYWN0aW9uID09IDAgPyAiZW50ZXIiIDogImV4aXQiLAorCQkgICBNQUMyU1RSKHdwYV9zLT5ic3NpZCkpOworCiAJLyogV05NLVNsZWVwIE1vZGUgSUUgKi8KIAl3bm1zbGVlcF9pZV9sZW4gPSBzaXplb2Yoc3RydWN0IHdubV9zbGVlcF9lbGVtZW50KTsKIAl3bm1zbGVlcF9pZSA9IG9zX3phbGxvYyhzaXplb2Yoc3RydWN0IHdubV9zbGVlcF9lbGVtZW50KSk7CkBAIC02MiwyNSArNjcsNDEgQEAKIAl3bm1zbGVlcF9pZS0+bGVuID0gd25tc2xlZXBfaWVfbGVuIC0gMjsKIAl3bm1zbGVlcF9pZS0+YWN0aW9uX3R5cGUgPSBhY3Rpb247CiAJd25tc2xlZXBfaWUtPnN0YXR1cyA9IFdOTV9TVEFUVVNfU0xFRVBfQUNDRVBUOwotCXdubXNsZWVwX2llLT5pbnR2YWwgPSBpbnR2YWw7CisJd25tc2xlZXBfaWUtPmludHZhbCA9IGhvc3RfdG9fbGUxNihpbnR2YWwpOworCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIldOTTogV05NLVNsZWVwIE1vZGUgZWxlbWVudCIsCisJCSAgICAodTggKikgd25tc2xlZXBfaWUsIHdubXNsZWVwX2llX2xlbik7CiAKIAkvKiBURlMgSUUocykgKi8KLQl3bm10ZnNfaWUgPSBvc196YWxsb2MoTUFYX1RGU19JRV9MRU4pOwotCWlmICh3bm10ZnNfaWUgPT0gTlVMTCkgewotCQlvc19mcmVlKHdubXNsZWVwX2llKTsKLQkJcmV0dXJuIC0xOworCWlmICh0ZnNfcmVxKSB7CisJCXdubXRmc19pZV9sZW4gPSB3cGFidWZfbGVuKHRmc19yZXEpOworCQl3bm10ZnNfaWUgPSBvc19tYWxsb2Mod25tdGZzX2llX2xlbik7CisJCWlmICh3bm10ZnNfaWUgPT0gTlVMTCkgeworCQkJb3NfZnJlZSh3bm1zbGVlcF9pZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJb3NfbWVtY3B5KHdubXRmc19pZSwgd3BhYnVmX2hlYWQodGZzX3JlcSksIHdubXRmc19pZV9sZW4pOworCX0gZWxzZSB7CisJCXdubXRmc19pZSA9IG9zX3phbGxvYyhNQVhfVEZTX0lFX0xFTik7CisJCWlmICh3bm10ZnNfaWUgPT0gTlVMTCkgeworCQkJb3NfZnJlZSh3bm1zbGVlcF9pZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGllZWU4MDIxMV8xMV9nZXRfdGZzX2llKHdwYV9zLCB3bm10ZnNfaWUsICZ3bm10ZnNfaWVfbGVuLAorCQkJCQkgICAgdGZzX29wZXIpKSB7CisJCQl3bm10ZnNfaWVfbGVuID0gMDsKKwkJCW9zX2ZyZWUod25tdGZzX2llKTsKKwkJCXdubXRmc19pZSA9IE5VTEw7CisJCX0KIAl9Ci0JaWYgKGllZWU4MDIxMV8xMV9nZXRfdGZzX2llKHdwYV9zLCB3bm10ZnNfaWUsICZ3bm10ZnNfaWVfbGVuLAotCQkJCSAgICB0ZnNfb3BlcikpIHsKLQkJd25tdGZzX2llX2xlbiA9IDA7Ci0JCW9zX2ZyZWUod25tdGZzX2llKTsKLQkJd25tdGZzX2llID0gTlVMTDsKLQl9CisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiV05NOiBURlMgUmVxdWVzdCBlbGVtZW50IiwKKwkJICAgICh1OCAqKSB3bm10ZnNfaWUsIHdubXRmc19pZV9sZW4pOwogCiAJbWdtdCA9IG9zX3phbGxvYyhzaXplb2YoKm1nbXQpICsgd25tc2xlZXBfaWVfbGVuICsgd25tdGZzX2llX2xlbik7CiAJaWYgKG1nbXQgPT0gTlVMTCkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIk1MTUU6IEZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yICIKIAkJCSAgICJXTk0tU2xlZXAgUmVxdWVzdCBhY3Rpb24gZnJhbWUiKTsKKwkJb3NfZnJlZSh3bm1zbGVlcF9pZSk7CisJCW9zX2ZyZWUod25tdGZzX2llKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtOTEsNiArMTEyLDcgQEAKIAkJCQkJICAgV0xBTl9GQ19TVFlQRV9BQ1RJT04pOwogCW1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID0gV0xBTl9BQ1RJT05fV05NOwogCW1nbXQtPnUuYWN0aW9uLnUud25tX3NsZWVwX3JlcS5hY3Rpb24gPSBXTk1fU0xFRVBfTU9ERV9SRVE7CisJbWdtdC0+dS5hY3Rpb24udS53bm1fc2xlZXBfcmVxLmRpYWxvZ3Rva2VuID0gMTsKIAlvc19tZW1jcHkobWdtdC0+dS5hY3Rpb24udS53bm1fc2xlZXBfcmVxLnZhcmlhYmxlLCB3bm1zbGVlcF9pZSwKIAkJICB3bm1zbGVlcF9pZV9sZW4pOwogCS8qIGNvcHkgVEZTIElFIGhlcmUgKi8KQEAgLTExNyw2ICsxMzksOTIgQEAKIH0KIAogCitzdGF0aWMgdm9pZCB3bm1fc2xlZXBfbW9kZV9lbnRlcl9zdWNjZXNzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJCSB1OCAqdGZzcmVzcF9pZV9zdGFydCwKKwkJCQkJIHU4ICp0ZnNyZXNwX2llX2VuZCkKK3sKKwl3cGFfZHJ2X3dubV9vcGVyKHdwYV9zLCBXTk1fU0xFRVBfRU5URVJfQ09ORklSTSwKKwkJCSB3cGFfcy0+YnNzaWQsIE5VTEwsIE5VTEwpOworCS8qIHJlbW92ZSBHVEsvSUdUSyA/PyAqLworCisJLyogc2V0IHRoZSBURlMgUmVzcCBJRShzKSAqLworCWlmICh0ZnNyZXNwX2llX3N0YXJ0ICYmIHRmc3Jlc3BfaWVfZW5kICYmCisJICAgIHRmc3Jlc3BfaWVfZW5kIC0gdGZzcmVzcF9pZV9zdGFydCA+PSAwKSB7CisJCXUxNiB0ZnNyZXNwX2llX2xlbjsKKwkJdGZzcmVzcF9pZV9sZW4gPSAodGZzcmVzcF9pZV9lbmQgKyB0ZnNyZXNwX2llX2VuZFsxXSArIDIpIC0KKwkJCXRmc3Jlc3BfaWVfc3RhcnQ7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiVEZTIFJlc3AgSUUocykgZm91bmQiKTsKKwkJLyogcGFzcyB0aGUgVEZTIFJlc3AgSUUocykgdG8gZHJpdmVyIGZvciBwcm9jZXNzaW5nICovCisJCWlmIChpZWVlODAyMTFfMTFfc2V0X3Rmc19pZSh3cGFfcywgd3BhX3MtPmJzc2lkLAorCQkJCQkgICAgdGZzcmVzcF9pZV9zdGFydCwKKwkJCQkJICAgICZ0ZnNyZXNwX2llX2xlbiwKKwkJCQkJICAgIFdOTV9TTEVFUF9URlNfUkVTUF9JRV9TRVQpKQorCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IEZhaWwgdG8gc2V0IFRGUyBSZXNwIElFIik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHdubV9zbGVlcF9tb2RlX2V4aXRfc3VjY2VzcyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCQljb25zdCB1OCAqZnJtLCB1MTYga2V5X2xlbl90b3RhbCkKK3sKKwl1OCAqcHRyLCAqZW5kOworCXU4IGd0a19sZW47CisKKwl3cGFfZHJ2X3dubV9vcGVyKHdwYV9zLCBXTk1fU0xFRVBfRVhJVF9DT05GSVJNLCAgd3BhX3MtPmJzc2lkLAorCQkJIE5VTEwsIE5VTEwpOworCisJLyogSW5zdGFsbCBHVEsvSUdUSyAqLworCisJLyogcG9pbnQgdG8ga2V5IGRhdGEgZmllbGQgKi8KKwlwdHIgPSAodTggKikgZnJtICsgMSArIDEgKyAyOworCWVuZCA9IHB0ciArIGtleV9sZW5fdG90YWw7CisJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIldOTTogS2V5IERhdGEiLCBwdHIsIGtleV9sZW5fdG90YWwpOworCisJd2hpbGUgKHB0ciArIDEgPCBlbmQpIHsKKwkJaWYgKHB0ciArIDIgKyBwdHJbMV0gPiBlbmQpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBJbnZhbGlkIEtleSBEYXRhIGVsZW1lbnQgIgorCQkJCSAgICJsZW5ndGgiKTsKKwkJCWlmIChlbmQgPiBwdHIpIHsKKwkJCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJXTk06IFJlbWFpbmluZyBkYXRhIiwKKwkJCQkJICAgIHB0ciwgZW5kIC0gcHRyKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmICgqcHRyID09IFdOTV9TTEVFUF9TVUJFTEVNX0dUSykgeworCQkJaWYgKHB0clsxXSA8IDExICsgNSkgeworCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBUb28gc2hvcnQgR1RLICIKKwkJCQkJICAgInN1YmVsZW0iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWd0a19sZW4gPSAqKHB0ciArIDQpOworCQkJaWYgKHB0clsxXSA8IDExICsgZ3RrX2xlbiB8fAorCQkJICAgIGd0a19sZW4gPCA1IHx8IGd0a19sZW4gPiAzMikgeworCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBJbnZhbGlkIEdUSyAiCisJCQkJCSAgICJzdWJlbGVtIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQl3cGFfd25tc2xlZXBfaW5zdGFsbF9rZXkoCisJCQkJd3BhX3MtPndwYSwKKwkJCQlXTk1fU0xFRVBfU1VCRUxFTV9HVEssCisJCQkJcHRyKTsKKwkJCXB0ciArPSAxMyArIGd0a19sZW47CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKKwkJfSBlbHNlIGlmICgqcHRyID09IFdOTV9TTEVFUF9TVUJFTEVNX0lHVEspIHsKKwkJCWlmIChwdHJbMV0gPCAyICsgNiArIFdQQV9JR1RLX0xFTikgeworCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBUb28gc2hvcnQgSUdUSyAiCisJCQkJCSAgICJzdWJlbGVtIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQl3cGFfd25tc2xlZXBfaW5zdGFsbF9rZXkod3BhX3MtPndwYSwKKwkJCQkJCSBXTk1fU0xFRVBfU1VCRUxFTV9JR1RLLCBwdHIpOworCQkJcHRyICs9IDEwICsgV1BBX0lHVEtfTEVOOworI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCisJCX0gZWxzZQorCQkJYnJlYWs7IC8qIHNraXAgdGhlIGxvb3AgKi8KKwl9Cit9CisKKwogc3RhdGljIHZvaWQgaWVlZTgwMl8xMV9yeF93bm1zbGVlcF9yZXNwKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJCWNvbnN0IHU4ICpmcm0sIGludCBsZW4pCiB7CkBAIC0xMjYsMjEgKzIzNCwyNSBAQAogCSAqLwogCXU4ICpwb3MgPSAodTggKikgZnJtOyAvKiBwb2ludCB0byBhY3Rpb24gZmllbGQgKi8KIAl1MTYga2V5X2xlbl90b3RhbCA9IGxlX3RvX2hvc3QxNigqKCh1MTYgKikoZnJtKzIpKSk7Ci0JdTggZ3RrX2xlbjsKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwotCXU4IGlndGtfbGVuOwotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCiAJc3RydWN0IHdubV9zbGVlcF9lbGVtZW50ICp3bm1zbGVlcF9pZSA9IE5VTEw7CiAJLyogbXVsdGlwbGUgVEZTIFJlc3AgSUUgKGFzc3VtaW5nIGNvbnNlY3V0aXZlKSAqLwogCXU4ICp0ZnNyZXNwX2llX3N0YXJ0ID0gTlVMTDsKIAl1OCAqdGZzcmVzcF9pZV9lbmQgPSBOVUxMOwotCXUxNiB0ZnNyZXNwX2llX2xlbiA9IDA7CiAKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgImFjdGlvbj0lZCB0b2tlbiA9ICVkIGtleV9sZW5fdG90YWwgPSAlZCIsCiAJCSAgIGZybVswXSwgZnJtWzFdLCBrZXlfbGVuX3RvdGFsKTsKIAlwb3MgKz0gNCArIGtleV9sZW5fdG90YWw7CisJaWYgKHBvcyA+IGZybSArIGxlbikgeworCQl3cGFfcHJpbnRmKE1TR19JTkZPLCAiV05NOiBUb28gc2hvcnQgZnJhbWUgZm9yIEtleSBEYXRhIGZpZWxkIik7CisJCXJldHVybjsKKwl9CiAJd2hpbGUgKHBvcyAtIGZybSA8IGxlbikgewogCQl1OCBpZV9sZW4gPSAqKHBvcyArIDEpOworCQlpZiAocG9zICsgMiArIGllX2xlbiA+IGZybSArIGxlbikgeworCQkJd3BhX3ByaW50ZihNU0dfSU5GTywgIldOTTogSW52YWxpZCBJRSBsZW4gJXUiLCBpZV9sZW4pOworCQkJYnJlYWs7CisJCX0KKwkJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiV05NOiBFbGVtZW50IiwgcG9zLCAyICsgaWVfbGVuKTsKIAkJaWYgKCpwb3MgPT0gV0xBTl9FSURfV05NU0xFRVApCiAJCQl3bm1zbGVlcF9pZSA9IChzdHJ1Y3Qgd25tX3NsZWVwX2VsZW1lbnQgKikgcG9zOwogCQllbHNlIGlmICgqcG9zID09IFdMQU5fRUlEX1RGU19SRVNQKSB7CkBAIC0xNTcsODYgKzI2OSwxNTEgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICh3bm1zbGVlcF9pZS0+c3RhdHVzID09IFdOTV9TVEFUVVNfU0xFRVBfQUNDRVBUKSB7CisJaWYgKHdubXNsZWVwX2llLT5zdGF0dXMgPT0gV05NX1NUQVRVU19TTEVFUF9BQ0NFUFQgfHwKKwkgICAgd25tc2xlZXBfaWUtPnN0YXR1cyA9PSBXTk1fU1RBVFVTX1NMRUVQX0VYSVRfQUNDRVBUX0dUS19VUERBVEUpIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTdWNjZXNzZnVsbHkgcmVjdiBXTk0tU2xlZXAgUmVzcG9uc2UgIgogCQkJICAgImZyYW1lIChhY3Rpb249JWQsIGludHZhbD0lZCkiLAogCQkJICAgd25tc2xlZXBfaWUtPmFjdGlvbl90eXBlLCB3bm1zbGVlcF9pZS0+aW50dmFsKTsKLQkJaWYgKHdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSA9PSAwKSB7Ci0JCQl3cGFfZHJ2X3dubV9vcGVyKHdwYV9zLCBXTk1fU0xFRVBfRU5URVJfQ09ORklSTSwKLQkJCQkJIHdwYV9zLT5ic3NpZCwgTlVMTCwgTlVMTCk7Ci0JCQkvKiByZW1vdmUgR1RLL0lHVEsgPz8gKi8KLQotCQkJLyogc2V0IHRoZSBURlMgUmVzcCBJRShzKSAqLwotCQkJaWYgKHRmc3Jlc3BfaWVfc3RhcnQgJiYgdGZzcmVzcF9pZV9lbmQgJiYKLQkJCSAgICB0ZnNyZXNwX2llX2VuZCAtIHRmc3Jlc3BfaWVfc3RhcnQgPj0gMCkgewotCQkJCXRmc3Jlc3BfaWVfbGVuID0gKHRmc3Jlc3BfaWVfZW5kICsKLQkJCQkJCSAgdGZzcmVzcF9pZV9lbmRbMV0gKyAyKSAtCi0JCQkJCXRmc3Jlc3BfaWVfc3RhcnQ7Ci0JCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJURlMgUmVzcCBJRShzKSBmb3VuZCIpOwotCQkJCS8qCi0JCQkJICogcGFzcyB0aGUgVEZTIFJlc3AgSUUocykgdG8gZHJpdmVyIGZvcgotCQkJCSAqIHByb2Nlc3NpbmcKLQkJCQkgKi8KLQkJCQlpZiAoaWVlZTgwMjExXzExX3NldF90ZnNfaWUoCi0JCQkJCSAgICB3cGFfcywgd3BhX3MtPmJzc2lkLAotCQkJCQkgICAgdGZzcmVzcF9pZV9zdGFydCwKLQkJCQkJICAgICZ0ZnNyZXNwX2llX2xlbiwKLQkJCQkJICAgIFdOTV9TTEVFUF9URlNfUkVTUF9JRV9TRVQpKQotCQkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkZhaWwgdG8gc2V0ICIKLQkJCQkJCSAgICJURlMgUmVzcCBJRSIpOwotCQkJfQotCQl9IGVsc2UgaWYgKHdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSA9PSAxKSB7Ci0JCQl3cGFfZHJ2X3dubV9vcGVyKHdwYV9zLCBXTk1fU0xFRVBfRVhJVF9DT05GSVJNLAotCQkJCQkgd3BhX3MtPmJzc2lkLCBOVUxMLCBOVUxMKTsKLQkJCS8qIEluc3RhbGwgR1RLL0lHVEsgKi8KLQkJCWRvIHsKLQkJCQkvKiBwb2ludCB0byBrZXkgZGF0YSBmaWVsZCAqLwotCQkJCXU4ICpwdHIgPSAodTggKikgZnJtICsgMSArIDEgKyAyOwotCQkJCXdoaWxlIChwdHIgPCAodTggKikgZnJtICsgNCArIGtleV9sZW5fdG90YWwpIHsKLQkJCQkJaWYgKCpwdHIgPT0gV05NX1NMRUVQX1NVQkVMRU1fR1RLKSB7Ci0JCQkJCQlndGtfbGVuID0gKihwdHIgKyA0KTsKLQkJCQkJCXdwYV93bm1zbGVlcF9pbnN0YWxsX2tleSgKLQkJCQkJCQl3cGFfcy0+d3BhLAotCQkJCQkJCVdOTV9TTEVFUF9TVUJFTEVNX0dUSywKLQkJCQkJCQlwdHIpOwotCQkJCQkJcHRyICs9IDEzICsgZ3RrX2xlbjsKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwotCQkJCQl9IGVsc2UgaWYgKCpwdHIgPT0KLQkJCQkJCSAgIFdOTV9TTEVFUF9TVUJFTEVNX0lHVEspIHsKLQkJCQkJCWlndGtfbGVuID0gV1BBX0lHVEtfTEVOOwotCQkJCQkJd3BhX3dubXNsZWVwX2luc3RhbGxfa2V5KAotCQkJCQkJCXdwYV9zLT53cGEsCi0JCQkJCQkJV05NX1NMRUVQX1NVQkVMRU1fSUdUSywKLQkJCQkJCQlwdHIpOwotCQkJCQkJcHRyICs9IDEwICsgV1BBX0lHVEtfTEVOOwotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCi0JCQkJCX0gZWxzZQotCQkJCQkJYnJlYWs7IC8qIHNraXAgdGhlIGxvb3AgKi8KLQkJCQl9Ci0JCQl9IHdoaWxlKDApOworCQlpZiAod25tc2xlZXBfaWUtPmFjdGlvbl90eXBlID09IFdOTV9TTEVFUF9NT0RFX0VOVEVSKSB7CisJCQl3bm1fc2xlZXBfbW9kZV9lbnRlcl9zdWNjZXNzKHdwYV9zLCB0ZnNyZXNwX2llX3N0YXJ0LAorCQkJCQkJICAgICB0ZnNyZXNwX2llX2VuZCk7CisJCX0gZWxzZSBpZiAod25tc2xlZXBfaWUtPmFjdGlvbl90eXBlID09IFdOTV9TTEVFUF9NT0RFX0VYSVQpIHsKKwkJCXdubV9zbGVlcF9tb2RlX2V4aXRfc3VjY2Vzcyh3cGFfcywgZnJtLCBrZXlfbGVuX3RvdGFsKTsKIAkJfQogCX0gZWxzZSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUmVqZWN0IHJlY3YgV05NLVNsZWVwIFJlc3BvbnNlIGZyYW1lICIKIAkJCSAgICIoYWN0aW9uPSVkLCBpbnR2YWw9JWQpIiwKIAkJCSAgIHdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSwgd25tc2xlZXBfaWUtPmludHZhbCk7Ci0JCWlmICh3bm1zbGVlcF9pZS0+YWN0aW9uX3R5cGUgPT0gMCkKKwkJaWYgKHdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSA9PSBXTk1fU0xFRVBfTU9ERV9FTlRFUikKIAkJCXdwYV9kcnZfd25tX29wZXIod3BhX3MsIFdOTV9TTEVFUF9FTlRFUl9GQUlMLAogCQkJCQkgd3BhX3MtPmJzc2lkLCBOVUxMLCBOVUxMKTsKLQkJZWxzZSBpZiAod25tc2xlZXBfaWUtPmFjdGlvbl90eXBlID09IDEpCisJCWVsc2UgaWYgKHdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSA9PSBXTk1fU0xFRVBfTU9ERV9FWElUKQogCQkJd3BhX2Rydl93bm1fb3Blcih3cGFfcywgV05NX1NMRUVQX0VYSVRfRkFJTCwKIAkJCQkJIHdwYV9zLT5ic3NpZCwgTlVMTCwgTlVMTCk7CiAJfQogfQogCiAKK3N0YXRpYyB2b2lkIHdubV9zZW5kX2Jzc190cmFuc2l0aW9uX21nbXRfcmVzcChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCQkgICAgICB1OCBkaWFsb2dfdG9rZW4sIHU4IHN0YXR1cywKKwkJCQkJICAgICAgdTggZGVsYXksIGNvbnN0IHU4ICp0YXJnZXRfYnNzaWQpCit7CisJdTggYnVmWzEwMDBdLCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKKwlzaXplX3QgbGVuOworCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IFNlbmQgQlNTIFRyYW5zaXRpb24gTWFuYWdlbWVudCBSZXNwb25zZSAiCisJCSAgICJ0byAiIE1BQ1NUUiAiIGRpYWxvZ190b2tlbj0ldSBzdGF0dXM9JXUgZGVsYXk9JWQiLAorCQkgICBNQUMyU1RSKHdwYV9zLT5ic3NpZCksIGRpYWxvZ190b2tlbiwgc3RhdHVzLCBkZWxheSk7CisKKwltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBidWY7CisJb3NfbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKwlvc19tZW1jcHkobWdtdC0+ZGEsIHdwYV9zLT5ic3NpZCwgRVRIX0FMRU4pOworCW9zX21lbWNweShtZ210LT5zYSwgd3BhX3MtPm93bl9hZGRyLCBFVEhfQUxFTik7CisJb3NfbWVtY3B5KG1nbXQtPmJzc2lkLCB3cGFfcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZ210LT5mcmFtZV9jb250cm9sID0gSUVFRTgwMjExX0ZDKFdMQU5fRkNfVFlQRV9NR01ULAorCQkJCQkgICBXTEFOX0ZDX1NUWVBFX0FDVElPTik7CisJbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPSBXTEFOX0FDVElPTl9XTk07CisJbWdtdC0+dS5hY3Rpb24udS5ic3NfdG1fcmVzcC5hY3Rpb24gPSBXTk1fQlNTX1RSQU5TX01HTVRfUkVTUDsKKwltZ210LT51LmFjdGlvbi51LmJzc190bV9yZXNwLmRpYWxvZ190b2tlbiA9IGRpYWxvZ190b2tlbjsKKwltZ210LT51LmFjdGlvbi51LmJzc190bV9yZXNwLnN0YXR1c19jb2RlID0gc3RhdHVzOworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3Jlc3AuYnNzX3Rlcm1pbmF0aW9uX2RlbGF5ID0gZGVsYXk7CisJcG9zID0gbWdtdC0+dS5hY3Rpb24udS5ic3NfdG1fcmVzcC52YXJpYWJsZTsKKwlpZiAodGFyZ2V0X2Jzc2lkKSB7CisJCW9zX21lbWNweShwb3MsIHRhcmdldF9ic3NpZCwgRVRIX0FMRU4pOworCQlwb3MgKz0gRVRIX0FMRU47CisJfQorCisJbGVuID0gcG9zIC0gKHU4ICopICZtZ210LT51LmFjdGlvbi5jYXRlZ29yeTsKKworCXdwYV9kcnZfc2VuZF9hY3Rpb24od3BhX3MsIHdwYV9zLT5hc3NvY19mcmVxLCAwLCB3cGFfcy0+YnNzaWQsCisJCQkgICAgd3BhX3MtPm93bl9hZGRyLCB3cGFfcy0+YnNzaWQsCisJCQkgICAgJm1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5LCBsZW4sIDApOworfQorCisKK3N0YXRpYyB2b2lkIGllZWU4MDJfMTFfcnhfYnNzX3RyYW5zX21nbXRfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJCSAgICAgY29uc3QgdTggKnBvcywgY29uc3QgdTggKmVuZCwKKwkJCQkJICAgICBpbnQgcmVwbHkpCit7CisJdTggZGlhbG9nX3Rva2VuOworCXU4IG1vZGU7CisJdTE2IGRpc2Fzc29jX3RpbWVyOworCisJaWYgKHBvcyArIDUgPiBlbmQpCisJCXJldHVybjsKKworCWRpYWxvZ190b2tlbiA9IHBvc1swXTsKKwltb2RlID0gcG9zWzFdOworCWRpc2Fzc29jX3RpbWVyID0gV1BBX0dFVF9MRTE2KHBvcyArIDIpOworCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IEJTUyBUcmFuc2l0aW9uIE1hbmFnZW1lbnQgUmVxdWVzdDogIgorCQkgICAiZGlhbG9nX3Rva2VuPSV1IHJlcXVlc3RfbW9kZT0weCV4ICIKKwkJICAgImRpc2Fzc29jX3RpbWVyPSV1IHZhbGlkaXR5X2ludGVydmFsPSV1IiwKKwkJICAgZGlhbG9nX3Rva2VuLCBtb2RlLCBkaXNhc3NvY190aW1lciwgcG9zWzRdKTsKKwlwb3MgKz0gNTsKKwlpZiAobW9kZSAmIDB4MDgpCisJCXBvcyArPSAxMjsgLyogQlNTIFRlcm1pbmF0aW9uIER1cmF0aW9uICovCisJaWYgKG1vZGUgJiAweDEwKSB7CisJCWNoYXIgdXJsWzI1Nl07CisJCWlmIChwb3MgKyAxID4gZW5kIHx8IHBvcyArIDEgKyBwb3NbMF0gPiBlbmQpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBJbnZhbGlkIEJTUyBUcmFuc2l0aW9uICIKKwkJCQkgICAiTWFuYWdlbWVudCBSZXF1ZXN0IChVUkwpIik7CisJCQlyZXR1cm47CisJCX0KKwkJb3NfbWVtY3B5KHVybCwgcG9zICsgMSwgcG9zWzBdKTsKKwkJdXJsW3Bvc1swXV0gPSAnXDAnOworCQl3cGFfbXNnKHdwYV9zLCBNU0dfSU5GTywgIldOTTogRVNTIERpc2Fzc29jaWF0aW9uIEltbWluZW50IC0gIgorCQkJInNlc3Npb25faW5mb191cmw9JXMiLCB1cmwpOworCX0KKworCWlmIChtb2RlICYgMHgwNCkgeworCQl3cGFfbXNnKHdwYV9zLCBNU0dfSU5GTywgIldOTTogRGlzYXNzb2NpYXRpb24gSW1taW5lbnQgLSAiCisJCQkiRGlzYXNzb2NpYXRpb24gVGltZXIgJXUiLCBkaXNhc3NvY190aW1lcik7CisJCWlmIChkaXNhc3NvY190aW1lciAmJiAhd3BhX3MtPnNjYW5uaW5nKSB7CisJCQkvKiBUT0RPOiBtYXJrIGN1cnJlbnQgQlNTIGxlc3MgcHJlZmVycmVkIGZvcgorCQkJICogc2VsZWN0aW9uICovCisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlRyeWluZyB0byBmaW5kIGFub3RoZXIgQlNTIik7CisJCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7CisJCX0KKwl9CisKKwlpZiAocmVwbHkpIHsKKwkJLyogVE9ETzogYWRkIHN1cHBvcnQgZm9yIHJlcG9ydGluZyBBY2NlcHQgKi8KKwkJd25tX3NlbmRfYnNzX3RyYW5zaXRpb25fbWdtdF9yZXNwKHdwYV9zLCBkaWFsb2dfdG9rZW4sCisJCQkJCQkgIDEgLyogUmVqZWN0IC0gdW5zcGVjaWZpZWQgKi8sCisJCQkJCQkgIDAsIE5VTEwpOworCX0KK30KKworCiB2b2lkIGllZWU4MDJfMTFfcnhfd25tX2FjdGlvbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJICAgICAgc3RydWN0IHJ4X2FjdGlvbiAqYWN0aW9uKQogewotCXU4ICpwb3MgPSAodTggKikgYWN0aW9uLT5kYXRhOyAvKiBwb2ludCB0byBhY3Rpb24gZmllbGQgKi8KLQl1OCBhY3QgPSAqcG9zKys7Ci0JLyogdTggZGlhbG9nX3Rva2VuID0gKnBvcysrOyAqLworCWNvbnN0IHU4ICpwb3MsICplbmQ7CisJdTggYWN0OworCisJaWYgKGFjdGlvbi0+ZGF0YSA9PSBOVUxMIHx8IGFjdGlvbi0+bGVuID09IDApCisJCXJldHVybjsKKworCXBvcyA9IGFjdGlvbi0+ZGF0YTsKKwllbmQgPSBwb3MgKyBhY3Rpb24tPmxlbjsKKwlhY3QgPSAqcG9zKys7CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogUlggYWN0aW9uICV1IGZyb20gIiBNQUNTVFIsCisJCSAgIGFjdCwgTUFDMlNUUihhY3Rpb24tPnNhKSk7CisJaWYgKHdwYV9zLT53cGFfc3RhdGUgPCBXUEFfQVNTT0NJQVRFRCB8fAorCSAgICBvc19tZW1jbXAoYWN0aW9uLT5zYSwgd3BhX3MtPmJzc2lkLCBFVEhfQUxFTikgIT0gMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogSWdub3JlIHVuZXhwZWN0ZWQgV05NIEFjdGlvbiAiCisJCQkgICAiZnJhbWUiKTsKKwkJcmV0dXJuOworCX0KIAogCXN3aXRjaCAoYWN0KSB7CisJY2FzZSBXTk1fQlNTX1RSQU5TX01HTVRfUkVROgorCQlpZWVlODAyXzExX3J4X2Jzc190cmFuc19tZ210X3JlcSh3cGFfcywgcG9zLCBlbmQsCisJCQkJCQkgIShhY3Rpb24tPmRhWzBdICYgMHgwMSkpOworCQlicmVhazsKIAljYXNlIFdOTV9TTEVFUF9NT0RFX1JFU1A6CiAJCWllZWU4MDJfMTFfcnhfd25tc2xlZXBfcmVzcCh3cGFfcywgYWN0aW9uLT5kYXRhLCBhY3Rpb24tPmxlbik7CiAJCWJyZWFrOwpAQCAtMjQ0LDUgKzQyMSwzIEBACiAJCWJyZWFrOwogCX0KIH0KLQotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC93bm1fc3RhLmggYi93cGFfc3VwcGxpY2FudC93bm1fc3RhLmgKaW5kZXggYmEyNTM1Yi4uM2Y5ZDg4YiAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvd25tX3N0YS5oCisrKyBiL3dwYV9zdXBwbGljYW50L3dubV9zdGEuaApAQCAtMTMsNyArMTMsNyBAQAogc3RydWN0IHdwYV9zdXBwbGljYW50OwogCiBpbnQgaWVlZTgwMl8xMV9zZW5kX3dubXNsZWVwX3JlcShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAotCQkJCSB1OCBhY3Rpb24sIHU4IGludHZhbCk7CisJCQkJIHU4IGFjdGlvbiwgdTE2IGludHZhbCwgc3RydWN0IHdwYWJ1ZiAqdGZzX3JlcSk7CiAKIHZvaWQgaWVlZTgwMl8xMV9yeF93bm1fYWN0aW9uKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkgICAgICBzdHJ1Y3QgcnhfYWN0aW9uICphY3Rpb24pOwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvd3BhX2NsaS5jIGIvd3BhX3N1cHBsaWNhbnQvd3BhX2NsaS5jCmluZGV4IDM5ODZiOWIuLjA2MzBhNGIgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3dwYV9jbGkuYworKysgYi93cGFfc3VwcGxpY2FudC93cGFfY2xpLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKndwYV9jbGlfdmVyc2lvbiA9CiAid3BhX2NsaSB2IiBWRVJTSU9OX1NUUiAiXG4iCi0iQ29weXJpZ2h0IChjKSAyMDA0LTIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+IGFuZCBjb250cmlidXRvcnMiOworIkNvcHlyaWdodCAoYykgMjAwNC0yMDEzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiBhbmQgY29udHJpYnV0b3JzIjsKIAogCiBzdGF0aWMgY29uc3QgY2hhciAqd3BhX2NsaV9saWNlbnNlID0KQEAgLTc2MiwyNiArNzYyLDYgQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX1dQU19PT0IKLXN0YXRpYyBpbnQgd3BhX2NsaV9jbWRfd3BzX29vYihzdHJ1Y3Qgd3BhX2N0cmwgKmN0cmwsIGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0JaWYgKGFyZ2MgIT0gMyAmJiBhcmdjICE9IDQpIHsKLQkJcHJpbnRmKCJJbnZhbGlkIFdQU19PT0IgY29tbWFuZDogbmVlZCB0aHJlZSBvciBmb3VyICIKLQkJICAgICAgICJhcmd1bWVudHM6XG4iCi0JCSAgICAgICAiLSBERVZfVFlQRTogdXNlICd1ZmQnIG9yICduZmMnXG4iCi0JCSAgICAgICAiLSBQQVRIOiBwYXRoIG9mIE9PQiBkZXZpY2UgbGlrZSAnL21udCdcbiIKLQkJICAgICAgICItIE1FVEhPRDogT09CIG1ldGhvZCAncGluLWUnIG9yICdwaW4tcicsICIKLQkJICAgICAgICInY3JlZCdcbiIKLQkJICAgICAgICItIERFVl9OQU1FOiAob25seSBmb3IgTkZDKSBkZXZpY2UgbmFtZSBsaWtlICIKLQkJICAgICAgICIncG41MzEnXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiB3cGFfY2xpX2NtZChjdHJsLCAiV1BTX09PQiIsIDMsIGFyZ2MsIGFyZ3YpOwotfQotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCi0KLQogI2lmZGVmIENPTkZJR19XUFNfTkZDCiAKIHN0YXRpYyBpbnQgd3BhX2NsaV9jbWRfd3BzX25mYyhzdHJ1Y3Qgd3BhX2N0cmwgKmN0cmwsIGludCBhcmdjLCBjaGFyICphcmd2W10pCkBAIC03OTAsNiArNzcwLDEzIEBACiB9CiAKIAorc3RhdGljIGludCB3cGFfY2xpX2NtZF93cHNfbmZjX2NvbmZpZ190b2tlbihzdHJ1Y3Qgd3BhX2N0cmwgKmN0cmwsIGludCBhcmdjLAorCQkJCQkgICAgY2hhciAqYXJndltdKQoreworCXJldHVybiB3cGFfY2xpX2NtZChjdHJsLCAiV1BTX05GQ19DT05GSUdfVE9LRU4iLCAxLCBhcmdjLCBhcmd2KTsKK30KKworCiBzdGF0aWMgaW50IHdwYV9jbGlfY21kX3dwc19uZmNfdG9rZW4oc3RydWN0IHdwYV9jdHJsICpjdHJsLCBpbnQgYXJnYywKIAkJCQkgICAgIGNoYXIgKmFyZ3ZbXSkKIHsKQEAgLTgyMiw2ICs4MDksNzkgQEAKIAlyZXR1cm4gcmV0OwogfQogCisKK3N0YXRpYyBpbnQgd3BhX2NsaV9jbWRfbmZjX2dldF9oYW5kb3Zlcl9yZXEoc3RydWN0IHdwYV9jdHJsICpjdHJsLCBpbnQgYXJnYywKKwkJCQkJICAgIGNoYXIgKmFyZ3ZbXSkKK3sKKwlyZXR1cm4gd3BhX2NsaV9jbWQoY3RybCwgIk5GQ19HRVRfSEFORE9WRVJfUkVRIiwgMiwgYXJnYywgYXJndik7Cit9CisKKworc3RhdGljIGludCB3cGFfY2xpX2NtZF9uZmNfZ2V0X2hhbmRvdmVyX3NlbChzdHJ1Y3Qgd3BhX2N0cmwgKmN0cmwsIGludCBhcmdjLAorCQkJCQkgICAgY2hhciAqYXJndltdKQoreworCXJldHVybiB3cGFfY2xpX2NtZChjdHJsLCAiTkZDX0dFVF9IQU5ET1ZFUl9TRUwiLCAyLCBhcmdjLCBhcmd2KTsKK30KKworCitzdGF0aWMgaW50IHdwYV9jbGlfY21kX25mY19yeF9oYW5kb3Zlcl9yZXEoc3RydWN0IHdwYV9jdHJsICpjdHJsLCBpbnQgYXJnYywKKwkJCQkJICAgY2hhciAqYXJndltdKQoreworCWludCByZXQ7CisJY2hhciAqYnVmOworCXNpemVfdCBidWZsZW47CisKKwlpZiAoYXJnYyAhPSAxKSB7CisJCXByaW50ZigiSW52YWxpZCAnbmZjX3J4X2hhbmRvdmVyX3JlcScgY29tbWFuZCAtIG9uZSBhcmd1bWVudCAiCisJCSAgICAgICAiaXMgcmVxdWlyZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJ1ZmxlbiA9IDIxICsgb3Nfc3RybGVuKGFyZ3ZbMF0pOworCWJ1ZiA9IG9zX21hbGxvYyhidWZsZW4pOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCW9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiTkZDX1JYX0hBTkRPVkVSX1JFUSAlcyIsIGFyZ3ZbMF0pOworCisJcmV0ID0gd3BhX2N0cmxfY29tbWFuZChjdHJsLCBidWYpOworCW9zX2ZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCB3cGFfY2xpX2NtZF9uZmNfcnhfaGFuZG92ZXJfc2VsKHN0cnVjdCB3cGFfY3RybCAqY3RybCwgaW50IGFyZ2MsCisJCQkJCSAgIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgcmV0OworCWNoYXIgKmJ1ZjsKKwlzaXplX3QgYnVmbGVuOworCisJaWYgKGFyZ2MgIT0gMSkgeworCQlwcmludGYoIkludmFsaWQgJ25mY19yeF9oYW5kb3Zlcl9zZWwnIGNvbW1hbmQgLSBvbmUgYXJndW1lbnQgIgorCQkgICAgICAgImlzIHJlcXVpcmVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlidWZsZW4gPSAyMSArIG9zX3N0cmxlbihhcmd2WzBdKTsKKwlidWYgPSBvc19tYWxsb2MoYnVmbGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlvc19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIk5GQ19SWF9IQU5ET1ZFUl9TRUwgJXMiLCBhcmd2WzBdKTsKKworCXJldCA9IHdwYV9jdHJsX2NvbW1hbmQoY3RybCwgYnVmKTsKKwlvc19mcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgd3BhX2NsaV9jbWRfbmZjX3JlcG9ydF9oYW5kb3ZlcihzdHJ1Y3Qgd3BhX2N0cmwgKmN0cmwsIGludCBhcmdjLAorCQkJCQkgICBjaGFyICphcmd2W10pCit7CisJcmV0dXJuIHdwYV9jbGlfY21kKGN0cmwsICJORkNfUkVQT1JUX0hBTkRPVkVSIiwgNCwgYXJnYywgYXJndik7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfV1BTX05GQyAqLwogCiAKQEAgLTEzMzAsNyArMTM5MCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChhcmdjICE9IDMpIHsKKwlpZiAoYXJnYyA8IDMpIHsKIAkJcHJpbnRmKCJJbnZhbGlkIFNFVF9ORVRXT1JLIGNvbW1hbmQ6IG5lZWRzIHRocmVlIGFyZ3VtZW50c1xuIgogCQkgICAgICAgIihuZXR3b3JrIGlkLCB2YXJpYWJsZSBuYW1lLCBhbmQgdmFsdWUpXG4iKTsKIAkJcmV0dXJuIC0xOwpAQCAtMTQxMyw3ICsxNDczLDcgQEAKIAogc3RhdGljIGludCB3cGFfY2xpX2NtZF9zY2FuKHN0cnVjdCB3cGFfY3RybCAqY3RybCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKLQlyZXR1cm4gd3BhX2N0cmxfY29tbWFuZChjdHJsLCAiU0NBTiIpOworCXJldHVybiB3cGFfY2xpX2NtZChjdHJsLCAiU0NBTiIsIDAsIGFyZ2MsIGFyZ3YpOwogfQogCiAKQEAgLTIyMjcsNiArMjI4NywxNiBAQAogI2VuZGlmIC8qIENPTkZJR19BVVRPU0NBTiAqLwogCiAKKyNpZmRlZiBDT05GSUdfV05NCisKK3N0YXRpYyBpbnQgd3BhX2NsaV9jbWRfd25tX3NsZWVwKHN0cnVjdCB3cGFfY3RybCAqY3RybCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlyZXR1cm4gd3BhX2NsaV9jbWQoY3RybCwgIldOTV9TTEVFUCIsIDAsIGFyZ2MsIGFyZ3YpOworfQorCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLworCisKIHN0YXRpYyBpbnQgd3BhX2NsaV9jbWRfcmF3KHN0cnVjdCB3cGFfY3RybCAqY3RybCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpZiAoYXJnYyA9PSAwKQpAQCAtMjQ2OSwyMSArMjUzOSwzNSBAQAogCSAgIjxQSU4+ID0gdmVyaWZ5IFBJTiBjaGVja3N1bSIgfSwKIAl7ICJ3cHNfY2FuY2VsIiwgd3BhX2NsaV9jbWRfd3BzX2NhbmNlbCwgTlVMTCwgY2xpX2NtZF9mbGFnX25vbmUsCiAJICAiQ2FuY2VscyB0aGUgcGVuZGluZyBXUFMgb3BlcmF0aW9uIiB9LAotI2lmZGVmIENPTkZJR19XUFNfT09CCi0JeyAid3BzX29vYiIsIHdwYV9jbGlfY21kX3dwc19vb2IsIE5VTEwsCi0JICBjbGlfY21kX2ZsYWdfc2Vuc2l0aXZlLAotCSAgIjxERVZfVFlQRT4gPFBBVEg+IDxNRVRIT0Q+IFtERVZfTkFNRV0gPSBzdGFydCBXUFMgT09CIiB9LAotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKIAl7ICJ3cHNfbmZjIiwgd3BhX2NsaV9jbWRfd3BzX25mYywgd3BhX2NsaV9jb21wbGV0ZV9ic3MsCiAJICBjbGlfY21kX2ZsYWdfbm9uZSwKIAkgICJbQlNTSURdID0gc3RhcnQgV2ktRmkgUHJvdGVjdGVkIFNldHVwOiBORkMiIH0sCisJeyAid3BzX25mY19jb25maWdfdG9rZW4iLCB3cGFfY2xpX2NtZF93cHNfbmZjX2NvbmZpZ190b2tlbiwgTlVMTCwKKwkgIGNsaV9jbWRfZmxhZ19ub25lLAorCSAgIjxXUFN8TkRFRj4gPSBidWlsZCBjb25maWd1cmF0aW9uIHRva2VuIiB9LAogCXsgIndwc19uZmNfdG9rZW4iLCB3cGFfY2xpX2NtZF93cHNfbmZjX3Rva2VuLCBOVUxMLAogCSAgY2xpX2NtZF9mbGFnX25vbmUsCiAJICAiPFdQU3xOREVGPiA9IGNyZWF0ZSBwYXNzd29yZCB0b2tlbiIgfSwKIAl7ICJ3cHNfbmZjX3RhZ19yZWFkIiwgd3BhX2NsaV9jbWRfd3BzX25mY190YWdfcmVhZCwgTlVMTCwKIAkgIGNsaV9jbWRfZmxhZ19zZW5zaXRpdmUsCiAJICAiPGhleGR1bXAgb2YgcGF5bG9hZD4gPSByZXBvcnQgcmVhZCBORkMgdGFnIHdpdGggV1BTIGRhdGEiIH0sCisJeyAibmZjX2dldF9oYW5kb3Zlcl9yZXEiLCB3cGFfY2xpX2NtZF9uZmNfZ2V0X2hhbmRvdmVyX3JlcSwgTlVMTCwKKwkgIGNsaV9jbWRfZmxhZ19ub25lLAorCSAgIjxOREVGPiA8V1BTPiA9IGNyZWF0ZSBORkMgaGFuZG92ZXIgcmVxdWVzdCIgfSwKKwl7ICJuZmNfZ2V0X2hhbmRvdmVyX3NlbCIsIHdwYV9jbGlfY21kX25mY19nZXRfaGFuZG92ZXJfc2VsLCBOVUxMLAorCSAgY2xpX2NtZF9mbGFnX25vbmUsCisJICAiPE5ERUY+IDxXUFM+ID0gY3JlYXRlIE5GQyBoYW5kb3ZlciBzZWxlY3QiIH0sCisJeyAibmZjX3J4X2hhbmRvdmVyX3JlcSIsIHdwYV9jbGlfY21kX25mY19yeF9oYW5kb3Zlcl9yZXEsIE5VTEwsCisJICBjbGlfY21kX2ZsYWdfbm9uZSwKKwkgICI8aGV4ZHVtcCBvZiBwYXlsb2FkPiA9IHJlcG9ydCByZWNlaXZlZCBORkMgaGFuZG92ZXIgcmVxdWVzdCIgfSwKKwl7ICJuZmNfcnhfaGFuZG92ZXJfc2VsIiwgd3BhX2NsaV9jbWRfbmZjX3J4X2hhbmRvdmVyX3NlbCwgTlVMTCwKKwkgIGNsaV9jbWRfZmxhZ19ub25lLAorCSAgIjxoZXhkdW1wIG9mIHBheWxvYWQ+ID0gcmVwb3J0IHJlY2VpdmVkIE5GQyBoYW5kb3ZlciBzZWxlY3QiIH0sCisJeyAibmZjX3JlcG9ydF9oYW5kb3ZlciIsIHdwYV9jbGlfY21kX25mY19yZXBvcnRfaGFuZG92ZXIsIE5VTEwsCisJICBjbGlfY21kX2ZsYWdfbm9uZSwKKwkgICI8cm9sZT4gPHR5cGU+IDxoZXhkdW1wIG9mIHJlcT4gPGhleGR1bXAgb2Ygc2VsPiA9IHJlcG9ydCBjb21wbGV0ZWQgIgorCSAgIk5GQyBoYW5kb3ZlciIgfSwKICNlbmRpZiAvKiBDT05GSUdfV1BTX05GQyAqLwogCXsgIndwc19yZWciLCB3cGFfY2xpX2NtZF93cHNfcmVnLCB3cGFfY2xpX2NvbXBsZXRlX2JzcywKIAkgIGNsaV9jbWRfZmxhZ19zZW5zaXRpdmUsCkBAIC0yNjg0LDYgKzI3NjgsMTAgQEAKIAl7ICJhdXRvc2NhbiIsIHdwYV9jbGlfY21kX2F1dG9zY2FuLCBOVUxMLCBjbGlfY21kX2ZsYWdfbm9uZSwKIAkgICJbcGFyYW1zXSA9IFNldCBvciB1bnNldCAoaWYgbm9uZSkgYXV0b3NjYW4gcGFyYW1ldGVycyIgfSwKICNlbmRpZiAvKiBDT05GSUdfQVVUT1NDQU4gKi8KKyNpZmRlZiBDT05GSUdfV05NCisJeyAid25tX3NsZWVwIiwgd3BhX2NsaV9jbWRfd25tX3NsZWVwLCBOVUxMLCBjbGlfY21kX2ZsYWdfbm9uZSwKKwkgICI8ZW50ZXIvZXhpdD4gW2ludGVydmFsPSNdID0gZW50ZXIvZXhpdCBXTk0tU2xlZXAgbW9kZSIgfSwKKyNlbmRpZiAvKiBDT05GSUdfV05NICovCiAJeyAicmF3Iiwgd3BhX2NsaV9jbWRfcmF3LCBOVUxMLCBjbGlfY21kX2ZsYWdfc2Vuc2l0aXZlLAogCSAgIjxwYXJhbXMuLj4gPSBTZW50IHVucHJvY2Vzc2VkIGNvbW1hbmQiIH0sCiAjaWZkZWYgQU5EUk9JRApkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvd3BhX2d1aS1xdDQvd3BhZ3VpLmNwcCBiL3dwYV9zdXBwbGljYW50L3dwYV9ndWktcXQ0L3dwYWd1aS5jcHAKaW5kZXggNDJlMTRmMC4uNmJiYThkMiAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvd3BhX2d1aS1xdDQvd3BhZ3VpLmNwcAorKysgYi93cGFfc3VwcGxpY2FudC93cGFfZ3VpLXF0NC93cGFndWkuY3BwCkBAIC03MDksNyArNzA5LDcgQEAKIHZvaWQgV3BhR3VpOjpoZWxwQWJvdXQoKQogewogCVFNZXNzYWdlQm94OjphYm91dCh0aGlzLCAid3BhX2d1aSBmb3Igd3BhX3N1cHBsaWNhbnQiLAotCQkJICAgIkNvcHlyaWdodCAoYykgMjAwMy0yMDEyLFxuIgorCQkJICAgIkNvcHlyaWdodCAoYykgMjAwMy0yMDEzLFxuIgogCQkJICAgIkpvdW5pIE1hbGluZW4gPGpAdzEuZmk+XG4iCiAJCQkgICAiYW5kIGNvbnRyaWJ1dG9ycy5cbiIKIAkJCSAgICJcbiIKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50LmMgYi93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudC5jCmluZGV4IGQ4ZjNjNDQuLmE5YWYyZDYgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50LmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnQuYwpAQCAtNTIsNyArNTIsNyBAQAogCiBjb25zdCBjaGFyICp3cGFfc3VwcGxpY2FudF92ZXJzaW9uID0KICJ3cGFfc3VwcGxpY2FudCB2IiBWRVJTSU9OX1NUUiAiXG4iCi0iQ29weXJpZ2h0IChjKSAyMDAzLTIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+IGFuZCBjb250cmlidXRvcnMiOworIkNvcHlyaWdodCAoYykgMjAwMy0yMDEzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiBhbmQgY29udHJpYnV0b3JzIjsKIAogY29uc3QgY2hhciAqd3BhX3N1cHBsaWNhbnRfbGljZW5zZSA9CiAiVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS5cbiIKQEAgLTE5MCw3ICsxOTAsNyBAQAogCQlNQUMyU1RSKGJzc2lkKSk7CiAJd3BhX2JsYWNrbGlzdF9hZGQod3BhX3MsIGJzc2lkKTsKIAl3cGFfc21fbm90aWZ5X2Rpc2Fzc29jKHdwYV9zLT53cGEpOwotCXdwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZSh3cGFfcywgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOworCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKHdwYV9zLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CiAJd3BhX3MtPnJlYXNzb2NpYXRlID0gMTsKIAogCS8qCkBAIC00NzAsNiArNDcwLDExIEBACiAJb3NfZnJlZSh3cGFfcy0+YnNzaWRfZmlsdGVyKTsKIAl3cGFfcy0+YnNzaWRfZmlsdGVyID0gTlVMTDsKIAorCW9zX2ZyZWUod3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZCk7CisJd3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZCA9IE5VTEw7CisJb3NfZnJlZSh3cGFfcy0+ZGlzYWxsb3dfYXBzX3NzaWQpOworCXdwYV9zLT5kaXNhbGxvd19hcHNfc3NpZCA9IE5VTEw7CisKIAl3bm1fYnNzX2tlZXBfYWxpdmVfZGVpbml0KHdwYV9zKTsKIAogCWV4dF9wYXNzd29yZF9kZWluaXQod3BhX3MtPmV4dF9wdyk7CkBAIC02NTksMTUgKzY2NCwxNCBAQAogI2lmIGRlZmluZWQoQ09ORklHX0NUUkxfSUZBQ0UpIHx8ICFkZWZpbmVkKENPTkZJR19OT19TVERPVVRfREVCVUcpCiAJCXN0cnVjdCB3cGFfc3NpZCAqc3NpZCA9IHdwYV9zLT5jdXJyZW50X3NzaWQ7CiAJCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCBXUEFfRVZFTlRfQ09OTkVDVEVEICItIENvbm5lY3Rpb24gdG8gIgotCQkJTUFDU1RSICIgY29tcGxldGVkICVzIFtpZD0lZCBpZF9zdHI9JXNdIiwKLQkJCU1BQzJTVFIod3BhX3MtPmJzc2lkKSwgd3BhX3MtPnJlYXNzb2NpYXRlZF9jb25uZWN0aW9uID8KLQkJCSIocmVhdXRoKSIgOiAiKGF1dGgpIiwKKwkJCU1BQ1NUUiAiIGNvbXBsZXRlZCAoYXV0aCkgW2lkPSVkIGlkX3N0cj0lc10iLAorCQkJTUFDMlNUUih3cGFfcy0+YnNzaWQpLAogCQkJc3NpZCA/IHNzaWQtPmlkIDogLTEsCiAJCQlzc2lkICYmIHNzaWQtPmlkX3N0ciA/IHNzaWQtPmlkX3N0ciA6ICIiKTsKICNlbmRpZiAvKiBDT05GSUdfQ1RSTF9JRkFDRSB8fCAhQ09ORklHX05PX1NURE9VVF9ERUJVRyAqLwogCQl3cGFzX2NsZWFyX3RlbXBfZGlzYWJsZWQod3BhX3MsIHNzaWQsIDEpOworCQl3cGFfcy0+ZXh0cmFfYmxhY2tsaXN0X2NvdW50ID0gMDsKIAkJd3BhX3MtPm5ld19jb25uZWN0aW9uID0gMDsKLQkJd3BhX3MtPnJlYXNzb2NpYXRlZF9jb25uZWN0aW9uID0gMTsKIAkJd3BhX2Rydl9zZXRfb3BlcnN0YXRlKHdwYV9zLCAxKTsKICNpZm5kZWYgSUVFRTgwMjFYX0VBUE9MCiAJCXdwYV9kcnZfc2V0X3N1cHBfcG9ydCh3cGFfcywgMSk7CkBAIC04NDcsMjYgKzg1MSw2IEBACiB9CiAKIAotZW51bSB3cGFfY2lwaGVyIGNpcGhlcl9zdWl0ZTJkcml2ZXIoaW50IGNpcGhlcikKLXsKLQlzd2l0Y2ggKGNpcGhlcikgewotCWNhc2UgV1BBX0NJUEhFUl9OT05FOgotCQlyZXR1cm4gQ0lQSEVSX05PTkU7Ci0JY2FzZSBXUEFfQ0lQSEVSX1dFUDQwOgotCQlyZXR1cm4gQ0lQSEVSX1dFUDQwOwotCWNhc2UgV1BBX0NJUEhFUl9XRVAxMDQ6Ci0JCXJldHVybiBDSVBIRVJfV0VQMTA0OwotCWNhc2UgV1BBX0NJUEhFUl9DQ01QOgotCQlyZXR1cm4gQ0lQSEVSX0NDTVA7Ci0JY2FzZSBXUEFfQ0lQSEVSX0dDTVA6Ci0JCXJldHVybiBDSVBIRVJfR0NNUDsKLQljYXNlIFdQQV9DSVBIRVJfVEtJUDoKLQlkZWZhdWx0OgotCQlyZXR1cm4gQ0lQSEVSX1RLSVA7Ci0JfQotfQotCi0KIGVudW0gd3BhX2tleV9tZ210IGtleV9tZ210MmRyaXZlcihpbnQga2V5X21nbXQpCiB7CiAJc3dpdGNoIChrZXlfbWdtdCkgewpAQCAtOTMxLDcgKzkxNSw5IEBACiAKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwogCWlmICghKGllLT5jYXBhYmlsaXRpZXMgJiBXUEFfQ0FQQUJJTElUWV9NRlBDKSAmJgotCSAgICBzc2lkLT5pZWVlODAyMTF3ID09IE1HTVRfRlJBTUVfUFJPVEVDVElPTl9SRVFVSVJFRCkgeworCSAgICAoc3NpZC0+aWVlZTgwMjExdyA9PSBNR01UX0ZSQU1FX1BST1RFQ1RJT05fREVGQVVMVCA/CisJICAgICB3cGFfcy0+Y29uZi0+cG1mIDogc3NpZC0+aWVlZTgwMjExdykgPT0KKwkgICAgTUdNVF9GUkFNRV9QUk9URUNUSU9OX1JFUVVJUkVEKSB7CiAJCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCAiV1BBOiBEcml2ZXIgYXNzb2NpYXRlZCB3aXRoIGFuIEFQICIKIAkJCSJ0aGF0IGRvZXMgbm90IHN1cHBvcnQgbWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIC0gIgogCQkJInJlamVjdCIpOwpAQCAtMTAzMyw0NyArMTAxOSwzMCBAQAogCX0KIAogCXNlbCA9IGllLmdyb3VwX2NpcGhlciAmIHNzaWQtPmdyb3VwX2NpcGhlcjsKLQlpZiAoc2VsICYgV1BBX0NJUEhFUl9DQ01QKSB7Ci0JCXdwYV9zLT5ncm91cF9jaXBoZXIgPSBXUEFfQ0lQSEVSX0NDTVA7Ci0JCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIldQQTogdXNpbmcgR1RLIENDTVAiKTsKLQl9IGVsc2UgaWYgKHNlbCAmIFdQQV9DSVBIRVJfR0NNUCkgewotCQl3cGFfcy0+Z3JvdXBfY2lwaGVyID0gV1BBX0NJUEhFUl9HQ01QOwotCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJXUEE6IHVzaW5nIEdUSyBHQ01QIik7Ci0JfSBlbHNlIGlmIChzZWwgJiBXUEFfQ0lQSEVSX1RLSVApIHsKLQkJd3BhX3MtPmdyb3VwX2NpcGhlciA9IFdQQV9DSVBIRVJfVEtJUDsKLQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiV1BBOiB1c2luZyBHVEsgVEtJUCIpOwotCX0gZWxzZSBpZiAoc2VsICYgV1BBX0NJUEhFUl9XRVAxMDQpIHsKLQkJd3BhX3MtPmdyb3VwX2NpcGhlciA9IFdQQV9DSVBIRVJfV0VQMTA0OwotCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJXUEE6IHVzaW5nIEdUSyBXRVAxMDQiKTsKLQl9IGVsc2UgaWYgKHNlbCAmIFdQQV9DSVBIRVJfV0VQNDApIHsKLQkJd3BhX3MtPmdyb3VwX2NpcGhlciA9IFdQQV9DSVBIRVJfV0VQNDA7Ci0JCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIldQQTogdXNpbmcgR1RLIFdFUDQwIik7Ci0JfSBlbHNlIHsKKwl3cGFfcy0+Z3JvdXBfY2lwaGVyID0gd3BhX3BpY2tfZ3JvdXBfY2lwaGVyKHNlbCk7CisJaWYgKHdwYV9zLT5ncm91cF9jaXBoZXIgPCAwKSB7CiAJCXdwYV9tc2cod3BhX3MsIE1TR19XQVJOSU5HLCAiV1BBOiBGYWlsZWQgdG8gc2VsZWN0IGdyb3VwICIKIAkJCSJjaXBoZXIiKTsKIAkJcmV0dXJuIC0xOwogCX0KKwl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJXUEE6IHVzaW5nIEdUSyAlcyIsCisJCXdwYV9jaXBoZXJfdHh0KHdwYV9zLT5ncm91cF9jaXBoZXIpKTsKIAogCXNlbCA9IGllLnBhaXJ3aXNlX2NpcGhlciAmIHNzaWQtPnBhaXJ3aXNlX2NpcGhlcjsKLQlpZiAoc2VsICYgV1BBX0NJUEhFUl9DQ01QKSB7Ci0JCXdwYV9zLT5wYWlyd2lzZV9jaXBoZXIgPSBXUEFfQ0lQSEVSX0NDTVA7Ci0JCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIldQQTogdXNpbmcgUFRLIENDTVAiKTsKLQl9IGVsc2UgaWYgKHNlbCAmIFdQQV9DSVBIRVJfR0NNUCkgewotCQl3cGFfcy0+cGFpcndpc2VfY2lwaGVyID0gV1BBX0NJUEhFUl9HQ01QOwotCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJXUEE6IHVzaW5nIFBUSyBHQ01QIik7Ci0JfSBlbHNlIGlmIChzZWwgJiBXUEFfQ0lQSEVSX1RLSVApIHsKLQkJd3BhX3MtPnBhaXJ3aXNlX2NpcGhlciA9IFdQQV9DSVBIRVJfVEtJUDsKLQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiV1BBOiB1c2luZyBQVEsgVEtJUCIpOwotCX0gZWxzZSBpZiAoc2VsICYgV1BBX0NJUEhFUl9OT05FKSB7Ci0JCXdwYV9zLT5wYWlyd2lzZV9jaXBoZXIgPSBXUEFfQ0lQSEVSX05PTkU7Ci0JCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIldQQTogdXNpbmcgUFRLIE5PTkUiKTsKLQl9IGVsc2UgeworCXdwYV9zLT5wYWlyd2lzZV9jaXBoZXIgPSB3cGFfcGlja19wYWlyd2lzZV9jaXBoZXIoc2VsLCAxKTsKKwlpZiAod3BhX3MtPnBhaXJ3aXNlX2NpcGhlciA8IDApIHsKIAkJd3BhX21zZyh3cGFfcywgTVNHX1dBUk5JTkcsICJXUEE6IEZhaWxlZCB0byBzZWxlY3QgcGFpcndpc2UgIgogCQkJImNpcGhlciIpOwogCQlyZXR1cm4gLTE7CiAJfQorCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIldQQTogdXNpbmcgUFRLICVzIiwKKwkJd3BhX2NpcGhlcl90eHQod3BhX3MtPnBhaXJ3aXNlX2NpcGhlcikpOwogCiAJc2VsID0gaWUua2V5X21nbXQgJiBzc2lkLT5rZXlfbWdtdDsKKyNpZmRlZiBDT05GSUdfU0FFCisJaWYgKCEod3BhX3MtPmRydl9mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfU0FFKSkKKwkJc2VsICY9IH4oV1BBX0tFWV9NR01UX1NBRSB8IFdQQV9LRVlfTUdNVF9GVF9TQUUpOworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KIAlpZiAoMCkgewogI2lmZGVmIENPTkZJR19JRUVFODAyMTFSCiAJfSBlbHNlIGlmIChzZWwgJiBXUEFfS0VZX01HTVRfRlRfSUVFRTgwMjFYKSB7CkBAIC0xMDgzLDYgKzEwNTIsMTQgQEAKIAkJd3BhX3MtPmtleV9tZ210ID0gV1BBX0tFWV9NR01UX0ZUX1BTSzsKIAkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiV1BBOiB1c2luZyBLRVlfTUdNVCBGVC9QU0siKTsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLworI2lmZGVmIENPTkZJR19TQUUKKwl9IGVsc2UgaWYgKHNlbCAmIFdQQV9LRVlfTUdNVF9TQUUpIHsKKwkJd3BhX3MtPmtleV9tZ210ID0gV1BBX0tFWV9NR01UX1NBRTsKKwkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiUlNOOiB1c2luZyBLRVlfTUdNVCBTQUUiKTsKKwl9IGVsc2UgaWYgKHNlbCAmIFdQQV9LRVlfTUdNVF9GVF9TQUUpIHsKKwkJd3BhX3MtPmtleV9tZ210ID0gV1BBX0tFWV9NR01UX0ZUX1NBRTsKKwkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiUlNOOiB1c2luZyBLRVlfTUdNVCBGVC9TQUUiKTsKKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKIAl9IGVsc2UgaWYgKHNlbCAmIFdQQV9LRVlfTUdNVF9JRUVFODAyMVhfU0hBMjU2KSB7CiAJCXdwYV9zLT5rZXlfbWdtdCA9IFdQQV9LRVlfTUdNVF9JRUVFODAyMVhfU0hBMjU2OwpAQCAtMTExNSw3ICsxMDkyLDggQEAKIAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCiAJc2VsID0gaWUubWdtdF9ncm91cF9jaXBoZXI7Ci0JaWYgKHNzaWQtPmllZWU4MDIxMXcgPT0gTk9fTUdNVF9GUkFNRV9QUk9URUNUSU9OIHx8CisJaWYgKChzc2lkLT5pZWVlODAyMTF3ID09IE1HTVRfRlJBTUVfUFJPVEVDVElPTl9ERUZBVUxUID8KKwkgICAgIHdwYV9zLT5jb25mLT5wbWYgOiBzc2lkLT5pZWVlODAyMTF3KSA9PSBOT19NR01UX0ZSQU1FX1BST1RFQ1RJT04gfHwKIAkgICAgIShpZS5jYXBhYmlsaXRpZXMgJiBXUEFfQ0FQQUJJTElUWV9NRlBDKSkKIAkJc2VsID0gMDsKIAlpZiAoc2VsICYgV1BBX0NJUEhFUl9BRVNfMTI4X0NNQUMpIHsKQEAgLTExMjgsNyArMTEwNiw5IEBACiAJfQogCXdwYV9zbV9zZXRfcGFyYW0od3BhX3MtPndwYSwgV1BBX1BBUkFNX01HTVRfR1JPVVAsCiAJCQkgd3BhX3MtPm1nbXRfZ3JvdXBfY2lwaGVyKTsKLQl3cGFfc21fc2V0X3BhcmFtKHdwYV9zLT53cGEsIFdQQV9QQVJBTV9NRlAsIHNzaWQtPmllZWU4MDIxMXcpOworCXdwYV9zbV9zZXRfcGFyYW0od3BhX3MtPndwYSwgV1BBX1BBUkFNX01GUCwKKwkJCSAoc3NpZC0+aWVlZTgwMjExdyA9PSBNR01UX0ZSQU1FX1BST1RFQ1RJT05fREVGQVVMVCA/CisJCQkgIHdwYV9zLT5jb25mLT5wbWYgOiBzc2lkLT5pZWVlODAyMTF3KSk7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KIAogCWlmICh3cGFfc21fc2V0X2Fzc29jX3dwYV9pZV9kZWZhdWx0KHdwYV9zLT53cGEsIHdwYV9pZSwgd3BhX2llX2xlbikpIHsKQEAgLTEyMTMsNiArMTE5MywzMyBAQAogfQogCiAKK2ludCB3cGFzX2J1aWxkX2V4dF9jYXBhYihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCB1OCAqYnVmKQoreworCXUzMiBleHRfY2FwYWIgPSAwOworCXU4ICpwb3MgPSBidWY7CisKKyNpZmRlZiBDT05GSUdfSU5URVJXT1JLSU5HCisJaWYgKHdwYV9zLT5jb25mLT5pbnRlcndvcmtpbmcpCisJCWV4dF9jYXBhYiB8PSBCSVQoMzEpOyAvKiBJbnRlcndvcmtpbmcgKi8KKyNlbmRpZiAvKiBDT05GSUdfSU5URVJXT1JLSU5HICovCisKKyNpZmRlZiBDT05GSUdfV05NCisJZXh0X2NhcGFiIHw9IEJJVCgxNyk7IC8qIFdOTS1TbGVlcCBNb2RlICovCisJZXh0X2NhcGFiIHw9IEJJVCgxOSk7IC8qIEJTUyBUcmFuc2l0aW9uICovCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLworCisJaWYgKCFleHRfY2FwYWIpCisJCXJldHVybiAwOworCisJKnBvcysrID0gV0xBTl9FSURfRVhUX0NBUEFCOworCSpwb3MrKyA9IDQ7CisJV1BBX1BVVF9MRTMyKHBvcywgZXh0X2NhcGFiKTsKKwlwb3MgKz0gNDsKKworCXJldHVybiBwb3MgLSBidWY7Cit9CisKKwogLyoqCiAgKiB3cGFfc3VwcGxpY2FudF9hc3NvY2lhdGUgLSBSZXF1ZXN0IGFzc29jaWF0aW9uCiAgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQpAQCAtMTIzNCw2ICsxMjQxLDggQEAKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9jYXBhIGNhcGE7CiAJaW50IGFzc29jX2ZhaWxlZCA9IDA7CiAJc3RydWN0IHdwYV9zc2lkICpvbGRfc3NpZDsKKwl1OCBleHRfY2FwYWJbMTBdOworCWludCBleHRfY2FwYWJfbGVuOwogI2lmZGVmIENPTkZJR19IVF9PVkVSUklERVMKIAlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyBodGNhcHM7CiAJc3RydWN0IGllZWU4MDIxMV9odF9jYXBhYmlsaXRpZXMgaHRjYXBzX21hc2s7CkBAIC0xMzA5LDcgKzEzMTgsNyBAQAogCQkgICAoc3NpZC0+a2V5X21nbXQgJiBXUEFfS0VZX01HTVRfV1BTKSkgewogCQkvKiBVc2UgYXBfc2Nhbj09MSBzdHlsZSBuZXR3b3JrIHNlbGVjdGlvbiB0byBmaW5kIHRoZSBuZXR3b3JrCiAJCSAqLwotCQl3cGFfcy0+c2Nhbl9yZXEgPSAyOworCQl3cGFfcy0+c2Nhbl9yZXEgPSBNQU5VQUxfU0NBTl9SRVE7CiAJCXdwYV9zLT5yZWFzc29jaWF0ZSA9IDE7CiAJCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKIAkJcmV0dXJuOwpAQCAtMTM0Nyw3ICsxMzU2LDkgQEAKIAkJICAgIHdwYV9ic3NfZ2V0X2llKGJzcywgV0xBTl9FSURfUlNOKSkgJiYKIAkgICAgd3BhX2tleV9tZ210X3dwYShzc2lkLT5rZXlfbWdtdCkpIHsKIAkJaW50IHRyeV9vcHBvcnR1bmlzdGljOwotCQl0cnlfb3Bwb3J0dW5pc3RpYyA9IHNzaWQtPnByb2FjdGl2ZV9rZXlfY2FjaGluZyAmJgorCQl0cnlfb3Bwb3J0dW5pc3RpYyA9IChzc2lkLT5wcm9hY3RpdmVfa2V5X2NhY2hpbmcgPCAwID8KKwkJCQkgICAgIHdwYV9zLT5jb25mLT5va2MgOgorCQkJCSAgICAgc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nKSAmJgogCQkJKHNzaWQtPnByb3RvICYgV1BBX1BST1RPX1JTTik7CiAJCWlmIChwbWtzYV9jYWNoZV9zZXRfY3VycmVudCh3cGFfcy0+d3BhLCBOVUxMLCBic3MtPmJzc2lkLAogCQkJCQkgICAgd3BhX3MtPmN1cnJlbnRfc3NpZCwKQEAgLTE0NDUsMjYgKzE0NTYsMjEgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KIAotI2lmZGVmIENPTkZJR19JTlRFUldPUktJTkcKLQlpZiAod3BhX3MtPmNvbmYtPmludGVyd29ya2luZykgeworCWV4dF9jYXBhYl9sZW4gPSB3cGFzX2J1aWxkX2V4dF9jYXBhYih3cGFfcywgZXh0X2NhcGFiKTsKKwlpZiAoZXh0X2NhcGFiX2xlbiA+IDApIHsKIAkJdTggKnBvcyA9IHdwYV9pZTsKIAkJaWYgKHdwYV9pZV9sZW4gPiAwICYmIHBvc1swXSA9PSBXTEFOX0VJRF9SU04pCiAJCQlwb3MgKz0gMiArIHBvc1sxXTsKLQkJb3NfbWVtbW92ZShwb3MgKyA2LCBwb3MsIHdwYV9pZV9sZW4gLSAocG9zIC0gd3BhX2llKSk7Ci0JCXdwYV9pZV9sZW4gKz0gNjsKLQkJKnBvcysrID0gV0xBTl9FSURfRVhUX0NBUEFCOwotCQkqcG9zKysgPSA0OwotCQkqcG9zKysgPSAweDAwOwotCQkqcG9zKysgPSAweDAwOwotCQkqcG9zKysgPSAweDAwOwotCQkqcG9zKysgPSAweDgwOyAvKiBCaXQgMzEgLSBJbnRlcndvcmtpbmcgKi8KKwkJb3NfbWVtbW92ZShwb3MgKyBleHRfY2FwYWJfbGVuLCBwb3MsCisJCQkgICB3cGFfaWVfbGVuIC0gKHBvcyAtIHdwYV9pZSkpOworCQl3cGFfaWVfbGVuICs9IGV4dF9jYXBhYl9sZW47CisJCW9zX21lbWNweShwb3MsIGV4dF9jYXBhYiwgZXh0X2NhcGFiX2xlbik7CiAJfQotI2VuZGlmIC8qIENPTkZJR19JTlRFUldPUktJTkcgKi8KIAogCXdwYV9jbGVhcl9rZXlzKHdwYV9zLCBic3MgPyBic3MtPmJzc2lkIDogTlVMTCk7CiAJdXNlX2NyeXB0ID0gMTsKLQljaXBoZXJfcGFpcndpc2UgPSBjaXBoZXJfc3VpdGUyZHJpdmVyKHdwYV9zLT5wYWlyd2lzZV9jaXBoZXIpOwotCWNpcGhlcl9ncm91cCA9IGNpcGhlcl9zdWl0ZTJkcml2ZXIod3BhX3MtPmdyb3VwX2NpcGhlcik7CisJY2lwaGVyX3BhaXJ3aXNlID0gd3BhX2NpcGhlcl90b19zdWl0ZV9kcml2ZXIod3BhX3MtPnBhaXJ3aXNlX2NpcGhlcik7CisJY2lwaGVyX2dyb3VwID0gd3BhX2NpcGhlcl90b19zdWl0ZV9kcml2ZXIod3BhX3MtPmdyb3VwX2NpcGhlcik7CiAJaWYgKHdwYV9zLT5rZXlfbWdtdCA9PSBXUEFfS0VZX01HTVRfTk9ORSB8fAogCSAgICB3cGFfcy0+a2V5X21nbXQgPT0gV1BBX0tFWV9NR01UX0lFRUU4MDIxWF9OT19XUEEpIHsKIAkJaWYgKHdwYV9zLT5rZXlfbWdtdCA9PSBXUEFfS0VZX01HTVRfTk9ORSkKQEAgLTE1NTIsOCArMTU1OCwxMCBAQAogCXBhcmFtcy5kcm9wX3VuZW5jcnlwdGVkID0gdXNlX2NyeXB0OwogCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKLQlwYXJhbXMubWdtdF9mcmFtZV9wcm90ZWN0aW9uID0gc3NpZC0+aWVlZTgwMjExdzsKLQlpZiAoc3NpZC0+aWVlZTgwMjExdyAhPSBOT19NR01UX0ZSQU1FX1BST1RFQ1RJT04gJiYgYnNzKSB7CisJcGFyYW1zLm1nbXRfZnJhbWVfcHJvdGVjdGlvbiA9CisJCXNzaWQtPmllZWU4MDIxMXcgPT0gTUdNVF9GUkFNRV9QUk9URUNUSU9OX0RFRkFVTFQgPworCQl3cGFfcy0+Y29uZi0+cG1mIDogc3NpZC0+aWVlZTgwMjExdzsKKwlpZiAocGFyYW1zLm1nbXRfZnJhbWVfcHJvdGVjdGlvbiAhPSBOT19NR01UX0ZSQU1FX1BST1RFQ1RJT04gJiYgYnNzKSB7CiAJCWNvbnN0IHU4ICpyc24gPSB3cGFfYnNzX2dldF9pZShic3MsIFdMQU5fRUlEX1JTTik7CiAJCXN0cnVjdCB3cGFfaWVfZGF0YSBpZTsKIAkJaWYgKHJzbiAmJiB3cGFfcGFyc2Vfd3BhX2llKHJzbiwgMiArIHJzblsxXSwgJmllKSA9PSAwICYmCkBAIC0xNTkwLDE2ICsxNTk4LDggQEAKIAkJKChmcmVxID0gd3BhX2Rydl9zaGFyZWRfZnJlcSh3cGFfcykpID4gMCkgJiYgKGZyZXEgIT0gcGFyYW1zLmZyZXEpKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU2hhcmVkIGludGVyZmFjZSB3aXRoIGNvbmZsaWN0aW5nIGZyZXF1ZW5jeSBmb3VuZCAoJWQgIT0gJWQpIgogCQkJCQkJCQkJCQkJCQkJCSwgZnJlcSwgcGFyYW1zLmZyZXEpOwotCQlpZiAod3Bhc19wMnBfaGFuZGxlX2ZyZXF1ZW5jeV9jb25mbGljdHMod3BhX3MsIHBhcmFtcy5mcmVxKSA8IDApIHsKLQkJCS8qIEhhbmRsaW5nIGNvbmZsaWN0cyBmYWlsZWQuIERpc2FibGUgdGhlIGN1cnJlbnQgY29ubmVjdCByZXEgYW5kCi0JCQkgKiBub3RpZnkgdGhlIHVzZXJzcGFjZSB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiAqLwotCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJwcm9pcml0aXplIGlzIG5vdCBzZXQuIE5vdGlmeWluZyB1c2VyIHNwYWNlIHRvIGhhbmRsZSB0aGUgY2FzZSIpOwotCQkJd3BhX3N1cHBsaWNhbnRfZGlzYWJsZV9uZXR3b3JrKHdwYV9zLCBzc2lkKTsKLQkJCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCBXUEFfRVZFTlRfRlJFUV9DT05GTElDVAotCQkJCSIgaWQ9JWQiLCBzc2lkLT5pZCk7Ci0JCQlvc19tZW1zZXQod3BhX3MtPnBlbmRpbmdfYnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJaWYgKHdwYXNfcDJwX2hhbmRsZV9mcmVxdWVuY3lfY29uZmxpY3RzKHdwYV9zLCBwYXJhbXMuZnJlcSwgc3NpZCkgPCAwKSAKIAkJCXJldHVybjsKLQkJfQogCX0KICNlbmRpZgogCXJldCA9IHdwYV9kcnZfYXNzb2NpYXRlKHdwYV9zLCAmcGFyYW1zKTsKQEAgLTE2OTQsMzMgKzE2OTQsNiBAQAogCiAKIC8qKgotICogd3BhX3N1cHBsaWNhbnRfZGlzYXNzb2NpYXRlIC0gRGlzYXNzb2NpYXRlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KLSAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCi0gKiBAcmVhc29uX2NvZGU6IElFRUUgODAyLjExIHJlYXNvbiBjb2RlIGZvciB0aGUgZGlzYXNzb2NpYXRlIGZyYW1lCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlcXVlc3QgJXdwYV9zdXBwbGljYW50IHRvIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZQotICogY3VycmVudCBBUC4KLSAqLwotdm9pZCB3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKLQkJCQkgaW50IHJlYXNvbl9jb2RlKQotewotCXU4ICphZGRyID0gTlVMTDsKLQl1bmlvbiB3cGFfZXZlbnRfZGF0YSBldmVudDsKLQotCWlmICghaXNfemVyb19ldGhlcl9hZGRyKHdwYV9zLT5ic3NpZCkpIHsKLQkJd3BhX2Rydl9kaXNhc3NvY2lhdGUod3BhX3MsIHdwYV9zLT5ic3NpZCwgcmVhc29uX2NvZGUpOwotCQlhZGRyID0gd3BhX3MtPmJzc2lkOwotCQlvc19tZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKLQkJZXZlbnQuZGlzYXNzb2NfaW5mby5yZWFzb25fY29kZSA9ICh1MTYpIHJlYXNvbl9jb2RlOwotCQlldmVudC5kaXNhc3NvY19pbmZvLmxvY2FsbHlfZ2VuZXJhdGVkID0gMTsKLQkJd3BhX3N1cHBsaWNhbnRfZXZlbnQod3BhX3MsIEVWRU5UX0RJU0FTU09DLCAmZXZlbnQpOwotCX0KLQotCXdwYV9zdXBwbGljYW50X2NsZWFyX2Nvbm5lY3Rpb24od3BhX3MsIGFkZHIpOwotfQotCi0KLS8qKgogICogd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUgLSBEZWF1dGhlbnRpY2F0ZSB0aGUgY3VycmVudCBjb25uZWN0aW9uCiAgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQogICogQHJlYXNvbl9jb2RlOiBJRUVFIDgwMi4xMSByZWFzb24gY29kZSBmb3IgdGhlIGRlYXV0aGVudGljYXRlIGZyYW1lCkBAIC0xNzMzLDE0ICsxNzA2LDQyIEBACiB7CiAJdTggKmFkZHIgPSBOVUxMOwogCXVuaW9uIHdwYV9ldmVudF9kYXRhIGV2ZW50OworCWludCB6ZXJvX2FkZHIgPSAwOwogCi0JaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIod3BhX3MtPmJzc2lkKSkgewotCQl3cGFfZHJ2X2RlYXV0aGVudGljYXRlKHdwYV9zLCB3cGFfcy0+YnNzaWQsIHJlYXNvbl9jb2RlKTsKKwl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJSZXF1ZXN0IHRvIGRlYXV0aGVudGljYXRlIC0gYnNzaWQ9IiBNQUNTVFIKKwkJIiBwZW5kaW5nX2Jzc2lkPSIgTUFDU1RSICIgcmVhc29uPSVkIHN0YXRlPSVzIiwKKwkJTUFDMlNUUih3cGFfcy0+YnNzaWQpLCBNQUMyU1RSKHdwYV9zLT5wZW5kaW5nX2Jzc2lkKSwKKwkJcmVhc29uX2NvZGUsIHdwYV9zdXBwbGljYW50X3N0YXRlX3R4dCh3cGFfcy0+d3BhX3N0YXRlKSk7CisKKwlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcih3cGFfcy0+YnNzaWQpKQogCQlhZGRyID0gd3BhX3MtPmJzc2lkOworCWVsc2UgaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIod3BhX3MtPnBlbmRpbmdfYnNzaWQpICYmCisJCSAod3BhX3MtPndwYV9zdGF0ZSA9PSBXUEFfQVVUSEVOVElDQVRJTkcgfHwKKwkJICB3cGFfcy0+d3BhX3N0YXRlID09IFdQQV9BU1NPQ0lBVElORykpCisJCWFkZHIgPSB3cGFfcy0+cGVuZGluZ19ic3NpZDsKKwllbHNlIGlmICh3cGFfcy0+d3BhX3N0YXRlID09IFdQQV9BU1NPQ0lBVElORykgeworCQkvKgorCQkgKiBXaGVuIHVzaW5nIGRyaXZlci1iYXNlZCBCU1Mgc2VsZWN0aW9uLCB3ZSBtYXkgbm90IGtub3cgdGhlCisJCSAqIEJTU0lEIHdpdGggd2hpY2ggd2UgYXJlIGN1cnJlbnRseSB0cnlpbmcgdG8gYXNzb2NpYXRlLiBXZQorCQkgKiBuZWVkIHRvIG5vdGlmeSB0aGUgZHJpdmVyIG9mIHRoaXMgZGlzY29ubmVjdGlvbiBldmVuIGluIHN1Y2gKKwkJICogYSBjYXNlLCBzbyB1c2UgdGhlIGFsbCB6ZXJvcyBhZGRyZXNzIGhlcmUuCisJCSAqLworCQlhZGRyID0gd3BhX3MtPmJzc2lkOworCQl6ZXJvX2FkZHIgPSAxOworCX0KKworI2lmZGVmIENPTkZJR19URExTCisJd3BhX3RkbHNfdGVhcmRvd25fcGVlcnMod3BhX3MtPndwYSk7CisjZW5kaWYgLyogQ09ORklHX1RETFMgKi8KKworCWlmIChhZGRyKSB7CisJCXdwYV9kcnZfZGVhdXRoZW50aWNhdGUod3BhX3MsIGFkZHIsIHJlYXNvbl9jb2RlKTsKIAkJb3NfbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKGV2ZW50KSk7CiAJCWV2ZW50LmRlYXV0aF9pbmZvLnJlYXNvbl9jb2RlID0gKHUxNikgcmVhc29uX2NvZGU7CiAJCWV2ZW50LmRlYXV0aF9pbmZvLmxvY2FsbHlfZ2VuZXJhdGVkID0gMTsKIAkJd3BhX3N1cHBsaWNhbnRfZXZlbnQod3BhX3MsIEVWRU5UX0RFQVVUSCwgJmV2ZW50KTsKKwkJaWYgKHplcm9fYWRkcikKKwkJCWFkZHIgPSBOVUxMOwogCX0KIAogCXdwYV9zdXBwbGljYW50X2NsZWFyX2Nvbm5lY3Rpb24od3BhX3MsIGFkZHIpOwpAQCAtMTgzMSwxMSArMTgzMiwxMSBAQAogCQkJCQl3cGFfcywgb3RoZXJfc3NpZCk7CiAJCX0KIAkJaWYgKHdwYV9zLT5jdXJyZW50X3NzaWQpCi0JCQl3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUoCisJCQl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSgKIAkJCQl3cGFfcywgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwogCX0gZWxzZSBpZiAoc3NpZC0+ZGlzYWJsZWQgIT0gMikgewogCQlpZiAoc3NpZCA9PSB3cGFfcy0+Y3VycmVudF9zc2lkKQotCQkJd3BhX3N1cHBsaWNhbnRfZGlzYXNzb2NpYXRlKAorCQkJd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUoCiAJCQkJd3BhX3MsIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKIAogCQl3YXNfZGlzYWJsZWQgPSBzc2lkLT5kaXNhYmxlZDsKQEAgLTE4NjEsNyArMTg2Miw3IEBACiAJaW50IGRpc2Nvbm5lY3RlZCA9IDA7CiAKIAlpZiAoc3NpZCAmJiBzc2lkICE9IHdwYV9zLT5jdXJyZW50X3NzaWQgJiYgd3BhX3MtPmN1cnJlbnRfc3NpZCkgewotCQl3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUoCisJCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKAogCQkJd3BhX3MsIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKIAkJZGlzY29ubmVjdGVkID0gMTsKIAl9CkBAIC0xODk5LDcgKzE5MDAsOSBAQAogCXdwYV9zLT5jb25uZWN0X3dpdGhvdXRfc2NhbiA9IE5VTEw7CiAJd3BhX3MtPmRpc2Nvbm5lY3RlZCA9IDA7CiAJd3BhX3MtPnJlYXNzb2NpYXRlID0gMTsKLQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgZGlzY29ubmVjdGVkID8gMTAwMDAwIDogMCk7CisKKwlpZiAod3BhX3N1cHBsaWNhbnRfZmFzdF9hc3NvY2lhdGUod3BhX3MpICE9IDEpCisJCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCBkaXNjb25uZWN0ZWQgPyAxMDAwMDAgOiAwKTsKIAogCWlmIChzc2lkKQogCQl3cGFzX25vdGlmeV9uZXR3b3JrX3NlbGVjdGVkKHdwYV9zLCBzc2lkKTsKQEAgLTIwMDQsNyArMjAwNyw3IEBACiAJfQogCXdwYV9tc2cod3BhX3MsIE1TR19ERUJVRywgIlNldHRpbmcgc2NhbiBpbnRlcnZhbDogJWQgc2VjIiwKIAkJc2Nhbl9pbnRlcnZhbCk7Ci0Jd3BhX3MtPnNjYW5faW50ZXJ2YWwgPSBzY2FuX2ludGVydmFsOworCXdwYV9zdXBwbGljYW50X3VwZGF0ZV9zY2FuX2ludCh3cGFfcywgc2Nhbl9pbnRlcnZhbCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIyMDAsMTcgKzIyMDMsMjggQEAKIAl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJSWCBFQVBPTCBmcm9tICIgTUFDU1RSLCBNQUMyU1RSKHNyY19hZGRyKSk7CiAJd3BhX2hleGR1bXAoTVNHX01TR0RVTVAsICJSWCBFQVBPTCIsIGJ1ZiwgbGVuKTsKIAotCWlmICh3cGFfcy0+d3BhX3N0YXRlIDwgV1BBX0FTU09DSUFURUQpIHsKKwlpZiAod3BhX3MtPndwYV9zdGF0ZSA8IFdQQV9BU1NPQ0lBVEVEIHx8CisJICAgICh3cGFfcy0+bGFzdF9lYXBvbF9tYXRjaGVzX2Jzc2lkICYmCisjaWZkZWYgQ09ORklHX0FQCisJICAgICAhd3BhX3MtPmFwX2lmYWNlICYmCisjZW5kaWYgLyogQ09ORklHX0FQICovCisJICAgICBvc19tZW1jbXAoc3JjX2FkZHIsIHdwYV9zLT5ic3NpZCwgRVRIX0FMRU4pICE9IDApKSB7CiAJCS8qCiAJCSAqIFRoZXJlIGlzIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gcmVjZWl2aW5nIHRoZQogCQkgKiBhc3NvY2lhdGlvbiBldmVudCBhbmQgdGhlIEVBUE9MIGZyYW1lIHNpbmNlIHRoZXkgYXJlIGNvbWluZwogCQkgKiB0aHJvdWdoIGRpZmZlcmVudCBwYXRocyBmcm9tIHRoZSBkcml2ZXIuIEluIG9yZGVyIHRvIGF2b2lkCiAJCSAqIGlzc3VlcyBpbiB0cnlpbmcgdG8gcHJvY2VzcyB0aGUgRUFQT0wgZnJhbWUgYmVmb3JlIHJlY2VpdmluZwogCQkgKiBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbiwgbGV0cyBxdWV1ZSBpdCBmb3IgcHJvY2Vzc2luZyB1bnRpbAotCQkgKiB0aGUgYXNzb2NpYXRpb24gZXZlbnQgaXMgcmVjZWl2ZWQuCisJCSAqIHRoZSBhc3NvY2lhdGlvbiBldmVudCBpcyByZWNlaXZlZC4gVGhpcyBtYXkgYWxzbyBiZSBuZWVkZWQgaW4KKwkJICogZHJpdmVyLWJhc2VkIHJvYW1pbmcgY2FzZSwgc28gYWxzbyB1c2Ugc3JjX2FkZHIgIT0gQlNTSUQgYXMgYQorCQkgKiB0cmlnZ2VyIGlmIHdlIGhhdmUgcHJldmlvdXNseSBjb25maXJtZWQgdGhhdCB0aGUKKwkJICogQXV0aGVudGljYXRvciB1c2VzIEJTU0lEIGFzIHRoZSBzcmNfYWRkciAod2hpY2ggaXMgbm90IHRoZQorCQkgKiBjYXNlIHdpdGggd2lyZWQgSUVFRSA4MDIuMVgpLgogCQkgKi8KIAkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiTm90IGFzc29jaWF0ZWQgLSBEZWxheSBwcm9jZXNzaW5nICIKLQkJCSJvZiByZWNlaXZlZCBFQVBPTCBmcmFtZSIpOworCQkJIm9mIHJlY2VpdmVkIEVBUE9MIGZyYW1lIChzdGF0ZT0lcyBic3NpZD0iIE1BQ1NUUiAiKSIsCisJCQl3cGFfc3VwcGxpY2FudF9zdGF0ZV90eHQod3BhX3MtPndwYV9zdGF0ZSksCisJCQlNQUMyU1RSKHdwYV9zLT5ic3NpZCkpOwogCQl3cGFidWZfZnJlZSh3cGFfcy0+cGVuZGluZ19lYXBvbF9yeCk7CiAJCXdwYV9zLT5wZW5kaW5nX2VhcG9sX3J4ID0gd3BhYnVmX2FsbG9jX2NvcHkoYnVmLCBsZW4pOwogCQlpZiAod3BhX3MtPnBlbmRpbmdfZWFwb2xfcngpIHsKQEAgLTIyMjEsNiArMjIzNSw5IEBACiAJCXJldHVybjsKIAl9CiAKKwl3cGFfcy0+bGFzdF9lYXBvbF9tYXRjaGVzX2Jzc2lkID0KKwkJb3NfbWVtY21wKHNyY19hZGRyLCB3cGFfcy0+YnNzaWQsIEVUSF9BTEVOKSA9PSAwOworCiAjaWZkZWYgQ09ORklHX0FQCiAJaWYgKHdwYV9zLT5hcF9pZmFjZSkgewogCQl3cGFfc3VwcGxpY2FudF9hcF9yeF9lYXBvbCh3cGFfcywgc3JjX2FkZHIsIGJ1ZiwgbGVuKTsKQEAgLTI0MTksNyArMjQzNiw3IEBACiAJd3BhX3MgPSBvc196YWxsb2Moc2l6ZW9mKCp3cGFfcykpOwogCWlmICh3cGFfcyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQl3cGFfcy0+c2Nhbl9yZXEgPSAxOworCXdwYV9zLT5zY2FuX3JlcSA9IElOSVRJQUxfU0NBTl9SRVE7CiAJd3BhX3MtPnNjYW5faW50ZXJ2YWwgPSA1OwogCXdwYV9zLT5uZXdfY29ubmVjdGlvbiA9IDE7CiAJd3BhX3MtPnBhcmVudCA9IHdwYV9zOwpAQCAtMjU3OSw2ICsyNTk2LDI4IEBACiB9CiAKIAorc3RhdGljIGludCB3cGFfc2V0X2Rpc2FibGVfc2dpKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9odF9jYXBhYmlsaXRpZXMgKmh0Y2FwcywKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyAqaHRjYXBzX21hc2ssCisJCQkgICAgICAgaW50IGRpc2FibGVkKQoreworCS8qIE1hc2tpbmcgdGhlc2Ugb3V0IGRpc2FibGVzIFNHSSAqLworCXUxNiBtc2sgPSBob3N0X3RvX2xlMTYoSFRfQ0FQX0lORk9fU0hPUlRfR0kyME1IWiB8CisJCQkgICAgICAgSFRfQ0FQX0lORk9fU0hPUlRfR0k0ME1IWik7CisKKwl3cGFfbXNnKHdwYV9zLCBNU0dfREVCVUcsICJzZXRfZGlzYWJsZV9zZ2k6ICVkIiwgZGlzYWJsZWQpOworCisJaWYgKGRpc2FibGVkKQorCQlodGNhcHMtPmh0X2NhcGFiaWxpdGllc19pbmZvICY9IH5tc2s7CisJZWxzZQorCQlodGNhcHMtPmh0X2NhcGFiaWxpdGllc19pbmZvIHw9IG1zazsKKworCWh0Y2Fwc19tYXNrLT5odF9jYXBhYmlsaXRpZXNfaW5mbyB8PSBtc2s7CisKKwlyZXR1cm4gMDsKK30KKworCiB2b2lkIHdwYV9zdXBwbGljYW50X2FwcGx5X2h0X292ZXJyaWRlcygKIAlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQsCiAJc3RydWN0IHdwYV9kcml2ZXJfYXNzb2NpYXRlX3BhcmFtcyAqcGFyYW1zKQpAQCAtMjYwMSw2ICsyNjQwLDcgQEAKIAl3cGFfc2V0X2FtcGR1X2ZhY3Rvcih3cGFfcywgaHRjYXBzLCBodGNhcHNfbWFzaywgc3NpZC0+YW1wZHVfZmFjdG9yKTsKIAl3cGFfc2V0X2FtcGR1X2RlbnNpdHkod3BhX3MsIGh0Y2FwcywgaHRjYXBzX21hc2ssIHNzaWQtPmFtcGR1X2RlbnNpdHkpOwogCXdwYV9zZXRfZGlzYWJsZV9odDQwKHdwYV9zLCBodGNhcHMsIGh0Y2Fwc19tYXNrLCBzc2lkLT5kaXNhYmxlX2h0NDApOworCXdwYV9zZXRfZGlzYWJsZV9zZ2kod3BhX3MsIGh0Y2FwcywgaHRjYXBzX21hc2ssIHNzaWQtPmRpc2FibGVfc2dpKTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19IVF9PVkVSUklERVMgKi8KQEAgLTM0NTIsNiArMzQ5MiwxMiBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBBZGQgcHJldmlvdXMgZmFpbHVyZSBjb3VudCBpbiBjYXNlIHRoZSB0ZW1wb3JhcnkgYmxhY2tsaXN0IHdhcworCSAqIGNsZWFyZWQgZHVlIHRvIG5vIG90aGVyIEJTU2VzIGJlaW5nIGF2YWlsYWJsZS4KKwkgKi8KKwljb3VudCArPSB3cGFfcy0+ZXh0cmFfYmxhY2tsaXN0X2NvdW50OworCiAJc3dpdGNoIChjb3VudCkgewogCWNhc2UgMToKIAkJdGltZW91dCA9IDEwMDsKQEAgLTM0NjIsMTAgKzM1MDgsMTcgQEAKIAljYXNlIDM6CiAJCXRpbWVvdXQgPSAxMDAwOwogCQlicmVhazsKLQlkZWZhdWx0OgorCWNhc2UgNDoKIAkJdGltZW91dCA9IDUwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRpbWVvdXQgPSAxMDAwMDsKKwkJYnJlYWs7CiAJfQogCisJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiQmxhY2tsaXN0IGNvdW50ICVkIC0tPiByZXF1ZXN0IHNjYW4gaW4gJWQgIgorCQkibXMiLCBjb3VudCwgdGltZW91dCk7CisKIAkvKgogCSAqIFRPRE86IGlmIG1vcmUgdGhhbiBvbmUgcG9zc2libGUgQVAgaXMgYXZhaWxhYmxlIGluIHNjYW4gcmVzdWx0cywKIAkgKiBjb3VsZCB0cnkgdGhlIG90aGVyIG9uZXMgYmVmb3JlIHJlcXVlc3RpbmcgYSBuZXcgc2Nhbi4KQEAgLTM2NzIsMyArMzcyNSw1OCBAQAogCWlmIChjbGVhcl9mYWlsdXJlcykKIAkJc3NpZC0+YXV0aF9mYWlsdXJlcyA9IDA7CiB9CisKKworaW50IGRpc2FsbG93ZWRfYnNzaWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmJzc2lkKQoreworCXNpemVfdCBpOworCisJaWYgKHdwYV9zLT5kaXNhbGxvd19hcHNfYnNzaWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgd3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZF9jb3VudDsgaSsrKSB7CisJCWlmIChvc19tZW1jbXAod3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZCArIGkgKiBFVEhfQUxFTiwKKwkJCSAgICAgIGJzc2lkLCBFVEhfQUxFTikgPT0gMCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKK2ludCBkaXNhbGxvd2VkX3NzaWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKnNzaWQsCisJCSAgICBzaXplX3Qgc3NpZF9sZW4pCit7CisJc2l6ZV90IGk7CisKKwlpZiAod3BhX3MtPmRpc2FsbG93X2Fwc19zc2lkID09IE5VTEwgfHwgc3NpZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCB3cGFfcy0+ZGlzYWxsb3dfYXBzX3NzaWRfY291bnQ7IGkrKykgeworCQlzdHJ1Y3Qgd3BhX3NzaWRfdmFsdWUgKnMgPSAmd3BhX3MtPmRpc2FsbG93X2Fwc19zc2lkW2ldOworCQlpZiAoc3NpZF9sZW4gPT0gcy0+c3NpZF9sZW4gJiYKKwkJICAgIG9zX21lbWNtcChzc2lkLCBzLT5zc2lkLCBzc2lkX2xlbikgPT0gMCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogd3Bhc19yZXF1ZXN0X2Nvbm5lY3Rpb24gLSBSZXF1ZXN0IGEgbmV3IGNvbm5lY3Rpb24KKyAqIEB3cGFfczogUG9pbnRlciB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVxdWVzdCBhIG5ldyBjb25uZWN0aW9uIHRvIGJlIGZvdW5kLiBJdCB3aWxsIG1hcmsKKyAqIHRoZSBpbnRlcmZhY2UgdG8gYWxsb3cgcmVhc3NvY2lhdGlvbiBhbmQgcmVxdWVzdCBhIG5ldyBzY2FuIHRvIGZpbmQgYQorICogc3VpdGFibGUgbmV0d29yayB0byBjb25uZWN0IHRvLgorICovCit2b2lkIHdwYXNfcmVxdWVzdF9jb25uZWN0aW9uKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisJd3BhX3MtPm5vcm1hbF9zY2FucyA9IDA7CisJd3BhX3N1cHBsaWNhbnRfcmVpbml0X2F1dG9zY2FuKHdwYV9zKTsKKwl3cGFfcy0+ZXh0cmFfYmxhY2tsaXN0X2NvdW50ID0gMDsKKwl3cGFfcy0+ZGlzY29ubmVjdGVkID0gMDsKKwl3cGFfcy0+cmVhc3NvY2lhdGUgPSAxOworCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKK30KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50LmNvbmYgYi93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudC5jb25mCmluZGV4IDBiMGVhODguLjE4NDYwYjggMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50LmNvbmYKKysrIGIvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnQuY29uZgpAQCAtMjY1LDYgKzI2NSwyOSBAQAogIyBpbmFjdGl2ZSBzdGF0aW9ucy4KICNwMnBfZ29fbWF4X2luYWN0aXZpdHk9MzAwCiAKKyMgT3Bwb3J0dW5pc3RpYyBLZXkgQ2FjaGluZyAoYWxzbyBrbm93biBhcyBQcm9hY3RpdmUgS2V5IENhY2hpbmcpIGRlZmF1bHQKKyMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGUKKyMgcHJvYWN0aXZlX2tleV9jYWNoaW5nIHBhcmFtZXRlci4gQnkgZGVmYXVsdCwgT0tDIGlzIGRpc2FibGVkIHVubGVzcyBlbmFibGVkCisjIHdpdGggdGhlIGdsb2JhbCBva2M9MSBwYXJhbWV0ZXIgb3Igd2l0aCB0aGUgcGVyLW5ldHdvcmsKKyMgcHJvYWN0aXZlX2tleV9jYWNoaW5nPTEgcGFyYW1ldGVyLiBXaXRoIG9rYz0xLCBPS0MgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBidXQKKyMgY2FuIGJlIGRpc2FibGVkIHdpdGggcGVyLW5ldHdvcmsgcHJvYWN0aXZlX2tleV9jYWNoaW5nPTAgcGFyYW1ldGVyLgorI29rYz0wCisKKyMgUHJvdGVjdGVkIE1hbmFnZW1lbnQgRnJhbWVzIGRlZmF1bHQKKyMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGUgaWVlZTgwMjExdworIyBwYXJhbWV0ZXIuIEJ5IGRlZmF1bHQsIFBNRiBpcyBkaXNhYmxlZCB1bmxlc3MgZW5hYmxlZCB3aXRoIHRoZSBnbG9iYWwgcG1mPTEvMgorIyBwYXJhbWV0ZXIgb3Igd2l0aCB0aGUgcGVyLW5ldHdvcmsgaWVlZTgwMjExdz0xLzIgcGFyYW1ldGVyLiBXaXRoIHBtZj0xLzIsIFBNRgorIyBpcyBlbmFibGVkL3JlcXVpcmVkIGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgcGVyLW5ldHdvcmsKKyMgaWVlZTgwMjExdyBwYXJhbWV0ZXIuCisjcG1mPTAKKworIyBFbmFibGVkIFNBRSBmaW5pdGUgY3ljbGljIGdyb3VwcyBpbiBwcmVmZXJlbmNlIG9yZGVyCisjIEJ5IGRlZmF1bHQgKGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzZXQpLCB0aGUgbWFuZGF0b3J5IGdyb3VwIDE5IChFQ0MgZ3JvdXAKKyMgZGVmaW5lZCBvdmVyIGEgMjU2LWJpdCBwcmltZSBvcmRlciBmaWVsZCkgaXMgcHJlZmVycmVkLCBidXQgb3RoZXIgZ3JvdXBzIGFyZQorIyBhbHNvIGVuYWJsZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCwgdGhlIGdyb3VwcyB3aWxsIGJlIHRyaWVkIGluIHRoZQorIyBpbmRpY2F0ZWQgb3JkZXIuIFRoZSBncm91cCB2YWx1ZXMgYXJlIGxpc3RlZCBpbiB0aGUgSUFOQSByZWdpc3RyeToKKyMgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9pcHNlYy1yZWdpc3RyeS9pcHNlYy1yZWdpc3RyeS54bWwjaXBzZWMtcmVnaXN0cnktOQorI3NhZV9ncm91cHM9MjEgMjAgMTkgMjYgMjUKIAogIyBJbnRlcndvcmtpbmcgKElFRUUgODAyLjExdSkKIApAQCAtMzc0LDYgKzM5NywxMSBAQAogIyBwaGFzZTI6IFByZS1jb25maWd1cmUgUGhhc2UgMiAoaW5uZXIgYXV0aGVudGljYXRpb24pIHBhcmFtZXRlcnMKICMJVGhpcyBvcHRpb25hbCBmaWVsZCBpcyB1c2VkIHdpdGggbGlrZSB0aGUgJ2VhcCcgcGFyYW1ldGVyLgogIworIyBleGNsdWRlZF9zc2lkOiBFeGNsdWRlZCBTU0lECisjCVRoaXMgb3B0aW9uYWwgZmllbGQgY2FuIGJlIHVzZWQgdG8gZXhjbHVkZWQgc3BlY2lmaWMgU1NJRChzKSBmcm9tCisjCW1hdGNoaW5nIHdpdGggdGhlIG5ldHdvcmsuIE11bHRpcGxlIGVudHJpZXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBtb3JlCisjCXRoYW4gb25lIFNTSUQuCisjCiAjIGZvciBleGFtcGxlOgogIwogI2NyZWQ9ewpAQCAtNDc0LDYgKzUwMiwyMyBAQAogIyBzZXQsIHNjYW4gcmVzdWx0cyB0aGF0IGRvIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHNwZWNpZmllZCBmcmVxdWVuY2llcyBhcmUgbm90CiAjIGNvbnNpZGVyZWQgd2hlbiBzZWxlY3RpbmcgYSBCU1MuCiAjCisjIGJnc2NhbjogQmFja2dyb3VuZCBzY2FubmluZworIyB3cGFfc3VwcGxpY2FudCBiZWhhdmlvciBmb3IgYmFja2dyb3VuZCBzY2FubmluZyBjYW4gYmUgc3BlY2lmaWVkIGJ5CisjIGNvbmZpZ3VyaW5nIGEgYmdzY2FuIG1vZHVsZS4gVGhlc2UgbW9kdWxlcyBhcmUgcmVzcG9uc2libGUgZm9yIHJlcXVlc3RpbmcKKyMgYmFja2dyb3VuZCBzY2FucyBmb3IgdGhlIHB1cnBvc2Ugb2Ygcm9hbWluZyB3aXRoaW4gYW4gRVNTIChpLmUuLCB3aXRoaW4gYQorIyBzaW5nbGUgbmV0d29yayBibG9jayB3aXRoIGFsbCB0aGUgQVBzIHVzaW5nIHRoZSBzYW1lIFNTSUQpLiBUaGUgYmdzY2FuCisjIHBhcmFtZXRlciB1c2VzIGZvbGxvd2luZyBmb3JtYXQ6ICI8YmdzY2FuIG1vZHVsZSBuYW1lPjo8bW9kdWxlIHBhcmFtZXRlcnM+IgorIyBGb2xsb3dpbmcgYmdzY2FuIG1vZHVsZXMgYXJlIGF2YWlsYWJsZToKKyMgc2ltcGxlIC0gUGVyaW9kaWMgYmFja2dyb3VuZCBzY2FucyBiYXNlZCBvbiBzaWduYWwgc3RyZW5ndGgKKyMgYmdzY2FuPSJzaW1wbGU6PHNob3J0IGJnc2NhbiBpbnRlcnZhbCBpbiBzZWNvbmRzPjo8c2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZD46CisjIDxsb25nIGludGVydmFsPiIKKyMgYmdzY2FuPSJzaW1wbGU6MzA6LTQ1OjMwMCIKKyMgbGVhcm4gLSBMZWFybiBjaGFubmVscyB1c2VkIGJ5IHRoZSBuZXR3b3JrIGFuZCB0cnkgdG8gYXZvaWQgYmdzY2FucyBvbiBvdGhlcgorIyBjaGFubmVscyAoZXhwZXJpbWVudGFsKQorIyBiZ3NjYW49ImxlYXJuOjxzaG9ydCBiZ3NjYW4gaW50ZXJ2YWwgaW4gc2Vjb25kcz46PHNpZ25hbCBzdHJlbmd0aCB0aHJlc2hvbGQ+OgorIyA8bG9uZyBpbnRlcnZhbD5bOjxkYXRhYmFzZSBmaWxlIG5hbWU+XSIKKyMgYmdzY2FuPSJsZWFybjozMDotNDU6MzAwOi9ldGMvd3BhX3N1cHBsaWNhbnQvbmV0d29yazEuYmdzY2FuIgorIwogIyBwcm90bzogbGlzdCBvZiBhY2NlcHRlZCBwcm90b2NvbHMKICMgV1BBID0gV1BBL0lFRUUgODAyLjExaS9EMy4wCiAjIFJTTiA9IFdQQTIvSUVFRSA4MDIuMTFpIChhbHNvIFdQQTIgY2FuIGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yIFJTTikKQEAgLTQ5MCw3ICs1MzUsNyBAQAogIyBJZiBub3Qgc2V0LCB0aGlzIGRlZmF1bHRzIHRvOiBXUEEtUFNLIFdQQS1FQVAKICMKICMgaWVlZTgwMjExdzogd2hldGhlciBtYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gaXMgZW5hYmxlZAotIyAwID0gZGlzYWJsZWQgKGRlZmF1bHQpCisjIDAgPSBkaXNhYmxlZCAoZGVmYXVsdCB1bmxlc3MgY2hhbmdlZCB3aXRoIHRoZSBnbG9iYWwgcG1mIHBhcmFtZXRlcikKICMgMSA9IG9wdGlvbmFsCiAjIDIgPSByZXF1aXJlZAogIyBUaGUgbW9zdCBjb21tb24gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGlzIGJhc2VkIG9uIHRoZSBQTUYgKHByb3RlY3RlZApAQCAtNTQ4LDcgKzU5Myw3IEBACiAjCiAjIHByb2FjdGl2ZV9rZXlfY2FjaGluZzoKICMgRW5hYmxlL2Rpc2FibGUgb3Bwb3J0dW5pc3RpYyBQTUtTQSBjYWNoaW5nIGZvciBXUEEyLgotIyAwID0gZGlzYWJsZWQgKGRlZmF1bHQpCisjIDAgPSBkaXNhYmxlZCAoZGVmYXVsdCB1bmxlc3MgY2hhbmdlZCB3aXRoIHRoZSBnbG9iYWwgb2tjIHBhcmFtZXRlcikKICMgMSA9IGVuYWJsZWQKICMKICMgd2VwX2tleTAuLjM6IFN0YXRpYyBXRVAga2V5IChBU0NJSSBpbiBkb3VibGUgcXVvdGF0aW9uLCBlLmcuICJhYmNkZSIgb3IKQEAgLTc4Nyw2ICs4MzIsMzQgQEAKICMgRFRJTSBwZXJpb2QgaW4gQmVhY29uIGludGVydmFscyBmb3IgQVAgbW9kZSAoZGVmYXVsdDogMikKICNkdGltX3BlcmlvZD0yCiAKKyMgZGlzYWJsZV9odDogV2hldGhlciBIVCAoODAyLjExbikgc2hvdWxkIGJlIGRpc2FibGVkLgorIyAwID0gSFQgZW5hYmxlZCAoaWYgQVAgc3VwcG9ydHMgaXQpCisjIDEgPSBIVCBkaXNhYmxlZAorIworIyBkaXNhYmxlX2h0NDA6IFdoZXRoZXIgSFQtNDAgKDgwMi4xMW4pIHNob3VsZCBiZSBkaXNhYmxlZC4KKyMgMCA9IEhULTQwIGVuYWJsZWQgKGlmIEFQIHN1cHBvcnRzIGl0KQorIyAxID0gSFQtNDAgZGlzYWJsZWQKKyMKKyMgZGlzYWJsZV9zZ2k6IFdoZXRoZXIgU0dJIChzaG9ydCBndWFyZCBpbnRlcnZhbCkgc2hvdWxkIGJlIGRpc2FibGVkLgorIyAwID0gU0dJIGVuYWJsZWQgKGlmIEFQIHN1cHBvcnRzIGl0KQorIyAxID0gU0dJIGRpc2FibGVkCisjCisjIGh0X21jczogIENvbmZpZ3VyZSBhbGxvd2VkIE1DUyByYXRlcy4KKyMgIFBhcnNlZCBhcyBhbiBhcnJheSBvZiBieXRlcywgaW4gYmFzZS0xNiAoYXNjaWktaGV4KQorIyBodF9tY3M9IiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBhbGwgYXZhaWxhYmxlIChkZWZhdWx0KQorIyBodF9tY3M9IjB4ZmYgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIiAgIC8vIFVzZSBNQ1MgMC03IG9ubHkKKyMgaHRfbWNzPSIweGZmIGZmIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICIgICAvLyBVc2UgTUNTIDAtMTUgb25seQorIworIyBkaXNhYmxlX21heF9hbXNkdTogIFdoZXRoZXIgTUFYX0FNU0RVIHNob3VsZCBiZSBkaXNhYmxlZC4KKyMgLTEgPSBEbyBub3QgbWFrZSBhbnkgY2hhbmdlcy4KKyMgMCAgPSBFbmFibGUgTUFYLUFNU0RVIGlmIGhhcmR3YXJlIHN1cHBvcnRzIGl0LgorIyAxICA9IERpc2FibGUgQU1TRFUKKyMKKyMgYW1wZHVfZGVuc2l0eTogIEFsbG93IG92ZXJyaWRpbmcgQU1QRFUgZGVuc2l0eSBjb25maWd1cmF0aW9uLgorIyAgVHJlYXRlZCBhcyBoaW50IGJ5IHRoZSBrZXJuZWwuCisjIC0xID0gRG8gbm90IG1ha2UgYW55IGNoYW5nZXMuCisjIDAtMyA9IFNldCBBTVBEVSBkZW5zaXR5IChha2EgZmFjdG9yKSB0byBzcGVjaWZpZWQgdmFsdWUuCisKICMgRXhhbXBsZSBibG9ja3M6CiAKICMgU2ltcGxlIGNhc2U6IFdQQS1QU0ssIFBTSyBhcyBhbiBBU0NJSSBwYXNzcGhyYXNlLCBhbGxvdyBhbGwgdmFsaWQgY2lwaGVycwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnRfaS5oIGIvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnRfaS5oCmluZGV4IDU1ZjNkODguLjBmNTFmOGUgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50X2kuaAorKysgYi93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudF9pLmgKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgInV0aWxzL2xpc3QuaCIKICNpbmNsdWRlICJjb21tb24vZGVmcy5oIgorI2luY2x1ZGUgImNvbW1vbi9zYWUuaCIKICNpbmNsdWRlICJjb25maWdfc3NpZC5oIgogCiBleHRlcm4gY29uc3QgY2hhciAqd3BhX3N1cHBsaWNhbnRfdmVyc2lvbjsKQEAgLTI0OSwxMSArMjUwLDE1IEBACiB9OwogCiAKKy8qKgorICogb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbl9yZXN1bHQgLSBSZXN1bHQgb2Ygb2ZmY2hhbm5lbCBzZW5kIEFjdGlvbiBmcmFtZQorICovCiBlbnVtIG9mZmNoYW5uZWxfc2VuZF9hY3Rpb25fcmVzdWx0IHsKLQlPRkZDSEFOTkVMX1NFTkRfQUNUSU9OX1NVQ0NFU1MgLyogRnJhbWUgd2FzIHNlbmQgYW5kIGFja25vd2xlZGdlZCAqLywKLQlPRkZDSEFOTkVMX1NFTkRfQUNUSU9OX05PX0FDSyAvKiBGcmFtZSB3YXMgc2VudCwgYnV0IG5vdCBhY2tub3dsZWRnZWQKKwlPRkZDSEFOTkVMX1NFTkRfQUNUSU9OX1NVQ0NFU1MgLyoqPCBGcmFtZSB3YXMgc2VuZCBhbmQgYWNrbm93bGVkZ2VkICovLAorCU9GRkNIQU5ORUxfU0VORF9BQ1RJT05fTk9fQUNLIC8qKjwgRnJhbWUgd2FzIHNlbnQsIGJ1dCBub3QgYWNrbm93bGVkZ2VkCiAJCQkJICAgICAgICovLAotCU9GRkNIQU5ORUxfU0VORF9BQ1RJT05fRkFJTEVEIC8qIEZyYW1lIHdhcyBub3Qgc2VudCBkdWUgdG8gYSBmYWlsdXJlICovCisJT0ZGQ0hBTk5FTF9TRU5EX0FDVElPTl9GQUlMRUQgLyoqPCBGcmFtZSB3YXMgbm90IHNlbnQgZHVlIHRvIGEgZmFpbHVyZQorCQkJCSAgICAgICAqLwogfTsKIAogc3RydWN0IHdwc19hcF9pbmZvIHsKQEAgLTI2Nyw2ICsyNzIsMTEgQEAKIAlzdHJ1Y3Qgb3NfdGltZSBsYXN0X2F0dGVtcHQ7CiB9OwogCitzdHJ1Y3Qgd3BhX3NzaWRfdmFsdWUgeworCXU4IHNzaWRbMzJdOworCXNpemVfdCBzc2lkX2xlbjsKK307CisKIC8qKgogICogc3RydWN0IHdwYV9zdXBwbGljYW50IC0gSW50ZXJuYWwgZGF0YSBmb3Igd3BhX3N1cHBsaWNhbnQgaW50ZXJmYWNlCiAgKgpAQCAtMzIzLDYgKzMzMywxMSBAQAogCXU4ICpic3NpZF9maWx0ZXI7CiAJc2l6ZV90IGJzc2lkX2ZpbHRlcl9jb3VudDsKIAorCXU4ICpkaXNhbGxvd19hcHNfYnNzaWQ7CisJc2l6ZV90IGRpc2FsbG93X2Fwc19ic3NpZF9jb3VudDsKKwlzdHJ1Y3Qgd3BhX3NzaWRfdmFsdWUgKmRpc2FsbG93X2Fwc19zc2lkOworCXNpemVfdCBkaXNhbGxvd19hcHNfc3NpZF9jb3VudDsKKwogCS8qIHByZXZpb3VzIHNjYW4gd2FzIHdpbGRjYXJkIHdoZW4gaW50ZXJsZWF2aW5nIGJldHdlZW4KIAkgKiB3aWxkY2FyZCBzY2FucyBhbmQgc3BlY2lmaWMgU1NJRCBzY2FuIHdoZW4gbWF4X3NzaWRzPTEgKi8KIAlpbnQgcHJldl9zY2FuX3dpbGRjYXJkOwpAQCAtMzcwLDcgKzM4NSw2IEBACiAJaW50IHNjYW5uaW5nOwogCWludCBzY2hlZF9zY2FubmluZzsKIAlpbnQgbmV3X2Nvbm5lY3Rpb247Ci0JaW50IHJlYXNzb2NpYXRlZF9jb25uZWN0aW9uOwogCiAJaW50IGVhcG9sX3JlY2VpdmVkOyAvKiBudW1iZXIgb2YgRUFQT0wgcGFja2V0cyByZWNlaXZlZCBhZnRlciB0aGUKIAkJCSAgICAgKiBwcmV2aW91cyBhc3NvY2lhdGlvbiBldmVudCAqLwpAQCAtMzg3LDEyICs0MDEsNTQgQEAKIAogCXN0cnVjdCB3cGFfYmxhY2tsaXN0ICpibGFja2xpc3Q7CiAKLQlpbnQgc2Nhbl9yZXE7IC8qIG1hbnVhbCBzY2FuIHJlcXVlc3Q7IHRoaXMgZm9yY2VzIGEgc2NhbiBldmVuIGlmIHRoZXJlCi0JCSAgICAgICAqIGFyZSBubyBlbmFibGVkIG5ldHdvcmtzIGluIHRoZSBjb25maWd1cmF0aW9uICovCisJLyoqCisJICogZXh0cmFfYmxhY2tsaXN0X2NvdW50IC0gU3VtIG9mIGJsYWNrbGlzdCBjb3VudHMgYWZ0ZXIgbGFzdCBjb25uZWN0aW9uCisJICoKKwkgKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gbWFpbnRhaW4gYSBjb3VudCBvZiB0ZW1wb3JhcnkgYmxhY2tsaXN0aW5nCisJICogZmFpbHVyZXMgKG1heGltdW0gbnVtYmVyIGZvciBhbnkgQlNTKSBvdmVyIGJsYWNrbGlzdCBjbGVhcgorCSAqIG9wZXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGZvciBmaWd1cmluZyBvdXQgd2hldGhlciB0aGVyZSBoYXMgYmVlbgorCSAqIGZhaWx1cmVzIHByaW9yIHRvIHRoZSBsYXN0IGJsYWNrbGlzdCBjbGVhciBvcGVyYXRpb24gd2hpY2ggaGFwcGVucworCSAqIHdoZW5ldmVyIG5vIG90aGVyIG5vdC1ibGFja2xpc3RlZCBCU1MgY2FuZGlkYXRlcyBhcmUgYXZhaWxhYmxlLiBUaGlzCisJICogZ2V0cyBjbGVhcmVkIHdoZW5ldmVyIGEgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZCBzdWNjZXNzZnVsbHkuCisJICovCisJaW50IGV4dHJhX2JsYWNrbGlzdF9jb3VudDsKKworCS8qKgorCSAqIHNjYW5fcmVxIC0gVHlwZSBvZiB0aGUgc2NhbiByZXF1ZXN0CisJICovCisJZW51bSBzY2FuX3JlcV90eXBlIHsKKwkJLyoqCisJCSAqIE5PUk1BTF9TQ0FOX1JFUSAtIE5vcm1hbCBzY2FuIHJlcXVlc3QKKwkJICoKKwkJICogVGhpcyBpcyB1c2VkIGZvciBzY2FucyBpbml0aWF0ZWQgYnkgd3BhX3N1cHBsaWNhbnQgdG8gZmluZCBhbgorCQkgKiBBUCBmb3IgYSBjb25uZWN0aW9uLgorCQkgKi8KKwkJTk9STUFMX1NDQU5fUkVRLAorCisJCS8qKgorCQkgKiBJTklUSUFMX1NDQU5fUkVRIC0gSW5pdGlhbCBzY2FuIHJlcXVlc3QKKwkJICoKKwkJICogVGhpcyBpcyB1c2VkIGZvciB0aGUgZmlyc3Qgc2NhbiBvbiBhbiBpbnRlcmZhY2UgdG8gZm9yY2UgYXQKKwkJICogbGVhc3Qgb25lIHNjYW4gdG8gYmUgcnVuIGV2ZW4gaWYgdGhlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QKKwkJICogaW5jbHVkZSBhbnkgZW5hYmxlZCBuZXR3b3Jrcy4KKwkJICovCisJCUlOSVRJQUxfU0NBTl9SRVEsCisKKwkJLyoqCisJCSAqIE1BTlVBTF9TQ0FOX1JFUSAtIE1hbnVhbCBzY2FuIHJlcXVlc3QKKwkJICoKKwkJICogVGhpcyBpcyB1c2VkIGZvciBzY2FucyB3aGVyZSB0aGUgdXNlciByZXF1ZXN0IGEgc2NhbiBvcgorCQkgKiBhIHNwZWNpZmljIHdwYV9zdXBwbGljYW50IG9wZXJhdGlvbiAoZS5nLiwgV1BTKSByZXF1aXJlcyBzY2FuCisJCSAqIHRvIGJlIHJ1bi4KKwkJICovCisJCU1BTlVBTF9TQ0FOX1JFUQorCX0gc2Nhbl9yZXE7CiAJaW50IHNjYW5fcnVuczsgLyogbnVtYmVyIG9mIHNjYW4gcnVucyBzaW5jZSBXUFMgd2FzIHN0YXJ0ZWQgKi8KIAlpbnQgKm5leHRfc2Nhbl9mcmVxczsKIAlpbnQgc2Nhbl9pbnRlcnZhbDsgLyogdGltZSBpbiBzZWMgYmV0d2VlbiBzY2FucyB0byBmaW5kIHN1aXRhYmxlIEFQICovCiAJaW50IG5vcm1hbF9zY2FuczsgLyogbm9ybWFsIHNjYW5zIHJ1biBiZWZvcmUgc2NoZWRfc2NhbiAqLworCWludCBzY2FuX2Zvcl9jb25uZWN0aW9uOyAvKiB3aGV0aGVyIHRoZSBzY2FuIHJlcXVlc3Qgd2FzIHRyaWdnZXJlZCBmb3IKKwkJCQkgICogZmluZGluZyBhIGNvbm5lY3Rpb24gKi8KIAogCXVuc2lnbmVkIGludCBkcnZfZmxhZ3M7CiAJdW5zaWduZWQgaW50IGRydl9lbmM7CkBAIC00MjIsNiArNDc4LDcgQEAKIAlzdHJ1Y3Qgd3BhYnVmICpwZW5kaW5nX2VhcG9sX3J4OwogCXN0cnVjdCBvc190aW1lIHBlbmRpbmdfZWFwb2xfcnhfdGltZTsKIAl1OCBwZW5kaW5nX2VhcG9sX3J4X3NyY1tFVEhfQUxFTl07CisJdW5zaWduZWQgaW50IGxhc3RfZWFwb2xfbWF0Y2hlc19ic3NpZDoxOwogCiAJc3RydWN0IGlic3NfcnNuICppYnNzX3JzbjsKIApAQCAtNDU3LDYgKzUxNCwxMSBAQAogCQl1OCBzY2hlZF9vYnNzX3NjYW47CiAJCXUxNiBvYnNzX3NjYW5faW50OwogCQl1MTYgYnNzX21heF9pZGxlX3BlcmlvZDsKKyNpZmRlZiBDT05GSUdfU0FFCisJCXN0cnVjdCBzYWVfZGF0YSBzYWU7CisJCXN0cnVjdCB3cGFidWYgKnNhZV90b2tlbjsKKwkJaW50IHNhZV9ncm91cF9pbmRleDsKKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiAJfSBzbWU7CiAjZW5kaWYgLyogQ09ORklHX1NNRSAqLwogCkBAIC01NDksNiArNjExLDcgQEAKIAl1bnNpZ25lZCBpbnQgcDJwX2ZhbGxiYWNrX3RvX2dvX25lZzoxOwogCXVuc2lnbmVkIGludCBwMnBfcGRfYmVmb3JlX2dvX25lZzoxOwogCXVuc2lnbmVkIGludCBwMnBfZ29faHQ0MDoxOworCXVuc2lnbmVkIGludCB1c2VyX2luaXRpYXRlZF9wZDoxOwogCWludCBwMnBfcGVyc2lzdGVudF9nb19mcmVxOwogCWludCBwMnBfcGVyc2lzdGVudF9pZDsKIAlpbnQgcDJwX2dvX2ludGVudDsKQEAgLTU3Myw2ICs2MzYsNyBAQAogCWludCBhZnRlcl93cHM7CiAJaW50IGtub3duX3dwc19mcmVxOwogCXVuc2lnbmVkIGludCB3cHNfZnJlcTsKKwl1MTYgd3BzX2FwX2NoYW5uZWw7CiAJaW50IHdwc19mcmFnbWVudF9zaXplOwogCWludCBhdXRvX3JlY29ubmVjdF9kaXNhYmxlZDsKIApAQCAtNjA4LDYgKzY3Miw4IEBACiAJc3RydWN0IHdwYWJ1ZiAqbGFzdF9nYXNfcmVzcDsKIAl1OCBsYXN0X2dhc19hZGRyW0VUSF9BTEVOXTsKIAl1OCBsYXN0X2dhc19kaWFsb2dfdG9rZW47CisKKwl1bnNpZ25lZCBpbnQgbm9fa2VlcF9hbGl2ZToxOwogfTsKIAogCkBAIC02NDMsOCArNzA5LDYgQEAKIHZvaWQgd3BhX3N1cHBsaWNhbnRfY2FuY2VsX2F1dGhfdGltZW91dChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIHZvaWQgd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkgICBpbnQgcmVhc29uX2NvZGUpOwotdm9pZCB3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKLQkJCQkgaW50IHJlYXNvbl9jb2RlKTsKIAogdm9pZCB3cGFfc3VwcGxpY2FudF9lbmFibGVfbmV0d29yayhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCSAgIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCk7CkBAIC02ODQsNyArNzQ4LDYgQEAKIHZvaWQgd3BhX3N1cHBsaWNhbnRfcnhfZWFwb2wodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjX2FkZHIsCiAJCQkgICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pOwogZW51bSB3cGFfa2V5X21nbXQga2V5X21nbXQyZHJpdmVyKGludCBrZXlfbWdtdCk7Ci1lbnVtIHdwYV9jaXBoZXIgY2lwaGVyX3N1aXRlMmRyaXZlcihpbnQgY2lwaGVyKTsKIHZvaWQgd3BhX3N1cHBsaWNhbnRfdXBkYXRlX2NvbmZpZyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIHZvaWQgd3BhX3N1cHBsaWNhbnRfY2xlYXJfc3RhdHVzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOwogdm9pZCB3cGFzX2Nvbm5lY3Rpb25fZmFpbGVkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNvbnN0IHU4ICpic3NpZCk7CkBAIC02OTMsNyArNzU2LDExIEBACiB2b2lkIHdwYXNfYXV0aF9mYWlsZWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CiB2b2lkIHdwYXNfY2xlYXJfdGVtcF9kaXNhYmxlZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJICAgICAgc3RydWN0IHdwYV9zc2lkICpzc2lkLCBpbnQgY2xlYXJfZmFpbHVyZXMpOwotdm9pZCB3cGFfc3VwcGxpY2FudF9wcm9jXzQwbWh6X2ludG9sZXJhbnQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CitpbnQgZGlzYWxsb3dlZF9ic3NpZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqYnNzaWQpOworaW50IGRpc2FsbG93ZWRfc3NpZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqc3NpZCwKKwkJICAgIHNpemVfdCBzc2lkX2xlbik7Cit2b2lkIHdwYXNfcmVxdWVzdF9jb25uZWN0aW9uKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOworaW50IHdwYXNfYnVpbGRfZXh0X2NhcGFiKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHU4ICpidWYpOwogCiAvKioKICAqIHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfY3RybF9yc3BfaGFuZGxlIC0gSGFuZGxlIGEgY29udHJvbCByZXNwb25zZQpAQCAtNzE4LDcgKzc4NSw3IEBACiB2b2lkIHdwYV9zdXBwbGljYW50X3N0b3BfY291bnRlcm1lYXN1cmVzKHZvaWQgKmVsb29wX2N0eCwgdm9pZCAqc29ja19jdHgpOwogdm9pZCB3cGFfc3VwcGxpY2FudF9kZWxheWVkX21pY19lcnJvcl9yZXBvcnQodm9pZCAqZWxvb3BfY3R4LCB2b2lkICpzb2NrX2N0eCk7CiB2b2lkIHdubV9ic3Nfa2VlcF9hbGl2ZV9kZWluaXQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7Ci1pbnQgd3Bhc19zZWxlY3RfbmV0d29ya19mcm9tX2xhc3Rfc2NhbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKK2ludCB3cGFfc3VwcGxpY2FudF9mYXN0X2Fzc29jaWF0ZShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIAogLyogZWFwX3JlZ2lzdGVyLmMgKi8KIGludCBlYXBfcmVnaXN0ZXJfbWV0aG9kcyh2b2lkKTsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3dwYXNfZ2x1ZS5jIGIvd3BhX3N1cHBsaWNhbnQvd3Bhc19nbHVlLmMKaW5kZXggNmFhNTIwNS4uNzU4NWI4NiAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvd3Bhc19nbHVlLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvd3Bhc19nbHVlLmMKQEAgLTQwNiwxNCArNDA2LDYgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBfd3BhX3N1cHBsaWNhbnRfZGlzYXNzb2NpYXRlKHZvaWQgKndwYV9zLCBpbnQgcmVhc29uX2NvZGUpCi17Ci0Jd3BhX3N1cHBsaWNhbnRfZGlzYXNzb2NpYXRlKHdwYV9zLCByZWFzb25fY29kZSk7Ci0JLyogU2NoZWR1bGUgYSBzY2FuIHRvIG1ha2Ugc3VyZSB3ZSBjb250aW51ZSBsb29raW5nIGZvciBuZXR3b3JrcyAqLwotCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCA1LCAwKTsKLX0KLQotCiBzdGF0aWMgdm9pZCBfd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUodm9pZCAqd3BhX3MsIGludCByZWFzb25fY29kZSkKIHsKIAl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSh3cGFfcywgcmVhc29uX2NvZGUpOwpAQCAtNTYwLDIwICs1NTIsMzcgQEAKIAogc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF90ZGxzX3BlZXJfYWRkc2V0KAogCXZvaWQgKmN0eCwgY29uc3QgdTggKnBlZXIsIGludCBhZGQsIHUxNiBjYXBhYmlsaXR5LAotCWNvbnN0IHU4ICpzdXBwX3JhdGVzLCBzaXplX3Qgc3VwcF9yYXRlc19sZW4pCisJY29uc3QgdTggKnN1cHBfcmF0ZXMsIHNpemVfdCBzdXBwX3JhdGVzX2xlbiwKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyAqaHRfY2FwYWIsCisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwYWJpbGl0aWVzICp2aHRfY2FwYWIsCisJdTggcW9zaW5mbywgY29uc3QgdTggKmV4dF9jYXBhYiwgc2l6ZV90IGV4dF9jYXBhYl9sZW4pCiB7CiAJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyA9IGN0eDsKIAlzdHJ1Y3QgaG9zdGFwZF9zdGFfYWRkX3BhcmFtcyBwYXJhbXM7CiAKKwlvc19tZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworCiAJcGFyYW1zLmFkZHIgPSBwZWVyOwogCXBhcmFtcy5haWQgPSAxOwogCXBhcmFtcy5jYXBhYmlsaXR5ID0gY2FwYWJpbGl0eTsKIAlwYXJhbXMuZmxhZ3MgPSBXUEFfU1RBX1RETFNfUEVFUiB8IFdQQV9TVEFfQVVUSE9SSVpFRDsKLQlwYXJhbXMuaHRfY2FwYWJpbGl0aWVzID0gTlVMTDsKKworCS8qCisJICogVERMUyBTZXR1cCBmcmFtZXMgZG8gbm90IGNvbnRhaW4gV01NIElFcywgaGVuY2UgbmVlZCB0byBkZXBlbmQgb24KKwkgKiBxb3NpbmZvIHRvIGNoZWNrIGlmIHRoZSBwZWVyIGlzIFdNTSBjYXBhYmxlLgorCSAqLworCWlmIChxb3NpbmZvKQorCQlwYXJhbXMuZmxhZ3MgfD0gV1BBX1NUQV9XTU07CisKKwlwYXJhbXMuaHRfY2FwYWJpbGl0aWVzID0gaHRfY2FwYWI7CisJcGFyYW1zLnZodF9jYXBhYmlsaXRpZXMgPSB2aHRfY2FwYWI7CisJcGFyYW1zLnFvc2luZm8gPSBxb3NpbmZvOwogCXBhcmFtcy5saXN0ZW5faW50ZXJ2YWwgPSAwOwogCXBhcmFtcy5zdXBwX3JhdGVzID0gc3VwcF9yYXRlczsKIAlwYXJhbXMuc3VwcF9yYXRlc19sZW4gPSBzdXBwX3JhdGVzX2xlbjsKIAlwYXJhbXMuc2V0ID0gIWFkZDsKKwlwYXJhbXMuZXh0X2NhcGFiID0gZXh0X2NhcGFiOworCXBhcmFtcy5leHRfY2FwYWJfbGVuID0gZXh0X2NhcGFiX2xlbjsKIAogCXJldHVybiB3cGFfZHJ2X3N0YV9hZGQod3BhX3MsICZwYXJhbXMpOwogfQpAQCAtNjcwLDYgKzY3OSw4IEBACiAJCXJldHVybjsKIAl9CiAKKwl3cGFzX25vdGlmeV9lYXBfc3RhdHVzKHdwYV9zLCAiZWFwIHBhcmFtZXRlciBuZWVkZWQiLCBmaWVsZF9uYW1lKTsKKwogCWJ1ZmxlbiA9IDEwMCArIG9zX3N0cmxlbih0eHQpICsgc3NpZC0+c3NpZF9sZW47CiAJYnVmID0gb3NfbWFsbG9jKGJ1Zmxlbik7CiAJaWYgKGJ1ZiA9PSBOVUxMKQpAQCAtODE0LDYgKzgyNSw3IEBACiB9CiAKIAorI2lmbmRlZiBDT05GSUdfTk9fV1BBCiBzdGF0aWMgdm9pZCB3cGFfc3VwcGxpY2FudF9zZXRfcmVrZXlfb2ZmbG9hZCh2b2lkICpjdHgsIGNvbnN0IHU4ICprZWssCiAJCQkJCSAgICAgY29uc3QgdTggKmtjaywKIAkJCQkJICAgICBjb25zdCB1OCAqcmVwbGF5X2N0cikKQEAgLTgyMiw2ICs4MzQsNyBAQAogCiAJd3BhX2Rydl9zZXRfcmVrZXlfaW5mbyh3cGFfcywga2VrLCBrY2ssIHJlcGxheV9jdHIpOwogfQorI2VuZGlmIC8qIENPTkZJR19OT19XUEEgKi8KIAogCiBpbnQgd3BhX3N1cHBsaWNhbnRfaW5pdF93cGEoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKQEAgLTgzOSw3ICs4NTIsNiBAQAogCWN0eC0+c2V0X3N0YXRlID0gX3dwYV9zdXBwbGljYW50X3NldF9zdGF0ZTsKIAljdHgtPmdldF9zdGF0ZSA9IF93cGFfc3VwcGxpY2FudF9nZXRfc3RhdGU7CiAJY3R4LT5kZWF1dGhlbnRpY2F0ZSA9IF93cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZTsKLQljdHgtPmRpc2Fzc29jaWF0ZSA9IF93cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGU7CiAJY3R4LT5zZXRfa2V5ID0gd3BhX3N1cHBsaWNhbnRfc2V0X2tleTsKIAljdHgtPmdldF9uZXR3b3JrX2N0eCA9IHdwYV9zdXBwbGljYW50X2dldF9uZXR3b3JrX2N0eDsKIAljdHgtPmdldF9ic3NpZCA9IHdwYV9zdXBwbGljYW50X2dldF9ic3NpZDsKQEAgLTg4OSw3ICs5MDEsOCBAQAogCQljb25mLnBlZXJrZXlfZW5hYmxlZCA9IHNzaWQtPnBlZXJrZXk7CiAJCWNvbmYuYWxsb3dlZF9wYWlyd2lzZV9jaXBoZXIgPSBzc2lkLT5wYWlyd2lzZV9jaXBoZXI7CiAjaWZkZWYgSUVFRTgwMjFYX0VBUE9MCi0JCWNvbmYucHJvYWN0aXZlX2tleV9jYWNoaW5nID0gc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nOworCQljb25mLnByb2FjdGl2ZV9rZXlfY2FjaGluZyA9IHNzaWQtPnByb2FjdGl2ZV9rZXlfY2FjaGluZyA8IDAgPworCQkJd3BhX3MtPmNvbmYtPm9rYyA6IHNzaWQtPnByb2FjdGl2ZV9rZXlfY2FjaGluZzsKIAkJY29uZi5lYXBfd29ya2Fyb3VuZCA9IHNzaWQtPmVhcF93b3JrYXJvdW5kOwogCQljb25mLmVhcF9jb25mX2N0eCA9ICZzc2lkLT5lYXA7CiAjZW5kaWYgLyogSUVFRTgwMjFYX0VBUE9MICovCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC93cHNfc3VwcGxpY2FudC5jIGIvd3BhX3N1cHBsaWNhbnQvd3BzX3N1cHBsaWNhbnQuYwppbmRleCA5MTVjYTU3Li41MDlhN2MwIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC93cHNfc3VwcGxpY2FudC5jCisrKyBiL3dwYV9zdXBwbGljYW50L3dwc19zdXBwbGljYW50LmMKQEAgLTI1Niw2ICsyNTYsMTUgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKGF1dGhfdHlwZSA9PSBXUFNfQVVUSF9XUEFQU0sgfHwgYXV0aF90eXBlID09IFdQU19BVVRIX1dQQTJQU0spIHsKKwkJaWYgKGNyZWQtPmtleV9sZW4gPCA4IHx8IGNyZWQtPmtleV9sZW4gPiAyICogUE1LX0xFTikgeworCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IFJlamVjdCBQU0sgY3JlZGVudGlhbCB3aXRoICIKKwkJCQkgICAiaW52YWxpZCBOZXR3b3JrIEtleSBsZW5ndGggJWx1IiwKKwkJCQkgICAodW5zaWduZWQgbG9uZykgY3JlZC0+a2V5X2xlbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKIAlpZiAoc3NpZCAmJiAoc3NpZC0+a2V5X21nbXQgJiBXUEFfS0VZX01HTVRfV1BTKSkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogUmVwbGFjZSBXUFMgbmV0d29yayBibG9jayBiYXNlZCAiCiAJCQkgICAib24gdGhlIHJlY2VpdmVkIGNyZWRlbnRpYWwiKTsKQEAgLTQwMyw2ICs0MTIsOSBAQAogCiAJd3Bhc193cHNfc2VjdXJpdHlfd29ya2Fyb3VuZCh3cGFfcywgc3NpZCwgY3JlZCk7CiAKKwlpZiAoY3JlZC0+YXBfY2hhbm5lbCkKKwkJd3BhX3MtPndwc19hcF9jaGFubmVsID0gY3JlZC0+YXBfY2hhbm5lbDsKKwogI2lmbmRlZiBDT05GSUdfTk9fQ09ORklHX1dSSVRFCiAJaWYgKHdwYV9zLT5jb25mLT51cGRhdGVfY29uZmlnICYmCiAJICAgIHdwYV9jb25maWdfd3JpdGUod3BhX3MtPmNvbmZuYW1lLCB3cGFfcy0+Y29uZikpIHsKQEAgLTQxMSw2ICs0MjMsMTMgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX05PX0NPTkZJR19XUklURSAqLwogCisJLyoKKwkgKiBPcHRpbWl6ZSB0aGUgcG9zdC1XUFMgc2NhbiBiYXNlZCBvbiB0aGUgY2hhbm5lbCB1c2VkIGR1cmluZworCSAqIHRoZSBwcm92aXNpb25pbmcgaW4gY2FzZSBFQVAtRmFpbHVyZSBpcyBub3QgcmVjZWl2ZWQuCisJICovCisJd3BhX3MtPmFmdGVyX3dwcyA9IDU7CisJd3BhX3MtPndwc19mcmVxID0gd3BhX3MtPmFzc29jX2ZyZXE7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDg3LDExICs1MDYsNTggQEAKIH0KIAogCitzdGF0aWMgdm9pZCB3cGFzX3dwc19yZWVuYWJsZV9uZXR3b3Jrc19jYih2b2lkICplbG9vcF9jdHgsIHZvaWQgKnRpbWVvdXRfY3R4KTsKKworc3RhdGljIHZvaWQgd3Bhc193cHNfcmVlbmFibGVfbmV0d29ya3Moc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKK3sKKwlzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7CisJaW50IGNoYW5nZWQgPSAwOworCisJZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc193cHNfcmVlbmFibGVfbmV0d29ya3NfY2IsIHdwYV9zLCBOVUxMKTsKKworCWZvciAoc3NpZCA9IHdwYV9zLT5jb25mLT5zc2lkOyBzc2lkOyBzc2lkID0gc3NpZC0+bmV4dCkgeworCQlpZiAoc3NpZC0+ZGlzYWJsZWRfZm9yX2Nvbm5lY3QgJiYgc3NpZC0+ZGlzYWJsZWQpIHsKKwkJCXNzaWQtPmRpc2FibGVkX2Zvcl9jb25uZWN0ID0gMDsKKwkJCXNzaWQtPmRpc2FibGVkID0gMDsKKwkJCXdwYXNfbm90aWZ5X25ldHdvcmtfZW5hYmxlZF9jaGFuZ2VkKHdwYV9zLCBzc2lkKTsKKwkJCWNoYW5nZWQrKzsKKwkJfQorCX0KKworCWlmIChjaGFuZ2VkKSB7CisjaWZuZGVmIENPTkZJR19OT19DT05GSUdfV1JJVEUKKwkJaWYgKHdwYV9zLT5jb25mLT51cGRhdGVfY29uZmlnICYmCisJCSAgICB3cGFfY29uZmlnX3dyaXRlKHdwYV9zLT5jb25mbmFtZSwgd3BhX3MtPmNvbmYpKSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogRmFpbGVkIHRvIHVwZGF0ZSAiCisJCQkJICAgImNvbmZpZ3VyYXRpb24iKTsKKwkJfQorI2VuZGlmIC8qIENPTkZJR19OT19DT05GSUdfV1JJVEUgKi8KKwl9Cit9CisKKworc3RhdGljIHZvaWQgd3Bhc193cHNfcmVlbmFibGVfbmV0d29ya3NfY2Iodm9pZCAqZWxvb3BfY3R4LCB2b2lkICp0aW1lb3V0X2N0eCkKK3sKKwlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zID0gZWxvb3BfY3R4OworCS8qIEVuYWJsZSB0aGUgbmV0d29ya3MgZGlzYWJsZWQgZHVyaW5nIHdwYXNfd3BzX3JlYXNzb2MgKi8KKwl3cGFzX3dwc19yZWVuYWJsZV9uZXR3b3Jrcyh3cGFfcyk7Cit9CisKKwogc3RhdGljIHZvaWQgd3BhX3N1cHBsaWNhbnRfd3BzX2V2ZW50X3N1Y2Nlc3Moc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAl3cGFfbXNnKHdwYV9zLCBNU0dfSU5GTywgV1BTX0VWRU5UX1NVQ0NFU1MpOwogCXdwYV9zLT53cHNfc3VjY2VzcyA9IDE7CiAJd3Bhc19ub3RpZnlfd3BzX2V2ZW50X3N1Y2Nlc3Mod3BhX3MpOworCisJLyoKKwkgKiBFbmFibGUgdGhlIG5ldHdvcmtzIGRpc2FibGVkIGR1cmluZyB3cGFzX3dwc19yZWFzc29jIGFmdGVyIDEwCisJICogc2Vjb25kcy4gVGhlIDEwIHNlY29uZHMgdGltZXIgaXMgdG8gYWxsb3cgdGhlIGRhdGEgY29ubmVjdGlvbiB0byBiZQorCSAqIGZvcm1lZCBiZWZvcmUgYWxsb3dpbmcgb3RoZXIgbmV0d29ya3MgdG8gYmUgc2VsZWN0ZWQuCisJICovCisJZWxvb3BfcmVnaXN0ZXJfdGltZW91dCgxMCwgMCwgd3Bhc193cHNfcmVlbmFibGVfbmV0d29ya3NfY2IsIHdwYV9zLAorCQkJICAgICAgIE5VTEwpOworCiAjaWZkZWYgQ09ORklHX1AyUAogCXdwYXNfcDJwX3dwc19zdWNjZXNzKHdwYV9zLCB3cGFfcy0+YnNzaWQsIDApOwogI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KQEAgLTY5MCw2ICs3NTYsOSBAQAogCiAJcHJldl9jdXJyZW50ID0gd3BhX3MtPmN1cnJlbnRfc3NpZDsKIAorCS8qIEVuYWJsZSB0aGUgbmV0d29ya3MgZGlzYWJsZWQgZHVyaW5nIHdwYXNfd3BzX3JlYXNzb2MgKi8KKwl3cGFzX3dwc19yZWVuYWJsZV9uZXR3b3Jrcyh3cGFfcyk7CisKIAllbG9vcF9jYW5jZWxfdGltZW91dCh3cGFzX3dwc190aW1lb3V0LCB3cGFfcywgTlVMTCk7CiAKIAkvKiBSZW1vdmUgYW55IGV4aXN0aW5nIFdQUyBuZXR3b3JrIGZyb20gY29uZmlndXJhdGlvbiAqLwpAQCAtODE5LDYgKzg4OCw3IEBACiAJc3NpZCA9IHdwYV9zLT5jb25mLT5zc2lkOwogCXdoaWxlIChzc2lkKSB7CiAJCWludCB3YXNfZGlzYWJsZWQgPSBzc2lkLT5kaXNhYmxlZDsKKwkJc3NpZC0+ZGlzYWJsZWRfZm9yX2Nvbm5lY3QgPSAwOwogCQkvKgogCQkgKiBJbiBjYXNlIHRoZSBuZXR3b3JrIG9iamVjdCBjb3JyZXNwb25kcyB0byBhIHBlcnNpc3RlbnQgZ3JvdXAKIAkJICogdGhlbiBkbyBub3Qgc2VuZCBvdXQgbmV0d29yayBkaXNhYmxlZCBzaWduYWwuIEluIGFkZGl0aW9uLApAQCAtODI3LDkgKzg5NywxMiBAQAogCQkgKi8KIAkJaWYgKHdhc19kaXNhYmxlZCAhPSAyKSB7CiAJCQlzc2lkLT5kaXNhYmxlZCA9IHNzaWQgIT0gc2VsZWN0ZWQ7Ci0JCQlpZiAod2FzX2Rpc2FibGVkICE9IHNzaWQtPmRpc2FibGVkKQorCQkJaWYgKHdhc19kaXNhYmxlZCAhPSBzc2lkLT5kaXNhYmxlZCkgeworCQkJCWlmIChzc2lkLT5kaXNhYmxlZCkKKwkJCQkJc3NpZC0+ZGlzYWJsZWRfZm9yX2Nvbm5lY3QgPSAxOwogCQkJCXdwYXNfbm90aWZ5X25ldHdvcmtfZW5hYmxlZF9jaGFuZ2VkKHdwYV9zLAogCQkJCQkJCQkgICAgc3NpZCk7CisJCQl9CiAJCX0KIAkJc3NpZCA9IHNzaWQtPm5leHQ7CiAJfQpAQCAtODY1LDcgKzkzOCw4IEBACiAJCX0KIAl9CiAjZW5kaWYgLyogQ09ORklHX1AyUCAqLwotCXdwYV9jb25maWdfc2V0KHNzaWQsICJwaGFzZTEiLCAiXCJwYmM9MVwiIiwgMCk7CisJaWYgKHdwYV9jb25maWdfc2V0KHNzaWQsICJwaGFzZTEiLCAiXCJwYmM9MVwiIiwgMCkgPCAwKQorCQlyZXR1cm4gLTE7CiAJaWYgKHdwYV9zLT53cHNfZnJhZ21lbnRfc2l6ZSkKIAkJc3NpZC0+ZWFwLmZyYWdtZW50X3NpemUgPSB3cGFfcy0+d3BzX2ZyYWdtZW50X3NpemU7CiAJZWxvb3BfcmVnaXN0ZXJfdGltZW91dChXUFNfUEJDX1dBTEtfVElNRSwgMCwgd3Bhc193cHNfdGltZW91dCwKQEAgLTkwOCw3ICs5ODIsOCBAQAogCQlvc19zbnByaW50Zih2YWwsIHNpemVvZih2YWwpLCAiXCJwaW49JTA4ZCBkZXZfcHdfaWQ9JXVcIiIsCiAJCQkgICAgcnBpbiwgZGV2X3B3X2lkKTsKIAl9Ci0Jd3BhX2NvbmZpZ19zZXQoc3NpZCwgInBoYXNlMSIsIHZhbCwgMCk7CisJaWYgKHdwYV9jb25maWdfc2V0KHNzaWQsICJwaGFzZTEiLCB2YWwsIDApIDwgMCkKKwkJcmV0dXJuIC0xOwogCWlmICh3cGFfcy0+d3BzX2ZyYWdtZW50X3NpemUpCiAJCXNzaWQtPmVhcC5mcmFnbWVudF9zaXplID0gd3BhX3MtPndwc19mcmFnbWVudF9zaXplOwogCWVsb29wX3JlZ2lzdGVyX3RpbWVvdXQoV1BTX1BCQ19XQUxLX1RJTUUsIDAsIHdwYXNfd3BzX3RpbWVvdXQsCkBAIC05NDAsNjIgKzEwMTUsMTMgQEAKIAkJd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUod3BhX3MsCiAJCQkJCSAgICAgIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKIAkJd3Bhc19jbGVhcl93cHMod3BhX3MpOwotCX0gZWxzZQorCX0gZWxzZSB7CisJCXdwYXNfd3BzX3JlZW5hYmxlX25ldHdvcmtzKHdwYV9zKTsKIAkJd3Bhc193cHNfY2xlYXJfYXBfaW5mbyh3cGFfcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0jaWZkZWYgQ09ORklHX1dQU19PT0IKLWludCB3cGFzX3dwc19zdGFydF9vb2Ioc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqZGV2aWNlX3R5cGUsCi0JCSAgICAgICBjaGFyICpwYXRoLCBjaGFyICptZXRob2QsIGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHdwc19jb250ZXh0ICp3cHMgPSB3cGFfcy0+d3BzOwotCXN0cnVjdCBvb2JfZGV2aWNlX2RhdGEgKm9vYl9kZXY7Ci0KLQlvb2JfZGV2ID0gd3BzX2dldF9vb2JfZGV2aWNlKGRldmljZV90eXBlKTsKLQlpZiAob29iX2RldiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0Jb29iX2Rldi0+ZGV2aWNlX3BhdGggPSBwYXRoOwotCW9vYl9kZXYtPmRldmljZV9uYW1lID0gbmFtZTsKLQl3cHMtPm9vYl9jb25mLm9vYl9tZXRob2QgPSB3cHNfZ2V0X29vYl9tZXRob2QobWV0aG9kKTsKLQotCWlmICh3cHMtPm9vYl9jb25mLm9vYl9tZXRob2QgPT0gT09CX01FVEhPRF9ERVZfUFdEX0UpIHsKLQkJLyoKLQkJICogVXNlIHByZS1jb25maWd1cmVkIERIIGtleXMgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byB3cml0ZSB0aGUKLQkJICoga2V5IGhhc2ggaW50byB0aGUgT09CIGZpbGUuCi0JCSAqLwotCQl3cGFidWZfZnJlZSh3cHMtPmRoX3B1YmtleSk7Ci0JCXdwYWJ1Zl9mcmVlKHdwcy0+ZGhfcHJpdmtleSk7Ci0JCXdwcy0+ZGhfcHJpdmtleSA9IE5VTEw7Ci0JCXdwcy0+ZGhfcHVia2V5ID0gTlVMTDsKLQkJZGg1X2ZyZWUod3BzLT5kaF9jdHgpOwotCQl3cHMtPmRoX2N0eCA9IGRoNV9pbml0KCZ3cHMtPmRoX3ByaXZrZXksICZ3cHMtPmRoX3B1YmtleSk7Ci0JCXdwcy0+ZGhfcHVia2V5ID0gd3BhYnVmX3plcm9wYWQod3BzLT5kaF9wdWJrZXksIDE5Mik7Ci0JCWlmICh3cHMtPmRoX2N0eCA9PSBOVUxMIHx8IHdwcy0+ZGhfcHVia2V5ID09IE5VTEwpIHsKLQkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSAiCi0JCQkJICAgIkRpZmZpZS1IZWxsbWFuIGhhbmRzaGFrZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9CiAJfQogCi0JaWYgKHdwcy0+b29iX2NvbmYub29iX21ldGhvZCA9PSBPT0JfTUVUSE9EX0NSRUQpCi0JCXdwYXNfY2xlYXJfd3BzKHdwYV9zKTsKLQotCWlmICh3cHNfcHJvY2Vzc19vb2Iod3BzLCBvb2JfZGV2LCAwKSA8IDApCi0JCXJldHVybiAtMTsKLQotCWlmICgod3BzLT5vb2JfY29uZi5vb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfREVWX1BXRF9FIHx8Ci0JICAgICB3cHMtPm9vYl9jb25mLm9vYl9tZXRob2QgPT0gT09CX01FVEhPRF9ERVZfUFdEX1IpICYmCi0JICAgIHdwYXNfd3BzX3N0YXJ0X3Bpbih3cGFfcywgTlVMTCwKLQkJCSAgICAgICB3cGFidWZfaGVhZCh3cHMtPm9vYl9jb25mLmRldl9wYXNzd29yZCksIDAsCi0JCQkgICAgICAgREVWX1BXX0RFRkFVTFQpIDwgMCkKLQkJCXJldHVybiAtMTsKLQogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCiAKIAogaW50IHdwYXNfd3BzX3N0YXJ0X3JlZyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqYnNzaWQsCkBAIC0xMDMxLDcgKzEwNTcsOCBAQAogCXJlcyA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiXCIiKTsKIAlpZiAocmVzIDwgMCB8fCByZXMgPj0gZW5kIC0gcG9zKQogCQlyZXR1cm4gLTE7Ci0Jd3BhX2NvbmZpZ19zZXQoc3NpZCwgInBoYXNlMSIsIHZhbCwgMCk7CisJaWYgKHdwYV9jb25maWdfc2V0KHNzaWQsICJwaGFzZTEiLCB2YWwsIDApIDwgMCkKKwkJcmV0dXJuIC0xOwogCWlmICh3cGFfcy0+d3BzX2ZyYWdtZW50X3NpemUpCiAJCXNzaWQtPmVhcC5mcmFnbWVudF9zaXplID0gd3BhX3MtPndwc19mcmFnbWVudF9zaXplOwogCWVsb29wX3JlZ2lzdGVyX3RpbWVvdXQoV1BTX1BCQ19XQUxLX1RJTUUsIDAsIHdwYXNfd3BzX3RpbWVvdXQsCkBAIC0xMjQ3LDYgKzEyNzQsNyBAQAogdm9pZCB3cGFzX3dwc19kZWluaXQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAllbG9vcF9jYW5jZWxfdGltZW91dCh3cGFzX3dwc190aW1lb3V0LCB3cGFfcywgTlVMTCk7CisJZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc193cHNfcmVlbmFibGVfbmV0d29ya3NfY2IsIHdwYV9zLCBOVUxMKTsKIAl3cGFzX3dwc19jbGVhcl9hcF9pbmZvKHdwYV9zKTsKIAogCWlmICh3cGFfcy0+d3BzID09IE5VTEwpCkBAIC0xMjYwLDggKzEyODgsNiBAQAogCXdwc19yZWdpc3RyYXJfZGVpbml0KHdwYV9zLT53cHMtPnJlZ2lzdHJhcik7CiAJd3BhYnVmX2ZyZWUod3BhX3MtPndwcy0+ZGhfcHVia2V5KTsKIAl3cGFidWZfZnJlZSh3cGFfcy0+d3BzLT5kaF9wcml2a2V5KTsKLQl3cGFidWZfZnJlZSh3cGFfcy0+d3BzLT5vb2JfY29uZi5wdWJrZXlfaGFzaCk7Ci0Jd3BhYnVmX2ZyZWUod3BhX3MtPndwcy0+b29iX2NvbmYuZGV2X3Bhc3N3b3JkKTsKIAl3cGFidWZfZnJlZSh3cGFfcy0+d3BzLT5kZXYudmVuZG9yX2V4dF9tMSk7CiAJb3NfZnJlZSh3cGFfcy0+d3BzLT5uZXR3b3JrX2tleSk7CiAJb3NfZnJlZSh3cGFfcy0+d3BzKTsKQEAgLTE4MDQsOCArMTgzMCwyNiBAQAogCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKIAorc3RydWN0IHdwYWJ1ZiAqIHdwYXNfd3BzX25mY19jb25maWdfdG9rZW4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJICBpbnQgbmRlZikKK3sKKyNpZmRlZiBDT05GSUdfQVAKKwlpZiAod3BhX3MtPmFwX2lmYWNlKQorCQlyZXR1cm4gd3Bhc19hcF93cHNfbmZjX2NvbmZpZ190b2tlbih3cGFfcywgbmRlZik7CisjZW5kaWYgLyogQ09ORklHX0FQICovCisJcmV0dXJuIE5VTEw7Cit9CisKKwogc3RydWN0IHdwYWJ1ZiAqIHdwYXNfd3BzX25mY190b2tlbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBpbnQgbmRlZikKIHsKKwlpZiAod3BhX3MtPmNvbmYtPndwc19uZmNfcHdfZnJvbV9jb25maWcpIHsKKwkJcmV0dXJuIHdwc19uZmNfdG9rZW5fYnVpbGQobmRlZiwKKwkJCQkJICAgd3BhX3MtPmNvbmYtPndwc19uZmNfZGV2X3B3X2lkLAorCQkJCQkgICB3cGFfcy0+Y29uZi0+d3BzX25mY19kaF9wdWJrZXksCisJCQkJCSAgIHdwYV9zLT5jb25mLT53cHNfbmZjX2Rldl9wdyk7CisJfQorCiAJcmV0dXJuIHdwc19uZmNfdG9rZW5fZ2VuKG5kZWYsICZ3cGFfcy0+Y29uZi0+d3BzX25mY19kZXZfcHdfaWQsCiAJCQkJICZ3cGFfcy0+Y29uZi0+d3BzX25mY19kaF9wdWJrZXksCiAJCQkJICZ3cGFfcy0+Y29uZi0+d3BzX25mY19kaF9wcml2a2V5LApAQCAtMTg1MSw2ICsxODk1LDggQEAKIHN0YXRpYyBpbnQgd3Bhc193cHNfdXNlX2NyZWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCSAgICAgc3RydWN0IHdwc19wYXJzZV9hdHRyICphdHRyKQogeworCXdwYV9zLT53cHNfYXBfY2hhbm5lbCA9IDA7CisKIAlpZiAod3BzX29vYl91c2VfY3JlZCh3cGFfcy0+d3BzLCBhdHRyKSA8IDApCiAJCXJldHVybiAtMTsKIApAQCAtMTg2MSw2ICsxOTA3LDI0IEBACiAJCSAgICJiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgY3JlZGVudGlhbCBhZGRlZCIpOwogCXdwYV9zLT5ub3JtYWxfc2NhbnMgPSAwOwogCXdwYV9zdXBwbGljYW50X3JlaW5pdF9hdXRvc2Nhbih3cGFfcyk7CisJaWYgKHdwYV9zLT53cHNfYXBfY2hhbm5lbCkgeworCQl1MTYgY2hhbiA9IHdwYV9zLT53cHNfYXBfY2hhbm5lbDsKKwkJaW50IGZyZXEgPSAwOworCisJCWlmIChjaGFuID49IDEgJiYgY2hhbiA8PSAxMykKKwkJCWZyZXEgPSAyNDA3ICsgNSAqIGNoYW47CisJCWVsc2UgaWYgKGNoYW4gPT0gMTQpCisJCQlmcmVxID0gMjQ4NDsKKwkJZWxzZSBpZiAoY2hhbiA+PSAzMCkKKwkJCWZyZXEgPSA1MDAwICsgNSAqIGNoYW47CisKKwkJaWYgKGZyZXEpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BTOiBDcmVkZW50aWFsIGluZGljYXRlZCAiCisJCQkJICAgIkFQIGNoYW5uZWwgJXUgLT4gJXUgTUh6IiwgY2hhbiwgZnJlcSk7CisJCQl3cGFfcy0+YWZ0ZXJfd3BzID0gNTsKKwkJCXdwYV9zLT53cHNfZnJlcSA9IGZyZXE7CisJCX0KKwl9CiAJd3BhX3MtPmRpc2Nvbm5lY3RlZCA9IDA7CiAJd3BhX3MtPnJlYXNzb2NpYXRlID0gMTsKIAl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7CkBAIC0xOTMwLDYgKzE5OTQsOTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisKK3N0cnVjdCB3cGFidWYgKiB3cGFzX3dwc19uZmNfaGFuZG92ZXJfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGludCBjcikKK3sKKwlpZiAoY3IpCisJCXJldHVybiBuZGVmX2J1aWxkX3dpZmlfaGMoMSk7CisJcmV0dXJuIG5kZWZfYnVpbGRfd2lmaV9ocigpOworfQorCisKKyNpZmRlZiBDT05GSUdfV1BTX05GQworc3RydWN0IHdwYWJ1ZiAqIHdwYXNfd3BzX2VyX25mY19oYW5kb3Zlcl9zZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJICAgICBpbnQgbmRlZiwgY29uc3QgY2hhciAqdXVpZCkKK3sKKwlzdHJ1Y3Qgd3BhYnVmICpyZXQ7CisJdTggdVtVVUlEX0xFTl07CisKKwlpZiAoIXdwYV9zLT53cHNfZXIpCisJCXJldHVybiBOVUxMOworCisJaWYgKHV1aWQgPT0gTlVMTCB8fCB1dWlkX3N0cjJiaW4odXVpZCwgdSkpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBIYW5kb3ZlciBTZWxlY3QgY2FycmllciByZWNvcmQgZm9yIFdQUyB1c2VzIHRoZSBzYW1lIGZvcm1hdCBhcworCSAqIGNvbmZpZ3VyYXRpb24gdG9rZW4uCisJICovCisJcmV0ID0gd3BzX2VyX25mY19jb25maWdfdG9rZW4od3BhX3MtPndwc19lciwgdSk7CisJaWYgKG5kZWYgJiYgcmV0KSB7CisJCXN0cnVjdCB3cGFidWYgKnRtcDsKKwkJdG1wID0gbmRlZl9idWlsZF93aWZpKHJldCk7CisJCXdwYWJ1Zl9mcmVlKHJldCk7CisJCWlmICh0bXAgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlyZXQgPSB0bXA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBDT05GSUdfV1BTX05GQyAqLworCisKK3N0cnVjdCB3cGFidWYgKiB3cGFzX3dwc19uZmNfaGFuZG92ZXJfc2VsKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJCSAgaW50IG5kZWYsIGludCBjciwgY29uc3QgY2hhciAqdXVpZCkKK3sKKwlzdHJ1Y3Qgd3BhYnVmICpyZXQ7CisJaWYgKCFjcikKKwkJcmV0dXJuIE5VTEw7CisJcmV0ID0gd3Bhc19hcF93cHNfbmZjX2hhbmRvdmVyX3NlbCh3cGFfcywgbmRlZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gd3Bhc193cHNfZXJfbmZjX2hhbmRvdmVyX3NlbCh3cGFfcywgbmRlZiwgdXVpZCk7Cit9CisKKworaW50IHdwYXNfd3BzX25mY19yeF9oYW5kb3Zlcl9yZXEoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqZGF0YSkKK3sKKwkvKiBUT0RPICovCisJcmV0dXJuIC0xOworfQorCisKK2ludCB3cGFzX3dwc19uZmNfcnhfaGFuZG92ZXJfc2VsKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJIGNvbnN0IHN0cnVjdCB3cGFidWYgKmRhdGEpCit7CisJc3RydWN0IHdwYWJ1ZiAqd3BzOworCWludCByZXQ7CisKKwl3cHMgPSBuZGVmX3BhcnNlX3dpZmkoZGF0YSk7CisJaWYgKHdwcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IFJlY2VpdmVkIGFwcGxpY2F0aW9uL3ZuZC53ZmEud3NjICIKKwkJICAgInBheWxvYWQgZnJvbSBORkMgY29ubmVjdGlvbiBoYW5kb3ZlciIpOworCXdwYV9oZXhkdW1wX2J1Zl9rZXkoTVNHX0RFQlVHLCAiV1BTOiBORkMgcGF5bG9hZCIsIHdwcyk7CisJcmV0ID0gd3Bhc193cHNfbmZjX3RhZ19wcm9jZXNzKHdwYV9zLCB3cHMpOworCXdwYWJ1Zl9mcmVlKHdwcyk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCB3cGFzX3dwc19uZmNfcmVwb3J0X2hhbmRvdmVyKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJIGNvbnN0IHN0cnVjdCB3cGFidWYgKnJlcSwKKwkJCQkgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqc2VsKQoreworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiTkZDOiBXUFMgY29ubmVjdGlvbiBoYW5kb3ZlciByZXBvcnRlZCIpOworCXdwYV9oZXhkdW1wX2J1Zl9rZXkoTVNHX0RFQlVHLCAiV1BTOiBDYXJyaWVyIHJlY29yZCBpbiByZXF1ZXN0IiwgcmVxKTsKKwl3cGFfaGV4ZHVtcF9idWZfa2V5KE1TR19ERUJVRywgIldQUzogQ2FycmllciByZWNvcmQgaW4gc2VsZWN0Iiwgc2VsKTsKKwlyZXR1cm4gd3Bhc193cHNfbmZjX3J4X2hhbmRvdmVyX3NlbCh3cGFfcywgc2VsKTsKK30KKwogI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCiAKIApkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvd3BzX3N1cHBsaWNhbnQuaCBiL3dwYV9zdXBwbGljYW50L3dwc19zdXBwbGljYW50LmgKaW5kZXggZDVlYjNiNi4uOGJiOTU0NiAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvd3BzX3N1cHBsaWNhbnQuaAorKysgYi93cGFfc3VwcGxpY2FudC93cHNfc3VwcGxpY2FudC5oCkBAIC05LDcgKzksNiBAQAogI2lmbmRlZiBXUFNfU1VQUExJQ0FOVF9ICiAjZGVmaW5lIFdQU19TVVBQTElDQU5UX0gKIAotc3RydWN0IHdwYV9zY2FuX3JlczsKIHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHRzOwogCiAjaWZkZWYgQ09ORklHX1dQUwpAQCAtMzUsOCArMzQsNiBAQAogaW50IHdwYXNfd3BzX3N0YXJ0X3BpbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqYnNzaWQsCiAJCSAgICAgICBjb25zdCBjaGFyICpwaW4sIGludCBwMnBfZ3JvdXAsIHUxNiBkZXZfcHdfaWQpOwogaW50IHdwYXNfd3BzX2NhbmNlbChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKLWludCB3cGFzX3dwc19zdGFydF9vb2Ioc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqZGV2aWNlX3R5cGUsCi0JCSAgICAgICBjaGFyICpwYXRoLCBjaGFyICptZXRob2QsIGNoYXIgKm5hbWUpOwogaW50IHdwYXNfd3BzX3N0YXJ0X3JlZyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqYnNzaWQsCiAJCSAgICAgICBjb25zdCBjaGFyICpwaW4sIHN0cnVjdCB3cHNfbmV3X2FwX3NldHRpbmdzICpzZXR0aW5ncyk7CiBpbnQgd3Bhc193cHNfc3NpZF9ic3NfbWF0Y2goc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKQEAgLTY1LDEwICs2MiwyMiBAQAogaW50IHdwYXNfd3BzX3Rlcm1pbmF0ZV9wZW5kaW5nKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOwogaW50IHdwYXNfd3BzX2luX3Byb2dyZXNzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOwogdm9pZCB3cGFzX3dwc191cGRhdGVfY29uZmlnKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOworc3RydWN0IHdwYWJ1ZiAqIHdwYXNfd3BzX25mY19jb25maWdfdG9rZW4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJICBpbnQgbmRlZik7CiBzdHJ1Y3Qgd3BhYnVmICogd3Bhc193cHNfbmZjX3Rva2VuKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGludCBuZGVmKTsKIGludCB3cGFzX3dwc19zdGFydF9uZmMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmJzc2lkKTsKIGludCB3cGFzX3dwc19uZmNfdGFnX3JlYWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCSAgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqZGF0YSk7CitzdHJ1Y3Qgd3BhYnVmICogd3Bhc193cHNfbmZjX2hhbmRvdmVyX3JlcShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBpbnQgY3IpOworc3RydWN0IHdwYWJ1ZiAqIHdwYXNfd3BzX25mY19oYW5kb3Zlcl9zZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJICBpbnQgbmRlZiwgaW50IGNyLCBjb25zdCBjaGFyICp1dWlkKTsKK2ludCB3cGFzX3dwc19uZmNfcnhfaGFuZG92ZXJfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJIGNvbnN0IHN0cnVjdCB3cGFidWYgKmRhdGEpOworaW50IHdwYXNfd3BzX25mY19yeF9oYW5kb3Zlcl9zZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqZGF0YSk7CitpbnQgd3Bhc193cHNfbmZjX3JlcG9ydF9oYW5kb3ZlcihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCSBjb25zdCBzdHJ1Y3Qgd3BhYnVmICpyZXEsCisJCQkJIGNvbnN0IHN0cnVjdCB3cGFidWYgKnNlbCk7CiB2b2lkIHdwYXNfd3BzX3VwZGF0ZV9hcF9pbmZvKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkgICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHRzICpzY2FuX3Jlcyk7CiB2b2lkIHdwYXNfd3BzX25vdGlmeV9hc3NvYyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqYnNzaWQpOwpAQCAtOTYsMTQgKzEwNSwxNCBAQAogCiBzdGF0aWMgaW5saW5lIGludCB3cGFzX3dwc19zc2lkX2Jzc19tYXRjaChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCQkgIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCwKLQkJCQkJICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpic3MpCisJCQkJCSAgc3RydWN0IHdwYV9ic3MgKmJzcykKIHsKIAlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHdwYXNfd3BzX3NzaWRfd2lsZGNhcmRfb2soc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkJICAgIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCwKLQkJCQkJICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXMgKmJzcykKKwkJCQkJICAgIHN0cnVjdCB3cGFfYnNzICpic3MpCiB7CiAJcmV0dXJuIDA7CiB9Cg==