ZGlmZiAtLWdpdCBhL2Jhc2U2NC5nbyBiL2Jhc2U2NC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTU2NzkxCi0tLSAvZGV2L251bGwKKysrIGIvYmFzZTY0LmdvCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2Ugam9zZQorCitpbXBvcnQgImVuY29kaW5nL2Jhc2U2NCIKKworLy8gRW5jb2RlciBpcyBzYXRpc2ZpZWQgaWYgdGhlIHR5cGUgY2FuIG1hcnNoYWwgaXRzZWxmIGludG8gYSB2YWxpZAorLy8gc3RydWN0dXJlIGZvciBhIEpXUy4KK3R5cGUgRW5jb2RlciBpbnRlcmZhY2UgeworCS8vIEJhc2U2NCBpbXBsaWVzIC0+IEpTT04gLT4gQmFzZTY0CisJQmFzZTY0KCkgKFtdYnl0ZSwgZXJyb3IpCit9CisKKy8vIEJhc2U2NERlY29kZSBkZWNvZGVzIGEgYmFzZTY0LWVuY29kZWQgYnl0ZSBzbGljZS4KK2Z1bmMgQmFzZTY0RGVjb2RlKGIgW11ieXRlKSAoW11ieXRlLCBlcnJvcikgeworCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlJhd1VSTEVuY29kaW5nLkRlY29kZWRMZW4obGVuKGIpKSkKKwluLCBlcnIgOj0gYmFzZTY0LlJhd1VSTEVuY29kaW5nLkRlY29kZShidWYsIGIpCisJcmV0dXJuIGJ1Zls6bl0sIGVycgorfQorCisvLyBCYXNlNjRFbmNvZGUgZW5jb2RlcyBhIGJ5dGUgc2xpY2UuCitmdW5jIEJhc2U2NEVuY29kZShiIFtdYnl0ZSkgW11ieXRlIHsKKwlidWYgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5SYXdVUkxFbmNvZGluZy5FbmNvZGVkTGVuKGxlbihiKSkpCisJYmFzZTY0LlJhd1VSTEVuY29kaW5nLkVuY29kZShidWYsIGIpCisJcmV0dXJuIGJ1ZgorfQorCisvLyBFbmNvZGVFc2NhcGUgYmFzZTY0LWVuY29kZXMgYSBieXRlIHNsaWNlIGJ1dCBlc2NhcGVzIGl0IGZvciBKU09OLgorLy8gSXQnbGwgcmV0dXJuIHRoZSBmb3JtYXQ6IGAiYmFzZTY0ImAKK2Z1bmMgRW5jb2RlRXNjYXBlKGIgW11ieXRlKSBbXWJ5dGUgeworCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlJhd1VSTEVuY29kaW5nLkVuY29kZWRMZW4obGVuKGIpKSsyKQorCWJ1ZlswXSA9ICciJworCWJhc2U2NC5SYXdVUkxFbmNvZGluZy5FbmNvZGUoYnVmWzE6XSwgYikKKwlidWZbbGVuKGJ1ZiktMV0gPSAnIicKKwlyZXR1cm4gYnVmCit9CisKKy8vIERlY29kZUVzY2FwZWQgZGVjb2RlcyBhIGJhc2U2NC1lbmNvZGVkIGJ5dGUgc2xpY2Ugc3RyYWlnaHQgZnJvbSBhIEpTT04KKy8vIHN0cnVjdHVyZS4gSXQgYXNzdW1lcyBpdCdzIGluIHRoZSBmb3JtYXQ6IGAiYmFzZTY0ImAsIGJ1dCBjYW4gaGFuZGxlCisvLyBjYXNlcyB3aGVyZSBpdCdzIG5vdC4KK2Z1bmMgRGVjb2RlRXNjYXBlZChiIFtdYnl0ZSkgKFtdYnl0ZSwgZXJyb3IpIHsKKwlpZiBsZW4oYikgPiAxICYmIGJbMF0gPT0gJyInICYmIGJbbGVuKGIpLTFdID09ICciJyB7CisJCWIgPSBiWzEgOiBsZW4oYiktMV0KKwl9CisJcmV0dXJuIEJhc2U2NERlY29kZShiKQorfQpkaWZmIC0tZ2l0IGEvYmFzZTY0X3Rlc3QuZ28gYi9iYXNlNjRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQwNzhjCi0tLSAvZGV2L251bGwKKysrIGIvYmFzZTY0X3Rlc3QuZ28KQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBqb3NlCisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RCYXNlNjQodCAqdGVzdGluZy5UKSB7CisJZW5jb2RlZCA6PSBbXWJ5dGUoIlNHVnNiRzhzSUhCc1lYbG5jbTkxYm1RIikKKwlyYXcgOj0gW11ieXRlKCJIZWxsbywgcGxheWdyb3VuZCIpCisKKwl0ZXN0RW5jIDo9IEJhc2U2NEVuY29kZShyYXcpCisJaWYgIWJ5dGVzLkVxdWFsKHRlc3RFbmMsIGVuY29kZWQpIHsKKwkJRXJyb3IodCwgZW5jb2RlZCwgdGVzdEVuYykKKwl9CisKKwl0ZXN0RGVjLCBlcnIgOj0gQmFzZTY0RGVjb2RlKHRlc3RFbmMpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCX0KKworCWlmICFieXRlcy5FcXVhbCh0ZXN0RGVjLCByYXcpIHsKKwkJRXJyb3IodCwgcmF3LCB0ZXN0RGVjKQorCX0KK30KZGlmZiAtLWdpdCBhL2hlYWRlci5nbyBiL2hlYWRlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjU4ZmViCi0tLSAvZGV2L251bGwKKysrIGIvaGVhZGVyLmdvCkBAIC0wLDAgKzEsMTE5IEBACitwYWNrYWdlIGpvc2UKKworaW1wb3J0ICJlbmNvZGluZy9qc29uIgorCisvLyBIZWFkZXIgaW1wbGVtZW50cyBhIEpPU0UgSGVhZGVyIHdpdGggdGhlIGFkZGl0aW9uIG9mIHNvbWUgaGVscGVyCisvLyBtZXRob2RzLCBzaW1pbGFyIHRvIG5ldC91cmwuVmFsdWVzLgordHlwZSBIZWFkZXIgbWFwW3N0cmluZ11pbnRlcmZhY2V7fQorCisvLyBHZXQgcmV0cmlldmVzIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHdpdGgga2V5IGZyb20gdGhlIEhlYWRlci4KK2Z1bmMgKGggSGVhZGVyKSBHZXQoa2V5IHN0cmluZykgaW50ZXJmYWNle30geworCWlmIGggPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1cm4gaFtrZXldCit9CisKKy8vIFNldCBzZXRzIENsYWltc1trZXldID0gdmFsLiBJdCdsbCBvdmVyd3JpdGUgd2l0aG91dCB3YXJuaW5nLgorZnVuYyAoaCBIZWFkZXIpIFNldChrZXkgc3RyaW5nLCB2YWwgaW50ZXJmYWNle30pIHsKKwloW2tleV0gPSB2YWwKK30KKworLy8gRGVsIHJlbW92ZXMgdGhlIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgd2l0aCBrZXkgZnJvbSB0aGUgSGVhZGVyLgorZnVuYyAoaCBIZWFkZXIpIERlbChrZXkgc3RyaW5nKSB7CisJZGVsZXRlKGgsIGtleSkKK30KKworLy8gSGFzIHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGV4aXN0cyBpbnNpZGUgdGhlIEhlYWRlci4KK2Z1bmMgKGggSGVhZGVyKSBIYXMoa2V5IHN0cmluZykgYm9vbCB7CisJXywgb2sgOj0gaFtrZXldCisJcmV0dXJuIG9rCit9CisKKy8vIE1hcnNoYWxKU09OIGltcGxlbWVudHMganNvbi5NYXJzaGFsZXIgZm9yIEhlYWRlci4KK2Z1bmMgKGggSGVhZGVyKSBNYXJzaGFsSlNPTigpIChbXWJ5dGUsIGVycm9yKSB7CisJaWYgaCA9PSBuaWwgfHwgbGVuKGgpID09IDAgeworCQlyZXR1cm4gbmlsLCBuaWwKKwl9CisJYiwgZXJyIDo9IGpzb24uTWFyc2hhbChtYXBbc3RyaW5nXWludGVyZmFjZXt9KGgpKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIEVuY29kZUVzY2FwZShiKSwgbmlsCit9CisKKy8vIEJhc2U2NCBpbXBsZW1lbnRzIHRoZSBFbmNvZGVyIGludGVyZmFjZS4KK2Z1bmMgKGggSGVhZGVyKSBCYXNlNjQoKSAoW11ieXRlLCBlcnJvcikgeworCXJldHVybiBoLk1hcnNoYWxKU09OKCkKK30KKworLy8gUHJvdGVjdGVkIEhlYWRlcnMgYXJlIGJhc2U2NC1lbmNvZGVkIGFmdGVyIHRoZXkncmUgbWFyc2hhbGVkIGludG8KKy8vIEpTT04uCit0eXBlIFByb3RlY3RlZCBIZWFkZXIKKworLy8gR2V0IHJldHJpZXZlcyB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB3aXRoIGtleSBmcm9tIHRoZSBQcm90ZWN0ZWQgSGVhZGVyLgorZnVuYyAocCBQcm90ZWN0ZWQpIEdldChrZXkgc3RyaW5nKSBpbnRlcmZhY2V7fSB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gbmlsCisJfQorCXJldHVybiBwW2tleV0KK30KKworLy8gU2V0IHNldHMgUHJvdGVjdGVkW2tleV0gPSB2YWwuIEl0J2xsIG92ZXJ3cml0ZSB3aXRob3V0IHdhcm5pbmcuCitmdW5jIChwIFByb3RlY3RlZCkgU2V0KGtleSBzdHJpbmcsIHZhbCBpbnRlcmZhY2V7fSkgeworCXBba2V5XSA9IHZhbAorfQorCisvLyBEZWwgcmVtb3ZlcyB0aGUgdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB3aXRoIGtleSBmcm9tIHRoZSBQcm90ZWN0ZWQgSGVhZGVyLgorZnVuYyAocCBQcm90ZWN0ZWQpIERlbChrZXkgc3RyaW5nKSB7CisJZGVsZXRlKHAsIGtleSkKK30KKworLy8gSGFzIHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGV4aXN0cyBpbnNpZGUgdGhlIFByb3RlY3RlZAorLy8gSGVhZGVyLgorZnVuYyAocCBQcm90ZWN0ZWQpIEhhcyhrZXkgc3RyaW5nKSBib29sIHsKKwlfLCBvayA6PSBwW2tleV0KKwlyZXR1cm4gb2sKK30KKworLy8gTWFyc2hhbEpTT04gaW1wbGVtZW50cyBqc29uLk1hcnNoYWxlciBmb3IgUHJvdGVjdGVkLgorZnVuYyAocCBQcm90ZWN0ZWQpIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKKwliLCBlcnIgOj0ganNvbi5NYXJzaGFsKG1hcFtzdHJpbmddaW50ZXJmYWNle30ocCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gRW5jb2RlRXNjYXBlKGIpLCBuaWwKK30KKworLy8gQmFzZTY0IGltcGxlbWVudHMgdGhlIEVuY29kZXIgaW50ZXJmYWNlLgorZnVuYyAocCBQcm90ZWN0ZWQpIEJhc2U2NCgpIChbXWJ5dGUsIGVycm9yKSB7CisJYiwgZXJyIDo9IGpzb24uTWFyc2hhbChtYXBbc3RyaW5nXWludGVyZmFjZXt9KHApKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIEJhc2U2NEVuY29kZShiKSwgbmlsCit9CisKKy8vIFVubWFyc2hhbEpTT04gaW1wbGVtZW50cyBqc29uLlVubWFyc2hhbGVyIGZvciBQcm90ZWN0ZWQuCitmdW5jIChwICpQcm90ZWN0ZWQpIFVubWFyc2hhbEpTT04oYiBbXWJ5dGUpIGVycm9yIHsKKwliLCBlcnIgOj0gRGVjb2RlRXNjYXBlZChiKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJLy8gU2luY2UganNvbi5Vbm1hcnNoYWwgY2FsbHMgVW5tYXJzaGFsSlNPTiwKKwkvLyBjYWxsaW5nIGpzb24uVW5tYXJzaGFsIG9uICpwIHdvdWxkIGJlIGluZmluaXRlbHkgcmVjdXJzaXZlCisJLy8gQSB0ZW1wIHZhcmlhYmxlIGlzIG5lZWRlZCBiZWNhdXNlICZIZWFkZXIoKnApIGlzIGludmFsaWQgR28uCisKKwl0bXAgOj0gbWFwW3N0cmluZ11pbnRlcmZhY2V7fSgqcCkKKwlpZiBlcnIgPSBqc29uLlVubWFyc2hhbChiLCAmdG1wKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJKnAgPSBQcm90ZWN0ZWQodG1wKQorCXJldHVybiBuaWwKK30KKwordmFyICgKKwlfIGpzb24uTWFyc2hhbGVyICAgPSAoUHJvdGVjdGVkKShuaWwpCisJXyBqc29uLlVubWFyc2hhbGVyID0gKCpQcm90ZWN0ZWQpKG5pbCkKKykKZGlmZiAtLWdpdCBhL2hlYWRlcl90ZXN0LmdvIGIvaGVhZGVyX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkNmU1NwotLS0gL2Rldi9udWxsCisrKyBiL2hlYWRlcl90ZXN0LmdvCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2Ugam9zZQorCitpbXBvcnQgKAorCSJlbmNvZGluZy9qc29uIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RNYXJzaGFsUHJvdGVjdGVkSGVhZGVyKHQgKnRlc3RpbmcuVCkgeworCXAgOj0gUHJvdGVjdGVkeworCQkiYWxnIjogIkhNMjU2IiwKKwl9CisKKwliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHApCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCX0KKworCXZhciBwMiBQcm90ZWN0ZWQKKworCWlmIGpzb24uVW5tYXJzaGFsKGIsICZwMik7IGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwl9CisKKwlpZiBwMlsiYWxnIl0gIT0gcFsiYWxnIl0geworCQlFcnJvcih0LCBwWyJhbGciXSwgcDJbImFsZyJdKQorCX0KK30KZGlmZiAtLWdpdCBhL2p3cy9lY2RzYS5nbyBiL2p3cy9lY2RzYS5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWE2MzI4Ci0tLSAvZGV2L251bGwKKysrIGIvandzL2VjZHNhLmdvCkBAIC0wLDAgKzEsMTEzIEBACitwYWNrYWdlIGp3cworCitpbXBvcnQgKAorCSJjcnlwdG8iCisJImNyeXB0by9lY2RzYSIKKwkiY3J5cHRvL3JhbmQiCisJImVuY29kaW5nL2FzbjEiCisJImVuY29kaW5nL2pzb24iCisJImVycm9ycyIKKwkibWF0aC9iaWciCispCisKKy8vIEVyckVDRFNBVmVyaWZpY2F0aW9uIGlzIG1pc3NpbmcgZnJvbSBjcnlwdG8vZWNkc2EgY29tcGFyZWQgdG8gY3J5cHRvL3JzYQordmFyIEVyckVDRFNBVmVyaWZpY2F0aW9uID0gZXJyb3JzLk5ldygiY3J5cHRvL2VjZHNhOiB2ZXJpZmljYXRpb24gZXJyb3IiKQorCisvLyBTaWduaW5nTWV0aG9kRUNEU0EgaW1wbGVtZW50cyB0aGUgRUNEU0EgZmFtaWx5IG9mIHNpZ25pbmcgbWV0aG9kcyBzaWduaW5nCisvLyBtZXRob2RzCit0eXBlIFNpZ25pbmdNZXRob2RFQ0RTQSBzdHJ1Y3QgeworCU5hbWUgc3RyaW5nCisJSGFzaCBjcnlwdG8uSGFzaAorCV8gICAgc3RydWN0e30KK30KKworLy8gRUNQb2ludCBpcyBhIG1hcnNoYWxsaW5nIHN0cnVjdHVyZSBmb3IgdGhlIEVDIHBvaW50cyBSIGFuZCBTLgordHlwZSBFQ1BvaW50IHN0cnVjdCB7CisJUiAqYmlnLkludAorCVMgKmJpZy5JbnQKK30KKworLy8gU3BlY2lmaWMgaW5zdGFuY2VzIG9mIEVDIFNpZ25pbmdNZXRob2RzLgordmFyICgKKwkvLyBTaWduaW5nTWV0aG9kRVMyNTYgaW1wbGVtZW50cyBFUzI1Ni4KKwlTaWduaW5nTWV0aG9kRVMyNTYgPSAmU2lnbmluZ01ldGhvZEVDRFNBeworCQlOYW1lOiAiRVMyNTYiLAorCQlIYXNoOiBjcnlwdG8uU0hBMjU2LAorCX0KKworCS8vIFNpZ25pbmdNZXRob2RFUzM4NCBpbXBsZW1lbnRzIEVTMzg0LgorCVNpZ25pbmdNZXRob2RFUzM4NCA9ICZTaWduaW5nTWV0aG9kRUNEU0F7CisJCU5hbWU6ICJFUzM4NCIsCisJCUhhc2g6IGNyeXB0by5TSEEzODQsCisJfQorCisJLy8gU2lnbmluZ01ldGhvZEVTNTEyIGltcGxlbWVudHMgRVM1MTIuCisJU2lnbmluZ01ldGhvZEVTNTEyID0gJlNpZ25pbmdNZXRob2RFQ0RTQXsKKwkJTmFtZTogIkVTNTEyIiwKKwkJSGFzaDogY3J5cHRvLlNIQTUxMiwKKwl9CispCisKKy8vIEFsZyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBTaWduaW5nTWV0aG9kRUNEU0EgaW5zdGFuY2UuCitmdW5jIChtICpTaWduaW5nTWV0aG9kRUNEU0EpIEFsZygpIHN0cmluZyB7IHJldHVybiBtLk5hbWUgfQorCisvLyBWZXJpZnkgaW1wbGVtZW50cyB0aGUgVmVyaWZ5IG1ldGhvZCBmcm9tIFNpZ25pbmdNZXRob2QuCisvLyBGb3IgdGhpcyB2ZXJpZnkgbWV0aG9kLCBrZXkgbXVzdCBiZSBhbiAqZWNkc2EuUHVibGljS2V5LgorZnVuYyAobSAqU2lnbmluZ01ldGhvZEVDRFNBKSBWZXJpZnkocmF3IFtdYnl0ZSwgc2lnbmF0dXJlIFNpZ25hdHVyZSwga2V5IGludGVyZmFjZXt9KSBlcnJvciB7CisKKwllY2RzYUtleSwgb2sgOj0ga2V5LigqZWNkc2EuUHVibGljS2V5KQorCWlmICFvayB7CisJCXJldHVybiBFcnJJbnZhbGlkS2V5CisJfQorCisJLy8gVW5tYXJzaGFsIGFzbjEgRUNQb2ludAorCXZhciBlY3BvaW50IEVDUG9pbnQKKwlpZiBfLCBlcnIgOj0gYXNuMS5Vbm1hcnNoYWwoc2lnbmF0dXJlLCAmZWNwb2ludCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJLy8gVmVyaWZ5IHRoZSBzaWduYXR1cmUKKwlpZiAhZWNkc2EuVmVyaWZ5KGVjZHNhS2V5LCBtLnN1bShyYXcpLCBlY3BvaW50LlIsIGVjcG9pbnQuUykgeworCQlyZXR1cm4gRXJyRUNEU0FWZXJpZmljYXRpb24KKwl9CisJcmV0dXJuIG5pbAorfQorCisvLyBTaWduIGltcGxlbWVudHMgdGhlIFNpZ24gbWV0aG9kIGZyb20gU2lnbmluZ01ldGhvZC4KKy8vIEZvciB0aGlzIHNpZ25pbmcgbWV0aG9kLCBrZXkgbXVzdCBiZSBhbiAqZWNkc2EuUHJpdmF0ZUtleS4KK2Z1bmMgKG0gKlNpZ25pbmdNZXRob2RFQ0RTQSkgU2lnbihkYXRhIFtdYnl0ZSwga2V5IGludGVyZmFjZXt9KSAoU2lnbmF0dXJlLCBlcnJvcikgeworCisJZWNkc2FLZXksIG9rIDo9IGtleS4oKmVjZHNhLlByaXZhdGVLZXkpCisJaWYgIW9rIHsKKwkJcmV0dXJuIG5pbCwgRXJySW52YWxpZEtleQorCX0KKworCXIsIHMsIGVyciA6PSBlY2RzYS5TaWduKHJhbmQuUmVhZGVyLCBlY2RzYUtleSwgbS5zdW0oZGF0YSkpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKworCXNpZ25hdHVyZSwgZXJyIDo9IGFzbjEuTWFyc2hhbChFQ1BvaW50e1I6IHIsIFM6IHN9KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIFNpZ25hdHVyZShzaWduYXR1cmUpLCBuaWwKK30KKworZnVuYyAobSAqU2lnbmluZ01ldGhvZEVDRFNBKSBzdW0oYiBbXWJ5dGUpIFtdYnl0ZSB7CisJaCA6PSBtLkhhc2guTmV3KCkKKwloLldyaXRlKGIpCisJcmV0dXJuIGguU3VtKG5pbCkKK30KKworLy8gSGFzaGVyIGltcGxlbWVudHMgdGhlIEhhc2hlciBtZXRob2QgZnJvbSBTaWduaW5nTWV0aG9kLgorZnVuYyAobSAqU2lnbmluZ01ldGhvZEVDRFNBKSBIYXNoZXIoKSBjcnlwdG8uSGFzaCB7IHJldHVybiBtLkhhc2ggfQorCisvLyBNYXJzaGFsSlNPTiBpcyBpbiBjYXNlIHNvbWVib2R5IGRlY2lkZXMgdG8gcGxhY2UgU2lnbmluZ01ldGhvZEVDRFNBCisvLyBpbnNpZGUgdGhlIENsYWltcyBpbiB0aGUgImFsZyIgcG9ydGlvbi4gSW4gb3JkZXIgdG8ga2VlcCB0aGluZ3Mgc2FuZSwKKy8vIG1hcnNoYWxsaW5nIHRoaXMgd2lsbCBkbyB0aGUgc2FtZSB0aGluZyBhcyBqd3MuU2V0UHJvdGVjdGVkKCJhbGciLCBtLkFsZygpKQorZnVuYyAobSAqU2lnbmluZ01ldGhvZEVDRFNBKSBNYXJzaGFsSlNPTigpIChbXWJ5dGUsIGVycm9yKSB7CisJcmV0dXJuIFtdYnl0ZShgImAgKyBtLkFsZygpICsgYCJgKSwgbmlsCit9CisKK3ZhciBfIGpzb24uTWFyc2hhbGVyID0gKCpTaWduaW5nTWV0aG9kRUNEU0EpKG5pbCkKZGlmZiAtLWdpdCBhL2p3cy9lY2RzYV90ZXN0LmdvIGIvandzL2VjZHNhX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhMGY2MAotLS0gL2Rldi9udWxsCisrKyBiL2p3cy9lY2RzYV90ZXN0LmdvCkBAIC0wLDAgKzEsMTAwIEBACitwYWNrYWdlIGp3cworCisvLyBpbXBvcnQgKAorLy8gCSJjcnlwdG8vZWNkc2EiCisvLyAJImlvL2lvdXRpbCIKKy8vIAkic3RyaW5ncyIKKy8vIAkidGVzdGluZyIKKworLy8gCSJnaXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ28iCisvLyApCisKKy8vIHZhciBlY2RzYVRlc3REYXRhID0gW11zdHJ1Y3QgeworLy8gCW5hbWUgICAgICAgIHN0cmluZworLy8gCWtleXMgICAgICAgIG1hcFtzdHJpbmddc3RyaW5nCisvLyAJdG9rZW5TdHJpbmcgc3RyaW5nCisvLyAJYWxnICAgICAgICAgc3RyaW5nCisvLyAJY2xhaW1zICAgICAgbWFwW3N0cmluZ11pbnRlcmZhY2V7fQorLy8gCXZhbGlkICAgICAgIGJvb2wKKy8vIH17CisvLyAJeworLy8gCQkiQmFzaWMgRVMyNTYiLAorLy8gCQltYXBbc3RyaW5nXXN0cmluZ3sicHJpdmF0ZSI6ICJ0ZXN0L2VjMjU2LXByaXZhdGUucGVtIiwgInB1YmxpYyI6ICJ0ZXN0L2VjMjU2LXB1YmxpYy5wZW0ifSwKKy8vIAkJImV5SmhiR2NpT2lKRlV6STFOaUlzSW5SNWNDSTZJa3BYVkNKOS5leUptYjI4aU9pSmlZWElpZlEuTUVRQ0lIb1NKbm1HbFBhVlFEcWFjeF8yWGxYRWhocXRXY2VWb3Bqb21jMlBKTHRkQWlBVVRlR1BvTll4WncwejhtZ09ubkljam94UnVORFZadnliUlpGM3dSMWw4dyIsCisvLyAJCSJFUzI1NiIsCisvLyAJCW1hcFtzdHJpbmddaW50ZXJmYWNle317ImZvbyI6ICJiYXIifSwKKy8vIAkJdHJ1ZSwKKy8vIAl9LAorLy8gCXsKKy8vIAkJIkJhc2ljIEVTMzg0IiwKKy8vIAkJbWFwW3N0cmluZ11zdHJpbmd7InByaXZhdGUiOiAidGVzdC9lYzM4NC1wcml2YXRlLnBlbSIsICJwdWJsaWMiOiAidGVzdC9lYzM4NC1wdWJsaWMucGVtIn0sCisvLyAJCSJleUpoYkdjaU9pSkZVek00TkNJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbWIyOGlPaUppWVhJaWZRLk1HVUNNUUNIQnI2MUZYRHVGWTl4VWh5cDhpV1FBdUJJYVNnYWYxejJqXzhYcktjQ2Z6VFB6b1NhM1NaS3EtbTNMNDkyeGU4Q01HM2thZlJNZXVhTjVBdzhaSnhtT0xoa1RvNEQzLUxhR3pjYVVXSU52V3Zrd0ZNbDdkTUM4NjNzMGdvdjZ4dlh1QSIsCisvLyAJCSJFUzM4NCIsCisvLyAJCW1hcFtzdHJpbmddaW50ZXJmYWNle317ImZvbyI6ICJiYXIifSwKKy8vIAkJdHJ1ZSwKKy8vIAl9LAorLy8gCXsKKy8vIAkJIkJhc2ljIEVTNTEyIiwKKy8vIAkJbWFwW3N0cmluZ11zdHJpbmd7InByaXZhdGUiOiAidGVzdC9lYzUxMi1wcml2YXRlLnBlbSIsICJwdWJsaWMiOiAidGVzdC9lYzUxMi1wdWJsaWMucGVtIn0sCisvLyAJCSJleUpoYkdjaU9pSkZVelV4TWlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbWIyOGlPaUppWVhJaWZRLk1JR0lBa0lBbVZLamRKRTVsRzFieU9GZ1paVlRlTkRScDZFN1NOdlVqMFVydnB6b0JINm5ybGVXVlRjd2ZIemJ3V3Vvb05wUEFERFNGUl9RbDN6ZS1Wd3dpOGhCcVFzQ1FnSG4tWm9vTDh6ZWdrT1ZlRUVzcWQ3V0hXZGhiOFVla0ZDWXczWDhKbk5QLUQzd3ZaUTEtdGtrSGFrdDVnWjIteE8yOVR4ZlNQdW40VmlHa01ZYTdRNE4tUSIsCisvLyAJCSJFUzUxMiIsCisvLyAJCW1hcFtzdHJpbmddaW50ZXJmYWNle317ImZvbyI6ICJiYXIifSwKKy8vIAkJdHJ1ZSwKKy8vIAl9LAorLy8gCXsKKy8vIAkJImJhc2ljIEVTMjU2IGludmFsaWQ6IGZvbyA9PiBiYXIiLAorLy8gCQltYXBbc3RyaW5nXXN0cmluZ3sicHJpdmF0ZSI6ICJ0ZXN0L2VjMjU2LXByaXZhdGUucGVtIiwgInB1YmxpYyI6ICJ0ZXN0L2VjMjU2LXB1YmxpYy5wZW0ifSwKKy8vIAkJImV5SmhiR2NpT2lKRlV6STFOaUlzSW5SNWNDSTZJa3BYVkNKOS5leUptYjI4aU9pSmlZWElpZlEuTUVRQ0lIb1NKbm1HbFBhVlFEcWFjeF8yWGxYRWhocXRXY2VWb3Bqb21jMlBKTHRkQWlBVVRlR1BvTll4WncwejhtZ09ubkljam94UnVORFZadnliUlpGM3dSMWw4VyIsCisvLyAJCSJFUzI1NiIsCisvLyAJCW1hcFtzdHJpbmddaW50ZXJmYWNle317ImZvbyI6ICJiYXIifSwKKy8vIAkJZmFsc2UsCisvLyAJfSwKKy8vIH0KKworLy8gZnVuYyBUZXN0RUNEU0FWZXJpZnkodCAqdGVzdGluZy5UKSB7CisvLyAJZm9yIF8sIGRhdGEgOj0gcmFuZ2UgZWNkc2FUZXN0RGF0YSB7CisvLyAJCXZhciBlcnIgZXJyb3IKKworLy8gCQlrZXksIF8gOj0gaW91dGlsLlJlYWRGaWxlKGRhdGEua2V5c1sicHVibGljIl0pCisKKy8vIAkJdmFyIGVjZHNhS2V5ICplY2RzYS5QdWJsaWNLZXkKKy8vIAkJaWYgZWNkc2FLZXksIGVyciA9IGp3dC5QYXJzZUVDUHVibGljS2V5RnJvbVBFTShrZXkpOyBlcnIgIT0gbmlsIHsKKy8vIAkJCXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgRUNEU0EgcHVibGljIGtleTogJXYiLCBlcnIpCisvLyAJCX0KKworLy8gCQlwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KGRhdGEudG9rZW5TdHJpbmcsICIuIikKKworLy8gCQltZXRob2QgOj0gand0LkdldFNpZ25pbmdNZXRob2QoZGF0YS5hbGcpCisvLyAJCWVyciA9IG1ldGhvZC5WZXJpZnkoc3RyaW5ncy5Kb2luKHBhcnRzWzA6Ml0sICIuIiksIHBhcnRzWzJdLCBlY2RzYUtleSkKKy8vIAkJaWYgZGF0YS52YWxpZCAmJiBlcnIgIT0gbmlsIHsKKy8vIAkJCXQuRXJyb3JmKCJbJXZdIEVycm9yIHdoaWxlIHZlcmlmeWluZyBrZXk6ICV2IiwgZGF0YS5uYW1lLCBlcnIpCisvLyAJCX0KKy8vIAkJaWYgIWRhdGEudmFsaWQgJiYgZXJyID09IG5pbCB7CisvLyAJCQl0LkVycm9yZigiWyV2XSBJbnZhbGlkIGtleSBwYXNzZWQgdmFsaWRhdGlvbiIsIGRhdGEubmFtZSkKKy8vIAkJfQorLy8gCX0KKy8vIH0KKworLy8gZnVuYyBUZXN0RUNEU0FTaWduKHQgKnRlc3RpbmcuVCkgeworLy8gCWZvciBfLCBkYXRhIDo9IHJhbmdlIGVjZHNhVGVzdERhdGEgeworLy8gCQl2YXIgZXJyIGVycm9yCisvLyAJCWtleSwgXyA6PSBpb3V0aWwuUmVhZEZpbGUoZGF0YS5rZXlzWyJwcml2YXRlIl0pCisKKy8vIAkJdmFyIGVjZHNhS2V5ICplY2RzYS5Qcml2YXRlS2V5CisvLyAJCWlmIGVjZHNhS2V5LCBlcnIgPSBqd3QuUGFyc2VFQ1ByaXZhdGVLZXlGcm9tUEVNKGtleSk7IGVyciAhPSBuaWwgeworLy8gCQkJdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBFQ0RTQSBwcml2YXRlIGtleTogJXYiLCBlcnIpCisvLyAJCX0KKworLy8gCQlpZiBkYXRhLnZhbGlkIHsKKy8vIAkJCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQoZGF0YS50b2tlblN0cmluZywgIi4iKQorLy8gCQkJbWV0aG9kIDo9IGp3dC5HZXRTaWduaW5nTWV0aG9kKGRhdGEuYWxnKQorLy8gCQkJc2lnLCBlcnIgOj0gbWV0aG9kLlNpZ24oc3RyaW5ncy5Kb2luKHBhcnRzWzA6Ml0sICIuIiksIGVjZHNhS2V5KQorLy8gCQkJaWYgZXJyICE9IG5pbCB7CisvLyAJCQkJdC5FcnJvcmYoIlsldl0gRXJyb3Igc2lnbmluZyB0b2tlbjogJXYiLCBkYXRhLm5hbWUsIGVycikKKy8vIAkJCX0KKy8vIAkJCWlmIHNpZyA9PSBwYXJ0c1syXSB7CisvLyAJCQkJdC5FcnJvcmYoIlsldl0gSWRlbnRpY2FsIHNpZ25hdHVyZXNcbmJlZm9yZTpcbiV2XG5hZnRlcjpcbiV2IiwgZGF0YS5uYW1lLCBwYXJ0c1syXSwgc2lnKQorLy8gCQkJfQorLy8gCQl9CisvLyAJfQorLy8gfQpkaWZmIC0tZ2l0IGEvandzL2VjZHNhX3V0aWxzLmdvIGIvandzL2VjZHNhX3V0aWxzLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOGEzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9qd3MvZWNkc2FfdXRpbHMuZ28KQEAgLTAsMCArMSw0OCBAQAorcGFja2FnZSBqd3MKKworaW1wb3J0ICgKKwkiY3J5cHRvL2VjZHNhIgorCSJjcnlwdG8veDUwOSIKKwkiZW5jb2RpbmcvcGVtIgorCSJlcnJvcnMiCispCisKKy8vIEVDRFNBIHBhcnNpbmcgZXJyb3JzLgordmFyICgKKwlFcnJOb3RFQ1B1YmxpY0tleSAgPSBlcnJvcnMuTmV3KCJLZXkgaXMgbm90IGEgdmFsaWQgRUNEU0EgcHVibGljIGtleSIpCisJRXJyTm90RUNQcml2YXRlS2V5ID0gZXJyb3JzLk5ldygiS2V5IGlzIG5vdCBhIHZhbGlkIEVDRFNBIHByaXZhdGUga2V5IikKKykKKworLy8gUGFyc2VFQ1ByaXZhdGVLZXlGcm9tUEVNIHdpbGwgcGFyc2UgYSBQRU0gZW5jb2RlZCBFQyBQcml2YXRlCisvLyBLZXkgU3RydWN0dXJlLgorZnVuYyBQYXJzZUVDUHJpdmF0ZUtleUZyb21QRU0oa2V5IFtdYnl0ZSkgKCplY2RzYS5Qcml2YXRlS2V5LCBlcnJvcikgeworCWJsb2NrLCBfIDo9IHBlbS5EZWNvZGUoa2V5KQorCWlmIGJsb2NrID09IG5pbCB7CisJCXJldHVybiBuaWwsIEVycktleU11c3RCZVBFTUVuY29kZWQKKwl9CisJcmV0dXJuIHg1MDkuUGFyc2VFQ1ByaXZhdGVLZXkoYmxvY2suQnl0ZXMpCit9CisKKy8vIFBhcnNlRUNQdWJsaWNLZXlGcm9tUEVNIHdpbGwgcGFyc2UgYSBQRU0gZW5jb2RlZCBQS0NTMSBvciBQS0NTOCBwdWJsaWMga2V5CitmdW5jIFBhcnNlRUNQdWJsaWNLZXlGcm9tUEVNKGtleSBbXWJ5dGUpICgqZWNkc2EuUHVibGljS2V5LCBlcnJvcikgeworCisJYmxvY2ssIF8gOj0gcGVtLkRlY29kZShrZXkpCisJaWYgYmxvY2sgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgRXJyS2V5TXVzdEJlUEVNRW5jb2RlZAorCX0KKworCXBhcnNlZEtleSwgZXJyIDo9IHg1MDkuUGFyc2VQS0lYUHVibGljS2V5KGJsb2NrLkJ5dGVzKQorCWlmIGVyciAhPSBuaWwgeworCQljZXJ0LCBlcnIgOj0geDUwOS5QYXJzZUNlcnRpZmljYXRlKGJsb2NrLkJ5dGVzKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBuaWwsIGVycgorCQl9CisJCXBhcnNlZEtleSA9IGNlcnQuUHVibGljS2V5CisJfQorCisJcGtleSwgb2sgOj0gcGFyc2VkS2V5LigqZWNkc2EuUHVibGljS2V5KQorCWlmICFvayB7CisJCXJldHVybiBuaWwsIEVyck5vdEVDUHVibGljS2V5CisJfQorCXJldHVybiBwa2V5LCBuaWwKK30KZGlmZiAtLWdpdCBhL2p3cy9lcnJvcnMuZ28gYi9qd3MvZXJyb3JzLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNzkyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9qd3MvZXJyb3JzLmdvCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgandzCisKK2ltcG9ydCAiZXJyb3JzIgorCit2YXIgKAorCS8vIEVyckludmFsaWRLZXkgbWVhbnMgdGhlIGtleSBhcmd1bWVudCBwYXNzZWQgdG8gU2lnbmluZ01ldGhvZC5WZXJpZnkKKwkvLyB3YXMgbm90IHRoZSBjb3JyZWN0IHR5cGUuCisJRXJySW52YWxpZEtleSA9IGVycm9ycy5OZXcoImtleSBpcyBpbnZhbGlkIikKKworCS8vIEVyck5vdEVub3VnaE1ldGhvZHMgaXMgcmV0dXJuZWQgaWYgTmV3IHdhcyBjYWxsZWQgX29yXyB0aGUgRmxhdC9Db21wYWN0CisJLy8gbWV0aG9kcyB3ZXJlIGNhbGxlZCB3aXRoIDAgU2lnbmluZ01ldGhvZHMuCisJRXJyTm90RW5vdWdoTWV0aG9kcyA9IGVycm9ycy5OZXcoIm5vdCBlbm91Z2ggbWV0aG9kcyBwcm92aWRlZCIpCisKKwkvLyBFcnJDb3VsZE5vdFVubWFyc2hhbCBpcyByZXR1cm5lZCB3aGVuIFBhcnNlJ3MganNvbi5Vbm1hcnNoYWxlcgorCS8vIHBhcmFtZXRlciByZXR1cm5zIGFuIGVycm9yLgorCUVyckNvdWxkTm90VW5tYXJzaGFsID0gZXJyb3JzLk5ldygiY3VzdG9tIHVubWFyc2hhbCBmYWlsZWQiKQorKQpkaWZmIC0tZ2l0IGEvandzL2htYWMuZ28gYi9qd3MvaG1hYy5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI1ZDcyCi0tLSAvZGV2L251bGwKKysrIGIvandzL2htYWMuZ28KQEAgLTAsMCArMSw3OSBAQAorcGFja2FnZSBqd3MKKworaW1wb3J0ICgKKwkiY3J5cHRvIgorCSJjcnlwdG8vaG1hYyIKKwkiZW5jb2RpbmcvanNvbiIKKwkiZXJyb3JzIgorKQorCisvLyBTaWduaW5nTWV0aG9kSE1BQyBpbXBsZW1lbnRzIHRoZSBITUFDLVNIQSBmYW1pbHkgb2YgU2lnbmluZ01ldGhvZHMuCit0eXBlIFNpZ25pbmdNZXRob2RITUFDIHN0cnVjdCB7CisJTmFtZSBzdHJpbmcKKwlIYXNoIGNyeXB0by5IYXNoCisJXyAgICBzdHJ1Y3R7fQorfQorCisvLyBTcGVjaWZpYyBpbnN0YW5jZXMgb2YgSE1BQy1TSEEgU2lnbmluZ01ldGhvZHMuCit2YXIgKAorCS8vIFNpZ25pbmdNZXRob2RIUzI1NiBpbXBsZW1lbnRzIEhTMjU2LgorCVNpZ25pbmdNZXRob2RIUzI1NiA9ICZTaWduaW5nTWV0aG9kSE1BQ3sKKwkJTmFtZTogIkhTMjU2IiwKKwkJSGFzaDogY3J5cHRvLlNIQTI1NiwKKwl9CisKKwkvLyBTaWduaW5nTWV0aG9kSFMzODQgaW1wbGVtZW50cyBIUzM4NC4KKwlTaWduaW5nTWV0aG9kSFMzODQgPSAmU2lnbmluZ01ldGhvZEhNQUN7CisJCU5hbWU6ICJIUzM4NCIsCisJCUhhc2g6IGNyeXB0by5TSEEzODQsCisJfQorCisJLy8gU2lnbmluZ01ldGhvZEhTNTEyIGltcGxlbWVudHMgSFM1MTIuCisJU2lnbmluZ01ldGhvZEhTNTEyID0gJlNpZ25pbmdNZXRob2RITUFDeworCQlOYW1lOiAiSFM1MTIiLAorCQlIYXNoOiBjcnlwdG8uU0hBNTEyLAorCX0KKworCS8vIEVyclNpZ25hdHVyZUludmFsaWQgaXMgcmV0dXJuZWQgd2hlbiB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlIGlzIGZvdW5kCisJLy8gdG8gYmUgaW52YWxpZC4KKwlFcnJTaWduYXR1cmVJbnZhbGlkID0gZXJyb3JzLk5ldygic2lnbmF0dXJlIGlzIGludmFsaWQiKQorKQorCisvLyBBbGcgaW1wbGVtZW50cyB0aGUgU2lnbmluZ01ldGhvZCBpbnRlcmZhY2UuCitmdW5jIChtICpTaWduaW5nTWV0aG9kSE1BQykgQWxnKCkgc3RyaW5nIHsgcmV0dXJuIG0uTmFtZSB9CisKKy8vIFZlcmlmeSBpbXBsZW1lbnRzIHRoZSBWZXJpZnkgbWV0aG9kIGZyb20gU2lnbmluZ01ldGhvZC4KKy8vIEZvciB0aGlzIHNpZ25pbmcgbWV0aG9kLCBtdXN0IGJlIGEgW11ieXRlLgorZnVuYyAobSAqU2lnbmluZ01ldGhvZEhNQUMpIFZlcmlmeShyYXcgW11ieXRlLCBzaWduYXR1cmUgU2lnbmF0dXJlLCBrZXkgaW50ZXJmYWNle30pIGVycm9yIHsKKwlrZXlCeXRlcywgb2sgOj0ga2V5LihbXWJ5dGUpCisJaWYgIW9rIHsKKwkJcmV0dXJuIEVyckludmFsaWRLZXkKKwl9CisJaGFzaGVyIDo9IGhtYWMuTmV3KG0uSGFzaC5OZXcsIGtleUJ5dGVzKQorCWlmIGhtYWMuRXF1YWwoc2lnbmF0dXJlLCBoYXNoZXIuU3VtKHJhdykpIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1cm4gRXJyU2lnbmF0dXJlSW52YWxpZAorfQorCisvLyBTaWduIGltcGxlbWVudHMgdGhlIFNpZ24gbWV0aG9kIGZyb20gU2lnbmluZ01ldGhvZCBmb3IgdGhpcyBzaWduaW5nIG1ldGhvZC4KKy8vIEtleSBtdXN0IGJlIGEgW11ieXRlLgorZnVuYyAobSAqU2lnbmluZ01ldGhvZEhNQUMpIFNpZ24oZGF0YSBbXWJ5dGUsIGtleSBpbnRlcmZhY2V7fSkgKFNpZ25hdHVyZSwgZXJyb3IpIHsKKwlrZXlCeXRlcywgb2sgOj0ga2V5LihbXWJ5dGUpCisJaWYgIW9rIHsKKwkJcmV0dXJuIG5pbCwgRXJySW52YWxpZEtleQorCX0KKwloYXNoZXIgOj0gaG1hYy5OZXcobS5IYXNoLk5ldywga2V5Qnl0ZXMpCisJcmV0dXJuIFNpZ25hdHVyZShoYXNoZXIuU3VtKGRhdGEpKSwgbmlsCit9CisKKy8vIEhhc2hlciBpbXBsZW1lbnRzIHRoZSBTaWduaW5nTWV0aG9kIGludGVyZmFjZS4KK2Z1bmMgKG0gKlNpZ25pbmdNZXRob2RITUFDKSBIYXNoZXIoKSBjcnlwdG8uSGFzaCB7IHJldHVybiBtLkhhc2ggfQorCisvLyBNYXJzaGFsSlNPTiBpbXBsZW1lbnRzIGpzb24uTWFyc2hhbGVyLgorLy8gU2VlIFNpZ25pbmdNZXRob2RFQ0RTQS5NYXJzaGFsSlNPTigpIGZvciBpbmZvcm1hdGlvbi4KK2Z1bmMgKG0gKlNpZ25pbmdNZXRob2RITUFDKSBNYXJzaGFsSlNPTigpIChbXWJ5dGUsIGVycm9yKSB7CisJcmV0dXJuIFtdYnl0ZShgImAgKyBtLkFsZygpICsgYCJgKSwgbmlsCit9CisKK3ZhciBfIGpzb24uTWFyc2hhbGVyID0gKCpTaWduaW5nTWV0aG9kSE1BQykobmlsKQpkaWZmIC0tZ2l0IGEvandzL2htYWNfdGVzdC5nbyBiL2p3cy9obWFjX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiMzU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2p3cy9obWFjX3Rlc3QuZ28KQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBqd3MKKworLy8gaW1wb3J0ICgKKy8vIAkiZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIgorLy8gCSJpby9pb3V0aWwiCisvLyAJInN0cmluZ3MiCisvLyAJInRlc3RpbmciCisvLyApCisKKy8vIHZhciBobWFjVGVzdERhdGEgPSBbXXN0cnVjdCB7CisvLyAJbmFtZSAgICAgICAgc3RyaW5nCisvLyAJdG9rZW5TdHJpbmcgc3RyaW5nCisvLyAJYWxnICAgICAgICAgc3RyaW5nCisvLyAJY2xhaW1zICAgICAgbWFwW3N0cmluZ11pbnRlcmZhY2V7fQorLy8gCXZhbGlkICAgICAgIGJvb2wKKy8vIH17CisvLyAJeworLy8gCQkid2ViIHNhbXBsZSIsCisvLyAJCSJleUowZVhBaU9pSktWMVFpTEEwS0lDSmhiR2NpT2lKSVV6STFOaUo5LmV5SnBjM01pT2lKcWIyVWlMQTBLSUNKbGVIQWlPakV6TURBNE1Ua3pPREFzRFFvZ0ltaDBkSEE2THk5bGVHRnRjR3hsTG1OdmJTOXBjMTl5YjI5MElqcDBjblZsZlEuZEJqZnRKZVo0Q1ZQLW1COTJLMjd1aGJVSlUxcDFyX3dXMWdGV0ZPRWpYayIsCisvLyAJCSJIUzI1NiIsCisvLyAJCW1hcFtzdHJpbmddaW50ZXJmYWNle317ImlzcyI6ICJqb2UiLCAiZXhwIjogMTMwMDgxOTM4MCwgImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290IjogdHJ1ZX0sCisvLyAJCXRydWUsCisvLyAJfSwKKy8vIAl7CisvLyAJCSJIUzM4NCIsCisvLyAJCSJleUpoYkdjaU9pSklVek00TkNJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakV1TXpBd09ERTVNemhsS3pBNUxDSm9kSFJ3T2k4dlpYaGhiWEJzWlM1amIyMHZhWE5mY205dmRDSTZkSEoxWlN3aWFYTnpJam9pYW05bEluMC5LV1pFdU9ENWxiQnhaMzRnN0YtU2xWTEFRX3I1S0FwV05XbFpJSU15UVZ6NVpzNThhN1hkTnpqNV8wRWNOb095IiwKKy8vIAkJIkhTMzg0IiwKKy8vIAkJbWFwW3N0cmluZ11pbnRlcmZhY2V7fXsiaXNzIjogImpvZSIsICJleHAiOiAxMzAwODE5MzgwLCAiaHR0cDovL2V4YW1wbGUuY29tL2lzX3Jvb3QiOiB0cnVlfSwKKy8vIAkJdHJ1ZSwKKy8vIAl9LAorLy8gCXsKKy8vIAkJIkhTNTEyIiwKKy8vIAkJImV5SmhiR2NpT2lKSVV6VXhNaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpsZUhBaU9qRXVNekF3T0RFNU16aGxLekE1TENKb2RIUndPaTh2WlhoaGJYQnNaUzVqYjIwdmFYTmZjbTl2ZENJNmRISjFaU3dpYVhOeklqb2lhbTlsSW4wLkNON1lpalJYNkF3MW4yanlJMklkMXc5MGphLURFTVlpV2l4aFlDeUhucloxVmZKUmFGUXoxYkViampBNUZuNENMWWFVRzQzMmRFWW1TYlM0U2Fva213IiwKKy8vIAkJIkhTNTEyIiwKKy8vIAkJbWFwW3N0cmluZ11pbnRlcmZhY2V7fXsiaXNzIjogImpvZSIsICJleHAiOiAxMzAwODE5MzgwLCAiaHR0cDovL2V4YW1wbGUuY29tL2lzX3Jvb3QiOiB0cnVlfSwKKy8vIAkJdHJ1ZSwKKy8vIAl9LAorLy8gCXsKKy8vIAkJIndlYiBzYW1wbGU6IGludmFsaWQiLAorLy8gCQkiZXlKMGVYQWlPaUpLVjFRaUxBMEtJQ0poYkdjaU9pSklVekkxTmlKOS5leUpwYzNNaU9pSnFiMlVpTEEwS0lDSmxlSEFpT2pFek1EQTRNVGt6T0RBc0RRb2dJbWgwZEhBNkx5OWxlR0Z0Y0d4bExtTnZiUzlwYzE5eWIyOTBJanAwY25WbGZRLmRCamZ0SmVaNENWUC1tQjkySzI3dWhiVUpVMXAxcl93VzFnRldGT0VqWG8iLAorLy8gCQkiSFMyNTYiLAorLy8gCQltYXBbc3RyaW5nXWludGVyZmFjZXt9eyJpc3MiOiAiam9lIiwgImV4cCI6IDEzMDA4MTkzODAsICJodHRwOi8vZXhhbXBsZS5jb20vaXNfcm9vdCI6IHRydWV9LAorLy8gCQlmYWxzZSwKKy8vIAl9LAorLy8gfQorCisvLyAvLyBTYW1wbGUgZGF0YSBmcm9tIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWpvbmVzLWpzb24td2ViLXNpZ25hdHVyZS0wNCNhcHBlbmRpeC1BLjEKKy8vIHZhciBobWFjVGVzdEtleSwgXyA9IGlvdXRpbC5SZWFkRmlsZSgidGVzdC9obWFjVGVzdEtleSIpCisKKy8vIGZ1bmMgVGVzdEhNQUNWZXJpZnkodCAqdGVzdGluZy5UKSB7CisvLyAJZm9yIF8sIGRhdGEgOj0gcmFuZ2UgaG1hY1Rlc3REYXRhIHsKKy8vIAkJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChkYXRhLnRva2VuU3RyaW5nLCAiLiIpCisKKy8vIAkJbWV0aG9kIDo9IGp3dC5HZXRTaWduaW5nTWV0aG9kKGRhdGEuYWxnKQorLy8gCQllcnIgOj0gbWV0aG9kLlZlcmlmeShzdHJpbmdzLkpvaW4ocGFydHNbMDoyXSwgIi4iKSwgcGFydHNbMl0sIGhtYWNUZXN0S2V5KQorLy8gCQlpZiBkYXRhLnZhbGlkICYmIGVyciAhPSBuaWwgeworLy8gCQkJdC5FcnJvcmYoIlsldl0gRXJyb3Igd2hpbGUgdmVyaWZ5aW5nIGtleTogJXYiLCBkYXRhLm5hbWUsIGVycikKKy8vIAkJfQorLy8gCQlpZiAhZGF0YS52YWxpZCAmJiBlcnIgPT0gbmlsIHsKKy8vIAkJCXQuRXJyb3JmKCJbJXZdIEludmFsaWQga2V5IHBhc3NlZCB2YWxpZGF0aW9uIiwgZGF0YS5uYW1lKQorLy8gCQl9CisvLyAJfQorLy8gfQorCisvLyBmdW5jIFRlc3RITUFDU2lnbih0ICp0ZXN0aW5nLlQpIHsKKy8vIAlmb3IgXywgZGF0YSA6PSByYW5nZSBobWFjVGVzdERhdGEgeworLy8gCQlpZiBkYXRhLnZhbGlkIHsKKy8vIAkJCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQoZGF0YS50b2tlblN0cmluZywgIi4iKQorLy8gCQkJbWV0aG9kIDo9IGp3dC5HZXRTaWduaW5nTWV0aG9kKGRhdGEuYWxnKQorLy8gCQkJc2lnLCBlcnIgOj0gbWV0aG9kLlNpZ24oc3RyaW5ncy5Kb2luKHBhcnRzWzA6Ml0sICIuIiksIGhtYWNUZXN0S2V5KQorLy8gCQkJaWYgZXJyICE9IG5pbCB7CisvLyAJCQkJdC5FcnJvcmYoIlsldl0gRXJyb3Igc2lnbmluZyB0b2tlbjogJXYiLCBkYXRhLm5hbWUsIGVycikKKy8vIAkJCX0KKy8vIAkJCWlmIHNpZyAhPSBwYXJ0c1syXSB7CisvLyAJCQkJdC5FcnJvcmYoIlsldl0gSW5jb3JyZWN0IHNpZ25hdHVyZS5cbndhczpcbiV2XG5leHBlY3Rpbmc6XG4ldiIsIGRhdGEubmFtZSwgc2lnLCBwYXJ0c1syXSkKKy8vIAkJCX0KKy8vIAkJfQorLy8gCX0KKy8vIH0KKworLy8gZnVuYyBCZW5jaG1hcmtIUzI1NlNpZ25pbmcoYiAqdGVzdGluZy5CKSB7CisvLyAJYmVuY2htYXJrU2lnbmluZyhiLCBqd3QuU2lnbmluZ01ldGhvZEhTMjU2LCBobWFjVGVzdEtleSkKKy8vIH0KKworLy8gZnVuYyBCZW5jaG1hcmtIUzM4NFNpZ25pbmcoYiAqdGVzdGluZy5CKSB7CisvLyAJYmVuY2htYXJrU2lnbmluZyhiLCBqd3QuU2lnbmluZ01ldGhvZEhTMzg0LCBobWFjVGVzdEtleSkKKy8vIH0KKworLy8gZnVuYyBCZW5jaG1hcmtIUzUxMlNpZ25pbmcoYiAqdGVzdGluZy5CKSB7CisvLyAJYmVuY2htYXJrU2lnbmluZyhiLCBqd3QuU2lnbmluZ01ldGhvZEhTNTEyLCBobWFjVGVzdEtleSkKKy8vIH0KZGlmZiAtLWdpdCBhL2p3cy9qd3MuZ28gYi9qd3MvandzLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGYzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9qd3MvandzLmdvCkBAIC0wLDAgKzEsMTc1IEBACitwYWNrYWdlIGp3cworCitpbXBvcnQgKAorCSJlbmNvZGluZy9qc29uIgorCSJmbXQiCisKKwkiZ2l0aHViLmNvbS9TZXJtb0RpZ2l0YWwvam9zZSIKKykKKworLy8gSldTIHJlcHJlc2VudHMgYSBzcGVjaWZpYyBKV1MuCit0eXBlIEpXUyBzdHJ1Y3QgeworCXBheWxvYWQgKnBheWxvYWQKKwlwbGNhY2hlIHJhd0Jhc2U2NAorCWNsZWFuICAgYm9vbAorCisJc2IgICAgICBbXXNpZ0hlYWQKKwltZXRob2RzIFtdU2lnbmluZ01ldGhvZAorfQorCisvLyBzaWdIZWFkIHJlcHJlc2VudHMgdGhlICdzaWduYXR1cmVzJyBtZW1iZXIgb2YgdGhlIEpXUycgImdlbmVyYWwiCisvLyBzZXJpYWxpemF0aW9uIGZvcm0gcGVyCisvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUxNSNzZWN0aW9uLTcuMi4xCisvLworLy8gSXQncyBlbWJlZGRlZCBpbnNpZGUgdGhlICJmbGF0IiBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gcHJvcGVybHkKKy8vIGNyZWF0ZSB0aGUgImZsYXQiIEpXUy4KK3R5cGUgc2lnSGVhZCBzdHJ1Y3QgeworCVByb3RlY3RlZCAgIHJhd0Jhc2U2NCBganNvbjoicHJvdGVjdGVkLG9taXRlbXB0eSJgCisJVW5wcm90ZWN0ZWQgcmF3QmFzZTY0IGBqc29uOiJoZWFkZXIsb21pdGVtcHR5ImAKKwlTaWduYXR1cmUgICBTaWduYXR1cmUgYGpzb246InNpZ25hdHVyZSJgCisKKwlwcm90ZWN0ZWQgICBqb3NlLlByb3RlY3RlZCBganNvbjoiLSJgCisJdW5wcm90ZWN0ZWQgam9zZS5IZWFkZXIgICAgYGpzb246Ii0iYAorCWNsZWFuICAgICAgIGJvb2wgICAgICAgICAgIGBqc29uOiItImAKK30KKworLy8gTmV3IGNyZWF0ZXMgYSBuZXcgSldTIHdpdGggdGhlIHByb3ZpZGVkIFNpZ25pbmdNZXRob2RzLgorZnVuYyBOZXcoY29udGVudCBpbnRlcmZhY2V7fSwgbWV0aG9kcyAuLi5TaWduaW5nTWV0aG9kKSAqSldTIHsKKwlzYiA6PSBtYWtlKFtdc2lnSGVhZCwgbGVuKG1ldGhvZHMpKQorCWZvciBpIDo9IHJhbmdlIG1ldGhvZHMgeworCQlzYltpXSA9IHNpZ0hlYWR7CisJCQlwcm90ZWN0ZWQ6IGpvc2UuUHJvdGVjdGVkeworCQkJCSJhbGciOiBtZXRob2RzW2ldLkFsZygpLAorCQkJfSwKKwkJCXVucHJvdGVjdGVkOiBtYWtlKGpvc2UuSGVhZGVyKSwKKwkJfQorCX0KKwlyZXR1cm4gJkpXU3sKKwkJcGF5bG9hZDogJnBheWxvYWR7djogY29udGVudH0sCisJCXNiOiAgICAgIHNiLAorCQltZXRob2RzOiBtZXRob2RzLAorCX0KK30KKwordHlwZSBnZW5lcmljIHN0cnVjdCB7CisJUGF5bG9hZCByYXdCYXNlNjQgYGpzb246InBheWxvYWQiYAorCXNpZ0hlYWQKKwlTaWduYXR1cmVzIFtdc2lnSGVhZCBganNvbjoic2lnbmF0dXJlcyxvbWl0ZW1wdHkiYAorfQorCisvLyBQYXJzZSBwYXJzZXMgYW55IG9mIHRoZSB0aHJlZSBzZXJpYWxpemVkIEpXUyBmb3JtcyBpbnRvIGEgcGh5c2ljYWwKKy8vIEpXUyBwZXIgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTUjc2VjdGlvbi01LjIKKy8vCisvLyBJdCBhY2NlcHRzIGEganNvbi5Vbm1hcnNoYWxlciBpbiBvcmRlciB0byBwcm9wZXJseSBwYXJzZQorLy8gdGhlIHBheWxvYWQuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgc29tZXRpbWVzIHRoZSBwYXlsb2FkCisvLyBtaWdodCBpbXBsZW1lbnQgdGhlIGpzb24uTWFyc2hhbGVyIGludGVyZmFjZSwgYW5kIHNpbmNlCisvLyB0aGUgSldTJyBwYXlsb2FkIG1lbWJlciBpcyBhbiBpbnRlcmZhY2V7fSwgYSBzaW1wbGUKKy8vIGpzb24uVW5tYXJzaGFsIGNhbGwgY2Fubm90IG1hZ2ljYWxseSBpZGVudGlmeSB0aGUgb3JpZ2luYWwKKy8vIHR5cGUuIFNvLCBpbiBvcmRlciB0byBrZWVwIHRoZSBjYWxsZXIgZnJvbSBoYXZpbmcgdG8gZG8gZXh0cmEKKy8vIHBhcnNpbmcgb2YgdGhlIHBheWxvYWQsIHRoZSBhIGpzb24uVW5tYXJzaGFsZXIgY2FuIGJlIHBhc3NlZAorLy8gd2hpY2ggd2lsbCBiZSBjYWxsZWQgdG8gdW5tYXJzaGFsIHRoZSBwYXlsb2FkIGhvd2V2ZXIgdGhlIGNhbGxlcgorLy8gd2lzaGVzLiBEbyBub3RlIHRoYXQgaWYganNvbi5Vbm1hcnNoYWwgcmV0dXJucyBhbiBlcnJvciB0aGUKKy8vIG9yaWdpbmFsIHBheWxvYWQgd2lsbCBiZSB1c2VkIGFzIGlmIG5vIGpzb24uVW5tYXJzaGFsZXIgd2FzCisvLyBwYXNzZWQuCisvLworLy8gSW50ZXJuYWxseSwgUGFyc2UgYXBwbGllcyBzb21lIGhldXJpc3RpY3MgYW5kIHRoZW4gY2FsbHMgZWl0aGVyCisvLyBQYXJzZUdlbmVyYWwsIFBhcnNlRmxhdCwgb3IgUGFyc2VDb21wYWN0LgorLy8gSXQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmLCBmb3Igd2hhdGV2ZXIgcmVhc29uLCB5b3UgZG8gbm90CisvLyBrbm93IHdoaWNoIGZvcm0gdGhlIHNlcmlhbGl6ZWQgSldUIGlzIGluLgorZnVuYyBQYXJzZShlbmNvZGVkIFtdYnl0ZSwgdSAuLi5qc29uLlVubWFyc2hhbGVyKSAoKkpXUywgZXJyb3IpIHsKKwkvLyBUcnkgYW5kIHVubWFyc2hhbCBpbnRvIGEgZ2VuZXJpYyBzdHJ1Y3QgdGhhdCdsbAorCS8vIGhvcGVmdWxseSBob2xkIGVpdGhlciBvZiB0aGUgdHdvIEpTT04gc2VyaWFsaXphdGlvbgorCS8vIGZvcm1hdHMucworCXZhciBnIGdlbmVyaWMKKworCS8vIE5vdCB2YWxpZCBKU09OLiBMZXQncyB0cnkgY29tcGFjdC4KKwlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoZW5jb2RlZCwgJmcpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFBhcnNlQ29tcGFjdChlbmNvZGVkLCB1Li4uKQorCX0KKworCWlmIGcuU2lnbmF0dXJlcyA9PSBuaWwgeworCQlyZXR1cm4gZy5wYXJzZUZsYXQodS4uLikKKwl9CisJcmV0dXJuIGcucGFyc2VHZW5lcmFsKHUuLi4pCit9CisKKy8vIFBhcnNlR2VuZXJhbCBwYXJzZXMgYSBKV1Mgc2VyaWFsaXplZCBpbnRvIGl0cyAiZ2VuZXJhbCIgZm9ybSBwZXIKKy8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTE1I3NlY3Rpb24tNy4yLjEKKy8vIGludG8gYSBwaHlzaWNhbCBKV1MgcGVyCisvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUxNSNzZWN0aW9uLTUuMgorLy8KKy8vIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUganNvbi5Vbm1hcnNoYWxlciBwYXJhbWV0ZXIsIHNlZSBQYXJzZS4KK2Z1bmMgUGFyc2VHZW5lcmFsKGVuY29kZWQgW11ieXRlLCB1IC4uLmpzb24uVW5tYXJzaGFsZXIpICgqSldTLCBlcnJvcikgeworCXZhciBnIGdlbmVyaWMKKwlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoZW5jb2RlZCwgJmcpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiBnLnBhcnNlR2VuZXJhbCh1Li4uKQorfQorCitmdW5jIChnICpnZW5lcmljKSBwYXJzZUdlbmVyYWwodSAuLi5qc29uLlVubWFyc2hhbGVyKSAoKkpXUywgZXJyb3IpIHsKKworCXZhciAoCisJCXAgICBwYXlsb2FkCisJCWVyciBlcnJvcgorCSkKKworCWlmIGxlbih1KSA+IDAgeworCQlpZiBrIDo9IHVbMF07IGsuVW5tYXJzaGFsSlNPTihnLlBheWxvYWQpICE9IG5pbCB7CisJCQlwLnYgPSB1CisJCQllcnIgPSBFcnJDb3VsZE5vdFVubWFyc2hhbAorCQl9CisJfQorCisJaWYgZXJyICE9IG5pbCB7CisJCWZtdC5QcmludGxuKHN0cmluZyhnLlBheWxvYWQpKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoZy5QYXlsb2FkLCAmcCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIG5pbCwgZXJyCisJCX0KKwl9CisKKwlyZXR1cm4gJkpXU3sKKwkJcGF5bG9hZDogJnAsCisJCXNiOiAgICAgIGcuU2lnbmF0dXJlcywKKwl9LCBlcnIKK30KKworLy8gUGFyc2VGbGF0IHBhcnNlcyBhIEpXUyBzZXJpYWxpemVkIGludG8gaXRzICJmbGF0IiBmb3JtIHBlcgorLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTUjc2VjdGlvbi03LjIuMgorLy8gaW50byBhIHBoeXNpY2FsIEpXUyBwZXIKKy8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTE1I3NlY3Rpb24tNS4yCisvLworLy8gRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBqc29uLlVubWFyc2hhbGVyIHBhcmFtZXRlciwgc2VlIFBhcnNlLgorZnVuYyBQYXJzZUZsYXQoZW5jb2RlZCBbXWJ5dGUsIHUgLi4uanNvbi5Vbm1hcnNoYWxlcikgKCpKV1MsIGVycm9yKSB7CisJdmFyIGcgZ2VuZXJpYworCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChlbmNvZGVkLCAmZyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIGcucGFyc2VGbGF0KHUuLi4pCit9CisKK2Z1bmMgKGcgKmdlbmVyaWMpIHBhcnNlRmxhdCh1IC4uLmpzb24uVW5tYXJzaGFsZXIpICgqSldTLCBlcnJvcikgeworCisJdmFyIHAgcGF5bG9hZAorCWlmIGxlbih1KSA+IDAgeworCQlwLnUgPSB1WzBdCisJfQorCisJaWYgZXJyIDo9IHAuVW5tYXJzaGFsSlNPTihnLlBheWxvYWQpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCisJcmV0dXJuICZKV1N7CisJCXBheWxvYWQ6ICZwLAorCQlzYjogICAgICBbXXNpZ0hlYWR7Zy5zaWdIZWFkfSwKKwl9LCBuaWwKK30KKworLy8gUGFyc2VDb21wYWN0IHBhcnNlcyBhIEpXUyBzZXJpYWxpemVkIGludG8gaXRzICJjb21wYWN0IiBmb3JtIHBlcgorLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTUjc2VjdGlvbi03LjEKKy8vIGludG8gYSBwaHlzaWNhbCBKV1MgcGVyCisvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUxNSNzZWN0aW9uLTUuMi8vCisvLyBGb3IgaW5mb3JtYXRpb24gb24gdGhlIGpzb24uVW5tYXJzaGFsZXIgcGFyYW1ldGVyLCBzZWUgUGFyc2UuCitmdW5jIFBhcnNlQ29tcGFjdChlbmNvZGVkIFtdYnl0ZSwgdSAuLi5qc29uLlVubWFyc2hhbGVyKSAoKkpXUywgZXJyb3IpIHsKKwlyZXR1cm4gbmlsLCBuaWwKK30KZGlmZiAtLWdpdCBhL2p3cy9qd3Nfc2VyaWFsaXplLmdvIGIvandzL2p3c19zZXJpYWxpemUuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5YzU5YwotLS0gL2Rldi9udWxsCisrKyBiL2p3cy9qd3Nfc2VyaWFsaXplLmdvCkBAIC0wLDAgKzEsMTI0IEBACitwYWNrYWdlIGp3cworCitpbXBvcnQgKAorCSJieXRlcyIKKwkiZW5jb2RpbmcvanNvbiIKKykKKworLy8gRmxhdCBzZXJpYWxpemVzIHRoZSBKV1MgdG8gaXRzICJmbGF0dGVuZWQiIGZvcm0gcGVyCisvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUxNSNzZWN0aW9uLTcuMi4yCitmdW5jIChqICpKV1MpIEZsYXQoa2V5IGludGVyZmFjZXt9KSAoW11ieXRlLCBlcnJvcikgeworCWlmIGxlbihqLnNiKSA8IDEgeworCQlyZXR1cm4gbmlsLCBFcnJOb3RFbm91Z2hNZXRob2RzCisJfQorCisJaWYgZXJyIDo9IGouc2lnbihrZXkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiBqc29uLk1hcnNoYWwoc3RydWN0IHsKKwkJUGF5bG9hZCByYXdCYXNlNjQgYGpzb246InBheWxvYWQiYAorCQlzaWdIZWFkCisJfXsKKwkJUGF5bG9hZDogai5wbGNhY2hlLAorCQlzaWdIZWFkOiBqLnNiWzBdLAorCX0pCit9CisKKy8vIEdlbmVyYWwgc2VyaWFsaXplcyB0aGUgSldTIGludG8gaXRzICJnZW5lcmFsIiBmb3JtIHBlcgorLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTUjc2VjdGlvbi03LjIuMQorZnVuYyAoaiAqSldTKSBHZW5lcmFsKGtleXMgLi4uaW50ZXJmYWNle30pIChbXWJ5dGUsIGVycm9yKSB7CisJaWYgZXJyIDo9IGouc2lnbihrZXlzLi4uKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4ganNvbi5NYXJzaGFsKHN0cnVjdCB7CisJCVBheWxvYWQgICAgcmF3QmFzZTY0IGBqc29uOiJwYXlsb2FkImAKKwkJU2lnbmF0dXJlcyBbXXNpZ0hlYWQgYGpzb246InNpZ25hdHVyZXMiYAorCX17CisJCVBheWxvYWQ6ICAgIGoucGxjYWNoZSwKKwkJU2lnbmF0dXJlczogai5zYiwKKwl9KQorfQorCisvLyBDb21wYWN0IHNlcmlhbGl6ZXMgdGhlIEpXUyBpbnRvIGl0cyAiY29tcGFjdCIgZm9ybSBwZXIKKy8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTE1I3NlY3Rpb24tNy4xCitmdW5jIChqICpKV1MpIENvbXBhY3Qoa2V5IGludGVyZmFjZXt9KSAoW11ieXRlLCBlcnJvcikgeworCWlmIGxlbihqLnNiKSA8IDEgeworCQlyZXR1cm4gbmlsLCBFcnJOb3RFbm91Z2hNZXRob2RzCisJfQorCisJaWYgZXJyIDo9IGouc2lnbihrZXkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCisJc2lnLCBlcnIgOj0gai5zYlswXS5TaWduYXR1cmUuQmFzZTY0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiBmb3JtYXQoCisJCWouc2JbMF0uUHJvdGVjdGVkLAorCQlqLnBsY2FjaGUsCisJCXNpZywKKwkpLCBuaWwKK30KKworLy8gc2lnbiBzaWducyBlYWNoIGluZGV4IG9mIGoncyBzYiBtZW1iZXIuCitmdW5jIChqICpKV1MpIHNpZ24oa2V5cyAuLi5pbnRlcmZhY2V7fSkgZXJyb3IgeworCWlmIGVyciA6PSBqLmNhY2hlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJZm9yIGkgOj0gcmFuZ2Ugai5zYiB7CisJCWlmIGVyciA6PSBqLnNiW2ldLmNhY2hlKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisKKwkJcmF3IDo9IGZvcm1hdChqLnNiW2ldLlByb3RlY3RlZCwgai5wbGNhY2hlKQorCQlzaWcsIGVyciA6PSBqLm1ldGhvZHNbaV0uU2lnbihyYXcsIGtleXNbaV0pCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWouc2JbaV0uU2lnbmF0dXJlID0gc2lnCisJfQorCisJcmV0dXJuIG5pbAorfQorCisvLyBjYWNoZSBtYXJzaGFscyB0aGUgcGF5bG9hZCwgYnV0IG9ubHkgaWYgaXQncyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGNhY2hlLgorZnVuYyAoaiAqSldTKSBjYWNoZSgpIGVycm9yIHsKKwlpZiAhai5jbGVhbiB7CisJCXZhciBlcnIgZXJyb3IKKwkJai5wbGNhY2hlLCBlcnIgPSBqLnBheWxvYWQuQmFzZTY0KCkKKwkJai5jbGVhbiA9IGVyciA9PSBuaWwKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIGNhY2hlIG1hcnNoYWxzIHRoZSBwcm90ZWN0ZWQgYW5kIHVucHJvdGVjdGVkIGhlYWRlcnMsIGJ1dCBvbmx5IGlmCisvLyB0aGV5J3ZlIGNoYW5nZWQgc2luY2UgdGhlaXIgbGFzdCBjYWNoZS4KK2Z1bmMgKHMgKnNpZ0hlYWQpIGNhY2hlKCkgZXJyb3IgeworCWlmICFzLmNsZWFuIHsKKwkJdmFyIGVyciBlcnJvcgorCisJCXMuUHJvdGVjdGVkLCBlcnIgPSBzLnByb3RlY3RlZC5CYXNlNjQoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCWdvdG8gZXJyX3JldHVybgorCQl9CisKKwkJcy5VbnByb3RlY3RlZCwgZXJyID0gcy51bnByb3RlY3RlZC5CYXNlNjQoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCWdvdG8gZXJyX3JldHVybgorCQl9CisKKwllcnJfcmV0dXJuOgorCQlzLmNsZWFuID0gZXJyID09IG5pbAorCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiBuaWwKK30KKworLy8gZm9ybWF0IGZvcm1hdHMgYSBzbGljZSBvZiBieXRlcyBpbiB0aGUgb3JkZXIgZ2l2ZW4sIGpvaW5pbmcKKy8vIHRoZW0gd2l0aCBhIHBlcmlvZC4KK2Z1bmMgZm9ybWF0KGEgLi4uW11ieXRlKSBbXWJ5dGUgeworCXJldHVybiBieXRlcy5Kb2luKGEsIFtdYnl0ZXsnLid9KQorfQpkaWZmIC0tZ2l0IGEvandzL2p3c19zZXJpYWxpemVfdGVzdC5nbyBiL2p3cy9qd3Nfc2VyaWFsaXplX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhODI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2p3cy9qd3Nfc2VyaWFsaXplX3Rlc3QuZ28KQEAgLTAsMCArMSwxMTEgQEAKK3BhY2thZ2UgandzCisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJlbmNvZGluZy9qc29uIgorCSJ0ZXN0aW5nIgorCisJImdpdGh1Yi5jb20vU2VybW9EaWdpdGFsL2pvc2UiCispCisKK3ZhciBkYXRhUmF3ID0gc3RydWN0IHsKKwlOYW1lICAgc3RyaW5nCisJU2NvcGVzIFtdc3RyaW5nCisJQWRtaW4gIGJvb2wKKwlEYXRhICAgc3RydWN0eyBGb28sIEJhciBpbnQgfQorfXsKKwlOYW1lOiAiRXJpYyIsCisJU2NvcGVzOiBbXXN0cmluZ3sKKwkJInVzZXIuYWNjb3VudC5pbmZvIiwKKwkJInVzZXIuYWNjb3VudC51cGRhdGUiLAorCQkidXNlci5hY2NvdW50LmRlbGV0ZSIsCisJfSwKKwlBZG1pbjogdHJ1ZSwKKwlEYXRhOiBzdHJ1Y3QgeworCQlGb28sIEJhciBpbnQKKwl9eworCQlGb286IDEyLAorCQlCYXI6IGludChedWludCgwKSA+PiAxKSwKKwl9LAorfQorCit2YXIgZGF0YVNlcmlhbGl6ZWQgW11ieXRlCisKK2Z1bmMgaW5pdCgpIHsKKwl2YXIgZXJyIGVycm9yCisJZGF0YVNlcmlhbGl6ZWQsIGVyciA9IGpzb24uTWFyc2hhbChkYXRhUmF3KQorCWlmIGVyciAhPSBuaWwgeworCQlwYW5pYyhlcnIpCisJfQorfQorCitmdW5jIFRlc3RHZW5lcmFsSW50ZWdyaXR5KHQgKnRlc3RpbmcuVCkgeworCWogOj0gTmV3KGRhdGFSYXcsIFNpZ25pbmdNZXRob2RSUzUxMikKKwliLCBlcnIgOj0gai5HZW5lcmFsKHJzYVByaXYpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCX0KKworCXZhciBqaiBzdHJ1Y3QgeworCQlQYXlsb2FkICAgIGpzb24uUmF3TWVzc2FnZSBganNvbjoicGF5bG9hZCJgCisJCVNpZ25hdHVyZXMgW11zaWdIZWFkICAgICAgIGBqc29uOiJzaWduYXR1cmVzImAKKwl9CisKKwlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoYiwgJmpqKTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCX0KKworCWdvdCwgZXJyIDo9IGpvc2UuRGVjb2RlRXNjYXBlZChqai5QYXlsb2FkKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwl9CisKKwlpZiAhYnl0ZXMuRXF1YWwoZ290LCBkYXRhU2VyaWFsaXplZCkgeworCQlFcnJvcih0LCBkYXRhU2VyaWFsaXplZCwgZ290KQorCX0KK30KKworZnVuYyBUZXN0RmxhdEludGVncml0eSh0ICp0ZXN0aW5nLlQpIHsKKwlqIDo9IE5ldyhkYXRhUmF3LCBTaWduaW5nTWV0aG9kUlM1MTIpCisJYiwgZXJyIDo9IGouRmxhdChyc2FQcml2KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwl9CisKKwl2YXIgamogc3RydWN0IHsKKwkJUGF5bG9hZCBqc29uLlJhd01lc3NhZ2UgYGpzb246InBheWxvYWQiYAorCQlzaWdIZWFkCisJfQorCisJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKGIsICZqaik7IGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwl9CisKKwlnb3QsIGVyciA6PSBqb3NlLkRlY29kZUVzY2FwZWQoamouUGF5bG9hZCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJfQorCisJaWYgIWJ5dGVzLkVxdWFsKGdvdCwgZGF0YVNlcmlhbGl6ZWQpIHsKKwkJRXJyb3IodCwgZGF0YVNlcmlhbGl6ZWQsIGdvdCkKKwl9Cit9CisKK2Z1bmMgVGVzdENvbXBhY3RJbnRlZ3JpdHkodCAqdGVzdGluZy5UKSB7CisJaiA6PSBOZXcoZGF0YVJhdywgU2lnbmluZ01ldGhvZFJTNTEyKQorCWIsIGVyciA6PSBqLkNvbXBhY3QocnNhUHJpdikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJfQorCisJcGFydHMgOj0gYnl0ZXMuU3BsaXQoYiwgW11ieXRleycuJ30pCisKKwlkZWMsIGVyciA6PSBqb3NlLkJhc2U2NERlY29kZShwYXJ0c1sxXSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJfQorCisJaWYgIWJ5dGVzLkVxdWFsKGRlYywgZGF0YVNlcmlhbGl6ZWQpIHsKKwkJRXJyb3IodCwgZGVjLCBkYXRhU2VyaWFsaXplZCkKKwl9Cit9CmRpZmYgLS1naXQgYS9qd3MvandzX3Rlc3QuZ28gYi9qd3MvandzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmYjkzMQotLS0gL2Rldi9udWxsCisrKyBiL2p3cy9qd3NfdGVzdC5nbwpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIGp3cworCitpbXBvcnQgKAorCSJieXRlcyIKKwkiZW5jb2RpbmcvYmFzZTY0IgorCSJlbmNvZGluZy9qc29uIgorCSJ0ZXN0aW5nIgorKQorCit0eXBlIGVhc3kgW11ieXRlCisKK2Z1bmMgKGUgKmVhc3kpIFVubWFyc2hhbEpTT04oYiBbXWJ5dGUpIGVycm9yIHsKKwkvLyBqc29uLk1hcnNoYWwgZW5jb2RlcyBlYXN5IGFzIGl0IHdvdWxkIGEgW11ieXRlLCBzbyBpbgorCS8vIGAiYmFzZTY0ImAgZm9ybWF0LgorCWRzdCA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZWRMZW4obGVuKGIpLTIpKQorCW4sIGVyciA6PSBiYXNlNjQuU3RkRW5jb2RpbmcuRGVjb2RlKGRzdCwgYlsxOmxlbihiKS0xXSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwkqZSA9IGVhc3koZHN0WzpuXSkKKwlyZXR1cm4gbmlsCit9CisKK3ZhciBfIGpzb24uVW5tYXJzaGFsZXIgPSAoKmVhc3kpKG5pbCkKKwordmFyIGVhc3lEYXRhID0gZWFzeShgImVhc3kgZGF0YSEiYCkKKworZnVuYyBUZXN0UGFyc2VXaXRoVW5tYXJzaGFsZXIodCAqdGVzdGluZy5UKSB7CisJaiA6PSBOZXcoZWFzeURhdGEsIFNpZ25pbmdNZXRob2RSUzUxMikKKwliLCBlcnIgOj0gai5GbGF0KHJzYVByaXYpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCX0KKworCXZhciBlIGVhc3kKKwlqMiwgZXJyIDo9IFBhcnNlKGIsICZlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwl9CisKKwlpZiAhYnl0ZXMuRXF1YWwoZWFzeURhdGEsICpqMi5wYXlsb2FkLnYuKCplYXN5KSkgeworCQlFcnJvcih0LCBlYXN5RGF0YSwgKmoyLnBheWxvYWQudi4oKmVhc3kpKQorCX0KK30KZGlmZiAtLWdpdCBhL2p3cy9ub25lLmdvIGIvandzL25vbmUuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiNjZiMgotLS0gL2Rldi9udWxsCisrKyBiL2p3cy9ub25lLmdvCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2UgandzCisKK2ltcG9ydCAoCisJImNyeXB0byIKKwkiZW5jb2RpbmcvanNvbiIKKwkiaGFzaCIKKwkiaW8iCispCisKK2Z1bmMgaW5pdCgpIHsKKwljcnlwdG8uUmVnaXN0ZXJIYXNoKGNyeXB0by5IYXNoKDApLCBIKQorCVJlZ2lzdGVyU2lnbmluZ01ldGhvZChVbnNlY3VyZWQpCit9CisKKy8vIEggaXMgcGFzc2VkIHRvIGNyeXB0by5SZWdpc3Rlckhhc2guCitmdW5jIEgoKSBoYXNoLkhhc2ggeyByZXR1cm4gJmZ7V3JpdGVyOiBuaWx9IH0KKwordHlwZSBmIHN0cnVjdHsgaW8uV3JpdGVyIH0KKworLy8gU3VtIGhlbHBzIGltcGxlbWVudCB0aGUgaGFzaC5IYXNoIGludGVyZmFjZS4KK2Z1bmMgKGYgKmYpIFN1bShiIFtdYnl0ZSkgW11ieXRlIHsgcmV0dXJuIG5pbCB9CisKKy8vIFJlc2V0IGhlbHBzIGltcGxlbWVudCB0aGUgaGFzaC5IYXNoIGludGVyZmFjZS4KK2Z1bmMgKGYgKmYpIFJlc2V0KCkge30KKworLy8gU2l6ZSBoZWxwcyBpbXBsZW1lbnQgdGhlIGhhc2guSGFzaCBpbnRlcmZhY2UuCitmdW5jIChmICpmKSBTaXplKCkgaW50IHsgcmV0dXJuIC0xIH0KKworLy8gQmxvY2tTaXplIGhlbHBzIGltcGxlbWVudCB0aGUgaGFzaC5IYXNoIGludGVyZmFjZS4KK2Z1bmMgKGYgKmYpIEJsb2NrU2l6ZSgpIGludCB7IHJldHVybiAtMSB9CisKKy8vIFVuc2VjdXJlZCBpcyB0aGUgZGVmYXVsdCAibm9uZSIgYWxnb3JpdGhtLgordmFyIFVuc2VjdXJlZCA9ICZTaWduaW5nTWV0aG9kTm9uZXsKKwlOYW1lOiAibm9uZSIsCisJSGFzaDogY3J5cHRvLkhhc2goMCksCit9CisKKy8vIFNpZ25pbmdNZXRob2ROb25lIGlzIHRoZSBkZWZhdWx0ICJub25lIiBhbGdvcml0aG0uCit0eXBlIFNpZ25pbmdNZXRob2ROb25lIHN0cnVjdCB7CisJTmFtZSBzdHJpbmcKKwlIYXNoIGNyeXB0by5IYXNoCisJXyAgICBzdHJ1Y3R7fQorfQorCisvLyBWZXJpZnkgaGVscHMgaW1wbGVtZW50IHRoZSBTaWduaW5nTWV0aG9kIGludGVyZmFjZS4KK2Z1bmMgKG0gKlNpZ25pbmdNZXRob2ROb25lKSBWZXJpZnkoXyBbXWJ5dGUsIF8gU2lnbmF0dXJlLCBfIGludGVyZmFjZXt9KSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCisvLyBTaWduIGhlbHBzIGltcGxlbWVudCB0aGUgU2lnbmluZ01ldGhvZCBpbnRlcmZhY2UuCitmdW5jIChtICpTaWduaW5nTWV0aG9kTm9uZSkgU2lnbihfIFtdYnl0ZSwgXyBpbnRlcmZhY2V7fSkgKFNpZ25hdHVyZSwgZXJyb3IpIHsKKwlyZXR1cm4gbmlsLCBuaWwKK30KKworLy8gQWxnIGhlbHBzIGltcGxlbWVudCB0aGUgU2lnbmluZ01ldGhvZCBpbnRlcmZhY2UuCitmdW5jIChtICpTaWduaW5nTWV0aG9kTm9uZSkgQWxnKCkgc3RyaW5nIHsgcmV0dXJuIG0uTmFtZSB9CisKKy8vIEhhc2hlciBoZWxwcyBpbXBsZW1lbnQgdGhlIFNpZ25pbmdNZXRob2QgaW50ZXJmYWNlLgorZnVuYyAobSAqU2lnbmluZ01ldGhvZE5vbmUpIEhhc2hlcigpIGNyeXB0by5IYXNoIHsgcmV0dXJuIG0uSGFzaCB9CisKKy8vIE1hcnNoYWxKU09OIGltcGxlbWVudHMganNvbi5NYXJzaGFsZXIuCisvLyBTZWUgU2lnbmluZ01ldGhvZEVDRFNBLk1hcnNoYWxKU09OKCkgZm9yIGluZm9ybWF0aW9uLgorZnVuYyAobSAqU2lnbmluZ01ldGhvZE5vbmUpIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKKwlyZXR1cm4gW11ieXRlKGAiYCArIG0uQWxnKCkgKyBgImApLCBuaWwKK30KKwordmFyIF8ganNvbi5NYXJzaGFsZXIgPSAoKlNpZ25pbmdNZXRob2ROb25lKShuaWwpCmRpZmYgLS1naXQgYS9qd3MvcGF5bG9hZC5nbyBiL2p3cy9wYXlsb2FkLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYzIwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9qd3MvcGF5bG9hZC5nbwpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIGp3cworCitpbXBvcnQgKAorCSJlbmNvZGluZy9qc29uIgorCisJImdpdGh1Yi5jb20vU2VybW9EaWdpdGFsL2pvc2UiCispCisKKy8vIHBheWxvYWQgcmVwcmVzZW50cyB0aGUgcGF5bG9hZCBvZiBhIEpXUy4KK3R5cGUgcGF5bG9hZCBzdHJ1Y3QgeworCXYgaW50ZXJmYWNle30KKwl1IGpzb24uVW5tYXJzaGFsZXIKKwlfIHN0cnVjdHt9Cit9CisKKy8vIE1hcnNoYWxKU09OIGltcGxlbWVudHMganNvbi5NYXJzaGFsZXIgZm9yIHBheWxvYWQuCitmdW5jIChwICpwYXlsb2FkKSBNYXJzaGFsSlNPTigpIChbXWJ5dGUsIGVycm9yKSB7CisJYiwgZXJyIDo9IGpzb24uTWFyc2hhbChwLnYpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gam9zZS5FbmNvZGVFc2NhcGUoYiksIG5pbAorfQorCisvLyBCYXNlNjQgaW1wbGVtZW50cyBqb3NlLkVuY29kZXIuCitmdW5jIChwICpwYXlsb2FkKSBCYXNlNjQoKSAoW11ieXRlLCBlcnJvcikgeworCWIsIGVyciA6PSBqc29uLk1hcnNoYWwocC52KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIGpvc2UuQmFzZTY0RW5jb2RlKGIpLCBuaWwKK30KKworLy8gTWFyc2hhbEpTT04gaW1wbGVtZW50cyBqc29uLlVubWFyc2hhbGVyIGZvciBwYXlsb2FkLgorZnVuYyAocCAqcGF5bG9hZCkgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgeworCWIyLCBlcnIgOj0gam9zZS5EZWNvZGVFc2NhcGVkKGIpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwlpZiBwLnUgIT0gbmlsIHsKKwkJZXJyIDo9IHAudS5Vbm1hcnNoYWxKU09OKGIyKQorCQlwLnYgPSBwLnUKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4ganNvbi5Vbm1hcnNoYWwoYjIsICZwLnYpCit9CisKK3ZhciAoCisJXyBqc29uLk1hcnNoYWxlciAgID0gKCpwYXlsb2FkKShuaWwpCisJXyBqc29uLlVubWFyc2hhbGVyID0gKCpwYXlsb2FkKShuaWwpCisJXyBqb3NlLkVuY29kZXIgICAgID0gKCpwYXlsb2FkKShuaWwpCispCmRpZmYgLS1naXQgYS9qd3MvcGF5bG9hZF90ZXN0LmdvIGIvandzL3BheWxvYWRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjA3NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvandzL3BheWxvYWRfdGVzdC5nbwpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIGp3cworCitpbXBvcnQgKAorCSJlbmNvZGluZy9qc29uIgorCSJ0ZXN0aW5nIgorCisJImdpdGh1Yi5jb20vU2VybW9EaWdpdGFsL2pvc2UiCispCisKK2Z1bmMgVGVzdFBheWxvYWRNYXJzaGFsKHQgKnRlc3RpbmcuVCkgeworCXAgOj0gJnBheWxvYWR7djogIlRlc3Qgc3RyaW5nISJ9CisKKwllbmMsIGVyciA6PSBqc29uLk1hcnNoYWwocCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJfQorCisJdmFyIHBwIHBheWxvYWQKKwlpZiBlcnIgPSBqc29uLlVubWFyc2hhbChlbmMsICZwcCk7IGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwl9CisKKwlpZiBwcC52ICE9ICJUZXN0IHN0cmluZyEiIHsKKwkJRXJyb3IodCwgIlRlc3Qgc3RyaW5nISIsIHBwLnYpCisJfQorfQorCitmdW5jIFRlc3RDb21wbGV4UGF5bG9hZE1hcnNoYWwodCAqdGVzdGluZy5UKSB7CisJcCA6PSBwYXlsb2FkeworCQl2OiBtYXBbc3RyaW5nXWludGVyZmFjZXt9eworCQkJImFsZyI6ICJITTI1NiIsCisJCQkidHlwIjogIkpXVCIsCisJCX0sCisJfQorCisJZW5jLCBlcnIgOj0ganNvbi5NYXJzaGFsKCZwKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwl9CisKKwl2YXIgcHAgcGF5bG9hZAorCWlmIGVyciA9IGpzb24uVW5tYXJzaGFsKGVuYywgJnBwKTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCX0KKworCWgsIG9rIDo9IHBwLnYuKG1hcFtzdHJpbmddaW50ZXJmYWNle30pCisJaWYgIW9rIHsKKwkJRXJyb3JUeXBlcyh0LCBtYXBbc3RyaW5nXWludGVyZmFjZXt9e30sIHBwLnYpCisJfQorCisJcGggOj0gam9zZS5Qcm90ZWN0ZWQoaCkKKworCWlmIGFsZyA6PSBwaC5HZXQoImFsZyIpOyBhbGcgIT0gIkhNMjU2IiB7CisJCUVycm9yKHQsICJITTI1NiIsIGFsZykKKwl9CisKKwlpZiB0eXAgOj0gcGguR2V0KCJ0eXAiKTsgdHlwICE9ICJKV1QiIHsKKwkJRXJyb3IodCwgIkpXVCIsIHR5cCkKKwl9Cit9CmRpZmYgLS1naXQgYS9qd3MvcmF3YmFzZTY0LmdvIGIvandzL3Jhd2Jhc2U2NC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmM0MDYwCi0tLSAvZGV2L251bGwKKysrIGIvandzL3Jhd2Jhc2U2NC5nbwpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIGp3cworCitpbXBvcnQgImVuY29kaW5nL2pzb24iCisKK3R5cGUgcmF3QmFzZTY0IFtdYnl0ZQorCisvLyBNYXJzaGFsSlNPTiBpbXBsZW1lbnRzIGpzb24uTWFyc2hhbGVyIGZvciByYXdCYXNlNjQuCitmdW5jIChyIHJhd0Jhc2U2NCkgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgeworCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuKHIpKzIpCisJYnVmWzBdID0gJyInCisJY29weShidWZbMTpdLCByKQorCWJ1ZltsZW4oYnVmKS0xXSA9ICciJworCXJldHVybiBidWYsIG5pbAorfQorCisvLyBNYXJzaGFsSlNPTiBpbXBsZW1lbnRzIGpzb24uVW5tYXJzaGFsZXIgZm9yIHJhd0Jhc2U2NC4KK2Z1bmMgKHIgKnJhd0Jhc2U2NCkgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgeworCWlmIGxlbihiKSA+IDEgJiYgYlswXSA9PSAnIicgJiYgYltsZW4oYiktMV0gPT0gJyInIHsKKwkJYiA9IGJbMSA6IGxlbihiKS0xXQorCX0KKwkqciA9IHJhd0Jhc2U2NChiKQorCXJldHVybiBuaWwKK30KKwordmFyICgKKwlfIGpzb24uTWFyc2hhbGVyICAgPSAocmF3QmFzZTY0KShuaWwpCisJXyBqc29uLlVubWFyc2hhbGVyID0gKCpyYXdCYXNlNjQpKG5pbCkKKykKZGlmZiAtLWdpdCBhL2p3cy9yYXdiYXNlNjRfdGVzdC5nbyBiL2p3cy9yYXdiYXNlNjRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTc2MzVjCi0tLSAvZGV2L251bGwKKysrIGIvandzL3Jhd2Jhc2U2NF90ZXN0LmdvCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgandzCisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJlbmNvZGluZy9qc29uIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RNYXJzaGFsUmF3QmFzZTY0KHQgKnRlc3RpbmcuVCkgeworCXMgOj0gcmF3QmFzZTY0KCJUZXN0IHN0cmluZyEiKQorCisJZW5jLCBlcnIgOj0ganNvbi5NYXJzaGFsKHMpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCX0KKworCXZhciBzcyByYXdCYXNlNjQKKwlpZiBlcnIgPSBqc29uLlVubWFyc2hhbChlbmMsICZzcyk7IGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwl9CisKKwlpZiAhYnl0ZXMuRXF1YWwoc3MsIHMpIHsKKwkJRXJyb3IodCwgcywgc3MpCisJfQorfQpkaWZmIC0tZ2l0IGEvandzL3JzYS5nbyBiL2p3cy9yc2EuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3NDQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2p3cy9yc2EuZ28KQEAgLTAsMCArMSw4MCBAQAorcGFja2FnZSBqd3MKKworaW1wb3J0ICgKKwkiY3J5cHRvIgorCSJjcnlwdG8vcmFuZCIKKwkiY3J5cHRvL3JzYSIKKwkiZW5jb2RpbmcvanNvbiIKKykKKworLy8gU2lnbmluZ01ldGhvZFJTQSBpbXBsZW1lbnRzIHRoZSBSU0EgZmFtaWx5IG9mIFNpZ25pbmdNZXRob2RzLgordHlwZSBTaWduaW5nTWV0aG9kUlNBIHN0cnVjdCB7CisJTmFtZSBzdHJpbmcKKwlIYXNoIGNyeXB0by5IYXNoCisJXyAgICBzdHJ1Y3R7fQorfQorCisvLyBTcGVjaWZpYyBpbnN0YW5jZXMgb2YgUlNBIFNpZ25pbmdNZXRob2RzLgordmFyICgKKwkvLyBTaWduaW5nTWV0aG9kUlMyNTYgaW1wbGVtZW50cyBSUzI1Ni4KKwlTaWduaW5nTWV0aG9kUlMyNTYgPSAmU2lnbmluZ01ldGhvZFJTQXsKKwkJTmFtZTogIlJTMjU2IiwKKwkJSGFzaDogY3J5cHRvLlNIQTI1NiwKKwl9CisKKwkvLyBTaWduaW5nTWV0aG9kUlMzODQgaW1wbGVtZW50cyBSUzM4NC4KKwlTaWduaW5nTWV0aG9kUlMzODQgPSAmU2lnbmluZ01ldGhvZFJTQXsKKwkJTmFtZTogIlJTMzg0IiwKKwkJSGFzaDogY3J5cHRvLlNIQTM4NCwKKwl9CisKKwkvLyBTaWduaW5nTWV0aG9kUlM1MTIgaW1wbGVtZW50cyBSUzUxMi4KKwlTaWduaW5nTWV0aG9kUlM1MTIgPSAmU2lnbmluZ01ldGhvZFJTQXsKKwkJTmFtZTogIlJTNTEyIiwKKwkJSGFzaDogY3J5cHRvLlNIQTUxMiwKKwl9CispCisKKy8vIEFsZyBpbXBsZW1lbnRzIHRoZSBTaWduaW5nTWV0aG9kIGludGVyZmFjZS4KK2Z1bmMgKG0gKlNpZ25pbmdNZXRob2RSU0EpIEFsZygpIHN0cmluZyB7IHJldHVybiBtLk5hbWUgfQorCisvLyBWZXJpZnkgaW1wbGVtZW50cyB0aGUgVmVyaWZ5IG1ldGhvZCBmcm9tIFNpZ25pbmdNZXRob2QuCisvLyBGb3IgdGhpcyBzaWduaW5nIG1ldGhvZCwgbXVzdCBiZSBhbiAqcnNhLlB1YmxpY0tleS4KK2Z1bmMgKG0gKlNpZ25pbmdNZXRob2RSU0EpIFZlcmlmeShyYXcgW11ieXRlLCBzaWcgU2lnbmF0dXJlLCBrZXkgaW50ZXJmYWNle30pIGVycm9yIHsKKwlyc2FLZXksIG9rIDo9IGtleS4oKnJzYS5QdWJsaWNLZXkpCisJaWYgIW9rIHsKKwkJcmV0dXJuIEVyckludmFsaWRLZXkKKwl9CisJcmV0dXJuIHJzYS5WZXJpZnlQS0NTMXYxNShyc2FLZXksIG0uSGFzaCwgbS5zdW0ocmF3KSwgc2lnKQorfQorCisvLyBTaWduIGltcGxlbWVudHMgdGhlIFNpZ24gbWV0aG9kIGZyb20gU2lnbmluZ01ldGhvZC4KKy8vIEZvciB0aGlzIHNpZ25pbmcgbWV0aG9kLCBtdXN0IGJlIGFuICpyc2EuUHJpdmF0ZUtleSBzdHJ1Y3R1cmUuCitmdW5jIChtICpTaWduaW5nTWV0aG9kUlNBKSBTaWduKGRhdGEgW11ieXRlLCBrZXkgaW50ZXJmYWNle30pIChTaWduYXR1cmUsIGVycm9yKSB7CisJcnNhS2V5LCBvayA6PSBrZXkuKCpyc2EuUHJpdmF0ZUtleSkKKwlpZiAhb2sgeworCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkS2V5CisJfQorCXNpZ0J5dGVzLCBlcnIgOj0gcnNhLlNpZ25QS0NTMXYxNShyYW5kLlJlYWRlciwgcnNhS2V5LCBtLkhhc2gsIG0uc3VtKGRhdGEpKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIFNpZ25hdHVyZShzaWdCeXRlcyksIG5pbAorfQorCitmdW5jIChtICpTaWduaW5nTWV0aG9kUlNBKSBzdW0oYiBbXWJ5dGUpIFtdYnl0ZSB7CisJaCA6PSBtLkhhc2guTmV3KCkKKwloLldyaXRlKGIpCisJcmV0dXJuIGguU3VtKG5pbCkKK30KKworLy8gSGFzaGVyIGltcGxlbWVudHMgdGhlIFNpZ25pbmdNZXRob2QgaW50ZXJmYWNlLgorZnVuYyAobSAqU2lnbmluZ01ldGhvZFJTQSkgSGFzaGVyKCkgY3J5cHRvLkhhc2ggeyByZXR1cm4gbS5IYXNoIH0KKworLy8gTWFyc2hhbEpTT04gaW1wbGVtZW50cyBqc29uLk1hcnNoYWxlci4KKy8vIFNlZSBTaWduaW5nTWV0aG9kRUNEU0EuTWFyc2hhbEpTT04oKSBmb3IgaW5mb3JtYXRpb24uCitmdW5jIChtICpTaWduaW5nTWV0aG9kUlNBKSBNYXJzaGFsSlNPTigpIChbXWJ5dGUsIGVycm9yKSB7CisJcmV0dXJuIFtdYnl0ZShgImAgKyBtLkFsZygpICsgYCJgKSwgbmlsCit9CisKK3ZhciBfIGpzb24uTWFyc2hhbGVyID0gKCpTaWduaW5nTWV0aG9kUlNBKShuaWwpCmRpZmYgLS1naXQgYS9qd3MvcnNhX3Bzcy5nbyBiL2p3cy9yc2FfcHNzLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzMwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9qd3MvcnNhX3Bzcy5nbwpAQCAtMCwwICsxLDk2IEBACisvLyArYnVpbGQgZ28xLjQKKworcGFja2FnZSBqd3MKKworaW1wb3J0ICgKKwkiY3J5cHRvIgorCSJjcnlwdG8vcmFuZCIKKwkiY3J5cHRvL3JzYSIKKwkiZW5jb2RpbmcvanNvbiIKKykKKworLy8gU2lnbmluZ01ldGhvZFJTQVBTUyBpbXBsZW1lbnRzIHRoZSBSU0FQU1MgZmFtaWx5IG9mIFNpZ25pbmdNZXRob2RzLgordHlwZSBTaWduaW5nTWV0aG9kUlNBUFNTIHN0cnVjdCB7CisJKlNpZ25pbmdNZXRob2RSU0EKKwlPcHRpb25zICpyc2EuUFNTT3B0aW9ucworfQorCisvLyBTcGVjaWZpYyBpbnN0YW5jZXMgZm9yIFJTL1BTIFNpZ25pbmdNZXRob2RzLgordmFyICgKKwkvLyBTaWduaW5nTWV0aG9kUFMyNTYgaW1wbGVtZW50cyBQUzI1Ni4KKwlTaWduaW5nTWV0aG9kUFMyNTYgPSAmU2lnbmluZ01ldGhvZFJTQVBTU3sKKwkJJlNpZ25pbmdNZXRob2RSU0F7CisJCQlOYW1lOiAiUFMyNTYiLAorCQkJSGFzaDogY3J5cHRvLlNIQTI1NiwKKwkJfSwKKwkJJnJzYS5QU1NPcHRpb25zeworCQkJU2FsdExlbmd0aDogcnNhLlBTU1NhbHRMZW5ndGhBdXRvLAorCQkJSGFzaDogICAgICAgY3J5cHRvLlNIQTI1NiwKKwkJfSwKKwl9CisKKwkvLyBTaWduaW5nTWV0aG9kUFMzODQgaW1wbGVtZW50cyBQUzM4NC4KKwlTaWduaW5nTWV0aG9kUFMzODQgPSAmU2lnbmluZ01ldGhvZFJTQVBTU3sKKwkJJlNpZ25pbmdNZXRob2RSU0F7CisJCQlOYW1lOiAiUFMzODQiLAorCQkJSGFzaDogY3J5cHRvLlNIQTM4NCwKKwkJfSwKKwkJJnJzYS5QU1NPcHRpb25zeworCQkJU2FsdExlbmd0aDogcnNhLlBTU1NhbHRMZW5ndGhBdXRvLAorCQkJSGFzaDogICAgICAgY3J5cHRvLlNIQTM4NCwKKwkJfSwKKwl9CisKKwkvLyBTaWduaW5nTWV0aG9kUFM1MTIgaW1wbGVtZW50cyBQUzUxMi4KKwlTaWduaW5nTWV0aG9kUFM1MTIgPSAmU2lnbmluZ01ldGhvZFJTQVBTU3sKKwkJJlNpZ25pbmdNZXRob2RSU0F7CisJCQlOYW1lOiAiUFM1MTIiLAorCQkJSGFzaDogY3J5cHRvLlNIQTUxMiwKKwkJfSwKKwkJJnJzYS5QU1NPcHRpb25zeworCQkJU2FsdExlbmd0aDogcnNhLlBTU1NhbHRMZW5ndGhBdXRvLAorCQkJSGFzaDogICAgICAgY3J5cHRvLlNIQTUxMiwKKwkJfSwKKwl9CispCisKKy8vIFZlcmlmeSBpbXBsZW1lbnRzIHRoZSBWZXJpZnkgbWV0aG9kIGZyb20gU2lnbmluZ01ldGhvZC4KKy8vIEZvciB0aGlzIHZlcmlmeSBtZXRob2QsIGtleSBtdXN0IGJlIGFuICpyc2EuUHVibGljS2V5LgorZnVuYyAobSAqU2lnbmluZ01ldGhvZFJTQVBTUykgVmVyaWZ5KHJhdyBbXWJ5dGUsIHNpZ25hdHVyZSBTaWduYXR1cmUsIGtleSBpbnRlcmZhY2V7fSkgZXJyb3IgeworCXJzYUtleSwgb2sgOj0ga2V5LigqcnNhLlB1YmxpY0tleSkKKwlpZiAhb2sgeworCQlyZXR1cm4gRXJySW52YWxpZEtleQorCX0KKwlyZXR1cm4gcnNhLlZlcmlmeVBTUyhyc2FLZXksIG0uSGFzaCwgbS5zdW0ocmF3KSwgc2lnbmF0dXJlLCBtLk9wdGlvbnMpCit9CisKKy8vIFNpZ24gaW1wbGVtZW50cyB0aGUgU2lnbiBtZXRob2QgZnJvbSBTaWduaW5nTWV0aG9kLgorLy8gRm9yIHRoaXMgc2lnbmluZyBtZXRob2QsIGtleSBtdXN0IGJlIGFuICpyc2EuUHJpdmF0ZUtleS4KK2Z1bmMgKG0gKlNpZ25pbmdNZXRob2RSU0FQU1MpIFNpZ24ocmF3IFtdYnl0ZSwga2V5IGludGVyZmFjZXt9KSAoU2lnbmF0dXJlLCBlcnJvcikgeworCXJzYUtleSwgb2sgOj0ga2V5LigqcnNhLlByaXZhdGVLZXkpCisJaWYgIW9rIHsKKwkJcmV0dXJuIG5pbCwgRXJySW52YWxpZEtleQorCX0KKwlzaWdCeXRlcywgZXJyIDo9IHJzYS5TaWduUFNTKHJhbmQuUmVhZGVyLCByc2FLZXksIG0uSGFzaCwgbS5zdW0ocmF3KSwgbS5PcHRpb25zKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIFNpZ25hdHVyZShzaWdCeXRlcyksIG5pbAorfQorCitmdW5jIChtICpTaWduaW5nTWV0aG9kUlNBUFNTKSBzdW0oYiBbXWJ5dGUpIFtdYnl0ZSB7CisJaCA6PSBtLkhhc2guTmV3KCkKKwloLldyaXRlKGIpCisJcmV0dXJuIGguU3VtKG5pbCkKK30KKworLy8gSGFzaGVyIGltcGxlbWVudHMgdGhlIEhhc2hlciBtZXRob2QgZnJvbSBTaWduaW5nTWV0aG9kLgorZnVuYyAobSAqU2lnbmluZ01ldGhvZFJTQVBTUykgSGFzaGVyKCkgY3J5cHRvLkhhc2ggeyByZXR1cm4gbS5IYXNoIH0KKworLy8gTWFyc2hhbEpTT04gaW1wbGVtZW50cyBqc29uLk1hcnNoYWxlci4KKy8vIFNlZSBTaWduaW5nTWV0aG9kRUNEU0EuTWFyc2hhbEpTT04oKSBmb3IgaW5mb3JtYXRpb24uCitmdW5jIChtICpTaWduaW5nTWV0aG9kUlNBUFNTKSBNYXJzaGFsSlNPTigpIChbXWJ5dGUsIGVycm9yKSB7CisJcmV0dXJuIFtdYnl0ZShgImAgKyBtLkFsZygpICsgYCJgKSwgbmlsCit9CisKK3ZhciBfIGpzb24uTWFyc2hhbGVyID0gKCpTaWduaW5nTWV0aG9kUlNBUFNTKShuaWwpCmRpZmYgLS1naXQgYS9qd3MvcnNhX3Bzc190ZXN0LmdvIGIvandzL3JzYV9wc3NfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDVlY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvandzL3JzYV9wc3NfdGVzdC5nbwpAQCAtMCwwICsxLDk2IEBACisvLyArYnVpbGQgZ28xLjQKKworcGFja2FnZSBqd3NfdGVzdAorCisvLyBpbXBvcnQgKAorLy8gCSJjcnlwdG8vcnNhIgorLy8gCSJpby9pb3V0aWwiCisvLyAJInN0cmluZ3MiCisvLyAJInRlc3RpbmciCisKKy8vIAkiZ2l0aHViLmNvbS9kZ3JpamFsdmEvand0LWdvIgorLy8gKQorCisvLyB2YXIgcnNhUFNTVGVzdERhdGEgPSBbXXN0cnVjdCB7CisvLyAJbmFtZSAgICAgICAgc3RyaW5nCisvLyAJdG9rZW5TdHJpbmcgc3RyaW5nCisvLyAJYWxnICAgICAgICAgc3RyaW5nCisvLyAJY2xhaW1zICAgICAgbWFwW3N0cmluZ11pbnRlcmZhY2V7fQorLy8gCXZhbGlkICAgICAgIGJvb2wKKy8vIH17CisvLyAJeworLy8gCQkiQmFzaWMgUFMyNTYiLAorLy8gCQkiZXlKaGJHY2lPaUpRVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5Sm1iMjhpT2lKaVlYSWlmUS5QUEc0eHlEVlk4ZmZwNENjeG9mTm1zVERYc3JWRzJucGRRdWliTGhKYnY0Q2x5UFRVdFI1Z2lOU3Z1eG8wM2tCNkk4VlhWcjBZOVg3VXhoSlZFb0pPbVVMQXdSV2FVc0RuSWV3UWExMDFjVmhNYTZpUjhYMzdrZkZvaVo2TmtTLWM3aGVuVmtrUVd1Mkh0b3RrRXRRdk41aEZsazhJZXZYWFBtdlpsaFFod3pCMXNHekdZbm9pMXpPZnVMOThkM0JJalVqdGx3aWk1dzZnWUcyQUVFenA3SG5IQ3NiM2pJd1VQZHE4Nk9lNmhJRmp0QndkdUlLOTBjYTRVcXpBUnBjZnd4SHdWTE1wYXRLYXNrMDBBZ0dWSTB5c2RrMEJMTWptTHV0cXVEMDNYYlRoSFNjQzJDMl9QcDRjSFdnTXp2YmdMVTJSWVlaY1pSS3I0NlFlTmd6OXciLAorLy8gCQkiUFMyNTYiLAorLy8gCQltYXBbc3RyaW5nXWludGVyZmFjZXt9eyJmb28iOiAiYmFyIn0sCisvLyAJCXRydWUsCisvLyAJfSwKKy8vIAl7CisvLyAJCSJCYXNpYyBQUzM4NCIsCisvLyAJCSJleUpoYkdjaU9pSlFVek00TkNJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbWIyOGlPaUppWVhJaWZRLnc3LXFxZ2o5N2dLNGZKc3FfRENxZFlRaXlsSmp6V09OdkQwcVdXV2hxRU9GazJQMWVEVUxQbnFIUm5qZ1RYb080SEF3NFlJV0NzWlBldDduUjNYeHE0WmhNcXZLVzhiN0tsZlJUYjljSDh6cUZ2ek1teWJRNGp2MmhLYzNiWFlxVm93M0FvUjdoTl9DV1hJM0R2NktkMlg1eGh0eFJISTZJTDM5b1RWRFVRNzRMQUNlLTl0NGMzUVJQdWo2UHExSDRGQVQyRTJrV18wS09jNkVRaENMV0VobTJaMl9fT1pza0RDOEFpUHBQOEt2NGsydkI3bDBJS1F1OFByNFJjTkJscUpkcThkQTVEM2hrNVRMeFA4VjVuRzFJYjgwTU9NTXFvUzNGUXZTTHlvbEZYLVJfalozLXpmcTZFYnNxcjB5RWIwQUgyQ2ZzRUNGNzkzNVBhMEZLUSIsCisvLyAJCSJQUzM4NCIsCisvLyAJCW1hcFtzdHJpbmddaW50ZXJmYWNle317ImZvbyI6ICJiYXIifSwKKy8vIAkJdHJ1ZSwKKy8vIAl9LAorLy8gCXsKKy8vIAkJIkJhc2ljIFBTNTEyIiwKKy8vIAkJImV5SmhiR2NpT2lKUVV6VXhNaUlzSW5SNWNDSTZJa3BYVkNKOS5leUptYjI4aU9pSmlZWElpZlEuR1gxSFdHekZhSmV2dVNMYXZxcUZZYVc4X1RwdmNqUThLZkM1ZlhpU0R6U2lUOVVEOW5CX2lrU21ETnlESUxOZHRqWkxTdlZLZlh4WkpxQ2ZlZnhBdGlvekVERGRKdGhaLUYwdU80U1BGSGxHaVhzenZLZW9kaDdCdVRXUkkyd0w5LVpPNG1GYThucTNHTWVRQWZvOWN4MTFpN25mTjhuMllOUTlTSEdvdkc3X1RfQXZhTVpCX2pUNmprREhwd0dSOW16N3gxc3ljY2tFbzZ0ZUxkSFJuSF9aZGxIbHhxa25teVR1OE9kcjVYaDBzSkZPTDhCZXBXYmJ2SUluLVAxNjFyUkhIaURXRnY2bmhsSHdablZ6ang3SFFyV1NHYjYtczJjZExpZTlRTF84WGFNY1VwakxrZk9NS2tET2ZIbzZBdnBMN0pid2k4M1oyWlRIakpXQi1BIiwKKy8vIAkJIlBTNTEyIiwKKy8vIAkJbWFwW3N0cmluZ11pbnRlcmZhY2V7fXsiZm9vIjogImJhciJ9LAorLy8gCQl0cnVlLAorLy8gCX0sCisvLyAJeworLy8gCQkiYmFzaWMgUFMyNTYgaW52YWxpZDogZm9vID0+IGJhciIsCisvLyAJCSJleUpoYkdjaU9pSlFVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbWIyOGlPaUppWVhJaWZRLlBQRzR4eURWWThmZnA0Q2N4b2ZObXNURFhzclZHMm5wZFF1aWJMaEpidjRDbHlQVFV0UjVnaU5TdnV4bzAza0I2SThWWFZyMFk5WDdVeGhKVkVvSk9tVUxBd1JXYVVzRG5JZXdRYTEwMWNWaE1hNmlSOFgzN2tmRm9pWjZOa1MtYzdoZW5Wa2tRV3UySHRvdGtFdFF2TjVoRmxrOElldlhYUG12WmxoUWh3ekIxc0d6R1lub2kxek9mdUw5OGQzQklqVWp0bHdpaTV3NmdZRzJBRUV6cDdIbkhDc2Izakl3VVBkcTg2T2U2aElGanRCd2R1SUs5MGNhNFVxekFScGNmd3hId1ZMTXBhdEthc2swMEFnR1ZJMHlzZGswQkxNam1MdXRxdUQwM1hiVGhIU2NDMkMyX1BwNGNIV2dNenZiZ0xVMlJZWVpjWlJLcjQ2UWVOZ3o5VyIsCisvLyAJCSJQUzI1NiIsCisvLyAJCW1hcFtzdHJpbmddaW50ZXJmYWNle317ImZvbyI6ICJiYXIifSwKKy8vIAkJZmFsc2UsCisvLyAJfSwKKy8vIH0KKworLy8gZnVuYyBUZXN0UlNBUFNTVmVyaWZ5KHQgKnRlc3RpbmcuVCkgeworLy8gCXZhciBlcnIgZXJyb3IKKworLy8gCWtleSwgXyA6PSBpb3V0aWwuUmVhZEZpbGUoInRlc3Qvc2FtcGxlX2tleS5wdWIiKQorLy8gCXZhciByc2FQU1NLZXkgKnJzYS5QdWJsaWNLZXkKKy8vIAlpZiByc2FQU1NLZXksIGVyciA9IGp3dC5QYXJzZVJTQVB1YmxpY0tleUZyb21QRU0oa2V5KTsgZXJyICE9IG5pbCB7CisvLyAJCXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgUlNBIHB1YmxpYyBrZXk6ICV2IiwgZXJyKQorLy8gCX0KKworLy8gCWZvciBfLCBkYXRhIDo9IHJhbmdlIHJzYVBTU1Rlc3REYXRhIHsKKy8vIAkJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChkYXRhLnRva2VuU3RyaW5nLCAiLiIpCisKKy8vIAkJbWV0aG9kIDo9IGp3dC5HZXRTaWduaW5nTWV0aG9kKGRhdGEuYWxnKQorLy8gCQllcnIgOj0gbWV0aG9kLlZlcmlmeShzdHJpbmdzLkpvaW4ocGFydHNbMDoyXSwgIi4iKSwgcGFydHNbMl0sIHJzYVBTU0tleSkKKy8vIAkJaWYgZGF0YS52YWxpZCAmJiBlcnIgIT0gbmlsIHsKKy8vIAkJCXQuRXJyb3JmKCJbJXZdIEVycm9yIHdoaWxlIHZlcmlmeWluZyBrZXk6ICV2IiwgZGF0YS5uYW1lLCBlcnIpCisvLyAJCX0KKy8vIAkJaWYgIWRhdGEudmFsaWQgJiYgZXJyID09IG5pbCB7CisvLyAJCQl0LkVycm9yZigiWyV2XSBJbnZhbGlkIGtleSBwYXNzZWQgdmFsaWRhdGlvbiIsIGRhdGEubmFtZSkKKy8vIAkJfQorLy8gCX0KKy8vIH0KKworLy8gZnVuYyBUZXN0UlNBUFNTU2lnbih0ICp0ZXN0aW5nLlQpIHsKKy8vIAl2YXIgZXJyIGVycm9yCisKKy8vIAlrZXksIF8gOj0gaW91dGlsLlJlYWRGaWxlKCJ0ZXN0L3NhbXBsZV9rZXkiKQorLy8gCXZhciByc2FQU1NLZXkgKnJzYS5Qcml2YXRlS2V5CisvLyAJaWYgcnNhUFNTS2V5LCBlcnIgPSBqd3QuUGFyc2VSU0FQcml2YXRlS2V5RnJvbVBFTShrZXkpOyBlcnIgIT0gbmlsIHsKKy8vIAkJdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBSU0EgcHJpdmF0ZSBrZXk6ICV2IiwgZXJyKQorLy8gCX0KKworLy8gCWZvciBfLCBkYXRhIDo9IHJhbmdlIHJzYVBTU1Rlc3REYXRhIHsKKy8vIAkJaWYgZGF0YS52YWxpZCB7CisvLyAJCQlwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KGRhdGEudG9rZW5TdHJpbmcsICIuIikKKy8vIAkJCW1ldGhvZCA6PSBqd3QuR2V0U2lnbmluZ01ldGhvZChkYXRhLmFsZykKKy8vIAkJCXNpZywgZXJyIDo9IG1ldGhvZC5TaWduKHN0cmluZ3MuSm9pbihwYXJ0c1swOjJdLCAiLiIpLCByc2FQU1NLZXkpCisvLyAJCQlpZiBlcnIgIT0gbmlsIHsKKy8vIAkJCQl0LkVycm9yZigiWyV2XSBFcnJvciBzaWduaW5nIHRva2VuOiAldiIsIGRhdGEubmFtZSwgZXJyKQorLy8gCQkJfQorLy8gCQkJaWYgc2lnID09IHBhcnRzWzJdIHsKKy8vIAkJCQl0LkVycm9yZigiWyV2XSBTaWduYXR1cmVzIHNob3VsZG4ndCBtYXRjaFxubmV3OlxuJXZcbm9yaWdpbmFsOlxuJXYiLCBkYXRhLm5hbWUsIHNpZywgcGFydHNbMl0pCisvLyAJCQl9CisvLyAJCX0KKy8vIAl9CisvLyB9CmRpZmYgLS1naXQgYS9qd3MvcnNhX3Rlc3QuZ28gYi9qd3MvcnNhX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViOTc1MwotLS0gL2Rldi9udWxsCisrKyBiL2p3cy9yc2FfdGVzdC5nbwpAQCAtMCwwICsxLDE3NiBAQAorcGFja2FnZSBqd3NfdGVzdAorCisvLyBpbXBvcnQgKAorLy8gCSJnaXRodWIuY29tL2RncmlqYWx2YS9qd3QtZ28iCisvLyAJImlvL2lvdXRpbCIKKy8vIAkic3RyaW5ncyIKKy8vIAkidGVzdGluZyIKKy8vICkKKworLy8gdmFyIHJzYVRlc3REYXRhID0gW11zdHJ1Y3QgeworLy8gCW5hbWUgICAgICAgIHN0cmluZworLy8gCXRva2VuU3RyaW5nIHN0cmluZworLy8gCWFsZyAgICAgICAgIHN0cmluZworLy8gCWNsYWltcyAgICAgIG1hcFtzdHJpbmddaW50ZXJmYWNle30KKy8vIAl2YWxpZCAgICAgICBib29sCisvLyB9eworLy8gCXsKKy8vIAkJIkJhc2ljIFJTMjU2IiwKKy8vIAkJImV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSlNVekkxTmlKOS5leUptYjI4aU9pSmlZWElpZlEuRmhraUhrb0VTSV9jRzNOUGlnRnJ4RWs5WjYwX29Yck9UMnZHbTlQbjZSRGdZTm92WU9SUW1tQTB6czFBb0FPZjA5bHkyTngyWUFnNkFCcUFZZ2ExQWNNRmtKbGp3eFRUNWZZcGhUdXFwV2R5NEJFTGVTWUp4NVR5MmdtcjhlN1JvbnVVenRyZEQ1V2ZQcUxLTW0xT3pwX1Q2ekFMcFJtd1RJVzBRUG5hQlhhUUQ5MEZwbEFnNDZJeTFVbERLci1FdXB5MGk1U0xjaDVRLXAyWnBhTF81Zm5USVVEbHhDM3BXaEpUeXhfNzFxREktbUFBXzVsRV9WZHJvT2VmbEc1NnNTbUR4b3BQRUczYkZsU3UxZW93eUJmeHR1MF9DdVZkLU00MlJVNzVaYzRHc2o2dVY3N01CdGJNcmY0XzdNX05VVFNnb0lGM2ZScXhyajBOemloSUJnIiwKKy8vIAkJIlJTMjU2IiwKKy8vIAkJbWFwW3N0cmluZ11pbnRlcmZhY2V7fXsiZm9vIjogImJhciJ9LAorLy8gCQl0cnVlLAorLy8gCX0sCisvLyAJeworLy8gCQkiQmFzaWMgUlMzODQiLAorLy8gCQkiZXlKaGJHY2lPaUpTVXpNNE5DSXNJblI1Y0NJNklrcFhWQ0o5LmV5Sm1iMjhpT2lKaVlYSWlmUS5XLWpFelJmQmlndENXc2ludlZWdWxkaXVpbHpWZFU1dHkwTXZwTGFTYXFLOVBsQVdXbERRMVZJUV9xU0t6d0w1SVhhWmt2WkZKWFQzeUwzbjdPVVZ1N3pDTkp6ZHd6bmJDOFotYjB6MmxZdmNrbEpZaTJWT0ZSY0diSnRYVXFnamsyb0dzaXFVTVVNT0xQNzBUVGVma3BzZ3FEeGJSaDlDRFVmcE9KZ1ctZFU3Y21nYW9zd2Uzd2pVQVVpNkI2RzJZRWFpdVhDMFhTY1FZU1lWS0l6Z0tYSlY4WnctN0FOX0RCVUk0R2tUcHN2UTlmVlZqWk05Y3NRaUVYaFlla3lyS3UxbnVfUE9wUW9uR2Q4eXFrSXlYUEVDTm1tcUg1akg0c0ZpRjY3WGhEN19KcGt2THppQnBJLXVoODZldkJVYWRtSGhiOU90cXczdVYzTlRhWEx6SnciLAorLy8gCQkiUlMzODQiLAorLy8gCQltYXBbc3RyaW5nXWludGVyZmFjZXt9eyJmb28iOiAiYmFyIn0sCisvLyAJCXRydWUsCisvLyAJfSwKKy8vIAl7CisvLyAJCSJCYXNpYyBSUzUxMiIsCisvLyAJCSJleUpoYkdjaU9pSlNVelV4TWlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbWIyOGlPaUppWVhJaWZRLnpCbExsbVJyVXh4NFNKUFViVjM3UTFqb1JjSTlFVzEzZ3JuS2R1SzN3dFlLbURYYmdEcEYxY1o2Qi0ySnNtNVJCOFJFbU1pTHBHbXMtRWpYaGdueWgyVFNIRS05VzJnQV9qdnNoZWdMV3R3UlZEWDQwT0RTa1RiN09WdWFXZ2l5OXk3bGx2Y2tuRkJUSWctRm5WUFZwWE1tZVZfcHZ3UXloYXoxU1N3U1ByRHl4RW1rc3oxaHE3WU9OWGhYUHBHYU5iTU1lRFROUF8xb2o4RFphcVRJTDlUd1Y4XzF3YjJPZHRfRnk1OEtlMlJWRmlqc09MZG55RUFqdDJuOU14aWh1OWkzUGhOQmtreGEyR2JuWEJmcTNrenZaX3h4R0dvcExkSGhKamNHV1hPLU5pd0k5X3RpdTE0TlJ2NEwyeEMwSXREOVl6Njh2MlpJWkVwX0R1endSUSIsCisvLyAJCSJSUzUxMiIsCisvLyAJCW1hcFtzdHJpbmddaW50ZXJmYWNle317ImZvbyI6ICJiYXIifSwKKy8vIAkJdHJ1ZSwKKy8vIAl9LAorLy8gCXsKKy8vIAkJImJhc2ljIGludmFsaWQ6IGZvbyA9PiBiYXIiLAorLy8gCQkiZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKU1V6STFOaUo5LmV5Sm1iMjhpT2lKaVlYSWlmUS5FaGtpSGtvRVNJX2NHM05QaWdGcnhFazlaNjBfb1hyT1QydkdtOVBuNlJEZ1lOb3ZZT1JRbW1BMHpzMUFvQU9mMDlseTJOeDJZQWc2QUJxQVlnYTFBY01Ga0psand4VFQ1ZllwaFR1cXBXZHk0QkVMZVNZSng1VHkyZ21yOGU3Um9udVV6dHJkRDVXZlBxTEtNbTFPenBfVDZ6QUxwUm13VElXMFFQbmFCWGFRRDkwRnBsQWc0Nkl5MVVsREtyLUV1cHkwaTVTTGNoNVEtcDJacGFMXzVmblRJVURseEMzcFdoSlR5eF83MXFESS1tQUFfNWxFX1Zkcm9PZWZsRzU2c1NtRHhvcFBFRzNiRmxTdTFlb3d5QmZ4dHUwX0N1VmQtTTQyUlU3NVpjNEdzajZ1Vjc3TUJ0Yk1yZjRfN01fTlVUU2dvSUYzZlJxeHJqME56aWhJQmciLAorLy8gCQkiUlMyNTYiLAorLy8gCQltYXBbc3RyaW5nXWludGVyZmFjZXt9eyJmb28iOiAiYmFyIn0sCisvLyAJCWZhbHNlLAorLy8gCX0sCisvLyB9CisKKy8vIGZ1bmMgVGVzdFJTQVZlcmlmeSh0ICp0ZXN0aW5nLlQpIHsKKy8vIAlrZXlEYXRhLCBfIDo9IGlvdXRpbC5SZWFkRmlsZSgidGVzdC9zYW1wbGVfa2V5LnB1YiIpCisvLyAJa2V5LCBfIDo9IGp3dC5QYXJzZVJTQVB1YmxpY0tleUZyb21QRU0oa2V5RGF0YSkKKworLy8gCWZvciBfLCBkYXRhIDo9IHJhbmdlIHJzYVRlc3REYXRhIHsKKy8vIAkJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChkYXRhLnRva2VuU3RyaW5nLCAiLiIpCisKKy8vIAkJbWV0aG9kIDo9IGp3dC5HZXRTaWduaW5nTWV0aG9kKGRhdGEuYWxnKQorLy8gCQllcnIgOj0gbWV0aG9kLlZlcmlmeShzdHJpbmdzLkpvaW4ocGFydHNbMDoyXSwgIi4iKSwgcGFydHNbMl0sIGtleSkKKy8vIAkJaWYgZGF0YS52YWxpZCAmJiBlcnIgIT0gbmlsIHsKKy8vIAkJCXQuRXJyb3JmKCJbJXZdIEVycm9yIHdoaWxlIHZlcmlmeWluZyBrZXk6ICV2IiwgZGF0YS5uYW1lLCBlcnIpCisvLyAJCX0KKy8vIAkJaWYgIWRhdGEudmFsaWQgJiYgZXJyID09IG5pbCB7CisvLyAJCQl0LkVycm9yZigiWyV2XSBJbnZhbGlkIGtleSBwYXNzZWQgdmFsaWRhdGlvbiIsIGRhdGEubmFtZSkKKy8vIAkJfQorLy8gCX0KKy8vIH0KKworLy8gZnVuYyBUZXN0UlNBU2lnbih0ICp0ZXN0aW5nLlQpIHsKKy8vIAlrZXlEYXRhLCBfIDo9IGlvdXRpbC5SZWFkRmlsZSgidGVzdC9zYW1wbGVfa2V5IikKKy8vIAlrZXksIF8gOj0gand0LlBhcnNlUlNBUHJpdmF0ZUtleUZyb21QRU0oa2V5RGF0YSkKKworLy8gCWZvciBfLCBkYXRhIDo9IHJhbmdlIHJzYVRlc3REYXRhIHsKKy8vIAkJaWYgZGF0YS52YWxpZCB7CisvLyAJCQlwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KGRhdGEudG9rZW5TdHJpbmcsICIuIikKKy8vIAkJCW1ldGhvZCA6PSBqd3QuR2V0U2lnbmluZ01ldGhvZChkYXRhLmFsZykKKy8vIAkJCXNpZywgZXJyIDo9IG1ldGhvZC5TaWduKHN0cmluZ3MuSm9pbihwYXJ0c1swOjJdLCAiLiIpLCBrZXkpCisvLyAJCQlpZiBlcnIgIT0gbmlsIHsKKy8vIAkJCQl0LkVycm9yZigiWyV2XSBFcnJvciBzaWduaW5nIHRva2VuOiAldiIsIGRhdGEubmFtZSwgZXJyKQorLy8gCQkJfQorLy8gCQkJaWYgc2lnICE9IHBhcnRzWzJdIHsKKy8vIAkJCQl0LkVycm9yZigiWyV2XSBJbmNvcnJlY3Qgc2lnbmF0dXJlLlxud2FzOlxuJXZcbmV4cGVjdGluZzpcbiV2IiwgZGF0YS5uYW1lLCBzaWcsIHBhcnRzWzJdKQorLy8gCQkJfQorLy8gCQl9CisvLyAJfQorLy8gfQorCisvLyBmdW5jIFRlc3RSU0FWZXJpZnlXaXRoUHJlUGFyc2VkUHJpdmF0ZUtleSh0ICp0ZXN0aW5nLlQpIHsKKy8vIAlrZXksIF8gOj0gaW91dGlsLlJlYWRGaWxlKCJ0ZXN0L3NhbXBsZV9rZXkucHViIikKKy8vIAlwYXJzZWRLZXksIGVyciA6PSBqd3QuUGFyc2VSU0FQdWJsaWNLZXlGcm9tUEVNKGtleSkKKy8vIAlpZiBlcnIgIT0gbmlsIHsKKy8vIAkJdC5GYXRhbChlcnIpCisvLyAJfQorLy8gCXRlc3REYXRhIDo9IHJzYVRlc3REYXRhWzBdCisvLyAJcGFydHMgOj0gc3RyaW5ncy5TcGxpdCh0ZXN0RGF0YS50b2tlblN0cmluZywgIi4iKQorLy8gCWVyciA9IGp3dC5TaWduaW5nTWV0aG9kUlMyNTYuVmVyaWZ5KHN0cmluZ3MuSm9pbihwYXJ0c1swOjJdLCAiLiIpLCBwYXJ0c1syXSwgcGFyc2VkS2V5KQorLy8gCWlmIGVyciAhPSBuaWwgeworLy8gCQl0LkVycm9yZigiWyV2XSBFcnJvciB3aGlsZSB2ZXJpZnlpbmcga2V5OiAldiIsIHRlc3REYXRhLm5hbWUsIGVycikKKy8vIAl9CisvLyB9CisKKy8vIGZ1bmMgVGVzdFJTQVdpdGhQcmVQYXJzZWRQcml2YXRlS2V5KHQgKnRlc3RpbmcuVCkgeworLy8gCWtleSwgXyA6PSBpb3V0aWwuUmVhZEZpbGUoInRlc3Qvc2FtcGxlX2tleSIpCisvLyAJcGFyc2VkS2V5LCBlcnIgOj0gand0LlBhcnNlUlNBUHJpdmF0ZUtleUZyb21QRU0oa2V5KQorLy8gCWlmIGVyciAhPSBuaWwgeworLy8gCQl0LkZhdGFsKGVycikKKy8vIAl9CisvLyAJdGVzdERhdGEgOj0gcnNhVGVzdERhdGFbMF0KKy8vIAlwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KHRlc3REYXRhLnRva2VuU3RyaW5nLCAiLiIpCisvLyAJc2lnLCBlcnIgOj0gand0LlNpZ25pbmdNZXRob2RSUzI1Ni5TaWduKHN0cmluZ3MuSm9pbihwYXJ0c1swOjJdLCAiLiIpLCBwYXJzZWRLZXkpCisvLyAJaWYgZXJyICE9IG5pbCB7CisvLyAJCXQuRXJyb3JmKCJbJXZdIEVycm9yIHNpZ25pbmcgdG9rZW46ICV2IiwgdGVzdERhdGEubmFtZSwgZXJyKQorLy8gCX0KKy8vIAlpZiBzaWcgIT0gcGFydHNbMl0geworLy8gCQl0LkVycm9yZigiWyV2XSBJbmNvcnJlY3Qgc2lnbmF0dXJlLlxud2FzOlxuJXZcbmV4cGVjdGluZzpcbiV2IiwgdGVzdERhdGEubmFtZSwgc2lnLCBwYXJ0c1syXSkKKy8vIAl9CisvLyB9CisKKy8vIGZ1bmMgVGVzdFJTQUtleVBhcnNpbmcodCAqdGVzdGluZy5UKSB7CisvLyAJa2V5LCBfIDo9IGlvdXRpbC5SZWFkRmlsZSgidGVzdC9zYW1wbGVfa2V5IikKKy8vIAlwdWJLZXksIF8gOj0gaW91dGlsLlJlYWRGaWxlKCJ0ZXN0L3NhbXBsZV9rZXkucHViIikKKy8vIAliYWRLZXkgOj0gW11ieXRlKCJBbGwgeW91ciBiYXNlIGFyZSBiZWxvbmcgdG8ga2V5IikKKworLy8gCS8vIFRlc3QgcGFyc2VQcml2YXRlS2V5CisvLyAJaWYgXywgZSA6PSBqd3QuUGFyc2VSU0FQcml2YXRlS2V5RnJvbVBFTShrZXkpOyBlICE9IG5pbCB7CisvLyAJCXQuRXJyb3JmKCJGYWlsZWQgdG8gcGFyc2UgdmFsaWQgcHJpdmF0ZSBrZXk6ICV2IiwgZSkKKy8vIAl9CisKKy8vIAlpZiBrLCBlIDo9IGp3dC5QYXJzZVJTQVByaXZhdGVLZXlGcm9tUEVNKHB1YktleSk7IGUgPT0gbmlsIHsKKy8vIAkJdC5FcnJvcmYoIlBhcnNlZCBwdWJsaWMga2V5IGFzIHZhbGlkIHByaXZhdGUga2V5OiAldiIsIGspCisvLyAJfQorCisvLyAJaWYgaywgZSA6PSBqd3QuUGFyc2VSU0FQcml2YXRlS2V5RnJvbVBFTShiYWRLZXkpOyBlID09IG5pbCB7CisvLyAJCXQuRXJyb3JmKCJQYXJzZWQgaW52YWxpZCBrZXkgYXMgdmFsaWQgcHJpdmF0ZSBrZXk6ICV2IiwgaykKKy8vIAl9CisKKy8vIAkvLyBUZXN0IHBhcnNlUHVibGljS2V5CisvLyAJaWYgXywgZSA6PSBqd3QuUGFyc2VSU0FQdWJsaWNLZXlGcm9tUEVNKHB1YktleSk7IGUgIT0gbmlsIHsKKy8vIAkJdC5FcnJvcmYoIkZhaWxlZCB0byBwYXJzZSB2YWxpZCBwdWJsaWMga2V5OiAldiIsIGUpCisvLyAJfQorCisvLyAJaWYgaywgZSA6PSBqd3QuUGFyc2VSU0FQdWJsaWNLZXlGcm9tUEVNKGtleSk7IGUgPT0gbmlsIHsKKy8vIAkJdC5FcnJvcmYoIlBhcnNlZCBwcml2YXRlIGtleSBhcyB2YWxpZCBwdWJsaWMga2V5OiAldiIsIGspCisvLyAJfQorCisvLyAJaWYgaywgZSA6PSBqd3QuUGFyc2VSU0FQdWJsaWNLZXlGcm9tUEVNKGJhZEtleSk7IGUgPT0gbmlsIHsKKy8vIAkJdC5FcnJvcmYoIlBhcnNlZCBpbnZhbGlkIGtleSBhcyB2YWxpZCBwcml2YXRlIGtleTogJXYiLCBrKQorLy8gCX0KKworLy8gfQorCisvLyBmdW5jIEJlbmNobWFya1JTMjU2U2lnbmluZyhiICp0ZXN0aW5nLkIpIHsKKy8vIAlrZXksIF8gOj0gaW91dGlsLlJlYWRGaWxlKCJ0ZXN0L3NhbXBsZV9rZXkiKQorLy8gCXBhcnNlZEtleSwgZXJyIDo9IGp3dC5QYXJzZVJTQVByaXZhdGVLZXlGcm9tUEVNKGtleSkKKy8vIAlpZiBlcnIgIT0gbmlsIHsKKy8vIAkJYi5GYXRhbChlcnIpCisvLyAJfQorCisvLyAJYmVuY2htYXJrU2lnbmluZyhiLCBqd3QuU2lnbmluZ01ldGhvZFJTMjU2LCBwYXJzZWRLZXkpCisvLyB9CisKKy8vIGZ1bmMgQmVuY2htYXJrUlMzODRTaWduaW5nKGIgKnRlc3RpbmcuQikgeworLy8gCWtleSwgXyA6PSBpb3V0aWwuUmVhZEZpbGUoInRlc3Qvc2FtcGxlX2tleSIpCisvLyAJcGFyc2VkS2V5LCBlcnIgOj0gand0LlBhcnNlUlNBUHJpdmF0ZUtleUZyb21QRU0oa2V5KQorLy8gCWlmIGVyciAhPSBuaWwgeworLy8gCQliLkZhdGFsKGVycikKKy8vIAl9CisKKy8vIAliZW5jaG1hcmtTaWduaW5nKGIsIGp3dC5TaWduaW5nTWV0aG9kUlMzODQsIHBhcnNlZEtleSkKKy8vIH0KKworLy8gZnVuYyBCZW5jaG1hcmtSUzUxMlNpZ25pbmcoYiAqdGVzdGluZy5CKSB7CisvLyAJa2V5LCBfIDo9IGlvdXRpbC5SZWFkRmlsZSgidGVzdC9zYW1wbGVfa2V5IikKKy8vIAlwYXJzZWRLZXksIGVyciA6PSBqd3QuUGFyc2VSU0FQcml2YXRlS2V5RnJvbVBFTShrZXkpCisvLyAJaWYgZXJyICE9IG5pbCB7CisvLyAJCWIuRmF0YWwoZXJyKQorLy8gCX0KKworLy8gCWJlbmNobWFya1NpZ25pbmcoYiwgand0LlNpZ25pbmdNZXRob2RSUzUxMiwgcGFyc2VkS2V5KQorLy8gfQpkaWZmIC0tZ2l0IGEvandzL3JzYV91dGlscy5nbyBiL2p3cy9yc2FfdXRpbHMuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhMWE3NQotLS0gL2Rldi9udWxsCisrKyBiL2p3cy9yc2FfdXRpbHMuZ28KQEAgLTAsMCArMSw2OSBAQAorcGFja2FnZSBqd3MKKworaW1wb3J0ICgKKwkiY3J5cHRvL3JzYSIKKwkiY3J5cHRvL3g1MDkiCisJImVuY29kaW5nL3BlbSIKKwkiZXJyb3JzIgorKQorCisvLyBFcnJvcnMgc3BlY2lmaWMgdG8gcnNhX3V0aWxzLgordmFyICgKKwlFcnJLZXlNdXN0QmVQRU1FbmNvZGVkID0gZXJyb3JzLk5ldygiSW52YWxpZCBLZXk6IEtleSBtdXN0IGJlIFBFTSBlbmNvZGVkIFBLQ1MxIG9yIFBLQ1M4IHByaXZhdGUga2V5IikKKwlFcnJOb3RSU0FQcml2YXRlS2V5ICAgID0gZXJyb3JzLk5ldygiS2V5IGlzIG5vdCBhIHZhbGlkIFJTQSBwcml2YXRlIGtleSIpCispCisKKy8vIFBhcnNlUlNBUHJpdmF0ZUtleUZyb21QRU0gcGFyc2VzIGEgUEVNIGVuY29kZWQgUEtDUzEgb3IgUEtDUzggcHJpdmF0ZSBrZXkuCitmdW5jIFBhcnNlUlNBUHJpdmF0ZUtleUZyb21QRU0oa2V5IFtdYnl0ZSkgKCpyc2EuUHJpdmF0ZUtleSwgZXJyb3IpIHsKKwl2YXIgZXJyIGVycm9yCisKKwkvLyBQYXJzZSBQRU0gYmxvY2sKKwl2YXIgYmxvY2sgKnBlbS5CbG9jaworCWlmIGJsb2NrLCBfID0gcGVtLkRlY29kZShrZXkpOyBibG9jayA9PSBuaWwgeworCQlyZXR1cm4gbmlsLCBFcnJLZXlNdXN0QmVQRU1FbmNvZGVkCisJfQorCisJdmFyIHBhcnNlZEtleSBpbnRlcmZhY2V7fQorCWlmIHBhcnNlZEtleSwgZXJyID0geDUwOS5QYXJzZVBLQ1MxUHJpdmF0ZUtleShibG9jay5CeXRlcyk7IGVyciAhPSBuaWwgeworCQlpZiBwYXJzZWRLZXksIGVyciA9IHg1MDkuUGFyc2VQS0NTOFByaXZhdGVLZXkoYmxvY2suQnl0ZXMpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBuaWwsIGVycgorCQl9CisJfQorCisJdmFyIHBrZXkgKnJzYS5Qcml2YXRlS2V5CisJdmFyIG9rIGJvb2wKKwlpZiBwa2V5LCBvayA9IHBhcnNlZEtleS4oKnJzYS5Qcml2YXRlS2V5KTsgIW9rIHsKKwkJcmV0dXJuIG5pbCwgRXJyTm90UlNBUHJpdmF0ZUtleQorCX0KKworCXJldHVybiBwa2V5LCBuaWwKK30KKworLy8gUGFyc2VSU0FQdWJsaWNLZXlGcm9tUEVNIHBhcnNlcyBQRU0gZW5jb2RlZCBQS0NTMSBvciBQS0NTOCBwdWJsaWMga2V5LgorZnVuYyBQYXJzZVJTQVB1YmxpY0tleUZyb21QRU0oa2V5IFtdYnl0ZSkgKCpyc2EuUHVibGljS2V5LCBlcnJvcikgeworCXZhciBlcnIgZXJyb3IKKworCS8vIFBhcnNlIFBFTSBibG9jaworCXZhciBibG9jayAqcGVtLkJsb2NrCisJaWYgYmxvY2ssIF8gPSBwZW0uRGVjb2RlKGtleSk7IGJsb2NrID09IG5pbCB7CisJCXJldHVybiBuaWwsIEVycktleU11c3RCZVBFTUVuY29kZWQKKwl9CisKKwkvLyBQYXJzZSB0aGUga2V5CisJdmFyIHBhcnNlZEtleSBpbnRlcmZhY2V7fQorCWlmIHBhcnNlZEtleSwgZXJyID0geDUwOS5QYXJzZVBLSVhQdWJsaWNLZXkoYmxvY2suQnl0ZXMpOyBlcnIgIT0gbmlsIHsKKwkJaWYgY2VydCwgZXJyIDo9IHg1MDkuUGFyc2VDZXJ0aWZpY2F0ZShibG9jay5CeXRlcyk7IGVyciA9PSBuaWwgeworCQkJcGFyc2VkS2V5ID0gY2VydC5QdWJsaWNLZXkKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBuaWwsIGVycgorCQl9CisJfQorCisJdmFyIHBrZXkgKnJzYS5QdWJsaWNLZXkKKwl2YXIgb2sgYm9vbAorCWlmIHBrZXksIG9rID0gcGFyc2VkS2V5LigqcnNhLlB1YmxpY0tleSk7ICFvayB7CisJCXJldHVybiBuaWwsIEVyck5vdFJTQVByaXZhdGVLZXkKKwl9CisKKwlyZXR1cm4gcGtleSwgbmlsCit9CmRpZmYgLS1naXQgYS9qd3Mvc2lnbmF0dXJlLmdvIGIvandzL3NpZ25hdHVyZS5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmJkYzc4Ci0tLSAvZGV2L251bGwKKysrIGIvandzL3NpZ25hdHVyZS5nbwpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIGp3cworCitpbXBvcnQgKAorCSJlbmNvZGluZy9qc29uIgorCisJImdpdGh1Yi5jb20vU2VybW9EaWdpdGFsL2pvc2UiCispCisKKy8vIFNpZ25hdHVyZSBpcyBhIEpXUyBzaWduYXR1cmUuCit0eXBlIFNpZ25hdHVyZSBbXWJ5dGUKKworLy8gTWFyc2hhbEpTT04gaW1wbGVtZW50cyBqc29uLk1hcnNoYWxlciBmb3IgYSBzaWduYXR1cmUuCitmdW5jIChzIFNpZ25hdHVyZSkgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgeworCXJldHVybiBqb3NlLkVuY29kZUVzY2FwZShzKSwgbmlsCit9CisKKy8vIEJhc2U2NCBoZWxwcyBpbXBsZW1lbnRzIGpvc2UuRW5jb2RlciBmb3IgU2lnbmF0dXJlLgorZnVuYyAocyBTaWduYXR1cmUpIEJhc2U2NCgpIChbXWJ5dGUsIGVycm9yKSB7CisJcmV0dXJuIGpvc2UuQmFzZTY0RW5jb2RlKHMpLCBuaWwKK30KKworLy8gVW5tYXJzaGFsSlNPTiBpbXBsZW1lbnRzIGpzb24uVW5tYXJzaGFsZXIgZm9yIHNpZ25hdHVyZS4KK2Z1bmMgKHMgKlNpZ25hdHVyZSkgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgeworCWRlYywgZXJyIDo9IGpvc2UuRGVjb2RlRXNjYXBlZChiKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCSpzID0gU2lnbmF0dXJlKGRlYykKKwlyZXR1cm4gbmlsCit9CisKK3ZhciAoCisJXyBqc29uLk1hcnNoYWxlciAgID0gKFNpZ25hdHVyZSkobmlsKQorCV8ganNvbi5Vbm1hcnNoYWxlciA9ICgqU2lnbmF0dXJlKShuaWwpCisJXyBqb3NlLkVuY29kZXIgICAgID0gKFNpZ25hdHVyZSkobmlsKQorKQpkaWZmIC0tZ2l0IGEvandzL3NpZ25hdHVyZV90ZXN0LmdvIGIvandzL3NpZ25hdHVyZV90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzE0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9qd3Mvc2lnbmF0dXJlX3Rlc3QuZ28KQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBqd3MKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImVuY29kaW5nL2pzb24iCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdE1hcnNoYWxTaWduYXR1cmUodCAqdGVzdGluZy5UKSB7CisJcyA6PSBTaWduYXR1cmUoIlRlc3Qgc3RyaW5nISIpCisKKwllbmMsIGVyciA6PSBqc29uLk1hcnNoYWwocykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJfQorCisJdmFyIHNzIFNpZ25hdHVyZQorCWlmIGVyciA9IGpzb24uVW5tYXJzaGFsKGVuYywgJnNzKTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCX0KKworCWlmICFieXRlcy5FcXVhbChzcywgcykgeworCQlFcnJvcih0LCBzLCBzcykKKwl9Cit9CmRpZmYgLS1naXQgYS9qd3Mvc2lnbmluZ19tZXRob2RzLmdvIGIvandzL3NpZ25pbmdfbWV0aG9kcy5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzIxZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvandzL3NpZ25pbmdfbWV0aG9kcy5nbwpAQCAtMCwwICsxLDc5IEBACitwYWNrYWdlIGp3cworCitpbXBvcnQgKAorCSJjcnlwdG8iCisJInN5bmMiCispCisKK3ZhciAoCisJbXUgPSAmc3luYy5SV011dGV4e30KKworCXNpZ25pbmdNZXRob2RzID0gbWFwW3N0cmluZ11TaWduaW5nTWV0aG9keworCQlTaWduaW5nTWV0aG9kRVMyNTYuQWxnKCk6IFNpZ25pbmdNZXRob2RFUzI1NiwKKwkJU2lnbmluZ01ldGhvZEVTMzg0LkFsZygpOiBTaWduaW5nTWV0aG9kRVMzODQsCisJCVNpZ25pbmdNZXRob2RFUzUxMi5BbGcoKTogU2lnbmluZ01ldGhvZEVTNTEyLAorCisJCVNpZ25pbmdNZXRob2RQUzI1Ni5BbGcoKTogU2lnbmluZ01ldGhvZFBTMjU2LAorCQlTaWduaW5nTWV0aG9kUFMzODQuQWxnKCk6IFNpZ25pbmdNZXRob2RQUzM4NCwKKwkJU2lnbmluZ01ldGhvZFBTNTEyLkFsZygpOiBTaWduaW5nTWV0aG9kUFM1MTIsCisKKwkJU2lnbmluZ01ldGhvZFJTMjU2LkFsZygpOiBTaWduaW5nTWV0aG9kUlMyNTYsCisJCVNpZ25pbmdNZXRob2RSUzM4NC5BbGcoKTogU2lnbmluZ01ldGhvZFJTMzg0LAorCQlTaWduaW5nTWV0aG9kUlM1MTIuQWxnKCk6IFNpZ25pbmdNZXRob2RSUzUxMiwKKworCQlTaWduaW5nTWV0aG9kSFMyNTYuQWxnKCk6IFNpZ25pbmdNZXRob2RIUzI1NiwKKwkJU2lnbmluZ01ldGhvZEhTMzg0LkFsZygpOiBTaWduaW5nTWV0aG9kSFMzODQsCisJCVNpZ25pbmdNZXRob2RIUzUxMi5BbGcoKTogU2lnbmluZ01ldGhvZEhTNTEyLAorCX0KKykKKworLy8gU2lnbmluZ01ldGhvZCBpcyBhbiBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBhIHdheSB0byBzaWduIEpXUyB0b2tlbnMuCit0eXBlIFNpZ25pbmdNZXRob2QgaW50ZXJmYWNlIHsKKwkvLyBBbGcgZGVzY3JpYmVzIHRoZSBzaWduaW5nIGFsZ29yaXRobSwgYW5kIGlzIHVzZWQgdG8gdW5pcXVlbHkKKwkvLyBkZXNjcmliZSB0aGUgc3BlY2lmaWMgU2lnbmluZ01ldGhvZC4KKwlBbGcoKSBzdHJpbmcKKworCS8vIFZlcmlmeSBhY2NlcHRzIHRoZSByYXcgY29udGVudCwgdGhlIHNpZ25hdHVyZSwgYW5kIHRoZSBrZXkgdXNlZAorCS8vIHRvIHNpZ24gdGhlIHJhdyBjb250ZW50LCBhbmQgcmV0dXJucyBhbnkgZXJyb3JzIGZvdW5kIHdoaWxlIHZhbGlkYXRpbmcKKwkvLyB0aGUgc2lnbmF0dXJlIGFuZCBjb250ZW50LgorCVZlcmlmeShyYXcgW11ieXRlLCBzaWcgU2lnbmF0dXJlLCBrZXkgaW50ZXJmYWNle30pIGVycm9yCisKKwkvLyBTaWduIHJldHVybnMgYSBTaWduYXR1cmUgZm9yIHRoZSByYXcgYnl0ZXMsIGFzIHdlbGwgYXMgYW55IGVycm9ycworCS8vIHRoYXQgb2NjdXJyZWQgZHVyaW5nIHRoZSBzaWduaW5nLgorCVNpZ24ocmF3IFtdYnl0ZSwga2V5IGludGVyZmFjZXt9KSAoU2lnbmF0dXJlLCBlcnJvcikKKworCS8vIFVzZWQgdG8gY2F1c2UgcXVpY2sgcGFuaWNzIHdoZW4gYSBTaWduaW5nTWV0aG9kIHdob3NlIGZvcm0gb2YgaGFzaGluZworCS8vIGlzbid0IGxpbmtlZCBpbiB0aGUgYmluYXJ5IHdoZW4geW91IHJlZ2lzdGVyIGEgU2lnbmluZ01ldGhvZC4KKwkvLyBUbyBzcG9vZiB0aGlzLCBzZWUgIlNpZ25pbmdNZXRob2ROb25lIi4KKwlIYXNoZXIoKSBjcnlwdG8uSGFzaAorfQorCisvLyBSZWdpc3RlclNpZ25pbmdNZXRob2QgcmVnaXN0ZXJzIHRoZSBTaWduaW5nTWV0aG9kIGluIHRoZSBnbG9iYWwgbWFwLgorLy8gVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBpbnNpZGUgdGhlIGNhbGxlcidzIGluaXQgZnVuY3Rpb24uCitmdW5jIFJlZ2lzdGVyU2lnbmluZ01ldGhvZChzbSBTaWduaW5nTWV0aG9kKSB7CisJaWYgR2V0U2lnbmluZ01ldGhvZChzbS5BbGcoKSkgIT0gbmlsIHsKKwkJcGFuaWMoImpvc2UvandzOiBjYW5ub3QgZHVwbGljYXRlIHNpZ25pbmcgbWV0aG9kcyIpCisJfQorCisJaWYgIXNtLkhhc2hlcigpLkF2YWlsYWJsZSgpIHsKKwkJcGFuaWMoImpvc2UvandzOiBzcGVjaWZpYyBoYXNoIGlzIHVuYXZhaWxhYmxlIikKKwl9CisKKwltdS5Mb2NrKCkKKwlzaWduaW5nTWV0aG9kc1tzbS5BbGcoKV0gPSBzbQorCW11LlVubG9jaygpCit9CisKKy8vIFJlbW92ZVNpZ25pbmdNZXRob2QgcmVtb3ZlcyB0aGUgU2lnbmluZ01ldGhvZCBmcm9tIHRoZSBnbG9iYWwgbWFwLgorZnVuYyBSZW1vdmVTaWduaW5nTWV0aG9kKHNtIFNpZ25pbmdNZXRob2QpIHsKKwltdS5Mb2NrKCkKKwlkZWxldGUoc2lnbmluZ01ldGhvZHMsIHNtLkFsZygpKQorCW11LlVubG9jaygpCit9CisKKy8vIEdldFNpZ25pbmdNZXRob2QgcmV0cmlldmVzIGEgU2lnbmluZ01ldGhvZCBmcm9tIHRoZSBnbG9iYWwgbWFwLgorZnVuYyBHZXRTaWduaW5nTWV0aG9kKGFsZyBzdHJpbmcpIFNpZ25pbmdNZXRob2QgeworCW11LlJMb2NrKCkKKwlkZWZlciBtdS5SVW5sb2NrKCkKKwlyZXR1cm4gc2lnbmluZ01ldGhvZHNbYWxnXQorfQpkaWZmIC0tZ2l0IGEvandzL3NpZ25pbmdfbWV0aG9kc190ZXN0LmdvIGIvandzL3NpZ25pbmdfbWV0aG9kc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDUyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9qd3Mvc2lnbmluZ19tZXRob2RzX3Rlc3QuZ28KQEAgLTAsMCArMSw2OSBAQAorcGFja2FnZSBqd3MKKworaW1wb3J0ICgKKwkiY3J5cHRvIgorCSJoYXNoIgorCSJpbyIKKwkidGVzdGluZyIKKykKKworZnVuYyBpbml0KCkgeyBjcnlwdG8uUmVnaXN0ZXJIYXNoKGNyeXB0by5IYXNoKDApLCBISCkgfQorCitmdW5jIEhIKCkgaGFzaC5IYXNoIHsgcmV0dXJuICZmZntXcml0ZXI6IG5pbH0gfQorCit0eXBlIGZmIHN0cnVjdHsgaW8uV3JpdGVyIH0KKworZnVuYyAoZiAqZmYpIFN1bShiIFtdYnl0ZSkgW11ieXRlIHsgcmV0dXJuIG5pbCB9CitmdW5jIChmICpmZikgUmVzZXQoKSAgICAgICAgICAgICAge30KK2Z1bmMgKGYgKmZmKSBTaXplKCkgaW50ICAgICAgICAgICB7IHJldHVybiAtMSB9CitmdW5jIChmICpmZikgQmxvY2tTaXplKCkgaW50ICAgICAgeyByZXR1cm4gLTEgfQorCisvLyBNeVNpZ25pbmdNZXRob2QgaXMgdGhlIGRlZmF1bHQgIm5vbmUiIGFsZ29yaXRobS4KK3ZhciBNeVNpZ25pbmdNZXRob2QgPSAmVGVzdFNpZ25pbmdNZXRob2R7CisJTmFtZTogIlN1cGVyU2lnbmVyQWxnb3JpdGhtMTAwMCIsCisJSGFzaDogY3J5cHRvLkhhc2goMCksCit9CisKK3R5cGUgVGVzdFNpZ25pbmdNZXRob2Qgc3RydWN0IHsKKwlOYW1lIHN0cmluZworCUhhc2ggY3J5cHRvLkhhc2gKK30KKworZnVuYyAobSAqVGVzdFNpZ25pbmdNZXRob2QpIFZlcmlmeShfIFtdYnl0ZSwgXyBTaWduYXR1cmUsIF8gaW50ZXJmYWNle30pIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKG0gKlRlc3RTaWduaW5nTWV0aG9kKSBTaWduKF8gW11ieXRlLCBfIGludGVyZmFjZXt9KSAoU2lnbmF0dXJlLCBlcnJvcikgeworCXJldHVybiBuaWwsIG5pbAorfQorCitmdW5jIChtICpUZXN0U2lnbmluZ01ldGhvZCkgQWxnKCkgc3RyaW5nICAgICAgICAgeyByZXR1cm4gbS5OYW1lIH0KK2Z1bmMgKG0gKlRlc3RTaWduaW5nTWV0aG9kKSBTdW0oYiBbXWJ5dGUpIFtdYnl0ZSB7IHJldHVybiBuaWwgfQorZnVuYyAobSAqVGVzdFNpZ25pbmdNZXRob2QpIEhhc2hlcigpIGNyeXB0by5IYXNoIHsgcmV0dXJuIG0uSGFzaCB9CisKKy8vIEdldFNpZ25pbmdNZXRob2QgaXMgaW1wbGljaXRseSB0ZXN0ZWQgaW5zaWRlIHRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucy4KKworZnVuYyBUZXN0UmVnaXN0ZXJTaWduaW5nTWV0aG9kKHQgKnRlc3RpbmcuVCkgeworCisJUmVnaXN0ZXJTaWduaW5nTWV0aG9kKE15U2lnbmluZ01ldGhvZCkKKworCWlmIEdldFNpZ25pbmdNZXRob2QoIlN1cGVyU2lnbmVyQWxnb3JpdGhtMTAwMCIpID09IG5pbCB7CisJCXQuRXJyb3IoIkV4cGVjdGVkIFN1cGVyU2lnbmVyQWxnb3JpdGhtMTAwMCwgZ290IG5pbCIpCisJfQorCisJUmVtb3ZlU2lnbmluZ01ldGhvZChNeVNpZ25pbmdNZXRob2QpCit9CisKK2Z1bmMgVGVzdFJlbW92ZVNpZ25pbmdNZXRob2QodCAqdGVzdGluZy5UKSB7CisJUmVnaXN0ZXJTaWduaW5nTWV0aG9kKE15U2lnbmluZ01ldGhvZCkKKworCWlmIEdldFNpZ25pbmdNZXRob2QoIlN1cGVyU2lnbmVyQWxnb3JpdGhtMTAwMCIpID09IG5pbCB7CisJCXQuRXJyb3IoIkV4cGVjdGVkIFN1cGVyU2lnbmVyQWxnb3JpdGhtMTAwMCwgZ290IG5pbCIpCisJfQorCisJUmVtb3ZlU2lnbmluZ01ldGhvZChNeVNpZ25pbmdNZXRob2QpCisKKwlpZiBhIDo9IEdldFNpZ25pbmdNZXRob2QoIlN1cGVyU2lnbmVyQWxnb3JpdGhtMTAwMCIpOyBhICE9IG5pbCB7CisJCXQuRXJyb3JmKCJFeHBlY3RlZCBuaWwsIGdvdCAldiIsIGEpCisJfQorfQpkaWZmIC0tZ2l0IGEvandzL3N0dWJzX3Rlc3QuZ28gYi9qd3Mvc3R1YnNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjllOWIyCi0tLSAvZGV2L251bGwKKysrIGIvandzL3N0dWJzX3Rlc3QuZ28KQEAgLTAsMCArMSwxMTggQEAKK3BhY2thZ2UgandzCisKK2ltcG9ydCAoCisJImNyeXB0by9lY2RzYSIKKwkiY3J5cHRvL3JzYSIKKwkiY3J5cHRvL3g1MDkiCisJImVuY29kaW5nL3BlbSIKKwkiZm10IgorCSJpby9pb3V0aWwiCisJInBhdGgvZmlsZXBhdGgiCisJInRlc3RpbmciCispCisKK2Z1bmMgRXJyb3IodCAqdGVzdGluZy5ULCB3YW50LCBnb3QgaW50ZXJmYWNle30pIHsKKwlmb3JtYXQgOj0gIlxuV2FudGVkOiAlc1xuR290OiAlcyIKKworCXN3aXRjaCB3YW50Lih0eXBlKSB7CisJY2FzZSBbXWJ5dGUsIHN0cmluZywgbmlsLCByYXdCYXNlNjQsIGVhc3k6CisJZGVmYXVsdDoKKwkJZm9ybWF0ID0gZm10LlNwcmludGYoZm9ybWF0LCAiJXYiLCAiJXYiKQorCX0KKworCXQuRXJyb3JmKGZvcm1hdCwgd2FudCwgZ290KQorfQorCitmdW5jIEVycm9yVHlwZXModCAqdGVzdGluZy5ULCB3YW50LCBnb3QgaW50ZXJmYWNle30pIHsKKwl0LkVycm9yZigiXG5XYW50ZWQ6ICVUXG5Hb3Q6ICVUIiwgd2FudCwgZ290KQorfQorCit2YXIgKAorCXJzYVByaXYgICAqcnNhLlByaXZhdGVLZXkKKwlyc2FQdWIgICAgaW50ZXJmYWNle30KKwllYzI1NlByaXYgKmVjZHNhLlByaXZhdGVLZXkKKwllYzI1NlB1YiAgKmVjZHNhLlB1YmxpY0tleQorCWVjMzg0UHJpdiAqZWNkc2EuUHJpdmF0ZUtleQorCWVjMzg0UHViICAqZWNkc2EuUHVibGljS2V5CisJZWM1MTJQcml2ICplY2RzYS5Qcml2YXRlS2V5CisJZWM1MTJQdWIgICplY2RzYS5QdWJsaWNLZXkKKwlobTI1NiAgICAgaW50ZXJmYWNle30KKykKKworZnVuYyBpbml0KCkgeworCWRlckJ5dGVzLCBlcnIgOj0gaW91dGlsLlJlYWRGaWxlKGZpbGVwYXRoLkpvaW4oInRlc3QiLCAic2FtcGxlX2tleS5wdWIiKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoZXJyKQorCX0KKwlibG9jaywgXyA6PSBwZW0uRGVjb2RlKGRlckJ5dGVzKQorCisJcnNhUHViLCBlcnIgPSB4NTA5LlBhcnNlUEtJWFB1YmxpY0tleShibG9jay5CeXRlcykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoZXJyKQorCX0KKworCWRlciwgZXJyIDo9IGlvdXRpbC5SZWFkRmlsZShmaWxlcGF0aC5Kb2luKCJ0ZXN0IiwgInNhbXBsZV9rZXkucHJpdiIpKQorCWlmIGVyciAhPSBuaWwgeworCQlwYW5pYyhlcnIpCisJfQorCWJsb2NrMiwgXyA6PSBwZW0uRGVjb2RlKGRlcikKKworCXJzYVByaXYsIGVyciA9IHg1MDkuUGFyc2VQS0NTMVByaXZhdGVLZXkoYmxvY2syLkJ5dGVzKQorCWlmIGVyciAhPSBuaWwgeworCQlwYW5pYyhlcnIpCisJfQorCisJZWNEYXRhLCBlcnIgOj0gaW91dGlsLlJlYWRGaWxlKGZpbGVwYXRoLkpvaW4oInRlc3QiLCAiZWMyNTYtcHJpdmF0ZS5wZW0iKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoZXJyKQorCX0KKwllYzI1NlByaXYsIGVyciA9IFBhcnNlRUNQcml2YXRlS2V5RnJvbVBFTShlY0RhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCXBhbmljKGVycikKKwl9CisJZWNEYXRhLCBlcnIgPSBpb3V0aWwuUmVhZEZpbGUoZmlsZXBhdGguSm9pbigidGVzdCIsICJlYzI1Ni1wdWJsaWMucGVtIikpCisJaWYgZXJyICE9IG5pbCB7CisJCXBhbmljKGVycikKKwl9CisJZWMyNTZQdWIsIGVyciA9IFBhcnNlRUNQdWJsaWNLZXlGcm9tUEVNKGVjRGF0YSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoZXJyKQorCX0KKwllY0RhdGEsIGVyciA9IGlvdXRpbC5SZWFkRmlsZShmaWxlcGF0aC5Kb2luKCJ0ZXN0IiwgImVjMzg0LXByaXZhdGUucGVtIikpCisJaWYgZXJyICE9IG5pbCB7CisJCXBhbmljKGVycikKKwl9CisJZWMzODRQcml2LCBlcnIgPSBQYXJzZUVDUHJpdmF0ZUtleUZyb21QRU0oZWNEYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQlwYW5pYyhlcnIpCisJfQorCWVjRGF0YSwgZXJyID0gaW91dGlsLlJlYWRGaWxlKGZpbGVwYXRoLkpvaW4oInRlc3QiLCAiZWMzODQtcHVibGljLnBlbSIpKQorCWlmIGVyciAhPSBuaWwgeworCQlwYW5pYyhlcnIpCisJfQorCWVjMzg0UHViLCBlcnIgPSBQYXJzZUVDUHVibGljS2V5RnJvbVBFTShlY0RhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCXBhbmljKGVycikKKwl9CisJZWNEYXRhLCBlcnIgPSBpb3V0aWwuUmVhZEZpbGUoZmlsZXBhdGguSm9pbigidGVzdCIsICJlYzUxMi1wcml2YXRlLnBlbSIpKQorCWlmIGVyciAhPSBuaWwgeworCQlwYW5pYyhlcnIpCisJfQorCWVjNTEyUHJpdiwgZXJyID0gUGFyc2VFQ1ByaXZhdGVLZXlGcm9tUEVNKGVjRGF0YSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoZXJyKQorCX0KKwllY0RhdGEsIGVyciA9IGlvdXRpbC5SZWFkRmlsZShmaWxlcGF0aC5Kb2luKCJ0ZXN0IiwgImVjNTEyLXB1YmxpYy5wZW0iKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoZXJyKQorCX0KKwllYzUxMlB1YiwgZXJyID0gUGFyc2VFQ1B1YmxpY0tleUZyb21QRU0oZWNEYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQlwYW5pYyhlcnIpCisJfQorCisJaG0yNTYsIGVyciA9IGlvdXRpbC5SZWFkRmlsZShmaWxlcGF0aC5Kb2luKCJ0ZXN0IiwgImhtYWNUZXN0S2V5IikpCisJaWYgZXJyICE9IG5pbCB7CisJCXBhbmljKGVycikKKwl9Cit9CmRpZmYgLS1naXQgYS9qd3MvdGVzdC9lYzI1Ni1wcml2YXRlLnBlbSBiL2p3cy90ZXN0L2VjMjU2LXByaXZhdGUucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ODgyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9qd3MvdGVzdC9lYzI1Ni1wcml2YXRlLnBlbQpAQCAtMCwwICsxLDUgQEAKKy0tLS0tQkVHSU4gRUMgUFJJVkFURSBLRVktLS0tLQorTUhjQ0FRRUVJQWg1cUEzcm1xUVF1dTB2YktWLyt6b3V6L3kvSXkycExwSWNXVVN5SW1Td29Bb0dDQ3FHU000OQorQXdFSG9VUURRZ0FFWUQ1NFYvdnArNTRQOURYYXJZcXg0TVBjbStIS1JJUXpOYXNZU29SUUhRLzZTNlBzOHRwTQorY1QrS3ZJSUM4Vy9lOWswVzdDbTcyTTFQOWpVN1NMZi92Zz09CistLS0tLUVORCBFQyBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9qd3MvdGVzdC9lYzI1Ni1wdWJsaWMucGVtIGIvandzL3Rlc3QvZWMyNTYtcHVibGljLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTkxMzYxCi0tLSAvZGV2L251bGwKKysrIGIvandzL3Rlc3QvZWMyNTYtcHVibGljLnBlbQpAQCAtMCwwICsxLDQgQEAKKy0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCitNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVZRDU0Vi92cCs1NFA5RFhhcllxeDRNUGNtK0hLCitSSVF6TmFzWVNvUlFIUS82UzZQczh0cE1jVCtLdklJQzhXL2U5azBXN0NtNzJNMVA5alU3U0xmL3ZnPT0KKy0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvandzL3Rlc3QvZWMzODQtcHJpdmF0ZS5wZW0gYi9qd3MvdGVzdC9lYzM4NC1wcml2YXRlLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODZjODIzCi0tLSAvZGV2L251bGwKKysrIGIvandzL3Rlc3QvZWMzODQtcHJpdmF0ZS5wZW0KQEAgLTAsMCArMSw2IEBACistLS0tLUJFR0lOIEVDIFBSSVZBVEUgS0VZLS0tLS0KK01JR2tBZ0VCQkRDYUN2TUhLaGNHL3FUN3hzTkxZbkRUN3NFL0QrVHRXSW9sMVJPZGFLMWE1NjR2eDVwSGJzUnkKK1NFS2NJeElTaTFpZ0J3WUZLNEVFQUNLaFpBTmlBQVRZYTdySmFVN2ZlTE1xckF4NmFkWkZOUU9wYVVIL1V5bGIKK1pMcmlPTE9ONVlGVnd0VlVwTzFGZkVYWlVJUXBwdFJQdGM1aXhJUFk2NTh5aEJTYjZpcmZJSlVTUDlhWVRmbEoKK0dLay9tRGtLNHQ4bVdCemhpRDVCNmpnOWNFR2hHZ0E9CistLS0tLUVORCBFQyBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9qd3MvdGVzdC9lYzM4NC1wdWJsaWMucGVtIGIvandzL3Rlc3QvZWMzODQtcHVibGljLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODBkMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvandzL3Rlc3QvZWMzODQtcHVibGljLnBlbQpAQCAtMCwwICsxLDUgQEAKKy0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCitNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRTJHdTZ5V2xPMzNpektxd01lbW5XUlRVRHFXbEIvMU1wCitXMlM2NGppemplV0JWY0xWVktUdFJYeEYyVkNFS2FiVVQ3WE9Zc1NEMk91Zk1vUVVtK29xM3lDVkVqL1dtRTM1CitTUmlwUDVnNUN1TGZKbGdjNFlnK1FlbzRQWEJCb1JvQQorLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9qd3MvdGVzdC9lYzUxMi1wcml2YXRlLnBlbSBiL2p3cy90ZXN0L2VjNTEyLXByaXZhdGUucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxM2FmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9qd3MvdGVzdC9lYzUxMi1wcml2YXRlLnBlbQpAQCAtMCwwICsxLDcgQEAKKy0tLS0tQkVHSU4gRUMgUFJJVkFURSBLRVktLS0tLQorTUlIY0FnRUJCRUlCMHBFNHVGYVdSeDd0MDNCc1lsWXZGMVl2S2FCR3l2b2FreG5vZG05b3UwUjl3QytzSkFqSAorUVpaSmlrT2c0U3dOcWdRL2h5ck91REsyb0FWSGhnVkdjWW1nQndZRks0RUVBQ09oZ1lrRGdZWUFCQUFKWEl1dworMTJNVXpwSGdnaWE5UE9CRllYU3hhT0dLR2JNakl5REkrNnE3d2k3TE13M0hnYmFPbWdJcUZHNzJvOEpCUXdZTgorNEliWEhmK2Y4NkNSWTFBQTJ3SHpiSHZ0Nkloa0NYVE54QkVmZmExeU1VZ3U4bjljS0tGMmlMZ3lRS2NLcVczMworOGZHT3cvbjNSbTJZZC9FQjU2dTJybkQyOXFTK25PTTllR1MrZ3kzOU9RPT0KKy0tLS0tRU5EIEVDIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2p3cy90ZXN0L2VjNTEyLXB1YmxpYy5wZW0gYi9qd3MvdGVzdC9lYzUxMi1wdWJsaWMucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZWEwMjIKLS0tIC9kZXYvbnVsbAorKysgYi9qd3MvdGVzdC9lYzUxMi1wdWJsaWMucGVtCkBAIC0wLDAgKzEsNiBAQAorLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KK01JR2JNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWpBNEdHQUFRQUNWeUxzTmRqRk02UjRJSW12VHpnUldGMHNXamgKK2lobXpJeU1neVB1cXU4SXV5ek1OeDRHMmpwb0NLaFJ1OXFQQ1FVTUdEZUNHMXgzL24vT2drV05RQU5zQjgyeDcKKzdlaUlaQWwwemNRUkgzMnRjakZJTHZKL1hDaWhkb2k0TWtDbkNxbHQ5L0h4anNQNTkwWnRtSGZ4QWVlcnRxNXcKKzl2YWt2cHpqUFhoa3ZvTXQvVGs9CistLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2p3cy90ZXN0L2htYWNUZXN0S2V5IGIvandzL3Rlc3QvaG1hY1Rlc3RLZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1YjhkZAotLS0gL2Rldi9udWxsCisrKyBiL2p3cy90ZXN0L2htYWNUZXN0S2V5CkBAIC0wLDAgKzEgQEAKKwMjNUsrD6W8g34GZXd7po9asyjm8FTJKKkPhLLSUC6/0/taktIGR++WirTDd2I9Ij0uIXIFLk8IwM2a9WfQgKMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qd3MvdGVzdC9zYW1wbGVfa2V5LnByaXYgYi9qd3MvdGVzdC9zYW1wbGVfa2V5LnByaXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3YWJjOQotLS0gL2Rldi9udWxsCisrKyBiL2p3cy90ZXN0L3NhbXBsZV9rZXkucHJpdgpAQCAtMCwwICsxLDI3IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlFb3dJQkFBS0NBUUVBMS95S1lyV2R5VE1HV0taMlpVclk3VDloMVZ5WkNPSlBvN2pvYkMzLzRnTFFxYjB2CitHTEozS1F4TjNJeVcrWEhCRWxHTEdTM29sNHN3bnErRXV0RlpGcXEyUmtsMk5UbjVLVHV2TnFneExqMGFEWWFlCitmRDU3NmlwNjIzclpWRzhLc2ZkdFc1a1lnYi9WbmE4M0lzYzZyYk5idXdaR1NxUkY3Qk45VkpUV1F5cmpUK3VsCitlMEZDVzA2MExiV2ZwM1dQRGZKSU9ONUF6bnVrRkhzbC96UEZTTWZyZW9iYWFZK0w0Q1FpUm1iSTBlTmduaWJQCitFajFJeUN3SGh6QUlmUjhEaHc1SllYT0dZbkI0YWRlUEQxL0ltYWhSOTNvcE8vQnlsVXhIY0lQZzRjVzBHN0tBCitHN2xaWEc3YmJRb1A4TUpNdWJzRHFuSjZPMlhaNSsyVStCU1plUUlEQVFBQkFvSUJBRjQzUDNhSG11aWxaV05PCitXZDhkb3pyNnB3YVhlZm95SG1OZ3lhSkcvcFBzZm5GTW9UcTR2dG9kRCtuaE9ncGQ0TWJJNDFCOGdqVjQ5aUNDCitsL2VXVXJKY2pWNWp0VGpLclRHYlkzY0lMMHZvUTNFYkJBOVdnbDlIWUloVk1uQnViOC9xQ3I0bUxsYUxBL2ZnCis4c0F0QUIrOVdZcGYxbEhCRHU5SUlTZkFOU2JleFZ1dzdycFNiSWtTc3ZzRHRxZ2ZRbEFaWkNtdDdiL3lUQktKCituYnIveEFxUzhQV0ZVcU8zT0pSL1MrYTk1am9SaHMzRzh1TGNiNTBrOWJXSWF5QkxFTy9sRmZLUWh5QlBGNWozCisyR3B6Vy9US3c4WVBRYUt0MHVLWndpWWVyWUlTN0hZYmwzeEJNTGt4cWNEaXNlb3JxUlRqbW9yTmd4dGFLYlJoCitpZzZWOXpFQ2dZRUE2dElRTGxXVDVYWDdGT2c0eUdLZTZZRndsMzdsTVdGVEJ1VlBDcTU2MmNiRFl6WXhSWVM4Cit4VGV4d2tpM09OY3VLS2xuV1BJYUxxL2RzOGozazcxdXc2alhFL2tMS3EvY3d1MytoV1VrV2FCT0tlalE0dFo1CitNdnpMTWRsQjBrbFpKZWpVbTFwbGljNFNxcTVFZGpFTGkyTU9LYUpYWEV2d2t0eGlkVFlDRCtzQ2dZRUE2M2VhCitycjdMU0R1TTVZaU5qYktiYzVZM1hQUWY1TGFOUkE3OTAydXVTa3pvS3VyN0VLUFVvczR6aTJLM09CUkk5dzdQCitBRU9hcmg4a2Jjd1FRczkzRWl3SVlGdTBtaWluTWdiVTFhS0lkWWNRZ2RBWC9yUnFqZTIyWUdzVjVTNkFzdkNpCis5T2s1Vk9QRWdXTWtiTUNQTjY0czZSY0t4Q29uaWxPZVZrOUZoeXNDZ1lFQW05R0lxelplVFlWY2R5TWhpdGJtCitYRXhvU2g4S054bzkzZldMM2FxcUdwaXFUc3RISnJwT0NSQk1CSC84Rk51MDVZYUQ3YUc1ZmdGMVBEZS9FV3BDCitkZE16NVN6OUcvWldwNE1Gd2I2N3dEMS9vSSs5RE1rRTQ3Q2JwUmhsZFFUM0F4RGRBN21ZWnprM2FjcjU0dlBvCitsVFhGMEJySm5aVkdyaTFQcURlT1pzRUNnWUExeGxmZUpwYVlSWGxWQmsyRm1jK2tveDY3ck1rSDI2VUJjUWNJCiszS091TmtnalhReS9iUnJubjMzb0RFQlpuMUJXazl3MGJEd01IZktjM0tpdUNXRmhGZ3RIcmtuZGx3RXdESjFZCit1TWkvUm53L21UMlJuclJpKzNIV0xUNlAyNEhxMjhmcmRNUHlIaDVIaWxQTVBtRzJ6cUZWRGowWU5hUllFK2FxCitRV3BZaHdLQmdGZmlFN2xkOVdNeW1WZFQ2NVBOSlZUZjJYUjk0ZWM5OVkvQks4UkMySHNxRkxpUklNSUtmNWN6Citxb3VxRXV0S3dYZEY1dFJTOTY4MUJ6dTR0eHd6SHVSSCtyL1kxY0loUHE0L3NsRTcyN2FhRWVkcXZnWTUxQzBtCitVOTJEQmtYeUJFdGszRzA3WHFrM1o2TktMRGJNQ254aE9ZejlYTjJpT01KUndrQmkwMHhLCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvandzL3Rlc3Qvc2FtcGxlX2tleS5wdWIgYi9qd3MvdGVzdC9zYW1wbGVfa2V5LnB1YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmY3ZmZiCi0tLSAvZGV2L251bGwKKysrIGIvandzL3Rlc3Qvc2FtcGxlX2tleS5wdWIKQEAgLTAsMCArMSw5IEBACistLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQorTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUExL3lLWXJXZHlUTUdXS1oyWlVyWQorN1Q5aDFWeVpDT0pQbzdqb2JDMy80Z0xRcWIwdkdMSjNLUXhOM0l5VytYSEJFbEdMR1Mzb2w0c3ducStFdXRGWgorRnFxMlJrbDJOVG41S1R1dk5xZ3hMajBhRFlhZWZENTc2aXA2MjNyWlZHOEtzZmR0VzVrWWdiL1ZuYTgzSXNjNgorcmJOYnV3WkdTcVJGN0JOOVZKVFdReXJqVCt1bGUwRkNXMDYwTGJXZnAzV1BEZkpJT041QXpudWtGSHNsL3pQRgorU01mcmVvYmFhWStMNENRaVJtYkkwZU5nbmliUEVqMUl5Q3dIaHpBSWZSOERodzVKWVhPR1luQjRhZGVQRDEvSQorbWFoUjkzb3BPL0J5bFV4SGNJUGc0Y1cwRzdLQUc3bFpYRzdiYlFvUDhNSk11YnNEcW5KNk8yWFo1KzJVK0JTWgorZVFJREFRQUIKKy0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvandzL3Rlc3QvdGVzdC5nbyBiL2p3cy90ZXN0L3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkNmEyMQotLS0gL2Rldi9udWxsCisrKyBiL2p3cy90ZXN0L3Rlc3QuZ28KQEAgLTAsMCArMSw1MiBAQAorLy8gK2J1aWxkIGlnbm9yZQorCitwYWNrYWdlIG1haW4KKworaW1wb3J0ICgKKwkiY3J5cHRvL3JhbmQiCisJImNyeXB0by9yc2EiCisJImNyeXB0by94NTA5IgorCSJlbmNvZGluZy9wZW0iCisJIm9zIgorKQorCitmdW5jIG1haW4oKSB7CisKKwlmMSwgZXJyIDo9IG9zLkNyZWF0ZSgic2FtcGxlX2tleS5wcml2IikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoZXJyKQorCX0KKwlmMiwgZXJyIDo9IG9zLkNyZWF0ZSgic2FtcGxlX2tleS5wdWIiKQorCWlmIGVyciAhPSBuaWwgeworCQlwYW5pYyhlcnIpCisJfQorCisJcHJpdmF0ZUtleSwgZXJyIDo9IHJzYS5HZW5lcmF0ZUtleShyYW5kLlJlYWRlciwgMjA0OCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoZXJyKQorCX0KKworCXByaXZhdGVLZXlEZXIgOj0geDUwOS5NYXJzaGFsUEtDUzFQcml2YXRlS2V5KHByaXZhdGVLZXkpCisJcHJpdmF0ZUtleUJsb2NrIDo9IHBlbS5CbG9ja3sKKwkJVHlwZTogICAgIlJTQSBQUklWQVRFIEtFWSIsCisJCUhlYWRlcnM6IG5pbCwKKwkJQnl0ZXM6ICAgcHJpdmF0ZUtleURlciwKKwl9CisJcGVtLkVuY29kZShmMSwgJnByaXZhdGVLZXlCbG9jaykKKworCXB1YmxpY0tleSA6PSBwcml2YXRlS2V5LlB1YmxpY0tleQorCXB1YmxpY0tleURlciwgZXJyIDo9IHg1MDkuTWFyc2hhbFBLSVhQdWJsaWNLZXkoJnB1YmxpY0tleSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoZXJyKQorCX0KKworCXB1YmxpY0tleUJsb2NrIDo9IHBlbS5CbG9ja3sKKwkJVHlwZTogICAgIlBVQkxJQyBLRVkiLAorCQlIZWFkZXJzOiBuaWwsCisJCUJ5dGVzOiAgIHB1YmxpY0tleURlciwKKwl9CisJcGVtLkVuY29kZShmMiwgJnB1YmxpY0tleUJsb2NrKQorCisJZjEuQ2xvc2UoKQorCWYyLkNsb3NlKCkKK30KZGlmZiAtLWdpdCBhL3N0dWJzX3Rlc3QuZ28gYi9zdHVic190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMzBjODIKLS0tIC9kZXYvbnVsbAorKysgYi9zdHVic190ZXN0LmdvCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBqb3NlCisKK2ltcG9ydCAidGVzdGluZyIKKworZnVuYyBFcnJvcih0ICp0ZXN0aW5nLlQsIHdhbnQsIGdvdCBpbnRlcmZhY2V7fSkgeworCXQuRXJyb3JmKCJXYW50ZWQ6ICVxXG5cdCBHb3Q6ICVxIiwgd2FudCwgZ290KQorfQo=