ZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzQ5LzQ5NzRlMDNiMWZlOWQyNTM1ZDEzODUyYzVjMmQzMWRkZGVjZDhmZDIuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS80OS80OTc0ZTAzYjFmZTlkMjUzNWQxMzg1MmM1YzJkMzFkZGRlY2Q4ZmQyLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzQxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS80OS80OTc0ZTAzYjFmZTlkMjUzNWQxMzg1MmM1YzJkMzFkZGRlY2Q4ZmQyLnN2bi1iYXNlCkBAIC0wLDAgKzEsMzUgQEAKKyMgJElkJAoraW1wb3J0IGluY19zaXAgYXMgc2lwCitpbXBvcnQgaW5jX3NkcCBhcyBzZHAKKworc2RwID0gXAorIiIiCit2PTAKK289LSAwIDAgSU4gSVA0IDEyNy4wLjAuMQorcz1wam1lZGlhCitjPUlOIElQNCAxMjcuMC4wLjEKK3Q9MCAwCittPWF1ZGlvIDQwMDAgUlRQL0FWUCAwIDEwMQorYT1pY2UtdWZyYWc6MTIzNAorYT1pY2UtcHdkOjU2NzgKK2E9cnRwbWFwOjAgUENNVS84MDAwCithPXNlbmRyZWN2CithPXJ0cG1hcDoxMDEgdGVsZXBob25lLWV2ZW50LzgwMDAKK2E9Zm10cDoxMDEgMC0xNQorYT1jYW5kaWRhdGU6WFggMSBVRFAgMTIzNCAxMjcuMC4wLjEgNDAwMCB0eXAgaG9zdAorYT1jYW5kaWRhdGU6WVkgMiBVRFAgMTIzNCAxMjcuMC4wLjEgNDAwMSB0eXAgaG9zdAorIiIiCisKK2FyZ3MgPSAiLS1udWxsLWF1ZGlvIC0tdXNlLWljZSAtLWF1dG8tYW5zd2VyIDIwMCAtLW1heC1jYWxscyAxIgoraW5jbHVkZSA9IFsiYT1pY2UtdWZyYWciLAkJCSMgbXVzdCBoYXZlIElDRQorCSAgICJhPWNhbmRpZGF0ZTpbMC05YS16QS1aXSsgMiBVRFAiCSMgbXVzdCBoYXZlIFJUQ1AgY29tcG9uZW50CisJICAgXQkJICAgCQorZXhjbHVkZSA9IFsKKwkgICAiaWNlLW1pc21hdGNoIgkJICAgICAJIyBtdXN0IG5vdCBtaXNtYXRjaAorCSAgXQorCitzZW5kdG9fY2ZnID0gc2lwLlNlbmR0b0NmZyggImNhbGxlciBzZW5kcyB0d28gY29tcG9uZW50cyB3aXRob3V0IGE9cnRjcCBsaW5lIiwgCisJCQkgICAgcGpzdWFfYXJncz1hcmdzLCBzZHA9c2RwLCByZXNwX2NvZGU9MjAwLCAKKwkJCSAgICByZXNwX2luYz1pbmNsdWRlLCByZXNwX2V4Yz1leGNsdWRlLAorCQkJICAgIGVuYWJsZV9idWZmZXIgPSBUcnVlKQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS80OS80OTk1YmQyNjk4ZDQzYThkY2QyZjA0MWEzOTU3M2ZkOGQ4NTY1NjY4LnN2bi1iYXNlIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvNDkvNDk5NWJkMjY5OGQ0M2E4ZGNkMmYwNDFhMzk1NzNmZDhkODU2NTY2OC5zdm4tYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjlmYzIxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvNDkvNDk5NWJkMjY5OGQ0M2E4ZGNkMmYwNDFhMzk1NzNmZDhkODU2NTY2OC5zdm4tYmFzZQpAQCAtMCwwICsxLDU0NyBAQAorIC8qKg0KKyAqIEBmaWxlIGJkSU1BRHBqLmgNCisgKiBAYnJpZWYgYmRTb3VuZCBJTXByb3ZlZCBBdWRpbyBEZXZpY2UgZm9yIFBKU0lQLg0KKyAqLw0KKyANCisvKioNCisgKiBAZGVmZ3JvdXAgYmRfSU1BRCBiZElNQURwaiBiZFNvdW5kIElNcHJvdmVkIEF1ZGlvIERldmljZSBmb3IgUEpTSVAuDQorICogQGluZ3JvdXAgYXVkaW9fZGV2aWNlX2FwaQ0KKyAqIA0KKyAqIDxiPmJkU291bmQgSU1wcm92ZWQgQXVkaW8gRGV2aWNlPC9iPiBpcyBhIG11bHRpcGxhdGZvcm0gYXVkaW8gaW50ZXJmYWNlDQorICogY3JlYXRlZCB0byBpbnRlZ3JhdGUgaW4gPGI+UEpTSVA8L2I+IGxpYnJhcnkgd2l0aCBubyBlZmZvcnQuDQorICogXG4gUG9ydGluZyA8Yj5iZElNQURwajwvYj4gYWNyb3NzIHRoZSBtYWluIG9wZXJhdGluZyBzeXN0ZW1zIGlzDQorICogc3RyYWlnaHRmb3J3YXJkLCB3aXRob3V0IHRoZSBuZWVkIG9mIGNoYW5nZSBhIHNpbmdsZSBsaW5lIG9mIGNvZGUuDQorICoNCisgKiAgICAtIDxiPkZlYXR1cmVzPC9iPg0KKyAqICAgICAgIC0gRWNobyBjYW5jZWxsYXRpb24gKEZ1bGwgRHVwbGV4KQ0KKyAqICAgICAgIC0gTm9pc2UgcmVkdWN0aW9uDQorICogICAgICAgLSBBdXRvbWF0aWMgR2FpbiBDb250cm9sDQorICogICAgICAgLSBBdWRpbyBFbmhhbmNlbWVudA0KKyAqDQorICogICAgLSA8Yj5TdXBwb3J0ZWQgb3BlcmF0aW5nIHN5c3RlbXM8L2I+DQorICogICAgICAgLSBXaW5kb3dzDQorICogICAgICAgLSBBbmRyb2lkDQorICogICAgICAgLSBNYWNPUyBYDQorICogICAgICAgLSBpT1MNCisgKiAgICAgICAtIExpbnV4IC8gQWxzYQ0KKyAqDQorICogICAgLSA8Yj5TdXBwb3J0ZWQgcGxhdGZvcm1zPC9iPg0KKyAqICAgICAgIC0geDg2DQorICogICAgICAgLSB4NjQNCisgKiAgICAgICAtIEFSTSBDb3J0ZXgtQTgvQTkvQTE1IHdpdGggTkVPTg0KKyAqIA0KKyAqIFZpc2l0IDxhIGhyZWY9Imh0dHA6L3d3dy5iZHNvdW5kLmNvbSIgdGFyZ2V0PSJuZXciPmJkU291bmQ8L2E+IGZvciB1cGRhdGVkDQorICogZmVhdHVyZXMsIHN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtcyBhbmQgcGxhdGZvcm1zLg0KKyAqIA0KKyAqIDxiPlVzaW5nIFBKU0lQIHdpdGggYmRJTUFEIGF1ZGlvIGRldmljZTwvYj4NCisgKiANCisgKiAgICAtIDxiPkludGVncmF0aW9uPC9iPg0KKyAqICAgIFxuIFVzaW5nIDxiPmJkSU1BRDwvYj4gd2l0aGluIDxiPlBKU0lQPC9iPiBpcyBzaW1wbGU6DQorICogICAgICAgLSMgUmVxdWVzdCBmb3IgYmRJTUFEcGogbGlicmFyeSB0bw0KKyAqICAgICAgIDxhIGhyZWY9Imh0dHA6L3d3dy5iZHNvdW5kLmNvbSIgdGFyZ2V0PSJuZXciPmJkU291bmQ8L2E+Og0KKyAqICAgICAgICBiZFNvdW5kIHdpbGwgcHJvdmlkZSBpbnN0cnVjdGlvbiB0byBpbnRlZ3JhdGUgdGhlIGxpYnJhcnkgZGVwZW5kaW5nIG9uDQorICogICAgICAgIHRoZSBwbGF0Zm9ybSAvIE8uUy4gLyB0b29sY2hhaW47DQorICogICAgICAgLSMgQWRkIHRoZSA8Y29kZT5iZGltYWRfZGV2LmM8L2NvZGU+IGZpbGUgdG8NCisgKiAgICAgICA8Y29kZT5wam1lZGlhL3NyYy9wam1lZGlhLWF1ZGlvZGV2PC9jb2RlPiBmb2xkZXI7DQorICogICAgICAgLSMgRW5hYmxlIHRoZSBiZElNQUQgYXVkaW8gZGV2aWNlIGRlZmluaW5nIHRoZSBwZXJpZmVyYWwgaW4gdGhlDQorICogICAgICAgPGNvZGU+cGovY29uZmlnX3NpdGUuaDwvY29kZT4gYW5kIGRpc2FibGluZyBhbGwgb3RoZXIgZGV2aWNlczoNCisgKiAgICAgICA8cHJlPg0KKyAqICAgICAgICNkZWZpbmUgUEpNRURJQV9BVURJT19ERVZfSEFTX0JESU1BRCAxDQorICogICAgICAgPC9wcmU+DQorICoNCisgKiAgICAtIDxiPlVzYWdlPC9iPg0KKyAqICAgIFxuIFRoZXJlIGFyZSBvbmx5IGEgY291cGxlIG9mIHRoaW5ncyB0aGUgY3VzdG9tZXIgaGF2ZSB0byBwYXkgYXR0ZW50aW9uIG9uDQorICogICAgp3doZW4gdXNpbmcgYmRJTUFEIGxpYnJhcnkuDQorICoNCisgKiAgICAgICAtIDxiPkluaXRpYWxpemF0aW9uPC9iPg0KKyAqICAgICAgIFxuIFNpbmNlIHRoZSBiZElNQUQgbGlicmFyeSBwcm92aWRlIGl0c2VsZiB0aGUgZWNobyBjYW5jZWxsYXRpb24NCisgKiAgICAgICBhbmQgdGhlIGxhdGVuY3kgbWFuYWdlbWVudCwgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlc2UgZmVhdHVyZXMNCisgKiAgICAgICBpbiB0aGUgUEpTSVAgbGlicmFyaXkgYXBwbGljYXRpb25zLg0KKyAqICAgICAgIFxuIEZvciBleGFtcGxlIGluIFBKU1VBIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGVyZSBpcyB0aGUgbmVlZA0KKyAqICAgICAgIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBjb21tYW5kczoNCisgKiAgICAgICA8cHJlPg0KKyAqICAgICAgIC0tZWMtdGFpbD0wDQorICogICAgICAgLS1uby12YWQNCisgKiAgICAgICAtLWNhcHR1cmUtbGF0PTANCisgKiAgICAgICAtLXBsYXliYWNrLWxhdD0wDQorICogICAgICAgPC9wcmU+DQorICogDQorICogICAgICAgLSA8Yj5TdXBwb3J0ZWQgc2V0IGNhcGFiaWxpdHk8L2I+DQorICogICAgICAgICAgLSA8Y29kZT5QSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9WT0xVTUVfU0VUVElORzwvY29kZT4NCisgKiAgICAgICAgICBcbiBTZXR0aW5nIHNwZWFrZXIgdm9sdW1lLg0KKyAqICAgICAgICAgIC0gPGNvZGU+UEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9WT0xVTUVfU0VUVElORzwvY29kZT4NCisgKiAgICAgICAgICBcbiBTZXR0aW5nIG1pY2hyb3Bob25lIHZvbHVtZS4NCisgKiAgICAgICAgICAtIDxjb2RlPlBKTUVESUFfQVVEX0RFVl9DQVBfRUM8L2NvZGU+DQorICogICAgICAgICAgXG4gRW5hYmxlL2Rpc2FibGUgZWNobyBjYW5jZWxsYXRpb24uDQorICoNCisgKiBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB2aXNpdA0KKyAqIDxhIGhyZWY9Imh0dHA6L3d3dy5iZHNvdW5kLmNvbSIgdGFyZ2V0PSJuZXciPnd3dy5iZHNvdW5kLmNvbTwvYT4NCisgKiBvciB3cml0ZSB0byBpbmZvQGJkc291bmQuY29tDQorICoNCisgKiBAYXV0aG9yIGJkU291bmQNCisgKiBAdmVyc2lvbiAgIDEuMC4xDQorICogQGNvcHlyaWdodCAyMDEyIGJkU291bmQgc3JsLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqDQorICovDQorDQorLyoqICAgICAgICANCisgKiBAZGVmZ3JvdXAgZ3JvdXBGdW5jdGlvbiBGdW5jdGlvbnMgICAgICANCisgKiBAaW5ncm91cCBiZF9JTUFEICANCisgKiANCisgKiBGdW5jdGlvbnMgZGVmaW5lZCBpbiBiZElNQUQuDQorICovDQorDQorLyoqICAgICAgICANCisgKiBAZGVmZ3JvdXAgZ3JvdXBDYWxsYmFjayBDYWxsYmFja3MgICAgICANCisgKiBAaW5ncm91cCBiZF9JTUFEICAgIA0KKyAqIA0KKyAqIENhbGxiYWNrcyBkZWZpbmVkIGluIGJkSU1BRC4NCisgKi8NCisgDQorLyoqICAgICAgICANCisgKiBAZGVmZ3JvdXAgZ3JvdXBTdHJ1Y3RFbnVtIFN0cnVjdHMgYW5kIEVudW1zICAgICAgIA0KKyAqIEBpbmdyb3VwIGJkX0lNQUQgICANCisgKiANCisgKiBTdHJ1Y3QgYW5kIEVudW0gZGVmaW5lZCBpbiBiZElNQUQuDQorICovDQorDQorI2lmbmRlZiBCRF9JTUFEX1BKX0hfXw0KKyNkZWZpbmUgQkRfSU1BRF9QSl9IX18NCisgIA0KKy8qKg0KKyAqIEBicmllZiBNYWNybyBmb3IgV2luZG93cyBETEwgU3VwcG9ydC4NCisgKi8NCisgDQorI2lmZGVmIF9CRElNQURQSl9FWFBPUlRETEwNCisJI2lmZGVmIFdJTjMyDQorCQkjZGVmaW5lIEJESU1BRFBKX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkNCisJI2Vsc2UNCisJCSNkZWZpbmUgQkRJTUFEUEpfQVBJIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCQ0KKwkjZW5kaWYNCisjZWxzZQ0KKwkjZGVmaW5lIEJESU1BRFBKX0FQSQ0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgQkRfSU1BRF9DQVBUVVJFX0RFVklDRVMgICAgICAxDQorI2RlZmluZSBCRF9JTUFEX1BMQVlCQUNLX0RFVklDRVMgICAgIDANCisjZGVmaW5lIEJEX0lNQURfRElBR05PU1RJQ19FTkFCTEUgICAgMQ0KKyNkZWZpbmUgQkRfSU1BRF9ESUFHTk9TVElDX0RJU0FCTEUgICAwDQorDQorI2RlZmluZSBCRF9JTUFEX0JJVFNfWF9TQU1QTEUJICAgICAxNiAgICAgICAgICAgICAgICAgIC8qKjwgQml0cyBwZXIgc2FtcGxlICovDQorDQordHlwZWRlZiB2b2lkKiBiZElNQURwajsNCisNCisvKioNCisgKiBAYWRkdG9ncm91cCBncm91cENhbGxiYWNrDQorICogQHsNCisgKi8NCisNCisvKioNCisgKiBAYnJpZWYgQ2FsbGJhY2sgdXNlZCB0byBmaWxsIHRoZSBwbGF5YmFjayBidWZmZXIgb2YgYmRJTUFELg0KKyAqIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYmRJTUFEIGVhY2ggdGltZSBhcmUgcmVxdWlyZWQgc2FtcGxlIHRvIGJlIHBsYXllZC4NCisgKiBAcGFyYW1baW5dICpidWZmZXIgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2l0aCB0aGUgYXVkaW8NCisgKiAJCQkJICAgICAgIHNhbXBsZXMgdG8gYmUgcGxheWVkKHNob3J0IHR5cGUpLg0KKyAqIEBwYXJhbVtpbl0gblNhbXBsZXMgICAgICAgICAgICAgICAgIG51bWJlciBvZiBzYW1wbGVzIHJlcXVpcmVkLg0KKyAqIEBwYXJhbVtpbl0gdXNlcl9kYXRhICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHVzZXIgZGF0YSBzdHJ1Y3R1cmUNCisgKiAJCQkJICAgICAgIGRlZmluZWQgaW4gdGhlIGJkSU1BRHBqX1NldHRpbmdfdA0KKyAqIAkJCQkgICAgICAgc3RydWN0dXJlLg0KKyAqIEByZXR1cm4gbm9uZS4NCisgKi8NCisNCit0eXBlZGVmIGludCAoKiBjYl9maWxsUGxheUJhY2tCX3QpICh2b2lkICpidWZmZXIsIGludCBuU2FtcGxlcywNCisJCQkJICAgIHZvaWQgKnVzZXJfZGF0YSk7DQorDQorLyoqDQorICogQGJyaWVmIENhbGxiYWNrIHVzZWQgdG8gcmV0cml2ZSB0aGUgY2FwdXRyZSBidWZmZXIgb2YgYmRJTUFELiBUaGUgZnVuY3Rpb24NCisgKiBpcyBjYWxsZWQgYnkgYmRJTUFEIGVhY2ggdGltZSBwcm9jZXNzZWQgbWljIHNhbXBsZXMgYXJlIGF2YWlsYWJsZS4NCisgKiBAcGFyYW1bb3V0XSAqYnVmZmVyICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2l0aCB0aGUgYXVkaW8NCisgKiAJCQkJICAgICAgIHNhbXBsZXMgdG8gZG93bmxvYWQoc2hvcnQgdHlwZSkuDQorICogQHBhcmFtW2luXSBuU2FtcGxlcyAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHNhbXBsZXMgcHJvY2Vzc2VkIHRvIGRvd25sb2FkLg0KKyAqIEBwYXJhbVtpbl0gdXNlcl9kYXRhICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHVzZXIgZGF0YSBzdHJ1Y3R1cmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIHRoZSBNYWluU2V0IHN0cnVjdHVyZS4NCisgKiBAcmV0dXJuIG5vbmUuDQorICovDQorDQordHlwZWRlZiB2b2lkICgqIGNiX2VtcHR5Q2FwdHVyZUJfdCkgKHZvaWQgKmJ1ZmZlciwgaW50IG5TYW1wbGVzLA0KKwkJCQkgICAgIHZvaWQgKnVzZXJfZGF0YSk7DQorLyoqDQorICogQH0NCisgKi8NCisNCisvKioNCisgKiBAYWRkdG9ncm91cCBncm91cFN0cnVjdEVudW0NCisgKiBAew0KKyAqLw0KKyANCisvKioNCisgKiBAYnJpZWYgRXJyb3Igc3RhdHVzIHJldHVybmVkIGJ5IHNvbWUgZnVuY3Rpb25zIGluIHRoZSBsaWJyYXJ5Lg0KKyAqLw0KKw0KK3R5cGVkZWYgZW51bSBiZElNQURwal9TdGF0dXN7DQorICAgIC8qKjwgTm8gZXJyb3IuICovDQorICAgIEJEX1BKX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwNCisgICAgLyoqPCBXYXRjaCBiZElNQURwal9XYXJuaW5nc190IHN0cnVjdHVyZSB0byBmaW5kIHRoZSB3YXJuaW5ncy4gKi8NCisgICAgQkRfUEpfV0FSTl9CRElNQURfV0FSTklOR19BU1NFUlRFRCAgICAgICAgICAgPSAxLA0KKyAgICAvKio8IEVycm9yIG5vdCBpZGVudGlmaWVkLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9HRU5FUklDICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsDQorICAgIC8qKjwgVGhlIHBvaW50ZXIgcGFzc2VkIGlzIE5VTEwuICovDQorICAgIEJEX1BKX0VSUk9SX05VTExfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgID0gMywNCisgICAgLyoqPCBBbGxvY2F0aW9uIHByb2NlZHVyZSBmYWlsZWQuICovDQorICAgIEJEX1BKX0VSUk9SX0FMTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgID0gNCwNCisgICAgLyoqPCBUaGUgcGFyYW1ldGVyIGlzIG5vdCBleGlzdGVudCBvciB0aGUgc2V0L2dldCBmdW5jdGlvbiBpcyBub3QgYWN0aXZlLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9QQVJBTUVURVJfTk9UX0ZPVU5EICAgICAgICAgICAgICA9IDUsDQorICAgIC8qKjwgTm8gY2FwdHVyZSBkZXZpY2UgZm91bmQuICovDQorICAgIEJEX1BKX0VSUk9SX0lNQURfTk9ORV9DQVBUVVJFX0RFViAgICAgICAgICAgID0gMTAsDQorICAgIC8qKjwgTm8gcGxheSBkZXZpY2UgZm91bmQuICovDQorICAgIEJEX1BKX0VSUk9SX0lNQURfTk9ORV9QTEFZX0RFViAgICAgICAgICAgICAgID0gMTEsDQorICAgIC8qKjwgRnJhbWUgc2l6ZSBub3QgYWxsb3dlZC4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9GUkFNRV9TSVpFICAgICAgICAgICAgICAgICAgPSAxMiwNCisgICAgLyoqPCBTYW1wbGUgZnJlcXVlbmN5IG5vdCBhbGxvd2VkLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9JTUFEX1NBTVBMRV9GUkVRICAgICAgICAgICAgICAgICA9IDEzLA0KKyAgICAvKio8IFNhbXBsZXMgbWlzc2luZy4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9NSVNTSU5HX1NBTVBMRVMgICAgICAgICAgICAgPSAxNCwNCisgICAgLyoqPCBEZXZpY2UgbGlzdCBpcyBlbXB0eS4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9ERVZJQ0VfTElTVF9FTVBUWSAgICAgICAgICAgPSAxNSwNCisgICAgLyoqPCBMaWJyYXJ5IG5vdCBhdXRob3JpemVkLCBlbnRlcmluZyBkZW1vIG1vZGUuICovDQorICAgIEJEX1BKX0VSUk9SX0lNQURfTElCX05PVF9BVVRIT1JJWkVEICAgICAgICAgID0gMTYsDQorICAgIC8qKjwgVGhlIGlucHV0IGNoYW5uZWwgbWVtb3J5IGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQuICovDQorICAgIEJEX1BKX0VSUk9SX0lNQURfSU5QVVRfQ0hfTk9UX0FMTE9DQVRFRCAgICAgID0gMTcsDQorICAgIC8qKjwgVGhlIGxpYnJhcnkgaGFzIGV4cGlyZWQsIGVudGVyaW5nIGRlbW8gbW9kZS4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9MSUNFTlNFX0VYUElSRUQgICAgICAgICAgICAgPSAxOCwNCisgICAgLyoqPCBPcGVuIG9mIGNhcHR1cmUgZGV2aWNlIGZhaWxlZC4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9PUEVOX0NBUFRVUkVfREVWX0ZBSUxFRCAgICAgPSAxOSwNCisgICAgLyoqPCBPcGVuIG9mIHBsYXkgZGV2aWNlIGZhaWxlZC4gICovDQorICAgIEJEX1BKX0VSUk9SX0lNQURfT1BFTl9QTEFZX0RFVl9GQUlMRUQgICAgICAgID0gMjAsDQorICAgIC8qKjwgU3RhcnQgb2YgcGxheSBkZXZpY2UgZmFpbGVkLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9JTUFEX1NUQVJUX1BMQVlfREVWX0ZBSUxFRCAgICAgICA9IDIxLA0KKyAgICAvKio8IFN0YXJ0IG9mIGNhcHR1cmUgZGV2aWNlIGZhaWxlZC4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9TVEFSVF9DQVBUVVJFX0RFVl9GQUlMRUQgICAgPSAyMiwNCisgICAgLyoqPCBTdGFydCBvZiB0aW1lIHByb2Nlc3MgZmFpbGVkLiAqLw0KKyAgICBCRF9QSl9FUlJPUl9JTUFEX1NUQVJUX1RJTUVfUFJPQ0VTU19GQUlMRUQgICA9IDIzLA0KKyAgICAvKio8IFN0YXJ0IG9mIHRocmVhZCBwcm9jZXNzIGZhaWxlZC4gKi8NCisgICAgQkRfUEpfRVJST1JfSU1BRF9USFJFQURfUFJPQ0VTU19GQUlMRUQgICAgICAgPSAyNCwNCisgICAgLyoqPCBObyB2b2x1bWUgY29udHJvbCBhdmFpbGFibGUuICovDQorICAgIEJEX1BKX0VSUk9SX0lNQURfTk9fVk9MX0NPTlRST0xfQVZBSUxBQkxFICAgID0gMjUsDQorfSBiZElNQURwal9TdGF0dXM7DQorDQorLyoqDQorICogQGJyaWVmIFBhcmFtZXRlciB0byBwYXNzIHRvIHNldCBhbmQgZ2V0IHBhcmFtZXRlciBmdW5jdGlvbnMuIA0KKyAqDQorICogRm9yIGVhY2ggZW51bWVyYXRpb24gYXJlIGRlZmluZWQgdGhlIGRhdGEgdHlwZSBhbmQgdGhlIHN1cHBvcnRlZCBvcGVyYXRpb25zDQorICogb24gdGhhdCBwYXJhbWV0ZXIgKHNldCBhbmQgZ2V0KS4NCisgKi8NCisgICANCit0eXBlZGVmIGVudW0gYmRJTUFEcGpfUGFyYW1ldGVyew0KKyAgICAvKio8IGludCogICBcbiBzZXQvZ2V0IFxuIDEgZW5hYmxlIC8gMCBkaXNhYmxlIGVjaG8gY2FuY2VsbGF0aW9uLiAqLw0KKyAgICBCRF9QQVJBTV9JTUFEX1BKX0FFQ19FTkFCTEUgICAgICAgICAgICAgICAgID0gMSwNCisgICAgLyoqPCBpbnQqICAgXG4gc2V0L2dldCBcbiAxIGVuYWJsZSAvIDAgZGlzYWJsZSBtaWNyb3Bob25lIGNvbnRyb2wNCisgICAgICogKHdoZW4gcG9zc2libGUpLiAqLw0KKyAgICBCRF9QQVJBTV9JTUFEX1BKX01JQ19DT05UUk9MX0VOQUJMRSAgICAgICAgID0gMiwNCisgICAgLyoqPCBpbnQqICAgXG4gc2V0L2dldCBcbiAxIGViYWJsZSAvIDAgZGlzYWJsZSBub2lzZSByZWR1Y3Rpb24uICovDQorICAgIEJEX1BBUkFNX0lNQURfUEpfTk9JU0VfUkVEVUNUSU9OX0VOQUJMRSAgICAgPSAzLA0KKyAgICAvKio8IGludCogICBcbiBzZXQgICAgIFxuIG51bWJlciBvZiBjaGFubmVsIHRvIHJlc2V0LiBVc2VkIHRvIHJlc2V0DQorICAgICAqIHRoZSBpbnB1dCBjaGFubmVsIHN0YXRpc3RpY3MuIFRvIGJlIHVzZWQgd2hlbiB0aGUgc2FtZSBjaGFubmVsDQorICAgICAqIGlzIGFzc2lnbmVkIHRvIGFub3RoZXIgcGFydGVjaXBhbnQuICovDQorICAgIEJEX1BBUkFNX0lNQURfUEpfUkVTRVRfU1RBVElTVElDX0lOX0NIICAgICAgPSA0LA0KKyAgICAvKio8IGZsb2F0KiBcbiBzZXQvZ2V0IFxuIDAuMGYgLT4gMS4wZiB2b2x1bWUgb2YNCisgICAgICogdGhlIG1pY3JvcGhvbmUod2hlbiBwb3NzaWJsZSkuICovDQorICAgIEJEX1BBUkFNX0lNQURfUEpfTUlDX1ZPTFVNRSAgICAgICAgICAgICAgICAgPSA1LA0KKyAgICAvKio8IGludCogICBcbiBzZXQvZ2V0IFxuIDAgbXV0ZSAvIDEgbm90IG11dGUgb24gbWljcm9waG9uZQ0KKyAgICAgKiAod2hlbiBwb3NzaWJsZSkuICovDQorICAgIEJEX1BBUkFNX0lNQURfUEpfTUlDX01VVEUgICAgICAgICAgICAgICAgICAgPSA2LA0KKyAgICAvKio8IGZsb2F0KiBcbiBzZXQvZ2V0IFxuIDAuMGYgLT4gMS4wZiB2b2x1bWUgb2YgdGhlIHNwZWFrZXIuICovDQorICAgIEJEX1BBUkFNX0lNQURfUEpfU1BLX1ZPTFVNRSAgICAgICAgICAgICAgICAgPSA3LA0KKyAgICAvKio8IGludCogICBcbiBzZXQvZ2V0IFxuIDAgbXV0ZSAvIDEgbm90IG11dGUgb24gc3BlYWtlci4gKi8NCisgICAgQkRfUEFSQU1fSU1BRF9QSl9TUEtfTVVURSAgICAgICAgICAgICAgICAgICA9IDgsDQorfSBiZElNQURwal9QYXJhbWV0ZXI7DQorDQorDQorLyoqDQorICogQGJyaWVmIEluc3RhbmNlIHN0cnVjdHVyZSBmb3IgdGhlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgYWVjIGVuZ2luZS4NCisgKi8NCisNCit0eXBlZGVmIHN0cnVjdCBiZElNQURwal9TZXR0aW5nX3R7DQorICAgIC8qKjwgU2FtcGxlIGZyZXF1ZW5jeSAoOGtIeiBvciAxNmtIeikuICovDQorICAgIGludCAgICAgICAgICAgICAgICAgU2FtcGxpbmdGcmVxdWVuY3k7DQorICAgIC8qKjwgQXVkaW8gYnVmZmVyIG1hbmFnZWQgYnkgdGhlIGFlYyBiZElNQUQgZnVuY3Rpb25zLg0KKyAgICAgKiAoZnJvbSAxNm1zIHRvIDgwbXMsIDE2bXMgcmVjb21tZW5kZWQpLiAqLw0KKyAgICBpbnQgICAgICAgICAgICAgICAgIEZyYW1lU2l6ZV9tczsNCisgICAgLyoqPCBQb2ludHMgdG8gdGhlIHZhbGlkYXRpb24gZnVuY3Rpb25zIGluIHRoZSB2YWxpZGF0aW9uIGxpYnJhcnkuICovDQorICAgIHZvaWQgICAgICAgICAgICAgICAgKnZhbGlkYXRlOw0KKyAgICAvKio8IFBvaW50cyB0byB0aGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgZm9yIGZpbGxpbmcNCisgICAgICogdGhlIHBsYXliYWNrIGJ1ZmZlciBvZiBiZElNQUQuICovDQorICAgIGNiX2ZpbGxQbGF5QmFja0JfdCAgY2JfZmlsbFBsYXlCYWNrQnVmZmVyOw0KKyAgICAvKio8IFBvaW50cyB0byB1c2VyIGRhdGEgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2suICovDQorICAgIHZvaWQgICAgICAgICAgICAgICAgKmNiX2ZpbGxQbGF5QmFja0J1ZmZlcl91c2VyX2RhdGE7DQorICAgIC8qKjwgUG9pbnRzIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGZvciByZXRyZWl2ZSB0aGUgcHJvY2Vzc2VkDQorICAgICAqIGF1ZGlvIHByZXNlbnQgaW4gdGhlIGNhcHR1cmUgYnVmZmVyIG9mIGJkSU1BRC4gKi8NCisgICAgY2JfZW1wdHlDYXB0dXJlQl90ICBjYl9lbXB0eUNhcHR1cmVCdWZmZXI7DQorICAgIC8qKjwgUG9pbnRzIHRvIHVzZXIgZGF0YSB0byBwYXNzIHRvIHRoZSBjYWxsYmFjay4gKi8NCisgICAgdm9pZCAgICAgICAgICAgICAgICAqY2JfZW1wdHlDYXB0dXJlQnVmZmVyX3VzZXJfZGF0YTsNCisgICAgLyoqPCBJcyBhIHdpZGUgY2hhciBwb2ludGVyIHRvIHRoZSBjYXB0dXJlIGRldmljZSBuYW1lLiAqLw0KKyAgICB3Y2hhcl90ICAgICAgICAgICAgICpDYXB0dXJlRGV2aWNlOw0KKyAgICAvKio8IElzIGEgd2lkZSBjaGFyIHBvaW50ZXIgdG8gdGhlIHBsYXkgZGV2aWNlIG5hbWUuICovDQorICAgIHdjaGFyX3QgICAgICAgICAgICAgKlBsYXlEZXZpY2U7DQorICAgIC8qKjwgVHJ1ZSB0byBlbmFibGUgZGlhZ25vc3RpYywgZmFsc2UgdG8gZGlzYWJsZS4gKi8NCisgICAgaW50IAkgICAgICAgICAgICBEaWFnbm9zdGljRW5hYmxlOw0KKyAgICAvKio8IERpcmVjdG9yeSB3aGljaCB3aWxsIGNvbnRhaW5zIHRoZSBmaWxlcyBnZW5lcmF0ZWQgZm9yIGRpYWdub3N0aWMuICovDQorICAgIHdjaGFyX3QgICAgICAgICAgICAgKkRpYWdub3N0aWNGb2xkZXJQYXRoOw0KKyAgICAvKio8IElzIGFuIGF1eGlsaWFyeSBzZXR0aW5ncyBwb2ludGVyIHVzZWQgaW50ZXJuYWxseSBieSBiZElNQUQuICovDQorICAgIHZvaWQgICAgICAgICAgICAgICAgKmJkSU1BRHdyX1NldHRpbmdzRGF0YTsNCit9IGJkSU1BRHBqX1NldHRpbmdfdDsNCisNCisvKioNCisgKiBAYnJpZWYgSW5zdGFuY2Ugc3RydWN0dXJlIGZvciB0aGUgd2FybmluZ3MgZ2VuZXJhdGVkIGJ5IHRoZSBpbml0aWFsaXphdGlvbg0KKyAqIGZ1bmN0aW9ucy4NCisgKi8NCisNCit0eXBlZGVmIHN0cnVjdCBiZElNQURwal9XYXJuaW5nc190ew0KKyAgICAvKio8IFRoZSBjYXB0dXJlIGRldmljZSBpbmRpY2F0ZWQgY2FuJ3QgYmUgb3BlbmVkLCBoYXMgYmVlbiBzZWxlY3RlZA0KKyAgICAgKiB0aGUgZGVmYXVsdCBjYXB0dXJlIGRldmljZS4gKi8NCisgICAgaW50IERlZmF1bHRDYXB0dXJlRGV2aWNlQXV0b21hdGljYWxseVNlbGVjdGVkOw0KKyAgICAvKio8IFRoZSBjYXB0dXJlIGRldmljZSBvcGVuZWQgaGFzIG5vdCB2b2x1bWUgY29udHJvbC4gKi8NCisgICAgaW50IENhcHR1cmVEZXZpY2VXaXRob3V0Vm9sdW1lQ29udHJvbDsNCisgICAgLyoqPCBUaGUgcGxheSBkZXZpY2UgaW5kaWNhdGVkIGNhbid0IGJlIG9wZW5lZCwgaGFzIGJlZW4gc2VsZWN0ZWQNCisgICAgICogdGhlIGRlZmF1bHQgcGxheSBkZXZpY2UuICovDQorICAgIGludCBEZWZhdWx0UGxheURldmljZUF1dG9tYXRpY2FsbHlTZWxlY3RlZDsNCisgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGNoYW5uZWwgcmVxdWVzdGVkIGlzIG91dCBvZiByYW5nZS4gVGhlIG51bWJlciBvZg0KKyAgICAgKiBjaGFubmVsIG9wZW5lZCBpcyBlcXVhbCB0byB0aGUgbWF4aW11bS4gKi8NCisgICAgaW50IE51bWJlck9mQ2hhbm5lbHNPdXRPZlJhbmdlOw0KKyAgICAvKio8IFRoZSBkaWFnbm9zdGljIGZpbGVzIGNvdWxkIG5vdCBiZSBzYXZlZC4gKi8NCisgICAgaW50IERpYWdub3N0aWNTYXZlTm90QWxsb3dlZDsNCisgICAgLyoqPCBUaGUgbmxwIGxldmVsIHJlcXVlc3RlZCBpcyBub3QgYWxsb3dlZCwgaXQgaGFzIGJlZW4gYXV0b21hdGljYWxseQ0KKyAgICAgKiBjaGFuZ2VkIHRvIHRoZSBkZWZhdWx0IHZhbHVlLiAqLw0KKyAgICBpbnQgbmxwTGV2ZWxDaGFuZ2VTZXR0dGluZzsNCisgICAgLyoqPCBObyBjYXB0dXJlIGRldmljZSBpcyBwcmVzZW50LiBBbnl3YXkgdGhlIGJkU0VTIGhhcyBiZWVuDQorICAgICAqIGlzdGFudGlhdGVkIG9ubHkgZm9yIHBsYXliYWNrLiAqLw0KKyAgICBpbnQgTm9DYXB0dXJlRGV2aWNlUHJlc2VudDsNCisgICAgLyoqPCBUaGUgY3B1IGlzIG5vdCBhZGFwdCB0byBydW4gdGhlIGFlYyBlbmdpbmUsIHRoZSBhZWMgaGFzIGJlZW4gZGlzYWJsZWQuDQorICAgICAqIFRoaXMgYXBwZW5zIGZvciB2ZXJ5IG9sZCBjcHUgbGlrZSBwZW50aXVtIElJSS4gKi8NCisgICAgaW50IG9sZENQVWRldGVjdGVkX0FFQ2Rpc2FibGU7DQorICAgIC8qKjwgV2luZG93cyBEaXJlY3QgU291bmQgZXJyb3IuICovDQorICAgIGxvbmcgZGlyZWN0U291bmRFcnJvcjsNCisgICAgLyoqPCBXaW5kb3dzIERpcmVjdCBTb3VuZCB2b2x1bWUgZXJyb3IuICovDQorICAgIGxvbmcgZGlyZWN0U291bmRMZXZlbDsNCisgICAgLyoqPCBObyBwbGF5IGRldmljZSBpcyBwcmVzZW50LiBBbnl3YXkgdGhlIGJkU0VTIGhhcyBiZWVuIGlzdGFudGlhdGVkDQorICAgICAqIG9ubHkgZm9yIGNhcHR1cmUuICovDQorICAgIGludCBOb1BsYXlEZXZpY2VQcmVzZW50Ow0KK30gYmRJTUFEcGpfV2FybmluZ3NfdDsNCisNCisvKioNCisgKiBAYnJpZWYgSW5zdGFuY2Ugc3RydWN0dXJlIGZvciB0aGUgbGlicmFyeSB2ZXJzaW9uDQorICovDQorDQordHlwZWRlZiBzdHJ1Y3QgYmRJTUFEcGpfbGliVmVyc2lvbl90ew0KKyAgICBpbnQgICAgIG1ham9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBtYWpvciB2ZXJzaW9uLiAqLw0KKyAgICBpbnQJICAgIG1pbm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBtaW5vciB2ZXJzaW9uLiAqLw0KKyAgICBpbnQJICAgIGJ1aWxkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBidWlsZCBudW1iZXIuICovDQorICAgIGNoYXIgICAgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IG5hbWUgImJkSU1BRHBqIHZlci5YIi4gKi8NCisgICAgY2hhciAgICAqdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmV0YSwgUkMsIHJlbGVhc2UuICovDQorICAgIGNoYXIgICAgKmJ1aWxkRGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJ1aWxkIGRhdGUuICovDQorfSBiZElNQURwal9saWJWZXJzaW9uX3Q7DQorDQorLyoqDQorICogQH0NCisgKi8NCisNCisNCisNCisvKioNCisgKiBAYWRkdG9ncm91cCBncm91cEZ1bmN0aW9uDQorICogQHsNCisgKi8NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCisvKioNCisgKiBAYnJpZWYgTXVzdCBiZSB1c2VkIHRvIGFsbG9jYXRlIGFuZCBzZXQgdG8gZGVmYXVsdCBwYXJhbWV0ZXIgdGhlIG1lbW9yeQ0KKyAqIGZvciB0aGUgYmRJTUFELg0KKyAqDQorICogVGhlIGZ1bmN0aW9uIGdlbmVyYXRlIGEgc3RydWN0dXJlIGJkSU1BRHBqX1NldHRpbmdfdCBmaWxsZWQgd2l0aCB0aGUNCisgKiBkZWZhdWx0IHNldHRpbmdzLg0KKyAqIFxuIFRoZSB1c2VyIGNhbiBjaGFuZ2UgdGhpcyBzZXR0aW5ncyBhY2NvcmRpbmcgdG8gdGhlIG5lZWQgYW5kIHRoZW4NCisgKiBsYXVuY2ggdGhlIDo6YmRJTUFEcGpfSW5pdEFFQy4NCisgKiBcbiBUaGUgZnVuY3Rpb24gZ2VuZXJhdGUgYWxzbyBhIHdhcm5pbmcgc3RydWN0dXJlICg6OmJkSU1BRHBqX1dhcm5pbmdzX3QpDQorICogdGhhdCBjb3VsZCBiZSB1c2VkIGluIDo6YmRJTUFEcGpfSW5pdEFFQyB0byBoYW5kbGUgZXZlbnR1YWwgd2FybmluZ3MuDQorICogQHBhcmFtW291dF0gKipwcFNldHRpbmdzICAgICAgICAgICAgUG9pbnRzIHRvIHRoZSBwb2ludGVyIG9mIHRoZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCA6OmJkSU1BRHBqX1NldHRpbmdfdC4NCisgKiBAcGFyYW1bb3V0XSAqKnBwV2FybmluZ01lc3NhZ2VzICAgICBQb2ludHMgdG8gdGhlIHBvaW50ZXIgb2YgdGhlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIDo6YmRJTUFEcGpfV2FybmluZ3NfdC4NCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSByZXR1cm4NCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBlcnJvciAocmVmZXIgdG8gOjpiZElNQURwal9TdGF0dXMpLg0KKyAqLw0KK0JESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfQ3JlYXRlU3RydWN0dXJlcygNCisJCQkJICAgIGJkSU1BRHBqX1NldHRpbmdfdCAqKnBwU2V0dGluZ3MsDQorCQkJCSAgICBiZElNQURwal9XYXJuaW5nc190ICoqcHBXYXJuaW5nTWVzc2FnZXMpOw0KKw0KKy8qKg0KKyAqIEBicmllZiBJcyB1c2VkIHRvIGZyZWUgdGhlIG1lbW9yeSBmb3IgdGhlIDo6YmRJTUFEcGpfU2V0dGluZ190IHN0cnVjdHVyZSBhbmQNCisgKiA6OmJkSU1BRHBqX1dhcm5pbmdzX3Qgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoDQorICogdGhlIDo6YmRJTUFEcGpfQ3JlYXRlU3RydWN0dXJlcy4NCisgKiBAcGFyYW1baW5dICoqcHBTZXR0aW5ncyAgICAgICAgICAgICBQb2ludGVyIHRvIGEgbWVtb3J5IGxvY2F0aW9uIGZpbGxlZA0KKyAqIAkJCQkgICAgICAgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUNCisgKiAJCQkJICAgICAgIDo6YmRJTUFEcGpfU2V0dGluZ190IHN0cnVjdHVyZSB0byBmcmVlLg0KKyAqIFRoaXMgYWRkcmVzcyB3aWxsIGJlIHNldCB0byBOVUxMLg0KKyAqIEBwYXJhbVtpbl0gKipwcFdhcm5pbmdNZXNzYWdlcyAgICAgIFBvaW50ZXIgdG8gYSBtZW1vcnkgbG9jYXRpb24gZmlsbGVkDQorICogCQkJCSAgICAgICB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQNCisgKiAJCQkJICAgICAgIDo6YmRJTUFEcGpfV2FybmluZ3NfdCBzdHJ1Y3R1cmUgdG8gZnJlZS4NCisgKiAJCQkJICAgICAgIFRoaXMgYWRkcmVzcyB3aWxsIGJlIHNldCB0byBOVUxMLg0KKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QkRfUEpfT0sgaWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuDQorICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgcmV0dXJuDQorICogCQkJCSAgICAgICBhbiBlcnJvciAocmVmZXIgdG8gOjpiZElNQURwal9TdGF0dXMpLg0KKyAqLw0KK0JESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfRnJlZVN0cnVjdHVyZXMoDQorCQkJCSAgICBiZElNQURwal9TZXR0aW5nX3QgKipwcFNldHRpbmdzLA0KKwkJCQkgICAgYmRJTUFEcGpfV2FybmluZ3NfdCAqKnBwV2FybmluZ01lc3NhZ2VzKTsNCisNCisvKioNCisgKiBAYnJpZWYgSXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtZW1vcnkgZm9yIGJkSU1BRCB3aXRoIHRoZSBzZXR0aW5ncw0KKyAqIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+cHBTZXR0aW5nczwvY29kZT4uDQorICogQHBhcmFtW291dF0gKnBCZElNQURJbnN0YW5jZSAgICAgICAgSXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJkSU1BRCBvYmplY3QuDQorICogQHBhcmFtW2luXSAqKnBwU2V0dGluZ3MgICAgICAgICAgICAgUG9pbnRlciB0byBwb2ludGVyIHRvIGENCisgKiAJCQkJICAgICAgIDo6YmRJTUFEcGpfU2V0dGluZ190IHN0cnVjdHVyZSwgZmlsbGVkDQorICogCQkJCSAgICAgICB3aXRoIGluaXRpYWxpemF0aW9uIHNldHRpbmdzIHRvIGJlDQorICogCQkJCSAgICAgICBhcHBsaWVkIHRvIHRoZSBiZElNQUQuDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gTm90ZSwgdGhlIDxjb2RlPnBCZElNQURJbnN0YW5jZTwvY29kZT4NCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtb2RpZmllZCB3aXRoIHRoZSBhcHBsaWVkIHNldHRpbmdzLg0KKyAqIEBwYXJhbVtvdXRdICoqcHBXYXJuaW5nTWVzc2FnZXMgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byBhDQorICogCQkJCSAgICAgICA6OmJkSU1BRHBqX1dhcm5pbmdzX3Qgc3J1Y3R1cmUsDQorICogCQkJCSAgICAgICB3aGljaCByZXBvcnRzIHRoZSB3YXJuaW5ncyBhZnRlciB0aGUNCisgKiAJCQkJICAgICAgIGluaXRpYWxpemF0aW9uLg0KKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QkRfUEpfT0sgaWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuDQorICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgcmV0dXJuDQorICogCQkJCSAgICAgICBhbiBlcnJvciAocmVmZXIgdG8gOjpiZElNQURwal9TdGF0dXMpLg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIElmIHRoZSBlcnJvciBpcw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QkRfUEpfV0FSTl9CRElNQURfV0FSTklOR19BU1NFUlRFRA0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbml0IGhhcyBiZWVuIHBlcmZvcm1lZCB3aXRoIHN1Y2Nlc3MsDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHdpdGggYSBkaWZmZXJlbnQgc2V0dGluZ3MNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0IHRvIHRoZSBvbmVzIHJlcXVpcmVkLg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWFpbmx5IGhhcHBlbnMgaWYgdGhlIGF1ZGlvDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIG9wZW5lZCBpcyBkaWZmZXJlbnQgdG8gdGhlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIHJlcXVlc3RlZC4NCisgKi8NCitCRElNQURQSl9BUEkgYmRJTUFEcGpfU3RhdHVzIGJkSU1BRHBqX0luaXRBRUMoYmRJTUFEcGogKnBCZElNQURJbnN0YW5jZSwNCisJCQkJICAgICAgYmRJTUFEcGpfU2V0dGluZ190ICoqcHBTZXR0aW5ncywNCisJCQkJICAgICAgYmRJTUFEcGpfV2FybmluZ3NfdCAqKnBwV2FybmluZ01lc3NhZ2VzKTsNCisNCisvKioNCisgKiBAYnJpZWYgSXMgdXNlZCB0byBmcmVlIHRoZSBiZElNQUQgb2JqZWN0IHBvaW50ZWQgYnkgdGhlDQorICogPGNvZGU+cEJkSU1BREluc3RhbmNlPC9jb2RlPi4NCisgKiBAcGFyYW1baW5dICpwQmRJTUFESW5zdGFuY2UgICAgICAgICBQb2ludGVyIHRvIHRoZSBiZElNQUQgb2JqZWN0IHRvIGZyZWUuDQorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCisgKiAJCQkJICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSByZXR1cm4NCisgKiAJCQkJICAgICAgIGFuIGVycm9yIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQorICovDQorQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9GcmVlQUVDKGJkSU1BRHBqICpwQmRJTUFESW5zdGFuY2UpOw0KKw0KKy8qKg0KKyAqIEBicmllZiBJcyB1c2VkIHRvIG1ha2UgYSBsaXN0IG9mIGNhcHVyZSBhbmQgcGxheSBkZXZpY2VzIGF2YWlsYWJsZQ0KKyAqIG9uIHRoZSBzeXN0ZW0uDQorICogQHBhcmFtW2luXSBjYXB0dXJlRGV2aWNlICAgICAgICAgICAgU2V0IHRvIDEgdG8gZ2V0IHRoZSBsaXN0IG9mIGNhcHR1cmUNCisgKiAJCQkJICAgICAgIGRldmljZXMuIFNldCB0byAwIHRvIGdldCB0aGUgbGlzdCBvZg0KKyAqIAkJCQkgICAgICAgcGxheSBkZXZpY2VzLg0KKyAqIEBwYXJhbVtpbl0gKipkZXZpY2VOYW1lICAgICAgICAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byBhIHdpZGUgY2hhcg0KKyAqIAkJCQkgICAgICAgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgY2FwdHVyZS9wbGF5DQorICogCQkJCSAgICAgICBkZXZpY2VzLg0KKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QkRfUEpfT0sgaWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuDQorICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgcmV0dXJuDQorICogCQkJCSAgICAgICBhbiBlcnJvciAocmVmZXIgdG8gOjpiZElNQURwal9TdGF0dXMpLg0KKyAqLw0KK0JESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfZ2V0RGV2aWNlTmFtZShpbnQgY2FwdHVyZURldmljZSwNCisJCQkJCQkgICAgd2NoYXJfdCAqKmRldmljZU5hbWUpOw0KKw0KKy8qKg0KKyAqIEBicmllZiBJcyB1c2VkIHRvIGZyZWV6ZSB0aGUgYmRJTUFELCBzdG9wcGluZyB0aGUgYXVkaW8gcGxheWJhY2sNCisgKiBhbmQgcmVjb3JkaW5nLg0KKyAqIEBwYXJhbVtpbl0gYmRJTUFESW5zdGFuY2UgICAgICAgICAgIGJkSU1BRCBvYmplY3QuDQorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCisgKiAJCQkJICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZQ0KKyAqIAkJCQkgICAgICAgcmV0dXJuIGFuIGVycm9yIChyZWZlciB0bw0KKyAqIAkJCQkgICAgICAgOjpiZElNQURwal9TdGF0dXMpLg0KKyAqLw0KK0JESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfc3RvcChiZElNQURwaiBiZElNQURJbnN0YW5jZSk7DQorDQorLyoqDQorICogQGJyaWVmIElzIHVzZWQgdG8gcHV0IGJhY2sgaW4gcGxheSB0aGUgYXVkaW8gYWZ0ZXIgaXQgaGFzIGJlZW4gc3RvcHBlZCBieSB0aGUNCisgKiA6OmJkSU1BRHBqX3N0b3AgZnVuY3Rpb25zLg0KKyAqIEBwYXJhbVtpbl0gYmRJTUFESW5zdGFuY2UgICAgICAgICAgIGJkSU1BRCBvYmplY3QuDQorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCisgKiAJCQkJICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZQ0KKyAqIAkJCQkgICAgICAgcmV0dXJuIGFuIGVycm9yIChyZWZlciB0bw0KKyAqIAkJCQkgICAgICAgOjpiZElNQURwal9TdGF0dXMpLg0KKyAqLw0KK0JESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfcnVuKGJkSU1BRHBqIGJkSU1BREluc3RhbmNlKTsNCisNCisvKioNCisgKiBAYnJpZWYgUHJpbnQgb24gYSBzdGFuZGFyZCBvdXRwdXQgdGhlIHdhcm5pbmcgbWVzc2FnZXMuDQorICogQHBhcmFtW2luXSAqcFdhcm5pbmdNZXNzYWdlcyAgICAgICAgUG9pbnRlciB0byB0aGUgd2FybmluZyBzdHJ1Y3R1cmUNCisgKiAJCQkJICAgICAgIHRvIGJlIHByaW50ZWQuDQorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCisgKiAJCQkJICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZQ0KKyAqIAkJCQkgICAgICAgcmV0dXJuIGFuIGVycm9yDQorICogCQkJCSAgICAgICAocmVmZXIgdG8gOjpiZElNQURwal9TdGF0dXMpLg0KKyAqLw0KK0JESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfRGlzcGxheVdhcm5pbmdzKA0KKwkJCQkJYmRJTUFEcGpfV2FybmluZ3NfdCAqcFdhcm5pbmdNZXNzYWdlcyk7DQorDQorLyoqDQorICogQGJyaWVmIENsZWFyIHRoZSB3YXJuaW5nIHN0cnVjdHVyZSBhZnRlciBiZWluZyByZWFkLg0KKyAqIEBwYXJhbVtvdXRdICoqcHBXYXJuaW5nTWVzc2FnZXMgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgd2FybmluZw0KKyAqIAkJCQkgICAgICAgc3RydWN0dXJlIHRvIGJlIGNsZWFyZWQuDQorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCisgKiAJCQkJICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZQ0KKyAqIAkJCQkgICAgICAgcmV0dXJuIGFuIGVycm9yIChyZWZlciB0bw0KKyAqIAkJCQkgICAgICAgOjpiZElNQURwal9TdGF0dXMpLg0KKyAqLw0KK0JESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfQ2xlYXJBbGxXYXJuaW5ncygNCisJCQkJICAgICAgIGJkSU1BRHBqX1dhcm5pbmdzX3QgKipwcFdhcm5pbmdNZXNzYWdlcyk7DQorDQorLyoqDQorICogQGJyaWVmIElzIHVzZWQgdG8gc2V0IGEgcGFyYW1ldGVyIG9mIHRoZSBiZElNQUQgb2JqZWN0IHBvaW50ZWQgYnkgdGhlDQorICogPGNvZGU+cEJkSU1BREluc3RhbmNlPC9jb2RlPi4NCisgKiBAcGFyYW1baW5dIGJkSU1BREluc3RhbmNlICAgICAgICAgICBiZElNQUQgb2JqZWN0Lg0KKyAqIEBwYXJhbVtpbl0gcGFyYW1ldGVyTmFtZSAgICAgICAgICAgIEluZGljYXRlIHRoZSBwYXJhbWV0ZXIgdG8gc2V0Lg0KKyAqIEBwYXJhbVtpbl0gKnBWYWx1ZSAgICAgICAgICAgICAgICAgIElzIGEgcG9pbnRlciB0byB0aGUgdmFsdWUgdG8gc2V0DQorICogCQkJCSAgICAgICBjYXN0IHRvIHZvaWQuDQorICogCQkJCSAgICAgICBcbiBJbiB0aGUgOjpiZElNQURwal9QYXJhbWV0ZXINCisgKiAJCQkJICAgICAgIGRlY2xhcmF0aW9uIGlzIGluZGljYXRlZCB0aGUgcmVhbCB0eXBlIG9mDQorICogCQkJCSAgICAgICB0aGUgdmFsdWUsIGRlcGVuZGluZyBvbiB0aGUNCisgKiAJCQkJICAgICAgIDxjb2RlPnBhcmFtZXRlck5hbWU8L2NvZGU+Lg0KKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QkRfUEpfT0sgaWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuDQorICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UNCisgKiAJCQkJICAgICAgIHJldHVybiBhbiBlcnJvciAocmVmZXIgdG8NCisgKiAJCQkJICAgICAgIKc6OmJkSU1BRHBqX1N0YXR1cykuDQorICovDQorQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9zZXRQYXJhbWV0ZXIoYmRJTUFEcGogYmRJTUFESW5zdGFuY2UsDQorCQkJCWJkSU1BRHBqX1BhcmFtZXRlciBwYXJhbWV0ZXJOYW1lLCB2b2lkICpwVmFsdWUpOw0KKw0KKy8qKg0KKyAqIEBicmllZiBJcyB1c2VkIHRvIGdldCBhIHBhcmFtZXRlciBvZiB0aGUgYmRJTUFEIG9iamVjdCBwb2ludGVkIGJ5IHRoZQ0KKyAqIDxjb2RlPnBCZElNQURJbnN0YW5jZTwvY29kZT4uDQorICogQHBhcmFtW2luXSBiZElNQURJbnN0YW5jZSAgICAgICAgICAgYmRJTUFEIG9iamVjdC4NCisgKiBAcGFyYW1baW5dIHBhcmFtZXRlck5hbWUgICAgICAgICAgICBJbmRpY2F0ZSB0aGUgcGFyYW1ldGVyIHRvIGdldC4NCisgKiBAcGFyYW1bb3V0XSAqcFZhbHVlICAgICAgICAgICAgICAgICBJcyBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHRvIGdldCBjYXN0DQorICogCQkJCSAgICAgICB0byB2b2lkLiBcbiBJbiB0aGUNCisgKiAJCQkJICAgICAgIDo6YmRJTUFEcGpfUGFyYW1ldGVyIGRlY2xhcmF0aW9uIGlzDQorICogCQkJCSAgICAgICBpbmRpY2F0ZWQgdGhlIHJlYWwgdHlwZSBvZiB0aGUgdmFsdWUsDQorICogCQkJCSAgICAgICBkZXBlbmRpbmcgb24gdGhlDQorICogCQkJCSAgICAgICA8Y29kZT5wYXJhbWV0ZXJOYW1lPC9jb2RlPi4NCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KKyAqIAkJCQkgICAgICAgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIHJldHVybg0KKyAqIAkJCQkgICAgICAgYW4gZXJyb3IgKHJlZmVyIHRvIDo6YmRJTUFEcGpfU3RhdHVzKS4NCisgKi8NCitCRElNQURQSl9BUEkgYmRJTUFEcGpfU3RhdHVzIGJkSU1BRHBqX2dldFBhcmFtZXRlcihiZElNQURwaiBiZElNQURJbnN0YW5jZSwNCisJCQkJYmRJTUFEcGpfUGFyYW1ldGVyIHBhcmFtZXRlck5hbWUsIHZvaWQgKnBWYWx1ZSk7DQorDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKy8qKg0KKyAqIEB9DQorICovDQorDQorI2VuZGlmIC8vQkRfSU1BRF9QSl9IX18NCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS80OS80OTlkNTllMGU5ODU5ODQwZjlmNjM2MWVjMDZmODcxODFlNWVmNDQ2LnN2bi1iYXNlIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvNDkvNDk5ZDU5ZTBlOTg1OTg0MGY5ZjYzNjFlYzA2Zjg3MTgxZTVlZjQ0Ni5zdm4tYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDVlZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvNDkvNDk5ZDU5ZTBlOTg1OTg0MGY5ZjYzNjFlYzA2Zjg3MTgxZTVlZjQ0Ni5zdm4tYmFzZQpAQCAtMCwwICsxLDExOTYgQEAKKy8qICRJZCQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldl9pbXAuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWF1ZGlvZGV2L2Vycm5vLmg+CisjaW5jbHVkZSA8cGptZWRpYS9hbGF3X3VsYXcuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9tYXRoLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworI2lmIFBKTUVESUFfQVVESU9fREVWX0hBU19TWU1CX01EQQorCisvKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIHNvdW5kIGltcGxlbWVudGF0aW9uIGZvciBTeW1iaWFuIEF1ZGlvIFN0cmVhbWluZworICogZGV2aWNlLiBBcHBsaWNhdGlvbiB1c2luZyB0aGlzIHNvdW5kIGFic3RyYWN0aW9uIG11c3QgbGluayB3aXRoOgorICogIC0gbWVkaWFjbGllbnRhdWRpb3N0cmVhbS5saWIsIGFuZAorICogIC0gbWVkaWFjbGllbnRhdWRpb2lucHV0c3RyZWFtLmxpYiAKKyAqLworI2luY2x1ZGUgPG1kYS9jb21tb24vYXVkaW8uaD4KKyNpbmNsdWRlIDxtZGFhdWRpb291dHB1dHN0cmVhbS5oPgorI2luY2x1ZGUgPG1kYWF1ZGlvaW5wdXRzdHJlYW0uaD4KKworCisjZGVmaW5lIFRISVNfRklMRQkJCSJzeW1iX21kYV9kZXYuYyIKKyNkZWZpbmUgQklUU19QRVJfU0FNUExFCQkJMTYKKyNkZWZpbmUgQllURVNfUEVSX1NBTVBMRQkJKEJJVFNfUEVSX1NBTVBMRS84KQorCisKKyNpZiAxCisjICAgZGVmaW5lIFRSQUNFXyhzdCkgUEpfTE9HKDMsIHN0KQorI2Vsc2UKKyMgICBkZWZpbmUgVFJBQ0VfKHN0KQorI2VuZGlmCisKKworLyogTURBIGZhY3RvcnkgKi8KK3N0cnVjdCBtZGFfZmFjdG9yeQoreworICAgIHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5CSBiYXNlOworICAgIHBqX3Bvb2xfdAkJCSpwb29sOworICAgIHBqX3Bvb2xfZmFjdG9yeQkJKnBmOworICAgIHBqbWVkaWFfYXVkX2Rldl9pbmZvCSBkZXZfaW5mbzsKK307CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgaW50ZXJuYWwgZW5naW5lLiAqLworY2xhc3MgQ1BqQXVkaW9JbnB1dEVuZ2luZTsKK2NsYXNzIENQakF1ZGlvT3V0cHV0RW5naW5lOworCisvKiBNREEgc3RyZWFtLiAqLworc3RydWN0IG1kYV9zdHJlYW0KK3sKKyAgICAvLyBCYXNlCisgICAgcGptZWRpYV9hdWRfc3RyZWFtCSBiYXNlOwkJCS8qKjwgQmFzZSBjbGFzcy4JKi8KKyAgICAKKyAgICAvLyBQb29sCisgICAgcGpfcG9vbF90CQkqcG9vbDsJCQkvKio8IE1lbW9yeSBwb29sLiAgICAgICAqLworCisgICAgLy8gQ29tbW9uIHNldHRpbmdzLgorICAgIHBqbWVkaWFfYXVkX3BhcmFtIHBhcmFtOwkJLyoqPCBTdHJlYW0gcGFyYW0uCSovCisKKyAgICAvLyBBdWRpbyBlbmdpbmUKKyAgICBDUGpBdWRpb0lucHV0RW5naW5lCSppbl9lbmdpbmU7CQkvKio8IFJlY29yZCBlbmdpbmUuCSovCisgICAgQ1BqQXVkaW9PdXRwdXRFbmdpbmUgKm91dF9lbmdpbmU7CQkvKio8IFBsYXliYWNrIGVuZ2luZS4JKi8KK307CisKKworLyogUHJvdG90eXBlcyAqLworc3RhdGljIHBqX3N0YXR1c190IGZhY3RvcnlfaW5pdChwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZik7CitzdGF0aWMgcGpfc3RhdHVzX3QgZmFjdG9yeV9kZXN0cm95KHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmKTsKK3N0YXRpYyBwal9zdGF0dXNfdCBmYWN0b3J5X3JlZnJlc2gocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYpOworc3RhdGljIHVuc2lnbmVkICAgIGZhY3RvcnlfZ2V0X2Rldl9jb3VudChwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZik7CitzdGF0aWMgcGpfc3RhdHVzX3QgZmFjdG9yeV9nZXRfZGV2X2luZm8ocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYsIAorCQkJCQl1bnNpZ25lZCBpbmRleCwKKwkJCQkJcGptZWRpYV9hdWRfZGV2X2luZm8gKmluZm8pOworc3RhdGljIHBqX3N0YXR1c190IGZhY3RvcnlfZGVmYXVsdF9wYXJhbShwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZiwKKwkJCQkJIHVuc2lnbmVkIGluZGV4LAorCQkJCQkgcGptZWRpYV9hdWRfcGFyYW0gKnBhcmFtKTsKK3N0YXRpYyBwal9zdGF0dXNfdCBmYWN0b3J5X2NyZWF0ZV9zdHJlYW0ocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYsCisJCQkJCSBjb25zdCBwam1lZGlhX2F1ZF9wYXJhbSAqcGFyYW0sCisJCQkJCSBwam1lZGlhX2F1ZF9yZWNfY2IgcmVjX2NiLAorCQkJCQkgcGptZWRpYV9hdWRfcGxheV9jYiBwbGF5X2NiLAorCQkJCQkgdm9pZCAqdXNlcl9kYXRhLAorCQkJCQkgcGptZWRpYV9hdWRfc3RyZWFtICoqcF9hdWRfc3RybSk7CisKK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJlYW1fZ2V0X3BhcmFtKHBqbWVkaWFfYXVkX3N0cmVhbSAqc3RybSwKKwkJCQkgICAgcGptZWRpYV9hdWRfcGFyYW0gKnBhcmFtKTsKK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJlYW1fZ2V0X2NhcChwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0sCisJCQkJICBwam1lZGlhX2F1ZF9kZXZfY2FwIGNhcCwKKwkJCQkgIHZvaWQgKnZhbHVlKTsKK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJlYW1fc2V0X2NhcChwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0sCisJCQkJICBwam1lZGlhX2F1ZF9kZXZfY2FwIGNhcCwKKwkJCQkgIGNvbnN0IHZvaWQgKnZhbHVlKTsKK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJlYW1fc3RhcnQocGptZWRpYV9hdWRfc3RyZWFtICpzdHJtKTsKK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJlYW1fc3RvcChwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0pOworc3RhdGljIHBqX3N0YXR1c190IHN0cmVhbV9kZXN0cm95KHBqbWVkaWFfYXVkX3N0cmVhbSAqc3RybSk7CisKKworLyogT3BlcmF0aW9ucyAqLworc3RhdGljIHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5X29wIGZhY3Rvcnlfb3AgPQoreworICAgICZmYWN0b3J5X2luaXQsCisgICAgJmZhY3RvcnlfZGVzdHJveSwKKyAgICAmZmFjdG9yeV9nZXRfZGV2X2NvdW50LAorICAgICZmYWN0b3J5X2dldF9kZXZfaW5mbywKKyAgICAmZmFjdG9yeV9kZWZhdWx0X3BhcmFtLAorICAgICZmYWN0b3J5X2NyZWF0ZV9zdHJlYW0sCisgICAgJmZhY3RvcnlfcmVmcmVzaAorfTsKKworc3RhdGljIHBqbWVkaWFfYXVkX3N0cmVhbV9vcCBzdHJlYW1fb3AgPSAKK3sKKyAgICAmc3RyZWFtX2dldF9wYXJhbSwKKyAgICAmc3RyZWFtX2dldF9jYXAsCisgICAgJnN0cmVhbV9zZXRfY2FwLAorICAgICZzdHJlYW1fc3RhcnQsCisgICAgJnN0cmVhbV9zdG9wLAorICAgICZzdHJlYW1fZGVzdHJveQorfTsKKworCisvKgorICogQ29udmVydCBjbG9jayByYXRlIHRvIFN5bWJpYW4ncyBUTWRhQXVkaW9EYXRhU2V0dGluZ3MgY2FwYWJpbGl0eS4KKyAqLworc3RhdGljIFRJbnQgZ2V0X2Nsb2NrX3JhdGVfY2FwKHVuc2lnbmVkIGNsb2NrX3JhdGUpCit7CisgICAgc3dpdGNoIChjbG9ja19yYXRlKSB7CisgICAgY2FzZSA4MDAwOiAgcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RVNhbXBsZVJhdGU4MDAwSHo7CisgICAgY2FzZSAxMTAyNTogcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RVNhbXBsZVJhdGUxMTAyNUh6OworICAgIGNhc2UgMTIwMDA6IHJldHVybiBUTWRhQXVkaW9EYXRhU2V0dGluZ3M6OkVTYW1wbGVSYXRlMTIwMDBIejsKKyAgICBjYXNlIDE2MDAwOiByZXR1cm4gVE1kYUF1ZGlvRGF0YVNldHRpbmdzOjpFU2FtcGxlUmF0ZTE2MDAwSHo7CisgICAgY2FzZSAyMjA1MDogcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RVNhbXBsZVJhdGUyMjA1MEh6OworICAgIGNhc2UgMjQwMDA6IHJldHVybiBUTWRhQXVkaW9EYXRhU2V0dGluZ3M6OkVTYW1wbGVSYXRlMjQwMDBIejsKKyAgICBjYXNlIDMyMDAwOiByZXR1cm4gVE1kYUF1ZGlvRGF0YVNldHRpbmdzOjpFU2FtcGxlUmF0ZTMyMDAwSHo7CisgICAgY2FzZSA0NDEwMDogcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RVNhbXBsZVJhdGU0NDEwMEh6OworICAgIGNhc2UgNDgwMDA6IHJldHVybiBUTWRhQXVkaW9EYXRhU2V0dGluZ3M6OkVTYW1wbGVSYXRlNDgwMDBIejsKKyAgICBjYXNlIDY0MDAwOiByZXR1cm4gVE1kYUF1ZGlvRGF0YVNldHRpbmdzOjpFU2FtcGxlUmF0ZTY0MDAwSHo7CisgICAgY2FzZSA5NjAwMDogcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RVNhbXBsZVJhdGU5NjAwMEh6OworICAgIGRlZmF1bHQ6CisJcmV0dXJuIDA7CisgICAgfQorfQorCisvKgorICogQ29udmVydCBudW1iZXIgb2YgY2hhbm5lbHMgaW50byBTeW1iaWFuJ3MgVE1kYUF1ZGlvRGF0YVNldHRpbmdzIGNhcGFiaWxpdHkuCisgKi8KK3N0YXRpYyBUSW50IGdldF9jaGFubmVsX2NhcCh1bnNpZ25lZCBjaGFubmVsX2NvdW50KQoreworICAgIHN3aXRjaCAoY2hhbm5lbF9jb3VudCkgeworICAgIGNhc2UgMTogcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RUNoYW5uZWxzTW9ubzsKKyAgICBjYXNlIDI6IHJldHVybiBUTWRhQXVkaW9EYXRhU2V0dGluZ3M6OkVDaGFubmVsc1N0ZXJlbzsKKyAgICBkZWZhdWx0OgorCXJldHVybiAwOworICAgIH0KK30KKworLyoKKyAqIFV0aWxpdHk6IHByaW50IHNvdW5kIGRldmljZSBlcnJvcgorICovCitzdGF0aWMgdm9pZCBzbmRfcGVycm9yKGNvbnN0IGNoYXIgKnRpdGxlLCBUSW50IHJjKSAKK3sKKyAgICBQSl9MT0coMSwoVEhJU19GSUxFLCAiJXM6IGVycm9yIGNvZGUgJWQiLCB0aXRsZSwgcmMpKTsKK30KKyAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKworLyoKKyAqIEltcGxlbWVudGF0aW9uOiBTeW1iaWFuIElucHV0IFN0cmVhbS4KKyAqLworY2xhc3MgQ1BqQXVkaW9JbnB1dEVuZ2luZSA6IHB1YmxpYyBDQmFzZSwgTU1kYUF1ZGlvSW5wdXRTdHJlYW1DYWxsYmFjaworeworcHVibGljOgorICAgIGVudW0gU3RhdGUKKyAgICB7CisJU1RBVEVfSU5BQ1RJVkUsCisJU1RBVEVfQUNUSVZFLAorICAgIH07CisKKyAgICB+Q1BqQXVkaW9JbnB1dEVuZ2luZSgpOworCisgICAgc3RhdGljIENQakF1ZGlvSW5wdXRFbmdpbmUgKk5ld0woc3RydWN0IG1kYV9zdHJlYW0gKnBhcmVudF9zdHJtLAorCQkJCSAgICAgcGptZWRpYV9hdWRfcmVjX2NiIHJlY19jYiwKKwkJCQkgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKKyAgICBzdGF0aWMgQ1BqQXVkaW9JbnB1dEVuZ2luZSAqTmV3TEMoc3RydWN0IG1kYV9zdHJlYW0gKnBhcmVudF9zdHJtLAorCQkJCSAgICAgIHBqbWVkaWFfYXVkX3JlY19jYiByZWNfY2IsCisJCQkJICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKworICAgIHBqX3N0YXR1c190IFN0YXJ0UmVjb3JkKCk7CisgICAgdm9pZCBTdG9wKCk7CisKKyAgICBwal9zdGF0dXNfdCBTZXRHYWluKFRJbnQgZ2FpbikgeyAKKwlpZiAoaUlucHV0U3RyZWFtXykgeyAKKwkgICAgaUlucHV0U3RyZWFtXy0+U2V0R2FpbihnYWluKTsKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJfSBlbHNlCisJICAgIHJldHVybiBQSl9FSU5WQUxJRE9QOworICAgIH0KKyAgICAKKyAgICBUSW50IEdldEdhaW4oKSB7IAorCWlmIChpSW5wdXRTdHJlYW1fKSB7IAorCSAgICByZXR1cm4gaUlucHV0U3RyZWFtXy0+R2FpbigpOworCX0gZWxzZQorCSAgICByZXR1cm4gUEpfRUlOVkFMSURPUDsKKyAgICB9CisKKyAgICBUSW50IEdldE1heEdhaW4oKSB7IAorCWlmIChpSW5wdXRTdHJlYW1fKSB7IAorCSAgICByZXR1cm4gaUlucHV0U3RyZWFtXy0+TWF4R2FpbigpOworCX0gZWxzZQorCSAgICByZXR1cm4gUEpfRUlOVkFMSURPUDsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAgIFN0YXRlCQkgICAgIHN0YXRlXzsKKyAgICBzdHJ1Y3QgbWRhX3N0cmVhbQkgICAgKnBhcmVudFN0cm1fOworICAgIHBqbWVkaWFfYXVkX3JlY19jYgkgICAgIHJlY0NiXzsKKyAgICB2b2lkCQkgICAgKnVzZXJEYXRhXzsKKyAgICBDTWRhQXVkaW9JbnB1dFN0cmVhbSAgICAqaUlucHV0U3RyZWFtXzsKKyAgICBIQnVmQzgJCSAgICAqaVN0cmVhbUJ1ZmZlcl87CisgICAgVFB0cjgJCSAgICAgaUZyYW1lUHRyXzsKKyAgICBUSW50CQkgICAgIGxhc3RFcnJvcl87CisgICAgcGpfdWludDMyX3QJCSAgICAgdGltZVN0YW1wXzsKKyAgICBDQWN0aXZlU2NoZWR1bGVyV2FpdCAgICAgc3RhcnRBc3dfOworCisgICAgLy8gY2FjaGUgdmFyaWFibGUKKyAgICAvLyB0byBhdm9pZCBjYWxjdWxhdGluZyBmcmFtZSBsZW5ndGggcmVwZWF0ZWRseQorICAgIFRJbnQJCSAgICAgZnJhbWVMZW5fOworICAgIAorICAgIC8vIHNvbWV0aW1lcyByZWNvcmRlZCBzaXplICE9IHJlcXVlc3RlZCBmcmFtZXNpemUsIHNvIGxldCdzCisgICAgLy8gcHJvdmlkZSBhIGJ1ZmZlciB0byBtYWtlIHN1cmUgdGhlIHJlYyBjYWxsYmFjayByZXR1cm5pbmcKKyAgICAvLyBmcmFtZXNpemUgYXMgcmVxdWVzdGVkLgorICAgIFRVaW50OAkJICAgICpmcmFtZVJlY0J1Zl87CisgICAgVEludAkJICAgICBmcmFtZVJlY0J1Zkxlbl87CisKKyAgICBDUGpBdWRpb0lucHV0RW5naW5lKHN0cnVjdCBtZGFfc3RyZWFtICpwYXJlbnRfc3RybSwKKwkgICAgcGptZWRpYV9hdWRfcmVjX2NiIHJlY19jYiwKKwkJCXZvaWQgKnVzZXJfZGF0YSk7CisgICAgdm9pZCBDb25zdHJ1Y3RMKCk7CisgICAgVFB0cjggJiBHZXRGcmFtZSgpOworICAgIAorcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBNYWlzY09wZW5Db21wbGV0ZShUSW50IGFFcnJvcik7CisgICAgdmlydHVhbCB2b2lkIE1haXNjQnVmZmVyQ29waWVkKFRJbnQgYUVycm9yLCBjb25zdCBURGVzQzggJmFCdWZmZXIpOworICAgIHZpcnR1YWwgdm9pZCBNYWlzY1JlY29yZENvbXBsZXRlKFRJbnQgYUVycm9yKTsKKworfTsKKworCitDUGpBdWRpb0lucHV0RW5naW5lOjpDUGpBdWRpb0lucHV0RW5naW5lKHN0cnVjdCBtZGFfc3RyZWFtICpwYXJlbnRfc3RybSwKKwkJCQkJIHBqbWVkaWFfYXVkX3JlY19jYiByZWNfY2IsCisJCQkJCSB2b2lkICp1c2VyX2RhdGEpCisgICAgOiBzdGF0ZV8oU1RBVEVfSU5BQ1RJVkUpLCBwYXJlbnRTdHJtXyhwYXJlbnRfc3RybSksIAorICAgICAgcmVjQ2JfKHJlY19jYiksIHVzZXJEYXRhXyh1c2VyX2RhdGEpLCAKKyAgICAgIGlJbnB1dFN0cmVhbV8oTlVMTCksIGlTdHJlYW1CdWZmZXJfKE5VTEwpLCBpRnJhbWVQdHJfKDAsIDApLAorICAgICAgbGFzdEVycm9yXyhLRXJyTm9uZSksIHRpbWVTdGFtcF8oMCksCisgICAgICBmcmFtZUxlbl8ocGFyZW50X3N0cm0tPnBhcmFtLnNhbXBsZXNfcGVyX2ZyYW1lICogCisJICAgICAgICBCWVRFU19QRVJfU0FNUExFKSwKKyAgICAgIGZyYW1lUmVjQnVmXyhOVUxMKSwgZnJhbWVSZWNCdWZMZW5fKDApCit7Cit9CisKK0NQakF1ZGlvSW5wdXRFbmdpbmU6On5DUGpBdWRpb0lucHV0RW5naW5lKCkKK3sKKyAgICBTdG9wKCk7CisKKyAgICBkZWxldGUgaVN0cmVhbUJ1ZmZlcl87CisgICAgaVN0cmVhbUJ1ZmZlcl8gPSBOVUxMOworICAgIAorICAgIGRlbGV0ZSBbXSBmcmFtZVJlY0J1Zl87CisgICAgZnJhbWVSZWNCdWZfID0gTlVMTDsKKyAgICBmcmFtZVJlY0J1Zkxlbl8gPSAwOworfQorCit2b2lkIENQakF1ZGlvSW5wdXRFbmdpbmU6OkNvbnN0cnVjdEwoKQoreworICAgIGlTdHJlYW1CdWZmZXJfID0gSEJ1ZkM4OjpOZXdMKGZyYW1lTGVuXyk7CisgICAgQ2xlYW51cFN0YWNrOjpQdXNoTChpU3RyZWFtQnVmZmVyXyk7CisKKyAgICBmcmFtZVJlY0J1Zl8gPSBuZXcgVFVpbnQ4W2ZyYW1lTGVuXyoyXTsKKyAgICBDbGVhbnVwU3RhY2s6OlB1c2hMKGZyYW1lUmVjQnVmXyk7Cit9CisKK0NQakF1ZGlvSW5wdXRFbmdpbmUgKkNQakF1ZGlvSW5wdXRFbmdpbmU6Ok5ld0xDKHN0cnVjdCBtZGFfc3RyZWFtICpwYXJlbnQsCisJCQkJCQlwam1lZGlhX2F1ZF9yZWNfY2IgcmVjX2NiLAorCQkJCQkgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBDUGpBdWRpb0lucHV0RW5naW5lKiBzZWxmID0gbmV3IChFTGVhdmUpIENQakF1ZGlvSW5wdXRFbmdpbmUocGFyZW50LAorCQkJCQkJCQkgcmVjX2NiLCAKKwkJCQkJCQkJIHVzZXJfZGF0YSk7CisgICAgQ2xlYW51cFN0YWNrOjpQdXNoTChzZWxmKTsKKyAgICBzZWxmLT5Db25zdHJ1Y3RMKCk7CisgICAgcmV0dXJuIHNlbGY7Cit9CisKK0NQakF1ZGlvSW5wdXRFbmdpbmUgKkNQakF1ZGlvSW5wdXRFbmdpbmU6Ok5ld0woc3RydWN0IG1kYV9zdHJlYW0gKnBhcmVudCwKKwkJCQkJICAgICAgIHBqbWVkaWFfYXVkX3JlY19jYiByZWNfY2IsCisJCQkJCSAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgQ1BqQXVkaW9JbnB1dEVuZ2luZSAqc2VsZiA9IE5ld0xDKHBhcmVudCwgcmVjX2NiLCB1c2VyX2RhdGEpOworICAgIENsZWFudXBTdGFjazo6UG9wKHNlbGYtPmZyYW1lUmVjQnVmXyk7CisgICAgQ2xlYW51cFN0YWNrOjpQb3Aoc2VsZi0+aVN0cmVhbUJ1ZmZlcl8pOworICAgIENsZWFudXBTdGFjazo6UG9wKHNlbGYpOworICAgIHJldHVybiBzZWxmOworfQorCisKK3BqX3N0YXR1c190IENQakF1ZGlvSW5wdXRFbmdpbmU6OlN0YXJ0UmVjb3JkKCkKK3sKKworICAgIC8vIElnbm9yZSBjb21tYW5kIGlmIHJlY29yZGluZyBpcyBpbiBwcm9ncmVzcy4KKyAgICBpZiAoc3RhdGVfID09IFNUQVRFX0FDVElWRSkKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKworICAgIC8vIEFjY29yZGluZyB0byBOb2tpYSdzIEF1ZGlvU3RyZWFtIGV4YW1wbGUsIHNvbWUgMm5kIEVkaXRpb24sIEZQMiBkZXZpY2VzCisgICAgLy8gKHN1Y2ggYXMgTm9raWEgNjYzMCkgcmVxdWlyZSB0aGUgc3RyZWFtIHRvIGJlIHJlY29uc3RydWN0ZWQgZWFjaCB0aW1lIAorICAgIC8vIGJlZm9yZSBjYWxsaW5nIE9wZW4oKSAtIG90aGVyd2lzZSB0aGUgY2FsbGJhY2sgbmV2ZXIgZ2V0cyBjYWxsZWQuCisgICAgLy8gRm9yIHVuaWZvcm0gYmVoYXZpb3IsIGxldHMganVzdCBkZWxldGUvcmUtY3JlYXRlIHRoZSBzdHJlYW0gZm9yIGFsbAorICAgIC8vIGRldmljZXMuCisKKyAgICAvLyBEZXN0cm95IGV4aXN0aW5nIHN0cmVhbS4KKyAgICBpZiAoaUlucHV0U3RyZWFtXykgZGVsZXRlIGlJbnB1dFN0cmVhbV87CisgICAgaUlucHV0U3RyZWFtXyA9IE5VTEw7CisKKyAgICAvLyBDcmVhdGUgdGhlIHN0cmVhbS4KKyAgICBUUkFQRChlcnIsIGlJbnB1dFN0cmVhbV8gPSBDTWRhQXVkaW9JbnB1dFN0cmVhbTo6TmV3TCgqdGhpcykpOworICAgIGlmIChlcnIgIT0gS0Vyck5vbmUpCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihlcnIpOworCisgICAgLy8gSW5pdGlhbGl6ZSBzZXR0aW5ncy4KKyAgICBUTWRhQXVkaW9EYXRhU2V0dGluZ3MgaVN0cmVhbVNldHRpbmdzOworICAgIGlTdHJlYW1TZXR0aW5ncy5pQ2hhbm5lbHMgPSAKKwkJCSAgICBnZXRfY2hhbm5lbF9jYXAocGFyZW50U3RybV8tPnBhcmFtLmNoYW5uZWxfY291bnQpOworICAgIGlTdHJlYW1TZXR0aW5ncy5pU2FtcGxlUmF0ZSA9IAorCQkJICAgIGdldF9jbG9ja19yYXRlX2NhcChwYXJlbnRTdHJtXy0+cGFyYW0uY2xvY2tfcmF0ZSk7CisKKyAgICBwal9hc3NlcnQoaVN0cmVhbVNldHRpbmdzLmlDaGFubmVscyAhPSAwICYmIAorCSAgICAgIGlTdHJlYW1TZXR0aW5ncy5pU2FtcGxlUmF0ZSAhPSAwKTsKKworICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsICJPcGVuaW5nIHNvdW5kIGRldmljZSBmb3IgY2FwdHVyZSwgIgorICAgIAkJICAgICAgICAgImNsb2NrIHJhdGU9JWQsIGNoYW5uZWwgY291bnQ9JWQuLiIsCisgICAgCQkgICAgICAgICBwYXJlbnRTdHJtXy0+cGFyYW0uY2xvY2tfcmF0ZSwgCisgICAgCQkgICAgICAgICBwYXJlbnRTdHJtXy0+cGFyYW0uY2hhbm5lbF9jb3VudCkpOworICAgIAorICAgIC8vIE9wZW4gc3RyZWFtLgorICAgIGxhc3RFcnJvcl8gPSBLUmVxdWVzdFBlbmRpbmc7CisgICAgaUlucHV0U3RyZWFtXy0+T3BlbigmaVN0cmVhbVNldHRpbmdzKTsKKyAgICAKKyNpZiBkZWZpbmVkKFBKTUVESUFfQVVESU9fREVWX01EQV9VU0VfU1lOQ19TVEFSVCkgJiYgXAorICAgIFBKTUVESUFfQVVESU9fREVWX01EQV9VU0VfU1lOQ19TVEFSVCAhPSAwCisgICAgCisgICAgc3RhcnRBc3dfLlN0YXJ0KCk7CisgICAgCisjZW5kaWYKKyAgICAKKyAgICAvLyBTdWNjZXNzCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgIlNvdW5kIGNhcHR1cmUgc3RhcnRlZC4iKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKwordm9pZCBDUGpBdWRpb0lucHV0RW5naW5lOjpTdG9wKCkKK3sKKyAgICAvLyBJZiBjYXB0dXJlIGlzIGluIHByb2dyZXNzLCBzdG9wIGl0LgorICAgIGlmIChpSW5wdXRTdHJlYW1fICYmIHN0YXRlXyA9PSBTVEFURV9BQ1RJVkUpIHsKKyAgICAJbGFzdEVycm9yXyA9IEtSZXF1ZXN0UGVuZGluZzsKKyAgICAJaUlucHV0U3RyZWFtXy0+U3RvcCgpOworCisJLy8gV2FpdCB1bnRpbCBpdCdzIGFjdHVhbGx5IHN0b3BwZWQKKyAgICAJd2hpbGUgKGxhc3RFcnJvcl8gPT0gS1JlcXVlc3RQZW5kaW5nKQorCSAgICBwal9zeW1iaWFub3NfcG9sbCgtMSwgMTAwKTsKKyAgICB9CisKKyAgICBpZiAoaUlucHV0U3RyZWFtXykgeworCWRlbGV0ZSBpSW5wdXRTdHJlYW1fOworCWlJbnB1dFN0cmVhbV8gPSBOVUxMOworICAgIH0KKyAgICAKKyAgICBpZiAoc3RhcnRBc3dfLklzU3RhcnRlZCgpKSB7CisJc3RhcnRBc3dfLkFzeW5jU3RvcCgpOworICAgIH0KKyAgICAKKyAgICBzdGF0ZV8gPSBTVEFURV9JTkFDVElWRTsKK30KKworCitUUHRyOCAmIENQakF1ZGlvSW5wdXRFbmdpbmU6OkdldEZyYW1lKCkgCit7CisgICAgLy9pU3RyZWFtQnVmZmVyXy0+RGVzKCkuRmlsbFooZnJhbWVMZW5fKTsKKyAgICBpRnJhbWVQdHJfLlNldCgoVFVpbnQ4KikoaVN0cmVhbUJ1ZmZlcl8tPlB0cigpKSwgZnJhbWVMZW5fLCBmcmFtZUxlbl8pOworICAgIHJldHVybiBpRnJhbWVQdHJfOworfQorCit2b2lkIENQakF1ZGlvSW5wdXRFbmdpbmU6Ok1haXNjT3BlbkNvbXBsZXRlKFRJbnQgYUVycm9yKQoreworICAgIGlmIChzdGFydEFzd18uSXNTdGFydGVkKCkpIHsKKwlzdGFydEFzd18uQXN5bmNTdG9wKCk7CisgICAgfQorICAgIAorICAgIGxhc3RFcnJvcl8gPSBhRXJyb3I7CisgICAgaWYgKGFFcnJvciAhPSBLRXJyTm9uZSkgeworICAgICAgICBzbmRfcGVycm9yKCJFcnJvciBpbiBNYWlzY09wZW5Db21wbGV0ZSgpIiwgYUVycm9yKTsKKyAgICAJcmV0dXJuOworICAgIH0KKworICAgIC8qIEFwcGx5IGlucHV0IHZvbHVtZSBzZXR0aW5nIGlmIHNwZWNpZmllZCAqLworICAgIGlmIChwYXJlbnRTdHJtXy0+cGFyYW0uZmxhZ3MgJiAKKyAgICAgICAgUEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9WT0xVTUVfU0VUVElORykgCisgICAgeworICAgICAgICBzdHJlYW1fc2V0X2NhcCgmcGFyZW50U3RybV8tPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgIFBKTUVESUFfQVVEX0RFVl9DQVBfSU5QVVRfVk9MVU1FX1NFVFRJTkcsIAorICAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50U3RybV8tPnBhcmFtLmlucHV0X3ZvbCk7CisgICAgfQorCisgICAgLy8gc2V0IHN0cmVhbSBwcmlvcml0eSB0byBub3JtYWwgYW5kIHRpbWUgc2Vuc2l0aXZlCisgICAgaUlucHV0U3RyZWFtXy0+U2V0UHJpb3JpdHkoRVByaW9yaXR5Tm9ybWFsLCAKKyAgICAJCQkgICAgICAgRU1kYVByaW9yaXR5UHJlZmVyZW5jZVRpbWUpOwkJCQkKKworICAgIC8vIFJlYWQgdGhlIGZpcnN0IGZyYW1lLgorICAgIFRQdHI4ICYgZnJtID0gR2V0RnJhbWUoKTsKKyAgICBUUkFQRChlcnIyLCBpSW5wdXRTdHJlYW1fLT5SZWFkTChmcm0pKTsKKyAgICBpZiAoZXJyMikgeworICAgIAlQSl9MT0coNCwoVEhJU19GSUxFLCAiRXhjZXB0aW9uIGluIGlJbnB1dFN0cmVhbV8tPlJlYWRMKCkiKSk7CisJbGFzdEVycm9yXyA9IGVycjI7CisJcmV0dXJuOworICAgIH0KKworICAgIC8vIGlucHV0IHN0cmVhbSBvcGVuZWQgc3VjY2VzZnVsbHksIHNldCBzdGF0dXMgdG8gQWN0aXZlCisgICAgc3RhdGVfID0gU1RBVEVfQUNUSVZFOworfQorCit2b2lkIENQakF1ZGlvSW5wdXRFbmdpbmU6Ok1haXNjQnVmZmVyQ29waWVkKFRJbnQgYUVycm9yLCAKKwkJCQkJICAgIGNvbnN0IFREZXNDOCAmYUJ1ZmZlcikKK3sKKyAgICBsYXN0RXJyb3JfID0gYUVycm9yOworICAgIGlmIChhRXJyb3IgIT0gS0Vyck5vbmUpIHsKKyAgICAJc25kX3BlcnJvcigiRXJyb3IgaW4gTWFpc2NCdWZmZXJDb3BpZWQoKSIsIGFFcnJvcik7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmIChmcmFtZVJlY0J1Zkxlbl8gfHwgYUJ1ZmZlci5MZW5ndGgoKSA8IGZyYW1lTGVuXykgeworCXBqX21lbWNweShmcmFtZVJlY0J1Zl8gKyBmcmFtZVJlY0J1Zkxlbl8sICh2b2lkKikgYUJ1ZmZlci5QdHIoKSwgYUJ1ZmZlci5MZW5ndGgoKSk7CisJZnJhbWVSZWNCdWZMZW5fICs9IGFCdWZmZXIuTGVuZ3RoKCk7CisgICAgfQorCisgICAgaWYgKGZyYW1lUmVjQnVmTGVuXykgeworICAgIAl3aGlsZSAoZnJhbWVSZWNCdWZMZW5fID49IGZyYW1lTGVuXykgeworICAgIAkgICAgcGptZWRpYV9mcmFtZSBmOworICAgIAkgICAgCisgICAgCSAgICBmLnR5cGUgPSBQSk1FRElBX0ZSQU1FX1RZUEVfQVVESU87CisgICAgCSAgICBmLmJ1ZiA9IGZyYW1lUmVjQnVmXzsKKyAgICAJICAgIGYuc2l6ZSA9IGZyYW1lTGVuXzsKKyAgICAJICAgIGYudGltZXN0YW1wLnUzMi5sbyA9IHRpbWVTdGFtcF87CisgICAgCSAgICBmLmJpdF9pbmZvID0gMDsKKyAgICAJICAgIAorICAgIAkgICAgLy8gQ2FsbCB0aGUgY2FsbGJhY2suCisJICAgIHJlY0NiXyh1c2VyRGF0YV8sICZmKTsKKwkgICAgLy8gSW5jcmVtZW50IHRpbWVzdGFtcC4KKwkgICAgdGltZVN0YW1wXyArPSBwYXJlbnRTdHJtXy0+cGFyYW0uc2FtcGxlc19wZXJfZnJhbWU7CisKKwkgICAgZnJhbWVSZWNCdWZMZW5fIC09IGZyYW1lTGVuXzsKKwkgICAgcGpfbWVtbW92ZShmcmFtZVJlY0J1Zl8sIGZyYW1lUmVjQnVmXytmcmFtZUxlbl8sIGZyYW1lUmVjQnVmTGVuXyk7CisgICAgCX0KKyAgICB9IGVsc2UgeworCXBqbWVkaWFfZnJhbWUgZjsKKwkKKwlmLnR5cGUgPSBQSk1FRElBX0ZSQU1FX1RZUEVfQVVESU87CisJZi5idWYgPSAodm9pZCopYUJ1ZmZlci5QdHIoKTsKKwlmLnNpemUgPSBhQnVmZmVyLkxlbmd0aCgpOworCWYudGltZXN0YW1wLnUzMi5sbyA9IHRpbWVTdGFtcF87CisJZi5iaXRfaW5mbyA9IDA7CisJCisJLy8gQ2FsbCB0aGUgY2FsbGJhY2suCisJcmVjQ2JfKHVzZXJEYXRhXywgJmYpOworCQorCS8vIEluY3JlbWVudCB0aW1lc3RhbXAuCisJdGltZVN0YW1wXyArPSBwYXJlbnRTdHJtXy0+cGFyYW0uc2FtcGxlc19wZXJfZnJhbWU7CisgICAgfQorCisgICAgLy8gUmVjb3JkIG5leHQgZnJhbWUKKyAgICBUUHRyOCAmIGZybSA9IEdldEZyYW1lKCk7CisgICAgVFJBUEQoZXJyMiwgaUlucHV0U3RyZWFtXy0+UmVhZEwoZnJtKSk7CisgICAgaWYgKGVycjIpIHsKKyAgICAJUEpfTE9HKDQsKFRISVNfRklMRSwgIkV4Y2VwdGlvbiBpbiBpSW5wdXRTdHJlYW1fLT5SZWFkTCgpIikpOworICAgIH0KK30KKworCit2b2lkIENQakF1ZGlvSW5wdXRFbmdpbmU6Ok1haXNjUmVjb3JkQ29tcGxldGUoVEludCBhRXJyb3IpCit7CisgICAgbGFzdEVycm9yXyA9IGFFcnJvcjsKKyAgICBzdGF0ZV8gPSBTVEFURV9JTkFDVElWRTsKKyAgICBpZiAoYUVycm9yICE9IEtFcnJOb25lICYmIGFFcnJvciAhPSBLRXJyQ2FuY2VsKSB7CisgICAgCXNuZF9wZXJyb3IoIkVycm9yIGluIE1haXNjUmVjb3JkQ29tcGxldGUoKSIsIGFFcnJvcik7CisgICAgfQorfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCisvKgorICogSW1wbGVtZW50YXRpb246IFN5bWJpYW4gT3V0cHV0IFN0cmVhbS4KKyAqLworCitjbGFzcyBDUGpBdWRpb091dHB1dEVuZ2luZSA6IHB1YmxpYyBDQmFzZSwgTU1kYUF1ZGlvT3V0cHV0U3RyZWFtQ2FsbGJhY2sKK3sKK3B1YmxpYzoKKyAgICBlbnVtIFN0YXRlCisgICAgeworCVNUQVRFX0lOQUNUSVZFLAorCVNUQVRFX0FDVElWRSwKKyAgICB9OworCisgICAgfkNQakF1ZGlvT3V0cHV0RW5naW5lKCk7CisKKyAgICBzdGF0aWMgQ1BqQXVkaW9PdXRwdXRFbmdpbmUgKk5ld0woc3RydWN0IG1kYV9zdHJlYW0gKnBhcmVudF9zdHJtLAorCQkJCSAgICAgIHBqbWVkaWFfYXVkX3BsYXlfY2IgcGxheV9jYiwKKwkJCQkgICAgICB2b2lkICp1c2VyX2RhdGEpOworCisgICAgc3RhdGljIENQakF1ZGlvT3V0cHV0RW5naW5lICpOZXdMQyhzdHJ1Y3QgbWRhX3N0cmVhbSAqcGFyZW50X3N0cm0sCisJCQkJICAgICAgIHBqbWVkaWFfYXVkX3BsYXlfY2IgcmVjX2NiLAorCQkJCSAgICAgICB2b2lkICp1c2VyX2RhdGEpOworCisgICAgcGpfc3RhdHVzX3QgU3RhcnRQbGF5KCk7CisgICAgdm9pZCBTdG9wKCk7CisKKyAgICBwal9zdGF0dXNfdCBTZXRWb2x1bWUoVEludCB2b2wpIHsgCisJaWYgKGlPdXRwdXRTdHJlYW1fKSB7IAorCSAgICBpT3V0cHV0U3RyZWFtXy0+U2V0Vm9sdW1lKHZvbCk7CisJICAgIHJldHVybiBQSl9TVUNDRVNTOworCX0gZWxzZQorCSAgICByZXR1cm4gUEpfRUlOVkFMSURPUDsKKyAgICB9CisgICAgCisgICAgVEludCBHZXRWb2x1bWUoKSB7IAorCWlmIChpT3V0cHV0U3RyZWFtXykgeyAKKwkgICAgcmV0dXJuIGlPdXRwdXRTdHJlYW1fLT5Wb2x1bWUoKTsKKwl9IGVsc2UKKwkgICAgcmV0dXJuIFBKX0VJTlZBTElET1A7CisgICAgfQorCisgICAgVEludCBHZXRNYXhWb2x1bWUoKSB7IAorCWlmIChpT3V0cHV0U3RyZWFtXykgeyAKKwkgICAgcmV0dXJuIGlPdXRwdXRTdHJlYW1fLT5NYXhWb2x1bWUoKTsKKwl9IGVsc2UKKwkgICAgcmV0dXJuIFBKX0VJTlZBTElET1A7CisgICAgfQorCitwcml2YXRlOgorICAgIFN0YXRlCQkgICAgIHN0YXRlXzsKKyAgICBzdHJ1Y3QgbWRhX3N0cmVhbQkgICAgKnBhcmVudFN0cm1fOworICAgIHBqbWVkaWFfYXVkX3BsYXlfY2IJICAgICBwbGF5Q2JfOworICAgIHZvaWQJCSAgICAqdXNlckRhdGFfOworICAgIENNZGFBdWRpb091dHB1dFN0cmVhbSAgICppT3V0cHV0U3RyZWFtXzsKKyAgICBUVWludDgJCSAgICAqZnJhbWVCdWZfOworICAgIHVuc2lnbmVkCQkgICAgIGZyYW1lQnVmU2l6ZV87CisgICAgVFB0ckM4CQkgICAgIGZyYW1lXzsKKyAgICBUSW50CQkgICAgIGxhc3RFcnJvcl87CisgICAgdW5zaWduZWQJCSAgICAgdGltZXN0YW1wXzsKKyAgICBDQWN0aXZlU2NoZWR1bGVyV2FpdCAgICAgc3RhcnRBc3dfOworCisgICAgQ1BqQXVkaW9PdXRwdXRFbmdpbmUoc3RydWN0IG1kYV9zdHJlYW0gKnBhcmVudF9zdHJtLAorCQkJIHBqbWVkaWFfYXVkX3BsYXlfY2IgcGxheV9jYiwKKwkJCSB2b2lkICp1c2VyX2RhdGEpOworICAgIHZvaWQgQ29uc3RydWN0TCgpOworCisgICAgdmlydHVhbCB2b2lkIE1hb3NjT3BlbkNvbXBsZXRlKFRJbnQgYUVycm9yKTsKKyAgICB2aXJ0dWFsIHZvaWQgTWFvc2NCdWZmZXJDb3BpZWQoVEludCBhRXJyb3IsIGNvbnN0IFREZXNDOCYgYUJ1ZmZlcik7CisgICAgdmlydHVhbCB2b2lkIE1hb3NjUGxheUNvbXBsZXRlKFRJbnQgYUVycm9yKTsKK307CisKKworQ1BqQXVkaW9PdXRwdXRFbmdpbmU6OkNQakF1ZGlvT3V0cHV0RW5naW5lKHN0cnVjdCBtZGFfc3RyZWFtICpwYXJlbnRfc3RybSwKKwkJCQkJICAgcGptZWRpYV9hdWRfcGxheV9jYiBwbGF5X2NiLAorCQkJCQkgICB2b2lkICp1c2VyX2RhdGEpIAorOiBzdGF0ZV8oU1RBVEVfSU5BQ1RJVkUpLCBwYXJlbnRTdHJtXyhwYXJlbnRfc3RybSksIHBsYXlDYl8ocGxheV9jYiksIAorICB1c2VyRGF0YV8odXNlcl9kYXRhKSwgaU91dHB1dFN0cmVhbV8oTlVMTCksIGZyYW1lQnVmXyhOVUxMKSwKKyAgbGFzdEVycm9yXyhLRXJyTm9uZSksIHRpbWVzdGFtcF8oMCkKK3sKK30KKworCit2b2lkIENQakF1ZGlvT3V0cHV0RW5naW5lOjpDb25zdHJ1Y3RMKCkKK3sKKyAgICBmcmFtZUJ1ZlNpemVfID0gcGFyZW50U3RybV8tPnBhcmFtLnNhbXBsZXNfcGVyX2ZyYW1lICoKKwkJICAgIEJZVEVTX1BFUl9TQU1QTEU7CisgICAgZnJhbWVCdWZfID0gbmV3IFRVaW50OFtmcmFtZUJ1ZlNpemVfXTsKK30KKworQ1BqQXVkaW9PdXRwdXRFbmdpbmU6On5DUGpBdWRpb091dHB1dEVuZ2luZSgpCit7CisgICAgU3RvcCgpOworICAgIGRlbGV0ZSBbXSBmcmFtZUJ1Zl87CQorfQorCitDUGpBdWRpb091dHB1dEVuZ2luZSAqCitDUGpBdWRpb091dHB1dEVuZ2luZTo6TmV3TEMoc3RydWN0IG1kYV9zdHJlYW0gKnBhcmVudF9zdHJtLAorCQkJICAgIHBqbWVkaWFfYXVkX3BsYXlfY2IgcGxheV9jYiwKKwkJCSAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgQ1BqQXVkaW9PdXRwdXRFbmdpbmUqIHNlbGYgPSBuZXcgKEVMZWF2ZSkgQ1BqQXVkaW9PdXRwdXRFbmdpbmUocGFyZW50X3N0cm0sCisJCQkJCQkJCSAgIHBsYXlfY2IsIAorCQkJCQkJCQkgICB1c2VyX2RhdGEpOworICAgIENsZWFudXBTdGFjazo6UHVzaEwoc2VsZik7CisgICAgc2VsZi0+Q29uc3RydWN0TCgpOworICAgIHJldHVybiBzZWxmOworfQorCitDUGpBdWRpb091dHB1dEVuZ2luZSAqCitDUGpBdWRpb091dHB1dEVuZ2luZTo6TmV3TChzdHJ1Y3QgbWRhX3N0cmVhbSAqcGFyZW50X3N0cm0sCisJCQkgICBwam1lZGlhX2F1ZF9wbGF5X2NiIHBsYXlfY2IsCisJCQkgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgQ1BqQXVkaW9PdXRwdXRFbmdpbmUgKnNlbGYgPSBOZXdMQyhwYXJlbnRfc3RybSwgcGxheV9jYiwgdXNlcl9kYXRhKTsKKyAgICBDbGVhbnVwU3RhY2s6OlBvcChzZWxmKTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworcGpfc3RhdHVzX3QgQ1BqQXVkaW9PdXRwdXRFbmdpbmU6OlN0YXJ0UGxheSgpCit7CisgICAgLy8gSWdub3JlIGNvbW1hbmQgaWYgcGxheWluZyBpcyBpbiBwcm9ncmVzcy4KKyAgICBpZiAoc3RhdGVfID09IFNUQVRFX0FDVElWRSkKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICAKKyAgICAvLyBEZXN0cm95IGV4aXN0aW5nIHN0cmVhbS4KKyAgICBpZiAoaU91dHB1dFN0cmVhbV8pIGRlbGV0ZSBpT3V0cHV0U3RyZWFtXzsKKyAgICBpT3V0cHV0U3RyZWFtXyA9IE5VTEw7CisgICAgCisgICAgLy8gQ3JlYXRlIHRoZSBzdHJlYW0KKyAgICBUUkFQRChlcnIsIGlPdXRwdXRTdHJlYW1fID0gQ01kYUF1ZGlvT3V0cHV0U3RyZWFtOjpOZXdMKCp0aGlzKSk7CisgICAgaWYgKGVyciAhPSBLRXJyTm9uZSkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKGVycik7CisgICAgCisgICAgLy8gSW5pdGlhbGl6ZSBzZXR0aW5ncy4KKyAgICBUTWRhQXVkaW9EYXRhU2V0dGluZ3MgaVN0cmVhbVNldHRpbmdzOworICAgIGlTdHJlYW1TZXR0aW5ncy5pQ2hhbm5lbHMgPSAKKwkJCSAgICBnZXRfY2hhbm5lbF9jYXAocGFyZW50U3RybV8tPnBhcmFtLmNoYW5uZWxfY291bnQpOworICAgIGlTdHJlYW1TZXR0aW5ncy5pU2FtcGxlUmF0ZSA9IAorCQkJICAgIGdldF9jbG9ja19yYXRlX2NhcChwYXJlbnRTdHJtXy0+cGFyYW0uY2xvY2tfcmF0ZSk7CisKKyAgICBwal9hc3NlcnQoaVN0cmVhbVNldHRpbmdzLmlDaGFubmVscyAhPSAwICYmIAorCSAgICAgIGlTdHJlYW1TZXR0aW5ncy5pU2FtcGxlUmF0ZSAhPSAwKTsKKyAgICAKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAiT3BlbmluZyBzb3VuZCBkZXZpY2UgZm9yIHBsYXliYWNrLCAiCisgICAgCQkgICAgICAgICAiY2xvY2sgcmF0ZT0lZCwgY2hhbm5lbCBjb3VudD0lZC4uIiwKKyAgICAJCSAgICAgICAgIHBhcmVudFN0cm1fLT5wYXJhbS5jbG9ja19yYXRlLCAKKyAgICAJCSAgICAgICAgIHBhcmVudFN0cm1fLT5wYXJhbS5jaGFubmVsX2NvdW50KSk7CisKKyAgICAvLyBPcGVuIHN0cmVhbS4KKyAgICBsYXN0RXJyb3JfID0gS1JlcXVlc3RQZW5kaW5nOworICAgIGlPdXRwdXRTdHJlYW1fLT5PcGVuKCZpU3RyZWFtU2V0dGluZ3MpOworICAgIAorI2lmIGRlZmluZWQoUEpNRURJQV9BVURJT19ERVZfTURBX1VTRV9TWU5DX1NUQVJUKSAmJiBcCisgICAgUEpNRURJQV9BVURJT19ERVZfTURBX1VTRV9TWU5DX1NUQVJUICE9IDAKKyAgICAKKyAgICBzdGFydEFzd18uU3RhcnQoKTsKKyAgICAKKyNlbmRpZgorCisgICAgLy8gU3VjY2VzcworICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsICJTb3VuZCBwbGF5YmFjayBzdGFydGVkIikpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworCit9CisKK3ZvaWQgQ1BqQXVkaW9PdXRwdXRFbmdpbmU6OlN0b3AoKQoreworICAgIC8vIFN0b3Agc3RyZWFtIGlmIGl0J3MgcGxheWluZworICAgIGlmIChpT3V0cHV0U3RyZWFtXyAmJiBzdGF0ZV8gIT0gU1RBVEVfSU5BQ1RJVkUpIHsKKyAgICAJbGFzdEVycm9yXyA9IEtSZXF1ZXN0UGVuZGluZzsKKyAgICAJaU91dHB1dFN0cmVhbV8tPlN0b3AoKTsKKworCS8vIFdhaXQgdW50aWwgaXQncyBhY3R1YWxseSBzdG9wcGVkCisgICAgCXdoaWxlIChsYXN0RXJyb3JfID09IEtSZXF1ZXN0UGVuZGluZykKKwkgICAgcGpfc3ltYmlhbm9zX3BvbGwoLTEsIDEwMCk7CisgICAgfQorICAgIAorICAgIGlmIChpT3V0cHV0U3RyZWFtXykgewkKKwlkZWxldGUgaU91dHB1dFN0cmVhbV87CisJaU91dHB1dFN0cmVhbV8gPSBOVUxMOworICAgIH0KKyAgICAKKyAgICBpZiAoc3RhcnRBc3dfLklzU3RhcnRlZCgpKSB7CisJc3RhcnRBc3dfLkFzeW5jU3RvcCgpOworICAgIH0KKyAgICAKKyAgICBzdGF0ZV8gPSBTVEFURV9JTkFDVElWRTsKK30KKwordm9pZCBDUGpBdWRpb091dHB1dEVuZ2luZTo6TWFvc2NPcGVuQ29tcGxldGUoVEludCBhRXJyb3IpCit7CisgICAgaWYgKHN0YXJ0QXN3Xy5Jc1N0YXJ0ZWQoKSkgeworCXN0YXJ0QXN3Xy5Bc3luY1N0b3AoKTsKKyAgICB9CisKKyAgICBsYXN0RXJyb3JfID0gYUVycm9yOworICAgIAorICAgIGlmIChhRXJyb3I9PUtFcnJOb25lKSB7CisJLy8gc2V0IHN0cmVhbSBwcm9wZXJ0aWVzLCAxNmJpdCA4S0h6IG1vbm8KKwlUTWRhQXVkaW9EYXRhU2V0dGluZ3MgaVNldHRpbmdzOworCWlTZXR0aW5ncy5pQ2hhbm5lbHMgPSAKKwkJCWdldF9jaGFubmVsX2NhcChwYXJlbnRTdHJtXy0+cGFyYW0uY2hhbm5lbF9jb3VudCk7CisJaVNldHRpbmdzLmlTYW1wbGVSYXRlID0gCisJCQlnZXRfY2xvY2tfcmF0ZV9jYXAocGFyZW50U3RybV8tPnBhcmFtLmNsb2NrX3JhdGUpOworCisJaU91dHB1dFN0cmVhbV8tPlNldEF1ZGlvUHJvcGVydGllc0woaVNldHRpbmdzLmlTYW1wbGVSYXRlLCAKKwkJCQkJICAgIGlTZXR0aW5ncy5pQ2hhbm5lbHMpOworCisgICAgICAgIC8qIEFwcGx5IG91dHB1dCB2b2x1bWUgc2V0dGluZyBpZiBzcGVjaWZpZWQgKi8KKyAgICAgICAgaWYgKHBhcmVudFN0cm1fLT5wYXJhbS5mbGFncyAmIAorICAgICAgICAgICAgUEpNRURJQV9BVURfREVWX0NBUF9PVVRQVVRfVk9MVU1FX1NFVFRJTkcpIAorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW1fc2V0X2NhcCgmcGFyZW50U3RybV8tPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9WT0xVTUVfU0VUVElORywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50U3RybV8tPnBhcmFtLm91dHB1dF92b2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2V0IHZvbHVtZSB0byAxLzJ0aCBvZiBzdHJlYW0gbWF4IHZvbHVtZQorICAgICAgICAgICAgaU91dHB1dFN0cmVhbV8tPlNldFZvbHVtZShpT3V0cHV0U3RyZWFtXy0+TWF4Vm9sdW1lKCkvMik7CisgICAgICAgIH0KKwkKKwkvLyBzZXQgc3RyZWFtIHByaW9yaXR5IHRvIG5vcm1hbCBhbmQgdGltZSBzZW5zaXRpdmUKKwlpT3V0cHV0U3RyZWFtXy0+U2V0UHJpb3JpdHkoRVByaW9yaXR5Tm9ybWFsLCAKKwkJCQkgICAgRU1kYVByaW9yaXR5UHJlZmVyZW5jZVRpbWUpOwkJCQkKKworCS8vIENhbGwgY2FsbGJhY2sgdG8gcmV0cmlldmUgZnJhbWUgZnJvbSB1cHN0cmVhbS4KKwlwam1lZGlhX2ZyYW1lIGY7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCQorCWYudHlwZSA9IFBKTUVESUFfRlJBTUVfVFlQRV9BVURJTzsKKwlmLmJ1ZiA9IGZyYW1lQnVmXzsKKwlmLnNpemUgPSBmcmFtZUJ1ZlNpemVfOworCWYudGltZXN0YW1wLnUzMi5sbyA9IHRpbWVzdGFtcF87CisJZi5iaXRfaW5mbyA9IDA7CisKKwlzdGF0dXMgPSBwbGF5Q2JfKHRoaXMtPnVzZXJEYXRhXywgJmYpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICB0aGlzLT5TdG9wKCk7CisJICAgIHJldHVybjsKKwl9CisKKwlpZiAoZi50eXBlICE9IFBKTUVESUFfRlJBTUVfVFlQRV9BVURJTykKKwkgICAgcGpfYnplcm8oZnJhbWVCdWZfLCBmcmFtZUJ1ZlNpemVfKTsKKwkKKwkvLyBJbmNyZW1lbnQgdGltZXN0YW1wLgorCXRpbWVzdGFtcF8gKz0gKGZyYW1lQnVmU2l6ZV8gLyBCWVRFU19QRVJfU0FNUExFKTsKKworCS8vIGlzc3VlIFdyaXRlTCgpIHRvIHdyaXRlIHRoZSBmaXJzdCBhdWRpbyBkYXRhIGJsb2NrLCAKKwkvLyBzdWJzZXF1ZW50IGNhbGxzIHRvIFdyaXRlTCgpIHdpbGwgYmUgaXNzdWVkIGluIAorCS8vIE1NZGFBdWRpb091dHB1dFN0cmVhbUNhbGxiYWNrOjpNYW9zY0J1ZmZlckNvcGllZCgpIAorCS8vIHVudGlsIHdob2xlIGRhdGEgYnVmZmVyIGlzIHdyaXR0ZW4uCisJZnJhbWVfLlNldChmcmFtZUJ1Zl8sIGZyYW1lQnVmU2l6ZV8pOworCWlPdXRwdXRTdHJlYW1fLT5Xcml0ZUwoZnJhbWVfKTsKKworCS8vIG91dHB1dCBzdHJlYW0gb3BlbmVkIHN1Y2Nlc2Z1bGx5LCBzZXQgc3RhdHVzIHRvIEFjdGl2ZQorCXN0YXRlXyA9IFNUQVRFX0FDVElWRTsKKyAgICB9IGVsc2UgeworICAgIAlzbmRfcGVycm9yKCJFcnJvciBpbiBNYW9zY09wZW5Db21wbGV0ZSgpIiwgYUVycm9yKTsKKyAgICB9Cit9CisKK3ZvaWQgQ1BqQXVkaW9PdXRwdXRFbmdpbmU6Ok1hb3NjQnVmZmVyQ29waWVkKFRJbnQgYUVycm9yLCAKKwkJCQkJICAgICBjb25zdCBURGVzQzgmIGFCdWZmZXIpCit7CisgICAgUEpfVU5VU0VEX0FSRyhhQnVmZmVyKTsKKworICAgIGlmIChhRXJyb3I9PUtFcnJOb25lKSB7CisgICAgCS8vIEJ1ZmZlciBzdWNjZXNzZnVsbHkgd3JpdHRlbiwgZmVlZCBhbm90aGVyIG9uZS4KKworCS8vIENhbGwgY2FsbGJhY2sgdG8gcmV0cmlldmUgZnJhbWUgZnJvbSB1cHN0cmVhbS4KKwlwam1lZGlhX2ZyYW1lIGY7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCQorCWYudHlwZSA9IFBKTUVESUFfRlJBTUVfVFlQRV9BVURJTzsKKwlmLmJ1ZiA9IGZyYW1lQnVmXzsKKwlmLnNpemUgPSBmcmFtZUJ1ZlNpemVfOworCWYudGltZXN0YW1wLnUzMi5sbyA9IHRpbWVzdGFtcF87CisJZi5iaXRfaW5mbyA9IDA7CisKKwlzdGF0dXMgPSBwbGF5Q2JfKHRoaXMtPnVzZXJEYXRhXywgJmYpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICB0aGlzLT5TdG9wKCk7CisJICAgIHJldHVybjsKKwl9CisKKwlpZiAoZi50eXBlICE9IFBKTUVESUFfRlJBTUVfVFlQRV9BVURJTykKKwkgICAgcGpfYnplcm8oZnJhbWVCdWZfLCBmcmFtZUJ1ZlNpemVfKTsKKwkKKwkvLyBJbmNyZW1lbnQgdGltZXN0YW1wLgorCXRpbWVzdGFtcF8gKz0gKGZyYW1lQnVmU2l6ZV8gLyBCWVRFU19QRVJfU0FNUExFKTsKKworCS8vIFdyaXRlIHRvIHBsYXliYWNrIHN0cmVhbS4KKwlmcmFtZV8uU2V0KGZyYW1lQnVmXywgZnJhbWVCdWZTaXplXyk7CisJaU91dHB1dFN0cmVhbV8tPldyaXRlTChmcmFtZV8pOworCisgICAgfSBlbHNlIGlmIChhRXJyb3I9PUtFcnJBYm9ydCkgeworCS8vIHBsYXlpbmcgd2FzIGFib3J0ZWQsIGR1ZSB0byBjYWxsIHRvIENNZGFBdWRpb091dHB1dFN0cmVhbTo6U3RvcCgpCisJc3RhdGVfID0gU1RBVEVfSU5BQ1RJVkU7CisgICAgfSBlbHNlICB7CisJLy8gZXJyb3Igd3JpdGluZyBkYXRhIHRvIG91dHB1dAorCWxhc3RFcnJvcl8gPSBhRXJyb3I7CisJc3RhdGVfID0gU1RBVEVfSU5BQ1RJVkU7CisJc25kX3BlcnJvcigiRXJyb3IgaW4gTWFvc2NCdWZmZXJDb3BpZWQoKSIsIGFFcnJvcik7CisgICAgfQorfQorCit2b2lkIENQakF1ZGlvT3V0cHV0RW5naW5lOjpNYW9zY1BsYXlDb21wbGV0ZShUSW50IGFFcnJvcikKK3sKKyAgICBsYXN0RXJyb3JfID0gYUVycm9yOworICAgIHN0YXRlXyA9IFNUQVRFX0lOQUNUSVZFOworICAgIGlmIChhRXJyb3IgIT0gS0Vyck5vbmUgJiYgYUVycm9yICE9IEtFcnJDYW5jZWwpIHsKKyAgICAJc25kX3BlcnJvcigiRXJyb3IgaW4gTWFvc2NQbGF5Q29tcGxldGUoKSIsIGFFcnJvcik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRmFjdG9yeSBvcGVyYXRpb25zCisgKi8KKworLyoKKyAqIEMgY29tcGF0aWJsZSBkZWNsYXJhdGlvbiBvZiBNREEgZmFjdG9yeS4KKyAqLworUEpfQkVHSU5fREVDTAorUEpfREVDTChwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSopIHBqbWVkaWFfc3ltYl9tZGFfZmFjdG9yeShwal9wb29sX2ZhY3RvcnkgKnBmKTsKK1BKX0VORF9ERUNMCisKKy8qCisgKiBJbml0IFN5bWJpYW4gYXVkaW8gZHJpdmVyLgorICovCitwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSogcGptZWRpYV9zeW1iX21kYV9mYWN0b3J5KHBqX3Bvb2xfZmFjdG9yeSAqcGYpCit7CisgICAgc3RydWN0IG1kYV9mYWN0b3J5ICpmOworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShwZiwgInN5bWJfYXVkIiwgMTAwMCwgMTAwMCwgTlVMTCk7CisgICAgZiA9IFBKX1BPT0xfWkFMTE9DX1QocG9vbCwgc3RydWN0IG1kYV9mYWN0b3J5KTsKKyAgICBmLT5wZiA9IHBmOworICAgIGYtPnBvb2wgPSBwb29sOworICAgIGYtPmJhc2Uub3AgPSAmZmFjdG9yeV9vcDsKKworICAgIHJldHVybiAmZi0+YmFzZTsKK30KKworLyogQVBJOiBpbml0IGZhY3RvcnkgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBmYWN0b3J5X2luaXQocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYpCit7CisgICAgc3RydWN0IG1kYV9mYWN0b3J5ICphZiA9IChzdHJ1Y3QgbWRhX2ZhY3RvcnkqKWY7CisKKyAgICBwal9hbnNpX3N0cmNweShhZi0+ZGV2X2luZm8ubmFtZSwgIlN5bWJpYW4gQXVkaW8iKTsKKyAgICBhZi0+ZGV2X2luZm8uZGVmYXVsdF9zYW1wbGVzX3Blcl9zZWMgPSA4MDAwOworICAgIGFmLT5kZXZfaW5mby5jYXBzID0gUEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9WT0xVTUVfU0VUVElORyB8CisJCQlQSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9WT0xVTUVfU0VUVElORzsKKyAgICBhZi0+ZGV2X2luZm8uaW5wdXRfY291bnQgPSAxOworICAgIGFmLT5kZXZfaW5mby5vdXRwdXRfY291bnQgPSAxOworCisgICAgUEpfTE9HKDQsIChUSElTX0ZJTEUsICJTeW1iIE1kYSBpbml0aWFsaXplZCIpKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBBUEk6IGRlc3Ryb3kgZmFjdG9yeSAqLworc3RhdGljIHBqX3N0YXR1c190IGZhY3RvcnlfZGVzdHJveShwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZikKK3sKKyAgICBzdHJ1Y3QgbWRhX2ZhY3RvcnkgKmFmID0gKHN0cnVjdCBtZGFfZmFjdG9yeSopZjsKKyAgICBwal9wb29sX3QgKnBvb2wgPSBhZi0+cG9vbDsKKworICAgIGFmLT5wb29sID0gTlVMTDsKKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICBQSl9MT0coNCwgKFRISVNfRklMRSwgIlN5bWJpYW4gTWRhIGRlc3Ryb3llZCIpKTsKKyAgICAKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogQVBJOiByZWZyZXNoIHRoZSBkZXZpY2UgbGlzdCAqLworc3RhdGljIHBqX3N0YXR1c190IGZhY3RvcnlfcmVmcmVzaChwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZikKK3sKKyAgICBQSl9VTlVTRURfQVJHKGYpOworICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBBUEk6IGdldCBudW1iZXIgb2YgZGV2aWNlcyAqLworc3RhdGljIHVuc2lnbmVkIGZhY3RvcnlfZ2V0X2Rldl9jb3VudChwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZikKK3sKKyAgICBQSl9VTlVTRURfQVJHKGYpOworICAgIHJldHVybiAxOworfQorCisvKiBBUEk6IGdldCBkZXZpY2UgaW5mbyAqLworc3RhdGljIHBqX3N0YXR1c190IGZhY3RvcnlfZ2V0X2Rldl9pbmZvKHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmLCAKKwkJCQkJdW5zaWduZWQgaW5kZXgsCisJCQkJCXBqbWVkaWFfYXVkX2Rldl9pbmZvICppbmZvKQoreworICAgIHN0cnVjdCBtZGFfZmFjdG9yeSAqYWYgPSAoc3RydWN0IG1kYV9mYWN0b3J5KilmOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihpbmRleCA9PSAwLCBQSk1FRElBX0VBVURfSU5WREVWKTsKKworICAgIHBqX21lbWNweShpbmZvLCAmYWYtPmRldl9pbmZvLCBzaXplb2YoKmluZm8pKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBBUEk6IGNyZWF0ZSBkZWZhdWx0IGRldmljZSBwYXJhbWV0ZXIgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBmYWN0b3J5X2RlZmF1bHRfcGFyYW0ocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYsCisJCQkJCSB1bnNpZ25lZCBpbmRleCwKKwkJCQkJIHBqbWVkaWFfYXVkX3BhcmFtICpwYXJhbSkKK3sKKyAgICBzdHJ1Y3QgbWRhX2ZhY3RvcnkgKmFmID0gKHN0cnVjdCBtZGFfZmFjdG9yeSopZjsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oaW5kZXggPT0gMCwgUEpNRURJQV9FQVVEX0lOVkRFVik7CisKKyAgICBwal9iemVybyhwYXJhbSwgc2l6ZW9mKCpwYXJhbSkpOworICAgIHBhcmFtLT5kaXIgPSBQSk1FRElBX0RJUl9DQVBUVVJFX1BMQVlCQUNLOworICAgIHBhcmFtLT5yZWNfaWQgPSBpbmRleDsKKyAgICBwYXJhbS0+cGxheV9pZCA9IGluZGV4OworICAgIHBhcmFtLT5jbG9ja19yYXRlID0gYWYtPmRldl9pbmZvLmRlZmF1bHRfc2FtcGxlc19wZXJfc2VjOworICAgIHBhcmFtLT5jaGFubmVsX2NvdW50ID0gMTsKKyAgICBwYXJhbS0+c2FtcGxlc19wZXJfZnJhbWUgPSBhZi0+ZGV2X2luZm8uZGVmYXVsdF9zYW1wbGVzX3Blcl9zZWMgKiAyMCAvIDEwMDA7CisgICAgcGFyYW0tPmJpdHNfcGVyX3NhbXBsZSA9IEJJVFNfUEVSX1NBTVBMRTsKKyAgICAvLyBEb24ndCBzZXQgdGhlIGZsYWdzIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgZmxhZ3MgdmFsdWUuCisgICAgLy9wYXJhbS0+ZmxhZ3MgPSBhZi0+ZGV2X2luZm8uY2FwczsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qIEFQSTogY3JlYXRlIHN0cmVhbSAqLworc3RhdGljIHBqX3N0YXR1c190IGZhY3RvcnlfY3JlYXRlX3N0cmVhbShwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZiwKKwkJCQkJIGNvbnN0IHBqbWVkaWFfYXVkX3BhcmFtICpwYXJhbSwKKwkJCQkJIHBqbWVkaWFfYXVkX3JlY19jYiByZWNfY2IsCisJCQkJCSBwam1lZGlhX2F1ZF9wbGF5X2NiIHBsYXlfY2IsCisJCQkJCSB2b2lkICp1c2VyX2RhdGEsCisJCQkJCSBwam1lZGlhX2F1ZF9zdHJlYW0gKipwX2F1ZF9zdHJtKQoreworICAgIHN0cnVjdCBtZGFfZmFjdG9yeSAqbWYgPSAoc3RydWN0IG1kYV9mYWN0b3J5KilmOworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBzdHJ1Y3QgbWRhX3N0cmVhbSAqc3RybTsKKworICAgIC8qIENhbiBvbmx5IHN1cHBvcnQgMTZiaXRzIHBlciBzYW1wbGUgcmF3IFBDTSBmb3JtYXQuICovCisgICAgUEpfQVNTRVJUX1JFVFVSTihwYXJhbS0+Yml0c19wZXJfc2FtcGxlID09IEJJVFNfUEVSX1NBTVBMRSwgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKChwYXJhbS0+ZmxhZ3MgJiBQSk1FRElBX0FVRF9ERVZfQ0FQX0VYVF9GT1JNQVQpPT0wIHx8CisJCSAgICAgcGFyYW0tPmV4dF9mbXQuaWQgPT0gUEpNRURJQV9GT1JNQVRfTDE2LAorCQkgICAgIFBKX0VOT1RTVVApOworICAgIAorICAgIC8qIEl0IHNlZW1zIHRoYXQgTURBIHJlY29yZGVyIG9ubHkgc3VwcG9ydHMgZm9yIG1vbm8gY2hhbm5lbC4gKi8KKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBhcmFtLT5jaGFubmVsX2NvdW50ID09IDEsIFBKX0VJTlZBTCk7CisKKyAgICAvKiBDcmVhdGUgYW5kIEluaXRpYWxpemUgc3RyZWFtIGRlc2NyaXB0b3IgKi8KKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWYtPnBmLCAic3ltYl9hdWRfZGV2IiwgMTAwMCwgMTAwMCwgTlVMTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sLCBQSl9FTk9NRU0pOworCisgICAgc3RybSA9IFBKX1BPT0xfWkFMTE9DX1QocG9vbCwgc3RydWN0IG1kYV9zdHJlYW0pOworICAgIHN0cm0tPnBvb2wgPSBwb29sOworICAgIHN0cm0tPnBhcmFtID0gKnBhcmFtOworCisgICAgLy8gQ3JlYXRlIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgIGlmIChzdHJtLT5wYXJhbS5kaXIgJiBQSk1FRElBX0RJUl9QTEFZQkFDSykgeworCVRSQVBEKGVyciwgc3RybS0+b3V0X2VuZ2luZSA9IENQakF1ZGlvT3V0cHV0RW5naW5lOjpOZXdMKHN0cm0sIHBsYXlfY2IsCisJCQkJCQkJCSB1c2VyX2RhdGEpKTsKKwlpZiAoZXJyICE9IEtFcnJOb25lKSB7CisJICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsJCisJICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZXJyKTsKKwl9CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgaWYgKHN0cm0tPnBhcmFtLmRpciAmIFBKTUVESUFfRElSX0NBUFRVUkUpIHsKKwlUUkFQRChlcnIsIHN0cm0tPmluX2VuZ2luZSA9IENQakF1ZGlvSW5wdXRFbmdpbmU6Ok5ld0woc3RybSwgcmVjX2NiLCAKKwkJCQkJCQkgICAgICAgdXNlcl9kYXRhKSk7CisJaWYgKGVyciAhPSBLRXJyTm9uZSkgeworCSAgICBzdHJtLT5pbl9lbmdpbmUgPSBOVUxMOworCSAgICBkZWxldGUgc3RybS0+b3V0X2VuZ2luZTsKKwkgICAgc3RybS0+b3V0X2VuZ2luZSA9IE5VTEw7CisJICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsJCisJICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZXJyKTsKKwl9CisgICAgfQorCQorICAgIC8qIERvbmUgKi8KKyAgICBzdHJtLT5iYXNlLm9wID0gJnN0cmVhbV9vcDsKKyAgICAqcF9hdWRfc3RybSA9ICZzdHJtLT5iYXNlOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEFQSTogR2V0IHN0cmVhbSBpbmZvLiAqLworc3RhdGljIHBqX3N0YXR1c190IHN0cmVhbV9nZXRfcGFyYW0ocGptZWRpYV9hdWRfc3RyZWFtICpzLAorCQkJCSAgICBwam1lZGlhX2F1ZF9wYXJhbSAqcGkpCit7CisgICAgc3RydWN0IG1kYV9zdHJlYW0gKnN0cm0gPSAoc3RydWN0IG1kYV9zdHJlYW0qKXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0cm0gJiYgcGksIFBKX0VJTlZBTCk7CisKKyAgICBwal9tZW1jcHkocGksICZzdHJtLT5wYXJhbSwgc2l6ZW9mKCpwaSkpOworICAgIAorICAgIC8qIFVwZGF0ZSB0aGUgb3V0cHV0IHZvbHVtZSBzZXR0aW5nICovCisgICAgaWYgKHN0cmVhbV9nZXRfY2FwKHMsIFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1ZPTFVNRV9TRVRUSU5HLAorCQkgICAgICAgJnBpLT5vdXRwdXRfdm9sKSA9PSBQSl9TVUNDRVNTKQorICAgIHsKKwlwaS0+ZmxhZ3MgfD0gUEpNRURJQV9BVURfREVWX0NBUF9PVVRQVVRfVk9MVU1FX1NFVFRJTkc7CisgICAgfQorICAgIAorICAgIC8qIFVwZGF0ZSB0aGUgaW5wdXQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBpZiAoc3RyZWFtX2dldF9jYXAocywgUEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9WT0xVTUVfU0VUVElORywKKwkJICAgICAgICZwaS0+aW5wdXRfdm9sKSA9PSBQSl9TVUNDRVNTKQorICAgIHsKKwlwaS0+ZmxhZ3MgfD0gUEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9WT0xVTUVfU0VUVElORzsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEFQSTogZ2V0IGNhcGFiaWxpdHkgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJlYW1fZ2V0X2NhcChwam1lZGlhX2F1ZF9zdHJlYW0gKnMsCisJCQkJICBwam1lZGlhX2F1ZF9kZXZfY2FwIGNhcCwKKwkJCQkgIHZvaWQgKnB2YWwpCit7CisgICAgc3RydWN0IG1kYV9zdHJlYW0gKnN0cm0gPSAoc3RydWN0IG1kYV9zdHJlYW0qKXM7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfRU5PVFNVUDsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocyAmJiBwdmFsLCBQSl9FSU5WQUwpOworCisgICAgc3dpdGNoIChjYXApIHsKKyAgICBjYXNlIFBKTUVESUFfQVVEX0RFVl9DQVBfSU5QVVRfVk9MVU1FX1NFVFRJTkc6CisJaWYgKHN0cm0tPnBhcmFtLmRpciAmIFBKTUVESUFfRElSX0NBUFRVUkUpIHsKKwkgICAgUEpfQVNTRVJUX1JFVFVSTihzdHJtLT5pbl9lbmdpbmUsIFBKX0VJTlZBTCk7CisJICAgIAorCSAgICBUSW50IG1heF9nYWluID0gc3RybS0+aW5fZW5naW5lLT5HZXRNYXhHYWluKCk7CisJICAgIFRJbnQgZ2FpbiA9IHN0cm0tPmluX2VuZ2luZS0+R2V0R2FpbigpOworCSAgICAKKwkgICAgaWYgKG1heF9nYWluID4gMCAmJiBnYWluID49IDApIHsKKwkJKih1bnNpZ25lZCopcHZhbCA9IGdhaW4gKiAxMDAgLyBtYXhfZ2FpbjsgCisJCXN0YXR1cyA9IFBKX1NVQ0NFU1M7CisJICAgIH0gZWxzZSB7CisJCXN0YXR1cyA9IFBKTUVESUFfRUFVRF9OT1RSRUFEWTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICBjYXNlIFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1ZPTFVNRV9TRVRUSU5HOgorCWlmIChzdHJtLT5wYXJhbS5kaXIgJiBQSk1FRElBX0RJUl9QTEFZQkFDSykgeworCSAgICBQSl9BU1NFUlRfUkVUVVJOKHN0cm0tPm91dF9lbmdpbmUsIFBKX0VJTlZBTCk7CisJICAgIAorCSAgICBUSW50IG1heF92b2wgPSBzdHJtLT5vdXRfZW5naW5lLT5HZXRNYXhWb2x1bWUoKTsKKwkgICAgVEludCB2b2wgPSBzdHJtLT5vdXRfZW5naW5lLT5HZXRWb2x1bWUoKTsKKwkgICAgCisJICAgIGlmIChtYXhfdm9sID4gMCAmJiB2b2wgPj0gMCkgeworCQkqKHVuc2lnbmVkKilwdmFsID0gdm9sICogMTAwIC8gbWF4X3ZvbDsgCisJCXN0YXR1cyA9IFBKX1NVQ0NFU1M7CisJICAgIH0gZWxzZSB7CisJCXN0YXR1cyA9IFBKTUVESUFfRUFVRF9OT1RSRUFEWTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWJyZWFrOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBBUEk6IHNldCBjYXBhYmlsaXR5ICovCitzdGF0aWMgcGpfc3RhdHVzX3Qgc3RyZWFtX3NldF9jYXAocGptZWRpYV9hdWRfc3RyZWFtICpzLAorCQkJCSAgcGptZWRpYV9hdWRfZGV2X2NhcCBjYXAsCisJCQkJICBjb25zdCB2b2lkICpwdmFsKQoreworICAgIHN0cnVjdCBtZGFfc3RyZWFtICpzdHJtID0gKHN0cnVjdCBtZGFfc3RyZWFtKilzOworICAgIHBqX3N0YXR1c190IHN0YXR1cyA9IFBKX0VOT1RTVVA7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHMgJiYgcHZhbCwgUEpfRUlOVkFMKTsKKworICAgIHN3aXRjaCAoY2FwKSB7CisgICAgY2FzZSBQSk1FRElBX0FVRF9ERVZfQ0FQX0lOUFVUX1ZPTFVNRV9TRVRUSU5HOgorCWlmIChzdHJtLT5wYXJhbS5kaXIgJiBQSk1FRElBX0RJUl9DQVBUVVJFKSB7CisJICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RybS0+aW5fZW5naW5lLCBQSl9FSU5WQUwpOworCSAgICAKKwkgICAgVEludCBtYXhfZ2FpbiA9IHN0cm0tPmluX2VuZ2luZS0+R2V0TWF4R2FpbigpOworCSAgICBpZiAobWF4X2dhaW4gPiAwKSB7CisJCVRJbnQgZ2FpbjsKKwkJCisJCWdhaW4gPSAqKHVuc2lnbmVkKilwdmFsICogbWF4X2dhaW4gLyAxMDA7CisJCXN0YXR1cyA9IHN0cm0tPmluX2VuZ2luZS0+U2V0R2FpbihnYWluKTsKKwkgICAgfSBlbHNlIHsKKwkJc3RhdHVzID0gUEpNRURJQV9FQVVEX05PVFJFQURZOworCSAgICB9CisJfQorCWJyZWFrOworICAgIGNhc2UgUEpNRURJQV9BVURfREVWX0NBUF9PVVRQVVRfVk9MVU1FX1NFVFRJTkc6CisJaWYgKHN0cm0tPnBhcmFtLmRpciAmIFBKTUVESUFfRElSX1BMQVlCQUNLKSB7CisJICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RybS0+b3V0X2VuZ2luZSwgUEpfRUlOVkFMKTsKKwkgICAgCisJICAgIFRJbnQgbWF4X3ZvbCA9IHN0cm0tPm91dF9lbmdpbmUtPkdldE1heFZvbHVtZSgpOworCSAgICBpZiAobWF4X3ZvbCA+IDApIHsKKwkJVEludCB2b2w7CisJCQorCQl2b2wgPSAqKHVuc2lnbmVkKilwdmFsICogbWF4X3ZvbCAvIDEwMDsKKwkJc3RhdHVzID0gc3RybS0+b3V0X2VuZ2luZS0+U2V0Vm9sdW1lKHZvbCk7CisJICAgIH0gZWxzZSB7CisJCXN0YXR1cyA9IFBKTUVESUFfRUFVRF9OT1RSRUFEWTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWJyZWFrOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBBUEk6IFN0YXJ0IHN0cmVhbS4gKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzdHJlYW1fc3RhcnQocGptZWRpYV9hdWRfc3RyZWFtICpzdHJtKQoreworICAgIHN0cnVjdCBtZGFfc3RyZWFtICpzdHJlYW0gPSAoc3RydWN0IG1kYV9zdHJlYW0qKXN0cm07CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0cmVhbSwgUEpfRUlOVkFMKTsKKworICAgIGlmIChzdHJlYW0tPm91dF9lbmdpbmUpIHsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCXN0YXR1cyA9IHN0cmVhbS0+b3V0X2VuZ2luZS0+U3RhcnRQbGF5KCk7CisgICAgCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIAorICAgIGlmIChzdHJlYW0tPmluX2VuZ2luZSkgeworCXBqX3N0YXR1c190IHN0YXR1czsKKyAgICAJc3RhdHVzID0gc3RyZWFtLT5pbl9lbmdpbmUtPlN0YXJ0UmVjb3JkKCk7CisgICAgCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEFQSTogU3RvcCBzdHJlYW0uICovCitzdGF0aWMgcGpfc3RhdHVzX3Qgc3RyZWFtX3N0b3AocGptZWRpYV9hdWRfc3RyZWFtICpzdHJtKQoreworICAgIHN0cnVjdCBtZGFfc3RyZWFtICpzdHJlYW0gPSAoc3RydWN0IG1kYV9zdHJlYW0qKXN0cm07CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0cmVhbSwgUEpfRUlOVkFMKTsKKworICAgIGlmIChzdHJlYW0tPmluX2VuZ2luZSkgeworICAgIAlzdHJlYW0tPmluX2VuZ2luZS0+U3RvcCgpOworICAgIH0KKyAgICAJCisgICAgaWYgKHN0cmVhbS0+b3V0X2VuZ2luZSkgeworICAgIAlzdHJlYW0tPm91dF9lbmdpbmUtPlN0b3AoKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKiBBUEk6IERlc3Ryb3kgc3RyZWFtLiAqLworc3RhdGljIHBqX3N0YXR1c190IHN0cmVhbV9kZXN0cm95KHBqbWVkaWFfYXVkX3N0cmVhbSAqc3RybSkKK3sKKyAgICBzdHJ1Y3QgbWRhX3N0cmVhbSAqc3RyZWFtID0gKHN0cnVjdCBtZGFfc3RyZWFtKilzdHJtOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihzdHJlYW0sIFBKX0VJTlZBTCk7CisKKyAgICBzdHJlYW1fc3RvcChzdHJtKTsKKworICAgIGRlbGV0ZSBzdHJlYW0tPmluX2VuZ2luZTsKKyAgICBzdHJlYW0tPmluX2VuZ2luZSA9IE5VTEw7CisKKyAgICBkZWxldGUgc3RyZWFtLT5vdXRfZW5naW5lOworICAgIHN0cmVhbS0+b3V0X2VuZ2luZSA9IE5VTEw7CisKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcG9vbCA9IHN0cmVhbS0+cG9vbDsKKyAgICBpZiAocG9vbCkgeworICAgIAlzdHJlYW0tPnBvb2wgPSBOVUxMOworICAgIAlwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAvKiBQSk1FRElBX0FVRElPX0RFVl9IQVNfU1lNQl9NREEgKi8KZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzQ5LzQ5OWQ2ZWVlYzBhMjk1Y2I2MGM1NGVlYTFkZjhiZTlmMzk3OTE4ZDguc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS80OS80OTlkNmVlZWMwYTI5NWNiNjBjNTRlZWExZGY4YmU5ZjM5NzkxOGQ4LnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTA3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS80OS80OTlkNmVlZWMwYTI5NWNiNjBjNTRlZWExZGY4YmU5ZjM5NzkxOGQ4LnN2bi1iYXNlCkBAIC0wLDAgKzEsMTQ0NyBAQAorLyogJElkJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwanNpcC11YS9zaXBfcmVnYy5oPgorI2luY2x1ZGUgPHBqc2lwL3NpcF9lbmRwb2ludC5oPgorI2luY2x1ZGUgPHBqc2lwL3NpcF9wYXJzZXIuaD4KKyNpbmNsdWRlIDxwanNpcC9zaXBfbW9kdWxlLmg+CisjaW5jbHVkZSA8cGpzaXAvc2lwX3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8cGpzaXAvc2lwX2V2ZW50Lmg+CisjaW5jbHVkZSA8cGpzaXAvc2lwX3V0aWwuaD4KKyNpbmNsdWRlIDxwanNpcC9zaXBfYXV0aF9tc2cuaD4KKyNpbmNsdWRlIDxwanNpcC9zaXBfZXJybm8uaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9ndWlkLmg+CisjaW5jbHVkZSA8cGovbG9jay5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL3JhbmQuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworCisjZGVmaW5lIFJFRlJFU0hfVElNRVIJCTEKKyNkZWZpbmUgREVMQVlfQkVGT1JFX1JFRlJFU0ggICAgUEpTSVBfUkVHSVNURVJfQ0xJRU5UX0RFTEFZX0JFRk9SRV9SRUZSRVNICisjZGVmaW5lIFRISVNfRklMRQkJInNpcF9yZWcuYyIKKworLyogT3V0Z29pbmcgdHJhbnNhY3Rpb24gdGltZW91dCB3aGVuIHNlcnZlciBzZW5kcyAxMDAgYnV0IG5ldmVyIHJlcGxpZXMKKyAqIHdpdGggZmluYWwgcmVzcG9uc2UuIFZhbHVlIGlzIGluIE1JTElTRUNPTkRTIQorICovCisjZGVmaW5lIFJFR0NfVFNYX1RJTUVPVVQJMzMwMDAKKworZW51bSB7IE5PRVhQID0gMHgxRkZGRkZGRiB9OworCitzdGF0aWMgY29uc3QgcGpfc3RyX3QgWFVJRF9QQVJBTV9OQU1FID0geyAieC11aWQiLCA1IH07CisKKworLyogQ3VycmVudC9wZW5kaW5nIG9wZXJhdGlvbiAqLworZW51bSByZWdjX29wCit7CisgICAgUkVHQ19JRExFLAorICAgIFJFR0NfUkVHSVNURVJJTkcsCisgICAgUkVHQ19VTlJFR0lTVEVSSU5HCit9OworCisvKioKKyAqIFNJUCBjbGllbnQgcmVnaXN0cmF0aW9uIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHBqc2lwX3JlZ2MKK3sKKyAgICBwal9wb29sX3QJCQkqcG9vbDsKKyAgICBwanNpcF9lbmRwb2ludAkJKmVuZHB0OworICAgIHBqX2xvY2tfdAkJCSpsb2NrOworICAgIHBqX2Jvb2xfdAkJCSBfZGVsZXRlX2ZsYWc7CisgICAgcGpfYm9vbF90CQkJIGhhc190c3g7CisgICAgcGpfYXRvbWljX3QJCQkqYnVzeV9jdHI7CisgICAgZW51bSByZWdjX29wCQkgY3VycmVudF9vcDsKKworICAgIHBqX2Jvb2xfdAkJCSBhZGRfeHVpZF9wYXJhbTsKKworICAgIHZvaWQJCQkqdG9rZW47CisgICAgcGpzaXBfcmVnY19jYgkJKmNiOworICAgIHBqc2lwX3JlZ2NfdHN4X2NiICAgICAgICAgICAqdHN4X2NiOworCisgICAgcGpfc3RyX3QJCQkgc3RyX3Nydl91cmw7CisgICAgcGpzaXBfdXJpCQkJKnNydl91cmw7CisgICAgcGpzaXBfY2lkX2hkcgkJKmNpZF9oZHI7CisgICAgcGpzaXBfY3NlcV9oZHIJCSpjc2VxX2hkcjsKKyAgICBwal9zdHJfdAkJCSBmcm9tX3VyaTsKKyAgICBwanNpcF9mcm9tX2hkcgkJKmZyb21faGRyOworICAgIHBqc2lwX3RvX2hkcgkJKnRvX2hkcjsKKyAgICBwanNpcF9jb250YWN0X2hkcgkJIGNvbnRhY3RfaGRyX2xpc3Q7CisgICAgcGpzaXBfY29udGFjdF9oZHIJCSByZW1vdmVkX2NvbnRhY3RfaGRyX2xpc3Q7CisgICAgcGpzaXBfZXhwaXJlc19oZHIJCSpleHBpcmVzX2hkcjsKKyAgICBwal91aW50MzJfdAkJCSBleHBpcmVzOworICAgIHBqX3VpbnQzMl90CQkJIGRlbGF5X2JlZm9yZV9yZWZyZXNoOworICAgIHBqc2lwX3JvdXRlX2hkcgkJIHJvdXRlX3NldDsKKyAgICBwanNpcF9oZHIJCQkgaGRyX2xpc3Q7CisgICAgcGpzaXBfaG9zdF9wb3J0ICAgICAgICAgICAgICB2aWFfYWRkcjsKKyAgICBjb25zdCB2b2lkICAgICAgICAgICAgICAgICAgKnZpYV90cDsKKworICAgIC8qIEF1dGhvcml6YXRpb24gc2Vzc2lvbnMuICovCisgICAgcGpzaXBfYXV0aF9jbHRfc2VzcwkJIGF1dGhfc2VzczsKKworICAgIC8qIEF1dG8gcmVmcmVzaCByZWdpc3RyYXRpb24uICovCisgICAgcGpfYm9vbF90CQkJIGF1dG9fcmVnOworICAgIHBqX3RpbWVfdmFsCQkJIGxhc3RfcmVnOworICAgIHBqX3RpbWVfdmFsCQkJIG5leHRfcmVnOworICAgIHBqX3RpbWVyX2VudHJ5CQkgdGltZXI7CisKKyAgICAvKiBUcmFuc3BvcnQgc2VsZWN0b3IgKi8KKyAgICBwanNpcF90cHNlbGVjdG9yCQkgdHBfc2VsOworCisgICAgLyogTGFzdCB0cmFuc3BvcnQgdXNlZC4gV2UgYWNxdWlyZSB0aGUgdHJhbnNwb3J0IHRvIGtlZXAKKyAgICAgKiBpdCBvcGVuLgorICAgICAqLworICAgIHBqc2lwX3RyYW5zcG9ydAkJKmxhc3RfdHJhbnNwb3J0OworfTsKKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc2lwX3JlZ2NfY3JlYXRlKCBwanNpcF9lbmRwb2ludCAqZW5kcHQsIHZvaWQgKnRva2VuLAorCQkJCSAgICAgICBwanNpcF9yZWdjX2NiICpjYiwKKwkJCQkgICAgICAgcGpzaXBfcmVnYyAqKnBfcmVnYykKK3sKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGpzaXBfcmVnYyAqcmVnYzsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvKiBWZXJpZnkgYXJndW1lbnRzLiAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oZW5kcHQgJiYgY2IgJiYgcF9yZWdjLCBQSl9FSU5WQUwpOworCisgICAgcG9vbCA9IHBqc2lwX2VuZHB0X2NyZWF0ZV9wb29sKGVuZHB0LCAicmVnYyVwIiwgMTAyNCwgMTAyNCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICE9IE5VTEwsIFBKX0VOT01FTSk7CisKKyAgICByZWdjID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBwanNpcF9yZWdjKTsKKworICAgIHJlZ2MtPnBvb2wgPSBwb29sOworICAgIHJlZ2MtPmVuZHB0ID0gZW5kcHQ7CisgICAgcmVnYy0+dG9rZW4gPSB0b2tlbjsKKyAgICByZWdjLT5jYiA9IGNiOworICAgIHJlZ2MtPmV4cGlyZXMgPSBQSlNJUF9SRUdDX0VYUElSQVRJT05fTk9UX1NQRUNJRklFRDsKKyAgICByZWdjLT5hZGRfeHVpZF9wYXJhbSA9IHBqc2lwX2NmZygpLT5yZWdjLmFkZF94dWlkX3BhcmFtOworCisgICAgc3RhdHVzID0gcGpfbG9ja19jcmVhdGVfcmVjdXJzaXZlX211dGV4KHBvb2wsIHBvb2wtPm9ial9uYW1lLCAKKwkJCQkJICAgICZyZWdjLT5sb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlwal9wb29sX3JlbGVhc2UocG9vbCk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9hdG9taWNfY3JlYXRlKHBvb2wsIDAsICZyZWdjLT5idXN5X2N0cik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfbG9ja19kZXN0cm95KHJlZ2MtPmxvY2spOworCXBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc2lwX2F1dGhfY2x0X2luaXQoJnJlZ2MtPmF1dGhfc2VzcywgZW5kcHQsIHJlZ2MtPnBvb2wsIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgcGpfbGlzdF9pbml0KCZyZWdjLT5yb3V0ZV9zZXQpOworICAgIHBqX2xpc3RfaW5pdCgmcmVnYy0+aGRyX2xpc3QpOworICAgIHBqX2xpc3RfaW5pdCgmcmVnYy0+Y29udGFjdF9oZHJfbGlzdCk7CisgICAgcGpfbGlzdF9pbml0KCZyZWdjLT5yZW1vdmVkX2NvbnRhY3RfaGRyX2xpc3QpOworCisgICAgLyogRG9uZSAqLworICAgICpwX3JlZ2MgPSByZWdjOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzaXBfcmVnY19kZXN0cm95KHBqc2lwX3JlZ2MgKnJlZ2MpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihyZWdjLCBQSl9FSU5WQUwpOworCisgICAgcGpfbG9ja19hY3F1aXJlKHJlZ2MtPmxvY2spOworICAgIGlmIChyZWdjLT5oYXNfdHN4IHx8IHBqX2F0b21pY19nZXQocmVnYy0+YnVzeV9jdHIpICE9IDApIHsKKwlyZWdjLT5fZGVsZXRlX2ZsYWcgPSAxOworCXJlZ2MtPmNiID0gTlVMTDsKKwlwal9sb2NrX3JlbGVhc2UocmVnYy0+bG9jayk7CisgICAgfSBlbHNlIHsKKwlwanNpcF90cHNlbGVjdG9yX2RlY19yZWYoJnJlZ2MtPnRwX3NlbCk7CisJaWYgKHJlZ2MtPmxhc3RfdHJhbnNwb3J0KSB7CisJICAgIHBqc2lwX3RyYW5zcG9ydF9kZWNfcmVmKHJlZ2MtPmxhc3RfdHJhbnNwb3J0KTsKKwkgICAgcmVnYy0+bGFzdF90cmFuc3BvcnQgPSBOVUxMOworCX0KKwlpZiAocmVnYy0+dGltZXIuaWQgIT0gMCkgeworCSAgICBwanNpcF9lbmRwdF9jYW5jZWxfdGltZXIocmVnYy0+ZW5kcHQsICZyZWdjLT50aW1lcik7CisJICAgIHJlZ2MtPnRpbWVyLmlkID0gMDsKKwl9CisJcGpfYXRvbWljX2Rlc3Ryb3kocmVnYy0+YnVzeV9jdHIpOworCXBqX2xvY2tfcmVsZWFzZShyZWdjLT5sb2NrKTsKKwlwal9sb2NrX2Rlc3Ryb3kocmVnYy0+bG9jayk7CisJcmVnYy0+bG9jayA9IE5VTEw7CisJcGpzaXBfZW5kcHRfcmVsZWFzZV9wb29sKHJlZ2MtPmVuZHB0LCByZWdjLT5wb29sKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc2lwX3JlZ2NfZ2V0X2luZm8oIHBqc2lwX3JlZ2MgKnJlZ2MsCisJCQkJCSBwanNpcF9yZWdjX2luZm8gKmluZm8gKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4ocmVnYyAmJiBpbmZvLCBQSl9FSU5WQUwpOworCisgICAgcGpfbG9ja19hY3F1aXJlKHJlZ2MtPmxvY2spOworCisgICAgaW5mby0+c2VydmVyX3VyaSA9IHJlZ2MtPnN0cl9zcnZfdXJsOworICAgIGluZm8tPmNsaWVudF91cmkgPSByZWdjLT5mcm9tX3VyaTsKKyAgICBpbmZvLT5pc19idXN5ID0gKHBqX2F0b21pY19nZXQocmVnYy0+YnVzeV9jdHIpIHx8IHJlZ2MtPmhhc190c3gpOworICAgIGluZm8tPmF1dG9fcmVnID0gcmVnYy0+YXV0b19yZWc7CisgICAgaW5mby0+aW50ZXJ2YWwgPSByZWdjLT5leHBpcmVzOworICAgIGluZm8tPnRyYW5zcG9ydCA9IHJlZ2MtPmxhc3RfdHJhbnNwb3J0OworICAgIAorICAgIGlmIChyZWdjLT5oYXNfdHN4KQorCWluZm8tPm5leHRfcmVnID0gMDsKKyAgICBlbHNlIGlmIChyZWdjLT5hdXRvX3JlZyA9PSAwKQorCWluZm8tPm5leHRfcmVnID0gMDsKKyAgICBlbHNlIGlmIChyZWdjLT5leHBpcmVzIDwgMCkKKwlpbmZvLT5uZXh0X3JlZyA9IHJlZ2MtPmV4cGlyZXM7CisgICAgZWxzZSB7CisJcGpfdGltZV92YWwgbm93LCBuZXh0X3JlZzsKKworCW5leHRfcmVnID0gcmVnYy0+bmV4dF9yZWc7CisJcGpfZ2V0dGltZW9mZGF5KCZub3cpOworCVBKX1RJTUVfVkFMX1NVQihuZXh0X3JlZywgbm93KTsKKwlpbmZvLT5uZXh0X3JlZyA9IG5leHRfcmVnLnNlYzsKKyAgICB9CisKKyAgICBwal9sb2NrX3JlbGVhc2UocmVnYy0+bG9jayk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitQSl9ERUYocGpfcG9vbF90KikgcGpzaXBfcmVnY19nZXRfcG9vbChwanNpcF9yZWdjICpyZWdjKQoreworICAgIHJldHVybiByZWdjLT5wb29sOworfQorCitzdGF0aWMgdm9pZCBzZXRfZXhwaXJlcyggcGpzaXBfcmVnYyAqcmVnYywgcGpfdWludDMyX3QgZXhwaXJlcykKK3sKKyAgICBpZiAoZXhwaXJlcyAhPSByZWdjLT5leHBpcmVzKSB7CisJcmVnYy0+ZXhwaXJlc19oZHIgPSBwanNpcF9leHBpcmVzX2hkcl9jcmVhdGUocmVnYy0+cG9vbCwgZXhwaXJlcyk7CisgICAgfSBlbHNlIHsKKwlyZWdjLT5leHBpcmVzX2hkciA9IE5VTEw7CisgICAgfQorfQorCisKK3N0YXRpYyBwal9zdGF0dXNfdCBzZXRfY29udGFjdCggcGpzaXBfcmVnYyAqcmVnYywKKwkJCSAgICAgICAgaW50IGNvbnRhY3RfY250LAorCQkJCWNvbnN0IHBqX3N0cl90IGNvbnRhY3RbXSApCit7CisgICAgY29uc3QgcGpfc3RyX3QgQ09OVEFDVCA9IHsgIkNvbnRhY3QiLCA3IH07CisgICAgcGpzaXBfY29udGFjdF9oZHIgKmg7CisgICAgaW50IGk7CisgICAgCisgICAgLyogU2F2ZSBleGlzdGluZyBjb250YWN0IGxpc3QgdG8gcmVtb3ZlZF9jb250YWN0X2hkcl9saXN0IGFuZAorICAgICAqIGNsZWFyIGNvbnRhY3RfaGRyX2xpc3QuCisgICAgICovCisgICAgcGpfbGlzdF9tZXJnZV9sYXN0KCZyZWdjLT5yZW1vdmVkX2NvbnRhY3RfaGRyX2xpc3QsIAorCQkgICAgICAgJnJlZ2MtPmNvbnRhY3RfaGRyX2xpc3QpOworCisgICAgLyogU2V0IHRoZSBleHBpcmF0aW9uIG9mIENvbnRhY3RzIGluIHRvIHJlbW92ZWRfY29udGFjdF9oZHJfbGlzdCAKKyAgICAgKiB6ZXJvLgorICAgICAqLworICAgIGggPSByZWdjLT5yZW1vdmVkX2NvbnRhY3RfaGRyX2xpc3QubmV4dDsKKyAgICB3aGlsZSAoaCAhPSAmcmVnYy0+cmVtb3ZlZF9jb250YWN0X2hkcl9saXN0KSB7CisJaC0+ZXhwaXJlcyA9IDA7CisJaCA9IGgtPm5leHQ7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBuZXcgY29udGFjdHMgKi8KKyAgICBmb3IgKGk9MDsgaTxjb250YWN0X2NudDsgKytpKSB7CisJcGpzaXBfY29udGFjdF9oZHIgKmhkcjsKKwlwal9zdHJfdCB0bXA7CisKKwlwal9zdHJkdXBfd2l0aF9udWxsKHJlZ2MtPnBvb2wsICZ0bXAsICZjb250YWN0W2ldKTsKKwloZHIgPSAocGpzaXBfY29udGFjdF9oZHIqKQorICAgICAgICAgICAgICBwanNpcF9wYXJzZV9oZHIocmVnYy0+cG9vbCwgJkNPTlRBQ1QsIHRtcC5wdHIsIHRtcC5zbGVuLCBOVUxMKTsKKwlpZiAoaGRyID09IE5VTEwpIHsKKwkgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgIkludmFsaWQgQ29udGFjdDogXCIlLipzXCIiLCAKKwkJICAgICAoaW50KXRtcC5zbGVuLCB0bXAucHRyKSk7CisJICAgIHJldHVybiBQSlNJUF9FSU5WQUxJRFVSSTsKKwl9CisKKwkvKiBGaW5kIHRoZSBuZXcgY29udGFjdCBpbiBvbGQgY29udGFjdCBsaXN0LiBJZiBmb3VuZCwgcmVtb3ZlCisJICogdGhlIG9sZCBoZWFkZXIgZnJvbSB0aGUgb2xkIGhlYWRlciBsaXN0LgorCSAqLworCWggPSByZWdjLT5yZW1vdmVkX2NvbnRhY3RfaGRyX2xpc3QubmV4dDsKKwl3aGlsZSAoaCAhPSAmcmVnYy0+cmVtb3ZlZF9jb250YWN0X2hkcl9saXN0KSB7CisJICAgIGludCByYzsKKworCSAgICByYyA9IHBqc2lwX3VyaV9jbXAoUEpTSVBfVVJJX0lOX0NPTlRBQ1RfSERSLCAKKwkJCSAgICAgICBoLT51cmksIGhkci0+dXJpKTsKKwkgICAgaWYgKHJjID09IDApIHsKKwkJLyogTWF0Y2ggKi8KKwkJcGpfbGlzdF9lcmFzZShoKTsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICBoID0gaC0+bmV4dDsKKwl9CisKKwkvKiBJZiBhZGRfeHVpZF9wYXJhbSBvcHRpb24gaXMgZW5hYmxlZCBhbmQgQ29udGFjdCBVUkkgaXMgc2lwL3NpcHMsCisJICogYWRkIHh1aWQgcGFyYW1ldGVyIHRvIGFzc2lzdCBtYXRjaGluZyB0aGUgQ29udGFjdCBVUkkgaW4gdGhlIAorCSAqIFJFR0lTVEVSIHJlc3BvbnNlIGxhdGVyLgorCSAqLworCWlmIChyZWdjLT5hZGRfeHVpZF9wYXJhbSAmJiAoUEpTSVBfVVJJX1NDSEVNRV9JU19TSVAoaGRyLT51cmkpIHx8CisJCQkJICAgICBQSlNJUF9VUklfU0NIRU1FX0lTX1NJUFMoaGRyLT51cmkpKSkgCisJeworCSAgICBwanNpcF9wYXJhbSAqeHVpZF9wYXJhbTsKKwkgICAgcGpzaXBfc2lwX3VyaSAqc2lwX3VyaTsKKworCSAgICB4dWlkX3BhcmFtID0gUEpfUE9PTF9aQUxMT0NfVChyZWdjLT5wb29sLCBwanNpcF9wYXJhbSk7CisJICAgIHh1aWRfcGFyYW0tPm5hbWUgPSBYVUlEX1BBUkFNX05BTUU7CisJICAgIHBqX2NyZWF0ZV91bmlxdWVfc3RyaW5nKHJlZ2MtPnBvb2wsICZ4dWlkX3BhcmFtLT52YWx1ZSk7CisKKwkgICAgc2lwX3VyaSA9IChwanNpcF9zaXBfdXJpKikgcGpzaXBfdXJpX2dldF91cmkoaGRyLT51cmkpOworCSAgICBwal9saXN0X3B1c2hfYmFjaygmc2lwX3VyaS0+b3RoZXJfcGFyYW0sIHh1aWRfcGFyYW0pOworCX0KKworCXBqX2xpc3RfcHVzaF9iYWNrKCZyZWdjLT5jb250YWN0X2hkcl9saXN0LCBoZHIpOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzaXBfcmVnY19pbml0KCBwanNpcF9yZWdjICpyZWdjLAorCQkJCSAgICAgY29uc3QgcGpfc3RyX3QgKnNydl91cmwsCisJCQkJICAgICBjb25zdCBwal9zdHJfdCAqZnJvbV91cmwsCisJCQkJICAgICBjb25zdCBwal9zdHJfdCAqdG9fdXJsLAorCQkJCSAgICAgaW50IGNvbnRhY3RfY250LAorCQkJCSAgICAgY29uc3QgcGpfc3RyX3QgY29udGFjdFtdLAorCQkJCSAgICAgcGpfdWludDMyX3QgZXhwaXJlcykKK3sKKyAgICBwal9zdHJfdCB0bXA7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihyZWdjICYmIHNydl91cmwgJiYgZnJvbV91cmwgJiYgdG9fdXJsICYmIAorCQkgICAgIGV4cGlyZXMsIFBKX0VJTlZBTCk7CisKKyAgICAvKiBDb3B5IHNlcnZlciBVUkwuICovCisgICAgcGpfc3RyZHVwX3dpdGhfbnVsbChyZWdjLT5wb29sLCAmcmVnYy0+c3RyX3Nydl91cmwsIHNydl91cmwpOworCisgICAgLyogU2V0IHNlcnZlciBVUkwuICovCisgICAgdG1wID0gcmVnYy0+c3RyX3Nydl91cmw7CisgICAgcmVnYy0+c3J2X3VybCA9IHBqc2lwX3BhcnNlX3VyaSggcmVnYy0+cG9vbCwgdG1wLnB0ciwgdG1wLnNsZW4sIDApOworICAgIGlmIChyZWdjLT5zcnZfdXJsID09IE5VTEwpIHsKKwlyZXR1cm4gUEpTSVBfRUlOVkFMSURVUkk7CisgICAgfQorCisgICAgLyogU2V0ICJGcm9tIiBoZWFkZXIuICovCisgICAgcGpfc3RyZHVwX3dpdGhfbnVsbChyZWdjLT5wb29sLCAmcmVnYy0+ZnJvbV91cmksIGZyb21fdXJsKTsKKyAgICB0bXAgPSByZWdjLT5mcm9tX3VyaTsKKyAgICByZWdjLT5mcm9tX2hkciA9IHBqc2lwX2Zyb21faGRyX2NyZWF0ZShyZWdjLT5wb29sKTsKKyAgICByZWdjLT5mcm9tX2hkci0+dXJpID0gcGpzaXBfcGFyc2VfdXJpKHJlZ2MtPnBvb2wsIHRtcC5wdHIsIHRtcC5zbGVuLCAKKwkJCQkJICBQSlNJUF9QQVJTRV9VUklfQVNfTkFNRUFERFIpOworICAgIGlmICghcmVnYy0+ZnJvbV9oZHItPnVyaSkgeworCVBKX0xPRyg0LChUSElTX0ZJTEUsICJyZWdjOiBpbnZhbGlkIHNvdXJjZSBVUkkgJS4qcyIsIAorCQkgIGZyb21fdXJsLT5zbGVuLCBmcm9tX3VybC0+cHRyKSk7CisJcmV0dXJuIFBKU0lQX0VJTlZBTElEVVJJOworICAgIH0KKworICAgIC8qIFNldCAiVG8iIGhlYWRlci4gKi8KKyAgICBwal9zdHJkdXBfd2l0aF9udWxsKHJlZ2MtPnBvb2wsICZ0bXAsIHRvX3VybCk7CisgICAgcmVnYy0+dG9faGRyID0gcGpzaXBfdG9faGRyX2NyZWF0ZShyZWdjLT5wb29sKTsKKyAgICByZWdjLT50b19oZHItPnVyaSA9IHBqc2lwX3BhcnNlX3VyaShyZWdjLT5wb29sLCB0bXAucHRyLCB0bXAuc2xlbiwgCisJCQkJCVBKU0lQX1BBUlNFX1VSSV9BU19OQU1FQUREUik7CisgICAgaWYgKCFyZWdjLT50b19oZHItPnVyaSkgeworCVBKX0xPRyg0LChUSElTX0ZJTEUsICJyZWdjOiBpbnZhbGlkIHRhcmdldCBVUkkgJS4qcyIsIHRvX3VybC0+c2xlbiwgdG9fdXJsLT5wdHIpKTsKKwlyZXR1cm4gUEpTSVBfRUlOVkFMSURVUkk7CisgICAgfQorCisKKyAgICAvKiBTZXQgIkNvbnRhY3QiIGhlYWRlci4gKi8KKyAgICBzdGF0dXMgPSBzZXRfY29udGFjdCggcmVnYywgY29udGFjdF9jbnQsIGNvbnRhY3QpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgLyogU2V0ICJFeHBpcmVzIiBoZWFkZXIsIGlmIHJlcXVpcmVkLiAqLworICAgIHNldF9leHBpcmVzKCByZWdjLCBleHBpcmVzKTsKKyAgICByZWdjLT5kZWxheV9iZWZvcmVfcmVmcmVzaCA9IERFTEFZX0JFRk9SRV9SRUZSRVNIOworCisgICAgLyogU2V0ICJDYWxsLUlEIiBoZWFkZXIuICovCisgICAgcmVnYy0+Y2lkX2hkciA9IHBqc2lwX2NpZF9oZHJfY3JlYXRlKHJlZ2MtPnBvb2wpOworICAgIHBqX2NyZWF0ZV91bmlxdWVfc3RyaW5nKHJlZ2MtPnBvb2wsICZyZWdjLT5jaWRfaGRyLT5pZCk7CisKKyAgICAvKiBTZXQgIkNTZXEiIGhlYWRlci4gKi8KKyAgICByZWdjLT5jc2VxX2hkciA9IHBqc2lwX2NzZXFfaGRyX2NyZWF0ZShyZWdjLT5wb29sKTsKKyAgICByZWdjLT5jc2VxX2hkci0+Y3NlcSA9IHBqX3JhbmQoKSAlIDB4RkZGRjsKKyAgICBwanNpcF9tZXRob2Rfc2V0KCAmcmVnYy0+Y3NlcV9oZHItPm1ldGhvZCwgUEpTSVBfUkVHSVNURVJfTUVUSE9EKTsKKworICAgIC8qIERvbmUuICovCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzaXBfcmVnY19zZXRfY3JlZGVudGlhbHMoIHBqc2lwX3JlZ2MgKnJlZ2MsCisJCQkJCQlpbnQgY291bnQsCisJCQkJCQljb25zdCBwanNpcF9jcmVkX2luZm8gY3JlZFtdICkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHJlZ2MgJiYgY291bnQgJiYgY3JlZCwgUEpfRUlOVkFMKTsKKyAgICByZXR1cm4gcGpzaXBfYXV0aF9jbHRfc2V0X2NyZWRlbnRpYWxzKCZyZWdjLT5hdXRoX3Nlc3MsIGNvdW50LCBjcmVkKTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwanNpcF9yZWdjX3NldF9wcmVmcyggcGpzaXBfcmVnYyAqcmVnYywKKwkJCQkJICBjb25zdCBwanNpcF9hdXRoX2NsdF9wcmVmICpwcmVmKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4ocmVnYyAmJiBwcmVmLCBQSl9FSU5WQUwpOworICAgIHJldHVybiBwanNpcF9hdXRoX2NsdF9zZXRfcHJlZnMoJnJlZ2MtPmF1dGhfc2VzcywgcHJlZik7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzaXBfcmVnY19zZXRfcm91dGVfc2V0KCBwanNpcF9yZWdjICpyZWdjLAorCQkJCQkgICAgICBjb25zdCBwanNpcF9yb3V0ZV9oZHIgKnJvdXRlX3NldCkKK3sKKyAgICBjb25zdCBwanNpcF9yb3V0ZV9oZHIgKmNoZHI7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHJlZ2MgJiYgcm91dGVfc2V0LCBQSl9FSU5WQUwpOworCisgICAgcGpfbGlzdF9pbml0KCZyZWdjLT5yb3V0ZV9zZXQpOworCisgICAgY2hkciA9IHJvdXRlX3NldC0+bmV4dDsKKyAgICB3aGlsZSAoY2hkciAhPSByb3V0ZV9zZXQpIHsKKwlwal9saXN0X3B1c2hfYmFjaygmcmVnYy0+cm91dGVfc2V0LCBwanNpcF9oZHJfY2xvbmUocmVnYy0+cG9vbCwgY2hkcikpOworCWNoZHIgPSBjaGRyLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBCaW5kIGNsaWVudCByZWdpc3RyYXRpb24gdG8gYSBzcGVjaWZpYyB0cmFuc3BvcnQvbGlzdGVuZXIuIAorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc2lwX3JlZ2Nfc2V0X3RyYW5zcG9ydCggcGpzaXBfcmVnYyAqcmVnYywKKwkJCQkJICAgICAgY29uc3QgcGpzaXBfdHBzZWxlY3RvciAqc2VsKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4ocmVnYyAmJiBzZWwsIFBKX0VJTlZBTCk7CisKKyAgICBwanNpcF90cHNlbGVjdG9yX2RlY19yZWYoJnJlZ2MtPnRwX3NlbCk7CisgICAgcGpfbWVtY3B5KCZyZWdjLT50cF9zZWwsIHNlbCwgc2l6ZW9mKCpzZWwpKTsKKyAgICBwanNpcF90cHNlbGVjdG9yX2FkZF9yZWYoJnJlZ2MtPnRwX3NlbCk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogUmVsZWFzZSB0cmFuc3BvcnQgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzaXBfcmVnY19yZWxlYXNlX3RyYW5zcG9ydChwanNpcF9yZWdjICpyZWdjKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4ocmVnYywgUEpfRUlOVkFMKTsKKyAgICBpZiAocmVnYy0+bGFzdF90cmFuc3BvcnQpIHsKKwlwanNpcF90cmFuc3BvcnRfZGVjX3JlZihyZWdjLT5sYXN0X3RyYW5zcG9ydCk7CisJcmVnYy0+bGFzdF90cmFuc3BvcnQgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc2lwX3JlZ2NfYWRkX2hlYWRlcnMoIHBqc2lwX3JlZ2MgKnJlZ2MsCisJCQkJCSAgICBjb25zdCBwanNpcF9oZHIgKmhkcl9saXN0KQoreworICAgIGNvbnN0IHBqc2lwX2hkciAqaGRyOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihyZWdjICYmIGhkcl9saXN0LCBQSl9FSU5WQUwpOworCisgICAgLy9UaGlzIGlzICJhZGQiIG9wZXJhdGlvbiwgc28gZG9uJ3QgcmVtb3ZlIGhlYWRlcnMuCisgICAgLy9wal9saXN0X2luaXQoJnJlZ2MtPmhkcl9saXN0KTsKKworICAgIGhkciA9IGhkcl9saXN0LT5uZXh0OworICAgIHdoaWxlIChoZHIgIT0gaGRyX2xpc3QpIHsKKwlwal9saXN0X3B1c2hfYmFjaygmcmVnYy0+aGRyX2xpc3QsIHBqc2lwX2hkcl9jbG9uZShyZWdjLT5wb29sLCBoZHIpKTsKKwloZHIgPSBoZHItPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjcmVhdGVfcmVxdWVzdChwanNpcF9yZWdjICpyZWdjLCAKKwkJCQkgIHBqc2lwX3R4X2RhdGEgKipwX3RkYXRhKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBwanNpcF90eF9kYXRhICp0ZGF0YTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocmVnYyAmJiBwX3RkYXRhLCBQSl9FSU5WQUwpOworCisgICAgLyogQ3JlYXRlIHRoZSByZXF1ZXN0LiAqLworICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X2NyZWF0ZV9yZXF1ZXN0X2Zyb21faGRyKCByZWdjLT5lbmRwdCwgCisJCQkJCQkgIHBqc2lwX2dldF9yZWdpc3Rlcl9tZXRob2QoKSwKKwkJCQkJCSAgcmVnYy0+c3J2X3VybCwKKwkJCQkJCSAgcmVnYy0+ZnJvbV9oZHIsCisJCQkJCQkgIHJlZ2MtPnRvX2hkciwKKwkJCQkJCSAgTlVMTCwKKwkJCQkJCSAgcmVnYy0+Y2lkX2hkciwKKwkJCQkJCSAgcmVnYy0+Y3NlcV9oZHItPmNzZXEsCisJCQkJCQkgIE5VTEwsCisJCQkJCQkgICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICAvKiBBZGQgY2FjaGVkIGF1dGhvcml6YXRpb24gaGVhZGVycy4gKi8KKyAgICBwanNpcF9hdXRoX2NsdF9pbml0X3JlcSggJnJlZ2MtPmF1dGhfc2VzcywgdGRhdGEgKTsKKworICAgIC8qIEFkZCBSb3V0ZSBoZWFkZXJzIGZyb20gcm91dGUgc2V0LCBpZGVhbGx5IGFmdGVyIFZpYSBoZWFkZXIgKi8KKyAgICBpZiAoIXBqX2xpc3RfZW1wdHkoJnJlZ2MtPnJvdXRlX3NldCkpIHsKKwlwanNpcF9oZHIgKnJvdXRlX3BvczsKKwljb25zdCBwanNpcF9yb3V0ZV9oZHIgKnJvdXRlOworCisJcm91dGVfcG9zID0gKHBqc2lwX2hkciopCisJCSAgICBwanNpcF9tc2dfZmluZF9oZHIodGRhdGEtPm1zZywgUEpTSVBfSF9WSUEsIE5VTEwpOworCWlmICghcm91dGVfcG9zKQorCSAgICByb3V0ZV9wb3MgPSAmdGRhdGEtPm1zZy0+aGRyOworCisJcm91dGUgPSByZWdjLT5yb3V0ZV9zZXQubmV4dDsKKwl3aGlsZSAocm91dGUgIT0gJnJlZ2MtPnJvdXRlX3NldCkgeworCSAgICBwanNpcF9oZHIgKm5ld19oZHIgPSAocGpzaXBfaGRyKikKKwkJCQkgcGpzaXBfaGRyX3NoYWxsb3dfY2xvbmUodGRhdGEtPnBvb2wsIHJvdXRlKTsKKwkgICAgcGpfbGlzdF9pbnNlcnRfYWZ0ZXIocm91dGVfcG9zLCBuZXdfaGRyKTsKKwkgICAgcm91dGVfcG9zID0gbmV3X2hkcjsKKwkgICAgcm91dGUgPSByb3V0ZS0+bmV4dDsKKwl9CisgICAgfQorCisgICAgLyogQWRkIGFkZGl0aW9uYWwgcmVxdWVzdCBoZWFkZXJzICovCisgICAgaWYgKCFwal9saXN0X2VtcHR5KCZyZWdjLT5oZHJfbGlzdCkpIHsKKwljb25zdCBwanNpcF9oZHIgKmhkcjsKKworCWhkciA9IHJlZ2MtPmhkcl9saXN0Lm5leHQ7CisJd2hpbGUgKGhkciAhPSAmcmVnYy0+aGRyX2xpc3QpIHsKKwkgICAgcGpzaXBfaGRyICpuZXdfaGRyID0gKHBqc2lwX2hkciopCisJCQkJIHBqc2lwX2hkcl9zaGFsbG93X2Nsb25lKHRkYXRhLT5wb29sLCBoZHIpOworCSAgICBwanNpcF9tc2dfYWRkX2hkcih0ZGF0YS0+bXNnLCBuZXdfaGRyKTsKKwkgICAgaGRyID0gaGRyLT5uZXh0OworCX0KKyAgICB9CisKKyAgICAvKiBEb25lLiAqLworICAgICpwX3RkYXRhID0gdGRhdGE7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwanNpcF9yZWdjX3JlZ2lzdGVyKHBqc2lwX3JlZ2MgKnJlZ2MsIHBqX2Jvb2xfdCBhdXRvcmVnLAorCQkJCQlwanNpcF90eF9kYXRhICoqcF90ZGF0YSkKK3sKKyAgICBwanNpcF9tc2cgKm1zZzsKKyAgICBwanNpcF9jb250YWN0X2hkciAqaGRyOworICAgIGNvbnN0IHBqc2lwX2hkciAqaF9hbGxvdzsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgcGpzaXBfdHhfZGF0YSAqdGRhdGE7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHJlZ2MgJiYgcF90ZGF0YSwgUEpfRUlOVkFMKTsKKworICAgIHBqX2xvY2tfYWNxdWlyZShyZWdjLT5sb2NrKTsKKworICAgIHN0YXR1cyA9IGNyZWF0ZV9yZXF1ZXN0KHJlZ2MsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfbG9ja19yZWxlYXNlKHJlZ2MtPmxvY2spOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgbXNnID0gdGRhdGEtPm1zZzsKKworICAgIC8qIEFkZCBDb250YWN0IGhlYWRlcnMuICovCisgICAgaGRyID0gcmVnYy0+Y29udGFjdF9oZHJfbGlzdC5uZXh0OworICAgIHdoaWxlIChoZHIgIT0gJnJlZ2MtPmNvbnRhY3RfaGRyX2xpc3QpIHsKKwlwanNpcF9tc2dfYWRkX2hkcihtc2csIChwanNpcF9oZHIqKQorCQkJICAgICAgIHBqc2lwX2hkcl9zaGFsbG93X2Nsb25lKHRkYXRhLT5wb29sLCBoZHIpKTsKKwloZHIgPSBoZHItPm5leHQ7CisgICAgfQorCisgICAgLyogQWxzbyBhZGQgYmluZGluZ3Mgd2hpY2ggYXJlIHRvIGJlIHJlbW92ZWQgKi8KKyAgICB3aGlsZSAoIXBqX2xpc3RfZW1wdHkoJnJlZ2MtPnJlbW92ZWRfY29udGFjdF9oZHJfbGlzdCkpIHsKKwloZHIgPSByZWdjLT5yZW1vdmVkX2NvbnRhY3RfaGRyX2xpc3QubmV4dDsKKwlwanNpcF9tc2dfYWRkX2hkcihtc2csIChwanNpcF9oZHIqKQorCQkJICAgICAgIHBqc2lwX2hkcl9jbG9uZSh0ZGF0YS0+cG9vbCwgaGRyKSk7CisJcGpfbGlzdF9lcmFzZShoZHIpOworICAgIH0KKyAgICAKKworICAgIGlmIChyZWdjLT5leHBpcmVzX2hkcikKKwlwanNpcF9tc2dfYWRkX2hkcihtc2csIChwanNpcF9oZHIqKQorCQkJICAgICAgIHBqc2lwX2hkcl9zaGFsbG93X2Nsb25lKHRkYXRhLT5wb29sLAorCQkJCQkJICAgICAgIHJlZ2MtPmV4cGlyZXNfaGRyKSk7CisKKyAgICBpZiAocmVnYy0+dGltZXIuaWQgIT0gMCkgeworCXBqc2lwX2VuZHB0X2NhbmNlbF90aW1lcihyZWdjLT5lbmRwdCwgJnJlZ2MtPnRpbWVyKTsKKwlyZWdjLT50aW1lci5pZCA9IDA7CisgICAgfQorCisgICAgLyogQWRkIEFsbG93IGhlYWRlciAoaHR0cDovL3RyYWMucGpzaXAub3JnL3JlcG9zL3RpY2tldC8xMDM5KSAqLworICAgIGhfYWxsb3cgPSBwanNpcF9lbmRwdF9nZXRfY2FwYWJpbGl0eShyZWdjLT5lbmRwdCwgUEpTSVBfSF9BTExPVywgTlVMTCk7CisgICAgaWYgKGhfYWxsb3cpIHsKKwlwanNpcF9tc2dfYWRkX2hkcihtc2csIChwanNpcF9oZHIqKQorCQkJICAgICAgIHBqc2lwX2hkcl9zaGFsbG93X2Nsb25lKHRkYXRhLT5wb29sLCBoX2FsbG93KSk7CisKKyAgICB9CisKKyAgICByZWdjLT5hdXRvX3JlZyA9IGF1dG9yZWc7CisKKyAgICBwal9sb2NrX3JlbGVhc2UocmVnYy0+bG9jayk7CisKKyAgICAvKiBEb25lICovCisgICAgKnBfdGRhdGEgPSB0ZGF0YTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc2lwX3JlZ2NfdW5yZWdpc3RlcihwanNpcF9yZWdjICpyZWdjLAorCQkJCQkgIHBqc2lwX3R4X2RhdGEgKipwX3RkYXRhKQoreworICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhOworICAgIHBqc2lwX21zZyAqbXNnOworICAgIHBqc2lwX2hkciAqaGRyOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocmVnYyAmJiBwX3RkYXRhLCBQSl9FSU5WQUwpOworCisgICAgcGpfbG9ja19hY3F1aXJlKHJlZ2MtPmxvY2spOworCisgICAgaWYgKHJlZ2MtPnRpbWVyLmlkICE9IDApIHsKKwlwanNpcF9lbmRwdF9jYW5jZWxfdGltZXIocmVnYy0+ZW5kcHQsICZyZWdjLT50aW1lcik7CisJcmVnYy0+dGltZXIuaWQgPSAwOworICAgIH0KKworICAgIHN0YXR1cyA9IGNyZWF0ZV9yZXF1ZXN0KHJlZ2MsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfbG9ja19yZWxlYXNlKHJlZ2MtPmxvY2spOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgbXNnID0gdGRhdGEtPm1zZzsKKworICAgIC8qIEFkZCBDb250YWN0IGhlYWRlcnMuICovCisgICAgaGRyID0gKHBqc2lwX2hkciopcmVnYy0+Y29udGFjdF9oZHJfbGlzdC5uZXh0OworICAgIHdoaWxlICgodm9pZCopaGRyICE9ICh2b2lkKikmcmVnYy0+Y29udGFjdF9oZHJfbGlzdCkgeworCXBqc2lwX21zZ19hZGRfaGRyKG1zZywgKHBqc2lwX2hkciopCisJCQkgICAgICAgcGpzaXBfaGRyX3NoYWxsb3dfY2xvbmUodGRhdGEtPnBvb2wsIGhkcikpOworCWhkciA9IGhkci0+bmV4dDsKKyAgICB9CisKKyAgICAvKiBBbHNvIGFkZCBiaW5kaW5ncyB3aGljaCBhcmUgdG8gYmUgcmVtb3ZlZCAqLworICAgIHdoaWxlICghcGpfbGlzdF9lbXB0eSgmcmVnYy0+cmVtb3ZlZF9jb250YWN0X2hkcl9saXN0KSkgeworCWhkciA9IChwanNpcF9oZHIqKXJlZ2MtPnJlbW92ZWRfY29udGFjdF9oZHJfbGlzdC5uZXh0OworCXBqc2lwX21zZ19hZGRfaGRyKG1zZywgKHBqc2lwX2hkciopCisJCQkgICAgICAgcGpzaXBfaGRyX2Nsb25lKHRkYXRhLT5wb29sLCBoZHIpKTsKKwlwal9saXN0X2VyYXNlKGhkcik7CisgICAgfQorCisgICAgLyogQWRkIEV4cGlyZXM6MCBoZWFkZXIgKi8KKyAgICBoZHIgPSAocGpzaXBfaGRyKikgcGpzaXBfZXhwaXJlc19oZHJfY3JlYXRlKHRkYXRhLT5wb29sLCAwKTsKKyAgICBwanNpcF9tc2dfYWRkX2hkcihtc2csIGhkcik7CisKKyAgICBwal9sb2NrX3JlbGVhc2UocmVnYy0+bG9jayk7CisKKyAgICAqcF90ZGF0YSA9IHRkYXRhOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc2lwX3JlZ2NfdW5yZWdpc3Rlcl9hbGwocGpzaXBfcmVnYyAqcmVnYywKKwkJCQkJICAgICAgcGpzaXBfdHhfZGF0YSAqKnBfdGRhdGEpCit7CisgICAgcGpzaXBfdHhfZGF0YSAqdGRhdGE7CisgICAgcGpzaXBfY29udGFjdF9oZHIgKmhjb250YWN0OworICAgIHBqc2lwX2hkciAqaGRyOworICAgIHBqc2lwX21zZyAqbXNnOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocmVnYyAmJiBwX3RkYXRhLCBQSl9FSU5WQUwpOworCisgICAgcGpfbG9ja19hY3F1aXJlKHJlZ2MtPmxvY2spOworCisgICAgaWYgKHJlZ2MtPnRpbWVyLmlkICE9IDApIHsKKwlwanNpcF9lbmRwdF9jYW5jZWxfdGltZXIocmVnYy0+ZW5kcHQsICZyZWdjLT50aW1lcik7CisJcmVnYy0+dGltZXIuaWQgPSAwOworICAgIH0KKworICAgIHN0YXR1cyA9IGNyZWF0ZV9yZXF1ZXN0KHJlZ2MsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfbG9ja19yZWxlYXNlKHJlZ2MtPmxvY2spOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgbXNnID0gdGRhdGEtPm1zZzsKKworICAgIC8qIENsZWFyIHJlbW92ZWRfY29udGFjdF9oZHJfbGlzdCAqLworICAgIHBqX2xpc3RfaW5pdCgmcmVnYy0+cmVtb3ZlZF9jb250YWN0X2hkcl9saXN0KTsKKworICAgIC8qIEFkZCBDb250YWN0OiogaGVhZGVyICovCisgICAgaGNvbnRhY3QgPSBwanNpcF9jb250YWN0X2hkcl9jcmVhdGUodGRhdGEtPnBvb2wpOworICAgIGhjb250YWN0LT5zdGFyID0gMTsKKyAgICBwanNpcF9tc2dfYWRkX2hkcihtc2csIChwanNpcF9oZHIqKWhjb250YWN0KTsKKyAgICAKKyAgICAvKiBBZGQgRXhwaXJlczowIGhlYWRlciAqLworICAgIGhkciA9IChwanNpcF9oZHIqKSBwanNpcF9leHBpcmVzX2hkcl9jcmVhdGUodGRhdGEtPnBvb2wsIDApOworICAgIHBqc2lwX21zZ19hZGRfaGRyKG1zZywgaGRyKTsKKworICAgIHBqX2xvY2tfcmVsZWFzZShyZWdjLT5sb2NrKTsKKworICAgICpwX3RkYXRhID0gdGRhdGE7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwanNpcF9yZWdjX3VwZGF0ZV9jb250YWN0KCAgcGpzaXBfcmVnYyAqcmVnYywKKwkJCQkJICAgICAgICBpbnQgY29udGFjdF9jbnQsCisJCQkJCQljb25zdCBwal9zdHJfdCBjb250YWN0W10gKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocmVnYywgUEpfRUlOVkFMKTsKKworICAgIHBqX2xvY2tfYWNxdWlyZShyZWdjLT5sb2NrKTsKKyAgICBzdGF0dXMgPSBzZXRfY29udGFjdCggcmVnYywgY29udGFjdF9jbnQsIGNvbnRhY3QgKTsKKyAgICBwal9sb2NrX3JlbGVhc2UocmVnYy0+bG9jayk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzaXBfcmVnY191cGRhdGVfZXhwaXJlcyggIHBqc2lwX3JlZ2MgKnJlZ2MsCisJCQkJCSAgICAgICAgcGpfdWludDMyX3QgZXhwaXJlcyApCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihyZWdjLCBQSl9FSU5WQUwpOworCisgICAgcGpfbG9ja19hY3F1aXJlKHJlZ2MtPmxvY2spOworICAgIHNldF9leHBpcmVzKCByZWdjLCBleHBpcmVzICk7CisgICAgcGpfbG9ja19yZWxlYXNlKHJlZ2MtPmxvY2spOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGNicGFyYW1faW5pdCggc3RydWN0IHBqc2lwX3JlZ2NfY2JwYXJhbSAqY2JwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGpzaXBfcmVnYyAqcmVnYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3N0YXR1c190IHN0YXR1cywgaW50IHN0X2NvZGUsIAorCQkJICBjb25zdCBwal9zdHJfdCAqcmVhc29uLAorCQkJICBwanNpcF9yeF9kYXRhICpyZGF0YSwgcGpfaW50MzJfdCBleHBpcmF0aW9uLAorCQkJICBpbnQgY29udGFjdF9jbnQsIHBqc2lwX2NvbnRhY3RfaGRyICpjb250YWN0W10pCit7CisgICAgY2JwYXJhbS0+cmVnYyA9IHJlZ2M7CisgICAgY2JwYXJhbS0+dG9rZW4gPSByZWdjLT50b2tlbjsKKyAgICBjYnBhcmFtLT5zdGF0dXMgPSBzdGF0dXM7CisgICAgY2JwYXJhbS0+Y29kZSA9IHN0X2NvZGU7CisgICAgY2JwYXJhbS0+cmVhc29uID0gKnJlYXNvbjsKKyAgICBjYnBhcmFtLT5yZGF0YSA9IHJkYXRhOworICAgIGNicGFyYW0tPmNvbnRhY3RfY250ID0gY29udGFjdF9jbnQ7CisgICAgY2JwYXJhbS0+ZXhwaXJhdGlvbiA9IGV4cGlyYXRpb247CisgICAgaWYgKGNvbnRhY3RfY250KSB7CisJcGpfbWVtY3B5KCBjYnBhcmFtLT5jb250YWN0LCBjb250YWN0LCAKKwkJICAgY29udGFjdF9jbnQqc2l6ZW9mKHBqc2lwX2NvbnRhY3RfaGRyKikpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2FsbF9jYWxsYmFjayhwanNpcF9yZWdjICpyZWdjLCBwal9zdGF0dXNfdCBzdGF0dXMsIGludCBzdF9jb2RlLCAKKwkJCSAgY29uc3QgcGpfc3RyX3QgKnJlYXNvbiwKKwkJCSAgcGpzaXBfcnhfZGF0YSAqcmRhdGEsIHBqX2ludDMyX3QgZXhwaXJhdGlvbiwKKwkJCSAgaW50IGNvbnRhY3RfY250LCBwanNpcF9jb250YWN0X2hkciAqY29udGFjdFtdKQoreworICAgIHN0cnVjdCBwanNpcF9yZWdjX2NicGFyYW0gY2JwYXJhbTsKKworICAgIGlmICghcmVnYy0+Y2IpCisJcmV0dXJuOworCisgICAgY2JwYXJhbV9pbml0KCZjYnBhcmFtLCByZWdjLCBzdGF0dXMsIHN0X2NvZGUsIHJlYXNvbiwgcmRhdGEsIGV4cGlyYXRpb24sCisgICAgICAgICAgICAgICAgIGNvbnRhY3RfY250LCBjb250YWN0KTsKKyAgICAoKnJlZ2MtPmNiKSgmY2JwYXJhbSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlZ2NfcmVmcmVzaF90aW1lcl9jYiggcGpfdGltZXJfaGVhcF90ICp0aW1lcl9oZWFwLAorCQkJCSAgIHN0cnVjdCBwal90aW1lcl9lbnRyeSAqZW50cnkpCit7CisgICAgcGpzaXBfcmVnYyAqcmVnYyA9IChwanNpcF9yZWdjKikgZW50cnktPnVzZXJfZGF0YTsKKyAgICBwanNpcF90eF9kYXRhICp0ZGF0YTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCisgICAgUEpfVU5VU0VEX0FSRyh0aW1lcl9oZWFwKTsKKworICAgIC8qIFRlbXBvcmFyaWx5IGluY3JlYXNlIGJ1c3kgZmxhZyB0byBwcmV2ZW50IHJlZ2MgZnJvbSBiZWluZyBkZWxldGVkCisgICAgICogaW4gcGpzaXBfcmVnY19zZW5kKCkgb3IgaW4gdGhlIGNhbGxiYWNrCisgICAgICovCisgICAgcGpfYXRvbWljX2luYyhyZWdjLT5idXN5X2N0cik7CisKKyAgICBlbnRyeS0+aWQgPSAwOworICAgIHN0YXR1cyA9IHBqc2lwX3JlZ2NfcmVnaXN0ZXIocmVnYywgMSwgJnRkYXRhKTsKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwlzdGF0dXMgPSBwanNpcF9yZWdjX3NlbmQocmVnYywgdGRhdGEpOworICAgIH0gCisgICAgCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTICYmIHJlZ2MtPmNiKSB7CisJY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKwlwal9zdHJfdCByZWFzb24gPSBwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworCWNhbGxfY2FsbGJhY2socmVnYywgc3RhdHVzLCA0MDAsICZyZWFzb24sIE5VTEwsIC0xLCAwLCBOVUxMKTsKKyAgICB9CisKKyAgICAvKiBEZWxldGUgdGhlIHJlY29yZCBpZiB1c2VyIGRlc3Ryb3kgcmVnYyBkdXJpbmcgdGhlIGNhbGxiYWNrLiAqLworICAgIGlmIChwal9hdG9taWNfZGVjX2FuZF9nZXQocmVnYy0+YnVzeV9jdHIpPT0wICYmIHJlZ2MtPl9kZWxldGVfZmxhZykgeworCXBqc2lwX3JlZ2NfZGVzdHJveShyZWdjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3JlZ2lzdHJhdGlvbiAoIHBqc2lwX3JlZ2MgKnJlZ2MsIHBqX2ludDMyX3QgZXhwaXJhdGlvbiApCit7CisgICAgaWYgKHJlZ2MtPmF1dG9fcmVnICYmIGV4cGlyYXRpb24gPiAwKSB7CisgICAgICAgIHBqX3RpbWVfdmFsIGRlbGF5ID0geyAwLCAwfTsKKworICAgICAgICBwal90aW1lcl9oZWFwX2NhbmNlbF9pZl9hY3RpdmUocGpzaXBfZW5kcHRfZ2V0X3RpbWVyX2hlYXAocmVnYy0+ZW5kcHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2MtPnRpbWVyLCAwKTsKKworICAgICAgICBkZWxheS5zZWMgPSBleHBpcmF0aW9uIC0gcmVnYy0+ZGVsYXlfYmVmb3JlX3JlZnJlc2g7CisgICAgICAgIGlmIChyZWdjLT5leHBpcmVzICE9IFBKU0lQX1JFR0NfRVhQSVJBVElPTl9OT1RfU1BFQ0lGSUVEICYmIAorICAgICAgICAgICAgZGVsYXkuc2VjID4gKHBqX2ludDMyX3QpcmVnYy0+ZXhwaXJlcykgCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbGF5LnNlYyA9IHJlZ2MtPmV4cGlyZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlbGF5LnNlYyA8IERFTEFZX0JFRk9SRV9SRUZSRVNIKSAKKyAgICAgICAgICAgIGRlbGF5LnNlYyA9IERFTEFZX0JFRk9SRV9SRUZSRVNIOworICAgICAgICByZWdjLT50aW1lci5jYiA9ICZyZWdjX3JlZnJlc2hfdGltZXJfY2I7CisgICAgICAgIHJlZ2MtPnRpbWVyLmlkID0gUkVGUkVTSF9USU1FUjsKKyAgICAgICAgcmVnYy0+dGltZXIudXNlcl9kYXRhID0gcmVnYzsKKyAgICAgICAgcGpzaXBfZW5kcHRfc2NoZWR1bGVfdGltZXIoIHJlZ2MtPmVuZHB0LCAmcmVnYy0+dGltZXIsICZkZWxheSk7CisgICAgICAgIHBqX2dldHRpbWVvZmRheSgmcmVnYy0+bGFzdF9yZWcpOworICAgICAgICByZWdjLT5uZXh0X3JlZyA9IHJlZ2MtPmxhc3RfcmVnOworICAgICAgICByZWdjLT5uZXh0X3JlZy5zZWMgKz0gZGVsYXkuc2VjOworICAgIH0KK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwanNpcF9yZWdjX3NldF9yZWdfdHN4X2NiKCBwanNpcF9yZWdjICpyZWdjLAorCQkJCSAgICAgICAgICAgICAgIHBqc2lwX3JlZ2NfdHN4X2NiICp0c3hfY2IpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihyZWdjLCBQSl9FSU5WQUwpOworICAgIHJlZ2MtPnRzeF9jYiA9IHRzeF9jYjsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc2lwX3JlZ2Nfc2V0X3ZpYV9zZW50X2J5KCBwanNpcF9yZWdjICpyZWdjLAorCQkJCSAgICAgICAgICAgICAgICBwanNpcF9ob3N0X3BvcnQgKnZpYV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpzaXBfdHJhbnNwb3J0ICp2aWFfdHApCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihyZWdjLCBQSl9FSU5WQUwpOworCisgICAgaWYgKCF2aWFfYWRkcikKKyAgICAgICAgcGpfYnplcm8oJnJlZ2MtPnZpYV9hZGRyLCBzaXplb2YocmVnYy0+dmlhX2FkZHIpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHBqX3N0cmNtcCgmcmVnYy0+dmlhX2FkZHIuaG9zdCwgJnZpYV9hZGRyLT5ob3N0KSkKKyAgICAgICAgICAgIHBqX3N0cmR1cChyZWdjLT5wb29sLCAmcmVnYy0+dmlhX2FkZHIuaG9zdCwgJnZpYV9hZGRyLT5ob3N0KTsKKyAgICAgICAgcmVnYy0+dmlhX2FkZHIucG9ydCA9IHZpYV9hZGRyLT5wb3J0OworICAgIH0KKyAgICByZWdjLT52aWFfdHAgPSB2aWFfdHA7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KQorcGpzaXBfcmVnY19zZXRfZGVsYXlfYmVmb3JlX3JlZnJlc2goIHBqc2lwX3JlZ2MgKnJlZ2MsCisJCQkJICAgICBwal91aW50MzJfdCBkZWxheSApCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihyZWdjLCBQSl9FSU5WQUwpOworCisgICAgaWYgKGRlbGF5ID4gcmVnYy0+ZXhwaXJlcykKKyAgICAgICAgcmV0dXJuIFBKX0VUT09CSUc7CisKKyAgICBwal9sb2NrX2FjcXVpcmUocmVnYy0+bG9jayk7CisKKyAgICBpZiAocmVnYy0+ZGVsYXlfYmVmb3JlX3JlZnJlc2ggIT0gZGVsYXkpCisgICAgeworICAgICAgICByZWdjLT5kZWxheV9iZWZvcmVfcmVmcmVzaCA9IGRlbGF5OworCisgICAgICAgIGlmIChyZWdjLT50aW1lci5pZCAhPSAwKSB7CisgICAgICAgICAgICAvKiBDYW5jZWwgcmVnaXN0cmF0aW9uIHRpbWVyICovCisgICAgICAgICAgICBwanNpcF9lbmRwdF9jYW5jZWxfdGltZXIocmVnYy0+ZW5kcHQsICZyZWdjLT50aW1lcik7CisgICAgICAgICAgICByZWdjLT50aW1lci5pZCA9IDA7CisKKyAgICAgICAgICAgIC8qIFNjaGVkdWxlIG5leHQgcmVnaXN0cmF0aW9uICovCisgICAgICAgICAgICBzY2hlZHVsZV9yZWdpc3RyYXRpb24ocmVnYywgcmVnYy0+ZXhwaXJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwal9sb2NrX3JlbGVhc2UocmVnYy0+bG9jayk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgcGpfaW50MzJfdCBjYWxjdWxhdGVfcmVzcG9uc2VfZXhwaXJhdGlvbihjb25zdCBwanNpcF9yZWdjICpyZWdjLAorCQkJCQkgICAgICAgIGNvbnN0IHBqc2lwX3J4X2RhdGEgKnJkYXRhLAorCQkJCQkJdW5zaWduZWQgKmNvbnRhY3RfY250LAorCQkJCQkJdW5zaWduZWQgbWF4X2NvbnRhY3QsCisJCQkJCQlwanNpcF9jb250YWN0X2hkciAqY29udGFjdHNbXSkKK3sKKyAgICBwal9pbnQzMl90IGV4cGlyYXRpb24gPSBOT0VYUDsKKyAgICBjb25zdCBwanNpcF9tc2cgKm1zZyA9IHJkYXRhLT5tc2dfaW5mby5tc2c7CisgICAgY29uc3QgcGpzaXBfaGRyICpoZHI7CisKKyAgICAvKiBFbnVtZXJhdGUgYWxsIENvbnRhY3QgaGVhZGVycyBpbiB0aGUgcmVzcG9uc2UgKi8KKyAgICAqY29udGFjdF9jbnQgPSAwOworICAgIGZvciAoaGRyPW1zZy0+aGRyLm5leHQ7IGhkciE9Jm1zZy0+aGRyOyBoZHI9aGRyLT5uZXh0KSB7CisJaWYgKGhkci0+dHlwZSA9PSBQSlNJUF9IX0NPTlRBQ1QgJiYgCisJICAgICpjb250YWN0X2NudCA8IG1heF9jb250YWN0KSAKKwl7CisJICAgIGNvbnRhY3RzWypjb250YWN0X2NudF0gPSAocGpzaXBfY29udGFjdF9oZHIqKWhkcjsKKwkgICAgKysoKmNvbnRhY3RfY250KTsKKwl9CisgICAgfQorCisgICAgaWYgKHJlZ2MtPmN1cnJlbnRfb3AgPT0gUkVHQ19SRUdJU1RFUklORykgeworCXBqX2Jvb2xfdCBoYXNfb3VyX2NvbnRhY3QgPSBQSl9GQUxTRTsKKwljb25zdCBwanNpcF9leHBpcmVzX2hkciAqZXhwaXJlczsKKworCS8qIEdldCBFeHBpcmVzIGhlYWRlciAqLworCWV4cGlyZXMgPSAoY29uc3QgcGpzaXBfZXhwaXJlc19oZHIqKQorCQkgIHBqc2lwX21zZ19maW5kX2hkcihtc2csIFBKU0lQX0hfRVhQSVJFUywgTlVMTCk7CisKKwkvKiBUcnkgdG8gZmluZCB0aGUgQ29udGFjdCBVUklzIHRoYXQgd2UgcmVnaXN0ZXIsIGluIHRoZSByZXNwb25zZQorCSAqIHRvIGdldCB0aGUgZXhwaXJlcyB2YWx1ZS4gV2UnbGwgdHJ5IGJvdGggd2l0aCBjb21wYXJpbmcgdGhlIFVSSQorCSAqIGFuZCBjb21wYXJpbmcgdGhlIGV4dGVuc2lvbiBwYXJhbSBvbmx5LgorCSAqLworCWlmIChwanNpcF9jZmcoKS0+cmVnYy5jaGVja19jb250YWN0IHx8IHJlZ2MtPmFkZF94dWlkX3BhcmFtKSB7CisJICAgIHVuc2lnbmVkIGk7CisJICAgIGZvciAoaT0wOyBpPCpjb250YWN0X2NudDsgKytpKSB7CisJCWNvbnN0IHBqc2lwX2NvbnRhY3RfaGRyICpvdXJfaGRyOworCisJCW91cl9oZHIgPSAoY29uc3QgcGpzaXBfY29udGFjdF9oZHIqKSAKKwkJCSAgcmVnYy0+Y29udGFjdF9oZHJfbGlzdC5uZXh0OworCisJCS8qIE1hdGNoIHdpdGggb3VyIENvbnRhY3QgaGVhZGVyKHMpICovCisJCXdoaWxlICgodm9pZCopb3VyX2hkciAhPSAodm9pZCopJnJlZ2MtPmNvbnRhY3RfaGRyX2xpc3QpIHsKKworCQkgICAgY29uc3QgcGpzaXBfdXJpICp1cmkxLCAqdXJpMjsKKwkJICAgIHBqX2Jvb2xfdCBtYXRjaGVkID0gUEpfRkFMU0U7CisKKwkJICAgIC8qIEV4Y2x1ZGUgdGhlIGRpc3BsYXkgbmFtZSB3aGVuIGNvbXBhcmluZyB0aGUgVVJJIAorCQkgICAgICogc2luY2Ugc2VydmVyIG1heSBub3QgcmV0dXJuIGl0LgorCQkgICAgICovCisJCSAgICB1cmkxID0gKGNvbnN0IHBqc2lwX3VyaSopCisJCQkgICBwanNpcF91cmlfZ2V0X3VyaShjb250YWN0c1tpXS0+dXJpKTsKKwkJICAgIHVyaTIgPSAoY29uc3QgcGpzaXBfdXJpKikKKwkJCSAgIHBqc2lwX3VyaV9nZXRfdXJpKG91cl9oZHItPnVyaSk7CisKKwkJICAgIC8qIEZpcnN0IHRyeSB3aXRoIGV4YWN0IG1hdGNoaW5nLCBhY2NvcmRpbmcgdG8gUkZDIDMyNjEKKwkJICAgICAqIFNlY3Rpb24gMTkuMS40IFVSSSBDb21wYXJpc29uCisJCSAgICAgKi8KKwkJICAgIGlmIChwanNpcF9jZmcoKS0+cmVnYy5jaGVja19jb250YWN0KSB7CisJCQltYXRjaGVkID0gcGpzaXBfdXJpX2NtcChQSlNJUF9VUklfSU5fQ09OVEFDVF9IRFIsCisJCQkJCQl1cmkxLCB1cmkyKT09MDsKKwkJICAgIH0KKworCQkgICAgLyogSWYgbm8gbWF0Y2ggaXMgZm91bmQsIHRyeSB3aXRoIG1hdGNoaW5nIHRoZSBleHRlbnNpb24KKwkJICAgICAqIHBhcmFtZXRlciBvbmx5IGlmIGV4dGVuc2lvbiBwYXJhbWV0ZXIgd2FzIGFkZGVkLgorCQkgICAgICovCisJCSAgICBpZiAoIW1hdGNoZWQgJiYgcmVnYy0+YWRkX3h1aWRfcGFyYW0gJiYKKwkJCShQSlNJUF9VUklfU0NIRU1FX0lTX1NJUCh1cmkxKSB8fAorCQkJIFBKU0lQX1VSSV9TQ0hFTUVfSVNfU0lQUyh1cmkxKSkgJiYgCisJCQkoUEpTSVBfVVJJX1NDSEVNRV9JU19TSVAodXJpMikgfHwKKwkJCSBQSlNJUF9VUklfU0NIRU1FX0lTX1NJUFModXJpMikpKSAKKwkJICAgIHsKKwkJCWNvbnN0IHBqc2lwX3NpcF91cmkgKnNpcF91cmkxLCAqc2lwX3VyaTI7CisJCQljb25zdCBwanNpcF9wYXJhbSAqcDEsICpwMjsKKwkJCisJCQlzaXBfdXJpMSA9IChjb25zdCBwanNpcF9zaXBfdXJpKil1cmkxOworCQkJc2lwX3VyaTIgPSAoY29uc3QgcGpzaXBfc2lwX3VyaSopdXJpMjsKKworCQkJcDEgPSBwanNpcF9wYXJhbV9jZmluZCgmc2lwX3VyaTEtPm90aGVyX3BhcmFtLAorCQkJCQkgICAgICAgJlhVSURfUEFSQU1fTkFNRSk7CisJCQlwMiA9IHBqc2lwX3BhcmFtX2NmaW5kKCZzaXBfdXJpMi0+b3RoZXJfcGFyYW0sCisJCQkJCSAgICAgICAmWFVJRF9QQVJBTV9OQU1FKTsKKwkJCW1hdGNoZWQgPSBwMSAmJiBwMiAmJgorCQkJCSAgcGpfc3RyY21wKCZwMS0+dmFsdWUsICZwMi0+dmFsdWUpPT0wOworCisJCSAgICB9CisKKwkJICAgIGlmIChtYXRjaGVkKSB7CisJCQloYXNfb3VyX2NvbnRhY3QgPSBQSl9UUlVFOworCisJCQlpZiAoY29udGFjdHNbaV0tPmV4cGlyZXMgPj0gMCAmJiAKKwkJCSAgICBjb250YWN0c1tpXS0+ZXhwaXJlcyA8IGV4cGlyYXRpb24pIAorCQkJeworCQkJICAgIC8qIEdldCB0aGUgbG93ZXN0IGV4cGlyYXRpb24gdGltZS4gKi8KKwkJCSAgICBleHBpcmF0aW9uID0gY29udGFjdHNbaV0tPmV4cGlyZXM7CisJCQl9CisKKwkJCWJyZWFrOworCQkgICAgfQorCisJCSAgICBvdXJfaGRyID0gb3VyX2hkci0+bmV4dDsKKworCQl9IC8qIHdoaWxlICgodm9pZC4uICovCisKKwkgICAgfSAgLyogZm9yIChpPS4uICovCisKKwkgICAgLyogSWYgbWF0Y2hpbmcgQ29udGFjdCBoZWFkZXIocykgYXJlIGZvdW5kIGJ1dCB0aGUKKwkgICAgICogaGVhZGVyIGRvZXNuJ3QgY29udGFpbiBleHBpcmVzIHBhcmFtZXRlciwgZ2V0IHRoZQorCSAgICAgKiBleHBpcmF0aW9uIHZhbHVlIGZyb20gdGhlIEV4cGlyZXMgaGVhZGVyLiBBbmQKKwkgICAgICogaWYgRXhwaXJlcyBoZWFkZXIgaXMgbm90IHByZXNlbnQsIGdldCB0aGUgZXhwaXJhdGlvbgorCSAgICAgKiB2YWx1ZSBmcm9tIHRoZSByZXF1ZXN0LgorCSAgICAgKi8KKwkgICAgaWYgKGhhc19vdXJfY29udGFjdCAmJiBleHBpcmF0aW9uID09IE5PRVhQKSB7CisJCWlmIChleHBpcmVzKSB7CisJCSAgICBleHBpcmF0aW9uID0gZXhwaXJlcy0+aXZhbHVlOworCQl9IGVsc2UgaWYgKHJlZ2MtPmV4cGlyZXNfaGRyKSB7CisJCSAgICBleHBpcmF0aW9uID0gcmVnYy0+ZXhwaXJlc19oZHItPml2YWx1ZTsKKwkJfSBlbHNlIHsKKwkJICAgIC8qIFdlIGRpZG4ndCByZXF1ZXN0IGV4cGxpY2l0IGV4cGlyYXRpb24gdmFsdWUsCisJCSAgICAgKiBhbmQgc2VydmVyIGRvZXNuJ3Qgc3BlY2lmeSBpdCBlaXRoZXIuIFRoaXMgCisJCSAgICAgKiBzaG91bGRuJ3QgaGFwcGVuIHVubGVzcyB3ZSBoYXZlIGEgYnJva2VuCisJCSAgICAgKiByZWdpc3RyYXIuCisJCSAgICAgKi8KKwkJICAgIGV4cGlyYXRpb24gPSAzNjAwOworCQl9CisJICAgIH0KKworCX0KKworCS8qIElmIHdlIHN0aWxsIGNvdWxkbid0IGdldCBtYXRjaGluZyBDb250YWN0IGhlYWRlcihzKSwgaXQgbWVhbnMKKwkgKiB0aGVyZSBtdXN0IGJlIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSAgcmVnaXN0cmFyIChlLmcuIGl0IG1heQorCSAqIGhhdmUgbW9kaWZpZWQgdGhlIFVSSSdzIGluIHRoZSByZXNwb25zZSwgd2hpY2ggaXMgcHJvaGliaXRlZCkuCisJICovCisJaWYgKGV4cGlyYXRpb249PU5PRVhQKSB7CisJICAgIC8qIElmIHRoZSBudW1iZXIgb2YgQ29udGFjdCBoZWFkZXJzIGluIHRoZSByZXNwb25zZSBtYXRjaGVzIAorCSAgICAgKiBvdXJzLCB0aGV5J3JlIGFsbCBwcm9iYWJseSBvdXJzLiBHZXQgdGhlIGV4cGlyYXRpb24KKwkgICAgICogZnJvbSB0aGVyZSBpZiB0aGlzIGlzIHRoZSBjYXNlLCBvciBmcm9tIEV4cGlyZXMgaGVhZGVyCisJICAgICAqIGlmIHdlIGRvbid0IGhhdmUgZXhhY3QgQ29udGFjdCBoZWFkZXIgY291bnQsIG9yCisJICAgICAqIGZyb20gdGhlIHJlcXVlc3QgYXMgdGhlIGxhc3QgcmVzb3J0LgorCSAgICAgKi8KKwkgICAgcGpfc2l6ZV90IG91cl9jb250YWN0X2NudDsKKworCSAgICBvdXJfY29udGFjdF9jbnQgPSBwal9saXN0X3NpemUoJnJlZ2MtPmNvbnRhY3RfaGRyX2xpc3QpOworCisJICAgIGlmICgqY29udGFjdF9jbnQgPT0gb3VyX2NvbnRhY3RfY250ICYmICpjb250YWN0X2NudCAmJgorCQljb250YWN0c1swXS0+ZXhwaXJlcyA+PSAwKSAKKwkgICAgeworCQlleHBpcmF0aW9uID0gY29udGFjdHNbMF0tPmV4cGlyZXM7CisJICAgIH0gZWxzZSBpZiAoZXhwaXJlcykKKwkJZXhwaXJhdGlvbiA9IGV4cGlyZXMtPml2YWx1ZTsKKwkgICAgZWxzZSBpZiAocmVnYy0+ZXhwaXJlc19oZHIpCisJCWV4cGlyYXRpb24gPSByZWdjLT5leHBpcmVzX2hkci0+aXZhbHVlOworCSAgICBlbHNlCisJCWV4cGlyYXRpb24gPSAzNjAwOworCX0KKworICAgIH0gZWxzZSB7CisJLyogSnVzdCBhc3N1bWUgdGhhdCB0aGUgdW5yZWdpc3RyYXRpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bC4gKi8KKwlleHBpcmF0aW9uID0gMDsKKyAgICB9CisKKyAgICAvKiBNdXN0IGhhdmUgZXhwaXJhdGlvbiB2YWx1ZSBieSBub3cgKi8KKyAgICBwal9hc3NlcnQoZXhwaXJhdGlvbiAhPSBOT0VYUCk7CisKKyAgICByZXR1cm4gZXhwaXJhdGlvbjsKK30KKworc3RhdGljIHZvaWQgcmVnY190c3hfY2FsbGJhY2sodm9pZCAqdG9rZW4sIHBqc2lwX2V2ZW50ICpldmVudCkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgcGpzaXBfcmVnYyAqcmVnYyA9IChwanNpcF9yZWdjKikgdG9rZW47CisgICAgcGpzaXBfdHJhbnNhY3Rpb24gKnRzeCA9IGV2ZW50LT5ib2R5LnRzeF9zdGF0ZS50c3g7CisgICAgcGpfYm9vbF90IGhhbmRsZWQgPSBQSl9UUlVFOworICAgIHBqX2Jvb2xfdCB1cGRhdGVfY29udGFjdCA9IFBKX0ZBTFNFOworCisgICAgcGpfYXRvbWljX2luYyhyZWdjLT5idXN5X2N0cik7CisgICAgcGpfbG9ja19hY3F1aXJlKHJlZ2MtPmxvY2spOworCisgICAgLyogRGVjcmVtZW50IHBlbmRpbmcgdHJhbnNhY3Rpb24gY291bnRlci4gKi8KKyAgICBwal9hc3NlcnQocmVnYy0+aGFzX3RzeCk7CisgICAgcmVnYy0+aGFzX3RzeCA9IFBKX0ZBTFNFOworCisgICAgLyogQWRkIHJlZmVyZW5jZSB0byB0aGUgdHJhbnNwb3J0ICovCisgICAgaWYgKHRzeC0+dHJhbnNwb3J0ICE9IHJlZ2MtPmxhc3RfdHJhbnNwb3J0KSB7CisJaWYgKHJlZ2MtPmxhc3RfdHJhbnNwb3J0KSB7CisJICAgIHBqc2lwX3RyYW5zcG9ydF9kZWNfcmVmKHJlZ2MtPmxhc3RfdHJhbnNwb3J0KTsKKwkgICAgcmVnYy0+bGFzdF90cmFuc3BvcnQgPSBOVUxMOworCX0KKworCWlmICh0c3gtPnRyYW5zcG9ydCkgeworCSAgICByZWdjLT5sYXN0X3RyYW5zcG9ydCA9IHRzeC0+dHJhbnNwb3J0OworCSAgICBwanNpcF90cmFuc3BvcnRfYWRkX3JlZihyZWdjLT5sYXN0X3RyYW5zcG9ydCk7CisJfQorICAgIH0KKworICAgIGlmIChyZWdjLT5fZGVsZXRlX2ZsYWcgPT0gMCAmJiByZWdjLT50c3hfY2IgJiYKKyAgICAgICAgcmVnYy0+Y3VycmVudF9vcCA9PSBSRUdDX1JFR0lTVEVSSU5HKQorICAgIHsKKyAgICAgICAgc3RydWN0IHBqc2lwX3JlZ2NfdHN4X2NiX3BhcmFtIHBhcmFtOworCisgICAgICAgIHBhcmFtLmNvbnRhY3RfY250ID0gLTE7CisgICAgICAgIGNicGFyYW1faW5pdCgmcGFyYW0uY2JwYXJhbSwgcmVnYywgUEpfU1VDQ0VTUywgdHN4LT5zdGF0dXNfY29kZSwKKwkJICAgICAmdHN4LT5zdGF0dXNfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIChldmVudC0+Ym9keS50c3hfc3RhdGUudHlwZT09UEpTSVBfRVZFTlRfUlhfTVNHKSA/IAorCSAgICAgICAgICAgICAgZXZlbnQtPmJvZHkudHN4X3N0YXRlLnNyYy5yZGF0YSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgTlVMTCk7CisKKyAgICAgICAgLyogQ2FsbCByZWdjIHRzeCBjYWxsYmFjayBiZWZvcmUgaGFuZGxpbmcgYW55IHJlc3BvbnNlICovCisgICAgICAgIHBqX2xvY2tfcmVsZWFzZShyZWdjLT5sb2NrKTsKKyAgICAgICAgKCpyZWdjLT50c3hfY2IpKCZwYXJhbSk7CisgICAgICAgIHBqX2xvY2tfYWNxdWlyZShyZWdjLT5sb2NrKTsKKworICAgICAgICBpZiAocGFyYW0uY29udGFjdF9jbnQgPj0gMCkgeworICAgICAgICAgICAgLyogU2luY2Ugd2UgcmVjZWl2ZSBub24tMnh4IHJlc3BvbnNlLCBpdCBtZWFucyB0aGF0IChzb21lKSBjb250YWN0CisgICAgICAgICAgICAgKiBiaW5kaW5ncyBoYXZlbid0IGJlZW4gZXN0YWJsaXNoZWQgc28gd2UgY2FuIHNhZmVseSByZW1vdmUgdGhlc2UKKyAgICAgICAgICAgICAqIGNvbnRhY3QgaGVhZGVycy4gVGhpcyBpcyB0byBhdm9pZCByZW1vdmluZyBub24tZXhpc3RlbnQgY29udGFjdAorICAgICAgICAgICAgICogYmluZGluZ3MgbGF0ZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh0c3gtPnN0YXR1c19jb2RlLzEwMCAhPSAyKSB7CisgICAgICAgICAgICAgICAgcGpzaXBfY29udGFjdF9oZHIgKmg7CisKKwkgICAgICAgIGggPSByZWdjLT5jb250YWN0X2hkcl9saXN0Lm5leHQ7CisJICAgICAgICB3aGlsZSAoaCAhPSAmcmVnYy0+Y29udGFjdF9oZHJfbGlzdCkgeworICAgICAgICAgICAgICAgICAgICBwanNpcF9jb250YWN0X2hkciAqbmV4dCA9IGgtPm5leHQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGgtPmV4cGlyZXMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBqX2xpc3RfZXJhc2UoaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaCA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorCSAgICB9CisKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBjb250YWN0IGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHBqc2lwX3JlZ2NfdXBkYXRlX2NvbnRhY3QocmVnYywgcGFyYW0uY29udGFjdF9jbnQsIHBhcmFtLmNvbnRhY3QpOworICAgICAgICAgICAgdXBkYXRlX2NvbnRhY3QgPSBQSl9UUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSGFuZGxlIDQwMS80MDcgY2hhbGxlbmdlIChldmVuIHdoZW4gX2RlbGV0ZV9mbGFnIGlzIHNldCkgKi8KKyAgICBpZiAodHN4LT5zdGF0dXNfY29kZSA9PSBQSlNJUF9TQ19QUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRCB8fAorCXRzeC0+c3RhdHVzX2NvZGUgPT0gUEpTSVBfU0NfVU5BVVRIT1JJWkVEKQorICAgIHsKKwlwanNpcF9yeF9kYXRhICpyZGF0YSA9IGV2ZW50LT5ib2R5LnRzeF9zdGF0ZS5zcmMucmRhdGE7CisJcGpzaXBfdHhfZGF0YSAqdGRhdGE7CisKKwkvKiByZXNldCBjdXJyZW50IG9wICovCisJcmVnYy0+Y3VycmVudF9vcCA9IFJFR0NfSURMRTsKKworICAgICAgICBpZiAodXBkYXRlX2NvbnRhY3QpIHsKKyAgICAgICAgICAgIHBqc2lwX21zZyAqbXNnOworICAgICAgICAgICAgcGpzaXBfaGRyICpoZHIsICppbnNfaGRyOworICAgICAgICAgICAgcGpzaXBfY29udGFjdF9oZHIgKmNoZHI7CisKKyAgICAgICAgICAgIC8qIERlbGV0ZSBDb250YWN0IGhlYWRlcnMsIGJ1dCB3ZSBzaG91bGRuJ3QgZGVsZXRlIGhlYWRlcnMKKyAgICAgICAgICAgICAqIHdoaWNoIGFyZSBzdXBwb3NlZCB0byByZW1vdmUgY29udGFjdCBiaW5kaW5ncyBzaW5jZQorICAgICAgICAgICAgICogd2UgY2Fubm90IHJlY29uc3RydWN0IHRob3NlIGhlYWRlcnMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1zZyA9IHRzeC0+bGFzdF90eC0+bXNnOworICAgICAgICAgICAgaGRyID0gbXNnLT5oZHIubmV4dDsKKyAgICAgICAgICAgIGluc19oZHIgPSAmbXNnLT5oZHI7CisgICAgICAgICAgICB3aGlsZSAoaGRyICE9ICZtc2ctPmhkcikgeworICAgICAgICAgICAgICAgIHBqc2lwX2hkciAqbmV4dCA9IGhkci0+bmV4dDsKKworICAgICAgICAgICAgICAgIGlmIChoZHItPnR5cGUgPT0gUEpTSVBfSF9DT05UQUNUKSB7CisgICAgICAgICAgICAgICAgICAgIGNoZHIgPSAocGpzaXBfY29udGFjdF9oZHIgKiloZHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGRyLT5leHBpcmVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBqX2xpc3RfZXJhc2UoaGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc19oZHIgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhkciA9IG5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEFkZCBDb250YWN0IGhlYWRlcnMuICovCisgICAgICAgICAgICBjaGRyID0gcmVnYy0+Y29udGFjdF9oZHJfbGlzdC5uZXh0OworICAgICAgICAgICAgd2hpbGUgKGNoZHIgIT0gJnJlZ2MtPmNvbnRhY3RfaGRyX2xpc3QpIHsKKwkgICAgICAgIHBqX2xpc3RfaW5zZXJ0X2JlZm9yZShpbnNfaGRyLCAocGpzaXBfaGRyKikKKyAgICAgICAgICAgICAgICAgICAgcGpzaXBfaGRyX3NoYWxsb3dfY2xvbmUodHN4LT5sYXN0X3R4LT5wb29sLCBjaGRyKSk7CisJICAgICAgICBjaGRyID0gY2hkci0+bmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQWxzbyBhZGQgYmluZGluZ3Mgd2hpY2ggYXJlIHRvIGJlIHJlbW92ZWQgKi8KKyAgICAgICAgICAgIHdoaWxlICghcGpfbGlzdF9lbXB0eSgmcmVnYy0+cmVtb3ZlZF9jb250YWN0X2hkcl9saXN0KSkgeworCSAgICAgICAgY2hkciA9IHJlZ2MtPnJlbW92ZWRfY29udGFjdF9oZHJfbGlzdC5uZXh0OworCSAgICAgICAgcGpfbGlzdF9pbnNlcnRfYmVmb3JlKGluc19oZHIsIChwanNpcF9oZHIqKQorICAgICAgICAgICAgICAgICAgICBwanNpcF9oZHJfY2xvbmUodHN4LT5sYXN0X3R4LT5wb29sLCBjaGRyKSk7CisJICAgICAgICBwal9saXN0X2VyYXNlKGNoZHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcGpzaXBfYXV0aF9jbHRfcmVpbml0X3JlcSggJnJlZ2MtPmF1dGhfc2VzcywKKwkJCQkJICAgIHJkYXRhLCAKKwkJCQkJICAgIHRzeC0+bGFzdF90eCwgIAorCQkJCQkgICAgJnRkYXRhKTsKKworCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCSAgICBzdGF0dXMgPSBwanNpcF9yZWdjX3NlbmQocmVnYywgdGRhdGEpOworCX0KKwkKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKworCSAgICAvKiBPbmx5IGNhbGwgY2FsbGJhY2sgaWYgYXBwbGljYXRpb24gaXMgc3RpbGwgaW50ZXJlc3RlZAorCSAgICAgKiBpbiBpdC4KKwkgICAgICovCisJICAgIGlmIChyZWdjLT5fZGVsZXRlX2ZsYWcgPT0gMCkgeworCQkvKiBTaG91bGQgYmUgc2FmZSB0byByZWxlYXNlIHRoZSBsb2NrIHRlbXBvcmFyaWx5LgorCQkgKiBXZSBkbyB0aGlzIHRvIGF2b2lkIGRlYWRsb2NrLiAKKwkJICovCisJCXBqX2xvY2tfcmVsZWFzZShyZWdjLT5sb2NrKTsKKwkJY2FsbF9jYWxsYmFjayhyZWdjLCBzdGF0dXMsIHRzeC0+c3RhdHVzX2NvZGUsIAorCQkJICAgICAgJnJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUuc3RhdHVzLnJlYXNvbiwKKwkJCSAgICAgIHJkYXRhLCAtMSwgMCwgTlVMTCk7CisJCXBqX2xvY2tfYWNxdWlyZShyZWdjLT5sb2NrKTsKKwkgICAgfQorCX0KKworICAgIH0gZWxzZSBpZiAocmVnYy0+X2RlbGV0ZV9mbGFnKSB7CisKKwkvKiBVc2VyIGhhcyBjYWxsZWQgcGpzaXBfcmVnY19kZXN0cm95KCksIHNvIGRvbid0IGNhbGwgY2FsbGJhY2suIAorCSAqIFRoaXMgcmVnYyB3aWxsIGJlIGRlc3Ryb3llZCBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uLgorCSAqLworCisJLyogSnVzdCByZXNldCBjdXJyZW50IG9wICovCisJcmVnYy0+Y3VycmVudF9vcCA9IFJFR0NfSURMRTsKKworICAgIH0gZWxzZSBpZiAodHN4LT5zdGF0dXNfY29kZSA9PSBQSlNJUF9TQ19JTlRFUlZBTF9UT09fQlJJRUYgJiYKKwkgICAgICAgcmVnYy0+Y3VycmVudF9vcCA9PSBSRUdDX1JFR0lTVEVSSU5HKQorICAgIHsKKwkvKiBIYW5kbGUgNDIzIHJlc3BvbnNlIGF1dG9tYXRpY2FsbHk6CisJICogIC0gc2V0IHJlcXVlc3RlZCBleHBpcmF0aW9uIHRvIE1pbi1FeHBpcmVzIGhlYWRlciwgT05MWSBJRgorCSAqICAgIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGlzIGEgcmVnaXN0cmF0aW9uIChhcyBvcHBvc2VkIHRvCisJICogICAgdW5yZWdpc3RyYXRpb24pIGFuZCB0aGUgcmVxdWVzdGVkIGV4cGlyYXRpb24gd2FzIGluZGVlZAorCSAqICAgIGxvd2VyIHRoYW4gTWluLUV4cGlyZXMpCisJICogIC0gcmVzZW5kIHRoZSByZXF1ZXN0CisJICovCisJcGpzaXBfcnhfZGF0YSAqcmRhdGEgPSBldmVudC0+Ym9keS50c3hfc3RhdGUuc3JjLnJkYXRhOworCXBqc2lwX21pbl9leHBpcmVzX2hkciAqbWVfaGRyOworCXBqc2lwX3R4X2RhdGEgKnRkYXRhOworCXBqX2ludDMyX3QgbWluX2V4cDsKKworCS8qIHJlc2V0IGN1cnJlbnQgb3AgKi8KKwlyZWdjLT5jdXJyZW50X29wID0gUkVHQ19JRExFOworCisJLyogVXBkYXRlIHJlcXVlc3RlZCBleHBpcmF0aW9uICovCisJbWVfaGRyID0gKHBqc2lwX21pbl9leHBpcmVzX2hkciopCisJCSBwanNpcF9tc2dfZmluZF9oZHIocmRhdGEtPm1zZ19pbmZvLm1zZywKKwkJCQkgICAgUEpTSVBfSF9NSU5fRVhQSVJFUywgTlVMTCk7CisJaWYgKG1lX2hkcikgeworCSAgICBtaW5fZXhwID0gbWVfaGRyLT5pdmFsdWU7CisJfSBlbHNlIHsKKwkgICAgLyogQnJva2VuIHNlcnZlciwgTWluLUV4cGlyZXMgZG9lc24ndCBleGlzdC4KKwkgICAgICogSnVzdCBndWVzdGltYXRlIHRoZW4sIEJVVCBPTkxZIGlmIGlmIHRoaXMgaXMgdGhlCisJICAgICAqIGZpcnN0IHRpbWUgd2UgcmVjZWl2ZWQgc3VjaCByZXNwb25zZS4KKwkgICAgICovCisJICAgIGVudW0geworCQkvKiBOb3RlOiBjaGFuZ2luZyB0aGlzIHZhbHVlIHdvdWxkIHJlcXVpcmUgY2hhbmdpbmcgY291cGxlIG9mCisJCSAqICAgICAgIFB5dGhvbiB0ZXN0IHNjcmlwdHMuCisJCSAqLworCQlVTlNQRUNJRklFRF9NSU5fRVhQSVJFUyA9IDM2MDEKKwkgICAgfTsKKwkgICAgaWYgKCFyZWdjLT5leHBpcmVzX2hkciB8fAorCQkgcmVnYy0+ZXhwaXJlc19oZHItPml2YWx1ZSAhPSBVTlNQRUNJRklFRF9NSU5fRVhQSVJFUykKKwkgICAgeworCQltaW5fZXhwID0gVU5TUEVDSUZJRURfTUlOX0VYUElSRVM7CisJICAgIH0gZWxzZSB7CisJCWhhbmRsZWQgPSBQSl9GQUxTRTsKKwkJUEpfTE9HKDQsKFRISVNfRklMRSwgIlJlZ2lzdHJhdGlvbiBmYWlsZWQ6IDQyMyByZXNwb25zZSAiCisJCQkJICAgICAid2l0aG91dCBNaW4tRXhwaXJlcyBoZWFkZXIgaXMgaW52YWxpZCIpKTsKKwkJZ290byBoYW5kbGVfZXJyOworCSAgICB9CisJfQorCisJaWYgKHJlZ2MtPmV4cGlyZXNfaGRyICYmIHJlZ2MtPmV4cGlyZXNfaGRyLT5pdmFsdWUgPj0gbWluX2V4cCkgeworCSAgICAvKiBCdXQgd2UgYWxyZWFkeSBzZW5kIHdpdGggZ3JlYXRlciBleHBpcmF0aW9uIHRpbWUsIHdoeSBkb2VzCisJICAgICAqIHRoZSBzZXJ2ZXIgc2VuZCB1cyB3aXRoIDQyMz8gT2ggd2VsbCwganVzdCBmYWlsIHRoZSByZXF1ZXN0LgorCSAgICAgKi8KKwkgICAgaGFuZGxlZCA9IFBKX0ZBTFNFOworCSAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAiUmVnaXN0cmF0aW9uIGZhaWxlZDogaW52YWxpZCAiCisJCQkgICAgICAgICAiTWluLUV4cGlyZXMgaGVhZGVyIHZhbHVlIGluIHJlc3BvbnNlIikpOworCSAgICBnb3RvIGhhbmRsZV9lcnI7CisJfQorCisJc2V0X2V4cGlyZXMocmVnYywgbWluX2V4cCk7CisKKwlzdGF0dXMgPSBwanNpcF9yZWdjX3JlZ2lzdGVyKHJlZ2MsIHJlZ2MtPmF1dG9fcmVnLCAmdGRhdGEpOworCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCSAgICBzdGF0dXMgPSBwanNpcF9yZWdjX3NlbmQocmVnYywgdGRhdGEpOworCX0KKworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICAvKiBPbmx5IGNhbGwgY2FsbGJhY2sgaWYgYXBwbGljYXRpb24gaXMgc3RpbGwgaW50ZXJlc3RlZAorCSAgICAgKiBpbiBpdC4KKwkgICAgICovCisJICAgIGlmICghcmVnYy0+X2RlbGV0ZV9mbGFnKSB7CisJCS8qIFNob3VsZCBiZSBzYWZlIHRvIHJlbGVhc2UgdGhlIGxvY2sgdGVtcG9yYXJpbHkuCisJCSAqIFdlIGRvIHRoaXMgdG8gYXZvaWQgZGVhZGxvY2suCisJCSAqLworCQlwal9sb2NrX3JlbGVhc2UocmVnYy0+bG9jayk7CisJCWNhbGxfY2FsbGJhY2socmVnYywgc3RhdHVzLCB0c3gtPnN0YXR1c19jb2RlLAorCQkJICAgICAgJnJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUuc3RhdHVzLnJlYXNvbiwKKwkJCSAgICAgIHJkYXRhLCAtMSwgMCwgTlVMTCk7CisJCXBqX2xvY2tfYWNxdWlyZShyZWdjLT5sb2NrKTsKKwkgICAgfQorCX0KKworICAgIH0gZWxzZSB7CisJaGFuZGxlZCA9IFBKX0ZBTFNFOworICAgIH0KKworaGFuZGxlX2VycjoKKyAgICBpZiAoIWhhbmRsZWQpIHsKKwlwanNpcF9yeF9kYXRhICpyZGF0YTsKKwlwal9pbnQzMl90IGV4cGlyYXRpb24gPSBOT0VYUDsKKwl1bnNpZ25lZCBjb250YWN0X2NudCA9IDA7CisJcGpzaXBfY29udGFjdF9oZHIgKmNvbnRhY3RbUEpTSVBfUkVHQ19NQVhfQ09OVEFDVF07CisKKwlpZiAodHN4LT5zdGF0dXNfY29kZS8xMDAgPT0gMikgeworCisJICAgIHJkYXRhID0gZXZlbnQtPmJvZHkudHN4X3N0YXRlLnNyYy5yZGF0YTsKKworCSAgICAvKiBDYWxjdWxhdGUgZXhwaXJhdGlvbiAqLworCSAgICBleHBpcmF0aW9uID0gY2FsY3VsYXRlX3Jlc3BvbnNlX2V4cGlyYXRpb24ocmVnYywgcmRhdGEsIAorCQkJCQkJICAgICAgICZjb250YWN0X2NudCwKKwkJCQkJCSAgICAgICBQSlNJUF9SRUdDX01BWF9DT05UQUNULAorCQkJCQkJICAgICAgIGNvbnRhY3QpOworCisJICAgIC8qIFNjaGVkdWxlIG5leHQgcmVnaXN0cmF0aW9uICovCisgICAgICAgICAgICBzY2hlZHVsZV9yZWdpc3RyYXRpb24ocmVnYywgZXhwaXJhdGlvbik7CisKKwl9IGVsc2UgeworCSAgICByZGF0YSA9IChldmVudC0+Ym9keS50c3hfc3RhdGUudHlwZT09UEpTSVBfRVZFTlRfUlhfTVNHKSA/IAorCQkJZXZlbnQtPmJvZHkudHN4X3N0YXRlLnNyYy5yZGF0YSA6IE5VTEw7CisJfQorCisJLyogVXBkYXRlIHJlZ2lzdHJhdGlvbiAqLworCWlmIChleHBpcmF0aW9uPT1OT0VYUCkgZXhwaXJhdGlvbj0tMTsKKwlyZWdjLT5leHBpcmVzID0gZXhwaXJhdGlvbjsKKworCS8qIE1hcmsgb3BlcmF0aW9uIGFzIGNvbXBsZXRlICovCisJcmVnYy0+Y3VycmVudF9vcCA9IFJFR0NfSURMRTsKKworCS8qIENhbGwgY2FsbGJhY2suICovCisJLyogU2hvdWxkIGJlIHNhZmUgdG8gcmVsZWFzZSB0aGUgbG9jayB0ZW1wb3JhcmlseS4KKwkgKiBXZSBkbyB0aGlzIHRvIGF2b2lkIGRlYWRsb2NrLiAKKwkgKi8KKwlwal9sb2NrX3JlbGVhc2UocmVnYy0+bG9jayk7CisJY2FsbF9jYWxsYmFjayhyZWdjLCBQSl9TVUNDRVNTLCB0c3gtPnN0YXR1c19jb2RlLCAKKwkJICAgICAgKHJkYXRhID8gJnJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUuc3RhdHVzLnJlYXNvbiAKKwkJCTogJnRzeC0+c3RhdHVzX3RleHQpLAorCQkgICAgICByZGF0YSwgZXhwaXJhdGlvbiwgCisJCSAgICAgIGNvbnRhY3RfY250LCBjb250YWN0KTsKKwlwal9sb2NrX2FjcXVpcmUocmVnYy0+bG9jayk7CisgICAgfQorCisgICAgcGpfbG9ja19yZWxlYXNlKHJlZ2MtPmxvY2spOworCisgICAgLyogRGVsZXRlIHRoZSByZWNvcmQgaWYgdXNlciBkZXN0cm95IHJlZ2MgZHVyaW5nIHRoZSBjYWxsYmFjay4gKi8KKyAgICBpZiAocGpfYXRvbWljX2RlY19hbmRfZ2V0KHJlZ2MtPmJ1c3lfY3RyKT09MCAmJiByZWdjLT5fZGVsZXRlX2ZsYWcpIHsKKwlwanNpcF9yZWdjX2Rlc3Ryb3kocmVnYyk7CisgICAgfQorfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc2lwX3JlZ2Nfc2VuZChwanNpcF9yZWdjICpyZWdjLCBwanNpcF90eF9kYXRhICp0ZGF0YSkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgcGpzaXBfY3NlcV9oZHIgKmNzZXFfaGRyOworICAgIHBqc2lwX2V4cGlyZXNfaGRyICpleHBpcmVzX2hkcjsKKyAgICBwal91aW50MzJfdCBjc2VxOworCisgICAgcGpfYXRvbWljX2luYyhyZWdjLT5idXN5X2N0cik7CisgICAgcGpfbG9ja19hY3F1aXJlKHJlZ2MtPmxvY2spOworCisgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgcGVuZGluZyB0cmFuc2FjdGlvbi4gKi8KKyAgICBpZiAocmVnYy0+aGFzX3RzeCkgeworCVBKX0xPRyg0LChUSElTX0ZJTEUsICJVbmFibGUgdG8gc2VuZCByZXF1ZXN0LCByZWdjIGhhcyBhbm90aGVyICIKKwkJCSAgICAgInRyYW5zYWN0aW9uIHBlbmRpbmciKSk7CisJcGpzaXBfdHhfZGF0YV9kZWNfcmVmKCB0ZGF0YSApOworCXBqX2xvY2tfcmVsZWFzZShyZWdjLT5sb2NrKTsKKwlwal9hdG9taWNfZGVjKHJlZ2MtPmJ1c3lfY3RyKTsKKwlyZXR1cm4gUEpTSVBfRUJVU1k7CisgICAgfQorCisgICAgcGpfYXNzZXJ0KHJlZ2MtPmN1cnJlbnRfb3AgPT0gUkVHQ19JRExFKTsKKworICAgIC8qIEludmFsaWRhdGUgbWVzc2FnZSBidWZmZXIuICovCisgICAgcGpzaXBfdHhfZGF0YV9pbnZhbGlkYXRlX21zZyh0ZGF0YSk7CisKKyAgICAvKiBJbmNyZW1lbnQgQ1NlcSAqLworICAgIGNzZXEgPSArK3JlZ2MtPmNzZXFfaGRyLT5jc2VxOworICAgIGNzZXFfaGRyID0gKHBqc2lwX2NzZXFfaGRyKikKKwkgICAgICAgcGpzaXBfbXNnX2ZpbmRfaGRyKHRkYXRhLT5tc2csIFBKU0lQX0hfQ1NFUSwgTlVMTCk7CisgICAgY3NlcV9oZHItPmNzZXEgPSBjc2VxOworCisgICAgLyogRmluZCBFeHBpcmVzIGhlYWRlciAqLworICAgIGV4cGlyZXNfaGRyID0gKHBqc2lwX2V4cGlyZXNfaGRyKikKKwkJICBwanNpcF9tc2dfZmluZF9oZHIodGRhdGEtPm1zZywgUEpTSVBfSF9FWFBJUkVTLCBOVUxMKTsKKworICAgIC8qIEJpbmQgdG8gdHJhbnNwb3J0IHNlbGVjdG9yICovCisgICAgcGpzaXBfdHhfZGF0YV9zZXRfdHJhbnNwb3J0KHRkYXRhLCAmcmVnYy0+dHBfc2VsKTsKKworICAgIHJlZ2MtPmhhc190c3ggPSBQSl9UUlVFOworCisgICAgLyogU2V0IGN1cnJlbnQgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBFeHBpcmVzIGhlYWRlciAqLworICAgIGlmIChleHBpcmVzX2hkciAmJiBleHBpcmVzX2hkci0+aXZhbHVlPT0wKQorCXJlZ2MtPmN1cnJlbnRfb3AgPSBSRUdDX1VOUkVHSVNURVJJTkc7CisgICAgZWxzZQorCXJlZ2MtPmN1cnJlbnRfb3AgPSBSRUdDX1JFR0lTVEVSSU5HOworCisgICAgLyogUHJldmVudCBkZWxldGlvbiBvZiB0ZGF0YSwgZS5nOiB3aGVuIHNvbWV0aGluZyB3cm9uZyBpbiBzZW5kaW5nLAorICAgICAqIHdlIG5lZWQgdGRhdGEgdG8gcmV0cmlldmUgdGhlIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBwanNpcF90eF9kYXRhX2FkZF9yZWYodGRhdGEpOworCisgICAgLyogSWYgdmlhX2FkZHIgaXMgc2V0LCB1c2UgdGhpcyBhZGRyZXNzIGZvciB0aGUgVmlhIGhlYWRlci4gKi8KKyAgICBpZiAocmVnYy0+dmlhX2FkZHIuaG9zdC5zbGVuID4gMCkgeworICAgICAgICB0ZGF0YS0+dmlhX2FkZHIgPSByZWdjLT52aWFfYWRkcjsKKyAgICAgICAgdGRhdGEtPnZpYV90cCA9IHJlZ2MtPnZpYV90cDsKKyAgICB9CisKKyAgICAvKiBOZWVkIHRvIHVubG9jayB0aGUgcmVnYyB0ZW1wb3JhcmlseSB3aGlsZSBzZW5kaW5nIHRoZSBtZXNzYWdlIHRvCisgICAgICogcHJldmVudCBkZWFkbG9jayAoaHR0cHM6Ly90cmFjLnBqc2lwLm9yZy9yZXBvcy90aWNrZXQvMTI0NykuCisgICAgICogSXQgc2hvdWxkIGJlIHNhZmUgdG8gZG8gdGhpcyBzaW5jZSB0aGUgcmVnYydzIHJlZmNvdW50IGhhcyBiZWVuCisgICAgICogaW5jcmVtZW50ZWQuCisgICAgICovCisgICAgcGpfbG9ja19yZWxlYXNlKHJlZ2MtPmxvY2spOworCisgICAgLyogTm93IHNlbmQgdGhlIG1lc3NhZ2UgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9zZW5kX3JlcXVlc3QocmVnYy0+ZW5kcHQsIHRkYXRhLCBSRUdDX1RTWF9USU1FT1VULAorCQkJCSAgICAgIHJlZ2MsICZyZWdjX3RzeF9jYWxsYmFjayk7CisgICAgaWYgKHN0YXR1cyE9UEpfU1VDQ0VTUykgeworCVBKX0xPRyg0LChUSElTX0ZJTEUsICJFcnJvciBzZW5kaW5nIHJlcXVlc3QsIHN0YXR1cz0lZCIsIHN0YXR1cykpOworICAgIH0KKworICAgIC8qIFJlYWNxdWlyZSB0aGUgbG9jayAqLworICAgIHBqX2xvY2tfYWNxdWlyZShyZWdjLT5sb2NrKTsKKworICAgIC8qIEdldCBsYXN0IHRyYW5zcG9ydCB1c2VkIGFuZCBhZGQgcmVmZXJlbmNlIHRvIGl0ICovCisgICAgaWYgKHRkYXRhLT50cF9pbmZvLnRyYW5zcG9ydCAhPSByZWdjLT5sYXN0X3RyYW5zcG9ydCAmJgorCXN0YXR1cz09UEpfU1VDQ0VTUykKKyAgICB7CisJaWYgKHJlZ2MtPmxhc3RfdHJhbnNwb3J0KSB7CisJICAgIHBqc2lwX3RyYW5zcG9ydF9kZWNfcmVmKHJlZ2MtPmxhc3RfdHJhbnNwb3J0KTsKKwkgICAgcmVnYy0+bGFzdF90cmFuc3BvcnQgPSBOVUxMOworCX0KKworCWlmICh0ZGF0YS0+dHBfaW5mby50cmFuc3BvcnQpIHsKKwkgICAgcmVnYy0+bGFzdF90cmFuc3BvcnQgPSB0ZGF0YS0+dHBfaW5mby50cmFuc3BvcnQ7CisJICAgIHBqc2lwX3RyYW5zcG9ydF9hZGRfcmVmKHJlZ2MtPmxhc3RfdHJhbnNwb3J0KTsKKwl9CisgICAgfQorCisgICAgLyogUmVsZWFzZSB0ZGF0YSAqLworICAgIHBqc2lwX3R4X2RhdGFfZGVjX3JlZih0ZGF0YSk7CisKKyAgICBwal9sb2NrX3JlbGVhc2UocmVnYy0+bG9jayk7CisKKyAgICAvKiBEZWxldGUgdGhlIHJlY29yZCBpZiB1c2VyIGRlc3Ryb3kgcmVnYyBkdXJpbmcgdGhlIGNhbGxiYWNrLiAqLworICAgIGlmIChwal9hdG9taWNfZGVjX2FuZF9nZXQocmVnYy0+YnVzeV9jdHIpPT0wICYmIHJlZ2MtPl9kZWxldGVfZmxhZykgeworCXBqc2lwX3JlZ2NfZGVzdHJveShyZWdjKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzQ5LzQ5YmFhNjI0MjY2ZjZlYmIxMzNjMjU1NjlhODZiMjg4MWRjOTE1YWEuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS80OS80OWJhYTYyNDI2NmY2ZWJiMTMzYzI1NTY5YTg2YjI4ODFkYzkxNWFhLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmIxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS80OS80OWJhYTYyNDI2NmY2ZWJiMTMzYzI1NTY5YTg2YjI4ODFkYzkxNWFhLnN2bi1iYXNlCkBAIC0wLDAgKzEsMTkgQEAKKzsgc3ltc25kdGVzdC5wa2cNCisNCis7IExhbmd1YWdlcw0KKyZFTg0KKw0KKzsgSGVhZGVyDQorI3sic3ltc25kdGVzdCJ9LCgweEEwMDAwMDBFKSwgMCwgMSwgMQ0KKw0KKzsgUGxhdGZvcm0gY29tcGF0aWJpbGl0eQ0KK1sweDEwMUY3OTYxXSwgKiwgKiwgKiwgeyJTZXJpZXM2MFByb2R1Y3RJRCJ9DQorDQorOyB2ZW5kb3INCisleyJQSlNJUCJ9DQorOiJQSlNJUCINCisNCis7IFRhcmdldA0KKyIkKEVQT0NST09UKUVwb2MzMlxyZWxlYXNlXCQoUExBVEZPUk0pXCQoVEFSR0VUKVxzeW1zbmR0ZXN0LmV4ZSItIiE6XHN5c1xiaW5cc3ltc25kdGVzdC5leGUiDQorIiQoRVBPQ1JPT1QpRXBvYzMyXGRhdGFcelxwcml2YXRlXDEwMDAzYTNmXGFwcHNcc3ltc25kdGVzdF9yZWcuclNDIi0iITpccHJpdmF0ZVwxMDAwM2EzZlxpbXBvcnRcYXBwc1xzeW1zbmR0ZXN0X3JlZy5yU0MiDQorDQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvNDkvNDlmMDNjZGNiMmM4MDllNWQ3YWQxYmZiOWE1NTExZmY5NjgwMThiOC5zdm4tYmFzZSBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzQ5LzQ5ZjAzY2RjYjJjODA5ZTVkN2FkMWJmYjlhNTUxMWZmOTY4MDE4Yjguc3ZuLWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1YWM0NAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzQ5LzQ5ZjAzY2RjYjJjODA5ZTVkN2FkMWJmYjlhNTUxMWZmOTY4MDE4Yjguc3ZuLWJhc2UKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uLy4uL3BvcnRhdWRpby9zcmMvaG9zdGFwaS9vc3MvcGFfdW5peF9vc3MuYyIK