ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJ3bGFuX2ludGVyZmFjZS9icm9hZGNvbV9pbnRlcmZhY2UuYyBiL2FwL2xpYi9saWJ3bGFuX2ludGVyZmFjZS9icm9hZGNvbV9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MTU4OWQyCi0tLSAvZGV2L251bGwKKysrIGIvYXAvbGliL2xpYndsYW5faW50ZXJmYWNlL2Jyb2FkY29tX2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsNzY3IEBACisjaW5jbHVkZSA8c29mdGFwX2FwaS5oPg0KKyNpbmNsdWRlIDxlcnJuby5oPg0KKyNpbmNsdWRlICJ3bGFuX2ludGVyZmFjZS5oIg0KKw0KKyNkZWZpbmUgV0lGSV9TU0lEX0xFTiAzMw0KKw0KKyNkZWZpbmUgV0xBTl9TRUNVUklUWV9MRU4gMjANCisjZGVmaW5lIFdMQU5fRU5DUllUWVBFX0xFTiAxMA0KKyNkZWZpbmUgV0xBTl9ERUZBVUxUSURfTEVOIDINCisjZGVmaW5lIFdMQU5fV0VQS0VZX0xFTiAzMg0KKyNkZWZpbmUgV0xBTl9QU0tfTEVOIDY1DQorI2RlZmluZSBXTEFOX0VOQ09ERV9QU0tfTEVOIDEwMA0KKw0KKyNkZWZpbmUgV0ZfQVVfT1BFTiAgICAgICAgICAiT1BFTiIgICAgICAgICAgICAvL3dpZmkgYXV0aCBtb2RlPw0KKyNkZWZpbmUgV0ZfQVVfU0hBUkUgICAgICAgICAiU0hBUkVEIg0KKyNkZWZpbmUgV0ZfQVVfV0VQQVVUTyAgICAgICAiV0VQQVVUTyINCisjZGVmaW5lIFdGX0FVX1dQQSAgICAgICAgICAgIldQQVBTSyINCisjZGVmaW5lIFdGX0FVX1dQQTIgICAgICAgICAgIldQQTJQU0siDQorI2RlZmluZSBXRl9BVV9XUEFfV1BBMiAgCSJXUEFQU0tXUEEyUFNLIiANCisjZGVmaW5lIFdGX0FVX1dBUElQU0sJICAgICJXQVBJUFNLIg0KKyNkZWZpbmUgV0ZfRU5DUllfTk9ORSAgIk5PTkUiICAgLy9lbmNyeXB0DQorI2RlZmluZSBXRl9FTkNSWV9XRVAgICAgIldFUCINCisjZGVmaW5lIFdGX0VOQ1JZX1RLSVAgICAiVEtJUCINCisjZGVmaW5lIFdGX0VOQ1JZX0NDTVAgICJDQ01QIg0KKyNkZWZpbmUgV0ZfRU5DUllfQUVTICAgICJBRVMiDQorI2RlZmluZSBXRl9FTkNSWV9US0lQX0NDTVAgIlRLSVBDQ01QIg0KKyNkZWZpbmUgV0ZfRU5DUllfVEtJUF9BRVMgIlRLSVBBRVMiDQorDQorc3RhdGljIHZvaWQgenRlX3dsYW5fZ2V0X3dpZmlfc3RhdGlvbl9saXN0KFJUXzgwMl8xMV9NQUNfVEFCTEUgKnN0YWlvbmxpc3QpOw0KKw0KKw0KK3ZvaWQgenRlX3dsYW5fZ2V0X3dpZmlfbWFjX2xpc3QoUlRfODAyXzExX01BQ19UQUJMRSAqbWFjbGlzdCkNCit7DQorICAgIGludCBzID0gMDsNCisgICAgaW50IGsgPSAwOw0KKw0KKyAgICBGSUxFICpwcCA9IE5VTEw7DQorICAgIC8vRklMRSAqcHAyID0gTlVMTDsNCisgICAgY2hhciBidWZbMTI4XT17MH07DQorICAgIGNoYXIgbWFjX3RtcFsxOF0gPSB7MH07DQorICAgIGNoYXIgbnVtX3RtcFszXSA9IHswfTsNCisgICAgY2hhciAqcCA9IE5VTEw7DQorICAgIGNoYXIgKnBfdG1wID0gTlVMTDsNCisNCisgICAgY2hhciBhdXRobW9kZVsyMF09ezB9Ow0KKyAgICBjaGFyIGVuY3J5cHR5cGVbMjBdPXswfTsNCisgICAgDQorICAgIGNoYXIgd2lmaV9zdGFfY29ubmVjdGlvbls4XT17MH07DQorICAgIA0KKyAgICBjaGFyIGNtZFsxMjhdPXswfTsNCisgICAgY2hhciBpaWZuYW1lWzIwXT17MH07DQorICAgIFJUXzgwMl8xMV9NQUNfVEFCTEUgKm1hY19saXN0PU5VTEwgOw0KKyAgICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7IA0KKyAgICBtYWNfbGlzdCA9KFJUXzgwMl8xMV9NQUNfVEFCTEUqKW1hbGxvYyhzaXplb2YoUlRfODAyXzExX01BQ19UQUJMRSkpOw0KKyAgICBpZihtYWNfbGlzdCA9PSBOVUxMKQ0KKyAgICB7DQorICAgICAgICAgICAgYXNzZXJ0KG1hY19saXN0KTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIG1lbXNldChtYWNfbGlzdCwgMCwgc2l6ZW9mKFJUXzgwMl8xMV9NQUNfVEFCTEUpKTsNCisgICAgfQ0KKyAgIA0KKyAgICANCisgICAgY2ZnX2dldF9pdGVtKCJ3aWZpX3N0YV9jb25uZWN0aW9uIiwgd2lmaV9zdGFfY29ubmVjdGlvbiwgc2l6ZW9mKHdpZmlfc3RhX2Nvbm5lY3Rpb24pKTsNCisgICANCisgICAgaWYoc3RybmNtcCh3aWZpX3N0YV9jb25uZWN0aW9uLCAiMSIsMSkgPT0gMCl7DQorICAgICAgICBzdHJjcHkoaWlmbmFtZSwiLWkgd2wwLjEiKTsNCisgICAgfQ0KKw0KKyAgICAvL21lbXNldCgmdGFibGUsMCxzaXplb2YodGFibGUpKTsNCisNCisgICAgY2ZnX2dldF9pdGVtKCJBdXRoTW9kZSIsYXV0aG1vZGUsc2l6ZW9mKGF1dGhtb2RlKSk7DQorICAgIGNmZ19nZXRfaXRlbSgiRW5jcnlwVHlwZSIsZW5jcnlwdHlwZSxzaXplb2YoZW5jcnlwdHlwZSkpOw0KKyAgICBpZigoIXN0cmNtcChhdXRobW9kZSwiV1BBUFNLIikpfHwoIXN0cmNtcChhdXRobW9kZSwiV1BBMlBTSyIpKXx8KCFzdHJjbXAoYXV0aG1vZGUsIldQQVBTS1dQQTJQU0siKSkpDQorICAgIHsNCisgICAgICAgIHNwcmludGYoY21kLCJ3bCAlcyBhdXRob19zdGFfbGlzdCIsaWlmbmFtZSk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBzcHJpbnRmKGNtZCwid2wgJXMgYXNzb2NsaXN0IixpaWZuYW1lKTsNCisgICAgfQ0KKyAgICBwcmludGYoIlslczolc11paWZuYW1lOiVzXG4iLF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIGNtZCk7DQorICAgIHBwID0gcG9wZW4oY21kLCAiciIpOyAvL72owaK53LXADQorICAgIGlmICghcHApDQorICAgIHsNCisgICAgICAgIHJldHVybiA7DQorICAgICAgICANCisgICAgfSANCisgICAgDQorICAgIHN0cmNweShidWYsIkFCTk9STUFMIik7DQorYWdhaW46ICAgICAgIA0KKyAgICB3aGlsZShmZ2V0cyhidWYsIDEyOCwgcHApICE9IE5VTEwpICAgICAgICANCisgICAgeyAgICAgICAgICAgICANCisgICAgICAgIA0KKyAgICAgICAgaWYoc3RyY21wKGJ1ZiwiQUJOT1JNQUwiKT09MCkgIC8qcHMgY29tbWFuZCBlcnJvciovICANCisgICAgICAgIHsNCisgICAgICAgICAgICBwcmludGYoIlslc10gZGV0ZWN0X3Byb2Nlc3Mgc3RyZXJyb3I6ICVzXG4iLF9fRlVOQ1RJT05fXyxzdHJlcnJvcihlcnJubykpOw0KKyAgICAgICAgICAgIGlmKGVycm5vID09IEVJTlRSKSAvL0ludGVycnVwdGVkIHN5c3RlbSBjYWxsLLTLyrG/ydbYytQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGdvdG8gYWdhaW47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHBjbG9zZShwcCk7Ly+52LHVudy1wA0KKyAgICAgICAgICAgIHJldHVybiA7IA0KKyAgICAgICAgIH0NCisgICAgICAgICBtZW1zZXQobWFjX3RtcCwgMCwgMTgpOyAgICAgICAgICAgIA0KKyAgICAgICAgIGlmKChwID0gc3Ryc3RyKGJ1ZiwgIjoiKSkgIT0gTlVMTCkgICAgICAgICAgICANCisgICAgICAgICB7ICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICBwX3RtcCA9IHAtMjsgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgc3RybmNweShtYWNfdG1wLCBwX3RtcCwgMTcpOyAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgZm9yKHM9MCxrPTA7IHM8NjsgcysrLGsrPTMpICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgIHN0cm5jcHkobnVtX3RtcCwgbWFjX3RtcCArIGssIDIpOyAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgLy9wcmludGYoInpob3V0aSBudW1fdG1wIGlzICVzXG4iLCBudW1fdG1wKTsgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAvL3RhYmxlLkVudHJ5W3N0YV9udW1dLkFkZHJbc109YXRvaShudW1fdG1wKTsgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICBtYWNfbGlzdC0+RW50cnlbbWFjX2xpc3QtPk51bV0uQWRkcltzXSA9IHMyeChudW1fdG1wKTsgIA0KKyAgICAgICAgICAgICAgICAvL21hY19saXN0LT5FbnRyeVttYWNfbGlzdC0+TnVtXS5BZGRyW3NdID0gMDsgDQorICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgIG1hY19saXN0LT5OdW0gKz0gMTsgIA0KKyAgICAgICAgICAgIA0KKyAgICAgICAgIH0gICAgICAgICAgICANCisgICAgICAgIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsgICAgICAgIA0KKyAgICB9ICAgIA0KKyAgICAoKm1hY2xpc3QpPSAoKm1hY19saXN0KTsNCisgICAgaWYobWFjX2xpc3QpIA0KKyAgICB7DQorICAgICAgICBmcmVlKG1hY19saXN0KTsNCisgICAgICAgIG1hY19saXN0PU5VTEw7DQorICAgIH0NCisgICAgcGNsb3NlKHBwKTsgLy+52LHVudy1wDsNCisgICAgICAgICAgICANCit9DQorDQorc3RhdGljIHZvaWQgenRlX3dsYW5fZ2V0X3dpZmlfc3RhdGlvbl9saXN0KFJUXzgwMl8xMV9NQUNfVEFCTEUgKnN0YWlvbmxpc3QpDQoreyAgICANCisgICAgICAgIA0KKyAgICBpbnQgaSA9IDA7DQorICAgIGNoYXIgYnVmWzEyOF09ezB9Ow0KKyAgICBGSUxFICpwcDIgPSBOVUxMOw0KKyAgICBjaGFyIG1hY190bXBbMThdID0gezB9Ow0KKyAgICBjaGFyICpwX3RtcCA9IE5VTEw7DQorICAgIGNoYXIgc3RhdGlvbl9tYWNbMTgqMzJdPXswfTsgLy8gMDA6MDA6MDA6MDA6MDA6MDA7DQorICAgIGNoYXIgc3RhdGlvbmluZm9bMTAwXSA9IHswfTsNCisgICAgY2hhciBtYWNfdGltZVszM10gPSB7MH07DQorICAgIA0KKyAgICBSVF84MDJfMTFfTUFDX1RBQkxFICpzdGFfbGlzdCA9IE5VTEw7DQorICAgIHN0YV9saXN0ID0gKFJUXzgwMl8xMV9NQUNfVEFCTEUqKW1hbGxvYyhzaXplb2YoUlRfODAyXzExX01BQ19UQUJMRSkpOw0KKyAgICBpZihzdGFfbGlzdCA9PSBOVUxMKQ0KKyAgICB7DQorICAgICAgICAgICAgYXNzZXJ0KHN0YV9saXN0KTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIG1lbXNldChzdGFfbGlzdCwgMCwgc2l6ZW9mKFJUXzgwMl8xMV9NQUNfVEFCTEUpKzEpOw0KKyAgICB9DQorICAgIHp0ZV93bGFuX2dldF93aWZpX21hY19saXN0KHN0YV9saXN0KTsNCisNCisgICAgZm9yIChpID0gMDsgaSA8c3RhX2xpc3QtPk51bTsgaSsrKQ0KKyAgICB7DQorICAgICAgICBzcHJpbnRmKHN0YXRpb25fbWFjICsgaSAqIDE4LCAiJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg7IixcDQorICAgICAgICAgICAgICAgICAgIHN0YV9saXN0LT5FbnRyeVtpXS5BZGRyWzBdLCBzdGFfbGlzdC0+RW50cnlbaV0uQWRkclsxXSwNCisgICAgICAgICAgICAgICAgICAgIHN0YV9saXN0LT5FbnRyeVtpXS5BZGRyWzJdLCBzdGFfbGlzdC0+RW50cnlbaV0uQWRkclszXSwNCisgICAgICAgICAgICAgICAgICAgIHN0YV9saXN0LT5FbnRyeVtpXS5BZGRyWzRdLCBzdGFfbGlzdC0+RW50cnlbaV0uQWRkcls1XSk7DQorICAgICAgICBzcHJpbnRmKHN0YXRpb25pbmZvLCJ3bCBzdGFfaW5mbyAlMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWCBcDQorICAgICAgICAgICAgfCBncmVwIFwiaW4gbmV0d29ya1wiIHwgY3V0IC1kXCIgXCIgLWY0IiwNCisgICAgICAgICAgICAgICAgICAgIHN0YV9saXN0LT5FbnRyeVtpXS5BZGRyWzBdLCBzdGFfbGlzdC0+RW50cnlbaV0uQWRkclsxXSwNCisgICAgICAgICAgICAgICAgICAgIHN0YV9saXN0LT5FbnRyeVtpXS5BZGRyWzJdLCBzdGFfbGlzdC0+RW50cnlbaV0uQWRkclszXSwNCisgICAgICAgICAgICAgICAgICAgIHN0YV9saXN0LT5FbnRyeVtpXS5BZGRyWzRdLCBzdGFfbGlzdC0+RW50cnlbaV0uQWRkcls1XSk7DQorICAgICAgICANCisgICAgICAgIHByaW50ZigiWyVzOiVzXXN0YXRpb25pbmZvOiVzXG4iLF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHN0YXRpb25pbmZvKTsNCisgICAgICAgIHBwMiA9IHBvcGVuKHN0YXRpb25pbmZvLCAiciIpOyAvL72owaK53LXADQorICAgICAgICANCisgICAgICAgIGlmKE5VTEwgPT0gcHAyKSAgICANCisgICAgICAgIHsgICAgICAgIA0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfSANCisgICAgICAgIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsgDQorICAgICAgICBzdHJjcHkoYnVmLCJBQk5PUk1BTCIpOw0KKyAgICAgICAgd2hpbGUoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgcHAyKSkNCisgICAgICAgIHsNCisNCisgICAgICAgICAgICBpZihzdHJjbXAoYnVmLCJBQk5PUk1BTCIpPT0wKSAgLypwcyBjb21tYW5kIGVycm9yKi8gIA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcHJpbnRmKCJbJXNdIGRldGVjdF9wcm9jZXNzIHN0cmVycm9yOiAlc1xuIixfX0ZVTkNUSU9OX18sc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgDQorICAgICAgICAgICAgICAgIHBjbG9zZShwcDIpOy8vudix1bnctcANCisgICAgICAgICAgICAgICAgcmV0dXJuIDsgDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1lbXNldChtYWNfdGltZSwwLDMzKTsNCisgICAgICAgICAgICBzdHJuY3B5KG1hY190aW1lLGJ1ZiwzMik7DQorICAgICAgICAgICANCisgICAgICAgICAgICBwcmludGYoIlslczolc11idWYwOiVzXG4iLF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIGJ1Zik7DQorICAgICAgICAgICANCisgICAgICAgICAgICBpZihOVUxMICE9IG1hY190aW1lKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3RhX2xpc3QtPkVudHJ5W2ldLkNvbm5lY3RlZFRpbWUgPSBhdG9sKG1hY190aW1lKTsNCisgICAgICAgICAgICAgICAgcHJpbnRmKCJbJXM6JXNdQ29ubmVjdGVkVGltZS0+TnVtMzolZFxuIixfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBzdGFfbGlzdC0+RW50cnlbaV0uQ29ubmVjdGVkVGltZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHN0YV9saXN0LT5FbnRyeVtpXS5Db25uZWN0ZWRUaW1lID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOyAgDQorICAgICAgICAgICAgcHJpbnRmKCJbJXM6JXNdbWFjX3RpbWU6JWRcbiIsX19GSUxFX18sIF9fRlVOQ1RJT05fXywgbWFjX3RpbWUpOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgcGNsb3NlKHBwMik7IC8vudix1bnctcANCisgICAgfQ0KKyAgICANCisgICAgKCpzdGFpb25saXN0KT0gKCpzdGFfbGlzdCk7DQorICAgIGlmKHN0YV9saXN0KSANCisgICAgew0KKyAgICAgICAgZnJlZShzdGFfbGlzdCk7IA0KKyAgICAgICAgc3RhX2xpc3Q9TlVMTDsNCisgICAgfQ0KKyAgICANCit9DQorDQorc3RhdGljIHZvaWQgd2xhbl9zZXRfY2hhbmdlX3NzaWRfa2V5X3N0YXR1cygpDQorew0KKwlpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9XTEFOX1NFUlZFUiwgTU9EVUxFX0lEX1dJRkksIE1TR19DTURfTU9ESUZZX1NTSURfS0VZLCAwLCBOVUxMLCAwKTsNCit9DQorDQorc3RhdGljIGludCB6dGVfd2xhbl9zc2lkMV9iYXNpY19zZXQoY2hhciogc3NpZF9pbikNCit7DQorICAgIGNoYXIgICpzc2lkID0gTlVMTDsgDQorCWNoYXIgbnZfdG1wW1dJRklfU1NJRF9MRU5dID0gezB9Ow0KKwkNCisJaWYoTlVMTCA9PSBzc2lkX2luKQ0KKwl7DQorCQlwcmludGYoImlucHV0IHNzaWQgaXMgbnVsbFxuIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisJaWYoKCFzdHJjbXAoc3NpZF9pbiwgIiAiKSkgfHwgKHN0cmxlbihzc2lkX2luKSA8PSAwKSB8fCAoc3RybGVuKHNzaWRfaW4pID4gV0lGSV9TU0lEX0xFTiApKQ0KKwl7DQorCQlwcmludGYoImlucHV0IHNzaWQgaXMgZXJyb3JcbiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorICAgIC8vc3NpZA0KKyAgICBtZW1zZXQobnZfdG1wLDAsc2l6ZW9mKG52X3RtcCkpOw0KKyAgICBpZihzc2lkX2luICE9IE5VTEwpDQorICAgIHsgIA0KKyAgICAgICANCisgICAgICAgY2ZnX2dldF9pdGVtKCJTU0lEMSIsbnZfdG1wLHNpemVvZihudl90bXApKTsNCisgICAgICAgIGlmICgwICE9IHN0cmNtcChzc2lkX2luLCBudl90bXApKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNmZ19zZXQoIlNTSUQxIiwgc3NpZF9pbik7DQorCQkJLy9jZmdfc2F2ZSgpOw0KKwkJCXdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKTsNCisgICAgICAgIH0NCisJCWVsc2UNCisJCXsNCisJCQlwcmludGYoImlucHV0IHNzaWQgaXMgc2FtZSBcbiIpOw0KKwkJCXJldHVybiAxOw0KKwkJfQ0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW50IHp0ZV93bGFuX3NzaWQxX3NlY3VyaXR5X3NldChjaGFyKiBwYXNzd29yZCkNCit7CQ0KKyAgICBjaGFyIGF1dGhNb2RlW1dMQU5fU0VDVVJJVFlfTEVOXSAgICAgID0gezB9Ow0KKyAgICBjaGFyIGVuY3J5cFR5cGVbV0xBTl9FTkNSWVRZUEVfTEVOXSAgID0gezB9Ow0KKwljaGFyIERlZmF1bHRLZXlJRFtXTEFOX0RFRkFVTFRJRF9MRU5dID0gezB9Ow0KKyAgIA0KKwljZmdfZ2V0X2l0ZW0oIkF1dGhNb2RlIixhdXRoTW9kZSxzaXplb2YoYXV0aE1vZGUpKTsNCisJY2ZnX2dldF9pdGVtKCJFbmNyeXBUeXBlIixlbmNyeXBUeXBlLHNpemVvZihlbmNyeXBUeXBlKSk7DQorDQorCQ0KKyAgICBpZihhdXRoTW9kZSAhPSBOVUxMICYmIGVuY3J5cFR5cGUgIT0gTlVMTCkNCisgICAgeyAgDQorICAgICAgICBwcmludGYoInp0ZV93bGFuX3NzaWQxX3NlY3VyaXR5X3NldCBhdXRoTW9kZSA9IFslc11cbiIsIGF1dGhNb2RlKTsNCisJCXByaW50ZigienRlX3dsYW5fc3NpZDFfc2VjdXJpdHlfc2V0IGVuY3J5cFR5cGUgPSBbJXNdXG4iLCBlbmNyeXBUeXBlKTsgICANCisJCWlmKE5VTEwgPT0gcGFzc3dvcmQgJiYgKCEoIXN0cmNtcChhdXRoTW9kZSwgV0ZfQVVfT1BFTikgJiYgIXN0cmNtcChlbmNyeXBUeXBlLCBXRl9FTkNSWV9OT05FKSkpKQ0KKwkJew0KKwkJCXByaW50ZigienRlX3dsYW5fc3NpZDFfc2VjdXJpdHlfc2V0IHBhc3N3b3JkIGlzIG51bGxcbiIpOw0KKwkJCXJldHVybiAtMTsNCisJCX0NCisJCQ0KKyAgICAgICAgaWYoKCFzdHJjbXAoYXV0aE1vZGUsIFdGX0FVX09QRU4pKSAgfHwgKCFzdHJjbXAoYXV0aE1vZGUsIFdGX0FVX1NIQVJFKSkgfHwgICghc3RyY21wKGF1dGhNb2RlLCBXRl9BVV9XRVBBVVRPKSkpDQorICAgICAgICB7ICAgDQorICAgICAgICAgICAgaWYoKCghc3RyY21wKGF1dGhNb2RlLCBXRl9BVV9PUEVOKSkgJiYgKCFzdHJjbXAoYXV0aE1vZGUsIFdGX0VOQ1JZX1dFUCkpKSB8fA0KKyAgICAgICAgICAgIAkgKCFzdHJjbXAoYXV0aE1vZGUsIFdGX0FVX1NIQVJFKSkgfHwgKCFzdHJjbXAoYXV0aE1vZGUsIFdGX0FVX1dFUEFVVE8pKSkgDQorICAgICAgICAgICAgew0KKwkJCSAgICBpbnQgbGVuID0gMDsNCisJCQkJbGVuID0gc3RybGVuKHBhc3N3b3JkKTsNCisJCQkJaWYobGVuICE9IDUgfHwgbGVuICE9IDEwIHx8IGxlbiAhPSAxMyB8fCBsZW4gIT0gMjYpDQorCQkJCXsNCisJCQkJCXByaW50ZigienRlX3dsYW5fc3NpZDFfc2VjdXJpdHlfc2V0IHdlcCBwc2sgbGVuID0gWyVzXVxuIiwgbGVuKTsgIA0KKwkJCQkJcmV0dXJuIC0xOw0KKwkJCQl9DQorCQkJCQ0KKwkJCQljZmdfZ2V0X2l0ZW0oIkRlZmF1bHRLZXlJRCIsRGVmYXVsdEtleUlELHNpemVvZihEZWZhdWx0S2V5SUQpKTsNCisgICAgICAgICAgICAgICAgaWYoRGVmYXVsdEtleUlEICE9IE5VTEwpDQorCQkJCXsNCisJCQkJCWNoYXIgb2xkX3dlcF9rZXlbV0xBTl9XRVBLRVlfTEVOXSA9IHswfTsNCisJCQkJCQ0KKwkJCQkJaWYoIXN0cmNtcChEZWZhdWx0S2V5SUQsICIxIikpDQorCQkJCQl7DQorCQkJCQkJY2ZnX2dldF9pdGVtKCJLZXkyU3RyMSIsb2xkX3dlcF9rZXksc2l6ZW9mKG9sZF93ZXBfa2V5KSk7DQorCQkJCQkJaWYoc3RyY21wKG9sZF93ZXBfa2V5LCBwYXNzd29yZCkpDQorCQkJCQkJew0KKwkJCQkJCQljZmdfc2V0KCJLZXkyU3RyMSIsIHBhc3N3b3JkKTsNCisJCQkJCQkJLy9jZmdfc2F2ZSgpOw0KKwkJCQkJCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UNCisJCQkJCQl7DQorCQkJCQkJCXByaW50ZigienRlX3dsYW5fc3NpZDFfc2VjdXJpdHlfc2V0IHdlcCBwc2sgaXMgc2FtZVxuIik7ICANCisJCQkJCQkJcmV0dXJuIDE7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQkJZWxzZSBpZighc3RyY21wKERlZmF1bHRLZXlJRCwgIjIiKSkNCisJCQkJCXsNCisJCQkJCQljZmdfZ2V0X2l0ZW0oIktleTNTdHIxIixvbGRfd2VwX2tleSxzaXplb2Yob2xkX3dlcF9rZXkpKTsNCisJCQkJCQlpZihzdHJjbXAob2xkX3dlcF9rZXksIHBhc3N3b3JkKSkNCisJCQkJCQl7DQorCQkJCQkJCWNmZ19zZXQoIktleTNTdHIxIiwgcGFzc3dvcmQpOw0KKwkJCQkJCQkvL2NmZ19zYXZlKCk7DQorCQkJCQkJCXdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKTsNCisJCQkJCQl9DQorCQkJCQkJZWxzZQ0KKwkJCQkJCXsNCisJCQkJCQkJcHJpbnRmKCJ6dGVfd2xhbl9zc2lkMV9zZWN1cml0eV9zZXQgd2VwIHBzayBpcyBzYW1lXG4iKTsgIA0KKwkJCQkJCQlyZXR1cm4gMTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQllbHNlIGlmKCFzdHJjbXAoRGVmYXVsdEtleUlELCAiMyIpKQ0KKwkJCQkJew0KKwkJCQkJCWNmZ19nZXRfaXRlbSgiS2V5NFN0cjEiLG9sZF93ZXBfa2V5LHNpemVvZihvbGRfd2VwX2tleSkpOw0KKwkJCQkJCWlmKHN0cmNtcChvbGRfd2VwX2tleSwgcGFzc3dvcmQpKQ0KKwkJCQkJCXsNCisJCQkJCQkJY2ZnX3NldCgiS2V5NFN0cjEiLCBwYXNzd29yZCk7DQorCQkJCQkJCS8vY2ZnX3NhdmUoKTsNCisJCQkJCQkJd2xhbl9zZXRfY2hhbmdlX3NzaWRfa2V5X3N0YXR1cygpOw0KKwkJCQkJCX0NCisJCQkJCQllbHNlDQorCQkJCQkJew0KKwkJCQkJCQlwcmludGYoInp0ZV93bGFuX3NzaWQxX3NlY3VyaXR5X3NldCB3ZXAgcHNrIGlzIHNhbWVcbiIpOyAgDQorCQkJCQkJCXJldHVybiAxOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJCWVsc2UgDQorCQkJCQl7DQorCQkJCQkJY2ZnX2dldF9pdGVtKCJLZXkxU3RyMSIsb2xkX3dlcF9rZXksc2l6ZW9mKG9sZF93ZXBfa2V5KSk7DQorCQkJCQkJaWYoc3RyY21wKG9sZF93ZXBfa2V5LCBwYXNzd29yZCkpDQorCQkJCQkJew0KKwkJCQkJCQljZmdfc2V0KCJLZXkxU3RyMSIsIHBhc3N3b3JkKTsNCisJCQkJCQkJLy9jZmdfc2F2ZSgpOw0KKwkJCQkJCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UNCisJCQkJCQl7DQorCQkJCQkJCXByaW50ZigienRlX3dsYW5fc3NpZDFfc2VjdXJpdHlfc2V0IHdlcCBwc2sgaXMgc2FtZVxuIik7ICANCisJCQkJCQkJcmV0dXJuIDE7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYoIXN0cmNtcChhdXRoTW9kZSwgV0ZfQVVfT1BFTikgJiYgIXN0cmNtcChlbmNyeXBUeXBlLCBXRl9FTkNSWV9OT05FKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHByaW50ZigiYXV0aE1vZGUgaXMgb3BlbiBhbmQgbm90IHdlcCBcbiIpOw0KKwkJCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7DQorCQkJCXJldHVybiAxOw0KKw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2UgaWYoIXN0cmNtcChhdXRoTW9kZSwgV0ZfQVVfV1BBKSAgfHwgIXN0cmNtcChhdXRoTW9kZSwgV0ZfQVVfV1BBMikgfHwgIXN0cmNtcChhdXRoTW9kZSwgIFdGX0FVX1dQQV9XUEEyKSkNCisgICAgICAgIHsNCisJCQljaGFyIHBza1tXTEFOX1BTS19MRU5dICAgICAgICAgICAgICAgID0gezB9Ow0KKyAgICAgICAgICAgIGludCBsZW4gPSAwOw0KKwkJCWNoYXIgZW5jb2RlW1dMQU5fRU5DT0RFX1BTS19MRU5dID0gezB9Ow0KKwkJCWxlbiA9IHN0cmxlbihwYXNzd29yZCk7DQorCQkJDQorCQkJaWYobGVuIDwgOCB8fCBsZW4gPiA2NCkNCisJCQl7DQorCQkJCXByaW50ZigiJXMgcGFzc3dvcmQgbGVuIGlzICVkIFxuIixhdXRoTW9kZSwgbGVuKTsNCisJCQkJcmV0dXJuIC0xOw0KKwkJCX0NCisJCQkNCisJCQljZmdfZ2V0X2l0ZW0oIldQQVBTSzEiLHBzayxzaXplb2YocHNrKSk7DQorCQkJaWYocHNrICE9IE5VTEwpDQorCQkJew0KKwkJCQlpZihzdHJjbXAocHNrLCBwYXNzd29yZCkpDQorCQkJCXsNCisJCQkJCWNmZ19zZXQoIldQQVBTSzEiLCBwYXNzd29yZCk7DQorCQkJCQliYXNlNjRfZW5jb2RlKHBhc3N3b3JkLCBsZW4sIGVuY29kZSwgV0xBTl9FTkNPREVfUFNLX0xFTik7DQorCQkJCQljZmdfc2V0KCJXUEFQU0sxX2VuY29kZSIsIGVuY29kZSk7DQorCQkJCQkvL2NmZ19zYXZlKCk7DQorCQkJCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7DQorCQkJCX0NCisJCQl9DQorICAgICAgICAgICAgZWxzZQ0KKwkJCXsNCisJCQkJY2ZnX3NldCgiV1BBUFNLMSIsIHBhc3N3b3JkKTsNCisJCQkJYmFzZTY0X2VuY29kZShwYXNzd29yZCwgbGVuLCBlbmNvZGUsIFdMQU5fRU5DT0RFX1BTS19MRU4pOw0KKwkJCQljZmdfc2V0KCJXUEFQU0sxX2VuY29kZSIsIGVuY29kZSk7DQorCQkJCS8vY2ZnX3NhdmUoKTsNCisJCQkJd2xhbl9zZXRfY2hhbmdlX3NzaWRfa2V5X3N0YXR1cygpOw0KKwkJCX0NCisgICAgICAgIH0NCisJCWVsc2UgaWYoIXN0cmNtcChhdXRoTW9kZSwgV0ZfQVVfV0FQSVBTSykpDQorCQl7DQorCQkJY2hhciBwc2tbV0xBTl9QU0tfTEVOXSAgICAgICAgICAgICAgICA9IHswfTsNCisJCQlpbnQgbGVuID0gMDsNCisJCQljaGFyIGVuY29kZVtXTEFOX1BTS19MRU5dID0gezB9Ow0KKwkJCWxlbiA9IHN0cmxlbihwYXNzd29yZCk7DQorCQkJDQorCQkJaWYobGVuIDwgOCB8fCBsZW4gPiA2NCkNCisJCQl7DQorCQkJCXByaW50ZigiV0ZfQVVfV0FQSVBTSyBwYXNzd29yZCBsZW4gaXMgJWQgXG4iLCBsZW4pOw0KKwkJCQlyZXR1cm4gLTE7DQorCQkJfQ0KKwkJCQ0KKwkJCWNmZ19nZXRfaXRlbSgiV1BBUFNLMSIscHNrLHNpemVvZihwc2spKTsNCisJCQlpZihwc2sgIT0gTlVMTCkNCisJCQl7DQorCQkJCWlmKHN0cmNtcChwc2ssIHBhc3N3b3JkKSkNCisJCQkJew0KKwkJCQkJY2ZnX3NldCgiV1BBUFNLMSIsIHBhc3N3b3JkKTsNCisJCQkJCWJhc2U2NF9lbmNvZGUocGFzc3dvcmQsIGxlbiwgZW5jb2RlLCBXTEFOX0VOQ09ERV9QU0tfTEVOKTsNCisJCQkJCWNmZ19zZXQoIldQQVBTSzFfZW5jb2RlIiwgZW5jb2RlKTsNCisJCQkJCS8vY2ZnX3NhdmUoKTsNCisJCQkJCXdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKTsNCisJCQkJfQ0KKwkJCX0NCisgICAgICAgICAgICBlbHNlDQorCQkJew0KKwkJCQljZmdfc2V0KCJXUEFQU0sxIiwgcGFzc3dvcmQpOw0KKwkJCQliYXNlNjRfZW5jb2RlKHBhc3N3b3JkLCBsZW4sIGVuY29kZSwgV0xBTl9FTkNPREVfUFNLX0xFTik7DQorCQkJCWNmZ19zZXQoIldQQVBTSzFfZW5jb2RlIiwgZW5jb2RlKTsNCisJCQkJLy9jZmdfc2F2ZSgpOw0KKwkJCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7DQorCQkJfQ0KKwkJfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIG90aGVyIHNlY3VyaXR5IG1vZGUgaXMgaW52YWxpZA0KKyAgICAgICAgICAgIHByaW50ZigiRVJST1I6c2VjdXJpdHkgbW9kZSAgaXMgaW52YWxpZFxuIik7DQorICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgLy9zZWN1cml0eV9tb2RlIGlzIE5VTEwNCisgICAgICAgIHByaW50ZigiRVJST1I6c2VjdXJpdHlfbW9kZSBpcyBudWxsXG4iKTsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gMDsNCit9DQorDQoraW50IHp0ZV93bGFuX2dldF9zc2lkMV9zZXR0aW5ncyhjaGFyKiBzc2lkLCBjaGFyKiBwYXNzd29yZCwgaW50IHNzaWRfbGVuLCBpbnQgcGFzc3dvcmRfbGVuKQ0KK3sNCisJY2hhciBhdXRoTW9kZVtXTEFOX1NFQ1VSSVRZX0xFTl0gICAgICA9IHswfTsNCisgICAgY2hhciBlbmNyeXBUeXBlW1dMQU5fRU5DUllUWVBFX0xFTl0gICA9IHswfTsNCisJY2hhciBEZWZhdWx0S2V5SURbV0xBTl9ERUZBVUxUSURfTEVOXSA9IHswfTsNCisNCisJaWYoTlVMTCA9PSBzc2lkIHx8IE5VTEwgPT0gcGFzc3dvcmQpDQorCXsNCisJCXByaW50ZigiRVJST1I6aW5wdXQgc3NpZCAmJiBwYXNzd29yZCBpcyBudWxsXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwkNCisJaWYoTlVMTCAhPSBzc2lkKQ0KKwl7DQorCQljaGFyIG9sZF9zc2lkW1dJRklfU1NJRF9MRU5dID0gezB9Ow0KKwkJY2ZnX2dldF9pdGVtKCJTU0lEMSIsb2xkX3NzaWQsc2l6ZW9mKG9sZF9zc2lkKSk7DQorCQlpZihvbGRfc3NpZCAhPSBOVUxMKQ0KKwkJew0KKwkJCXN0cm5jcHkoc3NpZCwgb2xkX3NzaWQsIHNzaWRfbGVuIC0gMSk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJcHJpbnRmKCJFUlJPUjppbnB1dCBvbGRfc3NpZCBpcyBudWxsXG4iKTsNCisJCQlyZXR1cm4gLTE7DQorCQl9DQorCX0NCisJDQorCWlmKE5VTEwgIT0gcGFzc3dvcmQpDQorCXsJCQ0KKwkJY2ZnX2dldF9pdGVtKCJBdXRoTW9kZSIsYXV0aE1vZGUsc2l6ZW9mKGF1dGhNb2RlKSk7DQorCQljZmdfZ2V0X2l0ZW0oIkVuY3J5cFR5cGUiLGVuY3J5cFR5cGUsc2l6ZW9mKGVuY3J5cFR5cGUpKTsNCisNCisJCQ0KKwkJaWYoYXV0aE1vZGUgIT0gTlVMTCAmJiBlbmNyeXBUeXBlICE9IE5VTEwpDQorCQl7ICANCisJCQlwcmludGYoInp0ZV93bGFuX3NzaWQxX3NlY3VyaXR5X2dldCBhdXRoTW9kZSA9IFslc11cbiIsIGF1dGhNb2RlKTsgICANCisJCQlwcmludGYoInp0ZV93bGFuX3NzaWQxX3NlY3VyaXR5X2dldCBlbmNyeXBUeXBlID0gWyVzXVxuIiwgZW5jcnlwVHlwZSk7ICAgDQorDQorCQkJaWYoKCFzdHJjbXAoYXV0aE1vZGUsIFdGX0FVX09QRU4pKSAgfHwgKCFzdHJjbXAoYXV0aE1vZGUsIFdGX0FVX1NIQVJFKSkgfHwgICghc3RyY21wKGF1dGhNb2RlLCBXRl9BVV9XRVBBVVRPKSkpDQorCQkJeyAgIA0KKwkJCQlpZigoKCFzdHJjbXAoYXV0aE1vZGUsIFdGX0FVX09QRU4pKSAmJiAoIXN0cmNtcChhdXRoTW9kZSwgV0ZfRU5DUllfV0VQKSkpIHx8DQorCQkJCQkoIXN0cmNtcChhdXRoTW9kZSwgV0ZfQVVfU0hBUkUpKSB8fCAoIXN0cmNtcChhdXRoTW9kZSwgV0ZfQVVfV0VQQVVUTykpKSANCisJCQkJew0KKwkJCQkJY2ZnX2dldF9pdGVtKCJEZWZhdWx0S2V5SUQiLERlZmF1bHRLZXlJRCxzaXplb2YoRGVmYXVsdEtleUlEKSk7DQorCQkJCQlpZihEZWZhdWx0S2V5SUQgIT0gTlVMTCkNCisJCQkJCXsNCisJCQkJCQljaGFyIG9sZF93ZXBfa2V5W1dMQU5fV0VQS0VZX0xFTl0gPSB7MH07DQorCQkJCQkJaWYoIXN0cmNtcChEZWZhdWx0S2V5SUQsICIxIikpDQorCQkJCQkJew0KKwkJCQkJCQljZmdfZ2V0X2l0ZW0oIktleTJTdHIxIixvbGRfd2VwX2tleSxzaXplb2Yob2xkX3dlcF9rZXkpKTsNCisJCQkJCQkJaWYob2xkX3dlcF9rZXkgIT0gTlVMTCkNCisJCQkJCQkJew0KKwkJCQkJCQkJc3RybmNweShwYXNzd29yZCwgb2xkX3dlcF9rZXksIHBhc3N3b3JkX2xlbi0xKTsNCisJCQkJCQkJfQ0KKwkJCQkJCQllbHNlDQorCQkJCQkJCXsNCisJCQkJCQkJCXByaW50ZigiRVJST1I6aW5wdXQgb2xkX3dlcF9rZXkgaXMgbnVsbFxuIik7DQorCQkJCQkJCQlyZXR1cm4gLTE7DQorCQkJCQkJCX0NCisJCQkJCQl9DQorCQkJCQkJZWxzZSBpZighc3RyY21wKERlZmF1bHRLZXlJRCwgIjIiKSkNCisJCQkJCQl7DQorCQkJCQkJCWNmZ19nZXRfaXRlbSgiS2V5M1N0cjEiLG9sZF93ZXBfa2V5LHNpemVvZihvbGRfd2VwX2tleSkpOw0KKwkJCQkJCQlpZihvbGRfd2VwX2tleSAhPSBOVUxMKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlzdHJuY3B5KHBhc3N3b3JkLCBvbGRfd2VwX2tleSwgcGFzc3dvcmRfbGVuLTEpOw0KKwkJCQkJCQl9DQorCQkJCQkJCWVsc2UNCisJCQkJCQkJew0KKwkJCQkJCQkJcHJpbnRmKCJFUlJPUjppbnB1dCBvbGRfd2VwX2tleSBpcyBudWxsXG4iKTsNCisJCQkJCQkJCXJldHVybiAtMTsNCisJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCQllbHNlIGlmKCFzdHJjbXAoRGVmYXVsdEtleUlELCAiMyIpKQ0KKwkJCQkJCXsNCisJCQkJCQkJY2ZnX2dldF9pdGVtKCJLZXk0U3RyMSIsb2xkX3dlcF9rZXksc2l6ZW9mKG9sZF93ZXBfa2V5KSk7DQorCQkJCQkJCWlmKG9sZF93ZXBfa2V5ICE9IE5VTEwpDQorCQkJCQkJCXsNCisJCQkJCQkJCXN0cm5jcHkocGFzc3dvcmQsIG9sZF93ZXBfa2V5LCBwYXNzd29yZF9sZW4tMSk7DQorCQkJCQkJCX0NCisJCQkJCQkJZWxzZQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlwcmludGYoIkVSUk9SOmlucHV0IG9sZF93ZXBfa2V5IGlzIG51bGxcbiIpOw0KKwkJCQkJCQkJcmV0dXJuIC0xOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UgDQorCQkJCQkJew0KKwkJCQkJCQljZmdfZ2V0X2l0ZW0oIktleTFTdHIxIixvbGRfd2VwX2tleSxzaXplb2Yob2xkX3dlcF9rZXkpKTsNCisJCQkJCQkJaWYob2xkX3dlcF9rZXkgIT0gTlVMTCkNCisJCQkJCQkJew0KKwkJCQkJCQkJc3RybmNweShwYXNzd29yZCwgb2xkX3dlcF9rZXksIHBhc3N3b3JkX2xlbi0xKTsNCisJCQkJCQkJfQ0KKwkJCQkJCQllbHNlDQorCQkJCQkJCXsNCisJCQkJCQkJCXByaW50ZigiRVJST1I6aW5wdXQgb2xkX3dlcF9rZXkgaXMgbnVsbFxuIik7DQorCQkJCQkJCQlyZXR1cm4gLTE7DQorCQkJCQkJCX0NCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisgICAgICAgICAgICB9DQorCQkJZWxzZSBpZighc3RyY21wKGF1dGhNb2RlLCBXRl9BVV9XUEEpICB8fCAhc3RyY21wKGF1dGhNb2RlLCBXRl9BVV9XUEEyKSB8fCAhc3RyY21wKGF1dGhNb2RlLCAgV0ZfQVVfV1BBX1dQQTIpKQ0KKwkJCXsNCisJCQkJY2hhciBwc2tbV0xBTl9QU0tfTEVOXSA9IHswfTsNCisJCQkJY2ZnX2dldF9pdGVtKCJXUEFQU0sxIixwc2ssc2l6ZW9mKHBzaykpOw0KKwkJCQlpZihwc2sgIT0gTlVMTCkNCisJCQkJew0KKwkJCQkJc3RybmNweShwYXNzd29yZCwgcHNrLCBwYXNzd29yZF9sZW4tMSk7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlwcmludGYoIkVSUk9SOiVzIGlucHV0IHBzayBpcyBudWxsXG4iLCBhdXRoTW9kZSk7DQorCQkJCQlyZXR1cm4gLTE7DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZSBpZighc3RyY21wKGF1dGhNb2RlLCBXRl9BVV9XQVBJUFNLKSkNCisJCQl7DQorCQkJCWNoYXIgcHNrW1dMQU5fUFNLX0xFTl0gICAgICAgICAgICAgICAgPSB7MH07DQorCQkJCWNmZ19nZXRfaXRlbSgiV1BBUFNLMSIscHNrLHNpemVvZihwc2spKTsNCisJCQkJaWYocHNrICE9IE5VTEwpDQorCQkJCXsNCisJCQkJCXN0cm5jcHkocGFzc3dvcmQsIHBzaywgcGFzc3dvcmRfbGVuLTEpOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJcHJpbnRmKCJFUlJPUjolcyBpbnB1dCBwc2sgaXMgbnVsbFxuIiwgYXV0aE1vZGUpOw0KKwkJCQkJcmV0dXJuIC0xOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJldHVybiAtMTsNCisJCQl9DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJcmV0dXJuIC0xOw0KKwkJfQ0KKyAgICB9DQorCXJldHVybiAwOw0KK30NCisNCitpbnQgenRlX3dsYW5fc3NpZDFfc2V0KGNoYXIqIHNzaWQsIGNoYXIqIHBhc3N3b3JkKQ0KK3sNCisJaW50IHJldF9mb3JfYmFzaWMgPSAwOw0KKwlpbnQgcmV0X2Zvcl9zZWN1cml0eSA9IDA7DQorCQ0KKwlyZXRfZm9yX2Jhc2ljID0genRlX3dsYW5fc3NpZDFfYmFzaWNfc2V0KHNzaWQpOw0KKyAgICBpZigtMSA9PSByZXRfZm9yX2Jhc2ljKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoInp0ZV93bGFuX3NzaWQxX2Jhc2ljX3NldCBpcyBmYWxzZVxuIik7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisJcmV0X2Zvcl9zZWN1cml0eSA9IHp0ZV93bGFuX3NzaWQxX3NlY3VyaXR5X3NldChwYXNzd29yZCk7DQorICAgIGlmKC0xID09IHJldF9mb3Jfc2VjdXJpdHkpDQorICAgIHsNCisgICAgICAgIHByaW50ZigiY2FsbCB6dGVfbGFuX3NzaWQxX3NlY3VyaXR5X3NldCBmYWlsdXJlIC5cbiIpOyAgIA0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorCQ0KKyAgICBpZihyZXRfZm9yX2Jhc2ljID09IDAgfHwgcmV0X2Zvcl9zZWN1cml0eSA9PSAwKQ0KKwl7DQorCQlpZigwID09IGlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dMQU5fU0VSVkVSLCBNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9XSUZJX0FEVkFOQ0VELCAyLCAiMSIsIDApKQ0KKwkJeyANCisJCQljZmdfc2V0KCJSYWRpb09mZiIsICIwIik7DQorCQkJcHJpbnRmKCJ3aWZpIHNldCBjbWQgZG9uZSFcbiIpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXByaW50Zigid2lmaSBzZXQgY21kIHp0ZV93bGFuX3NzaWQxX3NldCBlcnJvciFcbiIpOw0KKwkJCXJldHVybiAtMTsNCisJCX0NCisgICAgfQ0KKyAgICByZXR1cm4gMDsgDQorfQ0KKw0KKw0KK2ludCB6dGVfd2xhbl9jYXB0dXJlX3N0YV9udW0oKQ0KK3sNCisgICAgaW50IHRvdGFsX3N0YXRpb25fbnVtID0gMDsNCisgICAgRklMRSAqcHAgPSBOVUxMOw0KKyAgICBjaGFyICp0bXAgPSBOVUxMOw0KKyAgICBjaGFyIGJ1ZlsxMjhdPXswfTsNCisgICAgY2hhciBhdXRobW9kZVsyMF09ezB9Ow0KKwljaGFyIHJhZGlvX29mZlsyMF0gPSB7MH07DQorICAgIGNoYXIgd2lmaV9zdGFfY29ubmVjdGlvbls4XT17MH07DQorICAgIGNoYXIgY21kWzEyOF09ezB9Ow0KKyAgICBjaGFyIGlpZm5hbWVbMTZdPXswfTsNCisJDQorICAgIGNmZ19nZXRfaXRlbSgiUmFkaW9PZmYiLHJhZGlvX29mZixzaXplb2YocmFkaW9fb2ZmKSk7DQorICAgIGNmZ19nZXRfaXRlbSgid2lmaV9zdGFfY29ubmVjdGlvbiIsIHdpZmlfc3RhX2Nvbm5lY3Rpb24sIHNpemVvZih3aWZpX3N0YV9jb25uZWN0aW9uKSk7DQorICAgIGNmZ19nZXRfaXRlbSgiQXV0aE1vZGUiLGF1dGhtb2RlLCAyMCk7DQorCQ0KKwlpZiAoIXN0cm5jbXAocmFkaW9fb2ZmLCAiMCIsIDEpKQ0KKwl7DQorCSAgICBwcmludGYoIlt3bGFuLWludGVyZmFjZV1hcC1zZXJ2aWNlIHN0b3BwZWQhIHJldHVybiFcbiIpOw0KKwkgICAgcmV0dXJuIDA7DQorCX0NCisgICAgDQorICAgIGlmKHN0cm5jbXAod2lmaV9zdGFfY29ubmVjdGlvbiwgIjEiLDEpID09IDApDQorCXsNCisJCXN0cmNweShpaWZuYW1lLCItaSB3bDAuMSIpOw0KKwl9DQorICAgIGVsc2UNCisJew0KKwkJc3RyY3B5KGlpZm5hbWUsIi1pIHdsYW4wIik7DQorCX0NCisNCisgICAgaWYoKCFzdHJjbXAoYXV0aG1vZGUsIldQQVBTSyIpKXx8KCFzdHJjbXAoYXV0aG1vZGUsIldQQTJQU0siKSl8fCghc3RyY21wKGF1dGhtb2RlLCJXUEFQU0tXUEEyUFNLIikpKQ0KKwl7DQorCQlzcHJpbnRmKGNtZCwgIndsICVzIGF1dGhvX3N0YV9saXN0IiwgaWlmbmFtZSk7DQorCQlzcHJpbnRmKGNtZCwgIndsICVzIGF1dGhvX3N0YV9saXN0IiwgaWlmbmFtZSk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlzcHJpbnRmKGNtZCwgIndsICVzICBhc3NvY2xpc3QiLCBpaWZuYW1lKTsNCisJfQ0KKw0KKyAgICBpZiAoIGNtZCA9PSBOVUxMICkNCisJew0KKwkgICAgcHJpbnRmKCJbd2xhbi1pbnRlcmZhY2VdZXJyb3IhISBjbWQgaXMgTlVMTCEhXG4iKTsNCisJICAgIHJldHVybiAwOw0KKwl9DQorDQorICAgIHBwID0gcG9wZW4oY21kLCAiciIpOyAvL3BpcGUgc3RhcnRzDQorICAgIGlmICghcHApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiW3dsYW4taW50ZXJmYWNlXWVycm9yISEgY3JlYXRlIHBpcGUgZmFpbGVkISFcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgc3RyY3B5KGJ1ZiwiQUJOT1JNQUwiKTsNCisgICAgDQorQWdhaW46DQorICAgIHdoaWxlKGZnZXRzKGJ1ZiwgMTI4LCBwcCkgIT0gTlVMTCkgICANCisJeyAgICAgIA0KKyAgICAgICAgaWYoc3RyY21wKGJ1ZiwiQUJOT1JNQUwiKT09MCkgIC8vZmdldHMgZXJyb3IgDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpbnRmKCJbd2xhbi1pbnRlcmZhY2VdZXJyb3IhISBbJXNdIHN0cmVycm9yOiAlc1xuIixfX0ZVTkNUSU9OX18sc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgICAgICBpZihlcnJubyA9PSBFSU5UUikgLy9JbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCx0cnkgYWdhaW4NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGdvdG8gQWdhaW47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHBjbG9zZShwcCk7Ly9jbG9zZSBwaXBlDQorICAgICAgICAgICAgcmV0dXJuIDA7IA0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYoc3RybGVuKGJ1ZikgPiAwKQ0KKyAgICAgICAgew0KKwkJICAgIGlmKCh0bXAgPSBzdHJzdHIoYnVmLCAiOiIpKSAhPSBOVUxMKSAgICAgICAgICAgIA0KKwkJICAgIHsgICAgICAgICAgICAgICAgDQorCQkgICAgICB0b3RhbF9zdGF0aW9uX251bSArPSAxOyAgICAgICAgICAgIA0KKwkJICAgIH0gIA0KKyAgICAgICAgfQ0KKyAgICAgICAgbWVtc2V0KGJ1ZiwwLDEyOCk7DQorICAgICAgICBzdHJjcHkoYnVmLCJBQk5PUk1BTCIpOw0KKyAgICAgICAgCSAJCQ0KKwl9ICAgIA0KKwkNCisgICAgcGNsb3NlKHBwKTsvL2Nsb3NlIHBpcGUNCisgICAgcHJpbnRmKCJbd2xhbi1pbnRlcmZhY2VdIHRvdGFsX3N0YXRpb25fbnVtPSVkXG4iLHRvdGFsX3N0YXRpb25fbnVtKTsNCisgICAgcmV0dXJuIHRvdGFsX3N0YXRpb25fbnVtOw0KK30NCisNCisNCit2b2lkIHp0ZV9nZXRfd2lmaV9zdGFfbGlzdChSVF84MDJfMTFfTUFDX1RBQkxFICpzdGFMaXN0KQ0KK3sNCisgIA0KKyAgICAgICAgIGludCBpID0gMDsNCisJY2hhciBzdGF0aW9uX21hY1sxOCozMl09ezB9OyAvLyAwMDowMDowMDowMDowMDowMDsNCisJY2hhciBzdGF0aW9uX21hY190bXBbMTgqMzJdPXswfTsNCisJY2hhciB0bXBfc3RyWzEwXSA9IHswfTsNCisNCisgICAgICAgaWYoTlVMTCA9PSBzdGFMaXN0KQ0KKyAgICB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgenRlX3dsYW5fZ2V0X3dpZmlfc3RhdGlvbl9saXN0KHN0YUxpc3QpOw0KKwkNCisgICAgcHJpbnRmKCJbJXM6JXNdc3RhTGlzdC0+TnVtMTolZFxuIixfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBzdGFMaXN0LT5OdW0pOw0KKyAgICBwcmludGYoIlslczolc11zdGFMaXN0LT5Db25uZWN0ZWRUaW1lOiVkXG4iLF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHN0YUxpc3QtPkVudHJ5WzBdLkNvbm5lY3RlZFRpbWUpOw0KKw0KKyAgICBzcHJpbnRmKHRtcF9zdHIsICIlZCIsIHN0YUxpc3QtPk51bSk7CQ0KKwljZmdfc2V0KCJ3aWZpY291bnQiLCB0bXBfc3RyKTsNCisJY2ZnX3NldCgic3RhdGlvbl9udW0iLCB0bXBfc3RyKTsNCisgICAgZm9yKGk9MDsgaTxzdGFMaXN0LT5OdW07IGkrKykNCisgICAgew0KKyAgICAgICAgc3ByaW50ZihzdGF0aW9uX21hYyArIGkgKiAxOCwgIiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYOyIsXA0KKwkgICAJICAgICAgICAgICBzdGFMaXN0LT5FbnRyeVtpXS5BZGRyWzBdLCBzdGFMaXN0LT5FbnRyeVtpXS5BZGRyWzFdLA0KKwkJCQkgICAgc3RhTGlzdC0+RW50cnlbaV0uQWRkclsyXSwgc3RhTGlzdC0+RW50cnlbaV0uQWRkclszXSwNCisJCQkJICAgIHN0YUxpc3QtPkVudHJ5W2ldLkFkZHJbNF0sIHN0YUxpc3QtPkVudHJ5W2ldLkFkZHJbNV0pOw0KKyAgICB9DQorCWlmKHN0YUxpc3QtPk51bSAhPSAwKQ0KKwl7DQorCQlzdHJuY3B5KHN0YXRpb25fbWFjX3RtcCwgc3RhdGlvbl9tYWMsIHN0cmxlbihzdGF0aW9uX21hYykgLSAxKTsNCisJfQ0KKwkNCisJY2ZnX3NldCgic3RhdGlvbl9tYWMiLCBzdGF0aW9uX21hY190bXApOyAgIA0KKwkNCit9DQorDQorI2lmIDAgLy9rdyAzDQoraW50IGdldF9jaGFubmVsKCkNCit7DQorCWNoYXIgY2hhbm5lbFs4XT17MH07DQorCXBpcGVjbWQoIndsIGNoYW5uZWwgfCBncmVwIG1hYyB8Y3V0IC1mMiIsIGNoYW5uZWwpOw0KKwlyZXR1cm4gYXRvaShjaGFubmVsKTsNCit9DQorI2VuZGlmDQo=