ZGlmZiAtLWdpdCBhL01hZ2lja0NvcmUvdmVyc2lvbi5oIGIvTWFnaWNrQ29yZS92ZXJzaW9uLmgKaW5kZXggMWM0YzcyZi4uNTc5NWJjYiAxMDA2NDQKLS0tIGEvTWFnaWNrQ29yZS92ZXJzaW9uLmgKKysrIGIvTWFnaWNrQ29yZS92ZXJzaW9uLmgKQEAgLTI3LDE0ICsyNywxNCBAQAogKi8KICNkZWZpbmUgTWFnaWNrUGFja2FnZU5hbWUgIkltYWdlTWFnaWNrIgogI2RlZmluZSBNYWdpY2tDb3B5cmlnaHQgICJDb3B5cmlnaHQgKEMpIDE5OTktMjAxMiBJbWFnZU1hZ2ljayBTdHVkaW8gTExDIgotI2RlZmluZSBNYWdpY2tTVk5SZXZpc2lvbiAgIjg5MzQ6ODk1M00iCisjZGVmaW5lIE1hZ2lja1NWTlJldmlzaW9uICAiODk4MDo4OTk1TSIKICNkZWZpbmUgTWFnaWNrTGliVmVyc2lvbiAgMHg3MDAKICNkZWZpbmUgTWFnaWNrTGliVmVyc2lvblRleHQgICI3LjAuMCIKICNkZWZpbmUgTWFnaWNrTGliVmVyc2lvbk51bWJlciAgNywwLDAKICNkZWZpbmUgTWFnaWNrTGliQWRkZW5kdW0gICItMCIKICNkZWZpbmUgTWFnaWNrTGliSW50ZXJmYWNlICA3CiAjZGVmaW5lIE1hZ2lja0xpYk1pbkludGVyZmFjZSAgNwotI2RlZmluZSBNYWdpY2tSZWxlYXNlRGF0ZSAgIjIwMTItMDgtMTQiCisjZGVmaW5lIE1hZ2lja1JlbGVhc2VEYXRlICAiMjAxMi0wOC0xNyIKICNkZWZpbmUgTWFnaWNrQ2hhbmdlRGF0ZSAgICIyMDEyMDgwOCIKICNkZWZpbmUgTWFnaWNrQXV0aG9yaXRhdGl2ZVVSTCAgImh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3JnIgogI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9PUEVOTVBfU1VQUE9SVCkKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0KaW5kZXggZmQ5NWQ1My4uNzQ5ZDVjNiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuYW0KKysrIGIvTWFrZWZpbGUuYW0KQEAgLTYyLDYgKzYyLDEwIEBACiBTUkNESVI9IiQoc3JjZGlyKS8iCiBlbmRpZgogCisjIFRlc3RzIHdpdGggLnRhcCBleHRlbnNpb25zIHVzZSB0aGUgVEFQIHByb3RvY29sIGFuZCBUQVAgZHJpdmVyCitUQVBfTE9HX0RSSVZFUiA9IGVudiBBTV9UQVBfQVdLPSckKEFXSyknICQoU0hFTEwpIFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZy90YXAtZHJpdmVyLnNoCisKICMgRW52aXJvbm1lbnQgcGFyYW1ldGVycyB0byBiZSB1c2VkIGR1cmluZyB0ZXN0cwogVEVTVFNfRU5WSVJPTk1FTlQgPSBcCiAJQ09NUEFSRT0iJChNRU1DSEVDSykgQGFic190b3BfYnVpbGRkaXJAL3V0aWxpdGllcy9jb21wYXJlIiBcCkBAIC04NCw3ICs4OCw3IEBACiAJU1JDRElSPSQoU1JDRElSKQogCiAjIFRlc3QgZXh0ZW5zaW9ucwotVEVTVF9FWFRFTlNJT05TID0gLnNoCitURVNUX0VYVEVOU0lPTlMgPSAuc2ggLnRhcAogCiAjIFRlc3RzIHRvIHJ1bgogVEVTVFMgPSBcCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCmluZGV4IDljZWUwYjUuLjQxNjhkOGQgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmluCisrKyBiL01ha2VmaWxlLmluCkBAIC0yNzAsNiArMjcwLDcgQEAKIAkkKHRvcF9zcmNkaXIpL2NvbmZpZy9kZXBjb21wICQodG9wX3NyY2RpcikvY29uZmlnL2luc3RhbGwtc2ggXAogCSQodG9wX3NyY2RpcikvY29uZmlnL2x0bWFpbi5zaCAkKHRvcF9zcmNkaXIpL2NvbmZpZy9taXNzaW5nIFwKIAkkKHRvcF9zcmNkaXIpL2NvbmZpZy9ta2luc3RhbGxkaXJzIFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZy90YXAtZHJpdmVyLnNoIFwKIAkkKHRvcF9zcmNkaXIpL2NvbmZpZy90ZXN0LWRyaXZlciBcCiAJJCh0b3Bfc3JjZGlyKS9jb25maWcvdHlwZS1kZWphdnUueG1sLmluIFwKIAkkKHRvcF9zcmNkaXIpL2NvbmZpZy90eXBlLWdob3N0c2NyaXB0LnhtbC5pbiBcCkBAIC0yNDUyLDcgKzI0NTMsNyBAQAogVEVTVF9TVUlURV9MT0cgPSB0ZXN0LXN1aXRlLmxvZwogYW1fX3Rlc3RfbG9nczEgPSAkKFRFU1RTOj0ubG9nKQogYW1fX3Rlc3RfbG9nczIgPSAkKGFtX190ZXN0X2xvZ3MxOkBFWEVFWFRALmxvZz0ubG9nKQotVEVTVF9MT0dTID0gJChhbV9fdGVzdF9sb2dzMjouc2gubG9nPS5sb2cpCithbV9fdGVzdF9sb2dzMyA9ICQoYW1fX3Rlc3RfbG9nczI6LnNoLmxvZz0ubG9nKQogU0hfTE9HX0RSSVZFUiA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvY29uZmlnL3Rlc3QtZHJpdmVyCiBTSF9MT0dfQ09NUElMRSA9ICQoU0hfTE9HX0NPTVBJTEVSKSAkKEFNX1NIX0xPR19GTEFHUykgJChTSF9MT0dfRkxBR1MpCiBhbV9fc2V0X2IgPSBcCkBAIC0yNDY1LDYgKzI0NjYsOSBAQAogICAgICopIFwKICAgICAgIGI9JyQqJzs7IFwKICAgZXNhYworVEVTVF9MT0dTID0gJChhbV9fdGVzdF9sb2dzMzoudGFwLmxvZz0ubG9nKQorVEFQX0xPR19DT01QSUxFID0gJChUQVBfTE9HX0NPTVBJTEVSKSAkKEFNX1RBUF9MT0dfRkxBR1MpIFwKKwkkKFRBUF9MT0dfRkxBR1MpCiBESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQogZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQogdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCkBAIC0yODk1LDYgKzI4OTksMTEgQEAKIEBXSU4zMl9OQVRJVkVfQlVJTERfRkFMU0VAU1JDRElSID0gIiQoc3JjZGlyKS8iCiBAV0lOMzJfTkFUSVZFX0JVSUxEX1RSVUVAU1JDRElSID0gJyQoc2hlbGwgQFdpblBhdGhTY3JpcHRAICQoc3JjZGlyKS8pJwogCisjIFRlc3RzIHdpdGggLnRhcCBleHRlbnNpb25zIHVzZSB0aGUgVEFQIHByb3RvY29sIGFuZCBUQVAgZHJpdmVyCitUQVBfTE9HX0RSSVZFUiA9IGVudiBBTV9UQVBfQVdLPSckKEFXSyknICQoU0hFTEwpIFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZy90YXAtZHJpdmVyLnNoCisKKwogIyBFbnZpcm9ubWVudCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgZHVyaW5nIHRlc3RzCiBURVNUU19FTlZJUk9OTUVOVCA9IFwKIAlDT01QQVJFPSIkKE1FTUNIRUNLKSBAYWJzX3RvcF9idWlsZGRpckAvdXRpbGl0aWVzL2NvbXBhcmUiIFwKQEAgLTI5MTgsNyArMjkyNyw3IEBACiAKIAogIyBUZXN0IGV4dGVuc2lvbnMKLVRFU1RfRVhURU5TSU9OUyA9IC5zaAorVEVTVF9FWFRFTlNJT05TID0gLnNoIC50YXAKIFRPUF9FWFRSQV9ESVNUID0gXAogICBBVVRIT1JTLnR4dCBcCiAJQ2hhbmdlTG9nIFwKQEAgLTUwOTEsNyArNTEwMCw3IEBACiAJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLWFtCiAKIC5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLmNwcCAubG8gLmxvZyAubyAub2JqIC5zaCAuc2gkKEVYRUVYVCkgLnRycworLlNVRkZJWEVTOiAuYyAuY3BwIC5sbyAubG9nIC5vIC5vYmogLnNoIC5zaCQoRVhFRVhUKSAudGFwIC50YXAkKEVYRUVYVCkgLnRycwogYW0tLXJlZnJlc2g6IE1ha2VmaWxlCiAJQDoKICQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL200L01ha2VmaWxlLmFtICQoc3JjZGlyKS9jb25maWcvTWFrZWZpbGUuYW0gJChzcmNkaXIpL2x0ZGwvTWFrZWZpbGUuaW5jICQoc3JjZGlyKS9jb2RlcnMvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01hZ2lja0NvcmUvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01hZ2lja1dhbmQvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01hZ2ljaysrL01ha2VmaWxlLmFtICQoc3JjZGlyKS9maWx0ZXJzL01ha2VmaWxlLmFtICQoc3JjZGlyKS91dGlsaXRpZXMvTWFrZWZpbGUuYW0gJChzcmNkaXIpL3Rlc3RzL01ha2VmaWxlLmFtICQoc3JjZGlyKS9QZXJsTWFnaWNrL01ha2VmaWxlLmFtICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQpAQCAtMTA0NDYsNiArMTA0NTUsMjAgQEAKIEBhbV9fRVhFRVhUX1RSVUVACS0tbG9nLWZpbGUgJCRiLmxvZyAtLXRycy1maWxlICQkYi50cnMgXAogQGFtX19FWEVFWFRfVFJVRUAJJChhbV9fY29tbW9uX2RyaXZlcl9mbGFncykgJChBTV9TSF9MT0dfRFJJVkVSX0ZMQUdTKSAkKFNIX0xPR19EUklWRVJfRkxBR1MpIC0tICQoU0hfTE9HX0NPTVBJTEUpIFwKIEBhbV9fRVhFRVhUX1RSVUVACSIkJHRzdCIgJChBTV9URVNUU19GRF9SRURJUkVDVCkKKy50YXAubG9nOgorCUBwPSckPCc7IFwKKwkkKGFtX19zZXRfYik7IFwKKwkkKGFtX19jaGVja19wcmUpICQoVEFQX0xPR19EUklWRVIpIC0tdGVzdC1uYW1lICIkJGYiIFwKKwktLWxvZy1maWxlICQkYi5sb2cgLS10cnMtZmlsZSAkJGIudHJzIFwKKwkkKGFtX19jb21tb25fZHJpdmVyX2ZsYWdzKSAkKEFNX1RBUF9MT0dfRFJJVkVSX0ZMQUdTKSAkKFRBUF9MT0dfRFJJVkVSX0ZMQUdTKSAtLSAkKFRBUF9MT0dfQ09NUElMRSkgXAorCSIkJHRzdCIgJChBTV9URVNUU19GRF9SRURJUkVDVCkKK0BhbV9fRVhFRVhUX1RSVUVALnRhcCQoRVhFRVhUKS5sb2c6CitAYW1fX0VYRUVYVF9UUlVFQAlAcD0nJDwnOyBcCitAYW1fX0VYRUVYVF9UUlVFQAkkKGFtX19zZXRfYik7IFwKK0BhbV9fRVhFRVhUX1RSVUVACSQoYW1fX2NoZWNrX3ByZSkgJChUQVBfTE9HX0RSSVZFUikgLS10ZXN0LW5hbWUgIiQkZiIgXAorQGFtX19FWEVFWFRfVFJVRUAJLS1sb2ctZmlsZSAkJGIubG9nIC0tdHJzLWZpbGUgJCRiLnRycyBcCitAYW1fX0VYRUVYVF9UUlVFQAkkKGFtX19jb21tb25fZHJpdmVyX2ZsYWdzKSAkKEFNX1RBUF9MT0dfRFJJVkVSX0ZMQUdTKSAkKFRBUF9MT0dfRFJJVkVSX0ZMQUdTKSAtLSAkKFRBUF9MT0dfQ09NUElMRSkgXAorQGFtX19FWEVFWFRfVFJVRUAJIiQkdHN0IiAkKEFNX1RFU1RTX0ZEX1JFRElSRUNUKQogCiBkaXN0ZGlyOiAkKERJU1RGSUxFUykKIAlAbGlzdD0nJChNQU5TKSc7IGlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXApkaWZmIC0tZ2l0IGEvY29uZmlnL0ltYWdlTWFnaWNrLnJkZiBiL2NvbmZpZy9JbWFnZU1hZ2ljay5yZGYKaW5kZXggMDA4OTQ3NS4uZDQyOWJkNSAxMDA2NDQKLS0tIGEvY29uZmlnL0ltYWdlTWFnaWNrLnJkZgorKysgYi9jb25maWcvSW1hZ2VNYWdpY2sucmRmCkBAIC01LDcgKzUsNyBAQAogICAgIDxuYW1lPkltYWdlTWFnaWNrPC9uYW1lPgogICAgIDxzaG9ydGRlc2MgeG1sOmxhbmc9ImVuIj5JbWFnZU1hZ2ljazogY29udmVydCwgZWRpdCwgYW5kIGNvbXBvc2UgaW1hZ2VzLjwvc2hvcnRkZXNjPgogICAgIDxob21lcGFnZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3JnLyIvPgotICAgIDxjcmVhdGVkPjIwMTItMDgtMTQ8L2NyZWF0ZWQ+CisgICAgPGNyZWF0ZWQ+MjAxMi0wOC0xNzwvY3JlYXRlZD4KIAogICAgIDxkZXNjcmlwdGlvbiB4bWw6bGFuZz0iZW4iPgogSW1hZ2VNYWdpY2uuIGlzIGEgc29mdHdhcmUgc3VpdGUgdG8gY3JlYXRlLCBlZGl0LCBjb21wb3NlLCBvciBjb252ZXJ0IGJpdG1hcCBpbWFnZXMuIEl0IGNhbiByZWFkIGFuZCB3cml0ZSBpbWFnZXMgaW4gYSB2YXJpZXR5IG9mIGZvcm1hdHMgKG92ZXIgMTAwKSBpbmNsdWRpbmcgRFBYLCBFWFIsIEdJRiwgSlBFRywgSlBFRy0yMDAwLCBQREYsIFBob3RvQ0QsIFBORywgUG9zdHNjcmlwdCwgU1ZHLCBhbmQgVElGRi4gVXNlIEltYWdlTWFnaWNrIHRvIHJlc2l6ZSwgZmxpcCwgbWlycm9yLCByb3RhdGUsIGRpc3RvcnQsIHNoZWFyIGFuZCB0cmFuc2Zvcm0gaW1hZ2VzLCBhZGp1c3QgaW1hZ2UgY29sb3JzLCBhcHBseSB2YXJpb3VzIHNwZWNpYWwgZWZmZWN0cywgb3IgZHJhdyB0ZXh0LCBsaW5lcywgcG9seWdvbnMsIGVsbGlwc2VzIGFuZCBC6XppZXIgY3VydmVzLgpAQCAtNTcsNyArNTcsNyBAQAogICAgIDxyZWxlYXNlPgogICAgICAgPFZlcnNpb24+CiAgICAgICAgICAgPG5hbWU+c3RhYmxlPC9uYW1lPgotICAgICAgICAgIDxjcmVhdGVkPjIwMTItMDgtMTQ8L2NyZWF0ZWQ+CisgICAgICAgICAgPGNyZWF0ZWQ+MjAxMi0wOC0xNzwvY3JlYXRlZD4KICAgICAgICAgICA8cmV2aXNpb24+Ny4wLjA8L3JldmlzaW9uPgogICAgICAgICAgIDxwYXRjaC1sZXZlbD4tMDwvcGF0Y2gtbGV2ZWw+CiAgICAgICA8L1ZlcnNpb24+CmRpZmYgLS1naXQgYS9jb25maWcvY29uZmlndXJlLnhtbCBiL2NvbmZpZy9jb25maWd1cmUueG1sCmluZGV4IGU2NGE2OTMuLjlkMmJkNmMgMTAwNjQ0Ci0tLSBhL2NvbmZpZy9jb25maWd1cmUueG1sCisrKyBiL2NvbmZpZy9jb25maWd1cmUueG1sCkBAIC0xMCw4ICsxMCw4IEBACiAgIDxjb25maWd1cmUgbmFtZT0iVkVSU0lPTiIgdmFsdWU9IjcuMC4wIi8+CiAgIDxjb25maWd1cmUgbmFtZT0iTElCX1ZFUlNJT04iIHZhbHVlPSIweDcwMCIvPgogICA8Y29uZmlndXJlIG5hbWU9IkxJQl9WRVJTSU9OX05VTUJFUiIgdmFsdWU9IjcsMCwwLDAiLz4KLSAgPGNvbmZpZ3VyZSBuYW1lPSJTVk5fUkVWSVNJT04iIHZhbHVlPSI4OTM0Ojg5NTNNIiAvPgotICA8Y29uZmlndXJlIG5hbWU9IlJFTEVBU0VfREFURSIgdmFsdWU9IjIwMTItMDgtMTQiLz4KKyAgPGNvbmZpZ3VyZSBuYW1lPSJTVk5fUkVWSVNJT04iIHZhbHVlPSI4OTgwOjg5OTVNIiAvPgorICA8Y29uZmlndXJlIG5hbWU9IlJFTEVBU0VfREFURSIgdmFsdWU9IjIwMTItMDgtMTciLz4KICAgPGNvbmZpZ3VyZSBuYW1lPSJDT05GSUdVUkUiIHZhbHVlPSIuL2NvbmZpZ3VyZSAiLz4KICAgPGNvbmZpZ3VyZSBuYW1lPSJQUkVGSVgiIHZhbHVlPSIvdXNyL2xvY2FsIi8+CiAgIDxjb25maWd1cmUgbmFtZT0iRVhFQy1QUkVGSVgiIHZhbHVlPSIvdXNyL2xvY2FsIi8+CmRpZmYgLS1naXQgYS9jb25maWcvZGVsZWdhdGVzLnhtbCBiL2NvbmZpZy9kZWxlZ2F0ZXMueG1sCmluZGV4IGNjNjI3ODcuLjFjZTIyODcgMTAwNjQ0Ci0tLSBhL2NvbmZpZy9kZWxlZ2F0ZXMueG1sCisrKyBiL2NvbmZpZy9kZWxlZ2F0ZXMueG1sCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgPGRlbGVnYXRlIGRlY29kZT0ibWlmZiIgZW5jb2RlPSJzaG93IiBzcGF3bj0iVHJ1ZSIgY29tbWFuZD0iJnF1b3Q7L3Vzci9sb2NhbC9iaW4vZGlzcGxheSZxdW90OyAtZGVsYXkgMCAtd2luZG93LWdyb3VwICVbZ3JvdXBdIC10aXRsZSAmcXVvdDslbCAmcXVvdDsgJnF1b3Q7ZXBoZW1lcmFsOiVpJnF1b3Q7Ii8+CiAgIDxkZWxlZ2F0ZSBkZWNvZGU9InNodG1sIiBjb21tYW5kPSImcXVvdDtodG1sMnBzJnF1b3Q7IC1VIC1vICZxdW90OyVvJnF1b3Q7ICZxdW90OyVpJnF1b3Q7Ii8+CiAgIDxkZWxlZ2F0ZSBkZWNvZGU9InN2ZyIgY29tbWFuZD0iJnF1b3Q7cnN2Zy1jb252ZXJ0JnF1b3Q7IC1vICZxdW90OyVvJnF1b3Q7ICZxdW90OyVpJnF1b3Q7Ii8+Ci0gIDxkZWxlZ2F0ZSBkZWNvZGU9InN2ZzpkZWNvZGUiIHN0ZWFsdGg9IlRydWUiIGNvbW1hbmQ9IiZxdW90O2lua3NjYXBlJnF1b3Q7ICZxdW90OyVzJnF1b3Q7IC0tZXhwb3J0LXBuZz0mcXVvdDslcyZxdW90OyAtLWV4cG9ydC1kcGk9JnF1b3Q7JXMmcXVvdDsgLS1leHBvcnQtYmFja2dyb3VuZD0mcXVvdDslcyZxdW90OyAtLWV4cG9ydC1iYWNrZ3JvdW5kLW9wYWNpdHk9JnF1b3Q7JXMmcXVvdDsgJmd0OyAmcXVvdDslcyZxdW90OyIvPgorICA8ZGVsZWdhdGUgZGVjb2RlPSJzdmc6ZGVjb2RlIiBzdGVhbHRoPSJUcnVlIiBjb21tYW5kPSImcXVvdDtpbmtzY2FwZSZxdW90OyAmcXVvdDslcyZxdW90OyAtLWV4cG9ydC1wbmc9JnF1b3Q7JXMmcXVvdDsgLS1leHBvcnQtZHBpPSZxdW90OyVzJnF1b3Q7IC0tZXhwb3J0LWJhY2tncm91bmQ9JnF1b3Q7JXMmcXVvdDsgLS1leHBvcnQtYmFja2dyb3VuZC1vcGFjaXR5PSZxdW90OyVzJnF1b3Q7ICZndDsgJnF1b3Q7JXMmcXVvdDsgMiZndDsmYW1wOzEiLz4KICAgPGRlbGVnYXRlIGRlY29kZT0idHh0IiBlbmNvZGU9InBzIiBtb2RlPSJiaSIgY29tbWFuZD0iJnF1b3Q7ZW5zY3JpcHQmcXVvdDsgLW8gJnF1b3Q7JW8mcXVvdDsgJnF1b3Q7JWkmcXVvdDsiLz4KICAgPGRlbGVnYXRlIGRlY29kZT0ibWlmZiIgZW5jb2RlPSJ3aW4iIHN0ZWFsdGg9IlRydWUiIHNwYXduPSJUcnVlIiBjb21tYW5kPSImcXVvdDsvdXNyL2xvY2FsL2Jpbi9kaXNwbGF5JnF1b3Q7IC1pbW11dGFibGUgLWRlbGF5IDAgLXdpbmRvdy1ncm91cCAlW2dyb3VwXSAtdGl0bGUgJnF1b3Q7JWwgJnF1b3Q7ICZxdW90O2VwaGVtZXJhbDolaSZxdW90OyIvPgogICA8ZGVsZWdhdGUgZGVjb2RlPSJ3bWYiIGNvbW1hbmQ9IiZxdW90O3dtZjJlcHMmcXVvdDsgLW8gJnF1b3Q7JW8mcXVvdDsgJnF1b3Q7JWkmcXVvdDsiLz4KZGlmZiAtLWdpdCBhL2NvbmZpZy90YXAtZHJpdmVyLnNoIGIvY29uZmlnL3RhcC1kcml2ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjU5Y2EwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy90YXAtZHJpdmVyLnNoCkBAIC0wLDAgKzEsNjUyIEBACisjISAvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKKyMgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+IG9yIHNlbmQgcGF0Y2hlcyB0bworIyA8YXV0b21ha2UtcGF0Y2hlc0BnbnUub3JnPi4KKworc2NyaXB0dmVyc2lvbj0yMDExLTEyLTI3LjE3OyAjIFVUQworCisjIE1ha2UgdW5jb25kaXRpb25hbCBleHBhbnNpb24gb2YgdW5kZWZpbmVkIHZhcmlhYmxlcyBhbiBlcnJvci4gIFRoaXMKKyMgaGVscHMgYSBsb3QgaW4gcHJldmVudGluZyB0eXBvLXJlbGF0ZWQgYnVncy4KK3NldCAtdQorCittZT10YXAtZHJpdmVyLnNoCisKK2ZhdGFsICgpCit7CisgIGVjaG8gIiRtZTogZmF0YWw6ICQqIiA+JjIKKyAgZXhpdCAxCit9CisKK3VzYWdlX2Vycm9yICgpCit7CisgIGVjaG8gIiRtZTogJCoiID4mMgorICBwcmludF91c2FnZSA+JjIKKyAgZXhpdCAyCit9CisKK3ByaW50X3VzYWdlICgpCit7CisgIGNhdCA8PEVORAorVXNhZ2U6CisgIHRhcC1kcml2ZXIuc2ggLS10ZXN0LW5hbWU9TkFNRSAtLWxvZy1maWxlPVBBVEggLS10cnMtZmlsZT1QQVRICisgICAgICAgICAgICAgICAgWy0tZXhwZWN0LWZhaWx1cmU9e3llc3xub31dIFstLWNvbG9yLXRlc3RzPXt5ZXN8bm99XQorICAgICAgICAgICAgICAgIFstLWVuYWJsZS1oYXJkLWVycm9ycz17eWVzfG5vfV0gWy0taWdub3JlLWV4aXRdCisgICAgICAgICAgICAgICAgWy0tZGlhZ25vc3RpYy1zdHJpbmc9U1RSSU5HXSBbLS1tZXJnZXwtLW5vLW1lcmdlXQorICAgICAgICAgICAgICAgIFstLWNvbW1lbnRzfC0tbm8tY29tbWVudHNdIFstLV0gVEVTVC1DT01NQU5ECitUaGUgXGAtLXRlc3QtbmFtZScsIFxgLS1sb2ctZmlsZScgYW5kIFxgLS10cnMtZmlsZScgb3B0aW9ucyBhcmUgbWFuZGF0b3J5LgorRU5ECit9CisKKyMgVE9ETzogYmV0dGVyIGVycm9yIGhhbmRsaW5nIGluIG9wdGlvbiBwYXJzaW5nIChpbiBwYXJ0aWN1bGFyLCBlbnN1cmUKKyMgVE9ETzogJGxvZ19maWxlLCAkdHJzX2ZpbGUgYW5kICR0ZXN0X25hbWUgYXJlIGRlZmluZWQpLgordGVzdF9uYW1lPSAjIFVzZWQgZm9yIHJlcG9ydGluZy4KK2xvZ19maWxlPSAgIyBXaGVyZSB0byBzYXZlIHRoZSByZXN1bHQgYW5kIG91dHB1dCBvZiB0aGUgdGVzdCBzY3JpcHQuCit0cnNfZmlsZT0gICMgV2hlcmUgdG8gc2F2ZSB0aGUgbWV0YWRhdGEgb2YgdGhlIHRlc3QgcnVuLgorZXhwZWN0X2ZhaWx1cmU9MAorY29sb3JfdGVzdHM9MAorbWVyZ2U9MAoraWdub3JlX2V4aXQ9MAorY29tbWVudHM9MAorZGlhZ19zdHJpbmc9JyMnCit3aGlsZSB0ZXN0ICQjIC1ndCAwOyBkbworICBjYXNlICQxIGluCisgIC0taGVscCkgcHJpbnRfdXNhZ2U7IGV4aXQgJD87OworICAtLXZlcnNpb24pIGVjaG8gIiRtZSAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OworICAtLXRlc3QtbmFtZSkgdGVzdF9uYW1lPSQyOyBzaGlmdDs7CisgIC0tbG9nLWZpbGUpIGxvZ19maWxlPSQyOyBzaGlmdDs7CisgIC0tdHJzLWZpbGUpIHRyc19maWxlPSQyOyBzaGlmdDs7CisgIC0tY29sb3ItdGVzdHMpIGNvbG9yX3Rlc3RzPSQyOyBzaGlmdDs7CisgIC0tZXhwZWN0LWZhaWx1cmUpIGV4cGVjdF9mYWlsdXJlPSQyOyBzaGlmdDs7CisgIC0tZW5hYmxlLWhhcmQtZXJyb3JzKSBzaGlmdDs7ICMgTm8tb3AuCisgIC0tbWVyZ2UpIG1lcmdlPTE7OworICAtLW5vLW1lcmdlKSBtZXJnZT0wOzsKKyAgLS1pZ25vcmUtZXhpdCkgaWdub3JlX2V4aXQ9MTs7CisgIC0tY29tbWVudHMpIGNvbW1lbnRzPTE7OworICAtLW5vLWNvbW1lbnRzKSBjb21tZW50cz0wOzsKKyAgLS1kaWFnbm9zdGljLXN0cmluZykgZGlhZ19zdHJpbmc9JDI7IHNoaWZ0OzsKKyAgLS0pIHNoaWZ0OyBicmVhazs7CisgIC0qKSB1c2FnZV9lcnJvciAiaW52YWxpZCBvcHRpb246ICckMSciOzsKKyAgZXNhYworICBzaGlmdAorZG9uZQorCit0ZXN0ICQjIC1ndCAwIHx8IHVzYWdlX2Vycm9yICJtaXNzaW5nIHRlc3QgY29tbWFuZCIKKworY2FzZSAkZXhwZWN0X2ZhaWx1cmUgaW4KKyAgeWVzKSBleHBlY3RfZmFpbHVyZT0xOzsKKyAgICAqKSBleHBlY3RfZmFpbHVyZT0wOzsKK2VzYWMKKworaWYgdGVzdCAkY29sb3JfdGVzdHMgPSB5ZXM7IHRoZW4KKyAgaW5pdF9jb2xvcnM9JworICAgIGNvbG9yX21hcFsicmVkIl09IhtbMDszMW0iICMgUmVkLgorICAgIGNvbG9yX21hcFsiZ3JuIl09IhtbMDszMm0iICMgR3JlZW4uCisgICAgY29sb3JfbWFwWyJsZ24iXT0iG1sxOzMybSIgIyBMaWdodCBncmVlbi4KKyAgICBjb2xvcl9tYXBbImJsdSJdPSIbWzE7MzRtIiAjIEJsdWUuCisgICAgY29sb3JfbWFwWyJtZ24iXT0iG1swOzM1bSIgIyBNYWdlbnRhLgorICAgIGNvbG9yX21hcFsic3RkIl09IhtbbSIgICAgICMgTm8gY29sb3IuCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiRVJST1IiXSA9ICJtZ24iCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiUEFTUyJdICA9ICJncm4iCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiWFBBU1MiXSA9ICJyZWQiCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiRkFJTCJdICA9ICJyZWQiCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiWEZBSUwiXSA9ICJsZ24iCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiU0tJUCJdICA9ICJibHUiJworZWxzZQorICBpbml0X2NvbG9ycz0nJworZmkKKworIyA6OyBpcyB0aGVyZSB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBiYXNoIDMuMiAoYW5kIGVhcmxpZXIpIHdoaWNoCisjIGRvZXMgbm90IGFsd2F5cyBzZXQgJyQ/JyBwcm9wZXJseSBvbiByZWRpcmVjdGlvbiBmYWlsdXJlLgorIyBTZWUgdGhlIEF1dG9jb25mIG1hbnVhbCBmb3IgbW9yZSBkZXRhaWxzLgorOjt7CisgICgKKyAgICAjIElnbm9yZSBjb21tb24gc2lnbmFscyAoaW4gdGhpcyBzdWJzaGVsbCBvbmx5ISksIHRvIGF2b2lkIHBvdGVudGlhbAorICAgICMgcHJvYmxlbXMgd2l0aCBLb3JuIHNoZWxscy4gIFNvbWUgS29ybiBzaGVsbHMgYXJlIGtub3duIHRvIHByb3BhZ2F0ZQorICAgICMgdG8gdGhlbXNlbHZlcyBzaWduYWxzIHRoYXQgaGF2ZSBraWxsZWQgYSBjaGlsZCBwcm9jZXNzIHRoZXkgd2VyZQorICAgICMgd2FpdGluZyBmb3I7IHRoaXMgaXMgZG9uZSBhdCBsZWFzdCBmb3IgU0lHSU5UIChhbmQgdXN1YWxseSBvbmx5IGZvcgorICAgICMgaXQsIGluIHRydXRoKS4gIFdpdGhvdXQgdGhlIGB0cmFwJyBiZWxvdywgc3VjaCBhIGJlaGF2aW91ciBjb3VsZAorICAgICMgY2F1c2UgYSBwcmVtYXR1cmUgZXhpdCBpbiB0aGUgY3VycmVudCBzdWJzaGVsbCwgZS5nLiwgaW4gY2FzZSB0aGUKKyAgICAjIHRlc3QgY29tbWFuZCBpdCBydW5zIGdldHMgdGVybWluYXRlZCBieSBhIFNJR0lOVC4gIFRodXMsIHRoZSBhd2sKKyAgICAjIHNjcmlwdCB3ZSBhcmUgcGlwaW5nIGludG8gd291bGQgbmV2ZXIgc2VlbiB0aGUgZXhpdCBzdGF0dXMgaXQKKyAgICAjIGV4cGVjdHMgb24gaXRzIGxhc3QgaW5wdXQgbGluZSAod2hpY2ggaXMgZGlzcGxheWVkIGJlbG93IGJ5IHRoZQorICAgICMgbGFzdCBgZWNobyAkPycgc3RhdGVtZW50KSwgYW5kIHdvdWxkIHRodXMgZGllIHJlcG9ydGluZyBhbiBpbnRlcm5hbAorICAgICMgZXJyb3IuCisgICAgIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBBdXRvY29uZiBtYW51YWwgYW5kIHRoZSB0aHJlYWRzOgorICAgICMgPGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9idWctYXV0b2NvbmYvMjAxMS0wOS9tc2cwMDAwNC5odG1sPgorICAgICMgPGh0dHA6Ly9tYWlsLm9wZW5zb2xhcmlzLm9yZy9waXBlcm1haWwva3NoOTMtaW50ZWdyYXRpb24tZGlzY3Vzcy8yMDA5LUZlYnJ1YXJ5LzAwNDEyMS5odG1sPgorICAgIHRyYXAgOiAxIDMgMiAxMyAxNQorICAgIGlmIHRlc3QgJG1lcmdlIC1ndCAwOyB0aGVuCisgICAgICBleGVjIDI+JjEKKyAgICBlbHNlCisgICAgICBleGVjIDI+JjMKKyAgICBmaQorICAgICIkQCIKKyAgICBlY2hvICQ/CisgICkgfCBMQ19BTEw9QyAke0FNX1RBUF9BV0stYXdrfSBcCisgICAgICAgIC12IG1lPSIkbWUiIFwKKyAgICAgICAgLXYgdGVzdF9zY3JpcHRfbmFtZT0iJHRlc3RfbmFtZSIgXAorICAgICAgICAtdiBsb2dfZmlsZT0iJGxvZ19maWxlIiBcCisgICAgICAgIC12IHRyc19maWxlPSIkdHJzX2ZpbGUiIFwKKyAgICAgICAgLXYgZXhwZWN0X2ZhaWx1cmU9IiRleHBlY3RfZmFpbHVyZSIgXAorICAgICAgICAtdiBtZXJnZT0iJG1lcmdlIiBcCisgICAgICAgIC12IGlnbm9yZV9leGl0PSIkaWdub3JlX2V4aXQiIFwKKyAgICAgICAgLXYgY29tbWVudHM9IiRjb21tZW50cyIgXAorICAgICAgICAtdiBkaWFnX3N0cmluZz0iJGRpYWdfc3RyaW5nIiBcCisnCisjIEZJWE1FOiB0aGUgdXNhZ2VzIG9mICJjYXQgPiYzIiBiZWxvdyBjb3VsZCBiZSBvcHRpbWl6ZWQgd2hlbiB1c2luZworIyBGSVhNRTogR05VIGF3aywgYW5kL29uIG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0cyAvZGV2L2ZkLy4KKworIyBJbXBsZW1lbnRhdGlvbiBub3RlOiBpbiB3aGF0IGZvbGxvd3MsIGByZXN1bHRfb2JqYCB3aWxsIGJlIGFuCisjIGFzc29jaWF0aXZlIGFycmF5IHRoYXQgKHBhcnRseSkgc2ltdWxhdGVzIGEgVEFQIHJlc3VsdCBvYmplY3QKKyMgZnJvbSB0aGUgYFRBUDo6UGFyc2VyYCBwZXJsIG1vZHVsZS4KKworIyMgLS0tLS0tLS0tLS0gIyMKKyMjICBGVU5DVElPTlMgICMjCisjIyAtLS0tLS0tLS0tLSAjIworCitmdW5jdGlvbiBmYXRhbChtc2cpCit7CisgIHByaW50IG1lICI6ICIgbXNnIHwgImNhdCA+JjIiCisgIGV4aXQgMQorfQorCitmdW5jdGlvbiBhYm9ydCh3aGVyZSkKK3sKKyAgZmF0YWwoImludGVybmFsIGVycm9yICIgd2hlcmUpCit9CisKKyMgQ29udmVydCBhIGJvb2xlYW4gdG8gYSAieWVzIi8ibm8iIHN0cmluZy4KK2Z1bmN0aW9uIHluKGJvb2wpCit7CisgIHJldHVybiBib29sID8gInllcyIgOiAibm8iOworfQorCitmdW5jdGlvbiBhZGRfdGVzdF9yZXN1bHQocmVzdWx0KQoreworICBpZiAoIXRlc3RfcmVzdWx0c19pbmRleCkKKyAgICB0ZXN0X3Jlc3VsdHNfaW5kZXggPSAwCisgIHRlc3RfcmVzdWx0c19saXN0W3Rlc3RfcmVzdWx0c19pbmRleF0gPSByZXN1bHQKKyAgdGVzdF9yZXN1bHRzX2luZGV4ICs9IDEKKyAgdGVzdF9yZXN1bHRzX3NlZW5bcmVzdWx0XSA9IDE7Cit9CisKKyMgV2hldGhlciB0aGUgdGVzdCBzY3JpcHQgc2hvdWxkIGJlIHJlLXJ1biBieSAibWFrZSByZWNoZWNrIi4KK2Z1bmN0aW9uIG11c3RfcmVjaGVjaygpCit7CisgIGZvciAoayBpbiB0ZXN0X3Jlc3VsdHNfc2VlbikKKyAgICBpZiAoayAhPSAiWEZBSUwiICYmIGsgIT0gIlBBU1MiICYmIGsgIT0gIlNLSVAiKQorICAgICAgcmV0dXJuIDEKKyAgcmV0dXJuIDAKK30KKworIyBXaGV0aGVyIHRoZSBjb250ZW50IG9mIHRoZSBsb2cgZmlsZSBhc3NvY2lhdGVkIHRvIHRoaXMgdGVzdCBzaG91bGQKKyMgYmUgY29waWVkIGludG8gdGhlICJnbG9iYWwiIHRlc3Qtc3VpdGUubG9nLgorZnVuY3Rpb24gY29weV9pbl9nbG9iYWxfbG9nKCkKK3sKKyAgZm9yIChrIGluIHRlc3RfcmVzdWx0c19zZWVuKQorICAgIGlmIChrICE9ICJQQVNTIikKKyAgICAgIHJldHVybiAxCisgIHJldHVybiAwCit9CisKKyMgRklYTUU6IHRoaXMgY2FuIGNlcnRhaW5seSBiZSBpbXByb3ZlZCAuLi4KK2Z1bmN0aW9uIGdldF9nbG9iYWxfdGVzdF9yZXN1bHQoKQoreworICAgIGlmICgiRVJST1IiIGluIHRlc3RfcmVzdWx0c19zZWVuKQorICAgICAgcmV0dXJuICJFUlJPUiIKKyAgICBpZiAoIkZBSUwiIGluIHRlc3RfcmVzdWx0c19zZWVuIHx8ICJYUEFTUyIgaW4gdGVzdF9yZXN1bHRzX3NlZW4pCisgICAgICByZXR1cm4gIkZBSUwiCisgICAgYWxsX3NraXBwZWQgPSAxCisgICAgZm9yIChrIGluIHRlc3RfcmVzdWx0c19zZWVuKQorICAgICAgaWYgKGsgIT0gIlNLSVAiKQorICAgICAgICBhbGxfc2tpcHBlZCA9IDAKKyAgICBpZiAoYWxsX3NraXBwZWQpCisgICAgICByZXR1cm4gIlNLSVAiCisgICAgcmV0dXJuICJQQVNTIjsKK30KKworZnVuY3Rpb24gc3RyaW5naWZ5X3Jlc3VsdF9vYmoocmVzdWx0X29iaikKK3sKKyAgaWYgKHJlc3VsdF9vYmpbImlzX3VucGxhbm5lZCJdIHx8IHJlc3VsdF9vYmpbIm51bWJlciJdICE9IHRlc3RubykKKyAgICByZXR1cm4gIkVSUk9SIgorCisgIGlmIChwbGFuX3NlZW4gPT0gTEFURV9QTEFOKQorICAgIHJldHVybiAiRVJST1IiCisKKyAgaWYgKHJlc3VsdF9vYmpbImRpcmVjdGl2ZSJdID09ICJUT0RPIikKKyAgICByZXR1cm4gcmVzdWx0X29ialsiaXNfb2siXSA/ICJYUEFTUyIgOiAiWEZBSUwiCisKKyAgaWYgKHJlc3VsdF9vYmpbImRpcmVjdGl2ZSJdID09ICJTS0lQIikKKyAgICByZXR1cm4gcmVzdWx0X29ialsiaXNfb2siXSA/ICJTS0lQIiA6IENPT0tFRF9GQUlMOworCisgIGlmIChsZW5ndGgocmVzdWx0X29ialsiZGlyZWN0aXZlIl0pKQorICAgICAgYWJvcnQoImluIGZ1bmN0aW9uIHN0cmluZ2lmeV9yZXN1bHRfb2JqKCkiKQorCisgIHJldHVybiByZXN1bHRfb2JqWyJpc19vayJdID8gQ09PS0VEX1BBU1MgOiBDT09LRURfRkFJTAorfQorCitmdW5jdGlvbiBkZWNvcmF0ZV9yZXN1bHQocmVzdWx0KQoreworICBjb2xvcl9uYW1lID0gY29sb3JfZm9yX3Jlc3VsdFtyZXN1bHRdCisgIGlmIChjb2xvcl9uYW1lKQorICAgIHJldHVybiBjb2xvcl9tYXBbY29sb3JfbmFtZV0gIiIgcmVzdWx0ICIiIGNvbG9yX21hcFsic3RkIl0KKyAgIyBJZiB3ZSBhcmUgbm90IHVzaW5nIGNvbG9yaXplZCBvdXRwdXQsIG9yIGlmIHdlIGRvIG5vdCBrbm93IGhvdworICAjIHRvIGNvbG9yaXplIHRoZSBnaXZlbiByZXN1bHQsIHdlIHNob3VsZCByZXR1cm4gaXQgdW5jaGFuZ2VkLgorICByZXR1cm4gcmVzdWx0Cit9CisKK2Z1bmN0aW9uIHJlcG9ydChyZXN1bHQsIGRldGFpbHMpCit7CisgIGlmIChyZXN1bHQgfiAvXihYPyhQQVNTfEZBSUwpfFNLSVB8RVJST1IpLykKKyAgICB7CisgICAgICBtc2cgPSAiOiAiIHRlc3Rfc2NyaXB0X25hbWUKKyAgICAgIGFkZF90ZXN0X3Jlc3VsdChyZXN1bHQpCisgICAgfQorICBlbHNlIGlmIChyZXN1bHQgPT0gIiMiKQorICAgIHsKKyAgICAgIG1zZyA9ICIgIiB0ZXN0X3NjcmlwdF9uYW1lICI6IgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFib3J0KCJpbiBmdW5jdGlvbiByZXBvcnQoKSIpCisgICAgfQorICBpZiAobGVuZ3RoKGRldGFpbHMpKQorICAgIG1zZyA9IG1zZyAiICIgZGV0YWlscworICAjIE91dHB1dCBvbiBjb25zb2xlIG1pZ2h0IGJlIGNvbG9yaXplZC4KKyAgcHJpbnQgZGVjb3JhdGVfcmVzdWx0KHJlc3VsdCkgbXNnCisgICMgTG9nIHRoZSByZXN1bHQgaW4gdGhlIGxvZyBmaWxlIHRvbywgdG8gaGVscCBkZWJ1Z2dpbmcgKHRoaXMgaXMKKyAgIyBlc3BlY2lhbGx5IHRydWUgd2hlbiBzYWlkIHJlc3VsdCBpcyBhIFRBUCBlcnJvciBvciAiQmFpbCBvdXQhIikuCisgIHByaW50IHJlc3VsdCBtc2cgfCAiY2F0ID4mMyI7Cit9CisKK2Z1bmN0aW9uIHRlc3RzdWl0ZV9lcnJvcihlcnJvcl9tZXNzYWdlKQoreworICByZXBvcnQoIkVSUk9SIiwgIi0gIiBlcnJvcl9tZXNzYWdlKQorfQorCitmdW5jdGlvbiBoYW5kbGVfdGFwX3Jlc3VsdCgpCit7CisgIGRldGFpbHMgPSByZXN1bHRfb2JqWyJudW1iZXIiXTsKKyAgaWYgKGxlbmd0aChyZXN1bHRfb2JqWyJkZXNjcmlwdGlvbiJdKSkKKyAgICBkZXRhaWxzID0gZGV0YWlscyAiICIgcmVzdWx0X29ialsiZGVzY3JpcHRpb24iXQorCisgIGlmIChwbGFuX3NlZW4gPT0gTEFURV9QTEFOKQorICAgIHsKKyAgICAgIGRldGFpbHMgPSBkZXRhaWxzICIgIyBBRlRFUiBMQVRFIFBMQU4iOworICAgIH0KKyAgZWxzZSBpZiAocmVzdWx0X29ialsiaXNfdW5wbGFubmVkIl0pCisgICAgeworICAgICAgIGRldGFpbHMgPSBkZXRhaWxzICIgIyBVTlBMQU5ORUQiOworICAgIH0KKyAgZWxzZSBpZiAocmVzdWx0X29ialsibnVtYmVyIl0gIT0gdGVzdG5vKQorICAgIHsKKyAgICAgICBkZXRhaWxzID0gc3ByaW50ZigiJXMgIyBPVVQtT0YtT1JERVIgKGV4cGVjdGluZyAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMsIHRlc3Rubyk7CisgICAgfQorICBlbHNlIGlmIChyZXN1bHRfb2JqWyJkaXJlY3RpdmUiXSkKKyAgICB7CisgICAgICBkZXRhaWxzID0gZGV0YWlscyAiICMgIiByZXN1bHRfb2JqWyJkaXJlY3RpdmUiXTsKKyAgICAgIGlmIChsZW5ndGgocmVzdWx0X29ialsiZXhwbGFuYXRpb24iXSkpCisgICAgICAgIGRldGFpbHMgPSBkZXRhaWxzICIgIiByZXN1bHRfb2JqWyJleHBsYW5hdGlvbiJdCisgICAgfQorCisgIHJlcG9ydChzdHJpbmdpZnlfcmVzdWx0X29iaihyZXN1bHRfb2JqKSwgZGV0YWlscykKK30KKworIyBgc2tpcF9yZWFzb25gIHNob3VsZCBiZSBlbXB0eSB3aGVuZXZlciBwbGFubmVkID4gMC4KK2Z1bmN0aW9uIGhhbmRsZV90YXBfcGxhbihwbGFubmVkLCBza2lwX3JlYXNvbikKK3sKKyAgcGxhbm5lZCArPSAwICMgQXZvaWQgZ2V0dGluZyBjb25mdXNlZCBpZiwgc2F5LCBgcGxhbm5lZGAgaXMgIjAwIgorICBpZiAobGVuZ3RoKHNraXBfcmVhc29uKSAmJiBwbGFubmVkID4gMCkKKyAgICBhYm9ydCgiaW4gZnVuY3Rpb24gaGFuZGxlX3RhcF9wbGFuKCkiKQorICBpZiAocGxhbl9zZWVuKQorICAgIHsKKyAgICAgICMgRXJyb3IsIG9ubHkgb25lIHBsYW4gcGVyIHN0cmVhbSBpcyBhY2NlcHRhYmxlLgorICAgICAgdGVzdHN1aXRlX2Vycm9yKCJtdWx0aXBsZSB0ZXN0IHBsYW5zIikKKyAgICAgIHJldHVybjsKKyAgICB9CisgIHBsYW5uZWRfdGVzdHMgPSBwbGFubmVkCisgICMgVGhlIFRBUCBwbGFuIGNhbiBjb21lIGJlZm9yZSBvciBhZnRlciAqYWxsKiB0aGUgVEFQIHJlc3VsdHM7IHdlIHNwZWFrCisgICMgcmVzcGVjdGl2ZWx5IG9mIGFuICJlYXJseSIgb3IgYSAibGF0ZSIgcGxhbi4gIElmIHdlIHNlZSB0aGUgcGxhbiBsaW5lCisgICMgYWZ0ZXIgYXQgbGVhc3Qgb25lIFRBUCByZXN1bHQgaGFzIGJlZW4gc2VlbiwgYXNzdW1lIHdlIGhhdmUgYSBsYXRlCisgICMgcGxhbjsgaW4gdGhpcyBjYXNlLCBhbnkgZnVydGhlciB0ZXN0IHJlc3VsdCBzZWVuIGFmdGVyIHRoZSBwbGFuIHdpbGwKKyAgIyBiZSBmbGFnZ2VkIGFzIGFuIGVycm9yLgorICBwbGFuX3NlZW4gPSAodGVzdG5vID49IDEgPyBMQVRFX1BMQU4gOiBFQVJMWV9QTEFOKQorICAjIElmIHRlc3RubyA+IDAsIHdlIGhhdmUgYW4gZXJyb3IgKCJ0b28gbWFueSB0ZXN0cyBydW4iKSB0aGF0IHdpbGwgYmUKKyAgIyBhdXRvbWF0aWNhbGx5IGRlYWx0IHdpdGggbGF0ZXIsIHNvIGRvIG5vdCB3b3JyeSBhYm91dCBpdCBoZXJlLiAgSWYKKyAgIyAkcGxhbl9zZWVuIGlzIHRydWUsIHdlIGhhdmUgYW4gZXJyb3IgZHVlIHRvIGEgcmVwZWF0ZWQgcGxhbiwgYW5kIHRoYXQKKyAgIyBoYXMgYWxyZWFkeSBiZWVuIGRlYWx0IHdpdGggYWJvdmUuICBPdGhlcndpc2UsIHdlIGhhdmUgYSB2YWxpZCAicGxhbgorICAjIHdpdGggU0tJUCIgc3BlY2lmaWNhdGlvbiwgYW5kIHNob3VsZCByZXBvcnQgaXQgYXMgYSBwYXJ0aWN1bGFyIGtpbmQKKyAgIyBvZiBTS0lQIHJlc3VsdC4KKyAgaWYgKHBsYW5uZWQgPT0gMCAmJiB0ZXN0bm8gPT0gMCkKKyAgICB7CisgICAgICBpZiAobGVuZ3RoKHNraXBfcmVhc29uKSkKKyAgICAgICAgc2tpcF9yZWFzb24gPSAiLSAiICBza2lwX3JlYXNvbjsKKyAgICAgIHJlcG9ydCgiU0tJUCIsIHNraXBfcmVhc29uKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIGV4dHJhY3RfdGFwX2NvbW1lbnQobGluZSkKK3sKKyAgaWYgKGluZGV4KGxpbmUsIGRpYWdfc3RyaW5nKSA9PSAxKQorICAgIHsKKyAgICAgICMgU3RyaXAgbGVhZGluZyBgZGlhZ19zdHJpbmdgIGZyb20gYGxpbmVgLgorICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCBsZW5ndGgoZGlhZ19zdHJpbmcpICsgMSkKKyAgICAgICMgQW5kIHN0cmlwIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGxlZnQuCisgICAgICBzdWIoIl5bIFx0XSoiLCAiIiwgbGluZSkKKyAgICAgIHN1YigiWyBcdF0qJCIsICIiLCBsaW5lKQorICAgICAgIyBSZXR1cm4gd2hhdCBpcyBsZWZ0IChpZiBhbnkpLgorICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorICByZXR1cm4gIiI7Cit9CisKKyMgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgd2Uga25vdyB0aGF0IGxpbmUgaXMgYSBUQVAgcmVzdWx0IGxpbmUsCisjIHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgKHBlcmwpIFJFICJeKG5vdCApP29rXGIiLgorZnVuY3Rpb24gc2V0dXBfcmVzdWx0X29iaihsaW5lKQoreworICAjIEdldCB0aGUgcmVzdWx0LCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGxpbmUuCisgIHJlc3VsdF9vYmpbImlzX29rIl0gPSAoc3Vic3RyKGxpbmUsIDEsIDIpID09ICJvayIgPyAxIDogMCkKKyAgc3ViKCJeKG5vdCApP29rWyBcdF0qIiwgIiIsIGxpbmUpCisKKyAgIyBJZiB0aGUgcmVzdWx0IGhhcyBhbiBleHBsaWNpdCBudW1iZXIsIGdldCBpdCBhbmQgc3RyaXAgaXQ7IG90aGVyd2lzZSwKKyAgIyBhdXRvbWF0aWNhbGx5IGFzc2luZyB0aGUgbmV4dCBwcm9ncmVzaXZlIG51bWJlciB0byBpdC4KKyAgaWYgKGxpbmUgfiAvXlswLTldKyQvIHx8IGxpbmUgfiAvXlswLTldK1teYS16QS1aMC05X10vKQorICAgIHsKKyAgICAgIG1hdGNoKGxpbmUsICJeWzAtOV0rIikKKyAgICAgICMgVGhlIGZpbmFsIGArIDBgIGlzIHRvIG5vcm1hbGl6ZSBudW1iZXJzIHdpdGggbGVhZGluZyB6ZXJvcy4KKyAgICAgIHJlc3VsdF9vYmpbIm51bWJlciJdID0gc3Vic3RyKGxpbmUsIDEsIFJMRU5HVEgpICsgMAorICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCBSTEVOR1RIICsgMSkKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXN1bHRfb2JqWyJudW1iZXIiXSA9IHRlc3RubworICAgIH0KKworICBpZiAocGxhbl9zZWVuID09IExBVEVfUExBTikKKyAgICAjIE5vIGZ1cnRoZXIgdGVzdCByZXN1bHRzIGFyZSBhY2NlcHRhYmxlIGFmdGVyIGEgImxhdGUiIFRBUCBwbGFuCisgICAgIyBoYXMgYmVlbiBzZWVuLgorICAgIHJlc3VsdF9vYmpbImlzX3VucGxhbm5lZCJdID0gMQorICBlbHNlIGlmIChwbGFuX3NlZW4gJiYgdGVzdG5vID4gcGxhbm5lZF90ZXN0cykKKyAgICByZXN1bHRfb2JqWyJpc191bnBsYW5uZWQiXSA9IDEKKyAgZWxzZQorICAgIHJlc3VsdF9vYmpbImlzX3VucGxhbm5lZCJdID0gMAorCisgICMgU3RyaXAgdHJhaWxpbmcgYW5kIGxlYWRpbmcgd2hpdGVzcGFjZS4KKyAgc3ViKCJeWyBcdF0qIiwgIiIsIGxpbmUpCisgIHN1YigiWyBcdF0qJCIsICIiLCBsaW5lKQorCisgICMgVGhpcyB3aWxsIGhhdmUgdG8gYmUgY29ycmVjdGVkIGlmIHdlIGhhdmUgYSAiVE9ETyIvIlNLSVAiIGRpcmVjdGl2ZS4KKyAgcmVzdWx0X29ialsiZGVzY3JpcHRpb24iXSA9IGxpbmUKKyAgcmVzdWx0X29ialsiZGlyZWN0aXZlIl0gPSAiIgorICByZXN1bHRfb2JqWyJleHBsYW5hdGlvbiJdID0gIiIKKworICBpZiAoaW5kZXgobGluZSwgIiMiKSA9PSAwKQorICAgIHJldHVybiAjIE5vIHBvc3NpYmxlIGRpcmVjdGl2ZSwgbm90aGluZyBtb3JlIHRvIGRvLgorCisgICMgRGlyZWN0aXZlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4KKyAgcnggPSAiWyBcdF0qI1sgXHRdKihbdFRdW29PXVtkRF1bb09dfFtzU11ba0tdW2lJXVtwUF0pWyBcdF0qIgorCisgICMgU2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUgZGlyZWN0aXZlLCBhbmQgaWYgeWVzLCB3aGVyZS4KKyAgcG9zID0gbWF0Y2gobGluZSwgcnggIiQiKQorICBpZiAoIXBvcykKKyAgICBwb3MgPSBtYXRjaChsaW5lLCByeCAiW15hLXpBLVowLTlfXSIpCisKKyAgIyBJZiB0aGVyZSB3YXMgbm8gVEFQIGRpcmVjdGl2ZSwgd2UgaGF2ZSBub3RoaW5nIG1vcmUgdG8gZG8uCisgIGlmICghcG9zKQorICAgIHJldHVybgorCisgICMgTGV0YHMgbm93IHNlZSBpZiB0aGUgVEFQIGRpcmVjdGl2ZSBoYXMgYmVlbiBlc2NhcGVkLiAgRm9yIGV4YW1wbGU6CisgICMgIGVzY2FwZWQ6ICAgICBvayBcIyBTS0lQCisgICMgIG5vdCBlc2NhcGVkOiBvayBcXCMgU0tJUAorICAjICBlc2NhcGVkOiAgICAgb2sgXFxcXFwjIFNLSVAKKyAgIyAgbm90IGVzY2FwZWQ6IG9rIFwgIyBTS0lQCisgIGlmIChzdWJzdHIobGluZSwgcG9zLCAxKSA9PSAiIyIpCisgICAgeworICAgICAgYnNsYXNoX2NvdW50ID0gMAorICAgICAgZm9yIChpID0gcG9zOyBpID4gMSAmJiBzdWJzdHIobGluZSwgaSAtIDEsIDEpID09ICJcXCI7IGktLSkKKyAgICAgICAgYnNsYXNoX2NvdW50ICs9IDEKKyAgICAgIGlmIChic2xhc2hfY291bnQgJSAyKQorICAgICAgICByZXR1cm4gIyBEaXJlY3RpdmUgd2FzIGVzY2FwZWQuCisgICAgfQorCisgICMgU3RyaXAgdGhlIGRpcmVjdGl2ZSBhbmQgaXRzIGV4cGxhbmF0aW9uIChpZiBhbnkpIGZyb20gdGhlIHRlc3QKKyAgIyBkZXNjcmlwdGlvbi4KKyAgcmVzdWx0X29ialsiZGVzY3JpcHRpb24iXSA9IHN1YnN0cihsaW5lLCAxLCBwb3MgLSAxKQorICAjIE5vdyByZW1vdmUgdGhlIHRlc3QgZGVzY3JpcHRpb24gZnJvbSB0aGUgbGluZSwgdGhhdCBoYXMgYmVlbiBkZWFsdAorICAjIHdpdGggYWxyZWFkeS4KKyAgbGluZSA9IHN1YnN0cihsaW5lLCBwb3MpCisgICMgU3RyaXAgdGhlIGRpcmVjdGl2ZSwgYW5kIHNhdmUgaXRzIHZhbHVlIChub3JtYWxpemVkIHRvIHVwcGVyIGNhc2UpLgorICBzdWIoIl5bIFx0XSojWyBcdF0qIiwgIiIsIGxpbmUpCisgIHJlc3VsdF9vYmpbImRpcmVjdGl2ZSJdID0gdG91cHBlcihzdWJzdHIobGluZSwgMSwgNCkpCisgIGxpbmUgPSBzdWJzdHIobGluZSwgNSkKKyAgIyBOb3cgZ2V0IHRoZSBleHBsYW5hdGlvbiBmb3IgdGhlIGRpcmVjdGl2ZSAoaWYgYW55KSwgd2l0aCBsZWFkaW5nCisgICMgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC4KKyAgc3ViKCJeWyBcdF0qIiwgIiIsIGxpbmUpCisgIHN1YigiWyBcdF0qJCIsICIiLCBsaW5lKQorICByZXN1bHRfb2JqWyJleHBsYW5hdGlvbiJdID0gbGluZQorfQorCitmdW5jdGlvbiBnZXRfdGVzdF9leGl0X21lc3NhZ2Uoc3RhdHVzKQoreworICBpZiAoc3RhdHVzID09IDApCisgICAgcmV0dXJuICIiCisgIGlmIChzdGF0dXMgIX4gL15bMS05XVswLTldKiQvKQorICAgIGFib3J0KCJnZXR0aW5nIGV4aXQgc3RhdHVzIikKKyAgaWYgKHN0YXR1cyA8IDEyNykKKyAgICBleGl0X2RldGFpbHMgPSAiIgorICBlbHNlIGlmIChzdGF0dXMgPT0gMTI3KQorICAgIGV4aXRfZGV0YWlscyA9ICIgKGNvbW1hbmQgbm90IGZvdW5kPykiCisgIGVsc2UgaWYgKHN0YXR1cyA+PSAxMjggJiYgc3RhdHVzIDw9IDI1NSkKKyAgICBleGl0X2RldGFpbHMgPSBzcHJpbnRmKCIgKHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkPykiLCBzdGF0dXMgLSAxMjgpCisgIGVsc2UgaWYgKHN0YXR1cyA+IDI1NiAmJiBzdGF0dXMgPD0gMzg0KQorICAgICMgV2UgdXNlZCB0byByZXBvcnQgYW4gImFibm9ybWFsIHRlcm1pbmF0aW9uIiBoZXJlLCBidXQgc29tZSBLb3JuCisgICAgIyBzaGVsbHMsIHdoZW4gYSBjaGlsZCBwcm9jZXNzIGRpZSBkdWUgdG8gc2lnbmFsIG51bWJlciBuLCBjYW4gbGVhdmUKKyAgICAjIGluICQ/IGFuIGV4aXQgc3RhdHVzIG9mIDI1NituIGluc3RlYWQgb2YgdGhlIG1vcmUgc3RhbmRhcmQgMTI4K24uCisgICAgIyBBcHBhcmVudGx5LCBib3RoIGJlaGF2aW91cnMgYXJlIGFsbG93ZWQgYnkgUE9TSVggKDIwMDgpLCBzbyBiZQorICAgICMgcHJlcGFyZWQgdG8gaGFuZGxlIHRoZW0gYm90aC4gIFNlZSBhbHNvIEF1c3RpbmcgR3JvdXAgcmVwb3J0IElECisgICAgIyAwMDAwMDUxIDxodHRwOi8vd3d3LmF1c3Rpbmdyb3VwYnVncy5uZXQvdmlldy5waHA/aWQ9NTE+CisgICAgZXhpdF9kZXRhaWxzID0gc3ByaW50ZigiICh0ZXJtaW5hdGVkIGJ5IHNpZ25hbCAlZD8pIiwgc3RhdHVzIC0gMjU2KQorICBlbHNlCisgICAgIyBOZXZlciBzZWVuIGluIHByYWN0aWNlLgorICAgIGV4aXRfZGV0YWlscyA9ICIgKGFibm9ybWFsIHRlcm1pbmF0aW9uKSIKKyAgcmV0dXJuIHNwcmludGYoImV4aXRlZCB3aXRoIHN0YXR1cyAlZCVzIiwgc3RhdHVzLCBleGl0X2RldGFpbHMpCit9CisKK2Z1bmN0aW9uIHdyaXRlX3Rlc3RfcmVzdWx0cygpCit7CisgIHByaW50ICI6Z2xvYmFsLXRlc3QtcmVzdWx0OiAiIGdldF9nbG9iYWxfdGVzdF9yZXN1bHQoKSA+IHRyc19maWxlCisgIHByaW50ICI6cmVjaGVjazogIiAgeW4obXVzdF9yZWNoZWNrKCkpID4gdHJzX2ZpbGUKKyAgcHJpbnQgIjpjb3B5LWluLWdsb2JhbC1sb2c6ICIgeW4oY29weV9pbl9nbG9iYWxfbG9nKCkpID4gdHJzX2ZpbGUKKyAgZm9yIChpID0gMDsgaSA8IHRlc3RfcmVzdWx0c19pbmRleDsgaSArPSAxKQorICAgIHByaW50ICI6dGVzdC1yZXN1bHQ6ICIgdGVzdF9yZXN1bHRzX2xpc3RbaV0gPiB0cnNfZmlsZQorICBjbG9zZSh0cnNfZmlsZSk7Cit9CisKK0JFR0lOIHsKKworIyMgLS0tLS0tLSAjIworIyMgIFNFVFVQICAjIworIyMgLS0tLS0tLSAjIworCisnIiRpbml0X2NvbG9ycyInCisKKyMgUHJvcGVybHkgaW5pdGlhbGl6ZWQgb25jZSB0aGUgVEFQIHBsYW4gaXMgc2Vlbi4KK3BsYW5uZWRfdGVzdHMgPSAwCisKK0NPT0tFRF9QQVNTID0gZXhwZWN0X2ZhaWx1cmUgPyAiWFBBU1MiOiAiUEFTUyI7CitDT09LRURfRkFJTCA9IGV4cGVjdF9mYWlsdXJlID8gIlhGQUlMIjogIkZBSUwiOworCisjIEVudW1lcmF0aW9uLWxpa2UgY29uc3RhbnRzIHRvIHJlbWVtYmVyIHdoaWNoIGtpbmQgb2YgcGxhbiAoaWYgYW55KQorIyBoYXMgYmVlbiBzZWVuLiAgSXQgaXMgaW1wb3J0YW50IHRoYXQgTk9fUExBTiBldmFsdWF0ZXMgImZhbHNlIiBhcworIyBhIGJvb2xlYW4uCitOT19QTEFOID0gMAorRUFSTFlfUExBTiA9IDEKK0xBVEVfUExBTiA9IDIKKwordGVzdG5vID0gMCAgICAgIyBOdW1iZXIgb2YgdGVzdCByZXN1bHRzIHNlZW4gc28gZmFyLgorYmFpbGVkX291dCA9IDAgIyBXaGV0aGVyIGEgIkJhaWwgb3V0ISIgZGlyZWN0aXZlIGhhcyBiZWVuIHNlZW4uCisKKyMgV2hldGhlciB0aGUgVEFQIHBsYW4gaGFzIGJlZW4gc2VlbiBvciBub3QsIGFuZCBpZiB5ZXMsIHdoaWNoIGtpbmQKKyMgaXQgaXMgKCJlYXJseSIgaXMgc2VlbiBiZWZvcmUgYW55IHRlc3QgcmVzdWx0LCAibGF0ZSIgb3RoZXJ3aXNlKS4KK3BsYW5fc2VlbiA9IE5PX1BMQU4KKworIyMgLS0tLS0tLS0tICMjCisjIyAgUEFSU0lORyAgIyMKKyMjIC0tLS0tLS0tLSAjIworCitpc19maXJzdF9yZWFkID0gMQorCit3aGlsZSAoMSkKKyAgeworICAgICMgSW52b2x1dGlvbnMgcmVxdWlyZWQgc28gdGhhdCB3ZSBhcmUgYWJsZSB0byByZWFkIHRoZSBleGl0IHN0YXR1cworICAgICMgZnJvbSB0aGUgbGFzdCBpbnB1dCBsaW5lLgorICAgIHN0ID0gZ2V0bGluZQorICAgIGlmIChzdCA8IDApICMgSS9PIGVycm9yLgorICAgICAgZmF0YWwoIkkvTyBlcnJvciB3aGlsZSByZWFkaW5nIGZyb20gaW5wdXQgc3RyZWFtIikKKyAgICBlbHNlIGlmIChzdCA9PSAwKSAjIEVuZC1vZi1pbnB1dAorICAgICAgeworICAgICAgICBpZiAoaXNfZmlyc3RfcmVhZCkKKyAgICAgICAgICBhYm9ydCgiaW4gaW5wdXQgbG9vcDogb25seSBvbmUgaW5wdXQgbGluZSIpCisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgaWYgKGlzX2ZpcnN0X3JlYWQpCisgICAgICB7CisgICAgICAgIGlzX2ZpcnN0X3JlYWQgPSAwCisgICAgICAgIG5leHRsaW5lID0gJDAKKyAgICAgICAgY29udGludWUKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGN1cmxpbmUgPSBuZXh0bGluZQorICAgICAgICBuZXh0bGluZSA9ICQwCisgICAgICAgICQwID0gY3VybGluZQorICAgICAgfQorICAgICMgQ29weSBhbnkgaW5wdXQgbGluZSB2ZXJiYXRpbSBpbnRvIHRoZSBsb2cgZmlsZS4KKyAgICBwcmludCB8ICJjYXQgPiYzIgorICAgICMgUGFyc2luZyBvZiBUQVAgaW5wdXQgc2hvdWxkIHN0b3AgYWZ0ZXIgYSAiQmFpbCBvdXQhIiBkaXJlY3RpdmUuCisgICAgaWYgKGJhaWxlZF9vdXQpCisgICAgICBjb250aW51ZQorCisgICAgIyBUQVAgdGVzdCByZXN1bHQuCisgICAgaWYgKCQwIH4gL14obm90ICk/b2skLyB8fCAkMCB+IC9eKG5vdCApP29rW15hLXpBLVowLTlfXS8pCisgICAgICB7CisgICAgICAgIHRlc3RubyArPSAxCisgICAgICAgIHNldHVwX3Jlc3VsdF9vYmooJDApCisgICAgICAgIGhhbmRsZV90YXBfcmVzdWx0KCkKKyAgICAgIH0KKyAgICAjIFRBUCBwbGFuIChub3JtYWwgb3IgIlNLSVAiIHdpdGhvdXQgZXhwbGFuYXRpb24pLgorICAgIGVsc2UgaWYgKCQwIH4gL14xXC5cLlswLTldK1sgXHRdKiQvKQorICAgICAgeworICAgICAgICAjIFRoZSBuZXh0IHR3byBsaW5lcyB3aWxsIHB1dCB0aGUgbnVtYmVyIG9mIHBsYW5uZWQgdGVzdHMgaW4gJDAuCisgICAgICAgIHN1YigiXjFcXC5cXC4iLCAiIikKKyAgICAgICAgc3ViKCJbXjAtOV0qJCIsICIiKQorICAgICAgICBoYW5kbGVfdGFwX3BsYW4oJDAsICIiKQorICAgICAgICBjb250aW51ZQorICAgICAgfQorICAgICMgVEFQICJTS0lQIiBwbGFuLCB3aXRoIGFuIGV4cGxhbmF0aW9uLgorICAgIGVsc2UgaWYgKCQwIH4gL14xXC5cLjArWyBcdF0qIy8pCisgICAgICB7CisgICAgICAgICMgVGhlIG5leHQgbGluZXMgd2lsbCBwdXQgdGhlIHNraXAgZXhwbGFuYXRpb24gaW4gJDAsIHN0cmlwcGluZworICAgICAgICAjIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAgVGhpcyBpcyBhIGxpdHRsZSBtb3JlCisgICAgICAgICMgdHJpY2t5IGluIHRydXRoLCBzaW5jZSB3ZSB3YW50IHRvIGFsc28gc3RyaXAgYSBwb3RlbnRpYWwgbGVhZGluZworICAgICAgICAjICJTS0lQIiBzdHJpbmcgZnJvbSB0aGUgbWVzc2FnZS4KKyAgICAgICAgc3ViKCJeW14jXSojWyBcdF0qKFNLSVBbOiBcdF1bIFx0XSopPyIsICIiKQorICAgICAgICBzdWIoIlsgXHRdKiQiLCAiIik7CisgICAgICAgIGhhbmRsZV90YXBfcGxhbigwLCAkMCkKKyAgICAgIH0KKyAgICAjICJCYWlsIG91dCEiIG1hZ2ljLgorICAgICMgT2xkZXIgdmVyc2lvbnMgb2YgcHJvdmUgYW5kIFRBUDo6SGFybmVzcyAoZS5nLiwgMy4xNykgZGlkIG5vdAorICAgICMgcmVjb2duaXplIGEgIkJhaWwgb3V0ISIgZGlyZWN0aXZlIHdoZW4gcHJlY2VkZWQgYnkgbGVhZGluZworICAgICMgd2hpdGVzcGFjZSwgYnV0IG1vcmUgbW9kZXJuIHZlcnNpb25zIChlLmcuLCAzLjIzKSBkby4gIFNvIHdlCisgICAgIyBlbXVsYXRlIHRoZSBsYXR0ZXIsICJtb3JlIG1vZGVybiIgYmVoYXZpb3VyLgorICAgIGVsc2UgaWYgKCQwIH4gL15bIFx0XSpCYWlsIG91dCEvKQorICAgICAgeworICAgICAgICBiYWlsZWRfb3V0ID0gMQorICAgICAgICAjIEdldCB0aGUgYmFpbG91dCBtZXNzYWdlIChpZiBhbnkpLCB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nCisgICAgICAgICMgd2hpdGVzcGFjZSBzdHJpcHBlZC4gIFRoZSBtZXNzYWdlIHJlbWFpbnMgc3RvcmVkIGluIGAkMGAuCisgICAgICAgIHN1YigiXlsgXHRdKkJhaWwgb3V0IVsgXHRdKiIsICIiKTsKKyAgICAgICAgc3ViKCJbIFx0XSokIiwgIiIpOworICAgICAgICAjIEZvcm1hdCB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlCisgICAgICAgIGJhaWxvdXRfbWVzc2FnZSA9ICJCYWlsIG91dCEiCisgICAgICAgIGlmIChsZW5ndGgoJDApKQorICAgICAgICAgIGJhaWxvdXRfbWVzc2FnZSA9IGJhaWxvdXRfbWVzc2FnZSAiICIgJDAKKyAgICAgICAgdGVzdHN1aXRlX2Vycm9yKGJhaWxvdXRfbWVzc2FnZSkKKyAgICAgIH0KKyAgICAjIE1heWJlIHdlIGhhdmUgdG9vIGxvb2sgZm9yIGRpYW5vZ3RpYyBjb21tZW50cyB0b28uCisgICAgZWxzZSBpZiAoY29tbWVudHMgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgY29tbWVudCA9IGV4dHJhY3RfdGFwX2NvbW1lbnQoJDApOworICAgICAgICBpZiAobGVuZ3RoKGNvbW1lbnQpKQorICAgICAgICAgIHJlcG9ydCgiIyIsIGNvbW1lbnQpOworICAgICAgfQorICB9CisKKyMjIC0tLS0tLS0tICMjCisjIyAgRklOSVNIICAjIworIyMgLS0tLS0tLS0gIyMKKworIyBBICJCYWlsIG91dCEiIGRpcmVjdGl2ZSBzaG91bGQgY2F1c2UgdXMgdG8gaWdub3JlIGFueSBmb2xsb3dpbmcgVEFQCisjIGVycm9yLCBhcyB3ZWxsIGFzIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMgZnJvbSB0aGUgVEFQIHByb2R1Y2VyLgoraWYgKCFiYWlsZWRfb3V0KQorICB7CisgICAgaWYgKCFwbGFuX3NlZW4pCisgICAgICB7CisgICAgICAgIHRlc3RzdWl0ZV9lcnJvcigibWlzc2luZyB0ZXN0IHBsYW4iKQorICAgICAgfQorICAgIGVsc2UgaWYgKHBsYW5uZWRfdGVzdHMgIT0gdGVzdG5vKQorICAgICAgeworICAgICAgICBiYWRfYW1vdW50ID0gdGVzdG5vID4gcGxhbm5lZF90ZXN0cyA/ICJtYW55IiA6ICJmZXciCisgICAgICAgIHRlc3RzdWl0ZV9lcnJvcihzcHJpbnRmKCJ0b28gJXMgdGVzdHMgcnVuIChleHBlY3RlZCAlZCwgZ290ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZF9hbW91bnQsIHBsYW5uZWRfdGVzdHMsIHRlc3RubykpCisgICAgICB9CisgICAgaWYgKCFpZ25vcmVfZXhpdCkKKyAgICAgIHsKKyAgICAgICAgIyBGZXRjaCBleGl0IHN0YXR1cyBmcm9tIHRoZSBsYXN0IGxpbmUuCisgICAgICAgIGV4aXRfbWVzc2FnZSA9IGdldF90ZXN0X2V4aXRfbWVzc2FnZShuZXh0bGluZSkKKyAgICAgICAgaWYgKGV4aXRfbWVzc2FnZSkKKyAgICAgICAgICB0ZXN0c3VpdGVfZXJyb3IoZXhpdF9tZXNzYWdlKQorICAgICAgfQorICB9CisKK3dyaXRlX3Rlc3RfcmVzdWx0cygpCisKK2V4aXQgMAorCit9ICMgRW5kIG9mICJCRUdJTiIgYmxvY2suCisnCisKKyMgVE9ETzogZG9jdW1lbnQgdGhhdCB3ZSBjb25zdW1lIHRoZSBmaWxlIGRlc2NyaXB0b3IgMyA6LSgKK30gMz4iJGxvZ19maWxlIgorCit0ZXN0ICQ/IC1lcSAwIHx8IGZhdGFsICJJL08gb3IgaW50ZXJuYWwgZXJyb3IiCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246IDIKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKKyMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggZTkzYTg1NS4uN2NjMWFjZCAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMzQ5NSw2ICszNDk1LDcgQEAKIAogCiAKKwogYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcvY29uZmlnLmgiCiAKIApAQCAtMzY2Nyw3ICszNjY4LDcgQEAKIAogTUFHSUNLX0xJQlJBUllfVkVSU0lPTl9JTkZPPSRNQUdJQ0tfTElCUkFSWV9DVVJSRU5UOiRNQUdJQ0tfTElCUkFSWV9SRVZJU0lPTjokTUFHSUNLX0xJQlJBUllfQUdFCiAKLU1BR0lDS19TVk5fUkVWSVNJT049ODkzNDo4OTUzTQorTUFHSUNLX1NWTl9SRVZJU0lPTj04OTgwOjg5OTVNCiAKIAogCkBAIC04MDgyLDYgKzgwODMsNDggQEAKICRhc19lY2hvICJubywgdXNpbmcgJExOX1MiID4mNjsgfQogZmkKIAorZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQVdLKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVdLIiA+JjUKKyRhc19lY2hvICIkQVdLIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBtYWxsb2MgZGVidWdnaW5nIGlzIHdhbnRlZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBpZiBtYWxsb2MgZGVidWdnaW5nIGlzIHdhbnRlZC4uLiAiID4mNjsgfQogCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggMmQ3MjY4ZC4uMGVlMjEyNyAxMDA3NTUKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMzEsNiArMzEsNyBAQAogQUNfSU5JVChbSW1hZ2VNYWdpY2tdLFttYWdpY2tfdmVyc2lvbl0sW2h0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3JnXSxbSW1hZ2VNYWdpY2tdKQogQUNfQ09ORklHX1NSQ0RJUihbTWFnaWNrQ29yZS9NYWdpY2tDb3JlLmhdKQogQUNfQ09ORklHX0FVWF9ESVIoW2NvbmZpZ10pCitBQ19SRVFVSVJFX0FVWF9GSUxFKFt0YXAtZHJpdmVyLnNoXSkKIEFDX0NPTkZJR19NQUNST19ESVIoW200XSkKIEFDX0NPTkZJR19MSUJPQkpfRElSKFtsdGRsXSkKIEFDX0NPTkZJR19IRUFERVJTKFtjb25maWcvY29uZmlnLmhdKQpAQCAtMjY4LDYgKzI2OSw3IEBACiBBQ19QUk9HX0lOU1RBTEwKIEFDX1BST0dfTUFLRV9TRVQKIEFDX1BST0dfTE5fUworQUNfUFJPR19BV0sKIEFNX1dJVEhfRE1BTExPQwogQVhfQ19fX0FUVFJJQlVURV9fCiBBWF9HQ0NfQVJDSEZMQUcoW25vXSkK