LyoqDQogKiBAZmlsZSB2b2ljZV9hcGkuYw0KICogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIHRoZSBwdWJsaWMgQVBJcyBvZiBsaWJ2b2ljZS4NCiAqDQogKiBDb3B5cmlnaHQgKEMpIDIwMjMgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuDQogKiBAYXV0aG9yIA0KICogDQogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMNCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiCjqLHY0aGjukdQTHYyIExpY2VuY2WjqQ0KICoNCiAqLw0KDQoNCg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQoNCiNpbmNsdWRlIDxzdGRpbnQuaD4NCi8vI2luY2x1ZGUgInZvbHRlX2Rydi5oIg0KI2luY2x1ZGUgPGxpbnV4L3ZvbHRlX2Rydi5oPg0KDQojaW5jbHVkZSA8c3lzL2lvY3RsLmg+DQojaW5jbHVkZSA8ZmNudGwuaD4NCiNpbmNsdWRlIDx0aW55YWxzYS9hdWRpb19taXhlcl9jdHJsLmg+DQojaW5jbHVkZSAidm9pY2VfbGliLmgiDQoNCiNkZWZpbmUgVk9DSUVfU05EX0NBUkRfTlVNIDANCg0KDQpleHRlcm4gaW50IG1peF9zZXRfdm9pY2Vfdm9sKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCB2b2x1bWUpOw0KZXh0ZXJuIGludCBtaXhfZ2V0X3ZvaWNlX3ZvbChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKnZvbHVtZSk7DQpleHRlcm4gaW50IG1peF9zZXRfdHhfdm9pY2Vfdm9sKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCB2b2x1bWUpOw0KZXh0ZXJuIGludCBtaXhfZ2V0X3R4X3ZvaWNlX3ZvbChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKnZvbHVtZSk7DQpleHRlcm4gaW50IG1peF9zZXRfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBib29sIGVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9nZXRfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKmVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9zZXRfcnhfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBib29sIGVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9nZXRfcnhfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKmVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9zZXRfdm9pY2VfcGF0aChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgcGF0aCk7DQpleHRlcm4gaW50IG1peF9zZXRfdnBfcGF0aChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBjaGFyIHBhdGgpOw0KZXh0ZXJuIGludCBtaXhfZ2V0X3ZwX3BhdGgoc3RydWN0IG1peGVyICptaXhlciwgaW50ICpwYXRoKTsNCmV4dGVybiBpbnQgbWl4X2dldF92b2ljZV9wYXRoKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCAqcGF0aCk7DQpleHRlcm4gaW50IG1peF9zZXRfdnBsb29wKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCBwYXRoKTsNCmV4dGVybiBpbnQgbWl4X2dldF92cGxvb3Aoc3RydWN0IG1peGVyICptaXhlciwgaW50ICpzdGF0ZSk7DQpleHRlcm4gaW50IG1peF9zZXRfdm9pY2Vfdm9sX2dhaW4oc3RydWN0IG1peGVyICptaXhlciwgaW50IHZvbF9nYWluKTsNCmV4dGVybiBpbnQgbWl4X2dldF92b2ljZV92b2xfZ2FpbihzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKnZvbF9nYWluKTsNCmV4dGVybiBpbnQgbWl4X3NldF90eF92b2ljZV92b2xfZ2FpbihzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgdm9sX2dhaW4pOw0KZXh0ZXJuIGludCBtaXhfZ2V0X3R4X3ZvaWNlX3ZvbF9nYWluKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCAqdm9sX2dhaW4pOw0KDQoJDQojZGVmaW5lIFZPQ0lFX1NORF9DQVJEX05VTSAwDQoJDQoJDQoJDQovL+iuvue9rnZvaWNl6Z+z6aKR6K6+5aSH5qih5byPIGRldl9tb2Rl77yaaGFuZHNldCxzcGVha2VyLGhlYWRzZXQJMCDooajnpLrmiJDlip/vvD/lhbblroPooajnpLrmnInplJnorz8NCmludCBzZXRfdm9pY2VfZGV2aWNlX21vZGUoaW50IGRldl9tb2RlKQ0Kew0KDQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoJcHJpbnRmKCIlczogc3RhcnQgZGV2X21vZGU9JWQhXG4iLF9fZnVuY19fLCBkZXZfbW9kZSk7DQoNCglpZiAoKGRldl9tb2RlIDwgVF9PVVRQVVRfSEFORFNFVCApIHx8KGRldl9tb2RlID49IFRfT1VUUFVUX01BWCkpew0KCQlwcmludGYoIiVzOiBkZXZfbW9kZSBub3Qgc3VwcG9ydCwgZGV2X21vZGU9JWQhXG4iLF9fZnVuY19fLCBkZXZfbW9kZSk7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X3NldF92b2ljZV9wYXRoKHZvaWNlX21peGVyLCBkZXZfbW9kZSk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsNCg0KDQoJcmV0dXJuIDA7DQoJDQoJDQp9DQoNCg0KDQppbnQgc2NfYXVkaW9fc2V0X3ZvaWNlX2RldmljZV9tb2RlKGludCBkZXZfbW9kZSkNCnsNCg0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KCXByaW50ZigiJXM6IHN0YXJ0IGRldl9tb2RlPSVkIVxuIixfX2Z1bmNfXywgZGV2X21vZGUpOw0KDQoJaWYgKChkZXZfbW9kZSA8IFRfT1VUUFVUX0hBTkRTRVQgKSB8fChkZXZfbW9kZSA+PSBUX09VVFBVVF9NQVgpKXsNCgkJcHJpbnRmKCIlczogZGV2X21vZGUgbm90IHN1cHBvcnQsIGRldl9tb2RlPSVkIVxuIixfX2Z1bmNfXywgZGV2X21vZGUpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCiNpZmRlZiBfQUxTQV9DT0RFQ19JTl9DQVANCgltaXhfc2V0X3ZwX3BhdGgodm9pY2VfbWl4ZXIsZGV2X21vZGUpOw0KDQojZWxzZQ0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9zZXRfdm9pY2VfcGF0aCh2b2ljZV9taXhlciwgZGV2X21vZGUpOw0KI2VuZGlmDQoNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoNCglyZXR1cm4gMDsNCgkNCgkNCn0NCg0KDQppbnQgc2NfYXVkaW9fZ2V0X3ZvaWNlX2RldmljZV9tb2RlKGludCAqcF9kZXZfbW9kZSkNCnsNCiAgICBpbnQgcmV0ID0gMDsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCglwcmludGYoIiVzOiBzdGFydCFcbiIsX19mdW5jX18pOw0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9nZXRfdnBfcGF0aCh2b2ljZV9taXhlciwgcF9kZXZfbW9kZSk7DQoNCgkNCglpZigoKnBfZGV2X21vZGUgPCBUX09VVFBVVF9IQU5EU0VUICkgfHwoKnBfZGV2X21vZGUgPj0gVF9PVVRQVVRfTUFYKSl7DQoJCXByaW50ZigiJXM6IGRldl9tb2RlIG5vdCBzdXBwb3J0LCAqcF9kZXZfbW9kZT0lZCFcbiIsX19mdW5jX18sICpwX2Rldl9tb2RlKTsNCgkJcmV0ID0gLTE7DQoJfQ0KCXByaW50ZigiJXM6IHN0YXJ0ICpwX2Rldl9tb2RlPSVkIVxuIixfX2Z1bmNfXywgKnBfZGV2X21vZGUpOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7DQoNCglyZXR1cm4gcmV0Ow0KCQ0KfQ0KDQoNCmludCBzY19hdWRpb19zZXRfcnhfdm9pY2Vfdm9sKGludCB2b2wpDQp7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoJcHJpbnRmKCIlczogc3RhcnQgdm9sPSVkIVxuIixfX2Z1bmNfXywgdm9sKTsNCg0KCWlmICgodm9sIDwgMCApIHx8KHZvbCA+IDExKSl7DQoJCXByaW50ZigiJXM6IHZvbCBub3Qgc3VwcG9ydCwgdm9sPSVkIVxuIixfX2Z1bmNfXywgdm9sKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJdm9pY2VfbWl4ZXIgPSBtaXhlcl9vcGVuKFZPQ0lFX1NORF9DQVJEX05VTSk7DQoJaWYgKCF2b2ljZV9taXhlcikgew0KCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL2NvbmZpZyBtaXhlciBkZXYNCgltaXhfc2V0X3ZvaWNlX3ZvbCh2b2ljZV9taXhlciwgdm9sKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoNCglyZXR1cm4gMDsNCg0KDQoJDQoJDQp9DQoNCg0KDQppbnQgc2NfYXVkaW9fZ2V0X3J4X3ZvaWNlX3ZvbChpbnQgICAgICogcF92b2wpDQp7DQogICAgaW50IHJldCA9IDA7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoNCglwcmludGYoIiVzOiBzdGFydCFcbiIsX19mdW5jX18pOw0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9nZXRfdm9pY2Vfdm9sKHZvaWNlX21peGVyLCBwX3ZvbCk7DQoJDQoNCglpZiAoKCpwX3ZvbCA8IDAgKSB8fCgqcF92b2wgPiAxMSkpew0KCQlwcmludGYoIiVzOiB2b2wgbm90IHN1cHBvcnQsICpwX3ZvbD0lZCFcbiIsX19mdW5jX18sICpwX3ZvbCk7DQoJCXJldCA9IC0xOw0KCX0NCglwcmludGYoIiVzOiAgKnBfdm9sPSVkIVxuIixfX2Z1bmNfXywgKnBfdm9sKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoNCglyZXR1cm4gcmV0Ow0KDQoJDQoJDQp9DQoNCmludCBzY19hdWRpb19zZXRfcnhfdm9pY2Vfdm9sX2dhaW4oaW50IGdhaW4pDQp7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoJcHJpbnRmKCIlczogc3RhcnQgdm9sPSVkIVxuIixfX2Z1bmNfXywgZ2Fpbik7DQoNCglpZiAoKGdhaW4gPCAtMTUgKSB8fChnYWluID4gMjQpKXsNCgkJcHJpbnRmKCIlczogZ2FpbiBub3Qgc3VwcG9ydCwgZ2Fpbj0lZCFcbiIsX19mdW5jX18sIGdhaW4pOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9zZXRfdm9pY2Vfdm9sX2dhaW4odm9pY2VfbWl4ZXIsIGdhaW4pOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7DQoNCg0KCXJldHVybiAwOw0KDQoNCgkNCgkNCn0NCg0KaW50IHNjX2F1ZGlvX2dldF9yeF92b2ljZV92b2xfZ2FpbihpbnQgICAgICogcF9nYWluKQ0Kew0KICAgIGludCByZXQgPSAwOw0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoJcHJpbnRmKCIlczogc3RhcnQhXG4iLF9fZnVuY19fKTsNCg0KCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJdm9pY2VfbWl4ZXIgPSBtaXhlcl9vcGVuKFZPQ0lFX1NORF9DQVJEX05VTSk7DQoJaWYgKCF2b2ljZV9taXhlcikgew0KCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL2NvbmZpZyBtaXhlciBkZXYNCgltaXhfZ2V0X3ZvaWNlX3ZvbF9nYWluKHZvaWNlX21peGVyLCBwX2dhaW4pOw0KCQ0KDQoJaWYgKCgqcF9nYWluIDwgLTE1ICkgfHwoKnBfZ2FpbiA+IDI0KSl7DQoJCXByaW50ZigiJXM6IGdhaW4gbm90IHN1cHBvcnQsICpwX2dhaW49JWQhXG4iLF9fZnVuY19fLCAqcF9nYWluKTsNCgkJcmV0ID0gLTE7DQoJfQ0KCXByaW50ZigiJXM6ICAqcF9nYWluPSVkIVxuIixfX2Z1bmNfXywgKnBfZ2Fpbik7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsNCg0KDQoJcmV0dXJuIHJldDsNCg0KCQ0KCQ0KfQ0KDQppbnQgc2NfYXVkaW9fc2V0X3R4X3ZvaWNlX3ZvbF9nYWluKGludCBnYWluKQ0Kew0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KCXByaW50ZigiJXM6IHN0YXJ0IHZvbD0lZCFcbiIsX19mdW5jX18sIGdhaW4pOw0KDQoJaWYgKChnYWluIDwgLTE1ICkgfHwoZ2FpbiA+IDI0KSl7DQoJCXByaW50ZigiJXM6IGdhaW4gbm90IHN1cHBvcnQsIGdhaW49JWQhXG4iLF9fZnVuY19fLCBnYWluKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJdm9pY2VfbWl4ZXIgPSBtaXhlcl9vcGVuKFZPQ0lFX1NORF9DQVJEX05VTSk7DQoJaWYgKCF2b2ljZV9taXhlcikgew0KCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL2NvbmZpZyBtaXhlciBkZXYNCgltaXhfc2V0X3R4X3ZvaWNlX3ZvbF9nYWluKHZvaWNlX21peGVyLCBnYWluKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoNCglyZXR1cm4gMDsNCg0KDQoJDQoJDQp9DQoNCmludCBzY19hdWRpb19nZXRfdHhfdm9pY2Vfdm9sX2dhaW4oaW50ICAgICAqIHBfZ2FpbikNCnsNCiAgICBpbnQgcmV0ID0gMDsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCg0KCXByaW50ZigiJXM6IHN0YXJ0IVxuIixfX2Z1bmNfXyk7DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X2dldF90eF92b2ljZV92b2xfZ2Fpbih2b2ljZV9taXhlciwgcF9nYWluKTsNCgkNCg0KCWlmICgoKnBfZ2FpbiA8IC0xNSApIHx8KCpwX2dhaW4gPiAyNCkpew0KCQlwcmludGYoIiVzOiBnYWluIG5vdCBzdXBwb3J0LCAqcF9nYWluPSVkIVxuIixfX2Z1bmNfXywgKnBfZ2Fpbik7DQoJCXJldCA9IC0xOw0KCX0NCglwcmludGYoIiVzOiAgKnBfZ2Fpbj0lZCFcbiIsX19mdW5jX18sICpwX2dhaW4pOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7DQoNCg0KCXJldHVybiByZXQ7DQoNCgkNCgkNCn0NCg0KaW50IHNjX2F1ZGlvX3NldF90eF92b2ljZV92b2woaW50IHZvbCkNCnsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCglwcmludGYoIiVzOiBzdGFydCB2b2w9JWQhXG4iLF9fZnVuY19fLCB2b2wpOw0KDQoJaWYgKCh2b2wgPCAwICkgfHwodm9sID4gMTEpKXsNCgkJcHJpbnRmKCIlczogdm9sIG5vdCBzdXBwb3J0LCB2b2w9JWQhXG4iLF9fZnVuY19fLCB2b2wpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9zZXRfdHhfdm9pY2Vfdm9sKHZvaWNlX21peGVyLCB2b2wpOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7DQoNCg0KCXJldHVybiAwOw0KCQ0KCQ0KfQ0KDQoNCg0KaW50IHNjX2F1ZGlvX2dldF90eF92b2ljZV92b2woaW50ICAqcF92b2wpDQp7DQogICAgaW50IHJldCA9IDA7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoJcHJpbnRmKCIlczogc3RhcnQhXG4iLF9fZnVuY19fKTsNCg0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9nZXRfdHhfdm9pY2Vfdm9sKHZvaWNlX21peGVyLCBwX3ZvbCk7DQoJDQoNCglpZigoKnBfdm9sIDwgMCApIHx8KCpwX3ZvbCA+IDUpKXsNCgkJcHJpbnRmKCIlczogdm9sIG5vdCBzdXBwb3J0LCAqcF92b2w9JWQhXG4iLF9fZnVuY19fLCAqcF92b2wpOw0KCQlyZXQgPSAtMTsNCgl9DQoJcHJpbnRmKCIlczogICpwX3ZvbD0lZCFcbiIsX19mdW5jX18sICpwX3ZvbCk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsJDQogICAgcmV0dXJuIHJldDsJDQp9DQoNCg0KDQppbnQgc2NfYXVkaW9fc2V0X3R4X3ZvaWNlX211dGVfc3RhdGUoaW50IG11dGUgICAgICAgICApDQp7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoJcHJpbnRmKCIlczogc3RhcnQgbXV0ZT0lZCFcbiIsX19mdW5jX18sIG11dGUpOw0KDQoJaWYoKG11dGUgIT0gMCApICYmKG11dGUgIT0gMSkpIHsNCgkJcHJpbnRmKCIlczogbXV0ZSBub3Qgc3VwcG9ydCwgbXV0ZT0lZCFcbiIsX19mdW5jX18sIG11dGUpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9zZXRfdm9pY2VfbXV0ZSh2b2ljZV9taXhlciwgbXV0ZSk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsNCiAgICByZXR1cm4gMDsJDQoJDQp9DQoNCmludCBzY19hdWRpb19nZXRfdHhfdm9pY2VfbXV0ZV9zdGF0ZShpbnQgKnBfbXV0ZSkNCnsNCiAgICBpbnQgcmV0ID0gMDsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCg0KCXByaW50ZigiJXM6IHN0YXJ0IVxuIixfX2Z1bmNfXyk7DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X2dldF92b2ljZV9tdXRlKHZvaWNlX21peGVyLCBwX211dGUpOw0KCQ0KDQoJaWYoKCpwX211dGUgIT0gMCApICYmKCpwX211dGUgIT0gMSkpIHsNCgkJcHJpbnRmKCIlczogKnBfbXV0ZSBub3Qgc3VwcG9ydCwgKnBfbXV0ZT0lZCFcbiIsX19mdW5jX18sICpwX211dGUpOw0KCQkJDQoJCXJldCA9IC0xOw0KCX0NCglwcmludGYoIiVzOiAgKnBfbXV0ZT0lZCFcbiIsX19mdW5jX18sICpwX211dGUpOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7CQ0KDQogICAgcmV0dXJuIHJldDsNCn0NCg0KDQoNCg0KDQoNCg0KaW50IHNjX2F1ZGlvX3NldF9yeF92b2ljZV9tdXRlX3N0YXRlKGludCBtdXRlKSANCnsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCglwcmludGYoIiVzOiBzdGFydCBtdXRlPSVkIVxuIixfX2Z1bmNfXywgbXV0ZSk7DQoNCglpZigobXV0ZSAhPSAwICkgJiYobXV0ZSAhPSAxKSkgew0KCQlwcmludGYoIiVzOiBtdXRlIG5vdCBzdXBwb3J0LCBtdXRlPSVkIVxuIixfX2Z1bmNfXywgbXV0ZSk7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X3NldF9yeF92b2ljZV9tdXRlKHZvaWNlX21peGVyLCBtdXRlKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KICAgIHJldHVybiAwOwkNCgkNCn0NCg0KDQppbnQgc2NfYXVkaW9fZ2V0X3J4X3ZvaWNlX211dGVfc3RhdGUoaW50ICpwX211dGUpDQp7DQogICAgaW50IHJldCA9IDA7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoNCglwcmludGYoIiVzOiBzdGFydCFcbiIsX19mdW5jX18pOw0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9nZXRfcnhfdm9pY2VfbXV0ZSh2b2ljZV9taXhlciwgcF9tdXRlKTsNCgkNCglpZigoKnBfbXV0ZSAhPSAwICkgJiYoKnBfbXV0ZSAhPSAxKSkgew0KDQoJCXByaW50ZigiJXM6ICpwX211dGUgbm90IHN1cHBvcnQsICpwX211dGU9JWQhXG4iLF9fZnVuY19fLCAqcF9tdXRlKTsNCgkJcmV0ID0gLTE7DQoJfQ0KCXByaW50ZigiJXM6ICAqcF9tdXRlPSVkIVxuIixfX2Z1bmNfXywgKnBfbXV0ZSk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsJDQoNCiAgICByZXR1cm4gcmV0Ow0KDQp9DQoNCmludCBzY19hdWRpb19zZXRfbG9vcGJhY2tfZW5hYmxlX3N0YXRlKGludCBlbmFibGUpDQp7DQogICAgcmV0dXJuIDA7DQp9DQoNCmludCBzY19hdWRpb19nZXRfbG9vcGJhY2tfZW5hYmxlX3N0YXRlKGludCAqcF9lbmFibGUpDQp7DQogICAgcmV0dXJuIDA7DQp9DQoNCmludCBhcF9hdWRpb19zZXRfbG9vcGJhY2tfZW5hYmxlKGludCBkZXZfbW9kZSxpbnQgZW5hYmxlKQ0Kew0KDQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQogICAgaW50IHJldCA9IDA7DQogICAgc3RydWN0IHBjbV9jb25maWcgY29uZmlnX3ZvaWNlID0gezB9Ow0KDQoJDQoJcHJpbnRmKCIlczogc3RhcnQgZGV2X21vZGU9JWQsZW5hYmxlPSVkIVxuIixfX2Z1bmNfXywgZGV2X21vZGUsZW5hYmxlKTsNCg0KCWlmICgoZGV2X21vZGUgPCBUX09VVFBVVF9IQU5EU0VUICkgfHwoZGV2X21vZGUgPj0gVF9PVVRQVVRfTUFYKSl7DQoJCXByaW50ZigiJXM6IGRldl9tb2RlIG5vdCBzdXBwb3J0LCBkZXZfbW9kZT0lZCFcbiIsX19mdW5jX18sIGRldl9tb2RlKTsNCgkJcmV0dXJuIC0xOw0KCX0NCglpZiAoKGVuYWJsZSAhPSAwICkmJihlbmFibGUgIT0gMSkpew0KCQlwcmludGYoIiVzOiBlbmFibGUgdmFsIG5vdCBzdXBwb3J0LCBlbmFibGU9JWQhXG4iLF9fZnVuY19fLCBlbmFibGUpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KCWlmKGVuYWJsZSA9PSAxKXsNCg0KCQkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCQl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCgkJaWYgKCF2b2ljZV9taXhlcikgew0KCQkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoNCgkJLy9jb25maWcgbWl4ZXIgZGV2DQoJCXJldCA9IG1peF9zZXRfdm9pY2VfcGF0aCh2b2ljZV9taXhlciwgZGV2X21vZGUpOw0KCQlwcmludGYoIm1peF9zZXRfdm9pY2VfcGF0aCByZXQ9JWQhXG4iLHJldCk7DQoJCQ0KCQlyZXQgPSBtaXhfc2V0X3ZwbG9vcCh2b2ljZV9taXhlciwgZGV2X21vZGUpOw0KCQlwcmludGYoIm1peF9zZXRfdnBsb29wIHJldD0lZCFcbiIscmV0KTsNCg0KCQkvL2Nsb3NlIG1peGVyDQoJCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgkJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoJCQ0KDQoNCg0KCQkNCgl9DQoJZWxzZXsNCg0KCQkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCQl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCgkJaWYgKCF2b2ljZV9taXhlcikgew0KCQkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoNCg0KCSAgICByZXQgPSBtaXhfc2V0X3ZwbG9vcCh2b2ljZV9taXhlciwgVlBfUEFUSF9PRkYpOw0KCQkvL2Nsb3NlIG1peGVyDQoJCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgkJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoJCQ0KCQlwcmludGYoIm1peF9zZXRfdnBsb29wIG9mZiBlbmQgcmV0PSVkIVxuIixyZXQpOw0KCQkNCgkJDQoJDQoNCg0KCX0NCiANCgkvL3JldHVybiAwOw0KDQoJcHJpbnRmKCIlczogZW5kIGVuYWJsZT0lZCFcbiIsX19mdW5jX18sIGVuYWJsZSk7DQoNCglyZXR1cm4gcmV0Ow0KCQ0KCQ0KfQ0KDQoNCg0KaW50IGFwX2F1ZGlvX2dldF9sb29wYmFja19lbmFibGUoaW50ICpwX2VuYWJsZSkNCnsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCglpbnQgcmV0ID0gMDsNCglwcmludGYoIiVzOiBzdGFydCFcbiIsX19mdW5jX18pOw0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCXJldCA9IG1peF9nZXRfdnBsb29wKHZvaWNlX21peGVyLCBwX2VuYWJsZSk7DQoJaWYoKCpwX2VuYWJsZSAhPSAwICkgJiYoKnBfZW5hYmxlICE9IDEpKXsNCgkJcHJpbnRmKCIlczogcF9lbmFibGUgbm90IHN1cHBvcnQsICpwX2VuYWJsZT0lZCFcbiIsX19mdW5jX18sICpwX2VuYWJsZSk7DQoJCXJldCA9IC0xOw0KCX0NCglwcmludGYoIiVzOiBlbmQgKnBfZW5hYmxlPSVkIVxuIixfX2Z1bmNfXywgKnBfZW5hYmxlKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoJcmV0dXJuIHJldDsNCgkNCn0NCg0KDQo=