ZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jb25zdW1lLmMgYi9zdXB3aXNkb20vc3BfY29uc3VtZS5jCmluZGV4IDczN2IyNWEuLmUxYTljNDYgMTAwNjQ0Ci0tLSBhL3N1cHdpc2RvbS9zcF9jb25zdW1lLmMKKysrIGIvc3Vwd2lzZG9tL3NwX2NvbnN1bWUuYwpAQCAtMTAsNyArMTAsOCBAQAogI2luY2x1ZGUgInNwX2NvbnN1bWUuaCIKICNpbmNsdWRlICJzcF9jb21tdW5pY2F0ZS5oIgogCi1zdGF0aWMgaW50IGNvdW50ID0gMDsKK3N0YXRpYyB1aW50MzIgY291bnQgPSAwOworc3RhdGljIHVpbnQ4IG1lbnVfY250ID0gMDsKIHN0YXRpYyB1aW50MTYgc3BfY2FsY19wYXlhbXRfYnlfZmxvd3NlbnNvcihzcF9wb3NfdCogcG9zLCBzcF9jYXJkX3QqIGNhcmQpCiB7CiAgIHVpbnQzMiB1c2VkY291bnQgPSAwOwpAQCAtNTcwLDM0ICs1NzEsNDQgQEAKIAogdm9pZCBzcF9jb25maXJtX3BheW1vZGUoc3BfcG9zX3QqIHBvcywgc3BfY2FyZHdvcmtzdGF0ZV90KiBjYXJkV29ya1N0YXRlKQogewotICB1aW50OCBrZXljb2RlID0gU1BfS0VZX05PTkU7CisgIHVpbnQ4IGtleWNvZGU7CiAgIGtleWNvZGUgPSBzcF9nZXRfa2V5KCk7Ci0gIC8v1Nq/qM/7t9HU3c2jx+m/9s/CsLTIztLivPzOqr3hyvi1scewz/u30de0zKwKLSAgaWYoa2V5Y29kZSA+PSBTUF9LRVlfMCAmJiBrZXljb2RlIDw9IFNQX0tFWV9FTlRFUgotICAgICAgJiYgcG9zLT5jYXJkU3RhdGUuY3VyX3N0YXRlID09IFNUQVRFX05PTkUKLSAgICAgICYmIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPT0gQ0FSRFdPUktTVEFUVVNfUEFVU0UgJiYgcG9zLT5wYXltb2RlID09IFBBWU1PREVfQ0FSRCkKKyAgaWYoa2V5Y29kZSAhPSBTUF9LRVlfTk9ORSkKICAgewotICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19TVE9QUElORzsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy/P+7fRxKPKvbP1yry7r9e0zKzPwrC0yLfIz7z80aHU8bb+zqzC68/7t9EKLSAgaWYoKGtleWNvZGUgPT0gU1BfS0VZX0VOVEVSKSAmJiAocG9zLT5wYXltb2RlID09IFBBWU1PREVfSU5JVCkpCi0gIHsKLSAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKLSAgICBwb3MtPnBheW1vZGUgPSBQQVlNT0RFX1FSQ09ERTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy+2/s6swuvEo8q9z8KwtMihz/u8/M6qzaPWubmk1/cKLSAgaWYoKHBvcy0+cGF5bW9kZSA9PSBQQVlNT0RFX1FSQ09ERSkgJiYgKGtleWNvZGUgPT0gU1BfS0VZX0NMRUFSKSkKLSAgewotICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19TVE9QUElORzsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy+wtDC8/L34yOvJ6LG4stnX973nw+YKLSAgaWYoa2V5Y29kZSA9PSBTUF9LRVlfMCAmJiAocG9zLT5wYXltb2RlID09IFBBWU1PREVfSU5JVCkpCi0gIHsKLSAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfU0VUX0RFVjsKLSAgICByZXR1cm47CisgICAgLy+wtDC8/L34yOvJ6LG4stnX973nw+YKKyAgICBpZigoa2V5Y29kZSA9PSBTUF9LRVlfMCkgJiYgKHBvcy0+cGF5bW9kZSA9PSBQQVlNT0RFX0lOSVQpKQorICAgIHsKKyAgICAgIG1lbnVfY250Kys7CisgICAgICBpZihtZW51X2NudCA+IDYpCisgICAgICB7CisgICAgICAgIG1lbnVfY250ID0gMDsKKyAgICAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1NFVF9ERVY7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1lbnVfY250ID0gMDsKKworICAgIC8v1Nq/qM/7t9HU3c2jx+m/9s/CsLTIztLivPzOqr3hyvi1scewz/u30de0zKwKKyAgICBpZigocG9zLT5jYXJkU3RhdGUuY3VyX3N0YXRlID09IFNUQVRFX05PTkUpCisgICAgICAgICYmIChjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID09IENBUkRXT1JLU1RBVFVTX1BBVVNFKQorICAgICAgICAmJiAocG9zLT5wYXltb2RlID09IFBBWU1PREVfQ0FSRCkpCisgICAgeworICAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1NUT1BQSU5HOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvL8/7t9HEo8q9s/XKvLuv17TMrM/CsLTIt8jPvPzRodTxtv7OrMLrz/u30QorICAgIGlmKChrZXljb2RlID09IFNQX0tFWV9FTlRFUikgJiYgKHBvcy0+cGF5bW9kZSA9PSBQQVlNT0RFX0lOSVQpKQorICAgIHsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19OT05FOworICAgICAgcG9zLT5wYXltb2RlID0gUEFZTU9ERV9RUkNPREU7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vtv7OrMLrxKPKvc/CsLTIoc/7vPzOqs2j1rm5pNf3CisgICAgaWYoKGtleWNvZGUgPT0gU1BfS0VZX0NMRUFSKSAmJiAocG9zLT5wYXltb2RlID09IFBBWU1PREVfUVJDT0RFKSkKKyAgICB7CisgICAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfU1RPUFBJTkc7CisgICAgICByZXR1cm47CisgICAgfQogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9mbGFzaC5jIGIvc3Vwd2lzZG9tL3NwX2ZsYXNoLmMKaW5kZXggMDc4OGFlZC4uMDMyZjdiNiAxMDA2NDQKLS0tIGEvc3Vwd2lzZG9tL3NwX2ZsYXNoLmMKKysrIGIvc3Vwd2lzZG9tL3NwX2ZsYXNoLmMKQEAgLTMyLDM1ICszMiwyNiBAQAogKiovCiB1aW50MTYgc3BfZmxhc2hfcGFnZV9yZWFkKHVpbnQzMiBhZGRyLHVpbnQ4IGJ1ZltdLHVpbnQzMiBsZW4pCiB7Ci0gIHVpbnQzMiBpOwotICB1aW50MzIgb2Zmc2V0ID0gMDsKLSAgdWludDggdGVtcFsxMjhdOworICB1aW50MzIgb2Zmc2V0OworICB1aW50OCB0ZW1wWzI1Nl07CiAKICAgaWYobGVuID4gc2l6ZW9mKHRlbXApKQogICB7CisgICAgbWVtc2V0KGJ1ZiwwLGxlbik7CiAgICAgcmV0dXJuIDE7CiAgIH0KLQorICAKKyAgb2Zmc2V0ID0gMDsKICAgd2hpbGUoMSkKICAgewotICAgIGkgPSAwOworICAgIG1lbXNldCh0ZW1wLDAsc2l6ZW9mIHRlbXApOwogICAgIHNwX2ZsYXNoX3JlYWQoYWRkciArb2Zmc2V0LHRlbXAsIGxlbik7Ci0gICAgd2hpbGUoaSA8IGxlbikKLSAgICB7Ci0gICAgICBpZigweEZGID09IHRlbXBbaV0pCi0gICAgICB7Ci0gICAgICAgICsraTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmKGxlbiA9PSBpKQorICAgIGlmKDAgPT0gaXNGRih0ZW1wLCh1aW50MTYpbGVuKSkKICAgICB7CiAgICAgICBpZigwID09IG9mZnNldCkKICAgICAgIHsKICAgICAgICAgLy/O3sr9vt0KKyAgICAgICAgbWVtc2V0KGJ1ZiwwLGxlbik7CiAgICAgICAgIHJldHVybiAxOwogICAgICAgfQogICAgICAgZWxzZQpAQCAtNzAsOSArNjEsMTEgQEAKICAgICAgIH0KICAgICB9CiAgICAgb2Zmc2V0ICs9IGxlbjsKLSAgICBpZihERUZfRkxBU0hfUGFnZVNpemUgPCAob2Zmc2V0ICtsZW4pKSAvLyAgs6y5/bWx0rPOtNXStb23tbvYMQorICAgIC8qKtK70rO41brD0LTN6rvys6y5/bWxx7DSsyDLtcP30rvSs7jVusPTw83qKiovCisgICAgaWYoREVGX0ZMQVNIX1BhZ2VTaXplIDwgKG9mZnNldCArbGVuKSkKICAgICB7Ci0gICAgICByZXR1cm4gMTsKKyAgICAgIG1lbWNweShidWYsdGVtcCxsZW4pOworICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CiB9CkBAIC04NCw0MCArNzcsMzAgQEAKICoqLwogdWludDE2IHNwX2ZsYXNoX3BhZ2Vfd3JpdGUodWludDMyIGFkZHIsdWludDggYnVmW10sdWludDMyIGxlbikKIHsKLSAgdWludDMyIGk7Ci0gIHVpbnQzMiBvZmZzZXQgPSAwOwotICB1aW50OCB0ZW1wWzY0XTsKKyAgdWludDMyIG9mZnNldDsKKyAgdWludDggdGVtcFsyNTZdOwogCi0gIGlmKGxlbiA+IDY0KQorICBpZihsZW4gPiBzaXplb2YodGVtcCkpCiAgIHsKICAgICByZXR1cm4gMTsKICAgfQorICAKKyAgb2Zmc2V0ID0gMDsKICAgd2hpbGUoMSkKICAgewotICAgIGkgPSAwOworICAgIG1lbXNldCh0ZW1wLDAsc2l6ZW9mIHRlbXApOwogICAgIHNwX2ZsYXNoX3JlYWQoYWRkciArb2Zmc2V0LHRlbXAsIGxlbik7Ci0gICAgd2hpbGUoaSA8IGxlbikKKyAgICBpZigwID09IGlzRkYodGVtcCwodWludDE2KWxlbikpCiAgICAgewotICAgICAgaWYoMHhGRiA9PSB0ZW1wW2ldKQotICAgICAgewotICAgICAgICArK2k7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQorICAgICAgcmV0dXJuIHNwX2ZsYXNoX3dyaXRlKGFkZHIgK29mZnNldCxidWYsIGxlbik7CiAgICAgfQorICAgIG9mZnNldCArPSBsZW47CiAgICAgaWYoREVGX0ZMQVNIX1BhZ2VTaXplIDwgKG9mZnNldCArbGVuKSkgLy8gILOsuf21sdKzse3KvtLR0LTC+iyywbP91tjQtAogICAgIHsKICAgICAgIHNwX2ZsYXNoX2VyYXNlKGFkZHIpOwogICAgICAgcmV0dXJuIHNwX2ZsYXNoX3dyaXRlKGFkZHIsYnVmLCBsZW4pOwogICAgIH0KLSAgICBpZihsZW4gPT0gaSkKLSAgICB7Ci0gICAgICAvL87eyv2+3QotICAgICAgcmV0dXJuIHNwX2ZsYXNoX3dyaXRlKGFkZHIgK29mZnNldCxidWYsIGxlbik7Ci0gICAgfQotICAgIG9mZnNldCArPSBsZW47CiAgIH0KIH0KIAorCmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfbWVudS5jIGIvc3Vwd2lzZG9tL3NwX21lbnUuYwppbmRleCA0NDQ3ZDUyLi4yODRkNDNkIDEwMDY0NAotLS0gYS9zdXB3aXNkb20vc3BfbWVudS5jCisrKyBiL3N1cHdpc2RvbS9zcF9tZW51LmMKQEAgLTI0LDcgKzI0LDcgQEAKICAgdWludDggbWF4X2NudCA9IDA7CiAgIHVpbnQ4IG9mZnNldCA9IDA7CiAgIHVpbnQ4IHVuY29uZmlybV90cmFuc251bTsKLSAgY2hhciBzeXNwYXJhWzldWzE3XTsKKyAgY2hhciBzeXNwYXJhWzEwXVsxN107CiAKICAgTUVNQ0xFQVIoc3lzcGFyYSwgc2l6ZW9mKHN5c3BhcmEpKTsKICAgc3ByaW50ZihzeXNwYXJhW29mZnNldCsrXSwgIsnosbjXtMysOiIpOwpAQCAtNjcsMTAgKzY3LDE1IEBACiAgICAgdW5jb25maXJtX3RyYW5zbnVtID0gMDsKICAgfQogICBzcHJpbnRmKHN5c3BhcmFbb2Zmc2V0KytdLCAiJWSxyiIsIHVuY29uZmlybV90cmFuc251bSk7CisKKyAgc3ByaW50ZihzeXNwYXJhW29mZnNldCsrXSwiwvaz5bWlzru8xsr9Iik7CisgIHNwcmludGYoc3lzcGFyYVtvZmZzZXQrK10sIiVkICi0zi8xMDBtbCkiLAorICAgICAgICAgICgodWludDMyKXBvcy0+c3lzY29uZi5mbG93c2Vuc29yX3VuaXQpKjEpOworCiAgIHNwcmludGYoc3lzcGFyYVtvZmZzZXQrK10sICLP+7fRwODQzToiKTsKICAgc3ByaW50ZihzeXNwYXJhW29mZnNldCsrXSwgIrzH1cvP+7fRIik7CiAKLSAgbWF4X2NudCA9IHNpemVvZihzeXNwYXJhKS9zaXplb2Yoc3lzcGFyYVswXSkvMjsKKyAgbWF4X2NudCA9IChzaXplb2Yoc3lzcGFyYSkvc2l6ZW9mKHN5c3BhcmFbMF0pIC0xKS8yICsxOwogICBvZmZzZXQgPSAwOwogICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CiAgIHdoaWxlKHNwX2dldF90aWNrZXIoKS10aWNrZXIgPD0gREVMQVlfVElNRTYwcykKQEAgLTExNSw3ICsxMjAsNyBAQAogICB9CiB9CiAKLXN0YXRpYyB1aW50OCBzcF9saW5rX3Rlc3Qoc3BfcG9zX3QqIHBvcykKK3N0YXRpYyB2b2lkIHRlc3RfbGluayhzcF9wb3NfdCogcG9zKQogewogICB1aW50OCByZXQ7CiAgIHNwX3Byb3RvY29sX3JlcXVlc3RfdCByZXE7CkBAIC0xMzcsMTcgKzE0MiwxNiBAQAogICAgICAgaWYoc3BfY2hlY2tfdGltZV92YWxpZChyZXNwLmRhdGEgKzIpKQogICAgICAgewogICAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCAiwbTCt7zssuKzybmmIiwiyrHW07K7us+3qCIsIERFTEFZX1RJTUUzcyk7Ci0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICAgIHNwX3NldF9iY2R0aW1lKHJlc3AuZGF0YSArMik7CiAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCAiwbTCt7zssuKzybmmIiwi0tHNrLK9yrHW0yIsIERFTEFZX1RJTUUzcyk7Ci0gICAgICByZXR1cm4gcmV0OworICAgICAgcmV0dXJuOwogICAgIH0KICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCAiwbTCt7zssuLKp7DcIiwiytW1vbTtzvOw/CIsIERFTEFZX1RJTUUzcyk7Ci0gICAgcmV0dXJuIDE7CisgICAgcmV0dXJuOwogICB9CiAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsICLBtMK3vOyy4sqnsNwiLCLH67zssuLP38K3IiwgREVMQVlfVElNRTNzKTsKLSAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgc2hvd19rZXlib2FyZF90ZXN0KHNwX3Bvc190KiBwb3MsIHVpbnQ4IG9mZnNldCkKQEAgLTE1OCw3ICsxNjIsMTQgQEAKICAgZGlzcF9oaW50X2luZm9fdGhyZWUocG9zLCAivPzFzNLAtM7K5MjrIiwiMDEyMzQ1Njc4OUMiLHRlbXAsMCk7CiB9CiAKLXN0YXRpYyB1aW50OCBzcF9rZXlib2FyZF90ZXN0KHNwX3Bvc190KiBwb3MpCitzdGF0aWMgdm9pZCBkb19rZXlib2FyZF9jYWxpYnJhdGUoc3BfcG9zX3QqIHBvcykKK3sKKyAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywi0KPR6bz8xcwiLCLH68nUtcguLi4iLDApOworICBzcF9rZXlfY2FsaWJyYXRlKCk7CisgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsICK8/MXM0KPR6c3qs8kiLCLH67zssuIiLERFTEFZX1RJTUUzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2tleWJvYXJkX3Rlc3Qoc3BfcG9zX3QqIHBvcykKIHsKICAgdWludDgga2NvZGU7CiAgIHVpbnQzMiB0aWNrOwpAQCAtMjUyLDcgKzI2Myw3IEBACiAgICAgICAgIGlmKG9mZnNldCA9PSAwKQogICAgICAgICB7CiAgICAgICAgICAgZGlzcF9oaW50X2luZm8ocG9zLCAiyKHP+7C0vPy87LLiIixERUxBWV9USU1FMnMpOwotICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZihrZXlidWZbb2Zmc2V0XSA9PSBTUF9LRVlfQ0xFQVIpCiAgICAgICAgIHsKQEAgLTI2NCw3ICsyNzUsNyBAQAogICAgICAgICBpZihrZXlidWZbb2Zmc2V0XSA9PSBTUF9LRVlfRU5URVIpCiAgICAgICAgIHsKICAgICAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCAivPzFzLzssuLV/ci3IiwivPzFzNCj17zV/bOjIixERUxBWV9USU1FM3MpOwotICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6CkBAIC0yNzIsMTQgKzI4Myw2IEBACiAgICAgICB9CiAgICAgfQogICB9Ci0gIHJldHVybiAxOwotCi19Ci0KLXN0YXRpYyB2b2lkIHNwX2ZhY3RvcnlfY2hlY2soc3BfcG9zX3QqIHBvcykKLXsKLSAgc3BfbGlua190ZXN0KHBvcyk7Ci0gIHNwX2tleWJvYXJkX3Rlc3QocG9zKTsKIH0KIAogc3RhdGljIHZvaWQgc3Bfc2V0X2RldnRpbWUoc3BfcG9zX3QqIHBvcykKQEAgLTU4Miw3ICs1ODUsNTUgQEAKICAgfQogfQogCi12b2lkIHNwX21lbnVfb3B0aW9ucyhzcF9wb3NfdCogcG9zKQorc3RhdGljIHZvaWQgdGVzdF92YWx2ZV9vbihzcF9wb3NfdCogcG9zKQoreworICBzcF92YWx2ZV9vbigpOworICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCK3p8PFv6rG9NbQIiwix+vIt8jPIixERUxBWV9USU1FMnMpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3ZhbHZlX29mZihzcF9wb3NfdCogcG9zKQoreworICBzcF92YWx2ZV9vZmYoKTsKKyAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywit6fDxdLRudix1SIsIsfryLfIzyIsREVMQVlfVElNRTNzKTsKK30KK3N0YXRpYyB2b2lkIHRlc3RfZmxvd3NlbnNvcihzcF9wb3NfdCogcG9zKQoreworICB1aW50MzIgdGlja2VyOworICB1aW50OCBrY29kZTsKKyAgdWludDMyIGNvdW50OworICB1aW50MzIgdGVtcDsKKyAgY2hhciBtc2dbMzJdOworCisgIHNwX2Zsb3dzZW5zb3JfY291bnRfY2xlYXIoKTsKKyAgc3BfdmFsdmVfb24oKTsKKyAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywiwffBv7LiytTW0CIsIsfryLfIzyIsMCk7CisgIGNvdW50ID0gMDsKKyAgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOworICB3aGlsZShzcF9nZXRfdGlja2VyKCkgLXRpY2tlciA8IERFTEFZX1RJTUU2MHMpCisgIHsKKyAgICBzcF92YWx2ZV9jb250cm9sKCk7CisgICAga2NvZGUgPSBzcF9nZXRfa2V5KCk7CisgICAgaWYoa2NvZGUgIT0gU1BfS0VZX05PTkUpCisgICAgeworICAgICAgaWYoa2NvZGUgPT0gU1BfS0VZX0NMRUFSKQorICAgICAgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CisgICAgfQorICAgIHRlbXAgPSBzcF9mbG93c2Vuc29yX2dldF9jb3VudCgpOworICAgIGlmKHRlbXAgIT0gY291bnQpCisgICAgeworICAgICAgY291bnQgPSB0ZW1wOworICAgICAgc3ByaW50Zihtc2csIsH3wb+8xsr9OiVkIixjb3VudCk7CisgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLB98G/suLK1NbQIixtc2csREVMQVlfVElNRTEwMG1zKTsKKyAgICB9CisgIH0KKyAgc3ByaW50Zihtc2csIsH3wb+8xsr9OiVkIixzcF9mbG93c2Vuc29yX2dldF9jb3VudCgpKTsKKyAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywiwffBv7LiytS94cr4Iixtc2csREVMQVlfVElNRTNzKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9mYWN0b3J5X29wdGlvbnMoc3BfcG9zX3QqIHBvcykKIHsKICAgdWludDMyIHRpY2tlciA9IDA7CiAgIHVpbnQ4IGtleWNvZGU7CkBAIC01OTIsMTcgKzY0MywxNCBAQAogCiAgIG1lbnVfdCBtZW51c1tdID0KICAgewotICAgIHsiMS6y6b+0ss7K/SIsIHNwX3Nob3dfc3lzcGFyYX0sCi0gICAgeyIyLrmks6ey4srUIiwgc3BfZmFjdG9yeV9jaGVja30sCi0gICAgeyIzLsno1sPKsbzkIiwgc3Bfc2V0X2RldnRpbWV9LAotICAgIHsiNC7K1ravtcfCvCIsIHNwX21hbnVhbF9sb2dpbn0sCi0gICAgeyI1Lsno1sPO78DtaWQiLCBzcF9zZXRfZGV2cGh5aWR9LAotICAgIHsiNi7J6NbDu/q6xSIsIHNwX3NldF9kZXZpY2Vub30sCi0gICAgeyI3Lsflv9XB98uuIiwgY2xlYXJfdHJhbnNkdGx9LAotICAgIHsiOC7U2s/fyf28tiIsIG1hbnVhbF91cGdyYWRlfSwKLSAgICB7Ijkuu9a4tLP2s6ciLCByZXNldF9mYWN0b3J5fQorICAgIHsiMS6wtLz80KPXvCIsIGRvX2tleWJvYXJkX2NhbGlicmF0ZX0sCisgICAgeyIyLrC0vPyy4srUIiwgZG9fa2V5Ym9hcmRfdGVzdH0sCisgICAgeyIzLr+qxvS3p8PFIiwgdGVzdF92YWx2ZV9vbn0sCisgICAgeyI0LrnYsdW3p8PFIiwgdGVzdF92YWx2ZV9vZmZ9LAorICAgIHsiNS7B98G/suLK1CIsIHRlc3RfZmxvd3NlbnNvcn0sCisgICAgeyI2Ls2o0bay4srUIiwgdGVzdF9saW5rfQogICB9OwotICBtYXhfY250ID0gc2l6ZW9mKG1lbnVzKS9zaXplb2YobWVudV90KS8zOworICBtYXhfY250ID0gKHNpemVvZihtZW51cykvc2l6ZW9mKG1lbnVfdCkgLTEpLzMgKyAxOwogICBwYWdlID0gMDsKICAgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOwogICB3aGlsZShzcF9nZXRfdGlja2VyKCktdGlja2VyIDw9IERFTEFZX1RJTUU2MHMqNSkKQEAgLTY1MywzICs3MDEsNzcgQEAKICAgICB9CiAgIH0KIH0KKwordm9pZCBzcF9tZW51X29wdGlvbnMoc3BfcG9zX3QqIHBvcykKK3sKKyAgdWludDMyIHRpY2tlciA9IDA7CisgIHVpbnQ4IGtleWNvZGU7CisgIHVpbnQ4IHBhZ2U7CisgIHVpbnQ4IG1heF9jbnQ7CisgIHVpbnQ4IGtleV9wcmVzcyA9IDE7CisKKyAgbWVudV90IG1lbnVzW10gPQorICB7CisgICAgeyIxLrLpv7Syzsr9Iiwgc3Bfc2hvd19zeXNwYXJhfSwKKyAgICB7IjIuuaSzp7LiytQiLCB0ZXN0X2ZhY3Rvcnlfb3B0aW9uc30sCisgICAgeyIzLsno1sPKsbzkIiwgc3Bfc2V0X2RldnRpbWV9LAorICAgIHsiNC7K1ravtcfCvCIsIHNwX21hbnVhbF9sb2dpbn0sCisgICAgeyI1Lsno1sPO78DtaWQiLCBzcF9zZXRfZGV2cGh5aWR9LAorICAgIHsiNi7J6NbDu/q6xSIsIHNwX3NldF9kZXZpY2Vub30sCisgICAgeyI3Lsflv9XB98uuIiwgY2xlYXJfdHJhbnNkdGx9LAorICAgIHsiOC7U2s/fyf28tiIsIG1hbnVhbF91cGdyYWRlfSwKKyAgICB7Ijkuu9a4tLP2s6ciLCByZXNldF9mYWN0b3J5fQorICB9OworICBtYXhfY250ID0gKHNpemVvZihtZW51cykvc2l6ZW9mKG1lbnVfdCkgLTEpLzMgKyAxOworICBwYWdlID0gMDsKKyAgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOworICB3aGlsZShzcF9nZXRfdGlja2VyKCktdGlja2VyIDw9IERFTEFZX1RJTUU2MHMqNSkKKyAgeworICAgIHNwX2ZlZWRfZG9nKCk7CisgICAga2V5Y29kZSA9IHNwX2dldF9rZXkoKTsKKyAgICBpZihrZXljb2RlICE9IFNQX0tFWV9OT05FKQorICAgIHsKKyAgICAgIGtleV9wcmVzcyA9IDE7CisgICAgICBzd2l0Y2goa2V5Y29kZSkKKyAgICAgIHsKKyAgICAgIGNhc2UgU1BfS0VZXzA6CisgICAgICAgIGlmKHBhZ2UgPCAobWF4X2NudC0xKSkKKyAgICAgICAgeworICAgICAgICAgIHBhZ2UrKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1BfS0VZXzE6CisgICAgICBjYXNlIFNQX0tFWV8yOgorICAgICAgY2FzZSBTUF9LRVlfMzoKKyAgICAgIGNhc2UgU1BfS0VZXzQ6CisgICAgICBjYXNlIFNQX0tFWV81OgorICAgICAgY2FzZSBTUF9LRVlfNjoKKyAgICAgIGNhc2UgU1BfS0VZXzc6CisgICAgICBjYXNlIFNQX0tFWV84OgorICAgICAgY2FzZSBTUF9LRVlfOToKKyAgICAgICAgaWYobWVudXNba2V5Y29kZS1TUF9LRVlfMV0uZnVuYyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgbWVudXNba2V5Y29kZS1TUF9LRVlfMV0uZnVuYyhwb3MpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfQ0xFQVI6CisgICAgICAgIGlmKHBhZ2UgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwYWdlLS07CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmKGtleV9wcmVzcykKKyAgICB7CisgICAgICBkaXNwX2hpbnRfaW5mb190aHJlZShwb3MsIG1lbnVzW3BhZ2UqM10uaGl0LCBtZW51c1twYWdlKjMrMV0uaGl0LCBtZW51c1twYWdlKjMrMl0uaGl0LCAwKTsKKyAgICAgIGtleV9wcmVzcyA9IDA7CisgICAgICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CisgICAgfQorICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX21lbnUuaCBiL3N1cHdpc2RvbS9zcF9tZW51LmgKaW5kZXggNzVmOGYzMi4uZjc4MGNkMyAxMDA2NDQKLS0tIGEvc3Vwd2lzZG9tL3NwX21lbnUuaAorKysgYi9zdXB3aXNkb20vc3BfbWVudS5oCkBAIC0xLDQgKzEsNCBAQAotI2lmZGVmIF9TUF9NRU5VX0hfCisjaWZuZGVmIF9TUF9NRU5VX0hfCiAjZGVmaW5lIF9TUF9NRU5VX0hfCiAKICNpbmNsdWRlICJzcF9jb25maWcuaCIK