ZGlmZiAtLWdpdCBhL3NhbXBsZXMvcGRmaXVtX3Rlc3QuY2MgYi9zYW1wbGVzL3BkZml1bV90ZXN0LmNjCmluZGV4IDRmNmU4MzIuLjEwNTE1OTQgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvcGRmaXVtX3Rlc3QuY2MKKysrIGIvc2FtcGxlcy9wZGZpdW1fdGVzdC5jYwpAQCAtMjYyLDggKzI2Miw4IEBACiB9CiAjZW5kaWYKIAotaW50IEZvcm1fQWxlcnQoSVBERl9KU1BMQVRGT1JNKiwgRlBERl9XSURFU1RSSU5HIG1zZywgRlBERl9XSURFU1RSSU5HLAotICAgICAgICAgICAgICAgaW50LCBpbnQpIHsKK2ludCBFeGFtcGxlQXBwQWxlcnQoSVBERl9KU1BMQVRGT1JNKiwgRlBERl9XSURFU1RSSU5HIG1zZywgRlBERl9XSURFU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICBpbnQsIGludCkgewogICAvLyBEZWFsIHdpdGggZGlmZmVyZW5jZXMgYmV0d2VlbiBVVEYxNkxFIGFuZCB3Y2hhcl90IG9uIHRoaXMgcGxhdGZvcm0uCiAgIHNpemVfdCBjaGFyYWN0ZXJzID0gMDsKICAgd2hpbGUgKG1zZ1tjaGFyYWN0ZXJzXSkgewpAQCAtMjgwLDcgKzI4MCwxMSBAQAogICByZXR1cm4gMDsKIH0KIAotdm9pZCBVbnN1cHBvcnRlZF9IYW5kbGVyKFVOU1VQUE9SVF9JTkZPKiwgaW50IHR5cGUpIHsKK3ZvaWQgRXhhbXBsZURvY0dvdG9QYWdlKElQREZfSlNQTEFURk9STSosIGludCBwYWdlTnVtYmVyKSB7CisgIHByaW50ZigiR290byBQYWdlOiAlZFxuIiwgcGFnZU51bWJlcik7Cit9CisKK3ZvaWQgRXhhbXBsZVVuc3VwcG9ydGVkSGFuZGxlcihVTlNVUFBPUlRfSU5GTyosIGludCB0eXBlKSB7CiAgIHN0ZDo6c3RyaW5nIGZlYXR1cmUgPSAiVW5rbm93biI7CiAgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgRlBERl9VTlNQX0RPQ19YRkFGT1JNOgpAQCAtNDI1LDcgKzQyOSw4IEBACiAgIElQREZfSlNQTEFURk9STSBwbGF0Zm9ybV9jYWxsYmFja3M7CiAgIG1lbXNldCgmcGxhdGZvcm1fY2FsbGJhY2tzLCAnXDAnLCBzaXplb2YocGxhdGZvcm1fY2FsbGJhY2tzKSk7CiAgIHBsYXRmb3JtX2NhbGxiYWNrcy52ZXJzaW9uID0gMTsKLSAgcGxhdGZvcm1fY2FsbGJhY2tzLmFwcF9hbGVydCA9IEZvcm1fQWxlcnQ7CisgIHBsYXRmb3JtX2NhbGxiYWNrcy5hcHBfYWxlcnQgPSBFeGFtcGxlQXBwQWxlcnQ7CisgIHBsYXRmb3JtX2NhbGxiYWNrcy5Eb2NfZ290b1BhZ2UgPSBFeGFtcGxlRG9jR290b1BhZ2U7CiAKICAgRlBERl9GT1JNRklMTElORk8gZm9ybV9jYWxsYmFja3M7CiAgIG1lbXNldCgmZm9ybV9jYWxsYmFja3MsICdcMCcsIHNpemVvZihmb3JtX2NhbGxiYWNrcykpOwpAQCAtNDY4LDcgKzQ3Myw3IEBACiAKICAgRlBERl9GT1JNSEFORExFIGZvcm0gPSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50KGRvYywgJmZvcm1fY2FsbGJhY2tzKTsKICAgaWYgKCFGUERGX0xvYWRYRkEoZG9jKSkgewotICAgIHByaW50ZigiTG9hZFhGQSB1bnN1Y2Nlc3NmdWwsIGNvbnRpbnVpbmcgYW55d2F5LlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICJMb2FkWEZBIHVuc3VjY2Vzc2Z1bCwgY29udGludWluZyBhbnl3YXkuXG4iKTsKICAgfQogICBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yKGZvcm0sIDAsIDB4RkZFNEREKTsKICAgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRBbHBoYShmb3JtLCAxMDApOwpAQCAtNTk1LDcgKzYwMCw3IEBACiAgIFVOU1VQUE9SVF9JTkZPIHVuc3VwcG9yZWRfaW5mbzsKICAgbWVtc2V0KCZ1bnN1cHBvcmVkX2luZm8sICdcMCcsIHNpemVvZih1bnN1cHBvcmVkX2luZm8pKTsKICAgdW5zdXBwb3JlZF9pbmZvLnZlcnNpb24gPSAxOwotICB1bnN1cHBvcmVkX2luZm8uRlNES19VblN1cHBvcnRfSGFuZGxlciA9IFVuc3VwcG9ydGVkX0hhbmRsZXI7CisgIHVuc3VwcG9yZWRfaW5mby5GU0RLX1VuU3VwcG9ydF9IYW5kbGVyID0gRXhhbXBsZVVuc3VwcG9ydGVkSGFuZGxlcjsKIAogICBGU0RLX1NldFVuU3BPYmpQcm9jZXNzSGFuZGxlcigmdW5zdXBwb3JlZF9pbmZvKTsKIApkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcHBfYWxlcnQucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcHBfYWxlcnQucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTE5OTJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYXBwX2FsZXJ0LnBkZgorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSVQREYtMS43Ci0loPKk9AotMSAwIG9iaiA8PAotICAvVHlwZSAvQ2F0YWxvZwotICAvUGFnZXMgMiAwIFIKLSAgL09wZW5BY3Rpb24gMTAgMCBSCi0+PgotZW5kb2JqCi0yIDAgb2JqIDw8Ci0gIC9UeXBlIC9QYWdlcwotICAvQ291bnQgMQotICAvS2lkcyBbCi0gICAgMyAwIFIKLSAgXQotPj4KLWVuZG9iagotJSBQYWdlIG51bWJlciAwLgotMyAwIG9iaiA8PAotICAvVHlwZSAvUGFnZQotICAvUGFyZW50IDIgMCBSCi0gIC9SZXNvdXJjZXMgPDwKLSAgICAvRm9udCA8PC9GMSAxNSAwIFI+PgotICA+PgotICAvQ29udGVudHMgWzIxIDAgUl0KLSAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KLT4+Ci0lIE9wZW5BY3Rpb24gYWN0aW9uCi0xMCAwIG9iaiA8PAotICAvVHlwZSAvQWN0aW9uCi0gIC9TIC9KYXZhU2NyaXB0Ci0gIC9KUyAxMSAwIFIKLT4+Ci1lbmRvYmoKLSUgSlMgcHJvZ3JhbSB0byBleGV4dXRlCi0xMSAwIG9iaiA8PAotPj4KLXN0cmVhbQotYXBwLmFsZXJ0KCJUaGlzIHRlc3QgcGFzc2VzIGlmIGFsZXJ0KCkgbG9ncyBvdXRwdXQgdW5kZXIgdGhlIHRlc3QgdXRpbHRpeS4iKTsKLWVuZHN0cmVhbQotZW5kb2JqCi14cmVmCi0wIDEyCi0wMDAwMDAwMDAwIDY1NTM1IGYgCi0wMDAwMDAwMDE1IDAwMDAwIG4gCi0wMDAwMDAwMDg5IDAwMDAwIG4gCi0wMDAwMDAwMTc3IDAwMDAwIG4gCi0wMDAwMDAwMDAwIDY1NTM1IGYgCi0wMDAwMDAwMDAwIDY1NTM1IGYgCi0wMDAwMDAwMDAwIDY1NTM1IGYgCi0wMDAwMDAwMDAwIDY1NTM1IGYgCi0wMDAwMDAwMDAwIDY1NTM1IGYgCi0wMDAwMDAwMDAwIDY1NTM1IGYgCi0wMDAwMDAwMzM0IDAwMDAwIG4gCi0wMDAwMDAwNDI2IDAwMDAwIG4gCi10cmFpbGVyIDw8Ci0gIC9Sb290IDEgMCBSCi0+Pgotc3RhcnR4cmVmCi01NDMKLSUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2NvbnN0cy5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2NvbnN0cy5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDM2ZTUuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9jb25zdHMucGRmCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotJVBERi0xLjcKLSWg8qT0Ci0xIDAgb2JqIDw8Ci0gIC9UeXBlIC9DYXRhbG9nCi0gIC9QYWdlcyAyIDAgUgotICAvT3BlbkFjdGlvbiAxMCAwIFIKLT4+Ci1lbmRvYmoKLTIgMCBvYmogPDwKLSAgL1R5cGUgL1BhZ2VzCi0gIC9Db3VudCAxCi0gIC9LaWRzIFsKLSAgICAzIDAgUgotICBdCi0+PgotZW5kb2JqCi0lIFBhZ2UgbnVtYmVyIDAuCi0zIDAgb2JqIDw8Ci0gIC9UeXBlIC9QYWdlCi0gIC9QYXJlbnQgMiAwIFIKLSAgL1Jlc291cmNlcyA8PAotICAgIC9Gb250IDw8L0YxIDE1IDAgUj4+Ci0gID4+Ci0gIC9Db250ZW50cyBbMjEgMCBSXQotICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQotPj4KLSUgT3BlbkFjdGlvbiBhY3Rpb24KLTEwIDAgb2JqIDw8Ci0gIC9UeXBlIC9BY3Rpb24KLSAgL1MgL0phdmFTY3JpcHQKLSAgL0pTIDExIDAgUgotPj4KLWVuZG9iagotJSBKUyBwcm9ncmFtIHRvIGV4ZXh1dGUKLTExIDAgb2JqIDw8Ci0+Pgotc3RyZWFtCi0KLWZ1bmN0aW9uIGRvVGVzdChuYW1lLCBwcm9wcykgewotICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgKytpKSB7Ci0gICAgdmFyIGV4cHIgPSBuYW1lICsgIi4iICsgcHJvcHNbaV07Ci0gICAgYXBwLmFsZXJ0KGV4cHIgKyAiIGlzICIgKyBldmFsKGV4cHIpKTsKLSAgfQotfQotCi10cnkgewotICBkb1Rlc3QoImJvcmRlciIsIFsicyIsICJiIiwgImQiLCAiaSIsICJ1IiwgIm5vbmVzdWNoIl0pOwotICBkb1Rlc3QoImRpc3BsYXkiLCBbInZpc2libGUiLCAiaGlkZGVuIiwgIm5vUHJpbnQiLCAibm9WaWV3IiwgIm5vbmVzdWNoIl0pOwotICBkb1Rlc3QoImZvbnQiLCBbIlRpbWVzIiwgIlRpbWVzQiIsICJUaW1lc0kiLCAiVGltZXNCSSIsICJIZWx2IiwgIkhlbHZCIiwKLSAgICAgICAgICAgICAgICAgICJIZWx2SSIsICJIZWx2QkkiLCAiQ291ciIsICJDb3VyQiIsICJDb3VySSIsICJDb3VyQkkiLAotICAgICAgICAgICAgICAgICAgIlN5bWJvbCIsICJaYXBmRCIsICJOb25lc3VjaCJdKTsKLQotICBkb1Rlc3QoImhpZ2hsaWdodCIsIFsibiIsICJpIiwgInAiLCAibyIsICJub25lc3VjaCJdKTsKLSAgZG9UZXN0KCJwb3NpdGlvbiIsIFsidGV4dE9ubHkiLCAiaWNvbk9ubHkiLCAiaWNvblRleHRWIiwgInRleHRJY29uViIsCi0gICAgICAgICAgICAgICAgICAgICAgImljb25UZXh0SCIsICJ0ZXh0SWNvbkgiLCAib3ZlcmxheSIsICJub25lc3VjaCJdKTsKLQotICBkb1Rlc3QoInNjYWxlSG93IiwgWyJwcm9wb3J0aW9uYWwiLCAiYW5hbW9ycGhpYyIsICJub25lc3VjaCJdKTsKLSAgZG9UZXN0KCJzY2FsZVdoZW4iLCBbImFsd2F5cyIsICJuZXZlciIsICJ0b29CaWciLCAidG9vU21hbGwiLCAibm9uZXN1Y2giXSk7Ci0gIGRvVGVzdCgic3R5bGUiLCBbImNoIiwgImNyIiwgImRpIiwgImNpIiwgInN0IiwgInNxIiwgIm5vbmVzdWNoIl0pOwotICBkb1Rlc3QoInpvb210eXBlIiwgWyJub25lIiwgImZpdFAiLCAiZml0VyIsICJmaXRIIiwgImZpdFYiLCAicHJlZiIsICJyZWZXIiwKLSAgICAgICAgICAgICAgICAgICAgICAibm9uZXN1Y2giXSk7Ci19IGNhdGNoIChlKSB7Ci0gIGFwcC5hbGVydCgiRVJST1I6ICIgKyBlLnRvU3RyaW5nKCkpOwotfQotZW5kc3RyZWFtCi1lbmRvYmoKLXhyZWYKLTAgMTIKLTAwMDAwMDAwMDAgNjU1MzUgZiAKLTAwMDAwMDAwMTUgMDAwMDAgbiAKLTAwMDAwMDAwODkgMDAwMDAgbiAKLTAwMDAwMDAxNzcgMDAwMDAgbiAKLTAwMDAwMDAwMDAgNjU1MzUgZiAKLTAwMDAwMDAwMDAgNjU1MzUgZiAKLTAwMDAwMDAwMDAgNjU1MzUgZiAKLTAwMDAwMDAwMDAgNjU1MzUgZiAKLTAwMDAwMDAwMDAgNjU1MzUgZiAKLTAwMDAwMDAwMDAgNjU1MzUgZiAKLTAwMDAwMDAzMzQgMDAwMDAgbiAKLTAwMDAwMDA0MjYgMDAwMDAgbiAKLXRyYWlsZXIgPDwKLSAgL1Jvb3QgMSAwIFIKLT4+Ci1zdGFydHhyZWYKLTE1NTUKLSUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2RvY3VtZW50X3Byb3BzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9kb2N1bWVudF9wcm9wcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWI3ZTNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9kb2N1bWVudF9wcm9wcy5pbgpAQCAtMCwwICsxLDE0MyBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCisgIC9PcGVuQWN0aW9uIDEwIDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9Db3VudCA0CisgIC9LaWRzIFsKKyAgICAzIDAgUgorICAgIDQgMCBSCisgICAgNSAwIFIKKyAgICA2IDAgUgorICBdCis+PgorZW5kb2JqCislIFBhZ2UgbnVtYmVyIDAuCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PC9GMSAxNSAwIFI+PgorICA+PgorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorPj4KKyUgUGFnZSBudW1iZXIgMS4KK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8L0YxIDE1IDAgUj4+CisgID4+CisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCis+PgorJSBQYWdlIG51bWJlciAyLgore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwvRjEgMTUgMCBSPj4KKyAgPj4KKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKz4+CislIFBhZ2UgbnVtYmVyIDMuCit7e29iamVjdCA2IDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PC9GMSAxNSAwIFI+PgorICA+PgorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorPj4KKworJSBJbmZvCit7e29iamVjdCA5IDB9fSA8PAorICAvQXV0aG9yIChKb2UgUmFuZG9tIEF1dGhvcikKKyAgL0NyZWF0b3IgKEpvZSBSYW5kb20gQ3JlYXRvcikKKz4+CitlbmRvYmoKKyUgT3BlbkFjdGlvbiBhY3Rpb24KK3t7b2JqZWN0IDEwIDB9fSA8PAorICAvVHlwZSAvQWN0aW9uCisgIC9TIC9KYXZhU2NyaXB0CisgIC9KUyAxMSAwIFIKKz4+CitlbmRvYmoKKyUgSlMgcHJvZ3JhbSB0byBleGV4dXRlCit7e29iamVjdCAxMSAwfX0gPDwKKz4+CitzdHJlYW0KK3ZhciBkb2N1bWVudF9wcm9wcyA9IFsKKyAgJ0FEQkUnLAorICAnYXV0aG9yJywKKyAgJ2Jhc2VVUkwnLAorICAnYm9va21hcmtSb290JywKKyAgJ2NhbGN1bGF0ZScsCisgICdDb2xsYWInLAorICAnY3JlYXRpb25EYXRlJywKKyAgJ2NyZWF0b3InLAorICAnZGVsYXknLAorICAnZGlydHknLAorICAnZG9jdW1lbnRGaWxlTmFtZScsCisgICdleHRlcm5hbCcsCisgICdmaWxlc2l6ZScsCisgICdpY29ucycsCisgICdpbmZvJywKKyAgJ2tleXdvcmRzJywKKyAgJ2xheW91dCcsCisgICdtZWRpYScsCisgICdtb2REYXRlJywKKyAgJ21vdXNlWCcsCisgICdtb3VzZVknLAorICAnbnVtRmllbGRzJywKKyAgJ251bVBhZ2VzJywKKyAgJ3BhZ2VOdW0nLAorICAncGFnZVdpbmRvd1JlY3QnLAorICAncGF0aCcsCisgICdwcm9kdWNlcicsCisgICdzdWJqZWN0JywKKyAgJ3RpdGxlJywKKyAgJ3pvb20nLAorICAnem9vbVR5cGUnLAorXTsKKworZnVuY3Rpb24gdGVzdEdldFByb3BzKHByb3BzKSB7CisgIHRyeSB7CisgICAgYXBwLmFsZXJ0KCcqKiogR2V0dGluZyBwcm9wZXJ0aWVzICoqKicpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgdmFyIGV4cHIxID0gInRoaXMuIiArIHByb3BzW2ldOworICAgICAgICB2YXIgZXhwcjIgPSAidHlwZW9mICIgKyBleHByMTsKKyAgICAgICAgYXBwLmFsZXJ0KGV4cHIxICsgIiBpcyAiICsgZXZhbChleHByMikgKyAnICcgKyBldmFsKGV4cHIxKSk7CisgICAgfQorICB9IGNhdGNoIChlKSB7CisgICAgYXBwLmFsZXJ0KCJFUlJPUjogIiArIGUudG9TdHJpbmcoKSk7CisgIH0KK30KKworZnVuY3Rpb24gdGVzdFNldFByb3BzKHByb3BzKSB7CisgIHRyeSB7CisgICAgYXBwLmFsZXJ0KCcqKiogU2V0dGluZyBwcm9wZXJ0aWVzICoqKicpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgdmFyIGV4cHIxID0gInRoaXMuIiArIHByb3BzW2ldICsgJyA9IDM7JworICAgICAgICBhcHAuYWxlcnQoZXhwcjEgKyAiIHlpZWxkcyAiICsgZXZhbChleHByMSkpOworICAgIH0KKyAgfSBjYXRjaCAoZSkgeworICAgIGFwcC5hbGVydCgiRVJST1I6ICIgKyBlLnRvU3RyaW5nKCkpOworICB9Cit9CisKK3Rlc3RHZXRQcm9wcyhkb2N1bWVudF9wcm9wcyk7Cit0ZXN0U2V0UHJvcHMoZG9jdW1lbnRfcHJvcHMpOwordGVzdEdldFByb3BzKGRvY3VtZW50X3Byb3BzKTsKK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorICAvSW5mbyA5IDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2RvY3VtZW50X3Byb3BzX2V4cGVjdGVkLnR4dCBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvZG9jdW1lbnRfcHJvcHNfZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmVhOTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2RvY3VtZW50X3Byb3BzX2V4cGVjdGVkLnR4dApAQCAtMCwwICsxLDk3IEBACitBbGVydDogKioqIEdldHRpbmcgcHJvcGVydGllcyAqKioKK0FsZXJ0OiB0aGlzLkFEQkUgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMuYXV0aG9yIGlzIHN0cmluZyBKb2UgUmFuZG9tIEF1dGhvcgorQWxlcnQ6IHRoaXMuYmFzZVVSTCBpcyBzdHJpbmcgCitBbGVydDogdGhpcy5ib29rbWFya1Jvb3QgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMuY2FsY3VsYXRlIGlzIGJvb2xlYW4gdHJ1ZQorQWxlcnQ6IHRoaXMuQ29sbGFiIGlzIHVuZGVmaW5lZCB1bmRlZmluZWQKK0FsZXJ0OiB0aGlzLmNyZWF0aW9uRGF0ZSBpcyBzdHJpbmcgCitBbGVydDogdGhpcy5jcmVhdG9yIGlzIHN0cmluZyBKb2UgUmFuZG9tIENyZWF0b3IKK0FsZXJ0OiB0aGlzLmRlbGF5IGlzIG51bWJlciAwCitBbGVydDogdGhpcy5kaXJ0eSBpcyBib29sZWFuIGZhbHNlCitBbGVydDogdGhpcy5kb2N1bWVudEZpbGVOYW1lIGlzIHN0cmluZyAKK0FsZXJ0OiB0aGlzLmV4dGVybmFsIGlzIG51bWJlciAxCitBbGVydDogdGhpcy5maWxlc2l6ZSBpcyBudW1iZXIgMAorQWxlcnQ6IHRoaXMuaWNvbnMgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMuaW5mbyBpcyBvYmplY3QgW29iamVjdCBPYmplY3RdCitBbGVydDogdGhpcy5rZXl3b3JkcyBpcyBzdHJpbmcgCitBbGVydDogdGhpcy5sYXlvdXQgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMubWVkaWEgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMubW9kRGF0ZSBpcyBzdHJpbmcgCitBbGVydDogdGhpcy5tb3VzZVggaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMubW91c2VZIGlzIHVuZGVmaW5lZCB1bmRlZmluZWQKK0FsZXJ0OiB0aGlzLm51bUZpZWxkcyBpcyBudW1iZXIgMAorQWxlcnQ6IHRoaXMubnVtUGFnZXMgaXMgbnVtYmVyIDQKK0FsZXJ0OiB0aGlzLnBhZ2VOdW0gaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMucGFnZVdpbmRvd1JlY3QgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMucGF0aCBpcyBzdHJpbmcgLworQWxlcnQ6IHRoaXMucHJvZHVjZXIgaXMgc3RyaW5nIAorQWxlcnQ6IHRoaXMuc3ViamVjdCBpcyBzdHJpbmcgCitBbGVydDogdGhpcy50aXRsZSBpcyBzdHJpbmcgCitBbGVydDogdGhpcy56b29tIGlzIHVuZGVmaW5lZCB1bmRlZmluZWQKK0FsZXJ0OiB0aGlzLnpvb21UeXBlIGlzIHVuZGVmaW5lZCB1bmRlZmluZWQKK0FsZXJ0OiAqKiogU2V0dGluZyBwcm9wZXJ0aWVzICoqKgorQWxlcnQ6IHRoaXMuQURCRSA9IDM7IHlpZWxkcyAzCitBbGVydDogdGhpcy5hdXRob3IgPSAzOyB5aWVsZHMgMworQWxlcnQ6IHRoaXMuYmFzZVVSTCA9IDM7IHlpZWxkcyAzCitBbGVydDogdGhpcy5ib29rbWFya1Jvb3QgPSAzOyB5aWVsZHMgMworQWxlcnQ6IHRoaXMuY2FsY3VsYXRlID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLkNvbGxhYiA9IDM7IHlpZWxkcyAzCitBbGVydDogdGhpcy5jcmVhdGlvbkRhdGUgPSAzOyB5aWVsZHMgMworQWxlcnQ6IHRoaXMuY3JlYXRvciA9IDM7IHlpZWxkcyAzCitBbGVydDogdGhpcy5kZWxheSA9IDM7IHlpZWxkcyAzCitBbGVydDogdGhpcy5kaXJ0eSA9IDM7IHlpZWxkcyAzCitBbGVydDogdGhpcy5kb2N1bWVudEZpbGVOYW1lID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLmV4dGVybmFsID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLmZpbGVzaXplID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLmljb25zID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLmluZm8gPSAzOyB5aWVsZHMgMworQWxlcnQ6IHRoaXMua2V5d29yZHMgPSAzOyB5aWVsZHMgMworQWxlcnQ6IHRoaXMubGF5b3V0ID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLm1lZGlhID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLm1vZERhdGUgPSAzOyB5aWVsZHMgMworQWxlcnQ6IHRoaXMubW91c2VYID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLm1vdXNlWSA9IDM7IHlpZWxkcyAzCitBbGVydDogdGhpcy5udW1GaWVsZHMgPSAzOyB5aWVsZHMgMworQWxlcnQ6IHRoaXMubnVtUGFnZXMgPSAzOyB5aWVsZHMgMworR290byBQYWdlOiAzCitBbGVydDogdGhpcy5wYWdlTnVtID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLnBhZ2VXaW5kb3dSZWN0ID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLnBhdGggPSAzOyB5aWVsZHMgMworQWxlcnQ6IHRoaXMucHJvZHVjZXIgPSAzOyB5aWVsZHMgMworQWxlcnQ6IHRoaXMuc3ViamVjdCA9IDM7IHlpZWxkcyAzCitBbGVydDogdGhpcy50aXRsZSA9IDM7IHlpZWxkcyAzCitBbGVydDogdGhpcy56b29tID0gMzsgeWllbGRzIDMKK0FsZXJ0OiB0aGlzLnpvb21UeXBlID0gMzsgeWllbGRzIDMKK0FsZXJ0OiAqKiogR2V0dGluZyBwcm9wZXJ0aWVzICoqKgorQWxlcnQ6IHRoaXMuQURCRSBpcyB1bmRlZmluZWQgdW5kZWZpbmVkCitBbGVydDogdGhpcy5hdXRob3IgaXMgc3RyaW5nIDMKK0FsZXJ0OiB0aGlzLmJhc2VVUkwgaXMgc3RyaW5nIDMKK0FsZXJ0OiB0aGlzLmJvb2ttYXJrUm9vdCBpcyB1bmRlZmluZWQgdW5kZWZpbmVkCitBbGVydDogdGhpcy5jYWxjdWxhdGUgaXMgYm9vbGVhbiB0cnVlCitBbGVydDogdGhpcy5Db2xsYWIgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMuY3JlYXRpb25EYXRlIGlzIHN0cmluZyAzCitBbGVydDogdGhpcy5jcmVhdG9yIGlzIHN0cmluZyAzCitBbGVydDogdGhpcy5kZWxheSBpcyBudW1iZXIgMQorQWxlcnQ6IHRoaXMuZGlydHkgaXMgYm9vbGVhbiB0cnVlCitBbGVydDogdGhpcy5kb2N1bWVudEZpbGVOYW1lIGlzIHN0cmluZyAKK0FsZXJ0OiB0aGlzLmV4dGVybmFsIGlzIG51bWJlciAxCitBbGVydDogdGhpcy5maWxlc2l6ZSBpcyBudW1iZXIgMAorQWxlcnQ6IHRoaXMuaWNvbnMgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMuaW5mbyBpcyBvYmplY3QgW29iamVjdCBPYmplY3RdCitBbGVydDogdGhpcy5rZXl3b3JkcyBpcyBzdHJpbmcgMworQWxlcnQ6IHRoaXMubGF5b3V0IGlzIHVuZGVmaW5lZCB1bmRlZmluZWQKK0FsZXJ0OiB0aGlzLm1lZGlhIGlzIHVuZGVmaW5lZCB1bmRlZmluZWQKK0FsZXJ0OiB0aGlzLm1vZERhdGUgaXMgc3RyaW5nIDMKK0FsZXJ0OiB0aGlzLm1vdXNlWCBpcyB1bmRlZmluZWQgdW5kZWZpbmVkCitBbGVydDogdGhpcy5tb3VzZVkgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMubnVtRmllbGRzIGlzIG51bWJlciAwCitBbGVydDogdGhpcy5udW1QYWdlcyBpcyBudW1iZXIgNAorQWxlcnQ6IHRoaXMucGFnZU51bSBpcyB1bmRlZmluZWQgdW5kZWZpbmVkCitBbGVydDogdGhpcy5wYWdlV2luZG93UmVjdCBpcyB1bmRlZmluZWQgdW5kZWZpbmVkCitBbGVydDogdGhpcy5wYXRoIGlzIHN0cmluZyAvCitBbGVydDogdGhpcy5wcm9kdWNlciBpcyBzdHJpbmcgMworQWxlcnQ6IHRoaXMuc3ViamVjdCBpcyBzdHJpbmcgMworQWxlcnQ6IHRoaXMudGl0bGUgaXMgc3RyaW5nIDMKK0FsZXJ0OiB0aGlzLnpvb20gaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAorQWxlcnQ6IHRoaXMuem9vbVR5cGUgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZApkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvZm9udF9zaXplX2V4cGVjdGVkLnBkZi4wLnBwbSBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2ZvbnRfc2l6ZV9leHBlY3RlZC5wZGYuMC5wcG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzM2IzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2ZvbnRfc2l6ZV9leHBlY3RlZC5wZGYuMC5wcG0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy90b29scy9maXh1cF9wZGZfdGVtcGxhdGUucHkgYi90ZXN0aW5nL3Rvb2xzL2ZpeHVwX3BkZl90ZW1wbGF0ZS5weQppbmRleCA4Nzk5NmE0Li5hNDNkYjU1IDEwMDc1NQotLS0gYS90ZXN0aW5nL3Rvb2xzL2ZpeHVwX3BkZl90ZW1wbGF0ZS5weQorKysgYi90ZXN0aW5nL3Rvb2xzL2ZpeHVwX3BkZl90ZW1wbGF0ZS5weQpAQCAtNzAsMjIgKzcwLDMyIEBACiAgICAgc2VsZi5vZmZzZXQgKz0gbGVuKGxpbmUpCiAgICAgcmV0dXJuIGxpbmUKIAotZGVmIGV4cGFuZF9maWxlKGlucHV0X2ZpbGVuYW1lKToKLSAgKGlucHV0X3Jvb3QsIGV4dGVuc2lvbikgPSBvcy5wYXRoLnNwbGl0ZXh0KGlucHV0X2ZpbGVuYW1lKQotICBvdXRwdXRfZmlsZW5hbWUgPSBpbnB1dF9yb290ICsgJy5wZGYnCisKK2RlZiBleHBhbmRfZmlsZShpbnB1dF9wYXRoLCBvdXRwdXRfcGF0aCk6CiAgIHByb2Nlc3NvciA9IFRlbXBsYXRlUHJvY2Vzc29yKCkKICAgdHJ5OgotICAgIHdpdGggb3BlbihpbnB1dF9maWxlbmFtZSwgJ3InKSBhcyBpbmZpbGU6Ci0gICAgICB3aXRoIG9wZW4ob3V0cHV0X2ZpbGVuYW1lLCAndycpIGFzIG91dGZpbGU6CisgICAgd2l0aCBvcGVuKGlucHV0X3BhdGgsICdyJykgYXMgaW5maWxlOgorICAgICAgd2l0aCBvcGVuKG91dHB1dF9wYXRoLCAndycpIGFzIG91dGZpbGU6CiAgICAgICAgIGZvciBsaW5lIGluIGluZmlsZToKICAgICAgICAgICAgb3V0ZmlsZS53cml0ZShwcm9jZXNzb3IucHJvY2Vzc19saW5lKGxpbmUpKQogICBleGNlcHQgSU9FcnJvcjoKLSAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnZmFpbGVkIHRvIHByb2Nlc3MgJXMnICUgaW5wdXRfZmlsZW5hbWUKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnZmFpbGVkIHRvIHByb2Nlc3MgJXMnICUgaW5wdXRfcGF0aAorCiAKIGRlZiBtYWluKCk6Ci0gIGZvciBhcmcgaW4gc3lzLmFyZ3ZbMTpdOgotICAgIGV4cGFuZF9maWxlKGFyZykKKyAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKCkKKyAgcGFyc2VyLmFkZF9vcHRpb24oJy0tb3V0cHV0LWRpcicsIGRlZmF1bHQ9JycpCisgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgIGZvciB0ZXN0Y2FzZV9wYXRoIGluIGFyZ3M6CisgICAgdGVzdGNhc2VfZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHRlc3RjYXNlX3BhdGgpCisgICAgdGVzdGNhc2Vfcm9vdCwgXyA9IG9zLnBhdGguc3BsaXRleHQodGVzdGNhc2VfZmlsZW5hbWUpCisgICAgb3V0cHV0X2RpciA9IG9zLnBhdGguZGlybmFtZSh0ZXN0Y2FzZV9wYXRoKQorICAgIGlmIG9wdGlvbnMub3V0cHV0X2RpcjoKKyAgICAgIG91dHB1dF9kaXIgPSBvcHRpb25zLm91dHB1dF9kaXIKKyAgICBvdXRwdXRfcGF0aCA9IG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCB0ZXN0Y2FzZV9yb290ICsgJy5wZGYnKQorICAgIGV4cGFuZF9maWxlKHRlc3RjYXNlX3BhdGgsIG91dHB1dF9wYXRoKQogICByZXR1cm4gMAogCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdG9vbHMvcnVuX2phdmFzY3JpcHRfdGVzdHMucHkgYi90ZXN0aW5nL3Rvb2xzL3J1bl9qYXZhc2NyaXB0X3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzNjFlYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Rvb2xzL3J1bl9qYXZhc2NyaXB0X3Rlc3RzLnB5CkBAIC0wLDAgKzEsOTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgMjAxNSBUaGUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKKworIyBOb21lbmNsYXR1cmU6CisjICAgeF9yb290IC0gIngiCisjICAgeF9maWxlbmFtZSAtICJ4LmV4dCIKKyMgICB4X3BhdGggLSAicGF0aC90by9hL2IvYy94LmV4dCIKKyMgICBjX2RpciAtICJwYXRoL3RvL2EvYi9jIgorCitkZWYgZ2VuZXJhdGVfYW5kX3Rlc3QoaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIsIHdvcmtpbmdfZGlyLAorICAgICAgICAgICAgICAgICAgICAgIGZpeHVwX3BhdGgsIHBkZml1bV90ZXN0X3BhdGgpOgorICBpbnB1dF9yb290LCBfID0gb3MucGF0aC5zcGxpdGV4dChpbnB1dF9maWxlbmFtZSkKKyAgaW5wdXRfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBpbnB1dF9yb290ICsgJy5pbicpCisgIHBkZl9wYXRoID0gb3MucGF0aC5qb2luKHdvcmtpbmdfZGlyLCBpbnB1dF9yb290ICsgJy5wZGYnKQorICB0eHRfcGF0aCA9IG9zLnBhdGguam9pbih3b3JraW5nX2RpciwgaW5wdXRfcm9vdCArICcudHh0JykKKyAgZXhwZWN0ZWRfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBpbnB1dF9yb290ICsgJ19leHBlY3RlZC50eHQnKQorICB0cnk6CisgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAorICAgICAgICBbZml4dXBfcGF0aCwgJy0tb3V0cHV0LWRpcj0nICsgd29ya2luZ19kaXIsIGlucHV0X3BhdGhdKQorICAgIHdpdGggb3Blbih0eHRfcGF0aCwgJ3cnKSBhcyBvdXRmaWxlOgorICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtwZGZpdW1fdGVzdF9wYXRoLCBwZGZfcGF0aF0sIHN0ZG91dD1vdXRmaWxlKQorICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbJ2RpZmYnLCBleHBlY3RlZF9wYXRoLCB0eHRfcGF0aF0pCisgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgorICAgIHByaW50ICJGQUlMVVJFOiAiICsgaW5wdXRfZmlsZW5hbWUgKyAiOyAiICsgc3RyKGUpCisKK2RlZiBtYWluKCk6CisgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigpCisgIHBhcnNlci5hZGRfb3B0aW9uKCctLWJ1aWxkLWRpcicsIGRlZmF1bHQ9b3MucGF0aC5qb2luKCdvdXQnLCAnRGVidWcnKSwKKyAgICAgICAgICAgICAgICAgICAgaGVscD0ncmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBiYXNlIHNvdXJjZSBkaXJlY3RvcnknKQorICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICMgRXhwZWN0IHxteV9kaXJ8IHRvIGJlIC4uLi9wZGZpdW0vdGVzdGluZy90b29scy4KKyAgbXlfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKQorICB0ZXN0aW5nX2RpciA9IG9zLnBhdGguZGlybmFtZShteV9kaXIpCisgIHBkZml1bV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUodGVzdGluZ19kaXIpCisgIGlmIChvcy5wYXRoLmJhc2VuYW1lKG15X2RpcikgIT0gJ3Rvb2xzJyBvcgorICAgICAgb3MucGF0aC5iYXNlbmFtZSh0ZXN0aW5nX2RpcikgIT0gJ3Rlc3RpbmcnKToKKyAgICBwcmludCAnQ29uZnVzZWQsIGNhbiBub3QgZmluZCBwZGZpdW0gcm9vdCBkaXJlY3RvcnksIGFib3J0aW5nLicKKyAgICByZXR1cm4gMQorCisgICMgT3RoZXIgc2NyaXB0cyBhcmUgZm91bmQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgb25lLgorICBmaXh1cF9wYXRoID0gb3MucGF0aC5qb2luKG15X2RpciwgJ2ZpeHVwX3BkZl90ZW1wbGF0ZS5weScpCisKKyAgIyB0ZXN0IGZpbGVzIGFyZSBpbiAuLi4vcGRmaXVtL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQuCisgIHNvdXJjZV9kaXIgPSBvcy5wYXRoLmpvaW4odGVzdGluZ19kaXIsICdyZXNvdXJjZXMnLCAnamF2YXNjcmlwdCcpCisKKyAgIyBGaW5kIHBhdGggdG8gYnVpbGQgZGlyZWN0b3J5LiAgVGhpcyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhpcyBpcyBhCisgICMgc3RhbmRhbG9uZSBidWlsZCB2cy4gYSBidWlsZCBhcyBwYXJ0IG9mIGEgY2hyb21pdW0gY2hlY2tvdXQuIEZvcgorICAjIHN0YW5kYWxvbmUsIHdlIGV4cGVjdCBhIHBhdGggbGlrZSAuLi4vcGRmaXVtL291dC9EZWJ1ZywgYnV0IGZvcgorICAjIGNocm9taXVtLCB3ZSBleHBlY3QgYSBwYXRoIGxpa2UgLi4uL3NyYy9vdXQvRGVidWcgdHdvIGxldmVscworICAjIGhpZ2hlciAodG8gc2tpcCBvdmVyIHRoZSB0aGlyZF9wYXJ0eS9wZGZpdW0gcGF0aCBjb21wb25lbnQgdW5kZXIKKyAgIyB3aGljaCBjaHJvbWl1bSBzdGlja3MgcGRmaXVtKS4KKyAgYmFzZV9kaXIgPSBwZGZpdW1fZGlyCisgIG9uZV91cF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoYmFzZV9kaXIpCisgIHR3b191cF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob25lX3VwX2RpcikKKyAgaWYgKG9zLnBhdGguYmFzZW5hbWUodHdvX3VwX2RpcikgPT0gJ3NyYycgYW5kCisgICAgICBvcy5wYXRoLmJhc2VuYW1lKG9uZV91cF9kaXIpID09ICd0aGlyZF9wYXJ0eScpOgorICAgIGJhc2VfZGlyID0gdHdvX3VwX2RpcgorICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4oYmFzZV9kaXIsIG9wdGlvbnMuYnVpbGRfZGlyKQorCisgICMgQ29tcGlsZWQgYmluYXJpZXMgYXJlIGZvdW5kIHVuZGVyIHRoZSBidWlsZCBwYXRoLgorICBwZGZpdW1fdGVzdF9wYXRoID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgJ3BkZml1bV90ZXN0JykKKyAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgorICAgIHBkZml1bV90ZXN0X3BhdGggPSBwZGZpdW1fdGVzdF9wYXRoICsgJy5leGUnCisgICMgVE9ETyh0c2VwZXopOiBNYWMgbWF5IHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBoZXJlLgorCisgICMgUGxhY2UgZ2VuZXJhdGVkIGZpbGVzIHVuZGVyIHRoZSBidWlsZCBkaXJlY3RvcnksIG5vdCBzb3VyY2UgZGlyZWN0b3J5LgorICBnZW5fZGlyID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgJ2dlbicsICdwZGZpdW0nKQorICB3b3JraW5nX2RpciA9IG9zLnBhdGguam9pbihnZW5fZGlyLCAndGVzdGluZycsICdqYXZhc2NyaXB0JykKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHdvcmtpbmdfZGlyKToKKyAgICBvcy5tYWtlZGlycyh3b3JraW5nX2RpcikKKworICBpbnB1dF9maWxlX3JlID0gcmUuY29tcGlsZSgnXlthLXpBLVowLTlfLl0rWy5daW4kJykKKyAgZm9yIGlucHV0X2ZpbGVuYW1lIGluIG9zLmxpc3RkaXIoc291cmNlX2Rpcik6CisgICAgaWYgaW5wdXRfZmlsZV9yZS5tYXRjaChpbnB1dF9maWxlbmFtZSk6CisgICAgICBpbnB1dF9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIGlucHV0X2ZpbGVuYW1lKQorICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoaW5wdXRfcGF0aCk6CisgICAgICAgIGdlbmVyYXRlX2FuZF90ZXN0KGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLCB3b3JraW5nX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZml4dXBfcGF0aCwgcGRmaXVtX3Rlc3RfcGF0aCkKKyAgcmV0dXJuIDAKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL3J1bl9waXhlbF90ZXN0cy5weSBiL3Rlc3RpbmcvdG9vbHMvcnVuX3BpeGVsX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3ZWE3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Rvb2xzL3J1bl9waXhlbF90ZXN0cy5weQpAQCAtMCwwICsxLDk5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IDIwMTUgVGhlIFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCisKKyMgTm9tZW5jbGF0dXJlOgorIyAgIHhfcm9vdCAtICJ4IgorIyAgIHhfZmlsZW5hbWUgLSAieC5leHQiCisjICAgeF9wYXRoIC0gInBhdGgvdG8vYS9iL2MveC5leHQiCisjICAgY19kaXIgLSAicGF0aC90by9hL2IvYyIKKworZGVmIGdlbmVyYXRlX2FuZF90ZXN0KGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLCB3b3JraW5nX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICBmaXh1cF9wYXRoLCBwZGZpdW1fdGVzdF9wYXRoKToKKyAgaW5wdXRfcm9vdCwgXyA9IG9zLnBhdGguc3BsaXRleHQoaW5wdXRfZmlsZW5hbWUpCisgIGlucHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgaW5wdXRfcm9vdCArICcuaW4nKQorICBwZGZfcGF0aCA9IG9zLnBhdGguam9pbih3b3JraW5nX2RpciwgaW5wdXRfcm9vdCArICcucGRmJykKKyAgYWN0dWFsX3BhdGhfdGVtcGxhdGUgPSBvcy5wYXRoLmpvaW4od29ya2luZ19kaXIsIGlucHV0X3Jvb3QgKyAnLnBkZi4lZC5wcG0nKQorICBleHBlY3RlZF9wYXRoX3RlbXBsYXRlID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfcm9vdCArICdfZXhwZWN0ZWQucGRmLiVkLnBwbScpCisgIHRyeToKKyAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCisgICAgICAgIFtmaXh1cF9wYXRoLCAnLS1vdXRwdXQtZGlyPScgKyB3b3JraW5nX2RpciwgaW5wdXRfcGF0aF0pCisgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtwZGZpdW1fdGVzdF9wYXRoLCAnLS1wcG0nLCBwZGZfcGF0aF0pCisgICAgaSA9IDA7CisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIGV4cGVjdGVkX3BhdGggPSBleHBlY3RlZF9wYXRoX3RlbXBsYXRlICUgaTsKKyAgICAgIGFjdHVhbF9wYXRoID0gYWN0dWFsX3BhdGhfdGVtcGxhdGUgJSBpOworICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGV4cGVjdGVkX3BhdGgpOgorICAgICAgICBicmVhaworICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFsnZGlmZicsIGV4cGVjdGVkX3BhdGgsIGFjdHVhbF9wYXRoXSkKKyAgICAgIGkgKz0gMQorICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZToKKyAgICBwcmludCAiRkFJTFVSRTogIiArIGlucHV0X2ZpbGVuYW1lICsgIjsgIiArIHN0cihlKQorCitkZWYgbWFpbigpOgorICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoKQorICBwYXJzZXIuYWRkX29wdGlvbignLS1idWlsZC1kaXInLCBkZWZhdWx0PW9zLnBhdGguam9pbignb3V0JywgJ0RlYnVnJyksCisgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlbGF0aXZlIHBhdGggZnJvbSB0aGUgYmFzZSBzb3VyY2UgZGlyZWN0b3J5JykKKyAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAjIEV4cGVjdCB8bXlfZGlyfCB0byBiZSAuLi4vcGRmaXVtL3Rlc3RpbmcvdG9vbHMuCisgIG15X2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkKKyAgdGVzdGluZ19kaXIgPSBvcy5wYXRoLmRpcm5hbWUobXlfZGlyKQorICBwZGZpdW1fZGlyID0gb3MucGF0aC5kaXJuYW1lKHRlc3RpbmdfZGlyKQorICBpZiAob3MucGF0aC5iYXNlbmFtZShteV9kaXIpICE9ICd0b29scycgb3IKKyAgICAgIG9zLnBhdGguYmFzZW5hbWUodGVzdGluZ19kaXIpICE9ICd0ZXN0aW5nJyk6CisgICAgcHJpbnQgJ0NvbmZ1c2VkLCBjYW4gbm90IGZpbmQgcGRmaXVtIHJvb3QgZGlyZWN0b3J5LCBhYm9ydGluZy4nCisgICAgcmV0dXJuIDEKKworICAjIE90aGVyIHNjcmlwdHMgYXJlIGZvdW5kIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGlzIG9uZS4KKyAgZml4dXBfcGF0aCA9IG9zLnBhdGguam9pbihteV9kaXIsICdmaXh1cF9wZGZfdGVtcGxhdGUucHknKQorCisgICMgdGVzdCBmaWxlcyBhcmUgaW4gLi4uL3BkZml1bS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC4KKyAgc291cmNlX2RpciA9IG9zLnBhdGguam9pbih0ZXN0aW5nX2RpciwgJ3Jlc291cmNlcycsICdwaXhlbCcpCisKKyAgIyBGaW5kIHBhdGggdG8gYnVpbGQgZGlyZWN0b3J5LiAgVGhpcyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhpcyBpcyBhCisgICMgc3RhbmRhbG9uZSBidWlsZCB2cy4gYSBidWlsZCBhcyBwYXJ0IG9mIGEgY2hyb21pdW0gY2hlY2tvdXQuIEZvcgorICAjIHN0YW5kYWxvbmUsIHdlIGV4cGVjdCBhIHBhdGggbGlrZSAuLi4vcGRmaXVtL291dC9EZWJ1ZywgYnV0IGZvcgorICAjIGNocm9taXVtLCB3ZSBleHBlY3QgYSBwYXRoIGxpa2UgLi4uL3NyYy9vdXQvRGVidWcgdHdvIGxldmVscworICAjIGhpZ2hlciAodG8gc2tpcCBvdmVyIHRoZSB0aGlyZF9wYXJ0eS9wZGZpdW0gcGF0aCBjb21wb25lbnQgdW5kZXIKKyAgIyB3aGljaCBjaHJvbWl1bSBzdGlja3MgcGRmaXVtKS4KKyAgYmFzZV9kaXIgPSBwZGZpdW1fZGlyCisgIG9uZV91cF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoYmFzZV9kaXIpCisgIHR3b191cF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob25lX3VwX2RpcikKKyAgaWYgKG9zLnBhdGguYmFzZW5hbWUodHdvX3VwX2RpcikgPT0gJ3NyYycgYW5kCisgICAgICBvcy5wYXRoLmJhc2VuYW1lKG9uZV91cF9kaXIpID09ICd0aGlyZF9wYXJ0eScpOgorICAgIGJhc2VfZGlyID0gdHdvX3VwX2RpcgorICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4oYmFzZV9kaXIsIG9wdGlvbnMuYnVpbGRfZGlyKQorCisgICMgQ29tcGlsZWQgYmluYXJpZXMgYXJlIGZvdW5kIHVuZGVyIHRoZSBidWlsZCBwYXRoLgorICBwZGZpdW1fdGVzdF9wYXRoID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgJ3BkZml1bV90ZXN0JykKKyAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgorICAgIHBkZml1bV90ZXN0X3BhdGggPSBwZGZpdW1fdGVzdF9wYXRoICsgJy5leGUnCisgICMgVE9ETyh0c2VwZXopOiBNYWMgbWF5IHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBoZXJlLgorCisgICMgUGxhY2UgZ2VuZXJhdGVkIGZpbGVzIHVuZGVyIHRoZSBidWlsZCBkaXJlY3RvcnksIG5vdCBzb3VyY2UgZGlyZWN0b3J5LgorICBnZW5fZGlyID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgJ2dlbicsICdwZGZpdW0nKQorICB3b3JraW5nX2RpciA9IG9zLnBhdGguam9pbihnZW5fZGlyLCAndGVzdGluZycsICdwaXhlbCcpCisgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh3b3JraW5nX2Rpcik6CisgICAgb3MubWFrZWRpcnMod29ya2luZ19kaXIpCisKKyAgaW5wdXRfZmlsZV9yZSA9IHJlLmNvbXBpbGUoJ15bYS16QS1aMC05Xy5dK1suXWluJCcpCisgIGZvciBpbnB1dF9maWxlbmFtZSBpbiBvcy5saXN0ZGlyKHNvdXJjZV9kaXIpOgorICAgIGlmIGlucHV0X2ZpbGVfcmUubWF0Y2goaW5wdXRfZmlsZW5hbWUpOgorICAgICAgaW5wdXRfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBpbnB1dF9maWxlbmFtZSkKKyAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGlucHV0X3BhdGgpOgorICAgICAgICBnZW5lcmF0ZV9hbmRfdGVzdChpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwX3BhdGgsIHBkZml1bV90ZXN0X3BhdGgpCisgIHJldHVybiAwCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbigpKQo=