ZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvaW5jbHVkZS9saW51eC9zb2Mvc2Mvc3BpbmxvY2suaCBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAvaW5jbHVkZS9saW51eC9zb2Mvc2Mvc3BpbmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjVlN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBzdHJlYW0vbGludXgtNS4xMC9pbmNsdWRlL2xpbnV4L3NvYy9zYy9zcGlubG9jay5oCkBAIC0wLDAgKzEsMTExIEBACisvKg0KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTUgWlRFLVRTUA0KKyAqDQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKg0KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICovDQorDQorI2lmbmRlZiBfU1BJTkxPQ0tfSA0KKyNkZWZpbmUgX1NQSU5MT0NLX0gNCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIGZpbGVzDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvLyNpbmNsdWRlIDxzcGlubG9ja19jb20uaD4NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb3MNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCisjZGVmaW5lIFNQSU5MT0NLX0lPQ19NQUdJQyAgICAgJ1MnDQorDQorLyppb2N0bCBjbWQgdXNkIGJ5IGRldmljZSovDQorI2RlZmluZSBTUElOTE9DS19HRVRfU1RBVFVTICAgICAgIF9JT1dSKFNQSU5MT0NLX0lPQ19NQUdJQywgMSwgY2hhciAqKQ0KKw0KKw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisJQ09SRV9JRF9QUz0yMTAsDQorCUNPUkVfSURfUEhZPTIxMSwNCisJQ09SRV9JRF9aU1A9MjEyLA0KKwlDT1JFX0lEX00wPTIxMywNCisJQ09SRV9JRF9BUD0yMTQsDQorCUNPUkVfSURfTlVNID0gMjE1DQorfSB6dGVfY29yZWlkOw0KKy8qILHqyrbTsrz+y/gqLw0KK3R5cGVkZWYgZW51bQ0KK3sNCisJUENVX0hXTE9DSyAgPSAwLC8qUENVKi8NCisJQ0xLX0hXTE9DSyAgPSAxLC8qQ2xvY2sqLw0KKwlSRUdMT0NLX0hXTE9DSywNCisJU09GVExPQ0tfSFdMT0NLLA0KKwlIV0xPQ0tfTlVNDQorfSBlbWh3X2xvY2tfaWQ7DQorDQorLyogserKtsjtvP7L+CovDQordHlwZWRlZiBlbnVtDQorew0KKwlJMkMwX1NGTE9DSyA9IDAsLyppMmMwKi8NCisJSTJDMV9TRkxPQ0sgPSAxLC8qaTJjMSovDQorCUkyQzJfU0ZMT0NLID0gMiwvKnBtaWMtaTJjKi8NCisJTkFORF9TRkxPQ0sgPSAzLC8qTkFORCovDQorCVNEMF9TRkxPQ0ssIC8qZm9yIHNkMCovDQorCVNEMV9TRkxPQ0ssIC8qZm9yIHNkMSovDQorCUFEQ19TRkxPQ0ssIC8qZm9yIGFkYyovDQorCVVBUlRfU0ZMT0NLLA0KKwlQTUlDX1NGTE9DSywNCisJU0ZMT0NLX0lEOSwNCisJU0ZMT0NLX0lEMTAsDQorCVNGTE9DS19JRDExLA0KKwlTRkxPQ0tfSUQxMiwNCisJU0ZMT0NLX0lEMTMsDQorCVNGTE9DS19JRDE0LA0KKwlTRkxPQ0tfSUQxNSwNCisJU0ZMT0NLX0lEMTYsDQorCVNGTE9DS19JRDE3LA0KKwlTRkxPQ0tfSUQxOCwNCisJU0ZMT0NLX0lEMTksDQorCVNGTE9DS19JRDIwLA0KKwlTRkxPQ0tfSUQyMSwNCisJU0ZMT0NLX0lEMjIsDQorCVNGTE9DS19JRDIzLA0KKwlTRkxPQ0tfSUQyNCwNCisJU0ZMT0NLX0lEMjUsDQorCVNGTE9DS19JRDI2LA0KKwlTRkxPQ0tfSUQyNywNCisJU0ZMT0NLX0lEMjgsDQorCVNGTE9DS19JRDI5LA0KKwlTRkxPQ0tfSUQzMCwNCisJUkVHX1NGTE9DSyA9IDMxLC8qUkVHKi8NCisJU0ZMT0NLX05VTQ0KK30gZW1zZl9sb2NrX2lkOw0KKw0KKw0KK3ZvaWQgaHdfc3Bpbl9sb2NrKHUzMiBod2lkKTsNCit2b2lkIGh3X3NwaW5fdW5sb2NrKHUzMiBod2lkKTsNCit2b2lkIHNvZnRfc3Bpbl9sb2NrKHUzMiBzZmlkKTsNCit2b2lkIHNvZnRfc3Bpbl91bmxvY2sodTMyIHNmaWQpOw0KK3ZvaWQgIHJlZ19zcGluX2xvY2sodm9pZCk7DQordm9pZCAgcmVnX3NwaW5fdW5sb2NrKHZvaWQpOw0KK3ZvaWQgIHNvZnRfc3Bpbl9sb2NrX3BzbShlbXNmX2xvY2tfaWQgc2ZpZCk7DQordm9pZCAgc29mdF9zcGluX3VubG9ja19wc20oZW1zZl9sb2NrX2lkIHNmaWQpOw0KKw0KK3ZvaWQgenhfc3BpbmxvY2tfaW5pdCh2b2lkIF9faW9tZW0gKnNwaW5sb2NrX2Jhc2UpOw0KK2ludCAgc29mdF9zcGluX2xvY2tfcHJpbnRmKGVtc2ZfbG9ja19pZCBzZmlkKTsNCisNCisjZW5kaWYvKiBfU1BJTkxPQ0tfSCAqLw0KKw0KZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvaW5jbHVkZS9saW51eC9zb2MvenRlL3NwaW5sb2NrLmggYi91cHN0cmVhbS9saW51eC01LjEwL2luY2x1ZGUvbGludXgvc29jL3p0ZS9zcGlubG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExODE5MzMKLS0tIC9kZXYvbnVsbAorKysgYi91cHN0cmVhbS9saW51eC01LjEwL2luY2x1ZGUvbGludXgvc29jL3p0ZS9zcGlubG9jay5oCkBAIC0wLDAgKzEsMTE1IEBACisvKg0KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTUgWlRFLVRTUA0KKyAqDQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKg0KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICovDQorDQorI2lmbmRlZiBfU1BJTkxPQ0tfSA0KKyNkZWZpbmUgX1NQSU5MT0NLX0gNCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIGZpbGVzDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvLyNpbmNsdWRlIDxzcGlubG9ja19jb20uaD4NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb3MNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCisjZGVmaW5lIFNQSU5MT0NLX0lPQ19NQUdJQyAgICAgJ1MnDQorDQorLyppb2N0bCBjbWQgdXNkIGJ5IGRldmljZSovDQorI2RlZmluZSBTUElOTE9DS19HRVRfU1RBVFVTICAgICAgIF9JT1dSKFNQSU5MT0NLX0lPQ19NQUdJQywgMSwgY2hhciAqKQ0KKw0KKw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisJQ09SRV9JRF9QUz0yMTAsDQorCUNPUkVfSURfUEhZPTIxMSwNCisJQ09SRV9JRF9aU1A9MjEyLA0KKwlDT1JFX0lEX00wPTIxMywNCisJQ09SRV9JRF9BUD0yMTQsDQorCUNPUkVfSURfTlVNID0gMjE1DQorfSB6dGVfY29yZWlkOw0KKy8qILHqyrbTsrz+y/gqLw0KK3R5cGVkZWYgZW51bQ0KK3sNCisJUENVX0hXTE9DSyAgPSAwLC8qUENVKi8NCisJQ0xLX0hXTE9DSyAgPSAxLC8qQ2xvY2sqLw0KKwlSRUdMT0NLX0hXTE9DSywNCisJU09GVExPQ0tfSFdMT0NLLA0KKwlIV0xPQ0tfTlVNDQorfSBlbWh3X2xvY2tfaWQ7DQorDQorLyogserKtsjtvP7L+CovDQordHlwZWRlZiBlbnVtDQorew0KKwlJMkMwX1NGTE9DSyA9IDAsLyppMmMwKi8NCisJSTJDMV9TRkxPQ0sgPSAxLC8qaTJjMSovDQorCUkyQzJfU0ZMT0NLID0gMiwvKnBtaWMtaTJjKi8NCisJTkFORF9TRkxPQ0sgPSAzLC8qTkFORCovDQorCVNEMF9TRkxPQ0ssIC8qZm9yIHNkMCovDQorCVNEMV9TRkxPQ0ssIC8qZm9yIHNkMSovDQorCUFEQ19TRkxPQ0ssIC8qZm9yIGFkYyovDQorCVVBUlRfU0ZMT0NLLA0KKwlQTUlDX1NGTE9DSywNCisjaWZkZWYgQ09ORklHX1NZU1ZJUENfQ1JPU1NfU0hNDQorCVNITV9TRkxPQ0ssDQorI2Vsc2UNCisJU0ZMT0NLX0lEOSwNCisjZW5kaWYNCisJRUZVU0VfU0ZMT0NLLA0KKwlTRkxPQ0tfSUQxMSwNCisJU0ZMT0NLX0lEMTIsDQorCVNGTE9DS19JRDEzLA0KKwlTRkxPQ0tfSUQxNCwNCisJU0ZMT0NLX0lEMTUsDQorCVNGTE9DS19JRDE2LA0KKwlTRkxPQ0tfSUQxNywNCisJU0ZMT0NLX0lEMTgsDQorCVNGTE9DS19JRDE5LA0KKwlTRkxPQ0tfSUQyMCwNCisJU0ZMT0NLX0lEMjEsDQorCVNGTE9DS19JRDIyLA0KKwlTRkxPQ0tfSUQyMywNCisJU0ZMT0NLX0lEMjQsDQorCVNGTE9DS19JRDI1LA0KKwlTRkxPQ0tfSUQyNiwNCisJU0ZMT0NLX0lEMjcsDQorCVNGTE9DS19JRDI4LA0KKwlTRkxPQ0tfSUQyOSwNCisJU0ZMT0NLX0lEMzAsDQorCVJFR19TRkxPQ0sgPSAzMSwvKlJFRyovDQorCVNGTE9DS19OVU0NCit9IGVtc2ZfbG9ja19pZDsNCisNCisNCit2b2lkIGh3X3NwaW5fbG9jayh1MzIgaHdpZCk7DQordm9pZCBod19zcGluX3VubG9jayh1MzIgaHdpZCk7DQordm9pZCBzb2Z0X3NwaW5fbG9jayh1MzIgc2ZpZCk7DQordm9pZCBzb2Z0X3NwaW5fdW5sb2NrKHUzMiBzZmlkKTsNCit2b2lkICByZWdfc3Bpbl9sb2NrKHZvaWQpOw0KK3ZvaWQgIHJlZ19zcGluX3VubG9jayh2b2lkKTsNCit2b2lkICBzb2Z0X3NwaW5fbG9ja19wc20oZW1zZl9sb2NrX2lkIHNmaWQpOw0KK3ZvaWQgIHNvZnRfc3Bpbl91bmxvY2tfcHNtKGVtc2ZfbG9ja19pZCBzZmlkKTsNCisNCit2b2lkIHp4X3NwaW5sb2NrX2luaXQodm9pZCBfX2lvbWVtICpzcGlubG9ja19iYXNlKTsNCitpbnQgIHNvZnRfc3Bpbl9sb2NrX3ByaW50ZihlbXNmX2xvY2tfaWQgc2ZpZCk7DQorDQorI2VuZGlmLyogX1NQSU5MT0NLX0ggKi8NCisNCmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL2luY2x1ZGUvbmV0L1NJL25ldGlvY19wcm9jLmggYi91cHN0cmVhbS9saW51eC01LjEwL2luY2x1ZGUvbmV0L1NJL25ldGlvY19wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjBjOGFhNAotLS0gL2Rldi9udWxsCisrKyBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAvaW5jbHVkZS9uZXQvU0kvbmV0aW9jX3Byb2MuaApAQCAtMCwwICsxLDQ5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKrmmxNy96cnco7psaW51eNbQzfjC52Zhc3RuYXShomZhc3Rics/gudiy2df3vdO/2gorKri61PDIy6O6Cisqsbi33cjLo7oKKyrQ3rjEyNWjugorKtDeuMTE2sjdo7oKKyqw5rG+usWjugorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTkVUSU9fUFJPQ19IXworI2RlZmluZSBfTkVUSU9fUFJPQ19IXworCisKKyNpbmNsdWRlIDxuZXQvU0kvbmV0X3RyYWNrLmg+CisjaW5jbHVkZSA8bmV0L1NJL2V4dF9tZW0uaD4KKworCisjZGVmaW5lICBQQ19NQVhfTlVNICAgMTAwCisjZGVmaW5lICBERVZfTkFNRV9MRU4gNTAKKworI2RlZmluZSAgREVWX05BTUVfTEVOXzIwIDIwCisKKyNkZWZpbmUgRVRIX0FMRU4gICAgICAgICAgICA2CisKKyNkZWZpbmUgU0xBQl9OVU0gIDIxCisKKyNkZWZpbmUgSEFTSF9BUlJBWV9DT1VOVCA1MTIKKy8vU0tCzbO8xta1o6yw/MCo0uyzo7XjtcTNs7zG1rUKK2VudW0gc2tiaW5mb190eXBleworICAgIFNLQl9UWVBFX0FMTCA9IDAsICAgICAvL3NrYr3hubnM5dX91Nq5pNf3tcS49sr9CisgICAgU0tCX1RZUEVfREFUQSwgICAgICAgIC8vU0tC1tC1xHNsYWK7+tbGtcRkYXRh1f3U2rmk1/e1xLj2yv2jrLD8uqxTS0JfVFlQRV9UT0NQo6y1q7K7sPy6rFNLQl9UWVBFX0ZST01DUAorICAgIFNLQl9UWVBFX1RPQ1AsICAgICAgICAvL7eizflDULXEc2ti1f3U2rmk1/e1xLj2yv0KKyAgICBTS0JfVFlQRV9GUk9NQ1AsICAgICAgLy+000NQvdPK1bW9tcRQU0JVRtX91Nq5pNf3tcS49sr9CisgICAgU0tCX0RBVEFfQllURVMsICAgICAgICAvL7Wxx7DJ6sfrtcRkYXRh19zX1r3ayv0gIKOsa3NpemW3vcq9wNu807XECisKKyAgICAvL9DUxNzP4LnYtcTIq77W0MXPoqOsxNq6y732wNu807eiyfq1xLTOyv2jrLK7uLrU8LfWzvYKKyAgICBTS0JfUVVFVUVfU1RPUCwgICAgICAvL3htaXRfc3RvcNTss8m1xLaqsPy49sr9o6zA27zT1rUKKyAgICBTS0JfUVVFVUVfTE9DSywgICAgICAvL1FVRVVFX0xPQ0vU7LPJtcS2qrD8uPbK/aOswNu809a1CisgICAgU0tCX0NPUFlfQ0FDSEUsICAgICAgLy9uZXRfY2FjaGXUtM7EvP7W0L340NDIq7+9sbS1xMDbvNPWtaOsxL/HsL321NpQUFC6zbfWxqzKsb+9sbSjrNOwz+zQ1MTcCisgICAgU0tCX0lSUV9GUkVFLCAgICAgICAgICAgLy/NqLn9yO3W0LbPys23xbXEc2tio6zQ1MTcz+C52AorICAgIFNLQl9DT1BZLCAgICAgICAgICAgICAgICAgICAvL8r9vt2/vbG0tcRza2KjrNDUxNzP4LnYCisgICAgU0tCX0ZMT09ELCAgICAgICAgICAgICAgICAgLy+3urrptcRza2KjrNDUxNzP4LnYCisgICAgU0tCX0VSUkZSRUUsICAgICAgICAgICAgIC8vZGV21LTOxLz+1tC07c7zys23xbXEc2tivMbK/aOssPzAqFNLQl9RVUVVRV9TVE9Qus1TS0JfUVVFVUVfTE9DS8G9uPa8xsr91rUKKyAgICBTS0JfRlJBRywgICAgICAgICAgICAgICAgICAgLy+908rVtb21xLfWxqyxqM7Eo6zQ1MTcz+C52AorICAgIFNLQl9PVkVSX01UVSwgICAgICAgICAgIC8vZmFzdNbQyv2+3bOktsi089Pas/a/2mRldiBNVFXKsaOsZmFzdMqnsNy49sr9zbO8xgorICAgIFNLQl9MT09QLCAgICAgICAgICAgICAgICAgICAvL822td24+Mf9tq+jrNPWtNPH/bavytW1vbXE0uyzo7vYu7e49sr9zbO8xqOstPPT2jCx7cq+x/22r9Lss6MKKyAgICBTS0JfQUxMT0NfRklBTCwgICAgICAgICAvL8nqx+tza2LKp7DctcS49sr9wNu809a1CisgICAgU0tCX0lORk9fTUFYLAorfTsKKworLy/N+MLnxNq6y9TL0NDKsbXEzbO8xta1o6zW2LXjudjXor3hubnM5bXEyerH67XjCitlbnVtIG5ldF9ydW5faW5mb3sKKyAgICBCUl9NQUNfQ0hBTkdFID0gMCwgICAgICAgIC8vzfjHxW1hY7XY1rexu7jEseS0zsr9CisgICAgTkVJR0hfQUxMT0MsICAgICAgICAgICAgICAgICAgICAvL25laWdoYm91csnqx+u0zsr9CisgICAgTkVJR0hfRlJFRSwgICAgICAgICAgICAgICAgICAgICAgICAvL25laWdoYm91csrNt8W148DbvNPWtQorICAgIEJSX05FSUdIX1ZBUlksICAgICAgICAgICAgICAgLy/HxbXjtcSz9r/aZGV2tcRNQUO12Na3sbu24Lj2UEO5ss/tCisgICAgQ09OTl9BTExPQywgICAgICAgICAgICAgICAgICAgICAgLy9DT05OyerH67TOyv3A27zT1rUKKyAgICBDT05OX0ZSRUUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ09OTsrNt8W148DbvNPWtQorICAgIEJSRkRCX0FMTE9DLCAgICAgICAgICAgICAgICAgICAgLy/HxbXjyerH67TOyv3A27zT1rUKKyAgICBEU1RfQUxMT0MsICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHN0X2VudHJ5yerH68DbvNPWtQorICAgIERTVF9GUkVFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RzdF9lbnRyecrNt8W148DbvNPWtQorICAgIEhIX1VQREFURSwgICAgICAgICAgICAgICAgICAgICAgICAgLy9ISLb+suNNQUPNt7j80MLA27zT1rUKKyAgICBSVF9DQUNIRV9JTlZBTElELCAgICAgICAgICAgICAgIC8vx+W/1cK308ljYWNoZbXEwNu809a1CisgICAgUlRfSEFTSF9BREQsICAgICAgICAgICAgICAgICAgICAgICAgLy/QwtT2cnRfaGFzaF90YWJsZb3ateO1xMDbvNPWtQorICAgIFJUX0hBU0hfREVMLCAgICAgICAgICAgICAgICAgICAgICAgIC8vyb6z/XJ0X2hhc2hfdGFibGW92rXjtcTA27zT1rUKKyAgICBTU01BQ19DSEFOR0VfSU5ERVYsICAgICAgICAgICAgICAgIC8vzazSu9S0TUFDtdjWt8jrv9pkZXa4xLHktcS0zsr9CisgICAgTkVUX0lORk9fTUFYLAorfTsKK2VudW0gZGV2X29wdF9zdGF0ZXsKKyAgICBERVZfVU5PUFQ9MCwgICAgLy/I9NPDu6fOtNf2yM66zrLZ1/ejrLP1yrzWtc6qMAorICAgIERFVl9OT1BSRVNFTlQsICAvL7bU06YhbmV0aWZfZGV2aWNlX3ByZXNlbnTS7LOjo6yx7cP3x/22r7XXsuPJ0M6017yxuLrDCisgICAgREVWX09QRU5FRCwgICAgIC8vZGV2IGlzIG9wZW5lZAorICAgIERFVl9PUEVOX0ZBSUwsICAgICAgLy9vcGVuICBmYWlsCisgICAgREVWX0NMT1NFRCwgICAgICAgICAgLy9kZXYgaXMgY2xvc2VkIAorfTsKKworZW51bSBzbGFiaW5mb19maWxleworICAgIEZBU1RfU0xBQiA9IDAsCisgICAgU0tCX1NMQUIsCisgICAgQlJGREJfU0xBQiwKKyAgICBEU1RfU0xBQiwKKyAgICBGSUJfVFJJRV9TTEFCLAorICAgIEZMT1dfU0xBQiwKKyAgICBJTkVUUEVFUl9TTEFCLAorICAgIElORVRfSEFTSFRBQkxFU19TTEFCLAorICAgIElORVRfVElNRVdBSVRfU09DS19TTEFCLAorICAgIE1ZU09DS0VUX1NMQUIsCisgICAgTkZfQ09OTlRSQUNLX0NPUkVfU0xBQiwKKyAgICBORl9DT05OVFJBQ0tfRVhDRVBUX1NMQUIsCisgICAgUkVRVUVTVF9TT0NLX1NMQUIsCisgICAgU09DS19TTEFCLAorICAgIFNPQ0tFVF9TTEFCLAorICAgIFhGUk02X1RVTk5FTF9TTEFCLAorICAgIFhUX0hBU0hMSU1JVF9TTEFCLAorICAgIFNPQ0tfQUxMT0NfUEFHRVMsICAgICAgICAgICAvL9PJ09rO3reo17zIt9XStb3KzbfFteOjrMv50tS99tPQKyu2r9f3o6wtLdOmuMPTyXB1dF9wYWdltKW3ogorICAgIElQNl9PVVRQVVRfQUxMT0NfUEFHRVMsICAgICAvL9PJ09rO3reo17zIt9XStb3KzbfFteOjrMv50tS99tPQKyu2r9f3o6wtLdOmuMPTyXB1dF9wYWdltKW3ogorICAgIElQX09VVFBVVF9BTExPQ19QQUdFUywgICAgICAvL9PJ09rO3reo17zIt9XStb3KzbfFteOjrMv50tS99tPQKyu2r9f3o6wtLdOmuMPTyXB1dF9wYWdltKW3ogorICAgIFNLQl9BTExPQ19QQUdFUywgICAgICAgICAgICAvL9PJ09rO3reo17zIt9XStb3KzbfFteOjrMv50tS99tPQKyu2r9f3o6wtLdOmuMPTyXB1dF9wYWdltKW3ogorfTsKKworCisvKrG+tdhUQ1DNs7zG0MXPoiovCitlbnVtIHRjcF9zdGF0X2luZm8KK3sKKyAgICBUQ1BfUkVDVl9QS1RTID0gMCwgICAgICAgLyq908rVtcRUQ1DK/cS/Ki8KKyAgICBUQ1BfU0VORF9QS1RTLCAgICAgICAgICAgLyq3osvNtcRUQ1DK/cS/Ki8KKyAgICBUQ1BfUkVUUkFOU19QS1RTLCAgICAgICAgLyq3osvNtcTW2LSrVENQyv3EvyovCisgICAgVENQX1JFQ1ZfRFJPUFMsICAgICAgICAgIC8qvdPK1bbLtcRUQ1C2qrD8yv0qLworICAgIFRDUF9TRU5EX0RST1BTLCAgICAgICAgICAvKreiy822y7XEVENQtqqw/Mr9Ki8KKyAgICBUQ1BfUlNUX1NFTkRfTlVNLCAgICAgICAgLyq3osvNtcRSU1TK/SovCisgICAgVENQX1JTVF9SRUNWX05VTSwgICAgICAgIC8qvdPK1bXEUlNUyv0qLworICAgIFRDUF9TVEFUU19NQVgsCit9OworCisKK3N0cnVjdCB0Y3Bfc29ja19zdGF0Cit7CisgICAgdW5zaWduZWQgbG9uZyB0Y3BfcmVjdl9udW07CisgICAgdW5zaWduZWQgbG9uZyB0Y3Bfc2VuZF9udW07CisgICAgdW5zaWduZWQgbG9uZyB0Y3BfcmV0cmFuc19udW07CisgICAgdW5zaWduZWQgbG9uZyB0Y3BfcmVjdl9kcm9wczsKKyAgICB1bnNpZ25lZCBsb25nIHRjcF9zZW5kX2Ryb3BzOworICAgIHVuc2lnbmVkIGxvbmcgdGNwX3JzdF9zZW5kOworICAgIHVuc2lnbmVkIGxvbmcgdGNwX3JzdF9yZWN2OworfTsKKworLyoqKirXytS0yrnTw7ywyc/P3tDFz6KjrMv509Cx6te8xNq6y9PQyc/P3sfpv/a1xKOsvdTQ6LzssuKjrNLUt8DWudLss6O3osn6KioqKi8KK3N0cnVjdCBuZXRfbWF4X2NoZWNrX21zZworeworICAgIC8qbmZfY29ubnRyYWNrKi8KKyAgICB1bnNpZ25lZCBsb25nIG5mX2Nvbm50cmFja19tYXg7ICAvL25mX2Nvbm50cmFja19tYXggPSA0ODMyCisgICAgdW5zaWduZWQgbG9uZyBuZl9jb25udHJhY2tfbm93OyAgLy9uZXQtPmN0LmNvdW50CisgICAgLyplbnF1ZXVlKi8KKyAgICBpbnQgICAgICAgICAgICAgbmV0ZGV2X21heF9iYWNrbG9nOyAgICAvL25ldGRldl9tYXhfYmFja2xvZz0xMDAwCisgICAgaW50ICAgICAgICAgIGlucHV0X3F1ZXVlX2xlbjsgICAgICAgICAgLy+yzr+0ZW5xdWV1ZV90b19iYWNrbG9nvdO/2sq1z9YKKyAgICBpbnQgICAgICAgICAgcnhfZHJvcHBlZDsgICAgICAgICAgICAgICAgIC8v0vLOqsjrttPB0NLRwvrU7LPJtcTI67bTwdC2qrD8tcTA27zT1rUKKyAgICAvKtDUxNzP4LnYKi8KKyAgICBpbnQgICAgICAgICAgZmFzdG5hdF9saW5rX21heDsgICAgICAgICAgICAgICAgLy9uZl9jb25udHJhY2tfbWF4CisgICAgaW50ICAgICAgICAgIGZhc3RuYXRfbGlua19ub3c7ICAgICAgICAgICAgICAgIC8vd29ya2luZ19saXN0LmNvdW50CisgICAgaW50ICAgICAgICAgIGZhc3Q2X2xpbmtfbWF4OyAgICAgICAgICAgICAgICAgIC8vbmZfY29ubnRyYWNrX21heAorICAgIGludCAgICAgICAgICBmYXN0Nl9saW5rX25vdzsgICAgICAgICAgICAgICAgICAvL3dvcmtpbmdfbGlzdDYuY291bnQKKyAgICAKKyAgICAvKs34wufE2rrL1MvQ0MqxtcTNs7zG1rWjrNbYteO52NeiveG5uczltcTJ6sfrteMqLworICAgIHVuc2lnbmVkIGxvbmcgYnJfbWFjX2NoYW5nZTsgICAgICAgICAgLy/N+MfFbWFjtdjWt7G7uMSx5LTOyv0KKyAgICB1bnNpZ25lZCBsb25nIG5laWdoX2FsbG9jOyAgICAgICAgICAgICAgICAgICAvL25laWdoYm91csnqx+u0zsr9CisgICAgdW5zaWduZWQgbG9uZyBuZWlnaF9mcmVlOyAgICAgICAgICAgICAgICAgICAgICAvL25laWdoYm91csrNt8W148DbvNPWtQorICAgIHVuc2lnbmVkIGxvbmcgYnJfbmVpZ2hfdmFyeTsgICAgICAgICAgICAgICAgLy/HxbXjtcSz9r/aZGV2tcRtYWO12Na3sbu24Lj2cGO5ss/tCisgICAgdW5zaWduZWQgbG9uZyBjb25uX2FsbG9jOyAgICAgICAgICAgICAgICAgICAgLy9jb25uyerH67TOyv3A27zT1rUKKyAgICB1bnNpZ25lZCBsb25nIGNvbm5fZnJlZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29ubsrNt8W148DbvNPWtQorICAgIHVuc2lnbmVkIGxvbmcgYnJmZGJfYWxsb2M7ICAgICAgICAgICAgICAgICAgICAvL8fFtePJ6sfrtM7K/cDbvNPWtQorICAgIHVuc2lnbmVkIGxvbmcgZHN0X2FsbG9jOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kc3RfZW50cnnJ6sfrwNu809a1CisgICAgdW5zaWduZWQgbG9uZyBkc3RfZnJlZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kc3RfZW50cnnKzbfFtePA27zT1rUKKyAgICB1bnNpZ25lZCBsb25nIGhoX3VwZGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaGi2/rLjbWFjzbe4/NDCwNu809a1CisgICAgdW5zaWduZWQgbG9uZyBydF9jYWNoZV9pbnZhbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vx+W/1cK308ljYWNoZbXEwNu809a1CisgICAgdW5zaWduZWQgbG9uZyBydF9oYXNoX2FkZDsgICAgICAgICAgICAgICAgICAgICAgICAvL9DC1PZydF9oYXNoX3RhYmxlvdq147XEwNu809a1CisgICAgdW5zaWduZWQgbG9uZyBydF9oYXNoX2RlbDsgICAgICAgICAgICAgICAgICAgICAgICAvL8m+s/1ydF9oYXNoX3RhYmxlvdq147XEwNu809a1CisgICAgdW5zaWduZWQgbG9uZyBzc21hY19jaGFuZ2VfaW5kZXY7ICAgICAgICAgICAvL82s0rvUtE1BQ7XY1rfI67/aZGV2uMSx5LXEtM7K/QorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogIFNLQs/gudjQxc+io6yw/MCozbO8xtDFz6K6zWZhc3TQxc+iICoqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHNrYl9hbmRfZmFzdF9tc2cKK3sKKyAgICBpbnQgIHNrYl9udW00OyAgICAgICAgICAgICAgLy+908rVtb21xFY0yv2+3bD8CisgICAgaW50ICBza2JfbnVtNjsgICAgICAgICAgICAgIC8vvdPK1bW9tcRWNsr9vt2w/AorICAgIGludCAgc2tiX2JpZ19udW07ICAgICAgICAgICAvL2xlbrOktsizrLn9MTAwMLXEyv2+3bD8o6y6rFY0us1WNgorICAgIGludCAgc2tiX3NtYWxsX251bTsgICAgICAgICAvL2xlbrOktsjQodPaMTAwtcTK/b7dsPyjrLqsVjS6zVY2CisgICAgaW50ICBza2JfYnl0ZXM0OyAgICAgICAgICAgIC8vvdPK1bW9tcRWNMr9vt2w/NfWvdrK/QorICAgIGludCAgc2tiX2J5dGVzNjsgICAgICAgICAgICAvL73TytW1vbXEVjbK/b7dsPzX1r3ayv0KKyAgICBpbnQgIHNrYl91bmtub3duOyAgICAgICAgICAgLy+908rVtb21xM601qrQrdLpyv2+3bD8o6yw/MCoQVJQtci3x1Y0us1WNrXEsajOxAorICAgIGludCAgc2tiX3RjcG51bTsgICAgICAgICAgICAvL73TytW1vbXEdGNwyv2+3bD8o6y6rFY0us1WNqOstauyu7qsZmFzdGJytcSxqM7ECisgICAgaW50ICBza2JfdWRwbnVtOyAgICAgICAgICAgIC8vvdPK1bW9tcR1ZHDK/b7dsPyjrLqsVjS6zVY2o6y1q7K7uqxmYXN0YnK1xLGozsQKKyAgICBpbnQgIGJyb2FkY2FzdF9udW00OyAgICAgICAgLy+908rVtb21xFY0ueOypbD8CisgICAgaW50ICBicm9hZGNhc3RfbnVtNjsgICAgICAgIC8vvdPK1bW9tcRWNrnjsqWw/AorICAgIGludCAgbXVsdGljYXN0X251bTQ7ICAgICAgICAvL73TytW1vbXEVjTX6bKlsagKKyAgICBpbnQgIG11bHRpY2FzdF9udW02OyAgICAgICAgLy+908rVtb21xFY21+mypbGoCisgICAgaW50ICBmYXN0bmF0X251bTsgICAgICAgICAgIC8vZmFzdG5hdLPJuaa1xLGozsQKKyAgICBpbnQgIGZhc3Q2X251bTsgICAgICAgICAgICAgLy9mYXN0NrPJuaa1xLGozsQKKyAgICBpbnQgIGZhc3Ricl9udW07ICAgICAgICAgICAgLy9mYXN0YnKzybmmtcSxqM7ECisgICAgaW50ICBmYXN0bmF0X2xldmVsOyAgICAgICAgIC8vss6/tEZBU1RfTkVUX0RFVklDRQorICAgIGludCAgZmFzdGJyX2xldmVsOyAgICAgICAgICAvL7K8tvvA4NDNCisgICAgLy/PwsPmvLi49ta1zqrA27zT1rWjrNDUxNzP4LnYCisgICAgaW50ICBpcnFmcmVlX251bTsgICAgICAgICAgIC8vzai5/cjt1tC2z8rNt8W1xHNrYqOs0NTE3M/gudgKKyAgICBpbnQgIHNrYmNvcHlfbnVtOyAgICAgICAgICAgLy/K/b7dv72xtLXEc2tio6zQ1MTcz+C52AorICAgIGludCAgY2FjaGVfY29weTsgICAgICAgICAgICAgLy9uZXRfY2FjaGXUtM7EvP69+NDQv72xtLXEwNu7/bzGyv2jrNDUxNzP4LnYCisgICAgaW50ICBza2JmbG9vZF9udW07ICAgICAgICAgIC8vt7q66bXEc2tio6zQ1MTcz+C52AorICAgIGludCAgZXJyZnJlZV9udW07ICAgICAgICAgIC8vZGV21LTOxLz+1tC07c7zys23xbXEc2tivMbK/aOssPzAqFNLQl9RVUVVRV9TVE9Qus1TS0JfUVVFVUVfTE9DS8G9uPa8xsr91rUKKyAgICBpbnQgIGZyYWdfbnVtOyAgICAgICAgICAgICAgLy+908rVtb21xLfWxqyxqM7Eo6zQ1MTcz+C52AorICAgIGludCAgbXR1X251bTsgICAgICAgICAgICAgICAvL2Zhc3TW0Mr9vt2zpLbItPPT2rP2v9pkZXYgTVRVyrGjrGZhc3TKp7DcuPbK/c2zvMYKKyAgICBpbnQgIGZhc3RfbG9vcDsgICAgICAgICAgICAgLy/NtrXduPjH/bavo6zT1rTTx/22r8rVtb21xNLss6O72Lu3uPbK/c2zvMYKKyAgICBpbnQgIHNrYl9hbGxvY19mYWlsIDsgICAgICAgIC8vyerH63NrYsqnsNy1xLj2yv3A27zT1rUKKyAgICBpbnQgIHhtaXRfbG9ja19udW07ICAgICAgICAvL3htaXRfbG9ja19vd25lcrG7y/jXodTss8m1xLaqsPy1xMDbvNO8xsr9o6zH/bav1OyzybXECisgICAgaW50ICB4bWl0X3N0b3BfbnVtOyAgICAgIC8vIW5ldGlmX3htaXRfc3RvcHBlZCh0eHEp1OyzybXEtqqw/LXEwNu807zGyv2jrMf9tq/U7LPJtcQKKyAgICBpbnQgIGJyX21hY19jaGFuZ2VfbnVtOyAgICAgIC8vzfjHxW1hY7XY1rexu7jEseS0zsr9CisgICAgaW50ICBmYXN0X3RjcGR1bXBfbnVtOyAgICAgIC8vZmFzdNelsPy49sr9CisgICAgaW50ICBmYXN0X3N3aXRjaDsKKyAgICBpbnQgIGZhc3RfbG9jYWw0X3Jjdl9udW07ICAgICAgIC8vsb612GZhc3RfbG9jYWw0s8m5pr3TytWxqM7ECisgICAgaW50ICBmYXN0X2xvY2FsNl9yY3ZfbnVtOyAgICAgICAvL7G+tdhmYXN0X2xvY2FsNrPJuaa908rVsajOxAorICAgIGludCAgZmFzdF9sb2NhbDRfb3V0cHV0X251bTsgICAgLy+xvrXYZmFzdF9sb2NhbDSzybmmt6LLzbGozsQKKyAgICBpbnQgIGZhc3RfbG9jYWw2X291dHB1dF9udW07ICAgIC8vsb612GZhc3RfbG9jYWw2s8m5preiy82xqM7ECit9OworCitzdHJ1Y3Qgc2tiX3VzaW5nX21zZworeworICAgIHVuc2lnbmVkIGxvbmcgc2tiX2FsbDsKKyAgICB1bnNpZ25lZCBsb25nIHNrYl90b2NwOworICAgIHVuc2lnbmVkIGxvbmcgc2tiX2Zyb21jcDsKKyAgICB1bnNpZ25lZCBsb25nIHNrYl9kYXRhX251bTsKKyAgICB1bnNpZ25lZCBsb25nIHNrYl9kYXRhX3NpemU7CisgICAgdW5zaWduZWQgbG9uZyBza2Jfc3RvcDsKKyAgICB1bnNpZ25lZCBsb25nIHNrYl9sb2NrOworICAgIHVuc2lnbmVkIGxvbmcgc2tiX3BhbmljOworICAgIHVuc2lnbmVkIGxvbmcgc2tiX2ZhaWw7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiAgveG5uczltqjS5SAgICBERVYgICoqKioqKioqKioqKioqKioqKioqKioqLworLy/N+MLnzO2806OszbO8xs34wuey48PmytW3orD8x+m/9gorc3RydWN0IG5ldF9kZXZfc2tiaW5mbyB7CisgICAgdW5zaWduZWQgbG9uZyAgICByeF9wYWNrZXRzOyAgLy/H/bavt6LLzcC0tcTK/b7dsPy49sr9o6zU2m5ldGlmX3J4zbfA27zTCisgICAgdW5zaWduZWQgbG9uZyAgICB0eF9wYWNrZXRzOyAgLy+3osvNuPjH/bavtcTK/b7dsPy49sr9o6zU2mRldl9xdWV1ZV94bWl0zbfA27zTCisgICAgdW5zaWduZWQgbG9uZyAgICByeF9ieXRlczsgICAgLy/X1r3ayv0KKyAgICB1bnNpZ25lZCBsb25nICAgIHR4X2J5dGVzOyAgICAvL9fWvdrK/QorICAgIHVuc2lnbmVkIGxvbmcgICAgcnhfZHJvcHBlZDsgIC8vbmV0aWZfcnjE2rK/wfezzNbQy/nT0NLss6PKzbfFc2titcTA27zTo6zI57Tvtb1uZXRkZXZfbWF4X2JhY2tsb2fI67bTwdDJz8/etvi2qrD8CisgICAgdW5zaWduZWQgbG9uZyAgICB0eF9kcm9wcGVkOyAgLy9kZXZfcXVldWVfeG1pdMTasr/B97PM1tDL+dPQ0uyzo8rNt8Vza2K1xMDbvNOjrMjnKHR4cS0+eG1pdF9sb2NrX293bmVyID09IGNwdSnU7LPJtcS2qrD8Cit9OworCisvL834wufM7bzTo6xjb25uytW3orD8x+m/9gorc3RydWN0IGNvbm5fc2tiaW5mbyB7CisgICAgdW5zaWduZWQgbG9uZyAgICBwYWNrZXRzOyAgLy/K/b7dsPy49sr9CisgICAgdW5zaWduZWQgbG9uZyAgICBieXRlczsgICAgLy/X1r3ayv0KK307CisKKy8qILjDveG5uczl1tC1xMv509DQxc+ivdTTycf9tq+4s9a1o6zN+MLn1+myu7vhuLPWtSAqLworLy/V4rj2veG5uczlsdjQ67rNIDxsaW51eC9uZXRkZXZpY2UuaD7W0LXEbmV0X2RldmljZV9zdGF0c7Gjs9bSu9bCICAgCitzdHJ1Y3QgbmV0X2Rldl9zdGF0cyB7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHJ4X3BhY2tldHM7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHR4X3BhY2tldHM7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHJ4X2J5dGVzOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICB0eF9ieXRlczsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgcnhfZXJyb3JzOyAgIC8v0Oi84L/YCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHR4X2Vycm9yczsgICAvL9DovOC/2AorICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICByeF9kcm9wcGVkOyAgIC8v0Oi84L/YCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHR4X2Ryb3BwZWQ7ICAgLy/Q6Lzgv9gKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgbXVsdGljYXN0OworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICBjb2xsaXNpb25zOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICByeF9sZW5ndGhfZXJyb3JzOyAgIC8v0Oi84L/YCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHJ4X292ZXJfZXJyb3JzOyAgIC8v0Oi84L/YCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHJ4X2NyY19lcnJvcnM7ICAgLy/Q6Lzgv9gKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgcnhfZnJhbWVfZXJyb3JzOyAgIC8v0Oi84L/YCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHJ4X2ZpZm9fZXJyb3JzOyAgIC8v0Oi84L/YCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHJ4X21pc3NlZF9lcnJvcnM7ICAgLy/Q6Lzgv9gKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgdHhfYWJvcnRlZF9lcnJvcnM7ICAgLy/Q6Lzgv9gKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgdHhfY2Fycmllcl9lcnJvcnM7ICAgLy/Q6Lzgv9gKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgdHhfZmlmb19lcnJvcnM7ICAgLy/Q6Lzgv9gKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgdHhfaGVhcnRiZWF0X2Vycm9yczsgICAvL9DovOC/2AorICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICB0eF93aW5kb3dfZXJyb3JzOyAgIC8v0Oi84L/YCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHJ4X2NvbXByZXNzZWQ7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHR4X2NvbXByZXNzZWQ7ICAgICAgICAgCit9OworCitzdHJ1Y3QgaW9jdGxfZGV2X25ldHN0YXRzCit7CisgICAgY2hhciBkZXZfbmFtZVsyMF07CisgICAgc3RydWN0IG5ldF9kZXZfc2tiaW5mbyAgc3RhdHNfZGJnOyAgLy/N+MLnzO2807XEo6zNs7zGzfjC57Ljw+bK1beisPzH6b/2CisgICAgc3RydWN0IG5ldF9kZXZfc3RhdHMgIHN0YXRzOyAgICAgLy/K/b7dytW3os2zvMbWtaOsuMPWtcirsr/Tycf9tq+4s9a1tcSjrM34wueyu7iz1rUKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIGZsYWdzOyAgICAgICAgICAgLy9JRkZfVVC1yAorICAgIHVuc2lnbmVkIGNoYXIgICAgICAgb3BlcnN0YXRlOyAgICAvL8S/x7DDu8m208MKKyAgICB1bnNpZ25lZCBsb25nICAgICAgIHN0YXRlOyAgICAgICAgICAgLy+117Ljx/22r9e0zKyjrF9fTElOS19TVEFURV9OT0NBUlJJRVIKKyAgICBpbnQgICAgICAgICAgICAgICAgIG5ldF9mbGFnOyAgICAgICAgLy/Tw7unaWZjb25maWe1xL3hufvXtMyso6zI50RFVl9PUEVOX0ZBSUwKKyAgICB1bnNpZ25lZCBsb25nICAgICAgIHF1ZV9zdGF0ZTsgICAgICAgLy+208HQ17TMrKOsttTTpiBkZXYtPl90eFswXS5zdGF0ZaOsyOdfX1FVRVVFX1NUQVRFX0RSVl9YT0ZGCisgICAgdW5zaWduZWQgaW50ICAgICAgICBudW1fdHhfcXVldWVzOyAgIC8vVFi208HQyv3Bv6OstuDK/cf9tq/KudPDzqjSu7bTwdCjrNTy1rXOqjEKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogIL3hubnM5bao0uUgICAgT1RIRVIgICoqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHBjX2luZm8KK3sgIAorICAgIHVuc2lnbmVkIGNoYXIgbWFjX2FkZHJbNl07CisgICAgY2hhciBkZXZfbmFtZVtERVZfTkFNRV9MRU5dOworfTsKKworc3RydWN0IHBjX25vZGUKK3sKKyAgICB1bnNpZ25lZCBpbnQgbnVtOworICAgIHN0cnVjdCBwY19pbmZvIGluZm9bUENfTUFYX05VTV07Cit9OworCitzdHJ1Y3QgbGVha19pbmZvCit7ICAKKyAgICB2b2lkICphZGRyOworICAgIGludCB1c2VyX251bTsgIC8vtbHHsGRhdGG78nNrYrG7yrnTw7XEvMbK/da1o6yw6cvmc2ti1tC1xHVzZXJzus1kYXRhcmVmtvix5LuvCisgICAgaW50IHRyYWNrX251bTsgLy+8x8K80tG8x8K8tb3K/dfpuey8o7XEz8Kx6sv30v0KKyAgICBjaGFyIGZ1bmNfdHJhY2tbMTBdWzEwMF07Ly+6r8r9u9jL3bnsvKMKK307CisKK3N0cnVjdCBzbGFiX2luZm8KK3sKKyAgICBpbnQgbnVtW1NMQUJfTlVNXVsyXTsKK307CisKKyAKK3N0cnVjdCBoYXNoX2luZm8KK3sKKyAgICBpbnQgbWF4X2hhc2hfc2l6ZTsKKyAgICBpbnQgY3VycmVudF9oYXNoX251bTsKKyAgICBpbnQgaGFzaFtIQVNIX0FSUkFZX0NPVU5UXVsyXTsKKyAgICBpbnQgY3VycmVudF9hcnJheV9zaXplOworfTsKKworc3RydWN0IHB0eXBlX2luZm8KK3sKKyAgICB1bnNpZ25lZCBsb25nIHB0eXBlX2FsbFs1XTsKKyAgICB1bnNpZ25lZCBsb25nIHB0eXBlX2Jhc2VbMTVdOworfTsKKworc3RydWN0IHBrdF9sb3N0X3N0YXRzCit7CisgICAgdW5zaWduZWQgaW50IHNlbmRfZHJvcHM7CisgICAgdW5zaWduZWQgaW50IHNlbmRfZHJvcF9ieXRlczsKKyAgICB1bnNpZ25lZCBpbnQgcmVjdl9kcm9wczsKKyAgICB1bnNpZ25lZCBpbnQgcmVjdl9kcm9wX2J5dGVzOworICAgIHVuc2lnbmVkIGludCB0b3RhbF9wYWNrZXRzOworICAgIHVuc2lnbmVkIGludCB0b3RhbF9ieXRlczsKK307CisKK3N0cnVjdCBwa3RfbG9zdF9pbmZvCit7CisgICAgc3RydWN0IHBrdF9sb3N0X3N0YXRzIHN0YXRzWzJdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyIHVzYltERVZfTkFNRV9MRU5fMjBdOworICAgIGNoYXIgcHNbREVWX05BTUVfTEVOXzIwXTsKKyAgICBjaGFyIHdpZmlfd2FuW0RFVl9OQU1FX0xFTl8yMF07CisgICAgY2hhciB3aWZpX2xhbltERVZfTkFNRV9MRU5fMjBdOworICAgIGNoYXIgZXRoX3dhbltERVZfTkFNRV9MRU5fMjBdOworICAgIGNoYXIgZXRoX2xhbltERVZfTkFNRV9MRU5fMjBdOworICAgIGNoYXIgcHNfZXh0MVtERVZfTkFNRV9MRU5fMjBdOworICAgIGNoYXIgcHNfZXh0MltERVZfTkFNRV9MRU5fMjBdOworICAgIGNoYXIgcHNfZXh0M1tERVZfTkFNRV9MRU5fMjBdOworICAgIGNoYXIgcHNfZXh0NFtERVZfTkFNRV9MRU5fMjBdOworfSBuZXRfZGJnX2Rldl9pbmZvX3Q7CisKK3N0cnVjdCB0aW1lX2xpc3R7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgc3RydWN0IGxpc3RfaGVhZCBwYWNrZXRfbGlzdDsKK307CisKK3N0cnVjdCBuZXRfZGVidWdfcGFja2V0X2xpc3R7CisgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OworICAgIHN0cnVjdCBsaXN0X2hlYWQgdGltZTsKKyAgICBpbnQgcGlkOworCWludCB0Z2lkOworCWNoYXIgcG5hbWVbREVWX05BTUVfTEVOXTsKKyAgICBpbnQgY291bnQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqseTBv8n5w/cqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiqx5MG/yfnD9yoqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKrHkwb/J+cP3KioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gaW50IGxlYWtfc2V0OyAgICAgIC8vIDGx7cq+uPrX2XNrYrywZGF0Ycnqx+vKzbfFteOjuzKx7cq+uPrX2XVzZXJzo6zS1LzssuLOqrrOc2tiyrzW1bK7xNzKzbfFo6zU3cqxuMO5psTcydCyu7/J08MKK2V4dGVybiBpbnQgbGVha19saXN0X21heDsgLy8gyN3Q7bu6tOa1xLT9ys23xbXEc2tivLBkYXRhtcS49sr9o6y/ybX31fujuworZXh0ZXJuIGludCB0cmFja19tYXg7ICAgICAvL7nsvKO4+tfZyv3X6bXEyc/P3qOsvfa1sXVzZXIrKy0tyrGyxdDo0qrAqbTzo6y38dTyMry0v8mjuworZXh0ZXJuIGludCBzdGFja19sZW5tYXg7ICAvL9W7uq/K/bnsvKO1xNfWt/u49sr9yc/P3qO7CitleHRlcm4gaW50IGxlYWtfZnVsbF9wYW5pYzsKK2V4dGVybiB1bnNpZ25lZCBsb25nICBub3dfdGltZTsgLy+1scewyrG/zLXjCitleHRlcm4gc3BpbmxvY2tfdCAgbGVha19sb2NrOyAgIC8vt8DWudTaYmjW0LG7tffTw6OsyrnTw2Joy/gKKworCitleHRlcm4gc3RydWN0IGxlYWtfbGlzdCBkYXRhX2xlYWtbVFJBQ0tfRU5EXTsKK2V4dGVybiBzdHJ1Y3QgbGVha19saXN0IGRhdGFfZnJlZVtUUkFDS19FTkRdOy8vt9ax8LbU06bV/dTayrnTw7XEyv2+3brN0tG+rcrNt8W1xMr9vt3BtLHtCitleHRlcm4gdm9pZCAqZGF0YV9oZWFkW1RSQUNLX0VORF07Ly/Dv7j2xNq05rzgv9jA4NDNtcSz9cq8u6/K17XY1rejrMi3saPBtLHttcTK/b7dx/jBrND4o6zS1LHjcmFtZHVtcMqx1rG908vRy/cKK2V4dGVybiBpbnQgaW5pdF9maW5pc2ggOy8vwbSx7bP1yry7r7Hq1r4KKworLypkdW1wIHN0a9PDtb21xM/gudix5MG/Ki8KK2V4dGVybiB1bnNpZ25lZCBpbnQgc2tiX2R1bXBfbGVuOworZXh0ZXJuIGNoYXIgc2tiX2R1bXBfc3RyW107CisKKy8qusu85NbYuLTKzbfFvOyy4r+qudgqLworZXh0ZXJuIGludCBzZXRfcHNidWZsZWFrIDsgIAorZXh0ZXJuIGludCBzZXRfZXh0c2tibGVhayA7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHNrYmluZm9fZGJnW1NLQl9JTkZPX01BWF07CitleHRlcm4gdW5zaWduZWQgbG9uZyBuZXRydW5pbmZvX2RiZ1tORVRfSU5GT19NQVhdOyAKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGJyX2lwY2hhbmdlX2ZsYWc7IC8vYnIwIGlwtNu4xLbP0dQKK2V4dGVybiBpbnQgc2V0X3RjcGR1bXA7IC8vtqi149elsPy/qrnYCisKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGlnbm9yZW1hY1tFVEhfQUxFTl07CisKKy8qttSxvrXYVENQvfjQ0M/gudjNs7zGKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHRjcF9zdGF0c19kYmdbVENQX1NUQVRTX01BWF07CisKK2V4dGVybiBjaGFyIGJyX25hbWVbXTsKK2V4dGVybiBjaGFyIHBzX25hbWVbXTsKK2V4dGVybiBjaGFyIHVzYl9uYW1lW107CitleHRlcm4gY2hhciBwcHBfbmFtZVtdOworCisKKy8vc3HM7bzTo6zTw9Payv2+3bD8vajEo9LUvLDQ1MTczbO8xs/gudijrG5ldF9pbmZvX251bcirvtbW0NDUxNzP4LnYtcTNs7zG0rLQ6Mzlz9YKK2V4dGVybiAgaW50ICBza2JfbnVtNDsgICAgICAgICAgICAgICAgICAvL73TytW1vbXEVjTK/b7dsPwKK2V4dGVybiAgaW50ICBza2JfbnVtNjsgICAgICAgICAgICAgICAgICAvL73TytW1vbXEVjbK/b7dsPwKK2V4dGVybiAgaW50ICBza2JfYmlnX251bTsgICAgICAgICAgICAgICAvL2xlbrOktsizrLn9MTAwMLXEyv2+3bD8o6y6rFY0us1WNgorZXh0ZXJuICBpbnQgIHNrYl9zbWFsbF9udW07ICAgICAgICAgICAgIC8vbGVus6S2yNCh09oxMDC1xMr9vt2w/KOsuqxWNLrNVjYKK2V4dGVybiAgaW50ICBza2JfYnl0ZXM0OyAgICAgICAgICAgICAgICAvL73TytW1vbXEVjTK/b7dsPzX1r3ayv0KK2V4dGVybiAgaW50ICBza2JfYnl0ZXM2OyAgICAgICAgICAgICAgICAvL73TytW1vbXEVjbK/b7dsPzX1r3ayv0KK2V4dGVybiAgaW50ICBza2JfdW5rbm93bjsgICAgICAgICAgICAgICAvL73TytW1vbXEzrTWqtCt0unK/b7dsPyjrLD8wKhBUlAKK2V4dGVybiAgaW50ICBza2JfdGNwbnVtOyAgICAgICAgICAgICAgICAvL73TytW1vbXEdGNwyv2+3bD8o6y6rFY0us1WNgorZXh0ZXJuICBpbnQgIHNrYl91ZHBudW07ICAgICAgICAgICAgICAgIC8vvdPK1bW9tcR1ZHDK/b7dsPyjrLqsVjS6zVY2CitleHRlcm4gIGludCAgYnJvYWRjYXN0X251bTQ7ICAgICAgICAgICAgLy+908rVtb21xFY0ueOypbD8CitleHRlcm4gIGludCAgYnJvYWRjYXN0X251bTY7ICAgICAgICAgICAgLy+908rVtb21xFY2ueOypbD8CitleHRlcm4gIGludCAgbXVsdGljYXN0X251bTQ7ICAgICAgICAgICAgLy+908rVtb21xFY01+mypbGoCitleHRlcm4gIGludCAgbXVsdGljYXN0X251bTY7ICAgICAgICAgICAgLy+908rVtb21xFY21+mypbGoCitleHRlcm4gIGludCAgZmFzdG5hdF9udW07ICAgICAgICAgICAgICAgLy9mYXN0bmF0s8m5prXEsajOxAorZXh0ZXJuICBpbnQgIGZhc3Q2X251bTsgICAgICAgICAgICAgICAgIC8vZmFzdDazybmmtcSxqM7ECitleHRlcm4gIGludCAgZmFzdGJyX251bTsgICAgICAgICAgICAgICAgLy9mYXN0YnKzybmmtcSxqM7ECitleHRlcm4gIGludCAgZmFzdF9sb2NhbDRfcmN2X251bTsgICAgICAgLy+xvrXYZmFzdF9sb2NhbDSzybmmvdPK1bGozsQKK2V4dGVybiAgaW50ICBmYXN0X2xvY2FsNl9yY3ZfbnVtOyAgICAgICAvL7G+tdhmYXN0X2xvY2FsNrPJuaa908rVsajOxAorZXh0ZXJuICBpbnQgIGZhc3RfbG9jYWw0X291dHB1dF9udW07ICAgIC8vsb612GZhc3RfbG9jYWw0s8m5preiy82xqM7ECitleHRlcm4gIGludCAgZmFzdF9sb2NhbDZfb3V0cHV0X251bTsgICAgLy+xvrXYZmFzdF9sb2NhbDazybmmt6LLzbGozsQKK2V4dGVybiAgaW50ICBmYXN0X3RjcGR1bXBfbnVtOyAgICAgICAgICAvL2Zhc3TXpbD8yv3BvworCitleHRlcm4gaW50IGRvdWJsZV9tYWM7IAorCitleHRlcm4gaW50IG5ldF9kZWJ1Z19waW5nOyAgICAgICAgICAgICAgIC8v19TR0HBpbmew/LzHwry2qrD8yrHR07mmxNwKK2V4dGVybiBpbnQgbmV0X2RlYnVnX3BlcmY7ICAgICAgICAgICAgICAgLy/X1NHQdGNwL3VkcLD8vMfCvLaqsPzKsdHTuabE3KOs0OjSqnNlcnZlcrbOxNywstew19TR0NOm08MKKworLy9zbGFixNq05sq508PP4LnYzbO8xqOszrS/vMLHzajTw3NsYWK12Na3s9ijrMjna21hbGxvYworZXh0ZXJuIHN0cnVjdCBzbGFiX2luZm8gc2xhYl9jb3VudDsKKworLy+3osvNuPhDULSmwO21xKOstP3KzbfFtcRza2LBtLHto6zTw9PabG9nuPrX2aOst8DWubrLvOTE2rTm0LnCqaO7CitleHRlcm4gc3RydWN0IGV4dF9saXN0IHRvQ3BfbGlzdGxvZ1tNQVhfRVhUX01FTV9IQVNIXTsKKworLy9DULeiy824+EFQtcRwc2J1ZtDFz6LBtLHto6zTw9PabG9nuPrX2aOst8DWubrLvOTE2rTm0LnCqTsKK2V4dGVybiBzdHJ1Y3QgZXh0X2xpc3QgZnJvbUNwX2xpc3RbTUFYX0VYVF9NRU1fSEFTSF07CisKKy8qvfjQ0FRDUM2zvMYqLworI2RlZmluZSBUQ1BfUEtUX1NUQVRTX0lOQyhfbW9kKSAgICB0Y3Bfc3RhdHNfZGJnW19tb2RdKysKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqzeKyv73Tv9rJ+cP3KioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqzeKyv73Tv9rJ+cP3KioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqzeKyv73Tv9rJ+cP3KioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gdm9pZCBza2JpbmZvX2FkZCh1bnNpZ25lZCBjaGFyICphZGRyLHVuc2lnbmVkIGludCBza2JfdHlwZSk7CitleHRlcm4gdm9pZCBza2JpbmZvX2RlbCh1bnNpZ25lZCBjaGFyICphZGRyLHVuc2lnbmVkIGludCBza2JfdHlwZSk7CitleHRlcm4gdm9pZCBuZXRydW5pbmZvX2FkZCh1bnNpZ25lZCBjaGFyICphZGRyLHVuc2lnbmVkIGludCBpbmZvX3R5cGUpOworZXh0ZXJuIHZvaWQgbmV0cnVuaW5mb19kZWwodW5zaWduZWQgY2hhciAqYWRkcix1bnNpZ25lZCBpbnQgaW5mb190eXBlKTsKKworZXh0ZXJuIGludCBnZXRfc2tiY250KHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZ2V0X2Rldl9pbmZvKHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZ2V0X3NrYl91c2luZyh1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IG5ldHdvcmtfZ2V0X3BjbWFjKHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZ2V0X2tlcm5lbHBhcmFtKHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZ2V0X3NsYWJfaW5mbyh1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IGdldF9oYXNoX2luZm8odW5zaWduZWQgbG9uZyBhcmcpOworCitleHRlcm4gaW50IHNldF9mYXN0bmF0X2xldmVsKHZvaWQgKmFyZyk7CitleHRlcm4gaW50IHNldF9mYXN0YnJfbGV2ZWwodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgc2V0X2Zhc3RfZGVidWdfcGFuaWModm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgc2V0X2Zhc3RfZGV2X3htaXQodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgc2V0X2Fja2Ryb3Aodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgc2V0X2R1bXBmbGFnKHZvaWQgKmFyZyk7CitleHRlcm4gaW50IHNldF9za2JfZHVtcCh1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IHNldF9wcmludF9vcHQodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgc2V0X3NxX3RjcGR1bXAodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgc2V0X2xlYWsodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgc2V0X21heCh1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IHNldF9zdGFja2xlbm1heCh1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IHNldF90cmFja21heCh1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IHNldF90Y3BkdW1wX29wdCh1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IHNldF9icl9uYW1lKHZvaWQgKmFyZyk7CitleHRlcm4gaW50IHNldF9wc19uYW1lKHZvaWQgKmFyZyk7CitleHRlcm4gaW50IHNldF91c2JfbmFtZSh2b2lkICphcmcpOworZXh0ZXJuIGludCBzZXRfcHBwX25hbWUodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgc2V0X2JyaXAodW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCBzZXRfa2VybmVscGFyYW0odW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCBzZXRfZXJybm9fcHJvY25hbWUodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgZ2V0X25laWdoX2lwKHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZ2V0X3NrYl9mYXN0KHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZ2V0X21heF9tc2codW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCBnZXRfcHR5cGUodW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCBnZXRfcHJvY2Vzc19pbmZvKHZvaWQgKmFyZyk7CitleHRlcm4gdm9pZCBuZXRzbGFiX2luYyhpbnQgaSk7CitleHRlcm4gdm9pZCBuZXRzbGFiX2RlYyhpbnQgaSk7CitleHRlcm4gdm9pZCB0cmFja19uZXRsaW5rKHN0cnVjdCBza19idWZmICpza2IsdTMyIGdyb3VwKTsKKy8vZXh0ZXJuIHZvaWQgcmVjb3JkX2FwcF9hdGNpdmVfbmV0KCk7CisKK2ludCBnZXRfcGt0X2xvc3RfaW5mbyh1bnNpZ25lZCBsb25nIGFyZyk7CisKK2ludCBnZXRfdGNwX3N0YXRfaW5mbyh1bnNpZ25lZCBsb25nIGFyZyk7CisKKyNlbmRpZiAvL2VuZCBfTkVUSU9fRkFTVElORk9fSF8KKworCmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaCBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0YWI5MTcKLS0tIC9kZXYvbnVsbAorKysgYi91cHN0cmVhbS9saW51eC01LjEwL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaApAQCAtMCwwICsxLDM2OCBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKy8qCisgKiBDb25uZWN0aW9uIHN0YXRlIHRyYWNraW5nIGZvciBuZXRmaWx0ZXIuICBUaGlzIGlzIHNlcGFyYXRlZCBmcm9tLAorICogYnV0IHJlcXVpcmVkIGJ5LCB0aGUgKGZ1dHVyZSkgTkFUIGxheWVyOyBpdCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGFuIGlwdGFibGVzCisgKiBleHRlbnNpb24uCisgKgorICogMTYgRGVjIDIwMDM6IFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+CisgKgktIGdlbmVyYWxpemUgTDMgcHJvdG9jb2wgZGVwZW5kZW50IHBhcnQuCisgKgorICogRGVyaXZlZCBmcm9tIGluY2x1ZGUvbGludXgvbmV0Zml0ZXJfaXB2NC9pcF9jb25udHJhY2suaAorICovCisKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfSAorCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2RjY3AuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NjdHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oPgorI2luY2x1ZGUgPG5ldC9TSS9uZXRpb2NfcHJvYy5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaD4KKyNpZmRlZiBDT05GSUdfRkFTVE5BVF9NT0RVTEUKKyNpbmNsdWRlIDxuZXQvU0kvcGt0X2xvc3RfdHJhY2suaD4KKyNlbmRpZgorCisKKworc3RydWN0IG5mX2N0X3VkcCB7CisJdW5zaWduZWQgbG9uZwlzdHJlYW1fdHM7Cit9OworCisvKiBwZXIgY29ubnRyYWNrOiBwcm90b2NvbCBwcml2YXRlIGRhdGEgKi8KK3VuaW9uIG5mX2Nvbm50cmFja19wcm90byB7CisJLyogaW5zZXJ0IGNvbm50cmFjayBwcm90byBwcml2YXRlIGRhdGEgaGVyZSAqLworCXN0cnVjdCBuZl9jdF9kY2NwIGRjY3A7CisJc3RydWN0IGlwX2N0X3NjdHAgc2N0cDsKKwlzdHJ1Y3QgaXBfY3RfdGNwIHRjcDsKKwlzdHJ1Y3QgbmZfY3RfdWRwIHVkcDsKKwlzdHJ1Y3QgbmZfY3RfZ3JlIGdyZTsKKwl1bnNpZ25lZCBpbnQgdG1wbF9wYWR0bzsKK307CisKK3VuaW9uIG5mX2Nvbm50cmFja19leHBlY3RfcHJvdG8geworCS8qIGluc2VydCBleHBlY3QgcHJvdG8gcHJpdmF0ZSBkYXRhIGhlcmUgKi8KK307CisKK3N0cnVjdCBuZl9jb25udHJhY2tfbmV0IHsKKwl1bnNpZ25lZCBpbnQgdXNlcnM0OworCXVuc2lnbmVkIGludCB1c2VyczY7CisJdW5zaWduZWQgaW50IHVzZXJzX2JyaWRnZTsKK307CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY2L25mX2Nvbm50cmFja19pcHY2Lmg+CisjaWZkZWYgQ09ORklHX0ZBU1ROQVRfTU9EVUxFCitzdHJ1Y3QgZmFzdF9jdF9leHR7CisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgc3RydWN0IGRzdF9lbnRyeSAgX19yY3UgKmZhc3RfZHN0W0lQX0NUX0RJUl9NQVhdOworICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgX19yY3UgKmZhc3RfYnJwb3J0W0lQX0NUX0RJUl9NQVhdOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3Qgc29jayBfX3JjdSAqc2s7CisgICAgfTsKKyAgICB1bnNpZ25lZCBjaGFyIGlzRmFzdDsgCit9OworI2VuZGlmCisKK3N0cnVjdCBuZl9jb25uIHsKKwkvKiBVc2FnZSBjb3VudCBpbiBoZXJlIGlzIDEgZm9yIGhhc2ggdGFibGUsIDEgcGVyIHNrYiwKKwkgKiBwbHVzIDEgZm9yIGFueSBjb25uZWN0aW9uKHMpIHdlIGFyZSBgbWFzdGVyJyBmb3IKKwkgKgorCSAqIEhpbnQsIFNLQiBhZGRyZXNzIHRoaXMgc3RydWN0IGFuZCByZWZjbnQgdmlhIHNrYi0+X25mY3QgYW5kCisJICogaGVscGVycyBuZl9jb25udHJhY2tfZ2V0KCkgYW5kIG5mX2Nvbm50cmFja19wdXQoKS4KKwkgKiBIZWxwZXIgbmZfY3RfcHV0KCkgZXF1YWxzIG5mX2Nvbm50cmFja19wdXQoKSBieSBkZWMgcmVmY250LAorCSAqIGJld2FyZSBuZl9jdF9nZXQoKSBpcyBkaWZmZXJlbnQgYW5kIGRvbid0IGluYyByZWZjbnQuCisJICovCisJc3RydWN0IG5mX2Nvbm50cmFjayBjdF9nZW5lcmFsOworCisJc3BpbmxvY2tfdAlsb2NrOworCS8qIGppZmZpZXMzMiB3aGVuIHRoaXMgY3QgaXMgY29uc2lkZXJlZCBkZWFkICovCisJdTMyIHRpbWVvdXQ7CisKKyNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1pPTkVTCisJc3RydWN0IG5mX2Nvbm50cmFja196b25lIHpvbmU7CisjZW5kaWYKKwkvKiBYWFggc2hvdWxkIEkgbW92ZSB0aGlzIHRvIHRoZSB0YWlsID8gLSBZLksgKi8KKwkvKiBUaGVzZSBhcmUgbXkgdHVwbGVzOyBvcmlnaW5hbCBhbmQgcmVwbHkgKi8KKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggdHVwbGVoYXNoW0lQX0NUX0RJUl9NQVhdOworCisJLyogSGF2ZSB3ZSBzZWVuIHRyYWZmaWMgYm90aCB3YXlzIHlldD8gKGJpdHNldCkgKi8KKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCXUxNgkJY3B1OworCXBvc3NpYmxlX25ldF90IGN0X25ldDsKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX05BVCkKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQluYXRfYnlzb3VyY2U7CisjZW5kaWYKKwkvKiBhbGwgbWVtYmVycyBiZWxvdyBpbml0aWFsaXplZCB2aWEgbWVtc2V0ICovCisJc3RydWN0IHsgfSBfX25mY3RfaW5pdF9vZmZzZXQ7CisKKwkvKiBJZiB3ZSB3ZXJlIGV4cGVjdGVkIGJ5IGFuIGV4cGVjdGF0aW9uLCB0aGlzIHdpbGwgYmUgaXQgKi8KKwlzdHJ1Y3QgbmZfY29ubiAqbWFzdGVyOworCisjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01BUkspCisJdV9pbnQzMl90IG1hcms7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfU0VDTUFSSworCXVfaW50MzJfdCBzZWNtYXJrOworI2VuZGlmCisKKwkvKiBFeHRlbnNpb25zICovCisJc3RydWN0IG5mX2N0X2V4dCAqZXh0OworCisJLyogU3RvcmFnZSByZXNlcnZlZCBmb3Igb3RoZXIgbW9kdWxlcywgbXVzdCBiZSB0aGUgbGFzdCBtZW1iZXIgKi8KKwl1bmlvbiBuZl9jb25udHJhY2tfcHJvdG8gcHJvdG87CisjaWZkZWYgQ09ORklHX0ZBU1ROQVRfTU9EVUxFCisJc3RydWN0IGZhc3RfY3RfZXh0IGZhc3RfY3Q7CisJc3RydWN0IGNvbm5fc2VxX3RyYWNrIGNvbm5fcGt0bG9zc1tJUF9DVF9ESVJfTUFYXTsKKyNlbmRpZgorCisJc3RydWN0IGNvbm5fc2tiaW5mbyBwYWNrZXRfaW5mb1tJUF9DVF9ESVJfTUFYXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSogaW5kZXZbSVBfQ1RfRElSX01BWF07CisJc3RydWN0IG5ldF9kZXZpY2UqIG91dGRldltJUF9DVF9ESVJfTUFYXTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm4gKgorbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmhhc2gpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihoYXNoLCBzdHJ1Y3QgbmZfY29ubiwKKwkJCSAgICB0dXBsZWhhc2hbaGFzaC0+dHVwbGUuZHN0LmRpcl0pOworfQorCitzdGF0aWMgaW5saW5lIHVfaW50MTZfdCBuZl9jdF9sM251bShjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJcmV0dXJuIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMubDNudW07Cit9CisKK3N0YXRpYyBpbmxpbmUgdV9pbnQ4X3QgbmZfY3RfcHJvdG9udW0oY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXJldHVybiBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtOworfQorCisjZGVmaW5lIG5mX2N0X3R1cGxlKGN0LCBkaXIpICgmKGN0KS0+dHVwbGVoYXNoW2Rpcl0udHVwbGUpCisKKy8qIGdldCBtYXN0ZXIgY29ubnRyYWNrIHZpYSBtYXN0ZXIgZXhwZWN0YXRpb24gKi8KKyNkZWZpbmUgbWFzdGVyX2N0KGNvbm50cikgKGNvbm50ci0+bWFzdGVyKQorCitleHRlcm4gc3RydWN0IG5ldCBpbml0X25ldDsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0ICpuZl9jdF9uZXQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXJldHVybiByZWFkX3BuZXQoJmN0LT5jdF9uZXQpOworfQorCisvKiBBbHRlciByZXBseSB0dXBsZSAobWF5YmUgYWx0ZXIgaGVscGVyKS4gKi8KK3ZvaWQgbmZfY29ubnRyYWNrX2FsdGVyX3JlcGx5KHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm5ld3JlcGx5KTsKKworLyogSXMgdGhpcyB0dXBsZSB0YWtlbj8gKGlnbm9yaW5nIGFueSBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuCisgICBjb25udHJhY2spLiAqLworaW50IG5mX2Nvbm50cmFja190dXBsZV90YWtlbihjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmlnbm9yZWRfY29ubnRyYWNrKTsKKworLyogUmV0dXJuIGNvbm50cmFja19pbmZvIGFuZCB0dXBsZSBoYXNoIGZvciBnaXZlbiBza2IuICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uICoKK25mX2N0X2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8pCit7CisJdW5zaWduZWQgbG9uZyBuZmN0ID0gc2tiX2dldF9uZmN0KHNrYik7CisKKwkqY3RpbmZvID0gbmZjdCAmIE5GQ1RfSU5GT01BU0s7CisJcmV0dXJuIChzdHJ1Y3QgbmZfY29ubiAqKShuZmN0ICYgTkZDVF9QVFJNQVNLKTsKK30KKworLyogZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvbiBhIGNvbm50cmFjayAqLworc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X3B1dChzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJV0FSTl9PTighY3QpOworCW5mX2Nvbm50cmFja19wdXQoJmN0LT5jdF9nZW5lcmFsKTsKK30KKworLyogUHJvdG9jb2wgbW9kdWxlIGxvYWRpbmcgKi8KK2ludCBuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KHVuc2lnbmVkIHNob3J0IGwzcHJvdG8pOwordm9pZCBuZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQodW5zaWduZWQgc2hvcnQgbDNwcm90byk7CisKKy8qIGxvYWQgbW9kdWxlOyBlbmFibGUvZGlzYWJsZSBjb25udHJhY2sgaW4gdGhpcyBuYW1lc3BhY2UgKi8KK2ludCBuZl9jdF9uZXRuc19nZXQoc3RydWN0IG5ldCAqbmV0LCB1OCBuZnByb3RvKTsKK3ZvaWQgbmZfY3RfbmV0bnNfcHV0KHN0cnVjdCBuZXQgKm5ldCwgdTggbmZwcm90byk7CisKKy8qCisgKiBBbGxvY2F0ZSBhIGhhc2h0YWJsZSBvZiBobGlzdF9oZWFkIChpZiBudWxscyA9PSAwKSwKKyAqIG9yIGhsaXN0X251bGxzX2hlYWQgKGlmIG51bGxzID09IDEpCisgKi8KK3ZvaWQgKm5mX2N0X2FsbG9jX2hhc2h0YWJsZSh1bnNpZ25lZCBpbnQgKnNpemVwLCBpbnQgbnVsbHMpOworCit2b2lkIG5mX2N0X2ZyZWVfaGFzaHRhYmxlKHZvaWQgKmhhc2gsIHVuc2lnbmVkIGludCBzaXplKTsKK2ludCBuZl9jb25udHJhY2tfaGFzaF9jaGVja19pbnNlcnQoc3RydWN0IG5mX2Nvbm4gKmN0KTsKK2Jvb2wgbmZfY3RfZGVsZXRlKHN0cnVjdCBuZl9jb25uICpjdCwgdTMyIHBpZCwgaW50IHJlcG9ydCk7CisKK2Jvb2wgbmZfY3RfZ2V0X3R1cGxlcHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG5ob2ZmLAorCQkgICAgICAgdV9pbnQxNl90IGwzbnVtLCBzdHJ1Y3QgbmV0ICpuZXQsCisJCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CisKK3ZvaWQgX19uZl9jdF9yZWZyZXNoX2FjY3Qoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgdTMyIGV4dHJhX2ppZmZpZXMsIGJvb2wgZG9fYWNjdCk7CisKKy8qIFJlZnJlc2ggY29ubnRyYWNrIGZvciB0aGlzIG1hbnkgamlmZmllcyBhbmQgZG8gYWNjb3VudGluZyAqLworc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X3JlZnJlc2hfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICB1MzIgZXh0cmFfamlmZmllcykKK3sKKwlfX25mX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBza2IsIGV4dHJhX2ppZmZpZXMsIHRydWUpOworfQorCisvKiBSZWZyZXNoIGNvbm50cmFjayBmb3IgdGhpcyBtYW55IGppZmZpZXMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuZl9jdF9yZWZyZXNoKHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgdTMyIGV4dHJhX2ppZmZpZXMpCit7CisJX19uZl9jdF9yZWZyZXNoX2FjY3QoY3QsIDAsIHNrYiwgZXh0cmFfamlmZmllcywgZmFsc2UpOworfQorCisvKiBraWxsIGNvbm50cmFjayBhbmQgZG8gYWNjb3VudGluZyAqLworYm9vbCBuZl9jdF9raWxsX2FjY3Qoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworLyoga2lsbCBjb25udHJhY2sgd2l0aG91dCBhY2NvdW50aW5nICovCitzdGF0aWMgaW5saW5lIGJvb2wgbmZfY3Rfa2lsbChzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJcmV0dXJuIG5mX2N0X2RlbGV0ZShjdCwgMCwgMCk7Cit9CisKKy8qIFNldCBhbGwgdW5jb25maXJtZWQgY29ubnRyYWNrIGFzIGR5aW5nICovCit2b2lkIG5mX2N0X3VuY29uZmlybWVkX2Rlc3Ryb3koc3RydWN0IG5ldCAqKTsKKworLyogSXRlcmF0ZSBvdmVyIGFsbCBjb25udHJhY2tzOiBpZiBpdGVyIHJldHVybnMgdHJ1ZSwgaXQncyBkZWxldGVkLiAqLwordm9pZCBuZl9jdF9pdGVyYXRlX2NsZWFudXBfbmV0KHN0cnVjdCBuZXQgKm5ldCwKKwkJCSAgICAgICBpbnQgKCppdGVyKShzdHJ1Y3QgbmZfY29ubiAqaSwgdm9pZCAqZGF0YSksCisJCQkgICAgICAgdm9pZCAqZGF0YSwgdTMyIHBvcnRpZCwgaW50IHJlcG9ydCk7CisKKy8qIGFsc28gc2V0IHVuY29uZmlybWVkIGNvbm50cmFja3MgYXMgZHlpbmcuIE9ubHkgdXNlIGluIG1vZHVsZSBleGl0IHBhdGguICovCit2b2lkIG5mX2N0X2l0ZXJhdGVfZGVzdHJveShpbnQgKCppdGVyKShzdHJ1Y3QgbmZfY29ubiAqaSwgdm9pZCAqZGF0YSksCisJCQkgICB2b2lkICpkYXRhKTsKKworc3RydWN0IG5mX2Nvbm50cmFja196b25lOworCit2b2lkIG5mX2Nvbm50cmFja19mcmVlKHN0cnVjdCBuZl9jb25uICpjdCk7CitzdHJ1Y3QgbmZfY29ubiAqbmZfY29ubnRyYWNrX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmUsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZywKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpyZXBsLAorCQkJCSAgIGdmcF90IGdmcCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IG5mX2N0X2lzX3RlbXBsYXRlKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoSVBTX1RFTVBMQVRFX0JJVCwgJmN0LT5zdGF0dXMpOworfQorCisvKiBJdCdzIGNvbmZpcm1lZCBpZiBpdCBpcywgb3IgaGFzIGJlZW4gaW4gdGhlIGhhc2ggdGFibGUuICovCitzdGF0aWMgaW5saW5lIGludCBuZl9jdF9pc19jb25maXJtZWQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXJldHVybiB0ZXN0X2JpdChJUFNfQ09ORklSTUVEX0JJVCwgJmN0LT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZl9jdF9pc19keWluZyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJcmV0dXJuIHRlc3RfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKTsKK30KKworLyogUGFja2V0IGlzIHJlY2VpdmVkIGZyb20gbG9vcGJhY2sgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBuZl9pc19sb29wYmFja19wYWNrZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5kZXYgJiYgc2tiLT5za2JfaWlmICYmIHNrYi0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSzsKK30KKworI2RlZmluZSBuZmN0X3RpbWVfc3RhbXAgKCh1MzIpKGppZmZpZXMpKQorCisvKiBqaWZmaWVzIHVudGlsIGN0IGV4cGlyZXMsIDAgaWYgYWxyZWFkeSBleHBpcmVkICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbmZfY3RfZXhwaXJlcyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJczMyIHRpbWVvdXQgPSBSRUFEX09OQ0UoY3QtPnRpbWVvdXQpIC0gbmZjdF90aW1lX3N0YW1wOworCisJcmV0dXJuIHRpbWVvdXQgPiAwID8gdGltZW91dCA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZl9jdF9pc19leHBpcmVkKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwlyZXR1cm4gKF9fczMyKShSRUFEX09OQ0UoY3QtPnRpbWVvdXQpIC0gbmZjdF90aW1lX3N0YW1wKSA8PSAwOworfQorCisvKiB1c2UgYWZ0ZXIgb2J0YWluaW5nIGEgcmVmZXJlbmNlIGNvdW50ICovCitzdGF0aWMgaW5saW5lIGJvb2wgbmZfY3Rfc2hvdWxkX2djKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwlyZXR1cm4gbmZfY3RfaXNfZXhwaXJlZChjdCkgJiYgbmZfY3RfaXNfY29uZmlybWVkKGN0KSAmJgorCSAgICAgICAhbmZfY3RfaXNfZHlpbmcoY3QpOworfQorCisjZGVmaW5lCU5GX0NUX0RBWQkoODY0MDAgKiBIWikKKworLyogU2V0IGFuIGFyYml0cmFyeSB0aW1lb3V0IGxhcmdlIGVub3VnaCBub3QgdG8gZXZlciBleHBpcmUsIHRoaXMgc2F2ZQorICogdXMgYSBjaGVjayBmb3IgdGhlIElQU19PRkZMT0FEX0JJVCBmcm9tIHRoZSBwYWNrZXQgcGF0aCB2aWEKKyAqIG5mX2N0X2lzX2V4cGlyZWQoKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X29mZmxvYWRfdGltZW91dChzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJaWYgKG5mX2N0X2V4cGlyZXMoY3QpIDwgTkZfQ1RfREFZIC8gMikKKwkJV1JJVEVfT05DRShjdC0+dGltZW91dCwgbmZjdF90aW1lX3N0YW1wICsgTkZfQ1RfREFZKTsKK30KKworc3RydWN0IGtlcm5lbF9wYXJhbTsKKworaW50IG5mX2Nvbm50cmFja19zZXRfaGFzaHNpemUoY29uc3QgY2hhciAqdmFsLCBjb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7CitpbnQgbmZfY29ubnRyYWNrX2hhc2hfcmVzaXplKHVuc2lnbmVkIGludCBoYXNoc2l6ZSk7CisKK2V4dGVybiBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqbmZfY29ubnRyYWNrX2hhc2g7CitleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKK2V4dGVybiBzZXFjb3VudF9zcGlubG9ja190IG5mX2Nvbm50cmFja19nZW5lcmF0aW9uOworZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfbWF4OworCisvKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHJjdSByZWFkIGxvY2sgaGVsZCAqLworc3RhdGljIGlubGluZSB2b2lkCituZl9jb25udHJhY2tfZ2V0X2h0KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICoqaGFzaCwgdW5zaWduZWQgaW50ICpoc2l6ZSkKK3sKKwlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaHB0cjsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2UsIGhzejsKKworCWRvIHsKKwkJc2VxdWVuY2UgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbik7CisJCWhzeiA9IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKKwkJaHB0ciA9IG5mX2Nvbm50cmFja19oYXNoOworCX0gd2hpbGUgKHJlYWRfc2VxY291bnRfcmV0cnkoJm5mX2Nvbm50cmFja19nZW5lcmF0aW9uLCBzZXF1ZW5jZSkpOworCisJKmhhc2ggPSBocHRyOworCSpoc2l6ZSA9IGhzejsKK30KKworc3RydWN0IG5mX2Nvbm4gKm5mX2N0X3RtcGxfYWxsb2Moc3RydWN0IG5ldCAqbmV0LAorCQkJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmUsCisJCQkJIGdmcF90IGZsYWdzKTsKK3ZvaWQgbmZfY3RfdG1wbF9mcmVlKHN0cnVjdCBuZl9jb25uICp0bXBsKTsKKwordTMyIG5mX2N0X2dldF9pZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK25mX2N0X3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gaW5mbykKK3sKKwlza2Jfc2V0X25mY3Qoc2tiLCAodW5zaWduZWQgbG9uZyljdCB8IGluZm8pOworfQorCisjZGVmaW5lIE5GX0NUX1NUQVRfSU5DKG5ldCwgY291bnQpCSAgX190aGlzX2NwdV9pbmMoKG5ldCktPmN0LnN0YXQtPmNvdW50KQorI2RlZmluZSBORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBjb3VudCkgdGhpc19jcHVfaW5jKChuZXQpLT5jdC5zdGF0LT5jb3VudCkKKyNkZWZpbmUgTkZfQ1RfU1RBVF9BRERfQVRPTUlDKG5ldCwgY291bnQsIHYpIHRoaXNfY3B1X2FkZCgobmV0KS0+Y3Quc3RhdC0+Y291bnQsICh2KSkKKworI2RlZmluZSBNT0RVTEVfQUxJQVNfTkZDVF9IRUxQRVIoaGVscGVyKSBcCisgICAgICAgIE1PRFVMRV9BTElBUygibmZjdC1oZWxwZXItIiBoZWxwZXIpCisKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX0ggKi8K