LyoqDQogKiBAZmlsZSB2b2ljZV9hcGkuYw0KICogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIHRoZSBwdWJsaWMgQVBJcyBvZiBsaWJ2b2ljZS4NCiAqDQogKiBDb3B5cmlnaHQgKEMpIDIwMjMgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuDQogKiBAYXV0aG9yIA0KICogDQogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMNCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiCjqLHY0aGjukdQTHYyIExpY2VuY2WjqQ0KICoNCiAqLw0KDQoNCg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQoNCiNpbmNsdWRlIDxzdGRpbnQuaD4NCi8vI2luY2x1ZGUgInZvbHRlX2Rydi5oIg0KI2luY2x1ZGUgPGxpbnV4L3ZvbHRlX2Rydi5oPg0KDQojaW5jbHVkZSA8c3lzL2lvY3RsLmg+DQojaW5jbHVkZSA8ZmNudGwuaD4NCiNpbmNsdWRlIDx0aW55YWxzYS9hdWRpb19taXhlcl9jdHJsLmg+DQojaW5jbHVkZSAidm9pY2VfbGliLmgiDQoNCiNkZWZpbmUgVk9DSUVfU05EX0NBUkRfTlVNIDANCg0KDQpleHRlcm4gaW50IG1peF9zZXRfdm9pY2Vfdm9sKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCB2b2x1bWUpOw0KZXh0ZXJuIGludCBtaXhfZ2V0X3ZvaWNlX3ZvbChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKnZvbHVtZSk7DQpleHRlcm4gaW50IG1peF9zZXRfdHhfdm9pY2Vfdm9sKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCB2b2x1bWUpOw0KZXh0ZXJuIGludCBtaXhfZ2V0X3R4X3ZvaWNlX3ZvbChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKnZvbHVtZSk7DQpleHRlcm4gaW50IG1peF9zZXRfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBib29sIGVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9nZXRfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKmVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9zZXRfcnhfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBib29sIGVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9nZXRfcnhfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKmVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9zZXRfdm9pY2VfcGF0aChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgcGF0aCk7DQpleHRlcm4gaW50IG1peF9zZXRfdnBfcGF0aChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBjaGFyIHBhdGgpOw0KZXh0ZXJuIGludCBtaXhfZ2V0X3ZwX3BhdGgoc3RydWN0IG1peGVyICptaXhlciwgaW50ICpwYXRoKTsNCmV4dGVybiBpbnQgbWl4X2dldF92b2ljZV9wYXRoKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCAqcGF0aCk7DQpleHRlcm4gaW50IG1peF9zZXRfdnBsb29wKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCBwYXRoKTsNCmV4dGVybiBpbnQgbWl4X2dldF92cGxvb3Aoc3RydWN0IG1peGVyICptaXhlciwgaW50ICpzdGF0ZSk7DQoNCg0KDQoJDQojZGVmaW5lIFZPQ0lFX1NORF9DQVJEX05VTSAwDQoJDQoJDQoJDQovL+iuvue9rnZvaWNl6Z+z6aKR6K6+5aSH5qih5byPIGRldl9tb2Rl77yaaGFuZHNldCxzcGVha2VyLGhlYWRzZXQJMCDooajnpLrmiJDlip/vvD/lhbblroPooajnpLrmnInplJnorz8NCmludCBzZXRfdm9pY2VfZGV2aWNlX21vZGUoaW50IGRldl9tb2RlKQ0Kew0KDQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoJcHJpbnRmKCIlczogc3RhcnQgZGV2X21vZGU9JWQhXG4iLF9fZnVuY19fLCBkZXZfbW9kZSk7DQoNCglpZiAoKGRldl9tb2RlIDwgVF9PVVRQVVRfSEFORFNFVCApIHx8KGRldl9tb2RlID49IFRfT1VUUFVUX01BWCkpew0KCQlwcmludGYoIiVzOiBkZXZfbW9kZSBub3Qgc3VwcG9ydCwgZGV2X21vZGU9JWQhXG4iLF9fZnVuY19fLCBkZXZfbW9kZSk7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X3NldF92b2ljZV9wYXRoKHZvaWNlX21peGVyLCBkZXZfbW9kZSk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsNCg0KDQoJcmV0dXJuIDA7DQoJDQoJDQp9DQoNCg0KDQppbnQgc2NfYXVkaW9fc2V0X3ZvaWNlX2RldmljZV9tb2RlKGludCBkZXZfbW9kZSkNCnsNCg0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KCXByaW50ZigiJXM6IHN0YXJ0IGRldl9tb2RlPSVkIVxuIixfX2Z1bmNfXywgZGV2X21vZGUpOw0KDQoJaWYgKChkZXZfbW9kZSA8IFRfT1VUUFVUX0hBTkRTRVQgKSB8fChkZXZfbW9kZSA+PSBUX09VVFBVVF9NQVgpKXsNCgkJcHJpbnRmKCIlczogZGV2X21vZGUgbm90IHN1cHBvcnQsIGRldl9tb2RlPSVkIVxuIixfX2Z1bmNfXywgZGV2X21vZGUpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCiNpZmRlZiBfQUxTQV9DT0RFQ19JTl9DQVANCgltaXhfc2V0X3ZwX3BhdGgodm9pY2VfbWl4ZXIsZGV2X21vZGUpOw0KDQojZWxzZQ0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9zZXRfdm9pY2VfcGF0aCh2b2ljZV9taXhlciwgZGV2X21vZGUpOw0KI2VuZGlmDQoNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoNCglyZXR1cm4gMDsNCgkNCgkNCn0NCg0KDQppbnQgc2NfYXVkaW9fZ2V0X3ZvaWNlX2RldmljZV9tb2RlKGludCAqcF9kZXZfbW9kZSkNCnsNCiAgICBpbnQgcmV0ID0gMDsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCglwcmludGYoIiVzOiBzdGFydCFcbiIsX19mdW5jX18pOw0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9nZXRfdnBfcGF0aCh2b2ljZV9taXhlciwgcF9kZXZfbW9kZSk7DQoNCgkNCglpZigoKnBfZGV2X21vZGUgPCBUX09VVFBVVF9IQU5EU0VUICkgfHwoKnBfZGV2X21vZGUgPj0gVF9PVVRQVVRfTUFYKSl7DQoJCXByaW50ZigiJXM6IGRldl9tb2RlIG5vdCBzdXBwb3J0LCAqcF9kZXZfbW9kZT0lZCFcbiIsX19mdW5jX18sICpwX2Rldl9tb2RlKTsNCgkJcmV0ID0gLTE7DQoJfQ0KCXByaW50ZigiJXM6IHN0YXJ0ICpwX2Rldl9tb2RlPSVkIVxuIixfX2Z1bmNfXywgKnBfZGV2X21vZGUpOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7DQoNCglyZXR1cm4gcmV0Ow0KCQ0KfQ0KDQoNCmludCBzY19hdWRpb19zZXRfcnhfdm9pY2Vfdm9sKGludCB2b2wpDQp7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoJcHJpbnRmKCIlczogc3RhcnQgdm9sPSVkIVxuIixfX2Z1bmNfXywgdm9sKTsNCg0KCWlmICgodm9sIDwgMCApIHx8KHZvbCA+IDExKSl7DQoJCXByaW50ZigiJXM6IHZvbCBub3Qgc3VwcG9ydCwgdm9sPSVkIVxuIixfX2Z1bmNfXywgdm9sKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJdm9pY2VfbWl4ZXIgPSBtaXhlcl9vcGVuKFZPQ0lFX1NORF9DQVJEX05VTSk7DQoJaWYgKCF2b2ljZV9taXhlcikgew0KCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL2NvbmZpZyBtaXhlciBkZXYNCgltaXhfc2V0X3ZvaWNlX3ZvbCh2b2ljZV9taXhlciwgdm9sKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoNCglyZXR1cm4gMDsNCg0KDQoJDQoJDQp9DQoNCg0KDQppbnQgc2NfYXVkaW9fZ2V0X3J4X3ZvaWNlX3ZvbChpbnQgICAgICogcF92b2wpDQp7DQogICAgaW50IHJldCA9IDA7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoNCglwcmludGYoIiVzOiBzdGFydCFcbiIsX19mdW5jX18pOw0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9nZXRfdm9pY2Vfdm9sKHZvaWNlX21peGVyLCBwX3ZvbCk7DQoJDQoNCglpZiAoKCpwX3ZvbCA8IDAgKSB8fCgqcF92b2wgPiAxMSkpew0KCQlwcmludGYoIiVzOiB2b2wgbm90IHN1cHBvcnQsICpwX3ZvbD0lZCFcbiIsX19mdW5jX18sICpwX3ZvbCk7DQoJCXJldCA9IC0xOw0KCX0NCglwcmludGYoIiVzOiAgKnBfdm9sPSVkIVxuIixfX2Z1bmNfXywgKnBfdm9sKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoNCglyZXR1cm4gcmV0Ow0KDQoJDQoJDQp9DQoNCg0KDQppbnQgc2NfYXVkaW9fc2V0X3R4X3ZvaWNlX3ZvbChpbnQgdm9sKQ0Kew0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KCXByaW50ZigiJXM6IHN0YXJ0IHZvbD0lZCFcbiIsX19mdW5jX18sIHZvbCk7DQoNCglpZiAoKHZvbCA8IDAgKSB8fCh2b2wgPiAxMSkpew0KCQlwcmludGYoIiVzOiB2b2wgbm90IHN1cHBvcnQsIHZvbD0lZCFcbiIsX19mdW5jX18sIHZvbCk7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X3NldF90eF92b2ljZV92b2wodm9pY2VfbWl4ZXIsIHZvbCk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsNCg0KDQoJcmV0dXJuIDA7DQoJDQoJDQp9DQoNCg0KDQppbnQgc2NfYXVkaW9fZ2V0X3R4X3ZvaWNlX3ZvbChpbnQgICpwX3ZvbCkNCnsNCiAgICBpbnQgcmV0ID0gMDsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCglwcmludGYoIiVzOiBzdGFydCFcbiIsX19mdW5jX18pOw0KDQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X2dldF90eF92b2ljZV92b2wodm9pY2VfbWl4ZXIsIHBfdm9sKTsNCgkNCg0KCWlmKCgqcF92b2wgPCAwICkgfHwoKnBfdm9sID4gNSkpew0KCQlwcmludGYoIiVzOiB2b2wgbm90IHN1cHBvcnQsICpwX3ZvbD0lZCFcbiIsX19mdW5jX18sICpwX3ZvbCk7DQoJCXJldCA9IC0xOw0KCX0NCglwcmludGYoIiVzOiAgKnBfdm9sPSVkIVxuIixfX2Z1bmNfXywgKnBfdm9sKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOwkNCiAgICByZXR1cm4gcmV0OwkNCn0NCg0KDQoNCmludCBzY19hdWRpb19zZXRfdHhfdm9pY2VfbXV0ZV9zdGF0ZShpbnQgbXV0ZSAgICAgICAgICkNCnsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCglwcmludGYoIiVzOiBzdGFydCBtdXRlPSVkIVxuIixfX2Z1bmNfXywgbXV0ZSk7DQoNCglpZigobXV0ZSAhPSAwICkgJiYobXV0ZSAhPSAxKSkgew0KCQlwcmludGYoIiVzOiBtdXRlIG5vdCBzdXBwb3J0LCBtdXRlPSVkIVxuIixfX2Z1bmNfXywgbXV0ZSk7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X3NldF92b2ljZV9tdXRlKHZvaWNlX21peGVyLCBtdXRlKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KICAgIHJldHVybiAwOwkNCgkNCn0NCg0KaW50IHNjX2F1ZGlvX2dldF90eF92b2ljZV9tdXRlX3N0YXRlKGludCAqcF9tdXRlKQ0Kew0KICAgIGludCByZXQgPSAwOw0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoJcHJpbnRmKCIlczogc3RhcnQhXG4iLF9fZnVuY19fKTsNCg0KCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJdm9pY2VfbWl4ZXIgPSBtaXhlcl9vcGVuKFZPQ0lFX1NORF9DQVJEX05VTSk7DQoJaWYgKCF2b2ljZV9taXhlcikgew0KCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL2NvbmZpZyBtaXhlciBkZXYNCgltaXhfZ2V0X3ZvaWNlX211dGUodm9pY2VfbWl4ZXIsIHBfbXV0ZSk7DQoJDQoNCglpZigoKnBfbXV0ZSAhPSAwICkgJiYoKnBfbXV0ZSAhPSAxKSkgew0KCQlwcmludGYoIiVzOiAqcF9tdXRlIG5vdCBzdXBwb3J0LCAqcF9tdXRlPSVkIVxuIixfX2Z1bmNfXywgKnBfbXV0ZSk7DQoJCQkNCgkJcmV0ID0gLTE7DQoJfQ0KCXByaW50ZigiJXM6ICAqcF9tdXRlPSVkIVxuIixfX2Z1bmNfXywgKnBfbXV0ZSk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsJDQoNCiAgICByZXR1cm4gcmV0Ow0KfQ0KDQoNCg0KDQoNCg0KDQppbnQgc2NfYXVkaW9fc2V0X3J4X3ZvaWNlX211dGVfc3RhdGUoaW50IG11dGUpIA0Kew0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KCXByaW50ZigiJXM6IHN0YXJ0IG11dGU9JWQhXG4iLF9fZnVuY19fLCBtdXRlKTsNCg0KCWlmKChtdXRlICE9IDAgKSAmJihtdXRlICE9IDEpKSB7DQoJCXByaW50ZigiJXM6IG11dGUgbm90IHN1cHBvcnQsIG11dGU9JWQhXG4iLF9fZnVuY19fLCBtdXRlKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJdm9pY2VfbWl4ZXIgPSBtaXhlcl9vcGVuKFZPQ0lFX1NORF9DQVJEX05VTSk7DQoJaWYgKCF2b2ljZV9taXhlcikgew0KCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL2NvbmZpZyBtaXhlciBkZXYNCgltaXhfc2V0X3J4X3ZvaWNlX211dGUodm9pY2VfbWl4ZXIsIG11dGUpOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7DQogICAgcmV0dXJuIDA7CQ0KCQ0KfQ0KDQoNCmludCBzY19hdWRpb19nZXRfcnhfdm9pY2VfbXV0ZV9zdGF0ZShpbnQgKnBfbXV0ZSkNCnsNCiAgICBpbnQgcmV0ID0gMDsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCg0KCXByaW50ZigiJXM6IHN0YXJ0IVxuIixfX2Z1bmNfXyk7DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X2dldF9yeF92b2ljZV9tdXRlKHZvaWNlX21peGVyLCBwX211dGUpOw0KCQ0KCWlmKCgqcF9tdXRlICE9IDAgKSAmJigqcF9tdXRlICE9IDEpKSB7DQoNCgkJcHJpbnRmKCIlczogKnBfbXV0ZSBub3Qgc3VwcG9ydCwgKnBfbXV0ZT0lZCFcbiIsX19mdW5jX18sICpwX211dGUpOw0KCQlyZXQgPSAtMTsNCgl9DQoJcHJpbnRmKCIlczogICpwX211dGU9JWQhXG4iLF9fZnVuY19fLCAqcF9tdXRlKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOwkNCg0KICAgIHJldHVybiByZXQ7DQoNCn0NCg0KaW50IHNjX2F1ZGlvX3NldF9sb29wYmFja19lbmFibGVfc3RhdGUoaW50IGVuYWJsZSkNCnsNCiAgICByZXR1cm4gMDsNCn0NCg0KaW50IHNjX2F1ZGlvX2dldF9sb29wYmFja19lbmFibGVfc3RhdGUoaW50ICpwX2VuYWJsZSkNCnsNCiAgICByZXR1cm4gMDsNCn0NCg0KaW50IGFwX2F1ZGlvX3NldF9sb29wYmFja19lbmFibGUoaW50IGRldl9tb2RlLGludCBlbmFibGUpDQp7DQoNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCiAgICBpbnQgcmV0ID0gMDsNCiAgICBzdHJ1Y3QgcGNtX2NvbmZpZyBjb25maWdfdm9pY2UgPSB7MH07DQoNCgkNCglwcmludGYoIiVzOiBzdGFydCBkZXZfbW9kZT0lZCxlbmFibGU9JWQhXG4iLF9fZnVuY19fLCBkZXZfbW9kZSxlbmFibGUpOw0KDQoJaWYgKChkZXZfbW9kZSA8IFRfT1VUUFVUX0hBTkRTRVQgKSB8fChkZXZfbW9kZSA+PSBUX09VVFBVVF9NQVgpKXsNCgkJcHJpbnRmKCIlczogZGV2X21vZGUgbm90IHN1cHBvcnQsIGRldl9tb2RlPSVkIVxuIixfX2Z1bmNfXywgZGV2X21vZGUpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KCWlmICgoZW5hYmxlICE9IDAgKSYmKGVuYWJsZSAhPSAxKSl7DQoJCXByaW50ZigiJXM6IGVuYWJsZSB2YWwgbm90IHN1cHBvcnQsIGVuYWJsZT0lZCFcbiIsX19mdW5jX18sIGVuYWJsZSk7DQoJCXJldHVybiAtMTsNCgl9DQoJaWYoZW5hYmxlID09IDEpew0KDQoJCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCQlpZiAoIXZvaWNlX21peGVyKSB7DQoJCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCQlyZXR1cm4gLTE7DQoJCX0NCg0KCQkvL2NvbmZpZyBtaXhlciBkZXYNCgkJcmV0ID0gbWl4X3NldF92b2ljZV9wYXRoKHZvaWNlX21peGVyLCBkZXZfbW9kZSk7DQoJCXByaW50ZigibWl4X3NldF92b2ljZV9wYXRoIHJldD0lZCFcbiIscmV0KTsNCgkJDQoJCXJldCA9IG1peF9zZXRfdnBsb29wKHZvaWNlX21peGVyLCBkZXZfbW9kZSk7DQoJCXByaW50ZigibWl4X3NldF92cGxvb3AgcmV0PSVkIVxuIixyZXQpOw0KDQoJCS8vY2xvc2UgbWl4ZXINCgkJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCQl2b2ljZV9taXhlciA9IE5VTEw7DQoNCgkJDQoNCg0KDQoJCQ0KCX0NCgllbHNlew0KDQoJCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCQlpZiAoIXZvaWNlX21peGVyKSB7DQoJCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCQlyZXR1cm4gLTE7DQoJCX0NCg0KDQoJICAgIHJldCA9IG1peF9zZXRfdnBsb29wKHZvaWNlX21peGVyLCBWUF9QQVRIX09GRik7DQoJCS8vY2xvc2UgbWl4ZXINCgkJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCQl2b2ljZV9taXhlciA9IE5VTEw7DQoNCgkJDQoJCXByaW50ZigibWl4X3NldF92cGxvb3Agb2ZmIGVuZCByZXQ9JWQhXG4iLHJldCk7DQoJCQ0KCQkNCgkNCg0KDQoJfQ0KIA0KCS8vcmV0dXJuIDA7DQoNCglwcmludGYoIiVzOiBlbmQgZW5hYmxlPSVkIVxuIixfX2Z1bmNfXywgZW5hYmxlKTsNCg0KCXJldHVybiByZXQ7DQoJDQoJDQp9DQoNCg0KDQppbnQgYXBfYXVkaW9fZ2V0X2xvb3BiYWNrX2VuYWJsZShpbnQgKnBfZW5hYmxlKQ0Kew0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KCWludCByZXQgPSAwOw0KCXByaW50ZigiJXM6IHN0YXJ0IVxuIixfX2Z1bmNfXyk7DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJcmV0ID0gbWl4X2dldF92cGxvb3Aodm9pY2VfbWl4ZXIsIHBfZW5hYmxlKTsNCglpZigoKnBfZW5hYmxlICE9IDAgKSAmJigqcF9lbmFibGUgIT0gMSkpew0KCQlwcmludGYoIiVzOiBwX2VuYWJsZSBub3Qgc3VwcG9ydCwgKnBfZW5hYmxlPSVkIVxuIixfX2Z1bmNfXywgKnBfZW5hYmxlKTsNCgkJcmV0ID0gLTE7DQoJfQ0KCXByaW50ZigiJXM6IGVuZCAqcF9lbmFibGU9JWQhXG4iLF9fZnVuY19fLCAqcF9lbmFibGUpOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7DQoNCglyZXR1cm4gcmV0Ow0KCQ0KfQ0KDQoNCg==