--279707905-510690642-867706439=:867
Content-Type: TEXT/PLAIN; charset=US-ASCII
I finally got around to testing my flow-control mods to nrsdrv.c.
As I had suspected, the version in ax25-utils has backward sense
and other problems. This version isn't optimal ... it has two
tight loops that should be able to be replaced with system calls.
But I couldn't get the system calls to work, so tight loops are better
than nothing.
The attached version works, when connected to a hexipus using the
same cable that JNOS would use, as documented in its README.NOW file.
In case you don't have that, here's what I used:
PC HEXIPUS
==================== | With a 4.7k Ohm resistor on the PC
TXD 3(2) -- 2(3) RXD | end of the cable, running from DTR
RXD 2(3) -- 3(2) TXD | to CTS.
GND 5(7) -- 5(7) GND |
RTS 7(4) -- 8(5) CTS | Pin numbers are for a 9 pin connector,
CTS 8(5) -- 7(4) RTS | (or 25-pin, in parentheses).
DTR 4(20) asserted |
-- Dave | Email: nxpffd@roskapostia.tunk.net Brown | Packet: N2RJT@WB2PSI.#WNY.NY.USA.NOAM--279707905-510690642-867706439=:867 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="nrsdrv.c" Content-Transfer-Encoding: BASE64 Content-ID: <terhi.victor@logonet.com> Content-Description: nrsdrv.c
I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5j bHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVk ZSA8dGVybWlvcy5oPg0KI2luY2x1ZGUgPGZjbnRsLmg+DQojaW5jbHVkZSA8 c2lnbmFsLmg+DQojaW5jbHVkZSA8Y3R5cGUuaD4NCiNpbmNsdWRlIDxuZXRk Yi5oPg0KI2luY2x1ZGUgPHN5c2xvZy5oPg0KDQojaW5jbHVkZSA8c3lzL3Rp bWUuaD4NCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCiNpbmNsdWRlIDxzeXMv c3RhdC5oPg0KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4NCiNpbmNsdWRlIDxz eXMvaW9jdGwuaD4NCg0KI2luY2x1ZGUgImNvbmZpZy5oIg0KI2luY2x1ZGUg ImRhZW1vbi5oIg0KI2luY2x1ZGUgInR0eXV0aWxzLmgiDQojaW5jbHVkZSAi dmVyc2lvbi5oIg0KDQpzdGF0aWMgaW50IGtpc3NmZCwgbnJzZmQ7DQpzdGF0 aWMgaW50IGxvZ2dpbmcgPSBGQUxTRTsNCnN0YXRpYyBpbnQgZGVidWdnaW5n ID0gRkFMU0U7DQpzdGF0aWMgaW50IGZsb3djb250cm9sID0gRkFMU0U7DQpz dGF0aWMgY2hhciAqa2lzc2RldiwgKm5yc2RldjsNCg0KI2RlZmluZQlOVUwJ CTAwMA0KI2RlZmluZQlTVFgJCTAwMg0KI2RlZmluZQlFVFgJCTAwMw0KI2Rl ZmluZQlETEUJCTAyMA0KDQojZGVmaW5lCU5SU19XQUlUCTANCiNkZWZpbmUJ TlJTX0RBVEEJMQ0KI2RlZmluZQlOUlNfRVNDQVBFCTINCiNkZWZpbmUJTlJT X0NLU1VNCTMNCnN0YXRpYyBpbnQgbnJzX3N0YXRlID0gTlJTX1dBSVQ7DQoN CnN0YXRpYyB1bnNpZ25lZCBjaGFyIG5yc19ja3N1bSA9IDA7DQoNCnN0YXRp YyB1bnNpZ25lZCBjaGFyIG5yc19yeGJ1ZmZlcls1MTJdOw0Kc3RhdGljIGlu dCBucnNfcnhjb3VudCA9IDA7DQoNCiNkZWZpbmUJRkVORAkJMDMwMA0KI2Rl ZmluZQlGRVNDCQkwMzMzDQojZGVmaW5lCUZFU0NFTkQJCTAzMzQNCiNkZWZp bmUJRkVTQ0VTQwkJMDMzNQ0KDQojZGVmaW5lCUtJU1NfV0FJVAkwDQojZGVm aW5lCUtJU1NfQ1RSTAkxDQojZGVmaW5lCUtJU1NfREFUQQkyDQojZGVmaW5l CUtJU1NfRVNDQVBFCTMNCnN0YXRpYyBpbnQga2lzc19zdGF0ZSA9IEtJU1Nf V0FJVDsNCg0Kc3RhdGljIHVuc2lnbmVkIGNoYXIga2lzc19yeGJ1ZmZlcls1 MTJdOw0Kc3RhdGljIGludCBraXNzX3J4Y291bnQgPSAwOw0KDQpzdGF0aWMg dm9pZCB0ZXJtaW5hdGUoaW50IHNpZykNCnsNCglpZiAobG9nZ2luZykgew0K CQlzeXNsb2coTE9HX0lORk8sICJ0ZXJtaW5hdGluZyBvbiBTSUdURVJNXG4i KTsNCgkJY2xvc2Vsb2coKTsNCgl9DQoNCgl0dHlfdW5sb2NrKGtpc3NkZXYp Ow0KCXR0eV91bmxvY2sobnJzZGV2KTsNCg0KCWV4aXQoMCk7DQp9DQoNCnN0 YXRpYyB2b2lkIGtleV9ydHMoaW50IGZkKQ0Kew0KCWludCBzdGF0dXM7DQoJ aW50IGN0czsNCg0KCWlmICghZmxvd2NvbnRyb2wpDQoJCXJldHVybjsNCg0K CS8qIFdhaXQgZm9yIENUUyB0byBiZSBoaWdoICovDQoJd2hpbGUgKDEpIHsN CgkJLyogR2V0IENUUyBzdGF0dXMgKi8NCiAgICAgICAgICAgICAgICBpZiAo aW9jdGwoZmQsIFRJT0NNR0VULCAmc3RhdHVzKSA8IDApIHsNCgkJCXN5c2xv ZyhMT0dfSU5GT3xMT0dfRVJSLCAiVElPQ01HRVQgZmFpbGVkOiBmbG93Y29u dHJvbCBkaXNhYmxlZCAoJW0pXG4iKTsNCgkJCWZsb3djb250cm9sID0gMDsN CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAg ICAgICB9DQoJCWlmICghKHN0YXR1cyAmIFRJT0NNX0NUUykpIHsNCgkJCWlm IChkZWJ1Z2dpbmcpIHsNCgkJCQlmcHJpbnRmKHN0ZGVyciwiQ1RTIGxvdzog d2FpdGluZ1xuIik7DQoJCQl9DQojaWZkZWYgbm90ZGVmDQovKiBUaGlzIHNl ZW1zIGNvcnJlY3QgdG8gbWUsIGJ1dCBpdCBkb2Vzbid0IHdvcmsuICAtLSBO MlJKVCAqLw0KCQkJY3RzID0gVElPQ01fQ1RTOw0KICAgICAgICAgICAgICAg IAlpb2N0bChmZCwgVElPQ01JV0FJVCwgJmN0cyk7DQojZWxzZQ0KCQkJdXNs ZWVwKDIwMEwpOwkgLyogVGFrZSBhIHNob3J0IG5hcCAqLw0KI2VuZGlmDQoJ CX0gZWxzZSB7DQoJCQlicmVhazsNCgkJfQ0KCX0NCg0KCWlmIChkZWJ1Z2dp bmcpIHsNCgkJZnByaW50ZihzdGRlcnIsIkNUUyBoaWdoOiBrZXlpbmcgUlRT XG4iKTsNCgl9DQoJc3RhdHVzICY9IH5USU9DTV9SVFM7DQogICAgICAgIHN0 YXR1cyB8PSBUSU9DTV9EVFI7DQogICAgICAgIGlmIChpb2N0bChmZCwgVElP Q01TRVQsICZzdGF0dXMpIDwgMCkgew0KCQlzeXNsb2coTE9HX0lORk98TE9H X0VSUiwgIlRJT0NNR0VUIGZhaWxlZDogZmxvd2NvbnRyb2wgZGlzYWJsZWQg KCVtKVxuIik7DQoJCWZsb3djb250cm9sID0gMDsNCiAgICAgICAgfQ0KfQ0K DQpzdGF0aWMgdm9pZCB1bmtleV9ydHMoaW50IGZkKQ0Kew0KCWludCBzdGF0 dXM7DQoNCglpZiAoIWZsb3djb250cm9sKQ0KCQlyZXR1cm47DQoNCglpZiAo ZGVidWdnaW5nKSB7DQoJCWZwcmludGYoc3RkZXJyLCJ1bmtleV9ydHM6IHdh aXRpbmcgZm9yIFRYIHF1ZXVlIHRvIGRyYWluXG4iKTsNCgl9DQoJd2hpbGUg KDEpIHsNCiAgICAgICAgCWlvY3RsKGZkLCBUSU9DU0VSR0VUTFNSLCAmc3Rh dHVzKTsNCgkJaWYgKHN0YXR1cyA9PSBUSU9DU0VSX1RFTVQpDQoJCQlicmVh azsNCgkJdXNsZWVwKDIwMEwpOwkgLyogVGFrZSBhIHNob3J0IG5hcCwgc2F2 ZSBzb21lIGN5Y2xlcyAqLw0KCX0NCglpZiAoZGVidWdnaW5nKSB7DQoJCWZw cmludGYoc3RkZXJyLCJUcmFuc21pc3Npb24gZmluaXNoZWQ6IHVua2V5aW5n IFJUU1xuIik7DQoJfQ0KICAgICAgICBpb2N0bChmZCwgVElPQ01HRVQsICZz dGF0dXMpOw0KCXN0YXR1cyB8PSBUSU9DTV9SVFMgfCBUSU9DTV9EVFI7DQog ICAgICAgIGlmIChpb2N0bChmZCwgVElPQ01TRVQsICZzdGF0dXMpIDwgMCkg ew0KCQlzeXNsb2coTE9HX0lORk98TE9HX0VSUiwgIlRJT0NNR0VUIGZhaWxl ZDogZmxvd2NvbnRyb2wgZGlzYWJsZWQgKCVtKVxuIik7DQoJCWZsb3djb250 cm9sID0gMDsNCiAgICAgICAgfQ0KfQ0KDQpzdGF0aWMgdm9pZCB1bmtleV9u cnNfcnRzKHZvaWQpIA0Kew0KCXVua2V5X3J0cyhucnNmZCk7DQp9DQoNCnN0 YXRpYyB2b2lkIG5yc19lc2ModW5zaWduZWQgY2hhciAqcywgaW50IGxlbikN CnsNCglzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXJbNTEyXTsNCgl1bnNp Z25lZCBjaGFyICpwdHIgPSBidWZmZXI7DQoJdW5zaWduZWQgY2hhciBjc3Vt ID0gMDsNCgl1bnNpZ25lZCBjaGFyIGM7DQoNCgkqcHRyKysgPSBTVFg7DQoN Cgl3aGlsZSAobGVuLS0gPiAwKSB7DQoJCXN3aXRjaCAoYyA9ICpzKyspIHsN CgkJCWNhc2UgU1RYOg0KCQkJY2FzZSBFVFg6DQoJCQljYXNlIERMRToNCgkJ CQkqcHRyKysgPSBETEU7DQoJCQkJLyogRmFsbCB0aHJvdWdoICovDQoJCQlk ZWZhdWx0Og0KCQkJCSpwdHIrKyA9IGM7DQoJCQkJYnJlYWs7DQoJCX0NCgkJ DQoJCWNzdW0gKz0gYzsNCgl9DQoNCgkqcHRyKysgPSBFVFg7DQoJKnB0cisr ID0gY3N1bTsNCgkqcHRyKysgPSBOVUw7DQoJKnB0cisrID0gTlVMOw0KDQoJ a2V5X3J0cyhucnNmZCk7DQoJd3JpdGUobnJzZmQsIGJ1ZmZlciwgcHRyIC0g YnVmZmVyKTsNCgl1bmtleV9ydHMobnJzZmQpOw0KfQ0KDQpzdGF0aWMgdm9p ZCBraXNzX2VzYyh1bnNpZ25lZCBjaGFyICpzLCBpbnQgbGVuKQ0Kew0KCXN0 YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls1MTJdOw0KCXVuc2lnbmVkIGNo YXIgKnB0ciA9IGJ1ZmZlcjsNCgl1bnNpZ25lZCBjaGFyIGM7DQoNCgkqcHRy KysgPSBGRU5EOw0KCSpwdHIrKyA9IDB4MDA7CQkvKiBLSVNTIERBVEEgKi8N Cg0KCXdoaWxlIChsZW4tLSA+IDApIHsNCgkJc3dpdGNoIChjID0gKnMrKykg ew0KCQkJY2FzZSBGRVNDOg0KCQkJCSpwdHIrKyA9IEZFU0M7DQoJCQkJKnB0 cisrID0gRkVTQ0VTQzsNCgkJCQlicmVhazsNCgkJCWNhc2UgRkVORDoNCgkJ CQkqcHRyKysgPSBGRVNDOw0KCQkJCSpwdHIrKyA9IEZFU0NFTkQ7DQoJCQkJ YnJlYWs7DQoJCQlkZWZhdWx0Og0KCQkJCSpwdHIrKyA9IGM7DQoJCQkJYnJl YWs7DQoJCX0NCgl9DQoNCgkqcHRyKysgPSBGRU5EOw0KDQoJd3JpdGUoa2lz c2ZkLCBidWZmZXIsIHB0ciAtIGJ1ZmZlcik7DQp9DQoNCnN0YXRpYyB2b2lk IG5yc191bmVzYyh1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4pDQp7 DQoJaW50IGk7DQoJDQoJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQoJ CXN3aXRjaCAobnJzX3N0YXRlKSB7DQoJCQljYXNlIE5SU19XQUlUOg0KCQkJ CWlmIChidWZmZXJbaV0gPT0gU1RYKSB7DQoJCQkJCW5yc19zdGF0ZSAgID0g TlJTX0RBVEE7DQoJCQkJCW5yc19yeGNvdW50ID0gMDsNCgkJCQkJbnJzX2Nr c3VtICAgPSAwOw0KCQkJCX0NCgkJCQlicmVhazsNCg0KCQkJY2FzZSBOUlNf REFUQToNCgkJCQlzd2l0Y2ggKGJ1ZmZlcltpXSkgewkNCgkJCQkJY2FzZSBT VFg6CS8qICEhICovDQoJCQkJCQlucnNfcnhjb3VudCA9IDA7DQoJCQkJCQlu cnNfY2tzdW0gICA9IDA7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSBETEU6 DQoJCQkJCQlucnNfc3RhdGUgPSBOUlNfRVNDQVBFOw0KCQkJCQkJYnJlYWs7 DQoJCQkJCWNhc2UgRVRYOg0KCQkJCQkJbnJzX3N0YXRlID0gTlJTX0NLU1VN Ow0KCQkJCQkJYnJlYWs7DQoJCQkJCWRlZmF1bHQ6DQoJCQkJCQlpZiAobnJz X3J4Y291bnQgPCA1MTIpIHsNCgkJCQkJCQlucnNfY2tzdW0gKz0gYnVmZmVy W2ldOw0KCQkJCQkJCW5yc19yeGJ1ZmZlcltucnNfcnhjb3VudCsrXSA9IGJ1 ZmZlcltpXTsNCgkJCQkJCX0NCgkJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQli cmVhazsNCg0KCQkJY2FzZSBOUlNfRVNDQVBFOg0KCQkJCW5yc19zdGF0ZSA9 IE5SU19EQVRBOyANCgkJCQlpZiAobnJzX3J4Y291bnQgPCA1MTIpIHsNCgkJ CQkJbnJzX2Nrc3VtICs9IGJ1ZmZlcltpXTsNCgkJCQkJbnJzX3J4YnVmZmVy W25yc19yeGNvdW50KytdID0gYnVmZmVyW2ldOw0KCQkJCX0NCgkJCQlicmVh azsNCg0KCQkJY2FzZSBOUlNfQ0tTVU06DQoJCQkJaWYgKGJ1ZmZlcltpXSA9 PSBucnNfY2tzdW0pDQoJCQkJCWtpc3NfZXNjKG5yc19yeGJ1ZmZlciwgbnJz X3J4Y291bnQpOw0KCQkJCW5yc19zdGF0ZSAgID0gTlJTX1dBSVQ7DQoJCQkJ bnJzX2Nrc3VtICAgPSAwOw0KCQkJCW5yc19yeGNvdW50ID0gMDsNCgkJCQli cmVhazsNCgkJfQ0KCX0NCn0NCg0Kc3RhdGljIHZvaWQga2lzc191bmVzYyh1 bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4pDQp7DQoJaW50IGk7DQoJ DQoJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQoJCXN3aXRjaCAoa2lz c19zdGF0ZSkgew0KCQkJY2FzZSBLSVNTX1dBSVQ6DQoJCQkJaWYgKGJ1ZmZl cltpXSA9PSBGRU5EKSB7DQoJCQkJCWtpc3Nfc3RhdGUgICA9IEtJU1NfQ1RS TDsNCgkJCQkJa2lzc19yeGNvdW50ID0gMDsNCgkJCQl9DQoJCQkJYnJlYWs7 DQoNCgkJCWNhc2UgS0lTU19DVFJMOg0KCQkJCWlmICgoYnVmZmVyW2ldICYg MHgwRikgPT0gMHgwMCkgew0KCQkJCQlraXNzX3N0YXRlICAgPSBLSVNTX0RB VEE7DQoJCQkJCWtpc3Nfcnhjb3VudCA9IDA7DQoJCQkJfSBlbHNlIHsNCgkJ CQkJa2lzc19zdGF0ZSAgID0gS0lTU19XQUlUOw0KCQkJCQlraXNzX3J4Y291 bnQgPSAwOw0KCQkJCX0NCgkJCQlicmVhazsNCg0KCQkJY2FzZSBLSVNTX0RB VEE6DQoJCQkJc3dpdGNoIChidWZmZXJbaV0pIHsJDQoJCQkJCWNhc2UgRkVO RDoNCgkJCQkJCWlmIChraXNzX3J4Y291bnQgPiAyKQ0KCQkJCQkJCW5yc19l c2Moa2lzc19yeGJ1ZmZlciwga2lzc19yeGNvdW50KTsNCgkJCQkJCWtpc3Nf c3RhdGUgICA9IEtJU1NfV0FJVDsNCgkJCQkJCWtpc3Nfcnhjb3VudCA9IDA7 DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSBGRVNDOg0KCQkJCQkJa2lzc19z dGF0ZSA9IEtJU1NfRVNDQVBFOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWRlZmF1 bHQ6DQoJCQkJCQlpZiAoa2lzc19yeGNvdW50IDwgNTEyKQ0KCQkJCQkJCWtp c3NfcnhidWZmZXJba2lzc19yeGNvdW50KytdID0gYnVmZmVyW2ldOw0KCQkJ CQkJYnJlYWs7DQoJCQkJfQ0KCQkJCWJyZWFrOw0KDQoJCQljYXNlIEtJU1Nf RVNDQVBFOg0KCQkJCWtpc3Nfc3RhdGUgPSBLSVNTX0RBVEE7DQoJCQkJc3dp dGNoIChidWZmZXJbaV0pIHsNCgkJCQkJY2FzZSBGRVNDRVNDOg0KCQkJCQkJ aWYgKGtpc3Nfcnhjb3VudCA8IDUxMikNCgkJCQkJCQlraXNzX3J4YnVmZmVy W2tpc3Nfcnhjb3VudCsrXSA9IEZFU0M7DQoJCQkJCQlicmVhazsNCgkJCQkJ Y2FzZSBGRVNDRU5EOg0KCQkJCQkJaWYgKGtpc3Nfcnhjb3VudCA8IDUxMikN CgkJCQkJCQlraXNzX3J4YnVmZmVyW2tpc3Nfcnhjb3VudCsrXSA9IEZFTkQ7 DQoJCQkJCQlicmVhazsNCgkJCQl9DQoJCQkJYnJlYWs7DQoJCX0NCgl9DQp9 DQoNCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQoJc3Rh dGljIGNoYXIgYnVmZmVyWzUxMl07DQoJdW5zaWduZWQgaW50IHNwZWVkID0g MDsNCglmZF9zZXQgcmVhZF9mZDsNCglpbnQgYywgbjsNCg0KCXdoaWxlICgo YyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGZsczp2IikpICE9IC0xKSB7DQoJ CXN3aXRjaCAoYykgew0KCQkJY2FzZSAnZCc6DQoJCQkJZGVidWdnaW5nID0g VFJVRTsNCgkJCQlicmVhazsNCgkJCWNhc2UgJ2YnOg0KCQkJCWZsb3djb250 cm9sID0gVFJVRTsNCgkJCQlicmVhazsNCgkJCWNhc2UgJ2wnOg0KCQkJCWxv Z2dpbmcgPSBUUlVFOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAncyc6DQoJCQkJ aWYgKChzcGVlZCA9IGF0b2kob3B0YXJnKSkgPD0gMCkgew0KCQkJCQlmcHJp bnRmKHN0ZGVyciwgIm5yc2RydjogaW52YWxpZCBzcGVlZCAlc1xuIiwgb3B0 YXJnKTsNCgkJCQkJcmV0dXJuIDE7DQoJCQkJfQ0KCQkJCWJyZWFrOw0KCQkJ Y2FzZSAndic6DQoJCQkJcHJpbnRmKCJucnNkcnY6ICVzXG4iLCB2ZXJzaW9u KTsNCgkJCQlyZXR1cm4gMDsNCgkJCWNhc2UgJzonOg0KCQkJY2FzZSAnPyc6 DQoJCQkJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogbnJzZHJ2IFstZl0gWy1s XSBbLXMgc3BlZWRdIFstdl0ga2lzc3R0eSBucnN0dHlcbiIpOw0KCQkJCXJl dHVybiAxOw0KCQl9DQoJfQ0KDQoJaWYgKGRlYnVnZ2luZykgew0KCQlmcHJp bnRmKHN0ZGVyciwiRmxvdyBjb250cm9sICVzXG4iLCANCgkJCWZsb3djb250 cm9sID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7DQoJfQ0KDQoJaWYgKChh cmdjIC0gb3B0aW5kKSAhPSAyKSB7DQoJCWZwcmludGYoc3RkZXJyLCAidXNh Z2U6IG5yc2RydiBbLWZdIFstbF0gWy1zIHNwZWVkXSBbLXZdIGtpc3N0dHkg bnJzdHR5XG4iKTsNCgkJcmV0dXJuIDE7DQoJfQ0KDQoJa2lzc2RldiA9IGFy Z3Zbb3B0aW5kICsgMF07DQoJbnJzZGV2ICA9IGFyZ3Zbb3B0aW5kICsgMV07 DQoNCglpZiAodHR5X2lzX2xvY2tlZChraXNzZGV2KSkgew0KCQlmcHJpbnRm KHN0ZGVyciwgIm5yc2RydjogZGV2aWNlICVzIGFscmVhZHkgaW4gdXNlXG4i LCBhcmd2W29wdGluZF0pOw0KCQlyZXR1cm4gMTsNCgl9DQoNCglpZiAodHR5 X2lzX2xvY2tlZChucnNkZXYpKSB7DQoJCWZwcmludGYoc3RkZXJyLCAibnJz ZHJ2OiBkZXZpY2UgJXMgYWxyZWFkeSBpbiB1c2VcbiIsIGFyZ3Zbb3B0aW5k ICsgMV0pOw0KCQlyZXR1cm4gMTsNCgl9DQoNCglpZiAoKGtpc3NmZCA9IG9w ZW4oa2lzc2RldiwgT19SRFdSKSkgPT0gLTEpIHsNCgkJcGVycm9yKCJucnNk cnY6IG9wZW4ga2lzcyBkZXZpY2UiKTsNCgkJcmV0dXJuIDE7DQoJfQ0KDQoJ aWYgKChucnNmZCA9IG9wZW4obnJzZGV2LCBPX1JEV1IpKSA9PSAtMSkgew0K CQlwZXJyb3IoIm5yc2Rydjogb3BlbiBucnMgZGV2aWNlIik7DQoJCXJldHVy biAxOw0KCX0NCg0KCXR0eV9sb2NrKGtpc3NkZXYpOw0KCXR0eV9sb2NrKG5y c2Rldik7DQoNCglpZiAoIXR0eV9yYXcoa2lzc2ZkLCBGQUxTRSkpIHsNCgkJ dHR5X3VubG9jayhraXNzZGV2KTsNCgkJdHR5X3VubG9jayhucnNkZXYpOw0K CQlyZXR1cm4gMTsNCgl9DQoNCglpZiAoIXR0eV9yYXcobnJzZmQsIEZBTFNF KSkgew0KCQl0dHlfdW5sb2NrKGtpc3NkZXYpOw0KCQl0dHlfdW5sb2NrKG5y c2Rldik7DQoJCXJldHVybiAxOw0KCX0NCg0KCWlmIChzcGVlZCAhPSAwICYm ICF0dHlfc3BlZWQoa2lzc2ZkLCBzcGVlZCkpIHsNCgkJdHR5X3VubG9jayhr aXNzZGV2KTsNCgkJdHR5X3VubG9jayhucnNkZXYpOw0KCQlyZXR1cm4gMTsN Cgl9DQoNCglpZiAoc3BlZWQgIT0gMCAmJiAhdHR5X3NwZWVkKG5yc2ZkLCBz cGVlZCkpIHsNCgkJdHR5X3VubG9jayhraXNzZGV2KTsNCgkJdHR5X3VubG9j ayhucnNkZXYpOw0KCQlyZXR1cm4gMTsNCgl9DQoNCglpZiAobG9nZ2luZykg ew0KCQlvcGVubG9nKCJucnNkcnYiLCBMT0dfUElELCBMT0dfREFFTU9OKTsN CgkJc3lzbG9nKExPR19JTkZPLCAiS0lTUyBkZXZpY2UgJXMgY29ubmVjdGVk IHRvIE5SUyBkZXZpY2UgJXNcbiIsIGFyZ3Zbb3B0aW5kICsgMF0sIGFyZ3Zb b3B0aW5kICsgMV0pOw0KCX0NCgkJDQoJc2lnbmFsKFNJR0hVUCwgU0lHX0lH Tik7DQoJc2lnbmFsKFNJR1RFUk0sIHRlcm1pbmF0ZSk7DQoNCgkvKg0KCSAq IEJlY29tZSBhIGRhZW1vbiBpZiB3ZSBjYW4uDQoJICovDQoJaWYgKCFkYWVt b25fc3RhcnQoRkFMU0UpKSB7DQoJCWZwcmludGYoc3RkZXJyLCAibnJzZHJ2 OiBjYW5ub3QgYmVjb21lIGEgZGFlbW9uXG4iKTsNCgkJdHR5X3VubG9jayhr aXNzZGV2KTsNCgkJdHR5X3VubG9jayhucnNkZXYpOw0KCQlyZXR1cm4gMTsN Cgl9DQoNCglpZiAoZmxvd2NvbnRyb2wpIHsNCgkJdW5rZXlfbnJzX3J0cygp Ow0KCQlhdGV4aXQodW5rZXlfbnJzX3J0cyk7DQoJfQ0KDQoJYyA9ICgoa2lz c2ZkID4gbnJzZmQpID8ga2lzc2ZkIDogbnJzZmQpICsgMTsNCg0KCWZvciAo OzspIHsNCgkJRkRfWkVSTygmcmVhZF9mZCk7DQoJCQ0KCQlGRF9TRVQoa2lz c2ZkLCAmcmVhZF9mZCk7DQoJCUZEX1NFVChucnNmZCwgJnJlYWRfZmQpOw0K DQoJCW4gPSBzZWxlY3QoYywgJnJlYWRfZmQsIE5VTEwsIE5VTEwsIE5VTEwp Ow0KDQoJCWlmIChGRF9JU1NFVChraXNzZmQsICZyZWFkX2ZkKSkgew0KCQkJ aWYgKChuID0gcmVhZChraXNzZmQsIGJ1ZmZlciwgNTEyKSkgPD0gMCkgew0K CQkJCWlmIChsb2dnaW5nKSB7DQoJCQkJCXN5c2xvZyhMT0dfSU5GTywgInRl cm1pbmF0aW5nIG9uIEtJU1MgZGV2aWNlIGNsb3N1cmVcbiIpOw0KCQkJCQlj bG9zZWxvZygpOw0KCQkJCX0NCgkJCQlicmVhazsNCgkJCX0NCgkJCWtpc3Nf dW5lc2MoYnVmZmVyLCBuKTsNCgkJfQ0KCQkNCgkJaWYgKEZEX0lTU0VUKG5y c2ZkLCAmcmVhZF9mZCkpIHsNCgkJCWlmICgobiA9IHJlYWQobnJzZmQsIGJ1 ZmZlciwgNTEyKSkgPD0gMCkgew0KCQkJCWlmIChsb2dnaW5nKSB7DQoJCQkJ CXN5c2xvZyhMT0dfSU5GTywgInRlcm1pbmF0aW5nIG9uIE5SUyBkZXZpY2Ug Y2xvc3VyZVxuIik7DQoJCQkJCWNsb3NlbG9nKCk7DQoJCQkJfQ0KCQkJCWJy ZWFrOw0KCQkJfQ0KCQkJbnJzX3VuZXNjKGJ1ZmZlciwgbik7DQoJCX0NCgl9 DQoNCgl0dHlfdW5sb2NrKGtpc3NkZXYpOw0KCXR0eV91bmxvY2sobnJzZGV2 KTsNCg0KCXJldHVybiAwOw0KfQ0K --279707905-510690642-867706439=:867--