LyoKICogSUJNIEFTTSBTZXJ2aWNlIFByb2Nlc3NvciBEZXZpY2UgRHJpdmVyCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAqCiAqIEF1dGhvcnM6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICogICAgICAgICAgVmVybm9uIE1hdWVyeSA8dmVybnV4QHVzLmlibS5jb20+CiAqCiAqLwoKLyogUmVtb3RlIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudCBoYW5kbGluZyBmdW5jdGlvbnMgKi8KCiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgImlibWFzbS5oIgojaW5jbHVkZSAicmVtb3RlLmgiCgpzdGF0aWMgaW50IHhtYXggPSAxNjAwOwpzdGF0aWMgaW50IHltYXggPSAxMjAwOwoKCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCB4bGF0ZV9oaWdoW1hMQVRFX1NJWkVdID0gewoJW0tFWV9TWU1fRU5URVIgJiAweGZmXSA9IEtFWV9FTlRFUiwKCVtLRVlfU1lNX0tQU0xBU0ggJiAweGZmXSA9IEtFWV9LUFNMQVNILAoJW0tFWV9TWU1fS1BTVEFSICYgMHhmZl0gPSBLRVlfS1BBU1RFUklTSywKCVtLRVlfU1lNX0tQTUlOVVMgJiAweGZmXSA9IEtFWV9LUE1JTlVTLAoJW0tFWV9TWU1fS1BET1QgJiAweGZmXSA9IEtFWV9LUERPVCwKCVtLRVlfU1lNX0tQUExVUyAmIDB4ZmZdID0gS0VZX0tQUExVUywKCVtLRVlfU1lNX0tQMCAmIDB4ZmZdID0gS0VZX0tQMCwKCVtLRVlfU1lNX0tQMSAmIDB4ZmZdID0gS0VZX0tQMSwKCVtLRVlfU1lNX0tQMiAmIDB4ZmZdID0gS0VZX0tQMiwgW0tFWV9TWU1fS1BET1dOICYgMHhmZl0gPSBLRVlfS1AyLAoJW0tFWV9TWU1fS1AzICYgMHhmZl0gPSBLRVlfS1AzLAoJW0tFWV9TWU1fS1A0ICYgMHhmZl0gPSBLRVlfS1A0LCBbS0VZX1NZTV9LUExFRlQgJiAweGZmXSA9IEtFWV9LUDQsCglbS0VZX1NZTV9LUDUgJiAweGZmXSA9IEtFWV9LUDUsCglbS0VZX1NZTV9LUDYgJiAweGZmXSA9IEtFWV9LUDYsIFtLRVlfU1lNX0tQUklHSFQgJiAweGZmXSA9IEtFWV9LUDYsCglbS0VZX1NZTV9LUDcgJiAweGZmXSA9IEtFWV9LUDcsCglbS0VZX1NZTV9LUDggJiAweGZmXSA9IEtFWV9LUDgsIFtLRVlfU1lNX0tQVVAgJiAweGZmXSA9IEtFWV9LUDgsCglbS0VZX1NZTV9LUDkgJiAweGZmXSA9IEtFWV9LUDksCglbS0VZX1NZTV9CS19TUEMgJiAweGZmXSA9IEtFWV9CQUNLU1BBQ0UsCglbS0VZX1NZTV9UQUIgJiAweGZmXSA9IEtFWV9UQUIsCglbS0VZX1NZTV9DVFJMICYgMHhmZl0gPSBLRVlfTEVGVENUUkwsCglbS0VZX1NZTV9BTFQgJiAweGZmXSA9IEtFWV9MRUZUQUxULAoJW0tFWV9TWU1fSU5TRVJUICYgMHhmZl0gPSBLRVlfSU5TRVJULAoJW0tFWV9TWU1fREVMRVRFICYgMHhmZl0gPSBLRVlfREVMRVRFLAoJW0tFWV9TWU1fU0hJRlQgJiAweGZmXSA9IEtFWV9MRUZUU0hJRlQsCglbS0VZX1NZTV9VQVJST1cgJiAweGZmXSA9IEtFWV9VUCwKCVtLRVlfU1lNX0RBUlJPVyAmIDB4ZmZdID0gS0VZX0RPV04sCglbS0VZX1NZTV9MQVJST1cgJiAweGZmXSA9IEtFWV9MRUZULAoJW0tFWV9TWU1fUkFSUk9XICYgMHhmZl0gPSBLRVlfUklHSFQsCglbS0VZX1NZTV9FU0NBUEUgJiAweGZmXSA9IEtFWV9FU0MsCiAgICAgICAgW0tFWV9TWU1fUEFHRVVQICYgMHhmZl0gPSBLRVlfUEFHRVVQLAogICAgICAgIFtLRVlfU1lNX1BBR0VET1dOICYgMHhmZl0gPSBLRVlfUEFHRURPV04sCiAgICAgICAgW0tFWV9TWU1fSE9NRSAmIDB4ZmZdID0gS0VZX0hPTUUsCiAgICAgICAgW0tFWV9TWU1fRU5EICYgMHhmZl0gPSBLRVlfRU5ELAoJW0tFWV9TWU1fRjEgJiAweGZmXSA9IEtFWV9GMSwKCVtLRVlfU1lNX0YyICYgMHhmZl0gPSBLRVlfRjIsCglbS0VZX1NZTV9GMyAmIDB4ZmZdID0gS0VZX0YzLAoJW0tFWV9TWU1fRjQgJiAweGZmXSA9IEtFWV9GNCwKCVtLRVlfU1lNX0Y1ICYgMHhmZl0gPSBLRVlfRjUsCglbS0VZX1NZTV9GNiAmIDB4ZmZdID0gS0VZX0Y2LAoJW0tFWV9TWU1fRjcgJiAweGZmXSA9IEtFWV9GNywKCVtLRVlfU1lNX0Y4ICYgMHhmZl0gPSBLRVlfRjgsCglbS0VZX1NZTV9GOSAmIDB4ZmZdID0gS0VZX0Y5LAoJW0tFWV9TWU1fRjEwICYgMHhmZl0gPSBLRVlfRjEwLAoJW0tFWV9TWU1fRjExICYgMHhmZl0gPSBLRVlfRjExLAoJW0tFWV9TWU1fRjEyICYgMHhmZl0gPSBLRVlfRjEyLAoJW0tFWV9TWU1fQ0FQX0xPQ0sgJiAweGZmXSA9IEtFWV9DQVBTTE9DSywKCVtLRVlfU1lNX05VTV9MT0NLICYgMHhmZl0gPSBLRVlfTlVNTE9DSywKCVtLRVlfU1lNX1NDUl9MT0NLICYgMHhmZl0gPSBLRVlfU0NST0xMTE9DSywKfTsKc3RhdGljIHVuc2lnbmVkIHNob3J0IHhsYXRlW1hMQVRFX1NJWkVdID0gewoJW05PX0tFWUNPREVdID0gS0VZX1JFU0VSVkVELAoJW0tFWV9TWU1fU1BBQ0VdID0gS0VZX1NQQUNFLAoJW0tFWV9TWU1fVElMREVdID0gS0VZX0dSQVZFLCAgICAgICAgW0tFWV9TWU1fQktUSUNdID0gS0VZX0dSQVZFLAoJW0tFWV9TWU1fT05FXSA9IEtFWV8xLCAgICAgICAgICAgICAgW0tFWV9TWU1fQkFOR10gPSBLRVlfMSwKCVtLRVlfU1lNX1RXT10gPSBLRVlfMiwgICAgICAgICAgICAgIFtLRVlfU1lNX0FUXSA9IEtFWV8yLAoJW0tFWV9TWU1fVEhSRUVdID0gS0VZXzMsICAgICAgICAgICAgW0tFWV9TWU1fUE9VTkRdID0gS0VZXzMsCglbS0VZX1NZTV9GT1VSXSA9IEtFWV80LCAgICAgICAgICAgICBbS0VZX1NZTV9ET0xMQVJdID0gS0VZXzQsCglbS0VZX1NZTV9GSVZFXSA9IEtFWV81LCAgICAgICAgICAgICBbS0VZX1NZTV9QRVJDRU5UXSA9IEtFWV81LAoJW0tFWV9TWU1fU0lYXSA9IEtFWV82LCAgICAgICAgICAgICAgW0tFWV9TWU1fQ0FSQVRdID0gS0VZXzYsCglbS0VZX1NZTV9TRVZFTl0gPSBLRVlfNywgICAgICAgICAgICBbS0VZX1NZTV9BTVBFUl0gPSBLRVlfNywKCVtLRVlfU1lNX0VJR0hUXSA9IEtFWV84LCAgICAgICAgICAgIFtLRVlfU1lNX1NUQVJdID0gS0VZXzgsCglbS0VZX1NZTV9OSU5FXSA9IEtFWV85LCAgICAgICAgICAgICBbS0VZX1NZTV9MUEFSRU5dID0gS0VZXzksCglbS0VZX1NZTV9aRVJPXSA9IEtFWV8wLCAgICAgICAgICAgICBbS0VZX1NZTV9SUEFSRU5dID0gS0VZXzAsCglbS0VZX1NZTV9NSU5VU10gPSBLRVlfTUlOVVMsICAgICAgICBbS0VZX1NZTV9VU0NPUkVdID0gS0VZX01JTlVTLAoJW0tFWV9TWU1fRVFVQUxdID0gS0VZX0VRVUFMLCAgICAgICAgW0tFWV9TWU1fUExVU10gPSBLRVlfRVFVQUwsCglbS0VZX1NZTV9MQlJLVF0gPSBLRVlfTEVGVEJSQUNFLCAgICBbS0VZX1NZTV9MQ1VSTFldID0gS0VZX0xFRlRCUkFDRSwKCVtLRVlfU1lNX1JCUktUXSA9IEtFWV9SSUdIVEJSQUNFLCAgIFtLRVlfU1lNX1JDVVJMWV0gPSBLRVlfUklHSFRCUkFDRSwKCVtLRVlfU1lNX1NMQVNIXSA9IEtFWV9CQUNLU0xBU0gsICAgIFtLRVlfU1lNX1BJUEVdID0gS0VZX0JBQ0tTTEFTSCwKCVtLRVlfU1lNX1RJQ10gPSBLRVlfQVBPU1RST1BIRSwgICAgIFtLRVlfU1lNX1FVT1RFXSA9IEtFWV9BUE9TVFJPUEhFLAoJW0tFWV9TWU1fU0VNSUNdID0gS0VZX1NFTUlDT0xPTiwgICAgW0tFWV9TWU1fQ09MT05dID0gS0VZX1NFTUlDT0xPTiwKCVtLRVlfU1lNX0NPTU1BXSA9IEtFWV9DT01NQSwgICAgICAgIFtLRVlfU1lNX0xUXSA9IEtFWV9DT01NQSwKCVtLRVlfU1lNX1BFUklPRF0gPSBLRVlfRE9ULCAgICAgICAgIFtLRVlfU1lNX0dUXSA9IEtFWV9ET1QsCglbS0VZX1NZTV9CU0xBU0hdID0gS0VZX1NMQVNILCAgICAgICBbS0VZX1NZTV9RTUFSS10gPSBLRVlfU0xBU0gsCglbS0VZX1NZTV9BXSA9IEtFWV9BLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9hXSA9IEtFWV9BLAoJW0tFWV9TWU1fQl0gPSBLRVlfQiwgICAgICAgICAgICAgICAgW0tFWV9TWU1fYl0gPSBLRVlfQiwKCVtLRVlfU1lNX0NdID0gS0VZX0MsICAgICAgICAgICAgICAgIFtLRVlfU1lNX2NdID0gS0VZX0MsCglbS0VZX1NZTV9EXSA9IEtFWV9ELCAgICAgICAgICAgICAgICBbS0VZX1NZTV9kXSA9IEtFWV9ELAoJW0tFWV9TWU1fRV0gPSBLRVlfRSwgICAgICAgICAgICAgICAgW0tFWV9TWU1fZV0gPSBLRVlfRSwKCVtLRVlfU1lNX0ZdID0gS0VZX0YsICAgICAgICAgICAgICAgIFtLRVlfU1lNX2ZdID0gS0VZX0YsCglbS0VZX1NZTV9HXSA9IEtFWV9HLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9nXSA9IEtFWV9HLAoJW0tFWV9TWU1fSF0gPSBLRVlfSCwgICAgICAgICAgICAgICAgW0tFWV9TWU1faF0gPSBLRVlfSCwKCVtLRVlfU1lNX0ldID0gS0VZX0ksICAgICAgICAgICAgICAgIFtLRVlfU1lNX2ldID0gS0VZX0ksCglbS0VZX1NZTV9KXSA9IEtFWV9KLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9qXSA9IEtFWV9KLAoJW0tFWV9TWU1fS10gPSBLRVlfSywgICAgICAgICAgICAgICAgW0tFWV9TWU1fa10gPSBLRVlfSywKCVtLRVlfU1lNX0xdID0gS0VZX0wsICAgICAgICAgICAgICAgIFtLRVlfU1lNX2xdID0gS0VZX0wsCglbS0VZX1NZTV9NXSA9IEtFWV9NLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9tXSA9IEtFWV9NLAoJW0tFWV9TWU1fTl0gPSBLRVlfTiwgICAgICAgICAgICAgICAgW0tFWV9TWU1fbl0gPSBLRVlfTiwKCVtLRVlfU1lNX09dID0gS0VZX08sICAgICAgICAgICAgICAgIFtLRVlfU1lNX29dID0gS0VZX08sCglbS0VZX1NZTV9QXSA9IEtFWV9QLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9wXSA9IEtFWV9QLAoJW0tFWV9TWU1fUV0gPSBLRVlfUSwgICAgICAgICAgICAgICAgW0tFWV9TWU1fcV0gPSBLRVlfUSwKCVtLRVlfU1lNX1JdID0gS0VZX1IsICAgICAgICAgICAgICAgIFtLRVlfU1lNX3JdID0gS0VZX1IsCglbS0VZX1NZTV9TXSA9IEtFWV9TLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9zXSA9IEtFWV9TLAoJW0tFWV9TWU1fVF0gPSBLRVlfVCwgICAgICAgICAgICAgICAgW0tFWV9TWU1fdF0gPSBLRVlfVCwKCVtLRVlfU1lNX1VdID0gS0VZX1UsICAgICAgICAgICAgICAgIFtLRVlfU1lNX3VdID0gS0VZX1UsCglbS0VZX1NZTV9WXSA9IEtFWV9WLCAgICAgICAgICAgICAgICBbS0VZX1NZTV92XSA9IEtFWV9WLAoJW0tFWV9TWU1fV10gPSBLRVlfVywgICAgICAgICAgICAgICAgW0tFWV9TWU1fd10gPSBLRVlfVywKCVtLRVlfU1lNX1hdID0gS0VZX1gsICAgICAgICAgICAgICAgIFtLRVlfU1lNX3hdID0gS0VZX1gsCglbS0VZX1NZTV9ZXSA9IEtFWV9ZLCAgICAgICAgICAgICAgICBbS0VZX1NZTV95XSA9IEtFWV9ZLAoJW0tFWV9TWU1fWl0gPSBLRVlfWiwgICAgICAgICAgICAgICAgW0tFWV9TWU1fel0gPSBLRVlfWiwKfTsKCnN0YXRpYyBjaGFyIHJlbW90ZV9tb3VzZV9uYW1lW10gPSAiaWJtYXNtIFJTQSBJIHJlbW90ZSBtb3VzZSI7CnN0YXRpYyBjaGFyIHJlbW90ZV9rZXliZF9uYW1lW10gPSAiaWJtYXNtIFJTQSBJIHJlbW90ZSBrZXlib2FyZCI7CgpzdGF0aWMgdm9pZCBwcmludF9pbnB1dChzdHJ1Y3QgcmVtb3RlX2lucHV0ICppbnB1dCkKewoJaWYgKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfTU9VU0UpIHsKCQl1bnNpZ25lZCBjaGFyIGJ1dHRvbnMgPSBpbnB1dC0+bW91c2VfYnV0dG9uczsKCQlkYmcoInJlbW90ZSBtb3VzZSBtb3ZlbWVudDogKHgseSk9KCVkLCVkKSVzJXMlcyVzXG4iLAoJCQlpbnB1dC0+ZGF0YS5tb3VzZS54LCBpbnB1dC0+ZGF0YS5tb3VzZS55LAoJCQkoYnV0dG9ucyk/IiAtLSBidXR0b25zOiI6IiIsCgkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9MRUZUKT8ibGVmdCAiOiIiLAoJCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTUlERExFKT8ibWlkZGxlICI6IiIsCgkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9SSUdIVCk/InJpZ2h0IjoiIgoJCSAgICAgICk7Cgl9IGVsc2UgewoJCWRiZygicmVtb3RlIGtleXByZXNzIChjb2RlLCBmbGFnLCBkb3duKToiCgkJCSAgICIlZCAoMHgleCkgWzB4JXhdIFsweCV4XVxuIiwKCQkJCWlucHV0LT5kYXRhLmtleWJvYXJkLmtleV9jb2RlLAoJCQkJaW5wdXQtPmRhdGEua2V5Ym9hcmQua2V5X2NvZGUsCgkJCQlpbnB1dC0+ZGF0YS5rZXlib2FyZC5rZXlfZmxhZywKCQkJCWlucHV0LT5kYXRhLmtleWJvYXJkLmtleV9kb3duCgkJICAgICAgKTsKCX0KfQoKc3RhdGljIHZvaWQgc2VuZF9tb3VzZV9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCByZW1vdGVfaW5wdXQgKmlucHV0KQp7Cgl1bnNpZ25lZCBjaGFyIGJ1dHRvbnMgPSBpbnB1dC0+bW91c2VfYnV0dG9uczsKCglpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIGlucHV0LT5kYXRhLm1vdXNlLngpOwoJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCBpbnB1dC0+ZGF0YS5tb3VzZS55KTsKCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTEVGVCk7CglpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTUlERExFKTsKCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGJ1dHRvbnMgJiBSRU1PVEVfQlVUVE9OX1JJR0hUKTsKCWlucHV0X3N5bmMoZGV2KTsKfQoKc3RhdGljIHZvaWQgc2VuZF9rZXlib2FyZF9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCgkJc3RydWN0IHJlbW90ZV9pbnB1dCAqaW5wdXQpCnsKCXVuc2lnbmVkIGludCBrZXk7Cgl1bnNpZ25lZCBzaG9ydCBjb2RlID0gaW5wdXQtPmRhdGEua2V5Ym9hcmQua2V5X2NvZGU7CgoJaWYgKGNvZGUgJiAweGZmMDApCgkJa2V5ID0geGxhdGVfaGlnaFtjb2RlICYgMHhmZl07CgllbHNlCgkJa2V5ID0geGxhdGVbY29kZV07CglpbnB1dF9yZXBvcnRfa2V5KGRldiwga2V5LCAoaW5wdXQtPmRhdGEua2V5Ym9hcmQua2V5X2Rvd24pID8gMSA6IDApOwoJaW5wdXRfc3luYyhkZXYpOwp9Cgp2b2lkIGlibWFzbV9oYW5kbGVfbW91c2VfaW50ZXJydXB0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApCnsKCXVuc2lnbmVkIGxvbmcgcmVhZGVyOwoJdW5zaWduZWQgbG9uZyB3cml0ZXI7CglzdHJ1Y3QgcmVtb3RlX2lucHV0IGlucHV0OwoKCXJlYWRlciA9IGdldF9xdWV1ZV9yZWFkZXIoc3ApOwoJd3JpdGVyID0gZ2V0X3F1ZXVlX3dyaXRlcihzcCk7CgoJd2hpbGUgKHJlYWRlciAhPSB3cml0ZXIpIHsKCQltZW1jcHlfZnJvbWlvKCZpbnB1dCwgZ2V0X3F1ZXVlX2VudHJ5KHNwLCByZWFkZXIpLAoJCQkJc2l6ZW9mKHN0cnVjdCByZW1vdGVfaW5wdXQpKTsKCgkJcHJpbnRfaW5wdXQoJmlucHV0KTsKCQlpZiAoaW5wdXQudHlwZSA9PSBJTlBVVF9UWVBFX01PVVNFKSB7CgkJCXNlbmRfbW91c2VfZXZlbnQoc3AtPnJlbW90ZS5tb3VzZV9kZXYsICZpbnB1dCk7CgkJfSBlbHNlIGlmIChpbnB1dC50eXBlID09IElOUFVUX1RZUEVfS0VZQk9BUkQpIHsKCQkJc2VuZF9rZXlib2FyZF9ldmVudChzcC0+cmVtb3RlLmtleWJkX2RldiwgJmlucHV0KTsKCQl9IGVsc2UKCQkJYnJlYWs7CgoJCXJlYWRlciA9IGFkdmFuY2VfcXVldWVfcmVhZGVyKHNwLCByZWFkZXIpOwoJCXdyaXRlciA9IGdldF9xdWV1ZV93cml0ZXIoc3ApOwoJfQp9CgppbnQgaWJtYXNtX2luaXRfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKQp7CgkvKiBzZXQgdXAgdGhlIG1vdXNlIGlucHV0IGRldmljZSAqLwoJc3RydWN0IGlucHV0X2RldiAqbW91c2VfZGV2LCAqa2V5YmRfZGV2OwoJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KHNwLT5kZXYpOwoJaW50IGVycm9yID0gLUVOT01FTTsKCWludCBpOwoKCXNwLT5yZW1vdGUubW91c2VfZGV2ID0gbW91c2VfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CglzcC0+cmVtb3RlLmtleWJkX2RldiA9IGtleWJkX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwoKCWlmICghbW91c2VfZGV2IHx8ICFrZXliZF9kZXYpCgkJZ290byBlcnJfZnJlZV9kZXZpY2VzOwoKCW1vdXNlX2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQ0k7Cgltb3VzZV9kZXYtPmlkLnZlbmRvciA9IHBkZXYtPnZlbmRvcjsKCW1vdXNlX2Rldi0+aWQucHJvZHVjdCA9IHBkZXYtPmRldmljZTsKCW1vdXNlX2Rldi0+aWQudmVyc2lvbiA9IDE7Cgltb3VzZV9kZXYtPmV2Yml0WzBdICA9IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUyk7Cgltb3VzZV9kZXYtPmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0gQklUKEJUTl9MRUZUKSB8CgkJQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSk7CglzZXRfYml0KEJUTl9UT1VDSCwgbW91c2VfZGV2LT5rZXliaXQpOwoJbW91c2VfZGV2LT5uYW1lID0gcmVtb3RlX21vdXNlX25hbWU7CglpbnB1dF9zZXRfYWJzX3BhcmFtcyhtb3VzZV9kZXYsIEFCU19YLCAwLCB4bWF4LCAwLCAwKTsKCWlucHV0X3NldF9hYnNfcGFyYW1zKG1vdXNlX2RldiwgQUJTX1ksIDAsIHltYXgsIDAsIDApOwoKCW1vdXNlX2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQ0k7CglrZXliZF9kZXYtPmlkLnZlbmRvciA9IHBkZXYtPnZlbmRvcjsKCWtleWJkX2Rldi0+aWQucHJvZHVjdCA9IHBkZXYtPmRldmljZTsKCW1vdXNlX2Rldi0+aWQudmVyc2lvbiA9IDI7CglrZXliZF9kZXYtPmV2Yml0WzBdICA9IEJJVChFVl9LRVkpOwoJa2V5YmRfZGV2LT5uYW1lID0gcmVtb3RlX2tleWJkX25hbWU7CgoJZm9yIChpID0gMDsgaSA8IFhMQVRFX1NJWkU7IGkrKykgewoJCWlmICh4bGF0ZV9oaWdoW2ldKQoJCQlzZXRfYml0KHhsYXRlX2hpZ2hbaV0sIGtleWJkX2Rldi0+a2V5Yml0KTsKCQlpZiAoeGxhdGVbaV0pCgkJCXNldF9iaXQoeGxhdGVbaV0sIGtleWJkX2Rldi0+a2V5Yml0KTsKCX0KCgllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShtb3VzZV9kZXYpOwoJaWYgKGVycm9yKQoJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlczsKCgllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShrZXliZF9kZXYpOwoJaWYgKGVycm9yKQoJCWdvdG8gZXJyX3VucmVnaXN0ZXJfbW91c2VfZGV2OwoKCWVuYWJsZV9tb3VzZV9pbnRlcnJ1cHRzKHNwKTsKCglwcmludGsoS0VSTl9JTkZPICJpYm1hc20gcmVtb3RlIHJlc3BvbmRpbmcgdG8gZXZlbnRzIG9uIFJTQSBjYXJkICVkXG4iLCBzcC0+bnVtYmVyKTsKCglyZXR1cm4gMDsKCiBlcnJfdW5yZWdpc3Rlcl9tb3VzZV9kZXY6CglpbnB1dF91bnJlZ2lzdGVyX2RldmljZShtb3VzZV9kZXYpOwoJbW91c2VfZGV2ID0gTlVMTDsgLyogc28gd2UgZG9uJ3QgdHJ5IHRvIGZyZWUgaXQgYWdhaW4gYmVsb3cgKi8KIGVycl9mcmVlX2RldmljZXM6CglpbnB1dF9mcmVlX2RldmljZShtb3VzZV9kZXYpOwoJaW5wdXRfZnJlZV9kZXZpY2Uoa2V5YmRfZGV2KTsKCglyZXR1cm4gZXJyb3I7Cn0KCnZvaWQgaWJtYXNtX2ZyZWVfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKQp7CglkaXNhYmxlX21vdXNlX2ludGVycnVwdHMoc3ApOwoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoc3AtPnJlbW90ZS5tb3VzZV9kZXYpOwoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoc3AtPnJlbW90ZS5rZXliZF9kZXYpOwp9Cgo=