ZGlmZiAtLWdpdCBhL0RlbW8vcGFyc2VyL3VucGFyc2UucHkgYi9EZW1vL3BhcnNlci91bnBhcnNlLnB5CmluZGV4IGRkNzVjMjIuLjUxMGNkYjAgMTAwNjQ0Ci0tLSBhL0RlbW8vcGFyc2VyL3VucGFyc2UucHkKKysrIGIvRGVtby9wYXJzZXIvdW5wYXJzZS5weQpAQCAtMSw1ICsxLDggQEAKICJVc2FnZTogdW5wYXJzZS5weSA8cGF0aCB0byBzb3VyY2UgZmlsZT4iCiBpbXBvcnQgc3lzCitpbXBvcnQgX2FzdAoraW1wb3J0IGNTdHJpbmdJTworaW1wb3J0IG9zCiAKIGNsYXNzIFVucGFyc2VyOgogICAgICIiIk1ldGhvZHMgaW4gdGhpcyBjbGFzcyByZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBBU1QgYW5kCkBAIC03MCw2ICs3MywxOCBAQAogICAgICAgICAgICAgaWYgYS5hc25hbWU6CiAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiIGFzICIrYS5hc25hbWUpCiAKKyAgICBkZWYgX0ltcG9ydEZyb20oc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiZnJvbSAiKQorICAgICAgICBzZWxmLndyaXRlKHQubW9kdWxlKQorICAgICAgICBzZWxmLndyaXRlKCIgaW1wb3J0ICIpCisgICAgICAgIGZvciBpLCBhIGluIGVudW1lcmF0ZSh0Lm5hbWVzKToKKyAgICAgICAgICAgIGlmIGkgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIsICIpCisgICAgICAgICAgICBzZWxmLndyaXRlKGEubmFtZSkKKyAgICAgICAgICAgIGlmIGEuYXNuYW1lOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiBhcyAiK2EuYXNuYW1lKQorICAgICAgICAjIFhYWChqcGUpIHdoYXQgaXMgbGV2ZWwgZm9yPworCiAgICAgZGVmIF9Bc3NpZ24oc2VsZiwgdCk6CiAgICAgICAgIHNlbGYuZmlsbCgpCiAgICAgICAgIGZvciB0YXJnZXQgaW4gdC50YXJnZXRzOgpAQCAtODgsNiArMTAzLDM2IEBACiAgICAgICAgIGlmIHQudmFsdWU6CiAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQudmFsdWUpCiAKKyAgICBkZWYgX1Bhc3Moc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgicGFzcyIpCisKKyAgICBkZWYgX0JyZWFrKHNlbGYsIHQpOgorICAgICAgICBzZWxmLmZpbGwoImJyZWFrIikKKworICAgIGRlZiBfQ29udGludWUoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiY29udGludWUiKQorCisgICAgZGVmIF9EZWxldGUoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiZGVsICIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC50YXJnZXRzKQorCisgICAgZGVmIF9Bc3NlcnQoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiYXNzZXJ0ICIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC50ZXN0KQorICAgICAgICBpZiB0Lm1zZzoKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIiwgIikKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5tc2cpCisKKyAgICBkZWYgX0V4ZWMoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiZXhlYyAiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQuYm9keSkKKyAgICAgICAgaWYgdC5nbG9iYWxzOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiIGluICIpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQuZ2xvYmFscykKKyAgICAgICAgaWYgdC5sb2NhbHM6CisgICAgICAgICAgICBzZWxmLndyaXRlKCIsICIpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQubG9jYWxzKQorCiAgICAgZGVmIF9QcmludChzZWxmLCB0KToKICAgICAgICAgc2VsZi5maWxsKCJwcmludCAiKQogICAgICAgICBkb19jb21tYSA9IEZhbHNlCkBAIC0xMDIsNiArMTQ3LDY3IEBACiAgICAgICAgIGlmIG5vdCB0Lm5sOgogICAgICAgICAgICAgc2VsZi53cml0ZSgiLCIpCiAKKyAgICBkZWYgX0dsb2JhbChzZWxmLCB0KToKKyAgICAgICAgc2VsZi5maWxsKCJnbG9iYWwiKQorICAgICAgICBmb3IgaSwgbiBpbiBlbnVtZXJhdGUodC5uYW1lcyk6CisgICAgICAgICAgICBpZiBpICE9IDA6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLCIpCisgICAgICAgICAgICBzZWxmLndyaXRlKCIgIiArIG4pCisKKyAgICBkZWYgX1lpZWxkKHNlbGYsIHQpOgorICAgICAgICBzZWxmLmZpbGwoInlpZWxkIikKKyAgICAgICAgaWYgdC52YWx1ZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIiAoIikKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC52YWx1ZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIikiKQorCisgICAgZGVmIF9SYWlzZShzZWxmLCB0KToKKyAgICAgICAgc2VsZi5maWxsKCdyYWlzZSAnKQorICAgICAgICBpZiB0LnR5cGU6CisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQudHlwZSkKKyAgICAgICAgaWYgdC5pbnN0OgorICAgICAgICAgICAgc2VsZi53cml0ZSgiLCAiKQorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaCh0Lmluc3QpCisgICAgICAgIGlmIHQudGJhY2s6CisgICAgICAgICAgICBzZWxmLndyaXRlKCIsICIpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQudGJhY2spCisKKyAgICBkZWYgX1RyeUV4Y2VwdChzZWxmLCB0KToKKyAgICAgICAgc2VsZi5maWxsKCJ0cnkiKQorICAgICAgICBzZWxmLmVudGVyKCkKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LmJvZHkpCisgICAgICAgIHNlbGYubGVhdmUoKQorCisgICAgICAgIGZvciBleCBpbiB0LmhhbmRsZXJzOgorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaChleCkKKyAgICAgICAgaWYgdC5vcmVsc2U6CisgICAgICAgICAgICBzZWxmLmZpbGwoImVsc2UiKQorICAgICAgICAgICAgc2VsZi5lbnRlcigpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQub3JlbHNlKQorICAgICAgICAgICAgc2VsZi5sZWF2ZSgpCisKKyAgICBkZWYgX1RyeUZpbmFsbHkoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgidHJ5IikKKyAgICAgICAgc2VsZi5lbnRlcigpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5ib2R5KQorICAgICAgICBzZWxmLmxlYXZlKCkKKworICAgICAgICBzZWxmLmZpbGwoImZpbmFsbHkiKQorICAgICAgICBzZWxmLmVudGVyKCkKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LmZpbmFsYm9keSkKKyAgICAgICAgc2VsZi5sZWF2ZSgpCisKKyAgICBkZWYgX2V4Y2VwdGhhbmRsZXIoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiZXhjZXB0ICIpCisgICAgICAgIGlmIHQudHlwZToKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC50eXBlKQorICAgICAgICBpZiB0Lm5hbWU6CisgICAgICAgICAgICBzZWxmLndyaXRlKCIsICIpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQubmFtZSkKKyAgICAgICAgc2VsZi5lbnRlcigpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5ib2R5KQorICAgICAgICBzZWxmLmxlYXZlKCkKKwogICAgIGRlZiBfQ2xhc3NEZWYoc2VsZiwgdCk6CiAgICAgICAgIHNlbGYud3JpdGUoIlxuIikKICAgICAgICAgc2VsZi5maWxsKCJjbGFzcyAiK3QubmFtZSkKQEAgLTExOSwyMyArMjI1LDExIEBACiAgICAgICAgIHNlbGYud3JpdGUoIlxuIikKICAgICAgICAgc2VsZi5maWxsKCJkZWYgIit0Lm5hbWUgKyAiKCIpCiAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5hcmdzKQorICAgICAgICBzZWxmLndyaXRlKCIpIikKICAgICAgICAgc2VsZi5lbnRlcigpCiAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5ib2R5KQogICAgICAgICBzZWxmLmxlYXZlKCkKIAotICAgIGRlZiBfSWYoc2VsZiwgdCk6Ci0gICAgICAgIHNlbGYuZmlsbCgiaWYgIikKLSAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnRlc3QpCi0gICAgICAgIHNlbGYuZW50ZXIoKQotICAgICAgICAjIFhYWCBlbGlmPwotICAgICAgICBzZWxmLmRpc3BhdGNoKHQuYm9keSkKLSAgICAgICAgc2VsZi5sZWF2ZSgpCi0gICAgICAgIGlmIHQub3JlbHNlOgotICAgICAgICAgICAgc2VsZi5maWxsKCJlbHNlIikKLSAgICAgICAgICAgIHNlbGYuZW50ZXIoKQotICAgICAgICAgICAgc2VsZi5kaXNwYXRjaCh0Lm9yZWxzZSkKLSAgICAgICAgICAgIHNlbGYubGVhdmUoKQotCiAgICAgZGVmIF9Gb3Ioc2VsZiwgdCk6CiAgICAgICAgIHNlbGYuZmlsbCgiZm9yICIpCiAgICAgICAgIHNlbGYuZGlzcGF0Y2godC50YXJnZXQpCkBAIC0xNTAsNiArMjQ0LDQxIEBACiAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQub3JlbHNlKQogICAgICAgICAgICAgc2VsZi5sZWF2ZQogCisgICAgZGVmIF9JZihzZWxmLCB0KToKKyAgICAgICAgc2VsZi5maWxsKCJpZiAiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQudGVzdCkKKyAgICAgICAgc2VsZi5lbnRlcigpCisgICAgICAgICMgWFhYIGVsaWY/CisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5ib2R5KQorICAgICAgICBzZWxmLmxlYXZlKCkKKyAgICAgICAgaWYgdC5vcmVsc2U6CisgICAgICAgICAgICBzZWxmLmZpbGwoImVsc2UiKQorICAgICAgICAgICAgc2VsZi5lbnRlcigpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQub3JlbHNlKQorICAgICAgICAgICAgc2VsZi5sZWF2ZSgpCisKKyAgICBkZWYgX1doaWxlKHNlbGYsIHQpOgorICAgICAgICBzZWxmLmZpbGwoIndoaWxlICIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC50ZXN0KQorICAgICAgICBzZWxmLmVudGVyKCkKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LmJvZHkpCisgICAgICAgIHNlbGYubGVhdmUoKQorICAgICAgICBpZiB0Lm9yZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmlsbCgiZWxzZSIpCisgICAgICAgICAgICBzZWxmLmVudGVyKCkKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5vcmVsc2UpCisgICAgICAgICAgICBzZWxmLmxlYXZlCisKKyAgICBkZWYgX1dpdGgoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgid2l0aCAiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQuY29udGV4dF9leHByKQorICAgICAgICBpZiB0Lm9wdGlvbmFsX3ZhcnM6CisgICAgICAgICAgICBzZWxmLndyaXRlKCIgYXMgIikKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5vcHRpb25hbF92YXJzKQorICAgICAgICBzZWxmLmVudGVyKCkKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LmJvZHkpCisgICAgICAgIHNlbGYubGVhdmUoKQorCiAgICAgIyBleHByCiAgICAgZGVmIF9TdHIoc2VsZiwgdHJlZSk6CiAgICAgICAgIHNlbGYud3JpdGUocmVwcih0cmVlLnMpKQpAQCAtMTU3LDYgKzI4NiwxMSBAQAogICAgIGRlZiBfTmFtZShzZWxmLCB0KToKICAgICAgICAgc2VsZi53cml0ZSh0LmlkKQogCisgICAgZGVmIF9SZXByKHNlbGYsIHQpOgorICAgICAgICBzZWxmLndyaXRlKCJgIikKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnZhbHVlKQorICAgICAgICBzZWxmLndyaXRlKCJgIikKKwogICAgIGRlZiBfTnVtKHNlbGYsIHQpOgogICAgICAgICBzZWxmLndyaXRlKHJlcHIodC5uKSkKIApAQCAtMTY3LDYgKzMwMSwzNyBAQAogICAgICAgICAgICAgc2VsZi53cml0ZSgiLCAiKQogICAgICAgICBzZWxmLndyaXRlKCJdIikKIAorICAgIGRlZiBfTGlzdENvbXAoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoIlsiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQuZWx0KQorICAgICAgICBmb3IgZ2VuIGluIHQuZ2VuZXJhdG9yczoKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2goZ2VuKQorICAgICAgICBzZWxmLndyaXRlKCJdIikKKworICAgIGRlZiBfR2VuZXJhdG9yRXhwKHNlbGYsIHQpOgorICAgICAgICBzZWxmLndyaXRlKCIoIikKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LmVsdCkKKyAgICAgICAgZm9yIGdlbiBpbiB0LmdlbmVyYXRvcnM6CisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGdlbikKKyAgICAgICAgc2VsZi53cml0ZSgiKSIpCisKKyAgICBkZWYgX2NvbXByZWhlbnNpb24oc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoIiBmb3IgIikKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnRhcmdldCkKKyAgICAgICAgc2VsZi53cml0ZSgiIGluICIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5pdGVyKQorICAgICAgICBmb3IgaWZfY2xhdXNlIGluIHQuaWZzOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiIGlmICIpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGlmX2NsYXVzZSkKKworICAgIGRlZiBfSWZFeHAoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5ib2R5KQorICAgICAgICBzZWxmLndyaXRlKCIgaWYgIikKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnRlc3QpCisgICAgICAgIGlmIHQub3JlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiIGVsc2UgIikKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5vcmVsc2UpCisKICAgICBkZWYgX0RpY3Qoc2VsZiwgdCk6CiAgICAgICAgIHNlbGYud3JpdGUoInsiKQogICAgICAgICBmb3Igayx2IGluIHppcCh0LmtleXMsIHQudmFsdWVzKToKQEAgLTE5NCw4ICszNTksOCBAQAogICAgICAgICBzZWxmLndyaXRlKCIpIikKIAogICAgIGJpbm9wID0geyAiQWRkIjoiKyIsICJTdWIiOiItIiwgIk11bHQiOiIqIiwgIkRpdiI6Ii8iLCAiTW9kIjoiJSIsCi0gICAgICAgICAgICAgICAgICAgICJSU2hpZnQiOiI8PCIsICJCaXRPciI6InwiLCAiQml0WG9yIjoiXiIsICJCaXRBbmQiOiImIiwKLSAgICAgICAgICAgICAgICAgICAgIkZsb29yRGl2IjoiLy8ifQorICAgICAgICAgICAgICAgICAgICAiTFNoaWZ0IjoiPj4iLCAiUlNoaWZ0IjoiPDwiLCAiQml0T3IiOiJ8IiwgIkJpdFhvciI6Il4iLCAiQml0QW5kIjoiJiIsCisgICAgICAgICAgICAgICAgICAgICJGbG9vckRpdiI6Ii8vIiwgIlBvdyI6ICIqKiJ9CiAgICAgZGVmIF9CaW5PcChzZWxmLCB0KToKICAgICAgICAgc2VsZi53cml0ZSgiKCIpCiAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5sZWZ0KQpAQCAtMjEzLDYgKzM3OCwxNSBAQAogICAgICAgICAgICAgc2VsZi5kaXNwYXRjaChlKQogICAgICAgICAgICAgc2VsZi53cml0ZSgiKSIpCiAKKyAgICBib29sb3BzID0ge19hc3QuQW5kOiAnYW5kJywgX2FzdC5PcjogJ29yJ30KKyAgICBkZWYgX0Jvb2xPcChzZWxmLCB0KToKKyAgICAgICAgc2VsZi53cml0ZSgiKCIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC52YWx1ZXNbMF0pCisgICAgICAgIGZvciB2IGluIHQudmFsdWVzWzE6XToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIiAlcyAiICUgc2VsZi5ib29sb3BzW3Qub3AuX19jbGFzc19fXSkKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godikKKyAgICAgICAgc2VsZi53cml0ZSgiKSIpCisKICAgICBkZWYgX0F0dHJpYnV0ZShzZWxmLHQpOgogICAgICAgICBzZWxmLmRpc3BhdGNoKHQudmFsdWUpCiAgICAgICAgIHNlbGYud3JpdGUoIi4iKQpAQCAtMjM0LDEyICs0MDgsMTIgQEAKICAgICAgICAgICAgIGlmIGNvbW1hOiBzZWxmLndyaXRlKCIsICIpCiAgICAgICAgICAgICBlbHNlOiBjb21tYSA9IFRydWUKICAgICAgICAgICAgIHNlbGYud3JpdGUoIioiKQotICAgICAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnN0YXJhcmcpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQuc3RhcmFyZ3MpCiAgICAgICAgIGlmIHQua3dhcmdzOgogICAgICAgICAgICAgaWYgY29tbWE6IHNlbGYud3JpdGUoIiwgIikKICAgICAgICAgICAgIGVsc2U6IGNvbW1hID0gVHJ1ZQogICAgICAgICAgICAgc2VsZi53cml0ZSgiKioiKQotICAgICAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnN0YXJhcmcpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQua3dhcmdzKQogICAgICAgICBzZWxmLndyaXRlKCIpIikKIAogICAgIGRlZiBfU3Vic2NyaXB0KHNlbGYsIHQpOgpAQCAtMjQ5LDYgKzQyMyw5IEBACiAgICAgICAgIHNlbGYud3JpdGUoIl0iKQogCiAgICAgIyBzbGljZQorICAgIGRlZiBfRWxsaXBzaXMoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoIi4uLiIpCisKICAgICBkZWYgX0luZGV4KHNlbGYsIHQpOgogICAgICAgICBzZWxmLmRpc3BhdGNoKHQudmFsdWUpCiAKQEAgLTI2Miw2ICs0MzksMTIgQEAKICAgICAgICAgICAgIHNlbGYud3JpdGUoIjoiKQogICAgICAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnN0ZXApCiAKKyAgICBkZWYgX0V4dFNsaWNlKHNlbGYsIHQpOgorICAgICAgICBmb3IgaSwgZCBpbiBlbnVtZXJhdGUodC5kaW1zKToKKyAgICAgICAgICAgIGlmIGkgIT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCc6ICcpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGQpCisKICAgICAjIG90aGVycwogICAgIGRlZiBfYXJndW1lbnRzKHNlbGYsIHQpOgogICAgICAgICBmaXJzdCA9IFRydWUKQEAgLTI4MywxMyArNDY2LDUxIEBACiAgICAgICAgIGlmIHQua3dhcmc6CiAgICAgICAgICAgICBpZiBmaXJzdDpmaXJzdCA9IEZhbHNlCiAgICAgICAgICAgICBlbHNlOiBzZWxmLndyaXRlKCIsICIpCi0gICAgICAgICAgICBzZWxmLndyaXRlKCIqKiIrc2VsZi5rd2FyZykKLSAgICAgICAgc2VsZi53cml0ZSgiKSIpCisgICAgICAgICAgICBzZWxmLndyaXRlKCIqKiIrdC5rd2FyZykKIAotZGVmIHJvdW5kdHJpcChmaWxlbmFtZSk6CisgICAgZGVmIF9rZXl3b3JkKHNlbGYsIHQpOgorICAgICAgICBzZWxmLndyaXRlKHQuYXJnKQorICAgICAgICBzZWxmLndyaXRlKCI9IikKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnZhbHVlKQorCisgICAgZGVmIF9MYW1iZGEoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoImxhbWJkYSAiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQuYXJncykKKyAgICAgICAgc2VsZi53cml0ZSgiOiAiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQuYm9keSkKKworZGVmIHJvdW5kdHJpcChmaWxlbmFtZSwgb3V0cHV0PXN5cy5zdGRvdXQpOgogICAgIHNvdXJjZSA9IG9wZW4oZmlsZW5hbWUpLnJlYWQoKQogICAgIHRyZWUgPSBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsICJleGVjIiwgMHg0MDApCi0gICAgVW5wYXJzZXIodHJlZSkKKyAgICBVbnBhcnNlcih0cmVlLCBvdXRwdXQpCisKKworCitkZWYgdGVzdGRpcihhKToKKyAgICB0cnk6CisgICAgICAgIG5hbWVzID0gW24gZm9yIG4gaW4gb3MubGlzdGRpcihhKSBpZiBuLmVuZHN3aXRoKCcucHknKV0KKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkRpcmVjdG9yeSBub3QgcmVhZGFibGU6ICVzIiAlIGEKKyAgICBlbHNlOgorICAgICAgICBmb3IgbiBpbiBuYW1lczoKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGEsIG4pCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmdWxsbmFtZSk6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICBwcmludCAnVGVzdGluZyAlcycgJSBmdWxsbmFtZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcm91bmR0cmlwKGZ1bGxuYW1lLCBvdXRwdXQpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyAgRmFpbGVkIHRvIGNvbXBpbGUsIGV4Y2VwdGlvbiBpcyAlcycgJSByZXByKGUpCisgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpOgorICAgICAgICAgICAgICAgIHRlc3RkaXIoZnVsbG5hbWUpCisKK2RlZiBtYWluKGFyZ3MpOgorICAgIGlmIGFyZ3NbMF0gPT0gJy0tdGVzdGRpcic6CisgICAgICAgIGZvciBhIGluIGFyZ3NbMTpdOgorICAgICAgICAgICAgdGVzdGRpcihhKQorICAgIGVsc2U6CisgICAgICAgIGZvciBhIGluIGFyZ3M6CisgICAgICAgICAgICByb3VuZHRyaXAoYSkKIAogaWYgX19uYW1lX189PSdfX21haW5fXyc6Ci0gICAgcm91bmR0cmlwKHN5cy5hcmd2WzFdKQorICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvRGVtby9wZGlzdC9tYWtlY2hhbmdlbG9nLnB5IGIvRGVtby9wZGlzdC9tYWtlY2hhbmdlbG9nLnB5CmluZGV4IGIyNmYzMGIuLjFmZmE1ODggMTAwNzU1Ci0tLSBhL0RlbW8vcGRpc3QvbWFrZWNoYW5nZWxvZy5weQorKysgYi9EZW1vL3BkaXN0L21ha2VjaGFuZ2Vsb2cucHkKQEAgLTYsNyArNiw3IEBACiAKIGltcG9ydCBzeXMKIGltcG9ydCBzdHJpbmcKLWltcG9ydCByZWdleAoraW1wb3J0IHJlCiBpbXBvcnQgZ2V0b3B0CiBpbXBvcnQgdGltZQogCkBAIC0zNSw5ICszNSw5IEBACiAgICAgZm9yIHJldiBpbiBhbGxyZXZzOgogICAgICAgICBmb3JtYXRyZXYocmV2LCBwcmVmaXgpCiAKLXBhcnNlZGF0ZXByb2cgPSByZWdleC5jb21waWxlKAotICAgICdeZGF0ZTogXChbMC05XStcKS9cKFswLTldK1wpL1woWzAtOV0rXCkgJyArCi0gICAgJ1woWzAtOV0rXCk6XChbMC05XStcKTpcKFswLTldK1wpOyAgYXV0aG9yOiBcKFteIDtdK1wpJykKK3BhcnNlZGF0ZXByb2cgPSByZS5jb21waWxlKAorICAgICdeZGF0ZTogKFswLTldKykvKFswLTldKykvKFswLTldKykgJyArCisgICAgJyhbMC05XSspOihbMC05XSspOihbMC05XSspOyAgYXV0aG9yOiAoW14gO10rKScpCiAKIGF1dGhvcm1hcCA9IHsKICAgICAnZ3VpZG8nOiAnR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPicsCkBAIC03MCw3ICs3MCw3IEBACiAgICAgICAgIHByaW50CiAgICAgICAgIHByaW50CiAKLXN0YXJ0cHJvZyA9IHJlZ2V4LmNvbXBpbGUoIl5Xb3JraW5nIGZpbGU6IFwoLipcKSQiKQorc3RhcnRwcm9nID0gcmUuY29tcGlsZSgiXldvcmtpbmcgZmlsZTogKC4qKSQiKQogCiBkZWYgZ2V0bmV4dGZpbGUoZik6CiAgICAgd2hpbGUgMToKZGlmZiAtLWdpdCBhL0RlbW8vcGRpc3QvcmNzYnVtcCBiL0RlbW8vcGRpc3QvcmNzYnVtcAppbmRleCBlNGU5ZWQ1Li40ZmEwNzhlIDEwMDc1NQotLS0gYS9EZW1vL3BkaXN0L3Jjc2J1bXAKKysrIGIvRGVtby9wZGlzdC9yY3NidW1wCkBAIC02LDEyICs2LDEyIEBACiAjIFB5dGhvbiBzY3JpcHQgZm9yIGJ1bXBpbmcgdXAgYW4gUkNTIG1ham9yIHJldmlzaW9uIG51bWJlci4KIAogaW1wb3J0IHN5cwotaW1wb3J0IHJlZ2V4CitpbXBvcnQgcmUKIGltcG9ydCByY3NsaWIKIGltcG9ydCBzdHJpbmcKIAogV0lUSExPQ0sgPSAxCi1tYWpvcnJldl9yZSA9IHJlZ2V4LmNvbXBpbGUoJ15bMC05XSsnKQorbWFqb3JyZXZfcmUgPSByZS5jb21waWxlKCdeWzAtOV0rJykKIAogZGlyID0gcmNzbGliLlJDUygpCiAKZGlmZiAtLWdpdCBhL0RlbW8vcGRpc3QvcmNzbGliLnB5IGIvRGVtby9wZGlzdC9yY3NsaWIucHkKaW5kZXggZDVmN2I2NS4uM2U2Mzg2OSAxMDA3NTUKLS0tIGEvRGVtby9wZGlzdC9yY3NsaWIucHkKKysrIGIvRGVtby9wZGlzdC9yY3NsaWIucHkKQEAgLTgsNyArOCw3IEBACiAKIGltcG9ydCBmbm1hdGNoCiBpbXBvcnQgb3MKLWltcG9ydCByZWdzdWIKK2ltcG9ydCByZQogaW1wb3J0IHN0cmluZwogaW1wb3J0IHRlbXBmaWxlCiAKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgICAgICAgICAgY21kID0gJ2NpICVzJXMgLXQlcyAlcyAlcycgJSBcCiAgICAgICAgICAgICAgICAgICAobG9ja2ZsYWcsIHJldiwgZi5uYW1lLCBvdGhlcmZsYWdzLCBuYW1lKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgbWVzc2FnZSA9IHJlZ3N1Yi5nc3ViKCdcKFtcXCIkYF1cKScsICdcXFxcXFwxJywgbWVzc2FnZSkKKyAgICAgICAgICAgIG1lc3NhZ2UgPSByZS5zdWIocicoW1wiJGBdKScsIHInXFxcMScsIG1lc3NhZ2UpCiAgICAgICAgICAgICBjbWQgPSAnY2kgJXMlcyAtbSIlcyIgJXMgJXMnICUgXAogICAgICAgICAgICAgICAgICAgKGxvY2tmbGFnLCByZXYsIG1lc3NhZ2UsIG90aGVyZmxhZ3MsIG5hbWUpCiAgICAgICAgIHJldHVybiBzZWxmLl9zeXN0ZW0oY21kKQpkaWZmIC0tZ2l0IGEvRGVtby9zY3JpcHRzL2VxZml4LnB5IGIvRGVtby9zY3JpcHRzL2VxZml4LnB5CmluZGV4IDE2NWNhNDkuLjM1YzQzYWEgMTAwNzU1Ci0tLSBhL0RlbW8vc2NyaXB0cy9lcWZpeC5weQorKysgYi9EZW1vL3NjcmlwdHMvZXFmaXgucHkKQEAgLTI5LDcgKzI5LDcgQEAKICMgaW50byBhIHByb2dyYW0gZm9yIGEgZGlmZmVyZW50IGNoYW5nZSB0byBQeXRob24gcHJvZ3JhbXMuLi4KIAogaW1wb3J0IHN5cwotaW1wb3J0IHJlZ2V4CitpbXBvcnQgcmUKIGltcG9ydCBvcwogZnJvbSBzdGF0IGltcG9ydCAqCiBpbXBvcnQgc3RyaW5nCkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgICAgICBpZiBmaXgoYXJnKTogYmFkID0gMQogICAgIHN5cy5leGl0KGJhZCkKIAotaXNweXRob25wcm9nID0gcmVnZXguY29tcGlsZSgnXlthLXpBLVowLTlfXStcLnB5JCcpCitpc3B5dGhvbnByb2cgPSByZS5jb21waWxlKCdeW2EtekEtWjAtOV9dK1wucHkkJykKIGRlZiBpc3B5dGhvbihuYW1lKToKICAgICByZXR1cm4gaXNweXRob25wcm9nLm1hdGNoKG5hbWUpID49IDAKIApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgIGlmIGxpbmVubyA9PSAxIGFuZCBnIGlzIE5vbmUgYW5kIGxpbmVbOjJdID09ICcjISc6CiAgICAgICAgICAgICAjIENoZWNrIGZvciBub24tUHl0aG9uIHNjcmlwdHMKICAgICAgICAgICAgIHdvcmRzID0gc3RyaW5nLnNwbGl0KGxpbmVbMjpdKQotICAgICAgICAgICAgaWYgd29yZHMgYW5kIHJlZ2V4LnNlYXJjaCgnW3BQXXl0aG9uJywgd29yZHNbMF0pIDwgMDoKKyAgICAgICAgICAgIGlmIHdvcmRzIGFuZCByZS5zZWFyY2goJ1twUF15dGhvbicsIHdvcmRzWzBdKSA8IDA6CiAgICAgICAgICAgICAgICAgbXNnID0gZmlsZW5hbWUgKyAnOiAnICsgd29yZHNbMF0KICAgICAgICAgICAgICAgICBtc2cgPSBtc2cgKyAnIHNjcmlwdDsgbm90IGZpeGVkXG4nCiAgICAgICAgICAgICAgICAgZXJyKG1zZykKZGlmZiAtLWdpdCBhL0RlbW8vc2NyaXB0cy9mdHBzdGF0cy5weSBiL0RlbW8vc2NyaXB0cy9mdHBzdGF0cy5weQppbmRleCBiMzdhNThkLi41YzE1OTllIDEwMDc1NQotLS0gYS9EZW1vL3NjcmlwdHMvZnRwc3RhdHMucHkKKysrIGIvRGVtby9zY3JpcHRzL2Z0cHN0YXRzLnB5CkBAIC0xMywxMiArMTMsMTIgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IHN0cmluZwogaW1wb3J0IGdldG9wdAogCi1wYXQgPSAnXlwoW2EtekEtWjAtOSA6XSpcKSFcKC4qXCkhXCguKlwpIVwoWzw+XS4qXCkhXChbMC05XStcKSFcKFswLTldK1wpJCcKLXByb2cgPSByZWdleC5jb21waWxlKHBhdCkKK3BhdCA9ICdeKFthLXpBLVowLTkgOl0qKSEoLiopISguKikhKFs8Pl0uKikhKFswLTldKykhKFswLTldKykkJworcHJvZyA9IHJlLmNvbXBpbGUocGF0KQogCiBkZWYgbWFpbigpOgogICAgIG1heGl0ZW1zID0gMjUKZGlmZiAtLWdpdCBhL0RlbW8vc2NyaXB0cy9tYm94Y29udmVydC5weSBiL0RlbW8vc2NyaXB0cy9tYm94Y29udmVydC5weQppbmRleCA1MDJkNzc0Li44YzQ2MmYzIDEwMDc1NQotLS0gYS9EZW1vL3NjcmlwdHMvbWJveGNvbnZlcnQucHkKKysrIGIvRGVtby9zY3JpcHRzL21ib3hjb252ZXJ0LnB5CkBAIC0xMCw3ICsxMCw3IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzdGF0CiBpbXBvcnQgZ2V0b3B0Ci1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogCiBkZWYgbWFpbigpOgogICAgIGRvZmlsZSA9IG1tZGYKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICBpZiBzdHM6CiAgICAgICAgIHN5cy5leGl0KHN0cykKIAotbnVtZXJpYyA9IHJlZ2V4LmNvbXBpbGUoJ1sxLTldWzAtOV0qJykKK251bWVyaWMgPSByZS5jb21waWxlKCdbMS05XVswLTldKicpCiAKIGRlZiBtaChkaXIpOgogICAgIHN0cyA9IDAKZGlmZiAtLWdpdCBhL0RlbW8vc2NyaXB0cy91cGRhdGUucHkgYi9EZW1vL3NjcmlwdHMvdXBkYXRlLnB5CmluZGV4IDMyYWQ2YzguLmM5MzYwMjYgMTAwNzU1Ci0tLSBhL0RlbW8vc2NyaXB0cy91cGRhdGUucHkKKysrIGIvRGVtby9zY3JpcHRzL3VwZGF0ZS5weQpAQCAtOCwxMCArOCwxMCBAQAogCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKLWltcG9ydCByZWdleAoraW1wb3J0IHJlCiAKLXBhdCA9ICdeXChbXjogXHRcbl0rXCk6XChbMS05XVswLTldKlwpOicKLXByb2cgPSByZWdleC5jb21waWxlKHBhdCkKK3BhdCA9ICdeKFteOiBcdFxuXSspOihbMS05XVswLTldKik6JworcHJvZyA9IHJlLmNvbXBpbGUocGF0KQogCiBjbGFzcyBGaWxlT2JqOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CmRpZmYgLS1naXQgYS9EZW1vL3NvY2tldHMvbWNhc3QucHkgYi9EZW1vL3NvY2tldHMvbWNhc3QucHkKaW5kZXggMTIyZGFkNy4uMWFiZDMwNSAxMDA3NTUKLS0tIGEvRGVtby9zb2NrZXRzL21jYXN0LnB5CisrKyBiL0RlbW8vc29ja2V0cy9tY2FzdC5weQpAQCAtMTMsNyArMTMsNiBAQAogaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKIGltcG9ydCBzdHJ1Y3QKLWltcG9ydCByZWdzdWIKIGZyb20gc29ja2V0IGltcG9ydCAqCiAKIApkaWZmIC0tZ2l0IGEvRGVtby90aXgvZ3JpZC5weSBiL0RlbW8vdGl4L2dyaWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjYTg3ZgotLS0gL2Rldi9udWxsCisrKyBiL0RlbW8vdGl4L2dyaWQucHkKQEAgLTAsMCArMSwyOCBAQAorIyMjCitpbXBvcnQgVGl4IGFzIHRrCitmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CisKK3I9IHRrLlRrKCkKK3IudGl0bGUoInRlc3QiKQorCitsPXRrLkxhYmVsKHIsIG5hbWU9ImFfbGFiZWwiKQorbC5wYWNrKCkKKworY2xhc3MgTXlHcmlkKHRrLkdyaWQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBrd2FyZ3NbJ2VkaXRub3RpZnknXT0gc2VsZi5lZGl0bm90aWZ5CisgICAgICAgIHRrLkdyaWQuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBlZGl0bm90aWZ5KHNlbGYsIHgsIHkpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCitnID0gTXlHcmlkKHIsIG5hbWU9ImFfZ3JpZCIsCitzZWxlY3R1bml0PSJjZWxsIikKK2cucGFjayhmaWxsPXRrLkJPVEgpCitmb3IgeCBpbiB4cmFuZ2UoNSk6CisgICAgZm9yIHkgaW4geHJhbmdlKDUpOgorICAgICAgICBnLnNldCh4LHksdGV4dD1zdHIoKHgseSkpKQorCitjID0gdGsuQnV0dG9uKHIsIHRleHQ9IkNsb3NlIiwgY29tbWFuZD1yLmRlc3Ryb3kpCitjLnBhY2soKQorCit0ay5tYWlubG9vcCgpCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvZ3VpZG8vTWFuUGFnZS5weSBiL0RlbW8vdGtpbnRlci9ndWlkby9NYW5QYWdlLnB5CmluZGV4IDkxMTk2MWUuLjIyMWFmODggMTAwNzU1Ci0tLSBhL0RlbW8vdGtpbnRlci9ndWlkby9NYW5QYWdlLnB5CisrKyBiL0RlbW8vdGtpbnRlci9ndWlkby9NYW5QYWdlLnB5CkBAIC0xLDYgKzEsNiBAQAogIyBXaWRnZXQgdG8gZGlzcGxheSBhIG1hbiBwYWdlCiAKLWltcG9ydCByZWdleAoraW1wb3J0IHJlCiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIGZyb20gVGtpbnRlciBpbXBvcnQgX3RraW50ZXIKIGZyb20gU2Nyb2xsZWRUZXh0IGltcG9ydCBTY3JvbGxlZFRleHQKQEAgLTExLDEwICsxMSwxMCBAQAogCiAjIFhYWCBSZWNvZ25pemluZyBmb290ZXJzIGlzIHN5c3RlbSBkZXBlbmRlbnQKICMgKFRoaXMgb25lIHdvcmtzIGZvciBJUklYIDUuMiBhbmQgU29sYXJpcyAyLjIpCi1mb290ZXJwcm9nID0gcmVnZXguY29tcGlsZSgKK2Zvb3RlcnByb2cgPSByZS5jb21waWxlKAogICAgICAgICAnXiAgICAgUGFnZSBbMS05XVswLTldKlsgXHRdK1x8Xi4qTGFzdCBjaGFuZ2U6LipbMS05XVswLTldKlxuJykKLWVtcHR5cHJvZyA9IHJlZ2V4LmNvbXBpbGUoJ15bIFx0XSpcbicpCi11bHByb2cgPSByZWdleC5jb21waWxlKCdeWyBcdF0qW1h2IV9dW1h2IV8gXHRdKlxuJykKK2VtcHR5cHJvZyA9IHJlLmNvbXBpbGUoJ15bIFx0XSpcbicpCit1bHByb2cgPSByZS5jb21waWxlKCdeWyBcdF0qW1h2IV9dW1h2IV8gXHRdKlxuJykKIAogIyBCYXNpYyBNYW4gUGFnZSBjbGFzcyAtLSBkb2VzIG5vdCBkaXNhYmxlIGVkaXRpbmcKIGNsYXNzIEVkaXRhYmxlTWFuUGFnZShTY3JvbGxlZFRleHQpOgpkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL2d1aWRvL21ib3gucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vbWJveC5weQppbmRleCA5YjE2ZjZiLi4zYzM2ZDg4IDEwMDc1NQotLS0gYS9EZW1vL3RraW50ZXIvZ3VpZG8vbWJveC5weQorKysgYi9EZW1vL3RraW50ZXIvZ3VpZG8vbWJveC5weQpAQCAtNCw3ICs0LDcgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IGdldG9wdAogaW1wb3J0IHN0cmluZwogaW1wb3J0IG1obGliCkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICBzY2FubWVudS51bnBvc3QoKQogICAgIHNjYW5tZW51Lmludm9rZSgnYWN0aXZlJykKIAotc2NhbnBhcnNlciA9IHJlZ2V4LmNvbXBpbGUoJ14gKlwoWzAtOV0rXCknKQorc2NhbnBhcnNlciA9IHJlLmNvbXBpbGUoJ14gKihbMC05XSspJykKIAogZGVmIG9wZW5fZm9sZGVyKGU9Tm9uZSk6CiAgICAgZ2xvYmFsIGZvbGRlciwgbWhmCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvZ3VpZG8vdGttYW4ucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vdGttYW4ucHkKaW5kZXggMTFkOTY5MC4uNmIwYjY0MSAxMDA3NTUKLS0tIGEvRGVtby90a2ludGVyL2d1aWRvL3RrbWFuLnB5CisrKyBiL0RlbW8vdGtpbnRlci9ndWlkby90a21hbi5weQpAQCAtNSw3ICs1LDcgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IHN0cmluZwotaW1wb3J0IHJlZ2V4CitpbXBvcnQgcmUKIGZyb20gVGtpbnRlciBpbXBvcnQgKgogZnJvbSBNYW5QYWdlIGltcG9ydCBNYW5QYWdlCiAKQEAgLTIwOCwxNSArMjA4LDE1IEBACiAgICAgICAgICAgICBwcmludCAnRW1wdHkgc2VhcmNoIHN0cmluZycKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBpZiBub3Qgc2VsZi5jYXNldmFyLmdldCgpOgotICAgICAgICAgICAgbWFwID0gcmVnZXguY2FzZWZvbGQKKyAgICAgICAgICAgIG1hcCA9IHJlLklHTk9SRUNBU0UKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG1hcCA9IE5vbmUKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgbWFwOgotICAgICAgICAgICAgICAgIHByb2cgPSByZWdleC5jb21waWxlKHNlYXJjaCwgbWFwKQorICAgICAgICAgICAgICAgIHByb2cgPSByZS5jb21waWxlKHNlYXJjaCwgbWFwKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcm9nID0gcmVnZXguY29tcGlsZShzZWFyY2gpCi0gICAgICAgIGV4Y2VwdCByZWdleC5lcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHByb2cgPSByZS5jb21waWxlKHNlYXJjaCkKKyAgICAgICAgZXhjZXB0IHJlLmVycm9yLCBtc2c6CiAgICAgICAgICAgICBzZWxmLmZyYW1lLmJlbGwoKQogICAgICAgICAgICAgcHJpbnQgJ1JlZ2V4IGVycm9yOicsIG1zZwogICAgICAgICAgICAgcmV0dXJuCmRpZmYgLS1naXQgYS9Eb2MvTWFrZWZpbGUuZGVwcyBiL0RvYy9NYWtlZmlsZS5kZXBzCmluZGV4IDgzMjQwMmQuLjIwYzA2ODggMTAwNjQ0Ci0tLSBhL0RvYy9NYWtlZmlsZS5kZXBzCisrKyBiL0RvYy9NYWtlZmlsZS5kZXBzCkBAIC0xMjYsNiArMTI2LDcgQEAKIAlsaWIvbGlid2FybmluZ3MudGV4IFwKIAlsaWIvbGliaW1wLnRleCBcCiAJbGliL2xpYnppcGltcG9ydC50ZXggXAorCWxpYi9saWJydW5weS50ZXggXAogCWxpYi9saWJwa2d1dGlsLnRleCBcCiAJbGliL2xpYnBhcnNlci50ZXggXAogCWxpYi9saWJibHRpbi50ZXggXApkaWZmIC0tZ2l0IGEvRG9jL2FwaS9jb25jcmV0ZS50ZXggYi9Eb2MvYXBpL2NvbmNyZXRlLnRleAppbmRleCA1NTIxYjgwLi4xOTgyYmFlIDEwMDY0NAotLS0gYS9Eb2MvYXBpL2NvbmNyZXRlLnRleAorKysgYi9Eb2MvYXBpL2NvbmNyZXRlLnRleApAQCAtMTU2LDcgKzE1Niw3IEBACiAgIENyZWF0ZSBhIG5ldyBpbnRlZ2VyIG9iamVjdCB3aXRoIGEgdmFsdWUgb2YgXHZhcntpdmFsfS4KIAogICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBrZWVwcyBhbiBhcnJheSBvZiBpbnRlZ2VyIG9iamVjdHMgZm9yIGFsbAotICBpbnRlZ2VycyBiZXR3ZWVuIFxjb2Rley0xfSBhbmQgXGNvZGV7MTAwfSwgd2hlbiB5b3UgY3JlYXRlIGFuIGludCBpbgorICBpbnRlZ2VycyBiZXR3ZWVuIFxjb2Rley01fSBhbmQgXGNvZGV7MjU2fSwgd2hlbiB5b3UgY3JlYXRlIGFuIGludCBpbgogICB0aGF0IHJhbmdlIHlvdSBhY3R1YWxseSBqdXN0IGdldCBiYWNrIGEgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZwogICBvYmplY3QuIFNvIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIFxjb2RlezF9LiAgSQogICBzdXNwZWN0IHRoZSBiZWhhdmlvdXIgb2YgUHl0aG9uIGluIHRoaXMgY2FzZSBpcyB1bmRlZmluZWQuIDotKQpAQCAtMzMzLDcgKzMzMyw5IEBACiAgIFRoZSBwb2ludGVyIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVzdWx0aW5nIHZhbHVlIHVzaW5nCiAgIFxjZnVuY3Rpb257UHlMb25nX0FzVm9pZFB0cigpfS4KICAgXHZlcnNpb25hZGRlZHsxLjUuMn0KLVxlbmR7Y2Z1bmNkZXNjfQorICBcdmVyc2lvbmNoYW5nZWRbSWYgdGhlIGludGVnZXIgaXMgbGFyZ2VyIHRoYW4gTE9OR19NQVgsCisgIGEgcG9zaXRpdmUgbG9uZyBpbnRlZ2VyIGlzIHJldHVybmVkXXsyLjV9CisgXGVuZHtjZnVuY2Rlc2N9CiAKIFxiZWdpbntjZnVuY2Rlc2N9e2xvbmd9e1B5TG9uZ19Bc0xvbmd9e1B5T2JqZWN0ICpweWxvbmd9CiAgIFJldHVybiBhIEMgXGN0eXBle2xvbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50cyBvZgpAQCAtMzk0LDYgKzM5Niw4IEBACiAgIHByb2R1Y2UgYSB1c2FibGUgXGN0eXBle3ZvaWR9IHBvaW50ZXIgZm9yIHZhbHVlcyBjcmVhdGVkIHdpdGgKICAgXGNmdW5jdGlvbntQeUxvbmdfRnJvbVZvaWRQdHIoKX0uCiAgIFx2ZXJzaW9uYWRkZWR7MS41LjJ9CisgIFx2ZXJzaW9uY2hhbmdlZFtGb3IgdmFsdWVzIG91dHNpZGUgMC4uTE9OR19NQVgsIGJvdGggc2lnbmVkIGFuZAorICB1bnNpZ25lZCBpbnRlZ2VycyBhcmUgYWNjY2VwdGVkXXsyLjV9CiBcZW5ke2NmdW5jZGVzY30KIAogCkBAIC0xODAzLDggKzE4MDcsOSBAQAogCiBcYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TGlzdF9HZXRJdGVtfXtQeU9iamVjdCAqbGlzdCwgUHlfc3NpemVfdCBpbmRleH0KICAgUmV0dXJuIHRoZSBvYmplY3QgYXQgcG9zaXRpb24gXHZhcntwb3N9IGluIHRoZSBsaXN0IHBvaW50ZWQgdG8gYnkKLSAgXHZhcntwfS4gIElmIFx2YXJ7cG9zfSBpcyBvdXQgb2YgYm91bmRzLCByZXR1cm4gXE5VTEx7fSBhbmQgc2V0IGFuCi0gIFxleGNlcHRpb257SW5kZXhFcnJvcn0gZXhjZXB0aW9uLgorICBcdmFye3B9LiAgVGhlIHBvc2l0aW9uIG11c3QgYmUgcG9zaXRpdmUsIGluZGV4aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUKKyAgbGlzdCBpcyBub3Qgc3VwcG9ydGVkLiAgSWYgXHZhcntwb3N9IGlzIG91dCBvZiBib3VuZHMsIHJldHVybiBcTlVMTHt9CisgIGFuZCBzZXQgYW4gXGV4Y2VwdGlvbntJbmRleEVycm9yfSBleGNlcHRpb24uCiBcZW5ke2NmdW5jZGVzY30KIAogXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUxpc3RfR0VUX0lURU19e1B5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGl9CkBAIC0yMjY0LDggKzIyNjksOCBAQAogXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUZ1bmN0aW9uX05ld317UHlPYmplY3QgKmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZ2xvYmFsc30KICAgUmV0dXJuIGEgbmV3IGZ1bmN0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvZGUgb2JqZWN0Ci0gIFx2YXJ7Y29kZX0uIFx2YXJ7Z2xvYmFsc30gbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2l0aCB0aGUgdGhlIGdsb2JhbAotICB2YXJhaWJsZXMgYWNjZXNzaWJsZSB0byB0aGUgZnVuY3Rpb24uCisgIFx2YXJ7Y29kZX0uIFx2YXJ7Z2xvYmFsc30gbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2l0aCB0aGUgZ2xvYmFsCisgIHZhcmlhYmxlcyBhY2Nlc3NpYmxlIHRvIHRoZSBmdW5jdGlvbi4KIAogICBUaGUgZnVuY3Rpb24ncyBkb2NzdHJpbmcsIG5hbWUgYW5kIFx2YXJ7X19tb2R1bGVfX30gYXJlIHJldHJpZXZlZAogICBmcm9tIHRoZSBjb2RlIG9iamVjdCwgdGhlIGFyZ3VtZW50IGRlZmF1bHRzIGFuZCBjbG9zdXJlIGFyZSBzZXQgdG8KQEAgLTI4MTEsNiArMjgxNiw3IEBACiAKIFxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlHZW5fTmV3fXtQeUZyYW1lT2JqZWN0ICpmcmFtZX0KICAgQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgZ2VuZXJhdG9yIG9iamVjdCBiYXNlZCBvbiB0aGUgXHZhcntmcmFtZX0gb2JqZWN0LgorICBBIHJlZmVyZW5jZSB0byBcdmFye2ZyYW1lfSBpcyBzdG9sZW4gYnkgdGhpcyBmdW5jdGlvbi4KICAgVGhlIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBcTlVMTHt9LgogXGVuZHtjZnVuY2Rlc2N9CiAKQEAgLTMwMjUsOSArMzAzMSw3IEBACiBcY2Z1bmN0aW9ue1B5TnVtYmVyX09yKCl9LCBcY2Z1bmN0aW9ue1B5TnVtYmVyX1hvcigpfSwKIFxjZnVuY3Rpb257UHlOdW1iZXJfSW5QbGFjZUFkZCgpfSwgXGNmdW5jdGlvbntQeU51bWJlcl9JblBsYWNlU3VidHJhY3QoKX0sCiBcY2Z1bmN0aW9ue1B5TnVtYmVyX0luUGxhY2VPcigpfSwgYW5kIFxjZnVuY3Rpb257UHlOdW1iZXJfSW5QbGFjZVhvcigpfSkuCi1Ob3RlLCBcY2Z1bmN0aW9ue1B5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdCgpfSBpcyBhbHNvIHVzZWZ1bCBjbGVhcmluZwotY2xlYXJpbmcgYSBzZXQgKFxjb2Rle3MtPXN9KS4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgCisKIFxiZWdpbntjdHlwZWRlc2N9e1B5U2V0T2JqZWN0fQogICBUaGlzIHN1YnR5cGUgb2YgXGN0eXBle1B5T2JqZWN0fSBpcyB1c2VkIHRvIGhvbGQgdGhlIGludGVybmFsIGRhdGEgZm9yCiAgIGJvdGggXGNsYXNze3NldH0gYW5kIFxjbGFzc3tmcm96ZW5zZXR9IG9iamVjdHMuICBJdCBpcyBsaWtlIGEKQEAgLTMxMTEsNyArMzExNSw2IEBACiAgIFxjbGFzc3tmcm96ZW5zZXR9LCBvciBhbiBpbnN0YW5jZSBvZiBhIHN1YnR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgIAogXGVuZHtjZnVuY2Rlc2N9CiAKLQogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgaW5zdGFuY2VzIG9mIFxjbGFzc3tzZXR9IG9yCiBpdHMgc3VidHlwZXMgYnV0IG5vdCBmb3IgaW5zdGFuY2VzIG9mIFxjbGFzc3tmcm96ZW5zZXR9IG9yIGl0cyBzdWJ0eXBlcy4KIApAQCAtMzE0Miw0ICszMTQ1LDYgQEAKICAgb2YgXGNsYXNze3NldH0gb3IgaXRzIHN1YnR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgCiBcZW5ke2NmdW5jZGVzY30KIAotCitcYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5U2V0X0NsZWFyfXtQeU9iamVjdCAqc2V0fQorICBFbXB0eSBhbiBleGlzdGluZyBzZXQgb2YgYWxsIGVsZW1lbnRzLgorXGVuZHtjZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvYXBpL2ludHJvLnRleCBiL0RvYy9hcGkvaW50cm8udGV4CmluZGV4IDYwOGQ1NjIuLjk2ZjE4ZWMgMTAwNjQ0Ci0tLSBhL0RvYy9hcGkvaW50cm8udGV4CisrKyBiL0RvYy9hcGkvaW50cm8udGV4CkBAIC01NjksOCArNTY5LDExIEBACiBTb21ldGltZXMsIGl0IGlzIGRlc2lyYWJsZSB0byBgYHVuaW5pdGlhbGl6ZScnIFB5dGhvbi4gIEZvciBpbnN0YW5jZSwgCiB0aGUgYXBwbGljYXRpb24gbWF5IHdhbnQgdG8gc3RhcnQgb3ZlciAobWFrZSBhbm90aGVyIGNhbGwgdG8gCiBcY2Z1bmN0aW9ue1B5X0luaXRpYWxpemUoKX0pIG9yIHRoZSBhcHBsaWNhdGlvbiBpcyBzaW1wbHkgZG9uZSB3aXRoIGl0cyAKLXVzZSBvZiBQeXRob24gYW5kIHdhbnRzIHRvIGZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgUHl0aG9uLiAgVGhpcwordXNlIG9mIFB5dGhvbiBhbmQgd2FudHMgdG8gZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IFB5dGhvbi4gIFRoaXMKIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgY2FsbGluZyBcY2Z1bmN0aW9ue1B5X0ZpbmFsaXplKCl9LiAgVGhlIGZ1bmN0aW9uCiBcY2Z1bmN0aW9ue1B5X0lzSW5pdGlhbGl6ZWQoKX1cdHRpbmRleHtQeV9Jc0luaXRpYWxpemVkKCl9IHJldHVybnMKIHRydWUgaWYgUHl0aG9uIGlzIGN1cnJlbnRseSBpbiB0aGUgaW5pdGlhbGl6ZWQgc3RhdGUuICBNb3JlCiBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBmdW5jdGlvbnMgaXMgZ2l2ZW4gaW4gYSBsYXRlciBjaGFwdGVyLgorTm90aWNlIHRoYXQgXGNmdW5jdGlvbntQeV9GaW5hbGl6ZX0gZG9lcyBcZW1waHtub3R9IGZyZWUgYWxsIG1lbW9yeQorYWxsb2NhdGVkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIGUuZy4gbWVtb3J5IGFsbG9jYXRlZCBieSBleHRlbnNpb24KK21vZHVsZXMgY3VycmVudGx5IGNhbm5vdCBiZSByZWxlYXNlZC4KZGlmZiAtLWdpdCBhL0RvYy9hcGkvbWVtb3J5LnRleCBiL0RvYy9hcGkvbWVtb3J5LnRleAppbmRleCAzZGJlOWE1Li40YmMyYzdhIDEwMDY0NAotLS0gYS9Eb2MvYXBpL21lbW9yeS50ZXgKKysrIGIvRG9jL2FwaS9tZW1vcnkudGV4CkBAIC0xOTUsOSArMTk1LDcgQEAKIEluIGFkZGl0aW9uIHRvIHRoZSBmdW5jdGlvbnMgYWltZWQgYXQgaGFuZGxpbmcgcmF3IG1lbW9yeSBibG9ja3MgZnJvbQogdGhlIFB5dGhvbiBoZWFwLCBvYmplY3RzIGluIFB5dGhvbiBhcmUgYWxsb2NhdGVkIGFuZCByZWxlYXNlZCB3aXRoCiBcY2Z1bmN0aW9ue1B5T2JqZWN0X05ldygpfSwgXGNmdW5jdGlvbntQeU9iamVjdF9OZXdWYXIoKX0gYW5kCi1cY2Z1bmN0aW9ue1B5T2JqZWN0X0RlbCgpfSwgb3Igd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIG1hY3JvcwotXGNmdW5jdGlvbntQeU9iamVjdF9ORVcoKX0sIFxjZnVuY3Rpb257UHlPYmplY3RfTkVXX1ZBUigpfSBhbmQKLVxjZnVuY3Rpb257UHlPYmplY3RfREVMKCl9LgorXGNmdW5jdGlvbntQeU9iamVjdF9EZWwoKX0uCiAKIFRoZXNlIHdpbGwgYmUgZXhwbGFpbmVkIGluIHRoZSBuZXh0IGNoYXB0ZXIgb24gZGVmaW5pbmcgYW5kCiBpbXBsZW1lbnRpbmcgbmV3IG9iamVjdCB0eXBlcyBpbiBDLgpkaWZmIC0tZ2l0IGEvRG9jL2FwaS9uZXd0eXBlcy50ZXggYi9Eb2MvYXBpL25ld3R5cGVzLnRleAppbmRleCBiN2UyNWI5Li4yZDc1OGIwIDEwMDY0NAotLS0gYS9Eb2MvYXBpL25ld3R5cGVzLnRleAorKysgYi9Eb2MvYXBpL25ld3R5cGVzLnRleApAQCAtNjIsMjMgKzYyLDYgQEAKICAgYWZ0ZXIgdGhpcyBjYWxsIGFzIHRoZSBtZW1vcnkgaXMgbm8gbG9uZ2VyIGEgdmFsaWQgUHl0aG9uIG9iamVjdC4KIFxlbmR7Y2Z1bmNkZXNjfQogCi1cYmVnaW57Y2Z1bmNkZXNjfXtcdmFye1RZUEV9Kn17UHlPYmplY3RfTkVXfXtUWVBFLCBQeVR5cGVPYmplY3QgKnR5cGV9Ci0gIE1hY3JvIHZlcnNpb24gb2YgXGNmdW5jdGlvbntQeU9iamVjdF9OZXcoKX0sIHRvIGdhaW4gcGVyZm9ybWFuY2UgYXQKLSAgdGhlIGV4cGVuc2Ugb2Ygc2FmZXR5LiAgVGhpcyBkb2VzIG5vdCBjaGVjayBcdmFye3R5cGV9IGZvciBhIFxOVUxMe30KLSAgdmFsdWUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317XHZhcntUWVBFfSp9e1B5T2JqZWN0X05FV19WQVJ9e1RZUEUsIFB5VHlwZU9iamVjdCAqdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZX0KLSAgTWFjcm8gdmVyc2lvbiBvZiBcY2Z1bmN0aW9ue1B5T2JqZWN0X05ld1ZhcigpfSwgdG8gZ2FpbiBwZXJmb3JtYW5jZQotICBhdCB0aGUgZXhwZW5zZSBvZiBzYWZldHkuICBUaGlzIGRvZXMgbm90IGNoZWNrIFx2YXJ7dHlwZX0gZm9yIGEKLSAgXE5VTEx7fSB2YWx1ZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeU9iamVjdF9ERUx9e1B5T2JqZWN0ICpvcH0KLSAgTWFjcm8gdmVyc2lvbiBvZiBcY2Z1bmN0aW9ue1B5T2JqZWN0X0RlbCgpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCiBcYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5X0luaXRNb2R1bGV9e2NoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWV0aG9kRGVmICptZXRob2RzfQogICBDcmVhdGUgYSBuZXcgbW9kdWxlIG9iamVjdCBiYXNlZCBvbiBhIG5hbWUgYW5kIHRhYmxlIG9mIGZ1bmN0aW9ucywKZGlmZiAtLWdpdCBhL0RvYy9hcGkvcmVmY291bnRzLmRhdCBiL0RvYy9hcGkvcmVmY291bnRzLmRhdAppbmRleCBmM2JkMzJlLi43YmJhMDExIDEwMDY0NAotLS0gYS9Eb2MvYXBpL3JlZmNvdW50cy5kYXQKKysrIGIvRG9jL2FwaS9yZWZjb3VudHMuZGF0CkBAIC0zMSw2ICszMSw5IEBACiAjIFRoZSBwYXJhbWV0ZXIgbmFtZXMgYXJlIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBBUEkgbWFudWFsLCBub3QgdGhlIHNvdXJjZQogIyBjb2RlLiAKIAorUHlCb29sX0Zyb21Mb25nOlB5T2JqZWN0Kjo6KzE6CitQeUJvb2xfRnJvbUxvbmc6bG9uZzp2OjA6CisKIFB5QnVmZmVyX0Zyb21PYmplY3Q6UHlPYmplY3QqOjorMToKIFB5QnVmZmVyX0Zyb21PYmplY3Q6UHlPYmplY3QqOmJhc2U6KzE6CiBQeUJ1ZmZlcl9Gcm9tT2JqZWN0OmludDpvZmZzZXQ6OgpAQCAtMTEwLDYgKzExMywzNSBAQAogUHlDb21wbGV4X1JlYWxBc0RvdWJsZTpkb3VibGU6OjoKIFB5Q29tcGxleF9SZWFsQXNEb3VibGU6UHlPYmplY3QqOm9wOjA6CiAKK1B5RGF0ZV9Gcm9tRGF0ZTpQeU9iamVjdCo6OisxOgorUHlEYXRlX0Zyb21EYXRlOmludDp5ZWFyOjoKK1B5RGF0ZV9Gcm9tRGF0ZTppbnQ6bW9udGg6OgorUHlEYXRlX0Zyb21EYXRlOmludDpkYXk6OgorCitQeURhdGVfRnJvbVRpbWVzdGFtcDpQeU9iamVjdCo6OisxOgorUHlEYXRlX0Zyb21UaW1lc3RhbXA6UHlPYmplY3QqOmFyZ3M6MDoKKworUHlEYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWU6UHlPYmplY3QqOjorMToKK1B5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lOmludDp5ZWFyOjoKK1B5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lOmludDptb250aDo6CitQeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZTppbnQ6ZGF5OjoKK1B5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lOmludDpob3VyOjoKK1B5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lOmludDptaW51dGU6OgorUHlEYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWU6aW50OnNlY29uZDo6CitQeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZTppbnQ6dXNlY29uZDo6CisKK1B5RGF0ZVRpbWVfRnJvbVRpbWVzdGFtcDpQeU9iamVjdCo6OisxOgorUHlEYXRlVGltZV9Gcm9tVGltZXN0YW1wOlB5T2JqZWN0KjphcmdzOjA6CisKK1B5RGVsdGFfRnJvbURTVTpQeU9iamVjdCo6OisxOgorUHlEZWx0YV9Gcm9tRFNVOmludDpkYXlzOjoKK1B5RGVsdGFfRnJvbURTVTppbnQ6c2Vjb25kczo6CitQeURlbHRhX0Zyb21EU1U6aW50OnVzZWNvbmRzOjoKKworUHlEZXNjcl9OZXdDbGFzc01ldGhvZDpQeU9iamVjdCo6OisxOgorUHlEZXNjcl9OZXdDbGFzc01ldGhvZDpQeVR5cGVPYmplY3QqOnR5cGU6OgorUHlEZXNjcl9OZXdDbGFzc01ldGhvZDpQeU1ldGhvZERlZio6bWV0aG9kOjoKKwogUHlEZXNjcl9OZXdHZXRTZXQ6UHlPYmplY3QqOjorMToKIFB5RGVzY3JfTmV3R2V0U2V0OlB5VHlwZU9iamVjdCo6dHlwZTo6CiBQeURlc2NyX05ld0dldFNldDpQeUdldFNldERlZio6Z2V0c2V0OjoKQEAgLTIyNiw2ICsyNTgsMTUgQEAKIFB5RXJyX1Jlc3RvcmU6UHlPYmplY3QqOnZhbHVlOi0xOgogUHlFcnJfUmVzdG9yZTpQeU9iamVjdCo6dHJhY2ViYWNrOi0xOgogCitQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycjpQeU9iamVjdCo6Om51bGw6CitQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycjpQeU9iamVjdCo6dHlwZTowOgorUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnI6aW50OmllcnI6OgorCitQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZTpQeU9iamVjdCo6Om51bGw6CitQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZTpQeU9iamVjdCo6dHlwZTowOgorUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWU6aW50OmllcnI6OgorUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWU6Y2hhcio6ZmlsZW5hbWU6OgorCiBQeUVycl9TZXRGcm9tRXJybm86UHlPYmplY3QqOjpudWxsOgogUHlFcnJfU2V0RnJvbUVycm5vOlB5T2JqZWN0Kjp0eXBlOjA6CiAKQEAgLTMzNyw2ICszNzgsMTMgQEAKIFB5RmxvYXRfRnJvbURvdWJsZTpQeU9iamVjdCo6OisxOgogUHlGbG9hdF9Gcm9tRG91YmxlOmRvdWJsZTp2OjoKIAorUHlGbG9hdF9Gcm9tU3RyaW5nOlB5T2JqZWN0Kjo6KzE6CitQeUZsb2F0X0Zyb21TdHJpbmc6UHlPYmplY3QqOnN0cjowOgorUHlGbG9hdF9Gcm9tU3RyaW5nOmNoYXIqKjpwZW5kOjA6aWdub3JlZAorCitQeUZyb3plblNldF9OZXc6UHlPYmplY3QqOjorMToKK1B5RnJvemVuU2V0X05ldzpQeU9iamVjdCo6aXRlcmFibGU6MDoKKwogUHlGdW5jdGlvbl9HZXRDbG9zdXJlOlB5T2JqZWN0Kjo6MDoKIFB5RnVuY3Rpb25fR2V0Q2xvc3VyZTpQeU9iamVjdCo6b3A6MDoKIApAQCAtMzY0LDYgKzQxMiw5IEBACiBQeUZ1bmN0aW9uX1NldERlZmF1bHRzOlB5T2JqZWN0KjpvcDowOgogUHlGdW5jdGlvbl9TZXREZWZhdWx0czpQeU9iamVjdCo6ZGVmYXVsdHM6KzE6CiAKK1B5R2VuX05ldzpQeU9iamVjdCo6OisxOgorUHlHZW5fTmV3OlB5RnJhbWVPYmplY3QqOmZyYW1lOjA6CisKIFB5X0luaXRNb2R1bGU6UHlPYmplY3QqOjowOgogUHlfSW5pdE1vZHVsZTpjaGFyKjpuYW1lOjoKIFB5X0luaXRNb2R1bGU6UHlNZXRob2REZWZbXTptZXRob2RzOjoKQEAgLTQzMiw2ICs0ODMsMTQgQEAKIFB5SW50X0Zyb21Mb25nOlB5T2JqZWN0Kjo6KzE6CiBQeUludF9Gcm9tTG9uZzpsb25nOml2YWw6OgogCitQeUludF9Gcm9tU3RyaW5nOlB5T2JqZWN0Kjo6KzE6CitQeUludF9Gcm9tU3RyaW5nOmNoYXIqOnN0cjowOgorUHlJbnRfRnJvbVN0cmluZzpjaGFyKio6cGVuZDowOgorUHlJbnRfRnJvbVN0cmluZzppbnQ6YmFzZTowOgorCitQeUludF9Gcm9tU3NpemVfdDpQeU9iamVjdCo6OisxOgorUHlJbnRfRnJvbVNzaXplX3Q6UHlfc3NpemVfdDppdmFsOjoKKwogUHlJbnRfR2V0TWF4Omxvbmc6OjoKIAogUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyOnZvaWQ6OjoKQEAgLTkzOSw2ICs5OTgsMzEgQEAKIFB5UnVuX0ZpbGU6UHlPYmplY3QqOmdsb2JhbHM6MDoKIFB5UnVuX0ZpbGU6UHlPYmplY3QqOmxvY2FsczowOgogCitQeVJ1bl9GaWxlRXg6UHlPYmplY3QqOjorMTo/Pz8gLS0gc2FtZSBhcyBldmFsX2NvZGUyKCkKK1B5UnVuX0ZpbGVFeDpGSUxFKjpmcDo6CitQeVJ1bl9GaWxlRXg6Y2hhcio6ZmlsZW5hbWU6OgorUHlSdW5fRmlsZUV4OmludDpzdGFydDo6CitQeVJ1bl9GaWxlRXg6UHlPYmplY3QqOmdsb2JhbHM6MDoKK1B5UnVuX0ZpbGVFeDpQeU9iamVjdCo6bG9jYWxzOjA6CitQeVJ1bl9GaWxlRXg6aW50OmNsb3NlaXQ6OgorCitQeVJ1bl9GaWxlRmxhZ3M6UHlPYmplY3QqOjorMTo/Pz8gLS0gc2FtZSBhcyBldmFsX2NvZGUyKCkKK1B5UnVuX0ZpbGVGbGFnczpGSUxFKjpmcDo6CitQeVJ1bl9GaWxlRmxhZ3M6Y2hhcio6ZmlsZW5hbWU6OgorUHlSdW5fRmlsZUZsYWdzOmludDpzdGFydDo6CitQeVJ1bl9GaWxlRmxhZ3M6UHlPYmplY3QqOmdsb2JhbHM6MDoKK1B5UnVuX0ZpbGVGbGFnczpQeU9iamVjdCo6bG9jYWxzOjA6CitQeVJ1bl9GaWxlRmxhZ3M6UHlDb21waWxlckZsYWdzKjpmbGFnczo6CisKK1B5UnVuX0ZpbGVFeEZsYWdzOlB5T2JqZWN0Kjo6KzE6Pz8/IC0tIHNhbWUgYXMgZXZhbF9jb2RlMigpCitQeVJ1bl9GaWxlRXhGbGFnczpGSUxFKjpmcDo6CitQeVJ1bl9GaWxlRXhGbGFnczpjaGFyKjpmaWxlbmFtZTo6CitQeVJ1bl9GaWxlRXhGbGFnczppbnQ6c3RhcnQ6OgorUHlSdW5fRmlsZUV4RmxhZ3M6UHlPYmplY3QqOmdsb2JhbHM6MDoKK1B5UnVuX0ZpbGVFeEZsYWdzOlB5T2JqZWN0Kjpsb2NhbHM6MDoKK1B5UnVuX0ZpbGVFeEZsYWdzOmludDpjbG9zZWl0OjoKK1B5UnVuX0ZpbGVFeEZsYWdzOlB5Q29tcGlsZXJGbGFncyo6ZmxhZ3M6OgorCiBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3A6aW50Ojo6CiBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3A6RklMRSo6ZnA6OgogUHlSdW5fSW50ZXJhY3RpdmVMb29wOmNoYXIqOmZpbGVuYW1lOjoKQEAgLTk2MCw2ICsxMDQ0LDEzIEBACiBQeVJ1bl9TdHJpbmc6UHlPYmplY3QqOmdsb2JhbHM6MDoKIFB5UnVuX1N0cmluZzpQeU9iamVjdCo6bG9jYWxzOjA6CiAKK1B5UnVuX1N0cmluZ0ZsYWdzOlB5T2JqZWN0Kjo6KzE6Pz8/IC0tIHNhbWUgYXMgZXZhbF9jb2RlMigpCitQeVJ1bl9TdHJpbmdGbGFnczpjaGFyKjpzdHI6OgorUHlSdW5fU3RyaW5nRmxhZ3M6aW50OnN0YXJ0OjoKK1B5UnVuX1N0cmluZ0ZsYWdzOlB5T2JqZWN0KjpnbG9iYWxzOjA6CitQeVJ1bl9TdHJpbmdGbGFnczpQeU9iamVjdCo6bG9jYWxzOjA6CitQeVJ1bl9TdHJpbmdGbGFnczpQeUNvbXBpbGVyRmxhZ3MqOmZsYWdzOjoKKwogUHlTZXFJdGVyX05ldzpQeU9iamVjdCo6OisxOgogUHlTZXFJdGVyX05ldzpQeU9iamVjdCo6c2VxOjoKIApAQCAtMTA1Myw2ICsxMTQ0LDkgQEAKIFB5U2V0X0Rpc2NhcmQ6UHlPYmplY3QqOnNldDowOgogUHlTZXRfRGlzY2FyZDpQeU9iamVjdCo6a2V5Oi0xOm5vIGVmZmVjdCBpZiBrZXkgbm90IGZvdW5kCiAKK1B5U2V0X05ldzpQeU9iamVjdCo6OisxOgorUHlTZXRfTmV3OlB5T2JqZWN0KjppdGVyYWJsZTowOgorCiBQeVNldF9Qb3A6UHlPYmplY3QqOjowOm9yIHJldHVybnMgTlVMTCBhbmQgcmFpc2VzIEtleUVycm9yIGlmIHNldCBpcyBlbXB0eQogUHlTZXRfUG9wOlB5T2JqZWN0KjpzZXQ6MDoKIApAQCAtMTE2Nyw2ICsxMjYxLDEyIEBACiBQeVRocmVhZFN0YXRlX1N3YXA6UHlUaHJlYWRTdGF0ZSo6OjoKIFB5VGhyZWFkU3RhdGVfU3dhcDpQeVRocmVhZFN0YXRlKjp0c3RhdGU6OgogCitQeVRpbWVfRnJvbVRpbWU6UHlPYmplY3QqOjorMToKK1B5VGltZV9Gcm9tVGltZTppbnQ6aG91cjo6CitQeVRpbWVfRnJvbVRpbWU6aW50Om1pbnV0ZTo6CitQeVRpbWVfRnJvbVRpbWU6aW50OnNlY29uZDo6CitQeVRpbWVfRnJvbVRpbWU6aW50OnVzZWNvbmQ6OgorCiBQeVR1cGxlX0NoZWNrOmludDo6OgogUHlUdXBsZV9DaGVjazpQeU9iamVjdCo6cDowOgogCkBAIC0xMTg2LDYgKzEyODYsMTAgQEAKIFB5VHVwbGVfTmV3OlB5T2JqZWN0Kjo6KzE6CiBQeVR1cGxlX05ldzppbnQ6bGVuOjoKIAorUHlUdXBsZV9QYWNrOlB5T2JqZWN0Kjo6KzE6CitQeVR1cGxlX1BhY2s6aW50Omxlbjo6CitQeVR1cGxlX1BhY2s6UHlPYmplY3QqOi4uLjowOgorCiBQeVR1cGxlX1NFVF9JVEVNOnZvaWQ6OjoKIFB5VHVwbGVfU0VUX0lURU06UHlUdXBsZU9iamVjdCo6cDowOgogUHlUdXBsZV9TRVRfSVRFTTppbnQ6cG9zOjoKQEAgLTEyOTgsNiArMTQwMiwxOSBAQAogUHlVbmljb2RlX0RlY29kZTpjb25zdCBjaGFyKjplbmNvZGluZzo6CiBQeVVuaWNvZGVfRGVjb2RlOmNvbnN0IGNoYXIqOmVycm9yczo6CiAKK1B5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsOlB5T2JqZWN0Kjo6KzE6CitQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bDpjb25zdCBjaGFyKjpzOjoKK1B5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsOmludDpzaXplOjoKK1B5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsOmNvbnN0IGNoYXIqOmVycm9yczo6CitQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bDppbnQqOmJ5dGVvcmRlcjo6CitQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bDppbnQqOmNvbnN1bWVkOjoKKworUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bDpQeU9iamVjdCo6OisxOgorUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bDpjb25zdCBjaGFyKjpzOjoKK1B5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWw6aW50OnNpemU6OgorUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bDpjb25zdCBjaGFyKjplcnJvcnM6OgorUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bDppbnQqOmNvbnN1bWVkOjoKKwogUHlVbmljb2RlX0VuY29kZTpQeU9iamVjdCo6OisxOgogUHlVbmljb2RlX0VuY29kZTpjb25zdCBQeV9VTklDT0RFKjpzOjoKIFB5VW5pY29kZV9FbmNvZGU6aW50OnNpemU6OgpAQCAtMTUxMyw2ICsxNjMwLDEyIEBACiBQeV9Db21waWxlU3RyaW5nOmNoYXIqOmZpbGVuYW1lOjoKIFB5X0NvbXBpbGVTdHJpbmc6aW50OnN0YXJ0OjoKIAorUHlfQ29tcGlsZVN0cmluZ0ZsYWdzOlB5T2JqZWN0Kjo6KzE6CitQeV9Db21waWxlU3RyaW5nRmxhZ3M6Y2hhcio6c3RyOjoKK1B5X0NvbXBpbGVTdHJpbmdGbGFnczpjaGFyKjpmaWxlbmFtZTo6CitQeV9Db21waWxlU3RyaW5nRmxhZ3M6aW50OnN0YXJ0OjoKK1B5X0NvbXBpbGVTdHJpbmdGbGFnczpQeUNvbXBpbGVyRmxhZ3MqOmZsYWdzOjoKKwogUHlfREVDUkVGOnZvaWQ6OjoKIFB5X0RFQ1JFRjpQeU9iamVjdCo6bzotMToKIApkaWZmIC0tZ2l0IGEvRG9jL2NvbW1vbnRleC9ib2lsZXJwbGF0ZS50ZXggYi9Eb2MvY29tbW9udGV4L2JvaWxlcnBsYXRlLnRleAppbmRleCBiNGM5ZjQ4Li41NWE0MTg0IDEwMDY0NAotLS0gYS9Eb2MvY29tbW9udGV4L2JvaWxlcnBsYXRlLnRleAorKysgYi9Eb2MvY29tbW9udGV4L2JvaWxlcnBsYXRlLnRleApAQCAtNSw1ICs1LDUgQEAKIAlFbWFpbDogXGVtYWlse2RvY3NAcHl0aG9uLm9yZ30KIH0KIAotXGRhdGV7XHRvZGF5fQkJCSUgWFhYIHVwZGF0ZSBiZWZvcmUgZmluYWwgcmVsZWFzZSEKK1xkYXRlezV0aCBBcHJpbCAyMDA2fQkJCSUgWFhYIHVwZGF0ZSBiZWZvcmUgZmluYWwgcmVsZWFzZSEKIFxpbnB1dHtwYXRjaGxldmVsfQkJJSBpbmNsdWRlIFB5dGhvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9Eb2MvY29tbW9udGV4L2xpY2Vuc2UudGV4IGIvRG9jL2NvbW1vbnRleC9saWNlbnNlLnRleAppbmRleCA1MjVjZThhLi5kMTU1NGMyIDEwMDY0NAotLS0gYS9Eb2MvY29tbW9udGV4L2xpY2Vuc2UudGV4CisrKyBiL0RvYy9jb21tb250ZXgvbGljZW5zZS50ZXgKQEAgLTQ5LDYgKzQ5LDggQEAKICAgXGxpbmV2ezIuNH17Mi4zfXsyMDA0fXtQU0Z9e3llc30KICAgXGxpbmV2ezIuNC4xfXsyLjR9ezIwMDV9e1BTRn17eWVzfQogICBcbGluZXZ7Mi40LjJ9ezIuNC4xfXsyMDA1fXtQU0Z9e3llc30KKyAgXGxpbmV2ezIuNC4zfXsyLjQuMn17MjAwNn17UFNGfXt5ZXN9CisgIFxsaW5ldnsyLjV9ezIuNH17MjAwNn17UFNGfXt5ZXN9CiBcZW5ke3RhYmxldn0KIAogXG5vdGV7R1BMLWNvbXBhdGlibGUgZG9lc24ndCBtZWFuIHRoYXQgd2UncmUgZGlzdHJpYnV0aW5nCkBAIC00MzAsMjYgKzQzMiw0OSBAQAogVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgXG1vZHVsZXttZDV9IG1vZHVsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIG5vdGljZToKIAogXGJlZ2lue3ZlcmJhdGltfQotQ29weXJpZ2h0IChDKSAxOTkxLTIsIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIENyZWF0ZWQgMTk5MS4gQWxsCi1yaWdodHMgcmVzZXJ2ZWQuCisgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAotTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgaXQKLWlzIGlkZW50aWZpZWQgYXMgdGhlICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QKLUFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhpcyBzb2Z0d2FyZQotb3IgdGhpcyBmdW5jdGlvbi4KKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgogCi1MaWNlbnNlIGlzIGFsc28gZ3JhbnRlZCB0byBtYWtlIGFuZCB1c2UgZGVyaXZhdGl2ZSB3b3JrcyBwcm92aWRlZAotdGhhdCBzdWNoIHdvcmtzIGFyZSBpZGVudGlmaWVkIGFzICJkZXJpdmVkIGZyb20gdGhlIFJTQSBEYXRhCi1TZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwKLW1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhlIGRlcml2ZWQgd29yay4KKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgogCi1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyBlaXRoZXIKLXRoZSBtZXJjaGFudGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBvciB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcwotc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLXdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5IG9mIGFueSBraW5kLgorICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogCi1UaGVzZSBub3RpY2VzIG11c3QgYmUgcmV0YWluZWQgaW4gYW55IGNvcGllcyBvZiBhbnkgcGFydCBvZiB0aGlzCi1kb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4KKyAgTC4gUGV0ZXIgRGV1dHNjaAorICBnaG9zdEBhbGFkZGluLmNvbQorCisgIEluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIE1ENSAoUkZDIDEzMjEpLgorCisgIFRoaXMgY29kZSBpbXBsZW1lbnRzIHRoZSBNRDUgQWxnb3JpdGhtIGRlZmluZWQgaW4gUkZDIDEzMjEsIHdob3NlCisgIHRleHQgaXMgYXZhaWxhYmxlIGF0CisJaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTMyMS50eHQKKyAgVGhlIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSB0ZXh0IG9mIHRoZSBSRkMsIGluY2x1ZGluZyB0aGUgdGVzdCBzdWl0ZQorICAoc2VjdGlvbiBBLjUpIGJ1dCBleGNsdWRpbmcgdGhlIHJlc3Qgb2YgQXBwZW5kaXggQS4gIEl0IGRvZXMgbm90IGluY2x1ZGUKKyAgYW55IGNvZGUgb3IgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIGlkZW50aWZpZWQgaW4gdGhlIFJGQyBhcyBiZWluZworICBjb3B5cmlnaHRlZC4KKworICBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgbWQ1LmggaXMgTC4gUGV0ZXIgRGV1dHNjaAorICA8Z2hvc3RAYWxhZGRpbi5jb20+LiAgT3RoZXIgYXV0aG9ycyBhcmUgbm90ZWQgaW4gdGhlIGNoYW5nZSBoaXN0b3J5CisgIHRoYXQgZm9sbG93cyAoaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyKToKKworICAyMDAyLTA0LTEzIGxwZCBSZW1vdmVkIHN1cHBvcnQgZm9yIG5vbi1BTlNJIGNvbXBpbGVyczsgcmVtb3ZlZAorCXJlZmVyZW5jZXMgdG8gR2hvc3RzY3JpcHQ7IGNsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7CisJbm93IGhhbmRsZXMgYnl0ZSBvcmRlciBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseS4KKyAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCisgIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSk7CisJYWRkZWQgY29uZGl0aW9uYWxpemF0aW9uIGZvciBDKysgY29tcGlsYXRpb24gZnJvbSBNYXJ0aW4KKwlQdXJzY2hrZSA8cHVyc2Noa2VAYm5sLmdvdj4uCisgIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCiBcZW5ke3ZlcmJhdGltfQogCiAKZGlmZiAtLWdpdCBhL0RvYy9kaXN0L2Rpc3QudGV4IGIvRG9jL2Rpc3QvZGlzdC50ZXgKaW5kZXggZDZkZGFkOC4uM2JhNTFkMCAxMDA2NDQKLS0tIGEvRG9jL2Rpc3QvZGlzdC50ZXgKKysrIGIvRG9jL2Rpc3QvZGlzdC50ZXgKQEAgLTE0NjcsNyArMTQ2Nyw3IEBACiAgIFxsaW5laWl7XCVkZXNjcmlwdGlvbiAoc2VjdGlvbil9e1xvcHRpb257bG9uZ1xfZGVzY3JpcHRpb259fQogXGVuZHt0YWJsZWlpfQogCi1BZGRpdGlvbmFsbHksIHRoZXJlIG1hbnkgb3B0aW9ucyBpbiBcZmlsZXsuc3BlY30gZmlsZXMgdGhhdCBkb24ndCBoYXZlCitBZGRpdGlvbmFsbHksIHRoZXJlIGFyZSBtYW55IG9wdGlvbnMgaW4gXGZpbGV7LnNwZWN9IGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZQogY29ycmVzcG9uZGluZyBvcHRpb25zIGluIHRoZSBzZXR1cCBzY3JpcHQuICBNb3N0IG9mIHRoZXNlIGFyZSBoYW5kbGVkCiB0aHJvdWdoIG9wdGlvbnMgdG8gdGhlIFxjb21tYW5ke2JkaXN0XF9ycG19IGNvbW1hbmQgYXMgZm9sbG93czoKIApAQCAtMTczNyw2ICsxNzM3LDggQEAKIFxjaGFwdGVye1VwbG9hZGluZyBQYWNrYWdlcyB0byB0aGUgUGFja2FnZSBJbmRleH0KIFxsYWJlbHtwYWNrYWdlLXVwbG9hZH0KIAorXHZlcnNpb25hZGRlZHsyLjV9CisKIFRoZSBQeXRob24gUGFja2FnZSBJbmRleCAoUHlQSSkgbm90IG9ubHkgc3RvcmVzIHRoZSBwYWNrYWdlIGluZm8sIGJ1dCBhbHNvIAogdGhlIHBhY2thZ2UgZGF0YSBpZiB0aGUgYXV0aG9yIG9mIHRoZSBwYWNrYWdlIHdpc2hlcyB0by4gVGhlIGRpc3R1dGlscwogY29tbWFuZCBcY29tbWFuZHt1cGxvYWR9IHB1c2hlcyB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzIHRvIFB5UEkuCkBAIC0xNzU0LDggKzE3NTYsMjEgQEAKIGRpc3RyaWJ1dGlvbnMgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgdGhlIGludm9jYXRpb24gaW5jbHVkaW5nCiB0aGUgXGNvbW1hbmR7dXBsb2FkfSBjb21tYW5kIGFyZSB1cGxvYWRlZC4KIAotVGhlIFxjb21tYW5ke3VwbG9hZH0gY29tbWFuZCB1c2VzIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgc3RvcmVkIGluCi10aGUgZmlsZSBcZmlsZXtcJEhPTUUvLnB5cGlyY30sIHNlZSBzZWN0aW9uflxyZWZ7cHlwaXJjfS4KK1RoZSBcY29tbWFuZHt1cGxvYWR9IGNvbW1hbmQgdXNlcyB0aGUgdXNlcm5hbWUsIHBhc3N3b3JkLCBhbmQgcmVwb3NpdG9yeQorVVJMIGZyb20gdGhlIFxmaWxle1wkSE9NRS8ucHlwaXJjfSBmaWxlIChzZWUgc2VjdGlvbn5ccmVme3B5cGlyY30gZm9yCittb3JlIG9uIHRoaXMgZmlsZSkuCisKK1lvdSBjYW4gdXNlIHRoZSBccHJvZ3JhbW9wdHstLXNpZ259IG9wdGlvbiB0byB0ZWxsIFxjb21tYW5ke3VwbG9hZH0gdG8KK3NpZ24gZWFjaCB1cGxvYWRlZCBmaWxlIHVzaW5nIEdQRyAoR05VIFByaXZhY3kgR3VhcmQpLiAgVGhlIAorXHByb2dyYW17Z3BnfSBwcm9ncmFtIG11c3QgYmUgYXZhaWxhYmxlIGZvciBleGVjdXRpb24gb24gdGhlIHN5c3RlbQorXGVudnZhcntQQVRIfS4gIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHdoaWNoIGtleSB0byB1c2UgZm9yIHNpZ25pbmcKK3VzaW5nIHRoZSBccHJvZ3JhbW9wdHstLWlkZW50aXR5PVx2YXJ7bmFtZX19IG9wdGlvbi4KKworT3RoZXIgXGNvbW1hbmR7dXBsb2FkfSBvcHRpb25zIGluY2x1ZGUgCitccHJvZ3JhbW9wdHstLXJlcG9zaXRvcnk9XHZhcnt1cmx9fSAod2hpY2ggbGV0cyB5b3Ugb3ZlcnJpZGUgdGhlCityZXBvc2l0b3J5IHNldHRpbmcgZnJvbSBcZmlsZXtcJEhPTUUvLnB5cGlyY30pLCBhbmQKK1xwcm9ncmFtb3B0ey0tc2hvdy1yZXNwb25zZX0gKHdoaWNoIGRpc3BsYXlzIHRoZSBmdWxsIHJlc3BvbnNlIHRleHQKK2Zyb20gdGhlIFB5UEkgc2VydmVyIGZvciBoZWxwIGluIGRlYnVnZ2luZyB1cGxvYWQgcHJvYmxlbXMpLgogCiBcY2hhcHRlcntFeGFtcGxlc30KIFxsYWJlbHtleGFtcGxlc30KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9yZWdleC50ZXggYi9Eb2MvaG93dG8vcmVnZXgudGV4CmluZGV4IDg3ZmRhZDIuLmY5ODY3YWUgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9yZWdleC50ZXgKKysrIGIvRG9jL2hvd3RvL3JlZ2V4LnRleApAQCAtMzMsMTEgKzMzLDggQEAKIAogVGhlIFxtb2R1bGV7cmV9IG1vZHVsZSB3YXMgYWRkZWQgaW4gUHl0aG9uIDEuNSwgYW5kIHByb3ZpZGVzCiBQZXJsLXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJucy4gIEVhcmxpZXIgdmVyc2lvbnMgb2YgUHl0aG9uCi1jYW1lIHdpdGggdGhlIFxtb2R1bGV7cmVnZXh9IG1vZHVsZSwgd2hpY2ggcHJvdmlkZXMgRW1hY3Mtc3R5bGUKLXBhdHRlcm5zLiAgRW1hY3Mtc3R5bGUgcGF0dGVybnMgYXJlIHNsaWdodGx5IGxlc3MgcmVhZGFibGUgYW5kCi1kb24ndCBwcm92aWRlIGFzIG1hbnkgZmVhdHVyZXMsIHNvIHRoZXJlJ3Mgbm90IG11Y2ggcmVhc29uIHRvIHVzZQotdGhlIFxtb2R1bGV7cmVnZXh9IG1vZHVsZSB3aGVuIHdyaXRpbmcgbmV3IGNvZGUsIHRob3VnaCB5b3UgbWlnaHQKLWVuY291bnRlciBvbGQgY29kZSB0aGF0IHVzZXMgaXQuCitjYW1lIHdpdGggdGhlIFxtb2R1bGV7cmVnZXh9IG1vZHVsZSwgd2hpY2ggcHJvdmlkZWQgRW1hY3Mtc3R5bGUKK3BhdHRlcm5zLiAgXG1vZHVsZXtyZWdleH0gbW9kdWxlIHdhcyByZW1vdmVkIGluIFB5dGhvbiAyLjUuCiAKIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKG9yIFJFcykgYXJlIGVzc2VudGlhbGx5IGEgdGlueSwgaGlnaGx5CiBzcGVjaWFsaXplZCBwcm9ncmFtbWluZyBsYW5ndWFnZSBlbWJlZGRlZCBpbnNpZGUgUHl0aG9uIGFuZCBtYWRlCkBAIC0xNDU4LDcgKzE0NTUsNyBAQAogYnkgTydSZWlsbHkuICBVbmZvcnR1bmF0ZWx5LCBpdCBleGNsdXNpdmVseSBjb25jZW50cmF0ZXMgb24gUGVybCBhbmQKIEphdmEncyBmbGF2b3VycyBvZiByZWd1bGFyIGV4cHJlc3Npb25zLCBhbmQgZG9lc24ndCBjb250YWluIGFueSBQeXRob24KIG1hdGVyaWFsIGF0IGFsbCwgc28gaXQgd29uJ3QgYmUgdXNlZnVsIGFzIGEgcmVmZXJlbmNlIGZvciBwcm9ncmFtbWluZwotaW4gUHl0aG9uLiAgKFRoZSBmaXJzdCBlZGl0aW9uIGNvdmVyZWQgUHl0aG9uJ3Mgbm93LW9ic29sZXRlCitpbiBQeXRob24uICAoVGhlIGZpcnN0IGVkaXRpb24gY292ZXJlZCBQeXRob24ncyBub3ctcmVtb3ZlZAogXG1vZHVsZXtyZWdleH0gbW9kdWxlLCB3aGljaCB3b24ndCBoZWxwIHlvdSBtdWNoLikgIENvbnNpZGVyIGNoZWNraW5nCiBpdCBvdXQgZnJvbSB5b3VyIGxpYnJhcnkuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvY29tcGlsZXIudGV4IGIvRG9jL2xpYi9jb21waWxlci50ZXgKaW5kZXggZTYxOWE5YS4uZjA5MjZlNyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9jb21waWxlci50ZXgKKysrIGIvRG9jL2xpYi9jb21waWxlci50ZXgKQEAgLTQwLDkgKzQwLDkgQEAKIAogXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZX17YnVmfQogUmV0dXJucyBhbiBhYnN0cmFjdCBzeW50YXggdHJlZSBmb3IgdGhlIFB5dGhvbiBzb3VyY2UgY29kZSBpbiBcdmFye2J1Zn0uCi1UaGUgZnVuY3Rpb24gcmFpc2VzIFN5bnRheEVycm9yIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzb3VyY2UKLWNvZGUuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgXGNsYXNze2NvbXBpbGVyLmFzdC5Nb2R1bGV9IGluc3RhbmNlIHRoYXQKLWNvbnRhaW5zIHRoZSB0cmVlLiAgCitUaGUgZnVuY3Rpb24gcmFpc2VzIFxleGNlcHRpb257U3ludGF4RXJyb3J9IGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZQorc291cmNlIGNvZGUuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgXGNsYXNze2NvbXBpbGVyLmFzdC5Nb2R1bGV9IGluc3RhbmNlCit0aGF0IGNvbnRhaW5zIHRoZSB0cmVlLiAgCiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3BhcnNlRmlsZX17cGF0aH0KZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWwtZGlyLnB5IGIvRG9jL2xpYi9lbWFpbC1kaXIucHkKaW5kZXggMmQ4OWEyZi4uYzA0ZjU3ZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbC1kaXIucHkKKysrIGIvRG9jL2xpYi9lbWFpbC1kaXIucHkKQEAgLTEsODMgKzEsNjkgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgogCi0iIiJTZW5kIHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeSBhcyBhIE1JTUUgbWVzc2FnZS4KKyIiIlNlbmQgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5IGFzIGEgTUlNRSBtZXNzYWdlLiIiIgogCi1Vc2FnZTogZGlybWFpbCBbb3B0aW9uc10gZnJvbSB0byBbdG8gLi4uXSoKLQotT3B0aW9uczoKLSAgICAtaCAvIC0taGVscAotICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQuCi0KLSAgICAtZCBkaXJlY3RvcnkKLSAgICAtLWRpcmVjdG9yeT1kaXJlY3RvcnkKLSAgICAgICAgTWFpbCB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksIG90aGVyd2lzZSB1c2UgdGhlCi0gICAgICAgIGN1cnJlbnQgZGlyZWN0b3J5LiAgT25seSB0aGUgcmVndWxhciBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGFyZSBzZW50LAotICAgICAgICBhbmQgd2UgZG9uJ3QgcmVjdXJzZSB0byBzdWJkaXJlY3Rvcmllcy4KLQotYGZyb20nIGlzIHRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSBzZW5kZXIgb2YgdGhlIG1lc3NhZ2UuCi0KLWB0bycgaXMgdGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudCBvZiB0aGUgbWVzc2FnZSwgYW5kIG11bHRpcGxlCi1yZWNpcGllbnRzIG1heSBiZSBnaXZlbi4KLQotVGhlIGVtYWlsIGlzIHNlbnQgYnkgZm9yd2FyZGluZyB0byB5b3VyIGxvY2FsIFNNVFAgc2VydmVyLCB3aGljaCB0aGVuIGRvZXMgdGhlCi1ub3JtYWwgZGVsaXZlcnkgcHJvY2Vzcy4gIFlvdXIgbG9jYWwgbWFjaGluZSBtdXN0IGJlIHJ1bm5pbmcgYW4gU01UUCBzZXJ2ZXIuCi0iIiIKLQotaW1wb3J0IHN5cwogaW1wb3J0IG9zCi1pbXBvcnQgZ2V0b3B0CitpbXBvcnQgc3lzCiBpbXBvcnQgc210cGxpYgogIyBGb3IgZ3Vlc3NpbmcgTUlNRSB0eXBlIGJhc2VkIG9uIGZpbGUgbmFtZSBleHRlbnNpb24KIGltcG9ydCBtaW1ldHlwZXMKIAotZnJvbSBlbWFpbCBpbXBvcnQgRW5jb2RlcnMKLWZyb20gZW1haWwuTWVzc2FnZSBpbXBvcnQgTWVzc2FnZQotZnJvbSBlbWFpbC5NSU1FQXVkaW8gaW1wb3J0IE1JTUVBdWRpbwotZnJvbSBlbWFpbC5NSU1FQmFzZSBpbXBvcnQgTUlNRUJhc2UKLWZyb20gZW1haWwuTUlNRU11bHRpcGFydCBpbXBvcnQgTUlNRU11bHRpcGFydAotZnJvbSBlbWFpbC5NSU1FSW1hZ2UgaW1wb3J0IE1JTUVJbWFnZQotZnJvbSBlbWFpbC5NSU1FVGV4dCBpbXBvcnQgTUlNRVRleHQKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorCitmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycworZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCitmcm9tIGVtYWlsLm1pbWUuYXVkaW8gaW1wb3J0IE1JTUVBdWRpbworZnJvbSBlbWFpbC5taW1lLmJhc2UgaW1wb3J0IE1JTUVCYXNlCitmcm9tIGVtYWlsLm1pbWUuaW1hZ2UgaW1wb3J0IE1JTUVJbWFnZQorZnJvbSBlbWFpbC5taW1lLm11bHRpcGFydCBpbXBvcnQgTUlNRU11bHRpcGFydAorZnJvbSBlbWFpbC5taW1lLnRleHQgaW1wb3J0IE1JTUVUZXh0CiAKIENPTU1BU1BBQ0UgPSAnLCAnCiAKIAotZGVmIHVzYWdlKGNvZGUsIG1zZz0nJyk6Ci0gICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX19kb2NfXwotICAgIGlmIG1zZzoKLSAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCi0gICAgc3lzLmV4aXQoY29kZSkKLQotCiBkZWYgbWFpbigpOgotICAgIHRyeToKLSAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnaGQ6JywgWydoZWxwJywgJ2RpcmVjdG9yeT0nXSkKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6Ci0gICAgICAgIHVzYWdlKDEsIG1zZykKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2U9IiIiXAorU2VuZCB0aGUgY29udGVudHMgb2YgYSBkaXJlY3RvcnkgYXMgYSBNSU1FIG1lc3NhZ2UuCiAKLSAgICBkaXIgPSBvcy5jdXJkaXIKLSAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6Ci0gICAgICAgICAgICB1c2FnZSgwKQotICAgICAgICBlbGlmIG9wdCBpbiAoJy1kJywgJy0tZGlyZWN0b3J5Jyk6Ci0gICAgICAgICAgICBkaXIgPSBhcmcKK1VzYWdlOiAlcHJvZyBbb3B0aW9uc10KIAotICAgIGlmIGxlbihhcmdzKSA8IDI6Ci0gICAgICAgIHVzYWdlKDEpCi0KLSAgICBzZW5kZXIgPSBhcmdzWzBdCi0gICAgcmVjaXBzID0gYXJnc1sxOl0KLQorVW5sZXNzIHRoZSAtbyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBlbWFpbCBpcyBzZW50IGJ5IGZvcndhcmRpbmcgdG8geW91ciBsb2NhbAorU01UUCBzZXJ2ZXIsIHdoaWNoIHRoZW4gZG9lcyB0aGUgbm9ybWFsIGRlbGl2ZXJ5IHByb2Nlc3MuICBZb3VyIGxvY2FsIG1hY2hpbmUKK211c3QgYmUgcnVubmluZyBhbiBTTVRQIHNlcnZlci4KKyIiIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLWQnLCAnLS1kaXJlY3RvcnknLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J3N0cmluZycsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IiIiTWFpbCB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBPbmx5IHRoZSByZWd1bGFyCisgICAgICAgICAgICAgICAgICAgICAgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBhcmUgc2VudCwgYW5kIHdlIGRvbid0IHJlY3Vyc2UgdG8KKyAgICAgICAgICAgICAgICAgICAgICBzdWJkaXJlY3Rvcmllcy4iIiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1vJywgJy0tb3V0cHV0JywKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdzdHJpbmcnLCBhY3Rpb249J3N0b3JlJywgbWV0YXZhcj0nRklMRScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iIiJQcmludCB0aGUgY29tcG9zZWQgbWVzc2FnZSB0byBGSUxFIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kaW5nIHRoZSBtZXNzYWdlIHRvIHRoZSBTTVRQIHNlcnZlci4iIiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1zJywgJy0tc2VuZGVyJywKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdzdHJpbmcnLCBhY3Rpb249J3N0b3JlJywgbWV0YXZhcj0nU0VOREVSJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgdmFsdWUgb2YgdGhlIEZyb206IGhlYWRlciAocmVxdWlyZWQpJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXInLCAnLS1yZWNpcGllbnQnLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J3N0cmluZycsIGFjdGlvbj0nYXBwZW5kJywgbWV0YXZhcj0nUkVDSVBJRU5UJywKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdLCBkZXN0PSdyZWNpcGllbnRzJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdBIFRvOiBoZWFkZXIgdmFsdWUgKGF0IGxlYXN0IG9uZSByZXF1aXJlZCknKQorICAgIG9wdHMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICAgaWYgbm90IG9wdHMuc2VuZGVyIG9yIG5vdCBvcHRzLnJlY2lwaWVudHM6CisgICAgICAgIHBhcnNlci5wcmludF9oZWxwKCkKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBkaXJlY3RvcnkgPSBvcHRzLmRpcmVjdG9yeQorICAgIGlmIG5vdCBkaXJlY3Rvcnk6CisgICAgICAgIGRpcmVjdG9yeSA9ICcuJwogICAgICMgQ3JlYXRlIHRoZSBlbmNsb3NpbmcgKG91dGVyKSBtZXNzYWdlCiAgICAgb3V0ZXIgPSBNSU1FTXVsdGlwYXJ0KCkKLSAgICBvdXRlclsnU3ViamVjdCddID0gJ0NvbnRlbnRzIG9mIGRpcmVjdG9yeSAlcycgJSBvcy5wYXRoLmFic3BhdGgoZGlyKQotICAgIG91dGVyWydUbyddID0gQ09NTUFTUEFDRS5qb2luKHJlY2lwcykKLSAgICBvdXRlclsnRnJvbSddID0gc2VuZGVyCisgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdDb250ZW50cyBvZiBkaXJlY3RvcnkgJXMnICUgb3MucGF0aC5hYnNwYXRoKGRpcmVjdG9yeSkKKyAgICBvdXRlclsnVG8nXSA9IENPTU1BU1BBQ0Uuam9pbihvcHRzLnJlY2lwaWVudHMpCisgICAgb3V0ZXJbJ0Zyb20nXSA9IG9wdHMuc2VuZGVyCiAgICAgb3V0ZXIucHJlYW1ibGUgPSAnWW91IHdpbGwgbm90IHNlZSB0aGlzIGluIGEgTUlNRS1hd2FyZSBtYWlsIHJlYWRlci5cbicKLSAgICAjIFRvIGd1YXJhbnRlZSB0aGUgbWVzc2FnZSBlbmRzIHdpdGggYSBuZXdsaW5lCi0gICAgb3V0ZXIuZXBpbG9ndWUgPSAnJwogCi0gICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyKToKLSAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXIsIGZpbGVuYW1lKQorICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBmaWxlbmFtZSkKICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIyBHdWVzcyB0aGUgY29udGVudCB0eXBlIGJhc2VkIG9uIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uLiAgRW5jb2RpbmcKQEAgLTEwOCwxNiArOTQsMjEgQEAKICAgICAgICAgICAgIG1zZy5zZXRfcGF5bG9hZChmcC5yZWFkKCkpCiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgICAgICAjIEVuY29kZSB0aGUgcGF5bG9hZCB1c2luZyBCYXNlNjQKLSAgICAgICAgICAgIEVuY29kZXJzLmVuY29kZV9iYXNlNjQobXNnKQorICAgICAgICAgICAgZW5jb2RlcnMuZW5jb2RlX2Jhc2U2NChtc2cpCiAgICAgICAgICMgU2V0IHRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIKICAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPWZpbGVuYW1lKQogICAgICAgICBvdXRlci5hdHRhY2gobXNnKQotCi0gICAgIyBOb3cgc2VuZCB0aGUgbWVzc2FnZQotICAgIHMgPSBzbXRwbGliLlNNVFAoKQotICAgIHMuY29ubmVjdCgpCi0gICAgcy5zZW5kbWFpbChzZW5kZXIsIHJlY2lwcywgb3V0ZXIuYXNfc3RyaW5nKCkpCi0gICAgcy5jbG9zZSgpCisgICAgIyBOb3cgc2VuZCBvciBzdG9yZSB0aGUgbWVzc2FnZQorICAgIGNvbXBvc2VkID0gb3V0ZXIuYXNfc3RyaW5nKCkKKyAgICBpZiBvcHRzLm91dHB1dDoKKyAgICAgICAgZnAgPSBvcGVuKG9wdHMub3V0cHV0LCAndycpCisgICAgICAgIGZwLndyaXRlKGNvbXBvc2VkKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgZWxzZToKKyAgICAgICAgcyA9IHNtdHBsaWIuU01UUCgpCisgICAgICAgIHMuY29ubmVjdCgpCisgICAgICAgIHMuc2VuZG1haWwob3B0cy5zZW5kZXIsIG9wdHMucmVjaXBpZW50cywgY29tcG9zZWQpCisgICAgICAgIHMuY2xvc2UoKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsLW1pbWUucHkgYi9Eb2MvbGliL2VtYWlsLW1pbWUucHkKaW5kZXggMDQ4YTU5Zi4uNTA5NzI1MyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbC1taW1lLnB5CisrKyBiL0RvYy9saWIvZW1haWwtbWltZS5weQpAQCAtMiw4ICsyLDggQEAKIGltcG9ydCBzbXRwbGliCiAKICMgSGVyZSBhcmUgdGhlIGVtYWlsIHBhY2thZ2UgbW9kdWxlcyB3ZSdsbCBuZWVkCi1mcm9tIGVtYWlsLk1JTUVJbWFnZSBpbXBvcnQgTUlNRUltYWdlCi1mcm9tIGVtYWlsLk1JTUVNdWx0aXBhcnQgaW1wb3J0IE1JTUVNdWx0aXBhcnQKK2Zyb20gZW1haWwubWltZS5pbWFnZSBpbXBvcnQgTUlNRUltYWdlCitmcm9tIGVtYWlsLm1pbWUubXVsdGlwYXJ0IGltcG9ydCBNSU1FTXVsdGlwYXJ0CiAKIENPTU1BU1BBQ0UgPSAnLCAnCiAKQEAgLTE1LDggKzE1LDYgQEAKIG1zZ1snRnJvbSddID0gbWUKIG1zZ1snVG8nXSA9IENPTU1BU1BBQ0Uuam9pbihmYW1pbHkpCiBtc2cucHJlYW1ibGUgPSAnT3VyIGZhbWlseSByZXVuaW9uJwotIyBHdWFyYW50ZWVzIHRoZSBtZXNzYWdlIGVuZHMgaW4gYSBuZXdsaW5lCi1tc2cuZXBpbG9ndWUgPSAnJwogCiAjIEFzc3VtZSB3ZSBrbm93IHRoYXQgdGhlIGltYWdlIGZpbGVzIGFyZSBhbGwgaW4gUE5HIGZvcm1hdAogZm9yIGZpbGUgaW4gcG5nZmlsZXM6CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsLXNpbXBsZS5weSBiL0RvYy9saWIvZW1haWwtc2ltcGxlLnB5CmluZGV4IGE0NDVmMWIuLjQ0MTUyYTQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvZW1haWwtc2ltcGxlLnB5CisrKyBiL0RvYy9saWIvZW1haWwtc2ltcGxlLnB5CkBAIC0yLDcgKzIsNyBAQAogaW1wb3J0IHNtdHBsaWIKIAogIyBJbXBvcnQgdGhlIGVtYWlsIG1vZHVsZXMgd2UnbGwgbmVlZAotZnJvbSBlbWFpbC5NSU1FVGV4dCBpbXBvcnQgTUlNRVRleHQKK2Zyb20gZW1haWwubWltZS50ZXh0IGltcG9ydCBNSU1FVGV4dAogCiAjIE9wZW4gYSBwbGFpbiB0ZXh0IGZpbGUgZm9yIHJlYWRpbmcuICBGb3IgdGhpcyBleGFtcGxlLCBhc3N1bWUgdGhhdAogIyB0aGUgdGV4dCBmaWxlIGNvbnRhaW5zIG9ubHkgQVNDSUkgY2hhcmFjdGVycy4KZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWwtdW5wYWNrLnB5IGIvRG9jL2xpYi9lbWFpbC11bnBhY2sucHkKaW5kZXggYjE2NmZkYi4uZmMwNWQ5OSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbC11bnBhY2sucHkKKysrIGIvRG9jL2xpYi9lbWFpbC11bnBhY2sucHkKQEAgLTEsNTkgKzEsNDQgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgogCi0iIiJVbnBhY2sgYSBNSU1FIG1lc3NhZ2UgaW50byBhIGRpcmVjdG9yeSBvZiBmaWxlcy4KKyIiIlVucGFjayBhIE1JTUUgbWVzc2FnZSBpbnRvIGEgZGlyZWN0b3J5IG9mIGZpbGVzLiIiIgogCi1Vc2FnZTogdW5wYWNrbWFpbCBbb3B0aW9uc10gbXNnZmlsZQotCi1PcHRpb25zOgotICAgIC1oIC8gLS1oZWxwCi0gICAgICAgIFByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdC4KLQotICAgIC1kIGRpcmVjdG9yeQotICAgIC0tZGlyZWN0b3J5PWRpcmVjdG9yeQotICAgICAgICBVbnBhY2sgdGhlIE1JTUUgbWVzc2FnZSBpbnRvIHRoZSBuYW1lZCBkaXJlY3RvcnksIHdoaWNoIHdpbGwgYmUKLSAgICAgICAgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuCi0KLW1zZ2ZpbGUgaXMgdGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgTUlNRSBtZXNzYWdlLgotIiIiCi0KLWltcG9ydCBzeXMKIGltcG9ydCBvcwotaW1wb3J0IGdldG9wdAoraW1wb3J0IHN5cworaW1wb3J0IGVtYWlsCiBpbXBvcnQgZXJybm8KIGltcG9ydCBtaW1ldHlwZXMKLWltcG9ydCBlbWFpbAogCi0KLWRlZiB1c2FnZShjb2RlLCBtc2c9JycpOgotICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIF9fZG9jX18KLSAgICBpZiBtc2c6Ci0gICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZwotICAgIHN5cy5leGl0KGNvZGUpCitmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKIAogCiBkZWYgbWFpbigpOgotICAgIHRyeToKLSAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnaGQ6JywgWydoZWxwJywgJ2RpcmVjdG9yeT0nXSkKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6Ci0gICAgICAgIHVzYWdlKDEsIG1zZykKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2U9IiIiXAorVW5wYWNrIGEgTUlNRSBtZXNzYWdlIGludG8gYSBkaXJlY3Rvcnkgb2YgZmlsZXMuCiAKLSAgICBkaXIgPSBvcy5jdXJkaXIKLSAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6Ci0gICAgICAgICAgICB1c2FnZSgwKQotICAgICAgICBlbGlmIG9wdCBpbiAoJy1kJywgJy0tZGlyZWN0b3J5Jyk6Ci0gICAgICAgICAgICBkaXIgPSBhcmcKK1VzYWdlOiAlcHJvZyBbb3B0aW9uc10gbXNnZmlsZQorIiIiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctZCcsICctLWRpcmVjdG9yeScsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZT0nc3RyaW5nJywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iIiJVbnBhY2sgdGhlIE1JTUUgbWVzc2FnZSBpbnRvIHRoZSBuYW1lZAorICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwgd2hpY2ggd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgIGV4aXN0LiIiIikKKyAgICBvcHRzLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIGlmIG5vdCBvcHRzLmRpcmVjdG9yeToKKyAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoKQorICAgICAgICBzeXMuZXhpdCgxKQogCiAgICAgdHJ5OgogICAgICAgICBtc2dmaWxlID0gYXJnc1swXQogICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICB1c2FnZSgxKQorICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCisgICAgICAgIHN5cy5leGl0KDEpCiAKICAgICB0cnk6Ci0gICAgICAgIG9zLm1rZGlyKGRpcikKKyAgICAgICAgb3MubWtkaXIob3B0cy5kaXJlY3RvcnkpCiAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CiAgICAgICAgICMgSWdub3JlIGRpcmVjdG9yeSBleGlzdHMgZXJyb3IKLSAgICAgICAgaWYgZS5lcnJubyA8PiBlcnJuby5FRVhJU1Q6IHJhaXNlCisgICAgICAgIGlmIGUuZXJybm8gPD4gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgcmFpc2UKIAogICAgIGZwID0gb3Blbihtc2dmaWxlKQogICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQpAQCAtNzQsOCArNTksOCBAQAogICAgICAgICAgICAgICAgIGV4dCA9ICcuYmluJwogICAgICAgICAgICAgZmlsZW5hbWUgPSAncGFydC0lMDNkJXMnICUgKGNvdW50ZXIsIGV4dCkKICAgICAgICAgY291bnRlciArPSAxCi0gICAgICAgIGZwID0gb3Blbihvcy5wYXRoLmpvaW4oZGlyLCBmaWxlbmFtZSksICd3YicpCi0gICAgICAgIGZwLndyaXRlKHBhcnQuZ2V0X3BheWxvYWQoZGVjb2RlPTEpKQorICAgICAgICBmcCA9IG9wZW4ob3MucGF0aC5qb2luKG9wdHMuZGlyZWN0b3J5LCBmaWxlbmFtZSksICd3YicpCisgICAgICAgIGZwLndyaXRlKHBhcnQuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpKQogICAgICAgICBmcC5jbG9zZSgpCiAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbC50ZXggYi9Eb2MvbGliL2VtYWlsLnRleAppbmRleCAzYTkwZTIyLi42ODUzMzI1IDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsLnRleAorKysgYi9Eb2MvbGliL2VtYWlsLnRleApAQCAtMSw0ICsxLDQgQEAKLSUgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyUgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICUgQXV0aG9yOiBiYXJyeUBweXRob24ub3JnIChCYXJyeSBXYXJzYXcpCiAKIFxzZWN0aW9ue1xtb2R1bGV7ZW1haWx9IC0tLQpAQCAtMTgsMTAgKzE4LDEwIEBACiBzdWNoIGFzIFxyZWZtb2R1bGV7cmZjODIyfSwgXHJlZm1vZHVsZXttaW1ldG9vbHN9LAogXHJlZm1vZHVsZXttdWx0aWZpbGV9LCBhbmQgb3RoZXIgbm9uLXN0YW5kYXJkIHBhY2thZ2VzIHN1Y2ggYXMKIFxtb2R1bGV7bWltZWNudGx9LiAgSXQgaXMgc3BlY2lmaWNhbGx5IFxlbXBoe25vdH0gZGVzaWduZWQgdG8gZG8gYW55Ci1zZW5kaW5nIG9mIGVtYWlsIG1lc3NhZ2VzIHRvIFNNVFAgKFxyZmN7MjgyMX0pIHNlcnZlcnM7IHRoYXQgaXMgdGhlCi1mdW5jdGlvbiBvZiB0aGUgXHJlZm1vZHVsZXtzbXRwbGlifSBtb2R1bGUuICBUaGUgXG1vZHVsZXtlbWFpbH0KLXBhY2thZ2UgYXR0ZW1wdHMgdG8gYmUgYXMgUkZDLWNvbXBsaWFudCBhcyBwb3NzaWJsZSwgc3VwcG9ydGluZyBpbgotYWRkaXRpb24gdG8gXHJmY3syODIyfSwgc3VjaCBNSU1FLXJlbGF0ZWQgUkZDcyBhcworc2VuZGluZyBvZiBlbWFpbCBtZXNzYWdlcyB0byBTTVRQIChccmZjezI4MjF9KSwgTk5UUCwgb3Igb3RoZXIgc2VydmVyczsgdGhvc2UKK2FyZSBmdW5jdGlvbnMgb2YgbW9kdWxlcyBzdWNoIGFzIFxyZWZtb2R1bGV7c210cGxpYn0gYW5kIFxyZWZtb2R1bGV7bm50cGxpYn0uCitUaGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBhdHRlbXB0cyB0byBiZSBhcyBSRkMtY29tcGxpYW50IGFzIHBvc3NpYmxlLAorc3VwcG9ydGluZyBpbiBhZGRpdGlvbiB0byBccmZjezI4MjJ9LCBzdWNoIE1JTUUtcmVsYXRlZCBSRkNzIGFzCiBccmZjezIwNDV9LCBccmZjezIwNDZ9LCBccmZjezIwNDd9LCBhbmQgXHJmY3syMjMxfS4KIAogVGhlIHByaW1hcnkgZGlzdGluZ3Vpc2hpbmcgZmVhdHVyZSBvZiB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBpcwpAQCAtNDEsNyArNDEsNyBAQAogc2hvdWxkIGJlIGNvbW1vbiBpbiBhcHBsaWNhdGlvbnM6IGFuIGVtYWlsIG1lc3NhZ2UgaXMgcmVhZCBhcyBmbGF0CiB0ZXh0IGZyb20gYSBmaWxlIG9yIG90aGVyIHNvdXJjZSwgdGhlIHRleHQgaXMgcGFyc2VkIHRvIHByb2R1Y2UgdGhlCiBvYmplY3Qgc3RydWN0dXJlIG9mIHRoZSBlbWFpbCBtZXNzYWdlLCB0aGlzIHN0cnVjdHVyZSBpcyBtYW5pcHVsYXRlZCwKLWFuZCBmaW5hbGx5IHJlbmRlcmVkIGJhY2sgaW50byBmbGF0IHRleHQuCithbmQgZmluYWxseSwgdGhlIG9iamVjdCB0cmVlIGlzIHJlbmRlcmVkIGJhY2sgaW50byBmbGF0IHRleHQuCiAKIEl0IGlzIHBlcmZlY3RseSBmZWFzaWJsZSB0byBjcmVhdGUgdGhlIG9iamVjdCBzdHJ1Y3R1cmUgb3V0IG9mIHdob2xlCiBjbG90aCAtLS0gaS5lLiBjb21wbGV0ZWx5IGZyb20gc2NyYXRjaC4gIEZyb20gdGhlcmUsIGEgc2ltaWxhcgpAQCAtNTYsNiArNTYsNyBAQAogCiBcYmVnaW57c2VlYWxzb30KICAgICBcc2VlbW9kdWxle3NtdHBsaWJ9e1NNVFAgcHJvdG9jb2wgY2xpZW50fQorICAgIFxzZWVtb2R1bGV7bm50cGxpYn17Tk5UUCBwcm90b2NvbCBjbGllbnR9CiBcZW5ke3NlZWFsc299CiAKIFxzdWJzZWN0aW9ue1JlcHJlc2VudGluZyBhbiBlbWFpbCBtZXNzYWdlfQpAQCAtODgsMjIgKzg5LDUxIEBACiBcc3Vic2VjdGlvbntJdGVyYXRvcnN9CiBcaW5wdXR7ZW1haWxpdGVyfQogCi1cc3Vic2VjdGlvbntQYWNrYWdlIEhpc3Rvcnl9Citcc3Vic2VjdGlvbntQYWNrYWdlIEhpc3RvcnlcbGFiZWx7ZW1haWwtcGtnLWhpc3Rvcnl9fQogCi1WZXJzaW9uIDEgb2YgdGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2Ugd2FzIGJ1bmRsZWQgd2l0aCBQeXRob24KLXJlbGVhc2VzIHVwIHRvIFB5dGhvbiAyLjIuMS4gIFZlcnNpb24gMiB3YXMgZGV2ZWxvcGVkIGZvciB0aGUgUHl0aG9uCi0yLjMgcmVsZWFzZSwgYW5kIGJhY2twb3J0ZWQgdG8gUHl0aG9uIDIuMi4yLiAgSXQgd2FzIGFsc28gYXZhaWxhYmxlIGFzCi1hIHNlcGFyYXRlIGRpc3R1dGlscy1iYXNlZCBwYWNrYWdlLCBhbmQgaXMgY29tcGF0aWJsZSBiYWNrIHRvIFB5dGhvbiAyLjEuCitUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgcmVsZWFzZSBoaXN0b3J5IG9mIHRoZSBlbWFpbCBwYWNrYWdlLCBjb3JyZXNwb25kaW5nCit0byB0aGUgdmVyc2lvbiBvZiBQeXRob24gdGhhdCB0aGUgcGFja2FnZSB3YXMgcmVsZWFzZWQgd2l0aC4gIEZvciBwdXJwb3NlcyBvZgordGhpcyBkb2N1bWVudCwgd2hlbiB5b3Ugc2VlIGEgbm90ZSBhYm91dCBjaGFuZ2Ugb3IgYWRkZWQgdmVyc2lvbnMsIHRoZXNlIHJlZmVyCit0byB0aGUgUHl0aG9uIHZlcnNpb24gdGhlIGNoYW5nZSB3YXMgbWFkZSBpdCwgXGVtcGh7bm90fSB0aGUgZW1haWwgcGFja2FnZQordmVyc2lvbi4gIFRoaXMgdGFibGUgYWxzbyBkZXNjcmliZXMgdGhlIFB5dGhvbiBjb21wYXRpYmlsaXR5IG9mIGVhY2ggdmVyc2lvbgorb2YgdGhlIHBhY2thZ2UuCiAKLVxtb2R1bGV7ZW1haWx9IHZlcnNpb24gMy4wIHdhcyByZWxlYXNlZCB3aXRoIFB5dGhvbiAyLjQgYW5kIGFzIGEgc2VwYXJhdGUKLWRpc3R1dGlscy1iYXNlZCBwYWNrYWdlLiAgSXQgaXMgY29tcGF0aWJsZSBiYWNrIHRvIFB5dGhvbiAyLjMuCitcYmVnaW57dGFibGVpaWl9e2x8bHxsfXtjb25zdGFudH17ZW1haWwgdmVyc2lvbn17ZGlzdHJpYnV0ZWQgd2l0aH17Y29tcGF0aWJsZSB3aXRofQorXGxpbmVpaWl7MS54fXtQeXRob24gMi4yLjAgdG8gUHl0aG9uIDIuMi4xfXtcZW1waHtubyBsb25nZXIgc3VwcG9ydGVkfX0KK1xsaW5laWlpezIuNX17UHl0aG9uIDIuMi4yKyBhbmQgUHl0aG9uIDIuM317UHl0aG9uIDIuMSB0byAyLjV9CitcbGluZWlpaXszLjB9e1B5dGhvbiAyLjR9e1B5dGhvbiAyLjMgdG8gMi41fQorXGxpbmVpaWl7NC4wfXtQeXRob24gMi41fXtQeXRob24gMi4zIHRvIDIuNX0KK1xlbmR7dGFibGVpaWl9CiAKLUhlcmUgYXJlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFxtb2R1bGV7ZW1haWx9IHZlcnNpb24gMyBhbmQgdmVyc2lvbiAyOgorSGVyZSBhcmUgdGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gXG1vZHVsZXtlbWFpbH0gdmVyc29uIDQgYW5kIHZlcnNpb24gMzoKKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBBbGwgbW9kdWxlcyBoYXZlIGJlZW4gcmVuYW1lZCBhY2NvcmRpbmcgdG8gXHBlcHs4fSBzdGFuZGFyZHMuICBGb3IKKyAgICAgIGV4YW1wbGUsIHRoZSB2ZXJzaW9uIDMgbW9kdWxlIFxtb2R1bGV7ZW1haWwuTWVzc2FnZX0gd2FzIHJlbmFtZWQgdG8KKyAgICAgIFxtb2R1bGV7ZW1haWwubWVzc2FnZX0gaW4gdmVyc2lvbiA0LgorCitcaXRlbSBBIG5ldyBzdWJwYWNrYWdlIFxtb2R1bGV7ZW1haWwubWltZX0gd2FzIGFkZGVkIGFuZCBhbGwgdGhlIHZlcnNpb24gMworICAgICAgXG1vZHVsZXtlbWFpbC5NSU1FKn0gbW9kdWxlcyB3ZXJlIHJlbmFtZWQgYW5kIHNpdHVhdGVkIGludG8gdGhlCisgICAgICBcbW9kdWxle2VtYWlsLm1pbWV9IHN1YnBhY2thZ2UuICBGb3IgZXhhbXBsZSwgdGhlIHZlcnNpb24gMyBtb2R1bGUKKyAgICAgIFxtb2R1bGV7ZW1haWwuTUlNRVRleHR9IHdhcyByZW5hbWVkIHRvIFxtb2R1bGV7ZW1haWwubWltZS50ZXh0fS4KKworICAgICAgXGVtcGh7Tm90ZSB0aGF0IHRoZSB2ZXJzaW9uIDMgbmFtZXMgd2lsbCBjb250aW51ZSB0byB3b3JrIHVudGlsIFB5dGhvbgorICAgICAgMi42fS4KKworXGl0ZW0gVGhlIFxtb2R1bGV7ZW1haWwubWltZS5hcHBsaWNhdGlvbn0gbW9kdWxlIHdhcyBhZGRlZCwgd2hpY2ggY29udGFpbnMgdGhlCisgICAgICBcY2xhc3N7TUlNRUFwcGxpY2F0aW9ufSBjbGFzcy4KKworXGl0ZW0gTWV0aG9kcyB0aGF0IHdlcmUgZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDMgaGF2ZSBiZWVuIHJlbW92ZWQuICBUaGVzZQorICAgICAgaW5jbHVkZSBcbWV0aG9ke0dlbmVyYXRvci5fX2NhbGxfXygpfSwgXG1ldGhvZHtNZXNzYWdlLmdldF90eXBlKCl9LAorICAgICAgXG1ldGhvZHtNZXNzYWdlLmdldF9tYWluX3R5cGUoKX0sIFxtZXRob2R7TWVzc2FnZS5nZXRfc3VidHlwZSgpfS4KK1xlbmR7aXRlbWl6ZX0KKworSGVyZSBhcmUgdGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gXG1vZHVsZXtlbWFpbH0gdmVyc2lvbiAzIGFuZCB2ZXJzaW9uIDI6CiAKIFxiZWdpbntpdGVtaXplfQogXGl0ZW0gVGhlIFxjbGFzc3tGZWVkUGFyc2VyfSBjbGFzcyB3YXMgaW50cm9kdWNlZCwgYW5kIHRoZSBcY2xhc3N7UGFyc2VyfQogICAgICAgY2xhc3Mgd2FzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZSBcY2xhc3N7RmVlZFBhcnNlcn0uICBBbGwgcGFyc2luZwotICAgICAgdGhlcmUgZm9yIGlzIG5vbi1zdHJpY3QsIGFuZCBwYXJzaW5nIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IG5ldmVyIHRvCisgICAgICB0aGVyZWZvcmUgaXMgbm9uLXN0cmljdCwgYW5kIHBhcnNpbmcgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgbmV2ZXIgdG8KICAgICAgIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFByb2JsZW1zIGZvdW5kIHdoaWxlIHBhcnNpbmcgbWVzc2FnZXMgYXJlIHN0b3JlZCBpbgogICAgICAgdGhlIG1lc3NhZ2UncyBcdmFye2RlZmVjdH0gYXR0cmlidXRlLgogCkBAIC0xMTcsNyArMTQ3LDcgQEAKICAgICAgIFxtZXRob2R7R2VuZXJhdG9yLl9fY2FsbF9fKCl9LCBcbWV0aG9ke01lc3NhZ2UuZ2V0X3R5cGUoKX0sCiAgICAgICBcbWV0aG9ke01lc3NhZ2UuZ2V0X21haW5fdHlwZSgpfSwgXG1ldGhvZHtNZXNzYWdlLmdldF9zdWJ0eXBlKCl9LCBhbmQKICAgICAgIHRoZSBcdmFye3N0cmljdH0gYXJndW1lbnQgdG8gdGhlIFxjbGFzc3tQYXJzZXJ9IGNsYXNzLiAgVGhlc2UgYXJlCi0gICAgICBleHBlY3RlZCB0byBiZSByZW1vdmVkIGluIGVtYWlsIDMuMS4KKyAgICAgIGV4cGVjdGVkIHRvIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLgogCiBcaXRlbSBTdXBwb3J0IGZvciBQeXRob25zIGVhcmxpZXIgdGhhbiAyLjMgaGFzIGJlZW4gcmVtb3ZlZC4KIFxlbmR7aXRlbWl6ZX0KQEAgLTI3OCwxMiArMzA4LDEyIEBACiBcaXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7Z2V0cGF5bG9hZGFzdGV4dCgpfSB3YXMgcmVtb3ZlZC4gIFNpbWlsYXIKICAgICAgIGZ1bmN0aW9uYWxpdHkKICAgICAgIGlzIHN1cHBvcnRlZCBieSB0aGUgXGNsYXNze0RlY29kZWRHZW5lcmF0b3J9IGNsYXNzIGluIHRoZQotICAgICAgXHJlZm1vZHVsZXtlbWFpbC5HZW5lcmF0b3J9IG1vZHVsZS4KKyAgICAgIFxyZWZtb2R1bGV7ZW1haWwuZ2VuZXJhdG9yfSBtb2R1bGUuCiAKIFxpdGVtIFRoZSBtZXRob2QgXG1ldGhvZHtnZXRib2R5YXN0ZXh0KCl9IHdhcyByZW1vdmVkLiAgWW91IGNhbiBnZXQKICAgICAgIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBieSBjcmVhdGluZyBhbiBpdGVyYXRvciB3aXRoCiAgICAgICBcZnVuY3Rpb257dHlwZWRfc3VicGFydF9pdGVyYXRvcigpfSBpbiB0aGUKLSAgICAgIFxyZWZtb2R1bGV7ZW1haWwuSXRlcmF0b3JzfSBtb2R1bGUuCisgICAgICBccmVmbW9kdWxle2VtYWlsLml0ZXJhdG9yc30gbW9kdWxlLgogXGVuZHtpdGVtaXplfQogCiBUaGUgXGNsYXNze1BhcnNlcn0gY2xhc3MgaGFzIG5vIGRpZmZlcmVuY2VzIGluIGl0cyBwdWJsaWMgaW50ZXJmYWNlLgpAQCAtMjk1LDcgKzMyNSw3IEBACiBpbiBccmZjezE4OTR9Ln0uCiAKIFRoZSBcY2xhc3N7R2VuZXJhdG9yfSBjbGFzcyBoYXMgbm8gZGlmZmVyZW5jZXMgaW4gaXRzIHB1YmxpYwotaW50ZXJmYWNlLiAgVGhlcmUgaXMgYSBuZXcgY2xhc3MgaW4gdGhlIFxyZWZtb2R1bGV7ZW1haWwuR2VuZXJhdG9yfQoraW50ZXJmYWNlLiAgVGhlcmUgaXMgYSBuZXcgY2xhc3MgaW4gdGhlIFxyZWZtb2R1bGV7ZW1haWwuZ2VuZXJhdG9yfQogbW9kdWxlIHRob3VnaCwgY2FsbGVkIFxjbGFzc3tEZWNvZGVkR2VuZXJhdG9yfSB3aGljaCBwcm92aWRlcyBtb3N0IG9mCiB0aGUgZnVuY3Rpb25hbGl0eSBwcmV2aW91c2x5IGF2YWlsYWJsZSBpbiB0aGUKIFxtZXRob2R7TWVzc2FnZS5nZXRwYXlsb2FkYXN0ZXh0KCl9IG1ldGhvZC4KQEAgLTMyOSwxMSArMzU5LDExIEBACiAKIFxtb2R1bGV7bWltZWxpYn0gcHJvdmlkZWQgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucyBpbiBpdHMKIFxtb2R1bGV7YWRkcmVzc30gYW5kIFxtb2R1bGV7ZGF0ZX0gbW9kdWxlcy4gIEFsbCBvZiB0aGVzZSBmdW5jdGlvbnMKLWhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgXHJlZm1vZHVsZXtlbWFpbC5VdGlsc30gbW9kdWxlLgoraGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSBccmVmbW9kdWxle2VtYWlsLnV0aWxzfSBtb2R1bGUuCiAKIFRoZSBcY29kZXtNc2dSZWFkZXJ9IGNsYXNzL21vZHVsZSBoYXMgYmVlbiByZW1vdmVkLiAgSXRzIGZ1bmN0aW9uYWxpdHkKIGlzIG1vc3QgY2xvc2VseSBzdXBwb3J0ZWQgaW4gdGhlIFxmdW5jdGlvbntib2R5X2xpbmVfaXRlcmF0b3IoKX0KLWZ1bmN0aW9uIGluIHRoZSBccmVmbW9kdWxle2VtYWlsLkl0ZXJhdG9yc30gbW9kdWxlLgorZnVuY3Rpb24gaW4gdGhlIFxyZWZtb2R1bGV7ZW1haWwuaXRlcmF0b3JzfSBtb2R1bGUuCiAKIFxzdWJzZWN0aW9ue0V4YW1wbGVzfQogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsY2hhcnNldHMudGV4IGIvRG9jL2xpYi9lbWFpbGNoYXJzZXRzLnRleAppbmRleCAxOGYyYTAxLi5lMGJlNjhhIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsY2hhcnNldHMudGV4CisrKyBiL0RvYy9saWIvZW1haWxjaGFyc2V0cy50ZXgKQEAgLTEsNCArMSw0IEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuQ2hhcnNldH0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5jaGFyc2V0fQogXG1vZHVsZXN5bm9wc2lze0NoYXJhY3RlciBTZXRzfQogCiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNsYXNzIFxjbGFzc3tDaGFyc2V0fSBmb3IgcmVwcmVzZW50aW5nCkBAIC03LDYgKzcsOCBAQAogbWFuaXB1bGF0aW5nIHRoaXMgcmVnaXN0cnkuICBJbnN0YW5jZXMgb2YgXGNsYXNze0NoYXJzZXR9IGFyZSB1c2VkIGluCiBzZXZlcmFsIG90aGVyIG1vZHVsZXMgd2l0aGluIHRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlLgogCitJbXBvcnQgdGhpcyBjbGFzcyBmcm9tIHRoZSBcbW9kdWxle2VtYWlsLmNoYXJzZXR9IG1vZHVsZS4KKwogXHZlcnNpb25hZGRlZHsyLjIuMn0KIAogXGJlZ2lue2NsYXNzZGVzY317Q2hhcnNldH17XG9wdGlvbmFse2lucHV0X2NoYXJzZXR9fQpAQCAtMTUzLDcgKzE1NSw3IEBACiBmb3IgbXVsdGlieXRlIGNoYXJhY3RlciBzZXRzLCB3aGljaCBoYXZlIGxpbmUgbGVuZ3RoIGlzc3VlcyAobXVsdGlieXRlCiBjaGFyYWN0ZXJzIG11c3QgYmUgc3BsaXQgb24gYSBjaGFyYWN0ZXIsIG5vdCBhIGJ5dGUgYm91bmRhcnkpOyB1c2UgdGhlCiBoaWdoZXItbGV2ZWwgXGNsYXNze0hlYWRlcn0gY2xhc3MgdG8gZGVhbCB3aXRoIHRoZXNlIGlzc3VlcyAoc2VlCi1ccmVmbW9kdWxle2VtYWlsLkhlYWRlcn0pLiAgXHZhcntjb252ZXJ0fSBkZWZhdWx0cyB0byBcY29kZXtGYWxzZX0uCitccmVmbW9kdWxle2VtYWlsLmhlYWRlcn0pLiAgXHZhcntjb252ZXJ0fSBkZWZhdWx0cyB0byBcY29kZXtGYWxzZX0uCiAKIFRoZSB0eXBlIG9mIGVuY29kaW5nIChiYXNlNjQgb3IgcXVvdGVkLXByaW50YWJsZSkgd2lsbCBiZSBiYXNlZCBvbgogdGhlIFx2YXJ7aGVhZGVyX2VuY29kaW5nfSBhdHRyaWJ1dGUuCkBAIC0xODgsNyArMTkwLDcgQEAKIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gY29tcGFyZSB0d28gXGNsYXNze0NoYXJzZXR9IGluc3RhbmNlcyBmb3IgaW5lcXVhbGl0eS4KIFxlbmR7bWV0aG9kZGVzY30KIAotVGhlIFxtb2R1bGV7ZW1haWwuQ2hhcnNldH0gbW9kdWxlIGFsc28gcHJvdmlkZXMgdGhlIGZvbGxvd2luZworVGhlIFxtb2R1bGV7ZW1haWwuY2hhcnNldH0gbW9kdWxlIGFsc28gcHJvdmlkZXMgdGhlIGZvbGxvd2luZwogZnVuY3Rpb25zIGZvciBhZGRpbmcgbmV3IGVudHJpZXMgdG8gdGhlIGdsb2JhbCBjaGFyYWN0ZXIgc2V0LCBhbGlhcywKIGFuZCBjb2RlYyByZWdpc3RyaWVzOgogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsZW5jb2RlcnMudGV4IGIvRG9jL2xpYi9lbWFpbGVuY29kZXJzLnRleAppbmRleCBhNDllMDRkLi4zZDA1YzJhIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsZW5jb2RlcnMudGV4CisrKyBiL0RvYy9saWIvZW1haWxlbmNvZGVycy50ZXgKQEAgLTEsNCArMSw0IEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuRW5jb2RlcnN9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuZW5jb2RlcnN9CiBcbW9kdWxlc3lub3BzaXN7RW5jb2RlcnMgZm9yIGVtYWlsIG1lc3NhZ2UgcGF5bG9hZHMufQogCiBXaGVuIGNyZWF0aW5nIFxjbGFzc3tNZXNzYWdlfSBvYmplY3RzIGZyb20gc2NyYXRjaCwgeW91IG9mdGVuIG5lZWQgdG8KQEAgLTcsNyArNyw3IEBACiB0eXBlIG1lc3NhZ2VzIGNvbnRhaW5pbmcgYmluYXJ5IGRhdGEuCiAKIFRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlIHByb3ZpZGVzIHNvbWUgY29udmVuaWVudCBlbmNvZGluZ3MgaW4gaXRzCi1cbW9kdWxle0VuY29kZXJzfSBtb2R1bGUuICBUaGVzZSBlbmNvZGVycyBhcmUgYWN0dWFsbHkgdXNlZCBieSB0aGUKK1xtb2R1bGV7ZW5jb2RlcnN9IG1vZHVsZS4gIFRoZXNlIGVuY29kZXJzIGFyZSBhY3R1YWxseSB1c2VkIGJ5IHRoZQogXGNsYXNze01JTUVBdWRpb30gYW5kIFxjbGFzc3tNSU1FSW1hZ2V9IGNsYXNzIGNvbnN0cnVjdG9ycyB0byBwcm92aWRlIGRlZmF1bHQKIGVuY29kaW5ncy4gIEFsbCBlbmNvZGVyIGZ1bmN0aW9ucyB0YWtlIGV4YWN0bHkgb25lIGFyZ3VtZW50LCB0aGUgbWVzc2FnZQogb2JqZWN0IHRvIGVuY29kZS4gIFRoZXkgdXN1YWxseSBleHRyYWN0IHRoZSBwYXlsb2FkLCBlbmNvZGUgaXQsIGFuZCByZXNldCB0aGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWxleGMudGV4IGIvRG9jL2xpYi9lbWFpbGV4Yy50ZXgKaW5kZXggNmFjMDg4OS4uM2NlZjFkNSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbGV4Yy50ZXgKKysrIGIvRG9jL2xpYi9lbWFpbGV4Yy50ZXgKQEAgLTEsOCArMSw4IEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuRXJyb3JzfQorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLmVycm9yc30KIFxtb2R1bGVzeW5vcHNpc3tUaGUgZXhjZXB0aW9uIGNsYXNzZXMgdXNlZCBieSB0aGUgZW1haWwgcGFja2FnZS59CiAKIFRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGNsYXNzZXMgYXJlIGRlZmluZWQgaW4gdGhlCi1cbW9kdWxle2VtYWlsLkVycm9yc30gbW9kdWxlOgorXG1vZHVsZXtlbWFpbC5lcnJvcnN9IG1vZHVsZToKIAogXGJlZ2lue2V4Y2NsYXNzZGVzY317TWVzc2FnZUVycm9yfXt9CiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyB0aGF0IHRoZSBcbW9kdWxle2VtYWlsfQpAQCAtNTksNyArNTksNyBAQAogXG1pbWV0eXBle211bHRpcGFydC9hbHRlcm5hdGl2ZX0gaGFkIGEgbWFsZm9ybWVkIGhlYWRlciwgdGhhdCBuZXN0ZWQgbWVzc2FnZQogb2JqZWN0IHdvdWxkIGhhdmUgYSBkZWZlY3QsIGJ1dCB0aGUgY29udGFpbmluZyBtZXNzYWdlcyB3b3VsZCBub3QuCiAKLUFsbCBkZWZlY3QgY2xhc3NlcyBhcmUgc3ViY2xhc3NlZCBmcm9tIFxjbGFzc3tlbWFpbC5FcnJvcnMuTWVzc2FnZURlZmVjdH0sIGJ1dAorQWxsIGRlZmVjdCBjbGFzc2VzIGFyZSBzdWJjbGFzc2VkIGZyb20gXGNsYXNze2VtYWlsLmVycm9ycy5NZXNzYWdlRGVmZWN0fSwgYnV0CiB0aGlzIGNsYXNzIGlzIFxlbXBoe25vdH0gYW4gZXhjZXB0aW9uIQogCiBcdmVyc2lvbmFkZGVkW0FsbCB0aGUgZGVmZWN0IGNsYXNzZXMgd2VyZSBhZGRlZF17Mi40fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbGdlbmVyYXRvci50ZXggYi9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleAppbmRleCAzMzBhYmMwLi4zNDE1NDQyIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleAorKysgYi9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleApAQCAtMSw0ICsxLDQgQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5HZW5lcmF0b3J9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuZ2VuZXJhdG9yfQogXG1vZHVsZXN5bm9wc2lze0dlbmVyYXRlIGZsYXQgdGV4dCBlbWFpbCBtZXNzYWdlcyBmcm9tIGEgbWVzc2FnZSBzdHJ1Y3R1cmUufQogCiBPbmUgb2YgdGhlIG1vc3QgY29tbW9uIHRhc2tzIGlzIHRvIGdlbmVyYXRlIHRoZSBmbGF0IHRleHQgb2YgdGhlIGVtYWlsCkBAIC04LDcgKzgsNyBAQAogY29uc29sZS4gIFRha2luZyBhIG1lc3NhZ2Ugb2JqZWN0IHN0cnVjdHVyZSBhbmQgcHJvZHVjaW5nIGEgZmxhdCB0ZXh0CiBkb2N1bWVudCBpcyB0aGUgam9iIG9mIHRoZSBcY2xhc3N7R2VuZXJhdG9yfSBjbGFzcy4KIAotQWdhaW4sIGFzIHdpdGggdGhlIFxyZWZtb2R1bGV7ZW1haWwuUGFyc2VyfSBtb2R1bGUsIHlvdSBhcmVuJ3QgbGltaXRlZAorQWdhaW4sIGFzIHdpdGggdGhlIFxyZWZtb2R1bGV7ZW1haWwucGFyc2VyfSBtb2R1bGUsIHlvdSBhcmVuJ3QgbGltaXRlZAogdG8gdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGJ1bmRsZWQgZ2VuZXJhdG9yOyB5b3UgY291bGQgd3JpdGUgb25lCiBmcm9tIHNjcmF0Y2ggeW91cnNlbGYuICBIb3dldmVyIHRoZSBidW5kbGVkIGdlbmVyYXRvciBrbm93cyBob3cgdG8KIGdlbmVyYXRlIG1vc3QgZW1haWwgaW4gYSBzdGFuZGFyZHMtY29tcGxpYW50IHdheSwgc2hvdWxkIGhhbmRsZSBNSU1FCkBAIC0xNyw3ICsxNyw4IEBACiBcY2xhc3N7UGFyc2VyfSBjbGFzcywgYW5kIGJhY2sgdG8gZmxhdCB0ZXh0LCBpcyBpZGVtcG90ZW50ICh0aGUgaW5wdXQKIGlzIGlkZW50aWNhbCB0byB0aGUgb3V0cHV0KS4KIAotSGVyZSBhcmUgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBcY2xhc3N7R2VuZXJhdG9yfSBjbGFzczoKK0hlcmUgYXJlIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgXGNsYXNze0dlbmVyYXRvcn0gY2xhc3MsIGltcG9ydGVkIGZyb20gdGhlCitcbW9kdWxle2VtYWlsLmdlbmVyYXRvcn0gbW9kdWxlOgogCiBcYmVnaW57Y2xhc3NkZXNjfXtHZW5lcmF0b3J9e291dGZwXG9wdGlvbmFseywgbWFuZ2xlX2Zyb21fXG9wdGlvbmFseywKICAgICBtYXhoZWFkZXJsZW59fX0KQEAgLTQwLDcgKzQxLDcgQEAKIE9wdGlvbmFsIFx2YXJ7bWF4aGVhZGVybGVufSBzcGVjaWZpZXMgdGhlIGxvbmdlc3QgbGVuZ3RoIGZvciBhCiBub24tY29udGludWVkIGhlYWRlci4gIFdoZW4gYSBoZWFkZXIgbGluZSBpcyBsb25nZXIgdGhhbgogXHZhcnttYXhoZWFkZXJsZW59IChpbiBjaGFyYWN0ZXJzLCB3aXRoIHRhYnMgZXhwYW5kZWQgdG8gOCBzcGFjZXMpLAotdGhlIGhlYWRlciB3aWxsIGJlIHNwbGl0IGFzIGRlZmluZWQgaW4gdGhlIFxtb2R1bGV7ZW1haWwuSGVhZGVyfQordGhlIGhlYWRlciB3aWxsIGJlIHNwbGl0IGFzIGRlZmluZWQgaW4gdGhlIFxtb2R1bGV7ZW1haWwuaGVhZGVyLkhlYWRlcn0KIGNsYXNzLiAgU2V0IHRvIHplcm8gdG8gZGlzYWJsZSBoZWFkZXIgd3JhcHBpbmcuICBUaGUgZGVmYXVsdCBpcyA3OCwgYXMKIHJlY29tbWVuZGVkIChidXQgbm90IHJlcXVpcmVkKSBieSBccmZjezI4MjJ9LgogXGVuZHtjbGFzc2Rlc2N9CkBAIC04MSw5ICs4Miw5IEBACiBBcyBhIGNvbnZlbmllbmNlLCBzZWUgdGhlIG1ldGhvZHMgXG1ldGhvZHtNZXNzYWdlLmFzX3N0cmluZygpfSBhbmQKIFxjb2Rle3N0cihhTWVzc2FnZSl9LCBhLmsuYS4gXG1ldGhvZHtNZXNzYWdlLl9fc3RyX18oKX0sIHdoaWNoCiBzaW1wbGlmeSB0aGUgZ2VuZXJhdGlvbiBvZiBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYQotbWVzc2FnZSBvYmplY3QuICBGb3IgbW9yZSBkZXRhaWwsIHNlZSBccmVmbW9kdWxle2VtYWlsLk1lc3NhZ2V9LgorbWVzc2FnZSBvYmplY3QuICBGb3IgbW9yZSBkZXRhaWwsIHNlZSBccmVmbW9kdWxle2VtYWlsLm1lc3NhZ2V9LgogCi1UaGUgXG1vZHVsZXtlbWFpbC5HZW5lcmF0b3J9IG1vZHVsZSBhbHNvIHByb3ZpZGVzIGEgZGVyaXZlZCBjbGFzcywKK1RoZSBcbW9kdWxle2VtYWlsLmdlbmVyYXRvcn0gbW9kdWxlIGFsc28gcHJvdmlkZXMgYSBkZXJpdmVkIGNsYXNzLAogY2FsbGVkIFxjbGFzc3tEZWNvZGVkR2VuZXJhdG9yfSB3aGljaCBpcyBsaWtlIHRoZSBcY2xhc3N7R2VuZXJhdG9yfQogYmFzZSBjbGFzcywgZXhjZXB0IHRoYXQgbm9uLVxtaW1ldHlwZXt0ZXh0fSBwYXJ0cyBhcmUgc3Vic3RpdHV0ZWQgd2l0aAogYSBmb3JtYXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGFydC4KQEAgLTEyOCwxMyArMTI5LDUgQEAKIFx2ZXJzaW9uYWRkZWR7Mi4yLjJ9CiBcZW5ke2NsYXNzZGVzY30KIAotXHN1YnN1YnNlY3Rpb257RGVwcmVjYXRlZCBtZXRob2RzfQotCi1UaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGRlcHJlY2F0ZWQgaW4gXG1vZHVsZXtlbWFpbH0gdmVyc2lvbiAyLgotVGhleSBhcmUgZG9jdW1lbnRlZCBoZXJlIGZvciBjb21wbGV0ZW5lc3MuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtHZW5lcmF0b3Jde19fY2FsbF9ffXttc2dcb3B0aW9uYWx7LCB1bml4ZnJvbX19Ci1UaGlzIG1ldGhvZCBpcyBpZGVudGljYWwgdG8gdGhlIFxtZXRob2R7ZmxhdHRlbigpfSBtZXRob2QuCi0KLVxkZXByZWNhdGVkezIuMi4yfXtVc2UgdGhlIFxtZXRob2R7ZmxhdHRlbigpfSBtZXRob2QgaW5zdGVhZC59Ci1cZW5ke21ldGhvZGRlc2N9CitcdmVyc2lvbmNoYW5nZWRbVGhlIHByZXZpb3VzbHkgZGVwcmVjYXRlZCBtZXRob2QgXG1ldGhvZHtfX2NhbGxfXygpfSB3YXMKK3JlbW92ZWRdezIuNX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWxoZWFkZXJzLnRleCBiL0RvYy9saWIvZW1haWxoZWFkZXJzLnRleAppbmRleCAyNzk1NjQ0Li41MjRkMDhjIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsaGVhZGVycy50ZXgKKysrIGIvRG9jL2xpYi9lbWFpbGhlYWRlcnMudGV4CkBAIC0xLDQgKzEsNCBAQAotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLkhlYWRlcn0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5oZWFkZXJ9CiBcbW9kdWxlc3lub3BzaXN7UmVwcmVzZW50aW5nIG5vbi1BU0NJSSBoZWFkZXJzfQogCiBccmZjezI4MjJ9IGlzIHRoZSBiYXNlIHN0YW5kYXJkIHRoYXQgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgZW1haWwKQEAgLTE1LDE3ICsxNSwxOCBAQAogY29udGFpbmluZyBub24tXEFTQ0lJe30gY2hhcmFjdGVycyBpbnRvIFxyZmN7MjgyMn0tY29tcGxpYW50IGZvcm1hdC4KIFRoZXNlIFJGQ3MgaW5jbHVkZSBccmZjezIwNDV9LCBccmZjezIwNDZ9LCBccmZjezIwNDd9LCBhbmQgXHJmY3syMjMxfS4KIFRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlIHN1cHBvcnRzIHRoZXNlIHN0YW5kYXJkcyBpbiBpdHMKLVxtb2R1bGV7ZW1haWwuSGVhZGVyfSBhbmQgXG1vZHVsZXtlbWFpbC5DaGFyc2V0fSBtb2R1bGVzLgorXG1vZHVsZXtlbWFpbC5oZWFkZXJ9IGFuZCBcbW9kdWxle2VtYWlsLmNoYXJzZXR9IG1vZHVsZXMuCiAKIElmIHlvdSB3YW50IHRvIGluY2x1ZGUgbm9uLVxBU0NJSXt9IGNoYXJhY3RlcnMgaW4geW91ciBlbWFpbCBoZWFkZXJzLAogc2F5IGluIHRoZSBcbWFpbGhlYWRlcntTdWJqZWN0fSBvciBcbWFpbGhlYWRlcntUb30gZmllbGRzLCB5b3Ugc2hvdWxkCiB1c2UgdGhlIFxjbGFzc3tIZWFkZXJ9IGNsYXNzIGFuZCBhc3NpZ24gdGhlIGZpZWxkIGluIHRoZQogXGNsYXNze01lc3NhZ2V9IG9iamVjdCB0byBhbiBpbnN0YW5jZSBvZiBcY2xhc3N7SGVhZGVyfSBpbnN0ZWFkIG9mCi11c2luZyBhIHN0cmluZyBmb3IgdGhlIGhlYWRlciB2YWx1ZS4gIEZvciBleGFtcGxlOgordXNpbmcgYSBzdHJpbmcgZm9yIHRoZSBoZWFkZXIgdmFsdWUuICBJbXBvcnQgdGhlIFxjbGFzc3tIZWFkZXJ9IGNsYXNzIGZyb20gdGhlCitcbW9kdWxle2VtYWlsLmhlYWRlcn0gbW9kdWxlLiAgRm9yIGV4YW1wbGU6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIGVtYWlsLk1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKLT4+PiBmcm9tIGVtYWlsLkhlYWRlciBpbXBvcnQgSGVhZGVyCis+Pj4gZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCis+Pj4gZnJvbSBlbWFpbC5oZWFkZXIgaW1wb3J0IEhlYWRlcgogPj4+IG1zZyA9IE1lc3NhZ2UoKQogPj4+IGggPSBIZWFkZXIoJ3BceGY2c3RhbCcsICdpc28tODg1OS0xJykKID4+PiBtc2dbJ1N1YmplY3QnXSA9IGgKQEAgLTg3LDcgKzg4LDcgQEAKIEFwcGVuZCB0aGUgc3RyaW5nIFx2YXJ7c30gdG8gdGhlIE1JTUUgaGVhZGVyLgogCiBPcHRpb25hbCBcdmFye2NoYXJzZXR9LCBpZiBnaXZlbiwgc2hvdWxkIGJlIGEgXGNsYXNze0NoYXJzZXR9IGluc3RhbmNlCi0oc2VlIFxyZWZtb2R1bGV7ZW1haWwuQ2hhcnNldH0pIG9yIHRoZSBuYW1lIG9mIGEgY2hhcmFjdGVyIHNldCwgd2hpY2gKKyhzZWUgXHJlZm1vZHVsZXtlbWFpbC5jaGFyc2V0fSkgb3IgdGhlIG5hbWUgb2YgYSBjaGFyYWN0ZXIgc2V0LCB3aGljaAogd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBcY2xhc3N7Q2hhcnNldH0gaW5zdGFuY2UuICBBIHZhbHVlIG9mCiBcY29kZXtOb25lfSAodGhlIGRlZmF1bHQpIG1lYW5zIHRoYXQgdGhlIFx2YXJ7Y2hhcnNldH0gZ2l2ZW4gaW4gdGhlCiBjb25zdHJ1Y3RvciBpcyB1c2VkLgpAQCAtMTM5LDcgKzE0MCw3IEBACiBUaGlzIG1ldGhvZCBhbGxvd3MgeW91IHRvIGNvbXBhcmUgdHdvIFxjbGFzc3tIZWFkZXJ9IGluc3RhbmNlcyBmb3IgaW5lcXVhbGl0eS4KIFxlbmR7bWV0aG9kZGVzY30KIAotVGhlIFxtb2R1bGV7ZW1haWwuSGVhZGVyfSBtb2R1bGUgYWxzbyBwcm92aWRlcyB0aGUgZm9sbG93aW5nCitUaGUgXG1vZHVsZXtlbWFpbC5oZWFkZXJ9IG1vZHVsZSBhbHNvIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcKIGNvbnZlbmllbnQgZnVuY3Rpb25zLgogCiBcYmVnaW57ZnVuY2Rlc2N9e2RlY29kZV9oZWFkZXJ9e2hlYWRlcn0KQEAgLTE1NSw3ICsxNTYsNyBAQAogSGVyZSdzIGFuIGV4YW1wbGU6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KLT4+PiBmcm9tIGVtYWlsLkhlYWRlciBpbXBvcnQgZGVjb2RlX2hlYWRlcgorPj4+IGZyb20gZW1haWwuaGVhZGVyIGltcG9ydCBkZWNvZGVfaGVhZGVyCiA+Pj4gZGVjb2RlX2hlYWRlcignPT9pc28tODg1OS0xP3E/cD1GNnN0YWw/PScpCiBbKCdwXHhmNnN0YWwnLCAnaXNvLTg4NTktMScpXQogXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWxpdGVyLnRleCBiL0RvYy9saWIvZW1haWxpdGVyLnRleAppbmRleCBkMWE4Zjk4Li5lZjhlZjZmIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsaXRlci50ZXgKKysrIGIvRG9jL2xpYi9lbWFpbGl0ZXIudGV4CkBAIC0xLDggKzEsOCBAQAotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLkl0ZXJhdG9yc30KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5pdGVyYXRvcnN9CiBcbW9kdWxlc3lub3BzaXN7SXRlcmF0ZSBvdmVyIGEgIG1lc3NhZ2Ugb2JqZWN0IHRyZWUufQogCiBJdGVyYXRpbmcgb3ZlciBhIG1lc3NhZ2Ugb2JqZWN0IHRyZWUgaXMgZmFpcmx5IGVhc3kgd2l0aCB0aGUKLVxtZXRob2R7TWVzc2FnZS53YWxrKCl9IG1ldGhvZC4gIFRoZSBcbW9kdWxle2VtYWlsLkl0ZXJhdG9yc30gbW9kdWxlCitcbWV0aG9ke01lc3NhZ2Uud2FsaygpfSBtZXRob2QuICBUaGUgXG1vZHVsZXtlbWFpbC5pdGVyYXRvcnN9IG1vZHVsZQogcHJvdmlkZXMgc29tZSB1c2VmdWwgaGlnaGVyIGxldmVsIGl0ZXJhdGlvbnMgb3ZlciBtZXNzYWdlIG9iamVjdAogdHJlZXMuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWxtZXNzYWdlLnRleCBiL0RvYy9saWIvZW1haWxtZXNzYWdlLnRleAppbmRleCA5YjQxODUyLi43YmQ3ZGQ4IDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsbWVzc2FnZS50ZXgKKysrIGIvRG9jL2xpYi9lbWFpbG1lc3NhZ2UudGV4CkBAIC0xLDEwICsxLDExIEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuTWVzc2FnZX0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5tZXNzYWdlfQogXG1vZHVsZXN5bm9wc2lze1RoZSBiYXNlIGNsYXNzIHJlcHJlc2VudGluZyBlbWFpbCBtZXNzYWdlcy59CiAKIFRoZSBjZW50cmFsIGNsYXNzIGluIHRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlIGlzIHRoZQotXGNsYXNze01lc3NhZ2V9IGNsYXNzOyBpdCBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIFxtb2R1bGV7ZW1haWx9Ci1vYmplY3QgbW9kZWwuICBcY2xhc3N7TWVzc2FnZX0gcHJvdmlkZXMgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IKLXNldHRpbmcgYW5kIHF1ZXJ5aW5nIGhlYWRlciBmaWVsZHMsIGFuZCBmb3IgYWNjZXNzaW5nIG1lc3NhZ2UgYm9kaWVzLgorXGNsYXNze01lc3NhZ2V9IGNsYXNzLCBpbXBvcnRlZCBmcm9tIHRoZSBcbW9kdWxle2VtYWlsLm1lc3NhZ2V9IG1vZHVsZS4gIEl0IGlzCit0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIFxtb2R1bGV7ZW1haWx9IG9iamVjdCBtb2RlbC4gIFxjbGFzc3tNZXNzYWdlfSBwcm92aWRlcwordGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3Igc2V0dGluZyBhbmQgcXVlcnlpbmcgaGVhZGVyIGZpZWxkcywgYW5kIGZvcgorYWNjZXNzaW5nIG1lc3NhZ2UgYm9kaWVzLgogCiBDb25jZXB0dWFsbHksIGEgXGNsYXNze01lc3NhZ2V9IG9iamVjdCBjb25zaXN0cyBvZiBcZW1waHtoZWFkZXJzfSBhbmQKIFxlbXBoe3BheWxvYWRzfS4gIEhlYWRlcnMgYXJlIFxyZmN7MjgyMn0gc3R5bGUgZmllbGQgbmFtZXMgYW5kCkBAIC00NSw3ICs0Niw3IEBACiAKIFxiZWdpbnt2ZXJiYXRpbX0KIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotZnJvbSBlbWFpbC5HZW5lcmF0b3IgaW1wb3J0IEdlbmVyYXRvcgorZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEdlbmVyYXRvcgogZnAgPSBTdHJpbmdJTygpCiBnID0gR2VuZXJhdG9yKGZwLCBtYW5nbGVfZnJvbV89RmFsc2UsIG1heGhlYWRlcmxlbj02MCkKIGcuZmxhdHRlbihtc2cpCkBAIC0xMTksNyArMTIwLDcgQEAKIAogXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde3NldF9jaGFyc2V0fXtjaGFyc2V0fQogU2V0IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBwYXlsb2FkIHRvIFx2YXJ7Y2hhcnNldH0sIHdoaWNoIGNhbgotZWl0aGVyIGJlIGEgXGNsYXNze0NoYXJzZXR9IGluc3RhbmNlIChzZWUgXHJlZm1vZHVsZXtlbWFpbC5DaGFyc2V0fSksIGEKK2VpdGhlciBiZSBhIFxjbGFzc3tDaGFyc2V0fSBpbnN0YW5jZSAoc2VlIFxyZWZtb2R1bGV7ZW1haWwuY2hhcnNldH0pLCBhCiBzdHJpbmcgbmFtaW5nIGEgY2hhcmFjdGVyIHNldCwKIG9yIFxjb2Rle05vbmV9LiAgSWYgaXQgaXMgYSBzdHJpbmcsIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEKIFxjbGFzc3tDaGFyc2V0fSBpbnN0YW5jZS4gIElmIFx2YXJ7Y2hhcnNldH0gaXMgXGNvZGV7Tm9uZX0sIHRoZQpAQCAtMTI4LDggKzEyOSw4IEBACiBcZXhjZXB0aW9ue1R5cGVFcnJvcn0uCiAKIFRoZSBtZXNzYWdlIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBvZiB0eXBlIFxtaW1ldHlwZXt0ZXh0Lyp9IGVuY29kZWQgd2l0aAotXGNvZGV7Y2hhcnNldC5pbnB1dF9jaGFyc2V0fS4gIEl0IHdpbGwgYmUgY29udmVydGVkIHRvCi1cY29kZXtjaGFyc2V0Lm91dHB1dF9jaGFyc2V0fQorXHZhcntjaGFyc2V0LmlucHV0X2NoYXJzZXR9LiAgSXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8KK1x2YXJ7Y2hhcnNldC5vdXRwdXRfY2hhcnNldH0KIGFuZCBlbmNvZGVkIHByb3Blcmx5LCBpZiBuZWVkZWQsIHdoZW4gZ2VuZXJhdGluZyB0aGUgcGxhaW4gdGV4dAogcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UuICBNSU1FIGhlYWRlcnMKIChcbWFpbGhlYWRlcntNSU1FLVZlcnNpb259LCBcbWFpbGhlYWRlcntDb250ZW50LVR5cGV9LApAQCAtNTEzLDYgKzUxNCw5IEBACiBcZW5ke3ZlcmJhdGltfQogXGVuZHttZXRob2RkZXNjfQogCitcdmVyc2lvbmNoYW5nZWRbVGhlIHByZXZpb3VzbHkgZGVwcmVjYXRlZCBtZXRob2RzIFxtZXRob2R7Z2V0X3R5cGUoKX0sCitcbWV0aG9ke2dldF9tYWluX3R5cGUoKX0sIGFuZCBcbWV0aG9ke2dldF9zdWJ0eXBlKCl9IHdlcmUgcmVtb3ZlZF17Mi41fQorCiBcY2xhc3N7TWVzc2FnZX0gb2JqZWN0cyBjYW4gYWxzbyBvcHRpb25hbGx5IGNvbnRhaW4gdHdvIGluc3RhbmNlCiBhdHRyaWJ1dGVzLCB3aGljaCBjYW4gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIHBsYWluIHRleHQgb2YgYSBNSU1FCiBtZXNzYWdlLgpAQCAtNTMyLDcgKzUzNiw3IEBACiBpcyB3cml0aW5nIG91dCB0aGUgcGxhaW4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIE1JTUUgbWVzc2FnZSwgYW5kIGl0CiBmaW5kcyB0aGUgbWVzc2FnZSBoYXMgYSBcdmFye3ByZWFtYmxlfSBhdHRyaWJ1dGUsIGl0IHdpbGwgd3JpdGUgdGhpcwogdGV4dCBpbiB0aGUgYXJlYSBiZXR3ZWVuIHRoZSBoZWFkZXJzIGFuZCB0aGUgZmlyc3QgYm91bmRhcnkuICBTZWUKLVxyZWZtb2R1bGV7ZW1haWwuUGFyc2VyfSBhbmQgXHJlZm1vZHVsZXtlbWFpbC5HZW5lcmF0b3J9IGZvciBkZXRhaWxzLgorXHJlZm1vZHVsZXtlbWFpbC5wYXJzZXJ9IGFuZCBccmVmbW9kdWxle2VtYWlsLmdlbmVyYXRvcn0gZm9yIGRldGFpbHMuCiAKIE5vdGUgdGhhdCBpZiB0aGUgbWVzc2FnZSBvYmplY3QgaGFzIG5vIHByZWFtYmxlLCB0aGUKIFx2YXJ7cHJlYW1ibGV9IGF0dHJpYnV0ZSB3aWxsIGJlIFxjb2Rle05vbmV9LgpAQCAtNTQzLDU4ICs1NDcsMTUgQEAKIGF0dHJpYnV0ZSwgZXhjZXB0IHRoYXQgaXQgY29udGFpbnMgdGV4dCB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgbGFzdAogYm91bmRhcnkgYW5kIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UuCiAKLU9uZSBub3RlOiB3aGVuIGdlbmVyYXRpbmcgdGhlIGZsYXQgdGV4dCBmb3IgYSBcbWltZXR5cGV7bXVsdGlwYXJ0fQotbWVzc2FnZSB0aGF0IGhhcyBubyBcdmFye2VwaWxvZ3VlfSAodXNpbmcgdGhlIHN0YW5kYXJkCi1cY2xhc3N7R2VuZXJhdG9yfSBjbGFzcyksIG5vIG5ld2xpbmUgaXMgYWRkZWQgYWZ0ZXIgdGhlIGNsb3NpbmcKLWJvdW5kYXJ5IGxpbmUuICBJZiB0aGUgbWVzc2FnZSBvYmplY3QgaGFzIGFuIFx2YXJ7ZXBpbG9ndWV9IGFuZCBpdHMKLXZhbHVlIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBuZXdsaW5lLCBhIG5ld2xpbmUgaXMgcHJpbnRlZCBhZnRlciB0aGUKLWNsb3NpbmcgYm91bmRhcnkuICBUaGlzIHNlZW1zIGEgbGl0dGxlIGNsdW1zeSwgYnV0IGl0IG1ha2VzIHRoZSBtb3N0Ci1wcmFjdGljYWwgc2Vuc2UuICBUaGUgdXBzaG90IGlzIHRoYXQgaWYgeW91IHdhbnQgdG8gZW5zdXJlIHRoYXQgYQotbmV3bGluZSBnZXQgcHJpbnRlZCBhZnRlciB5b3VyIGNsb3NpbmcgXG1pbWV0eXBle211bHRpcGFydH0gYm91bmRhcnksCi1zZXQgdGhlIFx2YXJ7ZXBpbG9ndWV9IHRvIHRoZSBlbXB0eSBzdHJpbmcuCitcdmVyc2lvbmNoYW5nZWRbWW91IGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZXBpbG9ndWUgdG8gdGhlIGVtcHR5IHN0cmluZyBpbgorb3JkZXIgZm9yIHRoZSBcY2xhc3N7R2VuZXJhdG9yfSB0byBwcmludCBhIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUKK2ZpbGVdezIuNX0KIFxlbmR7ZGF0YWRlc2N9CiAKIFxiZWdpbntkYXRhZGVzY317ZGVmZWN0c30KIFRoZSBcdmFye2RlZmVjdHN9IGF0dHJpYnV0ZSBjb250YWlucyBhIGxpc3Qgb2YgYWxsIHRoZSBwcm9ibGVtcyBmb3VuZCB3aGVuCi1wYXJzaW5nIHRoaXMgbWVzc2FnZS4gIFNlZSBccmVmbW9kdWxle2VtYWlsLkVycm9yc30gZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24KK3BhcnNpbmcgdGhpcyBtZXNzYWdlLiAgU2VlIFxyZWZtb2R1bGV7ZW1haWwuZXJyb3JzfSBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbgogb2YgdGhlIHBvc3NpYmxlIHBhcnNpbmcgZGVmZWN0cy4KIAogXHZlcnNpb25hZGRlZHsyLjR9CiBcZW5ke2RhdGFkZXNjfQotCi1cc3Vic3Vic2VjdGlvbntEZXByZWNhdGVkIG1ldGhvZHN9Ci0KLVx2ZXJzaW9uY2hhbmdlZFtUaGUgXG1ldGhvZHthZGRfcGF5bG9hZCgpfSBtZXRob2Qgd2FzIHJlbW92ZWQ7IHVzZSB0aGUKLVxtZXRob2R7YXR0YWNoKCl9IG1ldGhvZCBpbnN0ZWFkXXsyLjR9Ci0KLVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgZGVwcmVjYXRlZC4gIFRoZXkgYXJlIGRvY3VtZW50ZWQgaGVyZSBmb3IKLWNvbXBsZXRlbmVzcy4KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldF90eXBlfXtcb3B0aW9uYWx7ZmFpbG9ian19Ci1SZXR1cm4gdGhlIG1lc3NhZ2UncyBjb250ZW50IHR5cGUsIGFzIGEgc3RyaW5nIG9mIHRoZSBmb3JtCi1cbWltZXR5cGV7bWFpbnR5cGUvc3VidHlwZX0gYXMgdGFrZW4gZnJvbSB0aGUKLVxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyLgotVGhlIHJldHVybmVkIHN0cmluZyBpcyBjb2VyY2VkIHRvIGxvd2VyY2FzZS4KLQotSWYgdGhlcmUgaXMgbm8gXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSBoZWFkZXIgaW4gdGhlIG1lc3NhZ2UsCi1cdmFye2ZhaWxvYmp9IGlzIHJldHVybmVkIChkZWZhdWx0cyB0byBcY29kZXtOb25lfSkuCi0KLVxkZXByZWNhdGVkezIuMi4yfXtVc2UgdGhlIFxtZXRob2R7Z2V0X2NvbnRlbnRfdHlwZSgpfSBtZXRob2QgaW5zdGVhZC59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRfbWFpbl90eXBlfXtcb3B0aW9uYWx7ZmFpbG9ian19Ci1SZXR1cm4gdGhlIG1lc3NhZ2UncyBcZW1waHttYWlufSBjb250ZW50IHR5cGUuICBUaGlzIGVzc2VudGlhbGx5IHJldHVybnMgdGhlCi1cdmFye21haW50eXBlfSBwYXJ0IG9mIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgXG1ldGhvZHtnZXRfdHlwZSgpfSwgd2l0aCB0aGUKLXNhbWUgc2VtYW50aWNzIGZvciBcdmFye2ZhaWxvYmp9LgotCi1cZGVwcmVjYXRlZHsyLjIuMn17VXNlIHRoZSBcbWV0aG9ke2dldF9jb250ZW50X21haW50eXBlKCl9IG1ldGhvZCBpbnN0ZWFkLn0KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W01lc3NhZ2Vde2dldF9zdWJ0eXBlfXtcb3B0aW9uYWx7ZmFpbG9ian19Ci1SZXR1cm4gdGhlIG1lc3NhZ2UncyBzdWItY29udGVudCB0eXBlLiAgVGhpcyBlc3NlbnRpYWxseSByZXR1cm5zIHRoZQotXHZhcntzdWJ0eXBlfSBwYXJ0IG9mIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgXG1ldGhvZHtnZXRfdHlwZSgpfSwgd2l0aCB0aGUKLXNhbWUgc2VtYW50aWNzIGZvciBcdmFye2ZhaWxvYmp9LgotCi1cZGVwcmVjYXRlZHsyLjIuMn17VXNlIHRoZSBcbWV0aG9ke2dldF9jb250ZW50X3N1YnR5cGUoKX0gbWV0aG9kIGluc3RlYWQufQotXGVuZHttZXRob2RkZXNjfQotCmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsbWltZWJhc2UudGV4IGIvRG9jL2xpYi9lbWFpbG1pbWViYXNlLnRleAppbmRleCAwNzBjOWEyLi40NzM1YmUzIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsbWltZWJhc2UudGV4CisrKyBiL0RvYy9saWIvZW1haWxtaW1lYmFzZS50ZXgKQEAgLTEsMyArMSwxMSBAQAorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLm1pbWV9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwubWltZS5iYXNlfQorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLm1pbWUubm9ubXVsdGlwYXJ0fQorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLm1pbWUubXVsdGlwYXJ0fQorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLm1pbWUuYXVkaW99CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwubWltZS5pbWFnZX0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5taW1lLm1lc3NhZ2V9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwubWltZS50ZXh0fQogT3JkaW5hcmlseSwgeW91IGdldCBhIG1lc3NhZ2Ugb2JqZWN0IHN0cnVjdHVyZSBieSBwYXNzaW5nIGEgZmlsZSBvcgogc29tZSB0ZXh0IHRvIGEgcGFyc2VyLCB3aGljaCBwYXJzZXMgdGhlIHRleHQgYW5kIHJldHVybnMgdGhlIHJvb3QKIG1lc3NhZ2Ugb2JqZWN0LiAgSG93ZXZlciB5b3UgY2FuIGFsc28gYnVpbGQgYSBjb21wbGV0ZSBtZXNzYWdlCkBAIC02LDI2ICsxNCwxNiBAQAogXGNsYXNze01lc3NhZ2V9IG9iamVjdHMsIG1vdmUgdGhlbSBhcm91bmQsIGV0Yy4gIFRoaXMgbWFrZXMgYSB2ZXJ5CiBjb252ZW5pZW50IGludGVyZmFjZSBmb3Igc2xpY2luZy1hbmQtZGljaW5nIE1JTUUgbWVzc2FnZXMuCiAKLVlvdSBjYW4gY3JlYXRlIGEgbmV3IG9iamVjdCBzdHJ1Y3R1cmUgYnkgY3JlYXRpbmcgXGNsYXNze01lc3NhZ2V9Ci1pbnN0YW5jZXMsIGFkZGluZyBhdHRhY2htZW50cyBhbmQgYWxsIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXJzIG1hbnVhbGx5LgotRm9yIE1JTUUgbWVzc2FnZXMgdGhvdWdoLCB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBwcm92aWRlcyBzb21lCi1jb252ZW5pZW50IHN1YmNsYXNzZXMgdG8gbWFrZSB0aGluZ3MgZWFzaWVyLiAgRWFjaCBvZiB0aGVzZSBjbGFzc2VzCi1zaG91bGQgYmUgaW1wb3J0ZWQgZnJvbSBhIG1vZHVsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGNsYXNzLCBmcm9tCi13aXRoaW4gdGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UuICBFLmcuOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgZW1haWwuTUlNRUltYWdlLk1JTUVJbWFnZQotXGVuZHt2ZXJiYXRpbX0KLQotb3IKLQotXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBlbWFpbC5NSU1FVGV4dCBpbXBvcnQgTUlNRVRleHQKLVxlbmR7dmVyYmF0aW19CitZb3UgY2FuIGNyZWF0ZSBhIG5ldyBvYmplY3Qgc3RydWN0dXJlIGJ5IGNyZWF0aW5nIFxjbGFzc3tNZXNzYWdlfSBpbnN0YW5jZXMsCithZGRpbmcgYXR0YWNobWVudHMgYW5kIGFsbCB0aGUgYXBwcm9wcmlhdGUgaGVhZGVycyBtYW51YWxseS4gIEZvciBNSU1FCittZXNzYWdlcyB0aG91Z2gsIHRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlIHByb3ZpZGVzIHNvbWUgY29udmVuaWVudAorc3ViY2xhc3NlcyB0byBtYWtlIHRoaW5ncyBlYXNpZXIuCiAKIEhlcmUgYXJlIHRoZSBjbGFzc2VzOgogCiBcYmVnaW57Y2xhc3NkZXNjfXtNSU1FQmFzZX17X21haW50eXBlLCBfc3VidHlwZSwgKipfcGFyYW1zfQorTW9kdWxlOiBcbW9kdWxle2VtYWlsLm1pbWUuYmFzZX0KKwogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBNSU1FLXNwZWNpZmljIHN1YmNsYXNzZXMgb2YKIFxjbGFzc3tNZXNzYWdlfS4gIE9yZGluYXJpbHkgeW91IHdvbid0IGNyZWF0ZSBpbnN0YW5jZXMgc3BlY2lmaWNhbGx5CiBvZiBcY2xhc3N7TUlNRUJhc2V9LCBhbHRob3VnaCB5b3UgY291bGQuICBcY2xhc3N7TUlNRUJhc2V9IGlzIHByb3ZpZGVkCkBAIC00NSw2ICs0Myw4IEBACiBcZW5ke2NsYXNzZGVzY30KIAogXGJlZ2lue2NsYXNzZGVzY317TUlNRU5vbk11bHRpcGFydH17fQorTW9kdWxlOiBcbW9kdWxle2VtYWlsLm1pbWUubm9ubXVsdGlwYXJ0fQorCiBBIHN1YmNsYXNzIG9mIFxjbGFzc3tNSU1FQmFzZX0sIHRoaXMgaXMgYW4gaW50ZXJtZWRpYXRlIGJhc2UgY2xhc3MgZm9yCiBNSU1FIG1lc3NhZ2VzIHRoYXQgYXJlIG5vdCBcbWltZXR5cGV7bXVsdGlwYXJ0fS4gIFRoZSBwcmltYXJ5IHB1cnBvc2UKIG9mIHRoaXMgY2xhc3MgaXMgdG8gcHJldmVudCB0aGUgdXNlIG9mIHRoZSBcbWV0aG9ke2F0dGFjaCgpfSBtZXRob2QsCkBAIC01Nyw2ICs1Nyw3IEBACiAKIFxiZWdpbntjbGFzc2Rlc2N9e01JTUVNdWx0aXBhcnR9e1xvcHRpb25hbHtzdWJ0eXBlXG9wdGlvbmFseywKICAgICBib3VuZGFyeVxvcHRpb25hbHssIF9zdWJwYXJ0c1xvcHRpb25hbHssIF9wYXJhbXN9fX19fQorTW9kdWxlOiBcbW9kdWxle2VtYWlsLm1pbWUubXVsdGlwYXJ0fQogCiBBIHN1YmNsYXNzIG9mIFxjbGFzc3tNSU1FQmFzZX0sIHRoaXMgaXMgYW4gaW50ZXJtZWRpYXRlIGJhc2UgY2xhc3MgZm9yCiBNSU1FIG1lc3NhZ2VzIHRoYXQgYXJlIFxtaW1ldHlwZXttdWx0aXBhcnR9LiAgT3B0aW9uYWwgXHZhcntfc3VidHlwZX0KQEAgLTgwLDggKzgxLDMxIEBACiBcdmVyc2lvbmFkZGVkezIuMi4yfQogXGVuZHtjbGFzc2Rlc2N9CiAKK1xiZWdpbntjbGFzc2Rlc2N9e01JTUVBcHBsaWNhdGlvbn17X2RhdGFcb3B0aW9uYWx7LCBfc3VidHlwZVxvcHRpb25hbHssCisgICAgX2VuY29kZXJcb3B0aW9uYWx7LCAqKl9wYXJhbXN9fX19CitNb2R1bGU6IFxtb2R1bGV7ZW1haWwubWltZS5hcHBsaWNhdGlvbn0KKworQSBzdWJjbGFzcyBvZiBcY2xhc3N7TUlNRU5vbk11bHRpcGFydH0sIHRoZSBcY2xhc3N7TUlNRUFwcGxpY2F0aW9ufSBjbGFzcyBpcwordXNlZCB0byByZXByZXNlbnQgTUlNRSBtZXNzYWdlIG9iamVjdHMgb2YgbWFqb3IgdHlwZSBcbWltZXR5cGV7YXBwbGljYXRpb259LgorXHZhcntfZGF0YX0gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmF3IGJ5dGUgZGF0YS4gIE9wdGlvbmFsIFx2YXJ7X3N1YnR5cGV9CitzcGVjaWZpZXMgdGhlIE1JTUUgc3VidHlwZSBhbmQgZGVmYXVsdHMgdG8gXG1pbWV0eXBle29jdGV0LXN0cmVhbX0uICAKKworT3B0aW9uYWwgXHZhcntfZW5jb2Rlcn0gaXMgYSBjYWxsYWJsZSAoaS5lLiBmdW5jdGlvbikgd2hpY2ggd2lsbAorcGVyZm9ybSB0aGUgYWN0dWFsIGVuY29kaW5nIG9mIHRoZSBkYXRhIGZvciB0cmFuc3BvcnQuICBUaGlzCitjYWxsYWJsZSB0YWtlcyBvbmUgYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBcY2xhc3N7TUlNRUFwcGxpY2F0aW9ufSBpbnN0YW5jZS4KK0l0IHNob3VsZCB1c2UgXG1ldGhvZHtnZXRfcGF5bG9hZCgpfSBhbmQgXG1ldGhvZHtzZXRfcGF5bG9hZCgpfSB0bworY2hhbmdlIHRoZSBwYXlsb2FkIHRvIGVuY29kZWQgZm9ybS4gIEl0IHNob3VsZCBhbHNvIGFkZCBhbnkKK1xtYWlsaGVhZGVye0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmd9IG9yIG90aGVyIGhlYWRlcnMgdG8gdGhlIG1lc3NhZ2UKK29iamVjdCBhcyBuZWNlc3NhcnkuICBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBiYXNlNjQuICBTZWUgdGhlCitccmVmbW9kdWxle2VtYWlsLmVuY29kZXJzfSBtb2R1bGUgZm9yIGEgbGlzdCBvZiB0aGUgYnVpbHQtaW4gZW5jb2RlcnMuCisKK1x2YXJ7X3BhcmFtc30gYXJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoIHRvIHRoZSBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2NsYXNzZGVzY30KKwogXGJlZ2lue2NsYXNzZGVzY317TUlNRUF1ZGlvfXtfYXVkaW9kYXRhXG9wdGlvbmFseywgX3N1YnR5cGVcb3B0aW9uYWx7LAogICAgIF9lbmNvZGVyXG9wdGlvbmFseywgKipfcGFyYW1zfX19fQorTW9kdWxlOiBcbW9kdWxle2VtYWlsLm1pbWUuYXVkaW99CiAKIEEgc3ViY2xhc3Mgb2YgXGNsYXNze01JTUVOb25NdWx0aXBhcnR9LCB0aGUgXGNsYXNze01JTUVBdWRpb30gY2xhc3MKIGlzIHVzZWQgdG8gY3JlYXRlIE1JTUUgbWVzc2FnZSBvYmplY3RzIG9mIG1ham9yIHR5cGUgXG1pbWV0eXBle2F1ZGlvfS4KQEAgLTEwMCwxMyArMTI0LDE0IEBACiBjaGFuZ2UgdGhlIHBheWxvYWQgdG8gZW5jb2RlZCBmb3JtLiAgSXQgc2hvdWxkIGFsc28gYWRkIGFueQogXG1haWxoZWFkZXJ7Q29udGVudC1UcmFuc2Zlci1FbmNvZGluZ30gb3Igb3RoZXIgaGVhZGVycyB0byB0aGUgbWVzc2FnZQogb2JqZWN0IGFzIG5lY2Vzc2FyeS4gIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIGJhc2U2NC4gIFNlZSB0aGUKLVxyZWZtb2R1bGV7ZW1haWwuRW5jb2RlcnN9IG1vZHVsZSBmb3IgYSBsaXN0IG9mIHRoZSBidWlsdC1pbiBlbmNvZGVycy4KK1xyZWZtb2R1bGV7ZW1haWwuZW5jb2RlcnN9IG1vZHVsZSBmb3IgYSBsaXN0IG9mIHRoZSBidWlsdC1pbiBlbmNvZGVycy4KIAogXHZhcntfcGFyYW1zfSBhcmUgcGFzc2VkIHN0cmFpZ2h0IHRocm91Z2ggdG8gdGhlIGJhc2UgY2xhc3MgY29uc3RydWN0b3IuCiBcZW5ke2NsYXNzZGVzY30KIAogXGJlZ2lue2NsYXNzZGVzY317TUlNRUltYWdlfXtfaW1hZ2VkYXRhXG9wdGlvbmFseywgX3N1YnR5cGVcb3B0aW9uYWx7LAogICAgIF9lbmNvZGVyXG9wdGlvbmFseywgKipfcGFyYW1zfX19fQorTW9kdWxlOiBcbW9kdWxle2VtYWlsLm1pbWUuaW1hZ2V9CiAKIEEgc3ViY2xhc3Mgb2YgXGNsYXNze01JTUVOb25NdWx0aXBhcnR9LCB0aGUgXGNsYXNze01JTUVJbWFnZX0gY2xhc3MgaXMKIHVzZWQgdG8gY3JlYXRlIE1JTUUgbWVzc2FnZSBvYmplY3RzIG9mIG1ham9yIHR5cGUgXG1pbWV0eXBle2ltYWdlfS4KQEAgLTEyNSwxMyArMTUwLDE1IEBACiBjaGFuZ2UgdGhlIHBheWxvYWQgdG8gZW5jb2RlZCBmb3JtLiAgSXQgc2hvdWxkIGFsc28gYWRkIGFueQogXG1haWxoZWFkZXJ7Q29udGVudC1UcmFuc2Zlci1FbmNvZGluZ30gb3Igb3RoZXIgaGVhZGVycyB0byB0aGUgbWVzc2FnZQogb2JqZWN0IGFzIG5lY2Vzc2FyeS4gIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIGJhc2U2NC4gIFNlZSB0aGUKLVxyZWZtb2R1bGV7ZW1haWwuRW5jb2RlcnN9IG1vZHVsZSBmb3IgYSBsaXN0IG9mIHRoZSBidWlsdC1pbiBlbmNvZGVycy4KK1xyZWZtb2R1bGV7ZW1haWwuZW5jb2RlcnN9IG1vZHVsZSBmb3IgYSBsaXN0IG9mIHRoZSBidWlsdC1pbiBlbmNvZGVycy4KIAogXHZhcntfcGFyYW1zfSBhcmUgcGFzc2VkIHN0cmFpZ2h0IHRocm91Z2ggdG8gdGhlIFxjbGFzc3tNSU1FQmFzZX0KIGNvbnN0cnVjdG9yLgogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntjbGFzc2Rlc2N9e01JTUVNZXNzYWdlfXtfbXNnXG9wdGlvbmFseywgX3N1YnR5cGV9fQorTW9kdWxlOiBcbW9kdWxle2VtYWlsLm1pbWUubWVzc2FnZX0KKwogQSBzdWJjbGFzcyBvZiBcY2xhc3N7TUlNRU5vbk11bHRpcGFydH0sIHRoZSBcY2xhc3N7TUlNRU1lc3NhZ2V9IGNsYXNzCiBpcyB1c2VkIHRvIGNyZWF0ZSBNSU1FIG9iamVjdHMgb2YgbWFpbiB0eXBlIFxtaW1ldHlwZXttZXNzYWdlfS4KIFx2YXJ7X21zZ30gaXMgdXNlZCBhcyB0aGUgcGF5bG9hZCwgYW5kIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgY2xhc3MKQEAgLTE0Myw2ICsxNzAsOCBAQAogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntjbGFzc2Rlc2N9e01JTUVUZXh0fXtfdGV4dFxvcHRpb25hbHssIF9zdWJ0eXBlXG9wdGlvbmFseywgX2NoYXJzZXR9fX0KK01vZHVsZTogXG1vZHVsZXtlbWFpbC5taW1lLnRleHR9CisKIEEgc3ViY2xhc3Mgb2YgXGNsYXNze01JTUVOb25NdWx0aXBhcnR9LCB0aGUgXGNsYXNze01JTUVUZXh0fSBjbGFzcyBpcwogdXNlZCB0byBjcmVhdGUgTUlNRSBvYmplY3RzIG9mIG1ham9yIHR5cGUgXG1pbWV0eXBle3RleHR9LgogXHZhcntfdGV4dH0gaXMgdGhlIHN0cmluZyBmb3IgdGhlIHBheWxvYWQuICBcdmFye19zdWJ0eXBlfSBpcyB0aGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWxwYXJzZXIudGV4IGIvRG9jL2xpYi9lbWFpbHBhcnNlci50ZXgKaW5kZXggNWZhYzkyZi4uNjA5ZmE0MCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbHBhcnNlci50ZXgKKysrIGIvRG9jL2xpYi9lbWFpbHBhcnNlci50ZXgKQEAgLTEsNCArMSw0IEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuUGFyc2VyfQorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLnBhcnNlcn0KIFxtb2R1bGVzeW5vcHNpc3tQYXJzZSBmbGF0IHRleHQgZW1haWwgbWVzc2FnZXMgdG8gcHJvZHVjZSBhIG1lc3NhZ2UKIAkgICAgICAgIG9iamVjdCBzdHJ1Y3R1cmUufQogCkBAIC00MSw5ICs0MSwxMCBAQAogCiBcdmVyc2lvbmFkZGVkezIuNH0KIAotVGhlIFxjbGFzc3tGZWVkUGFyc2VyfSBwcm92aWRlcyBhbiBBUEkgdGhhdCBpcyBjb25kdWNpdmUgdG8gaW5jcmVtZW50YWwKLXBhcnNpbmcgb2YgZW1haWwgbWVzc2FnZXMsIHN1Y2ggYXMgd291bGQgYmUgbmVjZXNzYXJ5IHdoZW4gcmVhZGluZyB0aGUgdGV4dCBvZgotYW4gZW1haWwgbWVzc2FnZSBmcm9tIGEgc291cmNlIHRoYXQgY2FuIGJsb2NrIChlLmcuIGEgc29ja2V0KS4gIFRoZQorVGhlIFxjbGFzc3tGZWVkUGFyc2VyfSwgaW1wb3J0ZWQgZnJvbSB0aGUgXG1vZHVsZXtlbWFpbC5mZWVkcGFyc2VyfSBtb2R1bGUsCitwcm92aWRlcyBhbiBBUEkgdGhhdCBpcyBjb25kdWNpdmUgdG8gaW5jcmVtZW50YWwgcGFyc2luZyBvZiBlbWFpbCBtZXNzYWdlcywKK3N1Y2ggYXMgd291bGQgYmUgbmVjZXNzYXJ5IHdoZW4gcmVhZGluZyB0aGUgdGV4dCBvZiBhbiBlbWFpbCBtZXNzYWdlIGZyb20gYQorc291cmNlIHRoYXQgY2FuIGJsb2NrIChlLmcuIGEgc29ja2V0KS4gIFRoZQogXGNsYXNze0ZlZWRQYXJzZXJ9IGNhbiBvZiBjb3Vyc2UgYmUgdXNlZCB0byBwYXJzZSBhbiBlbWFpbCBtZXNzYWdlIGZ1bGx5CiBjb250YWluZWQgaW4gYSBzdHJpbmcgb3IgYSBmaWxlLCBidXQgdGhlIGNsYXNzaWMgXGNsYXNze1BhcnNlcn0gQVBJIG1heSBiZQogbW9yZSBjb252ZW5pZW50IGZvciBzdWNoIHVzZSBjYXNlcy4gIFRoZSBzZW1hbnRpY3MgYW5kIHJlc3VsdHMgb2YgdGhlIHR3bwpAQCAtNTYsMTQgKzU3LDE0IEBACiBqb2Igb2YgcGFyc2luZyBub24tY29tcGxpYW50IG1lc3NhZ2VzLCBwcm92aWRpbmcgaW5mb3JtYXRpb24gYWJvdXQgaG93IGEKIG1lc3NhZ2Ugd2FzIGRlZW1lZCBicm9rZW4uICBJdCB3aWxsIHBvcHVsYXRlIGEgbWVzc2FnZSBvYmplY3QncyBcdmFye2RlZmVjdHN9CiBhdHRyaWJ1dGUgd2l0aCBhIGxpc3Qgb2YgYW55IHByb2JsZW1zIGl0IGZvdW5kIGluIGEgbWVzc2FnZS4gIFNlZSB0aGUKLVxyZWZtb2R1bGV7ZW1haWwuRXJyb3JzfSBtb2R1bGUgZm9yIHRoZSBsaXN0IG9mIGRlZmVjdHMgdGhhdCBpdCBjYW4gZmluZC4KK1xyZWZtb2R1bGV7ZW1haWwuZXJyb3JzfSBtb2R1bGUgZm9yIHRoZSBsaXN0IG9mIGRlZmVjdHMgdGhhdCBpdCBjYW4gZmluZC4KIAogSGVyZSBpcyB0aGUgQVBJIGZvciB0aGUgXGNsYXNze0ZlZWRQYXJzZXJ9OgogCiBcYmVnaW57Y2xhc3NkZXNjfXtGZWVkUGFyc2VyfXtcb3B0aW9uYWx7X2ZhY3Rvcnl9fQogQ3JlYXRlIGEgXGNsYXNze0ZlZWRQYXJzZXJ9IGluc3RhbmNlLiAgT3B0aW9uYWwgXHZhcntfZmFjdG9yeX0gaXMgYQogbm8tYXJndW1lbnQgY2FsbGFibGUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBtZXNzYWdlIG9iamVjdCBpcwotbmVlZGVkLiAgSXQgZGVmYXVsdHMgdG8gdGhlIFxjbGFzc3tlbWFpbC5NZXNzYWdlLk1lc3NhZ2V9IGNsYXNzLgorbmVlZGVkLiAgSXQgZGVmYXVsdHMgdG8gdGhlIFxjbGFzc3tlbWFpbC5tZXNzYWdlLk1lc3NhZ2V9IGNsYXNzLgogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtGZWVkUGFyc2VyXXtmZWVkfXtkYXRhfQpAQCAtODIsMjEgKzgzLDIyIEBACiAKIFxzdWJzdWJzZWN0aW9ue1BhcnNlciBjbGFzcyBBUEl9CiAKLVRoZSBcY2xhc3N7UGFyc2VyfSBwcm92aWRlcyBhbiBBUEkgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXJzZSBhIG1lc3NhZ2Ugd2hlbgotdGhlIGNvbXBsZXRlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIGFyZSBhdmFpbGFibGUgaW4gYSBzdHJpbmcgb3IgZmlsZS4gIFRoZQotXG1vZHVsZXtlbWFpbC5QYXJzZXJ9IG1vZHVsZSBhbHNvIHByb3ZpZGVzIGEgc2Vjb25kIGNsYXNzLCBjYWxsZWQKK1RoZSBcY2xhc3N7UGFyc2VyfSBjbGFzcywgaW1wb3J0ZWQgZnJvbSB0aGUgXG1vZHVsZXtlbWFpbC5wYXJzZXJ9IG1vZHVsZSwKK3Byb3ZpZGVzIGFuIEFQSSB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhcnNlIGEgbWVzc2FnZSB3aGVuIHRoZSBjb21wbGV0ZSBjb250ZW50cworb2YgdGhlIG1lc3NhZ2UgYXJlIGF2YWlsYWJsZSBpbiBhIHN0cmluZyBvciBmaWxlLiAgVGhlCitcbW9kdWxle2VtYWlsLnBhcnNlcn0gbW9kdWxlIGFsc28gcHJvdmlkZXMgYSBzZWNvbmQgY2xhc3MsIGNhbGxlZAogXGNsYXNze0hlYWRlclBhcnNlcn0gd2hpY2ggY2FuIGJlIHVzZWQgaWYgeW91J3JlIG9ubHkgaW50ZXJlc3RlZCBpbgogdGhlIGhlYWRlcnMgb2YgdGhlIG1lc3NhZ2UuIFxjbGFzc3tIZWFkZXJQYXJzZXJ9IGNhbiBiZSBtdWNoIGZhc3RlciBpbgogdGhlc2Ugc2l0dWF0aW9ucywgc2luY2UgaXQgZG9lcyBub3QgYXR0ZW1wdCB0byBwYXJzZSB0aGUgbWVzc2FnZSBib2R5LAogaW5zdGVhZCBzZXR0aW5nIHRoZSBwYXlsb2FkIHRvIHRoZSByYXcgYm9keSBhcyBhIHN0cmluZy4KIFxjbGFzc3tIZWFkZXJQYXJzZXJ9IGhhcyB0aGUgc2FtZSBBUEkgYXMgdGhlIFxjbGFzc3tQYXJzZXJ9IGNsYXNzLgogCi1cYmVnaW57Y2xhc3NkZXNjfXtQYXJzZXJ9e1xvcHRpb25hbHtfY2xhc3Ncb3B0aW9uYWx7LCBzdHJpY3R9fX0KK1xiZWdpbntjbGFzc2Rlc2N9e1BhcnNlcn17XG9wdGlvbmFse19jbGFzc319CiBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBcY2xhc3N7UGFyc2VyfSBjbGFzcyB0YWtlcyBhbiBvcHRpb25hbAogYXJndW1lbnQgXHZhcntfY2xhc3N9LiAgVGhpcyBtdXN0IGJlIGEgY2FsbGFibGUgZmFjdG9yeSAoc3VjaCBhcyBhCiBmdW5jdGlvbiBvciBhIGNsYXNzKSwgYW5kIGl0IGlzIHVzZWQgd2hlbmV2ZXIgYSBzdWItbWVzc2FnZSBvYmplY3QKIG5lZWRzIHRvIGJlIGNyZWF0ZWQuICBJdCBkZWZhdWx0cyB0byBcY2xhc3N7TWVzc2FnZX0gKHNlZQotXHJlZm1vZHVsZXtlbWFpbC5NZXNzYWdlfSkuICBUaGUgZmFjdG9yeSB3aWxsIGJlIGNhbGxlZCB3aXRob3V0CitccmVmbW9kdWxle2VtYWlsLm1lc3NhZ2V9KS4gIFRoZSBmYWN0b3J5IHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQKIGFyZ3VtZW50cy4KIAogVGhlIG9wdGlvbmFsIFx2YXJ7c3RyaWN0fSBmbGFnIGlzIGlnbm9yZWQuICBcZGVwcmVjYXRlZHsyLjR9e0JlY2F1c2UgdGhlCkBAIC0yMDEsNiArMjAzLDYgQEAKICAgICAgIFxtZXRob2R7aXNfbXVsdGlwYXJ0KCl9IG1ldGhvZCBtYXkgcmV0dXJuIFxjb2Rle0ZhbHNlfS4gIElmIHN1Y2gKICAgICAgIG1lc3NhZ2VzIHdlcmUgcGFyc2VkIHdpdGggdGhlIFxjbGFzc3tGZWVkUGFyc2VyfSwgdGhleSB3aWxsIGhhdmUgYW4KICAgICAgIGluc3RhbmNlIG9mIHRoZSBcY2xhc3N7TXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0fSBjbGFzcyBpbiB0aGVpcgotICAgICAgXHZhcntkZWZlY3RzfSBhdHRyaWJ1dGUgbGlzdC4gIFNlZSBccmVmbW9kdWxle2VtYWlsLkVycm9yc30gZm9yCisgICAgICBcdmFye2RlZmVjdHN9IGF0dHJpYnV0ZSBsaXN0LiAgU2VlIFxyZWZtb2R1bGV7ZW1haWwuZXJyb3JzfSBmb3IKICAgICAgIGRldGFpbHMuCiBcZW5ke2l0ZW1pemV9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsdXRpbC50ZXggYi9Eb2MvbGliL2VtYWlsdXRpbC50ZXgKaW5kZXggNDkxYTJiOS4uZmU5NjQ3MyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbHV0aWwudGV4CisrKyBiL0RvYy9saWIvZW1haWx1dGlsLnRleApAQCAtMSw3ICsxLDcgQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5VdGlsc30KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC51dGlsc30KIFxtb2R1bGVzeW5vcHNpc3tNaXNjZWxsYW5lb3VzIGVtYWlsIHBhY2thZ2UgdXRpbGl0aWVzLn0KIAotVGhlcmUgYXJlIHNldmVyYWwgdXNlZnVsIHV0aWxpdGllcyBwcm92aWRlZCBpbiB0aGUgXG1vZHVsZXtlbWFpbC5VdGlsc30KK1RoZXJlIGFyZSBzZXZlcmFsIHVzZWZ1bCB1dGlsaXRpZXMgcHJvdmlkZWQgaW4gdGhlIFxtb2R1bGV7ZW1haWwudXRpbHN9CiBtb2R1bGU6CiAKIFxiZWdpbntmdW5jZGVzY317cXVvdGV9e3N0cn0KQEAgLTM4LDcgKzM4LDcgQEAKIHNpbXBsZSBleGFtcGxlIHRoYXQgZ2V0cyBhbGwgdGhlIHJlY2lwaWVudHMgb2YgYSBtZXNzYWdlOgogCiBcYmVnaW57dmVyYmF0aW19Ci1mcm9tIGVtYWlsLlV0aWxzIGltcG9ydCBnZXRhZGRyZXNzZXMKK2Zyb20gZW1haWwudXRpbHMgaW1wb3J0IGdldGFkZHJlc3NlcwogCiB0b3MgPSBtc2cuZ2V0X2FsbCgndG8nLCBbXSkKIGNjcyA9IG1zZy5nZXRfYWxsKCdjYycsIFtdKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWIudGV4IGIvRG9jL2xpYi9saWIudGV4CmluZGV4IGZhZDhmZTcuLmVhYzM1ZGUgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliLnRleAorKysgYi9Eb2MvbGliL2xpYi50ZXgKQEAgLTg3LDcgKzg3LDYgQEAKIFxpbnB1dHtsaWJzdHJpbmdzfSAgICAgICAgICAgICAgJSBTdHJpbmcgU2VydmljZXMKIFxpbnB1dHtsaWJzdHJpbmd9CiBcaW5wdXR7bGlicmV9Ci1caW5wdXR7bGlicmVjb252ZXJ0fQogXGlucHV0e2xpYnN0cnVjdH0gICAlIFhYWCBhbHNvL2JldHRlciBpbiBGaWxlIEZvcm1hdHM/CiBcaW5wdXR7bGliZGlmZmxpYn0KIFxpbnB1dHtsaWJzdHJpbmdpb30KQEAgLTM3Miw2ICszNzEsNyBAQAogXGlucHV0e2xpYmJsdGlufSAgICAgICAgICAgICAgICAlIHJlYWxseSBfX2J1aWx0aW5fXwogXGlucHV0e2xpYm1haW59ICAgICAgICAgICAgICAgICAlIHJlYWxseSBfX21haW5fXwogXGlucHV0e2xpYndhcm5pbmdzfQorXGlucHV0e2xpYmNvbnRleHRsaWJ9CiBcaW5wdXR7bGliYXRleGl0fQogXGlucHV0e2xpYnRyYWNlYmFja30KIFxpbnB1dHtsaWJmdXR1cmV9ICAgICAgICAgICAgICAgJSByZWFsbHkgX19mdXR1cmVfXwpAQCAtMzk1LDYgKzM5NSw3IEBACiBcaW5wdXR7bGliemlwaW1wb3J0fQogXGlucHV0e2xpYnBrZ3V0aWx9CiBcaW5wdXR7bGlibW9kdWxlZmluZGVyfQorXGlucHV0e2xpYnJ1bnB5fQogCiAKICUgPT09PT09PT09PT09PQpAQCAtNDU0LDggKzQ1NSw2IEBACiAlXGlucHV0e2xpYmNtcGNhY2hlfQogJVxpbnB1dHtsaWJjbXB9CiAlXGlucHV0e2xpYm5pfQotJVxpbnB1dHtsaWJyZWdleH0KLSVcaW5wdXR7bGlicmVnc3VifQogCiBcY2hhcHRlcntSZXBvcnRpbmcgQnVnc30KIFxpbnB1dHtyZXBvcnRpbmdidWdzfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJhcnJheS50ZXggYi9Eb2MvbGliL2xpYmFycmF5LnRleAppbmRleCA4OTczMTBkLi5lYWY1ODg4IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmFycmF5LnRleAorKysgYi9Eb2MvbGliL2xpYmFycmF5LnRleApAQCAtMTM5LDggKzEzOSw4IEBACiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVthcnJheV17ZnJvbXVuaWNvZGV9e3N9Ci1FeHRlbmRzIHRoaXMgYXJyYXkgd2l0aCBkYXRhIGZyb20gdGhlIGdpdmVuIHVuaWNvZGUgc3RyaW5nLgotVGhlIGFycmF5IG11c3QgYmUgYSB0eXBlICd1JyBhcnJheTsgb3RoZXJ3aXNlIGEgVmFsdWVFcnJvcgorRXh0ZW5kcyB0aGlzIGFycmF5IHdpdGggZGF0YSBmcm9tIHRoZSBnaXZlbiB1bmljb2RlIHN0cmluZy4gIFRoZSBhcnJheQorbXVzdCBiZSBhIHR5cGUgXGNvZGV7J3UnfSBhcnJheTsgb3RoZXJ3aXNlIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfQogaXMgcmFpc2VkLiAgVXNlIFxzYW1we2FycmF5LmZyb21zdHJpbmcodXN0ci5kZWNvZGUoZW5jKSl9IHRvCiBhcHBlbmQgVW5pY29kZSBkYXRhIHRvIGFuIGFycmF5IG9mIHNvbWUgb3RoZXIgdHlwZS4KIFxlbmR7bWV0aG9kZGVzY30KQEAgLTE5Nyw4ICsxOTcsOCBAQAogCiBcYmVnaW57bWV0aG9kZGVzY31bYXJyYXlde3RvdW5pY29kZX17fQogQ29udmVydCB0aGUgYXJyYXkgdG8gYSB1bmljb2RlIHN0cmluZy4gIFRoZSBhcnJheSBtdXN0IGJlCi1hIHR5cGUgJ3UnIGFycmF5OyBvdGhlcndpc2UgYSBWYWx1ZUVycm9yIGlzIHJhaXNlZC4gIFVzZQotYXJyYXkudG9zdHJpbmcoKS5kZWNvZGUoZW5jKSB0byBvYnRhaW4gYSB1bmljb2RlIHN0cmluZworYSB0eXBlIFxjb2Rleyd1J30gYXJyYXk7IG90aGVyd2lzZSBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMgcmFpc2VkLgorVXNlIFxzYW1we2FycmF5LnRvc3RyaW5nKCkuZGVjb2RlKGVuYyl9IHRvIG9idGFpbiBhIHVuaWNvZGUgc3RyaW5nCiBmcm9tIGFuIGFycmF5IG9mIHNvbWUgb3RoZXIgdHlwZS4KIFxlbmR7bWV0aG9kZGVzY30KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJhc3QudGV4IGIvRG9jL2xpYi9saWJhc3QudGV4CmluZGV4IGIzYzMxNDguLmIyOTU2YWUgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliYXN0LnRleAorKysgYi9Eb2MvbGliL2xpYmFzdC50ZXgKQEAgLTQ3LDExICs0NywxMSBAQAogY2FuIGhhdmUgemVyby1vci1tb3JlIHZhbHVlcyAobWFya2VkIHdpdGggYW4gYXN0ZXJpc2spLCB0aGUKIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYXMgUHl0aG9uIGxpc3RzLgogCi1cc3Vic2VjdGlvbntBYnN0cmFjdCBHcmFtbWFyfQorXHNlY3Rpb257QWJzdHJhY3QgR3JhbW1hcn0KIAogVGhlIG1vZHVsZSBkZWZpbmVzIGEgc3RyaW5nIGNvbnN0YW50IFxjb2Rle19fdmVyc2lvbl9ffSB3aGljaAogaXMgdGhlIGRlY2ltYWwgc3VidmVyc2lvbiByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUgc2hvd24gYmVsb3cuCiAKIFRoZSBhYnN0cmFjdCBncmFtbWFyIGlzIGN1cnJlbnRseSBkZWZpbmVkIGFzIGZvbGxvd3M6CiAKLVx2ZXJiYXRpbWlucHV0ey4uLy4uL1BhcnNlci9QeXRob24uYXNkbH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitcdmVyYmF0aW1pbnB1dHsuLi8uLi9QYXJzZXIvUHl0aG9uLmFzZGx9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmF1ZGlvb3AudGV4IGIvRG9jL2xpYi9saWJhdWRpb29wLnRleAppbmRleCA3NmJjZGJmLi41MmM2ZjNkIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmF1ZGlvb3AudGV4CisrKyBiL0RvYy9saWIvbGliYXVkaW9vcC50ZXgKQEAgLTEyLDkgKzEyLDEwIEBACiBtb2R1bGVzLiAgQWxsIHNjYWxhciBpdGVtcyBhcmUgaW50ZWdlcnMsIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlLgogCiAlIFRoaXMgcGFyYSBpcyBtb3N0bHkgaGVyZSB0byBwcm92aWRlIGFuIGV4Y3VzZSBmb3IgdGhlIGluZGV4IGVudHJpZXMuLi4KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHUtTEFXIGFuZCBJbnRlbC9EVkkgQURQQ00gZW5jb2RpbmdzLgorVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYS1MQVcsIHUtTEFXIGFuZCBJbnRlbC9EVkkgQURQQ00gZW5jb2RpbmdzLgogXGluZGV4e0ludGVsL0RWSSBBRFBDTX0KIFxpbmRleHtBRFBDTSwgSW50ZWwvRFZJfQorXGluZGV4e2EtTEFXfQogXGluZGV4e3UtTEFXfQogCiBBIGZldyBvZiB0aGUgbW9yZSBjb21wbGljYXRlZCBvcGVyYXRpb25zIG9ubHkgdGFrZSAxNi1iaXQgc2FtcGxlcywKQEAgLTQyLDYgKzQzLDEzIEBACiBoYXMgdGhlIHdpZHRoIHNwZWNpZmllZCBpbiBcdmFye3dpZHRofS4KIFxlbmR7ZnVuY2Rlc2N9CiAKK1xiZWdpbntmdW5jZGVzY317YWxhdzJsaW59e2ZyYWdtZW50LCB3aWR0aH0KK0NvbnZlcnQgc291bmQgZnJhZ21lbnRzIGluIGEtTEFXIGVuY29kaW5nIHRvIGxpbmVhcmx5IGVuY29kZWQgc291bmQKK2ZyYWdtZW50cy4gIGEtTEFXIGVuY29kaW5nIGFsd2F5cyB1c2VzIDggYml0cyBzYW1wbGVzLCBzbyBcdmFye3dpZHRofQorcmVmZXJzIG9ubHkgdG8gdGhlIHNhbXBsZSB3aWR0aCBvZiB0aGUgb3V0cHV0IGZyYWdtZW50IGhlcmUuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKIFxiZWdpbntmdW5jZGVzY317YXZnfXtmcmFnbWVudCwgd2lkdGh9CiBSZXR1cm4gdGhlIGF2ZXJhZ2Ugb3ZlciBhbGwgc2FtcGxlcyBpbiB0aGUgZnJhZ21lbnQuCiBcZW5ke2Z1bmNkZXNjfQpAQCAtOTgsMTAgKzEwNiw2IEBACiBSZXR1cm4gdGhlIHZhbHVlIG9mIHNhbXBsZSBcdmFye2luZGV4fSBmcm9tIHRoZSBmcmFnbWVudC4KIFxlbmR7ZnVuY2Rlc2N9CiAKLVxiZWdpbntmdW5jZGVzY317bGluMmxpbn17ZnJhZ21lbnQsIHdpZHRoLCBuZXd3aWR0aH0KLUNvbnZlcnQgc2FtcGxlcyBiZXR3ZWVuIDEtLCAyLSBhbmQgNC1ieXRlIGZvcm1hdHMuCi1cZW5ke2Z1bmNkZXNjfQotCiBcYmVnaW57ZnVuY2Rlc2N9e2xpbjJhZHBjbX17ZnJhZ21lbnQsIHdpZHRoLCBzdGF0ZX0KIENvbnZlcnQgc2FtcGxlcyB0byA0IGJpdCBJbnRlbC9EVkkgQURQQ00gZW5jb2RpbmcuICBBRFBDTSBjb2RpbmcgaXMgYW4KIGFkYXB0aXZlIGNvZGluZyBzY2hlbWUsIHdoZXJlYnkgZWFjaCA0IGJpdCBudW1iZXIgaXMgdGhlIGRpZmZlcmVuY2UKQEAgLTExNyw2ICsxMjEsMTggQEAKIHBhY2tlZCAyIDQtYml0IHZhbHVlcyBwZXIgYnl0ZS4KIFxlbmR7ZnVuY2Rlc2N9CiAKK1xiZWdpbntmdW5jZGVzY317bGluMmFsYXd9e2ZyYWdtZW50LCB3aWR0aH0KK0NvbnZlcnQgc2FtcGxlcyBpbiB0aGUgYXVkaW8gZnJhZ21lbnQgdG8gYS1MQVcgZW5jb2RpbmcgYW5kIHJldHVybgordGhpcyBhcyBhIFB5dGhvbiBzdHJpbmcuICBhLUxBVyBpcyBhbiBhdWRpbyBlbmNvZGluZyBmb3JtYXQgd2hlcmVieQoreW91IGdldCBhIGR5bmFtaWMgcmFuZ2Ugb2YgYWJvdXQgMTMgYml0cyB1c2luZyBvbmx5IDggYml0IHNhbXBsZXMuICBJdAoraXMgdXNlZCBieSB0aGUgU3VuIGF1ZGlvIGhhcmR3YXJlLCBhbW9uZyBvdGhlcnMuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317bGluMmxpbn17ZnJhZ21lbnQsIHdpZHRoLCBuZXd3aWR0aH0KK0NvbnZlcnQgc2FtcGxlcyBiZXR3ZWVuIDEtLCAyLSBhbmQgNC1ieXRlIGZvcm1hdHMuCitcZW5ke2Z1bmNkZXNjfQorCiBcYmVnaW57ZnVuY2Rlc2N9e2xpbjJ1bGF3fXtmcmFnbWVudCwgd2lkdGh9CiBDb252ZXJ0IHNhbXBsZXMgaW4gdGhlIGF1ZGlvIGZyYWdtZW50IHRvIHUtTEFXIGVuY29kaW5nIGFuZCByZXR1cm4KIHRoaXMgYXMgYSBQeXRob24gc3RyaW5nLiAgdS1MQVcgaXMgYW4gYXVkaW8gZW5jb2RpbmcgZm9ybWF0IHdoZXJlYnkKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYnNkZGIudGV4IGIvRG9jL2xpYi9saWJic2RkYi50ZXgKaW5kZXggZmE3YmI0Yi4uYTVjZGE2ZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJic2RkYi50ZXgKKysrIGIvRG9jL2xpYi9saWJic2RkYi50ZXgKQEAgLTE1LDkgKzE1LDggQEAKIHNlcmlhbGl6ZSB0aGVtIHNvbWVob3csIHR5cGljYWxseSB1c2luZyBcZnVuY3Rpb257bWFyc2hhbC5kdW1wcygpfSBvciAKIFxmdW5jdGlvbntwaWNrbGUuZHVtcHN9LgogCi1TdGFydGluZyB3aXRoIFB5dGhvbiAyLjMgdGhlIFxtb2R1bGV7YnNkZGJ9IG1vZHVsZSByZXF1aXJlcyB0aGUKLUJlcmtlbGV5IERCIGxpYnJhcnkgdmVyc2lvbiAzLjIgb3IgbGF0ZXIgKGl0IGlzIGtub3duIHRvIHdvcmsgd2l0aCAzLjIKLXRocm91Z2ggNC4zIGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZykuCitUaGUgXG1vZHVsZXtic2RkYn0gbW9kdWxlIHJlcXVpcmVzIGEgQmVya2VsZXkgREIgbGlicmFyeSB2ZXJzaW9uIGZyb20KKzMuMyB0aHJ1IDQuNC4KIAogXGJlZ2lue3NlZWFsc299CiAgIFxzZWV1cmx7aHR0cDovL3B5YnNkZGIuc291cmNlZm9yZ2UubmV0L317V2Vic2l0ZSB3aXRoIGRvY3VtZW50YXRpb24KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY2FsZW5kYXIudGV4IGIvRG9jL2xpYi9saWJjYWxlbmRhci50ZXgKaW5kZXggYmYzYTdkNi4uYWNmZDJkYSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJjYWxlbmRhci50ZXgKKysrIGIvRG9jL2xpYi9saWJjYWxlbmRhci50ZXgKQEAgLTE1LDEyICsxNSwxNzcgQEAKIHdlZWsgdG8gU3VuZGF5ICg2KSBvciB0byBhbnkgb3RoZXIgd2Vla2RheS4gIFBhcmFtZXRlcnMgdGhhdCBzcGVjaWZ5CiBkYXRlcyBhcmUgZ2l2ZW4gYXMgaW50ZWdlcnMuCiAKLU1vc3Qgb2YgdGhlc2UgZnVuY3Rpb25zIHJlbHkgb24gdGhlIFxtb2R1bGV7ZGF0ZXRpbWV9IG1vZHVsZSB3aGljaAotdXNlcyBhbiBpZGVhbGl6ZWQgY2FsZW5kYXIsIHRoZSBjdXJyZW50IEdyZWdvcmlhbiBjYWxlbmRhciBpbmRlZmluaXRlbHkKLWV4dGVuZGVkIGluIGJvdGggZGlyZWN0aW9ucy4gIFRoaXMgbWF0Y2hlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSJwcm9sZXB0aWMgR3JlZ29yaWFuIiBjYWxlbmRhciBpbiBEZXJzaG93aXR6IGFuZCBSZWluZ29sZCdzIGJvb2sKLSJDYWxlbmRyaWNhbCBDYWxjdWxhdGlvbnMiLCB3aGVyZSBpdCdzIHRoZSBiYXNlIGNhbGVuZGFyIGZvciBhbGwKLWNvbXB1dGF0aW9ucy4KK01vc3Qgb2YgdGhlc2UgZnVuY3Rpb25zIGFuZCBjbGFzc3NlcyByZWx5IG9uIHRoZSBcbW9kdWxle2RhdGV0aW1lfQorbW9kdWxlIHdoaWNoIHVzZXMgYW4gaWRlYWxpemVkIGNhbGVuZGFyLCB0aGUgY3VycmVudCBHcmVnb3JpYW4KK2NhbGVuZGFyIGluZGVmaW5pdGVseSBleHRlbmRlZCBpbiBib3RoIGRpcmVjdGlvbnMuICBUaGlzIG1hdGNoZXMKK3RoZSBkZWZpbml0aW9uIG9mIHRoZSAicHJvbGVwdGljIEdyZWdvcmlhbiIgY2FsZW5kYXIgaW4gRGVyc2hvd2l0egorYW5kIFJlaW5nb2xkJ3MgYm9vayAiQ2FsZW5kcmljYWwgQ2FsY3VsYXRpb25zIiwgd2hlcmUgaXQncyB0aGUKK2Jhc2UgY2FsZW5kYXIgZm9yIGFsbCBjb21wdXRhdGlvbnMuCisKK1xiZWdpbntjbGFzc2Rlc2N9e0NhbGVuZGFyfXtcb3B0aW9uYWx7Zmlyc3R3ZWVrZGF5fX0KK0NyZWF0ZXMgYSBcY2xhc3N7Q2FsZW5kYXJ9IG9iamVjdC4gXHZhcntmaXJzdHdlZWtkYXl9IGlzIGFuIGludGVnZXIKK3NwZWNpZnlpbmcgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay4gXGNvZGV7MH0gaXMgTW9uZGF5ICh0aGUgZGVmYXVsdCksCitcY29kZXs2fSBpcyBTdW5kYXkuCisKK0EgXGNsYXNze0NhbGVuZGFyfSBvYmplY3QgcHJvdmlkZXMgc2V2ZXJhbCBtZXRob2RzIHRoYXQgY2FuCitiZSB1c2VkIGZvciBwcmVwYXJpbmcgdGhlIGNhbGVuZGFyIGRhdGEgZm9yIGZvcm1hdHRpbmcuIFRoaXMKK2NsYXNzIGRvZXNuJ3QgZG8gYW55IGZvcm1hdHRpbmcgaXRzZWxmLiBUaGlzIGlzIHRoZSBqb2Igb2YKK3N1YmNsYXNzZXMuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7Y2xhc3NkZXNjfQorCitcY2xhc3N7Q2FsZW5kYXJ9IGluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9e2l0ZXJ3ZWVrZGF5c317d2Vla2RheX0KK1JldHVybiBhbiBpdGVyYXRvciBmb3IgdGhlIHdlZWsgZGF5IG51bWJlcnMgdGhhdCB3aWxsIGJlIHVzZWQKK2ZvciBvbmUgd2Vlay4gVGhlIGZpcnN0IG51bWJlciBmcm9tIHRoZSBpdGVyYXRvciB3aWxsIGJlIHRoZQorc2FtZSBhcyB0aGUgbnVtYmVyIHJldHVybmVkIGJ5IFxtZXRob2R7Zmlyc3R3ZWVrZGF5KCl9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317aXRlcm1vbnRoZGF0ZXN9e3llYXIsIG1vbnRofQorUmV0dXJuIGFuIGl0ZXJhdG9yIGZvciB0aGUgbW9udGggXHZhcnttb250aH0gKDEtMTIpIGluIHRoZQoreWVhciBcdmFye3llYXJ9LiBUaGlzIGl0ZXJhdG9yIHdpbGwgcmV0dXJuIGFsbCBkYXlzIChhcworXGNsYXNze2RhdGV0aW1lLmRhdGV9IG9iamVjdHMpIGZvciB0aGUgbW9udGggYW5kIGFsbCBkYXlzCitiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBtb250aCBvciBhZnRlciB0aGUgZW5kIG9mIHRoZSBtb250aAordGhhdCBhcmUgcmVxdWlyZWQgdG8gZ2V0IGEgY29tcGxldGUgd2Vlay4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2l0ZXJtb250aGRheXMyfXt5ZWFyLCBtb250aH0KK1JldHVybiBhbiBpdGVyYXRvciBmb3IgdGhlIG1vbnRoIFx2YXJ7bW9udGh9IGluIHRoZSB5ZWFyCitcdmFye3llYXJ9IHNpbWlsYXIgdG8gXG1ldGhvZHtpdGVybW9udGhkYXRlcygpfS4gRGF5cyByZXR1cm5lZAord2lsbCBiZSB0dXBsZXMgY29uc2lzdGluZyBvZiBhIGRheSBudW1iZXIgYW5kIGEgd2VlayBkYXkKK251bWJlci4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2l0ZXJtb250aGRheXN9e3llYXIsIG1vbnRofQorUmV0dXJuIGFuIGl0ZXJhdG9yIGZvciB0aGUgbW9udGggXHZhcnttb250aH0gaW4gdGhlIHllYXIKK1x2YXJ7eWVhcn0gc2ltaWxhciB0byBcbWV0aG9ke2l0ZXJtb250aGRhdGVzKCl9LiBEYXlzIHJldHVybmVkCit3aWxsIHNpbXBseSBiZSBkYXkgbnVtYmVycy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e21vbnRoZGF0ZXNjYWxlbmRhcn17eWVhciwgbW9udGh9CitSZXR1cm4gYSBsaXN0IG9mIHRoZSB3ZWVrcyBpbiB0aGUgbW9udGggXHZhcnttb250aH0gb2YKK3RoZSBcdmFye3llYXJ9IGFzIGZ1bGwgd2Vla3MuIFdlZWtzIGFyZSBsaXN0cyBvZiBzZXZlbgorXGNsYXNze2RhdGV0aW1lLmRhdGV9IG9iamVjdHMuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXttb250aGRheXMyY2FsZW5kYXJ9e3llYXIsIG1vbnRofQorUmV0dXJuIGEgbGlzdCBvZiB0aGUgd2Vla3MgaW4gdGhlIG1vbnRoIFx2YXJ7bW9udGh9IG9mCit0aGUgXHZhcnt5ZWFyfSBhcyBmdWxsIHdlZWtzLiBXZWVrcyBhcmUgbGlzdHMgb2Ygc2V2ZW4KK3R1cGxlcyBvZiBkYXkgbnVtYmVycyBhbmQgd2Vla2RheSBudW1iZXJzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317bW9udGhkYXlzY2FsZW5kYXJ9e3llYXIsIG1vbnRofQorUmV0dXJuIGEgbGlzdCBvZiB0aGUgd2Vla3MgaW4gdGhlIG1vbnRoIFx2YXJ7bW9udGh9IG9mCit0aGUgXHZhcnt5ZWFyfSBhcyBmdWxsIHdlZWtzLiBXZWVrcyBhcmUgbGlzdHMgb2Ygc2V2ZW4KK2RheSBudW1iZXJzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317eWVhcmRhdGVzY2FsZW5kYXJ9e3llYXIsIG1vbnRoXG9wdGlvbmFseywgd2lkdGh9fQorUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHllYXIgcmVhZHkgZm9yIGZvcm1hdHRpbmcuIFRoZSByZXR1cm4KK3ZhbHVlIGlzIGEgbGlzdCBvZiBtb250aCByb3dzLiBFYWNoIG1vbnRoIHJvdyBjb250YWlucyB1cCB0byBcdmFye3dpZHRofQorbW9udGhzIChkZWZhdWx0aW5nIHRvIDMpLiBFYWNoIG1vbnRoIGNvbnRhaW5zIGJldHdlZW4gNCBhbmQgNiB3ZWVrcyBhbmQKK2VhY2ggd2VlayBjb250YWlucyAxLS03IGRheXMuIERheXMgYXJlIFxjbGFzc3tkYXRldGltZS5kYXRlfSBvYmplY3RzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317eWVhcmRheXMyY2FsZW5kYXJ9e3llYXIsIG1vbnRoXG9wdGlvbmFseywgd2lkdGh9fQorUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHllYXIgcmVhZHkgZm9yIGZvcm1hdHRpbmcgKHNpbWlsYXIgdG8KK1xtZXRob2R7eWVhcmRhdGVzY2FsZW5kYXIoKX0pLiBFbnRyaWVzIGluIHRoZSB3ZWVrIGxpc3RzIGFyZSB0dXBsZXMgb2YKK2RheSBudW1iZXJzIGFuZCB3ZWVrZGF5IG51bWJlcnMuIERheSBudW1iZXJzIG91dHNpZGUgdGhpcyBtb250aCBhcmUgemVyby4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3llYXJkYXlzY2FsZW5kYXJ9e3llYXIsIG1vbnRoXG9wdGlvbmFseywgd2lkdGh9fQorUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHllYXIgcmVhZHkgZm9yIGZvcm1hdHRpbmcgKHNpbWlsYXIgdG8KK1xtZXRob2R7eWVhcmRhdGVzY2FsZW5kYXIoKX0pLiBFbnRyaWVzIGluIHRoZSB3ZWVrIGxpc3RzIGFyZSBkYXkgbnVtYmVycy4KK0RheSBudW1iZXJzIG91dHNpZGUgdGhpcyBtb250aCBhcmUgemVyby4KK1xlbmR7bWV0aG9kZGVzY30KKworCitcYmVnaW57Y2xhc3NkZXNjfXtUZXh0Q2FsZW5kYXJ9e1xvcHRpb25hbHtmaXJzdHdlZWtkYXl9fQorVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBwbGFpbiB0ZXh0IGNhbGVuZGFycy4KKworXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2NsYXNzZGVzY30KKworXGNsYXNze1RleHRDYWxlbmRhcn0gaW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCitcYmVnaW57bWV0aG9kZGVzY317Zm9ybWF0bW9udGh9e3RoZXllYXIsIHRoZW1vbnRoXG9wdGlvbmFseywgd1xvcHRpb25hbHssIGx9fX0KK1JldHVybiBhIG1vbnRoJ3MgY2FsZW5kYXIgaW4gYSBtdWx0aS1saW5lIHN0cmluZy4gSWYgXHZhcnt3fSBpcworcHJvdmlkZWQsIGl0IHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGRhdGUgY29sdW1ucywgd2hpY2ggYXJlCitjZW50ZXJlZC4gSWYgXHZhcntsfSBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgbGluZXMgdGhhdAorZWFjaCB3ZWVrIHdpbGwgdXNlLiBEZXBlbmRzIG9uIHRoZSBmaXJzdCB3ZWVrZGF5IGFzIHNldCBieQorXGZ1bmN0aW9ue3NldGZpcnN0d2Vla2RheSgpfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3BybW9udGh9e3RoZXllYXIsIHRoZW1vbnRoXG9wdGlvbmFseywgd1xvcHRpb25hbHssIGx9fX0KK1ByaW50IGEgbW9udGgncyBjYWxlbmRhciBhcyByZXR1cm5lZCBieSBcbWV0aG9ke2Zvcm1hdG1vbnRoKCl9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Zm9ybWF0eWVhcn17dGhleWVhciwgdGhlbW9udGhcb3B0aW9uYWx7LCB3XG9wdGlvbmFseywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsXG9wdGlvbmFseywgY1xvcHRpb25hbHssIG19fX19fQorUmV0dXJuIGEgXHZhcnttfS1jb2x1bW4gY2FsZW5kYXIgZm9yIGFuIGVudGlyZSB5ZWFyIGFzIGEgbXVsdGktbGluZSBzdHJpbmcuCitPcHRpb25hbCBwYXJhbWV0ZXJzIFx2YXJ7d30sIFx2YXJ7bH0sIGFuZCBcdmFye2N9IGFyZSBmb3IgZGF0ZSBjb2x1bW4KK3dpZHRoLCBsaW5lcyBwZXIgd2VlaywgYW5kIG51bWJlciBvZiBzcGFjZXMgYmV0d2VlbiBtb250aCBjb2x1bW5zLAorcmVzcGVjdGl2ZWx5LiBEZXBlbmRzIG9uIHRoZSBmaXJzdCB3ZWVrZGF5IGFzIHNldCBieQorXG1ldGhvZHtzZXRmaXJzdHdlZWtkYXkoKX0uICBUaGUgZWFybGllc3QgeWVhciBmb3Igd2hpY2ggYSBjYWxlbmRhciBjYW4KK2JlIGdlbmVyYXRlZCBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtwcnllYXJ9e3RoZXllYXJcb3B0aW9uYWx7LCB3XG9wdGlvbmFseywgbFxvcHRpb25hbHssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjXG9wdGlvbmFseywgbX19fX19CitQcmludCB0aGUgY2FsZW5kYXIgZm9yIGFuIGVudGlyZSB5ZWFyIGFzIHJldHVybmVkIGJ5IFxtZXRob2R7Zm9ybWF0eWVhcigpfS4KK1xlbmR7bWV0aG9kZGVzY30KKworCitcYmVnaW57Y2xhc3NkZXNjfXtIVE1MQ2FsZW5kYXJ9e1xvcHRpb25hbHtmaXJzdHdlZWtkYXl9fQorVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBIVE1MIGNhbGVuZGFycy4KKworXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2NsYXNzZGVzY30KKworXGNsYXNze0hUTUxDYWxlbmRhcn0gaW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCitcYmVnaW57bWV0aG9kZGVzY317Zm9ybWF0bW9udGh9e3RoZXllYXIsIHRoZW1vbnRoXG9wdGlvbmFseywgd2l0aHllYXJ9fQorUmV0dXJuIGEgbW9udGgncyBjYWxlbmRhciBhcyBhbiBIVE1MIHRhYmxlLiBJZiBcdmFye3dpdGh5ZWFyfSBpcwordHJ1ZSB0aGUgeWVhciB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBoZWFkZXIsIG90aGVyd2lzZSBqdXN0IHRoZQorbW9udGggbmFtZSB3aWxsIGJlIHVzZWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtmb3JtYXR5ZWFyfXt0aGV5ZWFyLCB0aGVtb250aFxvcHRpb25hbHssIHdpZHRofX0KK1JldHVybiBhIHllYXIncyBjYWxlbmRhciBhcyBhbiBIVE1MIHRhYmxlLiBcdmFye3dpZHRofSAoZGVmYXVsdGluZyB0byAzKQorc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgbW9udGhzIHBlciByb3cuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtmb3JtYXR5ZWFycGFnZX17dGhleWVhciwgdGhlbW9udGhcb3B0aW9uYWx7LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aFxvcHRpb25hbHssIGNzc1xvcHRpb25hbHssIGVuY29kaW5nfX19fQorUmV0dXJuIGEgeWVhcidzIGNhbGVuZGFyIGFzIGEgY29tcGxldGUgSFRNTCBwYWdlLiBcdmFye3dpZHRofQorKGRlZmF1bHRpbmcgdG8gMykgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgbW9udGhzIHBlciByb3cuIFx2YXJ7Y3NzfQoraXMgdGhlIG5hbWUgZm9yIHRoZSBjYXNjYWRpbmcgc3R5bGUgc2hlZXQgdG8gYmUgdXNlZC4gXGNvbnN0YW50e05vbmV9CitjYW4gYmUgcGFzc2VkIGlmIG5vIHN0eWxlIHNoZWV0IHNob3VsZCBiZSB1c2VkLiBcdmFye2VuY29kaW5nfQorc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB0byBiZSB1c2VkIGZvciB0aGUgb3V0cHV0IChkZWZhdWx0aW5nCit0byB0aGUgc3lzdGVtIGRlZmF1bHQgZW5jb2RpbmcpLgorXGVuZHttZXRob2RkZXNjfQorCisKK1xiZWdpbntjbGFzc2Rlc2N9e0xvY2FsZVRleHRDYWxlbmRhcn17XG9wdGlvbmFse2ZpcnN0d2Vla2RheVxvcHRpb25hbHssIGxvY2FsZX19fQorVGhpcyBzdWJjbGFzcyBvZiBcY2xhc3N7VGV4dENhbGVuZGFyfSBjYW4gYmUgcGFzc2VkIGEgbG9jYWxlIG5hbWUgaW4gdGhlCitjb25zdHJ1Y3RvciBhbmQgd2lsbCByZXR1cm4gbW9udGggYW5kIHdlZWtkYXkgbmFtZXMgaW4gdGhlIHNwZWNpZmllZCBsb2NhbGUuCitJZiB0aGlzIGxvY2FsZSBpbmNsdWRlcyBhbiBlbmNvZGluZyBhbGwgc3RyaW5ncyBjb250YWluaW5nIG1vbnRoIGFuZCB3ZWVrZGF5CituYW1lcyB3aWxsIGJlIHJldHVybmVkIGFzIHVuaWNvZGUuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7Y2xhc3NkZXNjfQorCisKK1xiZWdpbntjbGFzc2Rlc2N9e0xvY2FsZUhUTUxDYWxlbmRhcn17XG9wdGlvbmFse2ZpcnN0d2Vla2RheVxvcHRpb25hbHssIGxvY2FsZX19fQorVGhpcyBzdWJjbGFzcyBvZiBcY2xhc3N7SFRNTENhbGVuZGFyfSBjYW4gYmUgcGFzc2VkIGEgbG9jYWxlIG5hbWUgaW4gdGhlCitjb25zdHJ1Y3RvciBhbmQgd2lsbCByZXR1cm4gbW9udGggYW5kIHdlZWtkYXkgbmFtZXMgaW4gdGhlIHNwZWNpZmllZCBsb2NhbGUuCitJZiB0aGlzIGxvY2FsZSBpbmNsdWRlcyBhbiBlbmNvZGluZyBhbGwgc3RyaW5ncyBjb250YWluaW5nIG1vbnRoIGFuZCB3ZWVrZGF5CituYW1lcyB3aWxsIGJlIHJldHVybmVkIGFzIHVuaWNvZGUuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7Y2xhc3NkZXNjfQorCisKK0ZvciBzaW1wbGUgdGV4dCBjYWxlbmRhcnMgdGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMuCiAKIFxiZWdpbntmdW5jZGVzY317c2V0Zmlyc3R3ZWVrZGF5fXt3ZWVrZGF5fQogU2V0cyB0aGUgd2Vla2RheSAoXGNvZGV7MH0gaXMgTW9uZGF5LCBcY29kZXs2fSBpcyBTdW5kYXkpIHRvIHN0YXJ0CkBAIC04MCwxMSArMjQ1LDggQEAKIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317bW9udGh9e3RoZXllYXIsIHRoZW1vbnRoXG9wdGlvbmFseywgd1xvcHRpb25hbHssIGx9fX0KLVJldHVybnMgYSBtb250aCdzIGNhbGVuZGFyIGluIGEgbXVsdGktbGluZSBzdHJpbmcuIElmIFx2YXJ7d30gaXMKLXByb3ZpZGVkLCBpdCBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBkYXRlIGNvbHVtbnMsIHdoaWNoIGFyZQotY2VudGVyZWQuIElmIFx2YXJ7bH0gaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRoYXQKLWVhY2ggd2VlayB3aWxsIHVzZS4gRGVwZW5kcyBvbiB0aGUgZmlyc3Qgd2Vla2RheSBhcyBzZXQgYnkKLVxmdW5jdGlvbntzZXRmaXJzdHdlZWtkYXkoKX0uCitSZXR1cm5zIGEgbW9udGgncyBjYWxlbmRhciBpbiBhIG11bHRpLWxpbmUgc3RyaW5nIHVzaW5nIHRoZQorXG1ldGhvZHtmb3JtYXRtb250aH0gb2YgdGhlIFxjbGFzc3tUZXh0Q2FsZW5kYXJ9IGNsYXNzLgogXHZlcnNpb25hZGRlZHsyLjB9CiBcZW5ke2Z1bmNkZXNjfQogCkBAIC05NCwxMiArMjU2LDggQEAKIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317Y2FsZW5kYXJ9e3llYXJcb3B0aW9uYWx7LCB3XG9wdGlvbmFseywgbFxvcHRpb25hbHtjfX19fQotUmV0dXJucyBhIDMtY29sdW1uIGNhbGVuZGFyIGZvciBhbiBlbnRpcmUgeWVhciBhcyBhIG11bHRpLWxpbmUgc3RyaW5nLgotT3B0aW9uYWwgcGFyYW1ldGVycyBcdmFye3d9LCBcdmFye2x9LCBhbmQgXHZhcntjfSBhcmUgZm9yIGRhdGUgY29sdW1uCi13aWR0aCwgbGluZXMgcGVyIHdlZWssIGFuZCBudW1iZXIgb2Ygc3BhY2VzIGJldHdlZW4gbW9udGggY29sdW1ucywKLXJlc3BlY3RpdmVseS4gRGVwZW5kcyBvbiB0aGUgZmlyc3Qgd2Vla2RheSBhcyBzZXQgYnkKLVxmdW5jdGlvbntzZXRmaXJzdHdlZWtkYXkoKX0uICBUaGUgZWFybGllc3QgeWVhciBmb3Igd2hpY2ggYSBjYWxlbmRhciBjYW4KLWJlIGdlbmVyYXRlZCBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQuCitSZXR1cm5zIGEgMy1jb2x1bW4gY2FsZW5kYXIgZm9yIGFuIGVudGlyZSB5ZWFyIGFzIGEgbXVsdGktbGluZSBzdHJpbmcKK3VzaW5nIHRoZSBcbWV0aG9ke2Zvcm1hdHllYXJ9IG9mIHRoZSBcY2xhc3N7VGV4dENhbGVuZGFyfSBjbGFzcy4KIFx2ZXJzaW9uYWRkZWR7Mi4wfQogXGVuZHtmdW5jZGVzY30KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjZ2kudGV4IGIvRG9jL2xpYi9saWJjZ2kudGV4CmluZGV4IGNkNmY1OGEuLjFkZDdlMDMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY2dpLnRleAorKysgYi9Eb2MvbGliL2xpYmNnaS50ZXgKQEAgLTMyMyw3ICszMjMsNyBAQAogCiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgXHZhcntzdHJpY3RfcGFyc2luZ30gaXMgYSBmbGFnIGluZGljYXRpbmcgd2hhdAogdG8gZG8gd2l0aCBwYXJzaW5nIGVycm9ycy4gIElmIGZhbHNlICh0aGUgZGVmYXVsdCksIGVycm9ycwotYXJlIHNpbGVudGx5IGlnbm9yZWQuICBJZiB0cnVlLCBlcnJvcnMgcmFpc2UgYSBWYWx1ZUVycm9yCithcmUgc2lsZW50bHkgaWdub3JlZC4gIElmIHRydWUsIGVycm9ycyByYWlzZSBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0KIGV4Y2VwdGlvbi4KIAogVXNlIHRoZSBcZnVuY3Rpb257XHJlZm1vZHVsZXt1cmxsaWJ9LnVybGVuY29kZSgpfSBmdW5jdGlvbiB0byBjb252ZXJ0CkBAIC0zNDcsNyArMzQ3LDcgQEAKIAogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7c3RyaWN0X3BhcnNpbmd9IGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoYXQKIHRvIGRvIHdpdGggcGFyc2luZyBlcnJvcnMuICBJZiBmYWxzZSAodGhlIGRlZmF1bHQpLCBlcnJvcnMKLWFyZSBzaWxlbnRseSBpZ25vcmVkLiAgSWYgdHJ1ZSwgZXJyb3JzIHJhaXNlIGEgVmFsdWVFcnJvcgorYXJlIHNpbGVudGx5IGlnbm9yZWQuICBJZiB0cnVlLCBlcnJvcnMgcmFpc2UgYSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9CiBleGNlcHRpb24uCiAKIFVzZSB0aGUgXGZ1bmN0aW9ue1xyZWZtb2R1bGV7dXJsbGlifS51cmxlbmNvZGUoKX0gZnVuY3Rpb24gdG8gY29udmVydApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjb2RlY3MudGV4IGIvRG9jL2xpYi9saWJjb2RlY3MudGV4CmluZGV4IDE4MDZlZjAuLjhhMjQxN2UgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY29kZWNzLnRleAorKysgYi9Eb2MvbGliL2xpYmNvZGVjcy50ZXgKQEAgLTExMiw2ICsxMTIsNyBAQAogCiBSYWlzZXMgYSBcZXhjZXB0aW9ue0xvb2t1cEVycm9yfSBpbiBjYXNlIHRoZSBlbmNvZGluZyBjYW5ub3QgYmUgZm91bmQgb3IgdGhlCiBjb2RlYyBkb2Vzbid0IHN1cHBvcnQgYW4gaW5jcmVtZW50YWwgZW5jb2Rlci4KK1x2ZXJzaW9uYWRkZWR7Mi41fQogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtnZXRpbmNyZW1lbnRhbGRlY29kZXJ9e2VuY29kaW5nfQpAQCAtMTIwLDYgKzEyMSw3IEBACiAKIFJhaXNlcyBhIFxleGNlcHRpb257TG9va3VwRXJyb3J9IGluIGNhc2UgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBmb3VuZCBvciB0aGUKIGNvZGVjIGRvZXNuJ3Qgc3VwcG9ydCBhbiBpbmNyZW1lbnRhbCBkZWNvZGVyLgorXHZlcnNpb25hZGRlZHsyLjV9CiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2dldHJlYWRlcn17ZW5jb2Rpbmd9CkBAIC0xNTAsNyArMTUyLDcgQEAKIGNvbnRpbnVlLiBUaGUgZW5jb2RlciB3aWxsIGVuY29kZSB0aGUgcmVwbGFjZW1lbnQgYW5kIGNvbnRpbnVlIGVuY29kaW5nCiB0aGUgb3JpZ2luYWwgaW5wdXQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gTmVnYXRpdmUgcG9zaXRpb24gdmFsdWVzCiB3aWxsIGJlIHRyZWF0ZWQgYXMgYmVpbmcgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nLiBJZiB0aGUKLXJlc3VsdGluZyBwb3NpdGlvbiBpcyBvdXQgb2YgYm91bmQgYW4gSW5kZXhFcnJvciB3aWxsIGJlIHJhaXNlZC4KK3Jlc3VsdGluZyBwb3NpdGlvbiBpcyBvdXQgb2YgYm91bmQgYW4gXGV4Y2VwdGlvbntJbmRleEVycm9yfSB3aWxsIGJlIHJhaXNlZC4KIAogRGVjb2RpbmcgYW5kIHRyYW5zbGF0aW5nIHdvcmtzIHNpbWlsYXIsIGV4Y2VwdCBcZXhjZXB0aW9ue1VuaWNvZGVEZWNvZGVFcnJvcn0KIG9yIFxleGNlcHRpb257VW5pY29kZVRyYW5zbGF0ZUVycm9yfSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgaGFuZGxlciBhbmQKQEAgLTIyOSwxMiArMjMxLDE0IEBACiBVc2VzIGFuIGluY3JlbWVudGFsIGVuY29kZXIgdG8gaXRlcmF0aXZlbHkgZW5jb2RlIHRoZSBpbnB1dCBwcm92aWRlZCBieQogXHZhcntpdGVyYWJsZX0uIFRoaXMgZnVuY3Rpb24gaXMgYSBnZW5lcmF0b3IuIFx2YXJ7ZXJyb3JzfSAoYXMgd2VsbCBhcwogYW55IG90aGVyIGtleXdvcmQgYXJndW1lbnQpIGlzIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBpbmNyZW1lbnRhbCBlbmNvZGVyLgorXHZlcnNpb25hZGRlZHsyLjV9CiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2l0ZXJkZWNvZGV9e2l0ZXJhYmxlLCBlbmNvZGluZ1xvcHRpb25hbHssIGVycm9yc319CiBVc2VzIGFuIGluY3JlbWVudGFsIGRlY29kZXIgdG8gaXRlcmF0aXZlbHkgZGVjb2RlIHRoZSBpbnB1dCBwcm92aWRlZCBieQogXHZhcntpdGVyYWJsZX0uIFRoaXMgZnVuY3Rpb24gaXMgYSBnZW5lcmF0b3IuIFx2YXJ7ZXJyb3JzfSAoYXMgd2VsbCBhcwogYW55IG90aGVyIGtleXdvcmQgYXJndW1lbnQpIGlzIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBpbmNyZW1lbnRhbCBlbmNvZGVyLgorXHZlcnNpb25hZGRlZHsyLjV9CiBcZW5ke2Z1bmNkZXNjfQogCiBUaGUgbW9kdWxlIGFsc28gcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgd2hpY2ggYXJlIHVzZWZ1bApAQCAtMzU1LDYgKzM1OSw4IEBACiAKIFxzdWJzdWJzZWN0aW9ue0luY3JlbWVudGFsRW5jb2RlciBPYmplY3RzIFxsYWJlbHtpbmNyZW1lbnRhbC1lbmNvZGVyLW9iamVjdHN9fQogCitcdmVyc2lvbmFkZGVkezIuNX0KKwogVGhlIFxjbGFzc3tJbmNyZW1lbnRhbEVuY29kZXJ9IGNsYXNzIGlzIHVzZWQgZm9yIGVuY29kaW5nIGFuIGlucHV0IGluIG11bHRpcGxlCiBzdGVwcy4gSXQgZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgd2hpY2ggZXZlcnkgaW5jcmVtZW50YWwgZW5jb2RlciBtdXN0CiBkZWZpbmUgaW4gb3JkZXIgdG8gYmUgY29tcGF0aWJsZSB0byB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5LgpAQCAtNDM3LDYgKzQ0MywxMCBAQAogICBEZWNvZGVzIFx2YXJ7b2JqZWN0fSAodGFraW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZWNvZGVyIGludG8gYWNjb3VudCkKICAgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBkZWNvZGVkIG9iamVjdC4gSWYgdGhpcyBpcyB0aGUgbGFzdCBjYWxsIHRvCiAgIFxtZXRob2R7ZGVjb2RlfSBcdmFye2ZpbmFsfSBtdXN0IGJlIHRydWUgKHRoZSBkZWZhdWx0IGlzIGZhbHNlKS4KKyAgSWYgXHZhcntmaW5hbH0gaXMgdHJ1ZSB0aGUgZGVjb2RlciBtdXN0IGRlY29kZSB0aGUgaW5wdXQgY29tcGxldGVseSBhbmQgbXVzdAorICBmbHVzaCBhbGwgYnVmZmVycy4gSWYgdGhpcyBpc24ndCBwb3NzaWJsZSAoZS5nLiBiZWNhdXNlIG9mIGluY29tcGxldGUgYnl0ZQorICBzZXF1ZW5jZXMgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQpIGl0IG11c3QgaW5pdGlhdGUgZXJyb3IgaGFuZGxpbmcganVzdCBsaWtlCisgIGluIHRoZSBzdGF0ZWxlc3MgY2FzZSAod2hpY2ggbWlnaHQgcmFpc2UgYW4gZXhjZXB0aW9uKS4KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9e3Jlc2V0fXt9CkBAIC02OTAsMTAgKzcwMCwxMCBAQAogVGhlIHNpbXBsZXN0IG1ldGhvZCBpcyB0byBtYXAgdGhlIGNvZGVwb2ludHMgMC0yNTUgdG8gdGhlIGJ5dGVzCiBcY29kZXsweDB9LVxjb2RlezB4ZmZ9LiBUaGlzIG1lYW5zIHRoYXQgYSB1bmljb2RlIG9iamVjdCB0aGF0IGNvbnRhaW5zIAogY29kZXBvaW50cyBhYm92ZSBcY29kZXtVKzAwRkZ9IGNhbid0IGJlIGVuY29kZWQgd2l0aCB0aGlzIG1ldGhvZCAod2hpY2ggCi1pcyBjYWxsZWQgXGNvZGV7J2xhdGluLTEnfSBvciBcY29kZXsnaXNvLTg4NTktMSd9KS4gdW5pY29kZS5lbmNvZGUoKSB3aWxsIAotcmFpc2UgYSBVbmljb2RlRW5jb2RlRXJyb3IgdGhhdCBsb29rcyBsaWtlIHRoaXM6IFxzYW1we1VuaWNvZGVFbmNvZGVFcnJvcjoKLSdsYXRpbi0xJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyIHUnXGUgdTEyMzQnIGluIHBvc2l0aW9uIDM6IG9yZGluYWwKLW5vdCBpbiByYW5nZSgyNTYpfS4KK2lzIGNhbGxlZCBcY29kZXsnbGF0aW4tMSd9IG9yIFxjb2Rleydpc28tODg1OS0xJ30pLgorXGZ1bmN0aW9ue3VuaWNvZGUuZW5jb2RlKCl9IHdpbGwgcmFpc2UgYSBcZXhjZXB0aW9ue1VuaWNvZGVFbmNvZGVFcnJvcn0KK3RoYXQgbG9va3MgbGlrZSB0aGlzOiBcc2FtcHtVbmljb2RlRW5jb2RlRXJyb3I6ICdsYXRpbi0xJyBjb2RlYyBjYW4ndAorZW5jb2RlIGNoYXJhY3RlciB1J1xlIHUxMjM0JyBpbiBwb3NpdGlvbiAzOiBvcmRpbmFsIG5vdCBpbiByYW5nZSgyNTYpfS4KIAogVGhlcmUncyBhbm90aGVyIGdyb3VwIG9mIGVuY29kaW5ncyAodGhlIHNvIGNhbGxlZCBjaGFybWFwIGVuY29kaW5ncykKIHRoYXQgY2hvb3NlIGEgZGlmZmVyZW50IHN1YnNldCBvZiBhbGwgdW5pY29kZSBjb2RlIHBvaW50cyBhbmQgaG93CkBAIC0xMjIwLDcgKzEyMzAsNyBAQAogCiBcbGluZWl2e3JvdF8xM30KICAgICAgICAgIHtyb3QxM30KLSAgICAgICAgIHtieXRlIHN0cmluZ30KKyAgICAgICAgIHtVbmljb2RlIHN0cmluZ30KICAgICAgICAgIHtSZXR1cm5zIHRoZSBDYWVzYXItY3lwaGVyIGVuY3J5cHRpb24gb2YgdGhlIG9wZXJhbmR9CiAKIFxsaW5laXZ7c3RyaW5nX2VzY2FwZX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY29sbGVjdGlvbnMudGV4IGIvRG9jL2xpYi9saWJjb2xsZWN0aW9ucy50ZXgKaW5kZXggNTQyZWY2Yi4uZDliZmEzOSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJjb2xsZWN0aW9ucy50ZXgKKysrIGIvRG9jL2xpYi9saWJjb2xsZWN0aW9ucy50ZXgKQEAgLTEwLDkgKzEwLDExIEBACiAKIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgaGlnaC1wZXJmb3JtYW5jZSBjb250YWluZXIgZGF0YXR5cGVzLiAgQ3VycmVudGx5LAogdGhlcmUgYXJlIHR3byBkYXRhdHlwZXMsIGRlcXVlIGFuZCBkZWZhdWx0ZGljdC4KLUZ1dHVyZSBhZGRpdGlvbnMgbWF5IGluY2x1ZGUgQi10cmVlcyBhbmQgRmlib25hY2NpIGhlYXBzLgorRnV0dXJlIGFkZGl0aW9ucyBtYXkgaW5jbHVkZSBiYWxhbmNlZCB0cmVlcyBhbmQgb3JkZXJlZCBkaWN0aW9uYXJpZXMuCiBcdmVyc2lvbmNoYW5nZWRbQWRkZWQgZGVmYXVsdGRpY3RdezIuNX0KIAorXHN1YnNlY3Rpb257XGNsYXNze2RlcXVlfSBvYmplY3RzIFxsYWJlbHtkZXF1ZS1vYmplY3RzfX0KKwogXGJlZ2lue2Z1bmNkZXNjfXtkZXF1ZX17XG9wdGlvbmFse2l0ZXJhYmxlfX0KICAgUmV0dXJucyBhIG5ldyBkZXF1ZSBvYmplY3RlZCBpbml0aWFsaXplZCBsZWZ0LXRvLXJpZ2h0ICh1c2luZwogICBcbWV0aG9ke2FwcGVuZCgpfSkgd2l0aCBkYXRhIGZyb20gXHZhcntpdGVyYWJsZX0uICBJZiBcdmFye2l0ZXJhYmxlfQpAQCAtMTM3LDcgKzEzOSw3IEBACiBkZXF1ZShbJ2MnLCAnYicsICdhJ10pCiBcZW5ke3ZlcmJhdGltfQogCi1cc3Vic2VjdGlvbntSZWNpcGVzIFxsYWJlbHtkZXF1ZS1yZWNpcGVzfX0KK1xzdWJzdWJzZWN0aW9ue1JlY2lwZXMgXGxhYmVse2RlcXVlLXJlY2lwZXN9fQogCiBUaGlzIHNlY3Rpb24gc2hvd3MgdmFyaW91cyBhcHByb2FjaGVzIHRvIHdvcmtpbmcgd2l0aCBkZXF1ZXMuCiAKQEAgLTIxNSw2ICsyMTcsOCBAQAogCiAKIAorXHN1YnNlY3Rpb257XGNsYXNze2RlZmF1bHRkaWN0fSBvYmplY3RzIFxsYWJlbHtkZWZhdWx0ZGljdC1vYmplY3RzfX0KKwogXGJlZ2lue2Z1bmNkZXNjfXtkZWZhdWx0ZGljdH17XG9wdGlvbmFse2RlZmF1bHRfZmFjdG9yeVxvcHRpb25hbHssIC4uLn19fQogICBSZXR1cm5zIGEgbmV3IGRpY3Rpb25hcnktbGlrZSBvYmplY3QuICBcY2xhc3N7ZGVmYXVsdGRpY3R9IGlzIGEgc3ViY2xhc3MKICAgb2YgdGhlIGJ1aWx0aW4gXGNsYXNze2RpY3R9IGNsYXNzLiAgSXQgb3ZlcnJpZGVzIG9uZSBtZXRob2QgYW5kIGFkZHMgb25lCkBAIC0yNTUsMyArMjU5LDc5IEBACiAgIGZyb20gdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3RvciwgaWYgcHJlc2VudCwgb3IgdG8gXGNvZGV7Tm9uZX0sIAogICBpZiBhYnNlbnQuCiBcZW5ke2RhdGFkZXNjfQorCisKK1xzdWJzdWJzZWN0aW9ue1xjbGFzc3tkZWZhdWx0ZGljdH0gRXhhbXBsZXMgXGxhYmVse2RlZmF1bHRkaWN0LWV4YW1wbGVzfX0KKworVXNpbmcgXGNsYXNze2xpc3R9IGFzIHRoZSBcbWVtYmVye2RlZmF1bHRfZmFjdG9yeX0sIGl0IGlzIGVhc3kgdG8gZ3JvdXAKK2Egc2VxdWVuY2Ugb2Yga2V5LXZhbHVlIHBhaXJzIGludG8gYSBkaWN0aW9uYXJ5IG9mIGxpc3RzOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gcyA9IFsoJ3llbGxvdycsIDEpLCAoJ2JsdWUnLCAyKSwgKCd5ZWxsb3cnLCAzKSwgKCdibHVlJywgNCksICgncmVkJywgMSldCis+Pj4gZCA9IGRlZmF1bHRkaWN0KGxpc3QpCis+Pj4gZm9yIGssIHYgaW4gczoKKyAgICAgICAgZFtrXS5hcHBlbmQodikKKworPj4+IGQuaXRlbXMoKQorWygnYmx1ZScsIFsyLCA0XSksICgncmVkJywgWzFdKSwgKCd5ZWxsb3cnLCBbMSwgM10pXQorXGVuZHt2ZXJiYXRpbX0KKworV2hlbiBlYWNoIGtleSBpcyBlbmNvdW50ZXJlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIGl0IGlzIG5vdCBhbHJlYWR5IGluIHRoZQorbWFwcGluZzsgc28gYW4gZW50cnkgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHVzaW5nIHRoZQorXG1lbWJlcntkZWZhdWx0X2ZhY3Rvcnl9IGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gZW1wdHkgXGNsYXNze2xpc3R9LiAgVGhlCitcbWV0aG9ke2xpc3QuYXBwZW5kKCl9IG9wZXJhdGlvbiB0aGVuIGF0dGFjaGVzIHRoZSB2YWx1ZSB0byB0aGUgbmV3IGxpc3QuICBXaGVuCitrZXlzIGFyZSBlbmNvdW50ZXJlZCBhZ2FpbiwgdGhlIGxvb2stdXAgcHJvY2VlZHMgbm9ybWFsbHkgKHJldHVybmluZyB0aGUgbGlzdAorZm9yIHRoYXQga2V5KSBhbmQgdGhlIFxtZXRob2R7bGlzdC5hcHBlbmQoKX0gb3BlcmF0aW9uIGFkZHMgYW5vdGhlciB2YWx1ZSB0bwordGhlIGxpc3QuIFRoaXMgdGVjaG5pcXVlIGlzIHNpbXBsZXIgYW5kIGZhc3RlciB0aGFuIGFuIGVxdWl2YWxlbnQgdGVjaG5pcXVlCit1c2luZyBcbWV0aG9ke2RpY3Quc2V0ZGVmYXVsdCgpfToKKworXGJlZ2lue3ZlcmJhdGltfQorPj4+IGQgPSB7fQorPj4+IGZvciBrLCB2IGluIHM6CisJZC5zZXRkZWZhdWx0KGssIFtdKS5hcHBlbmQodikKKworPj4+IGQuaXRlbXMoKQorWygnYmx1ZScsIFsyLCA0XSksICgncmVkJywgWzFdKSwgKCd5ZWxsb3cnLCBbMSwgM10pXQorXGVuZHt2ZXJiYXRpbX0KKworU2V0dGluZyB0aGUgXG1lbWJlcntkZWZhdWx0X2ZhY3Rvcnl9IHRvIFxjbGFzc3tpbnR9IG1ha2VzIHRoZQorXGNsYXNze2RlZmF1bHRkaWN0fSB1c2VmdWwgZm9yIGNvdW50aW5nIChsaWtlIGEgYmFnIG9yIG11bHRpc2V0IGluIG90aGVyCitsYW5ndWFnZXMpOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gcyA9ICdtaXNzaXNzaXBwaScKKz4+PiBkID0gZGVmYXVsdGRpY3QoaW50KQorPj4+IGZvciBrIGluIHM6CisgICAgICAgIGRba10gKz0gMQorCis+Pj4gZC5pdGVtcygpCitbKCdpJywgNCksICgncCcsIDIpLCAoJ3MnLCA0KSwgKCdtJywgMSldCitcZW5ke3ZlcmJhdGltfQorCitXaGVuIGEgbGV0dGVyIGlzIGZpcnN0IGVuY291bnRlcmVkLCBpdCBpcyBtaXNzaW5nIGZyb20gdGhlIG1hcHBpbmcsIHNvIHRoZQorXG1lbWJlcntkZWZhdWx0X2ZhY3Rvcnl9IGZ1bmN0aW9uIGNhbGxzIFxmdW5jdGlvbntpbnQoKX0gdG8gc3VwcGx5IGEgZGVmYXVsdAorY291bnQgb2YgemVyby4gIFRoZSBpbmNyZW1lbnQgb3BlcmF0aW9uIHRoZW4gYnVpbGRzIHVwIHRoZSBjb3VudCBmb3IgZWFjaAorbGV0dGVyLiBUaGlzIHRlY2huaXF1ZSBtYWtlcyBjb3VudGluZyBzaW1wbGVyIGFuZCBmYXN0ZXIgdGhhbiBhbiBlcXVpdmFsZW50Cit0ZWNobmlxdWUgdXNpbmcgXG1ldGhvZHtkaWN0LmdldCgpfToKKworXGJlZ2lue3ZlcmJhdGltfQorPj4+IGQgPSB7fQorPj4+IGZvciBrIGluIHM6CisJZFtrXSA9IGQuZ2V0KGssIDApICsgMQorCis+Pj4gZC5pdGVtcygpCitbKCdpJywgNCksICgncCcsIDIpLCAoJ3MnLCA0KSwgKCdtJywgMSldCitcZW5ke3ZlcmJhdGltfQorCitTZXR0aW5nIHRoZSBcbWVtYmVye2RlZmF1bHRfZmFjdG9yeX0gdG8gXGNsYXNze3NldH0gbWFrZXMgdGhlCitcY2xhc3N7ZGVmYXVsdGRpY3R9IHVzZWZ1bCBmb3IgYnVpbGRpbmcgYSBkaWN0aW9uYXJ5IG9mIHNldHM6CisKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBzID0gWygncmVkJywgMSksICgnYmx1ZScsIDIpLCAoJ3JlZCcsIDMpLCAoJ2JsdWUnLCA0KSwgKCdyZWQnLCAxKSwgKCdibHVlJywgNCldCis+Pj4gZCA9IGRlZmF1bHRkaWN0KHNldCkKKz4+PiBmb3IgaywgdiBpbiBzOgorICAgICAgICBkW2tdLmFkZCh2KQorCis+Pj4gZC5pdGVtcygpCitbKCdibHVlJywgc2V0KFsyLCA0XSkpLCAoJ3JlZCcsIHNldChbMSwgM10pKV0KK1xlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvbnRleHRsaWIudGV4IGIvRG9jL2xpYi9saWJjb250ZXh0bGliLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmY5Y2RkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9saWJjb250ZXh0bGliLnRleApAQCAtMCwwICsxLDE0NCBAQAorXHNlY3Rpb257XG1vZHVsZXtjb250ZXh0bGlifSAtLS0KKyAgICAgICAgIFV0aWxpdGllcyBmb3IgXGtleXdvcmR7d2l0aH0tc3RhdGVtZW50IGNvbnRleHRzLn0KKworXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2NvbnRleHRsaWJ9CitcbW9kdWxlc3lub3BzaXN7VXRpbGl0aWVzIGZvciBca2V5d29yZHt3aXRofS1zdGF0ZW1lbnQgY29udGV4dHMufQorCitcdmVyc2lvbmFkZGVkezIuNX0KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBjb21tb24gdGFza3MgaW52b2x2aW5nIHRoZQorXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LgorCitGdW5jdGlvbnMgcHJvdmlkZWQ6CisKK1xiZWdpbntmdW5jZGVzY317Y29udGV4dG1hbmFnZXJ9e2Z1bmN9CitUaGlzIGZ1bmN0aW9uIGlzIGEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGNvbnRleHQgbWFuYWdlcnMKK2ZvciB1c2Ugd2l0aCB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LCB3aXRob3V0IG5lZWRpbmcgdG8gY3JlYXRlIGEKK2NsYXNzIG9yIHNlcGFyYXRlIFxtZXRob2R7X19lbnRlcl9fKCl9IGFuZCBcbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZHMuCisKK0Egc2ltcGxlIGV4YW1wbGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKKworQGNvbnRleHRtYW5hZ2VyCitkZWYgdGFnKG5hbWUpOgorICAgIHByaW50ICI8JXM+IiAlIG5hbWUKKyAgICB5aWVsZAorICAgIHByaW50ICI8LyVzPiIgJSBuYW1lCisKKz4+PiB3aXRoIHRhZygiaDEiKToKKy4uLiAgICBwcmludCAiZm9vIgorLi4uCis8aDE+Citmb28KKzwvaDE+CitcZW5ke3ZlcmJhdGltfQorCitXaGVuIGNhbGxlZCwgdGhlIGRlY29yYXRlZCBmdW5jdGlvbiBtdXN0IHJldHVybiBhIGdlbmVyYXRvci1pdGVyYXRvci4KK1RoaXMgaXRlcmF0b3IgbXVzdCB5aWVsZCBleGFjdGx5IG9uZSB2YWx1ZSwgd2hpY2ggd2lsbCBiZSBib3VuZCB0byB0aGUKK3RhcmdldHMgaW4gdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCdzIFxrZXl3b3Jke2FzfSBjbGF1c2UsIGlmIGFueS4KKworQXQgdGhlIHBvaW50IHdoZXJlIHRoZSBnZW5lcmF0b3IgeWllbGRzLCB0aGUgYmxvY2sgbmVzdGVkIGluIHRoZQorXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IGlzIGV4ZWN1dGVkLiAgVGhlIGdlbmVyYXRvciBpcyB0aGVuIHJlc3VtZWQKK2FmdGVyIHRoZSBibG9jayBpcyBleGl0ZWQuICBJZiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUKK2Jsb2NrLCBpdCBpcyByZXJhaXNlZCBpbnNpZGUgdGhlIGdlbmVyYXRvciBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIHlpZWxkCitvY2N1cnJlZC4gIFRodXMsIHlvdSBjYW4gdXNlIGEKK1xrZXl3b3Jke3RyeX0uLi5ca2V5d29yZHtleGNlcHR9Li4uXGtleXdvcmR7ZmluYWxseX0gc3RhdGVtZW50IHRvIHRyYXAKK3RoZSBlcnJvciAoaWYgYW55KSwgb3IgZW5zdXJlIHRoYXQgc29tZSBjbGVhbnVwIHRha2VzIHBsYWNlLgorCitOb3RlIHRoYXQgeW91IGNhbiB1c2UgXGNvZGV7QGNvbnRleHRtYW5hZ2VyfSB0byBkZWZpbmUgYSBjb250ZXh0CittYW5hZ2VyJ3MgXG1ldGhvZHtfX2NvbnRleHRfX30gbWV0aG9kLiAgVGhpcyBpcyB1c3VhbGx5IG1vcmUgY29udmVuaWVudAordGhhbiBjcmVhdGluZyBhbm90aGVyIGNsYXNzIGp1c3QgdG8gc2VydmUgYXMgYSBjb250ZXh0LiAgRm9yIGV4YW1wbGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKKworY2xhc3MgVGFnOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICAKKyAgICBAY29udGV4dG1hbmFnZXIKKyAgICBkZWYgX19jb250ZXh0X18oc2VsZik6CisgICAgICAgIHByaW50ICI8JXM+IiAlIHNlbGYubmFtZQorICAgICAgICB5aWVsZCBzZWxmCisgICAgICAgIHByaW50ICI8LyVzPiIgJSBzZWxmLm5hbWUKKyAgICAgICAgCitoMSA9IFRhZygiaDEiKQorCis+Pj4gd2l0aCBoMSBhcyBtZToKKy4uLiAgICAgcHJpbnQgImhlbGxvIGZyb20iLCBtZQorPGgxPgoraGVsbG8gZnJvbSA8X19tYWluX18uVGFnIGluc3RhbmNlIGF0IDB4NDAyY2U4ZWM+Cis8L2gxPgorXGVuZHt2ZXJiYXRpbX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317bmVzdGVkfXtjdHgxXG9wdGlvbmFseywgY3R4MlxvcHRpb25hbHssIC4uLn19fQorQ29tYmluZSBtdWx0aXBsZSBjb250ZXh0IG1hbmFnZXJzIGludG8gYSBzaW5nbGUgbmVzdGVkIGNvbnRleHQgbWFuYWdlci4KKworQ29kZSBsaWtlIHRoaXM6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgbmVzdGVkCisKK3dpdGggbmVzdGVkKEEsIEIsIEMpIGFzIChYLCBZLCBaKToKKyAgICBkb19zb21ldGhpbmcoKQorXGVuZHt2ZXJiYXRpbX0KKworaXMgZXF1aXZhbGVudCB0byB0aGlzOgorCitcYmVnaW57dmVyYmF0aW19Cit3aXRoIEEgYXMgWDoKKyAgICB3aXRoIEIgYXMgWToKKyAgICAgICAgd2l0aCBDIGFzIFo6CisgICAgICAgICAgICBkb19zb21ldGhpbmcoKQorXGVuZHt2ZXJiYXRpbX0KKworTm90ZSB0aGF0IGlmIG9uZSBvZiB0aGUgbmVzdGVkIGNvbnRleHRzJyBcbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZAorcmFpc2VzIGFuIGV4Y2VwdGlvbiwgYW55IHByZXZpb3VzIGV4Y2VwdGlvbiBzdGF0ZSB3aWxsIGJlIGxvc3Q7IHRoZSBuZXcKK2V4Y2VwdGlvbiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgb3V0ZXIgY29udGV4dHMnIFxtZXRob2R7X19leGl0X18oKX0KK21ldGhvZChzKSwgaWYgYW55LiAgSW4gZ2VuZXJhbCwgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2RzIHNob3VsZCBhdm9pZAorcmFpc2luZyBleGNlcHRpb25zLCBhbmQgaW4gcGFydGljdWxhciB0aGV5IHNob3VsZCBub3QgcmUtcmFpc2UgYQorcGFzc2VkLWluIGV4Y2VwdGlvbi4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xsYWJlbHtjb250ZXh0LWNsb3Npbmd9CitcYmVnaW57ZnVuY2Rlc2N9e2Nsb3Npbmd9e3RoaW5nfQorUmV0dXJuIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgY2xvc2VzIFx2YXJ7dGhpbmd9IHVwb24gY29tcGxldGlvbiBvZiB0aGUKK2Jsb2NrLiAgVGhpcyBpcyBiYXNpY2FsbHkgZXF1aXZhbGVudCB0bzoKKworXGJlZ2lue3ZlcmJhdGltfQorZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgorCitAY29udGV4dG1hbmFnZXIKK2RlZiBjbG9zaW5nKHRoaW5nKToKKyAgICB0cnk6CisgICAgICAgIHlpZWxkIHRoaW5nCisgICAgZmluYWxseToKKyAgICAgICAgdGhpbmcuY2xvc2UoKQorXGVuZHt2ZXJiYXRpbX0KKworQW5kIGxldHMgeW91IHdyaXRlIGNvZGUgbGlrZSB0aGlzOgorXGJlZ2lue3ZlcmJhdGltfQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorZnJvbSBjb250ZXh0bGliIGltcG9ydCBjbG9zaW5nCitpbXBvcnQgY29kZWNzCisKK3dpdGggY2xvc2luZyhjb2RlY3Mub3BlbigiZm9vIiwgZW5jb2Rpbmc9InV0ZjgiKSkgYXMgZjoKKyAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICBwcmludCBsaW5lLmVuY29kZSgibGF0aW4xIikKK1xlbmR7dmVyYmF0aW19CisKK3dpdGhvdXQgbmVlZGluZyB0byBleHBsaWNpdGx5IGNsb3NlIFxjb2Rle2Z9LiAgRXZlbiBpZiBhbiBlcnJvciBvY2N1cnMsCitcY29kZXtmLmNsb3NlKCl9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIFxrZXl3b3Jke3dpdGh9IGJsb2NrIGlzIGV4aXRlZC4KKworXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue3NlZWFsc299CisgIFxzZWVwZXB7MDM0M317VGhlICJ3aXRoIiBzdGF0ZW1lbnR9CisgICAgICAgICB7VGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlCisgICAgICAgICAgUHl0aG9uIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudC59CitcZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvb2tpZWxpYi50ZXggYi9Eb2MvbGliL2xpYmNvb2tpZWxpYi50ZXgKaW5kZXggYTM1Zjk3ZC4uZWYyZDgzMyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJjb29raWVsaWIudGV4CisrKyBiL0RvYy9saWIvbGliY29va2llbGliLnRleApAQCAtMjQ5LDcgKzI0OSw3IEBACiAgICAgaWdub3JlX2Rpc2NhcmQ9XGNvbnN0YW50e0ZhbHNlfSwgaWdub3JlX2V4cGlyZXM9XGNvbnN0YW50e0ZhbHNlfX0KIFNhdmUgY29va2llcyB0byBhIGZpbGUuCiAKLVRoaXMgYmFzZSBjbGFzcyByYWlzZXMgXGNsYXNze05vdEltcGxlbWVudGVkRXJyb3J9LiAgU3ViY2xhc3NlcyBtYXkKK1RoaXMgYmFzZSBjbGFzcyByYWlzZXMgXGV4Y2VwdGlvbntOb3RJbXBsZW1lbnRlZEVycm9yfS4gIFN1YmNsYXNzZXMgbWF5CiBsZWF2ZSB0aGlzIG1ldGhvZCB1bmltcGxlbWVudGVkLgogCiBcdmFye2ZpbGVuYW1lfSBpcyB0aGUgbmFtZSBvZiBmaWxlIGluIHdoaWNoIHRvIHNhdmUgY29va2llcy4gIElmCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNzdi50ZXggYi9Eb2MvbGliL2xpYmNzdi50ZXgKaW5kZXggYmEwZGY0Zi4uNjUwNTNjNyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJjc3YudGV4CisrKyBiL0RvYy9saWIvbGliY3N2LnRleApAQCAtMzMsOCArMzMsOSBAQAogXGJlZ2lue25vdGljZX0KICAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBcbW9kdWxle2Nzdn0gbW9kdWxlIGRvZXNuJ3Qgc3VwcG9ydCBVbmljb2RlCiAgIGlucHV0LiAgQWxzbywgdGhlcmUgYXJlIGN1cnJlbnRseSBzb21lIGlzc3VlcyByZWdhcmRpbmcgXEFTQ0lJe30gTlVMCi0gIGNoYXJhY3RlcnMuICBBY2NvcmRpbmdseSwgYWxsIGlucHV0IHNob3VsZCBnZW5lcmFsbHkgYmUgcHJpbnRhYmxlCi0gIFxBU0NJSXt9IHRvIGJlIHNhZmUuICBUaGVzZSByZXN0cmljdGlvbnMgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisgIGNoYXJhY3RlcnMuICBBY2NvcmRpbmdseSwgYWxsIGlucHV0IHNob3VsZCBiZSBVVEYtOCBvciBwcmludGFibGUKKyAgXEFTQ0lJe30gdG8gYmUgc2FmZTsgc2VlIHRoZSBleGFtcGxlcyBpbiBzZWN0aW9uflxyZWZ7Y3N2LWV4YW1wbGVzfS4KKyAgVGhlc2UgcmVzdHJpY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgogXGVuZHtub3RpY2V9CiAKIFxiZWdpbntzZWVhbHNvfQpAQCAtMzY1LDcgKzM2Niw3IEBACiAKIAogCi1cc3Vic2VjdGlvbntFeGFtcGxlc30KK1xzdWJzZWN0aW9ue0V4YW1wbGVzXGxhYmVse2Nzdi1leGFtcGxlc319CiAKIFRoZSBzaW1wbGVzdCBleGFtcGxlIG9mIHJlYWRpbmcgYSBDU1YgZmlsZToKIApAQCAtNDI2LDM3ICs0MjcsOTkgQEAKIFxlbmR7dmVyYmF0aW19CiAKIFRoZSBcbW9kdWxle2Nzdn0gbW9kdWxlIGRvZXNuJ3QgZGlyZWN0bHkgc3VwcG9ydCByZWFkaW5nIGFuZCB3cml0aW5nCi1Vbmljb2RlLCBidXQgaXQgaXMgOC1iaXQgY2xlYW4gc2F2ZSBmb3Igc29tZSBwcm9ibGVtcyB3aXRoIFxBU0NJSXt9IE5VTAotY2hhcmFjdGVycywgc28geW91IGNhbiB3cml0ZSBjbGFzc2VzIHRoYXQgaGFuZGxlIHRoZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKLWZvciB5b3UgYXMgbG9uZyBhcyB5b3UgYXZvaWQgZW5jb2RpbmdzIGxpa2UgdXRmLTE2IHRoYXQgdXNlIE5VTHM6CitVbmljb2RlLCBidXQgaXQgaXMgOC1iaXQtY2xlYW4gc2F2ZSBmb3Igc29tZSBwcm9ibGVtcyB3aXRoIFxBU0NJSXt9IE5VTAorY2hhcmFjdGVycy4gIFNvIHlvdSBjYW4gd3JpdGUgZnVuY3Rpb25zIG9yIGNsYXNzZXMgdGhhdCBoYW5kbGUgdGhlCitlbmNvZGluZyBhbmQgZGVjb2RpbmcgZm9yIHlvdSBhcyBsb25nIGFzIHlvdSBhdm9pZCBlbmNvZGluZ3MgbGlrZQorVVRGLTE2IHRoYXQgdXNlIE5VTHMuICBVVEYtOCBpcyByZWNvbW1lbmRlZC4KKworXGZ1bmN0aW9ue3VuaWNvZGVfY3N2X3JlYWRlcn0gYmVsb3cgaXMgYSBnZW5lcmF0b3IgdGhhdCB3cmFwcworXGNsYXNze2Nzdi5yZWFkZXJ9IHRvIGhhbmRsZSBVbmljb2RlIENTViBkYXRhIChhIGxpc3Qgb2YgVW5pY29kZQorc3RyaW5ncykuICBcZnVuY3Rpb257dXRmXzhfZW5jb2Rlcn0gaXMgYSBnZW5lcmF0b3IgdGhhdCBlbmNvZGVzIHRoZQorVW5pY29kZSBzdHJpbmdzIGFzIFVURi04LCBvbmUgc3RyaW5nIChvciByb3cpIGF0IGEgdGltZS4gIFRoZSBlbmNvZGVkCitzdHJpbmdzIGFyZSBwYXJzZWQgYnkgdGhlIENTViByZWFkZXIsIGFuZAorXGZ1bmN0aW9ue3VuaWNvZGVfY3N2X3JlYWRlcn0gZGVjb2RlcyB0aGUgVVRGLTgtZW5jb2RlZCBjZWxscyBiYWNrCitpbnRvIFVuaWNvZGU6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KIGltcG9ydCBjc3YKIAorZGVmIHVuaWNvZGVfY3N2X3JlYWRlcih1bmljb2RlX2Nzdl9kYXRhLCBkaWFsZWN0PWNzdi5leGNlbCwgKiprd2FyZ3MpOgorICAgICMgY3N2LnB5IGRvZXNuJ3QgZG8gVW5pY29kZTsgZW5jb2RlIHRlbXBvcmFyaWx5IGFzIFVURi04OgorICAgIGNzdl9yZWFkZXIgPSBjc3YucmVhZGVyKHV0Zl84X2VuY29kZXIodW5pY29kZV9jc3ZfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdD1kaWFsZWN0LCAqKmt3YXJncykKKyAgICBmb3Igcm93IGluIGNzdl9yZWFkZXI6CisgICAgICAgICMgZGVjb2RlIFVURi04IGJhY2sgdG8gVW5pY29kZSwgY2VsbCBieSBjZWxsOgorICAgICAgICB5aWVsZCBbdW5pY29kZShjZWxsLCAndXRmLTgnKSBmb3IgY2VsbCBpbiByb3ddCisKK2RlZiB1dGZfOF9lbmNvZGVyKHVuaWNvZGVfY3N2X2RhdGEpOgorICAgIGZvciBsaW5lIGluIHVuaWNvZGVfY3N2X2RhdGE6CisgICAgICAgIHlpZWxkIGxpbmUuZW5jb2RlKCd1dGYtOCcpCitcZW5ke3ZlcmJhdGltfQorCitGb3IgYWxsIG90aGVyIGVuY29kaW5ncyB0aGUgZm9sbG93aW5nIFxjbGFzc3tVbmljb2RlUmVhZGVyfSBhbmQKK1xjbGFzc3tVbmljb2RlV3JpdGVyfSBjbGFzc2VzIGNhbiBiZSB1c2VkLiBUaGV5IHRha2UgYW4gYWRkaXRpb25hbAorXHZhcntlbmNvZGluZ30gcGFyYW1ldGVyIGluIHRoZWlyIGNvbnN0cnVjdG9yIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgZGF0YQorcGFzc2VzIHRoZSByZWFsIHJlYWRlciBvciB3cml0ZXIgZW5jb2RlZCBhcyBVVEYtODoKKworXGJlZ2lue3ZlcmJhdGltfQoraW1wb3J0IGNzdiwgY29kZWNzLCBjU3RyaW5nSU8KKworY2xhc3MgVVRGOFJlY29kZXI6CisgICAgIiIiCisgICAgSXRlcmF0b3IgdGhhdCByZWFkcyBhbiBlbmNvZGVkIHN0cmVhbSBhbmQgcmVlbmNvZGVzIHRoZSBpbnB1dCB0byBVVEYtOAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmLCBlbmNvZGluZyk6CisgICAgICAgIHNlbGYucmVhZGVyID0gY29kZWNzLmdldHJlYWRlcihlbmNvZGluZykoZikKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkZXIubmV4dCgpLmVuY29kZSgidXRmLTgiKQorCiBjbGFzcyBVbmljb2RlUmVhZGVyOgorICAgICIiIgorICAgIEEgQ1NWIHJlYWRlciB3aGljaCB3aWxsIGl0ZXJhdGUgb3ZlciBsaW5lcyBpbiB0aGUgQ1NWIGZpbGUgImYiLAorICAgIHdoaWNoIGlzIGVuY29kZWQgaW4gdGhlIGdpdmVuIGVuY29kaW5nLgorICAgICIiIgorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYsIGRpYWxlY3Q9Y3N2LmV4Y2VsLCBlbmNvZGluZz0idXRmLTgiLCAqKmt3ZHMpOgorICAgICAgICBmID0gVVRGOFJlY29kZXIoZiwgZW5jb2RpbmcpCiAgICAgICAgIHNlbGYucmVhZGVyID0gY3N2LnJlYWRlcihmLCBkaWFsZWN0PWRpYWxlY3QsICoqa3dkcykKLSAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCiAKICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgcm93ID0gc2VsZi5yZWFkZXIubmV4dCgpCi0gICAgICAgIHJldHVybiBbdW5pY29kZShzLCBzZWxmLmVuY29kaW5nKSBmb3IgcyBpbiByb3ddCisgICAgICAgIHJldHVybiBbdW5pY29kZShzLCAidXRmLTgiKSBmb3IgcyBpbiByb3ddCiAKICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmCiAKIGNsYXNzIFVuaWNvZGVXcml0ZXI6CisgICAgIiIiCisgICAgQSBDU1Ygd3JpdGVyIHdoaWNoIHdpbGwgd3JpdGUgcm93cyB0byBDU1YgZmlsZSAiZiIsCisgICAgd2hpY2ggaXMgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZW5jb2RpbmcuCisgICAgIiIiCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgZiwgZGlhbGVjdD1jc3YuZXhjZWwsIGVuY29kaW5nPSJ1dGYtOCIsICoqa3dkcyk6Ci0gICAgICAgIHNlbGYud3JpdGVyID0gY3N2LndyaXRlcihmLCBkaWFsZWN0PWRpYWxlY3QsICoqa3dkcykKLSAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgICMgUmVkaXJlY3Qgb3V0cHV0IHRvIGEgcXVldWUKKyAgICAgICAgc2VsZi5xdWV1ZSA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHNlbGYud3JpdGVyID0gY3N2LndyaXRlcihzZWxmLnF1ZXVlLCBkaWFsZWN0PWRpYWxlY3QsICoqa3dkcykKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBmCisgICAgICAgIHNlbGYuZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoZW5jb2RpbmcpKCkKIAogICAgIGRlZiB3cml0ZXJvdyhzZWxmLCByb3cpOgotICAgICAgICBzZWxmLndyaXRlci53cml0ZXJvdyhbcy5lbmNvZGUoc2VsZi5lbmNvZGluZykgZm9yIHMgaW4gcm93XSkKKyAgICAgICAgc2VsZi53cml0ZXIud3JpdGVyb3coW3MuZW5jb2RlKCJ1dGYtOCIpIGZvciBzIGluIHJvd10pCisgICAgICAgICMgRmV0Y2ggVVRGLTggb3V0cHV0IGZyb20gdGhlIHF1ZXVlIC4uLgorICAgICAgICBkYXRhID0gc2VsZi5xdWV1ZS5nZXR2YWx1ZSgpCisgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZSgidXRmLTgiKQorICAgICAgICAjIC4uLiBhbmQgcmVlbmNvZGUgaXQgaW50byB0aGUgdGFyZ2V0IGVuY29kaW5nCisgICAgICAgIGRhdGEgPSBzZWxmLmVuY29kZXIuZW5jb2RlKGRhdGEpCisgICAgICAgICMgd3JpdGUgdG8gdGhlIHRhcmdldCBzdHJlYW0KKyAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgIyBlbXB0eSBxdWV1ZQorICAgICAgICBzZWxmLnF1ZXVlLnRydW5jYXRlKDApCiAKICAgICBkZWYgd3JpdGVyb3dzKHNlbGYsIHJvd3MpOgogICAgICAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgICAgICBzZWxmLndyaXRlcm93KHJvdykKIFxlbmR7dmVyYmF0aW19Ci0KLVRoZXkgc2hvdWxkIHdvcmsganVzdCBsaWtlIHRoZSBcY2xhc3N7Y3N2LnJlYWRlcn0gYW5kIFxjbGFzc3tjc3Yud3JpdGVyfQotY2xhc3NlcyBidXQgYWRkIGFuIFx2YXJ7ZW5jb2Rpbmd9IHBhcmFtZXRlci4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZGF0ZXRpbWUudGV4IGIvRG9jL2xpYi9saWJkYXRldGltZS50ZXgKaW5kZXggNGJiYTU1My4uY2FlNWQ2MCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJkYXRldGltZS50ZXgKKysrIGIvRG9jL2xpYi9saWJkYXRldGltZS50ZXgKQEAgLTUwNCw3ICs1MDQsNyBAQAogICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRlLCBjb250cm9sbGVkIGJ5IGFuIGV4cGxpY2l0CiAgIGZvcm1hdCBzdHJpbmcuICBGb3JtYXQgY29kZXMgcmVmZXJyaW5nIHRvIGhvdXJzLCBtaW51dGVzIG9yIHNlY29uZHMKICAgd2lsbCBzZWUgMCB2YWx1ZXMuCi0gIFNlZSB0aGUgc2VjdGlvbiBvbiBcbWV0aG9ke3N0cmZ0aW1lKCl9IGJlaGF2aW9yLgorICBTZWUgc2VjdGlvbn5ccmVme3N0cmZ0aW1lLWJlaGF2aW9yfSAtLSBcbWV0aG9ke3N0cmZ0aW1lKCl9IGJlaGF2aW9yLgogXGVuZHttZXRob2RkZXNjfQogCiAKQEAgLTk3MCw4ICs5NzAsOCBAQAogCiBcYmVnaW57bWV0aG9kZGVzY317c3RyZnRpbWV9e2Zvcm1hdH0KICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGF0ZSBhbmQgdGltZSwgY29udHJvbGxlZCBieSBhbgotICBleHBsaWNpdCBmb3JtYXQgc3RyaW5nLiAgU2VlIHRoZSBzZWN0aW9uIG9uIFxtZXRob2R7c3RyZnRpbWUoKX0KLSAgYmVoYXZpb3IuCisgIGV4cGxpY2l0IGZvcm1hdCBzdHJpbmcuICBTZWUgc2VjdGlvbn5ccmVme3N0cmZ0aW1lLWJlaGF2aW9yfSAtLQorICBcbWV0aG9ke3N0cmZ0aW1lKCl9IGJlaGF2aW9yLgogXGVuZHttZXRob2RkZXNjfQogCiAKQEAgLTExMDAsNyArMTEwMCw4IEBACiAKIFxiZWdpbnttZXRob2RkZXNjfXtzdHJmdGltZX17Zm9ybWF0fQogICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0aW1lLCBjb250cm9sbGVkIGJ5IGFuIGV4cGxpY2l0Ci0gIGZvcm1hdCBzdHJpbmcuICBTZWUgdGhlIHNlY3Rpb24gb24gXG1ldGhvZHtzdHJmdGltZSgpfSBiZWhhdmlvci4KKyAgZm9ybWF0IHN0cmluZy4gIFNlZSBzZWN0aW9uflxyZWZ7c3RyZnRpbWUtYmVoYXZpb3J9IC0tCisgIFxtZXRob2R7c3RyZnRpbWUoKX0gYmVoYXZpb3IuCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfXt1dGNvZmZzZXR9e30KQEAgLTEzNjgsNyArMTM2OSw3IEBACiAtNCBob3VycykpLgogCiAKLVxzdWJzZWN0aW9ue1xtZXRob2R7c3RyZnRpbWUoKX0gQmVoYXZpb3J9Citcc3Vic2VjdGlvbntcbWV0aG9ke3N0cmZ0aW1lKCl9IEJlaGF2aW9yXGxhYmVse3N0cmZ0aW1lLWJlaGF2aW9yfX0KIAogXGNsYXNze2RhdGV9LCBcY2xhc3N7ZGF0ZXRpbWV9LCBhbmQgXGNsYXNze3RpbWV9CiBvYmplY3RzIGFsbCBzdXBwb3J0IGEgXGNvZGV7c3RyZnRpbWUoXHZhcntmb3JtYXR9KX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZGVjaW1hbC50ZXggYi9Eb2MvbGliL2xpYmRlY2ltYWwudGV4CmluZGV4IDA5MmYwMzguLmZmYzMzNjMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliZGVjaW1hbC50ZXgKKysrIGIvRG9jL2xpYi9saWJkZWNpbWFsLnRleApAQCAtNDQyLDkgKzQ0MiwzMyBAQAogICBTZXQgdGhlIGN1cnJlbnQgY29udGV4dCBmb3IgdGhlIGFjdGl2ZSB0aHJlYWQgdG8gXHZhcntjfS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIFxlbmR7ZnVuY2Rlc2N9ICAKIAotTmV3IGNvbnRleHRzIGNhbiBmb3JtZWQgdXNpbmcgdGhlIFxjbGFzc3tDb250ZXh0fSBjb25zdHJ1Y3RvciBkZXNjcmliZWQgYmVsb3cuCi1JbiBhZGRpdGlvbiwgdGhlIG1vZHVsZSBwcm92aWRlcyB0aHJlZSBwcmUtbWFkZSBjb250ZXh0czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0JlZ2lubmluZyB3aXRoIFB5dGhvbiAyLjUsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudAordG8gdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSBhY3RpdmUgY29udGV4dC4gRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBjb2RlCitpbmNyZWFzZXMgdGhlIGN1cnJlbnQgZGVjaW1hbCBwcmVjaXNpb24gYnkgMiBwbGFjZXMsIHBlcmZvcm1zIGEKK2NhbGN1bGF0aW9uLCBhbmQgdGhlbiBhdXRvbWF0aWNhbGx5IHJlc3RvcmVzIHRoZSBwcmV2aW91cyBjb250ZXh0OgogCitcYmVnaW57dmVyYmF0aW19Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CitpbXBvcnQgZGVjaW1hbAorCit3aXRoIGRlY2ltYWwuZ2V0Y29udGV4dCgpIGFzIGN0eDoKKyAgICBjdHgucHJlYyArPSAyICAgIyBhZGQgMiBtb3JlIGRpZ2l0cyBvZiBwcmVjaXNpb24KKyAgICBjYWxjdWxhdGVfc29tZXRoaW5nKCkKK1xlbmR7dmVyYmF0aW19CisKK1RoZSBjb250ZXh0IHRoYXQncyBhY3RpdmUgaW4gdGhlIGJvZHkgb2YgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBpcworYSBcZW1waHtjb3B5fSBvZiB0aGUgY29udGV4dCB5b3UgcHJvdmlkZWQgdG8gdGhlIFxrZXl3b3Jke3dpdGh9CitzdGF0ZW1lbnQsIHNvIG1vZGlmeWluZyBpdHMgYXR0cmlidXRlcyBkb2Vzbid0IGFmZmVjdCBhbnl0aGluZyBleGNlcHQKK3RoYXQgdGVtcG9yYXJ5IGNvcHkuCisKK1lvdSBjYW4gdXNlIGFueSBkZWNpbWFsIGNvbnRleHQgaW4gYSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQsIGJ1dCBpZgoreW91IGp1c3Qgd2FudCB0byBtYWtlIGEgdGVtcG9yYXJ5IGNoYW5nZSB0byBzb21lIGFzcGVjdCBvZiB0aGUgY3VycmVudAorY29udGV4dCwgaXQncyBlYXNpZXN0IHRvIGp1c3QgdXNlIFxmdW5jdGlvbntnZXRjb250ZXh0KCl9IGFzIHNob3duCithYm92ZS4KKworTmV3IGNvbnRleHRzIGNhbiBhbHNvIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIFxjbGFzc3tDb250ZXh0fSBjb25zdHJ1Y3RvcgorZGVzY3JpYmVkIGJlbG93LiBJbiBhZGRpdGlvbiwgdGhlIG1vZHVsZSBwcm92aWRlcyB0aHJlZSBwcmUtbWFkZQorY29udGV4dHM6CiAKIFxiZWdpbntjbGFzc2Rlc2MqfXtCYXNpY0NvbnRleHR9CiAgIFRoaXMgaXMgYSBzdGFuZGFyZCBjb250ZXh0IGRlZmluZWQgYnkgdGhlIEdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmZ1bmNzLnRleCBiL0RvYy9saWIvbGliZnVuY3MudGV4CmluZGV4IDBiZTNhYTkuLmMwMzUyZDMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliZnVuY3MudGV4CisrKyBiL0RvYy9saWIvbGliZnVuY3MudGV4CkBAIC02LDcgKzYsNyBAQAogCiBcc2V0aW5kZXhzdWJpdGVteyhidWlsdC1pbiBmdW5jdGlvbil9CiAKLVxiZWdpbntmdW5jZGVzY317X19pbXBvcnRfX317bmFtZVxvcHRpb25hbHssIGdsb2JhbHNcb3B0aW9uYWx7LCBsb2NhbHNcb3B0aW9uYWx7LCBmcm9tbGlzdH19fX0KK1xiZWdpbntmdW5jZGVzY317X19pbXBvcnRfX317bmFtZVxvcHRpb25hbHssIGdsb2JhbHNcb3B0aW9uYWx7LCBsb2NhbHNcb3B0aW9uYWx7LCBmcm9tbGlzdFxvcHRpb25hbHssIGxldmVsfX19fX0KICAgVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGJ5IHRoZSBca2V5d29yZHtpbXBvcnR9XHN0aW5kZXh7aW1wb3J0fQogICBzdGF0ZW1lbnQuICBJdCBtYWlubHkgZXhpc3RzIHNvIHRoYXQgeW91IGNhbiByZXBsYWNlIGl0IHdpdGggYW5vdGhlcgogICBmdW5jdGlvbiB0aGF0IGhhcyBhIGNvbXBhdGlibGUgaW50ZXJmYWNlLCBpbiBvcmRlciB0byBjaGFuZ2UgdGhlCkBAIC0yMCw5ICsyMCw5IEBACiAKICAgRm9yIGV4YW1wbGUsIHRoZSBzdGF0ZW1lbnQgXHNhbXB7aW1wb3J0IHNwYW19IHJlc3VsdHMgaW4gdGhlCiAgIGZvbGxvd2luZyBjYWxsOiBcY29kZXtfX2ltcG9ydF9fKCdzcGFtJyx9IFxjb2Rle2dsb2JhbHMoKSx9Ci0gIFxjb2Rle2xvY2FscygpLCBbXSl9OyB0aGUgc3RhdGVtZW50IFxzYW1we2Zyb20gc3BhbS5oYW0gaW1wb3J0IGVnZ3N9CisgIFxjb2Rle2xvY2FscygpLCBbXSwgLTEpfTsgdGhlIHN0YXRlbWVudCBcc2FtcHtmcm9tIHNwYW0uaGFtIGltcG9ydCBlZ2dzfQogICByZXN1bHRzIGluIFxzYW1we19faW1wb3J0X18oJ3NwYW0uaGFtJywgZ2xvYmFscygpLCBsb2NhbHMoKSwKLSAgWydlZ2dzJ10pfS4gIE5vdGUgdGhhdCBldmVuIHRob3VnaCBcY29kZXtsb2NhbHMoKX0gYW5kCisgIFsnZWdncyddLCAtMSl9LiAgTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIFxjb2Rle2xvY2FscygpfSBhbmQKICAgXGNvZGV7WydlZ2dzJ119IGFyZSBwYXNzZWQgaW4gYXMgYXJndW1lbnRzLCB0aGUKICAgXGZ1bmN0aW9ue19faW1wb3J0X18oKX0gZnVuY3Rpb24gZG9lcyBub3Qgc2V0IHRoZSBsb2NhbCB2YXJpYWJsZQogICBuYW1lZCBcY29kZXtlZ2dzfTsgdGhpcyBpcyBkb25lIGJ5IHN1YnNlcXVlbnQgY29kZSB0aGF0IGlzIGdlbmVyYXRlZApAQCAtNTIsNiArNTIsMTUgQEAKICAgICAgICAgbW9kID0gZ2V0YXR0cihtb2QsIGNvbXApCiAgICAgcmV0dXJuIG1vZAogXGVuZHt2ZXJiYXRpbX0KKworICBcdmFye2xldmVsfSBzcGVjaWZpZXMgd2hldGhlciB0byB1c2UgYWJzb2x1dGUgb3IgcmVsYXRpdmUgaW1wb3J0cy4KKyAgVGhlIGRlZmF1bHQgaXMgXGNvZGV7LTF9IHdoaWNoIGluZGljYXRlcyBib3RoIGFic29sdXRlIGFuZCByZWxhdGl2ZQorICBpbXBvcnRzIHdpbGwgYmUgYXR0ZW1wdGVkLiAgXGNvZGV7MH0gbWVhbnMgb25seSBwZXJmb3JtIGFic29sdXRlIGltcG9ydHMuCisgIFBvc2l0aXZlIHZhbHVlcyBmb3IgXHZhcntsZXZlbH0gaW5kaWNhdGUgdGhlIG51bWJlciBvZiBwYXJlbnQgZGlyZWN0b3JpZXMKKyAgdG8gc2VhcmNoIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIG1vZHVsZSBjYWxsaW5nCisgIFxmdW5jdGlvbntfX2ltcG9ydF9ffS4KK1x2ZXJzaW9uY2hhbmdlZFtUaGUgbGV2ZWwgcGFyYW1ldGVyIHdhcyBhZGRlZF17Mi41fQorXHZlcnNpb25jaGFuZ2VkW0tleXdvcmQgc3VwcG9ydCBmb3IgcGFyYW1ldGVycyB3YXMgYWRkZWRdezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317YWJzfXt4fQpAQCAtNjgzLDcgKzY5Miw3IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e29iamVjdH17fQotICBSZXR1cm4gYSBuZXcgZmVhdHVyZWxlc3Mgb2JqZWN0LiAgXGZ1bmN0aW9ue29iamVjdCgpfSBpcyBhIGJhc2UKKyAgUmV0dXJuIGEgbmV3IGZlYXR1cmVsZXNzIG9iamVjdC4gIFxjbGFzc3tvYmplY3R9IGlzIGEgYmFzZQogICBmb3IgYWxsIG5ldyBzdHlsZSBjbGFzc2VzLiAgSXQgaGFzIHRoZSBtZXRob2RzIHRoYXQgYXJlIGNvbW1vbgogICB0byBhbGwgaW5zdGFuY2VzIG9mIG5ldyBzdHlsZSBjbGFzc2VzLgogICBcdmVyc2lvbmFkZGVkezIuMn0KQEAgLTcxOCw4ICs3MjcsMTEgQEAKIFxiZWdpbntmdW5jZGVzY317cG93fXt4LCB5XG9wdGlvbmFseywgen19CiAgIFJldHVybiBcdmFye3h9IHRvIHRoZSBwb3dlciBcdmFye3l9OyBpZiBcdmFye3p9IGlzIHByZXNlbnQsIHJldHVybgogICBcdmFye3h9IHRvIHRoZSBwb3dlciBcdmFye3l9LCBtb2R1bG8gXHZhcnt6fSAoY29tcHV0ZWQgbW9yZQotICBlZmZpY2llbnRseSB0aGFuIFxjb2Rle3BvdyhcdmFye3h9LCBcdmFye3l9KSBcJVwgXHZhcnt6fX0pLiAgVGhlCi0gIGFyZ3VtZW50cyBtdXN0IGhhdmUgbnVtZXJpYyB0eXBlcy4gIFdpdGggbWl4ZWQgb3BlcmFuZCB0eXBlcywgdGhlCisgIGVmZmljaWVudGx5IHRoYW4gXGNvZGV7cG93KFx2YXJ7eH0sIFx2YXJ7eX0pIFwlXCBcdmFye3p9fSkuCisgIFRoZSB0d28tYXJndW1lbnQgZm9ybSBcY29kZXtwb3coXHZhcnt4fSwgXHZhcnt5fSl9IGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcKKyAgdGhlIHBvd2VyIG9wZXJhdG9yOiBcY29kZXtcdmFye3h9KipcdmFye3l9fS4KKyAgCisgIFRoZSBhcmd1bWVudHMgbXVzdCBoYXZlIG51bWVyaWMgdHlwZXMuICBXaXRoIG1peGVkIG9wZXJhbmQgdHlwZXMsIHRoZQogICBjb2VyY2lvbiBydWxlcyBmb3IgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0b3JzIGFwcGx5LiAgRm9yIGludCBhbmQKICAgbG9uZyBpbnQgb3BlcmFuZHMsIHRoZSByZXN1bHQgaGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG9wZXJhbmRzCiAgIChhZnRlciBjb2VyY2lvbikgdW5sZXNzIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbmVnYXRpdmU7IGluIHRoYXQKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZ2MudGV4IGIvRG9jL2xpYi9saWJnYy50ZXgKaW5kZXggNTRjYTI2Yy4uMGQzNDA4YiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJnYy50ZXgKKysrIGIvRG9jL2xpYi9saWJnYy50ZXgKQEAgLTM1LDcgKzM1LDggQEAKIFxiZWdpbntmdW5jZGVzY317Y29sbGVjdH17XG9wdGlvbmFse2dlbmVyYXRpb259fQogV2l0aCBubyBhcmd1bWVudHMsIHJ1biBhIGZ1bGwgY29sbGVjdGlvbi4gIFRoZSBvcHRpb25hbCBhcmd1bWVudAogXHZhcntnZW5lcmF0aW9ufSBtYXkgYmUgYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHdoaWNoIGdlbmVyYXRpb24gdG8gY29sbGVjdAotKGZyb20gMCB0byAyKS4gIEEgVmFsdWVFcnJvciBpcyByYWlzZWQgaWYgdGhlIGdlbmVyYXRpb24gbnVtYmVyIGlzIGludmFsaWQuCisoZnJvbSAwIHRvIDIpLiAgQSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzIHJhaXNlZCBpZiB0aGUgZ2VuZXJhdGlvbiBudW1iZXIgCitpcyBpbnZhbGlkLgogVGhlIG51bWJlciBvZiB1bnJlYWNoYWJsZSBvYmplY3RzIGZvdW5kIGlzIHJldHVybmVkLgogCiBcdmVyc2lvbmNoYW5nZWRbVGhlIG9wdGlvbmFsIFx2YXJ7Z2VuZXJhdGlvbn0gYXJndW1lbnQgd2FzIGFkZGVkXXsyLjV9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmdldHBhc3MudGV4IGIvRG9jL2xpYi9saWJnZXRwYXNzLnRleAppbmRleCAyOGJmZThmLi4xZDE3N2QzIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmdldHBhc3MudGV4CisrKyBiL0RvYy9saWIvbGliZ2V0cGFzcy50ZXgKQEAgLTExLDExICsxMSwxNSBAQAogVGhlIFxtb2R1bGV7Z2V0cGFzc30gbW9kdWxlIHByb3ZpZGVzIHR3byBmdW5jdGlvbnM6CiAKIAotXGJlZ2lue2Z1bmNkZXNjfXtnZXRwYXNzfXtcb3B0aW9uYWx7cHJvbXB0fX0KK1xiZWdpbntmdW5jZGVzY317Z2V0cGFzc317XG9wdGlvbmFse3Byb21wdFxvcHRpb25hbHssIHN0cmVhbX19fQogICBQcm9tcHQgdGhlIHVzZXIgZm9yIGEgcGFzc3dvcmQgd2l0aG91dCBlY2hvaW5nLiAgVGhlIHVzZXIgaXMKICAgcHJvbXB0ZWQgdXNpbmcgdGhlIHN0cmluZyBcdmFye3Byb21wdH0sIHdoaWNoIGRlZmF1bHRzIHRvCi0gIFxjb2RleydQYXNzd29yZDogJ30uCisgIFxjb2RleydQYXNzd29yZDogJ30uIE9uIFxVTklYLCB0aGUgcHJvbXB0IGlzIHdyaXR0ZW4gdG8gdGhlCisgIGZpbGUtbGlrZSBvYmplY3QgXHZhcntzdHJlYW19LCB3aGljaCBkZWZhdWx0cyB0bworICBcY29kZXtzeXMuc3Rkb3V0fSAodGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkIG9uIFdpbmRvd3MpLgorCiAgIEF2YWlsYWJpbGl0eTogTWFjaW50b3NoLCBcVU5JWCwgV2luZG93cy4KKyAgXHZlcnNpb25hZGRlZFtUaGUgXHZhcntzdHJlYW19IHBhcmFtZXRlcl17Mi41fQogXGVuZHtmdW5jZGVzY30KIAogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmhhc2hsaWIudGV4IGIvRG9jL2xpYi9saWJoYXNobGliLnRleAppbmRleCBlOWQwYjU3Li42MmUzZmM0IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmhhc2hsaWIudGV4CisrKyBiL0RvYy9saWIvbGliaGFzaGxpYi50ZXgKQEAgLTMxLDcgKzMxLDcgQEAKIENvbnN0cnVjdG9ycyBmb3IgaGFzaCBhbGdvcml0aG1zIHRoYXQgYXJlIGFsd2F5cyBwcmVzZW50IGluIHRoaXMgbW9kdWxlIGFyZQogXGZ1bmN0aW9ue21kNSgpfSwgXGZ1bmN0aW9ue3NoYTEoKX0sIFxmdW5jdGlvbntzaGEyMjQoKX0sIFxmdW5jdGlvbntzaGEyNTYoKX0sCiBcZnVuY3Rpb257c2hhMzg0KCl9LCBhbmQgXGZ1bmN0aW9ue3NoYTUxMigpfS4gIEFkZGl0aW9uYWwgYWxnb3JpdGhtcyBtYXkgYWxzbwotYmUgYXZhaWxhYmxlIGRlcGVuZGluZyB1cG9uIHRoZSBPcGVuU1NMIGxpYnJhcnkgcHl0aG9uIHVzZXMgb24geW91ciBwbGF0Zm9ybS4KK2JlIGF2YWlsYWJsZSBkZXBlbmRpbmcgdXBvbiB0aGUgT3BlblNTTCBsaWJyYXJ5IHRoYXQgUHl0aG9uIHVzZXMgb24geW91ciBwbGF0Zm9ybS4KIFxpbmRleHtPcGVuU1NMfQogCiBGb3IgZXhhbXBsZSwgdG8gb2J0YWluIHRoZSBkaWdlc3Qgb2YgdGhlIHN0cmluZyBcY29kZXsnTm9ib2R5IGluc3BlY3RzCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYml0ZXJ0b29scy50ZXggYi9Eb2MvbGliL2xpYml0ZXJ0b29scy50ZXgKaW5kZXggNDIxZDY0Ny4uMjBiYmM4ZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJpdGVydG9vbHMudGV4CisrKyBiL0RvYy9saWIvbGliaXRlcnRvb2xzLnRleApAQCAtMjc2LDEyICsyNzYsMzAgQEAKICAgICAgZGVmIGl6aXAoKml0ZXJhYmxlcyk6CiAgICAgICAgICBpdGVyYWJsZXMgPSBtYXAoaXRlciwgaXRlcmFibGVzKQogICAgICAgICAgd2hpbGUgaXRlcmFibGVzOgotICAgICAgICAgICAgIHJlc3VsdCA9IFtpLm5leHQoKSBmb3IgaSBpbiBpdGVyYWJsZXNdCisgICAgICAgICAgICAgcmVzdWx0ID0gW2l0Lm5leHQoKSBmb3IgaXQgaW4gaXRlcmFibGVzXQogICAgICAgICAgICAgIHlpZWxkIHR1cGxlKHJlc3VsdCkKICAgXGVuZHt2ZXJiYXRpbX0KIAogICBcdmVyc2lvbmNoYW5nZWRbV2hlbiBubyBpdGVyYWJsZXMgYXJlIHNwZWNpZmllZCwgcmV0dXJucyBhIHplcm8gbGVuZ3RoCi0gICAgICAgICAgICAgICAgICBpdGVyYXRvciBpbnN0ZWFkIG9mIHJhaXNpbmcgYSBUeXBlRXJyb3IgZXhjZXB0aW9uXXsyLjR9ICAKKyAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGluc3RlYWQgb2YgcmFpc2luZyBhIFxleGNlcHRpb257VHlwZUVycm9yfQorCQkgIGV4Y2VwdGlvbl17Mi40fQorCisgIE5vdGUsIHRoZSBsZWZ0LXRvLXJpZ2h0IGV2YWx1YXRpb24gb3JkZXIgb2YgdGhlIGl0ZXJhYmxlcyBpcyBndWFyYW50ZWVkLgorICBUaGlzIG1ha2VzIHBvc3NpYmxlIGFuIGlkaW9tIGZvciBjbHVzdGVyaW5nIGEgZGF0YSBzZXJpZXMgaW50byBuLWxlbmd0aAorICBncm91cHMgdXNpbmcgXHNhbXB7aXppcCgqW2l0ZXIocyldKm4pfS4gIEZvciBkYXRhIHRoYXQgZG9lc24ndCBmaXQKKyAgbi1sZW5ndGggZ3JvdXBzIGV4YWN0bHksIHRoZSBsYXN0IHR1cGxlIGNhbiBiZSBwcmUtcGFkZGVkIHdpdGggZmlsbAorICB2YWx1ZXMgdXNpbmcgXHNhbXB7aXppcCgqW2NoYWluKHMsIFtOb25lXSoobi0xKSldKm4pfS4KKyAgICAgICAgIAorICBOb3RlLCB3aGVuIFxmdW5jdGlvbntpemlwKCl9IGlzIHVzZWQgd2l0aCB1bmVxdWFsIGxlbmd0aCBpbnB1dHMsIHN1YnNlcXVlbnQKKyAgaXRlcmF0aW9uIG92ZXIgdGhlIGxvbmdlciBpdGVyYWJsZXMgY2Fubm90IHJlbGlhYmx5IGJlIGNvbnRpbnVlZCBhZnRlcgorICBcZnVuY3Rpb257aXppcCgpfSB0ZXJtaW5hdGVzLiAgUG90ZW50aWFsbHksIHVwIHRvIG9uZSBlbnRyeSB3aWxsIGJlIG1pc3NpbmcKKyAgZnJvbSBlYWNoIG9mIHRoZSBsZWZ0LW92ZXIgaXRlcmFibGVzLiBUaGlzIG9jY3VycyBiZWNhdXNlIGEgdmFsdWUgaXMgZmV0Y2hlZAorICBmcm9tIGVhY2ggaXRlcmF0b3IgaW4tdHVybiwgYnV0IHRoZSBwcm9jZXNzIGVuZHMgd2hlbiBvbmUgb2YgdGhlIGl0ZXJhdG9ycworICB0ZXJtaW5hdGVzLiAgVGhpcyBsZWF2ZXMgdGhlIGxhc3QgZmV0Y2hlZCB2YWx1ZXMgaW4gbGltYm8gKHRoZXkgY2Fubm90IGJlCisgIHJldHVybmVkIGluIGEgZmluYWwsIGluY29tcGxldGUgdHVwbGUgYW5kIHRoZXkgYXJlIGNhbm5vdCBiZSBwdXNoZWQgYmFjaworICBpbnRvIHRoZSBpdGVyYXRvciBmb3IgcmV0cmlldmFsIHdpdGggXGNvZGV7aXQubmV4dCgpfSkuICBJbiBnZW5lcmFsLAorICBcZnVuY3Rpb257aXppcCgpfSBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggdW5lcXVhbCBsZW5ndGggaW5wdXRzIHdoZW4geW91CisgIGRvbid0IGNhcmUgYWJvdXQgdHJhaWxpbmcsIHVubWF0Y2hlZCB2YWx1ZXMgZnJvbSB0aGUgbG9uZ2VyIGl0ZXJhYmxlcy4KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317cmVwZWF0fXtvYmplY3Rcb3B0aW9uYWx7LCB0aW1lc319CkBAIC01MTcsNCArNTM1LDkgQEAKICAgICAgICAgcGFzcwogICAgIHJldHVybiBpemlwKGEsIGIpCiAKK2RlZiBncm91cGVyKG4sIGl0ZXJhYmxlLCBwYWR2YWx1ZT1Ob25lKToKKyAgICAiZ3JvdXBlcigzLCAnYWJjZGVmZycsICd4JykgLS0+ICgnYScsJ2InLCdjJyksICgnZCcsJ2UnLCdmJyksICgnZycsJ3gnLCd4JykiCisgICAgcmV0dXJuIGl6aXAoKltjaGFpbihpdGVyYWJsZSwgcmVwZWF0KHBhZHZhbHVlLCBuLTEpKV0qbikKKworCiBcZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJsaW5lY2FjaGUudGV4IGIvRG9jL2xpYi9saWJsaW5lY2FjaGUudGV4CmluZGV4IGMwMjJiYTkuLjE0NzdkM2MgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlibGluZWNhY2hlLnRleAorKysgYi9Eb2MvbGliL2xpYmxpbmVjYWNoZS50ZXgKQEAgLTE1LDcgKzE1LDcgQEAKIAogVGhlIFxtb2R1bGV7bGluZWNhY2hlfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKIAotXGJlZ2lue2Z1bmNkZXNjfXtnZXRsaW5lfXtmaWxlbmFtZSwgbGluZW5vfQorXGJlZ2lue2Z1bmNkZXNjfXtnZXRsaW5lfXtmaWxlbmFtZSwgbGluZW5vXG9wdGlvbmFseywgbW9kdWxlX2dsb2JhbHN9fQogR2V0IGxpbmUgXHZhcntsaW5lbm99IGZyb20gZmlsZSBuYW1lZCBcdmFye2ZpbGVuYW1lfS4gVGhpcyBmdW5jdGlvbgogd2lsbCBuZXZlciB0aHJvdyBhbiBleGNlcHRpb24gLS0tIGl0IHdpbGwgcmV0dXJuIFxjb2RleycnfSBvbiBlcnJvcnMKICh0aGUgdGVybWluYXRpbmcgbmV3bGluZSBjaGFyYWN0ZXIgd2lsbCBiZSBpbmNsdWRlZCBmb3IgbGluZXMgdGhhdCBhcmUKQEAgLTIzLDcgKzIzLDExIEBACiAKIElmIGEgZmlsZSBuYW1lZCBcdmFye2ZpbGVuYW1lfSBpcyBub3QgZm91bmQsIHRoZSBmdW5jdGlvbiB3aWxsIGxvb2sKIGZvciBpdCBpbiB0aGUgbW9kdWxlXGluZGV4aWlpe21vZHVsZX17c2VhcmNofXtwYXRofSBzZWFyY2ggcGF0aCwKLVxjb2Rle3N5cy5wYXRofS4KK1xjb2Rle3N5cy5wYXRofSwgYWZ0ZXIgZmlyc3QgY2hlY2tpbmcgZm9yIGEgXHBlcHszMDJ9IFxjb2Rle19fbG9hZGVyX199CitpbiBcdmFye21vZHVsZV9nbG9iYWxzfSwgaW4gY2FzZSB0aGUgbW9kdWxlIHdhcyBpbXBvcnRlZCBmcm9tIGEgemlwZmlsZQorb3Igb3RoZXIgbm9uLWZpbGVzeXN0ZW0gaW1wb3J0IHNvdXJjZS4gCisKK1x2ZXJzaW9uYWRkZWRbVGhlIFx2YXJ7bW9kdWxlX2dsb2JhbHN9IHBhcmFtZXRlciB3YXMgYWRkZWRdezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317Y2xlYXJjYWNoZX17fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJubnRwbGliLnRleCBiL0RvYy9saWIvbGlibm50cGxpYi50ZXgKaW5kZXggN2YxNGRlZS4uMTAzMzBlZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJubnRwbGliLnRleAorKysgYi9Eb2MvbGliL2xpYm5udHBsaWIudGV4CkBAIC02OCw0OCArNjgsNDggQEAKIHNlbnQgYmVmb3JlIGF1dGhlbnRpY2F0aW9uIGlzIHBlcmZvcm1lZC4gIFJlYWRlciBtb2RlIGlzIHNvbWV0aW1lcwogbmVjZXNzYXJ5IGlmIHlvdSBhcmUgY29ubmVjdGluZyB0byBhbiBOTlRQIHNlcnZlciBvbiB0aGUgbG9jYWwgbWFjaGluZQogYW5kIGludGVuZCB0byBjYWxsIHJlYWRlci1zcGVjaWZpYyBjb21tYW5kcywgc3VjaCBhcyBcc2FtcHtncm91cH0uICBJZgoteW91IGdldCB1bmV4cGVjdGVkIFxjb2Rle05OVFBQZXJtYW5lbnRFcnJvcn1zLCB5b3UgbWlnaHQgbmVlZCB0byBzZXQKK3lvdSBnZXQgdW5leHBlY3RlZCBcZXhjZXB0aW9ue05OVFBQZXJtYW5lbnRFcnJvcn1zLCB5b3UgbWlnaHQgbmVlZCB0byBzZXQKIFx2YXJ7cmVhZGVybW9kZX0uICBcdmFye3JlYWRlcm1vZGV9IGRlZmF1bHRzIHRvIFxjb2Rle05vbmV9LgogXHZhcnt1c2VuZXRyY30gZGVmYXVsdHMgdG8gXGNvZGV7VHJ1ZX0uCiAKIFx2ZXJzaW9uY2hhbmdlZFtcdmFye3VzZW5ldHJjfSBhcmd1bWVudCBhZGRlZF17Mi40fQogXGVuZHtjbGFzc2Rlc2N9CiAKLVxiZWdpbntjbGFzc2Rlc2N9e05OVFBFcnJvcn17fQotRGVyaXZlZCBmcm9tIHRoZSBzdGFuZGFyZCBleGNlcHRpb24gXGNvZGV7RXhjZXB0aW9ufSwgdGhpcyBpcyB0aGUgYmFzZQotY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIHJhaXNlZCBieSB0aGUgXGNvZGV7bm50cGxpYn0gbW9kdWxlLgotXGVuZHtjbGFzc2Rlc2N9CitcYmVnaW57ZXhjZGVzY317Tk5UUEVycm9yfQorRGVyaXZlZCBmcm9tIHRoZSBzdGFuZGFyZCBleGNlcHRpb24gXGV4Y2VwdGlvbntFeGNlcHRpb259LCB0aGlzIGlzIHRoZQorYmFzZSBjbGFzcyBmb3IgYWxsIGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IHRoZSBcbW9kdWxle25udHBsaWJ9IG1vZHVsZS4KK1xlbmR7ZXhjZGVzY30KIAotXGJlZ2lue2NsYXNzZGVzY317Tk5UUFJlcGx5RXJyb3J9e30KK1xiZWdpbntleGNkZXNjfXtOTlRQUmVwbHlFcnJvcn0KIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiB1bmV4cGVjdGVkIHJlcGx5IGlzIHJlY2VpdmVkIGZyb20gdGhlCiBzZXJ2ZXIuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZSBleGNlcHRpb24gXGNvZGV7ZXJyb3JfcmVwbHl9CiBpcyBlcXVpdmFsZW50IHRvIHRoaXMgY2xhc3MuCi1cZW5ke2NsYXNzZGVzY30KK1xlbmR7ZXhjZGVzY30KIAotXGJlZ2lue2NsYXNzZGVzY317Tk5UUFRlbXBvcmFyeUVycm9yfXt9CitcYmVnaW57ZXhjZGVzY317Tk5UUFRlbXBvcmFyeUVycm9yfQogRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIGVycm9yIGNvZGUgaW4gdGhlIHJhbmdlIDQwMC0tNDk5IGlzCiByZWNlaXZlZC4gIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIGV4Y2VwdGlvbgogXGNvZGV7ZXJyb3JfdGVtcH0gaXMgZXF1aXZhbGVudCB0byB0aGlzIGNsYXNzLgotXGVuZHtjbGFzc2Rlc2N9CitcZW5ke2V4Y2Rlc2N9CiAKLVxiZWdpbntjbGFzc2Rlc2N9e05OVFBQZXJtYW5lbnRFcnJvcn17fQorXGJlZ2lue2V4Y2Rlc2N9e05OVFBQZXJtYW5lbnRFcnJvcn0KIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiBlcnJvciBjb2RlIGluIHRoZSByYW5nZSA1MDAtLTU5OSBpcwogcmVjZWl2ZWQuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZSBleGNlcHRpb24KIFxjb2Rle2Vycm9yX3Blcm19IGlzIGVxdWl2YWxlbnQgdG8gdGhpcyBjbGFzcy4KLVxlbmR7Y2xhc3NkZXNjfQorXGVuZHtleGNkZXNjfQogCi1cYmVnaW57Y2xhc3NkZXNjfXtOTlRQUHJvdG9jb2xFcnJvcn17fQorXGJlZ2lue2V4Y2Rlc2N9e05OVFBQcm90b2NvbEVycm9yfQogRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGEgcmVwbHkgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyIHRoYXQgZG9lcwogbm90IGJlZ2luIHdpdGggYSBkaWdpdCBpbiB0aGUgcmFuZ2UgMS0tNS4gIEZvciBiYWNrd2FyZHMKIGNvbXBhdGliaWxpdHksIHRoZSBleGNlcHRpb24gXGNvZGV7ZXJyb3JfcHJvdG99IGlzIGVxdWl2YWxlbnQgdG8gdGhpcwogY2xhc3MuCi1cZW5ke2NsYXNzZGVzY30KK1xlbmR7ZXhjZGVzY30KIAotXGJlZ2lue2NsYXNzZGVzY317Tk5UUERhdGFFcnJvcn17fQorXGJlZ2lue2V4Y2Rlc2N9e05OVFBEYXRhRXJyb3J9CiBFeGNlcHRpb24gcmFpc2VkIHdoZW4gdGhlcmUgaXMgc29tZSBlcnJvciBpbiB0aGUgcmVzcG9uc2UgZGF0YS4gIEZvcgogYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZSBleGNlcHRpb24gXGNvZGV7ZXJyb3JfZGF0YX0gaXMKIGVxdWl2YWxlbnQgdG8gdGhpcyBjbGFzcy4KLVxlbmR7Y2xhc3NkZXNjfQorXGVuZHtleGNkZXNjfQogCiAKIFxzdWJzZWN0aW9ue05OVFAgT2JqZWN0cyBcbGFiZWx7bm50cC1vYmplY3RzfX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlib3B0cGFyc2UudGV4IGIvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKaW5kZXggNGFiMzI1Yi4uOGFjYTUwMSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKKysrIGIvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKQEAgLTEwMCw4ICsxMDAsOCBAQAogc2luZ2xlIGxldHRlciwgZS5nLiBcY29kZXsiLXgifSBvciBcY29kZXsiLUYifS4gIEFsc28sIHRyYWRpdGlvbmFsIFxVTklYe30KIHN5bnRheCBhbGxvd3MgbXVsdGlwbGUgb3B0aW9ucyB0byBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBhcmd1bWVudCwKIGUuZy4gIFxjb2RleyIteCAtRiJ9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7Ii14RiJ9LiAgVGhlIEdOVSBwcm9qZWN0Ci1pbnRyb2R1Y2VkIFxjb2RleyIte30tIn0gZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgaHlwaGVuLXNlcGFyYXRlZCB3b3JkcywKLWUuZy4gXGNvZGV7Ii17fS1maWxlIn0gb3IgXGNvZGV7Ii17fS1kcnktcnVuIn0uICBUaGVzZSBhcmUgdGhlIG9ubHkgdHdvIG9wdGlvbgoraW50cm9kdWNlZCBcY29kZXsiey0tfSJ9IGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIGh5cGhlbi1zZXBhcmF0ZWQgd29yZHMsCitlLmcuIFxjb2RleyJ7LS19ZmlsZSJ9IG9yIFxjb2RleyJ7LS19ZHJ5LXJ1biJ9LiAgVGhlc2UgYXJlIHRoZSBvbmx5IHR3byBvcHRpb24KIHN5bnRheGVzIHByb3ZpZGVkIGJ5IFxtb2R1bGV7b3B0cGFyc2V9LgogCiBTb21lIG90aGVyIG9wdGlvbiBzeW50YXhlcyB0aGF0IHRoZSB3b3JsZCBoYXMgc2VlbiBpbmNsdWRlOgpAQCAtMTcwLDcgKzE3MCw3IEBACiBwcm9nIC12IC0tcmVwb3J0IC90bXAvcmVwb3J0LnR4dCBmb28gYmFyCiBcZW5ke3ZlcmJhdGltfQogCi1cY29kZXsiLXYifSBhbmQgXGNvZGV7Ii17fS1yZXBvcnQifSBhcmUgYm90aCBvcHRpb25zLiAgQXNzdW1pbmcgdGhhdAorXGNvZGV7Ii12In0gYW5kIFxjb2RleyJ7LS19cmVwb3J0In0gYXJlIGJvdGggb3B0aW9ucy4gIEFzc3VtaW5nIHRoYXQKIFxsb25ncHJvZ3JhbW9wdHtyZXBvcnR9IHRha2VzIG9uZSBhcmd1bWVudCwgXGNvZGV7Ii90bXAvcmVwb3J0LnR4dCJ9IGlzIGFuIG9wdGlvbgogYXJndW1lbnQuICBcY29kZXsiZm9vIn0gYW5kIFxjb2RleyJiYXIifSBhcmUgcG9zaXRpb25hbCBhcmd1bWVudHMuCiAKQEAgLTU4Nyw3ICs1ODcsNyBAQAogZXJyb25lb3VzIGNhbGxzIHRvIFxjb2Rle3BhcnNlLmFkZHtcX31vcHRpb24oKX0sIGUuZy4gaW52YWxpZCBvcHRpb24gc3RyaW5ncywKIHVua25vd24gb3B0aW9uIGF0dHJpYnV0ZXMsIG1pc3Npbmcgb3B0aW9uIGF0dHJpYnV0ZXMsIGV0Yy4gIFRoZXNlIGFyZQogZGVhbHQgd2l0aCBpbiB0aGUgdXN1YWwgd2F5OiByYWlzZSBhbiBleGNlcHRpb24gKGVpdGhlcgotXGNvZGV7b3B0cGFyc2UuT3B0aW9uRXJyb3J9IG9yIFxjb2Rle1R5cGVFcnJvcn0pIGFuZCBsZXQgdGhlIHByb2dyYW0gY3Jhc2guCitcZXhjZXB0aW9ue29wdHBhcnNlLk9wdGlvbkVycm9yfSBvciBcZXhjZXB0aW9ue1R5cGVFcnJvcn0pIGFuZCBsZXQgdGhlIHByb2dyYW0gY3Jhc2guCiAKIEhhbmRsaW5nIHVzZXIgZXJyb3JzIGlzIG11Y2ggbW9yZSBpbXBvcnRhbnQsIHNpbmNlIHRoZXkgYXJlIGd1YXJhbnRlZWQKIHRvIGhhcHBlbiBubyBtYXR0ZXIgaG93IHN0YWJsZSB5b3VyIGNvZGUgaXMuICBcbW9kdWxle29wdHBhcnNlfSBjYW4gYXV0b21hdGljYWxseQpAQCAtMTAxOSw5ICsxMDE5LDkgQEAKIAogSW50ZWdlciBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byBcY29kZXtpbnQoKX0gdG8gY29udmVydCB0aGVtIHRvIFB5dGhvbgogaW50ZWdlcnMuICBJZiBcY29kZXtpbnQoKX0gZmFpbHMsIHNvIHdpbGwgXG1vZHVsZXtvcHRwYXJzZX0sIGFsdGhvdWdoIHdpdGggYSBtb3JlCi11c2VmdWwgZXJyb3IgbWVzc2FnZS4gIChJbnRlcm5hbGx5LCBcbW9kdWxle29wdHBhcnNlfSByYWlzZXMgT3B0aW9uVmFsdWVFcnJvcjsKLU9wdGlvblBhcnNlciBjYXRjaGVzIHRoaXMgZXhjZXB0aW9uIGhpZ2hlciB1cCBhbmQgdGVybWluYXRlcyB5b3VyCi1wcm9ncmFtIHdpdGggYSB1c2VmdWwgZXJyb3IgbWVzc2FnZS4pCit1c2VmdWwgZXJyb3IgbWVzc2FnZS4gIChJbnRlcm5hbGx5LCBcbW9kdWxle29wdHBhcnNlfSByYWlzZXMKK1xleGNlcHRpb257T3B0aW9uVmFsdWVFcnJvcn07IE9wdGlvblBhcnNlciBjYXRjaGVzIHRoaXMgZXhjZXB0aW9uIGhpZ2hlcgordXAgYW5kIHRlcm1pbmF0ZXMgeW91ciBwcm9ncmFtIHdpdGggYSB1c2VmdWwgZXJyb3IgbWVzc2FnZS4pCiAKIExpa2V3aXNlLCBcY29kZXtmbG9hdH0gYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gXGNvZGV7ZmxvYXQoKX0gZm9yIGNvbnZlcnNpb24sCiBcY29kZXtsb25nfSBhcmd1bWVudHMgdG8gXGNvZGV7bG9uZygpfSwgYW5kIFxjb2Rle2NvbXBsZXh9IGFyZ3VtZW50cyB0bwpAQCAtMTAzMiw3ICsxMDMyLDcgQEAKIG9wdGlvbiBhdHRyaWJ1dGUgKGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncykgZGVmaW5lcyB0aGUgc2V0IG9mIGFsbG93ZWQKIG9wdGlvbiBhcmd1bWVudHMuICBcY29kZXtvcHRwYXJzZS5vcHRpb24uY2hlY2t7XF99Y2hvaWNlKCl9IGNvbXBhcmVzCiB1c2VyLXN1cHBsaWVkIG9wdGlvbiBhcmd1bWVudHMgYWdhaW5zdCB0aGlzIG1hc3RlciBsaXN0IGFuZCByYWlzZXMKLU9wdGlvblZhbHVlRXJyb3IgaWYgYW4gaW52YWxpZCBzdHJpbmcgaXMgZ2l2ZW4uCitcZXhjZXB0aW9ue09wdGlvblZhbHVlRXJyb3J9IGlmIGFuIGludmFsaWQgc3RyaW5nIGlzIGdpdmVuLgogCiAKIFxzdWJzdWJzZWN0aW9ue1F1ZXJ5aW5nIGFuZCBtYW5pcHVsYXRpbmcgeW91ciBvcHRpb24gcGFyc2VyXGxhYmVse29wdHBhcnNlLXF1ZXJ5aW5nLW1hbmlwdWxhdGluZy1vcHRpb24tcGFyc2VyfX0KQEAgLTEwNTIsNyArMTA1Miw3IEBACiBvcHRpb24gc3RyaW5ncywgYWxsIG9mIHRob3NlIG9wdGlvbiBzdHJpbmdzIGJlY29tZSBpbnZhbGlkLgogCiBJZiBcY29kZXtvcHR7XF99c3RyfSBkb2VzIG5vdCBvY2N1ciBpbiBhbnkgb3B0aW9uIGJlbG9uZ2luZyB0byB0aGlzCi1PcHRpb25QYXJzZXIsIHJhaXNlcyBWYWx1ZUVycm9yLgorT3B0aW9uUGFyc2VyLCByYWlzZXMgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfS4KIFxlbmR7ZGVzY3JpcHRpb259CiAKIApAQCAtMTA4Nyw3ICsxMDg3LDcgQEAKIFxiZWdpbntkZXNjcmlwdGlvbn0KIFxpdGVtW1xjb2Rle2Vycm9yfSAoZGVmYXVsdCldCiBhc3N1bWUgb3B0aW9uIGNvbmZsaWN0cyBhcmUgYSBwcm9ncmFtbWluZyBlcnJvciBhbmQgcmFpc2UgCi1PcHRpb25Db25mbGljdEVycm9yCitcZXhjZXB0aW9ue09wdGlvbkNvbmZsaWN0RXJyb3J9CiBcaXRlbVtcY29kZXtyZXNvbHZlfV0KIHJlc29sdmUgb3B0aW9uIGNvbmZsaWN0cyBpbnRlbGxpZ2VudGx5IChzZWUgYmVsb3cpCiBcZW5ke2Rlc2NyaXB0aW9ufQpAQCAtMTI2MCw3ICsxMjYwLDcgQEAKIAogXHN1YnN1YnNlY3Rpb257UmFpc2luZyBlcnJvcnMgaW4gYSBjYWxsYmFja1xsYWJlbHtvcHRwYXJzZS1yYWlzaW5nLWVycm9ycy1pbi1jYWxsYmFja319CiAKLVRoZSBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgcmFpc2UgT3B0aW9uVmFsdWVFcnJvciBpZiB0aGVyZSBhcmUgYW55CitUaGUgY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkIHJhaXNlIFxleGNlcHRpb257T3B0aW9uVmFsdWVFcnJvcn0gaWYgdGhlcmUgYXJlIGFueQogcHJvYmxlbXMgd2l0aCB0aGUgb3B0aW9uIG9yIGl0cyBhcmd1bWVudChzKS4gIFxtb2R1bGV7b3B0cGFyc2V9IGNhdGNoZXMgdGhpcyBhbmQKIHRlcm1pbmF0ZXMgdGhlIHByb2dyYW0sIHByaW50aW5nIHRoZSBlcnJvciBtZXNzYWdlIHlvdSBzdXBwbHkgdG8KIHN0ZGVyci4gIFlvdXIgbWVzc2FnZSBzaG91bGQgYmUgY2xlYXIsIGNvbmNpc2UsIGFjY3VyYXRlLCBhbmQgbWVudGlvbgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJvcy50ZXggYi9Eb2MvbGliL2xpYm9zLnRleAppbmRleCA5YWY1ODg5Li45ZGVkM2FlIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYm9zLnRleAorKysgYi9Eb2MvbGliL2xpYm9zLnRleApAQCAtMzQzLDYgKzM0MywxMCBAQAogXHZlcnNpb25jaGFuZ2VkW1doZW4gc3BlY2lmaWVkLCB0aGUgXHZhcnttb2RlfSBhcmd1bWVudCBtdXN0IG5vdyBzdGFydAogICB3aXRoIG9uZSBvZiB0aGUgbGV0dGVycyBcY2hhcmFjdGVye3J9LCBcY2hhcmFjdGVye3d9LCBvciBcY2hhcmFjdGVye2F9LAogICBvdGhlcndpc2UgYSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzIHJhaXNlZF17Mi4zfQorXHZlcnNpb25jaGFuZ2VkW09uIFxVTklYLCB3aGVuIHRoZSBcdmFye21vZGV9IGFyZ3VtZW50IHN0YXJ0cyB3aXRoCisgIFxjaGFyYWN0ZXJ7YX0sIHRoZSBcdmFye09fQVBQRU5EfSBmbGFnIGlzIHNldCBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yCisgICh3aGljaCB0aGUgXGNmdW5jdGlvbntmZG9wZW4oKX0gaW1wbGVtZW50YXRpb24gYWxyZWFkeSBkb2VzIG9uIG1vc3QKKyAgcGxhdGZvcm1zKV17Mi41fQogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtwb3Blbn17Y29tbWFuZFxvcHRpb25hbHssIG1vZGVcb3B0aW9uYWx7LCBidWZzaXplfX19CkBAIC01NDcsNyArNTUxLDggQEAKIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIGxvdy1sZXZlbCBJL08uICBGb3Igbm9ybWFsIHVzYWdlLAogdXNlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257b3BlbigpfSwgd2hpY2ggcmV0dXJucyBhIGBgZmlsZQogb2JqZWN0Jycgd2l0aCBcbWV0aG9ke3JlYWQoKX0gYW5kIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kcyAoYW5kIG1hbnkKLW1vcmUpLgorbW9yZSkuICBUbyB3cmFwIGEgZmlsZSBkZXNjcmlwdG9yIGluIGEgYGBmaWxlIG9iamVjdCcnLCB1c2UKK1xmdW5jdGlvbntmZG9wZW4oKX0uCiBcZW5ke25vdGljZX0KIFxlbmR7ZnVuY2Rlc2N9CiAKQEAgLTE3MzEsNiArMTczNiwyNyBAQAogcmV0dXJuIHN1aXRhYmxlIHByb2Nlc3MgaGFuZGxlcy4KIFxlbmR7ZnVuY2Rlc2N9CiAKK1xiZWdpbntmdW5jZGVzY317d2FpdDN9e1xvcHRpb25hbHtvcHRpb25zfX0KK1NpbWlsYXIgdG8gXGZ1bmN0aW9ue3dhaXRwaWQoKX0sIGV4Y2VwdCBubyBwcm9jZXNzIGlkIGFyZ3VtZW50IGlzIGdpdmVuIGFuZAorYSAzLWVsZW1lbnQgdHVwbGUgY29udGFpbmluZyB0aGUgY2hpbGQncyBwcm9jZXNzIGlkLCBleGl0IHN0YXR1cyBpbmRpY2F0aW9uLAorYW5kIHJlc291cmNlIHVzYWdlIGluZm9ybWF0aW9uIGlzIHJldHVybmVkLiAgUmVmZXIgdG8KK1xtb2R1bGV7cmVzb3VyY2V9LlxmdW5jdGlvbntnZXRydXNhZ2UoKX0KK2ZvciBkZXRhaWxzIG9uIHJlc291cmNlIHVzYWdlIGluZm9ybWF0aW9uLiAgVGhlIG9wdGlvbiBhcmd1bWVudCBpcyB0aGUgc2FtZQorYXMgdGhhdCBwcm92aWRlZCB0byBcZnVuY3Rpb257d2FpdHBpZCgpfSBhbmQgXGZ1bmN0aW9ue3dhaXQ0KCl9LgorQXZhaWxhYmlsaXR5OiBcVU5JWC4KK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXt3YWl0NH17cGlkLCBvcHRpb25zfQorU2ltaWxhciB0byBcZnVuY3Rpb257d2FpdHBpZCgpfSwgZXhjZXB0IGEgMy1lbGVtZW50IHR1cGxlLCBjb250YWluaW5nIHRoZQorY2hpbGQncyBwcm9jZXNzIGlkLCBleGl0IHN0YXR1cyBpbmRpY2F0aW9uLCBhbmQgcmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24KK2lzIHJldHVybmVkLiAgUmVmZXIgdG8gXG1vZHVsZXtyZXNvdXJjZX0uXGZ1bmN0aW9ue2dldHJ1c2FnZSgpfSBmb3IgZGV0YWlscworb24gcmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24uICBUaGUgYXJndW1lbnRzIHRvIFxmdW5jdGlvbnt3YWl0NCgpfSBhcmUKK3RoZSBzYW1lIGFzIHRob3NlIHByb3ZpZGVkIHRvIFxmdW5jdGlvbnt3YWl0cGlkKCl9LgorQXZhaWxhYmlsaXR5OiBcVU5JWC4KK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHtmdW5jZGVzY30KKwogXGJlZ2lue2RhdGFkZXNjfXtXTk9IQU5HfQogVGhlIG9wdGlvbiBmb3IgXGZ1bmN0aW9ue3dhaXRwaWQoKX0gdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGlmIG5vIGNoaWxkCiBwcm9jZXNzIHN0YXR1cyBpcyBhdmFpbGFibGUgaW1tZWRpYXRlbHkuIFRoZSBmdW5jdGlvbiByZXR1cm5zCkBAIC0xODE4LDE0ICsxODQ0LDE0IEBACiBzdHJpbmcgd2hpY2ggaXMgdGhlIG5hbWUgb2YgYSBkZWZpbmVkIHN5c3RlbSB2YWx1ZTsgdGhlc2UgbmFtZXMgYXJlCiBzcGVjaWZpZWQgaW4gYSBudW1iZXIgb2Ygc3RhbmRhcmRzIChcUE9TSVgsIFxVTklYe30gOTUsIFxVTklYe30gOTgsIGFuZAogb3RoZXJzKS4gIFNvbWUgcGxhdGZvcm1zIGRlZmluZSBhZGRpdGlvbmFsIG5hbWVzIGFzIHdlbGwuICBUaGUgbmFtZXMKLWtub3duIHRvIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0gYXJlIGdpdmVuIGluIHRoZQora25vd24gdG8gdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbSBhcmUgZ2l2ZW4gYXMgdGhlIGtleXMgb2YgdGhlCiBcY29kZXtjb25mc3RyX25hbWVzfSBkaWN0aW9uYXJ5LiAgRm9yIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIG5vdAogaW5jbHVkZWQgaW4gdGhhdCBtYXBwaW5nLCBwYXNzaW5nIGFuIGludGVnZXIgZm9yIFx2YXJ7bmFtZX0gaXMgYWxzbwogYWNjZXB0ZWQuCiBBdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVguCiAKLUlmIHRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHNwZWNpZmllZCBieSBcdmFye25hbWV9IGlzbid0IGRlZmluZWQsIHRoZQotZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorSWYgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgc3BlY2lmaWVkIGJ5IFx2YXJ7bmFtZX0gaXNuJ3QgZGVmaW5lZCwKK1xjb2Rle05vbmV9IGlzIHJldHVybmVkLgogCiBJZiBcdmFye25hbWV9IGlzIGEgc3RyaW5nIGFuZCBpcyBub3Qga25vd24sIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMKIHJhaXNlZC4gIElmIGEgc3BlY2lmaWMgdmFsdWUgZm9yIFx2YXJ7bmFtZX0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlib3NzYXVkaW9kZXYudGV4IGIvRG9jL2xpYi9saWJvc3NhdWRpb2Rldi50ZXgKaW5kZXggZWM3OWU5ZS4uMjIzY2YyOCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJvc3NhdWRpb2Rldi50ZXgKKysrIGIvRG9jL2xpYi9saWJvc3NhdWRpb2Rldi50ZXgKQEAgLTMxMSw3ICszMTEsNyBAQAogCiBcYmVnaW57bWV0aG9kZGVzY31bbWl4ZXIgZGV2aWNlXXtjbG9zZX17fQogVGhpcyBtZXRob2QgY2xvc2VzIHRoZSBvcGVuIG1peGVyIGRldmljZSBmaWxlLiAgQW55IGZ1cnRoZXIgYXR0ZW1wdHMgdG8KLXVzZSB0aGUgbWl4ZXIgYWZ0ZXIgdGhpcyBmaWxlIGlzIGNsb3NlZCB3aWxsIHJhaXNlIGFuIElPRXJyb3IuCit1c2UgdGhlIG1peGVyIGFmdGVyIHRoaXMgZmlsZSBpcyBjbG9zZWQgd2lsbCByYWlzZSBhbiBcZXhjZXB0aW9ue0lPRXJyb3J9LgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bbWl4ZXIgZGV2aWNlXXtmaWxlbm99e30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicGRiLnRleCBiL0RvYy9saWIvbGlicGRiLnRleAppbmRleCA2MzAxMTc1Li5hNWIzNmE2IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnBkYi50ZXgKKysrIGIvRG9jL2xpYi9saWJwZGIudGV4CkBAIC0yNDAsNiArMjQwLDQ1IEBACiB0aGUgYnJlYWtwb2ludCBpcyBob25vcmVkLiAgSWYgY29uZGl0aW9uIGlzIGFic2VudCwgYW55IGV4aXN0aW5nCiBjb25kaXRpb24gaXMgcmVtb3ZlZDsgaS5lLiwgdGhlIGJyZWFrcG9pbnQgaXMgbWFkZSB1bmNvbmRpdGlvbmFsLgogCitcaXRlbVtjb21tYW5kcyBcb3B0aW9uYWx7XHZhcnticG51bWJlcn19XQorCitTcGVjaWZ5IGEgbGlzdCBvZiBjb21tYW5kcyBmb3IgYnJlYWtwb2ludCBudW1iZXIgXHZhcnticG51bWJlcn0uICBUaGUKK2NvbW1hbmRzIHRoZW1zZWx2ZXMgYXBwZWFyIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMuICBUeXBlIGEgbGluZQorY29udGFpbmluZyBqdXN0ICdlbmQnIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWFuZHMuIEFuIGV4YW1wbGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KKyhQZGIpIGNvbW1hbmRzIDEKKyhjb20pIHByaW50IHNvbWVfdmFyaWFibGUKKyhjb20pIGVuZAorKFBkYikKK1xlbmR7dmVyYmF0aW19CisKK1RvIHJlbW92ZSBhbGwgY29tbWFuZHMgZnJvbSBhIGJyZWFrcG9pbnQsIHR5cGUgY29tbWFuZHMgYW5kCitmb2xsb3cgaXQgaW1tZWRpYXRlbHkgd2l0aCAgZW5kOyB0aGF0IGlzLCBnaXZlIG5vIGNvbW1hbmRzLgorCitXaXRoIG5vIFx2YXJ7YnBudW1iZXJ9IGFyZ3VtZW50LCBjb21tYW5kcyByZWZlcnMgdG8gdGhlIGxhc3QKK2JyZWFrcG9pbnQgc2V0LgorCitZb3UgY2FuIHVzZSBicmVha3BvaW50IGNvbW1hbmRzIHRvIHN0YXJ0IHlvdXIgcHJvZ3JhbSB1cCBhZ2Fpbi4KK1NpbXBseSB1c2UgdGhlIGNvbnRpbnVlIGNvbW1hbmQsIG9yIHN0ZXAsIG9yIGFueSBvdGhlcgorY29tbWFuZCB0aGF0IHJlc3VtZXMgZXhlY3V0aW9uLgorCitTcGVjaWZ5aW5nIGFueSBjb21tYW5kIHJlc3VtaW5nIGV4ZWN1dGlvbiAoY3VycmVudGx5IGNvbnRpbnVlLAorc3RlcCwgbmV4dCwgcmV0dXJuLCBqdW1wLCBxdWl0IGFuZCB0aGVpciBhYmJyZXZpYXRpb25zKSB0ZXJtaW5hdGVzCit0aGUgY29tbWFuZCBsaXN0IChhcyBpZiB0aGF0IGNvbW1hbmQgd2FzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGVuZCkuCitUaGlzIGlzIGJlY2F1c2UgYW55IHRpbWUgeW91IHJlc3VtZSBleGVjdXRpb24KKyhldmVuIHdpdGggYSBzaW1wbGUgbmV4dCBvciBzdGVwKSwgeW91IG1heSBlbmNvdW50ZXLCtworYW5vdGhlciBicmVha3BvaW50LS13aGljaCBjb3VsZCBoYXZlIGl0cyBvd24gY29tbWFuZCBsaXN0LCBsZWFkaW5nIHRvCithbWJpZ3VpdGllcyBhYm91dCB3aGljaCBsaXN0IHRvIGV4ZWN1dGUuCisKKyAgIElmIHlvdSB1c2UgdGhlICdzaWxlbnQnIGNvbW1hbmQgaW4gdGhlIGNvbW1hbmQgbGlzdCwgdGhlCit1c3VhbCBtZXNzYWdlIGFib3V0IHN0b3BwaW5nIGF0IGEgYnJlYWtwb2ludCBpcyBub3QgcHJpbnRlZC4gIFRoaXMgbWF5CitiZSBkZXNpcmFibGUgZm9yIGJyZWFrcG9pbnRzIHRoYXQgYXJlIHRvIHByaW50IGEgc3BlY2lmaWMgbWVzc2FnZSBhbmQKK3RoZW4gY29udGludWUuICBJZiBub25lIG9mIHRoZSBvdGhlciBjb21tYW5kcyBwcmludCBhbnl0aGluZywgeW91CitzZWUgbm8gc2lnbiB0aGF0IHRoZSBicmVha3BvaW50IHdhcyByZWFjaGVkLgorCitcdmVyc2lvbmFkZGVkezIuNX0KKwogXGl0ZW1bcyh0ZXApXQogCiBFeGVjdXRlIHRoZSBjdXJyZW50IGxpbmUsIHN0b3AgYXQgdGhlIGZpcnN0IHBvc3NpYmxlIG9jY2FzaW9uCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnByb2ZpbGUudGV4IGIvRG9jL2xpYi9saWJwcm9maWxlLnRleAppbmRleCBhZmM5Njk0Li45ZmY1YmEwIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnByb2ZpbGUudGV4CisrKyBiL0RvYy9saWIvbGlicHJvZmlsZS50ZXgKQEAgLTEyNCw3ICsxMjQsNyBAQAogJVxlbmR7ZGVzY3JpcHRpb259CiAKIAotXHNlY3Rpb257SW5zdGFudCBVc2VycyBNYW51YWwgXGxhYmVse3Byb2ZpbGUtaW5zdGFudH19Citcc2VjdGlvbntJbnN0YW50IFVzZXIncyBNYW51YWwgXGxhYmVse3Byb2ZpbGUtaW5zdGFudH19CiAKIFRoaXMgc2VjdGlvbiBpcyBwcm92aWRlZCBmb3IgdXNlcnMgdGhhdCBgYGRvbid0IHdhbnQgdG8gcmVhZCB0aGUKIG1hbnVhbC4nJyBJdCBwcm92aWRlcyBhIHZlcnkgYnJpZWYgb3ZlcnZpZXcsIGFuZCBhbGxvd3MgYSB1c2VyIHRvCkBAIC0zOTEsMTcgKzM5MSwxNyBAQAogJSAoVGhpcyBcc3Rtb2RpbmRleCB1c2UgbWF5IGJlIGhhcmQgdG8gY2hhbmdlIDstKCApCiBcc3Rtb2RpbmRleHtwc3RhdHN9CiAKLVxiZWdpbntjbGFzc2Rlc2N9e1N0YXRzfXtmaWxlbmFtZVxvcHRpb25hbHssIFxtb3JlYXJnc319CitcYmVnaW57Y2xhc3NkZXNjfXtTdGF0c317ZmlsZW5hbWVcb3B0aW9uYWx7LCBcbW9yZWFyZ3Ncb3B0aW9uYWx7LCBzdHJlYW09c3lzLnN0ZG91dH19fQogVGhpcyBjbGFzcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgYGBzdGF0aXN0aWNzIG9iamVjdCcnCiBmcm9tIGEgXHZhcntmaWxlbmFtZX0gKG9yIHNldCBvZiBmaWxlbmFtZXMpLiAgXGNsYXNze1N0YXRzfSBvYmplY3RzIGFyZQotbWFuaXB1bGF0ZWQgYnkgbWV0aG9kcywgaW4gb3JkZXIgdG8gcHJpbnQgdXNlZnVsIHJlcG9ydHMuCittYW5pcHVsYXRlZCBieSBtZXRob2RzLCBpbiBvcmRlciB0byBwcmludCB1c2VmdWwgcmVwb3J0cy4gIFlvdSBtYXkgc3BlY2lmeQorYW4gYWx0ZXJuYXRlIG91dHB1dCBzdHJlYW0gYnkgZ2l2aW5nIHRoZSBrZXl3b3JkIGFyZ3VtZW50LCBcY29kZXtzdHJlYW19LgogCi1UaGUgZmlsZSBzZWxlY3RlZCBieSB0aGUgYWJvdmUgY29uc3RydWN0b3IgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieQotdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBvZiBcbW9kdWxle3Byb2ZpbGV9IG9yIFxtb2R1bGV7Y1Byb2ZpbGV9LgotVG8gYmUgc3BlY2lmaWMsIHRoZXJlIGlzCi1cZW1waHtub30gZmlsZSBjb21wYXRpYmlsaXR5IGd1YXJhbnRlZWQgd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcwotcHJvZmlsZXIsIGFuZCB0aGVyZSBpcyBubyBjb21wYXRpYmlsaXR5IHdpdGggZmlsZXMgcHJvZHVjZWQgYnkgb3RoZXIKLXByb2ZpbGVycy4KK1RoZSBmaWxlIHNlbGVjdGVkIGJ5IHRoZSBhYm92ZSBjb25zdHJ1Y3RvciBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZQorY29ycmVzcG9uZGluZyB2ZXJzaW9uIG9mIFxtb2R1bGV7cHJvZmlsZX0gb3IgXG1vZHVsZXtjUHJvZmlsZX0uICBUbyBiZQorc3BlY2lmaWMsIHRoZXJlIGlzIFxlbXBoe25vfSBmaWxlIGNvbXBhdGliaWxpdHkgZ3VhcmFudGVlZCB3aXRoIGZ1dHVyZQordmVyc2lvbnMgb2YgdGhpcyBwcm9maWxlciwgYW5kIHRoZXJlIGlzIG5vIGNvbXBhdGliaWxpdHkgd2l0aCBmaWxlcyBwcm9kdWNlZAorYnkgb3RoZXIgcHJvZmlsZXJzLgogJShzdWNoIGFzIHRoZSBvbGQgc3lzdGVtIHByb2ZpbGVyKS4KIAogSWYgc2V2ZXJhbCBmaWxlcyBhcmUgcHJvdmlkZWQsIGFsbCB0aGUgc3RhdGlzdGljcyBmb3IgaWRlbnRpY2FsCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnB5Y29tcGlsZS50ZXggYi9Eb2MvbGliL2xpYnB5Y29tcGlsZS50ZXgKaW5kZXggMDQ1ODE5MS4uODVmMGFhYSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJweWNvbXBpbGUudGV4CisrKyBiL0RvYy9saWIvbGlicHljb21waWxlLnRleApAQCAtMzAsOSArMzAsMTAgQEAKICAgXGNvZGV7K30gXGNvZGV7J2MnfSAoXGNvZGV7J28nfSBpZiBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZCBpbiB0aGUKICAgY3VycmVudCBpbnRlcnByZXRlcikuICBJZiBcdmFye2RmaWxlfSBpcyBzcGVjaWZpZWQsIGl0IGlzIHVzZWQgYXMKICAgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGluIGVycm9yIG1lc3NhZ2VzIGluc3RlYWQgb2YgXHZhcntmaWxlfS4gCi0gIElmIFx2YXJ7ZG9yYWlzZX0gPSBUcnVlLCBhIFB5Q29tcGlsZUVycm9yIGlzIHJhaXNlZCB3aGVuIGFuIGVycm9yIGlzIAotICBlbmNvdW50ZXJlZCB3aGlsZSBjb21waWxpbmcgXHZhcntmaWxlfS4gSWYgXHZhcntkb3JhaXNlfSA9IEZhbHNlICh0aGUgZGVmYXVsdCksIAotICBhbiBlcnJvciBzdHJpbmcgaXMgd3JpdHRlbiB0byBzeXMuc3RkZXJyLCBidXQgbm8gZXhjZXB0aW9uIGlzIHJhaXNlZC4KKyAgSWYgXHZhcntkb3JhaXNlfSBpcyB0cnVlLCBhIFxleGNlcHRpb257UHlDb21waWxlRXJyb3J9IGlzIHJhaXNlZCB3aGVuCisgIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIHdoaWxlIGNvbXBpbGluZyBcdmFye2ZpbGV9LiBJZiBcdmFye2RvcmFpc2V9CisgIGlzIGZhbHNlICh0aGUgZGVmYXVsdCksIGFuIGVycm9yIHN0cmluZyBpcyB3cml0dGVuIHRvIFxjb2Rle3N5cy5zdGRlcnJ9LAorICBidXQgbm8gZXhjZXB0aW9uIGlzIHJhaXNlZC4KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317bWFpbn17XG9wdGlvbmFse2FyZ3N9fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJxdWV1ZS50ZXggYi9Eb2MvbGliL2xpYnF1ZXVlLnRleAppbmRleCBmMWQ4OTJhLi45NWFkNDdmIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnF1ZXVlLnRleAorKysgYi9Eb2MvbGliL2xpYnF1ZXVlLnRleApAQCAtMSwzICsxLDQgQEAKKwogXHNlY3Rpb257XG1vZHVsZXtRdWV1ZX0gLS0tCiAgICAgICAgICBBIHN5bmNocm9uaXplZCBxdWV1ZSBjbGFzc30KIApAQCAtOTQsMyArOTUsNTEgQEAKIFxiZWdpbnttZXRob2RkZXNjfXtnZXRfbm93YWl0fXt9CiBFcXVpdmFsZW50IHRvIFxjb2Rle2dldChGYWxzZSl9LgogXGVuZHttZXRob2RkZXNjfQorCitUd28gbWV0aG9kcyBhcmUgb2ZmZXJlZCB0byBzdXBwb3J0IHRyYWNraW5nIHdoZXRoZXIgZW5xdWV1ZWQgdGFza3MgaGF2ZQorYmVlbiBmdWxseSBwcm9jZXNzZWQgYnkgZGFlbW9uIGNvbnN1bWVyIHRocmVhZHMuCisKK1xiZWdpbnttZXRob2RkZXNjfXt0YXNrX2RvbmV9e30KK0luZGljYXRlIHRoYXQgYSBmb3JtZXJseSBlbnF1ZXVlZCB0YXNrIGlzIGNvbXBsZXRlLiAgVXNlZCBieSBxdWV1ZSBjb25zdW1lcgordGhyZWFkcy4gIEZvciBlYWNoIFxtZXRob2R7Z2V0KCl9IHVzZWQgdG8gZmV0Y2ggYSB0YXNrLCBhIHN1YnNlcXVlbnQgY2FsbCB0bworXG1ldGhvZHt0YXNrX2RvbmUoKX0gdGVsbHMgdGhlIHF1ZXVlIHRoYXQgdGhlIHByb2Nlc3Npbmcgb24gdGhlIHRhc2sgaXMgY29tcGxldGUuCisKK0lmIGEgXG1ldGhvZHtqb2luKCl9IGlzIGN1cnJlbnRseSBibG9ja2luZywgaXQgd2lsbCByZXN1bWUgd2hlbiBhbGwgaXRlbXMKK2hhdmUgYmVlbiBwcm9jZXNzZWQgKG1lYW5pbmcgdGhhdCBhIFxtZXRob2R7dGFza19kb25lKCl9IGNhbGwgd2FzIHJlY2VpdmVkCitmb3IgZXZlcnkgaXRlbSB0aGF0IGhhZCBiZWVuIFxtZXRob2R7cHV0KCl9IGludG8gdGhlIHF1ZXVlKS4KKworUmFpc2VzIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpZiBjYWxsZWQgbW9yZSB0aW1lcyB0aGFuIHRoZXJlIHdlcmUgaXRlbXMKK3BsYWNlZCBpbiB0aGUgcXVldWUuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2pvaW59e30KK0Jsb2NrcyB1bnRpbCBhbGwgaXRlbXMgaW4gdGhlIHF1ZXVlIGhhdmUgYmVlbiBnb3R0ZW4gYW5kIHByb2Nlc3NlZC4KKworVGhlIGNvdW50IG9mIHVuZmluaXNoZWQgdGFza3MgZ29lcyB1cCB3aGVuZXZlciBhbiBpdGVtIGlzIGFkZGVkIHRvIHRoZQorcXVldWUuIFRoZSBjb3VudCBnb2VzIGRvd24gd2hlbmV2ZXIgYSBjb25zdW1lciB0aHJlYWQgY2FsbHMgXG1ldGhvZHt0YXNrX2RvbmUoKX0KK3RvIGluZGljYXRlIHRoYXQgdGhlIGl0ZW0gd2FzIHJldHJpZXZlZCBhbmQgYWxsIHdvcmsgb24gaXQgaXMgY29tcGxldGUuCitXaGVuIHRoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHRhc2tzIGRyb3BzIHRvIHplcm8sIGpvaW4oKSB1bmJsb2Nrcy4KK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHttZXRob2RkZXNjfQorCitFeGFtcGxlIG9mIGhvdyB0byB3YWl0IGZvciBlbnF1ZXVlZCB0YXNrcyB0byBiZSBjb21wbGV0ZWQ6CisKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgICBkZWYgd29ya2VyKCk6IAorICAgICAgICB3aGlsZSBUcnVlOiAKKyAgICAgICAgICAgIGl0ZW0gPSBxLmdldCgpIAorICAgICAgICAgICAgZG9fd29yayhpdGVtKSAKKyAgICAgICAgICAgIHEudGFza19kb25lKCkgCisKKyAgICBxID0gUXVldWUoKSAKKyAgICBmb3IgaSBpbiByYW5nZShudW1fd29ya2VyX3RocmVhZHMpOiAKKyAgICAgICAgIHQgPSBUaHJlYWQodGFyZ2V0PXdvcmtlcikKKyAgICAgICAgIHQuc2V0RGFlbW9uKFRydWUpCisgICAgICAgICB0LnN0YXJ0KCkgCisKKyAgICBmb3IgaXRlbSBpbiBzb3VyY2UoKToKKyAgICAgICAgcS5wdXQoaXRlbSkgCisKKyAgICBxLmpvaW4oKSAgICAgICAjIGJsb2NrIHVudGlsIGFsbCB0YXNrcyBhcmUgZG9uZQorXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmUudGV4IGIvRG9jL2xpYi9saWJyZS50ZXgKaW5kZXggOGU2NTEzYS4uMTQwNGUwOSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJyZS50ZXgKKysrIGIvRG9jL2xpYi9saWJyZS50ZXgKQEAgLTU2Niw5ICs1NjYsNiBAQAogPj4+IHJlLnNwbGl0KCdcVysnLCAnV29yZHMsIHdvcmRzLCB3b3Jkcy4nLCAxKQogWydXb3JkcycsICd3b3Jkcywgd29yZHMuJ10KIFxlbmR7dmVyYmF0aW19Ci0KLSAgVGhpcyBmdW5jdGlvbiBjb21iaW5lcyBhbmQgZXh0ZW5kcyB0aGUgZnVuY3Rpb25hbGl0eSBvZgotICB0aGUgb2xkIFxmdW5jdGlvbntyZWdzdWIuc3BsaXQoKX0gYW5kIFxmdW5jdGlvbntyZWdzdWIuc3BsaXR4KCl9LgogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtmaW5kYWxsfXtwYXR0ZXJuLCBzdHJpbmdcb3B0aW9uYWx7LCBmbGFnc319CkBAIC05MzQsNyArOTMxLDcgQEAKIFxsZWZ0bGluZXtcc3Ryb25ne0F2b2lkaW5nIHJlY3Vyc2lvbn19CiAKIElmIHlvdSBjcmVhdGUgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IHJlcXVpcmUgdGhlIGVuZ2luZSB0byBwZXJmb3JtIGEKLWxvdCBvZiByZWN1cnNpb24sIHlvdSBtYXkgZW5jb3VudGVyIGEgUnVudGltZUVycm9yIGV4Y2VwdGlvbiB3aXRoCitsb3Qgb2YgcmVjdXJzaW9uLCB5b3UgbWF5IGVuY291bnRlciBhIFxleGNlcHRpb257UnVudGltZUVycm9yfSBleGNlcHRpb24gd2l0aAogdGhlIG1lc3NhZ2UgXGNvZGV7bWF4aW11bSByZWN1cnNpb24gbGltaXR9IGV4Y2VlZGVkLiBGb3IgZXhhbXBsZSwKIAogXGJlZ2lue3ZlcmJhdGltfQpAQCAtOTQzLDcgKzk0MCw3IEBACiA+Pj4gcmUubWF0Y2goJ0JlZ2luIChcd3wgKSo/IGVuZCcsIHMpLmVuZCgpCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KLSAgRmlsZSAiL3Vzci9sb2NhbC9saWIvcHl0aG9uMi4zL3NyZS5weSIsIGxpbmUgMTMyLCBpbiBtYXRjaAorICBGaWxlICIvdXNyL2xvY2FsL2xpYi9weXRob24yLjUvcmUucHkiLCBsaW5lIDEzMiwgaW4gbWF0Y2gKICAgICByZXR1cm4gX2NvbXBpbGUocGF0dGVybiwgZmxhZ3MpLm1hdGNoKHN0cmluZykKIFJ1bnRpbWVFcnJvcjogbWF4aW11bSByZWN1cnNpb24gbGltaXQgZXhjZWVkZWQKIFxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnJlY29udmVydC50ZXggYi9Eb2MvbGliL2xpYnJlY29udmVydC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YzZlNTIuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJyZWNvbnZlcnQudGV4CisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtyZWNvbnZlcnR9IC0tLQotICAgICAgICAgQ29udmVydCByZWd1bGFyIGV4cHJlc3Npb25zIGZyb20gcmVnZXggdG8gcmUgZm9ybX0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtyZWNvbnZlcnR9Ci1cbW9kdWxlYXV0aG9ye0FuZHJldyBNLiBLdWNobGluZ317YW1rQGFtay5jYX0KLVxzZWN0aW9uYXV0aG9ye1NraXAgTW9udGFuYXJvfXtza2lwQHBvYm94LmNvbX0KLQotCi1cbW9kdWxlc3lub3BzaXN7Q29udmVydCByZWdleC0sIGVtYWNzLSBvciBzZWQtc3R5bGUgcmVndWxhciBleHByZXNzaW9ucwotdG8gcmUtc3R5bGUgc3ludGF4Ln0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhIGZhY2lsaXR5IHRvIGNvbnZlcnQgcmVndWxhciBleHByZXNzaW9ucyBmcm9tIHRoZQotc3ludGF4IHVzZWQgYnkgdGhlIGRlcHJlY2F0ZWQgXG1vZHVsZXtyZWdleH0gbW9kdWxlIHRvIHRob3NlIHVzZWQgYnkgdGhlCi1uZXdlciBcbW9kdWxle3JlfSBtb2R1bGUuICBCZWNhdXNlIG9mIHNpbWlsYXJpdHkgYmV0d2VlbiB0aGUgcmVndWxhcgotZXhwcmVzc2lvbiBzeW50YXggb2YgXGNvZGV7c2VkKDEpfSBhbmQgXGNvZGV7ZW1hY3MoMSl9IGFuZCB0aGUKLVxtb2R1bGV7cmVnZXh9IG1vZHVsZSwgaXQgaXMgYWxzbyBoZWxwZnVsIHRvIGNvbnZlcnQgcGF0dGVybnMgd3JpdHRlbiBmb3IKLXRob3NlIHRvb2xzIHRvIFxtb2R1bGV7cmV9IHBhdHRlcm5zLgotCi1XaGVuIHVzZWQgYXMgYSBzY3JpcHQsIGEgUHl0aG9uIHN0cmluZyBsaXRlcmFsIChvciBhbnkgb3RoZXIgZXhwcmVzc2lvbgotZXZhbHVhdGluZyB0byBhIHN0cmluZykgaXMgcmVhZCBmcm9tIHN0ZGluLCBhbmQgdGhlIHRyYW5zbGF0ZWQgZXhwcmVzc2lvbiBpcwotd3JpdHRlbiB0byBzdGRvdXQgYXMgYSBzdHJpbmcgbGl0ZXJhbC4gIFVubGVzcyBzdGRvdXQgaXMgYSB0dHksIG5vIHRyYWlsaW5nCi1uZXdsaW5lIGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgd2l0aAotRW1hY3MgXGNvZGV7Qy1VIE0tfH0gKHNoZWxsLWNvbW1hbmQtb24tcmVnaW9uKSB3aGljaCBmaWx0ZXJzIHRoZSByZWdpb24KLXRocm91Z2ggdGhlIHNoZWxsIGNvbW1hbmQuCi0KLVxiZWdpbntzZWVhbHNvfQotICBcc2VldGl0bGV7TWFzdGVyaW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnN9e0Jvb2sgb24gcmVndWxhciBleHByZXNzaW9ucwotICAgICAgICAgICAgYnkgSmVmZnJleSBGcmllZGwsIHB1Ymxpc2hlZCBieSBPJ1JlaWxseS4gIFRoZSBzZWNvbmQgCi0gICAgICAgICAgICBlZGl0aW9uIG9mIHRoZSBib29rIG5vIGxvbmdlciBjb3ZlcnMgUHl0aG9uIGF0IGFsbCwgCi0gICAgICAgICAgICBidXQgdGhlIGZpcnN0IGVkaXRpb24gY292ZXJlZCB3cml0aW5nIGdvb2QgcmVndWxhciBleHByZXNzaW9uCi0gICAgICAgICAgICBwYXR0ZXJucyBpbiBncmVhdCBkZXRhaWwufQotXGVuZHtzZWVhbHNvfQotCi1cc3Vic2VjdGlvbntNb2R1bGUgQ29udGVudHN9Ci1cbm9kZW5hbWV7Q29udGVudHMgb2YgTW9kdWxlIHJlY29udmVydH0KLQotVGhlIG1vZHVsZSBkZWZpbmVzIHR3byBmdW5jdGlvbnMgYW5kIGEgaGFuZGZ1bCBvZiBjb25zdGFudHMuCi0KLVxiZWdpbntmdW5jZGVzY317Y29udmVydH17cGF0dGVyblxvcHRpb25hbHssIHN5bnRheD1Ob25lfX0KLSBDb252ZXJ0IGEgXHZhcntwYXR0ZXJufSByZXByZXNlbnRpbmcgYSBcbW9kdWxle3JlZ2V4fS1zdHlwZSByZWd1bGFyCi0gZXhwcmVzc2lvbiBpbnRvIGEgXG1vZHVsZXtyZX0tc3R5bGUgcmVndWxhciBleHByZXNzaW9uLiAgVGhlIG9wdGlvbmFsCi0gXHZhcntzeW50YXh9IHBhcmFtZXRlciBpcyBhIGJpdHdpc2Utb3InZCBzZXQgb2YgZmxhZ3MgdGhhdCBjb250cm9sIHdoYXQKLSBjb25zdHJ1Y3RzIGFyZSBjb252ZXJ0ZWQuICBTZWUgYmVsb3cgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlvdXMKLSBjb25zdGFudHMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3F1b3RlfXtzXG9wdGlvbmFseywgcXVvdGU9Tm9uZX19Ci0gQ29udmVydCBhIHN0cmluZyBvYmplY3QgdG8gYSBxdW90ZWQgc3RyaW5nIGxpdGVyYWwuCi0KLSBUaGlzIGlzIHNpbWlsYXIgdG8gXGZ1bmN0aW9ue3JlcHJ9IGJ1dCB3aWxsIHJldHVybiBhICJyYXciIHN0cmluZyAocicuLi4nCi0gb3IgciIuLi4iKSB3aGVuIHRoZSBzdHJpbmcgY29udGFpbnMgYmFja3NsYXNoZXMsIGluc3RlYWQgb2YgZG91YmxpbmcgYWxsCi0gYmFja3NsYXNoZXMuICBUaGUgcmVzdWx0aW5nIHN0cmluZyBkb2VzIG5vdCBhbHdheXMgZXZhbHVhdGUgdG8gdGhlIHNhbWUKLSBzdHJpbmcgYXMgdGhlIG9yaWdpbmFsOyBob3dldmVyIGl0IHdpbGwgZG8ganVzdCB0aGUgcmlnaHQgdGhpbmcgd2hlbiBwYXNzZWQKLSBpbnRvIHJlLmNvbXBpbGUoKS4KLQotIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgZm9yY2VzIHRoZSBzdHJpbmcgcXVvdGU7IGl0IG11c3QgYmUgYSBzaW5nbGUKLSBjaGFyYWN0ZXIgd2hpY2ggaXMgYSB2YWxpZCBQeXRob24gc3RyaW5nIHF1b3RlLiAgTm90ZSB0aGF0IHByaW9yIHRvIFB5dGhvbgotIDIuNSB0aGlzIHdvdWxkIG5vdCBhY2NlcHQgdHJpcGxlLXF1b3RlZCBzdHJpbmcgZGVsaW1pdGVycy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UkVfTk9fQktfUEFSRU5TfQotIFN1cHByZXNzIHBhcmVuIGNvbnZlcnNpb24uICBUaGlzIHNob3VsZCBiZSBvbWl0dGVkIHdoZW4gY29udmVydGluZwotIFxjb2Rle3NlZH0tc3R5bGUgb3IgXGNvZGV7ZW1hY3N9LXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JFX05PX0JLX1ZCQVJ9Ci0gU3VwcHJlc3MgdmVydGljYWwgYmFyIGNvbnZlcnNpb24uICBUaGlzIHNob3VsZCBiZSBvbWl0dGVkIHdoZW4gY29udmVydGluZwotIFxjb2Rle3NlZH0tc3R5bGUgb3IgXGNvZGV7ZW1hY3N9LXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JFX0JLX1BMVVNfUU19Ci0gRW5hYmxlIGNvbnZlcnNpb24gb2YgXGNvZGV7K30gYW5kIFxjb2Rlez99IGNoYXJhY3RlcnMuICBUaGlzIHNob3VsZCBiZQotIGFkZGVkIHRvIHRoZSBcdmFye3N5bnRheH0gYXJnIG9mIFxmdW5jdGlvbntjb252ZXJ0fSB3aGVuIGNvbnZlcnRpbmcKLSBcY29kZXtzZWR9LXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYW5kIG9taXR0ZWQgd2hlbiBjb252ZXJ0aW5nCi0gXGNvZGV7ZW1hY3N9LXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JFX05FV0xJTkVfT1J9Ci0gV2hlbiBzZXQsIG5ld2xpbmUgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgYnkgXGNvZGV7fH0uCi1cZW5ke2RhdGFkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJyZWdleC50ZXggYi9Eb2MvbGliL2xpYnJlZ2V4LnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4MmY4MS4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnJlZ2V4LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3JlZ2V4fSAtLS0KLSAgICAgICAgIFJlZ3VsYXIgZXhwcmVzc2lvbiBvcGVyYXRpb25zfQotXGRlY2xhcmVtb2R1bGV7YnVpbHRpbn17cmVnZXh9Ci0KLVxtb2R1bGVzeW5vcHNpc3tSZWd1bGFyIGV4cHJlc3Npb24gc2VhcmNoIGFuZCBtYXRjaCBvcGVyYXRpb25zLgotICAgICAgICAgICAgICAgIFxzdHJvbmd7T2Jzb2xldGUhfX0KLQotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgb3BlcmF0aW9ucyBzaW1pbGFyIHRvCi10aG9zZSBmb3VuZCBpbiBFbWFjcy4KLQotXHN0cm9uZ3tPYnNvbGVzY2VuY2Ugbm90ZTp9Ci1UaGlzIG1vZHVsZSBpcyBvYnNvbGV0ZSBhcyBvZiBQeXRob24gdmVyc2lvbiAxLjU7IGl0IGlzIHN0aWxsIGJlaW5nCi1tYWludGFpbmVkIGJlY2F1c2UgbXVjaCBleGlzdGluZyBjb2RlIHN0aWxsIHVzZXMgaXQuICBBbGwgbmV3IGNvZGUgaW4KLW5lZWQgb2YgcmVndWxhciBleHByZXNzaW9ucyBzaG91bGQgdXNlIHRoZSBuZXcKLVxjb2Rle3JlfVxyZWZzdG1vZGluZGV4e3JlfSBtb2R1bGUsIHdoaWNoIHN1cHBvcnRzIHRoZSBtb3JlIHBvd2VyZnVsCi1hbmQgcmVndWxhciBQZXJsLXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBFeGlzdGluZyBjb2RlIHNob3VsZCBiZQotY29udmVydGVkLiAgVGhlIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlCi1cY29kZXtyZWNvbnZlcnR9XHJlZnN0bW9kaW5kZXh7cmVjb252ZXJ0fSBoZWxwcyBpbiBjb252ZXJ0aW5nCi1cY29kZXtyZWdleH0gc3R5bGUgcmVndWxhciBleHByZXNzaW9ucyB0byBcY29kZXtyZX1ccmVmc3Rtb2RpbmRleHtyZX0KLXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICAoRm9yIG1vcmUgY29udmVyc2lvbiBoZWxwLCBzZWUgQW5kcmV3Ci1LdWNobGluZydzXGluZGV4e0t1Y2hsaW5nLCBBbmRyZXd9IGBgXG1vZHVsZXtyZWdleC10by1yZX0gSE9XVE8nJyBhdAotXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2hvd3RvL3JlZ2V4LXRvLXJlL30uKQotCi1CeSBkZWZhdWx0IHRoZSBwYXR0ZXJucyBhcmUgRW1hY3Mtc3R5bGUgcmVndWxhciBleHByZXNzaW9ucwotKHdpdGggb25lIGV4Y2VwdGlvbikuICBUaGVyZSBpcwotYSB3YXkgdG8gY2hhbmdlIHRoZSBzeW50YXggdG8gbWF0Y2ggdGhhdCBvZiBzZXZlcmFsIHdlbGwta25vd24KLVxVTklYe30gdXRpbGl0aWVzLiAgVGhlIGV4Y2VwdGlvbiBpcyB0aGF0IEVtYWNzJyBcc2FtcHtcZSBzfQotcGF0dGVybiBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gcmVmZXJlbmNlcwotdGhlIEVtYWNzIHN5bnRheCB0YWJsZXMuCi0KLVRoaXMgbW9kdWxlIGlzIDgtYml0IGNsZWFuOiBib3RoIHBhdHRlcm5zIGFuZCBzdHJpbmdzIG1heSBjb250YWluIG51bGwKLWJ5dGVzIGFuZCBjaGFyYWN0ZXJzIHdob3NlIGhpZ2ggYml0IGlzIHNldC4KLQotXHN0cm9uZ3tQbGVhc2Ugbm90ZTp9IFRoZXJlIGlzIGEgbGl0dGxlLWtub3duIGZhY3QgYWJvdXQgUHl0aG9uIHN0cmluZwotbGl0ZXJhbHMgd2hpY2ggbWVhbnMgdGhhdCB5b3UgZG9uJ3QgdXN1YWxseSBoYXZlIHRvIHdvcnJ5IGFib3V0Ci1kb3VibGluZyBiYWNrc2xhc2hlcywgZXZlbiB0aG91Z2ggdGhleSBhcmUgdXNlZCB0byBlc2NhcGUgc3BlY2lhbAotY2hhcmFjdGVycyBpbiBzdHJpbmcgbGl0ZXJhbHMgYXMgd2VsbCBhcyBpbiByZWd1bGFyIGV4cHJlc3Npb25zLiAgVGhpcwotaXMgYmVjYXVzZSBQeXRob24gZG9lc24ndCByZW1vdmUgYmFja3NsYXNoZXMgZnJvbSBzdHJpbmcgbGl0ZXJhbHMgaWYKLXRoZXkgYXJlIGZvbGxvd2VkIGJ5IGFuIHVucmVjb2duaXplZCBlc2NhcGUgY2hhcmFjdGVyLgotXGVtcGh7SG93ZXZlcn0sIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgYSBsaXRlcmFsIFxkZm57YmFja3NsYXNofSBpbiBhCi1yZWd1bGFyIGV4cHJlc3Npb24gcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgbGl0ZXJhbCwgeW91IGhhdmUgdG8KLVxlbXBoe3F1YWRydXBsZX0gaXQgb3IgZW5jbG9zZSBpdCBpbiBhIHNpbmdsZXRvbiBjaGFyYWN0ZXIgY2xhc3MuCi1FLmcuXCAgdG8gZXh0cmFjdCBcTGFUZVhcIFxzYW1we1xlIHNlY3Rpb25ce1x0ZXh0cm17XGxkb3RzfVx9fSBoZWFkZXJzCi1mcm9tIGEgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIHRoaXMgcGF0dGVybjoKLVxjb2RleydbXGUgXXNlY3Rpb25ce1xlICguKlxlIClcfSd9LiAgXGVtcGh7QW5vdGhlciBleGNlcHRpb246fQotdGhlIGVzY2FwZSBzZXF1ZW5jZSBcc2FtcHtcZSBifSBpcyBzaWduaWZpY2FudCBpbiBzdHJpbmcgbGl0ZXJhbHMKLSh3aGVyZSBpdCBtZWFucyB0aGUgQVNDSUkgYmVsbCBjaGFyYWN0ZXIpIGFzIHdlbGwgYXMgaW4gRW1hY3MgcmVndWxhcgotZXhwcmVzc2lvbnMgKHdoZXJlIGl0IHN0YW5kcyBmb3IgYSB3b3JkIGJvdW5kYXJ5KSwgc28gaW4gb3JkZXIgdG8KLXNlYXJjaCBmb3IgYSB3b3JkIGJvdW5kYXJ5LCB5b3Ugc2hvdWxkIHVzZSB0aGUgcGF0dGVybiBcY29kZXsnXGUgXGUgYid9LgotU2ltaWxhcmx5LCBhIGJhY2tzbGFzaCBmb2xsb3dlZCBieSBhIGRpZ2l0IDAtNyBzaG91bGQgYmUgZG91YmxlZCB0bwotYXZvaWQgaW50ZXJwcmV0YXRpb24gYXMgYW4gb2N0YWwgZXNjYXBlLgotCi1cc3Vic2VjdGlvbntSZWd1bGFyIEV4cHJlc3Npb25zfQotCi1BIHJlZ3VsYXIgZXhwcmVzc2lvbiAob3IgUkUpIHNwZWNpZmllcyBhIHNldCBvZiBzdHJpbmdzIHRoYXQgbWF0Y2hlcwotaXQ7IHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgbGV0IHlvdSBjaGVjayBpZiBhIHBhcnRpY3VsYXIgc3RyaW5nCi1tYXRjaGVzIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChvciBpZiBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbgotbWF0Y2hlcyBhIHBhcnRpY3VsYXIgc3RyaW5nLCB3aGljaCBjb21lcyBkb3duIHRvIHRoZSBzYW1lIHRoaW5nKS4KLQotUmVndWxhciBleHByZXNzaW9ucyBjYW4gYmUgY29uY2F0ZW5hdGVkIHRvIGZvcm0gbmV3IHJlZ3VsYXIKLWV4cHJlc3Npb25zOyBpZiBcZW1waHtBfSBhbmQgXGVtcGh7Qn0gYXJlIGJvdGggcmVndWxhciBleHByZXNzaW9ucywKLXRoZW4gXGVtcGh7QUJ9IGlzIGFsc28gYW4gcmVndWxhciBleHByZXNzaW9uLiAgSWYgYSBzdHJpbmcgXGVtcGh7cH0KLW1hdGNoZXMgQSBhbmQgYW5vdGhlciBzdHJpbmcgXGVtcGh7cX0gbWF0Y2hlcyBCLCB0aGUgc3RyaW5nIFxlbXBoe3BxfQotd2lsbCBtYXRjaCBBQi4gIFRodXMsIGNvbXBsZXggZXhwcmVzc2lvbnMgY2FuIGVhc2lseSBiZSBjb25zdHJ1Y3RlZAotZnJvbSBzaW1wbGVyIG9uZXMgbGlrZSB0aGUgcHJpbWl0aXZlcyBkZXNjcmliZWQgaGVyZS4gIEZvciBkZXRhaWxzIG9mCi10aGUgdGhlb3J5IGFuZCBpbXBsZW1lbnRhdGlvbiBvZiByZWd1bGFyIGV4cHJlc3Npb25zLCBjb25zdWx0IGFsbW9zdAotYW55IHRleHRib29rIGFib3V0IGNvbXBpbGVyIGNvbnN0cnVjdGlvbi4KLQotJSBYWFggVGhlIHJlZmVyZW5jZSBjb3VsZCBiZSBtYWRlIG1vcmUgc3BlY2lmaWMsIHNheSB0byAKLSUgIkNvbXBpbGVyczogUHJpbmNpcGxlcywgVGVjaG5pcXVlcyBhbmQgVG9vbHMiLCBieSBBbGZyZWQgVi4gQWhvLCAKLSUgUmF2aSBTZXRoaSwgYW5kIEplZmZyZXkgRC4gVWxsbWFuLCBvciBzb21lIEZBIHRleHQuICAgCi0KLUEgYnJpZWYgZXhwbGFuYXRpb24gb2YgdGhlIGZvcm1hdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zIGZvbGxvd3MuCi0KLVJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuIGNvbnRhaW4gYm90aCBzcGVjaWFsIGFuZCBvcmRpbmFyeSBjaGFyYWN0ZXJzLgotT3JkaW5hcnkgY2hhcmFjdGVycywgbGlrZSAnXGNvZGV7QX0nLCAnXGNvZGV7YX0nLCBvciAnXGNvZGV7MH0nLCBhcmUKLXRoZSBzaW1wbGVzdCByZWd1bGFyIGV4cHJlc3Npb25zOyB0aGV5IHNpbXBseSBtYXRjaCB0aGVtc2VsdmVzLiAgWW91Ci1jYW4gY29uY2F0ZW5hdGUgb3JkaW5hcnkgY2hhcmFjdGVycywgc28gJ1xjb2Rle2xhc3R9JyBtYXRjaGVzIHRoZQotY2hhcmFjdGVycyAnbGFzdCcuICAoSW4gdGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uLCB3ZSdsbCB3cml0ZSBSRSdzIGluCi1cY29kZXt0aGlzIHNwZWNpYWwgZm9udH0sIHVzdWFsbHkgd2l0aG91dCBxdW90ZXMsIGFuZCBzdHJpbmdzIHRvIGJlCi1tYXRjaGVkICdpbiBzaW5nbGUgcXVvdGVzJy4pCi0KLVNwZWNpYWwgY2hhcmFjdGVycyBlaXRoZXIgc3RhbmQgZm9yIGNsYXNzZXMgb2Ygb3JkaW5hcnkgY2hhcmFjdGVycywgb3IKLWFmZmVjdCBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJvdW5kIHRoZW0gYXJlIGludGVycHJldGVkLgotCi1UaGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZToKLVxiZWdpbntpdGVtaXplfQotXGl0ZW1bXGNvZGV7Ln1dIChEb3QuKSAgTWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBhIG5ld2xpbmUuCi1caXRlbVtcY29kZXtcXn1dIChDYXJldC4pICBNYXRjaGVzIHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLgotXGl0ZW1bXGNvZGV7XCR9XSBNYXRjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gIAotXGNvZGV7Zm9vfSBtYXRjaGVzIGJvdGggJ2ZvbycgYW5kICdmb29iYXInLCB3aGlsZSB0aGUgcmVndWxhcgotZXhwcmVzc2lvbiAnXGNvZGV7Zm9vXCR9JyBtYXRjaGVzIG9ubHkgJ2ZvbycuCi1caXRlbVtcY29kZXsqfV0gQ2F1c2VzIHRoZSByZXN1bHRpbmcgUkUgdG8KLW1hdGNoIDAgb3IgbW9yZSByZXBldGl0aW9ucyBvZiB0aGUgcHJlY2VkaW5nIFJFLiAgXGNvZGV7YWIqfSB3aWxsCi1tYXRjaCAnYScsICdhYicsIG9yICdhJyBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mICdiJ3MuCi1caXRlbVtcY29kZXsrfV0gQ2F1c2VzIHRoZQotcmVzdWx0aW5nIFJFIHRvIG1hdGNoIDEgb3IgbW9yZSByZXBldGl0aW9ucyBvZiB0aGUgcHJlY2VkaW5nIFJFLgotXGNvZGV7YWIrfSB3aWxsIG1hdGNoICdhJyBmb2xsb3dlZCBieSBhbnkgbm9uLXplcm8gbnVtYmVyIG9mICdiJ3M7IGl0Ci13aWxsIG5vdCBtYXRjaCBqdXN0ICdhJy4KLVxpdGVtW1xjb2Rlez99XSBDYXVzZXMgdGhlIHJlc3VsdGluZyBSRSB0bwotbWF0Y2ggMCBvciAxIHJlcGV0aXRpb25zIG9mIHRoZSBwcmVjZWRpbmcgUkUuICBcY29kZXthYj99IHdpbGwKLW1hdGNoIGVpdGhlciAnYScgb3IgJ2FiJy4KLQotXGl0ZW1bXGNvZGV7XGV9XSBFaXRoZXIgZXNjYXBlcyBzcGVjaWFsIGNoYXJhY3RlcnMgKHBlcm1pdHRpbmcgeW91IHRvIG1hdGNoCi1jaGFyYWN0ZXJzIGxpa2UgJyo/K1wmXCQnKSwgb3Igc2lnbmFscyBhIHNwZWNpYWwgc2VxdWVuY2U7IHNwZWNpYWwKLXNlcXVlbmNlcyBhcmUgZGlzY3Vzc2VkIGJlbG93LiAgUmVtZW1iZXIgdGhhdCBQeXRob24gYWxzbyB1c2VzIHRoZQotYmFja3NsYXNoIGFzIGFuIGVzY2FwZSBzZXF1ZW5jZSBpbiBzdHJpbmcgbGl0ZXJhbHM7IGlmIHRoZSBlc2NhcGUKLXNlcXVlbmNlIGlzbid0IHJlY29nbml6ZWQgYnkgUHl0aG9uJ3MgcGFyc2VyLCB0aGUgYmFja3NsYXNoIGFuZAotc3Vic2VxdWVudCBjaGFyYWN0ZXIgYXJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgc3RyaW5nLiAgSG93ZXZlciwKLWlmIFB5dGhvbiB3b3VsZCByZWNvZ25pemUgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZSwgdGhlIGJhY2tzbGFzaCBzaG91bGQKLWJlIHJlcGVhdGVkIHR3aWNlLiAgCi0KLVxpdGVtW1xjb2Rle1tdfV0gVXNlZCB0byBpbmRpY2F0ZSBhIHNldCBvZiBjaGFyYWN0ZXJzLiAgQ2hhcmFjdGVycyBjYW4KLWJlIGxpc3RlZCBpbmRpdmlkdWFsbHksIG9yIGEgcmFuZ2UgaXMgaW5kaWNhdGVkIGJ5IGdpdmluZyB0d28KLWNoYXJhY3RlcnMgYW5kIHNlcGFyYXRpbmcgdGhlbSBieSBhICctJy4gIFNwZWNpYWwgY2hhcmFjdGVycyBhcmUKLW5vdCBhY3RpdmUgaW5zaWRlIHNldHMuICBGb3IgZXhhbXBsZSwgXGNvZGV7W2FrbVwkXX0KLXdpbGwgbWF0Y2ggYW55IG9mIHRoZSBjaGFyYWN0ZXJzICdhJywgJ2snLCAnbScsIG9yICdcJCc7IFxjb2Rle1thLXpdfSB3aWxsCi1tYXRjaCBhbnkgbG93ZXJjYXNlIGxldHRlci4gIAotCi1JZiB5b3Ugd2FudCB0byBpbmNsdWRlIGEgXGNvZGV7XX0gaW5zaWRlIGEKLXNldCwgaXQgbXVzdCBiZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzZXQ7IHRvIGluY2x1ZGUgYSBcY29kZXstfSwKLXBsYWNlIGl0IGFzIHRoZSBmaXJzdCBvciBsYXN0IGNoYXJhY3Rlci4gCi0KLUNoYXJhY3RlcnMgXGVtcGh7bm90fSB3aXRoaW4gYSByYW5nZSBjYW4gYmUgbWF0Y2hlZCBieSBpbmNsdWRpbmcgYQotXGNvZGV7XF59IGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHNldDsgXGNvZGV7XF59IGVsc2V3aGVyZSB3aWxsCi1zaW1wbHkgbWF0Y2ggdGhlICdcY29kZXtcXn0nIGNoYXJhY3Rlci4gIAotXGVuZHtpdGVtaXplfQotCi1UaGUgc3BlY2lhbCBzZXF1ZW5jZXMgY29uc2lzdCBvZiAnXGNvZGV7XGV9JyBhbmQgYSBjaGFyYWN0ZXIKLWZyb20gdGhlIGxpc3QgYmVsb3cuICBJZiB0aGUgb3JkaW5hcnkgY2hhcmFjdGVyIGlzIG5vdCBvbiB0aGUgbGlzdCwKLXRoZW4gdGhlIHJlc3VsdGluZyBSRSB3aWxsIG1hdGNoIHRoZSBzZWNvbmQgY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGUsCi1cY29kZXtcZVwkfSBtYXRjaGVzIHRoZSBjaGFyYWN0ZXIgJ1wkJy4gIE9uZXMgd2hlcmUgdGhlIGJhY2tzbGFzaAotc2hvdWxkIGJlIGRvdWJsZWQgaW4gc3RyaW5nIGxpdGVyYWxzIGFyZSBpbmRpY2F0ZWQuCi0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW1bXGNvZGV7XGV8fV1cY29kZXtBXGV8Qn0sIHdoZXJlIEEgYW5kIEIgY2FuIGJlIGFyYml0cmFyeSBSRXMsCi1jcmVhdGVzIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgd2lsbCBtYXRjaCBlaXRoZXIgQSBvciBCLiAgVGhpcyBjYW4KLWJlIHVzZWQgaW5zaWRlIGdyb3VwcyAoc2VlIGJlbG93KSBhcyB3ZWxsLgotJQotXGl0ZW1bXGNvZGV7XGUoIFxlKX1dIEluZGljYXRlcyB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhIGdyb3VwOyB0aGUKLWNvbnRlbnRzIG9mIGEgZ3JvdXAgY2FuIGJlIG1hdGNoZWQgbGF0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIHRoZQotXGNvZGV7XGUgWzEtOV19IHNwZWNpYWwgc2VxdWVuY2UsIGRlc2NyaWJlZCBuZXh0LgotXGVuZHtpdGVtaXplfQotCi1cYmVnaW57ZnVsbGxpbmVpdGVtc30KLVxpdGVtW1xjb2Rle1xlIFxlIDEsIC4uLiBcZSBcZSA3LCBcZSA4LCBcZSA5fV0KLU1hdGNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBncm91cCBvZiB0aGUgc2FtZQotbnVtYmVyLiAgRm9yIGV4YW1wbGUsIFxjb2Rle1xlICguK1xlICkgXGUgXGUgMX0gbWF0Y2hlcyAndGhlIHRoZScgb3IKLSc1NSA1NScsIGJ1dCBub3QgJ3RoZSBlbmQnIChub3RlIHRoZSBzcGFjZSBhZnRlciB0aGUgZ3JvdXApLiAgVGhpcwotc3BlY2lhbCBzZXF1ZW5jZSBjYW4gb25seSBiZSB1c2VkIHRvIG1hdGNoIG9uZSBvZiB0aGUgZmlyc3QgOSBncm91cHM7Ci1ncm91cHMgd2l0aCBoaWdoZXIgbnVtYmVycyBjYW4gYmUgbWF0Y2hlZCB1c2luZyB0aGUgXGNvZGV7XGUgdn0KLXNlcXVlbmNlLiAgKFxjb2Rle1xlIDh9IGFuZCBcY29kZXtcZSA5fSBkb24ndCBuZWVkIGEgZG91YmxlIGJhY2tzbGFzaAotYmVjYXVzZSB0aGV5IGFyZSBub3Qgb2N0YWwgZGlnaXRzLikKLVxlbmR7ZnVsbGxpbmVpdGVtc30KLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbVtcY29kZXtcZSBcZSBifV0gTWF0Y2hlcyB0aGUgZW1wdHkgc3RyaW5nLCBidXQgb25seSBhdCB0aGUKLWJlZ2lubmluZyBvciBlbmQgb2YgYSB3b3JkLiAgQSB3b3JkIGlzIGRlZmluZWQgYXMgYSBzZXF1ZW5jZSBvZgotYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIHNvIHRoZSBlbmQgb2YgYSB3b3JkIGlzIGluZGljYXRlZCBieQotd2hpdGVzcGFjZSBvciBhIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyLgotJQotXGl0ZW1bXGNvZGV7XGUgQn1dIE1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZywgYnV0IHdoZW4gaXQgaXMgXGVtcGh7bm90fSBhdCB0aGUKLWJlZ2lubmluZyBvciBlbmQgb2YgYSB3b3JkLgotJQotXGl0ZW1bXGNvZGV7XGUgdn1dIE11c3QgYmUgZm9sbG93ZWQgYnkgYSB0d28gZGlnaXQgZGVjaW1hbCBudW1iZXIsIGFuZAotbWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlIGdyb3VwIG9mIHRoZSBzYW1lIG51bWJlci4gIFRoZSBncm91cAotbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5OSwgaW5jbHVzaXZlLgotJQotXGl0ZW1bXGNvZGV7XGUgd31dTWF0Y2hlcyBhbnkgYWxwaGFudW1lcmljIGNoYXJhY3RlcjsgdGhpcyBpcwotZXF1aXZhbGVudCB0byB0aGUgc2V0IFxjb2Rle1thLXpBLVowLTldfS4KLSUKLVxpdGVtW1xjb2Rle1xlIFd9XSBNYXRjaGVzIGFueSBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcjsgdGhpcyBpcwotZXF1aXZhbGVudCB0byB0aGUgc2V0IFxjb2Rle1tcXmEtekEtWjAtOV19LgotXGl0ZW1bXGNvZGV7XGUgPH1dIE1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZywgYnV0IG9ubHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhCi13b3JkLiAgQSB3b3JkIGlzIGRlZmluZWQgYXMgYSBzZXF1ZW5jZSBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgc28KLXRoZSBlbmQgb2YgYSB3b3JkIGlzIGluZGljYXRlZCBieSB3aGl0ZXNwYWNlIG9yIGEgbm9uLWFscGhhbnVtZXJpYyAKLWNoYXJhY3Rlci4KLVxpdGVtW1xjb2Rle1xlID59XSBNYXRjaGVzIHRoZSBlbXB0eSBzdHJpbmcsIGJ1dCBvbmx5IGF0IHRoZSBlbmQgb2YgYQotd29yZC4KLQotXGl0ZW1bXGNvZGV7XGUgXGUgXGUgXGV9XSBNYXRjaGVzIGEgbGl0ZXJhbCBiYWNrc2xhc2guCi0KLSUgSW4gRW1hY3MsIHRoZSBmb2xsb3dpbmcgdHdvIGFyZSBzdGFydCBvZiBidWZmZXIvZW5kIG9mIGJ1ZmZlci4gIEluCi0lIFB5dGhvbiB0aGV5IHNlZW0gdG8gYmUgc3lub255bXMgZm9yIF4kLgotXGl0ZW1bXGNvZGV7XGUgYH1dIExpa2UgXGNvZGV7XF59LCB0aGlzIG9ubHkgbWF0Y2hlcyBhdCB0aGUgc3RhcnQgb2YgdGhlCi1zdHJpbmcuCi1caXRlbVtcY29kZXtcZSBcZSAnfV0gTGlrZSBcY29kZXtcJH0sIHRoaXMgb25seSBtYXRjaGVzIGF0IHRoZSBlbmQgb2YKLXRoZSBzdHJpbmcuCi0lIGVuZCBvZiBidWZmZXIKLVxlbmR7aXRlbWl6ZX0KLQotXHN1YnNlY3Rpb257TW9kdWxlIENvbnRlbnRzfQotXG5vZGVuYW1le0NvbnRlbnRzIG9mIE1vZHVsZSByZWdleH0KLQotVGhlIG1vZHVsZSBkZWZpbmVzIHRoZXNlIGZ1bmN0aW9ucywgYW5kIGFuIGV4Y2VwdGlvbjoKLQotCi1cYmVnaW57ZnVuY2Rlc2N9e21hdGNofXtwYXR0ZXJuLCBzdHJpbmd9Ci0gIFJldHVybiBob3cgbWFueSBjaGFyYWN0ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgXHZhcntzdHJpbmd9IG1hdGNoCi0gIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gXHZhcntwYXR0ZXJufS4gIFJldHVybiBcY29kZXstMX0gaWYgdGhlCi0gIHN0cmluZyBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVybiAodGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhCi0gIHplcm8tbGVuZ3RoIG1hdGNoISkuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NlYXJjaH17cGF0dGVybiwgc3RyaW5nfQotICBSZXR1cm4gdGhlIGZpcnN0IHBvc2l0aW9uIGluIFx2YXJ7c3RyaW5nfSB0aGF0IG1hdGNoZXMgdGhlIHJlZ3VsYXIKLSAgZXhwcmVzc2lvbiBcdmFye3BhdHRlcm59LiAgUmV0dXJuIFxjb2Rley0xfSBpZiBubyBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nCi0gIG1hdGNoZXMgdGhlIHBhdHRlcm4gKHRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSB6ZXJvLWxlbmd0aCBtYXRjaAotICBhbnl3aGVyZSEpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjb21waWxlfXtwYXR0ZXJuXG9wdGlvbmFseywgdHJhbnNsYXRlfX0KLSAgQ29tcGlsZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIGludG8gYSByZWd1bGFyIGV4cHJlc3Npb24KLSAgb2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgbWF0Y2hpbmcgdXNpbmcgaXRzIFxjb2Rle21hdGNoKCl9IGFuZAotICBcY29kZXtzZWFyY2goKX0gbWV0aG9kcywgZGVzY3JpYmVkIGJlbG93LiAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50Ci0gIFx2YXJ7dHJhbnNsYXRlfSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIDI1Ni1jaGFyYWN0ZXIgc3RyaW5nCi0gIGluZGljYXRpbmcgaG93IGNoYXJhY3RlcnMgKGJvdGggb2YgdGhlIHBhdHRlcm4gYW5kIG9mIHRoZSBzdHJpbmdzIHRvCi0gIGJlIG1hdGNoZWQpIGFyZSB0cmFuc2xhdGVkIGJlZm9yZSBjb21wYXJpbmcgdGhlbTsgdGhlIFx2YXJ7aX0tdGgKLSAgZWxlbWVudCBvZiB0aGUgc3RyaW5nIGdpdmVzIHRoZSB0cmFuc2xhdGlvbiBmb3IgdGhlIGNoYXJhY3RlciB3aXRoCi0gIFxBU0NJSXt9IGNvZGUgXHZhcntpfS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50Ci0gIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmc7IHNlZSB0aGUgXGNvZGV7Y2FzZWZvbGR9IGRhdGEgaXRlbSBiZWxvdy4KLQotICBUaGUgc2VxdWVuY2UKLQotXGJlZ2lue3ZlcmJhdGltfQotcHJvZyA9IHJlZ2V4LmNvbXBpbGUocGF0KQotcmVzdWx0ID0gcHJvZy5tYXRjaChzdHIpCi1cZW5ke3ZlcmJhdGltfQotJQotaXMgZXF1aXZhbGVudCB0bwotCi1cYmVnaW57dmVyYmF0aW19Ci1yZXN1bHQgPSByZWdleC5tYXRjaChwYXQsIHN0cikKLVxlbmR7dmVyYmF0aW19Ci0KLWJ1dCB0aGUgdmVyc2lvbiB1c2luZyBcY29kZXtjb21waWxlKCl9IGlzIG1vcmUgZWZmaWNpZW50IHdoZW4gbXVsdGlwbGUKLXJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHVzZWQgY29uY3VycmVudGx5IGluIGEgc2luZ2xlIHByb2dyYW0uICAoVGhlCi1jb21waWxlZCB2ZXJzaW9uIG9mIHRoZSBsYXN0IHBhdHRlcm4gcGFzc2VkIHRvIFxjb2Rle3JlZ2V4Lm1hdGNoKCl9IG9yCi1cY29kZXtyZWdleC5zZWFyY2goKX0gaXMgY2FjaGVkLCBzbyBwcm9ncmFtcyB0aGF0IHVzZSBvbmx5IGEgc2luZ2xlCi1yZWd1bGFyIGV4cHJlc3Npb24gYXQgYSB0aW1lIG5lZWRuJ3Qgd29ycnkgYWJvdXQgY29tcGlsaW5nIHJlZ3VsYXIKLWV4cHJlc3Npb25zLikKLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2V0X3N5bnRheH17ZmxhZ3N9Ci0gIFNldCB0aGUgc3ludGF4IHRvIGJlIHVzZWQgYnkgZnV0dXJlIGNhbGxzIHRvIFxjb2Rle2NvbXBpbGUoKX0sCi0gIFxjb2Rle21hdGNoKCl9IGFuZCBcY29kZXtzZWFyY2goKX0uICAoQWxyZWFkeSBjb21waWxlZCBleHByZXNzaW9uCi0gIG9iamVjdHMgYXJlIG5vdCBhZmZlY3RlZC4pICBUaGUgYXJndW1lbnQgaXMgYW4gaW50ZWdlciB3aGljaCBpcyB0aGUKLSAgT1Igb2Ygc2V2ZXJhbCBmbGFnIGJpdHMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBwcmV2aW91cyB2YWx1ZSBvZgotICB0aGUgc3ludGF4IGZsYWdzLiAgTmFtZXMgZm9yIHRoZSBmbGFncyBhcmUgZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQKLSAgbW9kdWxlIFxjb2Rle3JlZ2V4X3N5bnRheH1ccmVmc3Rtb2RpbmRleHtyZWdleF9zeW50YXh9OyByZWFkIHRoZQotICBmaWxlIFxmaWxle3JlZ2V4X3N5bnRheC5weX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dldF9zeW50YXh9e30KLSAgUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3ludGF4IGZsYWdzIGFzIGFuIGludGVnZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3N5bWNvbXB9e3BhdHRlcm5cb3B0aW9uYWx7LCB0cmFuc2xhdGV9fQotVGhpcyBpcyBsaWtlIFxjb2Rle2NvbXBpbGUoKX0sIGJ1dCBzdXBwb3J0cyBzeW1ib2xpYyBncm91cCBuYW1lczogaWYgYQotcGFyZW50aGVzaXMtZW5jbG9zZWQgZ3JvdXAgYmVnaW5zIHdpdGggYSBncm91cCBuYW1lIGluIGFuZ3VsYXIKLWJyYWNrZXRzLCBlLmcuIFxjb2RleydcZSg8aWQ+W2Etel1bYS16MC05XSpcZSknfSwgdGhlIGdyb3VwIGNhbgotYmUgcmVmZXJlbmNlZCBieSBpdHMgbmFtZSBpbiBhcmd1bWVudHMgdG8gdGhlIFxjb2Rle2dyb3VwKCl9IG1ldGhvZCBvZgotdGhlIHJlc3VsdGluZyBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LCBsaWtlIHRoaXM6Ci1cY29kZXtwLmdyb3VwKCdpZCcpfS4gIEdyb3VwIG5hbWVzIG1heSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzCi1hbmQgXGNvZGV7J18nfSBvbmx5LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2V4Y2Rlc2N9e2Vycm9yfQotICBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYSBzdHJpbmcgcGFzc2VkIHRvIG9uZSBvZiB0aGUgZnVuY3Rpb25zIGhlcmUKLSAgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uIChlLmcuLCB1bm1hdGNoZWQgcGFyZW50aGVzZXMpIG9yCi0gIHdoZW4gc29tZSBvdGhlciBlcnJvciBvY2N1cnMgZHVyaW5nIGNvbXBpbGF0aW9uIG9yIG1hdGNoaW5nLiAgKEl0IGlzCi0gIG5ldmVyIGFuIGVycm9yIGlmIGEgc3RyaW5nIGNvbnRhaW5zIG5vIG1hdGNoIGZvciBhIHBhdHRlcm4uKQotXGVuZHtleGNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2Nhc2Vmb2xkfQotQSBzdHJpbmcgc3VpdGFibGUgdG8gcGFzcyBhcyB0aGUgXHZhcnt0cmFuc2xhdGV9IGFyZ3VtZW50IHRvCi1cY29kZXtjb21waWxlKCl9IHRvIG1hcCBhbGwgdXBwZXIgY2FzZSBjaGFyYWN0ZXJzIHRvIHRoZWlyIGxvd2VyY2FzZQotZXF1aXZhbGVudHMuCi1cZW5ke2RhdGFkZXNjfQotCi1cbm9pbmRlbnQKLUNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzIHN1cHBvcnQgdGhlc2UgbWV0aG9kczoKLQotXHNldGluZGV4c3ViaXRlbXsocmVnZXggbWV0aG9kKX0KLVxiZWdpbntmdW5jZGVzY317bWF0Y2h9e3N0cmluZ1xvcHRpb25hbHssIHBvc319Ci0gIFJldHVybiBob3cgbWFueSBjaGFyYWN0ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgXHZhcntzdHJpbmd9IG1hdGNoCi0gIHRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24uICBSZXR1cm4gXGNvZGV7LTF9IGlmIHRoZSBzdHJpbmcKLSAgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gKHRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSB6ZXJvLWxlbmd0aAotICBtYXRjaCEpLgotICAKLSAgVGhlIG9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXIsIFx2YXJ7cG9zfSwgZ2l2ZXMgYW4gaW5kZXggaW4gdGhlIHN0cmluZwotICB3aGVyZSB0aGUgc2VhcmNoIGlzIHRvIHN0YXJ0OyBpdCBkZWZhdWx0cyB0byBcY29kZXswfS4gIFRoaXMgaXMgbm90Ci0gIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0byBzbGljaW5nIHRoZSBzdHJpbmc7IHRoZSBcY29kZXsnXF4nfSBwYXR0ZXJuCi0gIGNoYXJhY3RlciBtYXRjaGVzIGF0IHRoZSByZWFsIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIGFuZCBhdCBwb3NpdGlvbnMKLSAganVzdCBhZnRlciBhIG5ld2xpbmUsIG5vdCBuZWNlc3NhcmlseSBhdCB0aGUgaW5kZXggd2hlcmUgdGhlIHNlYXJjaAotICBpcyB0byBzdGFydC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c2VhcmNofXtzdHJpbmdcb3B0aW9uYWx7LCBwb3N9fQotICBSZXR1cm4gdGhlIGZpcnN0IHBvc2l0aW9uIGluIFx2YXJ7c3RyaW5nfSB0aGF0IG1hdGNoZXMgdGhlIHJlZ3VsYXIKLSAgZXhwcmVzc2lvbiBcY29kZXtwYXR0ZXJufS4gIFJldHVybiBcY29kZXstMX0gaWYgbm8gcG9zaXRpb24gaW4gdGhlCi0gIHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuICh0aGlzIGlzIGRpZmZlcmVudCBmcm9tIGEgemVyby1sZW5ndGgKLSAgbWF0Y2ggYW55d2hlcmUhKS4KLSAgCi0gIFRoZSBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvciB0aGUKLSAgXGNvZGV7bWF0Y2goKX0gbWV0aG9kLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtncm91cH17aW5kZXgsIGluZGV4LCAuLi59Ci1UaGlzIG1ldGhvZCBpcyBvbmx5IHZhbGlkIHdoZW4gdGhlIGxhc3QgY2FsbCB0byB0aGUgXGNvZGV7bWF0Y2goKX0KLW9yIFxjb2Rle3NlYXJjaCgpfSBtZXRob2QgZm91bmQgYSBtYXRjaC4gIEl0IHJldHVybnMgb25lIG9yIG1vcmUKLWdyb3VwcyBvZiB0aGUgbWF0Y2guICBJZiB0aGVyZSBpcyBhIHNpbmdsZSBcdmFye2luZGV4fSBhcmd1bWVudCwKLXRoZSByZXN1bHQgaXMgYSBzaW5nbGUgc3RyaW5nOyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgYXJndW1lbnRzLCB0aGUKLXJlc3VsdCBpcyBhIHR1cGxlIHdpdGggb25lIGl0ZW0gcGVyIGFyZ3VtZW50LiAgSWYgdGhlIFx2YXJ7aW5kZXh9IGlzCi16ZXJvLCB0aGUgY29ycmVzcG9uZGluZyByZXR1cm4gdmFsdWUgaXMgdGhlIGVudGlyZSBtYXRjaGluZyBzdHJpbmc7IGlmCi1pdCBpcyBpbiB0aGUgaW5jbHVzaXZlIHJhbmdlIFsxLi45OV0sIGl0IGlzIHRoZSBzdHJpbmcgbWF0Y2hpbmcgdGhlCi1jb3JyZXNwb25kaW5nIHBhcmVudGhlc2l6ZWQgZ3JvdXAgKHVzaW5nIHRoZSBkZWZhdWx0IHN5bnRheCwKLWdyb3VwcyBhcmUgcGFyZW50aGVzaXplZCB1c2luZyBcY29kZXt7XGV9KH0gYW5kIFxjb2Rle3tcZX0pfSkuICBJZiBubwotc3VjaCBncm91cCBleGlzdHMsIHRoZSBjb3JyZXNwb25kaW5nIHJlc3VsdCBpcyBcY29kZXtOb25lfS4KLQotSWYgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB3YXMgY29tcGlsZWQgYnkgXGNvZGV7c3ltY29tcCgpfSBpbnN0ZWFkIG9mCi1cY29kZXtjb21waWxlKCl9LCB0aGUgXHZhcntpbmRleH0gYXJndW1lbnRzIG1heSBhbHNvIGJlIHN0cmluZ3MKLWlkZW50aWZ5aW5nIGdyb3VwcyBieSB0aGVpciBncm91cCBuYW1lLgotXGVuZHtmdW5jZGVzY30KLQotXG5vaW5kZW50Ci1Db21waWxlZCByZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnQgdGhlc2UgZGF0YSBhdHRyaWJ1dGVzOgotCi1cc2V0aW5kZXhzdWJpdGVteyhyZWdleCBhdHRyaWJ1dGUpfQotCi1cYmVnaW57ZGF0YWRlc2N9e3JlZ3N9Ci1XaGVuIHRoZSBsYXN0IGNhbGwgdG8gdGhlIFxjb2Rle21hdGNoKCl9IG9yIFxjb2Rle3NlYXJjaCgpfSBtZXRob2QgZm91bmQgYQotbWF0Y2gsIHRoaXMgaXMgYSB0dXBsZSBvZiBwYWlycyBvZiBpbmRleGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi1iZWdpbm5pbmcgYW5kIGVuZCBvZiBhbGwgcGFyZW50aGVzaXplZCBncm91cHMgaW4gdGhlIHBhdHRlcm4uICBJbmRpY2VzCi1hcmUgcmVsYXRpdmUgdG8gdGhlIHN0cmluZyBhcmd1bWVudCBwYXNzZWQgdG8gXGNvZGV7bWF0Y2goKX0gb3IKLVxjb2Rle3NlYXJjaCgpfS4gIFRoZSAwLXRoIHR1cGxlIGdpdmVzIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvciB0aGUKLXdob2xlIHBhdHRlcm4uICBXaGVuIHRoZSBsYXN0IG1hdGNoIG9yIHNlYXJjaCBmYWlsZWQsIHRoaXMgaXMKLVxjb2Rle05vbmV9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtsYXN0fQotV2hlbiB0aGUgbGFzdCBjYWxsIHRvIHRoZSBcY29kZXttYXRjaCgpfSBvciBcY29kZXtzZWFyY2goKX0gbWV0aG9kIGZvdW5kIGEKLW1hdGNoLCB0aGlzIGlzIHRoZSBzdHJpbmcgYXJndW1lbnQgcGFzc2VkIHRvIHRoYXQgbWV0aG9kLiAgV2hlbiB0aGUKLWxhc3QgbWF0Y2ggb3Igc2VhcmNoIGZhaWxlZCwgdGhpcyBpcyBcY29kZXtOb25lfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317dHJhbnNsYXRlfQotVGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIFx2YXJ7dHJhbnNsYXRlfSBhcmd1bWVudCB0bwotXGNvZGV7cmVnZXguY29tcGlsZSgpfSB0aGF0IGNyZWF0ZWQgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LiAgSWYKLXRoZSBcdmFye3RyYW5zbGF0ZX0gYXJndW1lbnQgd2FzIG9taXR0ZWQgaW4gdGhlIFxjb2Rle3JlZ2V4LmNvbXBpbGUoKX0KLWNhbGwsIHRoaXMgaXMgXGNvZGV7Tm9uZX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e2dpdmVucGF0fQotVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIGFzIHBhc3NlZCB0byBcY29kZXtjb21waWxlKCl9IG9yCi1cY29kZXtzeW1jb21wKCl9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtyZWFscGF0fQotVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhZnRlciBzdHJpcHBpbmcgdGhlIGdyb3VwIG5hbWVzIGZvciByZWd1bGFyCi1leHByZXNzaW9ucyBjb21waWxlZCB3aXRoIFxjb2Rle3N5bWNvbXAoKX0uICBTYW1lIGFzIFxjb2Rle2dpdmVucGF0fQotb3RoZXJ3aXNlLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtncm91cGluZGV4fQotQSBkaWN0aW9uYXJ5IGdpdmluZyB0aGUgbWFwcGluZyBmcm9tIHN5bWJvbGljIGdyb3VwIG5hbWVzIHRvIG51bWVyaWNhbAotZ3JvdXAgaW5kZXhlcyBmb3IgcmVndWxhciBleHByZXNzaW9ucyBjb21waWxlZCB3aXRoIFxjb2Rle3N5bWNvbXAoKX0uCi1cY29kZXtOb25lfSBvdGhlcndpc2UuCi1cZW5ke2RhdGFkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJyZWdzdWIudGV4IGIvRG9jL2xpYi9saWJyZWdzdWIudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDFiNzAwLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicmVnc3ViLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7cmVnc3VifSAtLS0KLSAgICAgICAgIFN0cmluZyBvcGVyYXRpb25zIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtyZWdzdWJ9Ci1cbW9kdWxlc3lub3BzaXN7U3Vic3RpdHV0aW9uIGFuZCBzcGxpdHRpbmcgb3BlcmF0aW9ucyB0aGF0IHVzZQotICAgICAgICAgICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBcc3Ryb25ne09ic29sZXRlIX19Ci0KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyBhIG51bWJlciBvZiBmdW5jdGlvbnMgdXNlZnVsIGZvciB3b3JraW5nIHdpdGgKLXJlZ3VsYXIgZXhwcmVzc2lvbnMgKHNlZSBidWlsdC1pbiBtb2R1bGUgXHJlZm1vZHVsZXtyZWdleH0pLgotCi1XYXJuaW5nOiB0aGVzZSBmdW5jdGlvbnMgYXJlIG5vdCB0aHJlYWQtc2FmZS4KLQotXHN0cm9uZ3tPYnNvbGVzY2VuY2Ugbm90ZTp9Ci1UaGlzIG1vZHVsZSBpcyBvYnNvbGV0ZSBhcyBvZiBQeXRob24gdmVyc2lvbiAxLjU7IGl0IGlzIHN0aWxsIGJlaW5nCi1tYWludGFpbmVkIGJlY2F1c2UgbXVjaCBleGlzdGluZyBjb2RlIHN0aWxsIHVzZXMgaXQuICBBbGwgbmV3IGNvZGUgaW4KLW5lZWQgb2YgcmVndWxhciBleHByZXNzaW9ucyBzaG91bGQgdXNlIHRoZSBuZXcgXHJlZm1vZHVsZXtyZX0gbW9kdWxlLCB3aGljaAotc3VwcG9ydHMgdGhlIG1vcmUgcG93ZXJmdWwgYW5kIHJlZ3VsYXIgUGVybC1zdHlsZSByZWd1bGFyIGV4cHJlc3Npb25zLgotRXhpc3RpbmcgY29kZSBzaG91bGQgYmUgY29udmVydGVkLiAgVGhlIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlCi1cbW9kdWxle3JlY29udmVydH0gaGVscHMgaW4gY29udmVydGluZyBccmVmbW9kdWxle3JlZ2V4fSBzdHlsZSByZWd1bGFyCi1leHByZXNzaW9ucyB0byBccmVmbW9kdWxle3JlfSBzdHlsZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgKEZvciBtb3JlCi1jb252ZXJzaW9uIGhlbHAsIHNlZSBBbmRyZXcgS3VjaGxpbmcnc1xpbmRleHtLdWNobGluZywgQW5kcmV3fQotYGByZWdleC10by1yZSBIT1dUTycnIGF0Ci1cdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvaG93dG8vcmVnZXgtdG8tcmUvfS4pCi0KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdWJ9e3BhdCwgcmVwbCwgc3RyfQotUmVwbGFjZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBwYXR0ZXJuIFx2YXJ7cGF0fSBpbiBzdHJpbmcKLVx2YXJ7c3RyfSBieSByZXBsYWNlbWVudCBcdmFye3JlcGx9LiAgSWYgdGhlIHBhdHRlcm4gaXNuJ3QgZm91bmQsCi10aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4gIFRoZSBwYXR0ZXJuIG1heSBiZSBhIHN0cmluZyBvciBhbgotYWxyZWFkeSBjb21waWxlZCBwYXR0ZXJuLiAgVGhlIHJlcGxhY2VtZW50IG1heSBjb250YWluIHJlZmVyZW5jZXMKLVxzYW1we1xlIFx2YXJ7ZGlnaXR9fSB0byBzdWJwYXR0ZXJucyBhbmQgZXNjYXBlZCBiYWNrc2xhc2hlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z3N1Yn17cGF0LCByZXBsLCBzdHJ9Ci1SZXBsYWNlIGFsbCAobm9uLW92ZXJsYXBwaW5nKSBvY2N1cnJlbmNlcyBvZiBwYXR0ZXJuIFx2YXJ7cGF0fSBpbgotc3RyaW5nIFx2YXJ7c3RyfSBieSByZXBsYWNlbWVudCBcdmFye3JlcGx9LiAgVGhlIHNhbWUgcnVsZXMgYXMgZm9yCi1cY29kZXtzdWIoKX0gYXBwbHkuICBFbXB0eSBtYXRjaGVzIGZvciB0aGUgcGF0dGVybiBhcmUgcmVwbGFjZWQgb25seQotd2hlbiBub3QgYWRqYWNlbnQgdG8gYSBwcmV2aW91cyBtYXRjaCwgc28gZS5nLgotXGNvZGV7Z3N1YignJywgJy0nLCAnYWJjJyl9IHJldHVybnMgXGNvZGV7Jy1hLWItYy0nfS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317c3BsaXR9e3N0ciwgcGF0XG9wdGlvbmFseywgbWF4c3BsaXR9fQotU3BsaXQgdGhlIHN0cmluZyBcdmFye3N0cn0gaW4gZmllbGRzIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXJzIG1hdGNoaW5nCi10aGUgcGF0dGVybiBcdmFye3BhdH0sIGFuZCByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGZpZWxkcy4gIE9ubHkKLW5vbi1lbXB0eSBtYXRjaGVzIGZvciB0aGUgcGF0dGVybiBhcmUgY29uc2lkZXJlZCwgc28gZS5nLgotXGNvZGV7c3BsaXQoJ2E6YicsICc6KicpfSByZXR1cm5zIFxjb2Rle1snYScsICdiJ119IGFuZAotXGNvZGV7c3BsaXQoJ2FiYycsICcnKX0gcmV0dXJucyBcY29kZXtbJ2FiYyddfS4gIFRoZSBcdmFye21heHNwbGl0fQotZGVmYXVsdHMgdG8gMC4gSWYgaXQgaXMgbm9uemVybywgb25seSBcdmFye21heHNwbGl0fSBudW1iZXIgb2Ygc3BsaXRzCi1vY2N1ciwgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZCBhcyB0aGUgZmluYWwKLWVsZW1lbnQgb2YgdGhlIGxpc3QuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NwbGl0eH17c3RyLCBwYXRcb3B0aW9uYWx7LCBtYXhzcGxpdH19Ci1TcGxpdCB0aGUgc3RyaW5nIFx2YXJ7c3RyfSBpbiBmaWVsZHMgc2VwYXJhdGVkIGJ5IGRlbGltaXRlcnMgbWF0Y2hpbmcKLXRoZSBwYXR0ZXJuIFx2YXJ7cGF0fSwgYW5kIHJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgZmllbGRzIGFzIHdlbGwKLWFzIHRoZSBzZXBhcmF0b3JzLiAgRm9yIGV4YW1wbGUsIFxjb2Rle3NwbGl0eCgnYTo6OmInLCAnOionKX0gcmV0dXJucwotXGNvZGV7WydhJywgJzo6OicsICdiJ119LiAgT3RoZXJ3aXNlLCB0aGlzIGZ1bmN0aW9uIGJlaGF2ZXMgdGhlIHNhbWUKLWFzIFxjb2Rle3NwbGl0fS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2Fwd29yZHN9e3Ncb3B0aW9uYWx7LCBwYXR9fQotQ2FwaXRhbGl6ZSB3b3JkcyBzZXBhcmF0ZWQgYnkgb3B0aW9uYWwgcGF0dGVybiBcdmFye3BhdH0uICBUaGUgZGVmYXVsdAotcGF0dGVybiB1c2VzIGFueSBjaGFyYWN0ZXJzIGV4Y2VwdCBsZXR0ZXJzLCBkaWdpdHMgYW5kIHVuZGVyc2NvcmVzIGFzCi13b3JkIGRlbGltaXRlcnMuICBDYXBpdGFsaXphdGlvbiBpcyBkb25lIGJ5IGNoYW5naW5nIHRoZSBmaXJzdAotY2hhcmFjdGVyIG9mIGVhY2ggd29yZCB0byB1cHBlciBjYXNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtjbGVhcl9jYWNoZX17fQotVGhlIHJlZ3N1YiBtb2R1bGUgbWFpbnRhaW5zIGEgY2FjaGUgb2YgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9ucywKLWtleWVkIG9uIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5nIGFuZCB0aGUgc3ludGF4IG9mIHRoZSByZWdleAotbW9kdWxlIGF0IHRoZSB0aW1lIHRoZSBleHByZXNzaW9uIHdhcyBjb21waWxlZC4gIFRoaXMgZnVuY3Rpb24gY2xlYXJzCi10aGF0IGNhY2hlLgotXGVuZHtmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicnVucHkudGV4IGIvRG9jL2xpYi9saWJydW5weS50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlOTkwMQotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvbGlicnVucHkudGV4CkBAIC0wLDAgKzEsNzQgQEAKK1xzZWN0aW9ue1xtb2R1bGV7cnVucHl9IC0tLQorICAgICAgICAgTG9jYXRpbmcgYW5kIGV4ZWN1dGluZyBQeXRob24gbW9kdWxlcy59CisKK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtydW5weX0JCSUgc3RhbmRhcmQgbGlicmFyeSwgaW4gUHl0aG9uCisKK1xtb2R1bGVhdXRob3J7TmljayBDb2dobGFufXtuY29naGxhbkBnbWFpbC5jb219CisKK1xtb2R1bGVzeW5vcHNpc3tMb2NhdGUgYW5kIGV4ZWN1dGUgUHl0aG9uIG1vZHVsZXMgYXMgc2NyaXB0c30KKworXHZlcnNpb25hZGRlZHsyLjV9CisKK1RoZSBcbW9kdWxle3J1bnB5fSBtb2R1bGUgaXMgdXNlZCB0byBsb2NhdGUgYW5kIHJ1biBQeXRob24gbW9kdWxlcword2l0aG91dCBpbXBvcnRpbmcgdGhlbSBmaXJzdC4gSXQncyBtYWluIHVzZSBpcyB0byBpbXBsZW1lbnQgdGhlCitccHJvZ3JhbW9wdHstbX0gY29tbWFuZCBsaW5lIHN3aXRjaCB0aGF0IGFsbG93cyBzY3JpcHRzIHRvIGJlIGxvY2F0ZWQKK3VzaW5nIHRoZSBQeXRob24gbW9kdWxlIG5hbWVzcGFjZSByYXRoZXIgdGhhbiB0aGUgZmlsZXN5c3RlbS4KKworV2hlbiBleGVjdXRlZCBhcyBhIHNjcmlwdCwgdGhlIG1vZHVsZSBlZmZlY3RpdmVseSBvcGVyYXRlcyBhcyBmb2xsb3dzOgorXGJlZ2lue3ZlcmJhdGltfQorICAgIGRlbCBzeXMuYXJndlswXSAgIyBSZW1vdmUgdGhlIHJ1bnB5IG1vZHVsZSBmcm9tIHRoZSBhcmd1bWVudHMKKyAgICBydW5fbW9kdWxlKHN5cy5hcmd2WzBdLCBydW5fbmFtZT0iX19tYWluX18iLCBhbHRlcl9zeXM9VHJ1ZSkKK1xlbmR7dmVyYmF0aW19CisKK1RoZSBcbW9kdWxle3J1bnB5fSBtb2R1bGUgcHJvdmlkZXMgYSBzaW5nbGUgZnVuY3Rpb246CisKK1xiZWdpbntmdW5jZGVzY317cnVuX21vZHVsZX17bW9kX25hbWVcb3B0aW9uYWx7LCBpbml0X2dsb2JhbHN9Citcb3B0aW9uYWx7LCBydW5fbmFtZX1cb3B0aW9uYWx7LCBhbHRlcl9zeXN9fQorRXhlY3V0ZSB0aGUgY29kZSBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcKK21vZHVsZSBnbG9iYWxzIGRpY3Rpb25hcnkuIFRoZSBtb2R1bGUncyBjb2RlIGlzIGZpcnN0IGxvY2F0ZWQgdXNpbmcKK3RoZSBzdGFuZGFyZCBpbXBvcnQgbWVjaGFuaXNtIChyZWZlciB0byBQRVAgMzAyIGZvciBkZXRhaWxzKSBhbmQKK3RoZW4gZXhlY3V0ZWQgaW4gYSBmcmVzaCBtb2R1bGUgbmFtZXNwYWNlLgorCitUaGUgb3B0aW9uYWwgZGljdGlvbmFyeSBhcmd1bWVudCBcdmFye2luaXRfZ2xvYmFsc30gbWF5IGJlIHVzZWQgdG8KK3ByZS1wb3B1bGF0ZSB0aGUgZ2xvYmFscyBkaWN0aW9uYXJ5IGJlZm9yZSB0aGUgY29kZSBpcyBleGVjdXRlZC4KK1RoZSBzdXBwbGllZCBkaWN0aW9uYXJ5IHdpbGwgbm90IGJlIG1vZGlmaWVkLiBJZiBhbnkgb2YgdGhlIHNwZWNpYWwKK2dsb2JhbCB2YXJpYWJsZXMgYmVsb3cgYXJlIGRlZmluZWQgaW4gdGhlIHN1cHBsaWVkIGRpY3Rpb25hcnksIHRob3NlCitkZWZpbml0aW9ucyBhcmUgb3ZlcnJpZGRlbiBieSB0aGUgXGNvZGV7cnVuX21vZHVsZX0gZnVuY3Rpb24uCisKK1RoZSBzcGVjaWFsIGdsb2JhbCB2YXJpYWJsZXMgXGNvZGV7X19uYW1lX199LCBcY29kZXtfX2ZpbGVfX30sCitcY29kZXtfX2xvYWRlcl9ffSBhbmQgXGNvZGV7X19idWlsdGluc19ffSBhcmUgc2V0IGluIHRoZSBnbG9iYWxzCitkaWN0aW9uYXJ5IGJlZm9yZSB0aGUgbW9kdWxlIGNvZGUgaXMgZXhlY3V0ZWQuCisKK1xjb2Rle19fbmFtZV9ffSBpcyBzZXQgdG8gXHZhcntydW5fbmFtZX0gaWYgdGhpcyBvcHRpb25hbCBhcmd1bWVudCBpcworc3VwcGxpZWQsIGFuZCB0aGUgXHZhcnttb2RfbmFtZX0gYXJndW1lbnQgb3RoZXJ3aXNlLgorCitcY29kZXtfX2xvYWRlcl9ffSBpcyBzZXQgdG8gdGhlIFBFUCAzMDIgbW9kdWxlIGxvYWRlciB1c2VkIHRvIHJldHJpZXZlCit0aGUgY29kZSBmb3IgdGhlIG1vZHVsZSAoVGhpcyBsb2FkZXIgbWF5IGJlIGEgd3JhcHBlciBhcm91bmQgdGhlCitzdGFuZGFyZCBpbXBvcnQgbWVjaGFuaXNtKS4KKworXGNvZGV7X19maWxlX199IGlzIHNldCB0byB0aGUgbmFtZSBwcm92aWRlZCBieSB0aGUgbW9kdWxlIGxvYWRlci4gSWYKK3RoZSBsb2FkZXIgZG9lcyBub3QgbWFrZSBmaWxlbmFtZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUsIHRoaXMKK3ZhcmlhYmxlIGlzIHNldCB0byBcY29kZXtOb25lfS4KKworXGNvZGV7X19idWlsdGluc19ffSBpcyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpc2VkIHdpdGggYSByZWZlcmVuY2UgdG8KK3RoZSB0b3AgbGV2ZWwgbmFtZXNwYWNlIG9mIHRoZSBcbW9kdWxle19fYnVpbHRpbl9ffSBtb2R1bGUuCisKK0lmIHRoZSBhcmd1bWVudCBcdmFye2FsdGVyX3N5c30gaXMgc3VwcGxpZWQgYW5kIGV2YWx1YXRlcyB0bworXGNvZGV7VHJ1ZX0sIHRoZW4gXGNvZGV7c3lzLmFyZ3ZbMF19IGlzIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWUgb2YKK1xjb2Rle19fZmlsZV9ffSBhbmQgXGNvZGV7c3lzLm1vZHVsZXNbX19uYW1lX19dfSBpcyB1cGRhdGVkIHdpdGggYQordGVtcG9yYXJ5IG1vZHVsZSBvYmplY3QgZm9yIHRoZSBtb2R1bGUgYmVpbmcgZXhlY3V0ZWQuIEJvdGgKK1xjb2Rle3N5cy5hcmd2WzBdfSBhbmQgXGNvZGV7c3lzLm1vZHVsZXNbX19uYW1lX19dfSBhcmUgcmVzdG9yZWQgdG8KK3RoZWlyIG9yaWdpbmFsIHZhbHVlcyBiZWZvcmUgdGhlIGZ1bmN0aW9uIHJldHVybnMuCisKK05vdGUgdGhhdCB0aGlzIG1hbmlwdWxhdGlvbiBvZiBcbW9kdWxle3N5c30gaXMgbm90IHRocmVhZC1zYWZlLiBPdGhlcgordGhyZWFkcyBtYXkgc2VlIHRoZSBwYXJ0aWFsbHkgaW5pdGlhbGlzZWQgbW9kdWxlLCBhcyB3ZWxsIGFzIHRoZQorYWx0ZXJlZCBsaXN0IG9mIGFyZ3VtZW50cy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgXG1vZHVsZXtzeXN9Cittb2R1bGUgYmUgbGVmdCBhbG9uZSB3aGVuIGludm9raW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aHJlYWRlZCBjb2RlLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWVwZXB7MzM4fXtFeGVjdXRpbmcgbW9kdWxlcyBhcyBzY3JpcHRzfXtQRVAgd3JpdHRlbiBhbmQgCitpbXBsZW1lbnRlZCBieSBOaWNrIENvZ2hsYW4ufQorCitcZW5ke3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNldHMudGV4IGIvRG9jL2xpYi9saWJzZXRzLnRleAppbmRleCBkZDg1ZWM3Li4yMmJmMzRiIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnNldHMudGV4CisrKyBiL0RvYy9saWIvbGlic2V0cy50ZXgKQEAgLTE1MSwxMiArMTUxLDEzIEBACiAgIFxsaW5laWlpe1x2YXJ7c30uYWRkKFx2YXJ7eH0pfXt9CiAgICAgICAgICB7YWRkIGVsZW1lbnQgXHZhcnt4fSB0byBzZXQgXHZhcntzfX0KICAgXGxpbmVpaWl7XHZhcntzfS5yZW1vdmUoXHZhcnt4fSl9e30KLSAgICAgICAgIHtyZW1vdmUgXHZhcnt4fSBmcm9tIHNldCBcdmFye3N9OyByYWlzZXMgS2V5RXJyb3IgaWYgbm90IHByZXNlbnR9CisgICAgICAgICB7cmVtb3ZlIFx2YXJ7eH0gZnJvbSBzZXQgXHZhcntzfTsgcmFpc2VzIFxleGNlcHRpb257S2V5RXJyb3J9CisJICBpZiBub3QgcHJlc2VudH0KICAgXGxpbmVpaWl7XHZhcntzfS5kaXNjYXJkKFx2YXJ7eH0pfXt9CiAgICAgICAgICB7cmVtb3ZlcyBcdmFye3h9IGZyb20gc2V0IFx2YXJ7c30gaWYgcHJlc2VudH0KICAgXGxpbmVpaWl7XHZhcntzfS5wb3AoKX17fQogICAgICAgICAge3JlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBlbGVtZW50IGZyb20gXHZhcntzfTsgcmFpc2VzCi0JICBLZXlFcnJvciBpZiBlbXB0eX0KKwkgIFxleGNlcHRpb257S2V5RXJyb3J9IGlmIGVtcHR5fQogICBcbGluZWlpaXtcdmFye3N9LmNsZWFyKCl9e30KICAgICAgICAgIHtyZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gc2V0IFx2YXJ7c319CiBcZW5ke3RhYmxlaWlpfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzZ21sbGliLnRleCBiL0RvYy9saWIvbGlic2dtbGxpYi50ZXgKaW5kZXggMjdiZjBiMC4uMTU3ODMxMyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzZ21sbGliLnRleAorKysgYi9Eb2MvbGliL2xpYnNnbWxsaWIudGV4CkBAIC05NSwxMiArOTUsMjIgQEAKIHNob3VsZCBiZSB1c2VkIHRvIHN1cHBvcnQgc2VtYW50aWMgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHN0YXJ0IHRhZy4KIFRoZSBcdmFye2F0dHJpYnV0ZXN9IGFyZ3VtZW50IGlzIGEgbGlzdCBvZiBcY29kZXsoXHZhcntuYW1lfSwKIFx2YXJ7dmFsdWV9KX0gcGFpcnMgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcyBmb3VuZCBpbnNpZGUgdGhlIHRhZydzCi1cY29kZXs8Pn0gYnJhY2tldHMuICBUaGUgXHZhcntuYW1lfSBoYXMgYmVlbiB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UKLWFuZCBkb3VibGUgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcyBpbiB0aGUgXHZhcnt2YWx1ZX0gaGF2ZSBiZWVuIGludGVycHJldGVkLgorXGNvZGV7PD59IGJyYWNrZXRzLgorCitUaGUgXHZhcntuYW1lfSBoYXMgYmVlbiB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UuCitEb3VibGUgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcyBpbiB0aGUgXHZhcnt2YWx1ZX0gaGF2ZSBiZWVuIGludGVycHJldGVkLAorYXMgd2VsbCBhcyBrbm93biBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBhbmQga25vd24gZW50aXR5IHJlZmVyZW5jZXMKK3Rlcm1pbmF0ZWQgYnkgYSBzZW1pY29sb24gKG5vcm1hbGx5LCBlbnRpdHkgcmVmZXJlbmNlcyBjYW4gYmUgdGVybWluYXRlZAorYnkgYW55IG5vbi1hbHBoYW51bWVyaWNhbCBjaGFyYWN0ZXIsIGJ1dCB0aGlzIHdvdWxkIGJyZWFrIHRoZSB2ZXJ5Citjb21tb24gY2FzZSBvZiBcY29kZXs8QSBIUkVGPSJ1cmw/c3BhbT0xXCZlZ2dzPTIiPn0gd2hlbiBcY29kZXtlZ2dzfQoraXMgYSB2YWxpZCBlbnRpdHkgbmFtZSkuCisKIEZvciBpbnN0YW5jZSwgZm9yIHRoZSB0YWcgXGNvZGV7PEEgSFJFRj0iaHR0cDovL3d3dy5jd2kubmwvIj59LCB0aGlzCiBtZXRob2Qgd291bGQgYmUgY2FsbGVkIGFzIFxzYW1we3Vua25vd25fc3RhcnR0YWcoJ2EnLCBbKCdocmVmJywKICdodHRwOi8vd3d3LmN3aS5ubC8nKV0pfS4gIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHNpbXBseSBjYWxscwogXHZhcnttZXRob2R9IHdpdGggXHZhcnthdHRyaWJ1dGVzfSBhcyB0aGUgb25seSBhcmd1bWVudC4KK1x2ZXJzaW9uYWRkZWRbSGFuZGxpbmcgb2YgZW50aXR5IGFuZCBjaGFyYWN0ZXIgcmVmZXJlbmNlcyB3aXRoaW4KKyAgICAgICAgICAgICAgYXR0cmlidXRlIHZhbHVlc117Mi41fQogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317aGFuZGxlX2VuZHRhZ317dGFnLCBtZXRob2R9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNodXRpbC50ZXggYi9Eb2MvbGliL2xpYnNodXRpbC50ZXgKaW5kZXggYTIxNzE1MC4uNDQ5ZDc0MSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzaHV0aWwudGV4CisrKyBiL0RvYy9saWIvbGlic2h1dGlsLnRleApAQCAtNzMsMTggKzczLDE4IEBACiAgIElmIFx2YXJ7c3ltbGlua3N9IGlzIHRydWUsIHN5bWJvbGljIGxpbmtzIGluCiAgIHRoZSBzb3VyY2UgdHJlZSBhcmUgcmVwcmVzZW50ZWQgYXMgc3ltYm9saWMgbGlua3MgaW4gdGhlIG5ldyB0cmVlOwogICBpZiBmYWxzZSBvciBvbWl0dGVkLCB0aGUgY29udGVudHMgb2YgdGhlIGxpbmtlZCBmaWxlcyBhcmUgY29waWVkIHRvCi0gIHRoZSBuZXcgdHJlZS4gIElmIGV4Y2VwdGlvbihzKSBvY2N1ciwgYW4gRXJyb3IgaXMgcmFpc2VkCisgIHRoZSBuZXcgdHJlZS4gIElmIGV4Y2VwdGlvbihzKSBvY2N1ciwgYW4gXGV4Y2VwdGlvbntFcnJvcn0gaXMgcmFpc2VkCiAgIHdpdGggYSBsaXN0IG9mIHJlYXNvbnMuCiAKICAgVGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIGV4YW1wbGUgcmF0aGVyIHRoYW4gCiAgIGEgdG9vbC4KIAotICBcdmVyc2lvbmNoYW5nZWRbRXJyb3IgaXMgcmFpc2VkIGlmIGFueSBleGNlcHRpb25zIG9jY3VyIGR1cmluZyBjb3B5aW5nLAotICByYXRoZXIgdGhhbiBwcmludGluZyBhIG1lc3NhZ2VdezIuM30KKyAgXHZlcnNpb25jaGFuZ2VkW1xleGNlcHRpb257RXJyb3J9IGlzIHJhaXNlZCBpZiBhbnkgZXhjZXB0aW9ucyBvY2N1ciBkdXJpbmcKKyAgICAgICAgICAgICAgICAgIGNvcHlpbmcsIHJhdGhlciB0aGFuIHByaW50aW5nIGEgbWVzc2FnZV17Mi4zfQogCiAgIFx2ZXJzaW9uY2hhbmdlZFtDcmVhdGUgaW50ZXJtZWRpYXRlIGRpcmVjdG9yaWVzIG5lZWRlZCB0byBjcmVhdGUgXHZhcntkc3R9LAotICByYXRoZXIgdGhhbiByYWlzaW5nIGFuIGVycm9yLiBDb3B5IHBlcm1pc3Npb25zIGFuZCB0aW1lcyBvZiBkaXJlY3RvcmllcyB1c2luZwotICBcZnVuY3Rpb257Y29weXN0YXQoKX1dezIuNX0KKyAgICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIHJhaXNpbmcgYW4gZXJyb3IuIENvcHkgcGVybWlzc2lvbnMgYW5kIHRpbWVzIG9mCisJCSAgZGlyZWN0b3JpZXMgdXNpbmcgXGZ1bmN0aW9ue2NvcHlzdGF0KCl9XXsyLjV9CiAKIFxlbmR7ZnVuY2Rlc2N9CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2lnbmFsLnRleCBiL0RvYy9saWIvbGlic2lnbmFsLnRleAppbmRleCBmMTY4YjZkLi5jZmRiNGRkIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnNpZ25hbC50ZXgKKysrIGIvRG9jL2xpYi9saWJzaWduYWwudGV4CkBAIC0xMDAsNyArMTAwLDcgQEAKICAgQW55IHByZXZpb3VzbHkgc2NoZWR1bGVkIGFsYXJtIGlzIGNhbmNlbGVkIChvbmx5IG9uZSBhbGFybSBjYW4KICAgYmUgc2NoZWR1bGVkIGF0IGFueSB0aW1lKS4gIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGVuIHRoZSBudW1iZXIgb2YKICAgc2Vjb25kcyBiZWZvcmUgYW55IHByZXZpb3VzbHkgc2V0IGFsYXJtIHdhcyB0byBoYXZlIGJlZW4gZGVsaXZlcmVkLgotICBJZiBcdmFye3RpbWV9IGlzIHplcm8sIG5vIGFsYXJtIGlkIHNjaGVkdWxlZCwgYW5kIGFueSBzY2hlZHVsZWQKKyAgSWYgXHZhcnt0aW1lfSBpcyB6ZXJvLCBubyBhbGFybSBpcyBzY2hlZHVsZWQsIGFuZCBhbnkgc2NoZWR1bGVkCiAgIGFsYXJtIGlzIGNhbmNlbGVkLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMKICAgcmVtYWluaW5nIGJlZm9yZSBhIHByZXZpb3VzbHkgc2NoZWR1bGVkIGFsYXJtLiAgSWYgdGhlIHJldHVybiB2YWx1ZQogICBpcyB6ZXJvLCBubyBhbGFybSBpcyBjdXJyZW50bHkgc2NoZWR1bGVkLiAgKFNlZSB0aGUgXFVOSVh7fSBtYW4gcGFnZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzb2NrZXQudGV4IGIvRG9jL2xpYi9saWJzb2NrZXQudGV4CmluZGV4IGNjN2JkNzUuLmM3YjY1NmQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic29ja2V0LnRleAorKysgYi9Eb2MvbGliL2xpYnNvY2tldC50ZXgKQEAgLTMxNywxMCArMzE3LDExIEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2Zyb21mZH17ZmQsIGZhbWlseSwgdHlwZVxvcHRpb25hbHssIHByb3RvfX0KLUJ1aWxkIGEgc29ja2V0IG9iamVjdCBmcm9tIGFuIGV4aXN0aW5nIGZpbGUgZGVzY3JpcHRvciAoYW4gaW50ZWdlciBhcwotcmV0dXJuZWQgYnkgYSBmaWxlIG9iamVjdCdzIFxtZXRob2R7ZmlsZW5vKCl9IG1ldGhvZCkuICBBZGRyZXNzIGZhbWlseSwKLXNvY2tldCB0eXBlIGFuZCBwcm90b2NvbCBudW1iZXIgYXJlIGFzIGZvciB0aGUgXGZ1bmN0aW9ue3NvY2tldCgpfSBmdW5jdGlvbgotYWJvdmUuICBUaGUgZmlsZSBkZXNjcmlwdG9yIHNob3VsZCByZWZlciB0byBhIHNvY2tldCwgYnV0IHRoaXMgaXMgbm90CitEdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciBcdmFye2ZkfSAoYW4gaW50ZWdlciBhcyByZXR1cm5lZCBieSBhIGZpbGUKK29iamVjdCdzIFxtZXRob2R7ZmlsZW5vKCl9IG1ldGhvZCkgYW5kIGJ1aWxkIGEgc29ja2V0IG9iamVjdCBmcm9tIHRoZQorcmVzdWx0LiAgQWRkcmVzcyBmYW1pbHksIHNvY2tldCB0eXBlIGFuZCBwcm90b2NvbCBudW1iZXIgYXJlIGFzIGZvciB0aGUKK1xmdW5jdGlvbntzb2NrZXQoKX0gZnVuY3Rpb24gYWJvdmUuCitUaGUgZmlsZSBkZXNjcmlwdG9yIHNob3VsZCByZWZlciB0byBhIHNvY2tldCwgYnV0IHRoaXMgaXMgbm90CiBjaGVja2VkIC0tLSBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgb24gdGhlIG9iamVjdCBtYXkgZmFpbCBpZiB0aGUgZmlsZQogZGVzY3JpcHRvciBpcyBpbnZhbGlkLiAgVGhpcyBmdW5jdGlvbiBpcyByYXJlbHkgbmVlZGVkLCBidXQgY2FuIGJlCiB1c2VkIHRvIGdldCBvciBzZXQgc29ja2V0IG9wdGlvbnMgb24gYSBzb2NrZXQgcGFzc2VkIHRvIGEgcHJvZ3JhbSBhcwpAQCAtNjI2LDcgKzYyNyw3IEBACiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtzb2NrZXRde2dldHRpbWVvdXR9e30KLVJldHVybnMgdGhlIHRpbWVvdXQgaW4gZmxvYXRpbmcgc2Vjb25kcyBhc3NvY2lhdGVkIHdpdGggc29ja2V0CitSZXR1cm4gdGhlIHRpbWVvdXQgaW4gZmxvYXRpbmcgc2Vjb25kcyBhc3NvY2lhdGVkIHdpdGggc29ja2V0CiBvcGVyYXRpb25zLCBvciBcY29kZXtOb25lfSBpZiBubyB0aW1lb3V0IGlzIHNldC4gIFRoaXMgcmVmbGVjdHMKIHRoZSBsYXN0IGNhbGwgdG8gXG1ldGhvZHtzZXRibG9ja2luZygpfSBvciBcbWV0aG9ke3NldHRpbWVvdXQoKX0uCiBcdmVyc2lvbmFkZGVkezIuM30KQEAgLTY3Nyw2ICs2NzgsMjUgQEAKIGluc3RlYWQuCiAKIAorU29ja2V0IG9iamVjdHMgYWxzbyBoYXZlIHRoZXNlIChyZWFkLW9ubHkpIGF0dHJpYnV0ZXMgdGhhdCBjb3JyZXNwb25kCit0byB0aGUgdmFsdWVzIGdpdmVuIHRvIHRoZSBcY2xhc3N7c29ja2V0fSBjb25zdHJ1Y3Rvci4KKworXGJlZ2lue21lbWJlcmRlc2N9W3NvY2tldF17ZmFtaWx5fQorVGhlIHNvY2tldCBmYW1pbHkuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9W3NvY2tldF17dHlwZX0KK1RoZSBzb2NrZXQgdHlwZS4KK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY31bc29ja2V0XXtwcm90b30KK1RoZSBzb2NrZXQgcHJvdG9jb2wuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7bWVtYmVyZGVzY30KKworCiBcc3Vic2VjdGlvbntTU0wgT2JqZWN0cyBcbGFiZWx7c3NsLW9iamVjdHN9fQogCiBTU0wgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcy4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3RkdHlwZXMudGV4IGIvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKaW5kZXggZDJhMDQyNS4uOGQwMTFmZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKKysrIGIvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKQEAgLTE4NSwxMCArMTg1LDEyIEBACiBJbiBhZGRpdGlvbiwgQm9vbGVhbnMgYXJlIGEgc3VidHlwZSBvZiBwbGFpbiBpbnRlZ2Vycy4KIFBsYWluIGludGVnZXJzIChhbHNvIGp1c3QgY2FsbGVkIFxkZm57aW50ZWdlcnN9KQogYXJlIGltcGxlbWVudGVkIHVzaW5nIFxjdHlwZXtsb25nfSBpbiBDLCB3aGljaCBnaXZlcyB0aGVtIGF0IGxlYXN0IDMyCi1iaXRzIG9mIHByZWNpc2lvbi4gIExvbmcgaW50ZWdlcnMgaGF2ZSB1bmxpbWl0ZWQgcHJlY2lzaW9uLiAgRmxvYXRpbmcKLXBvaW50IG51bWJlcnMgYXJlIGltcGxlbWVudGVkIHVzaW5nIFxjdHlwZXtkb3VibGV9IGluIEMuICBBbGwgYmV0cyBvbgotdGhlaXIgcHJlY2lzaW9uIGFyZSBvZmYgdW5sZXNzIHlvdSBoYXBwZW4gdG8ga25vdyB0aGUgbWFjaGluZSB5b3UgYXJlCi13b3JraW5nIHdpdGguCitiaXRzIG9mIHByZWNpc2lvbiAoXGNvZGV7c3lzLm1heGludH0gaXMgYWx3YXlzIHNldCB0byB0aGUgbWF4aW11bQorcGxhaW4gaW50ZWdlciB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0sIHRoZSBtaW5pbXVtIHZhbHVlIGlzIAorXGNvZGV7LXN5cy5tYXhpbnQgLSAxfSkuICBMb25nIGludGVnZXJzIGhhdmUgdW5saW1pdGVkIHByZWNpc2lvbi4KK0Zsb2F0aW5nIHBvaW50IG51bWJlcnMgYXJlIGltcGxlbWVudGVkIHVzaW5nIFxjdHlwZXtkb3VibGV9IGluIEMuCitBbGwgYmV0cyBvbiB0aGVpciBwcmVjaXNpb24gYXJlIG9mZiB1bmxlc3MgeW91IGhhcHBlbiB0byBrbm93IHRoZQorbWFjaGluZSB5b3UgYXJlIHdvcmtpbmcgd2l0aC4KIFxvYmluZGV4e251bWVyaWN9CiBcb2JpbmRleHtCb29sZWFufQogXG9iaW5kZXh7aW50ZWdlcn0KQEAgLTI0OSw2ICsyNTEsNyBAQAogICBcaGxpbmUKICAgXGxpbmVpaWl7XHZhcnt4fSAqIFx2YXJ7eX19e3Byb2R1Y3Qgb2YgXHZhcnt4fSBhbmQgXHZhcnt5fX17fQogICBcbGluZWlpaXtcdmFye3h9IC8gXHZhcnt5fX17cXVvdGllbnQgb2YgXHZhcnt4fSBhbmQgXHZhcnt5fX17KDEpfQorICBcbGluZWlpaXtcdmFye3h9IC8vIFx2YXJ7eX19eyhmbG9vcmVkKSBxdW90aWVudCBvZiBcdmFye3h9IGFuZCBcdmFye3l9fXsoNSl9CiAgIFxsaW5laWlpe1x2YXJ7eH0gXCV7fSBcdmFye3l9fXtyZW1haW5kZXIgb2YgXGNvZGV7XHZhcnt4fSAvIFx2YXJ7eX19fXsoNCl9CiAgIFxobGluZQogICBcbGluZWlpaXstXHZhcnt4fX17XHZhcnt4fSBuZWdhdGVkfXt9CkBAIC0yOTksNiArMzAyLDkgQEAKIFxkZXByZWNhdGVkezIuM317SW5zdGVhZCBjb252ZXJ0IHRvIGZsb2F0IHVzaW5nIFxmdW5jdGlvbnthYnMoKX0KIGlmIGFwcHJvcHJpYXRlLn0KIAorXGl0ZW1bKDUpXQorQWxzbyByZWZlcnJlZCB0byBhcyBpbnRlZ2VyIGRpdmlzaW9uLiAgVGhlIHJlc3VsdGFudCB2YWx1ZSBpcyBhIHdob2xlIGludGVnZXIsCit0aG91Z2ggdGhlIHJlc3VsdCdzIHR5cGUgaXMgbm90IG5lY2Vzc2FyaWx5IGludC4KIFxlbmR7ZGVzY3JpcHRpb259CiAlIFhYWEpIIGV4Y2VwdGlvbnM6IG92ZXJmbG93ICh3aGVuPyB3aGF0IG9wZXJhdGlvbnM/KSB6ZXJvZGl2aXNpb24KIApAQCAtMTI3OCw3ICsxMjg0LDggQEAKICAgXGxpbmVpaWl7XHZhcntzfS5hZGQoXHZhcnt4fSl9e30KICAgICAgICAgIHthZGQgZWxlbWVudCBcdmFye3h9IHRvIHNldCBcdmFye3N9fQogICBcbGluZWlpaXtcdmFye3N9LnJlbW92ZShcdmFye3h9KX17fQotICAgICAgICAge3JlbW92ZSBcdmFye3h9IGZyb20gc2V0IFx2YXJ7c307IHJhaXNlcyBLZXlFcnJvciBpZiBub3QgcHJlc2VudH0KKyAgICAgICAgIHtyZW1vdmUgXHZhcnt4fSBmcm9tIHNldCBcdmFye3N9OyByYWlzZXMgXGV4Y2VwdGlvbntLZXlFcnJvcn0KKwkgIGlmIG5vdCBwcmVzZW50fQogICBcbGluZWlpaXtcdmFye3N9LmRpc2NhcmQoXHZhcnt4fSl9e30KICAgICAgICAgIHtyZW1vdmVzIFx2YXJ7eH0gZnJvbSBzZXQgXHZhcntzfSBpZiBwcmVzZW50fQogICBcbGluZWlpaXtcdmFye3N9LnBvcCgpfXt9CkBAIC0xNDk1LDYgKzE1MDIsMzggQEAKICAgQW55IG9wZXJhdGlvbiB3aGljaCByZXF1aXJlcyB0aGF0IHRoZSBmaWxlIGJlIG9wZW4gd2lsbCByYWlzZSBhCiAgIFxleGNlcHRpb257VmFsdWVFcnJvcn0gYWZ0ZXIgdGhlIGZpbGUgaGFzIGJlZW4gY2xvc2VkLiAgQ2FsbGluZwogICBcbWV0aG9ke2Nsb3NlKCl9IG1vcmUgdGhhbiBvbmNlIGlzIGFsbG93ZWQuCisKKyAgQXMgb2YgUHl0aG9uIDIuNSwgeW91IGNhbiBhdm9pZCBoYXZpbmcgdG8gY2FsbCB0aGlzIG1ldGhvZCBleHBsaWNpdGx5CisgIGlmIHlvdSB1c2UgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudC4gIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCisgIGNvZGUgd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlIFxjb2Rle2Z9IHdoZW4gdGhlIFxrZXl3b3Jke3dpdGh9IGJsb2NrCisgIGlzIGV4aXRlZDoKKworXGJlZ2lue3ZlcmJhdGltfQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorCit3aXRoIG9wZW4oImhlbGxvLnR4dCIpIGFzIGY6CisgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgcHJpbnQgbGluZQorXGVuZHt2ZXJiYXRpbX0KKworICBJbiBvbGRlciB2ZXJzaW9ucyBvZiBQeXRob24sIHlvdSB3b3VsZCBoYXZlIG5lZWRlZCB0byBkbyB0aGlzIHRvIGdldAorICB0aGUgc2FtZSBlZmZlY3Q6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2YgPSBvcGVuKCJoZWxsby50eHQiKQordHJ5OgorICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgIHByaW50IGxpbmUKK2ZpbmFsbHk6CisgICAgZi5jbG9zZSgpCitcZW5ke3ZlcmJhdGltfQorCisgIFxub3Rle05vdCBhbGwgYGBmaWxlLWxpa2UnJyB0eXBlcyBpbiBQeXRob24gc3VwcG9ydCB1c2UgYXMgYSBjb250ZXh0CisgIG1hbmFnZXIgZm9yIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQuICBJZiB5b3VyIGNvZGUgaXMgaW50ZW5kZWQgdG8KKyAgd29yayB3aXRoIGFueSBmaWxlLWxpa2Ugb2JqZWN0LCB5b3UgY2FuIHVzZSB0aGUgXGZ1bmN0aW9ue2Nsb3NpbmcoKX0KKyAgZnVuY3Rpb24gaW4gdGhlIFxtb2R1bGV7Y29udGV4dGxpYn0gbW9kdWxlIGluc3RlYWQgb2YgdXNpbmcgdGhlIG9iamVjdAorICBkaXJlY3RseS4gIFNlZSBzZWN0aW9uflxyZWZ7Y29udGV4dC1jbG9zaW5nfSBmb3IgZGV0YWlscy59CisgIAogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bZmlsZV17Zmx1c2h9e30KQEAgLTE3ODMsMTQgKzE4MjIsMTQgQEAKIGF0dHJpYnV0ZSB3aWxsIGJlIFxjb2Rle05vbmV9IGFuZCBpZiBjYWxsZWQsIGFuIGV4cGxpY2l0IFxjb2Rle3NlbGZ9CiBvYmplY3QgbXVzdCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiAgSW4gdGhpcyBjYXNlLAogXGNvZGV7c2VsZn0gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgdW5ib3VuZCBtZXRob2QncyBjbGFzcyAob3IgYQotc3ViY2xhc3Mgb2YgdGhhdCBjbGFzcyksIG90aGVyd2lzZSBhIFxjb2Rle1R5cGVFcnJvcn0gaXMgcmFpc2VkLgorc3ViY2xhc3Mgb2YgdGhhdCBjbGFzcyksIG90aGVyd2lzZSBhIFxleGNlcHRpb257VHlwZUVycm9yfSBpcyByYWlzZWQuCiAKIExpa2UgZnVuY3Rpb24gb2JqZWN0cywgbWV0aG9kcyBvYmplY3RzIHN1cHBvcnQgZ2V0dGluZwogYXJiaXRyYXJ5IGF0dHJpYnV0ZXMuICBIb3dldmVyLCBzaW5jZSBtZXRob2QgYXR0cmlidXRlcyBhcmUgYWN0dWFsbHkKIHN0b3JlZCBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgKFxjb2Rle21ldGguaW1fZnVuY30pLAogc2V0dGluZyBtZXRob2QgYXR0cmlidXRlcyBvbiBlaXRoZXIgYm91bmQgb3IgdW5ib3VuZCBtZXRob2RzIGlzCiBkaXNhbGxvd2VkLiAgQXR0ZW1wdGluZyB0byBzZXQgYSBtZXRob2QgYXR0cmlidXRlIHJlc3VsdHMgaW4gYQotXGNvZGV7VHlwZUVycm9yfSBiZWluZyByYWlzZWQuICBJbiBvcmRlciB0byBzZXQgYSBtZXRob2QgYXR0cmlidXRlLAorXGV4Y2VwdGlvbntUeXBlRXJyb3J9IGJlaW5nIHJhaXNlZC4gIEluIG9yZGVyIHRvIHNldCBhIG1ldGhvZCBhdHRyaWJ1dGUsCiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHNldCBpdCBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Q6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3VicHJvY2Vzcy50ZXggYi9Eb2MvbGliL2xpYnN1YnByb2Nlc3MudGV4CmluZGV4IGY0OGIyOWIuLjQ0MTc3OTcgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic3VicHJvY2Vzcy50ZXgKKysrIGIvRG9jL2xpYi9saWJzdWJwcm9jZXNzLnRleApAQCAtMTM1LDggKzEzNSw4IEBACiAKIFxiZWdpbntmdW5jZGVzY317Y2hlY2tfY2FsbH17KnBvcGVuYXJncywgKiprd2FyZ3N9CiBSdW4gY29tbWFuZCB3aXRoIGFyZ3VtZW50cy4gIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUuIElmIHRoZSBleGl0Ci1jb2RlIHdhcyB6ZXJvIHRoZW4gcmV0dXJuLCBvdGhlcndpc2UgcmFpc2UgQ2FsbGVkUHJvY2Vzc0Vycm9yLiAgVGhlCi1DYWxsZWRQcm9jZXNzRXJyb3Igb2JqZWN0IHdpbGwgaGF2ZSB0aGUgcmV0dXJuIGNvZGUgaW4gdGhlCitjb2RlIHdhcyB6ZXJvIHRoZW4gcmV0dXJuLCBvdGhlcndpc2UgcmFpc2UgXGV4Y2VwdGlvbntDYWxsZWRQcm9jZXNzRXJyb3IufQorVGhlIFxleGNlcHRpb257Q2FsbGVkUHJvY2Vzc0Vycm9yfSBvYmplY3Qgd2lsbCBoYXZlIHRoZSByZXR1cm4gY29kZSBpbiB0aGUKIFxtZW1iZXJ7ZXJybm99IGF0dHJpYnV0ZS4KIAogVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBQb3BlbiBjb25zdHJ1Y3Rvci4gIEV4YW1wbGU6CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnRocmVhZC50ZXggYi9Eb2MvbGliL2xpYnRocmVhZC50ZXgKaW5kZXggNDkxNDk0OC4uOWUwYzIwMiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ0aHJlYWQudGV4CisrKyBiL0RvYy9saWIvbGlidGhyZWFkLnRleApAQCAtMTAwLDYgKzEwMCwxOSBAQAogc29tZSB0aHJlYWQsIFxjb2Rle0ZhbHNlfSBpZiBub3QuCiBcZW5ke21ldGhvZGRlc2N9CiAKK0luIGFkZGl0aW9uIHRvIHRoZXNlIG1ldGhvZHMsIGxvY2sgb2JqZWN0cyBjYW4gYWxzbyBiZSB1c2VkIHZpYSB0aGUKK1xrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCwgZS5nLjoKKworXGJlZ2lue3ZlcmJhdGltfQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAoraW1wb3J0IHRocmVhZAorCithX2xvY2sgPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCisKK3dpdGggYV9sb2NrOgorICAgIHByaW50ICJhX2xvY2sgaXMgbG9ja2VkIHdoaWxlIHRoaXMgZXhlY3V0ZXMiCitcZW5ke3ZlcmJhdGltfQorCiBcc3Ryb25ne0NhdmVhdHM6fQogCiBcYmVnaW57aXRlbWl6ZX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGhyZWFkaW5nLnRleCBiL0RvYy9saWIvbGlidGhyZWFkaW5nLnRleAppbmRleCAzMzgzOWE0Li44ZmIzMTM3IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnRocmVhZGluZy50ZXgKKysrIGIvRG9jL2xpYi9saWJ0aHJlYWRpbmcudGV4CkBAIC02NzUsMyArNjc1LDI2IEBACiBTdG9wIHRoZSB0aW1lciwgYW5kIGNhbmNlbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0aW1lcidzIGFjdGlvbi4gIFRoaXMKIHdpbGwgb25seSB3b3JrIGlmIHRoZSB0aW1lciBpcyBzdGlsbCBpbiBpdHMgd2FpdGluZyBzdGFnZS4KIFxlbmR7bWV0aG9kZGVzY30KKworXHN1YnNlY3Rpb257VXNpbmcgbG9ja3MsIGNvbmRpdGlvbnMsIGFuZCBzZW1hcGhvcmVzIGluIHRoZSBca2V5d29yZHt3aXRofQorc3RhdGVtZW50IFxsYWJlbHt3aXRoLWxvY2tzfX0KKworQWxsIG9mIHRoZSBvYmplY3RzIHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxlIHRoYXQgaGF2ZSBcbWV0aG9ke2FjcXVpcmUoKX0gYW5kCitcbWV0aG9ke3JlbGVhc2UoKX0gbWV0aG9kcyBjYW4gYmUgdXNlZCBhcyBjb250ZXh0IG1hbmFnZXJzIGZvciBhIFxrZXl3b3Jke3dpdGh9CitzdGF0ZW1lbnQuICBUaGUgXG1ldGhvZHthY3F1aXJlKCl9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBibG9jayBpcworZW50ZXJlZCwgYW5kIFxtZXRob2R7cmVsZWFzZSgpfSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBibG9jayBpcyBleGl0ZWQuCisKK0N1cnJlbnRseSwgXGNsYXNze0xvY2t9LCBcY2xhc3N7UkxvY2t9LCBcY2xhc3N7Q29uZGl0aW9ufSwgXGNsYXNze1NlbWFwaG9yZX0sCithbmQgXGNsYXNze0JvdW5kZWRTZW1hcGhvcmV9IG9iamVjdHMgbWF5IGJlIHVzZWQgYXMgXGtleXdvcmR7d2l0aH0KK3N0YXRlbWVudCBjb250ZXh0IG1hbmFnZXJzLiAgRm9yIGV4YW1wbGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKK2ltcG9ydCB0aHJlYWRpbmcKKworc29tZV9ybG9jayA9IHRocmVhZGluZy5STG9jaygpCisKK3dpdGggc29tZV9ybG9jazoKKyAgICBwcmludCAic29tZV9ybG9jayBpcyBsb2NrZWQgd2hpbGUgdGhpcyBleGVjdXRlcyIKK1xlbmR7dmVyYmF0aW19CisKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidW5kb2MudGV4IGIvRG9jL2xpYi9saWJ1bmRvYy50ZXgKaW5kZXggNmNlZjE4My4uZGY3ODE1MiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ1bmRvYy50ZXgKKysrIGIvRG9jL2xpYi9saWJ1bmRvYy50ZXgKQEAgLTQyLDE1ICs0MiwxNSBAQAogXGJlZ2lue2Rlc2NyaXB0aW9ufQogXGl0ZW1bXG1vZHVsZXtudHBhdGh9XQogLS0tIEltcGxlbWVudGF0aW9uIG9mIFxtb2R1bGV7b3MucGF0aH0gb24gV2luMzIsIFdpbjY0LCBXaW5DRSwgYW5kCi1PUy8yIHBsYXRmb3Jtcy4KKyAgICBPUy8yIHBsYXRmb3Jtcy4KIAogXGl0ZW1bXG1vZHVsZXtwb3NpeHBhdGh9XQogLS0tIEltcGxlbWVudGF0aW9uIG9mIFxtb2R1bGV7b3MucGF0aH0gb24gXFBPU0lYLgogCiBcaXRlbVtcbW9kdWxle2JzZGRiMTg1fV0KIC0tLSBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBtb2R1bGUgZm9yIHN5c3RlbXMgd2hpY2ggc3RpbGwgdXNlIHRoZSBCZXJrZWxleQotREIgMS44NSBtb2R1bGUuICBJdCBpcyBub3JtYWxseSBvbmx5IGF2YWlsYWJsZSBvbiBjZXJ0YWluIEJTRCBVbml4LWJhc2VkCi1zeXN0ZW1zLiAgSXQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgZGlyZWN0bHkuCisgICAgREIgMS44NSBtb2R1bGUuICBJdCBpcyBub3JtYWxseSBvbmx5IGF2YWlsYWJsZSBvbiBjZXJ0YWluIEJTRCBVbml4LWJhc2VkCisgICAgc3lzdGVtcy4gIEl0IHNob3VsZCBuZXZlciBiZSB1c2VkIGRpcmVjdGx5LgogXGVuZHtkZXNjcmlwdGlvbn0KIAogCkBAIC02MiwxNCArNjIsMTQgQEAKIAogXGl0ZW1bXG1vZHVsZXtsaW51eGF1ZGlvZGV2fV0KIC0tLSBQbGF5IGF1ZGlvIGRhdGEgb24gdGhlIExpbnV4IGF1ZGlvIGRldmljZS4gIFJlcGxhY2VkIGluIFB5dGhvbiAyLjMKLWJ5IHRoZSBcbW9kdWxle29zc2F1ZGlvZGV2fSBtb2R1bGUuCisgICAgYnkgdGhlIFxtb2R1bGV7b3NzYXVkaW9kZXZ9IG1vZHVsZS4KIAogXGl0ZW1bXG1vZHVsZXtzdW5hdWRpb31dCiAtLS0gSW50ZXJwcmV0IFN1biBhdWRpbyBoZWFkZXJzIChtYXkgYmVjb21lIG9ic29sZXRlIG9yIGEgdG9vbC9kZW1vKS4KIAogXGl0ZW1bXG1vZHVsZXt0b2FpZmZ9XQogLS0tIENvbnZlcnQgImFyYml0cmFyeSIgc291bmQgZmlsZXMgdG8gQUlGRiBmaWxlczsgc2hvdWxkIHByb2JhYmx5Ci1iZWNvbWUgYSB0b29sIG9yIGRlbW8uICBSZXF1aXJlcyB0aGUgZXh0ZXJuYWwgcHJvZ3JhbSBccHJvZ3JhbXtzb3h9LgorICAgIGJlY29tZSBhIHRvb2wgb3IgZGVtby4gIFJlcXVpcmVzIHRoZSBleHRlcm5hbCBwcm9ncmFtIFxwcm9ncmFte3NveH0uCiBcZW5ke2Rlc2NyaXB0aW9ufQogCiAKQEAgLTc4LDEyICs3OCwxMyBAQAogVGhlc2UgbW9kdWxlcyBhcmUgbm90IG5vcm1hbGx5IGF2YWlsYWJsZSBmb3IgaW1wb3J0OyBhZGRpdGlvbmFsIHdvcmsKIG11c3QgYmUgZG9uZSB0byBtYWtlIHRoZW0gYXZhaWxhYmxlLgogCi1UaG9zZSB3aGljaCBhcmUgd3JpdHRlbiBpbiBQeXRob24gd2lsbCBiZSBpbnN0YWxsZWQgaW50byB0aGUgZGlyZWN0b3J5IAotXGZpbGV7bGliLW9sZC99IGluc3RhbGxlZCBhcyBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiAgVG8gdXNlCi10aGVzZSwgdGhlIGRpcmVjdG9yeSBtdXN0IGJlIGFkZGVkIHRvIFxjb2Rle3N5cy5wYXRofSwgcG9zc2libHkgdXNpbmcKLVxlbnZ2YXJ7UFlUSE9OUEFUSH0uCislJSUgbGliLW9sZCBpcyBlbXB0eSBhcyBvZiBQeXRob24gMi41CislIFRob3NlIHdoaWNoIGFyZSB3cml0dGVuIGluIFB5dGhvbiB3aWxsIGJlIGluc3RhbGxlZCBpbnRvIHRoZSBkaXJlY3RvcnkgCislIFxmaWxle2xpYi1vbGQvfSBpbnN0YWxsZWQgYXMgcGFydCBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeS4gIFRvIHVzZQorJSB0aGVzZSwgdGhlIGRpcmVjdG9yeSBtdXN0IGJlIGFkZGVkIHRvIFxjb2Rle3N5cy5wYXRofSwgcG9zc2libHkgdXNpbmcKKyUgXGVudnZhcntQWVRIT05QQVRIfS4KIAotT2Jzb2xldGUgZXh0ZW5zaW9uIG1vZHVsZXMgd3JpdHRlbiBpbiBDIGFyZSBub3QgYnVpbHQgYnkgZGVmYXVsdC4KK1RoZXNlIGV4dGVuc2lvbiBtb2R1bGVzIHdyaXR0ZW4gaW4gQyBhcmUgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuCiBVbmRlciBcVU5JWCwgdGhlc2UgbXVzdCBiZSBlbmFibGVkIGJ5IHVuY29tbWVudGluZyB0aGUgYXBwcm9wcmlhdGUKIGxpbmVzIGluIFxmaWxle01vZHVsZXMvU2V0dXB9IGluIHRoZSBidWlsZCB0cmVlIGFuZCBlaXRoZXIgcmVidWlsZGluZwogUHl0aG9uIGlmIHRoZSBtb2R1bGVzIGFyZSBzdGF0aWNhbGx5IGxpbmtlZCwgb3IgYnVpbGRpbmcgYW5kCkBAIC05MiwxMjIgKzkzLDExIEBACiAlIFhYWCBuZWVkIFdpbmRvd3MgaW5zdHJ1Y3Rpb25zIQogCiBcYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcbW9kdWxle2FkZHBhY2t9XQotLS0tIEFsdGVybmF0ZSBhcHByb2FjaCB0byBwYWNrYWdlcy4gIFVzZSB0aGUgYnVpbHQtaW4gcGFja2FnZSBzdXBwb3J0Ci1pbnN0ZWFkLgotCi1caXRlbVtcbW9kdWxle2NtcH1dCi0tLS0gRmlsZSBjb21wYXJpc29uIGZ1bmN0aW9uLiAgVXNlIHRoZSBuZXdlciBccmVmbW9kdWxle2ZpbGVjbXB9IGluc3RlYWQuCi0KLVxpdGVtW1xtb2R1bGV7Y21wY2FjaGV9XQotLS0tIENhY2hpbmcgdmVyc2lvbiBvZiB0aGUgb2Jzb2xldGUgXG1vZHVsZXtjbXB9IG1vZHVsZS4gIFVzZSB0aGUKLW5ld2VyIFxyZWZtb2R1bGV7ZmlsZWNtcH0gaW5zdGVhZC4KLQotXGl0ZW1bXG1vZHVsZXtjb2RlaGFja31dCi0tLS0gRXh0cmFjdCBmdW5jdGlvbiBuYW1lIG9yIGxpbmUgbnVtYmVyIGZyb20gYSBmdW5jdGlvbgotY29kZSBvYmplY3QgKHRoZXNlIGFyZSBub3cgYWNjZXNzaWJsZSBhcyBhdHRyaWJ1dGVzOgotXG1lbWJlcntjby5jb19uYW1lfSwgXG1lbWJlcntmdW5jLmZ1bmNfbmFtZX0sCi1cbWVtYmVye2NvLmNvX2ZpcnN0bGluZW5vfSkuCi0KLVxpdGVtW1xtb2R1bGV7ZGlyY21wfV0KLS0tLSBDbGFzcyB0byBidWlsZCBkaXJlY3RvcnkgZGlmZiB0b29scyBvbiAobWF5IGJlY29tZSBhIGRlbW8gb3IgdG9vbCkuCi1cZGVwcmVjYXRlZHsyLjB9e1RoZSBccmVmbW9kdWxle2ZpbGVjbXB9IG1vZHVsZSByZXBsYWNlcwotXG1vZHVsZXtkaXJjbXB9Ln0KLQotXGl0ZW1bXG1vZHVsZXtkdW1wfV0KLS0tLSBQcmludCBweXRob24gY29kZSB0aGF0IHJlY29uc3RydWN0cyBhIHZhcmlhYmxlLgotCi1caXRlbVtcbW9kdWxle2ZtdH1dCi0tLS0gVGV4dCBmb3JtYXR0aW5nIGFic3RyYWN0aW9ucyAodG9vIHNsb3cpLgotCi1caXRlbVtcbW9kdWxle2xvY2tmaWxlfV0KLS0tLSBXcmFwcGVyIGFyb3VuZCBGQ05UTCBmaWxlIGxvY2tpbmcgKHVzZQotXGZ1bmN0aW9ue2ZjbnRsLmxvY2tmKCl9L1xmdW5jdGlvbntmbG9jaygpfSBpbnN0ZWFkOyBzZWUgXHJlZm1vZHVsZXtmY250bH0pLgotCi1caXRlbVtcbW9kdWxle25ld2Rpcn1dCi0tLS0gTmV3IFxmdW5jdGlvbntkaXIoKX0gZnVuY3Rpb24gKHRoZSBzdGFuZGFyZCBcZnVuY3Rpb257ZGlyKCl9IGlzCi1ub3cganVzdCBhcyBnb29kKS4KLQotXGl0ZW1bXG1vZHVsZXtQYXJhfV0KLS0tLSBIZWxwZXIgZm9yIFxtb2R1bGV7Zm10fS4KLQotXGl0ZW1bXG1vZHVsZXtwb2x5fV0KLS0tLSBQb2x5bm9taWFscy4KLQotXGl0ZW1bXG1vZHVsZXtyYW5kfV0KLS0tLSBPbGQgaW50ZXJmYWNlIHRvIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KLQotXGl0ZW1bXG1vZHVsZXtyZWdleH1dCi0tLS0gRW1hY3Mtc3R5bGUgcmVndWxhciBleHByZXNzaW9uIHN1cHBvcnQ7IG1heSBzdGlsbCBiZSB1c2VkIGluIHNvbWUKLW9sZCBjb2RlIChleHRlbnNpb24gbW9kdWxlKS4gIFJlZmVyIHRvIHRoZQotXGNpdGV0aXRsZVtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzEuNi9saWIvbW9kdWxlLXJlZ2V4Lmh0bWxde1B5dGhvbgotMS42IERvY3VtZW50YXRpb259IGZvciBkb2N1bWVudGF0aW9uLgotCi1caXRlbVtcbW9kdWxle3JlZ3N1Yn1dCi0tLS0gUmVndWxhciBleHByZXNzaW9uIGJhc2VkIHN0cmluZyByZXBsYWNlbWVudCB1dGlsaXRpZXMsIGZvciB1c2UKLXdpdGggXG1vZHVsZXtyZWdleH0gKGV4dGVuc2lvbiBtb2R1bGUpLiAgUmVmZXIgdG8gdGhlCi1cY2l0ZXRpdGxlW2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvMS42L2xpYi9tb2R1bGUtcmVnc3ViLmh0bWxde1B5dGhvbgotMS42IERvY3VtZW50YXRpb259IGZvciBkb2N1bWVudGF0aW9uLgotCi1caXRlbVtcbW9kdWxle3N0YXRjYWNoZX1dCi0tLS0gQ2FjaGVzIHRoZSByZXN1bHRzIG9mIG9zLnN0YXQoKS4gIFVzaW5nIHRoZSBjYWNoZSBjYW4gYmUgZnJhZ2lsZQotYW5kIGVycm9yLXByb25lLCBqdXN0IHVzZSBcY29kZXtvcy5zdGF0KCl9IGRpcmVjdGx5LgotCi1caXRlbVtcbW9kdWxle3RifV0KLS0tLSBQcmludCB0cmFjZWJhY2tzLCB3aXRoIGEgZHVtcCBvZiBsb2NhbCB2YXJpYWJsZXMgKHVzZQotXGZ1bmN0aW9ue3BkYi5wbSgpfSBvciBccmVmbW9kdWxle3RyYWNlYmFja30gaW5zdGVhZCkuCi0KIFxpdGVtW1xtb2R1bGV7dGltaW5nfV0KLS0tLSBNZWFzdXJlIHRpbWUgaW50ZXJ2YWxzIHRvIGhpZ2ggcmVzb2x1dGlvbiAodXNlCi1cZnVuY3Rpb257dGltZS5jbG9jaygpfSBpbnN0ZWFkKS4gIChUaGlzIGlzIGFuIGV4dGVuc2lvbiBtb2R1bGUuKQotCi1caXRlbVtcbW9kdWxle3R6cGFyc2V9XQotLS0tIFBhcnNlIGEgdGltZXpvbmUgc3BlY2lmaWNhdGlvbiAodW5maW5pc2hlZDsgbWF5IGRpc2FwcGVhciBpbiB0aGUKLWZ1dHVyZSwgYW5kIGRvZXMgbm90IHdvcmsgd2hlbiB0aGUgXGVudnZhcntUWn0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMKLW5vdCBzZXQpLgotCi1caXRlbVtcbW9kdWxle3V0aWx9XQotLS0tIFVzZWZ1bCBmdW5jdGlvbnMgdGhhdCBkb24ndCBmaXQgZWxzZXdoZXJlLgotCi1caXRlbVtcbW9kdWxle3doYXRzb3VuZH1dCi0tLS0gUmVjb2duaXplIHNvdW5kIGZpbGVzOyB1c2UgXHJlZm1vZHVsZXtzbmRoZHJ9IGluc3RlYWQuCi0KLVxpdGVtW1xtb2R1bGV7d2hyYW5kb219XQotLS0tIE9sZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gIFVzZSBcbW9kdWxle3JhbmRvbX0gaW5zdGVhZC4KLQotXGl0ZW1bXG1vZHVsZXt6bW9kfV0KLS0tLSBDb21wdXRlIHByb3BlcnRpZXMgb2YgbWF0aGVtYXRpY2FsIGBgZmllbGRzLicnCistLS0gTWVhc3VyZSB0aW1lIGludGVydmFscyB0byBoaWdoIHJlc29sdXRpb24gKHVzZSBcZnVuY3Rpb257dGltZS5jbG9jaygpfQorICAgIGluc3RlYWQpLgogXGVuZHtkZXNjcmlwdGlvbn0KIAotCi1UaGUgZm9sbG93aW5nIG1vZHVsZXMgYXJlIG9ic29sZXRlLCBidXQgYXJlIGxpa2VseSB0byByZS1zdXJmYWNlIGFzCi10b29scyBvciBzY3JpcHRzOgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcbW9kdWxle2ZpbmR9XQotLS0tIEZpbmQgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybiBpbiBkaXJlY3RvcnkgdHJlZS4KLQotXGl0ZW1bXG1vZHVsZXtncmVwfV0KLS0tLSBccHJvZ3JhbXtncmVwfSBpbXBsZW1lbnRhdGlvbiBpbiBQeXRob24uCi0KLVxpdGVtW1xtb2R1bGV7cGFja21haWx9XQotLS0tIENyZWF0ZSBhIHNlbGYtdW5wYWNraW5nIFxVTklYe30gc2hlbGwgYXJjaGl2ZS4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQotVGhlIGZvbGxvd2luZyBtb2R1bGVzIHdlcmUgZG9jdW1lbnRlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwsIGJ1dCBhcmUgbm93IGNvbnNpZGVyZWQgb2Jzb2xldGUuICBUaGUgc291cmNlIGZvciB0aGUKLWRvY3VtZW50YXRpb24gaXMgc3RpbGwgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIGRvY3VtZW50YXRpb24gc291cmNlCi1hcmNoaXZlLgotCi1cYmVnaW57ZGVzY3JpcHRpb259Ci1caXRlbVtcbW9kdWxle25pfV0KLS0tLSBJbXBvcnQgbW9kdWxlcyBpbiBgYHBhY2thZ2VzLicnICBCYXNpYyBwYWNrYWdlIHN1cHBvcnQgaXMgbm93Ci1idWlsdCBpbi4gIFRoZSBidWlsdC1pbiBzdXBwb3J0IGlzIHZlcnkgc2ltaWxhciB0byB3aGF0IGlzIHByb3ZpZGVkIGluCi10aGlzIG1vZHVsZS4KLVxlbmR7ZGVzY3JpcHRpb259Ci0KLQogXHNlY3Rpb257U0dJLXNwZWNpZmljIEV4dGVuc2lvbiBtb2R1bGVzfQogCiBUaGUgZm9sbG93aW5nIGFyZSBTR0kgc3BlY2lmaWMsIGFuZCBtYXkgYmUgb3V0IG9mIHRvdWNoIHdpdGggdGhlCkBAIC0yMTksNSArMTA5LDUgQEAKIAogXGl0ZW1bXG1vZHVsZXtzdn1dCiAtLS0gSW50ZXJmYWNlIHRvIHRoZSBgYHNpbXBsZSB2aWRlbycnIGJvYXJkIG9uIFNHSSBJbmRpZ28KLShvYnNvbGV0ZSBoYXJkd2FyZSkuCisgICAgKG9ic29sZXRlIGhhcmR3YXJlKS4KIFxlbmR7ZGVzY3JpcHRpb259CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVybGxpYjIudGV4IGIvRG9jL2xpYi9saWJ1cmxsaWIyLnRleAppbmRleCA3MDZjNTRiLi5lMGM0NTY4IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnVybGxpYjIudGV4CisrKyBiL0RvYy9saWIvbGlidXJsbGliMi50ZXgKQEAgLTM4NCw3ICszODQsNyBAQAogICAgIFxtZXRob2R7XHZhcntwcm90b2NvbH1fb3BlbigpfSBhcmUgY2FsbGVkIHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4KICAgICBUaGlzIHN0YWdlIGVuZHMgd2hlbiBhIGhhbmRsZXIgZWl0aGVyIHJldHVybnMgYQogICAgIG5vbi1cY29uc3RhbnR7Tm9uZX0gdmFsdWUgKGllLiBhIHJlc3BvbnNlKSwgb3IgcmFpc2VzIGFuIGV4Y2VwdGlvbgotICAgICh1c3VhbGx5IFVSTEVycm9yKS4gIEV4Y2VwdGlvbnMgYXJlIGFsbG93ZWQgdG8gcHJvcGFnYXRlLgorICAgICh1c3VhbGx5IFxleGNlcHRpb257VVJMRXJyb3J9KS4gIEV4Y2VwdGlvbnMgYXJlIGFsbG93ZWQgdG8gcHJvcGFnYXRlLgogCiAgICAgSW4gZmFjdCwgdGhlIGFib3ZlIGFsZ29yaXRobSBpcyBmaXJzdCB0cmllZCBmb3IgbWV0aG9kcyBuYW1lZAogICAgIFxtZXRob2R7ZGVmYXVsdF9vcGVufS4gIElmIGFsbCBzdWNoIG1ldGhvZHMgcmV0dXJuCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVybHBhcnNlLnRleCBiL0RvYy9saWIvbGlidXJscGFyc2UudGV4CmluZGV4IDhmODBkNmIuLmYxOGVmZTkgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidXJscGFyc2UudGV4CisrKyBiL0RvYy9saWIvbGlidXJscGFyc2UudGV4CkBAIC0yMyw1MCArMjMsNzYgQEAKIFxjb2Rle2ZpbGV9LCBcY29kZXtmdHB9LCBcY29kZXtnb3BoZXJ9LCBcY29kZXtoZGx9LCBcY29kZXtodHRwfSwgCiBcY29kZXtodHRwc30sIFxjb2Rle2ltYXB9LCBcY29kZXttYWlsdG99LCBcY29kZXttbXN9LCBcY29kZXtuZXdzfSwgCiBcY29kZXtubnRwfSwgXGNvZGV7cHJvc3Blcm99LCBcY29kZXtyc3luY30sIFxjb2Rle3J0c3B9LCBcY29kZXtydHNwdX0sIAotXGNvZGV7c2Z0cH0sIFxjb2Rle3NodHRwfSwgXGNvZGV7c2lwfSwgXGNvZGV7c25ld3N9LCBcY29kZXtzdm59LCAKK1xjb2Rle3NmdHB9LCBcY29kZXtzaHR0cH0sIFxjb2Rle3NpcH0sIFxjb2Rle3NpcHN9LCBcY29kZXtzbmV3c30sIFxjb2Rle3N2bn0sIAogXGNvZGV7c3ZuK3NzaH0sIFxjb2Rle3RlbG5ldH0sIFxjb2Rle3dhaXN9LgotXHZlcnNpb25hZGRlZFtTdXBwb3J0IGZvciB0aGUgXGNvZGV7c2Z0cH0gc2NoZW1lXXsyLjV9CisKK1x2ZXJzaW9uYWRkZWRbU3VwcG9ydCBmb3IgdGhlIFxjb2Rle3NmdHB9IGFuZCBcY29kZXtzaXBzfSBzY2hlbWVzXXsyLjV9CiAKIFRoZSBcbW9kdWxle3VybHBhcnNlfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKIAotXGJlZ2lue2Z1bmNkZXNjfXt1cmxwYXJzZX17dXJsc3RyaW5nXG9wdGlvbmFseywgZGVmYXVsdF9zY2hlbWVcb3B0aW9uYWx7LCBhbGxvd19mcmFnbWVudHN9fX0KLVBhcnNlIGEgVVJMIGludG8gNiBjb21wb25lbnRzLCByZXR1cm5pbmcgYSA2LXR1cGxlOiAoYWRkcmVzc2luZwotc2NoZW1lLCBuZXR3b3JrIGxvY2F0aW9uLCBwYXRoLCBwYXJhbWV0ZXJzLCBxdWVyeSwgZnJhZ21lbnQKLWlkZW50aWZpZXIpLiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZ2VuZXJhbCBzdHJ1Y3R1cmUgb2YgYSBVUkw6CitcYmVnaW57ZnVuY2Rlc2N9e3VybHBhcnNlfXt1cmxzdHJpbmdcb3B0aW9uYWx7LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9zY2hlbWVcb3B0aW9uYWx7LCBhbGxvd19mcmFnbWVudHN9fX0KK1BhcnNlIGEgVVJMIGludG8gc2l4IGNvbXBvbmVudHMsIHJldHVybmluZyBhIDYtdHVwbGUuICBUaGlzCitjb3JyZXNwb25kcyB0byB0aGUgZ2VuZXJhbCBzdHJ1Y3R1cmUgb2YgYSBVUkw6CiBcY29kZXtcdmFye3NjaGVtZX06Ly9cdmFye25ldGxvY30vXHZhcntwYXRofTtcdmFye3BhcmFtZXRlcnN9P1x2YXJ7cXVlcnl9XCNcdmFye2ZyYWdtZW50fX0uCiBFYWNoIHR1cGxlIGl0ZW0gaXMgYSBzdHJpbmcsIHBvc3NpYmx5IGVtcHR5LgotVGhlIGNvbXBvbmVudHMgYXJlIG5vdCBicm9rZW4gdXAgaW4gc21hbGxlciBwYXJ0cyAoZS5nLiB0aGUgbmV0d29yaworVGhlIGNvbXBvbmVudHMgYXJlIG5vdCBicm9rZW4gdXAgaW4gc21hbGxlciBwYXJ0cyAoZm9yIGV4YW1wbGUsIHRoZSBuZXR3b3JrCiBsb2NhdGlvbiBpcyBhIHNpbmdsZSBzdHJpbmcpLCBhbmQgXCUgZXNjYXBlcyBhcmUgbm90IGV4cGFuZGVkLgotVGhlIGRlbGltaXRlcnMgYXMgc2hvd24gYWJvdmUgYXJlIG5vdCBwYXJ0IG9mIHRoZSB0dXBsZSBpdGVtcywKK1RoZSBkZWxpbWl0ZXJzIGFzIHNob3duIGFib3ZlIGFyZSBub3QgcGFydCBvZiB0aGUgcmVzdWx0LAogZXhjZXB0IGZvciBhIGxlYWRpbmcgc2xhc2ggaW4gdGhlIFx2YXJ7cGF0aH0gY29tcG9uZW50LCB3aGljaCBpcwotcmV0YWluZWQgaWYgcHJlc2VudC4KLQotRXhhbXBsZToKK3JldGFpbmVkIGlmIHByZXNlbnQuICBGb3IgZXhhbXBsZToKIAogXGJlZ2lue3ZlcmJhdGltfQotdXJscGFyc2UoJ2h0dHA6Ly93d3cuY3dpLm5sOjgwLyU3RWd1aWRvL1B5dGhvbi5odG1sJykKLVxlbmR7dmVyYmF0aW19Ci0KLXlpZWxkcyB0aGUgdHVwbGUKLQotXGJlZ2lue3ZlcmJhdGltfQorPj4+IGZyb20gdXJscGFyc2UgaW1wb3J0IHVybHBhcnNlCis+Pj4gbyA9IHVybHBhcnNlKCdodHRwOi8vd3d3LmN3aS5ubDo4MC8lN0VndWlkby9QeXRob24uaHRtbCcpCis+Pj4gbwogKCdodHRwJywgJ3d3dy5jd2kubmw6ODAnLCAnLyU3RWd1aWRvL1B5dGhvbi5odG1sJywgJycsICcnLCAnJykKKz4+PiBvLnNjaGVtZQorJ2h0dHAnCis+Pj4gby5wb3J0Cis4MAorPj4+IG8uZ2V0dXJsKCkKKydodHRwOi8vd3d3LmN3aS5ubDo4MC8lN0VndWlkby9QeXRob24uaHRtbCcKIFxlbmR7dmVyYmF0aW19CiAKIElmIHRoZSBcdmFye2RlZmF1bHRfc2NoZW1lfSBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIGl0IGdpdmVzIHRoZQotZGVmYXVsdCBhZGRyZXNzaW5nIHNjaGVtZSwgdG8gYmUgdXNlZCBvbmx5IGlmIHRoZSBVUkwgc3RyaW5nIGRvZXMgbm90CitkZWZhdWx0IGFkZHJlc3Npbmcgc2NoZW1lLCB0byBiZSB1c2VkIG9ubHkgaWYgdGhlIFVSTCBkb2VzIG5vdAogc3BlY2lmeSBvbmUuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudCBpcyB0aGUgZW1wdHkgc3RyaW5nLgogCi1JZiB0aGUgXHZhcnthbGxvd19mcmFnbWVudHN9IGFyZ3VtZW50IGlzIHplcm8sIGZyYWdtZW50IGlkZW50aWZpZXJzCitJZiB0aGUgXHZhcnthbGxvd19mcmFnbWVudHN9IGFyZ3VtZW50IGlzIGZhbHNlLCBmcmFnbWVudCBpZGVudGlmaWVycwogYXJlIG5vdCBhbGxvd2VkLCBldmVuIGlmIHRoZSBVUkwncyBhZGRyZXNzaW5nIHNjaGVtZSBub3JtYWxseSBkb2VzCi1zdXBwb3J0IHRoZW0uICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudCBpcyBcY29kZXsxfS4KK3N1cHBvcnQgdGhlbS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50IGlzIFxjb25zdGFudHtUcnVlfS4KKworVGhlIHJldHVybiB2YWx1ZSBpcyBhY3R1YWxseSBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mCitccHl0eXBle3R1cGxlfS4gIFRoaXMgY2xhc3MgaGFzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCByZWFkLW9ubHkKK2NvbnZlbmllbmNlIGF0dHJpYnV0ZXM6CisKK1xiZWdpbnt0YWJsZWl2fXtsfGN8bHxjfXttZW1iZXJ9e0F0dHJpYnV0ZX17SW5kZXh9e1ZhbHVlfXtWYWx1ZSBpZiBub3QgcHJlc2VudH0KKyAgXGxpbmVpdntzY2hlbWV9ICB7MH0ge1VSTCBzY2hlbWUgc3BlY2lmaWVyfSAgICAgICAgICAgICB7ZW1wdHkgc3RyaW5nfQorICBcbGluZWl2e25ldGxvY30gIHsxfSB7TmV0d29yayBsb2NhdGlvbiBwYXJ0fSAgICAgICAgICAgIHtlbXB0eSBzdHJpbmd9CisgIFxsaW5laXZ7cGF0aH0gICAgezJ9IHtIaWVyYXJjaGljYWwgcGF0aH0gICAgICAgICAgICAgICAge2VtcHR5IHN0cmluZ30KKyAgXGxpbmVpdntwYXJhbXN9ICB7M30ge1BhcmFtZXRlcnMgZm9yIGxhc3QgcGF0aCBlbGVtZW50fSB7ZW1wdHkgc3RyaW5nfQorICBcbGluZWl2e3F1ZXJ5fSAgIHs0fSB7UXVlcnkgY29tcG9uZW50fSAgICAgICAgICAgICAgICAgIHtlbXB0eSBzdHJpbmd9CisgIFxsaW5laXZ7ZnJhZ21lbnR9ezV9IHtGcmFnbWVudCBpZGVudGlmaWVyfSAgICAgICAgICAgICAge2VtcHR5IHN0cmluZ30KKyAgXGxpbmVpdnt1c2VybmFtZX17IH0ge1VzZXIgbmFtZX0gICAgICAgICAgICAgICAgICAgICAgICB7XGNvbnN0YW50e05vbmV9fQorICBcbGluZWl2e3Bhc3N3b3JkfXsgfSB7UGFzc3dvcmR9ICAgICAgICAgICAgICAgICAgICAgICAgIHtcY29uc3RhbnR7Tm9uZX19CisgIFxsaW5laXZ7aG9zdG5hbWV9eyB9IHtIb3N0IG5hbWUgKGxvd2VyIGNhc2UpfSAgICAgICAgICAge1xjb25zdGFudHtOb25lfX0KKyAgXGxpbmVpdntwb3J0fSAgICB7IH0ge1BvcnQgbnVtYmVyIGFzIGludGVnZXIsIGlmIHByZXNlbnR9IHtcY29uc3RhbnR7Tm9uZX19CitcZW5ke3RhYmxlaXZ9CisKK1NlZSBzZWN0aW9uflxyZWZ7dXJscGFyc2UtcmVzdWx0LW9iamVjdH0sIGBgUmVzdWx0cyBvZgorXGZ1bmN0aW9ue3VybHBhcnNlKCl9IGFuZCBcZnVuY3Rpb257dXJsc3BsaXQoKX0sJycgZm9yIG1vcmUKK2luZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQgb2JqZWN0LgorCitcdmVyc2lvbmNoYW5nZWRbQWRkZWQgYXR0cmlidXRlcyB0byByZXR1cm4gdmFsdWVdezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKLVxiZWdpbntmdW5jZGVzY317dXJsdW5wYXJzZX17dHVwbGV9Ci1Db25zdHJ1Y3QgYSBVUkwgc3RyaW5nIGZyb20gYSB0dXBsZSBhcyByZXR1cm5lZCBieSBcY29kZXt1cmxwYXJzZSgpfS4KK1xiZWdpbntmdW5jZGVzY317dXJsdW5wYXJzZX17cGFydHN9CitDb25zdHJ1Y3QgYSBVUkwgZnJvbSBhIHR1cGxlIGFzIHJldHVybmVkIGJ5IFxjb2Rle3VybHBhcnNlKCl9LgorVGhlIFx2YXJ7cGFydHN9IGFyZ3VtZW50IGJlIGFueSBzaXgtaXRlbSBpdGVyYWJsZS4KIFRoaXMgbWF5IHJlc3VsdCBpbiBhIHNsaWdodGx5IGRpZmZlcmVudCwgYnV0IGVxdWl2YWxlbnQgVVJMLCBpZiB0aGUKLVVSTCB0aGF0IHdhcyBwYXJzZWQgb3JpZ2luYWxseSBoYWQgcmVkdW5kYW50IGRlbGltaXRlcnMsIGUuZy4gYSA/IHdpdGgKLWFuIGVtcHR5IHF1ZXJ5ICh0aGUgZHJhZnQgc3RhdGVzIHRoYXQgdGhlc2UgYXJlIGVxdWl2YWxlbnQpLgorVVJMIHRoYXQgd2FzIHBhcnNlZCBvcmlnaW5hbGx5IGhhZCB1bm5lY2Vzc2FyeSBkZWxpbWl0ZXJzIChmb3IgZXhhbXBsZSwKK2EgPyB3aXRoIGFuIGVtcHR5IHF1ZXJ5OyB0aGUgUkZDIHN0YXRlcyB0aGF0IHRoZXNlIGFyZSBlcXVpdmFsZW50KS4KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317dXJsc3BsaXR9e3VybHN0cmluZ1xvcHRpb25hbHssCkBAIC03OSwxMiArMTA1LDM4IEBACiBzZXBhcmF0ZSB0aGUgcGF0aCBzZWdtZW50cyBhbmQgcGFyYW1ldGVycy4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCiA1LXR1cGxlOiAoYWRkcmVzc2luZyBzY2hlbWUsIG5ldHdvcmsgbG9jYXRpb24sIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudAogaWRlbnRpZmllcikuCisKK1RoZSByZXR1cm4gdmFsdWUgaXMgYWN0dWFsbHkgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZgorXHB5dHlwZXt0dXBsZX0uICBUaGlzIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcmVhZC1vbmx5Citjb252ZW5pZW5jZSBhdHRyaWJ1dGVzOgorCitcYmVnaW57dGFibGVpdn17bHxjfGx8Y317bWVtYmVyfXtBdHRyaWJ1dGV9e0luZGV4fXtWYWx1ZX17VmFsdWUgaWYgbm90IHByZXNlbnR9CisgIFxsaW5laXZ7c2NoZW1lfSAgIHswfSB7VVJMIHNjaGVtZSBzcGVjaWZpZXJ9ICAge2VtcHR5IHN0cmluZ30KKyAgXGxpbmVpdntuZXRsb2N9ICAgezF9IHtOZXR3b3JrIGxvY2F0aW9uIHBhcnR9ICB7ZW1wdHkgc3RyaW5nfQorICBcbGluZWl2e3BhdGh9ICAgICB7Mn0ge0hpZXJhcmNoaWNhbCBwYXRofSAgICAgIHtlbXB0eSBzdHJpbmd9CisgIFxsaW5laXZ7cXVlcnl9ICAgIHszfSB7UXVlcnkgY29tcG9uZW50fSAgICAgICAge2VtcHR5IHN0cmluZ30KKyAgXGxpbmVpdntmcmFnbWVudH0gezR9IHtGcmFnbWVudCBpZGVudGlmaWVyfSAgICB7ZW1wdHkgc3RyaW5nfQorICBcbGluZWl2e3VzZXJuYW1lfSB7IH0ge1VzZXIgbmFtZX0gICAgICAgICAgICAgIHtcY29uc3RhbnR7Tm9uZX19CisgIFxsaW5laXZ7cGFzc3dvcmR9IHsgfSB7UGFzc3dvcmR9ICAgICAgICAgICAgICAge1xjb25zdGFudHtOb25lfX0KKyAgXGxpbmVpdntob3N0bmFtZX0geyB9IHtIb3N0IG5hbWUgKGxvd2VyIGNhc2UpfSB7XGNvbnN0YW50e05vbmV9fQorICBcbGluZWl2e3BvcnR9ICAgICB7IH0ge1BvcnQgbnVtYmVyIGFzIGludGVnZXIsIGlmIHByZXNlbnR9IHtcY29uc3RhbnR7Tm9uZX19CitcZW5ke3RhYmxlaXZ9CisKK1NlZSBzZWN0aW9uflxyZWZ7dXJscGFyc2UtcmVzdWx0LW9iamVjdH0sIGBgUmVzdWx0cyBvZgorXGZ1bmN0aW9ue3VybHBhcnNlKCl9IGFuZCBcZnVuY3Rpb257dXJsc3BsaXQoKX0sJycgZm9yIG1vcmUKK2luZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQgb2JqZWN0LgorCiBcdmVyc2lvbmFkZGVkezIuMn0KK1x2ZXJzaW9uY2hhbmdlZFtBZGRlZCBhdHRyaWJ1dGVzIHRvIHJldHVybiB2YWx1ZV17Mi41fQogXGVuZHtmdW5jZGVzY30KIAotXGJlZ2lue2Z1bmNkZXNjfXt1cmx1bnNwbGl0fXt0dXBsZX0KK1xiZWdpbntmdW5jZGVzY317dXJsdW5zcGxpdH17cGFydHN9CiBDb21iaW5lIHRoZSBlbGVtZW50cyBvZiBhIHR1cGxlIGFzIHJldHVybmVkIGJ5IFxmdW5jdGlvbnt1cmxzcGxpdCgpfQogaW50byBhIGNvbXBsZXRlIFVSTCBhcyBhIHN0cmluZy4KK1RoZSBcdmFye3BhcnRzfSBhcmd1bWVudCBiZSBhbnkgZml2ZS1pdGVtIGl0ZXJhYmxlLgorVGhpcyBtYXkgcmVzdWx0IGluIGEgc2xpZ2h0bHkgZGlmZmVyZW50LCBidXQgZXF1aXZhbGVudCBVUkwsIGlmIHRoZQorVVJMIHRoYXQgd2FzIHBhcnNlZCBvcmlnaW5hbGx5IGhhZCB1bm5lY2Vzc2FyeSBkZWxpbWl0ZXJzIChmb3IgZXhhbXBsZSwKK2EgPyB3aXRoIGFuIGVtcHR5IHF1ZXJ5OyB0aGUgUkZDIHN0YXRlcyB0aGF0IHRoZXNlIGFyZSBlcXVpdmFsZW50KS4KIFx2ZXJzaW9uYWRkZWR7Mi4yfQogXGVuZHtmdW5jZGVzY30KIApAQCAtOTMsMjIgKzE0NSwxNiBAQAogKFx2YXJ7YmFzZX0pIHdpdGggYSBgYHJlbGF0aXZlIFVSTCcnIChcdmFye3VybH0pLiAgSW5mb3JtYWxseSwgdGhpcwogdXNlcyBjb21wb25lbnRzIG9mIHRoZSBiYXNlIFVSTCwgaW4gcGFydGljdWxhciB0aGUgYWRkcmVzc2luZyBzY2hlbWUsCiB0aGUgbmV0d29yayBsb2NhdGlvbiBhbmQgKHBhcnQgb2YpIHRoZSBwYXRoLCB0byBwcm92aWRlIG1pc3NpbmcKLWNvbXBvbmVudHMgaW4gdGhlIHJlbGF0aXZlIFVSTC4KLQotRXhhbXBsZToKK2NvbXBvbmVudHMgaW4gdGhlIHJlbGF0aXZlIFVSTC4gIEZvciBleGFtcGxlOgogCiBcYmVnaW57dmVyYmF0aW19Ci11cmxqb2luKCdodHRwOi8vd3d3LmN3aS5ubC8lN0VndWlkby9QeXRob24uaHRtbCcsICdGQVEuaHRtbCcpCi1cZW5ke3ZlcmJhdGltfQotCi15aWVsZHMgdGhlIHN0cmluZwotCi1cYmVnaW57dmVyYmF0aW19Cis+Pj4gZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJsam9pbgorPj4+IHVybGpvaW4oJ2h0dHA6Ly93d3cuY3dpLm5sLyU3RWd1aWRvL1B5dGhvbi5odG1sJywgJ0ZBUS5odG1sJykKICdodHRwOi8vd3d3LmN3aS5ubC8lN0VndWlkby9GQVEuaHRtbCcKIFxlbmR7dmVyYmF0aW19CiAKLVRoZSBcdmFye2FsbG93X2ZyYWdtZW50c30gYXJndW1lbnQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yCi1cY29kZXt1cmxwYXJzZSgpfS4KK1RoZSBcdmFye2FsbG93X2ZyYWdtZW50c30gYXJndW1lbnQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYW5kIGRlZmF1bHQgYXMKK2ZvciBcZnVuY3Rpb257dXJscGFyc2UoKX0uCiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3VybGRlZnJhZ317dXJsfQpAQCAtMTMzLDMgKzE3OSw2MSBAQAogICAgICAgICBib3RoIFVuaWZvcm0gUmVzb3VyY2UgTmFtZXMgKFVSTnMpIGFuZCBVbmlmb3JtIFJlc291cmNlCiAgICAgICAgIExvY2F0b3JzIChVUkxzKS59CiBcZW5ke3NlZWFsc299CisKKworXHN1YnNlY3Rpb257UmVzdWx0cyBvZiBcZnVuY3Rpb257dXJscGFyc2UoKX0gYW5kIFxmdW5jdGlvbnt1cmxzcGxpdCgpfQorICAgICAgICAgICAgXGxhYmVse3VybHBhcnNlLXJlc3VsdC1vYmplY3R9fQorCitUaGUgcmVzdWx0IG9iamVjdHMgZnJvbSB0aGUgXGZ1bmN0aW9ue3VybHBhcnNlKCl9IGFuZAorXGZ1bmN0aW9ue3VybHNwbGl0KCl9IGZ1bmN0aW9ucyBhcmUgc3ViY2xhc3NlcyBvZiB0aGUgXHB5dHlwZXt0dXBsZX0KK3R5cGUuICBUaGVzZSBzdWJjbGFzc2VzIGFkZCB0aGUgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gdGhvc2UKK2Z1bmN0aW9ucywgYXMgd2VsbCBhcyBwcm92aWRlIGFuIGFkZGl0aW9uYWwgbWV0aG9kOgorCitcYmVnaW57bWV0aG9kZGVzY31bUGFyc2VSZXN1bHRde2dldHVybH17fQorICBSZXR1cm4gdGhlIHJlLWNvbWJpbmVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsIFVSTCBhcyBhIHN0cmluZy4KKyAgVGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIG9yaWdpbmFsIFVSTCBpbiB0aGF0IHRoZSBzY2hlbWUgd2lsbCBhbHdheXMKKyAgYmUgbm9ybWFsaXplZCB0byBsb3dlciBjYXNlIGFuZCBlbXB0eSBjb21wb25lbnRzIG1heSBiZSBkcm9wcGVkLgorICBTcGVjaWZpY2FsbHksIGVtcHR5IHBhcmFtZXRlcnMsIHF1ZXJpZXMsIGFuZCBmcmFnbWVudCBpZGVudGlmaWVycworICB3aWxsIGJlIHJlbW92ZWQuCisKKyAgVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyBhIGZpeHBvaW50IGlmIHBhc3NlZCBiYWNrIHRocm91Z2ggdGhlCisgIG9yaWdpbmFsIHBhcnNpbmcgZnVuY3Rpb246CisKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBpbXBvcnQgdXJscGFyc2UKKz4+PiB1cmwgPSAnSFRUUDovL3d3dy5QeXRob24ub3JnL2RvYy8jJworCis+Pj4gcjEgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmwpCis+Pj4gcjEuZ2V0dXJsKCkKKydodHRwOi8vd3d3LlB5dGhvbi5vcmcvZG9jLycKKworPj4+IHIyID0gdXJscGFyc2UudXJsc3BsaXQocjEuZ2V0dXJsKCkpCis+Pj4gcjIuZ2V0dXJsKCkKKydodHRwOi8vd3d3LlB5dGhvbi5vcmcvZG9jLycKK1xlbmR7dmVyYmF0aW19CisKK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHttZXRob2RkZXNjfQorCitUaGUgZm9sbG93aW5nIGNsYXNzZXMgcHJvdmlkZSB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBwYXJzZSByZXN1bHRzOjoKKworXGJlZ2lue2NsYXNzZGVzYyp9e0Jhc2VSZXN1bHR9CisgIEJhc2UgY2xhc3MgZm9yIHRoZSBjb25jcmV0ZSByZXN1bHQgY2xhc3Nlcy4gIFRoaXMgcHJvdmlkZXMgbW9zdCBvZgorICB0aGUgYXR0cmlidXRlIGRlZmluaXRpb25zLiAgSXQgZG9lcyBub3QgcHJvdmlkZSBhIFxtZXRob2R7Z2V0dXJsKCl9CisgIG1ldGhvZC4gIEl0IGlzIGRlcml2ZWQgZnJvbSBcY2xhc3N7dHVwbGV9LCBidXQgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlCisgIFxtZXRob2R7X19pbml0X18oKX0gb3IgXG1ldGhvZHtfX25ld19fKCl9IG1ldGhvZHMuCitcZW5ke2NsYXNzZGVzYyp9CisKKworXGJlZ2lue2NsYXNzZGVzY317UGFyc2VSZXN1bHR9e3NjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudH0KKyAgQ29uY3JldGUgY2xhc3MgZm9yIFxmdW5jdGlvbnt1cmxwYXJzZSgpfSByZXN1bHRzLiAgVGhlCisgIFxtZXRob2R7X19uZXdfXygpfSBtZXRob2QgaXMgb3ZlcnJpZGRlbiB0byBzdXBwb3J0IGNoZWNraW5nIHRoYXQgdGhlCisgIHJpZ2h0IG51bWJlciBvZiBhcmd1bWVudHMgYXJlIHBhc3NlZC4KK1xlbmR7Y2xhc3NkZXNjfQorCisKK1xiZWdpbntjbGFzc2Rlc2N9e1NwbGl0UmVzdWx0fXtzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50fQorICBDb25jcmV0ZSBjbGFzcyBmb3IgXGZ1bmN0aW9ue3VybHNwbGl0KCl9IHJlc3VsdHMuICBUaGUKKyAgXG1ldGhvZHtfX25ld19fKCl9IG1ldGhvZCBpcyBvdmVycmlkZGVuIHRvIHN1cHBvcnQgY2hlY2tpbmcgdGhhdCB0aGUKKyAgcmlnaHQgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcmUgcGFzc2VkLgorXGVuZHtjbGFzc2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYndhcm5pbmdzLnRleCBiL0RvYy9saWIvbGlid2FybmluZ3MudGV4CmluZGV4IDg2NTU0NTEuLjdiODI5YTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlid2FybmluZ3MudGV4CisrKyBiL0RvYy9saWIvbGlid2FybmluZ3MudGV4CkBAIC0xNjksNyArMTY5LDggQEAKIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317d2Fybl9leHBsaWNpdH17bWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLAotIGxpbmVub1xvcHRpb25hbHssIG1vZHVsZVxvcHRpb25hbHssIHJlZ2lzdHJ5fX19CisgbGluZW5vXG9wdGlvbmFseywgbW9kdWxlXG9wdGlvbmFseywgcmVnaXN0cnlcb3B0aW9uYWx7LAorIG1vZHVsZV9nbG9iYWxzfX19fQogVGhpcyBpcyBhIGxvdy1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIGZ1bmN0aW9uYWxpdHkgb2YKIFxmdW5jdGlvbnt3YXJuKCl9LCBwYXNzaW5nIGluIGV4cGxpY2l0bHkgdGhlIG1lc3NhZ2UsIGNhdGVnb3J5LAogZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyLCBhbmQgb3B0aW9uYWxseSB0aGUgbW9kdWxlIG5hbWUgYW5kIHRoZQpAQCAtMTc5LDYgKzE4MCwxMSBAQAogXHZhcnttZXNzYWdlfSBtdXN0IGJlIGEgc3RyaW5nIGFuZCBcdmFye2NhdGVnb3J5fSBhIHN1YmNsYXNzIG9mCiBcZXhjZXB0aW9ue1dhcm5pbmd9IG9yIFx2YXJ7bWVzc2FnZX0gbWF5IGJlIGEgXGV4Y2VwdGlvbntXYXJuaW5nfSBpbnN0YW5jZSwKIGluIHdoaWNoIGNhc2UgXHZhcntjYXRlZ29yeX0gd2lsbCBiZSBpZ25vcmVkLgorCitcdmFye21vZHVsZV9nbG9iYWxzfSwgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBpbiB1c2UKK2J5IHRoZSBjb2RlIGZvciB3aGljaCB0aGUgd2FybmluZyBpcyBpc3N1ZWQuICAoVGhpcyBhcmd1bWVudCBpcyB1c2VkIHRvCitzdXBwb3J0IGRpc3BsYXlpbmcgc291cmNlIGZvciBtb2R1bGVzIGZvdW5kIGluIHppcGZpbGVzIG9yIG90aGVyCitub24tZmlsZXN5c3RlbSBpbXBvcnQgc291cmNlcywgYW5kIHdhcyBhZGRlZCBpbiBQeXRob24gMi41LikKIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317c2hvd3dhcm5pbmd9e21lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlieG1scnBjbGliLnRleCBiL0RvYy9saWIvbGlieG1scnBjbGliLnRleAppbmRleCAwZmI4OGM1Li4xYzM2Zjk5IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnhtbHJwY2xpYi50ZXgKKysrIGIvRG9jL2xpYi9saWJ4bWxycGNsaWIudGV4CkBAIC0yMDMsNyArMjAzLDcgQEAKIAogXHN1YnNlY3Rpb257QmluYXJ5IE9iamVjdHMgXGxhYmVse2JpbmFyeS1vYmplY3RzfX0KIAotVGhpcyBjbGFzcyBtYXkgaW5pdGlhbGl6ZWQgZnJvbSBzdHJpbmcgZGF0YSAod2hpY2ggbWF5IGluY2x1ZGUgTlVMcykuCitUaGlzIGNsYXNzIG1heSBiZSBpbml0aWFsaXplZCBmcm9tIHN0cmluZyBkYXRhICh3aGljaCBtYXkgaW5jbHVkZSBOVUxzKS4KIFRoZSBwcmltYXJ5IGFjY2VzcyB0byB0aGUgY29udGVudCBvZiBhIFxjbGFzc3tCaW5hcnl9IG9iamVjdCBpcwogcHJvdmlkZWQgYnkgYW4gYXR0cmlidXRlOgogCkBAIC0zMDMsMTAgKzMwMyw2IEBACiBcY29kZXtUcnVlfSBvciBcY29kZXtGYWxzZX0uCiBcZW5ke2Z1bmNkZXNjfQogCi1cYmVnaW57ZnVuY2Rlc2N9e2JpbmFyeX17ZGF0YX0KLVRyaXZpYWxseSBjb252ZXJ0IGFueSBQeXRob24gc3RyaW5nIHRvIGEgXGNsYXNze0JpbmFyeX0gb2JqZWN0LgotXGVuZHtmdW5jZGVzY30KLQogXGJlZ2lue2Z1bmNkZXNjfXtkdW1wc317cGFyYW1zXG9wdGlvbmFseywgbWV0aG9kbmFtZVxvcHRpb25hbHssIAogCSAgICAgICAgICAgICAgICBtZXRob2RyZXNwb25zZVxvcHRpb25hbHssIGVuY29kaW5nXG9wdGlvbmFseywKIAkgICAgICAgICAgICAgICAgYWxsb3dfbm9uZX19fX19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnppcGZpbGUudGV4IGIvRG9jL2xpYi9saWJ6aXBmaWxlLnRleAppbmRleCAzMmNhM2UwLi40ZTA2ZWY2IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnppcGZpbGUudGV4CisrKyBiL0RvYy9saWIvbGliemlwZmlsZS50ZXgKQEAgLTE0MSwxMCArMTQxLDE3IEBACiAgIFdyaXRlIHRoZSBmaWxlIG5hbWVkIFx2YXJ7ZmlsZW5hbWV9IHRvIHRoZSBhcmNoaXZlLCBnaXZpbmcgaXQgdGhlCiAgIGFyY2hpdmUgbmFtZSBcdmFye2FyY25hbWV9IChieSBkZWZhdWx0LCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMKICAgXHZhcntmaWxlbmFtZX0sIGJ1dCB3aXRob3V0IGEgZHJpdmUgbGV0dGVyIGFuZCB3aXRoIGxlYWRpbmcgcGF0aAotICBzZXBhcmF0b3JzIHJlbW92ZWQpLiAgSWYgZ2l2ZW4sIFx2YXJ7Y29tcHJlc3NfdHlwZX0gb3ZlcnJpZGVzIHRoZSB2YWx1ZQotICBnaXZlbiBmb3IgdGhlIFx2YXJ7Y29tcHJlc3Npb259IHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IgZm9yCi0gIHRoZSBuZXcgZW50cnkuICBUaGUgYXJjaGl2ZSBtdXN0IGJlIG9wZW4gd2l0aCBtb2RlIFxjb2Rleyd3J30gb3IKLSAgXGNvZGV7J2EnfS4KKyAgc2VwYXJhdG9ycyByZW1vdmVkKS4gIElmIGdpdmVuLCBcdmFye2NvbXByZXNzX3R5cGV9IG92ZXJyaWRlcyB0aGUKKyAgdmFsdWUgZ2l2ZW4gZm9yIHRoZSBcdmFye2NvbXByZXNzaW9ufSBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yCisgIGZvciB0aGUgbmV3IGVudHJ5LiAgVGhlIGFyY2hpdmUgbXVzdCBiZSBvcGVuIHdpdGggbW9kZSBcY29kZXsndyd9CisgIG9yIFxjb2RleydhJ30uCisgIAorICBcbm90ZXtUaGVyZSBpcyBubyBvZmZpY2lhbCBmaWxlIG5hbWUgZW5jb2RpbmcgZm9yIFpJUCBmaWxlcy4KKyAgSWYgeW91IGhhdmUgdW5pY29kZSBmaWxlIG5hbWVzLCBwbGVhc2UgY29udmVydCB0aGVtIHRvIGJ5dGUgc3RyaW5ncworICBpbiB5b3VyIGRlc2lyZWQgZW5jb2RpbmcgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byBcbWV0aG9ke3dyaXRlKCl9LgorICBXaW5aaXAgaW50ZXJwcmV0cyBhbGwgZmlsZSBuYW1lcyBhcyBlbmNvZGVkIGluIENQNDM3LCBhbHNvIGtub3duCisgIGFzIERPUyBMYXRpbi59CisKICAgXG5vdGV7QXJjaGl2ZSBuYW1lcyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGFyY2hpdmUgcm9vdCwgdGhhdCBpcywKICAgICAgICAgdGhleSBzaG91bGQgbm90IHN0YXJ0IHdpdGggYSBwYXRoIHNlcGFyYXRvci59CiBcZW5ke21ldGhvZGRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnppcGltcG9ydC50ZXggYi9Eb2MvbGliL2xpYnppcGltcG9ydC50ZXgKaW5kZXggMGE2MGIyOS4uNzcwZWEyMSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ6aXBpbXBvcnQudGV4CisrKyBiL0RvYy9saWIvbGliemlwaW1wb3J0LnRleApAQCAtNjksOCArNjksOCBAQAogCiBcYmVnaW57Y2xhc3NkZXNjfXt6aXBpbXBvcnRlcn17YXJjaGl2ZXBhdGh9IAogICBDcmVhdGUgYSBuZXcgemlwaW1wb3J0ZXIgaW5zdGFuY2UuIFx2YXJ7YXJjaGl2ZXBhdGh9IG11c3QgYmUgYSBwYXRoIHRvCi0gIGEgemlwZmlsZS4gIFxjbGFzc3taaXBJbXBvcnRFcnJvcn0gaXMgcmFpc2VkIGlmIFx2YXJ7YXJjaGl2ZXBhdGh9IGRvZXNuJ3QKLSAgcG9pbnQgdG8gYSB2YWxpZCBaSVAgYXJjaGl2ZS4KKyAgYSB6aXBmaWxlLiAgXGV4Y2VwdGlvbntaaXBJbXBvcnRFcnJvcn0gaXMgcmFpc2VkIGlmIFx2YXJ7YXJjaGl2ZXBhdGh9CisgIGRvZXNuJ3QgcG9pbnQgdG8gYSB2YWxpZCBaSVAgYXJjaGl2ZS4KIFxlbmR7Y2xhc3NkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317ZmluZF9tb2R1bGV9e2Z1bGxuYW1lXG9wdGlvbmFseywgcGF0aH19CkBAIC04Myw3ICs4Myw3IEBACiAKIFxiZWdpbnttZXRob2RkZXNjfXtnZXRfY29kZX17ZnVsbG5hbWV9CiAgIFJldHVybiB0aGUgY29kZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiBSYWlzZQotICBcY2xhc3N7WmlwSW1wb3J0RXJyb3J9IGlmIHRoZSBtb2R1bGUgY291bGRuJ3QgYmUgZm91bmQuCisgIFxleGNlcHRpb257WmlwSW1wb3J0RXJyb3J9IGlmIHRoZSBtb2R1bGUgY291bGRuJ3QgYmUgZm91bmQuCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfXtnZXRfZGF0YX17cGF0aG5hbWV9CkBAIC05MywyMCArOTMsMjAgQEAKIAogXGJlZ2lue21ldGhvZGRlc2N9e2dldF9zb3VyY2V9e2Z1bGxuYW1lfQogICBSZXR1cm4gdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gUmFpc2UKLSAgXGNsYXNze1ppcEltcG9ydEVycm9yfSBpZiB0aGUgbW9kdWxlIGNvdWxkbid0IGJlIGZvdW5kLCByZXR1cm4KKyAgXGV4Y2VwdGlvbntaaXBJbXBvcnRFcnJvcn0gaWYgdGhlIG1vZHVsZSBjb3VsZG4ndCBiZSBmb3VuZCwgcmV0dXJuCiAgIFxjb25zdGFudHtOb25lfSBpZiB0aGUgYXJjaGl2ZSBkb2VzIGNvbnRhaW4gdGhlIG1vZHVsZSwgYnV0IGhhcwogICBubyBzb3VyY2UgZm9yIGl0LgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317aXNfcGFja2FnZX17ZnVsbG5hbWV9CiAgIFJldHVybiBUcnVlIGlmIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGJ5IFx2YXJ7ZnVsbG5hbWV9IGlzIGEgcGFja2FnZS4KLSAgUmFpc2UgXGNsYXNze1ppcEltcG9ydEVycm9yfSBpZiB0aGUgbW9kdWxlIGNvdWxkbid0IGJlIGZvdW5kLgorICBSYWlzZSBcZXhjZXB0aW9ue1ppcEltcG9ydEVycm9yfSBpZiB0aGUgbW9kdWxlIGNvdWxkbid0IGJlIGZvdW5kLgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317bG9hZF9tb2R1bGV9e2Z1bGxuYW1lfQogICBMb2FkIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGJ5IFx2YXJ7ZnVsbG5hbWV9LiBcdmFye2Z1bGxuYW1lfSBtdXN0IGJlIHRoZQogICBmdWxseSBxdWFsaWZpZWQgKGRvdHRlZCkgbW9kdWxlIG5hbWUuIEl0IHJldHVybnMgdGhlIGltcG9ydGVkCi0gIG1vZHVsZSwgb3IgcmFpc2VzIFxjbGFzc3taaXBJbXBvcnRFcnJvcn0gaWYgaXQgd2Fzbid0IGZvdW5kLgorICBtb2R1bGUsIG9yIHJhaXNlcyBcZXhjZXB0aW9ue1ppcEltcG9ydEVycm9yfSBpZiBpdCB3YXNuJ3QgZm91bmQuCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxzdWJzZWN0aW9ue0V4YW1wbGVzfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ6bGliLnRleCBiL0RvYy9saWIvbGliemxpYi50ZXgKaW5kZXggMmRmOGI4NS4uZGZiYjQzZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ6bGliLnRleAorKysgYi9Eb2MvbGliL2xpYnpsaWIudGV4CkBAIC0xNjYsMTEgKzE2NiwxNCBAQAogZGVjb21wcmVzc2VkLCBhbmQgXG1lbWJlcnt1bmNvbnN1bWVkX3RhaWx9IGlzIGFuIGVtcHR5IHN0cmluZy4KIFxlbmR7bWV0aG9kZGVzY30KIAotXGJlZ2lue21ldGhvZGRlc2N9W0RlY29tcHJlc3Nde2ZsdXNofXt9CitcYmVnaW57bWV0aG9kZGVzY31bRGVjb21wcmVzc117Zmx1c2h9e1xvcHRpb25hbHtsZW5ndGh9fQogQWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkLCBhbmQgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmVtYWluaW5nCiB1bmNvbXByZXNzZWQgb3V0cHV0IGlzIHJldHVybmVkLiAgQWZ0ZXIgY2FsbGluZyBcbWV0aG9ke2ZsdXNoKCl9LCB0aGUKIFxtZXRob2R7ZGVjb21wcmVzcygpfSBtZXRob2QgY2Fubm90IGJlIGNhbGxlZCBhZ2FpbjsgdGhlIG9ubHkgcmVhbGlzdGljCiBhY3Rpb24gaXMgdG8gZGVsZXRlIHRoZSBvYmplY3QuCisKK1RoZSBvcHRpb25hbCBwYXJhbWV0ZXIgXHZhcntsZW5ndGh9IHNldHMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUKK291dHB1dCBidWZmZXIuCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbntzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9taW1lbGliLnRleCBiL0RvYy9saWIvbWltZWxpYi50ZXgKaW5kZXggNjdkZTU5Ny4uNDkxZDg0NCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9taW1lbGliLnRleAorKysgYi9Eb2MvbGliL21pbWVsaWIudGV4CkBAIC0xMiw5ICsxMiw5IEBACiBcYXV0aG9yYWRkcmVzc3tcZW1haWx7YmFycnlAcHl0aG9uLm9yZ319CiAKIFxkYXRle1x0b2RheX0KLVxyZWxlYXNlezMuMH0JCQklIHNvZnR3YXJlIHJlbGVhc2UsIG5vdCBkb2N1bWVudGF0aW9uCitccmVsZWFzZXs0LjB9CQkJJSBzb2Z0d2FyZSByZWxlYXNlLCBub3QgZG9jdW1lbnRhdGlvbgogXHNldHJlbGVhc2VpbmZve30JCSUgZW1wdHkgZm9yIGZpbmFsIHJlbGVhc2UKLVxzZXRzaG9ydHZlcnNpb257My4wfQkJJSBtYWpvci5taW5vciBvbmx5IGZvciBzb2Z0d2FyZQorXHNldHNob3J0dmVyc2lvbns0LjB9CQklIG1ham9yLm1pbm9yIG9ubHkgZm9yIHNvZnR3YXJlCiAKIFxiZWdpbntkb2N1bWVudH0KIApAQCAtMzgsMTEgKzM4LDExIEBACiBwYXJzZSwgZ2VuZXJhdGUsIGFuZCBtb2RpZnkgZW1haWwgbWVzc2FnZXMsIGNvbmZvcm1pbmcgdG8gYWxsIHRoZQogcmVsZXZhbnQgZW1haWwgYW5kIE1JTUUgcmVsYXRlZCBSRkNzLgogCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB2ZXJzaW9uIDMuMCBvZiB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSwgd2hpY2ggaXMKLWRpc3RyaWJ1dGVkIHdpdGggUHl0aG9uIDIuNCBhbmQgaXMgYXZhaWxhYmxlIGFzIGEgc3RhbmRhbG9uZSBkaXN0dXRpbHMtYmFzZWQKLXBhY2thZ2UgZm9yIHVzZSB3aXRoIFB5dGhvbiAyLjMuICBcbW9kdWxle2VtYWlsfSAzLjAgaXMgbm90IGNvbXBhdGlibGUgd2l0aAotUHl0aG9uIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAyLjMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLVxtb2R1bGV7ZW1haWx9IHBhY2thZ2UsIGluY2x1ZGluZyBkb3dubG9hZCBsaW5rcyBhbmQgbWFpbGluZyBsaXN0cywgc2VlCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB2ZXJzaW9uIDQuMCBvZiB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSwgd2hpY2ggaXMKK2Rpc3RyaWJ1dGVkIHdpdGggUHl0aG9uIDIuNSBhbmQgaXMgYXZhaWxhYmxlIGFzIGEgc3RhbmRhbG9uZSBkaXN0dXRpbHMtYmFzZWQKK3BhY2thZ2UgZm9yIHVzZSB3aXRoIGVhcmxpZXIgUHl0aG9uIHZlcnNpb25zLiAgXG1vZHVsZXtlbWFpbH0gNC4wIGlzIG5vdAorY29tcGF0aWJsZSB3aXRoIFB5dGhvbiB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gMi4zLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3RoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlLCBpbmNsdWRpbmcgZG93bmxvYWQgbGlua3MgYW5kIG1haWxpbmcgbGlzdHMsIHNlZQogXHVsaW5re1B5dGhvbidzIGVtYWlsIFNJR317aHR0cDovL3d3dy5weXRob24ub3JnL3NpZ3MvZW1haWwtc2lnfS4KIAogVGhlIGRvY3VtZW50YXRpb24gdGhhdCBmb2xsb3dzIHdhcyB3cml0dGVuIGZvciB0aGUgUHl0aG9uIHByb2plY3QsIHNvCkBAIC01MSw3ICs1MSw4IEBACiAKIFxiZWdpbntpdGVtaXplfQogXGl0ZW0gRGVwcmVjYXRpb24gYW5kIGBgdmVyc2lvbiBhZGRlZCcnIG5vdGVzIGFyZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgIFB5dGhvbiB2ZXJzaW9uIGEgZmVhdHVyZSB3YXMgYWRkZWQgb3IgZGVwcmVjYXRlZC4KKyAgICAgIFB5dGhvbiB2ZXJzaW9uIGEgZmVhdHVyZSB3YXMgYWRkZWQgb3IgZGVwcmVjYXRlZC4gIFNlZQorICAgICAgdGhlIHBhY2thZ2UgaGlzdG9yeSBpbiBzZWN0aW9uIFxyZWZ7ZW1haWwtcGtnLWhpc3Rvcnl9IGZvciBkZXRhaWxzLgogCiBcaXRlbSBJZiB5b3UncmUgcmVhZGluZyB0aGlzIGRvY3VtZW50YXRpb24gYXMgcGFydCBvZiB0aGUKICAgICAgIHN0YW5kYWxvbmUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSwgc29tZSBvZiB0aGUgaW50ZXJuYWwgbGlua3MgdG8KZGlmZiAtLWdpdCBhL0RvYy9saWIveG1sZG9tbWluaWRvbS50ZXggYi9Eb2MvbGliL3htbGRvbW1pbmlkb20udGV4CmluZGV4IGY3NjU3ZWIuLjA5MzkxNWYgMTAwNjQ0Ci0tLSBhL0RvYy9saWIveG1sZG9tbWluaWRvbS50ZXgKKysrIGIvRG9jL2xpYi94bWxkb21taW5pZG9tLnRleApAQCAtMTY1LDcgKzE2NSw3IEBACiAKIFdpdGggYW4gZXhwbGljaXQgXHZhcntlbmNvZGluZ30gYXJndW1lbnQsIHRoZSByZXN1bHQgaXMgYSBieXRlIHN0cmluZwogaW4gdGhlIHNwZWNpZmllZCBlbmNvZGluZy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGlzIGFyZ3VtZW50IGlzCi1hbHdheXMgc3BlY2lmaWVkLiBUbyBhdm9pZCBVbmljb2RlRXJyb3IgZXhjZXB0aW9ucyBpbiBjYXNlIG9mCithbHdheXMgc3BlY2lmaWVkLiBUbyBhdm9pZCBcZXhjZXB0aW9ue1VuaWNvZGVFcnJvcn0gZXhjZXB0aW9ucyBpbiBjYXNlIG9mCiB1bnJlcHJlc2VudGFibGUgdGV4dCBkYXRhLCB0aGUgZW5jb2RpbmcgYXJndW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZAogYXMgInV0Zi04Ii4KIApkaWZmIC0tZ2l0IGEvRG9jL3B5dGhvbi1kb2NzLnR4dCBiL0RvYy9weXRob24tZG9jcy50eHQKaW5kZXggMDE3ZmVjZS4uYmY0NzViNiAxMDA2NDQKLS0tIGEvRG9jL3B5dGhvbi1kb2NzLnR4dAorKysgYi9Eb2MvcHl0aG9uLWRvY3MudHh0CkBAIC0xODAsNCArMTgwLDQgQEAKICAgICAgIHdoZXRoZXIgaXQncyBzYWZlIHRvIHJlbW92ZSwgc2VlIHRoZSAiV2h5IGlzIFB5dGhvbiBJbnN0YWxsZWQgb24KICAgICAgIG15IENvbXB1dGVyPyIgRkFRLCBmb3VuZCBhdDoKIAotICAgICAgICAgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvZmFxL2luc3RhbGxlZC5odG1sCisgICAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9mYXEvaW5zdGFsbGVkLwpkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWYzLnRleCBiL0RvYy9yZWYvcmVmMy50ZXgKaW5kZXggNzM3Yjg2MS4uOTY0MDEzZiAxMDA2NDQKLS0tIGEvRG9jL3JlZi9yZWYzLnRleAorKysgYi9Eb2MvcmVmL3JlZjMudGV4CkBAIC0xMDM1LDcgKzEwMzUsNyBAQAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue05ldy1zdHlsZSBhbmQgY2xhc3NpYyBjbGFzc2VzfQogCi1DbGFzc2VzIGFuZCBpbnN0YW5jZXMgY29tZSBpbiB0d28gZmxhdm91cnM6IG9sZC1zdHlsZSBvciBjbGFzc2ljLCBhbmQgbmV3LXN0eWxlLiAgCitDbGFzc2VzIGFuZCBpbnN0YW5jZXMgY29tZSBpbiB0d28gZmxhdm9yczogb2xkLXN0eWxlIG9yIGNsYXNzaWMsIGFuZCBuZXctc3R5bGUuICAKIAogVXAgdG8gUHl0aG9uIDIuMSwgb2xkLXN0eWxlIGNsYXNzZXMgd2VyZSB0aGUgb25seSBmbGF2b3VyIGF2YWlsYWJsZSB0byB0aGUKIHVzZXIuICBUaGUgY29uY2VwdCBvZiAob2xkLXN0eWxlKSBjbGFzcyBpcyB1bnJlbGF0ZWQgdG8gdGhlIGNvbmNlcHQgb2YgdHlwZTogaWYKQEAgLTEwNjUsMTAgKzEwNjUsMTQgQEAKIGltcGxlbWVudGVkIGJlZm9yZSBmb3IgY29tcGF0aWJpbGl0eSBjb25jZXJucywgbGlrZSB0aGUgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIKIGluIGNhc2Ugb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCiAKLVRoaXMgbWFudWVsIGlzIG5vdCB1cC10by1kYXRlIHdpdGggcmVzcGVjdCB0byBuZXctc3R5bGUgY2xhc3Nlcy4gIEZvciBub3csCitUaGlzIG1hbnVhbCBpcyBub3QgdXAtdG8tZGF0ZSB3aXRoIHJlc3BlY3QgdG8gbmV3LXN0eWxlIGNsYXNzZXMuICBGb3Igbm93LAogcGxlYXNlIHNlZSBcdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvbmV3c3R5bGUuaHRtbH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKLVRoZSBwbGFuIGlzIHRvIGV2ZW50dWFsbHkgZHJvcCBvbGQtc3R5bGUgY2xhc3NlcywgbGVhdmluZyBvbmx5IHRoZSBzZW1hbnRpY3Mgb2YgbmV3LXN0eWxlIGNsYXNzZXMuICBUaGlzIGNoYW5nZSB3aWxsIHByb2JhYmx5IG9ubHkgYmUgZmVhc2libGUgaW4gUHl0aG9uIDMuMC4KK1RoZSBwbGFuIGlzIHRvIGV2ZW50dWFsbHkgZHJvcCBvbGQtc3R5bGUgY2xhc3NlcywgbGVhdmluZyBvbmx5IHRoZSBzZW1hbnRpY3Mgb2YKK25ldy1zdHlsZSBjbGFzc2VzLiAgVGhpcyBjaGFuZ2Ugd2lsbCBwcm9iYWJseSBvbmx5IGJlIGZlYXNpYmxlIGluIFB5dGhvbiAzLjAuCitcaW5kZXh7Y2xhc3N9e25ldy1zdHlsZX0KK1xpbmRleHtjbGFzc317Y2xhc3NpY30KK1xpbmRleHtjbGFzc317b2xkLXN0eWxlfQogCiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogXHNlY3Rpb257U3BlY2lhbCBtZXRob2QgbmFtZXNcbGFiZWx7c3BlY2lhbG5hbWVzfX0KQEAgLTIwNTMsMTQgKzIwNTcsMTUgQEAKIFxpdGVtCiAKIEV4Y2VwdGlvbiB0byB0aGUgcHJldmlvdXMgaXRlbTogaWYgdGhlIGxlZnQgb3BlcmFuZCBpcyBhbiBpbnN0YW5jZSBvZgotYSBidWlsdC1pbiB0eXBlIG9yIGEgbmV3LXN0eWxlIGNsYXNzLCBhbmQgdGhlIHJpZ2h0IG9wZXJhbmQgaXMgYW4KLWluc3RhbmNlIG9mIGEgcHJvcGVyIHN1YmNsYXNzIG9mIHRoYXQgdHlwZSBvciBjbGFzcywgdGhlIHJpZ2h0Ci1vcGVyYW5kJ3MgXG1ldGhvZHtfX3JvcF9fKCl9IG1ldGhvZCBpcyB0cmllZCBcZW1waHtiZWZvcmV9IHRoZSBsZWZ0Ci1vcGVyYW5kJ3MgXG1ldGhvZHtfX29wX18oKX0gbWV0aG9kLiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgYSBzdWJjbGFzcyBjYW4KLWNvbXBsZXRlbHkgb3ZlcnJpZGUgYmluYXJ5IG9wZXJhdG9ycy4gIE90aGVyd2lzZSwgdGhlIGxlZnQgb3BlcmFuZCdzCi1fX29wX18gbWV0aG9kIHdvdWxkIGFsd2F5cyBhY2NlcHQgdGhlIHJpZ2h0IG9wZXJhbmQ6IHdoZW4gYW4gaW5zdGFuY2UKLW9mIGEgZ2l2ZW4gY2xhc3MgaXMgZXhwZWN0ZWQsIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgdGhhdCBjbGFzcwotaXMgYWx3YXlzIGFjY2VwdGFibGUuCithIGJ1aWx0LWluIHR5cGUgb3IgYSBuZXctc3R5bGUgY2xhc3MsIGFuZCB0aGUgcmlnaHQgb3BlcmFuZCBpcyBhbiBpbnN0YW5jZQorb2YgYSBwcm9wZXIgc3ViY2xhc3Mgb2YgdGhhdCB0eXBlIG9yIGNsYXNzIGFuZCBvdmVycmlkZXMgdGhlIGJhc2UncworXG1ldGhvZHtfX3JvcF9fKCl9IG1ldGhvZCwgdGhlIHJpZ2h0IG9wZXJhbmQncyBcbWV0aG9ke19fcm9wX18oKX0gbWV0aG9kCitpcyB0cmllZCBcZW1waHtiZWZvcmV9IHRoZSBsZWZ0IG9wZXJhbmQncyBcbWV0aG9ke19fb3BfXygpfSBtZXRob2QuCisKK1RoaXMgaXMgZG9uZSBzbyB0aGF0IGEgc3ViY2xhc3MgY2FuIGNvbXBsZXRlbHkgb3ZlcnJpZGUgYmluYXJ5IG9wZXJhdG9ycy4KK090aGVyd2lzZSwgdGhlIGxlZnQgb3BlcmFuZCdzIFxtZXRob2R7X19vcF9fKCl9IG1ldGhvZCB3b3VsZCBhbHdheXMKK2FjY2VwdCB0aGUgcmlnaHQgb3BlcmFuZDogd2hlbiBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIGNsYXNzIGlzIGV4cGVjdGVkLAorYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB0aGF0IGNsYXNzIGlzIGFsd2F5cyBhY2NlcHRhYmxlLgogCiBcaXRlbQogCkBAIC0yMTA2LDMgKzIxMTEsNjMgQEAKIFxmdW5jdGlvbntjb2VyY2UoKX0gZnVuY3Rpb24uCiAKIFxlbmR7aXRlbWl6ZX0KKworXHN1YnNlY3Rpb257Q29udGV4dCBNYW5hZ2VycyBhbmQgQ29udGV4dHNcbGFiZWx7Y29udGV4dC1tYW5hZ2Vyc319CisKK1x2ZXJzaW9uYWRkZWR7Mi41fQorCitBIFxkZm57Y29udGV4dCBtYW5hZ2VyfSBpcyBhbiBvYmplY3QgdGhhdCBtYW5hZ2VzIHRoZSBlbnRyeSB0bywgYW5kIGV4aXQKK2Zyb20sIGEgXGRmbntjb250ZXh0fSBzdXJyb3VuZGluZyBhIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZQorbm9ybWFsbHkgaW52b2tlZCB1c2luZyB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IChkZXNjcmliZWQgaW4KK3NlY3Rpb25+XHJlZnt3aXRofSksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyCittZXRob2RzLgorXHN0aW5kZXh7d2l0aH0KK1xpbmRleHtjb250ZXh0IG1hbmFnZXJ9CitcaW5kZXh7Y29udGV4dH0KKworVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzCitraW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkCitmaWxlcywgZXRjLgorCitcYmVnaW57bWV0aG9kZGVzY31bY29udGV4dCBtYW5hZ2VyXXtfX2NvbnRleHRfX317c2VsZn0KK0ludm9rZWQgd2hlbiB0aGUgb2JqZWN0IGlzIHVzZWQgYXMgdGhlIGNvbnRleHQgZXhwcmVzc2lvbiBvZiBhCitca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgaW1wbGVtZW50CitcbWV0aG9ke19fZW50ZXJfXygpfSBhbmQgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2RzLiAgU2ltcGxlIGNvbnRleHQKK21hbmFnZXJzIHRoYXQgd2lzaCB0byBkaXJlY3RseQoraW1wbGVtZW50IFxtZXRob2R7X19lbnRlcl9fKCl9IGFuZCBcbWV0aG9ke19fZXhpdF9fKCl9IHNob3VsZCBqdXN0CityZXR1cm4gXHZhcntzZWxmfS4KKworQ29udGV4dCBtYW5hZ2VycyB3cml0dGVuIGluIFB5dGhvbiBjYW4gYWxzbyBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdXNpbmcKK2EgZ2VuZXJhdG9yIGZ1bmN0aW9uIGRlY29yYXRlZCB3aXRoIHRoZQorXGZ1bmN0aW9ue2NvbnRleHRsaWIuY29udGV4dG1hbmFnZXJ9IGRlY29yYXRvciwgYXMgdGhpcyBjYW4gYmUgc2ltcGxlcgordGhhbiB3cml0aW5nIGluZGl2aWR1YWwgXG1ldGhvZHtfX2VudGVyX18oKX0gYW5kIFxtZXRob2R7X19leGl0X18oKX0KK21ldGhvZHMgd2hlbiB0aGUgc3RhdGUgdG8gYmUgbWFuYWdlZCBpcyBjb21wbGV4LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bY29udGV4dF17X19lbnRlcl9ffXtzZWxmfQorRW50ZXIgdGhlIGNvbnRleHQgZGVmaW5lZCBieSB0aGlzIG9iamVjdC4gVGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudAord2lsbCBiaW5kIHRoaXMgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocykgc3BlY2lmaWVkIGluIHRoZQorXGtleXdvcmR7YXN9IGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtjb250ZXh0XXtfX2V4aXRfX317ZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrfQorRXhpdCB0aGUgY29udGV4dCBkZWZpbmVkIGJ5IHRoaXMgb2JqZWN0LiBUaGUgcGFyYW1ldGVycyBkZXNjcmliZSB0aGUKK2V4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZSBjb250ZXh0IHdhcworZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzIHdpbGwgYmUKK1xjb25zdGFudHtOb25lfS4KKworSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlCitleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkIHJldHVybiBhCit0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWQgbm9ybWFsbHkgdXBvbgorZXhpdCBmcm9tIHRoaXMgbWV0aG9kLgorCitOb3RlIHRoYXQgXG1ldGhvZHtfX2V4aXRfX30gbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pbgorZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue3NlZWFsc299CisgIFxzZWVwZXB7MDM0M317VGhlICJ3aXRoIiBzdGF0ZW1lbnR9CisgICAgICAgICB7VGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlCisgICAgICAgICAgUHl0aG9uIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudC59CitcZW5ke3NlZWFsc299CisKZGlmZiAtLWdpdCBhL0RvYy9yZWYvcmVmNi50ZXggYi9Eb2MvcmVmL3JlZjYudGV4CmluZGV4IGQxZDIzYWMuLjFlYjEyNTggMTAwNjQ0Ci0tLSBhL0RvYy9yZWYvcmVmNi50ZXgKKysrIGIvRG9jL3JlZi9yZWY2LnRleApAQCAtNDg4LDExICs0ODgsMTIgQEAKIGludm9rZWQsIHRoZSBmdW5jdGlvbiBjYW4gcHJvY2VlZCBleGFjdGx5IGFzIGlmIHRoZSBca2V5d29yZHt5aWVsZH0KIHN0YXRlbWVudCB3ZXJlIGp1c3QgYW5vdGhlciBleHRlcm5hbCBjYWxsLgogCi1UaGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgXGtleXdvcmR7dHJ5fQotY2xhdXNlIG9mIGEgXGtleXdvcmR7dHJ5fSAuLi5cIFxrZXl3b3Jke2ZpbmFsbHl9IGNvbnN0cnVjdC4gIFRoZQotZGlmZmljdWx0eSBpcyB0aGF0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoZSBnZW5lcmF0b3Igd2lsbCBldmVyIGJlCi1yZXN1bWVkLCBoZW5jZSBubyBndWFyYW50ZWUgdGhhdCB0aGUgXGtleXdvcmR7ZmluYWxseX0gYmxvY2sgd2lsbCBldmVyCi1nZXQgZXhlY3V0ZWQuCitBcyBvZiBQeXRob24gdmVyc2lvbiAyLjUsIHRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50IGlzIG5vdworYWxsb3dlZCBpbiB0aGUgXGtleXdvcmR7dHJ5fSBjbGF1c2Ugb2YgYSBca2V5d29yZHt0cnl9IC4uLlwgCitca2V5d29yZHtmaW5hbGx5fSBjb25zdHJ1Y3QuICBJZiB0aGUgZ2VuZXJhdG9yIGlzIG5vdCByZXN1bWVkIGJlZm9yZQoraXQgaXMgZmluYWxpemVkIChieSByZWFjaGluZyBhIHplcm8gcmVmZXJlbmNlIGNvdW50IG9yIGJ5IGJlaW5nIGdhcmJhZ2UKK2NvbGxlY3RlZCksIHRoZSBnZW5lcmF0b3ItaXRlcmF0b3IncyBcbWV0aG9ke2Nsb3NlKCl9IG1ldGhvZCB3aWxsIGJlCitjYWxsZWQsIGFsbG93aW5nIGFueSBwZW5kaW5nIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZXMgdG8gZXhlY3V0ZS4KIAogXGJlZ2lue25vdGljZX0KIEluIFB5dGhvbiAyLjIsIHRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50IGlzIG9ubHkgYWxsb3dlZApAQCAtNTEwLDYgKzUxMSwxMSBAQAogICBcc2VlcGVwezAyNTV9e1NpbXBsZSBHZW5lcmF0b3JzfQogICAgICAgICAge1RoZSBwcm9wb3NhbCBmb3IgYWRkaW5nIGdlbmVyYXRvcnMgYW5kIHRoZSBca2V5d29yZHt5aWVsZH0KICAgICAgICAgICBzdGF0ZW1lbnQgdG8gUHl0aG9uLn0KKworICBcc2VlcGVwezAzNDJ9e0Nvcm91dGluZXMgdmlhIEVuaGFuY2VkIEdlbmVyYXRvcnN9CisgICAgICAgICB7VGhlIHByb3Bvc2FsIHRoYXQsIGFtb25nIG90aGVyIGdlbmVyYXRvciBlbmhhbmNlbWVudHMsCisgICAgICAgICAgcHJvcG9zZWQgYWxsb3dpbmcgXGtleXdvcmR7eWllbGR9IHRvIGFwcGVhciBpbnNpZGUgYQorICAgICAgICAgIFxrZXl3b3Jke3RyeX0gLi4uIFxrZXl3b3Jke2ZpbmFsbHl9IGJsb2NrLn0KIFxlbmR7c2VlYWxzb30KIAogCmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjcudGV4IGIvRG9jL3JlZi9yZWY3LnRleAppbmRleCA5MDYyN2E0Li5hMmQ0NmE4IDEwMDY0NAotLS0gYS9Eb2MvcmVmL3JlZjcudGV4CisrKyBiL0RvYy9yZWYvcmVmNy50ZXgKQEAgLTQ2LDYgKzQ2LDcgQEAKICAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue3doaWxlX3N0bXR9fQogICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57Zm9yX3N0bXR9fQogICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57dHJ5X3N0bXR9fQorICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57d2l0aF9zdG10fX0KICAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue2Z1bmNkZWZ9fQogICBccHJvZHVjdGlvbmNvbnR7fCBcdG9rZW57Y2xhc3NkZWZ9fQogICBccHJvZHVjdGlvbntzdWl0ZX0KQEAgLTMwNSw4ICszMDYsNzUgQEAKIFxzZWN0aW9ue1RoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnRcbGFiZWx7d2l0aH19CiBcc3RpbmRleHt3aXRofQogCi1UaGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IHNwZWNpZmllcyAKK1x2ZXJzaW9uYWRkZWR7Mi41fQogCitUaGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sKK3dpdGggbWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUKK3NlY3Rpb25+XHJlZntjb250ZXh0LW1hbmFnZXJzfSkuIFRoaXMgYWxsb3dzIGNvbW1vbgorXGtleXdvcmR7dHJ5fS4uLlxrZXl3b3Jke2V4Y2VwdH0uLi5ca2V5d29yZHtmaW5hbGx5fSB1c2FnZSBwYXR0ZXJucyB0bworYmUgZW5jYXBzdWxhdGVkIGFzIGNvbnRleHQgbWFuYWdlcnMgZm9yIGNvbnZlbmllbnQgcmV1c2UuCisKK1xiZWdpbntwcm9kdWN0aW9ubGlzdH0KKyAgXHByb2R1Y3Rpb257d2l0aF9zdG10fQorICB7IndpdGgiIFx0b2tlbntleHByZXNzaW9ufSBbImFzIiB0YXJnZXRfbGlzdF0gIjoiIFx0b2tlbntzdWl0ZX19CitcZW5ke3Byb2R1Y3Rpb25saXN0fQorCitUaGUgZXhlY3V0aW9uIG9mIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQgcHJvY2VlZHMgYXMgZm9sbG93czoKKworXGJlZ2lue2VudW1lcmF0ZX0KKworXGl0ZW0gVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIKK29iamVjdC4KKworXGl0ZW0gVGhlIGNvbnRleHQgbWFuYWdlcidzIFxtZXRob2R7X19jb250ZXh0X18oKX0gbWV0aG9kIGlzIGludm9rZWQgdG8KK29idGFpbiBhIGNvbnRleHQgb2JqZWN0LgorCitcaXRlbSBUaGUgY29udGV4dCBvYmplY3QncyBcbWV0aG9ke19fZW50ZXJfXygpfSBtZXRob2QgaXMgaW52b2tlZC4KKworXGl0ZW0gSWYgYSB0YXJnZXQgbGlzdCB3YXMgaW5jbHVkZWQgaW4gdGhlIFxrZXl3b3Jke3dpdGh9CitzdGF0ZW1lbnQsIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBcbWV0aG9ke19fZW50ZXJfXygpfSBpcyBhc3NpZ25lZCB0byBpdC4KKworXG5vdGV7VGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlCitcbWV0aG9ke19fZW50ZXJfXygpfSBtZXRob2QgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuCitcbWV0aG9ke19fZXhpdF9fKCl9IHdpbGwgYWx3YXlzIGJlIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzCitkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMKK2FuIGVycm9yIG9jY3VycmluZyB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93Ln0KKworXGl0ZW0gVGhlIHN1aXRlIGlzIGV4ZWN1dGVkLgorCitcaXRlbSBUaGUgY29udGV4dCBvYmplY3QncyBcbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZCBpcyBpbnZva2VkLiBJZiBhbgorZXhjZXB0aW9uIGNhdXNlZCB0aGUgc3VpdGUgdG8gYmUgZXhpdGVkLCBpdHMgdHlwZSwgdmFsdWUsIGFuZAordHJhY2ViYWNrIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIFxtZXRob2R7X19leGl0X18oKX0uIE90aGVyd2lzZSwKK3RocmVlIFxjb25zdGFudHtOb25lfSBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLgorCitJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLCBhbmQgdGhlIHJldHVybgordmFsdWUgZnJvbSB0aGUgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzCityZXJhaXNlZC4gSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBhbmQKK2V4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgXGtleXdvcmR7d2l0aH0KK3N0YXRlbWVudC4KKworSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZQorcmV0dXJuIHZhbHVlIGZyb20gXG1ldGhvZHtfX2V4aXRfXygpfSBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzCithdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLgorCitcZW5ke2VudW1lcmF0ZX0KKworXGJlZ2lue25vdGljZX0KK0luIFB5dGhvbiAyLjUsIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQgaXMgb25seSBhbGxvd2VkCit3aGVuIHRoZSBcY29kZXt3aXRoX3N0YXRlbWVudH0gZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiAgSXQgd2lsbCBhbHdheXMKK2JlIGVuYWJsZWQgaW4gUHl0aG9uIDIuNi4gIFRoaXMgXGNvZGV7X19mdXR1cmVfX30gaW1wb3J0IHN0YXRlbWVudCBjYW4KK2JlIHVzZWQgdG8gZW5hYmxlIHRoZSBmZWF0dXJlOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CitcZW5ke3ZlcmJhdGltfQorXGVuZHtub3RpY2V9CisKK1xiZWdpbntzZWVhbHNvfQorICBcc2VlcGVwezAzNDN9e1RoZSAid2l0aCIgc3RhdGVtZW50fQorICAgICAgICAge1RoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZQorICAgICAgICAgIFB5dGhvbiBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQufQorXGVuZHtzZWVhbHNvfQogCiBcc2VjdGlvbntGdW5jdGlvbiBkZWZpbml0aW9uc1xsYWJlbHtmdW5jdGlvbn19CiBcaW5kZXhpaXtmdW5jdGlvbn17ZGVmaW5pdGlvbn0KZGlmZiAtLWdpdCBhL0RvYy90b29scy9wcmVjaG0ucHkgYi9Eb2MvdG9vbHMvcHJlY2htLnB5CmluZGV4IDdiMmYzOTMuLjU3YTQzZmQgMTAwNjQ0Ci0tLSBhL0RvYy90b29scy9wcmVjaG0ucHkKKysrIGIvRG9jL3Rvb2xzL3ByZWNobS5weQpAQCAtMTUwLDYgKzE1MCwyMiBAQAogIyBMaWJyYXJ5IERvYyBsaXN0IG9mIGJvb2tzOgogIyBlYWNoICdib29rJyA6IChEaXIsIFRpdGxlLCBGaXJzdCBwYWdlLCBDb250ZW50IHBhZ2UsIEluZGV4IHBhZ2UpCiBzdXBwb3J0ZWRfbGlicmFyaWVzID0geworICAgICcyLjUnOgorICAgIFsKKyAgICAgICAgQm9vaygnLicsICdNYWluIHBhZ2UnLCAnaW5kZXgnKSwKKyAgICAgICAgQm9vaygnLicsICdHbG9iYWwgTW9kdWxlIEluZGV4JywgJ21vZGluZGV4JyksCisgICAgICAgIEJvb2soJ3doYXRzbmV3JywgIldoYXQncyBOZXciLCAnaW5kZXgnLCAnY29udGVudHMnKSwKKyAgICAgICAgQm9vaygndHV0JywnVHV0b3JpYWwnLCd0dXQnLCdub2RlMicpLAorICAgICAgICBCb29rKCdsaWInLCdMaWJyYXJ5IFJlZmVyZW5jZScsJ2xpYicsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKKyAgICAgICAgQm9vaygncmVmJywnTGFuZ3VhZ2UgUmVmZXJlbmNlJywncmVmJywnY29udGVudHMnLCdnZW5pbmRleCcpLAorICAgICAgICBCb29rKCdtYWMnLCdNYWNpbnRvc2ggUmVmZXJlbmNlJywnbWFjJywnY29udGVudHMnLCdnZW5pbmRleCcpLAorICAgICAgICBCb29rKCdleHQnLCdFeHRlbmRpbmcgYW5kIEVtYmVkZGluZycsJ2V4dCcsJ2NvbnRlbnRzJyksCisgICAgICAgIEJvb2soJ2FwaScsJ1B5dGhvbi9DIEFQSScsJ2FwaScsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKKyAgICAgICAgQm9vaygnZG9jJywnRG9jdW1lbnRpbmcgUHl0aG9uJywnZG9jJywnY29udGVudHMnKSwKKyAgICAgICAgQm9vaygnaW5zdCcsJ0luc3RhbGxpbmcgUHl0aG9uIE1vZHVsZXMnLCAnaW5zdCcsICdpbmRleCcpLAorICAgICAgICBCb29rKCdkaXN0JywnRGlzdHJpYnV0aW5nIFB5dGhvbiBNb2R1bGVzJywgJ2Rpc3QnLCAnaW5kZXgnLCAnZ2VuaW5kZXgnKSwKKyAgICBdLAorCiAgICAgJzIuNCc6CiAgICAgWwogICAgICAgICBCb29rKCcuJywgJ01haW4gcGFnZScsICdpbmRleCcpLApkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3RvYzJia20ucHkgYi9Eb2MvdG9vbHMvdG9jMmJrbS5weQppbmRleCA2MzY0NTlhLi5hYjY2OWJhIDEwMDc1NQotLS0gYS9Eb2MvdG9vbHMvdG9jMmJrbS5weQorKysgYi9Eb2MvdG9vbHMvdG9jMmJrbS5weQpAQCAtNDQsNiArNDQsMjAgQEAKIElOQ0xVREVEX0xFVkVMUyA9ICgiY2hhcHRlciIsICJzZWN0aW9uIiwgInN1YnNlY3Rpb24iLCAic3Vic3Vic2VjdGlvbiIpCiAKIAorY2xhc3MgQmFkU2VjdGlvbk5lc3RpbmcoRXhjZXB0aW9uKToKKyAgICAiIiJSYWlzZWQgZm9yIHVuc3VwcG9ydGVkIHNlY3Rpb24gbGV2ZWwgdHJhbnNpdGlvbnMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGV2ZWwsIG5ld3NlY3Rpb24sIHBhdGgsIGxpbmVubyk6CisgICAgICAgIHNlbGYubGV2ZWwgPSBsZXZlbAorICAgICAgICBzZWxmLm5ld3NlY3Rpb24gPSBuZXdzZWN0aW9uCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gKCJpbGxlZ2FsIHRyYW5zaXRpb24gZnJvbSAlcyB0byAlcyBhdCAlcyAobGluZSAlcykiCisgICAgICAgICAgICAgICAgJSAoc2VsZi5sZXZlbCwgc2VsZi5uZXdzZWN0aW9uLCBzZWxmLnBhdGgsIHNlbGYubGluZW5vKSkKKworCiBkZWYgcGFyc2VfdG9jKGZwLCBiaWdwYXJ0PU5vbmUpOgogICAgIHRvYyA9IHRvcCA9IFtdCiAgICAgc3RhY2sgPSBbdG9jXQpAQCAtNjUsNyArNzksMTAgQEAKICAgICAgICAgICAgICAgICBpZiBzdHlwZSBub3QgaW4gSU5DTFVERURfTEVWRUxTOgogICAgICAgICAgICAgICAgICAgICAjIHdlIGRvbid0IHdhbnQgcGFyYWdyYXBocyAmIHN1YnBhcmFncmFwaHMKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBfdHJhbnNpdGlvbl9tYXBbKGxldmVsLCBzdHlwZSldCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBfdHJhbnNpdGlvbl9tYXBbKGxldmVsLCBzdHlwZSldCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBCYWRTZWN0aW9uTmVzdGluZyhsZXZlbCwgc3R5cGUsIGZwLm5hbWUsIGxpbmVubykKICAgICAgICAgICAgICAgICBpZiBkaXJlY3Rpb24gPT0gT1VURVJfVE9fSU5ORVI6CiAgICAgICAgICAgICAgICAgICAgIHRvYyA9IHRvY1stMV1bLTFdCiAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmluc2VydCgwLCB0b2MpCmRpZmYgLS1naXQgYS9Eb2MvdHV0L3R1dC50ZXggYi9Eb2MvdHV0L3R1dC50ZXgKaW5kZXggMDU0OTg1Yi4uN2Y5YTdlZSAxMDA2NDQKLS0tIGEvRG9jL3R1dC90dXQudGV4CisrKyBiL0RvYy90dXQvdHV0LnRleApAQCAtMTAxMiw3ICsxMDEyLDcgQEAKIFxlbmR7dmVyYmF0aW19CiAKIEFzc2lnbm1lbnQgdG8gc2xpY2VzIGlzIGFsc28gcG9zc2libGUsIGFuZCB0aGlzIGNhbiBldmVuIGNoYW5nZSB0aGUgc2l6ZQotb2YgdGhlIGxpc3Q6CitvZiB0aGUgbGlzdCBvciBjbGVhciBpdCBlbnRpcmVseToKIAogXGJlZ2lue3ZlcmJhdGltfQogPj4+ICMgUmVwbGFjZSBzb21lIGl0ZW1zOgpAQCAtMTAyNyw5ICsxMDI3LDE0IEBACiAuLi4gYVsxOjFdID0gWydibGV0Y2gnLCAneHl6enknXQogPj4+IGEKIFsxMjMsICdibGV0Y2gnLCAneHl6enknLCAxMjM0XQotPj4+IGFbOjBdID0gYSAgICAgIyBJbnNlcnQgKGEgY29weSBvZikgaXRzZWxmIGF0IHRoZSBiZWdpbm5pbmcKKz4+PiAjIEluc2VydCAoYSBjb3B5IG9mKSBpdHNlbGYgYXQgdGhlIGJlZ2lubmluZworPj4+IGFbOjBdID0gYQogPj4+IGEKIFsxMjMsICdibGV0Y2gnLCAneHl6enknLCAxMjM0LCAxMjMsICdibGV0Y2gnLCAneHl6enknLCAxMjM0XQorPj4+ICMgQ2xlYXIgdGhlIGxpc3Q6IHJlcGxhY2UgYWxsIGl0ZW1zIHdpdGggYW4gZW1wdHkgbGlzdAorPj4+IGFbOl0gPSBbXQorPj4+IGEKK1tdCiBcZW5ke3ZlcmJhdGltfQogCiBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue2xlbigpfSBhbHNvIGFwcGxpZXMgdG8gbGlzdHM6CkBAIC0yMDIzLDkgKzIwMjgsOSBAQAogVGhlcmUgaXMgYSB3YXkgdG8gcmVtb3ZlIGFuIGl0ZW0gZnJvbSBhIGxpc3QgZ2l2ZW4gaXRzIGluZGV4IGluc3RlYWQKIG9mIGl0cyB2YWx1ZTogdGhlIFxrZXl3b3Jke2RlbH0gc3RhdGVtZW50LiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlCiBcbWV0aG9ke3BvcCgpfSkgbWV0aG9kIHdoaWNoIHJldHVybnMgYSB2YWx1ZS4gIFRoZSBca2V5d29yZHtkZWx9Ci1zdGF0ZW1lbnQgY2FuIGFsc28gYmUgdXNlZCB0bwotcmVtb3ZlIHNsaWNlcyBmcm9tIGEgbGlzdCAod2hpY2ggd2UgZGlkIGVhcmxpZXIgYnkgYXNzaWdubWVudCBvZiBhbgotZW1wdHkgbGlzdCB0byB0aGUgc2xpY2UpLiAgRm9yIGV4YW1wbGU6CitzdGF0ZW1lbnQgY2FuIGFsc28gYmUgdXNlZCB0byByZW1vdmUgc2xpY2VzIGZyb20gYSBsaXN0IG9yIGNsZWFyIHRoZQorZW50aXJlIGxpc3QgKHdoaWNoIHdlIGRpZCBlYXJsaWVyIGJ5IGFzc2lnbm1lbnQgb2YgYW4gZW1wdHkgbGlzdCB0bwordGhlIHNsaWNlKS4gIEZvciBleGFtcGxlOgogCiBcYmVnaW57dmVyYmF0aW19CiA+Pj4gYSA9IFstMSwgMSwgNjYuMjUsIDMzMywgMzMzLCAxMjM0LjVdCkBAIC0yMDM1LDYgKzIwNDAsOSBAQAogPj4+IGRlbCBhWzI6NF0KID4+PiBhCiBbMSwgNjYuMjUsIDEyMzQuNV0KKz4+PiBkZWwgYVs6XQorPj4+IGEKK1tdCiBcZW5ke3ZlcmJhdGltfQogCiBca2V5d29yZHtkZWx9IGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVsZXRlIGVudGlyZSB2YXJpYWJsZXM6CkBAIC0zNzEwLDE5ICszNzE4LDQ5IEBACiBLZXlib2FyZEludGVycnVwdAogXGVuZHt2ZXJiYXRpbX0KIAotQSBcZW1waHtmaW5hbGx5IGNsYXVzZX0gaXMgZXhlY3V0ZWQgd2hldGhlciBvciBub3QgYW4gZXhjZXB0aW9uIGhhcwotb2NjdXJyZWQgaW4gdGhlIHRyeSBjbGF1c2UuICBXaGVuIGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQsIGl0IGlzCi1yZS1yYWlzZWQgYWZ0ZXIgdGhlIGZpbmFsbHkgY2xhdXNlIGlzIGV4ZWN1dGVkLiAgVGhlIGZpbmFsbHkgY2xhdXNlIGlzCi1hbHNvIGV4ZWN1dGVkIGBgb24gdGhlIHdheSBvdXQnJyB3aGVuIHRoZSBca2V5d29yZHt0cnl9IHN0YXRlbWVudCBpcwotbGVmdCB2aWEgYSBca2V5d29yZHticmVha30gb3IgXGtleXdvcmR7cmV0dXJufSBzdGF0ZW1lbnQuCitBIFxlbXBoe2ZpbmFsbHkgY2xhdXNlfSBpcyBhbHdheXMgZXhlY3V0ZWQgYmVmb3JlIGxlYXZpbmcgdGhlCitca2V5d29yZHt0cnl9IHN0YXRlbWVudCwgd2hldGhlciBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkIG9yIG5vdC4KK1doZW4gYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBpbiB0aGUgXGtleXdvcmR7dHJ5fSBjbGF1c2UgYW5kIGhhcyBub3QKK2JlZW4gaGFuZGxlZCBieSBhbiBca2V5d29yZHtleGNlcHR9IGNsYXVzZSAob3IgaXQgaGFzIG9jY3VycmVkIGluIGEKK1xrZXl3b3Jke2V4Y2VwdH0gb3IgXGtleXdvcmR7ZWxzZX0gY2xhdXNlKSwgaXQgaXMgcmUtcmFpc2VkIGFmdGVyIHRoZQorXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlIGhhcyBiZWVuIGV4ZWN1dGVkLiAgVGhlIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZQoraXMgYWxzbyBleGVjdXRlZCBgYG9uIHRoZSB3YXkgb3V0Jycgd2hlbiBhbnkgb3RoZXIgY2xhdXNlIG9mIHRoZQorXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgaXMgbGVmdCB2aWEgYSBca2V5d29yZHticmVha30sIFxrZXl3b3Jke2NvbnRpbnVlfQorb3IgXGtleXdvcmR7cmV0dXJufSBzdGF0ZW1lbnQuICBBIG1vcmUgY29tcGxpY2F0ZWQgZXhhbXBsZToKIAotVGhlIGNvZGUgaW4gdGhlIGZpbmFsbHkgY2xhdXNlIGlzIHVzZWZ1bCBmb3IgcmVsZWFzaW5nIGV4dGVybmFsCi1yZXNvdXJjZXMgKHN1Y2ggYXMgZmlsZXMgb3IgbmV0d29yayBjb25uZWN0aW9ucyksIHJlZ2FyZGxlc3Mgb2YKLXdoZXRoZXIgdGhlIHVzZSBvZiB0aGUgcmVzb3VyY2Ugd2FzIHN1Y2Nlc3NmdWwuCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZGVmIGRpdmlkZSh4LCB5KToKKy4uLiAgICAgdHJ5OgorLi4uICAgICAgICAgcmVzdWx0ID0geCAvIHkKKy4uLiAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorLi4uICAgICAgICAgcHJpbnQgImRpdmlzaW9uIGJ5IHplcm8hIgorLi4uICAgICBlbHNlOgorLi4uICAgICAgICAgcHJpbnQgInJlc3VsdCBpcyIsIHJlc3VsdAorLi4uICAgICBmaW5hbGx5OgorLi4uICAgICAgICAgcHJpbnQgImV4ZWN1dGluZyBmaW5hbGx5IGNsYXVzZSIKKy4uLgorPj4+IGRpdmlkZSgyLCAxKQorcmVzdWx0IGlzIDIKK2V4ZWN1dGluZyBmaW5hbGx5IGNsYXVzZQorPj4+IGRpdmlkZSgyLCAwKQorZGl2aXNpb24gYnkgemVybyEKK2V4ZWN1dGluZyBmaW5hbGx5IGNsYXVzZQorPj4+IGRpdmlkZSgiMiIsICIxIikKK2V4ZWN1dGluZyBmaW5hbGx5IGNsYXVzZQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDMsIGluIGRpdmlkZQorVHlwZUVycm9yOiB1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIC86ICdzdHInIGFuZCAnc3RyJworXGVuZHt2ZXJiYXRpbX0KIAotQSBca2V5d29yZHt0cnl9IHN0YXRlbWVudCBtdXN0IGVpdGhlciBoYXZlIG9uZSBvciBtb3JlIGV4Y2VwdCBjbGF1c2VzCi1vciBvbmUgZmluYWxseSBjbGF1c2UsIGJ1dCBub3QgYm90aCAoYmVjYXVzZSBpdCB3b3VsZCBiZSB1bmNsZWFyIHdoaWNoCi1jbGF1c2Ugc2hvdWxkIGJlIGV4ZWN1dGVkIGZpcnN0KS4KK0FzIHlvdSBjYW4gc2VlLCB0aGUgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlIGlzIGV4ZWN1dGVkIGluIGFueQorZXZlbnQuICBUaGUgXGV4Y2VwdGlvbntUeXBlRXJyb3J9IHJhaXNlZCBieSBkaXZpZGluZyB0d28gc3RyaW5ncworaXMgbm90IGhhbmRsZWQgYnkgdGhlIFxrZXl3b3Jke2V4Y2VwdH0gY2xhdXNlIGFuZCB0aGVyZWZvcmUKK3JlLXJhaXNlZCBhZnRlciB0aGUgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlcyBoYXMgYmVlbiBleGVjdXRlZC4KKworSW4gcmVhbCB3b3JsZCBhcHBsaWNhdGlvbnMsIHRoZSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UgaXMgdXNlZnVsCitmb3IgcmVsZWFzaW5nIGV4dGVybmFsIHJlc291cmNlcyAoc3VjaCBhcyBmaWxlcyBvciBuZXR3b3JrIGNvbm5lY3Rpb25zKSwKK3JlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdXNlIG9mIHRoZSByZXNvdXJjZSB3YXMgc3VjY2Vzc2Z1bC4KIAogCiBcY2hhcHRlcntDbGFzc2VzIFxsYWJlbHtjbGFzc2VzfX0KQEAgLTUzNDAsNyArNTM3OCw3IEBACiAKIFxpdGVtIFxjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtMYW5ndWFnZSBSZWZlcmVuY2V9OiBBIGRldGFpbGVkIAogZXhwbGFuYXRpb24gb2YgUHl0aG9uJ3Mgc3ludGF4IGFuZCBzZW1hbnRpY3MuICBJdCdzIGhlYXZ5IHJlYWRpbmcsIAotYnV0IGlzIHVzZWZ1bCBhcyBhCitidXQgaXMgdXNlZnVsIGFzIGEgY29tcGxldGUgZ3VpZGUgdG8gdGhlIGxhbmd1YWdlIGl0c2VsZi4KIAogXGVuZHtpdGVtaXplfQogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMC50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMC50ZXgKaW5kZXggYjg5YWMxOS4uYmY0NThmYSAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjAudGV4CisrKyBiL0RvYy93aGF0c25ldy93aGF0c25ldzIwLnRleApAQCAtMTIxNCw4ICsxMjE0LDggQEAKIFxpdGVte1xtb2R1bGV7Z2V0dGV4dH06fSBUaGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbgogKEkxOE4pIGFuZCBsb2NhbGl6YXRpb24gKEwxME4pIHN1cHBvcnQgZm9yIFB5dGhvbiBwcm9ncmFtcyBieQogcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byB0aGUgR05VIGdldHRleHQgbWVzc2FnZSBjYXRhbG9nIGxpYnJhcnkuCi0oSW50ZWdyYXRlZCBieSBCYXJyeSBXYXJzYXcsIGZyb20gc2VwYXJhdGUgY29udHJpYnV0aW9ucyBieSBNYXJ0aW4gdm9uCi1Mb2V3aXMsIFBldGVyIEZ1bmssIGFuZCBKYW1lcyBIZW5zdHJpZGdlLikKKyhJbnRlZ3JhdGVkIGJ5IEJhcnJ5IFdhcnNhdywgZnJvbSBzZXBhcmF0ZSBjb250cmlidXRpb25zIGJ5IE1hcnRpbiAKK3Zvbn5MXCJvd2lzLCBQZXRlciBGdW5rLCBhbmQgSmFtZXMgSGVuc3RyaWRnZS4pCiAKIFxpdGVte1xtb2R1bGV7bGludXhhdWRpb2Rldn06fSBTdXBwb3J0IGZvciB0aGUgXGZpbGV7L2Rldi9hdWRpb30KIGRldmljZSBvbiBMaW51eCwgYSB0d2luIHRvIHRoZSBleGlzdGluZyBcbW9kdWxle3N1bmF1ZGlvZGV2fSBtb2R1bGUuCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMS50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMS50ZXgKaW5kZXggYjdlYTNmMi4uZjNkMDI0NSAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjEudGV4CisrKyBiL0RvYy93aGF0c25ldy93aGF0c25ldzIxLnRleApAQCAtNSw3ICs1LDcgQEAKICUgJElkJAogCiBcdGl0bGV7V2hhdCdzIE5ldyBpbiBQeXRob24gMi4xfQotXHJlbGVhc2V7MS4wMH0KK1xyZWxlYXNlezEuMDF9CiBcYXV0aG9ye0EuTS4gS3VjaGxpbmd9CiBcYXV0aG9yYWRkcmVzc3sKIAlcc3Ryb25ne1B5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9ufVxcCkBAIC0xNiwxNCArMTYsNyBAQAogCiBcc2VjdGlvbntJbnRyb2R1Y3Rpb259CiAKLUl0J3MgdGhhdCB0aW1lIGFnYWluLi4uIHRpbWUgZm9yIGEgbmV3IFB5dGhvbiByZWxlYXNlLCBQeXRob24gMi4xLgotT25lIHJlY2VudCBnb2FsIG9mIHRoZSBQeXRob24gZGV2ZWxvcG1lbnQgdGVhbSBoYXMgYmVlbiB0byBhY2NlbGVyYXRlCi10aGUgcGFjZSBvZiBuZXcgcmVsZWFzZXMsIHdpdGggYSBuZXcgcmVsZWFzZSBjb21pbmcgZXZlcnkgNiB0byA5Ci1tb250aHMuIDIuMSBpcyB0aGUgZmlyc3QgcmVsZWFzZSB0byBjb21lIG91dCBhdCB0aGlzIGZhc3RlciBwYWNlLCB3aXRoCi10aGUgZmlyc3QgYWxwaGEgYXBwZWFyaW5nIGluIEphbnVhcnksIDMgbW9udGhzIGFmdGVyIHRoZSBmaW5hbCB2ZXJzaW9uCi1vZiAyLjAgd2FzIHJlbGVhc2VkLgotCi1UaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIG5ldyBmZWF0dXJlcyBpbiAyLjEuICBXaGlsZSB0aGVyZSBhcmVuJ3QgYXMKK1RoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgbmV3IGZlYXR1cmVzIGluIFB5dGhvbiAyLjEuICBXaGlsZSB0aGVyZSBhcmVuJ3QgYXMKIG1hbnkgY2hhbmdlcyBpbiAyLjEgYXMgdGhlcmUgd2VyZSBpbiBQeXRob24gMi4wLCB0aGVyZSBhcmUgc3RpbGwgc29tZQogcGxlYXNhbnQgc3VycHJpc2VzIGluIHN0b3JlLiAgMi4xIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRvIGJlIHN0ZWVyZWQKIHRocm91Z2ggdGhlIHVzZSBvZiBQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWxzLCBvciBQRVBzLCBzbyBtb3N0IG9mCkBAIC0zNCw2ICsyNywxMiBAQAogUmVmZXIgdG8gdGhlIFB5dGhvbiAyLjEgZG9jdW1lbnRhdGlvbiwgb3IgdG8gdGhlIHNwZWNpZmljIFBFUCwgZm9yCiBtb3JlIGRldGFpbHMgYWJvdXQgYW55IG5ldyBmZWF0dXJlIHRoYXQgcGFydGljdWxhcmx5IGludGVyZXN0cyB5b3UuCiAKK09uZSByZWNlbnQgZ29hbCBvZiB0aGUgUHl0aG9uIGRldmVsb3BtZW50IHRlYW0gaGFzIGJlZW4gdG8gYWNjZWxlcmF0ZQordGhlIHBhY2Ugb2YgbmV3IHJlbGVhc2VzLCB3aXRoIGEgbmV3IHJlbGVhc2UgY29taW5nIGV2ZXJ5IDYgdG8gOQorbW9udGhzLiAyLjEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdG8gY29tZSBvdXQgYXQgdGhpcyBmYXN0ZXIgcGFjZSwgd2l0aAordGhlIGZpcnN0IGFscGhhIGFwcGVhcmluZyBpbiBKYW51YXJ5LCAzIG1vbnRocyBhZnRlciB0aGUgZmluYWwgdmVyc2lvbgorb2YgMi4wIHdhcyByZWxlYXNlZC4KKwogVGhlIGZpbmFsIHJlbGVhc2Ugb2YgUHl0aG9uIDIuMSB3YXMgbWFkZSBvbiBBcHJpbCAxNywgMjAwMS4KIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy93aGF0c25ldzI0LnRleCBiL0RvYy93aGF0c25ldy93aGF0c25ldzI0LnRleAppbmRleCBlOWZmNGQ5Li41MWJhZWNlIDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNC50ZXgKKysrIGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjQudGV4CkBAIC04MDMsOCArODAzLDggQEAKIAogVGhlIFBFUCBhbHNvIHByb3Bvc2VzIHRoYXQgYWxsIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50cyBiZSBhYnNvbHV0ZQogaW1wb3J0cywgd2l0aCBhIGxlYWRpbmcgXHNhbXB7Ln0gY2hhcmFjdGVyIHRvIGluZGljYXRlIGEgcmVsYXRpdmUKLWltcG9ydC4gIFRoaXMgcGFydCBvZiB0aGUgUEVQIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQsIGFuZCB3aWxsIGhhdmUgdG8KLXdhaXQgZm9yIFB5dGhvbiAyLjUgb3Igc29tZSBvdGhlciBmdXR1cmUgdmVyc2lvbi4KK2ltcG9ydC4gIFRoaXMgcGFydCBvZiB0aGUgUEVQIHdhcyBub3QgaW1wbGVtZW50ZWQgZm9yIFB5dGhvbiAyLjQsCitidXQgd2FzIGNvbXBsZXRlZCBmb3IgUHl0aG9uIDIuNS4KIAogXGJlZ2lue3NlZWFsc299CiBcc2VlcGVwezMyOH17SW1wb3J0czogTXVsdGktTGluZSBhbmQgQWJzb2x1dGUvUmVsYXRpdmV9CkBAIC0xMzM2LDcgKzEzMzYsNyBAQAogXGl0ZW0gVGhlIFxtb2R1bGV7bWFyc2hhbH0gbW9kdWxlIG5vdyBzaGFyZXMgaW50ZXJuZWQgc3RyaW5ncyBvbiB1bnBhY2tpbmcgYSAKIGRhdGEgc3RydWN0dXJlLiAgVGhpcyBtYXkgc2hyaW5rIHRoZSBzaXplIG9mIGNlcnRhaW4gcGlja2xlIHN0cmluZ3MsCiBidXQgdGhlIHByaW1hcnkgZWZmZWN0IGlzIHRvIG1ha2UgXGZpbGV7LnB5Y30gZmlsZXMgc2lnbmlmaWNhbnRseSBzbWFsbGVyLgotKENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiB2b24gTG9ld2lzLikKKyhDb250cmlidXRlZCBieSBNYXJ0aW4gdm9ufkxcIm93aXMuKQogCiBcaXRlbSBUaGUgXG1vZHVsZXtubnRwbGlifSBtb2R1bGUncyBcY2xhc3N7Tk5UUH0gY2xhc3MgZ2FpbmVkCiBcbWV0aG9ke2Rlc2NyaXB0aW9uKCl9IGFuZCBcbWV0aG9ke2Rlc2NyaXB0aW9ucygpfSBtZXRob2RzIHRvIHJldHJpZXZlIApAQCAtMTY4OCw3ICsxNjg4LDcgQEAKIFxiZWdpbntpdGVtaXplfQogCiBcaXRlbSBUaGUgV2luZG93cyBwb3J0IG5vdyBidWlsZHMgdW5kZXIgTVNWQysrIDcuMSBhcyB3ZWxsIGFzIHZlcnNpb24gNi4KLSAgKENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiB2b24gTG9ld2lzLikKKyAgKENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiB2b25+TFwib3dpcy4pCiAKIFxlbmR7aXRlbWl6ZX0KIApkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjUudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjUudGV4CmluZGV4IDU3NDMyODUuLmRiNmMyNWEgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzI1LnRleAorKysgYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNS50ZXgKQEAgLTIsOSArMiwxNCBAQAogXHVzZXBhY2thZ2V7ZGlzdHV0aWxzfQogJSAkSWQkCiAKKyUgVGhlIGVhc3lfaW5zdGFsbCBzdHVmZgorJSBEZXNjcmliZSB0aGUgcGtndXRpbCBtb2R1bGUKKyUgU3RhdGVmdWwgY29kZWMgY2hhbmdlcworJSBGaXggWFhYIGNvbW1lbnRzCislIENvdW50IHVwIHRoZSBwYXRjaGVzIGFuZCBidWdzCiAKIFx0aXRsZXtXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjV9Ci1ccmVsZWFzZXswLjB9CitccmVsZWFzZXswLjF9CiBcYXV0aG9ye0EuTS4gS3VjaGxpbmd9CiBcYXV0aG9yYWRkcmVzc3tcZW1haWx7YW1rQGFtay5jYX19CiAKQEAgLTE0LDcgKzE5LDEwIEBACiAKIFRoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgbmV3IGZlYXR1cmVzIGluIFB5dGhvbiAyLjUuICBObyByZWxlYXNlIGRhdGUKIGZvciBQeXRob24gMi41IGhhcyBiZWVuIHNldDsgaXQgd2lsbCBwcm9iYWJseSBiZSByZWxlYXNlZCBpbiB0aGUKLWF1dHVtbiBvZiAyMDA2LgorYXV0dW1uIG9mIDIwMDYuICBccGVwezM1Nn0gZGVzY3JpYmVzIHRoZSBwbGFubmVkIHJlbGVhc2Ugc2NoZWR1bGUuCisKK0NvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGVycm9yIHJlcG9ydHMgYXJlIHdlbGNvbWU7IHBsZWFzZSBlLW1haWwgdGhlbSAKK3RvIHRoZSBhdXRob3Igb3Igb3BlbiBhIGJ1ZyBpbiB0aGUgUHl0aG9uIGJ1ZyB0cmFja2VyLgogCiAlIFhYWCBDb21wYXJlIHdpdGggcHJldmlvdXMgcmVsZWFzZSBpbiAyIC0gMyBzZW50ZW5jZXMgaGVyZS4KIApAQCAtMjcsNiArMzUsMzIgQEAKIAogCiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorXHNlY3Rpb257UEVQIDI0MzogVXBsb2FkaW5nIE1vZHVsZXMgdG8gUHlQSX0KKworUEVQIDI0MyBkZXNjcmliZXMgYW4gSFRUUC1iYXNlZCBwcm90b2NvbCBmb3Igc3VibWl0dGluZyBzb2Z0d2FyZQorcGFja2FnZXMgdG8gYSBjZW50cmFsIGFyY2hpdmUuICBUaGUgUHl0aG9uIHBhY2thZ2UgaW5kZXggYXQKK1x1cmx7aHR0cDovL2NoZWVzZXNob3AucHl0aG9uLm9yZ30gbm93IHN1cHBvcnRzIHBhY2thZ2UgdXBsb2FkcywgYW5kCit0aGUgbmV3IFxjb21tYW5ke3VwbG9hZH0gRGlzdHV0aWxzIGNvbW1hbmQgd2lsbCB1cGxvYWQgYSBwYWNrYWdlIHRvIHRoZQorcmVwb3NpdG9yeS4KKworQmVmb3JlIGEgcGFja2FnZSBjYW4gYmUgdXBsb2FkZWQsIHlvdSBtdXN0IGJlIGFibGUgdG8gYnVpbGQgYQorZGlzdHJpYnV0aW9uIHVzaW5nIHRoZSBcY29tbWFuZHtzZGlzdH0gRGlzdHV0aWxzIGNvbW1hbmQuICBPbmNlIHRoYXQKK3dvcmtzLCB5b3UgY2FuIHJ1biBcY29kZXtweXRob24gc2V0dXAucHkgdXBsb2FkfSB0byBhZGQgeW91ciBwYWNrYWdlCit0byB0aGUgUHlQSSBhcmNoaXZlLiAgT3B0aW9uYWxseSB5b3UgY2FuIEdQRy1zaWduIHRoZSBwYWNrYWdlIGJ5CitzdXBwbHlpbmcgdGhlIFxsb25ncHJvZ3JhbW9wdHtzaWdufSBhbmQKK1xsb25ncHJvZ3JhbW9wdHtpZGVudGl0eX0gb3B0aW9ucy4KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWVwZXB7MjQzfXtNb2R1bGUgUmVwb3NpdG9yeSBVcGxvYWQgTWVjaGFuaXNtfXtQRVAgd3JpdHRlbiBieQorU2VhbiBSZWlmc2NobmVpZGVyOyBpbXBsZW1lbnRlZCBieSBNYXJ0aW4gdm9ufkxcIm93aXMKK2FuZCBSaWNoYXJkIEpvbmVzLiAgTm90ZSB0aGF0IHRoZSBQRVAgZG9lc24ndCBleGFjdGx5IAorZGVzY3JpYmUgd2hhdCdzIGltcGxlbWVudGVkIGluIFB5UEkufQorCitcZW5ke3NlZWFsc299CisKKworJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue1BFUCAzMDg6IENvbmRpdGlvbmFsIEV4cHJlc3Npb25zfQogCiBGb3IgYSBsb25nIHRpbWUsIHBlb3BsZSBoYXZlIGJlZW4gcmVxdWVzdGluZyBhIHdheSB0byB3cml0ZQpAQCAtNDMsMTAgKzc3LDEwIEBACiBcZW5ke3ZlcmJhdGltfQogCiBUaGVyZSBoYXZlIGJlZW4gZW5kbGVzcyB0ZWRpb3VzIGRpc2N1c3Npb25zIG9mIHN5bnRheCBvbiBib3RoCi1weXRob24tZGV2IGFuZCBjb21wLmxhbmcucHl0aG9uLCBhbmQgZXZlbiBhIHZvdGUgdGhhdCBmb3VuZCB0aGUKLW1ham9yaXR5IG9mIHZvdGVycyB3YW50ZWQgc29tZSB3YXkgdG8gd3JpdGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMsCi1idXQgdGhlcmUgd2FzIG5vIHN5bnRheCB0aGF0IHdhcyBjbGVhcmx5IHByZWZlcnJlZCBieSBhIG1ham9yaXR5LgotQ2FuZGlkYXRlcyBpbmNsdWRlIEMncyBcY29kZXtjb25kID8gdHJ1ZV92IDogZmFsc2Vfdn0sCitweXRob24tZGV2IGFuZCBjb21wLmxhbmcucHl0aG9uLiAgQSB2b3RlIHdhcyBldmVuIGhlbGQgdGhhdCBmb3VuZCB0aGUKK21ham9yaXR5IG9mIHZvdGVycyB3YW50ZWQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgaW4gc29tZSBmb3JtLAorYnV0IHRoZXJlIHdhcyBubyBzeW50YXggdGhhdCB3YXMgcHJlZmVycmVkIGJ5IGEgY2xlYXIgbWFqb3JpdHkuCitDYW5kaWRhdGVzIGluY2x1ZGVkIEMncyBcY29kZXtjb25kID8gdHJ1ZV92IDogZmFsc2Vfdn0sCiBcY29kZXtpZiBjb25kIHRoZW4gdHJ1ZV92IGVsc2UgZmFsc2Vfdn0sIGFuZCAxNiBvdGhlciB2YXJpYXRpb25zLgogCiBHdlIgZXZlbnR1YWxseSBjaG9zZSBhIHN1cnByaXNpbmcgc3ludGF4OgpAQCAtNTUsMTEgKzg5LDEyIEBACiB4ID0gdHJ1ZV92YWx1ZSBpZiBjb25kaXRpb24gZWxzZSBmYWxzZV92YWx1ZQogXGVuZHt2ZXJiYXRpbX0KIAotRXZhbHVhdGlvbiBpcyBzdGlsbCBsYXp5IGFzIGluIGV4aXN0aW5nIEJvb2xlYW4gZXhwcmVzc2lvbiwgc28gdGhlCi1ldmFsdWF0aW9uIGp1bXBzIGFyb3VuZCBhIGJpdC4gIFRoZSBcdmFye2NvbmRpdGlvbn0gZXhwcmVzc2lvbiBpcwotZXZhbHVhdGVkIGZpcnN0LCBhbmQgdGhlIFx2YXJ7dHJ1ZV92YWx1ZX0gZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgb25seQotaWYgdGhlIGNvbmRpdGlvbiB3YXMgdHJ1ZS4gIFNpbWlsYXJseSwgdGhlIFx2YXJ7ZmFsc2VfdmFsdWV9Ci1leHByZXNzaW9uIGlzIG9ubHkgZXZhbHVhdGVkIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4KK0V2YWx1YXRpb24gaXMgc3RpbGwgbGF6eSBhcyBpbiBleGlzdGluZyBCb29sZWFuIGV4cHJlc3Npb25zLCBzbyB0aGUKK29yZGVyIG9mIGV2YWx1YXRpb24ganVtcHMgYXJvdW5kIGEgYml0LiAgVGhlIFx2YXJ7Y29uZGl0aW9ufQorZXhwcmVzc2lvbiBpbiB0aGUgbWlkZGxlIGlzIGV2YWx1YXRlZCBmaXJzdCwgYW5kIHRoZSBcdmFye3RydWVfdmFsdWV9CitleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBvbmx5IGlmIHRoZSBjb25kaXRpb24gd2FzIHRydWUuICBTaW1pbGFybHksCit0aGUgXHZhcntmYWxzZV92YWx1ZX0gZXhwcmVzc2lvbiBpcyBvbmx5IGV2YWx1YXRlZCB3aGVuIHRoZSBjb25kaXRpb24KK2lzIGZhbHNlLgogCiBUaGlzIHN5bnRheCBtYXkgc2VlbSBzdHJhbmdlIGFuZCBiYWNrd2FyZHM7IHdoeSBkb2VzIHRoZSBjb25kaXRpb24gZ28KIGluIHRoZSBcZW1waHttaWRkbGV9IG9mIHRoZSBleHByZXNzaW9uLCBhbmQgbm90IGluIHRoZSBmcm9udCBhcyBpbiBDJ3MKQEAgLTExMCw3ICsxNDUsNyBAQAogXGJlZ2lue3NlZWFsc299CiAKIFxzZWVwZXB7MzA4fXtDb25kaXRpb25hbCBFeHByZXNzaW9uc317UEVQIHdyaXR0ZW4gYnkKLUd1aWRvIHZhbiBSb3NzdW0gYW5kIFJheW1vbmQgRC4gSGV0dGluZ2VyOyBpbXBsZW1lbnRlZCBieSBUaG9tYXMKK0d1aWRvIHZhbn5Sb3NzdW0gYW5kIFJheW1vbmQgRC4gSGV0dGluZ2VyOyBpbXBsZW1lbnRlZCBieSBUaG9tYXMKIFdvdXRlcnMufQogCiBcZW5ke3NlZWFsc299CkBAIC0xOTIsNyArMjI3LDE2IEBACiBwb3NzaWJsZSB0byBsb29rIHVwIGFuIGVudHJ5IGluIHRoZSBwYWNrYWdlIGluZGV4LCBkZXRlcm1pbmUgdGhlCiBkZXBlbmRlbmNpZXMgZm9yIGEgcGFja2FnZSwgYW5kIGRvd25sb2FkIHRoZSByZXF1aXJlZCBwYWNrYWdlcy4KIAotJSBYWFggcHV0IGV4YW1wbGUgaGVyZQorXGJlZ2lue3ZlcmJhdGltfQorVkVSU0lPTiA9ICcxLjAnCitzZXR1cChuYW1lPSdQeVBhY2thZ2UnLCAKKyAgICAgIHZlcnNpb249VkVSU0lPTiwKKyAgICAgIHJlcXVpcmVzPVsnbnVtYXJyYXknLCAnemxpYiAoPj0xLjEuNCknXSwKKyAgICAgIG9ic29sZXRlcz1bJ09sZFBhY2thZ2UnXQorICAgICAgZG93bmxvYWRfdXJsPSgnaHR0cDovL3d3dy5leGFtcGxlLmNvbS9weXBhY2thZ2UvZGlzdC9wa2ctJXMudGFyLmd6JworICAgICAgICAgICAgICAgICAgICAlIFZFUlNJT04pLAorICAgICApCitcZW5ke3ZlcmJhdGltfQogIAogXGJlZ2lue3NlZWFsc299CiAKQEAgLTIwNiwzMSArMjUwLDE3OCBAQAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue1BFUCAzMjg6IEFic29sdXRlIGFuZCBSZWxhdGl2ZSBJbXBvcnRzfQogCi0lIFhYWCB3cml0ZSB0aGlzCitUaGUgc2ltcGxlciBwYXJ0IG9mIFBFUCAzMjggd2FzIGltcGxlbWVudGVkIGluIFB5dGhvbiAyLjQ6IHBhcmVudGhlc2VzCitjb3VsZCBub3cgYmUgdXNlZCB0byBlbmNsb3NlIHRoZSBuYW1lcyBpbXBvcnRlZCBmcm9tIGEgbW9kdWxlIHVzaW5nCit0aGUgXGNvZGV7ZnJvbSAuLi4gaW1wb3J0IC4uLn0gc3RhdGVtZW50LCBtYWtpbmcgaXQgZWFzaWVyIHRvIGltcG9ydAorbWFueSBkaWZmZXJlbnQgbmFtZXMuCisKK1RoZSBtb3JlIGNvbXBsaWNhdGVkIHBhcnQgaGFzIGJlZW4gaW1wbGVtZW50ZWQgaW4gUHl0aG9uIDIuNToKK2ltcG9ydGluZyBhIG1vZHVsZSBjYW4gYmUgc3BlY2lmaWVkIHRvIHVzZSBhYnNvbHV0ZSBvcgorcGFja2FnZS1yZWxhdGl2ZSBpbXBvcnRzLiAgVGhlIHBsYW4gaXMgdG8gbW92ZSB0b3dhcmQgbWFraW5nIGFic29sdXRlCitpbXBvcnRzIHRoZSBkZWZhdWx0IGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob24uCisKK0xldCdzIHNheSB5b3UgaGF2ZSBhIHBhY2thZ2UgZGlyZWN0b3J5IGxpa2UgdGhpczoKK1xiZWdpbnt2ZXJiYXRpbX0KK3BrZy8KK3BrZy9fX2luaXRfXy5weQorcGtnL21haW4ucHkKK3BrZy9zdHJpbmcucHkKK1xlbmR7dmVyYmF0aW19CisKK1RoaXMgZGVmaW5lcyBhIHBhY2thZ2UgbmFtZWQgXG1vZHVsZXtwa2d9IGNvbnRhaW5pbmcgdGhlCitcbW9kdWxle3BrZy5tYWlufSBhbmQgXG1vZHVsZXtwa2cuc3RyaW5nfSBzdWJtb2R1bGVzLiAgCisKK0NvbnNpZGVyIHRoZSBjb2RlIGluIHRoZSBcZmlsZXttYWluLnB5fSBtb2R1bGUuICBXaGF0IGhhcHBlbnMgaWYgaXQKK2V4ZWN1dGVzIHRoZSBzdGF0ZW1lbnQgXGNvZGV7aW1wb3J0IHN0cmluZ30/ICBJbiBQeXRob24gMi40IGFuZAorZWFybGllciwgaXQgd2lsbCBmaXJzdCBsb29rIGluIHRoZSBwYWNrYWdlJ3MgZGlyZWN0b3J5IHRvIHBlcmZvcm0gYQorcmVsYXRpdmUgaW1wb3J0LCBmaW5kcyBcZmlsZXtwa2cvc3RyaW5nLnB5fSwgaW1wb3J0cyB0aGUgY29udGVudHMgb2YKK3RoYXQgZmlsZSBhcyB0aGUgXG1vZHVsZXtwa2cuc3RyaW5nfSBtb2R1bGUsIGFuZCB0aGF0IG1vZHVsZSBpcyBib3VuZAordG8gdGhlIG5hbWUgXHNhbXB7c3RyaW5nfSBpbiB0aGUgXG1vZHVsZXtwa2cubWFpbn0gbW9kdWxlJ3MgbmFtZXNwYWNlLgorCitUaGF0J3MgZmluZSBpZiBcbW9kdWxle3BrZy5zdHJpbmd9IHdhcyB3aGF0IHlvdSB3YW50ZWQuICBCdXQgd2hhdCBpZgoreW91IHdhbnRlZCBQeXRob24ncyBzdGFuZGFyZCBcbW9kdWxle3N0cmluZ30gbW9kdWxlPyAgVGhlcmUncyBubyBjbGVhbgord2F5IHRvIGlnbm9yZSBcbW9kdWxle3BrZy5zdHJpbmd9IGFuZCBsb29rIGZvciB0aGUgc3RhbmRhcmQgbW9kdWxlOworZ2VuZXJhbGx5IHlvdSBoYWQgdG8gbG9vayBhdCB0aGUgY29udGVudHMgb2YgXGNvZGV7c3lzLm1vZHVsZXN9LCB3aGljaAoraXMgc2xpZ2h0bHkgdW5jbGVhbi4gICAKK0hvbGdlciBLcmVrZWwncyBcbW9kdWxle3B5LnN0ZH0gcGFja2FnZSBwcm92aWRlcyBhIHRpZGllciB3YXkgdG8gcGVyZm9ybQoraW1wb3J0cyBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCBcY29kZXtpbXBvcnQgcHkgOyBweS5zdGQuc3RyaW5nLmpvaW4oKX0sCitidXQgdGhhdCBwYWNrYWdlIGlzbid0IGF2YWlsYWJsZSBvbiBhbGwgUHl0aG9uIGluc3RhbGxhdGlvbnMuCisKK1JlYWRpbmcgY29kZSB3aGljaCByZWxpZXMgb24gcmVsYXRpdmUgaW1wb3J0cyBpcyBhbHNvIGxlc3MgY2xlYXIsCitiZWNhdXNlIGEgcmVhZGVyIG1heSBiZSBjb25mdXNlZCBhYm91dCB3aGljaCBtb2R1bGUsIFxtb2R1bGV7c3RyaW5nfQorb3IgXG1vZHVsZXtwa2cuc3RyaW5nfSwgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZC4gIFB5dGhvbiB1c2VycyBzb29uCitsZWFybmVkIG5vdCB0byBkdXBsaWNhdGUgdGhlIG5hbWVzIG9mIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlcyBpbiB0aGUKK25hbWVzIG9mIHRoZWlyIHBhY2thZ2VzJyBzdWJtb2R1bGVzLCBidXQgeW91IGNhbid0IHByb3RlY3QgYWdhaW5zdAoraGF2aW5nIHlvdXIgc3VibW9kdWxlJ3MgbmFtZSBiZWluZyB1c2VkIGZvciBhIG5ldyBtb2R1bGUgYWRkZWQgaW4gYQorZnV0dXJlIHZlcnNpb24gb2YgUHl0aG9uLgorCitJbiBQeXRob24gMi41LCB5b3UgY2FuIHN3aXRjaCBca2V5d29yZHtpbXBvcnR9J3MgYmVoYXZpb3VyIHRvIAorYWJzb2x1dGUgaW1wb3J0cyB1c2luZyBhIFxjb2Rle2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0fQorZGlyZWN0aXZlLiAgVGhpcyBhYnNvbHV0ZS1pbXBvcnQgYmVoYXZpb3VyIHdpbGwgYmVjb21lIHRoZSBkZWZhdWx0IGluCithIGZ1dHVyZSB2ZXJzaW9uIChwcm9iYWJseSBQeXRob24gMi43KS4gIE9uY2UgYWJzb2x1dGUgaW1wb3J0cyAKK2FyZSB0aGUgZGVmYXVsdCwgXGNvZGV7aW1wb3J0IHN0cmluZ30gd2lsbAorYWx3YXlzIGZpbmQgdGhlIHN0YW5kYXJkIGxpYnJhcnkncyB2ZXJzaW9uLgorSXQncyBzdWdnZXN0ZWQgdGhhdCB1c2VycyBzaG91bGQgYmVnaW4gdXNpbmcgYWJzb2x1dGUgaW1wb3J0cyBhcyBtdWNoCithcyBwb3NzaWJsZSwgc28gaXQncyBwcmVmZXJhYmxlIHRvIGJlZ2luIHdyaXRpbmcgXGNvZGV7ZnJvbSBwa2cgaW1wb3J0CitzdHJpbmd9IGluIHlvdXIgY29kZS4gIAorCitSZWxhdGl2ZSBpbXBvcnRzIGFyZSBzdGlsbCBwb3NzaWJsZSBieSBhZGRpbmcgYSBsZWFkaW5nIHBlcmlvZCAKK3RvIHRoZSBtb2R1bGUgbmFtZSB3aGVuIHVzaW5nIHRoZSBcY29kZXtmcm9tIC4uLiBpbXBvcnR9IGZvcm06CisKK1xiZWdpbnt2ZXJiYXRpbX0KKyMgSW1wb3J0IG5hbWVzIGZyb20gcGtnLnN0cmluZworZnJvbSAuc3RyaW5nIGltcG9ydCBuYW1lMSwgbmFtZTIKKyMgSW1wb3J0IHBrZy5zdHJpbmcKK2Zyb20gLiBpbXBvcnQgc3RyaW5nCitcZW5ke3ZlcmJhdGltfQorCitUaGlzIGltcG9ydHMgdGhlIFxtb2R1bGV7c3RyaW5nfSBtb2R1bGUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKK3BhY2thZ2UsIHNvIGluIFxtb2R1bGV7cGtnLm1haW59IHRoaXMgd2lsbCBpbXBvcnQgXHZhcntuYW1lMX0gYW5kCitcdmFye25hbWUyfSBmcm9tIFxtb2R1bGV7cGtnLnN0cmluZ30uICBBZGRpdGlvbmFsIGxlYWRpbmcgcGVyaW9kcworcGVyZm9ybSB0aGUgcmVsYXRpdmUgaW1wb3J0IHN0YXJ0aW5nIGZyb20gdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudAorcGFja2FnZS4gIEZvciBleGFtcGxlLCBjb2RlIGluIHRoZSBcbW9kdWxle0EuQi5DfSBtb2R1bGUgY2FuIGRvOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIC4gaW1wb3J0IEQgICAgICAgICAgICAgICAgICMgSW1wb3J0cyBBLkIuRAorZnJvbSAuLiBpbXBvcnQgRSAgICAgICAgICAgICAgICAjIEltcG9ydHMgQS5FCitmcm9tIC4uRiBpbXBvcnQgRyAgICAgICAgICAgICAgICMgSW1wb3J0cyBBLkYuRworXGVuZHt2ZXJiYXRpbX0KKworTGVhZGluZyBwZXJpb2RzIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhlIFxjb2Rle2ltcG9ydCBcdmFye21vZG5hbWV9fSAKK2Zvcm0gb2YgdGhlIGltcG9ydCBzdGF0ZW1lbnQsIG9ubHkgdGhlIFxjb2Rle2Zyb20gLi4uIGltcG9ydH0gZm9ybS4KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWVwZXB7MzI4fXtJbXBvcnRzOiBNdWx0aS1MaW5lIGFuZCBBYnNvbHV0ZS9SZWxhdGl2ZX0KK3tQRVAgd3JpdHRlbiBieSBBYWh6OyBpbXBsZW1lbnRlZCBieSBUaG9tYXMgV291dGVycy59CisKK1xzZWV1cmx7aHR0cDovL2NvZGVzcGVhay5uZXQvcHkvY3VycmVudC9kb2MvaW5kZXguaHRtbH0KK3tUaGUgcHkgbGlicmFyeSBieSBIb2xnZXIgS3Jla2VsLCB3aGljaCBjb250YWlucyB0aGUgXG1vZHVsZXtweS5zdGR9IHBhY2thZ2UufQorCitcZW5ke3NlZWFsc299CiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue1BFUCAzMzg6IEV4ZWN1dGluZyBNb2R1bGVzIGFzIFNjcmlwdHN9CiAKLSUgWFhYIHdyaXRlIHRoaXMKK1RoZSBccHJvZ3JhbW9wdHstbX0gc3dpdGNoIGFkZGVkIGluIFB5dGhvbiAyLjQgdG8gZXhlY3V0ZSBhIG1vZHVsZSBhcworYSBzY3JpcHQgZ2FpbmVkIGEgZmV3IG1vcmUgYWJpbGl0aWVzLiAgSW5zdGVhZCBvZiBiZWluZyBpbXBsZW1lbnRlZCBpbgorQyBjb2RlIGluc2lkZSB0aGUgUHl0aG9uIGludGVycHJldGVyLCB0aGUgc3dpdGNoIG5vdyB1c2VzIGFuCitpbXBsZW1lbnRhdGlvbiBpbiBhIG5ldyBtb2R1bGUsIFxtb2R1bGV7cnVucHl9LgorCitUaGUgXG1vZHVsZXtydW5weX0gbW9kdWxlIGltcGxlbWVudHMgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgaW1wb3J0CittZWNoYW5pc20gc28gdGhhdCBpdCdzIG5vdyBwb3NzaWJsZSB0byBydW4gbW9kdWxlcyBpbiBhIHBhY2thZ2Ugc3VjaAorYXMgXG1vZHVsZXtweWNoZWNrZXIuY2hlY2tlcn0uICBUaGUgbW9kdWxlIGFsc28gc3VwcG9ydHMgYWx0ZXJuYXRpdmUKK2ltcG9ydCBtZWNoYW5pc21zIHN1Y2ggYXMgdGhlIFxtb2R1bGV7emlwaW1wb3J0fSBtb2R1bGUuICBUaGlzIG1lYW5zCit5b3UgY2FuIGFkZCBhIC56aXAgYXJjaGl2ZSdzIHBhdGggdG8gXGNvZGV7c3lzLnBhdGh9IGFuZCB0aGVuIHVzZSB0aGUKK1xwcm9ncmFtb3B0ey1tfSBzd2l0Y2ggdG8gZXhlY3V0ZSBjb2RlIGZyb20gdGhlIGFyY2hpdmUuCisKKworXGJlZ2lue3NlZWFsc299CisKK1xzZWVwZXB7MzM4fXtFeGVjdXRpbmcgbW9kdWxlcyBhcyBzY3JpcHRzfXtQRVAgd3JpdHRlbiBhbmQgCitpbXBsZW1lbnRlZCBieSBOaWNrIENvZ2hsYW4ufQorCitcZW5ke3NlZWFsc299CiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue1BFUCAzNDE6IFVuaWZpZWQgdHJ5L2V4Y2VwdC9maW5hbGx5fQogCi0lIFhYWCB3cml0ZSB0aGlzCitVbnRpbCBQeXRob24gMi41LCB0aGUgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgY2FtZSBpbiB0d28KK2ZsYXZvdXJzLiBZb3UgY291bGQgdXNlIGEgXGtleXdvcmR7ZmluYWxseX0gYmxvY2sgdG8gZW5zdXJlIHRoYXQgY29kZQoraXMgYWx3YXlzIGV4ZWN1dGVkLCBvciBvbmUgb3IgbW9yZSBca2V5d29yZHtleGNlcHR9IGJsb2NrcyB0byBjYXRjaCAKK3NwZWNpZmljIGV4Y2VwdGlvbnMuICBZb3UgY291bGRuJ3QgY29tYmluZSBib3RoIFxrZXl3b3Jke2V4Y2VwdH0gYmxvY2tzIGFuZCBhCitca2V5d29yZHtmaW5hbGx5fSBibG9jaywgYmVjYXVzZSBnZW5lcmF0aW5nIHRoZSByaWdodCBieXRlY29kZSBmb3IgdGhlCitjb21iaW5lZCB2ZXJzaW9uIHdhcyBjb21wbGljYXRlZCBhbmQgaXQgd2Fzbid0IGNsZWFyIHdoYXQgdGhlCitzZW1hbnRpY3Mgb2YgdGhlIGNvbWJpbmVkIHNob3VsZCBiZS4gIAorCitHdlIgc3BlbnQgc29tZSB0aW1lIHdvcmtpbmcgd2l0aCBKYXZhLCB3aGljaCBkb2VzIHN1cHBvcnQgdGhlCitlcXVpdmFsZW50IG9mIGNvbWJpbmluZyBca2V5d29yZHtleGNlcHR9IGJsb2NrcyBhbmQgYQorXGtleXdvcmR7ZmluYWxseX0gYmxvY2ssIGFuZCB0aGlzIGNsYXJpZmllZCB3aGF0IHRoZSBzdGF0ZW1lbnQgc2hvdWxkCittZWFuLiAgSW4gUHl0aG9uIDIuNSwgeW91IGNhbiBub3cgd3JpdGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK3RyeToKKyAgICBibG9jay0xIC4uLgorZXhjZXB0IEV4Y2VwdGlvbjE6CisgICAgaGFuZGxlci0xIC4uLgorZXhjZXB0IEV4Y2VwdGlvbjI6CisgICAgaGFuZGxlci0yIC4uLgorZWxzZToKKyAgICBlbHNlLWJsb2NrCitmaW5hbGx5OgorICAgIGZpbmFsLWJsb2NrIAorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGNvZGUgaW4gXHZhcntibG9jay0xfSBpcyBleGVjdXRlZC4gIElmIHRoZSBjb2RlIHJhaXNlcyBhbgorZXhjZXB0aW9uLCB0aGUgaGFuZGxlcnMgYXJlIHRyaWVkIGluIG9yZGVyOiBcdmFye2hhbmRsZXItMX0sCitcdmFye2hhbmRsZXItMn0sIC4uLiAgSWYgbm8gZXhjZXB0aW9uIGlzIHJhaXNlZCwgdGhlIFx2YXJ7ZWxzZS1ibG9ja30KK2lzIGV4ZWN1dGVkLiAgTm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgcHJldmlvdXNseSwgdGhlCitcdmFye2ZpbmFsLWJsb2NrfSBpcyBleGVjdXRlZCBvbmNlIHRoZSBjb2RlIGJsb2NrIGlzIGNvbXBsZXRlIGFuZCBhbnkKK3JhaXNlZCBleGNlcHRpb25zIGhhbmRsZWQuICBFdmVuIGlmIHRoZXJlJ3MgYW4gZXJyb3IgaW4gYW4gZXhjZXB0aW9uCitoYW5kbGVyIG9yIHRoZSBcdmFye2Vsc2UtYmxvY2t9IGFuZCBhIG5ldyBleGNlcHRpb24gaXMgcmFpc2VkLCB0aGUKK1x2YXJ7ZmluYWwtYmxvY2t9IGlzIHN0aWxsIGV4ZWN1dGVkLgorCitcYmVnaW57c2VlYWxzb30KKworXHNlZXBlcHszNDF9e1VuaWZ5aW5nIHRyeS1leGNlcHQgYW5kIHRyeS1maW5hbGx5fXtQRVAgd3JpdHRlbiBieSBHZW9yZyBCcmFuZGw7IAoraW1wbGVtZW50YXRpb24gYnkgVGhvbWFzIExlZS59CisKK1xlbmR7c2VlYWxzb30KIAogCiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHNlY3Rpb257UEVQIDM0MjogTmV3IEdlbmVyYXRvciBGZWF0dXJlc30KK1xzZWN0aW9ue1BFUCAzNDI6IE5ldyBHZW5lcmF0b3IgRmVhdHVyZXNcbGFiZWx7c2VjdGlvbi1nZW5lcmF0b3JzfX0KIAorUHl0aG9uIDIuNSBhZGRzIGEgc2ltcGxlIHdheSB0byBwYXNzIHZhbHVlcyBcZW1waHtpbnRvfSBhIGdlbmVyYXRvci4KIEFzIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuMywgZ2VuZXJhdG9ycyBvbmx5IHByb2R1Y2Ugb3V0cHV0OyBvbmNlIGEKIGdlbmVyYXRvcidzIGNvZGUgaXMgaW52b2tlZCB0byBjcmVhdGUgYW4gaXRlcmF0b3IsIHRoZXJlJ3Mgbm8gd2F5IHRvCiBwYXNzIGFueSBuZXcgaW5mb3JtYXRpb24gaW50byB0aGUgZnVuY3Rpb24gd2hlbiBpdHMgZXhlY3V0aW9uIGlzCi1yZXN1bWVkLiAgSGFja2lzaCBzb2x1dGlvbnMgdG8gdGhpcyBpbmNsdWRlIG1ha2luZyB0aGUgZ2VuZXJhdG9yJ3MKLWNvZGUgbG9vayBhdCBhIGdsb2JhbCB2YXJpYWJsZSBhbmQgdGhlbiBjaGFuZ2luZyB0aGUgZ2xvYmFsIHZhcmlhYmxlJ3MKK3Jlc3VtZWQuICBTb21ldGltZXMgdGhlIGFiaWxpdHkgdG8gcGFzcyBpbiBzb21lIGluZm9ybWF0aW9uIHdvdWxkIGJlCit1c2VmdWwuICBIYWNraXNoIHNvbHV0aW9ucyB0byB0aGlzIGluY2x1ZGUgbWFraW5nIHRoZSBnZW5lcmF0b3IncyBjb2RlCitsb29rIGF0IGEgZ2xvYmFsIHZhcmlhYmxlIGFuZCB0aGVuIGNoYW5naW5nIHRoZSBnbG9iYWwgdmFyaWFibGUncwogdmFsdWUsIG9yIHBhc3NpbmcgaW4gc29tZSBtdXRhYmxlIG9iamVjdCB0aGF0IGNhbGxlcnMgdGhlbiBtb2RpZnkuCi1QeXRob24gMi41IGFkZHMgdGhlIGFiaWxpdHkgdG8gcGFzcyB2YWx1ZXMgXGVtcGh7aW50b30gYSBnZW5lcmF0b3IuCiAKIFRvIHJlZnJlc2ggeW91ciBtZW1vcnkgb2YgYmFzaWMgZ2VuZXJhdG9ycywgaGVyZSdzIGEgc2ltcGxlIGV4YW1wbGU6CiAKQEAgLTIzOSw3ICs0MzAsNyBAQAogICAgIGkgPSAwCiAgICAgd2hpbGUgaSA8IG1heGltdW06CiAgICAgICAgIHlpZWxkIGkKLQlpICs9IDEKKyAgICAgICAgaSArPSAxCiBcZW5ke3ZlcmJhdGltfQogCiBXaGVuIHlvdSBjYWxsIFxjb2Rle2NvdW50ZXIoMTApfSwgdGhlIHJlc3VsdCBpcyBhbiBpdGVyYXRvciB0aGF0CkBAIC0yNjEsMTEgKzQ1MiwxNCBAQAogZXhwcmVzc2lvbiB3aGVuIHlvdSdyZSBkb2luZyBzb21ldGhpbmcgd2l0aCB0aGUgcmV0dXJuZWQgdmFsdWUsIGFzIGluCiB0aGUgYWJvdmUgZXhhbXBsZS4gIFRoZSBwYXJlbnRoZXNlcyBhcmVuJ3QgYWx3YXlzIG5lY2Vzc2FyeSwgYnV0IGl0J3MKIGVhc2llciB0byBhbHdheXMgYWRkIHRoZW0gaW5zdGVhZCBvZiBoYXZpbmcgdG8gcmVtZW1iZXIgd2hlbiB0aGV5J3JlCi1uZWVkZWQuXGZvb3Rub3Rle1RoZSBleGFjdCBydWxlcyBhcmUgdGhhdCBhIFxrZXl3b3Jke3lpZWxkfS1leHByZXNzaW9uIG11c3QKLWFsd2F5cyBiZSBwYXJlbnRoZXNpemVkIGV4Y2VwdCB3aGVuIGl0IG9jY3VycyBhdCB0aGUgdG9wLWxldmVsCi1leHByZXNzaW9uIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCwgbWVhbmluZyB5b3UgY2FuCi13cml0ZSBcY29kZXt2YWwgPSB5aWVsZCBpfSBidXQgaGF2ZSB0byB1c2UgcGFyZW50aGVzZXMgd2hlbiB0aGVyZSdzIGFuCi1vcGVyYXRpb24sIGFzIGluIFxjb2Rle3ZhbCA9ICh5aWVsZCBpKSArIDEyfS59CituZWVkZWQuCisKKyhccGVwezM0Mn0gZXhwbGFpbnMgdGhlIGV4YWN0IHJ1bGVzLCB3aGljaCBhcmUgdGhhdCBhCitca2V5d29yZHt5aWVsZH0tZXhwcmVzc2lvbiBtdXN0IGFsd2F5cyBiZSBwYXJlbnRoZXNpemVkIGV4Y2VwdCB3aGVuIGl0CitvY2N1cnMgYXQgdGhlIHRvcC1sZXZlbCBleHByZXNzaW9uIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgYW4KK2Fzc2lnbm1lbnQuICBUaGlzIG1lYW5zIHlvdSBjYW4gd3JpdGUgXGNvZGV7dmFsID0geWllbGQgaX0gYnV0IGhhdmUgdG8KK3VzZSBwYXJlbnRoZXNlcyB3aGVuIHRoZXJlJ3MgYW4gb3BlcmF0aW9uLCBhcyBpbiBcY29kZXt2YWwgPSAoeWllbGQgaSkKKysgMTJ9LikKIAogVmFsdWVzIGFyZSBzZW50IGludG8gYSBnZW5lcmF0b3IgYnkgY2FsbGluZyBpdHMKIFxtZXRob2R7c2VuZChcdmFye3ZhbHVlfSl9IG1ldGhvZC4gIFRoZSBnZW5lcmF0b3IncyBjb2RlIGlzIHRoZW4KQEAgLTI4MSwxMSArNDc1LDExIEBACiAgICAgaSA9IDAKICAgICB3aGlsZSBpIDwgbWF4aW11bToKICAgICAgICAgdmFsID0gKHlpZWxkIGkpCi0JIyBJZiB2YWx1ZSBwcm92aWRlZCwgY2hhbmdlIGNvdW50ZXIKKyAgICAgICAgIyBJZiB2YWx1ZSBwcm92aWRlZCwgY2hhbmdlIGNvdW50ZXIKICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgaSA9IHZhbAotCWVsc2U6Ci0gIAkgICAgaSArPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpICs9IDEKIFxlbmR7dmVyYmF0aW19CiAKIEFuZCBoZXJlJ3MgYW4gZXhhbXBsZSBvZiBjaGFuZ2luZyB0aGUgY291bnRlcjoKQEAgLTM0NCwxMyArNTM4LDMyIEBACiBzdWJyb3V0aW5lcy4gIFN1YnJvdXRpbmVzIGFyZSBlbnRlcmVkIGF0IG9uZSBwb2ludCBhbmQgZXhpdGVkIGF0CiBhbm90aGVyIHBvaW50ICh0aGUgdG9wIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGEgXGtleXdvcmR7cmV0dXJuCiBzdGF0ZW1lbnR9KSwgYnV0IGNvcm91dGluZXMgY2FuIGJlIGVudGVyZWQsIGV4aXRlZCwgYW5kIHJlc3VtZWQgYXQKLW1hbnkgZGlmZmVyZW50IHBvaW50cyAodGhlIFxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnRzKS4KK21hbnkgZGlmZmVyZW50IHBvaW50cyAodGhlIFxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnRzKS4gIFdlJ2xsIGhhdmUgdG8KK2ZpZ3VyZSBvdXQgcGF0dGVybnMgZm9yIHVzaW5nIGNvcm91dGluZXMgZWZmZWN0aXZlbHkgaW4gUHl0aG9uLgogCitUaGUgYWRkaXRpb24gb2YgdGhlIFxtZXRob2R7Y2xvc2UoKX0gbWV0aG9kIGhhcyBvbmUgc2lkZSBlZmZlY3QgdGhhdAoraXNuJ3Qgb2J2aW91cy4gIFxtZXRob2R7Y2xvc2UoKX0gaXMgY2FsbGVkIHdoZW4gYSBnZW5lcmF0b3IgaXMKK2dhcmJhZ2UtY29sbGVjdGVkLCBzbyB0aGlzIG1lYW5zIHRoZSBnZW5lcmF0b3IncyBjb2RlIGdldHMgb25lIGxhc3QKK2NoYW5jZSB0byBydW4gYmVmb3JlIHRoZSBnZW5lcmF0b3IgaXMgZGVzdHJveWVkLiAgVGhpcyBsYXN0IGNoYW5jZQorbWVhbnMgdGhhdCBcY29kZXt0cnkuLi5maW5hbGx5fSBzdGF0ZW1lbnRzIGluIGdlbmVyYXRvcnMgY2FuIG5vdyBiZQorZ3VhcmFudGVlZCB0byB3b3JrOyB0aGUgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlIHdpbGwgbm93IGFsd2F5cyBnZXQgYQorY2hhbmNlIHRvIHJ1bi4gIFRoZSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCB5b3UgY291bGRuJ3QgbWl4Citca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50cyB3aXRoIGEgXGNvZGV7dHJ5Li4uZmluYWxseX0gc3VpdGUgaGFzCit0aGVyZWZvcmUgYmVlbiByZW1vdmVkLiAgVGhpcyBzZWVtcyBsaWtlIGEgbWlub3IgYml0IG9mIGxhbmd1YWdlCit0cml2aWEsIGJ1dCB1c2luZyBnZW5lcmF0b3JzIGFuZCBcY29kZXt0cnkuLi5maW5hbGx5fSBpcyBhY3R1YWxseQorbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGltcGxlbWVudCB0aGUgIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudAorZGVzY3JpYmVkIGJ5IFBFUCAzNDMuICBJJ2xsIGxvb2sgYXQgdGhpcyBuZXcgc3RhdGVtZW50IGluIHRoZSBmb2xsb3dpbmcgCitzZWN0aW9uLgorCitBbm90aGVyIGV2ZW4gbW9yZSBlc290ZXJpYyBlZmZlY3Qgb2YgdGhpcyBjaGFuZ2U6IHByZXZpb3VzbHksIHRoZQorXG1lbWJlcntnaV9mcmFtZX0gYXR0cmlidXRlIG9mIGEgZ2VuZXJhdG9yIHdhcyBhbHdheXMgYSBmcmFtZSBvYmplY3QuCitJdCdzIG5vdyBwb3NzaWJsZSBmb3IgXG1lbWJlcntnaV9mcmFtZX0gdG8gYmUgXGNvZGV7Tm9uZX0KK29uY2UgdGhlIGdlbmVyYXRvciBoYXMgYmVlbiBleGhhdXN0ZWQuCiAKIFxiZWdpbntzZWVhbHNvfQogCiBcc2VlcGVwezM0Mn17Q29yb3V0aW5lcyB2aWEgRW5oYW5jZWQgR2VuZXJhdG9yc317UEVQIHdyaXR0ZW4gYnkgCi1HdWlkbyB2YW4gUm9zc3VtIGFuZCBQaGlsbGlwIEouIEVieTsKK0d1aWRvIHZhbn5Sb3NzdW0gYW5kIFBoaWxsaXAgSi4gRWJ5OwogaW1wbGVtZW50ZWQgYnkgUGhpbGxpcCBKLiBFYnkuICBJbmNsdWRlcyBleGFtcGxlcyBvZiAKIHNvbWUgZmFuY2llciB1c2VzIG9mIGdlbmVyYXRvcnMgYXMgY29yb3V0aW5lcy59CiAKQEAgLTM2NywxNCArNTgwLDMyMyBAQAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue1BFUCAzNDM6IFRoZSAnd2l0aCcgc3RhdGVtZW50fQogCi0lIFhYWCB3cml0ZSB0aGlzCitUaGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IGFsbG93cyBhIGNsZWFyZXIgdmVyc2lvbiBvZiBjb2RlIHRoYXQKK3VzZXMgXGNvZGV7dHJ5Li4uZmluYWxseX0gYmxvY2tzIHRvIGVuc3VyZSB0aGF0IGNsZWFuLXVwIGNvZGUgaXMKK2V4ZWN1dGVkLgorCitJbiB0aGlzIHNlY3Rpb24sIEknbGwgZGlzY3VzcyB0aGUgc3RhdGVtZW50IGFzIGl0IHdpbGwgY29tbW9ubHkgYmUKK3VzZWQuICBJbiB0aGUgbmV4dCBzZWN0aW9uLCBJJ2xsIGV4YW1pbmUgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMKK2FuZCBzaG93IGhvdyB0byB3cml0ZSBvYmplY3RzIGNhbGxlZCBgYGNvbnRleHQgbWFuYWdlcnMnJyBhbmQKK2BgY29udGV4dHMnJyBmb3IgdXNlIHdpdGggdGhpcyBzdGF0ZW1lbnQuCisKK1RoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQgaXMgYSBuZXcgY29udHJvbC1mbG93IHN0cnVjdHVyZSB3aG9zZQorYmFzaWMgc3RydWN0dXJlIGlzOgorCitcYmVnaW57dmVyYmF0aW19Cit3aXRoIGV4cHJlc3Npb24gW2FzIHZhcmlhYmxlXToKKyAgICB3aXRoLWJsb2NrCitcZW5ke3ZlcmJhdGltfQorCitUaGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCBpdCBzaG91bGQgcmVzdWx0IGluIGEgdHlwZSBvZiBvYmplY3QKK3RoYXQncyBjYWxsZWQgYSBjb250ZXh0IG1hbmFnZXIuICBUaGUgY29udGV4dCBtYW5hZ2VyIGNhbiByZXR1cm4gYQordmFsdWUgdGhhdCBjYW4gb3B0aW9uYWxseSBiZSBib3VuZCB0byB0aGUgbmFtZSBcdmFye3ZhcmlhYmxlfS4gIChOb3RlCitjYXJlZnVsbHk6IFx2YXJ7dmFyaWFibGV9IGlzIFxlbXBoe25vdH0gYXNzaWduZWQgdGhlIHJlc3VsdCBvZgorXHZhcntleHByZXNzaW9ufS4pICBPbmUgbWV0aG9kIG9mIHRoZSBjb250ZXh0IG1hbmFnZXIgaXMgcnVuIGJlZm9yZQorXHZhcnt3aXRoLWJsb2NrfSBpcyBleGVjdXRlZCwgYW5kIGFub3RoZXIgbWV0aG9kIGlzIHJ1biBhZnRlciB0aGUKK2Jsb2NrIGlzIGRvbmUsIGV2ZW4gaWYgdGhlIGJsb2NrIHJhaXNlZCBhbiBleGNlcHRpb24uCisKK1RvIGVuYWJsZSB0aGUgc3RhdGVtZW50IGluIFB5dGhvbiAyLjUsIHlvdSBuZWVkIAordG8gYWRkIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlIHRvIHlvdXIgbW9kdWxlOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CitcZW5ke3ZlcmJhdGltfQorCitUaGUgc3RhdGVtZW50IHdpbGwgYWx3YXlzIGJlIGVuYWJsZWQgaW4gUHl0aG9uIDIuNi4KKworU29tZSBzdGFuZGFyZCBQeXRob24gb2JqZWN0cyBjYW4gbm93IGJlaGF2ZSBhcyBjb250ZXh0IG1hbmFnZXJzLiBGaWxlCitvYmplY3RzIGFyZSBvbmUgZXhhbXBsZToKKworXGJlZ2lue3ZlcmJhdGltfQord2l0aCBvcGVuKCcvZXRjL3Bhc3N3ZCcsICdyJykgYXMgZjoKKyAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICBwcmludCBsaW5lCisgICAgICAgIC4uLiBtb3JlIHByb2Nlc3NpbmcgY29kZSAuLi4KK1xlbmR7dmVyYmF0aW19CisKK0FmdGVyIHRoaXMgc3RhdGVtZW50IGhhcyBleGVjdXRlZCwgdGhlIGZpbGUgb2JqZWN0IGluIFx2YXJ7Zn0gd2lsbAoraGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgY2xvc2VkIGF0IHRoaXMgcG9pbnQsIGV2ZW4gaWYgdGhlICdmb3InIGxvb3AKK3JhaXNlZCBhbiBleGNlcHRpb24gcGFydC13YXkgdGhyb3VnaCB0aGUgYmxvY2suCisKK1RoZSBcbW9kdWxle3RocmVhZGluZ30gbW9kdWxlJ3MgbG9ja3MgYW5kIGNvbmRpdGlvbiB2YXJpYWJsZXMgCithbHNvIHN1cHBvcnQgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudDoKKworXGJlZ2lue3ZlcmJhdGltfQorbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKK3dpdGggbG9jazoKKyAgICAjIENyaXRpY2FsIHNlY3Rpb24gb2YgY29kZQorICAgIC4uLgorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGxvY2sgaXMgYWNxdWlyZWQgYmVmb3JlIHRoZSBibG9jayBpcyBleGVjdXRlZCwgYW5kIGFsd2F5cyByZWxlYXNlZCBvbmNlIAordGhlIGJsb2NrIGlzIGNvbXBsZXRlLgorCitUaGUgXG1vZHVsZXtkZWNpbWFsfSBtb2R1bGUncyBjb250ZXh0cywgd2hpY2ggZW5jYXBzdWxhdGUgdGhlIGRlc2lyZWQKK3ByZWNpc2lvbiBhbmQgcm91bmRpbmcgY2hhcmFjdGVyaXN0aWNzIGZvciBjb21wdXRhdGlvbnMsIGNhbiBhbHNvIGJlCit1c2VkIGFzIGNvbnRleHQgbWFuYWdlcnMuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ltcG9ydCBkZWNpbWFsCisKKyMgRGlzcGxheXMgd2l0aCBkZWZhdWx0IHByZWNpc2lvbiBvZiAyOCBkaWdpdHMKK3YxID0gZGVjaW1hbC5EZWNpbWFsKCc1NzgnKQorcHJpbnQgdjEuc3FydCgpCisKK3dpdGggZGVjaW1hbC5Db250ZXh0KHByZWM9MTYpOgorICAgICMgQWxsIGNvZGUgaW4gdGhpcyBibG9jayB1c2VzIGEgcHJlY2lzaW9uIG9mIDE2IGRpZ2l0cy4KKyAgICAjIFRoZSBvcmlnaW5hbCBjb250ZXh0IGlzIHJlc3RvcmVkIG9uIGV4aXRpbmcgdGhlIGJsb2NrLgorICAgIHByaW50IHYxLnNxcnQoKQorXGVuZHt2ZXJiYXRpbX0KKworXHN1YnNlY3Rpb257V3JpdGluZyBDb250ZXh0IE1hbmFnZXJzfQorCitVbmRlciB0aGUgaG9vZCwgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBpcyBmYWlybHkgY29tcGxpY2F0ZWQuCitNb3N0IHBlb3BsZSB3aWxsIG9ubHkgdXNlIFxrZXl3b3Jke3dpdGh9IGluIGNvbXBhbnkgd2l0aAorZXhpc3Rpbmcgb2JqZWN0cyB0aGF0IGFyZSBkb2N1bWVudGVkIHRvIHdvcmsgYXMgY29udGV4dCBtYW5hZ2VycywgYW5kCitkb24ndCBuZWVkIHRvIGtub3cgdGhlc2UgZGV0YWlscywgc28geW91IGNhbiBza2lwIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBpZgoreW91IGxpa2UuICBBdXRob3JzIG9mIG5ldyBjb250ZXh0IG1hbmFnZXJzIHdpbGwgbmVlZCB0byB1bmRlcnN0YW5kIHRoZQorZGV0YWlscyBvZiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KKworQSBoaWdoLWxldmVsIGV4cGxhbmF0aW9uIG9mIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wgaXM6CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGFuZCBzaG91bGQgcmVzdWx0IGluIGFuIG9iamVjdAordGhhdCdzIGEgY29udGV4dCBtYW5hZ2VyLCBtZWFuaW5nIHRoYXQgaXQgaGFzIGEgCitcbWV0aG9ke19fY29udGV4dF9fKCl9IG1ldGhvZC4KKworXGl0ZW0gVGhpcyBvYmplY3QncyBcbWV0aG9ke19fY29udGV4dF9fKCl9IG1ldGhvZCBpcyBjYWxsZWQsIGFuZCBtdXN0CityZXR1cm4gYSBjb250ZXh0IG9iamVjdC4gIAorCitcaXRlbSBUaGUgY29udGV4dCdzIFxtZXRob2R7X19lbnRlcl9fKCl9IG1ldGhvZCBpcyBjYWxsZWQuIAorVGhlIHZhbHVlIHJldHVybmVkIGlzIGFzc2lnbmVkIHRvIFx2YXJ7VkFSfS4gIElmIG5vIFxjb2Rle2FzIFx2YXJ7VkFSfX0gCitjbGF1c2UgaXMgcHJlc2VudCwgdGhlIHZhbHVlIGlzIHNpbXBseSBkaXNjYXJkZWQuCisKK1xpdGVtIFRoZSBjb2RlIGluIFx2YXJ7QkxPQ0t9IGlzIGV4ZWN1dGVkLgorCitcaXRlbSBJZiBcdmFye0JMT0NLfSByYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgY29udGV4dCBvYmplY3QncworXG1ldGhvZHtfX2V4aXRfXyhcdmFye3R5cGV9LCBcdmFye3ZhbHVlfSwgXHZhcnt0cmFjZWJhY2t9KX0gaXMgY2FsbGVkCit3aXRoIHRoZSBleGNlcHRpb24ncyBpbmZvcm1hdGlvbiwgdGhlIHNhbWUgdmFsdWVzIHJldHVybmVkIGJ5CitcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9LiAgVGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZQorY29udHJvbHMgd2hldGhlciB0aGUgZXhjZXB0aW9uIGlzIHJlLXJhaXNlZDogYW55IGZhbHNlIHZhbHVlIAorcmUtcmFpc2VzIHRoZSBleGNlcHRpb24sIGFuZCBcY29kZXtUcnVlfSB3aWxsIHJlc3VsdCBpbiBzdXBwcmVzc2luZyBpdC4KK1lvdSdsbCBvbmx5IHJhcmVseSB3YW50IHRvIHN1cHByZXNzIHRoZSBleGNlcHRpb247IHRoZSAKK2F1dGhvciBvZiB0aGUgY29kZSBjb250YWluaW5nIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQgd2lsbCAKK25ldmVyIHJlYWxpemUgYW55dGhpbmcgd2VudCB3cm9uZy4KKworXGl0ZW0gSWYgXHZhcntCTE9DS30gZGlkbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiwgCit0aGUgY29udGV4dCBvYmplY3QncyBcbWV0aG9ke19fZXhpdF9fKCl9IGlzIHN0aWxsIGNhbGxlZCwKK2J1dCBcdmFye3R5cGV9LCBcdmFye3ZhbHVlfSwgYW5kIFx2YXJ7dHJhY2ViYWNrfSBhcmUgYWxsIFxjb2Rle05vbmV9LgorCitcZW5ke2l0ZW1pemV9CisKK0xldCdzIHRoaW5rIHRocm91Z2ggYW4gZXhhbXBsZS4gIEkgd29uJ3QgcHJlc2VudCBkZXRhaWxlZCBjb2RlIGJ1dAord2lsbCBvbmx5IHNrZXRjaCB0aGUgbmVjZXNzYXJ5IGNvZGUuICBUaGUgZXhhbXBsZSB3aWxsIGJlIHdyaXRpbmcgYQorY29udGV4dCBtYW5hZ2VyIGZvciBhIGRhdGFiYXNlIHRoYXQgc3VwcG9ydHMgdHJhbnNhY3Rpb25zLgorCisoRm9yIHBlb3BsZSB1bmZhbWlsaWFyIHdpdGggZGF0YWJhc2UgdGVybWlub2xvZ3k6IGEgc2V0IG9mIGNoYW5nZXMgdG8KK3RoZSBkYXRhYmFzZSBhcmUgZ3JvdXBlZCBpbnRvIGEgdHJhbnNhY3Rpb24uICBUcmFuc2FjdGlvbnMgY2FuIGJlCitlaXRoZXIgY29tbWl0dGVkLCBtZWFuaW5nIHRoYXQgYWxsIHRoZSBjaGFuZ2VzIGFyZSB3cml0dGVuIGludG8gdGhlCitkYXRhYmFzZSwgb3Igcm9sbGVkIGJhY2ssIG1lYW5pbmcgdGhhdCB0aGUgY2hhbmdlcyBhcmUgYWxsIGRpc2NhcmRlZAorYW5kIHRoZSBkYXRhYmFzZSBpcyB1bmNoYW5nZWQuICBTZWUgYW55IGRhdGFiYXNlIHRleHRib29rIGZvciBtb3JlCitpbmZvcm1hdGlvbi4pCislIFhYWCBmaW5kIGEgc2hvcnRlciByZWZlcmVuY2U/CisKK0xldCdzIGFzc3VtZSB0aGVyZSdzIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLgorT3VyIGdvYWwgd2lsbCBiZSB0byBsZXQgdGhlIHVzZXIgd3JpdGUgY29kZSBsaWtlIHRoaXM6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2RiX2Nvbm5lY3Rpb24gPSBEYXRhYmFzZUNvbm5lY3Rpb24oKQord2l0aCBkYl9jb25uZWN0aW9uIGFzIGN1cnNvcjoKKyAgICBjdXJzb3IuZXhlY3V0ZSgnaW5zZXJ0IGludG8gLi4uJykKKyAgICBjdXJzb3IuZXhlY3V0ZSgnZGVsZXRlIGZyb20gLi4uJykKKyAgICAjIC4uLiBtb3JlIG9wZXJhdGlvbnMgLi4uCitcZW5ke3ZlcmJhdGltfQorCitUaGUgdHJhbnNhY3Rpb24gc2hvdWxkIGVpdGhlciBiZSBjb21taXR0ZWQgaWYgdGhlIGNvZGUgaW4gdGhlIGJsb2NrCitydW5zIGZsYXdsZXNzbHksIG9yIHJvbGxlZCBiYWNrIGlmIHRoZXJlJ3MgYW4gZXhjZXB0aW9uLgorCitGaXJzdCwgdGhlIFxjbGFzc3tEYXRhYmFzZUNvbm5lY3Rpb259IG5lZWRzIGEgXG1ldGhvZHtfX2NvbnRleHRfXygpfQorbWV0aG9kLiAgU29tZXRpbWVzIGFuIG9iamVjdCBjYW4gYmUgaXRzIG93biBjb250ZXh0IG1hbmFnZXIgYW5kIGNhbgorc2ltcGx5IHJldHVybiBcY29kZXtzZWxmfTsgdGhlIFxtb2R1bGV7dGhyZWFkaW5nfSBtb2R1bGUncyBsb2NrIG9iamVjdHMgCitjYW4gZG8gdGhpcy4gIEZvciBvdXIgZGF0YWJhc2UgZXhhbXBsZSwgdGhvdWdoLCB3ZSBuZWVkIHRvIAorY3JlYXRlIGEgbmV3IG9iamVjdDsgSSdsbCBjYWxsIHRoaXMgY2xhc3MgXGNsYXNze0RhdGFiYXNlQ29udGV4dH0uCitPdXIgXG1ldGhvZHtfX2NvbnRleHRfXygpfSBtdXN0IHRoZXJlZm9yZSBsb29rIGxpa2UgdGhpczoKKworXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uOgorICAgIC4uLgorICAgIGRlZiBfX2NvbnRleHRfXyAoc2VsZik6CisgICAgICAgIHJldHVybiBEYXRhYmFzZUNvbnRleHQoc2VsZikKKworICAgICMgRGF0YWJhc2UgaW50ZXJmYWNlCisgICAgZGVmIGN1cnNvciAoc2VsZik6CisgICAgICAgICJSZXR1cm5zIGEgY3Vyc29yIG9iamVjdCBhbmQgc3RhcnRzIGEgbmV3IHRyYW5zYWN0aW9uIgorICAgIGRlZiBjb21taXQgKHNlbGYpOgorICAgICAgICAiQ29tbWl0cyBjdXJyZW50IHRyYW5zYWN0aW9uIgorICAgIGRlZiByb2xsYmFjayAoc2VsZik6CisgICAgICAgICJSb2xscyBiYWNrIGN1cnJlbnQgdHJhbnNhY3Rpb24iCitcZW5ke3ZlcmJhdGltfQorCitUaGUgY29udGV4dCBuZWVkcyB0aGUgY29ubmVjdGlvbiBvYmplY3Qgc28gdGhhdCB0aGUgY29ubmVjdGlvbgorb2JqZWN0J3MgXG1ldGhvZHtjb21taXQoKX0gb3IgXG1ldGhvZHtyb2xsYmFjaygpfSBtZXRob2RzIGNhbiBiZQorY2FsbGVkOgorCitcYmVnaW57dmVyYmF0aW19CitjbGFzcyBEYXRhYmFzZUNvbnRleHQ6CisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBjb25uZWN0aW9uKToKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gY29ubmVjdGlvbgorXGVuZHt2ZXJiYXRpbX0KKworVGhlIFxtZXRob2Qge19fZW50ZXJfXygpfSBtZXRob2QgaXMgcHJldHR5IGVhc3ksIGhhdmluZyBvbmx5Cit0byBzdGFydCBhIG5ldyB0cmFuc2FjdGlvbi4gIEluIHRoaXMgZXhhbXBsZSwKK3RoZSByZXN1bHRpbmcgY3Vyc29yIG9iamVjdCB3b3VsZCBiZSBhIHVzZWZ1bCByZXN1bHQsCitzbyB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIGl0LiAgVGhlIHVzZXIgY2FuIAordGhlbiBhZGQgXGNvZGV7YXMgY3Vyc29yfSB0byB0aGVpciBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQKK3RvIGJpbmQgdGhlIGN1cnNvciB0byBhIHZhcmlhYmxlIG5hbWUuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK2NsYXNzIERhdGFiYXNlQ29udGV4dDoKKyAgICAuLi4KKyAgICBkZWYgX19lbnRlcl9fIChzZWxmKToKKyAgICAgICAgIyBDb2RlIHRvIHN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uCisgICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQorICAgICAgICByZXR1cm4gY3Vyc29yCitcZW5ke3ZlcmJhdGltfQorCitUaGUgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2QgaXMgdGhlIG1vc3QgY29tcGxpY2F0ZWQgYmVjYXVzZSBpdCdzCit3aGVyZSBtb3N0IG9mIHRoZSB3b3JrIGhhcyB0byBiZSBkb25lLiAgVGhlIG1ldGhvZCBoYXMgdG8gY2hlY2sgaWYgYW4KK2V4Y2VwdGlvbiBvY2N1cnJlZC4gIElmIHRoZXJlIHdhcyBubyBleGNlcHRpb24sIHRoZSB0cmFuc2FjdGlvbiBpcworY29tbWl0dGVkLiAgVGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrIGlmIHRoZXJlIHdhcyBhbiBleGNlcHRpb24uCitIZXJlIHRoZSBjb2RlIHdpbGwganVzdCBmYWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwgcmV0dXJuaW5nIAordGhlIGRlZmF1bHQgdmFsdWUgb2YgXGNvZGV7Tm9uZX0uICBcY29kZXtOb25lfSBpcyBmYWxzZSwgc28gdGhlIGV4Y2VwdGlvbgord2lsbCBiZSByZS1yYWlzZWQgYXV0b21hdGljYWxseS4gIElmIHlvdSB3aXNoZWQsIHlvdSBjb3VsZCBiZSBtb3JlIGV4cGxpY2l0CithbmQgYWRkIGEgXGtleXdvcmR7cmV0dXJufSBhdCB0aGUgbWFya2VkIGxvY2F0aW9uLgorCitcYmVnaW57dmVyYmF0aW19CitjbGFzcyBEYXRhYmFzZUNvbnRleHQ6CisgICAgLi4uCisgICAgZGVmIF9fZXhpdF9fIChzZWxmLCB0eXBlLCB2YWx1ZSwgdGIpOgorICAgICAgICBpZiB0YiBpcyBOb25lOgorICAgICAgICAgICAgIyBObyBleGNlcHRpb24sIHNvIGNvbW1pdAorICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbW1pdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEV4Y2VwdGlvbiBvY2N1cnJlZCwgc28gcm9sbGJhY2suCisgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24ucm9sbGJhY2soKQorICAgICAgICAgICAgIyByZXR1cm4gRmFsc2UKK1xlbmR7dmVyYmF0aW19CisKKworXHN1YnNlY3Rpb257VGhlIGNvbnRleHRsaWIgbW9kdWxlXGxhYmVse21vZHVsZS1jb250ZXh0bGlifX0KKworVGhlIG5ldyBcbW9kdWxle2NvbnRleHRsaWJ9IG1vZHVsZSBwcm92aWRlcyBzb21lIGZ1bmN0aW9ucyBhbmQgYQorZGVjb3JhdG9yIHRoYXQgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBjb250ZXh0IG1hbmFnZXJzLgorCitUaGUgZGVjb3JhdG9yIGlzIGNhbGxlZCBcZnVuY3Rpb257Y29udGV4dG1hbmFnZXJ9LCBhbmQgbGV0cyB5b3Ugd3JpdGUKK2Egc2ltcGxlIGNvbnRleHQgbWFuYWdlciBhcyBhIGdlbmVyYXRvci4gIFRoZSBnZW5lcmF0b3Igc2hvdWxkIHlpZWxkCitleGFjdGx5IG9uZSB2YWx1ZS4gIFRoZSBjb2RlIHVwIHRvIHRoZSBca2V5d29yZHt5aWVsZH0gd2lsbCBiZQorZXhlY3V0ZWQgYXMgdGhlIFxtZXRob2R7X19lbnRlcl9fKCl9IG1ldGhvZCwgYW5kIHRoZSB2YWx1ZSB5aWVsZGVkCit3aWxsIGJlIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgdGhhdCB3aWxsIGdldCBib3VuZCB0byB0aGUgdmFyaWFibGUKK2luIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQncyBca2V5d29yZHthc30gY2xhdXNlLCBpZiBhbnkuICBUaGUKK2NvZGUgYWZ0ZXIgdGhlIFxrZXl3b3Jke3lpZWxkfSB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZQorXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2QuICBBbnkgZXhjZXB0aW9uIHJhaXNlZCBpbiB0aGUgYmxvY2sgCit3aWxsIGJlIHJhaXNlZCBieSB0aGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudC4KKworT3VyIGRhdGFiYXNlIGV4YW1wbGUgZnJvbSB0aGUgcHJldmlvdXMgc2VjdGlvbiBjb3VsZCBiZSB3cml0dGVuIAordXNpbmcgdGhpcyBkZWNvcmF0b3IgYXM6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKKworQGNvbnRleHRtYW5hZ2VyCitkZWYgZGJfdHJhbnNhY3Rpb24gKGNvbm5lY3Rpb24pOgorICAgIGN1cnNvciA9IGNvbm5lY3Rpb24uY3Vyc29yKCkKKyAgICB0cnk6CisgICAgICAgIHlpZWxkIGN1cnNvcgorICAgIGV4Y2VwdDoKKyAgICAgICAgY29ubmVjdGlvbi5yb2xsYmFjaygpCisgICAgICAgIHJhaXNlCisgICAgZWxzZToKKyAgICAgICAgY29ubmVjdGlvbi5jb21taXQoKQorCitkYiA9IERhdGFiYXNlQ29ubmVjdGlvbigpCit3aXRoIGRiX3RyYW5zYWN0aW9uKGRiKSBhcyBjdXJzb3I6CisgICAgLi4uCitcZW5ke3ZlcmJhdGltfQorCitZb3UgY2FuIGFsc28gdXNlIHRoaXMgZGVjb3JhdG9yIHRvIHdyaXRlIHRoZSBcbWV0aG9ke19fY29udGV4dF9fKCl9IG1ldGhvZAorZm9yIGEgY2xhc3Mgd2l0aG91dCBjcmVhdGluZyBhIG5ldyBjbGFzcyBmb3IgdGhlIGNvbnRleHQ6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2NsYXNzIERhdGFiYXNlQ29ubmVjdGlvbjoKKworICAgIEBjb250ZXh0bWFuYWdlcgorICAgIGRlZiBfX2NvbnRleHRfXyAoc2VsZik6CisJY3Vyc29yID0gc2VsZi5jdXJzb3IoKQorCXRyeToKKwkgICAgeWllbGQgY3Vyc29yCisJZXhjZXB0OgorCSAgICBzZWxmLnJvbGxiYWNrKCkKKwkgICAgcmFpc2UKKwllbHNlOgorCSAgICBzZWxmLmNvbW1pdCgpCitcZW5ke3ZlcmJhdGltfQorCisKK1RoZXJlJ3MgYSBcZnVuY3Rpb257bmVzdGVkKFx2YXJ7bWdyMX0sIFx2YXJ7bWdyMn0sIC4uLil9IG1hbmFnZXIgdGhhdAorY29tYmluZXMgYSBudW1iZXIgb2YgY29udGV4dCBtYW5hZ2VycyBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3cml0ZQorbmVzdGVkIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudHMuICBUaGlzIGV4YW1wbGUgc3RhdGVtZW50IGRvZXMgdHdvCit0aGluZ3MsIHN0YXJ0aW5nIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24gYW5kIGFjcXVpcmluZyBhIHRocmVhZCBsb2NrOgorCitcYmVnaW57dmVyYmF0aW19Citsb2NrID0gdGhyZWFkaW5nLkxvY2soKQord2l0aCBuZXN0ZWQgKGRiX3RyYW5zYWN0aW9uKGRiKSwgbG9jaykgYXMgKGN1cnNvciwgbG9ja2VkKToKKyAgICAuLi4KK1xlbmR7dmVyYmF0aW19CisKK0ZpbmFsbHksIHRoZSBcZnVuY3Rpb257Y2xvc2luZyhcdmFye29iamVjdH0pfSBjb250ZXh0IG1hbmFnZXIgCityZXR1cm5zIFx2YXJ7b2JqZWN0fSBzbyB0aGF0IGl0IGNhbiBiZSBib3VuZCB0byBhIHZhcmlhYmxlLAorYW5kIGNhbGxzIFxjb2Rle1x2YXJ7b2JqZWN0fS5jbG9zZSgpfSBhdCB0aGUgZW5kIG9mIHRoZSBibG9jay4KKworXGJlZ2lue3ZlcmJhdGltfQoraW1wb3J0IHVybGxpYiwgc3lzCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNsb3NpbmcKKword2l0aCBjbG9zaW5nKHVybGxpYi51cmxvcGVuKCdodHRwOi8vd3d3LnlhaG9vLmNvbScpKSBhcyBmOgorICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUobGluZSkKK1xlbmR7dmVyYmF0aW19CisKK1xiZWdpbntzZWVhbHNvfQorCitcc2VlcGVwezM0M317VGhlIGBgd2l0aCcnIHN0YXRlbWVudH17UEVQIHdyaXR0ZW4gYnkgR3VpZG8gdmFuflJvc3N1bQorYW5kIE5pY2sgQ29naGxhbjsgaW1wbGVtZW50ZWQgYnkgTWlrZSBCbGFuZCwgR3VpZG8gdmFuflJvc3N1bSwgYW5kCitOZWFsIE5vcndpdHouICBUaGUgUEVQIHNob3dzIHRoZSBjb2RlIGdlbmVyYXRlZCBmb3IgYSBca2V5d29yZHt3aXRofQorc3RhdGVtZW50LCB3aGljaCBjYW4gYmUgaGVscGZ1bCBpbiBsZWFybmluZyBob3cgY29udGV4dCBtYW5hZ2Vycword29yay59CisKK1xzZWV1cmx7Li4vbGliL21vZHVsZS1jb250ZXh0bGliLmh0bWx9e1RoZSBkb2N1bWVudGF0aW9uIAorZm9yIHRoZSBcbW9kdWxle2NvbnRleHRsaWJ9IG1vZHVsZS59CisKK1xlbmR7c2VlYWxzb30KIAogCiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogXHNlY3Rpb257UEVQIDM1MjogRXhjZXB0aW9ucyBhcyBOZXctU3R5bGUgQ2xhc3Nlc30KIAotRXhjZXB0aW9uIGNsYXNzZXMgY2FuIG5vdyBiZSBuZXctc3R5bGUgY2xhc3Nlcywgbm90IGp1c3QgY2xhc3NpYyBjbGFzc2VzLAotYW5kIHRoZSBidWlsdC1pbiBcZXhjZXB0aW9ue0V4Y2VwdGlvbn0gY2xhc3MgYW5kIGFsbAorRXhjZXB0aW9uIGNsYXNzZXMgY2FuIG5vdyBiZSBuZXctc3R5bGUgY2xhc3Nlcywgbm90IGp1c3QgY2xhc3NpYworY2xhc3NlcywgYW5kIHRoZSBidWlsdC1pbiBcZXhjZXB0aW9ue0V4Y2VwdGlvbn0gY2xhc3MgYW5kIGFsbCB0aGUKK3N0YW5kYXJkIGJ1aWx0LWluIGV4Y2VwdGlvbnMgKFxleGNlcHRpb257TmFtZUVycm9yfSwKK1xleGNlcHRpb257VmFsdWVFcnJvcn0sIGV0Yy4pIGFyZSBub3cgbmV3LXN0eWxlIGNsYXNzZXMuCiAKIFRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgZm9yIGV4Y2VwdGlvbnMgaGFzIGJlZW4gcmVhcnJhbmdlZCBhIGJpdC4KIEluIDIuNSwgdGhlIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgYXJlOgpAQCAtNDI4LDggKzk1MCw3MCBAQAogCiBcYmVnaW57c2VlYWxzb30KIAotXHNlZXBlcHszNTJ9e317UEVQIHdyaXR0ZW4gYnkgCi1CcmV0dCBDYW5ub24gYW5kIEd1aWRvIHZhbiBSb3NzdW07IGltcGxlbWVudGVkIGJ5IEJyZXR0IENhbm5vbi59Citcc2VlcGVwezM1Mn17UmVxdWlyZWQgU3VwZXJjbGFzcyBmb3IgRXhjZXB0aW9uc317UEVQIHdyaXR0ZW4gYnkgCitCcmV0dCBDYW5ub24gYW5kIEd1aWRvIHZhbn5Sb3NzdW07IGltcGxlbWVudGVkIGJ5IEJyZXR0IENhbm5vbi59CisKK1xlbmR7c2VlYWxzb30KKworCislPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorXHNlY3Rpb257UEVQIDM1MzogVXNpbmcgc3NpemVfdCBhcyB0aGUgaW5kZXggdHlwZVxsYWJlbHtzZWN0aW9uLTM1M319CisKK0Egd2lkZS1yYW5naW5nIGNoYW5nZSB0byBQeXRob24ncyBDIEFQSSwgdXNpbmcgYSBuZXcgCitcY3R5cGV7UHlfc3NpemVfdH0gdHlwZSBkZWZpbml0aW9uIGluc3RlYWQgb2YgXGN0eXBle2ludH0sIAord2lsbCBwZXJtaXQgdGhlIGludGVycHJldGVyIHRvIGhhbmRsZSBtb3JlIGRhdGEgb24gNjQtYml0IHBsYXRmb3Jtcy4KK1RoaXMgY2hhbmdlIGRvZXNuJ3QgYWZmZWN0IFB5dGhvbidzIGNhcGFjaXR5IG9uIDMyLWJpdCBwbGF0Zm9ybXMuCisKK1ZhcmlvdXMgcGllY2VzIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgdXNlZCBDJ3MgXGN0eXBle2ludH0gdHlwZSB0bworc3RvcmUgc2l6ZXMgb3IgY291bnRzOyBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIGxpc3Qgb3IKK3R1cGxlIHdlcmUgc3RvcmVkIGluIGFuIFxjdHlwZXtpbnR9LiAgVGhlIEMgY29tcGlsZXJzIGZvciBtb3N0IDY0LWJpdAorcGxhdGZvcm1zIHN0aWxsIGRlZmluZSBcY3R5cGV7aW50fSBhcyBhIDMyLWJpdCB0eXBlLCBzbyB0aGF0IG1lYW50Cit0aGF0IGxpc3RzIGNvdWxkIG9ubHkgaG9sZCB1cCB0byBcY29kZXsyKiozMSAtIDF9ID0gMjE0NzQ4MzY0NyBpdGVtcy4KKyhUaGVyZSBhcmUgYWN0dWFsbHkgYSBmZXcgZGlmZmVyZW50IHByb2dyYW1taW5nIG1vZGVscyB0aGF0IDY0LWJpdCBDCitjb21waWxlcnMgY2FuIHVzZSAtLSBzZWUKK1x1cmx7aHR0cDovL3d3dy51bml4Lm9yZy92ZXJzaW9uMi93aGF0c25ldy9scDY0X3dwLmh0bWx9IGZvciBhCitkaXNjdXNzaW9uIC0tIGJ1dCB0aGUgbW9zdCBjb21tb25seSBhdmFpbGFibGUgbW9kZWwgbGVhdmVzIFxjdHlwZXtpbnR9CithcyAzMiBiaXRzLikKKworQSBsaW1pdCBvZiAyMTQ3NDgzNjQ3IGl0ZW1zIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBvbiBhIDMyLWJpdCBwbGF0Zm9ybQorYmVjYXVzZSB5b3UnbGwgcnVuIG91dCBvZiBtZW1vcnkgYmVmb3JlIGhpdHRpbmcgdGhlIGxlbmd0aCBsaW1pdC4KK0VhY2ggbGlzdCBpdGVtIHJlcXVpcmVzIHNwYWNlIGZvciBhIHBvaW50ZXIsIHdoaWNoIGlzIDQgYnl0ZXMsIHBsdXMKK3NwYWNlIGZvciBhIFxjdHlwZXtQeU9iamVjdH0gcmVwcmVzZW50aW5nIHRoZSBpdGVtLiAgMjE0NzQ4MzY0Nyo0IGlzCithbHJlYWR5IG1vcmUgYnl0ZXMgdGhhbiBhIDMyLWJpdCBhZGRyZXNzIHNwYWNlIGNhbiBjb250YWluLgorCitJdCdzIHBvc3NpYmxlIHRvIGFkZHJlc3MgdGhhdCBtdWNoIG1lbW9yeSBvbiBhIDY0LWJpdCBwbGF0Zm9ybSwKK2hvd2V2ZXIuICBUaGUgcG9pbnRlcnMgZm9yIGEgbGlzdCB0aGF0IHNpemUgd291bGQgb25seSByZXF1aXJlIDE2R2lCCitvZiBzcGFjZSwgc28gaXQncyBub3QgdW5yZWFzb25hYmxlIHRoYXQgUHl0aG9uIHByb2dyYW1tZXJzIG1pZ2h0Citjb25zdHJ1Y3QgbGlzdHMgdGhhdCBsYXJnZS4gIFRoZXJlZm9yZSwgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBoYWQgdG8KK2JlIGNoYW5nZWQgdG8gdXNlIHNvbWUgdHlwZSBvdGhlciB0aGFuIFxjdHlwZXtpbnR9LCBhbmQgdGhpcyB3aWxsIGJlIGEKKzY0LWJpdCB0eXBlIG9uIDY0LWJpdCBwbGF0Zm9ybXMuICBUaGUgY2hhbmdlIHdpbGwgY2F1c2UKK2luY29tcGF0aWJpbGl0aWVzIG9uIDY0LWJpdCBtYWNoaW5lcywgc28gaXQgd2FzIGRlZW1lZCB3b3J0aCBtYWtpbmcKK3RoZSB0cmFuc2l0aW9uIG5vdywgd2hpbGUgdGhlIG51bWJlciBvZiA2NC1iaXQgdXNlcnMgaXMgc3RpbGwKK3JlbGF0aXZlbHkgc21hbGwuICAoSW4gNSBvciAxMCB5ZWFycywgd2UgbWF5IFxlbXBoe2FsbH0gYmUgb24gNjQtYml0CittYWNoaW5lcywgYW5kIHRoZSB0cmFuc2l0aW9uIHdvdWxkIGJlIG1vcmUgcGFpbmZ1bCB0aGVuLikKKworVGhpcyBjaGFuZ2UgbW9zdCBzdHJvbmdseSBhZmZlY3RzIGF1dGhvcnMgb2YgQyBleHRlbnNpb24gbW9kdWxlcy4gIAorUHl0aG9uIHN0cmluZ3MgYW5kIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzIGxpc3RzIGFuZCB0dXBsZXMgCitub3cgdXNlIFxjdHlwZXtQeV9zc2l6ZV90fSB0byBzdG9yZSB0aGVpciBzaXplLiAgCitGdW5jdGlvbnMgc3VjaCBhcyBcY2Z1bmN0aW9ue1B5TGlzdF9TaXplKCl9IAorbm93IHJldHVybiBcY3R5cGV7UHlfc3NpemVfdH0uICBDb2RlIGluIGV4dGVuc2lvbiBtb2R1bGVzCittYXkgdGhlcmVmb3JlIG5lZWQgdG8gaGF2ZSBzb21lIHZhcmlhYmxlcyBjaGFuZ2VkIHRvCitcY3R5cGV7UHlfc3NpemVfdH0uICAKKworVGhlIFxjZnVuY3Rpb257UHlBcmdfUGFyc2VUdXBsZSgpfSBhbmQgXGNmdW5jdGlvbntQeV9CdWlsZFZhbHVlKCl9IGZ1bmN0aW9ucworaGF2ZSBhIG5ldyBjb252ZXJzaW9uIGNvZGUsIFxzYW1we259LCBmb3IgXGN0eXBle1B5X3NzaXplX3R9LiAgCitcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX0ncyBcc2FtcHtzXCN9IGFuZCBcc2FtcHt0XCN9IHN0aWxsIG91dHB1dAorXGN0eXBle2ludH0gYnkgZGVmYXVsdCwgYnV0IHlvdSBjYW4gZGVmaW5lIHRoZSBtYWNybyAKK1xjc2ltcGxlbWFjcm97UFlfU1NJWkVfVF9DTEVBTn0gYmVmb3JlIGluY2x1ZGluZyBcZmlsZXtQeXRob24uaH0gCit0byBtYWtlIHRoZW0gcmV0dXJuIFxjdHlwZXtQeV9zc2l6ZV90fS4KKworXHBlcHszNTN9IGhhcyBhIHNlY3Rpb24gb24gY29udmVyc2lvbiBndWlkZWxpbmVzIHRoYXQgCitleHRlbnNpb24gYXV0aG9ycyBzaG91bGQgcmVhZCB0byBsZWFybiBhYm91dCBzdXBwb3J0aW5nIDY0LWJpdAorcGxhdGZvcm1zLgorCitcYmVnaW57c2VlYWxzb30KKworXHNlZXBlcHszNTN9e1VzaW5nIHNzaXplX3QgYXMgdGhlIGluZGV4IHR5cGV9e1BFUCB3cml0dGVuIGFuZCBpbXBsZW1lbnRlZCBieSBNYXJ0aW4gdm9ufkxcIm93aXMufQogCiBcZW5ke3NlZWFsc299CiAKQEAgLTQzNyw3ICsxMDIxLDQ3IEBACiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogXHNlY3Rpb257UEVQIDM1NzogVGhlICdfX2luZGV4X18nIG1ldGhvZH0KIAotJSBYWFggd3JpdGUgdGhpcworVGhlIE51bVB5IGRldmVsb3BlcnMgaGFkIGEgcHJvYmxlbSB0aGF0IGNvdWxkIG9ubHkgYmUgc29sdmVkIGJ5IGFkZGluZworYSBuZXcgc3BlY2lhbCBtZXRob2QsIFxtZXRob2R7X19pbmRleF9ffS4gIFdoZW4gdXNpbmcgc2xpY2Ugbm90YXRpb24sCithcyBpbiBcY29kZXtbXHZhcntzdGFydH06XHZhcntzdG9wfTpcdmFye3N0ZXB9XX0sIHRoZSB2YWx1ZXMgb2YgdGhlCitcdmFye3N0YXJ0fSwgXHZhcntzdG9wfSwgYW5kIFx2YXJ7c3RlcH0gaW5kZXhlcyBtdXN0IGFsbCBiZSBlaXRoZXIKK2ludGVnZXJzIG9yIGxvbmcgaW50ZWdlcnMuICBOdW1QeSBkZWZpbmVzIGEgdmFyaWV0eSBvZiBzcGVjaWFsaXplZAoraW50ZWdlciB0eXBlcyBjb3JyZXNwb25kaW5nIHRvIHVuc2lnbmVkIGFuZCBzaWduZWQgaW50ZWdlcnMgb2YgOCwgMTYsCiszMiwgYW5kIDY0IGJpdHMsIGJ1dCB0aGVyZSB3YXMgbm8gd2F5IHRvIHNpZ25hbCB0aGF0IHRoZXNlIHR5cGVzIGNvdWxkCitiZSB1c2VkIGFzIHNsaWNlIGluZGV4ZXMuCisKK1NsaWNpbmcgY2FuJ3QganVzdCB1c2UgdGhlIGV4aXN0aW5nIFxtZXRob2R7X19pbnRfX30gbWV0aG9kIGJlY2F1c2UKK3RoYXQgbWV0aG9kIGlzIGFsc28gdXNlZCB0byBpbXBsZW1lbnQgY29lcmNpb24gdG8gaW50ZWdlcnMuICBJZgorc2xpY2luZyB1c2VkIFxtZXRob2R7X19pbnRfX30sIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgd291bGQgYWxzbworYmVjb21lIGxlZ2FsIHNsaWNlIGluZGV4ZXMgYW5kIHRoYXQncyBjbGVhcmx5IGFuIHVuZGVzaXJhYmxlCitiZWhhdmlvdXIuCisKK0luc3RlYWQsIGEgbmV3IHNwZWNpYWwgbWV0aG9kIGNhbGxlZCBcbWV0aG9ke19faW5kZXhfX30gd2FzIGFkZGVkLiAgSXQKK3Rha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhbiBpbnRlZ2VyIGdpdmluZyB0aGUgc2xpY2UgaW5kZXggdG8KK3VzZS4gIEZvciBleGFtcGxlOgorCitcYmVnaW57dmVyYmF0aW19CitjbGFzcyBDOgorICAgIGRlZiBfX2luZGV4X18gKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSAgCitcZW5ke3ZlcmJhdGltfQorCitUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgZWl0aGVyIGEgUHl0aG9uIGludGVnZXIgb3IgbG9uZyBpbnRlZ2VyLgorVGhlIGludGVycHJldGVyIHdpbGwgY2hlY2sgdGhhdCB0aGUgdHlwZSByZXR1cm5lZCBpcyBjb3JyZWN0LCBhbmQKK3JhaXNlcyBhIFxleGNlcHRpb257VHlwZUVycm9yfSBpZiB0aGlzIHJlcXVpcmVtZW50IGlzbid0IG1ldC4KKworQSBjb3JyZXNwb25kaW5nIFxtZW1iZXJ7bmJfaW5kZXh9IHNsb3Qgd2FzIGFkZGVkIHRvIHRoZSBDLWxldmVsCitcY3R5cGV7UHlOdW1iZXJNZXRob2RzfSBzdHJ1Y3R1cmUgdG8gbGV0IEMgZXh0ZW5zaW9ucyBpbXBsZW1lbnQgdGhpcworcHJvdG9jb2wuICBcY2Z1bmN0aW9ue1B5TnVtYmVyX0luZGV4KFx2YXJ7b2JqfSl9IGNhbiBiZSB1c2VkIGluCitleHRlbnNpb24gY29kZSB0byBjYWxsIHRoZSBcbWV0aG9ke19faW5kZXhfX30gZnVuY3Rpb24gYW5kIHJldHJpZXZlCitpdHMgcmVzdWx0LgorCitcYmVnaW57c2VlYWxzb30KKworXHNlZXBlcHszNTd9e0FsbG93aW5nIEFueSBPYmplY3QgdG8gYmUgVXNlZCBmb3IgU2xpY2luZ317UEVQIHdyaXR0ZW4gCithbmQgaW1wbGVtZW50ZWQgYnkgVHJhdmlzIE9saXBoYW50Ln0KKworXGVuZHtzZWVhbHNvfQogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00NDgsMTAgKzEwNzIsMjkgQEAKIAogXGJlZ2lue2l0ZW1pemV9CiAKK1xpdGVtIFRoZSBcY2xhc3N7ZGljdH0gdHlwZSBoYXMgYSBuZXcgaG9vayBmb3IgbGV0dGluZyBzdWJjbGFzc2VzCitwcm92aWRlIGEgZGVmYXVsdCB2YWx1ZSB3aGVuIGEga2V5IGlzbid0IGNvbnRhaW5lZCBpbiB0aGUgZGljdGlvbmFyeS4KK1doZW4gYSBrZXkgaXNuJ3QgZm91bmQsIHRoZSBkaWN0aW9uYXJ5J3MKK1xtZXRob2R7X19taXNzaW5nX18oXHZhcntrZXl9KX0KK21ldGhvZCB3aWxsIGJlIGNhbGxlZC4gIFRoaXMgaG9vayBpcyB1c2VkIHRvIGltcGxlbWVudAordGhlIG5ldyBcY2xhc3N7ZGVmYXVsdGRpY3R9IGNsYXNzIGluIHRoZSBcbW9kdWxle2NvbGxlY3Rpb25zfQorbW9kdWxlLiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlZmluZXMgYSBkaWN0aW9uYXJ5IAordGhhdCByZXR1cm5zIHplcm8gZm9yIGFueSBtaXNzaW5nIGtleToKKworXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgemVyb2RpY3QgKGRpY3QpOgorICAgIGRlZiBfX21pc3NpbmdfXyAoc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIDAKKworZCA9IHplcm9kaWN0KHsxOjEsIDI6Mn0pCitwcmludCBkWzFdLCBkWzJdICAgIyBQcmludHMgMSwgMgorcHJpbnQgZFszXSwgZFs0XSAgICMgUHJpbnRzIDAsIDAKK1xlbmR7dmVyYmF0aW19CisKIFxpdGVtIFRoZSBcZnVuY3Rpb257bWluKCl9IGFuZCBcZnVuY3Rpb257bWF4KCl9IGJ1aWx0LWluIGZ1bmN0aW9ucwogZ2FpbmVkIGEgXGNvZGV7a2V5fSBrZXl3b3JkIGFyZ3VtZW50IGFuYWxvZ291cyB0byB0aGUgXGNvZGV7a2V5fQotYXJndW1lbnQgZm9yIFxtZXRob2R7c29ydCgpfS4gIFRoaXMgYXJndW1lbnQgc3VwcGxpZXMgYSBmdW5jdGlvbgotdGhhdCB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCBhbmQgaXMgY2FsbGVkIGZvciBldmVyeSB2YWx1ZSBpbiB0aGUgbGlzdDsgCithcmd1bWVudCBmb3IgXG1ldGhvZHtzb3J0KCl9LiAgVGhpcyBhcmd1bWVudCBzdXBwbGllcyBhIGZ1bmN0aW9uIHRoYXQKK3Rha2VzIGEgc2luZ2xlIGFyZ3VtZW50IGFuZCBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHZhbHVlIGluIHRoZSBsaXN0OwogXGZ1bmN0aW9ue21pbigpfS9cZnVuY3Rpb257bWF4KCl9IHdpbGwgcmV0dXJuIHRoZSBlbGVtZW50IHdpdGggdGhlIAogc21hbGxlc3QvbGFyZ2VzdCByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIGZ1bmN0aW9uLgogRm9yIGV4YW1wbGUsIHRvIGZpbmQgdGhlIGxvbmdlc3Qgc3RyaW5nIGluIGEgbGlzdCwgeW91IGNhbiBkbzoKQEAgLTQ1OSw3ICsxMTAyLDcgQEAKIFxiZWdpbnt2ZXJiYXRpbX0KIEwgPSBbJ21lZGl1bScsICdsb25nZXN0JywgJ3Nob3J0J10KICMgUHJpbnRzICdsb25nZXN0JwotcHJpbnQgbWF4KEwsIGtleT1sZW4pCQkgICAKK3ByaW50IG1heChMLCBrZXk9bGVuKSAgICAgICAgICAgICAgCiAjIFByaW50cyAnc2hvcnQnLCBiZWNhdXNlIGxleGljb2dyYXBoaWNhbGx5ICdzaG9ydCcgaGFzIHRoZSBsYXJnZXN0IHZhbHVlCiBwcmludCBtYXgoTCkgICAgICAgICAKIFxlbmR7dmVyYmF0aW19CkBAIC00NzIsOSArMTExNSwxOCBAQAogcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yIGlzIHRydWU7IG90aGVyd2lzZSBpdCB3aWxsIHJldHVybgogXGNvbnN0YW50e0ZhbHNlfS4gIFxmdW5jdGlvbnthbGwoKX0gcmV0dXJucyBcY29uc3RhbnR7VHJ1ZX0gb25seSBpZgogYWxsIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yIGV2YWx1YXRlIGFzIGJlaW5nIHRydWUuCisoU3VnZ2VzdGVkIGJ5IEd2UiwgYW5kIGltcGxlbWVudGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKIAotJSBYWFggd2hvIGFkZGVkPworXGl0ZW0gQVNDSUkgaXMgbm93IHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciBtb2R1bGVzLiAgSXQncyBub3cgCithIHN5bnRheCBlcnJvciBpZiBhIG1vZHVsZSBjb250YWlucyBzdHJpbmcgbGl0ZXJhbHMgd2l0aCA4LWJpdAorY2hhcmFjdGVycyBidXQgZG9lc24ndCBoYXZlIGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uLiAgSW4gUHl0aG9uIDIuNAordGhpcyB0cmlnZ2VyZWQgYSB3YXJuaW5nLCBub3QgYSBzeW50YXggZXJyb3IuICBTZWUgXHBlcHsyNjN9IAorZm9yIGhvdyB0byBkZWNsYXJlIGEgbW9kdWxlJ3MgZW5jb2Rpbmc7IGZvciBleGFtcGxlLCB5b3UgbWlnaHQgYWRkIAorYSBsaW5lIGxpa2UgdGhpcyBuZWFyIHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBmaWxlOgogCitcYmVnaW57dmVyYmF0aW19CisjIC0qLSBjb2Rpbmc6IGxhdGluMSAtKi0KK1xlbmR7dmVyYmF0aW19CiAKIFxpdGVtIFRoZSBsaXN0IG9mIGJhc2UgY2xhc3NlcyBpbiBhIGNsYXNzIGRlZmluaXRpb24gY2FuIG5vdyBiZSBlbXB0eS4gIAogQXMgYW4gZXhhbXBsZSwgdGhpcyBpcyBub3cgbGVnYWw6CkBAIC00ODksNiArMTE0MSwyNCBAQAogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Citcc3Vic2VjdGlvbntJbnRlcmFjdGl2ZSBJbnRlcnByZXRlciBDaGFuZ2VzfQorCitJbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIsIFxjb2Rle3F1aXR9IGFuZCBcY29kZXtleGl0fSAKK2hhdmUgbG9uZyBiZWVuIHN0cmluZ3Mgc28gdGhhdCBuZXcgdXNlcnMgZ2V0IGEgc29tZXdoYXQgaGVscGZ1bCBtZXNzYWdlCit3aGVuIHRoZXkgdHJ5IHRvIHF1aXQ6CisKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBxdWl0CisnVXNlIEN0cmwtRCAoaS5lLiBFT0YpIHRvIGV4aXQuJworXGVuZHt2ZXJiYXRpbX0KKworSW4gUHl0aG9uIDIuNSwgXGNvZGV7cXVpdH0gYW5kIFxjb2Rle2V4aXR9IGFyZSBub3cgb2JqZWN0cyB0aGF0IHN0aWxsCitwcm9kdWNlIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgdGhlbXNlbHZlcywgYnV0IGFyZSBhbHNvIGNhbGxhYmxlLgorTmV3YmllcyB3aG8gdHJ5IFxjb2Rle3F1aXQoKX0gb3IgXGNvZGV7ZXhpdCgpfSB3aWxsIG5vdyBleGl0IHRoZQoraW50ZXJwcmV0ZXIgYXMgdGhleSBleHBlY3QuICAoSW1wbGVtZW50ZWQgYnkgR2VvcmcgQnJhbmRsLikKKworCislPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogXHN1YnNlY3Rpb257T3B0aW1pemF0aW9uc30KIAogXGJlZ2lue2l0ZW1pemV9CkBAIC01MDAsNDMgKzExNzAsMTM1IEBACiBhbmQgYXMgYSByZXN1bHQgc2V0cyB3aWxsIHVzZSBhIHRoaXJkIGxlc3MgbWVtb3J5IGFuZCBhcmUgc29tZXdoYXQgZmFzdGVyLgogKEltcGxlbWVudGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKIAorXGl0ZW0gVGhlIHBlcmZvcm1hbmNlIG9mIHNvbWUgVW5pY29kZSBvcGVyYXRpb25zLCBzdWNoIGFzIAorY2hhcmFjdGVyIG1hcCBkZWNvZGluZywgaGFzIGJlZW4gaW1wcm92ZWQuCislIFBhdGNoIDEzMTM5MzkKKworXGl0ZW0gVGhlIGNvZGUgZ2VuZXJhdG9yJ3MgcGVlcGhvbGUgb3B0aW1pemVyIG5vdyBwZXJmb3Jtcworc2ltcGxlIGNvbnN0YW50IGZvbGRpbmcgaW4gZXhwcmVzc2lvbnMuICBJZiB5b3Ugd3JpdGUgc29tZXRoaW5nIGxpa2UKK1xjb2Rle2EgPSAyKzN9LCB0aGUgY29kZSBnZW5lcmF0b3Igd2lsbCBkbyB0aGUgYXJpdGhtZXRpYyBhbmQgcHJvZHVjZQorY29kZSBjb3JyZXNwb25kaW5nIHRvIFxjb2Rle2EgPSA1fS4KKwogXGVuZHtpdGVtaXplfQogCiBUaGUgbmV0IHJlc3VsdCBvZiB0aGUgMi41IG9wdGltaXphdGlvbnMgaXMgdGhhdCBQeXRob24gMi41IHJ1bnMgdGhlCi1weXN0b25lIGJlbmNobWFyayBhcm91bmQgWFhcJSBmYXN0ZXIgdGhhbiBQeXRob24gMi40LgorcHlzdG9uZSBiZW5jaG1hcmsgYXJvdW5kIFhYWFwlIGZhc3RlciB0aGFuIFB5dGhvbiAyLjQuCiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue05ldywgSW1wcm92ZWQsIGFuZCBEZXByZWNhdGVkIE1vZHVsZXN9CiAKLUFzIHVzdWFsLCBQeXRob24ncyBzdGFuZGFyZCBsaWJyYXJ5IHJlY2VpdmVkIGEgbnVtYmVyIG9mIGVuaGFuY2VtZW50cyBhbmQKLWJ1ZyBmaXhlcy4gIEhlcmUncyBhIHBhcnRpYWwgbGlzdCBvZiB0aGUgbW9zdCBub3RhYmxlIGNoYW5nZXMsIHNvcnRlZAotYWxwaGFiZXRpY2FsbHkgYnkgbW9kdWxlIG5hbWUuIENvbnN1bHQgdGhlCi1cZmlsZXtNaXNjL05FV1N9IGZpbGUgaW4gdGhlIHNvdXJjZSB0cmVlIGZvciBhIG1vcmUKLWNvbXBsZXRlIGxpc3Qgb2YgY2hhbmdlcywgb3IgbG9vayB0aHJvdWdoIHRoZSBTVk4gbG9ncyBmb3IgYWxsIHRoZQotZGV0YWlscy4KK1RoZSBzdGFuZGFyZCBsaWJyYXJ5IHJlY2VpdmVkIG1hbnkgZW5oYW5jZW1lbnRzIGFuZCBidWcgZml4ZXMgaW4KK1B5dGhvbiAyLjUuICBIZXJlJ3MgYSBwYXJ0aWFsIGxpc3Qgb2YgdGhlIG1vc3Qgbm90YWJsZSBjaGFuZ2VzLCBzb3J0ZWQKK2FscGhhYmV0aWNhbGx5IGJ5IG1vZHVsZSBuYW1lLiBDb25zdWx0IHRoZSBcZmlsZXtNaXNjL05FV1N9IGZpbGUgaW4KK3RoZSBzb3VyY2UgdHJlZSBmb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3Qgb2YgY2hhbmdlcywgb3IgbG9vayB0aHJvdWdoCit0aGUgU1ZOIGxvZ3MgZm9yIGFsbCB0aGUgZGV0YWlscy4KIAogXGJlZ2lue2l0ZW1pemV9CiAKLSUgY3R5cGVzIGFkZGVkCi0KLSUgY29sbGVjdGlvbnMuZGVxdWUgbm93IGhhcyAucmVtb3ZlKCkKLQogJSB0aGUgY1BpY2tsZSBtb2R1bGUgbm8gbG9uZ2VyIGFjY2VwdHMgdGhlIGRlcHJlY2F0ZWQgTm9uZSBvcHRpb24gaW4gdGhlCiAlIGFyZ3MgdHVwbGUgcmV0dXJuZWQgYnkgX19yZWR1Y2VfXygpLgogCi0lIGNzdiBtb2R1bGUgaW1wcm92ZW1lbnRzCitcaXRlbSBUaGUgXG1vZHVsZXthdWRpb29wfSBtb2R1bGUgbm93IHN1cHBvcnRzIHRoZSBhLUxBVyBlbmNvZGluZywKK2FuZCB0aGUgY29kZSBmb3IgdS1MQVcgZW5jb2RpbmcgaGFzIGJlZW4gaW1wcm92ZWQuICAoQ29udHJpYnV0ZWQgYnkKK0xhcnMgSW1taXNjaC4pCiAKLSUgZGF0ZXRpbWUuZGF0ZXRpbWUoKSBub3cgaGFzIGEgc3RycHRpbWUgY2xhc3MgbWV0aG9kIHdoaWNoIGNhbiBiZSB1c2VkIHRvCi0lIGNyZWF0ZSBkYXRldGltZSBvYmplY3QgdXNpbmcgYSBzdHJpbmcgYW5kIGZvcm1hdC4KK1xpdGVtIFRoZSBcbW9kdWxle2NvbGxlY3Rpb25zfSBtb2R1bGUgZ2FpbmVkIGEgbmV3IHR5cGUsCitcY2xhc3N7ZGVmYXVsdGRpY3R9LCB0aGF0IHN1YmNsYXNzZXMgdGhlIHN0YW5kYXJkIFxjbGFzc3tkaWN0fQordHlwZS4gIFRoZSBuZXcgdHlwZSBtb3N0bHkgYmVoYXZlcyBsaWtlIGEgZGljdGlvbmFyeSBidXQgY29uc3RydWN0cyBhCitkZWZhdWx0IHZhbHVlIHdoZW4gYSBrZXkgaXNuJ3QgcHJlc2VudCwgYXV0b21hdGljYWxseSBhZGRpbmcgaXQgdG8gdGhlCitkaWN0aW9uYXJ5IGZvciB0aGUgcmVxdWVzdGVkIGtleSB2YWx1ZS4KIAotXGl0ZW0gQSBuZXcgXG1vZHVsZXtoYXNobGlifSBtb2R1bGUgaGFzIGJlZW4gYWRkZWQgdG8gcmVwbGFjZSB0aGUKLVxtb2R1bGV7bWQ1fSBhbmQgXG1vZHVsZXtzaGF9IG1vZHVsZXMuICBcbW9kdWxle2hhc2hsaWJ9IGFkZHMgc3VwcG9ydAotZm9yIGFkZGl0aW9uYWwgc2VjdXJlIGhhc2hlcyAoU0hBLTIyNCwgU0hBLTI1NiwgU0hBLTM4NCwgYW5kIFNIQS01MTIpLgotV2hlbiBhdmFpbGFibGUsIHRoZSBtb2R1bGUgdXNlcyBPcGVuU1NMIGZvciBmYXN0IHBsYXRmb3JtIG9wdGltaXplZAotaW1wbGVtZW50YXRpb25zIG9mIGFsZ29yaXRobXMuICBUaGUgb2xkIFxtb2R1bGV7bWQ1fSBhbmQgXG1vZHVsZXtzaGF9Ci1tb2R1bGVzIHN0aWxsIGV4aXN0IGFzIHdyYXBwZXJzIGFyb3VuZCBoYXNobGliIHRvIHByZXNlcnZlIGJhY2t3YXJkcwotY29tcGF0aWJpbGl0eS4gIChDb250cmlidXRlZCBieSBHcmVnb3J5IFAuIFNtaXRoLikKK1RoZSBmaXJzdCBhcmd1bWVudCB0byBcY2xhc3N7ZGVmYXVsdGRpY3R9J3MgY29uc3RydWN0b3IgaXMgYSBmYWN0b3J5CitmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHdoZW5ldmVyIGEga2V5IGlzIHJlcXVlc3RlZCBidXQgbm90IGZvdW5kLgorVGhpcyBmYWN0b3J5IGZ1bmN0aW9uIHJlY2VpdmVzIG5vIGFyZ3VtZW50cywgc28geW91IGNhbiB1c2UgYnVpbHQtaW4KK3R5cGUgY29uc3RydWN0b3JzIHN1Y2ggYXMgXGZ1bmN0aW9ue2xpc3QoKX0gb3IgXGZ1bmN0aW9ue2ludCgpfS4gIEZvcgorZXhhbXBsZSwgCit5b3UgY2FuIG1ha2UgYW4gaW5kZXggb2Ygd29yZHMgYmFzZWQgb24gdGhlaXIgaW5pdGlhbCBsZXR0ZXIgbGlrZSB0aGlzOgorCitcYmVnaW57dmVyYmF0aW19Cit3b3JkcyA9ICIiIk5lbCBtZXp6byBkZWwgY2FtbWluIGRpIG5vc3RyYSB2aXRhCittaSByaXRyb3ZhaSBwZXIgdW5hIHNlbHZhIG9zY3VyYQorY2hlIGxhIGRpcml0dGEgdmlhIGVyYSBzbWFycml0YSIiIi5sb3dlcigpLnNwbGl0KCkKKworaW5kZXggPSBkZWZhdWx0ZGljdChsaXN0KQorCitmb3IgdyBpbiB3b3JkczoKKyAgICBpbml0X2xldHRlciA9IHdbMF0KKyAgICBpbmRleFtpbml0X2xldHRlcl0uYXBwZW5kKHcpCitcZW5ke3ZlcmJhdGltfQorCitQcmludGluZyBcY29kZXtpbmRleH0gcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nIG91dHB1dDoKKworXGJlZ2lue3ZlcmJhdGltfQorZGVmYXVsdGRpY3QoPHR5cGUgJ2xpc3QnPiwgeydjJzogWydjYW1taW4nLCAnY2hlJ10sICdlJzogWydlcmEnXSwgCisgICAgICAgICdkJzogWydkZWwnLCAnZGknLCAnZGlyaXR0YSddLCAnbSc6IFsnbWV6em8nLCAnbWknXSwgCisgICAgICAgICdsJzogWydsYSddLCAnbyc6IFsnb3NjdXJhJ10sICduJzogWyduZWwnLCAnbm9zdHJhJ10sIAorICAgICAgICAncCc6IFsncGVyJ10sICdzJzogWydzZWx2YScsICdzbWFycml0YSddLCAKKyAgICAgICAgJ3InOiBbJ3JpdHJvdmFpJ10sICd1JzogWyd1bmEnXSwgJ3YnOiBbJ3ZpdGEnLCAndmlhJ119CitcZW5ke3ZlcmJhdGltfQorCitUaGUgXGNsYXNze2RlcXVlfSBkb3VibGUtZW5kZWQgcXVldWUgdHlwZSBzdXBwbGllZCBieSB0aGUKK1xtb2R1bGV7Y29sbGVjdGlvbnN9IG1vZHVsZSBub3cgaGFzIGEgXG1ldGhvZHtyZW1vdmUoXHZhcnt2YWx1ZX0pfQorbWV0aG9kIHRoYXQgcmVtb3ZlcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBcdmFye3ZhbHVlfSBpbiB0aGUgcXVldWUsCityYWlzaW5nIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaWYgdGhlIHZhbHVlIGlzbid0IGZvdW5kLgorCitcaXRlbSBOZXcgbW9kdWxlOiBUaGUgXG1vZHVsZXtjb250ZXh0bGlifSBtb2R1bGUgY29udGFpbnMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdXNlIAord2l0aCB0aGUgbmV3IFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudC4gIFNlZQorc2VjdGlvbn5ccmVme21vZHVsZS1jb250ZXh0bGlifSBmb3IgbW9yZSBhYm91dCB0aGlzIG1vZHVsZS4KKyhDb250cmlidXRlZCBieSBQaGlsbGlwIEouIEVieS4pCisKK1xpdGVtIE5ldyBtb2R1bGU6IFRoZSBcbW9kdWxle2NQcm9maWxlfSBtb2R1bGUgaXMgYSBDIGltcGxlbWVudGF0aW9uIG9mIAordGhlIGV4aXN0aW5nIFxtb2R1bGV7cHJvZmlsZX0gbW9kdWxlIHRoYXQgaGFzIG11Y2ggbG93ZXIgb3ZlcmhlYWQuCitUaGUgbW9kdWxlJ3MgaW50ZXJmYWNlIGlzIHRoZSBzYW1lIGFzIFxtb2R1bGV7cHJvZmlsZX06IHlvdSBydW4KK1xjb2Rle2NQcm9maWxlLnJ1bignbWFpbigpJyl9IHRvIHByb2ZpbGUgYSBmdW5jdGlvbiwgY2FuIHNhdmUgcHJvZmlsZQorZGF0YSB0byBhIGZpbGUsIGV0Yy4gIEl0J3Mgbm90IHlldCBrbm93biBpZiB0aGUgSG90c2hvdCBwcm9maWxlciwKK3doaWNoIGlzIGFsc28gd3JpdHRlbiBpbiBDIGJ1dCBkb2Vzbid0IG1hdGNoIHRoZSBcbW9kdWxle3Byb2ZpbGV9Cittb2R1bGUncyBpbnRlcmZhY2UsIHdpbGwgY29udGludWUgdG8gYmUgbWFpbnRhaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMKK29mIFB5dGhvbi4gIChDb250cmlidXRlZCBieSBBcm1pbiBSaWdvLikKKworXGl0ZW0gVGhlIFxtb2R1bGV7Y3N2fSBtb2R1bGUsIHdoaWNoIHBhcnNlcyBmaWxlcyBpbgorY29tbWEtc2VwYXJhdGVkIHZhbHVlIGZvcm1hdCwgcmVjZWl2ZWQgc2V2ZXJhbCBlbmhhbmNlbWVudHMgYW5kIGEKK251bWJlciBvZiBidWdmaXhlcy4gIFlvdSBjYW4gbm93IHNldCB0aGUgbWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIGEKK2ZpZWxkIGJ5IGNhbGxpbmcgdGhlIFxtZXRob2R7Y3N2LmZpZWxkX3NpemVfbGltaXQoXHZhcntuZXdfbGltaXR9KX0KK2Z1bmN0aW9uOyBvbWl0dGluZyB0aGUgXHZhcntuZXdfbGltaXR9IGFyZ3VtZW50IHdpbGwgcmV0dXJuIHRoZQorY3VycmVudGx5LXNldCBsaW1pdC4gIFRoZSBcY2xhc3N7cmVhZGVyfSBjbGFzcyBub3cgaGFzIGEKK1xtZW1iZXJ7bGluZV9udW19IGF0dHJpYnV0ZSB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGxpbmVzCityZWFkIGZyb20gdGhlIHNvdXJjZTsgcmVjb3JkcyBjYW4gc3BhbiBtdWx0aXBsZSBwaHlzaWNhbCBsaW5lcywgc28KK1xtZW1iZXJ7bGluZV9udW19IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcmVhZC4KKyhDb250cmlidXRlZCBieSBTa2lwIE1vbnRhbmFybyBhbmQgQW5kcmV3IE1jTmFtYXJhLikKKworXGl0ZW0gVGhlIFxjbGFzc3tkYXRldGltZX0gY2xhc3MgaW4gdGhlIFxtb2R1bGV7ZGF0ZXRpbWV9IAorbW9kdWxlIG5vdyBoYXMgYSBcbWV0aG9ke3N0cnB0aW1lKFx2YXJ7c3RyaW5nfSwgXHZhcntmb3JtYXR9KX0gCittZXRob2QgZm9yIHBhcnNpbmcgZGF0ZSBzdHJpbmdzLCBjb250cmlidXRlZCBieSBKb3NoIFNwb2VycmkuCitJdCB1c2VzIHRoZSBzYW1lIGZvcm1hdCBjaGFyYWN0ZXJzIGFzIFxmdW5jdGlvbnt0aW1lLnN0cnB0aW1lKCl9IGFuZAorXGZ1bmN0aW9ue3RpbWUuc3RyZnRpbWUoKX06CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCisKK3RzID0gZGF0ZXRpbWUuc3RycHRpbWUoJzEwOjEzOjE1IDIwMDYtMDMtMDcnLAorICAgICAgICAgICAgICAgICAgICAgICAnJUg6JU06JVMgJVktJW0tJWQnKQorXGVuZHt2ZXJiYXRpbX0KKworXGl0ZW0gVGhlIFxtb2R1bGV7ZmlsZWlucHV0fSBtb2R1bGUgd2FzIG1hZGUgbW9yZSBmbGV4aWJsZS4KK1VuaWNvZGUgZmlsZW5hbWVzIGFyZSBub3cgc3VwcG9ydGVkLCBhbmQgYSBcdmFye21vZGV9IHBhcmFtZXRlciB0aGF0CitkZWZhdWx0cyB0byBcY29kZXsiciJ9IHdhcyBhZGRlZCB0byB0aGUKK1xmdW5jdGlvbntpbnB1dCgpfSBmdW5jdGlvbiB0byBhbGxvdyBvcGVuaW5nIGZpbGVzIGluIGJpbmFyeSBvcgordW5pdmVyc2FsLW5ld2xpbmUgbW9kZS4gIEFub3RoZXIgbmV3IHBhcmFtZXRlciwgXHZhcntvcGVuaG9va30sCitsZXRzIHlvdSB1c2UgYSBmdW5jdGlvbiBvdGhlciB0aGFuIFxmdW5jdGlvbntvcGVuKCl9IAordG8gb3BlbiB0aGUgaW5wdXQgZmlsZXMuICBPbmNlIHlvdSdyZSBpdGVyYXRpbmcgb3ZlciAKK3RoZSBzZXQgb2YgZmlsZXMsIHRoZSBcY2xhc3N7RmlsZUlucHV0fSBvYmplY3QncyBuZXcKK1xtZXRob2R7ZmlsZW5vKCl9IHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnRseSBvcGVuZWQgZmlsZS4KKyhDb250cmlidXRlZCBieSBHZW9yZyBCcmFuZGwuKQorCitcaXRlbSBJbiB0aGUgXG1vZHVsZXtnY30gbW9kdWxlLCB0aGUgbmV3IFxmdW5jdGlvbntnZXRfY291bnQoKX0gZnVuY3Rpb24KK3JldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBjb3VudHMgZm9yIHRoZQordGhyZWUgR0MgZ2VuZXJhdGlvbnMuICBUaGlzIGlzIGFjY291bnRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBnYXJiYWdlCitjb2xsZWN0b3I7IHdoZW4gdGhlc2UgY291bnRzIHJlYWNoIGEgc3BlY2lmaWVkIHRocmVzaG9sZCwgYSBnYXJiYWdlCitjb2xsZWN0aW9uIHN3ZWVwIHdpbGwgYmUgbWFkZS4gIFRoZSBleGlzdGluZyBcZnVuY3Rpb257Z2MuY29sbGVjdCgpfQorZnVuY3Rpb24gbm93IHRha2VzIGFuIG9wdGlvbmFsIFx2YXJ7Z2VuZXJhdGlvbn0gYXJndW1lbnQgb2YgMCwgMSwgb3IgMgordG8gc3BlY2lmeSB3aGljaCBnZW5lcmF0aW9uIHRvIGNvbGxlY3QuCiAKIFxpdGVtIFRoZSBcZnVuY3Rpb257bnNtYWxsZXN0KCl9IGFuZCAKIFxmdW5jdGlvbntubGFyZ2VzdCgpfSBmdW5jdGlvbnMgaW4gdGhlIFxtb2R1bGV7aGVhcHF9IG1vZHVsZSAKQEAgLTU2OCw2ICsxMzMwLDExIEBACiAKIChDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCiAKK1xpdGVtIFRoZSBcbW9kdWxle25pc30gbW9kdWxlIG5vdyBzdXBwb3J0cyBhY2Nlc3NpbmcgZG9tYWlucyBvdGhlcgordGhhbiB0aGUgc3lzdGVtIGRlZmF1bHQgZG9tYWluIGJ5IHN1cHBseWluZyBhIFx2YXJ7ZG9tYWlufSBhcmd1bWVudCB0bwordGhlIFxmdW5jdGlvbntuaXMubWF0Y2goKX0gYW5kIFxmdW5jdGlvbntuaXMubWFwcygpfSBmdW5jdGlvbnMuCisoQ29udHJpYnV0ZWQgYnkgQmVuIEJlbGwuKQorCiBcaXRlbSBUaGUgXG1vZHVsZXtvcGVyYXRvcn0gbW9kdWxlJ3MgXGZ1bmN0aW9ue2l0ZW1nZXR0ZXIoKX0gCiBhbmQgXGZ1bmN0aW9ue2F0dHJnZXR0ZXIoKX0gZnVuY3Rpb25zIG5vdyBzdXBwb3J0IG11bHRpcGxlIGZpZWxkcy4gIAogQSBjYWxsIHN1Y2ggYXMgXGNvZGV7b3BlcmF0b3IuYXR0cmdldHRlcignYScsICdiJyl9CkBAIC01NzUsMTEgKzEzNDIsMTAgQEAKIHRoYXQgcmV0cmlldmVzIHRoZSBcbWVtYmVye2F9IGFuZCBcbWVtYmVye2J9IGF0dHJpYnV0ZXMuICBDb21iaW5pbmcgCiB0aGlzIG5ldyBmZWF0dXJlIHdpdGggdGhlIFxtZXRob2R7c29ydCgpfSBtZXRob2QncyBcY29kZXtrZXl9IHBhcmFtZXRlciAKIGxldHMgeW91IGVhc2lseSBzb3J0IGxpc3RzIHVzaW5nIG11bHRpcGxlIGZpZWxkcy4KLQotJSBYWFggd2hvIGFkZGVkPworKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKIAogCi1caXRlbSBUaGUgXG1vZHVsZXtvc30gbW9kdWxlIHVuZGVyd2VudCBhIG51bWJlciBvZiBjaGFuZ2VzLiAgVGhlCitcaXRlbSBUaGUgXG1vZHVsZXtvc30gbW9kdWxlIHVuZGVyd2VudCBzZXZlcmFsIGNoYW5nZXMuICBUaGUKIFxtZW1iZXJ7c3RhdF9mbG9hdF90aW1lc30gdmFyaWFibGUgbm93IGRlZmF1bHRzIHRvIHRydWUsIG1lYW5pbmcgdGhhdAogXGZ1bmN0aW9ue29zLnN0YXQoKX0gd2lsbCBub3cgcmV0dXJuIHRpbWUgdmFsdWVzIGFzIGZsb2F0cy4gIChUaGlzCiBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCBcZnVuY3Rpb257b3Muc3RhdCgpfSB3aWxsIHJldHVybiB0aW1lcwpAQCAtNTkxLDExICsxMzU3LDM0IEBACiBcZnVuY3Rpb257b3MubHNlZWsoKX0gZnVuY3Rpb24uICBUd28gbmV3IGNvbnN0YW50cyBmb3IgbG9ja2luZyBhcmUKIFxtZW1iZXJ7b3MuT19TSExPQ0t9IGFuZCBcbWVtYmVye29zLk9fRVhMT0NLfS4KIAorVHdvIG5ldyBmdW5jdGlvbnMsIFxmdW5jdGlvbnt3YWl0MygpfSBhbmQgXGZ1bmN0aW9ue3dhaXQ0KCl9LCB3ZXJlCithZGRlZC4gIFRoZXkncmUgc2ltaWxhciB0aGUgXGZ1bmN0aW9ue3dhaXRwaWQoKX0gZnVuY3Rpb24gd2hpY2ggd2FpdHMKK2ZvciBhIGNoaWxkIHByb2Nlc3MgdG8gZXhpdCBhbmQgcmV0dXJucyBhIHR1cGxlIG9mIHRoZSBwcm9jZXNzIElEIGFuZAoraXRzIGV4aXQgc3RhdHVzLCBidXQgXGZ1bmN0aW9ue3dhaXQzKCl9IGFuZCBcZnVuY3Rpb257d2FpdDQoKX0gcmV0dXJuCithZGRpdGlvbmFsIGluZm9ybWF0aW9uLiAgXGZ1bmN0aW9ue3dhaXQzKCl9IGRvZXNuJ3QgdGFrZSBhIHByb2Nlc3MgSUQKK2FzIGlucHV0LCBzbyBpdCB3YWl0cyBmb3IgYW55IGNoaWxkIHByb2Nlc3MgdG8gZXhpdCBhbmQgcmV0dXJucyBhCiszLXR1cGxlIG9mIFx2YXJ7cHJvY2Vzcy1pZH0sIFx2YXJ7ZXhpdC1zdGF0dXN9LCBcdmFye3Jlc291cmNlLXVzYWdlfQorYXMgcmV0dXJuZWQgZnJvbSB0aGUgXGZ1bmN0aW9ue3Jlc291cmNlLmdldHJ1c2FnZSgpfSBmdW5jdGlvbi4KK1xmdW5jdGlvbnt3YWl0NChcdmFye3BpZH0pfSBkb2VzIHRha2UgYSBwcm9jZXNzIElELgorKENvbnRyaWJ1dGVkIGJ5IENoYWQgSi4gU2Nocm9lZGVyLikKKwogT24gRnJlZUJTRCwgdGhlIFxmdW5jdGlvbntvcy5zdGF0KCl9IGZ1bmN0aW9uIG5vdyByZXR1cm5zIAogdGltZXMgd2l0aCBuYW5vc2Vjb25kIHJlc29sdXRpb24sIGFuZCB0aGUgcmV0dXJuZWQgb2JqZWN0CiBub3cgaGFzIFxtZW1iZXJ7c3RfZ2VufSBhbmQgXG1lbWJlcntzdF9iaXJ0aHRpbWV9LgogVGhlIFxtZW1iZXJ7c3RfZmxhZ3N9IG1lbWJlciBpcyBhbHNvIGF2YWlsYWJsZSwgaWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIGl0LgotJSBYWFggcGF0Y2ggMTE4MDY5NSwgMTIxMjExNworKENvbnRyaWJ1dGVkIGJ5IEFudHRpIExvdWtvIGFuZCAgRGllZ28gUGV0dGVuXGBvLikKKyUgKFBhdGNoIDExODA2OTUsIDEyMTIxMTcpCisKK1xpdGVtIFRoZSBvbGQgXG1vZHVsZXtyZWdleH0gYW5kIFxtb2R1bGV7cmVnc3VifSBtb2R1bGVzLCB3aGljaCBoYXZlIGJlZW4gCitkZXByZWNhdGVkIGV2ZXIgc2luY2UgUHl0aG9uIDIuMCwgaGF2ZSBmaW5hbGx5IGJlZW4gZGVsZXRlZC4gIAorT3RoZXIgZGVsZXRlZCBtb2R1bGVzOiBcbW9kdWxle3N0YXRjYWNoZX0sIFxtb2R1bGV7dHpwYXJzZX0sCitcbW9kdWxle3docmFuZG9tfS4KKworXGl0ZW0gVGhlIFxmaWxle2xpYi1vbGR9IGRpcmVjdG9yeSwKK3doaWNoIGluY2x1ZGVzIGFuY2llbnQgbW9kdWxlcyBzdWNoIGFzIFxtb2R1bGV7ZGlyY21wfSBhbmQKK1xtb2R1bGV7bml9LCB3YXMgYWxzbyBkZWxldGVkLiAgXGZpbGV7bGliLW9sZH0gd2Fzbid0IG9uIHRoZSBkZWZhdWx0CitcY29kZXtzeXMucGF0aH0sIHNvIHVubGVzcyB5b3VyIHByb2dyYW1zIGV4cGxpY2l0bHkgYWRkZWQgdGhlIGRpcmVjdG9yeSB0byAKK1xjb2Rle3N5cy5wYXRofSwgdGhpcyByZW1vdmFsIHNob3VsZG4ndCBhZmZlY3QgeW91ciBjb2RlLgogCiBcaXRlbSBUaGUgXG1vZHVsZXtzb2NrZXR9IG1vZHVsZSBub3cgc3VwcG9ydHMgXGNvbnN0YW50e0FGX05FVExJTkt9CiBzb2NrZXRzIG9uIExpbnV4LCB0aGFua3MgdG8gYSBwYXRjaCBmcm9tIFBoaWxpcHBlIEJpb25kaS4gIApAQCAtNjA1LDkgKzEzOTQsMjYgQEAKIEluIFB5dGhvbiBjb2RlLCBuZXRsaW5rIGFkZHJlc3NlcyBhcmUgcmVwcmVzZW50ZWQgYXMgYSB0dXBsZSBvZiAyIGludGVnZXJzLCAKIFxjb2RleyhcdmFye3BpZH0sIFx2YXJ7Z3JvdXBfbWFza30pfS4KIAotXGl0ZW0gTmV3IG1vZHVsZTogXG1vZHVsZXtzcHdkfSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUKLXNoYWRvdyBwYXNzd29yZCBkYXRhYmFzZSBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBpdC4gIAotJSBYWFggZ2l2ZSBleGFtcGxlCitTb2NrZXQgb2JqZWN0cyBhbHNvIGdhaW5lZCBhY2Nlc3NvciBtZXRob2RzIFxtZXRob2R7Z2V0ZmFtaWx5KCl9LCAKK1xtZXRob2R7Z2V0dHlwZSgpfSwgYW5kIFxtZXRob2R7Z2V0cHJvdG8oKX0gbWV0aG9kcyB0byByZXRyaWV2ZSB0aGUKK2ZhbWlseSwgdHlwZSwgYW5kIHByb3RvY29sIHZhbHVlcyBmb3IgdGhlIHNvY2tldC4KKworXGl0ZW0gTmV3IG1vZHVsZTogdGhlIFxtb2R1bGV7c3B3ZH0gbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IKK2FjY2Vzc2luZyB0aGUgc2hhZG93IHBhc3N3b3JkIGRhdGFiYXNlIG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IAorc2hhZG93IHBhc3N3b3Jkcy4KKworXGl0ZW0gVGhlIFB5dGhvbiBkZXZlbG9wZXJzIHN3aXRjaGVkIGZyb20gQ1ZTIHRvIFN1YnZlcnNpb24gZHVyaW5nIHRoZSAyLjUKK2RldmVsb3BtZW50IHByb2Nlc3MuICBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhhY3QgYnVpbGQgdmVyc2lvbiBpcyAKK2F2YWlsYWJsZSBhcyB0aGUgXGNvZGV7c3lzLnN1YnZlcnNpb259IHZhcmlhYmxlLCBhIDMtdHVwbGUKK29mIFxjb2RleyhcdmFye2ludGVycHJldGVyLW5hbWV9LCBcdmFye2JyYW5jaC1uYW1lfSwgXHZhcntyZXZpc2lvbi1yYW5nZX0pfS4KK0ZvciBleGFtcGxlLCBhdCB0aGUgdGltZSBvZiB3cml0aW5nIAorbXkgY29weSBvZiAyLjUgd2FzIHJlcG9ydGluZyBcY29kZXsoJ0NQeXRob24nLCAndHJ1bmsnLCAnNDUzMTM6NDUzMTUnKX0uCisKK1RoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdG8gQyBleHRlbnNpb25zIHZpYSB0aGUgCitcY2Z1bmN0aW9ue1B5X0dldEJ1aWxkSW5mbygpfSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSAKK3N0cmluZyBvZiBidWlsZCBpbmZvcm1hdGlvbiBsaWtlIHRoaXM6CitcY29kZXsidHJ1bms6NDUzNTU6NDUzNTZNLCBBcHIgMTMgMjAwNiwgMDc6NDI6MTkifS4gIAorKENvbnRyaWJ1dGVkIGJ5IEJhcnJ5IFdhcnNhdy4pCiAKIFxpdGVtIFRoZSBcY2xhc3N7VGFyRmlsZX0gY2xhc3MgaW4gdGhlIFxtb2R1bGV7dGFyZmlsZX0gbW9kdWxlIG5vdyBoYXMKIGFuIFxtZXRob2R7ZXh0cmFjdGFsbCgpfSBtZXRob2QgdGhhdCBleHRyYWN0cyBhbGwgbWVtYmVycyBmcm9tIHRoZQpAQCAtNjI1LDE3ICsxNDMxLDI4IEBACiBieSBzb21lIHNwZWNpZmljYXRpb25zLCBzbyBpdCdzIHN0aWxsIGF2YWlsYWJsZSBhcyAKIFxtZW1iZXJ7dW5pY29kZWRhdGEuZGJfM18yXzB9LgogCi1caXRlbSBBIG5ldyBwYWNrYWdlIFxtb2R1bGV7eG1sLmV0cmVlfSBoYXMgYmVlbiBhZGRlZCwgd2hpY2ggY29udGFpbnMKLWEgc3Vic2V0IG9mIHRoZSBFbGVtZW50VHJlZSBYTUwgbGlicmFyeS4gIEF2YWlsYWJsZSBtb2R1bGVzIGFyZQotXG1vZHVsZXtFbGVtZW50VHJlZX0sIFxtb2R1bGV7RWxlbWVudFBhdGh9LCBhbmQKLVxtb2R1bGV7RWxlbWVudEluY2x1ZGV9LCBmcm9tIEVsZW1lbnRUcmVlIDEuMi42LiAoQ29udHJpYnV0ZWQgYnkKLUZyZWRyaWsgTHVuZGguKQorXGl0ZW0gVGhlIFxtb2R1bGV7d2ViYnJvd3Nlcn0gbW9kdWxlIHJlY2VpdmVkIGEgbnVtYmVyIG9mCitlbmhhbmNlbWVudHMuCitJdCdzIG5vdyB1c2FibGUgYXMgYSBzY3JpcHQgd2l0aCBcY29kZXtweXRob24gLW0gd2ViYnJvd3Nlcn0sIHRha2luZyBhCitVUkwgYXMgdGhlIGFyZ3VtZW50OyB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygc3dpdGNoZXMgCit0byBjb250cm9sIHRoZSBiZWhhdmlvdXIgKFxwcm9ncmFtb3B0ey1ufSBmb3IgYSBuZXcgYnJvd3NlciB3aW5kb3csIAorXHByb2dyYW1vcHR7LXR9IGZvciBhIG5ldyB0YWIpLiAgTmV3IG1vZHVsZS1sZXZlbCBmdW5jdGlvbnMsCitcZnVuY3Rpb257b3Blbl9uZXcoKX0gYW5kIFxmdW5jdGlvbntvcGVuX25ld190YWIoKX0sIHdlcmUgYWRkZWQgCit0byBzdXBwb3J0IHRoaXMuICBUaGUgbW9kdWxlJ3MgXGZ1bmN0aW9ue29wZW4oKX0gZnVuY3Rpb24gc3VwcG9ydHMgYW4KK2FkZGl0aW9uYWwgZmVhdHVyZSwgYW4gXHZhcnthdXRvcmFpc2V9IHBhcmFtZXRlciB0aGF0IHNpZ25hbHMgd2hldGhlcgordG8gcmFpc2UgdGhlIG9wZW4gd2luZG93IHdoZW4gcG9zc2libGUuIEEgbnVtYmVyIG9mIGFkZGl0aW9uYWwKK2Jyb3dzZXJzIHdlcmUgYWRkZWQgdG8gdGhlIHN1cHBvcnRlZCBsaXN0IHN1Y2ggYXMgRmlyZWZveCwgT3BlcmEsCitLb25xdWVyb3IsIGFuZCBlbGlua3MuICAoQ29udHJpYnV0ZWQgYnkgT2xlZyBCcm95dG1hbm4gYW5kIEdlb3JnZQorQnJhbmRsLikKKyUgUGF0Y2ggIzc1NDAyMgorCiAKIFxpdGVtIFRoZSBcbW9kdWxle3htbHJwY2xpYn0gbW9kdWxlIG5vdyBzdXBwb3J0cyByZXR1cm5pbmcgCiAgICAgICBcY2xhc3N7ZGF0ZXRpbWV9IG9iamVjdHMgZm9yIHRoZSBYTUwtUlBDIGRhdGUgdHlwZS4gIFN1cHBseSAKICAgICAgIFxjb2Rle3VzZV9kYXRldGltZT1UcnVlfSB0byB0aGUgXGZ1bmN0aW9ue2xvYWRzKCl9IGZ1bmN0aW9uCiAgICAgICBvciB0aGUgXGNsYXNze1VubWFyc2hhbGxlcn0gY2xhc3MgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZS4KLSUgWFhYIHBhdGNoIDExMjAzNTMKKyAgICAgIChDb250cmlidXRlZCBieSBTa2lwIE1vbnRhbmFyby4pCislIFBhdGNoIDExMjAzNTMKIAogCiBcZW5ke2l0ZW1pemV9CkBAIC02NDMsMTMgKzE0NjAsMzU4IEBACiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUgd2hvbGUgbmV3IG1vZHVsZXMgZ2V0IGRlc2NyaWJlZCBpbiBcc3Vic2VjdGlvbnMgaGVyZQorXHN1YnNlY3Rpb257VGhlIGN0eXBlcyBwYWNrYWdlfQogCi0lIFhYWCBuZXcgZGlzdHV0aWxzIGZlYXR1cmVzOiB1cGxvYWQKK1RoZSBcbW9kdWxle2N0eXBlc30gcGFja2FnZSwgd3JpdHRlbiBieSBUaG9tYXMgSGVsbGVyLCBoYXMgYmVlbiBhZGRlZCAKK3RvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiAgXG1vZHVsZXtjdHlwZXN9IGxldHMgeW91IGNhbGwgYXJiaXRyYXJ5IGZ1bmN0aW9ucyAKK2luIHNoYXJlZCBsaWJyYXJpZXMgb3IgRExMcy4gIExvbmctdGltZSB1c2VycyBtYXkgcmVtZW1iZXIgdGhlIFxtb2R1bGV7ZGx9IG1vZHVsZSwgd2hpY2ggCitwcm92aWRlcyBmdW5jdGlvbnMgZm9yIGxvYWRpbmcgc2hhcmVkIGxpYnJhcmllcyBhbmQgY2FsbGluZyBmdW5jdGlvbnMgaW4gdGhlbS4gIFRoZSBcbW9kdWxle2N0eXBlc30gcGFja2FnZSBpcyBtdWNoIGZhbmNpZXIuCiAKLSUgWFhYIHNob3VsZCBoYXNobGliIHBlcmhhcHMgYmUgZGVzY3JpYmVkIGhlcmUgaW5zdGVhZD8KLSUgWFhYIHNob3VsZCB4bWwuZXRyZWUgcGVyaGFwcyBiZSBkZXNjcmliZWQgaGVyZSBpbnN0ZWFkPworVG8gbG9hZCBhIHNoYXJlZCBsaWJyYXJ5IG9yIERMTCwgeW91IG11c3QgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSAKK1xjbGFzc3tDRExMfSBjbGFzcyBhbmQgcHJvdmlkZSB0aGUgbmFtZSBvciBwYXRoIG9mIHRoZSBzaGFyZWQgbGlicmFyeQorb3IgRExMLiAgT25jZSB0aGF0J3MgZG9uZSwgeW91IGNhbiBjYWxsIGFyYml0cmFyeSBmdW5jdGlvbnMKK2J5IGFjY2Vzc2luZyB0aGVtIGFzIGF0dHJpYnV0ZXMgb2YgdGhlIFxjbGFzc3tDRExMfSBvYmplY3QuICAKIAorXGJlZ2lue3ZlcmJhdGltfQoraW1wb3J0IGN0eXBlcworCitsaWJjID0gY3R5cGVzLkNETEwoJ2xpYmMuc28uNicpCityZXN1bHQgPSBsaWJjLnByaW50ZigiTGluZSBvZiBvdXRwdXRcbiIpCitcZW5ke3ZlcmJhdGltfQorCitUeXBlIGNvbnN0cnVjdG9ycyBmb3IgdGhlIHZhcmlvdXMgQyB0eXBlcyBhcmUgcHJvdmlkZWQ6IFxmdW5jdGlvbntjX2ludH0sCitcZnVuY3Rpb257Y19mbG9hdH0sIFxmdW5jdGlvbntjX2RvdWJsZX0sIFxmdW5jdGlvbntjX2NoYXJfcH0gKGVxdWl2YWxlbnQgdG8gXGN0eXBle2NoYXIgKn0pLCBhbmQgc28gZm9ydGguICBVbmxpa2UgUHl0aG9uJ3MgdHlwZXMsIHRoZSBDIHZlcnNpb25zIGFyZSBhbGwgbXV0YWJsZTsgeW91IGNhbiBhc3NpZ24gdG8gdGhlaXIgXG1lbWJlcnt2YWx1ZX0gYXR0cmlidXRlCit0byBjaGFuZ2UgdGhlIHdyYXBwZWQgdmFsdWUuICBQeXRob24gaW50ZWdlcnMgYW5kIHN0cmluZ3Mgd2lsbCBiZSBhdXRvbWF0aWNhbGx5Citjb252ZXJ0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQyB0eXBlcywgYnV0IGZvciBvdGhlciB0eXBlcyB5b3UgCittdXN0IGNhbGwgdGhlIGNvcnJlY3QgdHlwZSBjb25zdHJ1Y3Rvci4gIChBbmQgSSBtZWFuIFxlbXBoe211c3R9OyAKK2dldHRpbmcgaXQgd3Jvbmcgd2lsbCBvZnRlbiByZXN1bHQgaW4gdGhlIGludGVycHJldGVyIGNyYXNoaW5nIAord2l0aCBhIHNlZ21lbnRhdGlvbiBmYXVsdC4pCisKK1lvdSBzaG91bGRuJ3QgdXNlIFxmdW5jdGlvbntjX2NoYXJfcH0gd2l0aCBhIFB5dGhvbiBzdHJpbmcgd2hlbiB0aGUgQyBmdW5jdGlvbiB3aWxsIGJlIG1vZGlmeWluZyB0aGUgbWVtb3J5IGFyZWEsIGJlY2F1c2UgUHl0aG9uIHN0cmluZ3MgYXJlIAorc3VwcG9zZWQgdG8gYmUgaW1tdXRhYmxlOyBicmVha2luZyB0aGlzIHJ1bGUgd2lsbCBjYXVzZSBwdXp6bGluZyBidWdzLiAgV2hlbiB5b3UgbmVlZCBhIG1vZGlmaWFibGUgbWVtb3J5IGFyZWEsCit1c2UgXGZ1bmN0aW9ue2NyZWF0ZV9zdHJpbmdfYnVmZmVyKCl9OgorCitcYmVnaW57dmVyYmF0aW19CitzID0gInRoaXMgaXMgYSBzdHJpbmciCitidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIocykKK2xpYmMuc3RyZnJ5KGJ1ZikKK1xlbmR7dmVyYmF0aW19CisKK0MgZnVuY3Rpb25zIGFyZSBhc3N1bWVkIHRvIHJldHVybiBpbnRlZ2VycywgYnV0IHlvdSBjYW4gc2V0Cit0aGUgXG1lbWJlcntyZXN0eXBlfSBhdHRyaWJ1dGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCB0byAKK2NoYW5nZSB0aGlzOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gbGliYy5hdG9mKCcyLjcxODI4JykKKy0xNzgzOTU3NjE2Cis+Pj4gbGliYy5hdG9mLnJlc3R5cGUgPSBjdHlwZXMuY19kb3VibGUKKz4+PiBsaWJjLmF0b2YoJzIuNzE4MjgnKQorMi43MTgyOAorXGVuZHt2ZXJiYXRpbX0KKworXG1vZHVsZXtjdHlwZXN9IGFsc28gcHJvdmlkZXMgYSB3cmFwcGVyIGZvciBQeXRob24ncyBDIEFQSSAKK2FzIHRoZSBcY29kZXtjdHlwZXMucHl0aG9uYXBpfSBvYmplY3QuICBUaGlzIG9iamVjdCBkb2VzIFxlbXBoe25vdH0gCityZWxlYXNlIHRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jayBiZWZvcmUgY2FsbGluZyBhIGZ1bmN0aW9uLCBiZWNhdXNlIHRoZSBsb2NrIG11c3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcgaW50byB0aGUgaW50ZXJwcmV0ZXIncyBjb2RlLiAgCitUaGVyZSdzIGEgXGNsYXNze3B5X29iamVjdCgpfSB0eXBlIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBjcmVhdGUgYSAKK1xjdHlwZXtQeU9iamVjdCAqfSBwb2ludGVyLiAgQSBzaW1wbGUgdXNhZ2U6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ltcG9ydCBjdHlwZXMKKworZCA9IHt9CitjdHlwZXMucHl0aG9uYXBpLlB5T2JqZWN0X1NldEl0ZW0oY3R5cGVzLnB5X29iamVjdChkKSwKKyAgICAgICAgICBjdHlwZXMucHlfb2JqZWN0KCJhYmMiKSwgIGN0eXBlcy5weV9vYmplY3QoMSkpCisjIGQgaXMgbm93IHsnYWJjJywgMX0uCitcZW5ke3ZlcmJhdGltfQorCitEb24ndCBmb3JnZXQgdG8gdXNlIFxjbGFzc3tweV9vYmplY3QoKX07IGlmIGl0J3Mgb21pdHRlZCB5b3UgZW5kIAordXAgd2l0aCBhIHNlZ21lbnRhdGlvbiBmYXVsdC4KKworXG1vZHVsZXtjdHlwZXN9IGhhcyBiZWVuIGFyb3VuZCBmb3IgYSB3aGlsZSwgYnV0IHBlb3BsZSBzdGlsbCB3cml0ZSAKK2FuZCBkaXN0cmlidXRpb24gaGFuZC1jb2RlZCBleHRlbnNpb24gbW9kdWxlcyBiZWNhdXNlIHlvdSBjYW4ndCByZWx5IG9uIFxtb2R1bGV7Y3R5cGVzfSBiZWluZyBwcmVzZW50LgorUGVyaGFwcyBkZXZlbG9wZXJzIHdpbGwgYmVnaW4gdG8gd3JpdGUgCitQeXRob24gd3JhcHBlcnMgYXRvcCBhIGxpYnJhcnkgYWNjZXNzZWQgdGhyb3VnaCBcbW9kdWxle2N0eXBlc30gaW5zdGVhZAorb2YgZXh0ZW5zaW9uIG1vZHVsZXMsIG5vdyB0aGF0IFxtb2R1bGV7Y3R5cGVzfSBpcyBpbmNsdWRlZCB3aXRoIGNvcmUgUHl0aG9uLgorCitcYmVnaW57c2VlYWxzb30KKworXHNlZXVybHtodHRwOi8vc3RhcnNoaXAucHl0aG9uLm5ldC9jcmV3L3RoZWxsZXIvY3R5cGVzL30KK3tUaGUgY3R5cGVzIHdlYiBwYWdlLCB3aXRoIGEgdHV0b3JpYWwsIHJlZmVyZW5jZSwgYW5kIEZBUS59CisKK1xlbmR7c2VlYWxzb30KKworCislPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorXHN1YnNlY3Rpb257VGhlIEVsZW1lbnRUcmVlIHBhY2thZ2V9CisKK0Egc3Vic2V0IG9mIEZyZWRyaWsgTHVuZGgncyBFbGVtZW50VHJlZSBsaWJyYXJ5IGZvciBwcm9jZXNzaW5nIFhNTCBoYXMKK2JlZW4gYWRkZWQgdG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkgYXMgXG1vZHVsZXt4bWxjb3JlLmV0cmVlfS4gIFRoZQorYXZhaWxhYmxlIG1vZHVsZXMgYXJlCitcbW9kdWxle0VsZW1lbnRUcmVlfSwgXG1vZHVsZXtFbGVtZW50UGF0aH0sIGFuZAorXG1vZHVsZXtFbGVtZW50SW5jbHVkZX0gZnJvbSBFbGVtZW50VHJlZSAxLjIuNi4gICAKK1RoZSBcbW9kdWxle2NFbGVtZW50VHJlZX0gYWNjZWxlcmF0b3IgbW9kdWxlIGlzIGFsc28gaW5jbHVkZWQuIAorCitUaGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24gd2lsbCBwcm92aWRlIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdXNpbmcKK0VsZW1lbnRUcmVlLiAgRnVsbCBkb2N1bWVudGF0aW9uIGZvciBFbGVtZW50VHJlZSBpcyBhdmFpbGFibGUgYXQKK1x1cmx7aHR0cDovL2VmZmJvdC5vcmcvem9uZS9lbGVtZW50LWluZGV4Lmh0bX0uCisKK0VsZW1lbnRUcmVlIHJlcHJlc2VudHMgYW4gWE1MIGRvY3VtZW50IGFzIGEgdHJlZSBvZiBlbGVtZW50IG5vZGVzLgorVGhlIHRleHQgY29udGVudCBvZiB0aGUgZG9jdW1lbnQgaXMgc3RvcmVkIGFzIHRoZSBcbWVtYmVyey50ZXh0fQorYW5kIFxtZW1iZXJ7LnRhaWx9IGF0dHJpYnV0ZXMgb2YgCisoVGhpcyBpcyBvbmUgb2YgdGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gRWxlbWVudFRyZWUgYW5kIAordGhlIERvY3VtZW50IE9iamVjdCBNb2RlbDsgaW4gdGhlIERPTSB0aGVyZSBhcmUgbWFueSBkaWZmZXJlbnQKK3R5cGVzIG9mIG5vZGUsIGluY2x1ZGluZyBcY2xhc3N7VGV4dE5vZGV9LikKKworVGhlIG1vc3QgY29tbW9ubHkgdXNlZCBwYXJzaW5nIGZ1bmN0aW9uIGlzIFxmdW5jdGlvbntwYXJzZSgpfSwgdGhhdAordGFrZXMgZWl0aGVyIGEgc3RyaW5nIChhc3N1bWVkIHRvIGNvbnRhaW4gYSBmaWxlbmFtZSkgb3IgYSBmaWxlLWxpa2UKK29iamVjdCBhbmQgcmV0dXJucyBhbiBcY2xhc3N7RWxlbWVudFRyZWV9IGluc3RhbmNlOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCisKK3RyZWUgPSBFVC5wYXJzZSgnZXgtMS54bWwnKQorCitmZWVkID0gdXJsbGliLnVybG9wZW4oCisgICAgICAgICAgJ2h0dHA6Ly9wbGFuZXQucHl0aG9uLm9yZy9yc3MxMC54bWwnKQordHJlZSA9IEVULnBhcnNlKGZlZWQpCitcZW5ke3ZlcmJhdGltfQorCitPbmNlIHlvdSBoYXZlIGFuIFxjbGFzc3tFbGVtZW50VHJlZX0gaW5zdGFuY2UsIHlvdQorY2FuIGNhbGwgaXRzIFxtZXRob2R7Z2V0cm9vdCgpfSBtZXRob2QgdG8gZ2V0IHRoZSByb290IFxjbGFzc3tFbGVtZW50fSBub2RlLgorCitUaGVyZSdzIGFsc28gYW4gXGZ1bmN0aW9ue1hNTCgpfSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgc3RyaW5nIGxpdGVyYWwKK2FuZCByZXR1cm5zIGFuIFxjbGFzc3tFbGVtZW50fSBub2RlIChub3QgYW4gXGNsYXNze0VsZW1lbnRUcmVlfSkuICAKK1RoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB0aWR5IHdheSB0byBpbmNvcnBvcmF0ZSBYTUwgZnJhZ21lbnRzLAorYXBwcm9hY2hpbmcgdGhlIGNvbnZlbmllbmNlIG9mIGFuIFhNTCBsaXRlcmFsOgorCitcYmVnaW57dmVyYmF0aW19CitzdmcgPSBldC5YTUwoIiIiPHN2ZyB3aWR0aD0iMTBweCIgdmVyc2lvbj0iMS4wIj4KKyAgICAgICAgICAgICA8L3N2Zz4iIiIpCitzdmcuc2V0KCdoZWlnaHQnLCAnMzIwcHgnKQorc3ZnLmFwcGVuZChlbGVtMSkKK1xlbmR7dmVyYmF0aW19CisKK0VhY2ggWE1MIGVsZW1lbnQgc3VwcG9ydHMgc29tZSBkaWN0aW9uYXJ5LWxpa2UgYW5kIHNvbWUgbGlzdC1saWtlCithY2Nlc3MgbWV0aG9kcy4gIERpY3Rpb25hcnktbGlrZSBvcGVyYXRpb25zIGFyZSB1c2VkIHRvIGFjY2VzcyBhdHRyaWJ1dGUKK3ZhbHVlcywgYW5kIGxpc3QtbGlrZSBvcGVyYXRpb25zIGFyZSB1c2VkIHRvIGFjY2VzcyBjaGlsZCBub2Rlcy4KKworXGJlZ2lue3RhYmxlaWl9e2N8bH17Y29kZX17T3BlcmF0aW9ufXtSZXN1bHR9CisgIFxsaW5laWl7ZWxlbVtuXX17UmV0dXJucyBuJ3RoIGNoaWxkIGVsZW1lbnQufQorICBcbGluZWlpe2VsZW1bbTpuXX17UmV0dXJucyBsaXN0IG9mIG0ndGggdGhyb3VnaCBuJ3RoIGNoaWxkIGVsZW1lbnRzLn0KKyAgXGxpbmVpaXtsZW4oZWxlbSl9e1JldHVybnMgbnVtYmVyIG9mIGNoaWxkIGVsZW1lbnRzLn0KKyAgXGxpbmVpaXtlbGVtLmdldGNoaWxkcmVuKCl9e1JldHVybnMgbGlzdCBvZiBjaGlsZCBlbGVtZW50cy59CisgIFxsaW5laWl7ZWxlbS5hcHBlbmQoZWxlbTIpfXtBZGRzIFx2YXJ7ZWxlbTJ9IGFzIGEgY2hpbGQufQorICBcbGluZWlpe2VsZW0uaW5zZXJ0KGluZGV4LCBlbGVtMil9e0luc2VydHMgXHZhcntlbGVtMn0gYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi59CisgIFxsaW5laWl7ZGVsIGVsZW1bbl19e0RlbGV0ZXMgbid0aCBjaGlsZCBlbGVtZW50Ln0KKyAgXGxpbmVpaXtlbGVtLmtleXMoKX17UmV0dXJucyBsaXN0IG9mIGF0dHJpYnV0ZSBuYW1lcy59CisgIFxsaW5laWl7ZWxlbS5nZXQobmFtZSl9e1JldHVybnMgdmFsdWUgb2YgYXR0cmlidXRlIFx2YXJ7bmFtZX0ufQorICBcbGluZWlpe2VsZW0uc2V0KG5hbWUsIHZhbHVlKX17U2V0cyBuZXcgdmFsdWUgZm9yIGF0dHJpYnV0ZSBcdmFye25hbWV9Ln0KKyAgXGxpbmVpaXtlbGVtLmF0dHJpYn17UmV0cmlldmVzIHRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYXR0cmlidXRlcy59CisgIFxsaW5laWl7ZGVsIGVsZW0uYXR0cmliW25hbWVdfXtEZWxldGVzIGF0dHJpYnV0ZSBcdmFye25hbWV9Ln0KK1xlbmR7dGFibGVpaX0KKworQ29tbWVudHMgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBhbHNvIHJlcHJlc2VudGVkIGFzCitcY2xhc3N7RWxlbWVudH0gbm9kZXMuICBUbyBjaGVjayBpZiBhIG5vZGUgaXMgYSBjb21tZW50IG9yIHByb2Nlc3NpbmcKK2luc3RydWN0aW9uczoKKworXGJlZ2lue3ZlcmJhdGltfQoraWYgZWxlbS50YWcgaXMgRVQuQ29tbWVudDoKKyAgICAuLi4KK2VsaWYgZWxlbS50YWcgaXMgRVQuUHJvY2Vzc2luZ0luc3RydWN0aW9uOgorICAgIC4uLgorXGVuZHt2ZXJiYXRpbX0KKworVG8gZ2VuZXJhdGUgWE1MIG91dHB1dCwgeW91IHNob3VsZCBjYWxsIHRoZQorXG1ldGhvZHtFbGVtZW50VHJlZS53cml0ZSgpfSBtZXRob2QuICBMaWtlIFxmdW5jdGlvbntwYXJzZSgpfSwKK2l0IGNhbiB0YWtlIGVpdGhlciBhIHN0cmluZyBvciBhIGZpbGUtbGlrZSBvYmplY3Q6CisKK1xiZWdpbnt2ZXJiYXRpbX0KKyMgRW5jb2RpbmcgaXMgVVMtQVNDSUkKK3RyZWUud3JpdGUoJ291dHB1dC54bWwnKQorCisjIEVuY29kaW5nIGlzIFVURi04CitmID0gb3Blbignb3V0cHV0LnhtbCcsICd3JykKK3RyZWUud3JpdGUoZiwgJ3V0Zi04JykKK1xlbmR7dmVyYmF0aW19CisKKyhDYXV0aW9uOiB0aGUgZGVmYXVsdCBlbmNvZGluZyB1c2VkIGZvciBvdXRwdXQgaXMgQVNDSUksIHdoaWNoIGlzbid0Cit2ZXJ5IHVzZWZ1bCBmb3IgZ2VuZXJhbCBYTUwgd29yaywgcmFpc2luZyBhbiBleGNlcHRpb24gaWYgdGhlcmUgYXJlCithbnkgY2hhcmFjdGVycyB3aXRoIHZhbHVlcyBncmVhdGVyIHRoYW4gMTI3LiAgWW91IHNob3VsZCBhbHdheXMKK3NwZWNpZnkgYSBkaWZmZXJlbnQgZW5jb2Rpbmcgc3VjaCBhcyBVVEYtOCB0aGF0IGNhbiBoYW5kbGUgYW55IFVuaWNvZGUKK2NoYXJhY3Rlci4pCisKK1RoaXMgc2VjdGlvbiBpcyBvbmx5IGEgcGFydGlhbCBkZXNjcmlwdGlvbiBvZiB0aGUgRWxlbWVudFRyZWUgaW50ZXJmYWNlcy4KK1BsZWFzZSByZWFkIHRoZSBwYWNrYWdlJ3Mgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorCitcYmVnaW57c2VlYWxzb30KKworXHNlZXVybHtodHRwOi8vZWZmYm90Lm9yZy96b25lL2VsZW1lbnQtaW5kZXguaHRtfQore09mZmljaWFsIGRvY3VtZW50YXRpb24gZm9yIEVsZW1lbnRUcmVlLn0KKworCitcZW5ke3NlZWFsc299CisKKworJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1xzdWJzZWN0aW9ue1RoZSBoYXNobGliIHBhY2thZ2V9CisKK0EgbmV3IFxtb2R1bGV7aGFzaGxpYn0gbW9kdWxlLCB3cml0dGVuIGJ5IEdyZWdvcnkgUC4gU21pdGgsIAoraGFzIGJlZW4gYWRkZWQgdG8gcmVwbGFjZSB0aGUKK1xtb2R1bGV7bWQ1fSBhbmQgXG1vZHVsZXtzaGF9IG1vZHVsZXMuICBcbW9kdWxle2hhc2hsaWJ9IGFkZHMgc3VwcG9ydAorZm9yIGFkZGl0aW9uYWwgc2VjdXJlIGhhc2hlcyAoU0hBLTIyNCwgU0hBLTI1NiwgU0hBLTM4NCwgYW5kIFNIQS01MTIpLgorV2hlbiBhdmFpbGFibGUsIHRoZSBtb2R1bGUgdXNlcyBPcGVuU1NMIGZvciBmYXN0IHBsYXRmb3JtIG9wdGltaXplZAoraW1wbGVtZW50YXRpb25zIG9mIGFsZ29yaXRobXMuICAKKworVGhlIG9sZCBcbW9kdWxle21kNX0gYW5kIFxtb2R1bGV7c2hhfSBtb2R1bGVzIHN0aWxsIGV4aXN0IGFzIHdyYXBwZXJzCithcm91bmQgaGFzaGxpYiB0byBwcmVzZXJ2ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIFRoZSBuZXcgbW9kdWxlJ3MKK2ludGVyZmFjZSBpcyB2ZXJ5IGNsb3NlIHRvIHRoYXQgb2YgdGhlIG9sZCBtb2R1bGVzLCBidXQgbm90IGlkZW50aWNhbC4KK1RoZSBtb3N0IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb25zCitmb3IgY3JlYXRpbmcgbmV3IGhhc2hpbmcgb2JqZWN0cyBhcmUgbmFtZWQgZGlmZmVyZW50bHkuCisKK1xiZWdpbnt2ZXJiYXRpbX0KKyMgT2xkIHZlcnNpb25zCitoID0gbWQ1Lm1kNSgpICAgCitoID0gbWQ1Lm5ldygpICAgCisKKyMgTmV3IHZlcnNpb24gCitoID0gaGFzaGxpYi5tZDUoKQorCisjIE9sZCB2ZXJzaW9ucworaCA9IHNoYS5zaGEoKSAgIAoraCA9IHNoYS5uZXcoKSAgIAorCisjIE5ldyB2ZXJzaW9uIAoraCA9IGhhc2hsaWIuc2hhMSgpCisKKyMgSGFzaCB0aGF0IHdlcmVuJ3QgcHJldmlvdXNseSBhdmFpbGFibGUKK2ggPSBoYXNobGliLnNoYTIyNCgpCitoID0gaGFzaGxpYi5zaGEyNTYoKQoraCA9IGhhc2hsaWIuc2hhMzg0KCkKK2ggPSBoYXNobGliLnNoYTUxMigpCisKKyMgQWx0ZXJuYXRpdmUgZm9ybQoraCA9IGhhc2hsaWIubmV3KCdtZDUnKSAgICAgICAgICAjIFByb3ZpZGUgYWxnb3JpdGhtIGFzIGEgc3RyaW5nCitcZW5ke3ZlcmJhdGltfQorCitPbmNlIGEgaGFzaCBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCwgaXRzIG1ldGhvZHMgYXJlIHRoZSBzYW1lIGFzIGJlZm9yZToKK1xtZXRob2R7dXBkYXRlKFx2YXJ7c3RyaW5nfSl9IGhhc2hlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBpbnRvIHRoZSAKK2N1cnJlbnQgZGlnZXN0IHN0YXRlLCBcbWV0aG9ke2RpZ2VzdCgpfSBhbmQgXG1ldGhvZHtoZXhkaWdlc3QoKX0KK3JldHVybiB0aGUgZGlnZXN0IHZhbHVlIGFzIGEgYmluYXJ5IHN0cmluZyBvciBhIHN0cmluZyBvZiBoZXggZGlnaXRzLAorYW5kIFxtZXRob2R7Y29weSgpfSByZXR1cm5zIGEgbmV3IGhhc2hpbmcgb2JqZWN0IHdpdGggdGhlIHNhbWUgZGlnZXN0IHN0YXRlLgorCisKKyU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Citcc3Vic2VjdGlvbntUaGUgc3FsaXRlMyBwYWNrYWdlfQorCitUaGUgcHlzcWxpdGUgbW9kdWxlIChcdXJse2h0dHA6Ly93d3cucHlzcWxpdGUub3JnfSksIGEgd3JhcHBlciBmb3IgdGhlCitTUUxpdGUgZW1iZWRkZWQgZGF0YWJhc2UsIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHVuZGVyCit0aGUgcGFja2FnZSBuYW1lIFxtb2R1bGV7c3FsaXRlM30uICAKKworU1FMaXRlIGlzIGEgQyBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgYSBTUUwtbGFuZ3VhZ2UgZGF0YWJhc2UgdGhhdAorc3RvcmVzIGRhdGEgaW4gZGlzayBmaWxlcyB3aXRob3V0IHJlcXVpcmluZyBhIHNlcGFyYXRlIHNlcnZlciBwcm9jZXNzLgorcHlzcWxpdGUgd2FzIHdyaXR0ZW4gYnkgR2VyaGFyZCBIXCJhcmluZyBhbmQgcHJvdmlkZXMgYSBTUUwgaW50ZXJmYWNlCitjb21wbGlhbnQgd2l0aCB0aGUgREItQVBJIDIuMCBzcGVjaWZpY2F0aW9uIGRlc2NyaWJlZCBieQorXHBlcHsyNDl9LiBUaGlzIG1lYW5zIHRoYXQgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHdyaXRlIHRoZSBmaXJzdAordmVyc2lvbiBvZiB5b3VyIGFwcGxpY2F0aW9ucyB1c2luZyBTUUxpdGUgZm9yIGRhdGEgc3RvcmFnZS4gIElmCitzd2l0Y2hpbmcgdG8gYSBsYXJnZXIgZGF0YWJhc2Ugc3VjaCBhcyBQb3N0Z3JlU1FMIG9yIE9yYWNsZSBpcworbGF0ZXIgbmVjZXNzYXJ5LCB0aGUgc3dpdGNoIHNob3VsZCBiZSByZWxhdGl2ZWx5IGVhc3kuCisKK0lmIHlvdSdyZSBjb21waWxpbmcgdGhlIFB5dGhvbiBzb3VyY2UgeW91cnNlbGYsIG5vdGUgdGhhdCB0aGUgc291cmNlCit0cmVlIGRvZXNuJ3QgaW5jbHVkZSB0aGUgU1FMaXRlIGNvZGUsIG9ubHkgdGhlIHdyYXBwZXIgbW9kdWxlLgorWW91J2xsIG5lZWQgdG8gaGF2ZSB0aGUgU1FMaXRlIGxpYnJhcmllcyBhbmQgaGVhZGVycyBpbnN0YWxsZWQgYmVmb3JlCitjb21waWxpbmcgUHl0aG9uLCBhbmQgdGhlIGJ1aWxkIHByb2Nlc3Mgd2lsbCBjb21waWxlIHRoZSBtb2R1bGUgd2hlbgordGhlIG5lY2Vzc2FyeSBoZWFkZXJzIGFyZSBhdmFpbGFibGUuCisKK1RvIHVzZSB0aGUgbW9kdWxlLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgYSBcY2xhc3N7Q29ubmVjdGlvbn0gb2JqZWN0Cit0aGF0IHJlcHJlc2VudHMgdGhlIGRhdGFiYXNlLiAgSGVyZSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgCitcZmlsZXsvdG1wL2V4YW1wbGV9IGZpbGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Nvbm4gPSBzcWxpdGUzLmNvbm5lY3QoJy90bXAvZXhhbXBsZScpCitcZW5ke3ZlcmJhdGltfQorCitZb3UgY2FuIGFsc28gc3VwcGx5IHRoZSBzcGVjaWFsIG5hbWUgXHNhbXB7Om1lbW9yeTp9IHRvIGNyZWF0ZQorYSBkYXRhYmFzZSBpbiBSQU0uCisKK09uY2UgeW91IGhhdmUgYSBcY2xhc3N7Q29ubmVjdGlvbn0sIHlvdSBjYW4gY3JlYXRlIGEgXGNsYXNze0N1cnNvcn0gCitvYmplY3QgYW5kIGNhbGwgaXRzIFxtZXRob2R7ZXhlY3V0ZSgpfSBtZXRob2QgdG8gcGVyZm9ybSBTUUwgY29tbWFuZHM6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2MgPSBjb25uLmN1cnNvcigpCisKKyMgQ3JlYXRlIHRhYmxlCitjLmV4ZWN1dGUoJycnY3JlYXRlIHRhYmxlIHN0b2NrcworKGRhdGUgdGltZXN0YW1wLCB0cmFucyB2YXJjaGFyLCBzeW1ib2wgdmFyY2hhciwKKyBxdHkgZGVjaW1hbCwgcHJpY2UgZGVjaW1hbCknJycpCisKKyMgSW5zZXJ0IGEgcm93IG9mIGRhdGEKK2MuZXhlY3V0ZSgiIiJpbnNlcnQgaW50byBzdG9ja3MKKyAgICAgICAgICB2YWx1ZXMgKCcyMDA2LTAxLTA1JywnQlVZJywnUkhBVCcsMTAwLDM1LjE0KSIiIikKK1xlbmR7dmVyYmF0aW19ICAgIAorCitVc3VhbGx5IHlvdXIgU1FMIG9wZXJhdGlvbnMgd2lsbCBuZWVkIHRvIHVzZSB2YWx1ZXMgZnJvbSBQeXRob24KK3ZhcmlhYmxlcy4gIFlvdSBzaG91bGRuJ3QgYXNzZW1ibGUgeW91ciBxdWVyeSB1c2luZyBQeXRob24ncyBzdHJpbmcKK29wZXJhdGlvbnMgYmVjYXVzZSBkb2luZyBzbyBpcyBpbnNlY3VyZTsgaXQgbWFrZXMgeW91ciBwcm9ncmFtCit2dWxuZXJhYmxlIHRvIGFuIFNRTCBpbmplY3Rpb24gYXR0YWNrLiAgCisKK0luc3RlYWQsIHVzZSBTUUxpdGUncyBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9uLiAgUHV0IFxzYW1wez99IGFzIGEKK3BsYWNlaG9sZGVyIHdoZXJldmVyIHlvdSB3YW50IHRvIHVzZSBhIHZhbHVlLCBhbmQgdGhlbiBwcm92aWRlIGEgdHVwbGUKK29mIHZhbHVlcyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBjdXJzb3IncyBcbWV0aG9ke2V4ZWN1dGUoKX0KK21ldGhvZC4gIEZvciBleGFtcGxlOgorCitcYmVnaW57dmVyYmF0aW19ICAgIAorIyBOZXZlciBkbyB0aGlzIC0tIGluc2VjdXJlIQorc3ltYm9sID0gJ0lCTScKK2MuZXhlY3V0ZSgiLi4uIHdoZXJlIHN5bWJvbCA9ICclcyciICUgc3ltYm9sKQorCisjIERvIHRoaXMgaW5zdGVhZAordCA9IChzeW1ib2wsKQorYy5leGVjdXRlKCdzZWxlY3QgKiBmcm9tIHN0b2NrcyB3aGVyZSBzeW1ib2w9PycsICgnSUJNJywpKQorCisjIExhcmdlciBleGFtcGxlCitmb3IgdCBpbiAoKCcyMDA2LTAzLTI4JywgJ0JVWScsICdJQk0nLCAxMDAwLCA0NS4wMCksCisgICAgICAgICAgKCcyMDA2LTA0LTA1JywgJ0JVWScsICdNU09GVCcsIDEwMDAsIDcyLjAwKSwKKyAgICAgICAgICAoJzIwMDYtMDQtMDYnLCAnU0VMTCcsICdJQk0nLCA1MDAsIDUzLjAwKSwKKyAgICAgICAgICk6CisgICAgYy5leGVjdXRlKCdpbnNlcnQgaW50byBzdG9ja3MgdmFsdWVzICg/LD8sPyw/LD8pJywgdCkKK1xlbmR7dmVyYmF0aW19CisKK1RvIHJldHJpZXZlIGRhdGEgYWZ0ZXIgZXhlY3V0aW5nIGEgU0VMRUNUIHN0YXRlbWVudCwgeW91IGNhbiBlaXRoZXIgCit0cmVhdCB0aGUgY3Vyc29yIGFzIGFuIGl0ZXJhdG9yLCBjYWxsIHRoZSBjdXJzb3IncyBcbWV0aG9ke2ZldGNob25lKCl9CittZXRob2QgdG8gcmV0cmlldmUgYSBzaW5nbGUgbWF0Y2hpbmcgcm93LCAKK29yIGNhbGwgXG1ldGhvZHtmZXRjaGFsbCgpfSB0byBnZXQgYSBsaXN0IG9mIHRoZSBtYXRjaGluZyByb3dzLgorCitUaGlzIGV4YW1wbGUgdXNlcyB0aGUgaXRlcmF0b3IgZm9ybToKKworXGJlZ2lue3ZlcmJhdGltfQorPj4+IGMgPSBjb25uLmN1cnNvcigpCis+Pj4gYy5leGVjdXRlKCdzZWxlY3QgKiBmcm9tIHN0b2NrcyBvcmRlciBieSBwcmljZScpCis+Pj4gZm9yIHJvdyBpbiBjOgorLi4uICAgIHByaW50IHJvdworLi4uCisodScyMDA2LTAxLTA1JywgdSdCVVknLCB1J1JIQVQnLCAxMDAsIDM1LjE0MDAwMDAwMDAwMDAwMSkKKyh1JzIwMDYtMDMtMjgnLCB1J0JVWScsIHUnSUJNJywgMTAwMCwgNDUuMCkKKyh1JzIwMDYtMDQtMDYnLCB1J1NFTEwnLCB1J0lCTScsIDUwMCwgNTMuMCkKKyh1JzIwMDYtMDQtMDUnLCB1J0JVWScsIHUnTVNPRlQnLCAxMDAwLCA3Mi4wKQorPj4+CitcZW5ke3ZlcmJhdGltfQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgU1FMIGRpYWxlY3Qgc3VwcG9ydGVkIGJ5IFNRTGl0ZSwgc2VlIAorXHVybHtodHRwOi8vd3d3LnNxbGl0ZS5vcmd9LgorCitcYmVnaW57c2VlYWxzb30KKworXHNlZXVybHtodHRwOi8vd3d3LnB5c3FsaXRlLm9yZ30KK3tUaGUgcHlzcWxpdGUgd2ViIHBhZ2UufQorCitcc2VldXJse2h0dHA6Ly93d3cuc3FsaXRlLm9yZ30KK3tUaGUgU1FMaXRlIHdlYiBwYWdlOyB0aGUgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgdGhlIHN5bnRheCBhbmQgdGhlCithdmFpbGFibGUgZGF0YSB0eXBlcyBmb3IgdGhlIHN1cHBvcnRlZCBTUUwgZGlhbGVjdC59CisKK1xzZWVwZXB7MjQ5fXtEYXRhYmFzZSBBUEkgU3BlY2lmaWNhdGlvbiAyLjB9e1BFUCB3cml0dGVuIGJ5CitNYXJjLUFuZHJcJ2UgTGVtYnVyZy59CisKK1xlbmR7c2VlYWxzb30KIAogCiAlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTY1OSwxMSArMTgyMSwzMiBAQAogCiBcYmVnaW57aXRlbWl6ZX0KIAotXGl0ZW0gVGhlIGRlc2lnbiBvZiB0aGUgYnl0ZWNvZGUgY29tcGlsZXIgaGFzIGNoYW5nZWQgYSBncmVhdCBkZWFsLCBubwotbG9uZ2VyIGdlbmVyYXRpbmcgYnl0ZWNvZGUgYnkgdHJhdmVyc2luZyB0aGUgcGFyc2UgdHJlZS4gIEluc3RlYWQKK1xpdGVtIFRoZSBsYXJnZXN0IGNoYW5nZSB0byB0aGUgQyBBUEkgY2FtZSBmcm9tIFxwZXB7MzUzfSwKK3doaWNoIG1vZGlmaWVzIHRoZSBpbnRlcnByZXRlciB0byB1c2UgYSBcY3R5cGV7UHlfc3NpemVfdH0gdHlwZQorZGVmaW5pdGlvbiBpbnN0ZWFkIG9mIFxjdHlwZXtpbnR9LiAgU2VlIHRoZSBlYXJsaWVyCitzZWN0aW9uflxyZWZ7c2VjdGlvbi0zNTN9IGZvciBhIGRpc2N1c3Npb24gb2YgdGhpcyBjaGFuZ2UuCisKK1xpdGVtIFRoZSBkZXNpZ24gb2YgdGhlIGJ5dGVjb2RlIGNvbXBpbGVyIGhhcyBjaGFuZ2VkIGEgZ3JlYXQgZGVhbCwgdG8KK25vIGxvbmdlciBnZW5lcmF0ZSBieXRlY29kZSBieSB0cmF2ZXJzaW5nIHRoZSBwYXJzZSB0cmVlLiAgSW5zdGVhZAogdGhlIHBhcnNlIHRyZWUgaXMgY29udmVydGVkIHRvIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIChvciBBU1QpLCBhbmQgaXQgaXMgCiB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUgdGhhdCdzIHRyYXZlcnNlZCB0byBwcm9kdWNlIHRoZSBieXRlY29kZS4KIAorSXQncyBwb3NzaWJsZSBmb3IgUHl0aG9uIGNvZGUgdG8gb2J0YWluIEFTVCBvYmplY3RzIGJ5IHVzaW5nIHRoZSAKK1xmdW5jdGlvbntjb21waWxlKCl9IGJ1aWx0LWluIGFuZCBzcGVjaWZ5aW5nIFxjb2Rle19hc3QuUHlDRl9PTkxZX0FTVH0KK2FzIHRoZSB2YWx1ZSBvZiB0aGUgCitcdmFye2ZsYWdzfSBwYXJhbWV0ZXI6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gX2FzdCBpbXBvcnQgUHlDRl9PTkxZX0FTVAorYXN0ID0gY29tcGlsZSgiIiJhPTAKK2ZvciBpIGluIHJhbmdlKDEwKToKKyAgICBhICs9IGkKKyIiIiwgIjxzdHJpbmc+IiwgJ2V4ZWMnLCBQeUNGX09OTFlfQVNUKQorCithc3NpZ25tZW50ID0gYXN0LmJvZHlbMF0KK2Zvcl9sb29wID0gYXN0LmJvZHlbMV0KK1xlbmR7dmVyYmF0aW19CisKIE5vIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gd3JpdHRlbiBmb3IgdGhlIEFTVCBjb2RlIHlldC4gIFRvIHN0YXJ0CiBsZWFybmluZyBhYm91dCBpdCwgcmVhZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgdmFyaW91cyBBU1Qgbm9kZXMgaW4KIFxmaWxle1BhcnNlci9QeXRob24uYXNkbH0uICBBIFB5dGhvbiBzY3JpcHQgcmVhZHMgdGhpcyBmaWxlIGFuZApAQCAtNjg5LDYgKzE4NzIsMTggQEAKIG5ldyBzZXQsIFxjZnVuY3Rpb257UHlTZXRfQWRkKCl9IGFuZCBcY2Z1bmN0aW9ue1B5U2V0X0Rpc2NhcmQoKX0gdG8KIGFkZCBhbmQgcmVtb3ZlIGVsZW1lbnRzLCBhbmQgXGNmdW5jdGlvbntQeVNldF9Db250YWluc30gYW5kCiBcY2Z1bmN0aW9ue1B5U2V0X1NpemV9IHRvIGV4YW1pbmUgdGhlIHNldCdzIHN0YXRlLgorKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKKworXGl0ZW0gQyBjb2RlIGNhbiBub3cgb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGFjdCByZXZpc2lvbgorb2YgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBieSBjYWxsaW5nIHRoZSAKK1xjZnVuY3Rpb257UHlfR2V0QnVpbGRJbmZvKCl9IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIAorc3RyaW5nIG9mIGJ1aWxkIGluZm9ybWF0aW9uIGxpa2UgdGhpczoKK1xjb2RleyJ0cnVuazo0NTM1NTo0NTM1Nk0sIEFwciAxMyAyMDA2LCAwNzo0MjoxOSJ9LiAgCisoQ29udHJpYnV0ZWQgYnkgQmFycnkgV2Fyc2F3LikKKworXGl0ZW0gVGhlIENQeXRob24gaW50ZXJwcmV0ZXIgaXMgc3RpbGwgd3JpdHRlbiBpbiBDLCBidXQgCit0aGUgY29kZSBjYW4gbm93IGJlIGNvbXBpbGVkIHdpdGggYSB7XENwcH0gY29tcGlsZXIgd2l0aG91dCBlcnJvcnMuICAKKyhJbXBsZW1lbnRlZCBieSBBbnRob255IEJheHRlciwgTWFydGluIHZvbn5MXCJvd2lzLCBTa2lwIE1vbnRhbmFyby4pCiAKIFxpdGVtIFRoZSBcY2Z1bmN0aW9ue1B5UmFuZ2VfTmV3KCl9IGZ1bmN0aW9uIHdhcyByZW1vdmVkLiAgSXQgd2FzCiBuZXZlciBkb2N1bWVudGVkLCBuZXZlciB1c2VkIGluIHRoZSBjb3JlIGNvZGUsIGFuZCBoYWQgZGFuZ2Vyb3VzbHkgbGF4CkBAIC03MDAsNyArMTg5NSwxNyBAQAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzdWJzZWN0aW9ue1BvcnQtU3BlY2lmaWMgQ2hhbmdlc30KIAotUGxhdGZvcm0tc3BlY2lmaWMgY2hhbmdlcyBnbyBoZXJlLgorXGJlZ2lue2l0ZW1pemV9CisKK1xpdGVtIE1hY09TIFggKDEwLjMgYW5kIGhpZ2hlcik6IGR5bmFtaWMgbG9hZGluZyBvZiBtb2R1bGVzCitub3cgdXNlcyB0aGUgXGNmdW5jdGlvbntkbG9wZW4oKX0gZnVuY3Rpb24gaW5zdGVhZCBvZiBNYWNPUy1zcGVjaWZpYworZnVuY3Rpb25zLgorCitcaXRlbSBXaW5kb3dzOiBcZmlsZXsuZGxsfSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGFzIGEgZmlsZW5hbWUgZXh0ZW5zaW9uIGZvciAKK2V4dGVuc2lvbiBtb2R1bGVzLiAgXGZpbGV7LnB5ZH0gaXMgbm93IHRoZSBvbmx5IGZpbGVuYW1lIGV4dGVuc2lvbiB0aGF0IHdpbGwKK2JlIHNlYXJjaGVkIGZvci4KKworXGVuZHtpdGVtaXplfQogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC03MTUsNyArMTkyMCwzOCBAQAogCiBcYmVnaW57aXRlbWl6ZX0KIAotXGl0ZW0gRGV0YWlscyBnbyBoZXJlLgorXGl0ZW0gRXZhbiBKb25lcydzIHBhdGNoIHRvIG9ibWFsbG9jLCBmaXJzdCBkZXNjcmliZWQgaW4gYSB0YWxrCithdCBQeUNvbiBEQyAyMDA1LCB3YXMgYXBwbGllZC4gIFB5dGhvbiAyLjQgYWxsb2NhdGVkIHNtYWxsIG9iamVjdHMgaW4KKzI1Nkstc2l6ZWQgYXJlbmFzLCBidXQgbmV2ZXIgZnJlZWQgYXJlbmFzLiAgV2l0aCB0aGlzIHBhdGNoLCBQeXRob24KK3dpbGwgZnJlZSBhcmVuYXMgd2hlbiB0aGV5J3JlIGVtcHR5LiAgVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCBvbiBzb21lCitwbGF0Zm9ybXMsIHdoZW4geW91IGFsbG9jYXRlIG1hbnkgb2JqZWN0cywgUHl0aG9uJ3MgbWVtb3J5IHVzYWdlIG1heQorYWN0dWFsbHkgZHJvcCB3aGVuIHlvdSBkZWxldGUgdGhlbSwgYW5kIHRoZSBtZW1vcnkgbWF5IGJlIHJldHVybmVkIHRvCit0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIChJbXBsZW1lbnRlZCBieSBFdmFuIEpvbmVzLCBhbmQgcmV3b3JrZWQgYnkgVGltCitQZXRlcnMuKQorCitOb3RlIHRoYXQgdGhpcyBjaGFuZ2UgbWVhbnMgZXh0ZW5zaW9uIG1vZHVsZXMgbmVlZCB0byBiZSBtb3JlIGNhcmVmdWwKK3dpdGggaG93IHRoZXkgYWxsb2NhdGUgbWVtb3J5LiAgUHl0aG9uJ3MgQVBJIGhhcyBtYW55IGRpZmZlcmVudAorZnVuY3Rpb25zIGZvciBhbGxvY2F0aW5nIG1lbW9yeSB0aGF0IGFyZSBncm91cGVkIGludG8gZmFtaWxpZXMuICBGb3IKK2V4YW1wbGUsIFxjZnVuY3Rpb257UHlNZW1fTWFsbG9jKCl9LCBcY2Z1bmN0aW9ue1B5TWVtX1JlYWxsb2MoKX0sIGFuZAorXGNmdW5jdGlvbntQeU1lbV9GcmVlKCl9IGFyZSBvbmUgZmFtaWx5IHRoYXQgYWxsb2NhdGVzIHJhdyBtZW1vcnksCit3aGlsZSBcY2Z1bmN0aW9ue1B5T2JqZWN0X01hbGxvYygpfSwgXGNmdW5jdGlvbntQeU9iamVjdF9SZWFsbG9jKCl9LAorYW5kIFxjZnVuY3Rpb257UHlPYmplY3RfRnJlZSgpfSBhcmUgYW5vdGhlciBmYW1pbHkgdGhhdCdzIHN1cHBvc2VkIHRvCitiZSB1c2VkIGZvciBjcmVhdGluZyBQeXRob24gb2JqZWN0cy4gIAorCitQcmV2aW91c2x5IHRoZXNlIGRpZmZlcmVudCBmYW1pbGllcyBhbGwgcmVkdWNlZCB0byB0aGUgcGxhdGZvcm0ncworXGNmdW5jdGlvbnttYWxsb2MoKX0gYW5kIFxjZnVuY3Rpb257ZnJlZSgpfSBmdW5jdGlvbnMuICBUaGlzIG1lYW50IAoraXQgZGlkbid0IG1hdHRlciBpZiB5b3UgZ290IHRoaW5ncyB3cm9uZyBhbmQgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIHRoZQorXGNmdW5jdGlvbntQeU1lbX0gZnVuY3Rpb24gYnV0IGZyZWVkIGl0IHdpdGggdGhlIFxjZnVuY3Rpb257UHlPYmplY3R9CitmdW5jdGlvbi4gIFdpdGggdGhlIG9ibWFsbG9jIGNoYW5nZSwgdGhlc2UgZmFtaWxpZXMgbm93IGRvIGRpZmZlcmVudAordGhpbmdzLCBhbmQgbWlzbWF0Y2hlcyB3aWxsIHByb2JhYmx5IHJlc3VsdCBpbiBhIHNlZ2ZhdWx0LiAgWW91IHNob3VsZAorY2FyZWZ1bGx5IHRlc3QgeW91ciBDIGV4dGVuc2lvbiBtb2R1bGVzIHdpdGggUHl0aG9uIDIuNS4KKworXGl0ZW0gQ292ZXJpdHksIGEgY29tcGFueSB0aGF0IG1hcmtldHMgYSBzb3VyY2UgY29kZSBhbmFseXNpcyB0b29sCisgIGNhbGxlZCBQcmV2ZW50LCBwcm92aWRlZCB0aGUgcmVzdWx0cyBvZiB0aGVpciBleGFtaW5hdGlvbiBvZiB0aGUgUHl0aG9uCisgIHNvdXJjZSBjb2RlLiAgVGhlIGFuYWx5c2lzIGZvdW5kIGFib3V0IDYwIGJ1Z3MgdGhhdCAKKyAgd2VyZSBxdWlja2x5IGZpeGVkLiAgTWFueSBvZiB0aGUgYnVncyB3ZXJlIHJlZmNvdW50aW5nIHByb2JsZW1zLCBvZnRlbgorICBvY2N1cnJpbmcgaW4gZXJyb3ItaGFuZGxpbmcgY29kZS4gIFNlZQorICBcdXJse2h0dHA6Ly9zY2FuLmNvdmVyaXR5LmNvbX0gZm9yIHRoZSBzdGF0aXN0aWNzLgogCiBcZW5ke2l0ZW1pemV9CiAKQEAgLTcyOCwyNCArMTk2NCwzMiBAQAogCiBcYmVnaW57aXRlbWl6ZX0KIAotXGl0ZW0gU29tZSBvbGQgZGVwcmVjYXRlZCBtb2R1bGVzIChcbW9kdWxle3N0YXRjYWNoZX0sIFxtb2R1bGV7dHpwYXJzZX0sCi0gICAgICBcbW9kdWxle3docmFuZG9tfSkgIGhhdmUgYmVlbiBtb3ZlZCB0byBcZmlsZXtMaWIvbGliLW9sZH0uCi1Zb3UgY2FuIGdldCBhY2Nlc3MgdG8gdGhlc2UgbW9kdWxlcyAgYWdhaW4gYnkgYWRkaW5nIHRoZSBkaXJlY3RvcnkgCi10byB5b3VyIFxjb2Rle3N5cy5wYXRofToKK1xpdGVtIEFTQ0lJIGlzIG5vdyB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgbW9kdWxlcy4gIEl0J3Mgbm93IAorYSBzeW50YXggZXJyb3IgaWYgYSBtb2R1bGUgY29udGFpbnMgc3RyaW5nIGxpdGVyYWxzIHdpdGggOC1iaXQKK2NoYXJhY3RlcnMgYnV0IGRvZXNuJ3QgaGF2ZSBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbi4gIEluIFB5dGhvbiAyLjQKK3RoaXMgdHJpZ2dlcmVkIGEgd2FybmluZywgbm90IGEgc3ludGF4IGVycm9yLgogCi1cYmVnaW57dmVyYmF0aW19Ci1pbXBvcnQgb3MKLWZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKK1xpdGVtIFRoZSBcbW9kdWxle3BpY2tsZX0gbW9kdWxlIG5vIGxvbmdlciB1c2VzIHRoZSBkZXByZWNhdGVkIFx2YXJ7YmlufSBwYXJhbWV0ZXIuCiAKLWxpYl9kaXIgPSBzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoc3RhbmRhcmRfbGliPVRydWUpCi1vbGRfZGlyID0gb3MucGF0aC5qb2luKGxpYl9kaXIsICdsaWItb2xkJykKLXN5cy5wYXRoLmFwcGVuZChvbGRfZGlyKQotXGVuZHt2ZXJiYXRpbX0KK1xpdGVtIFByZXZpb3VzbHksIHRoZSBcbWVtYmVye2dpX2ZyYW1lfSBhdHRyaWJ1dGUgb2YgYSBnZW5lcmF0b3IKK3dhcyBhbHdheXMgYSBmcmFtZSBvYmplY3QuICBCZWNhdXNlIG9mIHRoZSBccGVwezM0Mn0gY2hhbmdlcworZGVzY3JpYmVkIGluIHNlY3Rpb25+XHJlZntzZWN0aW9uLWdlbmVyYXRvcnN9LCBpdCdzIG5vdyBwb3NzaWJsZQorZm9yIFxtZW1iZXJ7Z2lfZnJhbWV9IHRvIGJlIFxjb2Rle05vbmV9LgogCi1Eb2luZyBzbyBpcyBkaXNjb3VyYWdlZCwgaG93ZXZlcjsgaXQncyBiZXR0ZXIgdG8gdXBkYXRlIGFueSBjb2RlIHRoYXQKLXN0aWxsIHVzZXMgdGhlc2UgbW9kdWxlcy4KK1xpdGVtIEMgQVBJOiBNYW55IGZ1bmN0aW9ucyBub3cgdXNlIFxjdHlwZXtQeV9zc2l6ZV90fSAKK2luc3RlYWQgb2YgXGN0eXBle2ludH0gdG8gYWxsb3cgcHJvY2Vzc2luZyBtb3JlIGRhdGEgCitvbiA2NC1iaXQgbWFjaGluZXMuICBFeHRlbnNpb24gY29kZSBtYXkgbmVlZCB0byBtYWtlIAordGhlIHNhbWUgY2hhbmdlIHRvIGF2b2lkIHdhcm5pbmdzIGFuZCB0byBzdXBwb3J0IDY0LWJpdCBtYWNoaW5lcy4KK1NlZSB0aGUgZWFybGllcgorc2VjdGlvbn5ccmVme3NlY3Rpb24tMzUzfSBmb3IgYSBkaXNjdXNzaW9uIG9mIHRoaXMgY2hhbmdlLgogCi0lIHRoZSBwaWNrbGUgbW9kdWxlIG5vIGxvbmdlciB1c2VzIHRoZSBkZXByZWNhdGVkIGJpbiBwYXJhbWV0ZXIuCitcaXRlbSBDIEFQSTogCitUaGUgb2JtYWxsb2MgY2hhbmdlcyBtZWFuIHRoYXQgCit5b3UgbXVzdCBiZSBjYXJlZnVsIHRvIG5vdCBtaXggdXNhZ2UgCitvZiB0aGUgXGNmdW5jdGlvbntQeU1lbV8qKCl9IGFuZCBcY2Z1bmN0aW9ue1B5T2JqZWN0XyooKX0KK2ZhbWlsaWVzIG9mIGZ1bmN0aW9ucy4gTWVtb3J5IGFsbG9jYXRlZCB3aXRoIAorb25lIGZhbWlseSdzIFxjZnVuY3Rpb257Kl9NYWxsb2MoKX0gbXVzdCBiZSAKK2ZyZWVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZmFtaWx5J3MgXGNmdW5jdGlvbnsqX0ZyZWUoKX0gZnVuY3Rpb24uCiAKIFxlbmR7aXRlbWl6ZX0KIApAQCAtNzU1LDYgKzE5OTksNyBAQAogCiBUaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIGZvbGxvd2luZyBwZW9wbGUgZm9yIG9mZmVyaW5nCiBzdWdnZXN0aW9ucywgY29ycmVjdGlvbnMgYW5kIGFzc2lzdGFuY2Ugd2l0aCB2YXJpb3VzIGRyYWZ0cyBvZiB0aGlzCi1hcnRpY2xlOiAuCithcnRpY2xlOiBQaGlsbGlwIEouIEVieSwgS2VudCBKb2huc29uLCBNYXJ0aW4gdm9ufkxcIm93aXMsIEd1c3Rhdm8KK05pZW1leWVyLCBNaWtlIFJvdm5lciwgVGhvbWFzIFdvdXRlcnMuCiAKIFxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9HcmFtbWFyL0dyYW1tYXIgYi9HcmFtbWFyL0dyYW1tYXIKaW5kZXggMzNjMzdkMi4uYTYxM2RlNiAxMDA2NDQKLS0tIGEvR3JhbW1hci9HcmFtbWFyCisrKyBiL0dyYW1tYXIvR3JhbW1hcgpAQCAtNyw2ICs3LDkgQEAKICMgICAgICAgIHdpdGggc29tZW9uZSB3aG8gY2FuOyBhc2sgYXJvdW5kIG9uIHB5dGhvbi1kZXYgZm9yIGhlbHAuICBGcmVkCiAjICAgICAgICBEcmFrZSA8ZmRyYWtlQGFjbS5vcmc+IHdpbGwgcHJvYmFibHkgYmUgbGlzdGVuaW5nIHRoZXJlLgogCisjIE5PVEUgV0VMTDogWW91IHNob3VsZCBhbHNvIGZvbGxvdyBhbGwgdGhlIHN0ZXBzIGxpc3RlZCBpbiBQRVAgMzA2LAorIyAiSG93IHRvIENoYW5nZSBQeXRob24ncyBHcmFtbWFyIgorCiAjIFN0YXJ0IHN5bWJvbHMgZm9yIHRoZSBncmFtbWFyOgogIwlzaW5nbGVfaW5wdXQgaXMgYSBzaW5nbGUgaW50ZXJhY3RpdmUgc3RhdGVtZW50OwogIwlmaWxlX2lucHV0IGlzIGEgbW9kdWxlIG9yIHNlcXVlbmNlIG9mIGNvbW1hbmRzIHJlYWQgZnJvbSBhbiBpbnB1dCBmaWxlOwpAQCAtMTE5LDExICsxMjIsMTEgQEAKIAogbGlzdF9pdGVyOiBsaXN0X2ZvciB8IGxpc3RfaWYKIGxpc3RfZm9yOiAnZm9yJyBleHBybGlzdCAnaW4nIHRlc3RsaXN0X3NhZmUgW2xpc3RfaXRlcl0KLWxpc3RfaWY6ICdpZicgdGVzdCBbbGlzdF9pdGVyXQorbGlzdF9pZjogJ2lmJyBvbGRfdGVzdCBbbGlzdF9pdGVyXQogCiBnZW5faXRlcjogZ2VuX2ZvciB8IGdlbl9pZgogZ2VuX2ZvcjogJ2ZvcicgZXhwcmxpc3QgJ2luJyBvcl90ZXN0IFtnZW5faXRlcl0KLWdlbl9pZjogJ2lmJyB0ZXN0IFtnZW5faXRlcl0KK2dlbl9pZjogJ2lmJyBvbGRfdGVzdCBbZ2VuX2l0ZXJdCiAKIHRlc3RsaXN0MTogdGVzdCAoJywnIHRlc3QpKgogCmRpZmYgLS1naXQgYS9JbmNsdWRlL1B5dGhvbi1hc3QuaCBiL0luY2x1ZGUvUHl0aG9uLWFzdC5oCmluZGV4IGIzYmMwNjMuLjNlMjEwMzAgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvUHl0aG9uLWFzdC5oCisrKyBiL0luY2x1ZGUvUHl0aG9uLWFzdC5oCkBAIC0zNSw5ICszNSwxMCBAQAogdHlwZWRlZiBzdHJ1Y3QgX2FsaWFzICphbGlhc190eTsKIAogCitlbnVtIF9tb2Rfa2luZCB7TW9kdWxlX2tpbmQ9MSwgSW50ZXJhY3RpdmVfa2luZD0yLCBFeHByZXNzaW9uX2tpbmQ9MywKKyAgICAgICAgICAgICAgICAgU3VpdGVfa2luZD00fTsKIHN0cnVjdCBfbW9kIHsKLSAgICAgICAgZW51bSB7IE1vZHVsZV9raW5kPTEsIEludGVyYWN0aXZlX2tpbmQ9MiwgRXhwcmVzc2lvbl9raW5kPTMsCi0gICAgICAgICAgICAgICBTdWl0ZV9raW5kPTQgfSBraW5kOworICAgICAgICBlbnVtIF9tb2Rfa2luZCBraW5kOwogICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OwpAQCAtNTgsMTQgKzU5LDE1IEBACiAgICAgICAgIH0gdjsKIH07CiAKK2VudW0gX3N0bXRfa2luZCB7RnVuY3Rpb25EZWZfa2luZD0xLCBDbGFzc0RlZl9raW5kPTIsIFJldHVybl9raW5kPTMsCisgICAgICAgICAgICAgICAgICBEZWxldGVfa2luZD00LCBBc3NpZ25fa2luZD01LCBBdWdBc3NpZ25fa2luZD02LCBQcmludF9raW5kPTcsCisgICAgICAgICAgICAgICAgICBGb3Jfa2luZD04LCBXaGlsZV9raW5kPTksIElmX2tpbmQ9MTAsIFdpdGhfa2luZD0xMSwKKyAgICAgICAgICAgICAgICAgIFJhaXNlX2tpbmQ9MTIsIFRyeUV4Y2VwdF9raW5kPTEzLCBUcnlGaW5hbGx5X2tpbmQ9MTQsCisgICAgICAgICAgICAgICAgICBBc3NlcnRfa2luZD0xNSwgSW1wb3J0X2tpbmQ9MTYsIEltcG9ydEZyb21fa2luZD0xNywKKyAgICAgICAgICAgICAgICAgIEV4ZWNfa2luZD0xOCwgR2xvYmFsX2tpbmQ9MTksIEV4cHJfa2luZD0yMCwgUGFzc19raW5kPTIxLAorICAgICAgICAgICAgICAgICAgQnJlYWtfa2luZD0yMiwgQ29udGludWVfa2luZD0yM307CiBzdHJ1Y3QgX3N0bXQgewotICAgICAgICBlbnVtIHsgRnVuY3Rpb25EZWZfa2luZD0xLCBDbGFzc0RlZl9raW5kPTIsIFJldHVybl9raW5kPTMsCi0gICAgICAgICAgICAgICBEZWxldGVfa2luZD00LCBBc3NpZ25fa2luZD01LCBBdWdBc3NpZ25fa2luZD02LCBQcmludF9raW5kPTcsCi0gICAgICAgICAgICAgICBGb3Jfa2luZD04LCBXaGlsZV9raW5kPTksIElmX2tpbmQ9MTAsIFdpdGhfa2luZD0xMSwKLSAgICAgICAgICAgICAgIFJhaXNlX2tpbmQ9MTIsIFRyeUV4Y2VwdF9raW5kPTEzLCBUcnlGaW5hbGx5X2tpbmQ9MTQsCi0gICAgICAgICAgICAgICBBc3NlcnRfa2luZD0xNSwgSW1wb3J0X2tpbmQ9MTYsIEltcG9ydEZyb21fa2luZD0xNywKLSAgICAgICAgICAgICAgIEV4ZWNfa2luZD0xOCwgR2xvYmFsX2tpbmQ9MTksIEV4cHJfa2luZD0yMCwgUGFzc19raW5kPTIxLAotICAgICAgICAgICAgICAgQnJlYWtfa2luZD0yMiwgQ29udGludWVfa2luZD0yMyB9IGtpbmQ7CisgICAgICAgIGVudW0gX3N0bXRfa2luZCBraW5kOwogICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbmFtZTsKQEAgLTE4MSwxMiArMTgzLDE0IEBACiAgICAgICAgIGludCBjb2xfb2Zmc2V0OwogfTsKIAorZW51bSBfZXhwcl9raW5kIHtCb29sT3Bfa2luZD0xLCBCaW5PcF9raW5kPTIsIFVuYXJ5T3Bfa2luZD0zLCBMYW1iZGFfa2luZD00LAorICAgICAgICAgICAgICAgICAgSWZFeHBfa2luZD01LCBEaWN0X2tpbmQ9NiwgTGlzdENvbXBfa2luZD03LAorICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yRXhwX2tpbmQ9OCwgWWllbGRfa2luZD05LCBDb21wYXJlX2tpbmQ9MTAsCisgICAgICAgICAgICAgICAgICBDYWxsX2tpbmQ9MTEsIFJlcHJfa2luZD0xMiwgTnVtX2tpbmQ9MTMsIFN0cl9raW5kPTE0LAorICAgICAgICAgICAgICAgICAgQXR0cmlidXRlX2tpbmQ9MTUsIFN1YnNjcmlwdF9raW5kPTE2LCBOYW1lX2tpbmQ9MTcsCisgICAgICAgICAgICAgICAgICBMaXN0X2tpbmQ9MTgsIFR1cGxlX2tpbmQ9MTl9Owogc3RydWN0IF9leHByIHsKLSAgICAgICAgZW51bSB7IEJvb2xPcF9raW5kPTEsIEJpbk9wX2tpbmQ9MiwgVW5hcnlPcF9raW5kPTMsIExhbWJkYV9raW5kPTQsCi0gICAgICAgICAgICAgICBJZkV4cF9raW5kPTUsIERpY3Rfa2luZD02LCBMaXN0Q29tcF9raW5kPTcsIEdlbmVyYXRvckV4cF9raW5kPTgsCi0gICAgICAgICAgICAgICBZaWVsZF9raW5kPTksIENvbXBhcmVfa2luZD0xMCwgQ2FsbF9raW5kPTExLCBSZXByX2tpbmQ9MTIsCi0gICAgICAgICAgICAgICBOdW1fa2luZD0xMywgU3RyX2tpbmQ9MTQsIEF0dHJpYnV0ZV9raW5kPTE1LCBTdWJzY3JpcHRfa2luZD0xNiwKLSAgICAgICAgICAgICAgIE5hbWVfa2luZD0xNywgTGlzdF9raW5kPTE4LCBUdXBsZV9raW5kPTE5IH0ga2luZDsKKyAgICAgICAgZW51bSBfZXhwcl9raW5kIGtpbmQ7CiAgICAgICAgIHVuaW9uIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbG9wX3R5IG9wOwpAQCAtMjM2LDcgKzI0MCw3IEBACiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgbGVmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpvcHM7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX2ludF9zZXEgKm9wczsKICAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpjb21wYXJhdG9yczsKICAgICAgICAgICAgICAgICB9IENvbXBhcmU7CiAgICAgICAgICAgICAgICAgCkBAIC0yOTIsOSArMjk2LDkgQEAKICAgICAgICAgaW50IGNvbF9vZmZzZXQ7CiB9OwogCitlbnVtIF9zbGljZV9raW5kIHtFbGxpcHNpc19raW5kPTEsIFNsaWNlX2tpbmQ9MiwgRXh0U2xpY2Vfa2luZD0zLCBJbmRleF9raW5kPTR9Owogc3RydWN0IF9zbGljZSB7Ci0gICAgICAgIGVudW0geyBFbGxpcHNpc19raW5kPTEsIFNsaWNlX2tpbmQ9MiwgRXh0U2xpY2Vfa2luZD0zLCBJbmRleF9raW5kPTQgfQotICAgICAgICAgICAgICAga2luZDsKKyAgICAgICAgZW51bSBfc2xpY2Vfa2luZCBraW5kOwogICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgbG93ZXI7CkBAIC0zMjMsNiArMzI3LDggQEAKICAgICAgICAgZXhwcl90eSB0eXBlOwogICAgICAgICBleHByX3R5IG5hbWU7CiAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICBpbnQgbGluZW5vOworICAgICAgICBpbnQgY29sX29mZnNldDsKIH07CiAKIHN0cnVjdCBfYXJndW1lbnRzIHsKQEAgLTQwMyw3ICs0MDksNyBAQAogZXhwcl90eSBHZW5lcmF0b3JFeHAoZXhwcl90eSBlbHQsIGFzZGxfc2VxICogZ2VuZXJhdG9ycywgaW50IGxpbmVubywgaW50CiAgICAgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CiBleHByX3R5IFlpZWxkKGV4cHJfdHkgdmFsdWUsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7Ci1leHByX3R5IENvbXBhcmUoZXhwcl90eSBsZWZ0LCBhc2RsX3NlcSAqIG9wcywgYXNkbF9zZXEgKiBjb21wYXJhdG9ycywgaW50CitleHByX3R5IENvbXBhcmUoZXhwcl90eSBsZWZ0LCBhc2RsX2ludF9zZXEgKiBvcHMsIGFzZGxfc2VxICogY29tcGFyYXRvcnMsIGludAogICAgICAgICAgICAgICAgIGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKIGV4cHJfdHkgQ2FsbChleHByX3R5IGZ1bmMsIGFzZGxfc2VxICogYXJncywgYXNkbF9zZXEgKiBrZXl3b3JkcywgZXhwcl90eQogICAgICAgICAgICAgIHN0YXJhcmdzLCBleHByX3R5IGt3YXJncywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEKQEAgLTQyNyw4ICs0MzMsOCBAQAogc2xpY2VfdHkgSW5kZXgoZXhwcl90eSB2YWx1ZSwgUHlBcmVuYSAqYXJlbmEpOwogY29tcHJlaGVuc2lvbl90eSBjb21wcmVoZW5zaW9uKGV4cHJfdHkgdGFyZ2V0LCBleHByX3R5IGl0ZXIsIGFzZGxfc2VxICogaWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKTsKLWV4Y2VwdGhhbmRsZXJfdHkgZXhjZXB0aGFuZGxlcihleHByX3R5IHR5cGUsIGV4cHJfdHkgbmFtZSwgYXNkbF9zZXEgKiBib2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKTsKK2V4Y2VwdGhhbmRsZXJfdHkgZXhjZXB0aGFuZGxlcihleHByX3R5IHR5cGUsIGV4cHJfdHkgbmFtZSwgYXNkbF9zZXEgKiBib2R5LCBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CiBhcmd1bWVudHNfdHkgYXJndW1lbnRzKGFzZGxfc2VxICogYXJncywgaWRlbnRpZmllciB2YXJhcmcsIGlkZW50aWZpZXIga3dhcmcsCiAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICogZGVmYXVsdHMsIFB5QXJlbmEgKmFyZW5hKTsKIGtleXdvcmRfdHkga2V5d29yZChpZGVudGlmaWVyIGFyZywgZXhwcl90eSB2YWx1ZSwgUHlBcmVuYSAqYXJlbmEpOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9hYnN0cmFjdC5oIGIvSW5jbHVkZS9hYnN0cmFjdC5oCmluZGV4IGI3NmYyNTcuLmQ0YmQ1ODggMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYWJzdHJhY3QuaAorKysgYi9JbmNsdWRlL2Fic3RyYWN0LmgKQEAgLTQsNiArNCwxMSBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAorI2lmZGVmIFBZX1NTSVpFX1RfQ0xFQU4KKyNkZWZpbmUgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQKKyNkZWZpbmUgUHlPYmplY3RfQ2FsbE1ldGhvZCBfUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVAorI2VuZGlmCisKIC8qIEFic3RyYWN0IE9iamVjdCBJbnRlcmZhY2UgKG1hbnkgdGhhbmtzIHRvIEppbSBGdWx0b24pICovCiAKIC8qCkBAIC0zMzcsNiArMzQyLDExIEBACiAJIFB5dGhvbiBleHByZXNzaW9uOiBvLm1ldGhvZChhcmdzKS4KICAgICAgICAqLwogCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVChQeU9iamVjdCAqY2FsbGFibGUsCisJCQkJCQkJIGNoYXIgKmZvcm1hdCwgLi4uKTsKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVChQeU9iamVjdCAqbywKKwkJCQkJCSAgICAgICBjaGFyICpuYW1lLAorCQkJCQkJICAgICAgIGNoYXIgKmZvcm1hdCwgLi4uKTsKIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoUHlPYmplY3QgKmNhbGxhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvYXNkbC5oIGIvSW5jbHVkZS9hc2RsLmgKaW5kZXggYzFjNTYwMy4uODRlODM3ZSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9hc2RsLmgKKysrIGIvSW5jbHVkZS9hc2RsLmgKQEAgLTUsNyArNSw5IEBACiB0eXBlZGVmIFB5T2JqZWN0ICogc3RyaW5nOwogdHlwZWRlZiBQeU9iamVjdCAqIG9iamVjdDsKIAorI2lmbmRlZiBfX2NwbHVzcGx1cwogdHlwZWRlZiBlbnVtIHtmYWxzZSwgdHJ1ZX0gYm9vbDsKKyNlbmRpZgogCiAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSBjb2RlIGdlbmVyYXRlZCBieSBhc2RsX2MucHkgd2FzIGNvbXBsZXRlbHkKICAgIGluZGVwZW5kZW50IG9mIFB5dGhvbiwgYnV0IGl0IGlzIGEgZ29hbCB0aGUgcmVxdWlyZXMgdG9vIG11Y2ggd29yawpAQCAtMjAsNyArMjIsMTMgQEAKICAgICB2b2lkICplbGVtZW50c1sxXTsKIH0gYXNkbF9zZXE7CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgZWxlbWVudHNbMV07Cit9IGFzZGxfaW50X3NlcTsKKwogYXNkbF9zZXEgKmFzZGxfc2VxX25ldyhpbnQgc2l6ZSwgUHlBcmVuYSAqYXJlbmEpOworYXNkbF9pbnRfc2VxICphc2RsX2ludF9zZXFfbmV3KGludCBzaXplLCBQeUFyZW5hICphcmVuYSk7CiAKICNkZWZpbmUgYXNkbF9zZXFfR0VUKFMsIEkpIChTKS0+ZWxlbWVudHNbKEkpXQogI2RlZmluZSBhc2RsX3NlcV9MRU4oUykgKChTKSA9PSBOVUxMID8gMCA6IChTKS0+c2l6ZSkKZGlmZiAtLWdpdCBhL0luY2x1ZGUvY29kZS5oIGIvSW5jbHVkZS9jb2RlLmgKaW5kZXggYTQ1MDllMy4uMjNkOWUxNyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9jb2RlLmgKKysrIGIvSW5jbHVkZS9jb2RlLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIC8qIFRoZXNlIGFyZSBubyBsb25nZXIgdXNlZC4gKi8KICNkZWZpbmUgQ09fR0VORVJBVE9SX0FMTE9XRUQgICAgMHgxMDAwCiAjZGVmaW5lIENPX0ZVVFVSRV9ESVZJU0lPTiAgICAJMHgyMDAwCi0jZGVmaW5lIENPX0ZVVFVSRV9BQlNJTVBPUlQJMHg0MDAwIC8qIGFic29sdXRlIGltcG9ydCBieSBkZWZhdWx0ICovCisjZGVmaW5lIENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQgMHg0MDAwIC8qIGRvIGFic29sdXRlIGltcG9ydHMgYnkgZGVmYXVsdCAqLwogI2RlZmluZSBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQgIDB4ODAwMAogI2VuZGlmCiAKQEAgLTcyLDYgKzcyLDIxIEBACiAJKCgqKGNvKS0+Y29fY29kZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyLT5iZl9nZXRyZWFkYnVmZmVyKSBcCiAJICgoY28pLT5jb19jb2RlLCAwLCAodm9pZCAqKikocHApKSkKIAordHlwZWRlZiBzdHJ1Y3QgX2FkZHJfcGFpciB7CisgICAgICAgIGludCBhcF9sb3dlcjsKKyAgICAgICAgaW50IGFwX3VwcGVyOworfSBQeUFkZHJQYWlyOworCisvKiBDaGVjayB3aGV0aGVyIGxhc3RpIChhbiBpbnN0cnVjdGlvbiBvZmZzZXQpIGZhbGxzIG91dHNpZGUgYm91bmRzCisgICBhbmQgd2hldGhlciBpdCBpcyBhIGxpbmUgbnVtYmVyIHRoYXQgc2hvdWxkIGJlIHRyYWNlZC4gIFJldHVybnMKKyAgIGEgbGluZSBudW1iZXIgaWYgaXQgc2hvdWxkIGJlIHRyYWNlZCBvciAtMSBpZiB0aGUgbGluZSBzaG91bGQgbm90LgorCisgICBJZiBsYXN0aSBpcyBub3Qgd2l0aGluIGJvdW5kcywgdXBkYXRlcyBib3VuZHMuCisqLworCitQeUFQSV9GVU5DKGludCkgUHlDb2RlX0NoZWNrTGluZU51bWJlcihQeUNvZGVPYmplY3QqIGNvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RpLCBQeUFkZHJQYWlyICpib3VuZHMpOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9jb21waWxlLmggYi9JbmNsdWRlL2NvbXBpbGUuaAppbmRleCA0YWM2OTgyLi4yYmRlNmZiIDEwMDY0NAotLS0gYS9JbmNsdWRlL2NvbXBpbGUuaAorKysgYi9JbmNsdWRlL2NvbXBpbGUuaApAQCAtMjIsNyArMjIsNyBAQAogI2RlZmluZSBGVVRVUkVfTkVTVEVEX1NDT1BFUyAibmVzdGVkX3Njb3BlcyIKICNkZWZpbmUgRlVUVVJFX0dFTkVSQVRPUlMgImdlbmVyYXRvcnMiCiAjZGVmaW5lIEZVVFVSRV9ESVZJU0lPTiAiZGl2aXNpb24iCi0jZGVmaW5lIEZVVFVSRV9BQlNJTVBPUlQgImFic29sdXRlX2ltcG9ydCIKKyNkZWZpbmUgRlVUVVJFX0FCU09MVVRFX0lNUE9SVCAiYWJzb2x1dGVfaW1wb3J0IgogI2RlZmluZSBGVVRVUkVfV0lUSF9TVEFURU1FTlQgIndpdGhfc3RhdGVtZW50IgogCiBzdHJ1Y3QgX21vZDsgLyogRGVjbGFyZSB0aGUgZXhpc3RlbmNlIG9mIHRoaXMgdHlwZSAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9nZW5vYmplY3QuaCBiL0luY2x1ZGUvZ2Vub2JqZWN0LmgKaW5kZXggZjQyMjZlZC4uY2E4NDQzMiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9nZW5vYmplY3QuaAorKysgYi9JbmNsdWRlL2dlbm9iamVjdC5oCkBAIC0xMyw2ICsxMyw3IEBACiAJUHlPYmplY3RfSEVBRAogCS8qIFRoZSBnaV8gcHJlZml4IGlzIGludGVuZGVkIHRvIHJlbWluZCBvZiBnZW5lcmF0b3ItaXRlcmF0b3IuICovCiAKKwkvKiBOb3RlOiBnaV9mcmFtZSBjYW4gYmUgTlVMTCBpZiB0aGUgZ2VuZXJhdG9yIGlzICJmaW5pc2hlZCIgKi8KIAlzdHJ1Y3QgX2ZyYW1lICpnaV9mcmFtZTsKIAogCS8qIFRydWUgaWYgZ2VuZXJhdG9yIGlzIGJlaW5nIGV4ZWN1dGVkLiAqLwpAQCAtMjgsNiArMjksNyBAQAogI2RlZmluZSBQeUdlbl9DaGVja0V4YWN0KG9wKSAoKG9wKS0+b2JfdHlwZSA9PSAmUHlHZW5fVHlwZSkKIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUdlbl9OZXcoc3RydWN0IF9mcmFtZSAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUdlbl9OZWVkc0ZpbmFsaXppbmcoUHlHZW5PYmplY3QgKik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9tb2RzdXBwb3J0LmggYi9JbmNsdWRlL21vZHN1cHBvcnQuaAppbmRleCBjMzU2ZjAzLi4yM2Q1ZDNhIDEwMDY0NAotLS0gYS9JbmNsdWRlL21vZHN1cHBvcnQuaAorKysgYi9JbmNsdWRlL21vZHN1cHBvcnQuaApAQCAtMTcsOCArMTcsMTAgQEAKICNkZWZpbmUgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzCV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKICNkZWZpbmUgUHlBcmdfVmFQYXJzZQkJCV9QeUFyZ19WYVBhcnNlX1NpemVUCiAjZGVmaW5lIFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzCV9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVAotI2RlZmluZSBQeUFyZ19CdWlsZFZhbHVlCQlfUHlBcmdfQnVpbGRWYWx1ZV9TaXplVAotI2RlZmluZSBQeUFyZ19WYUJ1aWxkVmFsdWUJCV9QeUFyZ19WYUJ1aWxkVmFsdWVfU2l6ZVQKKyNkZWZpbmUgUHlfQnVpbGRWYWx1ZQkJCV9QeV9CdWlsZFZhbHVlX1NpemVUCisjZGVmaW5lIFB5X1ZhQnVpbGRWYWx1ZQkJCV9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQKKyNlbHNlCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKICNlbmRpZgogCiBQeUFQSV9GVU5DKGludCkgUHlBcmdfUGFyc2UoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pOwpAQCAtMjcsNiArMjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIC4uLik7CiBQeUFQSV9GVU5DKGludCkgUHlBcmdfVW5wYWNrVHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90LCAuLi4pOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeV9CdWlsZFZhbHVlKGNvbnN0IGNoYXIgKiwgLi4uKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5X0J1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqLCAuLi4pOwogUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19Ob0tleXdvcmRzKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBQeU9iamVjdCAqa3cpOwogCiBQeUFQSV9GVU5DKGludCkgUHlBcmdfVmFQYXJzZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vYmplY3QuaCBiL0luY2x1ZGUvb2JqZWN0LmgKaW5kZXggOTE5ODAwNy4uY2RiZGRmZSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9vYmplY3QuaAorKysgYi9JbmNsdWRlL29iamVjdC5oCkBAIC0zMjcsNiArMzI3LDcgQEAKIAlQeV9zc2l6ZV90IHRwX2FsbG9jczsKIAlQeV9zc2l6ZV90IHRwX2ZyZWVzOwogCVB5X3NzaXplX3QgdHBfbWF4YWxsb2M7CisJc3RydWN0IF90eXBlb2JqZWN0ICp0cF9wcmV2OwogCXN0cnVjdCBfdHlwZW9iamVjdCAqdHBfbmV4dDsKICNlbmRpZgogfSBQeVR5cGVPYmplY3Q7CkBAIC01NjYsNiArNTY3LDkgQEAKIFB5QVBJX0RBVEEoUHlfc3NpemVfdCkgX1B5X1JlZlRvdGFsOwogUHlBUElfRlVOQyh2b2lkKSBfUHlfTmVnYXRpdmVSZWZjb3VudChjb25zdCBjaGFyICpmbmFtZSwKIAkJCQkJICAgIGludCBsaW5lbm8sIFB5T2JqZWN0ICpvcCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeURpY3RfRHVtbXkodm9pZCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVNldF9EdW1teSh2b2lkKTsKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5X0dldFJlZlRvdGFsKHZvaWQpOwogI2RlZmluZSBfUHlfSU5DX1JFRlRPVEFMCV9QeV9SZWZUb3RhbCsrCiAjZGVmaW5lIF9QeV9ERUNfUkVGVE9UQUwJX1B5X1JlZlRvdGFsLS0KICNkZWZpbmUgX1B5X1JFRl9ERUJVR19DT01NQQksCkBAIC01ODMsOCArNTg3LDkgQEAKIAogI2lmZGVmIENPVU5UX0FMTE9DUwogUHlBUElfRlVOQyh2b2lkKSBpbmNfY291bnQoUHlUeXBlT2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBkZWNfY291bnQoUHlUeXBlT2JqZWN0ICopOwogI2RlZmluZSBfUHlfSU5DX1RQQUxMT0NTKE9QKQlpbmNfY291bnQoKE9QKS0+b2JfdHlwZSkKLSNkZWZpbmUgX1B5X0lOQ19UUEZSRUVTKE9QKQkoT1ApLT5vYl90eXBlLT50cF9mcmVlcysrCisjZGVmaW5lIF9QeV9JTkNfVFBGUkVFUyhPUCkJZGVjX2NvdW50KChPUCktPm9iX3R5cGUpCiAjZGVmaW5lIF9QeV9ERUNfVFBGUkVFUyhPUCkJKE9QKS0+b2JfdHlwZS0+dHBfZnJlZXMtLQogI2RlZmluZSBfUHlfQ09VTlRfQUxMT0NTX0NPTU1BCSwKICNlbHNlCkBAIC02MzAsNiArNjM1LDQwIEBACiAJZWxzZQkJCQkJCVwKIAkJX1B5X0RlYWxsb2MoKFB5T2JqZWN0ICopKG9wKSkKIAorLyogU2FmZWx5IGRlY3JlZiBgb3BgIGFuZCBzZXQgYG9wYCB0byBOVUxMLCBlc3BlY2lhbGx5IHVzZWZ1bCBpbiB0cF9jbGVhcgorICogYW5kIHRwX2RlYWxsb2MgaW1wbGVtZW50YXRvbnMuCisgKgorICogTm90ZSB0aGF0ICJ0aGUgb2J2aW91cyIgY29kZSBjYW4gYmUgZGVhZGx5OgorICoKKyAqICAgICBQeV9YREVDUkVGKG9wKTsKKyAqICAgICBvcCA9IE5VTEw7CisgKgorICogVHlwaWNhbGx5LCBgb3BgIGlzIHNvbWV0aGluZyBsaWtlIHNlbGYtPmNvbnRhaW5lZSwgYW5kIGBzZWxmYCBpcyBkb25lCisgKiB1c2luZyBpdHMgYGNvbnRhaW5lZWAgbWVtYmVyLiAgSW4gdGhlIGNvZGUgc2VxdWVuY2UgYWJvdmUsIHN1cHBvc2UKKyAqIGBjb250YWluZWVgIGlzIG5vbi1OVUxMIHdpdGggYSByZWZjb3VudCBvZiAxLiAgSXRzIHJlZmNvdW50IGZhbGxzIHRvCisgKiAwIG9uIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBjYW4gdHJpZ2dlciBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIGNvZGUsCisgKiBwb3NzaWJseSBpbmNsdWRpbmcgZmluYWxpemVycyAobGlrZSBfX2RlbF9fIG1ldGhvZHMgb3Igd2Vha3JlZiBjYWxsYmFja3MpCisgKiBjb2RlZCBpbiBQeXRob24sIHdoaWNoIGluIHR1cm4gY2FuIHJlbGVhc2UgdGhlIEdJTCBhbmQgYWxsb3cgb3RoZXIgdGhyZWFkcworICogdG8gcnVuLCBldGMuICBTdWNoIGNvZGUgbWF5IGV2ZW4gaW52b2tlIG1ldGhvZHMgb2YgYHNlbGZgIGFnYWluLCBvciBjYXVzZQorICogY3ljbGljIGdjIHRvIHRyaWdnZXIsIGJ1dC0tIG9vcHMhIC0tc2VsZi0+Y29udGFpbmVlIHN0aWxsIHBvaW50cyB0byB0aGUKKyAqIG9iamVjdCBiZWluZyB0b3JuIGRvd24sIGFuZCBpdCBtYXkgYmUgaW4gYW4gaW5zYW5lIHN0YXRlIHdoaWxlIGJlaW5nIHRvcm4KKyAqIGRvd24uICBUaGlzIGhhcyBpbiBmYWN0IGJlZW4gYSByaWNoIGhpc3RvcmljIHNvdXJjZSBvZiBtaXNlcmFibGUgKHJhcmUgJgorICogaGFyZC10by1kaWFnbm9zZSkgc2VnZmF1bHRpbmcgKGFuZCBvdGhlcikgYnVncy4KKyAqCisgKiBUaGUgc2FmZSB3YXkgaXM6CisgKgorICogICAgICBQeV9DTEVBUihvcCk7CisgKgorICogVGhhdCBhcnJhbmdlcyB0byBzZXQgYG9wYCB0byBOVUxMIF9iZWZvcmVfIGRlY3JlZidpbmcsIHNvIHRoYXQgYW55IGNvZGUKKyAqIHRyaWdnZXJlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIGBvcGAgZ2V0dGluZyB0b3JuIGRvd24gbm8gbG9uZ2VyIGJlbGlldmVzCisgKiBgb3BgIHBvaW50cyB0byBhIHZhbGlkIG9iamVjdC4KKyAqCisgKiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgaXQncyBzYWZlIHRvIHVzZSB0aGUgbmFpdmUgY29kZSwgYnV0IHRoZXkncmUgYnJpdHRsZS4KKyAqIEZvciBleGFtcGxlLCBpZiBgb3BgIHBvaW50cyB0byBhIFB5dGhvbiBpbnRlZ2VyLCB5b3Uga25vdyB0aGF0IGRlc3Ryb3lpbmcKKyAqIG9uZSBvZiB0aG9zZSBjYW4ndCBjYXVzZSBwcm9ibGVtcyAtLSBidXQgaW4gcGFydCB0aGF0IHJlbGllcyBvbiB0aGF0CisgKiBQeXRob24gaW50ZWdlcnMgYXJlbid0IGN1cnJlbnRseSB3ZWFrbHkgcmVmZXJlbmNhYmxlLiAgQmVzdCBwcmFjdGljZSBpcworICogdG8gdXNlIFB5X0NMRUFSKCkgZXZlbiBpZiB5b3UgY2FuJ3QgdGhpbmsgb2YgYSByZWFzb24gZm9yIHdoeSB5b3UgbmVlZCB0by4KKyAqLwogI2RlZmluZSBQeV9DTEVBUihvcCkJCQkJXAogICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCiAgICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJXApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vYmppbXBsLmggYi9JbmNsdWRlL29iamltcGwuaAppbmRleCA3YzY4MTk0Li4wM2I2YThkIDEwMDY0NAotLS0gYS9JbmNsdWRlL29iamltcGwuaAorKysgYi9JbmNsdWRlL29iamltcGwuaApAQCAtMTAxLDcgKzEwMSw3IEBACiAKIC8qIE1hY3JvcyAqLwogI2lmZGVmIFdJVEhfUFlNQUxMT0MKLSNpZmRlZiBQWU1BTExPQ19ERUJVRworI2lmZGVmIFBZTUFMTE9DX0RFQlVHCS8qIFdJVEhfUFlNQUxMT0MgJiYgUFlNQUxMT0NfREVCVUcgKi8KIFB5QVBJX0ZVTkModm9pZCAqKSBfUHlPYmplY3RfRGVidWdNYWxsb2Moc2l6ZV90IG5ieXRlcyk7CiBQeUFQSV9GVU5DKHZvaWQgKikgX1B5T2JqZWN0X0RlYnVnUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbmJ5dGVzKTsKIFB5QVBJX0ZVTkModm9pZCkgX1B5T2JqZWN0X0RlYnVnRnJlZSh2b2lkICpwKTsKQEAgLTEyNCwxMSArMTI0LDcgQEAKICNlbHNlCS8qICEgV0lUSF9QWU1BTExPQyAqLwogI2RlZmluZSBQeU9iamVjdF9NQUxMT0MJCVB5TWVtX01BTExPQwogI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DCVB5TWVtX1JFQUxMT0MKLS8qIFRoaXMgaXMgYW4gb2RkIG9uZSEgIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGV4dGVuc2lvbnMsIHRoZQotICAgUHlNZW0gInJlbGVhc2UgbWVtb3J5IiBmdW5jdGlvbnMgaGF2ZSB0byBpbnZva2UgdGhlIG9iamVjdCBhbGxvY2F0b3IncwotICAgZnJlZSgpIGZ1bmN0aW9uLiAgV2hlbiBweW1hbGxvYyBpc24ndCBlbmFibGVkLCB0aGF0IGxlYXZlcyB1cyB1c2luZwotICAgdGhlIHBsYXRmb3JtIGZyZWUoKS4gKi8KLSNkZWZpbmUgUHlPYmplY3RfRlJFRQkJZnJlZQorI2RlZmluZSBQeU9iamVjdF9GUkVFCQlQeU1lbV9GUkVFCiAKICNlbmRpZgkvKiBXSVRIX1BZTUFMTE9DICovCiAKQEAgLTMwNywxMyArMzAzLDEzIEBACiAgKiAidmlzaXQiIGFuZCAiYXJnIi4gIFRoaXMgaXMgaW50ZW5kZWQgdG8ga2VlcCB0cF90cmF2ZXJzZSBmdW5jdGlvbnMKICAqIGxvb2tpbmcgYXMgbXVjaCBhbGlrZSBhcyBwb3NzaWJsZS4KICAqLwotI2RlZmluZSBQeV9WSVNJVChvcCkJCQkJCVwKLSAgICAgICAgZG8geyAJCQkJCQlcCi0gICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2cmV0ID0gdmlzaXQoKG9wKSwgYXJnKTsJXAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZyZXQpCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsJCVwKLSAgICAgICAgICAgICAgICB9CQkJCQlcCisjZGVmaW5lIFB5X1ZJU0lUKG9wKQkJCQkJCQlcCisgICAgICAgIGRvIHsgCQkJCQkJCQlcCisgICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJCQkJXAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZyZXQgPSB2aXNpdCgoUHlPYmplY3QgKikob3ApLCBhcmcpOwlcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnJldCkJCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZyZXQ7CQkJCVwKKyAgICAgICAgICAgICAgICB9CQkJCQkJCVwKICAgICAgICAgfSB3aGlsZSAoMCkKIAogLyogVGhpcyBpcyBoZXJlIGZvciB0aGUgc2FrZSBvZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEV4dGVuc2lvbnMgdGhhdApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weW1lbS5oIGIvSW5jbHVkZS9weW1lbS5oCmluZGV4IGY4YWVmMjkuLjY3MWY5NjcgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHltZW0uaAorKysgYi9JbmNsdWRlL3B5bWVtLmgKQEAgLTU5LDYgKzU5LDcgQEAKIC8qIFJlZGlyZWN0IGFsbCBtZW1vcnkgb3BlcmF0aW9ucyB0byBQeXRob24ncyBkZWJ1Z2dpbmcgYWxsb2NhdG9yLiAqLwogI2RlZmluZSBQeU1lbV9NQUxMT0MJCVB5T2JqZWN0X01BTExPQwogI2RlZmluZSBQeU1lbV9SRUFMTE9DCQlQeU9iamVjdF9SRUFMTE9DCisjZGVmaW5lIFB5TWVtX0ZSRUUJCVB5T2JqZWN0X0ZSRUUKIAogI2Vsc2UJLyogISBQWU1BTExPQ19ERUJVRyAqLwogCkBAIC02OCwxNCArNjksMTAgQEAKICAgIHB5bWFsbG9jLiBUbyBzb2x2ZSB0aGVzZSBwcm9ibGVtcywgYWxsb2NhdGUgYW4gZXh0cmEgYnl0ZS4gKi8KICNkZWZpbmUgUHlNZW1fTUFMTE9DKG4pICAgICAgICAgbWFsbG9jKChuKSA/IChuKSA6IDEpCiAjZGVmaW5lIFB5TWVtX1JFQUxMT0MocCwgbikgICAgIHJlYWxsb2MoKHApLCAobikgPyAobikgOiAxKQorI2RlZmluZSBQeU1lbV9GUkVFCQlmcmVlCiAKICNlbmRpZgkvKiBQWU1BTExPQ19ERUJVRyAqLwogCi0vKiBJbiBvcmRlciB0byBhdm9pZCBicmVha2luZyBvbGQgY29kZSBtaXhpbmcgUHlPYmplY3Rfe05ldywgTkVXfSB3aXRoCi0gICBQeU1lbV97RGVsLCBERUx9IGFuZCBQeU1lbV97RnJlZSwgRlJFRX0sIHRoZSBQeU1lbSAicmVsZWFzZSBtZW1vcnkiCi0gICBmdW5jdGlvbnMgaGF2ZSB0byBiZSByZWRpcmVjdGVkIHRvIHRoZSBvYmplY3QgZGVhbGxvY2F0b3IuICovCi0jZGVmaW5lIFB5TWVtX0ZSRUUgICAgICAgICAgIAlQeU9iamVjdF9GUkVFCi0KIC8qCiAgKiBUeXBlLW9yaWVudGVkIG1lbW9yeSBpbnRlcmZhY2UKICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtOTUsMTEgKzkyLDExIEBACiAjZGVmaW5lIFB5TWVtX1JFU0laRShwLCB0eXBlLCBuKSBcCiAJKCAocCkgPSAodHlwZSAqKSBQeU1lbV9SRUFMTE9DKChwKSwgKG4pICogc2l6ZW9mKHR5cGUpKSApCiAKLS8qIEluIG9yZGVyIHRvIGF2b2lkIGJyZWFraW5nIG9sZCBjb2RlIG1peGluZyBQeU9iamVjdF97TmV3LCBORVd9IHdpdGgKLSAgIFB5TWVtX3tEZWwsIERFTH0gYW5kIFB5TWVtX3tGcmVlLCBGUkVFfSwgdGhlIFB5TWVtICJyZWxlYXNlIG1lbW9yeSIKLSAgIGZ1bmN0aW9ucyBoYXZlIHRvIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIG9iamVjdCBkZWFsbG9jYXRvci4gKi8KLSNkZWZpbmUgUHlNZW1fRGVsCQlQeU9iamVjdF9GcmVlCi0jZGVmaW5lIFB5TWVtX0RFTAkJUHlPYmplY3RfRlJFRQorLyogUHlNZW17RGVsLERFTH0gYXJlIGxlZnQgb3ZlciBmcm9tIGFuY2llbnQgZGF5cywgYW5kIHNob3VsZG4ndCBiZSB1c2VkCisgKiBhbnltb3JlLiAgVGhleSdyZSBqdXN0IGNvbmZ1c2luZyBhbGlhc2VzIGZvciBQeU1lbV97RnJlZSxGUkVFfSBub3cuCisgKi8KKyNkZWZpbmUgUHlNZW1fRGVsCQlQeU1lbV9GcmVlCisjZGVmaW5lIFB5TWVtX0RFTAkJUHlNZW1fRlJFRQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHlwb3J0LmggYi9JbmNsdWRlL3B5cG9ydC5oCmluZGV4IDkxMTFkODYuLjJiY2U0MTUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlwb3J0LmgKKysrIGIvSW5jbHVkZS9weXBvcnQuaApAQCAtODUsNiArODUsMTAgQEAKICMgICBlcnJvciAiUHl0aG9uIG5lZWRzIGEgdHlwZWRlZiBmb3IgUHlfdWludHB0cl90IGluIHB5cG9ydC5oLiIKICNlbmRpZiAvKiBIQVZFX1VJTlRQVFJfVCAqLwogCisvKiBQeV9zc2l6ZV90IGlzIGEgc2lnbmVkIGludGVncmFsIHR5cGUgc3VjaCB0aGF0IHNpemVvZihQeV9zc2l6ZV90KSA9PQorICogc2l6ZW9mKHNpemVfdCkuICBDOTkgZG9lc24ndCBkZWZpbmUgc3VjaCBhIHRoaW5nIGRpcmVjdGx5IChzaXplX3QgaXMgYW4KKyAqIHVuc2lnbmVkIGludGVncmFsIHR5cGUpLiAgU2VlIFBFUCAzNTMgZm9yIGRldGFpbHMuCisgKi8KICNpZmRlZiBIQVZFX1NTSVpFX1QKIHR5cGVkZWYgc3NpemVfdAkJUHlfc3NpemVfdDsKICNlbGlmIFNJWkVPRl9WT0lEX1AgPT0gU0laRU9GX1NJWkVfVApAQCAtOTIsNyArOTYsNDYgQEAKICNlbHNlCiAjICAgZXJyb3IgIlB5dGhvbiBuZWVkcyBhIHR5cGVkZWYgZm9yIFB5X3NzaXplX3QgaW4gcHlwb3J0LmguIgogI2VuZGlmCisKKy8qIExhcmdlc3QgcG9zaXRpdmUgdmFsdWUgb2YgdHlwZSBQeV9zc2l6ZV90LiAqLwogI2RlZmluZSBQWV9TU0laRV9UX01BWCAoKFB5X3NzaXplX3QpKCgoc2l6ZV90KS0xKT4+MSkpCisvKiBTbWFsbGVzdCBuZWdhdGl2ZSB2YWx1ZSBvZiB0eXBlIFB5X3NzaXplX3QuICovCisjZGVmaW5lIFBZX1NTSVpFX1RfTUlOICgtUFlfU1NJWkVfVF9NQVgtMSkKKworLyogUFlfRk9STUFUX1NJWkVfVCBpcyBhIHBsYXRmb3JtLXNwZWNpZmljIG1vZGlmaWVyIGZvciB1c2UgaW4gYSBwcmludGYKKyAqIGZvcm1hdCB0byBjb252ZXJ0IGFuIGFyZ3VtZW50IHdpdGggdGhlIHdpZHRoIG9mIGEgc2l6ZV90IG9yIFB5X3NzaXplX3QuCisgKiBDOTkgaW50cm9kdWNlZCAieiIgZm9yIHRoaXMgcHVycG9zZSwgYnV0IG5vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgdGhhdDsKKyAqIGUuZy4sIE1TIGNvbXBpbGVycyB1c2UgIkkiIGluc3RlYWQuCisgKgorICogVGhlc2UgImhpZ2ggbGV2ZWwiIFB5dGhvbiBmb3JtYXQgZnVuY3Rpb25zIGludGVycHJldCAieiIgY29ycmVjdGx5IG9uCisgKiBhbGwgcGxhdGZvcm1zIChQeXRob24gaW50ZXJwcmV0cyB0aGUgZm9ybWF0IHN0cmluZyBpdHNlbGYsIGFuZCBkb2VzIHdoYXRldmVyCisgKiB0aGUgcGxhdGZvcm0gQyByZXF1aXJlcyB0byBjb252ZXJ0IGEgc2l6ZV90L1B5X3NzaXplX3QgYXJndW1lbnQpOgorICoKKyAqICAgICBQeVN0cmluZ19Gcm9tRm9ybWF0CisgKiAgICAgUHlFcnJfRm9ybWF0CisgKiAgICAgUHlTdHJpbmdfRnJvbUZvcm1hdFYKKyAqCisgKiBMb3dlci1sZXZlbCB1c2VzIHJlcXVpcmUgdGhhdCB5b3UgaW50ZXJwb2xhdGUgdGhlIGNvcnJlY3QgZm9ybWF0IG1vZGlmaWVyCisgKiB5b3Vyc2VsZiAoZS5nLiwgY2FsbGluZyBwcmludGYsIGZwcmludGYsIHNwcmludGYsIFB5T1Nfc25wcmludGYpOyBmb3IKKyAqIGV4YW1wbGUsCisgKgorICogICAgIFB5X3NzaXplX3QgaW5kZXg7CisgKiAgICAgZnByaW50ZihzdGRlcnIsICJpbmRleCAlIiBQWV9GT1JNQVRfU0laRV9UICJkIHN1Y2tzXG4iLCBpbmRleCk7CisgKgorICogVGhhdCB3aWxsIGV4cGFuZCB0byAlbGQsIG9yICVJZCwgb3IgdG8gc29tZXRoaW5nIGVsc2UgY29ycmVjdCBmb3IgYQorICogUHlfc3NpemVfdCBvbiB0aGUgcGxhdGZvcm0uCisgKi8KKyNpZm5kZWYgUFlfRk9STUFUX1NJWkVfVAorIyAgIGlmIFNJWkVPRl9TSVpFX1QgPT0gU0laRU9GX0lOVAorIyAgICAgICBkZWZpbmUgUFlfRk9STUFUX1NJWkVfVCAiIgorIyAgIGVsaWYgU0laRU9GX1NJWkVfVCA9PSBTSVpFT0ZfTE9ORworIyAgICAgICBkZWZpbmUgUFlfRk9STUFUX1NJWkVfVCAibCIKKyMgICBlbGlmIGRlZmluZWQoTVNfV0lORE9XUykKKyMgICAgICAgZGVmaW5lIFBZX0ZPUk1BVF9TSVpFX1QgIkkiCisjICAgZWxzZQorIyAgICAgICBlcnJvciAiVGhpcyBwbGF0Zm9ybSdzIHB5Y29uZmlnLmggbmVlZHMgdG8gZGVmaW5lIFBZX0ZPUk1BVF9TSVpFX1QiCisjICAgZW5kaWYKKyNlbmRpZgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKQEAgLTM2Nyw3ICs0MTAsOCBAQAogICogICAgdHlwZWRlZiBpbnQgVDEgUHlfREVQUkVDQVRFRCgyLjQpOwogICogICAgZXh0ZXJuIGludCB4KCkgUHlfREVQUkVDQVRFRCgyLjUpOwogICovCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAxKQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gPj0gNCkgfHwgXAorCQkJICAoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDEpKQogI2RlZmluZSBQeV9ERVBSRUNBVEVEKFZFUlNJT05fVU5VU0VEKSBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXykpCiAjZWxzZQogI2RlZmluZSBQeV9ERVBSRUNBVEVEKFZFUlNJT05fVU5VU0VEKQpAQCAtNDM2LDE0ICs0ODAsMTIgQEAKICNlbmRpZgogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1PbiA0LjRCU0QtZGVzY2VuZGFudHMsIGN0eXBlIGZ1bmN0aW9ucyBzZXJ2ZXMgdGhlIHdob2xlIHJhbmdlIG9mCi13Y2hhcl90IGNoYXJhY3RlciBzZXQgcmF0aGVyIHRoYW4gc2luZ2xlIGJ5dGUgY29kZSBwb2ludHMgb25seS4KLVRoaXMgY2hhcmFjdGVyaXN0aWMgY2FuIGJyZWFrIHNvbWUgb3BlcmF0aW9ucyBvZiBzdHJpbmcgb2JqZWN0Ci1pbmNsdWRpbmcgc3RyLnVwcGVyKCkgYW5kIHN0ci5zcGxpdCgpIG9uIFVURi04IGxvY2FsZXMuICBUaGlzCi13b3JrYXJvdW5kIHdhcyBwcm92aWRlZCBieSBUaW0gUm9iYmlucyBvZiBGcmVlQlNEIHByb2plY3QuICBIZSBzYWlkCi10aGUgaW5jb21wYXRpYmlsaXR5IHdpbGwgYmUgZml4ZWQgaW4gRnJlZUJTRCA2LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBPbiA0LjRCU0QtZGVzY2VuZGFudHMsIGN0eXBlIGZ1bmN0aW9ucyBzZXJ2ZXMgdGhlIHdob2xlIHJhbmdlIG9mCisgKiB3Y2hhcl90IGNoYXJhY3RlciBzZXQgcmF0aGVyIHRoYW4gc2luZ2xlIGJ5dGUgY29kZSBwb2ludHMgb25seS4KKyAqIFRoaXMgY2hhcmFjdGVyaXN0aWMgY2FuIGJyZWFrIHNvbWUgb3BlcmF0aW9ucyBvZiBzdHJpbmcgb2JqZWN0CisgKiBpbmNsdWRpbmcgc3RyLnVwcGVyKCkgYW5kIHN0ci5zcGxpdCgpIG9uIFVURi04IGxvY2FsZXMuICBUaGlzCisgKiB3b3JrYXJvdW5kIHdhcyBwcm92aWRlZCBieSBUaW0gUm9iYmlucyBvZiBGcmVlQlNEIHByb2plY3QuCisgKi8KIAogI2lmZGVmIF9fRnJlZUJTRF9fCiAjaW5jbHVkZSA8b3NyZWxkYXRlLmg+CmRpZmYgLS1naXQgYS9JbmNsdWRlL3NldG9iamVjdC5oIGIvSW5jbHVkZS9zZXRvYmplY3QuaAppbmRleCBjZWE5NWNjLi5jYzkzOTY4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3NldG9iamVjdC5oCisrKyBiL0luY2x1ZGUvc2V0b2JqZWN0LmgKQEAgLTc4LDEwICs3OCwxMyBAQAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZyb3plblNldF9OZXcoUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5U2V0X1NpemUoUHlPYmplY3QgKmFueXNldCk7CiAjZGVmaW5lIFB5U2V0X0dFVF9TSVpFKHNvKSAoKChQeVNldE9iamVjdCAqKShzbykpLT51c2VkKQorUHlBUElfRlVOQyhpbnQpIFB5U2V0X0NsZWFyKFB5T2JqZWN0ICpzZXQpOwogUHlBUElfRlVOQyhpbnQpIFB5U2V0X0NvbnRhaW5zKFB5T2JqZWN0ICphbnlzZXQsIFB5T2JqZWN0ICprZXkpOwogUHlBUElfRlVOQyhpbnQpIFB5U2V0X0Rpc2NhcmQoUHlPYmplY3QgKnNldCwgUHlPYmplY3QgKmtleSk7CiBQeUFQSV9GVU5DKGludCkgUHlTZXRfQWRkKFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICprZXkpOworUHlBUElfRlVOQyhpbnQpIF9QeVNldF9OZXh0KFB5T2JqZWN0ICpzZXQsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiplbnRyeSk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2V0X1BvcChQeU9iamVjdCAqc2V0KTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlTZXRfVXBkYXRlKFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICppdGVyYWJsZSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9zbGljZW9iamVjdC5oIGIvSW5jbHVkZS9zbGljZW9iamVjdC5oCmluZGV4IDE3ZjM2ZGMuLmRiYzM0YjIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvc2xpY2VvYmplY3QuaAorKysgYi9JbmNsdWRlL3NsaWNlb2JqZWN0LmgKQEAgLTMwLDYgKzMwLDcgQEAKIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNsaWNlX05ldyhQeU9iamVjdCogc3RhcnQsIFB5T2JqZWN0KiBzdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBzdGVwKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5U2xpY2VfRnJvbUluZGljZXMoUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBzdG9wKTsKIFB5QVBJX0ZVTkMoaW50KSBQeVNsaWNlX0dldEluZGljZXMoUHlTbGljZU9iamVjdCAqciwgUHlfc3NpemVfdCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKnN0b3AsIFB5X3NzaXplX3QgKnN0ZXApOwogUHlBUElfRlVOQyhpbnQpIFB5U2xpY2VfR2V0SW5kaWNlc0V4KFB5U2xpY2VPYmplY3QgKnIsIFB5X3NzaXplX3QgbGVuZ3RoLApkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKaW5kZXggZjBmYzYyYS4uNWFmZmVmYyAxMDA2NDQKLS0tIGEvTElDRU5TRQorKysgYi9MSUNFTlNFCkBAIC01MSw2ICs1MSw4IEBACiAgICAgMi40ICAgICAgICAgICAgIDIuMyAgICAgICAgIDIwMDQgICAgICAgIFBTRiAgICAgICAgIHllcwogICAgIDIuNC4xICAgICAgICAgICAyLjQgICAgICAgICAyMDA1ICAgICAgICBQU0YgICAgICAgICB5ZXMKICAgICAyLjQuMiAgICAgICAgICAgMi40LjEgICAgICAgMjAwNSAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi40LjMgICAgICAgICAgIDIuNC4yICAgICAgIDIwMDYgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNSAgICAgICAgICAgICAyLjQgICAgICAgICAyMDA2ICAgICAgICBQU0YgICAgICAgICB5ZXMKIAogRm9vdG5vdGVzOgogCmRpZmYgLS1naXQgYS9MaWIvUXVldWUucHkgYi9MaWIvUXVldWUucHkKaW5kZXggYzZjNjA4Yi4uNTFhZDM1NCAxMDA2NDQKLS0tIGEvTGliL1F1ZXVlLnB5CisrKyBiL0xpYi9RdWV1ZS5weQpAQCAtMzUsNiArMzUsNTEgQEAKICAgICAgICAgIyBOb3RpZnkgbm90X2Z1bGwgd2hlbmV2ZXIgYW4gaXRlbSBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlOwogICAgICAgICAjIGEgdGhyZWFkIHdhaXRpbmcgdG8gcHV0IGlzIG5vdGlmaWVkIHRoZW4uCiAgICAgICAgIHNlbGYubm90X2Z1bGwgPSB0aHJlYWRpbmcuQ29uZGl0aW9uKHNlbGYubXV0ZXgpCisgICAgICAgICMgTm90aWZ5IGFsbF90YXNrc19kb25lIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgdW5maW5pc2hlZCB0YXNrcworICAgICAgICAjIGRyb3BzIHRvIHplcm87IHRocmVhZCB3YWl0aW5nIHRvIGpvaW4oKSBpcyBub3RpZmllZCB0byByZXN1bWUKKyAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZSA9IHRocmVhZGluZy5Db25kaXRpb24oc2VsZi5tdXRleCkKKyAgICAgICAgc2VsZi51bmZpbmlzaGVkX3Rhc2tzID0gMAorCisgICAgZGVmIHRhc2tfZG9uZShzZWxmKToKKyAgICAgICAgIiIiSW5kaWNhdGUgdGhhdCBhIGZvcm1lcmx5IGVucXVldWVkIHRhc2sgaXMgY29tcGxldGUuCisKKyAgICAgICAgVXNlZCBieSBRdWV1ZSBjb25zdW1lciB0aHJlYWRzLiAgRm9yIGVhY2ggZ2V0KCkgdXNlZCB0byBmZXRjaCBhIHRhc2ssCisgICAgICAgIGEgc3Vic2VxdWVudCBjYWxsIHRvIHRhc2tfZG9uZSgpIHRlbGxzIHRoZSBxdWV1ZSB0aGF0IHRoZSBwcm9jZXNzaW5nCisgICAgICAgIG9uIHRoZSB0YXNrIGlzIGNvbXBsZXRlLgorCisgICAgICAgIElmIGEgam9pbigpIGlzIGN1cnJlbnRseSBibG9ja2luZywgaXQgd2lsbCByZXN1bWUgd2hlbiBhbGwgaXRlbXMKKyAgICAgICAgaGF2ZSBiZWVuIHByb2Nlc3NlZCAobWVhbmluZyB0aGF0IGEgdGFza19kb25lKCkgY2FsbCB3YXMgcmVjZWl2ZWQKKyAgICAgICAgZm9yIGV2ZXJ5IGl0ZW0gdGhhdCBoYWQgYmVlbiBwdXQoKSBpbnRvIHRoZSBxdWV1ZSkuCisKKyAgICAgICAgUmFpc2VzIGEgVmFsdWVFcnJvciBpZiBjYWxsZWQgbW9yZSB0aW1lcyB0aGFuIHRoZXJlIHdlcmUgaXRlbXMKKyAgICAgICAgcGxhY2VkIGluIHRoZSBxdWV1ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVuZmluaXNoZWQgPSBzZWxmLnVuZmluaXNoZWRfdGFza3MgLSAxCisgICAgICAgICAgICBpZiB1bmZpbmlzaGVkIDw9IDA6CisgICAgICAgICAgICAgICAgaWYgdW5maW5pc2hlZCA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Rhc2tfZG9uZSgpIGNhbGxlZCB0b28gbWFueSB0aW1lcycpCisgICAgICAgICAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZS5ub3RpZnlBbGwoKQorICAgICAgICAgICAgc2VsZi51bmZpbmlzaGVkX3Rhc2tzID0gdW5maW5pc2hlZAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZS5yZWxlYXNlKCkKKworICAgIGRlZiBqb2luKHNlbGYpOgorICAgICAgICAiIiJCbG9ja3MgdW50aWwgYWxsIGl0ZW1zIGluIHRoZSBRdWV1ZSBoYXZlIGJlZW4gZ290dGVuIGFuZCBwcm9jZXNzZWQuCisKKyAgICAgICAgVGhlIGNvdW50IG9mIHVuZmluaXNoZWQgdGFza3MgZ29lcyB1cCB3aGVuZXZlciBhbiBpdGVtIGlzIGFkZGVkIHRvIHRoZQorICAgICAgICBxdWV1ZS4gVGhlIGNvdW50IGdvZXMgZG93biB3aGVuZXZlciBhIGNvbnN1bWVyIHRocmVhZCBjYWxscyB0YXNrX2RvbmUoKQorICAgICAgICB0byBpbmRpY2F0ZSB0aGUgaXRlbSB3YXMgcmV0cmlldmVkIGFuZCBhbGwgd29yayBvbiBpdCBpcyBjb21wbGV0ZS4KKworICAgICAgICBXaGVuIHRoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHRhc2tzIGRyb3BzIHRvIHplcm8sIGpvaW4oKSB1bmJsb2Nrcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIHNlbGYudW5maW5pc2hlZF90YXNrczoKKyAgICAgICAgICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLndhaXQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZS5yZWxlYXNlKCkKIAogICAgIGRlZiBxc2l6ZShzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBzaXplIG9mIHRoZSBxdWV1ZSAobm90IHJlbGlhYmxlISkuIiIiCkBAIC04Niw2ICsxMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRnVsbAogICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9mdWxsLndhaXQocmVtYWluaW5nKQogICAgICAgICAgICAgc2VsZi5fcHV0KGl0ZW0pCisgICAgICAgICAgICBzZWxmLnVuZmluaXNoZWRfdGFza3MgKz0gMQogICAgICAgICAgICAgc2VsZi5ub3RfZW1wdHkubm90aWZ5KCkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHNlbGYubm90X2Z1bGwucmVsZWFzZSgpCmRpZmYgLS1naXQgYS9MaWIvU2ltcGxlWE1MUlBDU2VydmVyLnB5IGIvTGliL1NpbXBsZVhNTFJQQ1NlcnZlci5weQppbmRleCAxNTZjMmJhLi5hMGI0NGUxIDEwMDY0NAotLS0gYS9MaWIvU2ltcGxlWE1MUlBDU2VydmVyLnB5CisrKyBiL0xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHkKQEAgLTEwNCw3ICsxMDQsMTEgQEAKIGltcG9ydCBTb2NrZXRTZXJ2ZXIKIGltcG9ydCBCYXNlSFRUUFNlcnZlcgogaW1wb3J0IHN5cwotaW1wb3J0IG9zLCBmY250bAoraW1wb3J0IG9zCit0cnk6CisgICAgaW1wb3J0IGZjbnRsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZmNudGwgPSBOb25lCiAKIGRlZiByZXNvbHZlX2RvdHRlZF9hdHRyaWJ1dGUob2JqLCBhdHRyLCBhbGxvd19kb3R0ZWRfbmFtZXM9VHJ1ZSk6CiAgICAgIiIicmVzb2x2ZV9kb3R0ZWRfYXR0cmlidXRlKGEsICdiLmMuZCcpID0+IGEuYi5jLmQKQEAgLTQ5Myw3ICs0OTcsNyBAQAogICAgICAgICAjIFtCdWcgIzEyMjI3OTBdIElmIHBvc3NpYmxlLCBzZXQgY2xvc2Utb24tZXhlYyBmbGFnOyBpZiBhCiAgICAgICAgICMgbWV0aG9kIHNwYXducyBhIHN1YnByb2Nlc3MsIHRoZSBzdWJwcm9jZXNzIHNob3VsZG4ndCBoYXZlCiAgICAgICAgICMgdGhlIGxpc3RlbmluZyBzb2NrZXQgb3Blbi4KLSAgICAgICAgaWYgaGFzYXR0cihmY250bCwgJ0ZEX0NMT0VYRUMnKToKKyAgICAgICAgaWYgZmNudGwgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIoZmNudGwsICdGRF9DTE9FWEVDJyk6CiAgICAgICAgICAgICBmbGFncyA9IGZjbnRsLmZjbnRsKHNlbGYuZmlsZW5vKCksIGZjbnRsLkZfR0VURkQpCiAgICAgICAgICAgICBmbGFncyB8PSBmY250bC5GRF9DTE9FWEVDCiAgICAgICAgICAgICBmY250bC5mY250bChzZWxmLmZpbGVubygpLCBmY250bC5GX1NFVEZELCBmbGFncykKZGlmZiAtLWdpdCBhL0xpYi9fX2Z1dHVyZV9fLnB5IGIvTGliL19fZnV0dXJlX18ucHkKaW5kZXggZDk1Y2U1Zi4uZDhlMTRkMSAxMDA2NDQKLS0tIGEvTGliL19fZnV0dXJlX18ucHkKKysrIGIvTGliL19fZnV0dXJlX18ucHkKQEAgLTY0LDcgKzY0LDcgQEAKIENPX05FU1RFRCAgICAgICAgICAgID0gMHgwMDEwICAgIyBuZXN0ZWRfc2NvcGVzCiBDT19HRU5FUkFUT1JfQUxMT1dFRCA9IDAgICAgICAgICMgZ2VuZXJhdG9ycyAob2Jzb2xldGUsIHdhcyAweDEwMDApCiBDT19GVVRVUkVfRElWSVNJT04gICA9IDB4MjAwMCAgICMgZGl2aXNpb24KLUNPX0ZVVFVSRV9BQlNJTVBPUlQgID0gMHg0MDAwICAgIyBhYnNvbHV0ZV9pbXBvcnQKK0NPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQgPSAweDQwMDAgIyBwZXJmb3JtIGFic29sdXRlIGltcG9ydHMgYnkgZGVmYXVsdAogQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UICA9IDB4ODAwMCAgICMgd2l0aCBzdGF0ZW1lbnQKIAogY2xhc3MgX0ZlYXR1cmU6CkBAIC0xMDksNyArMTA5LDcgQEAKIAogYWJzb2x1dGVfaW1wb3J0ID0gX0ZlYXR1cmUoKDIsIDUsIDAsICJhbHBoYSIsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsIDcsIDAsICJhbHBoYSIsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09fRlVUVVJFX0FCU0lNUE9SVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQpCiAKIHdpdGhfc3RhdGVtZW50ID0gX0ZlYXR1cmUoKDIsIDUsIDAsICJhbHBoYSIsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgNiwgMCwgImFscGhhIiwgMCksCmRpZmYgLS1naXQgYS9MaWIvX3RocmVhZGluZ19sb2NhbC5weSBiL0xpYi9fdGhyZWFkaW5nX2xvY2FsLnB5CmluZGV4IDkwNzE3YTguLmYwY2U4NTcgMTAwNjQ0Ci0tLSBhL0xpYi9fdGhyZWFkaW5nX2xvY2FsLnB5CisrKyBiL0xpYi9fdGhyZWFkaW5nX2xvY2FsLnB5CkBAIC0xLDkgKzEsOSBAQAotIiIiVGhyZWFkLWxvY2FsIG9iamVjdHMKKyIiIlRocmVhZC1sb2NhbCBvYmplY3RzLgogCi0oTm90ZSB0aGF0IHRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgUHl0aG9uIHZlcnNpb24gb2YgdGhyZWFkCi0gdGhyZWFkaW5nLmxvY2FsIGNsYXNzLiAgRGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB5b3UncmUKLSB1c2luZywgdGhlcmUgbWF5IGJlIGEgZmFzdGVyIG9uZSBhdmFpbGFibGUuICBZb3Ugc2hvdWxkIGFsd2F5cyBpbXBvcnQKLSB0aGUgbG9jYWwgY2xhc3MgZnJvbSB0aHJlYWRpbmcuKQorKE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBwcm92aWRlcyBhIFB5dGhvbiB2ZXJzaW9uIG9mIHRoZSB0aHJlYWRpbmcubG9jYWwKKyBjbGFzcy4gIERlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBQeXRob24geW91J3JlIHVzaW5nLCB0aGVyZSBtYXkgYmUgYQorIGZhc3RlciBvbmUgYXZhaWxhYmxlLiAgWW91IHNob3VsZCBhbHdheXMgaW1wb3J0IHRoZSBgbG9jYWxgIGNsYXNzIGZyb20KKyBgdGhyZWFkaW5nYC4pCiAKIFRocmVhZC1sb2NhbCBvYmplY3RzIHN1cHBvcnQgdGhlIG1hbmFnZW1lbnQgb2YgdGhyZWFkLWxvY2FsIGRhdGEuCiBJZiB5b3UgaGF2ZSBkYXRhIHRoYXQgeW91IHdhbnQgdG8gYmUgbG9jYWwgdG8gYSB0aHJlYWQsIHNpbXBseSBjcmVhdGUKQEAgLTEzMyw3ICsxMzMsMTcgQEAKID4+PiBkZWwgbXlkYXRhCiAiIiIKIAotIyBUaHJlYWRpbmcgaW1wb3J0IGlzIGF0IGVuZAorX19hbGxfXyA9IFsibG9jYWwiXQorCisjIFdlIG5lZWQgdG8gdXNlIG9iamVjdHMgZnJvbSB0aGUgdGhyZWFkaW5nIG1vZHVsZSwgYnV0IHRoZSB0aHJlYWRpbmcKKyMgbW9kdWxlIG1heSBhbHNvIHdhbnQgdG8gdXNlIG91ciBgbG9jYWxgIGNsYXNzLCBpZiBzdXBwb3J0IGZvciBsb2NhbHMKKyMgaXNuJ3QgY29tcGlsZWQgaW4gdG8gdGhlIGB0aHJlYWRgIG1vZHVsZS4gIFRoaXMgY3JlYXRlcyBwb3RlbnRpYWwgcHJvYmxlbXMKKyMgd2l0aCBjaXJjdWxhciBpbXBvcnRzLiAgRm9yIHRoYXQgcmVhc29uLCB3ZSBkb24ndCBpbXBvcnQgYHRocmVhZGluZ2AKKyMgdW50aWwgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUgKGEgaGFjayBzdWZmaWNpZW50IHRvIHdvcm0gYXJvdW5kIHRoZQorIyBwb3RlbnRpYWwgcHJvYmxlbXMpLiAgTm90ZSB0aGF0IGFsbW9zdCBhbGwgcGxhdGZvcm1zIGRvIGhhdmUgc3VwcG9ydCBmb3IKKyMgbG9jYWxzIGluIHRoZSBgdGhyZWFkYCBtb2R1bGUsIGFuZCB0aGVyZSBpcyBubyBjaXJjdWxhciBpbXBvcnQgcHJvYmxlbQorIyB0aGVuLCBzbyBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IGZpZGRsaW5nIHRoZSBvcmRlciBvZiBpbXBvcnRzIGhlcmUgd29uJ3QKKyMgbWFuaWZlc3Qgb24gbW9zdCBib3hlcy4KIAogY2xhc3MgX2xvY2FsYmFzZShvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9ICdfbG9jYWxfX2tleScsICdfbG9jYWxfX2FyZ3MnLCAnX2xvY2FsX19sb2NrJwpAQCAtMjAyLDM2ICsyMTIsMzAgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpCiAKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHRocmVhZGluZwogCi0gICAgZGVmIF9fZGVsX18oKToKLSAgICAgICAgdGhyZWFkaW5nX2VudW1lcmF0ZSA9IGVudW1lcmF0ZQotICAgICAgICBfX2dldGF0dHJpYnV0ZV9fID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18KKyAgICAgICAga2V5ID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ19sb2NhbF9fa2V5JykKIAotICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKLSAgICAgICAgICAgIGtleSA9IF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ19sb2NhbF9fa2V5JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGhyZWFkcyA9IGxpc3QodGhyZWFkaW5nLmVudW1lcmF0ZSgpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAjIElmIGVudW1lcmF0ZSBmYWlscywgYXMgaXQgc2VlbXMgdG8gZG8gZHVyaW5nCisgICAgICAgICAgICAjIHNodXRkb3duLCB3ZSdsbCBza2lwIGNsZWFudXAgdW5kZXIgdGhlIGFzc3VtcHRpb24KKyAgICAgICAgICAgICMgdGhhdCB0aGVyZSBpcyBub3RoaW5nIHRvIGNsZWFuIHVwLgorICAgICAgICAgICAgcmV0dXJuCiAKKyAgICAgICAgZm9yIHRocmVhZCBpbiB0aHJlYWRzOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHRocmVhZHMgPSBsaXN0KHRocmVhZGluZ19lbnVtZXJhdGUoKSkKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICAjIGlmIGVudW1lcmF0ZSBmYWlscywgYXMgaXQgc2VlbXMgdG8gZG8gZHVyaW5nCi0gICAgICAgICAgICAgICAgIyBzaHV0ZG93biwgd2UnbGwgc2tpcCBjbGVhbnVwIHVuZGVyIHRoZSBhc3N1bXB0aW9uCi0gICAgICAgICAgICAgICAgIyB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgdG8gY2xlYW4gdXAKLSAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBfX2RpY3RfXyA9IHRocmVhZC5fX2RpY3RfXworICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICMgVGhyZWFkIGlzIGR5aW5nLCByZXN0IGluIHBlYWNlLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKLSAgICAgICAgICAgIGZvciB0aHJlYWQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgIGlmIGtleSBpbiBfX2RpY3RfXzoKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIF9fZGljdF9fID0gdGhyZWFkLl9fZGljdF9fCi0gICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICAjIFRocmVhZCBpcyBkeWluZywgcmVzdCBpbiBwZWFjZQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBkZWwgX19kaWN0X19ba2V5XQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcyAjIGRpZG4ndCBoYXZlIGFueXRoaW5nIGluIHRoaXMgdGhyZWFkCiAKLSAgICAgICAgICAgICAgICBpZiBrZXkgaW4gX19kaWN0X186Ci0gICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBfX2RpY3RfX1trZXldCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgIyBkaWRuJ3QgaGF2ZSBhbnl0aGluZyBpbiB0aGlzIHRocmVhZAotCi0gICAgICAgIHJldHVybiBfX2RlbF9fCi0gICAgX19kZWxfXyA9IF9fZGVsX18oKQotCi1mcm9tIHRocmVhZGluZyBpbXBvcnQgY3VycmVudFRocmVhZCwgZW51bWVyYXRlLCBSTG9jaworZnJvbSB0aHJlYWRpbmcgaW1wb3J0IGN1cnJlbnRUaHJlYWQsIFJMb2NrCmRpZmYgLS1naXQgYS9MaWIvYmRiLnB5IGIvTGliL2JkYi5weQppbmRleCA4ZjgwOGNjLi4wOGI0OGMzIDEwMDY0NAotLS0gYS9MaWIvYmRiLnB5CisrKyBiL0xpYi9iZGIucHkKQEAgLTQ3OSwxMCArNDc5LDEwIEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBkaXNwID0gJ2tlZXAgJwogICAgICAgICBpZiBzZWxmLmVuYWJsZWQ6Ci0gICAgICAgICAgICBkaXNwID0gZGlzcCArICd5ZXMnCisgICAgICAgICAgICBkaXNwID0gZGlzcCArICd5ZXMgICcKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGRpc3AgPSBkaXNwICsgJ25vICcKLSAgICAgICAgcHJpbnQgJyUtNGRicmVha3BvaW50ICAgICVzIGF0ICVzOiVkJyAlIChzZWxmLm51bWJlciwgZGlzcCwKKyAgICAgICAgICAgIGRpc3AgPSBkaXNwICsgJ25vICAgJworICAgICAgICBwcmludCAnJS00ZGJyZWFrcG9pbnQgICAlcyBhdCAlczolZCcgJSAoc2VsZi5udW1iZXIsIGRpc3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZSwgc2VsZi5saW5lKQogICAgICAgICBpZiBzZWxmLmNvbmQ6CiAgICAgICAgICAgICBwcmludCAnXHRzdG9wIG9ubHkgaWYgJXMnICUgKHNlbGYuY29uZCwpCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvX19pbml0X18ucHkgYi9MaWIvYnNkZGIvX19pbml0X18ucHkKaW5kZXggZDNlZTc3My4uYzAwNGMwOCAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL19faW5pdF9fLnB5CisrKyBiL0xpYi9ic2RkYi9fX2luaXRfXy5weQpAQCAtMjg3LDEwICsyODcsOSBAQAogICAgICAgICAgICAgY2FjaGVzaXplPU5vbmUsIGxvcmRlcj1Ob25lLCBoZmxhZ3M9MCk6CiAKICAgICBmbGFncyA9IF9jaGVja2ZsYWcoZmxhZywgZmlsZSkKLSAgICBlID0gX29wZW5EQkVudigpCisgICAgZSA9IF9vcGVuREJFbnYoY2FjaGVzaXplKQogICAgIGQgPSBkYi5EQihlKQogICAgIGQuc2V0X2ZsYWdzKGhmbGFncykKLSAgICBpZiBjYWNoZXNpemUgaXMgbm90IE5vbmU6IGQuc2V0X2NhY2hlc2l6ZSgwLCBjYWNoZXNpemUpCiAgICAgaWYgcGdzaXplIGlzIG5vdCBOb25lOiAgICBkLnNldF9wYWdlc2l6ZShwZ3NpemUpCiAgICAgaWYgbG9yZGVyIGlzIG5vdCBOb25lOiAgICBkLnNldF9sb3JkZXIobG9yZGVyKQogICAgIGlmIGZmYWN0b3IgaXMgbm90IE5vbmU6ICAgZC5zZXRfaF9mZmFjdG9yKGZmYWN0b3IpCkBAIC0zMDUsOSArMzA0LDggQEAKICAgICAgICAgICAgIHBnc2l6ZT1Ob25lLCBsb3JkZXI9Tm9uZSk6CiAKICAgICBmbGFncyA9IF9jaGVja2ZsYWcoZmxhZywgZmlsZSkKLSAgICBlID0gX29wZW5EQkVudigpCisgICAgZSA9IF9vcGVuREJFbnYoY2FjaGVzaXplKQogICAgIGQgPSBkYi5EQihlKQotICAgIGlmIGNhY2hlc2l6ZSBpcyBub3QgTm9uZTogZC5zZXRfY2FjaGVzaXplKDAsIGNhY2hlc2l6ZSkKICAgICBpZiBwZ3NpemUgaXMgbm90IE5vbmU6IGQuc2V0X3BhZ2VzaXplKHBnc2l6ZSkKICAgICBpZiBsb3JkZXIgaXMgbm90IE5vbmU6IGQuc2V0X2xvcmRlcihsb3JkZXIpCiAgICAgZC5zZXRfZmxhZ3MoYnRmbGFncykKQEAgLTMyNCw5ICszMjIsOCBAQAogICAgICAgICAgICAgcmxlbj1Ob25lLCBkZWxpbT1Ob25lLCBzb3VyY2U9Tm9uZSwgcGFkPU5vbmUpOgogCiAgICAgZmxhZ3MgPSBfY2hlY2tmbGFnKGZsYWcsIGZpbGUpCi0gICAgZSA9IF9vcGVuREJFbnYoKQorICAgIGUgPSBfb3BlbkRCRW52KGNhY2hlc2l6ZSkKICAgICBkID0gZGIuREIoZSkKLSAgICBpZiBjYWNoZXNpemUgaXMgbm90IE5vbmU6IGQuc2V0X2NhY2hlc2l6ZSgwLCBjYWNoZXNpemUpCiAgICAgaWYgcGdzaXplIGlzIG5vdCBOb25lOiBkLnNldF9wYWdlc2l6ZShwZ3NpemUpCiAgICAgaWYgbG9yZGVyIGlzIG5vdCBOb25lOiBkLnNldF9sb3JkZXIobG9yZGVyKQogICAgIGQuc2V0X2ZsYWdzKHJuZmxhZ3MpCkBAIC0zMzksOCArMzM2LDEzIEBACiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWRlZiBfb3BlbkRCRW52KCk6CitkZWYgX29wZW5EQkVudihjYWNoZXNpemUpOgogICAgIGUgPSBkYi5EQkVudigpCisgICAgaWYgY2FjaGVzaXplIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBjYWNoZXNpemUgPj0gMjA0ODA6CisgICAgICAgICAgICBlLnNldF9jYWNoZXNpemUoMCwgY2FjaGVzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJjYWNoZXNpemUgbXVzdCBiZSA+PSAyMDQ4MCIKICAgICBlLm9wZW4oJy4nLCBkYi5EQl9QUklWQVRFIHwgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFEIHwgZGIuREJfSU5JVF9MT0NLIHwgZGIuREJfSU5JVF9NUE9PTCkKICAgICByZXR1cm4gZQogCkBAIC0zNTgsNyArMzYwLDcgQEAKICAgICAgICAgI2ZsYWdzID0gZGIuREJfQ1JFQVRFIHwgZGIuREJfVFJVTkNBVEUKICAgICAgICAgIyB3ZSB1c2VkIGRiLkRCX1RSVU5DQVRFIGZsYWcgZm9yIHRoaXMgYmVmb3JlIGJ1dCBCZXJrZWxleURCCiAgICAgICAgICMgNC4yLjUyIGNoYW5nZWQgdG8gZGlzYWxsb3dlZCB0cnVuY2F0ZSB3aXRoIHR4biBlbnZpcm9ubWVudHMuCi0gICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZpbGUpOgorICAgICAgICBpZiBmaWxlIGlzIG5vdCBOb25lIGFuZCBvcy5wYXRoLmlzZmlsZShmaWxlKToKICAgICAgICAgICAgIG9zLnVubGluayhmaWxlKQogICAgIGVsc2U6CiAgICAgICAgIHJhaXNlIGVycm9yLCAiZmxhZ3Mgc2hvdWxkIGJlIG9uZSBvZiAncicsICd3JywgJ2MnIG9yICduJyIKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9hbGwucHkKaW5kZXggOTcyY2QwNi4uYWJmYWY0NyAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9hbGwucHkKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9hbGwucHkKQEAgLTY1LDYgKzY1LDcgQEAKICAgICAgICAgJ3Rlc3Rfam9pbicsCiAgICAgICAgICd0ZXN0X2xvY2snLAogICAgICAgICAndGVzdF9taXNjJywKKyAgICAgICAgJ3Rlc3RfcGlja2xlJywKICAgICAgICAgJ3Rlc3RfcXVldWUnLAogICAgICAgICAndGVzdF9yZWNubycsCiAgICAgICAgICd0ZXN0X3RocmVhZCcsCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfcGlja2xlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTZlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weQpAQCAtMCwwICsxLDc1IEBACisKK2ltcG9ydCBzeXMsIG9zLCBzdHJpbmcKK2ltcG9ydCBwaWNrbGUKK3RyeToKKyAgICBpbXBvcnQgY1BpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGNQaWNrbGUgPSBOb25lCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBnbG9iCisKK3RyeToKKyAgICAjIEZvciBQeXRob25zIHcvZGlzdHV0aWxzIHB5YnNkZGIKKyAgICBmcm9tIGJzZGRiMyBpbXBvcnQgZGIKK2V4Y2VwdCBJbXBvcnRFcnJvciwgZToKKyAgICAjIEZvciBQeXRob24gMi4zCisgICAgZnJvbSBic2RkYiBpbXBvcnQgZGIKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBwaWNrbGVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgREJFcnJvciBjYW4gYmUgcGlja2xlZCBhbmQgdW5waWNrbGVkIiIiCisgICAgZGJfaG9tZSA9ICdkYl9ob21lJworICAgIGRiX25hbWUgPSAndGVzdC1kYm9iai5kYicKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaG9tZURpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pLCAnZGJfaG9tZScpCisgICAgICAgIHNlbGYuaG9tZURpciA9IGhvbWVEaXIKKyAgICAgICAgdHJ5OiBvcy5ta2Rpcihob21lRGlyKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6IHBhc3MKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnZGInKToKKyAgICAgICAgICAgIGRlbCBzZWxmLmRiCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2VudicpOgorICAgICAgICAgICAgZGVsIHNlbGYuZW52CisgICAgICAgIGZpbGVzID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihzZWxmLmhvbWVEaXIsICcqJykpCisgICAgICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgICAgICAgb3MucmVtb3ZlKGZpbGUpCisKKyAgICBkZWYgX2Jhc2VfdGVzdF9waWNrbGVfREJFcnJvcihzZWxmLCBwaWNrbGUpOgorICAgICAgICBzZWxmLmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wpCisgICAgICAgIHNlbGYuZGIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYuZGJfbmFtZSwgZGIuREJfSEFTSCwgZGIuREJfQ1JFQVRFKQorICAgICAgICBzZWxmLmRiLnB1dCgnc3BhbScsICdlZ2dzJykKKyAgICAgICAgYXNzZXJ0IHNlbGYuZGJbJ3NwYW0nXSA9PSAnZWdncycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kYi5wdXQoJ3NwYW0nLCAnaGFtJywgZmxhZ3M9ZGIuREJfTk9PVkVSV1JJVEUpCisgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBlZ2c6CisgICAgICAgICAgICBwaWNrbGVkRWdnID0gcGlja2xlLmR1bXBzKGVnZykKKyAgICAgICAgICAgICNwcmludCByZXByKHBpY2tsZWRFZ2cpCisgICAgICAgICAgICByb3R0ZW5FZ2cgPSBwaWNrbGUubG9hZHMocGlja2xlZEVnZykKKyAgICAgICAgICAgIGlmIHJvdHRlbkVnZy5hcmdzICE9IGVnZy5hcmdzIG9yIHR5cGUocm90dGVuRWdnKSAhPSB0eXBlKGVnZyk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLCAocm90dGVuRWdnLCAnIT0nLCBlZ2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sICJ3aGVyZSdzIG15IERCRXJyb3IgZXhjZXB0aW9uPyE/IgorCisgICAgICAgIHNlbGYuZGIuY2xvc2UoKQorICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdDAxX3BpY2tsZV9EQkVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLl9iYXNlX3Rlc3RfcGlja2xlX0RCRXJyb3IocGlja2xlPXBpY2tsZSkKKworICAgIGlmIGNQaWNrbGU6CisgICAgICAgIGRlZiB0ZXN0MDJfY1BpY2tsZV9EQkVycm9yKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fYmFzZV90ZXN0X3BpY2tsZV9EQkVycm9yKHBpY2tsZT1jUGlja2xlKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUocGlja2xlVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9MaWIvY2FsZW5kYXIucHkgYi9MaWIvY2FsZW5kYXIucHkKaW5kZXggM2ZmY2ZmNS4uNzgwMGFhZSAxMDA2NDQKLS0tIGEvTGliL2NhbGVuZGFyLnB5CisrKyBiL0xpYi9jYWxlbmRhci5weQpAQCAtNSwxNyArNSwzMiBAQAogU3VuZGF5IGFzIHRoZSBsYXN0ICh0aGUgRXVyb3BlYW4gY29udmVudGlvbikuIFVzZSBzZXRmaXJzdHdlZWtkYXkoKSB0bwogc2V0IHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDA9TW9uZGF5LCA2PVN1bmRheSkuIiIiCiAKLWltcG9ydCBkYXRldGltZQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAoraW1wb3J0IHN5cywgZGF0ZXRpbWUsIGxvY2FsZQogCi1fX2FsbF9fID0gWyJlcnJvciIsInNldGZpcnN0d2Vla2RheSIsImZpcnN0d2Vla2RheSIsImlzbGVhcCIsCi0gICAgICAgICAgICJsZWFwZGF5cyIsIndlZWtkYXkiLCJtb250aHJhbmdlIiwibW9udGhjYWxlbmRhciIsCi0gICAgICAgICAgICJwcm1vbnRoIiwibW9udGgiLCJwcmNhbCIsImNhbGVuZGFyIiwidGltZWdtIiwKLSAgICAgICAgICAgIm1vbnRoX25hbWUiLCAibW9udGhfYWJiciIsICJkYXlfbmFtZSIsICJkYXlfYWJiciIsCi0gICAgICAgICAgICJ3ZWVraGVhZGVyIl0KK19fYWxsX18gPSBbIklsbGVnYWxNb250aEVycm9yIiwgIklsbGVnYWxXZWVrZGF5RXJyb3IiLCAic2V0Zmlyc3R3ZWVrZGF5IiwKKyAgICAgICAgICAgImZpcnN0d2Vla2RheSIsICJpc2xlYXAiLCAibGVhcGRheXMiLCAid2Vla2RheSIsICJtb250aHJhbmdlIiwKKyAgICAgICAgICAgIm1vbnRoY2FsZW5kYXIiLCAicHJtb250aCIsICJtb250aCIsICJwcmNhbCIsICJjYWxlbmRhciIsCisgICAgICAgICAgICJ0aW1lZ20iLCAibW9udGhfbmFtZSIsICJtb250aF9hYmJyIiwgImRheV9uYW1lIiwgImRheV9hYmJyIl0KIAogIyBFeGNlcHRpb24gcmFpc2VkIGZvciBiYWQgaW5wdXQgKHdpdGggc3RyaW5nIHBhcmFtZXRlciBmb3IgZGV0YWlscykKIGVycm9yID0gVmFsdWVFcnJvcgogCisjIEV4Y2VwdGlvbnMgcmFpc2VkIGZvciBiYWQgaW5wdXQKK2NsYXNzIElsbGVnYWxNb250aEVycm9yKFZhbHVlRXJyb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb250aCk6CisgICAgICAgIHNlbGYubW9udGggPSBtb250aAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gImJhZCBtb250aCBudW1iZXIgJXI7IG11c3QgYmUgMS0xMiIgJSBzZWxmLm1vbnRoCisKKworY2xhc3MgSWxsZWdhbFdlZWtkYXlFcnJvcihWYWx1ZUVycm9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2Vla2RheSk6CisgICAgICAgIHNlbGYud2Vla2RheSA9IHdlZWtkYXkKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJiYWQgd2Vla2RheSBudW1iZXIgJXI7IG11c3QgYmUgMCAoTW9uZGF5KSB0byA2IChTdW5kYXkpIiAlIHNlbGYud2Vla2RheQorCisKICMgQ29uc3RhbnRzIGZvciBtb250aHMgcmVmZXJlbmNlZCBsYXRlcgogSmFudWFyeSA9IDEKIEZlYnJ1YXJ5ID0gMgpAQCAtMzAsNyArNDUsNyBAQAogCiBjbGFzcyBfbG9jYWxpemVkX21vbnRoOgogCi0gICAgX21vbnRocyA9IFtkYXRldGltZS5kYXRlKDIwMDEsIGkrMSwgMSkuc3RyZnRpbWUgZm9yIGkgaW4gcmFuZ2UoMTIpXQorICAgIF9tb250aHMgPSBbZGF0ZXRpbWUuZGF0ZSgyMDAxLCBpKzEsIDEpLnN0cmZ0aW1lIGZvciBpIGluIHhyYW5nZSgxMildCiAgICAgX21vbnRocy5pbnNlcnQoMCwgbGFtYmRhIHg6ICIiKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvcm1hdCk6CkBAIC00NiwxMCArNjEsMTEgQEAKICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgcmV0dXJuIDEzCiAKKwogY2xhc3MgX2xvY2FsaXplZF9kYXk6CiAKICAgICAjIEphbnVhcnkgMSwgMjAwMSwgd2FzIGEgTW9uZGF5LgotICAgIF9kYXlzID0gW2RhdGV0aW1lLmRhdGUoMjAwMSwgMSwgaSsxKS5zdHJmdGltZSBmb3IgaSBpbiByYW5nZSg3KV0KKyAgICBfZGF5cyA9IFtkYXRldGltZS5kYXRlKDIwMDEsIDEsIGkrMSkuc3RyZnRpbWUgZm9yIGkgaW4geHJhbmdlKDcpXQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvcm1hdCk6CiAgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0CkBAIC02NCw2ICs4MCw3IEBACiAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgIHJldHVybiA3CiAKKwogIyBGdWxsIGFuZCBhYmJyZXZpYXRlZCBuYW1lcyBvZiB3ZWVrZGF5cwogZGF5X25hbWUgPSBfbG9jYWxpemVkX2RheSgnJUEnKQogZGF5X2FiYnIgPSBfbG9jYWxpemVkX2RheSgnJWEnKQpAQCAtNzUsMjMgKzkyLDEyIEBACiAjIENvbnN0YW50cyBmb3Igd2Vla2RheXMKIChNT05EQVksIFRVRVNEQVksIFdFRE5FU0RBWSwgVEhVUlNEQVksIEZSSURBWSwgU0FUVVJEQVksIFNVTkRBWSkgPSByYW5nZSg3KQogCi1fZmlyc3R3ZWVrZGF5ID0gMCAgICAgICAgICAgICAgICAgICAgICAgIyAwID0gTW9uZGF5LCA2ID0gU3VuZGF5Ci0KLWRlZiBmaXJzdHdlZWtkYXkoKToKLSAgICByZXR1cm4gX2ZpcnN0d2Vla2RheQotCi1kZWYgc2V0Zmlyc3R3ZWVrZGF5KHdlZWtkYXkpOgotICAgICIiIlNldCB3ZWVrZGF5IChNb25kYXk9MCwgU3VuZGF5PTYpIHRvIHN0YXJ0IGVhY2ggd2Vlay4iIiIKLSAgICBnbG9iYWwgX2ZpcnN0d2Vla2RheQotICAgIGlmIG5vdCBNT05EQVkgPD0gd2Vla2RheSA8PSBTVU5EQVk6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKLSAgICAgICAgICAgICAgJ2JhZCB3ZWVrZGF5IG51bWJlcjsgbXVzdCBiZSAwIChNb25kYXkpIHRvIDYgKFN1bmRheSknCi0gICAgX2ZpcnN0d2Vla2RheSA9IHdlZWtkYXkKIAogZGVmIGlzbGVhcCh5ZWFyKToKICAgICAiIiJSZXR1cm4gMSBmb3IgbGVhcCB5ZWFycywgMCBmb3Igbm9uLWxlYXAgeWVhcnMuIiIiCiAgICAgcmV0dXJuIHllYXIgJSA0ID09IDAgYW5kICh5ZWFyICUgMTAwICE9IDAgb3IgeWVhciAlIDQwMCA9PSAwKQogCisKIGRlZiBsZWFwZGF5cyh5MSwgeTIpOgogICAgICIiIlJldHVybiBudW1iZXIgb2YgbGVhcCB5ZWFycyBpbiByYW5nZSBbeTEsIHkyKS4KICAgICAgICBBc3N1bWUgeTEgPD0geTIuIiIiCkBAIC05OSwxMjggKzEwNSw1MDEgQEAKICAgICB5MiAtPSAxCiAgICAgcmV0dXJuICh5Mi8vNCAtIHkxLy80KSAtICh5Mi8vMTAwIC0geTEvLzEwMCkgKyAoeTIvLzQwMCAtIHkxLy80MDApCiAKKwogZGVmIHdlZWtkYXkoeWVhciwgbW9udGgsIGRheSk6CiAgICAgIiIiUmV0dXJuIHdlZWtkYXkgKDAtNiB+IE1vbi1TdW4pIGZvciB5ZWFyICgxOTcwLS4uLiksIG1vbnRoICgxLTEyKSwKICAgICAgICBkYXkgKDEtMzEpLiIiIgogICAgIHJldHVybiBkYXRldGltZS5kYXRlKHllYXIsIG1vbnRoLCBkYXkpLndlZWtkYXkoKQogCisKIGRlZiBtb250aHJhbmdlKHllYXIsIG1vbnRoKToKICAgICAiIiJSZXR1cm4gd2Vla2RheSAoMC02IH4gTW9uLVN1bikgYW5kIG51bWJlciBvZiBkYXlzICgyOC0zMSkgZm9yCiAgICAgICAgeWVhciwgbW9udGguIiIiCiAgICAgaWYgbm90IDEgPD0gbW9udGggPD0gMTI6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdiYWQgbW9udGggbnVtYmVyJworICAgICAgICByYWlzZSBJbGxlZ2FsTW9udGhFcnJvcihtb250aCkKICAgICBkYXkxID0gd2Vla2RheSh5ZWFyLCBtb250aCwgMSkKICAgICBuZGF5cyA9IG1kYXlzW21vbnRoXSArIChtb250aCA9PSBGZWJydWFyeSBhbmQgaXNsZWFwKHllYXIpKQogICAgIHJldHVybiBkYXkxLCBuZGF5cwogCi1kZWYgbW9udGhjYWxlbmRhcih5ZWFyLCBtb250aCk6Ci0gICAgIiIiUmV0dXJuIGEgbWF0cml4IHJlcHJlc2VudGluZyBhIG1vbnRoJ3MgY2FsZW5kYXIuCi0gICAgICAgRWFjaCByb3cgcmVwcmVzZW50cyBhIHdlZWs7IGRheXMgb3V0c2lkZSB0aGlzIG1vbnRoIGFyZSB6ZXJvLiIiIgotICAgIGRheTEsIG5kYXlzID0gbW9udGhyYW5nZSh5ZWFyLCBtb250aCkKLSAgICByb3dzID0gW10KLSAgICByNyA9IHJhbmdlKDcpCi0gICAgZGF5ID0gKF9maXJzdHdlZWtkYXkgLSBkYXkxICsgNikgJSA3IC0gNSAgICMgZm9yIGxlYWRpbmcgMCdzIGluIGZpcnN0IHdlZWsKLSAgICB3aGlsZSBkYXkgPD0gbmRheXM6Ci0gICAgICAgIHJvdyA9IFswLCAwLCAwLCAwLCAwLCAwLCAwXQotICAgICAgICBmb3IgaSBpbiByNzoKLSAgICAgICAgICAgIGlmIDEgPD0gZGF5IDw9IG5kYXlzOiByb3dbaV0gPSBkYXkKLSAgICAgICAgICAgIGRheSA9IGRheSArIDEKLSAgICAgICAgcm93cy5hcHBlbmQocm93KQotICAgIHJldHVybiByb3dzCiAKLWRlZiBwcndlZWsodGhld2Vlaywgd2lkdGgpOgotICAgICIiIlByaW50IGEgc2luZ2xlIHdlZWsgKG5vIG5ld2xpbmUpLiIiIgotICAgIHByaW50IHdlZWsodGhld2Vlaywgd2lkdGgpLAorY2xhc3MgQ2FsZW5kYXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBCYXNlIGNhbGVuZGFyIGNsYXNzLiBUaGlzIGNsYXNzIGRvZXNuJ3QgZG8gYW55IGZvcm1hdHRpbmcuIEl0IHNpbXBseQorICAgIHByb3ZpZGVzIGRhdGEgdG8gc3ViY2xhc3Nlcy4KKyAgICAiIiIKIAotZGVmIHdlZWsodGhld2Vlaywgd2lkdGgpOgotICAgICIiIlJldHVybnMgYSBzaW5nbGUgd2VlayBpbiBhIHN0cmluZyAobm8gbmV3bGluZSkuIiIiCi0gICAgZGF5cyA9IFtdCi0gICAgZm9yIGRheSBpbiB0aGV3ZWVrOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaXJzdHdlZWtkYXk9MCk6CisgICAgICAgIHNlbGYuZmlyc3R3ZWVrZGF5ID0gZmlyc3R3ZWVrZGF5ICMgMCA9IE1vbmRheSwgNiA9IFN1bmRheQorCisgICAgZGVmIGdldGZpcnN0d2Vla2RheShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpcnN0d2Vla2RheSAlIDcKKworICAgIGRlZiBzZXRmaXJzdHdlZWtkYXkoc2VsZiwgZmlyc3R3ZWVrZGF5KToKKyAgICAgICAgc2VsZi5fZmlyc3R3ZWVrZGF5ID0gZmlyc3R3ZWVrZGF5CisKKyAgICBmaXJzdHdlZWtkYXkgPSBwcm9wZXJ0eShnZXRmaXJzdHdlZWtkYXksIHNldGZpcnN0d2Vla2RheSkKKworICAgIGRlZiBpdGVyd2Vla2RheXMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBpdGVyYXRvciBmb3Igb25lIHdlZWsgb2Ygd2Vla2RheSBudW1iZXJzIHN0YXJ0aW5nIHdpdGggdGhlCisgICAgICAgIGNvbmZpZ3VyZWQgZmlyc3Qgb25lLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYuZmlyc3R3ZWVrZGF5LCBzZWxmLmZpcnN0d2Vla2RheSArIDcpOgorICAgICAgICAgICAgeWllbGQgaSU3CisKKyAgICBkZWYgaXRlcm1vbnRoZGF0ZXMoc2VsZiwgeWVhciwgbW9udGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIGZvciBvbmUgbW9udGguIFRoZSBpdGVyYXRvciB3aWxsIHlpZWxkIGRhdGV0aW1lLmRhdGUKKyAgICAgICAgdmFsdWVzIGFuZCB3aWxsIGFsd2F5cyBpdGVyYXRlIHRocm91Z2ggY29tcGxldGUgd2Vla3MsIHNvIGl0IHdpbGwgeWllbGQKKyAgICAgICAgZGF0ZXMgb3V0c2lkZSB0aGUgc3BlY2lmaWVkIG1vbnRoLgorICAgICAgICAiIiIKKyAgICAgICAgZGF0ZSA9IGRhdGV0aW1lLmRhdGUoeWVhciwgbW9udGgsIDEpCisgICAgICAgICMgR28gYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3ZWVrCisgICAgICAgIGRheXMgPSAoZGF0ZS53ZWVrZGF5KCkgLSBzZWxmLmZpcnN0d2Vla2RheSkgJSA3CisgICAgICAgIGRhdGUgLT0gZGF0ZXRpbWUudGltZWRlbHRhKGRheXM9ZGF5cykKKyAgICAgICAgb25lZGF5ID0gZGF0ZXRpbWUudGltZWRlbHRhKGRheXM9MSkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHlpZWxkIGRhdGUKKyAgICAgICAgICAgIGRhdGUgKz0gb25lZGF5CisgICAgICAgICAgICBpZiBkYXRlLm1vbnRoICE9IG1vbnRoIGFuZCBkYXRlLndlZWtkYXkoKSA9PSBzZWxmLmZpcnN0d2Vla2RheToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIGl0ZXJtb250aGRheXMyKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIExpa2UgaXRlcm1vbnRoZGF0ZXMoKSwgYnV0IHdpbGwgeWllbGQgKGRheSBudW1iZXIsIHdlZWtkYXkgbnVtYmVyKQorICAgICAgICB0dXBsZXMuIEZvciBkYXlzIG91dHNpZGUgdGhlIHNwZWNpZmllZCBtb250aCB0aGUgZGF5IG51bWJlciBpcyAwLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGRhdGUgaW4gc2VsZi5pdGVybW9udGhkYXRlcyh5ZWFyLCBtb250aCk6CisgICAgICAgICAgICBpZiBkYXRlLm1vbnRoICE9IG1vbnRoOgorICAgICAgICAgICAgICAgIHlpZWxkICgwLCBkYXRlLndlZWtkYXkoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgKGRhdGUuZGF5LCBkYXRlLndlZWtkYXkoKSkKKworICAgIGRlZiBpdGVybW9udGhkYXlzKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIExpa2UgaXRlcm1vbnRoZGF0ZXMoKSwgYnV0IHdpbGwgeWllbGQgZGF5IG51bWJlcnMgdHVwbGVzLiBGb3IgZGF5cworICAgICAgICBvdXRzaWRlIHRoZSBzcGVjaWZpZWQgbW9udGggdGhlIGRheSBudW1iZXIgaXMgMC4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBkYXRlIGluIHNlbGYuaXRlcm1vbnRoZGF0ZXMoeWVhciwgbW9udGgpOgorICAgICAgICAgICAgaWYgZGF0ZS5tb250aCAhPSBtb250aDoKKyAgICAgICAgICAgICAgICB5aWVsZCAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIGRhdGUuZGF5CisKKyAgICBkZWYgbW9udGhkYXRlc2NhbGVuZGFyKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG1hdHJpeCAobGlzdCBvZiBsaXN0cykgcmVwcmVzZW50aW5nIGEgbW9udGgncyBjYWxlbmRhci4KKyAgICAgICAgRWFjaCByb3cgcmVwcmVzZW50cyBhIHdlZWs7IHdlZWsgZW50cmllcyBhcmUgZGF0ZXRpbWUuZGF0ZSB2YWx1ZXMuCisgICAgICAgICIiIgorICAgICAgICBkYXRlcyA9IGxpc3Qoc2VsZi5pdGVybW9udGhkYXRlcyh5ZWFyLCBtb250aCkpCisgICAgICAgIHJldHVybiBbIGRhdGVzW2k6aSs3XSBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKGRhdGVzKSwgNykgXQorCisgICAgZGVmIG1vbnRoZGF5czJjYWxlbmRhcihzZWxmLCB5ZWFyLCBtb250aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBtYXRyaXggcmVwcmVzZW50aW5nIGEgbW9udGgncyBjYWxlbmRhci4KKyAgICAgICAgRWFjaCByb3cgcmVwcmVzZW50cyBhIHdlZWs7IHdlZWsgZW50cmllcyBhcmUKKyAgICAgICAgKGRheSBudW1iZXIsIHdlZWtkYXkgbnVtYmVyKSB0dXBsZXMuIERheSBudW1iZXJzIG91dHNpZGUgdGhpcyBtb250aAorICAgICAgICBhcmUgemVyby4KKyAgICAgICAgIiIiCisgICAgICAgIGRheXMgPSBsaXN0KHNlbGYuaXRlcm1vbnRoZGF5czIoeWVhciwgbW9udGgpKQorICAgICAgICByZXR1cm4gWyBkYXlzW2k6aSs3XSBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKGRheXMpLCA3KSBdCisKKyAgICBkZWYgbW9udGhkYXlzY2FsZW5kYXIoc2VsZiwgeWVhciwgbW9udGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbWF0cml4IHJlcHJlc2VudGluZyBhIG1vbnRoJ3MgY2FsZW5kYXIuCisgICAgICAgIEVhY2ggcm93IHJlcHJlc2VudHMgYSB3ZWVrOyBkYXlzIG91dHNpZGUgdGhpcyBtb250aCBhcmUgemVyby4KKyAgICAgICAgIiIiCisgICAgICAgIGRheXMgPSBsaXN0KHNlbGYuaXRlcm1vbnRoZGF5cyh5ZWFyLCBtb250aCkpCisgICAgICAgIHJldHVybiBbIGRheXNbaTppKzddIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oZGF5cyksIDcpIF0KKworICAgIGRlZiB5ZWFyZGF0ZXNjYWxlbmRhcihzZWxmLCB5ZWFyLCB3aWR0aD0zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nLiBUaGUgcmV0dXJuCisgICAgICAgIHZhbHVlIGlzIGEgbGlzdCBvZiBtb250aCByb3dzLiBFYWNoIG1vbnRoIHJvdyBjb250YWlucyB1cHRvIHdpZHRoIG1vbnRocy4KKyAgICAgICAgRWFjaCBtb250aCBjb250YWlucyBiZXR3ZWVuIDQgYW5kIDYgd2Vla3MgYW5kIGVhY2ggd2VlayBjb250YWlucyAxLTcKKyAgICAgICAgZGF5cy4gRGF5cyBhcmUgZGF0ZXRpbWUuZGF0ZSBvYmplY3RzLgorICAgICAgICAiIiIKKyAgICAgICAgbW9udGhzID0gWworICAgICAgICAgICAgc2VsZi5tb250aGRhdGVzY2FsZW5kYXIoeWVhciwgaSkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShKYW51YXJ5LCBKYW51YXJ5KzEyKQorICAgICAgICBdCisgICAgICAgIHJldHVybiBbbW9udGhzW2k6aSt3aWR0aF0gZm9yIGkgaW4geHJhbmdlKDAsIGxlbihtb250aHMpLCB3aWR0aCkgXQorCisgICAgZGVmIHllYXJkYXlzMmNhbGVuZGFyKHNlbGYsIHllYXIsIHdpZHRoPTMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHllYXIgcmVhZHkgZm9yIGZvcm1hdHRpbmcgKHNpbWlsYXIgdG8KKyAgICAgICAgeWVhcmRhdGVzY2FsZW5kYXIoKSkuIEVudHJpZXMgaW4gdGhlIHdlZWsgbGlzdHMgYXJlCisgICAgICAgIChkYXkgbnVtYmVyLCB3ZWVrZGF5IG51bWJlcikgdHVwbGVzLiBEYXkgbnVtYmVycyBvdXRzaWRlIHRoaXMgbW9udGggYXJlCisgICAgICAgIHplcm8uCisgICAgICAgICIiIgorICAgICAgICBtb250aHMgPSBbCisgICAgICAgICAgICBzZWxmLm1vbnRoZGF5czJjYWxlbmRhcih5ZWFyLCBpKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKEphbnVhcnksIEphbnVhcnkrMTIpCisgICAgICAgIF0KKyAgICAgICAgcmV0dXJuIFttb250aHNbaTppK3dpZHRoXSBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKG1vbnRocyksIHdpZHRoKSBdCisKKyAgICBkZWYgeWVhcmRheXNjYWxlbmRhcihzZWxmLCB5ZWFyLCB3aWR0aD0zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nIChzaW1pbGFyIHRvCisgICAgICAgIHllYXJkYXRlc2NhbGVuZGFyKCkpLiBFbnRyaWVzIGluIHRoZSB3ZWVrIGxpc3RzIGFyZSBkYXkgbnVtYmVycy4KKyAgICAgICAgRGF5IG51bWJlcnMgb3V0c2lkZSB0aGlzIG1vbnRoIGFyZSB6ZXJvLgorICAgICAgICAiIiIKKyAgICAgICAgbW9udGhzID0gWworICAgICAgICAgICAgc2VsZi5tb250aGRheXNjYWxlbmRhcih5ZWFyLCBpKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKEphbnVhcnksIEphbnVhcnkrMTIpCisgICAgICAgIF0KKyAgICAgICAgcmV0dXJuIFttb250aHNbaTppK3dpZHRoXSBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKG1vbnRocyksIHdpZHRoKSBdCisKKworY2xhc3MgVGV4dENhbGVuZGFyKENhbGVuZGFyKToKKyAgICAiIiIKKyAgICBTdWJjbGFzcyBvZiBDYWxlbmRhciB0aGF0IG91dHB1dHMgYSBjYWxlbmRhciBhcyBhIHNpbXBsZSBwbGFpbiB0ZXh0CisgICAgc2ltaWxhciB0byB0aGUgVU5JWCBwcm9ncmFtIGNhbC4KKyAgICAiIiIKKworICAgIGRlZiBwcndlZWsoc2VsZiwgdGhld2Vlaywgd2lkdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUHJpbnQgYSBzaW5nbGUgd2VlayAobm8gbmV3bGluZSkuCisgICAgICAgICIiIgorICAgICAgICBwcmludCBzZWxmLndlZWsodGhld2Vlaywgd2lkdGgpLAorCisgICAgZGVmIGZvcm1hdGRheShzZWxmLCBkYXksIHdlZWtkYXksIHdpZHRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSBmb3JtYXR0ZWQgZGF5LgorICAgICAgICAiIiIKICAgICAgICAgaWYgZGF5ID09IDA6CiAgICAgICAgICAgICBzID0gJycKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHMgPSAnJTJpJyAlIGRheSAgICAgICAgICAgICAjIHJpZ2h0LWFsaWduIHNpbmdsZS1kaWdpdCBkYXlzCi0gICAgICAgIGRheXMuYXBwZW5kKHMuY2VudGVyKHdpZHRoKSkKLSAgICByZXR1cm4gJyAnLmpvaW4oZGF5cykKKyAgICAgICAgcmV0dXJuIHMuY2VudGVyKHdpZHRoKQogCi1kZWYgd2Vla2hlYWRlcih3aWR0aCk6Ci0gICAgIiIiUmV0dXJuIGEgaGVhZGVyIGZvciBhIHdlZWsuIiIiCi0gICAgaWYgd2lkdGggPj0gOToKLSAgICAgICAgbmFtZXMgPSBkYXlfbmFtZQotICAgIGVsc2U6Ci0gICAgICAgIG5hbWVzID0gZGF5X2FiYnIKLSAgICBkYXlzID0gW10KLSAgICBmb3IgaSBpbiByYW5nZShfZmlyc3R3ZWVrZGF5LCBfZmlyc3R3ZWVrZGF5ICsgNyk6Ci0gICAgICAgIGRheXMuYXBwZW5kKG5hbWVzW2klN11bOndpZHRoXS5jZW50ZXIod2lkdGgpKQotICAgIHJldHVybiAnICcuam9pbihkYXlzKQorICAgIGRlZiBmb3JtYXR3ZWVrKHNlbGYsIHRoZXdlZWssIHdpZHRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSBzaW5nbGUgd2VlayBpbiBhIHN0cmluZyAobm8gbmV3bGluZSkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gJyAnLmpvaW4oc2VsZi5mb3JtYXRkYXkoZCwgd2QsIHdpZHRoKSBmb3IgKGQsIHdkKSBpbiB0aGV3ZWVrKQogCi1kZWYgcHJtb250aCh0aGV5ZWFyLCB0aGVtb250aCwgdz0wLCBsPTApOgotICAgICIiIlByaW50IGEgbW9udGgncyBjYWxlbmRhci4iIiIKLSAgICBwcmludCBtb250aCh0aGV5ZWFyLCB0aGVtb250aCwgdywgbCksCisgICAgZGVmIGZvcm1hdHdlZWtkYXkoc2VsZiwgZGF5LCB3aWR0aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIGEgZm9ybWF0dGVkIHdlZWsgZGF5IG5hbWUuCisgICAgICAgICIiIgorICAgICAgICBpZiB3aWR0aCA+PSA5OgorICAgICAgICAgICAgbmFtZXMgPSBkYXlfbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZXMgPSBkYXlfYWJicgorICAgICAgICByZXR1cm4gbmFtZXNbZGF5XVs6d2lkdGhdLmNlbnRlcih3aWR0aCkKIAotZGVmIG1vbnRoKHRoZXllYXIsIHRoZW1vbnRoLCB3PTAsIGw9MCk6Ci0gICAgIiIiUmV0dXJuIGEgbW9udGgncyBjYWxlbmRhciBzdHJpbmcgKG11bHRpLWxpbmUpLiIiIgotICAgIHcgPSBtYXgoMiwgdykKLSAgICBsID0gbWF4KDEsIGwpCi0gICAgcyA9ICgiJXMgJXIiICUgKG1vbnRoX25hbWVbdGhlbW9udGhdLCB0aGV5ZWFyKSkuY2VudGVyKAotICAgICAgICAgICAgICAgICA3ICogKHcgKyAxKSAtIDEpLnJzdHJpcCgpICsgXAotICAgICAgICAgJ1xuJyAqIGwgKyB3ZWVraGVhZGVyKHcpLnJzdHJpcCgpICsgJ1xuJyAqIGwKLSAgICBmb3IgYXdlZWsgaW4gbW9udGhjYWxlbmRhcih0aGV5ZWFyLCB0aGVtb250aCk6Ci0gICAgICAgIHMgPSBzICsgd2Vlayhhd2VlaywgdykucnN0cmlwKCkgKyAnXG4nICogbAotICAgIHJldHVybiBzWzotbF0gKyAnXG4nCisgICAgZGVmIGZvcm1hdHdlZWtoZWFkZXIoc2VsZiwgd2lkdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgaGVhZGVyIGZvciBhIHdlZWsuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gJyAnLmpvaW4oc2VsZi5mb3JtYXR3ZWVrZGF5KGksIHdpZHRoKSBmb3IgaSBpbiBzZWxmLml0ZXJ3ZWVrZGF5cygpKQogCi0jIFNwYWNpbmcgb2YgbW9udGggY29sdW1ucyBmb3IgMy1jb2x1bW4geWVhciBjYWxlbmRhcgorICAgIGRlZiBmb3JtYXRtb250aG5hbWUoc2VsZiwgdGhleWVhciwgdGhlbW9udGgsIHdpZHRoLCB3aXRoeWVhcj1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGZvcm1hdHRlZCBtb250aCBuYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgcyA9IG1vbnRoX25hbWVbdGhlbW9udGhdCisgICAgICAgIGlmIHdpdGh5ZWFyOgorICAgICAgICAgICAgcyA9ICIlcyAlciIgJSAocywgdGhleWVhcikKKyAgICAgICAgcmV0dXJuIHMuY2VudGVyKHdpZHRoKQorCisgICAgZGVmIHBybW9udGgoc2VsZiwgdGhleWVhciwgdGhlbW9udGgsIHc9MCwgbD0wKToKKyAgICAgICAgIiIiCisgICAgICAgIFByaW50IGEgbW9udGgncyBjYWxlbmRhci4KKyAgICAgICAgIiIiCisgICAgICAgIHByaW50IHNlbGYuZm9ybWF0bW9udGgodGhleWVhciwgdGhlbW9udGgsIHcsIGwpLAorCisgICAgZGVmIGZvcm1hdG1vbnRoKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3PTAsIGw9MCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBtb250aCdzIGNhbGVuZGFyIHN0cmluZyAobXVsdGktbGluZSkuCisgICAgICAgICIiIgorICAgICAgICB3ID0gbWF4KDIsIHcpCisgICAgICAgIGwgPSBtYXgoMSwgbCkKKyAgICAgICAgcyA9IHNlbGYuZm9ybWF0bW9udGhuYW1lKHRoZXllYXIsIHRoZW1vbnRoLCA3ICogKHcgKyAxKSAtIDEpCisgICAgICAgIHMgPSBzLnJzdHJpcCgpCisgICAgICAgIHMgKz0gJ1xuJyAqIGwKKyAgICAgICAgcyArPSBzZWxmLmZvcm1hdHdlZWtoZWFkZXIodykucnN0cmlwKCkKKyAgICAgICAgcyArPSAnXG4nICogbAorICAgICAgICBmb3Igd2VlayBpbiBzZWxmLm1vbnRoZGF5czJjYWxlbmRhcih0aGV5ZWFyLCB0aGVtb250aCk6CisgICAgICAgICAgICBzICs9IHNlbGYuZm9ybWF0d2Vlayh3ZWVrLCB3KS5yc3RyaXAoKQorICAgICAgICAgICAgcyArPSAnXG4nICogbAorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIGZvcm1hdHllYXIoc2VsZiwgdGhleWVhciwgdz0yLCBsPTEsIGM9NiwgbT0zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSB5ZWFyJ3MgY2FsZW5kYXIgYXMgYSBtdWx0aS1saW5lIHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHcgPSBtYXgoMiwgdykKKyAgICAgICAgbCA9IG1heCgxLCBsKQorICAgICAgICBjID0gbWF4KDIsIGMpCisgICAgICAgIGNvbHdpZHRoID0gKHcgKyAxKSAqIDcgLSAxCisgICAgICAgIHYgPSBbXQorICAgICAgICBhID0gdi5hcHBlbmQKKyAgICAgICAgYShyZXByKHRoZXllYXIpLmNlbnRlcihjb2x3aWR0aCptK2MqKG0tMSkpLnJzdHJpcCgpKQorICAgICAgICBhKCdcbicqbCkKKyAgICAgICAgaGVhZGVyID0gc2VsZi5mb3JtYXR3ZWVraGVhZGVyKHcpCisgICAgICAgIGZvciAoaSwgcm93KSBpbiBlbnVtZXJhdGUoc2VsZi55ZWFyZGF5czJjYWxlbmRhcih0aGV5ZWFyLCBtKSk6CisgICAgICAgICAgICAjIG1vbnRocyBpbiB0aGlzIHJvdworICAgICAgICAgICAgbW9udGhzID0geHJhbmdlKG0qaSsxLCBtaW4obSooaSsxKSsxLCAxMykpCisgICAgICAgICAgICBhKCdcbicqbCkKKyAgICAgICAgICAgIG5hbWVzID0gKHNlbGYuZm9ybWF0bW9udGhuYW1lKHRoZXllYXIsIGssIGNvbHdpZHRoLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgIGZvciBrIGluIG1vbnRocykKKyAgICAgICAgICAgIGEoZm9ybWF0c3RyaW5nKG5hbWVzLCBjb2x3aWR0aCwgYykucnN0cmlwKCkpCisgICAgICAgICAgICBhKCdcbicqbCkKKyAgICAgICAgICAgIGhlYWRlcnMgPSAoaGVhZGVyIGZvciBrIGluIG1vbnRocykKKyAgICAgICAgICAgIGEoZm9ybWF0c3RyaW5nKGhlYWRlcnMsIGNvbHdpZHRoLCBjKS5yc3RyaXAoKSkKKyAgICAgICAgICAgIGEoJ1xuJypsKQorICAgICAgICAgICAgIyBtYXggbnVtYmVyIG9mIHdlZWtzIGZvciB0aGlzIHJvdworICAgICAgICAgICAgaGVpZ2h0ID0gbWF4KGxlbihjYWwpIGZvciBjYWwgaW4gcm93KQorICAgICAgICAgICAgZm9yIGogaW4geHJhbmdlKGhlaWdodCk6CisgICAgICAgICAgICAgICAgd2Vla3MgPSBbXQorICAgICAgICAgICAgICAgIGZvciBjYWwgaW4gcm93OgorICAgICAgICAgICAgICAgICAgICBpZiBqID49IGxlbihjYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgd2Vla3MuYXBwZW5kKCcnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgd2Vla3MuYXBwZW5kKHNlbGYuZm9ybWF0d2VlayhjYWxbal0sIHcpKQorICAgICAgICAgICAgICAgIGEoZm9ybWF0c3RyaW5nKHdlZWtzLCBjb2x3aWR0aCwgYykucnN0cmlwKCkpCisgICAgICAgICAgICAgICAgYSgnXG4nICogbCkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4odikKKworICAgIGRlZiBwcnllYXIoc2VsZiwgdGhleWVhciwgdz0wLCBsPTAsIGM9NiwgbT0zKToKKyAgICAgICAgIiIiUHJpbnQgYSB5ZWFyJ3MgY2FsZW5kYXIuIiIiCisgICAgICAgIHByaW50IHNlbGYuZm9ybWF0eWVhcih0aGV5ZWFyLCB3LCBsLCBjLCBtKQorCisKK2NsYXNzIEhUTUxDYWxlbmRhcihDYWxlbmRhcik6CisgICAgIiIiCisgICAgVGhpcyBjYWxlbmRhciByZXR1cm5zIGNvbXBsZXRlIEhUTUwgcGFnZXMuCisgICAgIiIiCisKKyAgICAjIENTUyBjbGFzc2VzIGZvciB0aGUgZGF5IDx0ZD5zCisgICAgY3NzY2xhc3NlcyA9IFsibW9uIiwgInR1ZSIsICJ3ZWQiLCAidGh1IiwgImZyaSIsICJzYXQiLCAic3VuIl0KKworICAgIGRlZiBmb3JtYXRkYXkoc2VsZiwgZGF5LCB3ZWVrZGF5KToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGRheSBhcyBhIHRhYmxlIGNlbGwuCisgICAgICAgICIiIgorICAgICAgICBpZiBkYXkgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAnPHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD4nICMgZGF5IG91dHNpZGUgbW9udGgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnPHRkIGNsYXNzPSIlcyI+JWQ8L3RkPicgJSAoc2VsZi5jc3NjbGFzc2VzW3dlZWtkYXldLCBkYXkpCisKKyAgICBkZWYgZm9ybWF0d2VlayhzZWxmLCB0aGV3ZWVrKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGNvbXBsZXRlIHdlZWsgYXMgYSB0YWJsZSByb3cuCisgICAgICAgICIiIgorICAgICAgICBzID0gJycuam9pbihzZWxmLmZvcm1hdGRheShkLCB3ZCkgZm9yIChkLCB3ZCkgaW4gdGhld2VlaykKKyAgICAgICAgcmV0dXJuICc8dHI+JXM8L3RyPicgJSBzCisKKyAgICBkZWYgZm9ybWF0d2Vla2RheShzZWxmLCBkYXkpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgd2Vla2RheSBuYW1lIGFzIGEgdGFibGUgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICc8dGggY2xhc3M9IiVzIj4lczwvdGg+JyAlIChzZWxmLmNzc2NsYXNzZXNbZGF5XSwgZGF5X2FiYnJbZGF5XSkKKworICAgIGRlZiBmb3JtYXR3ZWVraGVhZGVyKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgaGVhZGVyIGZvciBhIHdlZWsgYXMgYSB0YWJsZSByb3cuCisgICAgICAgICIiIgorICAgICAgICBzID0gJycuam9pbihzZWxmLmZvcm1hdHdlZWtkYXkoaSkgZm9yIGkgaW4gc2VsZi5pdGVyd2Vla2RheXMoKSkKKyAgICAgICAgcmV0dXJuICc8dHI+JXM8L3RyPicgJSBzCisKKyAgICBkZWYgZm9ybWF0bW9udGhuYW1lKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3aXRoeWVhcj1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG1vbnRoIG5hbWUgYXMgYSB0YWJsZSByb3cuCisgICAgICAgICIiIgorICAgICAgICBpZiB3aXRoeWVhcjoKKyAgICAgICAgICAgIHMgPSAnJXMgJXMnICUgKG1vbnRoX25hbWVbdGhlbW9udGhdLCB0aGV5ZWFyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9ICclcycgJSBtb250aF9uYW1lW3RoZW1vbnRoXQorICAgICAgICByZXR1cm4gJzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj4lczwvdGg+PC90cj4nICUgcworCisgICAgZGVmIGZvcm1hdG1vbnRoKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3aXRoeWVhcj1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGZvcm1hdHRlZCBtb250aCBhcyBhIHRhYmxlLgorICAgICAgICAiIiIKKyAgICAgICAgdiA9IFtdCisgICAgICAgIGEgPSB2LmFwcGVuZAorICAgICAgICBhKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+JykKKyAgICAgICAgYSgnXG4nKQorICAgICAgICBhKHNlbGYuZm9ybWF0bW9udGhuYW1lKHRoZXllYXIsIHRoZW1vbnRoLCB3aXRoeWVhcj13aXRoeWVhcikpCisgICAgICAgIGEoJ1xuJykKKyAgICAgICAgYShzZWxmLmZvcm1hdHdlZWtoZWFkZXIoKSkKKyAgICAgICAgYSgnXG4nKQorICAgICAgICBmb3Igd2VlayBpbiBzZWxmLm1vbnRoZGF5czJjYWxlbmRhcih0aGV5ZWFyLCB0aGVtb250aCk6CisgICAgICAgICAgICBhKHNlbGYuZm9ybWF0d2Vlayh3ZWVrKSkKKyAgICAgICAgICAgIGEoJ1xuJykKKyAgICAgICAgYSgnPC90YWJsZT4nKQorICAgICAgICBhKCdcbicpCisgICAgICAgIHJldHVybiAnJy5qb2luKHYpCisKKyAgICBkZWYgZm9ybWF0eWVhcihzZWxmLCB0aGV5ZWFyLCB3aWR0aD0zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGZvcm1hdHRlZCB5ZWFyIGFzIGEgdGFibGUgb2YgdGFibGVzLgorICAgICAgICAiIiIKKyAgICAgICAgdiA9IFtdCisgICAgICAgIGEgPSB2LmFwcGVuZAorICAgICAgICB3aWR0aCA9IG1heCh3aWR0aCwgMSkKKyAgICAgICAgYSgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ieWVhciI+JykKKyAgICAgICAgYSgnXG4nKQorICAgICAgICBhKCc8dHI+PHRoIGNvbHNwYW49IiVkIiBjbGFzcz0ieWVhciI+JXM8L3RoPjwvdHI+JyAlICh3aWR0aCwgdGhleWVhcikpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShKYW51YXJ5LCBKYW51YXJ5KzEyLCB3aWR0aCk6CisgICAgICAgICAgICAjIG1vbnRocyBpbiB0aGlzIHJvdworICAgICAgICAgICAgbW9udGhzID0geHJhbmdlKGksIG1pbihpK3dpZHRoLCAxMykpCisgICAgICAgICAgICBhKCc8dHI+JykKKyAgICAgICAgICAgIGZvciBtIGluIG1vbnRoczoKKyAgICAgICAgICAgICAgICBhKCc8dGQ+JykKKyAgICAgICAgICAgICAgICBhKHNlbGYuZm9ybWF0bW9udGgodGhleWVhciwgbSwgd2l0aHllYXI9RmFsc2UpKQorICAgICAgICAgICAgICAgIGEoJzwvdGQ+JykKKyAgICAgICAgICAgIGEoJzwvdHI+JykKKyAgICAgICAgYSgnPC90YWJsZT4nKQorICAgICAgICByZXR1cm4gJycuam9pbih2KQorCisgICAgZGVmIGZvcm1hdHllYXJwYWdlKHNlbGYsIHRoZXllYXIsIHdpZHRoPTMsIGNzcz0nY2FsZW5kYXIuY3NzJywgZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBmb3JtYXR0ZWQgeWVhciBhcyBhIGNvbXBsZXRlIEhUTUwgcGFnZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQorICAgICAgICB2ID0gW10KKyAgICAgICAgYSA9IHYuYXBwZW5kCisgICAgICAgIGEoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiVzIj8+XG4nICUgZW5jb2RpbmcpCisgICAgICAgIGEoJzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj5cbicpCisgICAgICAgIGEoJzxodG1sPlxuJykKKyAgICAgICAgYSgnPGhlYWQ+XG4nKQorICAgICAgICBhKCc8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0lcyIgLz5cbicgJSBlbmNvZGluZykKKyAgICAgICAgaWYgY3NzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYSgnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJXMiIC8+XG4nICUgY3NzKQorICAgICAgICBhKCc8dGl0bGU+Q2FsZW5kYXIgZm9yICVkPC90aXRsZVxuJyAlIHRoZXllYXIpCisgICAgICAgIGEoJzwvaGVhZD5cbicpCisgICAgICAgIGEoJzxib2R5PlxuJykKKyAgICAgICAgYShzZWxmLmZvcm1hdHllYXIodGhleWVhciwgd2lkdGgpKQorICAgICAgICBhKCc8L2JvZHk+XG4nKQorICAgICAgICBhKCc8L2h0bWw+XG4nKQorICAgICAgICByZXR1cm4gJycuam9pbih2KS5lbmNvZGUoZW5jb2RpbmcsICJ4bWxjaGFycmVmcmVwbGFjZSIpCisKKworY2xhc3MgVGltZUVuY29kaW5nOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhbGUpOgorICAgICAgICBzZWxmLmxvY2FsZSA9IGxvY2FsZQorCisgICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5vbGRsb2NhbGUgPSBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FLCBzZWxmLmxvY2FsZSkKKyAgICAgICAgcmV0dXJuIGxvY2FsZS5nZXRsb2NhbGUobG9jYWxlLkxDX1RJTUUpWzFdCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FLCBzZWxmLm9sZGxvY2FsZSkKKworCitjbGFzcyBMb2NhbGVUZXh0Q2FsZW5kYXIoVGV4dENhbGVuZGFyKToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGNhbiBiZSBwYXNzZWQgYSBsb2NhbGUgbmFtZSBpbiB0aGUgY29uc3RydWN0b3IgYW5kIHdpbGwgcmV0dXJuCisgICAgbW9udGggYW5kIHdlZWtkYXkgbmFtZXMgaW4gdGhlIHNwZWNpZmllZCBsb2NhbGUuIElmIHRoaXMgbG9jYWxlIGluY2x1ZGVzCisgICAgYW4gZW5jb2RpbmcgYWxsIHN0cmluZ3MgY29udGFpbmluZyBtb250aCBhbmQgd2Vla2RheSBuYW1lcyB3aWxsIGJlIHJldHVybmVkCisgICAgYXMgdW5pY29kZS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaXJzdHdlZWtkYXk9MCwgbG9jYWxlPU5vbmUpOgorICAgICAgICBUZXh0Q2FsZW5kYXIuX19pbml0X18oc2VsZiwgZmlyc3R3ZWVrZGF5KQorICAgICAgICBpZiBsb2NhbGUgaXMgTm9uZToKKyAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKCkKKyAgICAgICAgc2VsZi5sb2NhbGUgPSBsb2NhbGUKKworICAgIGRlZiBmb3JtYXR3ZWVrZGF5KHNlbGYsIGRheSwgd2lkdGgpOgorICAgICAgICB3aXRoIFRpbWVFbmNvZGluZyhzZWxmLmxvY2FsZSkgYXMgZW5jb2Rpbmc6CisgICAgICAgICAgICBpZiB3aWR0aCA+PSA5OgorICAgICAgICAgICAgICAgIG5hbWVzID0gZGF5X25hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmFtZXMgPSBkYXlfYWJicgorICAgICAgICAgICAgbmFtZSA9IG5hbWVzW2RheV0KKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIHJldHVybiBuYW1lWzp3aWR0aF0uY2VudGVyKHdpZHRoKQorCisgICAgZGVmIGZvcm1hdG1vbnRobmFtZShzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgd2lkdGgsIHdpdGh5ZWFyPVRydWUpOgorICAgICAgICB3aXRoIFRpbWVFbmNvZGluZyhzZWxmLmxvY2FsZSkgYXMgZW5jb2Rpbmc6CisgICAgICAgICAgICBzID0gbW9udGhfbmFtZVt0aGVtb250aF0KKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHMgPSBzLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIGlmIHdpdGh5ZWFyOgorICAgICAgICAgICAgICAgIHMgPSAiJXMgJXIiICUgKHMsIHRoZXllYXIpCisgICAgICAgICAgICByZXR1cm4gcy5jZW50ZXIod2lkdGgpCisKKworY2xhc3MgTG9jYWxlSFRNTENhbGVuZGFyKEhUTUxDYWxlbmRhcik6CisgICAgIiIiCisgICAgVGhpcyBjbGFzcyBjYW4gYmUgcGFzc2VkIGEgbG9jYWxlIG5hbWUgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB3aWxsIHJldHVybgorICAgIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLiBJZiB0aGlzIGxvY2FsZSBpbmNsdWRlcworICAgIGFuIGVuY29kaW5nIGFsbCBzdHJpbmdzIGNvbnRhaW5pbmcgbW9udGggYW5kIHdlZWtkYXkgbmFtZXMgd2lsbCBiZSByZXR1cm5lZAorICAgIGFzIHVuaWNvZGUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0d2Vla2RheT0wLCBsb2NhbGU9Tm9uZSk6CisgICAgICAgIEhUTUxDYWxlbmRhci5fX2luaXRfXyhzZWxmLCBmaXJzdHdlZWtkYXkpCisgICAgICAgIGlmIGxvY2FsZSBpcyBOb25lOgorICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlLmdldGRlZmF1bHRsb2NhbGUoKQorICAgICAgICBzZWxmLmxvY2FsZSA9IGxvY2FsZQorCisgICAgZGVmIGZvcm1hdHdlZWtkYXkoc2VsZiwgZGF5KToKKyAgICAgICAgd2l0aCBUaW1lRW5jb2Rpbmcoc2VsZi5sb2NhbGUpIGFzIGVuY29kaW5nOgorICAgICAgICAgICAgcyA9IGRheV9hYmJyW2RheV0KKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHMgPSBzLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIHJldHVybiAnPHRoIGNsYXNzPSIlcyI+JXM8L3RoPicgJSAoc2VsZi5jc3NjbGFzc2VzW2RheV0sIHMpCisKKyAgICBkZWYgZm9ybWF0bW9udGhuYW1lKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3aXRoeWVhcj1UcnVlKToKKyAgICAgICAgd2l0aCBUaW1lRW5jb2Rpbmcoc2VsZi5sb2NhbGUpIGFzIGVuY29kaW5nOgorICAgICAgICAgICAgcyA9IG1vbnRoX25hbWVbdGhlbW9udGhdCisgICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzID0gcy5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBpZiB3aXRoeWVhcjoKKyAgICAgICAgICAgICAgICBzID0gJyVzICVzJyAlIChzLCB0aGV5ZWFyKQorICAgICAgICAgICAgcmV0dXJuICc8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+JXM8L3RoPjwvdHI+JyAlIHMKKworCisjIFN1cHBvcnQgZm9yIG9sZCBtb2R1bGUgbGV2ZWwgaW50ZXJmYWNlCitjID0gVGV4dENhbGVuZGFyKCkKKworZmlyc3R3ZWVrZGF5ID0gYy5nZXRmaXJzdHdlZWtkYXkKKworZGVmIHNldGZpcnN0d2Vla2RheShmaXJzdHdlZWtkYXkpOgorICAgIGlmIG5vdCBNT05EQVkgPD0gZmlyc3R3ZWVrZGF5IDw9IFNVTkRBWToKKyAgICAgICAgcmFpc2UgSWxsZWdhbFdlZWtkYXlFcnJvcihmaXJzdHdlZWtkYXkpCisgICAgYy5maXJzdHdlZWtkYXkgPSBmaXJzdHdlZWtkYXkKKworbW9udGhjYWxlbmRhciA9IGMubW9udGhkYXlzY2FsZW5kYXIKK3Byd2VlayA9IGMucHJ3ZWVrCit3ZWVrID0gYy5mb3JtYXR3ZWVrCit3ZWVraGVhZGVyID0gYy5mb3JtYXR3ZWVraGVhZGVyCitwcm1vbnRoID0gYy5wcm1vbnRoCittb250aCA9IGMuZm9ybWF0bW9udGgKK2NhbGVuZGFyID0gYy5mb3JtYXR5ZWFyCitwcmNhbCA9IGMucHJ5ZWFyCisKKworIyBTcGFjaW5nIG9mIG1vbnRoIGNvbHVtbnMgZm9yIG11bHRpLWNvbHVtbiB5ZWFyIGNhbGVuZGFyCiBfY29sd2lkdGggPSA3KjMgLSAxICAgICAgICAgIyBBbW91bnQgcHJpbnRlZCBieSBwcndlZWsoKQogX3NwYWNpbmcgPSA2ICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIHNwYWNlcyBiZXR3ZWVuIGNvbHVtbnMKIAotZGVmIGZvcm1hdDNjKGEsIGIsIGMsIGNvbHdpZHRoPV9jb2x3aWR0aCwgc3BhY2luZz1fc3BhY2luZyk6Ci0gICAgIiIiUHJpbnRzIDMtY29sdW1uIGZvcm1hdHRpbmcgZm9yIHllYXIgY2FsZW5kYXJzIiIiCi0gICAgcHJpbnQgZm9ybWF0M2NzdHJpbmcoYSwgYiwgYywgY29sd2lkdGgsIHNwYWNpbmcpCiAKLWRlZiBmb3JtYXQzY3N0cmluZyhhLCBiLCBjLCBjb2x3aWR0aD1fY29sd2lkdGgsIHNwYWNpbmc9X3NwYWNpbmcpOgotICAgICIiIlJldHVybnMgYSBzdHJpbmcgZm9ybWF0dGVkIGZyb20gMyBzdHJpbmdzLCBjZW50ZXJlZCB3aXRoaW4gMyBjb2x1bW5zLiIiIgotICAgIHJldHVybiAoYS5jZW50ZXIoY29sd2lkdGgpICsgJyAnICogc3BhY2luZyArIGIuY2VudGVyKGNvbHdpZHRoKSArCi0gICAgICAgICAgICAnICcgKiBzcGFjaW5nICsgYy5jZW50ZXIoY29sd2lkdGgpKQorZGVmIGZvcm1hdChjb2xzLCBjb2x3aWR0aD1fY29sd2lkdGgsIHNwYWNpbmc9X3NwYWNpbmcpOgorICAgICIiIlByaW50cyBtdWx0aS1jb2x1bW4gZm9ybWF0dGluZyBmb3IgeWVhciBjYWxlbmRhcnMiIiIKKyAgICBwcmludCBmb3JtYXRzdHJpbmcoY29scywgY29sd2lkdGgsIHNwYWNpbmcpCiAKLWRlZiBwcmNhbCh5ZWFyLCB3PTAsIGw9MCwgYz1fc3BhY2luZyk6Ci0gICAgIiIiUHJpbnQgYSB5ZWFyJ3MgY2FsZW5kYXIuIiIiCi0gICAgcHJpbnQgY2FsZW5kYXIoeWVhciwgdywgbCwgYyksCiAKLWRlZiBjYWxlbmRhcih5ZWFyLCB3PTAsIGw9MCwgYz1fc3BhY2luZyk6Ci0gICAgIiIiUmV0dXJucyBhIHllYXIncyBjYWxlbmRhciBhcyBhIG11bHRpLWxpbmUgc3RyaW5nLiIiIgotICAgIHcgPSBtYXgoMiwgdykKLSAgICBsID0gbWF4KDEsIGwpCi0gICAgYyA9IG1heCgyLCBjKQotICAgIGNvbHdpZHRoID0gKHcgKyAxKSAqIDcgLSAxCi0gICAgcyA9IHJlcHIoeWVhcikuY2VudGVyKGNvbHdpZHRoICogMyArIGMgKiAyKS5yc3RyaXAoKSArICdcbicgKiBsCi0gICAgaGVhZGVyID0gd2Vla2hlYWRlcih3KQotICAgIGhlYWRlciA9IGZvcm1hdDNjc3RyaW5nKGhlYWRlciwgaGVhZGVyLCBoZWFkZXIsIGNvbHdpZHRoLCBjKS5yc3RyaXAoKQotICAgIGZvciBxIGluIHJhbmdlKEphbnVhcnksIEphbnVhcnkrMTIsIDMpOgotICAgICAgICBzID0gKHMgKyAnXG4nICogbCArCi0gICAgICAgICAgICAgZm9ybWF0M2NzdHJpbmcobW9udGhfbmFtZVtxXSwgbW9udGhfbmFtZVtxKzFdLCBtb250aF9uYW1lW3ErMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sd2lkdGgsIGMpLnJzdHJpcCgpICsKLSAgICAgICAgICAgICAnXG4nICogbCArIGhlYWRlciArICdcbicgKiBsKQotICAgICAgICBkYXRhID0gW10KLSAgICAgICAgaGVpZ2h0ID0gMAotICAgICAgICBmb3IgYW1vbnRoIGluIHJhbmdlKHEsIHEgKyAzKToKLSAgICAgICAgICAgIGNhbCA9IG1vbnRoY2FsZW5kYXIoeWVhciwgYW1vbnRoKQotICAgICAgICAgICAgaWYgbGVuKGNhbCkgPiBoZWlnaHQ6Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gbGVuKGNhbCkKLSAgICAgICAgICAgIGRhdGEuYXBwZW5kKGNhbCkKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoaGVpZ2h0KToKLSAgICAgICAgICAgIHdlZWtzID0gW10KLSAgICAgICAgICAgIGZvciBjYWwgaW4gZGF0YToKLSAgICAgICAgICAgICAgICBpZiBpID49IGxlbihjYWwpOgotICAgICAgICAgICAgICAgICAgICB3ZWVrcy5hcHBlbmQoJycpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgd2Vla3MuYXBwZW5kKHdlZWsoY2FsW2ldLCB3KSkKLSAgICAgICAgICAgIHMgPSBzICsgZm9ybWF0M2NzdHJpbmcod2Vla3NbMF0sIHdlZWtzWzFdLCB3ZWVrc1syXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sd2lkdGgsIGMpLnJzdHJpcCgpICsgJ1xuJyAqIGwKLSAgICByZXR1cm4gc1s6LWxdICsgJ1xuJworZGVmIGZvcm1hdHN0cmluZyhjb2xzLCBjb2x3aWR0aD1fY29sd2lkdGgsIHNwYWNpbmc9X3NwYWNpbmcpOgorICAgICIiIlJldHVybnMgYSBzdHJpbmcgZm9ybWF0dGVkIGZyb20gbiBzdHJpbmdzLCBjZW50ZXJlZCB3aXRoaW4gbiBjb2x1bW5zLiIiIgorICAgIHNwYWNpbmcgKj0gJyAnCisgICAgcmV0dXJuIHNwYWNpbmcuam9pbihjLmNlbnRlcihjb2x3aWR0aCkgZm9yIGMgaW4gY29scykKKwogCiBFUE9DSCA9IDE5NzAKIF9FUE9DSF9PUkQgPSBkYXRldGltZS5kYXRlKEVQT0NILCAxLCAxKS50b29yZGluYWwoKQogCisKIGRlZiB0aW1lZ20odHVwbGUpOgogICAgICIiIlVucmVsYXRlZCBidXQgaGFuZHkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIFVuaXggdGltZXN0YW1wIGZyb20gR01ULiIiIgogICAgIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kID0gdHVwbGVbOjZdCkBAIC0yMjksMyArNjA4LDk3IEBACiAgICAgbWludXRlcyA9IGhvdXJzKjYwICsgbWludXRlCiAgICAgc2Vjb25kcyA9IG1pbnV0ZXMqNjAgKyBzZWNvbmQKICAgICByZXR1cm4gc2Vjb25kcworCisKK2RlZiBtYWluKGFyZ3MpOgorICAgIGltcG9ydCBvcHRwYXJzZQorICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcih1c2FnZT0idXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBbeWVhciBbbW9udGhdXSIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItdyIsICItLXdpZHRoIiwKKyAgICAgICAgZGVzdD0id2lkdGgiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTIsCisgICAgICAgIGhlbHA9IndpZHRoIG9mIGRhdGUgY29sdW1uIChkZWZhdWx0IDIsIHRleHQgb25seSkiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLWwiLCAiLS1saW5lcyIsCisgICAgICAgIGRlc3Q9ImxpbmVzIiwgdHlwZT0iaW50IiwgZGVmYXVsdD0xLAorICAgICAgICBoZWxwPSJudW1iZXIgb2YgbGluZXMgZm9yIGVhY2ggd2VlayAoZGVmYXVsdCAxLCB0ZXh0IG9ubHkpIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1zIiwgIi0tc3BhY2luZyIsCisgICAgICAgIGRlc3Q9InNwYWNpbmciLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTYsCisgICAgICAgIGhlbHA9InNwYWNpbmcgYmV0d2VlbiBtb250aHMgKGRlZmF1bHQgNiwgdGV4dCBvbmx5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItbSIsICItLW1vbnRocyIsCisgICAgICAgIGRlc3Q9Im1vbnRocyIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MywKKyAgICAgICAgaGVscD0ibW9udGhzIHBlciByb3cgKGRlZmF1bHQgMywgdGV4dCBvbmx5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItYyIsICItLWNzcyIsCisgICAgICAgIGRlc3Q9ImNzcyIsIGRlZmF1bHQ9ImNhbGVuZGFyLmNzcyIsCisgICAgICAgIGhlbHA9IkNTUyB0byB1c2UgZm9yIHBhZ2UgKGh0bWwgb25seSkiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLUwiLCAiLS1sb2NhbGUiLAorICAgICAgICBkZXN0PSJsb2NhbGUiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgIGhlbHA9ImxvY2FsZSB0byBiZSB1c2VkIGZyb20gbW9udGggYW5kIHdlZWtkYXkgbmFtZXMiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLWUiLCAiLS1lbmNvZGluZyIsCisgICAgICAgIGRlc3Q9ImVuY29kaW5nIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICBoZWxwPSJFbmNvZGluZyB0byB1c2UgZm9yIG91dHB1dCIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItdCIsICItLXR5cGUiLAorICAgICAgICBkZXN0PSJ0eXBlIiwgZGVmYXVsdD0idGV4dCIsCisgICAgICAgIGNob2ljZXM9KCJ0ZXh0IiwgImh0bWwiKSwKKyAgICAgICAgaGVscD0ib3V0cHV0IHR5cGUgKHRleHQgb3IgaHRtbCkiCisgICAgKQorCisgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKKworICAgIGlmIG9wdGlvbnMubG9jYWxlIGFuZCBub3Qgb3B0aW9ucy5lbmNvZGluZzoKKyAgICAgICAgcGFyc2VyLmVycm9yKCJpZiAtLWxvY2FsZSBpcyBzcGVjaWZpZWQgLS1lbmNvZGluZyBpcyByZXF1aXJlZCIpCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBpZiBvcHRpb25zLnR5cGUgPT0gImh0bWwiOgorICAgICAgICBpZiBvcHRpb25zLmxvY2FsZToKKyAgICAgICAgICAgIGNhbCA9IExvY2FsZUhUTUxDYWxlbmRhcihsb2NhbGU9b3B0aW9ucy5sb2NhbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjYWwgPSBIVE1MQ2FsZW5kYXIoKQorICAgICAgICBlbmNvZGluZyA9IG9wdGlvbnMuZW5jb2RpbmcKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gc3lzLmdldGRlZmF1bHRlbmNvZGluZygpCisgICAgICAgIG9wdGRpY3QgPSBkaWN0KGVuY29kaW5nPWVuY29kaW5nLCBjc3M9b3B0aW9ucy5jc3MpCisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICAgICAgcHJpbnQgY2FsLmZvcm1hdHllYXJwYWdlKGRhdGV0aW1lLmRhdGUudG9kYXkoKS55ZWFyLCAqKm9wdGRpY3QpCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgICAgICBwcmludCBjYWwuZm9ybWF0eWVhcnBhZ2UoaW50KGFyZ3NbMV0pLCAqKm9wdGRpY3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZXIuZXJyb3IoImluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIikKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgZWxzZToKKyAgICAgICAgaWYgb3B0aW9ucy5sb2NhbGU6CisgICAgICAgICAgICBjYWwgPSBMb2NhbGVUZXh0Q2FsZW5kYXIobG9jYWxlPW9wdGlvbnMubG9jYWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2FsID0gVGV4dENhbGVuZGFyKCkKKyAgICAgICAgb3B0ZGljdCA9IGRpY3Qodz1vcHRpb25zLndpZHRoLCBsPW9wdGlvbnMubGluZXMpCisgICAgICAgIGlmIGxlbihhcmdzKSAhPSAzOgorICAgICAgICAgICAgb3B0ZGljdFsiYyJdID0gb3B0aW9ucy5zcGFjaW5nCisgICAgICAgICAgICBvcHRkaWN0WyJtIl0gPSBvcHRpb25zLm1vbnRocworICAgICAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKGRhdGV0aW1lLmRhdGUudG9kYXkoKS55ZWFyLCAqKm9wdGRpY3QpCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0eWVhcihpbnQoYXJnc1sxXSksICoqb3B0ZGljdCkKKyAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMzoKKyAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXRtb250aChpbnQoYXJnc1sxXSksIGludChhcmdzWzJdKSwgKipvcHRkaWN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyc2VyLmVycm9yKCJpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyIpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBpZiBvcHRpb25zLmVuY29kaW5nOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmVuY29kZShvcHRpb25zLmVuY29kaW5nKQorICAgICAgICBwcmludCByZXN1bHQKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS9MaWIvY29kZWNzLnB5IGIvTGliL2NvZGVjcy5weQppbmRleCAyODg1NmM3Li4xNTE4ZDc1IDEwMDY0NAotLS0gYS9MaWIvY29kZWNzLnB5CisrKyBiL0xpYi9jb2RlY3MucHkKQEAgLTE0LDggKzE0LDcgQEAKIHRyeToKICAgICBmcm9tIF9jb2RlY3MgaW1wb3J0ICoKIGV4Y2VwdCBJbXBvcnRFcnJvciwgd2h5OgotICAgIHJhaXNlIFN5c3RlbUVycm9yLFwKLSAgICAgICAgICAnRmFpbGVkIHRvIGxvYWQgdGhlIGJ1aWx0aW4gY29kZWNzOiAlcycgJSB3aHkKKyAgICByYWlzZSBTeXN0ZW1FcnJvcignRmFpbGVkIHRvIGxvYWQgdGhlIGJ1aWx0aW4gY29kZWNzOiAlcycgJSB3aHkpCiAKIF9fYWxsX18gPSBbInJlZ2lzdGVyIiwgImxvb2t1cCIsICJvcGVuIiwgIkVuY29kZWRGaWxlIiwgIkJPTSIsICJCT01fQkUiLAogICAgICAgICAgICAiQk9NX0xFIiwgIkJPTTMyX0JFIiwgIkJPTTMyX0xFIiwgIkJPTTY0X0JFIiwgIkJPTTY0X0xFIiwKQEAgLTE1NiwxMyArMTU1LDEzIEBACiAKIGNsYXNzIEluY3JlbWVudGFsRW5jb2RlcihvYmplY3QpOgogICAgICIiIgotICAgIEEgSW5jcmVtZW50YWxFbmNvZGVyIGVuY29kZXMgYW4gaW5wdXQgaW4gbXVsdGlwbGUgc3RlcHMuIFRoZSBpbnB1dCBjYW4gYmUKKyAgICBBbiBJbmNyZW1lbnRhbEVuY29kZXIgZW5jb2RlcyBhbiBpbnB1dCBpbiBtdWx0aXBsZSBzdGVwcy4gVGhlIGlucHV0IGNhbiBiZQogICAgIHBhc3NlZCBwaWVjZSBieSBwaWVjZSB0byB0aGUgZW5jb2RlKCkgbWV0aG9kLiBUaGUgSW5jcmVtZW50YWxFbmNvZGVyIHJlbWVtYmVycwogICAgIHRoZSBzdGF0ZSBvZiB0aGUgRW5jb2RpbmcgcHJvY2VzcyBiZXR3ZWVuIGNhbGxzIHRvIGVuY29kZSgpLgogICAgICIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgogICAgICAgICAiIiIKLSAgICAgICAgQ3JlYXRlcyBhIEluY3JlbWVudGFsRW5jb2RlciBpbnN0YW5jZS4KKyAgICAgICAgQ3JlYXRlcyBhbiBJbmNyZW1lbnRhbEVuY29kZXIgaW5zdGFuY2UuCiAKICAgICAgICAgVGhlIEluY3JlbWVudGFsRW5jb2RlciBtYXkgdXNlIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGJ5CiAgICAgICAgIHByb3ZpZGluZyB0aGUgZXJyb3JzIGtleXdvcmQgYXJndW1lbnQuIFNlZSB0aGUgbW9kdWxlIGRvY3N0cmluZwpAQCAtMTgyLDYgKzE4MSwzMyBAQAogICAgICAgICBSZXNldHMgdGhlIGVuY29kZXIgdG8gdGhlIGluaXRpYWwgc3RhdGUuCiAgICAgICAgICIiIgogCitjbGFzcyBCdWZmZXJlZEluY3JlbWVudGFsRW5jb2RlcihJbmNyZW1lbnRhbEVuY29kZXIpOgorICAgICIiIgorICAgIFRoaXMgc3ViY2xhc3Mgb2YgSW5jcmVtZW50YWxFbmNvZGVyIGNhbiBiZSB1c2VkIGFzIHRoZSBiYXNlY2xhc3MgZm9yIGFuCisgICAgaW5jcmVtZW50YWwgZW5jb2RlciBpZiB0aGUgZW5jb2RlciBtdXN0IGtlZXAgc29tZSBvZiB0aGUgb3V0cHV0IGluIGEKKyAgICBidWZmZXIgYmV0d2VlbiBjYWxscyB0byBlbmNvZGUoKS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgSW5jcmVtZW50YWxFbmNvZGVyLl9faW5pdF9fKHNlbGYsIGVycm9ycykKKyAgICAgICAgc2VsZi5idWZmZXIgPSAiIiAjIHVuZW5jb2RlZCBpbnB1dCB0aGF0IGlzIGtlcHQgYmV0d2VlbiBjYWxscyB0byBlbmNvZGUoKQorCisgICAgZGVmIF9idWZmZXJfZW5jb2RlKHNlbGYsIGlucHV0LCBlcnJvcnMsIGZpbmFsKToKKyAgICAgICAgIyBPdmVyd3JpdGUgdGhpcyBtZXRob2QgaW4gc3ViY2xhc3NlczogSXQgbXVzdCBlbmNvZGUgaW5wdXQKKyAgICAgICAgIyBhbmQgcmV0dXJuIGFuIChvdXRwdXQsIGxlbmd0aCBjb25zdW1lZCkgdHVwbGUKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICAjIGVuY29kZSBpbnB1dCAodGFraW5nIHRoZSBidWZmZXIgaW50byBhY2NvdW50KQorICAgICAgICBkYXRhID0gc2VsZi5idWZmZXIgKyBpbnB1dAorICAgICAgICAocmVzdWx0LCBjb25zdW1lZCkgPSBzZWxmLl9idWZmZXJfZW5jb2RlKGRhdGEsIHNlbGYuZXJyb3JzLCBmaW5hbCkKKyAgICAgICAgIyBrZWVwIHVuZW5jb2RlZCBpbnB1dCB1bnRpbCB0aGUgbmV4dCBjYWxsCisgICAgICAgIHNlbGYuYnVmZmVyID0gZGF0YVtjb25zdW1lZDpdCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgSW5jcmVtZW50YWxFbmNvZGVyLnJlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKwogY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG9iamVjdCk6CiAgICAgIiIiCiAgICAgQW4gSW5jcmVtZW50YWxEZWNvZGVyIGRlY29kZXMgYW4gaW5wdXQgaW4gbXVsdGlwbGUgc3RlcHMuIFRoZSBpbnB1dCBjYW4gYmUKQEAgLTIzNCw3ICsyNjAsNyBAQAogCiAgICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgICBJbmNyZW1lbnRhbERlY29kZXIucmVzZXQoc2VsZikKLSAgICAgICAgc2VsZi5ieXRlYnVmZmVyID0gIiIKKyAgICAgICAgc2VsZi5idWZmZXIgPSAiIgogCiAjCiAjIFRoZSBTdHJlYW1Xcml0ZXIgYW5kIFN0cmVhbVJlYWRlciBjbGFzcyBwcm92aWRlIGdlbmVyaWMgd29ya2luZwpkaWZmIC0tZ2l0IGEvTGliL2NvbnRleHRsaWIucHkgYi9MaWIvY29udGV4dGxpYi5weQppbmRleCAwYTVkNjA4Li5hYTUzMzVkIDEwMDY0NAotLS0gYS9MaWIvY29udGV4dGxpYi5weQorKysgYi9MaWIvY29udGV4dGxpYi5weQpAQCAtMzAsOSArMzAsMjIgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBzZWxmLmdlbi50aHJvdyh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKQotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiZ2VuZXJhdG9yIGRpZG4ndCBzdG9wIGFmdGVyIHRocm93KCkiKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb24sIGV4YzoKKyAgICAgICAgICAgICAgICAjIFN1cHByZXNzIHRoZSBleGNlcHRpb24gKnVubGVzcyogaXQncyB0aGUgc2FtZSBleGNlcHRpb24gdGhhdAorICAgICAgICAgICAgICAgICMgd2FzIHBhc3NlZCB0byB0aHJvdygpLiAgVGhpcyBwcmV2ZW50cyBhIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICAjIHJhaXNlZCBpbnNpZGUgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgZnJvbSBiZWluZyBzdXBwcmVzc2VkCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4YyBpcyBub3QgdmFsdWUKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIG9ubHkgcmUtcmFpc2UgaWYgaXQncyAqbm90KiB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzCisgICAgICAgICAgICAgICAgIyBwYXNzZWQgdG8gdGhyb3coKSwgYmVjYXVzZSBfX2V4aXRfXygpIG11c3Qgbm90IHJhaXNlCisgICAgICAgICAgICAgICAgIyBhbiBleGNlcHRpb24gdW5sZXNzIF9fZXhpdF9fKCkgaXRzZWxmIGZhaWxlZC4gIEJ1dCB0aHJvdygpCisgICAgICAgICAgICAgICAgIyBoYXMgdG8gcmFpc2UgdGhlIGV4Y2VwdGlvbiB0byBzaWduYWwgcHJvcGFnYXRpb24sIHNvIHRoaXMKKyAgICAgICAgICAgICAgICAjIGZpeGVzIHRoZSBpbXBlZGFuY2UgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgdGhyb3coKSBwcm90b2NvbAorICAgICAgICAgICAgICAgICMgYW5kIHRoZSBfX2V4aXRfXygpIHByb3RvY29sLgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICBpZiBzeXMuZXhjX2luZm8oKVsxXSBpcyBub3QgdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAKIAogZGVmIGNvbnRleHRtYW5hZ2VyKGZ1bmMpOgpAQCAtNjgsNiArODEsNyBAQAogICAgIHRyeToKICAgICAgICAgaGVscGVyLl9fbmFtZV9fID0gZnVuYy5fX25hbWVfXwogICAgICAgICBoZWxwZXIuX19kb2NfXyA9IGZ1bmMuX19kb2NfXworICAgICAgICBoZWxwZXIuX19kaWN0X18gPSBmdW5jLl9fZGljdF9fCiAgICAgZXhjZXB0OgogICAgICAgICBwYXNzCiAgICAgcmV0dXJuIGhlbHBlcgpkaWZmIC0tZ2l0IGEvTGliL2NvcHlfcmVnLnB5IGIvTGliL2NvcHlfcmVnLnB5CmluZGV4IDE2OTUyMGQuLmY0NjYxZWQgMTAwNjQ0Ci0tLSBhL0xpYi9jb3B5X3JlZy5weQorKysgYi9MaWIvY29weV9yZWcucHkKQEAgLTExMSw4ICsxMTEsMTkgQEAKICAgICAgICAgIyBTbG90cyBmb3VuZCAtLSBnYXRoZXIgc2xvdCBuYW1lcyBmcm9tIGFsbCBiYXNlIGNsYXNzZXMKICAgICAgICAgZm9yIGMgaW4gY2xzLl9fbXJvX186CiAgICAgICAgICAgICBpZiAiX19zbG90c19fIiBpbiBjLl9fZGljdF9fOgotICAgICAgICAgICAgICAgIG5hbWVzICs9IFtuYW1lIGZvciBuYW1lIGluIGMuX19kaWN0X19bIl9fc2xvdHNfXyJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gKCJfX2RpY3RfXyIsICJfX3dlYWtyZWZfXyIpXQorICAgICAgICAgICAgICAgIHNsb3RzID0gYy5fX2RpY3RfX1snX19zbG90c19fJ10KKyAgICAgICAgICAgICAgICAjIGlmIGNsYXNzIGhhcyBhIHNpbmdsZSBzbG90LCBpdCBjYW4gYmUgZ2l2ZW4gYXMgYSBzdHJpbmcKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNsb3RzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICAgICAgc2xvdHMgPSAoc2xvdHMsKQorICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHNsb3RzOgorICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgZGVzY3JpcHRvcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiAoIl9fZGljdF9fIiwgIl9fd2Vha3JlZl9fIik6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAjIG1hbmdsZWQgbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBuYW1lLnN0YXJ0c3dpdGgoJ19fJykgYW5kIG5vdCBuYW1lLmVuZHN3aXRoKCdfXycpOgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYXBwZW5kKCdfJXMlcycgJSAoYy5fX25hbWVfXywgbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hcHBlbmQobmFtZSkKIAogICAgICMgQ2FjaGUgdGhlIG91dGNvbWUgaW4gdGhlIGNsYXNzIGlmIGF0IGFsbCBwb3NzaWJsZQogICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvX19pbml0X18ucHkgYi9MaWIvY3R5cGVzL19faW5pdF9fLnB5CmluZGV4IGRkMGY2NDAuLjI4YWMxODAgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvX19pbml0X18ucHkKKysrIGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQpAQCAtOSwxMSArOSw3IEBACiBmcm9tIF9jdHlwZXMgaW1wb3J0IF9Qb2ludGVyCiBmcm9tIF9jdHlwZXMgaW1wb3J0IENGdW5jUHRyIGFzIF9DRnVuY1B0cgogZnJvbSBfY3R5cGVzIGltcG9ydCBfX3ZlcnNpb25fXyBhcyBfY3R5cGVzX3ZlcnNpb24KLXRyeToKLSAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IFJUTERfTE9DQUwsIFJUTERfR0xPQkFMCi1leGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6Ci0gICAgUlRMRF9HTE9CQUwgPSBSVExEX0xPQ0FMID0gTm9uZQotCitmcm9tIF9jdHlwZXMgaW1wb3J0IFJUTERfTE9DQUwsIFJUTERfR0xPQkFMCiBmcm9tIF9jdHlwZXMgaW1wb3J0IEFyZ3VtZW50RXJyb3IKIAogZnJvbSBzdHJ1Y3QgaW1wb3J0IGNhbGNzaXplIGFzIF9jYWxjc2l6ZQpAQCAtMzA0LDEwICszMDAsMTEgQEAKICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBuYW1lCiAgICAgICAgIHJldHVybiBzZWxmLl9fZ2V0aXRlbV9fKG5hbWUpCiAKLSAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6Ci0gICAgICAgIGZ1bmMgPSBzZWxmLl9GdW5jUHRyKG5hbWUsIHNlbGYpCi0gICAgICAgIGZ1bmMuX19uYW1lX18gPSBuYW1lCi0gICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgZnVuYykKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZV9vcl9vcmRpbmFsKToKKyAgICAgICAgZnVuYyA9IHNlbGYuX0Z1bmNQdHIoKG5hbWVfb3Jfb3JkaW5hbCwgc2VsZikpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5hbWVfb3Jfb3JkaW5hbCwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgZnVuYy5fX25hbWVfXyA9IG5hbWVfb3Jfb3JkaW5hbAorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lX29yX29yZGluYWwsIGZ1bmMpCiAgICAgICAgIHJldHVybiBmdW5jCiAKIGNsYXNzIFB5RExMKENETEwpOgpAQCAtMzg0LDIxICszODEsMjkgQEAKIAogX3BvaW50ZXJfdHlwZV9jYWNoZVtOb25lXSA9IGNfdm9pZF9wCiAKLSMgZnVuY3Rpb25zCi0KLWZyb20gX2N0eXBlcyBpbXBvcnQgX21lbW1vdmVfYWRkciwgX21lbXNldF9hZGRyLCBfc3RyaW5nX2F0X2FkZHIsIGNhc3QKLQogaWYgc2l6ZW9mKGNfdWludCkgPT0gc2l6ZW9mKGNfdm9pZF9wKToKICAgICBjX3NpemVfdCA9IGNfdWludAogZWxpZiBzaXplb2YoY191bG9uZykgPT0gc2l6ZW9mKGNfdm9pZF9wKToKICAgICBjX3NpemVfdCA9IGNfdWxvbmcKIAorIyBmdW5jdGlvbnMKKworZnJvbSBfY3R5cGVzIGltcG9ydCBfbWVtbW92ZV9hZGRyLCBfbWVtc2V0X2FkZHIsIF9zdHJpbmdfYXRfYWRkciwgX2Nhc3RfYWRkcgorCiAjIyB2b2lkICptZW1tb3ZlKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwogbWVtbW92ZSA9IENGVU5DVFlQRShjX3ZvaWRfcCwgY192b2lkX3AsIGNfdm9pZF9wLCBjX3NpemVfdCkoX21lbW1vdmVfYWRkcikKIAogIyMgdm9pZCAqbWVtc2V0KHZvaWQgKiwgaW50LCBzaXplX3QpCiBtZW1zZXQgPSBDRlVOQ1RZUEUoY192b2lkX3AsIGNfdm9pZF9wLCBjX2ludCwgY19zaXplX3QpKF9tZW1zZXRfYWRkcikKIAorZGVmIFBZRlVOQ1RZUEUocmVzdHlwZSwgKmFyZ3R5cGVzKToKKyAgICBjbGFzcyBDRnVuY3Rpb25UeXBlKF9DRnVuY1B0cik6CisgICAgICAgIF9hcmd0eXBlc18gPSBhcmd0eXBlcworICAgICAgICBfcmVzdHlwZV8gPSByZXN0eXBlCisgICAgICAgIF9mbGFnc18gPSBfRlVOQ0ZMQUdfQ0RFQ0wgfCBfRlVOQ0ZMQUdfUFlUSE9OQVBJCisgICAgcmV0dXJuIENGdW5jdGlvblR5cGUKK2Nhc3QgPSBQWUZVTkNUWVBFKHB5X29iamVjdCwgY192b2lkX3AsIHB5X29iamVjdCkoX2Nhc3RfYWRkcikKKwogX3N0cmluZ19hdCA9IENGVU5DVFlQRShweV9vYmplY3QsIGNfdm9pZF9wLCBjX2ludCkoX3N0cmluZ19hdF9hZGRyKQogZGVmIHN0cmluZ19hdChwdHIsIHNpemU9MCk6CiAgICAgIiIic3RyaW5nX2F0KGFkZHJbLCBzaXplXSkgLT4gc3RyaW5nCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL19sb2FkZXIucHkgYi9MaWIvY3R5cGVzL19sb2FkZXIucHkKaW5kZXggN2JkZTZjNi4uN2E0OGMxYyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy9fbG9hZGVyLnB5CisrKyBiL0xpYi9jdHlwZXMvX2xvYWRlci5weQpAQCAtMSwxNCArMSwxMSBAQAotIyBXT1JLIElOIFBST0dSRVNTISAgRE8gTk9UICh5ZXQpIFVTRSEKIGltcG9ydCBzeXMsIG9zCiBpbXBvcnQgY3R5cGVzCiAKLV9fYWxsX18gPSBbIkxpYnJhcnlMb2FkZXIiLCAiUlRMRF9MT0NBTCIsICJSVExEX0dMT0JBTCJdCi0KIGlmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgTG9hZExpYnJhcnkgYXMgZGxvcGVuCi0gICAgUlRMRF9MT0NBTCA9IFJUTERfR0xPQkFMID0gTm9uZQogZWxzZToKLSAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IGRsb3BlbiwgUlRMRF9MT0NBTCwgUlRMRF9HTE9CQUwKKyAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IGRsb3BlbgorZnJvbSBfY3R5cGVzIGltcG9ydCBSVExEX0xPQ0FMLCBSVExEX0dMT0JBTAogCiAjIF9maW5kTGliKG5hbWUpIHJldHVybnMgYW4gaXRlcmFibGUgb2YgcG9zc2libGUgbmFtZXMgZm9yIGEgbGlicmFyeS4KIGlmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgpAQCAtNTYsNyArNTMsMTAgQEAKICAgICAgICAgZXhwciA9ICcvW15cKFwpXHNdKmxpYiVzXC5bXlwoXClcc10qJyAlIG5hbWUKICAgICAgICAgcmVzID0gcmUuc2VhcmNoKGV4cHIsIG9zLnBvcGVuKCcvc2Jpbi9sZGNvbmZpZyAtcCAyPi9kZXYvbnVsbCcpLnJlYWQoKSkKICAgICAgICAgaWYgbm90IHJlczoKLSAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBjbWQgPSAnbGRkICVzIDI+L2Rldi9udWxsJyAlIHN5cy5leGVjdXRhYmxlCisgICAgICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgb3MucG9wZW4oY21kKS5yZWFkKCkpCisgICAgICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIHJldHVybiByZXMuZ3JvdXAoMCkKIAogICAgIGRlZiBfZ2V0X3NvbmFtZShmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkKaW5kZXggMWIzMWY5MC4uZDBhZGE0MCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19jaGFyLl9fY3R5cGVfbGVfXyBpcyBjX2NoYXIpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2NoYXIuX19jdHlwZV9iZV9fIGlzIGNfY2hhcikKIAotICAgIGRlZiB0ZXN0X3N0cnVjdF9maWVsZHMoc2VsZik6CisgICAgZGVmIHRlc3Rfc3RydWN0X2ZpZWxkc18xKHNlbGYpOgogICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgogICAgICAgICAgICAgYmFzZSA9IEJpZ0VuZGlhblN0cnVjdHVyZQogICAgICAgICBlbHNlOgpAQCAtMTk4LDE3ICsxOTgsMjAgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBTLCAiX2ZpZWxkc18iLCBbKCJzIiwgVCldKQogCi0gICAgIyBjcmFzaGVzIG9uIHNvbGFyaXMgd2l0aCBhIGNvcmUgZHVtcC4KLSAgICBkZWYgWF90ZXN0X3N0cnVjdF9maWVsZHMoc2VsZik6CisgICAgZGVmIHRlc3Rfc3RydWN0X2ZpZWxkc18yKHNlbGYpOgorICAgICAgICAjIHN0YW5kYXJkIHBhY2tpbmcgaW4gc3RydWN0IHVzZXMgbm8gYWxpZ25tZW50LgorICAgICAgICAjIFNvLCB3ZSBoYXZlIHRvIGFsaWduIHVzaW5nIHBhZCBieXRlcy4KKyAgICAgICAgIworICAgICAgICAjIFVuYWxpZ25lZCBhY2Nlc3NlcyB3aWxsIGNyYXNoIFB5dGhvbiAob24gdGhvc2UgcGxhdGZvcm1zIHRoYXQKKyAgICAgICAgIyBkb24ndCBhbGxvdyBpdCwgbGlrZSBzcGFyYyBzb2xhcmlzKS4KICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKICAgICAgICAgICAgIGJhc2UgPSBCaWdFbmRpYW5TdHJ1Y3R1cmUKLSAgICAgICAgICAgIGZtdCA9ICI+YmhpZCIKKyAgICAgICAgICAgIGZtdCA9ICI+YnhoaWQiCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBiYXNlID0gTGl0dGxlRW5kaWFuU3RydWN0dXJlCi0gICAgICAgICAgICBmbXQgPSAiPGJoaWQiCisgICAgICAgICAgICBmbXQgPSAiPGJ4aGlkIgogCiAgICAgICAgIGNsYXNzIFMoYmFzZSk6Ci0gICAgICAgICAgICBfcGFja18gPSAxICMgc3RydWN0IHdpdGggJzwnIG9yICc+JyB1c2VzIHN0YW5kYXJkIGFsaWdubWVudC4KICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIGNfYnl0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCBjX3Nob3J0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsIGNfaW50KSwKQEAgLTIxOCw1ICsyMjEsNjAgQEAKICAgICAgICAgczIgPSBzdHJ1Y3QucGFjayhmbXQsIDB4MTIsIDB4MTIzNCwgMHgxMjM0NTY3OCwgMy4xNCkKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMxKSwgYmluKHMyKSkKIAorICAgIGRlZiB0ZXN0X3VuYWxpZ25lZF9ub25uYXRpdmVfc3RydWN0X2ZpZWxkcyhzZWxmKToKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgIGJhc2UgPSBCaWdFbmRpYW5TdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZtdCA9ICI+YiBoIHhpIHhkIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZSA9IExpdHRsZUVuZGlhblN0cnVjdHVyZQorICAgICAgICAgICAgZm10ID0gIjxiIGggeGkgeGQiCisKKyAgICAgICAgY2xhc3MgUyhiYXNlKToKKyAgICAgICAgICAgIF9wYWNrXyA9IDEKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIGNfYnl0ZSksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfc2hvcnQpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAoIl8xIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsIGNfaW50KSwKKworICAgICAgICAgICAgICAgICAgICAgICAgKCJfMiIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCBjX2RvdWJsZSldCisKKyAgICAgICAgczEgPSBTKCkKKyAgICAgICAgczEuYiA9IDB4MTIKKyAgICAgICAgczEuaCA9IDB4MTIzNAorICAgICAgICBzMS5pID0gMHgxMjM0NTY3OAorICAgICAgICBzMS5kID0gMy4xNAorICAgICAgICBzMiA9IHN0cnVjdC5wYWNrKGZtdCwgMHgxMiwgMHgxMjM0LCAweDEyMzQ1Njc4LCAzLjE0KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oczEpLCBiaW4oczIpKQorCisgICAgZGVmIHRlc3RfdW5hbGlnbmVkX25hdGl2ZV9zdHJ1Y3RfZmllbGRzKHNlbGYpOgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgZm10ID0gIjxiIGggeGkgeGQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYXNlID0gTGl0dGxlRW5kaWFuU3RydWN0dXJlCisgICAgICAgICAgICBmbXQgPSAiPmIgaCB4aSB4ZCIKKworICAgICAgICBjbGFzcyBTKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfcGFja18gPSAxCisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImIiLCBjX2J5dGUpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCBjX3Nob3J0KSwKKworICAgICAgICAgICAgICAgICAgICAgICAgKCJfMSIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImkiLCBjX2ludCksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgiXzIiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19kb3VibGUpXQorCisgICAgICAgIHMxID0gUygpCisgICAgICAgIHMxLmIgPSAweDEyCisgICAgICAgIHMxLmggPSAweDEyMzQKKyAgICAgICAgczEuaSA9IDB4MTIzNDU2NzgKKyAgICAgICAgczEuZCA9IDMuMTQKKyAgICAgICAgczIgPSBzdHJ1Y3QucGFjayhmbXQsIDB4MTIsIDB4MTIzNCwgMHgxMjM0NTY3OCwgMy4xNCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMxKSwgYmluKHMyKSkKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQppbmRleCA3YzJiMjhiLi42ZTA3OThkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5CkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgICAgICAgaWYgbmFtZVs6Ml0gPT0gJ19fJyBhbmQgbmFtZVstMjpdID09ICdfXyc6CiAgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKLSAgICAgICAgICAgIGZ1bmMgPSBzZWxmLl9GdW5jUHRyKCJzXyIgKyBuYW1lLCBzZWxmKQorICAgICAgICAgICAgZnVuYyA9IHNlbGYuX0Z1bmNQdHIoKCJzXyIgKyBuYW1lLCBzZWxmKSkKICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgZnVuYykKICAgICAgICAgICAgIHJldHVybiBmdW5jCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKaW5kZXggMzllNzBlMy4uNzMxOGYyOSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKQEAgLTE0MCw1ICsxNDAsMTAgQEAKICAgICAgICAgci5hWzBdLnggPSA0MgogICAgICAgICByLmFbMF0ueSA9IDk5CiAKKyAgICAgICAgIyB0byBhdm9pZCBsZWFraW5nIHdoZW4gdGVzdHMgYXJlIHJ1biBzZXZlcmFsIHRpbWVzCisgICAgICAgICMgY2xlYW4gdXAgdGhlIHR5cGVzIGxlZnQgaW4gdGhlIGNhY2hlLgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgX3BvaW50ZXJfdHlwZV9jYWNoZQorICAgICAgICBkZWwgX3BvaW50ZXJfdHlwZV9jYWNoZVtQT0lOVF0KKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CmluZGV4IDgwNTY0YjguLjQ1NTg0MTcgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQpAQCAtMiw0MCArMiw3MiBAQAogaW1wb3J0IHN5cywgdW5pdHRlc3QKIGltcG9ydCBvcywgU3RyaW5nSU8KIAorbGliY19uYW1lID0gTm9uZQoraWYgb3MubmFtZSA9PSAibnQiOgorICAgIGxpYmNfbmFtZSA9ICJtc3ZjcnQiCitlbGlmIG9zLm5hbWUgPT0gImNlIjoKKyAgICBsaWJjX25hbWUgPSAiY29yZWRsbCIKK2VsaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgIGxpYmNfbmFtZSA9ICJsaWJjLmR5bGliIgorZWxpZiBzeXMucGxhdGZvcm0gPT0gImN5Z3dpbiI6CisgICAgbGliY19uYW1lID0gImN5Z3dpbjEuZGxsIgorZWxzZToKKyAgICBmb3IgbGluZSBpbiBvcy5wb3BlbigibGRkICVzIiAlIHN5cy5leGVjdXRhYmxlKToKKyAgICAgICAgaWYgImxpYmMuc28iIGluIGxpbmU6CisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIm9wZW5ic2QzIjoKKyAgICAgICAgICAgICAgICBsaWJjX25hbWUgPSBsaW5lLnNwbGl0KClbNF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGliY19uYW1lID0gbGluZS5zcGxpdCgpWzJdCisjIyAgICAgICAgICAgIHByaW50ICJsaWJjX25hbWUgaXMiLCBsaWJjX25hbWUKKyAgICAgICAgICAgIGJyZWFrCisKIGNsYXNzIExvYWRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgdW5rbm93bmRsbCA9ICJ4eHJhbmRvbW5hbWV4eCIKIAotICAgIGRlZiB0ZXN0X2xvYWQoc2VsZik6Ci0gICAgICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKLSAgICAgICAgICAgIG5hbWUgPSAibXN2Y3J0IgotICAgICAgICBlbGlmIG9zLm5hbWUgPT0gImNlIjoKLSAgICAgICAgICAgIG5hbWUgPSAiY29yZWRsbCIKLSAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6Ci0gICAgICAgICAgICBuYW1lID0gImxpYmMuZHlsaWIiCi0gICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImZyZWVic2QiKToKLSAgICAgICAgICAgIG5hbWUgPSAibGliYy5zbyIKLSAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gInN1bm9zNSI6Ci0gICAgICAgICAgICBuYW1lID0gImxpYmMuc28iCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBuYW1lID0gImxpYmMuc28uNiIKLSAgICAgICAgY2RsbC5sb2FkKG5hbWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZCwgc2VsZi51bmtub3duZGxsKQorICAgIGlmIGxpYmNfbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgZGVmIHRlc3RfbG9hZChzZWxmKToKKyAgICAgICAgICAgIGNkbGwubG9hZChsaWJjX25hbWUpCisgICAgICAgICAgICBjZGxsLmxvYWQob3MucGF0aC5iYXNlbmFtZShsaWJjX25hbWUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5sb2FkLCBzZWxmLnVua25vd25kbGwpCiAKLSAgICBkZWYgdGVzdF9sb2FkX3ZlcnNpb24oc2VsZik6Ci0gICAgICAgIHZlcnNpb24gPSAiNiIKLSAgICAgICAgbmFtZSA9ICJjIgotICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImxpbnV4MiI6Ci0gICAgICAgICAgICBjZGxsLmxvYWRfdmVyc2lvbihuYW1lLCB2ZXJzaW9uKQorICAgIGlmIGxpYmNfbmFtZSBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5iYXNlbmFtZShsaWJjX25hbWUpID09ICJsaWJjLnNvLjYiOgorICAgICAgICBkZWYgdGVzdF9sb2FkX3ZlcnNpb24oc2VsZik6CisgICAgICAgICAgICBjZGxsLmxvYWRfdmVyc2lvbigiYyIsICI2IikKICAgICAgICAgICAgICMgbGludXggdXNlcyB2ZXJzaW9uLCBsaWJjIDkgc2hvdWxkIG5vdCBleGlzdAotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5sb2FkX3ZlcnNpb24sIG5hbWUsICI5IikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5sb2FkX3ZlcnNpb24sIHNlbGYudW5rbm93bmRsbCwgIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLmxvYWRfdmVyc2lvbiwgImMiLCAiOSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLmxvYWRfdmVyc2lvbiwgc2VsZi51bmtub3duZGxsLCAiIikKIAotICAgIGlmIG9zLm5hbWUgPT0gInBvc2l4IiBhbmQgc3lzLnBsYXRmb3JtICE9ICJzdW5vczUiOgogICAgICAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgogICAgICAgICAgICAgbmFtZSA9ICJjIgogICAgICAgICAgICAgY2RsbC5maW5kKG5hbWUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLmZpbmQsIHNlbGYudW5rbm93bmRsbCkKIAorICAgIGlmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgICAgICBkZWYgdGVzdF9sb2FkX2xpYnJhcnkoc2VsZik6CisgICAgICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6CisgICAgICAgICAgICAgICAgd2luZGxsLmxvYWRfbGlicmFyeSgia2VybmVsMzIiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICAgICAgd2luZGxsLkxvYWRMaWJyYXJ5KCJrZXJuZWwzMiIpLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgICAgICBXaW5ETEwoImtlcm5lbDMyIikuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgZWxpZiBvcy5uYW1lID09ICJjZSI6CisgICAgICAgICAgICAgICAgd2luZGxsLmxvYWRfbGlicmFyeSgiY29yZWRsbCIpLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgICAgICB3aW5kbGwuTG9hZExpYnJhcnkoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICAgICAgV2luRExMKCJjb3JlZGxsIikuR2V0TW9kdWxlSGFuZGxlVworCisgICAgICAgIGRlZiB0ZXN0X2xvYWRfb3JkaW5hbF9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgICAgICBpbXBvcnQgX2N0eXBlc190ZXN0CisgICAgICAgICAgICBkbGwgPSBXaW5ETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICAgICAgIyBXZSBsb2FkIHRoZSBzYW1lIGZ1bmN0aW9uIGJvdGggdmlhIG9yZGluYWwgYW5kIG5hbWUKKyAgICAgICAgICAgIGZ1bmNfb3JkID0gZGxsWzJdCisgICAgICAgICAgICBmdW5jX25hbWUgPSBkbGwuR2V0U3RyaW5nCisgICAgICAgICAgICAjIGFkZHJlc3NvZiBnZXRzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBmdW5jdGlvbiBwb2ludGVyIGlzIHN0b3JlZAorICAgICAgICAgICAgYV9vcmQgPSBhZGRyZXNzb2YoZnVuY19vcmQpCisgICAgICAgICAgICBhX25hbWUgPSBhZGRyZXNzb2YoZnVuY19uYW1lKQorICAgICAgICAgICAgZl9vcmRfYWRkciA9IGNfdm9pZF9wLmZyb21fYWRkcmVzcyhhX29yZCkudmFsdWUKKyAgICAgICAgICAgIGZfbmFtZV9hZGRyID0gY192b2lkX3AuZnJvbV9hZGRyZXNzKGFfbmFtZSkudmFsdWUKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGhleChmX29yZF9hZGRyKSwgaGV4KGZfbmFtZV9hZGRyKSkKKworICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBkbGwuX19nZXRpdGVtX18sIDEyMzQpCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5CmluZGV4IDYxNzJhYmIuLjNhMzI0YTYgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5CkBAIC0xNjYsNiArMTY2LDE4IEBACiAgICAgICAgIHJlc3VsdCA9IGZ1bmMoIGJ5cmVmKGFyZ2MpLCBhcmd2ICkKICAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSAnd29ybGQnLCByZXN1bHQKIAorICAgIGRlZiB0ZXN0X2J1Z18xNDY3ODUyKHNlbGYpOgorICAgICAgICAjIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYXRpZD01MzIxNTQmYWlkPTE0Njc4NTImZ3JvdXBfaWQ9NzE3MDIKKyAgICAgICAgeCA9IGNfaW50KDUpCisgICAgICAgIGR1bW15ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMzIwMDApOgorICAgICAgICAgICAgZHVtbXkuYXBwZW5kKGNfaW50KGkpKQorICAgICAgICB5ID0gY19pbnQoNikKKyAgICAgICAgcCA9IHBvaW50ZXIoeCkKKyAgICAgICAgcHAgPSBwb2ludGVyKHApCisgICAgICAgIHEgPSBwb2ludGVyKHkpCisgICAgICAgIHBwWzBdID0gcSAgICAgICAgICMgPD09CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbMF0sIDYpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb3NpeC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Bvc2l4LnB5CmluZGV4IDJiNGZkZmYuLmZlMGE0MGEgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Bvc2l4LnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Bvc2l4LnB5CkBAIC04LDggKzgsMTAgQEAKIAogICAgIGNsYXNzIFRlc3RSVExEX0dMT0JBTCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgIGRlZiB0ZXN0X0dMKHNlbGYpOgotICAgICAgICAgICAgY2RsbC5sb2FkKCdsaWJHTC5zbycsIG1vZGU9UlRMRF9HTE9CQUwpCi0gICAgICAgICAgICBjZGxsLmxvYWQoJ2xpYkdMVS5zbycpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygnL3Vzci9saWIvbGliR0wuc28nKToKKyAgICAgICAgICAgICAgICBjZGxsLmxvYWQoJ2xpYkdMLnNvJywgbW9kZT1SVExEX0dMT0JBTCkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCcvdXNyL2xpYi9saWJHTFUuc28nKToKKyAgICAgICAgICAgICAgICBjZGxsLmxvYWQoJ2xpYkdMVS5zbycpCiAKICMjaWYgb3MubmFtZSA9PSAicG9zaXgiIGFuZCBzeXMucGxhdGZvcm0gIT0gImRhcndpbiI6CiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5CmluZGV4IDJjM2Q3NWIuLjQ3ZjVkYTEgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weQpAQCAtMjQsNiArMjQsMTkgQEAKIGltcG9ydCBfY3R5cGVzX3Rlc3QKIHRlc3RkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQogCisjIFJldHVybiBtYWNoaW5lIGFkZHJlc3MgYGFgIGFzIGEgKHBvc3NpYmx5IGxvbmcpIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLgorIyBTdGFydGluZyB3aXRoIFB5dGhvbiAyLjUsIGlkKGFueXRoaW5nKSBpcyBhbHdheXMgbm9uLW5lZ2F0aXZlLCBhbmQKKyMgdGhlIGN0eXBlcyBhZGRyZXNzb2YoKSBpbmhlcml0cyB0aGF0IHZpYSBQeUxvbmdfRnJvbVZvaWRQdHIoKS4KK2RlZiBwb3NpdGl2ZV9hZGRyZXNzKGEpOgorICAgIGlmIGEgPj0gMDoKKyAgICAgICAgcmV0dXJuIGEKKyAgICAjIFZpZXcgdGhlIGJpdHMgaW4gYGFgIGFzIHVuc2lnbmVkIGluc3RlYWQuCisgICAgaW1wb3J0IHN0cnVjdAorICAgIG51bV9iaXRzID0gc3RydWN0LmNhbGNzaXplKCJQIikgKiA4ICMgbnVtIGJpdHMgaW4gbmF0aXZlIG1hY2hpbmUgYWRkcmVzcworICAgIGEgKz0gMUwgPDwgbnVtX2JpdHMKKyAgICBhc3NlcnQgYSA+PSAwCisgICAgcmV0dXJuIGEKKwogZGVmIGNfd2J1ZmZlcihpbml0KToKICAgICBuID0gbGVuKGluaXQpICsgMQogICAgIHJldHVybiAoY193Y2hhciAqIG4pKCppbml0KQpAQCAtNDMsNyArNTYsOCBAQAogICAgICAgICBjaSA9IGNfaW50KDApCiAKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFBPSU5URVIoY19pbnQpLAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhZGRyZXNzb2YoY2kpLCBmdW5jKGJ5cmVmKGNpKSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBvc2l0aXZlX2FkZHJlc3MoYWRkcmVzc29mKGNpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2FkZHJlc3MoZnVuYyhieXJlZihjaSkpKSkKIAogICAgICAgICBmdW5jLmFyZ3R5cGVzID0gY19jaGFyX3AsCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGZ1bmMsIGJ5cmVmKGNpKSkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5CmluZGV4IGNkNTBjYTguLjc4YTY2NWIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weQpAQCAtNTEsMTYgKzUxLDE0IEBACiAgICAgZGVmIHRlc3RfSW50ZWdlckRpdmlzaW9uRXJyb3Ioc2VsZik6CiAgICAgICAgIGNiID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkoY2FsbGJhY2tfZnVuYykKICAgICAgICAgb3V0ID0gc2VsZi5jYXB0dXJlX3N0ZGVycihjYiwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZXJvRGl2aXNpb25FcnJvcjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybyIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdWzoxOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZXJvRGl2aXNpb25FcnJvcjogIikKIAogICAgIGRlZiB0ZXN0X0Zsb2F0RGl2aXNpb25FcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfZG91YmxlKShjYWxsYmFja19mdW5jKQogICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAwLjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVyb0RpdmlzaW9uRXJyb3I6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IGRpdmlzaW9uIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV1bOjE5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm9EaXZpc2lvbkVycm9yOiAiKQogCiAgICAgZGVmIHRlc3RfVHlwZUVycm9yRGl2aXNpb25FcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfY2hhcl9wKShjYWxsYmFja19mdW5jKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weQppbmRleCA2ZmI5Y2EwLi4yMDhjMDBlIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weQpAQCAtMjAsNSArMjAsOCBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg4LCBzaXplb2YoY19pbnQ2NCkpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDgsIHNpemVvZihjX3VpbnQ2NCkpCiAKKyAgICBkZWYgdGVzdF9zaXplX3Qoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihjX3ZvaWRfcCksIHNpemVvZihjX3NpemVfdCkpCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzQzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weQpAQCAtMCwwICsxLDQ1IEBACitpbXBvcnQgc3lzLCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworc3RydWN0dXJlcyA9IFtdCitieXRlc3dhcHBlZF9zdHJ1Y3R1cmVzID0gW10KKworCitpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgIFN3YXBwZWRTdHJ1Y3R1cmUgPSBCaWdFbmRpYW5TdHJ1Y3R1cmUKK2Vsc2U6CisgICAgU3dhcHBlZFN0cnVjdHVyZSA9IExpdHRsZUVuZGlhblN0cnVjdHVyZQorCitmb3IgdHlwIGluIFtjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2xvbmdsb25nLAorICAgICAgICAgICAgY19mbG9hdCwgY19kb3VibGUsCisgICAgICAgICAgICBjX3VzaG9ydCwgY191aW50LCBjX3Vsb25nLCBjX3Vsb25nbG9uZ106CisgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICBfcGFja18gPSAxCisgICAgICAgIF9maWVsZHNfID0gWygicGFkIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgKCJ2YWx1ZSIsIHR5cCldCisgICAgY2xhc3MgWShTd2FwcGVkU3RydWN0dXJlKToKKyAgICAgICAgX3BhY2tfID0gMQorICAgICAgICBfZmllbGRzXyA9IFsoInBhZCIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICgidmFsdWUiLCB0eXApXQorICAgIHN0cnVjdHVyZXMuYXBwZW5kKFgpCisgICAgYnl0ZXN3YXBwZWRfc3RydWN0dXJlcy5hcHBlbmQoWSkKKworY2xhc3MgVGVzdFN0cnVjdHVyZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X25hdGl2ZShzZWxmKToKKyAgICAgICAgZm9yIHR5cCBpbiBzdHJ1Y3R1cmVzOgorIyMgICAgICAgICAgICBwcmludCB0eXAudmFsdWUKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cC52YWx1ZS5vZmZzZXQsIDEpCisgICAgICAgICAgICBvID0gdHlwKCkKKyAgICAgICAgICAgIG8udmFsdWUgPSA0CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvLnZhbHVlLCA0KQorCisgICAgZGVmIHRlc3Rfc3dhcHBlZChzZWxmKToKKyAgICAgICAgZm9yIHR5cCBpbiBieXRlc3dhcHBlZF9zdHJ1Y3R1cmVzOgorIyMgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCB0eXAudmFsdWUKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cC52YWx1ZS5vZmZzZXQsIDEpCisgICAgICAgICAgICBvID0gdHlwKCkKKyAgICAgICAgICAgIG8udmFsdWUgPSA0CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvLnZhbHVlLCA0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkKaW5kZXggNmVhNWQ1Ny4uNTc3MTI1MiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CkBAIC0xODUsNyArMTg1LDkgQEAKIAogICAgICAgICAjIGZvciBleHRlbnNpb25zIHVuZGVyIEN5Z3dpbiBhbmQgQXRoZU9TIFB5dGhvbidzIGxpYnJhcnkgZGlyZWN0b3J5IG11c3QgYmUKICAgICAgICAgIyBhcHBlbmRlZCB0byBsaWJyYXJ5X2RpcnMKLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzo2XSA9PSAnY3lnd2luJyBvciBzeXMucGxhdGZvcm1bOjZdID09ICdhdGhlb3MnOgorICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjZdID09ICdjeWd3aW4nIG9yIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2F0aGVvcycgb3IgXAorICAgICAgICAgICAgICAgKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpIGFuZAorICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignUHlfRU5BQkxFX1NIQVJFRCcpKToKICAgICAgICAgICAgIGlmIHN0cmluZy5maW5kKHN5cy5leGVjdXRhYmxlLCBzeXMuZXhlY19wcmVmaXgpICE9IC0xOgogICAgICAgICAgICAgICAgICMgYnVpbGRpbmcgdGhpcmQgcGFydHkgZXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgImxpYiIsCkBAIC02ODgsNiArNjkwLDEzIEBACiAgICAgICAgICAgICAjIGV4dGVuc2lvbnMsIGl0IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBsaXN0CiAgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcyArIFtweXRob25saWIsICJtIl0gKyBleHRyYQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGV4dC5saWJyYXJpZXMKKyAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKKyAgICAgICAgICAgIGlmIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignUHlfRU5BQkxFX1NIQVJFRCcpOgorICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gInB5dGhvbiVkLiVkIgorICAgICAgICAgICAgICAgIHB5dGhvbmxpYiA9ICh0ZW1wbGF0ZSAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzeXMuaGV4dmVyc2lvbiA+PiAyNCwgKHN5cy5oZXh2ZXJzaW9uID4+IDE2KSAmIDB4ZmYpKQorICAgICAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzICsgW3B5dGhvbmxpYl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dC5saWJyYXJpZXMKIAogIyBjbGFzcyBidWlsZF9leHQKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkKaW5kZXggNzcyMzc2MS4uNDUzMTUxZCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkKQEAgLTYwMSw2ICs2MDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfaGVhZGVycycsIGhhc19oZWFkZXJzKSwKICAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX3NjcmlwdHMnLCBoYXNfc2NyaXB0cyksCiAgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbF9kYXRhJywgICAgaGFzX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfZWdnX2luZm8nLCBsYW1iZGEgc2VsZjpUcnVlKSwKICAgICAgICAgICAgICAgICAgICBdCiAKICMgY2xhc3MgaW5zdGFsbApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzFhYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKQEAgLTAsMCArMSw3NSBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9lZ2dfaW5mbworCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2luc3RhbGxfZWdnX2luZm8nIGNvbW1hbmQsIGZvciBpbnN0YWxsaW5nCithIHBhY2thZ2UncyBQS0ctSU5GTyBtZXRhZGF0YS4iIiIKKworCitmcm9tIGRpc3R1dGlscy5jbWQgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCitpbXBvcnQgb3MsIHN5cywgcmUKKworY2xhc3MgaW5zdGFsbF9lZ2dfaW5mbyhDb21tYW5kKToKKyAgICAiIiJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBmaWxlIGZvciB0aGUgcGFja2FnZSIiIgorCisgICAgZGVzY3JpcHRpb24gPSAiSW5zdGFsbCBwYWNrYWdlJ3MgUEtHLUlORk8gbWV0YWRhdGEgYXMgYW4gLmVnZy1pbmZvIGZpbGUiCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2luc3RhbGwtZGlyPScsICdkJywgImRpcmVjdG9yeSB0byBpbnN0YWxsIHRvIiksCisgICAgXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLCgnaW5zdGFsbF9kaXInLCdpbnN0YWxsX2RpcicpKQorICAgICAgICBiYXNlbmFtZSA9ICIlcy0lcy1weSVzLmVnZy1pbmZvIiAlICgKKyAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNhZmVfbmFtZShzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKSksCisgICAgICAgICAgICB0b19maWxlbmFtZShzYWZlX3ZlcnNpb24oc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKSkpLAorICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdCisgICAgICAgICkKKyAgICAgICAgc2VsZi50YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgYmFzZW5hbWUpCisgICAgICAgIHNlbGYub3V0cHV0cyA9IFtzZWxmLnRhcmdldF0KKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHRhcmdldCA9IHNlbGYudGFyZ2V0CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIodGFyZ2V0KSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHRhcmdldCk6CisgICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZSh0YXJnZXQsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldCk6CisgICAgICAgICAgICBzZWxmLmV4ZWN1dGUob3MudW5saW5rLChzZWxmLnRhcmdldCwpLCJSZW1vdmluZyAiK3RhcmdldCkKKyAgICAgICAgbG9nLmluZm8oIldyaXRpbmcgJXMiLCB0YXJnZXQpCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBmID0gb3Blbih0YXJnZXQsICd3JykKKyAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLndyaXRlX3BrZ19maWxlKGYpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub3V0cHV0cworCisKKyMgVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgdGFrZW4gZnJvbSBzZXR1cHRvb2xzJyBwa2dfcmVzb3VyY2VzIG1vZHVsZSBhbmQKKyMgY2FuIGJlIHJlcGxhY2VkIGJ5IGltcG9ydGluZyB0aGVtIGZyb20gcGtnX3Jlc291cmNlcyBvbmNlIGl0IGlzIGluY2x1ZGVkCisjIGluIHRoZSBzdGRsaWIuCisKK2RlZiBzYWZlX25hbWUobmFtZSk6CisgICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIG5hbWUKKworICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMvLiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4KKyAgICAiIiIKKyAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgbmFtZSkKKworCitkZWYgc2FmZV92ZXJzaW9uKHZlcnNpb24pOgorICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIHZlcnNpb24gc3RyaW5nCisKKyAgICBTcGFjZXMgYmVjb21lIGRvdHMsIGFuZCBhbGwgb3RoZXIgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGJlY29tZQorICAgIGRhc2hlcywgd2l0aCBydW5zIG9mIG11bHRpcGxlIGRhc2hlcyBjb25kZW5zZWQgdG8gYSBzaW5nbGUgZGFzaC4KKyAgICAiIiIKKyAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCcgJywnLicpCisgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIHZlcnNpb24pCisKKworZGVmIHRvX2ZpbGVuYW1lKG5hbWUpOgorICAgICIiIkNvbnZlcnQgYSBwcm9qZWN0IG9yIHZlcnNpb24gbmFtZSB0byBpdHMgZmlsZW5hbWUtZXNjYXBlZCBmb3JtCisKKyAgICBBbnkgJy0nIGNoYXJhY3RlcnMgYXJlIGN1cnJlbnRseSByZXBsYWNlZCB3aXRoICdfJy4KKyAgICAiIiIKKyAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCctJywnXycpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weQppbmRleCA2Mjc2N2EzLi42ZjRjZTgxIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkKQEAgLTI5LDYgKzI5LDcgQEAKICAgICAgICAgICdkaXNwbGF5IGZ1bGwgcmVzcG9uc2UgdGV4dCBmcm9tIHNlcnZlcicpLAogICAgICAgICAoJ3NpZ24nLCAncycsCiAgICAgICAgICAnc2lnbiBmaWxlcyB0byB1cGxvYWQgdXNpbmcgZ3BnJyksCisgICAgICAgICgnaWRlbnRpdHk9JywgJ2knLCAnR1BHIGlkZW50aXR5IHVzZWQgdG8gc2lnbiBmaWxlcycpLAogICAgICAgICBdCiAgICAgYm9vbGVhbl9vcHRpb25zID0gWydzaG93LXJlc3BvbnNlJywgJ3NpZ24nXQogCkBAIC0zOCw4ICszOSwxMyBAQAogICAgICAgICBzZWxmLnJlcG9zaXRvcnkgPSAnJwogICAgICAgICBzZWxmLnNob3dfcmVzcG9uc2UgPSAwCiAgICAgICAgIHNlbGYuc2lnbiA9IEZhbHNlCisgICAgICAgIHNlbGYuaWRlbnRpdHkgPSBOb25lCiAKICAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pZGVudGl0eSBhbmQgbm90IHNlbGYuc2lnbjoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICJNdXN0IHVzZSAtLXNpZ24gZm9yIC0taWRlbnRpdHkgdG8gaGF2ZSBtZWFuaW5nIgorICAgICAgICAgICAgKQogICAgICAgICBpZiBvcy5lbnZpcm9uLmhhc19rZXkoJ0hPTUUnKToKICAgICAgICAgICAgIHJjID0gb3MucGF0aC5qb2luKG9zLmVudmlyb25bJ0hPTUUnXSwgJy5weXBpcmMnKQogICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmMpOgpAQCAtNjcsNyArNzMsMTAgQEAKICAgICBkZWYgdXBsb2FkX2ZpbGUoc2VsZiwgY29tbWFuZCwgcHl2ZXJzaW9uLCBmaWxlbmFtZSk6CiAgICAgICAgICMgU2lnbiBpZiByZXF1ZXN0ZWQKICAgICAgICAgaWYgc2VsZi5zaWduOgotICAgICAgICAgICAgc3Bhd24oKCJncGciLCAiLS1kZXRhY2gtc2lnbiIsICItYSIsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIGdwZ19hcmdzID0gWyJncGciLCAiLS1kZXRhY2gtc2lnbiIsICItYSIsIGZpbGVuYW1lXQorICAgICAgICAgICAgaWYgc2VsZi5pZGVudGl0eToKKyAgICAgICAgICAgICAgICBncGdfYXJnc1syOjJdID0gWyItLWxvY2FsLXVzZXIiLCBzZWxmLmlkZW50aXR5XQorICAgICAgICAgICAgc3Bhd24oZ3BnX2FyZ3MsCiAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKIAogICAgICAgICAjIEZpbGwgaW4gdGhlIGRhdGEgLSBzZW5kIGFsbCB0aGUgbWV0YS1kYXRhIGluIGNhc2Ugd2UgbmVlZCB0bwpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9sb2cucHkgYi9MaWIvZGlzdHV0aWxzL2xvZy5weQppbmRleCBjZjNlZTEzLi45NWQ0YzFjIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2xvZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL2xvZy5weQpAQCAtMjAsNyArMjAsMTIgQEAKIAogICAgIGRlZiBfbG9nKHNlbGYsIGxldmVsLCBtc2csIGFyZ3MpOgogICAgICAgICBpZiBsZXZlbCA+PSBzZWxmLnRocmVzaG9sZDoKLSAgICAgICAgICAgIHByaW50IG1zZyAlIGFyZ3MKKyAgICAgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgICAgICMgbXNnIG1heSBjb250YWluIGEgJyUnLiBJZiBhcmdzIGlzIGVtcHR5LAorICAgICAgICAgICAgICAgICMgZG9uJ3QgZXZlbiB0cnkgdG8gc3RyaW5nLWZvcm1hdAorICAgICAgICAgICAgICAgIHByaW50IG1zZworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCBtc2cgJSBhcmdzCiAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKIAogICAgIGRlZiBsb2coc2VsZiwgbGV2ZWwsIG1zZywgKmFyZ3MpOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkgYi9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weQppbmRleCBkYzYwM2JlLi40OTUzNmYwIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weQpAQCAtMzEsNyArMzEsNyBAQAogCiBweXRob25fYnVpbGQgPSBvcy5wYXRoLmlzZmlsZShsYW5kbWFyaykKIAotZGVsIGFyZ3YwX3BhdGgsIGxhbmRtYXJrCitkZWwgbGFuZG1hcmsKIAogCiBkZWYgZ2V0X3B5dGhvbl92ZXJzaW9uKCk6CkBAIC0xODUsNyArMTg1LDcgQEAKIGRlZiBnZXRfY29uZmlnX2hfZmlsZW5hbWUoKToKICAgICAiIiJSZXR1cm4gZnVsbCBwYXRobmFtZSBvZiBpbnN0YWxsZWQgcHljb25maWcuaCBmaWxlLiIiIgogICAgIGlmIHB5dGhvbl9idWlsZDoKLSAgICAgICAgaW5jX2RpciA9IG9zLmN1cmRpcgorICAgICAgICBpbmNfZGlyID0gYXJndjBfcGF0aAogICAgIGVsc2U6CiAgICAgICAgIGluY19kaXIgPSBnZXRfcHl0aG9uX2luYyhwbGF0X3NwZWNpZmljPTEpCiAgICAgaWYgZ2V0X3B5dGhvbl92ZXJzaW9uKCkgPCAnMi4yJzoKQEAgLTIxMyw4ICsyMTMsOCBAQAogICAgICIiIgogICAgIGlmIGcgaXMgTm9uZToKICAgICAgICAgZyA9IHt9Ci0gICAgZGVmaW5lX3J4ID0gcmUuY29tcGlsZSgiI2RlZmluZSAoW0EtWl1bQS1aMC05X10rKSAoLiopXG4iKQotICAgIHVuZGVmX3J4ID0gcmUuY29tcGlsZSgiL1sqXSAjdW5kZWYgKFtBLVpdW0EtWjAtOV9dKykgWypdL1xuIikKKyAgICBkZWZpbmVfcnggPSByZS5jb21waWxlKCIjZGVmaW5lIChbQS1aXVtBLVphLXowLTlfXSspICguKilcbiIpCisgICAgdW5kZWZfcnggPSByZS5jb21waWxlKCIvWypdICN1bmRlZiAoW0EtWl1bQS1aYS16MC05X10rKSBbKl0vXG4iKQogICAgICMKICAgICB3aGlsZSAxOgogICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQpAQCAtMzUxLDYgKzM1MSwxNyBAQAogCiAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXlfbXNnKQogCisgICAgIyBsb2FkIHRoZSBpbnN0YWxsZWQgcHljb25maWcuaDoKKyAgICB0cnk6CisgICAgICAgIGZpbGVuYW1lID0gZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKCkKKyAgICAgICAgcGFyc2VfY29uZmlnX2goZmlsZShmaWxlbmFtZSksIGcpCisgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgbXlfbXNnID0gImludmFsaWQgUHl0aG9uIGluc3RhbGxhdGlvbjogdW5hYmxlIHRvIG9wZW4gJXMiICUgZmlsZW5hbWUKKyAgICAgICAgaWYgaGFzYXR0cihtc2csICJzdHJlcnJvciIpOgorICAgICAgICAgICAgbXlfbXNnID0gbXlfbXNnICsgIiAoJXMpIiAlIG1zZy5zdHJlcnJvcgorCisgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXlfbXNnKQorCiAgICAgIyBPbiBNYWNPU1ggd2UgbmVlZCB0byBjaGVjayB0aGUgc2V0dGluZyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgICAjIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVDogY29uZmlndXJlIGJhc2VzIHNvbWUgY2hvaWNlcyBvbiBpdCBzbwogICAgICMgaXQgbmVlZHMgdG8gYmUgY29tcGF0aWJsZS4KQEAgLTM2MSw3ICszNzIsNyBAQAogICAgICAgICBpZiBjdXJfdGFyZ2V0ID09ICcnOgogICAgICAgICAgICAgY3VyX3RhcmdldCA9IGNmZ190YXJnZXQKICAgICAgICAgICAgIG9zLnB1dGVudignTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJywgY2ZnX3RhcmdldCkKLSAgICAgICAgaWYgY2ZnX3RhcmdldCAhPSBjdXJfdGFyZ2V0OgorICAgICAgICBlbGlmIG1hcChpbnQsIGNmZ190YXJnZXQuc3BsaXQoJy4nKSkgPiBtYXAoaW50LCBjdXJfdGFyZ2V0LnNwbGl0KCcuJykpOgogICAgICAgICAgICAgbXlfbXNnID0gKCckTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIG1pc21hdGNoOiBub3cgIiVzIiBidXQgIiVzIiBkdXJpbmcgY29uZmlndXJlJwogICAgICAgICAgICAgICAgICUgKGN1cl90YXJnZXQsIGNmZ190YXJnZXQpKQogICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihteV9tc2cpCmRpZmYgLS1naXQgYS9MaWIvZG9jdGVzdC5weSBiL0xpYi9kb2N0ZXN0LnB5CmluZGV4IDYyNDRmYWUuLjcwYzM1NWEgMTAwNjQ0Ci0tLSBhL0xpYi9kb2N0ZXN0LnB5CisrKyBiL0xpYi9kb2N0ZXN0LnB5CkBAIC0yMzYsNiArMjM2LDE1IEBACiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJFeHBlY3RlZCBhIG1vZHVsZSwgc3RyaW5nLCBvciBOb25lIikKIAorZGVmIF9sb2FkX3Rlc3RmaWxlKGZpbGVuYW1lLCBwYWNrYWdlLCBtb2R1bGVfcmVsYXRpdmUpOgorICAgIGlmIG1vZHVsZV9yZWxhdGl2ZToKKyAgICAgICAgcGFja2FnZSA9IF9ub3JtYWxpemVfbW9kdWxlKHBhY2thZ2UsIDMpCisgICAgICAgIGZpbGVuYW1lID0gX21vZHVsZV9yZWxhdGl2ZV9wYXRoKHBhY2thZ2UsIGZpbGVuYW1lKQorICAgICAgICBpZiBoYXNhdHRyKHBhY2thZ2UsICdfX2xvYWRlcl9fJyk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHBhY2thZ2UuX19sb2FkZXJfXywgJ2dldF9kYXRhJyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2UuX19sb2FkZXJfXy5nZXRfZGF0YShmaWxlbmFtZSksIGZpbGVuYW1lCisgICAgcmV0dXJuIG9wZW4oZmlsZW5hbWUpLnJlYWQoKSwgZmlsZW5hbWUKKwogZGVmIF9pbmRlbnQocywgaW5kZW50PTQpOgogICAgICIiIgogICAgIEFkZCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNwYWNlIGNoYXJhY3RlcnMgdG8gdGhlIGJlZ2lubmluZyBldmVyeQpAQCAtMTMxOSwxMyArMTMyOCwxMyBAQAogICAgIF9fTElORUNBQ0hFX0ZJTEVOQU1FX1JFID0gcmUuY29tcGlsZShyJzxkb2N0ZXN0ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoP1A8bmFtZT5bXHdcLl0rKScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidcWyg/UDxleGFtcGxlbnVtPlxkKylcXT4kJykKLSAgICBkZWYgX19wYXRjaGVkX2xpbmVjYWNoZV9nZXRsaW5lcyhzZWxmLCBmaWxlbmFtZSk6CisgICAgZGVmIF9fcGF0Y2hlZF9saW5lY2FjaGVfZ2V0bGluZXMoc2VsZiwgZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgogICAgICAgICBtID0gc2VsZi5fX0xJTkVDQUNIRV9GSUxFTkFNRV9SRS5tYXRjaChmaWxlbmFtZSkKICAgICAgICAgaWYgbSBhbmQgbS5ncm91cCgnbmFtZScpID09IHNlbGYudGVzdC5uYW1lOgogICAgICAgICAgICAgZXhhbXBsZSA9IHNlbGYudGVzdC5leGFtcGxlc1tpbnQobS5ncm91cCgnZXhhbXBsZW51bScpKV0KICAgICAgICAgICAgIHJldHVybiBleGFtcGxlLnNvdXJjZS5zcGxpdGxpbmVzKFRydWUpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5zYXZlX2xpbmVjYWNoZV9nZXRsaW5lcyhmaWxlbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNhdmVfbGluZWNhY2hlX2dldGxpbmVzKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscykKIAogICAgIGRlZiBydW4oc2VsZiwgdGVzdCwgY29tcGlsZWZsYWdzPU5vbmUsIG91dD1Ob25lLCBjbGVhcl9nbG9icz1UcnVlKToKICAgICAgICAgIiIiCkBAIC0xOTMzLDkgKzE5NDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSBwYXRocy4iKQogCiAgICAgIyBSZWxhdGl2aXplIHRoZSBwYXRoCi0gICAgaWYgbW9kdWxlX3JlbGF0aXZlOgotICAgICAgICBwYWNrYWdlID0gX25vcm1hbGl6ZV9tb2R1bGUocGFja2FnZSkKLSAgICAgICAgZmlsZW5hbWUgPSBfbW9kdWxlX3JlbGF0aXZlX3BhdGgocGFja2FnZSwgZmlsZW5hbWUpCisgICAgdGV4dCwgZmlsZW5hbWUgPSBfbG9hZF90ZXN0ZmlsZShmaWxlbmFtZSwgcGFja2FnZSwgbW9kdWxlX3JlbGF0aXZlKQogCiAgICAgIyBJZiBubyBuYW1lIHdhcyBnaXZlbiwgdGhlbiB1c2UgdGhlIGZpbGUncyBuYW1lLgogICAgIGlmIG5hbWUgaXMgTm9uZToKQEAgLTE5NTUsOCArMTk2Miw3IEBACiAgICAgICAgIHJ1bm5lciA9IERvY1Rlc3RSdW5uZXIodmVyYm9zZT12ZXJib3NlLCBvcHRpb25mbGFncz1vcHRpb25mbGFncykKIAogICAgICMgUmVhZCB0aGUgZmlsZSwgY29udmVydCBpdCB0byBhIHRlc3QsIGFuZCBydW4gaXQuCi0gICAgcyA9IG9wZW4oZmlsZW5hbWUpLnJlYWQoKQotICAgIHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QocywgZ2xvYnMsIG5hbWUsIGZpbGVuYW1lLCAwKQorICAgIHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QodGV4dCwgZ2xvYnMsIG5hbWUsIGZpbGVuYW1lLCAwKQogICAgIHJ1bm5lci5ydW4odGVzdCkKIAogICAgIGlmIHJlcG9ydDoKQEAgLTIzMzYsMTUgKzIzNDIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsYXRpdmUgcGF0aHMuIikKIAogICAgICMgUmVsYXRpdml6ZSB0aGUgcGF0aC4KLSAgICBpZiBtb2R1bGVfcmVsYXRpdmU6Ci0gICAgICAgIHBhY2thZ2UgPSBfbm9ybWFsaXplX21vZHVsZShwYWNrYWdlKQotICAgICAgICBwYXRoID0gX21vZHVsZV9yZWxhdGl2ZV9wYXRoKHBhY2thZ2UsIHBhdGgpCisgICAgZG9jLCBwYXRoID0gX2xvYWRfdGVzdGZpbGUocGF0aCwgcGFja2FnZSwgbW9kdWxlX3JlbGF0aXZlKQorCiAgICAgaWYgIl9fZmlsZV9fIiBub3QgaW4gZ2xvYnM6CiAgICAgICAgIGdsb2JzWyJfX2ZpbGVfXyJdID0gcGF0aAogCiAgICAgIyBGaW5kIHRoZSBmaWxlIGFuZCByZWFkIGl0LgogICAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCi0gICAgZG9jID0gb3BlbihwYXRoKS5yZWFkKCkKIAogICAgICMgQ29udmVydCBpdCB0byBhIHRlc3QsIGFuZCB3cmFwIGl0IGluIGEgRG9jRmlsZUNhc2UuCiAgICAgdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2MsIGdsb2JzLCBuYW1lLCBwYXRoLCAwKQpkaWZmIC0tZ2l0IGEvTGliL2R1bW15X3RocmVhZC5weSBiL0xpYi9kdW1teV90aHJlYWQucHkKaW5kZXggZmIzYWJiZi4uZDY5ZDg0MCAxMDA2NDQKLS0tIGEvTGliL2R1bW15X3RocmVhZC5weQorKysgYi9MaWIvZHVtbXlfdGhyZWFkLnB5CkBAIC0xMTMsNiArMTEzLDE0IEBACiAgICAgICAgICAgICBzZWxmLmxvY2tlZF9zdGF0dXMgPSBUcnVlCiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogCisgICAgX19lbnRlcl9fID0gYWNxdWlyZQorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cCwgdmFsLCB0Yik6CisgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKyAgICBkZWYgX19jb250ZXh0X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKICAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICAgIiIiUmVsZWFzZSB0aGUgZHVtbXkgbG9jay4iIiIKICAgICAgICAgIyBYWFggUGVyaGFwcyBzaG91bGRuJ3QgYWN0dWFsbHkgYm90aGVyIHRvIHRlc3Q/ICBDb3VsZCBsZWFkCmRpZmYgLS1naXQgYS9MaWIvZWFzeV9pbnN0YWxsLnB5IGIvTGliL2Vhc3lfaW5zdGFsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODdlOTg0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2Vhc3lfaW5zdGFsbC5weQpAQCAtMCwwICsxLDUgQEAKKyIiIlJ1biB0aGUgRWFzeUluc3RhbGwgY29tbWFuZCIiIgorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgbWFpbgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL19faW5pdF9fLnB5IGIvTGliL2VtYWlsL19faW5pdF9fLnB5CmluZGV4IGU1YzBlMmUuLmYwMTI2MGYgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9fX2luaXRfXy5weQorKysgYi9MaWIvZW1haWwvX19pbml0X18ucHkKQEAgLTQsOSArNCwxMCBAQAogCiAiIiJBIHBhY2thZ2UgZm9yIHBhcnNpbmcsIGhhbmRsaW5nLCBhbmQgZ2VuZXJhdGluZyBlbWFpbCBtZXNzYWdlcy4iIiIKIAotX192ZXJzaW9uX18gPSAnMy4wLjEnCitfX3ZlcnNpb25fXyA9ICc0LjBhMicKIAogX19hbGxfXyA9IFsKKyAgICAjIE9sZCBuYW1lcwogICAgICdiYXNlNjRNSU1FJywKICAgICAnQ2hhcnNldCcsCiAgICAgJ0VuY29kZXJzJywKQEAgLTI3LDYgKzI4LDE5IEBACiAgICAgJ1V0aWxzJywKICAgICAnbWVzc2FnZV9mcm9tX3N0cmluZycsCiAgICAgJ21lc3NhZ2VfZnJvbV9maWxlJywKKyAgICAjIG5ldyBuYW1lcworICAgICdiYXNlNjRtaW1lJywKKyAgICAnY2hhcnNldCcsCisgICAgJ2VuY29kZXJzJywKKyAgICAnZXJyb3JzJywKKyAgICAnZ2VuZXJhdG9yJywKKyAgICAnaGVhZGVyJywKKyAgICAnaXRlcmF0b3JzJywKKyAgICAnbWVzc2FnZScsCisgICAgJ21pbWUnLAorICAgICdwYXJzZXInLAorICAgICdxdW9wcmltaW1lJywKKyAgICAndXRpbHMnLAogICAgIF0KIAogCkBAIC0zOSw3ICs1Myw3IEBACiAKICAgICBPcHRpb25hbCBfY2xhc3MgYW5kIHN0cmljdCBhcmUgcGFzc2VkIHRvIHRoZSBQYXJzZXIgY29uc3RydWN0b3IuCiAgICAgIiIiCi0gICAgZnJvbSBlbWFpbC5QYXJzZXIgaW1wb3J0IFBhcnNlcgorICAgIGZyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIKICAgICByZXR1cm4gUGFyc2VyKCphcmdzLCAqKmt3cykucGFyc2VzdHIocykKIAogCkBAIC00OCw1ICs2Miw2MiBAQAogCiAgICAgT3B0aW9uYWwgX2NsYXNzIGFuZCBzdHJpY3QgYXJlIHBhc3NlZCB0byB0aGUgUGFyc2VyIGNvbnN0cnVjdG9yLgogICAgICIiIgotICAgIGZyb20gZW1haWwuUGFyc2VyIGltcG9ydCBQYXJzZXIKKyAgICBmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgUGFyc2VyCiAgICAgcmV0dXJuIFBhcnNlcigqYXJncywgKiprd3MpLnBhcnNlKGZwKQorCisKKwwKKyMgTGF6eSBsb2FkaW5nIHRvIHByb3ZpZGUgbmFtZSBtYXBwaW5nIGZyb20gbmV3LXN0eWxlIG5hbWVzIChQRVAgOCBjb21wYXRpYmxlCisjIGVtYWlsIDQuMCBtb2R1bGUgbmFtZXMpLCB0byBvbGQtc3R5bGUgbmFtZXMgKGVtYWlsIDMuMCBtb2R1bGUgbmFtZXMpLgoraW1wb3J0IHN5cworCitjbGFzcyBMYXp5SW1wb3J0ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlX25hbWUpOgorICAgICAgICBzZWxmLl9fbmFtZV9fID0gJ2VtYWlsLicgKyBtb2R1bGVfbmFtZQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICBfX2ltcG9ydF9fKHNlbGYuX19uYW1lX18pCisgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW3NlbGYuX19uYW1lX19dCisgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKG1vZC5fX2RpY3RfXykKKyAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kLCBuYW1lKQorCisKK19MT1dFUk5BTUVTID0gWworICAgICMgZW1haWwuPG9sZCBuYW1lPiAtPiBlbWFpbC48bmV3IG5hbWUgaXMgbG93ZXJjYXNlZCBvbGQgbmFtZT4KKyAgICAnQ2hhcnNldCcsCisgICAgJ0VuY29kZXJzJywKKyAgICAnRXJyb3JzJywKKyAgICAnRmVlZFBhcnNlcicsCisgICAgJ0dlbmVyYXRvcicsCisgICAgJ0hlYWRlcicsCisgICAgJ0l0ZXJhdG9ycycsCisgICAgJ01lc3NhZ2UnLAorICAgICdQYXJzZXInLAorICAgICdVdGlscycsCisgICAgJ2Jhc2U2NE1JTUUnLAorICAgICdxdW9wcmlNSU1FJywKKyAgICBdCisKK19NSU1FTkFNRVMgPSBbCisgICAgIyBlbWFpbC5NSU1FPG9sZCBuYW1lPiAtPiBlbWFpbC5taW1lLjxuZXcgbmFtZSBpcyBsb3dlcmNhc2VkIG9sZCBuYW1lPgorICAgICdBdWRpbycsCisgICAgJ0Jhc2UnLAorICAgICdJbWFnZScsCisgICAgJ01lc3NhZ2UnLAorICAgICdNdWx0aXBhcnQnLAorICAgICdOb25NdWx0aXBhcnQnLAorICAgICdUZXh0JywKKyAgICBdCisKK2ZvciBfbmFtZSBpbiBfTE9XRVJOQU1FUzoKKyAgICBpbXBvcnRlciA9IExhenlJbXBvcnRlcihfbmFtZS5sb3dlcigpKQorICAgIHN5cy5tb2R1bGVzWydlbWFpbC4nICsgX25hbWVdID0gaW1wb3J0ZXIKKyAgICBzZXRhdHRyKHN5cy5tb2R1bGVzWydlbWFpbCddLCBfbmFtZSwgaW1wb3J0ZXIpCisKKworaW1wb3J0IGVtYWlsLm1pbWUKK2ZvciBfbmFtZSBpbiBfTUlNRU5BTUVTOgorICAgIGltcG9ydGVyID0gTGF6eUltcG9ydGVyKCdtaW1lLicgKyBfbmFtZS5sb3dlcigpKQorICAgIHN5cy5tb2R1bGVzWydlbWFpbC5NSU1FJyArIF9uYW1lXSA9IGltcG9ydGVyCisgICAgc2V0YXR0cihzeXMubW9kdWxlc1snZW1haWwnXSwgJ01JTUUnICsgX25hbWUsIGltcG9ydGVyKQorICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbJ2VtYWlsLm1pbWUnXSwgX25hbWUsIGltcG9ydGVyKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL19wYXJzZWFkZHIucHkgYi9MaWIvZW1haWwvX3BhcnNlYWRkci5weQppbmRleCA3ZDc1OWVmLi41ODIxZGRmIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvX3BhcnNlYWRkci5weQorKysgYi9MaWIvZW1haWwvX3BhcnNlYWRkci5weQpAQCAtNiw2ICs2LDEzIEBACiBMaWZ0ZWQgZGlyZWN0bHkgZnJvbSByZmM4MjIucHkuICBUaGlzIHNob3VsZCBldmVudHVhbGx5IGJlIHJld3JpdHRlbi4KICIiIgogCitfX2FsbF9fID0gWworICAgICdta3RpbWVfdHonLAorICAgICdwYXJzZWRhdGUnLAorICAgICdwYXJzZWRhdGVfdHonLAorICAgICdxdW90ZScsCisgICAgXQorCiBpbXBvcnQgdGltZQogCiBTUEFDRSA9ICcgJwpAQCAtMTE3LDcgKzEyNCw4IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICB0enNpZ24gPSAxCiAgICAgICAgIHR6b2Zmc2V0ID0gdHpzaWduICogKCAodHpvZmZzZXQvLzEwMCkqMzYwMCArICh0em9mZnNldCAlIDEwMCkqNjApCi0gICAgcmV0dXJuIHl5LCBtbSwgZGQsIHRoaCwgdG1tLCB0c3MsIDAsIDEsIDAsIHR6b2Zmc2V0CisgICAgIyBEYXlsaWdodCBTYXZpbmcgVGltZSBmbGFnIGlzIHNldCB0byAtMSwgc2luY2UgRFNUIGlzIHVua25vd24uCisgICAgcmV0dXJuIHl5LCBtbSwgZGQsIHRoaCwgdG1tLCB0c3MsIDAsIDEsIC0xLCB0em9mZnNldAogCiAKIGRlZiBwYXJzZWRhdGUoZGF0YSk6CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvYmFzZTY0TUlNRS5weSBiL0xpYi9lbWFpbC9iYXNlNjRtaW1lLnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9iYXNlNjRNSU1FLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvYmFzZTY0bWltZS5weQppbmRleCA2ZWQxZDUzLi4wMTI5ZDlkIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvYmFzZTY0TUlNRS5weQorKysgYi9MaWIvZW1haWwvYmFzZTY0bWltZS5weQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCZW4gR2VydHpmaWVsZAogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCkBAIC0yNCw5ICsyNCwyMSBAQAogbW9kdWxlLgogIiIiCiAKK19fYWxsX18gPSBbCisgICAgJ2Jhc2U2NF9sZW4nLAorICAgICdib2R5X2RlY29kZScsCisgICAgJ2JvZHlfZW5jb2RlJywKKyAgICAnZGVjb2RlJywKKyAgICAnZGVjb2Rlc3RyaW5nJywKKyAgICAnZW5jb2RlJywKKyAgICAnZW5jb2Rlc3RyaW5nJywKKyAgICAnaGVhZGVyX2VuY29kZScsCisgICAgXQorCiBpbXBvcnQgcmUKKwogZnJvbSBiaW5hc2NpaSBpbXBvcnQgYjJhX2Jhc2U2NCwgYTJiX2Jhc2U2NAotZnJvbSBlbWFpbC5VdGlscyBpbXBvcnQgZml4X2VvbHMKK2Zyb20gZW1haWwudXRpbHMgaW1wb3J0IGZpeF9lb2xzCiAKIENSTEYgPSAnXHJcbicKIE5MID0gJ1xuJwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL0NoYXJzZXQucHkgYi9MaWIvZW1haWwvY2hhcnNldC5weQpzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvQ2hhcnNldC5weQpyZW5hbWUgdG8gTGliL2VtYWlsL2NoYXJzZXQucHkKaW5kZXggZmQ0MDQzYi4uOGYyMThiMiAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL0NoYXJzZXQucHkKKysrIGIvTGliL2VtYWlsL2NoYXJzZXQucHkKQEAgLTIsOSArMiwxOCBAQAogIyBBdXRob3I6IEJlbiBHZXJ0emZpZWxkLCBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAotaW1wb3J0IGVtYWlsLmJhc2U2NE1JTUUKLWltcG9ydCBlbWFpbC5xdW9wcmlNSU1FCi1mcm9tIGVtYWlsLkVuY29kZXJzIGltcG9ydCBlbmNvZGVfN29yOGJpdAorX19hbGxfXyA9IFsKKyAgICAnQ2hhcnNldCcsCisgICAgJ2FkZF9hbGlhcycsCisgICAgJ2FkZF9jaGFyc2V0JywKKyAgICAnYWRkX2NvZGVjJywKKyAgICBdCisKK2ltcG9ydCBlbWFpbC5iYXNlNjRtaW1lCitpbXBvcnQgZW1haWwucXVvcHJpbWltZQorCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKK2Zyb20gZW1haWwuZW5jb2RlcnMgaW1wb3J0IGVuY29kZV83b3I4Yml0CiAKIAogDApAQCAtMTg2LDggKzE5NSwxNyBAQAogICAgICIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnB1dF9jaGFyc2V0PURFRkFVTFRfQ0hBUlNFVCk6CiAgICAgICAgICMgUkZDIDIwNDYsICQ0LjEuMiBzYXlzIGNoYXJzZXRzIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUuICBXZSBjb2VyY2UgdG8KLSAgICAgICAgIyB1bmljb2RlIGJlY2F1c2UgaXRzIC5sb3dlcigpIGlzIGxvY2FsZSBpbnNlbnNpdGl2ZS4KLSAgICAgICAgaW5wdXRfY2hhcnNldCA9IHVuaWNvZGUoaW5wdXRfY2hhcnNldCwgJ2FzY2lpJykubG93ZXIoKQorICAgICAgICAjIHVuaWNvZGUgYmVjYXVzZSBpdHMgLmxvd2VyKCkgaXMgbG9jYWxlIGluc2Vuc2l0aXZlLiAgSWYgdGhlIGFyZ3VtZW50CisgICAgICAgICMgaXMgYWxyZWFkeSBhIHVuaWNvZGUsIHdlIGxlYXZlIGl0IGF0IHRoYXQsIGJ1dCBlbnN1cmUgdGhhdCB0aGUKKyAgICAgICAgIyBjaGFyc2V0IGlzIEFTQ0lJLCBhcyB0aGUgc3RhbmRhcmQgKFJGQyBYWFgpIHJlcXVpcmVzLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlucHV0X2NoYXJzZXQsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGlucHV0X2NoYXJzZXQuZW5jb2RlKCdhc2NpaScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlucHV0X2NoYXJzZXQgPSB1bmljb2RlKGlucHV0X2NoYXJzZXQsICdhc2NpaScpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBlcnJvcnMuQ2hhcnNldEVycm9yKGlucHV0X2NoYXJzZXQpCisgICAgICAgIGlucHV0X2NoYXJzZXQgPSBpbnB1dF9jaGFyc2V0Lmxvd2VyKCkKICAgICAgICAgIyBTZXQgdGhlIGlucHV0IGNoYXJzZXQgYWZ0ZXIgZmlsdGVyaW5nIHRocm91Z2ggdGhlIGFsaWFzZXMKICAgICAgICAgc2VsZi5pbnB1dF9jaGFyc2V0ID0gQUxJQVNFUy5nZXQoaW5wdXRfY2hhcnNldCwgaW5wdXRfY2hhcnNldCkKICAgICAgICAgIyBXZSBjYW4gdHJ5IHRvIGd1ZXNzIHdoaWNoIGVuY29kaW5nIGFuZCBjb252ZXJzaW9uIHRvIHVzZSBieSB0aGUKQEAgLTMwNywxMiArMzI1LDEyIEBACiAgICAgICAgIGNzZXQgPSBzZWxmLmdldF9vdXRwdXRfY2hhcnNldCgpCiAgICAgICAgICMgVGhlIGxlbihzKSBvZiBhIDdiaXQgZW5jb2RpbmcgaXMgbGVuKHMpCiAgICAgICAgIGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IEJBU0U2NDoKLSAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRNSU1FLmJhc2U2NF9sZW4ocykgKyBsZW4oY3NldCkgKyBNSVNDX0xFTgorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NG1pbWUuYmFzZTY0X2xlbihzKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCiAgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gUVA6Ci0gICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpTUlNRS5oZWFkZXJfcXVvcHJpX2xlbihzKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCisgICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbihzKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCiAgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gU0hPUlRFU1Q6Ci0gICAgICAgICAgICBsZW5iNjQgPSBlbWFpbC5iYXNlNjRNSU1FLmJhc2U2NF9sZW4ocykKLSAgICAgICAgICAgIGxlbnFwID0gZW1haWwucXVvcHJpTUlNRS5oZWFkZXJfcXVvcHJpX2xlbihzKQorICAgICAgICAgICAgbGVuYjY0ID0gZW1haWwuYmFzZTY0bWltZS5iYXNlNjRfbGVuKHMpCisgICAgICAgICAgICBsZW5xcCA9IGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9sZW4ocykKICAgICAgICAgICAgIHJldHVybiBtaW4obGVuYjY0LCBsZW5xcCkgKyBsZW4oY3NldCkgKyBNSVNDX0xFTgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIGxlbihzKQpAQCAtMzM1LDE2ICszNTMsMTYgQEAKICAgICAgICAgICAgIHMgPSBzZWxmLmNvbnZlcnQocykKICAgICAgICAgIyA3Yml0LzhiaXQgZW5jb2RpbmdzIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZCAobW9kdWxvIGNvbnZlcnNpb25zKQogICAgICAgICBpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBCQVNFNjQ6Ci0gICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0TUlNRS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQpCisgICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0bWltZS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQpCiAgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gUVA6Ci0gICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpTUlNRS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQsIG1heGxpbmVsZW49Tm9uZSkKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9lbmNvZGUocywgY3NldCwgbWF4bGluZWxlbj1Ob25lKQogICAgICAgICBlbGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IFNIT1JURVNUOgotICAgICAgICAgICAgbGVuYjY0ID0gZW1haWwuYmFzZTY0TUlNRS5iYXNlNjRfbGVuKHMpCi0gICAgICAgICAgICBsZW5xcCA9IGVtYWlsLnF1b3ByaU1JTUUuaGVhZGVyX3F1b3ByaV9sZW4ocykKKyAgICAgICAgICAgIGxlbmI2NCA9IGVtYWlsLmJhc2U2NG1pbWUuYmFzZTY0X2xlbihzKQorICAgICAgICAgICAgbGVucXAgPSBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfbGVuKHMpCiAgICAgICAgICAgICBpZiBsZW5iNjQgPCBsZW5xcDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0TUlNRS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NG1pbWUuaGVhZGVyX2VuY29kZShzLCBjc2V0KQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpTUlNRS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQsIG1heGxpbmVsZW49Tm9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQsIG1heGxpbmVsZW49Tm9uZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBzCiAKQEAgLTM2Myw4ICszODEsOCBAQAogICAgICAgICAgICAgcyA9IHNlbGYuY29udmVydChzKQogICAgICAgICAjIDdiaXQvOGJpdCBlbmNvZGluZ3MgcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkIChtb2R1bGUgY29udmVyc2lvbnMpCiAgICAgICAgIGlmIHNlbGYuYm9keV9lbmNvZGluZyBpcyBCQVNFNjQ6Ci0gICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0TUlNRS5ib2R5X2VuY29kZShzKQorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NG1pbWUuYm9keV9lbmNvZGUocykKICAgICAgICAgZWxpZiBzZWxmLmJvZHlfZW5jb2RpbmcgaXMgUVA6Ci0gICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpTUlNRS5ib2R5X2VuY29kZShzKQorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaW1pbWUuYm9keV9lbmNvZGUocykKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBzCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvRW5jb2RlcnMucHkgYi9MaWIvZW1haWwvZW5jb2RlcnMucHkKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gTGliL2VtYWlsL0VuY29kZXJzLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvZW5jb2RlcnMucHkKaW5kZXggYmFhYzJhMy4uMDYwMTZjZCAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL0VuY29kZXJzLnB5CisrKyBiL0xpYi9lbWFpbC9lbmNvZGVycy5weQpAQCAtMSwxMiArMSwyMiBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJFbmNvZGluZ3MgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLiIiIgogCitfX2FsbF9fID0gWworICAgICdlbmNvZGVfN29yOGJpdCcsCisgICAgJ2VuY29kZV9iYXNlNjQnLAorICAgICdlbmNvZGVfbm9vcCcsCisgICAgJ2VuY29kZV9xdW9wcmknLAorICAgIF0KKwogaW1wb3J0IGJhc2U2NAorCiBmcm9tIHF1b3ByaSBpbXBvcnQgZW5jb2Rlc3RyaW5nIGFzIF9lbmNvZGVzdHJpbmcKIAorCisMCiBkZWYgX3FlbmNvZGUocyk6CiAgICAgZW5jID0gX2VuY29kZXN0cmluZyhzLCBxdW90ZXRhYnM9VHJ1ZSkKICAgICAjIE11c3QgZW5jb2RlIHNwYWNlcywgd2hpY2ggcXVvcHJpLmVuY29kZXN0cmluZygpIGRvZXNuJ3QgZG8KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9FcnJvcnMucHkgYi9MaWIvZW1haWwvZXJyb3JzLnB5CnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9FcnJvcnMucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9lcnJvcnMucHkKaW5kZXggZTEzYTJjNy4uZDUyYTYyNCAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL0Vycm9ycy5weQorKysgYi9MaWIvZW1haWwvZXJyb3JzLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCkBAIC0yNiw2ICsyNiwxMCBAQAogICAgICIiIkNvbnZlcnNpb24gdG8gYSBtdWx0aXBhcnQgaXMgcHJvaGliaXRlZC4iIiIKIAogCitjbGFzcyBDaGFyc2V0RXJyb3IoTWVzc2FnZUVycm9yKToKKyAgICAiIiJBbiBpbGxlZ2FsIGNoYXJzZXQgd2FzIGdpdmVuLiIiIgorCisKIAwKICMgVGhlc2UgYXJlIHBhcnNpbmcgZGVmZWN0cyB3aGljaCB0aGUgcGFyc2VyIHdhcyBhYmxlIHRvIHdvcmsgYXJvdW5kLgogY2xhc3MgTWVzc2FnZURlZmVjdDoKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9GZWVkUGFyc2VyLnB5IGIvTGliL2VtYWlsL2ZlZWRwYXJzZXIucHkKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTGliL2VtYWlsL0ZlZWRQYXJzZXIucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9mZWVkcGFyc2VyLnB5CmluZGV4IGEyMTMwZTIuLmFmYjAyYjMgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9GZWVkUGFyc2VyLnB5CisrKyBiL0xpYi9lbWFpbC9mZWVkcGFyc2VyLnB5CkBAIC0xOSw5ICsxOSwxMiBAQAogb2JqZWN0J3MgLmRlZmVjdHMgYXR0cmlidXRlLgogIiIiCiAKK19fYWxsX18gPSBbJ0ZlZWRQYXJzZXInXQorCiBpbXBvcnQgcmUKLWZyb20gZW1haWwgaW1wb3J0IEVycm9ycwotZnJvbSBlbWFpbCBpbXBvcnQgTWVzc2FnZQorCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKK2Zyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2UKIAogTkxDUkUgPSByZS5jb21waWxlKCdcclxufFxyfFxuJykKIE5MQ1JFX2JvbCA9IHJlLmNvbXBpbGUoJyhcclxufFxyfFxuKScpCkBAIC0xMzAsNyArMTMzLDcgQEAKIGNsYXNzIEZlZWRQYXJzZXI6CiAgICAgIiIiQSBmZWVkLXN0eWxlIHBhcnNlciBvZiBlbWFpbC4iIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfZmFjdG9yeT1NZXNzYWdlLk1lc3NhZ2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfZmFjdG9yeT1tZXNzYWdlLk1lc3NhZ2UpOgogICAgICAgICAiIiJfZmFjdG9yeSBpcyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMgdG8gY3JlYXRlIGEgbmV3IG1lc3NhZ2Ugb2JqIiIiCiAgICAgICAgIHNlbGYuX2ZhY3RvcnkgPSBfZmFjdG9yeQogICAgICAgICBzZWxmLl9pbnB1dCA9IEJ1ZmZlcmVkU3ViRmlsZSgpCkBAIC0xNjQsNyArMTY3LDcgQEAKICAgICAgICAgIyBMb29rIGZvciBmaW5hbCBzZXQgb2YgZGVmZWN0cwogICAgICAgICBpZiByb290LmdldF9jb250ZW50X21haW50eXBlKCkgPT0gJ211bHRpcGFydCcgXAogICAgICAgICAgICAgICAgYW5kIG5vdCByb290LmlzX211bHRpcGFydCgpOgotICAgICAgICAgICAgcm9vdC5kZWZlY3RzLmFwcGVuZChFcnJvcnMuTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0KCkpCisgICAgICAgICAgICByb290LmRlZmVjdHMuYXBwZW5kKGVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3QoKSkKICAgICAgICAgcmV0dXJuIHJvb3QKIAogICAgIGRlZiBfbmV3X21lc3NhZ2Uoc2VsZik6CkBAIC0yNzcsNyArMjgwLDcgQEAKICAgICAgICAgICAgICAgICAjIGRlZmluZWQgYSBib3VuZGFyeS4gIFRoYXQncyBhIHByb2JsZW0gd2hpY2ggd2UnbGwgaGFuZGxlIGJ5CiAgICAgICAgICAgICAgICAgIyByZWFkaW5nIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIEVPRiBhbmQgbWFya2luZyB0aGUgbWVzc2FnZSBhcwogICAgICAgICAgICAgICAgICMgZGVmZWN0aXZlLgotICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChFcnJvcnMuTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KCkpCisgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QoKSkKICAgICAgICAgICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5faW5wdXQ6CiAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgaXMgTmVlZE1vcmVEYXRhOgpAQCAtMzgxLDcgKzM4NCw3IEBACiAgICAgICAgICAgICAjIHRoYXQgYXMgYSBkZWZlY3QgYW5kIHN0b3JlIHRoZSBjYXB0dXJlZCB0ZXh0IGFzIHRoZSBwYXlsb2FkLgogICAgICAgICAgICAgIyBFdmVyeXRoaW5nIGZyb20gaGVyZSB0byB0aGUgRU9GIGlzIGVwaWxvZ3VlLgogICAgICAgICAgICAgaWYgY2FwdHVyaW5nX3ByZWFtYmxlOgotICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChFcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KCkpCisgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QoKSkKICAgICAgICAgICAgICAgICBzZWxmLl9jdXIuc2V0X3BheWxvYWQoRU1QVFlTVFJJTkcuam9pbihwcmVhbWJsZSkpCiAgICAgICAgICAgICAgICAgZXBpbG9ndWUgPSBbXQogICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2lucHV0OgpAQCAtNDMyLDcgKzQzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICMgVGhlIGZpcnN0IGxpbmUgb2YgdGhlIGhlYWRlcnMgd2FzIGEgY29udGludWF0aW9uLiAgVGhpcwogICAgICAgICAgICAgICAgICAgICAjIGlzIGlsbGVnYWwsIHNvIGxldCdzIG5vdGUgdGhlIGRlZmVjdCwgc3RvcmUgdGhlIGlsbGVnYWwKICAgICAgICAgICAgICAgICAgICAgIyBsaW5lLCBhbmQgaWdub3JlIGl0IGZvciBwdXJwb3NlcyBvZiBoZWFkZXJzLgotICAgICAgICAgICAgICAgICAgICBkZWZlY3QgPSBFcnJvcnMuRmlyc3RIZWFkZXJMaW5lSXNDb250aW51YXRpb25EZWZlY3QobGluZSkKKyAgICAgICAgICAgICAgICAgICAgZGVmZWN0ID0gZXJyb3JzLkZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KGxpbmUpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChkZWZlY3QpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgbGFzdHZhbHVlLmFwcGVuZChsaW5lKQpAQCAtNDYwLDEzICs0NjMsMTMgQEAKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAjIFdlaXJkbHkgcGxhY2VkIHVuaXgtZnJvbSBsaW5lLiAgTm90ZSB0aGlzIGFzIGEgZGVmZWN0CiAgICAgICAgICAgICAgICAgICAgICMgYW5kIGlnbm9yZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgZGVmZWN0ID0gRXJyb3JzLk1pc3BsYWNlZEVudmVsb3BlSGVhZGVyRGVmZWN0KGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGRlZmVjdCA9IGVycm9ycy5NaXNwbGFjZWRFbnZlbG9wZUhlYWRlckRlZmVjdChsaW5lKQogICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZGVmZWN0cy5hcHBlbmQoZGVmZWN0KQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgIyBTcGxpdCB0aGUgbGluZSBvbiB0aGUgY29sb24gc2VwYXJhdGluZyBmaWVsZCBuYW1lIGZyb20gdmFsdWUuCiAgICAgICAgICAgICBpID0gbGluZS5maW5kKCc6JykKICAgICAgICAgICAgIGlmIGkgPCAwOgotICAgICAgICAgICAgICAgIGRlZmVjdCA9IEVycm9ycy5NYWxmb3JtZWRIZWFkZXJEZWZlY3QobGluZSkKKyAgICAgICAgICAgICAgICBkZWZlY3QgPSBlcnJvcnMuTWFsZm9ybWVkSGVhZGVyRGVmZWN0KGxpbmUpCiAgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGRlZmVjdCkKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgbGFzdGhlYWRlciA9IGxpbmVbOmldCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvR2VuZXJhdG9yLnB5IGIvTGliL2VtYWlsL2dlbmVyYXRvci5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvR2VuZXJhdG9yLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvZ2VuZXJhdG9yLnB5CmluZGV4IDc5Njk5MTYuLjZlN2E1MTUgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9HZW5lcmF0b3IucHkKKysrIGIvTGliL2VtYWlsL2dlbmVyYXRvci5weQpAQCAtNCwxNCArNCwxNiBAQAogCiAiIiJDbGFzc2VzIHRvIGdlbmVyYXRlIHBsYWluIHRleHQgZnJvbSBhIG1lc3NhZ2Ugb2JqZWN0IHRyZWUuIiIiCiAKK19fYWxsX18gPSBbJ0dlbmVyYXRvcicsICdEZWNvZGVkR2VuZXJhdG9yJ10KKwogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IHJhbmRvbQogaW1wb3J0IHdhcm5pbmdzCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIAotZnJvbSBlbWFpbC5IZWFkZXIgaW1wb3J0IEhlYWRlcgorZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgSGVhZGVyCiAKIFVOREVSU0NPUkUgPSAnXycKIE5MID0gJ1xuJwpAQCAtODEsMTIgKzgzLDYgQEAKICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuX2ZwLCB1ZnJvbQogICAgICAgICBzZWxmLl93cml0ZShtc2cpCiAKLSAgICAjIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IHRoaXMgaXMgc2xvd2VyCi0gICAgZGVmIF9fY2FsbF9fKHNlbGYsIG1zZywgdW5peGZyb209RmFsc2UpOgotICAgICAgICB3YXJuaW5ncy53YXJuKCdfX2NhbGxfXygpIGRlcHJlY2F0ZWQ7IHVzZSBmbGF0dGVuKCknLAotICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICAgICAgc2VsZi5mbGF0dGVuKG1zZywgdW5peGZyb20pCi0KICAgICBkZWYgY2xvbmUoc2VsZiwgZnApOgogICAgICAgICAiIiJDbG9uZSB0aGlzIGdlbmVyYXRvciB3aXRoIHRoZSBleGFjdCBzYW1lIG9wdGlvbnMuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhmcCwgc2VsZi5fbWFuZ2xlX2Zyb21fLCBzZWxmLl9tYXhoZWFkZXJsZW4pCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvSGVhZGVyLnB5IGIvTGliL2VtYWlsL2hlYWRlci5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvSGVhZGVyLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvaGVhZGVyLnB5CmluZGV4IDVlMjRhZmUuLjE4M2MzMzcgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9IZWFkZXIucHkKKysrIGIvTGliL2VtYWlsL2hlYWRlci5weQpAQCAtMSwxNiArMSwyMyBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJlbiBHZXJ0emZpZWxkLCBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiSGVhZGVyIGVuY29kaW5nIGFuZCBkZWNvZGluZyBmdW5jdGlvbmFsaXR5LiIiIgogCitfX2FsbF9fID0gWworICAgICdIZWFkZXInLAorICAgICdkZWNvZGVfaGVhZGVyJywKKyAgICAnbWFrZV9oZWFkZXInLAorICAgIF0KKwogaW1wb3J0IHJlCiBpbXBvcnQgYmluYXNjaWkKIAotaW1wb3J0IGVtYWlsLnF1b3ByaU1JTUUKLWltcG9ydCBlbWFpbC5iYXNlNjRNSU1FCi1mcm9tIGVtYWlsLkVycm9ycyBpbXBvcnQgSGVhZGVyUGFyc2VFcnJvcgotZnJvbSBlbWFpbC5DaGFyc2V0IGltcG9ydCBDaGFyc2V0CitpbXBvcnQgZW1haWwucXVvcHJpbWltZQoraW1wb3J0IGVtYWlsLmJhc2U2NG1pbWUKKworZnJvbSBlbWFpbC5lcnJvcnMgaW1wb3J0IEhlYWRlclBhcnNlRXJyb3IKK2Zyb20gZW1haWwuY2hhcnNldCBpbXBvcnQgQ2hhcnNldAogCiBOTCA9ICdcbicKIFNQQUNFID0gJyAnCkBAIC00Miw3ICs0OSw3IEBACiAKIAwKICMgSGVscGVycwotX21heF9hcHBlbmQgPSBlbWFpbC5xdW9wcmlNSU1FLl9tYXhfYXBwZW5kCitfbWF4X2FwcGVuZCA9IGVtYWlsLnF1b3ByaW1pbWUuX21heF9hcHBlbmQKIAogCiAMCkBAIC04MiwxMCArODksMTAgQEAKICAgICAgICAgICAgICAgICBlbmNvZGVkID0gcGFydHNbMl0KICAgICAgICAgICAgICAgICBkZWMgPSBOb25lCiAgICAgICAgICAgICAgICAgaWYgZW5jb2RpbmcgPT0gJ3EnOgotICAgICAgICAgICAgICAgICAgICBkZWMgPSBlbWFpbC5xdW9wcmlNSU1FLmhlYWRlcl9kZWNvZGUoZW5jb2RlZCkKKyAgICAgICAgICAgICAgICAgICAgZGVjID0gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfZGVjb2RlKGVuY29kZWQpCiAgICAgICAgICAgICAgICAgZWxpZiBlbmNvZGluZyA9PSAnYic6CiAgICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYyA9IGVtYWlsLmJhc2U2NE1JTUUuZGVjb2RlKGVuY29kZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWMgPSBlbWFpbC5iYXNlNjRtaW1lLmRlY29kZShlbmNvZGVkKQogICAgICAgICAgICAgICAgICAgICBleGNlcHQgYmluYXNjaWkuRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAjIFR1cm4gdGhpcyBpbnRvIGEgaGlnaGVyIGxldmVsIGV4Y2VwdGlvbi4gIEJBVzogUmlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICMgbm93IHdlIHRocm93IHRoZSBsb3dlciBsZXZlbCBleGNlcHRpb24gYXdheSBidXQKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9JdGVyYXRvcnMucHkgYi9MaWIvZW1haWwvaXRlcmF0b3JzLnB5CnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9JdGVyYXRvcnMucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9pdGVyYXRvcnMucHkKaW5kZXggNzRhOTNjNy4uZTk5ZjIyOCAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL0l0ZXJhdG9ycy5weQorKysgYi9MaWIvZW1haWwvaXRlcmF0b3JzLnB5CkBAIC0xLDkgKzEsMTYgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiVmFyaW91cyB0eXBlcyBvZiB1c2VmdWwgaXRlcmF0b3JzIGFuZCBnZW5lcmF0b3JzLiIiIgogCitfX2FsbF9fID0gWworICAgICdib2R5X2xpbmVfaXRlcmF0b3InLAorICAgICd0eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yJywKKyAgICAnd2FsaycsCisgICAgIyBEbyBub3QgaW5jbHVkZSBfc3RydWN0dXJlKCkgc2luY2UgaXQncyBwYXJ0IG9mIHRoZSBkZWJ1Z2dpbmcgQVBJLgorICAgIF0KKwogaW1wb3J0IHN5cwogZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAKQEAgLTI1LDcgKzMyLDYgQEAKIAogDAogIyBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSBpbXBvcnRlZCBpbnRvIHRoZSBJdGVyYXRvcnMucHkgaW50ZXJmYWNlIG1vZHVsZS4KLSMgVGhlIFB5dGhvbiAyLjIgdmVyc2lvbiB1c2VzIGdlbmVyYXRvcnMgZm9yIGVmZmljaWVuY3kuCiBkZWYgYm9keV9saW5lX2l0ZXJhdG9yKG1zZywgZGVjb2RlPUZhbHNlKToKICAgICAiIiJJdGVyYXRlIG92ZXIgdGhlIHBhcnRzLCByZXR1cm5pbmcgc3RyaW5nIHBheWxvYWRzIGxpbmUtYnktbGluZS4KIApkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01lc3NhZ2UucHkgYi9MaWIvZW1haWwvbWVzc2FnZS5weQpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvTWVzc2FnZS5weQpyZW5hbWUgdG8gTGliL2VtYWlsL21lc3NhZ2UucHkKaW5kZXggYmM3NjQxNi4uNTBkOTBiNCAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL01lc3NhZ2UucHkKKysrIGIvTGliL2VtYWlsL21lc3NhZ2UucHkKQEAgLTQsNiArNCw4IEBACiAKICIiIkJhc2ljIG1lc3NhZ2Ugb2JqZWN0IGZvciB0aGUgZW1haWwgcGFja2FnZSBvYmplY3QgbW9kZWwuIiIiCiAKK19fYWxsX18gPSBbJ01lc3NhZ2UnXQorCiBpbXBvcnQgcmUKIGltcG9ydCB1dQogaW1wb3J0IGJpbmFzY2lpCkBAIC0xMSw5ICsxMyw5IEBACiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIAogIyBJbnRyYXBhY2thZ2UgaW1wb3J0cwotZnJvbSBlbWFpbCBpbXBvcnQgVXRpbHMKLWZyb20gZW1haWwgaW1wb3J0IEVycm9ycwotZnJvbSBlbWFpbCBpbXBvcnQgQ2hhcnNldAoraW1wb3J0IGVtYWlsLmNoYXJzZXQKK2Zyb20gZW1haWwgaW1wb3J0IHV0aWxzCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKIAogU0VNSVNQQUNFID0gJzsgJwogCkBAIC00MSwxMSArNDMsMTEgQEAKICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgogICAgICAgICAgICAgIyBFbmNvZGUgYXMgcGVyIFJGQyAyMjMxCiAgICAgICAgICAgICBwYXJhbSArPSAnKicKLSAgICAgICAgICAgIHZhbHVlID0gVXRpbHMuZW5jb2RlX3JmYzIyMzEodmFsdWVbMl0sIHZhbHVlWzBdLCB2YWx1ZVsxXSkKKyAgICAgICAgICAgIHZhbHVlID0gdXRpbHMuZW5jb2RlX3JmYzIyMzEodmFsdWVbMl0sIHZhbHVlWzBdLCB2YWx1ZVsxXSkKICAgICAgICAgIyBCQVc6IFBsZWFzZSBjaGVjayB0aGlzLiAgSSB0aGluayB0aGF0IGlmIHF1b3RlIGlzIHNldCBpdCBzaG91bGQKICAgICAgICAgIyBmb3JjZSBxdW90aW5nIGV2ZW4gaWYgbm90IG5lY2Vzc2FyeS4KICAgICAgICAgaWYgcXVvdGUgb3IgdHNwZWNpYWxzLnNlYXJjaCh2YWx1ZSk6Ci0gICAgICAgICAgICByZXR1cm4gJyVzPSIlcyInICUgKHBhcmFtLCBVdGlscy5xdW90ZSh2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gJyVzPSIlcyInICUgKHBhcmFtLCB1dGlscy5xdW90ZSh2YWx1ZSkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gJyVzPSVzJyAlIChwYXJhbSwgdmFsdWUpCiAgICAgZWxzZToKQEAgLTcwLDE0ICs3MiwxNCBAQAogCiAKIGRlZiBfdW5xdW90ZXZhbHVlKHZhbHVlKToKLSAgICAjIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gVXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZSgpIGJlY2F1c2UgaXQgZG9lc24ndAorICAgICMgVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB1dGlscy5jb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKCkgYmVjYXVzZSBpdCBkb2Vzbid0CiAgICAgIyB0cnkgdG8gY29udmVydCB0aGUgdmFsdWUgdG8gYSB1bmljb2RlLiAgTWVzc2FnZS5nZXRfcGFyYW0oKSBhbmQKICAgICAjIE1lc3NhZ2UuZ2V0X3BhcmFtcygpIGFyZSBib3RoIGN1cnJlbnRseSBkZWZpbmVkIHRvIHJldHVybiB0aGUgdHVwbGUgaW4KICAgICAjIHRoZSBmYWNlIG9mIFJGQyAyMjMxIHBhcmFtZXRlcnMuCiAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgotICAgICAgICByZXR1cm4gdmFsdWVbMF0sIHZhbHVlWzFdLCBVdGlscy51bnF1b3RlKHZhbHVlWzJdKQorICAgICAgICByZXR1cm4gdmFsdWVbMF0sIHZhbHVlWzFdLCB1dGlscy51bnF1b3RlKHZhbHVlWzJdKQogICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBVdGlscy51bnF1b3RlKHZhbHVlKQorICAgICAgICByZXR1cm4gdXRpbHMudW5xdW90ZSh2YWx1ZSkKIAogCiAMCkBAIC0xODgsMTcgKzE5MCwxNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgICBjdGUgPSBzZWxmLmdldCgnY29udGVudC10cmFuc2Zlci1lbmNvZGluZycsICcnKS5sb3dlcigpCiAgICAgICAgICAgICBpZiBjdGUgPT0gJ3F1b3RlZC1wcmludGFibGUnOgotICAgICAgICAgICAgICAgIHJldHVybiBVdGlscy5fcWRlY29kZShwYXlsb2FkKQorICAgICAgICAgICAgICAgIHJldHVybiB1dGlscy5fcWRlY29kZShwYXlsb2FkKQogICAgICAgICAgICAgZWxpZiBjdGUgPT0gJ2Jhc2U2NCc6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuX2JkZWNvZGUocGF5bG9hZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLl9iZGVjb2RlKHBheWxvYWQpCiAgICAgICAgICAgICAgICAgZXhjZXB0IGJpbmFzY2lpLkVycm9yOgogICAgICAgICAgICAgICAgICAgICAjIEluY29ycmVjdCBwYWRkaW5nCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkCiAgICAgICAgICAgICBlbGlmIGN0ZSBpbiAoJ3gtdXVlbmNvZGUnLCAndXVlbmNvZGUnLCAndXVlJywgJ3gtdXVlJyk6CiAgICAgICAgICAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgdXUuZGVjb2RlKFN0cmluZ0lPKHBheWxvYWQrJ1xuJyksIHNmcCkKKyAgICAgICAgICAgICAgICAgICAgdXUuZGVjb2RlKFN0cmluZ0lPKHBheWxvYWQrJ1xuJyksIHNmcCwgcXVpZXQ9VHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHNmcC5nZXR2YWx1ZSgpCiAgICAgICAgICAgICAgICAgZXhjZXB0IHV1LkVycm9yOgogICAgICAgICAgICAgICAgICAgICAjIFNvbWUgZGVjb2RpbmcgcHJvYmxlbQpAQCAtMjM3LDggKzIzOSw4IEBACiAgICAgICAgICAgICBzZWxmLl9jaGFyc2V0ID0gTm9uZQogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hhcnNldCwgc3RyKToKLSAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0LkNoYXJzZXQoY2hhcnNldCkKLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2hhcnNldCwgQ2hhcnNldC5DaGFyc2V0KToKKyAgICAgICAgICAgIGNoYXJzZXQgPSBlbWFpbC5jaGFyc2V0LkNoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2hhcnNldCwgZW1haWwuY2hhcnNldC5DaGFyc2V0KToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihjaGFyc2V0KQogICAgICAgICAjIEJBVzogc2hvdWxkIHdlIGFjY2VwdCBzdHJpbmdzIHRoYXQgY2FuIHNlcnZlIGFzIGFyZ3VtZW50cyB0byB0aGUKICAgICAgICAgIyBDaGFyc2V0IGNvbnN0cnVjdG9yPwpAQCAtNDEzLDQ5ICs0MTUsNiBAQAogICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoX25hbWUpCiAKICAgICAjCi0gICAgIyBEZXByZWNhdGVkIG1ldGhvZHMuICBUaGVzZSB3aWxsIGJlIHJlbW92ZWQgaW4gZW1haWwgMy4xLgotICAgICMKLQotICAgIGRlZiBnZXRfdHlwZShzZWxmLCBmYWlsb2JqPU5vbmUpOgotICAgICAgICAiIiJSZXR1cm5zIHRoZSBtZXNzYWdlJ3MgY29udGVudCB0eXBlLgotCi0gICAgICAgIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgY29lcmNlZCB0byBsb3dlcmNhc2UgYW5kIHJldHVybmVkIGFzIGEgc2luZ2xlCi0gICAgICAgIHN0cmluZyBvZiB0aGUgZm9ybSBgbWFpbnR5cGUvc3VidHlwZScuICBJZiB0aGVyZSB3YXMgbm8gQ29udGVudC1UeXBlCi0gICAgICAgIGhlYWRlciBpbiB0aGUgbWVzc2FnZSwgZmFpbG9iaiBpcyByZXR1cm5lZCAoZGVmYXVsdHMgdG8gTm9uZSkuCi0gICAgICAgICIiIgotICAgICAgICB3YXJuaW5ncy53YXJuKCdnZXRfdHlwZSgpIGRlcHJlY2F0ZWQ7IHVzZSBnZXRfY29udGVudF90eXBlKCknLAotICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCi0gICAgICAgIHZhbHVlID0gc2VsZi5nZXQoJ2NvbnRlbnQtdHlwZScsIG1pc3NpbmcpCi0gICAgICAgIGlmIHZhbHVlIGlzIG1pc3Npbmc6Ci0gICAgICAgICAgICByZXR1cm4gZmFpbG9iagotICAgICAgICByZXR1cm4gcGFyYW1yZS5zcGxpdCh2YWx1ZSlbMF0ubG93ZXIoKS5zdHJpcCgpCi0KLSAgICBkZWYgZ2V0X21haW5fdHlwZShzZWxmLCBmYWlsb2JqPU5vbmUpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIG1lc3NhZ2UncyBtYWluIGNvbnRlbnQgdHlwZSBpZiBwcmVzZW50LiIiIgotICAgICAgICB3YXJuaW5ncy53YXJuKCdnZXRfbWFpbl90eXBlKCkgZGVwcmVjYXRlZDsgdXNlIGdldF9jb250ZW50X21haW50eXBlKCknLAotICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCi0gICAgICAgIGN0eXBlID0gc2VsZi5nZXRfdHlwZShtaXNzaW5nKQotICAgICAgICBpZiBjdHlwZSBpcyBtaXNzaW5nOgotICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKLSAgICAgICAgaWYgY3R5cGUuY291bnQoJy8nKSA8PiAxOgotICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKLSAgICAgICAgcmV0dXJuIGN0eXBlLnNwbGl0KCcvJylbMF0KLQotICAgIGRlZiBnZXRfc3VidHlwZShzZWxmLCBmYWlsb2JqPU5vbmUpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIG1lc3NhZ2UncyBjb250ZW50IHN1YnR5cGUgaWYgcHJlc2VudC4iIiIKLSAgICAgICAgd2FybmluZ3Mud2FybignZ2V0X3N1YnR5cGUoKSBkZXByZWNhdGVkOyB1c2UgZ2V0X2NvbnRlbnRfc3VidHlwZSgpJywKLSAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgICAgIG1pc3NpbmcgPSBvYmplY3QoKQotICAgICAgICBjdHlwZSA9IHNlbGYuZ2V0X3R5cGUobWlzc2luZykKLSAgICAgICAgaWYgY3R5cGUgaXMgbWlzc2luZzoKLSAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCi0gICAgICAgIGlmIGN0eXBlLmNvdW50KCcvJykgPD4gMToKLSAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCi0gICAgICAgIHJldHVybiBjdHlwZS5zcGxpdCgnLycpWzFdCi0KLSAgICAjCiAgICAgIyBVc2UgdGhlc2UgdGhyZWUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSB0aHJlZSBhYm92ZS4KICAgICAjCiAKQEAgLTUzNyw3ICs0OTYsNyBAQAogICAgICAgICAgICAgICAgIG5hbWUgPSBwLnN0cmlwKCkKICAgICAgICAgICAgICAgICB2YWwgPSAnJwogICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgobmFtZSwgdmFsKSkKLSAgICAgICAgcGFyYW1zID0gVXRpbHMuZGVjb2RlX3BhcmFtcyhwYXJhbXMpCisgICAgICAgIHBhcmFtcyA9IHV0aWxzLmRlY29kZV9wYXJhbXMocGFyYW1zKQogICAgICAgICByZXR1cm4gcGFyYW1zCiAKICAgICBkZWYgZ2V0X3BhcmFtcyhzZWxmLCBmYWlsb2JqPU5vbmUsIGhlYWRlcj0nY29udGVudC10eXBlJywgdW5xdW90ZT1UcnVlKToKQEAgLTcxNCw3ICs2NzMsNyBAQAogICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldF9wYXJhbSgnbmFtZScsIG1pc3NpbmcsICdjb250ZW50LWRpc3Bvc2l0aW9uJykKICAgICAgICAgaWYgZmlsZW5hbWUgaXMgbWlzc2luZzoKICAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCi0gICAgICAgIHJldHVybiBVdGlscy5jb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKGZpbGVuYW1lKS5zdHJpcCgpCisgICAgICAgIHJldHVybiB1dGlscy5jb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKGZpbGVuYW1lKS5zdHJpcCgpCiAKICAgICBkZWYgZ2V0X2JvdW5kYXJ5KHNlbGYsIGZhaWxvYmo9Tm9uZSk6CiAgICAgICAgICIiIlJldHVybiB0aGUgYm91bmRhcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXlsb2FkIGlmIHByZXNlbnQuCkBAIC03MjcsNyArNjg2LDcgQEAKICAgICAgICAgaWYgYm91bmRhcnkgaXMgbWlzc2luZzoKICAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCiAgICAgICAgICMgUkZDIDIwNDYgc2F5cyB0aGF0IGJvdW5kYXJpZXMgbWF5IGJlZ2luIGJ1dCBub3QgZW5kIGluIHcvcwotICAgICAgICByZXR1cm4gVXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZShib3VuZGFyeSkucnN0cmlwKCkKKyAgICAgICAgcmV0dXJuIHV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWUoYm91bmRhcnkpLnJzdHJpcCgpCiAKICAgICBkZWYgc2V0X2JvdW5kYXJ5KHNlbGYsIGJvdW5kYXJ5KToKICAgICAgICAgIiIiU2V0IHRoZSBib3VuZGFyeSBwYXJhbWV0ZXIgaW4gQ29udGVudC1UeXBlIHRvICdib3VuZGFyeScuCkBAIC03NDQsNyArNzAzLDcgQEAKICAgICAgICAgaWYgcGFyYW1zIGlzIG1pc3Npbmc6CiAgICAgICAgICAgICAjIFRoZXJlIHdhcyBubyBDb250ZW50LVR5cGUgaGVhZGVyLCBhbmQgd2UgZG9uJ3Qga25vdyB3aGF0IHR5cGUKICAgICAgICAgICAgICMgdG8gc2V0IGl0IHRvLCBzbyByYWlzZSBhbiBleGNlcHRpb24uCi0gICAgICAgICAgICByYWlzZSBFcnJvcnMuSGVhZGVyUGFyc2VFcnJvciwgJ05vIENvbnRlbnQtVHlwZSBoZWFkZXIgZm91bmQnCisgICAgICAgICAgICByYWlzZSBlcnJvcnMuSGVhZGVyUGFyc2VFcnJvcignTm8gQ29udGVudC1UeXBlIGhlYWRlciBmb3VuZCcpCiAgICAgICAgIG5ld3BhcmFtcyA9IFtdCiAgICAgICAgIGZvdW5kcCA9IEZhbHNlCiAgICAgICAgIGZvciBwaywgcHYgaW4gcGFyYW1zOgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL21pbWUvX19pbml0X18ucHkgYi9MaWIvZW1haWwvbWltZS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL21pbWUvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5IGIvTGliL2VtYWlsL21pbWUvYXBwbGljYXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4YmI4YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5CkBAIC0wLDAgKzEsMzYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBLZWl0aCBEYXJ0CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkNsYXNzIHJlcHJlc2VudGluZyBhcHBsaWNhdGlvbi8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCisKK19fYWxsX18gPSBbIk1JTUVBcHBsaWNhdGlvbiJdCisKK2Zyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCitmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CisKKworY2xhc3MgTUlNRUFwcGxpY2F0aW9uKE1JTUVOb25NdWx0aXBhcnQpOgorICAgICIiIkNsYXNzIGZvciBnZW5lcmF0aW5nIGFwcGxpY2F0aW9uLyogTUlNRSBkb2N1bWVudHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX2RhdGEsIF9zdWJ0eXBlPSdvY3RldC1zdHJlYW0nLAorICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpOgorICAgICAgICAiIiJDcmVhdGUgYW4gYXBwbGljYXRpb24vKiB0eXBlIE1JTUUgZG9jdW1lbnQuCisKKyAgICAgICAgX2RhdGEgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmF3IGFwcGxpY2F0b2luIGRhdGEuCisKKyAgICAgICAgX3N1YnR5cGUgaXMgdGhlIE1JTUUgY29udGVudCB0eXBlIHN1YnR5cGUsIGRlZmF1bHRpbmcgdG8KKyAgICAgICAgJ29jdGV0LXN0cmVhbScuCisKKyAgICAgICAgX2VuY29kZXIgaXMgYSBmdW5jdGlvbiB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGFjdHVhbCBlbmNvZGluZyBmb3IKKyAgICAgICAgdHJhbnNwb3J0IG9mIHRoZSBhcHBsaWNhdGlvbiBkYXRhLCBkZWZhdWx0aW5nIHRvIGJhc2U2NCBlbmNvZGluZy4KKworICAgICAgICBBbnkgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBiYXNlIGNsYXNzCisgICAgICAgIGNvbnN0cnVjdG9yLCB3aGljaCB0dXJucyB0aGVtIGludG8gcGFyYW1ldGVycyBvbiB0aGUgQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIF9zdWJ0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0ludmFsaWQgYXBwbGljYXRpb24gTUlNRSBzdWJ0eXBlJykKKyAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAnYXBwbGljYXRpb24nLCBfc3VidHlwZSwgKipfcGFyYW1zKQorICAgICAgICBzZWxmLnNldF9wYXlsb2FkKF9kYXRhKQorICAgICAgICBfZW5jb2RlcihzZWxmKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01JTUVBdWRpby5weSBiL0xpYi9lbWFpbC9taW1lL2F1ZGlvLnB5CnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9NSU1FQXVkaW8ucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9taW1lL2F1ZGlvLnB5CmluZGV4IDI2NmVjNGMuLmM3MjkwYzQgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NSU1FQXVkaW8ucHkKKysrIGIvTGliL2VtYWlsL21pbWUvYXVkaW8ucHkKQEAgLTEsMTUgKzEsMTYgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBBbnRob255IEJheHRlcgogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJDbGFzcyByZXByZXNlbnRpbmcgYXVkaW8vKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgogCi1pbXBvcnQgc25kaGRyCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK19fYWxsX18gPSBbJ01JTUVBdWRpbyddCiAKLWZyb20gZW1haWwgaW1wb3J0IEVycm9ycwotZnJvbSBlbWFpbCBpbXBvcnQgRW5jb2RlcnMKLWZyb20gZW1haWwuTUlNRU5vbk11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAoraW1wb3J0IHNuZGhkcgorCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCitmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CiAKIAogDApAQCAtNDIsNyArNDMsNyBAQAogICAgICIiIkNsYXNzIGZvciBnZW5lcmF0aW5nIGF1ZGlvLyogTUlNRSBkb2N1bWVudHMuIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgX2F1ZGlvZGF0YSwgX3N1YnR5cGU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgX2VuY29kZXI9RW5jb2RlcnMuZW5jb2RlX2Jhc2U2NCwgKipfcGFyYW1zKToKKyAgICAgICAgICAgICAgICAgX2VuY29kZXI9ZW5jb2RlcnMuZW5jb2RlX2Jhc2U2NCwgKipfcGFyYW1zKToKICAgICAgICAgIiIiQ3JlYXRlIGFuIGF1ZGlvLyogdHlwZSBNSU1FIGRvY3VtZW50LgogCiAgICAgICAgIF9hdWRpb2RhdGEgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmF3IGF1ZGlvIGRhdGEuICBJZiB0aGlzIGRhdGEKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9NSU1FQmFzZS5weSBiL0xpYi9lbWFpbC9taW1lL2Jhc2UucHkKc2ltaWxhcml0eSBpbmRleCA3NyUKcmVuYW1lIGZyb20gTGliL2VtYWlsL01JTUVCYXNlLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvbWltZS9iYXNlLnB5CmluZGV4IDg4NjkxZjguLmFjOTE5MjUgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NSU1FQmFzZS5weQorKysgYi9MaWIvZW1haWwvbWltZS9iYXNlLnB5CkBAIC0xLDE0ICsxLDE2IEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgc3BlY2lhbGl6YXRpb25zLiIiIgogCi1mcm9tIGVtYWlsIGltcG9ydCBNZXNzYWdlCitfX2FsbF9fID0gWydNSU1FQmFzZSddCisKK2Zyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2UKIAogCiAMCi1jbGFzcyBNSU1FQmFzZShNZXNzYWdlLk1lc3NhZ2UpOgorY2xhc3MgTUlNRUJhc2UobWVzc2FnZS5NZXNzYWdlKToKICAgICAiIiJCYXNlIGNsYXNzIGZvciBNSU1FIHNwZWNpYWxpemF0aW9ucy4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfbWFpbnR5cGUsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpOgpAQCAtMTgsNyArMjAsNyBAQAogICAgICAgICBhcmd1bWVudHMuICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoaXMgaGVhZGVyIGFyZSB0YWtlbiBmcm9tIHRoZQogICAgICAgICBrZXl3b3JkIGFyZ3VtZW50cy4KICAgICAgICAgIiIiCi0gICAgICAgIE1lc3NhZ2UuTWVzc2FnZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBtZXNzYWdlLk1lc3NhZ2UuX19pbml0X18oc2VsZikKICAgICAgICAgY3R5cGUgPSAnJXMvJXMnICUgKF9tYWludHlwZSwgX3N1YnR5cGUpCiAgICAgICAgIHNlbGYuYWRkX2hlYWRlcignQ29udGVudC1UeXBlJywgY3R5cGUsICoqX3BhcmFtcykKICAgICAgICAgc2VsZlsnTUlNRS1WZXJzaW9uJ10gPSAnMS4wJwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01JTUVJbWFnZS5weSBiL0xpYi9lbWFpbC9taW1lL2ltYWdlLnB5CnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9NSU1FSW1hZ2UucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9taW1lL2ltYWdlLnB5CmluZGV4IGE2NTgwNjcuLjU1NjM4MjMgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NSU1FSW1hZ2UucHkKKysrIGIvTGliL2VtYWlsL21pbWUvaW1hZ2UucHkKQEAgLTEsMTQgKzEsMTUgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGltYWdlLyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKIAorX19hbGxfXyA9IFsnTUlNRUltYWdlJ10KKwogaW1wb3J0IGltZ2hkcgogCi1mcm9tIGVtYWlsIGltcG9ydCBFcnJvcnMKLWZyb20gZW1haWwgaW1wb3J0IEVuY29kZXJzCi1mcm9tIGVtYWlsLk1JTUVOb25NdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKK2Zyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCitmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CiAKIAogDApAQCAtMTYsNyArMTcsNyBAQAogICAgICIiIkNsYXNzIGZvciBnZW5lcmF0aW5nIGltYWdlLyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfaW1hZ2VkYXRhLCBfc3VidHlwZT1Ob25lLAotICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1FbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpOgorICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpOgogICAgICAgICAiIiJDcmVhdGUgYW4gaW1hZ2UvKiB0eXBlIE1JTUUgZG9jdW1lbnQuCiAKICAgICAgICAgX2ltYWdlZGF0YSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByYXcgaW1hZ2UgZGF0YS4gIElmIHRoaXMgZGF0YQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01JTUVNZXNzYWdlLnB5IGIvTGliL2VtYWlsL21pbWUvbWVzc2FnZS5weQpzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvTUlNRU1lc3NhZ2UucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9taW1lL21lc3NhZ2UucHkKaW5kZXggMzAyMTkzNC4uMjc1ZGJmZCAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL01JTUVNZXNzYWdlLnB5CisrKyBiL0xpYi9lbWFpbC9taW1lL21lc3NhZ2UucHkKQEAgLTEsMTEgKzEsMTMgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiQ2xhc3MgcmVwcmVzZW50aW5nIG1lc3NhZ2UvKiBNSU1FIGRvY3VtZW50cy4iIiIKIAotZnJvbSBlbWFpbCBpbXBvcnQgTWVzc2FnZQotZnJvbSBlbWFpbC5NSU1FTm9uTXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CitfX2FsbF9fID0gWydNSU1FTWVzc2FnZSddCisKK2Zyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2UKK2Zyb20gZW1haWwubWltZS5ub25tdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKIAogCiAMCkBAIC0yMywxMCArMjUsMTAgQEAKICAgICAgICAgdGhlIHRlcm0gInJmYzgyMiIgaXMgdGVjaG5pY2FsbHkgb3V0ZGF0ZWQgYnkgUkZDIDI4MjIpLgogICAgICAgICAiIiIKICAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAnbWVzc2FnZScsIF9zdWJ0eXBlKQotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShfbXNnLCBNZXNzYWdlLk1lc3NhZ2UpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShfbXNnLCBtZXNzYWdlLk1lc3NhZ2UpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdBcmd1bWVudCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZScpCiAgICAgICAgICMgSXQncyBjb252ZW5pZW50IHRvIHVzZSB0aGlzIGJhc2UgY2xhc3MgbWV0aG9kLiAgV2UgbmVlZCB0byBkbyBpdAogICAgICAgICAjIHRoaXMgd2F5IG9yIHdlJ2xsIGdldCBhbiBleGNlcHRpb24KLSAgICAgICAgTWVzc2FnZS5NZXNzYWdlLmF0dGFjaChzZWxmLCBfbXNnKQorICAgICAgICBtZXNzYWdlLk1lc3NhZ2UuYXR0YWNoKHNlbGYsIF9tc2cpCiAgICAgICAgICMgQW5kIGJlIHN1cmUgb3VyIGRlZmF1bHQgdHlwZSBpcyBzZXQgY29ycmVjdGx5CiAgICAgICAgIHNlbGYuc2V0X2RlZmF1bHRfdHlwZSgnbWVzc2FnZS9yZmM4MjInKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01JTUVNdWx0aXBhcnQucHkgYi9MaWIvZW1haWwvbWltZS9tdWx0aXBhcnQucHkKc2ltaWxhcml0eSBpbmRleCA4MyUKcmVuYW1lIGZyb20gTGliL2VtYWlsL01JTUVNdWx0aXBhcnQucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9taW1lL211bHRpcGFydC5weQppbmRleCA5MDcyYTY0Li41YzhjOWRiIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvTUlNRU11bHRpcGFydC5weQorKysgYi9MaWIvZW1haWwvbWltZS9tdWx0aXBhcnQucHkKQEAgLTEsMTQgKzEsMTYgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBtdWx0aXBhcnQvKiB0eXBlIG1lc3NhZ2VzLiIiIgogCi1mcm9tIGVtYWlsIGltcG9ydCBNSU1FQmFzZQorX19hbGxfXyA9IFsnTUlNRU11bHRpcGFydCddCisKK2Zyb20gZW1haWwubWltZS5iYXNlIGltcG9ydCBNSU1FQmFzZQogCiAKIAwKLWNsYXNzIE1JTUVNdWx0aXBhcnQoTUlNRUJhc2UuTUlNRUJhc2UpOgorY2xhc3MgTUlNRU11bHRpcGFydChNSU1FQmFzZSk6CiAgICAgIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBtdWx0aXBhcnQvKiB0eXBlIG1lc3NhZ2VzLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9zdWJ0eXBlPSdtaXhlZCcsIGJvdW5kYXJ5PU5vbmUsIF9zdWJwYXJ0cz1Ob25lLApAQCAtMzEsNyArMzMsNyBAQAogICAgICAgICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGFyZSB0YWtlbiBmcm9tIHRoZQogICAgICAgICBrZXl3b3JkIGFyZ3VtZW50cyAob3IgcGFzc2VkIGludG8gdGhlIF9wYXJhbXMgYXJndW1lbnQpLgogICAgICAgICAiIiIKLSAgICAgICAgTUlNRUJhc2UuTUlNRUJhc2UuX19pbml0X18oc2VsZiwgJ211bHRpcGFydCcsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpCisgICAgICAgIE1JTUVCYXNlLl9faW5pdF9fKHNlbGYsICdtdWx0aXBhcnQnLCBfc3VidHlwZSwgKipfcGFyYW1zKQogICAgICAgICBpZiBfc3VicGFydHM6CiAgICAgICAgICAgICBmb3IgcCBpbiBfc3VicGFydHM6CiAgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2gocCkKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9NSU1FTm9uTXVsdGlwYXJ0LnB5IGIvTGliL2VtYWlsL21pbWUvbm9ubXVsdGlwYXJ0LnB5CnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9NSU1FTm9uTXVsdGlwYXJ0LnB5CnJlbmFtZSB0byBMaWIvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHkKaW5kZXggNDE5NWQyYS4uZGQyODBiNSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL01JTUVOb25NdWx0aXBhcnQucHkKKysrIGIvTGliL2VtYWlsL21pbWUvbm9ubXVsdGlwYXJ0LnB5CkBAIC0xLDE1ICsxLDE3IEBACi0jIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgdHlwZSBtZXNzYWdlcyB0aGF0IGFyZSBub3QgbXVsdGlwYXJ0LiIiIgogCi1mcm9tIGVtYWlsIGltcG9ydCBFcnJvcnMKLWZyb20gZW1haWwgaW1wb3J0IE1JTUVCYXNlCitfX2FsbF9fID0gWydNSU1FTm9uTXVsdGlwYXJ0J10KKworZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCitmcm9tIGVtYWlsLm1pbWUuYmFzZSBpbXBvcnQgTUlNRUJhc2UKIAogCiAMCi1jbGFzcyBNSU1FTm9uTXVsdGlwYXJ0KE1JTUVCYXNlLk1JTUVCYXNlKToKK2NsYXNzIE1JTUVOb25NdWx0aXBhcnQoTUlNRUJhc2UpOgogICAgICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgbXVsdGlwYXJ0LyogdHlwZSBtZXNzYWdlcy4iIiIKIAogICAgIF9fcHljaGVja2VyX18gPSAndW51c2VkbmFtZXM9cGF5bG9hZCcKQEAgLTE4LDcgKzIwLDcgQEAKICAgICAgICAgIyBUaGUgcHVibGljIEFQSSBwcm9oaWJpdHMgYXR0YWNoaW5nIG11bHRpcGxlIHN1YnBhcnRzIHRvIE1JTUVCYXNlCiAgICAgICAgICMgZGVyaXZlZCBzdWJ0eXBlcyBzaW5jZSBub25lIG9mIHRoZW0gYXJlLCBieSBkZWZpbml0aW9uLCBvZiBjb250ZW50CiAgICAgICAgICMgdHlwZSBtdWx0aXBhcnQvKgotICAgICAgICByYWlzZSBFcnJvcnMuTXVsdGlwYXJ0Q29udmVyc2lvbkVycm9yKAorICAgICAgICByYWlzZSBlcnJvcnMuTXVsdGlwYXJ0Q29udmVyc2lvbkVycm9yKAogICAgICAgICAgICAgJ0Nhbm5vdCBhdHRhY2ggYWRkaXRpb25hbCBzdWJwYXJ0cyB0byBub24tbXVsdGlwYXJ0LyonKQogCiAgICAgZGVsIF9fcHljaGVja2VyX18KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9NSU1FVGV4dC5weSBiL0xpYi9lbWFpbC9taW1lL3RleHQucHkKc2ltaWxhcml0eSBpbmRleCA4MiUKcmVuYW1lIGZyb20gTGliL2VtYWlsL01JTUVUZXh0LnB5CnJlbmFtZSB0byBMaWIvZW1haWwvbWltZS90ZXh0LnB5CmluZGV4IDVlZjE4NzYuLjU3NDdkYjUgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NSU1FVGV4dC5weQorKysgYi9MaWIvZW1haWwvbWltZS90ZXh0LnB5CkBAIC0xLDExICsxLDEzIEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIkNsYXNzIHJlcHJlc2VudGluZyB0ZXh0LyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKIAotZnJvbSBlbWFpbC5NSU1FTm9uTXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0Ci1mcm9tIGVtYWlsLkVuY29kZXJzIGltcG9ydCBlbmNvZGVfN29yOGJpdAorX19hbGxfXyA9IFsnTUlNRVRleHQnXQorCitmcm9tIGVtYWlsLmVuY29kZXJzIGltcG9ydCBlbmNvZGVfN29yOGJpdAorZnJvbSBlbWFpbC5taW1lLm5vbm11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAogCiAKIAwKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9QYXJzZXIucHkgYi9MaWIvZW1haWwvcGFyc2VyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9QYXJzZXIucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9wYXJzZXIucHkKaW5kZXggMGMwNTIyNC4uMmZjYWYyNSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL1BhcnNlci5weQorKysgYi9MaWIvZW1haWwvcGFyc2VyLnB5CkBAIC0xLDEzICsxLDE2IEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3LCBUaG9tYXMgV291dGVycywgQW50aG9ueSBCYXh0ZXIKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiQSBwYXJzZXIgb2YgUkZDIDI4MjIgYW5kIE1JTUUgZW1haWwgbWVzc2FnZXMuIiIiCiAKK19fYWxsX18gPSBbJ1BhcnNlcicsICdIZWFkZXJQYXJzZXInXQorCiBpbXBvcnQgd2FybmluZ3MKIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotZnJvbSBlbWFpbC5GZWVkUGFyc2VyIGltcG9ydCBGZWVkUGFyc2VyCi1mcm9tIGVtYWlsLk1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKKworZnJvbSBlbWFpbC5mZWVkcGFyc2VyIGltcG9ydCBGZWVkUGFyc2VyCitmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKIAogCiAMCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvcXVvcHJpTUlNRS5weSBiL0xpYi9lbWFpbC9xdW9wcmltaW1lLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9xdW9wcmlNSU1FLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvcXVvcHJpbWltZS5weQppbmRleCBhOWI1ZDQ5Li5hNTY1OGRkIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvcXVvcHJpTUlNRS5weQorKysgYi9MaWIvZW1haWwvcXVvcHJpbWltZS5weQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCZW4gR2VydHpmaWVsZAogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCkBAIC0yNiw5ICsyNiwyNyBAQAogd3JhcHBpbmcgaXNzdWVzLCB1c2UgdGhlIGVtYWlsLkhlYWRlciBtb2R1bGUuCiAiIiIKIAorX19hbGxfXyA9IFsKKyAgICAnYm9keV9kZWNvZGUnLAorICAgICdib2R5X2VuY29kZScsCisgICAgJ2JvZHlfcXVvcHJpX2NoZWNrJywKKyAgICAnYm9keV9xdW9wcmlfbGVuJywKKyAgICAnZGVjb2RlJywKKyAgICAnZGVjb2Rlc3RyaW5nJywKKyAgICAnZW5jb2RlJywKKyAgICAnZW5jb2Rlc3RyaW5nJywKKyAgICAnaGVhZGVyX2RlY29kZScsCisgICAgJ2hlYWRlcl9lbmNvZGUnLAorICAgICdoZWFkZXJfcXVvcHJpX2NoZWNrJywKKyAgICAnaGVhZGVyX3F1b3ByaV9sZW4nLAorICAgICdxdW90ZScsCisgICAgJ3VucXVvdGUnLAorICAgIF0KKwogaW1wb3J0IHJlCisKIGZyb20gc3RyaW5nIGltcG9ydCBoZXhkaWdpdHMKLWZyb20gZW1haWwuVXRpbHMgaW1wb3J0IGZpeF9lb2xzCitmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBmaXhfZW9scwogCiBDUkxGID0gJ1xyXG4nCiBOTCA9ICdcbicKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CmluZGV4IDVhNDJjMjIuLmQ5Nzc2OTMgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQpAQCAtMzksOSArMzksNiBAQAogRU1QVFlTVFJJTkcgPSAnJwogU1BBQ0UgPSAnICcKIAotIyBXZSBkb24ndCBjYXJlIGFib3V0IERlcHJlY2F0aW9uV2FybmluZ3MKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnLCAnJywgRGVwcmVjYXRpb25XYXJuaW5nLCBfX25hbWVfXykKLQogCiAMCiBkZWYgb3BlbmZpbGUoZmlsZW5hbWUsIG1vZGU9J3InKToKQEAgLTg3LDcgKzg0LDcgQEAKICAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQogICAgICAgICBtc2cuc2V0X2NoYXJzZXQoY2hhcnNldCkKICAgICAgICAgZXEobXNnWydtaW1lLXZlcnNpb24nXSwgJzEuMCcpCi0gICAgICAgIGVxKG1zZy5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTEiJykKICAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAnaXNvLTg4NTktMScpCiAgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAncXVvdGVkLXByaW50YWJsZScpCkBAIC0yMTEsNiArMjA4LDE5IEBACiAgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnZm9vJykKICAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgJ2ZvbycpCiAKKyAgICBkZWYgdGVzdF9kZWNvZGVfYm9ndXNfdXVfcGF5bG9hZF9xdWlldGx5KHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdiZWdpbiA2NjQgZm9vLnR4dFxuJTxXMUY9MDAwMEggXG4gXG5lbmRcbicpCisgICAgICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJ3gtdXVlbmNvZGUnCisgICAgICAgIG9sZF9zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgICAgICAjIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHBheWxvYWQKKyAgICAgICAgICAgIG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBvbGRfc3RkZXJyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2ZwLmdldHZhbHVlKCksICcnKQorCiAgICAgZGVmIHRlc3RfZGVjb2RlZF9nZW5lcmF0b3Ioc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNy50eHQnKQpAQCAtODkzLDcgKzkwMyw3IEBACiAgICAgICAgIHNlbGYuX2F1ID0gTUlNRUF1ZGlvKHNlbGYuX2F1ZGlvZGF0YSkKIAogICAgIGRlZiB0ZXN0X2d1ZXNzX21pbm9yX3R5cGUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYXUuZ2V0X3R5cGUoKSwgJ2F1ZGlvL2Jhc2ljJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9hdS5nZXRfY29udGVudF90eXBlKCksICdhdWRpby9iYXNpYycpCiAKICAgICBkZWYgdGVzdF9lbmNvZGluZyhzZWxmKToKICAgICAgICAgcGF5bG9hZCA9IHNlbGYuX2F1LmdldF9wYXlsb2FkKCkKQEAgLTkwMSw3ICs5MTEsNyBAQAogCiAgICAgZGVmIHRlc3RfY2hlY2tTZXRNaW5vcihzZWxmKToKICAgICAgICAgYXUgPSBNSU1FQXVkaW8oc2VsZi5fYXVkaW9kYXRhLCAnZmlzaCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXUuZ2V0X3R5cGUoKSwgJ2F1ZGlvL2Zpc2gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Zpc2gnKQogCiAgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC05MzYsNyArOTQ2LDcgQEAKICAgICAgICAgc2VsZi5faW0gPSBNSU1FSW1hZ2Uoc2VsZi5faW1nZGF0YSkKIAogICAgIGRlZiB0ZXN0X2d1ZXNzX21pbm9yX3R5cGUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5faW0uZ2V0X3R5cGUoKSwgJ2ltYWdlL2dpZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5faW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZ2lmJykKIAogICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgogICAgICAgICBwYXlsb2FkID0gc2VsZi5faW0uZ2V0X3BheWxvYWQoKQpAQCAtOTQ0LDcgKzk1NCw3IEBACiAKICAgICBkZWYgdGVzdF9jaGVja1NldE1pbm9yKHNlbGYpOgogICAgICAgICBpbSA9IE1JTUVJbWFnZShzZWxmLl9pbWdkYXRhLCAnZmlzaCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW0uZ2V0X3R5cGUoKSwgJ2ltYWdlL2Zpc2gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltLmdldF9jb250ZW50X3R5cGUoKSwgJ2ltYWdlL2Zpc2gnKQogCiAgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC05NzYsNyArOTg2LDcgQEAKICAgICBkZWYgdGVzdF90eXBlcyhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcwotICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ3VzLWFzY2lpJykKICAgICAgICAgbWlzc2luZyA9IFtdCiAgICAgICAgIHVubGVzcyhzZWxmLl9tc2cuZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQpAQCAtMTA0NSw3ICsxMDU1LDcgQEAKICAgICAgICAgIyB0ZXN0cwogICAgICAgICBtID0gc2VsZi5fbXNnCiAgICAgICAgIHVubGVzcyhtLmlzX211bHRpcGFydCgpKQotICAgICAgICBlcShtLmdldF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQorICAgICAgICBlcShtLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCiAgICAgICAgIGVxKGxlbihtLmdldF9wYXlsb2FkKCkpLCAyKQogICAgICAgICByYWlzZXMoSW5kZXhFcnJvciwgbS5nZXRfcGF5bG9hZCwgMikKICAgICAgICAgbTAgPSBtLmdldF9wYXlsb2FkKDApCkBAIC0xMzc5LDcgKzEzODksNyBAQAogICAgIGRlZiB0ZXN0X3BhcnNlX21pc3NpbmdfbWlub3JfdHlwZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE0LnR4dCcpCi0gICAgICAgIGVxKG1zZy5nZXRfdHlwZSgpLCAndGV4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKIApAQCAtMTUzMSw3ICsxNTQxLDcgQEAKICAgICAgICAgbSA9IE1lc3NhZ2UoKQogICAgICAgICBtWydTdWJqZWN0J10gPSBzdWJqZWN0CiAgICAgICAgIHIgPSBNSU1FTWVzc2FnZShtKQotICAgICAgICBlcShyLmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBwYXlsb2FkID0gci5nZXRfcGF5bG9hZCgpCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQogICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCkBAIC0xNTcyLDcgKzE1ODIsNyBAQAogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzExLnR4dCcpCi0gICAgICAgIGVxKG1zZy5nZXRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKQEAgLTE1ODYsMTIgKzE1OTYsMTIgQEAKICAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCiAgICAgICAgICMgbXNnIDE2IGlzIGEgRGVsaXZlcnkgU3RhdHVzIE5vdGlmaWNhdGlvbiwgc2VlIFJGQyAxODk0CiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCi0gICAgICAgIGVxKG1zZy5nZXRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKICAgICAgICAgdW5sZXNzKG1zZy5pc19tdWx0aXBhcnQoKSkKICAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKICAgICAgICAgIyBTdWJwYXJ0IDEgaXMgYSB0ZXh0L3BsYWluLCBodW1hbiByZWFkYWJsZSBzZWN0aW9uCiAgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMCkKLSAgICAgICAgZXEoc3VicGFydC5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSwgIiIiXAogVGhpcyByZXBvcnQgcmVsYXRlcyB0byBhIG1lc3NhZ2UgeW91IHNlbnQgd2l0aCB0aGUgZm9sbG93aW5nIGhlYWRlciBmaWVsZHM6CiAKQEAgLTE2MTEsNyArMTYyMSw3IEBACiAgICAgICAgICMgY29uc2lzdHMgb2YgdHdvIGJsb2NrcyBvZiBoZWFkZXJzLCByZXByZXNlbnRlZCBieSB0d28gbmVzdGVkIE1lc3NhZ2UKICAgICAgICAgIyBvYmplY3RzLgogICAgICAgICBzdWJwYXJ0ID0gbXNnLmdldF9wYXlsb2FkKDEpCi0gICAgICAgIGVxKHN1YnBhcnQuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzJykKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cycpCiAgICAgICAgIGVxKGxlbihzdWJwYXJ0LmdldF9wYXlsb2FkKCkpLCAyKQogICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIHNob3VsZCB0cmVhdCBlYWNoIGJsb2NrIGFzIGEgYnVuY2ggb2YKICAgICAgICAgIyBoZWFkZXJzLCBpLmUuIGEgYnVuY2ggb2YgTWVzc2FnZSBvYmplY3RzLgpAQCAtMTYyOSwxMyArMTYzOSwxMyBAQAogICAgICAgICBlcShkc24yLmdldF9wYXJhbSgncmZjODIyJywgaGVhZGVyPSdmaW5hbC1yZWNpcGllbnQnKSwgJycpCiAgICAgICAgICMgU3VicGFydCAzIGlzIHRoZSBvcmlnaW5hbCBtZXNzYWdlCiAgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMikKLSAgICAgICAgZXEoc3VicGFydC5nZXRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgcGF5bG9hZCA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQogICAgICAgICBzdWJzdWJwYXJ0ID0gcGF5bG9hZFswXQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzdWJzdWJwYXJ0LCBNZXNzYWdlKSkKLSAgICAgICAgZXEoc3Vic3VicGFydC5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHN1YnN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKHN1YnN1YnBhcnRbJ21lc3NhZ2UtaWQnXSwKICAgICAgICAgICAgJzwwMDIwMDFjMTQ0YTYkODc1MmUwNjAkNTYxMDQ1ODZAb3h5LmVkdT4nKQogCkBAIC0xNzA2LDE2ICsxNzE2LDE2IEBACiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgIGNvbnRhaW5lcjEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKICAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCi0gICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X3R5cGUoKSwgTm9uZSkKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGNvbnRhaW5lcjIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKICAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCi0gICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X3R5cGUoKSwgTm9uZSkKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGNvbnRhaW5lcjFhID0gY29udGFpbmVyMS5nZXRfcGF5bG9hZCgwKQogICAgICAgICBlcShjb250YWluZXIxYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKLSAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgY29udGFpbmVyMmEgPSBjb250YWluZXIyLmdldF9wYXlsb2FkKDApCiAgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQotICAgICAgICBlcShjb250YWluZXIyYS5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogCiAgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlX3dpdGhfZXhwbGljaXRfY29udGFpbmVyX3R5cGUoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMTcyNiwxNiArMTczNiwxNiBAQAogICAgICAgICAgICAgZnAuY2xvc2UoKQogICAgICAgICBjb250YWluZXIxID0gbXNnLmdldF9wYXlsb2FkKDApCiAgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQotICAgICAgICBlcShjb250YWluZXIxLmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBjb250YWluZXIyID0gbXNnLmdldF9wYXlsb2FkKDEpCiAgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQotICAgICAgICBlcShjb250YWluZXIyLmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBjb250YWluZXIxYSA9IGNvbnRhaW5lcjEuZ2V0X3BheWxvYWQoMCkKICAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCi0gICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGNvbnRhaW5lcjJhID0gY29udGFpbmVyMi5nZXRfcGF5bG9hZCgwKQogICAgICAgICBlcShjb250YWluZXIyYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKLSAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKIAogICAgIGRlZiB0ZXN0X2RlZmF1bHRfdHlwZV9ub25fcGFyc2VkKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTE3NTAsOSArMTc2MCw5IEBACiAgICAgICAgIHN1YnBhcnQyID0gTUlNRU1lc3NhZ2Uoc3VicGFydDJhKQogICAgICAgICBjb250YWluZXIuYXR0YWNoKHN1YnBhcnQxKQogICAgICAgICBjb250YWluZXIuYXR0YWNoKHN1YnBhcnQyKQotICAgICAgICBlcShzdWJwYXJ0MS5nZXRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGVxKHN1YnBhcnQxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKLSAgICAgICAgZXEoc3VicGFydDIuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIG5lcShjb250YWluZXIuYXNfc3RyaW5nKDApLCAnJydcCiBDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PSJCT1VOREFSWSIKQEAgLTE3ODQsOSArMTc5NCw5IEBACiAgICAgICAgIGRlbCBzdWJwYXJ0MVsnbWltZS12ZXJzaW9uJ10KICAgICAgICAgZGVsIHN1YnBhcnQyWydjb250ZW50LXR5cGUnXQogICAgICAgICBkZWwgc3VicGFydDJbJ21pbWUtdmVyc2lvbiddCi0gICAgICAgIGVxKHN1YnBhcnQxLmdldF90eXBlKCksIE5vbmUpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgZXEoc3VicGFydDEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQotICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfdHlwZSgpLCBOb25lKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGVxKHN1YnBhcnQyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgbmVxKGNvbnRhaW5lci5hc19zdHJpbmcoMCksICcnJ1wKIENvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2RpZ2VzdDsgYm91bmRhcnk9IkJPVU5EQVJZIgpAQCAtMTg0Nyw3ICsxODU3LDcgQEAKICAgICBkZWYgdGVzdF9wYXJzZV90ZXh0X21lc3NhZ2Uoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbHMKICAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQogICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpWzFdLCAoJ2NoYXJzZXQnLCAndXMtYXNjaWknKSkKQEAgLTE4NTksNyArMTg2OSw3IEBACiAgICAgZGVmIHRlc3RfcGFyc2VfdW50eXBlZF9tZXNzYWdlKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCiAgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCi0gICAgICAgIGVxKG1zZy5nZXRfdHlwZSgpLCBOb25lKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksIE5vbmUpCiAgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgTm9uZSkKICAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCkBAIC0xOTMzLDcgKzE5NDMsNyBAQAogICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKICAgICAgICAgIyBHZXQgYSBtZXNzYWdlIG9iamVjdCBhbmQgcmVzZXQgdGhlIHNlZWsgcG9pbnRlciBmb3Igb3RoZXIgdGVzdHMKICAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQogICAgICAgICAjIFRlc3QgdGhlIENvbnRlbnQtVHlwZTogcGFyYW1ldGVycwogICAgICAgICBwYXJhbXMgPSB7fQogICAgICAgICBmb3IgcGssIHB2IGluIG1zZy5nZXRfcGFyYW1zKCk6CkBAIC0xOTQ1LDEzICsxOTU1LDEzIEBACiAgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCiAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdWJwYXJ0cyBhcmUgd2hhdCB3ZSBleHBlY3QKICAgICAgICAgbXNnMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQotICAgICAgICBlcShtc2cxLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnMS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEobXNnMS5nZXRfcGF5bG9hZCgpLCAnWWFkZGEgeWFkZGEgeWFkZGFcbicpCiAgICAgICAgIG1zZzIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKLSAgICAgICAgZXEobXNnMi5nZXRfdHlwZSgpLCBOb25lKQorICAgICAgICBlcShtc2cyLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShtc2cyLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKICAgICAgICAgbXNnMyA9IG1zZy5nZXRfcGF5bG9hZCgyKQotICAgICAgICBlcShtc2czLmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKG1zZzMuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2czLCBNZXNzYWdlKSkKICAgICAgICAgcGF5bG9hZCA9IG1zZzMuZ2V0X3BheWxvYWQoKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKQEAgLTE5NjUsNyArMTk3NSw3IEBACiAgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcwogICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNi50eHQnKQogICAgICAgICAjIENoZWNrIHNvbWUgb2YgdGhlIG91dGVyIGhlYWRlcnMKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBwYXlsb2FkIGlzIGEgbGlzdCBvZiBleGFjdGx5IG9uZSBzdWItTWVzc2FnZSwgYW5kIHRoYXQKICAgICAgICAgIyB0aGF0IHN1Ym1lc3NhZ2UgaGFzIGEgdHlwZSBvZiB0ZXh0L3BsYWluCiAgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQpAQCAtMTk3Myw3ICsxOTgzLDcgQEAKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQogICAgICAgICBtc2cxID0gcGF5bG9hZFswXQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cxLCBNZXNzYWdlKSkKLSAgICAgICAgZXEobXNnMS5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZzEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzEuZ2V0X3BheWxvYWQoKSwgc3RyKSkKICAgICAgICAgZXEobXNnMS5nZXRfcGF5bG9hZCgpLCAnXG4nKQogCkBAIC0yMDU4LDEzICsyMDY4LDE5IEBACiAgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18oJ2VtYWlsJykKICAgICAgICAgYWxsID0gbW9kdWxlLl9fYWxsX18KICAgICAgICAgYWxsLnNvcnQoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbCwgWydDaGFyc2V0JywgJ0VuY29kZXJzJywgJ0Vycm9ycycsICdHZW5lcmF0b3InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIZWFkZXInLCAnSXRlcmF0b3JzJywgJ01JTUVBdWRpbycsICdNSU1FQmFzZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01JTUVJbWFnZScsICdNSU1FTWVzc2FnZScsICdNSU1FTXVsdGlwYXJ0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTUlNRU5vbk11bHRpcGFydCcsICdNSU1FVGV4dCcsICdNZXNzYWdlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGFyc2VyJywgJ1V0aWxzJywgJ2Jhc2U2NE1JTUUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlX2Zyb21fZmlsZScsICdtZXNzYWdlX2Zyb21fc3RyaW5nJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVvcHJpTUlNRSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbCwgWworICAgICAgICAgICAgIyBPbGQgbmFtZXMKKyAgICAgICAgICAgICdDaGFyc2V0JywgJ0VuY29kZXJzJywgJ0Vycm9ycycsICdHZW5lcmF0b3InLAorICAgICAgICAgICAgJ0hlYWRlcicsICdJdGVyYXRvcnMnLCAnTUlNRUF1ZGlvJywgJ01JTUVCYXNlJywKKyAgICAgICAgICAgICdNSU1FSW1hZ2UnLCAnTUlNRU1lc3NhZ2UnLCAnTUlNRU11bHRpcGFydCcsCisgICAgICAgICAgICAnTUlNRU5vbk11bHRpcGFydCcsICdNSU1FVGV4dCcsICdNZXNzYWdlJywKKyAgICAgICAgICAgICdQYXJzZXInLCAnVXRpbHMnLCAnYmFzZTY0TUlNRScsCisgICAgICAgICAgICAjIG5ldyBuYW1lcworICAgICAgICAgICAgJ2Jhc2U2NG1pbWUnLCAnY2hhcnNldCcsICdlbmNvZGVycycsICdlcnJvcnMnLCAnZ2VuZXJhdG9yJywKKyAgICAgICAgICAgICdoZWFkZXInLCAnaXRlcmF0b3JzJywgJ21lc3NhZ2UnLCAnbWVzc2FnZV9mcm9tX2ZpbGUnLAorICAgICAgICAgICAgJ21lc3NhZ2VfZnJvbV9zdHJpbmcnLCAnbWltZScsICdwYXJzZXInLAorICAgICAgICAgICAgJ3F1b3ByaU1JTUUnLCAncXVvcHJpbWltZScsICd1dGlscycsCisgICAgICAgICAgICBdKQogCiAgICAgZGVmIHRlc3RfZm9ybWF0ZGF0ZShzZWxmKToKICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKQEAgLTIwOTcsMTIgKzIxMTMsMTIgQEAKICAgICBkZWYgdGVzdF9wYXJzZWRhdGVfbm9fZGF5b2Z3ZWVrKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgZXEoVXRpbHMucGFyc2VkYXRlX3R6KCcyNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpLAotICAgICAgICAgICAoMjAwMywgMiwgMjUsIDEzLCA0NywgMjYsIDAsIDEsIDAsIC0yODgwMCkpCisgICAgICAgICAgICgyMDAzLCAyLCAyNSwgMTMsIDQ3LCAyNiwgMCwgMSwgLTEsIC0yODgwMCkpCiAKICAgICBkZWYgdGVzdF9wYXJzZWRhdGVfY29tcGFjdF9ub19kYXlvZndlZWsoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICBlcShVdGlscy5wYXJzZWRhdGVfdHooJzUgRmViIDIwMDMgMTM6NDc6MjYgLTA4MDAnKSwKLSAgICAgICAgICAgKDIwMDMsIDIsIDUsIDEzLCA0NywgMjYsIDAsIDEsIDAsIC0yODgwMCkpCisgICAgICAgICAgICgyMDAzLCAyLCA1LCAxMywgNDcsIDI2LCAwLCAxLCAtMSwgLTI4ODAwKSkKIAogICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9hY2NlcHRhYmxlX3RvX3RpbWVfZnVuY3Rpb25zKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTIzNTYsNyArMjM3Miw3IEBACiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgIGVxKG1zZ1snZnJvbSddLCAncHBwLXJlcXVlc3RAenp6Lm9yZycpCiAgICAgICAgIGVxKG1zZ1sndG8nXSwgJ3BwcEB6enoub3JnJykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKICAgICAgICAgc2VsZi5mYWlsSWYobXNnLmlzX211bHRpcGFydCgpKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKIApAQCAtMjQwNSwxMCArMjQyMSwxMCBAQAogICAgICAgICAgICAgZnAuY2xvc2UoKQogICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQogICAgICAgICBwYXJ0MSA9IG1zZy5nZXRfcGF5bG9hZCgwKQotICAgICAgICBlcShwYXJ0MS5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHBhcnQxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShwYXJ0MS5nZXRfcGF5bG9hZCgpLCAnU2ltcGxlIGVtYWlsIHdpdGggYXR0YWNobWVudC5cclxuXHJcbicpCiAgICAgICAgIHBhcnQyID0gbXNnLmdldF9wYXlsb2FkKDEpCi0gICAgICAgIGVxKHBhcnQyLmdldF90eXBlKCksICdhcHBsaWNhdGlvbi9yaXNjb3MnKQorICAgICAgICBlcShwYXJ0Mi5nZXRfY29udGVudF90eXBlKCksICdhcHBsaWNhdGlvbi9yaXNjb3MnKQogCiAgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X2RpZ2VzdF93aXRoX2V4dHJhX21pbWVfaGVhZGVycyhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0yNDI3LDIxICsyNDQzLDIxIEBACiAgICAgICAgIGVxKG1zZy5pc19tdWx0aXBhcnQoKSwgMSkKICAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKICAgICAgICAgcGFydDEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKLSAgICAgICAgZXEocGFydDEuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBlcShwYXJ0MS5pc19tdWx0aXBhcnQoKSwgMSkKICAgICAgICAgZXEobGVuKHBhcnQxLmdldF9wYXlsb2FkKCkpLCAxKQogICAgICAgICBwYXJ0MWEgPSBwYXJ0MS5nZXRfcGF5bG9hZCgwKQogICAgICAgICBlcShwYXJ0MWEuaXNfbXVsdGlwYXJ0KCksIDApCi0gICAgICAgIGVxKHBhcnQxYS5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHBhcnQxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgbmVxKHBhcnQxYS5nZXRfcGF5bG9hZCgpLCAnbWVzc2FnZSAxXG4nKQogICAgICAgICAjIG5leHQgbWVzc2FnZS9yZmM4MjIKICAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKLSAgICAgICAgZXEocGFydDIuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEocGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBlcShwYXJ0Mi5pc19tdWx0aXBhcnQoKSwgMSkKICAgICAgICAgZXEobGVuKHBhcnQyLmdldF9wYXlsb2FkKCkpLCAxKQogICAgICAgICBwYXJ0MmEgPSBwYXJ0Mi5nZXRfcGF5bG9hZCgwKQogICAgICAgICBlcShwYXJ0MmEuaXNfbXVsdGlwYXJ0KCksIDApCi0gICAgICAgIGVxKHBhcnQyYS5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHBhcnQyYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgbmVxKHBhcnQyYS5nZXRfcGF5bG9hZCgpLCAnbWVzc2FnZSAyXG4nKQogCiAgICAgZGVmIHRlc3RfdGhyZWVfbGluZXMoc2VsZik6CkBAIC0yNzIzLDYgKzI3MzksMTEgQEAKICAgICAgICAgYyA9IENoYXJzZXQoJ2Zha2UnKQogICAgICAgICBlcSgnaGVsbG8gd1x4ZjZybGQnLCBjLmJvZHlfZW5jb2RlKCdoZWxsbyB3XHhmNnJsZCcpKQogCisgICAgZGVmIHRlc3RfdW5pY29kZV9jaGFyc2V0X25hbWUoc2VsZik6CisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KHUndXMtYXNjaWknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjaGFyc2V0KSwgJ3VzLWFzY2lpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXJyb3JzLkNoYXJzZXRFcnJvciwgQ2hhcnNldCwgJ2FzY1x4ZmZpaScpCisKIAogDAogIyBUZXN0IG11bHRpbGluZ3VhbCBNSU1FIGhlYWRlcnMuCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weSBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5CmluZGV4IDE1OTk4OWMuLjM4YjdkOTUgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5CisrKyBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5CkBAIC0xMCw2ICsxMCwxMyBAQAogZnJvbSBlbWFpbC5IZWFkZXIgaW1wb3J0IEhlYWRlciwgZGVjb2RlX2hlYWRlcgogZnJvbSBlbWFpbC5NZXNzYWdlIGltcG9ydCBNZXNzYWdlCiAKKyMgV2UncmUgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdGhlIGJ1aWx0LWluIEFzaWFuCisjIGNvZGVjcywgc28gd2UgaGF2ZSB0byBza2lwIGFsbCB0aGVzZSB0ZXN0cy4KK3RyeToKKyAgICB1bmljb2RlKCdmb28nLCAnZXVjLWpwJykKK2V4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICByYWlzZSBUZXN0U2tpcHBlZAorCiAKIAwKIGNsYXNzIFRlc3RFbWFpbEFzaWFuQ29kZWNzKFRlc3RFbWFpbEJhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weSBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiYWNjZAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQucHkKQEAgLTAsMCArMSw3NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMgZm9yIChvcHRpb25hbCkgQXNpYW4gY29kZWNzCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdAorCitmcm9tIGVtYWlsLnRlc3QudGVzdF9lbWFpbCBpbXBvcnQgVGVzdEVtYWlsQmFzZQorZnJvbSBlbWFpbC5jaGFyc2V0IGltcG9ydCBDaGFyc2V0Citmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgSGVhZGVyLCBkZWNvZGVfaGVhZGVyCitmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKKworIyBXZSdyZSBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0aGUgYnVpbHQtaW4gQXNpYW4KKyMgY29kZWNzLCBzbyB3ZSBoYXZlIHRvIHNraXAgYWxsIHRoZXNlIHRlc3RzLgordHJ5OgorICAgIHVuaWNvZGUoJ2ZvbycsICdldWMtanAnKQorZXhjZXB0IExvb2t1cEVycm9yOgorICAgIHJhaXNlIFRlc3RTa2lwcGVkCisKKworDAorY2xhc3MgVGVzdEVtYWlsQXNpYW5Db2RlY3MoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfamFwYW5lc2VfY29kZWNzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBqID0gQ2hhcnNldCgiZXVjLWpwIikKKyAgICAgICAgZyA9IENoYXJzZXQoImlzby04ODU5LTEiKQorICAgICAgICBoID0gSGVhZGVyKCJIZWxsbyBXb3JsZCEiKQorICAgICAgICBqaGVsbG8gPSAnXHhhNVx4Y2ZceGE1XHhlZFx4YTFceGJjXHhhNVx4ZWZceGExXHhiY1x4YTVceGViXHhhNVx4YzlceGExXHhhYScKKyAgICAgICAgZ2hlbGxvID0gJ0dyXHhmY1x4ZGYgR290dCEnCisgICAgICAgIGguYXBwZW5kKGpoZWxsbywgaikKKyAgICAgICAgaC5hcHBlbmQoZ2hlbGxvLCBnKQorICAgICAgICAjIEJBVzogVGhpcyB1c2VkIHRvIC0tIGFuZCBtYXliZSBzaG91bGQgLS0gZm9sZCB0aGUgdHdvIGlzby04ODU5LTEKKyAgICAgICAgIyBjaHVua3MgaW50byBhIHNpbmdsZSBlbmNvZGVkIHdvcmQuICBIb3dldmVyIGl0IGRvZXNuJ3QgdmlvbGF0ZSB0aGUKKyAgICAgICAgIyBzdGFuZGFyZCB0byBoYXZlIHRoZW0gYXMgdHdvIGVuY29kZWQgY2h1bmtzIGFuZCBtYXliZSBpdCdzCisgICAgICAgICMgcmVhc29uYWJsZSA8d2luaz4gZm9yIGVhY2ggLmFwcGVuZCgpIGNhbGwgdG8gcmVzdWx0IGluIGEgc2VwYXJhdGUKKyAgICAgICAgIyBlbmNvZGVkIHdvcmQuCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK0hlbGxvIFdvcmxkISA9P2lzby0yMDIyLWpwP2I/R3lSQ0pVOGxiU0U4Slc4aFBDVnJKVWtoS2hzb1FnPT0/PQorID0/aXNvLTg4NTktMT9xP0dyPUZDPURGPz0gPT9pc28tODg1OS0xP3E/X0dvdHQhPz0iIiIpCisgICAgICAgIGVxKGRlY29kZV9oZWFkZXIoaC5lbmNvZGUoKSksCisgICAgICAgICAgIFsoJ0hlbGxvIFdvcmxkIScsIE5vbmUpLAorICAgICAgICAgICAgKCdceDFiJEIlTyVtITwlbyE8JWslSSEqXHgxYihCJywgJ2lzby0yMDIyLWpwJyksCisgICAgICAgICAgICAoJ0dyXHhmY1x4ZGYgR290dCEnLCAnaXNvLTg4NTktMScpXSkKKyAgICAgICAgbG9uZyA9ICd0ZXN0LWphIFx4YTRceGQ4XHhjNVx4ZWFceGI5XHhjNlx4YTRceGI1XHhhNFx4ZWNceGE0XHhiZlx4YTVceGUxXHhhMVx4YmNceGE1XHhlYlx4YTRceGNmXHhiYlx4Y2FceGIyXHhmMVx4YmNceGQ0XHhhNFx4Y2VceGJlXHhiNVx4YzdceGE3XHhhNFx4ZjJceGMyXHhkNFx4YTRceGMzXHhhNFx4YzZceGE0XHhhNFx4YTRceGRlXHhhNFx4YjknCisgICAgICAgIGggPSBIZWFkZXIobG9uZywgaiwgaGVhZGVyX25hbWU9IlN1YmplY3QiKQorICAgICAgICAjIHRlc3QgYSB2ZXJ5IGxvbmcgaGVhZGVyCisgICAgICAgIGVuYyA9IGguZW5jb2RlKCkKKyAgICAgICAgIyBUSzogc3BsaXR0aW5nIHBvaW50IG1heSBkaWZmZXIgYnkgY29kZWMgZGVzaWduIGFuZC9vciBIZWFkZXIgZW5jb2RpbmcKKyAgICAgICAgZXEoZW5jICwgIiIiXAorPT9pc28tMjAyMi1qcD9iP2RHVnpkQzFxWVNBYkpFSWtXRVZxT1VZa05TUnNKRDhsWVNFOEpXc2tUenRLR3loQz89CisgPT9pc28tMjAyMi1qcD9iP0d5UkNNbkU4VkNST1BqVkhKeVJ5UWxRa1F5UkdKQ1FrWGlRNUd5aEM/PSIiIikKKyAgICAgICAgIyBUSzogZnVsbCBkZWNvZGUgY29tcGFyaXNvbgorICAgICAgICBlcShoLl9fdW5pY29kZV9fKCkuZW5jb2RlKCdldWMtanAnKSwgbG9uZykKKworICAgIGRlZiB0ZXN0X3BheWxvYWRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIGpoZWxsbyA9ICdceGE1XHhjZlx4YTVceGVkXHhhMVx4YmNceGE1XHhlZlx4YTFceGJjXHhhNVx4ZWJceGE1XHhjOVx4YTFceGFhJworICAgICAgICBqY29kZSAgPSAnZXVjLWpwJworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKGpoZWxsbywgamNvZGUpCisgICAgICAgIHVzdHIgPSB1bmljb2RlKG1zZy5nZXRfcGF5bG9hZCgpLCBtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGpoZWxsbywgdXN0ci5lbmNvZGUoamNvZGUpKQorCisKKwwKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0RW1haWxBc2lhbkNvZGVjcykpCisgICAgcmV0dXJuIHN1aXRlCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0RW1haWxBc2lhbkNvZGVjcykKKworCisMCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3N1aXRlJykKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weSBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWMyZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CkBAIC0wLDAgKzEsMzA3OCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IGJhc2U2NAoraW1wb3J0IGRpZmZsaWIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworaW1wb3J0IGVtYWlsCisKK2Zyb20gZW1haWwuY2hhcnNldCBpbXBvcnQgQ2hhcnNldAorZnJvbSBlbWFpbC5oZWFkZXIgaW1wb3J0IEhlYWRlciwgZGVjb2RlX2hlYWRlciwgbWFrZV9oZWFkZXIKK2Zyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIsIEhlYWRlclBhcnNlcgorZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEdlbmVyYXRvciwgRGVjb2RlZEdlbmVyYXRvcgorZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCitmcm9tIGVtYWlsLm1pbWUuYXBwbGljYXRpb24gaW1wb3J0IE1JTUVBcHBsaWNhdGlvbgorZnJvbSBlbWFpbC5taW1lLmF1ZGlvIGltcG9ydCBNSU1FQXVkaW8KK2Zyb20gZW1haWwubWltZS50ZXh0IGltcG9ydCBNSU1FVGV4dAorZnJvbSBlbWFpbC5taW1lLmltYWdlIGltcG9ydCBNSU1FSW1hZ2UKK2Zyb20gZW1haWwubWltZS5iYXNlIGltcG9ydCBNSU1FQmFzZQorZnJvbSBlbWFpbC5taW1lLm1lc3NhZ2UgaW1wb3J0IE1JTUVNZXNzYWdlCitmcm9tIGVtYWlsLm1pbWUubXVsdGlwYXJ0IGltcG9ydCBNSU1FTXVsdGlwYXJ0Citmcm9tIGVtYWlsIGltcG9ydCB1dGlscworZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCitmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycworZnJvbSBlbWFpbCBpbXBvcnQgaXRlcmF0b3JzCitmcm9tIGVtYWlsIGltcG9ydCBiYXNlNjRtaW1lCitmcm9tIGVtYWlsIGltcG9ydCBxdW9wcmltaW1lCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGZpbmRmaWxlLCBydW5fdW5pdHRlc3QKK2Zyb20gZW1haWwudGVzdCBpbXBvcnQgX19maWxlX18gYXMgbGFuZG1hcmsKKworCitOTCA9ICdcbicKK0VNUFRZU1RSSU5HID0gJycKK1NQQUNFID0gJyAnCisKKworDAorZGVmIG9wZW5maWxlKGZpbGVuYW1lLCBtb2RlPSdyJyk6CisgICAgcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUobGFuZG1hcmspLCAnZGF0YScsIGZpbGVuYW1lKQorICAgIHJldHVybiBvcGVuKHBhdGgsIG1vZGUpCisKKworDAorIyBCYXNlIHRlc3QgY2xhc3MKK2NsYXNzIFRlc3RFbWFpbEJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBuZGlmZkFzc2VydEVxdWFsKHNlbGYsIGZpcnN0LCBzZWNvbmQpOgorICAgICAgICAiIiJMaWtlIGZhaWxVbmxlc3NFcXVhbCBleGNlcHQgdXNlIG5kaWZmIGZvciByZWFkYWJsZSBvdXRwdXQuIiIiCisgICAgICAgIGlmIGZpcnN0IDw+IHNlY29uZDoKKyAgICAgICAgICAgIHNmaXJzdCA9IHN0cihmaXJzdCkKKyAgICAgICAgICAgIHNzZWNvbmQgPSBzdHIoc2Vjb25kKQorICAgICAgICAgICAgZGlmZiA9IGRpZmZsaWIubmRpZmYoc2ZpcnN0LnNwbGl0bGluZXMoKSwgc3NlY29uZC5zcGxpdGxpbmVzKCkpCisgICAgICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIHByaW50ID4+IGZwLCBOTCwgTkwuam9pbihkaWZmKQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBmcC5nZXR2YWx1ZSgpCisKKyAgICBkZWYgX21zZ29iaihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZwID0gb3BlbmZpbGUoZmluZGZpbGUoZmlsZW5hbWUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIG1zZworCisKKwwKKyMgVGVzdCB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIE1lc3NhZ2UgY2xhc3MncyBBUEkKK2NsYXNzIFRlc3RNZXNzYWdlQVBJKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2dldF9hbGwoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yMC50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2FsbCgnY2MnKSwgWydjY2NAenp6Lm9yZycsICdkZGRAenp6Lm9yZycsICdlZWVAenp6Lm9yZyddKQorICAgICAgICBlcShtc2cuZ2V0X2FsbCgneHgnLCAnbi9hJyksICduL2EnKQorCisgICAgZGVmIHRlc3RfZ2V0c2V0X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCksIE5vbmUpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KCdpc28tODg1OS0xJykKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KGNoYXJzZXQpCisgICAgICAgIGVxKG1zZ1snbWltZS12ZXJzaW9uJ10sICcxLjAnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ2lzby04ODU5LTEnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1b3RlZC1wcmludGFibGUnKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAnaXNvLTg4NTktMScpCisgICAgICAgICMgUmVtb3ZlIHRoZSBjaGFyc2V0CisgICAgICAgIG1zZy5zZXRfY2hhcnNldChOb25lKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgTm9uZSkKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW4nKQorICAgICAgICAjIFRyeSBhZGRpbmcgYSBjaGFyc2V0IHdoZW4gdGhlcmUncyBhbHJlYWR5IE1JTUUgaGVhZGVycyBwcmVzZW50CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ01JTUUtVmVyc2lvbiddID0gJzIuMCcKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3gtd2VpcmQnCisgICAgICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJ3F1aW50ZWQtcHVudGFibGUnCisgICAgICAgIG1zZy5zZXRfY2hhcnNldChjaGFyc2V0KQorICAgICAgICBlcShtc2dbJ21pbWUtdmVyc2lvbiddLCAnMi4wJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQveC13ZWlyZDsgY2hhcnNldD0iaXNvLTg4NTktMSInKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1aW50ZWQtcHVudGFibGUnKQorCisgICAgZGVmIHRlc3Rfc2V0X2NoYXJzZXRfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KCd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorCisgICAgZGVmIHRlc3Rfc2V0X3BheWxvYWRfd2l0aF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ1RoaXMgaXMgYSBzdHJpbmcgcGF5bG9hZCcsIGNoYXJzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ2lzby04ODU5LTEnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NoYXJzZXRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wOC50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShjaGFyc2V0cywgW05vbmUsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgJ2lzby04ODU5LTInLCAna29pOC1yJ10pCisKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDkudHh0JykKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCdkaW5nYmF0JykKKyAgICAgICAgZXEoY2hhcnNldHMsIFsnZGluZ2JhdCcsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgJ2RpbmdiYXQnLAorICAgICAgICAgICAgICAgICAgICAgICdrb2k4LXInXSkKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xMi50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShjaGFyc2V0cywgW05vbmUsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgTm9uZSwgJ2lzby04ODU5LTInLAorICAgICAgICAgICAgICAgICAgICAgICdpc28tODg1OS0zJywgJ3VzLWFzY2lpJywgJ2tvaTgtciddKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBmaWxlbmFtZXMgPSBbcC5nZXRfZmlsZW5hbWUoKSBmb3IgcCBpbiBtc2cuZ2V0X3BheWxvYWQoKV0KKyAgICAgICAgZXEoZmlsZW5hbWVzLCBbJ21zZy50eHQnLCAnbXNnLnR4dCddKQorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA3LnR4dCcpCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfZmlsZW5hbWUoKSwgJ2Rpbmd1c2Zpc2guZ2lmJykKKworICAgIGRlZiB0ZXN0X2dldF9maWxlbmFtZV93aXRoX25hbWVfcGFyYW1ldGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180NC50eHQnKQorICAgICAgICBmaWxlbmFtZXMgPSBbcC5nZXRfZmlsZW5hbWUoKSBmb3IgcCBpbiBtc2cuZ2V0X3BheWxvYWQoKV0KKyAgICAgICAgZXEoZmlsZW5hbWVzLCBbJ21zZy50eHQnLCAnbXNnLnR4dCddKQorCisgICAgZGVmIHRlc3RfZ2V0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDcudHh0JykKKyAgICAgICAgIyBObyBxdW90ZXMhCisgICAgICAgIGVxKG1zZy5nZXRfYm91bmRhcnkoKSwgJ0JPVU5EQVJZJykKKworICAgIGRlZiB0ZXN0X3NldF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgVGhpcyBvbmUgaGFzIG5vIGV4aXN0aW5nIGJvdW5kYXJ5IHBhcmFtZXRlciwgYnV0IHRoZSBDb250ZW50LVR5cGU6CisgICAgICAgICMgaGVhZGVyIGFwcGVhcnMgZmlmdGguCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIG1zZy5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgaGVhZGVyLCB2YWx1ZSA9IG1zZy5pdGVtcygpWzRdCisgICAgICAgIGVxKGhlYWRlci5sb3dlcigpLCAnY29udGVudC10eXBlJykKKyAgICAgICAgZXEodmFsdWUsICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSI7IGJvdW5kYXJ5PSJCT1VOREFSWSInKQorICAgICAgICAjIFRoaXMgb25lIGhhcyBhIENvbnRlbnQtVHlwZTogaGVhZGVyLCB3aXRoIGEgYm91bmRhcnksIHN0dWNrIGluIHRoZQorICAgICAgICAjIG1pZGRsZSBvZiBpdHMgaGVhZGVycy4gIE1ha2Ugc3VyZSB0aGUgb3JkZXIgaXMgcHJlc2VydmVkOyBpdCBzaG91bGQKKyAgICAgICAgIyBiZSBmaWZ0aC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDQudHh0JykKKyAgICAgICAgbXNnLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBoZWFkZXIsIHZhbHVlID0gbXNnLml0ZW1zKClbNF0KKyAgICAgICAgZXEoaGVhZGVyLmxvd2VyKCksICdjb250ZW50LXR5cGUnKQorICAgICAgICBlcSh2YWx1ZSwgJ211bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIicpCisgICAgICAgICMgQW5kIHRoaXMgb25lIGhhcyBubyBDb250ZW50LVR5cGU6IGhlYWRlciBhdCBhbGwuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5IZWFkZXJQYXJzZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc2V0X2JvdW5kYXJ5LCAnQk9VTkRBUlknKQorCisgICAgZGVmIHRlc3RfZ2V0X2RlY29kZWRfcGF5bG9hZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzEwLnR4dCcpCisgICAgICAgICMgVGhlIG91dGVyIG1lc3NhZ2UgaXMgYSBtdWx0aXBhcnQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgTm9uZSkKKyAgICAgICAgIyBTdWJwYXJ0IDEgaXMgN2JpdCBlbmNvZGVkCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksCisgICAgICAgICAgICdUaGlzIGlzIGEgN2JpdCBlbmNvZGVkIG1lc3NhZ2UuXG4nKQorICAgICAgICAjIFN1YnBhcnQgMiBpcyBxdW9wcmkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDEpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1x4YTFUaGlzIGlzIGEgUXVvdGVkIFByaW50YWJsZSBlbmNvZGVkIG1lc3NhZ2UhXG4nKQorICAgICAgICAjIFN1YnBhcnQgMyBpcyBiYXNlNjQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDIpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaXMgYSBCYXNlNjQgZW5jb2RlZCBtZXNzYWdlLicpCisgICAgICAgICMgU3VicGFydCA0IGhhcyBubyBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBoZWFkZXIuCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgzKS5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksCisgICAgICAgICAgICdUaGlzIGhhcyBubyBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBoZWFkZXIuXG4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2RlY29kZWRfdXVfcGF5bG9hZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2JlZ2luIDY2NiAtXG4rOiY1TDsmXFxAPVZdUjsmMCBcbiBcbmVuZFxuJykKKyAgICAgICAgZm9yIGN0ZSBpbiAoJ3gtdXVlbmNvZGUnLCAndXVlbmNvZGUnLCAndXVlJywgJ3gtdXVlJyk6CisgICAgICAgICAgICBtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSA9IGN0ZQorICAgICAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgIyBOb3cgdHJ5IHNvbWUgYm9ndXMgZGF0YQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2ZvbycpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksICdmb28nKQorCisgICAgZGVmIHRlc3RfZGVjb2RlZF9nZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNy50eHQnKQorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMTcudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gRGVjb2RlZEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzLmdldHZhbHVlKCksIHRleHQpCisKKyAgICBkZWYgdGVzdF9fY29udGFpbnNfXyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snRnJvbSddID0gJ01lJworICAgICAgICBtc2dbJ3RvJ10gPSAnWW91JworICAgICAgICAjIENoZWNrIGZvciBjYXNlIGluc2Vuc2l0aXZpdHkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdmcm9tJyBpbiBtc2cpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnRnJvbScgaW4gbXNnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ0ZST00nIGluIG1zZykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCd0bycgaW4gbXNnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ1RvJyBpbiBtc2cpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnVE8nIGluIG1zZykKKworICAgIGRlZiB0ZXN0X2FzX3N0cmluZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGVxKHRleHQsIG1zZy5hc19zdHJpbmcoKSkKKyAgICAgICAgZnVsbHJlcHIgPSBzdHIobXNnKQorICAgICAgICBsaW5lcyA9IGZ1bGxyZXByLnNwbGl0KCdcbicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsaW5lc1swXS5zdGFydHN3aXRoKCdGcm9tICcpKQorICAgICAgICBlcSh0ZXh0LCBOTC5qb2luKGxpbmVzWzE6XSkpCisKKyAgICBkZWYgdGVzdF9iYWRfcGFyYW0oc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIkNvbnRlbnQtVHlwZTogYmxhcmc7IGJhejsgYm9vXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ2JheicpLCAnJykKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIkZyb206IGZvb1xuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9ib2d1c19maWxlbmFtZShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgIkNvbnRlbnQtRGlzcG9zaXRpb246IGJsYXJnOyBmaWxlbmFtZVxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksICcnKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19ib3VuZGFyeShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiRnJvbTogZm9vXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfYm91bmRhcnkoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2dldF9wYXJhbXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ1gtSGVhZGVyOiBmb289b25lOyBiYXI9dHdvOyBiYXo9dGhyZWVcbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKGhlYWRlcj0neC1oZWFkZXInKSwKKyAgICAgICAgICAgWygnZm9vJywgJ29uZScpLCAoJ2JhcicsICd0d28nKSwgKCdiYXonLCAndGhyZWUnKV0pCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnWC1IZWFkZXI6IGZvbzsgYmFyPW9uZTsgYmF6PXR3b1xuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoaGVhZGVyPSd4LWhlYWRlcicpLAorICAgICAgICAgICBbKCdmb28nLCAnJyksICgnYmFyJywgJ29uZScpLCAoJ2JheicsICd0d28nKV0pCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksIE5vbmUpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnWC1IZWFkZXI6IGZvbzsgYmFyPSJvbmUiOyBiYXo9dHdvXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyhoZWFkZXI9J3gtaGVhZGVyJyksCisgICAgICAgICAgIFsoJ2ZvbycsICcnKSwgKCdiYXInLCAnb25lJyksICgnYmF6JywgJ3R3bycpXSkKKworICAgIGRlZiB0ZXN0X2dldF9wYXJhbV9saWJlcmFsKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICdDb250ZW50LVR5cGU6IE11bHRpcGFydC9taXhlZDsgYm91bmRhcnkgPSAiQ1BJTVNTTVRQQzA2cDVmM3RHIicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdib3VuZGFyeScpLCAnQ1BJTVNTTVRQQzA2cDVmM3RHJykKKworICAgIGRlZiB0ZXN0X2dldF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAiWC1IZWFkZXI6IGZvbz1vbmU7IGJhcj10d287IGJhej10aHJlZVxuIikKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnYmFyJywgaGVhZGVyPSd4LWhlYWRlcicpLCAndHdvJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgncXV1eicsIGhlYWRlcj0neC1oZWFkZXInKSwgTm9uZSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgncXV1eicpLCBOb25lKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ1gtSGVhZGVyOiBmb287IGJhcj0ib25lIjsgYmF6PXR3b1xuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnZm9vJywgaGVhZGVyPSd4LWhlYWRlcicpLCAnJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnYmFyJywgaGVhZGVyPSd4LWhlYWRlcicpLCAnb25lJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnYmF6JywgaGVhZGVyPSd4LWhlYWRlcicpLCAndHdvJykKKyAgICAgICAgIyBYWFg6IFdlIGFyZSBub3QgUkZDLTIwNDUgY29tcGxpYW50ISAgV2UgY2Fubm90IHBhcnNlOgorICAgICAgICAjIG1zZ1siQ29udGVudC1UeXBlIl0gPSAndGV4dC9wbGFpbjsgd2VpcmQ9ImhleTsgZG9sbHk/IFt5b3VdIEAgPFxcImhvbWVcXCI+PyInCisgICAgICAgICMgbXNnLmdldF9wYXJhbSgid2VpcmQiKQorICAgICAgICAjIHlldC4KKworICAgIGRlZiB0ZXN0X2dldF9wYXJhbV9mdW5reV9jb250aW51YXRpb25fbGluZXMoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzIyLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDEpLmdldF9wYXJhbSgnbmFtZScpLCAnd2liYmxlLkpQRycpCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1fd2l0aF9zZW1pc19pbl9xdW90ZXMoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnQ29udGVudC1UeXBlOiBpbWFnZS9wanBlZzsgbmFtZT0iSmltJmFtcDsmYW1wO0ppbGwiXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ25hbWUnKSwgJ0ppbSZhbXA7JmFtcDtKaWxsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCduYW1lJywgdW5xdW90ZT1GYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyJKaW0mYW1wOyZhbXA7SmlsbCInKQorCisgICAgZGVmIHRlc3RfaGFzX2tleShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygnSGVhZGVyOiBleGlzdHMnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobXNnLmhhc19rZXkoJ2hlYWRlcicpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobXNnLmhhc19rZXkoJ0hlYWRlcicpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobXNnLmhhc19rZXkoJ0hFQURFUicpKQorICAgICAgICBzZWxmLmZhaWxJZihtc2cuaGFzX2tleSgnaGVhZGVyaScpKQorCisgICAgZGVmIHRlc3Rfc2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2NoYXJzZXQnLCAnaXNvLTIwMjItanAnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICdpc28tMjAyMi1qcCcpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2ltcG9ydGFuY2UnLCAnaGlnaCB2YWx1ZScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ltcG9ydGFuY2UnKSwgJ2hpZ2ggdmFsdWUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdpbXBvcnRhbmNlJywgdW5xdW90ZT1GYWxzZSksICciaGlnaCB2YWx1ZSInKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLCBbKCd0ZXh0L3BsYWluJywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjaGFyc2V0JywgJ2lzby0yMDIyLWpwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ltcG9ydGFuY2UnLCAnaGlnaCB2YWx1ZScpXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXModW5xdW90ZT1GYWxzZSksIFsoJ3RleHQvcGxhaW4nLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2NoYXJzZXQnLCAnImlzby0yMDIyLWpwIicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbXBvcnRhbmNlJywgJyJoaWdoIHZhbHVlIicpXSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnY2hhcnNldCcsICdpc28tOTk5OS14eCcsIGhlYWRlcj0nWC1KaW1teScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnLCBoZWFkZXI9J1gtSmltbXknKSwgJ2lzby05OTk5LXh4JykKKworICAgIGRlZiB0ZXN0X2RlbF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA1LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksCisgICAgICAgICAgIFsoJ211bHRpcGFydC9yZXBvcnQnLCAnJyksICgncmVwb3J0LXR5cGUnLCAnZGVsaXZlcnktc3RhdHVzJyksCisgICAgICAgICAgICAoJ2JvdW5kYXJ5JywgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKV0pCisgICAgICAgIG9sZF92YWwgPSBtc2cuZ2V0X3BhcmFtKCJyZXBvcnQtdHlwZSIpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oInJlcG9ydC10eXBlIikKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwKKyAgICAgICAgICAgWygnbXVsdGlwYXJ0L3JlcG9ydCcsICcnKSwKKyAgICAgICAgICAgICgnYm91bmRhcnknLCAnRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbScpXSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgicmVwb3J0LXR5cGUiLCBvbGRfdmFsKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLAorICAgICAgICAgICBbKCdtdWx0aXBhcnQvcmVwb3J0JywgJycpLAorICAgICAgICAgICAgKCdib3VuZGFyeScsICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJyksCisgICAgICAgICAgICAoJ3JlcG9ydC10eXBlJywgb2xkX3ZhbCldKQorCisgICAgZGVmIHRlc3RfZGVsX3BhcmFtX29uX290aGVyX2hlYWRlcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLCBmaWxlbmFtZT0nYnVkLmdpZicpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oJ2ZpbGVuYW1lJywgJ2NvbnRlbnQtZGlzcG9zaXRpb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1snY29udGVudC1kaXNwb3NpdGlvbiddLCAnYXR0YWNobWVudCcpCisKKyAgICBkZWYgdGVzdF9zZXRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtc2cuc2V0X3R5cGUsICd0ZXh0JykKKyAgICAgICAgbXNnLnNldF90eXBlKCd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdjaGFyc2V0JywgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisgICAgICAgIG1zZy5zZXRfdHlwZSgndGV4dC9odG1sJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvaHRtbDsgY2hhcnNldD0idXMtYXNjaWkiJykKKworICAgIGRlZiB0ZXN0X3NldF90eXBlX29uX290aGVyX2hlYWRlcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snWC1Db250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluJworICAgICAgICBtc2cuc2V0X3R5cGUoJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICdYLUNvbnRlbnQtVHlwZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWyd4LWNvbnRlbnQtdHlwZSddLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfbWlzc2luZyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfaW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMwLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX21pc3Npbmcoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ21lc3NhZ2UnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZnJvbV9tZXNzYWdlX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9tYWludHlwZSgpLCAnbWVzc2FnZScpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X21haW50eXBlKCksICdtZXNzYWdlJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9taXNzaW5nKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZnJvbV9tZXNzYWdlX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9zdWJ0eXBlKCksICdyZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9lcnJvcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnbm8tc2xhc2gtaW4tdGhpcy1zdHJpbmcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ25vLXNsYXNoLWluLXRoaXMtc3RyaW5nJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignRmlyc3QnLCAnT25lJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ1NlY29uZCcsICdUd28nKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignVGhpcmQnLCAnVGhyZWUnKQorICAgICAgICBlcShtc2cua2V5cygpLCBbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCddKQorICAgICAgICBlcShtc2cudmFsdWVzKCksIFsnT25lJywgJ1R3bycsICdUaHJlZSddKQorICAgICAgICBtc2cucmVwbGFjZV9oZWFkZXIoJ1NlY29uZCcsICdUd2VudHknKQorICAgICAgICBlcShtc2cua2V5cygpLCBbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCddKQorICAgICAgICBlcShtc2cudmFsdWVzKCksIFsnT25lJywgJ1R3ZW50eScsICdUaHJlZSddKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignRmlyc3QnLCAnRWxldmVuJykKKyAgICAgICAgbXNnLnJlcGxhY2VfaGVhZGVyKCdGaXJzdCcsICdPbmUgSHVuZHJlZCcpCisgICAgICAgIGVxKG1zZy5rZXlzKCksIFsnRmlyc3QnLCAnU2Vjb25kJywgJ1RoaXJkJywgJ0ZpcnN0J10pCisgICAgICAgIGVxKG1zZy52YWx1ZXMoKSwgWydPbmUgSHVuZHJlZCcsICdUd2VudHknLCAnVGhyZWUnLCAnRWxldmVuJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBtc2cucmVwbGFjZV9oZWFkZXIsICdGb3VydGgnLCAnTWlzc2luZycpCisKKyAgICBkZWYgdGVzdF9icm9rZW5fYmFzZTY0X3BheWxvYWQoc2VsZik6CisgICAgICAgIHggPSAnQXdEcDBQNy8veTZMd0tFQWNQYS82UT05JworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydjb250ZW50LXR5cGUnXSA9ICdhdWRpby94LW1pZGknCisgICAgICAgIG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddID0gJ2Jhc2U2NCcKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgeCkKKworCisMCisjIFRlc3QgdGhlIGVtYWlsLmVuY29kZXJzIG1vZHVsZQorY2xhc3MgVGVzdEVuY29kZXJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGVfZW1wdHlfcGF5bG9hZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfY3RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfY3RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBXaXRoIG5vIGV4cGxpY2l0IF9jaGFyc2V0IGl0cyB1cy1hc2NpaSwgYW5kIGFsbCBhcmUgNy1iaXQKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKyAgICAgICAgIyBTaW1pbGFyLCBidXQgd2l0aCA4LWJpdCBkYXRhCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyBceGY4IHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc4Yml0JykKKyAgICAgICAgIyBBbmQgbm93IHdpdGggYSBkaWZmZXJlbnQgY2hhcnNldAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gXHhmOCB3b3JsZCcsIF9jaGFyc2V0PSdpc28tODg1OS0xJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdxdW90ZWQtcHJpbnRhYmxlJykKKworCisMCisjIFRlc3QgbG9uZyBoZWFkZXIgd3JhcHBpbmcKK2NsYXNzIFRlc3RMb25nSGVhZGVycyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9zcGxpdF9sb25nX2NvbnRpbnVhdGlvbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiIiJcCitTdWJqZWN0OiBidWcgZGVtb25zdHJhdGlvbgorXHQxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorXHRtb3JlIHRleHQKKwordGVzdAorIiIiKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorU3ViamVjdDogYnVnIGRlbW9uc3RyYXRpb24KK1x0MTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKK1x0bW9yZSB0ZXh0CisKK3Rlc3QKKyIiIikKKworICAgIGRlZiB0ZXN0X2Fub3RoZXJfbG9uZ19hbG1vc3RfdW5zcGxpdHRhYmxlX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICIiIlwKK2J1ZyBkZW1vbnN0cmF0aW9uCitcdDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CitcdG1vcmUgdGV4dCIiIgorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitidWcgZGVtb25zdHJhdGlvbgorXHQxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorXHRtb3JlIHRleHQiIiIpCisgICAgICAgIGggPSBIZWFkZXIoaHN0cikKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorYnVnIGRlbW9uc3RyYXRpb24KKyAxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorIG1vcmUgdGV4dCIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfbm9uc3RyaW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBnID0gQ2hhcnNldCgiaXNvLTg4NTktMSIpCisgICAgICAgIGN6ID0gQ2hhcnNldCgiaXNvLTg4NTktMiIpCisgICAgICAgIHV0ZjggPSBDaGFyc2V0KCJ1dGYtOCIpCisgICAgICAgIGdfaGVhZCA9ICJEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kIGtvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhmY2RsXHhmY25kaXNjaGVuIFdhbmRnZW1ceGU0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuIGJlZlx4ZjZyZGVydC4gIgorICAgICAgICBjel9oZWFkID0gIkZpbmFuXHhlOG5pIG1ldHJvcG9sZSBzZSBocm91dGlseSBwb2QgdGxha2VtIGplamljaCBkXHhmOXZ0aXB1Li4gIgorICAgICAgICB1dGY4X2hlYWQgPSB1Ilx1NmI2M1x1NzhiYVx1MzA2Ylx1OGEwMFx1MzA0Nlx1MzA2OFx1N2ZmYlx1OGEzM1x1MzA2Zlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NGUwMFx1OTBlOFx1MzA2Zlx1MzBjOVx1MzBhNFx1MzBjNFx1OGE5ZVx1MzA2N1x1MzA1OVx1MzA0Y1x1MzAwMVx1MzA0Mlx1MzA2OFx1MzA2Zlx1MzA2N1x1MzA1Zlx1MzA4OVx1MzA4MVx1MzA2N1x1MzA1OVx1MzAwMlx1NWI5Zlx1OTY5Ylx1MzA2Ylx1MzA2Zlx1MzAwY1dlbm4gaXN0IGRhcyBOdW5zdHVjayBnaXQgdW5kIFNsb3Rlcm1leWVyPyBKYSEgQmVpaGVyaHVuZCBkYXMgT2RlciBkaWUgRmxpcHBlcndhbGR0IGdlcnNwdXQuXHUzMDBkXHUzMDY4XHU4YTAwXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIi5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgaCA9IEhlYWRlcihnX2hlYWQsIGcsIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgaC5hcHBlbmQoY3pfaGVhZCwgY3opCisgICAgICAgIGguYXBwZW5kKHV0ZjhfaGVhZCwgdXRmOCkKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gaAorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorU3ViamVjdDogPT9pc28tODg1OS0xP3E/RGllX01pZXRlcl90cmV0ZW5faGllcl9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZD89CisgPT9pc28tODg1OS0xP3E/ZXJiYW5kX2tvbWZvcnRhYmVsX2Rlbl9Lb3JyaWRvcl9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaT89CisgPT9pc28tODg1OS0xP3E/c2NoZW5fV2FuZGdlbT1FNGxkZW5fdm9yYmVpPTJDX2dlZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZz89CisgPT9pc28tODg1OS0xP3E/ZW5fYmVmPUY2cmRlcnQ9MkVfPz0gPT9pc28tODg1OS0yP3E/RmluYW49RThuaV9tZXQ/PQorID0/aXNvLTg4NTktMj9xP3JvcG9sZV9zZV9ocm91dGlseV9wb2RfdGxha2VtX2plamljaF9kPUY5dnRpcHU9MkU9MkVfPz0KKyA9P3V0Zi04P2I/NXEyajU2SzY0NEdyNktpQTQ0R0c0NEdvNTcrNzZLaXo0NEd2NDRHVjQ0S000NEdtNDRHRT89CisgPT91dGYtOD9iPzQ0Rys0NEdiNDRLVDQ0Q0M1TGlBNllPbzQ0R3Y0NE9KNDRLazQ0T0U2S3FlNDRHbjQ0R1o0NEdNNDRDQj89CisgPT91dGYtOD9iPzQ0R0M0NEdvNDRHdjQ0R240NEdmNDRLSjQ0S0I0NEduNDRHWjQ0Q0M1YTZmNlpxYjQ0R3I0NEd2NDRDTT89CisgPT91dGYtOD9xP1dlbm5faXN0X2Rhc19OdW5zdHVja19naXRfdW5kX1Nsb3Rlcm1leWVyPTNGX0phIV9CZWloZXJodW5kX2Rhcz89CisgPT91dGYtOD9iP0lFOWtaWElnWkdsbElFWnNhWEJ3WlhKM1lXeGtkQ0JuWlhKemNIVjBMdU9BamVPQnFPaW9nT09Cb3c9PT89CisgPT91dGYtOD9iPzQ0R200NEdFNDRHKzQ0R1o0NENDPz0KKworIiIiKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCis9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyX2Vpbl93ZXJkZW5fbWl0X2VpbmVtX0ZvZXJkPz0KKyA9P2lzby04ODU5LTE/cT9lcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yX2VudGxhbmc9MkNfYW5fcz1GQ2RsPUZDbmRpPz0KKyA9P2lzby04ODU5LTE/cT9zY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZ2VnZW5fZGllX3JvdGllcmVuZGVuX0tsaW5nPz0KKyA9P2lzby04ODU5LTE/cT9lbl9iZWY9RjZyZGVydD0yRV8/PSA9P2lzby04ODU5LTI/cT9GaW5hbj1FOG5pX21ldD89CisgPT9pc28tODg1OS0yP3E/cm9wb2xlX3NlX2hyb3V0aWx5X3BvZF90bGFrZW1famVqaWNoX2Q9Rjl2dGlwdT0yRT0yRV8/PQorID0/dXRmLTg/Yj81cTJqNTZLNjQ0R3I2S2lBNDRHRzQ0R281Nys3NktpejQ0R3Y0NEdWNDRLTTQ0R200NEdFPz0KKyA9P3V0Zi04P2I/NDRHKzQ0R2I0NEtUNDRDQzVMaUE2WU9vNDRHdjQ0T0o0NEtrNDRPRTZLcWU0NEduNDRHWjQ0R000NENCPz0KKyA9P3V0Zi04P2I/NDRHQzQ0R280NEd2NDRHbjQ0R2Y0NEtKNDRLQjQ0R240NEdaNDRDQzVhNmY2WnFiNDRHcjQ0R3Y0NENNPz0KKyA9P3V0Zi04P3E/V2Vubl9pc3RfZGFzX051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzPz0KKyA9P3V0Zi04P2I/SUU5a1pYSWdaR2xsSUVac2FYQndaWEozWVd4a2RDQm5aWEp6Y0hWMEx1T0FqZU9CcU9pb2dPT0Jvdz09Pz0KKyA9P3V0Zi04P2I/NDRHbTQ0R0U0NEcrNDRHWjQ0Q0M/PSIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyX2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcignd2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsgJworICAgICAgICAgICAgICAgICAgICdzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInLAorICAgICAgICAgICAgICAgICAgIGhlYWRlcl9uYW1lPSdYLUZvb2Jhci1TcG9pbmstRGVmcm9ibml0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJycnXAord2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsKKyBzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInJycpCisKKyAgICBkZWYgdGVzdF9sb25nX2hlYWRlcl9lbmNvZGVfd2l0aF90YWJfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCd3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOyAnCisgICAgICAgICAgICAgICAgICAgJ3Nwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicsCisgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnLAorICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnJydcCit3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworXHRzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInJycpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfc3BsaXR0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCcnKQorICAgICAgICAjIEl0J2QgYmUgZ3JlYXQgaWYgd2UgY291bGQgdXNlIGFkZF9oZWFkZXIoKSBoZXJlLCBidXQgdGhhdCBkb2Vzbid0CisgICAgICAgICMgZ3VhcmFudGVlIGFuIG9yZGVyIG9mIHRoZSBwYXJhbWV0ZXJzLgorICAgICAgICBtc2dbJ1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnXSA9ICgKKyAgICAgICAgICAgICd3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOyAnCisgICAgICAgICAgICAnc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiJykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdDogd2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsKK1x0c3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiCisKKycnJykKKworICAgIGRlZiB0ZXN0X25vX3NlbWlzX2hlYWRlcl9zcGxpdHRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snRnJvbSddID0gJ3Rlc3RAZG9tLmFpbicKKyAgICAgICAgbXNnWydSZWZlcmVuY2VzJ10gPSBTUEFDRS5qb2luKFsnPCVkQGRvbS5haW4+JyAlIGkgZm9yIGkgaW4gcmFuZ2UoMTApXSkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdUZXN0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK0Zyb206IHRlc3RAZG9tLmFpbgorUmVmZXJlbmNlczogPDBAZG9tLmFpbj4gPDFAZG9tLmFpbj4gPDJAZG9tLmFpbj4gPDNAZG9tLmFpbj4gPDRAZG9tLmFpbj4KK1x0PDVAZG9tLmFpbj4gPDZAZG9tLmFpbj4gPDdAZG9tLmFpbj4gPDhAZG9tLmFpbj4gPDlAZG9tLmFpbj4KKworVGVzdCIiIikKKworICAgIGRlZiB0ZXN0X25vX3NwbGl0X2xvbmdfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gJ1JlZmVyZW5jZXM6ICcgKyAneCcgKiA4MAorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitSZWZlcmVuY2VzOiB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIiIikKKworICAgIGRlZiB0ZXN0X3NwbGl0dGluZ19tdWx0aXBsZV9sb25nX2xpbmVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsgYnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsgZm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsgU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorXHRmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOyBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOyBmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OyBTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKKyIiIgorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOworXHRieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworXHRmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OworXHRTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKK1x0YnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsKK1x0Zm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsKK1x0U2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7CitcdGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7CitcdGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CitcdFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKSIiIikKKworICAgIGRlZiB0ZXN0X3NwbGl0dGluZ19maXJzdF9saW5lX29ubHlfaXNfbG9uZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICIiIlwKK2Zyb20gbW9kZW1jYWJsZTA5My4xMzktMjAxLTI0LnF1ZS5tYy52aWRlb3Ryb24uY2EgKFsyNC4yMDEuMTM5LjkzXSBoZWxvPWN0aHVsaHUuZ2VyZy5jYSkKK1x0Ynkga3Jvbm9zLm1lbXMtZXhjaGFuZ2Uub3JnIHdpdGggZXNtdHAgKEV4aW0gNC4wNSkKK1x0aWQgMTdrNGg1LTAwMDM0aS0wMAorXHRmb3IgdGVzdEBtZW1zLWV4Y2hhbmdlLm9yZzsgV2VkLCAyOCBBdWcgMjAwMiAxMToyNToyMCAtMDQwMCIiIgorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIG1heGxpbmVsZW49NzgsIGhlYWRlcl9uYW1lPSdSZWNlaXZlZCcsCisgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2Zyb20gbW9kZW1jYWJsZTA5My4xMzktMjAxLTI0LnF1ZS5tYy52aWRlb3Ryb24uY2EgKFsyNC4yMDEuMTM5LjkzXQorXHRoZWxvPWN0aHVsaHUuZ2VyZy5jYSkKK1x0Ynkga3Jvbm9zLm1lbXMtZXhjaGFuZ2Uub3JnIHdpdGggZXNtdHAgKEV4aW0gNC4wNSkKK1x0aWQgMTdrNGg1LTAwMDM0aS0wMAorXHRmb3IgdGVzdEBtZW1zLWV4Y2hhbmdlLm9yZzsgV2VkLCAyOCBBdWcgMjAwMiAxMToyNToyMCAtMDQwMCIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfOGJpdF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBoID0gSGVhZGVyKCdCcml0aXNjaGUgUmVnaWVydW5nIGdpYnQnLCAnaXNvLTg4NTktMScsCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgaC5hcHBlbmQoJ2dyXHhmY25lcyBMaWNodCBmXHhmY3IgT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGUnKQorICAgICAgICBtc2dbJ1N1YmplY3QnXSA9IGgKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitTdWJqZWN0OiA9P2lzby04ODU5LTE/cT9Ccml0aXNjaGVfUmVnaWVydW5nX2dpYnQ/PSA9P2lzby04ODU5LTE/cT9ncj1GQ25lcz89CisgPT9pc28tODg1OS0xP3E/X0xpY2h0X2Y9RkNyX09mZnNob3JlLVdpbmRrcmFmdHByb2pla3RlPz0KKworIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ184Yml0X2hlYWRlcl9ub19jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydSZXBseS1UbyddID0gJ0JyaXRpc2NoZSBSZWdpZXJ1bmcgZ2lidCBnclx4ZmNuZXMgTGljaHQgZlx4ZmNyIE9mZnNob3JlLVdpbmRrcmFmdHByb2pla3RlIDxhLXZlcnktbG9uZy1hZGRyZXNzQGV4YW1wbGUuY29tPicKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZXBseS1UbzogQnJpdGlzY2hlIFJlZ2llcnVuZyBnaWJ0IGdyXHhmY25lcyBMaWNodCBmXHhmY3IgT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGUgPGEtdmVyeS1sb25nLWFkZHJlc3NAZXhhbXBsZS5jb20+CisKKyIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfdG9faGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICB0byA9ICciU29tZW9uZSBUZXN0ICNBIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCJTb21lb25lIFRlc3QgI0IiIDxzb21lb25lQHVtaWNoLmVkdT4sICJTb21lb25lIFRlc3QgI0MiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwgIlNvbWVvbmUgVGVzdCAjRCIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+JworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydUbyddID0gdG8KKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygwKSwgJycnXAorVG86ICJTb21lb25lIFRlc3QgI0EiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LAorXHQiU29tZW9uZSBUZXN0ICNCIiA8c29tZW9uZUB1bWljaC5lZHU+LAorXHQiU29tZW9uZSBUZXN0ICNDIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sCitcdCJTb21lb25lIFRlc3QgI0QiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PgorCisnJycpCisKKyAgICBkZWYgdGVzdF9sb25nX2xpbmVfYWZ0ZXJfYXBwZW5kKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBzdHJpbmcgd2hpY2ggaGFzIGFsbW9zdCB0aGUgbGltaXQgb2YgaGVhZGVyIGxlbmd0aC4nCisgICAgICAgIGggPSBIZWFkZXIocykKKyAgICAgICAgaC5hcHBlbmQoJ0FkZCBhbm90aGVyIGxpbmUuJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorVGhpcyBpcyBhbiBleGFtcGxlIG9mIHN0cmluZyB3aGljaCBoYXMgYWxtb3N0IHRoZSBsaW1pdCBvZiBoZWFkZXIgbGVuZ3RoLgorIEFkZCBhbm90aGVyIGxpbmUuIiIiKQorCisgICAgZGVmIHRlc3Rfc2hvcnRlcl9saW5lX3dpdGhfYXBwZW5kKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1RoaXMgaXMgYSBzaG9ydGVyIGxpbmUuJworICAgICAgICBoID0gSGVhZGVyKHMpCisgICAgICAgIGguYXBwZW5kKCdBZGQgYW5vdGhlciBzZW50ZW5jZS4gKFN1cnByaXNlPyknKQorICAgICAgICBlcShoLmVuY29kZSgpLAorICAgICAgICAgICAnVGhpcyBpcyBhIHNob3J0ZXIgbGluZS4gQWRkIGFub3RoZXIgc2VudGVuY2UuIChTdXJwcmlzZT8pJykKKworICAgIGRlZiB0ZXN0X2xvbmdfZmllbGRfbmFtZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZm4gPSAnWC1WZXJ5LVZlcnktVmVyeS1Mb25nLUhlYWRlci1OYW1lJworICAgICAgICBncyA9ICJEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kIGtvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhmY2RsXHhmY25kaXNjaGVuIFdhbmRnZW1ceGU0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuIGJlZlx4ZjZyZGVydC4gIgorICAgICAgICBoID0gSGVhZGVyKGdzLCAnaXNvLTg4NTktMScsIGhlYWRlcl9uYW1lPWZuKQorICAgICAgICAjIEJBVzogdGhpcyBzZWVtcyBicm9rZW4gYmVjYXVzZSB0aGUgZmlyc3QgbGluZSBpcyB0b28gbG9uZworICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCis9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyXz89CisgPT9pc28tODg1OS0xP3E/ZWluX3dlcmRlbl9taXRfZWluZW1fRm9lcmRlcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yXz89CisgPT9pc28tODg1OS0xP3E/ZW50bGFuZz0yQ19hbl9zPUZDZGw9RkNuZGlzY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZz89CisgPT9pc28tODg1OS0xP3E/ZWdlbl9kaWVfcm90aWVyZW5kZW5fS2xpbmdlbl9iZWY9RjZyZGVydD0yRV8/PSIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfcmVjZWl2ZWRfaGVhZGVyKHNlbGYpOgorICAgICAgICBoID0gJ2Zyb20gRk9PLlRMRCAodml6d29ybGQuYWNsLmZvby50bGQgWzEyMy40NTIuNjc4LjldKSBieSBocm90aGdhci5sYS5tYXN0YWxlci5jb20gKHRtZGEtb2ZtaXBkKSB3aXRoIEVTTVRQOyBXZWQsIDA1IE1hciAyMDAzIDE4OjEwOjE4IC0wNzAwJworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydSZWNlaXZlZC0xJ10gPSBIZWFkZXIoaCwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIG1zZ1snUmVjZWl2ZWQtMiddID0gaAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmVjZWl2ZWQtMTogZnJvbSBGT08uVExEICh2aXp3b3JsZC5hY2wuZm9vLnRsZCBbMTIzLjQ1Mi42NzguOV0pIGJ5CitcdGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7CitcdFdlZCwgMDUgTWFyIDIwMDMgMTg6MTA6MTggLTA3MDAKK1JlY2VpdmVkLTI6IGZyb20gRk9PLlRMRCAodml6d29ybGQuYWNsLmZvby50bGQgWzEyMy40NTIuNjc4LjldKSBieQorXHRocm90aGdhci5sYS5tYXN0YWxlci5jb20gKHRtZGEtb2ZtaXBkKSB3aXRoIEVTTVRQOworXHRXZWQsIDA1IE1hciAyMDAzIDE4OjEwOjE4IC0wNzAwCisKKyIiIikKKworICAgIGRlZiB0ZXN0X3N0cmluZ19oZWFkZXJpbnN0X2VxKHNlbGYpOgorICAgICAgICBoID0gJzwxNTk3NS4xNzkwMS4yMDcyNDAuNDE0NjA0QHNnaWdyaXR6bWFubjEubWF0aGVtYXRpay50dS1tdWVuY2hlbi5kZT4gKERhdmlkIEJyZW1uZXJcJ3MgbWVzc2FnZSBvZiAiVGh1LCA2IE1hciAyMDAzIDEzOjU4OjIxICswMTAwIiknCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1JlY2VpdmVkLTEnXSA9IEhlYWRlcihoLCBoZWFkZXJfbmFtZT0nUmVjZWl2ZWQtMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBtc2dbJ1JlY2VpdmVkLTInXSA9IGgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuYXNfc3RyaW5nKCksICIiIlwKK1JlY2VpdmVkLTE6IDwxNTk3NS4xNzkwMS4yMDcyNDAuNDE0NjA0QHNnaWdyaXR6bWFubjEubWF0aGVtYXRpay50dS1tdWVuY2hlbi5kZT4KK1x0KERhdmlkIEJyZW1uZXIncyBtZXNzYWdlIG9mICJUaHUsIDYgTWFyIDIwMDMgMTM6NTg6MjEgKzAxMDAiKQorUmVjZWl2ZWQtMjogPDE1OTc1LjE3OTAxLjIwNzI0MC40MTQ2MDRAc2dpZ3JpdHptYW5uMS5tYXRoZW1hdGlrLnR1LW11ZW5jaGVuLmRlPgorXHQoRGF2aWQgQnJlbW5lcidzIG1lc3NhZ2Ugb2YgIlRodSwgNiBNYXIgMjAwMyAxMzo1ODoyMSArMDEwMCIpCisKKyIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfdW5icmVha2FibGVfbGluZXNfd2l0aF9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICB0ID0gIiIiXAorIGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3QkFNQUFBQ2xMT1MwQUFBQUdGQk1WRVVBQUFBa0hpSmVSVUljR0JpOQorIGxvY1FEUTR6SnlrRkJBWEpmV0RqQUFBQ1lVbEVRVlI0bkYyVFFZL2pJQXlGYzZseWRsRzV4OE55cDFZNjl3ajFQTjJJNWd6cCIiIgorICAgICAgICBtc2dbJ0ZhY2UtMSddID0gdAorICAgICAgICBtc2dbJ0ZhY2UtMiddID0gSGVhZGVyKHQsIGhlYWRlcl9uYW1lPSdGYWNlLTInKQorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK0ZhY2UtMTogaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdCQU1BQUFDbExPUzBBQUFBR0ZCTVZFVUFBQUFrSGlKZVJVSWNHQmk5CitcdGxvY1FEUTR6SnlrRkJBWEpmV0RqQUFBQ1lVbEVRVlI0bkYyVFFZL2pJQXlGYzZseWRsRzV4OE55cDFZNjl3ajFQTjJJNWd6cAorRmFjZS0yOiBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0JBTUFBQUNsTE9TMEFBQUFHRkJNVkVVQUFBQWtIaUplUlVJY0dCaTkKKyBsb2NRRFE0ekp5a0ZCQVhKZldEakFBQUNZVWxFUVZSNG5GMlRRWS9qSUF5RmM2bHlkbEc1eDhOeXAxWTY5d2oxUE4ySTVnenAKKworIiIiKQorCisgICAgZGVmIHRlc3RfYW5vdGhlcl9sb25nX211bHRpbGluZV9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnJydcCitSZWNlaXZlZDogZnJvbSBzaWltYWdlLmNvbSAoWzE3Mi4yNS4xLjNdKSBieSB6aW1hLnNpbGljb25pbWFnZS5jb20gd2l0aCBNaWNyb3NvZnQgU01UUFNWQyg1LjAuMjE5NS40OTA1KTsKK1x0V2VkLCAxNiBPY3QgMjAwMiAwNzo0MToxMSAtMDcwMCcnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgJycnXAorUmVjZWl2ZWQ6IGZyb20gc2lpbWFnZS5jb20gKFsxNzIuMjUuMS4zXSkgYnkgemltYS5zaWxpY29uaW1hZ2UuY29tIHdpdGgKK1x0TWljcm9zb2Z0IFNNVFBTVkMoNS4wLjIxOTUuNDkwNSk7IFdlZCwgMTYgT2N0IDIwMDIgMDc6NDE6MTEgLTA3MDAKKworJycnKQorCisgICAgZGVmIHRlc3RfbG9uZ19saW5lc193aXRoX2RpZmZlcmVudF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSAiIiJcCitMaXN0LVVuc3Vic2NyaWJlOiA8aHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vc3BhbWFzc2Fzc2luLXRhbGs+LAorICAgICAgICA8bWFpbHRvOnNwYW1hc3Nhc3Npbi10YWxrLXJlcXVlc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0P3N1YmplY3Q9dW5zdWJzY3JpYmU+IiIiCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0xpc3QnXSA9IGgKKyAgICAgICAgbXNnWydMaXN0J10gPSBIZWFkZXIoaCwgaGVhZGVyX25hbWU9J0xpc3QnKQorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK0xpc3Q6IExpc3QtVW5zdWJzY3JpYmU6IDxodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcGFtYXNzYXNzaW4tdGFsaz4sCitcdDxtYWlsdG86c3BhbWFzc2Fzc2luLXRhbGstcmVxdWVzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ/c3ViamVjdD11bnN1YnNjcmliZT4KK0xpc3Q6IExpc3QtVW5zdWJzY3JpYmU6IDxodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcGFtYXNzYXNzaW4tdGFsaz4sCisgPG1haWx0bzpzcGFtYXNzYXNzaW4tdGFsay1yZXF1ZXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD9zdWJqZWN0PXVuc3Vic2NyaWJlPgorCisiIiIpCisKKworDAorIyBUZXN0IG1hbmdsaW5nIG9mICJGcm9tICIgbGluZXMgaW4gdGhlIGJvZHkgb2YgYSBtZXNzYWdlCitjbGFzcyBUZXN0RnJvbU1hbmdsaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYubXNnWydGcm9tJ10gPSAnYWFhQGJiYi5vcmcnCisgICAgICAgIHNlbGYubXNnLnNldF9wYXlsb2FkKCIiIlwKK0Zyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworICAgIGRlZiB0ZXN0X21hbmdsZWRfZnJvbShzZWxmKToKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYW5nbGVfZnJvbV89VHJ1ZSkKKyAgICAgICAgZy5mbGF0dGVuKHNlbGYubXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgIiIiXAorRnJvbTogYWFhQGJiYi5vcmcKKworPkZyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworICAgIGRlZiB0ZXN0X2RvbnRfbWFuZ2xlX2Zyb20oc2VsZik6CisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWFuZ2xlX2Zyb21fPUZhbHNlKQorICAgICAgICBnLmZsYXR0ZW4oc2VsZi5tc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAiIiJcCitGcm9tOiBhYWFAYmJiLm9yZworCitGcm9tIHRoZSBkZXNrIG9mIEEuQS5BLjoKK0JsYWggYmxhaCBibGFoCisiIiIpCisKKworDAorIyBUZXN0IHRoZSBiYXNpYyBNSU1FQXVkaW8gY2xhc3MKK2NsYXNzIFRlc3RNSU1FQXVkaW8odW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgcGljayB1cCB0aGUgYXVkaW90ZXN0LmF1IHRoYXQgbGl2ZXMgaW4gZW1haWwvdGVzdC9kYXRhLgorICAgICAgICAjIEluIFB5dGhvbiwgdGhlcmUncyBhbiBhdWRpb3Rlc3QuYXUgbGl2aW5nIGluIExpYi90ZXN0IGJ1dCB0aGF0IGlzbid0CisgICAgICAgICMgaW5jbHVkZWQgaW4gc29tZSBiaW5hcnkgZGlzdHJvcyB0aGF0IGRvbid0IGluY2x1ZGUgdGhlIHRlc3QKKyAgICAgICAgIyBwYWNrYWdlLiAgVGhlIHRyYWlsaW5nIGVtcHR5IHN0cmluZyBvbiB0aGUgLmpvaW4oKSBpcyBzaWduaWZpY2FudAorICAgICAgICAjIHNpbmNlIGZpbmRmaWxlKCkgd2lsbCBkbyBhIGRpcm5hbWUoKS4KKyAgICAgICAgZGF0YWRpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUobGFuZG1hcmspLCAnZGF0YScsICcnKQorICAgICAgICBmcCA9IG9wZW4oZmluZGZpbGUoJ2F1ZGlvdGVzdC5hdScsIGRhdGFkaXIpLCAncmInKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9hdWRpb2RhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5fYXUgPSBNSU1FQXVkaW8oc2VsZi5fYXVkaW9kYXRhKQorCisgICAgZGVmIHRlc3RfZ3Vlc3NfbWlub3JfdHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9hdS5nZXRfY29udGVudF90eXBlKCksICdhdWRpby9iYXNpYycpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgcGF5bG9hZCA9IHNlbGYuX2F1LmdldF9wYXlsb2FkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlNjQuZGVjb2Rlc3RyaW5nKHBheWxvYWQpLCBzZWxmLl9hdWRpb2RhdGEpCisKKyAgICBkZWYgdGVzdF9jaGVja1NldE1pbm9yKHNlbGYpOgorICAgICAgICBhdSA9IE1JTUVBdWRpbyhzZWxmLl9hdWRpb2RhdGEsICdmaXNoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdS5nZXRfY29udGVudF90eXBlKCksICdhdWRpby9maXNoJykKKworICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgc2VsZi5fYXUuYWRkX2hlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nYXVkaW90ZXN0LmF1JykKKyAgICAgICAgZXEoc2VsZi5fYXVbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwKKyAgICAgICAgICAgJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJhdWRpb3Rlc3QuYXUiJykKKyAgICAgICAgZXEoc2VsZi5fYXUuZ2V0X3BhcmFtcyhoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwKKyAgICAgICAgICAgWygnYXR0YWNobWVudCcsICcnKSwgKCdmaWxlbmFtZScsICdhdWRpb3Rlc3QuYXUnKV0pCisgICAgICAgIGVxKHNlbGYuX2F1LmdldF9wYXJhbSgnZmlsZW5hbWUnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwKKyAgICAgICAgICAgJ2F1ZGlvdGVzdC5hdScpCisgICAgICAgIG1pc3NpbmcgPSBbXQorICAgICAgICBlcShzZWxmLl9hdS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwgJycpCisgICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2ZvbycsIGZhaWxvYmo9bWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSBpcyBtaXNzaW5nKQorICAgICAgICAjIFRyeSBzb21lIG1pc3Npbmcgc3R1ZmYKKyAgICAgICAgdW5sZXNzKHNlbGYuX2F1LmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZykgaXMgbWlzc2luZykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2F1LmdldF9wYXJhbSgnYXR0YWNobWVudCcsIG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdmb29iYXInKSBpcyBtaXNzaW5nKQorCisKKwwKKyMgVGVzdCB0aGUgYmFzaWMgTUlNRUltYWdlIGNsYXNzCitjbGFzcyBUZXN0TUlNRUltYWdlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ1B5QmFubmVyMDQ4LmdpZicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2ltZ2RhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5faW0gPSBNSU1FSW1hZ2Uoc2VsZi5faW1nZGF0YSkKKworICAgIGRlZiB0ZXN0X2d1ZXNzX21pbm9yX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5faW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZ2lmJykKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBwYXlsb2FkID0gc2VsZi5faW0uZ2V0X3BheWxvYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2U2NC5kZWNvZGVzdHJpbmcocGF5bG9hZCksIHNlbGYuX2ltZ2RhdGEpCisKKyAgICBkZWYgdGVzdF9jaGVja1NldE1pbm9yKHNlbGYpOgorICAgICAgICBpbSA9IE1JTUVJbWFnZShzZWxmLl9pbWdkYXRhLCAnZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZmlzaCcpCisKKyAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHNlbGYuX2ltLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKKyAgICAgICAgZXEoc2VsZi5faW1bJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwKKyAgICAgICAgICAgJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJkaW5ndXNmaXNoLmdpZiInKQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW1zKGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICBbKCdhdHRhY2htZW50JywgJycpLCAoJ2ZpbGVuYW1lJywgJ2Rpbmd1c2Zpc2guZ2lmJyldKQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW0oJ2ZpbGVuYW1lJywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgICdkaW5ndXNmaXNoLmdpZicpCisgICAgICAgIG1pc3NpbmcgPSBbXQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwgJycpCisgICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2ZvbycsIGZhaWxvYmo9bWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSBpcyBtaXNzaW5nKQorICAgICAgICAjIFRyeSBzb21lIG1pc3Npbmcgc3R1ZmYKKyAgICAgICAgdW5sZXNzKHNlbGYuX2ltLmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZykgaXMgbWlzc2luZykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2ltLmdldF9wYXJhbSgnYXR0YWNobWVudCcsIG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdmb29iYXInKSBpcyBtaXNzaW5nKQorCisKKwwKKyMgVGVzdCB0aGUgYmFzaWMgTUlNRUFwcGxpY2F0aW9uIGNsYXNzCitjbGFzcyBUZXN0TUlNRUFwcGxpY2F0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9oZWFkZXJzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRUFwcGxpY2F0aW9uKCdceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdiYXNlNjQnKQorCisgICAgZGVmIHRlc3RfYm9keShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGJ5dGVzID0gJ1x4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZicKKyAgICAgICAgbXNnID0gTUlNRUFwcGxpY2F0aW9uKGJ5dGVzKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJyt2djgvZjcvJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgYnl0ZXMpCisKKworDAorIyBUZXN0IHRoZSBiYXNpYyBNSU1FVGV4dCBjbGFzcworY2xhc3MgVGVzdE1JTUVUZXh0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX21zZyA9IE1JTUVUZXh0KCdoZWxsbyB0aGVyZScpCisKKyAgICBkZWYgdGVzdF90eXBlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ3VzLWFzY2lpJykKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIHVubGVzcyhzZWxmLl9tc2cuZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQorICAgICAgICB1bmxlc3Moc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcsIG1pc3NpbmcsIGhlYWRlcj0nZm9vYmFyJykKKyAgICAgICAgICAgICAgIGlzIG1pc3NpbmcpCisKKyAgICBkZWYgdGVzdF9wYXlsb2FkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX21zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG8gdGhlcmUnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHNlbGYuX21zZy5pc19tdWx0aXBhcnQoKSkKKworICAgIGRlZiB0ZXN0X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gdGhlcmUnLCBfY2hhcnNldD0ndXMtYXNjaWknKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiJykKKworCisMCisjIFRlc3QgY29tcGxpY2F0ZWQgbXVsdGlwYXJ0LyogbWVzc2FnZXMKK2NsYXNzIFRlc3RNdWx0aXBhcnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW5maWxlKCdQeUJhbm5lcjA0OC5naWYnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgY29udGFpbmVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcsIGJvdW5kYXJ5PSdCT1VOREFSWScpCisgICAgICAgIGltYWdlID0gTUlNRUltYWdlKGRhdGEsIG5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKKyAgICAgICAgaW1hZ2UuYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBpbnRybyA9IE1JTUVUZXh0KCcnJ1wKK0hpIHRoZXJlLAorCitUaGlzIGlzIHRoZSBkaW5ndXMgZmlzaC4KKycnJykKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChpbnRybykKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChpbWFnZSkKKyAgICAgICAgY29udGFpbmVyWydGcm9tJ10gPSAnQmFycnkgPGJhcnJ5QGRpZ2ljb29sLmNvbT4nCisgICAgICAgIGNvbnRhaW5lclsnVG8nXSA9ICdEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPicKKyAgICAgICAgY29udGFpbmVyWydTdWJqZWN0J10gPSAnSGVyZSBpcyB5b3VyIGRpbmd1cyBmaXNoJworCisgICAgICAgIG5vdyA9IDk4NzgwOTcwMi41NDg0ODU5OQorICAgICAgICB0aW1ldHVwbGUgPSB0aW1lLmxvY2FsdGltZShub3cpCisgICAgICAgIGlmIHRpbWV0dXBsZVstMV0gPT0gMDoKKyAgICAgICAgICAgIHR6c2VjcyA9IHRpbWUudGltZXpvbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR6c2VjcyA9IHRpbWUuYWx0em9uZQorICAgICAgICBpZiB0enNlY3MgPiAwOgorICAgICAgICAgICAgc2lnbiA9ICctJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2lnbiA9ICcrJworICAgICAgICB0em9mZnNldCA9ICcgJXMlMDRkJyAlIChzaWduLCB0enNlY3MgLyAzNikKKyAgICAgICAgY29udGFpbmVyWydEYXRlJ10gPSB0aW1lLnN0cmZ0aW1lKAorICAgICAgICAgICAgJyVhLCAlZCAlYiAlWSAlSDolTTolUycsCisgICAgICAgICAgICB0aW1lLmxvY2FsdGltZShub3cpKSArIHR6b2Zmc2V0CisgICAgICAgIHNlbGYuX21zZyA9IGNvbnRhaW5lcgorICAgICAgICBzZWxmLl9pbSA9IGltYWdlCisgICAgICAgIHNlbGYuX3R4dCA9IGludHJvCisKKyAgICBkZWYgdGVzdF9oaWVyYXJjaHkoc2VsZik6CisgICAgICAgICMgY29udmVuaWVuY2UKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICAjIHRlc3RzCisgICAgICAgIG0gPSBzZWxmLl9tc2cKKyAgICAgICAgdW5sZXNzKG0uaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIGVxKG0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKKyAgICAgICAgZXEobGVuKG0uZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIHJhaXNlcyhJbmRleEVycm9yLCBtLmdldF9wYXlsb2FkLCAyKQorICAgICAgICBtMCA9IG0uZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgbTEgPSBtLmdldF9wYXlsb2FkKDEpCisgICAgICAgIHVubGVzcyhtMCBpcyBzZWxmLl90eHQpCisgICAgICAgIHVubGVzcyhtMSBpcyBzZWxmLl9pbSkKKyAgICAgICAgZXEobS5nZXRfcGF5bG9hZCgpLCBbbTAsIG0xXSkKKyAgICAgICAgdW5sZXNzKG5vdCBtMC5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgdW5sZXNzKG5vdCBtMS5pc19tdWx0aXBhcnQoKSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X211bHRpcGFydF9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICB0ZXh0ID0gIiIiXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCisKKy0tQk9VTkRBUlkKKworCistLUJPVU5EQVJZLS0KKyIiIgorICAgICAgICBtc2cgPSBQYXJzZXIoKS5wYXJzZXN0cih0ZXh0KQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwodGV4dCwgbXNnLmFzX3N0cmluZygpKQorCisgICAgZGVmIHRlc3Rfbm9fcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9ub25lX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCisKKy0tQk9VTkRBUlktLScnJykKKworICAgIGRlZiB0ZXN0X25vX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5wcmVhbWJsZSA9ICcnCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCisKKy0tQk9VTkRBUlkKKworLS1CT1VOREFSWS0tCisnJycpCisKKyAgICBkZWYgdGVzdF9vbmVfcGFydF9pbl9hX211bHRpcGFydChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX2VtcHR5X3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIucHJlYW1ibGUgPSAnJworICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbm9uZV9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnByZWFtYmxlID0gTm9uZQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0nJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25vbmVfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5lcGlsb2d1ZSA9IE5vbmUKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tJycnKQorCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9lbXB0eV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tCisnJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25sX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSAnXG4nCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLQorCisnJycpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2V4dGVybmFsX2JvZHkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zNi50eHQnKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBtc2cxID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKG1zZzEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJykKKyAgICAgICAgZXEobGVuKG1zZzEuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZzEuZ2V0X3BheWxvYWQoKToKKyAgICAgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9leHRlcm5hbC1ib2R5JykKKyAgICAgICAgICAgIGVxKGxlbihzdWJwYXJ0LmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICAgICAgc3Vic3VicGFydCA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgICAgIGVxKHN1YnN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kb3VibGVfYm91bmRhcnkoc2VsZik6CisgICAgICAgICMgbXNnXzM3LnR4dCBpcyBhIG11bHRpcGFydCB0aGF0IGNvbnRhaW5zIHR3byBkYXNoLWJvdW5kYXJ5J3MgaW4gYQorICAgICAgICAjIHJvdy4gIE91ciBpbnRlcnByZXRhdGlvbiBvZiBSRkMgMjA0NiBjYWxscyBmb3IgaWdub3JpbmcgdGhlIHNlY29uZAorICAgICAgICAjIGFuZCBzdWJzZXF1ZW50IGJvdW5kYXJpZXMuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM3LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKKworICAgIGRlZiB0ZXN0X25lc3RlZF9pbm5lcl9jb250YWluc19vdXRlcl9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtc2dfMzgudHh0IGhhcyBhbiBpbm5lciBwYXJ0IHRoYXQgY29udGFpbnMgb3V0ZXIgYm91bmRhcmllcy4gIE15CisgICAgICAgICMgaW50ZXJwcmV0YXRpb24gb2YgUkZDIDIwNDYgKGJhc2VkIG9uIHNlY3Rpb25zIDUuMSBhbmQgNS4xLjIpIHNheQorICAgICAgICAjIHRoZXNlIGFyZSBpbGxlZ2FsIGFuZCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdW50ZXJtaW5hdGVkIGlubmVyCisgICAgICAgICMgcGFydHMuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM4LnR4dCcpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgaXRlcmF0b3JzLl9zdHJ1Y3R1cmUobXNnLCBzZnApCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCittdWx0aXBhcnQvbWl4ZWQKKyAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgbXVsdGlwYXJ0L2FsdGVybmF0aXZlCisgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9wbGFpbgorIiIiKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX3dpdGhfc2FtZV9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtc2cgMzkudHh0IGlzIHNpbWlsYXJseSBldmlsIGluIHRoYXQgaXQncyBnb3QgaW5uZXIgcGFydHMgdGhhdCB1c2UKKyAgICAgICAgIyB0aGUgc2FtZSBib3VuZGFyeSBhcyBvdXRlciBwYXJ0cy4gIEFnYWluLCBJIGJlbGlldmUgdGhlIHdheSB0aGlzIGlzCisgICAgICAgICMgcGFyc2VkIGlzIGNsb3Nlc3QgdG8gdGhlIHNwaXJpdCBvZiBSRkMgMjA0NgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zOS50eHQnKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGl0ZXJhdG9ycy5fc3RydWN0dXJlKG1zZywgc2ZwKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorbXVsdGlwYXJ0L21peGVkCisgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgIG11bHRpcGFydC9hbHRlcm5hdGl2ZQorICAgICAgICBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KKyAgICAgICAgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCisgICAgdGV4dC9wbGFpbgorIiIiKQorCisgICAgZGVmIHRlc3RfYm91bmRhcnlfaW5fbm9uX211bHRpcGFydChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDAudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuYXNfc3RyaW5nKCksICcnJ1wKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgYm91bmRhcnk9Ii0tOTYxMjg0MjM2NTUyNTIyMjY5IgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5CitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdCaXQKKworPGh0bWw+PC9odG1sPgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5LS0KKycnJykKKworICAgIGRlZiB0ZXN0X2JvdW5kYXJ5X3dpdGhfbGVhZGluZ19zcGFjZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoJycnXAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iICAgIFhYWFgiCisKKy0tICAgIFhYWFgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCisKKy0tICAgIFhYWFgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCistLSAgICBYWFhYLS0KKycnJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgZXEobXNnLmdldF9ib3VuZGFyeSgpLCAnICAgIFhYWFgnKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorCisgICAgZGVmIHRlc3RfYm91bmRhcnlfd2l0aG91dF90cmFpbGluZ19uZXdsaW5lKHNlbGYpOgorICAgICAgICBtID0gUGFyc2VyKCkucGFyc2VzdHIoIiIiXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSI9PT09PT09PT09PT09PT0wMDEyMzk0MTY0PT0iCitNSU1FLVZlcnNpb246IDEuMAorCistLT09PT09PT09PT09PT09PTAwMTIzOTQxNjQ9PQorQ29udGVudC1UeXBlOiBpbWFnZS9maWxlMS5qcGcKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWVhOa1pnPT0KKy0tPT09PT09PT09PT09PT09MDAxMjM5NDE2ND09LS0iIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG0uZ2V0X3BheWxvYWQoMCkuZ2V0X3BheWxvYWQoKSwgJ1lYTmtaZz09JykKKworCisMCisjIFRlc3Qgc29tZSBiYWRseSBmb3JtYXR0ZWQgbWVzc2FnZXMKK2NsYXNzIFRlc3ROb25Db25mb3JtYW50KFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X3BhcnNlX21pc3NpbmdfbWlub3JfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE0LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKworICAgIGRlZiB0ZXN0X3NhbWVfYm91bmRhcnlfaW5uZXJfb3V0ZXIoc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNS50eHQnKQorICAgICAgICAjIFhYWCBXZSBjYW4gcHJvYmFibHkgZXZlbnR1YWxseSBkbyBiZXR0ZXIKKyAgICAgICAgaW5uZXIgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgdW5sZXNzKGhhc2F0dHIoaW5uZXIsICdkZWZlY3RzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGlubmVyLmRlZmVjdHMpLCAxKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShpbm5lci5kZWZlY3RzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KSkKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9ub19ib3VuZGFyeShzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI1LnR4dCcpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2cuZGVmZWN0cyksIDIpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLCBlcnJvcnMuTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3QpKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9jb250ZW50X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgICMgUkZDIDIwNDUsICQ1LjIgc2F5cyBpbnZhbGlkIHlpZWxkcyB0ZXh0L3BsYWluCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAndGV4dCcKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICAjIENsZWFyIHRoZSBvbGQgdmFsdWUgYW5kIHRyeSBzb21ldGhpbmcgL3JlYWxseS8gaW52YWxpZAorICAgICAgICBkZWwgbXNnWydjb250ZW50LXR5cGUnXQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ2ZvbycKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICAjIFN0aWxsLCBtYWtlIHN1cmUgdGhhdCB0aGUgbWVzc2FnZSBpcyBpZGVtcG90ZW50bHkgZ2VuZXJhdGVkCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IocykKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgbmVxKHMuZ2V0dmFsdWUoKSwgJ0NvbnRlbnQtVHlwZTogZm9vXG5cbicpCisKKyAgICBkZWYgdGVzdF9ub19zdGFydF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzEudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICIiIlwKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK21lc3NhZ2UgMgorCistLUJPVU5EQVJZLS0KKyIiIikKKworICAgIGRlZiB0ZXN0X25vX3NlcGFyYXRpbmdfYmxhbmtfbGluZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzUudHh0JykKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IGhlcmUncyBzb21ldGhpbmcgaW50ZXJlc3RpbmcKKworY291bnRlciB0byBSRkMgMjgyMiwgdGhlcmUncyBubyBzZXBhcmF0aW5nIG5ld2xpbmUgaGVyZQorIiIiKQorCisgICAgZGVmIHRlc3RfbHlpbmdfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDEudHh0JykKKyAgICAgICAgdW5sZXNzKGhhc2F0dHIobXNnLCAnZGVmZWN0cycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2cuZGVmZWN0cyksIDIpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLCBlcnJvcnMuTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3QpKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19zdGFydF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgb3V0ZXIgPSBzZWxmLl9tc2dvYmooJ21zZ180Mi50eHQnKQorICAgICAgICAjIFRoZSBtZXNzYWdlIHN0cnVjdHVyZSBpczoKKyAgICAgICAgIworICAgICAgICAjIG11bHRpcGFydC9taXhlZAorICAgICAgICAjICAgIHRleHQvcGxhaW4KKyAgICAgICAgIyAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAjICAgICAgICBtdWx0aXBhcnQvbWl4ZWQgWypdCisgICAgICAgICMKKyAgICAgICAgIyBbKl0gVGhpcyBtZXNzYWdlIGlzIG1pc3NpbmcgaXRzIHN0YXJ0IGJvdW5kYXJ5CisgICAgICAgIGJhZCA9IG91dGVyLmdldF9wYXlsb2FkKDEpLmdldF9wYXlsb2FkKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJhZC5kZWZlY3RzKSwgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoYmFkLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpKQorCisKKwwKKyMgVGVzdCBSRkMgMjA0NyBoZWFkZXIgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitjbGFzcyBUZXN0UkZDMjA0Nyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmZjMjA0N19tdWx0aWxpbmUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gIiIiUmU6ID0/bWFjLWljZWxhbmQ/cT9yPThBa3NtPTlBcmc9OENzPz0gYmF6CisgZm9vIGJhciA9P21hYy1pY2VsYW5kP3E/cj04QWtzbT05QXJnPThDcz89IiIiCisgICAgICAgIGRoID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShkaCwgWworICAgICAgICAgICAgKCdSZTonLCBOb25lKSwKKyAgICAgICAgICAgICgnclx4OGFrc21ceDlhcmdceDhjcycsICdtYWMtaWNlbGFuZCcpLAorICAgICAgICAgICAgKCdiYXogZm9vIGJhcicsIE5vbmUpLAorICAgICAgICAgICAgKCdyXHg4YWtzbVx4OWFyZ1x4OGNzJywgJ21hYy1pY2VsYW5kJyldKQorICAgICAgICBlcShzdHIobWFrZV9oZWFkZXIoZGgpKSwKKyAgICAgICAgICAgIiIiUmU6ID0/bWFjLWljZWxhbmQ/cT9yPThBa3NtPTlBcmc9OENzPz0gYmF6IGZvbyBiYXIKKyA9P21hYy1pY2VsYW5kP3E/cj04QWtzbT05QXJnPThDcz89IiIiKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9lYXRlcl91bmljb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICc9P0lTTy04ODU5LTE/UT9BbmRyPUU5Pz0gUGlyYXJkIDxwaXJhcmRAZG9tLmFpbj4nCisgICAgICAgIGRoID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShkaCwgWygnQW5kclx4ZTknLCAnaXNvLTg4NTktMScpLCAoJ1BpcmFyZCA8cGlyYXJkQGRvbS5haW4+JywgTm9uZSldKQorICAgICAgICBodSA9IHVuaWNvZGUobWFrZV9oZWFkZXIoZGgpKS5lbmNvZGUoJ2xhdGluLTEnKQorICAgICAgICBlcShodSwgJ0FuZHJceGU5IFBpcmFyZCA8cGlyYXJkQGRvbS5haW4+JykKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfZWF0ZXJfdW5pY29kZV8yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICdUaGUgPT9pc28tODg1OS0xP2I/Y1hWcFkyc2dZbkp2ZDI0Z1ptOTQ/PSBqdW1wZWQgb3ZlciB0aGUgPT9pc28tODg1OS0xP2I/YkdGNmVTQmtiMmM9Pz0nCisgICAgICAgIGRoID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShkaCwgWygnVGhlJywgTm9uZSksICgncXVpY2sgYnJvd24gZm94JywgJ2lzby04ODU5LTEnKSwKKyAgICAgICAgICAgICAgICAoJ2p1bXBlZCBvdmVyIHRoZScsIE5vbmUpLCAoJ2xhenkgZG9nJywgJ2lzby04ODU5LTEnKV0pCisgICAgICAgIGh1ID0gbWFrZV9oZWFkZXIoZGgpLl9fdW5pY29kZV9fKCkKKyAgICAgICAgZXEoaHUsIHUnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cnKQorCisKKwwKKyMgVGVzdCB0aGUgTUlNRU1lc3NhZ2UgY2xhc3MKK2NsYXNzIFRlc3RNSU1FTWVzc2FnZShUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18xMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl90ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF90eXBlX2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIE1JTUVNZXNzYWdlLCAnYSBwbGFpbiBzdHJpbmcnKQorCisgICAgZGVmIHRlc3RfdmFsaWRfYXJndW1lbnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgc3ViamVjdCA9ICdBIHN1Yi1tZXNzYWdlJworICAgICAgICBtID0gTWVzc2FnZSgpCisgICAgICAgIG1bJ1N1YmplY3QnXSA9IHN1YmplY3QKKyAgICAgICAgciA9IE1JTUVNZXNzYWdlKG0pCisgICAgICAgIGVxKHIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gci5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1YnBhcnQgPSBwYXlsb2FkWzBdCisgICAgICAgIHVubGVzcyhzdWJwYXJ0IGlzIG0pCisgICAgICAgIGVxKHN1YnBhcnRbJ3N1YmplY3QnXSwgc3ViamVjdCkKKworICAgIGRlZiB0ZXN0X2JhZF9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cxID0gTWVzc2FnZSgpCisgICAgICAgIG1zZzFbJ1N1YmplY3QnXSA9ICdzdWJwYXJ0IDEnCisgICAgICAgIG1zZzIgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnMlsnU3ViamVjdCddID0gJ3N1YnBhcnQgMicKKyAgICAgICAgciA9IE1JTUVNZXNzYWdlKG1zZzEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5NdWx0aXBhcnRDb252ZXJzaW9uRXJyb3IsIHIuYXR0YWNoLCBtc2cyKQorCisgICAgZGVmIHRlc3RfZ2VuZXJhdGUoc2VsZik6CisgICAgICAgICMgRmlyc3QgY3JhZnQgdGhlIG1lc3NhZ2UgdG8gYmUgZW5jYXBzdWxhdGVkCisgICAgICAgIG0gPSBNZXNzYWdlKCkKKyAgICAgICAgbVsnU3ViamVjdCddID0gJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnCisgICAgICAgIG0uc2V0X3BheWxvYWQoJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQorICAgICAgICByID0gTUlNRU1lc3NhZ2UobSkKKyAgICAgICAgclsnU3ViamVjdCddID0gJ1RoZSBlbmNsb3NpbmcgbWVzc2FnZScKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4ocikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICIiIlwKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBUaGUgZW5jbG9zaW5nIG1lc3NhZ2UKKworU3ViamVjdDogQW4gZW5jbG9zZWQgbWVzc2FnZQorCitIZXJlIGlzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLgorIiIiKQorCisgICAgZGVmIHRlc3RfcGFyc2VfbWVzc2FnZV9yZmM4MjIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTEudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1Ym1zZyA9IHBheWxvYWRbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc3VibXNnLCBNZXNzYWdlKSkKKyAgICAgICAgZXEoc3VibXNnWydzdWJqZWN0J10sICdBbiBlbmNsb3NlZCBtZXNzYWdlJykKKyAgICAgICAgZXEoc3VibXNnLmdldF9wYXlsb2FkKCksICdIZXJlIGlzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLlxuJykKKworICAgIGRlZiB0ZXN0X2RzbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICAjIG1zZyAxNiBpcyBhIERlbGl2ZXJ5IFN0YXR1cyBOb3RpZmljYXRpb24sIHNlZSBSRkMgMTg5NAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNi50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCisgICAgICAgIHVubGVzcyhtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisgICAgICAgICMgU3VicGFydCAxIGlzIGEgdGV4dC9wbGFpbiwgaHVtYW4gcmVhZGFibGUgc2VjdGlvbgorICAgICAgICBzdWJwYXJ0ID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSwgIiIiXAorVGhpcyByZXBvcnQgcmVsYXRlcyB0byBhIG1lc3NhZ2UgeW91IHNlbnQgd2l0aCB0aGUgZm9sbG93aW5nIGhlYWRlciBmaWVsZHM6CisKKyAgTWVzc2FnZS1pZDogPDAwMjAwMWMxNDRhNiQ4NzUyZTA2MCQ1NjEwNDU4NkBveHkuZWR1PgorICBEYXRlOiBTdW4sIDIzIFNlcCAyMDAxIDIwOjEwOjU1IC0wNzAwCisgIEZyb206ICJJYW4gVC4gSGVucnkiIDxoZW5yeWlAb3h5LmVkdT4KKyAgVG86IFNvQ2FsIFJhdmVzIDxzY3JAc29jYWwtcmF2ZXMub3JnPgorICBTdWJqZWN0OiBbc2NyXSB5ZWFoIGZvciBJYW5zISEKKworWW91ciBtZXNzYWdlIGNhbm5vdCBiZSBkZWxpdmVyZWQgdG8gdGhlIGZvbGxvd2luZyByZWNpcGllbnRzOgorCisgIFJlY2lwaWVudCBhZGRyZXNzOiBqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUKKyAgUmVhc29uOiByZWNpcGllbnQgcmVhY2hlZCBkaXNrIHF1b3RhCisKKyIiIikKKyAgICAgICAgIyBTdWJwYXJ0IDIgY29udGFpbnMgdGhlIG1hY2hpbmUgcGFyc2FibGUgRFNOIGluZm9ybWF0aW9uLiAgSXQKKyAgICAgICAgIyBjb25zaXN0cyBvZiB0d28gYmxvY2tzIG9mIGhlYWRlcnMsIHJlcHJlc2VudGVkIGJ5IHR3byBuZXN0ZWQgTWVzc2FnZQorICAgICAgICAjIG9iamVjdHMuCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cycpCisgICAgICAgIGVxKGxlbihzdWJwYXJ0LmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIHNob3VsZCB0cmVhdCBlYWNoIGJsb2NrIGFzIGEgYnVuY2ggb2YKKyAgICAgICAgIyBoZWFkZXJzLCBpLmUuIGEgYnVuY2ggb2YgTWVzc2FnZSBvYmplY3RzLgorICAgICAgICBkc24xID0gc3VicGFydC5nZXRfcGF5bG9hZCgwKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShkc24xLCBNZXNzYWdlKSkKKyAgICAgICAgZXEoZHNuMVsnb3JpZ2luYWwtZW52ZWxvcGUtaWQnXSwgJzBHSzUwMEI0SEQwODg4QGNvdWdhci5ub2MudWNsYS5lZHUnKQorICAgICAgICBlcShkc24xLmdldF9wYXJhbSgnZG5zJywgaGVhZGVyPSdyZXBvcnRpbmctbXRhJyksICcnKQorICAgICAgICAjIFRyeSBhIG1pc3Npbmcgb25lIDx3aW5rPgorICAgICAgICBlcShkc24xLmdldF9wYXJhbSgnbnNkJywgaGVhZGVyPSdyZXBvcnRpbmctbXRhJyksIE5vbmUpCisgICAgICAgIGRzbjIgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKDEpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGRzbjIsIE1lc3NhZ2UpKQorICAgICAgICBlcShkc24yWydhY3Rpb24nXSwgJ2ZhaWxlZCcpCisgICAgICAgIGVxKGRzbjIuZ2V0X3BhcmFtcyhoZWFkZXI9J29yaWdpbmFsLXJlY2lwaWVudCcpLAorICAgICAgICAgICBbKCdyZmM4MjInLCAnJyksICgnamFuZ2VsMUBjb3VnYXIubm9jLnVjbGEuZWR1JywgJycpXSkKKyAgICAgICAgZXEoZHNuMi5nZXRfcGFyYW0oJ3JmYzgyMicsIGhlYWRlcj0nZmluYWwtcmVjaXBpZW50JyksICcnKQorICAgICAgICAjIFN1YnBhcnQgMyBpcyB0aGUgb3JpZ2luYWwgbWVzc2FnZQorICAgICAgICBzdWJwYXJ0ID0gbXNnLmdldF9wYXlsb2FkKDIpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gc3VicGFydC5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1YnN1YnBhcnQgPSBwYXlsb2FkWzBdCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnN1YnBhcnQsIE1lc3NhZ2UpKQorICAgICAgICBlcShzdWJzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShzdWJzdWJwYXJ0WydtZXNzYWdlLWlkJ10sCisgICAgICAgICAgICc8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+JykKKworICAgIGRlZiB0ZXN0X2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMjEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1RvJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICdUZXN0JworICAgICAgICBtc2cucHJlYW1ibGUgPSAnTUlNRSBtZXNzYWdlJworICAgICAgICBtc2cuZXBpbG9ndWUgPSAnRW5kIG9mIE1JTUUgbWVzc2FnZVxuJworICAgICAgICBtc2cxID0gTUlNRVRleHQoJ09uZScpCisgICAgICAgIG1zZzIgPSBNSU1FVGV4dCgnVHdvJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvbWl4ZWQnLCBib3VuZGFyeT0nQk9VTkRBUlknKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzEpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMikKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksIHRleHQpCisKKyAgICBkZWYgdGVzdF9ub19ubF9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snRnJvbSddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgbXNnWydUbyddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgbXNnWydTdWJqZWN0J10gPSAnVGVzdCcKKyAgICAgICAgbXNnLnByZWFtYmxlID0gJ01JTUUgbWVzc2FnZScKKyAgICAgICAgbXNnLmVwaWxvZ3VlID0gJycKKyAgICAgICAgbXNnMSA9IE1JTUVUZXh0KCdPbmUnKQorICAgICAgICBtc2cyID0gTUlNRVRleHQoJ1R3bycpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L21peGVkJywgYm91bmRhcnk9J0JPVU5EQVJZJykKKyAgICAgICAgbXNnLmF0dGFjaChtc2cxKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzIpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiBUZXN0CitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorCitNSU1FIG1lc3NhZ2UKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitPbmUKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitUd28KKy0tQk9VTkRBUlktLQorIiIiKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzMwLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBjb250YWluZXIxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjFhID0gY29udGFpbmVyMS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGNvbnRhaW5lcjJhID0gY29udGFpbmVyMi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGVfd2l0aF9leHBsaWNpdF9jb250YWluZXJfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18yOC50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgY29udGFpbmVyMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBjb250YWluZXIxYSA9IGNvbnRhaW5lcjEuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBjb250YWluZXIyYSA9IGNvbnRhaW5lcjIuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlX25vbl9wYXJzZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBTZXQgdXAgY29udGFpbmVyCisgICAgICAgIGNvbnRhaW5lciA9IE1JTUVNdWx0aXBhcnQoJ2RpZ2VzdCcsICdCT1VOREFSWScpCisgICAgICAgIGNvbnRhaW5lci5lcGlsb2d1ZSA9ICcnCisgICAgICAgICMgU2V0IHVwIHN1YnBhcnRzCisgICAgICAgIHN1YnBhcnQxYSA9IE1JTUVUZXh0KCdtZXNzYWdlIDFcbicpCisgICAgICAgIHN1YnBhcnQyYSA9IE1JTUVUZXh0KCdtZXNzYWdlIDJcbicpCisgICAgICAgIHN1YnBhcnQxID0gTUlNRU1lc3NhZ2Uoc3VicGFydDFhKQorICAgICAgICBzdWJwYXJ0MiA9IE1JTUVNZXNzYWdlKHN1YnBhcnQyYSkKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChzdWJwYXJ0MSkKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChzdWJwYXJ0MikKKyAgICAgICAgZXEoc3VicGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBuZXEoY29udGFpbmVyLmFzX3N0cmluZygwKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCitNSU1FLVZlcnNpb246IDEuMAorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworbWVzc2FnZSAxCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCisnJycpCisgICAgICAgIGRlbCBzdWJwYXJ0MVsnY29udGVudC10eXBlJ10KKyAgICAgICAgZGVsIHN1YnBhcnQxWydtaW1lLXZlcnNpb24nXQorICAgICAgICBkZWwgc3VicGFydDJbJ2NvbnRlbnQtdHlwZSddCisgICAgICAgIGRlbCBzdWJwYXJ0MlsnbWltZS12ZXJzaW9uJ10KKyAgICAgICAgZXEoc3VicGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBuZXEoY29udGFpbmVyLmFzX3N0cmluZygwKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorCistLUJPVU5EQVJZCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQorJycnKQorCisgICAgZGVmIHRlc3RfbWltZV9hdHRhY2htZW50c19pbl9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHRleHQxID0gTUlNRVRleHQoJycpCisgICAgICAgIHRleHQyID0gTUlNRVRleHQoJycpCisgICAgICAgIG1zZyA9IE1JTUVNdWx0aXBhcnQoX3N1YnBhcnRzPSh0ZXh0MSwgdGV4dDIpKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMCksIHRleHQxKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMSksIHRleHQyKQorCisKKwwKKyMgQSBnZW5lcmFsIHRlc3Qgb2YgcGFyc2VyLT5tb2RlbC0+Z2VuZXJhdG9yIGlkZW1wb3RlbmN5LiAgSU9XLCByZWFkIGEgbWVzc2FnZQorIyBpbiwgcGFyc2UgaXQgaW50byBhIG1lc3NhZ2Ugb2JqZWN0IHRyZWUsIHRoZW4gd2l0aG91dCB0b3VjaGluZyB0aGUgdHJlZSwKKyMgcmVnZW5lcmF0ZSB0aGUgcGxhaW4gdGV4dC4gIFRoZSBvcmlnaW5hbCB0ZXh0IGFuZCB0aGUgdHJhbnNmb3JtZWQgdGV4dAorIyBzaG91bGQgYmUgaWRlbnRpY2FsLiAgTm90ZTogdGhhdCB3ZSBpZ25vcmUgdGhlIFVuaXgtRnJvbSBzaW5jZSB0aGF0IG1heQorIyBjb250YWluIGEgY2hhbmdlZCBkYXRlLgorY2xhc3MgVGVzdElkZW1wb3RlbnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIF9tc2dvYmooc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmcCA9IG9wZW5maWxlKGZpbGVuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoZGF0YSkKKyAgICAgICAgcmV0dXJuIG1zZywgZGF0YQorCisgICAgZGVmIF9pZGVtcG90ZW50KHNlbGYsIG1zZywgdGV4dCk6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWF4aGVhZGVybGVuPTApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHRleHQsIHMuZ2V0dmFsdWUoKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlX3RleHRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFscworICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKClbMV0sICgnY2hhcnNldCcsICd1cy1hc2NpaScpKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5wcmVhbWJsZSwgTm9uZSkKKyAgICAgICAgZXEobXNnLmVwaWxvZ3VlLCBOb25lKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3BhcnNlX3VudHlwZWRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFscworICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksIE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgTm9uZSkKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X01JTUVfZGlnZXN0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wMi50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yNy50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X01JTUVfZGlnZXN0X3dpdGhfcGFydF9oZWFkZXJzKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yOC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X21peGVkX3dpdGhfaW1hZ2Uoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA2LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X3JlcG9ydChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9kc24oc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfcHJlYW1ibGVfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzIxLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X29uZV9wYXJ0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yMy50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9ub19wYXJ0cyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMjQudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9ub19zdGFydF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzEudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzMyLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbW9yZV9yZmMyMjMxX3BhcmFtZXRlcnMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzMzLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfdGV4dF9wbGFpbl9pbl9hX211bHRpcGFydF9kaWdlc3Qoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzM0LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbmVzdGVkX211bHRpcGFydF9taXhlZHMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzEyYS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZXh0ZXJuYWxfYm9keV9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18zNi50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X2NvbnRlbnRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFscworICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgIyBHZXQgYSBtZXNzYWdlIG9iamVjdCBhbmQgcmVzZXQgdGhlIHNlZWsgcG9pbnRlciBmb3Igb3RoZXIgdGVzdHMKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQorICAgICAgICAjIFRlc3QgdGhlIENvbnRlbnQtVHlwZTogcGFyYW1ldGVycworICAgICAgICBwYXJhbXMgPSB7fQorICAgICAgICBmb3IgcGssIHB2IGluIG1zZy5nZXRfcGFyYW1zKCk6CisgICAgICAgICAgICBwYXJhbXNbcGtdID0gcHYKKyAgICAgICAgZXEocGFyYW1zWydyZXBvcnQtdHlwZSddLCAnZGVsaXZlcnktc3RhdHVzJykKKyAgICAgICAgZXEocGFyYW1zWydib3VuZGFyeSddLCAnRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbScpCisgICAgICAgIGVxKG1zZy5wcmVhbWJsZSwgJ1RoaXMgaXMgYSBNSU1FLWVuY2Fwc3VsYXRlZCBtZXNzYWdlLlxuJykKKyAgICAgICAgZXEobXNnLmVwaWxvZ3VlLCAnXG4nKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAzKQorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc3VicGFydHMgYXJlIHdoYXQgd2UgZXhwZWN0CisgICAgICAgIG1zZzEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEobXNnMS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnMS5nZXRfcGF5bG9hZCgpLCAnWWFkZGEgeWFkZGEgeWFkZGFcbicpCisgICAgICAgIG1zZzIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEobXNnMi5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnMi5nZXRfcGF5bG9hZCgpLCAnWWFkZGEgeWFkZGEgeWFkZGFcbicpCisgICAgICAgIG1zZzMgPSBtc2cuZ2V0X3BheWxvYWQoMikKKyAgICAgICAgZXEobXNnMy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzMsIE1lc3NhZ2UpKQorICAgICAgICBwYXlsb2FkID0gbXNnMy5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIG1zZzQgPSBwYXlsb2FkWzBdCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZzQsIE1lc3NhZ2UpKQorICAgICAgICBlcShtc2c0LmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKworICAgIGRlZiB0ZXN0X3BhcnNlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFscworICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDYudHh0JykKKyAgICAgICAgIyBDaGVjayBzb21lIG9mIHRoZSBvdXRlciBoZWFkZXJzCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBwYXlsb2FkIGlzIGEgbGlzdCBvZiBleGFjdGx5IG9uZSBzdWItTWVzc2FnZSwgYW5kIHRoYXQKKyAgICAgICAgIyB0aGF0IHN1Ym1lc3NhZ2UgaGFzIGEgdHlwZSBvZiB0ZXh0L3BsYWluCisgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKKyAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQorICAgICAgICBtc2cxID0gcGF5bG9hZFswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cxLCBNZXNzYWdlKSkKKyAgICAgICAgZXEobXNnMS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnMS5nZXRfcGF5bG9hZCgpLCBzdHIpKQorICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdcbicpCisKKworDAorIyBUZXN0IHZhcmlvdXMgb3RoZXIgYml0cyBvZiB0aGUgcGFja2FnZSdzIGZ1bmN0aW9uYWxpdHkKK2NsYXNzIFRlc3RNaXNjZWxsYW5lb3VzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dCkKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgIyBEb24ndCB3cmFwL2NvbnRpbnVlIGxvbmcgaGVhZGVycyBzaW5jZSB3ZSdyZSB0cnlpbmcgdG8gdGVzdAorICAgICAgICAjIGlkZW1wb3RlbmN5LgorICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1heGhlYWRlcmxlbj0wKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHMuZ2V0dmFsdWUoKSkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9maWxlKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICAgICAgZnAuc2VlaygwKQorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgIyBEb24ndCB3cmFwL2NvbnRpbnVlIGxvbmcgaGVhZGVycyBzaW5jZSB3ZSdyZSB0cnlpbmcgdG8gdGVzdAorICAgICAgICAgICAgIyBpZGVtcG90ZW5jeS4KKyAgICAgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWF4aGVhZGVybGVuPTApCisgICAgICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBzLmdldHZhbHVlKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fc3RyaW5nX3dpdGhfY2xhc3Moc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAjIENyZWF0ZSBhIHN1YmNsYXNzCisgICAgICAgIGNsYXNzIE15TWVzc2FnZShNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHQsIE15TWVzc2FnZSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpKQorICAgICAgICAjIFRyeSBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDIudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHQsIE15TWVzc2FnZSkKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fZmlsZV93aXRoX2NsYXNzKHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgIyBDcmVhdGUgYSBzdWJjbGFzcworICAgICAgICBjbGFzcyBNeU1lc3NhZ2UoTWVzc2FnZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwLCBNeU1lc3NhZ2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZywgTXlNZXNzYWdlKSkKKyAgICAgICAgIyBUcnkgc29tZXRoaW5nIG1vcmUgY29tcGxpY2F0ZWQKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAyLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwLCBNeU1lc3NhZ2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZy53YWxrKCk6CisgICAgICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzdWJwYXJ0LCBNeU1lc3NhZ2UpKQorCisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKCdlbWFpbCcpCisgICAgICAgICMgQ2FuJ3QgdXNlIHNvcnRlZCgpIGhlcmUgZHVlIHRvIFB5dGhvbiAyLjMgY29tcGF0aWJpbGl0eQorICAgICAgICBhbGwgPSBtb2R1bGUuX19hbGxfX1s6XQorICAgICAgICBhbGwuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsLCBbCisgICAgICAgICAgICAjIE9sZCBuYW1lcworICAgICAgICAgICAgJ0NoYXJzZXQnLCAnRW5jb2RlcnMnLCAnRXJyb3JzJywgJ0dlbmVyYXRvcicsCisgICAgICAgICAgICAnSGVhZGVyJywgJ0l0ZXJhdG9ycycsICdNSU1FQXVkaW8nLCAnTUlNRUJhc2UnLAorICAgICAgICAgICAgJ01JTUVJbWFnZScsICdNSU1FTWVzc2FnZScsICdNSU1FTXVsdGlwYXJ0JywKKyAgICAgICAgICAgICdNSU1FTm9uTXVsdGlwYXJ0JywgJ01JTUVUZXh0JywgJ01lc3NhZ2UnLAorICAgICAgICAgICAgJ1BhcnNlcicsICdVdGlscycsICdiYXNlNjRNSU1FJywKKyAgICAgICAgICAgICMgbmV3IG5hbWVzCisgICAgICAgICAgICAnYmFzZTY0bWltZScsICdjaGFyc2V0JywgJ2VuY29kZXJzJywgJ2Vycm9ycycsICdnZW5lcmF0b3InLAorICAgICAgICAgICAgJ2hlYWRlcicsICdpdGVyYXRvcnMnLCAnbWVzc2FnZScsICdtZXNzYWdlX2Zyb21fZmlsZScsCisgICAgICAgICAgICAnbWVzc2FnZV9mcm9tX3N0cmluZycsICdtaW1lJywgJ3BhcnNlcicsCisgICAgICAgICAgICAncXVvcHJpTUlNRScsICdxdW9wcmltaW1lJywgJ3V0aWxzJywKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9mb3JtYXRkYXRlKHNlbGYpOgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlZGF0ZSh1dGlscy5mb3JtYXRkYXRlKG5vdykpWzo2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLmdtdGltZShub3cpWzo2XSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdGRhdGVfbG9jYWx0aW1lKHNlbGYpOgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMucGFyc2VkYXRlKHV0aWxzLmZvcm1hdGRhdGUobm93LCBsb2NhbHRpbWU9VHJ1ZSkpWzo2XSwKKyAgICAgICAgICAgIHRpbWUubG9jYWx0aW1lKG5vdylbOjZdKQorCisgICAgZGVmIHRlc3RfZm9ybWF0ZGF0ZV91c2VnbXQoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRkYXRlKG5vdywgbG9jYWx0aW1lPUZhbHNlKSwKKyAgICAgICAgICAgIHRpbWUuc3RyZnRpbWUoJyVhLCAlZCAlYiAlWSAlSDolTTolUyAtMDAwMCcsIHRpbWUuZ210aW1lKG5vdykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0ZGF0ZShub3csIGxvY2FsdGltZT1GYWxzZSwgdXNlZ210PVRydWUpLAorICAgICAgICAgICAgdGltZS5zdHJmdGltZSgnJWEsICVkICViICVZICVIOiVNOiVTIEdNVCcsIHRpbWUuZ210aW1lKG5vdykpKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX25vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VkYXRlKCcnKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9jb21wYWN0KHNlbGYpOgorICAgICAgICAjIFRoZSBGV1MgYWZ0ZXIgdGhlIGNvbW1hIGlzIG9wdGlvbmFsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VkYXRlKCdXZWQsMyBBcHIgMjAwMiAxNDo1ODoyNiArMDgwMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnBhcnNlZGF0ZSgnV2VkLCAzIEFwciAyMDAyIDE0OjU4OjI2ICswODAwJykpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfbm9fZGF5b2Z3ZWVrKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodXRpbHMucGFyc2VkYXRlX3R6KCcyNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpLAorICAgICAgICAgICAoMjAwMywgMiwgMjUsIDEzLCA0NywgMjYsIDAsIDEsIC0xLCAtMjg4MDApKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2NvbXBhY3Rfbm9fZGF5b2Z3ZWVrKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodXRpbHMucGFyc2VkYXRlX3R6KCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJyksCisgICAgICAgICAgICgyMDAzLCAyLCA1LCAxMywgNDcsIDI2LCAwLCAxLCAtMSwgLTI4ODAwKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9hY2NlcHRhYmxlX3RvX3RpbWVfZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdGltZXR1cCA9IHV0aWxzLnBhcnNlZGF0ZSgnNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpCisgICAgICAgIHQgPSBpbnQodGltZS5ta3RpbWUodGltZXR1cCkpCisgICAgICAgIGVxKHRpbWUubG9jYWx0aW1lKHQpWzo2XSwgdGltZXR1cFs6Nl0pCisgICAgICAgIGVxKGludCh0aW1lLnN0cmZ0aW1lKCclWScsIHRpbWV0dXApKSwgMjAwMykKKyAgICAgICAgdGltZXR1cCA9IHV0aWxzLnBhcnNlZGF0ZV90eignNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpCisgICAgICAgIHQgPSBpbnQodGltZS5ta3RpbWUodGltZXR1cFs6OV0pKQorICAgICAgICBlcSh0aW1lLmxvY2FsdGltZSh0KVs6Nl0sIHRpbWV0dXBbOjZdKQorICAgICAgICBlcShpbnQodGltZS5zdHJmdGltZSgnJVknLCB0aW1ldHVwWzo5XSkpLCAyMDAzKQorCisgICAgZGVmIHRlc3RfcGFyc2VhZGRyX2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlYWRkcignPD4nKSwgKCcnLCAnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMuZm9ybWF0YWRkcih1dGlscy5wYXJzZWFkZHIoJzw+JykpLCAnJykKKworICAgIGRlZiB0ZXN0X25vcXVvdGVfZHVtcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGFkZHIoKCdBIFNpbGx5IFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpKSwKKyAgICAgICAgICAgICdBIFNpbGx5IFBlcnNvbiA8cGVyc29uQGRvbS5haW4+JykKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0EgKFZlcnkpIFNpbGx5IFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpKSwKKyAgICAgICAgICAgIHInIkEgXChWZXJ5XCkgU2lsbHkgUGVyc29uIiA8cGVyc29uQGRvbS5haW4+JykKKyAgICAgICAgYSA9IHInQSBcKFNwZWNpYWxcKSBQZXJzb24nCisgICAgICAgIGIgPSAncGVyc29uQGRvbS5haW4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHV0aWxzLmZvcm1hdGFkZHIoKGEsIGIpKSksIChhLCBiKSkKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9iYWNrc2xhc2hlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGFkZHIoKCdBcnRodXIgXEJhY2tzbGFzaFwgRm9vYmFyJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQXJ0aHVyIFxcQmFja3NsYXNoXFwgRm9vYmFyIiA8cGVyc29uQGRvbS5haW4+JykKKyAgICAgICAgYSA9IHInQXJ0aHVyIFxCYWNrc2xhc2hcIEZvb2JhcicKKyAgICAgICAgYiA9ICdwZXJzb25AZG9tLmFpbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWFkZHIodXRpbHMuZm9ybWF0YWRkcigoYSwgYikpKSwgKGEsIGIpKQorCisgICAgZGVmIHRlc3RfbmFtZV93aXRoX2RvdChzZWxmKToKKyAgICAgICAgeCA9ICdKb2huIFguIERvZSA8anhkQGV4YW1wbGUuY29tPicKKyAgICAgICAgeSA9ICciSm9obiBYLiBEb2UiIDxqeGRAZXhhbXBsZS5jb20+JworICAgICAgICBhLCBiID0gKCdKb2huIFguIERvZScsICdqeGRAZXhhbXBsZS5jb20nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlYWRkcih4KSwgKGEsIGIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlYWRkcih5KSwgKGEsIGIpKQorICAgICAgICAjIGZvcm1hdGFkZHIoKSBxdW90ZXMgdGhlIG5hbWUgaWYgdGhlcmUncyBhIGRvdCBpbiBpdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLmZvcm1hdGFkZHIoKGEsIGIpKSwgeSkKKworICAgIGRlZiB0ZXN0X3F1b3RlX2R1bXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRhZGRyKCgnQSBTaWxseTsgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQSBTaWxseTsgUGVyc29uIiA8cGVyc29uQGRvbS5haW4+JykKKworICAgIGRlZiB0ZXN0X2ZpeF9lb2xzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvJyksICdoZWxsbycpCisgICAgICAgIGVxKHV0aWxzLmZpeF9lb2xzKCdoZWxsb1xuJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcSh1dGlscy5maXhfZW9scygnaGVsbG9ccicpLCAnaGVsbG9cclxuJykKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvXHJcbicpLCAnaGVsbG9cclxuJykKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvXG5ccicpLCAnaGVsbG9cclxuXHJcbicpCisKKyAgICBkZWYgdGVzdF9jaGFyc2V0X3JpY2hjb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lID0gc2VsZi5mYWlsSWZFcXVhbAorICAgICAgICBjc2V0MSA9IENoYXJzZXQoKQorICAgICAgICBjc2V0MiA9IENoYXJzZXQoKQorICAgICAgICBlcShjc2V0MSwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEoY3NldDEsICdVUy1BU0NJSScpCisgICAgICAgIGVxKGNzZXQxLCAnVXMtQXNDaUknKQorICAgICAgICBlcSgndXMtYXNjaWknLCBjc2V0MSkKKyAgICAgICAgZXEoJ1VTLUFTQ0lJJywgY3NldDEpCisgICAgICAgIGVxKCdVcy1Bc0NpSScsIGNzZXQxKQorICAgICAgICBuZShjc2V0MSwgJ3VzYXNjaWknKQorICAgICAgICBuZShjc2V0MSwgJ1VTQVNDSUknKQorICAgICAgICBuZShjc2V0MSwgJ1VzQXNDaUknKQorICAgICAgICBuZSgndXNhc2NpaScsIGNzZXQxKQorICAgICAgICBuZSgnVVNBU0NJSScsIGNzZXQxKQorICAgICAgICBuZSgnVXNBc0NpSScsIGNzZXQxKQorICAgICAgICBlcShjc2V0MSwgY3NldDIpCisgICAgICAgIGVxKGNzZXQyLCBjc2V0MSkKKworICAgIGRlZiB0ZXN0X2dldGFkZHJlc3NlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHV0aWxzLmdldGFkZHJlc3NlcyhbJ2FwZXJzb25AZG9tLmFpbiAoQWwgUGVyc29uKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0J1ZCBQZXJzb24gPGJwZXJzb25AZG9tLmFpbj4nXSksCisgICAgICAgICAgIFsoJ0FsIFBlcnNvbicsICdhcGVyc29uQGRvbS5haW4nKSwKKyAgICAgICAgICAgICgnQnVkIFBlcnNvbicsICdicGVyc29uQGRvbS5haW4nKV0pCisKKyAgICBkZWYgdGVzdF9nZXRhZGRyZXNzZXNfbmFzdHkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5nZXRhZGRyZXNzZXMoWydmb286IDsnXSksIFsoJycsICcnKV0pCisgICAgICAgIGVxKHV0aWxzLmdldGFkZHJlc3NlcygKKyAgICAgICAgICAgWydbXSotLSA9fiQnXSksCisgICAgICAgICAgIFsoJycsICcnKSwgKCcnLCAnJyksICgnJywgJyotLScpXSkKKyAgICAgICAgZXEodXRpbHMuZ2V0YWRkcmVzc2VzKAorICAgICAgICAgICBbJ2ZvbzogOycsICciSmFzb24gUi4gTWFzdGFsZXIiIDxqYXNvbkBkb20uYWluPiddKSwKKyAgICAgICAgICAgWygnJywgJycpLCAoJ0phc29uIFIuIE1hc3RhbGVyJywgJ2phc29uQGRvbS5haW4nKV0pCisKKyAgICBkZWYgdGVzdF91dGlsc19xdW90ZV91bnF1b3RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdjb250ZW50LWRpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nZm9vXFx3YWNreSJuYW1lJykKKyAgICAgICAgZXEobXNnLmdldF9maWxlbmFtZSgpLCAnZm9vXFx3YWNreSJuYW1lJykKKworICAgIGRlZiB0ZXN0X2dldF9ib2R5X2VuY29kaW5nX3dpdGhfYm9ndXNfY2hhcnNldChzZWxmKToKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ25vdCBhIGNoYXJzZXQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYXJzZXQuZ2V0X2JvZHlfZW5jb2RpbmcoKSwgJ2Jhc2U2NCcpCisKKyAgICBkZWYgdGVzdF9nZXRfYm9keV9lbmNvZGluZ193aXRoX3VwcGVyY2FzZV9jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCcKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShsZW4oY2hhcnNldHMpLCAxKQorICAgICAgICBlcShjaGFyc2V0c1swXSwgJ3V0Zi04JykKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoY2hhcnNldHNbMF0pCisgICAgICAgIGVxKGNoYXJzZXQuZ2V0X2JvZHlfZW5jb2RpbmcoKSwgJ2Jhc2U2NCcpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnaGVsbG8gd29ybGQnLCBjaGFyc2V0PWNoYXJzZXQpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnYUdWc2JHOGdkMjl5YkdRPVxuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdiYXNlNjQnKQorICAgICAgICAjIFRyeSBhbm90aGVyIG9uZQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJVUy1BU0NJSSInCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGxlbihjaGFyc2V0cyksIDEpCisgICAgICAgIGVxKGNoYXJzZXRzWzBdLCAndXMtYXNjaWknKQorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldChjaGFyc2V0c1swXSkKKyAgICAgICAgZXEoY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpLCBlbmNvZGVycy5lbmNvZGVfN29yOGJpdCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdoZWxsbyB3b3JsZCcsIGNoYXJzZXQ9Y2hhcnNldCkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdoZWxsbyB3b3JsZCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAnN2JpdCcpCisKKyAgICBkZWYgdGVzdF9jaGFyc2V0c19jYXNlX2luc2Vuc2l0aXZlKHNlbGYpOgorICAgICAgICBsYyA9IENoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgdWMgPSBDaGFyc2V0KCdVUy1BU0NJSScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGMuZ2V0X2JvZHlfZW5jb2RpbmcoKSwgdWMuZ2V0X2JvZHlfZW5jb2RpbmcoKSkKKworICAgIGRlZiB0ZXN0X3BhcnRpYWxfZmFsbHNfaW5zaWRlX21lc3NhZ2VfZGVsaXZlcnlfc3RhdHVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIFRoZSBQYXJzZXIgaW50ZXJmYWNlIHByb3ZpZGVzIGNodW5rcyBvZiBkYXRhIHRvIEZlZWRQYXJzZXIgaW4gODE5MgorICAgICAgICAjIGJ5dGUgZ3VscHMuICBTRiBidWcgIzEwNzY0ODUgZm91bmQgb25lIG9mIHRob3NlIGNodW5rcyBpbnNpZGUKKyAgICAgICAgIyBtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cyBoZWFkZXIgYmxvY2ssIHdoaWNoIHRyaWdnZXJlZCBhbgorICAgICAgICAjIHVucmVhZGxpbmUoKSBvZiBOZWVkTW9yZURhdGEuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQzLnR4dCcpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgaXRlcmF0b3JzLl9zdHJ1Y3R1cmUobXNnLCBzZnApCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCittdWx0aXBhcnQvcmVwb3J0CisgICAgdGV4dC9wbGFpbgorICAgIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgIHRleHQvcmZjODIyLWhlYWRlcnMKKyIiIikKKworCisMCisjIFRlc3QgdGhlIGl0ZXJhdG9yL2dlbmVyYXRvcnMKK2NsYXNzIFRlc3RJdGVyYXRvcnMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfYm9keV9saW5lX2l0ZXJhdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgRmlyc3QgYSBzaW1wbGUgbm9uLW11bHRpcGFydCBtZXNzYWdlCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIGl0ID0gaXRlcmF0b3JzLmJvZHlfbGluZV9pdGVyYXRvcihtc2cpCisgICAgICAgIGxpbmVzID0gbGlzdChpdCkKKyAgICAgICAgZXEobGVuKGxpbmVzKSwgNikKKyAgICAgICAgbmVxKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpLCBtc2cuZ2V0X3BheWxvYWQoKSkKKyAgICAgICAgIyBOb3cgYSBtb3JlIGNvbXBsaWNhdGVkIG11bHRpcGFydAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMi50eHQnKQorICAgICAgICBpdCA9IGl0ZXJhdG9ycy5ib2R5X2xpbmVfaXRlcmF0b3IobXNnKQorICAgICAgICBsaW5lcyA9IGxpc3QoaXQpCisgICAgICAgIGVxKGxlbihsaW5lcyksIDQzKQorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMTkudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmVxKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpLCBmcC5yZWFkKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF90eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDQudHh0JykKKyAgICAgICAgaXQgPSBpdGVyYXRvcnMudHlwZWRfc3VicGFydF9pdGVyYXRvcihtc2csICd0ZXh0JykKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBzdWJwYXJ0cyA9IDAKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gaXQ6CisgICAgICAgICAgICBzdWJwYXJ0cyArPSAxCisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc3VicGFydC5nZXRfcGF5bG9hZCgpKQorICAgICAgICBlcShzdWJwYXJ0cywgMikKKyAgICAgICAgZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksICIiIlwKK2Egc2ltcGxlIGtpbmQgb2YgbWlycm9yCit0byByZWZsZWN0IHVwb24gb3VyIG93bgorYSBzaW1wbGUga2luZCBvZiBtaXJyb3IKK3RvIHJlZmxlY3QgdXBvbiBvdXIgb3duCisiIiIpCisKKyAgICBkZWYgdGVzdF90eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yX2RlZmF1bHRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIGl0ID0gaXRlcmF0b3JzLnR5cGVkX3N1YnBhcnRfaXRlcmF0b3IobXNnLCAndGV4dCcsICdwbGFpbicpCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgc3VicGFydHMgPSAwCisgICAgICAgIGZvciBzdWJwYXJ0IGluIGl0OgorICAgICAgICAgICAgc3VicGFydHMgKz0gMQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSkKKyAgICAgICAgZXEoc3VicGFydHMsIDEpCisgICAgICAgIGVxKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpLCAiIiJcCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQorIiIiKQorCisKKwwKK2NsYXNzIFRlc3RQYXJzZXJzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2hlYWRlcl9wYXJzZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFBhcnNlIG9ubHkgdGhlIGhlYWRlcnMgb2YgYSBjb21wbGV4IG11bHRpcGFydCBNSU1FIGRvY3VtZW50CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMi50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBIZWFkZXJQYXJzZXIoKS5wYXJzZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXEobXNnWydmcm9tJ10sICdwcHAtcmVxdWVzdEB6enoub3JnJykKKyAgICAgICAgZXEobXNnWyd0byddLCAncHBwQHp6ei5vcmcnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKKyAgICAgICAgc2VsZi5mYWlsSWYobXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUaGlzIG1lc3NhZ2UgY29udGFpbnMgYSBsaW5lIGFmdGVyIHRoZSBTdWJqZWN0OiBoZWFkZXIgdGhhdCBoYXMgb25seQorICAgICAgICAjIHdoaXRlc3BhY2UsIGJ1dCBpdCBpcyBub3QgZW1wdHkhCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIiIiXAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiB0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0CitceDIwCitEYXRlOiBNb24sIDggQXByIDIwMDIgMTU6MDk6MTkgLTA0MDAKK01lc3NhZ2UtSUQ6IHNwYW0KKworSGVyZSdzIHRoZSBtZXNzYWdlIGJvZHkKKyIiIikKKyAgICAgICAgZXEobXNnWydzdWJqZWN0J10sICd0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0XG4gJykKKyAgICAgICAgZXEobXNnWydtZXNzYWdlLWlkJ10sICdzcGFtJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICJIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keVxuIikKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfY29udGludWF0aW9uX2xhc3RfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBMaWtlIHRoZSBwcmV2aW91cyB0ZXN0LCBidXQgdGhlIHN1YmplY3QgbGluZSBpcyB0aGUgbGFzdAorICAgICAgICAjIGhlYWRlci4KKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK0RhdGU6IE1vbiwgOCBBcHIgMjAwMiAxNTowOToxOSAtMDQwMAorTWVzc2FnZS1JRDogc3BhbQorU3ViamVjdDogdGhlIG5leHQgbGluZSBoYXMgYSBzcGFjZSBvbiBpdAorXHgyMAorCitIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keQorIiIiKQorICAgICAgICBlcShtc2dbJ3N1YmplY3QnXSwgJ3RoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXRcbiAnKQorICAgICAgICBlcShtc2dbJ21lc3NhZ2UtaWQnXSwgJ3NwYW0nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIkhlcmUncyB0aGUgbWVzc2FnZSBib2R5XG4iKQorCisgICAgZGVmIHRlc3RfY3JsZl9zZXBhcmF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzI2LnR4dCcsIG1vZGU9J3JiJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gUGFyc2VyKCkucGFyc2UoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIHBhcnQxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHBhcnQxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShwYXJ0MS5nZXRfcGF5bG9hZCgpLCAnU2ltcGxlIGVtYWlsIHdpdGggYXR0YWNobWVudC5cclxuXHJcbicpCisgICAgICAgIHBhcnQyID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKHBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ2FwcGxpY2F0aW9uL3Jpc2NvcycpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfZGlnZXN0X3dpdGhfZXh0cmFfbWltZV9oZWFkZXJzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18yOC50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgIyBTdHJ1Y3R1cmUgaXM6CisgICAgICAgICMgbXVsdGlwYXJ0L2RpZ2VzdAorICAgICAgICAjICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgIyAgICAgdGV4dC9wbGFpbgorICAgICAgICAjICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgIyAgICAgdGV4dC9wbGFpbgorICAgICAgICBlcShtc2cuaXNfbXVsdGlwYXJ0KCksIDEpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIHBhcnQxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHBhcnQxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEocGFydDEuaXNfbXVsdGlwYXJ0KCksIDEpCisgICAgICAgIGVxKGxlbihwYXJ0MS5nZXRfcGF5bG9hZCgpKSwgMSkKKyAgICAgICAgcGFydDFhID0gcGFydDEuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDFhLmlzX211bHRpcGFydCgpLCAwKQorICAgICAgICBlcShwYXJ0MWEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIG5lcShwYXJ0MWEuZ2V0X3BheWxvYWQoKSwgJ21lc3NhZ2UgMVxuJykKKyAgICAgICAgIyBuZXh0IG1lc3NhZ2UvcmZjODIyCisgICAgICAgIHBhcnQyID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKHBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEocGFydDIuaXNfbXVsdGlwYXJ0KCksIDEpCisgICAgICAgIGVxKGxlbihwYXJ0Mi5nZXRfcGF5bG9hZCgpKSwgMSkKKyAgICAgICAgcGFydDJhID0gcGFydDIuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDJhLmlzX211bHRpcGFydCgpLCAwKQorICAgICAgICBlcShwYXJ0MmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIG5lcShwYXJ0MmEuZ2V0X3BheWxvYWQoKSwgJ21lc3NhZ2UgMlxuJykKKworICAgIGRlZiB0ZXN0X3RocmVlX2xpbmVzKHNlbGYpOgorICAgICAgICAjIEEgYnVnIHJlcG9ydCBieSBBbmRyZXcgTWNOYW1hcmEKKyAgICAgICAgbGluZXMgPSBbJ0Zyb206IEFuZHJldyBQZXJzb24gPGFwZXJzb25AZG9tLmFpbicsCisgICAgICAgICAgICAgICAgICdTdWJqZWN0OiBUZXN0JywKKyAgICAgICAgICAgICAgICAgJ0RhdGU6IFR1ZSwgMjAgQXVnIDIwMDIgMTY6NDM6NDUgKzEwMDAnXQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKE5MLmpvaW4obGluZXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1snZGF0ZSddLCAnVHVlLCAyMCBBdWcgMjAwMiAxNjo0Mzo0NSArMTAwMCcpCisKKyAgICBkZWYgdGVzdF9zdHJpcF9saW5lX2ZlZWRfYW5kX2NhcnJpYWdlX3JldHVybl9pbl9oZWFkZXJzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBGb3IgWyAxMDAyNDc1IF0gZW1haWwgbWVzc2FnZSBwYXJzZXIgZG9lc24ndCBoYW5kbGUgXHJcbiBjb3JyZWN0bHkKKyAgICAgICAgdmFsdWUxID0gJ3RleHQnCisgICAgICAgIHZhbHVlMiA9ICdtb3JlIHRleHQnCisgICAgICAgIG0gPSAnSGVhZGVyOiAlc1xyXG5OZXh0LUhlYWRlcjogJXNcclxuXHJcbkJvZHlcclxuXHJcbicgJSAoCisgICAgICAgICAgICB2YWx1ZTEsIHZhbHVlMikKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShtc2cuZ2V0KCdIZWFkZXInKSwgdmFsdWUxKQorICAgICAgICBlcShtc2cuZ2V0KCdOZXh0LUhlYWRlcicpLCB2YWx1ZTIpCisKKyAgICBkZWYgdGVzdF9yZmMyODIyX2hlYWRlcl9zeW50YXgoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gJz5Gcm9tOiBmb29cbkZyb206IGJhclxuISIjUVVYO346IHpvb1xuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKGxlbihtc2cua2V5cygpKSwgMykKKyAgICAgICAga2V5cyA9IG1zZy5rZXlzKCkKKyAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgZXEoa2V5cywgWychIiNRVVg7ficsICc+RnJvbScsICdGcm9tJ10pCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnYm9keScpCisKKyAgICBkZWYgdGVzdF9yZmMyODIyX3NwYWNlX25vdF9hbGxvd2VkX2luX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnPkZyb20gZm9vQGV4YW1wbGUuY29tIDExOjI1OjUzXG5Gcm9tOiBiYXJcbiEiI1FVWDt+OiB6b29cblxuYm9keScKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShsZW4obXNnLmtleXMoKSksIDApCisKKyAgICBkZWYgdGVzdF9yZmMyODIyX29uZV9jaGFyYWN0ZXJfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICdBOiBmaXJzdCBoZWFkZXJcbkI6IHNlY29uZCBoZWFkZXJcbkNDOiB0aGlyZCBoZWFkZXJcblxuYm9keScKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBoZWFkZXJzID0gbXNnLmtleXMoKQorICAgICAgICBoZWFkZXJzLnNvcnQoKQorICAgICAgICBlcShoZWFkZXJzLCBbJ0EnLCAnQicsICdDQyddKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ2JvZHknKQorCisKKwwKK2NsYXNzIFRlc3RCYXNlNjQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NG1pbWUuYmFzZTY0X2xlbignaGVsbG8nKSwKKyAgICAgICAgICAgbGVuKGJhc2U2NG1pbWUuZW5jb2RlKCdoZWxsbycsIGVvbD0nJykpKQorICAgICAgICBmb3Igc2l6ZSBpbiByYW5nZSgxNSk6CisgICAgICAgICAgICBpZiAgIHNpemUgPT0gMCA6IGJzaXplID0gMAorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDMgOiBic2l6ZSA9IDQKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSA2IDogYnNpemUgPSA4CisgICAgICAgICAgICBlbGlmIHNpemUgPD0gOSA6IGJzaXplID0gMTIKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSAxMjogYnNpemUgPSAxNgorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgOiBic2l6ZSA9IDIwCisgICAgICAgICAgICBlcShiYXNlNjRtaW1lLmJhc2U2NF9sZW4oJ3gnKnNpemUpLCBic2l6ZSkKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZGVjb2RlKCcnKSwgJycpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZGVjb2RlKCdhR1ZzYkc4PScpLCAnaGVsbG8nKQorICAgICAgICBlcShiYXNlNjRtaW1lLmRlY29kZSgnYUdWc2JHOD0nLCAnWCcpLCAnaGVsbG8nKQorICAgICAgICBlcShiYXNlNjRtaW1lLmRlY29kZSgnYUdWc2JHOE5DbmR2Y214a1xuJywgJ1gnKSwgJ2hlbGxvWHdvcmxkJykKKworICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCcnKSwgJycpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCdoZWxsbycpLCAnYUdWc2JHOD1cbicpCisgICAgICAgICMgVGVzdCB0aGUgYmluYXJ5IGZsYWcKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ2hlbGxvXG4nKSwgJ2FHVnNiRzhLXG4nKQorICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgnaGVsbG9cbicsIDApLCAnYUdWc2JHOE5DZz09XG4nKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJnCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2cKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2cKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2cKK2VIaDRlQ0I0ZUhoNElBPT0KKyIiIikKKyAgICAgICAgIyBUZXN0IHRoZSBlb2wgYXJndW1lbnQKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwLCBlb2w9J1xyXG4nKSwgIiIiXAorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZ1xyCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnXHIKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2dccgorZUhoNGVDQjRlSGg0SUE9PVxyCisiIiIpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaGUgPSBiYXNlNjRtaW1lLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZXEoaGUoJ2hlbGxvJyksICc9P2lzby04ODU5LTE/Yj9hR1ZzYkc4PT89JykKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcpLCAnPT9pc28tODg1OS0xP2I/YUdWc2JHOE5DbmR2Y214az89JykKKyAgICAgICAgIyBUZXN0IHRoZSBjaGFyc2V0IG9wdGlvbgorICAgICAgICBlcShoZSgnaGVsbG8nLCBjaGFyc2V0PSdpc28tODg1OS0yJyksICc9P2lzby04ODU5LTI/Yj9hR1ZzYkc4PT89JykKKyAgICAgICAgIyBUZXN0IHRoZSBrZWVwX2VvbHMgZmxhZworICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJywga2VlcF9lb2xzPVRydWUpLAorICAgICAgICAgICAnPT9pc28tODg1OS0xP2I/YUdWc2JHOEtkMjl5YkdRPT89JykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKKz0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9JSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIZz0/PQorID0/aXNvLTg4NTktMT9iP2VIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0E9Pz0KKyA9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZz89IiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShoZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCis9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP0lIaDRlSGdnZUhoNGVDQjRlSGg0SUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0E9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnPz0iIiIpCisKKworDAorY2xhc3MgVGVzdFF1b3ByaSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhsaXQgPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnYScpLCBvcmQoJ3onKSsxKV0gKyBcCisgICAgICAgICAgICAgICAgICAgIFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdBJyksIG9yZCgnWicpKzEpXSArIFwKKyAgICAgICAgICAgICAgICAgICAgW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJzAnKSwgb3JkKCc5JykrMSldICsgXAorICAgICAgICAgICAgICAgICAgICBbJyEnLCAnKicsICcrJywgJy0nLCAnLycsICcgJ10KKyAgICAgICAgc2VsZi5obm9uID0gW2Nocih4KSBmb3IgeCBpbiByYW5nZSgyNTYpIGlmIGNocih4KSBub3QgaW4gc2VsZi5obGl0XQorICAgICAgICBhc3NlcnQgbGVuKHNlbGYuaGxpdCkgKyBsZW4oc2VsZi5obm9uKSA9PSAyNTYKKyAgICAgICAgc2VsZi5ibGl0ID0gW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJyAnKSwgb3JkKCd+JykrMSldICsgWydcdCddCisgICAgICAgIHNlbGYuYmxpdC5yZW1vdmUoJz0nKQorICAgICAgICBzZWxmLmJub24gPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKDI1NikgaWYgY2hyKHgpIG5vdCBpbiBzZWxmLmJsaXRdCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5ibGl0KSArIGxlbihzZWxmLmJub24pID09IDI1NgorCisgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9jaGVjayhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obGl0OgorICAgICAgICAgICAgc2VsZi5mYWlsSWYocXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2NoZWNrKGMpKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmhub246CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2NoZWNrKGMpKQorCisgICAgZGVmIHRlc3RfYm9keV9xdW9wcmlfY2hlY2soc2VsZik6CisgICAgICAgIGZvciBjIGluIHNlbGYuYmxpdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKHF1b3ByaW1pbWUuYm9keV9xdW9wcmlfY2hlY2soYykpCisgICAgICAgIGZvciBjIGluIHNlbGYuYm5vbjoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhxdW9wcmltaW1lLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBocWwgPSBxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfbGVuCisgICAgICAgIGVuYyA9IHF1b3ByaW1pbWUuaGVhZGVyX2VuY29kZQorICAgICAgICBmb3IgcyBpbiAoJ2hlbGxvJywgJ2hAZUBsQGxAb0AnKToKKyAgICAgICAgICAgICMgRW1wdHkgY2hhcnNldCBhbmQgbm8gbGluZS1lbmRpbmdzLiAgNyA9PSBSRkMgY2hyb21lCisgICAgICAgICAgICBlcShocWwocyksIGxlbihlbmMocywgY2hhcnNldD0nJywgZW9sPScnKSktNykKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obGl0OgorICAgICAgICAgICAgZXEoaHFsKGMpLCAxKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmhub246CisgICAgICAgICAgICBlcShocWwoYyksIDMpCisKKyAgICBkZWYgdGVzdF9ib2R5X3F1b3ByaV9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBicWwgPSBxdW9wcmltaW1lLmJvZHlfcXVvcHJpX2xlbgorICAgICAgICBmb3IgYyBpbiBzZWxmLmJsaXQ6CisgICAgICAgICAgICBlcShicWwoYyksIDEpCisgICAgICAgIGZvciBjIGluIHNlbGYuYm5vbjoKKyAgICAgICAgICAgIGVxKGJxbChjKSwgMykKKworICAgIGRlZiB0ZXN0X3F1b3RlX3VucXVvdGVfaWRlbXBvdGVudChzZWxmKToKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGMgPSBjaHIoeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVvcHJpbWltZS51bnF1b3RlKHF1b3ByaW1pbWUucXVvdGUoYykpLCBjKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGhlID0gcXVvcHJpbWltZS5oZWFkZXJfZW5jb2RlCisgICAgICAgIGVxKGhlKCdoZWxsbycpLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PScpCisgICAgICAgIGVxKGhlKCdoZWxsb1xud29ybGQnKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPTBEPTBBd29ybGQ/PScpCisgICAgICAgICMgVGVzdCB0aGUgY2hhcnNldCBvcHRpb24KKyAgICAgICAgZXEoaGUoJ2hlbGxvJywgY2hhcnNldD0naXNvLTg4NTktMicpLCAnPT9pc28tODg1OS0yP3E/aGVsbG8/PScpCisgICAgICAgICMgVGVzdCB0aGUga2VlcF9lb2xzIGZsYWcKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcsIGtlZXBfZW9scz1UcnVlKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPTBBd29ybGQ/PScpCisgICAgICAgICMgVGVzdCBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIKKyAgICAgICAgZXEoaGUoJ2hlbGxvXHhjN3RoZXJlJyksICc9P2lzby04ODU5LTE/cT9oZWxsbz1DN3RoZXJlPz0nKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAorPT9pc28tODg1OS0xP3E/eHh4eF94eHh4X3h4eHhfeHh4eF94eD89CisgPT9pc28tODg1OS0xP3E/eHhfeHh4eF94eHh4X3h4eHhfeHh4eD89CisgPT9pc28tODg1OS0xP3E/X3h4eHhfeHh4eF94eHh4X3h4eHhfeD89CisgPT9pc28tODg1OS0xP3E/eHh4X3h4eHhfeHh4eF94eHh4X3h4eD89CisgPT9pc28tODg1OS0xP3E/eF94eHh4X3h4eHhfPz0iIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKKz0/aXNvLTg4NTktMT9xP3h4eHhfeHh4eF94eHh4X3h4eHhfeHg/PVxyCisgPT9pc28tODg1OS0xP3E/eHhfeHh4eF94eHh4X3h4eHhfeHh4eD89XHIKKyA9P2lzby04ODU5LTE/cT9feHh4eF94eHh4X3h4eHhfeHh4eF94Pz1ccgorID0/aXNvLTg4NTktMT9xP3h4eF94eHh4X3h4eHhfeHh4eF94eHg/PVxyCisgPT9pc28tODg1OS0xP3E/eF94eHh4X3h4eHhfPz0iIiIpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShxdW9wcmltaW1lLmRlY29kZSgnJyksICcnKQorICAgICAgICBlcShxdW9wcmltaW1lLmRlY29kZSgnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEocXVvcHJpbWltZS5kZWNvZGUoJ2hlbGxvJywgJ1gnKSwgJ2hlbGxvJykKKyAgICAgICAgZXEocXVvcHJpbWltZS5kZWNvZGUoJ2hlbGxvXG53b3JsZCcsICdYJyksICdoZWxsb1h3b3JsZCcpCisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgnJyksICcnKQorICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgIyBUZXN0IHRoZSBiaW5hcnkgZmxhZworICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgnaGVsbG9cclxud29ybGQnKSwgJ2hlbGxvXG53b3JsZCcpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCdoZWxsb1xyXG53b3JsZCcsIDApLCAnaGVsbG9cbndvcmxkJykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZworICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCit4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHg9CisgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHg9Cit4IHh4eHggeHh4eCB4eHh4IHh4eHg9MjAiIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKK3h4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eD1ccgorIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4PVxyCit4IHh4eHggeHh4eCB4eHh4IHh4eHg9MjAiIiIpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCIiIlwKK29uZSBsaW5lCisKK3R3byBsaW5lIiIiKSwgIiIiXAorb25lIGxpbmUKKwordHdvIGxpbmUiIiIpCisKKworDAorIyBUZXN0IHRoZSBDaGFyc2V0IGNsYXNzCitjbGFzcyBUZXN0Q2hhcnNldCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmcm9tIGVtYWlsIGltcG9ydCBjaGFyc2V0IGFzIENoYXJzZXRNb2R1bGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIENoYXJzZXRNb2R1bGUuQ0hBUlNFVFNbJ2Zha2UnXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBNYWtlIHN1cmUgdXMtYXNjaWkgPSBubyBVbmljb2RlIGNvbnZlcnNpb24KKyAgICAgICAgYyA9IENoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgcyA9ICdIZWxsbyBXb3JsZCEnCisgICAgICAgIHNwID0gYy50b19zcGxpdHRhYmxlKHMpCisgICAgICAgIGVxKHMsIGMuZnJvbV9zcGxpdHRhYmxlKHNwKSkKKyAgICAgICAgIyB0ZXN0IDgtYml0IGlkZW1wb3RlbmN5IHdpdGggdXMtYXNjaWkKKyAgICAgICAgcyA9ICdceGE0XHhhMlx4YTRceGE0XHhhNFx4YTZceGE0XHhhOFx4YTRceGFhJworICAgICAgICBzcCA9IGMudG9fc3BsaXR0YWJsZShzKQorICAgICAgICBlcShzLCBjLmZyb21fc3BsaXR0YWJsZShzcCkpCisKKyAgICBkZWYgdGVzdF9ib2R5X2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIFFQIGJvZHkgZW5jb2RpbmcKKyAgICAgICAgYyA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBlcSgnaGVsbG8gdz1GNnJsZCcsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdceGY2cmxkJykpCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIEJhc2U2NCBib2R5IGVuY29kaW5nCisgICAgICAgIGMgPSBDaGFyc2V0KCd1dGYtOCcpCisgICAgICAgIGVxKCdhR1ZzYkc4Z2QyOXliR1E9XG4nLCBjLmJvZHlfZW5jb2RlKCdoZWxsbyB3b3JsZCcpKQorICAgICAgICAjIFRyeSBhIGNoYXJzZXQgd2l0aCBOb25lIGJvZHkgZW5jb2RpbmcKKyAgICAgICAgYyA9IENoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgZXEoJ2hlbGxvIHdvcmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd29ybGQnKSkKKyAgICAgICAgIyBUcnkgdGhlIGNvbnZlcnQgYXJndW1lbnQsIHdoZXJlIGlucHV0IGNvZGVjIDw+IG91dHB1dCBjb2RlYworICAgICAgICBjID0gQ2hhcnNldCgnZXVjLWpwJykKKyAgICAgICAgIyBXaXRoIGFwb2xvZ2llcyB0byBUb2tpbyBLaWt1Y2hpIDspCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVxKCdceDFiJEI1RkNPO35JV1x4MWIoQicsCisgICAgICAgICAgICAgICBjLmJvZHlfZW5jb2RlKCdceGI1XHhjNlx4YzNceGNmXHhiYlx4ZmVceGM5XHhkNycpKQorICAgICAgICAgICAgZXEoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JywKKyAgICAgICAgICAgICAgIGMuYm9keV9lbmNvZGUoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JywgRmFsc2UpKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICAjIFdlIHByb2JhYmx5IGRvbid0IGhhdmUgdGhlIEphcGFuZXNlIGNvZGVjcyBpbnN0YWxsZWQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBUZXN0aW5nIFNGIGJ1ZyAjNjI1NTA5LCB3aGljaCB3ZSBoYXZlIHRvIGZha2UsIHNpbmNlIHRoZXJlIGFyZSBubworICAgICAgICAjIGJ1aWx0LWluIGVuY29kaW5ncyB3aGVyZSB0aGUgaGVhZGVyIGVuY29kaW5nIGlzIFFQIGJ1dCB0aGUgYm9keQorICAgICAgICAjIGVuY29kaW5nIGlzIG5vdC4KKyAgICAgICAgZnJvbSBlbWFpbCBpbXBvcnQgY2hhcnNldCBhcyBDaGFyc2V0TW9kdWxlCisgICAgICAgIENoYXJzZXRNb2R1bGUuYWRkX2NoYXJzZXQoJ2Zha2UnLCBDaGFyc2V0TW9kdWxlLlFQLCBOb25lKQorICAgICAgICBjID0gQ2hhcnNldCgnZmFrZScpCisgICAgICAgIGVxKCdoZWxsbyB3XHhmNnJsZCcsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdceGY2cmxkJykpCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2NoYXJzZXRfbmFtZShzZWxmKToKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQodSd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNoYXJzZXQpLCAndXMtYXNjaWknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJvcnMuQ2hhcnNldEVycm9yLCBDaGFyc2V0LCAnYXNjXHhmZmlpJykKKworCisMCisjIFRlc3QgbXVsdGlsaW5ndWFsIE1JTUUgaGVhZGVycy4KK2NsYXNzIFRlc3RIZWFkZXIoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCdIZWxsbyBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhJykKKyAgICAgICAgaC5hcHBlbmQoJyBHb29kYnllIFdvcmxkIScpCisgICAgICAgIGVxKGguZW5jb2RlKCksICdIZWxsbyBXb3JsZCEgIEdvb2RieWUgV29ybGQhJykKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9zdXJwcmlzZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcignSGVsbG8gV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGguYXBwZW5kKCdHb29kYnllIFdvcmxkIScpCisgICAgICAgIGVxKGguZW5jb2RlKCksICdIZWxsbyBXb3JsZCEgR29vZGJ5ZSBXb3JsZCEnKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX25lZWRzX25vX2RlY29kaW5nKHNlbGYpOgorICAgICAgICBoID0gJ25vIGRlY29kaW5nIG5lZWRlZCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVfaGVhZGVyKGgpLCBbKGgsIE5vbmUpXSkKKworICAgIGRlZiB0ZXN0X2xvbmcoc2VsZik6CisgICAgICAgIGggPSBIZWFkZXIoIkkgYW0gdGhlIHZlcnkgbW9kZWwgb2YgYSBtb2Rlcm4gTWFqb3ItR2VuZXJhbDsgSSd2ZSBpbmZvcm1hdGlvbiB2ZWdldGFibGUsIGFuaW1hbCwgYW5kIG1pbmVyYWw7IEkga25vdyB0aGUga2luZ3Mgb2YgRW5nbGFuZCwgYW5kIEkgcXVvdGUgdGhlIGZpZ2h0cyBoaXN0b3JpY2FsIGZyb20gTWFyYXRob24gdG8gV2F0ZXJsb28sIGluIG9yZGVyIGNhdGVnb3JpY2FsOyBJJ20gdmVyeSB3ZWxsIGFjcXVhaW50ZWQsIHRvbywgd2l0aCBtYXR0ZXJzIG1hdGhlbWF0aWNhbDsgSSB1bmRlcnN0YW5kIGVxdWF0aW9ucywgYm90aCB0aGUgc2ltcGxlIGFuZCBxdWFkcmF0aWNhbDsgYWJvdXQgYmlub21pYWwgdGhlb3JlbSBJJ20gdGVlbWluZyB3aXRoIGEgbG90IG8nIG5ld3MsIHdpdGggbWFueSBjaGVlcmZ1bCBmYWN0cyBhYm91dCB0aGUgc3F1YXJlIG9mIHRoZSBoeXBvdGVudXNlLiIsCisgICAgICAgICAgICAgICAgICAgbWF4bGluZWxlbj03NikKKyAgICAgICAgZm9yIGwgaW4gaC5lbmNvZGUoc3BsaXRjaGFycz0nICcpLnNwbGl0KCdcbiAnKToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsZW4obCkgPD0gNzYpCisKKyAgICBkZWYgdGVzdF9tdWx0aWxpbmd1YWwoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGcgPSBDaGFyc2V0KCJpc28tODg1OS0xIikKKyAgICAgICAgY3ogPSBDaGFyc2V0KCJpc28tODg1OS0yIikKKyAgICAgICAgdXRmOCA9IENoYXJzZXQoInV0Zi04IikKKyAgICAgICAgZ19oZWFkID0gIkRpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQga29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGZjZGxceGZjbmRpc2NoZW4gV2FuZGdlbVx4ZTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gYmVmXHhmNnJkZXJ0LiAiCisgICAgICAgIGN6X2hlYWQgPSAiRmluYW5ceGU4bmkgbWV0cm9wb2xlIHNlIGhyb3V0aWx5IHBvZCB0bGFrZW0gamVqaWNoIGRceGY5dnRpcHUuLiAiCisgICAgICAgIHV0ZjhfaGVhZCA9IHUiXHU2YjYzXHU3OGJhXHUzMDZiXHU4YTAwXHUzMDQ2XHUzMDY4XHU3ZmZiXHU4YTMzXHUzMDZmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHU0ZTAwXHU5MGU4XHUzMDZmXHUzMGM5XHUzMGE0XHUzMGM0XHU4YTllXHUzMDY3XHUzMDU5XHUzMDRjXHUzMDAxXHUzMDQyXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDVmXHUzMDg5XHUzMDgxXHUzMDY3XHUzMDU5XHUzMDAyXHU1YjlmXHU5NjliXHUzMDZiXHUzMDZmXHUzMDBjV2VubiBpc3QgZGFzIE51bnN0dWNrIGdpdCB1bmQgU2xvdGVybWV5ZXI/IEphISBCZWloZXJodW5kIGRhcyBPZGVyIGRpZSBGbGlwcGVyd2FsZHQgZ2Vyc3B1dC5cdTMwMGRcdTMwNjhcdThhMDBcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIiLmVuY29kZSgidXRmLTgiKQorICAgICAgICBoID0gSGVhZGVyKGdfaGVhZCwgZykKKyAgICAgICAgaC5hcHBlbmQoY3pfaGVhZCwgY3opCisgICAgICAgIGguYXBwZW5kKHV0ZjhfaGVhZCwgdXRmOCkKKyAgICAgICAgZW5jID0gaC5lbmNvZGUoKQorICAgICAgICBlcShlbmMsICIiIlwKKz0/aXNvLTg4NTktMT9xP0RpZV9NaWV0ZXJfdHJldGVuX2hpZXJfZWluX3dlcmRlbl9taXRfZWluZW1fRm9lcmRlcmJhbmRfa28/PQorID0/aXNvLTg4NTktMT9xP21mb3J0YWJlbF9kZW5fS29ycmlkb3JfZW50bGFuZz0yQ19hbl9zPUZDZGw9RkNuZGlzY2hlbl9XYW4/PQorID0/aXNvLTg4NTktMT9xP2RnZW09RTRsZGVuX3ZvcmJlaT0yQ19nZWdlbl9kaWVfcm90aWVyZW5kZW5fS2xpbmdlbl9iZWY9RjY/PQorID0/aXNvLTg4NTktMT9xP3JkZXJ0PTJFXz89ID0/aXNvLTg4NTktMj9xP0ZpbmFuPUU4bmlfbWV0cm9wb2xlX3NlX2hyb3V0aWx5Pz0KKyA9P2lzby04ODU5LTI/cT9fcG9kX3RsYWtlbV9qZWppY2hfZD1GOXZ0aXB1PTJFPTJFXz89ID0/dXRmLTg/Yj81cTJqNTZLNj89CisgPT91dGYtOD9iPzQ0R3I2S2lBNDRHRzQ0R281Nys3NktpejQ0R3Y0NEdWNDRLTTQ0R200NEdFNDRHKzQ0R2I0NEtUNDRDQz89CisgPT91dGYtOD9iPzVMaUE2WU9vNDRHdjQ0T0o0NEtrNDRPRTZLcWU0NEduNDRHWjQ0R000NENCNDRHQzQ0R280NEd2NDRHbj89CisgPT91dGYtOD9iPzQ0R2Y0NEtKNDRLQjQ0R240NEdaNDRDQzVhNmY2WnFiNDRHcjQ0R3Y0NENNVjJWdWJpQnBjM1FnWkdGej89CisgPT91dGYtOD9xP19OdW5zdHVja19naXRfdW5kX1Nsb3Rlcm1leWVyPTNGX0phIV9CZWloZXJodW5kX2Rhc19PZGVyX2RpZV9GbD89CisgPT91dGYtOD9iP2FYQndaWEozWVd4a2RDQm5aWEp6Y0hWMEx1T0FqZU9CcU9pb2dPT0JvK09CcHVPQmhPT0J2dU9CbVE9PT89CisgPT91dGYtOD9iPzQ0Q0M/PSIiIikKKyAgICAgICAgZXEoZGVjb2RlX2hlYWRlcihlbmMpLAorICAgICAgICAgICBbKGdfaGVhZCwgImlzby04ODU5LTEiKSwgKGN6X2hlYWQsICJpc28tODg1OS0yIiksCisgICAgICAgICAgICAodXRmOF9oZWFkLCAidXRmLTgiKV0pCisgICAgICAgIHVzdHIgPSB1bmljb2RlKGgpCisgICAgICAgIGVxKHVzdHIuZW5jb2RlKCd1dGYtOCcpLAorICAgICAgICAgICAnRGllIE1pZXRlciB0cmV0ZW4gaGllciBlaW4gd2VyZGVuIG1pdCBlaW5lbSBGb2VyZGVyYmFuZCAnCisgICAgICAgICAgICdrb21mb3J0YWJlbCBkZW4gS29ycmlkb3IgZW50bGFuZywgYW4gc1x4YzNceGJjZGxceGMzXHhiY25kaXNjaGVuICcKKyAgICAgICAgICAgJ1dhbmRnZW1ceGMzXHhhNGxkZW4gdm9yYmVpLCBnZWdlbiBkaWUgcm90aWVyZW5kZW4gS2xpbmdlbiAnCisgICAgICAgICAgICdiZWZceGMzXHhiNnJkZXJ0LiBGaW5hblx4YzRceDhkbmkgbWV0cm9wb2xlIHNlIGhyb3V0aWx5IHBvZCAnCisgICAgICAgICAgICd0bGFrZW0gamVqaWNoIGRceGM1XHhhZnZ0aXB1Li4gXHhlNlx4YWRceGEzXHhlN1x4YTJceGJhXHhlM1x4ODEnCisgICAgICAgICAgICdceGFiXHhlOFx4YThceDgwXHhlM1x4ODFceDg2XHhlM1x4ODFceGE4XHhlN1x4YmZceGJiXHhlOFx4YThceGIzJworICAgICAgICAgICAnXHhlM1x4ODFceGFmXHhlM1x4ODFceDk1XHhlM1x4ODJceDhjXHhlM1x4ODFceGE2XHhlM1x4ODFceDg0XHhlMycKKyAgICAgICAgICAgJ1x4ODFceGJlXHhlM1x4ODFceDliXHhlM1x4ODJceDkzXHhlM1x4ODBceDgyXHhlNFx4YjhceDgwXHhlOVx4ODMnCisgICAgICAgICAgICdceGE4XHhlM1x4ODFceGFmXHhlM1x4ODNceDg5XHhlM1x4ODJceGE0XHhlM1x4ODNceDg0XHhlOFx4YWFceDllJworICAgICAgICAgICAnXHhlM1x4ODFceGE3XHhlM1x4ODFceDk5XHhlM1x4ODFceDhjXHhlM1x4ODBceDgxXHhlM1x4ODFceDgyXHhlMycKKyAgICAgICAgICAgJ1x4ODFceGE4XHhlM1x4ODFceGFmXHhlM1x4ODFceGE3XHhlM1x4ODFceDlmXHhlM1x4ODJceDg5XHhlM1x4ODInCisgICAgICAgICAgICdceDgxXHhlM1x4ODFceGE3XHhlM1x4ODFceDk5XHhlM1x4ODBceDgyXHhlNVx4YWVceDlmXHhlOVx4OWFceDliJworICAgICAgICAgICAnXHhlM1x4ODFceGFiXHhlM1x4ODFceGFmXHhlM1x4ODBceDhjV2VubiBpc3QgZGFzIE51bnN0dWNrIGdpdCAnCisgICAgICAgICAgICd1bmQgU2xvdGVybWV5ZXI/IEphISBCZWloZXJodW5kIGRhcyBPZGVyIGRpZSBGbGlwcGVyd2FsZHQgJworICAgICAgICAgICAnZ2Vyc3B1dC5ceGUzXHg4MFx4OGRceGUzXHg4MVx4YThceGU4XHhhOFx4ODBceGUzXHg4MVx4YTNceGUzXHg4MScKKyAgICAgICAgICAgJ1x4YTZceGUzXHg4MVx4ODRceGUzXHg4MVx4YmVceGUzXHg4MVx4OTlceGUzXHg4MFx4ODInKQorICAgICAgICAjIFRlc3QgbWFrZV9oZWFkZXIoKQorICAgICAgICBuZXdoID0gbWFrZV9oZWFkZXIoZGVjb2RlX2hlYWRlcihlbmMpKQorICAgICAgICBlcShuZXdoLCBlbmMpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfY3Rvcl9kZWZhdWx0X2FyZ3Moc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoKQorICAgICAgICBlcShoLCAnJykKKyAgICAgICAgaC5hcHBlbmQoJ2ZvbycsIENoYXJzZXQoJ2lzby04ODU5LTEnKSkKKyAgICAgICAgZXEoaCwgJz0/aXNvLTg4NTktMT9xP2Zvbz89JykKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X21heGxpbmVsZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAnQSB2ZXJ5IGxvbmcgbGluZSB0aGF0IG11c3QgZ2V0IHNwbGl0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGF0IHRoZSA3NnRoIGNoYXJhY3RlciBib3VuZGFyeSB0byB0ZXN0IHRoZSBub24tZGVmYXVsdCBiZWhhdmlvcicKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnJydcCitBIHZlcnkgbG9uZyBsaW5lIHRoYXQgbXVzdCBnZXQgc3BsaXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYXQgdGhlIDc2dGgKKyBjaGFyYWN0ZXIgYm91bmRhcnkgdG8gdGVzdCB0aGUgbm9uLWRlZmF1bHQgYmVoYXZpb3InJycpCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgaGVhZGVyX25hbWU9J1N1YmplY3QnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnJydcCitBIHZlcnkgbG9uZyBsaW5lIHRoYXQgbXVzdCBnZXQgc3BsaXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYXQgdGhlCisgNzZ0aCBjaGFyYWN0ZXIgYm91bmRhcnkgdG8gdGVzdCB0aGUgbm9uLWRlZmF1bHQgYmVoYXZpb3InJycpCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgbWF4bGluZWxlbj0xMDI0LCBoZWFkZXJfbmFtZT0nU3ViamVjdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksIGhzdHIpCisKKyAgICBkZWYgdGVzdF91c19hc2NpaV9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gJ2hlbGxvJworICAgICAgICB4ID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcSh4LCBbKCdoZWxsbycsIE5vbmUpXSkKKyAgICAgICAgaCA9IG1ha2VfaGVhZGVyKHgpCisgICAgICAgIGVxKHMsIGguZW5jb2RlKCkpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoKQorICAgICAgICBoLmFwcGVuZCgnaGVsbG8nLCAnaXNvLTg4NTktMScpCisgICAgICAgIGVxKGgsICc9P2lzby04ODU5LTE/cT9oZWxsbz89JykKKworIyMgICAgZGVmIHRlc3RfdW5pY29kZV9lcnJvcihzZWxmKToKKyMjICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIEhlYWRlciwgdSdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCAnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIGggPSBIZWFkZXIoKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIGguYXBwZW5kLCB1J1tQXHhmNnN0YWxdJywgJ3VzLWFzY2lpJykKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBoLmFwcGVuZCwgJ1tQXHhmNnN0YWxdJywgJ3VzLWFzY2lpJykKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBIZWFkZXIsIHUnXHU4M2NhXHU1NzMwXHU2NjQyXHU1OTJiJywgJ2lzby04ODU5LTEnKQorCisgICAgZGVmIHRlc3RfdXRmOF9zaG9ydGVzdChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIodSdwXHhmNnN0YWwnLCAndXRmLTgnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnPT91dGYtOD9xP3A9QzM9QjZzdGFsPz0nKQorICAgICAgICBoID0gSGVhZGVyKHUnXHU4M2NhXHU1NzMwXHU2NjQyXHU1OTJiJywgJ3V0Zi04JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJz0/dXRmLTg/Yj82SStLNVp5dzVwbUM1YVNyPz0nKQorCisgICAgZGVmIHRlc3RfYmFkXzhiaXRfaGVhZGVyKHNlbGYpOgorICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgeCA9ICdZbndwNGRVRWJheSBBdWN0aW9uIFNlbWlhci0gTm8gQ2hhcmdlIFx4OTYgRWFybiBCaWcnCisgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIEhlYWRlciwgeCkKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIGguYXBwZW5kLCB4KQorICAgICAgICBlcShzdHIoSGVhZGVyKHgsIGVycm9ycz0ncmVwbGFjZScpKSwgeCkKKyAgICAgICAgaC5hcHBlbmQoeCwgZXJyb3JzPSdyZXBsYWNlJykKKyAgICAgICAgZXEoc3RyKGgpLCB4KQorCisgICAgZGVmIHRlc3RfZW5jb2RlZF9hZGphY2VudF9ub25lbmNvZGVkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGguYXBwZW5kKCdoZWxsbycsICdpc28tODg1OS0xJykKKyAgICAgICAgaC5hcHBlbmQoJ3dvcmxkJykKKyAgICAgICAgcyA9IGguZW5jb2RlKCkKKyAgICAgICAgZXEocywgJz0/aXNvLTg4NTktMT9xP2hlbGxvPz0gd29ybGQnKQorICAgICAgICBoID0gbWFrZV9oZWFkZXIoZGVjb2RlX2hlYWRlcihzKSkKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgcykKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfZWF0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1N1YmplY3Q6ID0/a29pOC1yP2I/OE5MUDE4WFN5OEVnenNFZ3hzbk93Y3pZenRrPT89ID0/a29pOC1yP3E/PUNBPz0genouJworICAgICAgICBwYXJ0cyA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEocGFydHMsIFsoJ1N1YmplY3Q6JywgTm9uZSksICgnXHhmMFx4ZDJceGNmXHhkN1x4YzVceGQyXHhjYlx4YzEgXHhjZVx4YzEgXHhjNlx4YzlceGNlXHhjMVx4Y2NceGQ4XHhjZVx4ZDlceGNhJywgJ2tvaTgtcicpLCAoJ3p6LicsIE5vbmUpXSkKKyAgICAgICAgaGRyID0gbWFrZV9oZWFkZXIocGFydHMpCisgICAgICAgIGVxKGhkci5lbmNvZGUoKSwKKyAgICAgICAgICAgJ1N1YmplY3Q6ID0/a29pOC1yP2I/OE5MUDE4WFN5OEVnenNFZ3hzbk93Y3pZenRuSz89IHp6LicpCisKKyAgICBkZWYgdGVzdF9icm9rZW5fYmFzZTY0X2hlYWRlcihzZWxmKToKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgcyA9ICdTdWJqZWN0OiA9P0VVQy1LUj9CP0NTaXhwTER0S1NDLzdMaXV2c2F4NGlDNnVMbXdNY2lqSUtIYUlMelN3ZC9IMFNDOCtMQ2p3THNndjdXLytNajNJUT89JworICAgICAgICByYWlzZXMoZXJyb3JzLkhlYWRlclBhcnNlRXJyb3IsIGRlY29kZV9oZWFkZXIsIHMpCisKKworDAorIyBUZXN0IFJGQyAyMjMxIGhlYWRlciBwYXJhbWV0ZXJzIChlbi9kZSljb2RpbmcKK2NsYXNzIFRlc3RSRkMyMjMxKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2dldF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI5LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3RpdGxlJyksCisgICAgICAgICAgICgndXMtYXNjaWknLCAnZW4nLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnKSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnLCB1bnF1b3RlPUZhbHNlKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICdlbicsICciVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEiJykpCisKKyAgICBkZWYgdGVzdF9zZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ9J3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICcnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnKSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ9J3VzLWFzY2lpJywgbGFuZ3VhZ2U9J2VuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICdlbicsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScpKQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK1JldHVybi1QYXRoOiA8YmJiQHp6ei5vcmc+CitEZWxpdmVyZWQtVG86IGJiYkB6enoub3JnCitSZWNlaXZlZDogYnkgbWFpbC56enoub3JnIChQb3N0Zml4LCBmcm9tIHVzZXJpZCA4ODkpCitcdGlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaTsKK1x0dGl0bGUqPSJ1cy1hc2NpaSdlbidUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMGlzbiUyN3QlMjBpdCUyMSIKKworCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKKyIiIikKKworICAgIGRlZiB0ZXN0X2RlbF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnZm9vJywgJ2JhcicsIGNoYXJzZXQ9J3VzLWFzY2lpJywgbGFuZ3VhZ2U9J2VuJykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBtc2cuZGVsX3BhcmFtKCdmb28nLCBoZWFkZXI9J0NvbnRlbnQtVHlwZScpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKK1x0aWQgMjdDRUFEMzhDQzsgRnJpLCAgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMCAoRURUKQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK01lc3NhZ2UtSUQ6IDwxNTA5MC42MTMwNC4xMTA5MjkuNDU2ODRAYWFhLnp6ei5vcmc+CitGcm9tOiBiYmJAZGRkLmNvbSAoSm9obiBYLiBEb2UpCitUbzogYmJiQHp6ei5vcmcKK1N1YmplY3Q6IFRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UKK0RhdGU6IEZyaSwgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSI7CitcdHRpdGxlKj0idXMtYXNjaWknZW4nVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAlMkElMkElMkFmdW4lMkElMkElMkElMjBpc24lMjd0JTIwaXQlMjEiCisKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCisiIiIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2dldF9jb250ZW50X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMi50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLCAndXMtYXNjaWknKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0iCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgTkFNRSowPWZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNOyBOQU1FKjE9UF9uc21haWwuaHRtCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnTkFNRScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCBOb25lLCAnZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0nKSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7CitcdGJvdW5kYXJ5KjA9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0Ym91bmRhcnkqMT0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Ym91bmRhcnkqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2JvdW5kYXJ5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9jaGFyc2V0KHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgYSBub25zZW5zaWNhbCBjaGFyc2V0IHZhbHVlLCBidXQgdGVzdHMgdGhlIGNvZGUgYW55d2F5CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47CitcdGNoYXJzZXQqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRjaGFyc2V0KjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGNoYXJzZXQqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0aGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3Vua25vd25fZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lKjA9WC1VTktOT1dOJydteWZpbGUudHh0CisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLCAnbXlmaWxlLnR4dCcpCisKKworDAorZGVmIF90ZXN0Y2xhc3NlcygpOgorICAgIG1vZCA9IHN5cy5tb2R1bGVzW19fbmFtZV9fXQorICAgIHJldHVybiBbZ2V0YXR0cihtb2QsIG5hbWUpIGZvciBuYW1lIGluIGRpcihtb2QpIGlmIG5hbWUuc3RhcnRzd2l0aCgnVGVzdCcpXQorCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBmb3IgdGVzdGNsYXNzIGluIF90ZXN0Y2xhc3NlcygpOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZSh0ZXN0Y2xhc3MpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBmb3IgdGVzdGNsYXNzIGluIF90ZXN0Y2xhc3NlcygpOgorICAgICAgICBydW5fdW5pdHRlc3QodGVzdGNsYXNzKQorCisKKwwKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0nc3VpdGUnKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL1V0aWxzLnB5IGIvTGliL2VtYWlsL3V0aWxzLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9VdGlscy5weQpyZW5hbWUgdG8gTGliL2VtYWlsL3V0aWxzLnB5CmluZGV4IDliYTc2MDEuLjI1MGViMTkgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9VdGlscy5weQorKysgYi9MaWIvZW1haWwvdXRpbHMucHkKQEAgLTEsOSArMSwyNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJNaXNjZWxsYW5lb3VzIHV0aWxpdGllcy4iIiIKIAorX19hbGxfXyA9IFsKKyAgICAnY29sbGFwc2VfcmZjMjIzMV92YWx1ZScsCisgICAgJ2RlY29kZV9wYXJhbXMnLAorICAgICdkZWNvZGVfcmZjMjIzMScsCisgICAgJ2VuY29kZV9yZmMyMjMxJywKKyAgICAnZm9ybWF0YWRkcicsCisgICAgJ2Zvcm1hdGRhdGUnLAorICAgICdnZXRhZGRyZXNzZXMnLAorICAgICdtYWtlX21zZ2lkJywKKyAgICAncGFyc2VhZGRyJywKKyAgICAncGFyc2VkYXRlJywKKyAgICAncGFyc2VkYXRlX3R6JywKKyAgICAndW5xdW90ZScsCisgICAgXQorCiBpbXBvcnQgb3MKIGltcG9ydCByZQogaW1wb3J0IHRpbWUKQEAgLTI0LDcgKzM5LDcgQEAKIGZyb20gcXVvcHJpIGltcG9ydCBkZWNvZGVzdHJpbmcgYXMgX3FkZWNvZGUKIAogIyBJbnRyYXBhY2thZ2UgaW1wb3J0cwotZnJvbSBlbWFpbC5FbmNvZGVycyBpbXBvcnQgX2JlbmNvZGUsIF9xZW5jb2RlCitmcm9tIGVtYWlsLmVuY29kZXJzIGltcG9ydCBfYmVuY29kZSwgX3FlbmNvZGUKIAogQ09NTUFTUEFDRSA9ICcsICcKIEVNUFRZU1RSSU5HID0gJycKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvYmlnNS5weSBiL0xpYi9lbmNvZGluZ3MvYmlnNS5weQppbmRleCBkNTZhYTFiLi43YWRlYjBlIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2JpZzUucHkKKysrIGIvTGliL2VuY29kaW5ncy9iaWc1LnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGJpZzUucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBCSUc1CiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBiaWc1LnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfdHcsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX3R3LmdldGNvZGVjKCdiaWc1JykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nYmlnNScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvYmlnNWhrc2NzLnB5IGIvTGliL2VuY29kaW5ncy9iaWc1aGtzY3MucHkKaW5kZXggNDQzOTk3Zi4uMzUwZGYzNyAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9iaWc1aGtzY3MucHkKKysrIGIvTGliL2VuY29kaW5ncy9iaWc1aGtzY3MucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgYmlnNWhrc2NzLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQklHNUhLU0NTCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBiaWc1aGtzY3MucHksdiAxLjEgMjAwNC8wNi8yOSAwNToxNDoyNyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19oaywgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaGsuZ2V0Y29kZWMoJ2JpZzVoa3NjcycpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2JpZzVoa3NjcycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvY3A5MzIucHkgYi9MaWIvZW5jb2RpbmdzL2NwOTMyLnB5CmluZGV4IDM4OTM3ZjUuLmUwMWY1OWIgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvY3A5MzIucHkKKysrIGIvTGliL2VuY29kaW5ncy9jcDkzMi5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBjcDkzMi5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIENQOTMyCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBjcDkzMi5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnY3A5MzInKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDkzMicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvY3A5NDkucHkgYi9MaWIvZW5jb2RpbmdzL2NwOTQ5LnB5CmluZGV4IDBmM2M4NDcuLjYyN2M4NzEgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvY3A5NDkucHkKKysrIGIvTGliL2VuY29kaW5ncy9jcDk0OS5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBjcDk0OS5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIENQOTQ5CiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBjcDk0OS5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2tyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19rci5nZXRjb2RlYygnY3A5NDknKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDk0OScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvY3A5NTAucHkgYi9MaWIvZW5jb2RpbmdzL2NwOTUwLnB5CmluZGV4IGRhYjNlMjguLjM5ZWVjNWUgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvY3A5NTAucHkKKysrIGIvTGliL2VuY29kaW5ncy9jcDk1MC5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBjcDk1MC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIENQOTUwCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBjcDk1MC5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX3R3LCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc190dy5nZXRjb2RlYygnY3A5NTAnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDk1MCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZXVjX2ppc18yMDA0LnB5IGIvTGliL2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkKaW5kZXggMDJkNTVjYS4uNzJiODdhZSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkKKysrIGIvTGliL2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZXVjX2ppc18yMDA0LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgRVVDX0pJU18yMDA0CiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBldWNfamlzXzIwMDQucHksdiAxLjEgMjAwNC8wNy8wNyAxNjoxODoyNSBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ2V1Y19qaXNfMjAwNCcpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19qaXNfMjAwNCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnB5IGIvTGliL2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHkKaW5kZXggMzBmMTczZS4uY2M0N2QwNCAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHkKKysrIGIvTGliL2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZXVjX2ppc3gwMjEzLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgRVVDX0pJU1gwMjEzCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBldWNfamlzeDAyMTMucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ2V1Y19qaXN4MDIxMycpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19qaXN4MDIxMycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZXVjX2pwLnB5IGIvTGliL2VuY29kaW5ncy9ldWNfanAucHkKaW5kZXggYTM5NDdhMy4uN2JjYmU0MSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9ldWNfanAucHkKKysrIGIvTGliL2VuY29kaW5ncy9ldWNfanAucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZXVjX2pwLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgRVVDX0pQCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBldWNfanAucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ2V1Y19qcCcpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19qcCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZXVjX2tyLnB5IGIvTGliL2VuY29kaW5ncy9ldWNfa3IucHkKaW5kZXggYmJlYmVlOC4uYzFmYjEyNiAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9ldWNfa3IucHkKKysrIGIvTGliL2VuY29kaW5ncy9ldWNfa3IucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZXVjX2tyLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgRVVDX0tSCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBldWNfa3IucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19rciwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3Nfa3IuZ2V0Y29kZWMoJ2V1Y19rcicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19rcicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZ2IxODAzMC5weSBiL0xpYi9lbmNvZGluZ3MvZ2IxODAzMC5weQppbmRleCA3ZWNhMzE5Li4zNGZiNmMzIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2diMTgwMzAucHkKKysrIGIvTGliL2VuY29kaW5ncy9nYjE4MDMwLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGdiMTgwMzAucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBHQjE4MDMwCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBnYjE4MDMwLnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfY24sIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2NuLmdldGNvZGVjKCdnYjE4MDMwJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZ2IxODAzMCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZ2IyMzEyLnB5IGIvTGliL2VuY29kaW5ncy9nYjIzMTIucHkKaW5kZXggNTEzMGVmYS4uM2MzYjgzNyAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9nYjIzMTIucHkKKysrIGIvTGliL2VuY29kaW5ncy9nYjIzMTIucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZ2IyMzEyLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgR0IyMzEyCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBnYjIzMTIucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19jbiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfY24uZ2V0Y29kZWMoJ2diMjMxMicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2diMjMxMicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZ2JrLnB5IGIvTGliL2VuY29kaW5ncy9nYmsucHkKaW5kZXggNjc4NTRiYy4uMWI0NWRiOCAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9nYmsucHkKKysrIGIvTGliL2VuY29kaW5ncy9nYmsucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZ2JrLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgR0JLCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBnYmsucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19jbiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfY24uZ2V0Y29kZWMoJ2diaycpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2diaycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaHoucHkgYi9MaWIvZW5jb2RpbmdzL2h6LnB5CmluZGV4IDM5NDA4OTQuLjM4MzQ0MmEgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvaHoucHkKKysrIGIvTGliL2VuY29kaW5ncy9oei5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBoei5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEhaCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBoei5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2NuLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19jbi5nZXRjb2RlYygnaHonKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdoeicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaWRuYS5weSBiL0xpYi9lbmNvZGluZ3MvaWRuYS5weQppbmRleCA4YmRhZTMyLi5lYTkwZDY3IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2lkbmEucHkKKysrIGIvTGliL2VuY29kaW5ncy9pZG5hLnB5CkBAIC0zNSw3ICszNSw3IEBACiAgICAgICAgICAgIHN0cmluZ3ByZXAuaW5fdGFibGVfYzcoYykgb3IgXAogICAgICAgICAgICBzdHJpbmdwcmVwLmluX3RhYmxlX2M4KGMpIG9yIFwKICAgICAgICAgICAgc3RyaW5ncHJlcC5pbl90YWJsZV9jOShjKToKLSAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIkludmFsaWQgY2hhcmFjdGVyICVzIiAlIHJlcHIoYykKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgJXIiICUgYykKIAogICAgICMgQ2hlY2sgYmlkaQogICAgIFJhbmRBTCA9IG1hcChzdHJpbmdwcmVwLmluX3RhYmxlX2QxLCBsYWJlbCkKQEAgLTQ4LDE0ICs0OCwxNCBAQAogICAgICAgICAgICAgIyAyKSBJZiBhIHN0cmluZyBjb250YWlucyBhbnkgUmFuZEFMQ2F0IGNoYXJhY3RlciwgdGhlIHN0cmluZwogICAgICAgICAgICAgIyBNVVNUIE5PVCBjb250YWluIGFueSBMQ2F0IGNoYXJhY3Rlci4KICAgICAgICAgICAgIGlmIGZpbHRlcihzdHJpbmdwcmVwLmluX3RhYmxlX2QyLCBsYWJlbCk6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiVmlvbGF0aW9uIG9mIEJJREkgcmVxdWlyZW1lbnQgMiIKKyAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlZpb2xhdGlvbiBvZiBCSURJIHJlcXVpcmVtZW50IDIiKQogCiAgICAgICAgICAgICAjIDMpIElmIGEgc3RyaW5nIGNvbnRhaW5zIGFueSBSYW5kQUxDYXQgY2hhcmFjdGVyLCBhCiAgICAgICAgICAgICAjIFJhbmRBTENhdCBjaGFyYWN0ZXIgTVVTVCBiZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZQogICAgICAgICAgICAgIyBzdHJpbmcsIGFuZCBhIFJhbmRBTENhdCBjaGFyYWN0ZXIgTVVTVCBiZSB0aGUgbGFzdAogICAgICAgICAgICAgIyBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZy4KICAgICAgICAgICAgIGlmIG5vdCBSYW5kQUxbMF0gb3Igbm90IFJhbmRBTFstMV06Ci0gICAgICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiVmlvbGF0aW9uIG9mIEJJREkgcmVxdWlyZW1lbnQgMyIKKyAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlZpb2xhdGlvbiBvZiBCSURJIHJlcXVpcmVtZW50IDMiKQogCiAgICAgcmV0dXJuIGxhYmVsCiAKQEAgLTcwLDcgKzcwLDcgQEAKICAgICAgICAgIyBTa2lwIHRvIHN0ZXAgOC4KICAgICAgICAgaWYgMCA8IGxlbihsYWJlbCkgPCA2NDoKICAgICAgICAgICAgIHJldHVybiBsYWJlbAotICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJsYWJlbCB0b28gbG9uZyIKKyAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJsYWJlbCBlbXB0eSBvciB0b28gbG9uZyIpCiAKICAgICAjIFN0ZXAgMjogbmFtZXByZXAKICAgICBsYWJlbCA9IG5hbWVwcmVwKGxhYmVsKQpAQCAtODUsMTEgKzg1LDExIEBACiAgICAgICAgICMgU2tpcCB0byBzdGVwIDguCiAgICAgICAgIGlmIDAgPCBsZW4obGFiZWwpIDwgNjQ6CiAgICAgICAgICAgICByZXR1cm4gbGFiZWwKLSAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAibGFiZWwgdG9vIGxvbmciCisgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigibGFiZWwgZW1wdHkgb3IgdG9vIGxvbmciKQogCiAgICAgIyBTdGVwIDU6IENoZWNrIEFDRSBwcmVmaXgKICAgICBpZiBsYWJlbC5zdGFydHN3aXRoKHVhY2VfcHJlZml4KToKLSAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiTGFiZWwgc3RhcnRzIHdpdGggQUNFIHByZWZpeCIKKyAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJMYWJlbCBzdGFydHMgd2l0aCBBQ0UgcHJlZml4IikKIAogICAgICMgU3RlcCA2OiBFbmNvZGUgd2l0aCBQVU5ZQ09ERQogICAgIGxhYmVsID0gbGFiZWwuZW5jb2RlKCJwdW55Y29kZSIpCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgICAjIFN0ZXAgODogQ2hlY2sgc2l6ZQogICAgIGlmIDAgPCBsZW4obGFiZWwpIDwgNjQ6CiAgICAgICAgIHJldHVybiBsYWJlbAotICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgImxhYmVsIHRvbyBsb25nIgorICAgIHJhaXNlIFVuaWNvZGVFcnJvcigibGFiZWwgZW1wdHkgb3IgdG9vIGxvbmciKQogCiBkZWYgVG9Vbmljb2RlKGxhYmVsKToKICAgICAjIFN0ZXAgMTogQ2hlY2sgZm9yIEFTQ0lJCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5lbmNvZGUoImFzY2lpIikKICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIkludmFsaWQgY2hhcmFjdGVyIGluIElETiBsYWJlbCIKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gSUROIGxhYmVsIikKICAgICAjIFN0ZXAgMzogQ2hlY2sgZm9yIEFDRSBwcmVmaXgKICAgICBpZiBub3QgbGFiZWwuc3RhcnRzd2l0aChhY2VfcHJlZml4KToKICAgICAgICAgcmV0dXJuIHVuaWNvZGUobGFiZWwsICJhc2NpaSIpCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICAjIFN0ZXAgNzogQ29tcGFyZSB0aGUgcmVzdWx0IG9mIHN0ZXAgNiB3aXRoIHRoZSBvbmUgb2Ygc3RlcCAzCiAgICAgIyBsYWJlbDIgd2lsbCBhbHJlYWR5IGJlIGluIGxvd2VyIGNhc2UuCiAgICAgaWYgbGFiZWwubG93ZXIoKSAhPSBsYWJlbDI6Ci0gICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgKCJJRE5BIGRvZXMgbm90IHJvdW5kLXRyaXAiLCBsYWJlbCwgbGFiZWwyKQorICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIklETkEgZG9lcyBub3Qgcm91bmQtdHJpcCIsIGxhYmVsLCBsYWJlbDIpCiAKICAgICAjIFN0ZXAgODogcmV0dXJuIHRoZSByZXN1bHQgb2Ygc3RlcCA1CiAgICAgcmV0dXJuIHJlc3VsdApAQCAtMTQ4LDcgKzE0OCw3IEBACiAKICAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgogICAgICAgICAgICAgIyBJRE5BIGlzIHF1aXRlIGNsZWFyIHRoYXQgaW1wbGVtZW50YXRpb25zIG11c3QgYmUgc3RyaWN0Ci0gICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJ1bnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyAiK2Vycm9ycworICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJ1bnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyAiK2Vycm9ycykKIAogICAgICAgICBpZiBub3QgaW5wdXQ6CiAgICAgICAgICAgICByZXR1cm4gIiIsIDAKQEAgLTE2OCw3ICsxNjgsNyBAQAogICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgogCiAgICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKLSAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzCisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzKQogCiAgICAgICAgIGlmIG5vdCBpbnB1dDoKICAgICAgICAgICAgIHJldHVybiB1IiIsIDAKQEAgLTE5NCwxMyArMTk0LDc5IEBACiAKICAgICAgICAgcmV0dXJuIHUiLiIuam9pbihyZXN1bHQpK3RyYWlsaW5nX2RvdCwgbGVuKGlucHV0KQogCi1jbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6Ci0gICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gQ29kZWMoKS5lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIF9idWZmZXJfZW5jb2RlKHNlbGYsIGlucHV0LCBlcnJvcnMsIGZpbmFsKToKKyAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgorICAgICAgICAgICAgIyBJRE5BIGlzIHF1aXRlIGNsZWFyIHRoYXQgaW1wbGVtZW50YXRpb25zIG11c3QgYmUgc3RyaWN0CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoInVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzKQogCi1jbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6Ci0gICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gQ29kZWMoKS5kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorICAgICAgICBpZiBub3QgaW5wdXQ6CisgICAgICAgICAgICByZXR1cm4gKCIiLCAwKQorCisgICAgICAgIGxhYmVscyA9IGRvdHMuc3BsaXQoaW5wdXQpCisgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnJworICAgICAgICBpZiBsYWJlbHM6CisgICAgICAgICAgICBpZiBub3QgbGFiZWxzWy0xXToKKyAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSAnLicKKyAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQorICAgICAgICAgICAgZWxpZiBub3QgZmluYWw6CisgICAgICAgICAgICAgICAgIyBLZWVwIHBvdGVudGlhbGx5IHVuZmluaXNoZWQgbGFiZWwgdW50aWwgdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCisgICAgICAgICAgICAgICAgaWYgbGFiZWxzOgorICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSAnLicKKworICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBzaXplID0gMAorICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChUb0FTQ0lJKGxhYmVsKSkKKyAgICAgICAgICAgIGlmIHNpemU6CisgICAgICAgICAgICAgICAgc2l6ZSArPSAxCisgICAgICAgICAgICBzaXplICs9IGxlbihsYWJlbCkKKworICAgICAgICAjIEpvaW4gd2l0aCBVKzAwMkUKKyAgICAgICAgcmVzdWx0ID0gIi4iLmpvaW4ocmVzdWx0KSArIHRyYWlsaW5nX2RvdAorICAgICAgICBzaXplICs9IGxlbih0cmFpbGluZ19kb3QpCisgICAgICAgIHJldHVybiAocmVzdWx0LCBzaXplKQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgX2J1ZmZlcl9kZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycywgZmluYWwpOgorICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzKQorCisgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgIHJldHVybiAodSIiLCAwKQorCisgICAgICAgICMgSUROQSBhbGxvd3MgZGVjb2RpbmcgdG8gb3BlcmF0ZSBvbiBVbmljb2RlIHN0cmluZ3MsIHRvby4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbnB1dCwgdW5pY29kZSk6CisgICAgICAgICAgICBsYWJlbHMgPSBkb3RzLnNwbGl0KGlucHV0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBNdXN0IGJlIEFTQ0lJIHN0cmluZworICAgICAgICAgICAgaW5wdXQgPSBzdHIoaW5wdXQpCisgICAgICAgICAgICB1bmljb2RlKGlucHV0LCAiYXNjaWkiKQorICAgICAgICAgICAgbGFiZWxzID0gaW5wdXQuc3BsaXQoIi4iKQorCisgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnJworICAgICAgICBpZiBsYWJlbHM6CisgICAgICAgICAgICBpZiBub3QgbGFiZWxzWy0xXToKKyAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSB1Jy4nCisgICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KKyAgICAgICAgICAgIGVsaWYgbm90IGZpbmFsOgorICAgICAgICAgICAgICAgICMgS2VlcCBwb3RlbnRpYWxseSB1bmZpbmlzaGVkIGxhYmVsIHVudGlsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQorICAgICAgICAgICAgICAgIGlmIGxhYmVsczoKKyAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gdScuJworCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIHNpemUgPSAwCisgICAgICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKFRvVW5pY29kZShsYWJlbCkpCisgICAgICAgICAgICBpZiBzaXplOgorICAgICAgICAgICAgICAgIHNpemUgKz0gMQorICAgICAgICAgICAgc2l6ZSArPSBsZW4obGFiZWwpCisKKyAgICAgICAgcmVzdWx0ID0gdSIuIi5qb2luKHJlc3VsdCkgKyB0cmFpbGluZ19kb3QKKyAgICAgICAgc2l6ZSArPSBsZW4odHJhaWxpbmdfZG90KQorICAgICAgICByZXR1cm4gKHJlc3VsdCwgc2l6ZSkKIAogY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgogICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weQppbmRleCAxMDk2NThiLi5hYjA0MDYwIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanAucHkKKysrIGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfanAucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0pQCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBpc28yMDIyX2pwLnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcCcpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfanAnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMS5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5CmluZGV4IDIwMWJkMjguLjk5NzA0NGQgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfanBfMS5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfSlBfMQogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogaXNvMjAyMl9qcF8xLnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcF8xJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9qcF8xJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHkgYi9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMi5weQppbmRleCA3YTYxMDE4Li45MTA2YmY3IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMi5weQorKysgYi9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMi5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBpc28yMDIyX2pwXzIucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0pQXzIKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGlzbzIwMjJfanBfMi5weSx2IDEuMiAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2lzbzIwMjIsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2lzbzIwMjIuZ2V0Y29kZWMoJ2lzbzIwMjJfanBfMicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfanBfMicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yMDA0LnB5IGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHkKaW5kZXggMjQ5NzEyNC4uNDAxOThiZiAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHkKKysrIGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgaXNvMjAyMl9qcF8yMDA0LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUF8yMDA0CiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBpc28yMDIyX2pwXzIwMDQucHksdiAxLjEgMjAwNC8wNy8wNyAxNjoxODoyNSBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2pwXzIwMDQnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwXzIwMDQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMy5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5CmluZGV4IDhiMmVkMDAuLjM0NmUwOGIgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfanBfMy5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfSlBfMwogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogaXNvMjAyMl9qcF8zLnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcF8zJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9qcF8zJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHkKaW5kZXggOTdjYjRlNy4uNzUyYmFiOSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weQorKysgYi9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfZXh0LnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfanBfZXh0LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUF9FWFQKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGlzbzIwMjJfanBfZXh0LnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcF9leHQnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwX2V4dCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9rci5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9rci5weQppbmRleCBmNTU0OWNhLi5iZjcwMTg3IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfa3IucHkKKysrIGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2tyLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfa3IucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0tSCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBpc28yMDIyX2tyLnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9rcicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfa3InLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL2pvaGFiLnB5IGIvTGliL2VuY29kaW5ncy9qb2hhYi5weQppbmRleCBiNmE4N2Q3Li41MTJhZWViIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2pvaGFiLnB5CisrKyBiL0xpYi9lbmNvZGluZ3Mvam9oYWIucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgam9oYWIucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBKT0hBQgogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogam9oYWIucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19rciwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3Nfa3IuZ2V0Y29kZWMoJ2pvaGFiJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nam9oYWInLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppcy5weSBiL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5CmluZGV4IGVjNWU1MTcuLjgzMzgxMTcgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5CisrKyBiL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIHNoaWZ0X2ppcy5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIFNISUZUX0pJUwogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogc2hpZnRfamlzLnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfanAsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2pwLmdldGNvZGVjKCdzaGlmdF9qaXMnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdzaGlmdF9qaXMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppc18yMDA0LnB5IGIvTGliL2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weQppbmRleCA0NDZjZDdjLi4xNjFiMWU4IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppc18yMDA0LnB5CisrKyBiL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzXzIwMDQucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgc2hpZnRfamlzXzIwMDQucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBTSElGVF9KSVNfMjAwNAogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogc2hpZnRfamlzXzIwMDQucHksdiAxLjEgMjAwNC8wNy8wNyAxNjoxODoyNSBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ3NoaWZ0X2ppc18yMDA0JykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nc2hpZnRfamlzXzIwMDQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLnB5IGIvTGliL2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weQppbmRleCA0OTU0NjhiLi5jYjY1M2Y1IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLnB5CisrKyBiL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgc2hpZnRfamlzeDAyMTMucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBTSElGVF9KSVNYMDIxMwogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogc2hpZnRfamlzeDAyMTMucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ3NoaWZ0X2ppc3gwMjEzJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nc2hpZnRfamlzeDAyMTMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZ2V0cGFzcy5weSBiL0xpYi9nZXRwYXNzLnB5CmluZGV4IGEzMGQzYTEuLjgyMDRhNDcgMTAwNjQ0Ci0tLSBhL0xpYi9nZXRwYXNzLnB5CisrKyBiL0xpYi9nZXRwYXNzLnB5CkBAIC0xNSwxMSArMTUsMTQgQEAKIAogX19hbGxfXyA9IFsiZ2V0cGFzcyIsImdldHVzZXIiXQogCi1kZWYgdW5peF9nZXRwYXNzKHByb21wdD0nUGFzc3dvcmQ6ICcpOgorZGVmIHVuaXhfZ2V0cGFzcyhwcm9tcHQ9J1Bhc3N3b3JkOiAnLCBzdHJlYW09Tm9uZSk6CiAgICAgIiIiUHJvbXB0IGZvciBhIHBhc3N3b3JkLCB3aXRoIGVjaG8gdHVybmVkIG9mZi4KKyAgICBUaGUgcHJvbXB0IGlzIHdyaXR0ZW4gb24gc3RyZWFtLCBieSBkZWZhdWx0IHN0ZG91dC4KIAogICAgIFJlc3RvcmUgdGVybWluYWwgc2V0dGluZ3MgYXQgZW5kLgogICAgICIiIgorICAgIGlmIHN0cmVhbSBpcyBOb25lOgorICAgICAgICBzdHJlYW0gPSBzeXMuc3Rkb3V0CiAKICAgICB0cnk6CiAgICAgICAgIGZkID0gc3lzLnN0ZGluLmZpbGVubygpCkBAIC0zMiwxOCArMzUsMTggQEAKICAgICBuZXdbM10gPSBuZXdbM10gJiB+dGVybWlvcy5FQ0hPICMgMyA9PSAnbGZsYWdzJwogICAgIHRyeToKICAgICAgICAgdGVybWlvcy50Y3NldGF0dHIoZmQsIHRlcm1pb3MuVENTQURSQUlOLCBuZXcpCi0gICAgICAgIHBhc3N3ZCA9IF9yYXdfaW5wdXQocHJvbXB0KQorICAgICAgICBwYXNzd2QgPSBfcmF3X2lucHV0KHByb21wdCwgc3RyZWFtKQogICAgIGZpbmFsbHk6CiAgICAgICAgIHRlcm1pb3MudGNzZXRhdHRyKGZkLCB0ZXJtaW9zLlRDU0FEUkFJTiwgb2xkKQogCi0gICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQorICAgIHN0cmVhbS53cml0ZSgnXG4nKQogICAgIHJldHVybiBwYXNzd2QKIAogCi1kZWYgd2luX2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJyk6CitkZWYgd2luX2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJywgc3RyZWFtPU5vbmUpOgogICAgICIiIlByb21wdCBmb3IgcGFzc3dvcmQgd2l0aCBlY2hvIG9mZiwgdXNpbmcgV2luZG93cyBnZXRjaCgpLiIiIgogICAgIGlmIHN5cy5zdGRpbiBpcyBub3Qgc3lzLl9fc3RkaW5fXzoKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRfZ2V0cGFzcyhwcm9tcHQpCisgICAgICAgIHJldHVybiBkZWZhdWx0X2dldHBhc3MocHJvbXB0LCBzdHJlYW0pCiAgICAgaW1wb3J0IG1zdmNydAogICAgIGZvciBjIGluIHByb21wdDoKICAgICAgICAgbXN2Y3J0LnB1dGNoKGMpCkBAIC02MywxNiArNjYsMTggQEAKICAgICByZXR1cm4gcHcKIAogCi1kZWYgZGVmYXVsdF9nZXRwYXNzKHByb21wdD0nUGFzc3dvcmQ6ICcpOgotICAgIHByaW50ICJXYXJuaW5nOiBQcm9ibGVtIHdpdGggZ2V0cGFzcy4gUGFzc3dvcmRzIG1heSBiZSBlY2hvZWQuIgotICAgIHJldHVybiBfcmF3X2lucHV0KHByb21wdCkKK2RlZiBkZWZhdWx0X2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJywgc3RyZWFtPU5vbmUpOgorICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIldhcm5pbmc6IFByb2JsZW0gd2l0aCBnZXRwYXNzLiBQYXNzd29yZHMgbWF5IGJlIGVjaG9lZC4iCisgICAgcmV0dXJuIF9yYXdfaW5wdXQocHJvbXB0LCBzdHJlYW0pCiAKIAotZGVmIF9yYXdfaW5wdXQocHJvbXB0PSIiKToKK2RlZiBfcmF3X2lucHV0KHByb21wdD0iIiwgc3RyZWFtPU5vbmUpOgogICAgICMgVGhpcyBkb2Vzbid0IHNhdmUgdGhlIHN0cmluZyBpbiB0aGUgR05VIHJlYWRsaW5lIGhpc3RvcnkuCisgICAgaWYgc3RyZWFtIGlzIE5vbmU6CisgICAgICAgIHN0cmVhbSA9IHN5cy5zdGRvdXQKICAgICBwcm9tcHQgPSBzdHIocHJvbXB0KQogICAgIGlmIHByb21wdDoKLSAgICAgICAgc3lzLnN0ZG91dC53cml0ZShwcm9tcHQpCisgICAgICAgIHN0cmVhbS53cml0ZShwcm9tcHQpCiAgICAgbGluZSA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCiAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgIHJhaXNlIEVPRkVycm9yCmRpZmYgLS1naXQgYS9MaWIvZ2xvYi5weSBiL0xpYi9nbG9iLnB5CmluZGV4IGVjYzZkMjUuLjk1NjU2Y2MgMTAwNjQ0Ci0tLSBhL0xpYi9nbG9iLnB5CisrKyBiL0xpYi9nbG9iLnB5CkBAIC02MCw3ICs2MCw3IEBACiAgICAgaWYgYmFzZW5hbWUgPT0gJyc6CiAgICAgICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyBhbiBlbXB0eSBiYXNlbmFtZSBmb3IgcGF0aHMgZW5kaW5nIHdpdGggYQogICAgICAgICAjIGRpcmVjdG9yeSBzZXBhcmF0b3IuICAncSp4Lycgc2hvdWxkIG1hdGNoIG9ubHkgZGlyZWN0b3JpZXMuCi0gICAgICAgIGlmIG9zLmlzZGlyKGRpcm5hbWUpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICAgcmV0dXJuIFtiYXNlbmFtZV0KICAgICBlbHNlOgogICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHMob3MucGF0aC5qb2luKGRpcm5hbWUsIGJhc2VuYW1lKSk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkgYi9MaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkKaW5kZXggY2UxZmQyYS4uZGVlYjVjNSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvSU9CaW5kaW5nLnB5CisrKyBiL0xpYi9pZGxlbGliL0lPQmluZGluZy5weQpAQCAtMzc3LDYgKzM3Nyw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAid2IiKQogICAgICAgICAgICAgZi53cml0ZShjaGFycykKKyAgICAgICAgICAgIGYuZmx1c2goKQogICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICBleGNlcHQgSU9FcnJvciwgbXNnOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTkVXUy50eHQgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dAppbmRleCBiYmU5ODc4Li44MTYzMzMwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ORVdTLnR4dAorKysgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dApAQCAtMSw3ICsxLDEwIEBACi1XaGF0J3MgTmV3IGluIElETEUgMS4yYTA/Ci09PT09PT09PT09PT09PT09PT09PT09PQorV2hhdCdzIE5ldyBpbiBJRExFIDEuMmExPworPT09PT09PT09PT09PT09PT09PT09PT09PQogCi0qUmVsZWFzZSBkYXRlOiBYWC1YWFgtMjAwNioKKypSZWxlYXNlIGRhdGU6IDA1LUFQUi0yMDA2KgorCistIFNvdXJjZSBmaWxlIGYuZmx1c2goKSBhZnRlciB3cml0aW5nOyB0cnlpbmcgdG8gYXZvaWQgbG9zc2FnZSBpZiB1c2VyCisgIGtpbGxzIEdVSS4KIAogLSBPcHRpb25zIC8gS2V5cyAvIEFkdmFuY2VkIGRpYWxvZyBtYWRlIGZ1bmN0aW9uYWwuICBBbHNvLCBhbGxvdyBiaW5kaW5nCiAgIG9mICdtb3ZlbWVudCcga2V5cy4KQEAgLTcwLDcgKzczLDcgQEAKIAogLSBJbXByb3ZlIGVycm9yIGhhbmRsaW5nIHdoZW4gLmlkbGVyYyBjYW4ndCBiZSBjcmVhdGVkICh3YXJuIGFuZCBleGl0KS4KIAotLSBUaGUgR1VJIHdhcyBoYW5naW5nIGlmIHRoZSBzaGVsbCB3aW5kb3cgd2FzIGNsb3NlZCB3aGlsZSBhIHJhd19pbnB1dCgpIAorLSBUaGUgR1VJIHdhcyBoYW5naW5nIGlmIHRoZSBzaGVsbCB3aW5kb3cgd2FzIGNsb3NlZCB3aGlsZSBhIHJhd19pbnB1dCgpCiAgIHdhcyBwZW5kaW5nLiAgUmVzdG9yZWQgdGhlIHF1aXQoKSBvZiB0aGUgcmVhZGxpbmUoKSBtYWlubG9vcCgpLgogICBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9pZGxlLWRldi8yMDA0LURlY2VtYmVyLzAwMjMwNy5odG1sCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkgYi9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CmluZGV4IGVlZjI4ODUuLmZiZGU1NmMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZXZlci5weQpAQCAtMSArMSBAQAotSURMRV9WRVJTSU9OID0gIjEuMmEwIgorSURMRV9WRVJTSU9OID0gIjEuMmExIgpkaWZmIC0tZ2l0IGEvTGliL2luc3BlY3QucHkgYi9MaWIvaW5zcGVjdC5weQppbmRleCA1N2JmMThjLi4yZTRkOTg3IDEwMDY0NAotLS0gYS9MaWIvaW5zcGVjdC5weQorKysgYi9MaWIvaW5zcGVjdC5weQpAQCAtMzUzLDcgKzM1Myw3IEBACiAgICAgICAgIGlmICdiJyBpbiBtb2RlIGFuZCBzdHJpbmcubG93ZXIoZmlsZW5hbWVbLWxlbihzdWZmaXgpOl0pID09IHN1ZmZpeDoKICAgICAgICAgICAgICMgTG9va3MgbGlrZSBhIGJpbmFyeSBmaWxlLiAgV2Ugd2FudCB0byBvbmx5IHJldHVybiBhIHRleHQgZmlsZS4KICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSBvciBoYXNhdHRyKGdldG1vZHVsZShvYmplY3QpLCAnX19sb2FkZXJfXycpOgogICAgICAgICByZXR1cm4gZmlsZW5hbWUKIAogZGVmIGdldGFic2ZpbGUob2JqZWN0KToKQEAgLTM3OSw3ICszNzksNyBAQAogICAgIGlmIGZpbGUgaW4gbW9kdWxlc2J5ZmlsZToKICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzLmdldChtb2R1bGVzYnlmaWxlW2ZpbGVdKQogICAgIGZvciBtb2R1bGUgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6Ci0gICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19maWxlX18nKToKKyAgICAgICAgaWYgaXNtb2R1bGUobW9kdWxlKSBhbmQgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgogICAgICAgICAgICAgbW9kdWxlc2J5ZmlsZVsKICAgICAgICAgICAgICAgICBvcy5wYXRoLnJlYWxwYXRoKAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YWJzZmlsZShtb2R1bGUpKV0gPSBtb2R1bGUuX19uYW1lX18KQEAgLTQwNiw3ICs0MDYsNyBAQAogICAgIGluIHRoZSBmaWxlIGFuZCB0aGUgbGluZSBudW1iZXIgaW5kZXhlcyBhIGxpbmUgaW4gdGhhdCBsaXN0LiAgQW4gSU9FcnJvcgogICAgIGlzIHJhaXNlZCBpZiB0aGUgc291cmNlIGNvZGUgY2Fubm90IGJlIHJldHJpZXZlZC4iIiIKICAgICBmaWxlID0gZ2V0c291cmNlZmlsZShvYmplY3QpIG9yIGdldGZpbGUob2JqZWN0KQotICAgIGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKGZpbGUpCisgICAgbGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMoZmlsZSwgZ2V0bW9kdWxlKG9iamVjdCkuX19kaWN0X18pCiAgICAgaWYgbm90IGxpbmVzOgogICAgICAgICByYWlzZSBJT0Vycm9yKCdjb3VsZCBub3QgZ2V0IHNvdXJjZSBjb2RlJykKIApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvUGFyYS5weSBiL0xpYi9saWItb2xkL1BhcmEucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZDhkYzYuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvUGFyYS5weQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0jIFRleHQgZm9ybWF0dGluZyBhYnN0cmFjdGlvbnMKLSMgTm90ZSAtLSB0aGlzIG1vZHVsZSBpcyBvYnNvbGV0ZSwgaXQncyB0b28gc2xvdyBhbnl3YXkKLQotCi0jIE9mdC11c2VkIHR5cGUgb2JqZWN0Ci1JbnQgPSB0eXBlKDApCi0KLQotIyBSZXByZXNlbnQgYSBwYXJhZ3JhcGguICBUaGlzIGlzIGEgbGlzdCBvZiB3b3JkcyB3aXRoIGFzc29jaWF0ZWQKLSMgZm9udCBhbmQgc2l6ZSBpbmZvcm1hdGlvbiwgcGx1cyBpbmRlbnRzIGFuZCBqdXN0aWZpY2F0aW9uIGZvciB0aGUKLSMgZW50aXJlIHBhcmFncmFwaC4KLSMgT25jZSB0aGUgd29yZHMgaGF2ZSBiZWVuIGFkZGVkIHRvIGEgcGFyYWdyYXBoLCBpdCBjYW4gYmUgbGFpZCBvdXQKLSMgZm9yIGRpZmZlcmVudCBsaW5lIHdpZHRocy4gIE9uY2UgbGFpZCBvdXQsIGl0IGNhbiBiZSByZW5kZXJlZCBhdAotIyBkaWZmZXJlbnQgc2NyZWVuIGxvY2F0aW9ucy4gIE9uY2UgcmVuZGVyZWQsIGl0IGNhbiBiZSBxdWVyaWVkCi0jIGZvciBtb3VzZSBoaXRzLCBhbmQgcGFydHMgb2YgdGhlIHRleHQgY2FuIGJlIGhpZ2hsaWdodGVkCi1jbGFzcyBQYXJhOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYud29yZHMgPSBbXSAjIFRoZSB3b3JkcwotICAgICAgICBzZWxmLmp1c3QgPSAnbCcgIyBKdXN0aWZpY2F0aW9uOiAnbCcsICdyJywgJ2xyJyBvciAnYycKLSAgICAgICAgc2VsZi5pbmRlbnRfbGVmdCA9IHNlbGYuaW5kZW50X3JpZ2h0ID0gc2VsZi5pbmRlbnRfaGFuZyA9IDAKLSAgICAgICAgIyBGaW5hbCBsYXktb3V0IHBhcmFtZXRlcnMsIG1heSBjaGFuZ2UKLSAgICAgICAgc2VsZi5sZWZ0ID0gc2VsZi50b3AgPSBzZWxmLnJpZ2h0ID0gc2VsZi5ib3R0b20gPSBcCi0gICAgICAgICAgICAgICAgc2VsZi53aWR0aCA9IHNlbGYuaGVpZ2h0ID0gc2VsZi5saW5lcyA9IE5vbmUKLSAgICAjCi0gICAgIyBBZGQgYSB3b3JkLCBjb21wdXRpbmcgc2l6ZSBpbmZvcm1hdGlvbiBmb3IgaXQuCi0gICAgIyBXb3JkcyBtYXkgYWxzbyBiZSBhZGRlZCBtYW51YWxseSBieSBhcHBlbmRpbmcgdG8gc2VsZi53b3JkcwotICAgICMgRWFjaCB3b3JkIHNob3VsZCBiZSBhIDctdHVwbGU6Ci0gICAgIyAoZm9udCwgdGV4dCwgd2lkdGgsIHNwYWNlLCBzdHJldGNoLCBhc2NlbnQsIGRlc2NlbnQpCi0gICAgZGVmIGFkZHdvcmQoc2VsZiwgZCwgZm9udCwgdGV4dCwgc3BhY2UsIHN0cmV0Y2gpOgotICAgICAgICBpZiBmb250IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgZC5zZXRmb250KGZvbnQpCi0gICAgICAgIHdpZHRoID0gZC50ZXh0d2lkdGgodGV4dCkKLSAgICAgICAgYXNjZW50ID0gZC5iYXNlbGluZSgpCi0gICAgICAgIGRlc2NlbnQgPSBkLmxpbmVoZWlnaHQoKSAtIGFzY2VudAotICAgICAgICBzcHcgPSBkLnRleHR3aWR0aCgnICcpCi0gICAgICAgIHNwYWNlID0gc3BhY2UgKiBzcHcKLSAgICAgICAgc3RyZXRjaCA9IHN0cmV0Y2ggKiBzcHcKLSAgICAgICAgdHVwbGUgPSAoZm9udCwgdGV4dCwgd2lkdGgsIHNwYWNlLCBzdHJldGNoLCBhc2NlbnQsIGRlc2NlbnQpCi0gICAgICAgIHNlbGYud29yZHMuYXBwZW5kKHR1cGxlKQotICAgICMKLSAgICAjIEhvb2tzIHRvIGJlZ2luIGFuZCBlbmQgYW5jaG9ycyAtLSBpbnNlcnQgbnVtYmVycyBpbiB0aGUgd29yZCBsaXN0IQotICAgIGRlZiBiZ25fYW5jaG9yKHNlbGYsIGlkKToKLSAgICAgICAgc2VsZi53b3Jkcy5hcHBlbmQoaWQpCi0gICAgIwotICAgIGRlZiBlbmRfYW5jaG9yKHNlbGYsIGlkKToKLSAgICAgICAgc2VsZi53b3Jkcy5hcHBlbmQoMCkKLSAgICAjCi0gICAgIyBSZXR1cm4gdGhlIHRvdGFsIGxlbmd0aCAod2lkdGgpIG9mIHRoZSB0ZXh0IGFkZGVkIHNvIGZhciwgaW4gcGl4ZWxzCi0gICAgZGVmIGdldGxlbmd0aChzZWxmKToKLSAgICAgICAgdG90YWwgPSAwCi0gICAgICAgIGZvciB3b3JkIGluIHNlbGYud29yZHM6Ci0gICAgICAgICAgICBpZiB0eXBlKHdvcmQpIGlzIG5vdCBJbnQ6Ci0gICAgICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIHdvcmRbMl0gKyB3b3JkWzNdCi0gICAgICAgIHJldHVybiB0b3RhbAotICAgICMKLSAgICAjIFRhYiB0byBhIGdpdmVuIHBvc2l0aW9uIChyZWxhdGl2ZSB0byB0aGUgY3VycmVudCBsZWZ0IGluZGVudCk6Ci0gICAgIyByZW1vdmUgYWxsIHN0cmV0Y2gsIGFkZCBmaXhlZCBzcGFjZSB1cCB0byB0aGUgbmV3IGluZGVudC4KLSAgICAjIElmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGFscmVhZHkgYXQgdGhlIHRhYiBzdG9wLAotICAgICMgZG9uJ3QgYWRkIGFueSBuZXcgc3BhY2UgKGJ1dCBzdGlsbCByZW1vdmUgdGhlIHN0cmV0Y2gpCi0gICAgZGVmIHRhYnRvKHNlbGYsIHRhYik6Ci0gICAgICAgIHRvdGFsID0gMAotICAgICAgICBhcywgZGUgPSAxLCAwCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLndvcmRzKSk6Ci0gICAgICAgICAgICB3b3JkID0gc2VsZi53b3Jkc1tpXQotICAgICAgICAgICAgaWYgdHlwZSh3b3JkKSBpcyBJbnQ6IGNvbnRpbnVlCi0gICAgICAgICAgICAoZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUpID0gd29yZAotICAgICAgICAgICAgc2VsZi53b3Jkc1tpXSA9IChmbywgdGUsIHdpLCBzcCwgMCwgYXMsIGRlKQotICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIHdpICsgc3AKLSAgICAgICAgaWYgdG90YWwgPCB0YWI6Ci0gICAgICAgICAgICBzZWxmLndvcmRzLmFwcGVuZCgoTm9uZSwgJycsIDAsIHRhYi10b3RhbCwgMCwgYXMsIGRlKSkKLSAgICAjCi0gICAgIyBNYWtlIGEgaGFuZ2luZyB0YWc6IHRhYiB0byBoYW5nLCBpbmNyZW1lbnQgaW5kZW50X2xlZnQgYnkgaGFuZywKLSAgICAjIGFuZCByZXNldCBpbmRlbnRfaGFuZyB0byAtaGFuZwotICAgIGRlZiBtYWtlaGFuZ2luZ3RhZyhzZWxmLCBoYW5nKToKLSAgICAgICAgc2VsZi50YWJ0byhoYW5nKQotICAgICAgICBzZWxmLmluZGVudF9sZWZ0ID0gc2VsZi5pbmRlbnRfbGVmdCArIGhhbmcKLSAgICAgICAgc2VsZi5pbmRlbnRfaGFuZyA9IC1oYW5nCi0gICAgIwotICAgICMgRGVjaWRlIHdoZXJlIHRoZSBsaW5lIGJyZWFrcyB3aWxsIGJlIGdpdmVuIHNvbWUgc2NyZWVuIHdpZHRoCi0gICAgZGVmIGxheW91dChzZWxmLCBsaW5ld2lkdGgpOgotICAgICAgICBzZWxmLndpZHRoID0gbGluZXdpZHRoCi0gICAgICAgIGhlaWdodCA9IDAKLSAgICAgICAgc2VsZi5saW5lcyA9IGxpbmVzID0gW10KLSAgICAgICAgYXZhaWwxID0gc2VsZi53aWR0aCAtIHNlbGYuaW5kZW50X2xlZnQgLSBzZWxmLmluZGVudF9yaWdodAotICAgICAgICBhdmFpbCA9IGF2YWlsMSAtIHNlbGYuaW5kZW50X2hhbmcKLSAgICAgICAgd29yZHMgPSBzZWxmLndvcmRzCi0gICAgICAgIGkgPSAwCi0gICAgICAgIG4gPSBsZW4od29yZHMpCi0gICAgICAgIGxhc3Rmb250ID0gTm9uZQotICAgICAgICB3aGlsZSBpIDwgbjoKLSAgICAgICAgICAgIGZpcnN0Zm9udCA9IGxhc3Rmb250Ci0gICAgICAgICAgICBjaGFyY291bnQgPSAwCi0gICAgICAgICAgICB3aWR0aCA9IDAKLSAgICAgICAgICAgIHN0cmV0Y2ggPSAwCi0gICAgICAgICAgICBhc2NlbnQgPSAwCi0gICAgICAgICAgICBkZXNjZW50ID0gMAotICAgICAgICAgICAgbHNwID0gMAotICAgICAgICAgICAgaiA9IGkKLSAgICAgICAgICAgIHdoaWxlIGkgPCBuOgotICAgICAgICAgICAgICAgIHdvcmQgPSB3b3Jkc1tpXQotICAgICAgICAgICAgICAgIGlmIHR5cGUod29yZCkgaXMgSW50OgotICAgICAgICAgICAgICAgICAgICBpZiB3b3JkID4gMCBhbmQgd2lkdGggPj0gYXZhaWw6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICBpID0gaSsxCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUgPSB3b3JkCi0gICAgICAgICAgICAgICAgaWYgd2lkdGggKyB3aSA+IGF2YWlsIGFuZCB3aWR0aCA+IDAgYW5kIHdpID4gMDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBpZiBmbyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgbGFzdGZvbnQgPSBmbwotICAgICAgICAgICAgICAgICAgICBpZiB3aWR0aCA9PSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rmb250ID0gZm8KLSAgICAgICAgICAgICAgICBjaGFyY291bnQgPSBjaGFyY291bnQgKyBsZW4odGUpICsgKHNwID4gMCkKLSAgICAgICAgICAgICAgICB3aWR0aCA9IHdpZHRoICsgd2kgKyBzcAotICAgICAgICAgICAgICAgIGxzcCA9IHNwCi0gICAgICAgICAgICAgICAgc3RyZXRjaCA9IHN0cmV0Y2ggKyBzdAotICAgICAgICAgICAgICAgIGxzdCA9IHN0Ci0gICAgICAgICAgICAgICAgYXNjZW50ID0gbWF4KGFzY2VudCwgYXMpCi0gICAgICAgICAgICAgICAgZGVzY2VudCA9IG1heChkZXNjZW50LCBkZSkKLSAgICAgICAgICAgICAgICBpID0gaSsxCi0gICAgICAgICAgICB3aGlsZSBpID4gaiBhbmQgdHlwZSh3b3Jkc1tpLTFdKSBpcyBJbnQgYW5kIFwKLSAgICAgICAgICAgICAgICAgICAgd29yZHNbaS0xXSA+IDA6IGkgPSBpLTEKLSAgICAgICAgICAgIHdpZHRoID0gd2lkdGggLSBsc3AKLSAgICAgICAgICAgIGlmIGkgPCBuOgotICAgICAgICAgICAgICAgIHN0cmV0Y2ggPSBzdHJldGNoIC0gbHN0Ci0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHN0cmV0Y2ggPSAwCi0gICAgICAgICAgICB0dXBsZSA9IGktaiwgZmlyc3Rmb250LCBjaGFyY291bnQsIHdpZHRoLCBzdHJldGNoLCBcCi0gICAgICAgICAgICAgICAgICAgIGFzY2VudCwgZGVzY2VudAotICAgICAgICAgICAgbGluZXMuYXBwZW5kKHR1cGxlKQotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ICsgYXNjZW50ICsgZGVzY2VudAotICAgICAgICAgICAgYXZhaWwgPSBhdmFpbDEKLSAgICAgICAgc2VsZi5oZWlnaHQgPSBoZWlnaHQKLSAgICAjCi0gICAgIyBDYWxsIGEgZnVuY3Rpb24gZm9yIGFsbCB3b3JkcyBpbiBhIGxpbmUKLSAgICBkZWYgdmlzaXQoc2VsZiwgd29yZGZ1bmMsIGFuY2hvcmZ1bmMpOgotICAgICAgICBhdmFpbDEgPSBzZWxmLndpZHRoIC0gc2VsZi5pbmRlbnRfbGVmdCAtIHNlbGYuaW5kZW50X3JpZ2h0Ci0gICAgICAgIGF2YWlsID0gYXZhaWwxIC0gc2VsZi5pbmRlbnRfaGFuZwotICAgICAgICB2ID0gc2VsZi50b3AKLSAgICAgICAgaSA9IDAKLSAgICAgICAgZm9yIHR1cGxlIGluIHNlbGYubGluZXM6Ci0gICAgICAgICAgICB3b3JkY291bnQsIGZpcnN0Zm9udCwgY2hhcmNvdW50LCB3aWR0aCwgc3RyZXRjaCwgXAotICAgICAgICAgICAgICAgICAgICBhc2NlbnQsIGRlc2NlbnQgPSB0dXBsZQotICAgICAgICAgICAgaCA9IHNlbGYubGVmdCArIHNlbGYuaW5kZW50X2xlZnQKLSAgICAgICAgICAgIGlmIGkgPT0gMDogaCA9IGggKyBzZWxmLmluZGVudF9oYW5nCi0gICAgICAgICAgICBleHRyYSA9IDAKLSAgICAgICAgICAgIGlmIHNlbGYuanVzdCA9PSAncic6IGggPSBoICsgYXZhaWwgLSB3aWR0aAotICAgICAgICAgICAgZWxpZiBzZWxmLmp1c3QgPT0gJ2MnOiBoID0gaCArIChhdmFpbCAtIHdpZHRoKSAvIDIKLSAgICAgICAgICAgIGVsaWYgc2VsZi5qdXN0ID09ICdscicgYW5kIHN0cmV0Y2ggPiAwOgotICAgICAgICAgICAgICAgIGV4dHJhID0gYXZhaWwgLSB3aWR0aAotICAgICAgICAgICAgdjIgPSB2ICsgYXNjZW50ICsgZGVzY2VudAotICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSwgaSt3b3JkY291bnQpOgotICAgICAgICAgICAgICAgIHdvcmQgPSBzZWxmLndvcmRzW2pdCi0gICAgICAgICAgICAgICAgaWYgdHlwZSh3b3JkKSBpcyBJbnQ6Ci0gICAgICAgICAgICAgICAgICAgIG9rID0gYW5jaG9yZnVuYyhzZWxmLCB0dXBsZSwgd29yZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgdikKLSAgICAgICAgICAgICAgICAgICAgaWYgb2sgaXMgbm90IE5vbmU6IHJldHVybiBvawotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIGZvLCB0ZSwgd2ksIHNwLCBzdCwgYXMsIGRlID0gd29yZAotICAgICAgICAgICAgICAgIGlmIGV4dHJhID4gMCBhbmQgc3RyZXRjaCA+IDA6Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gZXh0cmEgKiBzdCAvIHN0cmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSBleHRyYSAtIGV4Ci0gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2ggPSBzdHJldGNoIC0gc3QKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBleCA9IDAKLSAgICAgICAgICAgICAgICBoMiA9IGggKyB3aSArIHNwICsgZXgKLSAgICAgICAgICAgICAgICBvayA9IHdvcmRmdW5jKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBoMiwgdjIsIChqPT1pKSwgKGo9PWkrd29yZGNvdW50LTEpKQotICAgICAgICAgICAgICAgIGlmIG9rIGlzIG5vdCBOb25lOiByZXR1cm4gb2sKLSAgICAgICAgICAgICAgICBoID0gaDIKLSAgICAgICAgICAgIHYgPSB2MgotICAgICAgICAgICAgaSA9IGkgKyB3b3JkY291bnQKLSAgICAgICAgICAgIGF2YWlsID0gYXZhaWwxCi0gICAgIwotICAgICMgUmVuZGVyIGEgcGFyYWdyYXBoIGluICJkcmF3aW5nIG9iamVjdCIgZCwgdXNpbmcgdGhlIHJlY3RhbmdsZQotICAgICMgZ2l2ZW4gYnkgKGxlZnQsIHRvcCwgcmlnaHQpIHdpdGggYW4gdW5zcGVjaWZpZWQgYm90dG9tLgotICAgICMgUmV0dXJuIHRoZSBjb21wdXRlZCBib3R0b20gb2YgdGhlIHRleHQuCi0gICAgZGVmIHJlbmRlcihzZWxmLCBkLCBsZWZ0LCB0b3AsIHJpZ2h0KToKLSAgICAgICAgaWYgc2VsZi53aWR0aCAhPSByaWdodC1sZWZ0OgotICAgICAgICAgICAgc2VsZi5sYXlvdXQocmlnaHQtbGVmdCkKLSAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdAotICAgICAgICBzZWxmLnRvcCA9IHRvcAotICAgICAgICBzZWxmLnJpZ2h0ID0gcmlnaHQKLSAgICAgICAgc2VsZi5ib3R0b20gPSBzZWxmLnRvcCArIHNlbGYuaGVpZ2h0Ci0gICAgICAgIHNlbGYuYW5jaG9yaWQgPSAwCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuZCA9IGQKLSAgICAgICAgICAgIHNlbGYudmlzaXQoc2VsZi5fX2NsYXNzX18uX3JlbmRlcndvcmQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX3JlbmRlcmFuY2hvcikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHNlbGYuZCA9IE5vbmUKLSAgICAgICAgcmV0dXJuIHNlbGYuYm90dG9tCi0gICAgIwotICAgIGRlZiBfcmVuZGVyd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaCwgdiwgaDIsIHYyLCBpc2ZpcnN0LCBpc2xhc3QpOgotICAgICAgICBpZiB3b3JkWzBdIGlzIG5vdCBOb25lOiBzZWxmLmQuc2V0Zm9udCh3b3JkWzBdKQotICAgICAgICBiYXNlbGluZSA9IHYgKyB0dXBsZVs1XQotICAgICAgICBzZWxmLmQudGV4dCgoaCwgYmFzZWxpbmUgLSB3b3JkWzVdKSwgd29yZFsxXSkKLSAgICAgICAgaWYgc2VsZi5hbmNob3JpZCA+IDA6Ci0gICAgICAgICAgICBzZWxmLmQubGluZSgoaCwgYmFzZWxpbmUrMiksIChoMiwgYmFzZWxpbmUrMikpCi0gICAgIwotICAgIGRlZiBfcmVuZGVyYW5jaG9yKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2KToKLSAgICAgICAgc2VsZi5hbmNob3JpZCA9IHdvcmQKLSAgICAjCi0gICAgIyBSZXR1cm4gd2hpY2ggYW5jaG9yKHMpIHdhcyBoaXQgYnkgdGhlIG1vdXNlCi0gICAgZGVmIGhpdGNoZWNrKHNlbGYsIG1vdXNlaCwgbW91c2V2KToKLSAgICAgICAgc2VsZi5tb3VzZWggPSBtb3VzZWgKLSAgICAgICAgc2VsZi5tb3VzZXYgPSBtb3VzZXYKLSAgICAgICAgc2VsZi5hbmNob3JpZCA9IDAKLSAgICAgICAgc2VsZi5oaXRzID0gW10KLSAgICAgICAgc2VsZi52aXNpdChzZWxmLl9fY2xhc3NfXy5faGl0Y2hlY2t3b3JkLCBcCi0gICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX2hpdGNoZWNrYW5jaG9yKQotICAgICAgICByZXR1cm4gc2VsZi5oaXRzCi0gICAgIwotICAgIGRlZiBfaGl0Y2hlY2t3b3JkKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2LCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6Ci0gICAgICAgIGlmIHNlbGYuYW5jaG9yaWQgPiAwIGFuZCBoIDw9IHNlbGYubW91c2VoIDw9IGgyIGFuZCBcCi0gICAgICAgICAgICAgICAgdiA8PSBzZWxmLm1vdXNldiA8PSB2MjoKLSAgICAgICAgICAgIHNlbGYuaGl0cy5hcHBlbmQoc2VsZi5hbmNob3JpZCkKLSAgICAjCi0gICAgZGVmIF9oaXRjaGVja2FuY2hvcihzZWxmLCB0dXBsZSwgd29yZCwgaCwgdik6Ci0gICAgICAgIHNlbGYuYW5jaG9yaWQgPSB3b3JkCi0gICAgIwotICAgICMgUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGFuY2hvciBpZCBpcyBwcmVzZW50Ci0gICAgZGVmIGhhc2FuY2hvcihzZWxmLCBpZCk6Ci0gICAgICAgIHJldHVybiBpZCBpbiBzZWxmLndvcmRzIG9yIC1pZCBpbiBzZWxmLndvcmRzCi0gICAgIwotICAgICMgRXh0cmFjdCB0aGUgcmF3IHRleHQgZnJvbSB0aGUgd29yZCBsaXN0LCBzdWJzdGl0dXRpbmcgb25lIHNwYWNlCi0gICAgIyBmb3Igbm9uLWVtcHR5IGludGVyLXdvcmQgc3BhY2UsIGFuZCB0ZXJtaW5hdGluZyB3aXRoICdcbicKLSAgICBkZWYgZXh0cmFjdChzZWxmKToKLSAgICAgICAgdGV4dCA9ICcnCi0gICAgICAgIGZvciB3IGluIHNlbGYud29yZHM6Ci0gICAgICAgICAgICBpZiB0eXBlKHcpIGlzIG5vdCBJbnQ6Ci0gICAgICAgICAgICAgICAgd29yZCA9IHdbMV0KLSAgICAgICAgICAgICAgICBpZiB3WzNdOiB3b3JkID0gd29yZCArICcgJwotICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgd29yZAotICAgICAgICByZXR1cm4gdGV4dCArICdcbicKLSAgICAjCi0gICAgIyBSZXR1cm4gd2hpY2ggY2hhcmFjdGVyIHBvc2l0aW9uIHdhcyBoaXQgYnkgdGhlIG1vdXNlLCBhcwotICAgICMgYW4gb2Zmc2V0IGluIHRoZSBlbnRpcmUgdGV4dCBhcyByZXR1cm5lZCBieSBleHRyYWN0KCkuCi0gICAgIyBSZXR1cm4gTm9uZSBpZiB0aGUgbW91c2Ugd2FzIG5vdCBpbiB0aGlzIHBhcmFncmFwaAotICAgIGRlZiB3aGVyZWlzKHNlbGYsIGQsIG1vdXNlaCwgbW91c2V2KToKLSAgICAgICAgaWYgbW91c2V2IDwgc2VsZi50b3Agb3IgbW91c2V2ID4gc2VsZi5ib3R0b206Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICBzZWxmLm1vdXNlaCA9IG1vdXNlaAotICAgICAgICBzZWxmLm1vdXNldiA9IG1vdXNldgotICAgICAgICBzZWxmLmxhc3Rmb250ID0gTm9uZQotICAgICAgICBzZWxmLmNoYXJjb3VudCA9IDAKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5kID0gZAotICAgICAgICAgICAgcmV0dXJuIHNlbGYudmlzaXQoc2VsZi5fX2NsYXNzX18uX3doZXJlaXN3b3JkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fd2hlcmVpc2FuY2hvcikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHNlbGYuZCA9IE5vbmUKLSAgICAjCi0gICAgZGVmIF93aGVyZWlzd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaDEsIHYxLCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6Ci0gICAgICAgIGZvLCB0ZSwgd2ksIHNwLCBzdCwgYXMsIGRlID0gd29yZAotICAgICAgICBpZiBmbyBpcyBub3QgTm9uZTogc2VsZi5sYXN0Zm9udCA9IGZvCi0gICAgICAgIGggPSBoMQotICAgICAgICBpZiBpc2ZpcnN0OiBoMSA9IDAKLSAgICAgICAgaWYgaXNsYXN0OiBoMiA9IDk5OTk5OQotICAgICAgICBpZiBub3QgKHYxIDw9IHNlbGYubW91c2V2IDw9IHYyIGFuZCBoMSA8PSBzZWxmLm1vdXNlaCA8PSBoMik6Ci0gICAgICAgICAgICBzZWxmLmNoYXJjb3VudCA9IHNlbGYuY2hhcmNvdW50ICsgbGVuKHRlKSArIChzcCA+IDApCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgc2VsZi5sYXN0Zm9udCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuZC5zZXRmb250KHNlbGYubGFzdGZvbnQpCi0gICAgICAgIGNjID0gMAotICAgICAgICBmb3IgYyBpbiB0ZToKLSAgICAgICAgICAgIGN3ID0gc2VsZi5kLnRleHR3aWR0aChjKQotICAgICAgICAgICAgaWYgc2VsZi5tb3VzZWggPD0gaCArIGN3LzI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcmNvdW50ICsgY2MKLSAgICAgICAgICAgIGNjID0gY2MrMQotICAgICAgICAgICAgaCA9IGgrY3cKLSAgICAgICAgc2VsZi5jaGFyY291bnQgPSBzZWxmLmNoYXJjb3VudCArIGNjCi0gICAgICAgIGlmIHNlbGYubW91c2VoIDw9IChoK2gyKSAvIDI6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5jaGFyY291bnQKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmNoYXJjb3VudCArIDEKLSAgICAjCi0gICAgZGVmIF93aGVyZWlzYW5jaG9yKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2KToKLSAgICAgICAgcGFzcwotICAgICMKLSAgICAjIFJldHVybiBzY3JlZW4gcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byBwb3NpdGlvbiBpbiBwYXJhZ3JhcGguCi0gICAgIyBSZXR1cm4gdHVwbGUgKGgsIHZ0b3AsIHZiYXNlbGluZSwgdmJvdHRvbSkuCi0gICAgIyBUaGlzIGlzIG1vcmUgb3IgbGVzcyB0aGUgaW52ZXJzZSBvZiB3aGVyZWlzKCkKLSAgICBkZWYgc2NyZWVucG9zKHNlbGYsIGQsIHBvcyk6Ci0gICAgICAgIGlmIHBvcyA8IDA6Ci0gICAgICAgICAgICBhc2NlbnQsIGRlc2NlbnQgPSBzZWxmLmxpbmVzWzBdWzU6N10KLSAgICAgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYudG9wLCBzZWxmLnRvcCArIGFzY2VudCwgXAotICAgICAgICAgICAgICAgICAgICBzZWxmLnRvcCArIGFzY2VudCArIGRlc2NlbnQKLSAgICAgICAgc2VsZi5wb3MgPSBwb3MKLSAgICAgICAgc2VsZi5sYXN0Zm9udCA9IE5vbmUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5kID0gZAotICAgICAgICAgICAgb2sgPSBzZWxmLnZpc2l0KHNlbGYuX19jbGFzc19fLl9zY3JlZW5wb3N3b3JkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX3NjcmVlbnBvc2FuY2hvcikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHNlbGYuZCA9IE5vbmUKLSAgICAgICAgaWYgb2sgaXMgTm9uZToKLSAgICAgICAgICAgIGFzY2VudCwgZGVzY2VudCA9IHNlbGYubGluZXNbLTFdWzU6N10KLSAgICAgICAgICAgIG9rID0gc2VsZi5yaWdodCwgc2VsZi5ib3R0b20gLSBhc2NlbnQgLSBkZXNjZW50LCBcCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYm90dG9tIC0gZGVzY2VudCwgc2VsZi5ib3R0b20KLSAgICAgICAgcmV0dXJuIG9rCi0gICAgIwotICAgIGRlZiBfc2NyZWVucG9zd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaDEsIHYxLCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6Ci0gICAgICAgIGZvLCB0ZSwgd2ksIHNwLCBzdCwgYXMsIGRlID0gd29yZAotICAgICAgICBpZiBmbyBpcyBub3QgTm9uZTogc2VsZi5sYXN0Zm9udCA9IGZvCi0gICAgICAgIGNjID0gbGVuKHRlKSArIChzcCA+IDApCi0gICAgICAgIGlmIHNlbGYucG9zID4gY2M6Ci0gICAgICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zIC0gY2MKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzZWxmLnBvcyA8IGNjOgotICAgICAgICAgICAgc2VsZi5kLnNldGZvbnQoc2VsZi5sYXN0Zm9udCkKLSAgICAgICAgICAgIGggPSBoMSArIHNlbGYuZC50ZXh0d2lkdGgodGVbOnNlbGYucG9zXSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGggPSBoMgotICAgICAgICBhc2NlbnQsIGRlc2NlbnQgPSB0dXBsZVs1OjddCi0gICAgICAgIHJldHVybiBoLCB2MSwgdjErYXNjZW50LCB2MgotICAgICMKLSAgICBkZWYgX3NjcmVlbnBvc2FuY2hvcihzZWxmLCB0dXBsZSwgd29yZCwgaCwgdik6Ci0gICAgICAgIHBhc3MKLSAgICAjCi0gICAgIyBJbnZlcnQgdGhlIHN0cmV0Y2ggb2YgdGV4dCBiZXR3ZWVuIHBvczEgYW5kIHBvczIuCi0gICAgIyBJZiBwb3MxIGlzIE5vbmUsIHRoZSBiZWdpbm5pbmcgaXMgaW1wbGllZDsKLSAgICAjIGlmIHBvczIgaXMgTm9uZSwgdGhlIGVuZCBpcyBpbXBsaWVkLgotICAgICMgVW5kb2VzIGl0cyBvd24gZWZmZWN0IHdoZW4gY2FsbGVkIGFnYWluIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzCi0gICAgZGVmIGludmVydChzZWxmLCBkLCBwb3MxLCBwb3MyKToKLSAgICAgICAgaWYgcG9zMSBpcyBOb25lOgotICAgICAgICAgICAgcG9zMSA9IHNlbGYubGVmdCwgc2VsZi50b3AsIHNlbGYudG9wLCBzZWxmLnRvcAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcG9zMSA9IHNlbGYuc2NyZWVucG9zKGQsIHBvczEpCi0gICAgICAgIGlmIHBvczIgaXMgTm9uZToKLSAgICAgICAgICAgIHBvczIgPSBzZWxmLnJpZ2h0LCBzZWxmLmJvdHRvbSxzZWxmLmJvdHRvbSxzZWxmLmJvdHRvbQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcG9zMiA9IHNlbGYuc2NyZWVucG9zKGQsIHBvczIpCi0gICAgICAgIGgxLCB0b3AxLCBiYXNlbGluZTEsIGJvdHRvbTEgPSBwb3MxCi0gICAgICAgIGgyLCB0b3AyLCBiYXNlbGluZTIsIGJvdHRvbTIgPSBwb3MyCi0gICAgICAgIGlmIGJvdHRvbTEgPD0gdG9wMjoKLSAgICAgICAgICAgIGQuaW52ZXJ0KChoMSwgdG9wMSksIChzZWxmLnJpZ2h0LCBib3R0b20xKSkKLSAgICAgICAgICAgIGgxID0gc2VsZi5sZWZ0Ci0gICAgICAgICAgICBpZiBib3R0b20xIDwgdG9wMjoKLSAgICAgICAgICAgICAgICBkLmludmVydCgoaDEsIGJvdHRvbTEpLCAoc2VsZi5yaWdodCwgdG9wMikpCi0gICAgICAgICAgICB0b3AxLCBib3R0b20xID0gdG9wMiwgYm90dG9tMgotICAgICAgICBkLmludmVydCgoaDEsIHRvcDEpLCAoaDIsIGJvdHRvbTIpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvYWRkcGFjay5weSBiL0xpYi9saWItb2xkL2FkZHBhY2sucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjI2MDEuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvYWRkcGFjay5weQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMgVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3RhbmRhcmQgc3VwcG9ydCBmb3IgInBhY2thZ2VzIi4KLSMKLSMgVGhlIGlkZWEgaXMgdGhhdCBsYXJnZSBncm91cHMgb2YgcmVsYXRlZCBtb2R1bGVzIGNhbiBiZSBwbGFjZWQgaW4KLSMgdGhlaXIgb3duIHN1YmRpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIGFkZGVkIHRvIHRoZSBQeXRob24gc2VhcmNoIHBhdGgKLSMgaW4gYSByZWxhdGl2ZWx5IGVhc3kgd2F5LgotIwotIyBUaGUgY3VycmVudCB2ZXJzaW9uIHRha2VzIGEgcGFja2FnZSBuYW1lIGFuZCBzZWFyY2hlcyB0aGUgUHl0aG9uCi0jIHNlYXJjaCBwYXRoIGZvciBhIGRpcmVjdG9yeSBieSB0aGF0IG5hbWUsIGFuZCBpZiBmb3VuZCBhZGRzIGl0IHRvCi0jIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGggKHN5cy5wYXRoKS4gIEl0IG1haW50YWlucyBhIGxpc3Qgb2YgcGFja2FnZXMKLSMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCBzbyBhZGRpbmcgdGhlIHNhbWUgcGFja2FnZSBtYW55IHRpbWVzCi0jIGlzIE9LLgotIwotIyBJdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGEgZmFpcmx5IHN0eWxpemVkIG1hbm5lcjogZWFjaCBtb2R1bGUKLSMgdGhhdCB3YW50cyB0byB1c2UgYSBwYXJ0aWN1bGFyIHBhY2thZ2UsIHNheSAnRm9vJywgaXMgc3VwcG9zZWQgdG8KLSMgY29udGFpbiB0aGUgZm9sbG93aW5nIGNvZGU6Ci0jCi0jICAgZnJvbSBhZGRwYWNrIGltcG9ydCBhZGRwYWNrCi0jICAgYWRkcGFjaygnRm9vJykKLSMgICA8aW1wb3J0IG1vZHVsZXMgZnJvbSBwYWNrYWdlIEZvbz4KLSMKLSMgQWRkaXRpb25hbCBhcmd1bWVudHMsIHdoZW4gcHJlc2VudCwgcHJvdmlkZSBhZGRpdGlvbmFsIHBsYWNlcyB3aGVyZQotIyB0byBsb29rIGZvciB0aGUgcGFja2FnZSBiZWZvcmUgdHJ5aW5nIHN5cy5wYXRoICh0aGVzZSBtYXkgYmUgZWl0aGVyCi0jIHN0cmluZ3Mgb3IgbGlzdHMvdHVwbGVzIG9mIHN0cmluZ3MpLiAgQWxzbywgaWYgdGhlIHBhY2thZ2UgbmFtZSBpcyBhCi0jIGZ1bGwgcGF0aG5hbWUsIGZpcnN0IHRoZSBsYXN0IGNvbXBvbmVudCBpcyB0cmllZCBpbiB0aGUgdXN1YWwgd2F5LAotIyB0aGVuIHRoZSBmdWxsIHBhdGhuYW1lIGlzIHRyaWVkIGxhc3QuICBJZiB0aGUgcGFja2FnZSBuYW1lIGlzIGEKLSMgKnJlbGF0aXZlKiBwYXRobmFtZSAoVU5JWDogY29udGFpbnMgYSBzbGFzaCBidXQgZG9lc24ndCBzdGFydCB3aXRoCi0jIG9uZSksIHRoZW4gbm90aGluZyBzcGVjaWFsIGlzIGRvbmUuICBUaGUgcGFja2FnZXMgIi9mb28vYmFyL2JsZXRjaCIKLSMgYW5kICJibGV0Y2giIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lLCBidXQgdW5yZWxhdGVkIHRvICJiYXIvYmxldGNoIi4KLSMKLSMgSWYgdGhlIGFsZ29yaXRobSBmaW5kcyBtb3JlIHRoYW4gb25lIHN1aXRhYmxlIHN1YmRpcmVjdG9yeSwgYWxsIGFyZQotIyBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggLS0gdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBvdmVycmlkZSBwYXJ0Ci0jIG9mIGEgcGFja2FnZS4gIFRoZSBzYW1lIHBhdGggd2lsbCBub3QgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0jCi0jIElmIG5vIGRpcmVjdG9yeSBpcyBmb3VuZCwgSW1wb3J0RXJyb3IgaXMgcmFpc2VkLgotCi1fcGFja3MgPSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB7cGFjazogW3BhdGhuYW1lLCAuLi5dLCAuLi59Ci0KLWRlZiBhZGRwYWNrKHBhY2ssICpsb2NhdGlvbnMpOgotICAgIGltcG9ydCBvcwotICAgIGlmIG9zLnBhdGguaXNhYnMocGFjayk6Ci0gICAgICAgIGJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lKHBhY2spCi0gICAgZWxzZToKLSAgICAgICAgYmFzZSA9IHBhY2sKLSAgICBpZiBfcGFja3MuaGFzX2tleShiYXNlKToKLSAgICAgICAgcmV0dXJuCi0gICAgaW1wb3J0IHN5cwotICAgIHBhdGggPSBbXQotICAgIGZvciBsb2MgaW4gX2ZsYXR0ZW4obG9jYXRpb25zKSArIHN5cy5wYXRoOgotICAgICAgICBmbiA9IG9zLnBhdGguam9pbihsb2MsIGJhc2UpCi0gICAgICAgIGlmIGZuIG5vdCBpbiBwYXRoIGFuZCBvcy5wYXRoLmlzZGlyKGZuKToKLSAgICAgICAgICAgIHBhdGguYXBwZW5kKGZuKQotICAgIGlmIHBhY2sgIT0gYmFzZSBhbmQgcGFjayBub3QgaW4gcGF0aCBhbmQgb3MucGF0aC5pc2RpcihwYWNrKToKLSAgICAgICAgcGF0aC5hcHBlbmQocGFjaykKLSAgICBpZiBub3QgcGF0aDogcmFpc2UgSW1wb3J0RXJyb3IsICdwYWNrYWdlICcgKyBwYWNrICsgJyBub3QgZm91bmQnCi0gICAgX3BhY2tzW2Jhc2VdID0gcGF0aAotICAgIGZvciBmbiBpbiBwYXRoOgotICAgICAgICBpZiBmbiBub3QgaW4gc3lzLnBhdGg6Ci0gICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQoZm4pCi0KLWRlZiBfZmxhdHRlbihsb2NhdGlvbnMpOgotICAgIGxvY3MgPSBbXQotICAgIGZvciBsb2MgaW4gbG9jYXRpb25zOgotICAgICAgICBpZiB0eXBlKGxvYykgPT0gdHlwZSgnJyk6Ci0gICAgICAgICAgICBsb2NzLmFwcGVuZChsb2MpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsb2NzID0gbG9jcyArIF9mbGF0dGVuKGxvYykKLSAgICByZXR1cm4gbG9jcwpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvY21wLnB5IGIvTGliL2xpYi1vbGQvY21wLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQ2YTI1Li4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2NtcC5weQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSIiIkVmZmljaWVudGx5IGNvbXBhcmUgZmlsZXMsIGJvb2xlYW4gb3V0Y29tZSBvbmx5IChlcXVhbCAvIG5vdCBlcXVhbCkuCi0KLVRyaWNrcyAodXNlZCBpbiB0aGlzIG9yZGVyKToKLSAgICAtIEZpbGVzIHdpdGggaWRlbnRpY2FsIHR5cGUsIHNpemUgJiBtdGltZSBhcmUgYXNzdW1lZCB0byBiZSBjbG9uZXMKLSAgICAtIEZpbGVzIHdpdGggZGlmZmVyZW50IHR5cGUgb3Igc2l6ZSBjYW5ub3QgYmUgaWRlbnRpY2FsCi0gICAgLSBXZSBrZWVwIGEgY2FjaGUgb2Ygb3V0Y29tZXMgb2YgZWFybGllciBjb21wYXJpc29ucwotICAgIC0gV2UgZG9uJ3QgZm9yayBhIHByb2Nlc3MgdG8gcnVuICdjbXAnIGJ1dCByZWFkIHRoZSBmaWxlcyBvdXJzZWx2ZXMKLSIiIgotCi1pbXBvcnQgb3MKLQotY2FjaGUgPSB7fQotCi1kZWYgY21wKGYxLCBmMiwgc2hhbGxvdz0xKToKLSAgICAiIiJDb21wYXJlIHR3byBmaWxlcywgdXNlIHRoZSBjYWNoZSBpZiBwb3NzaWJsZS4KLSAgICBSZXR1cm4gMSBmb3IgaWRlbnRpY2FsIGZpbGVzLCAwIGZvciBkaWZmZXJlbnQuCi0gICAgUmFpc2UgZXhjZXB0aW9ucyBpZiBlaXRoZXIgZmlsZSBjb3VsZCBub3QgYmUgc3RhdHRlZCwgcmVhZCwgZXRjLiIiIgotICAgIHMxLCBzMiA9IHNpZyhvcy5zdGF0KGYxKSksIHNpZyhvcy5zdGF0KGYyKSkKLSAgICBpZiBzMVswXSAhPSA4IG9yIHMyWzBdICE9IDg6Ci0gICAgICAgICMgRWl0aGVyIGlzIGEgbm90IGEgcGxhaW4gZmlsZSAtLSBhbHdheXMgcmVwb3J0IGFzIGRpZmZlcmVudAotICAgICAgICByZXR1cm4gMAotICAgIGlmIHNoYWxsb3cgYW5kIHMxID09IHMyOgotICAgICAgICAjIHR5cGUsIHNpemUgJiBtdGltZSBtYXRjaCAtLSByZXBvcnQgc2FtZQotICAgICAgICByZXR1cm4gMQotICAgIGlmIHMxWzoyXSAhPSBzMls6Ml06ICMgVHlwZXMgb3Igc2l6ZXMgZGlmZmVyLCBkb24ndCBib3RoZXIKLSAgICAgICAgIyB0eXBlcyBvciBzaXplcyBkaWZmZXIgLS0gcmVwb3J0IGRpZmZlcmVudAotICAgICAgICByZXR1cm4gMAotICAgICMgc2FtZSB0eXBlIGFuZCBzaXplIC0tIGxvb2sgaW4gdGhlIGNhY2hlCi0gICAga2V5ID0gKGYxLCBmMikKLSAgICB0cnk6Ci0gICAgICAgIGNzMSwgY3MyLCBvdXRjb21lID0gY2FjaGVba2V5XQotICAgICAgICAjIGNhY2hlIGhpdAotICAgICAgICBpZiBzMSA9PSBjczEgYW5kIHMyID09IGNzMjoKLSAgICAgICAgICAgICMgY2FjaGVkIHNpZ25hdHVyZXMgbWF0Y2gKLSAgICAgICAgICAgIHJldHVybiBvdXRjb21lCi0gICAgICAgICMgc3RhbGUgY2FjaGVkIHNpZ25hdHVyZShzKQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgIyBjYWNoZSBtaXNzCi0gICAgICAgIHBhc3MKLSAgICAjIHJlYWxseSBjb21wYXJlCi0gICAgb3V0Y29tZSA9IGRvX2NtcChmMSwgZjIpCi0gICAgY2FjaGVba2V5XSA9IHMxLCBzMiwgb3V0Y29tZQotICAgIHJldHVybiBvdXRjb21lCi0KLWRlZiBzaWcoc3QpOgotICAgICIiIlJldHVybiBzaWduYXR1cmUgKGkuZS4sIHR5cGUsIHNpemUsIG10aW1lKSBmcm9tIHJhdyBzdGF0IGRhdGEKLSAgICAwLTU6IHN0X21vZGUsIHN0X2lubywgc3RfZGV2LCBzdF9ubGluaywgc3RfdWlkLCBzdF9naWQKLSAgICA2LTk6IHN0X3NpemUsIHN0X2F0aW1lLCBzdF9tdGltZSwgc3RfY3RpbWUiIiIKLSAgICB0eXBlID0gc3RbMF0gLyA0MDk2Ci0gICAgc2l6ZSA9IHN0WzZdCi0gICAgbXRpbWUgPSBzdFs4XQotICAgIHJldHVybiB0eXBlLCBzaXplLCBtdGltZQotCi1kZWYgZG9fY21wKGYxLCBmMik6Ci0gICAgIiIiQ29tcGFyZSB0d28gZmlsZXMsIHJlYWxseS4iIiIKLSAgICBidWZzaXplID0gOCoxMDI0ICMgQ291bGQgYmUgdHVuZWQKLSAgICBmcDEgPSBvcGVuKGYxLCAncmInKQotICAgIGZwMiA9IG9wZW4oZjIsICdyYicpCi0gICAgd2hpbGUgMToKLSAgICAgICAgYjEgPSBmcDEucmVhZChidWZzaXplKQotICAgICAgICBiMiA9IGZwMi5yZWFkKGJ1ZnNpemUpCi0gICAgICAgIGlmIGIxICE9IGIyOiByZXR1cm4gMAotICAgICAgICBpZiBub3QgYjE6IHJldHVybiAxCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9jbXBjYWNoZS5weSBiL0xpYi9saWItb2xkL2NtcGNhY2hlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU0MGY4Li4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2NtcGNhY2hlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotIiIiRWZmaWNpZW50bHkgY29tcGFyZSBmaWxlcywgYm9vbGVhbiBvdXRjb21lIG9ubHkgKGVxdWFsIC8gbm90IGVxdWFsKS4KLQotVHJpY2tzICh1c2VkIGluIHRoaXMgb3JkZXIpOgotICAgIC0gVXNlIHRoZSBzdGF0Y2FjaGUgbW9kdWxlIHRvIGF2b2lkIHN0YXR0aW5nIGZpbGVzIG1vcmUgdGhhbiBvbmNlCi0gICAgLSBGaWxlcyB3aXRoIGlkZW50aWNhbCB0eXBlLCBzaXplICYgbXRpbWUgYXJlIGFzc3VtZWQgdG8gYmUgY2xvbmVzCi0gICAgLSBGaWxlcyB3aXRoIGRpZmZlcmVudCB0eXBlIG9yIHNpemUgY2Fubm90IGJlIGlkZW50aWNhbAotICAgIC0gV2Uga2VlcCBhIGNhY2hlIG9mIG91dGNvbWVzIG9mIGVhcmxpZXIgY29tcGFyaXNvbnMKLSAgICAtIFdlIGRvbid0IGZvcmsgYSBwcm9jZXNzIHRvIHJ1biAnY21wJyBidXQgcmVhZCB0aGUgZmlsZXMgb3Vyc2VsdmVzCi0iIiIKLQotaW1wb3J0IG9zCi1mcm9tIHN0YXQgaW1wb3J0ICoKLWltcG9ydCBzdGF0Y2FjaGUKLQotCi0jIFRoZSBjYWNoZS4KLSMKLWNhY2hlID0ge30KLQotCi1kZWYgY21wKGYxLCBmMiwgc2hhbGxvdz0xKToKLSAgICAiIiJDb21wYXJlIHR3byBmaWxlcywgdXNlIHRoZSBjYWNoZSBpZiBwb3NzaWJsZS4KLSAgICBNYXkgcmFpc2Ugb3MuZXJyb3IgaWYgYSBzdGF0IG9yIG9wZW4gb2YgZWl0aGVyIGZhaWxzLgotICAgIFJldHVybiAxIGZvciBpZGVudGljYWwgZmlsZXMsIDAgZm9yIGRpZmZlcmVudC4KLSAgICBSYWlzZSBleGNlcHRpb25zIGlmIGVpdGhlciBmaWxlIGNvdWxkIG5vdCBiZSBzdGF0dGVkLCByZWFkLCBldGMuIiIiCi0gICAgczEsIHMyID0gc2lnKHN0YXRjYWNoZS5zdGF0KGYxKSksIHNpZyhzdGF0Y2FjaGUuc3RhdChmMikpCi0gICAgaWYgbm90IFNfSVNSRUcoczFbMF0pIG9yIG5vdCBTX0lTUkVHKHMyWzBdKToKLSAgICAgICAgIyBFaXRoZXIgaXMgYSBub3QgYSBwbGFpbiBmaWxlIC0tIGFsd2F5cyByZXBvcnQgYXMgZGlmZmVyZW50Ci0gICAgICAgIHJldHVybiAwCi0gICAgaWYgc2hhbGxvdyBhbmQgczEgPT0gczI6Ci0gICAgICAgICMgdHlwZSwgc2l6ZSAmIG10aW1lIG1hdGNoIC0tIHJlcG9ydCBzYW1lCi0gICAgICAgIHJldHVybiAxCi0gICAgaWYgczFbOjJdICE9IHMyWzoyXTogIyBUeXBlcyBvciBzaXplcyBkaWZmZXIsIGRvbid0IGJvdGhlcgotICAgICAgICAjIHR5cGVzIG9yIHNpemVzIGRpZmZlciAtLSByZXBvcnQgZGlmZmVyZW50Ci0gICAgICAgIHJldHVybiAwCi0gICAgIyBzYW1lIHR5cGUgYW5kIHNpemUgLS0gbG9vayBpbiB0aGUgY2FjaGUKLSAgICBrZXkgPSBmMSArICcgJyArIGYyCi0gICAgaWYgY2FjaGUuaGFzX2tleShrZXkpOgotICAgICAgICBjczEsIGNzMiwgb3V0Y29tZSA9IGNhY2hlW2tleV0KLSAgICAgICAgIyBjYWNoZSBoaXQKLSAgICAgICAgaWYgczEgPT0gY3MxIGFuZCBzMiA9PSBjczI6Ci0gICAgICAgICAgICAjIGNhY2hlZCBzaWduYXR1cmVzIG1hdGNoCi0gICAgICAgICAgICByZXR1cm4gb3V0Y29tZQotICAgICAgICAjIHN0YWxlIGNhY2hlZCBzaWduYXR1cmUocykKLSAgICAjIHJlYWxseSBjb21wYXJlCi0gICAgb3V0Y29tZSA9IGRvX2NtcChmMSwgZjIpCi0gICAgY2FjaGVba2V5XSA9IHMxLCBzMiwgb3V0Y29tZQotICAgIHJldHVybiBvdXRjb21lCi0KLWRlZiBzaWcoc3QpOgotICAgICIiIlJldHVybiBzaWduYXR1cmUgKGkuZS4sIHR5cGUsIHNpemUsIG10aW1lKSBmcm9tIHJhdyBzdGF0IGRhdGEuIiIiCi0gICAgcmV0dXJuIFNfSUZNVChzdFtTVF9NT0RFXSksIHN0W1NUX1NJWkVdLCBzdFtTVF9NVElNRV0KLQotZGVmIGRvX2NtcChmMSwgZjIpOgotICAgICIiIkNvbXBhcmUgdHdvIGZpbGVzLCByZWFsbHkuIiIiCi0gICAgI3ByaW50ICcgICAgY21wJywgZjEsIGYyICMgWFhYIHJlbW92ZSB3aGVuIGRlYnVnZ2VkCi0gICAgYnVmc2l6ZSA9IDgqMTAyNCAjIENvdWxkIGJlIHR1bmVkCi0gICAgZnAxID0gb3BlbihmMSwgJ3JiJykKLSAgICBmcDIgPSBvcGVuKGYyLCAncmInKQotICAgIHdoaWxlIDE6Ci0gICAgICAgIGIxID0gZnAxLnJlYWQoYnVmc2l6ZSkKLSAgICAgICAgYjIgPSBmcDIucmVhZChidWZzaXplKQotICAgICAgICBpZiBiMSAhPSBiMjogcmV0dXJuIDAKLSAgICAgICAgaWYgbm90IGIxOiByZXR1cm4gMQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvY29kZWhhY2sucHkgYi9MaWIvbGliLW9sZC9jb2RlaGFjay5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1ZTNhMS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9jb2RlaGFjay5weQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSMgQSBzdWJyb3V0aW5lIGZvciBleHRyYWN0aW5nIGEgZnVuY3Rpb24gbmFtZSBmcm9tIGEgY29kZSBvYmplY3QKLSMgKHdpdGggY2FjaGUpCi0KLWltcG9ydCBzeXMKLWZyb20gc3RhdCBpbXBvcnQgKgotaW1wb3J0IHN0cmluZwotaW1wb3J0IG9zCi1pbXBvcnQgbGluZWNhY2hlCi0KLSMgWFhYIFRoZSBmdW5jdGlvbnMgZ2V0Y29kZW5hbWUoKSBhbmQgZ2V0ZnVuY25hbWUoKSBhcmUgbm93IG9ic29sZXRlCi0jIFhYWCBhcyBjb2RlIGFuZCBmdW5jdGlvbiBvYmplY3RzIG5vdyBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUgLS0KLSMgWFhYIGNvLmNvX25hbWUgYW5kIGYuZnVuY19uYW1lLgotIyBYWFggZ2V0bGluZW5vKCkgaXMgbm93IGFsc28gb2Jzb2xldGUgYmVjYXVzZSBvZiB0aGUgbmV3IGF0dHJpYnV0ZQotIyBYWFggb2YgY29kZSBvYmplY3RzLCBjby5jb19maXJzdGxpbmVuby4KLQotIyBFeHRyYWN0IHRoZSBmdW5jdGlvbiBvciBjbGFzcyBuYW1lIGZyb20gYSBjb2RlIG9iamVjdC4KLSMgVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIHNpbmNlIGEgY29kZSBvYmplY3QgZG9lc24ndCBjb250YWluCi0jIHRoZSBuYW1lIGRpcmVjdGx5LiAgU28gd2hhdCBkbyB3ZSBkbzoKLSMgLSBnZXQgdGhlIGZpbGVuYW1lICh3aGljaCAqaXMqIGluIHRoZSBjb2RlIG9iamVjdCkKLSMgLSBsb29rIGluIHRoZSBjb2RlIHN0cmluZyB0byBmaW5kIHRoZSBmaXJzdCBTRVRfTElORU5PIGluc3RydWN0aW9uCi0jICAgKHRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24pCi0jIC0gZ2V0IHRoZSBsaW5lIGZyb20gdGhlIGZpbGUKLSMgLSBpZiB0aGUgbGluZSBzdGFydHMgd2l0aCAnY2xhc3MnIG9yICdkZWYnIChhZnRlciBwb3NzaWJsZSB3aGl0ZXNwYWNlKSwKLSMgICBleHRyYWN0IHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcgotIwotIyBUaGlzIGJyZWFrcyBhcGFydCB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmVhZCBmcm9tIDxzdGRpbj4KLSMgb3IgY29uc3RydWN0ZWQgYnkgZXhlYygpLCB3aGVuIHRoZSBmaWxlIGlzIG5vdCBhY2Nlc3NpYmxlLAotIyBhbmQgYWxzbyB3aGVuIHRoZSBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIG9yIHdoZW4gYSBsaW5lIGlzCi0jIGNvbnRpbnVlZCB3aXRoIGEgYmFja3NsYXNoIGJlZm9yZSB0aGUgZnVuY3Rpb24gb3IgY2xhc3MgbmFtZS4KLSMKLSMgQmVjYXVzZSB0aGlzIGlzIGEgcHJldHR5IGV4cGVuc2l2ZSBoYWNrLCBhIGNhY2hlIGlzIGtlcHQuCi0KLVNFVF9MSU5FTk8gPSAxMjcgIyBUaGUgb3Bjb2RlIChzZWUgIm9wY29kZS5oIiBpbiB0aGUgUHl0aG9uIHNvdXJjZSkKLWlkZW50Y2hhcnMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAnXycgIyBJZGVudGlmaWVyIGNoYXJhY3RlcnMKLQotX25hbWVjYWNoZSA9IHt9ICMgVGhlIGNhY2hlCi0KLWRlZiBnZXRjb2RlbmFtZShjbyk6Ci0gICAgdHJ5OgotICAgICAgICByZXR1cm4gY28uY29fbmFtZQotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGtleSA9IGBjb2AgIyBhcmJpdHJhcnkgYnV0IHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHN0cmluZwotICAgIGlmIF9uYW1lY2FjaGUuaGFzX2tleShrZXkpOiByZXR1cm4gX25hbWVjYWNoZVtrZXldCi0gICAgZmlsZW5hbWUgPSBjby5jb19maWxlbmFtZQotICAgIGNvZGUgPSBjby5jb19jb2RlCi0gICAgbmFtZSA9ICcnCi0gICAgaWYgb3JkKGNvZGVbMF0pID09IFNFVF9MSU5FTk86Ci0gICAgICAgIGxpbmVubyA9IG9yZChjb2RlWzFdKSB8IG9yZChjb2RlWzJdKSA8PCA4Ci0gICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQotICAgICAgICB3b3JkcyA9IGxpbmUuc3BsaXQoKQotICAgICAgICBpZiBsZW4od29yZHMpID49IDIgYW5kIHdvcmRzWzBdIGluICgnZGVmJywgJ2NsYXNzJyk6Ci0gICAgICAgICAgICBuYW1lID0gd29yZHNbMV0KLSAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihuYW1lKSk6Ci0gICAgICAgICAgICAgICAgaWYgbmFtZVtpXSBub3QgaW4gaWRlbnRjaGFyczoKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbOmldCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgX25hbWVjYWNoZVtrZXldID0gbmFtZQotICAgIHJldHVybiBuYW1lCi0KLSMgVXNlIHRoZSBhYm92ZSByb3V0aW5lIHRvIGZpbmQgYSBmdW5jdGlvbidzIG5hbWUuCi0KLWRlZiBnZXRmdW5jbmFtZShmdW5jKToKLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBmdW5jLmZ1bmNfbmFtZQotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIHJldHVybiBnZXRjb2RlbmFtZShmdW5jLmZ1bmNfY29kZSkKLQotIyBBIHBhcnQgb2YgdGhlIGFib3ZlIGNvZGUgdG8gZXh0cmFjdCBqdXN0IHRoZSBsaW5lIG51bWJlciBmcm9tIGEgY29kZSBvYmplY3QuCi0KLWRlZiBnZXRsaW5lbm8oY28pOgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGNvLmNvX2ZpcnN0bGluZW5vCi0gICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgY29kZSA9IGNvLmNvX2NvZGUKLSAgICBpZiBvcmQoY29kZVswXSkgPT0gU0VUX0xJTkVOTzoKLSAgICAgICAgcmV0dXJuIG9yZChjb2RlWzFdKSB8IG9yZChjb2RlWzJdKSA8PCA4Ci0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIC0xCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9kaXJjbXAucHkgYi9MaWIvbGliLW9sZC9kaXJjbXAucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlN2JmMmEuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvZGlyY21wLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSIiIkEgY2xhc3MgdG8gYnVpbGQgZGlyZWN0b3J5IGRpZmYgdG9vbHMgb24uIiIiCi0KLWltcG9ydCBvcwotCi1pbXBvcnQgZGlyY2FjaGUKLWltcG9ydCBjbXBjYWNoZQotaW1wb3J0IHN0YXRjYWNoZQotZnJvbSBzdGF0IGltcG9ydCAqCi0KLWNsYXNzIGRpcmNtcDoKLSAgICAiIiJEaXJlY3RvcnkgY29tcGFyaXNvbiBjbGFzcy4iIiIKLQotICAgIGRlZiBuZXcoc2VsZiwgYSwgYik6Ci0gICAgICAgICIiIkluaXRpYWxpemUuIiIiCi0gICAgICAgIHNlbGYuYSA9IGEKLSAgICAgICAgc2VsZi5iID0gYgotICAgICAgICAjIFByb3BlcnRpZXMgdGhhdCBjYWxsZXIgbWF5IGNoYW5nZSBiZWZvcmUgY2FsbGluZyBzZWxmLnJ1bigpOgotICAgICAgICBzZWxmLmhpZGUgPSBbb3MuY3VyZGlyLCBvcy5wYXJkaXJdICMgTmFtZXMgbmV2ZXIgdG8gYmUgc2hvd24KLSAgICAgICAgc2VsZi5pZ25vcmUgPSBbJ1JDUycsICd0YWdzJ10gIyBOYW1lcyBpZ25vcmVkIGluIGNvbXBhcmlzb24KLQotICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgIiIiQ29tcGFyZSBldmVyeXRoaW5nIGV4Y2VwdCBjb21tb24gc3ViZGlyZWN0b3JpZXMuIiIiCi0gICAgICAgIHNlbGYuYV9saXN0ID0gZmlsdGVyKGRpcmNhY2hlLmxpc3RkaXIoc2VsZi5hKSwgc2VsZi5oaWRlKQotICAgICAgICBzZWxmLmJfbGlzdCA9IGZpbHRlcihkaXJjYWNoZS5saXN0ZGlyKHNlbGYuYiksIHNlbGYuaGlkZSkKLSAgICAgICAgc2VsZi5hX2xpc3Quc29ydCgpCi0gICAgICAgIHNlbGYuYl9saXN0LnNvcnQoKQotICAgICAgICBzZWxmLnBoYXNlMSgpCi0gICAgICAgIHNlbGYucGhhc2UyKCkKLSAgICAgICAgc2VsZi5waGFzZTMoKQotCi0gICAgZGVmIHBoYXNlMShzZWxmKToKLSAgICAgICAgIiIiQ29tcHV0ZSBjb21tb24gbmFtZXMuIiIiCi0gICAgICAgIHNlbGYuYV9vbmx5ID0gW10KLSAgICAgICAgc2VsZi5jb21tb24gPSBbXQotICAgICAgICBmb3IgeCBpbiBzZWxmLmFfbGlzdDoKLSAgICAgICAgICAgIGlmIHggaW4gc2VsZi5iX2xpc3Q6Ci0gICAgICAgICAgICAgICAgc2VsZi5jb21tb24uYXBwZW5kKHgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuYV9vbmx5LmFwcGVuZCh4KQotCi0gICAgICAgIHNlbGYuYl9vbmx5ID0gW10KLSAgICAgICAgZm9yIHggaW4gc2VsZi5iX2xpc3Q6Ci0gICAgICAgICAgICBpZiB4IG5vdCBpbiBzZWxmLmNvbW1vbjoKLSAgICAgICAgICAgICAgICBzZWxmLmJfb25seS5hcHBlbmQoeCkKLQotICAgIGRlZiBwaGFzZTIoc2VsZik6Ci0gICAgICAgICIiIkRpc3Rpbmd1aXNoIGZpbGVzLCBkaXJlY3RvcmllcywgZnVubmllcy4iIiIKLSAgICAgICAgc2VsZi5jb21tb25fZGlycyA9IFtdCi0gICAgICAgIHNlbGYuY29tbW9uX2ZpbGVzID0gW10KLSAgICAgICAgc2VsZi5jb21tb25fZnVubnkgPSBbXQotCi0gICAgICAgIGZvciB4IGluIHNlbGYuY29tbW9uOgotICAgICAgICAgICAgYV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuYSwgeCkKLSAgICAgICAgICAgIGJfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmIsIHgpCi0KLSAgICAgICAgICAgIG9rID0gMQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGFfc3RhdCA9IHN0YXRjYWNoZS5zdGF0KGFfcGF0aCkKLSAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgd2h5OgotICAgICAgICAgICAgICAgICMgcHJpbnQgJ0NhblwndCBzdGF0JywgYV9wYXRoLCAnOicsIHdoeVsxXQotICAgICAgICAgICAgICAgIG9rID0gMAotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGJfc3RhdCA9IHN0YXRjYWNoZS5zdGF0KGJfcGF0aCkKLSAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgd2h5OgotICAgICAgICAgICAgICAgICMgcHJpbnQgJ0NhblwndCBzdGF0JywgYl9wYXRoLCAnOicsIHdoeVsxXQotICAgICAgICAgICAgICAgIG9rID0gMAotCi0gICAgICAgICAgICBpZiBvazoKLSAgICAgICAgICAgICAgICBhX3R5cGUgPSBTX0lGTVQoYV9zdGF0W1NUX01PREVdKQotICAgICAgICAgICAgICAgIGJfdHlwZSA9IFNfSUZNVChiX3N0YXRbU1RfTU9ERV0pCi0gICAgICAgICAgICAgICAgaWYgYV90eXBlICE9IGJfdHlwZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21tb25fZnVubnkuYXBwZW5kKHgpCi0gICAgICAgICAgICAgICAgZWxpZiBTX0lTRElSKGFfdHlwZSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2RpcnMuYXBwZW5kKHgpCi0gICAgICAgICAgICAgICAgZWxpZiBTX0lTUkVHKGFfdHlwZSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2ZpbGVzLmFwcGVuZCh4KQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2Z1bm55LmFwcGVuZCh4KQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmNvbW1vbl9mdW5ueS5hcHBlbmQoeCkKLQotICAgIGRlZiBwaGFzZTMoc2VsZik6Ci0gICAgICAgICIiIkZpbmQgb3V0IGRpZmZlcmVuY2VzIGJldHdlZW4gY29tbW9uIGZpbGVzLiIiIgotICAgICAgICB4eCA9IGNtcGZpbGVzKHNlbGYuYSwgc2VsZi5iLCBzZWxmLmNvbW1vbl9maWxlcykKLSAgICAgICAgc2VsZi5zYW1lX2ZpbGVzLCBzZWxmLmRpZmZfZmlsZXMsIHNlbGYuZnVubnlfZmlsZXMgPSB4eAotCi0gICAgZGVmIHBoYXNlNChzZWxmKToKLSAgICAgICAgIiIiRmluZCBvdXQgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb21tb24gc3ViZGlyZWN0b3JpZXMuCi0gICAgICAgIEEgbmV3IGRpcmNtcCBvYmplY3QgaXMgY3JlYXRlZCBmb3IgZWFjaCBjb21tb24gc3ViZGlyZWN0b3J5LAotICAgICAgICB0aGVzZSBhcmUgc3RvcmVkIGluIGEgZGljdGlvbmFyeSBpbmRleGVkIGJ5IGZpbGVuYW1lLgotICAgICAgICBUaGUgaGlkZSBhbmQgaWdub3JlIHByb3BlcnRpZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQuIiIiCi0gICAgICAgIHNlbGYuc3ViZGlycyA9IHt9Ci0gICAgICAgIGZvciB4IGluIHNlbGYuY29tbW9uX2RpcnM6Ci0gICAgICAgICAgICBhX3ggPSBvcy5wYXRoLmpvaW4oc2VsZi5hLCB4KQotICAgICAgICAgICAgYl94ID0gb3MucGF0aC5qb2luKHNlbGYuYiwgeCkKLSAgICAgICAgICAgIHNlbGYuc3ViZGlyc1t4XSA9IG5ld2RkID0gZGlyY21wKCkubmV3KGFfeCwgYl94KQotICAgICAgICAgICAgbmV3ZGQuaGlkZSA9IHNlbGYuaGlkZQotICAgICAgICAgICAgbmV3ZGQuaWdub3JlID0gc2VsZi5pZ25vcmUKLSAgICAgICAgICAgIG5ld2RkLnJ1bigpCi0KLSAgICBkZWYgcGhhc2U0X2Nsb3N1cmUoc2VsZik6Ci0gICAgICAgICIiIlJlY3Vyc2l2ZWx5IGNhbGwgcGhhc2U0KCkgb24gc3ViZGlyZWN0b3JpZXMuIiIiCi0gICAgICAgIHNlbGYucGhhc2U0KCkKLSAgICAgICAgZm9yIHggaW4gc2VsZi5zdWJkaXJzLmtleXMoKToKLSAgICAgICAgICAgIHNlbGYuc3ViZGlyc1t4XS5waGFzZTRfY2xvc3VyZSgpCi0KLSAgICBkZWYgcmVwb3J0KHNlbGYpOgotICAgICAgICAiIiJQcmludCBhIHJlcG9ydCBvbiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIGFuZCBiLiIiIgotICAgICAgICAjIEFzc3VtZSB0aGF0IHBoYXNlcyAxIHRvIDMgaGF2ZSBiZWVuIGV4ZWN1dGVkCi0gICAgICAgICMgT3V0cHV0IGZvcm1hdCBpcyBwdXJwb3NlbHkgbG91c3kKLSAgICAgICAgcHJpbnQgJ2RpZmYnLCBzZWxmLmEsIHNlbGYuYgotICAgICAgICBpZiBzZWxmLmFfb25seToKLSAgICAgICAgICAgIHByaW50ICdPbmx5IGluJywgc2VsZi5hLCAnOicsIHNlbGYuYV9vbmx5Ci0gICAgICAgIGlmIHNlbGYuYl9vbmx5OgotICAgICAgICAgICAgcHJpbnQgJ09ubHkgaW4nLCBzZWxmLmIsICc6Jywgc2VsZi5iX29ubHkKLSAgICAgICAgaWYgc2VsZi5zYW1lX2ZpbGVzOgotICAgICAgICAgICAgcHJpbnQgJ0lkZW50aWNhbCBmaWxlcyA6Jywgc2VsZi5zYW1lX2ZpbGVzCi0gICAgICAgIGlmIHNlbGYuZGlmZl9maWxlczoKLSAgICAgICAgICAgIHByaW50ICdEaWZmZXJpbmcgZmlsZXMgOicsIHNlbGYuZGlmZl9maWxlcwotICAgICAgICBpZiBzZWxmLmZ1bm55X2ZpbGVzOgotICAgICAgICAgICAgcHJpbnQgJ1Ryb3VibGUgd2l0aCBjb21tb24gZmlsZXMgOicsIHNlbGYuZnVubnlfZmlsZXMKLSAgICAgICAgaWYgc2VsZi5jb21tb25fZGlyczoKLSAgICAgICAgICAgIHByaW50ICdDb21tb24gc3ViZGlyZWN0b3JpZXMgOicsIHNlbGYuY29tbW9uX2RpcnMKLSAgICAgICAgaWYgc2VsZi5jb21tb25fZnVubnk6Ci0gICAgICAgICAgICBwcmludCAnQ29tbW9uIGZ1bm55IGNhc2VzIDonLCBzZWxmLmNvbW1vbl9mdW5ueQotCi0gICAgZGVmIHJlcG9ydF9jbG9zdXJlKHNlbGYpOgotICAgICAgICAiIiJQcmludCByZXBvcnRzIG9uIHNlbGYgYW5kIG9uIHN1YmRpcnMuCi0gICAgICAgIElmIHBoYXNlIDQgaGFzbid0IGJlZW4gZG9uZSwgbm8gc3ViZGlyIHJlcG9ydHMgYXJlIHByaW50ZWQuIiIiCi0gICAgICAgIHNlbGYucmVwb3J0KCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgeCA9IHNlbGYuc3ViZGlycwotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gIyBObyBzdWJkaXJlY3RvcmllcyBjb21wdXRlZAotICAgICAgICBmb3IgeCBpbiBzZWxmLnN1YmRpcnMua2V5cygpOgotICAgICAgICAgICAgcHJpbnQKLSAgICAgICAgICAgIHNlbGYuc3ViZGlyc1t4XS5yZXBvcnRfY2xvc3VyZSgpCi0KLSAgICBkZWYgcmVwb3J0X3BoYXNlNF9jbG9zdXJlKHNlbGYpOgotICAgICAgICAiIiJSZXBvcnQgYW5kIGRvIHBoYXNlIDQgcmVjdXJzaXZlbHkuIiIiCi0gICAgICAgIHNlbGYucmVwb3J0KCkKLSAgICAgICAgc2VsZi5waGFzZTQoKQotICAgICAgICBmb3IgeCBpbiBzZWxmLnN1YmRpcnMua2V5cygpOgotICAgICAgICAgICAgcHJpbnQKLSAgICAgICAgICAgIHNlbGYuc3ViZGlyc1t4XS5yZXBvcnRfcGhhc2U0X2Nsb3N1cmUoKQotCi0KLWRlZiBjbXBmaWxlcyhhLCBiLCBjb21tb24pOgotICAgICIiIkNvbXBhcmUgY29tbW9uIGZpbGVzIGluIHR3byBkaXJlY3Rvcmllcy4KLSAgICBSZXR1cm46Ci0gICAgICAgIC0gZmlsZXMgdGhhdCBjb21wYXJlIGVxdWFsCi0gICAgICAgIC0gZmlsZXMgdGhhdCBjb21wYXJlIGRpZmZlcmVudAotICAgICAgICAtIGZ1bm55IGNhc2VzIChjYW4ndCBzdGF0IGV0Yy4pIiIiCi0KLSAgICByZXMgPSAoW10sIFtdLCBbXSkKLSAgICBmb3IgeCBpbiBjb21tb246Ci0gICAgICAgIHJlc1tjbXAob3MucGF0aC5qb2luKGEsIHgpLCBvcy5wYXRoLmpvaW4oYiwgeCkpXS5hcHBlbmQoeCkKLSAgICByZXR1cm4gcmVzCi0KLQotZGVmIGNtcChhLCBiKToKLSAgICAiIiJDb21wYXJlIHR3byBmaWxlcy4KLSAgICBSZXR1cm46Ci0gICAgICAgIDAgZm9yIGVxdWFsCi0gICAgICAgIDEgZm9yIGRpZmZlcmVudAotICAgICAgICAyIGZvciBmdW5ueSBjYXNlcyAoY2FuJ3Qgc3RhdCwgZXRjLikiIiIKLQotICAgIHRyeToKLSAgICAgICAgaWYgY21wY2FjaGUuY21wKGEsIGIpOiByZXR1cm4gMAotICAgICAgICByZXR1cm4gMQotICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgcmV0dXJuIDIKLQotCi1kZWYgZmlsdGVyKGxpc3QsIHNraXApOgotICAgICIiIlJldHVybiBhIGNvcHkgd2l0aCBpdGVtcyB0aGF0IG9jY3VyIGluIHNraXAgcmVtb3ZlZC4iIiIKLQotICAgIHJlc3VsdCA9IFtdCi0gICAgZm9yIGl0ZW0gaW4gbGlzdDoKLSAgICAgICAgaWYgaXRlbSBub3QgaW4gc2tpcDogcmVzdWx0LmFwcGVuZChpdGVtKQotICAgIHJldHVybiByZXN1bHQKLQotCi1kZWYgZGVtbygpOgotICAgICIiIkRlbW9uc3RyYXRpb24gYW5kIHRlc3RpbmcuIiIiCi0KLSAgICBpbXBvcnQgc3lzCi0gICAgaW1wb3J0IGdldG9wdAotICAgIG9wdGlvbnMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ3InKQotICAgIGlmIGxlbihhcmdzKSAhPSAyOgotICAgICAgICByYWlzZSBnZXRvcHQuZXJyb3IsICduZWVkIGV4YWN0bHkgdHdvIGFyZ3MnCi0gICAgZGQgPSBkaXJjbXAoKS5uZXcoYXJnc1swXSwgYXJnc1sxXSkKLSAgICBkZC5ydW4oKQotICAgIGlmICgnLXInLCAnJykgaW4gb3B0aW9uczoKLSAgICAgICAgZGQucmVwb3J0X3BoYXNlNF9jbG9zdXJlKCkKLSAgICBlbHNlOgotICAgICAgICBkZC5yZXBvcnQoKQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIGRlbW8oKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvZHVtcC5weSBiL0xpYi9saWItb2xkL2R1bXAucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYmRiYTguLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvZHVtcC5weQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSMgTW9kdWxlICdkdW1wJwotIwotIyBQcmludCBweXRob24gY29kZSB0aGF0IHJlY29uc3RydWN0cyBhIHZhcmlhYmxlLgotIyBUaGlzIG9ubHkgd29ya3MgaW4gY2VydGFpbiBjYXNlcy4KLSMKLSMgSXQgd29ya3MgZmluZSBmb3I6Ci0jIC0gaW50cyBhbmQgZmxvYXRzIChleGNlcHQgTmFOcyBhbmQgb3RoZXIgd2VpcmQgdGhpbmdzKQotIyAtIHN0cmluZ3MKLSMgLSBjb21wb3VuZHMgYW5kIGxpc3RzLCBwcm92aWRlZCBpdCB3b3JrcyBmb3IgYWxsIHRoZWlyIGVsZW1lbnRzCi0jIC0gaW1wb3J0ZWQgbW9kdWxlcywgcHJvdmlkZWQgdGhlaXIgbmFtZSBpcyB0aGUgbW9kdWxlIG5hbWUKLSMKLSMgSXQgd29ya3MgZm9yIHRvcC1sZXZlbCBkaWN0aW9uYXJpZXMgYnV0IG5vdCBmb3IgZGljdGlvbmFyaWVzCi0jIGNvbnRhaW5lZCBpbiBvdGhlciBvYmplY3RzIChjb3VsZCBiZSBtYWRlIHRvIHdvcmsgd2l0aCBzb21lIGhhc3NsZQotIyB0aG91Z2gpLgotIwotIyBJdCBkb2VzIG5vdCB3b3JrIGZvciBmdW5jdGlvbnMgKGFsbCBzb3J0cyksIGNsYXNzZXMsIGNsYXNzIG9iamVjdHMsCi0jIHdpbmRvd3MsIGZpbGVzIGV0Yy4KLSMKLSMgRmluYWxseSwgb2JqZWN0cyByZWZlcmVuY2VkIGJ5IG1vcmUgdGhhbiBvbmUgbmFtZSBvciBjb250YWluZWQgaW4gbW9yZQotIyB0aGFuIG9uZSBvdGhlciBvYmplY3QgbG9zZSB0aGVpciBzaGFyaW5nIHByb3BlcnR5ICh0aGlzIGlzIGJhZCBmb3IKLSMgc3RyaW5ncyB1c2VkIGFzIGV4Y2VwdGlvbiBpZGVudGlmaWVycywgZm9yIGluc3RhbmNlKS4KLQotIyBEdW1wIGEgd2hvbGUgc3ltYm9sIHRhYmxlCi0jCi1kZWYgZHVtcHN5bXRhYihkaWN0KToKLSAgICBmb3Iga2V5IGluIGRpY3Qua2V5cygpOgotICAgICAgICBkdW1wdmFyKGtleSwgZGljdFtrZXldKQotCi0jIER1bXAgYSBzaW5nbGUgdmFyaWFibGUKLSMKLWRlZiBkdW1wdmFyKG5hbWUsIHgpOgotICAgIGltcG9ydCBzeXMKLSAgICB0ID0gdHlwZSh4KQotICAgIGlmIHQgPT0gdHlwZSh7fSk6Ci0gICAgICAgIHByaW50IG5hbWUsICc9IHt9JwotICAgICAgICBmb3Iga2V5IGluIHgua2V5cygpOgotICAgICAgICAgICAgaXRlbSA9IHhba2V5XQotICAgICAgICAgICAgaWYgbm90IHByaW50YWJsZShpdGVtKToKLSAgICAgICAgICAgICAgICBwcmludCAnIycsCi0gICAgICAgICAgICBwcmludCBuYW1lLCAnWycsIGBrZXlgLCAnXSA9JywgYGl0ZW1gCi0gICAgZWxpZiB0IGluICh0eXBlKCcnKSwgdHlwZSgwKSwgdHlwZSgwLjApLCB0eXBlKFtdKSwgdHlwZSgoKSkpOgotICAgICAgICBpZiBub3QgcHJpbnRhYmxlKHgpOgotICAgICAgICAgICAgcHJpbnQgJyMnLAotICAgICAgICBwcmludCBuYW1lLCAnPScsIGB4YAotICAgIGVsaWYgdCA9PSB0eXBlKHN5cyk6Ci0gICAgICAgIHByaW50ICdpbXBvcnQnLCBuYW1lLCAnIycsIHgKLSAgICBlbHNlOgotICAgICAgICBwcmludCAnIycsIG5hbWUsICc9JywgeAotCi0jIGNoZWNrIGlmIGEgdmFsdWUgaXMgcHJpbnRhYmxlIGluIGEgd2F5IHRoYXQgY2FuIGJlIHJlYWQgYmFjayB3aXRoIGlucHV0KCkKLSMKLWRlZiBwcmludGFibGUoeCk6Ci0gICAgdCA9IHR5cGUoeCkKLSAgICBpZiB0IGluICh0eXBlKCcnKSwgdHlwZSgwKSwgdHlwZSgwLjApKToKLSAgICAgICAgcmV0dXJuIDEKLSAgICBpZiB0IGluICh0eXBlKFtdKSwgdHlwZSgoKSkpOgotICAgICAgICBmb3IgaXRlbSBpbiB4OgotICAgICAgICAgICAgaWYgbm90IHByaW50YWJsZShpdGVtKToKLSAgICAgICAgICAgICAgICByZXR1cm4gMAotICAgICAgICByZXR1cm4gMQotICAgIGlmIHggPT0ge306Ci0gICAgICAgIHJldHVybiAxCi0gICAgcmV0dXJuIDAKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL2ZpbmQucHkgYi9MaWIvbGliLW9sZC9maW5kLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWFkNzcxLi4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2ZpbmQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1pbXBvcnQgZm5tYXRjaAotaW1wb3J0IG9zCi0KLV9kZWJ1ZyA9IDAKLQotX3BydW5lID0gWycoKiknXQotCi1kZWYgZmluZChwYXR0ZXJuLCBkaXIgPSBvcy5jdXJkaXIpOgotICAgIGxpc3QgPSBbXQotICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXIpCi0gICAgbmFtZXMuc29ydCgpCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIGlmIG5hbWUgaW4gKG9zLmN1cmRpciwgb3MucGFyZGlyKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGRpciwgbmFtZSkKLSAgICAgICAgaWYgZm5tYXRjaC5mbm1hdGNoKG5hbWUsIHBhdHRlcm4pOgotICAgICAgICAgICAgbGlzdC5hcHBlbmQoZnVsbG5hbWUpCi0gICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoZnVsbG5hbWUpOgotICAgICAgICAgICAgZm9yIHAgaW4gX3BydW5lOgotICAgICAgICAgICAgICAgIGlmIGZubWF0Y2guZm5tYXRjaChuYW1lLCBwKToKLSAgICAgICAgICAgICAgICAgICAgaWYgX2RlYnVnOiBwcmludCAic2tpcCIsIGBmdWxsbmFtZWAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgX2RlYnVnOiBwcmludCAiZGVzY2VuZCBpbnRvIiwgYGZ1bGxuYW1lYAotICAgICAgICAgICAgICAgIGxpc3QgPSBsaXN0ICsgZmluZChwYXR0ZXJuLCBmdWxsbmFtZSkKLSAgICByZXR1cm4gbGlzdApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvZm10LnB5IGIvTGliL2xpYi1vbGQvZm10LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTdkMzdhLi4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2ZtdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi0jIFRleHQgZm9ybWF0dGluZyBhYnN0cmFjdGlvbnMKLSMgTm90ZSAtLSB0aGlzIG1vZHVsZSBpcyBvYnNvbGV0ZSwgaXQncyB0b28gc2xvdyBhbnl3YXkKLQotCi1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgUGFyYQotCi0KLSMgQSBmb3JtYXR0ZXIgYmFjay1lbmQgb2JqZWN0IGhhcyBvbmUgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGJ5IHRoZSBmb3JtYXR0ZXI6Ci0jIGFkZHBhcmEocCksIHdoZXJlIHAgaXMgYSBwYXJhZ3JhcGggb2JqZWN0LiAgRm9yIGV4YW1wbGU6Ci0KLQotIyBGb3JtYXR0ZXIgYmFjay1lbmQgdG8gZG8gbm90aGluZyBhdCBhbGwgd2l0aCB0aGUgcGFyYWdyYXBocwotY2xhc3MgTnVsbEJhY2tFbmQ6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotICAgICMKLSAgICBkZWYgYWRkcGFyYShzZWxmLCBwKToKLSAgICAgICAgcGFzcwotICAgICMKLSAgICBkZWYgYmduX2FuY2hvcihzZWxmLCBpZCk6Ci0gICAgICAgIHBhc3MKLSAgICAjCi0gICAgZGVmIGVuZF9hbmNob3Ioc2VsZiwgaWQpOgotICAgICAgICBwYXNzCi0KLQotIyBGb3JtYXR0ZXIgYmFjay1lbmQgdG8gY29sbGVjdCB0aGUgcGFyYWdyYXBocyBpbiBhIGxpc3QKLWNsYXNzIFNhdmluZ0JhY2tFbmQoTnVsbEJhY2tFbmQpOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYucGFyYWxpc3QgPSBbXQotICAgICMKLSAgICBkZWYgYWRkcGFyYShzZWxmLCBwKToKLSAgICAgICAgc2VsZi5wYXJhbGlzdC5hcHBlbmQocCkKLSAgICAjCi0gICAgZGVmIGhpdGNoZWNrKHNlbGYsIGgsIHYpOgotICAgICAgICBoaXRzID0gW10KLSAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbGlzdDoKLSAgICAgICAgICAgIGlmIHAudG9wIDw9IHYgPD0gcC5ib3R0b206Ci0gICAgICAgICAgICAgICAgZm9yIGlkIGluIHAuaGl0Y2hlY2soaCwgdik6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGlkIG5vdCBpbiBoaXRzOgotICAgICAgICAgICAgICAgICAgICAgICAgaGl0cy5hcHBlbmQoaWQpCi0gICAgICAgIHJldHVybiBoaXRzCi0gICAgIwotICAgIGRlZiBleHRyYWN0KHNlbGYpOgotICAgICAgICB0ZXh0ID0gJycKLSAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbGlzdDoKLSAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgKHAuZXh0cmFjdCgpKQotICAgICAgICByZXR1cm4gdGV4dAotICAgICMKLSAgICBkZWYgZXh0cmFjdHBhcnQoc2VsZiwgbG9uZzEsIGxvbmcyKToKLSAgICAgICAgaWYgbG9uZzEgPiBsb25nMjogbG9uZzEsIGxvbmcyID0gbG9uZzIsIGxvbmcxCi0gICAgICAgIHBhcmExLCBwb3MxID0gbG9uZzEKLSAgICAgICAgcGFyYTIsIHBvczIgPSBsb25nMgotICAgICAgICB0ZXh0ID0gJycKLSAgICAgICAgd2hpbGUgcGFyYTEgPCBwYXJhMjoKLSAgICAgICAgICAgIHB0ZXh0ID0gc2VsZi5wYXJhbGlzdFtwYXJhMV0uZXh0cmFjdCgpCi0gICAgICAgICAgICB0ZXh0ID0gdGV4dCArIHB0ZXh0W3BvczE6XQotICAgICAgICAgICAgcG9zMSA9IDAKLSAgICAgICAgICAgIHBhcmExID0gcGFyYTEgKyAxCi0gICAgICAgIHB0ZXh0ID0gc2VsZi5wYXJhbGlzdFtwYXJhMl0uZXh0cmFjdCgpCi0gICAgICAgIHJldHVybiB0ZXh0ICsgcHRleHRbcG9zMTpwb3MyXQotICAgICMKLSAgICBkZWYgd2hlcmVpcyhzZWxmLCBkLCBoLCB2KToKLSAgICAgICAgdG90YWwgPSAwCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnBhcmFsaXN0KSk6Ci0gICAgICAgICAgICBwID0gc2VsZi5wYXJhbGlzdFtpXQotICAgICAgICAgICAgcmVzdWx0ID0gcC53aGVyZWlzKGQsIGgsIHYpCi0gICAgICAgICAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGksIHJlc3VsdAotICAgICAgICByZXR1cm4gTm9uZQotICAgICMKLSAgICBkZWYgcm91bmR0b3dvcmRzKHNlbGYsIGxvbmcxLCBsb25nMik6Ci0gICAgICAgIGksIG9mZnNldCA9IGxvbmcxCi0gICAgICAgIHRleHQgPSBzZWxmLnBhcmFsaXN0W2ldLmV4dHJhY3QoKQotICAgICAgICB3aGlsZSBvZmZzZXQgPiAwIGFuZCB0ZXh0W29mZnNldC0xXSAhPSAnICc6IG9mZnNldCA9IG9mZnNldC0xCi0gICAgICAgIGxvbmcxID0gaSwgb2Zmc2V0Ci0gICAgICAgICMKLSAgICAgICAgaSwgb2Zmc2V0ID0gbG9uZzIKLSAgICAgICAgdGV4dCA9IHNlbGYucGFyYWxpc3RbaV0uZXh0cmFjdCgpCi0gICAgICAgIG4gPSBsZW4odGV4dCkKLSAgICAgICAgd2hpbGUgb2Zmc2V0IDwgbi0xIGFuZCB0ZXh0W29mZnNldF0gIT0gJyAnOiBvZmZzZXQgPSBvZmZzZXQrMQotICAgICAgICBsb25nMiA9IGksIG9mZnNldAotICAgICAgICAjCi0gICAgICAgIHJldHVybiBsb25nMSwgbG9uZzIKLSAgICAjCi0gICAgZGVmIHJvdW5kdG9wYXJhZ3JhcGhzKHNlbGYsIGxvbmcxLCBsb25nMik6Ci0gICAgICAgIGxvbmcxID0gbG9uZzFbMF0sIDAKLSAgICAgICAgbG9uZzIgPSBsb25nMlswXSwgbGVuKHNlbGYucGFyYWxpc3RbbG9uZzJbMF1dLmV4dHJhY3QoKSkKLSAgICAgICAgcmV0dXJuIGxvbmcxLCBsb25nMgotCi0KLSMgRm9ybWF0dGVyIGJhY2stZW5kIHRvIHNlbmQgdGhlIHRleHQgZGlyZWN0bHkgdG8gdGhlIGRyYXdpbmcgb2JqZWN0Ci1jbGFzcyBXcml0aW5nQmFja0VuZChOdWxsQmFja0VuZCk6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkLCB3aWR0aCk6Ci0gICAgICAgIHNlbGYuZCA9IGQKLSAgICAgICAgc2VsZi53aWR0aCA9IHdpZHRoCi0gICAgICAgIHNlbGYubGluZW5vID0gMAotICAgICMKLSAgICBkZWYgYWRkcGFyYShzZWxmLCBwKToKLSAgICAgICAgc2VsZi5saW5lbm8gPSBwLnJlbmRlcihzZWxmLmQsIDAsIHNlbGYubGluZW5vLCBzZWxmLndpZHRoKQotCi0KLSMgQSBmb3JtYXR0ZXIgcmVjZWl2ZXMgYSBzdHJlYW0gb2YgZm9ybWF0dGluZyBpbnN0cnVjdGlvbnMgYW5kIGFzc2VtYmxlcwotIyB0aGVzZSBpbnRvIGEgc3RyZWFtIG9mIHBhcmFncmFwaHMgb24gdG8gYSBiYWNrLWVuZC4gIFRoZSBhc3NlbWJseSBpcwotIyBwYXJhbWV0cml6ZWQgYnkgYSB0ZXh0IG1lYXN1cmVtZW50IG9iamVjdCwgd2hpY2ggbXVzdCBtYXRjaCB0aGUgb3V0cHV0Ci0jIG9wZXJhdGlvbnMgb2YgdGhlIGJhY2stZW5kLiAgVGhlIGJhY2stZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBzcGxpdHRpbmcKLSMgcGFyYWdyYXBocyB1cCBpbiBsaW5lcyBvZiBhIGdpdmVuIG1heGltdW0gd2lkdGguICAoVGhpcyBpcyBkb25lIGJlY2F1c2UKLSMgaW4gYSB3aW5kb3dpbmcgZW52aXJvbm1lbnQsIHdoZW4gdGhlIHdpbmRvdyBzaXplIGNoYW5nZXMsIHRoZXJlIGlzIG5vCi0jIG5lZWQgdG8gcmVkbyB0aGUgYXNzZW1ibHkgaW50byBwYXJhZ3JhcGhzLCBidXQgdGhlIHNwbGl0dGluZyBpbnRvIGxpbmVzCi0jIG11c3QgYmUgZG9uZSB0YWtpbmcgdGhlIG5ldyB3aW5kb3cgc2l6ZSBpbnRvIGFjY291bnQuKQotCi0KLSMgRm9ybWF0dGVyIGJhc2UgY2xhc3MuICBJbml0aWFsaXplIGl0IHdpdGggYSB0ZXh0IG1lYXN1cmVtZW50IG9iamVjdCwKLSMgd2hpY2ggaXMgdXNlZCBmb3IgdGV4dCBtZWFzdXJlbWVudHMsIGFuZCBhIGJhY2stZW5kIG9iamVjdCwKLSMgd2hpY2ggcmVjZWl2ZXMgdGhlIGNvbXBsZXRlZCBwYXJhZ3JhcGhzLiAgVGhlIGZvcm1hdHRpbmcgbWV0aG9kcyBhcmU6Ci0jIHNldGZvbnQoZm9udCkKLSMgc2V0bGVmdGluZGVudChuc3BhY2VzKQotIyBzZXRqdXN0KHR5cGUpIHdoZXJlIHR5cGUgaXMgJ2wnLCAnYycsICdyJywgb3IgJ2xyJwotIyBmbHVzaCgpCi0jIHZzcGFjZShubGluZXMpCi0jIG5lZWR2c3BhY2UobmxpbmVzKQotIyBhZGR3b3JkKHdvcmQsIG5zcGFjZXMpCi1jbGFzcyBCYXNlRm9ybWF0dGVyOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZCwgYik6Ci0gICAgICAgICMgRHJhd2luZyBvYmplY3QgdXNlZCBmb3IgdGV4dCBtZWFzdXJlbWVudHMKLSAgICAgICAgc2VsZi5kID0gZAotICAgICAgICAjCi0gICAgICAgICMgQmFja0VuZCBvYmplY3QgcmVjZWl2aW5nIGNvbXBsZXRlZCBwYXJhZ3JhcGhzCi0gICAgICAgIHNlbGYuYiA9IGIKLSAgICAgICAgIwotICAgICAgICAjIFBhcmFtZXRlcnMgb2YgdGhlIGZvcm1hdHRpbmcgbW9kZWwKLSAgICAgICAgc2VsZi5sZWZ0aW5kZW50ID0gMAotICAgICAgICBzZWxmLmp1c3QgPSAnbCcKLSAgICAgICAgc2VsZi5mb250ID0gTm9uZQotICAgICAgICBzZWxmLmJsYW5rbGluZXMgPSAwCi0gICAgICAgICMKLSAgICAgICAgIyBQYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSB0aGUgY3VycmVudCBmb250Ci0gICAgICAgIHNlbGYuc3BhY2UgPSBkLnRleHR3aWR0aCgnICcpCi0gICAgICAgIHNlbGYubGluZSA9IGQubGluZWhlaWdodCgpCi0gICAgICAgIHNlbGYuYXNjZW50ID0gZC5iYXNlbGluZSgpCi0gICAgICAgIHNlbGYuZGVzY2VudCA9IHNlbGYubGluZSAtIHNlbGYuYXNjZW50Ci0gICAgICAgICMKLSAgICAgICAgIyBQYXJhbWV0ZXIgZGVyaXZlZCBmcm9tIHRoZSBkZWZhdWx0IGZvbnQKLSAgICAgICAgc2VsZi5uX3NwYWNlID0gc2VsZi5zcGFjZQotICAgICAgICAjCi0gICAgICAgICMgQ3VycmVudCBwYXJhZ3JhcGggYmVpbmcgYnVpbHQKLSAgICAgICAgc2VsZi5wYXJhID0gTm9uZQotICAgICAgICBzZWxmLm5vc3BhY2UgPSAxCi0gICAgICAgICMKLSAgICAgICAgIyBGb250IHRvIHNldCBvbiB0aGUgbmV4dCB3b3JkCi0gICAgICAgIHNlbGYubmV4dGZvbnQgPSBOb25lCi0gICAgIwotICAgIGRlZiBuZXdwYXJhKHNlbGYpOgotICAgICAgICByZXR1cm4gUGFyYS5QYXJhKCkKLSAgICAjCi0gICAgZGVmIHNldGZvbnQoc2VsZiwgZm9udCk6Ci0gICAgICAgIGlmIGZvbnQgaXMgTm9uZTogcmV0dXJuCi0gICAgICAgIHNlbGYuZm9udCA9IHNlbGYubmV4dGZvbnQgPSBmb250Ci0gICAgICAgIGQgPSBzZWxmLmQKLSAgICAgICAgZC5zZXRmb250KGZvbnQpCi0gICAgICAgIHNlbGYuc3BhY2UgPSBkLnRleHR3aWR0aCgnICcpCi0gICAgICAgIHNlbGYubGluZSA9IGQubGluZWhlaWdodCgpCi0gICAgICAgIHNlbGYuYXNjZW50ID0gZC5iYXNlbGluZSgpCi0gICAgICAgIHNlbGYuZGVzY2VudCA9IHNlbGYubGluZSAtIHNlbGYuYXNjZW50Ci0gICAgIwotICAgIGRlZiBzZXRsZWZ0aW5kZW50KHNlbGYsIG5zcGFjZXMpOgotICAgICAgICBzZWxmLmxlZnRpbmRlbnQgPSBpbnQoc2VsZi5uX3NwYWNlICogbnNwYWNlcykKLSAgICAgICAgaWYgc2VsZi5wYXJhOgotICAgICAgICAgICAgaGFuZyA9IHNlbGYubGVmdGluZGVudCAtIHNlbGYucGFyYS5pbmRlbnRfbGVmdAotICAgICAgICAgICAgaWYgaGFuZyA+IDAgYW5kIHNlbGYucGFyYS5nZXRsZW5ndGgoKSA8PSBoYW5nOgotICAgICAgICAgICAgICAgIHNlbGYucGFyYS5tYWtlaGFuZ2luZ3RhZyhoYW5nKQotICAgICAgICAgICAgICAgIHNlbGYubm9zcGFjZSA9IDEKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpCi0gICAgIwotICAgIGRlZiBzZXRyaWdodGluZGVudChzZWxmLCBuc3BhY2VzKToKLSAgICAgICAgc2VsZi5yaWdodGluZGVudCA9IGludChzZWxmLm5fc3BhY2UgKiBuc3BhY2VzKQotICAgICAgICBpZiBzZWxmLnBhcmE6Ci0gICAgICAgICAgICBzZWxmLnBhcmEuaW5kZW50X3JpZ2h0ID0gc2VsZi5yaWdodGluZGVudAotICAgICAgICAgICAgc2VsZi5mbHVzaCgpCi0gICAgIwotICAgIGRlZiBzZXRqdXN0KHNlbGYsIGp1c3QpOgotICAgICAgICBzZWxmLmp1c3QgPSBqdXN0Ci0gICAgICAgIGlmIHNlbGYucGFyYToKLSAgICAgICAgICAgIHNlbGYucGFyYS5qdXN0ID0gc2VsZi5qdXN0Ci0gICAgIwotICAgIGRlZiBmbHVzaChzZWxmKToKLSAgICAgICAgaWYgc2VsZi5wYXJhOgotICAgICAgICAgICAgc2VsZi5iLmFkZHBhcmEoc2VsZi5wYXJhKQotICAgICAgICAgICAgc2VsZi5wYXJhID0gTm9uZQotICAgICAgICAgICAgaWYgc2VsZi5mb250IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuZC5zZXRmb250KHNlbGYuZm9udCkKLSAgICAgICAgc2VsZi5ub3NwYWNlID0gMQotICAgICMKLSAgICBkZWYgdnNwYWNlKHNlbGYsIG5saW5lcyk6Ci0gICAgICAgIHNlbGYuZmx1c2goKQotICAgICAgICBpZiBubGluZXMgPiAwOgotICAgICAgICAgICAgc2VsZi5wYXJhID0gc2VsZi5uZXdwYXJhKCkKLSAgICAgICAgICAgIHR1cGxlID0gTm9uZSwgJycsIDAsIDAsIDAsIGludChubGluZXMqc2VsZi5saW5lKSwgMAotICAgICAgICAgICAgc2VsZi5wYXJhLndvcmRzLmFwcGVuZCh0dXBsZSkKLSAgICAgICAgICAgIHNlbGYuZmx1c2goKQotICAgICAgICAgICAgc2VsZi5ibGFua2xpbmVzID0gc2VsZi5ibGFua2xpbmVzICsgbmxpbmVzCi0gICAgIwotICAgIGRlZiBuZWVkdnNwYWNlKHNlbGYsIG5saW5lcyk6Ci0gICAgICAgIHNlbGYuZmx1c2goKSAjIEp1c3QgdG8gYmUgc3VyZQotICAgICAgICBpZiBubGluZXMgPiBzZWxmLmJsYW5rbGluZXM6Ci0gICAgICAgICAgICBzZWxmLnZzcGFjZShubGluZXMgLSBzZWxmLmJsYW5rbGluZXMpCi0gICAgIwotICAgIGRlZiBhZGR3b3JkKHNlbGYsIHRleHQsIHNwYWNlKToKLSAgICAgICAgaWYgc2VsZi5ub3NwYWNlIGFuZCBub3QgdGV4dDoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLm5vc3BhY2UgPSAwCi0gICAgICAgIHNlbGYuYmxhbmtsaW5lcyA9IDAKLSAgICAgICAgaWYgbm90IHNlbGYucGFyYToKLSAgICAgICAgICAgIHNlbGYucGFyYSA9IHNlbGYubmV3cGFyYSgpCi0gICAgICAgICAgICBzZWxmLnBhcmEuaW5kZW50X2xlZnQgPSBzZWxmLmxlZnRpbmRlbnQKLSAgICAgICAgICAgIHNlbGYucGFyYS5qdXN0ID0gc2VsZi5qdXN0Ci0gICAgICAgICAgICBzZWxmLm5leHRmb250ID0gc2VsZi5mb250Ci0gICAgICAgIHNwYWNlID0gaW50KHNwYWNlICogc2VsZi5zcGFjZSkKLSAgICAgICAgc2VsZi5wYXJhLndvcmRzLmFwcGVuZCgoc2VsZi5uZXh0Zm9udCwgdGV4dCwKLSAgICAgICAgICAgICAgICBzZWxmLmQudGV4dHdpZHRoKHRleHQpLCBzcGFjZSwgc3BhY2UsCi0gICAgICAgICAgICAgICAgc2VsZi5hc2NlbnQsIHNlbGYuZGVzY2VudCkpCi0gICAgICAgIHNlbGYubmV4dGZvbnQgPSBOb25lCi0gICAgIwotICAgIGRlZiBiZ25fYW5jaG9yKHNlbGYsIGlkKToKLSAgICAgICAgaWYgbm90IHNlbGYucGFyYToKLSAgICAgICAgICAgIHNlbGYubm9zcGFjZSA9IDAKLSAgICAgICAgICAgIHNlbGYuYWRkd29yZCgnJywgMCkKLSAgICAgICAgc2VsZi5wYXJhLmJnbl9hbmNob3IoaWQpCi0gICAgIwotICAgIGRlZiBlbmRfYW5jaG9yKHNlbGYsIGlkKToKLSAgICAgICAgaWYgbm90IHNlbGYucGFyYToKLSAgICAgICAgICAgIHNlbGYubm9zcGFjZSA9IDAKLSAgICAgICAgICAgIHNlbGYuYWRkd29yZCgnJywgMCkKLSAgICAgICAgc2VsZi5wYXJhLmVuZF9hbmNob3IoaWQpCi0KLQotIyBNZWFzdXJpbmcgb2JqZWN0IGZvciBtZWFzdXJpbmcgdGV4dCBhcyB2aWV3ZWQgb24gYSB0dHkKLWNsYXNzIE51bGxNZWFzdXJlcjoKLSAgICAjCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0gICAgIwotICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnQpOgotICAgICAgICBwYXNzCi0gICAgIwotICAgIGRlZiB0ZXh0d2lkdGgoc2VsZiwgdGV4dCk6Ci0gICAgICAgIHJldHVybiBsZW4odGV4dCkKLSAgICAjCi0gICAgZGVmIGxpbmVoZWlnaHQoc2VsZik6Ci0gICAgICAgIHJldHVybiAxCi0gICAgIwotICAgIGRlZiBiYXNlbGluZShzZWxmKToKLSAgICAgICAgcmV0dXJuIDAKLQotCi0jIERyYXdpbmcgb2JqZWN0IGZvciB3cml0aW5nIHBsYWluIEFTQ0lJIHRleHQgdG8gYSBmaWxlCi1jbGFzcyBGaWxlV3JpdGVyOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZnApOgotICAgICAgICBzZWxmLmZwID0gZnAKLSAgICAgICAgc2VsZi5saW5lbm8sIHNlbGYuY29sbm8gPSAwLCAwCi0gICAgIwotICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnQpOgotICAgICAgICBwYXNzCi0gICAgIwotICAgIGRlZiB0ZXh0KHNlbGYsIChoLCB2KSwgc3RyKToKLSAgICAgICAgaWYgbm90IHN0cjogcmV0dXJuCi0gICAgICAgIGlmICdcbicgaW4gc3RyOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ2NhblwndCB3cml0ZSBcXG4nCi0gICAgICAgIHdoaWxlIHNlbGYubGluZW5vIDwgdjoKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoJ1xuJykKLSAgICAgICAgICAgIHNlbGYuY29sbm8sIHNlbGYubGluZW5vID0gMCwgc2VsZi5saW5lbm8gKyAxCi0gICAgICAgIHdoaWxlIHNlbGYubGluZW5vID4gdjoKLSAgICAgICAgICAgICMgWFhYIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgotICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnXDAzM1tBJykgIyBBTlNJIHVwIGFycm93Ci0gICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vIC0gMQotICAgICAgICBpZiBzZWxmLmNvbG5vIDwgaDoKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoJyAnICogKGggLSBzZWxmLmNvbG5vKSkKLSAgICAgICAgZWxpZiBzZWxmLmNvbG5vID4gaDoKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoJ1xiJyAqIChzZWxmLmNvbG5vIC0gaCkpCi0gICAgICAgIHNlbGYuY29sbm8gPSBoCi0gICAgICAgIHNlbGYuZnAud3JpdGUoc3RyKQotICAgICAgICBzZWxmLmNvbG5vID0gaCArIGxlbihzdHIpCi0KLQotIyBGb3JtYXR0aW5nIGNsYXNzIHRvIGRvIG5vdGhpbmcgYXQgYWxsIHdpdGggdGhlIGRhdGEKLWNsYXNzIE51bGxGb3JtYXR0ZXIoQmFzZUZvcm1hdHRlcik6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgZCA9IE51bGxNZWFzdXJlcigpCi0gICAgICAgIGIgPSBOdWxsQmFja0VuZCgpCi0gICAgICAgIEJhc2VGb3JtYXR0ZXIuX19pbml0X18oc2VsZiwgZCwgYikKLQotCi0jIEZvcm1hdHRpbmcgY2xhc3MgdG8gd3JpdGUgZGlyZWN0bHkgdG8gYSBmaWxlCi1jbGFzcyBXcml0aW5nRm9ybWF0dGVyKEJhc2VGb3JtYXR0ZXIpOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIHdpZHRoKToKLSAgICAgICAgZG0gPSBOdWxsTWVhc3VyZXIoKQotICAgICAgICBkdyA9IEZpbGVXcml0ZXIoZnApCi0gICAgICAgIGIgPSBXcml0aW5nQmFja0VuZChkdywgd2lkdGgpCi0gICAgICAgIEJhc2VGb3JtYXR0ZXIuX19pbml0X18oc2VsZiwgZG0sIGIpCi0gICAgICAgIHNlbGYuYmxhbmtsaW5lcyA9IDEKLSAgICAjCi0gICAgIyBTdXBwcmVzcyBtdWx0aXBsZSBibGFuayBsaW5lcwotICAgIGRlZiBuZWVkdnNwYWNlKHNlbGYsIG5saW5lcyk6Ci0gICAgICAgIEJhc2VGb3JtYXR0ZXIubmVlZHZzcGFjZShzZWxmLCBtaW4oMSwgbmxpbmVzKSkKLQotCi0jIEEgIkZ1bm55Rm9ybWF0dGVyIiB3cml0ZXMgQVNDSUkgdGV4dCB3aXRoIGEgdHdpc3Q6ICpib2xkIHdvcmRzKiwKLSMgX2l0YWxpYyB0ZXh0XyBhbmQgX3VuZGVybGluZWQgd29yZHNfLCBhbmQgYHF1b3RlZCB0ZXh0Jy4KLSMgSXQgYXNzdW1lcyB0aGF0IHRoZSBmb250cyBhcmUgJ3InLCAnaScsICdiJywgJ3UnLCAncSc6IChyb21hbiwKLSMgaXRhbGljLCBib2xkLCB1bmRlcmxpbmUsIHF1b3RlKS4KLSMgTW9yZW92ZXIsIGlmIHRoZSBmb250IGlzIGluIHVwcGVyIGNhc2UsIHRoZSB0ZXh0IGlzIGNvbnZlcnRlZCB0bwotIyBVUFBFUiBDQVNFLgotY2xhc3MgRnVubnlGb3JtYXR0ZXIoV3JpdGluZ0Zvcm1hdHRlcik6Ci0gICAgIwotICAgIGRlZiBmbHVzaChzZWxmKToKLSAgICAgICAgaWYgc2VsZi5wYXJhOiBmaW5hbGl6ZShzZWxmLnBhcmEpCi0gICAgICAgIFdyaXRpbmdGb3JtYXR0ZXIuZmx1c2goc2VsZikKLQotCi0jIFN1cnJvdW5kcyAqYm9sZCB3b3JkcyogYW5kIF9pdGFsaWMgdGV4dF8gaW4gYSBwYXJhZ3JhcGggd2l0aAotIyBhcHByb3ByaWF0ZSBtYXJrZXJzLCBmaXhpbmcgdGhlIHNpemUgKGFzc3VtaW5nIHRoZXNlIGNoYXJhY3RlcnMnCi0jIHdpZHRoIGlzIDEpLgotb3BlbmNoYXIgPSBcCi0gICAgeydiJzonKicsICdpJzonXycsICd1JzonXycsICdxJzonYCcsICdCJzonKicsICdJJzonXycsICdVJzonXycsICdRJzonYCd9Ci1jbG9zZWNoYXIgPSBcCi0gICAgeydiJzonKicsICdpJzonXycsICd1JzonXycsICdxJzonXCcnLCAnQic6JyonLCAnSSc6J18nLCAnVSc6J18nLCAnUSc6J1wnJ30KLWRlZiBmaW5hbGl6ZShwYXJhKToKLSAgICBvbGRmb250ID0gY3VyZm9udCA9ICdyJwotICAgIHBhcmEud29yZHMuYXBwZW5kKCgncicsICcnLCAwLCAwLCAwLCAwKSkgIyB0ZW1wb3JhcnksIGRlbGV0ZWQgYXQgZW5kCi0gICAgZm9yIGkgaW4gcmFuZ2UobGVuKHBhcmEud29yZHMpKToKLSAgICAgICAgZm8sIHRlLCB3aSA9IHBhcmEud29yZHNbaV1bOjNdCi0gICAgICAgIGlmIGZvIGlzIG5vdCBOb25lOiBjdXJmb250ID0gZm8KLSAgICAgICAgaWYgY3VyZm9udCAhPSBvbGRmb250OgotICAgICAgICAgICAgaWYgY2xvc2VjaGFyLmhhc19rZXkob2xkZm9udCk6Ci0gICAgICAgICAgICAgICAgYyA9IGNsb3NlY2hhcltvbGRmb250XQotICAgICAgICAgICAgICAgIGogPSBpLTEKLSAgICAgICAgICAgICAgICB3aGlsZSBqID4gMCBhbmQgcGFyYS53b3Jkc1tqXVsxXSA9PSAnJzogaiA9IGotMQotICAgICAgICAgICAgICAgIGZvMSwgdGUxLCB3aTEgPSBwYXJhLndvcmRzW2pdWzozXQotICAgICAgICAgICAgICAgIHRlMSA9IHRlMSArIGMKLSAgICAgICAgICAgICAgICB3aTEgPSB3aTEgKyBsZW4oYykKLSAgICAgICAgICAgICAgICBwYXJhLndvcmRzW2pdID0gKGZvMSwgdGUxLCB3aTEpICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYS53b3Jkc1tqXVszOl0KLSAgICAgICAgICAgIGlmIG9wZW5jaGFyLmhhc19rZXkoY3VyZm9udCkgYW5kIHRlOgotICAgICAgICAgICAgICAgIGMgPSBvcGVuY2hhcltjdXJmb250XQotICAgICAgICAgICAgICAgIHRlID0gYyArIHRlCi0gICAgICAgICAgICAgICAgd2kgPSBsZW4oYykgKyB3aQotICAgICAgICAgICAgICAgIHBhcmEud29yZHNbaV0gPSAoZm8sIHRlLCB3aSkgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhLndvcmRzW2ldWzM6XQotICAgICAgICAgICAgaWYgdGU6IG9sZGZvbnQgPSBjdXJmb250Ci0gICAgICAgICAgICBlbHNlOiBvbGRmb250ID0gJ3InCi0gICAgICAgIGlmIGN1cmZvbnQgaW4gc3RyaW5nLnVwcGVyY2FzZToKLSAgICAgICAgICAgIHRlID0gc3RyaW5nLnVwcGVyKHRlKQotICAgICAgICAgICAgcGFyYS53b3Jkc1tpXSA9IChmbywgdGUsIHdpKSArIHBhcmEud29yZHNbaV1bMzpdCi0gICAgZGVsIHBhcmEud29yZHNbLTFdCi0KLQotIyBGb3JtYXR0ZXIgYmFjay1lbmQgdG8gZHJhdyB0aGUgdGV4dCBpbiBhIHdpbmRvdy4KLSMgVGhpcyBoYXMgYW4gb3B0aW9uIHRvIGRyYXcgd2hpbGUgdGhlIHBhcmFncmFwaHMgYXJlIGJlaW5nIGFkZGVkLAotIyB0byBtaW5pbWl6ZSB0aGUgZGVsYXkgYmVmb3JlIHRoZSB1c2VyIHNlZXMgYW55dGhpbmcuCi0jIFRoaXMgbWFuYWdlcyB0aGUgZW50aXJlICJkb2N1bWVudCIgb2YgdGhlIHdpbmRvdy4KLWNsYXNzIFN0ZHdpbkJhY2tFbmQoU2F2aW5nQmFja0VuZCk6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aW5kb3csIGRyYXdub3cpOgotICAgICAgICBzZWxmLndpbmRvdyA9IHdpbmRvdwotICAgICAgICBzZWxmLmRyYXdub3cgPSBkcmF3bm93Ci0gICAgICAgIHNlbGYud2lkdGggPSB3aW5kb3cuZ2V0d2luc2l6ZSgpWzBdCi0gICAgICAgIHNlbGYuc2VsZWN0aW9uID0gTm9uZQotICAgICAgICBzZWxmLmhlaWdodCA9IDAKLSAgICAgICAgd2luZG93LnNldG9yaWdpbigwLCAwKQotICAgICAgICB3aW5kb3cuc2V0ZG9jc2l6ZSgwLCAwKQotICAgICAgICBzZWxmLmQgPSB3aW5kb3cuYmVnaW5kcmF3aW5nKCkKLSAgICAgICAgU2F2aW5nQmFja0VuZC5fX2luaXRfXyhzZWxmKQotICAgICMKLSAgICBkZWYgZmluaXNoKHNlbGYpOgotICAgICAgICBzZWxmLmQuY2xvc2UoKQotICAgICAgICBzZWxmLmQgPSBOb25lCi0gICAgICAgIHNlbGYud2luZG93LnNldGRvY3NpemUoMCwgc2VsZi5oZWlnaHQpCi0gICAgIwotICAgIGRlZiBhZGRwYXJhKHNlbGYsIHApOgotICAgICAgICBzZWxmLnBhcmFsaXN0LmFwcGVuZChwKQotICAgICAgICBpZiBzZWxmLmRyYXdub3c6Ci0gICAgICAgICAgICBzZWxmLmhlaWdodCA9IFwKLSAgICAgICAgICAgICAgICAgICAgcC5yZW5kZXIoc2VsZi5kLCAwLCBzZWxmLmhlaWdodCwgc2VsZi53aWR0aCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHAubGF5b3V0KHNlbGYud2lkdGgpCi0gICAgICAgICAgICBwLmxlZnQgPSAwCi0gICAgICAgICAgICBwLnRvcCA9IHNlbGYuaGVpZ2h0Ci0gICAgICAgICAgICBwLnJpZ2h0ID0gc2VsZi53aWR0aAotICAgICAgICAgICAgcC5ib3R0b20gPSBzZWxmLmhlaWdodCArIHAuaGVpZ2h0Ci0gICAgICAgICAgICBzZWxmLmhlaWdodCA9IHAuYm90dG9tCi0gICAgIwotICAgIGRlZiByZXNpemUoc2VsZik6Ci0gICAgICAgIHNlbGYud2luZG93LmNoYW5nZSgoMCwgMCksIChzZWxmLndpZHRoLCBzZWxmLmhlaWdodCkpCi0gICAgICAgIHNlbGYud2lkdGggPSBzZWxmLndpbmRvdy5nZXR3aW5zaXplKClbMF0KLSAgICAgICAgc2VsZi5oZWlnaHQgPSAwCi0gICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0gICAgICAgICAgICBwLmxheW91dChzZWxmLndpZHRoKQotICAgICAgICAgICAgcC5sZWZ0ID0gMAotICAgICAgICAgICAgcC50b3AgPSBzZWxmLmhlaWdodAotICAgICAgICAgICAgcC5yaWdodCA9IHNlbGYud2lkdGgKLSAgICAgICAgICAgIHAuYm90dG9tID0gc2VsZi5oZWlnaHQgKyBwLmhlaWdodAotICAgICAgICAgICAgc2VsZi5oZWlnaHQgPSBwLmJvdHRvbQotICAgICAgICBzZWxmLndpbmRvdy5jaGFuZ2UoKDAsIDApLCAoc2VsZi53aWR0aCwgc2VsZi5oZWlnaHQpKQotICAgICAgICBzZWxmLndpbmRvdy5zZXRkb2NzaXplKDAsIHNlbGYuaGVpZ2h0KQotICAgICMKLSAgICBkZWYgcmVkcmF3KHNlbGYsIGFyZWEpOgotICAgICAgICBkID0gc2VsZi53aW5kb3cuYmVnaW5kcmF3aW5nKCkKLSAgICAgICAgKGxlZnQsIHRvcCksIChyaWdodCwgYm90dG9tKSA9IGFyZWEKLSAgICAgICAgZC5lcmFzZShhcmVhKQotICAgICAgICBkLmNsaXByZWN0KGFyZWEpCi0gICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0gICAgICAgICAgICBpZiB0b3AgPCBwLmJvdHRvbSBhbmQgcC50b3AgPCBib3R0b206Ci0gICAgICAgICAgICAgICAgdiA9IHAucmVuZGVyKGQsIHAubGVmdCwgcC50b3AsIHAucmlnaHQpCi0gICAgICAgIGlmIHNlbGYuc2VsZWN0aW9uOgotICAgICAgICAgICAgc2VsZi5pbnZlcnQoZCwgc2VsZi5zZWxlY3Rpb24pCi0gICAgICAgIGQuY2xvc2UoKQotICAgICMKLSAgICBkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIG5ldyk6Ci0gICAgICAgIGlmIG5ldzoKLSAgICAgICAgICAgIGxvbmcxLCBsb25nMiA9IG5ldwotICAgICAgICAgICAgcG9zMSA9IGxvbmcxWzozXQotICAgICAgICAgICAgcG9zMiA9IGxvbmcyWzozXQotICAgICAgICAgICAgbmV3ID0gcG9zMSwgcG9zMgotICAgICAgICBpZiBuZXcgIT0gc2VsZi5zZWxlY3Rpb246Ci0gICAgICAgICAgICBkID0gc2VsZi53aW5kb3cuYmVnaW5kcmF3aW5nKCkKLSAgICAgICAgICAgIGlmIHNlbGYuc2VsZWN0aW9uOgotICAgICAgICAgICAgICAgIHNlbGYuaW52ZXJ0KGQsIHNlbGYuc2VsZWN0aW9uKQotICAgICAgICAgICAgaWYgbmV3OgotICAgICAgICAgICAgICAgIHNlbGYuaW52ZXJ0KGQsIG5ldykKLSAgICAgICAgICAgIGQuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5zZWxlY3Rpb24gPSBuZXcKLSAgICAjCi0gICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuc2VsZWN0aW9uCi0gICAgIwotICAgIGRlZiBleHRyYWN0c2VsZWN0aW9uKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnNlbGVjdGlvbjoKLSAgICAgICAgICAgIGEsIGIgPSBzZWxmLnNlbGVjdGlvbgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXh0cmFjdHBhcnQoYSwgYikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgIwotICAgIGRlZiBpbnZlcnQoc2VsZiwgZCwgcmVnaW9uKToKLSAgICAgICAgbG9uZzEsIGxvbmcyID0gcmVnaW9uCi0gICAgICAgIGlmIGxvbmcxID4gbG9uZzI6IGxvbmcxLCBsb25nMiA9IGxvbmcyLCBsb25nMQotICAgICAgICBwYXJhMSwgcG9zMSA9IGxvbmcxCi0gICAgICAgIHBhcmEyLCBwb3MyID0gbG9uZzIKLSAgICAgICAgd2hpbGUgcGFyYTEgPCBwYXJhMjoKLSAgICAgICAgICAgIHNlbGYucGFyYWxpc3RbcGFyYTFdLmludmVydChkLCBwb3MxLCBOb25lKQotICAgICAgICAgICAgcG9zMSA9IE5vbmUKLSAgICAgICAgICAgIHBhcmExID0gcGFyYTEgKyAxCi0gICAgICAgIHNlbGYucGFyYWxpc3RbcGFyYTJdLmludmVydChkLCBwb3MxLCBwb3MyKQotICAgICMKLSAgICBkZWYgc2VhcmNoKHNlbGYsIHByb2cpOgotICAgICAgICBpbXBvcnQgcmUsIHN0cmluZwotICAgICAgICBpZiB0eXBlKHByb2cpIGlzIHR5cGUoJycpOgotICAgICAgICAgICAgcHJvZyA9IHJlLmNvbXBpbGUoc3RyaW5nLmxvd2VyKHByb2cpKQotICAgICAgICBpZiBzZWxmLnNlbGVjdGlvbjoKLSAgICAgICAgICAgIGlvbGQgPSBzZWxmLnNlbGVjdGlvblswXVswXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaW9sZCA9IC0xCi0gICAgICAgIGhpdCA9IE5vbmUKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYucGFyYWxpc3QpKToKLSAgICAgICAgICAgIGlmIGkgPT0gaW9sZCBvciBpIDwgaW9sZCBhbmQgaGl0OgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBwID0gc2VsZi5wYXJhbGlzdFtpXQotICAgICAgICAgICAgdGV4dCA9IHN0cmluZy5sb3dlcihwLmV4dHJhY3QoKSkKLSAgICAgICAgICAgIG1hdGNoID0gcHJvZy5zZWFyY2godGV4dCkKLSAgICAgICAgICAgIGlmIG1hdGNoOgotICAgICAgICAgICAgICAgIGEsIGIgPSBtYXRjaC5ncm91cCgwKQotICAgICAgICAgICAgICAgIGxvbmcxID0gaSwgYQotICAgICAgICAgICAgICAgIGxvbmcyID0gaSwgYgotICAgICAgICAgICAgICAgIGhpdCA9IGxvbmcxLCBsb25nMgotICAgICAgICAgICAgICAgIGlmIGkgPiBpb2xkOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICBpZiBoaXQ6Ci0gICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihoaXQpCi0gICAgICAgICAgICBpID0gaGl0WzBdWzBdCi0gICAgICAgICAgICBwID0gc2VsZi5wYXJhbGlzdFtpXQotICAgICAgICAgICAgc2VsZi53aW5kb3cuc2hvdygocC5sZWZ0LCBwLnRvcCksIChwLnJpZ2h0LCBwLmJvdHRvbSkpCi0gICAgICAgICAgICByZXR1cm4gMQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIDAKLSAgICAjCi0gICAgZGVmIHNob3dhbmNob3Ioc2VsZiwgaWQpOgotICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5wYXJhbGlzdCkpOgotICAgICAgICAgICAgcCA9IHNlbGYucGFyYWxpc3RbaV0KLSAgICAgICAgICAgIGlmIHAuaGFzYW5jaG9yKGlkKToKLSAgICAgICAgICAgICAgICBsb25nMSA9IGksIDAKLSAgICAgICAgICAgICAgICBsb25nMiA9IGksIGxlbihwLmV4dHJhY3QoKSkKLSAgICAgICAgICAgICAgICBoaXQgPSBsb25nMSwgbG9uZzIKLSAgICAgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihoaXQpCi0gICAgICAgICAgICAgICAgc2VsZi53aW5kb3cuc2hvdygKLSAgICAgICAgICAgICAgICAgICAgICAgIChwLmxlZnQsIHAudG9wKSwgKHAucmlnaHQsIHAuYm90dG9tKSkKLSAgICAgICAgICAgICAgICBicmVhawotCi0KLSMgR0wgZXh0ZW5zaW9ucwotCi1jbGFzcyBHTEZvbnRDYWNoZToKLSAgICAjCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnJlc2V0KCkKLSAgICAgICAgc2VsZi5zZXRmb250KCcnKQotICAgICMKLSAgICBkZWYgcmVzZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuZm9udGtleSA9IE5vbmUKLSAgICAgICAgc2VsZi5mb250aGFuZGxlID0gTm9uZQotICAgICAgICBzZWxmLmZvbnRpbmZvID0gTm9uZQotICAgICAgICBzZWxmLmZvbnRjYWNoZSA9IHt9Ci0gICAgIwotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2VsZi5yZXNldCgpCi0gICAgIwotICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnRrZXkpOgotICAgICAgICBpZiBmb250a2V5ID09ICcnOgotICAgICAgICAgICAgZm9udGtleSA9ICdUaW1lcy1Sb21hbiAxMicKLSAgICAgICAgZWxpZiAnICcgbm90IGluIGZvbnRrZXk6Ci0gICAgICAgICAgICBmb250a2V5ID0gZm9udGtleSArICcgMTInCi0gICAgICAgIGlmIGZvbnRrZXkgPT0gc2VsZi5mb250a2V5OgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHNlbGYuZm9udGNhY2hlLmhhc19rZXkoZm9udGtleSk6Ci0gICAgICAgICAgICBoYW5kbGUgPSBzZWxmLmZvbnRjYWNoZVtmb250a2V5XQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaW1wb3J0IHN0cmluZwotICAgICAgICAgICAgaSA9IHN0cmluZy5pbmRleChmb250a2V5LCAnICcpCi0gICAgICAgICAgICBuYW1lLCBzaXplc3RyID0gZm9udGtleVs6aV0sIGZvbnRrZXlbaTpdCi0gICAgICAgICAgICBzaXplID0gZXZhbChzaXplc3RyKQotICAgICAgICAgICAga2V5MSA9IG5hbWUgKyAnIDEnCi0gICAgICAgICAgICBrZXkgPSBuYW1lICsgJyAnICsgYHNpemVgCi0gICAgICAgICAgICAjIE5CIGtleSBtYXkgZGlmZmVyIGZyb20gZm9udGtleSEKLSAgICAgICAgICAgIGlmIHNlbGYuZm9udGNhY2hlLmhhc19rZXkoa2V5KToKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBzZWxmLmZvbnRjYWNoZVtrZXldCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGlmIHNlbGYuZm9udGNhY2hlLmhhc19rZXkoa2V5MSk6Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IHNlbGYuZm9udGNhY2hlW2tleTFdCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGZtCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IGZtLmZpbmRmb250KG5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuZm9udGNhY2hlW2tleTFdID0gaGFuZGxlCi0gICAgICAgICAgICAgICAgaGFuZGxlID0gaGFuZGxlLnNjYWxlZm9udChzaXplKQotICAgICAgICAgICAgICAgIHNlbGYuZm9udGNhY2hlW2ZvbnRrZXldID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb250Y2FjaGVba2V5XSA9IGhhbmRsZQotICAgICAgICBzZWxmLmZvbnRrZXkgPSBmb250a2V5Ci0gICAgICAgIGlmIHNlbGYuZm9udGhhbmRsZSAhPSBoYW5kbGU6Ci0gICAgICAgICAgICBzZWxmLmZvbnRoYW5kbGUgPSBoYW5kbGUKLSAgICAgICAgICAgIHNlbGYuZm9udGluZm8gPSBoYW5kbGUuZ2V0Zm9udGluZm8oKQotICAgICAgICAgICAgaGFuZGxlLnNldGZvbnQoKQotCi0KLWNsYXNzIEdMTWVhc3VyZXIoR0xGb250Q2FjaGUpOgotICAgICMKLSAgICBkZWYgdGV4dHdpZHRoKHNlbGYsIHRleHQpOgotICAgICAgICByZXR1cm4gc2VsZi5mb250aGFuZGxlLmdldHN0cndpZHRoKHRleHQpCi0gICAgIwotICAgIGRlZiBiYXNlbGluZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZm9udGluZm9bNl0gLSBzZWxmLmZvbnRpbmZvWzNdCi0gICAgIwotICAgIGRlZiBsaW5laGVpZ2h0KHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5mb250aW5mb1s2XQotCi0KLWNsYXNzIEdMV3JpdGVyKEdMRm9udENhY2hlKToKLSAgICAjCi0gICAgIyBOT1RFUzoKLSAgICAjICgxKSBVc2UgZ2wub3J0aG8yIHRvIHVzZSBYIHBpeGVsIGNvb3JkaW5hdGVzIQotICAgICMKLSAgICBkZWYgdGV4dChzZWxmLCAoaCwgdiksIHRleHQpOgotICAgICAgICBpbXBvcnQgZ2wsIGZtCi0gICAgICAgIGdsLmNtb3YyaShoLCB2ICsgc2VsZi5mb250aW5mb1s2XSAtIHNlbGYuZm9udGluZm9bM10pCi0gICAgICAgIGZtLnByc3RyKHRleHQpCi0gICAgIwotICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnRrZXkpOgotICAgICAgICBvbGRoYW5kbGUgPSBzZWxmLmZvbnRoYW5kbGUKLSAgICAgICAgR0xGb250Q2FjaGUuc2V0Zm9udChmb250a2V5KQotICAgICAgICBpZiBzZWxmLmZvbnRoYW5kbGUgIT0gb2xkaGFuZGxlOgotICAgICAgICAgICAgaGFuZGxlLnNldGZvbnQoKQotCi0KLWNsYXNzIEdMTWVhc3VyZXJXcml0ZXIoR0xNZWFzdXJlciwgR0xXcml0ZXIpOgotICAgIHBhc3MKLQotCi1jbGFzcyBHTEJhY2tFbmQoU2F2aW5nQmFja0VuZCk6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aWQpOgotICAgICAgICBpbXBvcnQgZ2wKLSAgICAgICAgZ2wud2luc2V0KHdpZCkKLSAgICAgICAgc2VsZi53aWQgPSB3aWQKLSAgICAgICAgc2VsZi53aWR0aCA9IGdsLmdldHNpemUoKVsxXQotICAgICAgICBzZWxmLmhlaWdodCA9IDAKLSAgICAgICAgc2VsZi5kID0gR0xNZWFzdXJlcldyaXRlcigpCi0gICAgICAgIFNhdmluZ0JhY2tFbmQuX19pbml0X18oc2VsZikKLSAgICAjCi0gICAgZGVmIGZpbmlzaChzZWxmKToKLSAgICAgICAgcGFzcwotICAgICMKLSAgICBkZWYgYWRkcGFyYShzZWxmLCBwKToKLSAgICAgICAgc2VsZi5wYXJhbGlzdC5hcHBlbmQocCkKLSAgICAgICAgc2VsZi5oZWlnaHQgPSBwLnJlbmRlcihzZWxmLmQsIDAsIHNlbGYuaGVpZ2h0LCBzZWxmLndpZHRoKQotICAgICMKLSAgICBkZWYgcmVkcmF3KHNlbGYpOgotICAgICAgICBpbXBvcnQgZ2wKLSAgICAgICAgZ2wud2luc2V0KHNlbGYud2lkKQotICAgICAgICB3aWR0aCA9IGdsLmdldHNpemUoKVsxXQotICAgICAgICBpZiB3aWR0aCAhPSBzZWxmLndpZHRoOgotICAgICAgICAgICAgc2V0ZG9jc2l6ZSA9IDEKLSAgICAgICAgICAgIHNlbGYud2lkdGggPSB3aWR0aAotICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbGlzdDoKLSAgICAgICAgICAgICAgICBwLnRvcCA9IHAuYm90dG9tID0gTm9uZQotICAgICAgICBkID0gc2VsZi5kCi0gICAgICAgIHYgPSAwCi0gICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0gICAgICAgICAgICB2ID0gcC5yZW5kZXIoZCwgMCwgdiwgd2lkdGgpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9ncmVwLnB5IGIvTGliL2xpYi1vbGQvZ3JlcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyNjc0Ni4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9ncmVwLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIyAnZ3JlcCcKLQotaW1wb3J0IHJlZ2V4Ci1mcm9tIHJlZ2V4X3N5bnRheCBpbXBvcnQgKgotCi1vcHRfc2hvd193aGVyZSA9IDAKLW9wdF9zaG93X2ZpbGVuYW1lID0gMAotb3B0X3Nob3dfbGluZW5vID0gMQotCi1kZWYgZ3JlcChwYXQsICpmaWxlcyk6Ci0gICAgcmV0dXJuIGdncmVwKFJFX1NZTlRBWF9HUkVQLCBwYXQsIGZpbGVzKQotCi1kZWYgZWdyZXAocGF0LCAqZmlsZXMpOgotICAgIHJldHVybiBnZ3JlcChSRV9TWU5UQVhfRUdSRVAsIHBhdCwgZmlsZXMpCi0KLWRlZiBlbWdyZXAocGF0LCAqZmlsZXMpOgotICAgIHJldHVybiBnZ3JlcChSRV9TWU5UQVhfRU1BQ1MsIHBhdCwgZmlsZXMpCi0KLWRlZiBnZ3JlcChzeW50YXgsIHBhdCwgZmlsZXMpOgotICAgIGlmIGxlbihmaWxlcykgPT0gMSBhbmQgdHlwZShmaWxlc1swXSkgPT0gdHlwZShbXSk6Ci0gICAgICAgIGZpbGVzID0gZmlsZXNbMF0KLSAgICBnbG9iYWwgb3B0X3Nob3dfZmlsZW5hbWUKLSAgICBvcHRfc2hvd19maWxlbmFtZSA9IChsZW4oZmlsZXMpICE9IDEpCi0gICAgc3ludGF4ID0gcmVnZXguc2V0X3N5bnRheChzeW50YXgpCi0gICAgdHJ5OgotICAgICAgICBwcm9nID0gcmVnZXguY29tcGlsZShwYXQpCi0gICAgZmluYWxseToKLSAgICAgICAgc3ludGF4ID0gcmVnZXguc2V0X3N5bnRheChzeW50YXgpCi0gICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgotICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICdyJykKLSAgICAgICAgbGluZW5vID0gMAotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawotICAgICAgICAgICAgbGluZW5vID0gbGluZW5vICsgMQotICAgICAgICAgICAgaWYgcHJvZy5zZWFyY2gobGluZSkgPj0gMDoKLSAgICAgICAgICAgICAgICBzaG93bGluZShmaWxlbmFtZSwgbGluZW5vLCBsaW5lLCBwcm9nKQotICAgICAgICBmcC5jbG9zZSgpCi0KLWRlZiBwZ3JlcChwYXQsICpmaWxlcyk6Ci0gICAgaWYgbGVuKGZpbGVzKSA9PSAxIGFuZCB0eXBlKGZpbGVzWzBdKSA9PSB0eXBlKFtdKToKLSAgICAgICAgZmlsZXMgPSBmaWxlc1swXQotICAgIGdsb2JhbCBvcHRfc2hvd19maWxlbmFtZQotICAgIG9wdF9zaG93X2ZpbGVuYW1lID0gKGxlbihmaWxlcykgIT0gMSkKLSAgICBpbXBvcnQgcmUKLSAgICBwcm9nID0gcmUuY29tcGlsZShwYXQpCi0gICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgotICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICdyJykKLSAgICAgICAgbGluZW5vID0gMAotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawotICAgICAgICAgICAgbGluZW5vID0gbGluZW5vICsgMQotICAgICAgICAgICAgaWYgcHJvZy5zZWFyY2gobGluZSk6Ci0gICAgICAgICAgICAgICAgc2hvd2xpbmUoZmlsZW5hbWUsIGxpbmVubywgbGluZSwgcHJvZykKLSAgICAgICAgZnAuY2xvc2UoKQotCi1kZWYgc2hvd2xpbmUoZmlsZW5hbWUsIGxpbmVubywgbGluZSwgcHJvZyk6Ci0gICAgaWYgbGluZVstMTpdID09ICdcbic6IGxpbmUgPSBsaW5lWzotMV0KLSAgICBpZiBvcHRfc2hvd19saW5lbm86Ci0gICAgICAgIHByZWZpeCA9IGBsaW5lbm9gLnJqdXN0KDMpICsgJzogJwotICAgIGVsc2U6Ci0gICAgICAgIHByZWZpeCA9ICcnCi0gICAgaWYgb3B0X3Nob3dfZmlsZW5hbWU6Ci0gICAgICAgIHByZWZpeCA9IGZpbGVuYW1lICsgJzogJyArIHByZWZpeAotICAgIHByaW50IHByZWZpeCArIGxpbmUKLSAgICBpZiBvcHRfc2hvd193aGVyZToKLSAgICAgICAgc3RhcnQsIGVuZCA9IHByb2cucmVncygpWzBdCi0gICAgICAgIGxpbmUgPSBsaW5lWzpzdGFydF0KLSAgICAgICAgaWYgJ1x0JyBub3QgaW4gbGluZToKLSAgICAgICAgICAgIHByZWZpeCA9ICcgJyAqIChsZW4ocHJlZml4KSArIHN0YXJ0KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJlZml4ID0gJyAnICogbGVuKHByZWZpeCkKLSAgICAgICAgICAgIGZvciBjIGluIGxpbmU6Ci0gICAgICAgICAgICAgICAgaWYgYyAhPSAnXHQnOiBjID0gJyAnCi0gICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4ICsgYwotICAgICAgICBpZiBzdGFydCA9PSBlbmQ6IHByZWZpeCA9IHByZWZpeCArICdcXCcKLSAgICAgICAgZWxzZTogcHJlZml4ID0gcHJlZml4ICsgJ14nKihlbmQtc3RhcnQpCi0gICAgICAgIHByaW50IHByZWZpeApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvbG9ja2ZpbGUucHkgYi9MaWIvbGliLW9sZC9sb2NrZmlsZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlOWI0OC4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9sb2NrZmlsZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWltcG9ydCBzdHJ1Y3QsIGZjbnRsCi0KLWRlZiB3cml0ZWxvY2soZik6Ci0gICAgX2xvY2soZiwgZmNudGwuRl9XUkxDSykKLQotZGVmIHJlYWRsb2NrKGYpOgotICAgIF9sb2NrKGYsIGZjbnRsLkZfUkRMQ0spCi0KLWRlZiB1bmxvY2soZik6Ci0gICAgX2xvY2soZiwgZmNudGwuRl9VTkxDSykKLQotZGVmIF9sb2NrKGYsIG9wKToKLSAgICBkdW1teSA9IGZjbnRsLmZjbnRsKGYuZmlsZW5vKCksIGZjbnRsLkZfU0VUTEtXLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LnBhY2soJzJoOGwnLCBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvbmV3ZGlyLnB5IGIvTGliL2xpYi1vbGQvbmV3ZGlyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTZiZWNjLi4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL25ld2Rpci5weQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMgTmV3IGRpcigpIGZ1bmN0aW9uCi0KLQotIyBUaGlzIHNob3VsZCBiZSB0aGUgbmV3IGRpcigpLCBleGNlcHQgdGhhdCBpdCBzaG91bGQgc3RpbGwgbGlzdAotIyB0aGUgY3VycmVudCBsb2NhbCBuYW1lIHNwYWNlIGJ5IGRlZmF1bHQKLQotZGVmIGxpc3RhdHRycyh4KToKLSAgICB0cnk6Ci0gICAgICAgIGRpY3RrZXlzID0geC5fX2RpY3RfXy5rZXlzKCkKLSAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgotICAgICAgICBkaWN0a2V5cyA9IFtdCi0gICAgIwotICAgIHRyeToKLSAgICAgICAgbWV0aG9kcyA9IHguX19tZXRob2RzX18KLSAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgotICAgICAgICBtZXRob2RzID0gW10KLSAgICAjCi0gICAgdHJ5OgotICAgICAgICBtZW1iZXJzID0geC5fX21lbWJlcnNfXwotICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6Ci0gICAgICAgIG1lbWJlcnMgPSBbXQotICAgICMKLSAgICB0cnk6Ci0gICAgICAgIHRoZV9jbGFzcyA9IHguX19jbGFzc19fCi0gICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKLSAgICAgICAgdGhlX2NsYXNzID0gTm9uZQotICAgICMKLSAgICB0cnk6Ci0gICAgICAgIGJhc2VzID0geC5fX2Jhc2VzX18KLSAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgotICAgICAgICBiYXNlcyA9ICgpCi0gICAgIwotICAgIHRvdGFsID0gZGljdGtleXMgKyBtZXRob2RzICsgbWVtYmVycwotICAgIGlmIHRoZV9jbGFzczoKLSAgICAgICAgIyBJdCdzIGEgY2xhc3MgaW5zdGFjZTsgYWRkIHRoZSBjbGFzcydzIGF0dHJpYnV0ZXMKLSAgICAgICAgIyB0aGF0IGFyZSBmdW5jdGlvbnMgKG1ldGhvZHMpLi4uCi0gICAgICAgIGNsYXNzX2F0dHJzID0gbGlzdGF0dHJzKHRoZV9jbGFzcykKLSAgICAgICAgY2xhc3NfbWV0aG9kcyA9IFtdCi0gICAgICAgIGZvciBuYW1lIGluIGNsYXNzX2F0dHJzOgotICAgICAgICAgICAgaWYgaXNfZnVuY3Rpb24oZ2V0YXR0cih0aGVfY2xhc3MsIG5hbWUpKToKLSAgICAgICAgICAgICAgICBjbGFzc19tZXRob2RzLmFwcGVuZChuYW1lKQotICAgICAgICB0b3RhbCA9IHRvdGFsICsgY2xhc3NfbWV0aG9kcwotICAgIGVsaWYgYmFzZXM6Ci0gICAgICAgICMgSXQncyBhIGRlcml2ZWQgY2xhc3M7IGFkZCB0aGUgYmFzZSBjbGFzcyBhdHRyaWJ1dGVzCi0gICAgICAgIGZvciBiYXNlIGluIGJhc2VzOgotICAgICAgICAgICAgYmFzZV9hdHRycyA9IGxpc3RhdHRycyhiYXNlKQotICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIGJhc2VfYXR0cnMKLSAgICB0b3RhbC5zb3J0KCkKLSAgICByZXR1cm4gdG90YWwKLSAgICBpID0gMAotICAgIHdoaWxlIGkrMSA8IGxlbih0b3RhbCk6Ci0gICAgICAgIGlmIHRvdGFsW2ldID09IHRvdGFsW2krMV06Ci0gICAgICAgICAgICBkZWwgdG90YWxbaSsxXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaSA9IGkrMQotICAgIHJldHVybiB0b3RhbAotCi0KLSMgSGVscGVyIHRvIHJlY29nbml6ZSBmdW5jdGlvbnMKLQotZGVmIGlzX2Z1bmN0aW9uKHgpOgotICAgIHJldHVybiB0eXBlKHgpID09IHR5cGUoaXNfZnVuY3Rpb24pCi0KLQotIyBBcHByb3hpbWF0aW9uIG9mIGJ1aWx0aW4gZGlyKCk7IGJ1dCBub3RlIHRoYXQgdGhpcyBsaXN0cyB0aGUgdXNlcidzCi0jIHZhcmlhYmxlcyBieSBkZWZhdWx0LCBub3QgdGhlIGN1cnJlbnQgbG9jYWwgbmFtZSBzcGFjZS4KLQotZGVmIGRpcih4ID0gTm9uZSk6Ci0gICAgaWYgeCBpcyBub3QgTm9uZToKLSAgICAgICAgcmV0dXJuIGxpc3RhdHRycyh4KQotICAgIGVsc2U6Ci0gICAgICAgIGltcG9ydCBfX21haW5fXwotICAgICAgICByZXR1cm4gbGlzdGF0dHJzKF9fbWFpbl9fKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvbmkucHkgYi9MaWIvbGliLW9sZC9uaS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0Zjk4OS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9uaS5weQorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0iIiJOZXcgaW1wb3J0IHNjaGVtZSB3aXRoIHBhY2thZ2Ugc3VwcG9ydC4KLQotUXVpY2sgUmVmZXJlbmNlCi0tLS0tLS0tLS0tLS0tLS0KLQotLSBUbyBlbmFibGUgcGFja2FnZSBzdXBwb3J0LCBleGVjdXRlICJpbXBvcnQgbmkiIGJlZm9yZSBpbXBvcnRpbmcgYW55Ci0gIHBhY2thZ2VzLiAgSW1wb3J0aW5nIHRoaXMgbW9kdWxlIGF1dG9tYXRpY2FsbHkgaW5zdGFsbHMgdGhlIHJlbGV2YW50Ci0gIGltcG9ydCBob29rcy4KLQotLSBUbyBjcmVhdGUgYSBwYWNrYWdlIG5hbWVkIHNwYW0gY29udGFpbmluZyBzdWItbW9kdWxlcyBoYW0sIGJhY29uIGFuZAotICBlZ2dzLCBjcmVhdGUgYSBkaXJlY3Rvcnkgc3BhbSBzb21ld2hlcmUgb24gUHl0aG9uJ3MgbW9kdWxlIHNlYXJjaAotICBwYXRoIChpLmUuIHNwYW0ncyBwYXJlbnQgZGlyZWN0b3J5IG11c3QgYmUgb25lIG9mIHRoZSBkaXJlY3RvcmllcyBpbgotICBzeXMucGF0aCBvciAkUFlUSE9OUEFUSCk7IHRoZW4gY3JlYXRlIGZpbGVzIGhhbS5weSwgYmFjb24ucHkgYW5kCi0gIGVnZ3MucHkgaW5zaWRlIHNwYW0uCi0KLS0gVG8gaW1wb3J0IG1vZHVsZSBoYW0gZnJvbSBwYWNrYWdlIHNwYW0gYW5kIHVzZSBmdW5jdGlvbiBoYW1uZWdncygpCi0gIGZyb20gdGhhdCBtb2R1bGUsIHlvdSBjYW4gZWl0aGVyIGRvCi0KLSAgICBpbXBvcnQgc3BhbS5oYW0gICAgICAgICAgICAgIyAqbm90KiAiaW1wb3J0IHNwYW0iICEhIQotICAgIHNwYW0uaGFtLmhhbW5lZ2dzKCkKLQotICBvcgotCi0gICAgZnJvbSBzcGFtIGltcG9ydCBoYW0KLSAgICBoYW0uaGFtbmVnZ3MoKQotCi0gIG9yCi0KLSAgICBmcm9tIHNwYW0uaGFtIGltcG9ydCBoYW1uZWdncwotICAgIGhhbW5lZ2dzKCkKLQotLSBJbXBvcnRpbmcganVzdCAic3BhbSIgZG9lcyBub3QgZG8gd2hhdCB5b3UgZXhwZWN0OiBpdCBjcmVhdGVzIGFuCi0gIGVtcHR5IHBhY2thZ2UgbmFtZWQgc3BhbSBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgYnV0IGl0IGRvZXMKLSAgbm90IGltcG9ydCBzcGFtJ3Mgc3VibW9kdWxlcy4gIFRoZSBvbmx5IHN1Ym1vZHVsZSB0aGF0IGlzIGd1YXJhbnRlZWQKLSAgdG8gYmUgaW1wb3J0ZWQgaXMgc3BhbS5fX2luaXRfXywgaWYgaXQgZXhpc3RzLiAgTm90ZSB0aGF0Ci0gIHNwYW0uX19pbml0X18gaXMgYSBzdWJtb2R1bGUgb2YgcGFja2FnZSBzcGFtLiAgSXQgY2FuIHJlZmVyZW5jZSB0bwotICBzcGFtJ3MgbmFtZXNwYWNlIHZpYSB0aGUgJ19fLicgcHJlZml4LCBmb3IgaW5zdGFuY2UKLQotICAgIF9fLnNwYW1faW5pdGVkID0gMSAgICAgICAgICAjIFNldCBhIHBhY2thZ2UtbGV2ZWwgdmFyaWFibGUKLQotCi0KLVRoZW9yeSBvZiBPcGVyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQSBQYWNrYWdlIGlzIGEgbW9kdWxlIHRoYXQgY2FuIGNvbnRhaW4gb3RoZXIgbW9kdWxlcy4gIFBhY2thZ2VzIGNhbiBiZQotbmVzdGVkLiAgUGFja2FnZSBpbnRyb2R1Y2UgZG90dGVkIG5hbWVzIGZvciBtb2R1bGVzLCBsaWtlIFAuUS5NLCB3aGljaAotY291bGQgY29ycmVzcG9uZCB0byBhIGZpbGUgUC9RL00ucHkgZm91bmQgc29tZXdoZXJlIG9uIHN5cy5wYXRoLiAgSXQKLWlzIHBvc3NpYmxlIHRvIGltcG9ydCBhIHBhY2thZ2UgaXRzZWxmLCB0aG91Z2ggdGhpcyBtYWtlcyBsaXR0bGUgc2Vuc2UKLXVubGVzcyB0aGUgcGFja2FnZSBjb250YWlucyBhIG1vZHVsZSBjYWxsZWQgX19pbml0X18uCi0KLUEgcGFja2FnZSBoYXMgdHdvIHZhcmlhYmxlcyB0aGF0IGNvbnRyb2wgdGhlIG5hbWVzcGFjZSB1c2VkIGZvcgotcGFja2FnZXMgYW5kIG1vZHVsZXMsIGJvdGggaW5pdGlhbGl6ZWQgdG8gc2Vuc2libGUgZGVmYXVsdHMgdGhlIGZpcnN0Ci10aW1lIHRoZSBwYWNrYWdlIGlzIHJlZmVyZW5jZWQuCi0KLSgxKSBBIHBhY2thZ2UncyAqbW9kdWxlIHNlYXJjaCBwYXRoKiwgY29udGFpbmVkIGluIHRoZSBwZXItcGFja2FnZQotdmFyaWFibGUgX19wYXRoX18sIGRlZmluZXMgYSBsaXN0IG9mICpkaXJlY3Rvcmllcyogd2hlcmUgc3VibW9kdWxlcyBvcgotc3VicGFja2FnZXMgb2YgdGhlIHBhY2thZ2UgYXJlIHNlYXJjaGVkLiAgSXQgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlCi1kaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcGFja2FnZS4gIFNldHRpbmcgdGhpcyB2YXJpYWJsZSB0byBOb25lIG1ha2VzCi10aGUgbW9kdWxlIHNlYXJjaCBwYXRoIGRlZmF1bHQgdG8gc3lzLnBhdGggKHRoaXMgaXMgbm90IHF1aXRlIHRoZSBzYW1lCi1hcyBzZXR0aW5nIGl0IHRvIHN5cy5wYXRoLCBzaW5jZSB0aGUgbGF0dGVyIHdvbid0IHRyYWNrIGxhdGVyCi1hc3NpZ25tZW50cyB0byBzeXMucGF0aCkuCi0KLSgyKSBBIHBhY2thZ2UncyAqaW1wb3J0IGRvbWFpbiosIGNvbnRhaW5lZCBpbiB0aGUgcGVyLXBhY2thZ2UgdmFyaWFibGUKLV9fZG9tYWluX18sIGRlZmluZXMgYSBsaXN0IG9mICpwYWNrYWdlcyogdGhhdCBhcmUgc2VhcmNoZWQgKHVzaW5nCi10aGVpciByZXNwZWN0aXZlIG1vZHVsZSBzZWFyY2ggcGF0aHMpIHRvIHNhdGlzZnkgaW1wb3J0cy4gIEl0IGlzCi1pbml0aWFsaXplZCB0byB0aGUgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBwYWNrYWdlIGl0c2VsZiwgaXRzIHBhcmVudAotcGFja2FnZSwgaXRzIHBhcmVudCdzIHBhcmVudCwgYW5kIHNvIG9uLCBlbmRpbmcgd2l0aCB0aGUgcm9vdCBwYWNrYWdlCi0odGhlIG5hbWVsZXNzIHBhY2thZ2UgY29udGFpbmluZyBhbGwgdG9wLWxldmVsIHBhY2thZ2VzIGFuZCBtb2R1bGVzLAotd2hvc2UgbW9kdWxlIHNlYXJjaCBwYXRoIGlzIE5vbmUsIGltcGx5aW5nIHN5cy5wYXRoKS4KLQotVGhlIGRlZmF1bHQgZG9tYWluIGltcGxlbWVudHMgYSBzZWFyY2ggYWxnb3JpdGhtIGNhbGxlZCAiZXhwYW5kaW5nCi1zZWFyY2giLiAgQW4gYWx0ZXJuYXRpdmUgc2VhcmNoIGFsZ29yaXRobSBjYWxsZWQgImV4cGxpY2l0IHNlYXJjaCIKLWZpeGVzIHRoZSBpbXBvcnQgc2VhcmNoIHBhdGggdG8gY29udGFpbiBvbmx5IHRoZSByb290IHBhY2thZ2UsCi1yZXF1aXJpbmcgdGhlIG1vZHVsZXMgaW4gdGhlIHBhY2thZ2UgdG8gbmFtZSBhbGwgaW1wb3J0ZWQgbW9kdWxlcyBieQotdGhlaXIgZnVsbCBuYW1lLiAgVGhlIGNvbnZlbnRpb24gb2YgdXNpbmcgJ19fJyB0byByZWZlciB0byB0aGUgY3VycmVudAotcGFja2FnZSAoYm90aCBhcyBhIHBlci1tb2R1bGUgdmFyaWFibGUgYW5kIGluIG1vZHVsZSBuYW1lcykgY2FuIGJlCi11c2VkIGJ5IHBhY2thZ2VzIHVzaW5nIGV4cGxpY2l0IHNlYXJjaCB0byByZWZlciB0byBtb2R1bGVzIGluIHRoZSBzYW1lCi1wYWNrYWdlOyB0aGlzIGNvbWJpbmF0aW9uIGlzIGtub3duIGFzICJleHBsaWNpdC1yZWxhdGl2ZSBzZWFyY2giLgotCi1UaGUgUGFja2FnZUltcG9ydGVyIGFuZCBQYWNrYWdlTG9hZGVyIGNsYXNzZXMgdG9nZXRoZXIgaW1wbGVtZW50IHRoZQotZm9sbG93aW5nIHBvbGljaWVzOgotCi0tIFRoZXJlIGlzIGEgcm9vdCBwYWNrYWdlLCB3aG9zZSBuYW1lIGlzICcnLiAgSXQgY2Fubm90IGJlIGltcG9ydGVkCi0gIGRpcmVjdGx5IGJ1dCBtYXkgYmUgcmVmZXJlbmNlZCwgZS5nLiBieSB1c2luZyAnX18nIGZyb20gYSB0b3AtbGV2ZWwKLSAgbW9kdWxlLgotCi0tIEluIGVhY2ggbW9kdWxlIG9yIHBhY2thZ2UsIHRoZSB2YXJpYWJsZSAnX18nIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvCi0gIHRoZSBwYXJlbnQgcGFja2FnZTsgaW4gdGhlIHJvb3QgcGFja2FnZSwgJ19fJyBwb2ludHMgdG8gaXRzZWxmLgotCi0tIEluIHRoZSBuYW1lIGZvciBpbXBvcnRlZCBtb2R1bGVzIChlLmcuIE0gaW4gImltcG9ydCBNIiBvciAiZnJvbSBNCi0gIGltcG9ydCAuLi4iKSwgYSBsZWFkaW5nICdfXycgcmVmZXJzIHRvIHRoZSBjdXJyZW50IHBhY2thZ2UgKGkuZS4KLSAgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgY3VycmVudCBtb2R1bGUpOyBsZWFkaW5nICdfXy5fXycgYW5kIHNvCi0gIG9uIHJlZmVyIHRvIHRoZSBjdXJyZW50IHBhY2thZ2UncyBwYXJlbnQsIGFuZCBzbyBvbi4gIFRoZSB1c2Ugb2YKLSAgJ19fJyBlbHNld2hlcmUgaW4gdGhlIG1vZHVsZSBuYW1lIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLS0gTW9kdWxlcyBhcmUgc2VhcmNoZWQgdXNpbmcgdGhlICJleHBhbmRpbmcgc2VhcmNoIiBhbGdvcml0aG0gYnkKLSAgdmlydHVlIG9mIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBfX2RvbWFpbl9fLgotCi0tIElmIEEuQi5DIGlzIGltcG9ydGVkLCBBIGlzIHNlYXJjaGVkIHVzaW5nIF9fZG9tYWluX187IHRoZW4KLSAgc3VicGFja2FnZSBCIGlzIHNlYXJjaGVkIGluIEEgdXNpbmcgaXRzIF9fcGF0aF9fLCBhbmQgc28gb24uCi0KLS0gQnVpbHQtaW4gbW9kdWxlcyBoYXZlIHByaW9yaXR5OiBldmVuIGlmIGEgZmlsZSBzeXMucHkgZXhpc3RzIGluIGEKLSAgcGFja2FnZSwgImltcG9ydCBzeXMiIGltcG9ydHMgdGhlIGJ1aWx0LWluIHN5cyBtb2R1bGUuCi0KLS0gVGhlIHNhbWUgaG9sZHMgZm9yIGZyb3plbiBtb2R1bGVzLCBmb3IgYmV0dGVyIG9yIGZvciB3b3JzZS4KLQotLSBTdWJtb2R1bGVzIGFuZCBzdWJwYWNrYWdlcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgbG9hZGVkIHdoZW4gdGhlaXIKLSAgcGFyZW50IHBhY2thZ2VzIGlzIGxvYWRlZC4KLQotLSBUaGUgY29uc3RydWN0ICJmcm9tIHBhY2thZ2UgaW1wb3J0ICoiIGlzIGlsbGVnYWwuICAoSXQgY2FuIHN0aWxsIGJlCi0gIHVzZWQgdG8gaW1wb3J0IG5hbWVzIGZyb20gYSBtb2R1bGUuKQotCi0tIFdoZW4gImZyb20gcGFja2FnZSBpbXBvcnQgbW9kdWxlMSwgbW9kdWxlMiwgLi4uIiBpcyB1c2VkLCB0aG9zZQotICAgIG1vZHVsZXMgYXJlIGV4cGxpY2l0bHkgbG9hZGVkLgotCi0tIFdoZW4gYSBwYWNrYWdlIGlzIGxvYWRlZCwgaWYgaXQgaGFzIGEgc3VibW9kdWxlIF9faW5pdF9fLCB0aGF0Ci0gIG1vZHVsZSBpcyBsb2FkZWQuICBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSByZXF1aXJlZCBzdWJtb2R1bGVzIGNhbgotICBiZSBsb2FkZWQsIHRoZSBfX3BhdGhfXyB2YXJpYWJsZSBleHRlbmRlZCwgZXRjLiAgVGhlIF9faW5pdF9fIG1vZHVsZQotICBpcyBsb2FkZWQgZXZlbiBpZiB0aGUgcGFja2FnZSB3YXMgbG9hZGVkIG9ubHkgaW4gb3JkZXIgdG8gY3JlYXRlIGEKLSAgc3R1YiBmb3IgYSBzdWItcGFja2FnZTogaWYgImltcG9ydCBQLlEuUiIgaXMgdGhlIGZpcnN0IHJlZmVyZW5jZSB0bwotICBQLCBhbmQgUCBoYXMgYSBzdWJtb2R1bGUgX19pbml0X18sIFAuX19pbml0X18gaXMgbG9hZGVkIGJlZm9yZSBQLlEKLSAgaXMgZXZlbiBzZWFyY2hlZC4KLQotQ2F2ZWF0czoKLQotLSBJdCBpcyBwb3NzaWJsZSB0byBpbXBvcnQgYSBwYWNrYWdlIHRoYXQgaGFzIG5vIF9faW5pdF9fIHN1Ym1vZHVsZTsKLSAgdGhpcyBpcyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bCBidXQgdGhlcmUgbWF5IGJlIHVzZWZ1bCBhcHBsaWNhdGlvbnMKLSAgZm9yIGl0IChlLmcuIHRvIG1hbmlwdWxhdGUgaXRzIHNlYXJjaCBwYXRocyBmcm9tIHRoZSBvdXRzaWRlISkuCi0KLS0gVGhlcmUgYXJlIG5vIHNwZWNpYWwgcHJvdmlzaW9ucyBmb3Igb3MuY2hkaXIoKS4gIElmIHlvdSBwbGFuIHRvIHVzZQotICBvcy5jaGRpcigpIGJlZm9yZSB5b3UgaGF2ZSBpbXBvcnRlZCBhbGwgeW91ciBtb2R1bGVzLCBpdCBpcyBiZXR0ZXIKLSAgbm90IHRvIGhhdmUgcmVsYXRpdmUgcGF0aG5hbWVzIGluIHN5cy5wYXRoLiAgKFRoaXMgY291bGQgYWN0dWFsbHkgYmUKLSAgZml4ZWQgYnkgY2hhbmdpbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIHBhdGhfam9pbigpIGluIHRoZSBob29rIHRvCi0gIGFic29sdXRpemUgcGF0aHMuKQotCi0tIFBhY2thZ2VzIGFuZCBtb2R1bGVzIGFyZSBpbnRyb2R1Y2VkIGluIHN5cy5tb2R1bGVzIGFzIHNvb24gYXMgdGhlaXIKLSAgbG9hZGluZyBpcyBzdGFydGVkLiAgV2hlbiB0aGUgbG9hZGluZyBpcyB0ZXJtaW5hdGVkIGJ5IGFuIGV4Y2VwdGlvbiwKLSAgdGhlIHN5cy5tb2R1bGVzIGVudHJpZXMgcmVtYWluIGFyb3VuZC4KLQotLSBUaGVyZSBhcmUgbm8gc3BlY2lhbCBtZWFzdXJlcyB0byBzdXBwb3J0IG11dHVhbGx5IHJlY3Vyc2l2ZSBtb2R1bGVzLAotICBidXQgaXQgd2lsbCB3b3JrIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgd2hlcmUgaXQgd29ya3MgaW4gdGhlCi0gIGZsYXQgbW9kdWxlIHNwYWNlIHN5c3RlbS4KLQotLSBTb21ldGltZXMgZHVtbXkgZW50cmllcyAod2hvc2UgdmFsdWUgaXMgTm9uZSkgYXJlIGVudGVyZWQgaW4KLSAgc3lzLm1vZHVsZXMsIHRvIGluZGljYXRlIHRoYXQgYSBwYXJ0aWN1bGFyIG1vZHVsZSBkb2VzIG5vdCBleGlzdCAtLQotICB0aGlzIGlzIGRvbmUgdG8gc3BlZWQgdXAgdGhlIGV4cGFuZGluZyBzZWFyY2ggYWxnb3JpdGhtIHdoZW4gYQotICBtb2R1bGUgcmVzaWRpbmcgYXQgYSBoaWdoZXIgbGV2ZWwgaXMgcmVwZWF0ZWRseSBpbXBvcnRlZCAoUHl0aG9uCi0gIHByb21pc2VzIHRoYXQgaW1wb3J0aW5nIGEgcHJldmlvdXNseSBpbXBvcnRlZCBtb2R1bGUgaXMgY2hlYXAhKQotCi0tIEFsdGhvdWdoIGR5bmFtaWNhbGx5IGxvYWRlZCBleHRlbnNpb25zIGFyZSBhbGxvd2VkIGluc2lkZSBwYWNrYWdlcywKLSAgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gKGhhcmRjb2RlZCBpbiB0aGUgaW50ZXJwcmV0ZXIpIG9mIHRoZWlyCi0gIGluaXRpYWxpemF0aW9uIG1heSBjYXVzZSBwcm9ibGVtcyBpZiBhbiBleHRlbnNpb24gaW52b2tlcyB0aGUKLSAgaW50ZXJwcmV0ZXIgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbi4KLQotLSByZWxvYWQoKSBtYXkgZmluZCBhbm90aGVyIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBvbmx5IGlmIGl0IG9jY3VycyBvbgotICB0aGUgcGFja2FnZSBzZWFyY2ggcGF0aC4gIFRodXMsIGl0IGtlZXBzIHRoZSBjb25uZWN0aW9uIHRvIHRoZQotICBwYWNrYWdlIHRvIHdoaWNoIHRoZSBtb2R1bGUgYmVsb25ncywgYnV0IG1heSBmaW5kIGEgZGlmZmVyZW50IGZpbGUuCi0KLVhYWCBOZWVkIHRvIGhhdmUgYW4gZXhwbGljaXQgbmFtZSBmb3IgJycsIGUuZy4gJ19fcm9vdF9fJy4KLQotIiIiCi0KLQotaW1wb3J0IGltcAotaW1wb3J0IHN5cwotaW1wb3J0IF9fYnVpbHRpbl9fCi0KLWltcG9ydCBpaG9va3MKLWZyb20gaWhvb2tzIGltcG9ydCBNb2R1bGVMb2FkZXIsIE1vZHVsZUltcG9ydGVyCi0KLQotY2xhc3MgUGFja2FnZUxvYWRlcihNb2R1bGVMb2FkZXIpOgotCi0gICAgIiIiQSBzdWJjbGFzcyBvZiBNb2R1bGVMb2FkZXIgd2l0aCBwYWNrYWdlIHN1cHBvcnQuCi0KLSAgICBmaW5kX21vZHVsZV9pbl9kaXIoKSB3aWxsIHN1Y2NlZWQgaWYgdGhlcmUncyBhIHN1YmRpcmVjdG9yeSB3aXRoCi0gICAgdGhlIGdpdmVuIG5hbWU7IGxvYWRfbW9kdWxlKCkgd2lsbCBjcmVhdGUgYSBzdHViIGZvciBhIHBhY2thZ2UgYW5kCi0gICAgbG9hZCBpdHMgX19pbml0X18gbW9kdWxlIGlmIGl0IGV4aXN0cy4KLQotICAgICIiIgotCi0gICAgZGVmIGZpbmRfbW9kdWxlX2luX2RpcihzZWxmLCBuYW1lLCBkaXIpOgotICAgICAgICBpZiBkaXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBkaXJuYW1lID0gc2VsZi5ob29rcy5wYXRoX2pvaW4oZGlyLCBuYW1lKQotICAgICAgICAgICAgaWYgc2VsZi5ob29rcy5wYXRoX2lzZGlyKGRpcm5hbWUpOgotICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCBkaXJuYW1lLCAoJycsICcnLCAnUEFDS0FHRScpCi0gICAgICAgIHJldHVybiBNb2R1bGVMb2FkZXIuZmluZF9tb2R1bGVfaW5fZGlyKHNlbGYsIG5hbWUsIGRpcikKLQotICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBuYW1lLCBzdHVmZik6Ci0gICAgICAgIGZpbGUsIGZpbGVuYW1lLCBpbmZvID0gc3R1ZmYKLSAgICAgICAgc3VmZiwgbW9kZSwgdHlwZSA9IGluZm8KLSAgICAgICAgaWYgdHlwZSA9PSAnUEFDS0FHRSc6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkX3BhY2thZ2UobmFtZSwgc3R1ZmYpCi0gICAgICAgIGlmIHN5cy5tb2R1bGVzLmhhc19rZXkobmFtZSk6Ci0gICAgICAgICAgICBtID0gc3lzLm1vZHVsZXNbbmFtZV0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHN5cy5tb2R1bGVzW25hbWVdID0gbSA9IGltcC5uZXdfbW9kdWxlKG5hbWUpCi0gICAgICAgIHNlbGYuc2V0X3BhcmVudChtKQotICAgICAgICBpZiB0eXBlID09IGltcC5DX0VYVEVOU0lPTiBhbmQgJy4nIGluIG5hbWU6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkX2R5bmFtaWMobmFtZSwgc3R1ZmYpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gTW9kdWxlTG9hZGVyLmxvYWRfbW9kdWxlKHNlbGYsIG5hbWUsIHN0dWZmKQotCi0gICAgZGVmIGxvYWRfZHluYW1pYyhzZWxmLCBuYW1lLCBzdHVmZik6Ci0gICAgICAgIGZpbGUsIGZpbGVuYW1lLCAoc3VmZiwgbW9kZSwgdHlwZSkgPSBzdHVmZgotICAgICAgICAjIEhhY2sgYXJvdW5kIHJlc3RyaWN0aW9uIGluIGltcC5sb2FkX2R5bmFtaWMoKQotICAgICAgICBpID0gbmFtZS5yZmluZCgnLicpCi0gICAgICAgIHRhaWwgPSBuYW1lW2krMTpdCi0gICAgICAgIGlmIHN5cy5tb2R1bGVzLmhhc19rZXkodGFpbCk6Ci0gICAgICAgICAgICBzYXZlID0gc3lzLm1vZHVsZXNbdGFpbF0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNhdmUgPSBOb25lCi0gICAgICAgIHN5cy5tb2R1bGVzW3RhaWxdID0gaW1wLm5ld19tb2R1bGUobmFtZSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbSA9IGltcC5sb2FkX2R5bmFtaWModGFpbCwgZmlsZW5hbWUsIGZpbGUpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiBzYXZlOgotICAgICAgICAgICAgICAgIHN5cy5tb2R1bGVzW3RhaWxdID0gc2F2ZQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbdGFpbF0KLSAgICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBtCi0gICAgICAgIHJldHVybiBtCi0KLSAgICBkZWYgbG9hZF9wYWNrYWdlKHNlbGYsIG5hbWUsIHN0dWZmKToKLSAgICAgICAgZmlsZSwgZmlsZW5hbWUsIGluZm8gPSBzdHVmZgotICAgICAgICBpZiBzeXMubW9kdWxlcy5oYXNfa2V5KG5hbWUpOgotICAgICAgICAgICAgcGFja2FnZSA9IHN5cy5tb2R1bGVzW25hbWVdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzeXMubW9kdWxlc1tuYW1lXSA9IHBhY2thZ2UgPSBpbXAubmV3X21vZHVsZShuYW1lKQotICAgICAgICBwYWNrYWdlLl9fcGF0aF9fID0gW2ZpbGVuYW1lXQotICAgICAgICBzZWxmLmluaXRfcGFja2FnZShwYWNrYWdlKQotICAgICAgICByZXR1cm4gcGFja2FnZQotCi0gICAgZGVmIGluaXRfcGFja2FnZShzZWxmLCBwYWNrYWdlKToKLSAgICAgICAgc2VsZi5zZXRfcGFyZW50KHBhY2thZ2UpCi0gICAgICAgIHNlbGYuc2V0X2RvbWFpbihwYWNrYWdlKQotICAgICAgICBzZWxmLmNhbGxfaW5pdF9tb2R1bGUocGFja2FnZSkKLQotICAgIGRlZiBzZXRfcGFyZW50KHNlbGYsIG0pOgotICAgICAgICBuYW1lID0gbS5fX25hbWVfXwotICAgICAgICBpZiAnLicgaW4gbmFtZToKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lWzpuYW1lLnJmaW5kKCcuJyldCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBuYW1lID0gJycKLSAgICAgICAgbS5fXyA9IHN5cy5tb2R1bGVzW25hbWVdCi0KLSAgICBkZWYgc2V0X2RvbWFpbihzZWxmLCBwYWNrYWdlKToKLSAgICAgICAgbmFtZSA9IHBhY2thZ2UuX19uYW1lX18KLSAgICAgICAgcGFja2FnZS5fX2RvbWFpbl9fID0gZG9tYWluID0gW25hbWVdCi0gICAgICAgIHdoaWxlICcuJyBpbiBuYW1lOgotICAgICAgICAgICAgbmFtZSA9IG5hbWVbOm5hbWUucmZpbmQoJy4nKV0KLSAgICAgICAgICAgIGRvbWFpbi5hcHBlbmQobmFtZSkKLSAgICAgICAgaWYgbmFtZToKLSAgICAgICAgICAgIGRvbWFpbi5hcHBlbmQoJycpCi0KLSAgICBkZWYgY2FsbF9pbml0X21vZHVsZShzZWxmLCBwYWNrYWdlKToKLSAgICAgICAgc3R1ZmYgPSBzZWxmLmZpbmRfbW9kdWxlKCdfX2luaXRfXycsIHBhY2thZ2UuX19wYXRoX18pCi0gICAgICAgIGlmIHN0dWZmOgotICAgICAgICAgICAgbSA9IHNlbGYubG9hZF9tb2R1bGUocGFja2FnZS5fX25hbWVfXyArICcuX19pbml0X18nLCBzdHVmZikKLSAgICAgICAgICAgIHBhY2thZ2UuX19pbml0X18gPSBtCi0KLQotY2xhc3MgUGFja2FnZUltcG9ydGVyKE1vZHVsZUltcG9ydGVyKToKLQotICAgICIiIkltcG9ydGVyIHRoYXQgdW5kZXJzdGFuZHMgcGFja2FnZXMgYW5kICdfXycuIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbG9hZGVyID0gTm9uZSwgdmVyYm9zZSA9IDApOgotICAgICAgICBNb2R1bGVJbXBvcnRlci5fX2luaXRfXyhzZWxmLAotICAgICAgICBsb2FkZXIgb3IgUGFja2FnZUxvYWRlcihOb25lLCB2ZXJib3NlKSwgdmVyYm9zZSkKLQotICAgIGRlZiBpbXBvcnRfbW9kdWxlKHNlbGYsIG5hbWUsIGdsb2JhbHM9e30sIGxvY2Fscz17fSwgZnJvbWxpc3Q9W10pOgotICAgICAgICBpZiBnbG9iYWxzLmhhc19rZXkoJ19fJyk6Ci0gICAgICAgICAgICBwYWNrYWdlID0gZ2xvYmFsc1snX18nXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBObyBjYWxsaW5nIGNvbnRleHQsIGFzc3VtZSBpbiByb290IHBhY2thZ2UKLSAgICAgICAgICAgIHBhY2thZ2UgPSBzeXMubW9kdWxlc1snJ10KLSAgICAgICAgaWYgbmFtZVs6M10gaW4gKCdfXy4nLCAnX18nKToKLSAgICAgICAgICAgIHAgPSBwYWNrYWdlCi0gICAgICAgICAgICBuYW1lID0gbmFtZVszOl0KLSAgICAgICAgICAgIHdoaWxlIG5hbWVbOjNdIGluICgnX18uJywgJ19fJyk6Ci0gICAgICAgICAgICAgICAgcCA9IHAuX18KLSAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVszOl0KLSAgICAgICAgICAgIGlmIG5vdCBuYW1lOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbmlzaChwYWNrYWdlLCBwLCAnJywgZnJvbWxpc3QpCi0gICAgICAgICAgICBpZiAnLicgaW4gbmFtZToKLSAgICAgICAgICAgICAgICBpID0gbmFtZS5maW5kKCcuJykKLSAgICAgICAgICAgICAgICBuYW1lLCB0YWlsID0gbmFtZVs6aV0sIG5hbWVbaTpdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHRhaWwgPSAnJwotICAgICAgICAgICAgbW5hbWUgPSBwLl9fbmFtZV9fIGFuZCBwLl9fbmFtZV9fKycuJytuYW1lIG9yIG5hbWUKLSAgICAgICAgICAgIG0gPSBzZWxmLmdldDEobW5hbWUpCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5maW5pc2gocGFja2FnZSwgbSwgdGFpbCwgZnJvbWxpc3QpCi0gICAgICAgIGlmICcuJyBpbiBuYW1lOgotICAgICAgICAgICAgaSA9IG5hbWUuZmluZCgnLicpCi0gICAgICAgICAgICBuYW1lLCB0YWlsID0gbmFtZVs6aV0sIG5hbWVbaTpdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0YWlsID0gJycKLSAgICAgICAgZm9yIHBuYW1lIGluIHBhY2thZ2UuX19kb21haW5fXzoKLSAgICAgICAgICAgIG1uYW1lID0gcG5hbWUgYW5kIHBuYW1lKycuJytuYW1lIG9yIG5hbWUKLSAgICAgICAgICAgIG0gPSBzZWxmLmdldDAobW5hbWUpCi0gICAgICAgICAgICBpZiBtOiBicmVhawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBzdWNoIG1vZHVsZSAlcyIgJSBuYW1lCi0gICAgICAgIHJldHVybiBzZWxmLmZpbmlzaChtLCBtLCB0YWlsLCBmcm9tbGlzdCkKLQotICAgIGRlZiBmaW5pc2goc2VsZiwgbW9kdWxlLCBtLCB0YWlsLCBmcm9tbGlzdCk6Ci0gICAgICAgICMgR290IC4uLi5BOyBub3cgZ2V0IC4uLi5BLkIuQy5ECi0gICAgICAgIHluYW1lID0gbS5fX25hbWVfXwotICAgICAgICBpZiB0YWlsIGFuZCBzeXMubW9kdWxlcy5oYXNfa2V5KHluYW1lICsgdGFpbCk6ICMgRmFzdCBwYXRoCi0gICAgICAgICAgICB5bmFtZSwgdGFpbCA9IHluYW1lICsgdGFpbCwgJycKLSAgICAgICAgICAgIG0gPSBzZWxmLmdldDEoeW5hbWUpCi0gICAgICAgIHdoaWxlIHRhaWw6Ci0gICAgICAgICAgICBpID0gdGFpbC5maW5kKCcuJywgMSkKLSAgICAgICAgICAgIGlmIGkgPiAwOgotICAgICAgICAgICAgICAgIGhlYWQsIHRhaWwgPSB0YWlsWzppXSwgdGFpbFtpOl0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaGVhZCwgdGFpbCA9IHRhaWwsICcnCi0gICAgICAgICAgICB5bmFtZSA9IHluYW1lICsgaGVhZAotICAgICAgICAgICAgbSA9IHNlbGYuZ2V0MSh5bmFtZSkKLQotICAgICAgICAjIEdvdCAuLi4uQS5CLkMuRDsgbm93IGZpbmFsaXplIHRoaW5ncyBkZXBlbmRpbmcgb24gZnJvbWxpc3QKLSAgICAgICAgaWYgbm90IGZyb21saXN0OgotICAgICAgICAgICAgcmV0dXJuIG1vZHVsZQotICAgICAgICBpZiAnX18nIGluIGZyb21saXN0OgotICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJDYW4ndCBpbXBvcnQgX18gZnJvbSBhbnl3aGVyZSIKLSAgICAgICAgaWYgbm90IGhhc2F0dHIobSwgJ19fcGF0aF9fJyk6IHJldHVybiBtCi0gICAgICAgIGlmICcqJyBpbiBmcm9tbGlzdDoKLSAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiQ2FuJ3QgaW1wb3J0ICogZnJvbSBhIHBhY2thZ2UiCi0gICAgICAgIGZvciBmIGluIGZyb21saXN0OgotICAgICAgICAgICAgaWYgaGFzYXR0cihtLCBmKTogY29udGludWUKLSAgICAgICAgICAgIGZuYW1lID0geW5hbWUgKyAnLicgKyBmCi0gICAgICAgICAgICBzZWxmLmdldDEoZm5hbWUpCi0gICAgICAgIHJldHVybiBtCi0KLSAgICBkZWYgZ2V0MShzZWxmLCBuYW1lKToKLSAgICAgICAgbSA9IHNlbGYuZ2V0KG5hbWUpCi0gICAgICAgIGlmIG5vdCBtOgotICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBtb2R1bGUgbmFtZWQgJXMiICUgbmFtZQotICAgICAgICByZXR1cm4gbQotCi0gICAgZGVmIGdldDAoc2VsZiwgbmFtZSk6Ci0gICAgICAgIG0gPSBzZWxmLmdldChuYW1lKQotICAgICAgICBpZiBub3QgbToKLSAgICAgICAgICAgIHN5cy5tb2R1bGVzW25hbWVdID0gTm9uZQotICAgICAgICByZXR1cm4gbQotCi0gICAgZGVmIGdldChzZWxmLCBuYW1lKToKLSAgICAgICAgIyBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCBvciBsb2FkIGEgbW9kdWxlIHdoZW4gaXRzIHBhcmVudCBleGlzdHMKLSAgICAgICAgaWYgc3lzLm1vZHVsZXMuaGFzX2tleShuYW1lKToKLSAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQotICAgICAgICBpZiAnLicgaW4gbmFtZToKLSAgICAgICAgICAgIGkgPSBuYW1lLnJmaW5kKCcuJykKLSAgICAgICAgICAgIGhlYWQsIHRhaWwgPSBuYW1lWzppXSwgbmFtZVtpKzE6XQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaGVhZCwgdGFpbCA9ICcnLCBuYW1lCi0gICAgICAgIHBhdGggPSBzeXMubW9kdWxlc1toZWFkXS5fX3BhdGhfXwotICAgICAgICBzdHVmZiA9IHNlbGYubG9hZGVyLmZpbmRfbW9kdWxlKHRhaWwsIHBhdGgpCi0gICAgICAgIGlmIG5vdCBzdHVmZjoKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHN5cy5tb2R1bGVzW25hbWVdID0gbSA9IHNlbGYubG9hZGVyLmxvYWRfbW9kdWxlKG5hbWUsIHN0dWZmKQotICAgICAgICBpZiBoZWFkOgotICAgICAgICAgICAgc2V0YXR0cihzeXMubW9kdWxlc1toZWFkXSwgdGFpbCwgbSkKLSAgICAgICAgcmV0dXJuIG0KLQotICAgIGRlZiByZWxvYWQoc2VsZiwgbW9kdWxlKToKLSAgICAgICAgbmFtZSA9IG1vZHVsZS5fX25hbWVfXwotICAgICAgICBpZiAnLicgaW4gbmFtZToKLSAgICAgICAgICAgIGkgPSBuYW1lLnJmaW5kKCcuJykKLSAgICAgICAgICAgIGhlYWQsIHRhaWwgPSBuYW1lWzppXSwgbmFtZVtpKzE6XQotICAgICAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzW2hlYWRdLl9fcGF0aF9fCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0YWlsID0gbmFtZQotICAgICAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzWycnXS5fX3BhdGhfXwotICAgICAgICBzdHVmZiA9IHNlbGYubG9hZGVyLmZpbmRfbW9kdWxlKHRhaWwsIHBhdGgpCi0gICAgICAgIGlmIG5vdCBzdHVmZjoKLSAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiTm8gbW9kdWxlIG5hbWVkICVzIiAlIG5hbWUKLSAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmxvYWRfbW9kdWxlKG5hbWUsIHN0dWZmKQotCi0gICAgZGVmIHVubG9hZChzZWxmLCBtb2R1bGUpOgotICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6Ci0gICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgImRvbid0IGtub3cgaG93IHRvIHVubG9hZCBwYWNrYWdlcyB5ZXQiCi0gICAgICAgIFBhY2thZ2VJbXBvcnRlci51bmxvYWQoc2VsZiwgbW9kdWxlKQotCi0gICAgZGVmIGluc3RhbGwoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBzeXMubW9kdWxlcy5oYXNfa2V5KCcnKToKLSAgICAgICAgICAgIHN5cy5tb2R1bGVzWycnXSA9IHBhY2thZ2UgPSBpbXAubmV3X21vZHVsZSgnJykKLSAgICAgICAgICAgIHBhY2thZ2UuX19wYXRoX18gPSBOb25lCi0gICAgICAgICAgICBzZWxmLmxvYWRlci5pbml0X3BhY2thZ2UocGFja2FnZSkKLSAgICAgICAgICAgIGZvciBtIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgotICAgICAgICAgICAgICAgIGlmIG5vdCBtOiBjb250aW51ZQotICAgICAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKG0sICdfXycpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRlci5zZXRfcGFyZW50KG0pCi0gICAgICAgIE1vZHVsZUltcG9ydGVyLmluc3RhbGwoc2VsZikKLQotCi1kZWYgaW5zdGFsbCh2ID0gMCk6Ci0gICAgaWhvb2tzLmluc3RhbGwoUGFja2FnZUltcG9ydGVyKE5vbmUsIHYpKQotCi1kZWYgdW5pbnN0YWxsKCk6Ci0gICAgaWhvb2tzLnVuaW5zdGFsbCgpCi0KLWRlZiBuaSh2ID0gMCk6Ci0gICAgaW5zdGFsbCh2KQotCi1kZWYgbm8oKToKLSAgICB1bmluc3RhbGwoKQotCi1kZWYgdGVzdCgpOgotICAgIGltcG9ydCBwZGIKLSAgICB0cnk6Ci0gICAgICAgIHRlc3Rwcm9wZXIoKQotICAgIGV4Y2VwdDoKLSAgICAgICAgc3lzLmxhc3RfdHlwZSwgc3lzLmxhc3RfdmFsdWUsIHN5cy5sYXN0X3RyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCi0gICAgICAgIHByaW50Ci0gICAgICAgIHByaW50IHN5cy5sYXN0X3R5cGUsICc6Jywgc3lzLmxhc3RfdmFsdWUKLSAgICAgICAgcHJpbnQKLSAgICAgICAgcGRiLnBtKCkKLQotZGVmIHRlc3Rwcm9wZXIoKToKLSAgICBpbnN0YWxsKDEpCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgbWFjdGVzdAotICAgICAgICBwcmludCBkaXIobWFjdGVzdCkKLSAgICAgICAgcmF3X2lucHV0KCdPSz8nKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHVuaW5zdGFsbCgpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0KCkKLWVsc2U6Ci0gICAgaW5zdGFsbCgpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9wYWNrbWFpbC5weSBiL0xpYi9saWItb2xkL3BhY2ttYWlsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTY5MTA4Li4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL3BhY2ttYWlsLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSMgTW9kdWxlICdwYWNrbWFpbCcgLS0gY3JlYXRlIGEgc2VsZi11bnBhY2tpbmcgc2hlbGwgYXJjaGl2ZS4KLQotIyBUaGlzIG1vZHVsZSB3b3JrcyBvbiBVTklYIGFuZCBvbiB0aGUgTWFjOyB0aGUgYXJjaGl2ZXMgY2FuIHVucGFjawotIyB0aGVtc2VsdmVzIG9ubHkgb24gVU5JWC4KLQotaW1wb3J0IG9zCi1mcm9tIHN0YXQgaW1wb3J0IFNUX01USU1FCi0KLSMgUHJpbnQgaGVscAotZGVmIGhlbHAoKToKLSAgICBwcmludCAnQWxsIGZucyBoYXZlIGEgZmlsZSBvcGVuIGZvciB3cml0aW5nIGFzIGZpcnN0IHBhcmFtZXRlcicKLSAgICBwcmludCAncGFjayhmLCBmdWxsbmFtZSwgbmFtZSk6IHBhY2sgZnVsbG5hbWUgYXMgbmFtZScKLSAgICBwcmludCAncGFja3NvbWUoZiwgZGlyZWN0b3J5LCBuYW1lbGlzdCk6IHNlbGVjdGVkIGZpbGVzIGZyb20gZGlyZWN0b3J5JwotICAgIHByaW50ICdwYWNrYWxsKGYsIGRpcmVjdG9yeSk6IHBhY2sgYWxsIGZpbGVzIGZyb20gZGlyZWN0b3J5JwotICAgIHByaW50ICdwYWNrbm90b2xkZXIoZiwgZGlyZWN0b3J5LCBuYW1lKTogcGFjayBhbGwgZmlsZXMgZnJvbSBkaXJlY3RvcnknCi0gICAgcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXJlIG5vdCBvbGRlciB0aGFuIGEgZmlsZSB0aGVyZScKLSAgICBwcmludCAncGFja3RyZWUoZiwgZGlyZWN0b3J5KTogcGFjayBlbnRpcmUgZGlyZWN0b3J5IHRyZWUnCi0KLSMgUGFjayBvbmUgZmlsZQotZGVmIHBhY2sob3V0ZnAsIGZpbGUsIG5hbWUpOgotICAgIGZwID0gb3BlbihmaWxlLCAncicpCi0gICAgb3V0ZnAud3JpdGUoJ2VjaG8gJyArIG5hbWUgKyAnXG4nKQotICAgIG91dGZwLndyaXRlKCdzZWQgInMvXlgvLyIgPiInICsgbmFtZSArICciIDw8IiEiXG4nKQotICAgIHdoaWxlIDE6Ci0gICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCi0gICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawotICAgICAgICBpZiBsaW5lWy0xOl0gIT0gJ1xuJzoKLSAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgJ1xuJwotICAgICAgICBvdXRmcC53cml0ZSgnWCcgKyBsaW5lKQotICAgIG91dGZwLndyaXRlKCchXG4nKQotICAgIGZwLmNsb3NlKCkKLQotIyBQYWNrIHNvbWUgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeQotZGVmIHBhY2tzb21lKG91dGZwLCBkaXJuYW1lLCBuYW1lcyk6Ci0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIHByaW50IG5hbWUKLSAgICAgICAgZmlsZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKQotICAgICAgICBwYWNrKG91dGZwLCBmaWxlLCBuYW1lKQotCi0jIFBhY2sgYWxsIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkKLWRlZiBwYWNrYWxsKG91dGZwLCBkaXJuYW1lKToKLSAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKLSAgICB0cnk6Ci0gICAgICAgIG5hbWVzLnJlbW92ZSgnLicpCi0gICAgZXhjZXB0OgotICAgICAgICBwYXNzCi0gICAgdHJ5OgotICAgICAgICBuYW1lcy5yZW1vdmUoJy4uJykKLSAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MKLSAgICBuYW1lcy5zb3J0KCkKLSAgICBwYWNrc29tZShvdXRmcCwgZGlybmFtZSwgbmFtZXMpCi0KLSMgUGFjayBhbGwgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeSB0aGF0IGFyZSBub3Qgb2xkZXIgdGhhbiBhIGdpdmUgb25lCi1kZWYgcGFja25vdG9sZGVyKG91dGZwLCBkaXJuYW1lLCBvbGRlc3QpOgotICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXJuYW1lKQotICAgIHRyeToKLSAgICAgICAgbmFtZXMucmVtb3ZlKCcuJykKLSAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MKLSAgICB0cnk6Ci0gICAgICAgIG5hbWVzLnJlbW92ZSgnLi4nKQotICAgIGV4Y2VwdDoKLSAgICAgICAgcGFzcwotICAgIG9sZGVzdCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBvbGRlc3QpCi0gICAgc3QgPSBvcy5zdGF0KG9sZGVzdCkKLSAgICBtdGltZSA9IHN0W1NUX01USU1FXQotICAgIHRvZG8gPSBbXQotICAgIGZvciBuYW1lIGluIG5hbWVzOgotICAgICAgICBwcmludCBuYW1lLCAnLi4uJywKLSAgICAgICAgc3QgPSBvcy5zdGF0KG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKSkKLSAgICAgICAgaWYgc3RbU1RfTVRJTUVdID49IG10aW1lOgotICAgICAgICAgICAgcHJpbnQgJ1llcy4nCi0gICAgICAgICAgICB0b2RvLmFwcGVuZChuYW1lKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgJ05vLicKLSAgICB0b2RvLnNvcnQoKQotICAgIHBhY2tzb21lKG91dGZwLCBkaXJuYW1lLCB0b2RvKQotCi0jIFBhY2sgYSB3aG9sZSB0cmVlIChubyBleGNlcHRpb25zKQotZGVmIHBhY2t0cmVlKG91dGZwLCBkaXJuYW1lKToKLSAgICBwcmludCAncGFja3RyZWUnLCBkaXJuYW1lCi0gICAgb3V0ZnAud3JpdGUoJ21rZGlyICcgKyB1bml4Zml4KGRpcm5hbWUpICsgJ1xuJykKLSAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKLSAgICB0cnk6Ci0gICAgICAgIG5hbWVzLnJlbW92ZSgnLicpCi0gICAgZXhjZXB0OgotICAgICAgICBwYXNzCi0gICAgdHJ5OgotICAgICAgICBuYW1lcy5yZW1vdmUoJy4uJykKLSAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MKLSAgICBzdWJkaXJzID0gW10KLSAgICBmb3IgbmFtZSBpbiBuYW1lczoKLSAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkKLSAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6Ci0gICAgICAgICAgICBzdWJkaXJzLmFwcGVuZChmdWxsbmFtZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICdwYWNrJywgZnVsbG5hbWUKLSAgICAgICAgICAgIHBhY2sob3V0ZnAsIGZ1bGxuYW1lLCB1bml4Zml4KGZ1bGxuYW1lKSkKLSAgICBmb3Igc3ViZGlybmFtZSBpbiBzdWJkaXJzOgotICAgICAgICBwYWNrdHJlZShvdXRmcCwgc3ViZGlybmFtZSkKLQotZGVmIHVuaXhmaXgobmFtZSk6Ci0gICAgY29tcHMgPSBuYW1lLnNwbGl0KG9zLnNlcCkKLSAgICByZXMgPSAnJwotICAgIGZvciBjb21wIGluIGNvbXBzOgotICAgICAgICBpZiBjb21wOgotICAgICAgICAgICAgaWYgcmVzOiByZXMgPSByZXMgKyAnLycKLSAgICAgICAgICAgIHJlcyA9IHJlcyArIGNvbXAKLSAgICByZXR1cm4gcmVzCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9wb2x5LnB5IGIvTGliL2xpYi1vbGQvcG9seS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2YTFkYy4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9wb2x5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBtb2R1bGUgJ3BvbHknIC0tIFBvbHlub21pYWxzCi0KLSMgQSBwb2x5bm9taWFsIGlzIHJlcHJlc2VudGVkIGJ5IGEgbGlzdCBvZiBjb2VmZmljaWVudHMsIGUuZy4sCi0jIFsxLCAxMCwgNV0gcmVwcmVzZW50cyAxKngqKjAgKyAxMCp4KioxICsgNSp4KioyIChvciAxICsgMTB4ICsgNXgqKjIpLgotIyBUaGVyZSBpcyBubyB3YXkgdG8gc3VwcHJlc3MgaW50ZXJuYWwgemVyb3M7IHRyYWlsaW5nIHplcm9zIGFyZQotIyB0YWtlbiBvdXQgYnkgbm9ybWFsaXplKCkuCi0KLWRlZiBub3JtYWxpemUocCk6ICMgU3RyaXAgdW5uZWNlc3NhcnkgemVybyBjb2VmZmljaWVudHMKLSAgICBuID0gbGVuKHApCi0gICAgd2hpbGUgbjoKLSAgICAgICAgaWYgcFtuLTFdOiByZXR1cm4gcFs6bl0KLSAgICAgICAgbiA9IG4tMQotICAgIHJldHVybiBbXQotCi1kZWYgcGx1cyhhLCBiKToKLSAgICBpZiBsZW4oYSkgPCBsZW4oYik6IGEsIGIgPSBiLCBhICMgbWFrZSBzdXJlIGEgaXMgdGhlIGxvbmdlc3QKLSAgICByZXMgPSBhWzpdICMgbWFrZSBhIGNvcHkKLSAgICBmb3IgaSBpbiByYW5nZShsZW4oYikpOgotICAgICAgICByZXNbaV0gPSByZXNbaV0gKyBiW2ldCi0gICAgcmV0dXJuIG5vcm1hbGl6ZShyZXMpCi0KLWRlZiBtaW51cyhhLCBiKToKLSAgICBuZWdfYiA9IG1hcChsYW1iZGEgeDogLXgsIGJbOl0pCi0gICAgcmV0dXJuIHBsdXMoYSwgbmVnX2IpCi0KLWRlZiBvbmUocG93ZXIsIGNvZWZmKTogIyBSZXByZXNlbnRhdGlvbiBvZiBjb2VmZiAqIHgqKnBvd2VyCi0gICAgcmVzID0gW10KLSAgICBmb3IgaSBpbiByYW5nZShwb3dlcik6IHJlcy5hcHBlbmQoMCkKLSAgICByZXR1cm4gcmVzICsgW2NvZWZmXQotCi1kZWYgdGltZXMoYSwgYik6Ci0gICAgcmVzID0gW10KLSAgICBmb3IgaSBpbiByYW5nZShsZW4oYSkpOgotICAgICAgICBmb3IgaiBpbiByYW5nZShsZW4oYikpOgotICAgICAgICAgICAgcmVzID0gcGx1cyhyZXMsIG9uZShpK2osIGFbaV0qYltqXSkpCi0gICAgcmV0dXJuIHJlcwotCi1kZWYgcG93ZXIoYSwgbik6ICMgUmFpc2UgcG9seW5vbWlhbCBhIHRvIHRoZSBwb3NpdGl2ZSBpbnRlZ3JhbCBwb3dlciBuCi0gICAgaWYgbiA9PSAwOiByZXR1cm4gWzFdCi0gICAgaWYgbiA9PSAxOiByZXR1cm4gYQotICAgIGlmIG4vMioyID09IG46Ci0gICAgICAgIGIgPSBwb3dlcihhLCBuLzIpCi0gICAgICAgIHJldHVybiB0aW1lcyhiLCBiKQotICAgIHJldHVybiB0aW1lcyhwb3dlcihhLCBuLTEpLCBhKQotCi1kZWYgZGVyKGEpOiAjIEZpcnN0IGRlcml2YXRpdmUKLSAgICByZXMgPSBhWzE6XQotICAgIGZvciBpIGluIHJhbmdlKGxlbihyZXMpKToKLSAgICAgICAgcmVzW2ldID0gcmVzW2ldICogKGkrMSkKLSAgICByZXR1cm4gcmVzCi0KLSMgQ29tcHV0aW5nIGEgcHJpbWl0aXZlIGZ1bmN0aW9uIHdvdWxkIHJlcXVpcmUgcmF0aW9uYWwgYXJpdGhtZXRpYy4uLgpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvcmFuZC5weSBiL0xpYi9saWItb2xkL3JhbmQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NTdiNjkuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvcmFuZC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgTW9kdWxlICdyYW5kJwotIyBEb24ndCB1c2UgdW5sZXNzIHlvdSB3YW50IGNvbXBhdGliaWxpdHkgd2l0aCBDJ3MgcmFuZCgpIQotCi1pbXBvcnQgd2hyYW5kb20KLQotZGVmIHNyYW5kKHNlZWQpOgotICAgIHdocmFuZG9tLnNlZWQoc2VlZCUyNTYsIHNlZWQvMjU2JTI1Niwgc2VlZC82NTUzNiUyNTYpCi0KLWRlZiByYW5kKCk6Ci0gICAgcmV0dXJuIGludCh3aHJhbmRvbS5yYW5kb20oKSAqIDMyNzY4LjApICUgMzI3NjgKLQotZGVmIGNob2ljZShzZXEpOgotICAgIHJldHVybiBzZXFbcmFuZCgpICUgbGVuKHNlcSldCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9zdGF0Y2FjaGUucHkgYi9MaWIvbGliLW9sZC9zdGF0Y2FjaGUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzgzOTMuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvc3RhdGNhY2hlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotIiIiTWFpbnRhaW4gYSBjYWNoZSBvZiBzdGF0KCkgaW5mb3JtYXRpb24gb24gZmlsZXMuCi0KLVRoZXJlIGFyZSBmdW5jdGlvbnMgdG8gcmVzZXQgdGhlIGNhY2hlIG9yIHRvIHNlbGVjdGl2ZWx5IHJlbW92ZSBpdGVtcy4KLSIiIgotCi1pbXBvcnQgd2FybmluZ3MKLXdhcm5pbmdzLndhcm4oIlRoZSBzdGF0Y2FjaGUgbW9kdWxlIGlzIG9ic29sZXRlLiAgVXNlIG9zLnN0YXQoKSBpbnN0ZWFkLiIsCi0gICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLWRlbCB3YXJuaW5ncwotCi1pbXBvcnQgb3MgYXMgX29zCi1mcm9tIHN0YXQgaW1wb3J0ICoKLQotX19hbGxfXyA9IFsic3RhdCIsInJlc2V0IiwiZm9yZ2V0IiwiZm9yZ2V0X3ByZWZpeCIsImZvcmdldF9kaXIiLAotICAgICAgICAgICAiZm9yZ2V0X2V4Y2VwdF9wcmVmaXgiLCJpc2RpciJdCi0KLSMgVGhlIGNhY2hlLiAgS2V5cyBhcmUgcGF0aG5hbWVzLCB2YWx1ZXMgYXJlIG9zLnN0YXQgb3V0Y29tZXMuCi0jIFJlbWVtYmVyIHRoYXQgbXVsdGlwbGUgdGhyZWFkcyBtYXkgYmUgY2FsbGluZyB0aGlzISAgU28sIGUuZy4sIHRoYXQKLSMgcGF0aCBpbiBjYWNoZSByZXR1cm5zIDEgZG9lc24ndCBtZWFuIHRoZSBjYWNoZSB3aWxsIHN0aWxsIGNvbnRhaW4KLSMgcGF0aCBvbiB0aGUgbmV4dCBsaW5lLiAgQ29kZSBkZWZlbnNpdmVseS4KLQotY2FjaGUgPSB7fQotCi1kZWYgc3RhdChwYXRoKToKLSAgICAiIiJTdGF0IGEgZmlsZSwgcG9zc2libHkgb3V0IG9mIHRoZSBjYWNoZS4iIiIKLSAgICByZXQgPSBjYWNoZS5nZXQocGF0aCwgTm9uZSkKLSAgICBpZiByZXQgaXMgTm9uZToKLSAgICAgICAgY2FjaGVbcGF0aF0gPSByZXQgPSBfb3Muc3RhdChwYXRoKQotICAgIHJldHVybiByZXQKLQotZGVmIHJlc2V0KCk6Ci0gICAgIiIiQ2xlYXIgdGhlIGNhY2hlLiIiIgotICAgIGNhY2hlLmNsZWFyKCkKLQotIyBGb3IgdGhyZWFkIHNhZnRleSwgYWx3YXlzIHVzZSBmb3JnZXQoKSBpbnRlcm5hbGx5IHRvby4KLWRlZiBmb3JnZXQocGF0aCk6Ci0gICAgIiIiUmVtb3ZlIGEgZ2l2ZW4gaXRlbSBmcm9tIHRoZSBjYWNoZSwgaWYgaXQgZXhpc3RzLiIiIgotICAgIHRyeToKLSAgICAgICAgZGVsIGNhY2hlW3BhdGhdCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBwYXNzCi0KLWRlZiBmb3JnZXRfcHJlZml4KHByZWZpeCk6Ci0gICAgIiIiUmVtb3ZlIGFsbCBwYXRobmFtZXMgd2l0aCBhIGdpdmVuIHByZWZpeC4iIiIKLSAgICBmb3IgcGF0aCBpbiBjYWNoZS5rZXlzKCk6Ci0gICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChwcmVmaXgpOgotICAgICAgICAgICAgZm9yZ2V0KHBhdGgpCi0KLWRlZiBmb3JnZXRfZGlyKHByZWZpeCk6Ci0gICAgIiIiRm9yZ2V0IGEgZGlyZWN0b3J5IGFuZCBhbGwgZW50cmllcyBleGNlcHQgZm9yIGVudHJpZXMgaW4gc3ViZGlycy4iIiIKLQotICAgICMgUmVtb3ZlIHRyYWlsaW5nIHNlcGFyYXRvciwgaWYgYW55LiAgVGhpcyBpcyB0cmlja3kgdG8gZG8gaW4gYQotICAgICMgeC1wbGF0Zm9ybSB3YXkuICBGb3IgZXhhbXBsZSwgV2luZG93cyBhY2NlcHRzIGJvdGggLyBhbmQgXCBhcwotICAgICMgc2VwYXJhdG9ycywgYW5kIGlmIHRoZXJlJ3Mgbm90aGluZyAqYnV0KiBhIHNlcGFyYXRvciB3ZSB3YW50IHRvCi0gICAgIyBwcmVzZXJ2ZSB0aGF0IHRoaXMgaXMgdGhlIHJvb3QuICBPbmx5IG9zLnBhdGggaGFzIHRoZSBwbGF0Zm9ybQotICAgICMga25vd2xlZGdlIHdlIG5lZWQuCi0gICAgZnJvbSBvcy5wYXRoIGltcG9ydCBzcGxpdCwgam9pbgotICAgIHByZWZpeCA9IHNwbGl0KGpvaW4ocHJlZml4LCAieHh4IikpWzBdCi0gICAgZm9yZ2V0KHByZWZpeCkKLSAgICBmb3IgcGF0aCBpbiBjYWNoZS5rZXlzKCk6Ci0gICAgICAgICMgRmlyc3QgY2hlY2sgdGhhdCB0aGUgcGF0aCBhdCBsZWFzdCBzdGFydHMgd2l0aCB0aGUgcHJlZml4LCBzbwotICAgICAgICAjIHRoYXQgd2hlbiBpdCBkb2Vzbid0IHdlIGNhbiBhdm9pZCBwYXlpbmcgZm9yIHNwbGl0KCkuCi0gICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChwcmVmaXgpIGFuZCBzcGxpdChwYXRoKVswXSA9PSBwcmVmaXg6Ci0gICAgICAgICAgICBmb3JnZXQocGF0aCkKLQotZGVmIGZvcmdldF9leGNlcHRfcHJlZml4KHByZWZpeCk6Ci0gICAgIiIiUmVtb3ZlIGFsbCBwYXRobmFtZXMgZXhjZXB0IHdpdGggYSBnaXZlbiBwcmVmaXguCi0KLSAgICBOb3JtYWxseSB1c2VkIHdpdGggcHJlZml4ID0gJy8nIGFmdGVyIGEgY2hkaXIoKS4KLSAgICAiIiIKLQotICAgIGZvciBwYXRoIGluIGNhY2hlLmtleXMoKToKLSAgICAgICAgaWYgbm90IHBhdGguc3RhcnRzd2l0aChwcmVmaXgpOgotICAgICAgICAgICAgZm9yZ2V0KHBhdGgpCi0KLWRlZiBpc2RpcihwYXRoKToKLSAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBkaXJlY3RvcnksIGVsc2UgRmFsc2UuIiIiCi0gICAgdHJ5OgotICAgICAgICBzdCA9IHN0YXQocGF0aCkKLSAgICBleGNlcHQgX29zLmVycm9yOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gU19JU0RJUihzdC5zdF9tb2RlKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvdGIucHkgYi9MaWIvbGliLW9sZC90Yi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2MzU1OS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC90Yi5weQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0jIFByaW50IHRyYWNlYmFja3MsIHdpdGggYSBkdW1wIG9mIGxvY2FsIHZhcmlhYmxlcy4KLSMgQWxzbyBhbiBpbnRlcmFjdGl2ZSBzdGFjayB0cmFjZSBicm93c2VyLgotIyBOb3RlIC0tIHRoaXMgbW9kdWxlIGlzIG9ic29sZXRlIC0tIHVzZSBwZGIucG0oKSBpbnN0ZWFkLgotCi1pbXBvcnQgc3lzCi1pbXBvcnQgb3MKLWZyb20gc3RhdCBpbXBvcnQgKgotaW1wb3J0IGxpbmVjYWNoZQotCi1kZWYgYnIoKTogYnJvd3NlcihzeXMubGFzdF90cmFjZWJhY2spCi0KLWRlZiB0YigpOiBwcmludHRiKHN5cy5sYXN0X3RyYWNlYmFjaykKLQotZGVmIGJyb3dzZXIodGIpOgotICAgIGlmIG5vdCB0YjoKLSAgICAgICAgcHJpbnQgJ05vIHRyYWNlYmFjay4nCi0gICAgICAgIHJldHVybgotICAgIHRibGlzdCA9IFtdCi0gICAgd2hpbGUgdGI6Ci0gICAgICAgIHRibGlzdC5hcHBlbmQodGIpCi0gICAgICAgIHRiID0gdGIudGJfbmV4dAotICAgIHB0ciA9IGxlbih0Ymxpc3QpLTEKLSAgICB0YiA9IHRibGlzdFtwdHJdCi0gICAgd2hpbGUgMToKLSAgICAgICAgaWYgdGIgIT0gdGJsaXN0W3B0cl06Ci0gICAgICAgICAgICB0YiA9IHRibGlzdFtwdHJdCi0gICAgICAgICAgICBwcmludCBgcHRyYCArICc6JywKLSAgICAgICAgICAgIHByaW50dGJoZWFkZXIodGIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGxpbmUgPSByYXdfaW5wdXQoJ1RCOiAnKQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICBwcmludCAnXG5bSW50ZXJydXB0ZWRdJwotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgICAgICAgcHJpbnQgJ1xuW0VPRl0nCi0gICAgICAgICAgICBicmVhawotICAgICAgICBjbWQgPSBsaW5lLnN0cmlwKCkKLSAgICAgICAgaWYgY21kOgotICAgICAgICAgICAgaWYgY21kID09ICdxdWl0JzoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ2xpc3QnOgotICAgICAgICAgICAgICAgIGJyb3dzZXJsaXN0KHRiKQotICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ3VwJzoKLSAgICAgICAgICAgICAgICBpZiBwdHItMSA+PSAwOiBwdHIgPSBwdHItMQotICAgICAgICAgICAgICAgIGVsc2U6IHByaW50ICdCb3R0b20gb2Ygc3RhY2suJwotICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ2Rvd24nOgotICAgICAgICAgICAgICAgIGlmIHB0cisxIDwgbGVuKHRibGlzdCk6IHB0ciA9IHB0cisxCi0gICAgICAgICAgICAgICAgZWxzZTogcHJpbnQgJ1RvcCBvZiBzdGFjay4nCi0gICAgICAgICAgICBlbGlmIGNtZCA9PSAnbG9jYWxzJzoKLSAgICAgICAgICAgICAgICBwcmludHN5bWJvbHModGIudGJfZnJhbWUuZl9sb2NhbHMpCi0gICAgICAgICAgICBlbGlmIGNtZCA9PSAnZ2xvYmFscyc6Ci0gICAgICAgICAgICAgICAgcHJpbnRzeW1ib2xzKHRiLnRiX2ZyYW1lLmZfZ2xvYmFscykKLSAgICAgICAgICAgIGVsaWYgY21kIGluICgnPycsICdoZWxwJyk6Ci0gICAgICAgICAgICAgICAgYnJvd3NlcmhlbHAoKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBicm93c2VyZXhlYyh0YiwgY21kKQotCi1kZWYgYnJvd3Nlcmxpc3QodGIpOgotICAgIGZpbGVuYW1lID0gdGIudGJfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCi0gICAgbGluZW5vID0gdGIudGJfbGluZW5vCi0gICAgbGFzdCA9IGxpbmVubwotICAgIGZpcnN0ID0gbWF4KDEsIGxhc3QtMTApCi0gICAgZm9yIGkgaW4gcmFuZ2UoZmlyc3QsIGxhc3QrMSk6Ci0gICAgICAgIGlmIGkgPT0gbGluZW5vOiBwcmVmaXggPSAnKioqJyArIGBpYC5yanVzdCg0KSArICc6JwotICAgICAgICBlbHNlOiBwcmVmaXggPSBgaWAucmp1c3QoNykgKyAnOicKLSAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBpKQotICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xuJzogbGluZSA9IGxpbmVbOi0xXQotICAgICAgICBwcmludCBwcmVmaXggKyBsaW5lCi0KLWRlZiBicm93c2VyZXhlYyh0YiwgY21kKToKLSAgICBsb2NhbHMgPSB0Yi50Yl9mcmFtZS5mX2xvY2FscwotICAgIGdsb2JhbHMgPSB0Yi50Yl9mcmFtZS5mX2dsb2JhbHMKLSAgICB0cnk6Ci0gICAgICAgIGV4ZWMgY21kKydcbicgaW4gZ2xvYmFscywgbG9jYWxzCi0gICAgZXhjZXB0OgotICAgICAgICB0LCB2ID0gc3lzLmV4Y19pbmZvKClbOjJdCi0gICAgICAgIHByaW50ICcqKiogRXhjZXB0aW9uOicsCi0gICAgICAgIGlmIHR5cGUodCkgaXMgdHlwZSgnJyk6Ci0gICAgICAgICAgICBwcmludCB0LAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgdC5fX25hbWVfXywKLSAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHByaW50ICc6JywgdiwKLSAgICAgICAgcHJpbnQKLSAgICAgICAgcHJpbnQgJ1R5cGUgaGVscCB0byBnZXQgaGVscC4nCi0KLWRlZiBicm93c2VyaGVscCgpOgotICAgIHByaW50Ci0gICAgcHJpbnQgJyAgICBUaGlzIGlzIHRoZSB0cmFjZWJhY2sgYnJvd3Nlci4gIENvbW1hbmRzIGFyZTonCi0gICAgcHJpbnQgJyAgICAgICAgdXAgICAgICA6IG1vdmUgb25lIGxldmVsIHVwIGluIHRoZSBjYWxsIHN0YWNrJwotICAgIHByaW50ICcgICAgICAgIGRvd24gICAgOiBtb3ZlIG9uZSBsZXZlbCBkb3duIGluIHRoZSBjYWxsIHN0YWNrJwotICAgIHByaW50ICcgICAgICAgIGxvY2FscyAgOiBwcmludCBhbGwgbG9jYWwgdmFyaWFibGVzIGF0IHRoaXMgbGV2ZWwnCi0gICAgcHJpbnQgJyAgICAgICAgZ2xvYmFscyA6IHByaW50IGFsbCBnbG9iYWwgdmFyaWFibGVzIGF0IHRoaXMgbGV2ZWwnCi0gICAgcHJpbnQgJyAgICAgICAgbGlzdCAgICA6IGxpc3Qgc291cmNlIGNvZGUgYXJvdW5kIHRoZSBmYWlsdXJlJwotICAgIHByaW50ICcgICAgICAgIGhlbHAgICAgOiBwcmludCBoZWxwICh3aGF0IHlvdSBhcmUgcmVhZGluZyBub3cpJwotICAgIHByaW50ICcgICAgICAgIHF1aXQgICAgOiBiYWNrIHRvIGNvbW1hbmQgaW50ZXJwcmV0ZXInCi0gICAgcHJpbnQgJyAgICBUeXBpbmcgYW55IG90aGVyIDEtbGluZSBzdGF0ZW1lbnQgd2lsbCBleGVjdXRlIGl0JwotICAgIHByaW50ICcgICAgdXNpbmcgdGhlIGN1cnJlbnQgbGV2ZWxcJ3Mgc3ltYm9sIHRhYmxlcycKLSAgICBwcmludAotCi1kZWYgcHJpbnR0Yih0Yik6Ci0gICAgd2hpbGUgdGI6Ci0gICAgICAgIHByaW50MXRiKHRiKQotICAgICAgICB0YiA9IHRiLnRiX25leHQKLQotZGVmIHByaW50MXRiKHRiKToKLSAgICBwcmludHRiaGVhZGVyKHRiKQotICAgIGlmIHRiLnRiX2ZyYW1lLmZfbG9jYWxzIGlzIG5vdCB0Yi50Yl9mcmFtZS5mX2dsb2JhbHM6Ci0gICAgICAgIHByaW50c3ltYm9scyh0Yi50Yl9mcmFtZS5mX2xvY2FscykKLQotZGVmIHByaW50dGJoZWFkZXIodGIpOgotICAgIGZpbGVuYW1lID0gdGIudGJfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCi0gICAgbGluZW5vID0gdGIudGJfbGluZW5vCi0gICAgaW5mbyA9ICciJyArIGZpbGVuYW1lICsgJyIoJyArIGBsaW5lbm9gICsgJyknCi0gICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCi0gICAgaWYgbGluZToKLSAgICAgICAgaW5mbyA9IGluZm8gKyAnOiAnICsgbGluZS5zdHJpcCgpCi0gICAgcHJpbnQgaW5mbwotCi1kZWYgcHJpbnRzeW1ib2xzKGQpOgotICAgIGtleXMgPSBkLmtleXMoKQotICAgIGtleXMuc29ydCgpCi0gICAgZm9yIG5hbWUgaW4ga2V5czoKLSAgICAgICAgcHJpbnQgJyAgJyArIG5hbWUubGp1c3QoMTIpICsgJzonLAotICAgICAgICBwcmludG9iamVjdChkW25hbWVdLCA0KQotICAgICAgICBwcmludAotCi1kZWYgcHJpbnRvYmplY3QodiwgbWF4bGV2ZWwpOgotICAgIGlmIHYgaXMgTm9uZToKLSAgICAgICAgcHJpbnQgJ05vbmUnLAotICAgIGVsaWYgdHlwZSh2KSBpbiAodHlwZSgwKSwgdHlwZSgwLjApKToKLSAgICAgICAgcHJpbnQgdiwKLSAgICBlbGlmIHR5cGUodikgaXMgdHlwZSgnJyk6Ci0gICAgICAgIGlmIGxlbih2KSA+IDIwOgotICAgICAgICAgICAgcHJpbnQgYHZbOjE3XSArICcuLi4nYCwKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50IGB2YCwKLSAgICBlbGlmIHR5cGUodikgaXMgdHlwZSgoKSk6Ci0gICAgICAgIHByaW50ICcoJywKLSAgICAgICAgcHJpbnRsaXN0KHYsIG1heGxldmVsKQotICAgICAgICBwcmludCAnKScsCi0gICAgZWxpZiB0eXBlKHYpIGlzIHR5cGUoW10pOgotICAgICAgICBwcmludCAnWycsCi0gICAgICAgIHByaW50bGlzdCh2LCBtYXhsZXZlbCkKLSAgICAgICAgcHJpbnQgJ10nLAotICAgIGVsaWYgdHlwZSh2KSBpcyB0eXBlKHt9KToKLSAgICAgICAgcHJpbnQgJ3snLAotICAgICAgICBwcmludGRpY3QodiwgbWF4bGV2ZWwpCi0gICAgICAgIHByaW50ICd9JywKLSAgICBlbHNlOgotICAgICAgICBwcmludCB2LAotCi1kZWYgcHJpbnRsaXN0KHYsIG1heGxldmVsKToKLSAgICBuID0gbGVuKHYpCi0gICAgaWYgbiA9PSAwOiByZXR1cm4KLSAgICBpZiBtYXhsZXZlbCA8PSAwOgotICAgICAgICBwcmludCAnLi4uJywKLSAgICAgICAgcmV0dXJuCi0gICAgZm9yIGkgaW4gcmFuZ2UobWluKDYsIG4pKToKLSAgICAgICAgcHJpbnRvYmplY3QodltpXSwgbWF4bGV2ZWwtMSkKLSAgICAgICAgaWYgaSsxIDwgbjogcHJpbnQgJywnLAotICAgIGlmIG4gPiA2OiBwcmludCAnLi4uJywKLQotZGVmIHByaW50ZGljdCh2LCBtYXhsZXZlbCk6Ci0gICAga2V5cyA9IHYua2V5cygpCi0gICAgbiA9IGxlbihrZXlzKQotICAgIGlmIG4gPT0gMDogcmV0dXJuCi0gICAgaWYgbWF4bGV2ZWwgPD0gMDoKLSAgICAgICAgcHJpbnQgJy4uLicsCi0gICAgICAgIHJldHVybgotICAgIGtleXMuc29ydCgpCi0gICAgZm9yIGkgaW4gcmFuZ2UobWluKDYsIG4pKToKLSAgICAgICAga2V5ID0ga2V5c1tpXQotICAgICAgICBwcmludCBga2V5YCArICc6JywKLSAgICAgICAgcHJpbnRvYmplY3QodltrZXldLCBtYXhsZXZlbC0xKQotICAgICAgICBpZiBpKzEgPCBuOiBwcmludCAnLCcsCi0gICAgaWYgbiA+IDY6IHByaW50ICcuLi4nLApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvdHpwYXJzZS5weSBiL0xpYi9saWItb2xkL3R6cGFyc2UucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDY4YjUuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvdHpwYXJzZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLSIiIlBhcnNlIGEgdGltZXpvbmUgc3BlY2lmaWNhdGlvbi4iIiIKLQotIyBYWFggVW5maW5pc2hlZC4KLSMgWFhYIE9ubHkgdGhlIHR5cGljYWwgZm9ybSAiWFhYaGhZWVk7ZGRkL2hoLGRkZC9oaCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC4KLQotaW1wb3J0IHdhcm5pbmdzCi13YXJuaW5ncy53YXJuKAotICAgICJUaGUgdHpwYXJzZSBtb2R1bGUgaXMgb2Jzb2xldGUgYW5kIHdpbGwgZGlzYXBwZWFyIGluIHRoZSBmdXR1cmUiLAotICAgIERlcHJlY2F0aW9uV2FybmluZykKLQotdHpwYXQgPSAoJ14oW0EtWl1bQS1aXVtBLVpdKShbLStdP1swLTldKykoW0EtWl1bQS1aXVtBLVpdKTsnCi0gICAgICAgICAgJyhbMC05XSspLyhbMC05XSspLChbMC05XSspLyhbMC05XSspJCcpCi0KLXR6cHJvZyA9IE5vbmUKLQotZGVmIHR6cGFyc2UodHpzdHIpOgotICAgICIiIkdpdmVuIGEgdGltZXpvbmUgc3BlYywgcmV0dXJuIGEgdHVwbGUgb2YgaW5mb3JtYXRpb24KLSAgICAodHpuYW1lLCBkZWx0YSwgZHN0bmFtZSwgZGF5c3RhcnQsIGhvdXJzdGFydCwgZGF5ZW5kLCBob3VyZW5kKSwKLSAgICB3aGVyZSAndHpuYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgdGltZXpvbmUsICdkZWx0YScgaXMgdGhlIG9mZnNldAotICAgIGluIGhvdXJzIGZyb20gR01ULCAnZHN0bmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGRheWxpZ2h0LXNhdmluZwotICAgIHRpbWV6b25lLCBhbmQgJ2RheXN0YXJ0Jy8naG91cnN0YXJ0JyBhbmQgJ2RheWVuZCcvJ2hvdXJlbmQnCi0gICAgc3BlY2lmeSB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBwb2ludHMgZm9yIGRheWxpZ2h0IHNhdmluZyB0aW1lLiIiIgotICAgIGdsb2JhbCB0enByb2cKLSAgICBpZiB0enByb2cgaXMgTm9uZToKLSAgICAgICAgaW1wb3J0IHJlCi0gICAgICAgIHR6cHJvZyA9IHJlLmNvbXBpbGUodHpwYXQpCi0gICAgbWF0Y2ggPSB0enByb2cubWF0Y2godHpzdHIpCi0gICAgaWYgbm90IG1hdGNoOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnbm90IHRoZSBUWiBzeW50YXggSSB1bmRlcnN0YW5kJwotICAgIHN1YnMgPSBbXQotICAgIGZvciBpIGluIHJhbmdlKDEsIDgpOgotICAgICAgICBzdWJzLmFwcGVuZChtYXRjaC5ncm91cChpKSkKLSAgICBmb3IgaSBpbiAoMSwgMywgNCwgNSwgNik6Ci0gICAgICAgIHN1YnNbaV0gPSBldmFsKHN1YnNbaV0pCi0gICAgW3R6bmFtZSwgZGVsdGEsIGRzdG5hbWUsIGRheXN0YXJ0LCBob3Vyc3RhcnQsIGRheWVuZCwgaG91cmVuZF0gPSBzdWJzCi0gICAgcmV0dXJuICh0em5hbWUsIGRlbHRhLCBkc3RuYW1lLCBkYXlzdGFydCwgaG91cnN0YXJ0LCBkYXllbmQsIGhvdXJlbmQpCi0KLWRlZiB0emxvY2FsdGltZShzZWNzLCBwYXJhbXMpOgotICAgICIiIkdpdmVuIGEgVW5peCB0aW1lIGluIHNlY29uZHMgYW5kIGEgdHVwbGUgb2YgaW5mb3JtYXRpb24gYWJvdXQKLSAgICBhIHRpbWV6b25lIGFzIHJldHVybmVkIGJ5IHR6cGFyc2UoKSwgcmV0dXJuIHRoZSBsb2NhbCB0aW1lIGluIHRoZQotICAgIGZvcm0gKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbiwgc2VjLCB5ZGF5LCB3ZGF5LCB0em5hbWUpLiIiIgotICAgIGltcG9ydCB0aW1lCi0gICAgKHR6bmFtZSwgZGVsdGEsIGRzdG5hbWUsIGRheXN0YXJ0LCBob3Vyc3RhcnQsIGRheWVuZCwgaG91cmVuZCkgPSBwYXJhbXMKLSAgICB5ZWFyLCBtb250aCwgZGF5cywgaG91cnMsIG1pbnMsIHNlY3MsIHlkYXksIHdkYXksIGlzZHN0ID0gXAotICAgICAgICAgICAgdGltZS5nbXRpbWUoc2VjcyAtIGRlbHRhKjM2MDApCi0gICAgaWYgKGRheXN0YXJ0LCBob3Vyc3RhcnQpIDw9ICh5ZGF5KzEsIGhvdXJzKSA8IChkYXllbmQsIGhvdXJlbmQpOgotICAgICAgICB0em5hbWUgPSBkc3RuYW1lCi0gICAgICAgIGhvdXJzID0gaG91cnMgKyAxCi0gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBkYXlzLCBob3VycywgbWlucywgc2VjcywgeWRheSwgd2RheSwgdHpuYW1lCi0KLWRlZiB0enNldCgpOgotICAgICIiIkRldGVybWluZSB0aGUgY3VycmVudCB0aW1lem9uZSBmcm9tIHRoZSAiVFoiIGVudmlyb25tZW50IHZhcmlhYmxlLiIiIgotICAgIGdsb2JhbCB0enBhcmFtcywgdGltZXpvbmUsIGFsdHpvbmUsIGRheWxpZ2h0LCB0em5hbWUKLSAgICBpbXBvcnQgb3MKLSAgICB0enN0ciA9IG9zLmVudmlyb25bJ1RaJ10KLSAgICB0enBhcmFtcyA9IHR6cGFyc2UodHpzdHIpCi0gICAgdGltZXpvbmUgPSB0enBhcmFtc1sxXSAqIDM2MDAKLSAgICBhbHR6b25lID0gdGltZXpvbmUgLSAzNjAwCi0gICAgZGF5bGlnaHQgPSAxCi0gICAgdHpuYW1lID0gdHpwYXJhbXNbMF0sIHR6cGFyYW1zWzJdCi0KLWRlZiBpc2RzdChzZWNzKToKLSAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkYXlsaWdodC1zYXZpbmcgdGltZSBpcyBpbiBlZmZlY3QgZm9yIHRoZSBnaXZlbgotICAgIFVuaXggdGltZSBpbiB0aGUgY3VycmVudCB0aW1lem9uZS4iIiIKLSAgICBpbXBvcnQgdGltZQotICAgICh0em5hbWUsIGRlbHRhLCBkc3RuYW1lLCBkYXlzdGFydCwgaG91cnN0YXJ0LCBkYXllbmQsIGhvdXJlbmQpID0gXAotICAgICAgICAgICAgdHpwYXJhbXMKLSAgICB5ZWFyLCBtb250aCwgZGF5cywgaG91cnMsIG1pbnMsIHNlY3MsIHlkYXksIHdkYXksIGlzZHN0ID0gXAotICAgICAgICAgICAgdGltZS5nbXRpbWUoc2VjcyAtIGRlbHRhKjM2MDApCi0gICAgcmV0dXJuIChkYXlzdGFydCwgaG91cnN0YXJ0KSA8PSAoeWRheSsxLCBob3VycykgPCAoZGF5ZW5kLCBob3VyZW5kKQotCi10enNldCgpCi0KLWRlZiBsb2NhbHRpbWUoc2Vjcyk6Ci0gICAgIiIiR2V0IHRoZSBsb2NhbCB0aW1lIGluIHRoZSBjdXJyZW50IHRpbWV6b25lLiIiIgotICAgIHJldHVybiB0emxvY2FsdGltZShzZWNzLCB0enBhcmFtcykKLQotZGVmIHRlc3QoKToKLSAgICBmcm9tIHRpbWUgaW1wb3J0IGFzY3RpbWUsIGdtdGltZQotICAgIGltcG9ydCB0aW1lLCBzeXMKLSAgICBub3cgPSB0aW1lLnRpbWUoKQotICAgIHggPSBsb2NhbHRpbWUobm93KQotICAgIHRtID0geFs6LTFdICsgKDAsKQotICAgIHByaW50ICdub3cgPScsIG5vdywgJz0nLCBhc2N0aW1lKHRtKSwgeFstMV0KLSAgICBub3cgPSBub3cgLSBub3cgJSAoMjQqMzYwMCkKLSAgICBpZiBzeXMuYXJndlsxOl06IG5vdyA9IG5vdyArIGV2YWwoc3lzLmFyZ3ZbMV0pCi0gICAgeCA9IGdtdGltZShub3cpCi0gICAgdG0gPSB4WzotMV0gKyAoMCwpCi0gICAgcHJpbnQgJ2dtdGltZSA9Jywgbm93LCAnPScsIGFzY3RpbWUodG0pLCAneWRheSA9JywgeFstMl0KLSAgICBqYW4xID0gbm93IC0geFstMl0qMjQqMzYwMAotICAgIHggPSBsb2NhbHRpbWUoamFuMSkKLSAgICB0bSA9IHhbOi0xXSArICgwLCkKLSAgICBwcmludCAnamFuMSA9JywgamFuMSwgJz0nLCBhc2N0aW1lKHRtKSwgeFstMV0KLSAgICBmb3IgZCBpbiByYW5nZSg4NSwgOTUpICsgcmFuZ2UoMjY1LCAyNzUpOgotICAgICAgICB0ID0gamFuMSArIGQqMjQqMzYwMAotICAgICAgICB4ID0gbG9jYWx0aW1lKHQpCi0gICAgICAgIHRtID0geFs6LTFdICsgKDAsKQotICAgICAgICBwcmludCAnZCA9JywgZCwgJ3QgPScsIHQsICc9JywgYXNjdGltZSh0bSksIHhbLTFdCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC91dGlsLnB5IGIvTGliL2xpYi1vbGQvdXRpbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0YWYxZS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC91dGlsLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyBNb2R1bGUgJ3V0aWwnIC0tIHNvbWUgdXNlZnVsIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGZpdCBlbHNld2hlcmUKLQotIyBOQjogVGhlc2UgYXJlIG5vdyBidWlsdC1pbiBmdW5jdGlvbnMsIGJ1dCB0aGlzIG1vZHVsZSBpcyBwcm92aWRlZAotIyBmb3IgY29tcGF0aWJpbGl0eS4gIERvbid0IHVzZSBpbiBuZXcgcHJvZ3JhbXMgdW5sZXNzIHlvdSBuZWVkIGJhY2t3YXJkCi0jIGNvbXBhdGliaWxpdHkgKGkuZS4gbmVlZCB0byBydW4gd2l0aCBvbGQgaW50ZXJwcmV0ZXJzKS4KLQotCi0jIFJlbW92ZSBhbiBpdGVtIGZyb20gYSBsaXN0LgotIyBObyBjb21wbGFpbnRzIGlmIGl0IGlzbid0IGluIHRoZSBsaXN0IGF0IGFsbC4KLSMgSWYgaXQgb2NjdXJzIG1vcmUgdGhhbiBvbmNlLCByZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2UuCi0jCi1kZWYgcmVtb3ZlKGl0ZW0sIGxpc3QpOgotICAgIGlmIGl0ZW0gaW4gbGlzdDogbGlzdC5yZW1vdmUoaXRlbSkKLQotCi0jIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgZmlsZSdzIGNvbnRlbnRzLgotIwotZGVmIHJlYWRmaWxlKGZuKToKLSAgICByZXR1cm4gcmVhZG9wZW5maWxlKG9wZW4oZm4sICdyJykpCi0KLQotIyBSZWFkIGFuIG9wZW4gZmlsZSB1bnRpbCBFT0YuCi0jCi1kZWYgcmVhZG9wZW5maWxlKGZwKToKLSAgICByZXR1cm4gZnAucmVhZCgpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC93aGF0c291bmQucHkgYi9MaWIvbGliLW9sZC93aGF0c291bmQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMWRmMjMuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvd2hhdHNvdW5kLnB5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZnJvbSBzbmRoZHIgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL3docmFuZG9tLnB5IGIvTGliL2xpYi1vbGQvd2hyYW5kb20ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMGQxYTQuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvd2hyYW5kb20ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIiIiV2ljaG1hbi1IaWxsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgotCi1XaWNobWFubiwgQi4gQS4gJiBIaWxsLCBJLiBELiAoMTk4MikKLUFsZ29yaXRobSBBUyAxODM6Ci1BbiBlZmZpY2llbnQgYW5kIHBvcnRhYmxlIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcgotQXBwbGllZCBTdGF0aXN0aWNzIDMxICgxOTgyKSAxODgtMTkwCi0KLXNlZSBhbHNvOgotICAgICAgICBDb3JyZWN0aW9uIHRvIEFsZ29yaXRobSBBUyAxODMKLSAgICAgICAgQXBwbGllZCBTdGF0aXN0aWNzIDMzICgxOTg0KSAxMjMKLQotICAgICAgICBNY0xlb2QsIEEuIEkuICgxOTg1KQotICAgICAgICBBIHJlbWFyayBvbiBBbGdvcml0aG0gQVMgMTgzCi0gICAgICAgIEFwcGxpZWQgU3RhdGlzdGljcyAzNCAoMTk4NSksMTk4LTIwMAotCi0KLVVTRToKLXdocmFuZG9tLnJhbmRvbSgpICAgICAgIHlpZWxkcyBkb3VibGUgcHJlY2lzaW9uIHJhbmRvbSBudW1iZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYmV0d2VlbiAwIGFuZCAxLgotCi13aHJhbmRvbS5zZWVkKHgsIHksIHopICBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgd2hyYW5kb20ucmFuZG9tKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlZWQgdGhlIGdlbmVyYXRvcgotCi1UaGVyZSBpcyBhbHNvIGFuIGludGVyZmFjZSB0byBjcmVhdGUgbXVsdGlwbGUgaW5kZXBlbmRlbnQKLXJhbmRvbSBnZW5lcmF0b3JzLCBhbmQgdG8gY2hvb3NlIGZyb20gb3RoZXIgcmFuZ2VzLgotCi0KLQotTXVsdGktdGhyZWFkaW5nIG5vdGU6IHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB1c2VkIGhlcmUgaXMgbm90Ci10aHJlYWQtc2FmZTsgaXQgaXMgcG9zc2libGUgdGhhdCBuZWFybHkgc2ltdWx0YW5lb3VzIGNhbGxzIGluCi1kaWZmZXJlbnQgdGhlYWRzIHJldHVybiB0aGUgc2FtZSByYW5kb20gdmFsdWUuICBUbyBhdm9pZCB0aGlzLCB5b3UKLWhhdmUgdG8gdXNlIGEgbG9jayBhcm91bmQgYWxsIGNhbGxzLiAgKEkgZGlkbid0IHdhbnQgdG8gc2xvdyB0aGlzCi1kb3duIGluIHRoZSBzZXJpYWwgY2FzZSBieSB1c2luZyBhIGxvY2sgaGVyZS4pCi0iIiIKLQotaW1wb3J0IHdhcm5pbmdzCi13YXJuaW5ncy53YXJuKCJ0aGUgd2hyYW5kb20gbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7IHBsZWFzZSB1c2UgdGhlIHJhbmRvbSBtb2R1bGUiLAotICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCi0KLSMgVHJhbnNsYXRlZCBieSBHdWlkbyB2YW4gUm9zc3VtIGZyb20gQyBzb3VyY2UgcHJvdmlkZWQgYnkKLSMgQWRyaWFuIEJhZGRlbGV5LgotCi0KLWNsYXNzIHdocmFuZG9tOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4ID0gMCwgeSA9IDAsIHogPSAwKToKLSAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZS4KLSAgICAgICAgV2l0aG91dCBhcmd1bWVudHMsIGluaXRpYWxpemUgZnJvbSBjdXJyZW50IHRpbWUuCi0gICAgICAgIFdpdGggYXJndW1lbnRzICh4LCB5LCB6KSwgaW5pdGlhbGl6ZSBmcm9tIHRoZW0uIiIiCi0gICAgICAgIHNlbGYuc2VlZCh4LCB5LCB6KQotCi0gICAgZGVmIHNlZWQoc2VsZiwgeCA9IDAsIHkgPSAwLCB6ID0gMCk6Ci0gICAgICAgICIiIlNldCB0aGUgc2VlZCBmcm9tICh4LCB5LCB6KS4KLSAgICAgICAgVGhlc2UgbXVzdCBiZSBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgWzAsIDI1NikuIiIiCi0gICAgICAgIGlmIG5vdCB0eXBlKHgpID09IHR5cGUoeSkgPT0gdHlwZSh6KSA9PSB0eXBlKDApOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAnc2VlZHMgbXVzdCBiZSBpbnRlZ2VycycKLSAgICAgICAgaWYgbm90ICgwIDw9IHggPCAyNTYgYW5kIDAgPD0geSA8IDI1NiBhbmQgMCA8PSB6IDwgMjU2KToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdzZWVkcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NiknCi0gICAgICAgIGlmIDAgPT0geCA9PSB5ID09IHo6Ci0gICAgICAgICAgICAjIEluaXRpYWxpemUgZnJvbSBjdXJyZW50IHRpbWUKLSAgICAgICAgICAgIGltcG9ydCB0aW1lCi0gICAgICAgICAgICB0ID0gbG9uZyh0aW1lLnRpbWUoKSAqIDI1NikKLSAgICAgICAgICAgIHQgPSBpbnQoKHQmMHhmZmZmZmYpIF4gKHQ+PjI0KSkKLSAgICAgICAgICAgIHQsIHggPSBkaXZtb2QodCwgMjU2KQotICAgICAgICAgICAgdCwgeSA9IGRpdm1vZCh0LCAyNTYpCi0gICAgICAgICAgICB0LCB6ID0gZGl2bW9kKHQsIDI1NikKLSAgICAgICAgIyBaZXJvIGlzIGEgcG9vciBzZWVkLCBzbyBzdWJzdGl0dXRlIDEKLSAgICAgICAgc2VsZi5fc2VlZCA9ICh4IG9yIDEsIHkgb3IgMSwgeiBvciAxKQotCi0gICAgZGVmIHJhbmRvbShzZWxmKToKLSAgICAgICAgIiIiR2V0IHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLjAsIDEuMCkuIiIiCi0gICAgICAgICMgVGhpcyBwYXJ0IGlzIHRocmVhZC11bnNhZmU6Ci0gICAgICAgICMgQkVHSU4gQ1JJVElDQUwgU0VDVElPTgotICAgICAgICB4LCB5LCB6ID0gc2VsZi5fc2VlZAotICAgICAgICAjCi0gICAgICAgIHggPSAoMTcxICogeCkgJSAzMDI2OQotICAgICAgICB5ID0gKDE3MiAqIHkpICUgMzAzMDcKLSAgICAgICAgeiA9ICgxNzAgKiB6KSAlIDMwMzIzCi0gICAgICAgICMKLSAgICAgICAgc2VsZi5fc2VlZCA9IHgsIHksIHoKLSAgICAgICAgIyBFTkQgQ1JJVElDQUwgU0VDVElPTgotICAgICAgICAjCi0gICAgICAgIHJldHVybiAoeC8zMDI2OS4wICsgeS8zMDMwNy4wICsgei8zMDMyMy4wKSAlIDEuMAotCi0gICAgZGVmIHVuaWZvcm0oc2VsZiwgYSwgYik6Ci0gICAgICAgICIiIkdldCBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIFthLCBiKS4iIiIKLSAgICAgICAgcmV0dXJuIGEgKyAoYi1hKSAqIHNlbGYucmFuZG9tKCkKLQotICAgIGRlZiByYW5kaW50KHNlbGYsIGEsIGIpOgotICAgICAgICAiIiJHZXQgYSByYW5kb20gaW50ZWdlciBpbiB0aGUgcmFuZ2UgW2EsIGJdIGluY2x1ZGluZwotICAgICAgICBib3RoIGVuZCBwb2ludHMuCi0KLSAgICAgICAgKERlcHJlY2F0ZWQ7IHVzZSByYW5kcmFuZ2UgYmVsb3cuKSIiIgotICAgICAgICByZXR1cm4gc2VsZi5yYW5kcmFuZ2UoYSwgYisxKQotCi0gICAgZGVmIGNob2ljZShzZWxmLCBzZXEpOgotICAgICAgICAiIiJDaG9vc2UgYSByYW5kb20gZWxlbWVudCBmcm9tIGEgbm9uLWVtcHR5IHNlcXVlbmNlLiIiIgotICAgICAgICByZXR1cm4gc2VxW2ludChzZWxmLnJhbmRvbSgpICogbGVuKHNlcSkpXQotCi0gICAgZGVmIHJhbmRyYW5nZShzZWxmLCBzdGFydCwgc3RvcD1Ob25lLCBzdGVwPTEsIGludD1pbnQsIGRlZmF1bHQ9Tm9uZSk6Ci0gICAgICAgICIiIkNob29zZSBhIHJhbmRvbSBpdGVtIGZyb20gcmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkuCi0KLSAgICAgICAgVGhpcyBmaXhlcyB0aGUgcHJvYmxlbSB3aXRoIHJhbmRpbnQoKSB3aGljaCBpbmNsdWRlcyB0aGUKLSAgICAgICAgZW5kcG9pbnQ7IGluIFB5dGhvbiB0aGlzIGlzIHVzdWFsbHkgbm90IHdoYXQgeW91IHdhbnQuCi0gICAgICAgIERvIG5vdCBzdXBwbHkgdGhlICdpbnQnIGFuZCAnZGVmYXVsdCcgYXJndW1lbnRzLiIiIgotICAgICAgICAjIFRoaXMgY29kZSBpcyBhIGJpdCBtZXNzeSB0byBtYWtlIGl0IGZhc3QgZm9yIHRoZQotICAgICAgICAjIGNvbW1vbiBjYXNlIHdoaWxlIHN0aWxsIGRvaW5nIGFkZXF1YXRlIGVycm9yIGNoZWNraW5nCi0gICAgICAgIGlzdGFydCA9IGludChzdGFydCkKLSAgICAgICAgaWYgaXN0YXJ0ICE9IHN0YXJ0OgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vbi1pbnRlZ2VyIGFyZyAxIGZvciByYW5kcmFuZ2UoKSIKLSAgICAgICAgaWYgc3RvcCBpcyBkZWZhdWx0OgotICAgICAgICAgICAgaWYgaXN0YXJ0ID4gMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaW50KHNlbGYucmFuZG9tKCkgKiBpc3RhcnQpCi0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZW1wdHkgcmFuZ2UgZm9yIHJhbmRyYW5nZSgpIgotICAgICAgICBpc3RvcCA9IGludChzdG9wKQotICAgICAgICBpZiBpc3RvcCAhPSBzdG9wOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vbi1pbnRlZ2VyIHN0b3AgZm9yIHJhbmRyYW5nZSgpIgotICAgICAgICBpZiBzdGVwID09IDE6Ci0gICAgICAgICAgICBpZiBpc3RhcnQgPCBpc3RvcDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXN0YXJ0ICsgaW50KHNlbGYucmFuZG9tKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXN0b3AgLSBpc3RhcnQpKQotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKSIKLSAgICAgICAgaXN0ZXAgPSBpbnQoc3RlcCkKLSAgICAgICAgaWYgaXN0ZXAgIT0gc3RlcDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJub24taW50ZWdlciBzdGVwIGZvciByYW5kcmFuZ2UoKSIKLSAgICAgICAgaWYgaXN0ZXAgPiAwOgotICAgICAgICAgICAgbiA9IChpc3RvcCAtIGlzdGFydCArIGlzdGVwIC0gMSkgLyBpc3RlcAotICAgICAgICBlbGlmIGlzdGVwIDwgMDoKLSAgICAgICAgICAgIG4gPSAoaXN0b3AgLSBpc3RhcnQgKyBpc3RlcCArIDEpIC8gaXN0ZXAKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ6ZXJvIHN0ZXAgZm9yIHJhbmRyYW5nZSgpIgotCi0gICAgICAgIGlmIG4gPD0gMDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKCkiCi0gICAgICAgIHJldHVybiBpc3RhcnQgKyBpc3RlcCppbnQoc2VsZi5yYW5kb20oKSAqIG4pCi0KLQotIyBJbml0aWFsaXplIGZyb20gdGhlIGN1cnJlbnQgdGltZQotX2luc3QgPSB3aHJhbmRvbSgpCi1zZWVkID0gX2luc3Quc2VlZAotcmFuZG9tID0gX2luc3QucmFuZG9tCi11bmlmb3JtID0gX2luc3QudW5pZm9ybQotcmFuZGludCA9IF9pbnN0LnJhbmRpbnQKLWNob2ljZSA9IF9pbnN0LmNob2ljZQotcmFuZHJhbmdlID0gX2luc3QucmFuZHJhbmdlCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC96bW9kLnB5IGIvTGliL2xpYi1vbGQvem1vZC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmNDlkZi4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC96bW9kLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyBtb2R1bGUgJ3ptb2QnCi0KLSMgQ29tcHV0ZSBwcm9wZXJ0aWVzIG9mIG1hdGhlbWF0aWNhbCAiZmllbGRzIiBmb3JtZWQgYnkgdGFraW5nCi0jIFovbiAodGhlIHdob2xlIG51bWJlcnMgbW9kdWxvIHNvbWUgd2hvbGUgbnVtYmVyIG4pIGFuZCBhbgotIyBpcnJlZHVjaWJsZSBwb2x5bm9taWFsIChpLmUuLCBhIHBvbHlub21pYWwgd2l0aCBvbmx5IGNvbXBsZXggemVyb3MpLAotIyBlLmcuLCBaLzUgYW5kIFgqKjIgKyAyLgotIwotIyBUaGUgZmllbGQgaXMgZm9ybWVkIGJ5IHRha2luZyBhbGwgcG9zc2libGUgbGluZWFyIGNvbWJpbmF0aW9ucyBvZgotIyBhIHNldCBvZiBkIGJhc2UgdmVjdG9ycyAod2hlcmUgZCBpcyB0aGUgZGVncmVlIG9mIHRoZSBwb2x5bm9taWFsKS4KLSMKLSMgTm90ZSB0aGF0IHRoaXMgcHJvY2VkdXJlIGRvZXNuJ3QgeWllbGQgYSBmaWVsZCBmb3IgYWxsIGNvbWJpbmF0aW9ucwotIyBvZiBuIGFuZCBwOiBpdCBtYXkgd2VsbCBiZSB0aGF0IHNvbWUgbnVtYmVycyBoYXZlIG1vcmUgdGhhbiBvbmUKLSMgaW52ZXJzZSBhbmQgb3RoZXJzIGhhdmUgbm9uZS4gIFRoaXMgaXMgd2hhdCB3ZSBjaGVjay4KLSMKLSMgUmVtZW1iZXIgdGhhdCBhIGZpZWxkIGlzIGEgcmluZyB3aGVyZSBlYWNoIGVsZW1lbnQgaGFzIGFuIGludmVyc2UuCi0jIEEgcmluZyBoYXMgY29tbXV0YXRpdmUgYWRkaXRpb24gYW5kIG11bHRpcGxpY2F0aW9uLCBhIHplcm8gYW5kIGEgb25lOgotIyAwKnggPSB4KjAgPSAwLCAwK3ggPSB4KzAgPSB4LCAxKnggPSB4KjEgPSB4LiAgQWxzbywgdGhlIGRpc3RyaWJ1dGl2ZQotIyBwcm9wZXJ0eSBob2xkczogYSooYitjKSA9IGEqYiArIGIqYy4KLSMgKFhYWCBJIGZvcmdldCBpZiB0aGlzIGlzIGFuIGF4aW9tIG9yIGZvbGxvd3MgZnJvbSB0aGUgcnVsZXMuKQotCi1pbXBvcnQgcG9seQotCi0KLSMgRXhhbXBsZSBOIGFuZCBwb2x5bm9taWFsCi0KLU4gPSA1Ci1QID0gcG9seS5wbHVzKHBvbHkub25lKDAsIDIpLCBwb2x5Lm9uZSgyLCAxKSkgIyAyICsgeCoqMgotCi0KLSMgUmV0dXJuIHggbW9kdWxvIHkuICBSZXR1cm5zID49IDAgZXZlbiBpZiB4IDwgMC4KLQotZGVmIG1vZCh4LCB5KToKLSAgICByZXR1cm4gZGl2bW9kKHgsIHkpWzFdCi0KLQotIyBOb3JtYWxpemUgYSBwb2x5bm9taWFsIG1vZHVsbyBuIGFuZCBtb2R1bG8gcC4KLQotZGVmIG5vcm0oYSwgbiwgcCk6Ci0gICAgYSA9IHBvbHkubW9kdWxvKGEsIHApCi0gICAgYSA9IGFbOl0KLSAgICBmb3IgaSBpbiByYW5nZShsZW4oYSkpOiBhW2ldID0gbW9kKGFbaV0sIG4pCi0gICAgYSA9IHBvbHkubm9ybWFsaXplKGEpCi0gICAgcmV0dXJuIGEKLQotCi0jIE1ha2UgYSBsaXN0IG9mIGFsbCBuXmQgZWxlbWVudHMgb2YgdGhlIHByb3Bvc2VkIGZpZWxkLgotCi1kZWYgbWFrZV9hbGwobWF0KToKLSAgICBhbGwgPSBbXQotICAgIGZvciByb3cgaW4gbWF0OgotICAgICAgICBmb3IgYSBpbiByb3c6Ci0gICAgICAgICAgICBhbGwuYXBwZW5kKGEpCi0gICAgcmV0dXJuIGFsbAotCi1kZWYgbWFrZV9lbGVtZW50cyhuLCBkKToKLSAgICBpZiBkID09IDA6IHJldHVybiBbcG9seS5vbmUoMCwgMCldCi0gICAgc3ViID0gbWFrZV9lbGVtZW50cyhuLCBkLTEpCi0gICAgYWxsID0gW10KLSAgICBmb3IgYSBpbiBzdWI6Ci0gICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgotICAgICAgICAgICAgYWxsLmFwcGVuZChwb2x5LnBsdXMoYSwgcG9seS5vbmUoZC0xLCBpKSkpCi0gICAgcmV0dXJuIGFsbAotCi1kZWYgbWFrZV9pbnYoYWxsLCBuLCBwKToKLSAgICB4ID0gcG9seS5vbmUoMSwgMSkKLSAgICBpbnYgPSBbXQotICAgIGZvciBhIGluIGFsbDoKLSAgICAgICAgaW52LmFwcGVuZChub3JtKHBvbHkudGltZXMoYSwgeCksIG4sIHApKQotICAgIHJldHVybiBpbnYKLQotZGVmIGNoZWNrZmllbGQobiwgcCk6Ci0gICAgYWxsID0gbWFrZV9lbGVtZW50cyhuLCBsZW4ocCktMSkKLSAgICBpbnYgPSBtYWtlX2ludihhbGwsIG4sIHApCi0gICAgYWxsMSA9IGFsbFs6XQotICAgIGludjEgPSBpbnZbOl0KLSAgICBhbGwxLnNvcnQoKQotICAgIGludjEuc29ydCgpCi0gICAgaWYgYWxsMSA9PSBpbnYxOiBwcmludCAnQklOR08hJwotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICdTb3JyeTonLCBuLCBwCi0gICAgICAgIHByaW50IGFsbAotICAgICAgICBwcmludCBpbnYKLQotZGVmIHJqKHMsIHdpZHRoKToKLSAgICBpZiB0eXBlKHMpIGlzIG5vdCB0eXBlKCcnKTogcyA9IGBzYAotICAgIG4gPSBsZW4ocykKLSAgICBpZiBuID49IHdpZHRoOiByZXR1cm4gcwotICAgIHJldHVybiAnICcqKHdpZHRoIC0gbikgKyBzCi0KLWRlZiBsaihzLCB3aWR0aCk6Ci0gICAgaWYgdHlwZShzKSBpcyBub3QgdHlwZSgnJyk6IHMgPSBgc2AKLSAgICBuID0gbGVuKHMpCi0gICAgaWYgbiA+PSB3aWR0aDogcmV0dXJuIHMKLSAgICByZXR1cm4gcyArICcgJyood2lkdGggLSBuKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay9UaXgucHkgYi9MaWIvbGliLXRrL1RpeC5weQppbmRleCAyZmIxMzA3Li4xNGMzYzI0IDEwMDc1NQotLS0gYS9MaWIvbGliLXRrL1RpeC5weQorKysgYi9MaWIvbGliLXRrL1RpeC5weQpAQCAtMTU0MSw4ICsxNTQxLDggQEAKICAgICAgICAgJycnVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZW50cnkgZ2l2ZW4gYnkKICAgICAgZW50cnlQYXRoIGhhcyBjaGlsZHJlbiBlbnRyaWVzIGFuZCB3aGV0aGVyIHRoZSBjaGlsZHJlbiBhcmUgdmlzaWJsZS4gbW9kZQogICAgICBtdXN0IGJlIG9uZSBvZiBvcGVuLCBjbG9zZSBvciBub25lLiBJZiBtb2RlIGlzIHNldCB0byBvcGVuLCBhICgrKQotICAgICBpbmRpY2F0b3IgaXMgZHJhd24gbmV4dCB0byB0aGUgZW50cnkuIElmIG1vZGUgaXMgc2V0IHRvIGNsb3NlLCBhICgtKQotICAgICBpbmRpY2F0b3IgaXMgZHJhd24gbmV4dCB0byB0aGUgZW50cnkuIElmIG1vZGUgaXMgc2V0IHRvIG5vbmUsIG5vCisgICAgIGluZGljYXRvciBpcyBkcmF3biBuZXh0IHRoZSB0aGUgZW50cnkuIElmIG1vZGUgaXMgc2V0IHRvIGNsb3NlLCBhICgtKQorICAgICBpbmRpY2F0b3IgaXMgZHJhd24gbmV4dCB0aGUgdGhlIGVudHJ5LiBJZiBtb2RlIGlzIHNldCB0byBub25lLCBubwogICAgICBpbmRpY2F0b3JzIHdpbGwgYmUgZHJhd24gZm9yIHRoaXMgZW50cnkuIFRoZSBkZWZhdWx0IG1vZGUgaXMgbm9uZS4gVGhlCiAgICAgIG9wZW4gbW9kZSBpbmRpY2F0ZXMgdGhlIGVudHJ5IGhhcyBoaWRkZW4gY2hpbGRyZW4gYW5kIHRoaXMgZW50cnkgY2FuIGJlCiAgICAgIG9wZW5lZCBieSB0aGUgdXNlci4gVGhlIGNsb3NlIG1vZGUgaW5kaWNhdGVzIHRoYXQgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUKQEAgLTE3NzMsNiArMTc3Myw3IEBACiAgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4U2Nyb2xsZWRXaWRnZXQKICAgICBwYXNzCiAKKwogY2xhc3MgR3JpZChUaXhXaWRnZXQpOgogICAgICcnJ1RoZSBUaXggR3JpZCBjb21tYW5kIGNyZWF0ZXMgYSBuZXcgd2luZG93ICBhbmQgbWFrZXMgaXQgaW50byBhCiAgICAgdGl4R3JpZCB3aWRnZXQuIEFkZGl0aW9uYWwgb3B0aW9ucywgbWF5IGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZApAQCAtMTc4NywyNiArMTc4OCwxMDEgQEAKICAgICBib3JkZXIuCiAKICAgICBTdWJ3aWRnZXRzIC0gTm9uZScnJwotICAgIHBhc3MKKyAgICAjIHZhbGlkIHNwZWNpZmljIHJlc291cmNlcyBhcyBvZiBUayA4LjQKKyAgICAjIGVkaXRkb25lY21kLCBlZGl0bm90aWZ5Y21kLCBmbG9hdGluZ2NvbHMsIGZsb2F0aW5ncm93cywgZm9ybWF0Y21kLAorICAgICMgaGlnaGxpZ2h0YmFja2dyb3VuZCwgaGlnaGxpZ2h0Y29sb3IsIGxlZnRtYXJnaW4sIGl0ZW10eXBlLCBzZWxlY3Rtb2RlLAorICAgICMgc2VsZWN0dW5pdCwgdG9wbWFyZ2luLAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc3RhdGljPSBbXQorICAgICAgICBzZWxmLmNuZj0gY25mCisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhHcmlkJywgc3RhdGljLCBjbmYsIGt3KQogCisgICAgIyB2YWxpZCBvcHRpb25zIGFzIG9mIFRrIDguNAorICAgICMgYW5jaG9yLCBiZHR5cGUsIGNnZXQsIGNvbmZpZ3VyZSwgZGVsZXRlLCBkcmFnc2l0ZSwgZHJvcHNpdGUsIGVudHJ5Y2dldCwgZWRpdAorICAgICMgZW50cnljb25maWd1cmUsIGZvcm1hdCwgZ2VvbWV0cnlpbmZvLCBpbmZvLCBpbmRleCwgbW92ZSwgbmVhcmVzdCwgc2VsZWN0aW9uCisgICAgIyBzZXQsIHNpemUsIHVuc2V0LCB4dmlldywgeXZpZXcKICAgICAjIGRlZiBhbmNob3Igb3B0aW9uID9hcmdzIC4uLj8KKyAgICBkZWYgYW5jaG9yX2dldChzZWxmKToKKyAgICAgICAgIkdldCB0aGUgKHgseSkgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudCBhbmNob3IgY2VsbCIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKHNlbGYsICdhbmNob3InLCAnZ2V0JykpCisKICAgICAjIGRlZiBiZHR5cGUKICAgICAjIGRlZiBkZWxldGUgZGltIGZyb20gP3RvPworICAgIGRlZiBkZWxldGVfcm93KHNlbGYsIGZyb21fLCB0bz1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIHJvd3MgYmV0d2VlbiBmcm9tXyBhbmQgdG8gaW5jbHVzaXZlLgorICAgICAgICBJZiB0byBpcyBub3QgcHJvdmlkZWQsICBkZWxldGUgb25seSByb3cgYXQgZnJvbV8iIiIKKyAgICAgICAgaWYgdG8gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnZGVsZXRlJywgJ3JvdycsIGZyb21fKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdkZWxldGUnLCAncm93JywgZnJvbV8sIHRvKQorICAgIGRlZiBkZWxldGVfY29sdW1uKHNlbGYsIGZyb21fLCB0bz1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIGNvbHVtbnMgYmV0d2VlbiBmcm9tXyBhbmQgdG8gaW5jbHVzaXZlLgorICAgICAgICBJZiB0byBpcyBub3QgcHJvdmlkZWQsICBkZWxldGUgb25seSBjb2x1bW4gYXQgZnJvbV8iIiIKKyAgICAgICAgaWYgdG8gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnZGVsZXRlJywgJ2NvbHVtbicsIGZyb21fKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdkZWxldGUnLCAnY29sdW1uJywgZnJvbV8sIHRvKQogICAgICMgZGVmIGVkaXQgYXBwbHkKICAgICAjIGRlZiBlZGl0IHNldCB4IHkKLSAgICAjIGRlZiBlbnRyeWNnZXQgeCB5IG9wdGlvbgotICAgICMgZGVmIGVudHJ5Y29uZmlndXJlIHggeSA/b3B0aW9uPyA/dmFsdWUgb3B0aW9uIHZhbHVlIC4uLj8KKworICAgIGRlZiBlbnRyeWNnZXQoc2VsZiwgeCwgeSwgb3B0aW9uKToKKyAgICAgICAgIkdldCB0aGUgb3B0aW9uIHZhbHVlIGZvciBjZWxsIGF0ICh4LHkpIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYsICdlbnRyeWNnZXQnLCB4LCB5LCBvcHRpb24pCisKKyAgICBkZWYgZW50cnljb25maWd1cmUoc2VsZiwgeCwgeSwgKiprdyk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZiwgJ2VudHJ5Y29uZmlndXJlJywgeCwgeSwgKnNlbGYuX29wdGlvbnMoTm9uZSwga3cpKQogICAgICMgZGVmIGZvcm1hdAogICAgICMgZGVmIGluZGV4CisKKyAgICBkZWYgaW5mb19leGlzdHMoc2VsZiwgeCwgeSk6CisgICAgICAgICJSZXR1cm4gVHJ1ZSBpZiBkaXNwbGF5IGl0ZW0gZXhpc3RzIGF0ICh4LHkpIgorICAgICAgICByZXR1cm4gYm9vbChpbnQoc2VsZi50ay5jYWxsKHNlbGYsICdpbmZvJywgJ2V4aXN0cycsIHgsIHkpKSkKKworICAgIGRlZiBpbmZvX2Jib3goc2VsZiwgeCwgeSk6CisgICAgICAgICMgVGhpcyBzZWVtcyB0byBhbHdheXMgcmV0dXJuICcnLCBhdCBsZWFzdCBmb3IgJ3RleHQnIGRpc3BsYXlpdGVtcworICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYsICdpbmZvJywgJ2Jib3gnLCB4LCB5KQorCisgICAgZGVmIG5lYXJlc3Qoc2VsZiwgeCwgeSk6CisgICAgICAgICJSZXR1cm4gY29vcmRpbmF0ZSBvZiBjZWxsIG5lYXJlc3QgcGl4ZWwgY29vcmRpbmF0ZSAoeCx5KSIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKHNlbGYsICduZWFyZXN0JywgeCwgeSkpCisKKyAgICAjIGRlZiBzZWxlY3Rpb24gYWRqdXN0CisgICAgIyBkZWYgc2VsZWN0aW9uIGNsZWFyCisgICAgIyBkZWYgc2VsZWN0aW9uIGluY2x1ZGVzCisgICAgIyBkZWYgc2VsZWN0aW9uIHNldAorICAgICMgZGVmIHNlbGVjdGlvbiB0b2dnbGUKICAgICAjIGRlZiBtb3ZlIGRpbSBmcm9tIHRvIG9mZnNldAotICAgICMgZGVmIHNldCB4IHkgPy1pdGVtdHlwZSB0eXBlPyA/b3B0aW9uIHZhbHVlLi4uPworCisgICAgZGVmIHNldChzZWxmLCB4LCB5LCBpdGVtdHlwZT1Ob25lLCAqKmt3KToKKyAgICAgICAgYXJncz0gc2VsZi5fb3B0aW9ucyhzZWxmLmNuZiwga3cpCisgICAgICAgIGlmIGl0ZW10eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJncz0gKCctaXRlbXR5cGUnLCBpdGVtdHlwZSkgKyBhcmdzCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnc2V0JywgeCwgeSwgKmFyZ3MpCisKICAgICAjIGRlZiBzaXplIGRpbSBpbmRleCA/b3B0aW9uIHZhbHVlIC4uLj8KICAgICAjIGRlZiB1bnNldCB4IHkKLSAgICAjIGRlZiB4dmlldwotICAgICMgZGVmIHl2aWV3CiAKLWNsYXNzIFNjcm9sbGVkR3JpZChUaXhXaWRnZXQpOgorICAgIGRlZiB4dmlldyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGRvdWJsZXMoc2VsZi50ay5jYWxsKHNlbGYsICd4dmlldycpKQorICAgIGRlZiB4dmlld19tb3ZldG8oc2VsZiwgZnJhY3Rpb24pOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwneHZpZXcnLCAnbW92ZXRvJywgZnJhY3Rpb24pCisgICAgZGVmIHh2aWV3X3Njcm9sbChzZWxmLCBjb3VudCwgd2hhdD0idW5pdHMiKToKKyAgICAgICAgIlNjcm9sbCByaWdodCAoY291bnQ+MCkgb3IgbGVmdCA8Y291bnQ+IG9mIHVuaXRzfHBhZ2VzIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ3h2aWV3JywgJ3Njcm9sbCcsIGNvdW50LCB3aGF0KQorCisgICAgZGVmIHl2aWV3KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0ZG91YmxlcyhzZWxmLnRrLmNhbGwoc2VsZiwgJ3l2aWV3JykpCisgICAgZGVmIHl2aWV3X21vdmV0byhzZWxmLCBmcmFjdGlvbik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCd5c3ZpZXcnLCAnbW92ZXRvJywgZnJhY3Rpb24pCisgICAgZGVmIHl2aWV3X3Njcm9sbChzZWxmLCBjb3VudCwgd2hhdD0idW5pdHMiKToKKyAgICAgICAgIlNjcm9sbCBkb3duIChjb3VudD4wKSBvciB1cCA8Y291bnQ+IG9mIHVuaXRzfHBhZ2VzIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ3l2aWV3JywgJ3Njcm9sbCcsIGNvdW50LCB3aGF0KQorCitjbGFzcyBTY3JvbGxlZEdyaWQoR3JpZCk6CiAgICAgJycnU2Nyb2xsZWQgR3JpZCB3aWRnZXRzJycnCiAKICAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTY3JvbGxlZFdpZGdldAotICAgIHBhc3MKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHN0YXRpYz0gW10KKyAgICAgICAgc2VsZi5jbmY9IGNuZgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4U2Nyb2xsZWRHcmlkJywgc3RhdGljLCBjbmYsIGt3KQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay9Ua2ludGVyLnB5IGIvTGliL2xpYi10ay9Ua2ludGVyLnB5CmluZGV4IGQ2MDBjZDcuLjBiYTk1NGUgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvVGtpbnRlci5weQorKysgYi9MaWIvbGliLXRrL1RraW50ZXIucHkKQEAgLTQ0OSwxOCArNDQ5LDE1IEBACiAgICAgICAgICAgICAjIEknZCByYXRoZXIgdXNlIHRpbWUuc2xlZXAobXMqMC4wMDEpCiAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ2FmdGVyJywgbXMpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIFhYWCBEaXNndXN0aW5nIGhhY2sgdG8gY2xlYW4gdXAgYWZ0ZXIgY2FsbGluZyBmdW5jCi0gICAgICAgICAgICB0bXAgPSBbXQotICAgICAgICAgICAgZGVmIGNhbGxpdChmdW5jPWZ1bmMsIGFyZ3M9YXJncywgc2VsZj1zZWxmLCB0bXA9dG1wKToKKyAgICAgICAgICAgIGRlZiBjYWxsaXQoKToKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIGZ1bmMoKmFyZ3MpCiAgICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWxldGVjb21tYW5kKHRtcFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVsZXRlY29tbWFuZChuYW1lKQogICAgICAgICAgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICBuYW1lID0gc2VsZi5fcmVnaXN0ZXIoY2FsbGl0KQotICAgICAgICAgICAgdG1wLmFwcGVuZChuYW1lKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnYWZ0ZXInLCBtcywgbmFtZSkKICAgICBkZWYgYWZ0ZXJfaWRsZShzZWxmLCBmdW5jLCAqYXJncyk6CiAgICAgICAgICIiIkNhbGwgRlVOQyBvbmNlIGlmIHRoZSBUY2wgbWFpbiBsb29wIGhhcyBubyBldmVudCB0bwpAQCAtNDg2LDcgKzQ4MywyNCBAQAogICAgIGRlZiBiZWxsKHNlbGYsIGRpc3BsYXlvZj0wKToKICAgICAgICAgIiIiUmluZyBhIGRpc3BsYXkncyBiZWxsLiIiIgogICAgICAgICBzZWxmLnRrLmNhbGwoKCdiZWxsJywpICsgc2VsZi5fZGlzcGxheW9mKGRpc3BsYXlvZikpCisKICAgICAjIENsaXBib2FyZCBoYW5kbGluZzoKKyAgICBkZWYgY2xpcGJvYXJkX2dldChzZWxmLCAqKmt3KToKKyAgICAgICAgIiIiUmV0cmlldmUgZGF0YSBmcm9tIHRoZSBjbGlwYm9hcmQgb24gd2luZG93J3MgZGlzcGxheS4KKworICAgICAgICBUaGUgd2luZG93IGtleXdvcmQgZGVmYXVsdHMgdG8gdGhlIHJvb3Qgd2luZG93IG9mIHRoZSBUa2ludGVyCisgICAgICAgIGFwcGxpY2F0aW9uLgorCisgICAgICAgIFRoZSB0eXBlIGtleXdvcmQgc3BlY2lmaWVzIHRoZSBmb3JtIGluIHdoaWNoIHRoZSBkYXRhIGlzCisgICAgICAgIHRvIGJlIHJldHVybmVkIGFuZCBzaG91bGQgYmUgYW4gYXRvbSBuYW1lIHN1Y2ggYXMgU1RSSU5HCisgICAgICAgIG9yIEZJTEVfTkFNRS4gIFR5cGUgZGVmYXVsdHMgdG8gU1RSSU5HLgorCisgICAgICAgIFRoaXMgY29tbWFuZCBpcyBlcXVpdmFsZW50IHRvOgorCisgICAgICAgIHNlbGVjdGlvbl9nZXQoQ0xJUEJPQVJEKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgoJ2NsaXBib2FyZCcsICdnZXQnKSArIHNlbGYuX29wdGlvbnMoa3cpKQorCiAgICAgZGVmIGNsaXBib2FyZF9jbGVhcihzZWxmLCAqKmt3KToKICAgICAgICAgIiIiQ2xlYXIgdGhlIGRhdGEgaW4gdGhlIFRrIGNsaXBib2FyZC4KIApkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90a0ZvbnQucHkgYi9MaWIvbGliLXRrL3RrRm9udC5weQppbmRleCA1YjVhNmJhLi4xNWRlYTJlIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3RrRm9udC5weQorKysgYi9MaWIvbGliLXRrL3RrRm9udC5weQpAQCAtMTA4LDcgKzEwOCw5IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIHNlbGYuZGVsZXRlX2ZvbnQ6CiAgICAgICAgICAgICAgICAgc2VsZi5fY2FsbCgiZm9udCIsICJkZWxldGUiLCBzZWxmLm5hbWUpCi0gICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFRraW50ZXIuVGNsRXJyb3IpOgorICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICBwYXNzCiAKICAgICBkZWYgY29weShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9saW5lY2FjaGUucHkgYi9MaWIvbGluZWNhY2hlLnB5CmluZGV4IDJjY2M2YzYuLmY0OTY5NWEgMTAwNjQ0Ci0tLSBhL0xpYi9saW5lY2FjaGUucHkKKysrIGIvTGliL2xpbmVjYWNoZS5weQpAQCAtMTAsOCArMTAsOCBAQAogCiBfX2FsbF9fID0gWyJnZXRsaW5lIiwgImNsZWFyY2FjaGUiLCAiY2hlY2tjYWNoZSJdCiAKLWRlZiBnZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pOgotICAgIGxpbmVzID0gZ2V0bGluZXMoZmlsZW5hbWUpCitkZWYgZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKKyAgICBsaW5lcyA9IGdldGxpbmVzKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscykKICAgICBpZiAxIDw9IGxpbmVubyA8PSBsZW4obGluZXMpOgogICAgICAgICByZXR1cm4gbGluZXNbbGluZW5vLTFdCiAgICAgZWxzZToKQEAgLTMwLDE0ICszMCwxNCBAQAogICAgIGNhY2hlID0ge30KIAogCi1kZWYgZ2V0bGluZXMoZmlsZW5hbWUpOgorZGVmIGdldGxpbmVzKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKICAgICAiIiJHZXQgdGhlIGxpbmVzIGZvciBhIGZpbGUgZnJvbSB0aGUgY2FjaGUuCiAgICAgVXBkYXRlIHRoZSBjYWNoZSBpZiBpdCBkb2Vzbid0IGNvbnRhaW4gYW4gZW50cnkgZm9yIHRoaXMgZmlsZSBhbHJlYWR5LiIiIgogCiAgICAgaWYgZmlsZW5hbWUgaW4gY2FjaGU6CiAgICAgICAgIHJldHVybiBjYWNoZVtmaWxlbmFtZV1bMl0KICAgICBlbHNlOgotICAgICAgICByZXR1cm4gdXBkYXRlY2FjaGUoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiB1cGRhdGVjYWNoZShmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHMpCiAKIAogZGVmIGNoZWNrY2FjaGUoZmlsZW5hbWU9Tm9uZSk6CkBAIC01NCw2ICs1NCw4IEBACiAKICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICBzaXplLCBtdGltZSwgbGluZXMsIGZ1bGxuYW1lID0gY2FjaGVbZmlsZW5hbWVdCisgICAgICAgIGlmIG10aW1lIGlzIE5vbmU6CisgICAgICAgICAgICBjb250aW51ZSAgICMgbm8tb3AgZm9yIGZpbGVzIGxvYWRlZCB2aWEgYSBfX2xvYWRlcl9fCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHN0YXQgPSBvcy5zdGF0KGZ1bGxuYW1lKQogICAgICAgICBleGNlcHQgb3MuZXJyb3I6CkBAIC02Myw3ICs2NSw3IEBACiAgICAgICAgICAgICBkZWwgY2FjaGVbZmlsZW5hbWVdCiAKIAotZGVmIHVwZGF0ZWNhY2hlKGZpbGVuYW1lKToKK2RlZiB1cGRhdGVjYWNoZShmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSk6CiAgICAgIiIiVXBkYXRlIGEgY2FjaGUgZW50cnkgYW5kIHJldHVybiBpdHMgbGlzdCBvZiBsaW5lcy4KICAgICBJZiBzb21ldGhpbmcncyB3cm9uZywgcHJpbnQgYSBtZXNzYWdlLCBkaXNjYXJkIHRoZSBjYWNoZSBlbnRyeSwKICAgICBhbmQgcmV0dXJuIGFuIGVtcHR5IGxpc3QuIiIiCkBAIC03MiwxMiArNzQsMzQgQEAKICAgICAgICAgZGVsIGNhY2hlW2ZpbGVuYW1lXQogICAgIGlmIG5vdCBmaWxlbmFtZSBvciBmaWxlbmFtZVswXSArIGZpbGVuYW1lWy0xXSA9PSAnPD4nOgogICAgICAgICByZXR1cm4gW10KKwogICAgIGZ1bGxuYW1lID0gZmlsZW5hbWUKICAgICB0cnk6CiAgICAgICAgIHN0YXQgPSBvcy5zdGF0KGZ1bGxuYW1lKQogICAgIGV4Y2VwdCBvcy5lcnJvciwgbXNnOgotICAgICAgICAjIFRyeSBsb29raW5nIHRocm91Z2ggdGhlIG1vZHVsZSBzZWFyY2ggcGF0aC4KICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXQorCisgICAgICAgICMgVHJ5IGZvciBhIF9fbG9hZGVyX18sIGlmIGF2YWlsYWJsZQorICAgICAgICBpZiBtb2R1bGVfZ2xvYmFscyBhbmQgJ19fbG9hZGVyX18nIGluIG1vZHVsZV9nbG9iYWxzOgorICAgICAgICAgICAgbmFtZSA9IG1vZHVsZV9nbG9iYWxzLmdldCgnX19uYW1lX18nKQorICAgICAgICAgICAgbG9hZGVyID0gbW9kdWxlX2dsb2JhbHNbJ19fbG9hZGVyX18nXQorICAgICAgICAgICAgZ2V0X3NvdXJjZSA9IGdldGF0dHIobG9hZGVyLCAnZ2V0X3NvdXJjZScsIE5vbmUpCisKKyAgICAgICAgICAgIGlmIG5hbWUgYW5kIGdldF9zb3VyY2U6CisgICAgICAgICAgICAgICAgaWYgYmFzZW5hbWUuc3RhcnRzd2l0aChuYW1lLnNwbGl0KCcuJylbLTFdKycuJyk6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRfc291cmNlKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVbZmlsZW5hbWVdID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihkYXRhKSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGluZSsnXG4nIGZvciBsaW5lIGluIGRhdGEuc3BsaXRsaW5lcygpXSwgZnVsbG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZVtmaWxlbmFtZV1bMl0KKworICAgICAgICAjIFRyeSBsb29raW5nIHRocm91Z2ggdGhlIG1vZHVsZSBzZWFyY2ggcGF0aC4KKwogICAgICAgICBmb3IgZGlybmFtZSBpbiBzeXMucGF0aDoKICAgICAgICAgICAgICMgV2hlbiB1c2luZyBpbXB1dGlsLCBzeXMucGF0aCBtYXkgY29udGFpbiB0aGluZ3Mgb3RoZXIgdGhhbgogICAgICAgICAgICAgIyBzdHJpbmdzOyBpZ25vcmUgdGhlbSB3aGVuIGl0IGhhcHBlbnMuCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9fX2luaXRfXy5weSBiL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CmluZGV4IDdkYjBkYWIuLjk3OTg5MzEgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CisrKyBiL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CkBAIC03MTksNyArNzE5LDcgQEAKICAgICAgICAgSWYgc3RybSBpcyBub3Qgc3BlY2lmaWVkLCBzeXMuc3RkZXJyIGlzIHVzZWQuCiAgICAgICAgICIiIgogICAgICAgICBIYW5kbGVyLl9faW5pdF9fKHNlbGYpCi0gICAgICAgIGlmIG5vdCBzdHJtOgorICAgICAgICBpZiBzdHJtIGlzIE5vbmU6CiAgICAgICAgICAgICBzdHJtID0gc3lzLnN0ZGVycgogICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cm0KICAgICAgICAgc2VsZi5mb3JtYXR0ZXIgPSBOb25lCmRpZmYgLS1naXQgYS9MaWIvbWltZXRvb2xzLnB5IGIvTGliL21pbWV0b29scy5weQppbmRleCAwYjY5OGFjLi44YzFjYzE5IDEwMDY0NAotLS0gYS9MaWIvbWltZXRvb2xzLnB5CisrKyBiL0xpYi9taW1ldG9vbHMucHkKQEAgLTEyNyw3ICsxMjcsMTAgQEAKICAgICBpbXBvcnQgdGltZQogICAgIGlmIF9wcmVmaXggaXMgTm9uZToKICAgICAgICAgaW1wb3J0IHNvY2tldAotICAgICAgICBob3N0aWQgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaG9zdGlkID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICBob3N0aWQgPSAnMTI3LjAuMC4xJwogICAgICAgICB0cnk6CiAgICAgICAgICAgICB1aWQgPSByZXByKG9zLmdldHVpZCgpKQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvbWltZXR5cGVzLnB5IGIvTGliL21pbWV0eXBlcy5weQppbmRleCA3YThiNzY1Li5iZWUyZmY3IDEwMDY0NAotLS0gYS9MaWIvbWltZXR5cGVzLnB5CisrKyBiL0xpYi9taW1ldHlwZXMucHkKQEAgLTMxNSwxNjIgKzMxNSwxNzEgQEAKICAgICByZXR1cm4gZGIudHlwZXNfbWFwW1RydWVdCiAKIAotc3VmZml4X21hcCA9IHsKLSAgICAnLnRneic6ICcudGFyLmd6JywKLSAgICAnLnRheic6ICcudGFyLmd6JywKLSAgICAnLnR6JzogJy50YXIuZ3onLAotICAgIH0KK2RlZiBfZGVmYXVsdF9taW1lX3R5cGVzKCk6CisgICAgZ2xvYmFsIHN1ZmZpeF9tYXAKKyAgICBnbG9iYWwgZW5jb2RpbmdzX21hcAorICAgIGdsb2JhbCB0eXBlc19tYXAKKyAgICBnbG9iYWwgY29tbW9uX3R5cGVzCiAKLWVuY29kaW5nc19tYXAgPSB7Ci0gICAgJy5neic6ICdnemlwJywKLSAgICAnLlonOiAnY29tcHJlc3MnLAotICAgIH0KKyAgICBzdWZmaXhfbWFwID0geworICAgICAgICAnLnRneic6ICcudGFyLmd6JywKKyAgICAgICAgJy50YXonOiAnLnRhci5neicsCisgICAgICAgICcudHonOiAnLnRhci5neicsCisgICAgICAgIH0KIAotIyBCZWZvcmUgYWRkaW5nIG5ldyB0eXBlcywgbWFrZSBzdXJlIHRoZXkgYXJlIGVpdGhlciByZWdpc3RlcmVkIHdpdGggSUFOQSwgYXQKLSMgaHR0cDovL3d3dy5pc2kuZWR1L2luLW5vdGVzL2lhbmEvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMKLSMgb3IgZXh0ZW5zaW9ucywgaS5lLiB1c2luZyB0aGUgeC0gcHJlZml4CisgICAgZW5jb2RpbmdzX21hcCA9IHsKKyAgICAgICAgJy5neic6ICdnemlwJywKKyAgICAgICAgJy5aJzogJ2NvbXByZXNzJywKKyAgICAgICAgfQogCi0jIElmIHlvdSBhZGQgdG8gdGhlc2UsIHBsZWFzZSBrZWVwIHRoZW0gc29ydGVkIQotdHlwZXNfbWFwID0gewotICAgICcuYScgICAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAotICAgICcuYWknICAgICA6ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKLSAgICAnLmFpZicgICAgOiAnYXVkaW8veC1haWZmJywKLSAgICAnLmFpZmMnICAgOiAnYXVkaW8veC1haWZmJywKLSAgICAnLmFpZmYnICAgOiAnYXVkaW8veC1haWZmJywKLSAgICAnLmF1JyAgICAgOiAnYXVkaW8vYmFzaWMnLAotICAgICcuYXZpJyAgICA6ICd2aWRlby94LW1zdmlkZW8nLAotICAgICcuYmF0JyAgICA6ICd0ZXh0L3BsYWluJywKLSAgICAnLmJjcGlvJyAgOiAnYXBwbGljYXRpb24veC1iY3BpbycsCi0gICAgJy5iaW4nICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCi0gICAgJy5ibXAnICAgIDogJ2ltYWdlL3gtbXMtYm1wJywKLSAgICAnLmMnICAgICAgOiAndGV4dC9wbGFpbicsCi0gICAgIyBEdXBsaWNhdGVzIDooCi0gICAgJy5jZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtY2RmJywKLSAgICAnLmNkZicgICAgOiAnYXBwbGljYXRpb24veC1uZXRjZGYnLAotICAgICcuY3BpbycgICA6ICdhcHBsaWNhdGlvbi94LWNwaW8nLAotICAgICcuY3NoJyAgICA6ICdhcHBsaWNhdGlvbi94LWNzaCcsCi0gICAgJy5jc3MnICAgIDogJ3RleHQvY3NzJywKLSAgICAnLmRsbCcgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKLSAgICAnLmRvYycgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKLSAgICAnLmRvdCcgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKLSAgICAnLmR2aScgICAgOiAnYXBwbGljYXRpb24veC1kdmknLAotICAgICcuZW1sJyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCi0gICAgJy5lcHMnICAgIDogJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAotICAgICcuZXR4JyAgICA6ICd0ZXh0L3gtc2V0ZXh0JywKLSAgICAnLmV4ZScgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKLSAgICAnLmdpZicgICAgOiAnaW1hZ2UvZ2lmJywKLSAgICAnLmd0YXInICAgOiAnYXBwbGljYXRpb24veC1ndGFyJywKLSAgICAnLmgnICAgICAgOiAndGV4dC9wbGFpbicsCi0gICAgJy5oZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtaGRmJywKLSAgICAnLmh0bScgICAgOiAndGV4dC9odG1sJywKLSAgICAnLmh0bWwnICAgOiAndGV4dC9odG1sJywKLSAgICAnLmllZicgICAgOiAnaW1hZ2UvaWVmJywKLSAgICAnLmpwZScgICAgOiAnaW1hZ2UvanBlZycsCi0gICAgJy5qcGVnJyAgIDogJ2ltYWdlL2pwZWcnLAotICAgICcuanBnJyAgICA6ICdpbWFnZS9qcGVnJywKLSAgICAnLmpzJyAgICAgOiAnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JywKLSAgICAnLmtzaCcgICAgOiAndGV4dC9wbGFpbicsCi0gICAgJy5sYXRleCcgIDogJ2FwcGxpY2F0aW9uL3gtbGF0ZXgnLAotICAgICcubTF2JyAgICA6ICd2aWRlby9tcGVnJywKLSAgICAnLm1hbicgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tYW4nLAotICAgICcubWUnICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1lJywKLSAgICAnLm1odCcgICAgOiAnbWVzc2FnZS9yZmM4MjInLAotICAgICcubWh0bWwnICA6ICdtZXNzYWdlL3JmYzgyMicsCi0gICAgJy5taWYnICAgIDogJ2FwcGxpY2F0aW9uL3gtbWlmJywKLSAgICAnLm1vdicgICAgOiAndmlkZW8vcXVpY2t0aW1lJywKLSAgICAnLm1vdmllJyAgOiAndmlkZW8veC1zZ2ktbW92aWUnLAotICAgICcubXAyJyAgICA6ICdhdWRpby9tcGVnJywKLSAgICAnLm1wMycgICAgOiAnYXVkaW8vbXBlZycsCi0gICAgJy5tcGEnICAgIDogJ3ZpZGVvL21wZWcnLAotICAgICcubXBlJyAgICA6ICd2aWRlby9tcGVnJywKLSAgICAnLm1wZWcnICAgOiAndmlkZW8vbXBlZycsCi0gICAgJy5tcGcnICAgIDogJ3ZpZGVvL21wZWcnLAotICAgICcubXMnICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1zJywKLSAgICAnLm5jJyAgICAgOiAnYXBwbGljYXRpb24veC1uZXRjZGYnLAotICAgICcubndzJyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCi0gICAgJy5vJyAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCi0gICAgJy5vYmonICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCi0gICAgJy5vZGEnICAgIDogJ2FwcGxpY2F0aW9uL29kYScsCi0gICAgJy5wMTInICAgIDogJ2FwcGxpY2F0aW9uL3gtcGtjczEyJywKLSAgICAnLnA3YycgICAgOiAnYXBwbGljYXRpb24vcGtjczctbWltZScsCi0gICAgJy5wYm0nICAgIDogJ2ltYWdlL3gtcG9ydGFibGUtYml0bWFwJywKLSAgICAnLnBkZicgICAgOiAnYXBwbGljYXRpb24vcGRmJywKLSAgICAnLnBmeCcgICAgOiAnYXBwbGljYXRpb24veC1wa2NzMTInLAotICAgICcucGdtJyAgICA6ICdpbWFnZS94LXBvcnRhYmxlLWdyYXltYXAnLAotICAgICcucGwnICAgICA6ICd0ZXh0L3BsYWluJywKLSAgICAnLnBuZycgICAgOiAnaW1hZ2UvcG5nJywKLSAgICAnLnBubScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAnLAotICAgICcucG90JyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCi0gICAgJy5wcGEnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKLSAgICAnLnBwbScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAnLAotICAgICcucHBzJyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCi0gICAgJy5wcHQnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKLSAgICAnLnBzJyAgICAgOiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCi0gICAgJy5wd3onICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKLSAgICAnLnB5JyAgICAgOiAndGV4dC94LXB5dGhvbicsCi0gICAgJy5weWMnICAgIDogJ2FwcGxpY2F0aW9uL3gtcHl0aG9uLWNvZGUnLAotICAgICcucHlvJyAgICA6ICdhcHBsaWNhdGlvbi94LXB5dGhvbi1jb2RlJywKLSAgICAnLnF0JyAgICAgOiAndmlkZW8vcXVpY2t0aW1lJywKLSAgICAnLnJhJyAgICAgOiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAotICAgICcucmFtJyAgICA6ICdhcHBsaWNhdGlvbi94LXBuLXJlYWxhdWRpbycsCi0gICAgJy5yYXMnICAgIDogJ2ltYWdlL3gtY211LXJhc3RlcicsCi0gICAgJy5yZGYnICAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCi0gICAgJy5yZ2InICAgIDogJ2ltYWdlL3gtcmdiJywKLSAgICAnLnJvZmYnICAgOiAnYXBwbGljYXRpb24veC10cm9mZicsCi0gICAgJy5ydHgnICAgIDogJ3RleHQvcmljaHRleHQnLAotICAgICcuc2dtJyAgICA6ICd0ZXh0L3gtc2dtbCcsCi0gICAgJy5zZ21sJyAgIDogJ3RleHQveC1zZ21sJywKLSAgICAnLnNoJyAgICAgOiAnYXBwbGljYXRpb24veC1zaCcsCi0gICAgJy5zaGFyJyAgIDogJ2FwcGxpY2F0aW9uL3gtc2hhcicsCi0gICAgJy5zbmQnICAgIDogJ2F1ZGlvL2Jhc2ljJywKLSAgICAnLnNvJyAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKLSAgICAnLnNyYycgICAgOiAnYXBwbGljYXRpb24veC13YWlzLXNvdXJjZScsCi0gICAgJy5zdjRjcGlvJzogJ2FwcGxpY2F0aW9uL3gtc3Y0Y3BpbycsCi0gICAgJy5zdjRjcmMnIDogJ2FwcGxpY2F0aW9uL3gtc3Y0Y3JjJywKLSAgICAnLnN3ZicgICAgOiAnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnLAotICAgICcudCcgICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmJywKLSAgICAnLnRhcicgICAgOiAnYXBwbGljYXRpb24veC10YXInLAotICAgICcudGNsJyAgICA6ICdhcHBsaWNhdGlvbi94LXRjbCcsCi0gICAgJy50ZXgnICAgIDogJ2FwcGxpY2F0aW9uL3gtdGV4JywKLSAgICAnLnRleGknICAgOiAnYXBwbGljYXRpb24veC10ZXhpbmZvJywKLSAgICAnLnRleGluZm8nOiAnYXBwbGljYXRpb24veC10ZXhpbmZvJywKLSAgICAnLnRpZicgICAgOiAnaW1hZ2UvdGlmZicsCi0gICAgJy50aWZmJyAgIDogJ2ltYWdlL3RpZmYnLAotICAgICcudHInICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmJywKLSAgICAnLnRzdicgICAgOiAndGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcycsCi0gICAgJy50eHQnICAgIDogJ3RleHQvcGxhaW4nLAotICAgICcudXN0YXInICA6ICdhcHBsaWNhdGlvbi94LXVzdGFyJywKLSAgICAnLnZjZicgICAgOiAndGV4dC94LXZjYXJkJywKLSAgICAnLndhdicgICAgOiAnYXVkaW8veC13YXYnLAotICAgICcud2l6JyAgICA6ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAotICAgICcud3NkbCcgICA6ICdhcHBsaWNhdGlvbi94bWwnLAotICAgICcueGJtJyAgICA6ICdpbWFnZS94LXhiaXRtYXAnLAotICAgICcueGxiJyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLAotICAgICMgRHVwbGljYXRlcyA6KAotICAgICcueGxzJyAgICA6ICdhcHBsaWNhdGlvbi9leGNlbCcsCi0gICAgJy54bHMnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsCi0gICAgJy54bWwnICAgIDogJ3RleHQveG1sJywKLSAgICAnLnhwZGwnICAgOiAnYXBwbGljYXRpb24veG1sJywKLSAgICAnLnhwbScgICAgOiAnaW1hZ2UveC14cGl4bWFwJywKLSAgICAnLnhzbCcgICAgOiAnYXBwbGljYXRpb24veG1sJywKLSAgICAnLnh3ZCcgICAgOiAnaW1hZ2UveC14d2luZG93ZHVtcCcsCi0gICAgJy56aXAnICAgIDogJ2FwcGxpY2F0aW9uL3ppcCcsCi0gICAgfQorICAgICMgQmVmb3JlIGFkZGluZyBuZXcgdHlwZXMsIG1ha2Ugc3VyZSB0aGV5IGFyZSBlaXRoZXIgcmVnaXN0ZXJlZCB3aXRoIElBTkEsCisgICAgIyBhdCBodHRwOi8vd3d3LmlzaS5lZHUvaW4tbm90ZXMvaWFuYS9hc3NpZ25tZW50cy9tZWRpYS10eXBlcworICAgICMgb3IgZXh0ZW5zaW9ucywgaS5lLiB1c2luZyB0aGUgeC0gcHJlZml4CiAKLSMgVGhlc2UgYXJlIG5vbi1zdGFuZGFyZCB0eXBlcywgY29tbW9ubHkgZm91bmQgaW4gdGhlIHdpbGQuICBUaGV5IHdpbGwgb25seQotIyBtYXRjaCBpZiBzdHJpY3Q9MCBmbGFnIGlzIGdpdmVuIHRvIHRoZSBBUEkgbWV0aG9kcy4KKyAgICAjIElmIHlvdSBhZGQgdG8gdGhlc2UsIHBsZWFzZSBrZWVwIHRoZW0gc29ydGVkIQorICAgIHR5cGVzX21hcCA9IHsKKyAgICAgICAgJy5hJyAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCisgICAgICAgICcuYWknICAgICA6ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKKyAgICAgICAgJy5haWYnICAgIDogJ2F1ZGlvL3gtYWlmZicsCisgICAgICAgICcuYWlmYycgICA6ICdhdWRpby94LWFpZmYnLAorICAgICAgICAnLmFpZmYnICAgOiAnYXVkaW8veC1haWZmJywKKyAgICAgICAgJy5hdScgICAgIDogJ2F1ZGlvL2Jhc2ljJywKKyAgICAgICAgJy5hdmknICAgIDogJ3ZpZGVvL3gtbXN2aWRlbycsCisgICAgICAgICcuYmF0JyAgICA6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgJy5iY3BpbycgIDogJ2FwcGxpY2F0aW9uL3gtYmNwaW8nLAorICAgICAgICAnLmJpbicgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5ibXAnICAgIDogJ2ltYWdlL3gtbXMtYm1wJywKKyAgICAgICAgJy5jJyAgICAgIDogJ3RleHQvcGxhaW4nLAorICAgICAgICAjIER1cGxpY2F0ZXMgOigKKyAgICAgICAgJy5jZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtY2RmJywKKyAgICAgICAgJy5jZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtbmV0Y2RmJywKKyAgICAgICAgJy5jcGlvJyAgIDogJ2FwcGxpY2F0aW9uL3gtY3BpbycsCisgICAgICAgICcuY3NoJyAgICA6ICdhcHBsaWNhdGlvbi94LWNzaCcsCisgICAgICAgICcuY3NzJyAgICA6ICd0ZXh0L2NzcycsCisgICAgICAgICcuZGxsJyAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLmRvYycgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKKyAgICAgICAgJy5kb3QnICAgIDogJ2FwcGxpY2F0aW9uL21zd29yZCcsCisgICAgICAgICcuZHZpJyAgICA6ICdhcHBsaWNhdGlvbi94LWR2aScsCisgICAgICAgICcuZW1sJyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcuZXBzJyAgICA6ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKKyAgICAgICAgJy5ldHgnICAgIDogJ3RleHQveC1zZXRleHQnLAorICAgICAgICAnLmV4ZScgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5naWYnICAgIDogJ2ltYWdlL2dpZicsCisgICAgICAgICcuZ3RhcicgICA6ICdhcHBsaWNhdGlvbi94LWd0YXInLAorICAgICAgICAnLmgnICAgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcuaGRmJyAgICA6ICdhcHBsaWNhdGlvbi94LWhkZicsCisgICAgICAgICcuaHRtJyAgICA6ICd0ZXh0L2h0bWwnLAorICAgICAgICAnLmh0bWwnICAgOiAndGV4dC9odG1sJywKKyAgICAgICAgJy5pZWYnICAgIDogJ2ltYWdlL2llZicsCisgICAgICAgICcuanBlJyAgICA6ICdpbWFnZS9qcGVnJywKKyAgICAgICAgJy5qcGVnJyAgIDogJ2ltYWdlL2pwZWcnLAorICAgICAgICAnLmpwZycgICAgOiAnaW1hZ2UvanBlZycsCisgICAgICAgICcuanMnICAgICA6ICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnLAorICAgICAgICAnLmtzaCcgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcubGF0ZXgnICA6ICdhcHBsaWNhdGlvbi94LWxhdGV4JywKKyAgICAgICAgJy5tMXYnICAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1hbicgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tYW4nLAorICAgICAgICAnLm1lJyAgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tZScsCisgICAgICAgICcubWh0JyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcubWh0bWwnICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcubWlmJyAgICA6ICdhcHBsaWNhdGlvbi94LW1pZicsCisgICAgICAgICcubW92JyAgICA6ICd2aWRlby9xdWlja3RpbWUnLAorICAgICAgICAnLm1vdmllJyAgOiAndmlkZW8veC1zZ2ktbW92aWUnLAorICAgICAgICAnLm1wMicgICAgOiAnYXVkaW8vbXBlZycsCisgICAgICAgICcubXAzJyAgICA6ICdhdWRpby9tcGVnJywKKyAgICAgICAgJy5tcGEnICAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1wZScgICAgOiAndmlkZW8vbXBlZycsCisgICAgICAgICcubXBlZycgICA6ICd2aWRlby9tcGVnJywKKyAgICAgICAgJy5tcGcnICAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1zJyAgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tcycsCisgICAgICAgICcubmMnICAgICA6ICdhcHBsaWNhdGlvbi94LW5ldGNkZicsCisgICAgICAgICcubndzJyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcubycgICAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLm9iaicgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5vZGEnICAgIDogJ2FwcGxpY2F0aW9uL29kYScsCisgICAgICAgICcucDEyJyAgICA6ICdhcHBsaWNhdGlvbi94LXBrY3MxMicsCisgICAgICAgICcucDdjJyAgICA6ICdhcHBsaWNhdGlvbi9wa2NzNy1taW1lJywKKyAgICAgICAgJy5wYm0nICAgIDogJ2ltYWdlL3gtcG9ydGFibGUtYml0bWFwJywKKyAgICAgICAgJy5wZGYnICAgIDogJ2FwcGxpY2F0aW9uL3BkZicsCisgICAgICAgICcucGZ4JyAgICA6ICdhcHBsaWNhdGlvbi94LXBrY3MxMicsCisgICAgICAgICcucGdtJyAgICA6ICdpbWFnZS94LXBvcnRhYmxlLWdyYXltYXAnLAorICAgICAgICAnLnBsJyAgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcucG5nJyAgICA6ICdpbWFnZS9wbmcnLAorICAgICAgICAnLnBubScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAnLAorICAgICAgICAnLnBvdCcgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBwYScgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBwbScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAnLAorICAgICAgICAnLnBwcycgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBwdCcgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBzJyAgICAgOiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCisgICAgICAgICcucHd6JyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCisgICAgICAgICcucHknICAgICA6ICd0ZXh0L3gtcHl0aG9uJywKKyAgICAgICAgJy5weWMnICAgIDogJ2FwcGxpY2F0aW9uL3gtcHl0aG9uLWNvZGUnLAorICAgICAgICAnLnB5bycgICAgOiAnYXBwbGljYXRpb24veC1weXRob24tY29kZScsCisgICAgICAgICcucXQnICAgICA6ICd2aWRlby9xdWlja3RpbWUnLAorICAgICAgICAnLnJhJyAgICAgOiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAorICAgICAgICAnLnJhbScgICAgOiAnYXBwbGljYXRpb24veC1wbi1yZWFsYXVkaW8nLAorICAgICAgICAnLnJhcycgICAgOiAnaW1hZ2UveC1jbXUtcmFzdGVyJywKKyAgICAgICAgJy5yZGYnICAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCisgICAgICAgICcucmdiJyAgICA6ICdpbWFnZS94LXJnYicsCisgICAgICAgICcucm9mZicgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmJywKKyAgICAgICAgJy5ydHgnICAgIDogJ3RleHQvcmljaHRleHQnLAorICAgICAgICAnLnNnbScgICAgOiAndGV4dC94LXNnbWwnLAorICAgICAgICAnLnNnbWwnICAgOiAndGV4dC94LXNnbWwnLAorICAgICAgICAnLnNoJyAgICAgOiAnYXBwbGljYXRpb24veC1zaCcsCisgICAgICAgICcuc2hhcicgICA6ICdhcHBsaWNhdGlvbi94LXNoYXInLAorICAgICAgICAnLnNuZCcgICAgOiAnYXVkaW8vYmFzaWMnLAorICAgICAgICAnLnNvJyAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5zcmMnICAgIDogJ2FwcGxpY2F0aW9uL3gtd2Fpcy1zb3VyY2UnLAorICAgICAgICAnLnN2NGNwaW8nOiAnYXBwbGljYXRpb24veC1zdjRjcGlvJywKKyAgICAgICAgJy5zdjRjcmMnIDogJ2FwcGxpY2F0aW9uL3gtc3Y0Y3JjJywKKyAgICAgICAgJy5zd2YnICAgIDogJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywKKyAgICAgICAgJy50JyAgICAgIDogJ2FwcGxpY2F0aW9uL3gtdHJvZmYnLAorICAgICAgICAnLnRhcicgICAgOiAnYXBwbGljYXRpb24veC10YXInLAorICAgICAgICAnLnRjbCcgICAgOiAnYXBwbGljYXRpb24veC10Y2wnLAorICAgICAgICAnLnRleCcgICAgOiAnYXBwbGljYXRpb24veC10ZXgnLAorICAgICAgICAnLnRleGknICAgOiAnYXBwbGljYXRpb24veC10ZXhpbmZvJywKKyAgICAgICAgJy50ZXhpbmZvJzogJ2FwcGxpY2F0aW9uL3gtdGV4aW5mbycsCisgICAgICAgICcudGlmJyAgICA6ICdpbWFnZS90aWZmJywKKyAgICAgICAgJy50aWZmJyAgIDogJ2ltYWdlL3RpZmYnLAorICAgICAgICAnLnRyJyAgICAgOiAnYXBwbGljYXRpb24veC10cm9mZicsCisgICAgICAgICcudHN2JyAgICA6ICd0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzJywKKyAgICAgICAgJy50eHQnICAgIDogJ3RleHQvcGxhaW4nLAorICAgICAgICAnLnVzdGFyJyAgOiAnYXBwbGljYXRpb24veC11c3RhcicsCisgICAgICAgICcudmNmJyAgICA6ICd0ZXh0L3gtdmNhcmQnLAorICAgICAgICAnLndhdicgICAgOiAnYXVkaW8veC13YXYnLAorICAgICAgICAnLndpeicgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKKyAgICAgICAgJy53c2RsJyAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCisgICAgICAgICcueGJtJyAgICA6ICdpbWFnZS94LXhiaXRtYXAnLAorICAgICAgICAnLnhsYicgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKKyAgICAgICAgIyBEdXBsaWNhdGVzIDooCisgICAgICAgICcueGxzJyAgICA6ICdhcHBsaWNhdGlvbi9leGNlbCcsCisgICAgICAgICcueGxzJyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLAorICAgICAgICAnLnhtbCcgICAgOiAndGV4dC94bWwnLAorICAgICAgICAnLnhwZGwnICAgOiAnYXBwbGljYXRpb24veG1sJywKKyAgICAgICAgJy54cG0nICAgIDogJ2ltYWdlL3gteHBpeG1hcCcsCisgICAgICAgICcueHNsJyAgICA6ICdhcHBsaWNhdGlvbi94bWwnLAorICAgICAgICAnLnh3ZCcgICAgOiAnaW1hZ2UveC14d2luZG93ZHVtcCcsCisgICAgICAgICcuemlwJyAgICA6ICdhcHBsaWNhdGlvbi96aXAnLAorICAgICAgICB9CiAKLSMgUGxlYXNlIHNvcnQgdGhlc2UgdG9vCi1jb21tb25fdHlwZXMgPSB7Ci0gICAgJy5qcGcnIDogJ2ltYWdlL2pwZycsCi0gICAgJy5taWQnIDogJ2F1ZGlvL21pZGknLAotICAgICcubWlkaSc6ICdhdWRpby9taWRpJywKLSAgICAnLnBjdCcgOiAnaW1hZ2UvcGljdCcsCi0gICAgJy5waWMnIDogJ2ltYWdlL3BpY3QnLAotICAgICcucGljdCc6ICdpbWFnZS9waWN0JywKLSAgICAnLnJ0ZicgOiAnYXBwbGljYXRpb24vcnRmJywKLSAgICAnLnh1bCcgOiAndGV4dC94dWwnCi0gICAgfQorICAgICMgVGhlc2UgYXJlIG5vbi1zdGFuZGFyZCB0eXBlcywgY29tbW9ubHkgZm91bmQgaW4gdGhlIHdpbGQuICBUaGV5IHdpbGwKKyAgICAjIG9ubHkgbWF0Y2ggaWYgc3RyaWN0PTAgZmxhZyBpcyBnaXZlbiB0byB0aGUgQVBJIG1ldGhvZHMuCisKKyAgICAjIFBsZWFzZSBzb3J0IHRoZXNlIHRvbworICAgIGNvbW1vbl90eXBlcyA9IHsKKyAgICAgICAgJy5qcGcnIDogJ2ltYWdlL2pwZycsCisgICAgICAgICcubWlkJyA6ICdhdWRpby9taWRpJywKKyAgICAgICAgJy5taWRpJzogJ2F1ZGlvL21pZGknLAorICAgICAgICAnLnBjdCcgOiAnaW1hZ2UvcGljdCcsCisgICAgICAgICcucGljJyA6ICdpbWFnZS9waWN0JywKKyAgICAgICAgJy5waWN0JzogJ2ltYWdlL3BpY3QnLAorICAgICAgICAnLnJ0ZicgOiAnYXBwbGljYXRpb24vcnRmJywKKyAgICAgICAgJy54dWwnIDogJ3RleHQveHVsJworICAgICAgICB9CisKKworX2RlZmF1bHRfbWltZV90eXBlcygpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL0xpYi9wZGIucHkgYi9MaWIvcGRiLnB5CmluZGV4IDFhYTJlYWUuLjViN2VhOTkgMTAwNzU1Ci0tLSBhL0xpYi9wZGIucHkKKysrIGIvTGliL3BkYi5weQpAQCAtOTEsNiArOTEsMTIgQEAKICAgICAgICAgICAgICAgICBzZWxmLnJjTGluZXMuYXBwZW5kKGxpbmUpCiAgICAgICAgICAgICByY0ZpbGUuY2xvc2UoKQogCisgICAgICAgIHNlbGYuY29tbWFuZHMgPSB7fSAjIGFzc29jaWF0ZXMgYSBjb21tYW5kIGxpc3QgdG8gYnJlYWtwb2ludCBudW1iZXJzCisgICAgICAgIHNlbGYuY29tbWFuZHNfZG9wcm9tcHQgPSB7fSAjIGZvciBlYWNoIGJwIG51bSwgdGVsbHMgaWYgdGhlIHByb21wdCBtdXN0IGJlIGRpc3AuIGFmdGVyIGV4ZWNpbmcgdGhlIGNtZCBsaXN0CisgICAgICAgIHNlbGYuY29tbWFuZHNfc2lsZW50ID0ge30gIyBmb3IgZWFjaCBicCBudW0sIHRlbGxzIGlmIHRoZSBzdGFjayB0cmFjZSBtdXN0IGJlIGRpc3AuIGFmdGVyIGV4ZWNpbmcgdGhlIGNtZCBsaXN0CisgICAgICAgIHNlbGYuY29tbWFuZHNfZGVmaW5pbmcgPSBGYWxzZSAjIFRydWUgd2hpbGUgaW4gdGhlIHByb2Nlc3Mgb2YgZGVmaW5pbmcgYSBjb21tYW5kIGxpc3QKKyAgICAgICAgc2VsZi5jb21tYW5kc19ibnVtID0gTm9uZSAjIFRoZSBicmVha3BvaW50IG51bWJlciBmb3Igd2hpY2ggd2UgYXJlIGRlZmluaW5nIGEgbGlzdAorCiAgICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgICBiZGIuQmRiLnJlc2V0KHNlbGYpCiAgICAgICAgIHNlbGYuZm9yZ2V0KCkKQEAgLTEzNyw3ICsxNDMsMjggQEAKICAgICAgICAgICAgICAgICBvciBmcmFtZS5mX2xpbmVubzw9IDApOgogICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgc2VsZi5fd2FpdF9mb3JfbWFpbnB5ZmlsZSA9IDAKLSAgICAgICAgc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSkKKyAgICAgICAgaWYgc2VsZi5icF9jb21tYW5kcyhmcmFtZSk6CisgICAgICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lKQorCisgICAgZGVmIGJwX2NvbW1hbmRzKHNlbGYsZnJhbWUpOgorICAgICAgICAiIiIgQ2FsbCBldmVyeSBjb21tYW5kIHRoYXQgd2FzIHNldCBmb3IgdGhlIGN1cnJlbnQgYWN0aXZlIGJyZWFrcG9pbnQgKGlmIHRoZXJlIGlzIG9uZSkKKyAgICAgICAgUmV0dXJucyBUcnVlIGlmIHRoZSBub3JtYWwgaW50ZXJhY3Rpb24gZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQsIEZhbHNlIG90aGVyd2lzZSAiIiIKKyAgICAgICAgI3NlbGYuY3VycmVudGJwIGlzIHNldCBpbiBiZGIucHkgaW4gYmRiLmJyZWFrX2hlcmUgaWYgYSBicmVha3BvaW50IHdhcyBoaXQKKyAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCJjdXJyZW50YnAiLEZhbHNlKSBhbmQgc2VsZi5jdXJyZW50YnAgaW4gc2VsZi5jb21tYW5kczoKKyAgICAgICAgICAgIGN1cnJlbnRicCA9IHNlbGYuY3VycmVudGJwCisgICAgICAgICAgICBzZWxmLmN1cnJlbnRicCA9IDAKKyAgICAgICAgICAgIGxhc3RjbWRfYmFjayA9IHNlbGYubGFzdGNtZAorICAgICAgICAgICAgc2VsZi5zZXR1cChmcmFtZSwgTm9uZSkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuY29tbWFuZHNbY3VycmVudGJwXToKKyAgICAgICAgICAgICAgICBzZWxmLm9uZWNtZChsaW5lKQorICAgICAgICAgICAgc2VsZi5sYXN0Y21kID0gbGFzdGNtZF9iYWNrCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jb21tYW5kc19zaWxlbnRbY3VycmVudGJwXToKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50X3N0YWNrX2VudHJ5KHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF0pCisgICAgICAgICAgICBpZiBzZWxmLmNvbW1hbmRzX2RvcHJvbXB0W2N1cnJlbnRicF06CisgICAgICAgICAgICAgICAgc2VsZi5jbWRsb29wKCkKKyAgICAgICAgICAgIHNlbGYuZm9yZ2V0KCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZXR1cm4gMQogCiAgICAgZGVmIHVzZXJfcmV0dXJuKHNlbGYsIGZyYW1lLCByZXR1cm5fdmFsdWUpOgogICAgICAgICAiIiJUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcmV0dXJuIHRyYXAgaXMgc2V0IGhlcmUuIiIiCkBAIC0yMDIsMTIgKzIyOSw3MCBAQAogICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzptYXJrZXJdLnJzdHJpcCgpCiAgICAgICAgIHJldHVybiBsaW5lCiAKKyAgICBkZWYgb25lY21kKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJJbnRlcnByZXQgdGhlIGFyZ3VtZW50IGFzIHRob3VnaCBpdCBoYWQgYmVlbiB0eXBlZCBpbiByZXNwb25zZQorICAgICAgICB0byB0aGUgcHJvbXB0LgorCisgICAgICAgIENoZWNrcyB3ZXRoZXIgIHRoaXMgbGluZSBpcyB0eXBlZCBpbiB0aGUgbm9ybWFsIHByb21wdCBvciBpbiBhIGJyZWFrcG9pbnQgY29tbWFuZCBsaXN0IGRlZmluaXRpb24KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmNvbW1hbmRzX2RlZmluaW5nOgorICAgICAgICAgICAgcmV0dXJuIGNtZC5DbWQub25lY21kKHNlbGYsIGxpbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGVfY29tbWFuZF9kZWYobGluZSkKKworICAgIGRlZiBoYW5kbGVfY29tbWFuZF9kZWYoc2VsZixsaW5lKToKKyAgICAgICAgIiIiIEhhbmRsZXMgb25lIGNvbW1hbmQgbGluZSBkdXJpbmcgY29tbWFuZCBsaXN0IGRlZmluaXRpb24uICIiIgorICAgICAgICBjbWQsIGFyZywgbGluZSA9IHNlbGYucGFyc2VsaW5lKGxpbmUpCisgICAgICAgIGlmIGNtZCA9PSAnc2lsZW50JzoKKyAgICAgICAgICAgIHNlbGYuY29tbWFuZHNfc2lsZW50W3NlbGYuY29tbWFuZHNfYm51bV0gPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gIyBjb250aW51ZSB0byBoYW5kbGUgb3RoZXIgY21kIGRlZiBpbiB0aGUgY21kIGxpc3QKKyAgICAgICAgZWxpZiBjbWQgPT0gJ2VuZCc6CisgICAgICAgICAgICBzZWxmLmNtZHF1ZXVlID0gW10KKyAgICAgICAgICAgIHJldHVybiAxICMgZW5kIG9mIGNtZCBsaXN0CisgICAgICAgIGNtZGxpc3QgPSBzZWxmLmNvbW1hbmRzW3NlbGYuY29tbWFuZHNfYm51bV0KKyAgICAgICAgaWYgKGFyZyk6CisgICAgICAgICAgICBjbWRsaXN0LmFwcGVuZChjbWQrJyAnK2FyZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZGxpc3QuYXBwZW5kKGNtZCkKKyAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UgbXVzdCBzdG9wCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKHNlbGYsICdkb18nICsgY21kKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBmdW5jID0gc2VsZi5kZWZhdWx0CisgICAgICAgIGlmIGZ1bmMuZnVuY19uYW1lIGluIHNlbGYuY29tbWFuZHNfcmVzdW1pbmcgOiAjIG9uZSBvZiB0aGUgcmVzdW1pbmcgY29tbWFuZHMuCisgICAgICAgICAgICBzZWxmLmNvbW1hbmRzX2RvcHJvbXB0W3NlbGYuY29tbWFuZHNfYm51bV0gPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jbWRxdWV1ZSA9IFtdCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXR1cm4KKwogICAgICMgQ29tbWFuZCBkZWZpbml0aW9ucywgY2FsbGVkIGJ5IGNtZGxvb3AoKQogICAgICMgVGhlIGFyZ3VtZW50IGlzIHRoZSByZW1haW5pbmcgc3RyaW5nIG9uIHRoZSBjb21tYW5kIGxpbmUKICAgICAjIFJldHVybiB0cnVlIHRvIGV4aXQgZnJvbSB0aGUgY29tbWFuZCBsb29wCiAKICAgICBkb19oID0gY21kLkNtZC5kb19oZWxwCiAKKyAgICBkZWYgZG9fY29tbWFuZHMoc2VsZiwgYXJnKToKKyAgICAgICAgIiIiRGVmaW5lcyBhIGxpc3Qgb2YgY29tbWFuZHMgYXNzb2NpYXRlZCB0byBhIGJyZWFrcG9pbnQKKyAgICAgICAgVGhvc2UgY29tbWFuZHMgd2lsbCBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUgYnJlYWtwb2ludCBjYXVzZXMgdGhlIHByb2dyYW0gdG8gc3RvcCBleGVjdXRpb24uIiIiCisgICAgICAgIGlmIG5vdCBhcmc6CisgICAgICAgICAgICBibnVtID0gbGVuKGJkYi5CcmVha3BvaW50LmJwYnludW1iZXIpLTEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBibnVtID0gaW50KGFyZykKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwcmludCAiVXNhZ2UgOiBjb21tYW5kcyBbYm51bV1cbiAgICAgICAgLi4uXG4gICAgICAgIGVuZCIKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jb21tYW5kc19ibnVtID0gYm51bQorICAgICAgICBzZWxmLmNvbW1hbmRzW2JudW1dID0gW10KKyAgICAgICAgc2VsZi5jb21tYW5kc19kb3Byb21wdFtibnVtXSA9IFRydWUKKyAgICAgICAgc2VsZi5jb21tYW5kc19zaWxlbnRbYm51bV0gPSBGYWxzZQorICAgICAgICBwcm9tcHRfYmFjayA9IHNlbGYucHJvbXB0CisgICAgICAgIHNlbGYucHJvbXB0ID0gJyhjb20pICcKKyAgICAgICAgc2VsZi5jb21tYW5kc19kZWZpbmluZyA9IFRydWUKKyAgICAgICAgc2VsZi5jbWRsb29wKCkKKyAgICAgICAgc2VsZi5jb21tYW5kc19kZWZpbmluZyA9IEZhbHNlCisgICAgICAgIHNlbGYucHJvbXB0ID0gcHJvbXB0X2JhY2sKKwogICAgIGRlZiBkb19icmVhayhzZWxmLCBhcmcsIHRlbXBvcmFyeSA9IDApOgogICAgICAgICAjIGJyZWFrIFsgKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssICJjb25kaXRpb24iXSBdCiAgICAgICAgIGlmIG5vdCBhcmc6CkBAIC02OTEsNiArNzc2LDkgQEAKICAgICAgICAgaWYgYXJnc1swXSBpbiBzZWxmLmFsaWFzZXM6CiAgICAgICAgICAgICBkZWwgc2VsZi5hbGlhc2VzW2FyZ3NbMF1dCiAKKyAgICAjbGlzdCBvZiBhbGwgdGhlIGNvbW1hbmRzIG1ha2luZyB0aGUgcHJvZ3JhbSByZXN1bWUgZXhlY3V0aW9uLgorICAgIGNvbW1hbmRzX3Jlc3VtaW5nID0gWydkb19jb250aW51ZScsICdkb19zdGVwJywgJ2RvX25leHQnLCAnZG9fcmV0dXJuJywgJ2RvX3F1aXQnLCAnZG9fanVtcCddCisKICAgICAjIFByaW50IGEgdHJhY2ViYWNrIHN0YXJ0aW5nIGF0IHRoZSB0b3Agc3RhY2sgZnJhbWUuCiAgICAgIyBUaGUgbW9zdCByZWNlbnRseSBlbnRlcmVkIGZyYW1lIGlzIHByaW50ZWQgbGFzdDsKICAgICAjIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gZGJ4IGFuZCBnZGIsIGJ1dCBjb25zaXN0ZW50IHdpdGgKQEAgLTk0NCw2ICsxMDMyLDQxIEBACiAgICAgICAgIHByaW50ICIiInVuYWxpYXMgbmFtZQogRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGFsaWFzLiIiIgogCisgICAgZGVmIGhlbHBfY29tbWFuZHMoc2VsZik6CisgICAgICAgIHByaW50ICIiImNvbW1hbmRzIFticG51bWJlcl0KKyhjb20pIC4uLgorKGNvbSkgZW5kCisoUGRiKQorCitTcGVjaWZ5IGEgbGlzdCBvZiBjb21tYW5kcyBmb3IgYnJlYWtwb2ludCBudW1iZXIgYnBudW1iZXIuICBUaGUKK2NvbW1hbmRzIHRoZW1zZWx2ZXMgYXBwZWFyIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMuICBUeXBlIGEgbGluZQorY29udGFpbmluZyBqdXN0ICdlbmQnIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWFuZHMuCisKK1RvIHJlbW92ZSBhbGwgY29tbWFuZHMgZnJvbSBhIGJyZWFrcG9pbnQsIHR5cGUgY29tbWFuZHMgYW5kCitmb2xsb3cgaXQgaW1tZWRpYXRlbHkgd2l0aCAgZW5kOyB0aGF0IGlzLCBnaXZlIG5vIGNvbW1hbmRzLgorCitXaXRoIG5vIGJwbnVtYmVyIGFyZ3VtZW50LCBjb21tYW5kcyByZWZlcnMgdG8gdGhlIGxhc3QKK2JyZWFrcG9pbnQgc2V0LgorCitZb3UgY2FuIHVzZSBicmVha3BvaW50IGNvbW1hbmRzIHRvIHN0YXJ0IHlvdXIgcHJvZ3JhbSB1cCBhZ2Fpbi4KK1NpbXBseSB1c2UgdGhlIGNvbnRpbnVlIGNvbW1hbmQsIG9yIHN0ZXAsIG9yIGFueSBvdGhlcgorY29tbWFuZCB0aGF0IHJlc3VtZXMgZXhlY3V0aW9uLgorCitTcGVjaWZ5aW5nIGFueSBjb21tYW5kIHJlc3VtaW5nIGV4ZWN1dGlvbiAoY3VycmVudGx5IGNvbnRpbnVlLAorc3RlcCwgbmV4dCwgcmV0dXJuLCBqdW1wLCBxdWl0IGFuZCB0aGVpciBhYmJyZXZpYXRpb25zKSB0ZXJtaW5hdGVzCit0aGUgY29tbWFuZCBsaXN0IChhcyBpZiB0aGF0IGNvbW1hbmQgd2FzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGVuZCkuCitUaGlzIGlzIGJlY2F1c2UgYW55IHRpbWUgeW91IHJlc3VtZSBleGVjdXRpb24KKyhldmVuIHdpdGggYSBzaW1wbGUgbmV4dCBvciBzdGVwKSwgeW91IG1heSBlbmNvdW50ZXIKK2Fub3RoZXIgYnJlYWtwb2ludC0td2hpY2ggY291bGQgaGF2ZSBpdHMgb3duIGNvbW1hbmQgbGlzdCwgbGVhZGluZyB0bworYW1iaWd1aXRpZXMgYWJvdXQgd2hpY2ggbGlzdCB0byBleGVjdXRlLgorCisgICBJZiB5b3UgdXNlIHRoZSAnc2lsZW50JyBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QsIHRoZQordXN1YWwgbWVzc2FnZSBhYm91dCBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQgaXMgbm90IHByaW50ZWQuICBUaGlzIG1heQorYmUgZGVzaXJhYmxlIGZvciBicmVha3BvaW50cyB0aGF0IGFyZSB0byBwcmludCBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kCit0aGVuIGNvbnRpbnVlLiAgSWYgbm9uZSBvZiB0aGUgb3RoZXIgY29tbWFuZHMgcHJpbnQgYW55dGhpbmcsIHlvdQorc2VlIG5vIHNpZ24gdGhhdCB0aGUgYnJlYWtwb2ludCB3YXMgcmVhY2hlZC4KKyIiIgorCiAgICAgZGVmIGhlbHBfcGRiKHNlbGYpOgogICAgICAgICBoZWxwKCkKIApkaWZmIC0tZ2l0IGEvTGliL3BrZ19yZXNvdXJjZXMucHkgYi9MaWIvcGtnX3Jlc291cmNlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjZjYzkwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3BrZ19yZXNvdXJjZXMucHkKQEAgLTAsMCArMSwyMzc3IEBACisiIiJQYWNrYWdlIHJlc291cmNlIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSByZXNvdXJjZSBpcyBhIGxvZ2ljYWwgZmlsZSBjb250YWluZWQgd2l0aGluIGEgcGFja2FnZSwgb3IgYSBsb2dpY2FsCitzdWJkaXJlY3RvcnkgdGhlcmVvZi4gIFRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBleHBlY3RzIHJlc291cmNlIG5hbWVzCit0byBoYXZlIHRoZWlyIHBhdGggcGFydHMgc2VwYXJhdGVkIHdpdGggYGAvYGAsICpub3QqIHdoYXRldmVyIHRoZSBsb2NhbAorcGF0aCBzZXBhcmF0b3IgaXMuICBEbyBub3QgdXNlIG9zLnBhdGggb3BlcmF0aW9ucyB0byBtYW5pcHVsYXRlIHJlc291cmNlCituYW1lcyBiZWluZyBwYXNzZWQgaW50byB0aGUgQVBJLgorCitUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIG5vcm1hbCBmaWxlc3lzdGVtIHBhY2thZ2VzLAorLmVnZyBmaWxlcywgYW5kIHVucGFja2VkIC5lZ2cgZmlsZXMuICBJdCBjYW4gYWxzbyB3b3JrIGluIGEgbGltaXRlZCB3YXkgd2l0aAorLnppcCBmaWxlcyBhbmQgd2l0aCBjdXN0b20gUEVQIDMwMiBsb2FkZXJzIHRoYXQgc3VwcG9ydCB0aGUgYGBnZXRfZGF0YSgpYGAKK21ldGhvZC4KKyIiIgorCitpbXBvcnQgc3lzLCBvcywgemlwaW1wb3J0LCB0aW1lLCByZSwgaW1wLCBuZXcsIHBrZ3V0aWwgICMgWFhYCitmcm9tIHNldHMgaW1wb3J0IEltbXV0YWJsZVNldAorZnJvbSBvcyBpbXBvcnQgdXRpbWUsIHJlbmFtZSwgdW5saW5rICAgICMgY2FwdHVyZSB0aGVzZSB0byBieXBhc3Mgc2FuZGJveGluZworZnJvbSBvcyBpbXBvcnQgb3BlbiBhcyBvc19vcGVuCisKK2RlZiBnZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCk6CisgICAgIiIiUmV0dXJuIHRoaXMgcGxhdGZvcm0ncyBtYXhpbXVtIGNvbXBhdGlibGUgdmVyc2lvbi4KKworICAgIGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpIG5vcm1hbGx5IHJlcG9ydHMgdGhlIG1pbmltdW0gdmVyc2lvbgorICAgIG9mIE1hYyBPUyBYIHRoYXQgd291bGQgYmUgcmVxdWlyZWQgdG8gKnVzZSogZXh0ZW5zaW9ucyBwcm9kdWNlZCBieQorICAgIGRpc3R1dGlscy4gIEJ1dCB3aGF0IHdlIHdhbnQgd2hlbiBjaGVja2luZyBjb21wYXRpYmlsaXR5IGlzIHRvIGtub3cgdGhlCisgICAgdmVyc2lvbiBvZiBNYWMgT1MgWCB0aGF0IHdlIGFyZSAqcnVubmluZyouICBUbyBhbGxvdyB1c2FnZSBvZiBwYWNrYWdlcyB0aGF0CisgICAgZXhwbGljaXRseSByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBNYWMgT1MgWCwgd2UgbXVzdCBhbHNvIGtub3cgdGhlCisgICAgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBPUy4KKworICAgIElmIHRoaXMgY29uZGl0aW9uIG9jY3VycyBmb3IgYW55IG90aGVyIHBsYXRmb3JtIHdpdGggYSB2ZXJzaW9uIGluIGl0cworICAgIHBsYXRmb3JtIHN0cmluZ3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGV4dGVuZGVkIGFjY29yZGluZ2x5LgorICAgICIiIgorICAgIHBsYXQgPSBnZXRfYnVpbGRfcGxhdGZvcm0oKTsgbSA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwbGF0KQorICAgIGlmIG0gaXMgbm90IE5vbmUgYW5kIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGxhdCA9ICdtYWNvc3gtJXMtJXMnICUgKCcuJy5qb2luKF9tYWNvc3hfdmVycygpWzoyXSksIG0uZ3JvdXAoMykpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcyAgICAjIG5vdCBNYWMgT1MgWAorICAgIHJldHVybiBwbGF0CisKK19fYWxsX18gPSBbCisgICAgIyBCYXNpYyByZXNvdXJjZSBhY2Nlc3MgYW5kIGRpc3RyaWJ1dGlvbi9lbnRyeSBwb2ludCBkaXNjb3ZlcnkKKyAgICAncmVxdWlyZScsICdydW5fc2NyaXB0JywgJ2dldF9wcm92aWRlcicsICAnZ2V0X2Rpc3RyaWJ1dGlvbicsCisgICAgJ2xvYWRfZW50cnlfcG9pbnQnLCAnZ2V0X2VudHJ5X21hcCcsICdnZXRfZW50cnlfaW5mbycsICdpdGVyX2VudHJ5X3BvaW50cycsCisgICAgJ3Jlc291cmNlX3N0cmluZycsICdyZXNvdXJjZV9zdHJlYW0nLCAncmVzb3VyY2VfZmlsZW5hbWUnLAorICAgICdyZXNvdXJjZV9saXN0ZGlyJywgJ3Jlc291cmNlX2V4aXN0cycsICdyZXNvdXJjZV9pc2RpcicsCisKKyAgICAjIEVudmlyb25tZW50YWwgY29udHJvbAorICAgICdkZWNsYXJlX25hbWVzcGFjZScsICd3b3JraW5nX3NldCcsICdhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcicsCisgICAgJ2ZpbmRfZGlzdHJpYnV0aW9ucycsICdzZXRfZXh0cmFjdGlvbl9wYXRoJywgJ2NsZWFudXBfcmVzb3VyY2VzJywKKyAgICAnZ2V0X2RlZmF1bHRfY2FjaGUnLAorCisgICAgIyBQcmltYXJ5IGltcGxlbWVudGF0aW9uIGNsYXNzZXMKKyAgICAnRW52aXJvbm1lbnQnLCAnV29ya2luZ1NldCcsICdSZXNvdXJjZU1hbmFnZXInLAorICAgICdEaXN0cmlidXRpb24nLCAnUmVxdWlyZW1lbnQnLCAnRW50cnlQb2ludCcsCisKKyAgICAjIEV4Y2VwdGlvbnMKKyAgICAnUmVzb2x1dGlvbkVycm9yJywnVmVyc2lvbkNvbmZsaWN0JywnRGlzdHJpYnV0aW9uTm90Rm91bmQnLCdVbmtub3duRXh0cmEnLAorICAgICdFeHRyYWN0aW9uRXJyb3InLAorCisgICAgIyBQYXJzaW5nIGZ1bmN0aW9ucyBhbmQgc3RyaW5nIHV0aWxpdGllcworICAgICdwYXJzZV9yZXF1aXJlbWVudHMnLCAncGFyc2VfdmVyc2lvbicsICdzYWZlX25hbWUnLCAnc2FmZV92ZXJzaW9uJywKKyAgICAnZ2V0X3BsYXRmb3JtJywgJ2NvbXBhdGlibGVfcGxhdGZvcm1zJywgJ3lpZWxkX2xpbmVzJywgJ3NwbGl0X3NlY3Rpb25zJywKKyAgICAnc2FmZV9leHRyYScsICd0b19maWxlbmFtZScsCisKKyAgICAjIGZpbGVzeXN0ZW0gdXRpbGl0aWVzCisgICAgJ2Vuc3VyZV9kaXJlY3RvcnknLCAnbm9ybWFsaXplX3BhdGgnLAorCisgICAgIyBEaXN0cmlidXRpb24gInByZWNlZGVuY2UiIGNvbnN0YW50cworICAgICdFR0dfRElTVCcsICdCSU5BUllfRElTVCcsICdTT1VSQ0VfRElTVCcsICdDSEVDS09VVF9ESVNUJywgJ0RFVkVMT1BfRElTVCcsCisKKyAgICAjICJQcm92aWRlciIgaW50ZXJmYWNlcywgaW1wbGVtZW50YXRpb25zLCBhbmQgcmVnaXN0cmF0aW9uL2xvb2t1cCBBUElzCisgICAgJ0lNZXRhZGF0YVByb3ZpZGVyJywgJ0lSZXNvdXJjZVByb3ZpZGVyJywgJ0ZpbGVNZXRhZGF0YScsCisgICAgJ1BhdGhNZXRhZGF0YScsICdFZ2dNZXRhZGF0YScsICdFbXB0eVByb3ZpZGVyJywgJ2VtcHR5X3Byb3ZpZGVyJywKKyAgICAnTnVsbFByb3ZpZGVyJywgJ0VnZ1Byb3ZpZGVyJywgJ0RlZmF1bHRQcm92aWRlcicsICdaaXBQcm92aWRlcicsCisgICAgJ3JlZ2lzdGVyX2ZpbmRlcicsICdyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcicsICdyZWdpc3Rlcl9sb2FkZXJfdHlwZScsCisgICAgJ2ZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcycsICdnZXRfaW1wb3J0ZXInLAorCisgICAgIyBEZXByZWNhdGVkL2JhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seQorICAgICdydW5fbWFpbicsICdBdmFpbGFibGVEaXN0cmlidXRpb25zJywKK10KK2NsYXNzIFJlc29sdXRpb25FcnJvcihFeGNlcHRpb24pOgorICAgICIiIkFic3RyYWN0IGJhc2UgZm9yIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBlcnJvcnMiIiIKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXytyZXByKHNlbGYuYXJncykKKworY2xhc3MgVmVyc2lvbkNvbmZsaWN0KFJlc29sdXRpb25FcnJvcik6CisgICAgIiIiQW4gYWxyZWFkeS1pbnN0YWxsZWQgdmVyc2lvbiBjb25mbGljdHMgd2l0aCB0aGUgcmVxdWVzdGVkIHZlcnNpb24iIiIKKworY2xhc3MgRGlzdHJpYnV0aW9uTm90Rm91bmQoUmVzb2x1dGlvbkVycm9yKToKKyAgICAiIiJBIHJlcXVlc3RlZCBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCIiIgorCitjbGFzcyBVbmtub3duRXh0cmEoUmVzb2x1dGlvbkVycm9yKToKKyAgICAiIiJEaXN0cmlidXRpb24gZG9lc24ndCBoYXZlIGFuICJleHRyYSBmZWF0dXJlIiBvZiB0aGUgZ2l2ZW4gbmFtZSIiIgorCitfcHJvdmlkZXJfZmFjdG9yaWVzID0ge30KK1BZX01BSk9SID0gc3lzLnZlcnNpb25bOjNdCitFR0dfRElTVCAgICA9IDMKK0JJTkFSWV9ESVNUID0gMgorU09VUkNFX0RJU1QgPSAxCitDSEVDS09VVF9ESVNUID0gMAorREVWRUxPUF9ESVNUID0gLTEKKworZGVmIHJlZ2lzdGVyX2xvYWRlcl90eXBlKGxvYWRlcl90eXBlLCBwcm92aWRlcl9mYWN0b3J5KToKKyAgICAiIiJSZWdpc3RlciBgcHJvdmlkZXJfZmFjdG9yeWAgdG8gbWFrZSBwcm92aWRlcnMgZm9yIGBsb2FkZXJfdHlwZWAKKworICAgIGBsb2FkZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyIGBgbW9kdWxlLl9fbG9hZGVyX19gYCwKKyAgICBhbmQgYHByb3ZpZGVyX2ZhY3RvcnlgIGlzIGEgZnVuY3Rpb24gdGhhdCwgcGFzc2VkIGEgKm1vZHVsZSogb2JqZWN0LAorICAgIHJldHVybnMgYW4gYGBJUmVzb3VyY2VQcm92aWRlcmBgIGZvciB0aGF0IG1vZHVsZS4KKyAgICAiIiIKKyAgICBfcHJvdmlkZXJfZmFjdG9yaWVzW2xvYWRlcl90eXBlXSA9IHByb3ZpZGVyX2ZhY3RvcnkKKworZGVmIGdldF9wcm92aWRlcihtb2R1bGVPclJlcSk6CisgICAgIiIiUmV0dXJuIGFuIElSZXNvdXJjZVByb3ZpZGVyIGZvciB0aGUgbmFtZWQgbW9kdWxlIG9yIHJlcXVpcmVtZW50IiIiCisgICAgaWYgaXNpbnN0YW5jZShtb2R1bGVPclJlcSxSZXF1aXJlbWVudCk6CisgICAgICAgIHJldHVybiB3b3JraW5nX3NldC5maW5kKG1vZHVsZU9yUmVxKSBvciByZXF1aXJlKHN0cihtb2R1bGVPclJlcSkpWzBdCisgICAgdHJ5OgorICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVPclJlcV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIF9faW1wb3J0X18obW9kdWxlT3JSZXEpCisgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQorICAgIGxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCisgICAgcmV0dXJuIF9maW5kX2FkYXB0ZXIoX3Byb3ZpZGVyX2ZhY3RvcmllcywgbG9hZGVyKShtb2R1bGUpCisKK2RlZiBfbWFjb3N4X3ZlcnMoX2NhY2hlPVtdKToKKyAgICBpZiBub3QgX2NhY2hlOgorICAgICAgICBpbmZvID0gb3MucG9wZW4oJy91c3IvYmluL3N3X3ZlcnMnKS5yZWFkKCkuc3BsaXRsaW5lcygpCisgICAgICAgIGZvciBsaW5lIGluIGluZm86CisgICAgICAgICAgICBrZXksIHZhbHVlID0gbGluZS5zcGxpdChOb25lLCAxKQorICAgICAgICAgICAgaWYga2V5ID09ICdQcm9kdWN0VmVyc2lvbjonOgorICAgICAgICAgICAgICAgIF9jYWNoZS5hcHBlbmQodmFsdWUuc3RyaXAoKS5zcGxpdCgiLiIpKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiV2hhdD8hIgorICAgIHJldHVybiBfY2FjaGVbMF0KKworZGVmIF9tYWNvc3hfYXJjaChtYWNoaW5lKToKKyAgICByZXR1cm4geydQb3dlclBDJzoncHBjJywgJ1Bvd2VyX01hY2ludG9zaCc6J3BwYyd9LmdldChtYWNoaW5lLG1hY2hpbmUpCisKK2RlZiBnZXRfYnVpbGRfcGxhdGZvcm0oKToKKyAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIHN0cmluZyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucworCisgICAgWFhYIEN1cnJlbnRseSB0aGlzIGlzIHRoZSBzYW1lIGFzIGBgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKClgYCwgYnV0IGl0CisgICAgbmVlZHMgc29tZSBoYWNrcyBmb3IgTGludXggYW5kIE1hYyBPUyBYLgorICAgICIiIgorICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQorICAgIHBsYXQgPSBnZXRfcGxhdGZvcm0oKQorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiBhbmQgbm90IHBsYXQuc3RhcnRzd2l0aCgnbWFjb3N4LScpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2ZXJzaW9uID0gX21hY29zeF92ZXJzKCkKKyAgICAgICAgICAgIG1hY2hpbmUgPSBvcy51bmFtZSgpWzRdLnJlcGxhY2UoIiAiLCAiXyIpCisgICAgICAgICAgICByZXR1cm4gIm1hY29zeC0lZC4lZC0lcyIgJSAoaW50KHZlcnNpb25bMF0pLCBpbnQodmVyc2lvblsxXSksCisgICAgICAgICAgICAgICAgX21hY29zeF9hcmNoKG1hY2hpbmUpKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICMgaWYgc29tZW9uZSBpcyBydW5uaW5nIGEgbm9uLU1hYyBkYXJ3aW4gc3lzdGVtLCB0aGlzIHdpbGwgZmFsbAorICAgICAgICAgICAgIyB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIHBsYXQKKworbWFjb3NWZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyIm1hY29zeC0oXGQrKVwuKFxkKyktKC4qKSIpCitkYXJ3aW5WZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyImRhcndpbi0oXGQrKVwuKFxkKylcLihcZCspLSguKikiKQorZ2V0X3BsYXRmb3JtID0gZ2V0X2J1aWxkX3BsYXRmb3JtICAgIyBYWFggYmFja3dhcmQgY29tcGF0CisKK2RlZiBjb21wYXRpYmxlX3BsYXRmb3Jtcyhwcm92aWRlZCxyZXF1aXJlZCk6CisgICAgIiIiQ2FuIGNvZGUgZm9yIHRoZSBgcHJvdmlkZWRgIHBsYXRmb3JtIHJ1biBvbiB0aGUgYHJlcXVpcmVkYCBwbGF0Zm9ybT8KKworICAgIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgcGxhdGZvcm0gaXMgYGBOb25lYGAsIG9yIHRoZSBwbGF0Zm9ybXMgYXJlIGVxdWFsLgorCisgICAgWFhYIE5lZWRzIGNvbXBhdGliaWxpdHkgY2hlY2tzIGZvciBMaW51eCBhbmQgb3RoZXIgdW5peHkgT1Nlcy4KKyAgICAiIiIKKyAgICBpZiBwcm92aWRlZCBpcyBOb25lIG9yIHJlcXVpcmVkIGlzIE5vbmUgb3IgcHJvdmlkZWQ9PXJlcXVpcmVkOgorICAgICAgICByZXR1cm4gVHJ1ZSAgICAgIyBlYXN5IGNhc2UKKworICAgICMgTWFjIE9TIFggc3BlY2lhbCBjYXNlcworICAgIHJlcU1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChyZXF1aXJlZCkKKyAgICBpZiByZXFNYWM6CisgICAgICAgIHByb3ZNYWMgPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCisKKyAgICAgICAgIyBpcyB0aGlzIGEgTWFjIHBhY2thZ2U/CisgICAgICAgIGlmIG5vdCBwcm92TWFjOgorICAgICAgICAgICAgIyB0aGlzIGlzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBwYWNrYWdlcyBidWlsdCBiZWZvcmUKKyAgICAgICAgICAgICMgc2V0dXB0b29scyAwLjYuIEFsbCBwYWNrYWdlcyBidWlsdCBhZnRlciB0aGlzIHBvaW50IHdpbGwKKyAgICAgICAgICAgICMgdXNlIHRoZSBuZXcgbWFjb3N4IGRlc2lnbmF0aW9uLgorICAgICAgICAgICAgcHJvdkRhcndpbiA9IGRhcndpblZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCisgICAgICAgICAgICBpZiBwcm92RGFyd2luOgorICAgICAgICAgICAgICAgIGR2ZXJzaW9uID0gaW50KHByb3ZEYXJ3aW4uZ3JvdXAoMSkpCisgICAgICAgICAgICAgICAgbWFjb3N2ZXJzaW9uID0gIiVzLiVzIiAlIChyZXFNYWMuZ3JvdXAoMSksIHJlcU1hYy5ncm91cCgyKSkKKyAgICAgICAgICAgICAgICBpZiBkdmVyc2lvbiA9PSA3IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjMiIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgZHZlcnNpb24gPT0gOCBhbmQgbWFjb3N2ZXJzaW9uID49ICIxMC40IjoKKworICAgICAgICAgICAgICAgICAgICAjaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICN3YXJuaW5ncy53YXJuKCJNYWMgZWdncyBzaG91bGQgYmUgcmVidWlsdCB0byAiCisgICAgICAgICAgICAgICAgICAgICMgICAgInVzZSB0aGUgbWFjb3N4IGRlc2lnbmF0aW9uIGluc3RlYWQgb2YgZGFyd2luLiIsCisgICAgICAgICAgICAgICAgICAgICMgICAgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlICAgICMgZWdnIGlzbid0IG1hY29zeCBvciBsZWdhY3kgZGFyd2luCisKKyAgICAgICAgIyBhcmUgdGhleSB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uIGFuZCBtYWNoaW5lIHR5cGU/CisgICAgICAgIGlmIHByb3ZNYWMuZ3JvdXAoMSkgIT0gcmVxTWFjLmdyb3VwKDEpIG9yIFwKKyAgICAgICAgICAgIHByb3ZNYWMuZ3JvdXAoMykgIT0gcmVxTWFjLmdyb3VwKDMpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKworCisgICAgICAgICMgaXMgdGhlIHJlcXVpcmVkIE9TIG1ham9yIHVwZGF0ZSA+PSB0aGUgcHJvdmlkZWQgb25lPworICAgICAgICBpZiBpbnQocHJvdk1hYy5ncm91cCgyKSkgPiBpbnQocmVxTWFjLmdyb3VwKDIpKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAjIFhYWCBMaW51eCBhbmQgb3RoZXIgcGxhdGZvcm1zJyBzcGVjaWFsIGNhc2VzIHNob3VsZCBnbyBoZXJlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIHJ1bl9zY3JpcHQoZGlzdF9zcGVjLCBzY3JpcHRfbmFtZSk6CisgICAgIiIiTG9jYXRlIGRpc3RyaWJ1dGlvbiBgZGlzdF9zcGVjYCBhbmQgcnVuIGl0cyBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgorICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKKyAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KKyAgICBucy5jbGVhcigpCisgICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCisgICAgcmVxdWlyZShkaXN0X3NwZWMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQorCitydW5fbWFpbiA9IHJ1bl9zY3JpcHQgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKworZGVmIGdldF9kaXN0cmlidXRpb24oZGlzdCk6CisgICAgIiIiUmV0dXJuIGEgY3VycmVudCBkaXN0cmlidXRpb24gb2JqZWN0IGZvciBhIFJlcXVpcmVtZW50IG9yIHN0cmluZyIiIgorICAgIGlmIGlzaW5zdGFuY2UoZGlzdCxiYXNlc3RyaW5nKTogZGlzdCA9IFJlcXVpcmVtZW50LnBhcnNlKGRpc3QpCisgICAgaWYgaXNpbnN0YW5jZShkaXN0LFJlcXVpcmVtZW50KTogZGlzdCA9IGdldF9wcm92aWRlcihkaXN0KQorICAgIGlmIG5vdCBpc2luc3RhbmNlKGRpc3QsRGlzdHJpYnV0aW9uKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJFeHBlY3RlZCBzdHJpbmcsIFJlcXVpcmVtZW50LCBvciBEaXN0cmlidXRpb24iLCBkaXN0KQorICAgIHJldHVybiBkaXN0CisKK2RlZiBsb2FkX2VudHJ5X3BvaW50KGRpc3QsIGdyb3VwLCBuYW1lKToKKyAgICAiIiJSZXR1cm4gYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgZm9yIGBkaXN0YCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgorICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmxvYWRfZW50cnlfcG9pbnQoZ3JvdXAsIG5hbWUpCisKK2RlZiBnZXRfZW50cnlfbWFwKGRpc3QsIGdyb3VwPU5vbmUpOgorICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKKyAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5nZXRfZW50cnlfbWFwKGdyb3VwKQorCitkZWYgZ2V0X2VudHJ5X2luZm8oZGlzdCwgZ3JvdXAsIG5hbWUpOgorICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgorICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQorCisKK3RyeToKKyAgICBmcm9tIHBrZ3V0aWwgaW1wb3J0IGdldF9pbXBvcnRlcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBfcGtndXRpbCBhcyBwa2d1dGlsCisgICAgZ2V0X2ltcG9ydGVyID0gcGtndXRpbC5nZXRfaW1wb3J0ZXIKK2Vsc2U6CisgICAgaW1wb3J0IHBrZ3V0aWwKKworCitjbGFzcyBJTWV0YWRhdGFQcm92aWRlcjoKKworICAgIGRlZiBoYXNfbWV0YWRhdGEobmFtZSk6CisgICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UncyBkaXN0cmlidXRpb24gY29udGFpbiB0aGUgbmFtZWQgbWV0YWRhdGE/IiIiCisKKyAgICBkZWYgZ2V0X21ldGFkYXRhKG5hbWUpOgorICAgICAgICAiIiJUaGUgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKKworICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMobmFtZSk6CisgICAgICAgICIiIllpZWxkIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGxpc3Qgb2Ygbm9uLWJsYW5rIG5vbi1jb21tZW50IGxpbmVzCisKKyAgICAgICBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHN0cmlwcGVkIGZyb20gZWFjaCBsaW5lLCBhbmQgbGluZXMKKyAgICAgICB3aXRoIGBgI2BgIGFzIHRoZSBmaXJzdCBub24tYmxhbmsgY2hhcmFjdGVyIGFyZSBvbWl0dGVkLiIiIgorCisgICAgZGVmIG1ldGFkYXRhX2lzZGlyKG5hbWUpOgorICAgICAgICAiIiJJcyB0aGUgbmFtZWQgbWV0YWRhdGEgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgorCisgICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIobmFtZSk6CisgICAgICAgICIiIkxpc3Qgb2YgbWV0YWRhdGEgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgorCisgICAgZGVmIHJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5hbWVzcGFjZSk6CisgICAgICAgICIiIkV4ZWN1dGUgdGhlIG5hbWVkIHNjcmlwdCBpbiB0aGUgc3VwcGxpZWQgbmFtZXNwYWNlIGRpY3Rpb25hcnkiIiIKKworCisKKworCisKKworCisKKworY2xhc3MgSVJlc291cmNlUHJvdmlkZXIoSU1ldGFkYXRhUHJvdmlkZXIpOgorICAgICIiIkFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBwYWNrYWdlIHJlc291cmNlcyIiIgorCisgICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIGByZXNvdXJjZV9uYW1lYAorCisgICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCisKKyAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3IgYHJlc291cmNlX25hbWVgCisKKyAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKKworICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYHJlc291cmNlX25hbWVgCisKKyAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKKworICAgIGRlZiBoYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UgY29udGFpbiB0aGUgbmFtZWQgcmVzb3VyY2U/IiIiCisKKyAgICBkZWYgcmVzb3VyY2VfaXNkaXIocmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhIGRpcmVjdG9yeT8gIChsaWtlIGBgb3MucGF0aC5pc2RpcigpYGApIiIiCisKKyAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihyZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiTGlzdCBvZiByZXNvdXJjZSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IChsaWtlIGBgb3MubGlzdGRpcigpYGApIiIiCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBXb3JraW5nU2V0KG9iamVjdCk6CisgICAgIiIiQSBjb2xsZWN0aW9uIG9mIGFjdGl2ZSBkaXN0cmlidXRpb25zIG9uIHN5cy5wYXRoIChvciBhIHNpbWlsYXIgbGlzdCkiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnRyaWVzPU5vbmUpOgorICAgICAgICAiIiJDcmVhdGUgd29ya2luZyBzZXQgZnJvbSBsaXN0IG9mIHBhdGggZW50cmllcyAoZGVmYXVsdD1zeXMucGF0aCkiIiIKKyAgICAgICAgc2VsZi5lbnRyaWVzID0gW10KKyAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ge30KKyAgICAgICAgc2VsZi5ieV9rZXkgPSB7fQorICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IFtdCisKKyAgICAgICAgaWYgZW50cmllcyBpcyBOb25lOgorICAgICAgICAgICAgZW50cmllcyA9IHN5cy5wYXRoCisKKyAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICAgICAgICBzZWxmLmFkZF9lbnRyeShlbnRyeSkKKworCisgICAgZGVmIGFkZF9lbnRyeShzZWxmLCBlbnRyeSk6CisgICAgICAgICIiIkFkZCBhIHBhdGggaXRlbSB0byBgYC5lbnRyaWVzYGAsIGZpbmRpbmcgYW55IGRpc3RyaWJ1dGlvbnMgb24gaXQKKworICAgICAgICBgYGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSxGYWxzZSlgYCBpcyB1c2VkIHRvIGZpbmQgZGlzdHJpYnV0aW9ucworICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXRoIGVudHJ5LCBhbmQgdGhleSBhcmUgYWRkZWQuICBgZW50cnlgIGlzCisgICAgICAgIGFsd2F5cyBhcHBlbmRlZCB0byBgYC5lbnRyaWVzYGAsIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LgorICAgICAgICAoVGhpcyBpcyBiZWNhdXNlIGBgc3lzLnBhdGhgYCBjYW4gY29udGFpbiB0aGUgc2FtZSB2YWx1ZSBtb3JlIHRoYW4KKyAgICAgICAgb25jZSwgYW5kIHRoZSBgYC5lbnRyaWVzYGAgb2YgdGhlIGBgc3lzLnBhdGhgYCBXb3JraW5nU2V0IHNob3VsZCBhbHdheXMKKyAgICAgICAgZXF1YWwgYGBzeXMucGF0aGBgLikKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKKyAgICAgICAgc2VsZi5lbnRyaWVzLmFwcGVuZChlbnRyeSkKKyAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LCBUcnVlKToKKyAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QsIGVudHJ5LCBGYWxzZSkKKworCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGRpc3QpOgorICAgICAgICAiIiJUcnVlIGlmIGBkaXN0YCBpcyB0aGUgYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgaXRzIHByb2plY3QiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYnlfa2V5LmdldChkaXN0LmtleSkgPT0gZGlzdAorCisKKworCisKKyAgICBkZWYgZmluZChzZWxmLCByZXEpOgorICAgICAgICAiIiJGaW5kIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIHJlcXVpcmVtZW50IGByZXFgCisKKyAgICAgICAgSWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCB0aGlzCisgICAgICAgIHJldHVybnMgaXQgYXMgbG9uZyBhcyBpdCBtZWV0cyB0aGUgdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjaWZpZWQgYnkKKyAgICAgICAgYHJlcWAuICBCdXQsIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBpdAorICAgICAgICBkb2VzICpub3QqIG1lZXQgdGhlIGByZXFgIHJlcXVpcmVtZW50LCBgYFZlcnNpb25Db25mbGljdGBgIGlzIHJhaXNlZC4KKyAgICAgICAgSWYgdGhlcmUgaXMgbm8gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCBgYE5vbmVgYAorICAgICAgICBpcyByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIGRpc3QgPSBzZWxmLmJ5X2tleS5nZXQocmVxLmtleSkKKyAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZSBhbmQgZGlzdCBub3QgaW4gcmVxOgorICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QscmVxKSAgICAgIyBYWFggYWRkIG1vcmUgaW5mbworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGRpc3QKKworICAgIGRlZiBpdGVyX2VudHJ5X3BvaW50cyhzZWxmLCBncm91cCwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiWWllbGQgZW50cnkgcG9pbnQgb2JqZWN0cyBmcm9tIGBncm91cGAgbWF0Y2hpbmcgYG5hbWVgCisKKyAgICAgICAgSWYgYG5hbWVgIGlzIE5vbmUsIHlpZWxkcyBhbGwgZW50cnkgcG9pbnRzIGluIGBncm91cGAgZnJvbSBhbGwKKyAgICAgICAgZGlzdHJpYnV0aW9ucyBpbiB0aGUgd29ya2luZyBzZXQsIG90aGVyd2lzZSBvbmx5IG9uZXMgbWF0Y2hpbmcKKyAgICAgICAgYm90aCBgZ3JvdXBgIGFuZCBgbmFtZWAgYXJlIHlpZWxkZWQgKGluIGRpc3RyaWJ1dGlvbiBvcmRlcikuCisgICAgICAgICIiIgorICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgorICAgICAgICAgICAgZW50cmllcyA9IGRpc3QuZ2V0X2VudHJ5X21hcChncm91cCkKKyAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBmb3IgZXAgaW4gZW50cmllcy52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgZXAKKyAgICAgICAgICAgIGVsaWYgbmFtZSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgICAgIHlpZWxkIGVudHJpZXNbbmFtZV0KKworICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsIHJlcXVpcmVzLCBzY3JpcHRfbmFtZSk6CisgICAgICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gZm9yIGByZXF1aXJlc2AgYW5kIHJ1biBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgorICAgICAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCisgICAgICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQorICAgICAgICBucy5jbGVhcigpCisgICAgICAgIG5zWydfX25hbWVfXyddID0gbmFtZQorICAgICAgICBzZWxmLnJlcXVpcmUocmVxdWlyZXMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQorCisKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBmb3Igbm9uLWR1cGxpY2F0ZSBwcm9qZWN0cyBpbiB0aGUgd29ya2luZyBzZXQKKworICAgICAgICBUaGUgeWllbGQgb3JkZXIgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBpdGVtcycgcGF0aCBlbnRyaWVzIHdlcmUKKyAgICAgICAgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VlbiA9IHt9CisgICAgICAgIGZvciBpdGVtIGluIHNlbGYuZW50cmllczoKKyAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5lbnRyeV9rZXlzW2l0ZW1dOgorICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VlbjoKKyAgICAgICAgICAgICAgICAgICAgc2VlbltrZXldPTEKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5ieV9rZXlba2V5XQorCisgICAgZGVmIGFkZChzZWxmLCBkaXN0LCBlbnRyeT1Ob25lLCBpbnNlcnQ9VHJ1ZSk6CisgICAgICAgICIiIkFkZCBgZGlzdGAgdG8gd29ya2luZyBzZXQsIGFzc29jaWF0ZWQgd2l0aCBgZW50cnlgCisKKyAgICAgICAgSWYgYGVudHJ5YCBpcyB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGBgLmxvY2F0aW9uYGAgb2YgYGRpc3RgLgorICAgICAgICBPbiBleGl0IGZyb20gdGhpcyByb3V0aW5lLCBgZW50cnlgIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtpbmcKKyAgICAgICAgc2V0J3MgYGAuZW50cmllc2BgIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSBwcmVzZW50KS4KKworICAgICAgICBgZGlzdGAgaXMgb25seSBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaWYgaXQncyBmb3IgYSBwcm9qZWN0IHRoYXQKKyAgICAgICAgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBkaXN0cmlidXRpb24gaW4gdGhlIHNldC4gIElmIGl0J3MgYWRkZWQsIGFueQorICAgICAgICBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgYHN1YnNjcmliZSgpYGAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaW5zZXJ0OgorICAgICAgICAgICAgZGlzdC5pbnNlcnRfb24oc2VsZi5lbnRyaWVzLCBlbnRyeSkKKworICAgICAgICBpZiBlbnRyeSBpcyBOb25lOgorICAgICAgICAgICAgZW50cnkgPSBkaXN0LmxvY2F0aW9uCisgICAgICAgIGtleXMgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChlbnRyeSxbXSkKKworICAgICAgICBpZiBkaXN0LmtleSBpbiBzZWxmLmJ5X2tleToKKyAgICAgICAgICAgIHJldHVybiAgICAgICMgaWdub3JlIGhpZGRlbiBkaXN0cm9zCisKKyAgICAgICAgc2VsZi5ieV9rZXlbZGlzdC5rZXldID0gZGlzdAorICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4ga2V5czoKKyAgICAgICAgICAgIGtleXMuYXBwZW5kKGRpc3Qua2V5KQorCisgICAgICAgIHNlbGYuX2FkZGVkX25ldyhkaXN0KQorCisKKyAgICBkZWYgcmVzb2x2ZShzZWxmLCByZXF1aXJlbWVudHMsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSk6CisgICAgICAgICIiIkxpc3QgYWxsIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHRvIChyZWN1cnNpdmVseSkgbWVldCBgcmVxdWlyZW1lbnRzYAorCisgICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cy4gIGBlbnZgLAorICAgICAgICBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZS4gIElmCisgICAgICAgIG5vdCBzdXBwbGllZCwgaXQgZGVmYXVsdHMgdG8gYWxsIGRpc3RyaWJ1dGlvbnMgYXZhaWxhYmxlIHdpdGhpbiBhbnkKKyAgICAgICAgZW50cnkgb3IgZGlzdHJpYnV0aW9uIGluIHRoZSB3b3JraW5nIHNldC4gIGBpbnN0YWxsZXJgLCBpZiBzdXBwbGllZCwKKyAgICAgICAgd2lsbCBiZSBpbnZva2VkIHdpdGggZWFjaCByZXF1aXJlbWVudCB0aGF0IGNhbm5vdCBiZSBtZXQgYnkgYW4KKyAgICAgICAgYWxyZWFkeS1pbnN0YWxsZWQgZGlzdHJpYnV0aW9uOyBpdCBzaG91bGQgcmV0dXJuIGEgYGBEaXN0cmlidXRpb25gYCBvcgorICAgICAgICBgYE5vbmVgYC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmVxdWlyZW1lbnRzID0gbGlzdChyZXF1aXJlbWVudHMpWzo6LTFdICAjIHNldCB1cCB0aGUgc3RhY2sKKyAgICAgICAgcHJvY2Vzc2VkID0ge30gICMgc2V0IG9mIHByb2Nlc3NlZCByZXF1aXJlbWVudHMKKyAgICAgICAgYmVzdCA9IHt9ICAjIGtleSAtPiBkaXN0CisgICAgICAgIHRvX2FjdGl2YXRlID0gW10KKworICAgICAgICB3aGlsZSByZXF1aXJlbWVudHM6CisgICAgICAgICAgICByZXEgPSByZXF1aXJlbWVudHMucG9wKDApICAgIyBwcm9jZXNzIGRlcGVuZGVuY2llcyBicmVhZHRoLWZpcnN0CisgICAgICAgICAgICBpZiByZXEgaW4gcHJvY2Vzc2VkOgorICAgICAgICAgICAgICAgICMgSWdub3JlIGN5Y2xpYyBvciByZWR1bmRhbnQgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGRpc3QgPSBiZXN0LmdldChyZXEua2V5KQorICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgRmluZCB0aGUgYmVzdCBkaXN0cmlidXRpb24gYW5kIGFkZCBpdCB0byB0aGUgbWFwCisgICAgICAgICAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQorICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZW52IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBiZXN0W3JlcS5rZXldID0gZW52LmJlc3RfbWF0Y2gocmVxLCBzZWxmLCBpbnN0YWxsZXIpCisgICAgICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RyaWJ1dGlvbk5vdEZvdW5kKHJlcSkgICMgWFhYIHB1dCBtb3JlIGluZm8gaGVyZQorICAgICAgICAgICAgICAgIHRvX2FjdGl2YXRlLmFwcGVuZChkaXN0KQorICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gcmVxOgorICAgICAgICAgICAgICAgICMgT29wcywgdGhlICJiZXN0IiBzbyBmYXIgY29uZmxpY3RzIHdpdGggYSBkZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QscmVxKSAjIFhYWCBwdXQgbW9yZSBpbmZvIGhlcmUKKyAgICAgICAgICAgIHJlcXVpcmVtZW50cy5leHRlbmQoZGlzdC5yZXF1aXJlcyhyZXEuZXh0cmFzKVs6Oi0xXSkKKyAgICAgICAgICAgIHByb2Nlc3NlZFtyZXFdID0gVHJ1ZQorCisgICAgICAgIHJldHVybiB0b19hY3RpdmF0ZSAgICAjIHJldHVybiBsaXN0IG9mIGRpc3Ryb3MgdG8gYWN0aXZhdGUKKworICAgIGRlZiBmaW5kX3BsdWdpbnMoc2VsZiwKKyAgICAgICAgcGx1Z2luX2VudiwgZnVsbF9lbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsIGZhbGxiYWNrPVRydWUKKyAgICApOgorICAgICAgICAiIiJGaW5kIGFsbCBhY3RpdmF0YWJsZSBkaXN0cmlidXRpb25zIGluIGBwbHVnaW5fZW52YAorCisgICAgICAgIEV4YW1wbGUgdXNhZ2U6OgorCisgICAgICAgICAgICBkaXN0cmlidXRpb25zLCBlcnJvcnMgPSB3b3JraW5nX3NldC5maW5kX3BsdWdpbnMoCisgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQocGx1Z2luX2Rpcmxpc3QpCisgICAgICAgICAgICApCisgICAgICAgICAgICBtYXAod29ya2luZ19zZXQuYWRkLCBkaXN0cmlidXRpb25zKSAgIyBhZGQgcGx1Z2lucytsaWJzIHRvIHN5cy5wYXRoCisgICAgICAgICAgICBwcmludCAiQ291bGRuJ3QgbG9hZCIsIGVycm9ycyAgICAgICAgIyBkaXNwbGF5IGVycm9ycworCisgICAgICAgIFRoZSBgcGx1Z2luX2VudmAgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zCisgICAgICAgIG9ubHkgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBpbiB0aGUgcHJvamVjdCdzICJwbHVnaW4gZGlyZWN0b3J5IiBvcgorICAgICAgICBkaXJlY3Rvcmllcy4gVGhlIGBmdWxsX2VudmAsIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgCisgICAgICAgIGNvbnRhaW5zIGFsbCBjdXJyZW50bHktYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMuICBJZiBgZnVsbF9lbnZgIGlzIG5vdAorICAgICAgICBzdXBwbGllZCwgb25lIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBgYFdvcmtpbmdTZXRgYCB0aGlzCisgICAgICAgIG1ldGhvZCBpcyBjYWxsZWQgb24sIHdoaWNoIHdpbGwgdHlwaWNhbGx5IG1lYW4gdGhhdCBldmVyeSBkaXJlY3Rvcnkgb24KKyAgICAgICAgYGBzeXMucGF0aGBgIHdpbGwgYmUgc2Nhbm5lZCBmb3IgZGlzdHJpYnV0aW9ucy4KKworICAgICAgICBgaW5zdGFsbGVyYCBpcyBhIHN0YW5kYXJkIGluc3RhbGxlciBjYWxsYmFjayBhcyB1c2VkIGJ5IHRoZQorICAgICAgICBgYHJlc29sdmUoKWBgIG1ldGhvZC4gVGhlIGBmYWxsYmFja2AgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQKKyAgICAgICAgYXR0ZW1wdCB0byByZXNvbHZlIG9sZGVyIHZlcnNpb25zIG9mIGEgcGx1Z2luIGlmIHRoZSBuZXdlc3QgdmVyc2lvbgorICAgICAgICBjYW5ub3QgYmUgcmVzb2x2ZWQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIDItdHVwbGU6IChgZGlzdHJpYnV0aW9uc2AsIGBlcnJvcl9pbmZvYCksIHdoZXJlCisgICAgICAgIGBkaXN0cmlidXRpb25zYCBpcyBhIGxpc3Qgb2YgdGhlIGRpc3RyaWJ1dGlvbnMgZm91bmQgaW4gYHBsdWdpbl9lbnZgCisgICAgICAgIHRoYXQgd2VyZSBsb2FkYWJsZSwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBuZWVkZWQKKyAgICAgICAgdG8gcmVzb2x2ZSB0aGVpciBkZXBlbmRlbmNpZXMuICBgZXJyb3JfaW5mb2AgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcKKyAgICAgICAgdW5sb2FkYWJsZSBwbHVnaW4gZGlzdHJpYnV0aW9ucyB0byBhbiBleGNlcHRpb24gaW5zdGFuY2UgZGVzY3JpYmluZyB0aGUKKyAgICAgICAgZXJyb3IgdGhhdCBvY2N1cnJlZC4gVXN1YWxseSB0aGlzIHdpbGwgYmUgYSBgYERpc3RyaWJ1dGlvbk5vdEZvdW5kYGAgb3IKKyAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcGx1Z2luX3Byb2plY3RzID0gbGlzdChwbHVnaW5fZW52KQorICAgICAgICBwbHVnaW5fcHJvamVjdHMuc29ydCgpICAjIHNjYW4gcHJvamVjdCBuYW1lcyBpbiBhbHBoYWJldGljIG9yZGVyCisKKyAgICAgICAgZXJyb3JfaW5mbyA9IHt9CisgICAgICAgIGRpc3RyaWJ1dGlvbnMgPSB7fQorCisgICAgICAgIGlmIGZ1bGxfZW52IGlzIE5vbmU6CisgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCisgICAgICAgICAgICBlbnYgKz0gcGx1Z2luX2VudgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW52ID0gZnVsbF9lbnYgKyBwbHVnaW5fZW52CisKKyAgICAgICAgc2hhZG93X3NldCA9IHNlbGYuX19jbGFzc19fKFtdKQorICAgICAgICBtYXAoc2hhZG93X3NldC5hZGQsIHNlbGYpICAgIyBwdXQgYWxsIG91ciBlbnRyaWVzIGluIHNoYWRvd19zZXQKKworICAgICAgICBmb3IgcHJvamVjdF9uYW1lIGluIHBsdWdpbl9wcm9qZWN0czoKKworICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGx1Z2luX2Vudltwcm9qZWN0X25hbWVdOgorCisgICAgICAgICAgICAgICAgcmVxID0gW2Rpc3QuYXNfcmVxdWlyZW1lbnQoKV0KKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWVzID0gc2hhZG93X3NldC5yZXNvbHZlKHJlcSwgZW52LCBpbnN0YWxsZXIpCisKKyAgICAgICAgICAgICAgICBleGNlcHQgUmVzb2x1dGlvbkVycm9yLHY6CisgICAgICAgICAgICAgICAgICAgIGVycm9yX2luZm9bZGlzdF0gPSB2ICAgICMgc2F2ZSBlcnJvciBpbmZvCisgICAgICAgICAgICAgICAgICAgIGlmIGZhbGxiYWNrOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAgIyB0cnkgdGhlIG5leHQgb2xkZXIgdmVyc2lvbiBvZiBwcm9qZWN0CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICAgICAjIGdpdmUgdXAgb24gdGhpcyBwcm9qZWN0LCBrZWVwIGdvaW5nCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtYXAoc2hhZG93X3NldC5hZGQsIHJlc29sdmVlcykKKyAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucy51cGRhdGUoZGljdC5mcm9ta2V5cyhyZXNvbHZlZXMpKQorCisgICAgICAgICAgICAgICAgICAgICMgc3VjY2Vzcywgbm8gbmVlZCB0byB0cnkgYW55IG1vcmUgdmVyc2lvbnMgb2YgdGhpcyBwcm9qZWN0CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgZGlzdHJpYnV0aW9ucyA9IGxpc3QoZGlzdHJpYnV0aW9ucykKKyAgICAgICAgZGlzdHJpYnV0aW9ucy5zb3J0KCkKKworICAgICAgICByZXR1cm4gZGlzdHJpYnV0aW9ucywgZXJyb3JfaW5mbworCisKKworCisKKyAgICBkZWYgcmVxdWlyZShzZWxmLCAqcmVxdWlyZW1lbnRzKToKKyAgICAgICAgIiIiRW5zdXJlIHRoYXQgZGlzdHJpYnV0aW9ucyBtYXRjaGluZyBgcmVxdWlyZW1lbnRzYCBhcmUgYWN0aXZhdGVkCisKKyAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHN0cmluZyBvciBhIChwb3NzaWJseS1uZXN0ZWQpIHNlcXVlbmNlCisgICAgICAgIHRoZXJlb2YsIHNwZWNpZnlpbmcgdGhlIGRpc3RyaWJ1dGlvbnMgYW5kIHZlcnNpb25zIHJlcXVpcmVkLiAgVGhlCisgICAgICAgIHJldHVybiB2YWx1ZSBpcyBhIHNlcXVlbmNlIG9mIHRoZSBkaXN0cmlidXRpb25zIHRoYXQgbmVlZGVkIHRvIGJlCisgICAgICAgIGFjdGl2YXRlZCB0byBmdWxmaWxsIHRoZSByZXF1aXJlbWVudHM7IGFsbCByZWxldmFudCBkaXN0cmlidXRpb25zIGFyZQorICAgICAgICBpbmNsdWRlZCwgZXZlbiBpZiB0aGV5IHdlcmUgYWxyZWFkeSBhY3RpdmF0ZWQgaW4gdGhpcyB3b3JraW5nIHNldC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgbmVlZGVkID0gc2VsZi5yZXNvbHZlKHBhcnNlX3JlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpKQorCisgICAgICAgIGZvciBkaXN0IGluIG5lZWRlZDoKKyAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCisKKyAgICAgICAgcmV0dXJuIG5lZWRlZAorCisKKyAgICBkZWYgc3Vic2NyaWJlKHNlbGYsIGNhbGxiYWNrKToKKyAgICAgICAgIiIiSW52b2tlIGBjYWxsYmFja2AgZm9yIGFsbCBkaXN0cmlidXRpb25zIChpbmNsdWRpbmcgZXhpc3Rpbmcgb25lcykiIiIKKyAgICAgICAgaWYgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNrKQorICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgorICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKKworCisgICAgZGVmIF9hZGRlZF9uZXcoc2VsZiwgZGlzdCk6CisgICAgICAgIGZvciBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKKyAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCisKKworCisKKworCisKKworCisKKworY2xhc3MgRW52aXJvbm1lbnQob2JqZWN0KToKKyAgICAiIiJTZWFyY2hhYmxlIHNuYXBzaG90IG9mIGRpc3RyaWJ1dGlvbnMgb24gYSBzZWFyY2ggcGF0aCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUsIHBsYXRmb3JtPWdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKSwgcHl0aG9uPVBZX01BSk9SKToKKyAgICAgICAgIiIiU25hcHNob3QgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgb24gYSBzZWFyY2ggcGF0aAorCisgICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIG9uIGBzZWFyY2hfcGF0aGAgYXJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudC4KKyAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKKyAgICAgICAgc3VwcGxpZWQsIGBgc3lzLnBhdGhgYCBpcyB1c2VkLgorCisgICAgICAgIGBwbGF0Zm9ybWAgaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtCisgICAgICAgIHRoYXQgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aC4gIElmCisgICAgICAgIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIGBweXRob25gIGlzIGFuCisgICAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1pbmcgdGhlIGRlc2lyZWQgdmVyc2lvbiBvZiBQeXRob24gKGUuZy4gYGAnMi40J2BgKTsKKyAgICAgICAgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbi4KKworICAgICAgICBZb3UgbWF5IGV4cGxpY2l0bHkgc2V0IGBwbGF0Zm9ybWAgKGFuZC9vciBgcHl0aG9uYCkgdG8gYGBOb25lYGAgaWYgeW91CisgICAgICAgIHdpc2ggdG8gbWFwICphbGwqIGRpc3RyaWJ1dGlvbnMsIG5vdCBqdXN0IHRob3NlIGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgICAgcnVubmluZyBwbGF0Zm9ybSBvciBQeXRob24gdmVyc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2Rpc3RtYXAgPSB7fQorICAgICAgICBzZWxmLl9jYWNoZSA9IHt9CisgICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICBzZWxmLnB5dGhvbiA9IHB5dGhvbgorICAgICAgICBzZWxmLnNjYW4oc2VhcmNoX3BhdGgpCisKKyAgICBkZWYgY2FuX2FkZChzZWxmLCBkaXN0KToKKyAgICAgICAgIiIiSXMgZGlzdHJpYnV0aW9uIGBkaXN0YCBhY2NlcHRhYmxlIGZvciB0aGlzIGVudmlyb25tZW50PworCisgICAgICAgIFRoZSBkaXN0cmlidXRpb24gbXVzdCBtYXRjaCB0aGUgcGxhdGZvcm0gYW5kIHB5dGhvbiB2ZXJzaW9uCisgICAgICAgIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgd2hlbiB0aGlzIGVudmlyb25tZW50IHdhcyBjcmVhdGVkLCBvciBGYWxzZQorICAgICAgICBpcyByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAoc2VsZi5weXRob24gaXMgTm9uZSBvciBkaXN0LnB5X3ZlcnNpb24gaXMgTm9uZQorICAgICAgICAgICAgb3IgZGlzdC5weV92ZXJzaW9uPT1zZWxmLnB5dGhvbikgXAorICAgICAgICAgICBhbmQgY29tcGF0aWJsZV9wbGF0Zm9ybXMoZGlzdC5wbGF0Zm9ybSxzZWxmLnBsYXRmb3JtKQorCisgICAgZGVmIHJlbW92ZShzZWxmLCBkaXN0KToKKyAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBlbnZpcm9ubWVudCIiIgorICAgICAgICBzZWxmLl9kaXN0bWFwW2Rpc3Qua2V5XS5yZW1vdmUoZGlzdCkKKworICAgIGRlZiBzY2FuKHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUpOgorICAgICAgICAiIiJTY2FuIGBzZWFyY2hfcGF0aGAgZm9yIGRpc3RyaWJ1dGlvbnMgdXNhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQKKworICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgorICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAorICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuICBPbmx5IGRpc3RyaWJ1dGlvbnMgY29uZm9ybWluZyB0bworICAgICAgICB0aGUgcGxhdGZvcm0vcHl0aG9uIHZlcnNpb24gZGVmaW5lZCBhdCBpbml0aWFsaXphdGlvbiBhcmUgYWRkZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWFyY2hfcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgc2VhcmNoX3BhdGggPSBzeXMucGF0aAorCisgICAgICAgIGZvciBpdGVtIGluIHNlYXJjaF9wYXRoOgorICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGl0ZW0pOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZixwcm9qZWN0X25hbWUpOgorICAgICAgICAiIiJSZXR1cm4gYSBuZXdlc3QtdG8tb2xkZXN0IGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyBmb3IgYHByb2plY3RfbmFtZWAKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jYWNoZVtwcm9qZWN0X25hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHByb2plY3RfbmFtZSA9IHByb2plY3RfbmFtZS5sb3dlcigpCisgICAgICAgICAgICBpZiBwcm9qZWN0X25hbWUgbm90IGluIHNlbGYuX2Rpc3RtYXA6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgaWYgcHJvamVjdF9uYW1lIG5vdCBpbiBzZWxmLl9jYWNoZToKKyAgICAgICAgICAgIGRpc3RzID0gc2VsZi5fY2FjaGVbcHJvamVjdF9uYW1lXSA9IHNlbGYuX2Rpc3RtYXBbcHJvamVjdF9uYW1lXQorICAgICAgICAgICAgX3NvcnRfZGlzdHMoZGlzdHMpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhY2hlW3Byb2plY3RfbmFtZV0KKworICAgIGRlZiBhZGQoc2VsZixkaXN0KToKKyAgICAgICAgIiIiQWRkIGBkaXN0YCBpZiB3ZSBgYGNhbl9hZGQoKWBgIGl0IGFuZCBpdCBpc24ndCBhbHJlYWR5IGFkZGVkIiIiCisgICAgICAgIGlmIHNlbGYuY2FuX2FkZChkaXN0KSBhbmQgZGlzdC5oYXNfdmVyc2lvbigpOgorICAgICAgICAgICAgZGlzdHMgPSBzZWxmLl9kaXN0bWFwLnNldGRlZmF1bHQoZGlzdC5rZXksW10pCisgICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBkaXN0czoKKyAgICAgICAgICAgICAgICBkaXN0cy5hcHBlbmQoZGlzdCkKKyAgICAgICAgICAgICAgICBpZiBkaXN0LmtleSBpbiBzZWxmLl9jYWNoZToKKyAgICAgICAgICAgICAgICAgICAgX3NvcnRfZGlzdHMoc2VsZi5fY2FjaGVbZGlzdC5rZXldKQorCisKKyAgICBkZWYgYmVzdF9tYXRjaChzZWxmLCByZXEsIHdvcmtpbmdfc2V0LCBpbnN0YWxsZXI9Tm9uZSk6CisgICAgICAgICIiIkZpbmQgZGlzdHJpYnV0aW9uIGJlc3QgbWF0Y2hpbmcgYHJlcWAgYW5kIHVzYWJsZSBvbiBgd29ya2luZ19zZXRgCisKKyAgICAgICAgVGhpcyBjYWxscyB0aGUgYGBmaW5kKHJlcSlgYCBtZXRob2Qgb2YgdGhlIGB3b3JraW5nX3NldGAgdG8gc2VlIGlmIGEKKyAgICAgICAgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGlzIGFscmVhZHkgYWN0aXZlLiAgKFRoaXMgbWF5IHJhaXNlCisgICAgICAgIGBgVmVyc2lvbkNvbmZsaWN0YGAgaWYgYW4gdW5zdWl0YWJsZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGlzIGFscmVhZHkKKyAgICAgICAgYWN0aXZlIGluIHRoZSBzcGVjaWZpZWQgYHdvcmtpbmdfc2V0YC4pICBJZiBhIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbgorICAgICAgICBpc24ndCBhY3RpdmUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5ld2VzdCBkaXN0cmlidXRpb24gaW4gdGhlCisgICAgICAgIGVudmlyb25tZW50IHRoYXQgbWVldHMgdGhlIGBgUmVxdWlyZW1lbnRgYCBpbiBgcmVxYC4gIElmIG5vIHN1aXRhYmxlCisgICAgICAgIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwgYW5kIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSByZXN1bHQgb2YKKyAgICAgICAgY2FsbGluZyB0aGUgZW52aXJvbm1lbnQncyBgYG9idGFpbihyZXEsIGluc3RhbGxlcilgYCBtZXRob2Qgd2lsbCBiZQorICAgICAgICByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIGRpc3QgPSB3b3JraW5nX3NldC5maW5kKHJlcSkKKyAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBkaXN0CisgICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxLmtleV06CisgICAgICAgICAgICBpZiBkaXN0IGluIHJlcToKKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAorICAgICAgICByZXR1cm4gc2VsZi5vYnRhaW4ocmVxLCBpbnN0YWxsZXIpICMgdHJ5IGFuZCBkb3dubG9hZC9pbnN0YWxsCisKKyAgICBkZWYgb2J0YWluKHNlbGYsIHJlcXVpcmVtZW50LCBpbnN0YWxsZXI9Tm9uZSk6CisgICAgICAgICIiIk9idGFpbiBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyBgcmVxdWlyZW1lbnRgIChlLmcuIHZpYSBkb3dubG9hZCkKKworICAgICAgICBPYnRhaW4gYSBkaXN0cm8gdGhhdCBtYXRjaGVzIHJlcXVpcmVtZW50IChlLmcuIHZpYSBkb3dubG9hZCkuICBJbiB0aGUKKyAgICAgICAgYmFzZSBgYEVudmlyb25tZW50YGAgY2xhc3MsIHRoaXMgcm91dGluZSBqdXN0IHJldHVybnMKKyAgICAgICAgYGBpbnN0YWxsZXIocmVxdWlyZW1lbnQpYGAsIHVubGVzcyBgaW5zdGFsbGVyYCBpcyBOb25lLCBpbiB3aGljaCBjYXNlCisgICAgICAgIE5vbmUgaXMgcmV0dXJuZWQgaW5zdGVhZC4gIFRoaXMgbWV0aG9kIGlzIGEgaG9vayB0aGF0IGFsbG93cyBzdWJjbGFzc2VzCisgICAgICAgIHRvIGF0dGVtcHQgb3RoZXIgd2F5cyBvZiBvYnRhaW5pbmcgYSBkaXN0cmlidXRpb24gYmVmb3JlIGZhbGxpbmcgYmFjaworICAgICAgICB0byB0aGUgYGluc3RhbGxlcmAgYXJndW1lbnQuIiIiCisgICAgICAgIGlmIGluc3RhbGxlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZXIocmVxdWlyZW1lbnQpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICIiIllpZWxkIHRoZSB1bmlxdWUgcHJvamVjdCBuYW1lcyBvZiB0aGUgYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMiIiIKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9kaXN0bWFwLmtleXMoKToKKyAgICAgICAgICAgIGlmIHNlbGZba2V5XTogeWllbGQga2V5CisKKworCisKKyAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJJbi1wbGFjZSBhZGRpdGlvbiBvZiBhIGRpc3RyaWJ1dGlvbiBvciBlbnZpcm9ubWVudCIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLERpc3RyaWJ1dGlvbik6CisgICAgICAgICAgICBzZWxmLmFkZChvdGhlcikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLEVudmlyb25tZW50KToKKyAgICAgICAgICAgIGZvciBwcm9qZWN0IGluIG90aGVyOgorICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIG90aGVyW3Byb2plY3RdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZChkaXN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBhZGQgJXIgdG8gZW52aXJvbm1lbnQiICUgKG90aGVyLCkpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIkFkZCBhbiBlbnZpcm9ubWVudCBvciBkaXN0cmlidXRpb24gdG8gYW4gZW52aXJvbm1lbnQiIiIKKyAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oW10sIHBsYXRmb3JtPU5vbmUsIHB5dGhvbj1Ob25lKQorICAgICAgICBmb3IgZW52IGluIHNlbGYsIG90aGVyOgorICAgICAgICAgICAgbmV3ICs9IGVudgorICAgICAgICByZXR1cm4gbmV3CisKKworQXZhaWxhYmxlRGlzdHJpYnV0aW9ucyA9IEVudmlyb25tZW50ICAgICMgWFhYIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKworCitjbGFzcyBFeHRyYWN0aW9uRXJyb3IoUnVudGltZUVycm9yKToKKyAgICAiIiJBbiBlcnJvciBvY2N1cnJlZCBleHRyYWN0aW5nIGEgcmVzb3VyY2UKKworICAgIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGZyb20gaW5zdGFuY2VzIG9mIHRoaXMgZXhjZXB0aW9uOgorCisgICAgbWFuYWdlcgorICAgICAgICBUaGUgcmVzb3VyY2UgbWFuYWdlciB0aGF0IHJhaXNlZCB0aGlzIGV4Y2VwdGlvbgorCisgICAgY2FjaGVfcGF0aAorICAgICAgICBUaGUgYmFzZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlIGV4dHJhY3Rpb24KKworICAgIG9yaWdpbmFsX2Vycm9yCisgICAgICAgIFRoZSBleGNlcHRpb24gaW5zdGFuY2UgdGhhdCBjYXVzZWQgZXh0cmFjdGlvbiB0byBmYWlsCisgICAgIiIiCisKKworCisKK2NsYXNzIFJlc291cmNlTWFuYWdlcjoKKyAgICAiIiJNYW5hZ2UgcmVzb3VyY2UgZXh0cmFjdGlvbiBhbmQgcGFja2FnZXMiIiIKKyAgICBleHRyYWN0aW9uX3BhdGggPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzID0ge30KKworICAgIGRlZiByZXNvdXJjZV9leGlzdHMoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIkRvZXMgdGhlIG5hbWVkIHJlc291cmNlIGV4aXN0PyIiIgorICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKQorCisgICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgorICAgICAgICAiIiJJcyB0aGUgbmFtZWQgcmVzb3VyY2UgYW4gZXhpc3RpbmcgZGlyZWN0b3J5PyIiIgorICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2lzZGlyKAorICAgICAgICAgICAgcmVzb3VyY2VfbmFtZQorICAgICAgICApCisKKyAgICBkZWYgcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIHRydWUgZmlsZXN5c3RlbSBwYXRoIGZvciBzcGVjaWZpZWQgcmVzb3VyY2UiIiIKKyAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2VfZmlsZW5hbWUoCisgICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCisgICAgICAgICkKKworICAgIGRlZiByZXNvdXJjZV9zdHJlYW0oc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIHJlYWRhYmxlIGZpbGUtbGlrZSBvYmplY3QgZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgorICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJlYW0oCisgICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCisgICAgICAgICkKKworICAgIGRlZiByZXNvdXJjZV9zdHJpbmcoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIlJldHVybiBzcGVjaWZpZWQgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKKyAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyaW5nKAorICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQorICAgICAgICApCisKKyAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiTGlzdCB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIHJlc291cmNlIGRpcmVjdG9yeSIiIgorICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2xpc3RkaXIoCisgICAgICAgICAgICByZXNvdXJjZV9uYW1lCisgICAgICAgICkKKworICAgIGRlZiBleHRyYWN0aW9uX2Vycm9yKHNlbGYpOgorICAgICAgICAiIiJHaXZlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHByb2JsZW1zIGV4dHJhY3RpbmcgZmlsZShzKSIiIgorCisgICAgICAgIG9sZF9leGMgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICBjYWNoZV9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQorCisgICAgICAgIGVyciA9IEV4dHJhY3Rpb25FcnJvcigiIiJDYW4ndCBleHRyYWN0IGZpbGUocykgdG8gZWdnIGNhY2hlCisKK1RoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGV4dHJhY3QgZmlsZShzKSB0byB0aGUgUHl0aG9uIGVnZworY2FjaGU6CisKKyAgJXMKKworVGhlIFB5dGhvbiBlZ2cgY2FjaGUgZGlyZWN0b3J5IGlzIGN1cnJlbnRseSBzZXQgdG86CisKKyAgJXMKKworUGVyaGFwcyB5b3VyIGFjY291bnQgZG9lcyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBkaXJlY3Rvcnk/ICBZb3UgY2FuCitjaGFuZ2UgdGhlIGNhY2hlIGRpcmVjdG9yeSBieSBzZXR0aW5nIHRoZSBQWVRIT05fRUdHX0NBQ0hFIGVudmlyb25tZW50Cit2YXJpYWJsZSB0byBwb2ludCB0byBhbiBhY2Nlc3NpYmxlIGRpcmVjdG9yeS4KKyIiIiAgICAgICAgICUgKG9sZF9leGMsIGNhY2hlX3BhdGgpCisgICAgICAgICkKKyAgICAgICAgZXJyLm1hbmFnZXIgICAgICAgID0gc2VsZgorICAgICAgICBlcnIuY2FjaGVfcGF0aCAgICAgPSBjYWNoZV9wYXRoCisgICAgICAgIGVyci5vcmlnaW5hbF9lcnJvciA9IG9sZF9leGMKKyAgICAgICAgcmFpc2UgZXJyCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgZGVmIGdldF9jYWNoZV9wYXRoKHNlbGYsIGFyY2hpdmVfbmFtZSwgbmFtZXM9KCkpOgorICAgICAgICAiIiJSZXR1cm4gYWJzb2x1dGUgbG9jYXRpb24gaW4gY2FjaGUgZm9yIGBhcmNoaXZlX25hbWVgIGFuZCBgbmFtZXNgCisKKyAgICAgICAgVGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIHJlc3VsdGluZyBwYXRoIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzCisgICAgICAgIG5vdCBhbHJlYWR5IGV4aXN0LiAgYGFyY2hpdmVfbmFtZWAgc2hvdWxkIGJlIHRoZSBiYXNlIGZpbGVuYW1lIG9mIHRoZQorICAgICAgICBlbmNsb3NpbmcgZWdnICh3aGljaCBtYXkgbm90IGJlIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgemlwZmlsZSEpLAorICAgICAgICBpbmNsdWRpbmcgaXRzICIuZWdnIiBleHRlbnNpb24uICBgbmFtZXNgLCBpZiBwcm92aWRlZCwgc2hvdWxkIGJlIGEKKyAgICAgICAgc2VxdWVuY2Ugb2YgcGF0aCBuYW1lIHBhcnRzICJ1bmRlciIgdGhlIGVnZydzIGV4dHJhY3Rpb24gbG9jYXRpb24uCisKKyAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHJlc291cmNlIHByb3ZpZGVycyB0aGF0IG5lZWQgdG8KKyAgICAgICAgb2J0YWluIGFuIGV4dHJhY3Rpb24gbG9jYXRpb24sIGFuZCBvbmx5IGZvciBuYW1lcyB0aGV5IGludGVuZCB0bworICAgICAgICBleHRyYWN0LCBhcyBpdCB0cmFja3MgdGhlIGdlbmVyYXRlZCBuYW1lcyBmb3IgcG9zc2libGUgY2xlYW51cCBsYXRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGV4dHJhY3RfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKKyAgICAgICAgdGFyZ2V0X3BhdGggPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9wYXRoLCBhcmNoaXZlX25hbWUrJy10bXAnLCAqbmFtZXMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0X3BhdGgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZXh0cmFjdGlvbl9lcnJvcigpCisKKyAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXNbdGFyZ2V0X3BhdGhdID0gMQorICAgICAgICByZXR1cm4gdGFyZ2V0X3BhdGgKKworCisgICAgZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIHRlbXBuYW1lLCBmaWxlbmFtZSk6CisgICAgICAgICIiIlBlcmZvcm0gYW55IHBsYXRmb3JtLXNwZWNpZmljIHBvc3Rwcm9jZXNzaW5nIG9mIGB0ZW1wbmFtZWAKKworICAgICAgICBUaGlzIGlzIHdoZXJlIE1hYyBoZWFkZXIgcmV3cml0ZXMgc2hvdWxkIGJlIGRvbmU7IG90aGVyIHBsYXRmb3JtcyBkb24ndAorICAgICAgICBoYXZlIGFueXRoaW5nIHNwZWNpYWwgdGhleSBzaG91bGQgZG8uCisKKyAgICAgICAgUmVzb3VyY2UgcHJvdmlkZXJzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIE9OTFkgYWZ0ZXIgc3VjY2Vzc2Z1bGx5CisgICAgICAgIGV4dHJhY3RpbmcgYSBjb21wcmVzc2VkIHJlc291cmNlLiAgVGhleSBtdXN0IE5PVCBjYWxsIGl0IG9uIHJlc291cmNlcworICAgICAgICB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBmaWxlc3lzdGVtLgorCisgICAgICAgIGB0ZW1wbmFtZWAgaXMgdGhlIGN1cnJlbnQgKHRlbXBvcmFyeSkgbmFtZSBvZiB0aGUgZmlsZSwgYW5kIGBmaWxlbmFtZWAKKyAgICAgICAgaXMgdGhlIG5hbWUgaXQgd2lsbCBiZSByZW5hbWVkIHRvIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdGhpcyByb3V0aW5lCisgICAgICAgIHJldHVybnMuCisgICAgICAgICIiIgorICAgICAgICAjIFhYWAorCisKKyAgICBkZWYgc2V0X2V4dHJhY3Rpb25fcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICAgIiIiU2V0IHRoZSBiYXNlIHBhdGggd2hlcmUgcmVzb3VyY2VzIHdpbGwgYmUgZXh0cmFjdGVkIHRvLCBpZiBuZWVkZWQuCisKKyAgICAgICAgSWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgcm91dGluZSBiZWZvcmUgYW55IGV4dHJhY3Rpb25zIHRha2UgcGxhY2UsIHRoZQorICAgICAgICBwYXRoIGRlZmF1bHRzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGBnZXRfZGVmYXVsdF9jYWNoZSgpYGAuICAoV2hpY2gKKyAgICAgICAgaXMgYmFzZWQgb24gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aXRoIHZhcmlvdXMKKyAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZmFsbGJhY2tzLiAgU2VlIHRoYXQgcm91dGluZSdzIGRvY3VtZW50YXRpb24gZm9yIG1vcmUKKyAgICAgICAgZGV0YWlscy4pCisKKyAgICAgICAgUmVzb3VyY2VzIGFyZSBleHRyYWN0ZWQgdG8gc3ViZGlyZWN0b3JpZXMgb2YgdGhpcyBwYXRoIGJhc2VkIHVwb24KKyAgICAgICAgaW5mb3JtYXRpb24gZ2l2ZW4gYnkgdGhlIGBgSVJlc291cmNlUHJvdmlkZXJgYC4gIFlvdSBtYXkgc2V0IHRoaXMgdG8gYQorICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBidXQgdGhlbiB5b3UgbXVzdCBjYWxsIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHRvCisgICAgICAgIGRlbGV0ZSB0aGUgZXh0cmFjdGVkIGZpbGVzIHdoZW4gZG9uZS4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0CisgICAgICAgIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHdpbGwgYmUgYWJsZSB0byByZW1vdmUgYWxsIGV4dHJhY3RlZCBmaWxlcy4KKworICAgICAgICAoTm90ZTogeW91IG1heSBub3QgY2hhbmdlIHRoZSBleHRyYWN0aW9uIHBhdGggZm9yIGEgZ2l2ZW4gcmVzb3VyY2UKKyAgICAgICAgbWFuYWdlciBvbmNlIHJlc291cmNlcyBoYXZlIGJlZW4gZXh0cmFjdGVkLCB1bmxlc3MgeW91IGZpcnN0IGNhbGwKKyAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAuKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jYWNoZWRfZmlsZXM6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICJDYW4ndCBjaGFuZ2UgZXh0cmFjdGlvbiBwYXRoLCBmaWxlcyBhbHJlYWR5IGV4dHJhY3RlZCIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmV4dHJhY3Rpb25fcGF0aCA9IHBhdGgKKworICAgIGRlZiBjbGVhbnVwX3Jlc291cmNlcyhzZWxmLCBmb3JjZT1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBEZWxldGUgYWxsIGV4dHJhY3RlZCByZXNvdXJjZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIHJldHVybmluZyBhIGxpc3QKKyAgICAgICAgb2YgdGhlIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0aGF0IGNvdWxkIG5vdCBiZSBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KKyAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBjb25jdXJyZW5jeSBwcm90ZWN0aW9uLCBzbyBpdCBzaG91bGQKKyAgICAgICAgZ2VuZXJhbGx5IG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGV4dHJhY3Rpb24gcGF0aCBpcyBhIHRlbXBvcmFyeQorICAgICAgICBkaXJlY3RvcnkgZXhjbHVzaXZlIHRvIGEgc2luZ2xlIHByb2Nlc3MuICBUaGlzIG1ldGhvZCBpcyBub3QKKyAgICAgICAgYXV0b21hdGljYWxseSBjYWxsZWQ7IHlvdSBtdXN0IGNhbGwgaXQgZXhwbGljaXRseSBvciByZWdpc3RlciBpdCBhcyBhbgorICAgICAgICBgYGF0ZXhpdGBgIGZ1bmN0aW9uIGlmIHlvdSB3aXNoIHRvIGVuc3VyZSBjbGVhbnVwIG9mIGEgdGVtcG9yYXJ5CisgICAgICAgIGRpcmVjdG9yeSB1c2VkIGZvciBleHRyYWN0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgICMgWFhYCisKKworCitkZWYgZ2V0X2RlZmF1bHRfY2FjaGUoKToKKyAgICAiIiJEZXRlcm1pbmUgdGhlIGRlZmF1bHQgY2FjaGUgbG9jYXRpb24KKworICAgIFRoaXMgcmV0dXJucyB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHNldC4KKyAgICBPdGhlcndpc2UsIG9uIFdpbmRvd3MsIGl0IHJldHVybnMgYSAiUHl0aG9uLUVnZ3MiIHN1YmRpcmVjdG9yeSBvZiB0aGUKKyAgICAiQXBwbGljYXRpb24gRGF0YSIgZGlyZWN0b3J5LiAgT24gYWxsIG90aGVyIHN5c3RlbXMsIGl0J3MgIn4vLnB5dGhvbi1lZ2dzIi4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBvcy5lbnZpcm9uWydQWVRIT05fRUdHX0NBQ0hFJ10KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHBhc3MKKworICAgIGlmIG9zLm5hbWUhPSdudCc6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vLnB5dGhvbi1lZ2dzJykKKworICAgIGFwcF9kYXRhID0gJ0FwcGxpY2F0aW9uIERhdGEnICAgIyBYWFggdGhpcyBtYXkgYmUgbG9jYWxlLXNwZWNpZmljIQorICAgIGFwcF9ob21lcyA9IFsKKyAgICAgICAgKCgnQVBQREFUQScsKSwgTm9uZSksICAgICAgICMgYmVzdCBvcHRpb24sIHNob3VsZCBiZSBsb2NhbGUtc2FmZQorICAgICAgICAoKCdVU0VSUFJPRklMRScsKSwgYXBwX2RhdGEpLAorICAgICAgICAoKCdIT01FRFJJVkUnLCdIT01FUEFUSCcpLCBhcHBfZGF0YSksCisgICAgICAgICgoJ0hPTUVQQVRIJywpLCBhcHBfZGF0YSksCisgICAgICAgICgoJ0hPTUUnLCksIE5vbmUpLAorICAgICAgICAoKCdXSU5ESVInLCksIGFwcF9kYXRhKSwgICAgIyA5NS85OC9NRQorICAgIF0KKworICAgIGZvciBrZXlzLCBzdWJkaXIgaW4gYXBwX2hvbWVzOgorICAgICAgICBkaXJuYW1lID0gJycKKyAgICAgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICAgICAgaWYga2V5IGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uW2tleV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzdWJkaXI6CisgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLHN1YmRpcikKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZGlybmFtZSwgJ1B5dGhvbi1FZ2dzJykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgICAiUGxlYXNlIHNldCB0aGUgUFlUSE9OX0VHR19DQUNIRSBlbnZpcm9tZW50IHZhcmlhYmxlIgorICAgICAgICApCisKK2RlZiBzYWZlX25hbWUobmFtZSk6CisgICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIG5hbWUKKworICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMvLiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4KKyAgICAiIiIKKyAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgbmFtZSkKKworCitkZWYgc2FmZV92ZXJzaW9uKHZlcnNpb24pOgorICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIHZlcnNpb24gc3RyaW5nCisKKyAgICBTcGFjZXMgYmVjb21lIGRvdHMsIGFuZCBhbGwgb3RoZXIgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGJlY29tZQorICAgIGRhc2hlcywgd2l0aCBydW5zIG9mIG11bHRpcGxlIGRhc2hlcyBjb25kZW5zZWQgdG8gYSBzaW5nbGUgZGFzaC4KKyAgICAiIiIKKyAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCcgJywnLicpCisgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIHZlcnNpb24pCisKKworZGVmIHNhZmVfZXh0cmEoZXh0cmEpOgorICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkICdleHRyYScgbmFtZQorCisgICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICdfJywKKyAgICBhbmQgdGhlIHJlc3VsdCBpcyBhbHdheXMgbG93ZXJjYXNlZC4KKyAgICAiIiIKKyAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICdfJywgZXh0cmEpLmxvd2VyKCkKKworCitkZWYgdG9fZmlsZW5hbWUobmFtZSk6CisgICAgIiIiQ29udmVydCBhIHByb2plY3Qgb3IgdmVyc2lvbiBuYW1lIHRvIGl0cyBmaWxlbmFtZS1lc2NhcGVkIGZvcm0KKworICAgIEFueSAnLScgY2hhcmFjdGVycyBhcmUgY3VycmVudGx5IHJlcGxhY2VkIHdpdGggJ18nLgorICAgICIiIgorICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJy0nLCdfJykKKworCisKKworCisKKworCitjbGFzcyBOdWxsUHJvdmlkZXI6CisgICAgIiIiVHJ5IHRvIGltcGxlbWVudCByZXNvdXJjZXMgYW5kIG1ldGFkYXRhIGZvciBhcmJpdHJhcnkgUEVQIDMwMiBsb2FkZXJzIiIiCisKKyAgICBlZ2dfbmFtZSA9IE5vbmUKKyAgICBlZ2dfaW5mbyA9IE5vbmUKKyAgICBsb2FkZXIgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKKyAgICAgICAgc2VsZi5sb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQorICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5kaXJuYW1lKGdldGF0dHIobW9kdWxlLCAnX19maWxlX18nLCAnJykpCisKKyAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkKKworICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gU3RyaW5nSU8oc2VsZi5nZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpKQorCisgICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9nZXQoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCisKKyAgICBkZWYgaGFzX3Jlc291cmNlKHNlbGYsIHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQorCisgICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8gYW5kIHNlbGYuX2hhcyhzZWxmLl9mbihzZWxmLmVnZ19pbmZvLG5hbWUpKQorCisgICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbm90IHNlbGYuZWdnX2luZm86CisgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldChzZWxmLl9mbihzZWxmLmVnZ19pbmZvLG5hbWUpKQorCisgICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQorCisgICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYscmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKKworICAgIGRlZiBtZXRhZGF0YV9pc2RpcihzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbyxuYW1lKSkKKworCisgICAgZGVmIHJlc291cmNlX2xpc3RkaXIoc2VsZixyZXNvdXJjZV9uYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCxyZXNvdXJjZV9uYW1lKSkKKworICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKHNlbGYsbmFtZSk6CisgICAgICAgIGlmIHNlbGYuZWdnX2luZm86CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLG5hbWUpKQorICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsc2NyaXB0X25hbWUsbmFtZXNwYWNlKToKKyAgICAgICAgc2NyaXB0ID0gJ3NjcmlwdHMvJytzY3JpcHRfbmFtZQorICAgICAgICBpZiBub3Qgc2VsZi5oYXNfbWV0YWRhdGEoc2NyaXB0KToKKyAgICAgICAgICAgIHJhaXNlIFJlc29sdXRpb25FcnJvcigiTm8gc2NyaXB0IG5hbWVkICVyIiAlIHNjcmlwdF9uYW1lKQorICAgICAgICBzY3JpcHRfdGV4dCA9IHNlbGYuZ2V0X21ldGFkYXRhKHNjcmlwdCkucmVwbGFjZSgnXHJcbicsJ1xuJykKKyAgICAgICAgc2NyaXB0X3RleHQgPSBzY3JpcHRfdGV4dC5yZXBsYWNlKCdccicsJ1xuJykKKyAgICAgICAgc2NyaXB0X2ZpbGVuYW1lID0gc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbyxzY3JpcHQpCisgICAgICAgIG5hbWVzcGFjZVsnX19maWxlX18nXSA9IHNjcmlwdF9maWxlbmFtZQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzY3JpcHRfZmlsZW5hbWUpOgorICAgICAgICAgICAgZXhlY2ZpbGUoc2NyaXB0X2ZpbGVuYW1lLCBuYW1lc3BhY2UsIG5hbWVzcGFjZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZyb20gbGluZWNhY2hlIGltcG9ydCBjYWNoZQorICAgICAgICAgICAgY2FjaGVbc2NyaXB0X2ZpbGVuYW1lXSA9ICgKKyAgICAgICAgICAgICAgICBsZW4oc2NyaXB0X3RleHQpLCAwLCBzY3JpcHRfdGV4dC5zcGxpdCgnXG4nKSwgc2NyaXB0X2ZpbGVuYW1lCisgICAgICAgICAgICApCisgICAgICAgICAgICBzY3JpcHRfY29kZSA9IGNvbXBpbGUoc2NyaXB0X3RleHQsc2NyaXB0X2ZpbGVuYW1lLCdleGVjJykKKyAgICAgICAgICAgIGV4ZWMgc2NyaXB0X2NvZGUgaW4gbmFtZXNwYWNlLCBuYW1lc3BhY2UKKworICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKKyAgICAgICAgKQorCisgICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCisgICAgICAgICkKKworICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCisgICAgICAgICkKKworICAgIGRlZiBfZm4oc2VsZiwgYmFzZSwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oYmFzZSwgKnJlc291cmNlX25hbWUuc3BsaXQoJy8nKSkKKworICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYubG9hZGVyLCAnZ2V0X2RhdGEnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5nZXRfZGF0YShwYXRoKQorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIGxvYWRlcnMgd2l0aG91dCAnZ2V0X2RhdGEoKSciCisgICAgICAgICkKKworcmVnaXN0ZXJfbG9hZGVyX3R5cGUob2JqZWN0LCBOdWxsUHJvdmlkZXIpCisKKworY2xhc3MgRWdnUHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKKyAgICAiIiJQcm92aWRlciBiYXNlZCBvbiBhIHZpcnR1YWwgZmlsZXN5c3RlbSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsbW9kdWxlKToKKyAgICAgICAgTnVsbFByb3ZpZGVyLl9faW5pdF9fKHNlbGYsbW9kdWxlKQorICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQorCisgICAgZGVmIF9zZXR1cF9wcmVmaXgoc2VsZik6CisgICAgICAgICMgd2UgYXNzdW1lIGhlcmUgdGhhdCBvdXIgbWV0YWRhdGEgbWF5IGJlIG5lc3RlZCBpbnNpZGUgYSAiYmFza2V0IgorICAgICAgICAjIG9mIG11bHRpcGxlIGVnZ3M7IHRoYXQncyB3aHkgd2UgdXNlIG1vZHVsZV9wYXRoIGluc3RlYWQgb2YgLmFyY2hpdmUKKyAgICAgICAgcGF0aCA9IHNlbGYubW9kdWxlX3BhdGgKKyAgICAgICAgb2xkID0gTm9uZQorICAgICAgICB3aGlsZSBwYXRoIT1vbGQ6CisgICAgICAgICAgICBpZiBwYXRoLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKToKKyAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQorICAgICAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ0VHRy1JTkZPJykKKyAgICAgICAgICAgICAgICBzZWxmLmVnZ19yb290ID0gcGF0aAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBvbGQgPSBwYXRoCisgICAgICAgICAgICBwYXRoLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQorCisKKworCisKKworCisKK2NsYXNzIERlZmF1bHRQcm92aWRlcihFZ2dQcm92aWRlcik6CisgICAgIiIiUHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIGluIHRoZSBmaWxlc3lzdGVtIiIiCisKKyAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHBhdGgpCisKKyAgICBkZWYgX2lzZGlyKHNlbGYscGF0aCk6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKHBhdGgpCisKKyAgICBkZWYgX2xpc3RkaXIoc2VsZixwYXRoKToKKyAgICAgICAgcmV0dXJuIG9zLmxpc3RkaXIocGF0aCkKKworICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gb3BlbihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSwgJ3JiJykKKworICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgorICAgICAgICBzdHJlYW0gPSBvcGVuKHBhdGgsICdyYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQorCityZWdpc3Rlcl9sb2FkZXJfdHlwZSh0eXBlKE5vbmUpLCBEZWZhdWx0UHJvdmlkZXIpCisKKworY2xhc3MgRW1wdHlQcm92aWRlcihOdWxsUHJvdmlkZXIpOgorICAgICIiIlByb3ZpZGVyIHRoYXQgcmV0dXJucyBub3RoaW5nIGZvciBhbGwgcmVxdWVzdHMiIiIKKworICAgIF9pc2RpciA9IF9oYXMgPSBsYW1iZGEgc2VsZixwYXRoOiBGYWxzZQorICAgIF9nZXQgICAgICAgICAgPSBsYW1iZGEgc2VsZixwYXRoOiAnJworICAgIF9saXN0ZGlyICAgICAgPSBsYW1iZGEgc2VsZixwYXRoOiBbXQorICAgIG1vZHVsZV9wYXRoICAgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworZW1wdHlfcHJvdmlkZXIgPSBFbXB0eVByb3ZpZGVyKCkKKworCisKKworY2xhc3MgWmlwUHJvdmlkZXIoRWdnUHJvdmlkZXIpOgorICAgICIiIlJlc291cmNlIHN1cHBvcnQgZm9yIHppcHMgYW5kIGVnZ3MiIiIKKworICAgIGVhZ2VycyA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgorICAgICAgICBFZ2dQcm92aWRlci5fX2luaXRfXyhzZWxmLG1vZHVsZSkKKyAgICAgICAgc2VsZi56aXBpbmZvID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW3NlbGYubG9hZGVyLmFyY2hpdmVdCisgICAgICAgIHNlbGYuemlwX3ByZSA9IHNlbGYubG9hZGVyLmFyY2hpdmUrb3Muc2VwCisKKyAgICBkZWYgX3ppcGluZm9fbmFtZShzZWxmLCBmc3BhdGgpOgorICAgICAgICAjIENvbnZlcnQgYSB2aXJ0dWFsIGZpbGVuYW1lIChmdWxsIHBhdGggdG8gZmlsZSkgaW50byBhIHppcGZpbGUgc3VicGF0aAorICAgICAgICAjIHVzYWJsZSB3aXRoIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5IGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKKyAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi56aXBfcHJlKToKKyAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuemlwX3ByZSk6XQorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKKyAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsc2VsZi56aXBfcHJlKQorICAgICAgICApCisKKyAgICBkZWYgX3BhcnRzKHNlbGYsemlwX3BhdGgpOgorICAgICAgICAjIENvbnZlcnQgYSB6aXBmaWxlIHN1YnBhdGggaW50byBhbiBlZ2ctcmVsYXRpdmUgcGF0aCBwYXJ0IGxpc3QKKyAgICAgICAgZnNwYXRoID0gc2VsZi56aXBfcHJlK3ppcF9wYXRoICAjIHBzZXVkby1mcyBwYXRoCisgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3Qrb3Muc2VwKToKKyAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuZWdnX3Jvb3QpKzE6XS5zcGxpdChvcy5zZXApCisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCxzZWxmLmVnZ19yb290KQorICAgICAgICApCisKKyAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfbmFtZToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAgICAgInJlc291cmNlX2ZpbGVuYW1lKCkgb25seSBzdXBwb3J0ZWQgZm9yIC5lZ2csIG5vdCAuemlwIgorICAgICAgICAgICAgKQorICAgICAgICAjIG5vIG5lZWQgdG8gbG9jayBmb3IgZXh0cmFjdGlvbiwgc2luY2Ugd2UgdXNlIHRlbXAgbmFtZXMKKyAgICAgICAgemlwX3BhdGggPSBzZWxmLl9yZXNvdXJjZV90b196aXAocmVzb3VyY2VfbmFtZSkKKyAgICAgICAgZWFnZXJzID0gc2VsZi5fZ2V0X2VhZ2VyX3Jlc291cmNlcygpCisgICAgICAgIGlmICcvJy5qb2luKHNlbGYuX3BhcnRzKHppcF9wYXRoKSkgaW4gZWFnZXJzOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gZWFnZXJzOgorICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UobWFuYWdlciwgc2VsZi5fZWFnZXJfdG9femlwKG5hbWUpKQorICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCB6aXBfcGF0aCkKKworICAgIGRlZiBfZXh0cmFjdF9yZXNvdXJjZShzZWxmLCBtYW5hZ2VyLCB6aXBfcGF0aCk6CisKKyAgICAgICAgaWYgemlwX3BhdGggaW4gc2VsZi5faW5kZXgoKToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuX2luZGV4KClbemlwX3BhdGhdOgorICAgICAgICAgICAgICAgIGxhc3QgPSBzZWxmLl9leHRyYWN0X3Jlc291cmNlKAorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLCBvcy5wYXRoLmpvaW4oemlwX3BhdGgsIG5hbWUpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguZGlybmFtZShsYXN0KSAgIyByZXR1cm4gdGhlIGV4dHJhY3RlZCBkaXJlY3RvcnkgbmFtZQorCisgICAgICAgIHppcF9zdGF0ID0gc2VsZi56aXBpbmZvW3ppcF9wYXRoXQorICAgICAgICB0LGQsc2l6ZSA9IHppcF9zdGF0WzVdLCB6aXBfc3RhdFs2XSwgemlwX3N0YXRbM10KKyAgICAgICAgZGF0ZV90aW1lID0gKAorICAgICAgICAgICAgKGQ+PjkpKzE5ODAsIChkPj41KSYweEYsIGQmMHgxRiwgICAgICAgICAgICAgICAgICAgICAgIyB5bWQKKyAgICAgICAgICAgICh0JjB4RkZGRik+PjExLCAodD4+NSkmMHgzRiwgKHQmMHgxRikgKiAyLCAwLCAwLCAtMSAgICMgaG1zLCBldGMuCisgICAgICAgICkKKyAgICAgICAgdGltZXN0YW1wID0gdGltZS5ta3RpbWUoZGF0ZV90aW1lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlYWxfcGF0aCA9IG1hbmFnZXIuZ2V0X2NhY2hlX3BhdGgoCisgICAgICAgICAgICAgICAgc2VsZi5lZ2dfbmFtZSwgc2VsZi5fcGFydHMoemlwX3BhdGgpCisgICAgICAgICAgICApCisKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHJlYWxfcGF0aCk6CisgICAgICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQocmVhbF9wYXRoKQorICAgICAgICAgICAgICAgIGlmIHN0YXQuc3Rfc2l6ZT09c2l6ZSBhbmQgc3RhdC5zdF9tdGltZT09dGltZXN0YW1wOgorICAgICAgICAgICAgICAgICAgICAjIHNpemUgYW5kIHN0YW1wIG1hdGNoLCBkb24ndCBib3RoZXIgZXh0cmFjdGluZworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCisKKyAgICAgICAgICAgIG91dGYsIHRtcG5hbSA9IF9ta3N0ZW1wKCIuJGV4dHJhY3QiLCBkaXI9b3MucGF0aC5kaXJuYW1lKHJlYWxfcGF0aCkpCisgICAgICAgICAgICBvcy53cml0ZShvdXRmLCBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkpCisgICAgICAgICAgICBvcy5jbG9zZShvdXRmKQorICAgICAgICAgICAgdXRpbWUodG1wbmFtLCAodGltZXN0YW1wLHRpbWVzdGFtcCkpCisgICAgICAgICAgICBtYW5hZ2VyLnBvc3Rwcm9jZXNzKHRtcG5hbSwgcmVhbF9wYXRoKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQorCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocmVhbF9wYXRoKToKKyAgICAgICAgICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQocmVhbF9wYXRoKQorCisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXQuc3Rfc2l6ZT09c2l6ZSBhbmQgc3RhdC5zdF9tdGltZT09dGltZXN0YW1wOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzaXplIGFuZCBzdGFtcCBtYXRjaCwgc29tZWJvZHkgZGlkIGl0IGp1c3QgYWhlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdXMsIHNvIHdlJ3JlIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBvcy5uYW1lPT0nbnQnOiAgICAgIyBXaW5kb3dzLCBkZWwgb2xkIGZpbGUgYW5kIHJldHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmsocmVhbF9wYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgbWFuYWdlci5leHRyYWN0aW9uX2Vycm9yKCkgICMgcmVwb3J0IGEgdXNlci1mcmllbmRseSBlcnJvcgorCisgICAgICAgIHJldHVybiByZWFsX3BhdGgKKworICAgIGRlZiBfZ2V0X2VhZ2VyX3Jlc291cmNlcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5lYWdlcnMgaXMgTm9uZToKKyAgICAgICAgICAgIGVhZ2VycyA9IFtdCisgICAgICAgICAgICBmb3IgbmFtZSBpbiAoJ25hdGl2ZV9saWJzLnR4dCcsICdlYWdlcl9yZXNvdXJjZXMudHh0Jyk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CisgICAgICAgICAgICAgICAgICAgIGVhZ2Vycy5leHRlbmQoc2VsZi5nZXRfbWV0YWRhdGFfbGluZXMobmFtZSkpCisgICAgICAgICAgICBzZWxmLmVhZ2VycyA9IGVhZ2VycworICAgICAgICByZXR1cm4gc2VsZi5lYWdlcnMKKworICAgIGRlZiBfaW5kZXgoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kaXJpbmRleAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBpbmQgPSB7fQorICAgICAgICAgICAgZm9yIHBhdGggaW4gc2VsZi56aXBpbmZvOgorICAgICAgICAgICAgICAgIHBhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCisgICAgICAgICAgICAgICAgd2hpbGUgcGFydHM6CisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IG9zLnNlcC5qb2luKHBhcnRzWzotMV0pCisgICAgICAgICAgICAgICAgICAgIGlmIHBhcmVudCBpbiBpbmQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XS5hcHBlbmQocGFydHNbLTFdKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdID0gW3BhcnRzLnBvcCgpXQorICAgICAgICAgICAgc2VsZi5fZGlyaW5kZXggPSBpbmQKKyAgICAgICAgICAgIHJldHVybiBpbmQKKworICAgIGRlZiBfaGFzKHNlbGYsIGZzcGF0aCk6CisgICAgICAgIHppcF9wYXRoID0gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkKKyAgICAgICAgcmV0dXJuIHppcF9wYXRoIGluIHNlbGYuemlwaW5mbyBvciB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpCisKKyAgICBkZWYgX2lzZGlyKHNlbGYsZnNwYXRoKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpIGluIHNlbGYuX2luZGV4KCkKKworICAgIGRlZiBfbGlzdGRpcihzZWxmLGZzcGF0aCk6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuX2luZGV4KCkuZ2V0KHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpLCAoKSkpCisKKyAgICBkZWYgX2VhZ2VyX3RvX3ppcChzZWxmLHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYuZWdnX3Jvb3QscmVzb3VyY2VfbmFtZSkpCisKKyAgICBkZWYgX3Jlc291cmNlX3RvX3ppcChzZWxmLHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgscmVzb3VyY2VfbmFtZSkpCisKK3JlZ2lzdGVyX2xvYWRlcl90eXBlKHppcGltcG9ydC56aXBpbXBvcnRlciwgWmlwUHJvdmlkZXIpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBGaWxlTWV0YWRhdGEoRW1wdHlQcm92aWRlcik6CisgICAgIiIiTWV0YWRhdGEgaGFuZGxlciBmb3Igc3RhbmRhbG9uZSBQS0ctSU5GTyBmaWxlcworCisgICAgVXNhZ2U6OgorCisgICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKCIvcGF0aC90by9QS0ctSU5GTyIpCisKKyAgICBUaGlzIHByb3ZpZGVyIHJlamVjdHMgYWxsIGRhdGEgYW5kIG1ldGFkYXRhIHJlcXVlc3RzIGV4Y2VwdCBmb3IgUEtHLUlORk8sCisgICAgd2hpY2ggaXMgdHJlYXRlZCBhcyBleGlzdGluZywgYW5kIHdpbGwgYmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0CisgICAgdGhlIHByb3ZpZGVkIGxvY2F0aW9uLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYscGF0aCk6CisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKworICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZixuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWU9PSdQS0ctSU5GTycKKworICAgIGRlZiBnZXRfbWV0YWRhdGEoc2VsZixuYW1lKToKKyAgICAgICAgaWYgbmFtZT09J1BLRy1JTkZPJzoKKyAgICAgICAgICAgIHJldHVybiBvcGVuKHNlbGYucGF0aCwnclUnKS5yZWFkKCkKKyAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIG1ldGFkYXRhIGV4Y2VwdCBQS0ctSU5GTyBpcyBhdmFpbGFibGUiKQorCisgICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIFBhdGhNZXRhZGF0YShEZWZhdWx0UHJvdmlkZXIpOgorICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciBlZ2cgZGlyZWN0b3JpZXMKKworICAgIFVzYWdlOjoKKworICAgICAgICAjIERldmVsb3BtZW50IGVnZ3M6CisKKyAgICAgICAgZWdnX2luZm8gPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUuZWdnLWluZm8iCisgICAgICAgIGJhc2VfZGlyID0gb3MucGF0aC5kaXJuYW1lKGVnZ19pbmZvKQorICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShiYXNlX2RpciwgZWdnX2luZm8pCisgICAgICAgIGRpc3RfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShlZ2dfaW5mbykpWzBdCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYmFzZWRpcixwcm9qZWN0X25hbWU9ZGlzdF9uYW1lLG1ldGFkYXRhPW1ldGFkYXRhKQorCisgICAgICAgICMgVW5wYWNrZWQgZWdnIGRpcmVjdG9yaWVzOgorCisgICAgICAgIGVnZ19wYXRoID0gIi9wYXRoL3RvL1BhY2thZ2VOYW1lLXZlci1weXZlci1ldGMuZWdnIgorICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCwgb3MucGF0aC5qb2luKGVnZ19wYXRoLCdFR0ctSU5GTycpKQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoZWdnX3BhdGgsIG1ldGFkYXRhPW1ldGFkYXRhKQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBlZ2dfaW5mbyk6CisgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBwYXRoCisgICAgICAgIHNlbGYuZWdnX2luZm8gPSBlZ2dfaW5mbworCisKK2NsYXNzIEVnZ01ldGFkYXRhKFppcFByb3ZpZGVyKToKKyAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgLmVnZyBmaWxlcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGltcG9ydGVyKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbWV0YWRhdGEgcHJvdmlkZXIgZnJvbSBhIHppcGltcG9ydGVyIiIiCisKKyAgICAgICAgc2VsZi56aXBpbmZvID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW2ltcG9ydGVyLmFyY2hpdmVdCisgICAgICAgIHNlbGYuemlwX3ByZSA9IGltcG9ydGVyLmFyY2hpdmUrb3Muc2VwCisgICAgICAgIHNlbGYubG9hZGVyID0gaW1wb3J0ZXIKKyAgICAgICAgaWYgaW1wb3J0ZXIucHJlZml4OgorICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguam9pbihpbXBvcnRlci5hcmNoaXZlLCBpbXBvcnRlci5wcmVmaXgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gaW1wb3J0ZXIuYXJjaGl2ZQorICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQorCisKKworX2Rpc3RyaWJ1dGlvbl9maW5kZXJzID0ge30KKworZGVmIHJlZ2lzdGVyX2ZpbmRlcihpbXBvcnRlcl90eXBlLCBkaXN0cmlidXRpb25fZmluZGVyKToKKyAgICAiIiJSZWdpc3RlciBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgdG8gZmluZCBkaXN0cmlidXRpb25zIGluIHN5cy5wYXRoIGl0ZW1zCisKKyAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KKyAgICBoYW5kbGVyKSwgYW5kIGBkaXN0cmlidXRpb25fZmluZGVyYCBpcyBhIGNhbGxhYmxlIHRoYXQsIHBhc3NlZCBhIHBhdGgKKyAgICBpdGVtIGFuZCB0aGUgaW1wb3J0ZXIgaW5zdGFuY2UsIHlpZWxkcyBgYERpc3RyaWJ1dGlvbmBgIGluc3RhbmNlcyBmb3VuZCBvbgorICAgIHRoYXQgcGF0aCBpdGVtLiAgU2VlIGBgcGtnX3Jlc291cmNlcy5maW5kX29uX3BhdGhgYCBmb3IgYW4gZXhhbXBsZS4iIiIKKyAgICBfZGlzdHJpYnV0aW9uX2ZpbmRlcnNbaW1wb3J0ZXJfdHlwZV0gPSBkaXN0cmlidXRpb25fZmluZGVyCisKKworZGVmIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgorICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSB2aWEgYHBhdGhfaXRlbWAiIiIKKyAgICBpbXBvcnRlciA9IGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pCisgICAgZmluZGVyID0gX2ZpbmRfYWRhcHRlcihfZGlzdHJpYnV0aW9uX2ZpbmRlcnMsIGltcG9ydGVyKQorICAgIHJldHVybiBmaW5kZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSkKKworZGVmIGZpbmRfaW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgorICAgIG1ldGFkYXRhID0gRWdnTWV0YWRhdGEoaW1wb3J0ZXIpCisgICAgaWYgbWV0YWRhdGEuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgorICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShwYXRoX2l0ZW0sIG1ldGFkYXRhPW1ldGFkYXRhKQorICAgIGlmIG9ubHk6CisgICAgICAgIHJldHVybiAgIyBkb24ndCB5aWVsZCBuZXN0ZWQgZGlzdHJvcworICAgIGZvciBzdWJpdGVtIGluIG1ldGFkYXRhLnJlc291cmNlX2xpc3RkaXIoJy8nKToKKyAgICAgICAgaWYgc3ViaXRlbS5lbmRzd2l0aCgnLmVnZycpOgorICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCisgICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2luX3ppcCh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoc3VicGF0aCksIHN1YnBhdGgpOgorICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKKworcmVnaXN0ZXJfZmluZGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmluZF9pbl96aXApCisKK2RlZiBTdHJpbmdJTygqYXJncywgKiprdyk6CisgICAgIiIiVGh1bmsgdG8gbG9hZCB0aGUgcmVhbCBTdHJpbmdJTyBvbiBkZW1hbmQiIiIKKyAgICBnbG9iYWwgU3RyaW5nSU8KKyAgICB0cnk6CisgICAgICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICByZXR1cm4gU3RyaW5nSU8oKmFyZ3MsKiprdykKKworZGVmIGZpbmRfbm90aGluZyhpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKKyAgICByZXR1cm4gKCkKK3JlZ2lzdGVyX2ZpbmRlcihvYmplY3QsZmluZF9ub3RoaW5nKQorCitkZWYgZmluZF9vbl9wYXRoKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgorICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSBvbiBhIHN5cy5wYXRoIGRpcmVjdG9yeSIiIgorICAgIHBhdGhfaXRlbSA9IF9ub3JtYWxpemVfY2FjaGVkKHBhdGhfaXRlbSkKKworICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aF9pdGVtKToKKyAgICAgICAgaWYgcGF0aF9pdGVtLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKToKKyAgICAgICAgICAgICMgdW5wYWNrZWQgZWdnCisgICAgICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKKyAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIG1ldGFkYXRhPVBhdGhNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCdFR0ctSU5GTycpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBzY2FuIGZvciAuZWdnIGFuZCAuZWdnLWluZm8gaW4gZGlyZWN0b3J5CisgICAgICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihwYXRoX2l0ZW0pOgorICAgICAgICAgICAgICAgIGxvd2VyID0gZW50cnkubG93ZXIoKQorICAgICAgICAgICAgICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKKyAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBlbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxscGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGVnZy1pbmZvIGRpcmVjdG9yeSwgYWxsb3cgZ2V0dGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEocGF0aF9pdGVtLCBmdWxscGF0aCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKGZ1bGxwYXRoKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfaXRlbSxlbnRyeSxtZXRhZGF0YSxwcmVjZWRlbmNlPURFVkVMT1BfRElTVAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZWxpZiBub3Qgb25seSBhbmQgbG93ZXIuZW5kc3dpdGgoJy5lZ2cnKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KSk6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CisgICAgICAgICAgICAgICAgZWxpZiBub3Qgb25seSBhbmQgbG93ZXIuZW5kc3dpdGgoJy5lZ2ctbGluaycpOgorICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmaWxlKG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdHJpcCgpOiBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZmluZF9kaXN0cmlidXRpb25zKGxpbmUucnN0cmlwKCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KKworcmVnaXN0ZXJfZmluZGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbmRfb25fcGF0aCkKKworX25hbWVzcGFjZV9oYW5kbGVycyA9IHt9CitfbmFtZXNwYWNlX3BhY2thZ2VzID0ge30KKworZGVmIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyX3R5cGUsIG5hbWVzcGFjZV9oYW5kbGVyKToKKyAgICAiIiJSZWdpc3RlciBgbmFtZXNwYWNlX2hhbmRsZXJgIHRvIGRlY2xhcmUgbmFtZXNwYWNlIHBhY2thZ2VzCisKKyAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KKyAgICBoYW5kbGVyKSwgYW5kIGBuYW1lc3BhY2VfaGFuZGxlcmAgaXMgYSBjYWxsYWJsZSBsaWtlIHRoaXM6OgorCisgICAgICAgIGRlZiBuYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlcixwYXRoX2VudHJ5LG1vZHVsZU5hbWUsbW9kdWxlKToKKyAgICAgICAgICAgICMgcmV0dXJuIGEgcGF0aF9lbnRyeSB0byB1c2UgZm9yIGNoaWxkIHBhY2thZ2VzCisKKyAgICBOYW1lc3BhY2UgaGFuZGxlcnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBpbXBvcnRlciBvYmplY3QgaGFzIGFscmVhZHkKKyAgICBhZ3JlZWQgdGhhdCBpdCBjYW4gaGFuZGxlIHRoZSByZWxldmFudCBwYXRoIGl0ZW0sIGFuZCB0aGV5IHNob3VsZCBvbmx5CisgICAgcmV0dXJuIGEgc3VicGF0aCBpZiB0aGUgbW9kdWxlIF9fcGF0aF9fIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhbgorICAgIGVxdWl2YWxlbnQgc3VicGF0aC4gIEZvciBhbiBleGFtcGxlIG5hbWVzcGFjZSBoYW5kbGVyLCBzZWUKKyAgICBgYHBrZ19yZXNvdXJjZXMuZmlsZV9uc19oYW5kbGVyYGAuCisgICAgIiIiCisgICAgX25hbWVzcGFjZV9oYW5kbGVyc1tpbXBvcnRlcl90eXBlXSA9IG5hbWVzcGFjZV9oYW5kbGVyCisKK2RlZiBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pOgorICAgICIiIkVuc3VyZSB0aGF0IG5hbWVkIHBhY2thZ2UgaW5jbHVkZXMgYSBzdWJwYXRoIG9mIHBhdGhfaXRlbSAoaWYgbmVlZGVkKSIiIgorICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKKyAgICBpZiBpbXBvcnRlciBpcyBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKHBhY2thZ2VOYW1lKQorICAgIGlmIGxvYWRlciBpcyBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzLmdldChwYWNrYWdlTmFtZSkKKyAgICBpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdID0gbmV3Lm1vZHVsZShwYWNrYWdlTmFtZSkKKyAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gW107IF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKQorICAgIGVsaWYgbm90IGhhc2F0dHIobW9kdWxlLCdfX3BhdGhfXycpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFja2FnZU5hbWUpCisgICAgaGFuZGxlciA9IF9maW5kX2FkYXB0ZXIoX25hbWVzcGFjZV9oYW5kbGVycywgaW1wb3J0ZXIpCisgICAgc3VicGF0aCA9IGhhbmRsZXIoaW1wb3J0ZXIscGF0aF9pdGVtLHBhY2thZ2VOYW1lLG1vZHVsZSkKKyAgICBpZiBzdWJwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICBwYXRoID0gbW9kdWxlLl9fcGF0aF9fOyBwYXRoLmFwcGVuZChzdWJwYXRoKQorICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUocGFja2FnZU5hbWUpOyBtb2R1bGUuX19wYXRoX18gPSBwYXRoCisgICAgcmV0dXJuIHN1YnBhdGgKKworZGVmIGRlY2xhcmVfbmFtZXNwYWNlKHBhY2thZ2VOYW1lKToKKyAgICAiIiJEZWNsYXJlIHRoYXQgcGFja2FnZSAncGFja2FnZU5hbWUnIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UiIiIKKworICAgIGltcC5hY3F1aXJlX2xvY2soKQorICAgIHRyeToKKyAgICAgICAgaWYgcGFja2FnZU5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHBhdGgsIHBhcmVudCA9IHN5cy5wYXRoLCBOb25lCisgICAgICAgIGlmICcuJyBpbiBwYWNrYWdlTmFtZToKKyAgICAgICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhY2thZ2VOYW1lLnNwbGl0KCcuJylbOi0xXSkKKyAgICAgICAgICAgIGRlY2xhcmVfbmFtZXNwYWNlKHBhcmVudCkKKyAgICAgICAgICAgIF9faW1wb3J0X18ocGFyZW50KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhdGggPSBzeXMubW9kdWxlc1twYXJlbnRdLl9fcGF0aF9fCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhcmVudCkKKworICAgICAgICAjIFRyYWNrIHdoYXQgcGFja2FnZXMgYXJlIG5hbWVzcGFjZXMsIHNvIHdoZW4gbmV3IHBhdGggaXRlbXMgYXJlIGFkZGVkLAorICAgICAgICAjIHRoZXkgY2FuIGJlIHVwZGF0ZWQKKyAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhcmVudCxbXSkuYXBwZW5kKHBhY2thZ2VOYW1lKQorICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFja2FnZU5hbWUsW10pCisKKyAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBwYXRoOgorICAgICAgICAgICAgIyBFbnN1cmUgYWxsIHRoZSBwYXJlbnQncyBwYXRoIGl0ZW1zIGFyZSByZWZsZWN0ZWQgaW4gdGhlIGNoaWxkLAorICAgICAgICAgICAgIyBpZiB0aGV5IGFwcGx5CisgICAgICAgICAgICBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pCisKKyAgICBmaW5hbGx5OgorICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKKworZGVmIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhwYXRoX2l0ZW0sIHBhcmVudD1Ob25lKToKKyAgICAiIiJFbnN1cmUgdGhhdCBwcmV2aW91c2x5LWRlY2xhcmVkIG5hbWVzcGFjZSBwYWNrYWdlcyBpbmNsdWRlIHBhdGhfaXRlbSIiIgorICAgIGltcC5hY3F1aXJlX2xvY2soKQorICAgIHRyeToKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gX25hbWVzcGFjZV9wYWNrYWdlcy5nZXQocGFyZW50LCgpKToKKyAgICAgICAgICAgIHN1YnBhdGggPSBfaGFuZGxlX25zKHBhY2thZ2UsIHBhdGhfaXRlbSkKKyAgICAgICAgICAgIGlmIHN1YnBhdGg6IGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzdWJwYXRoLHBhY2thZ2UpCisgICAgZmluYWxseToKKyAgICAgICAgaW1wLnJlbGVhc2VfbG9jaygpCisKK2RlZiBmaWxlX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CisgICAgIiIiQ29tcHV0ZSBhbiBucy1wYWNrYWdlIHN1YnBhdGggZm9yIGEgZmlsZXN5c3RlbSBvciB6aXBmaWxlIGltcG9ydGVyIiIiCisKKyAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgcGFja2FnZU5hbWUuc3BsaXQoJy4nKVstMV0pCisgICAgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVfY2FjaGVkKHN1YnBhdGgpCisgICAgZm9yIGl0ZW0gaW4gbW9kdWxlLl9fcGF0aF9fOgorICAgICAgICBpZiBfbm9ybWFsaXplX2NhY2hlZChpdGVtKT09bm9ybWFsaXplZDoKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgIyBPbmx5IHJldHVybiB0aGUgcGF0aCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlCisgICAgICAgIHJldHVybiBzdWJwYXRoCisKK3JlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKK3JlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQorCisKK2RlZiBudWxsX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CisgICAgcmV0dXJuIE5vbmUKKworcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIob2JqZWN0LG51bGxfbnNfaGFuZGxlcikKKworCitkZWYgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpOgorICAgICIiIk5vcm1hbGl6ZSBhIGZpbGUvZGlyIG5hbWUgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMiIiIKKyAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKGZpbGVuYW1lKSkKKworZGVmIF9ub3JtYWxpemVfY2FjaGVkKGZpbGVuYW1lLF9jYWNoZT17fSk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gX2NhY2hlW2ZpbGVuYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgX2NhY2hlW2ZpbGVuYW1lXSA9IHJlc3VsdCA9IG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSk6CisgICAgcGFydHMgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLicpCisgICAgbmFtZSA9IHBhcnRzLnBvcCgpCisgICAgaWYgcGFydHM6CisgICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhcnRzKQorICAgICAgICBzZXRhdHRyKHN5cy5tb2R1bGVzW3BhcmVudF0sIG5hbWUsIHN5cy5tb2R1bGVzW3BhY2thZ2VOYW1lXSkKKworCitkZWYgeWllbGRfbGluZXMoc3Rycyk6CisgICAgIiIiWWllbGQgbm9uLWVtcHR5L25vbi1jb21tZW50IGxpbmVzIG9mIGEgYGBiYXNlc3RyaW5nYGAgb3Igc2VxdWVuY2UiIiIKKyAgICBpZiBpc2luc3RhbmNlKHN0cnMsYmFzZXN0cmluZyk6CisgICAgICAgIGZvciBzIGluIHN0cnMuc3BsaXRsaW5lcygpOgorICAgICAgICAgICAgcyA9IHMuc3RyaXAoKQorICAgICAgICAgICAgaWYgcyBhbmQgbm90IHMuc3RhcnRzd2l0aCgnIycpOiAgICAgIyBza2lwIGJsYW5rIGxpbmVzL2NvbW1lbnRzCisgICAgICAgICAgICAgICAgeWllbGQgcworICAgIGVsc2U6CisgICAgICAgIGZvciBzcyBpbiBzdHJzOgorICAgICAgICAgICAgZm9yIHMgaW4geWllbGRfbGluZXMoc3MpOgorICAgICAgICAgICAgICAgIHlpZWxkIHMKKworTElORV9FTkQgPSByZS5jb21waWxlKHIiXHMqKCMuKik/JCIpLm1hdGNoICAgICAgICAgIyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50CitDT05USU5VRSA9IHJlLmNvbXBpbGUociJccypcXFxzKigjLiopPyQiKS5tYXRjaCAgICAjIGxpbmUgY29udGludWF0aW9uCitESVNUUk8gICA9IHJlLmNvbXBpbGUociJccyooKFx3fFstLl0pKykiKS5tYXRjaCAgICAjIERpc3RyaWJ1dGlvbiBvciBleHRyYQorVkVSU0lPTiAgPSByZS5jb21waWxlKHIiXHMqKDw9P3w+PT98PT18IT0pXHMqKChcd3xbLS5dKSspIikubWF0Y2ggICMgdmVyLiBpbmZvCitDT01NQSAgICA9IHJlLmNvbXBpbGUociJccyosIikubWF0Y2ggICAgICAgICAgICAgICAjIGNvbW1hIGJldHdlZW4gaXRlbXMKK09CUkFDS0VUID0gcmUuY29tcGlsZShyIlxzKlxbIikubWF0Y2gKK0NCUkFDS0VUID0gcmUuY29tcGlsZShyIlxzKlxdIikubWF0Y2gKK01PRFVMRSAgID0gcmUuY29tcGlsZShyIlx3KyhcLlx3KykqJCIpLm1hdGNoCitFR0dfTkFNRSA9IHJlLmNvbXBpbGUoCisgICAgciIoP1A8bmFtZT5bXi1dKykiCisgICAgciIoIC0oP1A8dmVyPlteLV0rKSAoLXB5KD9QPHB5dmVyPlteLV0rKSAoLSg/UDxwbGF0Pi4rKSk/ICk/ICk/IiwKKyAgICByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRQorKS5tYXRjaAorCitjb21wb25lbnRfcmUgPSByZS5jb21waWxlKHInKFxkKyB8IFthLXpdKyB8IFwufCAtKScsIHJlLlZFUkJPU0UpCityZXBsYWNlID0geydwcmUnOidjJywgJ3ByZXZpZXcnOidjJywnLSc6J2ZpbmFsLScsJ3JjJzonYyd9LmdldAorCitkZWYgX3BhcnNlX3ZlcnNpb25fcGFydHMocyk6CisgICAgZm9yIHBhcnQgaW4gY29tcG9uZW50X3JlLnNwbGl0KHMpOgorICAgICAgICBwYXJ0ID0gcmVwbGFjZShwYXJ0LHBhcnQpCisgICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQ9PScuJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHBhcnRbOjFdIGluICcwMTIzNDU2Nzg5JzoKKyAgICAgICAgICAgIHlpZWxkIHBhcnQuemZpbGwoOCkgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeWllbGQgJyonK3BhcnQKKworICAgIHlpZWxkICcqZmluYWwnICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKKworZGVmIHBhcnNlX3ZlcnNpb24ocyk6CisgICAgIiIiQ29udmVydCBhIHZlcnNpb24gc3RyaW5nIHRvIGEgY2hyb25vbG9naWNhbGx5LXNvcnRhYmxlIGtleQorCisgICAgVGhpcyBpcyBhIHJvdWdoIGNyb3NzIGJldHdlZW4gZGlzdHV0aWxzJyBTdHJpY3RWZXJzaW9uIGFuZCBMb29zZVZlcnNpb247CisgICAgaWYgeW91IGdpdmUgaXQgdmVyc2lvbnMgdGhhdCB3b3VsZCB3b3JrIHdpdGggU3RyaWN0VmVyc2lvbiwgdGhlbiBpdCBiZWhhdmVzCisgICAgdGhlIHNhbWU7IG90aGVyd2lzZSBpdCBhY3RzIGxpa2UgYSBzbGlnaHRseS1zbWFydGVyIExvb3NlVmVyc2lvbi4gSXQgaXMKKyAgICAqcG9zc2libGUqIHRvIGNyZWF0ZSBwYXRob2xvZ2ljYWwgdmVyc2lvbiBjb2Rpbmcgc2NoZW1lcyB0aGF0IHdpbGwgZm9vbAorICAgIHRoaXMgcGFyc2VyLCBidXQgdGhleSBzaG91bGQgYmUgdmVyeSByYXJlIGluIHByYWN0aWNlLgorCisgICAgVGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgYSB0dXBsZSBvZiBzdHJpbmdzLiAgTnVtZXJpYyBwb3J0aW9ucyBvZiB0aGUKKyAgICB2ZXJzaW9uIGFyZSBwYWRkZWQgdG8gOCBkaWdpdHMgc28gdGhleSB3aWxsIGNvbXBhcmUgbnVtZXJpY2FsbHksIGJ1dAorICAgIHdpdGhvdXQgcmVseWluZyBvbiBob3cgbnVtYmVycyBjb21wYXJlIHJlbGF0aXZlIHRvIHN0cmluZ3MuICBEb3RzIGFyZQorICAgIGRyb3BwZWQsIGJ1dCBkYXNoZXMgYXJlIHJldGFpbmVkLiAgVHJhaWxpbmcgemVyb3MgYmV0d2VlbiBhbHBoYSBzZWdtZW50cworICAgIG9yIGRhc2hlcyBhcmUgc3VwcHJlc3NlZCwgc28gdGhhdCBlLmcuICIyLjQuMCIgaXMgY29uc2lkZXJlZCB0aGUgc2FtZSBhcworICAgICIyLjQiLiBBbHBoYW51bWVyaWMgcGFydHMgYXJlIGxvd2VyLWNhc2VkLgorCisgICAgVGhlIGFsZ29yaXRobSBhc3N1bWVzIHRoYXQgc3RyaW5ncyBsaWtlICItIiBhbmQgYW55IGFscGhhIHN0cmluZyB0aGF0CisgICAgYWxwaGFiZXRpY2FsbHkgZm9sbG93cyAiZmluYWwiICByZXByZXNlbnRzIGEgInBhdGNoIGxldmVsIi4gIFNvLCAiMi40LTEiCisgICAgaXMgYXNzdW1lZCB0byBiZSBhIGJyYW5jaCBvciBwYXRjaCBvZiAiMi40IiwgYW5kIHRoZXJlZm9yZSAiMi40LjEiIGlzCisgICAgY29uc2lkZXJlZCBuZXdlciB0aGFuICIyLjQtMSIsIHdoaWMgaW4gdHVybiBpcyBuZXdlciB0aGFuICIyLjQiLgorCisgICAgU3RyaW5ncyBsaWtlICJhIiwgImIiLCAiYyIsICJhbHBoYSIsICJiZXRhIiwgImNhbmRpZGF0ZSIgYW5kIHNvIG9uICh0aGF0CisgICAgY29tZSBiZWZvcmUgImZpbmFsIiBhbHBoYWJldGljYWxseSkgYXJlIGFzc3VtZWQgdG8gYmUgcHJlLXJlbGVhc2UgdmVyc2lvbnMsCisgICAgc28gdGhhdCB0aGUgdmVyc2lvbiAiMi40IiBpcyBjb25zaWRlcmVkIG5ld2VyIHRoYW4gIjIuNGExIi4KKworICAgIEZpbmFsbHksIHRvIGhhbmRsZSBtaXNjZWxsYW5lb3VzIGNhc2VzLCB0aGUgc3RyaW5ncyAicHJlIiwgInByZXZpZXciLCBhbmQKKyAgICAicmMiIGFyZSB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSAiYyIsIGkuZS4gYXMgdGhvdWdoIHRoZXkgd2VyZSByZWxlYXNlCisgICAgY2FuZGlkYXRlcywgYW5kIHRoZXJlZm9yZSBhcmUgbm90IGFzIG5ldyBhcyBhIHZlcnNpb24gc3RyaW5nIHRoYXQgZG9lcyBub3QKKyAgICBjb250YWluIHRoZW0uCisgICAgIiIiCisgICAgcGFydHMgPSBbXQorICAgIGZvciBwYXJ0IGluIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMubG93ZXIoKSk6CisgICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgnKicpOgorICAgICAgICAgICAgaWYgcGFydDwnKmZpbmFsJzogICAjIHJlbW92ZSAnLScgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKKyAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdPT0nKmZpbmFsLSc6IHBhcnRzLnBvcCgpCisgICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKKyAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV09PScwMDAwMDAwMCc6CisgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKKyAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCisgICAgcmV0dXJuIHR1cGxlKHBhcnRzKQorCitjbGFzcyBFbnRyeVBvaW50KG9iamVjdCk6CisgICAgIiIiT2JqZWN0IHJlcHJlc2VudGluZyBhbiBhZHZlcnRpc2VkIGltcG9ydGFibGUgb2JqZWN0IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kdWxlX25hbWUsIGF0dHJzPSgpLCBleHRyYXM9KCksIGRpc3Q9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBNT0RVTEUobW9kdWxlX25hbWUpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBtb2R1bGUgbmFtZSIsIG1vZHVsZV9uYW1lKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYubW9kdWxlX25hbWUgPSBtb2R1bGVfbmFtZQorICAgICAgICBzZWxmLmF0dHJzID0gdHVwbGUoYXR0cnMpCisgICAgICAgIHNlbGYuZXh0cmFzID0gUmVxdWlyZW1lbnQucGFyc2UoKCJ4WyVzXSIgJSAnLCcuam9pbihleHRyYXMpKSkuZXh0cmFzCisgICAgICAgIHNlbGYuZGlzdCA9IGRpc3QKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBzID0gIiVzID0gJXMiICUgKHNlbGYubmFtZSwgc2VsZi5tb2R1bGVfbmFtZSkKKyAgICAgICAgaWYgc2VsZi5hdHRyczoKKyAgICAgICAgICAgIHMgKz0gJzonICsgJy4nLmpvaW4oc2VsZi5hdHRycykKKyAgICAgICAgaWYgc2VsZi5leHRyYXM6CisgICAgICAgICAgICBzICs9ICcgWyVzXScgJSAnLCcuam9pbihzZWxmLmV4dHJhcykKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJFbnRyeVBvaW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKKworICAgIGRlZiBsb2FkKHNlbGYsIHJlcXVpcmU9VHJ1ZSwgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lKToKKyAgICAgICAgaWYgcmVxdWlyZTogc2VsZi5yZXF1aXJlKGVudiwgaW5zdGFsbGVyKQorICAgICAgICBlbnRyeSA9IF9faW1wb3J0X18oc2VsZi5tb2R1bGVfbmFtZSwgZ2xvYmFscygpLGdsb2JhbHMoKSwgWydfX25hbWVfXyddKQorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLmF0dHJzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGVudHJ5ID0gZ2V0YXR0cihlbnRyeSxhdHRyKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCIlciBoYXMgbm8gJXIgYXR0cmlidXRlIiAlIChlbnRyeSxhdHRyKSkKKyAgICAgICAgcmV0dXJuIGVudHJ5CisKKyAgICBkZWYgcmVxdWlyZShzZWxmLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUpOgorICAgICAgICBpZiBzZWxmLmV4dHJhcyBhbmQgbm90IHNlbGYuZGlzdDoKKyAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgiQ2FuJ3QgcmVxdWlyZSgpIHdpdGhvdXQgYSBkaXN0cmlidXRpb24iLCBzZWxmKQorICAgICAgICBtYXAod29ya2luZ19zZXQuYWRkLAorICAgICAgICAgICAgd29ya2luZ19zZXQucmVzb2x2ZShzZWxmLmRpc3QucmVxdWlyZXMoc2VsZi5leHRyYXMpLGVudixpbnN0YWxsZXIpKQorCisKKworICAgICNAY2xhc3NtZXRob2QKKyAgICBkZWYgcGFyc2UoY2xzLCBzcmMsIGRpc3Q9Tm9uZSk6CisgICAgICAgICIiIlBhcnNlIGEgc2luZ2xlIGVudHJ5IHBvaW50IGZyb20gc3RyaW5nIGBzcmNgCisKKyAgICAgICAgRW50cnkgcG9pbnQgc3ludGF4IGZvbGxvd3MgdGhlIGZvcm06OgorCisgICAgICAgICAgICBuYW1lID0gc29tZS5tb2R1bGU6c29tZS5hdHRyIFtleHRyYTEsZXh0cmEyXQorCisgICAgICAgIFRoZSBlbnRyeSBuYW1lIGFuZCBtb2R1bGUgbmFtZSBhcmUgcmVxdWlyZWQsIGJ1dCB0aGUgYGA6YXR0cnNgYCBhbmQKKyAgICAgICAgYGBbZXh0cmFzXWBgIHBhcnRzIGFyZSBvcHRpb25hbAorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXR0cnMgPSBleHRyYXMgPSAoKQorICAgICAgICAgICAgbmFtZSx2YWx1ZSA9IHNyYy5zcGxpdCgnPScsMSkKKyAgICAgICAgICAgIGlmICdbJyBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICB2YWx1ZSxleHRyYXMgPSB2YWx1ZS5zcGxpdCgnWycsMSkKKyAgICAgICAgICAgICAgICByZXEgPSBSZXF1aXJlbWVudC5wYXJzZSgieFsiK2V4dHJhcykKKyAgICAgICAgICAgICAgICBpZiByZXEuc3BlY3M6IHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgICAgICBleHRyYXMgPSByZXEuZXh0cmFzCisgICAgICAgICAgICBpZiAnOicgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgdmFsdWUsYXR0cnMgPSB2YWx1ZS5zcGxpdCgnOicsMSkKKyAgICAgICAgICAgICAgICBpZiBub3QgTU9EVUxFKGF0dHJzLnJzdHJpcCgpKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgICAgIGF0dHJzID0gYXR0cnMucnN0cmlwKCkuc3BsaXQoJy4nKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgIkVudHJ5UG9pbnQgbXVzdCBiZSBpbiAnbmFtZT1tb2R1bGU6YXR0cnMgW2V4dHJhc10nIGZvcm1hdCIsCisgICAgICAgICAgICAgICAgc3JjCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY2xzKG5hbWUuc3RyaXAoKSwgdmFsdWUubHN0cmlwKCksIGF0dHJzLCBleHRyYXMsIGRpc3QpCisKKyAgICBwYXJzZSA9IGNsYXNzbWV0aG9kKHBhcnNlKQorCisKKworCisKKworCisKKyAgICAjQGNsYXNzbWV0aG9kCisgICAgZGVmIHBhcnNlX2dyb3VwKGNscywgZ3JvdXAsIGxpbmVzLCBkaXN0PU5vbmUpOgorICAgICAgICAiIiJQYXJzZSBhbiBlbnRyeSBwb2ludCBncm91cCIiIgorICAgICAgICBpZiBub3QgTU9EVUxFKGdyb3VwKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZ3JvdXAgbmFtZSIsIGdyb3VwKQorICAgICAgICB0aGlzID0ge30KKyAgICAgICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMobGluZXMpOgorICAgICAgICAgICAgZXAgPSBjbHMucGFyc2UobGluZSwgZGlzdCkKKyAgICAgICAgICAgIGlmIGVwLm5hbWUgaW4gdGhpczoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZW50cnkgcG9pbnQiLCBncm91cCwgZXAubmFtZSkKKyAgICAgICAgICAgIHRoaXNbZXAubmFtZV09ZXAKKyAgICAgICAgcmV0dXJuIHRoaXMKKworICAgIHBhcnNlX2dyb3VwID0gY2xhc3NtZXRob2QocGFyc2VfZ3JvdXApCisKKyAgICAjQGNsYXNzbWV0aG9kCisgICAgZGVmIHBhcnNlX21hcChjbHMsIGRhdGEsIGRpc3Q9Tm9uZSk6CisgICAgICAgICIiIlBhcnNlIGEgbWFwIG9mIGVudHJ5IHBvaW50IGdyb3VwcyIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsZGljdCk6CisgICAgICAgICAgICBkYXRhID0gZGF0YS5pdGVtcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhID0gc3BsaXRfc2VjdGlvbnMoZGF0YSkKKyAgICAgICAgbWFwcyA9IHt9CisgICAgICAgIGZvciBncm91cCwgbGluZXMgaW4gZGF0YToKKyAgICAgICAgICAgIGlmIGdyb3VwIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmVzOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkVudHJ5IHBvaW50cyBtdXN0IGJlIGxpc3RlZCBpbiBncm91cHMiKQorICAgICAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCisgICAgICAgICAgICBpZiBncm91cCBpbiBtYXBzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBncm91cCBuYW1lIiwgZ3JvdXApCisgICAgICAgICAgICBtYXBzW2dyb3VwXSA9IGNscy5wYXJzZV9ncm91cChncm91cCwgbGluZXMsIGRpc3QpCisgICAgICAgIHJldHVybiBtYXBzCisKKyAgICBwYXJzZV9tYXAgPSBjbGFzc21ldGhvZChwYXJzZV9tYXApCisKKworCisKKworCitjbGFzcyBEaXN0cmlidXRpb24ob2JqZWN0KToKKyAgICAiIiJXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkgdy9tZXRhZGF0YSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICBsb2NhdGlvbj1Ob25lLCBtZXRhZGF0YT1Ob25lLCBwcm9qZWN0X25hbWU9Tm9uZSwgdmVyc2lvbj1Ob25lLAorICAgICAgICBweV92ZXJzaW9uPVBZX01BSk9SLCBwbGF0Zm9ybT1Ob25lLCBwcmVjZWRlbmNlID0gRUdHX0RJU1QKKyAgICApOgorICAgICAgICBzZWxmLnByb2plY3RfbmFtZSA9IHNhZmVfbmFtZShwcm9qZWN0X25hbWUgb3IgJ1Vua25vd24nKQorICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHNhZmVfdmVyc2lvbih2ZXJzaW9uKQorICAgICAgICBzZWxmLnB5X3ZlcnNpb24gPSBweV92ZXJzaW9uCisgICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KKyAgICAgICAgc2VsZi5wcmVjZWRlbmNlID0gcHJlY2VkZW5jZQorICAgICAgICBzZWxmLl9wcm92aWRlciA9IG1ldGFkYXRhIG9yIGVtcHR5X3Byb3ZpZGVyCisKKyAgICAjQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fbG9jYXRpb24oY2xzLGxvY2F0aW9uLGJhc2VuYW1lLG1ldGFkYXRhPU5vbmUsKiprdyk6CisgICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBbTm9uZV0qNAorICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSkKKyAgICAgICAgaWYgZXh0Lmxvd2VyKCkgaW4gKCIuZWdnIiwiLmVnZy1pbmZvIik6CisgICAgICAgICAgICBtYXRjaCA9IEVHR19OQU1FKGJhc2VuYW1lKQorICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IG1hdGNoLmdyb3VwKAorICAgICAgICAgICAgICAgICAgICAnbmFtZScsJ3ZlcicsJ3B5dmVyJywncGxhdCcKKyAgICAgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBjbHMoCisgICAgICAgICAgICBsb2NhdGlvbiwgbWV0YWRhdGEsIHByb2plY3RfbmFtZT1wcm9qZWN0X25hbWUsIHZlcnNpb249dmVyc2lvbiwKKyAgICAgICAgICAgIHB5X3ZlcnNpb249cHlfdmVyc2lvbiwgcGxhdGZvcm09cGxhdGZvcm0sICoqa3cKKyAgICAgICAgKQorICAgIGZyb21fbG9jYXRpb24gPSBjbGFzc21ldGhvZChmcm9tX2xvY2F0aW9uKQorCisgICAgaGFzaGNtcCA9IHByb3BlcnR5KAorICAgICAgICBsYW1iZGEgc2VsZjogKAorICAgICAgICAgICAgZ2V0YXR0cihzZWxmLCdwYXJzZWRfdmVyc2lvbicsKCkpLCBzZWxmLnByZWNlZGVuY2UsIHNlbGYua2V5LAorICAgICAgICAgICAgLWxlbihzZWxmLmxvY2F0aW9uIG9yICcnKSwgc2VsZi5sb2NhdGlvbiwgc2VsZi5weV92ZXJzaW9uLAorICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybQorICAgICAgICApCisgICAgKQorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKTogcmV0dXJuIGNtcChzZWxmLmhhc2hjbXAsIG90aGVyKQorICAgIGRlZiBfX2hhc2hfXyhzZWxmKTogcmV0dXJuIGhhc2goc2VsZi5oYXNoY21wKQorCisgICAgIyBUaGVzZSBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgbGF6eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbG9hZCBhbnkKKyAgICAjIG1ldGFkYXRhIHVudGlsL3VubGVzcyBpdCdzIGFjdHVhbGx5IG5lZWRlZC4gIChpLmUuLCBzb21lIGRpc3RyaWJ1dGlvbnMKKyAgICAjIG1heSBub3Qga25vdyB0aGVpciBuYW1lIG9yIHZlcnNpb24gd2l0aG91dCBsb2FkaW5nIFBLRy1JTkZPKQorCisgICAgI0Bwcm9wZXJ0eQorICAgIGRlZiBrZXkoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9rZXkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5fa2V5ID0ga2V5ID0gc2VsZi5wcm9qZWN0X25hbWUubG93ZXIoKQorICAgICAgICAgICAgcmV0dXJuIGtleQorICAgIGtleSA9IHByb3BlcnR5KGtleSkKKworICAgICNAcHJvcGVydHkKKyAgICBkZWYgcGFyc2VkX3ZlcnNpb24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZWRfdmVyc2lvbgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzZWxmLl9wYXJzZWRfdmVyc2lvbiA9IHB2ID0gcGFyc2VfdmVyc2lvbihzZWxmLnZlcnNpb24pCisgICAgICAgICAgICByZXR1cm4gcHYKKworICAgIHBhcnNlZF92ZXJzaW9uID0gcHJvcGVydHkocGFyc2VkX3ZlcnNpb24pCisKKyAgICAjQHByb3BlcnR5CisgICAgZGVmIHZlcnNpb24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2dldF9tZXRhZGF0YSgnUEtHLUlORk8nKToKKyAgICAgICAgICAgICAgICBpZiBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgndmVyc2lvbjonKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHNhZmVfdmVyc2lvbihsaW5lLnNwbGl0KCc6JywxKVsxXS5zdHJpcCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyAnVmVyc2lvbjonIGhlYWRlciBhbmQvb3IgUEtHLUlORk8gZmlsZSIsIHNlbGYKKyAgICAgICAgICAgICAgICApCisgICAgdmVyc2lvbiA9IHByb3BlcnR5KHZlcnNpb24pCisKKworCisKKyAgICAjQHByb3BlcnR5CisgICAgZGVmIF9kZXBfbWFwKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZG0gPSBzZWxmLl9fZGVwX21hcCA9IHtOb25lOiBbXX0KKyAgICAgICAgICAgIGZvciBuYW1lIGluICdyZXF1aXJlcy50eHQnLCAnZGVwZW5kcy50eHQnOgorICAgICAgICAgICAgICAgIGZvciBleHRyYSxyZXFzIGluIHNwbGl0X3NlY3Rpb25zKHNlbGYuX2dldF9tZXRhZGF0YShuYW1lKSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhOiBleHRyYSA9IHNhZmVfZXh0cmEoZXh0cmEpCisgICAgICAgICAgICAgICAgICAgIGRtLnNldGRlZmF1bHQoZXh0cmEsW10pLmV4dGVuZChwYXJzZV9yZXF1aXJlbWVudHMocmVxcykpCisgICAgICAgICAgICByZXR1cm4gZG0KKyAgICBfZGVwX21hcCA9IHByb3BlcnR5KF9kZXBfbWFwKQorCisgICAgZGVmIHJlcXVpcmVzKHNlbGYsZXh0cmFzPSgpKToKKyAgICAgICAgIiIiTGlzdCBvZiBSZXF1aXJlbWVudHMgbmVlZGVkIGZvciB0aGlzIGRpc3RybyBpZiBgZXh0cmFzYCBhcmUgdXNlZCIiIgorICAgICAgICBkbSA9IHNlbGYuX2RlcF9tYXAKKyAgICAgICAgZGVwcyA9IFtdCisgICAgICAgIGRlcHMuZXh0ZW5kKGRtLmdldChOb25lLCgpKSkKKyAgICAgICAgZm9yIGV4dCBpbiBleHRyYXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVwcy5leHRlbmQoZG1bc2FmZV9leHRyYShleHQpXSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICIlcyBoYXMgbm8gc3VjaCBleHRyYSBmZWF0dXJlICVyIiAlIChzZWxmLCBleHQpCisgICAgICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gZGVwcworCisgICAgZGVmIF9nZXRfbWV0YWRhdGEoc2VsZixuYW1lKToKKyAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKKyAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZixwYXRoPU5vbmUpOgorICAgICAgICAiIiJFbnN1cmUgZGlzdHJpYnV0aW9uIGlzIGltcG9ydGFibGUgb24gYHBhdGhgIChkZWZhdWx0PXN5cy5wYXRoKSIiIgorICAgICAgICBpZiBwYXRoIGlzIE5vbmU6IHBhdGggPSBzeXMucGF0aAorICAgICAgICBzZWxmLmluc2VydF9vbihwYXRoKQorICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgorICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHNlbGYubG9jYXRpb24pCisgICAgICAgICAgICBmb3IgcGtnIGluIHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpOgorICAgICAgICAgICAgICAgIGlmIHBrZyBpbiBzeXMubW9kdWxlczogZGVjbGFyZV9uYW1lc3BhY2UocGtnKQorCisgICAgZGVmIGVnZ19uYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gd2hhdCB0aGlzIGRpc3RyaWJ1dGlvbidzIHN0YW5kYXJkIC5lZ2cgZmlsZW5hbWUgc2hvdWxkIGJlIiIiCisgICAgICAgIGZpbGVuYW1lID0gIiVzLSVzLXB5JXMiICUgKAorICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2VsZi5wcm9qZWN0X25hbWUpLCB0b19maWxlbmFtZShzZWxmLnZlcnNpb24pLAorICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yIFBZX01BSk9SCisgICAgICAgICkKKworICAgICAgICBpZiBzZWxmLnBsYXRmb3JtOgorICAgICAgICAgICAgZmlsZW5hbWUgKz0gJy0nK3NlbGYucGxhdGZvcm0KKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYubG9jYXRpb246CisgICAgICAgICAgICByZXR1cm4gIiVzICglcykiICUgKHNlbGYsc2VsZi5sb2NhdGlvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZikKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICB0cnk6IHZlcnNpb24gPSBnZXRhdHRyKHNlbGYsJ3ZlcnNpb24nLE5vbmUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiB2ZXJzaW9uID0gTm9uZQorICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiBvciAiW3Vua25vd24gdmVyc2lvbl0iCisgICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYucHJvamVjdF9uYW1lLHZlcnNpb24pCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZixhdHRyKToKKyAgICAgICAgIiIiRGVsZWdhdGUgYWxsIHVucmVjb2duaXplZCBwdWJsaWMgYXR0cmlidXRlcyB0byAubWV0YWRhdGEgcHJvdmlkZXIiIiIKKyAgICAgICAgaWYgYXR0ci5zdGFydHN3aXRoKCdfJyk6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcixhdHRyCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX3Byb3ZpZGVyLCBhdHRyKQorCisgICAgI0BjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX2ZpbGVuYW1lKGNscyxmaWxlbmFtZSxtZXRhZGF0YT1Ob25lLCAqKmt3KToKKyAgICAgICAgcmV0dXJuIGNscy5mcm9tX2xvY2F0aW9uKAorICAgICAgICAgICAgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEsCisgICAgICAgICAgICAqKmt3CisgICAgICAgICkKKyAgICBmcm9tX2ZpbGVuYW1lID0gY2xhc3NtZXRob2QoZnJvbV9maWxlbmFtZSkKKworICAgIGRlZiBhc19yZXF1aXJlbWVudChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgYGBSZXF1aXJlbWVudGBgIHRoYXQgbWF0Y2hlcyB0aGlzIGRpc3RyaWJ1dGlvbiBleGFjdGx5IiIiCisgICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZSgnJXM9PSVzJyAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi52ZXJzaW9uKSkKKworICAgIGRlZiBsb2FkX2VudHJ5X3BvaW50KHNlbGYsIGdyb3VwLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgorICAgICAgICBlcCA9IHNlbGYuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsbmFtZSkKKyAgICAgICAgaWYgZXAgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJFbnRyeSBwb2ludCAlciBub3QgZm91bmQiICUgKChncm91cCxuYW1lKSwpKQorICAgICAgICByZXR1cm4gZXAubG9hZCgpCisKKyAgICBkZWYgZ2V0X2VudHJ5X21hcChzZWxmLCBncm91cD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwID0gRW50cnlQb2ludC5wYXJzZV9tYXAoCisgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21ldGFkYXRhKCdlbnRyeV9wb2ludHMudHh0JyksIHNlbGYKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgZ3JvdXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZXBfbWFwLmdldChncm91cCx7fSkKKyAgICAgICAgcmV0dXJuIGVwX21hcAorCisgICAgZGVmIGdldF9lbnRyeV9pbmZvKHNlbGYsIGdyb3VwLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldF9lbnRyeV9tYXAoZ3JvdXApLmdldChuYW1lKQorCisgICAgZGVmIGluc2VydF9vbihzZWxmLCBwYXRoLCBsb2MgPSBOb25lKToKKyAgICAgICAgIiIiSW5zZXJ0IHNlbGYubG9jYXRpb24gaW4gcGF0aCBiZWZvcmUgaXRzIG5lYXJlc3QgcGFyZW50IGRpcmVjdG9yeSIiIgorICAgICAgICBsb2MgPSBsb2Mgb3Igc2VsZi5sb2NhdGlvbgorICAgICAgICBpZiBub3QgbG9jOiByZXR1cm4KKyAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCisgICAgICAgIGJlc3QsIHBvcyA9IDAsIC0xCisgICAgICAgIGZvciBwLGl0ZW0gaW4gZW51bWVyYXRlKHBhdGgpOgorICAgICAgICAgICAgaXRlbSA9IF9ub3JtYWxpemVfY2FjaGVkKGl0ZW0pCisgICAgICAgICAgICBpZiBsb2Muc3RhcnRzd2l0aChpdGVtKSBhbmQgbGVuKGl0ZW0pPmJlc3QgYW5kIGxvYzw+aXRlbToKKyAgICAgICAgICAgICAgICBiZXN0LCBwb3MgPSBsZW4oaXRlbSksIHAKKyAgICAgICAgaWYgcG9zPT0tMToKKyAgICAgICAgICAgIGlmIGxvYyBub3QgaW4gcGF0aDogcGF0aC5hcHBlbmQobG9jKQorICAgICAgICBlbGlmIGxvYyBub3QgaW4gcGF0aFs6cG9zKzFdOgorICAgICAgICAgICAgd2hpbGUgbG9jIGluIHBhdGg6IHBhdGgucmVtb3ZlKGxvYykKKyAgICAgICAgICAgIHBhdGguaW5zZXJ0KHBvcyxsb2MpCisKKworICAgIGRlZiBjaGVja192ZXJzaW9uX2NvbmZsaWN0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmtleT09J3NldHVwdG9vbHMnOgorICAgICAgICAgICAgcmV0dXJuICAgICAgIyBpZ25vcmUgdGhlIGluZXZpdGFibGUgc2V0dXB0b29scyBzZWxmLWNvbmZsaWN0cyAgOigKKworICAgICAgICBuc3AgPSBkaWN0LmZyb21rZXlzKHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpKQorICAgICAgICBsb2MgPSBub3JtYWxpemVfcGF0aChzZWxmLmxvY2F0aW9uKQorICAgICAgICBmb3IgbW9kbmFtZSBpbiBzZWxmLl9nZXRfbWV0YWRhdGEoJ3RvcF9sZXZlbC50eHQnKToKKyAgICAgICAgICAgIGlmIChtb2RuYW1lIG5vdCBpbiBzeXMubW9kdWxlcyBvciBtb2RuYW1lIGluIG5zcAorICAgICAgICAgICAgICAgIG9yIG1vZG5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlcworICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmbiA9IGdldGF0dHIoc3lzLm1vZHVsZXNbbW9kbmFtZV0sICdfX2ZpbGVfXycsIE5vbmUpCisgICAgICAgICAgICBpZiBmbiBhbmQgbm9ybWFsaXplX3BhdGgoZm4pLnN0YXJ0c3dpdGgobG9jKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaXNzdWVfd2FybmluZygKKyAgICAgICAgICAgICAgICAiTW9kdWxlICVzIHdhcyBhbHJlYWR5IGltcG9ydGVkIGZyb20gJXMsIGJ1dCAlcyBpcyBiZWluZyBhZGRlZCIKKyAgICAgICAgICAgICAgICAiIHRvIHN5cy5wYXRoIiAlIChtb2RuYW1lLCBmbiwgc2VsZi5sb2NhdGlvbiksCisgICAgICAgICAgICApCisKKyAgICBkZWYgaGFzX3ZlcnNpb24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbgorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIGlzc3VlX3dhcm5pbmcoIlVuYnVpbHQgZWdnIGZvciAiK3JlcHIoc2VsZikpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjbG9uZShzZWxmLCoqa3cpOgorICAgICAgICAiIiJDb3B5IHRoaXMgZGlzdHJpYnV0aW9uLCBzdWJzdGl0dXRpbmcgaW4gYW55IGNoYW5nZWQga2V5d29yZCBhcmdzIiIiCisgICAgICAgIGZvciBhdHRyIGluICgKKyAgICAgICAgICAgICdwcm9qZWN0X25hbWUnLCAndmVyc2lvbicsICdweV92ZXJzaW9uJywgJ3BsYXRmb3JtJywgJ2xvY2F0aW9uJywKKyAgICAgICAgICAgICdwcmVjZWRlbmNlJworICAgICAgICApOgorICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChhdHRyLCBnZXRhdHRyKHNlbGYsYXR0cixOb25lKSkKKyAgICAgICAga3cuc2V0ZGVmYXVsdCgnbWV0YWRhdGEnLCBzZWxmLl9wcm92aWRlcikKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCoqa3cpCisKKworCisKKyAgICAjQHByb3BlcnR5CisgICAgZGVmIGV4dHJhcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtkZXAgZm9yIGRlcCBpbiBzZWxmLl9kZXBfbWFwIGlmIGRlcF0KKyAgICBleHRyYXMgPSBwcm9wZXJ0eShleHRyYXMpCisKKworZGVmIGlzc3VlX3dhcm5pbmcoKmFyZ3MsKiprdyk6CisgICAgbGV2ZWwgPSAxCisgICAgZyA9IGdsb2JhbHMoKQorICAgIHRyeToKKyAgICAgICAgIyBmaW5kIHRoZSBmaXJzdCBzdGFjayBmcmFtZSB0aGF0IGlzICpub3QqIGNvZGUgaW4KKyAgICAgICAgIyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUsIHRvIHVzZSBmb3IgdGhlIHdhcm5pbmcKKyAgICAgICAgd2hpbGUgc3lzLl9nZXRmcmFtZShsZXZlbCkuZl9nbG9iYWxzIGlzIGc6CisgICAgICAgICAgICBsZXZlbCArPSAxCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCisgICAgd2FybihzdGFja2xldmVsID0gbGV2ZWwrMSwgKmFyZ3MsICoqa3cpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworZGVmIHBhcnNlX3JlcXVpcmVtZW50cyhzdHJzKToKKyAgICAiIiJZaWVsZCBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cyBmb3IgZWFjaCBzcGVjaWZpY2F0aW9uIGluIGBzdHJzYAorCisgICAgYHN0cnNgIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYGBiYXNlc3RyaW5nYGAsIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkKKyAgICBpdGVyYWJsZSB0aGVyZW9mLgorICAgICIiIgorICAgICMgY3JlYXRlIGEgc3RlcHBhYmxlIGl0ZXJhdG9yLCBzbyB3ZSBjYW4gaGFuZGxlIFwtY29udGludWF0aW9ucworICAgIGxpbmVzID0gaXRlcih5aWVsZF9saW5lcyhzdHJzKSkKKworICAgIGRlZiBzY2FuX2xpc3QoSVRFTSxURVJNSU5BVE9SLGxpbmUscCxncm91cHMsaXRlbV9uYW1lKToKKworICAgICAgICBpdGVtcyA9IFtdCisKKyAgICAgICAgd2hpbGUgbm90IFRFUk1JTkFUT1IobGluZSxwKToKKyAgICAgICAgICAgIGlmIENPTlRJTlVFKGxpbmUscCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZXMubmV4dCgpOyBwID0gMAorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgIlxcIG11c3Qgbm90IGFwcGVhciBvbiB0aGUgbGFzdCBub25ibGFuayBsaW5lIgorICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgIG1hdGNoID0gSVRFTShsaW5lLHApCisgICAgICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRXhwZWN0ZWQgIitpdGVtX25hbWUrIiBpbiIsbGluZSwiYXQiLGxpbmVbcDpdKQorCisgICAgICAgICAgICBpdGVtcy5hcHBlbmQobWF0Y2guZ3JvdXAoKmdyb3VwcykpCisgICAgICAgICAgICBwID0gbWF0Y2guZW5kKCkKKworICAgICAgICAgICAgbWF0Y2ggPSBDT01NQShsaW5lLHApCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICBwID0gbWF0Y2guZW5kKCkgIyBza2lwIHRoZSBjb21tYQorICAgICAgICAgICAgZWxpZiBub3QgVEVSTUlOQVRPUihsaW5lLHApOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAnLCcgb3IgZW5kLW9mLWxpc3QgaW4iLGxpbmUsImF0IixsaW5lW3A6XQorICAgICAgICAgICAgICAgICkKKworICAgICAgICBtYXRjaCA9IFRFUk1JTkFUT1IobGluZSxwKQorICAgICAgICBpZiBtYXRjaDogcCA9IG1hdGNoLmVuZCgpICAgIyBza2lwIHRoZSB0ZXJtaW5hdG9yLCBpZiBhbnkKKyAgICAgICAgcmV0dXJuIGxpbmUsIHAsIGl0ZW1zCisKKyAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgbWF0Y2ggPSBESVNUUk8obGluZSkKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTWlzc2luZyBkaXN0cmlidXRpb24gc3BlYyIsIGxpbmUpCisgICAgICAgIHByb2plY3RfbmFtZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIHAgPSBtYXRjaC5lbmQoKQorICAgICAgICBleHRyYXMgPSBbXQorCisgICAgICAgIG1hdGNoID0gT0JSQUNLRVQobGluZSxwKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHAgPSBtYXRjaC5lbmQoKQorICAgICAgICAgICAgbGluZSwgcCwgZXh0cmFzID0gc2Nhbl9saXN0KAorICAgICAgICAgICAgICAgIERJU1RSTywgQ0JSQUNLRVQsIGxpbmUsIHAsICgxLCksICInZXh0cmEnIG5hbWUiCisgICAgICAgICAgICApCisKKyAgICAgICAgbGluZSwgcCwgc3BlY3MgPSBzY2FuX2xpc3QoVkVSU0lPTixMSU5FX0VORCxsaW5lLHAsKDEsMiksInZlcnNpb24gc3BlYyIpCisgICAgICAgIHNwZWNzID0gWyhvcCxzYWZlX3ZlcnNpb24odmFsKSkgZm9yIG9wLHZhbCBpbiBzcGVjc10KKyAgICAgICAgeWllbGQgUmVxdWlyZW1lbnQocHJvamVjdF9uYW1lLCBzcGVjcywgZXh0cmFzKQorCisKK2RlZiBfc29ydF9kaXN0cyhkaXN0cyk6CisgICAgdG1wID0gWyhkaXN0Lmhhc2hjbXAsZGlzdCkgZm9yIGRpc3QgaW4gZGlzdHNdCisgICAgdG1wLnNvcnQoKQorICAgIGRpc3RzWzo6LTFdID0gW2QgZm9yIGhjLGQgaW4gdG1wXQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIFJlcXVpcmVtZW50OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9qZWN0X25hbWUsIHNwZWNzLCBleHRyYXMpOgorICAgICAgICAiIiJETyBOT1QgQ0FMTCBUSElTIFVORE9DVU1FTlRFRCBNRVRIT0Q7IHVzZSBSZXF1aXJlbWVudC5wYXJzZSgpISIiIgorICAgICAgICBzZWxmLnVuc2FmZV9uYW1lLCBwcm9qZWN0X25hbWUgPSBwcm9qZWN0X25hbWUsIHNhZmVfbmFtZShwcm9qZWN0X25hbWUpCisgICAgICAgIHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLmtleSA9IHByb2plY3RfbmFtZSwgcHJvamVjdF9uYW1lLmxvd2VyKCkKKyAgICAgICAgaW5kZXggPSBbKHBhcnNlX3ZlcnNpb24odiksc3RhdGVfbWFjaGluZVtvcF0sb3AsdikgZm9yIG9wLHYgaW4gc3BlY3NdCisgICAgICAgIGluZGV4LnNvcnQoKQorICAgICAgICBzZWxmLnNwZWNzID0gWyhvcCx2ZXIpIGZvciBwYXJzZWQsdHJhbnMsb3AsdmVyIGluIGluZGV4XQorICAgICAgICBzZWxmLmluZGV4LCBzZWxmLmV4dHJhcyA9IGluZGV4LCB0dXBsZShtYXAoc2FmZV9leHRyYSxleHRyYXMpKQorICAgICAgICBzZWxmLmhhc2hDbXAgPSAoCisgICAgICAgICAgICBzZWxmLmtleSwgdHVwbGUoWyhvcCxwYXJzZWQpIGZvciBwYXJzZWQsdHJhbnMsb3AsdmVyIGluIGluZGV4XSksCisgICAgICAgICAgICBJbW11dGFibGVTZXQoc2VsZi5leHRyYXMpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fX2hhc2ggPSBoYXNoKHNlbGYuaGFzaENtcCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBzcGVjcyA9ICcsJy5qb2luKFsnJy5qb2luKHMpIGZvciBzIGluIHNlbGYuc3BlY3NdKQorICAgICAgICBleHRyYXMgPSAnLCcuam9pbihzZWxmLmV4dHJhcykKKyAgICAgICAgaWYgZXh0cmFzOiBleHRyYXMgPSAnWyVzXScgJSBleHRyYXMKKyAgICAgICAgcmV0dXJuICclcyVzJXMnICUgKHNlbGYucHJvamVjdF9uYW1lLCBleHRyYXMsIHNwZWNzKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsUmVxdWlyZW1lbnQpIGFuZCBzZWxmLmhhc2hDbXA9PW90aGVyLmhhc2hDbXAKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZixpdGVtKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLERpc3RyaWJ1dGlvbik6CisgICAgICAgICAgICBpZiBpdGVtLmtleSA8PiBzZWxmLmtleTogcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiBzZWxmLmluZGV4OiBpdGVtID0gaXRlbS5wYXJzZWRfdmVyc2lvbiAgIyBvbmx5IGdldCBpZiB3ZSBuZWVkIGl0CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpdGVtLGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgaXRlbSA9IHBhcnNlX3ZlcnNpb24oaXRlbSkKKyAgICAgICAgbGFzdCA9IE5vbmUKKyAgICAgICAgZm9yIHBhcnNlZCx0cmFucyxvcCx2ZXIgaW4gc2VsZi5pbmRleDoKKyAgICAgICAgICAgIGFjdGlvbiA9IHRyYW5zW2NtcChpdGVtLHBhcnNlZCldCisgICAgICAgICAgICBpZiBhY3Rpb249PSdGJzogICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxpZiBhY3Rpb249PSdUJzogICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxpZiBhY3Rpb249PScrJzogICBsYXN0ID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBhY3Rpb249PSctJyBvciBsYXN0IGlzIE5vbmU6ICAgbGFzdCA9IEZhbHNlCisgICAgICAgIGlmIGxhc3QgaXMgTm9uZTogbGFzdCA9IFRydWUgICAgIyBubyBydWxlcyBlbmNvdW50ZXJlZAorICAgICAgICByZXR1cm4gbGFzdAorCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9faGFzaAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOiByZXR1cm4gIlJlcXVpcmVtZW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKKworICAgICNAc3RhdGljbWV0aG9kCisgICAgZGVmIHBhcnNlKHMpOgorICAgICAgICByZXFzID0gbGlzdChwYXJzZV9yZXF1aXJlbWVudHMocykpCisgICAgICAgIGlmIHJlcXM6CisgICAgICAgICAgICBpZiBsZW4ocmVxcyk9PTE6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXNbMF0KKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkV4cGVjdGVkIG9ubHkgb25lIHJlcXVpcmVtZW50IiwgcykKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gcmVxdWlyZW1lbnRzIGZvdW5kIiwgcykKKworICAgIHBhcnNlID0gc3RhdGljbWV0aG9kKHBhcnNlKQorCitzdGF0ZV9tYWNoaW5lID0geworICAgICMgICAgICAgPT48CisgICAgJzwnIDogICctLVQnLAorICAgICc8PSc6ICAnVC1UJywKKyAgICAnPicgOiAgJ0YrRicsCisgICAgJz49JzogICdUK0YnLAorICAgICc9PSc6ICAnVC4uJywKKyAgICAnIT0nOiAgJ0YrKycsCit9CisKKworZGVmIF9nZXRfbXJvKGNscyk6CisgICAgIiIiR2V0IGFuIG1ybyBmb3IgYSB0eXBlIG9yIGNsYXNzaWMgY2xhc3MiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShjbHMsdHlwZSk6CisgICAgICAgIGNsYXNzIGNscyhjbHMsb2JqZWN0KTogcGFzcworICAgICAgICByZXR1cm4gY2xzLl9fbXJvX19bMTpdCisgICAgcmV0dXJuIGNscy5fX21yb19fCisKK2RlZiBfZmluZF9hZGFwdGVyKHJlZ2lzdHJ5LCBvYik6CisgICAgIiIiUmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgYG9iYCBmcm9tIGByZWdpc3RyeWAiIiIKKyAgICBmb3IgdCBpbiBfZ2V0X21ybyhnZXRhdHRyKG9iLCAnX19jbGFzc19fJywgdHlwZShvYikpKToKKyAgICAgICAgaWYgdCBpbiByZWdpc3RyeToKKyAgICAgICAgICAgIHJldHVybiByZWdpc3RyeVt0XQorCisKK2RlZiBlbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgorICAgICIiIkVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGBwYXRoYCBleGlzdHMiIiIKKyAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCisgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CisgICAgICAgIG9zLm1ha2VkaXJzKGRpcm5hbWUpCisKK2RlZiBzcGxpdF9zZWN0aW9ucyhzKToKKyAgICAiIiJTcGxpdCBhIHN0cmluZyBvciBpdGVyYWJsZSB0aGVyZW9mIGludG8gKHNlY3Rpb24sY29udGVudCkgcGFpcnMKKworICAgIEVhY2ggYGBzZWN0aW9uYGAgaXMgYSBzdHJpcHBlZCB2ZXJzaW9uIG9mIHRoZSBzZWN0aW9uIGhlYWRlciAoIltzZWN0aW9uXSIpCisgICAgYW5kIGVhY2ggYGBjb250ZW50YGAgaXMgYSBsaXN0IG9mIHN0cmlwcGVkIGxpbmVzIGV4Y2x1ZGluZyBibGFuayBsaW5lcyBhbmQKKyAgICBjb21tZW50LW9ubHkgbGluZXMuICBJZiB0aGVyZSBhcmUgYW55IHN1Y2ggbGluZXMgYmVmb3JlIHRoZSBmaXJzdCBzZWN0aW9uCisgICAgaGVhZGVyLCB0aGV5J3JlIHJldHVybmVkIGluIGEgZmlyc3QgYGBzZWN0aW9uYGAgb2YgYGBOb25lYGAuCisgICAgIiIiCisgICAgc2VjdGlvbiA9IE5vbmUKKyAgICBjb250ZW50ID0gW10KKyAgICBmb3IgbGluZSBpbiB5aWVsZF9saW5lcyhzKToKKyAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJbIik6CisgICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCJdIik6CisgICAgICAgICAgICAgICAgaWYgc2VjdGlvbiBvciBjb250ZW50OgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CisgICAgICAgICAgICAgICAgc2VjdGlvbiA9IGxpbmVbMTotMV0uc3RyaXAoKQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBbXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIHNlY3Rpb24gaGVhZGluZyIsIGxpbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb250ZW50LmFwcGVuZChsaW5lKQorCisgICAgIyB3cmFwIHVwIGxhc3Qgc2VnbWVudAorICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKKworZGVmIF9ta3N0ZW1wKCphcmdzLCoqa3cpOgorICAgIGZyb20gdGVtcGZpbGUgaW1wb3J0IG1rc3RlbXAKKyAgICBvbGRfb3BlbiA9IG9zLm9wZW4KKyAgICB0cnk6CisgICAgICAgIG9zLm9wZW4gPSBvc19vcGVuICAgIyB0ZW1wb3JhcmlseSBieXBhc3Mgc2FuZGJveGluZworICAgICAgICByZXR1cm4gbWtzdGVtcCgqYXJncywqKmt3KQorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLm9wZW4gPSBvbGRfb3BlbiAgIyBhbmQgdGhlbiBwdXQgaXQgYmFjaworCisKKyMgU2V0IHVwIGdsb2JhbCByZXNvdXJjZSBtYW5hZ2VyCitfbWFuYWdlciA9IFJlc291cmNlTWFuYWdlcigpCitkZWYgX2luaXRpYWxpemUoZyk6CisgICAgZm9yIG5hbWUgaW4gZGlyKF9tYW5hZ2VyKToKKyAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpOgorICAgICAgICAgICAgZ1tuYW1lXSA9IGdldGF0dHIoX21hbmFnZXIsIG5hbWUpCitfaW5pdGlhbGl6ZShnbG9iYWxzKCkpCisKKyMgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0IGFuZCBtYWtlIHRoZSBgYHJlcXVpcmUoKWBgIEFQSSBhdmFpbGFibGUKK3dvcmtpbmdfc2V0ID0gV29ya2luZ1NldCgpCit0cnk6CisgICAgIyBEb2VzIHRoZSBtYWluIHByb2dyYW0gbGlzdCBhbnkgcmVxdWlyZW1lbnRzPworICAgIGZyb20gX19tYWluX18gaW1wb3J0IF9fcmVxdWlyZXNfXworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MgIyBObzoganVzdCB1c2UgdGhlIGRlZmF1bHQgd29ya2luZyBzZXQgYmFzZWQgb24gc3lzLnBhdGgKK2Vsc2U6CisgICAgIyBZZXM6IGVuc3VyZSB0aGUgcmVxdWlyZW1lbnRzIGFyZSBtZXQsIGJ5IHByZWZpeGluZyBzeXMucGF0aCBpZiBuZWNlc3NhcnkKKyAgICB0cnk6CisgICAgICAgIHdvcmtpbmdfc2V0LnJlcXVpcmUoX19yZXF1aXJlc19fKQorICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3Q6ICAgICAjIHRyeSBpdCB3aXRob3V0IGRlZmF1bHRzIGFscmVhZHkgb24gc3lzLnBhdGgKKyAgICAgICAgd29ya2luZ19zZXQgPSBXb3JraW5nU2V0KFtdKSAgICAjIGJ5IHN0YXJ0aW5nIHdpdGggYW4gZW1wdHkgcGF0aAorICAgICAgICBmb3IgZGlzdCBpbiB3b3JraW5nX3NldC5yZXNvbHZlKAorICAgICAgICAgICAgcGFyc2VfcmVxdWlyZW1lbnRzKF9fcmVxdWlyZXNfXyksIEVudmlyb25tZW50KCkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdvcmtpbmdfc2V0LmFkZChkaXN0KQorICAgICAgICBmb3IgZW50cnkgaW4gc3lzLnBhdGg6ICAjIGFkZCBhbnkgbWlzc2luZyBlbnRyaWVzIGZyb20gc3lzLnBhdGgKKyAgICAgICAgICAgIGlmIGVudHJ5IG5vdCBpbiB3b3JraW5nX3NldC5lbnRyaWVzOgorICAgICAgICAgICAgICAgIHdvcmtpbmdfc2V0LmFkZF9lbnRyeShlbnRyeSkKKyAgICAgICAgc3lzLnBhdGhbOl0gPSB3b3JraW5nX3NldC5lbnRyaWVzICAgIyB0aGVuIGNvcHkgYmFjayB0byBzeXMucGF0aAorCityZXF1aXJlID0gd29ya2luZ19zZXQucmVxdWlyZQoraXRlcl9lbnRyeV9wb2ludHMgPSB3b3JraW5nX3NldC5pdGVyX2VudHJ5X3BvaW50cworYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIgPSB3b3JraW5nX3NldC5zdWJzY3JpYmUKK3J1bl9zY3JpcHQgPSB3b3JraW5nX3NldC5ydW5fc2NyaXB0CitydW5fbWFpbiA9IHJ1bl9zY3JpcHQgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyMgQWN0aXZhdGUgYWxsIGRpc3RyaWJ1dGlvbnMgYWxyZWFkeSBvbiBzeXMucGF0aCwgYW5kIGVuc3VyZSB0aGF0CisjIGFsbCBkaXN0cmlidXRpb25zIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpbiB0aGUgZnV0dXJlIChlLmcuIGJ5CisjIGNhbGxpbmcgYGByZXF1aXJlKClgYCkgd2lsbCBnZXQgYWN0aXZhdGVkIGFzIHdlbGwuCithZGRfYWN0aXZhdGlvbl9saXN0ZW5lcihsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZSgpKQord29ya2luZ19zZXQuZW50cmllcz1bXTsgbWFwKHdvcmtpbmdfc2V0LmFkZF9lbnRyeSxzeXMucGF0aCkgIyBtYXRjaCBvcmRlcgpkaWZmIC0tZ2l0IGEvTGliL3BrZ3V0aWwucHkgYi9MaWIvcGtndXRpbC5weQppbmRleCBmYmQ3MDhhLi43MzE2ODkyIDEwMDY0NAotLS0gYS9MaWIvcGtndXRpbC5weQorKysgYi9MaWIvcGtndXRpbC5weQpAQCAtMSw3ICsxLDQzMiBAQAogIiIiVXRpbGl0aWVzIHRvIHN1cHBvcnQgcGFja2FnZXMuIiIiCiAKKyMgTk9URTogVGhpcyBtb2R1bGUgbXVzdCByZW1haW4gY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIGFzIGl0IGlzIHNoYXJlZAorIyBieSBzZXR1cHRvb2xzIGZvciBkaXN0cmlidXRpb24gd2l0aCBQeXRob24gMi4zIGFuZCB1cC4KKwogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCitpbXBvcnQgaW1wCitpbXBvcnQgb3MucGF0aAorZnJvbSB0eXBlcyBpbXBvcnQgTW9kdWxlVHlwZQorCitfX2FsbF9fID0gWworICAgICdnZXRfaW1wb3J0ZXInLCAnaXRlcl9pbXBvcnRlcnMnLCAnZ2V0X2xvYWRlcicsICdmaW5kX2xvYWRlcicsCisgICAgJ3dhbGtfcGFja2FnZXMnLCAnaXRlcl9tb2R1bGVzJywKKyAgICAnSW1wSW1wb3J0ZXInLCAnSW1wTG9hZGVyJywgJ3JlYWRfY29kZScsICdleHRlbmRfcGF0aCcsCitdCisKK2RlZiByZWFkX2NvZGUoc3RyZWFtKToKKyAgICAjIFRoaXMgaGVscGVyIGlzIG5lZWRlZCBpbiBvcmRlciBmb3IgdGhlIFBFUCAzMDIgZW11bGF0aW9uIHRvCisgICAgIyBjb3JyZWN0bHkgaGFuZGxlIGNvbXBpbGVkIGZpbGVzCisgICAgaW1wb3J0IG1hcnNoYWwKKworICAgIG1hZ2ljID0gc3RyZWFtLnJlYWQoNCkKKyAgICBpZiBtYWdpYyAhPSBpbXAuZ2V0X21hZ2ljKCk6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBzdHJlYW0ucmVhZCg0KSAjIFNraXAgdGltZXN0YW1wCisgICAgcmV0dXJuIG1hcnNoYWwubG9hZChzdHJlYW0pCisKKworZGVmIHNpbXBsZWdlbmVyaWMoZnVuYyk6CisgICAgIiIiTWFrZSBhIHRyaXZpYWwgc2luZ2xlLWRpc3BhdGNoIGdlbmVyaWMgZnVuY3Rpb24iIiIKKyAgICByZWdpc3RyeSA9IHt9CisgICAgZGVmIHdyYXBwZXIoKmFyZ3MsKiprdyk6CisgICAgICAgIG9iID0gYXJnc1swXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbHMgPSBvYi5fX2NsYXNzX18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgY2xzID0gdHlwZShvYikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXJvID0gY2xzLl9fbXJvX18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsYXNzIGNscyhjbHMsb2JqZWN0KTogcGFzcworICAgICAgICAgICAgICAgIG1ybyA9IGNscy5fX21yb19fWzE6XQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBtcm8gPSBvYmplY3QsICAgIyBtdXN0IGJlIGFuIEV4dGVuc2lvbkNsYXNzIG9yIHNvbWUgc3VjaCAgOigKKyAgICAgICAgZm9yIHQgaW4gbXJvOgorICAgICAgICAgICAgaWYgdCBpbiByZWdpc3RyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0cnlbdF0oKmFyZ3MsKiprdykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCoqa3cpCisgICAgdHJ5OgorICAgICAgICB3cmFwcGVyLl9fbmFtZV9fID0gZnVuYy5fX25hbWVfXworICAgIGV4Y2VwdCAoVHlwZUVycm9yLEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgcGFzcyAgICAjIFB5dGhvbiAyLjMgZG9lc24ndCBhbGxvdyBmdW5jdGlvbnMgdG8gYmUgcmVuYW1lZAorCisgICAgZGVmIHJlZ2lzdGVyKHR5cCwgZnVuYz1Ob25lKToKKyAgICAgICAgaWYgZnVuYyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBmOiByZWdpc3Rlcih0eXAsIGYpCisgICAgICAgIHJlZ2lzdHJ5W3R5cF0gPSBmdW5jCisgICAgICAgIHJldHVybiBmdW5jCisKKyAgICB3cmFwcGVyLl9fZGljdF9fID0gZnVuYy5fX2RpY3RfXworICAgIHdyYXBwZXIuX19kb2NfXyA9IGZ1bmMuX19kb2NfXworICAgIHdyYXBwZXIucmVnaXN0ZXIgPSByZWdpc3RlcgorICAgIHJldHVybiB3cmFwcGVyCisKKworZGVmIHdhbGtfcGFja2FnZXMocGF0aD1Ob25lLCBwcmVmaXg9JycsIG9uZXJyb3I9Tm9uZSk6CisgICAgIiIiWWllbGQgc3VibW9kdWxlIG5hbWVzK2xvYWRlcnMgcmVjdXJzaXZlbHksIGZvciBwYXRoIG9yIHN5cy5wYXRoIiIiCisKKyAgICBkZWYgc2VlbihwLG09e30pOgorICAgICAgICBpZiBwIGluIG06IHJldHVybiBUcnVlCisgICAgICAgIG1bcF0gPSBUcnVlCisKKyAgICBmb3IgaW1wb3J0ZXIsIG5hbWUsIGlzcGtnIGluIGl0ZXJfbW9kdWxlcyhwYXRoLCBwcmVmaXgpOgorICAgICAgICB5aWVsZCBpbXBvcnRlciwgbmFtZSwgaXNwa2cKKworICAgICAgICBpZiBpc3BrZzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb25lcnJvcigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhdGggPSBnZXRhdHRyKHN5cy5tb2R1bGVzW25hbWVdLCAnX19wYXRoX18nLCBOb25lKSBvciBbXQorCisgICAgICAgICAgICAgICAgIyBkb24ndCB0cmF2ZXJzZSBwYXRoIGl0ZW1zIHdlJ3ZlIHNlZW4gYmVmb3JlCisgICAgICAgICAgICAgICAgcGF0aCA9IFtwIGZvciBwIGluIHBhdGggaWYgbm90IHNlZW4ocCldCisKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB3YWxrX3BhY2thZ2VzKHBhdGgsIG5hbWUrJy4nKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQorCisKK2RlZiBpdGVyX21vZHVsZXMocGF0aD1Ob25lLCBwcmVmaXg9JycpOgorICAgICIiIllpZWxkIHN1Ym1vZHVsZSBuYW1lcytsb2FkZXJzIGZvciBwYXRoIG9yIHN5cy5wYXRoIiIiCisgICAgaWYgcGF0aCBpcyBOb25lOgorICAgICAgICBpbXBvcnRlcnMgPSBpdGVyX2ltcG9ydGVycygpCisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0ZXJzID0gbWFwKGdldF9pbXBvcnRlciwgcGF0aCkKKworICAgIHlpZWxkZWQgPSB7fQorICAgIGZvciBpIGluIGltcG9ydGVyczoKKyAgICAgICAgZm9yIG5hbWUsIGlzcGtnIGluIGl0ZXJfaW1wb3J0ZXJfbW9kdWxlcyhpLCBwcmVmaXgpOgorICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4geWllbGRlZDoKKyAgICAgICAgICAgICAgICB5aWVsZGVkW25hbWVdID0gMQorICAgICAgICAgICAgICAgIHlpZWxkIGksIG5hbWUsIGlzcGtnCisKKworI0BzaW1wbGVnZW5lcmljCitkZWYgaXRlcl9pbXBvcnRlcl9tb2R1bGVzKGltcG9ydGVyLCBwcmVmaXg9JycpOgorICAgIGlmIG5vdCBoYXNhdHRyKGltcG9ydGVyLCdpdGVyX21vZHVsZXMnKToKKyAgICAgICAgcmV0dXJuIFtdCisgICAgcmV0dXJuIGltcG9ydGVyLml0ZXJfbW9kdWxlcyhwcmVmaXgpCisKK2l0ZXJfaW1wb3J0ZXJfbW9kdWxlcyA9IHNpbXBsZWdlbmVyaWMoaXRlcl9pbXBvcnRlcl9tb2R1bGVzKQorCisKK2NsYXNzIEltcEltcG9ydGVyOgorICAgICIiIlBFUCAzMDIgSW1wb3J0ZXIgdGhhdCB3cmFwcyBQeXRob24ncyAiY2xhc3NpYyIgaW1wb3J0IGFsZ29yaXRobQorCisgICAgSW1wSW1wb3J0ZXIoZGlybmFtZSkgcHJvZHVjZXMgYSBQRVAgMzAyIGltcG9ydGVyIHRoYXQgc2VhcmNoZXMgdGhhdAorICAgIGRpcmVjdG9yeS4gIEltcEltcG9ydGVyKE5vbmUpIHByb2R1Y2VzIGEgUEVQIDMwMiBpbXBvcnRlciB0aGF0IHNlYXJjaGVzCisgICAgdGhlIGN1cnJlbnQgc3lzLnBhdGgsIHBsdXMgYW55IG1vZHVsZXMgdGhhdCBhcmUgZnJvemVuIG9yIGJ1aWx0LWluLgorCisgICAgTm90ZSB0aGF0IEltcEltcG9ydGVyIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGJlaW5nIHVzZWQgYnkgcGxhY2VtZW50CisgICAgb24gc3lzLm1ldGFfcGF0aC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPU5vbmUpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisKKyAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CisgICAgICAgICMgTm90ZTogd2UgaWdub3JlICdwYXRoJyBhcmd1bWVudCBzaW5jZSBpdCBpcyBvbmx5IHVzZWQgdmlhIG1ldGFfcGF0aAorICAgICAgICBzdWJuYW1lID0gZnVsbG5hbWUuc3BsaXQoIi4iKVstMV0KKyAgICAgICAgaWYgc3VibmFtZSAhPSBmdWxsbmFtZSBhbmQgc2VsZi5wYXRoIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBzZWxmLnBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHBhdGggPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gW29zLnBhdGgucmVhbHBhdGgoc2VsZi5wYXRoKV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSwgZmlsZW5hbWUsIGV0YyA9IGltcC5maW5kX21vZHVsZShzdWJuYW1lLCBwYXRoKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gSW1wTG9hZGVyKGZ1bGxuYW1lLCBmaWxlLCBmaWxlbmFtZSwgZXRjKQorCisgICAgZGVmIGl0ZXJfbW9kdWxlcyhzZWxmLCBwcmVmaXg9JycpOgorICAgICAgICBpZiBzZWxmLnBhdGggaXMgTm9uZSBvciBub3Qgb3MucGF0aC5pc2RpcihzZWxmLnBhdGgpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgeWllbGRlZCA9IHt9CisgICAgICAgIGltcG9ydCBpbnNwZWN0CisKKyAgICAgICAgZmlsZW5hbWVzID0gb3MubGlzdGRpcihzZWxmLnBhdGgpCisgICAgICAgIGZpbGVuYW1lcy5zb3J0KCkgICMgaGFuZGxlIHBhY2thZ2VzIGJlZm9yZSBzYW1lLW5hbWVkIG1vZHVsZXMKKworICAgICAgICBmb3IgZm4gaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShmbikKKyAgICAgICAgICAgIGlmIG1vZG5hbWU9PSdfX2luaXRfXycgb3IgbW9kbmFtZSBpbiB5aWVsZGVkOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBmbikKKyAgICAgICAgICAgIGlzcGtnID0gRmFsc2UKKworICAgICAgICAgICAgaWYgbm90IG1vZG5hbWUgYW5kIG9zLnBhdGguaXNkaXIocGF0aCkgYW5kICcuJyBub3QgaW4gZm46CisgICAgICAgICAgICAgICAgbW9kbmFtZSA9IGZuCisgICAgICAgICAgICAgICAgZm9yIGZuIGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHN1Ym5hbWUgPSBpbnNwZWN0LmdldG1vZHVsZW5hbWUoZm4pCisgICAgICAgICAgICAgICAgICAgIGlmIHN1Ym5hbWU9PSdfX2luaXRfXyc6CisgICAgICAgICAgICAgICAgICAgICAgICBpc3BrZyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAgIyBub3QgYSBwYWNrYWdlCisKKyAgICAgICAgICAgIGlmIG1vZG5hbWUgYW5kICcuJyBub3QgaW4gbW9kbmFtZToKKyAgICAgICAgICAgICAgICB5aWVsZGVkW21vZG5hbWVdID0gMQorICAgICAgICAgICAgICAgIHlpZWxkIHByZWZpeCArIG1vZG5hbWUsIGlzcGtnCisKKworY2xhc3MgSW1wTG9hZGVyOgorICAgICIiIlBFUCAzMDIgTG9hZGVyIHRoYXQgd3JhcHMgUHl0aG9uJ3MgImNsYXNzaWMiIGltcG9ydCBhbGdvcml0aG0KKyAgICAiIiIKKyAgICBjb2RlID0gc291cmNlID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bGxuYW1lLCBmaWxlLCBmaWxlbmFtZSwgZXRjKToKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5mdWxsbmFtZSA9IGZ1bGxuYW1lCisgICAgICAgIHNlbGYuZXRjID0gZXRjCisKKyAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICBzZWxmLl9yZW9wZW4oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2QgPSBpbXAubG9hZF9tb2R1bGUoZnVsbG5hbWUsIHNlbGYuZmlsZSwgc2VsZi5maWxlbmFtZSwgc2VsZi5ldGMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBzZWxmLmZpbGU6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgIyBOb3RlOiB3ZSBkb24ndCBzZXQgX19sb2FkZXJfXyBiZWNhdXNlIHdlIHdhbnQgdGhlIG1vZHVsZSB0byBsb29rCisgICAgICAgICMgbm9ybWFsOyBpLmUuIHRoaXMgaXMganVzdCBhIHdyYXBwZXIgZm9yIHN0YW5kYXJkIGltcG9ydCBtYWNoaW5lcnkKKyAgICAgICAgcmV0dXJuIG1vZAorCisgICAgZGVmIGdldF9kYXRhKHNlbGYsIHBhdGhuYW1lKToKKyAgICAgICAgcmV0dXJuIG9wZW4ocGF0aG5hbWUsICJyYiIpLnJlYWQoKQorCisgICAgZGVmIF9yZW9wZW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZmlsZSBhbmQgc2VsZi5maWxlLmNsb3NlZDoKKyAgICAgICAgICAgIGlmIG1vZF90eXBlPT1pbXAuUFlfU09VUkNFOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZSA9IG9wZW4oc2VsZi5maWxlbmFtZSwgJ3JVJykKKyAgICAgICAgICAgIGVsaWYgbW9kX3R5cGUgaW4gKGltcC5QWV9DT01QSUxFRCwgaW1wLkNfRVhURU5TSU9OKToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUgPSBvcGVuKHNlbGYuZmlsZW5hbWUsICdyYicpCisKKyAgICBkZWYgX2ZpeF9uYW1lKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgaWYgZnVsbG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5mdWxsbmFtZQorICAgICAgICBlbGlmIGZ1bGxuYW1lICE9IHNlbGYuZnVsbG5hbWU6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiTG9hZGVyIGZvciBtb2R1bGUgJXMgY2Fubm90IGhhbmRsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlICVzIiAlIChzZWxmLmZ1bGxuYW1lLCBmdWxsbmFtZSkpCisgICAgICAgIHJldHVybiBmdWxsbmFtZQorCisgICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICBmdWxsbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKGZ1bGxuYW1lKQorICAgICAgICByZXR1cm4gc2VsZi5ldGNbMl09PWltcC5QS0dfRElSRUNUT1JZCisKKyAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgZnVsbG5hbWU9Tm9uZSk6CisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5fZml4X25hbWUoZnVsbG5hbWUpCisgICAgICAgIGlmIHNlbGYuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgbW9kX3R5cGUgPSBzZWxmLmV0Y1syXQorICAgICAgICAgICAgaWYgbW9kX3R5cGU9PWltcC5QWV9TT1VSQ0U6CisgICAgICAgICAgICAgICAgc291cmNlID0gc2VsZi5nZXRfc291cmNlKGZ1bGxuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuY29kZSA9IGNvbXBpbGUoc291cmNlLCBzZWxmLmZpbGVuYW1lLCAnZXhlYycpCisgICAgICAgICAgICBlbGlmIG1vZF90eXBlPT1pbXAuUFlfQ09NUElMRUQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcmVvcGVuKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29kZSA9IHJlYWRfY29kZShzZWxmLmZpbGUpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIGVsaWYgbW9kX3R5cGU9PWltcC5QS0dfRElSRUNUT1JZOgorICAgICAgICAgICAgICAgIHNlbGYuY29kZSA9IHNlbGYuX2dldF9kZWxlZ2F0ZSgpLmdldF9jb2RlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY29kZQorCisgICAgZGVmIGdldF9zb3VyY2Uoc2VsZiwgZnVsbG5hbWU9Tm9uZSk6CisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5fZml4X25hbWUoZnVsbG5hbWUpCisgICAgICAgIGlmIHNlbGYuc291cmNlIGlzIE5vbmU6CisgICAgICAgICAgICBtb2RfdHlwZSA9IHNlbGYuZXRjWzJdCisgICAgICAgICAgICBpZiBtb2RfdHlwZT09aW1wLlBZX1NPVVJDRToKKyAgICAgICAgICAgICAgICBzZWxmLl9yZW9wZW4oKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2UgPSBzZWxmLmZpbGUucmVhZCgpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIGVsaWYgbW9kX3R5cGU9PWltcC5QWV9DT01QSUxFRDoKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmZpbGVuYW1lWzotMV0pOgorICAgICAgICAgICAgICAgICAgICBmID0gb3BlbihzZWxmLmZpbGVuYW1lWzotMV0sICdyVScpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc291cmNlID0gZi5yZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBlbGlmIG1vZF90eXBlPT1pbXAuUEtHX0RJUkVDVE9SWToKKyAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZSA9IHNlbGYuX2dldF9kZWxlZ2F0ZSgpLmdldF9zb3VyY2UoKQorICAgICAgICByZXR1cm4gc2VsZi5zb3VyY2UKKworCisgICAgZGVmIF9nZXRfZGVsZWdhdGUoc2VsZik6CisgICAgICAgIHJldHVybiBJbXBJbXBvcnRlcihzZWxmLmZpbGVuYW1lKS5maW5kX21vZHVsZSgnX19pbml0X18nKQorCisgICAgZGVmIGdldF9maWxlbmFtZShzZWxmLCBmdWxsbmFtZT1Ob25lKToKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLl9maXhfbmFtZShmdWxsbmFtZSkKKyAgICAgICAgbW9kX3R5cGUgPSBzZWxmLmV0Y1syXQorICAgICAgICBpZiBzZWxmLmV0Y1syXT09aW1wLlBLR19ESVJFQ1RPUlk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2RlbGVnYXRlKCkuZ2V0X2ZpbGVuYW1lKCkKKyAgICAgICAgZWxpZiBzZWxmLmV0Y1syXSBpbiAoaW1wLlBZX1NPVVJDRSwgaW1wLlBZX0NPTVBJTEVELCBpbXAuQ19FWFRFTlNJT04pOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCit0cnk6CisgICAgaW1wb3J0IHppcGltcG9ydAorICAgIGZyb20gemlwaW1wb3J0IGltcG9ydCB6aXBpbXBvcnRlcgorCisgICAgZGVmIGl0ZXJfemlwaW1wb3J0X21vZHVsZXMoaW1wb3J0ZXIsIHByZWZpeD0nJyk6CisgICAgICAgIGRpcmxpc3QgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbaW1wb3J0ZXIuYXJjaGl2ZV0ua2V5cygpCisgICAgICAgIGRpcmxpc3Quc29ydCgpCisgICAgICAgIF9wcmVmaXggPSBpbXBvcnRlci5wcmVmaXgKKyAgICAgICAgcGxlbiA9IGxlbihfcHJlZml4KQorICAgICAgICB5aWVsZGVkID0ge30KKyAgICAgICAgaW1wb3J0IGluc3BlY3QKKyAgICAgICAgZm9yIGZuIGluIGRpcmxpc3Q6CisgICAgICAgICAgICBpZiBub3QgZm4uc3RhcnRzd2l0aChfcHJlZml4KToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmbiA9IGZuW3BsZW46XS5zcGxpdChvcy5zZXApCisKKyAgICAgICAgICAgIGlmIGxlbihmbik9PTIgYW5kIGZuWzFdLnN0YXJ0c3dpdGgoJ19faW5pdF9fLnB5Jyk6CisgICAgICAgICAgICAgICAgaWYgZm5bMF0gbm90IGluIHlpZWxkZWQ6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkZWRbZm5bMF1dID0gMQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBmblswXSwgVHJ1ZQorCisgICAgICAgICAgICBpZiBsZW4oZm4pIT0xOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIG1vZG5hbWUgPSBpbnNwZWN0LmdldG1vZHVsZW5hbWUoZm5bMF0pCisgICAgICAgICAgICBpZiBtb2RuYW1lPT0nX19pbml0X18nOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIG1vZG5hbWUgYW5kICcuJyBub3QgaW4gbW9kbmFtZSBhbmQgbW9kbmFtZSBub3QgaW4geWllbGRlZDoKKyAgICAgICAgICAgICAgICB5aWVsZGVkW21vZG5hbWVdID0gMQorICAgICAgICAgICAgICAgIHlpZWxkIHByZWZpeCArIG1vZG5hbWUsIEZhbHNlCisKKyAgICBpdGVyX2ltcG9ydGVyX21vZHVsZXMucmVnaXN0ZXIoemlwaW1wb3J0ZXIsIGl0ZXJfemlwaW1wb3J0X21vZHVsZXMpCisKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCisKKworZGVmIGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pOgorICAgICIiIlJldHJpZXZlIGEgUEVQIDMwMiBpbXBvcnRlciBmb3IgdGhlIGdpdmVuIHBhdGggaXRlbQorCisgICAgVGhlIHJldHVybmVkIGltcG9ydGVyIGlzIGNhY2hlZCBpbiBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZQorICAgIGlmIGl0IHdhcyBuZXdseSBjcmVhdGVkIGJ5IGEgcGF0aCBob29rLgorCisgICAgSWYgdGhlcmUgaXMgbm8gaW1wb3J0ZXIsIGEgd3JhcHBlciBhcm91bmQgdGhlIGJhc2ljIGltcG9ydAorICAgIG1hY2hpbmVyeSBpcyByZXR1cm5lZC4gVGhpcyB3cmFwcGVyIGlzIG5ldmVyIGluc2VydGVkIGludG8KKyAgICB0aGUgaW1wb3J0ZXIgY2FjaGUgKE5vbmUgaXMgaW5zZXJ0ZWQgaW5zdGVhZCkuCisKKyAgICBUaGUgY2FjaGUgKG9yIHBhcnQgb2YgaXQpIGNhbiBiZSBjbGVhcmVkIG1hbnVhbGx5IGlmIGEKKyAgICByZXNjYW4gb2Ygc3lzLnBhdGhfaG9va3MgaXMgbmVjZXNzYXJ5LgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0ZXIgPSBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZVtwYXRoX2l0ZW1dCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBmb3IgcGF0aF9ob29rIGluIHN5cy5wYXRoX2hvb2tzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydGVyID0gcGF0aF9ob29rKHBhdGhfaXRlbSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGltcG9ydGVyID0gTm9uZQorICAgICAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5zZXRkZWZhdWx0KHBhdGhfaXRlbSxpbXBvcnRlcikKKworICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydGVyID0gSW1wSW1wb3J0ZXIocGF0aF9pdGVtKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIGltcG9ydGVyCisKKworZGVmIGl0ZXJfaW1wb3J0ZXJzKGZ1bGxuYW1lPSIiKToKKyAgICAiIiJZaWVsZCBQRVAgMzAyIGltcG9ydGVycyBmb3IgdGhlIGdpdmVuIG1vZHVsZSBuYW1lCisKKyAgICBJZiBmdWxsbmFtZSBjb250YWlucyBhICcuJywgdGhlIGltcG9ydGVycyB3aWxsIGJlIGZvciB0aGUgcGFja2FnZQorICAgIGNvbnRhaW5pbmcgZnVsbG5hbWUsIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgaW1wb3J0ZXJzIGZvciBzeXMubWV0YV9wYXRoLAorICAgIHN5cy5wYXRoLCBhbmQgUHl0aG9uJ3MgImNsYXNzaWMiIGltcG9ydCBtYWNoaW5lcnksIGluIHRoYXQgb3JkZXIuICBJZgorICAgIHRoZSBuYW1lZCBtb2R1bGUgaXMgaW4gYSBwYWNrYWdlLCB0aGF0IHBhY2thZ2UgaXMgaW1wb3J0ZWQgYXMgYSBzaWRlCisgICAgZWZmZWN0IG9mIGludm9raW5nIHRoaXMgZnVuY3Rpb24uCisKKyAgICBOb24gUEVQIDMwMiBtZWNoYW5pc21zIChlLmcuIHRoZSBXaW5kb3dzIHJlZ2lzdHJ5KSB1c2VkIGJ5IHRoZQorICAgIHN0YW5kYXJkIGltcG9ydCBtYWNoaW5lcnkgdG8gZmluZCBmaWxlcyBpbiBhbHRlcm5hdGl2ZSBsb2NhdGlvbnMKKyAgICBhcmUgcGFydGlhbGx5IHN1cHBvcnRlZCwgYnV0IGFyZSBzZWFyY2hlZCBBRlRFUiBzeXMucGF0aC4gTm9ybWFsbHksCisgICAgdGhlc2UgbG9jYXRpb25zIGFyZSBzZWFyY2hlZCBCRUZPUkUgc3lzLnBhdGgsIHByZXZlbnRpbmcgc3lzLnBhdGgKKyAgICBlbnRyaWVzIGZyb20gc2hhZG93aW5nIHRoZW0uCisKKyAgICBGb3IgdGhpcyB0byBjYXVzZSBhIHZpc2libGUgZGlmZmVyZW5jZSBpbiBiZWhhdmlvdXIsIHRoZXJlIG11c3QKKyAgICBiZSBhIG1vZHVsZSBvciBwYWNrYWdlIG5hbWUgdGhhdCBpcyBhY2Nlc3NpYmxlIHZpYSBib3RoIHN5cy5wYXRoCisgICAgYW5kIG9uZSBvZiB0aGUgbm9uIFBFUCAzMDIgZmlsZSBzeXN0ZW0gbWVjaGFuaXNtcy4gSW4gdGhpcyBjYXNlLAorICAgIHRoZSBlbXVsYXRpb24gd2lsbCBmaW5kIHRoZSBmb3JtZXIgdmVyc2lvbiwgd2hpbGUgdGhlIGJ1aWx0aW4KKyAgICBpbXBvcnQgbWVjaGFuaXNtIHdpbGwgZmluZCB0aGUgbGF0dGVyLgorCisgICAgSXRlbXMgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBjYW4gYmUgYWZmZWN0ZWQgYnkgdGhpcyBkaXNjcmVwYW5jeToKKyAgICAgICAgaW1wLkNfRVhURU5TSU9OLCBpbXAuUFlfU09VUkNFLCBpbXAuUFlfQ09NUElMRUQsIGltcC5QS0dfRElSRUNUT1JZCisgICAgIiIiCisgICAgaWYgZnVsbG5hbWUuc3RhcnRzd2l0aCgnLicpOgorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiUmVsYXRpdmUgbW9kdWxlIG5hbWVzIG5vdCBzdXBwb3J0ZWQiKQorICAgIGlmICcuJyBpbiBmdWxsbmFtZToKKyAgICAgICAgIyBHZXQgdGhlIGNvbnRhaW5pbmcgcGFja2FnZSdzIF9fcGF0aF9fCisgICAgICAgIHBrZyA9ICcuJy5qb2luKGZ1bGxuYW1lLnNwbGl0KCcuJylbOi0xXSkKKyAgICAgICAgaWYgcGtnIG5vdCBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgIF9faW1wb3J0X18ocGtnKQorICAgICAgICBwYXRoID0gZ2V0YXR0cihzeXMubW9kdWxlc1twa2ddLCdfX3BhdGhfXycsTm9uZSkgb3IgW10KKyAgICBlbHNlOgorICAgICAgICBmb3IgaW1wb3J0ZXIgaW4gc3lzLm1ldGFfcGF0aDoKKyAgICAgICAgICAgIHlpZWxkIGltcG9ydGVyCisgICAgICAgIHBhdGggPSBzeXMucGF0aAorICAgIGZvciBpdGVtIGluIHBhdGg6CisgICAgICAgIHlpZWxkIGdldF9pbXBvcnRlcihpdGVtKQorICAgIGlmICcuJyBub3QgaW4gZnVsbG5hbWU6CisgICAgICAgIHlpZWxkIEltcEltcG9ydGVyKCkKKworZGVmIGdldF9sb2FkZXIobW9kdWxlX29yX25hbWUpOgorICAgICIiIkdldCBhIFBFUCAzMDIgImxvYWRlciIgb2JqZWN0IGZvciBtb2R1bGVfb3JfbmFtZQorCisgICAgSWYgdGhlIG1vZHVsZSBvciBwYWNrYWdlIGlzIGFjY2Vzc2libGUgdmlhIHRoZSBub3JtYWwgaW1wb3J0CisgICAgbWVjaGFuaXNtLCBhIHdyYXBwZXIgYXJvdW5kIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoYXQgbWFjaGluZXJ5CisgICAgaXMgcmV0dXJuZWQuICBSZXR1cm5zIE5vbmUgaWYgdGhlIG1vZHVsZSBjYW5ub3QgYmUgZm91bmQgb3IgaW1wb3J0ZWQuCisgICAgSWYgdGhlIG5hbWVkIG1vZHVsZSBpcyBub3QgYWxyZWFkeSBpbXBvcnRlZCwgaXRzIGNvbnRhaW5pbmcgcGFja2FnZQorICAgIChpZiBhbnkpIGlzIGltcG9ydGVkLCBpbiBvcmRlciB0byBlc3RhYmxpc2ggdGhlIHBhY2thZ2UgX19wYXRoX18uCisKKyAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgaXRlcl9pbXBvcnRlcnMoKSwgYW5kIGlzIHRodXMgc3ViamVjdCB0byB0aGUgc2FtZQorICAgIGxpbWl0YXRpb25zIHJlZ2FyZGluZyBwbGF0Zm9ybS1zcGVjaWZpYyBzcGVjaWFsIGltcG9ydCBsb2NhdGlvbnMgc3VjaAorICAgIGFzIHRoZSBXaW5kb3dzIHJlZ2lzdHJ5LgorICAgICIiIgorICAgIGlmIG1vZHVsZV9vcl9uYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICBtb2R1bGVfb3JfbmFtZSA9IHN5cy5tb2R1bGVzW21vZHVsZV9vcl9uYW1lXQorICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlX29yX25hbWUsIE1vZHVsZVR5cGUpOgorICAgICAgICBtb2R1bGUgPSBtb2R1bGVfb3JfbmFtZQorICAgICAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwnX19sb2FkZXJfXycsTm9uZSkKKyAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGxvYWRlcgorICAgICAgICBmdWxsbmFtZSA9IG1vZHVsZS5fX25hbWVfXworICAgIGVsc2U6CisgICAgICAgIGZ1bGxuYW1lID0gbW9kdWxlX29yX25hbWUKKyAgICByZXR1cm4gZmluZF9sb2FkZXIoZnVsbG5hbWUpCisKK2RlZiBmaW5kX2xvYWRlcihmdWxsbmFtZSk6CisgICAgIiIiRmluZCBhIFBFUCAzMDIgImxvYWRlciIgb2JqZWN0IGZvciBmdWxsbmFtZQorCisgICAgSWYgZnVsbG5hbWUgY29udGFpbnMgZG90cywgcGF0aCBtdXN0IGJlIHRoZSBjb250YWluaW5nIHBhY2thZ2UncyBfX3BhdGhfXy4KKyAgICBSZXR1cm5zIE5vbmUgaWYgdGhlIG1vZHVsZSBjYW5ub3QgYmUgZm91bmQgb3IgaW1wb3J0ZWQuIFRoaXMgZnVuY3Rpb24gdXNlcworICAgIGl0ZXJfaW1wb3J0ZXJzKCksIGFuZCBpcyB0aHVzIHN1YmplY3QgdG8gdGhlIHNhbWUgbGltaXRhdGlvbnMgcmVnYXJkaW5nCisgICAgcGxhdGZvcm0tc3BlY2lmaWMgc3BlY2lhbCBpbXBvcnQgbG9jYXRpb25zIHN1Y2ggYXMgdGhlIFdpbmRvd3MgcmVnaXN0cnkuCisgICAgIiIiCisgICAgZm9yIGltcG9ydGVyIGluIGl0ZXJfaW1wb3J0ZXJzKGZ1bGxuYW1lKToKKyAgICAgICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUoZnVsbG5hbWUpCisgICAgICAgIGlmIGxvYWRlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBsb2FkZXIKKworICAgIHJldHVybiBOb25lCisKIAogZGVmIGV4dGVuZF9wYXRoKHBhdGgsIG5hbWUpOgogICAgICIiIkV4dGVuZCBhIHBhY2thZ2UncyBwYXRoLgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5IGIvTGliL3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5CmluZGV4IGIwMzVkOWUuLjc2YmRiMDYgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9hcHBsZXNpbmdsZS5weQorKysgYi9MaWIvcGxhdC1tYWMvYXBwbGVzaW5nbGUucHkKQEAgLTI1LDcgKzI1LDcgQEAKICAgICBwYXNzCiAKICMgRmlsZSBoZWFkZXIgZm9ybWF0OiBtYWdpYywgdmVyc2lvbiwgdW51c2VkLCBudW1iZXIgb2YgZW50cmllcwotQVNfSEVBREVSX0ZPUk1BVD0iPmxsMTZzaCIKK0FTX0hFQURFUl9GT1JNQVQ9Ij5MTDE2c2giCiBBU19IRUFERVJfTEVOR1RIPTI2CiAjIFRoZSBmbGFnIHdvcmRzIGZvciBBcHBsZVNpbmdsZQogQVNfTUFHSUM9MHgwMDA1MTYwMApkaWZmIC0tZ2l0IGEvTGliL3BsYXRmb3JtLnB5IGIvTGliL3BsYXRmb3JtLnB5CmluZGV4IDYyZmRhZjQuLjI4OGJjOTUgMTAwNzU1Ci0tLSBhL0xpYi9wbGF0Zm9ybS5weQorKysgYi9MaWIvcGxhdGZvcm0ucHkKQEAgLTYwNyw3ICs2MDcsOCBAQAogICAgICAgICB2ZXJzaW9uaW5mbyA9ICh2ZXJzaW9uLHN0YWdlLG5vbnJlbCkKICAgICBpZiBzeXNhOgogICAgICAgICBtYWNoaW5lID0gezB4MTogJzY4aycsCi0gICAgICAgICAgICAgICAgICAgMHgyOiAnUG93ZXJQQyd9LmdldChzeXNhLCcnKQorICAgICAgICAgICAgICAgICAgIDB4MjogJ1Bvd2VyUEMnLAorICAgICAgICAgICAgICAgICAgIDB4YTogJ2kzODYnfS5nZXQoc3lzYSwnJykKICAgICByZXR1cm4gcmVsZWFzZSx2ZXJzaW9uaW5mbyxtYWNoaW5lCiAKIGRlZiBfamF2YV9nZXRwcm9wKG5hbWUsZGVmYXVsdCk6CmRpZmYgLS1naXQgYS9MaWIvcG9wZW4yLnB5IGIvTGliL3BvcGVuMi5weQppbmRleCA1NDU0M2JlLi42N2ViZDI2IDEwMDY0NAotLS0gYS9MaWIvcG9wZW4yLnB5CisrKyBiL0xpYi9wb3BlbjIucHkKQEAgLTIwLDcgKzIwLDEzIEBACiAKIGRlZiBfY2xlYW51cCgpOgogICAgIGZvciBpbnN0IGluIF9hY3RpdmVbOl06Ci0gICAgICAgIGluc3QucG9sbCgpCisgICAgICAgIGlmIGluc3QucG9sbChfZGVhZHN0YXRlPXN5cy5tYXhpbnQpID49IDA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoaW5zdCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICMgVGhpcyBjYW4gaGFwcGVuIGlmIHR3byB0aHJlYWRzIGNyZWF0ZSBhIG5ldyBQb3BlbiBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAjIEl0J3MgaGFybWxlc3MgdGhhdCBpdCB3YXMgYWxyZWFkeSByZW1vdmVkLCBzbyBpZ25vcmUuCisgICAgICAgICAgICAgICAgcGFzcwogCiBjbGFzcyBQb3BlbjM6CiAgICAgIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGEgY2hpbGQgcHJvY2Vzcy4gIE5vcm1hbGx5IGluc3RhbmNlcyBhcmUgY3JlYXRlZApAQCAtMzksNiArNDUsNyBAQAogICAgICAgICBzcGVjaWZpZWQsIGl0IHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgSS9PIGJ1ZmZlcnMgdG8vZnJvbSB0aGUgY2hpbGQKICAgICAgICAgcHJvY2Vzcy4iIiIKICAgICAgICAgX2NsZWFudXAoKQorICAgICAgICBzZWxmLmNtZCA9IGNtZAogICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSA9IG9zLnBpcGUoKQogICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSA9IG9zLnBpcGUoKQogICAgICAgICBpZiBjYXB0dXJlc3RkZXJyOgpAQCAtNjAsNyArNjcsMTMgQEAKICAgICAgICAgICAgIHNlbGYuY2hpbGRlcnIgPSBvcy5mZG9wZW4oZXJyb3V0LCAncicsIGJ1ZnNpemUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmNoaWxkZXJyID0gTm9uZQotICAgICAgICBfYWN0aXZlLmFwcGVuZChzZWxmKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICMgSW4gY2FzZSB0aGUgY2hpbGQgaGFzbid0IGJlZW4gd2FpdGVkIG9uLCBjaGVjayBpZiBpdCdzIGRvbmUuCisgICAgICAgIHNlbGYucG9sbChfZGVhZHN0YXRlPXN5cy5tYXhpbnQpCisgICAgICAgIGlmIHNlbGYuc3RzIDwgMDoKKyAgICAgICAgICAgICMgQ2hpbGQgaXMgc3RpbGwgcnVubmluZywga2VlcCB1cyBhbGl2ZSB1bnRpbCB3ZSBjYW4gd2FpdCBvbiBpdC4KKyAgICAgICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCiAKICAgICBkZWYgX3J1bl9jaGlsZChzZWxmLCBjbWQpOgogICAgICAgICBpZiBpc2luc3RhbmNlKGNtZCwgYmFzZXN0cmluZyk6CkBAIC03NSwyNiArODgsMjggQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLl9leGl0KDEpCiAKLSAgICBkZWYgcG9sbChzZWxmKToKKyAgICBkZWYgcG9sbChzZWxmLCBfZGVhZHN0YXRlPU5vbmUpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzIGlmIGl0IGhhcyBmaW5pc2hlZCwKICAgICAgICAgb3IgLTEgaWYgaXQgaGFzbid0IGZpbmlzaGVkIHlldC4iIiIKICAgICAgICAgaWYgc2VsZi5zdHMgPCAwOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gb3Mud2FpdHBpZChzZWxmLnBpZCwgb3MuV05PSEFORykKKyAgICAgICAgICAgICAgICAjIHBpZCB3aWxsIGJlIDAgaWYgc2VsZi5waWQgaGFzbid0IHRlcm1pbmF0ZWQKICAgICAgICAgICAgICAgICBpZiBwaWQgPT0gc2VsZi5waWQ6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RzID0gc3RzCi0gICAgICAgICAgICAgICAgICAgIF9hY3RpdmUucmVtb3ZlKHNlbGYpCiAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGlmIF9kZWFkc3RhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RzID0gX2RlYWRzdGF0ZQogICAgICAgICByZXR1cm4gc2VsZi5zdHMKIAogICAgIGRlZiB3YWl0KHNlbGYpOgogICAgICAgICAiIiJXYWl0IGZvciBhbmQgcmV0dXJuIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4iIiIKICAgICAgICAgaWYgc2VsZi5zdHMgPCAwOgogICAgICAgICAgICAgcGlkLCBzdHMgPSBvcy53YWl0cGlkKHNlbGYucGlkLCAwKQotICAgICAgICAgICAgaWYgcGlkID09IHNlbGYucGlkOgotICAgICAgICAgICAgICAgIHNlbGYuc3RzID0gc3RzCi0gICAgICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoc2VsZikKKyAgICAgICAgICAgICMgVGhpcyB1c2VkIHRvIGJlIGEgdGVzdCwgYnV0IGl0IGlzIGJlbGlldmVkIHRvIGJlCisgICAgICAgICAgICAjIGFsd2F5cyB0cnVlLCBzbyBJIGNoYW5nZWQgaXQgdG8gYW4gYXNzZXJ0aW9uIC0gbXZsCisgICAgICAgICAgICBhc3NlcnQgcGlkID09IHNlbGYucGlkCisgICAgICAgICAgICBzZWxmLnN0cyA9IHN0cwogICAgICAgICByZXR1cm4gc2VsZi5zdHMKIAogCkBAIC0xMDMsNiArMTE4LDcgQEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWQsIGJ1ZnNpemU9LTEpOgogICAgICAgICBfY2xlYW51cCgpCisgICAgICAgIHNlbGYuY21kID0gY21kCiAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gb3MucGlwZSgpCiAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gb3MucGlwZSgpCiAgICAgICAgIHNlbGYucGlkID0gb3MuZm9yaygpCkBAIC0xMTYsNyArMTMyLDYgQEAKICAgICAgICAgc2VsZi50b2NoaWxkID0gb3MuZmRvcGVuKHAyY3dyaXRlLCAndycsIGJ1ZnNpemUpCiAgICAgICAgIG9zLmNsb3NlKGMycHdyaXRlKQogICAgICAgICBzZWxmLmZyb21jaGlsZCA9IG9zLmZkb3BlbihjMnByZWFkLCAncicsIGJ1ZnNpemUpCi0gICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCiAKIAogaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAid2luIiBvciBzeXMucGxhdGZvcm0gPT0gIm9zMmVteCI6CkBAIC0xODYsNiArMjAxLDkgQEAKICAgICBfX2FsbF9fLmV4dGVuZChbIlBvcGVuMyIsICJQb3BlbjQiXSkKIAogZGVmIF90ZXN0KCk6CisgICAgIyBXaGVuIHRoZSB0ZXN0IHJ1bnMsIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgb3BlbiBwaXBlcworICAgIF9jbGVhbnVwKCkKKyAgICBhc3NlcnQgbm90IF9hY3RpdmUsICJBY3RpdmUgcGlwZXMgd2hlbiB0ZXN0IHN0YXJ0cyAiICsgcmVwcihbYy5jbWQgZm9yIGMgaW4gX2FjdGl2ZV0pCiAgICAgY21kICA9ICJjYXQiCiAgICAgdGVzdHN0ciA9ICJhYiBjZFxuIgogICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKQEAgLTIxNiw2ICsyMzQsNyBAQAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmV4cGVjdGVkICVyIG9uIHN0ZGVyciIgJSAoZ290LCkpCiAgICAgZm9yIGluc3QgaW4gX2FjdGl2ZVs6XToKICAgICAgICAgaW5zdC53YWl0KCkKKyAgICBfY2xlYW51cCgpCiAgICAgaWYgX2FjdGl2ZToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiX2FjdGl2ZSBub3QgZW1wdHkiKQogICAgIHByaW50ICJBbGwgT0siCmRpZmYgLS1naXQgYS9MaWIvcHN0YXRzLnB5IGIvTGliL3BzdGF0cy5weQppbmRleCA5MzBjYzZkLi5jM2E4ODI4IDEwMDY0NAotLS0gYS9MaWIvcHN0YXRzLnB5CisrKyBiL0xpYi9wc3RhdHMucHkKQEAgLTMyLDYgKzMyLDcgQEAKICMgQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KIAogCitpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCB0aW1lCiBpbXBvcnQgbWFyc2hhbApAQCAtNTgsMTggKzU5LDMxIEBACiAgICAgcHJpbnRlZC4KIAogICAgIFRoZSBzb3J0X3N0YXRzKCkgbWV0aG9kIG5vdyBwcm9jZXNzZXMgc29tZSBhZGRpdGlvbmFsIG9wdGlvbnMgKGkuZS4sIGluCi0gICAgYWRkaXRpb24gdG8gdGhlIG9sZCAtMSwgMCwgMSwgb3IgMikuICBJdCB0YWtlcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHF1b3RlZAotICAgIHN0cmluZ3MgdG8gc2VsZWN0IHRoZSBzb3J0IG9yZGVyLiAgRm9yIGV4YW1wbGUgc29ydF9zdGF0cygndGltZScsICduYW1lJykKLSAgICBzb3J0cyBvbiB0aGUgbWFqb3Iga2V5IG9mICJpbnRlcm5hbCBmdW5jdGlvbiB0aW1lIiwgYW5kIG9uIHRoZSBtaW5vcgotICAgIGtleSBvZiAndGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uJy4gIExvb2sgYXQgdGhlIHR3byB0YWJsZXMgaW4gc29ydF9zdGF0cygpCi0gICAgYW5kIGdldF9zb3J0X2FyZ19kZWZzKHNlbGYpIGZvciBtb3JlIGV4YW1wbGVzLgorICAgIGFkZGl0aW9uIHRvIHRoZSBvbGQgLTEsIDAsIDEsIG9yIDIpLiAgSXQgdGFrZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZgorICAgIHF1b3RlZCBzdHJpbmdzIHRvIHNlbGVjdCB0aGUgc29ydCBvcmRlci4gIEZvciBleGFtcGxlIHNvcnRfc3RhdHMoJ3RpbWUnLAorICAgICduYW1lJykgc29ydHMgb24gdGhlIG1ham9yIGtleSBvZiAnaW50ZXJuYWwgZnVuY3Rpb24gdGltZScsIGFuZCBvbiB0aGUKKyAgICBtaW5vciBrZXkgb2YgJ3RoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbicuICBMb29rIGF0IHRoZSB0d28gdGFibGVzIGluCisgICAgc29ydF9zdGF0cygpIGFuZCBnZXRfc29ydF9hcmdfZGVmcyhzZWxmKSBmb3IgbW9yZSBleGFtcGxlcy4KIAotICAgIEFsbCBtZXRob2RzIG5vdyByZXR1cm4gInNlbGYiLCAgc28geW91IGNhbiBzdHJpbmcgdG9nZXRoZXIgY29tbWFuZHMgbGlrZToKKyAgICBBbGwgbWV0aG9kcyByZXR1cm4gc2VsZiwgIHNvIHlvdSBjYW4gc3RyaW5nIHRvZ2V0aGVyIGNvbW1hbmRzIGxpa2U6CiAgICAgICAgIFN0YXRzKCdmb28nLCAnZ29vJykuc3RyaXBfZGlycygpLnNvcnRfc3RhdHMoJ2NhbGxzJykuXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0YXRzKDUpLnByaW50X2NhbGxlcnMoNSkKICAgICAiIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAjIEkgY2FuJ3QgZmlndXJlIG91dCBob3cgdG8gZXhwbGljdGx5IHNwZWNpZnkgYSBzdHJlYW0ga2V5d29yZCBhcmcKKyAgICAgICAgIyB3aXRoICphcmdzOgorICAgICAgICAjICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCBzdHJlYW09c3lzLnN0ZG91dCk6IC4uLgorICAgICAgICAjIHNvIEkgdXNlICoqa3dkcyBhbmQgc3FhdXdrIGlmIHNvbWV0aGluZyB1bmV4cGVjdGVkIGlzIHBhc3NlZCBpbi4KKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzeXMuc3Rkb3V0CisgICAgICAgIGlmICJzdHJlYW0iIGluIGt3ZHM6CisgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IGt3ZHNbInN0cmVhbSJdCisgICAgICAgICAgICBkZWwga3dkc1sic3RyZWFtIl0KKyAgICAgICAgaWYga3dkczoKKyAgICAgICAgICAgIGtleXMgPSBrd2RzLmtleXMoKQorICAgICAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgICAgIGV4dHJhcyA9ICIsICIuam9pbihbIiVzPSVzIiAlIChrLCBrd2RzW2tdKSBmb3IgayBpbiBrZXlzXSkKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bnJlY29nbml6ZWQga2V5d29yZCBhcmdzOiAlcyIgJSBleHRyYXMKICAgICAgICAgaWYgbm90IGxlbihhcmdzKToKICAgICAgICAgICAgIGFyZyA9IE5vbmUKICAgICAgICAgZWxzZToKQEAgLTk2LDkgKzExMCw5IEBACiAgICAgICAgICAgICB0cm91YmxlID0gMAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgaWYgdHJvdWJsZToKLSAgICAgICAgICAgICAgICBwcmludCAiSW52YWxpZCB0aW1pbmcgZGF0YSIsCi0gICAgICAgICAgICAgICAgaWYgc2VsZi5maWxlczogcHJpbnQgc2VsZi5maWxlc1stMV0sCi0gICAgICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkludmFsaWQgdGltaW5nIGRhdGEiLAorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmlsZXM6IHByaW50ID4+IHNlbGYuc3RyZWFtLCBzZWxmLmZpbGVzWy0xXSwKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQogCiAgICAgZGVmIGxvYWRfc3RhdHMoc2VsZiwgYXJnKToKICAgICAgICAgaWYgbm90IGFyZzogIHNlbGYuc3RhdHMgPSB7fQpAQCAtMzIwLDcgKzMzNCw3IEBACiAKICAgICAgICAgaWYgbm90IGxpc3Q6CiAgICAgICAgICAgICByZXR1cm4gMCwgbGlzdAotICAgICAgICBwcmludCBtc2cKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIG1zZwogICAgICAgICBpZiBjb3VudCA8IGxlbihzZWxmLnN0YXRzKToKICAgICAgICAgICAgIHdpZHRoID0gMAogICAgICAgICAgICAgZm9yIGZ1bmMgaW4gbGlzdDoKQEAgLTMzMCwyNCArMzQ0LDI0IEBACiAKICAgICBkZWYgcHJpbnRfc3RhdHMoc2VsZiwgKmFtb3VudCk6CiAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzZWxmLmZpbGVzOgotICAgICAgICAgICAgcHJpbnQgZmlsZW5hbWUKLSAgICAgICAgaWYgc2VsZi5maWxlczogcHJpbnQKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmaWxlbmFtZQorICAgICAgICBpZiBzZWxmLmZpbGVzOiBwcmludCA+PiBzZWxmLnN0cmVhbQogICAgICAgICBpbmRlbnQgPSAnICcgKiA4CiAgICAgICAgIGZvciBmdW5jIGluIHNlbGYudG9wX2xldmVsOgotICAgICAgICAgICAgcHJpbnQgaW5kZW50LCBmdW5jX2dldF9mdW5jdGlvbl9uYW1lKGZ1bmMpCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgaW5kZW50LCBmdW5jX2dldF9mdW5jdGlvbl9uYW1lKGZ1bmMpCiAKLSAgICAgICAgcHJpbnQgaW5kZW50LCBzZWxmLnRvdGFsX2NhbGxzLCAiZnVuY3Rpb24gY2FsbHMiLAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgaW5kZW50LCBzZWxmLnRvdGFsX2NhbGxzLCAiZnVuY3Rpb24gY2FsbHMiLAogICAgICAgICBpZiBzZWxmLnRvdGFsX2NhbGxzICE9IHNlbGYucHJpbV9jYWxsczoKLSAgICAgICAgICAgIHByaW50ICIoJWQgcHJpbWl0aXZlIGNhbGxzKSIgJSBzZWxmLnByaW1fY2FsbHMsCi0gICAgICAgIHByaW50ICJpbiAlLjNmIENQVSBzZWNvbmRzIiAlIHNlbGYudG90YWxfdHQKLSAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiKCVkIHByaW1pdGl2ZSBjYWxscykiICUgc2VsZi5wcmltX2NhbGxzLAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgImluICUuM2YgQ1BVIHNlY29uZHMiICUgc2VsZi50b3RhbF90dAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQogICAgICAgICB3aWR0aCwgbGlzdCA9IHNlbGYuZ2V0X3ByaW50X2xpc3QoYW1vdW50KQogICAgICAgICBpZiBsaXN0OgogICAgICAgICAgICAgc2VsZi5wcmludF90aXRsZSgpCiAgICAgICAgICAgICBmb3IgZnVuYyBpbiBsaXN0OgogICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfbGluZShmdW5jKQotICAgICAgICAgICAgcHJpbnQKLSAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgIGRlZiBwcmludF9jYWxsZWVzKHNlbGYsICphbW91bnQpOgpAQCAtMzYxLDggKzM3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY2FsbF9saW5lKHdpZHRoLCBmdW5jLCBzZWxmLmFsbF9jYWxsZWVzW2Z1bmNdKQogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY2FsbF9saW5lKHdpZHRoLCBmdW5jLCB7fSkKLSAgICAgICAgICAgIHByaW50Ci0gICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCiAgICAgICAgIHJldHVybiBzZWxmCiAKICAgICBkZWYgcHJpbnRfY2FsbGVycyhzZWxmLCAqYW1vdW50KToKQEAgLTM3MiwxMiArMzg2LDEyIEBACiAgICAgICAgICAgICBmb3IgZnVuYyBpbiBsaXN0OgogICAgICAgICAgICAgICAgIGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzID0gc2VsZi5zdGF0c1tmdW5jXQogICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY2FsbF9saW5lKHdpZHRoLCBmdW5jLCBjYWxsZXJzLCAiPC0iKQotICAgICAgICAgICAgcHJpbnQKLSAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgIGRlZiBwcmludF9jYWxsX2hlYWRpbmcoc2VsZiwgbmFtZV9zaXplLCBjb2x1bW5fdGl0bGUpOgotICAgICAgICBwcmludCAiRnVuY3Rpb24gIi5sanVzdChuYW1lX3NpemUpICsgY29sdW1uX3RpdGxlCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiRnVuY3Rpb24gIi5sanVzdChuYW1lX3NpemUpICsgY29sdW1uX3RpdGxlCiAgICAgICAgICMgcHJpbnQgc3ViLWhlYWRlciBvbmx5IGlmIHdlIGhhdmUgbmV3LXN0eWxlIGNhbGxlcnMKICAgICAgICAgc3ViaGVhZGVyID0gRmFsc2UKICAgICAgICAgZm9yIGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzIGluIHNlbGYuc3RhdHMuaXRlcnZhbHVlcygpOgpAQCAtMzg2LDEyICs0MDAsMTIgQEAKICAgICAgICAgICAgICAgICBzdWJoZWFkZXIgPSBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSkKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICBpZiBzdWJoZWFkZXI6Ci0gICAgICAgICAgICBwcmludCAiICIqbmFtZV9zaXplICsgIiAgICBuY2FsbHMgIHRvdHRpbWUgIGN1bXRpbWUiCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiAiKm5hbWVfc2l6ZSArICIgICAgbmNhbGxzICB0b3R0aW1lICBjdW10aW1lIgogCiAgICAgZGVmIHByaW50X2NhbGxfbGluZShzZWxmLCBuYW1lX3NpemUsIHNvdXJjZSwgY2FsbF9kaWN0LCBhcnJvdz0iLT4iKToKLSAgICAgICAgcHJpbnQgZnVuY19zdGRfc3RyaW5nKHNvdXJjZSkubGp1c3QobmFtZV9zaXplKSArIGFycm93LAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgZnVuY19zdGRfc3RyaW5nKHNvdXJjZSkubGp1c3QobmFtZV9zaXplKSArIGFycm93LAogICAgICAgICBpZiBub3QgY2FsbF9kaWN0OgotICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgY2xpc3QgPSBjYWxsX2RpY3Qua2V5cygpCiAgICAgICAgIGNsaXN0LnNvcnQoKQpAQCAtNDExLDMwICs0MjUsMzAgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc3Vic3RhdHMgPSAnJXMoJXIpICVzJyAlIChuYW1lLCB2YWx1ZSwgZjgoc2VsZi5zdGF0c1tmdW5jXVszXSkpCiAgICAgICAgICAgICAgICAgbGVmdF93aWR0aCA9IG5hbWVfc2l6ZSArIDMKLSAgICAgICAgICAgIHByaW50IGluZGVudCpsZWZ0X3dpZHRoICsgc3Vic3RhdHMKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBpbmRlbnQqbGVmdF93aWR0aCArIHN1YnN0YXRzCiAgICAgICAgICAgICBpbmRlbnQgPSAiICIKIAogICAgIGRlZiBwcmludF90aXRsZShzZWxmKToKLSAgICAgICAgcHJpbnQgJyAgIG5jYWxscyAgdG90dGltZSAgcGVyY2FsbCAgY3VtdGltZSAgcGVyY2FsbCcsIFwKLSAgICAgICAgICAgICAgJ2ZpbGVuYW1lOmxpbmVubyhmdW5jdGlvbiknCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAnICAgbmNhbGxzICB0b3R0aW1lICBwZXJjYWxsICBjdW10aW1lICBwZXJjYWxsJywKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICdmaWxlbmFtZTpsaW5lbm8oZnVuY3Rpb24pJwogCiAgICAgZGVmIHByaW50X2xpbmUoc2VsZiwgZnVuYyk6ICAjIGhhY2sgOiBzaG91bGQgcHJpbnQgcGVyY2VudGFnZXMKICAgICAgICAgY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMgPSBzZWxmLnN0YXRzW2Z1bmNdCiAgICAgICAgIGMgPSBzdHIobmMpCiAgICAgICAgIGlmIG5jICE9IGNjOgogICAgICAgICAgICAgYyA9IGMgKyAnLycgKyBzdHIoY2MpCi0gICAgICAgIHByaW50IGMucmp1c3QoOSksCi0gICAgICAgIHByaW50IGY4KHR0KSwKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGMucmp1c3QoOSksCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmOCh0dCksCiAgICAgICAgIGlmIG5jID09IDA6Ci0gICAgICAgICAgICBwcmludCAnICcqOCwKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAnICcqOCwKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50IGY4KHR0L25jKSwKLSAgICAgICAgcHJpbnQgZjgoY3QpLAorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGY4KHR0L25jKSwKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGY4KGN0KSwKICAgICAgICAgaWYgY2MgPT0gMDoKLSAgICAgICAgICAgIHByaW50ICcgJyo4LAorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICcgJyo4LAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgZjgoY3QvY2MpLAotICAgICAgICBwcmludCBmdW5jX3N0ZF9zdHJpbmcoZnVuYykKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmOChjdC9jYyksCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmdW5jX3N0ZF9zdHJpbmcoZnVuYykKIAogY2xhc3MgVHVwbGVDb21wOgogICAgICIiIlRoaXMgY2xhc3MgcHJvdmlkZXMgYSBnZW5lcmljIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcgYW55IHR3byB0dXBsZXMuCkBAIC01NDksNyArNTYzLDcgQEAKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIGZyYWMgPSBmbG9hdCh0ZXJtKQogICAgICAgICAgICAgICAgICAgICBpZiBmcmFjID4gMSBvciBmcmFjIDwgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJGcmFjdGlvbiBhcmd1bWVudCBtdXMgYmUgaW4gWzAsIDFdIgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJGcmFjdGlvbiBhcmd1bWVudCBtdXN0IGJlIGluIFswLCAxXSIKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hcHBlbmQoZnJhYykKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKQEAgLTU1OSw5MyArNTczLDkzIEBACiAgICAgICAgICAgICBpZiBzZWxmLnN0YXRzOgogICAgICAgICAgICAgICAgIGdldGF0dHIoc2VsZi5zdGF0cywgZm4pKCpwcm9jZXNzZWQpCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICJObyBzdGF0aXN0aWNzIG9iamVjdCBpcyBsb2FkZWQuIgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiTm8gc3RhdGlzdGljcyBvYmplY3QgaXMgbG9hZGVkLiIKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGRlZiBnZW5lcmljX2hlbHAoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiQXJndW1lbnRzIG1heSBiZToiCi0gICAgICAgICAgICBwcmludCAiKiBBbiBpbnRlZ2VyIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8gcHJpbnQuIgotICAgICAgICAgICAgcHJpbnQgIiogQSBkZWNpbWFsIGZyYWN0aW9uYWwgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSwgY29udHJvbGxpbmciCi0gICAgICAgICAgICBwcmludCAiICB3aGF0IGZyYWN0aW9uIG9mIHNlbGVjdGVkIGVudHJpZXMgdG8gcHJpbnQuIgotICAgICAgICAgICAgcHJpbnQgIiogQSByZWd1bGFyIGV4cHJlc3Npb247IG9ubHkgZW50cmllcyB3aXRoIGZ1bmN0aW9uIG5hbWVzIgotICAgICAgICAgICAgcHJpbnQgIiAgdGhhdCBtYXRjaCBpdCBhcmUgcHJpbnRlZC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkFyZ3VtZW50cyBtYXkgYmU6IgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIqIEFuIGludGVnZXIgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBwcmludC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiogQSBkZWNpbWFsIGZyYWN0aW9uYWwgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSwgY29udHJvbGxpbmciCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiAgd2hhdCBmcmFjdGlvbiBvZiBzZWxlY3RlZCBlbnRyaWVzIHRvIHByaW50LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbjsgb25seSBlbnRyaWVzIHdpdGggZnVuY3Rpb24gbmFtZXMiCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiAgdGhhdCBtYXRjaCBpdCBhcmUgcHJpbnRlZC4iCiAKICAgICAgICAgZGVmIGRvX2FkZChzZWxmLCBsaW5lKToKICAgICAgICAgICAgIHNlbGYuc3RhdHMuYWRkKGxpbmUpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBkZWYgaGVscF9hZGQoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiQWRkIHByb2ZpbGUgaW5mbyBmcm9tIGdpdmVuIGZpbGUgdG8gY3VycmVudCBzdGF0aXN0aWNzIG9iamVjdC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkFkZCBwcm9maWxlIGluZm8gZnJvbSBnaXZlbiBmaWxlIHRvIGN1cnJlbnQgc3RhdGlzdGljcyBvYmplY3QuIgogCiAgICAgICAgIGRlZiBkb19jYWxsZWVzKHNlbGYsIGxpbmUpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2VuZXJpYygncHJpbnRfY2FsbGVlcycsIGxpbmUpCiAgICAgICAgIGRlZiBoZWxwX2NhbGxlZXMoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiUHJpbnQgY2FsbGVlcyBzdGF0aXN0aWNzIGZyb20gdGhlIGN1cnJlbnQgc3RhdCBvYmplY3QuIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJQcmludCBjYWxsZWVzIHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCiAgICAgICAgICAgICBzZWxmLmdlbmVyaWNfaGVscCgpCiAKICAgICAgICAgZGVmIGRvX2NhbGxlcnMoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZW5lcmljKCdwcmludF9jYWxsZXJzJywgbGluZSkKICAgICAgICAgZGVmIGhlbHBfY2FsbGVycyhzZWxmKToKLSAgICAgICAgICAgIHByaW50ICJQcmludCBjYWxsZXJzIHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlByaW50IGNhbGxlcnMgc3RhdGlzdGljcyBmcm9tIHRoZSBjdXJyZW50IHN0YXQgb2JqZWN0LiIKICAgICAgICAgICAgIHNlbGYuZ2VuZXJpY19oZWxwKCkKIAogICAgICAgICBkZWYgZG9fRU9GKHNlbGYsIGxpbmUpOgotICAgICAgICAgICAgcHJpbnQgIiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiIgogICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgZGVmIGhlbHBfRU9GKHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIkxlYXZlIHRoZSBwcm9maWxlIGJyb3dlci4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkxlYXZlIHRoZSBwcm9maWxlIGJyb3dlci4iCiAKICAgICAgICAgZGVmIGRvX3F1aXQoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICBkZWYgaGVscF9xdWl0KHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIkxlYXZlIHRoZSBwcm9maWxlIGJyb3dlci4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkxlYXZlIHRoZSBwcm9maWxlIGJyb3dlci4iCiAKICAgICAgICAgZGVmIGRvX3JlYWQoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICBpZiBsaW5lOgogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0cyA9IFN0YXRzKGxpbmUpCiAgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGFyZ3M6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50IGFyZ3NbMV0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgc2VsZi5wcm9tcHQgPSBsaW5lICsgIiUgIgogICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5wcm9tcHQpID4gMjoKICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5wcm9tcHRbLTI6XQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAiTm8gc3RhdGlzdGljcyBvYmplY3QgaXMgY3VycmVudCAtLSBjYW5ub3QgcmVsb2FkLiIKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIk5vIHN0YXRpc3RpY3Mgb2JqZWN0IGlzIGN1cnJlbnQgLS0gY2Fubm90IHJlbG9hZC4iCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBkZWYgaGVscF9yZWFkKHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIlJlYWQgaW4gcHJvZmlsZSBkYXRhIGZyb20gYSBzcGVjaWZpZWQgZmlsZS4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlJlYWQgaW4gcHJvZmlsZSBkYXRhIGZyb20gYSBzcGVjaWZpZWQgZmlsZS4iCiAKICAgICAgICAgZGVmIGRvX3JldmVyc2Uoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICBzZWxmLnN0YXRzLnJldmVyc2Vfb3JkZXIoKQogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZGVmIGhlbHBfcmV2ZXJzZShzZWxmKToKLSAgICAgICAgICAgIHByaW50ICJSZXZlcnNlIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBwcm9maWxpbmcgcmVwb3J0LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiUmV2ZXJzZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgcHJvZmlsaW5nIHJlcG9ydC4iCiAKICAgICAgICAgZGVmIGRvX3NvcnQoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICBhYmJyZXZzID0gc2VsZi5zdGF0cy5nZXRfc29ydF9hcmdfZGVmcygpCiAgICAgICAgICAgICBpZiBsaW5lIGFuZCBub3QgZmlsdGVyKGxhbWJkYSB4LGE9YWJicmV2czogeCBub3QgaW4gYSxsaW5lLnNwbGl0KCkpOgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdHMuc29ydF9zdGF0cygqbGluZS5zcGxpdCgpKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAiVmFsaWQgc29ydCBrZXlzICh1bmlxdWUgcHJlZml4ZXMgYXJlIGFjY2VwdGVkKToiCisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJWYWxpZCBzb3J0IGtleXMgKHVuaXF1ZSBwcmVmaXhlcyBhcmUgYWNjZXB0ZWQpOiIKICAgICAgICAgICAgICAgICBmb3IgKGtleSwgdmFsdWUpIGluIFN0YXRzLnNvcnRfYXJnX2RpY3RfZGVmYXVsdC5pdGVyaXRlbXMoKToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzIC0tICVzIiAlIChrZXksIHZhbHVlWzFdKQorICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiVzIC0tICVzIiAlIChrZXksIHZhbHVlWzFdKQogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZGVmIGhlbHBfc29ydChzZWxmKToKLSAgICAgICAgICAgIHByaW50ICJTb3J0IHByb2ZpbGUgZGF0YSBhY2NvcmRpbmcgdG8gc3BlY2lmaWVkIGtleXMuIgotICAgICAgICAgICAgcHJpbnQgIihUeXBpbmcgYHNvcnQnIHdpdGhvdXQgYXJndW1lbnRzIGxpc3RzIHZhbGlkIGtleXMuKSIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiU29ydCBwcm9maWxlIGRhdGEgYWNjb3JkaW5nIHRvIHNwZWNpZmllZCBrZXlzLiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiKFR5cGluZyBgc29ydCcgd2l0aG91dCBhcmd1bWVudHMgbGlzdHMgdmFsaWQga2V5cy4pIgogICAgICAgICBkZWYgY29tcGxldGVfc29ydChzZWxmLCB0ZXh0LCAqYXJncyk6CiAgICAgICAgICAgICByZXR1cm4gW2EgZm9yIGEgaW4gU3RhdHMuc29ydF9hcmdfZGljdF9kZWZhdWx0IGlmIGEuc3RhcnRzd2l0aCh0ZXh0KV0KIAogICAgICAgICBkZWYgZG9fc3RhdHMoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZW5lcmljKCdwcmludF9zdGF0cycsIGxpbmUpCiAgICAgICAgIGRlZiBoZWxwX3N0YXRzKHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIlByaW50IHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlByaW50IHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCiAgICAgICAgICAgICBzZWxmLmdlbmVyaWNfaGVscCgpCiAKICAgICAgICAgZGVmIGRvX3N0cmlwKHNlbGYsIGxpbmUpOgogICAgICAgICAgICAgc2VsZi5zdGF0cy5zdHJpcF9kaXJzKCkKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGRlZiBoZWxwX3N0cmlwKHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIlN0cmlwIGxlYWRpbmcgcGF0aCBpbmZvcm1hdGlvbiBmcm9tIGZpbGVuYW1lcyBpbiB0aGUgcmVwb3J0LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiU3RyaXAgbGVhZGluZyBwYXRoIGluZm9ybWF0aW9uIGZyb20gZmlsZW5hbWVzIGluIHRoZSByZXBvcnQuIgogCiAgICAgICAgIGRlZiBwb3N0Y21kKHNlbGYsIHN0b3AsIGxpbmUpOgogICAgICAgICAgICAgaWYgc3RvcDoKQEAgLTY1MywxNCArNjY3LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgaW1wb3J0IHN5cwotICAgIHByaW50ICJXZWxjb21lIHRvIHRoZSBwcm9maWxlIHN0YXRpc3RpY3MgYnJvd3Nlci4iCisgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJXZWxjb21lIHRvIHRoZSBwcm9maWxlIHN0YXRpc3RpY3MgYnJvd3Nlci4iCiAgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6CiAgICAgICAgIGluaXRwcm9maWxlID0gc3lzLmFyZ3ZbMV0KICAgICBlbHNlOgogICAgICAgICBpbml0cHJvZmlsZSA9IE5vbmUKICAgICB0cnk6CiAgICAgICAgIFByb2ZpbGVCcm93c2VyKGluaXRwcm9maWxlKS5jbWRsb29wKCkKLSAgICAgICAgcHJpbnQgIkdvb2RieWUuIgorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkdvb2RieWUuIgogICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgcGFzcwogCmRpZmYgLS1naXQgYS9MaWIvcHlkb2MucHkgYi9MaWIvcHlkb2MucHkKaW5kZXggYjZhZmM3Zi4uY2YzODYzMCAxMDA3NTUKLS0tIGEvTGliL3B5ZG9jLnB5CisrKyBiL0xpYi9weWRvYy5weQpAQCAtNTIsMTAgKzUyLDE2IEBACiAjICAgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgY2hhbmdlZCB3aXRoIG9zLmNoZGlyKCksIGFuIGluY29ycmVjdAogIyAgICAgcGF0aCB3aWxsIGJlIGRpc3BsYXllZC4KIAotaW1wb3J0IHN5cywgaW1wLCBvcywgcmUsIHR5cGVzLCBpbnNwZWN0LCBfX2J1aWx0aW5fXworaW1wb3J0IHN5cywgaW1wLCBvcywgcmUsIHR5cGVzLCBpbnNwZWN0LCBfX2J1aWx0aW5fXywgcGtndXRpbAogZnJvbSByZXByIGltcG9ydCBSZXByCiBmcm9tIHN0cmluZyBpbXBvcnQgZXhwYW5kdGFicywgZmluZCwgam9pbiwgbG93ZXIsIHNwbGl0LCBzdHJpcCwgcmZpbmQsIHJzdHJpcAotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK3RyeToKKyAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgUHl0aG9uIDIuMyBjb21wYXRpYmlsaXR5CisgICAgY2xhc3MgZGVxdWUobGlzdCk6CisgICAgICAgIGRlZiBwb3BsZWZ0KHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucG9wKDApCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbW1vbiByb3V0aW5lcwogCkBAIC0xODIsNiArMTg4LDIzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICByZXR1cm4gRmFsc2UKIAorZGVmIHNvdXJjZV9zeW5vcHNpcyhmaWxlKToKKyAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCisgICAgd2hpbGUgbGluZVs6MV0gPT0gJyMnIG9yIG5vdCBzdHJpcChsaW5lKToKKyAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICBsaW5lID0gc3RyaXAobGluZSkKKyAgICBpZiBsaW5lWzo0XSA9PSAnciIiIic6IGxpbmUgPSBsaW5lWzE6XQorICAgIGlmIGxpbmVbOjNdID09ICciIiInOgorICAgICAgICBsaW5lID0gbGluZVszOl0KKyAgICAgICAgaWYgbGluZVstMTpdID09ICdcXCc6IGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgd2hpbGUgbm90IHN0cmlwKGxpbmUpOgorICAgICAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgIHJlc3VsdCA9IHN0cmlwKHNwbGl0KGxpbmUsICciIiInKVswXSkKKyAgICBlbHNlOiByZXN1bHQgPSBOb25lCisgICAgcmV0dXJuIHJlc3VsdAorCiBkZWYgc3lub3BzaXMoZmlsZW5hbWUsIGNhY2hlPXt9KToKICAgICAiIiJHZXQgdGhlIG9uZS1saW5lIHN1bW1hcnkgb3V0IG9mIGEgbW9kdWxlIGZpbGUuIiIiCiAgICAgbXRpbWUgPSBvcy5zdGF0KGZpbGVuYW1lKS5zdF9tdGltZQpAQCAtMTk2LDI0ICsyMTksMTEgQEAKICAgICAgICAgaWYgaW5mbyBhbmQgJ2InIGluIGluZm9bMl06ICMgYmluYXJ5IG1vZHVsZXMgaGF2ZSB0byBiZSBpbXBvcnRlZAogICAgICAgICAgICAgdHJ5OiBtb2R1bGUgPSBpbXAubG9hZF9tb2R1bGUoJ19fdGVtcF9fJywgZmlsZSwgZmlsZW5hbWUsIGluZm9bMTpdKQogICAgICAgICAgICAgZXhjZXB0OiByZXR1cm4gTm9uZQotICAgICAgICAgICAgcmVzdWx0ID0gc3BsaXQobW9kdWxlLl9fZG9jX18gb3IgJycsICdcbicpWzBdCisgICAgICAgICAgICByZXN1bHQgPSAobW9kdWxlLl9fZG9jX18gb3IgJycpLnNwbGl0bGluZXMoKVswXQogICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzWydfX3RlbXBfXyddCiAgICAgICAgIGVsc2U6ICMgdGV4dCBtb2R1bGVzIGNhbiBiZSBkaXJlY3RseSBleGFtaW5lZAotICAgICAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQotICAgICAgICAgICAgd2hpbGUgbGluZVs6MV0gPT0gJyMnIG9yIG5vdCBzdHJpcChsaW5lKToKLSAgICAgICAgICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgICAgICBsaW5lID0gc3RyaXAobGluZSkKLSAgICAgICAgICAgIGlmIGxpbmVbOjRdID09ICdyIiIiJzogbGluZSA9IGxpbmVbMTpdCi0gICAgICAgICAgICBpZiBsaW5lWzozXSA9PSAnIiIiJzoKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZVszOl0KLSAgICAgICAgICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xcJzogbGluZSA9IGxpbmVbOi0xXQotICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBzdHJpcChsaW5lKToKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQotICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzdHJpcChzcGxpdChsaW5lLCAnIiIiJylbMF0pCi0gICAgICAgICAgICBlbHNlOiByZXN1bHQgPSBOb25lCi0gICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlX3N5bm9wc2lzKGZpbGUpCisgICAgICAgICAgICBmaWxlLmNsb3NlKCkKICAgICAgICAgY2FjaGVbZmlsZW5hbWVdID0gKG10aW1lLCByZXN1bHQpCiAgICAgcmV0dXJuIHJlc3VsdAogCkBAIC02NDMsMTYgKzY1Myw4IEBACiAKICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX3BhdGhfXycpOgogICAgICAgICAgICAgbW9kcGtncyA9IFtdCi0gICAgICAgICAgICBtb2RuYW1lcyA9IFtdCi0gICAgICAgICAgICBmb3IgZmlsZSBpbiBvcy5saXN0ZGlyKG9iamVjdC5fX3BhdGhfX1swXSk6Ci0gICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihvYmplY3QuX19wYXRoX19bMF0sIGZpbGUpCi0gICAgICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShmaWxlKQotICAgICAgICAgICAgICAgIGlmIG1vZG5hbWUgIT0gJ19faW5pdF9fJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgbW9kbmFtZSBhbmQgbW9kbmFtZSBub3QgaW4gbW9kbmFtZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZCgobW9kbmFtZSwgbmFtZSwgMCwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lcy5hcHBlbmQobW9kbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgZWxpZiBpc3BhY2thZ2UocGF0aCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZCgoZmlsZSwgbmFtZSwgMSwgMCkpCisgICAgICAgICAgICBmb3IgaW1wb3J0ZXIsIG1vZG5hbWUsIGlzcGtnIGluIHBrZ3V0aWwuaXRlcl9tb2R1bGVzKG9iamVjdC5fX3BhdGhfXyk6CisgICAgICAgICAgICAgICAgbW9kcGtncy5hcHBlbmQoKG1vZG5hbWUsIG5hbWUsIGlzcGtnLCAwKSkKICAgICAgICAgICAgIG1vZHBrZ3Muc29ydCgpCiAgICAgICAgICAgICBjb250ZW50cyA9IHNlbGYubXVsdGljb2x1bW4obW9kcGtncywgc2VsZi5tb2Rwa2dsaW5rKQogICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5iaWdzZWN0aW9uKApAQCAtNzk2LDcgKzc5OCwxMCBAQAogICAgICAgICAgICAgdGFnICs9ICc6PGJyPlxuJwogCiAgICAgICAgICAgICAjIFNvcnQgYXR0cnMgYnkgbmFtZS4KLSAgICAgICAgICAgIGF0dHJzLnNvcnQoa2V5PWxhbWJkYSB0OiB0WzBdKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGF0dHJzLnNvcnQoa2V5PWxhbWJkYSB0OiB0WzBdKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBhdHRycy5zb3J0KGxhbWJkYSB0MSwgdDI6IGNtcCh0MVswXSwgdDJbMF0pKSAgICAjIDIuMyBjb21wYXQKIAogICAgICAgICAgICAgIyBQdW1wIG91dCB0aGUgYXR0cnMsIHNlZ3JlZ2F0ZWQgYnkga2luZC4KICAgICAgICAgICAgIGF0dHJzID0gc3BpbGwoJ01ldGhvZHMgJXMnICUgdGFnLCBhdHRycywKQEAgLTkxNCwyNSArOTE5LDkgQEAKICAgICAgICAgIiIiR2VuZXJhdGUgYW4gSFRNTCBpbmRleCBmb3IgYSBkaXJlY3Rvcnkgb2YgbW9kdWxlcy4iIiIKICAgICAgICAgbW9kcGtncyA9IFtdCiAgICAgICAgIGlmIHNoYWRvd2VkIGlzIE5vbmU6IHNoYWRvd2VkID0ge30KLSAgICAgICAgc2VlbiA9IHt9Ci0gICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihkaXIpCi0KLSAgICAgICAgZGVmIGZvdW5kKG5hbWUsIGlzcGFja2FnZSwKLSAgICAgICAgICAgICAgICAgIG1vZHBrZ3M9bW9kcGtncywgc2hhZG93ZWQ9c2hhZG93ZWQsIHNlZW49c2Vlbik6Ci0gICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWVuOgotICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKChuYW1lLCAnJywgaXNwYWNrYWdlLCBuYW1lIGluIHNoYWRvd2VkKSkKLSAgICAgICAgICAgICAgICBzZWVuW25hbWVdID0gMQotICAgICAgICAgICAgICAgIHNoYWRvd2VkW25hbWVdID0gMQotCi0gICAgICAgICMgUGFja2FnZSBzcGFtL19faW5pdF9fLnB5IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBtb2R1bGUgc3BhbS5weS4KLSAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6Ci0gICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpciwgZmlsZSkKLSAgICAgICAgICAgIGlmIGlzcGFja2FnZShwYXRoKTogZm91bmQoZmlsZSwgMSkKLSAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6Ci0gICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpciwgZmlsZSkKLSAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgotICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBpbnNwZWN0LmdldG1vZHVsZW5hbWUoZmlsZSkKLSAgICAgICAgICAgICAgICBpZiBtb2RuYW1lOiBmb3VuZChtb2RuYW1lLCAwKQorICAgICAgICBmb3IgaW1wb3J0ZXIsIG5hbWUsIGlzcGtnIGluIHBrZ3V0aWwuaXRlcl9tb2R1bGVzKFtkaXJdKToKKyAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKChuYW1lLCAnJywgaXNwa2csIG5hbWUgaW4gc2hhZG93ZWQpKQorICAgICAgICAgICAgc2hhZG93ZWRbbmFtZV0gPSAxCiAKICAgICAgICAgbW9kcGtncy5zb3J0KCkKICAgICAgICAgY29udGVudHMgPSBzZWxmLm11bHRpY29sdW1uKG1vZHBrZ3MsIHNlbGYubW9kcGtnbGluaykKQEAgLTEwNTksMTQgKzEwNDgsMTIgQEAKIAogICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fcGF0aF9fJyk6CiAgICAgICAgICAgICBtb2Rwa2dzID0gW10KLSAgICAgICAgICAgIGZvciBmaWxlIGluIG9zLmxpc3RkaXIob2JqZWN0Ll9fcGF0aF9fWzBdKToKLSAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKG9iamVjdC5fX3BhdGhfX1swXSwgZmlsZSkKLSAgICAgICAgICAgICAgICBtb2RuYW1lID0gaW5zcGVjdC5nZXRtb2R1bGVuYW1lKGZpbGUpCi0gICAgICAgICAgICAgICAgaWYgbW9kbmFtZSAhPSAnX19pbml0X18nOgotICAgICAgICAgICAgICAgICAgICBpZiBtb2RuYW1lIGFuZCBtb2RuYW1lIG5vdCBpbiBtb2Rwa2dzOgotICAgICAgICAgICAgICAgICAgICAgICAgbW9kcGtncy5hcHBlbmQobW9kbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgZWxpZiBpc3BhY2thZ2UocGF0aCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZChmaWxlICsgJyAocGFja2FnZSknKQorICAgICAgICAgICAgZm9yIGltcG9ydGVyLCBtb2RuYW1lLCBpc3BrZyBpbiBwa2d1dGlsLml0ZXJfbW9kdWxlcyhvYmplY3QuX19wYXRoX18pOgorICAgICAgICAgICAgICAgIGlmIGlzcGtnOgorICAgICAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZChtb2RuYW1lICsgJyAocGFja2FnZSknKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKG1vZG5hbWUpCisKICAgICAgICAgICAgIG1vZHBrZ3Muc29ydCgpCiAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oCiAgICAgICAgICAgICAgICAgJ1BBQ0tBR0UgQ09OVEVOVFMnLCBqb2luKG1vZHBrZ3MsICdcbicpKQpAQCAtMTQ5MCwyMCArMTQ3Nyw5IEBACiBkZWYgd3JpdGVkb2NzKGRpciwgcGtncGF0aD0nJywgZG9uZT1Ob25lKToKICAgICAiIiJXcml0ZSBvdXQgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBhbGwgbW9kdWxlcyBpbiBhIGRpcmVjdG9yeSB0cmVlLiIiIgogICAgIGlmIGRvbmUgaXMgTm9uZTogZG9uZSA9IHt9Ci0gICAgZm9yIGZpbGUgaW4gb3MubGlzdGRpcihkaXIpOgotICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpciwgZmlsZSkKLSAgICAgICAgaWYgaXNwYWNrYWdlKHBhdGgpOgotICAgICAgICAgICAgd3JpdGVkb2NzKHBhdGgsIHBrZ3BhdGggKyBmaWxlICsgJy4nLCBkb25lKQotICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgotICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShwYXRoKQotICAgICAgICAgICAgaWYgbW9kbmFtZToKLSAgICAgICAgICAgICAgICBpZiBtb2RuYW1lID09ICdfX2luaXRfXyc6Ci0gICAgICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBwa2dwYXRoWzotMV0gIyByZW1vdmUgdHJhaWxpbmcgcGVyaW9kCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSA9IHBrZ3BhdGggKyBtb2RuYW1lCi0gICAgICAgICAgICAgICAgaWYgbW9kbmFtZSBub3QgaW4gZG9uZToKLSAgICAgICAgICAgICAgICAgICAgZG9uZVttb2RuYW1lXSA9IDEKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVkb2MobW9kbmFtZSkKKyAgICBmb3IgaW1wb3J0ZXIsIG1vZG5hbWUsIGlzcGtnIGluIHBrZ3V0aWwud2Fsa19wYWNrYWdlcyhbZGlyXSwgcGtncGF0aCk6CisgICAgICAgIHdyaXRlZG9jKG1vZG5hbWUpCisgICAgcmV0dXJuCiAKIGRlZiByYXdfaW5wdXQocHJvbXB0KToKICAgICBzeXMuc3Rkb3V0LndyaXRlKHByb21wdCkKQEAgLTE4MzUsMzAgKzE4MTEsOSBAQAogICAgICAgICAgICAgc2VsZi5zdGF0ZS5hcHBlbmQoKGNoaWxkLCBzZWxmLmNoaWxkcmVuKGNoaWxkKSkpCiAgICAgICAgIHJldHVybiBjaGlsZAogCi1jbGFzcyBNb2R1bGVTY2FubmVyKFNjYW5uZXIpOgorCitjbGFzcyBNb2R1bGVTY2FubmVyOgogICAgICIiIkFuIGludGVycnVwdGlibGUgc2Nhbm5lciB0aGF0IHNlYXJjaGVzIG1vZHVsZSBzeW5vcHNlcy4iIiIKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHJvb3RzID0gbWFwKGxhbWJkYSBkaXI6IChkaXIsICcnKSwgcGF0aGRpcnMoKSkKLSAgICAgICAgU2Nhbm5lci5fX2luaXRfXyhzZWxmLCByb290cywgc2VsZi5zdWJtb2R1bGVzLCBzZWxmLmlzbmV3cGFja2FnZSkKLSAgICAgICAgc2VsZi5pbm9kZXMgPSBtYXAobGFtYmRhIChkaXIsIHBrZyk6IG9zLnN0YXQoZGlyKS5zdF9pbm8sIHJvb3RzKQotCi0gICAgZGVmIHN1Ym1vZHVsZXMoc2VsZiwgKGRpciwgcGFja2FnZSkpOgotICAgICAgICBjaGlsZHJlbiA9IFtdCi0gICAgICAgIGZvciBmaWxlIGluIG9zLmxpc3RkaXIoZGlyKToKLSAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCBmaWxlKQotICAgICAgICAgICAgaWYgaXNwYWNrYWdlKHBhdGgpOgotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZCgocGF0aCwgcGFja2FnZSArIChwYWNrYWdlIGFuZCAnLicpICsgZmlsZSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZCgocGF0aCwgcGFja2FnZSkpCi0gICAgICAgIGNoaWxkcmVuLnNvcnQoKSAjIHNvIHRoYXQgc3BhbS5weSBjb21lcyBiZWZvcmUgc3BhbS5weWMgb3Igc3BhbS5weW8KLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuCi0KLSAgICBkZWYgaXNuZXdwYWNrYWdlKHNlbGYsIChkaXIsIHBhY2thZ2UpKToKLSAgICAgICAgaW5vZGUgPSBvcy5wYXRoLmV4aXN0cyhkaXIpIGFuZCBvcy5zdGF0KGRpcikuc3RfaW5vCi0gICAgICAgIGlmIG5vdCAob3MucGF0aC5pc2xpbmsoZGlyKSBhbmQgaW5vZGUgaW4gc2VsZi5pbm9kZXMpOgotICAgICAgICAgICAgc2VsZi5pbm9kZXMuYXBwZW5kKGlub2RlKSAjIGRldGVjdCBjaXJjdWxhciBzeW1ib2xpYyBsaW5rcwotICAgICAgICAgICAgcmV0dXJuIGlzcGFja2FnZShkaXIpCi0gICAgICAgIHJldHVybiBGYWxzZQogCiAgICAgZGVmIHJ1bihzZWxmLCBjYWxsYmFjaywga2V5PU5vbmUsIGNvbXBsZXRlcj1Ob25lKToKICAgICAgICAgaWYga2V5OiBrZXkgPSBsb3dlcihrZXkpCkBAIC0xODc1LDIyICsxODMwLDMxIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIGZpbmQobG93ZXIobW9kbmFtZSArICcgLSAnICsgZGVzYyksIGtleSkgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKE5vbmUsIG1vZG5hbWUsIGRlc2MpCiAKLSAgICAgICAgd2hpbGUgbm90IHNlbGYucXVpdDoKLSAgICAgICAgICAgIG5vZGUgPSBzZWxmLm5leHQoKQotICAgICAgICAgICAgaWYgbm90IG5vZGU6IGJyZWFrCi0gICAgICAgICAgICBwYXRoLCBwYWNrYWdlID0gbm9kZQotICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShwYXRoKQotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCkgYW5kIG1vZG5hbWU6Ci0gICAgICAgICAgICAgICAgbW9kbmFtZSA9IHBhY2thZ2UgKyAocGFja2FnZSBhbmQgJy4nKSArIG1vZG5hbWUKLSAgICAgICAgICAgICAgICBpZiBub3QgbW9kbmFtZSBpbiBzZWVuOgotICAgICAgICAgICAgICAgICAgICBzZWVuW21vZG5hbWVdID0gMSAjIGlmIHdlIHNlZSBzcGFtLnB5LCBza2lwIHNwYW0ucHljCi0gICAgICAgICAgICAgICAgICAgIGlmIGtleSBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socGF0aCwgbW9kbmFtZSwgJycpCisgICAgICAgIGZvciBpbXBvcnRlciwgbW9kbmFtZSwgaXNwa2cgaW4gcGtndXRpbC53YWxrX3BhY2thZ2VzKCk6CisgICAgICAgICAgICBpZiBzZWxmLnF1aXQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGtleSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrKE5vbmUsIG1vZG5hbWUsICcnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShtb2RuYW1lKQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobG9hZGVyLCdnZXRfc291cmNlJyk6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBTdHJpbmdJTworICAgICAgICAgICAgICAgICAgICBkZXNjID0gc291cmNlX3N5bm9wc2lzKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nSU8uU3RyaW5nSU8obG9hZGVyLmdldF9zb3VyY2UobW9kbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICkgb3IgJycKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihsb2FkZXIsJ2dldF9maWxlbmFtZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGxvYWRlci5nZXRfZmlsZW5hbWUobW9kbmFtZSkKICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBzeW5vcHNpcyhwYXRoKSBvciAnJwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmluZChsb3dlcihtb2RuYW1lICsgJyAtICcgKyBkZXNjKSwga2V5KSA+PSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHBhdGgsIG1vZG5hbWUsIGRlc2MpCi0gICAgICAgIGlmIGNvbXBsZXRlcjogY29tcGxldGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0gbG9hZGVyLmxvYWRfbW9kdWxlKG1vZG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSAobW9kdWxlLl9fZG9jX18gb3IgJycpLnNwbGl0bGluZXMoKVswXQorICAgICAgICAgICAgICAgICAgICBwYXRoID0gZ2V0YXR0cihtb2R1bGUsJ19fZmlsZV9fJyxOb25lKQorICAgICAgICAgICAgICAgIGlmIGZpbmQobG93ZXIobW9kbmFtZSArICcgLSAnICsgZGVzYyksIGtleSkgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socGF0aCwgbW9kbmFtZSwgZGVzYykKKworICAgICAgICBpZiBjb21wbGV0ZXI6CisgICAgICAgICAgICBjb21wbGV0ZXIoKQogCiBkZWYgYXByb3BvcyhrZXkpOgogICAgICIiIlByaW50IGFsbCB0aGUgb25lLWxpbmUgbW9kdWxlIHN1bW1hcmllcyB0aGF0IGNvbnRhaW4gYSBzdWJzdHJpbmcuIiIiCkBAIC0xOTU1LDcgKzE5MTksNyBAQAogICAgICAgICAgICAgICAgICAgICAnQnVpbHQtaW4gTW9kdWxlcycsICcjZmZmZmZmJywgJyNlZTc3YWEnLCBjb250ZW50cyldCiAKICAgICAgICAgICAgICAgICBzZWVuID0ge30KLSAgICAgICAgICAgICAgICBmb3IgZGlyIGluIHBhdGhkaXJzKCk6CisgICAgICAgICAgICAgICAgZm9yIGRpciBpbiBzeXMucGF0aDoKICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcy5hcHBlbmQoaHRtbC5pbmRleChkaXIsIHNlZW4pKQogICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gaGVhZGluZyArIGpvaW4oaW5kaWNlcykgKyAnJyc8cCBhbGlnbj1yaWdodD4KIDxmb250IGNvbG9yPSIjOTA5MDkwIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48c3Ryb25nPgpkaWZmIC0tZ2l0IGEvTGliL3JhbmRvbS5weSBiL0xpYi9yYW5kb20ucHkKaW5kZXggYjRhZDJiMy4uNDY1ZjQ3NyAxMDA2NDQKLS0tIGEvTGliL3JhbmRvbS5weQorKysgYi9MaWIvcmFuZG9tLnB5CkBAIC0yODUsNiArMjg1LDE1IEBACiAgICAgICAgIGxhcmdlIHBvcHVsYXRpb246ICAgc2FtcGxlKHhyYW5nZSgxMDAwMDAwMCksIDYwKQogICAgICAgICAiIiIKIAorICAgICAgICAjIFhYWCBBbHRob3VnaCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIGBwb3B1bGF0aW9uYCBpcyAiYSBzZXF1ZW5jZSIsCisgICAgICAgICMgWFhYIGF0dGVtcHRzIGFyZSBtYWRlIHRvIGNhdGVyIHRvIGFueSBpdGVyYWJsZSB3aXRoIGEgX19sZW5fXworICAgICAgICAjIFhYWCBtZXRob2QuICBUaGlzIGhhcyBoYWQgbWl4ZWQgc3VjY2Vzcy4gIEV4YW1wbGVzIGZyb20gYm90aAorICAgICAgICAjIFhYWCBzaWRlczogIHNldHMgd29yayBmaW5lLCBhbmQgc2hvdWxkIGJlY29tZSBvZmZpY2lhbGx5IHN1cHBvcnRlZDsKKyAgICAgICAgIyBYWFggZGljdHMgYXJlIG11Y2ggaGFyZGVyLCBhbmQgaGF2ZSBmYWlsZWQgaW4gdmFyaW91cyBzdWJ0bGUKKyAgICAgICAgIyBYWFggd2F5cyBhY3Jvc3MgYXR0ZW1wdHMuICBTdXBwb3J0IGZvciBtYXBwaW5nIHR5cGVzIHNob3VsZCBwcm9iYWJseQorICAgICAgICAjIFhYWCBiZSBkcm9wcGVkIChhbmQgdXNlcnMgc2hvdWxkIHBhc3MgbWFwcGluZy5rZXlzKCkgb3IgLnZhbHVlcygpCisgICAgICAgICMgWFhYIGV4cGxpY2l0bHkpLgorCiAgICAgICAgICMgU2FtcGxpbmcgd2l0aG91dCByZXBsYWNlbWVudCBlbnRhaWxzIHRyYWNraW5nIGVpdGhlciBwb3RlbnRpYWwKICAgICAgICAgIyBzZWxlY3Rpb25zICh0aGUgcG9vbCkgaW4gYSBsaXN0IG9yIHByZXZpb3VzIHNlbGVjdGlvbnMgaW4gYSBzZXQuCiAKQEAgLTMwNCw3ICszMTMsOSBAQAogICAgICAgICBzZXRzaXplID0gMjEgICAgICAgICMgc2l6ZSBvZiBhIHNtYWxsIHNldCBtaW51cyBzaXplIG9mIGFuIGVtcHR5IGxpc3QKICAgICAgICAgaWYgayA+IDU6CiAgICAgICAgICAgICBzZXRzaXplICs9IDQgKiogX2NlaWwoX2xvZyhrICogMywgNCkpICMgdGFibGUgc2l6ZSBmb3IgYmlnIHNldHMKLSAgICAgICAgaWYgbiA8PSBzZXRzaXplOiAgICAjIGlzIGFuIG4tbGVuZ3RoIGxpc3Qgc21hbGxlciB0aGFuIGEgay1sZW5ndGggc2V0CisgICAgICAgIGlmIG4gPD0gc2V0c2l6ZSBvciBoYXNhdHRyKHBvcHVsYXRpb24sICJrZXlzIik6CisgICAgICAgICAgICAjIEFuIG4tbGVuZ3RoIGxpc3QgaXMgc21hbGxlciB0aGFuIGEgay1sZW5ndGggc2V0LCBvciB0aGlzIGlzIGEKKyAgICAgICAgICAgICMgbWFwcGluZyB0eXBlIHNvIHRoZSBvdGhlciBhbGdvcml0aG0gd291bGRuJ3Qgd29yay4KICAgICAgICAgICAgIHBvb2wgPSBsaXN0KHBvcHVsYXRpb24pCiAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoayk6ICAgICAgICAgIyBpbnZhcmlhbnQ6ICBub24tc2VsZWN0ZWQgYXQgWzAsbi1pKQogICAgICAgICAgICAgICAgIGogPSBfaW50KHJhbmRvbSgpICogKG4taSkpCkBAIC0zMTIsMTcgKzMyMywxOCBAQAogICAgICAgICAgICAgICAgIHBvb2xbal0gPSBwb29sW24taS0xXSAgICMgbW92ZSBub24tc2VsZWN0ZWQgaXRlbSBpbnRvIHZhY2FuY3kKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBuID4gMCBhbmQgKHBvcHVsYXRpb25bMF0sIHBvcHVsYXRpb25bbi8vMl0sIHBvcHVsYXRpb25bbi0xXSkKLSAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBLZXlFcnJvcik6ICAgIyBoYW5kbGUgbm9uLXNlcXVlbmNlIGl0ZXJhYmxlcwotICAgICAgICAgICAgICAgIHBvcHVsYXRpb24gPSB0dXBsZShwb3B1bGF0aW9uKQotICAgICAgICAgICAgc2VsZWN0ZWQgPSBzZXQoKQotICAgICAgICAgICAgc2VsZWN0ZWRfYWRkID0gc2VsZWN0ZWQuYWRkCi0gICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoayk6Ci0gICAgICAgICAgICAgICAgaiA9IF9pbnQocmFuZG9tKCkgKiBuKQotICAgICAgICAgICAgICAgIHdoaWxlIGogaW4gc2VsZWN0ZWQ6CisgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBzZXQoKQorICAgICAgICAgICAgICAgIHNlbGVjdGVkX2FkZCA9IHNlbGVjdGVkLmFkZAorICAgICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShrKToKICAgICAgICAgICAgICAgICAgICAgaiA9IF9pbnQocmFuZG9tKCkgKiBuKQotICAgICAgICAgICAgICAgIHNlbGVjdGVkX2FkZChqKQotICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHBvcHVsYXRpb25bal0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgaiBpbiBzZWxlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSBfaW50KHJhbmRvbSgpICogbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYWRkKGopCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHBvcHVsYXRpb25bal0KKyAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBLZXlFcnJvcik6ICAgIyBoYW5kbGUgKGF0IGxlYXN0KSBzZXRzCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwb3B1bGF0aW9uLCBsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zYW1wbGUodHVwbGUocG9wdWxhdGlvbiksIGspCiAgICAgICAgIHJldHVybiByZXN1bHQKIAogIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVhbC12YWx1ZWQgZGlzdHJpYnV0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3JlY29udmVydC5weSBiL0xpYi9yZWNvbnZlcnQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0YmFiNWIuLjAwMDAwMDAKLS0tIGEvTGliL3JlY29udmVydC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLXIiIiJDb252ZXJ0IG9sZCAoInJlZ2V4IikgcmVndWxhciBleHByZXNzaW9ucyB0byBuZXcgc3ludGF4ICgicmUiKS4KLQotV2hlbiBpbXBvcnRlZCBhcyBhIG1vZHVsZSwgdGhlcmUgYXJlIHR3byBmdW5jdGlvbnMsIHdpdGggdGhlaXIgb3duCi1zdHJpbmdzOgotCi0gIGNvbnZlcnQocywgc3ludGF4PU5vbmUpIC0tIGNvbnZlcnQgYSByZWdleCByZWd1bGFyIGV4cHJlc3Npb24gdG8gcmUgc3ludGF4Ci0KLSAgcXVvdGUocykgLS0gcmV0dXJuIGEgcXVvdGVkIHN0cmluZyBsaXRlcmFsCi0KLVdoZW4gdXNlZCBhcyBhIHNjcmlwdCwgcmVhZCBhIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbCAob3IgYW55IG90aGVyCi1leHByZXNzaW9uIGV2YWx1YXRpbmcgdG8gYSBzdHJpbmcpIGZyb20gc3RkaW4sIGFuZCB3cml0ZSB0aGUKLXRyYW5zbGF0ZWQgZXhwcmVzc2lvbiB0byBzdGRvdXQgYXMgYSBzdHJpbmcgbGl0ZXJhbC4gIFVubGVzcyBzdGRvdXQgaXMKLWEgdHR5LCBubyB0cmFpbGluZyBcbiBpcyB3cml0dGVuIHRvIHN0ZG91dC4gIFRoaXMgaXMgZG9uZSBzbyB0aGF0IGl0Ci1jYW4gYmUgdXNlZCB3aXRoIEVtYWNzIEMtVSBNLXwgKHNoZWxsLWNvbW1hbmQtb24tcmVnaW9uIHdpdGggYXJndW1lbnQKLXdoaWNoIGZpbHRlcnMgdGhlIHJlZ2lvbiB0aHJvdWdoIHRoZSBzaGVsbCBjb21tYW5kKS4KLQotTm8gYXR0ZW1wdCBoYXMgYmVlbiBtYWRlIGF0IGNvZGluZyBmb3IgcGVyZm9ybWFuY2UuCi0KLVRyYW5zbGF0aW9uIHRhYmxlLi4uCi0KLSAgICBcKCAgICAoICAgICAodW5sZXNzIFJFX05PX0JLX1BBUkVOUyBzZXQpCi0gICAgXCkgICAgKSAgICAgKHVubGVzcyBSRV9OT19CS19QQVJFTlMgc2V0KQotICAgIFx8ICAgIHwgICAgICh1bmxlc3MgUkVfTk9fQktfVkJBUiBzZXQpCi0gICAgXDwgICAgXGIgICAgKG5vdCBxdWl0ZSB0aGUgc2FtZSwgYnV0IGFsbGEuLi4pCi0gICAgXD4gICAgXGIgICAgKG5vdCBxdWl0ZSB0aGUgc2FtZSwgYnV0IGFsbGEuLi4pCi0gICAgXGAgICAgXEEKLSAgICBcJyAgICBcWgotCi1Ob3QgdHJhbnNsYXRlZC4uLgotCi0gICAgLgotICAgIF4KLSAgICAkCi0gICAgKgotICAgICsgICAgICAgICAgICh1bmxlc3MgUkVfQktfUExVU19RTSBzZXQsIHRoZW4gdG8gXCspCi0gICAgPyAgICAgICAgICAgKHVubGVzcyBSRV9CS19QTFVTX1FNIHNldCwgdGhlbiB0byBcPykKLSAgICBcCi0gICAgXGIKLSAgICBcQgotICAgIFx3Ci0gICAgXFcKLSAgICBcMSAuLi4gXDkKLQotU3BlY2lhbCBjYXNlcy4uLgotCi0gICAgTm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBhbHdheXMgcmVwbGFjZWQgYnkgdGhlaXIgMy1kaWdpdAotICAgIGVzY2FwZSBjb2RlIChleGNlcHQgXHQsIFxuLCBcciwgd2hpY2ggdXNlIG1uZW1vbmljIGVzY2FwZXMpCi0KLSAgICBOZXdsaW5lIGlzIHR1cm5lZCBpbnRvIHwgd2hlbiBSRV9ORVdMSU5FX09SIGlzIHNldAotCi1YWFggVG8gYmUgZG9uZS4uLgotCi0gICAgWy4uLl0gICAgIChkaWZmZXJlbnQgdHJlYXRtZW50IG9mIGJhY2tzbGFzaGVkIGl0ZW1zPykKLSAgICBbXi4uLl0gICAgKGRpZmZlcmVudCB0cmVhdG1lbnQgb2YgYmFja3NsYXNoZWQgaXRlbXM/KQotICAgIF4gJCAqICsgPyAoaW4gc29tZSBlcnJvciBjb250ZXh0cyB0aGVzZSBhcmUgcHJvYmFibHkgdHJlYXRlZCBkaWZmZXJlbnRseSkKLSAgICBcdkREICBcREQgKGluIHRoZSByZWdleCBkb2NzIGJ1dCBvbmx5IHdvcmtzIHdoZW4gUkVfQU5TSV9IRVggc2V0KQotCi0iIiIKLQotCi1pbXBvcnQgd2FybmluZ3MKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLiogcmVnZXggLioiLCBEZXByZWNhdGlvbldhcm5pbmcsIF9fbmFtZV9fLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kPTEpCi0KLWltcG9ydCByZWdleAotZnJvbSByZWdleF9zeW50YXggaW1wb3J0ICogIyBSRV8qCi0KLV9fYWxsX18gPSBbImNvbnZlcnQiLCJxdW90ZSJdCi0KLSMgRGVmYXVsdCB0cmFuc2xhdGlvbiB0YWJsZQotbWFzdGVydGFibGUgPSB7Ci0gICAgcidcPCc6IHInXGInLAotICAgIHInXD4nOiByJ1xiJywKLSAgICByJ1xgJzogcidcQScsCi0gICAgcidcJyc6IHInXFonLAotICAgIHInXCgnOiAnKCcsCi0gICAgcidcKSc6ICcpJywKLSAgICByJ1x8JzogJ3wnLAotICAgICcoJzogcidcKCcsCi0gICAgJyknOiByJ1wpJywKLSAgICAnfCc6IHInXHwnLAotICAgICdcdCc6IHInXHQnLAotICAgICdcbic6IHInXG4nLAotICAgICdccic6IHInXHInLAotfQotCi0KLWRlZiBjb252ZXJ0KHMsIHN5bnRheD1Ob25lKToKLSAgICAiIiJDb252ZXJ0IGEgcmVnZXggcmVndWxhciBleHByZXNzaW9uIHRvIHJlIHN5bnRheC4KLQotICAgIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgcmVndWxhciBleHByZXNzaW9uLCBhcyBhIHN0cmluZyBvYmplY3QsCi0gICAganVzdCBsaWtlIGl0IHdvdWxkIGJlIHBhc3NlZCB0byByZWdleC5jb21waWxlKCkuICAoSS5lLiwgcGFzcyB0aGUKLSAgICBhY3R1YWwgc3RyaW5nIG9iamVjdCAtLSBzdHJpbmcgcXVvdGVzIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4KLSAgICByZW1vdmVkIGFuZCB0aGUgc3RhbmRhcmQgZXNjYXBlIHByb2Nlc3NpbmcgaGFzIGFscmVhZHkgYmVlbiBkb25lLAotICAgIGUuZy4gYnkgZXZhbCgpLikKLQotICAgIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHJlZ2V4IHN5bnRheCB2YXJpYW50IHRvIGJlCi0gICAgdXNlZC4gIFRoaXMgaXMgYW4gaW50ZWdlciBtYXNrIGFzIHBhc3NlZCB0byByZWdleC5zZXRfc3ludGF4KCk7Ci0gICAgdGhlIGZsYWcgYml0cyBhcmUgZGVmaW5lZCBpbiByZWdleF9zeW50YXguICBXaGVuIG5vdCBzcGVjaWZpZWQsIG9yCi0gICAgd2hlbiBOb25lIGlzIGdpdmVuLCB0aGUgY3VycmVudCByZWdleCBzeW50YXggbWFzayAoYXMgcmV0cmlldmVkIGJ5Ci0gICAgcmVnZXguZ2V0X3N5bnRheCgpKSBpcyB1c2VkIC0tIHdoaWNoIGlzIDAgYnkgZGVmYXVsdC4KLQotICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24sIGFzIGEgc3RyaW5nIG9iamVjdCB0aGF0Ci0gICAgY291bGQgYmUgcGFzc2VkIHRvIHJlLmNvbXBpbGUoKS4gIChJLmUuLCBubyBzdHJpbmcgcXVvdGVzIGhhdmUKLSAgICBiZWVuIGFkZGVkIC0tIHVzZSBxdW90ZSgpIGJlbG93LCBvciByZXByKCkuKQotCi0gICAgVGhlIGNvbnZlcnNpb24gaXMgbm90IGFsd2F5cyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QuICBNb3JlCi0gICAgc3ludGFjdGljYWwgYW5hbHlzaXMgc2hvdWxkIGJlIHBlcmZvcm1lZCB0byBkZXRlY3QgYm9yZGVybGluZQotICAgIGNhc2VzIGFuZCBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZW0uICBGb3IgZXhhbXBsZSwgJ3gqPycgaXMgbm90Ci0gICAgdHJhbnNsYXRlZCBjb3JyZWN0bHkuCi0KLSAgICAiIiIKLSAgICB0YWJsZSA9IG1hc3RlcnRhYmxlLmNvcHkoKQotICAgIGlmIHN5bnRheCBpcyBOb25lOgotICAgICAgICBzeW50YXggPSByZWdleC5nZXRfc3ludGF4KCkKLSAgICBpZiBzeW50YXggJiBSRV9OT19CS19QQVJFTlM6Ci0gICAgICAgIGRlbCB0YWJsZVtyJ1woJ10sIHRhYmxlW3InXCknXQotICAgICAgICBkZWwgdGFibGVbJygnXSwgdGFibGVbJyknXQotICAgIGlmIHN5bnRheCAmIFJFX05PX0JLX1ZCQVI6Ci0gICAgICAgIGRlbCB0YWJsZVtyJ1x8J10KLSAgICAgICAgZGVsIHRhYmxlWyd8J10KLSAgICBpZiBzeW50YXggJiBSRV9CS19QTFVTX1FNOgotICAgICAgICB0YWJsZVsnKyddID0gcidcKycKLSAgICAgICAgdGFibGVbJz8nXSA9IHInXD8nCi0gICAgICAgIHRhYmxlW3InXCsnXSA9ICcrJwotICAgICAgICB0YWJsZVtyJ1w/J10gPSAnPycKLSAgICBpZiBzeW50YXggJiBSRV9ORVdMSU5FX09SOgotICAgICAgICB0YWJsZVsnXG4nXSA9ICd8JwotICAgIHJlcyA9ICIiCi0KLSAgICBpID0gMAotICAgIGVuZCA9IGxlbihzKQotICAgIHdoaWxlIGkgPCBlbmQ6Ci0gICAgICAgIGMgPSBzW2ldCi0gICAgICAgIGkgPSBpKzEKLSAgICAgICAgaWYgYyA9PSAnXFwnOgotICAgICAgICAgICAgYyA9IHNbaV0KLSAgICAgICAgICAgIGkgPSBpKzEKLSAgICAgICAgICAgIGtleSA9ICdcXCcgKyBjCi0gICAgICAgICAgICBrZXkgPSB0YWJsZS5nZXQoa2V5LCBrZXkpCi0gICAgICAgICAgICByZXMgPSByZXMgKyBrZXkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGMgPSB0YWJsZS5nZXQoYywgYykKLSAgICAgICAgICAgIHJlcyA9IHJlcyArIGMKLSAgICByZXR1cm4gcmVzCi0KLQotZGVmIHF1b3RlKHMsIHF1b3RlPU5vbmUpOgotICAgICIiIkNvbnZlcnQgYSBzdHJpbmcgb2JqZWN0IHRvIGEgcXVvdGVkIHN0cmluZyBsaXRlcmFsLgotCi0gICAgVGhpcyBpcyBzaW1pbGFyIHRvIHJlcHIoKSBidXQgd2lsbCByZXR1cm4gYSAicmF3IiBzdHJpbmcgKHInLi4uJwotICAgIG9yIHIiLi4uIikgd2hlbiB0aGUgc3RyaW5nIGNvbnRhaW5zIGJhY2tzbGFzaGVzLCBpbnN0ZWFkIG9mCi0gICAgZG91YmxpbmcgYWxsIGJhY2tzbGFzaGVzLiAgVGhlIHJlc3VsdGluZyBzdHJpbmcgZG9lcyAqbm90KiBhbHdheXMKLSAgICBldmFsdWF0ZSB0byB0aGUgc2FtZSBzdHJpbmcgYXMgdGhlIG9yaWdpbmFsOyBob3dldmVyIGl0IHdpbGwgZG8KLSAgICBqdXN0IHRoZSByaWdodCB0aGluZyB3aGVuIHBhc3NlZCBpbnRvIHJlLmNvbXBpbGUoKS4KLQotICAgIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgZm9yY2VzIHRoZSBzdHJpbmcgcXVvdGU7IGl0IG11c3QgYmUKLSAgICBhIHNpbmdsZSBjaGFyYWN0ZXIgd2hpY2ggaXMgYSB2YWxpZCBQeXRob24gc3RyaW5nIHF1b3RlLgotCi0gICAgIiIiCi0gICAgaWYgcXVvdGUgaXMgTm9uZToKLSAgICAgICAgcSA9ICInIgotICAgICAgICBhbHRxID0gIiciCi0gICAgICAgIGlmIHEgaW4gcyBhbmQgYWx0cSBub3QgaW4gczoKLSAgICAgICAgICAgIHEgPSBhbHRxCi0gICAgZWxzZToKLSAgICAgICAgYXNzZXJ0IHF1b3RlIGluICgnIicsICInIiwgJyIiIicsICInJyciKQotICAgICAgICBxID0gcXVvdGUKLSAgICByZXMgPSBxCi0gICAgZm9yIGMgaW4gczoKLSAgICAgICAgaWYgYyA9PSBxOiBjID0gJ1xcJyArIGMKLSAgICAgICAgZWxpZiBjIDwgJyAnIG9yIGMgPiAnfic6IGMgPSAiXFwlMDNvIiAlIG9yZChjKQotICAgICAgICByZXMgPSByZXMgKyBjCi0gICAgcmVzID0gcmVzICsgcQotICAgIGlmICdcXCcgaW4gcmVzOgotICAgICAgICByZXMgPSAncicgKyByZXMKLSAgICByZXR1cm4gcmVzCi0KLQotZGVmIG1haW4oKToKLSAgICAiIiJNYWluIHByb2dyYW0gLS0gY2FsbGVkIHdoZW4gcnVuIGFzIGEgc2NyaXB0LiIiIgotICAgIGltcG9ydCBzeXMKLSAgICBzID0gZXZhbChzeXMuc3RkaW4ucmVhZCgpKQotICAgIHN5cy5zdGRvdXQud3JpdGUocXVvdGUoY29udmVydChzKSkpCi0gICAgaWYgc3lzLnN0ZG91dC5pc2F0dHkoKToKLSAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvcmVnZXhfc3ludGF4LnB5IGIvTGliL3JlZ2V4X3N5bnRheC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhMGRiZi4uMDAwMDAwMAotLS0gYS9MaWIvcmVnZXhfc3ludGF4LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIiIiQ29uc3RhbnRzIGZvciBzZWxlY3RpbmcgcmVnZXhwIHN5bnRheGVzIGZvciB0aGUgb2Jzb2xldGUgcmVnZXggbW9kdWxlLgotCi1UaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgInJlZ2V4IiBoYXMgbm93Ci1iZWVuIHJlcGxhY2VkIGJ5IHRoZSBuZXcgcmVndWxhciBleHByZXNzaW9uIG1vZHVsZSwgInJlIi4KLQotVGhlc2UgYml0cyBhcmUgcGFzc2VkIHRvIHJlZ2V4LnNldF9zeW50YXgoKSB0byBjaG9vc2UgYW1vbmcKLWFsdGVybmF0aXZlIHJlZ2V4cCBzeW50YXhlcy4KLSIiIgotCi0jIDEgbWVhbnMgcGxhaW4gcGFyZW50aGVzZXMgc2VydmUgYXMgZ3JvdXBpbmcsIGFuZCBiYWNrc2xhc2gKLSMgICBwYXJlbnRoZXNlcyBhcmUgbmVlZGVkIGZvciBsaXRlcmFsIHNlYXJjaGluZy4KLSMgMCBtZWFucyBiYWNrc2xhc2gtcGFyZW50aGVzZXMgYXJlIGdyb3VwaW5nLCBhbmQgcGxhaW4gcGFyZW50aGVzZXMKLSMgICBhcmUgZm9yIGxpdGVyYWwgc2VhcmNoaW5nLgotUkVfTk9fQktfUEFSRU5TID0gMQotCi0jIDEgbWVhbnMgcGxhaW4gfCBzZXJ2ZXMgYXMgdGhlICJvciItb3BlcmF0b3IsIGFuZCBcfCBpcyBhIGxpdGVyYWwuCi0jIDAgbWVhbnMgXHwgc2VydmVzIGFzIHRoZSAib3IiLW9wZXJhdG9yLCBhbmQgfCBpcyBhIGxpdGVyYWwuCi1SRV9OT19CS19WQkFSID0gMgotCi0jIDAgbWVhbnMgcGxhaW4gKyBvciA/IHNlcnZlcyBhcyBhbiBvcGVyYXRvciwgYW5kIFwrLCBcPyBhcmUgbGl0ZXJhbHMuCi0jIDEgbWVhbnMgXCssIFw/IGFyZSBvcGVyYXRvcnMgYW5kIHBsYWluICssID8gYXJlIGxpdGVyYWxzLgotUkVfQktfUExVU19RTSA9IDQKLQotIyAxIG1lYW5zIHwgYmluZHMgdGlnaHRlciB0aGFuIF4gb3IgJC4KLSMgMCBtZWFucyB0aGUgY29udHJhcnkuCi1SRV9USUdIVF9WQkFSID0gOAotCi0jIDEgbWVhbnMgdHJlYXQgXG4gYXMgYW4gX09SIG9wZXJhdG9yCi0jIDAgbWVhbnMgdHJlYXQgaXQgYXMgYSBub3JtYWwgY2hhcmFjdGVyCi1SRV9ORVdMSU5FX09SID0gMTYKLQotIyAwIG1lYW5zIHRoYXQgYSBzcGVjaWFsIGNoYXJhY3RlcnMgKHN1Y2ggYXMgKiwgXiwgYW5kICQpIGFsd2F5cyBoYXZlCi0jICAgdGhlaXIgc3BlY2lhbCBtZWFuaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuCi0jIDEgbWVhbnMgdGhhdCBzcGVjaWFsIGNoYXJhY3RlcnMgbWF5IGFjdCBhcyBub3JtYWwgY2hhcmFjdGVycyBpbiBzb21lCi0jICAgY29udGV4dHMuICBTcGVjaWZpY2FsbHksIHRoaXMgYXBwbGllcyB0bzoKLSMgICAgICAgXiAtIG9ubHkgc3BlY2lhbCBhdCB0aGUgYmVnaW5uaW5nLCBvciBhZnRlciAoIG9yIHwKLSMgICAgICAgJCAtIG9ubHkgc3BlY2lhbCBhdCB0aGUgZW5kLCBvciBiZWZvcmUgKSBvciB8Ci0jICAgICAgICosICssID8gLSBvbmx5IHNwZWNpYWwgd2hlbiBub3QgYWZ0ZXIgdGhlIGJlZ2lubmluZywgKCwgb3IgfAotUkVfQ09OVEVYVF9JTkRFUF9PUFMgPSAzMgotCi0jIEFOU0kgc2VxdWVuY2VzIChcbiBldGMpIGFuZCBceGhoCi1SRV9BTlNJX0hFWCA9IDY0Ci0KLSMgTm8gR05VIGV4dGVuc2lvbnMKLVJFX05PX0dOVV9FWFRFTlNJT05TID0gMTI4Ci0KLSMgTm93IGRlZmluZSBjb21iaW5hdGlvbnMgb2YgYml0cyBmb3IgdGhlIHN0YW5kYXJkIHBvc3NpYmlsaXRpZXMuCi1SRV9TWU5UQVhfQVdLID0gKFJFX05PX0JLX1BBUkVOUyB8IFJFX05PX0JLX1ZCQVIgfCBSRV9DT05URVhUX0lOREVQX09QUykKLVJFX1NZTlRBWF9FR1JFUCA9IChSRV9TWU5UQVhfQVdLIHwgUkVfTkVXTElORV9PUikKLVJFX1NZTlRBWF9HUkVQID0gKFJFX0JLX1BMVVNfUU0gfCBSRV9ORVdMSU5FX09SKQotUkVfU1lOVEFYX0VNQUNTID0gMAotCi0jIChQeXRob24ncyBvYnNvbGV0ZSAicmVnZXhwIiBtb2R1bGUgdXNlZCBhIHN5bnRheCBzaW1pbGFyIHRvIGF3ay4pCmRpZmYgLS1naXQgYS9MaWIvcmVnc3ViLnB5IGIvTGliL3JlZ3N1Yi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjMTBhNS4uMDAwMDAwMAotLS0gYS9MaWIvcmVnc3ViLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLSIiIlJlZ2V4cC1iYXNlZCBzcGxpdCBhbmQgcmVwbGFjZSB1c2luZyB0aGUgb2Jzb2xldGUgcmVnZXggbW9kdWxlLgotCi1UaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgVGhlc2Ugb3BlcmF0aW9ucwotYXJlIG5vdyBwcm92aWRlZCBieSB0aGUgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiBtb2R1bGUsICJyZSIuCi0KLXN1YihwYXQsIHJlcGwsIHN0cik6ICAgICAgICByZXBsYWNlIGZpcnN0IG9jY3VycmVuY2Ugb2YgcGF0dGVybiBpbiBzdHJpbmcKLWdzdWIocGF0LCByZXBsLCBzdHIpOiAgICAgICByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBwYXR0ZXJuIGluIHN0cmluZwotc3BsaXQoc3RyLCBwYXQsIG1heHNwbGl0KTogIHNwbGl0IHN0cmluZyB1c2luZyBwYXR0ZXJuIGFzIGRlbGltaXRlcgotc3BsaXR4KHN0ciwgcGF0LCBtYXhzcGxpdCk6IHNwbGl0IHN0cmluZyB1c2luZyBwYXR0ZXJuIGFzIGRlbGltaXRlciBwbHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGltaXRlcnMKLSIiIgotCi1pbXBvcnQgd2FybmluZ3MKLXdhcm5pbmdzLndhcm4oInRoZSByZWdzdWIgbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7IHBsZWFzZSB1c2UgcmUuc3ViKCkiLAotICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCi0KLSMgSWdub3JlIGZ1cnRoZXIgZGVwcmVjYXRpb24gd2FybmluZ3MgYWJvdXQgdGhpcyBtb2R1bGUKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiIiwgRGVwcmVjYXRpb25XYXJuaW5nLCBfX25hbWVfXykKLQotaW1wb3J0IHJlZ2V4Ci0KLV9fYWxsX18gPSBbInN1YiIsImdzdWIiLCJzcGxpdCIsInNwbGl0eCIsImNhcHdvcmRzIl0KLQotIyBSZXBsYWNlIGZpcnN0IG9jY3VycmVuY2Ugb2YgcGF0dGVybiBwYXQgaW4gc3RyaW5nIHN0ciBieSByZXBsYWNlbWVudAotIyByZXBsLiAgSWYgdGhlIHBhdHRlcm4gaXNuJ3QgZm91bmQsIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotIyBUaGUgcmVwbGFjZW1lbnQgbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyBcZGlnaXQgdG8gc3VicGF0dGVybnMgYW5kCi0jIGVzY2FwZWQgYmFja3NsYXNoZXMuICBUaGUgcGF0dGVybiBtYXkgYmUgYSBzdHJpbmcgb3IgYW4gYWxyZWFkeQotIyBjb21waWxlZCBwYXR0ZXJuLgotCi1kZWYgc3ViKHBhdCwgcmVwbCwgc3RyKToKLSAgICBwcm9nID0gY29tcGlsZShwYXQpCi0gICAgaWYgcHJvZy5zZWFyY2goc3RyKSA+PSAwOgotICAgICAgICByZWdzID0gcHJvZy5yZWdzCi0gICAgICAgIGEsIGIgPSByZWdzWzBdCi0gICAgICAgIHN0ciA9IHN0cls6YV0gKyBleHBhbmQocmVwbCwgcmVncywgc3RyKSArIHN0cltiOl0KLSAgICByZXR1cm4gc3RyCi0KLQotIyBSZXBsYWNlIGFsbCAobm9uLW92ZXJsYXBwaW5nKSBvY2N1cnJlbmNlcyBvZiBwYXR0ZXJuIHBhdCBpbiBzdHJpbmcKLSMgc3RyIGJ5IHJlcGxhY2VtZW50IHJlcGwuICBUaGUgc2FtZSBydWxlcyBhcyBmb3Igc3ViKCkgYXBwbHkuCi0jIEVtcHR5IG1hdGNoZXMgZm9yIHRoZSBwYXR0ZXJuIGFyZSByZXBsYWNlZCBvbmx5IHdoZW4gbm90IGFkamFjZW50IHRvCi0jIGEgcHJldmlvdXMgbWF0Y2gsIHNvIGUuZy4gZ3N1YignJywgJy0nLCAnYWJjJykgcmV0dXJucyAnLWEtYi1jLScuCi0KLWRlZiBnc3ViKHBhdCwgcmVwbCwgc3RyKToKLSAgICBwcm9nID0gY29tcGlsZShwYXQpCi0gICAgbmV3ID0gJycKLSAgICBzdGFydCA9IDAKLSAgICBmaXJzdCA9IDEKLSAgICB3aGlsZSBwcm9nLnNlYXJjaChzdHIsIHN0YXJ0KSA+PSAwOgotICAgICAgICByZWdzID0gcHJvZy5yZWdzCi0gICAgICAgIGEsIGIgPSByZWdzWzBdCi0gICAgICAgIGlmIGEgPT0gYiA9PSBzdGFydCBhbmQgbm90IGZpcnN0OgotICAgICAgICAgICAgaWYgc3RhcnQgPj0gbGVuKHN0cikgb3IgcHJvZy5zZWFyY2goc3RyLCBzdGFydCsxKSA8IDA6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIHJlZ3MgPSBwcm9nLnJlZ3MKLSAgICAgICAgICAgIGEsIGIgPSByZWdzWzBdCi0gICAgICAgIG5ldyA9IG5ldyArIHN0cltzdGFydDphXSArIGV4cGFuZChyZXBsLCByZWdzLCBzdHIpCi0gICAgICAgIHN0YXJ0ID0gYgotICAgICAgICBmaXJzdCA9IDAKLSAgICBuZXcgPSBuZXcgKyBzdHJbc3RhcnQ6XQotICAgIHJldHVybiBuZXcKLQotCi0jIFNwbGl0IHN0cmluZyBzdHIgaW4gZmllbGRzIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXJzIG1hdGNoaW5nIHBhdHRlcm4KLSMgcGF0LiAgT25seSBub24tZW1wdHkgbWF0Y2hlcyBmb3IgdGhlIHBhdHRlcm4gYXJlIGNvbnNpZGVyZWQsIHNvIGUuZy4KLSMgc3BsaXQoJ2FiYycsICcnKSByZXR1cm5zIFsnYWJjJ10uCi0jIFRoZSBvcHRpb25hbCAzcmQgYXJndW1lbnQgc2V0cyB0aGUgbnVtYmVyIG9mIHNwbGl0cyB0aGF0IGFyZSBwZXJmb3JtZWQuCi0KLWRlZiBzcGxpdChzdHIsIHBhdCwgbWF4c3BsaXQgPSAwKToKLSAgICByZXR1cm4gaW50c3BsaXQoc3RyLCBwYXQsIG1heHNwbGl0LCAwKQotCi0jIFNwbGl0IHN0cmluZyBzdHIgaW4gZmllbGRzIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXJzIG1hdGNoaW5nIHBhdHRlcm4KLSMgcGF0LiAgT25seSBub24tZW1wdHkgbWF0Y2hlcyBmb3IgdGhlIHBhdHRlcm4gYXJlIGNvbnNpZGVyZWQsIHNvIGUuZy4KLSMgc3BsaXQoJ2FiYycsICcnKSByZXR1cm5zIFsnYWJjJ10uIFRoZSBkZWxpbWl0ZXJzIGFyZSBhbHNvIGluY2x1ZGVkCi0jIGluIHRoZSBsaXN0LgotIyBUaGUgb3B0aW9uYWwgM3JkIGFyZ3VtZW50IHNldHMgdGhlIG51bWJlciBvZiBzcGxpdHMgdGhhdCBhcmUgcGVyZm9ybWVkLgotCi0KLWRlZiBzcGxpdHgoc3RyLCBwYXQsIG1heHNwbGl0ID0gMCk6Ci0gICAgcmV0dXJuIGludHNwbGl0KHN0ciwgcGF0LCBtYXhzcGxpdCwgMSkKLQotIyBJbnRlcm5hbCBmdW5jdGlvbiB1c2VkIHRvIGltcGxlbWVudCBzcGxpdCgpIGFuZCBzcGxpdHgoKS4KLQotZGVmIGludHNwbGl0KHN0ciwgcGF0LCBtYXhzcGxpdCwgcmV0YWluKToKLSAgICBwcm9nID0gY29tcGlsZShwYXQpCi0gICAgcmVzID0gW10KLSAgICBzdGFydCA9IG5leHQgPSAwCi0gICAgc3BsaXRjb3VudCA9IDAKLSAgICB3aGlsZSBwcm9nLnNlYXJjaChzdHIsIG5leHQpID49IDA6Ci0gICAgICAgIHJlZ3MgPSBwcm9nLnJlZ3MKLSAgICAgICAgYSwgYiA9IHJlZ3NbMF0KLSAgICAgICAgaWYgYSA9PSBiOgotICAgICAgICAgICAgbmV4dCA9IG5leHQgKyAxCi0gICAgICAgICAgICBpZiBuZXh0ID49IGxlbihzdHIpOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXMuYXBwZW5kKHN0cltzdGFydDphXSkKLSAgICAgICAgICAgIGlmIHJldGFpbjoKLSAgICAgICAgICAgICAgICByZXMuYXBwZW5kKHN0clthOmJdKQotICAgICAgICAgICAgc3RhcnQgPSBuZXh0ID0gYgotICAgICAgICAgICAgc3BsaXRjb3VudCA9IHNwbGl0Y291bnQgKyAxCi0gICAgICAgICAgICBpZiAobWF4c3BsaXQgYW5kIChzcGxpdGNvdW50ID49IG1heHNwbGl0KSk6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICByZXMuYXBwZW5kKHN0cltzdGFydDpdKQotICAgIHJldHVybiByZXMKLQotCi0jIENhcGl0YWxpemUgd29yZHMgc3BsaXQgdXNpbmcgYSBwYXR0ZXJuCi0KLWRlZiBjYXB3b3JkcyhzdHIsIHBhdD0nW15hLXpBLVowLTlfXSsnKToKLSAgICB3b3JkcyA9IHNwbGl0eChzdHIsIHBhdCkKLSAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4od29yZHMpLCAyKToKLSAgICAgICAgd29yZHNbaV0gPSB3b3Jkc1tpXS5jYXBpdGFsaXplKCkKLSAgICByZXR1cm4gIiIuam9pbih3b3JkcykKLQotCi0jIEludGVybmFsIHN1YnJvdXRpbmVzOgotIyBjb21waWxlKHBhdCk6IGNvbXBpbGUgYSBwYXR0ZXJuLCBjYWNoaW5nIGFscmVhZHkgY29tcGlsZWQgcGF0dGVybnMKLSMgZXhwYW5kKHJlcGwsIHJlZ3MsIHN0cik6IGV4cGFuZCBcZGlnaXQgZXNjYXBlcyBpbiByZXBsYWNlbWVudCBzdHJpbmcKLQotCi0jIE1hbmFnZSBhIGNhY2hlIG9mIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCi0jCi0jIElmIHRoZSBwYXR0ZXJuIGlzIGEgc3RyaW5nIGEgY29tcGlsZWQgdmVyc2lvbiBvZiBpdCBpcyByZXR1cm5lZC4gIElmCi0jIHRoZSBwYXR0ZXJuIGhhcyBiZWVuIHVzZWQgYmVmb3JlIHdlIHJldHVybiBhbiBhbHJlYWR5IGNvbXBpbGVkCi0jIHZlcnNpb24gZnJvbSB0aGUgY2FjaGU7IG90aGVyd2lzZSB3ZSBjb21waWxlIGl0IG5vdyBhbmQgc2F2ZSB0aGUKLSMgY29tcGlsZWQgdmVyc2lvbiBpbiB0aGUgY2FjaGUsIGFsb25nIHdpdGggdGhlIHN5bnRheCBpdCB3YXMgY29tcGlsZWQKLSMgd2l0aC4gIEluc3RlYWQgb2YgYSBzdHJpbmcsIGEgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uIGNhbiBhbHNvCi0jIGJlIHBhc3NlZC4KLQotY2FjaGUgPSB7fQotCi1kZWYgY29tcGlsZShwYXQpOgotICAgIGlmIHR5cGUocGF0KSAhPSB0eXBlKCcnKToKLSAgICAgICAgcmV0dXJuIHBhdCAgICAgICAgICAgICAgIyBBc3N1bWUgaXQgaXMgYSBjb21waWxlZCByZWdleAotICAgIGtleSA9IChwYXQsIHJlZ2V4LmdldF9zeW50YXgoKSkKLSAgICBpZiBrZXkgaW4gY2FjaGU6Ci0gICAgICAgIHByb2cgPSBjYWNoZVtrZXldICAgICAgICMgR2V0IGl0IGZyb20gdGhlIGNhY2hlCi0gICAgZWxzZToKLSAgICAgICAgcHJvZyA9IGNhY2hlW2tleV0gPSByZWdleC5jb21waWxlKHBhdCkKLSAgICByZXR1cm4gcHJvZwotCi0KLWRlZiBjbGVhcl9jYWNoZSgpOgotICAgIGdsb2JhbCBjYWNoZQotICAgIGNhY2hlID0ge30KLQotCi0jIEV4cGFuZCBcZGlnaXQgaW4gdGhlIHJlcGxhY2VtZW50LgotIyBFYWNoIG9jY3VycmVuY2Ugb2YgXGRpZ2l0IGlzIHJlcGxhY2VkIGJ5IHRoZSBzdWJzdHJpbmcgb2Ygc3RyCi0jIGluZGljYXRlZCBieSByZWdzW2RpZ2l0XS4gIFRvIGluY2x1ZGUgYSBsaXRlcmFsIFwgaW4gdGhlCi0jIHJlcGxhY2VtZW50LCBkb3VibGUgaXQ7IG90aGVyIFwgZXNjYXBlcyBhcmUgbGVmdCB1bmNoYW5nZWQgKGkuZS4KLSMgdGhlIFwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGFyZSBib3RoIGNvcGllZCkuCi0KLWRlZiBleHBhbmQocmVwbCwgcmVncywgc3RyKToKLSAgICBpZiAnXFwnIG5vdCBpbiByZXBsOgotICAgICAgICByZXR1cm4gcmVwbAotICAgIG5ldyA9ICcnCi0gICAgaSA9IDAKLSAgICBvcmQwID0gb3JkKCcwJykKLSAgICB3aGlsZSBpIDwgbGVuKHJlcGwpOgotICAgICAgICBjID0gcmVwbFtpXTsgaSA9IGkrMQotICAgICAgICBpZiBjICE9ICdcXCcgb3IgaSA+PSBsZW4ocmVwbCk6Ci0gICAgICAgICAgICBuZXcgPSBuZXcgKyBjCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBjID0gcmVwbFtpXTsgaSA9IGkrMQotICAgICAgICAgICAgaWYgJzAnIDw9IGMgPD0gJzknOgotICAgICAgICAgICAgICAgIGEsIGIgPSByZWdzW29yZChjKS1vcmQwXQotICAgICAgICAgICAgICAgIG5ldyA9IG5ldyArIHN0clthOmJdCi0gICAgICAgICAgICBlbGlmIGMgPT0gJ1xcJzoKLSAgICAgICAgICAgICAgICBuZXcgPSBuZXcgKyBjCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIG5ldyA9IG5ldyArICdcXCcgKyBjCi0gICAgcmV0dXJuIG5ldwotCi0KLSMgVGVzdCBwcm9ncmFtLCByZWFkcyBzZXF1ZW5jZXMgInBhdCByZXBsIHN0ciIgZnJvbSBzdGRpbi4KLSMgT3B0aW9uYWwgYXJndW1lbnQgc3BlY2lmaWVzIHBhdHRlcm4gdXNlZCB0byBzcGxpdCBsaW5lcy4KLQotZGVmIHRlc3QoKToKLSAgICBpbXBvcnQgc3lzCi0gICAgaWYgc3lzLmFyZ3ZbMTpdOgotICAgICAgICBkZWxwYXQgPSBzeXMuYXJndlsxXQotICAgIGVsc2U6Ci0gICAgICAgIGRlbHBhdCA9ICdbIFx0XG5dKycKLSAgICB3aGlsZSAxOgotICAgICAgICBpZiBzeXMuc3RkaW4uaXNhdHR5KCk6IHN5cy5zdGRlcnIud3JpdGUoJy0tPiAnKQotICAgICAgICBsaW5lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKLSAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgIGlmIGxpbmVbLTFdID09ICdcbic6IGxpbmUgPSBsaW5lWzotMV0KLSAgICAgICAgZmllbGRzID0gc3BsaXQobGluZSwgZGVscGF0KQotICAgICAgICBpZiBsZW4oZmllbGRzKSAhPSAzOgotICAgICAgICAgICAgcHJpbnQgJ1NvcnJ5LCBub3QgdGhyZWUgZmllbGRzJwotICAgICAgICAgICAgcHJpbnQgJ3NwbGl0OicsIHJlcHIoZmllbGRzKQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgW3BhdCwgcmVwbCwgc3RyXSA9IHNwbGl0KGxpbmUsIGRlbHBhdCkKLSAgICAgICAgcHJpbnQgJ3N1YiA6JywgcmVwcihzdWIocGF0LCByZXBsLCBzdHIpKQotICAgICAgICBwcmludCAnZ3N1YjonLCByZXByKGdzdWIocGF0LCByZXBsLCBzdHIpKQpkaWZmIC0tZ2l0IGEvTGliL3JleGVjLnB5IGIvTGliL3JleGVjLnB5CmluZGV4IGVkMDFkMjQuLjEwZTRiYzAgMTAwNjQ0Ci0tLSBhL0xpYi9yZXhlYy5weQorKysgYi9MaWIvcmV4ZWMucHkKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgIG9rX2J1aWx0aW5fbW9kdWxlcyA9ICgnYXVkaW9vcCcsICdhcnJheScsICdiaW5hc2NpaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbWF0aCcsICdlcnJubycsICdpbWFnZW9wJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcnNoYWwnLCAnbWF0aCcsICdtZDUnLCAnb3BlcmF0b3InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyc2VyJywgJ3JlZ2V4JywgJ3NlbGVjdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJzZXInLCAnc2VsZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYScsICdfc3JlJywgJ3N0cm9wJywgJ3N0cnVjdCcsICd0aW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ193ZWFrcmVmJykKIApkaWZmIC0tZ2l0IGEvTGliL3J1bnB5LnB5IGIvTGliL3J1bnB5LnB5CmluZGV4IGFmYjAwOTguLjgyOTBkZmUgMTAwNzU1Ci0tLSBhL0xpYi9ydW5weS5weQorKysgYi9MaWIvcnVucHkucHkKQEAgLTExLDM0OSArMTEsMTUgQEAKIAogaW1wb3J0IHN5cwogaW1wb3J0IGltcAordHJ5OgorICAgIGZyb20gaW1wIGltcG9ydCBnZXRfbG9hZGVyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBwa2d1dGlsIGltcG9ydCBnZXRfbG9hZGVyCiAKIF9fYWxsX18gPSBbCiAgICAgInJ1bl9tb2R1bGUiLAogXQogCi10cnk6Ci0gICAgX2dldF9sb2FkZXIgPSBpbXAuZ2V0X2xvYWRlcgotZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICMgZ2V0X2xvYWRlcigpIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgaW1wIG1vZHVsZSwgc28gZW11bGF0ZSBpdAotICAgICMgYXMgYmVzdCB3ZSBjYW4gdXNpbmcgdGhlIFBFUCAzMDIgaW1wb3J0IG1hY2hpbmVyeSBleHBvc2VkIHNpbmNlCi0gICAgIyBQeXRob24gMi4zLiBUaGUgZW11bGF0aW9uIGlzbid0IHBlcmZlY3QsIGJ1dCB0aGUgZGlmZmVyZW5jZXMKLSAgICAjIGluIHRoZSB3YXkgbmFtZXMgYXJlIHNoYWRvd2VkIHNob3VsZG4ndCBtYXR0ZXIgaW4gcHJhY3RpY2UuCi0gICAgaW1wb3J0IG9zLnBhdGgKLSAgICBpbXBvcnQgbWFyc2hhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIGNvbXBpbGVkIFB5dGhvbiBmaWxlcwotCi0gICAgIyBUaGlzIGhlbHBlciBpcyBuZWVkZWQgaW4gb3JkZXIgZm9yIHRoZSBQRVAgMzAyIGVtdWxhdGlvbiB0bwotICAgICMgY29ycmVjdGx5IGhhbmRsZSBjb21waWxlZCBmaWxlcwotICAgIGRlZiBfcmVhZF9jb21waWxlZF9maWxlKGNvbXBpbGVkX2ZpbGUpOgotICAgICAgICBtYWdpYyA9IGNvbXBpbGVkX2ZpbGUucmVhZCg0KQotICAgICAgICBpZiBtYWdpYyAhPSBpbXAuZ2V0X21hZ2ljKCk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjb21waWxlZF9maWxlLnJlYWQoNCkgIyBTa2lwIHRpbWVzdGFtcAotICAgICAgICAgICAgcmV0dXJuIG1hcnNoYWwubG9hZChjb21waWxlZF9maWxlKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGNsYXNzIF9BYnNvbHV0ZUltcG9ydGVyKG9iamVjdCk6Ci0gICAgICAgICIiIlBFUCAzMDIgaW1wb3J0ZXIgd3JhcHBlciBmb3IgdG9wIGxldmVsIGltcG9ydCBtYWNoaW5lcnkiIiIKLSAgICAgICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIG1vZF9uYW1lLCBwYXRoPU5vbmUpOgotICAgICAgICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGZpbGUsIGZpbGVuYW1lLCBtb2RfaW5mbyA9IGltcC5maW5kX21vZHVsZShtb2RfbmFtZSkKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAgICAgc3VmZml4LCBtb2RlLCBtb2RfdHlwZSA9IG1vZF9pbmZvCi0gICAgICAgICAgICBpZiBtb2RfdHlwZSA9PSBpbXAuUFlfU09VUkNFOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9Tb3VyY2VGaWxlTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIGVsaWYgbW9kX3R5cGUgPT0gaW1wLlBZX0NPTVBJTEVEOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9Db21waWxlZEZpbGVMb2FkZXIobW9kX25hbWUsIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICBlbGlmIG1vZF90eXBlID09IGltcC5QS0dfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9QYWNrYWdlRGlyTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIGVsaWYgbW9kX3R5cGUgPT0gaW1wLkNfRVhURU5TSU9OOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9GaWxlU3lzdGVtTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbG9hZGVyID0gX0Jhc2ljTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICByZXR1cm4gbG9hZGVyCi0KLQotICAgIGNsYXNzIF9GaWxlU3lzdGVtSW1wb3J0ZXIob2JqZWN0KToKLSAgICAgICAgIiIiUEVQIDMwMiBpbXBvcnRlciB3cmFwcGVyIGZvciBmaWxlc3lzdGVtIGJhc2VkIGltcG9ydHMiIiIKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGhfaXRlbT1Ob25lKToKLSAgICAgICAgICAgIGlmIHBhdGhfaXRlbSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBpZiBwYXRoX2l0ZW0gIT0gJycgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGhfaXRlbSk6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCIlcyBpcyBub3QgYSBkaXJlY3RvcnkiICUgcGF0aF9pdGVtKQotICAgICAgICAgICAgICAgIHNlbGYucGF0aF9kaXIgPSBwYXRoX2l0ZW0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkZpbGVzeXN0ZW0gaW1wb3J0ZXIgcmVxdWlyZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIGRpcmVjdG9yeSBuYW1lIikKLQotICAgICAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgbW9kX25hbWUsIHBhdGg9Tm9uZSk6Ci0gICAgICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICAgICBwYXRoX2RpciA9IHNlbGYucGF0aF9kaXIKLSAgICAgICAgICAgIGlmIHBhdGhfZGlyID09ICcnOgotICAgICAgICAgICAgICAgIHBhdGhfZGlyID0gb3MuZ2V0Y3dkKCkKLSAgICAgICAgICAgIHN1Yl9uYW1lID0gbW9kX25hbWUucnNwbGl0KCIuIiwgMSlbLTFdCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZmlsZSwgZmlsZW5hbWUsIG1vZF9pbmZvID0gaW1wLmZpbmRfbW9kdWxlKHN1Yl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGF0aF9kaXJdKQotICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICAgICBpZiBub3QgZmlsZW5hbWUuc3RhcnRzd2l0aChwYXRoX2Rpcik6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgICAgIHN1ZmZpeCwgbW9kZSwgbW9kX3R5cGUgPSBtb2RfaW5mbwotICAgICAgICAgICAgaWYgbW9kX3R5cGUgPT0gaW1wLlBZX1NPVVJDRToKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBfU291cmNlRmlsZUxvYWRlcihtb2RfbmFtZSwgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICBlbGlmIG1vZF90eXBlID09IGltcC5QWV9DT01QSUxFRDoKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBfQ29tcGlsZWRGaWxlTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1vZF9pbmZvKQotICAgICAgICAgICAgZWxpZiBtb2RfdHlwZSA9PSBpbXAuUEtHX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBfUGFja2FnZURpckxvYWRlcihtb2RfbmFtZSwgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICBlbGlmIG1vZF90eXBlID09IGltcC5DX0VYVEVOU0lPTjoKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBfRmlsZVN5c3RlbUxvYWRlcihtb2RfbmFtZSwgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9CYXNpY0xvYWRlcihtb2RfbmFtZSwgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1vZF9pbmZvKQotICAgICAgICAgICAgcmV0dXJuIGxvYWRlcgotCi0KLSAgICBjbGFzcyBfQmFzaWNMb2FkZXIob2JqZWN0KToKLSAgICAgICAgIiIiUEVQIDMwMiBsb2FkZXIgd3JhcHBlciBmb3IgdG9wIGxldmVsIGltcG9ydCBtYWNoaW5lcnkiIiIKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZF9uYW1lLCBmaWxlLCBmaWxlbmFtZSwgbW9kX2luZm8pOgotICAgICAgICAgICAgc2VsZi5tb2RfbmFtZSA9IG1vZF9uYW1lCi0gICAgICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCi0gICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKLSAgICAgICAgICAgIHNlbGYubW9kX2luZm8gPSBtb2RfaW5mbwotCi0gICAgICAgIGRlZiBfZml4X25hbWUoc2VsZiwgbW9kX25hbWUpOgotICAgICAgICAgICAgaWYgbW9kX25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBtb2RfbmFtZSA9IHNlbGYubW9kX25hbWUKLSAgICAgICAgICAgIGVsaWYgbW9kX25hbWUgIT0gc2VsZi5tb2RfbmFtZToKLSAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiTG9hZGVyIGZvciBtb2R1bGUgJXMgY2Fubm90IGhhbmRsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSAlcyIgJSAoc2VsZi5tb2RfbmFtZSwgbW9kX25hbWUpKQotICAgICAgICAgICAgcmV0dXJuIG1vZF9uYW1lCi0KLSAgICAgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIG1vZF9uYW1lPU5vbmUpOgotICAgICAgICAgICAgbW9kX25hbWUgPSBzZWxmLl9maXhfbmFtZShtb2RfbmFtZSkKLSAgICAgICAgICAgIG1vZCA9IGltcC5sb2FkX21vZHVsZShtb2RfbmFtZSwgc2VsZi5maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUsIHNlbGYubW9kX2luZm8pCi0gICAgICAgICAgICBtb2QuX19sb2FkZXJfXyA9IHNlbGYgICMgZm9yIGludHJvc3BlY3Rpb24KLSAgICAgICAgICAgIHJldHVybiBtb2QKLQotICAgICAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgbW9kX25hbWU9Tm9uZSk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgIGRlZiBnZXRfc291cmNlKHNlbGYsIG1vZF9uYW1lPU5vbmUpOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBtb2RfbmFtZT1Ob25lKToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgICAgIGlmIHNlbGYuZmlsZToKLSAgICAgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQotCi0gICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0KLQotICAgIGNsYXNzIF9GaWxlU3lzdGVtTG9hZGVyKF9CYXNpY0xvYWRlcik6Ci0gICAgICAgICIiIlBFUCAzMDIgbG9hZGVyIHdyYXBwZXIgZm9yIGZpbGVzeXN0ZW0gYmFzZWQgaW1wb3J0cyIiIgotICAgICAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgbW9kX25hbWU9Tm9uZSk6Ci0gICAgICAgICAgICBtb2RfbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKG1vZF9uYW1lKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9jb2RlKG1vZF9uYW1lKQotCi0gICAgICAgIGRlZiBnZXRfZGF0YShzZWxmLCBwYXRobmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gb3BlbihwYXRobmFtZSwgInJiIikucmVhZCgpCi0KLSAgICAgICAgZGVmIGdldF9maWxlbmFtZShzZWxmLCBtb2RfbmFtZT1Ob25lKToKLSAgICAgICAgICAgIG1vZF9uYW1lID0gc2VsZi5fZml4X25hbWUobW9kX25hbWUpCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2ZpbGVuYW1lKG1vZF9uYW1lKQotCi0gICAgICAgIGRlZiBnZXRfc291cmNlKHNlbGYsIG1vZF9uYW1lPU5vbmUpOgotICAgICAgICAgICAgbW9kX25hbWUgPSBzZWxmLl9maXhfbmFtZShtb2RfbmFtZSkKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfc291cmNlKG1vZF9uYW1lKQotCi0gICAgICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIG1vZF9uYW1lPU5vbmUpOgotICAgICAgICAgICAgbW9kX25hbWUgPSBzZWxmLl9maXhfbmFtZShtb2RfbmFtZSkKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9pc19wYWNrYWdlKG1vZF9uYW1lKQotCi0gICAgICAgIGRlZiBfZ2V0X2NvZGUoc2VsZiwgbW9kX25hbWUpOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICAgICBkZWYgX2dldF9maWxlbmFtZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZQotCi0gICAgICAgIGRlZiBfZ2V0X3NvdXJjZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgIGRlZiBfaXNfcGFja2FnZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIGNsYXNzIF9QYWNrYWdlRGlyTG9hZGVyKF9GaWxlU3lzdGVtTG9hZGVyKToKLSAgICAgICAgIiIiUEVQIDMwMiBsb2FkZXIgd3JhcHBlciBmb3IgUEtHX0RJUkVDVE9SWSBkaXJlY3RvcmllcyIiIgotICAgICAgICBkZWYgX2lzX3BhY2thZ2Uoc2VsZiwgbW9kX25hbWUpOgotICAgICAgICAgICAgcmV0dXJuIFRydWUKLQotCi0gICAgY2xhc3MgX1NvdXJjZUZpbGVMb2FkZXIoX0ZpbGVTeXN0ZW1Mb2FkZXIpOgotICAgICAgICAiIiJQRVAgMzAyIGxvYWRlciB3cmFwcGVyIGZvciBQWV9TT1VSQ0UgbW9kdWxlcyIiIgotICAgICAgICBkZWYgX2dldF9jb2RlKHNlbGYsIG1vZF9uYW1lKToKLSAgICAgICAgICAgIHJldHVybiBjb21waWxlKHNlbGYuX2dldF9zb3VyY2UobW9kX25hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgJ2V4ZWMnKQotCi0gICAgICAgIGRlZiBfZ2V0X3NvdXJjZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICBmID0gc2VsZi5maWxlCi0gICAgICAgICAgICBmLnNlZWsoMCkKLSAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQotCi0KLSAgICBjbGFzcyBfQ29tcGlsZWRGaWxlTG9hZGVyKF9GaWxlU3lzdGVtTG9hZGVyKToKLSAgICAgICAgIiIiUEVQIDMwMiBsb2FkZXIgd3JhcHBlciBmb3IgUFlfQ09NUElMRUQgbW9kdWxlcyIiIgotICAgICAgICBkZWYgX2dldF9jb2RlKHNlbGYsIG1vZF9uYW1lKToKLSAgICAgICAgICAgIGYgPSBzZWxmLmZpbGUKLSAgICAgICAgICAgIGYuc2VlaygwKQotICAgICAgICAgICAgcmV0dXJuIF9yZWFkX2NvbXBpbGVkX2ZpbGUoZikKLQotCi0gICAgZGVmIF9nZXRfaW1wb3J0ZXIocGF0aF9pdGVtKToKLSAgICAgICAgIiIiUmV0cmlldmUgYSBQRVAgMzAyIGltcG9ydGVyIGZvciB0aGUgZ2l2ZW4gcGF0aCBpdGVtCi0KLSAgICAgICAgVGhlIHJldHVybmVkIGltcG9ydGVyIGlzIGNhY2hlZCBpbiBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZQotICAgICAgICBpZiBpdCB3YXMgbmV3bHkgY3JlYXRlZCBieSBhIHBhdGggaG9vay4KLQotICAgICAgICBJZiB0aGVyZSBpcyBubyBpbXBvcnRlciwgYSB3cmFwcGVyIGFyb3VuZCB0aGUgYmFzaWMgaW1wb3J0Ci0gICAgICAgIG1hY2hpbmVyeSBpcyByZXR1cm5lZC4gVGhpcyB3cmFwcGVyIGlzIG5ldmVyIGluc2VydGVkIGludG8KLSAgICAgICAgdGhlIGltcG9ydGVyIGNhY2hlIChOb25lIGlzIGluc2VydGVkIGluc3RlYWQpLgotCi0gICAgICAgIFRoZSBjYWNoZSAob3IgcGFydCBvZiBpdCkgY2FuIGJlIGNsZWFyZWQgbWFudWFsbHkgaWYgYQotICAgICAgICByZXNjYW4gb2Ygc3lzLnBhdGhfaG9va3MgaXMgbmVjZXNzYXJ5LgotICAgICAgICAiIiIKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaW1wb3J0ZXIgPSBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZVtwYXRoX2l0ZW1dCi0gICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIGZvciBwYXRoX2hvb2sgaW4gc3lzLnBhdGhfaG9va3M6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBpbXBvcnRlciA9IHBhdGhfaG9vayhwYXRoX2l0ZW0pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGltcG9ydGVyID0gTm9uZQotICAgICAgICAgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVbcGF0aF9pdGVtXSA9IGltcG9ydGVyCi0gICAgICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgaW1wb3J0ZXIgPSBfRmlsZVN5c3RlbUltcG9ydGVyKHBhdGhfaXRlbSkKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgIHJldHVybiBpbXBvcnRlcgotCi0KLSAgICBkZWYgX2dldF9wYXRoX2xvYWRlcihtb2RfbmFtZSwgcGF0aD1Ob25lKToKLSAgICAgICAgIiIiUmV0cmlldmUgYSBQRVAgMzAyIGxvYWRlciB1c2luZyBhIHBhdGggaW1wb3J0ZXIiIiIKLSAgICAgICAgaWYgcGF0aCBpcyBOb25lOgotICAgICAgICAgICAgcGF0aCA9IHN5cy5wYXRoCi0gICAgICAgICAgICBhYnNvbHV0ZV9sb2FkZXIgPSBfQWJzb2x1dGVJbXBvcnRlcigpLmZpbmRfbW9kdWxlKG1vZF9uYW1lKQotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhYnNvbHV0ZV9sb2FkZXIsIF9GaWxlU3lzdGVtTG9hZGVyKToKLSAgICAgICAgICAgICAgICAjIEZvdW5kIGluIGZpbGVzeXN0ZW0sIHNvIHNjYW4gcGF0aCBob29rcwotICAgICAgICAgICAgICAgICMgYmVmb3JlIGFjY2VwdGluZyB0aGlzIG9uZSBhcyB0aGUgcmlnaHQgb25lCi0gICAgICAgICAgICAgICAgbG9hZGVyID0gTm9uZQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAjIE5vdCBmb3VuZCBpbiBmaWxlc3lzdGVtLCBzbyB1c2UgdG9wLWxldmVsIGxvYWRlcgotICAgICAgICAgICAgICAgIGxvYWRlciA9IGFic29sdXRlX2xvYWRlcgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbG9hZGVyID0gYWJzb2x1dGVfbG9hZGVyID0gTm9uZQotICAgICAgICBpZiBsb2FkZXIgaXMgTm9uZToKLSAgICAgICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gcGF0aDoKLSAgICAgICAgICAgICAgICBpbXBvcnRlciA9IF9nZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQotICAgICAgICAgICAgICAgIGlmIGltcG9ydGVyIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShtb2RfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3VuZCBhIGxvYWRlciBmb3Igb3VyIG1vZHVsZQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyBObyBwYXRoIGhvb2sgZm91bmQsIHNvIGFjY2VwdCB0aGUgdG9wIGxldmVsIGxvYWRlcgotICAgICAgICAgICAgICAgIGxvYWRlciA9IGFic29sdXRlX2xvYWRlcgotICAgICAgICByZXR1cm4gbG9hZGVyCi0KLSAgICBkZWYgX2dldF9wYWNrYWdlKHBrZ19uYW1lKToKLSAgICAgICAgIiIiUmV0cmlldmUgYSBuYW1lZCBwYWNrYWdlIiIiCi0gICAgICAgIHBrZyA9IF9faW1wb3J0X18ocGtnX25hbWUpCi0gICAgICAgIHN1Yl9wa2dfbmFtZXMgPSBwa2dfbmFtZS5zcGxpdCgiLiIpCi0gICAgICAgIGZvciBzdWJfcGtnIGluIHN1Yl9wa2dfbmFtZXNbMTpdOgotICAgICAgICAgICAgcGtnID0gZ2V0YXR0cihwa2csIHN1Yl9wa2cpCi0gICAgICAgIHJldHVybiBwa2cKLQotICAgIGRlZiBfZ2V0X2xvYWRlcihtb2RfbmFtZSwgcGF0aD1Ob25lKToKLSAgICAgICAgIiIiUmV0cmlldmUgYSBQRVAgMzAyIGxvYWRlciBmb3IgdGhlIGdpdmVuIG1vZHVsZSBvciBwYWNrYWdlCi0KLSAgICAgICAgSWYgdGhlIG1vZHVsZSBvciBwYWNrYWdlIGlzIGFjY2Vzc2libGUgdmlhIHRoZSBub3JtYWwgaW1wb3J0Ci0gICAgICAgIG1lY2hhbmlzbSwgYSB3cmFwcGVyIGFyb3VuZCB0aGUgcmVsZXZhbnQgcGFydCBvZiB0aGF0IG1hY2hpbmVyeQotICAgICAgICBpcyByZXR1cm5lZC4KLQotICAgICAgICBOb24gUEVQIDMwMiBtZWNoYW5pc21zIChlLmcuIHRoZSBXaW5kb3dzIHJlZ2lzdHJ5KSB1c2VkIGJ5IHRoZQotICAgICAgICBzdGFuZGFyZCBpbXBvcnQgbWFjaGluZXJ5IHRvIGZpbmQgZmlsZXMgaW4gYWx0ZXJuYXRpdmUgbG9jYXRpb25zCi0gICAgICAgIGFyZSBwYXJ0aWFsbHkgc3VwcG9ydGVkLCBidXQgYXJlIHNlYXJjaGVkIEFGVEVSIHN5cy5wYXRoLiBOb3JtYWxseSwKLSAgICAgICAgdGhlc2UgbG9jYXRpb25zIGFyZSBzZWFyY2hlZCBCRUZPUkUgc3lzLnBhdGgsIHByZXZlbnRpbmcgc3lzLnBhdGgKLSAgICAgICAgZW50cmllcyBmcm9tIHNoYWRvd2luZyB0aGVtLgotICAgICAgICBGb3IgdGhpcyB0byBjYXVzZSBhIHZpc2libGUgZGlmZmVyZW5jZSBpbiBiZWhhdmlvdXIsIHRoZXJlIG11c3QKLSAgICAgICAgYmUgYSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lIHRoYXQgaXMgYWNjZXNzaWJsZSB2aWEgYm90aCBzeXMucGF0aAotICAgICAgICBhbmQgb25lIG9mIHRoZSBub24gUEVQIDMwMiBmaWxlIHN5c3RlbSBtZWNoYW5pc21zLiBJbiB0aGlzIGNhc2UsCi0gICAgICAgIHRoZSBlbXVsYXRpb24gd2lsbCBmaW5kIHRoZSBmb3JtZXIgdmVyc2lvbiwgd2hpbGUgdGhlIGJ1aWx0aW4KLSAgICAgICAgaW1wb3J0IG1lY2hhbmlzbSB3aWxsIGZpbmQgdGhlIGxhdHRlci4KLSAgICAgICAgSXRlbXMgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBjYW4gYmUgYWZmZWN0ZWQgYnkgdGhpcyBkaXNjcmVwYW5jeToKLSAgICAgICAgICAgIGltcC5DX0VYVEVOU0lPTgotICAgICAgICAgICAgaW1wLlBZX1NPVVJDRQotICAgICAgICAgICAgaW1wLlBZX0NPTVBJTEVECi0gICAgICAgICAgICBpbXAuUEtHX0RJUkVDVE9SWQotICAgICAgICAiIiIKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbG9hZGVyID0gc3lzLm1vZHVsZXNbbW9kX25hbWVdLl9fbG9hZGVyX18KLSAgICAgICAgZXhjZXB0IChLZXlFcnJvciwgQXR0cmlidXRlRXJyb3IpOgotICAgICAgICAgICAgbG9hZGVyID0gTm9uZQotICAgICAgICBpZiBsb2FkZXIgaXMgTm9uZToKLSAgICAgICAgICAgIGltcC5hY3F1aXJlX2xvY2soKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICMgTW9kdWxlIG5vdCBpbiBzeXMubW9kdWxlcywgb3IgdXNlcyBhbiB1bmhvb2tlZCBsb2FkZXIKLSAgICAgICAgICAgICAgICBwYXJ0cyA9IG1vZF9uYW1lLnJzcGxpdCgiLiIsIDEpCi0gICAgICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyOgotICAgICAgICAgICAgICAgICAgICAjIFN1YiBwYWNrYWdlLCBzbyB1c2UgcGFyZW50IHBhY2thZ2UncyBwYXRoCi0gICAgICAgICAgICAgICAgICAgIHBrZ19uYW1lLCBzdWJfbmFtZSA9IHBhcnRzCi0gICAgICAgICAgICAgICAgICAgIGlmIHBrZ19uYW1lIGFuZCBwa2dfbmFtZVswXSAhPSAnLic6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJQYXRoIGFyZ3VtZW50IG11c3QgYmUgTm9uZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgYSBkb3R0ZWQgbW9kdWxlIG5hbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgcGtnID0gX2dldF9wYWNrYWdlKHBrZ19uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwa2cuX19wYXRoX18KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihwa2dfbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IGEgcGFja2FnZSIpCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiUmVsYXRpdmUgaW1wb3J0IHN5bnRheCBpcyBub3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCBieSBfZ2V0X2xvYWRlcigpIikKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIFRvcCBsZXZlbCBtb2R1bGUsIHNvIHN0aWNrIHdpdGggZGVmYXVsdCBwYXRoCi0gICAgICAgICAgICAgICAgICAgIHN1Yl9uYW1lID0gbW9kX25hbWUKLQotICAgICAgICAgICAgICAgIGZvciBpbXBvcnRlciBpbiBzeXMubWV0YV9wYXRoOgotICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShtb2RfbmFtZSwgcGF0aCkKLSAgICAgICAgICAgICAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3VuZCBhIG1ldGFob29rIHRvIGhhbmRsZSB0aGUgbW9kdWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICMgSGFuZGxpbmcgdmlhIHRoZSBzdGFuZGFyZCBwYXRoIG1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSBfZ2V0X3BhdGhfbG9hZGVyKG1vZF9uYW1lLCBwYXRoKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKLSAgICAgICAgcmV0dXJuIGxvYWRlcgotCi0KLSMgVGhpcyBoZWxwZXIgaXMgbmVlZGVkIGR1ZSB0byBhIG1pc3NpbmcgY29tcG9uZW50IGluIHRoZSBQRVAgMzAyCi0jIGxvYWRlciBwcm90b2NvbCAoc3BlY2lmaWNhbGx5LCAiZ2V0X2ZpbGVuYW1lIiBpcyBub24tc3RhbmRhcmQpCi1kZWYgX2dldF9maWxlbmFtZShsb2FkZXIsIG1vZF9uYW1lKToKLSAgICB0cnk6Ci0gICAgICAgIGdldF9maWxlbmFtZSA9IGxvYWRlci5nZXRfZmlsZW5hbWUKLSAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgIHJldHVybiBOb25lCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIGdldF9maWxlbmFtZShtb2RfbmFtZSkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRG9uZSB3aXRoIHRoZSBpbXBvcnQgbWFjaGluZXJ5IGVtdWxhdGlvbiwgb24gd2l0aCB0aGUgY29kZSEKIAogZGVmIF9ydW5fY29kZShjb2RlLCBydW5fZ2xvYmFscywgaW5pdF9nbG9iYWxzLAogICAgICAgICAgICAgICBtb2RfbmFtZSwgbW9kX2ZuYW1lLCBtb2RfbG9hZGVyKToKQEAgLTM3OSwyMSArNDUsMTcgQEAKICAgICAgICAgcmVzdG9yZV9tb2R1bGUgPSBtb2RfbmFtZSBpbiBzeXMubW9kdWxlcwogICAgICAgICBpZiByZXN0b3JlX21vZHVsZToKICAgICAgICAgICAgIHNhdmVkX21vZHVsZSA9IHN5cy5tb2R1bGVzW21vZF9uYW1lXQotICAgICAgICBpbXAuYWNxdWlyZV9sb2NrKCkKKyAgICAgICAgc3lzLmFyZ3ZbMF0gPSBtb2RfZm5hbWUKKyAgICAgICAgc3lzLm1vZHVsZXNbbW9kX25hbWVdID0gdGVtcF9tb2R1bGUKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc3lzLmFyZ3ZbMF0gPSBtb2RfZm5hbWUKLSAgICAgICAgICAgIHN5cy5tb2R1bGVzW21vZF9uYW1lXSA9IHRlbXBfbW9kdWxlCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgX3J1bl9jb2RlKGNvZGUsIG1vZF9nbG9iYWxzLCBpbml0X2dsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1vZF9uYW1lLCBtb2RfZm5hbWUsIG1vZF9sb2FkZXIpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gc2F2ZWRfYXJndjAKLSAgICAgICAgICAgICAgICBpZiByZXN0b3JlX21vZHVsZToKLSAgICAgICAgICAgICAgICAgICAgc3lzLm1vZHVsZXNbbW9kX25hbWVdID0gc2F2ZWRfbW9kdWxlCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZF9uYW1lXQorICAgICAgICAgICAgX3J1bl9jb2RlKGNvZGUsIG1vZF9nbG9iYWxzLCBpbml0X2dsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgbW9kX25hbWUsIG1vZF9mbmFtZSwgbW9kX2xvYWRlcikKICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGltcC5yZWxlYXNlX2xvY2soKQorICAgICAgICAgICAgc3lzLmFyZ3ZbMF0gPSBzYXZlZF9hcmd2MAorICAgICAgICBpZiByZXN0b3JlX21vZHVsZToKKyAgICAgICAgICAgIHN5cy5tb2R1bGVzW21vZF9uYW1lXSA9IHNhdmVkX21vZHVsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZF9uYW1lXQogICAgICAgICAjIENvcHkgdGhlIGdsb2JhbHMgb2YgdGhlIHRlbXBvcmFyeSBtb2R1bGUsIGFzIHRoZXkKICAgICAgICAgIyBtYXkgYmUgY2xlYXJlZCB3aGVuIHRoZSB0ZW1wb3JhcnkgbW9kdWxlIGdvZXMgYXdheQogICAgICAgICByZXR1cm4gbW9kX2dsb2JhbHMuY29weSgpCkBAIC00MDMsMTMgKzY1LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kX25hbWUsIG1vZF9mbmFtZSwgbW9kX2xvYWRlcikKIAogCisjIFRoaXMgaGVscGVyIGlzIG5lZWRlZCBkdWUgdG8gYSBtaXNzaW5nIGNvbXBvbmVudCBpbiB0aGUgUEVQIDMwMgorIyBsb2FkZXIgcHJvdG9jb2wgKHNwZWNpZmljYWxseSwgImdldF9maWxlbmFtZSIgaXMgbm9uLXN0YW5kYXJkKQorZGVmIF9nZXRfZmlsZW5hbWUobG9hZGVyLCBtb2RfbmFtZSk6CisgICAgdHJ5OgorICAgICAgICBnZXRfZmlsZW5hbWUgPSBsb2FkZXIuZ2V0X2ZpbGVuYW1lCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBnZXRfZmlsZW5hbWUobW9kX25hbWUpCisKKwogZGVmIHJ1bl9tb2R1bGUobW9kX25hbWUsIGluaXRfZ2xvYmFscz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9uYW1lPU5vbmUsIGFsdGVyX3N5cz1GYWxzZSk6CiAgICAgIiIiRXhlY3V0ZSBhIG1vZHVsZSdzIGNvZGUgd2l0aG91dCBpbXBvcnRpbmcgaXQKIAogICAgICAgIFJldHVybnMgdGhlIHJlc3VsdGluZyB0b3AgbGV2ZWwgbmFtZXNwYWNlIGRpY3Rpb25hcnkKICAgICAiIiIKLSAgICBsb2FkZXIgPSBfZ2V0X2xvYWRlcihtb2RfbmFtZSkKKyAgICBsb2FkZXIgPSBnZXRfbG9hZGVyKG1vZF9uYW1lKQogICAgIGlmIGxvYWRlciBpcyBOb25lOgogICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiTm8gbW9kdWxlIG5hbWVkICIgKyBtb2RfbmFtZSkKICAgICBjb2RlID0gbG9hZGVyLmdldF9jb2RlKG1vZF9uYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vUEtHLUlORk8gYi9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9QS0ctSU5GTwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjVjMWExCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vUEtHLUlORk8KQEAgLTAsMCArMSw4OSBAQAorTWV0YWRhdGEtVmVyc2lvbjogMS4wCitOYW1lOiBzZXR1cHRvb2xzCitWZXJzaW9uOiAwLjdhMWRldi1yNDU1MzYKK1N1bW1hcnk6IERvd25sb2FkLCBidWlsZCwgaW5zdGFsbCwgdXBncmFkZSwgYW5kIHVuaW5zdGFsbCBQeXRob24gcGFja2FnZXMgLS0gZWFzaWx5IQorSG9tZS1wYWdlOiBodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9EZXZDZW50ZXIvc2V0dXB0b29scworQXV0aG9yOiBQaGlsbGlwIEouIEVieQorQXV0aG9yLWVtYWlsOiBwZWFrQGVieS1zYXJuYS5jb20KK0xpY2Vuc2U6IFBTRiBvciBaUEwKK0Rlc2NyaXB0aW9uOiBgYHNldHVwdG9vbHNgYCBpcyBhIGNvbGxlY3Rpb24gb2YgZW5oYW5jZW1lbnRzIHRvIHRoZSBQeXRob24gYGBkaXN0dXRpbHNgYAorICAgICAgICAoZm9yIFB5dGhvbiAyLjMuNSBhbmQgdXAgb24gbW9zdCBwbGF0Zm9ybXM7IDY0LWJpdCBwbGF0Zm9ybXMgcmVxdWlyZSBhIG1pbmltdW0KKyAgICAgICAgb2YgUHl0aG9uIDIuNCkgdGhhdCBhbGxvdyB5b3UgdG8gbW9yZSBlYXNpbHkgYnVpbGQgYW5kIGRpc3RyaWJ1dGUgUHl0aG9uCisgICAgICAgIHBhY2thZ2VzLCBlc3BlY2lhbGx5IG9uZXMgdGhhdCBoYXZlIGRlcGVuZGVuY2llcyBvbiBvdGhlciBwYWNrYWdlcy4KKyAgICAgICAgCisgICAgICAgIFBhY2thZ2VzIGJ1aWx0IGFuZCBkaXN0cmlidXRlZCB1c2luZyBgYHNldHVwdG9vbHNgYCBsb29rIHRvIHRoZSB1c2VyIGxpa2UKKyAgICAgICAgb3JkaW5hcnkgUHl0aG9uIHBhY2thZ2VzIGJhc2VkIG9uIHRoZSBgYGRpc3R1dGlsc2BgLiAgWW91ciB1c2VycyBkb24ndCBuZWVkIHRvCisgICAgICAgIGluc3RhbGwgb3IgZXZlbiBrbm93IGFib3V0IHNldHVwdG9vbHMgaW4gb3JkZXIgdG8gdXNlIHRoZW0sIGFuZCB5b3UgZG9uJ3QKKyAgICAgICAgaGF2ZSB0byBpbmNsdWRlIHRoZSBlbnRpcmUgc2V0dXB0b29scyBwYWNrYWdlIGluIHlvdXIgZGlzdHJpYnV0aW9ucy4gIEJ5CisgICAgICAgIGluY2x1ZGluZyBqdXN0IGEgc2luZ2xlIGBib290c3RyYXAgbW9kdWxlYF8gKGFuIDhLIC5weSBmaWxlKSwgeW91ciBwYWNrYWdlIHdpbGwKKyAgICAgICAgYXV0b21hdGljYWxseSBkb3dubG9hZCBhbmQgaW5zdGFsbCBgYHNldHVwdG9vbHNgYCBpZiB0aGUgdXNlciBpcyBidWlsZGluZyB5b3VyCisgICAgICAgIHBhY2thZ2UgZnJvbSBzb3VyY2UgYW5kIGRvZXNuJ3QgaGF2ZSBhIHN1aXRhYmxlIHZlcnNpb24gYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgICAgIAorICAgICAgICAuLiBfYm9vdHN0cmFwIG1vZHVsZTogaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vZGlzdC9lel9zZXR1cC5weQorICAgICAgICAKKyAgICAgICAgRmVhdHVyZSBIaWdobGlnaHRzOgorICAgICAgICAKKyAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGZpbmQvZG93bmxvYWQvaW5zdGFsbC91cGdyYWRlIGRlcGVuZGVuY2llcyBhdCBidWlsZCB0aW1lIHVzaW5nCisgICAgICAgIHRoZSBgRWFzeUluc3RhbGwgdG9vbCA8aHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRGV2Q2VudGVyL0Vhc3lJbnN0YWxsPmBfLAorICAgICAgICB3aGljaCBzdXBwb3J0cyBkb3dubG9hZGluZyB2aWEgSFRUUCwgRlRQLCBTdWJ2ZXJzaW9uLCBhbmQgU291cmNlRm9yZ2UsIGFuZAorICAgICAgICBhdXRvbWF0aWNhbGx5IHNjYW5zIHdlYiBwYWdlcyBsaW5rZWQgZnJvbSBQeVBJIHRvIGZpbmQgZG93bmxvYWQgbGlua3MuICAoSXQncworICAgICAgICB0aGUgY2xvc2VzdCB0aGluZyB0byBDUEFOIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIFB5dGhvbi4pCisgICAgICAgIAorICAgICAgICAqIENyZWF0ZSBgUHl0aG9uIEVnZ3MgPGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0RldkNlbnRlci9QeXRob25FZ2dzPmBfIC0KKyAgICAgICAgYSBzaW5nbGUtZmlsZSBpbXBvcnRhYmxlIGRpc3RyaWJ1dGlvbiBmb3JtYXQKKyAgICAgICAgCisgICAgICAgICogSW5jbHVkZSBkYXRhIGZpbGVzIGluc2lkZSB5b3VyIHBhY2thZ2UgZGlyZWN0b3JpZXMsIHdoZXJlIHlvdXIgY29kZSBjYW4KKyAgICAgICAgYWN0dWFsbHkgdXNlIHRoZW0uICAoUHl0aG9uIDIuNCBkaXN0dXRpbHMgYWxzbyBzdXBwb3J0cyB0aGlzIGZlYXR1cmUsIGJ1dAorICAgICAgICBzZXR1cHRvb2xzIHByb3ZpZGVzIHRoZSBmZWF0dXJlIGZvciBQeXRob24gMi4zIHBhY2thZ2VzIGFsc28sIGFuZCBzdXBwb3J0cworICAgICAgICBhY2Nlc3NpbmcgZGF0YSBmaWxlcyBpbiB6aXBwZWQgcGFja2FnZXMgdG9vLikKKyAgICAgICAgCisgICAgICAgICogQXV0b21hdGljYWxseSBpbmNsdWRlIGFsbCBwYWNrYWdlcyBpbiB5b3VyIHNvdXJjZSB0cmVlLCB3aXRob3V0IGxpc3RpbmcgdGhlbQorICAgICAgICBpbmRpdmlkdWFsbHkgaW4gc2V0dXAucHkKKyAgICAgICAgCisgICAgICAgICogQXV0b21hdGljYWxseSBpbmNsdWRlIGFsbCByZWxldmFudCBmaWxlcyBpbiB5b3VyIHNvdXJjZSBkaXN0cmlidXRpb25zLAorICAgICAgICB3aXRob3V0IG5lZWRpbmcgdG8gY3JlYXRlIGEgYGBNQU5JRkVTVC5pbmBgIGZpbGUsIGFuZCB3aXRob3V0IGhhdmluZyB0byBmb3JjZQorICAgICAgICByZWdlbmVyYXRpb24gb2YgdGhlIGBgTUFOSUZFU1RgYCBmaWxlIHdoZW4geW91ciBzb3VyY2UgdHJlZSBjaGFuZ2VzLgorICAgICAgICAKKyAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHdyYXBwZXIgc2NyaXB0cyBvciBXaW5kb3dzIChjb25zb2xlIGFuZCBHVUkpIC5leGUKKyAgICAgICAgZmlsZXMgZm9yIGFueSBudW1iZXIgb2YgIm1haW4iIGZ1bmN0aW9ucyBpbiB5b3VyIHByb2plY3QuICAoTm90ZTogdGhpcyBpcyBub3QKKyAgICAgICAgYSBweTJleGUgcmVwbGFjZW1lbnQ7IHRoZSAuZXhlIGZpbGVzIHJlbHkgb24gdGhlIGxvY2FsIFB5dGhvbiBpbnN0YWxsYXRpb24uKQorICAgICAgICAKKyAgICAgICAgKiBUcmFuc3BhcmVudCBQeXJleCBzdXBwb3J0LCBzbyB0aGF0IHlvdXIgc2V0dXAucHkgY2FuIGxpc3QgYGAucHl4YGAgZmlsZXMgYW5kCisgICAgICAgIHN0aWxsIHdvcmsgZXZlbiB3aGVuIHRoZSBlbmQtdXNlciBkb2Vzbid0IGhhdmUgUHlyZXggaW5zdGFsbGVkIChhcyBsb25nIGFzCisgICAgICAgIHlvdSBpbmNsdWRlIHRoZSBQeXJleC1nZW5lcmF0ZWQgQyBpbiB5b3VyIHNvdXJjZSBkaXN0cmlidXRpb24pCisgICAgICAgIAorICAgICAgICAqIENvbW1hbmQgYWxpYXNlcyAtIGNyZWF0ZSBwcm9qZWN0LXNwZWNpZmljLCBwZXItdXNlciwgb3Igc2l0ZS13aWRlIHNob3J0Y3V0CisgICAgICAgIG5hbWVzIGZvciBjb21tb25seSB1c2VkIGNvbW1hbmRzIGFuZCBvcHRpb25zCisgICAgICAgIAorICAgICAgICAqIFB5UEkgdXBsb2FkIHN1cHBvcnQgLSB1cGxvYWQgeW91ciBzb3VyY2UgZGlzdHJpYnV0aW9ucyBhbmQgZWdncyB0byBQeVBJCisgICAgICAgIAorICAgICAgICAqIERlcGxveSB5b3VyIHByb2plY3QgaW4gImRldmVsb3BtZW50IG1vZGUiLCBzdWNoIHRoYXQgaXQncyBhdmFpbGFibGUgb24KKyAgICAgICAgYGBzeXMucGF0aGBgLCB5ZXQgY2FuIHN0aWxsIGJlIGVkaXRlZCBkaXJlY3RseSBmcm9tIGl0cyBzb3VyY2UgY2hlY2tvdXQuCisgICAgICAgIAorICAgICAgICAqIEVhc2lseSBleHRlbmQgdGhlIGRpc3R1dGlscyB3aXRoIG5ldyBjb21tYW5kcyBvciBgYHNldHVwKClgYCBhcmd1bWVudHMsIGFuZAorICAgICAgICBkaXN0cmlidXRlL3JldXNlIHlvdXIgZXh0ZW5zaW9ucyBmb3IgbXVsdGlwbGUgcHJvamVjdHMsIHdpdGhvdXQgY29weWluZyBjb2RlLgorICAgICAgICAKKyAgICAgICAgKiBDcmVhdGUgZXh0ZW5zaWJsZSBhcHBsaWNhdGlvbnMgYW5kIGZyYW1ld29ya3MgdGhhdCBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyCisgICAgICAgIGV4dGVuc2lvbnMsIHVzaW5nIHNpbXBsZSAiZW50cnkgcG9pbnRzIiBkZWNsYXJlZCBpbiBhIHByb2plY3QncyBzZXR1cCBzY3JpcHQuCisgICAgICAgIAorICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgUHlQSSBkb3dubG9hZHMsIHRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIGBgc2V0dXB0b29sc2BgCisgICAgICAgIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBgUHl0aG9uIFNWTiBzYW5kYm94YF8sIGFuZCBpbi1kZXZlbG9wbWVudCB2ZXJzaW9ucyBvZiB0aGUKKyAgICAgICAgYDAuNiBicmFuY2hgXyBhcmUgYXZhaWxhYmxlIGFzIHdlbGwuCisgICAgICAgIAorICAgICAgICAuLiBfMC42IGJyYW5jaDogaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL3NhbmRib3gvYnJhbmNoZXMvc2V0dXB0b29scy0wLjYvI2VnZz1zZXR1cHRvb2xzLWRldjA2CisgICAgICAgIAorICAgICAgICAuLiBfUHl0aG9uIFNWTiBzYW5kYm94OiBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvc2FuZGJveC90cnVuay9zZXR1cHRvb2xzLyNlZ2c9c2V0dXB0b29scy1kZXYKKyAgICAgICAgCisgICAgICAgIAorS2V5d29yZHM6IENQQU4gUHlQSSBkaXN0dXRpbHMgZWdncyBwYWNrYWdlIG1hbmFnZW1lbnQKK1BsYXRmb3JtOiBVTktOT1dOCitDbGFzc2lmaWVyOiBEZXZlbG9wbWVudCBTdGF0dXMgOjogMyAtIEFscGhhCitDbGFzc2lmaWVyOiBJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzCitDbGFzc2lmaWVyOiBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiBMaWNlbnNlCitDbGFzc2lmaWVyOiBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBab3BlIFB1YmxpYyBMaWNlbnNlCitDbGFzc2lmaWVyOiBPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50CitDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24KK0NsYXNzaWZpZXI6IFRvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcyA6OiBQeXRob24gTW9kdWxlcworQ2xhc3NpZmllcjogVG9waWMgOjogU3lzdGVtIDo6IEFyY2hpdmluZyA6OiBQYWNrYWdpbmcKK0NsYXNzaWZpZXI6IFRvcGljIDo6IFN5c3RlbSA6OiBTeXN0ZW1zIEFkbWluaXN0cmF0aW9uCitDbGFzc2lmaWVyOiBUb3BpYyA6OiBVdGlsaXRpZXMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL2VudHJ5X3BvaW50cy50eHQgYi9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9lbnRyeV9wb2ludHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhZmUyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9lbnRyeV9wb2ludHMudHh0CkBAIC0wLDAgKzEsNTEgQEAKK1tkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHNdCitkZXBlbmRlbmN5X2xpbmtzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAorZW50cnlfcG9pbnRzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2VudHJ5X3BvaW50cworZXh0cmFzX3JlcXVpcmUgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZXh0cmFzCitwYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhCitpbnN0YWxsX3JlcXVpcmVzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cworaW5jbHVkZV9wYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKK2V4Y2x1ZGVfcGFja2FnZV9kYXRhID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YQorbmFtZXNwYWNlX3BhY2thZ2VzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX25zcAordGVzdF9zdWl0ZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja190ZXN0X3N1aXRlCitlYWdlcl9yZXNvdXJjZXMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0Cit6aXBfc2FmZSA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbAordGVzdF9sb2FkZXIgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZQordGVzdHNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKKworW3NldHVwdG9vbHMuZmlsZV9maW5kZXJzXQorc3ZuX2N2cyA9IHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdDpfZGVmYXVsdF9yZXZjdHJsCisKK1tlZ2dfaW5mby53cml0ZXJzXQorZGVwZW5kZW5jeV9saW5rcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZworcmVxdWlyZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3JlcXVpcmVtZW50cworUEtHLUlORk8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcGtnX2luZm8KK2VhZ2VyX3Jlc291cmNlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZwordG9wX2xldmVsLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV90b3BsZXZlbF9uYW1lcworbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCitlbnRyeV9wb2ludHMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX2VudHJpZXMKK2RlcGVuZHMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndhcm5fZGVwZW5kc19vYnNvbGV0ZQorCitbY29uc29sZV9zY3JpcHRzXQorZWFzeV9pbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluCitlYXN5X2luc3RhbGwtMi41ID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluCisKK1tkaXN0dXRpbHMuY29tbWFuZHNdCitiZGlzdF9ycG0gPSBzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfcnBtOmJkaXN0X3JwbQorcm90YXRlID0gc2V0dXB0b29scy5jb21tYW5kLnJvdGF0ZTpyb3RhdGUKK2RldmVsb3AgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZGV2ZWxvcDpkZXZlbG9wCitzZXRvcHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0OnNldG9wdAorYnVpbGRfcHkgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfcHk6YnVpbGRfcHkKK3NhdmVvcHRzID0gc2V0dXB0b29scy5jb21tYW5kLnNhdmVvcHRzOnNhdmVvcHRzCitlZ2dfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzplZ2dfaW5mbworaW5zdGFsbF9lZ2dfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2VnZ19pbmZvOmluc3RhbGxfZWdnX2luZm8KK2FsaWFzID0gc2V0dXB0b29scy5jb21tYW5kLmFsaWFzOmFsaWFzCitlYXN5X2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOmVhc3lfaW5zdGFsbAoraW5zdGFsbF9zY3JpcHRzID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfc2NyaXB0czppbnN0YWxsX3NjcmlwdHMKK2JkaXN0X2VnZyA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9lZ2c6YmRpc3RfZWdnCitpbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGw6aW5zdGFsbAordGVzdCA9IHNldHVwdG9vbHMuY29tbWFuZC50ZXN0OnRlc3QKK2luc3RhbGxfbGliID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfbGliOmluc3RhbGxfbGliCitidWlsZF9leHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfZXh0OmJ1aWxkX2V4dAorc2Rpc3QgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3Q6c2Rpc3QKKwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vdG9wX2xldmVsLnR4dCBiL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL3RvcF9sZXZlbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3N2M2YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL3RvcF9sZXZlbC50eHQKQEAgLTAsMCArMSwzIEBACitlYXN5X2luc3RhbGwKK3BrZ19yZXNvdXJjZXMKK3NldHVwdG9vbHMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL3ppcC1zYWZlIGIvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vemlwLXNhZmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL3ppcC1zYWZlCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9fX2luaXRfXy5weSBiL0xpYi9zZXR1cHRvb2xzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjFjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDY0IEBACisiIiJFeHRlbnNpb25zIHRvIHRoZSAnZGlzdHV0aWxzJyBmb3IgbGFyZ2Ugb3IgY29tcGxleCBkaXN0cmlidXRpb25zIiIiCitmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBFeHRlbnNpb24sIExpYnJhcnkKK2Zyb20gc2V0dXB0b29scy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24sIEZlYXR1cmUsIF9nZXRfdW5wYXRjaGVkCitpbXBvcnQgZGlzdHV0aWxzLmNvcmUsIHNldHVwdG9vbHMuY29tbWFuZAorZnJvbSBzZXR1cHRvb2xzLmRlcGVuZHMgaW1wb3J0IFJlcXVpcmUKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQgYXMgX0NvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAoraW1wb3J0IG9zLnBhdGgKKworX192ZXJzaW9uX18gPSAnMC43YTEnCitfX2FsbF9fID0gWworICAgICdzZXR1cCcsICdEaXN0cmlidXRpb24nLCAnRmVhdHVyZScsICdDb21tYW5kJywgJ0V4dGVuc2lvbicsICdSZXF1aXJlJywKKyAgICAnZmluZF9wYWNrYWdlcycKK10KKworYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKKworZGVmIGZpbmRfcGFja2FnZXMod2hlcmU9Jy4nLCBleGNsdWRlPSgpKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IGFsbCBQeXRob24gcGFja2FnZXMgZm91bmQgd2l0aGluIGRpcmVjdG9yeSAnd2hlcmUnCisKKyAgICAnd2hlcmUnIHNob3VsZCBiZSBzdXBwbGllZCBhcyBhICJjcm9zcy1wbGF0Zm9ybSIgKGkuZS4gVVJMLXN0eWxlKSBwYXRoOyBpdAorICAgIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBsb2NhbCBwYXRoIHN5bnRheC4gICdleGNsdWRlJyBpcyBhCisgICAgc2VxdWVuY2Ugb2YgcGFja2FnZSBuYW1lcyB0byBleGNsdWRlOyAnKicgY2FuIGJlIHVzZWQgYXMgYSB3aWxkY2FyZCBpbiB0aGUKKyAgICBuYW1lcywgc3VjaCB0aGF0ICdmb28uKicgd2lsbCBleGNsdWRlIGFsbCBzdWJwYWNrYWdlcyBvZiAnZm9vJyAoYnV0IG5vdAorICAgICdmb28nIGl0c2VsZikuCisgICAgIiIiCisgICAgb3V0ID0gW10KKyAgICBzdGFjaz1bKGNvbnZlcnRfcGF0aCh3aGVyZSksICcnKV0KKyAgICB3aGlsZSBzdGFjazoKKyAgICAgICAgd2hlcmUscHJlZml4ID0gc3RhY2sucG9wKDApCisgICAgICAgIGZvciBuYW1lIGluIG9zLmxpc3RkaXIod2hlcmUpOgorICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4od2hlcmUsbmFtZSkKKyAgICAgICAgICAgIGlmIChvcy5wYXRoLmlzZGlyKGZuKSBhbmQKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oZm4sJ19faW5pdF9fLnB5JykpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocHJlZml4K25hbWUpOyBzdGFjay5hcHBlbmQoKGZuLHByZWZpeCtuYW1lKycuJykpCisgICAgZm9yIHBhdCBpbiBleGNsdWRlOgorICAgICAgICBmcm9tIGZubWF0Y2ggaW1wb3J0IGZubWF0Y2hjYXNlCisgICAgICAgIG91dCA9IFtpdGVtIGZvciBpdGVtIGluIG91dCBpZiBub3QgZm5tYXRjaGNhc2UoaXRlbSxwYXQpXQorICAgIHJldHVybiBvdXQKKworc2V0dXAgPSBkaXN0dXRpbHMuY29yZS5zZXR1cAorCitfQ29tbWFuZCA9IF9nZXRfdW5wYXRjaGVkKF9Db21tYW5kKQorCitjbGFzcyBDb21tYW5kKF9Db21tYW5kKToKKyAgICBfX2RvY19fID0gX0NvbW1hbmQuX19kb2NfXworCisgICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3QsICoqa3cpOgorICAgICAgICAjIEFkZCBzdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cworICAgICAgICBfQ29tbWFuZC5fX2luaXRfXyhzZWxmLGRpc3QpCisgICAgICAgIGZvciBrLHYgaW4ga3cuaXRlbXMoKToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZixrLHYpCisKKyAgICBkZWYgcmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzPTAsICoqa3cpOgorICAgICAgICBjbWQgPSBfQ29tbWFuZC5yZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHMpCisgICAgICAgIGZvciBrLHYgaW4ga3cuaXRlbXMoKToKKyAgICAgICAgICAgIHNldGF0dHIoY21kLGssdikgICAgIyB1cGRhdGUgY29tbWFuZCB3aXRoIGtleXdvcmRzCisgICAgICAgIHJldHVybiBjbWQKKworaW1wb3J0IGRpc3R1dGlscy5jb3JlCitkaXN0dXRpbHMuY29yZS5Db21tYW5kID0gQ29tbWFuZCAgICAjIHdlIGNhbid0IHBhdGNoIGRpc3R1dGlscy5jbWQsIGFsYXMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weSBiL0xpYi9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZDljNjg0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5CkBAIC0wLDAgKzEsMjAwIEBACisiIiJVdGlsaXRpZXMgZm9yIGV4dHJhY3RpbmcgY29tbW9uIGFyY2hpdmUgZm9ybWF0cyIiIgorCisKK19fYWxsX18gPSBbCisgICAgInVucGFja19hcmNoaXZlIiwgInVucGFja196aXBmaWxlIiwgInVucGFja190YXJmaWxlIiwgImRlZmF1bHRfZmlsdGVyIiwKKyAgICAiVW5yZWNvZ25pemVkRm9ybWF0IiwgImV4dHJhY3Rpb25fZHJpdmVycyIsICJ1bnBhY2tfZGlyZWN0b3J5IiwKK10KKworaW1wb3J0IHppcGZpbGUsIHRhcmZpbGUsIG9zLCBzaHV0aWwKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZW5zdXJlX2RpcmVjdG9yeQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgorCitjbGFzcyBVbnJlY29nbml6ZWRGb3JtYXQoRGlzdHV0aWxzRXJyb3IpOgorICAgICIiIkNvdWxkbid0IHJlY29nbml6ZSB0aGUgYXJjaGl2ZSB0eXBlIiIiCisKK2RlZiBkZWZhdWx0X2ZpbHRlcihzcmMsZHN0KToKKyAgICAiIiJUaGUgZGVmYXVsdCBwcm9ncmVzcy9maWx0ZXIgY2FsbGJhY2s7IHJldHVybnMgVHJ1ZSBmb3IgYWxsIGZpbGVzIiIiCisgICAgcmV0dXJuIGRzdAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2RlZiB1bnBhY2tfYXJjaGl2ZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlciwKKyAgICBkcml2ZXJzPU5vbmUKKyk6CisgICAgIiIiVW5wYWNrIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYCwgb3IgcmFpc2UgYGBVbnJlY29nbml6ZWRGb3JtYXRgYAorCisgICAgYHByb2dyZXNzX2ZpbHRlcmAgaXMgYSBmdW5jdGlvbiB0YWtpbmcgdHdvIGFyZ3VtZW50czogYSBzb3VyY2UgcGF0aAorICAgIGludGVybmFsIHRvIHRoZSBhcmNoaXZlICgnLyctc2VwYXJhdGVkKSwgYW5kIGEgZmlsZXN5c3RlbSBwYXRoIHdoZXJlIGl0CisgICAgd2lsbCBiZSBleHRyYWN0ZWQuICBUaGUgY2FsbGJhY2sgbXVzdCByZXR1cm4gdGhlIGRlc2lyZWQgZXh0cmFjdCBwYXRoCisgICAgKHdoaWNoIG1heSBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBpbiksIG9yIGVsc2UgYGBOb25lYGAgdG8gc2tpcAorICAgIHRoYXQgZmlsZSBvciBkaXJlY3RvcnkuICBUaGUgY2FsbGJhY2sgY2FuIHRodXMgYmUgdXNlZCB0byByZXBvcnQgb24gdGhlCisgICAgcHJvZ3Jlc3Mgb2YgdGhlIGV4dHJhY3Rpb24sIGFzIHdlbGwgYXMgdG8gZmlsdGVyIHRoZSBpdGVtcyBleHRyYWN0ZWQgb3IKKyAgICBhbHRlciB0aGVpciBleHRyYWN0aW9uIHBhdGhzLgorCisgICAgYGRyaXZlcnNgLCBpZiBzdXBwbGllZCwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBmdW5jdGlvbnMgd2l0aCB0aGUKKyAgICBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIGZ1bmN0aW9uIChtaW51cyB0aGUgYGRyaXZlcnNgIGFyZ3VtZW50KSwgdGhhdCByYWlzZQorICAgIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgdGhleSBkbyBub3Qgc3VwcG9ydCBleHRyYWN0aW5nIHRoZSBkZXNpZ25hdGVkCisgICAgYXJjaGl2ZSB0eXBlLiAgVGhlIGBkcml2ZXJzYCBhcmUgdHJpZWQgaW4gc2VxdWVuY2UgdW50aWwgb25lIGlzIGZvdW5kIHRoYXQKKyAgICBkb2VzIG5vdCByYWlzZSBhbiBlcnJvciwgb3IgdW50aWwgYWxsIGFyZSBleGhhdXN0ZWQgKGluIHdoaWNoIGNhc2UKKyAgICBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlzIHJhaXNlZCkuICBJZiB5b3UgZG8gbm90IHN1cHBseSBhIHNlcXVlbmNlIG9mCisgICAgZHJpdmVycywgdGhlIG1vZHVsZSdzIGBgZXh0cmFjdGlvbl9kcml2ZXJzYGAgY29uc3RhbnQgd2lsbCBiZSB1c2VkLCB3aGljaAorICAgIG1lYW5zIHRoYXQgYGB1bnBhY2tfemlwZmlsZWBgIGFuZCBgYHVucGFja190YXJmaWxlYGAgd2lsbCBiZSB0cmllZCwgaW4gdGhhdAorICAgIG9yZGVyLgorICAgICIiIgorICAgIGZvciBkcml2ZXIgaW4gZHJpdmVycyBvciBleHRyYWN0aW9uX2RyaXZlcnM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRyaXZlcihmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcikKKyAgICAgICAgZXhjZXB0IFVucmVjb2duaXplZEZvcm1hdDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICBlbHNlOgorICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoCisgICAgICAgICAgICAiTm90IGEgcmVjb2duaXplZCBhcmNoaXZlIHR5cGU6ICVzIiAlIGZpbGVuYW1lCisgICAgICAgICkKKworCisKKworCisKKworZGVmIHVucGFja19kaXJlY3RvcnkoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgorICAgICIiIiJVbnBhY2siIGEgZGlyZWN0b3J5LCB1c2luZyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgZm9yIGFyY2hpdmVzCisKKyAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIGRpcmVjdG9yeQorICAgICIiIgorICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKKyAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KCIlcyBpcyBub3QgYSBkaXJlY3RvcnkiICUgKGZpbGVuYW1lLCkpCisKKyAgICBwYXRocyA9IHtmaWxlbmFtZTooJycsZXh0cmFjdF9kaXIpfQorICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGZpbGVuYW1lKToKKyAgICAgICAgc3JjLGRzdCA9IHBhdGhzW2Jhc2VdCisgICAgICAgIGZvciBkIGluIGRpcnM6CisgICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSxkKV0gPSBzcmMrZCsnLycsIG9zLnBhdGguam9pbihkc3QsZCkKKyAgICAgICAgZm9yIGYgaW4gZmlsZXM6CisgICAgICAgICAgICBuYW1lID0gc3JjK2YKKyAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihkc3QsZikKKyAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihzcmMrZiwgdGFyZ2V0KQorICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIHNraXAgbm9uLWZpbGVzCisgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKKyAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oYmFzZSxmKQorICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKGYsIHRhcmdldCkKKyAgICAgICAgICAgIHNodXRpbC5jb3B5c3RhdChmLCB0YXJnZXQpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitkZWYgdW5wYWNrX3ppcGZpbGUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgorICAgICIiIlVucGFjayB6aXAgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCisKKyAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIHppcGZpbGUgKGFzIGRldGVybWluZWQKKyAgICBieSBgYHppcGZpbGUuaXNfemlwZmlsZSgpYGApLiAgU2VlIGBgdW5wYWNrX2FyY2hpdmUoKWBgIGZvciBhbiBleHBsYW5hdGlvbgorICAgIG9mIHRoZSBgcHJvZ3Jlc3NfZmlsdGVyYCBhcmd1bWVudC4KKyAgICAiIiIKKworICAgIGlmIG5vdCB6aXBmaWxlLmlzX3ppcGZpbGUoZmlsZW5hbWUpOgorICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoIiVzIGlzIG5vdCBhIHppcCBmaWxlIiAlIChmaWxlbmFtZSwpKQorCisgICAgeiA9IHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSkKKyAgICB0cnk6CisgICAgICAgIGZvciBpbmZvIGluIHouaW5mb2xpc3QoKToKKyAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCisKKyAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQorICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCcvJykgb3IgJy4uJyBpbiBuYW1lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKKyAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihuYW1lLCB0YXJnZXQpCisgICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcvJyk6CisgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBmaWxlCisgICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCisgICAgICAgICAgICAgICAgZGF0YSA9IHoucmVhZChpbmZvLmZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwnd2InKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBkZWwgZGF0YQorICAgIGZpbmFsbHk6CisgICAgICAgIHouY2xvc2UoKQorCisKK2RlZiB1bnBhY2tfdGFyZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CisgICAgIiIiVW5wYWNrIHRhci90YXIuZ3ovdGFyLmJ6MiBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKKworICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgdGFyZmlsZSAoYXMgZGV0ZXJtaW5lZAorICAgIGJ5IGBgdGFyZmlsZS5vcGVuKClgYCkuICBTZWUgYGB1bnBhY2tfYXJjaGl2ZSgpYGAgZm9yIGFuIGV4cGxhbmF0aW9uCisgICAgb2YgdGhlIGBwcm9ncmVzc19maWx0ZXJgIGFyZ3VtZW50LgorICAgICIiIgorCisgICAgdHJ5OgorICAgICAgICB0YXJvYmogPSB0YXJmaWxlLm9wZW4oZmlsZW5hbWUpCisgICAgZXhjZXB0IHRhcmZpbGUuVGFyRXJyb3I6CisgICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgKKyAgICAgICAgICAgICIlcyBpcyBub3QgYSBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCB0YXIgZmlsZSIgJSAoZmlsZW5hbWUsKQorICAgICAgICApCisKKyAgICB0cnk6CisgICAgICAgIHRhcm9iai5jaG93biA9IGxhbWJkYSAqYXJnczogTm9uZSAgICMgZG9uJ3QgZG8gYW55IGNob3duaW5nIQorICAgICAgICBmb3IgbWVtYmVyIGluIHRhcm9iajoKKyAgICAgICAgICAgIGlmIG1lbWJlci5pc2ZpbGUoKSBvciBtZW1iZXIuaXNkaXIoKToKKyAgICAgICAgICAgICAgICBuYW1lID0gbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAjIGRvbid0IGV4dHJhY3QgYWJzb2x1dGUgcGF0aHMgb3Igb25lcyB3aXRoIC4uIGluIHRoZW0KKyAgICAgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCcvJykgYW5kICcuLicgbm90IGluIG5hbWU6CisgICAgICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKKyAgICAgICAgICAgICAgICAgICAgZHN0ID0gcHJvZ3Jlc3NfZmlsdGVyKG5hbWUsIGRzdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZHN0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZHN0LmVuZHN3aXRoKG9zLnNlcCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ID0gZHN0WzotMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcm9iai5fZXh0cmFjdF9tZW1iZXIobWVtYmVyLGRzdCkgICMgWFhYIFVnaAorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGZpbmFsbHk6CisgICAgICAgIHRhcm9iai5jbG9zZSgpCisKKworCisKK2V4dHJhY3Rpb25fZHJpdmVycyA9IHVucGFja19kaXJlY3RvcnksIHVucGFja196aXBmaWxlLCB1bnBhY2tfdGFyZmlsZQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY2xpLmV4ZSBiL0xpYi9zZXR1cHRvb2xzL2NsaS5leGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmM4MzMzOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NsaS5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmNTNlNwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHkKQEAgLTAsMCArMSwxOSBAQAorX19hbGxfXyA9IFsKKyAgICAnYWxpYXMnLCAnYmRpc3RfZWdnJywgJ2JkaXN0X3JwbScsICdidWlsZF9leHQnLCAnYnVpbGRfcHknLCAnZGV2ZWxvcCcsCisgICAgJ2Vhc3lfaW5zdGFsbCcsICdlZ2dfaW5mbycsICdpbnN0YWxsJywgJ2luc3RhbGxfbGliJywgJ3JvdGF0ZScsICdzYXZlb3B0cycsCisgICAgJ3NkaXN0JywgJ3NldG9wdCcsICd0ZXN0JywgJ3VwbG9hZCcsICdpbnN0YWxsX2VnZ19pbmZvJywgJ2luc3RhbGxfc2NyaXB0cycsCitdCisKK2ltcG9ydCBzeXMKK2lmIHN5cy52ZXJzaW9uPj0nMi41JzoKKyAgICAjIEluIFB5dGhvbiAyLjUgYW5kIGFib3ZlLCBkaXN0dXRpbHMgaW5jbHVkZXMgaXRzIG93biB1cGxvYWQgY29tbWFuZAorICAgIF9fYWxsX18ucmVtb3ZlKCd1cGxvYWQnKQorCisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3QgaW1wb3J0IGJkaXN0CisKK2lmICdlZ2cnIG5vdCBpbiBiZGlzdC5mb3JtYXRfY29tbWFuZHM6CisgICAgYmRpc3QuZm9ybWF0X2NvbW1hbmRbJ2VnZyddID0gKCdiZGlzdF9lZ2cnLCAiUHl0aG9uIC5lZ2cgZmlsZSIpCisgICAgYmRpc3QuZm9ybWF0X2NvbW1hbmRzLmFwcGVuZCgnZWdnJykKKworZGVsIGJkaXN0LCBzeXMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkZjQ3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5CkBAIC0wLDAgKzEsNzkgQEAKK2ltcG9ydCBkaXN0dXRpbHMsIG9zCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCitmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnLCBvcHRpb25fYmFzZSwgY29uZmlnX2ZpbGUKKworZGVmIHNocXVvdGUoYXJnKToKKyAgICAiIiJRdW90ZSBhbiBhcmd1bWVudCBmb3IgbGF0ZXIgcGFyc2luZyBieSBzaGxleC5zcGxpdCgpIiIiCisgICAgZm9yIGMgaW4gJyInLCAiJyIsICJcXCIsICIjIjoKKyAgICAgICAgaWYgYyBpbiBhcmc6IHJldHVybiByZXByKGFyZykKKyAgICBpZiBhcmcuc3BsaXQoKTw+W2FyZ106CisgICAgICAgIHJldHVybiByZXByKGFyZykKKyAgICByZXR1cm4gYXJnCisKKworY2xhc3MgYWxpYXMob3B0aW9uX2Jhc2UpOgorICAgICIiIkRlZmluZSBhIHNob3J0Y3V0IHRoYXQgaW52b2tlcyBvbmUgb3IgbW9yZSBjb21tYW5kcyIiIgorCisgICAgZGVzY3JpcHRpb24gPSAiZGVmaW5lIGEgc2hvcnRjdXQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGNvbW1hbmRzIgorICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gVHJ1ZQorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ3JlbW92ZScsICAgJ3InLCAncmVtb3ZlICh1bnNldCkgdGhlIGFsaWFzJyksCisgICAgXSArIG9wdGlvbl9iYXNlLnVzZXJfb3B0aW9ucworCisgICAgYm9vbGVhbl9vcHRpb25zID0gb3B0aW9uX2Jhc2UuYm9vbGVhbl9vcHRpb25zICsgWydyZW1vdmUnXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgb3B0aW9uX2Jhc2UuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYuYXJncyA9IE5vbmUKKyAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBpZiBzZWxmLnJlbW92ZSBhbmQgbGVuKHNlbGYuYXJncyk8PjE6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgYWxpYXMgbmFtZSkgd2hlbiAiCisgICAgICAgICAgICAgICAgInVzaW5nIC0tcmVtb3ZlIgorICAgICAgICAgICAgKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgYWxpYXNlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCisKKyAgICAgICAgaWYgbm90IHNlbGYuYXJnczoKKyAgICAgICAgICAgIHByaW50ICJDb21tYW5kIEFsaWFzZXMiCisgICAgICAgICAgICBwcmludCAiLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgZm9yIGFsaWFzIGluIGFsaWFzZXM6CisgICAgICAgICAgICAgICAgcHJpbnQgInNldHVwLnB5IGFsaWFzIiwgZm9ybWF0X2FsaWFzKGFsaWFzLCBhbGlhc2VzKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZWxpZiBsZW4oc2VsZi5hcmdzKT09MToKKyAgICAgICAgICAgIGFsaWFzLCA9IHNlbGYuYXJncworICAgICAgICAgICAgaWYgc2VsZi5yZW1vdmU6CisgICAgICAgICAgICAgICAgY29tbWFuZCA9IE5vbmUKKyAgICAgICAgICAgIGVsaWYgYWxpYXMgaW4gYWxpYXNlczoKKyAgICAgICAgICAgICAgICBwcmludCAic2V0dXAucHkgYWxpYXMiLCBmb3JtYXRfYWxpYXMoYWxpYXMsIGFsaWFzZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICJObyBhbGlhcyBkZWZpbml0aW9uIGZvdW5kIGZvciAlciIgJSBhbGlhcworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWxpYXMgPSBzZWxmLmFyZ3NbMF0KKyAgICAgICAgICAgIGNvbW1hbmQgPSAnICcuam9pbihtYXAoc2hxdW90ZSxzZWxmLmFyZ3NbMTpdKSkKKworICAgICAgICBlZGl0X2NvbmZpZyhzZWxmLmZpbGVuYW1lLCB7J2FsaWFzZXMnOiB7YWxpYXM6Y29tbWFuZH19LCBzZWxmLmRyeV9ydW4pCisKKworZGVmIGZvcm1hdF9hbGlhcyhuYW1lLCBhbGlhc2VzKToKKyAgICBzb3VyY2UsIGNvbW1hbmQgPSBhbGlhc2VzW25hbWVdCisgICAgaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdnbG9iYWwnKToKKyAgICAgICAgc291cmNlID0gJy0tZ2xvYmFsLWNvbmZpZyAnCisgICAgZWxpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ3VzZXInKToKKyAgICAgICAgc291cmNlID0gJy0tdXNlci1jb25maWcgJworICAgIGVsaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdsb2NhbCcpOgorICAgICAgICBzb3VyY2UgPSAnJworICAgIGVsc2U6CisgICAgICAgIHNvdXJjZSA9ICctLWZpbGVuYW1lPSVyJyAlIHNvdXJjZQorICAgIHJldHVybiBzb3VyY2UrbmFtZSsnICcrY29tbWFuZApkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTdkODhkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHkKQEAgLTAsMCArMSw0NDkgQEAKKyIiInNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9lZ2cKKworQnVpbGQgLmVnZyBkaXN0cmlidXRpb25zIiIiCisKKyMgVGhpcyBtb2R1bGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMKK2ltcG9ydCBzeXMsIG9zLCBtYXJzaGFsCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCByZW1vdmVfdHJlZSwgbWtwYXRoCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fdmVyc2lvbiwgZ2V0X3B5dGhvbl9saWIKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZ2V0X2J1aWxkX3BsYXRmb3JtLCBEaXN0cmlidXRpb24KK2Zyb20gdHlwZXMgaW1wb3J0IENvZGVUeXBlCitmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBMaWJyYXJ5CisKK2RlZiB3cml0ZV9zdHViKHJlc291cmNlLCBweWZpbGUpOgorICAgIGYgPSBvcGVuKHB5ZmlsZSwndycpCisgICAgZi53cml0ZSgnXG4nLmpvaW4oWworICAgICAgICAiZGVmIF9fYm9vdHN0cmFwX18oKToiLAorICAgICAgICAiICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18sIF9fZmlsZV9fIiwKKyAgICAgICAgIiAgIGltcG9ydCBzeXMsIHBrZ19yZXNvdXJjZXMsIGltcCIsCisgICAgICAgICIgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sJXIpIgorICAgICAgICAgICAgJSByZXNvdXJjZSwKKyAgICAgICAgIiAgIGRlbCBfX2Jvb3RzdHJhcF9fLCBfX2xvYWRlcl9fIiwKKyAgICAgICAgIiAgIGltcC5sb2FkX2R5bmFtaWMoX19uYW1lX18sX19maWxlX18pIiwKKyAgICAgICAgIl9fYm9vdHN0cmFwX18oKSIsCisgICAgICAgICIiICMgdGVybWluYWwgXG4KKyAgICBdKSkKKyAgICBmLmNsb3NlKCkKKworIyBzdHViIF9faW5pdF9fLnB5IGZvciBwYWNrYWdlcyBkaXN0cmlidXRlZCB3aXRob3V0IG9uZQorTlNfUEtHX1NUVUIgPSAnX19pbXBvcnRfXygicGtnX3Jlc291cmNlcyIpLmRlY2xhcmVfbmFtZXNwYWNlKF9fbmFtZV9fKScKKworCisKKworCisKKworCisKKworY2xhc3MgYmRpc3RfZWdnKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAiY3JlYXRlIGFuIFwiZWdnXCIgZGlzdHJpYnV0aW9uIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2JkaXN0LWRpcj0nLCAnYicsCisgICAgICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiIpLAorICAgICAgICAoJ3BsYXQtbmFtZT0nLCAncCcsCisgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm0gbmFtZSB0byBlbWJlZCBpbiBnZW5lcmF0ZWQgZmlsZW5hbWVzICIKKyAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogJXMpIiAlIGdldF9idWlsZF9wbGF0Zm9ybSgpKSwKKyAgICAgICAgKCdleGNsdWRlLXNvdXJjZS1maWxlcycsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlIGFsbCAucHkgZmlsZXMgZnJvbSB0aGUgZ2VuZXJhdGVkIGVnZyIpLAorICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKKyAgICAgICAgICAgICAgICAgICAgICJrZWVwIHRoZSBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUgYXJvdW5kIGFmdGVyICIgKworICAgICAgICAgICAgICAgICAgICAgImNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZSIpLAorICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKKyAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwKKyAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJza2lwIHJlYnVpbGRpbmcgZXZlcnl0aGluZyAoZm9yIHRlc3RpbmcvZGVidWdnaW5nKSIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKKyAgICAgICAgJ2tlZXAtdGVtcCcsICdza2lwLWJ1aWxkJywgJ2V4Y2x1ZGUtc291cmNlLWZpbGVzJworICAgIF0KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuYmRpc3RfZGlyID0gTm9uZQorICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSAwCisgICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IDAKKyAgICAgICAgc2VsZi5lZ2dfb3V0cHV0ID0gTm9uZQorICAgICAgICBzZWxmLmV4Y2x1ZGVfc291cmNlX2ZpbGVzID0gTm9uZQorCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKKyAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVpX2NtZC5lZ2dfaW5mbworCisgICAgICAgIGlmIHNlbGYuYmRpc3RfZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBiZGlzdF9iYXNlID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0JykuYmRpc3RfYmFzZQorICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ2VnZycpCisKKyAgICAgICAgaWYgc2VsZi5wbGF0X25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYucGxhdF9uYW1lID0gZ2V0X2J1aWxkX3BsYXRmb3JtKCkKKworICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLCgnZGlzdF9kaXInLCAnZGlzdF9kaXInKSkKKworICAgICAgICBpZiBzZWxmLmVnZ19vdXRwdXQgaXMgTm9uZToKKworICAgICAgICAgICAgIyBDb21wdXRlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZWdnCisgICAgICAgICAgICBiYXNlbmFtZSA9IERpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgICAgICBOb25lLCBOb25lLCBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICBnZXRfcHl0aG9uX3ZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKSBhbmQgc2VsZi5wbGF0X25hbWUKKyAgICAgICAgICAgICkuZWdnX25hbWUoKQorCisgICAgICAgICAgICBzZWxmLmVnZ19vdXRwdXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgYmFzZW5hbWUrJy5lZ2cnKQorCisKKworCisKKworCisKKyAgICBkZWYgZG9faW5zdGFsbF9kYXRhKHNlbGYpOgorICAgICAgICAjIEhhY2sgZm9yIHBhY2thZ2VzIHRoYXQgaW5zdGFsbCBkYXRhIHRvIGluc3RhbGwncyAtLWluc3RhbGwtbGliCisgICAgICAgIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykuaW5zdGFsbF9saWIgPSBzZWxmLmJkaXN0X2RpcgorCisgICAgICAgIHNpdGVfcGFja2FnZXMgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoZ2V0X3B5dGhvbl9saWIoKSkpCisgICAgICAgIG9sZCwgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMsW10KKworICAgICAgICBmb3IgaXRlbSBpbiBvbGQ6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sdHVwbGUpIGFuZCBsZW4oaXRlbSk9PTI6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2FicyhpdGVtWzBdKToKKyAgICAgICAgICAgICAgICAgICAgcmVhbHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKGl0ZW1bMF0pCisgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBvcy5wYXRoLm5vcm1jYXNlKHJlYWxwYXRoKQorICAgICAgICAgICAgICAgICAgICBpZiBub3JtYWxpemVkPT1zaXRlX3BhY2thZ2VzIG9yIG5vcm1hbGl6ZWQuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVfcGFja2FnZXMrb3Muc2VwCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gcmVhbHBhdGhbbGVuKHNpdGVfcGFja2FnZXMpKzE6XSwgaXRlbVsxXQorICAgICAgICAgICAgICAgICAgICAjIFhYWCBlbHNlOiByYWlzZSA/Pz8KKyAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMuYXBwZW5kKGl0ZW0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgcGFja2FnZSBkYXRhIHRvICVzIiAlIHNlbGYuYmRpc3RfZGlyKQorICAgICAgICAgICAgc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfZGF0YScsIGZvcmNlPTAsIHJvb3Q9Tm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMgPSBvbGQKKworCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gW3NlbGYuZWdnX291dHB1dF0KKworCisgICAgZGVmIGNhbGxfY29tbWFuZChzZWxmLGNtZG5hbWUsKiprdyk6CisgICAgICAgICIiIkludm9rZSByZWluaXRpYWxpemVkIGNvbW1hbmQgYGNtZG5hbWVgIHdpdGgga2V5d29yZCBhcmdzIiIiCisgICAgICAgIGZvciBkaXJuYW1lIGluIElOU1RBTExfRElSRUNUT1JZX0FUVFJTOgorICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChkaXJuYW1lLHNlbGYuYmRpc3RfZGlyKQorICAgICAgICBrdy5zZXRkZWZhdWx0KCdza2lwX2J1aWxkJyxzZWxmLnNraXBfYnVpbGQpCisgICAgICAgIGt3LnNldGRlZmF1bHQoJ2RyeV9ydW4nLCBzZWxmLmRyeV9ydW4pCisgICAgICAgIGNtZCA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoY21kbmFtZSwgKiprdykKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRuYW1lKQorICAgICAgICByZXR1cm4gY21kCisKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUgbWV0YWRhdGEgZmlyc3QKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQorCisgICAgICAgICMgV2UgcnVuIGluc3RhbGxfbGliIGJlZm9yZSBpbnN0YWxsX2RhdGEsIGJlY2F1c2Ugc29tZSBkYXRhIGhhY2tzCisgICAgICAgICMgcHVsbCB0aGVpciBkYXRhIHBhdGggZnJvbSB0aGUgaW5zdGFsbF9saWIgY29tbWFuZC4KKyAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgbGlicmFyeSBjb2RlIHRvICVzIiAlIHNlbGYuYmRpc3RfZGlyKQorICAgICAgICBpbnN0Y21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKQorICAgICAgICBvbGRfcm9vdCA9IGluc3RjbWQucm9vdDsgaW5zdGNtZC5yb290ID0gTm9uZQorICAgICAgICBjbWQgPSBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9saWInLCB3YXJuX2Rpcj0wKQorICAgICAgICBpbnN0Y21kLnJvb3QgPSBvbGRfcm9vdAorCisgICAgICAgIGFsbF9vdXRwdXRzLCBleHRfb3V0cHV0cyA9IHNlbGYuZ2V0X2V4dF9vdXRwdXRzKCkKKyAgICAgICAgc2VsZi5zdHVicyA9IFtdCisgICAgICAgIHRvX2NvbXBpbGUgPSBbXQorICAgICAgICBmb3IgKHAsZXh0X25hbWUpIGluIGVudW1lcmF0ZShleHRfb3V0cHV0cyk6CisgICAgICAgICAgICBmaWxlbmFtZSxleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGV4dF9uYW1lKQorICAgICAgICAgICAgcHlmaWxlID0gb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLCBmaWxlbmFtZSArICcucHknKQorICAgICAgICAgICAgc2VsZi5zdHVicy5hcHBlbmQocHlmaWxlKQorICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0aW5nIHN0dWIgbG9hZGVyIGZvciAlcyIgJSBleHRfbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgd3JpdGVfc3R1Yihvcy5wYXRoLmJhc2VuYW1lKGV4dF9uYW1lKSwgcHlmaWxlKQorICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQocHlmaWxlKQorICAgICAgICAgICAgZXh0X291dHB1dHNbcF0gPSBleHRfbmFtZS5yZXBsYWNlKG9zLnNlcCwnLycpCisKKyAgICAgICAgdG9fY29tcGlsZS5leHRlbmQoc2VsZi5tYWtlX2luaXRfZmlsZXMoKSkKKyAgICAgICAgaWYgdG9fY29tcGlsZToKKyAgICAgICAgICAgIGNtZC5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkKKworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5kb19pbnN0YWxsX2RhdGEoKQorCisgICAgICAgICMgTWFrZSB0aGUgRUdHLUlORk8gZGlyZWN0b3J5CisgICAgICAgIGFyY2hpdmVfcm9vdCA9IHNlbGYuYmRpc3RfZGlyCisgICAgICAgIGVnZ19pbmZvID0gb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwnRUdHLUlORk8nKQorICAgICAgICBzZWxmLm1rcGF0aChlZ2dfaW5mbykKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKKyAgICAgICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICdzY3JpcHRzJykKKyAgICAgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHNjcmlwdHMgdG8gJXMiICUgc2NyaXB0X2RpcikKKyAgICAgICAgICAgIHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX3NjcmlwdHMnLGluc3RhbGxfZGlyPXNjcmlwdF9kaXIsbm9fZXA9MSkKKworICAgICAgICBuYXRpdmVfbGlicyA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCJuYXRpdmVfbGlicy50eHQiKQorICAgICAgICBpZiBhbGxfb3V0cHV0czoKKyAgICAgICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nICVzIiAlIG5hdGl2ZV9saWJzKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICBsaWJzX2ZpbGUgPSBvcGVuKG5hdGl2ZV9saWJzLCAnd3QnKQorICAgICAgICAgICAgICAgIGxpYnNfZmlsZS53cml0ZSgnXG4nLmpvaW4oYWxsX291dHB1dHMpKQorICAgICAgICAgICAgICAgIGxpYnNfZmlsZS53cml0ZSgnXG4nKQorICAgICAgICAgICAgICAgIGxpYnNfZmlsZS5jbG9zZSgpCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUobmF0aXZlX2xpYnMpOgorICAgICAgICAgICAgbG9nLmluZm8oInJlbW92aW5nICVzIiAlIG5hdGl2ZV9saWJzKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsobmF0aXZlX2xpYnMpCisKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoc2VsZi5lZ2dfaW5mbyk6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShwYXRoLG9zLnBhdGguam9pbihlZ2dfaW5mbyxmaWxlbmFtZSkpCisKKyAgICAgICAgd3JpdGVfc2FmZXR5X2ZsYWcoCisgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYXJjaGl2ZV9yb290LCdFR0ctSU5GTycpLCBzZWxmLnppcF9zYWZlKCkKKyAgICAgICAgKQorCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCdkZXBlbmRzLnR4dCcpKToKKyAgICAgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgICAgICJXQVJOSU5HOiAnZGVwZW5kcy50eHQnIHdpbGwgbm90IGJlIHVzZWQgYnkgc2V0dXB0b29scyAwLjYhXG4iCisgICAgICAgICAgICAgICAgIlVzZSB0aGUgaW5zdGFsbF9yZXF1aXJlcy9leHRyYXNfcmVxdWlyZSBzZXR1cCgpIGFyZ3MgaW5zdGVhZC4iCisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgc2VsZi5leGNsdWRlX3NvdXJjZV9maWxlczoKKyAgICAgICAgICAgIHNlbGYuemFwX3B5ZmlsZXMoKQorCisgICAgICAgICMgTWFrZSB0aGUgYXJjaGl2ZQorICAgICAgICBtYWtlX3ppcGZpbGUoc2VsZi5lZ2dfb3V0cHV0LCBhcmNoaXZlX3Jvb3QsIHZlcmJvc2U9c2VsZi52ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgorICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5iZGlzdF9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgICAgICMgQWRkIHRvICdEaXN0cmlidXRpb24uZGlzdF9maWxlcycgc28gdGhhdCB0aGUgInVwbG9hZCIgY29tbWFuZCB3b3JrcworICAgICAgICBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCdkaXN0X2ZpbGVzJyxbXSkuYXBwZW5kKAorICAgICAgICAgICAgKCdiZGlzdF9lZ2cnLGdldF9weXRob25fdmVyc2lvbigpLHNlbGYuZWdnX291dHB1dCkpCisKKyAgICBkZWYgemFwX3B5ZmlsZXMoc2VsZik6CisgICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAucHkgZmlsZXMgZnJvbSB0ZW1wb3JhcnkgZGlyZWN0b3J5IikKKyAgICAgICAgZm9yIGJhc2UsZGlycyxmaWxlcyBpbiB3YWxrX2VnZyhzZWxmLmJkaXN0X2Rpcik6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKToKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRpbmcgJXMiLCBwYXRoKQorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKKworICAgIGRlZiB6aXBfc2FmZShzZWxmKToKKyAgICAgICAgc2FmZSA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sJ3ppcF9zYWZlJyxOb25lKQorICAgICAgICBpZiBzYWZlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNhZmUKKyAgICAgICAgbG9nLndhcm4oInppcF9zYWZlIGZsYWcgbm90IHNldDsgYW5hbHl6aW5nIGFyY2hpdmUgY29udGVudHMuLi4iKQorICAgICAgICByZXR1cm4gYW5hbHl6ZV9lZ2coc2VsZi5iZGlzdF9kaXIsIHNlbGYuc3R1YnMpCisKKyAgICBkZWYgbWFrZV9pbml0X2ZpbGVzKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgbWlzc2luZyBwYWNrYWdlIF9faW5pdF9fIGZpbGVzIiIiCisgICAgICAgIGluaXRfZmlsZXMgPSBbXQorICAgICAgICBmb3IgYmFzZSxkaXJzLGZpbGVzIGluIHdhbGtfZWdnKHNlbGYuYmRpc3RfZGlyKToKKyAgICAgICAgICAgIGlmIGJhc2U9PXNlbGYuYmRpc3RfZGlyOgorICAgICAgICAgICAgICAgICMgZG9uJ3QgcHV0IGFuIF9faW5pdF9fIGluIHRoZSByb290CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5weScpOgorICAgICAgICAgICAgICAgICAgICBpZiAnX19pbml0X18ucHknIG5vdCBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrZyA9IGJhc2VbbGVuKHNlbGYuYmRpc3RfZGlyKSsxOl0ucmVwbGFjZShvcy5zZXAsJy4nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2NvbnRlbnRzX2Zvcihwa2cpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJDcmVhdGluZyBtaXNzaW5nIF9faW5pdF9fLnB5IGZvciAlcyIscGtnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2UsJ19faW5pdF9fLnB5JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwndycpOyBmLndyaXRlKE5TX1BLR19TVFVCKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2ZpbGVzLmFwcGVuZChmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBub3QgYSBwYWNrYWdlLCBkb24ndCB0cmF2ZXJzZSB0byBzdWJkaXJlY3RvcmllcworICAgICAgICAgICAgICAgIGRpcnNbOl0gPSBbXQorCisgICAgICAgIHJldHVybiBpbml0X2ZpbGVzCisKKyAgICBkZWYgZ2V0X2V4dF9vdXRwdXRzKHNlbGYpOgorICAgICAgICAiIiJHZXQgYSBsaXN0IG9mIHJlbGF0aXZlIHBhdGhzIHRvIEMgZXh0ZW5zaW9ucyBpbiB0aGUgb3V0cHV0IGRpc3RybyIiIgorCisgICAgICAgIGFsbF9vdXRwdXRzID0gW10KKyAgICAgICAgZXh0X291dHB1dHMgPSBbXQorCisgICAgICAgIHBhdGhzID0ge3NlbGYuYmRpc3RfZGlyOicnfQorICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzZWxmLmJkaXN0X2Rpcik6CisgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSlbMV0ubG93ZXIoKSBpbiBOQVRJVkVfRVhURU5TSU9OUzoKKyAgICAgICAgICAgICAgICAgICAgYWxsX291dHB1dHMuYXBwZW5kKHBhdGhzW2Jhc2VdK2ZpbGVuYW1lKQorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGRpcnM6CisgICAgICAgICAgICAgICAgcGF0aHNbb3MucGF0aC5qb2luKGJhc2UsZmlsZW5hbWUpXSA9IHBhdGhzW2Jhc2VdK2ZpbGVuYW1lKycvJworCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgYnVpbGRfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCisgICAgICAgICAgICBmb3IgZXh0IGluIGJ1aWxkX2NtZC5leHRlbnNpb25zOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gYnVpbGRfY21kLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBidWlsZF9jbWQuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkuc3RhcnRzd2l0aCgnZGwtJyk6CisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2RpcixmaWxlbmFtZSkpOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0X291dHB1dHMuYXBwZW5kKGZpbGVuYW1lKQorCisgICAgICAgIHJldHVybiBhbGxfb3V0cHV0cywgZXh0X291dHB1dHMKKworCitOQVRJVkVfRVhURU5TSU9OUyA9IGRpY3QuZnJvbWtleXMoJy5kbGwgLnNvIC5keWxpYiAucHlkJy5zcGxpdCgpKQorCisKKworCisKKworCisKKworCisKKworZGVmIHdhbGtfZWdnKGVnZ19kaXIpOgorICAgICIiIldhbGsgYW4gdW5wYWNrZWQgZWdnJ3MgY29udGVudHMsIHNraXBwaW5nIHRoZSBtZXRhZGF0YSBkaXJlY3RvcnkiIiIKKyAgICB3YWxrZXIgPSBvcy53YWxrKGVnZ19kaXIpCisgICAgYmFzZSxkaXJzLGZpbGVzID0gd2Fsa2VyLm5leHQoKQorICAgIGlmICdFR0ctSU5GTycgaW4gZGlyczoKKyAgICAgICAgZGlycy5yZW1vdmUoJ0VHRy1JTkZPJykKKyAgICB5aWVsZCBiYXNlLGRpcnMsZmlsZXMKKyAgICBmb3IgYmRmIGluIHdhbGtlcjoKKyAgICAgICAgeWllbGQgYmRmCisKK2RlZiBhbmFseXplX2VnZyhlZ2dfZGlyLCBzdHVicyk6CisgICAgIyBjaGVjayBmb3IgZXhpc3RpbmcgZmxhZyBpbiBFR0ctSU5GTworICAgIGZvciBmbGFnLGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oZWdnX2RpciwnRUdHLUlORk8nLGZuKSk6CisgICAgICAgICAgICByZXR1cm4gZmxhZworCisgICAgc2FmZSA9IFRydWUKKyAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gd2Fsa19lZ2coZWdnX2Rpcik6CisgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5Jykgb3IgbmFtZS5lbmRzd2l0aCgnLnB5dycpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIG5hbWUuZW5kc3dpdGgoJy5weWMnKSBvciBuYW1lLmVuZHN3aXRoKCcucHlvJyk6CisgICAgICAgICAgICAgICAgIyBhbHdheXMgc2NhbiwgZXZlbiBpZiB3ZSBhbHJlYWR5IGtub3cgd2UncmUgbm90IHNhZmUKKyAgICAgICAgICAgICAgICBzYWZlID0gc2Nhbl9tb2R1bGUoZWdnX2RpciwgYmFzZSwgbmFtZSwgc3R1YnMpIGFuZCBzYWZlCisgICAgcmV0dXJuIHNhZmUKKworZGVmIHdyaXRlX3NhZmV0eV9mbGFnKGVnZ19kaXIsIHNhZmUpOgorICAgICMgV3JpdGUgb3IgcmVtb3ZlIHppcCBzYWZldHkgZmxhZyBmaWxlKHMpCisgICAgZm9yIGZsYWcsZm4gaW4gc2FmZXR5X2ZsYWdzLml0ZW1zKCk6CisgICAgICAgIGZuID0gb3MucGF0aC5qb2luKGVnZ19kaXIsIGZuKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbik6CisgICAgICAgICAgICBpZiBzYWZlIGlzIE5vbmUgb3IgYm9vbChzYWZlKTw+ZmxhZzoKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZm4pCisgICAgICAgIGVsaWYgc2FmZSBpcyBub3QgTm9uZSBhbmQgYm9vbChzYWZlKT09ZmxhZzoKKyAgICAgICAgICAgIG9wZW4oZm4sJ3cnKS5jbG9zZSgpCisKK3NhZmV0eV9mbGFncyA9IHsKKyAgICBUcnVlOiAnemlwLXNhZmUnLAorICAgIEZhbHNlOiAnbm90LXppcC1zYWZlJywKK30KKworZGVmIHNjYW5fbW9kdWxlKGVnZ19kaXIsIGJhc2UsIG5hbWUsIHN0dWJzKToKKyAgICAiIiJDaGVjayB3aGV0aGVyIG1vZHVsZSBwb3NzaWJseSB1c2VzIHVuc2FmZS1mb3ItemlwZmlsZSBzdHVmZiIiIgorCisgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oYmFzZSxuYW1lKQorICAgIGlmIGZpbGVuYW1lWzotMV0gaW4gc3R1YnM6CisgICAgICAgIHJldHVybiBUcnVlICAgICAjIEV4dGVuc2lvbiBtb2R1bGUKKyAgICBwa2cgPSBiYXNlW2xlbihlZ2dfZGlyKSsxOl0ucmVwbGFjZShvcy5zZXAsJy4nKQorICAgIG1vZHVsZSA9IHBrZysocGtnIGFuZCAnLicgb3IgJycpK29zLnBhdGguc3BsaXRleHQobmFtZSlbMF0KKyAgICBmID0gb3BlbihmaWxlbmFtZSwncmInKTsgZi5yZWFkKDgpICAgIyBza2lwIG1hZ2ljICYgZGF0ZQorICAgIGNvZGUgPSBtYXJzaGFsLmxvYWQoZik7ICBmLmNsb3NlKCkKKyAgICBzYWZlID0gVHJ1ZQorICAgIHN5bWJvbHMgPSBkaWN0LmZyb21rZXlzKGl0ZXJfc3ltYm9scyhjb2RlKSkKKyAgICBmb3IgYmFkIGluIFsnX19maWxlX18nLCAnX19wYXRoX18nXToKKyAgICAgICAgaWYgYmFkIGluIHN5bWJvbHM6CisgICAgICAgICAgICBsb2cud2FybigiJXM6IG1vZHVsZSByZWZlcmVuY2VzICVzIiwgbW9kdWxlLCBiYWQpCisgICAgICAgICAgICBzYWZlID0gRmFsc2UKKyAgICBpZiAnaW5zcGVjdCcgaW4gc3ltYm9sczoKKyAgICAgICAgZm9yIGJhZCBpbiBbCisgICAgICAgICAgICAnZ2V0c291cmNlJywgJ2dldGFic2ZpbGUnLCAnZ2V0c291cmNlZmlsZScsICdnZXRmaWxlJworICAgICAgICAgICAgJ2dldHNvdXJjZWxpbmVzJywgJ2ZpbmRzb3VyY2UnLCAnZ2V0Y29tbWVudHMnLCAnZ2V0ZnJhbWVpbmZvJywKKyAgICAgICAgICAgICdnZXRpbm5lcmZyYW1lcycsICdnZXRvdXRlcmZyYW1lcycsICdzdGFjaycsICd0cmFjZScKKyAgICAgICAgXToKKyAgICAgICAgICAgIGlmIGJhZCBpbiBzeW1ib2xzOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlczogbW9kdWxlIE1BWSBiZSB1c2luZyBpbnNwZWN0LiVzIiwgbW9kdWxlLCBiYWQpCisgICAgICAgICAgICAgICAgc2FmZSA9IEZhbHNlCisgICAgaWYgJ19fbmFtZV9fJyBpbiBzeW1ib2xzIGFuZCAnX19tYWluX18nIGluIHN5bWJvbHMgYW5kICcuJyBub3QgaW4gbW9kdWxlOgorICAgICAgICBpZiBnZXRfcHl0aG9uX3ZlcnNpb24oKT49IjIuNCI6CisgICAgICAgICAgICBsb2cud2FybigiJXM6IHRvcC1sZXZlbCBtb2R1bGUgbWF5IGJlICdweXRob24gLW0nIHNjcmlwdCIsIG1vZHVsZSkKKyAgICAgICAgICAgIHNhZmUgPSBGYWxzZQorICAgIHJldHVybiBzYWZlCisKK2RlZiBpdGVyX3N5bWJvbHMoY29kZSk6CisgICAgIiIiWWllbGQgbmFtZXMgYW5kIHN0cmluZ3MgdXNlZCBieSBgY29kZWAgYW5kIGl0cyBuZXN0ZWQgY29kZSBvYmplY3RzIiIiCisgICAgZm9yIG5hbWUgaW4gY29kZS5jb19uYW1lczogeWllbGQgbmFtZQorICAgIGZvciBjb25zdCBpbiBjb2RlLmNvX2NvbnN0czoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjb25zdCxiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHlpZWxkIGNvbnN0CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShjb25zdCxDb2RlVHlwZSk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBpdGVyX3N5bWJvbHMoY29uc3QpOgorICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUKKworIyBBdHRyaWJ1dGUgbmFtZXMgb2Ygb3B0aW9ucyBmb3IgY29tbWFuZHMgdGhhdCBtaWdodCBuZWVkIHRvIGJlIGNvbnZpbmNlZCB0bworIyBpbnN0YWxsIHRvIHRoZSBlZ2cgYnVpbGQgZGlyZWN0b3J5CisKK0lOU1RBTExfRElSRUNUT1JZX0FUVFJTID0gWworICAgICdpbnN0YWxsX2xpYicsICdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RhdGEnLCAnaW5zdGFsbF9iYXNlJworXQorCitkZWYgbWFrZV96aXBmaWxlICh6aXBfZmlsZW5hbWUsIGJhc2VfZGlyLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgY29tcHJlc3M9Tm9uZSk6CisgICAgIiIiQ3JlYXRlIGEgemlwIGZpbGUgZnJvbSBhbGwgdGhlIGZpbGVzIHVuZGVyICdiYXNlX2RpcicuICBUaGUgb3V0cHV0CisgICAgemlwIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9kaXInICsgIi56aXAiLiAgVXNlcyBlaXRoZXIgdGhlICJ6aXBmaWxlIgorICAgIFB5dGhvbiBtb2R1bGUgKGlmIGF2YWlsYWJsZSkgb3IgdGhlIEluZm9aSVAgInppcCIgdXRpbGl0eSAoaWYgaW5zdGFsbGVkCisgICAgYW5kIGZvdW5kIG9uIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoKS4gIElmIG5laXRoZXIgdG9vbCBpcyBhdmFpbGFibGUsCisgICAgcmFpc2VzIERpc3R1dGlsc0V4ZWNFcnJvci4gIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCB6aXAgZmlsZS4KKyAgICAiIiIKKyAgICBpbXBvcnQgemlwZmlsZQorICAgIG1rcGF0aChvcy5wYXRoLmRpcm5hbWUoemlwX2ZpbGVuYW1lKSwgZHJ5X3J1bj1kcnlfcnVuKQorICAgIGxvZy5pbmZvKCJjcmVhdGluZyAnJXMnIGFuZCBhZGRpbmcgJyVzJyB0byBpdCIsIHppcF9maWxlbmFtZSwgYmFzZV9kaXIpCisKKyAgICBkZWYgdmlzaXQgKHosIGRpcm5hbWUsIG5hbWVzKToKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICBwID0gcGF0aFtsZW4oYmFzZV9kaXIpKzE6XQorICAgICAgICAgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICB6LndyaXRlKHBhdGgsIHApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJhZGRpbmcgJyVzJyIgJSBwKQorCisgICAgaWYgY29tcHJlc3MgaXMgTm9uZToKKyAgICAgICAgY29tcHJlc3MgPSAoc3lzLnZlcnNpb24+PSIyLjQiKSAjIGF2b2lkIDIuMyB6aXBpbXBvcnQgYnVnIHdoZW4gNjQgYml0cworCisgICAgY29tcHJlc3Npb24gPSBbemlwZmlsZS5aSVBfU1RPUkVELCB6aXBmaWxlLlpJUF9ERUZMQVRFRF1bYm9vbChjb21wcmVzcyldCisgICAgaWYgbm90IGRyeV9ydW46CisgICAgICAgIHogPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGVuYW1lLCAidyIsIGNvbXByZXNzaW9uPWNvbXByZXNzaW9uKQorICAgICAgICBvcy5wYXRoLndhbGsoYmFzZV9kaXIsIHZpc2l0LCB6KQorICAgICAgICB6LmNsb3NlKCkKKyAgICBlbHNlOgorICAgICAgICBvcy5wYXRoLndhbGsoYmFzZV9kaXIsIHZpc2l0LCBOb25lKQorCisgICAgcmV0dXJuIHppcF9maWxlbmFtZQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMGUwN2FjCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkKQEAgLTAsMCArMSwzNyBAQAorIyBUaGlzIGlzIGp1c3QgYSBrbHVkZ2Ugc28gdGhhdCBiZGlzdF9ycG0gZG9lc24ndCBndWVzcyB3cm9uZyBhYm91dCB0aGUKKyMgZGlzdHJpYnV0aW9uIG5hbWUgYW5kIHZlcnNpb24sIGlmIHRoZSBlZ2dfaW5mbyBjb21tYW5kIGlzIGdvaW5nIHRvIGFsdGVyCisjIHRoZW0sIGFuZCBhbm90aGVyIGtsdWRnZSB0byBhbGxvdyB5b3UgdG8gYnVpbGQgb2xkLXN0eWxlIG5vbi1lZ2cgUlBNcworCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbSBpbXBvcnQgYmRpc3RfcnBtIGFzIF9iZGlzdF9ycG0KKworY2xhc3MgYmRpc3RfcnBtKF9iZGlzdF9ycG0pOgorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgX2JkaXN0X3JwbS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5ub19lZ2cgPSBOb25lCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpICAgICMgZW5zdXJlIGRpc3RybyBuYW1lIGlzIHVwLXRvLWRhdGUKKyAgICAgICAgX2JkaXN0X3JwbS5ydW4oc2VsZikKKworICAgIGRlZiBfbWFrZV9zcGVjX2ZpbGUoc2VsZik6CisgICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCisgICAgICAgIHJwbXZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJy0nLCdfJykKKyAgICAgICAgc3BlYyA9IF9iZGlzdF9ycG0uX21ha2Vfc3BlY19maWxlKHNlbGYpCisgICAgICAgIGxpbmUyMyA9ICclZGVmaW5lIHZlcnNpb24gJyt2ZXJzaW9uCisgICAgICAgIGxpbmUyNCA9ICclZGVmaW5lIHZlcnNpb24gJytycG12ZXJzaW9uCisgICAgICAgIHNwZWMgID0gWworICAgICAgICAgICAgbGluZS5yZXBsYWNlKAorICAgICAgICAgICAgICAgICJTb3VyY2UwOiAle25hbWV9LSV7dmVyc2lvbn0udGFyIiwKKyAgICAgICAgICAgICAgICAiU291cmNlMDogJXtuYW1lfS0le3VubWFuZ2xlZF92ZXJzaW9ufS50YXIiCisgICAgICAgICAgICApLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgInNldHVwLnB5IGluc3RhbGwgIiwKKyAgICAgICAgICAgICAgICAic2V0dXAucHkgaW5zdGFsbCAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCAiCisgICAgICAgICAgICApLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgIiVzZXR1cCIsCisgICAgICAgICAgICAgICAgIiVzZXR1cCAtbiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259IgorICAgICAgICAgICAgKS5yZXBsYWNlKGxpbmUyMyxsaW5lMjQpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBzcGVjCisgICAgICAgIF0KKyAgICAgICAgc3BlYy5pbnNlcnQoc3BlYy5pbmRleChsaW5lMjQpKzEsICIlZGVmaW5lIHVubWFuZ2xlZF92ZXJzaW9uICIrdmVyc2lvbikKKyAgICAgICAgcmV0dXJuIHNwZWMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1NTFmYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CkBAIC0wLDAgKzEsMjg1IEBACitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9kdV9idWlsZF9leHQKK3RyeToKKyAgICAjIEF0dGVtcHQgdG8gdXNlIFB5cmV4IGZvciBidWlsZGluZyBleHRlbnNpb25zLCBpZiBhdmFpbGFibGUKKyAgICBmcm9tIFB5cmV4LkRpc3R1dGlscy5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfYnVpbGRfZXh0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX2J1aWxkX2V4dCA9IF9kdV9idWlsZF9leHQKKworaW1wb3J0IG9zLCBzeXMKK2Zyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgY29weV9maWxlCitmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBMaWJyYXJ5Citmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IG5ld19jb21waWxlcgorZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIsIGdldF9jb25maWdfdmFyCitnZXRfY29uZmlnX3ZhcigiTERTSEFSRUQiKSAgIyBtYWtlIHN1cmUgX2NvbmZpZ192YXJzIGlzIGluaXRpYWxpemVkCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IF9jb25maWdfdmFycworZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCisKK2hhdmVfcnRsZCA9IEZhbHNlCit1c2Vfc3R1YnMgPSBGYWxzZQorbGlidHlwZSA9ICdzaGFyZWQnCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICB1c2Vfc3R1YnMgPSBUcnVlCitlbGlmIG9zLm5hbWUgIT0gJ250JzoKKyAgICB0cnk6CisgICAgICAgIGZyb20gZGwgaW1wb3J0IFJUTERfTk9XCisgICAgICAgIGhhdmVfcnRsZCA9IFRydWUKKyAgICAgICAgdXNlX3N0dWJzID0gVHJ1ZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworCitkZWYgaWZfZGwocyk6CisgICAgaWYgaGF2ZV9ydGxkOgorICAgICAgICByZXR1cm4gcworICAgIHJldHVybiAnJworCisKKworCisKKworY2xhc3MgYnVpbGRfZXh0KF9idWlsZF9leHQpOgorICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICIiIkJ1aWxkIGV4dGVuc2lvbnMgaW4gYnVpbGQgZGlyZWN0b3J5LCB0aGVuIGNvcHkgaWYgLS1pbnBsYWNlIiIiCisgICAgICAgIG9sZF9pbnBsYWNlLCBzZWxmLmlucGxhY2UgPSBzZWxmLmlucGxhY2UsIDAKKyAgICAgICAgX2J1aWxkX2V4dC5ydW4oc2VsZikKKyAgICAgICAgc2VsZi5pbnBsYWNlID0gb2xkX2lucGxhY2UKKyAgICAgICAgaWYgb2xkX2lucGxhY2U6CisgICAgICAgICAgICBzZWxmLmNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2UoKQorCisgICAgZGVmIGNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2Uoc2VsZik6CisgICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBmdWxsbmFtZSA9IHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQorICAgICAgICAgICAgbW9kcGF0aCA9IGZ1bGxuYW1lLnNwbGl0KCcuJykKKyAgICAgICAgICAgIHBhY2thZ2UgPSAnLicuam9pbihtb2RwYXRoWzotMV0pCisgICAgICAgICAgICBwYWNrYWdlX2RpciA9IGJ1aWxkX3B5LmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQorICAgICAgICAgICAgZGVzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihwYWNrYWdlX2Rpcixvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKKyAgICAgICAgICAgIHNyY19maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYixmaWxlbmFtZSkKKworICAgICAgICAgICAgIyBBbHdheXMgY29weSwgZXZlbiBpZiBzb3VyY2UgaXMgb2xkZXIgdGhhbiBkZXN0aW5hdGlvbiwgdG8gZW5zdXJlCisgICAgICAgICAgICAjIHRoYXQgdGhlIHJpZ2h0IGV4dGVuc2lvbnMgZm9yIHRoZSBjdXJyZW50IFB5dGhvbi9wbGF0Zm9ybSBhcmUKKyAgICAgICAgICAgICMgdXNlZC4KKyAgICAgICAgICAgIGNvcHlfZmlsZSgKKyAgICAgICAgICAgICAgICBzcmNfZmlsZW5hbWUsIGRlc3RfZmlsZW5hbWUsIHZlcmJvc2U9c2VsZi52ZXJib3NlLAorICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuCisgICAgICAgICAgICApCisgICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9zdHViKHBhY2thZ2VfZGlyIG9yIG9zLmN1cmRpciwgZXh0LCBUcnVlKQorCisKKyAgICBpZiBfYnVpbGRfZXh0IGlzIG5vdCBfZHVfYnVpbGRfZXh0OgorICAgICAgICAjIFdvcmthcm91bmQgZm9yIHByb2JsZW1zIHVzaW5nIHNvbWUgUHlyZXggdmVyc2lvbnMgdy9TV0lHIGFuZC9vciAyLjQKKyAgICAgICAgZGVmIHN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzLCAqb3RoZXJhcmdzKToKKyAgICAgICAgICAgICMgZmlyc3QgZG8gYW55IFB5cmV4IHByb2Nlc3NpbmcKKyAgICAgICAgICAgIHNvdXJjZXMgPSBfYnVpbGRfZXh0LnN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzKSBvciBzb3VyY2VzCisgICAgICAgICAgICAjIFRoZW4gZG8gYW55IGFjdHVhbCBTV0lHIHN0dWZmIG9uIHRoZSByZW1haW5kZXIKKyAgICAgICAgICAgIHJldHVybiBfZHVfYnVpbGRfZXh0LnN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzLCAqb3RoZXJhcmdzKQorCisKKworICAgIGRlZiBnZXRfZXh0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgZmlsZW5hbWUgPSBfYnVpbGRfZXh0LmdldF9leHRfZmlsZW5hbWUoc2VsZixmdWxsbmFtZSkKKyAgICAgICAgZXh0ID0gc2VsZi5leHRfbWFwW2Z1bGxuYW1lXQorICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KToKKyAgICAgICAgICAgIGZuLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2hsaWJfY29tcGlsZXIubGlicmFyeV9maWxlbmFtZShmbixsaWJ0eXBlKQorICAgICAgICBlbGlmIHVzZV9zdHVicyBhbmQgZXh0Ll9saW5rc190b19keW5hbWljOgorICAgICAgICAgICAgZCxmbiA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGQsJ2RsLScrZm4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIF9idWlsZF9leHQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYuc2hsaWJfY29tcGlsZXIgPSBOb25lCisgICAgICAgIHNlbGYuc2hsaWJzID0gW10KKyAgICAgICAgc2VsZi5leHRfbWFwID0ge30KKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfYnVpbGRfZXh0LmZpbmFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5leHRlbnNpb25zID0gc2VsZi5leHRlbnNpb25zIG9yIFtdCisgICAgICAgIHNlbGYuY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYuZXh0ZW5zaW9ucykKKyAgICAgICAgc2VsZi5zaGxpYnMgPSBbZXh0IGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KV0KKyAgICAgICAgaWYgc2VsZi5zaGxpYnM6CisgICAgICAgICAgICBzZWxmLnNldHVwX3NobGliX2NvbXBpbGVyKCkKKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBmdWxsbmFtZSA9IGV4dC5fZnVsbF9uYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQorICAgICAgICAgICAgc2VsZi5leHRfbWFwW2Z1bGxuYW1lXSA9IGV4dAorICAgICAgICAgICAgbHRkID0gZXh0Ll9saW5rc190b19keW5hbWljID0gXAorICAgICAgICAgICAgICAgIHNlbGYuc2hsaWJzIGFuZCBzZWxmLmxpbmtzX3RvX2R5bmFtaWMoZXh0KSBvciBGYWxzZQorICAgICAgICAgICAgZXh0Ll9uZWVkc19zdHViID0gbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG5vdCBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KQorICAgICAgICAgICAgZmlsZW5hbWUgPSBleHQuX2ZpbGVfbmFtZSA9IHNlbGYuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKKyAgICAgICAgICAgIGxpYmRpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsZmlsZW5hbWUpKQorICAgICAgICAgICAgaWYgbHRkIGFuZCBsaWJkaXIgbm90IGluIGV4dC5saWJyYXJ5X2RpcnM6CisgICAgICAgICAgICAgICAgZXh0LmxpYnJhcnlfZGlycy5hcHBlbmQobGliZGlyKQorICAgICAgICAgICAgaWYgbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG9zLmN1cmRpciBub3QgaW4gZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzOgorICAgICAgICAgICAgICAgIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlycy5hcHBlbmQob3MuY3VyZGlyKQorCisKKworICAgIGRlZiBzZXR1cF9zaGxpYl9jb21waWxlcihzZWxmKToKKyAgICAgICAgY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyID0gbmV3X2NvbXBpbGVyKAorICAgICAgICAgICAgY29tcGlsZXI9c2VsZi5jb21waWxlciwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sIGZvcmNlPXNlbGYuZm9yY2UKKyAgICAgICAgKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgICAgICB0bXAgPSBfY29uZmlnX3ZhcnMuY29weSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBYWFggSGVscCEgIEkgZG9uJ3QgaGF2ZSBhbnkgaWRlYSB3aGV0aGVyIHRoZXNlIGFyZSByaWdodC4uLgorICAgICAgICAgICAgICAgIF9jb25maWdfdmFyc1snTERTSEFSRUQnXSA9ICJnY2MgLVdsLC14IC1keW5hbWljbGliIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAiCisgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzWydDQ1NIQVJFRCddID0gIiAtZHluYW1pY2xpYiIKKyAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnNbJ1NPJ10gPSAiLmR5bGliIgorICAgICAgICAgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzLmNsZWFyKCkKKyAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnMudXBkYXRlKHRtcCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKKworICAgICAgICBpZiBzZWxmLmluY2x1ZGVfZGlycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbXBpbGVyLnNldF9pbmNsdWRlX2RpcnMoc2VsZi5pbmNsdWRlX2RpcnMpCisgICAgICAgIGlmIHNlbGYuZGVmaW5lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyAnZGVmaW5lJyBvcHRpb24gaXMgYSBsaXN0IG9mIChuYW1lLHZhbHVlKSB0dXBsZXMKKyAgICAgICAgICAgIGZvciAobmFtZSx2YWx1ZSkgaW4gc2VsZi5kZWZpbmU6CisgICAgICAgICAgICAgICAgY29tcGlsZXIuZGVmaW5lX21hY3JvKG5hbWUsIHZhbHVlKQorICAgICAgICBpZiBzZWxmLnVuZGVmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIG1hY3JvIGluIHNlbGYudW5kZWY6CisgICAgICAgICAgICAgICAgY29tcGlsZXIudW5kZWZpbmVfbWFjcm8obWFjcm8pCisgICAgICAgIGlmIHNlbGYubGlicmFyaWVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpYnJhcmllcyhzZWxmLmxpYnJhcmllcykKKyAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2RpcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb21waWxlci5zZXRfbGlicmFyeV9kaXJzKHNlbGYubGlicmFyeV9kaXJzKQorICAgICAgICBpZiBzZWxmLnJwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29tcGlsZXIuc2V0X3J1bnRpbWVfbGlicmFyeV9kaXJzKHNlbGYucnBhdGgpCisgICAgICAgIGlmIHNlbGYubGlua19vYmplY3RzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpbmtfb2JqZWN0cyhzZWxmLmxpbmtfb2JqZWN0cykKKworICAgICAgICAjIGhhY2sgc28gZGlzdHV0aWxzJyBidWlsZF9leHRlbnNpb24oKSBidWlsZHMgYSBsaWJyYXJ5IGluc3RlYWQKKyAgICAgICAgY29tcGlsZXIubGlua19zaGFyZWRfb2JqZWN0ID0gbGlua19zaGFyZWRfb2JqZWN0Ll9fZ2V0X18oY29tcGlsZXIpCisKKworCisgICAgZGVmIGdldF9leHBvcnRfc3ltYm9scyhzZWxmLCBleHQpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KToKKyAgICAgICAgICAgIHJldHVybiBleHQuZXhwb3J0X3N5bWJvbHMKKyAgICAgICAgcmV0dXJuIF9idWlsZF9leHQuZ2V0X2V4cG9ydF9zeW1ib2xzKHNlbGYsZXh0KQorCisgICAgZGVmIGJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpOgorICAgICAgICBfY29tcGlsZXIgPSBzZWxmLmNvbXBpbGVyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyCisgICAgICAgICAgICBfYnVpbGRfZXh0LmJ1aWxkX2V4dGVuc2lvbihzZWxmLGV4dCkKKyAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3N0dWIoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLmJ1aWxkX2xpYiwgZXh0CisgICAgICAgICAgICAgICAgKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jb21waWxlciA9IF9jb21waWxlcgorCisgICAgZGVmIGxpbmtzX3RvX2R5bmFtaWMoc2VsZiwgZXh0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgJ2V4dCcgbGlua3MgdG8gYSBkeW5hbWljIGxpYiBpbiB0aGUgc2FtZSBwYWNrYWdlIiIiCisgICAgICAgICMgWFhYIHRoaXMgc2hvdWxkIGNoZWNrIHRvIGVuc3VyZSB0aGUgbGliIGlzIGFjdHVhbGx5IGJlaW5nIGJ1aWx0CisgICAgICAgICMgWFhYIGFzIGR5bmFtaWMsIGFuZCBub3QganVzdCB1c2luZyBhIGxvY2FsbHktZm91bmQgdmVyc2lvbiBvciBhCisgICAgICAgICMgWFhYIHN0YXRpYy1jb21waWxlZCB2ZXJzaW9uCisgICAgICAgIGxpYm5hbWVzID0gZGljdC5mcm9ta2V5cyhbbGliLl9mdWxsX25hbWUgZm9yIGxpYiBpbiBzZWxmLnNobGlic10pCisgICAgICAgIHBrZyA9ICcuJy5qb2luKGV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJylbOi0xXStbJyddKQorICAgICAgICBmb3IgbGlibmFtZSBpbiBleHQubGlicmFyaWVzOgorICAgICAgICAgICAgaWYgcGtnK2xpYm5hbWUgaW4gbGlibmFtZXM6IHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICBvdXRwdXRzID0gX2J1aWxkX2V4dC5nZXRfb3V0cHV0cyhzZWxmKQorICAgICAgICBvcHRpbWl6ZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLm9wdGltaXplCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgorICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViOgorICAgICAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKQorICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGJhc2UrJy5weScpCisgICAgICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoYmFzZSsnLnB5YycpCisgICAgICAgICAgICAgICAgaWYgb3B0aW1pemU6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGJhc2UrJy5weW8nKQorICAgICAgICByZXR1cm4gb3V0cHV0cworCisgICAgZGVmIHdyaXRlX3N0dWIoc2VsZiwgb3V0cHV0X2RpciwgZXh0LCBjb21waWxlPUZhbHNlKToKKyAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgc3R1YiBsb2FkZXIgZm9yICVzIHRvICVzIixleHQuX2Z1bGxfbmFtZSwgb3V0cHV0X2RpcikKKyAgICAgICAgc3R1Yl9maWxlID0gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKSsnLnB5JworICAgICAgICBpZiBjb21waWxlIGFuZCBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc3R1Yl9maWxlKyIgYWxyZWFkeSBleGlzdHMhIFBsZWFzZSBkZWxldGUuIikKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGYgPSBvcGVuKHN0dWJfZmlsZSwndycpCisgICAgICAgICAgICBmLndyaXRlKCdcbicuam9pbihbCisgICAgICAgICAgICAgICAgImRlZiBfX2Jvb3RzdHJhcF9fKCk6IiwKKyAgICAgICAgICAgICAgICAiICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fZmlsZV9fLCBfX2xvYWRlcl9fIiwKKyAgICAgICAgICAgICAgICAiICAgaW1wb3J0IHN5cywgb3MsIHBrZ19yZXNvdXJjZXMsIGltcCIraWZfZGwoIiwgZGwiKSwKKyAgICAgICAgICAgICAgICAiICAgX19maWxlX18gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKF9fbmFtZV9fLCVyKSIKKyAgICAgICAgICAgICAgICAgICAlIG9zLnBhdGguYmFzZW5hbWUoZXh0Ll9maWxlX25hbWUpLAorICAgICAgICAgICAgICAgICIgICBkZWwgX19ib290c3RyYXBfXyIsCisgICAgICAgICAgICAgICAgIiAgIGlmICdfX2xvYWRlcl9fJyBpbiBnbG9iYWxzKCk6IiwKKyAgICAgICAgICAgICAgICAiICAgICAgIGRlbCBfX2xvYWRlcl9fIiwKKyAgICAgICAgICAgICAgICBpZl9kbCgiICAgb2xkX2ZsYWdzID0gc3lzLmdldGRsb3BlbmZsYWdzKCkiKSwKKyAgICAgICAgICAgICAgICAiICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpIiwKKyAgICAgICAgICAgICAgICAiICAgdHJ5OiIsCisgICAgICAgICAgICAgICAgIiAgICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkiLAorICAgICAgICAgICAgICAgIGlmX2RsKCIgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhkbC5SVExEX05PVykiKSwKKyAgICAgICAgICAgICAgICAiICAgICBpbXAubG9hZF9keW5hbWljKF9fbmFtZV9fLF9fZmlsZV9fKSIsCisgICAgICAgICAgICAgICAgIiAgIGZpbmFsbHk6IiwKKyAgICAgICAgICAgICAgICBpZl9kbCgiICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3Mob2xkX2ZsYWdzKSIpLAorICAgICAgICAgICAgICAgICIgICAgIG9zLmNoZGlyKG9sZF9kaXIpIiwKKyAgICAgICAgICAgICAgICAiX19ib290c3RyYXBfXygpIiwKKyAgICAgICAgICAgICAgICAiIiAjIHRlcm1pbmFsIFxuCisgICAgICAgICAgICBdKSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBpZiBjb21waWxlOgorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCisgICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgICAgICBvcHRpbWl6ZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsX2xpYicpLm9wdGltaXplCisgICAgICAgICAgICBpZiBvcHRpbWl6ZSA+IDA6CisgICAgICAgICAgICAgICAgYnl0ZV9jb21waWxlKFtzdHViX2ZpbGVdLCBvcHRpbWl6ZT1vcHRpbWl6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhzdHViX2ZpbGUpCisKKworaWYgdXNlX3N0dWJzIG9yIG9zLm5hbWU9PSdudCc6CisgICAgIyBCdWlsZCBzaGFyZWQgbGlicmFyaWVzCisgICAgIworICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3Qoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLCBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsCisgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwgdGFyZ2V0X2xhbmc9Tm9uZQorICAgICk6ICBzZWxmLmxpbmsoCisgICAgICAgICAgICBzZWxmLlNIQVJFRF9MSUJSQVJZLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwKKyAgICAgICAgICAgIG91dHB1dF9kaXIsIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywKKyAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzLCBkZWJ1ZywgZXh0cmFfcHJlYXJncywgZXh0cmFfcG9zdGFyZ3MsCisgICAgICAgICAgICBidWlsZF90ZW1wLCB0YXJnZXRfbGFuZworICAgICAgICApCitlbHNlOgorICAgICMgQnVpbGQgc3RhdGljIGxpYnJhcmllcyBldmVyeXdoZXJlIGVsc2UKKyAgICBsaWJ0eXBlID0gJ3N0YXRpYycKKworICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3Qoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLCBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsCisgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwgdGFyZ2V0X2xhbmc9Tm9uZQorICAgICk6CisgICAgICAgICMgWFhYIHdlIG5lZWQgdG8gZWl0aGVyIGRpc2FsbG93IHRoZXNlIGF0dHJzIG9uIExpYnJhcnkgaW5zdGFuY2VzLAorICAgICAgICAjICAgICBvciB3YXJuL2Fib3J0IGhlcmUgaWYgc2V0LCBvciBzb21ldGhpbmcuLi4KKyAgICAgICAgI2xpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgI2V4cG9ydF9zeW1ib2xzPU5vbmUsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKKyAgICAgICAgI2J1aWxkX3RlbXA9Tm9uZQorCisgICAgICAgIGFzc2VydCBvdXRwdXRfZGlyIGlzIE5vbmUgICAjIGRpc3R1dGlscyBidWlsZF9leHQgZG9lc24ndCBwYXNzIHRoaXMKKyAgICAgICAgb3V0cHV0X2RpcixmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQob3V0cHV0X2xpYm5hbWUpCisgICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZmlsZW5hbWUoIngiKS5zdGFydHN3aXRoKCdsaWInKToKKyAgICAgICAgICAgICMgc3RyaXAgJ2xpYicgcHJlZml4OyB0aGlzIGlzIGtsdWRneSBpZiBzb21lIHBsYXRmb3JtIHVzZXMKKyAgICAgICAgICAgICMgYSBkaWZmZXJlbnQgcHJlZml4CisgICAgICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzM6XQorCisgICAgICAgIHNlbGYuY3JlYXRlX3N0YXRpY19saWIoCisgICAgICAgICAgICBvYmplY3RzLCBiYXNlbmFtZSwgb3V0cHV0X2RpciwgZGVidWcsIHRhcmdldF9sYW5nCisgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTliMjMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5CkBAIC0wLDAgKzEsMTkyIEBACitpbXBvcnQgb3MucGF0aCwgc3lzLCBmbm1hdGNoCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3B5IGltcG9ydCBidWlsZF9weSBhcyBfYnVpbGRfcHkKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorZnJvbSBnbG9iIGltcG9ydCBnbG9iCisKK2NsYXNzIGJ1aWxkX3B5KF9idWlsZF9weSk6CisgICAgIiIiRW5oYW5jZWQgJ2J1aWxkX3B5JyBjb21tYW5kIHRoYXQgaW5jbHVkZXMgZGF0YSBmaWxlcyB3aXRoIHBhY2thZ2VzCisKKyAgICBUaGUgZGF0YSBmaWxlcyBhcmUgc3BlY2lmaWVkIHZpYSBhICdwYWNrYWdlX2RhdGEnIGFyZ3VtZW50IHRvICdzZXR1cCgpJy4KKyAgICBTZWUgJ3NldHVwdG9vbHMuZGlzdC5EaXN0cmlidXRpb24nIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBBbHNvLCB0aGlzIHZlcnNpb24gb2YgdGhlICdidWlsZF9weScgY29tbWFuZCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYm90aAorICAgICdweV9tb2R1bGVzJyBhbmQgJ3BhY2thZ2VzJyBpbiB0aGUgc2FtZSBzZXR1cCBvcGVyYXRpb24uCisgICAgIiIiCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIF9idWlsZF9weS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kYXRhCisgICAgICAgIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5leGNsdWRlX3BhY2thZ2VfZGF0YSBvciB7fQorICAgICAgICBpZiAnZGF0YV9maWxlcycgaW4gc2VsZi5fX2RpY3RfXzogZGVsIHNlbGYuX19kaWN0X19bJ2RhdGFfZmlsZXMnXQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIiIiQnVpbGQgbW9kdWxlcywgcGFja2FnZXMsIGFuZCBjb3B5IGRhdGEgZmlsZXMgdG8gYnVpbGQgZGlyZWN0b3J5IiIiCisgICAgICAgIGlmIG5vdCBzZWxmLnB5X21vZHVsZXMgYW5kIG5vdCBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi5weV9tb2R1bGVzOgorICAgICAgICAgICAgc2VsZi5idWlsZF9tb2R1bGVzKCkKKworICAgICAgICBpZiBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlcygpCisgICAgICAgICAgICBzZWxmLmJ1aWxkX3BhY2thZ2VfZGF0YSgpCisKKyAgICAgICAgIyBPbmx5IGNvbXBpbGUgYWN0dWFsIC5weSBmaWxlcywgdXNpbmcgb3VyIGJhc2UgY2xhc3MnIGlkZWEgb2Ygd2hhdCBvdXIKKyAgICAgICAgIyBvdXRwdXQgZmlsZXMgYXJlLgorICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShfYnVpbGRfcHkuZ2V0X291dHB1dHMoc2VsZiwgaW5jbHVkZV9ieXRlY29kZT0wKSkKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLGF0dHIpOgorICAgICAgICBpZiBhdHRyPT0nZGF0YV9maWxlcyc6ICAjIGxhemlseSBjb21wdXRlIGRhdGEgZmlsZXMKKyAgICAgICAgICAgIHNlbGYuZGF0YV9maWxlcyA9IGZpbGVzID0gc2VsZi5fZ2V0X2RhdGFfZmlsZXMoKTsgcmV0dXJuIGZpbGVzCisgICAgICAgIHJldHVybiBfYnVpbGRfcHkuX19nZXRhdHRyX18oc2VsZixhdHRyKQorCisgICAgZGVmIF9nZXRfZGF0YV9maWxlcyhzZWxmKToKKyAgICAgICAgIiIiR2VuZXJhdGUgbGlzdCBvZiAnKHBhY2thZ2Usc3JjX2RpcixidWlsZF9kaXIsZmlsZW5hbWVzKScgdHVwbGVzIiIiCisgICAgICAgIHNlbGYuYW5hbHl6ZV9tYW5pZmVzdCgpCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzIG9yICgpOgorICAgICAgICAgICAgIyBMb2NhdGUgcGFja2FnZSBzb3VyY2UgZGlyZWN0b3J5CisgICAgICAgICAgICBzcmNfZGlyID0gc2VsZi5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkKKworICAgICAgICAgICAgIyBDb21wdXRlIHBhY2thZ2UgYnVpbGQgZGlyZWN0b3J5CisgICAgICAgICAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4oKihbc2VsZi5idWlsZF9saWJdICsgcGFja2FnZS5zcGxpdCgnLicpKSkKKworICAgICAgICAgICAgIyBMZW5ndGggb2YgcGF0aCB0byBzdHJpcCBmcm9tIGZvdW5kIGZpbGVzCisgICAgICAgICAgICBwbGVuID0gbGVuKHNyY19kaXIpKzEKKworICAgICAgICAgICAgIyBTdHJpcCBkaXJlY3RvcnkgZnJvbSBnbG9iYmVkIGZpbGVuYW1lcworICAgICAgICAgICAgZmlsZW5hbWVzID0gWworICAgICAgICAgICAgICAgIGZpbGVbcGxlbjpdIGZvciBmaWxlIGluIHNlbGYuZmluZF9kYXRhX2ZpbGVzKHBhY2thZ2UsIHNyY19kaXIpCisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgZGF0YS5hcHBlbmQoIChwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcykgKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIGZpbmRfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlLCBzcmNfZGlyKToKKyAgICAgICAgIiIiUmV0dXJuIGZpbGVuYW1lcyBmb3IgcGFja2FnZSdzIGRhdGEgZmlsZXMgaW4gJ3NyY19kaXInIiIiCisgICAgICAgIGdsb2JzID0gKHNlbGYucGFja2FnZV9kYXRhLmdldCgnJywgW10pCisgICAgICAgICAgICAgICAgICsgc2VsZi5wYWNrYWdlX2RhdGEuZ2V0KHBhY2thZ2UsIFtdKSkKKyAgICAgICAgZmlsZXMgPSBzZWxmLm1hbmlmZXN0X2ZpbGVzLmdldChwYWNrYWdlLCBbXSlbOl0KKyAgICAgICAgZm9yIHBhdHRlcm4gaW4gZ2xvYnM6CisgICAgICAgICAgICAjIEVhY2ggcGF0dGVybiBoYXMgdG8gYmUgY29udmVydGVkIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aAorICAgICAgICAgICAgZmlsZXMuZXh0ZW5kKGdsb2Iob3MucGF0aC5qb2luKHNyY19kaXIsIGNvbnZlcnRfcGF0aChwYXR0ZXJuKSkpKQorICAgICAgICByZXR1cm4gc2VsZi5leGNsdWRlX2RhdGFfZmlsZXMocGFja2FnZSwgc3JjX2RpciwgZmlsZXMpCisKKyAgICBkZWYgYnVpbGRfcGFja2FnZV9kYXRhKHNlbGYpOgorICAgICAgICAiIiJDb3B5IGRhdGEgZmlsZXMgaW50byBidWlsZCBkaXJlY3RvcnkiIiIKKyAgICAgICAgbGFzdGRpciA9IE5vbmUKKyAgICAgICAgZm9yIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzIGluIHNlbGYuZGF0YV9maWxlczoKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgob3MucGF0aC5kaXJuYW1lKHRhcmdldCkpCisgICAgICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUob3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKSwgdGFyZ2V0KQorCisKKyAgICBkZWYgYW5hbHl6ZV9tYW5pZmVzdChzZWxmKToKKyAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlcyA9IG1mID0ge30KKyAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmluY2x1ZGVfcGFja2FnZV9kYXRhOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNyY19kaXJzID0ge30KKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlcyBvciAoKToKKyAgICAgICAgICAgICMgTG9jYXRlIHBhY2thZ2Ugc291cmNlIGRpcmVjdG9yeQorICAgICAgICAgICAgc3JjX2RpcnNbYXNzZXJ0X3JlbGF0aXZlKHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpKV0gPSBwYWNrYWdlCisKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQorICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQorICAgICAgICBmb3IgcGF0aCBpbiBlaV9jbWQuZmlsZWxpc3QuZmlsZXM6CisgICAgICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcucHknKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZCxmID0gb3MucGF0aC5zcGxpdChhc3NlcnRfcmVsYXRpdmUocGF0aCkpCisgICAgICAgICAgICBwcmV2ID0gTm9uZQorICAgICAgICAgICAgd2hpbGUgZCBhbmQgZCE9cHJldiBhbmQgZCBub3QgaW4gc3JjX2RpcnM6CisgICAgICAgICAgICAgICAgcHJldiA9IGQKKyAgICAgICAgICAgICAgICBkLCBkZiA9IG9zLnBhdGguc3BsaXQoZCkKKyAgICAgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGRmLCBmKQorICAgICAgICAgICAgaWYgZCBpbiBzcmNfZGlyczoKKyAgICAgICAgICAgICAgICBtZi5zZXRkZWZhdWx0KHNyY19kaXJzW2RdLFtdKS5hcHBlbmQocGF0aCkKKworCisgICAgZGVmIGdldF9kYXRhX2ZpbGVzKHNlbGYpOiBwYXNzICAjIGtsdWRnZSAyLjQgZm9yIGxhenkgY29tcHV0YXRpb24KKworICAgIGlmIHN5cy52ZXJzaW9uPCIyLjQiOiAgICAjIFB5dGhvbiAyLjQgYWxyZWFkeSBoYXMgdGhpcyBjb2RlCisgICAgICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmLCBpbmNsdWRlX2J5dGVjb2RlPTEpOgorICAgICAgICAgICAgIiIiUmV0dXJuIGNvbXBsZXRlIGxpc3Qgb2YgZmlsZXMgY29waWVkIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkKKworICAgICAgICAgICAgVGhpcyBpbmNsdWRlcyBib3RoICcucHknIGZpbGVzIGFuZCBkYXRhIGZpbGVzLCBhcyB3ZWxsIGFzICcucHljJworICAgICAgICAgICAgYW5kICcucHlvJyBmaWxlcyBpZiAnaW5jbHVkZV9ieXRlY29kZScgaXMgdHJ1ZS4gIChUaGlzIG1ldGhvZCBpcworICAgICAgICAgICAgbmVlZGVkIGZvciB0aGUgJ2luc3RhbGxfbGliJyBjb21tYW5kIHRvIGRvIGl0cyBqb2IgcHJvcGVybHksIGFuZCB0bworICAgICAgICAgICAgZ2VuZXJhdGUgYSBjb3JyZWN0IGluc3RhbGxhdGlvbiBtYW5pZmVzdC4pCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBfYnVpbGRfcHkuZ2V0X291dHB1dHMoc2VsZiwgaW5jbHVkZV9ieXRlY29kZSkgKyBbCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZm9yIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpcixmaWxlbmFtZXMgaW4gc2VsZi5kYXRhX2ZpbGVzCisgICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lcworICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiBjaGVja19wYWNrYWdlKHNlbGYsIHBhY2thZ2UsIHBhY2thZ2VfZGlyKToKKyAgICAgICAgIiIiQ2hlY2sgbmFtZXNwYWNlIHBhY2thZ2VzJyBfX2luaXRfXyBmb3IgZGVjbGFyZV9uYW1lc3BhY2UiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFja2FnZXNfY2hlY2tlZFtwYWNrYWdlXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaW5pdF9weSA9IF9idWlsZF9weS5jaGVja19wYWNrYWdlKHNlbGYsIHBhY2thZ2UsIHBhY2thZ2VfZGlyKQorICAgICAgICBzZWxmLnBhY2thZ2VzX2NoZWNrZWRbcGFja2FnZV0gPSBpbml0X3B5CisKKyAgICAgICAgaWYgbm90IGluaXRfcHkgb3Igbm90IHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlczoKKyAgICAgICAgICAgIHJldHVybiBpbml0X3B5CisKKyAgICAgICAgZm9yIHBrZyBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CisgICAgICAgICAgICBpZiBwa2c9PXBhY2thZ2Ugb3IgcGtnLnN0YXJ0c3dpdGgocGFja2FnZSsnLicpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gaW5pdF9weQorCisgICAgICAgIGYgPSBvcGVuKGluaXRfcHksJ3JVJykKKyAgICAgICAgaWYgJ2RlY2xhcmVfbmFtZXNwYWNlJyBub3QgaW4gZi5yZWFkKCk6CisgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgIk5hbWVzcGFjZSBwYWNrYWdlIHByb2JsZW06ICVzIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UsIGJ1dCBpdHNcbiIKKyAgICAgICAgICAgICAgIl9faW5pdF9fLnB5IGRvZXMgbm90IGNhbGwgZGVjbGFyZV9uYW1lc3BhY2UoKSEgUGxlYXNlIGZpeCBpdC5cbiIKKyAgICAgICAgICAgICAgJyhTZWUgdGhlIHNldHVwdG9vbHMgbWFudWFsIHVuZGVyICJOYW1lc3BhY2UgUGFja2FnZXMiIGZvciAnCisgICAgICAgICAgICAgICJkZXRhaWxzLilcbiIgJSAocGFja2FnZSwpCisgICAgICAgICAgICApCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gaW5pdF9weQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5wYWNrYWdlc19jaGVja2VkPXt9CisgICAgICAgIF9idWlsZF9weS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKKworCisKKworCisKKworICAgIGRlZiBleGNsdWRlX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSwgc3JjX2RpciwgZmlsZXMpOgorICAgICAgICAiIiJGaWx0ZXIgZmlsZW5hbWVzIGZvciBwYWNrYWdlJ3MgZGF0YSBmaWxlcyBpbiAnc3JjX2RpciciIiIKKyAgICAgICAgZ2xvYnMgPSAoc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YS5nZXQoJycsIFtdKQorICAgICAgICAgICAgICAgICArIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEuZ2V0KHBhY2thZ2UsIFtdKSkKKyAgICAgICAgYmFkID0gW10KKyAgICAgICAgZm9yIHBhdHRlcm4gaW4gZ2xvYnM6CisgICAgICAgICAgICBiYWQuZXh0ZW5kKAorICAgICAgICAgICAgICAgIGZubWF0Y2guZmlsdGVyKAorICAgICAgICAgICAgICAgICAgICBmaWxlcywgb3MucGF0aC5qb2luKHNyY19kaXIsIGNvbnZlcnRfcGF0aChwYXR0ZXJuKSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgIGJhZCA9IGRpY3QuZnJvbWtleXMoYmFkKQorICAgICAgICByZXR1cm4gW2YgZm9yIGYgaW4gZmlsZXMgaWYgZiBub3QgaW4gYmFkXQorCisKK2RlZiBhc3NlcnRfcmVsYXRpdmUocGF0aCk6CisgICAgaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CisgICAgICAgIHJldHVybiBwYXRoCisgICAgZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCisgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyIiIkVycm9yOiBzZXR1cCBzY3JpcHQgc3BlY2lmaWVzIGFuIGFic29sdXRlIHBhdGg6CisKKyAgICAlcworCitzZXR1cCgpIGFyZ3VtZW50cyBtdXN0ICphbHdheXMqIGJlIC8tc2VwYXJhdGVkIHBhdGhzIHJlbGF0aXZlIHRvIHRoZQorc2V0dXAucHkgZGlyZWN0b3J5LCAqbmV2ZXIqIGFic29sdXRlIHBhdGhzLgorIiIiICUgcGF0aAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YWI1YjIzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5CkBAIC0wLDAgKzEsMTE2IEBACitmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGVhc3lfaW5zdGFsbAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBub3JtYWxpemVfcGF0aAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCitpbXBvcnQgc3lzLCBvcworCitjbGFzcyBkZXZlbG9wKGVhc3lfaW5zdGFsbCk6CisgICAgIiIiU2V0IHVwIHBhY2thZ2UgZm9yIGRldmVsb3BtZW50IiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIHBhY2thZ2UgaW4gJ2RldmVsb3BtZW50IG1vZGUnIgorCisgICAgdXNlcl9vcHRpb25zID0gZWFzeV9pbnN0YWxsLnVzZXJfb3B0aW9ucyArIFsKKyAgICAgICAgKCJ1bmluc3RhbGwiLCAidSIsICJVbmluc3RhbGwgdGhpcyBzb3VyY2UgcGFja2FnZSIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IGVhc3lfaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbJ3VuaW5zdGFsbCddCisKKyAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IEZhbHNlICAjIG92ZXJyaWRlIGJhc2UKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYudW5pbnN0YWxsOgorICAgICAgICAgICAgc2VsZi5tdWx0aV92ZXJzaW9uID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi51bmluc3RhbGxfbGluaygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmluc3RhbGxfZm9yX2RldmVsb3BtZW50KCkKKyAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucygpCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnVuaW5zdGFsbCA9IE5vbmUKKyAgICAgICAgZWFzeV9pbnN0YWxsLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorCisKKworCisKKworCisKKworCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGVpID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKKyAgICAgICAgaWYgZWkuYnJva2VuX2VnZ19pbmZvOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAiUGxlYXNlIHJlbmFtZSAlciB0byAlciBiZWZvcmUgdXNpbmcgJ2RldmVsb3AnIgorICAgICAgICAgICAgJSAoZWkuZWdnX2luZm8sIGVpLmJyb2tlbl9lZ2dfaW5mbykKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5hcmdzID0gW2VpLmVnZ19uYW1lXQorICAgICAgICBlYXN5X2luc3RhbGwuZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLmVnZ19saW5rID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGVpLmVnZ19uYW1lKycuZWdnLWxpbmsnKQorICAgICAgICBzZWxmLmVnZ19iYXNlID0gZWkuZWdnX2Jhc2UKKyAgICAgICAgc2VsZi5lZ2dfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChlaS5lZ2dfYmFzZSkKKworICAgICAgICAjIE1ha2UgYSBkaXN0cmlidXRpb24gZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlCisgICAgICAgIHNlbGYuZGlzdCA9IERpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgIG5vcm1hbGl6ZV9wYXRoKHNlbGYuZWdnX3BhdGgpLAorICAgICAgICAgICAgUGF0aE1ldGFkYXRhKHNlbGYuZWdnX3BhdGgsIG9zLnBhdGguYWJzcGF0aChlaS5lZ2dfaW5mbykpLAorICAgICAgICAgICAgcHJvamVjdF9uYW1lID0gZWkuZWdnX25hbWUKKyAgICAgICAgKQorCisgICAgZGVmIGluc3RhbGxfZm9yX2RldmVsb3BtZW50KHNlbGYpOgorICAgICAgICAjIEVuc3VyZSBtZXRhZGF0YSBpcyB1cC10by1kYXRlCisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKKworICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMgaW4tcGxhY2UKKyAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0xKQorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQorCisgICAgICAgIHNlbGYuaW5zdGFsbF9zaXRlX3B5KCkgICMgZW5zdXJlIHRoYXQgdGFyZ2V0IGRpciBpcyBzaXRlLXNhZmUKKworICAgICAgICAjIGNyZWF0ZSBhbiAuZWdnLWxpbmsgaW4gdGhlIGluc3RhbGxhdGlvbiBkaXIsIHBvaW50aW5nIHRvIG91ciBlZ2cKKyAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICVzIChsaW5rIHRvICVzKSIsIHNlbGYuZWdnX2xpbmssIHNlbGYuZWdnX2Jhc2UpCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBmID0gb3BlbihzZWxmLmVnZ19saW5rLCJ3IikKKyAgICAgICAgICAgIGYud3JpdGUoc2VsZi5lZ2dfcGF0aCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICMgcG9zdHByb2Nlc3MgdGhlIGluc3RhbGxlZCBkaXN0cm8sIGZpeGluZyB1cCAucHRoLCBpbnN0YWxsaW5nIHNjcmlwdHMsCisgICAgICAgICMgYW5kIGhhbmRsaW5nIHJlcXVpcmVtZW50cworICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKE5vbmUsIHNlbGYuZGlzdCkKKworICAgIGRlZiB1bmluc3RhbGxfbGluayhzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5lZ2dfbGluayk6CisgICAgICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMgKGxpbmsgdG8gJXMpIiwgc2VsZi5lZ2dfbGluaywgc2VsZi5lZ2dfYmFzZSkKKyAgICAgICAgICAgIGNvbnRlbnRzID0gW2xpbmUucnN0cmlwKCkgZm9yIGxpbmUgaW4gZmlsZShzZWxmLmVnZ19saW5rKV0KKyAgICAgICAgICAgIGlmIGNvbnRlbnRzICE9IFtzZWxmLmVnZ19wYXRoXToKKyAgICAgICAgICAgICAgICBsb2cud2FybigiTGluayBwb2ludHMgdG8gJXM6IHVuaW5zdGFsbCBhYm9ydGVkIiwgY29udGVudHMpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmVnZ19saW5rKQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgc2VsZi51cGRhdGVfcHRoKHNlbGYuZGlzdCkgICMgcmVtb3ZlIGFueSAucHRoIGxpbmsgdG8gdXMKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKKyAgICAgICAgICAgICMgWFhYIHNob3VsZCBhbHNvIGNoZWNrIGZvciBlbnRyeSBwb2ludCBzY3JpcHRzIQorICAgICAgICAgICAgbG9nLndhcm4oIk5vdGU6IHlvdSBtdXN0IHVuaW5zdGFsbCBvciByZXBsYWNlIHNjcmlwdHMgbWFudWFsbHkhIikKKworCisgICAgZGVmIGluc3RhbGxfZWdnX3NjcmlwdHMoc2VsZiwgZGlzdCk6CisgICAgICAgIGlmIGRpc3QgaXMgbm90IHNlbGYuZGlzdDoKKyAgICAgICAgICAgICMgSW5zdGFsbGluZyBhIGRlcGVuZGVuY3ksIHNvIGZhbGwgYmFjayB0byBub3JtYWwgYmVoYXZpb3IKKyAgICAgICAgICAgIHJldHVybiBlYXN5X2luc3RhbGwuaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLGRpc3QpCisKKyAgICAgICAgIyBjcmVhdGUgd3JhcHBlciBzY3JpcHRzIGluIHRoZSBzY3JpcHQgZGlyLCBwb2ludGluZyB0byBkaXN0LnNjcmlwdHMKKworICAgICAgICAjIG5ldy1zdHlsZS4uLgorICAgICAgICBzZWxmLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKGRpc3QpCisKKyAgICAgICAgIyAuLi5hbmQgb2xkLXN0eWxlCisgICAgICAgIGZvciBzY3JpcHRfbmFtZSBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzIG9yIFtdOgorICAgICAgICAgICAgc2NyaXB0X3BhdGggPSBvcy5wYXRoLmFic3BhdGgoY29udmVydF9wYXRoKHNjcmlwdF9uYW1lKSkKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShzY3JpcHRfcGF0aCkKKyAgICAgICAgICAgIGYgPSBvcGVuKHNjcmlwdF9wYXRoLCdyVScpCisgICAgICAgICAgICBzY3JpcHRfdGV4dCA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoZGlzdCwgc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0LCBzY3JpcHRfcGF0aCkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2RkY2VjNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5CkBAIC0wLDAgKzEsMTU1NSBAQAorIyFweXRob24KKyIiIlwKK0Vhc3kgSW5zdGFsbAorLS0tLS0tLS0tLS0tCisKK0EgdG9vbCBmb3IgZG9pbmcgYXV0b21hdGljIGRvd25sb2FkL2V4dHJhY3QvYnVpbGQgb2YgZGlzdHV0aWxzLWJhc2VkIFB5dGhvbgorcGFja2FnZXMuICBGb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgRWFzeUluc3RhbGwudHh0CitmaWxlLCBvciB2aXNpdCB0aGUgYEVhc3lJbnN0YWxsIGhvbWUgcGFnZWBfXy4KKworX18gaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRGV2Q2VudGVyL0Vhc3lJbnN0YWxsCisiIiIKK2ltcG9ydCBzeXMsIG9zLnBhdGgsIHppcGltcG9ydCwgc2h1dGlsLCB0ZW1wZmlsZSwgemlwZmlsZSwgcmUsIHN0YXQsIHJhbmRvbQorZnJvbSBnbG9iIGltcG9ydCBnbG9iCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gc2V0dXB0b29scy5zYW5kYm94IGltcG9ydCBydW5fc2V0dXAKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fbGliCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0FyZ0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgIERpc3R1dGlsc0Vycm9yCitmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfYXJjaGl2ZQorZnJvbSBzZXR1cHRvb2xzLnBhY2thZ2VfaW5kZXggaW1wb3J0IFBhY2thZ2VJbmRleCwgcGFyc2VfYmRpc3Rfd2luaW5zdAorZnJvbSBzZXR1cHRvb2xzLnBhY2thZ2VfaW5kZXggaW1wb3J0IFVSTF9TQ0hFTUUKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBiZGlzdF9lZ2csIGVnZ19pbmZvCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICoKK3N5c19leGVjdXRhYmxlID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY3V0YWJsZSkKKworX19hbGxfXyA9IFsKKyAgICAnc2FtZWZpbGUnLCAnZWFzeV9pbnN0YWxsJywgJ1B0aERpc3RyaWJ1dGlvbnMnLCAnZXh0cmFjdF93aW5pbnN0X2NmZycsCisgICAgJ21haW4nLCAnZ2V0X2V4ZV9wcmVmaXhlcycsCitdCisKK2RlZiBzYW1lZmlsZShwMSxwMik6CisgICAgaWYgaGFzYXR0cihvcy5wYXRoLCdzYW1lZmlsZScpIGFuZCAoCisgICAgICAgIG9zLnBhdGguZXhpc3RzKHAxKSBhbmQgb3MucGF0aC5leGlzdHMocDIpCisgICAgKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUocDEscDIpCisgICAgcmV0dXJuICgKKyAgICAgICAgb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAxKSkgPT0KKyAgICAgICAgb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAyKSkKKyAgICApCisKK2NsYXNzIGVhc3lfaW5zdGFsbChDb21tYW5kKToKKyAgICAiIiJNYW5hZ2UgYSBkb3dubG9hZC9idWlsZC9pbnN0YWxsIHByb2Nlc3MiIiIKKyAgICBkZXNjcmlwdGlvbiA9ICJGaW5kL2dldC9pbnN0YWxsIFB5dGhvbiBwYWNrYWdlcyIKKyAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IFRydWUKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdwcmVmaXg9JywgTm9uZSwgImluc3RhbGxhdGlvbiBwcmVmaXgiKSwKKyAgICAgICAgKCJ6aXAtb2siLCAieiIsICJpbnN0YWxsIHBhY2thZ2UgYXMgYSB6aXBmaWxlIiksCisgICAgICAgICgibXVsdGktdmVyc2lvbiIsICJtIiwgIm1ha2UgYXBwcyBoYXZlIHRvIHJlcXVpcmUoKSBhIHZlcnNpb24iKSwKKyAgICAgICAgKCJ1cGdyYWRlIiwgIlUiLCAiZm9yY2UgdXBncmFkZSAoc2VhcmNoZXMgUHlQSSBmb3IgbGF0ZXN0IHZlcnNpb25zKSIpLAorICAgICAgICAoImluc3RhbGwtZGlyPSIsICJkIiwgImluc3RhbGwgcGFja2FnZSB0byBESVIiKSwKKyAgICAgICAgKCJzY3JpcHQtZGlyPSIsICJzIiwgImluc3RhbGwgc2NyaXB0cyB0byBESVIiKSwKKyAgICAgICAgKCJleGNsdWRlLXNjcmlwdHMiLCAieCIsICJEb24ndCBpbnN0YWxsIHNjcmlwdHMiKSwKKyAgICAgICAgKCJhbHdheXMtY29weSIsICJhIiwgIkNvcHkgYWxsIG5lZWRlZCBwYWNrYWdlcyB0byBpbnN0YWxsIGRpciIpLAorICAgICAgICAoImluZGV4LXVybD0iLCAiaSIsICJiYXNlIFVSTCBvZiBQeXRob24gUGFja2FnZSBJbmRleCIpLAorICAgICAgICAoImZpbmQtbGlua3M9IiwgImYiLCAiYWRkaXRpb25hbCBVUkwocykgdG8gc2VhcmNoIGZvciBwYWNrYWdlcyIpLAorICAgICAgICAoImRlbGV0ZS1jb25mbGljdGluZyIsICJEIiwgIm5vIGxvbmdlciBuZWVkZWQ7IGRvbid0IHVzZSB0aGlzIiksCisgICAgICAgICgiaWdub3JlLWNvbmZsaWN0cy1hdC1teS1yaXNrIiwgTm9uZSwKKyAgICAgICAgICAgICJubyBsb25nZXIgbmVlZGVkOyBkb24ndCB1c2UgdGhpcyIpLAorICAgICAgICAoImJ1aWxkLWRpcmVjdG9yeT0iLCAiYiIsCisgICAgICAgICAgICAiZG93bmxvYWQvZXh0cmFjdC9idWlsZCBpbiBESVI7IGtlZXAgdGhlIHJlc3VsdHMiKSwKKyAgICAgICAgKCdvcHRpbWl6ZT0nLCAnTycsCisgICAgICAgICAiYWxzbyBjb21waWxlIHdpdGggb3B0aW1pemF0aW9uOiAtTzEgZm9yIFwicHl0aG9uIC1PXCIsICIKKyAgICAgICAgICItTzIgZm9yIFwicHl0aG9uIC1PT1wiLCBhbmQgLU8wIHRvIGRpc2FibGUgW2RlZmF1bHQ6IC1PMF0iKSwKKyAgICAgICAgKCdyZWNvcmQ9JywgTm9uZSwKKyAgICAgICAgICJmaWxlbmFtZSBpbiB3aGljaCB0byByZWNvcmQgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMiKSwKKyAgICAgICAgKCdhbHdheXMtdW56aXAnLCAnWicsICJkb24ndCBpbnN0YWxsIGFzIGEgemlwZmlsZSwgbm8gbWF0dGVyIHdoYXQiKSwKKyAgICAgICAgKCdzaXRlLWRpcnM9JywnUycsImxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hlcmUgLnB0aCBmaWxlcyB3b3JrIiksCisgICAgICAgICgnZWRpdGFibGUnLCAnZScsICJJbnN0YWxsIHNwZWNpZmllZCBwYWNrYWdlcyBpbiBlZGl0YWJsZSBmb3JtIiksCisgICAgICAgICgnbm8tZGVwcycsICdOJywgImRvbid0IGluc3RhbGwgZGVwZW5kZW5jaWVzIiksCisgICAgICAgICgnYWxsb3ctaG9zdHM9JywgJ0gnLCAicGF0dGVybihzKSB0aGF0IGhvc3RuYW1lcyBtdXN0IG1hdGNoIiksCisgICAgXQorICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKKyAgICAgICAgJ3ppcC1vaycsICdtdWx0aS12ZXJzaW9uJywgJ2V4Y2x1ZGUtc2NyaXB0cycsICd1cGdyYWRlJywgJ2Fsd2F5cy1jb3B5JywKKyAgICAgICAgJ2RlbGV0ZS1jb25mbGljdGluZycsICdpZ25vcmUtY29uZmxpY3RzLWF0LW15LXJpc2snLCAnZWRpdGFibGUnLAorICAgICAgICAnbm8tZGVwcycsCisgICAgXQorICAgIG5lZ2F0aXZlX29wdCA9IHsnYWx3YXlzLXVuemlwJzogJ3ppcC1vayd9CisgICAgY3JlYXRlX2luZGV4ID0gUGFja2FnZUluZGV4CisKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuemlwX29rID0gTm9uZQorICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5leGNsdWRlX3NjcmlwdHMgPSBOb25lCisgICAgICAgIHNlbGYuaW5kZXhfdXJsID0gTm9uZQorICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfZGlyZWN0b3J5ID0gTm9uZQorICAgICAgICBzZWxmLmFyZ3MgPSBOb25lCisgICAgICAgIHNlbGYub3B0aW1pemUgPSBzZWxmLnJlY29yZCA9IE5vbmUKKyAgICAgICAgc2VsZi51cGdyYWRlID0gc2VsZi5hbHdheXNfY29weSA9IHNlbGYubXVsdGlfdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5lZGl0YWJsZSA9IHNlbGYubm9fZGVwcyA9IHNlbGYuYWxsb3dfaG9zdHMgPSBOb25lCisgICAgICAgIHNlbGYucm9vdCA9IHNlbGYucHJlZml4ID0gc2VsZi5ub19yZXBvcnQgPSBOb25lCisKKyAgICAgICAgIyBPcHRpb25zIG5vdCBzcGVjaWZpYWJsZSB2aWEgY29tbWFuZCBsaW5lCisgICAgICAgIHNlbGYucGFja2FnZV9pbmRleCA9IE5vbmUKKyAgICAgICAgc2VsZi5wdGhfZmlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5kZWxldGVfY29uZmxpY3RpbmcgPSBOb25lCisgICAgICAgIHNlbGYuaWdub3JlX2NvbmZsaWN0c19hdF9teV9yaXNrID0gTm9uZQorICAgICAgICBzZWxmLnNpdGVfZGlycyA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsZWRfcHJvamVjdHMgPSB7fQorICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBGYWxzZQorICAgICAgICAjIEFsd2F5cyByZWFkIGVhc3lfaW5zdGFsbCBvcHRpb25zLCBldmVuIGlmIHdlIGFyZSBzdWJjbGFzc2VkLCBvciBoYXZlCisgICAgICAgICMgYW4gaW5kZXBlbmRlbnQgaW5zdGFuY2UgY3JlYXRlZC4gIFRoaXMgZW5zdXJlcyB0aGF0IGRlZmF1bHRzIHdpbGwKKyAgICAgICAgIyBhbHdheXMgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZpbGUocyknICJlYXN5X2luc3RhbGwiCisgICAgICAgICMgc2VjdGlvbiwgZXZlbiBpZiB0aGlzIGlzIGEgImRldmVsb3AiIG9yICJpbnN0YWxsIiBjb21tYW5kLCBvciBzb21lCisgICAgICAgICMgb3RoZXIgZW1iZWRkaW5nLgorICAgICAgICBzZWxmLl9kcnlfcnVuID0gTm9uZQorICAgICAgICBzZWxmLnZlcmJvc2UgPSBzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLl9zZXRfY29tbWFuZF9vcHRpb25zKAorICAgICAgICAgICAgc2VsZiwgc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKQorICAgICAgICApCisKKyAgICBkZWYgZGVsZXRlX2Jsb2NrZXJzKHNlbGYsIGJsb2NrZXJzKToKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGJsb2NrZXJzOgorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpIG9yIG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJtdHJlZShmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLl9leHBhbmQoJ2luc3RhbGxfZGlyJywnc2NyaXB0X2RpcicsJ2J1aWxkX2RpcmVjdG9yeScsJ3NpdGVfZGlycycpCisgICAgICAgICMgSWYgYSBub24tZGVmYXVsdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHdhcyBzcGVjaWZpZWQsIGRlZmF1bHQgdGhlCisgICAgICAgICMgc2NyaXB0IGRpcmVjdG9yeSB0byBtYXRjaCBpdC4KKyAgICAgICAgaWYgc2VsZi5zY3JpcHRfZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmluc3RhbGxfZGlyCisKKyAgICAgICAgIyBMZXQgaW5zdGFsbF9kaXIgZ2V0IHNldCBieSBpbnN0YWxsX2xpYiBjb21tYW5kLCB3aGljaCBpbiB0dXJuCisgICAgICAgICMgZ2V0cyBpdHMgaW5mbyBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQsIGFuZCB0YWtlcyBpbnRvIGFjY291bnQKKyAgICAgICAgIyAtLXByZWZpeCBhbmQgLS1ob21lIGFuZCBhbGwgdGhhdCBvdGhlciBjcnVkLgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLAorICAgICAgICAgICAgKCdpbnN0YWxsX2RpcicsJ2luc3RhbGxfZGlyJykKKyAgICAgICAgKQorICAgICAgICAjIExpa2V3aXNlLCBzZXQgZGVmYXVsdCBzY3JpcHRfZGlyIGZyb20gJ2luc3RhbGxfc2NyaXB0cy5pbnN0YWxsX2RpcicKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfc2NyaXB0cycsCisgICAgICAgICAgICAoJ2luc3RhbGxfZGlyJywgJ3NjcmlwdF9kaXInKQorICAgICAgICApCisgICAgICAgICMgZGVmYXVsdCAtLXJlY29yZCBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGwnLCAoJ3JlY29yZCcsICdyZWNvcmQnKSkKKyAgICAgICAgbm9ybXBhdGggPSBtYXAobm9ybWFsaXplX3BhdGgsIHN5cy5wYXRoKQorICAgICAgICBzZWxmLmFsbF9zaXRlX2RpcnMgPSBnZXRfc2l0ZV9kaXJzKCkKKyAgICAgICAgaWYgc2VsZi5zaXRlX2RpcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzaXRlX2RpcnMgPSBbCisgICAgICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyKHMuc3RyaXAoKSkgZm9yIHMgaW4gc2VsZi5zaXRlX2RpcnMuc3BsaXQoJywnKQorICAgICAgICAgICAgXQorICAgICAgICAgICAgZm9yIGQgaW4gc2l0ZV9kaXJzOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGQpOgorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiJXMgKGluIC0tc2l0ZS1kaXJzKSBkb2VzIG5vdCBleGlzdCIsIGQpCisgICAgICAgICAgICAgICAgZWxpZiBub3JtYWxpemVfcGF0aChkKSBub3QgaW4gbm9ybXBhdGg6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgZCsiIChpbiAtLXNpdGUtZGlycykgaXMgbm90IG9uIHN5cy5wYXRoIgorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfc2l0ZV9kaXJzLmFwcGVuZChub3JtYWxpemVfcGF0aChkKSkKKyAgICAgICAgc2VsZi5jaGVja19zaXRlX2RpcigpCisgICAgICAgIHNlbGYuaW5kZXhfdXJsID0gc2VsZi5pbmRleF91cmwgb3IgImh0dHA6Ly93d3cucHl0aG9uLm9yZy9weXBpIgorICAgICAgICBzZWxmLnNoYWRvd19wYXRoID0gc2VsZi5hbGxfc2l0ZV9kaXJzWzpdCisgICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gc2VsZi5pbnN0YWxsX2Rpciwgbm9ybWFsaXplX3BhdGgoc2VsZi5zY3JpcHRfZGlyKToKKyAgICAgICAgICAgIGlmIHBhdGhfaXRlbSBub3QgaW4gc2VsZi5zaGFkb3dfcGF0aDoKKyAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLmluc2VydCgwLCBwYXRoX2l0ZW0pCisKKyAgICAgICAgaWYgc2VsZi5hbGxvd19ob3N0cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGhvc3RzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzZWxmLmFsbG93X2hvc3RzLnNwbGl0KCcsJyldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBob3N0cyA9IFsnKiddCisKKyAgICAgICAgaWYgc2VsZi5wYWNrYWdlX2luZGV4IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXggPSBzZWxmLmNyZWF0ZV9pbmRleCgKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4X3VybCwgc2VhcmNoX3BhdGggPSBzZWxmLnNoYWRvd19wYXRoLCBob3N0cz1ob3N0cworICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmxvY2FsX2luZGV4ID0gRW52aXJvbm1lbnQoc2VsZi5zaGFkb3dfcGF0aCkKKworICAgICAgICBpZiBzZWxmLmZpbmRfbGlua3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmluZF9saW5rcywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gc2VsZi5maW5kX2xpbmtzLnNwbGl0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcyA9IFtdCisKKyAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZF9maW5kX2xpbmtzKHNlbGYuZmluZF9saW5rcykKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywgKCdvcHRpbWl6ZScsJ29wdGltaXplJykpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYub3B0aW1pemUsaW50KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLm9wdGltaXplID0gaW50KHNlbGYub3B0aW1pemUpCisgICAgICAgICAgICAgICAgaWYgbm90ICgwIDw9IHNlbGYub3B0aW1pemUgPD0gMik6IHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLW9wdGltaXplIG11c3QgYmUgMCwgMSwgb3IgMiIpCisKKyAgICAgICAgaWYgc2VsZi5kZWxldGVfY29uZmxpY3RpbmcgYW5kIHNlbGYuaWdub3JlX2NvbmZsaWN0c19hdF9teV9yaXNrOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIkNhbid0IHVzZSBib3RoIC0tZGVsZXRlLWNvbmZsaWN0aW5nIGFuZCAiCisgICAgICAgICAgICAgICAgIi0taWdub3JlLWNvbmZsaWN0cy1hdC1teS1yaXNrIGF0IHRoZSBzYW1lIHRpbWUiCisgICAgICAgICAgICApCisgICAgICAgIGlmIHNlbGYuZWRpdGFibGUgYW5kIG5vdCBzZWxmLmJ1aWxkX2RpcmVjdG9yeToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAorICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgYSBidWlsZCBkaXJlY3RvcnkgKC1iKSB3aGVuIHVzaW5nIC0tZWRpdGFibGUiCisgICAgICAgICAgICApCisgICAgICAgIGlmIG5vdCBzZWxmLmFyZ3M6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKKyAgICAgICAgICAgICAgICAiTm8gdXJscywgZmlsZW5hbWVzLCBvciByZXF1aXJlbWVudHMgc3BlY2lmaWVkIChzZWUgLS1oZWxwKSIpCisKKyAgICAgICAgc2VsZi5vdXRwdXRzID0gW10KKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYudmVyYm9zZTw+c2VsZi5kaXN0cmlidXRpb24udmVyYm9zZToKKyAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHNwZWMgaW4gc2VsZi5hcmdzOgorICAgICAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKHNwZWMsIG5vdCBzZWxmLm5vX2RlcHMpCisgICAgICAgICAgICBpZiBzZWxmLnJlY29yZDoKKyAgICAgICAgICAgICAgICBvdXRwdXRzID0gc2VsZi5vdXRwdXRzCisgICAgICAgICAgICAgICAgaWYgc2VsZi5yb290OiAgICAgICAgICAgICAgICMgc3RyaXAgYW55IHBhY2thZ2UgcHJlZml4CisgICAgICAgICAgICAgICAgICAgIHJvb3RfbGVuID0gbGVuKHNlbGYucm9vdCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGNvdW50ZXIgaW4geHJhbmdlKGxlbihvdXRwdXRzKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzW2NvdW50ZXJdID0gb3V0cHV0c1tjb3VudGVyXVtyb290X2xlbjpdCisgICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGZpbGVfdXRpbAorICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgZmlsZV91dGlsLndyaXRlX2ZpbGUsIChzZWxmLnJlY29yZCwgb3V0cHV0cyksCisgICAgICAgICAgICAgICAgICAgICJ3cml0aW5nIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIHRvICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNvcmQKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZF9vcHRpb25zKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2UpCisKKyAgICBkZWYgcHNldWRvX3RlbXBuYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBwc2V1ZG8tdGVtcG5hbWUgYmFzZSBpbiB0aGUgaW5zdGFsbCBkaXJlY3RvcnkuCisgICAgICAgIFRoaXMgY29kZSBpcyBpbnRlbnRpb25hbGx5IG5haXZlOyBpZiBhIG1hbGljaW91cyBwYXJ0eSBjYW4gd3JpdGUgdG8KKyAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgeW91J3JlIGFscmVhZHkgaW4gZGVlcCBkb29kb28uCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwaWQgPSByYW5kb20ucmFuZGludCgwLHN5cy5tYXhpbnQpCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgInRlc3QtZWFzeS1pbnN0YWxsLSVzIiAlIHBpZCkKKworICAgIGRlZiB3YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kZWxldGVfY29uZmxpY3Rpbmcgb3Igc2VsZi5pZ25vcmVfY29uZmxpY3RzX2F0X215X3Jpc2s6CisgICAgICAgICAgICBsb2cud2FybigKKyAgICAgICAgICAgICAgICAiTm90ZTogVGhlIC1ELCAtLWRlbGV0ZS1jb25mbGljdGluZyBhbmQiCisgICAgICAgICAgICAgICAgIiAtLWlnbm9yZS1jb25mbGljdHMtYXQtbXktcmlzayBubyBsb25nZXIgaGF2ZSBhbnkgcHVycG9zZSIKKyAgICAgICAgICAgICAgICAiIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuIgorICAgICAgICAgICAgKQorCisgICAgZGVmIGNoZWNrX3NpdGVfZGlyKHNlbGYpOgorICAgICAgICAiIiJWZXJpZnkgdGhhdCBzZWxmLmluc3RhbGxfZGlyIGlzIC5wdGgtY2FwYWJsZSBkaXIsIGlmIG5lZWRlZCIiIgorCisgICAgICAgIGluc3RkaXIgPSBub3JtYWxpemVfcGF0aChzZWxmLmluc3RhbGxfZGlyKQorICAgICAgICBwdGhfZmlsZSA9IG9zLnBhdGguam9pbihpbnN0ZGlyLCdlYXN5LWluc3RhbGwucHRoJykKKworICAgICAgICAjIElzIGl0IGEgY29uZmlndXJlZCwgUFlUSE9OUEFUSCwgaW1wbGljaXQsIG9yIGV4cGxpY2l0IHNpdGUgZGlyPworICAgICAgICBpc19zaXRlX2RpciA9IGluc3RkaXIgaW4gc2VsZi5hbGxfc2l0ZV9kaXJzCisKKyAgICAgICAgaWYgbm90IGlzX3NpdGVfZGlyOgorICAgICAgICAgICAgIyBObz8gIFRoZW4gZGlyZWN0bHkgdGVzdCB3aGV0aGVyIGl0IGRvZXMgLnB0aCBmaWxlIHByb2Nlc3NpbmcKKyAgICAgICAgICAgIGlzX3NpdGVfZGlyID0gc2VsZi5jaGVja19wdGhfcHJvY2Vzc2luZygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBjYW4gd3JpdGUgdG8gdGFyZ2V0IGRpcgorICAgICAgICAgICAgdGVzdGZpbGUgPSBzZWxmLnBzZXVkb190ZW1wbmFtZSgpKycud3JpdGUtdGVzdCcKKyAgICAgICAgICAgIHRlc3RfZXhpc3RzID0gb3MucGF0aC5leGlzdHModGVzdGZpbGUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgdGVzdF9leGlzdHM6IG9zLnVubGluayh0ZXN0ZmlsZSkKKyAgICAgICAgICAgICAgICBvcGVuKHRlc3RmaWxlLCd3JykuY2xvc2UoKQorICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZmlsZSkKKyAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvcixJT0Vycm9yKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbnRfd3JpdGVfdG9fdGFyZ2V0KCkKKworICAgICAgICBpZiBub3QgaXNfc2l0ZV9kaXIgYW5kIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CisgICAgICAgICAgICAjIENhbid0IGluc3RhbGwgbm9uLW11bHRpIHRvIG5vbi1zaXRlIGRpcgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc2VsZi5ub19kZWZhdWx0X3ZlcnNpb25fbXNnKCkpCisKKyAgICAgICAgaWYgaXNfc2l0ZV9kaXI6CisgICAgICAgICAgICBpZiBzZWxmLnB0aF9maWxlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IFB0aERpc3RyaWJ1dGlvbnMocHRoX2ZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gTm9uZQorCisgICAgICAgIFBZVEhPTlBBVEggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsJycpLnNwbGl0KG9zLnBhdGhzZXApCisgICAgICAgIGlmIGluc3RkaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCwgZmlsdGVyKE5vbmUsUFlUSE9OUEFUSCkpOgorICAgICAgICAgICAgIyBvbmx5IFBZVEhPTlBBVEggZGlycyBuZWVkIGEgc2l0ZS5weSwgc28gcHJldGVuZCBpdCdzIHRoZXJlCisgICAgICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCisKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IGluc3RkaXIKKworCisgICAgZGVmIGNhbnRfd3JpdGVfdG9fdGFyZ2V0KHNlbGYpOgorICAgICAgICBtc2cgPSAiIiJjYW4ndCBjcmVhdGUgb3IgcmVtb3ZlIGZpbGVzIGluIGluc3RhbGwgZGlyZWN0b3J5CisKK1RoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGFkZCBvciByZW1vdmUgZmlsZXMgaW4gdGhlCitpbnN0YWxsYXRpb24gZGlyZWN0b3J5OgorCisgICAgJXMKKworVGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgeW91IHNwZWNpZmllZCAodmlhIC0taW5zdGFsbC1kaXIsIC0tcHJlZml4LCBvcgordGhlIGRpc3R1dGlscyBkZWZhdWx0IHNldHRpbmcpIHdhczoKKworICAgICVzCisiIiIgICAgICUgKHN5cy5leGNfaW5mbygpWzFdLCBzZWxmLmluc3RhbGxfZGlyLCkKKworICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5pbnN0YWxsX2Rpcik6CisgICAgICAgICAgICBtc2cgKz0gIiIiCitUaGlzIGRpcmVjdG9yeSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuICBQbGVhc2UgY3JlYXRlIGl0IGFuZCB0cnkgYWdhaW4sIG9yCitjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAodXNpbmcgdGhlIC1kIG9yIC0taW5zdGFsbC1kaXIKK29wdGlvbikuCisiIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyArPSAiIiIKK1BlcmhhcHMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgZGlyZWN0b3J5PyAgSWYgdGhlCitpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGlzIGEgc3lzdGVtLW93bmVkIGRpcmVjdG9yeSwgeW91IG1heSBuZWVkIHRvIHNpZ24gaW4KK2FzIHRoZSBhZG1pbmlzdHJhdG9yIG9yICJyb290IiBhY2NvdW50LiAgSWYgeW91IGRvIG5vdCBoYXZlIGFkbWluaXN0cmF0aXZlCithY2Nlc3MgdG8gdGhpcyBtYWNoaW5lLCB5b3UgbWF5IHdpc2ggdG8gY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbgorZGlyZWN0b3J5LCBwcmVmZXJhYmx5IG9uZSB0aGF0IGlzIGxpc3RlZCBpbiB5b3VyIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKK3ZhcmlhYmxlLgorCitGb3IgaW5mb3JtYXRpb24gb24gb3RoZXIgb3B0aW9ucywgeW91IG1heSB3aXNoIHRvIGNvbnN1bHQgdGhlCitkb2N1bWVudGF0aW9uIGF0OgorCisgIGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0Vhc3lJbnN0YWxsLmh0bWwKKworUGxlYXNlIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMgZm9yIHlvdXIgc3lzdGVtIGFuZCB0cnkgYWdhaW4uCisiIiIKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQorCisKKworCisgICAgZGVmIGNoZWNrX3B0aF9wcm9jZXNzaW5nKHNlbGYpOgorICAgICAgICAiIiJFbXBpcmljYWxseSB2ZXJpZnkgd2hldGhlciAucHRoIGZpbGVzIGFyZSBzdXBwb3J0ZWQgaW4gaW5zdC4gZGlyIiIiCisgICAgICAgIGluc3RkaXIgPSBzZWxmLmluc3RhbGxfZGlyCisgICAgICAgIGxvZy5pbmZvKCJDaGVja2luZyAucHRoIGZpbGUgc3VwcG9ydCBpbiAlcyIsIGluc3RkaXIpCisgICAgICAgIHB0aF9maWxlID0gc2VsZi5wc2V1ZG9fdGVtcG5hbWUoKSsiLnB0aCIKKyAgICAgICAgb2tfZmlsZSA9IHB0aF9maWxlKycub2snCisgICAgICAgIG9rX2V4aXN0cyA9IG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG9rX2V4aXN0czogb3MudW5saW5rKG9rX2ZpbGUpCisgICAgICAgICAgICBmID0gb3BlbihwdGhfZmlsZSwndycpCisgICAgICAgIGV4Y2VwdCAoT1NFcnJvcixJT0Vycm9yKToKKyAgICAgICAgICAgIHNlbGYuY2FudF93cml0ZV90b190YXJnZXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYud3JpdGUoImltcG9ydCBvcztvcGVuKCVyLCd3Jykud3JpdGUoJ09LJylcbiIgJSAob2tfZmlsZSwpKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKTsgZj1Ob25lCisgICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHN5cy5leGVjdXRhYmxlCisgICAgICAgICAgICAgICAgaWYgb3MubmFtZT09J250JzoKKyAgICAgICAgICAgICAgICAgICAgZGlybmFtZSxiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQoZXhlY3V0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgYWx0ID0gb3MucGF0aC5qb2luKGRpcm5hbWUsJ3B5dGhvbncuZXhlJykKKyAgICAgICAgICAgICAgICAgICAgaWYgYmFzZW5hbWUubG93ZXIoKT09J3B5dGhvbi5leGUnIGFuZCBvcy5wYXRoLmV4aXN0cyhhbHQpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgcHl0aG9udy5leGUgdG8gYXZvaWQgb3BlbmluZyBhIGNvbnNvbGUgd2luZG93CisgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gYWx0CisgICAgICAgICAgICAgICAgICAgIGlmICcgJyBpbiBleGVjdXRhYmxlOiBleGVjdXRhYmxlPSciJXMiJyAlIGV4ZWN1dGFibGUKKyAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KKyAgICAgICAgICAgICAgICBzcGF3bihbZXhlY3V0YWJsZSwnLUUnLCctYycsJ3Bhc3MnXSwwKQorCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRFU1QgUEFTU0VEOiAlcyBhcHBlYXJzIHRvIHN1cHBvcnQgLnB0aCBmaWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZGlyCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgZjogZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6IG9zLnVubGluayhva19maWxlKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHB0aF9maWxlKTogb3MudW5saW5rKHB0aF9maWxlKQorICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgorICAgICAgICAgICAgbG9nLndhcm4oIlRFU1QgRkFJTEVEOiAlcyBkb2VzIE5PVCBzdXBwb3J0IC5wdGggZmlsZXMiLCBpbnN0ZGlyKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBpbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpOgorICAgICAgICAiIiJXcml0ZSBhbGwgdGhlIHNjcmlwdHMgZm9yIGBkaXN0YCwgdW5sZXNzIHNjcmlwdHMgYXJlIGV4Y2x1ZGVkIiIiCisKKyAgICAgICAgc2VsZi5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhkaXN0KQorICAgICAgICBpZiBzZWxmLmV4Y2x1ZGVfc2NyaXB0cyBvciBub3QgZGlzdC5tZXRhZGF0YV9pc2Rpcignc2NyaXB0cycpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIHNjcmlwdF9uYW1lIGluIGRpc3QubWV0YWRhdGFfbGlzdGRpcignc2NyaXB0cycpOgorICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdCgKKyAgICAgICAgICAgICAgICBkaXN0LCBzY3JpcHRfbmFtZSwKKyAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YSgnc2NyaXB0cy8nK3NjcmlwdF9uYW1lKS5yZXBsYWNlKCdccicsJ1xuJykKKyAgICAgICAgICAgICkKKworICAgIGRlZiBhZGRfb3V0cHV0KHNlbGYsIHBhdGgpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCk6CisgICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKG9zLnBhdGguam9pbihiYXNlLGZpbGVuYW1lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQocGF0aCkKKworICAgIGRlZiBub3RfZWRpdGFibGUoc2VsZiwgc3BlYyk6CisgICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAlcjogeW91IGNhbid0IHVzZSBmaWxlbmFtZXMgb3IgVVJMcyAiCisgICAgICAgICAgICAgICAgIndpdGggLS1lZGl0YWJsZSAoZXhjZXB0IHZpYSB0aGUgLS1maW5kLWxpbmtzIG9wdGlvbikuIgorICAgICAgICAgICAgICAgICUgKHNwZWMsKQorICAgICAgICAgICAgKQorCisgICAgZGVmIGNoZWNrX2VkaXRhYmxlKHNlbGYsc3BlYyk6CisgICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCisgICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBjYW4ndCBkbyBhIGNoZWNrb3V0IHRoZXJlIiAlCisgICAgICAgICAgICAgICAgKHNwZWMua2V5LCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSkKKyAgICAgICAgICAgICkKKworCisKKyAgICBkZWYgZWFzeV9pbnN0YWxsKHNlbGYsIHNwZWMsIGRlcHM9RmFsc2UpOgorICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0iZWFzeV9pbnN0YWxsLSIpCisgICAgICAgIGRvd25sb2FkID0gTm9uZQorICAgICAgICBzZWxmLmluc3RhbGxfc2l0ZV9weSgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYyxSZXF1aXJlbWVudCk6CisgICAgICAgICAgICAgICAgaWYgVVJMX1NDSEVNRShzcGVjKToKKyAgICAgICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIgYW5kIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZWRpdGFibGUoc3BlYykKKyAgICAgICAgICAgICAgICAgICAgZG93bmxvYWQgPSBzZWxmLnBhY2thZ2VfaW5kZXguZG93bmxvYWQoc3BlYywgdG1wZGlyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgZG93bmxvYWQsIHRtcGRpciwgZGVwcywgVHJ1ZSkKKworICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CisgICAgICAgICAgICAgICAgICAgICMgRXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnksIGp1c3QgcHJvY2VzcyBpdCBkaXJlY3RseQorICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lZGl0YWJsZShzcGVjKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgc3BlYywgdG1wZGlyLCBkZXBzLCBUcnVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNwZWMgPSBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYykKKworICAgICAgICAgICAgc2VsZi5jaGVja19lZGl0YWJsZShzcGVjKQorICAgICAgICAgICAgZGlzdCA9IHNlbGYucGFja2FnZV9pbmRleC5mZXRjaF9kaXN0cmlidXRpb24oCisgICAgICAgICAgICAgICAgc3BlYywgdG1wZGlyLCBzZWxmLnVwZ3JhZGUsIHNlbGYuZWRpdGFibGUsIG5vdCBzZWxmLmFsd2F5c19jb3B5CisgICAgICAgICAgICApCisKKyAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBtc2cgPSAiQ291bGQgbm90IGZpbmQgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGZvciAlciIgJSBzcGVjCisgICAgICAgICAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weToKKyAgICAgICAgICAgICAgICAgICAgbXNnKz0iICgtLWFsd2F5cy1jb3B5IHNraXBzIHN5c3RlbSBhbmQgZGV2ZWxvcG1lbnQgZWdncykiCisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQorICAgICAgICAgICAgZWxpZiBkaXN0LnByZWNlZGVuY2U9PURFVkVMT1BfRElTVDoKKyAgICAgICAgICAgICAgICAjIC5lZ2ctaW5mbyBkaXN0cyBkb24ndCBuZWVkIGluc3RhbGxpbmcsIGp1c3QgcHJvY2VzcyBkZXBzCisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzLCAiVXNpbmciKQorICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShzcGVjLCBkaXN0LmxvY2F0aW9uLCB0bXBkaXIsIGRlcHMpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRtcGRpcik6CisgICAgICAgICAgICAgICAgcm10cmVlKHRtcGRpcikKKworICAgIGRlZiBpbnN0YWxsX2l0ZW0oc2VsZiwgc3BlYywgZG93bmxvYWQsIHRtcGRpciwgZGVwcywgaW5zdGFsbF9uZWVkZWQ9RmFsc2UpOgorCisgICAgICAgICMgSW5zdGFsbGF0aW9uIGlzIGFsc28gbmVlZGVkIGlmIGZpbGUgaW4gdG1wZGlyIG9yIGlzIG5vdCBhbiBlZ2cKKyAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBvcy5wYXRoLmRpcm5hbWUoZG93bmxvYWQpID09IHRtcGRpcgorICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIG5vdCBkb3dubG9hZC5lbmRzd2l0aCgnLmVnZycpCisKKyAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgJXMiLCBvcy5wYXRoLmJhc2VuYW1lKGRvd25sb2FkKSkKKworICAgICAgICBpZiBpbnN0YWxsX25lZWRlZCBvciBzZWxmLmFsd2F5c19jb3B5OgorICAgICAgICAgICAgZGlzdHMgPSBzZWxmLmluc3RhbGxfZWdncyhzcGVjLCBkb3dubG9hZCwgdG1wZGlyKQorICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGlzdHMgPSBbc2VsZi5jaGVja19jb25mbGljdHMoc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRvd25sb2FkKSldCisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3RzWzBdLCBkZXBzLCAiVXNpbmciKQorCisgICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKKyAgICAgICAgICAgICAgICBpZiBkaXN0IGluIHNwZWM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgZGVmIHByb2Nlc3NfZGlzdHJpYnV0aW9uKHNlbGYsIHJlcXVpcmVtZW50LCBkaXN0LCBkZXBzPVRydWUsICppbmZvKToKKyAgICAgICAgc2VsZi51cGRhdGVfcHRoKGRpc3QpCisgICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGQoZGlzdCkKKyAgICAgICAgc2VsZi5sb2NhbF9pbmRleC5hZGQoZGlzdCkKKyAgICAgICAgc2VsZi5pbnN0YWxsX2VnZ19zY3JpcHRzKGRpc3QpCisgICAgICAgIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzW2Rpc3Qua2V5XSA9IGRpc3QKKyAgICAgICAgbG9nLndhcm4oc2VsZi5pbnN0YWxsYXRpb25fcmVwb3J0KHJlcXVpcmVtZW50LCBkaXN0LCAqaW5mbykpCisgICAgICAgIGlmIG5vdCBkZXBzIGFuZCBub3Qgc2VsZi5hbHdheXNfY29weToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIG5vdCBOb25lIGFuZCBkaXN0LmtleSAhPSByZXF1aXJlbWVudC5rZXk6CisgICAgICAgICAgICBsb2cud2FybigiU2tpcHBpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIGRpc3QpCisgICAgICAgICAgICByZXR1cm4gICMgWFhYIHRoaXMgaXMgbm90IHRoZSBkaXN0cmlidXRpb24gd2Ugd2VyZSBsb29raW5nIGZvcgorICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIE5vbmUgb3IgZGlzdCBub3QgaW4gcmVxdWlyZW1lbnQ6CisgICAgICAgICAgICAjIGlmIHdlIHdvdW5kIHVwIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiwgcmVzb2x2ZSB3aGF0IHdlJ3ZlIGdvdAorICAgICAgICAgICAgZGlzdHJlcSA9IGRpc3QuYXNfcmVxdWlyZW1lbnQoKQorICAgICAgICAgICAgcmVxdWlyZW1lbnQgPSByZXF1aXJlbWVudCBvciBkaXN0cmVxCisgICAgICAgICAgICByZXF1aXJlbWVudCA9IFJlcXVpcmVtZW50KAorICAgICAgICAgICAgICAgIGRpc3RyZXEucHJvamVjdF9uYW1lLCBkaXN0cmVxLnNwZWNzLCByZXF1aXJlbWVudC5leHRyYXMKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0Jyk6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkX2ZpbmRfbGlua3MoCisgICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKKyAgICAgICAgICAgICkKKyAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIHJlcXVpcmVtZW50KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkaXN0cm9zID0gV29ya2luZ1NldChbXSkucmVzb2x2ZSgKKyAgICAgICAgICAgICAgICBbcmVxdWlyZW1lbnRdLCBzZWxmLmxvY2FsX2luZGV4LCBzZWxmLmVhc3lfaW5zdGFsbAorICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgRGlzdHJpYnV0aW9uTm90Rm91bmQsIGU6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgcmVxdWlyZWQgZGlzdHJpYnV0aW9uICVzIiAlIGUuYXJncworICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0LCBlOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgIkluc3RhbGxlZCBkaXN0cmlidXRpb24gJXMgY29uZmxpY3RzIHdpdGggcmVxdWlyZW1lbnQgJXMiCisgICAgICAgICAgICAgICAgJSBlLmFyZ3MKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weToKKyAgICAgICAgICAgICMgRm9yY2UgYWxsIHRoZSByZWxldmFudCBkaXN0cm9zIHRvIGJlIGNvcGllZCBvciBhY3RpdmF0ZWQKKyAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3Ryb3M6CisgICAgICAgICAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChkaXN0LmFzX3JlcXVpcmVtZW50KCkpCisKKyAgICBkZWYgc2hvdWxkX3VuemlwKHNlbGYsIGRpc3QpOgorICAgICAgICBpZiBzZWxmLnppcF9vayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZi56aXBfb2sKKyAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ25vdC16aXAtc2FmZScpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgbm90IGRpc3QuaGFzX21ldGFkYXRhKCd6aXAtc2FmZScpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgbWF5YmVfbW92ZShzZWxmLCBzcGVjLCBkaXN0X2ZpbGVuYW1lLCBzZXR1cF9iYXNlKToKKyAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0KToKKyAgICAgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBidWlsZCBkaXJlY3RvcnkgJXMgd2lsbCBub3QgYmUga2VwdCIsCisgICAgICAgICAgICAgICBzcGVjLmtleSwgc2VsZi5idWlsZF9kaXJlY3RvcnksIHNldHVwX2Jhc2UKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHJldHVybiBzZXR1cF9iYXNlCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CisgICAgICAgICAgICBzZXR1cF9iYXNlID0gZGlzdF9maWxlbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGRpc3RfZmlsZW5hbWUpPT1zZXR1cF9iYXNlOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhkaXN0X2ZpbGVuYW1lKSAgICMgZ2V0IGl0IG91dCBvZiB0aGUgdG1wIGRpcgorICAgICAgICAgICAgY29udGVudHMgPSBvcy5saXN0ZGlyKHNldHVwX2Jhc2UpCisgICAgICAgICAgICBpZiBsZW4oY29udGVudHMpPT0xOgorICAgICAgICAgICAgICAgIGRpc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSxjb250ZW50c1swXSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBvbmx5IHRoaW5nIHRoZXJlIGlzIGEgZGlyZWN0b3J5LCBtb3ZlIGl0IGluc3RlYWQKKyAgICAgICAgICAgICAgICAgICAgc2V0dXBfYmFzZSA9IGRpc3RfZmlsZW5hbWUKKyAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkc3QpOyBzaHV0aWwubW92ZShzZXR1cF9iYXNlLCBkc3QpCisgICAgICAgIHJldHVybiBkc3QKKworICAgIGRlZiBpbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhzZWxmLCBkaXN0KToKKyAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZV9zY3JpcHRzOgorICAgICAgICAgICAgZm9yIGFyZ3MgaW4gZ2V0X3NjcmlwdF9hcmdzKGRpc3QpOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KCphcmdzKQorCisKKworCisKKworICAgIGRlZiBpbnN0YWxsX3NjcmlwdChzZWxmLCBkaXN0LCBzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQsIGRldl9wYXRoPU5vbmUpOgorICAgICAgICAiIiJHZW5lcmF0ZSBhIGxlZ2FjeSBzY3JpcHQgd3JhcHBlciBhbmQgaW5zdGFsbCBpdCIiIgorICAgICAgICBzcGVjID0gc3RyKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKKworICAgICAgICBpZiBkZXZfcGF0aDoKKyAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gZ2V0X3NjcmlwdF9oZWFkZXIoc2NyaXB0X3RleHQpICsgKAorICAgICAgICAgICAgICAgICIjIEVBU1ktSU5TVEFMTC1ERVYtU0NSSVBUOiAlKHNwZWMpciwlKHNjcmlwdF9uYW1lKXJcbiIKKyAgICAgICAgICAgICAgICAiX19yZXF1aXJlc19fID0gJShzcGVjKXJcbiIKKyAgICAgICAgICAgICAgICAiZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCByZXF1aXJlOyByZXF1aXJlKCUoc3BlYylyKVxuIgorICAgICAgICAgICAgICAgICJkZWwgcmVxdWlyZVxuIgorICAgICAgICAgICAgICAgICJfX2ZpbGVfXyA9ICUoZGV2X3BhdGgpclxuIgorICAgICAgICAgICAgICAgICJleGVjZmlsZShfX2ZpbGVfXylcbiIKKyAgICAgICAgICAgICkgJSBsb2NhbHMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBnZXRfc2NyaXB0X2hlYWRlcihzY3JpcHRfdGV4dCkgKyAoCisgICAgICAgICAgICAgICAgIiMgRUFTWS1JTlNUQUxMLVNDUklQVDogJShzcGVjKXIsJShzY3JpcHRfbmFtZSlyXG4iCisgICAgICAgICAgICAgICAgIl9fcmVxdWlyZXNfXyA9ICUoc3BlYylyXG4iCisgICAgICAgICAgICAgICAgImltcG9ydCBwa2dfcmVzb3VyY2VzXG4iCisgICAgICAgICAgICAgICAgInBrZ19yZXNvdXJjZXMucnVuX3NjcmlwdCglKHNwZWMpciwgJShzY3JpcHRfbmFtZSlyKVxuIgorICAgICAgICAgICAgKSAlIGxvY2FscygpCisKKyAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0KQorCisgICAgZGVmIHdyaXRlX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgY29udGVudHMsIG1vZGU9InQiLCBibG9ja2Vycz0oKSk6CisgICAgICAgICIiIldyaXRlIGFuIGV4ZWN1dGFibGUgZmlsZSB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkiIiIKKyAgICAgICAgc2VsZi5kZWxldGVfYmxvY2tlcnMoICAgIyBjbGVhbiB1cCBvbGQgLnB5Ly5weXcgdy9vIGEgc2NyaXB0CisgICAgICAgICAgICBbb3MucGF0aC5qb2luKHNlbGYuc2NyaXB0X2Rpcix4KSBmb3IgeCBpbiBibG9ja2Vyc10pCisgICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLnNjcmlwdF9kaXIpCisgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLnNjcmlwdF9kaXIsIHNjcmlwdF9uYW1lKQorICAgICAgICBzZWxmLmFkZF9vdXRwdXQodGFyZ2V0KQorCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKKyAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwidyIrbW9kZSkKKyAgICAgICAgICAgIGYud3JpdGUoY29udGVudHMpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5jaG1vZCh0YXJnZXQsMDc1NSkKKyAgICAgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIG9zLmVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgaW5zdGFsbF9lZ2dzKHNlbGYsIHNwZWMsIGRpc3RfZmlsZW5hbWUsIHRtcGRpcik6CisgICAgICAgICMgLmVnZyBkaXJzIG9yIGZpbGVzIGFyZSBhbHJlYWR5IGJ1aWx0LCBzbyBqdXN0IHJldHVybiB0aGVtCisgICAgICAgIGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpOgorICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfZWdnKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCisgICAgICAgIGVsaWYgZGlzdF9maWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZXhlJyk6CisgICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF9leGUoZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KKworICAgICAgICAjIEFueXRoaW5nIGVsc2UsIHRyeSB0byBleHRyYWN0IGFuZCBidWlsZAorICAgICAgICBzZXR1cF9iYXNlID0gdG1wZGlyCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGRpc3RfZmlsZW5hbWUpIGFuZCBub3QgZGlzdF9maWxlbmFtZS5lbmRzd2l0aCgnLnB5Jyk6CisgICAgICAgICAgICB1bnBhY2tfYXJjaGl2ZShkaXN0X2ZpbGVuYW1lLCB0bXBkaXIsIHNlbGYudW5wYWNrX3Byb2dyZXNzKQorICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CisgICAgICAgICAgICBzZXR1cF9iYXNlID0gb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCisKKyAgICAgICAgaWYgKHNldHVwX2Jhc2Uuc3RhcnRzd2l0aCh0bXBkaXIpICAgIyBzb21ldGhpbmcgd2UgZG93bmxvYWRlZAorICAgICAgICAgICAgYW5kIHNlbGYuYnVpbGRfZGlyZWN0b3J5IGFuZCBzcGVjIGlzIG5vdCBOb25lCisgICAgICAgICk6CisgICAgICAgICAgICBzZXR1cF9iYXNlID0gc2VsZi5tYXliZV9tb3ZlKHNwZWMsIGRpc3RfZmlsZW5hbWUsIHNldHVwX2Jhc2UpCisKKyAgICAgICAgIyBGaW5kIHRoZSBzZXR1cC5weSBmaWxlCisgICAgICAgIHNldHVwX3NjcmlwdCA9IG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCAnc2V0dXAucHknKQorCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZXR1cF9zY3JpcHQpOgorICAgICAgICAgICAgc2V0dXBzID0gZ2xvYihvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgJyonLCAnc2V0dXAucHknKSkKKyAgICAgICAgICAgIGlmIG5vdCBzZXR1cHM6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGEgc2V0dXAgc2NyaXB0IGluICVzIiAlIGRpc3RfZmlsZW5hbWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBpZiBsZW4oc2V0dXBzKT4xOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgc2V0dXAgc2NyaXB0cyBpbiAlcyIgJSBkaXN0X2ZpbGVuYW1lCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2V0dXBfc2NyaXB0ID0gc2V0dXBzWzBdCisKKyAgICAgICAgIyBOb3cgcnVuIGl0LCBhbmQgcmV0dXJuIHRoZSByZXN1bHQKKyAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKKyAgICAgICAgICAgIGxvZy53YXJuKHNlbGYucmVwb3J0X2VkaXRhYmxlKHNwZWMsIHNldHVwX3NjcmlwdCkpCisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX2FuZF9pbnN0YWxsKHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSkKKworICAgIGRlZiBlZ2dfZGlzdHJpYnV0aW9uKHNlbGYsIGVnZ19wYXRoKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6CisgICAgICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCxvcy5wYXRoLmpvaW4oZWdnX3BhdGgsJ0VHRy1JTkZPJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKHppcGltcG9ydC56aXBpbXBvcnRlcihlZ2dfcGF0aCkpCisgICAgICAgIHJldHVybiBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCxtZXRhZGF0YT1tZXRhZGF0YSkKKworICAgIGRlZiBpbnN0YWxsX2VnZyhzZWxmLCBlZ2dfcGF0aCwgdG1wZGlyKToKKyAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpcixvcy5wYXRoLmJhc2VuYW1lKGVnZ19wYXRoKSkKKyAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoZGVzdGluYXRpb24pCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRlc3RpbmF0aW9uKQorCisgICAgICAgIGRpc3QgPSBzZWxmLmVnZ19kaXN0cmlidXRpb24oZWdnX3BhdGgpCisgICAgICAgIHNlbGYuY2hlY2tfY29uZmxpY3RzKGRpc3QpCisgICAgICAgIGlmIG5vdCBzYW1lZmlsZShlZ2dfcGF0aCwgZGVzdGluYXRpb24pOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkZXN0aW5hdGlvbikgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhkZXN0aW5hdGlvbik6CisgICAgICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoZGVzdGluYXRpb24sIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhkZXN0aW5hdGlvbik6CisgICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKG9zLnVubGluaywoZGVzdGluYXRpb24sKSwiUmVtb3ZpbmcgIitkZXN0aW5hdGlvbikKKyAgICAgICAgICAgIHVuY2FjaGVfemlwZGlyKGRlc3RpbmF0aW9uKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6CisgICAgICAgICAgICAgICAgaWYgZWdnX3BhdGguc3RhcnRzd2l0aCh0bXBkaXIpOgorICAgICAgICAgICAgICAgICAgICBmLG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmLG0gPSBzaHV0aWwuY29weXRyZWUsICJDb3B5aW5nIgorICAgICAgICAgICAgZWxpZiBzZWxmLnNob3VsZF91bnppcChkaXN0KToKKyAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChkZXN0aW5hdGlvbikKKyAgICAgICAgICAgICAgICBmLG0gPSBzZWxmLnVucGFja19hbmRfY29tcGlsZSwgIkV4dHJhY3RpbmciCisgICAgICAgICAgICBlbGlmIGVnZ19wYXRoLnN0YXJ0c3dpdGgodG1wZGlyKToKKyAgICAgICAgICAgICAgICBmLG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZixtID0gc2h1dGlsLmNvcHkyLCAiQ29weWluZyIKKworICAgICAgICAgICAgc2VsZi5leGVjdXRlKGYsIChlZ2dfcGF0aCwgZGVzdGluYXRpb24pLAorICAgICAgICAgICAgICAgIChtKyIgJXMgdG8gJXMiKSAlCisgICAgICAgICAgICAgICAgKG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpLG9zLnBhdGguZGlybmFtZShkZXN0aW5hdGlvbikpKQorCisgICAgICAgIHNlbGYuYWRkX291dHB1dChkZXN0aW5hdGlvbikKKyAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkZXN0aW5hdGlvbikKKworICAgIGRlZiBpbnN0YWxsX2V4ZShzZWxmLCBkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpOgorICAgICAgICAjIFNlZSBpZiBpdCdzIHZhbGlkLCBnZXQgZGF0YQorICAgICAgICBjZmcgPSBleHRyYWN0X3dpbmluc3RfY2ZnKGRpc3RfZmlsZW5hbWUpCisgICAgICAgIGlmIGNmZyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHZhbGlkIGRpc3R1dGlscyBXaW5kb3dzIC5leGUiICUgZGlzdF9maWxlbmFtZQorICAgICAgICAgICAgKQorICAgICAgICAjIENyZWF0ZSBhIGR1bW15IGRpc3RyaWJ1dGlvbiBvYmplY3QgdW50aWwgd2UgYnVpbGQgdGhlIHJlYWwgZGlzdHJvCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oTm9uZSwKKyAgICAgICAgICAgIHByb2plY3RfbmFtZT1jZmcuZ2V0KCdtZXRhZGF0YScsJ25hbWUnKSwKKyAgICAgICAgICAgIHZlcnNpb249Y2ZnLmdldCgnbWV0YWRhdGEnLCd2ZXJzaW9uJyksIHBsYXRmb3JtPSJ3aW4zMiIKKyAgICAgICAgKQorCisgICAgICAgICMgQ29udmVydCB0aGUgLmV4ZSB0byBhbiB1bnBhY2tlZCBlZ2cKKyAgICAgICAgZWdnX3BhdGggPSBkaXN0LmxvY2F0aW9uID0gb3MucGF0aC5qb2luKHRtcGRpciwgZGlzdC5lZ2dfbmFtZSgpKycuZWdnJykKKyAgICAgICAgZWdnX3RtcCAgPSBlZ2dfcGF0aCsnLnRtcCcKKyAgICAgICAgZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJykKKyAgICAgICAgcGtnX2luZiA9IG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ1BLRy1JTkZPJykKKyAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShwa2dfaW5mKSAgICMgbWFrZSBzdXJlIEVHRy1JTkZPIGRpciBleGlzdHMKKyAgICAgICAgZGlzdC5fcHJvdmlkZXIgPSBQYXRoTWV0YWRhdGEoZWdnX3RtcCwgZWdnX2luZm8pICAgICMgWFhYCisgICAgICAgIHNlbGYuZXhlX3RvX2VnZyhkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wKQorCisgICAgICAgICMgV3JpdGUgRUdHLUlORk8vUEtHLUlORk8KKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBrZ19pbmYpOgorICAgICAgICAgICAgZiA9IG9wZW4ocGtnX2luZiwndycpCisgICAgICAgICAgICBmLndyaXRlKCdNZXRhZGF0YS1WZXJzaW9uOiAxLjBcbicpCisgICAgICAgICAgICBmb3Igayx2IGluIGNmZy5pdGVtcygnbWV0YWRhdGEnKToKKyAgICAgICAgICAgICAgICBpZiBrPD4ndGFyZ2V0X3ZlcnNpb24nOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCclczogJXNcbicgJSAoay5yZXBsYWNlKCdfJywnLScpLnRpdGxlKCksIHYpKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oZWdnX2luZm8sJ3NjcmlwdHMnKQorICAgICAgICBzZWxmLmRlbGV0ZV9ibG9ja2VycyggICAjIGRlbGV0ZSBlbnRyeS1wb2ludCBzY3JpcHRzIHRvIGF2b2lkIGR1cGluZworICAgICAgICAgICAgW29zLnBhdGguam9pbihzY3JpcHRfZGlyLGFyZ3NbMF0pIGZvciBhcmdzIGluIGdldF9zY3JpcHRfYXJncyhkaXN0KV0KKyAgICAgICAgKQorICAgICAgICAjIEJ1aWxkIC5lZ2cgZmlsZSBmcm9tIHRtcGRpcgorICAgICAgICBiZGlzdF9lZ2cubWFrZV96aXBmaWxlKAorICAgICAgICAgICAgZWdnX3BhdGgsIGVnZ190bXAsIHZlcmJvc2U9c2VsZi52ZXJib3NlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bgorICAgICAgICApCisgICAgICAgICMgaW5zdGFsbCB0aGUgLmVnZworICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2VnZyhlZ2dfcGF0aCwgdG1wZGlyKQorCisgICAgZGVmIGV4ZV90b19lZ2coc2VsZiwgZGlzdF9maWxlbmFtZSwgZWdnX3RtcCk6CisgICAgICAgICIiIkV4dHJhY3QgYSBiZGlzdF93aW5pbnN0IHRvIHRoZSBkaXJlY3RvcmllcyBhbiBlZ2cgd291bGQgdXNlIiIiCisgICAgICAgICMgQ2hlY2sgZm9yIC5wdGggZmlsZSBhbmQgc2V0IHVwIHByZWZpeCB0cmFuc2xhdGlvbnMKKyAgICAgICAgcHJlZml4ZXMgPSBnZXRfZXhlX3ByZWZpeGVzKGRpc3RfZmlsZW5hbWUpCisgICAgICAgIHRvX2NvbXBpbGUgPSBbXQorICAgICAgICBuYXRpdmVfbGlicyA9IFtdCisgICAgICAgIHRvcF9sZXZlbCA9IHt9CisKKyAgICAgICAgZGVmIHByb2Nlc3Moc3JjLGRzdCk6CisgICAgICAgICAgICBmb3Igb2xkLG5ldyBpbiBwcmVmaXhlczoKKyAgICAgICAgICAgICAgICBpZiBzcmMuc3RhcnRzd2l0aChvbGQpOgorICAgICAgICAgICAgICAgICAgICBzcmMgPSBuZXcrc3JjW2xlbihvbGQpOl0KKyAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBzcmMuc3BsaXQoJy8nKQorICAgICAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgKnBhcnRzKQorICAgICAgICAgICAgICAgICAgICBkbCA9IGRzdC5sb3dlcigpCisgICAgICAgICAgICAgICAgICAgIGlmIGRsLmVuZHN3aXRoKCcucHlkJykgb3IgZGwuZW5kc3dpdGgoJy5kbGwnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZXZlbFtvcy5wYXRoLnNwbGl0ZXh0KHBhcnRzWzBdKVswXV0gPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfbGlicy5hcHBlbmQoc3JjKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGRsLmVuZHN3aXRoKCcucHknKSBhbmQgb2xkIT0nU0NSSVBUUy8nOgorICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xldmVsW29zLnBhdGguc3BsaXRleHQocGFydHNbMF0pWzBdXSA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKGRzdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRzdAorICAgICAgICAgICAgaWYgbm90IHNyYy5lbmRzd2l0aCgnLnB0aCcpOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJXQVJOSU5HOiBjYW4ndCBwcm9jZXNzICVzIiwgc3JjKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIGV4dHJhY3QsIHRyYWNraW5nIC5weWQvLmRsbC0+bmF0aXZlX2xpYnMgYW5kIC5weSAtPiB0b19jb21waWxlCisgICAgICAgIHVucGFja19hcmNoaXZlKGRpc3RfZmlsZW5hbWUsIGVnZ190bXAsIHByb2Nlc3MpCisgICAgICAgIHN0dWJzID0gW10KKyAgICAgICAgZm9yIHJlcyBpbiBuYXRpdmVfbGliczoKKyAgICAgICAgICAgIGlmIHJlcy5sb3dlcigpLmVuZHN3aXRoKCcucHlkJyk6ICAgICMgY3JlYXRlIHN0dWJzIGZvciAucHlkJ3MKKyAgICAgICAgICAgICAgICBwYXJ0cyA9IHJlcy5zcGxpdCgnLycpCisgICAgICAgICAgICAgICAgcmVzb3VyY2UsIHBhcnRzWy0xXSA9IHBhcnRzWy0xXSwgcGFydHNbLTFdWzotMV0KKyAgICAgICAgICAgICAgICBweWZpbGUgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgKnBhcnRzKQorICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKHB5ZmlsZSk7IHN0dWJzLmFwcGVuZChweWZpbGUpCisgICAgICAgICAgICAgICAgYmRpc3RfZWdnLndyaXRlX3N0dWIocmVzb3VyY2UsIHB5ZmlsZSkKKworICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKSAgICMgY29tcGlsZSAucHkncworICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc2FmZXR5X2ZsYWcob3MucGF0aC5qb2luKGVnZ190bXAsJ0VHRy1JTkZPJyksCisgICAgICAgICAgICBiZGlzdF9lZ2cuYW5hbHl6ZV9lZ2coZWdnX3RtcCwgc3R1YnMpKSAgIyB3cml0ZSB6aXAtc2FmZXR5IGZsYWcKKworICAgICAgICBmb3IgbmFtZSBpbiAndG9wX2xldmVsJywnbmF0aXZlX2xpYnMnOgorICAgICAgICAgICAgaWYgbG9jYWxzKClbbmFtZV06CisgICAgICAgICAgICAgICAgdHh0ID0gb3MucGF0aC5qb2luKGVnZ190bXAsICdFR0ctSU5GTycsIG5hbWUrJy50eHQnKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0eHQpOgorICAgICAgICAgICAgICAgICAgICBvcGVuKHR4dCwndycpLndyaXRlKCdcbicuam9pbihsb2NhbHMoKVtuYW1lXSkrJ1xuJykKKworICAgIGRlZiBjaGVja19jb25mbGljdHMoc2VsZiwgZGlzdCk6CisgICAgICAgICIiIlZlcmlmeSB0aGF0IHRoZXJlIGFyZSBubyBjb25mbGljdGluZyAib2xkLXN0eWxlIiBwYWNrYWdlcyIiIgorCisgICAgICAgIHJldHVybiBkaXN0ICAgICAjIFhYWCB0ZW1wb3JhcmlseSBkaXNhYmxlIHVudGlsIG5ldyBzdHJhdGVneSBpcyBzdGFibGUKKyAgICAgICAgZnJvbSBpbXAgaW1wb3J0IGZpbmRfbW9kdWxlLCBnZXRfc3VmZml4ZXMKKyAgICAgICAgZnJvbSBnbG9iIGltcG9ydCBnbG9iCisKKyAgICAgICAgYmxvY2tlcnMgPSBbXQorICAgICAgICBuYW1lcyA9IGRpY3QuZnJvbWtleXMoZGlzdC5fZ2V0X21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0JykpICMgWFhYIHByaXZhdGUgYXR0cgorCisgICAgICAgIGV4dHMgPSB7Jy5weWMnOjEsICcucHlvJzoxfSAgICAgIyBnZXRfc3VmZml4ZXMoKSBtaWdodCBsZWF2ZSBvbmUgb3V0CisgICAgICAgIGZvciBleHQsbW9kZSx0eXAgaW4gZ2V0X3N1ZmZpeGVzKCk6CisgICAgICAgICAgICBleHRzW2V4dF0gPSAxCisKKyAgICAgICAgZm9yIHBhdGgsZmlsZXMgaW4gZXhwYW5kX3BhdGhzKFtzZWxmLmluc3RhbGxfZGlyXStzZWxmLmFsbF9zaXRlX2RpcnMpOgorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIGJhc2UsZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBiYXNlIGluIG5hbWVzOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXh0OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBleHRlbnNpb24sIGNoZWNrIGZvciBwYWNrYWdlCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgZmlsZW5hbWUsIGRlc2NyID0gZmluZF9tb2R1bGUoYmFzZSwgW3BhdGhdKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGY6IGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lIG5vdCBpbiBibG9ja2VyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tlcnMuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGV4dCBpbiBleHRzIGFuZCBiYXNlIT0nc2l0ZSc6ICAjIFhYWCB1Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrZXJzLmFwcGVuZChvcy5wYXRoLmpvaW4ocGF0aCxmaWxlbmFtZSkpCisgICAgICAgIGlmIGJsb2NrZXJzOgorICAgICAgICAgICAgc2VsZi5mb3VuZF9jb25mbGljdHMoZGlzdCwgYmxvY2tlcnMpCisKKyAgICAgICAgcmV0dXJuIGRpc3QKKworICAgIGRlZiBmb3VuZF9jb25mbGljdHMoc2VsZiwgZGlzdCwgYmxvY2tlcnMpOgorICAgICAgICBpZiBzZWxmLmRlbGV0ZV9jb25mbGljdGluZzoKKyAgICAgICAgICAgIGxvZy53YXJuKCJBdHRlbXB0aW5nIHRvIGRlbGV0ZSBjb25mbGljdGluZyBwYWNrYWdlczoiKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsZXRlX2Jsb2NrZXJzKGJsb2NrZXJzKQorCisgICAgICAgIG1zZyA9ICIiIlwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NPTkZMSUNUIFdBUk5JTkc6CisKK1RoZSBmb2xsb3dpbmcgbW9kdWxlcyBvciBwYWNrYWdlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIG1vZHVsZXMgb3IKK3BhY2thZ2VzIGJlaW5nIGluc3RhbGxlZCwgYW5kIHdpbGwgYmUgKmJlZm9yZSogdGhlIGluc3RhbGxlZCBwYWNrYWdlcyBpbgorUHl0aG9uJ3Mgc2VhcmNoIHBhdGguICBZb3UgTVVTVCByZW1vdmUgYWxsIG9mIHRoZSByZWxldmFudCBmaWxlcyBhbmQKK2RpcmVjdG9yaWVzIGJlZm9yZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgcGFja2FnZShzKSB5b3UgYXJlCitpbnN0YWxsaW5nOgorCisgICAlcworCisiIiIgJSAnXG4gICAnLmpvaW4oYmxvY2tlcnMpCisKKyAgICAgICAgaWYgc2VsZi5pZ25vcmVfY29uZmxpY3RzX2F0X215X3Jpc2s6CisgICAgICAgICAgICBtc2cgKz0gIiIiXAorKE5vdGU6IHlvdSBjYW4gcnVuIEVhc3lJbnN0YWxsIG9uICclcycgd2l0aCB0aGUKKy0tZGVsZXRlLWNvbmZsaWN0aW5nIG9wdGlvbiB0byBhdHRlbXB0IGRlbGV0aW9uIG9mIHRoZSBhYm92ZSBmaWxlcworYW5kL29yIGRpcmVjdG9yaWVzLikKKyIiIiAlIGRpc3QucHJvamVjdF9uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgKz0gIiIiXAorTm90ZTogeW91IGNhbiBhdHRlbXB0IHRoaXMgaW5zdGFsbGF0aW9uIGFnYWluIHdpdGggRWFzeUluc3RhbGwsIGFuZCB1c2UKK2VpdGhlciB0aGUgLS1kZWxldGUtY29uZmxpY3RpbmcgKC1EKSBvcHRpb24gb3IgdGhlCistLWlnbm9yZS1jb25mbGljdHMtYXQtbXktcmlzayBvcHRpb24sIHRvIGVpdGhlciBkZWxldGUgdGhlIGFib3ZlIGZpbGVzCithbmQgZGlyZWN0b3JpZXMsIG9yIHRvIGlnbm9yZSB0aGUgY29uZmxpY3RzLCByZXNwZWN0aXZlbHkuICBOb3RlIHRoYXQgaWYKK3lvdSBpZ25vcmUgdGhlIGNvbmZsaWN0cywgdGhlIGluc3RhbGxlZCBwYWNrYWdlKHMpIG1heSBub3Qgd29yay4KKyIiIgorICAgICAgICBtc2cgKz0gIiIiXAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiIiCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQorICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlX2NvbmZsaWN0c19hdF9teV9yaXNrOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIkluc3RhbGxhdGlvbiBhYm9ydGVkIGR1ZSB0byBjb25mbGljdHMiKQorCisgICAgZGVmIGluc3RhbGxhdGlvbl9yZXBvcnQoc2VsZiwgcmVxLCBkaXN0LCB3aGF0PSJJbnN0YWxsZWQiKToKKyAgICAgICAgIiIiSGVscGZ1bCBpbnN0YWxsYXRpb24gbWVzc2FnZSBmb3IgZGlzcGxheSB0byBwYWNrYWdlIHVzZXJzIiIiCisgICAgICAgIG1zZyA9ICJcbiUod2hhdClzICUoZWdnbG9jKXMlKGV4dHJhcylzIgorICAgICAgICBpZiBzZWxmLm11bHRpX3ZlcnNpb24gYW5kIG5vdCBzZWxmLm5vX3JlcG9ydDoKKyAgICAgICAgICAgIG1zZyArPSAiIiIKKworQmVjYXVzZSB0aGlzIGRpc3RyaWJ1dGlvbiB3YXMgaW5zdGFsbGVkIC0tbXVsdGktdmVyc2lvbiBvciAtLWluc3RhbGwtZGlyLAorYmVmb3JlIHlvdSBjYW4gaW1wb3J0IG1vZHVsZXMgZnJvbSB0aGlzIHBhY2thZ2UgaW4gYW4gYXBwbGljYXRpb24sIHlvdQord2lsbCBuZWVkIHRvICdpbXBvcnQgcGtnX3Jlc291cmNlcycgYW5kIHRoZW4gdXNlIGEgJ3JlcXVpcmUoKScgY2FsbAorc2ltaWxhciB0byBvbmUgb2YgdGhlc2UgZXhhbXBsZXMsIGluIG9yZGVyIHRvIHNlbGVjdCB0aGUgZGVzaXJlZCB2ZXJzaW9uOgorCisgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcyIpICAjIGxhdGVzdCBpbnN0YWxsZWQgdmVyc2lvbgorICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXM9PSUodmVyc2lvbilzIikgICMgdGhpcyBleGFjdCB2ZXJzaW9uCisgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcz49JSh2ZXJzaW9uKXMiKSAgIyB0aGlzIHZlcnNpb24gb3IgaGlnaGVyCisiIiIKKyAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9kaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCxzeXMucGF0aCk6CisgICAgICAgICAgICAgICAgbXNnICs9ICIiIgorCitOb3RlIGFsc28gdGhhdCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBtdXN0IGJlIG9uIHN5cy5wYXRoIGF0IHJ1bnRpbWUgZm9yCit0aGlzIHRvIHdvcmsuICAoZS5nLiBieSBiZWluZyB0aGUgYXBwbGljYXRpb24ncyBzY3JpcHQgZGlyZWN0b3J5LCBieSBiZWluZyBvbgorUFlUSE9OUEFUSCwgb3IgYnkgYmVpbmcgYWRkZWQgdG8gc3lzLnBhdGggYnkgeW91ciBjb2RlLikKKyIiIgorICAgICAgICBlZ2dsb2MgPSBkaXN0LmxvY2F0aW9uCisgICAgICAgIG5hbWUgPSBkaXN0LnByb2plY3RfbmFtZQorICAgICAgICB2ZXJzaW9uID0gZGlzdC52ZXJzaW9uCisgICAgICAgIGV4dHJhcyA9ICcnICMgVE9ETzogc2VsZi5yZXBvcnRfZXh0cmFzKHJlcSwgZGlzdCkKKyAgICAgICAgcmV0dXJuIG1zZyAlIGxvY2FscygpCisKKyAgICBkZWYgcmVwb3J0X2VkaXRhYmxlKHNlbGYsIHNwZWMsIHNldHVwX3NjcmlwdCk6CisgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KQorICAgICAgICBweXRob24gPSBzeXMuZXhlY3V0YWJsZQorICAgICAgICByZXR1cm4gIiIiXG5FeHRyYWN0ZWQgZWRpdGFibGUgdmVyc2lvbiBvZiAlKHNwZWMpcyB0byAlKGRpcm5hbWUpcworCitJZiBpdCB1c2VzIHNldHVwdG9vbHMgaW4gaXRzIHNldHVwIHNjcmlwdCwgeW91IGNhbiBhY3RpdmF0ZSBpdCBpbgorImRldmVsb3BtZW50IiBtb2RlIGJ5IGdvaW5nIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nOjoKKworICAgICUocHl0aG9uKXMgc2V0dXAucHkgZGV2ZWxvcAorCitTZWUgdGhlIHNldHVwdG9vbHMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJkZXZlbG9wIiBjb21tYW5kIGZvciBtb3JlIGluZm8uCisiIiIgJSBsb2NhbHMoKQorCisgICAgZGVmIHJ1bl9zZXR1cChzZWxmLCBzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpOgorICAgICAgICBzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCdkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9lZ2cnLCBiZGlzdF9lZ2cpCisgICAgICAgIHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJ2Rpc3R1dGlscy5jb21tYW5kLmVnZ19pbmZvJywgZWdnX2luZm8pCisKKyAgICAgICAgYXJncyA9IGxpc3QoYXJncykKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlPjI6CisgICAgICAgICAgICB2ID0gJ3YnICogKHNlbGYudmVyYm9zZSAtIDEpCisgICAgICAgICAgICBhcmdzLmluc2VydCgwLCctJyt2KQorICAgICAgICBlbGlmIHNlbGYudmVyYm9zZTwyOgorICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwnLXEnKQorICAgICAgICBpZiBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBhcmdzLmluc2VydCgwLCctbicpCisgICAgICAgIGxvZy5pbmZvKAorICAgICAgICAgICAgIlJ1bm5pbmcgJXMgJXMiLCBzZXR1cF9zY3JpcHRbbGVuKHNldHVwX2Jhc2UpKzE6XSwgJyAnLmpvaW4oYXJncykKKyAgICAgICAgKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBhcmdzKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgdjoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJTZXR1cCBzY3JpcHQgZXhpdGVkIHdpdGggJXMiICUgKHYuYXJnc1swXSwpKQorCisgICAgZGVmIGJ1aWxkX2FuZF9pbnN0YWxsKHNlbGYsIHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSk6CisgICAgICAgIGFyZ3MgPSBbJ2JkaXN0X2VnZycsICctLWRpc3QtZGlyJ10KKyAgICAgICAgZGlzdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKAorICAgICAgICAgICAgcHJlZml4PSdlZ2ctZGlzdC10bXAtJywgZGlyPW9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpCisgICAgICAgICkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXJncy5hcHBlbmQoZGlzdF9kaXIpCisgICAgICAgICAgICBzZWxmLnJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpCisgICAgICAgICAgICBhbGxfZWdncyA9IEVudmlyb25tZW50KFtkaXN0X2Rpcl0pCisgICAgICAgICAgICBlZ2dzID0gW10KKyAgICAgICAgICAgIGZvciBrZXkgaW4gYWxsX2VnZ3M6CisgICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gYWxsX2VnZ3Nba2V5XToKKyAgICAgICAgICAgICAgICAgICAgZWdncy5hcHBlbmQoc2VsZi5pbnN0YWxsX2VnZyhkaXN0LmxvY2F0aW9uLCBzZXR1cF9iYXNlKSkKKyAgICAgICAgICAgIGlmIG5vdCBlZ2dzIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJObyBlZ2dzIGZvdW5kIGluICVzIChzZXR1cCBzY3JpcHQgcHJvYmxlbT8pIiwKKyAgICAgICAgICAgICAgICAgICAgZGlzdF9kaXIpCisgICAgICAgICAgICByZXR1cm4gZWdncworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcm10cmVlKGRpc3RfZGlyKQorICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKSAjIHJlc3RvcmUgb3VyIGxvZyB2ZXJib3NpdHkKKworICAgIGRlZiB1cGRhdGVfcHRoKHNlbGYsZGlzdCk6CisgICAgICAgIGlmIHNlbGYucHRoX2ZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBkIGluIHNlbGYucHRoX2ZpbGVbZGlzdC5rZXldOiAgICAjIGRyb3Agb2xkIGVudHJpZXMKKyAgICAgICAgICAgIGlmIHNlbGYubXVsdGlfdmVyc2lvbiBvciBkLmxvY2F0aW9uICE9IGRpc3QubG9jYXRpb246CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIGZyb20gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZCkKKyAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLnJlbW92ZShkKQorICAgICAgICAgICAgICAgIGlmIGQubG9jYXRpb24gaW4gc2VsZi5zaGFkb3dfcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5yZW1vdmUoZC5sb2NhdGlvbikKKworICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgorICAgICAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiBpbiBzZWxmLnB0aF9maWxlLnBhdGhzOgorICAgICAgICAgICAgICAgIGxvZy5pbmZvKAorICAgICAgICAgICAgICAgICAgICAiJXMgaXMgYWxyZWFkeSB0aGUgYWN0aXZlIHZlcnNpb24gaW4gZWFzeS1pbnN0YWxsLnB0aCIsCisgICAgICAgICAgICAgICAgICAgIGRpc3QKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBZGRpbmcgJXMgdG8gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZGlzdCkKKyAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLmFkZChkaXN0KSAjIGFkZCBuZXcgZW50cnkKKyAgICAgICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnNoYWRvd19wYXRoOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLmFwcGVuZChkaXN0LmxvY2F0aW9uKQorCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisKKyAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUuc2F2ZSgpCisKKyAgICAgICAgICAgIGlmIGRpc3Qua2V5PT0nc2V0dXB0b29scyc6CisgICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCBzZXR1cHRvb2xzIGl0c2VsZiBuZXZlciBiZWNvbWVzIHVuYXZhaWxhYmxlIQorICAgICAgICAgICAgICAgICMgWFhYIHNob3VsZCB0aGlzIGNoZWNrIGZvciBsYXRlc3QgdmVyc2lvbj8KKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCdzZXR1cHRvb2xzLnB0aCcpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoZmlsZW5hbWUpOiBvcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3dCcpCisgICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLnB0aF9maWxlLm1ha2VfcmVsYXRpdmUoZGlzdC5sb2NhdGlvbikrJ1xuJykKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB1bnBhY2tfcHJvZ3Jlc3Moc2VsZiwgc3JjLCBkc3QpOgorICAgICAgICAjIFByb2dyZXNzIGZpbHRlciBmb3IgdW5wYWNraW5nCisgICAgICAgIGxvZy5kZWJ1ZygiVW5wYWNraW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCisgICAgICAgIHJldHVybiBkc3QgICAgICMgb25seSB1bnBhY2stYW5kLWNvbXBpbGUgc2tpcHMgZmlsZXMgZm9yIGRyeSBydW4KKworICAgIGRlZiB1bnBhY2tfYW5kX2NvbXBpbGUoc2VsZiwgZWdnX3BhdGgsIGRlc3RpbmF0aW9uKToKKyAgICAgICAgdG9fY29tcGlsZSA9IFtdCisKKyAgICAgICAgZGVmIHBmKHNyYyxkc3QpOgorICAgICAgICAgICAgaWYgZHN0LmVuZHN3aXRoKCcucHknKSBhbmQgbm90IHNyYy5zdGFydHN3aXRoKCdFR0ctSU5GTy8nKToKKyAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChkc3QpCisgICAgICAgICAgICBzZWxmLnVucGFja19wcm9ncmVzcyhzcmMsZHN0KQorICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmRyeV9ydW4gYW5kIGRzdCBvciBOb25lCisKKyAgICAgICAgdW5wYWNrX2FyY2hpdmUoZWdnX3BhdGgsIGRlc3RpbmF0aW9uLCBwZikKKyAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkKKworCisgICAgZGVmIGJ5dGVfY29tcGlsZShzZWxmLCB0b19jb21waWxlKToKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgdHJ5IHRvIG1ha2UgdGhlIGJ5dGUgY29tcGlsZSBtZXNzYWdlcyBxdWlldGVyCisgICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UgLSAxKQorCisgICAgICAgICAgICBieXRlX2NvbXBpbGUodG9fY29tcGlsZSwgb3B0aW1pemU9MCwgZm9yY2U9MSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgICAgICBpZiBzZWxmLm9wdGltaXplOgorICAgICAgICAgICAgICAgIGJ5dGVfY29tcGlsZSgKKyAgICAgICAgICAgICAgICAgICAgdG9fY29tcGlsZSwgb3B0aW1pemU9c2VsZi5vcHRpbWl6ZSwgZm9yY2U9MSwKKyAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4KKyAgICAgICAgICAgICAgICApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpICAgICAjIHJlc3RvcmUgb3JpZ2luYWwgdmVyYm9zaXR5CisKKworCisKKworCisKKworCisKKworCisKKworICAgIGRlZiBub19kZWZhdWx0X3ZlcnNpb25fbXNnKHNlbGYpOgorICAgICAgICByZXR1cm4gIiIiYmFkIGluc3RhbGwgZGlyZWN0b3J5IG9yIFBZVEhPTlBBVEgKKworWW91IGFyZSBhdHRlbXB0aW5nIHRvIGluc3RhbGwgYSBwYWNrYWdlIHRvIGEgZGlyZWN0b3J5IHRoYXQgaXMgbm90CitvbiBQWVRIT05QQVRIIGFuZCB3aGljaCBQeXRob24gZG9lcyBub3QgcmVhZCAiLnB0aCIgZmlsZXMgZnJvbS4gIFRoZQoraW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB5b3Ugc3BlY2lmaWVkICh2aWEgLS1pbnN0YWxsLWRpciwgLS1wcmVmaXgsIG9yCit0aGUgZGlzdHV0aWxzIGRlZmF1bHQgc2V0dGluZykgd2FzOgorCisgICAgJXMKKworYW5kIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjdXJyZW50bHkgY29udGFpbnM6CisKKyAgICAlcgorCitIZXJlIGFyZSBzb21lIG9mIHlvdXIgb3B0aW9ucyBmb3IgY29ycmVjdGluZyB0aGUgcHJvYmxlbToKKworKiBZb3UgY2FuIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCBpLmUuLCBvbmUgdGhhdCBpcworICBvbiBQWVRIT05QQVRIIG9yIHN1cHBvcnRzIC5wdGggZmlsZXMKKworKiBZb3UgY2FuIGFkZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB0byB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAorICB2YXJpYWJsZS4gIChJdCBtdXN0IHRoZW4gYWxzbyBiZSBvbiBQWVRIT05QQVRIIHdoZW5ldmVyIHlvdSBydW4KKyAgUHl0aG9uIGFuZCB3YW50IHRvIHVzZSB0aGUgcGFja2FnZShzKSB5b3UgYXJlIGluc3RhbGxpbmcuKQorCisqIFlvdSBjYW4gc2V0IHVwIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIHN1cHBvcnQgIi5wdGgiIGZpbGVzIGJ5CisgIHVzaW5nIG9uZSBvZiB0aGUgYXBwcm9hY2hlcyBkZXNjcmliZWQgaGVyZToKKworICBodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9FYXN5SW5zdGFsbC5odG1sI2N1c3RvbS1pbnN0YWxsYXRpb24tbG9jYXRpb25zCisKK1BsZWFzZSBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGZvciB5b3VyIHN5c3RlbSBhbmQgdHJ5IGFnYWluLiIiIiAlICgKKyAgICAgICAgc2VsZi5pbnN0YWxsX2Rpciwgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCcnKQorICAgICkKKworCisKKworCisKKworCisKKworICAgIGRlZiBpbnN0YWxsX3NpdGVfcHkoc2VsZik6CisgICAgICAgICIiIk1ha2Ugc3VyZSB0aGVyZSdzIGEgc2l0ZS5weSBpbiB0aGUgdGFyZ2V0IGRpciwgaWYgbmVlZGVkIiIiCisKKyAgICAgICAgaWYgc2VsZi5zaXRlcHlfaW5zdGFsbGVkOgorICAgICAgICAgICAgcmV0dXJuICAjIGFscmVhZHkgZGlkIGl0LCBvciBkb24ndCBuZWVkIHRvCisKKyAgICAgICAgc2l0ZXB5ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICJzaXRlLnB5IikKKyAgICAgICAgc291cmNlID0gcmVzb3VyY2Vfc3RyaW5nKCJzZXR1cHRvb2xzIiwgInNpdGUtcGF0Y2gucHkiKQorICAgICAgICBjdXJyZW50ID0gIiIKKworICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzaXRlcHkpOgorICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBleGlzdGluZyBzaXRlLnB5IGluICVzIiwgc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgICAgIGN1cnJlbnQgPSBvcGVuKHNpdGVweSwncmInKS5yZWFkKCkKKyAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50LnN0YXJ0c3dpdGgoJ2RlZiBfX2Jvb3QoKTonKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHNldHVwdG9vbHMtZ2VuZXJhdGVkIHNpdGUucHk7IHBsZWFzZSIKKyAgICAgICAgICAgICAgICAgICAgIiByZW1vdmUgaXQuIiAlIHNpdGVweQorICAgICAgICAgICAgICAgICkKKworICAgICAgICBpZiBjdXJyZW50ICE9IHNvdXJjZToKKyAgICAgICAgICAgIGxvZy5pbmZvKCJDcmVhdGluZyAlcyIsIHNpdGVweSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShzaXRlcHkpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4oc2l0ZXB5LCd3YicpCisgICAgICAgICAgICAgICAgZi53cml0ZShzb3VyY2UpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShbc2l0ZXB5XSkKKworICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCisKKworCisKKworCisKKworCisKKworCisgICAgSU5TVEFMTF9TQ0hFTUVTID0gZGljdCgKKyAgICAgICAgcG9zaXggPSBkaWN0KAorICAgICAgICAgICAgaW5zdGFsbF9kaXIgPSAnJGJhc2UvbGliL3B5dGhvbiRweV92ZXJzaW9uX3Nob3J0L3NpdGUtcGFja2FnZXMnLAorICAgICAgICAgICAgc2NyaXB0X2RpciAgPSAnJGJhc2UvYmluJywKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBERUZBVUxUX1NDSEVNRSA9IGRpY3QoCisgICAgICAgIGluc3RhbGxfZGlyID0gJyRiYXNlL0xpYi9zaXRlLXBhY2thZ2VzJywKKyAgICAgICAgc2NyaXB0X2RpciAgPSAnJGJhc2UvU2NyaXB0cycsCisgICAgKQorCisgICAgZGVmIF9leHBhbmQoc2VsZiwgKmF0dHJzKToKKyAgICAgICAgY29uZmlnX3ZhcnMgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpLmNvbmZpZ192YXJzCisKKyAgICAgICAgaWYgc2VsZi5wcmVmaXg6CisgICAgICAgICAgICAjIFNldCBkZWZhdWx0IGluc3RhbGxfZGlyL3NjcmlwdHMgZnJvbSAtLXByZWZpeAorICAgICAgICAgICAgY29uZmlnX3ZhcnMgPSBjb25maWdfdmFycy5jb3B5KCkKKyAgICAgICAgICAgIGNvbmZpZ192YXJzWydiYXNlJ10gPSBzZWxmLnByZWZpeAorICAgICAgICAgICAgc2NoZW1lID0gc2VsZi5JTlNUQUxMX1NDSEVNRVMuZ2V0KG9zLm5hbWUsc2VsZi5ERUZBVUxUX1NDSEVNRSkKKyAgICAgICAgICAgIGZvciBhdHRyLHZhbCBpbiBzY2hlbWUuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYsYXR0cixOb25lKSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsYXR0cix2YWwpCisKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3Vic3RfdmFycworICAgICAgICBmb3IgYXR0ciBpbiBhdHRyczoKKyAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKKyAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB2YWwgPSBzdWJzdF92YXJzKHZhbCwgY29uZmlnX3ZhcnMpCisgICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgICAgICAgICB2YWwgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsKQorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQorCisKKworCisKKworCisKKworZGVmIGdldF9zaXRlX2RpcnMoKToKKyAgICAjIHJldHVybiBhIGxpc3Qgb2YgJ3NpdGUnIGRpcnMKKyAgICBzaXRlZGlycyA9IGZpbHRlcihOb25lLG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywnJykuc3BsaXQob3MucGF0aHNlcCkpCisgICAgcHJlZml4ZXMgPSBbc3lzLnByZWZpeF0KKyAgICBpZiBzeXMuZXhlY19wcmVmaXggIT0gc3lzLnByZWZpeDoKKyAgICAgICAgcHJlZml4ZXMuYXBwZW5kKHN5cy5leGVjX3ByZWZpeCkKKyAgICBmb3IgcHJlZml4IGluIHByZWZpeGVzOgorICAgICAgICBpZiBwcmVmaXg6CisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdvczJlbXgnLCAncmlzY29zJyk6CisgICAgICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKG9zLnBhdGguam9pbihwcmVmaXgsICJMaWIiLCAic2l0ZS1wYWNrYWdlcyIpKQorICAgICAgICAgICAgZWxpZiBvcy5zZXAgPT0gJy8nOgorICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZChbb3MucGF0aC5qb2luKHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2l0ZS1wYWNrYWdlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLCAic2l0ZS1weXRob24iKV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZCgKKyAgICAgICAgICAgICAgICAgICAgW3ByZWZpeCwgb3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXBhY2thZ2VzIildCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgICAgICMgZm9yIGZyYW1ld29yayBidWlsZHMgKm9ubHkqIHdlIGFkZCB0aGUgc3RhbmRhcmQgQXBwbGUKKyAgICAgICAgICAgICAgICAjIGxvY2F0aW9ucy4gQ3VycmVudGx5IG9ubHkgcGVyLXVzZXIsIGJ1dCAvTGlicmFyeSBhbmQKKyAgICAgICAgICAgICAgICAjIC9OZXR3b3JrL0xpYnJhcnkgY291bGQgYmUgYWRkZWQgdG9vCisgICAgICAgICAgICAgICAgaWYgJ1B5dGhvbi5mcmFtZXdvcmsnIGluIHByZWZpeDoKKyAgICAgICAgICAgICAgICAgICAgaG9tZSA9IG9zLmVudmlyb24uZ2V0KCdIT01FJykKKyAgICAgICAgICAgICAgICAgICAgaWYgaG9tZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVkaXJzLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oaG9tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpYnJhcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycpKQorICAgIGZvciBwbGF0X3NwZWNpZmljIGluICgwLDEpOgorICAgICAgICBzaXRlX2xpYiA9IGdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWMpCisgICAgICAgIGlmIHNpdGVfbGliIG5vdCBpbiBzaXRlZGlyczogc2l0ZWRpcnMuYXBwZW5kKHNpdGVfbGliKQorCisgICAgc2l0ZWRpcnMgPSBtYXAobm9ybWFsaXplX3BhdGgsIHNpdGVkaXJzKQorICAgIHJldHVybiBzaXRlZGlycworCisKK2RlZiBleHBhbmRfcGF0aHMoaW5wdXRzKToKKyAgICAiIiJZaWVsZCBzeXMucGF0aCBkaXJlY3RvcmllcyB0aGF0IG1pZ2h0IGNvbnRhaW4gIm9sZC1zdHlsZSIgcGFja2FnZXMiIiIKKworICAgIHNlZW4gPSB7fQorCisgICAgZm9yIGRpcm5hbWUgaW4gaW5wdXRzOgorICAgICAgICBkaXJuYW1lID0gbm9ybWFsaXplX3BhdGgoZGlybmFtZSkKKyAgICAgICAgaWYgZGlybmFtZSBpbiBzZWVuOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBzZWVuW2Rpcm5hbWVdID0gMQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCisgICAgICAgIHlpZWxkIGRpcm5hbWUsIGZpbGVzCisKKyAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICBpZiBub3QgbmFtZS5lbmRzd2l0aCgnLnB0aCcpOgorICAgICAgICAgICAgICAgICMgV2Ugb25seSBjYXJlIGFib3V0IHRoZSAucHRoIGZpbGVzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gKCdlYXN5LWluc3RhbGwucHRoJywnc2V0dXB0b29scy5wdGgnKToKKyAgICAgICAgICAgICAgICAjIElnbm9yZSAucHRoIGZpbGVzIHRoYXQgd2UgY29udHJvbAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgUmVhZCB0aGUgLnB0aCBmaWxlCisgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oZGlybmFtZSxuYW1lKSkKKyAgICAgICAgICAgIGxpbmVzID0gbGlzdCh5aWVsZF9saW5lcyhmKSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAjIFlpZWxkIGV4aXN0aW5nIG5vbi1kdXBlLCBub24taW1wb3J0IGRpcmVjdG9yeSBsaW5lcyBmcm9tIGl0CisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKCJpbXBvcnQiKToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IG5vcm1hbGl6ZV9wYXRoKGxpbmUucnN0cmlwKCkpCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgbm90IGluIHNlZW46CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuW2xpbmVdID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIobGluZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUsIG9zLmxpc3RkaXIobGluZSkKKworCitkZWYgZXh0cmFjdF93aW5pbnN0X2NmZyhkaXN0X2ZpbGVuYW1lKToKKyAgICAiIiJFeHRyYWN0IGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGEgYmRpc3Rfd2luaW5zdCAuZXhlCisKKyAgICBSZXR1cm5zIGEgQ29uZmlnUGFyc2VyLlJhd0NvbmZpZ1BhcnNlciwgb3IgTm9uZQorICAgICIiIgorICAgIGYgPSBvcGVuKGRpc3RfZmlsZW5hbWUsJ3JiJykKKyAgICB0cnk6CisgICAgICAgIGVuZHJlYyA9IHppcGZpbGUuX0VuZFJlY0RhdGEoZikKKyAgICAgICAgaWYgZW5kcmVjIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHByZXBlbmRlZCA9IChlbmRyZWNbOV0gLSBlbmRyZWNbNV0pIC0gZW5kcmVjWzZdCisgICAgICAgIGlmIHByZXBlbmRlZCA8IDEyOiAgIyBubyB3aW5pbnN0IGRhdGEgaGVyZQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZi5zZWVrKHByZXBlbmRlZC0xMikKKworICAgICAgICBpbXBvcnQgc3RydWN0LCBTdHJpbmdJTywgQ29uZmlnUGFyc2VyCisgICAgICAgIHRhZywgY2ZnbGVuLCBibWxlbiA9IHN0cnVjdC51bnBhY2soIjxpaWkiLGYucmVhZCgxMikpCisgICAgICAgIGlmIHRhZyBub3QgaW4gKDB4MTIzNDU2N0EsIDB4MTIzNDU2N0IpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUgICAgICMgbm90IGEgdmFsaWQgdGFnCisKKyAgICAgICAgZi5zZWVrKHByZXBlbmRlZC0oMTIrY2ZnbGVuK2JtbGVuKSkKKyAgICAgICAgY2ZnID0gQ29uZmlnUGFyc2VyLlJhd0NvbmZpZ1BhcnNlcih7J3ZlcnNpb24nOicnLCd0YXJnZXRfdmVyc2lvbic6Jyd9KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjZmcucmVhZGZwKFN0cmluZ0lPLlN0cmluZ0lPKGYucmVhZChjZmdsZW4pLnNwbGl0KGNocigwKSwxKVswXSkpCisgICAgICAgIGV4Y2VwdCBDb25maWdQYXJzZXIuRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBub3QgY2ZnLmhhc19zZWN0aW9uKCdtZXRhZGF0YScpIG9yIG5vdCBjZmcuaGFzX3NlY3Rpb24oJ1NldHVwJyk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gY2ZnCisKKyAgICBmaW5hbGx5OgorICAgICAgICBmLmNsb3NlKCkKKworCisKKworCisKKworCitkZWYgZ2V0X2V4ZV9wcmVmaXhlcyhleGVfZmlsZW5hbWUpOgorICAgICIiIkdldCBleGUtPmVnZyBwYXRoIHRyYW5zbGF0aW9ucyBmb3IgYSBnaXZlbiAuZXhlIGZpbGUiIiIKKworICAgIHByZWZpeGVzID0gWworICAgICAgICAoJ1BVUkVMSUIvJywgJycpLAorICAgICAgICAoJ1BMQVRMSUIvJywgJycpLAorICAgICAgICAoJ1NDUklQVFMvJywgJ0VHRy1JTkZPL3NjcmlwdHMvJykKKyAgICBdCisgICAgeiA9IHppcGZpbGUuWmlwRmlsZShleGVfZmlsZW5hbWUpCisgICAgdHJ5OgorICAgICAgICBmb3IgaW5mbyBpbiB6LmluZm9saXN0KCk6CisgICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQorICAgICAgICAgICAgcGFydHMgPSBuYW1lLnNwbGl0KCcvJykKKyAgICAgICAgICAgIGlmIGxlbihwYXJ0cyk9PTMgYW5kIHBhcnRzWzJdPT0nUEtHLUlORk8nOgorICAgICAgICAgICAgICAgIGlmIHBhcnRzWzFdLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuaW5zZXJ0KDAsKCcvJy5qb2luKHBhcnRzWzoyXSksICdFR0ctSU5GTy8nKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGxlbihwYXJ0cyk8PjIgb3Igbm90IG5hbWUuZW5kc3dpdGgoJy5wdGgnKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLW5zcGtnLnB0aCcpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBwYXJ0c1swXSBpbiAoJ1BVUkVMSUInLCdQTEFUTElCJyk6CisgICAgICAgICAgICAgICAgZm9yIHB0aCBpbiB5aWVsZF9saW5lcyh6LnJlYWQobmFtZSkpOgorICAgICAgICAgICAgICAgICAgICBwdGggPSBwdGguc3RyaXAoKS5yZXBsYWNlKCdcXCcsJy8nKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcHRoLnN0YXJ0c3dpdGgoJ2ltcG9ydCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuYXBwZW5kKCgoJyVzLyVzLycgJSAocGFydHNbMF0scHRoKSksICcnKSkKKyAgICBmaW5hbGx5OgorICAgICAgICB6LmNsb3NlKCkKKworICAgIHByZWZpeGVzLnNvcnQoKTsgcHJlZml4ZXMucmV2ZXJzZSgpCisgICAgcmV0dXJuIHByZWZpeGVzCisKKworZGVmIHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICJOb3QgYSBVUkwsIGV4aXN0aW5nIGZpbGUsIG9yIHJlcXVpcmVtZW50IHNwZWM6ICVyIiAlIChzcGVjLCkKKyAgICAgICAgKQorCitjbGFzcyBQdGhEaXN0cmlidXRpb25zKEVudmlyb25tZW50KToKKyAgICAiIiJBIC5wdGggZmlsZSB3aXRoIERpc3RyaWJ1dGlvbiBwYXRocyBpbiBpdCIiIgorCisgICAgZGlydHkgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuYmFzZWRpciA9IG5vcm1hbGl6ZV9wYXRoKG9zLnBhdGguZGlybmFtZShzZWxmLmZpbGVuYW1lKSkKKyAgICAgICAgc2VsZi5fbG9hZCgpOyBFbnZpcm9ubWVudC5fX2luaXRfXyhzZWxmLCBbXSwgTm9uZSwgTm9uZSkKKyAgICAgICAgZm9yIHBhdGggaW4geWllbGRfbGluZXMoc2VsZi5wYXRocyk6CisgICAgICAgICAgICBtYXAoc2VsZi5hZGQsIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoLCBUcnVlKSkKKworICAgIGRlZiBfbG9hZChzZWxmKToKKyAgICAgICAgc2VsZi5wYXRocyA9IFtdCisgICAgICAgIHNhd19pbXBvcnQgPSBGYWxzZQorICAgICAgICBzZWVuID0ge30KKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5maWxlbmFtZSk6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBvcGVuKHNlbGYuZmlsZW5hbWUsJ3J0Jyk6CisgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdpbXBvcnQnKToKKyAgICAgICAgICAgICAgICAgICAgc2F3X2ltcG9ydCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBwYXRoID0gbGluZS5yc3RyaXAoKQorICAgICAgICAgICAgICAgIHNlbGYucGF0aHMuYXBwZW5kKHBhdGgpCisgICAgICAgICAgICAgICAgaWYgbm90IHBhdGguc3RyaXAoKSBvciBwYXRoLnN0cmlwKCkuc3RhcnRzd2l0aCgnIycpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICMgc2tpcCBub24tZXhpc3RlbnQgcGF0aHMsIGluIGNhc2Ugc29tZWJvZHkgZGVsZXRlZCBhIHBhY2thZ2UKKyAgICAgICAgICAgICAgICAjIG1hbnVhbGx5LCBhbmQgZHVwbGljYXRlIHBhdGhzIGFzIHdlbGwKKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5wYXRoc1stMV0gPSBub3JtYWxpemVfcGF0aCgKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuYmFzZWRpcixwYXRoKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCkgb3IgcGF0aCBpbiBzZWVuOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGhzLnBvcCgpICAgICMgc2tpcCBpdAorICAgICAgICAgICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZSAgICMgd2UgY2xlYW5lZCB1cCwgc28gd2UncmUgZGlydHkgbm93IDopCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VlbltwYXRoXSA9IDEKKworICAgICAgICBpZiBzZWxmLnBhdGhzIGFuZCBub3Qgc2F3X2ltcG9ydDoKKyAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlICAgIyBlbnN1cmUgYW55dGhpbmcgd2UgdG91Y2ggaGFzIGltcG9ydCB3cmFwcGVycworICAgICAgICB3aGlsZSBzZWxmLnBhdGhzIGFuZCBub3Qgc2VsZi5wYXRoc1stMV0uc3RyaXAoKToKKyAgICAgICAgICAgIHNlbGYucGF0aHMucG9wKCkKKworICAgIGRlZiBzYXZlKHNlbGYpOgorICAgICAgICAiIiJXcml0ZSBjaGFuZ2VkIC5wdGggZmlsZSBiYWNrIHRvIGRpc2siIiIKKyAgICAgICAgaWYgbm90IHNlbGYuZGlydHk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBkYXRhID0gJ1xuJy5qb2luKG1hcChzZWxmLm1ha2VfcmVsYXRpdmUsc2VsZi5wYXRocykpCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICBsb2cuZGVidWcoIlNhdmluZyAlcyIsIHNlbGYuZmlsZW5hbWUpCisgICAgICAgICAgICBkYXRhID0gKAorICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuX19wbGVuID0gbGVuKHN5cy5wYXRoKVxuIgorICAgICAgICAgICAgICAgICIlc1xuIgorICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBuZXc9c3lzLnBhdGhbc3lzLl9fcGxlbjpdOyIKKyAgICAgICAgICAgICAgICAiIGRlbCBzeXMucGF0aFtzeXMuX19wbGVuOl07IgorICAgICAgICAgICAgICAgICIgcD1nZXRhdHRyKHN5cywnX19lZ2dpbnNlcnQnLDApOyBzeXMucGF0aFtwOnBdPW5ldzsiCisgICAgICAgICAgICAgICAgIiBzeXMuX19lZ2dpbnNlcnQgPSBwK2xlbihuZXcpXG4iCisgICAgICAgICAgICApICUgZGF0YQorCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhzZWxmLmZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZmlsZW5hbWUsJ3diJykKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSk7IGYuY2xvc2UoKQorCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlbmFtZSk6CisgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nIGVtcHR5ICVzIiwgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmZpbGVuYW1lKQorCisgICAgICAgIHNlbGYuZGlydHkgPSBGYWxzZQorCisgICAgZGVmIGFkZChzZWxmLGRpc3QpOgorICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCisgICAgICAgIGlmIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYucGF0aHM6CisgICAgICAgICAgICBzZWxmLnBhdGhzLmFwcGVuZChkaXN0LmxvY2F0aW9uKTsgc2VsZi5kaXJ0eSA9IFRydWUKKyAgICAgICAgRW52aXJvbm1lbnQuYWRkKHNlbGYsZGlzdCkKKworICAgIGRlZiByZW1vdmUoc2VsZixkaXN0KToKKyAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCisgICAgICAgIHdoaWxlIGRpc3QubG9jYXRpb24gaW4gc2VsZi5wYXRoczoKKyAgICAgICAgICAgIHNlbGYucGF0aHMucmVtb3ZlKGRpc3QubG9jYXRpb24pOyBzZWxmLmRpcnR5ID0gVHJ1ZQorICAgICAgICBFbnZpcm9ubWVudC5yZW1vdmUoc2VsZixkaXN0KQorCisKKyAgICBkZWYgbWFrZV9yZWxhdGl2ZShzZWxmLHBhdGgpOgorICAgICAgICBpZiBub3JtYWxpemVfcGF0aChvcy5wYXRoLmRpcm5hbWUocGF0aCkpPT1zZWxmLmJhc2VkaXI6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShwYXRoKQorICAgICAgICByZXR1cm4gcGF0aAorCisKK2RlZiBnZXRfc2NyaXB0X2hlYWRlcihzY3JpcHRfdGV4dCwgZXhlY3V0YWJsZT1zeXNfZXhlY3V0YWJsZSk6CisgICAgIiIiQ3JlYXRlIGEgIyEgbGluZSwgZ2V0dGluZyBvcHRpb25zIChpZiBhbnkpIGZyb20gc2NyaXB0X3RleHQiIiIKKyAgICBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3NjcmlwdHMgaW1wb3J0IGZpcnN0X2xpbmVfcmUKKyAgICBmaXJzdCwgcmVzdCA9IChzY3JpcHRfdGV4dCsnXG4nKS5zcGxpdCgnXG4nLDEpCisgICAgbWF0Y2ggPSBmaXJzdF9saW5lX3JlLm1hdGNoKGZpcnN0KQorICAgIG9wdGlvbnMgPSAnJworICAgIGlmIG1hdGNoOgorICAgICAgICBzY3JpcHRfdGV4dCA9IHJlc3QKKyAgICAgICAgb3B0aW9ucyA9IG1hdGNoLmdyb3VwKDEpIG9yICcnCisgICAgICAgIGlmIG9wdGlvbnM6CisgICAgICAgICAgICBvcHRpb25zID0gJyAnK29wdGlvbnMKKyAgICByZXR1cm4gIiMhJShleGVjdXRhYmxlKXMlKG9wdGlvbnMpc1xuIiAlIGxvY2FscygpCisKKworZGVmIGF1dG9fY2htb2QoZnVuYywgYXJnLCBleGMpOgorICAgIGlmIGZ1bmMgaXMgb3MucmVtb3ZlIGFuZCBvcy5uYW1lPT0nbnQnOgorICAgICAgICBvcy5jaG1vZChhcmcsIHN0YXQuU19JV1JJVEUpCisgICAgICAgIHJldHVybiBmdW5jKGFyZykKKyAgICBleGMgPSBzeXMuZXhjX2luZm8oKQorICAgIHJhaXNlIGV4Y1swXSwgKGV4Y1sxXVswXSwgZXhjWzFdWzFdICsgKCIgJXMgJXMiICUgKGZ1bmMsYXJnKSkpCisKKworZGVmIHVuY2FjaGVfemlwZGlyKHBhdGgpOgorICAgICIiIkVuc3VyZSB0aGF0IHRoZSB6aXAgZGlyZWN0b3J5IGNhY2hlIGRvZXNuJ3QgaGF2ZSBzdGFsZSBpbmZvIGZvciBwYXRoIiIiCisgICAgZnJvbSB6aXBpbXBvcnQgaW1wb3J0IF96aXBfZGlyZWN0b3J5X2NhY2hlIGFzIHpkYworICAgIGlmIHBhdGggaW4gemRjOgorICAgICAgICBkZWwgemRjW3BhdGhdCisgICAgZWxzZToKKyAgICAgICAgcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKHBhdGgpCisgICAgICAgIGZvciBwIGluIHpkYzoKKyAgICAgICAgICAgIGlmIG5vcm1hbGl6ZV9wYXRoKHApPT1wYXRoOgorICAgICAgICAgICAgICAgIGRlbCB6ZGNbcF0KKyAgICAgICAgICAgICAgICByZXR1cm4KKworCitkZWYgZ2V0X3NjcmlwdF9hcmdzKGRpc3QsIGV4ZWN1dGFibGU9c3lzX2V4ZWN1dGFibGUpOgorICAgICIiIllpZWxkIHdyaXRlX3NjcmlwdCgpIGFyZ3VtZW50IHR1cGxlcyBmb3IgYSBkaXN0cmlidXRpb24ncyBlbnRyeXBvaW50cyIiIgorICAgIHNwZWMgPSBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQorICAgIGhlYWRlciA9IGdldF9zY3JpcHRfaGVhZGVyKCIiLCBleGVjdXRhYmxlKQorICAgIGZvciBncm91cCBpbiAnY29uc29sZV9zY3JpcHRzJywgJ2d1aV9zY3JpcHRzJzoKKyAgICAgICAgZm9yIG5hbWUsZXAgaW4gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKS5pdGVtcygpOgorICAgICAgICAgICAgc2NyaXB0X3RleHQgPSAoCisgICAgICAgICAgICAgICAgIiMgRUFTWS1JTlNUQUxMLUVOVFJZLVNDUklQVDogJShzcGVjKXIsJShncm91cClyLCUobmFtZSlyXG4iCisgICAgICAgICAgICAgICAgIl9fcmVxdWlyZXNfXyA9ICUoc3BlYylyXG4iCisgICAgICAgICAgICAgICAgImltcG9ydCBzeXNcbiIKKyAgICAgICAgICAgICAgICAiZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBsb2FkX2VudHJ5X3BvaW50XG4iCisgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICJzeXMuZXhpdChcbiIKKyAgICAgICAgICAgICAgICAiICAgbG9hZF9lbnRyeV9wb2ludCglKHNwZWMpciwgJShncm91cClyLCAlKG5hbWUpcikoKVxuIgorICAgICAgICAgICAgICAgICIpXG4iCisgICAgICAgICAgICApICUgbG9jYWxzKCkKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybT09J3dpbjMyJzoKKyAgICAgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIGFkZCBhIC5weSBleHRlbnNpb24gYW5kIGFuIC5leGUgbGF1bmNoZXIKKyAgICAgICAgICAgICAgICBpZiBncm91cD09J2d1aV9zY3JpcHRzJzoKKyAgICAgICAgICAgICAgICAgICAgZXh0LCBsYXVuY2hlciA9ICctc2NyaXB0LnB5dycsICdndWkuZXhlJworICAgICAgICAgICAgICAgICAgICBvbGQgPSBbJy5weXcnXQorICAgICAgICAgICAgICAgICAgICBuZXdfaGVhZGVyID0gcmUuc3ViKCcoP2kpcHl0aG9uLmV4ZScsJ3B5dGhvbncuZXhlJyxoZWFkZXIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXh0LCBsYXVuY2hlciA9ICctc2NyaXB0LnB5JywgJ2NsaS5leGUnCisgICAgICAgICAgICAgICAgICAgIG9sZCA9IFsnLnB5JywnLnB5YycsJy5weW8nXQorICAgICAgICAgICAgICAgICAgICBuZXdfaGVhZGVyID0gcmUuc3ViKCcoP2kpcHl0aG9udy5leGUnLCdweXRob253LmV4ZScsaGVhZGVyKQorCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmV3X2hlYWRlclsyOi0xXSk6CisgICAgICAgICAgICAgICAgICAgIGhkciA9IG5ld19oZWFkZXIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBoZHIgPSBoZWFkZXIKKyAgICAgICAgICAgICAgICB5aWVsZCAobmFtZStleHQsIGhkcitzY3JpcHRfdGV4dCwgJ3QnLCBbbmFtZSt4IGZvciB4IGluIG9sZF0pCisgICAgICAgICAgICAgICAgeWllbGQgKAorICAgICAgICAgICAgICAgICAgICBuYW1lKycuZXhlJywgcmVzb3VyY2Vfc3RyaW5nKCdzZXR1cHRvb2xzJywgbGF1bmNoZXIpLAorICAgICAgICAgICAgICAgICAgICAnYicgIyB3cml0ZSBpbiBiaW5hcnkgbW9kZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBPbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGFzc3VtZSB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gaXMgdG8KKyAgICAgICAgICAgICAgICAjIGp1c3Qgd3JpdGUgdGhlIHN0dWIgd2l0aCBubyBleHRlbnNpb24uCisgICAgICAgICAgICAgICAgeWllbGQgKG5hbWUsIGhlYWRlcitzY3JpcHRfdGV4dCkKKworZGVmIHJtdHJlZShwYXRoLCBpZ25vcmVfZXJyb3JzPUZhbHNlLCBvbmVycm9yPWF1dG9fY2htb2QpOgorICAgICIiIlJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGRpcmVjdG9yeSB0cmVlLgorCisgICAgVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gdGhlIFB5dGhvbiAyLjQgdmVyc2lvbiBvZiAnc2h1dGlsJywgYmVjYXVzZQorICAgIHRoZSAyLjMgdmVyc2lvbiBkb2Vzbid0IHJlYWxseSB3b3JrIHJpZ2h0LgorICAgICIiIgorICAgIGlmIGlnbm9yZV9lcnJvcnM6CisgICAgICAgIGRlZiBvbmVycm9yKCphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICBlbGlmIG9uZXJyb3IgaXMgTm9uZToKKyAgICAgICAgZGVmIG9uZXJyb3IoKmFyZ3MpOgorICAgICAgICAgICAgcmFpc2UKKyAgICBuYW1lcyA9IFtdCisgICAgdHJ5OgorICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIocGF0aCkKKyAgICBleGNlcHQgb3MuZXJyb3IsIGVycjoKKyAgICAgICAgb25lcnJvcihvcy5saXN0ZGlyLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kZSA9IG9zLmxzdGF0KGZ1bGxuYW1lKS5zdF9tb2RlCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIG1vZGUgPSAwCisgICAgICAgIGlmIHN0YXQuU19JU0RJUihtb2RlKToKKyAgICAgICAgICAgIHJtdHJlZShmdWxsbmFtZSwgaWdub3JlX2Vycm9ycywgb25lcnJvcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZnVsbG5hbWUpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBvbmVycm9yKG9zLnJlbW92ZSwgZnVsbG5hbWUsIHN5cy5leGNfaW5mbygpKQorICAgIHRyeToKKyAgICAgICAgb3Mucm1kaXIocGF0aCkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIG9uZXJyb3Iob3Mucm1kaXIsIHBhdGgsIHN5cy5leGNfaW5mbygpKQorCisKKworCisKKworCitkZWYgbWFpbihhcmd2PU5vbmUsICoqa3cpOgorICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKKyAgICBmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uCisgICAgaW1wb3J0IGRpc3R1dGlscy5jb3JlCisKKyAgICBVU0FHRSA9ICIiIlwKK3VzYWdlOiAlKHNjcmlwdClzIFtvcHRpb25zXSByZXF1aXJlbWVudF9vcl91cmwgLi4uCisgICBvcjogJShzY3JpcHQpcyAtLWhlbHAKKyIiIgorCisgICAgZGVmIGdlbl91c2FnZSAoc2NyaXB0X25hbWUpOgorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9uYW1lKQorICAgICAgICByZXR1cm4gVVNBR0UgJSB2YXJzKCkKKworICAgIGRlZiB3aXRoX2VpX3VzYWdlKGYpOgorICAgICAgICBvbGRfZ2VuX3VzYWdlID0gZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZSA9IGdlbl91c2FnZQorICAgICAgICAgICAgcmV0dXJuIGYoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlID0gb2xkX2dlbl91c2FnZQorCisgICAgY2xhc3MgRGlzdHJpYnV0aW9uV2l0aG91dEhlbHBDb21tYW5kcyhEaXN0cmlidXRpb24pOgorICAgICAgICBkZWYgX3Nob3dfaGVscChzZWxmLCphcmdzLCoqa3cpOgorICAgICAgICAgICAgd2l0aF9laV91c2FnZShsYW1iZGE6IERpc3RyaWJ1dGlvbi5fc2hvd19oZWxwKHNlbGYsKmFyZ3MsKiprdykpCisKKyAgICBpZiBhcmd2IGlzIE5vbmU6CisgICAgICAgIGFyZ3YgPSBzeXMuYXJndlsxOl0KKworICAgIHdpdGhfZWlfdXNhZ2UobGFtYmRhOgorICAgICAgICBzZXR1cCgKKyAgICAgICAgICAgIHNjcmlwdF9hcmdzID0gWyctcScsJ2Vhc3lfaW5zdGFsbCcsICctdiddK2FyZ3YsCisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IHN5cy5hcmd2WzBdIG9yICdlYXN5X2luc3RhbGwnLAorICAgICAgICAgICAgZGlzdGNsYXNzPURpc3RyaWJ1dGlvbldpdGhvdXRIZWxwQ29tbWFuZHMsICoqa3cKKyAgICAgICAgKQorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2OGZiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5CkBAIC0wLDAgKzEsMzY1IEBACisiIiJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8KKworQ3JlYXRlIGEgZGlzdHJpYnV0aW9uJ3MgLmVnZy1pbmZvIGRpcmVjdG9yeSBhbmQgY29udGVudHMiIiIKKworIyBUaGlzIG1vZHVsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMworaW1wb3J0IG9zLCByZQorZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICoKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0IGltcG9ydCBzZGlzdAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGZpbGVfdXRpbAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitmcm9tIGRpc3R1dGlscy5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgcGFyc2VfcmVxdWlyZW1lbnRzLCBzYWZlX25hbWUsIHBhcnNlX3ZlcnNpb24sIFwKKyAgICBzYWZlX3ZlcnNpb24sIHlpZWxkX2xpbmVzLCBFbnRyeVBvaW50LCBpdGVyX2VudHJ5X3BvaW50cywgdG9fZmlsZW5hbWUKK2Zyb20gc2Rpc3QgaW1wb3J0IHdhbGtfcmV2Y3RybAorCitjbGFzcyBlZ2dfaW5mbyhDb21tYW5kKToKKyAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYSBkaXN0cmlidXRpb24ncyAuZWdnLWluZm8gZGlyZWN0b3J5IgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2VnZy1iYXNlPScsICdlJywgImRpcmVjdG9yeSBjb250YWluaW5nIC5lZ2ctaW5mbyBkaXJlY3RvcmllcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IHRvcCBvZiB0aGUgc291cmNlIHRyZWUpIiksCisgICAgICAgICgndGFnLXN2bi1yZXZpc2lvbicsICdyJywKKyAgICAgICAgICAgICJBZGQgc3VidmVyc2lvbiByZXZpc2lvbiBJRCB0byB2ZXJzaW9uIG51bWJlciIpLAorICAgICAgICAoJ3RhZy1kYXRlJywgJ2QnLCAiQWRkIGRhdGUgc3RhbXAgKGUuZy4gMjAwNTA1MjgpIHRvIHZlcnNpb24gbnVtYmVyIiksCisgICAgICAgICgndGFnLWJ1aWxkPScsICdiJywgIlNwZWNpZnkgZXhwbGljaXQgdGFnIHRvIGFkZCB0byB2ZXJzaW9uIG51bWJlciIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsndGFnLWRhdGUnLCd0YWctc3ZuLXJldmlzaW9uJ10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLmVnZ19uYW1lID0gTm9uZQorICAgICAgICBzZWxmLmVnZ192ZXJzaW9uID0gTm9uZQorICAgICAgICBzZWxmLmVnZ19iYXNlID0gTm9uZQorICAgICAgICBzZWxmLmVnZ19pbmZvID0gTm9uZQorICAgICAgICBzZWxmLnRhZ19idWlsZCA9IE5vbmUKKyAgICAgICAgc2VsZi50YWdfc3ZuX3JldmlzaW9uID0gMAorICAgICAgICBzZWxmLnRhZ19kYXRlID0gMAorICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IEZhbHNlCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuZWdnX25hbWUgPSBzYWZlX25hbWUoc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSkKKyAgICAgICAgc2VsZi5lZ2dfdmVyc2lvbiA9IHNlbGYudGFnZ2VkX3ZlcnNpb24oKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpc3QoCisgICAgICAgICAgICAgICAgcGFyc2VfcmVxdWlyZW1lbnRzKCclcz09JXMnICUgKHNlbGYuZWdnX25hbWUsc2VsZi5lZ2dfdmVyc2lvbikpCisgICAgICAgICAgICApCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIkludmFsaWQgZGlzdHJpYnV0aW9uIG5hbWUgb3IgdmVyc2lvbiBzeW50YXg6ICVzLSVzIiAlCisgICAgICAgICAgICAgICAgKHNlbGYuZWdnX25hbWUsc2VsZi5lZ2dfdmVyc2lvbikKKyAgICAgICAgICAgICkKKworICAgICAgICBpZiBzZWxmLmVnZ19iYXNlIGlzIE5vbmU6CisgICAgICAgICAgICBkaXJzID0gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kaXIKKyAgICAgICAgICAgIHNlbGYuZWdnX2Jhc2UgPSAoZGlycyBvciB7fSkuZ2V0KCcnLG9zLmN1cmRpcikKKworICAgICAgICBzZWxmLmVuc3VyZV9kaXJuYW1lKCdlZ2dfYmFzZScpCisgICAgICAgIHNlbGYuZWdnX2luZm8gPSB0b19maWxlbmFtZShzZWxmLmVnZ19uYW1lKSsnLmVnZy1pbmZvJworICAgICAgICBpZiBzZWxmLmVnZ19iYXNlICE9IG9zLmN1cmRpcjoKKyAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfYmFzZSwgc2VsZi5lZ2dfaW5mbykKKyAgICAgICAgaWYgJy0nIGluIHNlbGYuZWdnX25hbWU6IHNlbGYuY2hlY2tfYnJva2VuX2VnZ19pbmZvKCkKKworICAgICAgICAjIFNldCBwYWNrYWdlIHZlcnNpb24gZm9yIHRoZSBiZW5lZml0IG9mIGR1bWJlciBjb21tYW5kcworICAgICAgICAjIChlLmcuIHNkaXN0LCBiZGlzdF93aW5pbnN0LCBldGMuKQorICAgICAgICAjCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLnZlcnNpb24gPSBzZWxmLmVnZ192ZXJzaW9uCisKKyAgICAgICAgIyBJZiB3ZSBib290c3RyYXBwZWQgYXJvdW5kIHRoZSBsYWNrIG9mIGEgUEtHLUlORk8sIGFzIG1pZ2h0IGJlIHRoZQorICAgICAgICAjIGNhc2UgaW4gYSBmcmVzaCBjaGVja291dCwgbWFrZSBzdXJlIHRoYXQgYW55IHNwZWNpYWwgdGFncyBnZXQgYWRkZWQKKyAgICAgICAgIyB0byB0aGUgdmVyc2lvbiBpbmZvCisgICAgICAgICMKKyAgICAgICAgcGQgPSBzZWxmLmRpc3RyaWJ1dGlvbi5fcGF0Y2hlZF9kaXN0CisgICAgICAgIGlmIHBkIGlzIG5vdCBOb25lIGFuZCBwZC5rZXk9PXNlbGYuZWdnX25hbWUubG93ZXIoKToKKyAgICAgICAgICAgIHBkLl92ZXJzaW9uID0gc2VsZi5lZ2dfdmVyc2lvbgorICAgICAgICAgICAgcGQuX3BhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLmVnZ192ZXJzaW9uKQorICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uX3BhdGNoZWRfZGlzdCA9IE5vbmUKKworCisKKyAgICBkZWYgd3JpdGVfb3JfZGVsZXRlX2ZpbGUoc2VsZiwgd2hhdCwgZmlsZW5hbWUsIGRhdGEsIGZvcmNlPUZhbHNlKToKKyAgICAgICAgIiIiV3JpdGUgYGRhdGFgIHRvIGBmaWxlbmFtZWAgb3IgZGVsZXRlIGlmIGVtcHR5CisKKyAgICAgICAgSWYgYGRhdGFgIGlzIG5vbi1lbXB0eSwgdGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGBgd3JpdGVfZmlsZSgpYGAuCisgICAgICAgIElmIGBkYXRhYCBpcyBlbXB0eSBidXQgbm90IGBgTm9uZWBgLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKKyAgICAgICAgYGBkZWxldGVfZmlsZShmaWxlbmFtZSlgLiAgSWYgYGRhdGFgIGlzIGBgTm9uZWBgLCB0aGVuIHRoaXMgaXMgYSBuby1vcAorICAgICAgICB1bmxlc3MgYGZpbGVuYW1lYCBleGlzdHMsIGluIHdoaWNoIGNhc2UgYSB3YXJuaW5nIGlzIGlzc3VlZCBhYm91dCB0aGUKKyAgICAgICAgb3JwaGFuZWQgZmlsZSAoaWYgYGZvcmNlYCBpcyBmYWxzZSksIG9yIGRlbGV0ZWQgKGlmIGBmb3JjZWAgaXMgdHJ1ZSkuCisgICAgICAgICIiIgorICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKHdoYXQsIGZpbGVuYW1lLCBkYXRhKQorICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKKyAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZSBhbmQgbm90IGZvcmNlOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgICAgICAgICAiJXMgbm90IHNldCBpbiBzZXR1cCgpLCBidXQgJXMgZXhpc3RzIiwgd2hhdCwgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZGVsZXRlX2ZpbGUoZmlsZW5hbWUpCisKKyAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSk6CisgICAgICAgICIiIldyaXRlIGBkYXRhYCB0byBgZmlsZW5hbWVgIChpZiBub3QgYSBkcnkgcnVuKSBhZnRlciBhbm5vdW5jaW5nIGl0CisKKyAgICAgICAgYHdoYXRgIGlzIHVzZWQgaW4gYSBsb2cgbWVzc2FnZSB0byBpZGVudGlmeSB3aGF0IGlzIGJlaW5nIHdyaXR0ZW4KKyAgICAgICAgdG8gdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBsb2cuaW5mbygid3JpdGluZyAlcyB0byAlcyIsIHdoYXQsIGZpbGVuYW1lKQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3YicpCisgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBkZWxldGVfZmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIkRlbGV0ZSBgZmlsZW5hbWVgIChpZiBub3QgYSBkcnkgcnVuKSBhZnRlciBhbm5vdW5jaW5nIGl0IiIiCisgICAgICAgIGxvZy5pbmZvKCJkZWxldGluZyAlcyIsIGZpbGVuYW1lKQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorCisKKworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5lZ2dfaW5mbykKKyAgICAgICAgaW5zdGFsbGVyID0gc2VsZi5kaXN0cmlidXRpb24uZmV0Y2hfYnVpbGRfZWdnCisgICAgICAgIGZvciBlcCBpbiBpdGVyX2VudHJ5X3BvaW50cygnZWdnX2luZm8ud3JpdGVycycpOgorICAgICAgICAgICAgd3JpdGVyID0gZXAubG9hZChpbnN0YWxsZXI9aW5zdGFsbGVyKQorICAgICAgICAgICAgd3JpdGVyKHNlbGYsIGVwLm5hbWUsIG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLGVwLm5hbWUpKQorICAgICAgICBzZWxmLmZpbmRfc291cmNlcygpCisKKyAgICBkZWYgdGFnZ2VkX3ZlcnNpb24oc2VsZik6CisgICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCisgICAgICAgIGlmIHNlbGYudGFnX2J1aWxkOgorICAgICAgICAgICAgdmVyc2lvbis9c2VsZi50YWdfYnVpbGQKKyAgICAgICAgaWYgc2VsZi50YWdfc3ZuX3JldmlzaW9uIGFuZCAoCisgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cygnLnN2bicpIG9yIG9zLnBhdGguZXhpc3RzKCdQS0ctSU5GTycpCisgICAgICAgICk6ICB2ZXJzaW9uICs9ICctciVzJyAlIHNlbGYuZ2V0X3N2bl9yZXZpc2lvbigpCisgICAgICAgIGlmIHNlbGYudGFnX2RhdGU6CisgICAgICAgICAgICBpbXBvcnQgdGltZTsgdmVyc2lvbiArPSB0aW1lLnN0cmZ0aW1lKCItJVklbSVkIikKKyAgICAgICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2ZXJzaW9uKQorCisgICAgZGVmIGdldF9zdm5fcmV2aXNpb24oc2VsZik6CisgICAgICAgIHJldmlzaW9uID0gMAorICAgICAgICB1cmxyZSA9IHJlLmNvbXBpbGUoJ3VybD0iKFteIl0rKSInKQorICAgICAgICByZXZyZSA9IHJlLmNvbXBpbGUoJ2NvbW1pdHRlZC1yZXY9IihcZCspIicpCisgICAgICAgIGZvciBiYXNlLGRpcnMsZmlsZXMgaW4gb3Mud2Fsayhvcy5jdXJkaXIpOgorICAgICAgICAgICAgaWYgJy5zdm4nIG5vdCBpbiBkaXJzOgorICAgICAgICAgICAgICAgIGRpcnNbOl0gPSBbXQorICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgbm8gc2Vuc2Ugd2Fsa2luZyB1bmNvbnRyb2xsZWQgc3ViZGlycworICAgICAgICAgICAgZGlycy5yZW1vdmUoJy5zdm4nKQorICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKGJhc2UsJy5zdm4nLCdlbnRyaWVzJykpCisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZGlydXJsID0gdXJscmUuc2VhcmNoKGRhdGEpLmdyb3VwKDEpICAgICMgZ2V0IHJlcG9zaXRvcnkgVVJMCisgICAgICAgICAgICBpZiBiYXNlPT1vcy5jdXJkaXI6CisgICAgICAgICAgICAgICAgYmFzZV91cmwgPSBkaXJ1cmwrJy8nICAgIyBzYXZlIHRoZSByb290IHVybAorICAgICAgICAgICAgZWxpZiBub3QgZGlydXJsLnN0YXJ0c3dpdGgoYmFzZV91cmwpOgorICAgICAgICAgICAgICAgIGRpcnNbOl0gPSBbXQorICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgbm90IHBhcnQgb2YgdGhlIHNhbWUgc3ZuIHRyZWUsIHNraXAgaXQKKyAgICAgICAgICAgIGZvciBtYXRjaCBpbiByZXZyZS5maW5kaXRlcihkYXRhKToKKyAgICAgICAgICAgICAgICByZXZpc2lvbiA9IG1heChyZXZpc2lvbiwgaW50KG1hdGNoLmdyb3VwKDEpKSkKKyAgICAgICAgcmV0dXJuIHN0cihyZXZpc2lvbiBvciBnZXRfcGtnX2luZm9fcmV2aXNpb24oKSkKKworICAgIGRlZiBmaW5kX3NvdXJjZXMoc2VsZik6CisgICAgICAgICIiIkdlbmVyYXRlIFNPVVJDRVMudHh0IG1hbmlmZXN0IGZpbGUiIiIKKyAgICAgICAgbWFuaWZlc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywiU09VUkNFUy50eHQiKQorICAgICAgICBtbSA9IG1hbmlmZXN0X21ha2VyKHNlbGYuZGlzdHJpYnV0aW9uKQorICAgICAgICBtbS5tYW5pZmVzdCA9IG1hbmlmZXN0X2ZpbGVuYW1lCisgICAgICAgIG1tLnJ1bigpCisgICAgICAgIHNlbGYuZmlsZWxpc3QgPSBtbS5maWxlbGlzdAorCisgICAgZGVmIGNoZWNrX2Jyb2tlbl9lZ2dfaW5mbyhzZWxmKToKKyAgICAgICAgYmVpID0gc2VsZi5lZ2dfbmFtZSsnLmVnZy1pbmZvJworICAgICAgICBpZiBzZWxmLmVnZ19iYXNlICE9IG9zLmN1cmRpcjoKKyAgICAgICAgICAgIGJlaSA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19iYXNlLCBiZWkpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGJlaSk6CisgICAgICAgICAgICBsb2cud2FybigKKyAgICAgICAgICAgICAgICAiLSIqNzgrJ1xuJworICAgICAgICAgICAgICAgICJOb3RlOiBZb3VyIGN1cnJlbnQgLmVnZy1pbmZvIGRpcmVjdG9yeSBoYXMgYSAnLScgaW4gaXRzIG5hbWU7IgorICAgICAgICAgICAgICAgICdcbnRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgd2l0aCAic2V0dXAucHkgZGV2ZWxvcCIuXG5cbicKKyAgICAgICAgICAgICAgICAnUGxlYXNlIHJlbmFtZSAlcyB0byAlcyB0byBjb3JyZWN0IHRoaXMgcHJvYmxlbS5cbicrJy0nKjc4LAorICAgICAgICAgICAgICAgIGJlaSwgc2VsZi5lZ2dfaW5mbworICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5icm9rZW5fZWdnX2luZm8gPSBzZWxmLmVnZ19pbmZvCisgICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gYmVpICAgICAjIG1ha2UgaXQgd29yayBmb3Igbm93CisKK2NsYXNzIEZpbGVMaXN0KEZpbGVMaXN0KToKKyAgICAiIiJGaWxlIGxpc3QgdGhhdCBhY2NlcHRzIG9ubHkgZXhpc3RpbmcsIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGhzIiIiCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIGl0ZW0pOgorICAgICAgICBwYXRoID0gY29udmVydF9wYXRoKGl0ZW0pCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQocGF0aCkKKworCisKKworCisKKworCisKKworCitjbGFzcyBtYW5pZmVzdF9tYWtlcihzZGlzdCk6CisKKyAgICB0ZW1wbGF0ZSA9ICJNQU5JRkVTVC5pbiIKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLnVzZV9kZWZhdWx0cyA9IDEKKyAgICAgICAgc2VsZi5wcnVuZSA9IDEKKyAgICAgICAgc2VsZi5tYW5pZmVzdF9vbmx5ID0gMQorICAgICAgICBzZWxmLmZvcmNlX21hbmlmZXN0ID0gMQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuZmlsZWxpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLm1hbmlmZXN0KToKKyAgICAgICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKSAgICMgaXQgbXVzdCBleGlzdCBzbyBpdCdsbCBnZXQgaW4gdGhlIGxpc3QKKyAgICAgICAgc2VsZi5maWxlbGlzdC5maW5kYWxsKCkKKyAgICAgICAgc2VsZi5hZGRfZGVmYXVsdHMoKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRlbXBsYXRlKToKKyAgICAgICAgICAgIHNlbGYucmVhZF90ZW1wbGF0ZSgpCisgICAgICAgIHNlbGYucHJ1bmVfZmlsZV9saXN0KCkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5zb3J0KCkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5yZW1vdmVfZHVwbGljYXRlcygpCisgICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKQorCisgICAgZGVmIHdyaXRlX21hbmlmZXN0IChzZWxmKToKKyAgICAgICAgIiIiV3JpdGUgdGhlIGZpbGUgbGlzdCBpbiAnc2VsZi5maWxlbGlzdCcgKHByZXN1bWFibHkgYXMgZmlsbGVkIGluCisgICAgICAgIGJ5ICdhZGRfZGVmYXVsdHMoKScgYW5kICdyZWFkX3RlbXBsYXRlKCknKSB0byB0aGUgbWFuaWZlc3QgZmlsZQorICAgICAgICBuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcuCisgICAgICAgICIiIgorICAgICAgICBmaWxlcyA9IHNlbGYuZmlsZWxpc3QuZmlsZXMKKyAgICAgICAgaWYgb3Muc2VwIT0nLyc6CisgICAgICAgICAgICBmaWxlcyA9IFtmLnJlcGxhY2Uob3Muc2VwLCcvJykgZm9yIGYgaW4gZmlsZXNdCisgICAgICAgIHNlbGYuZXhlY3V0ZShmaWxlX3V0aWwud3JpdGVfZmlsZSwgKHNlbGYubWFuaWZlc3QsIGZpbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICJ3cml0aW5nIG1hbmlmZXN0IGZpbGUgJyVzJyIgJSBzZWxmLm1hbmlmZXN0KQorCisKKworCisKKyAgICBkZWYgYWRkX2RlZmF1bHRzKHNlbGYpOgorICAgICAgICBzZGlzdC5hZGRfZGVmYXVsdHMoc2VsZikKKyAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoc2VsZi50ZW1wbGF0ZSkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoc2VsZi5tYW5pZmVzdCkKKyAgICAgICAgcmNmaWxlcyA9IGxpc3Qod2Fsa19yZXZjdHJsKCkpCisgICAgICAgIGlmIHJjZmlsZXM6CisgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChyY2ZpbGVzKQorICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYubWFuaWZlc3QpOgorICAgICAgICAgICAgc2VsZi5yZWFkX21hbmlmZXN0KCkKKyAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKKyAgICAgICAgc2VsZi5maWxlbGlzdC5pbmNsdWRlX3BhdHRlcm4oIioiLCBwcmVmaXg9ZWlfY21kLmVnZ19pbmZvKQorCisgICAgZGVmIHBydW5lX2ZpbGVfbGlzdCAoc2VsZik6CisgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKKyAgICAgICAgYmFzZV9kaXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQorICAgICAgICBzZWxmLmZpbGVsaXN0LmV4Y2x1ZGVfcGF0dGVybihOb25lLCBwcmVmaXg9YnVpbGQuYnVpbGRfYmFzZSkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5leGNsdWRlX3BhdHRlcm4oTm9uZSwgcHJlZml4PWJhc2VfZGlyKQorICAgICAgICBzZXAgPSByZS5lc2NhcGUob3Muc2VwKQorICAgICAgICBzZWxmLmZpbGVsaXN0LmV4Y2x1ZGVfcGF0dGVybihzZXArcicoUkNTfENWU3xcLnN2biknK3NlcCwgaXNfcmVnZXg9MSkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworZGVmIHdyaXRlX3BrZ19pbmZvKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKKyAgICBsb2cuaW5mbygid3JpdGluZyAlcyIsIGZpbGVuYW1lKQorICAgIGlmIG5vdCBjbWQuZHJ5X3J1bjoKKyAgICAgICAgbWV0YWRhdGEgPSBjbWQuZGlzdHJpYnV0aW9uLm1ldGFkYXRhCisgICAgICAgIG1ldGFkYXRhLnZlcnNpb24sIG9sZHZlciA9IGNtZC5lZ2dfdmVyc2lvbiwgbWV0YWRhdGEudmVyc2lvbgorICAgICAgICBtZXRhZGF0YS5uYW1lLCBvbGRuYW1lICAgPSBjbWQuZWdnX25hbWUsIG1ldGFkYXRhLm5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyB3cml0ZSB1bmVzY2FwZWQgZGF0YSB0byBQS0ctSU5GTywgc28gb2xkZXIgcGtnX3Jlc291cmNlcworICAgICAgICAgICAgIyBjYW4gc3RpbGwgcGFyc2UgaXQKKyAgICAgICAgICAgIG1ldGFkYXRhLndyaXRlX3BrZ19pbmZvKGNtZC5lZ2dfaW5mbykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLnZlcnNpb24gPSBvbGRuYW1lLCBvbGR2ZXIKKworICAgICAgICBzYWZlID0gZ2V0YXR0cihjbWQuZGlzdHJpYnV0aW9uLCd6aXBfc2FmZScsTm9uZSkKKyAgICAgICAgaW1wb3J0IGJkaXN0X2VnZzsgYmRpc3RfZWdnLndyaXRlX3NhZmV0eV9mbGFnKGNtZC5lZ2dfaW5mbywgc2FmZSkKKworZGVmIHdhcm5fZGVwZW5kc19vYnNvbGV0ZShjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CisgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICBsb2cud2FybigKKyAgICAgICAgICAgICJXQVJOSU5HOiAnZGVwZW5kcy50eHQnIGlzIG5vdCB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgorICAgICAgICAgICAgIlVzZSB0aGUgaW5zdGFsbF9yZXF1aXJlcy9leHRyYXNfcmVxdWlyZSBzZXR1cCgpIGFyZ3MgaW5zdGVhZC4iCisgICAgICAgICkKKworCitkZWYgd3JpdGVfcmVxdWlyZW1lbnRzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKKyAgICBkaXN0ID0gY21kLmRpc3RyaWJ1dGlvbgorICAgIGRhdGEgPSBbJ1xuJy5qb2luKHlpZWxkX2xpbmVzKGRpc3QuaW5zdGFsbF9yZXF1aXJlcyBvciAoKSkpXQorICAgIGZvciBleHRyYSxyZXFzIGluIChkaXN0LmV4dHJhc19yZXF1aXJlIG9yIHt9KS5pdGVtcygpOgorICAgICAgICBkYXRhLmFwcGVuZCgnXG5cblslc11cbiVzJyAlIChleHRyYSwgJ1xuJy5qb2luKHlpZWxkX2xpbmVzKHJlcXMpKSkpCisgICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCJyZXF1aXJlbWVudHMiLCBmaWxlbmFtZSwgJycuam9pbihkYXRhKSkKKworZGVmIHdyaXRlX3RvcGxldmVsX25hbWVzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKKyAgICBwa2dzID0gZGljdC5mcm9ta2V5cygKKyAgICAgICAgW2suc3BsaXQoJy4nLDEpWzBdCisgICAgICAgICAgICBmb3IgayBpbiBjbWQuZGlzdHJpYnV0aW9uLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCkKKyAgICAgICAgXQorICAgICkKKyAgICBjbWQud3JpdGVfZmlsZSgidG9wLWxldmVsIG5hbWVzIiwgZmlsZW5hbWUsICdcbicuam9pbihwa2dzKSsnXG4nKQorCisKKworZGVmIG92ZXJ3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgorICAgIHdyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSwgVHJ1ZSkKKworZGVmIHdyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSwgZm9yY2U9RmFsc2UpOgorICAgIGFyZ25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKVswXQorICAgIHZhbHVlID0gZ2V0YXR0cihjbWQuZGlzdHJpYnV0aW9uLCBhcmduYW1lLCBOb25lKQorICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICB2YWx1ZSA9ICdcbicuam9pbih2YWx1ZSkrJ1xuJworICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZShhcmduYW1lLCBmaWxlbmFtZSwgdmFsdWUsIGZvcmNlKQorCitkZWYgd3JpdGVfZW50cmllcyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CisgICAgZXAgPSBjbWQuZGlzdHJpYnV0aW9uLmVudHJ5X3BvaW50cworCisgICAgaWYgaXNpbnN0YW5jZShlcCxiYXNlc3RyaW5nKSBvciBlcCBpcyBOb25lOgorICAgICAgICBkYXRhID0gZXAKKyAgICBlbGlmIGVwIGlzIG5vdCBOb25lOgorICAgICAgICBkYXRhID0gW10KKyAgICAgICAgZm9yIHNlY3Rpb24sIGNvbnRlbnRzIGluIGVwLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb250ZW50cyxiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICBjb250ZW50cyA9IEVudHJ5UG9pbnQucGFyc2VfZ3JvdXAoc2VjdGlvbiwgY29udGVudHMpCisgICAgICAgICAgICAgICAgY29udGVudHMgPSAnXG4nLmpvaW4obWFwKHN0cixjb250ZW50cy52YWx1ZXMoKSkpCisgICAgICAgICAgICBkYXRhLmFwcGVuZCgnWyVzXVxuJXNcblxuJyAlIChzZWN0aW9uLGNvbnRlbnRzKSkKKyAgICAgICAgZGF0YSA9ICcnLmpvaW4oZGF0YSkKKworICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZSgnZW50cnkgcG9pbnRzJywgZmlsZW5hbWUsIGRhdGEsIFRydWUpCisKK2RlZiBnZXRfcGtnX2luZm9fcmV2aXNpb24oKToKKyAgICAjIFNlZSBpZiB3ZSBjYW4gZ2V0IGEgLXIjIyMgb2ZmIG9mIFBLRy1JTkZPLCBpbiBjYXNlIHRoaXMgaXMgYW4gc2Rpc3Qgb2YKKyAgICAjIGEgc3VidmVyc2lvbiByZXZpc2lvbgorICAgICMKKyAgICBpZiBvcy5wYXRoLmV4aXN0cygnUEtHLUlORk8nKToKKyAgICAgICAgZiA9IG9wZW4oJ1BLRy1JTkZPJywnclUnKQorICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyIlZlcnNpb246LiotcihcZCspXHMqJCIsIGxpbmUpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50KG1hdGNoLmdyb3VwKDEpKQorICAgIHJldHVybiAwCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGwucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiOWFmNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weQpAQCAtMCwwICsxLDEwMSBAQAoraW1wb3J0IHNldHVwdG9vbHMsIHN5cworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBpbnN0YWxsIGFzIF9pbnN0YWxsCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0FyZ0Vycm9yCisKK2NsYXNzIGluc3RhbGwoX2luc3RhbGwpOgorICAgICIiIlVzZSBlYXN5X2luc3RhbGwgdG8gaW5zdGFsbCB0aGUgcGFja2FnZSwgdy9kZXBlbmRlbmNpZXMiIiIKKworICAgIHVzZXJfb3B0aW9ucyA9IF9pbnN0YWxsLnVzZXJfb3B0aW9ucyArIFsKKyAgICAgICAgKCdvbGQtYW5kLXVubWFuYWdlYWJsZScsIE5vbmUsICJUcnkgbm90IHRvIHVzZSB0aGlzISIpLAorICAgICAgICAoJ3NpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCcsIE5vbmUsCisgICAgICAgICAgICAidXNlZCBieSBzeXN0ZW0gcGFja2FnZSBidWlsZGVycyB0byBjcmVhdGUgJ2ZsYXQnIGVnZ3MiKSwKKyAgICBdCisgICAgYm9vbGVhbl9vcHRpb25zID0gX2luc3RhbGwuYm9vbGVhbl9vcHRpb25zICsgWworICAgICAgICAnb2xkLWFuZC11bm1hbmFnZWFibGUnLCAnc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkJywKKyAgICBdCisgICAgbmV3X2NvbW1hbmRzID0gWworICAgICAgICAoJ2luc3RhbGxfZWdnX2luZm8nLCBsYW1iZGEgc2VsZjogVHJ1ZSksCisgICAgICAgICgnaW5zdGFsbF9zY3JpcHRzJywgIGxhbWJkYSBzZWxmOiBUcnVlKSwKKyAgICBdCisgICAgX25jID0gZGljdChuZXdfY29tbWFuZHMpCisgICAgc3ViX2NvbW1hbmRzID0gWworICAgICAgICBjbWQgZm9yIGNtZCBpbiBfaW5zdGFsbC5zdWJfY29tbWFuZHMgaWYgY21kWzBdIG5vdCBpbiBfbmMKKyAgICBdICsgbmV3X2NvbW1hbmRzCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfaW5zdGFsbC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5vbGRfYW5kX3VubWFuYWdlYWJsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgPSBOb25lCisgICAgICAgIHNlbGYubm9fY29tcGlsZSA9IE5vbmUgICMgbWFrZSBESVNUVVRJTFNfREVCVUcgd29yayByaWdodCEKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfaW5zdGFsbC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIGlmIHNlbGYucm9vdDoKKyAgICAgICAgICAgIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkID0gVHJ1ZQorICAgICAgICBlbGlmIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgorICAgICAgICAgICAgaWYgbm90IHNlbGYucm9vdCBhbmQgbm90IHNlbGYucmVjb3JkOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSAtLXJlY29yZCBvciAtLXJvb3Qgd2hlbiBidWlsZGluZyBzeXN0ZW0iCisgICAgICAgICAgICAgICAgICAgICIgcGFja2FnZXMiCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGhhbmRsZV9leHRyYV9wYXRoKHNlbGYpOgorICAgICAgICAjIFdlIGFsd2F5cyBpZ25vcmUgZXh0cmFfcGF0aCwgYmVjYXVzZSB3ZSBpbnN0YWxsIGFzIC5lZ2cgb3IgLmVnZy1pbmZvCisgICAgICAgIHNlbGYucGF0aF9maWxlID0gTm9uZQorICAgICAgICBzZWxmLmV4dHJhX2RpcnMgPSAnJworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIyBFeHBsaWNpdCByZXF1ZXN0IGZvciBvbGQtc3R5bGUgaW5zdGFsbD8gIEp1c3QgZG8gaXQKKyAgICAgICAgaWYgc2VsZi5vbGRfYW5kX3VubWFuYWdlYWJsZSBvciBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZDoKKyAgICAgICAgICAgIHJldHVybiBfaW5zdGFsbC5ydW4oc2VsZikKKworICAgICAgICAjIEF0dGVtcHQgdG8gZGV0ZWN0IHdoZXRoZXIgd2Ugd2VyZSBjYWxsZWQgZnJvbSBzZXR1cCgpIG9yIGJ5IGFub3RoZXIKKyAgICAgICAgIyBjb21tYW5kLiAgSWYgd2Ugd2VyZSBjYWxsZWQgYnkgc2V0dXAoKSwgb3VyIGNhbGxlciB3aWxsIGJlIHRoZQorICAgICAgICAjICdydW5fY29tbWFuZCcgbWV0aG9kIGluICdkaXN0dXRpbHMuZGlzdCcsIGFuZCAqaXRzKiBjYWxsZXIgd2lsbCBiZQorICAgICAgICAjIHRoZSAncnVuX2NvbW1hbmRzJyBtZXRob2QuICBJZiB3ZSB3ZXJlIGNhbGxlZCBhbnkgb3RoZXIgd2F5LCBvdXIKKyAgICAgICAgIyBpbW1lZGlhdGUgY2FsbGVyICptaWdodCogYmUgJ3J1bl9jb21tYW5kJywgYnV0IGl0IHdvbid0IGhhdmUgYmVlbgorICAgICAgICAjIGNhbGxlZCBieSAncnVuX2NvbW1hbmRzJy4gIFRoaXMgaXMgc2xpZ2h0bHkga2x1ZGd5LCBidXQgc2VlbXMgdG8KKyAgICAgICAgIyB3b3JrLgorICAgICAgICAjCisgICAgICAgIGNhbGxlciA9IHN5cy5fZ2V0ZnJhbWUoMikKKyAgICAgICAgY2FsbGVyX21vZHVsZSA9IGNhbGxlci5mX2dsb2JhbHMuZ2V0KCdfX25hbWVfXycsJycpCisgICAgICAgIGNhbGxlcl9uYW1lID0gY2FsbGVyLmZfY29kZS5jb19uYW1lCisKKyAgICAgICAgaWYgY2FsbGVyX21vZHVsZSAhPSAnZGlzdHV0aWxzLmRpc3QnIG9yIGNhbGxlcl9uYW1lIT0ncnVuX2NvbW1hbmRzJzoKKyAgICAgICAgICAgICMgV2Ugd2VyZW4ndCBjYWxsZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIHNldHVwKCksIHNvIHdlCisgICAgICAgICAgICAjIHNob3VsZCBydW4gaW4gYmFja3dhcmQtY29tcGF0aWJpbGl0eSBtb2RlIHRvIHN1cHBvcnQgYmRpc3RfKgorICAgICAgICAgICAgIyBjb21tYW5kcy4KKyAgICAgICAgICAgIF9pbnN0YWxsLnJ1bihzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kb19lZ2dfaW5zdGFsbCgpCisKKworCisKKworCisKKworCisKKworCisgICAgZGVmIGRvX2VnZ19pbnN0YWxsKHNlbGYpOgorCisgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgZWFzeV9pbnN0YWxsCisKKyAgICAgICAgY21kID0gZWFzeV9pbnN0YWxsKAorICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24sIGFyZ3M9IngiLCByb290PXNlbGYucm9vdCwgcmVjb3JkPXNlbGYucmVjb3JkLAorICAgICAgICApCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkgICMgZmluYWxpemUgYmVmb3JlIGJkaXN0X2VnZyBtdW5nZXMgaW5zdGFsbCBjbWQKKworICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdiZGlzdF9lZ2cnKQorICAgICAgICBhcmdzID0gW3NlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX29iaignYmRpc3RfZWdnJykuZWdnX291dHB1dF0KKworICAgICAgICBpZiBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb206CisgICAgICAgICAgICAjIEJvb3RzdHJhcCBzZWxmLWluc3RhbGxhdGlvbiBvZiBzZXR1cHRvb2xzCisgICAgICAgICAgICBhcmdzLmluc2VydCgwLCBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20pCisKKyAgICAgICAgY21kLmFyZ3MgPSBhcmdzCisgICAgICAgIGNtZC5ydW4oKQorICAgICAgICBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBOb25lCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTkzZTkxYQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQpAQCAtMCwwICsxLDgxIEBACitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19hcmNoaXZlCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbAoraW1wb3J0IG9zLCBzaHV0aWwsIHBrZ19yZXNvdXJjZXMKKworY2xhc3MgaW5zdGFsbF9lZ2dfaW5mbyhDb21tYW5kKToKKyAgICAiIiJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2luc3RhbGwtZGlyPScsICdkJywgImRpcmVjdG9yeSB0byBpbnN0YWxsIHRvIiksCisgICAgXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLCgnaW5zdGFsbF9kaXInLCdpbnN0YWxsX2RpcicpKQorICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQorICAgICAgICBiYXNlbmFtZSA9IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uKAorICAgICAgICAgICAgTm9uZSwgTm9uZSwgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24KKyAgICAgICAgKS5lZ2dfbmFtZSgpKycuZWdnLWluZm8nCisgICAgICAgIHNlbGYuc291cmNlID0gZWlfY21kLmVnZ19pbmZvCisgICAgICAgIHNlbGYudGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGJhc2VuYW1lKQorICAgICAgICBzZWxmLm91dHB1dHMgPSBbc2VsZi50YXJnZXRdCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCisgICAgICAgIHRhcmdldCA9IHNlbGYudGFyZ2V0CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc2VsZi50YXJnZXQpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoc2VsZi50YXJnZXQpOgorICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoc2VsZi50YXJnZXQsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGFyZ2V0KToKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShvcy51bmxpbmssKHNlbGYudGFyZ2V0LCksIlJlbW92aW5nICIrc2VsZi50YXJnZXQpCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBwa2dfcmVzb3VyY2VzLmVuc3VyZV9kaXJlY3Rvcnkoc2VsZi50YXJnZXQpCisgICAgICAgIHNlbGYuZXhlY3V0ZShzZWxmLmNvcHl0cmVlLCAoKSwKKyAgICAgICAgICAgICJDb3B5aW5nICVzIHRvICVzIiAlIChzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXQpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5pbnN0YWxsX25hbWVzcGFjZXMoKQorCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vdXRwdXRzCisKKyAgICBkZWYgY29weXRyZWUoc2VsZik6CisgICAgICAgICMgQ29weSB0aGUgLmVnZy1pbmZvIHRyZWUgdG8gc2l0ZS1wYWNrYWdlcworICAgICAgICBkZWYgc2tpbW1lcihzcmMsZHN0KToKKyAgICAgICAgICAgICMgZmlsdGVyIG91dCBzb3VyY2UtY29udHJvbCBkaXJlY3Rvcmllczsgbm90ZSB0aGF0ICdzcmMnIGlzIGFsd2F5cworICAgICAgICAgICAgIyBhICcvJy1zZXBhcmF0ZWQgcGF0aCwgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4gICdkc3QnIGlzIGEKKyAgICAgICAgICAgICMgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aC4KKyAgICAgICAgICAgIGZvciBza2lwIGluICcuc3ZuLycsJ0NWUy8nOgorICAgICAgICAgICAgICAgIGlmIHNyYy5zdGFydHN3aXRoKHNraXApIG9yICcvJytza2lwIGluIHNyYzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQoZHN0KQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3B5aW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCisgICAgICAgICAgICByZXR1cm4gZHN0CisgICAgICAgIHVucGFja19hcmNoaXZlKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCwgc2tpbW1lcikKKworICAgIGRlZiBpbnN0YWxsX25hbWVzcGFjZXMoc2VsZik6CisgICAgICAgIG5zcCA9IChzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMgb3IgW10pWzpdCisgICAgICAgIGlmIG5vdCBuc3A6IHJldHVybgorICAgICAgICBuc3Auc29ydCgpICAjIHNldCB1cCBzaG9ydGVyIG5hbWVzIGZpcnN0CisgICAgICAgIGZpbGVuYW1lLGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi50YXJnZXQpCisgICAgICAgIGZpbGVuYW1lICs9ICctbnNwa2cucHRoJzsgc2VsZi5vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKKyAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMiLGZpbGVuYW1lKQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsJ3diJykKKyAgICAgICAgICAgIGZvciBwa2cgaW4gbnNwOgorICAgICAgICAgICAgICAgIHB0aCA9IHR1cGxlKHBrZy5zcGxpdCgnLicpKQorICAgICAgICAgICAgICAgIGYud3JpdGUoCisgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzLG5ldyxvczsgIgorICAgICAgICAgICAgICAgICAgICAicCA9IG9zLnBhdGguam9pbihzeXMuX2dldGZyYW1lKDEpLmZfbG9jYWxzWydzaXRlZGlyJ10sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIqJShwdGgpcik7ICIKKyAgICAgICAgICAgICAgICAgICAgImllID0gb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHAsJ19faW5pdF9fLnB5JykpOyAiCisgICAgICAgICAgICAgICAgICAgICJtID0gbm90IGllIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCglKHBrZylyLG5ldy5tb2R1bGUoJShwa2cpcikpOyAiCisgICAgICAgICAgICAgICAgICAgICJtcCA9IChtIG9yIFtdKSBhbmQgbS5fX2RpY3RfXy5zZXRkZWZhdWx0KCdfX3BhdGhfXycsW10pOyAiCisgICAgICAgICAgICAgICAgICAgICIocCBub3QgaW4gbXApIGFuZCBtcC5hcHBlbmQocClcbiIKKyAgICAgICAgICAgICAgICAgICAgJSBsb2NhbHMoKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGYuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjOGRmZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHkKQEAgLTAsMCArMSw3NiBAQAorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2xpYiBpbXBvcnQgaW5zdGFsbF9saWIgYXMgX2luc3RhbGxfbGliCitpbXBvcnQgb3MKKworY2xhc3MgaW5zdGFsbF9saWIoX2luc3RhbGxfbGliKToKKyAgICAiIiJEb24ndCBhZGQgY29tcGlsZWQgZmxhZ3MgdG8gZmlsZW5hbWVzIG9mIG5vbi1QeXRob24gZmlsZXMiIiIKKworICAgIGRlZiBfYnl0ZWNvZGVfZmlsZW5hbWVzIChzZWxmLCBweV9maWxlbmFtZXMpOgorICAgICAgICBieXRlY29kZV9maWxlcyA9IFtdCisgICAgICAgIGZvciBweV9maWxlIGluIHB5X2ZpbGVuYW1lczoKKyAgICAgICAgICAgIGlmIG5vdCBweV9maWxlLmVuZHN3aXRoKCcucHknKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgc2VsZi5jb21waWxlOgorICAgICAgICAgICAgICAgIGJ5dGVjb2RlX2ZpbGVzLmFwcGVuZChweV9maWxlICsgImMiKQorICAgICAgICAgICAgaWYgc2VsZi5vcHRpbWl6ZSA+IDA6CisgICAgICAgICAgICAgICAgYnl0ZWNvZGVfZmlsZXMuYXBwZW5kKHB5X2ZpbGUgKyAibyIpCisKKyAgICAgICAgcmV0dXJuIGJ5dGVjb2RlX2ZpbGVzCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLmJ1aWxkKCkKKyAgICAgICAgb3V0ZmlsZXMgPSBzZWxmLmluc3RhbGwoKQorICAgICAgICBpZiBvdXRmaWxlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgYWx3YXlzIGNvbXBpbGUsIGluIGNhc2Ugd2UgaGF2ZSBhbnkgZXh0ZW5zaW9uIHN0dWJzIHRvIGRlYWwgd2l0aAorICAgICAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUob3V0ZmlsZXMpCisKKyAgICBkZWYgZ2V0X2V4Y2x1c2lvbnMoc2VsZik6CisgICAgICAgIGV4Y2x1ZGUgPSB7fQorICAgICAgICBuc3AgPSBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMKKworICAgICAgICBpZiAobnNwIGFuZCBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpCisgICAgICAgICAgICAgICAuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkCisgICAgICAgICk6CisgICAgICAgICAgICBmb3IgcGtnIGluIG5zcDoKKyAgICAgICAgICAgICAgICBwYXJ0cyA9IHBrZy5zcGxpdCgnLicpCisgICAgICAgICAgICAgICAgd2hpbGUgcGFydHM6CisgICAgICAgICAgICAgICAgICAgIHBrZ2RpciA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAqcGFydHMpCisgICAgICAgICAgICAgICAgICAgIGZvciBmIGluICdfX2luaXRfXy5weScsICdfX2luaXRfXy5weWMnLCAnX19pbml0X18ucHlvJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVbb3MucGF0aC5qb2luKHBrZ2RpcixmKV0gPSAxCisgICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCisgICAgICAgIHJldHVybiBleGNsdWRlCisKKyAgICBkZWYgY29weV90cmVlKAorICAgICAgICBzZWxmLCBpbmZpbGUsIG91dGZpbGUsCisgICAgICAgIHByZXNlcnZlX21vZGU9MSwgcHJlc2VydmVfdGltZXM9MSwgcHJlc2VydmVfc3ltbGlua3M9MCwgbGV2ZWw9MQorICAgICk6CisgICAgICAgIGFzc2VydCBwcmVzZXJ2ZV9tb2RlIGFuZCBwcmVzZXJ2ZV90aW1lcyBhbmQgbm90IHByZXNlcnZlX3N5bWxpbmtzCisgICAgICAgIGV4Y2x1ZGUgPSBzZWxmLmdldF9leGNsdXNpb25zKCkKKworICAgICAgICBpZiBub3QgZXhjbHVkZToKKyAgICAgICAgICAgIHJldHVybiBfaW5zdGFsbF9saWIuY29weV90cmVlKHNlbGYsIGluZmlsZSwgb3V0ZmlsZSkKKworICAgICAgICAjIEV4Y2x1ZGUgbmFtZXNwYWNlIHBhY2thZ2UgX19pbml0X18ucHkqIGZpbGVzIGZyb20gdGhlIG91dHB1dAorCisgICAgICAgIGZyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19kaXJlY3RvcnkKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCisgICAgICAgIG91dGZpbGVzID0gW10KKworICAgICAgICBkZWYgcGYoc3JjLCBkc3QpOgorICAgICAgICAgICAgaWYgZHN0IGluIGV4Y2x1ZGU6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIlNraXBwaW5nIGluc3RhbGxhdGlvbiBvZiAlcyAobmFtZXNwYWNlIHBhY2thZ2UpIixkc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgICAgIGxvZy5pbmZvKCJjb3B5aW5nICVzIC0+ICVzIiwgc3JjLCBvcy5wYXRoLmRpcm5hbWUoZHN0KSkKKyAgICAgICAgICAgIG91dGZpbGVzLmFwcGVuZChkc3QpCisgICAgICAgICAgICByZXR1cm4gZHN0CisKKyAgICAgICAgdW5wYWNrX2RpcmVjdG9yeShpbmZpbGUsIG91dGZpbGUsIHBmKQorICAgICAgICByZXR1cm4gb3V0ZmlsZXMKKworICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgb3V0cHV0cyA9IF9pbnN0YWxsX2xpYi5nZXRfb3V0cHV0cyhzZWxmKQorICAgICAgICBleGNsdWRlID0gc2VsZi5nZXRfZXhjbHVzaW9ucygpCisgICAgICAgIGlmIGV4Y2x1ZGU6CisgICAgICAgICAgICByZXR1cm4gW2YgZm9yIGYgaW4gb3V0cHV0cyBpZiBmIG5vdCBpbiBleGNsdWRlXQorICAgICAgICByZXR1cm4gb3V0cHV0cwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTU1OGJmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHkKQEAgLTAsMCArMSw1NiBAQAorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX3NjcmlwdHMgaW1wb3J0IGluc3RhbGxfc2NyaXB0cyBcCisgICAgIGFzIF9pbnN0YWxsX3NjcmlwdHMKK2Zyb20gZWFzeV9pbnN0YWxsIGltcG9ydCBnZXRfc2NyaXB0X2FyZ3MsIHN5c19leGVjdXRhYmxlCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBlbnN1cmVfZGlyZWN0b3J5CitpbXBvcnQgb3MKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgaW5zdGFsbF9zY3JpcHRzKF9pbnN0YWxsX3NjcmlwdHMpOgorICAgICIiIkRvIG5vcm1hbCBzY3JpcHQgaW5zdGFsbCwgcGx1cyBhbnkgZWdnX2luZm8gd3JhcHBlciBzY3JpcHRzIiIiCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfaW5zdGFsbF9zY3JpcHRzLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLm5vX2VwID0gRmFsc2UKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoImVnZ19pbmZvIikKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKKyAgICAgICAgICAgIF9pbnN0YWxsX3NjcmlwdHMucnVuKHNlbGYpICAjIHJ1biBmaXJzdCB0byBzZXQgdXAgc2VsZi5vdXRmaWxlcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vdXRmaWxlcyA9IFtdCisgICAgICAgIGlmIHNlbGYubm9fZXA6CisgICAgICAgICAgICAjIGRvbid0IGluc3RhbGwgZW50cnkgcG9pbnQgc2NyaXB0cyBpbnRvIC5lZ2cgZmlsZSEKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oCisgICAgICAgICAgICBlaV9jbWQuZWdnX2Jhc2UsIFBhdGhNZXRhZGF0YShlaV9jbWQuZWdnX2Jhc2UsIGVpX2NtZC5lZ2dfaW5mbyksCisgICAgICAgICAgICBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbiwKKyAgICAgICAgKQorICAgICAgICBic19jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc2NyaXB0cycpCisgICAgICAgIGV4ZWN1dGFibGUgPSBnZXRhdHRyKGJzX2NtZCwnZXhlY3V0YWJsZScsc3lzX2V4ZWN1dGFibGUpCisKKyAgICAgICAgZm9yIGFyZ3MgaW4gZ2V0X3NjcmlwdF9hcmdzKGRpc3QsIGV4ZWN1dGFibGUpOgorICAgICAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoKmFyZ3MpCisKKworCisKKworCisKKyAgICBkZWYgd3JpdGVfc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBjb250ZW50cywgbW9kZT0idCIsICppZ25vcmVkKToKKyAgICAgICAgIiIiV3JpdGUgYW4gZXhlY3V0YWJsZSBmaWxlIHRvIHRoZSBzY3JpcHRzIGRpcmVjdG9yeSIiIgorICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyBzY3JpcHQgdG8gJXMiLCBzY3JpcHRfbmFtZSwgc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIHNjcmlwdF9uYW1lKQorICAgICAgICBzZWxmLm91dGZpbGVzLmFwcGVuZCh0YXJnZXQpCisKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQorICAgICAgICAgICAgZiA9IG9wZW4odGFyZ2V0LCJ3Iittb2RlKQorICAgICAgICAgICAgZi53cml0ZShjb250ZW50cykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLmNobW9kKHRhcmdldCwwNzU1KQorICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgb3MuZXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGFhYjMxMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5CkBAIC0wLDAgKzEsNTcgQEAKK2ltcG9ydCBkaXN0dXRpbHMsIG9zCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCisKK2NsYXNzIHJvdGF0ZShDb21tYW5kKToKKyAgICAiIiJEZWxldGUgb2xkZXIgZGlzdHJpYnV0aW9ucyIiIgorCisgICAgZGVzY3JpcHRpb24gPSAiZGVsZXRlIG9sZGVyIGRpc3RyaWJ1dGlvbnMsIGtlZXBpbmcgTiBuZXdlc3QgZmlsZXMiCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ21hdGNoPScsICAgICdtJywgInBhdHRlcm5zIHRvIG1hdGNoIChyZXF1aXJlZCkiKSwKKyAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsICJkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpc3RyaWJ1dGlvbnMgYXJlIiksCisgICAgICAgICgna2VlcD0nLCAgICAgJ2snLCAibnVtYmVyIG9mIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbnMgdG8ga2VlcCIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFtdCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLm1hdGNoID0gTm9uZQorICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQorICAgICAgICBzZWxmLmtlZXAgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBvbmUgb3IgbW9yZSAoY29tbWEtc2VwYXJhdGVkKSBtYXRjaCBwYXR0ZXJucyAiCisgICAgICAgICAgICAgICAgIihlLmcuICcuemlwJyBvciAnLmVnZycpIgorICAgICAgICAgICAgKQorICAgICAgICBpZiBzZWxmLmtlZXAgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgbnVtYmVyIG9mIGZpbGVzIHRvIGtlZXAiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmtlZXAgPSBpbnQoc2VsZi5rZWVwKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLWtlZXAgbXVzdCBiZSBhbiBpbnRlZ2VyIikKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1hdGNoLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYubWF0Y2ggPSBbCisgICAgICAgICAgICAgICAgY29udmVydF9wYXRoKHAuc3RyaXAoKSkgZm9yIHAgaW4gc2VsZi5tYXRjaC5zcGxpdCgnLCcpCisgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQorICAgICAgICBmcm9tIGdsb2IgaW1wb3J0IGdsb2IKKyAgICAgICAgZm9yIHBhdHRlcm4gaW4gc2VsZi5tYXRjaDoKKyAgICAgICAgICAgIHBhdHRlcm4gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKycqJytwYXR0ZXJuCisgICAgICAgICAgICBmaWxlcyA9IGdsb2Iob3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIscGF0dGVybikpCisgICAgICAgICAgICBmaWxlcyA9IFsob3MucGF0aC5nZXRtdGltZShmKSxmKSBmb3IgZiBpbiBmaWxlc10KKyAgICAgICAgICAgIGZpbGVzLnNvcnQoKQorICAgICAgICAgICAgZmlsZXMucmV2ZXJzZSgpCisKKyAgICAgICAgICAgIGxvZy5pbmZvKCIlZCBmaWxlKHMpIG1hdGNoaW5nICVzIiwgbGVuKGZpbGVzKSwgcGF0dGVybikKKyAgICAgICAgICAgIGZpbGVzID0gZmlsZXNbc2VsZi5rZWVwOl0KKyAgICAgICAgICAgIGZvciAodCxmKSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBmKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWM1OGQ3MgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHkKQEAgLTAsMCArMSwyNCBAQAoraW1wb3J0IGRpc3R1dGlscywgb3MKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAorZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0IGltcG9ydCBlZGl0X2NvbmZpZywgb3B0aW9uX2Jhc2UKKworY2xhc3Mgc2F2ZW9wdHMob3B0aW9uX2Jhc2UpOgorICAgICIiIlNhdmUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBmaWxlIiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJzYXZlIHN1cHBsaWVkIG9wdGlvbnMgdG8gc2V0dXAuY2ZnIG9yIG90aGVyIGNvbmZpZyBmaWxlIgorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgZGlzdCA9IHNlbGYuZGlzdHJpYnV0aW9uCisgICAgICAgIGNvbW1hbmRzID0gZGlzdC5jb21tYW5kX29wdGlvbnMua2V5cygpCisgICAgICAgIHNldHRpbmdzID0ge30KKworICAgICAgICBmb3IgY21kIGluIGNvbW1hbmRzOgorCisgICAgICAgICAgICBpZiBjbWQ9PSdzYXZlb3B0cyc6CisgICAgICAgICAgICAgICAgY29udGludWUgICAgIyBkb24ndCBzYXZlIG91ciBvd24gb3B0aW9ucyEKKworICAgICAgICAgICAgZm9yIG9wdCwoc3JjLHZhbCkgaW4gZGlzdC5nZXRfb3B0aW9uX2RpY3QoY21kKS5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIHNyYz09ImNvbW1hbmQgbGluZSI6CisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldGRlZmF1bHQoY21kLHt9KVtvcHRdID0gdmFsCisKKyAgICAgICAgZWRpdF9jb25maWcoc2VsZi5maWxlbmFtZSwgc2V0dGluZ3MsIHNlbGYuZHJ5X3J1bikKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2Rpc3QucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyOWNkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5CkBAIC0wLDAgKzEsMTYzIEBACitmcm9tIGRpc3R1dGlscy5jb21tYW5kLnNkaXN0IGltcG9ydCBzZGlzdCBhcyBfc2Rpc3QKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAoraW1wb3J0IG9zLCByZSwgc3lzLCBwa2dfcmVzb3VyY2VzCisKK2VudGl0aWVzID0gWworICAgICgiJmx0OyIsIjwiKSwgKCImZ3Q7IiwgIj4iKSwgKCImcXVvdDsiLCAnIicpLCAoIiZhcG9zOyIsICInIiksCisgICAgKCImYW1wOyIsICImIikKK10KKworZGVmIHVuZXNjYXBlKGRhdGEpOgorICAgIGZvciBvbGQsbmV3IGluIGVudGl0aWVzOgorICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKG9sZCxuZXcpCisgICAgcmV0dXJuIGRhdGEKKworZGVmIHJlX2ZpbmRlcihwYXR0ZXJuLCBwb3N0cHJvYz1Ob25lKToKKyAgICBkZWYgZmluZChkaXJuYW1lLCBmaWxlbmFtZSk6CisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCdyVScpCisgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZm9yIG1hdGNoIGluIHBhdHRlcm4uZmluZGl0ZXIoZGF0YSk6CisgICAgICAgICAgICBwYXRoID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIHBvc3Rwcm9jOgorICAgICAgICAgICAgICAgIHBhdGggPSBwb3N0cHJvYyhwYXRoKQorICAgICAgICAgICAgeWllbGQgam9pbnBhdGgoZGlybmFtZSxwYXRoKQorICAgIHJldHVybiBmaW5kCisKK2RlZiBqb2lucGF0aChwcmVmaXgsc3VmZml4KToKKyAgICBpZiBub3QgcHJlZml4OgorICAgICAgICByZXR1cm4gc3VmZml4CisgICAgcmV0dXJuIG9zLnBhdGguam9pbihwcmVmaXgsc3VmZml4KQorCisKKworCisKKworCisKKworCisKK2RlZiB3YWxrX3JldmN0cmwoZGlybmFtZT0nJyk6CisgICAgIiIiRmluZCBhbGwgZmlsZXMgdW5kZXIgcmV2aXNpb24gY29udHJvbCIiIgorICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdzZXR1cHRvb2xzLmZpbGVfZmluZGVycycpOgorICAgICAgICBmb3IgaXRlbSBpbiBlcC5sb2FkKCkoZGlybmFtZSk6CisgICAgICAgICAgICB5aWVsZCBpdGVtCisKK2RlZiBfZGVmYXVsdF9yZXZjdHJsKGRpcm5hbWU9JycpOgorICAgIGZvciBwYXRoLCBmaW5kZXIgaW4gZmluZGVyczoKKyAgICAgICAgcGF0aCA9IGpvaW5wYXRoKGRpcm5hbWUscGF0aCkKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CisgICAgICAgICAgICBmb3IgcGF0aCBpbiBmaW5kZXIoZGlybmFtZSxwYXRoKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcGF0aAorICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gX2RlZmF1bHRfcmV2Y3RybChwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KKworZGVmIGV4dGVybmFsc19maW5kZXIoZGlybmFtZSwgZmlsZW5hbWUpOgorICAgICIiIkZpbmQgYW55ICdzdm46ZXh0ZXJuYWxzJyBkaXJlY3RvcmllcyIiIgorICAgIGZvdW5kID0gRmFsc2UKKyAgICBmID0gb3BlbihmaWxlbmFtZSwncmInKQorICAgIGZvciBsaW5lIGluIGl0ZXIoZi5yZWFkbGluZSwgJycpOiAgICAjIGNhbid0IHVzZSBkaXJlY3QgaXRlciEKKyAgICAgICAgcGFydHMgPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgaWYgbGVuKHBhcnRzKT09MjoKKyAgICAgICAgICAgIGtpbmQsbGVuZ3RoID0gcGFydHMKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoaW50KGxlbmd0aCkpCisgICAgICAgICAgICBpZiBraW5kPT0nSycgYW5kIGRhdGE9PSdzdm46ZXh0ZXJuYWxzJzoKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgIGVsaWYga2luZD09J1YnIGFuZCBmb3VuZDoKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByZXR1cm4KKworICAgIGZvciBsaW5lIGluIGRhdGEuc3BsaXRsaW5lcygpOgorICAgICAgICBwYXJ0cyA9IGxpbmUuc3BsaXQoKQorICAgICAgICBpZiBwYXJ0czoKKyAgICAgICAgICAgIHlpZWxkIGpvaW5wYXRoKGRpcm5hbWUsIHBhcnRzWzBdKQorCisKK2ZpbmRlcnMgPSBbCisgICAgKGNvbnZlcnRfcGF0aCgnQ1ZTL0VudHJpZXMnKSwKKyAgICAgICAgcmVfZmluZGVyKHJlLmNvbXBpbGUociJeXHc/LyhbXi9dKykvIiwgcmUuTSkpKSwKKyAgICAoY29udmVydF9wYXRoKCcuc3ZuL2VudHJpZXMnKSwKKyAgICAgICAgcmVfZmluZGVyKAorICAgICAgICAgICAgcmUuY29tcGlsZShyJ25hbWU9IihbXiJdKykiKD8hW14+XStkZWxldGVkPSJ0cnVlIiknLCByZS5JKSwKKyAgICAgICAgICAgIHVuZXNjYXBlCisgICAgICAgICkKKyAgICApLAorICAgIChjb252ZXJ0X3BhdGgoJy5zdm4vZGlyLXByb3BzJyksIGV4dGVybmFsc19maW5kZXIpLAorXQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3Mgc2Rpc3QoX3NkaXN0KToKKyAgICAiIiJTbWFydCBzZGlzdCB0aGF0IGZpbmRzIGFueXRoaW5nIHN1cHBvcnRlZCBieSByZXZpc2lvbiBjb250cm9sIiIiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnZm9ybWF0cz0nLCBOb25lLAorICAgICAgICAgImZvcm1hdHMgZm9yIHNvdXJjZSBkaXN0cmlidXRpb24gKGNvbW1hLXNlcGFyYXRlZCBsaXN0KSIpLAorICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKKyAgICAgICAgICJrZWVwIHRoZSBkaXN0cmlidXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgY3JlYXRpbmcgIiArCisgICAgICAgICAiYXJjaGl2ZSBmaWxlKHMpIiksCisgICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAorICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gYXJjaGl2ZShzKSBpbiAiCisgICAgICAgICAiW2RlZmF1bHQ6IGRpc3RdIiksCisgICAgICAgIF0KKworICAgIG5lZ2F0aXZlX29wdCA9IHt9CisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCisgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCisgICAgICAgIHNlbGYuZmlsZWxpc3QgPSBlaV9jbWQuZmlsZWxpc3QKKyAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQob3MucGF0aC5qb2luKGVpX2NtZC5lZ2dfaW5mbywnU09VUkNFUy50eHQnKSkKKworICAgICAgICBzZWxmLmNoZWNrX21ldGFkYXRhKCkKKyAgICAgICAgc2VsZi5tYWtlX2Rpc3RyaWJ1dGlvbigpCisKKyAgICAgICAgZGlzdF9maWxlcyA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sJ2Rpc3RfZmlsZXMnLFtdKQorICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLmFyY2hpdmVfZmlsZXM6CisgICAgICAgICAgICBkYXRhID0gKCdzZGlzdCcsICcnLCBmaWxlKQorICAgICAgICAgICAgaWYgZGF0YSBub3QgaW4gZGlzdF9maWxlczoKKyAgICAgICAgICAgICAgICBkaXN0X2ZpbGVzLmFwcGVuZChkYXRhKQorCisgICAgZGVmIHJlYWRfdGVtcGxhdGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9zZGlzdC5yZWFkX3RlbXBsYXRlKHNlbGYpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgZ3JvZHkgaGFjayB0byBjbG9zZSB0aGUgdGVtcGxhdGUgZmlsZSAoTUFOSUZFU1QuaW4pCisgICAgICAgICAgICAjIHRoaXMgcHJldmVudHMgZWFzeV9pbnN0YWxsJ3MgYXR0ZW1wdCBhdCBkZWxldGluZyB0aGUgZmlsZSBmcm9tCisgICAgICAgICAgICAjIGR5aW5nIGFuZCB0aHVzIG1hc2tpbmcgdGhlIHJlYWwgZXJyb3IKKyAgICAgICAgICAgIHN5cy5leGNfaW5mbygpWzJdLnRiX25leHQudGJfZnJhbWUuZl9sb2NhbHNbJ3RlbXBsYXRlJ10uY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTBjMTA1OAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5CkBAIC0wLDAgKzEsMTU4IEBACitpbXBvcnQgZGlzdHV0aWxzLCBvcworZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKgorCitfX2FsbF9fID0gWydjb25maWdfZmlsZScsICdlZGl0X2NvbmZpZycsICdvcHRpb25fYmFzZScsICdzZXRvcHQnXQorCisKK2RlZiBjb25maWdfZmlsZShraW5kPSJsb2NhbCIpOgorICAgICIiIkdldCB0aGUgZmlsZW5hbWUgb2YgdGhlIGRpc3R1dGlscywgbG9jYWwsIGdsb2JhbCwgb3IgcGVyLXVzZXIgY29uZmlnCisKKyAgICBga2luZGAgbXVzdCBiZSBvbmUgb2YgImxvY2FsIiwgImdsb2JhbCIsIG9yICJ1c2VyIgorICAgICIiIgorICAgIGlmIGtpbmQ9PSdsb2NhbCc6CisgICAgICAgIHJldHVybiAnc2V0dXAuY2ZnJworICAgIGlmIGtpbmQ9PSdnbG9iYWwnOgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRpc3R1dGlscy5fX2ZpbGVfXyksJ2Rpc3R1dGlscy5jZmcnCisgICAgICAgICkKKyAgICBpZiBraW5kPT0ndXNlcic6CisgICAgICAgIGRvdCA9IG9zLm5hbWU9PSdwb3NpeCcgYW5kICcuJyBvciAnJworICAgICAgICByZXR1cm4gb3MucGF0aC5leHBhbmR1c2VyKGNvbnZlcnRfcGF0aCgifi8lc3B5ZGlzdHV0aWxzLmNmZyIgJSBkb3QpKQorICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICJjb25maWdfZmlsZSgpIHR5cGUgbXVzdCBiZSAnbG9jYWwnLCAnZ2xvYmFsJywgb3IgJ3VzZXInIiwga2luZAorICAgICkKKworCisKKworCisKKworCisKKworCisKKworCisKK2RlZiBlZGl0X2NvbmZpZyhmaWxlbmFtZSwgc2V0dGluZ3MsIGRyeV9ydW49RmFsc2UpOgorICAgICIiIkVkaXQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW5jbHVkZSBgc2V0dGluZ3NgCisKKyAgICBgc2V0dGluZ3NgIGlzIGEgZGljdGlvbmFyeSBvZiBkaWN0aW9uYXJpZXMgb3IgYGBOb25lYGAgdmFsdWVzLCBrZXllZCBieQorICAgIGNvbW1hbmQvc2VjdGlvbiBuYW1lLiAgQSBgYE5vbmVgYCB2YWx1ZSBtZWFucyB0byBkZWxldGUgdGhlIGVudGlyZSBzZWN0aW9uLAorICAgIHdoaWxlIGEgZGljdGlvbmFyeSBsaXN0cyBzZXR0aW5ncyB0byBiZSBjaGFuZ2VkIG9yIGRlbGV0ZWQgaW4gdGhhdCBzZWN0aW9uLgorICAgIEEgc2V0dGluZyBvZiBgYE5vbmVgYCBtZWFucyB0byBkZWxldGUgdGhhdCBzZXR0aW5nLgorICAgICIiIgorICAgIGZyb20gQ29uZmlnUGFyc2VyIGltcG9ydCBSYXdDb25maWdQYXJzZXIKKyAgICBsb2cuZGVidWcoIlJlYWRpbmcgY29uZmlndXJhdGlvbiBmcm9tICVzIiwgZmlsZW5hbWUpCisgICAgb3B0cyA9IFJhd0NvbmZpZ1BhcnNlcigpCisgICAgb3B0cy5yZWFkKFtmaWxlbmFtZV0pCisgICAgZm9yIHNlY3Rpb24sIG9wdGlvbnMgaW4gc2V0dGluZ3MuaXRlbXMoKToKKyAgICAgICAgaWYgb3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nIHNlY3Rpb24gWyVzXSBmcm9tICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCisgICAgICAgICAgICBvcHRzLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3Qgb3B0cy5oYXNfc2VjdGlvbihzZWN0aW9uKToKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBuZXcgc2VjdGlvbiBbJXNdIHRvICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgb3B0cy5hZGRfc2VjdGlvbihzZWN0aW9uKQorICAgICAgICAgICAgZm9yIG9wdGlvbix2YWx1ZSBpbiBvcHRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGluZyAlcy4lcyBmcm9tICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBvcHRzLnJlbW92ZV9vcHRpb24oc2VjdGlvbixvcHRpb24pCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRzLm9wdGlvbnMoc2VjdGlvbik6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgZW1wdHkgWyVzXSBzZWN0aW9uIGZyb20gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5yZW1vdmVfc2VjdGlvbihzZWN0aW9uKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nICVzLiVzIHRvICVyIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUsIGZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgb3B0cy5zZXQoc2VjdGlvbixvcHRpb24sdmFsdWUpCisKKyAgICBsb2cuaW5mbygiV3JpdGluZyAlcyIsIGZpbGVuYW1lKQorICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwndycpOyBvcHRzLndyaXRlKGYpOyBmLmNsb3NlKCkKKworY2xhc3Mgb3B0aW9uX2Jhc2UoQ29tbWFuZCk6CisgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29tbWFuZHMgdGhhdCBtZXNzIHdpdGggY29uZmlnIGZpbGVzIiIiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnZ2xvYmFsLWNvbmZpZycsICdnJywKKyAgICAgICAgICAgICAgICAgInNhdmUgb3B0aW9ucyB0byB0aGUgc2l0ZS13aWRlIGRpc3R1dGlscy5jZmcgZmlsZSIpLAorICAgICAgICAoJ3VzZXItY29uZmlnJywgJ3UnLAorICAgICAgICAgICAgICAgICAic2F2ZSBvcHRpb25zIHRvIHRoZSBjdXJyZW50IHVzZXIncyBweWRpc3R1dGlscy5jZmcgZmlsZSIpLAorICAgICAgICAoJ2ZpbGVuYW1lPScsICdmJywKKyAgICAgICAgICAgICAgICAgImNvbmZpZ3VyYXRpb24gZmlsZSB0byB1c2UgKGRlZmF1bHQ9c2V0dXAuY2ZnKSIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKKyAgICAgICAgJ2dsb2JhbC1jb25maWcnLCAndXNlci1jb25maWcnLAorICAgIF0KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuZ2xvYmFsX2NvbmZpZyA9IE5vbmUKKyAgICAgICAgc2VsZi51c2VyX2NvbmZpZyAgID0gTm9uZQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGZpbGVuYW1lcyA9IFtdCisgICAgICAgIGlmIHNlbGYuZ2xvYmFsX2NvbmZpZzoKKyAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ2dsb2JhbCcpKQorICAgICAgICBpZiBzZWxmLnVzZXJfY29uZmlnOgorICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgndXNlcicpKQorICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChzZWxmLmZpbGVuYW1lKQorICAgICAgICBpZiBub3QgZmlsZW5hbWVzOgorICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgnbG9jYWwnKSkKKyAgICAgICAgaWYgbGVuKGZpbGVuYW1lcyk+MToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgb25seSBvbmUgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiIsCisgICAgICAgICAgICAgICAgZmlsZW5hbWVzCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuZmlsZW5hbWUsID0gZmlsZW5hbWVzCisKKworCisKK2NsYXNzIHNldG9wdChvcHRpb25fYmFzZSk6CisgICAgIiIiU2F2ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIGZpbGUiIiIKKworICAgIGRlc2NyaXB0aW9uID0gInNldCBhbiBvcHRpb24gaW4gc2V0dXAuY2ZnIG9yIGFub3RoZXIgY29uZmlnIGZpbGUiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnY29tbWFuZD0nLCAnYycsICdjb21tYW5kIHRvIHNldCBhbiBvcHRpb24gZm9yJyksCisgICAgICAgICgnb3B0aW9uPScsICAnbycsICAnb3B0aW9uIHRvIHNldCcpLAorICAgICAgICAoJ3NldC12YWx1ZT0nLCAgICdzJywgJ3ZhbHVlIG9mIHRoZSBvcHRpb24nKSwKKyAgICAgICAgKCdyZW1vdmUnLCAgICdyJywgJ3JlbW92ZSAodW5zZXQpIHRoZSB2YWx1ZScpLAorICAgIF0gKyBvcHRpb25fYmFzZS51c2VyX29wdGlvbnMKKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9wdGlvbl9iYXNlLmJvb2xlYW5fb3B0aW9ucyArIFsncmVtb3ZlJ10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIG9wdGlvbl9iYXNlLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCisgICAgICAgIHNlbGYub3B0aW9uID0gTm9uZQorICAgICAgICBzZWxmLnNldF92YWx1ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBpZiBzZWxmLmNvbW1hbmQgaXMgTm9uZSBvciBzZWxmLm9wdGlvbiBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSAtLWNvbW1hbmQgKmFuZCogLS1vcHRpb24iKQorICAgICAgICBpZiBzZWxmLnNldF92YWx1ZSBpcyBOb25lIGFuZCBub3Qgc2VsZi5yZW1vdmU6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IC0tc2V0LXZhbHVlIG9yIC0tcmVtb3ZlIikKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGVkaXRfY29uZmlnKAorICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgeworICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZDoge3NlbGYub3B0aW9uLnJlcGxhY2UoJy0nLCdfJyk6c2VsZi5zZXRfdmFsdWV9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgc2VsZi5kcnlfcnVuCisgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZjYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5CkBAIC0wLDAgKzEsMTE5IEBACitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKK2ltcG9ydCBzeXMKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKgorZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdExvYWRlciwgbWFpbgorCitjbGFzcyBTY2FubmluZ0xvYWRlcihUZXN0TG9hZGVyKToKKworICAgIGRlZiBsb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgICIiIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIG1vZHVsZQorCisgICAgICAgIElmIHRoZSBtb2R1bGUgaXMgYSBwYWNrYWdlLCBsb2FkIHRlc3RzIGZyb20gYWxsIHRoZSBtb2R1bGVzIGluIGl0LgorICAgICAgICBJZiB0aGUgbW9kdWxlIGhhcyBhbiBgYGFkZGl0aW9uYWxfdGVzdHNgYCBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgYWRkCisgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIHRlc3RzLgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdHMgPSBbXQorICAgICAgICBpZiBtb2R1bGUuX19uYW1lX18hPSdzZXR1cHRvb2xzLnRlc3RzLmRvY3Rlc3QnOiAgIyB1Z2gKKyAgICAgICAgICAgIHRlc3RzLmFwcGVuZChUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZixtb2R1bGUpKQorCisgICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAiYWRkaXRpb25hbF90ZXN0cyIpOgorICAgICAgICAgICAgdGVzdHMuYXBwZW5kKG1vZHVsZS5hZGRpdGlvbmFsX3Rlc3RzKCkpCisKKyAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgorICAgICAgICAgICAgZm9yIGZpbGUgaW4gcmVzb3VyY2VfbGlzdGRpcihtb2R1bGUuX19uYW1lX18sICcnKToKKyAgICAgICAgICAgICAgICBpZiBmaWxlLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZSE9J19faW5pdF9fLnB5JzoKKyAgICAgICAgICAgICAgICAgICAgc3VibW9kdWxlID0gbW9kdWxlLl9fbmFtZV9fKycuJytmaWxlWzotM10KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiByZXNvdXJjZV9leGlzdHMoCisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuX19uYW1lX18sIGZpbGUrJy9fX2luaXRfXy5weScKKyAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZSA9IG1vZHVsZS5fX25hbWVfXysnLicrZmlsZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB0ZXN0cy5hcHBlbmQoc2VsZi5sb2FkVGVzdHNGcm9tTmFtZShzdWJtb2R1bGUpKQorCisgICAgICAgIGlmIGxlbih0ZXN0cykhPTE6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZUNsYXNzKHRlc3RzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHRlc3RzWzBdICMgZG9uJ3QgY3JlYXRlIGEgbmVzdGVkIHN1aXRlIGZvciBvbmx5IG9uZSByZXR1cm4KKworCitjbGFzcyB0ZXN0KENvbW1hbmQpOgorCisgICAgIiIiQ29tbWFuZCB0byBydW4gdW5pdCB0ZXN0cyBhZnRlciBpbi1wbGFjZSBidWlsZCIiIgorCisgICAgZGVzY3JpcHRpb24gPSAicnVuIHVuaXQgdGVzdHMgYWZ0ZXIgaW4tcGxhY2UgYnVpbGQiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgndGVzdC1tb2R1bGU9JywnbScsICJSdW4gJ3Rlc3Rfc3VpdGUnIGluIHNwZWNpZmllZCBtb2R1bGUiKSwKKyAgICAgICAgKCd0ZXN0LXN1aXRlPScsJ3MnLAorICAgICAgICAgICAgIlRlc3Qgc3VpdGUgdG8gcnVuIChlLmcuICdzb21lX21vZHVsZS50ZXN0X3N1aXRlJykiKSwKKyAgICBdCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBOb25lCisgICAgICAgIHNlbGYudGVzdF9tb2R1bGUgPSBOb25lCisgICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSBOb25lCisKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorCisgICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi50ZXN0X21vZHVsZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IHNlbGYuZGlzdHJpYnV0aW9uLnRlc3Rfc3VpdGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gc2VsZi50ZXN0X21vZHVsZSsiLnRlc3Rfc3VpdGUiCisgICAgICAgIGVsaWYgc2VsZi50ZXN0X21vZHVsZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICJZb3UgbWF5IHNwZWNpZnkgYSBtb2R1bGUgb3IgYSBzdWl0ZSwgYnV0IG5vdCBib3RoIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYudGVzdF9hcmdzID0gW3NlbGYudGVzdF9zdWl0ZV0KKworICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBzZWxmLnRlc3RfYXJncy5pbnNlcnQoMCwnLS12ZXJib3NlJykKKyAgICAgICAgaWYgc2VsZi50ZXN0X2xvYWRlciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sJ3Rlc3RfbG9hZGVyJyxOb25lKQorICAgICAgICBpZiBzZWxmLnRlc3RfbG9hZGVyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gInNldHVwdG9vbHMuY29tbWFuZC50ZXN0OlNjYW5uaW5nTG9hZGVyIgorCisKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICMgRW5zdXJlIG1ldGFkYXRhIGlzIHVwLXRvLWRhdGUKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQorCisgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucyBpbi1wbGFjZQorICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTEpCisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCisKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24udGVzdHNfcmVxdWlyZToKKyAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmZldGNoX2J1aWxkX2VnZ3Moc2VsZi5kaXN0cmlidXRpb24udGVzdHNfcmVxdWlyZSkKKworICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGU6CisgICAgICAgICAgICBjbWQgPSAnICcuam9pbihzZWxmLnRlc3RfYXJncykKKyAgICAgICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCdza2lwcGluZyAidW5pdHRlc3QgJXMiIChkcnkgcnVuKScgJSBjbWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ3J1bm5pbmcgInVuaXR0ZXN0ICVzIicgJSBjbWQpCisgICAgICAgICAgICAgICAgc2VsZi5ydW5fdGVzdHMoKQorCisKKyAgICBkZWYgcnVuX3Rlc3RzKHNlbGYpOgorICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICAgICAgb2xkX3BhdGggPSBzeXMucGF0aFs6XQorICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQorICAgICAgICBwYXRoX2l0ZW0gPSBub3JtYWxpemVfcGF0aChlaV9jbWQuZWdnX2Jhc2UpCisgICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKAorICAgICAgICAgICAgcGF0aF9pdGVtLCBub3JtYWxpemVfcGF0aChlaV9jbWQuZWdnX2luZm8pCisgICAgICAgICkKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihwYXRoX2l0ZW0sIG1ldGFkYXRhLCBwcm9qZWN0X25hbWU9ZWlfY21kLmVnZ19uYW1lKQorICAgICAgICB3b3JraW5nX3NldC5hZGQoZGlzdCkKKyAgICAgICAgcmVxdWlyZShzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKSkKKyAgICAgICAgbG9hZGVyX2VwID0gRW50cnlQb2ludC5wYXJzZSgieD0iK3NlbGYudGVzdF9sb2FkZXIpCisgICAgICAgIGxvYWRlcl9jbGFzcyA9IGxvYWRlcl9lcC5sb2FkKHJlcXVpcmU9RmFsc2UpCisgICAgICAgIHVuaXR0ZXN0Lm1haW4oCisgICAgICAgICAgICBOb25lLCBOb25lLCBbdW5pdHRlc3QuX19maWxlX19dK3NlbGYudGVzdF9hcmdzLAorICAgICAgICAgICAgdGVzdExvYWRlciA9IGxvYWRlcl9jbGFzcygpCisgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQ0YzQwMAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5CkBAIC0wLDAgKzEsMTc4IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC51cGxvYWQKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICd1cGxvYWQnIHN1YmNvbW1hbmQgKHVwbG9hZCBwYWNrYWdlIHRvIFB5UEkpLiIiIgorCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICoKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBtZDUgaW1wb3J0IG1kNQoraW1wb3J0IG9zCitpbXBvcnQgc29ja2V0CitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBDb25maWdQYXJzZXIKK2ltcG9ydCBodHRwbGliCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgdXJscGFyc2UKK2ltcG9ydCBjU3RyaW5nSU8gYXMgU3RyaW5nSU8KKworY2xhc3MgdXBsb2FkKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAidXBsb2FkIGJpbmFyeSBwYWNrYWdlIHRvIFB5UEkiCisKKyAgICBERUZBVUxUX1JFUE9TSVRPUlkgPSAnaHR0cDovL3d3dy5weXRob24ub3JnL3B5cGknCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgncmVwb3NpdG9yeT0nLCAncicsCisgICAgICAgICAidXJsIG9mIHJlcG9zaXRvcnkgW2RlZmF1bHQ6ICVzXSIgJSBERUZBVUxUX1JFUE9TSVRPUlkpLAorICAgICAgICAoJ3Nob3ctcmVzcG9uc2UnLCBOb25lLAorICAgICAgICAgJ2Rpc3BsYXkgZnVsbCByZXNwb25zZSB0ZXh0IGZyb20gc2VydmVyJyksCisgICAgICAgICgnc2lnbicsICdzJywKKyAgICAgICAgICdzaWduIGZpbGVzIHRvIHVwbG9hZCB1c2luZyBncGcnKSwKKyAgICAgICAgKCdpZGVudGl0eT0nLCAnaScsICdHUEcgaWRlbnRpdHkgdXNlZCB0byBzaWduIGZpbGVzJyksCisgICAgICAgIF0KKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ3Nob3ctcmVzcG9uc2UnLCAnc2lnbiddCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnVzZXJuYW1lID0gJycKKyAgICAgICAgc2VsZi5wYXNzd29yZCA9ICcnCisgICAgICAgIHNlbGYucmVwb3NpdG9yeSA9ICcnCisgICAgICAgIHNlbGYuc2hvd19yZXNwb25zZSA9IDAKKyAgICAgICAgc2VsZi5zaWduID0gRmFsc2UKKyAgICAgICAgc2VsZi5pZGVudGl0eSA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmlkZW50aXR5IGFuZCBub3Qgc2VsZi5zaWduOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIk11c3QgdXNlIC0tc2lnbiBmb3IgLS1pZGVudGl0eSB0byBoYXZlIG1lYW5pbmciCisgICAgICAgICAgICApCisgICAgICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgnSE9NRScpOgorICAgICAgICAgICAgcmMgPSBvcy5wYXRoLmpvaW4ob3MuZW52aXJvblsnSE9NRSddLCAnLnB5cGlyYycpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyYyk6CisgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnVXNpbmcgUHlQSSBsb2dpbiBmcm9tICVzJyAlIHJjKQorICAgICAgICAgICAgICAgIGNvbmZpZyA9IENvbmZpZ1BhcnNlci5Db25maWdQYXJzZXIoeworICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJuYW1lJzonJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzd29yZCc6JycsCisgICAgICAgICAgICAgICAgICAgICAgICAncmVwb3NpdG9yeSc6Jyd9KQorICAgICAgICAgICAgICAgIGNvbmZpZy5yZWFkKHJjKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlcG9zaXRvcnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3NpdG9yeSA9IGNvbmZpZy5nZXQoJ3NlcnZlci1sb2dpbicsICdyZXBvc2l0b3J5JykKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi51c2VybmFtZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VybmFtZSA9IGNvbmZpZy5nZXQoJ3NlcnZlci1sb2dpbicsICd1c2VybmFtZScpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucGFzc3dvcmQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgPSBjb25maWcuZ2V0KCdzZXJ2ZXItbG9naW4nLCAncGFzc3dvcmQnKQorICAgICAgICBpZiBub3Qgc2VsZi5yZXBvc2l0b3J5OgorICAgICAgICAgICAgc2VsZi5yZXBvc2l0b3J5ID0gc2VsZi5ERUZBVUxUX1JFUE9TSVRPUlkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk5vIGRpc3QgZmlsZSBjcmVhdGVkIGluIGVhcmxpZXIgY29tbWFuZCIpCisgICAgICAgIGZvciBjb21tYW5kLCBweXZlcnNpb24sIGZpbGVuYW1lIGluIHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXM6CisgICAgICAgICAgICBzZWxmLnVwbG9hZF9maWxlKGNvbW1hbmQsIHB5dmVyc2lvbiwgZmlsZW5hbWUpCisKKyAgICBkZWYgdXBsb2FkX2ZpbGUoc2VsZiwgY29tbWFuZCwgcHl2ZXJzaW9uLCBmaWxlbmFtZSk6CisgICAgICAgICMgU2lnbiBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgc2VsZi5zaWduOgorICAgICAgICAgICAgZ3BnX2FyZ3MgPSBbImdwZyIsICItLWRldGFjaC1zaWduIiwgIi1hIiwgZmlsZW5hbWVdCisgICAgICAgICAgICBpZiBzZWxmLmlkZW50aXR5OgorICAgICAgICAgICAgICAgIGdwZ19hcmdzWzI6Ml0gPSBbIi0tbG9jYWwtdXNlciIsIHNlbGYuaWRlbnRpdHldCisgICAgICAgICAgICBzcGF3bihncGdfYXJncywKKyAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgICAgICMgRmlsbCBpbiB0aGUgZGF0YQorICAgICAgICBjb250ZW50ID0gb3BlbihmaWxlbmFtZSwncmInKS5yZWFkKCkKKyAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQorICAgICAgICBjb21tZW50ID0gJycKKyAgICAgICAgaWYgY29tbWFuZD09J2JkaXN0X2VnZycgYW5kIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgY29tbWVudCA9ICJidWlsdCBvbiAlcyIgJSBwbGF0Zm9ybS5wbGF0Zm9ybSh0ZXJzZT0xKQorICAgICAgICBkYXRhID0geworICAgICAgICAgICAgJzphY3Rpb24nOidmaWxlX3VwbG9hZCcsCisgICAgICAgICAgICAncHJvdGNvbF92ZXJzaW9uJzonMScsCisgICAgICAgICAgICAnbmFtZSc6c2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzpzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpLAorICAgICAgICAgICAgJ2NvbnRlbnQnOihiYXNlbmFtZSxjb250ZW50KSwKKyAgICAgICAgICAgICdmaWxldHlwZSc6Y29tbWFuZCwKKyAgICAgICAgICAgICdweXZlcnNpb24nOnB5dmVyc2lvbiwKKyAgICAgICAgICAgICdtZDVfZGlnZXN0JzptZDUoY29udGVudCkuaGV4ZGlnZXN0KCksCisgICAgICAgICAgICB9CisgICAgICAgIGlmIGNvbW1hbmQgPT0gJ2JkaXN0X3JwbSc6CisgICAgICAgICAgICBkaXN0LCB2ZXJzaW9uLCBpZCA9IHBsYXRmb3JtLmRpc3QoKQorICAgICAgICAgICAgaWYgZGlzdDoKKyAgICAgICAgICAgICAgICBjb21tZW50ID0gJ2J1aWx0IGZvciAlcyAlcycgJSAoZGlzdCwgdmVyc2lvbikKKyAgICAgICAgZWxpZiBjb21tYW5kID09ICdiZGlzdF9kdW1iJzoKKyAgICAgICAgICAgIGNvbW1lbnQgPSAnYnVpbHQgZm9yICVzJyAlIHBsYXRmb3JtLnBsYXRmb3JtKHRlcnNlPTEpCisgICAgICAgIGRhdGFbJ2NvbW1lbnQnXSA9IGNvbW1lbnQKKworICAgICAgICBpZiBzZWxmLnNpZ246CisgICAgICAgICAgICBkYXRhWydncGdfc2lnbmF0dXJlJ10gPSAob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkgKyAiLmFzYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbihmaWxlbmFtZSsiLmFzYyIpLnJlYWQoKSkKKworICAgICAgICAjIHNldCB1cCB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgICAgYXV0aCA9ICJCYXNpYyAiICsgYmFzZTY0LmVuY29kZXN0cmluZyhzZWxmLnVzZXJuYW1lICsgIjoiICsgc2VsZi5wYXNzd29yZCkuc3RyaXAoKQorCisgICAgICAgICMgQnVpbGQgdXAgdGhlIE1JTUUgcGF5bG9hZCBmb3IgdGhlIFBPU1QgZGF0YQorICAgICAgICBib3VuZGFyeSA9ICctLS0tLS0tLS0tLS0tLUdIU0tGSkRMR0RTNzU0M0ZKS0xGSFJFNzU2NDI3NTY3NDMyNTQnCisgICAgICAgIHNlcF9ib3VuZGFyeSA9ICdcbi0tJyArIGJvdW5kYXJ5CisgICAgICAgIGVuZF9ib3VuZGFyeSA9IHNlcF9ib3VuZGFyeSArICctLScKKyAgICAgICAgYm9keSA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgIyBoYW5kbGUgbXVsdGlwbGUgZW50cmllcyBmb3IgdGhlIHNhbWUgbmFtZQorICAgICAgICAgICAgaWYgdHlwZSh2YWx1ZSkgIT0gdHlwZShbXSk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWVdCisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgaWYgdHlwZSh2YWx1ZSkgaXMgdHVwbGU6CisgICAgICAgICAgICAgICAgICAgIGZuID0gJztmaWxlbmFtZT0iJXMiJyAlIHZhbHVlWzBdCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmbiA9ICIiCisgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHIodmFsdWUpCisgICAgICAgICAgICAgICAgYm9keS53cml0ZShzZXBfYm91bmRhcnkpCisgICAgICAgICAgICAgICAgYm9keS53cml0ZSgnXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIicla2V5KQorICAgICAgICAgICAgICAgIGJvZHkud3JpdGUoZm4pCisgICAgICAgICAgICAgICAgYm9keS53cml0ZSgiXG5cbiIpCisgICAgICAgICAgICAgICAgYm9keS53cml0ZSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSBhbmQgdmFsdWVbLTFdID09ICdccic6CisgICAgICAgICAgICAgICAgICAgIGJvZHkud3JpdGUoJ1xuJykgICMgd3JpdGUgYW4gZXh0cmEgbmV3bGluZSAobHVydmUgTWFjcykKKyAgICAgICAgYm9keS53cml0ZShlbmRfYm91bmRhcnkpCisgICAgICAgIGJvZHkud3JpdGUoIlxuIikKKyAgICAgICAgYm9keSA9IGJvZHkuZ2V0dmFsdWUoKQorCisgICAgICAgIHNlbGYuYW5ub3VuY2UoIlN1Ym1pdHRpbmcgJXMgdG8gJXMiICUgKGZpbGVuYW1lLCBzZWxmLnJlcG9zaXRvcnkpLCBsb2cuSU5GTykKKworICAgICAgICAjIGJ1aWxkIHRoZSBSZXF1ZXN0CisgICAgICAgICMgV2UgY2FuJ3QgdXNlIHVybGxpYjIgc2luY2Ugd2UgbmVlZCB0byBzZW5kIHRoZSBCYXNpYworICAgICAgICAjIGF1dGggcmlnaHQgd2l0aCB0aGUgZmlyc3QgcmVxdWVzdAorICAgICAgICBzY2hlbWEsIG5ldGxvYywgdXJsLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudHMgPSBcCisgICAgICAgICAgICB1cmxwYXJzZS51cmxwYXJzZShzZWxmLnJlcG9zaXRvcnkpCisgICAgICAgIGFzc2VydCBub3QgcGFyYW1zIGFuZCBub3QgcXVlcnkgYW5kIG5vdCBmcmFnbWVudHMKKyAgICAgICAgaWYgc2NoZW1hID09ICdodHRwJzoKKyAgICAgICAgICAgIGh0dHAgPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKG5ldGxvYykKKyAgICAgICAgZWxpZiBzY2hlbWEgPT0gJ2h0dHBzJzoKKyAgICAgICAgICAgIGh0dHAgPSBodHRwbGliLkhUVFBTQ29ubmVjdGlvbihuZXRsb2MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgInVuc3VwcG9ydGVkIHNjaGVtYSAiK3NjaGVtYQorCisgICAgICAgIGRhdGEgPSAnJworICAgICAgICBsb2dsZXZlbCA9IGxvZy5JTkZPCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGh0dHAuY29ubmVjdCgpCisgICAgICAgICAgICBodHRwLnB1dHJlcXVlc3QoIlBPU1QiLCB1cmwpCisgICAgICAgICAgICBodHRwLnB1dGhlYWRlcignQ29udGVudC10eXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0lcyclYm91bmRhcnkpCisgICAgICAgICAgICBodHRwLnB1dGhlYWRlcignQ29udGVudC1sZW5ndGgnLCBzdHIobGVuKGJvZHkpKSkKKyAgICAgICAgICAgIGh0dHAucHV0aGVhZGVyKCdBdXRob3JpemF0aW9uJywgYXV0aCkKKyAgICAgICAgICAgIGh0dHAuZW5kaGVhZGVycygpCisgICAgICAgICAgICBodHRwLnNlbmQoYm9keSkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoZS5tc2csIGxvZy5FUlJPUikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHIgPSBodHRwLmdldHJlc3BvbnNlKCkKKyAgICAgICAgaWYgci5zdGF0dXMgPT0gMjAwOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChyLnN0YXR1cywgci5yZWFzb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuSU5GTykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ1VwbG9hZCBmYWlsZWQgKCVzKTogJXMnICUgKHIuc3RhdHVzLCByLnJlYXNvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5FUlJPUikKKyAgICAgICAgaWYgc2VsZi5zaG93X3Jlc3BvbnNlOgorICAgICAgICAgICAgcHJpbnQgJy0nKjc1LCByLnJlYWQoKSwgJy0nKjc1CmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9kZXBlbmRzLnB5IGIvTGliL3NldHVwdG9vbHMvZGVwZW5kcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ4MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvZGVwZW5kcy5weQpAQCAtMCwwICsxLDIzOSBAQAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzCitpbXBvcnQgc3lzLCBpbXAsIG1hcnNoYWwKK2Zyb20gaW1wIGltcG9ydCBQS0dfRElSRUNUT1JZLCBQWV9DT01QSUxFRCwgUFlfU09VUkNFLCBQWV9GUk9aRU4KK2Zyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24sIExvb3NlVmVyc2lvbgorCitfX2FsbF9fID0gWworICAgICdSZXF1aXJlJywgJ2ZpbmRfbW9kdWxlJywgJ2dldF9tb2R1bGVfY29uc3RhbnQnLCAnZXh0cmFjdF9jb25zdGFudCcKK10KKworY2xhc3MgUmVxdWlyZToKKyAgICAiIiJBIHByZXJlcXVpc2l0ZSB0byBidWlsZGluZyBvciBpbnN0YWxsaW5nIGEgZGlzdHJpYnV0aW9uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZixuYW1lLHJlcXVlc3RlZF92ZXJzaW9uLG1vZHVsZSxob21lcGFnZT0nJywKKyAgICAgICAgYXR0cmlidXRlPU5vbmUsZm9ybWF0PU5vbmUKKyAgICApOgorCisgICAgICAgIGlmIGZvcm1hdCBpcyBOb25lIGFuZCByZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvcm1hdCA9IFN0cmljdFZlcnNpb24KKworICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXF1ZXN0ZWRfdmVyc2lvbiA9IGZvcm1hdChyZXF1ZXN0ZWRfdmVyc2lvbikKKyAgICAgICAgICAgIGlmIGF0dHJpYnV0ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICdfX3ZlcnNpb25fXycKKworICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShsb2NhbHMoKSkKKyAgICAgICAgZGVsIHNlbGYuc2VsZgorCisKKyAgICBkZWYgZnVsbF9uYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gZnVsbCBwYWNrYWdlL2Rpc3RyaWJ1dGlvbiBuYW1lLCB3L3ZlcnNpb24iIiIKKyAgICAgICAgaWYgc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnJXMtJXMnICUgKHNlbGYubmFtZSxzZWxmLnJlcXVlc3RlZF92ZXJzaW9uKQorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisKKworICAgIGRlZiB2ZXJzaW9uX29rKHNlbGYsdmVyc2lvbik6CisgICAgICAgICIiIklzICd2ZXJzaW9uJyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZT8iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYXR0cmlidXRlIGlzIE5vbmUgb3Igc2VsZi5mb3JtYXQgaXMgTm9uZSBvciBcCisgICAgICAgICAgICBzdHIodmVyc2lvbik8PiJ1bmtub3duIiBhbmQgdmVyc2lvbiA+PSBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uCisKKworICAgIGRlZiBnZXRfdmVyc2lvbihzZWxmLCBwYXRocz1Ob25lLCBkZWZhdWx0PSJ1bmtub3duIik6CisKKyAgICAgICAgIiIiR2V0IHZlcnNpb24gbnVtYmVyIG9mIGluc3RhbGxlZCBtb2R1bGUsICdOb25lJywgb3IgJ2RlZmF1bHQnCisKKyAgICAgICAgU2VhcmNoICdwYXRocycgZm9yIG1vZHVsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJuICdOb25lJy4gIElmIGZvdW5kLAorICAgICAgICByZXR1cm4gdGhlIGV4dHJhY3RlZCB2ZXJzaW9uIGF0dHJpYnV0ZSwgb3IgJ2RlZmF1bHQnIGlmIG5vIHZlcnNpb24KKyAgICAgICAgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aXRob3V0CisgICAgICAgIGltcG9ydGluZyB0aGUgbW9kdWxlLiAgVGhlIHZlcnNpb24gaXMgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAgcmVxdWlyZW1lbnQncyB2ZXJzaW9uIGZvcm1hdCAoaWYgYW55KSwgdW5sZXNzIGl0IGlzICdOb25lJyBvciB0aGUKKyAgICAgICAgc3VwcGxpZWQgJ2RlZmF1bHQnLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBzZWxmLmF0dHJpYnV0ZSBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYscCxpID0gZmluZF9tb2R1bGUoc2VsZi5tb2R1bGUscGF0aHMpCisgICAgICAgICAgICAgICAgaWYgZjogZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHYgPSBnZXRfbW9kdWxlX2NvbnN0YW50KHNlbGYubW9kdWxlLHNlbGYuYXR0cmlidXRlLGRlZmF1bHQscGF0aHMpCisKKyAgICAgICAgaWYgdiBpcyBub3QgTm9uZSBhbmQgdiBpcyBub3QgZGVmYXVsdCBhbmQgc2VsZi5mb3JtYXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQodikKKworICAgICAgICByZXR1cm4gdgorCisKKyAgICBkZWYgaXNfcHJlc2VudChzZWxmLHBhdGhzPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkZXBlbmRlbmN5IGlzIHByZXNlbnQgb24gJ3BhdGhzJyIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXRfdmVyc2lvbihwYXRocykgaXMgbm90IE5vbmUKKworCisgICAgZGVmIGlzX2N1cnJlbnQoc2VsZixwYXRocz1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgZGVwZW5kZW5jeSBpcyBwcmVzZW50IGFuZCB1cC10by1kYXRlIG9uICdwYXRocyciIiIKKyAgICAgICAgdmVyc2lvbiA9IHNlbGYuZ2V0X3ZlcnNpb24ocGF0aHMpCisgICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX29rKHZlcnNpb24pCisKKworZGVmIF9pdGVyX2NvZGUoY29kZSk6CisKKyAgICAiIiJZaWVsZCAnKG9wLGFyZyknIHBhaXIgZm9yIGVhY2ggb3BlcmF0aW9uIGluIGNvZGUgb2JqZWN0ICdjb2RlJyIiIgorCisgICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKKyAgICBmcm9tIGRpcyBpbXBvcnQgSEFWRV9BUkdVTUVOVCwgRVhURU5ERURfQVJHCisKKyAgICBieXRlcyA9IGFycmF5KCdiJyxjb2RlLmNvX2NvZGUpCisgICAgZW9mID0gbGVuKGNvZGUuY29fY29kZSkKKworICAgIHB0ciA9IDAKKyAgICBleHRlbmRlZF9hcmcgPSAwCisKKyAgICB3aGlsZSBwdHI8ZW9mOgorCisgICAgICAgIG9wID0gYnl0ZXNbcHRyXQorCisgICAgICAgIGlmIG9wPj1IQVZFX0FSR1VNRU5UOgorCisgICAgICAgICAgICBhcmcgPSBieXRlc1twdHIrMV0gKyBieXRlc1twdHIrMl0qMjU2ICsgZXh0ZW5kZWRfYXJnCisgICAgICAgICAgICBwdHIgKz0gMworCisgICAgICAgICAgICBpZiBvcD09RVhURU5ERURfQVJHOgorICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IGFyZyAqIDY1NTM2TAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZyA9IE5vbmUKKyAgICAgICAgICAgIHB0ciArPSAxCisKKyAgICAgICAgeWllbGQgb3AsYXJnCisKKworCisKKworCisKKworCisKK2RlZiBmaW5kX21vZHVsZShtb2R1bGUsIHBhdGhzPU5vbmUpOgorICAgICIiIkp1c3QgbGlrZSAnaW1wLmZpbmRfbW9kdWxlKCknLCBidXQgd2l0aCBwYWNrYWdlIHN1cHBvcnQiIiIKKworICAgIHBhcnRzID0gbW9kdWxlLnNwbGl0KCcuJykKKworICAgIHdoaWxlIHBhcnRzOgorICAgICAgICBwYXJ0ID0gcGFydHMucG9wKDApCisgICAgICAgIGYsIHBhdGgsIChzdWZmaXgsbW9kZSxraW5kKSA9IGluZm8gPSBpbXAuZmluZF9tb2R1bGUocGFydCwgcGF0aHMpCisKKyAgICAgICAgaWYga2luZD09UEtHX0RJUkVDVE9SWToKKyAgICAgICAgICAgIHBhcnRzID0gcGFydHMgb3IgWydfX2luaXRfXyddCisgICAgICAgICAgICBwYXRocyA9IFtwYXRoXQorCisgICAgICAgIGVsaWYgcGFydHM6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ2FuJ3QgZmluZCAlciBpbiAlcyIgJSAocGFydHMsbW9kdWxlKSkKKworICAgIHJldHVybiBpbmZvCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitkZWYgZ2V0X21vZHVsZV9jb25zdGFudChtb2R1bGUsIHN5bWJvbCwgZGVmYXVsdD0tMSwgcGF0aHM9Tm9uZSk6CisKKyAgICAiIiJGaW5kICdtb2R1bGUnIGJ5IHNlYXJjaGluZyAncGF0aHMnLCBhbmQgZXh0cmFjdCAnc3ltYm9sJworCisgICAgUmV0dXJuICdOb25lJyBpZiAnbW9kdWxlJyBkb2VzIG5vdCBleGlzdCBvbiAncGF0aHMnLCBvciBpdCBkb2VzIG5vdCBkZWZpbmUKKyAgICAnc3ltYm9sJy4gIElmIHRoZSBtb2R1bGUgZGVmaW5lcyAnc3ltYm9sJyBhcyBhIGNvbnN0YW50LCByZXR1cm4gdGhlCisgICAgY29uc3RhbnQuICBPdGhlcndpc2UsIHJldHVybiAnZGVmYXVsdCcuIiIiCisKKyAgICB0cnk6CisgICAgICAgIGYsIHBhdGgsIChzdWZmaXgsbW9kZSxraW5kKSA9IGZpbmRfbW9kdWxlKG1vZHVsZSxwYXRocykKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICMgTW9kdWxlIGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHRyeToKKyAgICAgICAgaWYga2luZD09UFlfQ09NUElMRUQ6CisgICAgICAgICAgICBmLnJlYWQoOCkgICAjIHNraXAgbWFnaWMgJiBkYXRlCisgICAgICAgICAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGYpCisgICAgICAgIGVsaWYga2luZD09UFlfRlJPWkVOOgorICAgICAgICAgICAgY29kZSA9IGltcC5nZXRfZnJvemVuX29iamVjdChtb2R1bGUpCisgICAgICAgIGVsaWYga2luZD09UFlfU09VUkNFOgorICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgTm90IHNvbWV0aGluZyB3ZSBjYW4gcGFyc2U7IHdlJ2xsIGhhdmUgdG8gaW1wb3J0IGl0LiAgOigKKyAgICAgICAgICAgIGlmIG1vZHVsZSBub3QgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAgICAgaW1wLmxvYWRfbW9kdWxlKG1vZHVsZSxmLHBhdGgsKHN1ZmZpeCxtb2RlLGtpbmQpKQorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc3lzLm1vZHVsZXNbbW9kdWxlXSxzeW1ib2wsTm9uZSkKKworICAgIGZpbmFsbHk6CisgICAgICAgIGlmIGY6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIHJldHVybiBleHRyYWN0X2NvbnN0YW50KGNvZGUsc3ltYm9sLGRlZmF1bHQpCisKKworCisKKworCisKKworZGVmIGV4dHJhY3RfY29uc3RhbnQoY29kZSxzeW1ib2wsZGVmYXVsdD0tMSk6CisKKyAgICAiIiJFeHRyYWN0IHRoZSBjb25zdGFudCB2YWx1ZSBvZiAnc3ltYm9sJyBmcm9tICdjb2RlJworCisgICAgSWYgdGhlIG5hbWUgJ3N5bWJvbCcgaXMgYm91bmQgdG8gYSBjb25zdGFudCB2YWx1ZSBieSB0aGUgUHl0aG9uIGNvZGUKKyAgICBvYmplY3QgJ2NvZGUnLCByZXR1cm4gdGhhdCB2YWx1ZS4gIElmICdzeW1ib2wnIGlzIGJvdW5kIHRvIGFuIGV4cHJlc3Npb24sCisgICAgcmV0dXJuICdkZWZhdWx0Jy4gIE90aGVyd2lzZSwgcmV0dXJuICdOb25lJy4KKworICAgIFJldHVybiB2YWx1ZSBpcyBiYXNlZCBvbiB0aGUgZmlyc3QgYXNzaWdubWVudCB0byAnc3ltYm9sJy4gICdzeW1ib2wnIG11c3QKKyAgICBiZSBhIGdsb2JhbCwgb3IgYXQgbGVhc3QgYSBub24tImZhc3QiIGxvY2FsIGluIHRoZSBjb2RlIGJsb2NrLiAgVGhhdCBpcywKKyAgICBvbmx5ICdTVE9SRV9OQU1FJyBhbmQgJ1NUT1JFX0dMT0JBTCcgb3Bjb2RlcyBhcmUgY2hlY2tlZCwgYW5kICdzeW1ib2wnCisgICAgbXVzdCBiZSBwcmVzZW50IGluICdjb2RlLmNvX25hbWVzJy4KKyAgICAiIiIKKworICAgIGlmIHN5bWJvbCBub3QgaW4gY29kZS5jb19uYW1lczoKKyAgICAgICAgIyBuYW1lJ3Mgbm90IHRoZXJlLCBjYW4ndCBwb3NzaWJseSBiZSBhbiBhc3NpZ21lbnQKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIG5hbWVfaWR4ID0gbGlzdChjb2RlLmNvX25hbWVzKS5pbmRleChzeW1ib2wpCisKKyAgICBTVE9SRV9OQU1FID0gOTAKKyAgICBTVE9SRV9HTE9CQUwgPSA5NworICAgIExPQURfQ09OU1QgPSAxMDAKKworICAgIGNvbnN0ID0gZGVmYXVsdAorCisgICAgZm9yIG9wLCBhcmcgaW4gX2l0ZXJfY29kZShjb2RlKToKKworICAgICAgICBpZiBvcD09TE9BRF9DT05TVDoKKyAgICAgICAgICAgIGNvbnN0ID0gY29kZS5jb19jb25zdHNbYXJnXQorICAgICAgICBlbGlmIGFyZz09bmFtZV9pZHggYW5kIChvcD09U1RPUkVfTkFNRSBvciBvcD09U1RPUkVfR0xPQkFMKToKKyAgICAgICAgICAgIHJldHVybiBjb25zdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29uc3QgPSBkZWZhdWx0CmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9kaXN0LnB5IGIvTGliL3NldHVwdG9vbHMvZGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQxN2MxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvZGlzdC5weQpAQCAtMCwwICsxLDc5OCBAQAorX19hbGxfXyA9IFsnRGlzdHJpYnV0aW9uJ10KKworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uIGFzIF9EaXN0cmlidXRpb24KK2Zyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBSZXF1aXJlCitmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBpbnN0YWxsCitmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdCBpbXBvcnQgc2Rpc3QKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfbGliIGltcG9ydCBpbnN0YWxsX2xpYgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCitpbXBvcnQgc2V0dXB0b29scywgcGtnX3Jlc291cmNlcywgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5kaXN0LCBkaXN0dXRpbHMuY21kCitpbXBvcnQgb3MKKworZGVmIF9nZXRfdW5wYXRjaGVkKGNscyk6CisgICAgIiIiUHJvdGVjdCBhZ2FpbnN0IHJlLXBhdGNoaW5nIHRoZSBkaXN0dXRpbHMgaWYgcmVsb2FkZWQKKworICAgIEFsc28gZW5zdXJlcyB0aGF0IG5vIG90aGVyIGRpc3R1dGlscyBleHRlbnNpb24gbW9ua2V5cGF0Y2hlZCB0aGUgZGlzdHV0aWxzCisgICAgZmlyc3QuCisgICAgIiIiCisgICAgd2hpbGUgY2xzLl9fbW9kdWxlX18uc3RhcnRzd2l0aCgnc2V0dXB0b29scycpOgorICAgICAgICBjbHMsID0gY2xzLl9fYmFzZXNfXworICAgIGlmIG5vdCBjbHMuX19tb2R1bGVfXy5zdGFydHN3aXRoKCdkaXN0dXRpbHMnKToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAiZGlzdHV0aWxzIGhhcyBhbHJlYWR5IGJlZW4gcGF0Y2hlZCBieSAlciIgJSBjbHMKKyAgICAgICAgKQorICAgIHJldHVybiBjbHMKKworX0Rpc3RyaWJ1dGlvbiA9IF9nZXRfdW5wYXRjaGVkKF9EaXN0cmlidXRpb24pCisKK3NlcXVlbmNlID0gdHVwbGUsIGxpc3QKKworZGVmIGNoZWNrX2ltcG9ydGFibGUoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgIHRyeToKKyAgICAgICAgZXAgPSBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2UoJ3g9Jyt2YWx1ZSkKKyAgICAgICAgYXNzZXJ0IG5vdCBlcC5leHRyYXMKKyAgICBleGNlcHQgKFR5cGVFcnJvcixWYWx1ZUVycm9yLEF0dHJpYnV0ZUVycm9yLEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICIlciBtdXN0IGJlIGltcG9ydGFibGUgJ21vZHVsZTphdHRycycgc3RyaW5nIChnb3QgJXIpIgorICAgICAgICAgICAgJSAoYXR0cix2YWx1ZSkKKyAgICAgICAgKQorCisKK2RlZiBhc3NlcnRfc3RyaW5nX2xpc3QoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgc3RyaW5nIGxpc3Qgb3IgTm9uZSIiIgorICAgIHRyeToKKyAgICAgICAgYXNzZXJ0ICcnLmpvaW4odmFsdWUpIT12YWx1ZQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLFZhbHVlRXJyb3IsQXR0cmlidXRlRXJyb3IsQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgIiVyIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MgKGdvdCAlcikiICUgKGF0dHIsdmFsdWUpCisgICAgICAgICkKKworZGVmIGNoZWNrX25zcChkaXN0LCBhdHRyLCB2YWx1ZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgbmFtZXNwYWNlIHBhY2thZ2VzIGFyZSB2YWxpZCIiIgorICAgIGFzc2VydF9zdHJpbmdfbGlzdChkaXN0LGF0dHIsdmFsdWUpCisKKyAgICBmb3IgbnNwIGluIHZhbHVlOgorICAgICAgICBpZiBub3QgZGlzdC5oYXNfY29udGVudHNfZm9yKG5zcCk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgICAgICJEaXN0cmlidXRpb24gY29udGFpbnMgbm8gbW9kdWxlcyBvciBwYWNrYWdlcyBmb3IgIiArCisgICAgICAgICAgICAgICAgIm5hbWVzcGFjZSBwYWNrYWdlICVyIiAlIG5zcAorICAgICAgICAgICAgKQorCitkZWYgY2hlY2tfZXh0cmFzKGRpc3QsIGF0dHIsIHZhbHVlKToKKyAgICAiIiJWZXJpZnkgdGhhdCBleHRyYXNfcmVxdWlyZSBtYXBwaW5nIGlzIHZhbGlkIiIiCisgICAgdHJ5OgorICAgICAgICBmb3Igayx2IGluIHZhbHVlLml0ZW1zKCk6CisgICAgICAgICAgICBsaXN0KHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHYpKQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLFZhbHVlRXJyb3IsQXR0cmlidXRlRXJyb3IpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgIidleHRyYXNfcmVxdWlyZScgbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2hvc2UgdmFsdWVzIGFyZSAiCisgICAgICAgICAgICAic3RyaW5ncyBvciBsaXN0cyBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdmFsaWQgcHJvamVjdC92ZXJzaW9uICIKKyAgICAgICAgICAgICJyZXF1aXJlbWVudCBzcGVjaWZpZXJzLiIKKyAgICAgICAgKQorCitkZWYgYXNzZXJ0X2Jvb2woZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIFRydWUsIEZhbHNlLCAwLCBvciAxIiIiCisgICAgaWYgYm9vbCh2YWx1ZSkgIT0gdmFsdWU6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAiJXIgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUgKGdvdCAlcikiICUgKGF0dHIsdmFsdWUpCisgICAgICAgICkKKworCisKK2RlZiBjaGVja19yZXF1aXJlbWVudHMoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IGluc3RhbGxfcmVxdWlyZXMgaXMgYSB2YWxpZCByZXF1aXJlbWVudHMgbGlzdCIiIgorICAgIHRyeToKKyAgICAgICAgbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyh2YWx1ZSkpCisgICAgZXhjZXB0IChUeXBlRXJyb3IsVmFsdWVFcnJvcik6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAiJXIgbXVzdCBiZSBhIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgIgorICAgICAgICAgICAgImNvbnRhaW5pbmcgdmFsaWQgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllcnMiICUgKGF0dHIsKQorICAgICAgICApCisKK2RlZiBjaGVja19lbnRyeV9wb2ludHMoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IGVudHJ5X3BvaW50cyBtYXAgaXMgcGFyc2VhYmxlIiIiCisgICAgdHJ5OgorICAgICAgICBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2VfbWFwKHZhbHVlKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKGUpCisKKworZGVmIGNoZWNrX3Rlc3Rfc3VpdGUoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLGJhc2VzdHJpbmcpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKCJ0ZXN0X3N1aXRlIG11c3QgYmUgYSBzdHJpbmciKQorCisKK2RlZiBjaGVja19wYWNrYWdlX2RhdGEoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgZGljdGlvbmFyeSBvZiBwYWNrYWdlIG5hbWVzIHRvIGdsb2IgbGlzdHMiIiIKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLGRpY3QpOgorICAgICAgICBmb3Igayx2IGluIHZhbHVlLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrLHN0cik6IGJyZWFrCisgICAgICAgICAgICB0cnk6IGl0ZXIodikKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgIGF0dHIrIiBtdXN0IGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nIHBhY2thZ2UgbmFtZXMgdG8gbGlzdHMgb2YgIgorICAgICAgICAid2lsZGNhcmQgcGF0dGVybnMiCisgICAgKQorCisKKworCitjbGFzcyBEaXN0cmlidXRpb24oX0Rpc3RyaWJ1dGlvbik6CisgICAgIiIiRGlzdHJpYnV0aW9uIHdpdGggc3VwcG9ydCBmb3IgZmVhdHVyZXMsIHRlc3RzLCBhbmQgcGFja2FnZSBkYXRhCisKKyAgICBUaGlzIGlzIGFuIGVuaGFuY2VkIHZlcnNpb24gb2YgJ2Rpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbicgdGhhdAorICAgIGVmZmVjdGl2ZWx5IGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgb3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgdG8gJ3NldHVwKCknOgorCisgICAgICdpbnN0YWxsX3JlcXVpcmVzJyAtLSBhIHN0cmluZyBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzIHNwZWNpZnlpbmcgcHJvamVjdAorICAgICAgICB2ZXJzaW9ucyB0aGF0IHRoZSBkaXN0cmlidXRpb24gcmVxdWlyZXMgd2hlbiBpbnN0YWxsZWQsIGluIHRoZSBmb3JtYXQKKyAgICAgICAgdXNlZCBieSAncGtnX3Jlc291cmNlcy5yZXF1aXJlKCknLiAgVGhleSB3aWxsIGJlIGluc3RhbGxlZAorICAgICAgICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLiAgSWYgeW91IHdpc2ggdG8gdXNlCisgICAgICAgIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgaW4gUHlQSSwgb3Igd2FudCB0byBnaXZlIHlvdXIgdXNlcnMgYW4KKyAgICAgICAgYWx0ZXJuYXRlIGRvd25sb2FkIGxvY2F0aW9uLCB5b3UgY2FuIGFkZCBhICdmaW5kX2xpbmtzJyBvcHRpb24gdG8gdGhlCisgICAgICAgICdbZWFzeV9pbnN0YWxsXScgc2VjdGlvbiBvZiB5b3VyIHByb2plY3QncyAnc2V0dXAuY2ZnJyBmaWxlLCBhbmQgdGhlbgorICAgICAgICBzZXR1cHRvb2xzIHdpbGwgc2NhbiB0aGUgbGlzdGVkIHdlYiBwYWdlcyBmb3IgbGlua3MgdGhhdCBzYXRpc2Z5IHRoZQorICAgICAgICByZXF1aXJlbWVudHMuCisKKyAgICAgJ2V4dHJhc19yZXF1aXJlJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBvZiBvcHRpb25hbCAiZXh0cmFzIiB0byB0aGUKKyAgICAgICAgYWRkaXRpb25hbCByZXF1aXJlbWVudChzKSB0aGF0IHVzaW5nIHRob3NlIGV4dHJhcyBpbmN1cnMuIEZvciBleGFtcGxlLAorICAgICAgICB0aGlzOjoKKworICAgICAgICAgICAgZXh0cmFzX3JlcXVpcmUgPSBkaWN0KHJlU1QgPSBbImRvY3V0aWxzPj0wLjMiLCAicmVTVGVkaXQiXSkKKworICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYW4gZXh0cmEKKyAgICAgICAgY2FwYWJpbGl0eSBjYWxsZWQgInJlU1QiLCBidXQgaXQgY2FuIG9ubHkgYmUgdXNlZCBpZiBkb2N1dGlscyBhbmQKKyAgICAgICAgcmVTVGVkaXQgYXJlIGluc3RhbGxlZC4gIElmIHRoZSB1c2VyIGluc3RhbGxzIHlvdXIgcGFja2FnZSB1c2luZworICAgICAgICBFYXN5SW5zdGFsbCBhbmQgcmVxdWVzdHMgb25lIG9mIHlvdXIgZXh0cmFzLCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyB3aWxsIGJlIGluc3RhbGxlZCBpZiBuZWVkZWQuCisKKyAgICAgJ2ZlYXR1cmVzJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBvcHRpb24gbmFtZXMgdG8gJ3NldHVwdG9vbHMuRmVhdHVyZScKKyAgICAgICAgb2JqZWN0cy4gIEZlYXR1cmVzIGFyZSBhIHBvcnRpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBiZQorICAgICAgICBpbmNsdWRlZCBvciBleGNsdWRlZCBiYXNlZCBvbiB1c2VyIG9wdGlvbnMsIGludGVyLWZlYXR1cmUgZGVwZW5kZW5jaWVzLAorICAgICAgICBhbmQgYXZhaWxhYmlsaXR5IG9uIHRoZSBjdXJyZW50IHN5c3RlbS4gIEV4Y2x1ZGVkIGZlYXR1cmVzIGFyZSBvbWl0dGVkCisgICAgICAgIGZyb20gYWxsIHNldHVwIGNvbW1hbmRzLCBpbmNsdWRpbmcgc291cmNlIGFuZCBiaW5hcnkgZGlzdHJpYnV0aW9ucywgc28KKyAgICAgICAgeW91IGNhbiBjcmVhdGUgbXVsdGlwbGUgZGlzdHJpYnV0aW9ucyBmcm9tIHRoZSBzYW1lIHNvdXJjZSB0cmVlLgorICAgICAgICBGZWF0dXJlIG5hbWVzIHNob3VsZCBiZSB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMsIGV4Y2VwdCB0aGF0IHRoZXkgbWF5CisgICAgICAgIGNvbnRhaW4gdGhlICctJyAobWludXMpIHNpZ24uICBGZWF0dXJlcyBjYW4gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQKKyAgICAgICAgdmlhIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyAnLS13aXRoLVgnIGFuZCAnLS13aXRob3V0LVgnLCB3aGVyZSAnWCcgaXMKKyAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUuICBXaGV0aGVyIGEgZmVhdHVyZSBpcyBpbmNsdWRlZCBieSBkZWZhdWx0LCBhbmQKKyAgICAgICAgd2hldGhlciB5b3UgYXJlIGFsbG93ZWQgdG8gY29udHJvbCB0aGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaXMKKyAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgRmVhdHVyZSBvYmplY3QuICBTZWUgdGhlICdGZWF0dXJlJyBjbGFzcyBmb3IgbW9yZQorICAgICAgICBpbmZvcm1hdGlvbi4KKworICAgICAndGVzdF9zdWl0ZScgLS0gdGhlIG5hbWUgb2YgYSB0ZXN0IHN1aXRlIHRvIHJ1biBmb3IgdGhlICd0ZXN0JyBjb21tYW5kLgorICAgICAgICBJZiB0aGUgdXNlciBydW5zICdweXRob24gc2V0dXAucHkgdGVzdCcsIHRoZSBwYWNrYWdlIHdpbGwgYmUgaW5zdGFsbGVkLAorICAgICAgICBhbmQgdGhlIG5hbWVkIHRlc3Qgc3VpdGUgd2lsbCBiZSBydW4uICBUaGUgZm9ybWF0IGlzIHRoZSBzYW1lIGFzCisgICAgICAgIHdvdWxkIGJlIHVzZWQgb24gYSAndW5pdHRlc3QucHknIGNvbW1hbmQgbGluZS4gIFRoYXQgaXMsIGl0IGlzIHRoZQorICAgICAgICBkb3R0ZWQgbmFtZSBvZiBhbiBvYmplY3QgdG8gaW1wb3J0IGFuZCBjYWxsIHRvIGdlbmVyYXRlIGEgdGVzdCBzdWl0ZS4KKworICAgICAncGFja2FnZV9kYXRhJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIGxpc3RzIG9mIGZpbGVuYW1lcworICAgICAgICBvciBnbG9icyB0byB1c2UgdG8gZmluZCBkYXRhIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgbmFtZWQgcGFja2FnZXMuCisgICAgICAgIElmIHRoZSBkaWN0aW9uYXJ5IGhhcyBmaWxlbmFtZXMgb3IgZ2xvYnMgbGlzdGVkIHVuZGVyICciIicgKHRoZSBlbXB0eQorICAgICAgICBzdHJpbmcpLCB0aG9zZSBuYW1lcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBpbiBldmVyeSBwYWNrYWdlLCBpbiBhZGRpdGlvbgorICAgICAgICB0byBhbnkgbmFtZXMgZm9yIHRoZSBzcGVjaWZpYyBwYWNrYWdlLiAgRGF0YSBmaWxlcyBmb3VuZCB1c2luZyB0aGVzZQorICAgICAgICBuYW1lcy9nbG9icyB3aWxsIGJlIGluc3RhbGxlZCBhbG9uZyB3aXRoIHRoZSBwYWNrYWdlLCBpbiB0aGUgc2FtZQorICAgICAgICBsb2NhdGlvbiBhcyB0aGUgcGFja2FnZS4gIE5vdGUgdGhhdCBnbG9icyBhcmUgYWxsb3dlZCB0byByZWZlcmVuY2UKKyAgICAgICAgdGhlIGNvbnRlbnRzIG9mIG5vbi1wYWNrYWdlIHN1YmRpcmVjdG9yaWVzLCBhcyBsb25nIGFzIHlvdSB1c2UgJy8nIGFzCisgICAgICAgIGEgcGF0aCBzZXBhcmF0b3IuICAoR2xvYnMgYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvCisgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIHBhdGhzIGF0IHJ1bnRpbWUuKQorCisgICAgSW4gYWRkaXRpb24gdG8gdGhlc2UgbmV3IGtleXdvcmRzLCB0aGlzIGNsYXNzIGFsc28gaGFzIHNldmVyYWwgbmV3IG1ldGhvZHMKKyAgICBmb3IgbWFuaXB1bGF0aW5nIHRoZSBkaXN0cmlidXRpb24ncyBjb250ZW50cy4gIEZvciBleGFtcGxlLCB0aGUgJ2luY2x1ZGUoKScKKyAgICBhbmQgJ2V4Y2x1ZGUoKScgbWV0aG9kcyBjYW4gYmUgdGhvdWdodCBvZiBhcyBpbi1wbGFjZSBhZGQgYW5kIHN1YnRyYWN0CisgICAgY29tbWFuZHMgdGhhdCBhZGQgb3IgcmVtb3ZlIHBhY2thZ2VzLCBtb2R1bGVzLCBleHRlbnNpb25zLCBhbmQgc28gb24gZnJvbQorICAgIHRoZSBkaXN0cmlidXRpb24uICBUaGV5IGFyZSB1c2VkIGJ5IHRoZSBmZWF0dXJlIHN1YnN5c3RlbSB0byBjb25maWd1cmUgdGhlCisgICAgZGlzdHJpYnV0aW9uIGZvciB0aGUgaW5jbHVkZWQgYW5kIGV4Y2x1ZGVkIGZlYXR1cmVzLgorICAgICIiIgorCisgICAgX3BhdGNoZWRfZGlzdCA9IE5vbmUKKworICAgIGRlZiBwYXRjaF9taXNzaW5nX3BrZ19pbmZvKHNlbGYsIGF0dHJzKToKKyAgICAgICAgIyBGYWtlIHVwIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBkYXRhIHRoYXQgd291bGQgbm9ybWFsbHkgY29tZSBmcm9tCisgICAgICAgICMgUEtHLUlORk8sIGJ1dCB3aGljaCBtaWdodCBub3QgeWV0IGJlIGJ1aWx0IGlmIHRoaXMgaXMgYSBmcmVzaAorICAgICAgICAjIGNoZWNrb3V0LgorICAgICAgICAjCisgICAgICAgIGlmIG5vdCBhdHRycyBvciAnbmFtZScgbm90IGluIGF0dHJzIG9yICd2ZXJzaW9uJyBub3QgaW4gYXR0cnM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAga2V5ID0gcGtnX3Jlc291cmNlcy5zYWZlX25hbWUoc3RyKGF0dHJzWyduYW1lJ10pKS5sb3dlcigpCisgICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LmJ5X2tleS5nZXQoa2V5KQorICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lIGFuZCBub3QgZGlzdC5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CisgICAgICAgICAgICBkaXN0Ll92ZXJzaW9uID0gcGtnX3Jlc291cmNlcy5zYWZlX3ZlcnNpb24oc3RyKGF0dHJzWyd2ZXJzaW9uJ10pKQorICAgICAgICAgICAgc2VsZi5fcGF0Y2hlZF9kaXN0ID0gZGlzdAorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBhdHRycz1Ob25lKToKKyAgICAgICAgaGF2ZV9wYWNrYWdlX2RhdGEgPSBoYXNhdHRyKHNlbGYsICJwYWNrYWdlX2RhdGEiKQorICAgICAgICBpZiBub3QgaGF2ZV9wYWNrYWdlX2RhdGE6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSA9IHt9CisgICAgICAgIHNlbGYucmVxdWlyZV9mZWF0dXJlcyA9IFtdCisgICAgICAgIHNlbGYuZmVhdHVyZXMgPSB7fQorICAgICAgICBzZWxmLmRpc3RfZmlsZXMgPSBbXQorICAgICAgICBzZWxmLnBhdGNoX21pc3NpbmdfcGtnX2luZm8oYXR0cnMpCisgICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW55IGVnZ3MgbmVlZGVkIHRvIGludGVycHJldCAnYXR0cnMnCisgICAgICAgIGlmIGF0dHJzIGFuZCAnZGVwZW5kZW5jeV9saW5rcycgaW4gYXR0cnM6CisgICAgICAgICAgICBzZWxmLmRlcGVuZGVuY3lfbGlua3MgPSBhdHRycy5wb3AoJ2RlcGVuZGVuY3lfbGlua3MnKQorICAgICAgICAgICAgYXNzZXJ0X3N0cmluZ19saXN0KHNlbGYsJ2RlcGVuZGVuY3lfbGlua3MnLHNlbGYuZGVwZW5kZW5jeV9saW5rcykKKyAgICAgICAgaWYgYXR0cnMgYW5kICdzZXR1cF9yZXF1aXJlcycgaW4gYXR0cnM6CisgICAgICAgICAgICBzZWxmLmZldGNoX2J1aWxkX2VnZ3MoYXR0cnMucG9wKCdzZXR1cF9yZXF1aXJlcycpKQorICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzJyk6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLGVwLm5hbWUpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZixlcC5uYW1lLE5vbmUpCisgICAgICAgIF9EaXN0cmlidXRpb24uX19pbml0X18oc2VsZixhdHRycykKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1ldGFkYXRhLnZlcnNpb24sIChpbnQsbG9uZyxmbG9hdCkpOgorICAgICAgICAgICAgIyBTb21lIHBlb3BsZSBhcHBhcmVudGx5IHRha2UgInZlcnNpb24gbnVtYmVyIiB0b28gbGl0ZXJhbGx5IDopCisgICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnZlcnNpb24gPSBzdHIoc2VsZi5tZXRhZGF0YS52ZXJzaW9uKQorCisgICAgZGVmIHBhcnNlX2NvbW1hbmRfbGluZShzZWxmKToKKyAgICAgICAgIiIiUHJvY2VzcyBmZWF0dXJlcyBhZnRlciBwYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIiIiCisgICAgICAgIHJlc3VsdCA9IF9EaXN0cmlidXRpb24ucGFyc2VfY29tbWFuZF9saW5lKHNlbGYpCisgICAgICAgIGlmIHNlbGYuZmVhdHVyZXM6CisgICAgICAgICAgICBzZWxmLl9maW5hbGl6ZV9mZWF0dXJlcygpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfZmVhdHVyZV9hdHRybmFtZShzZWxmLG5hbWUpOgorICAgICAgICAiIiJDb252ZXJ0IGZlYXR1cmUgbmFtZSB0byBjb3JyZXNwb25kaW5nIG9wdGlvbiBhdHRyaWJ1dGUgbmFtZSIiIgorICAgICAgICByZXR1cm4gJ3dpdGhfJytuYW1lLnJlcGxhY2UoJy0nLCdfJykKKworICAgIGRlZiBmZXRjaF9idWlsZF9lZ2dzKHNlbGYsIHJlcXVpcmVzKToKKyAgICAgICAgIiIiUmVzb2x2ZSBwcmUtc2V0dXAgcmVxdWlyZW1lbnRzIiIiCisgICAgICAgIGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgd29ya2luZ19zZXQsIHBhcnNlX3JlcXVpcmVtZW50cworICAgICAgICBmb3IgZGlzdCBpbiB3b3JraW5nX3NldC5yZXNvbHZlKAorICAgICAgICAgICAgcGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVzKSwgaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnCisgICAgICAgICk6CisgICAgICAgICAgICB3b3JraW5nX3NldC5hZGQoZGlzdCkKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfRGlzdHJpYnV0aW9uLmZpbmFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgaWYgc2VsZi5mZWF0dXJlczoKKyAgICAgICAgICAgIHNlbGYuX3NldF9nbG9iYWxfb3B0c19mcm9tX2ZlYXR1cmVzKCkKKworICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzJyk6CisgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZixlcC5uYW1lLE5vbmUpCisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZykKKyAgICAgICAgICAgICAgICBlcC5sb2FkKCkoc2VsZiwgZXAubmFtZSwgdmFsdWUpCisKKyAgICBkZWYgZmV0Y2hfYnVpbGRfZWdnKHNlbGYsIHJlcSk6CisgICAgICAgICIiIkZldGNoIGFuIGVnZyBuZWVkZWQgZm9yIGJ1aWxkaW5nIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZCA9IHNlbGYuX2VnZ19mZXRjaGVyCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgZWFzeV9pbnN0YWxsCisgICAgICAgICAgICBkaXN0ID0gc2VsZi5fX2NsYXNzX18oeydzY3JpcHRfYXJncyc6WydlYXN5X2luc3RhbGwnXX0pCisgICAgICAgICAgICBkaXN0LnBhcnNlX2NvbmZpZ19maWxlcygpCisgICAgICAgICAgICBvcHRzID0gZGlzdC5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpCisgICAgICAgICAgICBrZWVwID0gKAorICAgICAgICAgICAgICAgICdmaW5kX2xpbmtzJywgJ3NpdGVfZGlycycsICdpbmRleF91cmwnLCAnb3B0aW1pemUnLAorICAgICAgICAgICAgICAgICdzaXRlX2RpcnMnLCAnYWxsb3dfaG9zdHMnCisgICAgICAgICAgICApCisgICAgICAgICAgICBmb3Iga2V5IGluIG9wdHMua2V5cygpOgorICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4ga2VlcDoKKyAgICAgICAgICAgICAgICAgICAgZGVsIG9wdHNba2V5XSAgICMgZG9uJ3QgdXNlIGFueSBvdGhlciBzZXR0aW5ncworICAgICAgICAgICAgaWYgc2VsZi5kZXBlbmRlbmN5X2xpbmtzOgorICAgICAgICAgICAgICAgIGxpbmtzID0gc2VsZi5kZXBlbmRlbmN5X2xpbmtzWzpdCisgICAgICAgICAgICAgICAgaWYgJ2ZpbmRfbGlua3MnIGluIG9wdHM6CisgICAgICAgICAgICAgICAgICAgIGxpbmtzID0gb3B0c1snZmluZF9saW5rcyddWzFdLnNwbGl0KCkgKyBsaW5rcworICAgICAgICAgICAgICAgIG9wdHNbJ2ZpbmRfbGlua3MnXSA9ICgnc2V0dXAnLCBsaW5rcykKKyAgICAgICAgICAgIGNtZCA9IGVhc3lfaW5zdGFsbCgKKyAgICAgICAgICAgICAgICBkaXN0LCBhcmdzPVsieCJdLCBpbnN0YWxsX2Rpcj1vcy5jdXJkaXIsIGV4Y2x1ZGVfc2NyaXB0cz1UcnVlLAorICAgICAgICAgICAgICAgIGFsd2F5c19jb3B5PUZhbHNlLCBidWlsZF9kaXJlY3Rvcnk9Tm9uZSwgZWRpdGFibGU9RmFsc2UsCisgICAgICAgICAgICAgICAgdXBncmFkZT1GYWxzZSwgbXVsdGlfdmVyc2lvbj1UcnVlLCBub19yZXBvcnQgPSBUcnVlCisgICAgICAgICAgICApCisgICAgICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgICAgICBzZWxmLl9lZ2dfZmV0Y2hlciA9IGNtZAorICAgICAgICByZXR1cm4gY21kLmVhc3lfaW5zdGFsbChyZXEpCisKKyAgICBkZWYgX3NldF9nbG9iYWxfb3B0c19mcm9tX2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICAiIiJBZGQgLS13aXRoLVgvLS13aXRob3V0LVggb3B0aW9ucyBiYXNlZCBvbiBvcHRpb25hbCBmZWF0dXJlcyIiIgorCisgICAgICAgIGdvID0gW10KKyAgICAgICAgbm8gPSBzZWxmLm5lZ2F0aXZlX29wdC5jb3B5KCkKKworICAgICAgICBmb3IgbmFtZSxmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsTm9uZSkKKyAgICAgICAgICAgIGZlYXR1cmUudmFsaWRhdGUoc2VsZikKKworICAgICAgICAgICAgaWYgZmVhdHVyZS5vcHRpb25hbDoKKyAgICAgICAgICAgICAgICBkZXNjciA9IGZlYXR1cmUuZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICBpbmNkZWYgPSAnIChkZWZhdWx0KScKKyAgICAgICAgICAgICAgICBleGNkZWY9JycKKyAgICAgICAgICAgICAgICBpZiBub3QgZmVhdHVyZS5pbmNsdWRlX2J5X2RlZmF1bHQoKToKKyAgICAgICAgICAgICAgICAgICAgZXhjZGVmLCBpbmNkZWYgPSBpbmNkZWYsIGV4Y2RlZgorCisgICAgICAgICAgICAgICAgZ28uYXBwZW5kKCgnd2l0aC0nK25hbWUsIE5vbmUsICdpbmNsdWRlICcrZGVzY3IraW5jZGVmKSkKKyAgICAgICAgICAgICAgICBnby5hcHBlbmQoKCd3aXRob3V0LScrbmFtZSwgTm9uZSwgJ2V4Y2x1ZGUgJytkZXNjcitleGNkZWYpKQorICAgICAgICAgICAgICAgIG5vWyd3aXRob3V0LScrbmFtZV0gPSAnd2l0aC0nK25hbWUKKworICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25zID0gc2VsZi5mZWF0dXJlX29wdGlvbnMgPSBnbyArIHNlbGYuZ2xvYmFsX29wdGlvbnMKKyAgICAgICAgc2VsZi5uZWdhdGl2ZV9vcHQgPSBzZWxmLmZlYXR1cmVfbmVnb3B0ID0gbm8KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgX2ZpbmFsaXplX2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICAiIiJBZGQvcmVtb3ZlIGZlYXR1cmVzIGFuZCByZXNvbHZlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW0iIiIKKworICAgICAgICAjIEZpcnN0LCBmbGFnIGFsbCB0aGUgZW5hYmxlZCBpdGVtcyAoYW5kIHRodXMgdGhlaXIgZGVwZW5kZW5jaWVzKQorICAgICAgICBmb3IgbmFtZSxmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGVuYWJsZWQgPSBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSkKKyAgICAgICAgICAgIGlmIGVuYWJsZWQgb3IgKGVuYWJsZWQgaXMgTm9uZSBhbmQgZmVhdHVyZS5pbmNsdWRlX2J5X2RlZmF1bHQoKSk6CisgICAgICAgICAgICAgICAgZmVhdHVyZS5pbmNsdWRlX2luKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwxKQorCisgICAgICAgICMgVGhlbiBkaXNhYmxlIHRoZSByZXN0LCBzbyB0aGF0IG9mZi1ieS1kZWZhdWx0IGZlYXR1cmVzIGRvbid0CisgICAgICAgICMgZ2V0IGZsYWdnZWQgYXMgZXJyb3JzIHdoZW4gdGhleSdyZSByZXF1aXJlZCBieSBhbiBlbmFibGVkIGZlYXR1cmUKKyAgICAgICAgZm9yIG5hbWUsZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpOgorICAgICAgICAgICAgICAgIGZlYXR1cmUuZXhjbHVkZV9mcm9tKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwwKQorCisKKyAgICBkZWYgZ2V0X2NvbW1hbmRfY2xhc3Moc2VsZiwgY29tbWFuZCk6CisgICAgICAgICIiIlBsdWdnYWJsZSB2ZXJzaW9uIG9mIGdldF9jb21tYW5kX2NsYXNzKCkiIiIKKyAgICAgICAgaWYgY29tbWFuZCBpbiBzZWxmLmNtZGNsYXNzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY21kY2xhc3NbY29tbWFuZF0KKworICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJyxjb21tYW5kKToKKyAgICAgICAgICAgIGVwLnJlcXVpcmUoaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnKQorICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tjb21tYW5kXSA9IGNtZGNsYXNzID0gZXAubG9hZCgpCisgICAgICAgICAgICByZXR1cm4gY21kY2xhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX2NsYXNzKHNlbGYsIGNvbW1hbmQpCisKKyAgICBkZWYgcHJpbnRfY29tbWFuZHMoc2VsZik6CisgICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnKToKKyAgICAgICAgICAgIGlmIGVwLm5hbWUgbm90IGluIHNlbGYuY21kY2xhc3M6CisgICAgICAgICAgICAgICAgY21kY2xhc3MgPSBlcC5sb2FkKEZhbHNlKSAjIGRvbid0IHJlcXVpcmUgZXh0cmFzLCB3ZSdyZSBub3QgcnVubmluZworICAgICAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbZXAubmFtZV0gPSBjbWRjbGFzcworICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5wcmludF9jb21tYW5kcyhzZWxmKQorCisKKworCisKKyAgICBkZWYgX3NldF9mZWF0dXJlKHNlbGYsbmFtZSxzdGF0dXMpOgorICAgICAgICAiIiJTZXQgZmVhdHVyZSdzIGluY2x1c2lvbiBzdGF0dXMiIiIKKyAgICAgICAgc2V0YXR0cihzZWxmLHNlbGYuX2ZlYXR1cmVfYXR0cm5hbWUobmFtZSksc3RhdHVzKQorCisgICAgZGVmIGZlYXR1cmVfaXNfaW5jbHVkZWQoc2VsZixuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIDEgaWYgZmVhdHVyZSBpcyBpbmNsdWRlZCwgMCBpZiBleGNsdWRlZCwgJ05vbmUnIGlmIHVua25vd24iIiIKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZixzZWxmLl9mZWF0dXJlX2F0dHJuYW1lKG5hbWUpKQorCisgICAgZGVmIGluY2x1ZGVfZmVhdHVyZShzZWxmLG5hbWUpOgorICAgICAgICAiIiJSZXF1ZXN0IGluY2x1c2lvbiBvZiBmZWF0dXJlIG5hbWVkICduYW1lJyIiIgorCisgICAgICAgIGlmIHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKT09MDoKKyAgICAgICAgICAgIGRlc2NyID0gc2VsZi5mZWF0dXJlc1tuYW1lXS5kZXNjcmlwdGlvbgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICBkZXNjciArICIgaXMgcmVxdWlyZWQsIGJ1dCB3YXMgZXhjbHVkZWQgb3IgaXMgbm90IGF2YWlsYWJsZSIKKyAgICAgICAgICAgKQorICAgICAgICBzZWxmLmZlYXR1cmVzW25hbWVdLmluY2x1ZGVfaW4oc2VsZikKKyAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwxKQorCisgICAgZGVmIGluY2x1ZGUoc2VsZiwqKmF0dHJzKToKKyAgICAgICAgIiIiQWRkIGl0ZW1zIHRvIGRpc3RyaWJ1dGlvbiB0aGF0IGFyZSBuYW1lZCBpbiBrZXl3b3JkIGFyZ3VtZW50cworCisgICAgICAgIEZvciBleGFtcGxlLCAnZGlzdC5leGNsdWRlKHB5X21vZHVsZXM9WyJ4Il0pJyB3b3VsZCBhZGQgJ3gnIHRvCisgICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAncHlfbW9kdWxlcycgYXR0cmlidXRlLCBpZiBpdCB3YXMgbm90IGFscmVhZHkKKyAgICAgICAgdGhlcmUuCisKKyAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBvbmx5IHN1cHBvcnRzIGluY2x1c2lvbiBmb3IgYXR0cmlidXRlcyB0aGF0IGFyZQorICAgICAgICBsaXN0cyBvciB0dXBsZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgYWRkaW5nIHRvIG90aGVyCisgICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhpcyBvciBhIHN1YmNsYXNzLCB5b3UgY2FuIGFkZCBhbiAnX2luY2x1ZGVfWCcgbWV0aG9kLAorICAgICAgICB3aGVyZSAnWCcgaXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aAorICAgICAgICB0aGUgdmFsdWUgcGFzc2VkIHRvICdpbmNsdWRlKCknLiAgU28sICdkaXN0LmluY2x1ZGUoZm9vPXsiYmFyIjoiYmF6In0pJworICAgICAgICB3aWxsIHRyeSB0byBjYWxsICdkaXN0Ll9pbmNsdWRlX2Zvbyh7ImJhciI6ImJheiJ9KScsIHdoaWNoIGNhbiB0aGVuCisgICAgICAgIGhhbmRsZSB3aGF0ZXZlciBzcGVjaWFsIGluY2x1c2lvbiBsb2dpYyBpcyBuZWVkZWQuCisgICAgICAgICIiIgorICAgICAgICBmb3Igayx2IGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICBpbmNsdWRlID0gZ2V0YXR0cihzZWxmLCAnX2luY2x1ZGVfJytrLCBOb25lKQorICAgICAgICAgICAgaWYgaW5jbHVkZToKKyAgICAgICAgICAgICAgICBpbmNsdWRlKHYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2luY2x1ZGVfbWlzYyhrLHYpCisKKyAgICBkZWYgZXhjbHVkZV9wYWNrYWdlKHNlbGYscGFja2FnZSk6CisgICAgICAgICIiIlJlbW92ZSBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbnMgaW4gbmFtZWQgcGFja2FnZSIiIgorCisgICAgICAgIHBmeCA9IHBhY2thZ2UrJy4nCisgICAgICAgIGlmIHNlbGYucGFja2FnZXM6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VzID0gWworICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5wYWNrYWdlcworICAgICAgICAgICAgICAgICAgICBpZiBwPD5wYWNrYWdlIGFuZCBub3QgcC5zdGFydHN3aXRoKHBmeCkKKyAgICAgICAgICAgIF0KKworICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CisgICAgICAgICAgICBzZWxmLnB5X21vZHVsZXMgPSBbCisgICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLnB5X21vZHVsZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgcDw+cGFja2FnZSBhbmQgbm90IHAuc3RhcnRzd2l0aChwZngpCisgICAgICAgICAgICBdCisKKyAgICAgICAgaWYgc2VsZi5leHRfbW9kdWxlczoKKyAgICAgICAgICAgIHNlbGYuZXh0X21vZHVsZXMgPSBbCisgICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLmV4dF9tb2R1bGVzCisgICAgICAgICAgICAgICAgICAgIGlmIHAubmFtZTw+cGFja2FnZSBhbmQgbm90IHAubmFtZS5zdGFydHN3aXRoKHBmeCkKKyAgICAgICAgICAgIF0KKworCisgICAgZGVmIGhhc19jb250ZW50c19mb3Ioc2VsZixwYWNrYWdlKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgJ2V4Y2x1ZGVfcGFja2FnZShwYWNrYWdlKScgd291bGQgZG8gc29tZXRoaW5nIiIiCisKKyAgICAgICAgcGZ4ID0gcGFja2FnZSsnLicKKworICAgICAgICBmb3IgcCBpbiBzZWxmLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCk6CisgICAgICAgICAgICBpZiBwPT1wYWNrYWdlIG9yIHAuc3RhcnRzd2l0aChwZngpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKworCisKKworCisKKworCisKKyAgICBkZWYgX2V4Y2x1ZGVfbWlzYyhzZWxmLG5hbWUsdmFsdWUpOgorICAgICAgICAiIiJIYW5kbGUgJ2V4Y2x1ZGUoKScgZm9yIGxpc3QvdHVwbGUgYXR0cnMgd2l0aG91dCBhIHNwZWNpYWwgaGFuZGxlciIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSxzZXF1ZW5jZSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgICAgICIlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSAoJXIpIiAlIChuYW1lLCB2YWx1ZSkKKyAgICAgICAgICAgICkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2xkID0gZ2V0YXR0cihzZWxmLG5hbWUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgIiVzOiBObyBzdWNoIGRpc3RyaWJ1dGlvbiBzZXR0aW5nIiAlIG5hbWUKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgb2xkIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShvbGQsc2VxdWVuY2UpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICAgICBuYW1lKyI6IHRoaXMgc2V0dGluZyBjYW5ub3QgYmUgY2hhbmdlZCB2aWEgaW5jbHVkZS9leGNsdWRlIgorICAgICAgICAgICAgKQorICAgICAgICBlbGlmIG9sZDoKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZixuYW1lLFtpdGVtIGZvciBpdGVtIGluIG9sZCBpZiBpdGVtIG5vdCBpbiB2YWx1ZV0pCisKKyAgICBkZWYgX2luY2x1ZGVfbWlzYyhzZWxmLG5hbWUsdmFsdWUpOgorICAgICAgICAiIiJIYW5kbGUgJ2luY2x1ZGUoKScgZm9yIGxpc3QvdHVwbGUgYXR0cnMgd2l0aG91dCBhIHNwZWNpYWwgaGFuZGxlciIiIgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLHNlcXVlbmNlKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgIiVzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0ICglcikiICUgKG5hbWUsIHZhbHVlKQorICAgICAgICAgICAgKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvbGQgPSBnZXRhdHRyKHNlbGYsbmFtZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICAgICAiJXM6IE5vIHN1Y2ggZGlzdHJpYnV0aW9uIHNldHRpbmciICUgbmFtZQorICAgICAgICAgICAgKQorICAgICAgICBpZiBvbGQgaXMgTm9uZToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZixuYW1lLHZhbHVlKQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG9sZCxzZXF1ZW5jZSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgICAgIG5hbWUrIjogdGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBjaGFuZ2VkIHZpYSBpbmNsdWRlL2V4Y2x1ZGUiCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsbmFtZSxvbGQrW2l0ZW0gZm9yIGl0ZW0gaW4gdmFsdWUgaWYgaXRlbSBub3QgaW4gb2xkXSkKKworICAgIGRlZiBleGNsdWRlKHNlbGYsKiphdHRycyk6CisgICAgICAgICIiIlJlbW92ZSBpdGVtcyBmcm9tIGRpc3RyaWJ1dGlvbiB0aGF0IGFyZSBuYW1lZCBpbiBrZXl3b3JkIGFyZ3VtZW50cworCisgICAgICAgIEZvciBleGFtcGxlLCAnZGlzdC5leGNsdWRlKHB5X21vZHVsZXM9WyJ4Il0pJyB3b3VsZCByZW1vdmUgJ3gnIGZyb20KKyAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdweV9tb2R1bGVzJyBhdHRyaWJ1dGUuICBFeGNsdWRpbmcgcGFja2FnZXMgdXNlcworICAgICAgICB0aGUgJ2V4Y2x1ZGVfcGFja2FnZSgpJyBtZXRob2QsIHNvIGFsbCBvZiB0aGUgcGFja2FnZSdzIGNvbnRhaW5lZAorICAgICAgICBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbnMgYXJlIGFsc28gZXhjbHVkZWQuCisKKyAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBvbmx5IHN1cHBvcnRzIGV4Y2x1c2lvbiBmcm9tIGF0dHJpYnV0ZXMgdGhhdCBhcmUKKyAgICAgICAgbGlzdHMgb3IgdHVwbGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGV4Y2x1ZGluZyBmcm9tIG90aGVyCisgICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhpcyBvciBhIHN1YmNsYXNzLCB5b3UgY2FuIGFkZCBhbiAnX2V4Y2x1ZGVfWCcgbWV0aG9kLAorICAgICAgICB3aGVyZSAnWCcgaXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aAorICAgICAgICB0aGUgdmFsdWUgcGFzc2VkIHRvICdleGNsdWRlKCknLiAgU28sICdkaXN0LmV4Y2x1ZGUoZm9vPXsiYmFyIjoiYmF6In0pJworICAgICAgICB3aWxsIHRyeSB0byBjYWxsICdkaXN0Ll9leGNsdWRlX2Zvbyh7ImJhciI6ImJheiJ9KScsIHdoaWNoIGNhbiB0aGVuCisgICAgICAgIGhhbmRsZSB3aGF0ZXZlciBzcGVjaWFsIGV4Y2x1c2lvbiBsb2dpYyBpcyBuZWVkZWQuCisgICAgICAgICIiIgorICAgICAgICBmb3Igayx2IGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICBleGNsdWRlID0gZ2V0YXR0cihzZWxmLCAnX2V4Y2x1ZGVfJytrLCBOb25lKQorICAgICAgICAgICAgaWYgZXhjbHVkZToKKyAgICAgICAgICAgICAgICBleGNsdWRlKHYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2V4Y2x1ZGVfbWlzYyhrLHYpCisKKyAgICBkZWYgX2V4Y2x1ZGVfcGFja2FnZXMoc2VsZixwYWNrYWdlcyk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhY2thZ2VzLHNlcXVlbmNlKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgInBhY2thZ2VzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlICglcikiICUgKHBhY2thZ2VzLCkKKyAgICAgICAgICAgICkKKyAgICAgICAgbWFwKHNlbGYuZXhjbHVkZV9wYWNrYWdlLCBwYWNrYWdlcykKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgX3BhcnNlX2NvbW1hbmRfb3B0cyhzZWxmLCBwYXJzZXIsIGFyZ3MpOgorICAgICAgICAjIFJlbW92ZSAtLXdpdGgtWC8tLXdpdGhvdXQtWCBvcHRpb25zIHdoZW4gcHJvY2Vzc2luZyBjb21tYW5kIGFyZ3MKKyAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IHNlbGYuX19jbGFzc19fLmdsb2JhbF9vcHRpb25zCisgICAgICAgIHNlbGYubmVnYXRpdmVfb3B0ID0gc2VsZi5fX2NsYXNzX18ubmVnYXRpdmVfb3B0CisKKyAgICAgICAgIyBGaXJzdCwgZXhwYW5kIGFueSBhbGlhc2VzCisgICAgICAgIGNvbW1hbmQgPSBhcmdzWzBdCisgICAgICAgIGFsaWFzZXMgPSBzZWxmLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCisgICAgICAgIHdoaWxlIGNvbW1hbmQgaW4gYWxpYXNlczoKKyAgICAgICAgICAgIHNyYyxhbGlhcyA9IGFsaWFzZXNbY29tbWFuZF0KKyAgICAgICAgICAgIGRlbCBhbGlhc2VzW2NvbW1hbmRdICAgICMgZW5zdXJlIGVhY2ggYWxpYXMgY2FuIGV4cGFuZCBvbmx5IG9uY2UhCisgICAgICAgICAgICBpbXBvcnQgc2hsZXgKKyAgICAgICAgICAgIGFyZ3NbOjFdID0gc2hsZXguc3BsaXQoYWxpYXMsVHJ1ZSkKKyAgICAgICAgICAgIGNvbW1hbmQgPSBhcmdzWzBdCisKKyAgICAgICAgbmFyZ3MgPSBfRGlzdHJpYnV0aW9uLl9wYXJzZV9jb21tYW5kX29wdHMoc2VsZiwgcGFyc2VyLCBhcmdzKQorCisgICAgICAgICMgSGFuZGxlIGNvbW1hbmRzIHRoYXQgd2FudCB0byBjb25zdW1lIGFsbCByZW1haW5pbmcgYXJndW1lbnRzCisgICAgICAgIGNtZF9jbGFzcyA9IHNlbGYuZ2V0X2NvbW1hbmRfY2xhc3MoY29tbWFuZCkKKyAgICAgICAgaWYgZ2V0YXR0cihjbWRfY2xhc3MsJ2NvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzJyxOb25lKToKKyAgICAgICAgICAgIHNlbGYuZ2V0X29wdGlvbl9kaWN0KGNvbW1hbmQpWydhcmdzJ10gPSAoImNvbW1hbmQgbGluZSIsIG5hcmdzKQorICAgICAgICAgICAgaWYgbmFyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgcmV0dXJuIG5hcmdzCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgZ2V0X2NtZGxpbmVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgJ3tjbWQ6IHtvcHQ6dmFsfX0nIG1hcCBvZiBhbGwgY29tbWFuZC1saW5lIG9wdGlvbnMKKworICAgICAgICBPcHRpb24gbmFtZXMgYXJlIGFsbCBsb25nLCBidXQgZG8gbm90IGluY2x1ZGUgdGhlIGxlYWRpbmcgJy0tJywgYW5kCisgICAgICAgIGNvbnRhaW4gZGFzaGVzIHJhdGhlciB0aGFuIHVuZGVyc2NvcmVzLiAgSWYgdGhlIG9wdGlvbiBkb2Vzbid0IHRha2UKKyAgICAgICAgYW4gYXJndW1lbnQgKGUuZy4gJy0tcXVpZXQnKSwgdGhlICd2YWwnIGlzICdOb25lJy4KKworICAgICAgICBOb3RlIHRoYXQgb3B0aW9ucyBwcm92aWRlZCBieSBjb25maWcgZmlsZXMgYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQuCisgICAgICAgICIiIgorCisgICAgICAgIGQgPSB7fQorCisgICAgICAgIGZvciBjbWQsb3B0cyBpbiBzZWxmLmNvbW1hbmRfb3B0aW9ucy5pdGVtcygpOgorCisgICAgICAgICAgICBmb3Igb3B0LChzcmMsdmFsKSBpbiBvcHRzLml0ZW1zKCk6CisKKyAgICAgICAgICAgICAgICBpZiBzcmMgIT0gImNvbW1hbmQgbGluZSI6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBvcHQgPSBvcHQucmVwbGFjZSgnXycsJy0nKQorCisgICAgICAgICAgICAgICAgaWYgdmFsPT0wOgorICAgICAgICAgICAgICAgICAgICBjbWRvYmogPSBzZWxmLmdldF9jb21tYW5kX29iaihjbWQpCisgICAgICAgICAgICAgICAgICAgIG5lZ19vcHQgPSBzZWxmLm5lZ2F0aXZlX29wdC5jb3B5KCkKKyAgICAgICAgICAgICAgICAgICAgbmVnX29wdC51cGRhdGUoZ2V0YXR0cihjbWRvYmosJ25lZ2F0aXZlX29wdCcse30pKQorICAgICAgICAgICAgICAgICAgICBmb3IgbmVnLHBvcyBpbiBuZWdfb3B0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwb3M9PW9wdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQ9bmVnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsPU5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBoZXJlIikKKworICAgICAgICAgICAgICAgIGVsaWYgdmFsPT0xOgorICAgICAgICAgICAgICAgICAgICB2YWwgPSBOb25lCisKKyAgICAgICAgICAgICAgICBkLnNldGRlZmF1bHQoY21kLHt9KVtvcHRdID0gdmFsCisKKyAgICAgICAgcmV0dXJuIGQKKworCisgICAgZGVmIGl0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgorICAgICAgICAiIiJZaWVsZCBhbGwgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb24gbmFtZXMgaW4gZGlzdHJpYnV0aW9uIiIiCisKKyAgICAgICAgZm9yIHBrZyBpbiBzZWxmLnBhY2thZ2VzIG9yICgpOgorICAgICAgICAgICAgeWllbGQgcGtnCisKKyAgICAgICAgZm9yIG1vZHVsZSBpbiBzZWxmLnB5X21vZHVsZXMgb3IgKCk6CisgICAgICAgICAgICB5aWVsZCBtb2R1bGUKKworICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0X21vZHVsZXMgb3IgKCk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCx0dXBsZSk6CisgICAgICAgICAgICAgICAgbmFtZSxidWlsZGluZm8gPSBleHQKKyAgICAgICAgICAgICAgICB5aWVsZCBuYW1lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIGV4dC5uYW1lCisKKyMgSW5zdGFsbCBpdCB0aHJvdWdob3V0IHRoZSBkaXN0dXRpbHMKK2ZvciBtb2R1bGUgaW4gZGlzdHV0aWxzLmRpc3QsIGRpc3R1dGlscy5jb3JlLCBkaXN0dXRpbHMuY21kOgorICAgIG1vZHVsZS5EaXN0cmlidXRpb24gPSBEaXN0cmlidXRpb24KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3MgRmVhdHVyZToKKyAgICAiIiJBIHN1YnNldCBvZiB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlIGV4Y2x1ZGVkIGlmIHVubmVlZGVkL3dhbnRlZAorCisgICAgRmVhdHVyZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlc2Uga2V5d29yZCBhcmd1bWVudHM6CisKKyAgICAgICdkZXNjcmlwdGlvbicgLS0gYSBzaG9ydCwgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUsIHRvCisgICAgICAgICBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLCBhbmQgb3B0aW9uIGhlbHAgbWVzc2FnZXMuCisKKyAgICAgICdzdGFuZGFyZCcgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCBpZiBpdCBpcworICAgICAgICAgYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHN5c3RlbS4gIE90aGVyd2lzZSwgdGhlIGZlYXR1cmUgaXMgb25seQorICAgICAgICAgaW5jbHVkZWQgaWYgcmVxdWVzdGVkIHZpYSBhIGNvbW1hbmQgbGluZSAnLS13aXRoLVgnIG9wdGlvbiwgb3IgaWYKKyAgICAgICAgIGFub3RoZXIgaW5jbHVkZWQgZmVhdHVyZSByZXF1aXJlcyBpdC4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ0ZhbHNlJy4KKworICAgICAgJ2F2YWlsYWJsZScgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciBpbnN0YWxsYXRpb24gb24gdGhlCisgICAgICAgICBjdXJyZW50IHN5c3RlbS4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ1RydWUnLgorCisgICAgICAnb3B0aW9uYWwnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlJ3MgaW5jbHVzaW9uIGNhbiBiZSBjb250cm9sbGVkIGZyb20gdGhlCisgICAgICAgICBjb21tYW5kIGxpbmUsIHVzaW5nIHRoZSAnLS13aXRoLVgnIG9yICctLXdpdGhvdXQtWCcgb3B0aW9ucy4gIElmCisgICAgICAgICBmYWxzZSwgdGhlIGZlYXR1cmUncyBpbmNsdXNpb24gc3RhdHVzIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSwKKyAgICAgICAgIGJhc2VkIG9uICdhdmFpbGFiaWxlJywgJ3N0YW5kYXJkJywgYW5kIHdoZXRoZXIgYW55IG90aGVyIGZlYXR1cmUKKyAgICAgICAgIHJlcXVpcmVzIGl0LiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnVHJ1ZScuCisKKyAgICAgICdyZXF1aXJlX2ZlYXR1cmVzJyAtLSBhIHN0cmluZyBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzIG5hbWluZyBmZWF0dXJlcworICAgICAgICAgdGhhdCBzaG91bGQgYWxzbyBiZSBpbmNsdWRlZCBpZiB0aGlzIGZlYXR1cmUgaXMgaW5jbHVkZWQuICBEZWZhdWx0cyB0bworICAgICAgICAgZW1wdHkgbGlzdC4gIE1heSBhbHNvIGNvbnRhaW4gJ1JlcXVpcmUnIG9iamVjdHMgdGhhdCBzaG91bGQgYmUKKyAgICAgICAgIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgICAncmVtb3ZlJyAtLSBhIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIHBhY2thZ2VzIHRvIGJlIHJlbW92ZWQKKyAgICAgICAgIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBpZiB0aGlzIGZlYXR1cmUgaXMgKm5vdCogaW5jbHVkZWQuICBJZiB0aGUKKyAgICAgICAgIGZlYXR1cmUgKmlzKiBpbmNsdWRlZCwgdGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkLiAgVGhpcyBhcmd1bWVudCBleGlzdHMKKyAgICAgICAgIHRvIHN1cHBvcnQgcmVtb3ZpbmcgZmVhdHVyZXMgdGhhdCAiY3Jvc3NjdXQiIGEgZGlzdHJpYnV0aW9uLCBzdWNoIGFzCisgICAgICAgICBkZWZpbmluZyBhICd0ZXN0cycgZmVhdHVyZSB0aGF0IHJlbW92ZXMgYWxsIHRoZSAndGVzdHMnIHN1YnBhY2thZ2VzCisgICAgICAgICBwcm92aWRlZCBieSBvdGhlciBmZWF0dXJlcy4gIFRoZSBkZWZhdWx0IGZvciB0aGlzIGFyZ3VtZW50IGlzIGFuIGVtcHR5CisgICAgICAgICBsaXN0LiAgKE5vdGU6IHRoZSBuYW1lZCBwYWNrYWdlKHMpIG9yIG1vZHVsZXMgbXVzdCBleGlzdCBpbiB0aGUgYmFzZQorICAgICAgICAgZGlzdHJpYnV0aW9uIHdoZW4gdGhlICdzZXR1cCgpJyBmdW5jdGlvbiBpcyBpbml0aWFsbHkgY2FsbGVkLikKKworICAgICAgb3RoZXIga2V5d29yZHMgLS0gYW55IG90aGVyIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzYXZlZCwgYW5kIHBhc3NlZCB0bworICAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdpbmNsdWRlKCknIGFuZCAnZXhjbHVkZSgpJyBtZXRob2RzIHdoZW4gdGhlCisgICAgICAgICBmZWF0dXJlIGlzIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLCByZXNwZWN0aXZlbHkuICBTbywgZm9yIGV4YW1wbGUsIHlvdQorICAgICAgICAgY291bGQgcGFzcyAncGFja2FnZXM9WyJhIiwiYiJdJyB0byBjYXVzZSBwYWNrYWdlcyAnYScgYW5kICdiJyB0byBiZQorICAgICAgICAgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBkaXN0cmlidXRpb24gYXMgYXBwcm9wcmlhdGUuCisKKyAgICBBIGZlYXR1cmUgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSAncmVxdWlyZXMnLCAncmVtb3ZlJywgb3Igb3RoZXIKKyAgICBrZXl3b3JkIGFyZ3VtZW50LiAgT3RoZXJ3aXNlLCBpdCBjYW4ndCBhZmZlY3QgdGhlIGRpc3RyaWJ1dGlvbiBpbiBhbnkgd2F5LgorICAgIE5vdGUgYWxzbyB0aGF0IHlvdSBjYW4gc3ViY2xhc3MgJ0ZlYXR1cmUnIHRvIGNyZWF0ZSB5b3VyIG93biBzcGVjaWFsaXplZAorICAgIGZlYXR1cmUgdHlwZXMgdGhhdCBtb2RpZnkgdGhlIGRpc3RyaWJ1dGlvbiBpbiBvdGhlciB3YXlzIHdoZW4gaW5jbHVkZWQgb3IKKyAgICBleGNsdWRlZC4gIFNlZSB0aGUgZG9jc3RyaW5ncyBmb3IgdGhlIHZhcmlvdXMgbWV0aG9kcyBoZXJlIGZvciBtb3JlIGRldGFpbC4KKyAgICBBc2lkZSBmcm9tIHRoZSBtZXRob2RzLCB0aGUgb25seSBmZWF0dXJlIGF0dHJpYnV0ZXMgdGhhdCBkaXN0cmlidXRpb25zIGxvb2sKKyAgICBhdCBhcmUgJ2Rlc2NyaXB0aW9uJyBhbmQgJ29wdGlvbmFsJy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVzY3JpcHRpb24sIHN0YW5kYXJkPUZhbHNlLCBhdmFpbGFibGU9VHJ1ZSwKKyAgICAgICAgb3B0aW9uYWw9VHJ1ZSwgcmVxdWlyZV9mZWF0dXJlcz0oKSwgcmVtb3ZlPSgpLCAqKmV4dHJhcworICAgICk6CisKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uCisgICAgICAgIHNlbGYuc3RhbmRhcmQgPSBzdGFuZGFyZAorICAgICAgICBzZWxmLmF2YWlsYWJsZSA9IGF2YWlsYWJsZQorICAgICAgICBzZWxmLm9wdGlvbmFsID0gb3B0aW9uYWwKKyAgICAgICAgaWYgaXNpbnN0YW5jZShyZXF1aXJlX2ZlYXR1cmVzLChzdHIsUmVxdWlyZSkpOgorICAgICAgICAgICAgcmVxdWlyZV9mZWF0dXJlcyA9IHJlcXVpcmVfZmVhdHVyZXMsCisKKyAgICAgICAgc2VsZi5yZXF1aXJlX2ZlYXR1cmVzID0gWworICAgICAgICAgICAgciBmb3IgciBpbiByZXF1aXJlX2ZlYXR1cmVzIGlmIGlzaW5zdGFuY2UocixzdHIpCisgICAgICAgIF0KKyAgICAgICAgZXIgPSBbciBmb3IgciBpbiByZXF1aXJlX2ZlYXR1cmVzIGlmIG5vdCBpc2luc3RhbmNlKHIsc3RyKV0KKyAgICAgICAgaWYgZXI6IGV4dHJhc1sncmVxdWlyZV9mZWF0dXJlcyddID0gZXIKKworICAgICAgICBpZiBpc2luc3RhbmNlKHJlbW92ZSxzdHIpOgorICAgICAgICAgICAgcmVtb3ZlID0gcmVtb3ZlLAorICAgICAgICBzZWxmLnJlbW92ZSA9IHJlbW92ZQorICAgICAgICBzZWxmLmV4dHJhcyA9IGV4dHJhcworCisgICAgICAgIGlmIG5vdCByZW1vdmUgYW5kIG5vdCByZXF1aXJlX2ZlYXR1cmVzIGFuZCBub3QgZXh0cmFzOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICAgICAiRmVhdHVyZSAlczogbXVzdCBkZWZpbmUgJ3JlcXVpcmVfZmVhdHVyZXMnLCAncmVtb3ZlJywgb3IgYXQgbGVhc3Qgb25lIgorICAgICAgICAgICAgICAgICIgb2YgJ3BhY2thZ2VzJywgJ3B5X21vZHVsZXMnLCBldGMuIgorICAgICAgICAgICAgKQorCisgICAgZGVmIGluY2x1ZGVfYnlfZGVmYXVsdChzZWxmKToKKyAgICAgICAgIiIiU2hvdWxkIHRoaXMgZmVhdHVyZSBiZSBpbmNsdWRlZCBieSBkZWZhdWx0PyIiIgorICAgICAgICByZXR1cm4gc2VsZi5hdmFpbGFibGUgYW5kIHNlbGYuc3RhbmRhcmQKKworICAgIGRlZiBpbmNsdWRlX2luKHNlbGYsZGlzdCk6CisKKyAgICAgICAgIiIiRW5zdXJlIGZlYXR1cmUgYW5kIGl0cyByZXF1aXJlbWVudHMgYXJlIGluY2x1ZGVkIGluIGRpc3RyaWJ1dGlvbgorCisgICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBpbiBhIHN1YmNsYXNzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zIG9uCisgICAgICAgIHRoZSBkaXN0cmlidXRpb24uICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZQorICAgICAgICBwZXIgZmVhdHVyZSwgYW5kIHNvIHNob3VsZCBiZSBpZGVtcG90ZW50LgorCisgICAgICAgICIiIgorCisgICAgICAgIGlmIG5vdCBzZWxmLmF2YWlsYWJsZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoCisgICAgICAgICAgICAgICAgc2VsZi5kZXNjcmlwdGlvbisiIGlzIHJlcXVpcmVkLCIKKyAgICAgICAgICAgICAgICAiYnV0IGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybSIKKyAgICAgICAgICAgICkKKworICAgICAgICBkaXN0LmluY2x1ZGUoKipzZWxmLmV4dHJhcykKKworICAgICAgICBmb3IgZiBpbiBzZWxmLnJlcXVpcmVfZmVhdHVyZXM6CisgICAgICAgICAgICBkaXN0LmluY2x1ZGVfZmVhdHVyZShmKQorCisKKworICAgIGRlZiBleGNsdWRlX2Zyb20oc2VsZixkaXN0KToKKworICAgICAgICAiIiJFbnN1cmUgZmVhdHVyZSBpcyBleGNsdWRlZCBmcm9tIGRpc3RyaWJ1dGlvbgorCisgICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBpbiBhIHN1YmNsYXNzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zIG9uCisgICAgICAgIHRoZSBkaXN0cmlidXRpb24uICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyCisgICAgICAgIGZlYXR1cmUsIGFuZCBvbmx5IGFmdGVyIGFsbCBpbmNsdWRlZCBmZWF0dXJlcyBoYXZlIGJlZW4gYXNrZWQgdG8KKyAgICAgICAgaW5jbHVkZSB0aGVtc2VsdmVzLgorICAgICAgICAiIiIKKworICAgICAgICBkaXN0LmV4Y2x1ZGUoKipzZWxmLmV4dHJhcykKKworICAgICAgICBpZiBzZWxmLnJlbW92ZToKKyAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYucmVtb3ZlOgorICAgICAgICAgICAgICAgIGRpc3QuZXhjbHVkZV9wYWNrYWdlKGl0ZW0pCisKKworCisgICAgZGVmIHZhbGlkYXRlKHNlbGYsZGlzdCk6CisKKyAgICAgICAgIiIiVmVyaWZ5IHRoYXQgZmVhdHVyZSBtYWtlcyBzZW5zZSBpbiBjb250ZXh0IG9mIGRpc3RyaWJ1dGlvbgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZGlzdHJpYnV0aW9uIGp1c3QgYmVmb3JlIGl0IHBhcnNlcyBpdHMKKyAgICAgICAgY29tbWFuZCBsaW5lLiAgSXQgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSAncmVtb3ZlJyBhdHRyaWJ1dGUsIGlmIGFueSwKKyAgICAgICAgY29udGFpbnMgb25seSB2YWxpZCBwYWNrYWdlL21vZHVsZSBuYW1lcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBiYXNlCisgICAgICAgIGRpc3RyaWJ1dGlvbiB3aGVuICdzZXR1cCgpJyBpcyBjYWxsZWQuICBZb3UgbWF5IG92ZXJyaWRlIGl0IGluIGEKKyAgICAgICAgc3ViY2xhc3MgdG8gcGVyZm9ybSBhbnkgb3RoZXIgcmVxdWlyZWQgdmFsaWRhdGlvbiBvZiB0aGUgZmVhdHVyZQorICAgICAgICBhZ2FpbnN0IGEgdGFyZ2V0IGRpc3RyaWJ1dGlvbi4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5yZW1vdmU6CisgICAgICAgICAgICBpZiBub3QgZGlzdC5oYXNfY29udGVudHNfZm9yKGl0ZW0pOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICIlcyB3YW50cyB0byBiZSBhYmxlIHRvIHJlbW92ZSAlcywgYnV0IHRoZSBkaXN0cmlidXRpb24iCisgICAgICAgICAgICAgICAgICAgICIgZG9lc24ndCBjb250YWluIGFueSBwYWNrYWdlcyBvciBtb2R1bGVzIHVuZGVyICVzIgorICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBpdGVtLCBpdGVtKQorICAgICAgICAgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2V4dGVuc2lvbi5weSBiL0xpYi9zZXR1cHRvb2xzL2V4dGVuc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNmNTViCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvZXh0ZW5zaW9uLnB5CkBAIC0wLDAgKzEsMzUgQEAKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IEV4dGVuc2lvbiBhcyBfRXh0ZW5zaW9uCitmcm9tIGRpc3QgaW1wb3J0IF9nZXRfdW5wYXRjaGVkCitfRXh0ZW5zaW9uID0gX2dldF91bnBhdGNoZWQoX0V4dGVuc2lvbikKKwordHJ5OgorICAgIGZyb20gUHlyZXguRGlzdHV0aWxzLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaGF2ZV9weXJleCA9IEZhbHNlCitlbHNlOgorICAgIGhhdmVfcHlyZXggPSBUcnVlCisKKworY2xhc3MgRXh0ZW5zaW9uKF9FeHRlbnNpb24pOgorICAgICIiIkV4dGVuc2lvbiB0aGF0IHVzZXMgJy5jJyBmaWxlcyBpbiBwbGFjZSBvZiAnLnB5eCcgZmlsZXMiIiIKKworICAgIGlmIG5vdCBoYXZlX3B5cmV4OgorICAgICAgICAjIGNvbnZlcnQgLnB5eCBleHRlbnNpb25zIHRvIC5jCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCphcmdzLCoqa3cpOgorICAgICAgICAgICAgX0V4dGVuc2lvbi5fX2luaXRfXyhzZWxmLCphcmdzLCoqa3cpCisgICAgICAgICAgICBzb3VyY2VzID0gW10KKyAgICAgICAgICAgIGZvciBzIGluIHNlbGYuc291cmNlczoKKyAgICAgICAgICAgICAgICBpZiBzLmVuZHN3aXRoKCcucHl4Jyk6CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMuYXBwZW5kKHNbOi0zXSsnYycpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc291cmNlcy5hcHBlbmQocykKKyAgICAgICAgICAgIHNlbGYuc291cmNlcyA9IHNvdXJjZXMKKworY2xhc3MgTGlicmFyeShFeHRlbnNpb24pOgorICAgICIiIkp1c3QgbGlrZSBhIHJlZ3VsYXIgRXh0ZW5zaW9uLCBidXQgYnVpbHQgYXMgYSBsaWJyYXJ5IGluc3RlYWQiIiIKKworaW1wb3J0IHN5cywgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5leHRlbnNpb24KK2Rpc3R1dGlscy5jb3JlLkV4dGVuc2lvbiA9IEV4dGVuc2lvbgorZGlzdHV0aWxzLmV4dGVuc2lvbi5FeHRlbnNpb24gPSBFeHRlbnNpb24KK2lmICdkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnIGluIHN5cy5tb2R1bGVzOgorICAgIHN5cy5tb2R1bGVzWydkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnXS5FeHRlbnNpb24gPSBFeHRlbnNpb24KZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2d1aS5leGUgYi9MaWIvc2V0dXB0b29scy9ndWkuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzZmYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9ndWkuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHkgYi9MaWIvc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwN2UyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5CkBAIC0wLDAgKzEsNjc0IEBACisiIiJQeVBJIGFuZCBkaXJlY3QgcGFja2FnZSBkb3dubG9hZGluZyIiIgorCitpbXBvcnQgc3lzLCBvcy5wYXRoLCByZSwgdXJscGFyc2UsIHVybGxpYjIsIHNodXRpbCwgcmFuZG9tLCBzb2NrZXQKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgorZnJvbSBtZDUgaW1wb3J0IG1kNQorZnJvbSBmbm1hdGNoIGltcG9ydCB0cmFuc2xhdGUKKworRUdHX0ZSQUdNRU5UID0gcmUuY29tcGlsZShyJ15lZ2c9KFstQS1aYS16MC05Xy5dKykkJykKK0hSRUYgPSByZS5jb21waWxlKCIiImhyZWZcXHMqPVxccypbJyJdPyhbXiciPiBdKykiIiIsIHJlLkkpCisjIHRoaXMgaXMgaGVyZSB0byBmaXggZW1hY3MnIGNydWRkeSBicm9rZW4gc3ludGF4IGhpZ2hsaWdodGluZworUFlQSV9NRDUgPSByZS5jb21waWxlKAorICAgICc8YSBocmVmPSIoW14iI10rKSI+KFtePF0rKTwvYT5cblxzK1xcKDxhIGhyZWY9IlteP10rXD86YWN0aW9uPXNob3dfbWQ1JworICAgICcmYW1wO2RpZ2VzdD0oWzAtOWEtZl17MzJ9KSI+bWQ1PC9hPlxcKScKKykKKworVVJMX1NDSEVNRSA9IHJlLmNvbXBpbGUoJyhbLSsuYS16MC05XXsyLH0pOicscmUuSSkubWF0Y2gKK0VYVEVOU0lPTlMgPSAiLnRhci5neiAudGFyLmJ6MiAudGFyIC56aXAgLnRneiIuc3BsaXQoKQorCitfX2FsbF9fID0gWworICAgICdQYWNrYWdlSW5kZXgnLCAnZGlzdHJvc19mb3JfdXJsJywgJ3BhcnNlX2JkaXN0X3dpbmluc3QnLAorICAgICdpbnRlcnByZXRfZGlzdHJvX25hbWUnLAorXQorCisKK2RlZiBwYXJzZV9iZGlzdF93aW5pbnN0KG5hbWUpOgorICAgICIiIlJldHVybiAoYmFzZSxweXZlcnNpb24pIG9yIChOb25lLE5vbmUpIGZvciBwb3NzaWJsZSAuZXhlIG5hbWUiIiIKKworICAgIGxvd2VyID0gbmFtZS5sb3dlcigpCisgICAgYmFzZSwgcHlfdmVyID0gTm9uZSwgTm9uZQorCisgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy5leGUnKToKKyAgICAgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy53aW4zMi5leGUnKToKKyAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTBdCisgICAgICAgIGVsaWYgbG93ZXIuc3RhcnRzd2l0aCgnLndpbjMyLXB5JywtMTYpOgorICAgICAgICAgICAgcHlfdmVyID0gbmFtZVstNzotNF0KKyAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTZdCisKKyAgICByZXR1cm4gYmFzZSxweV92ZXIKKworZGVmIGVnZ19pbmZvX2Zvcl91cmwodXJsKToKKyAgICBzY2hlbWUsIHNlcnZlciwgcGF0aCwgcGFyYW1ldGVycywgcXVlcnksIGZyYWdtZW50ID0gdXJscGFyc2UudXJscGFyc2UodXJsKQorICAgIGJhc2UgPSB1cmxsaWIyLnVucXVvdGUocGF0aC5zcGxpdCgnLycpWy0xXSkKKyAgICBpZiAnIycgaW4gYmFzZTogYmFzZSwgZnJhZ21lbnQgPSBiYXNlLnNwbGl0KCcjJywxKQorICAgIHJldHVybiBiYXNlLGZyYWdtZW50CisKK2RlZiBkaXN0cm9zX2Zvcl91cmwodXJsLCBtZXRhZGF0YT1Ob25lKToKKyAgICAiIiJZaWVsZCBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIHRoYXQgbWlnaHQgYmUgZm91bmQgYXQgYSBVUkwiIiIKKyAgICBiYXNlLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwodXJsKQorICAgIGRpc3RzID0gZGlzdHJvc19mb3JfbG9jYXRpb24odXJsLCBiYXNlLCBtZXRhZGF0YSkKKyAgICBpZiBmcmFnbWVudCBhbmQgbm90IGRpc3RzOgorICAgICAgICBtYXRjaCA9IEVHR19GUkFHTUVOVC5tYXRjaChmcmFnbWVudCkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAorICAgICAgICAgICAgICAgIHVybCwgbWF0Y2guZ3JvdXAoMSksIG1ldGFkYXRhLCBwcmVjZWRlbmNlID0gQ0hFQ0tPVVRfRElTVAorICAgICAgICAgICAgKQorICAgIHJldHVybiBkaXN0cworCitkZWYgZGlzdHJvc19mb3JfbG9jYXRpb24obG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YT1Ob25lKToKKyAgICAiIiJZaWVsZCBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIGJhc2VkIG9uIGJhc2VuYW1lIiIiCisgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5lZ2cuemlwJyk6CisgICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbOi00XSAgICAjIHN0cmlwIHRoZSAuemlwCisgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5lZ2cnKTogICAjIG9ubHkgb25lLCB1bmFtYmlndW91cyBpbnRlcnByZXRhdGlvbgorICAgICAgICByZXR1cm4gW0Rpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpXQorCisgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5leGUnKToKKyAgICAgICAgd2luX2Jhc2UsIHB5X3ZlciA9IHBhcnNlX2JkaXN0X3dpbmluc3QoYmFzZW5hbWUpCisgICAgICAgIGlmIHdpbl9iYXNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGludGVycHJldF9kaXN0cm9fbmFtZSgKKyAgICAgICAgICAgICAgICBsb2NhdGlvbiwgd2luX2Jhc2UsIG1ldGFkYXRhLCBweV92ZXIsIEJJTkFSWV9ESVNULCAid2luMzIiCisgICAgICAgICAgICApCisKKyAgICAjIFRyeSBzb3VyY2UgZGlzdHJvIGV4dGVuc2lvbnMgKC56aXAsIC50Z3osIGV0Yy4pCisgICAgIworICAgIGZvciBleHQgaW4gRVhURU5TSU9OUzoKKyAgICAgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoZXh0KToKKyAgICAgICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbOi1sZW4oZXh0KV0KKyAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfZGlzdHJvX25hbWUobG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YSkKKyAgICByZXR1cm4gW10gICMgbm8gZXh0ZW5zaW9uIG1hdGNoZWQKKworCitkZWYgZGlzdHJvc19mb3JfZmlsZW5hbWUoZmlsZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgorICAgICIiIllpZWxkIHBvc3NpYmxlIGVnZyBvciBzb3VyY2UgZGlzdHJpYnV0aW9uIG9iamVjdHMgYmFzZWQgb24gYSBmaWxlbmFtZSIiIgorICAgIHJldHVybiBkaXN0cm9zX2Zvcl9sb2NhdGlvbigKKyAgICAgICAgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEKKyAgICApCisKKworZGVmIGludGVycHJldF9kaXN0cm9fbmFtZShsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhLAorICAgIHB5X3ZlcnNpb249Tm9uZSwgcHJlY2VkZW5jZT1TT1VSQ0VfRElTVCwgcGxhdGZvcm09Tm9uZQorKToKKyAgICAiIiJHZW5lcmF0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgYSBzb3VyY2UgZGlzdHJvIG5hbWUKKworICAgIE5vdGU6IGlmIGBsb2NhdGlvbmAgaXMgYSBmaWxlc3lzdGVtIGZpbGVuYW1lLCB5b3Ugc2hvdWxkIGNhbGwKKyAgICBgYHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgoKWBgIG9uIGl0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMKKyAgICByb3V0aW5lIQorICAgICIiIgorCisgICAgIyBHZW5lcmF0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgYSBzb3VyY2UgZGlzdHJvIG5hbWUKKyAgICAjIEJlY2F1c2Ugc29tZSBwYWNrYWdlcyBhcmUgYW1iaWd1b3VzIGFzIHRvIG5hbWUvdmVyc2lvbnMgc3BsaXQKKyAgICAjIGUuZy4gImFkbnMtcHl0aG9uLTEuMS4wIiwgImVnZW5peC1teC1jb21tZXJjaWFsIiwgZXRjLgorICAgICMgU28sIHdlIGdlbmVyYXRlIGVhY2ggcG9zc2libGUgaW50ZXJlcHJldGF0aW9uIChlLmcuICJhZG5zLCBweXRob24tMS4xLjAiCisgICAgIyAiYWRucy1weXRob24sIDEuMS4wIiwgYW5kICJhZG5zLXB5dGhvbi0xLjEuMCwgbm8gdmVyc2lvbiIpLiAgSW4gcHJhY3RpY2UsCisgICAgIyB0aGUgc3B1cmlvdXMgaW50ZXJwcmV0YXRpb25zIHNob3VsZCBiZSBpZ25vcmVkLCBiZWNhdXNlIGluIHRoZSBldmVudAorICAgICMgdGhlcmUncyBhbHNvIGFuICJhZG5zIiBwYWNrYWdlLCB0aGUgc3B1cmlvdXMgInB5dGhvbi0xLjEuMCIgdmVyc2lvbiB3aWxsCisgICAgIyBjb21wYXJlIGxvd2VyIHRoYW4gYW55IG51bWVyaWMgdmVyc2lvbiBudW1iZXIsIGFuZCBpcyB0aGVyZWZvcmUgdW5saWtlbHkKKyAgICAjIHRvIG1hdGNoIGEgcmVxdWVzdCBmb3IgaXQuICBJdCdzIHN0aWxsIGEgcG90ZW50aWFsIHByb2JsZW0sIHRob3VnaCwgYW5kCisgICAgIyBpbiB0aGUgbG9uZyBydW4gUHlQSSBhbmQgdGhlIGRpc3R1dGlscyBzaG91bGQgZ28gZm9yICJzYWZlIiBuYW1lcyBhbmQKKyAgICAjIHZlcnNpb25zIGluIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIG5hbWVzIChzZGlzdCBhbmQgYmRpc3QpLgorCisgICAgcGFydHMgPSBiYXNlbmFtZS5zcGxpdCgnLScpCisgICAgZm9yIHAgaW4gcmFuZ2UoMSxsZW4ocGFydHMpKzEpOgorICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24oCisgICAgICAgICAgICBsb2NhdGlvbiwgbWV0YWRhdGEsICctJy5qb2luKHBhcnRzWzpwXSksICctJy5qb2luKHBhcnRzW3A6XSksCisgICAgICAgICAgICBweV92ZXJzaW9uPXB5X3ZlcnNpb24sIHByZWNlZGVuY2UgPSBwcmVjZWRlbmNlLAorICAgICAgICAgICAgcGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICApCisKKworCisKKworY2xhc3MgUGFja2FnZUluZGV4KEVudmlyb25tZW50KToKKyAgICAiIiJBIGRpc3RyaWJ1dGlvbiBpbmRleCB0aGF0IHNjYW5zIHdlYiBwYWdlcyBmb3IgZG93bmxvYWQgVVJMcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsaW5kZXhfdXJsPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHlwaSIsaG9zdHM9KCcqJywpLCphcmdzLCoqa3cpOgorICAgICAgICBFbnZpcm9ubWVudC5fX2luaXRfXyhzZWxmLCphcmdzLCoqa3cpCisgICAgICAgIHNlbGYuaW5kZXhfdXJsID0gaW5kZXhfdXJsICsgIi8iWzpub3QgaW5kZXhfdXJsLmVuZHN3aXRoKCcvJyldCisgICAgICAgIHNlbGYuc2Nhbm5lZF91cmxzID0ge30KKyAgICAgICAgc2VsZi5mZXRjaGVkX3VybHMgPSB7fQorICAgICAgICBzZWxmLnBhY2thZ2VfcGFnZXMgPSB7fQorICAgICAgICBzZWxmLmFsbG93cyA9IHJlLmNvbXBpbGUoJ3wnLmpvaW4obWFwKHRyYW5zbGF0ZSxob3N0cykpKS5tYXRjaAorICAgICAgICBzZWxmLnRvX3NjYW4gPSBbXQorCisgICAgZGVmIHByb2Nlc3NfdXJsKHNlbGYsIHVybCwgcmV0cmlldmU9RmFsc2UpOgorICAgICAgICAiIiJFdmFsdWF0ZSBhIFVSTCBhcyBhIHBvc3NpYmxlIGRvd25sb2FkLCBhbmQgbWF5YmUgcmV0cmlldmUgaXQiIiIKKyAgICAgICAgdXJsID0gZml4X3NmX3VybCh1cmwpCisgICAgICAgIGlmIHVybCBpbiBzZWxmLnNjYW5uZWRfdXJscyBhbmQgbm90IHJldHJpZXZlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuc2Nhbm5lZF91cmxzW3VybF0gPSBUcnVlCisgICAgICAgIGlmIG5vdCBVUkxfU0NIRU1FKHVybCk6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZmlsZW5hbWUodXJsKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaXN0cyA9IGxpc3QoZGlzdHJvc19mb3JfdXJsKHVybCkpCisgICAgICAgICAgICBpZiBkaXN0czoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi51cmxfb2sodXJsKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5kZWJ1ZygiRm91bmQgbGluazogJXMiLCB1cmwpCisKKyAgICAgICAgaWYgZGlzdHMgb3Igbm90IHJldHJpZXZlIG9yIHVybCBpbiBzZWxmLmZldGNoZWRfdXJsczoKKyAgICAgICAgICAgIG1hcChzZWxmLmFkZCwgZGlzdHMpCisgICAgICAgICAgICByZXR1cm4gICMgZG9uJ3QgbmVlZCB0aGUgYWN0dWFsIHBhZ2UKKworICAgICAgICBpZiBub3Qgc2VsZi51cmxfb2sodXJsKToKKyAgICAgICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW3VybF0gPSBUcnVlCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmluZm8oIlJlYWRpbmcgJXMiLCB1cmwpCisgICAgICAgIGYgPSBzZWxmLm9wZW5fdXJsKHVybCkKKyAgICAgICAgc2VsZi5mZXRjaGVkX3VybHNbdXJsXSA9IHNlbGYuZmV0Y2hlZF91cmxzW2YudXJsXSA9IFRydWUKKworCisgICAgICAgIGlmICdodG1sJyBub3QgaW4gZi5oZWFkZXJzWydjb250ZW50LXR5cGUnXS5sb3dlcigpOgorICAgICAgICAgICAgZi5jbG9zZSgpICAgIyBub3QgaHRtbCwgd2UgY2FuJ3QgcHJvY2VzcyBpdAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgYmFzZSA9IGYudXJsICAgICAjIGhhbmRsZSByZWRpcmVjdHMKKyAgICAgICAgcGFnZSA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aChzZWxmLmluZGV4X3VybCk6CisgICAgICAgICAgICBwYWdlID0gc2VsZi5wcm9jZXNzX2luZGV4KHVybCwgcGFnZSkKKworICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcihwYWdlKToKKyAgICAgICAgICAgIGxpbmsgPSB1cmxwYXJzZS51cmxqb2luKGJhc2UsIG1hdGNoLmdyb3VwKDEpKQorICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3VybChsaW5rKQorCisgICAgZGVmIHByb2Nlc3NfZmlsZW5hbWUoc2VsZiwgZm4sIG5lc3RlZD1GYWxzZSk6CisgICAgICAgICMgcHJvY2VzcyBmaWxlbmFtZXMgb3IgZGlyZWN0b3JpZXMKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgICAgIHNlbGYud2FybigiTm90IGZvdW5kOiAlcyIsIHVybCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZm4pIGFuZCBub3QgbmVzdGVkOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoZm4pCisgICAgICAgICAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKHBhdGgpOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19maWxlbmFtZShvcy5wYXRoLmpvaW4ocGF0aCxpdGVtKSwgVHJ1ZSkKKworICAgICAgICBkaXN0cyA9IGRpc3Ryb3NfZm9yX2ZpbGVuYW1lKGZuKQorICAgICAgICBpZiBkaXN0czoKKyAgICAgICAgICAgIHNlbGYuZGVidWcoIkZvdW5kOiAlcyIsIGZuKQorICAgICAgICAgICAgbWFwKHNlbGYuYWRkLCBkaXN0cykKKworICAgIGRlZiB1cmxfb2soc2VsZiwgdXJsLCBmYXRhbD1GYWxzZSk6CisgICAgICAgIGlmIHNlbGYuYWxsb3dzKHVybHBhcnNlLnVybHBhcnNlKHVybClbMV0pOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgbXNnID0gIlxuTGluayB0byAlIHMgKioqQkxPQ0tFRCoqKiBieSAtLWFsbG93LWhvc3RzXG4iCisgICAgICAgIGlmIGZhdGFsOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnICUgdXJsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53YXJuKG1zZywgdXJsKQorCisKKworICAgIGRlZiBwcm9jZXNzX2luZGV4KHNlbGYsdXJsLHBhZ2UpOgorICAgICAgICAiIiJQcm9jZXNzIHRoZSBjb250ZW50cyBvZiBhIFB5UEkgcGFnZSIiIgorICAgICAgICBkZWYgc2NhbihsaW5rKToKKyAgICAgICAgICAgICMgUHJvY2VzcyBhIFVSTCB0byBzZWUgaWYgaXQncyBmb3IgYSBwYWNrYWdlIHBhZ2UKKyAgICAgICAgICAgIGlmIGxpbmsuc3RhcnRzd2l0aChzZWxmLmluZGV4X3VybCk6CisgICAgICAgICAgICAgICAgcGFydHMgPSBtYXAoCisgICAgICAgICAgICAgICAgICAgIHVybGxpYjIudW5xdW90ZSwgbGlua1tsZW4oc2VsZi5pbmRleF91cmwpOl0uc3BsaXQoJy8nKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiBsZW4ocGFydHMpPT0yOgorICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBwYWNrYWdlIHBhZ2UsIHNhbml0aXplIGFuZCBpbmRleCBpdAorICAgICAgICAgICAgICAgICAgICBwa2cgPSBzYWZlX25hbWUocGFydHNbMF0pCisgICAgICAgICAgICAgICAgICAgIHZlciA9IHNhZmVfdmVyc2lvbihwYXJ0c1sxXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlX3BhZ2VzLnNldGRlZmF1bHQocGtnLmxvd2VyKCkse30pW2xpbmtdID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9fZmlsZW5hbWUocGtnKSwgdG9fZmlsZW5hbWUodmVyKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKworICAgICAgICBpZiB1cmw9PXNlbGYuaW5kZXhfdXJsIG9yICdJbmRleCBvZiBQYWNrYWdlczwvdGl0bGU+JyBpbiBwYWdlOgorICAgICAgICAgICAgIyBwcm9jZXNzIGFuIGluZGV4IHBhZ2UgaW50byB0aGUgcGFja2FnZS1wYWdlIGluZGV4CisgICAgICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcihwYWdlKToKKyAgICAgICAgICAgICAgICBzY2FuKCB1cmxwYXJzZS51cmxqb2luKHVybCwgbWF0Y2guZ3JvdXAoMSkpICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBrZyx2ZXIgPSBzY2FuKHVybCkgICAjIGVuc3VyZSB0aGlzIHBhZ2UgaXMgaW4gdGhlIHBhZ2UgaW5kZXgKKyAgICAgICAgICAgICMgcHJvY2VzcyBpbmRpdmlkdWFsIHBhY2thZ2UgcGFnZQorICAgICAgICAgICAgZm9yIHRhZyBpbiAoIjx0aD5Ib21lIFBhZ2UiLCAiPHRoPkRvd25sb2FkIFVSTCIpOgorICAgICAgICAgICAgICAgIHBvcyA9IHBhZ2UuZmluZCh0YWcpCisgICAgICAgICAgICAgICAgaWYgcG9zIT0tMToKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBIUkVGLnNlYXJjaChwYWdlLHBvcykKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFByb2Nlc3MgdGhlIGZvdW5kIFVSTAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3VybCA9IHVybHBhcnNlLnVybGpvaW4odXJsLCBtYXRjaC5ncm91cCgxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIGZyYWcgPSBlZ2dfaW5mb19mb3JfdXJsKG5ld191cmwpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCcucHknKSBhbmQgbm90IGZyYWc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGtnIGFuZCB2ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld191cmwrPScjZWdnPSVzLSVzJyAlIChwa2csdmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmVlZF92ZXJzaW9uX2luZm8odXJsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zY2FuX3VybChuZXdfdXJsKQorICAgICAgICByZXR1cm4gUFlQSV9NRDUuc3ViKAorICAgICAgICAgICAgbGFtYmRhIG06ICc8YSBocmVmPSIlcyNtZDU9JXMiPiVzPC9hPicgJSBtLmdyb3VwKDEsMywyKSwgcGFnZQorICAgICAgICApCisKKyAgICBkZWYgbmVlZF92ZXJzaW9uX2luZm8oc2VsZiwgdXJsKToKKyAgICAgICAgc2VsZi5zY2FuX2FsbCgKKyAgICAgICAgICAgICJQYWdlIGF0ICVzIGxpbmtzIHRvIC5weSBmaWxlKHMpIHdpdGhvdXQgdmVyc2lvbiBpbmZvOyBhbiBpbmRleCAiCisgICAgICAgICAgICAic2NhbiBpcyByZXF1aXJlZC4iLCB1cmwKKyAgICAgICAgKQorCisgICAgZGVmIHNjYW5fYWxsKHNlbGYsIG1zZz1Ob25lLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuaW5kZXhfdXJsIG5vdCBpbiBzZWxmLmZldGNoZWRfdXJsczoKKyAgICAgICAgICAgIGlmIG1zZzogc2VsZi53YXJuKG1zZywqYXJncykKKyAgICAgICAgICAgIHNlbGYud2FybigKKyAgICAgICAgICAgICAgICAiU2Nhbm5pbmcgaW5kZXggb2YgYWxsIHBhY2thZ2VzICh0aGlzIG1heSB0YWtlIGEgd2hpbGUpIgorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsKQorCisgICAgZGVmIGZpbmRfcGFja2FnZXMoc2VsZiwgcmVxdWlyZW1lbnQpOgorICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQudW5zYWZlX25hbWUrJy8nKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSk6CisgICAgICAgICAgICAjIEZhbGwgYmFjayB0byBzYWZlIHZlcnNpb24gb2YgdGhlIG5hbWUKKyAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwoc2VsZi5pbmRleF91cmwgKyByZXF1aXJlbWVudC5wcm9qZWN0X25hbWUrJy8nKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSk6CisgICAgICAgICAgICAjIFdlIGNvdWxkbid0IGZpbmQgdGhlIHRhcmdldCBwYWNrYWdlLCBzbyBzZWFyY2ggdGhlIGluZGV4IHBhZ2UgdG9vCisgICAgICAgICAgICBzZWxmLndhcm4oCisgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgaW5kZXggcGFnZSBmb3IgJXIgKG1heWJlIG1pc3NwZWxsZWQ/KSIsCisgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQudW5zYWZlX25hbWUKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuc2Nhbl9hbGwoKQorCisgICAgICAgIGZvciB1cmwgaW4gc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXksKCkpOgorICAgICAgICAgICAgIyBzY2FuIGVhY2ggcGFnZSB0aGF0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gdGhlIGRlc2lyZWQgcGFja2FnZQorICAgICAgICAgICAgc2VsZi5zY2FuX3VybCh1cmwpCisKKyAgICBkZWYgb2J0YWluKHNlbGYsIHJlcXVpcmVtZW50LCBpbnN0YWxsZXI9Tm9uZSk6CisgICAgICAgIHNlbGYucHJlc2NhbigpOyBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCisgICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxdWlyZW1lbnQua2V5XToKKyAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxdWlyZW1lbnQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKKyAgICAgICAgICAgIHNlbGYuZGVidWcoIiVzIGRvZXMgbm90IG1hdGNoICVzIiwgcmVxdWlyZW1lbnQsIGRpc3QpCisgICAgICAgIHJldHVybiBzdXBlcihQYWNrYWdlSW5kZXgsIHNlbGYpLm9idGFpbihyZXF1aXJlbWVudCxpbnN0YWxsZXIpCisKKyAgICBkZWYgY2hlY2tfbWQ1KHNlbGYsIGNzLCBpbmZvLCBmaWxlbmFtZSwgdGZwKToKKyAgICAgICAgaWYgcmUubWF0Y2goJ21kNT1bMC05YS1mXXszMn0kJywgaW5mbyk6CisgICAgICAgICAgICBzZWxmLmRlYnVnKCJWYWxpZGF0aW5nIG1kNSBjaGVja3N1bSBmb3IgJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIGNzLmhleGRpZ2VzdCgpPD5pbmZvWzQ6XToKKyAgICAgICAgICAgICAgICB0ZnAuY2xvc2UoKQorICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIk1ENSB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgIitvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSsKKyAgICAgICAgICAgICAgICAgICAgIjsgcG9zc2libGUgZG93bmxvYWQgcHJvYmxlbT8iCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGFkZF9maW5kX2xpbmtzKHNlbGYsIHVybHMpOgorICAgICAgICAiIiJBZGQgYHVybHNgIHRvIHRoZSBsaXN0IHRoYXQgd2lsbCBiZSBwcmVzY2FubmVkIGZvciBzZWFyY2hlcyIiIgorICAgICAgICBmb3IgdXJsIGluIHVybHM6CisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgc2VsZi50b19zY2FuIGlzIE5vbmUgICAgICAgICMgaWYgd2UgaGF2ZSBhbHJlYWR5ICJnb25lIG9ubGluZSIKKyAgICAgICAgICAgICAgICBvciBub3QgVVJMX1NDSEVNRSh1cmwpICAgICAgIyBvciBpdCdzIGEgbG9jYWwgZmlsZS9kaXJlY3RvcnkKKyAgICAgICAgICAgICAgICBvciB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKQorICAgICAgICAgICAgICAgIG9yIGxpc3QoZGlzdHJvc19mb3JfdXJsKHVybCkpICAgIyBvciBhIGRpcmVjdCBwYWNrYWdlIGxpbmsKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgIyB0aGVuIGdvIGFoZWFkIGFuZCBwcm9jZXNzIGl0IG5vdworICAgICAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwodXJsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgZGVmZXIgcmV0cmlldmFsIHRpbGwgbGF0ZXIKKyAgICAgICAgICAgICAgICBzZWxmLnRvX3NjYW4uYXBwZW5kKHVybCkKKworICAgIGRlZiBwcmVzY2FuKHNlbGYpOgorICAgICAgICAiIiJTY2FuIHVybHMgc2NoZWR1bGVkIGZvciBwcmVzY2FubmluZyAoZS5nLiAtLWZpbmQtbGlua3MpIiIiCisgICAgICAgIGlmIHNlbGYudG9fc2NhbjoKKyAgICAgICAgICAgIG1hcChzZWxmLnNjYW5fdXJsLCBzZWxmLnRvX3NjYW4pCisgICAgICAgIHNlbGYudG9fc2NhbiA9IE5vbmUgICAgICMgZnJvbSBub3cgb24sIGdvIGFoZWFkIGFuZCBwcm9jZXNzIGltbWVkaWF0ZWx5CisKKworCisKKworCisKKworCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgc3BlYywgdG1wZGlyKToKKyAgICAgICAgIiIiTG9jYXRlIGFuZC9vciBkb3dubG9hZCBgc3BlY2AgdG8gYHRtcGRpcmAsIHJldHVybmluZyBhIGxvY2FsIHBhdGgKKworICAgICAgICBgc3BlY2AgbWF5IGJlIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCwgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIFVSTCwKKyAgICAgICAgYW4gZXhpc3RpbmcgbG9jYWwgZmlsZW5hbWUsIG9yIGEgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWMKKyAgICAgICAgKGkuZS4gdGhlIHN0cmluZyBmb3JtIG9mIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCkuICBJZiBpdCBpcyB0aGUgVVJMCisgICAgICAgIG9mIGEgLnB5IGZpbGUgd2l0aCBhbiB1bmFtYmlndW91cyBgYCNlZ2c9bmFtZS12ZXJzaW9uYGAgdGFnIChpLmUuLCBvbmUKKyAgICAgICAgdGhhdCBlc2NhcGVzIGBgLWBgIGFzIGBgX2BgIHRocm91Z2hvdXQpLCBhIHRyaXZpYWwgYGBzZXR1cC5weWBgIGlzCisgICAgICAgIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbG9uZ3NpZGUgdGhlIGRvd25sb2FkZWQgZmlsZS4KKworICAgICAgICBJZiBgc3BlY2AgaXMgYSBgYFJlcXVpcmVtZW50YGAgb2JqZWN0IG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYQorICAgICAgICBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlYywgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbG9jYXRpb24gb2YKKyAgICAgICAgYSBtYXRjaGluZyBkaXN0cmlidXRpb24gKHBvc3NpYmx5IGFmdGVyIGRvd25sb2FkaW5nIGl0IHRvIGB0bXBkaXJgKS4KKyAgICAgICAgSWYgYHNwZWNgIGlzIGEgbG9jYWxseSBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lLCBpdCBpcyBzaW1wbHkKKyAgICAgICAgcmV0dXJuZWQgdW5jaGFuZ2VkLiAgSWYgYHNwZWNgIGlzIGEgVVJMLCBpdCBpcyBkb3dubG9hZGVkIHRvIGEgc3VicGF0aAorICAgICAgICBvZiBgdG1wZGlyYCwgYW5kIHRoZSBsb2NhbCBmaWxlbmFtZSBpcyByZXR1cm5lZC4gIFZhcmlvdXMgZXJyb3JzIG1heSBiZQorICAgICAgICByYWlzZWQgaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgZG93bmxvYWRpbmcuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLFJlcXVpcmVtZW50KToKKyAgICAgICAgICAgIHNjaGVtZSA9IFVSTF9TQ0hFTUUoc3BlYykKKyAgICAgICAgICAgIGlmIHNjaGVtZToKKyAgICAgICAgICAgICAgICAjIEl0J3MgYSB1cmwsIGRvd25sb2FkIGl0IHRvIHRtcGRpcgorICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5fZG93bmxvYWRfdXJsKHNjaGVtZS5ncm91cCgxKSwgc3BlYywgdG1wZGlyKQorICAgICAgICAgICAgICAgIGJhc2UsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybChzcGVjKQorICAgICAgICAgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoJy5weScpOgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZ2VuX3NldHVwKGZvdW5kLGZyYWdtZW50LHRtcGRpcikKKyAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CisgICAgICAgICAgICAgICAgIyBFeGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSwganVzdCByZXR1cm4gaXQKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlYworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNwZWMgPSBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgYSBVUkwsIGV4aXN0aW5nIGZpbGUsIG9yIHJlcXVpcmVtZW50IHNwZWM6ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAoc3BlYywpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5mZXRjaF9kaXN0cmlidXRpb24oc3BlYywgdG1wZGlyKSwnbG9jYXRpb24nLE5vbmUpCisKKworICAgIGRlZiBmZXRjaF9kaXN0cmlidXRpb24oc2VsZiwKKyAgICAgICAgcmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbj1GYWxzZSwgc291cmNlPUZhbHNlLCBkZXZlbG9wX29rPUZhbHNlCisgICAgKToKKyAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKKworICAgICAgICBgcmVxdWlyZW1lbnRgIG11c3QgYmUgYSBgYHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnRgYCBpbnN0YW5jZS4KKyAgICAgICAgSWYgbmVjZXNzYXJ5LCBvciBpZiB0aGUgYGZvcmNlX3NjYW5gIGZsYWcgaXMgc2V0LCB0aGUgcmVxdWlyZW1lbnQgaXMKKyAgICAgICAgc2VhcmNoZWQgZm9yIGluIHRoZSAob25saW5lKSBwYWNrYWdlIGluZGV4IGFzIHdlbGwgYXMgdGhlIGxvY2FsbHkKKyAgICAgICAgaW5zdGFsbGVkIHBhY2thZ2VzLiAgSWYgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYHJlcXVpcmVtZW50YCBpcyBmb3VuZCwKKyAgICAgICAgdGhlIHJldHVybmVkIGRpc3RyaWJ1dGlvbidzIGBgbG9jYXRpb25gYCBpcyB0aGUgdmFsdWUgeW91IHdvdWxkIGhhdmUKKyAgICAgICAgZ290dGVuIGZyb20gY2FsbGluZyB0aGUgYGBkb3dubG9hZCgpYGAgbWV0aG9kIHdpdGggdGhlIG1hdGNoaW5nCisgICAgICAgIGRpc3RyaWJ1dGlvbidzIFVSTCBvciBmaWxlbmFtZS4gIElmIG5vIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwKKyAgICAgICAgYGBOb25lYGAgaXMgcmV0dXJuZWQuCisKKyAgICAgICAgSWYgdGhlIGBzb3VyY2VgIGZsYWcgaXMgc2V0LCBvbmx5IHNvdXJjZSBkaXN0cmlidXRpb25zIGFuZCBzb3VyY2UKKyAgICAgICAgY2hlY2tvdXQgbGlua3Mgd2lsbCBiZSBjb25zaWRlcmVkLiAgVW5sZXNzIHRoZSBgZGV2ZWxvcF9va2AgZmxhZyBpcworICAgICAgICBzZXQsIGRldmVsb3BtZW50IGFuZCBzeXN0ZW0gZWdncyAoaS5lLiwgdGhvc2UgdXNpbmcgdGhlIGBgLmVnZy1pbmZvYGAKKyAgICAgICAgZm9ybWF0KSB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICIiIgorCisgICAgICAgICMgcHJvY2VzcyBhIFJlcXVpcmVtZW50CisgICAgICAgIHNlbGYuaW5mbygiU2VhcmNoaW5nIGZvciAlcyIsIHJlcXVpcmVtZW50KQorICAgICAgICBza2lwcGVkID0ge30KKworICAgICAgICBkZWYgZmluZChyZXEpOgorICAgICAgICAgICAgIyBGaW5kIGEgbWF0Y2hpbmcgZGlzdHJpYnV0aW9uOyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCisKKyAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxLmtleV06CisKKyAgICAgICAgICAgICAgICBpZiBkaXN0LnByZWNlZGVuY2U9PURFVkVMT1BfRElTVCBhbmQgbm90IGRldmVsb3Bfb2s6CisgICAgICAgICAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIHNraXBwZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oIlNraXBwaW5nIGRldmVsb3BtZW50IG9yIHN5c3RlbSBlZ2c6ICVzIixkaXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZFtkaXN0XSA9IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxIGFuZCAoZGlzdC5wcmVjZWRlbmNlPD1TT1VSQ0VfRElTVCBvciBub3Qgc291cmNlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmZvKCJCZXN0IG1hdGNoOiAlcyIsIGRpc3QpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0LmNsb25lKAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249c2VsZi5kb3dubG9hZChkaXN0LmxvY2F0aW9uLCB0bXBkaXIpCisgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICBpZiBmb3JjZV9zY2FuOgorICAgICAgICAgICAgc2VsZi5wcmVzY2FuKCkKKyAgICAgICAgICAgIHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKKworICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKKyAgICAgICAgaWYgZGlzdCBpcyBOb25lIGFuZCBzZWxmLnRvX3NjYW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnByZXNjYW4oKQorICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQpCisKKyAgICAgICAgaWYgZGlzdCBpcyBOb25lIGFuZCBub3QgZm9yY2Vfc2NhbjoKKyAgICAgICAgICAgIHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKKyAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQorCisgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYud2FybigKKyAgICAgICAgICAgICAgICAiTm8gbG9jYWwgcGFja2FnZXMgb3IgZG93bmxvYWQgbGlua3MgZm91bmQgZm9yICVzJXMiLAorICAgICAgICAgICAgICAgIChzb3VyY2UgYW5kICJhIHNvdXJjZSBkaXN0cmlidXRpb24gb2YgIiBvciAiIiksCisgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQsCisgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBkaXN0CisKKyAgICBkZWYgZmV0Y2goc2VsZiwgcmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbj1GYWxzZSwgc291cmNlPUZhbHNlKToKKyAgICAgICAgIiIiT2J0YWluIGEgZmlsZSBzdWl0YWJsZSBmb3IgZnVsZmlsbGluZyBgcmVxdWlyZW1lbnRgCisKKyAgICAgICAgREVQUkVDQVRFRDsgdXNlIHRoZSBgYGZldGNoX2Rpc3RyaWJ1dGlvbigpYGAgbWV0aG9kIG5vdyBpbnN0ZWFkLiAgRm9yCisgICAgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgYnV0IHJldHVybnMgdGhlCisgICAgICAgIGBgbG9jYXRpb25gYCBvZiB0aGUgZG93bmxvYWRlZCBkaXN0cmlidXRpb24gaW5zdGVhZCBvZiBhIGRpc3RyaWJ1dGlvbgorICAgICAgICBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICBkaXN0ID0gc2VsZi5mZXRjaF9kaXN0cmlidXRpb24ocmVxdWlyZW1lbnQsdG1wZGlyLGZvcmNlX3NjYW4sc291cmNlKQorICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGRpc3QubG9jYXRpb24KKyAgICAgICAgcmV0dXJuIE5vbmUKKworCisKKworCisKKworCisgICAgZGVmIGdlbl9zZXR1cChzZWxmLCBmaWxlbmFtZSwgZnJhZ21lbnQsIHRtcGRpcik6CisgICAgICAgIG1hdGNoID0gRUdHX0ZSQUdNRU5ULm1hdGNoKGZyYWdtZW50KTsgI2ltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQorICAgICAgICBkaXN0cyA9IG1hdGNoIGFuZCBbZCBmb3IgZCBpbgorICAgICAgICAgICAgaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKGZpbGVuYW1lLCBtYXRjaC5ncm91cCgxKSwgTm9uZSkgaWYgZC52ZXJzaW9uCisgICAgICAgIF0gb3IgW10KKworICAgICAgICBpZiBsZW4oZGlzdHMpPT0xOiAgICMgdW5hbWJpZ3VvdXMgYGAjZWdnYGAgZnJhZ21lbnQKKyAgICAgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKKworICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGZpbGUgaGFzIGJlZW4gZG93bmxvYWRlZCB0byB0aGUgdGVtcCBkaXIuCisgICAgICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpICE9IHRtcGRpcjoKKyAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBiYXNlbmFtZSkKKyAgICAgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IHNhbWVmaWxlCisgICAgICAgICAgICAgICAgaWYgbm90IHNhbWVmaWxlKGZpbGVuYW1lLCBkc3QpOgorICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIoZmlsZW5hbWUsIGRzdCkKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9ZHN0CisKKyAgICAgICAgICAgIGZpbGUgPSBvcGVuKG9zLnBhdGguam9pbih0bXBkaXIsICdzZXR1cC5weScpLCAndycpCisgICAgICAgICAgICBmaWxlLndyaXRlKAorICAgICAgICAgICAgICAgICJmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwXG4iCisgICAgICAgICAgICAgICAgInNldHVwKG5hbWU9JXIsIHZlcnNpb249JXIsIHB5X21vZHVsZXM9WyVyXSlcbiIKKyAgICAgICAgICAgICAgICAlICgKKyAgICAgICAgICAgICAgICAgICAgZGlzdHNbMF0ucHJvamVjdF9uYW1lLCBkaXN0c1swXS52ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKVswXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisKKyAgICAgICAgZWxpZiBtYXRjaDoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAorICAgICAgICAgICAgICAgICJDYW4ndCB1bmFtYmlndW91c2x5IGludGVycHJldCBwcm9qZWN0L3ZlcnNpb24gaWRlbnRpZmllciAlcjsgIgorICAgICAgICAgICAgICAgICJhbnkgZGFzaGVzIGluIHRoZSBuYW1lIG9yIHZlcnNpb24gc2hvdWxkIGJlIGVzY2FwZWQgdXNpbmcgIgorICAgICAgICAgICAgICAgICJ1bmRlcnNjb3Jlcy4gJXIiICUgKGZyYWdtZW50LGRpc3RzKQorICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgIkNhbid0IHByb2Nlc3MgcGxhaW4gLnB5IGZpbGVzIHdpdGhvdXQgYW4gJyNlZ2c9bmFtZS12ZXJzaW9uJyIKKyAgICAgICAgICAgICAgICAiIHN1ZmZpeCB0byBlbmFibGUgYXV0b21hdGljIHNldHVwIHNjcmlwdCBnZW5lcmF0aW9uLiIKKyAgICAgICAgICAgICkKKworICAgIGRsX2Jsb2Nrc2l6ZSA9IDgxOTIKKyAgICBkZWYgX2Rvd25sb2FkX3RvKHNlbGYsIHVybCwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLnVybF9vayh1cmwsVHJ1ZSkgICAjIHJhaXNlcyBlcnJvciBpZiBub3QgYWxsb3dlZAorICAgICAgICBzZWxmLmluZm8oIkRvd25sb2FkaW5nICVzIiwgdXJsKQorICAgICAgICAjIERvd25sb2FkIHRoZSBmaWxlCisgICAgICAgIGZwLCB0ZnAsIGluZm8gPSBOb25lLCBOb25lLCBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmICcjJyBpbiB1cmw6CisgICAgICAgICAgICAgICAgdXJsLCBpbmZvID0gdXJsLnNwbGl0KCcjJywgMSkKKyAgICAgICAgICAgIGZwID0gc2VsZi5vcGVuX3VybCh1cmwpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZwLCB1cmxsaWIyLkhUVFBFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBkb3dubG9hZCAlczogJXMgJXMiICUgKHVybCwgZnAuY29kZSxmcC5tc2cpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgY3MgPSBtZDUoKQorICAgICAgICAgICAgaGVhZGVycyA9IGZwLmluZm8oKQorICAgICAgICAgICAgYmxvY2tudW0gPSAwCisgICAgICAgICAgICBicyA9IHNlbGYuZGxfYmxvY2tzaXplCisgICAgICAgICAgICBzaXplID0gLTEKKyAgICAgICAgICAgIGlmICJjb250ZW50LWxlbmd0aCIgaW4gaGVhZGVyczoKKyAgICAgICAgICAgICAgICBzaXplID0gaW50KGhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pCisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKKyAgICAgICAgICAgIHRmcCA9IG9wZW4oZmlsZW5hbWUsJ3diJykKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgYmxvY2sgPSBmcC5yZWFkKGJzKQorICAgICAgICAgICAgICAgIGlmIGJsb2NrOgorICAgICAgICAgICAgICAgICAgICBjcy51cGRhdGUoYmxvY2spCisgICAgICAgICAgICAgICAgICAgIHRmcC53cml0ZShibG9jaykKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tudW0gKz0gMQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydGhvb2sodXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJzLCBzaXplKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBpbmZvOiBzZWxmLmNoZWNrX21kNShjcywgaW5mbywgZmlsZW5hbWUsIHRmcCkKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXJzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBmcDogZnAuY2xvc2UoKQorICAgICAgICAgICAgaWYgdGZwOiB0ZnAuY2xvc2UoKQorCisgICAgZGVmIHJlcG9ydGhvb2soc2VsZiwgdXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJsa3NpemUsIHNpemUpOgorICAgICAgICBwYXNzICAgICMgbm8tb3AKKworICAgIGRlZiByZXRyeV9zZl9kb3dubG9hZChzZWxmLCB1cmwsIGZpbGVuYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX3RvKHVybCwgZmlsZW5hbWUpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNjaGVtZSwgc2VydmVyLCBwYXRoLCBwYXJhbSwgcXVlcnksIGZyYWcgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpCisgICAgICAgICAgICBpZiBzZXJ2ZXIhPSdkbC5zb3VyY2Vmb3JnZS5uZXQnOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgbWlycm9yID0gZ2V0X3NmX2lwKCkKKworICAgICAgICB3aGlsZSBfc2ZfbWlycm9yczoKKyAgICAgICAgICAgIHNlbGYud2FybigiRG93bmxvYWQgZmFpbGVkOiAlcyIsIHN5cy5leGNfaW5mbygpWzFdKQorICAgICAgICAgICAgdXJsID0gdXJscGFyc2UudXJsdW5wYXJzZSgoc2NoZW1lLCBtaXJyb3IsIHBhdGgsIHBhcmFtLCAnJywgZnJhZykpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX3RvKHVybCwgZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgX3NmX21pcnJvcnMucmVtb3ZlKG1pcnJvcikgICMgZG9uJ3QgcmV0cnkgdGhlIHNhbWUgbWlycm9yCisgICAgICAgICAgICAgICAgbWlycm9yID0gZ2V0X3NmX2lwKCkKKworICAgICAgICByYWlzZSAgICMgZmFpbCBpZiBubyBtaXJyb3Igd29ya3MKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgb3Blbl91cmwoc2VsZiwgdXJsKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHVybGxpYjIudXJsb3Blbih1cmwpCisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgdjoKKyAgICAgICAgICAgIHJldHVybiB2CisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLlVSTEVycm9yLCB2OgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIkRvd25sb2FkIGVycm9yOiAlcyIgJSB2LnJlYXNvbikKKworCisgICAgZGVmIF9kb3dubG9hZF91cmwoc2VsZiwgc2NoZW1lLCB1cmwsIHRtcGRpcik6CisKKyAgICAgICAgIyBEZXRlcm1pbmUgZG93bmxvYWQgZmlsZW5hbWUKKyAgICAgICAgIworICAgICAgICBuYW1lID0gZmlsdGVyKE5vbmUsdXJscGFyc2UudXJscGFyc2UodXJsKVsyXS5zcGxpdCgnLycpKQorICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgbmFtZSA9IG5hbWVbLTFdCisgICAgICAgICAgICB3aGlsZSAnLi4nIGluIG5hbWU6CisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLi4nLCcuJykucmVwbGFjZSgnXFwnLCdfJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSAiX19kb3dubG9hZGVkX18iICAgICMgZGVmYXVsdCBpZiBVUkwgaGFzIG5vIHBhdGggY29udGVudHMKKworICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcuZWdnLnppcCcpOgorICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi00XSAgICAjIHN0cmlwIHRoZSBleHRyYSAuemlwIGJlZm9yZSBkb3dubG9hZAorCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRtcGRpcixuYW1lKQorCisgICAgICAgICMgRG93bmxvYWQgdGhlIGZpbGUKKyAgICAgICAgIworICAgICAgICBpZiBzY2hlbWU9PSdzdm4nIG9yIHNjaGVtZS5zdGFydHN3aXRoKCdzdm4rJyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfc3ZuKHVybCwgZmlsZW5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoZWFkZXJzID0gc2VsZi5yZXRyeV9zZl9kb3dubG9hZCh1cmwsIGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgJ2h0bWwnIGluIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX2h0bWwodXJsLCBoZWFkZXJzLCBmaWxlbmFtZSwgdG1wZGlyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBzY2FuX3VybChzZWxmLCB1cmwpOgorICAgICAgICBzZWxmLnByb2Nlc3NfdXJsKHVybCwgVHJ1ZSkKKworCisgICAgZGVmIF9kb3dubG9hZF9odG1sKHNlbGYsIHVybCwgaGVhZGVycywgZmlsZW5hbWUsIHRtcGRpcik6CisgICAgICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lKQorICAgICAgICBmb3IgbGluZSBpbiBmaWxlOgorICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpOgorICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGEgc3VidmVyc2lvbiBpbmRleCBwYWdlCisgICAgICAgICAgICAgICAgaWYgcmUuc2VhcmNoKHInPHRpdGxlPlJldmlzaW9uIFxkKzonLCBsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgIyBpdCdzIGEgc3VidmVyc2lvbiBpbmRleCBwYWdlOgorICAgICAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfc3ZuKHVybCwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgYnJlYWsgICAjIG5vdCBhbiBpbmRleCBwYWdlCisgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJVbmV4cGVjdGVkIEhUTUwgcGFnZSBmb3VuZCBhdCAiK3VybCkKKworICAgIGRlZiBfZG93bmxvYWRfc3ZuKHNlbGYsIHVybCwgZmlsZW5hbWUpOgorICAgICAgICB1cmwgPSB1cmwuc3BsaXQoJyMnLDEpWzBdICAgIyByZW1vdmUgYW55IGZyYWdtZW50IGZvciBzdm4ncyBzYWtlCisgICAgICAgIHNlbGYuaW5mbygiRG9pbmcgc3VidmVyc2lvbiBjaGVja291dCBmcm9tICVzIHRvICVzIiwgdXJsLCBmaWxlbmFtZSkKKyAgICAgICAgb3Muc3lzdGVtKCJzdm4gY2hlY2tvdXQgLXEgJXMgJXMiICUgKHVybCwgZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBkZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgbG9nLmRlYnVnKG1zZywgKmFyZ3MpCisKKyAgICBkZWYgaW5mbyhzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgbG9nLmluZm8obXNnLCAqYXJncykKKworICAgIGRlZiB3YXJuKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBsb2cud2Fybihtc2csICphcmdzKQorCisKKworCisKKworCisKKworCisKKworZGVmIGZpeF9zZl91cmwodXJsKToKKyAgICBzY2hlbWUsIHNlcnZlciwgcGF0aCwgcGFyYW0sIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2UudXJscGFyc2UodXJsKQorICAgIGlmIHNlcnZlciE9J3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldCc6CisgICAgICAgIHJldHVybiB1cmwKKyAgICByZXR1cm4gdXJscGFyc2UudXJsdW5wYXJzZSgKKyAgICAgICAgKHNjaGVtZSwgJ2RsLnNvdXJjZWZvcmdlLm5ldCcsICdzb3VyY2Vmb3JnZScrcGF0aCwgcGFyYW0sICcnLCBmcmFnKQorICAgICkKKworX3NmX21pcnJvcnMgPSBbXQorCitkZWYgZ2V0X3NmX2lwKCk6CisgICAgaWYgbm90IF9zZl9taXJyb3JzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBfc2ZfbWlycm9yc1s6XSA9IHNvY2tldC5nZXRob3N0YnluYW1lX2V4KCdkbC5zb3VyY2Vmb3JnZS5uZXQnKVstMV0KKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICMgRE5TLWJsMGNrMW45IGYxcjN3NGxseiBzVXgwcnMhCisgICAgICAgICAgICBfc2ZfbWlycm9yc1s6XSA9IFsnZGwuc291cmNlZm9yZ2UubmV0J10KKyAgICByZXR1cm4gcmFuZG9tLmNob2ljZShfc2ZfbWlycm9ycykKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3NhbmRib3gucHkgYi9MaWIvc2V0dXB0b29scy9zYW5kYm94LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwNjk0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9zYW5kYm94LnB5CkBAIC0wLDAgKzEsMjAzIEBACitpbXBvcnQgb3MsIHN5cywgX19idWlsdGluX18sIHRlbXBmaWxlCitfb3MgPSBzeXMubW9kdWxlc1tvcy5uYW1lXQorX29wZW4gPSBvcGVuCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCitfX2FsbF9fID0gWworICAgICJBYnN0cmFjdFNhbmRib3giLCAiRGlyZWN0b3J5U2FuZGJveCIsICJTYW5kYm94VmlvbGF0aW9uIiwgInJ1bl9zZXR1cCIsCitdCisKK2RlZiBydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBhcmdzKToKKyAgICAiIiJSdW4gYSBkaXN0dXRpbHMgc2V0dXAgc2NyaXB0LCBzYW5kYm94ZWQgaW4gaXRzIGRpcmVjdG9yeSIiIgorCisgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgc2F2ZV9hcmd2ID0gc3lzLmFyZ3ZbOl0KKyAgICBzYXZlX3BhdGggPSBzeXMucGF0aFs6XQorICAgIHNldHVwX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KSkKKyAgICB0ZW1wX2RpciA9IG9zLnBhdGguam9pbihzZXR1cF9kaXIsJ3RlbXAnKQorICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHRlbXBfZGlyKTogb3MubWFrZWRpcnModGVtcF9kaXIpCisgICAgc2F2ZV90bXAgPSB0ZW1wZmlsZS50ZW1wZGlyCisKKyAgICB0cnk6CisgICAgICAgIHRlbXBmaWxlLnRlbXBkaXIgPSB0ZW1wX2RpcgorICAgICAgICBvcy5jaGRpcihzZXR1cF9kaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5hcmd2WzpdID0gW3NldHVwX3NjcmlwdF0rbGlzdChhcmdzKQorICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNldHVwX2RpcikKKyAgICAgICAgICAgIERpcmVjdG9yeVNhbmRib3goc2V0dXBfZGlyKS5ydW4oCisgICAgICAgICAgICAgICAgbGFtYmRhOiBleGVjZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgInNldHVwLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgeydfX2ZpbGVfXyc6c2V0dXBfc2NyaXB0LCAnX19uYW1lX18nOidfX21haW5fXyd9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgdjoKKyAgICAgICAgICAgIGlmIHYuYXJncyBhbmQgdi5hcmdzWzBdOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAjIE5vcm1hbCBleGl0LCBqdXN0IHJldHVybgorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZV9wYXRoCisgICAgICAgIHN5cy5hcmd2WzpdID0gc2F2ZV9hcmd2CisgICAgICAgIHRlbXBmaWxlLnRlbXBkaXIgPSBzYXZlX3RtcAorCitjbGFzcyBBYnN0cmFjdFNhbmRib3g6CisgICAgIiIiV3JhcCAnb3MnIG1vZHVsZSBhbmQgJ29wZW4oKScgYnVpbHRpbiBmb3IgdmlydHVhbGl6aW5nIHNldHVwIHNjcmlwdHMiIiIKKworICAgIF9hY3RpdmUgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9hdHRycyA9IFsKKyAgICAgICAgICAgIG5hbWUgZm9yIG5hbWUgaW4gZGlyKF9vcykKKyAgICAgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJykgYW5kIGhhc2F0dHIoc2VsZixuYW1lKQorICAgICAgICBdCisKKyAgICBkZWYgX2NvcHkoc2VsZiwgc291cmNlKToKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5fYXR0cnM6CisgICAgICAgICAgICBzZXRhdHRyKG9zLCBuYW1lLCBnZXRhdHRyKHNvdXJjZSxuYW1lKSkKKworICAgIGRlZiBydW4oc2VsZiwgZnVuYyk6CisgICAgICAgICIiIlJ1biAnZnVuYycgdW5kZXIgb3Mgc2FuZGJveGluZyIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9jb3B5KHNlbGYpCisgICAgICAgICAgICBfX2J1aWx0aW5fXy5vcGVuID0gX19idWlsdGluX18uZmlsZSA9IHNlbGYuX29wZW4KKyAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IEZhbHNlCisgICAgICAgICAgICBfX2J1aWx0aW5fXy5vcGVuID0gX19idWlsdGluX18uZmlsZSA9IF9vcGVuCisgICAgICAgICAgICBzZWxmLl9jb3B5KF9vcykKKworCisgICAgZGVmIF9ta19kdWFsX3BhdGhfd3JhcHBlcihuYW1lKToKKyAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcyxuYW1lKQorICAgICAgICBkZWYgd3JhcChzZWxmLHNyYyxkc3QsKmFyZ3MsKiprdyk6CisgICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CisgICAgICAgICAgICAgICAgc3JjLGRzdCA9IHNlbGYuX3JlbWFwX3BhaXIobmFtZSxzcmMsZHN0LCphcmdzLCoqa3cpCisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwoc3JjLGRzdCwqYXJncywqKmt3KQorICAgICAgICByZXR1cm4gd3JhcAorCisKKyAgICBmb3IgbmFtZSBpbiBbInJlbmFtZSIsICJsaW5rIiwgInN5bWxpbmsiXToKKyAgICAgICAgaWYgaGFzYXR0cihfb3MsbmFtZSk6IGxvY2FscygpW25hbWVdID0gX21rX2R1YWxfcGF0aF93cmFwcGVyKG5hbWUpCisKKworICAgIGRlZiBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcihuYW1lLCBvcmlnaW5hbD1Ob25lKToKKyAgICAgICAgb3JpZ2luYWwgPSBvcmlnaW5hbCBvciBnZXRhdHRyKF9vcyxuYW1lKQorICAgICAgICBkZWYgd3JhcChzZWxmLHBhdGgsKmFyZ3MsKiprdyk6CisgICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3JlbWFwX2lucHV0KG5hbWUscGF0aCwqYXJncywqKmt3KQorICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKHBhdGgsKmFyZ3MsKiprdykKKyAgICAgICAgcmV0dXJuIHdyYXAKKworICAgIF9vcGVuID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIoJ2ZpbGUnLCBfb3BlbikKKyAgICBmb3IgbmFtZSBpbiBbCisgICAgICAgICJzdGF0IiwgImxpc3RkaXIiLCAiY2hkaXIiLCAib3BlbiIsICJjaG1vZCIsICJjaG93biIsICJta2RpciIsCisgICAgICAgICJyZW1vdmUiLCAidW5saW5rIiwgInJtZGlyIiwgInV0aW1lIiwgImxjaG93biIsICJjaHJvb3QiLCAibHN0YXQiLAorICAgICAgICAic3RhcnRmaWxlIiwgIm1rZmlmbyIsICJta25vZCIsICJwYXRoY29uZiIsICJhY2Nlc3MiCisgICAgXToKKyAgICAgICAgaWYgaGFzYXR0cihfb3MsbmFtZSk6IGxvY2FscygpW25hbWVdID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIobmFtZSkKKworCisgICAgZGVmIF9ta19zaW5nbGVfd2l0aF9yZXR1cm4obmFtZSk6CisgICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsbmFtZSkKKyAgICAgICAgZGVmIHdyYXAoc2VsZixwYXRoLCphcmdzLCoqa3cpOgorICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgorICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLl9yZW1hcF9pbnB1dChuYW1lLHBhdGgsKmFyZ3MsKiprdykKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVtYXBfb3V0cHV0KG5hbWUsIG9yaWdpbmFsKHBhdGgsKmFyZ3MsKiprdykpCisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwqYXJncywqKmt3KQorICAgICAgICByZXR1cm4gd3JhcAorCisgICAgZm9yIG5hbWUgaW4gWydyZWFkbGluaycsICd0ZW1wbmFtJ106CisgICAgICAgIGlmIGhhc2F0dHIoX29zLG5hbWUpOiBsb2NhbHMoKVtuYW1lXSA9IF9ta19zaW5nbGVfd2l0aF9yZXR1cm4obmFtZSkKKworICAgIGRlZiBfbWtfcXVlcnkobmFtZSk6CisgICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsbmFtZSkKKyAgICAgICAgZGVmIHdyYXAoc2VsZiwqYXJncywqKmt3KToKKyAgICAgICAgICAgIHJldHZhbCA9IG9yaWdpbmFsKCphcmdzLCoqa3cpCisgICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlbWFwX291dHB1dChuYW1lLCByZXR2YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0dmFsCisgICAgICAgIHJldHVybiB3cmFwCisKKyAgICBmb3IgbmFtZSBpbiBbJ2dldGN3ZCcsICd0bXBuYW0nXToKKyAgICAgICAgaWYgaGFzYXR0cihfb3MsbmFtZSk6IGxvY2FscygpW25hbWVdID0gX21rX3F1ZXJ5KG5hbWUpCisKKyAgICBkZWYgX3ZhbGlkYXRlX3BhdGgoc2VsZixwYXRoKToKKyAgICAgICAgIiIiQ2FsbGVkIHRvIHJlbWFwIG9yIHZhbGlkYXRlIGFueSBwYXRoLCB3aGV0aGVyIGlucHV0IG9yIG91dHB1dCIiIgorICAgICAgICByZXR1cm4gcGF0aAorCisgICAgZGVmIF9yZW1hcF9pbnB1dChzZWxmLG9wZXJhdGlvbixwYXRoLCphcmdzLCoqa3cpOgorICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggaW5wdXRzIiIiCisgICAgICAgIHJldHVybiBzZWxmLl92YWxpZGF0ZV9wYXRoKHBhdGgpCisKKyAgICBkZWYgX3JlbWFwX291dHB1dChzZWxmLG9wZXJhdGlvbixwYXRoKToKKyAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIG91dHB1dHMiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3BhdGgocGF0aCkKKworICAgIGRlZiBfcmVtYXBfcGFpcihzZWxmLG9wZXJhdGlvbixzcmMsZHN0LCphcmdzLCoqa3cpOgorICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggcGFpcnMgbGlrZSByZW5hbWUsIGxpbmssIGFuZCBzeW1saW5rIG9wZXJhdGlvbnMiIiIKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgIHNlbGYuX3JlbWFwX2lucHV0KG9wZXJhdGlvbisnLWZyb20nLHNyYywqYXJncywqKmt3KSwKKyAgICAgICAgICAgIHNlbGYuX3JlbWFwX2lucHV0KG9wZXJhdGlvbisnLXRvJyxkc3QsKmFyZ3MsKiprdykKKyAgICAgICAgKQorCisKK2NsYXNzIERpcmVjdG9yeVNhbmRib3goQWJzdHJhY3RTYW5kYm94KToKKyAgICAiIiJSZXN0cmljdCBvcGVyYXRpb25zIHRvIGEgc2luZ2xlIHN1YmRpcmVjdG9yeSAtIHBzZXVkby1jaHJvb3QiIiIKKworICAgIHdyaXRlX29wcyA9IGRpY3QuZnJvbWtleXMoWworICAgICAgICAib3BlbiIsICJjaG1vZCIsICJjaG93biIsICJta2RpciIsICJyZW1vdmUiLCAidW5saW5rIiwgInJtZGlyIiwKKyAgICAgICAgInV0aW1lIiwgImxjaG93biIsICJjaHJvb3QiLCAibWtmaWZvIiwgIm1rbm9kIiwgInRlbXBuYW0iLAorICAgIF0pCisKKyAgICBkZWYgX19pbml0X18oc2VsZixzYW5kYm94KToKKyAgICAgICAgc2VsZi5fc2FuZGJveCA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChzYW5kYm94KSkKKyAgICAgICAgc2VsZi5fcHJlZml4ID0gb3MucGF0aC5qb2luKHNlbGYuX3NhbmRib3gsJycpCisgICAgICAgIEFic3RyYWN0U2FuZGJveC5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIF92aW9sYXRpb24oc2VsZiwgb3BlcmF0aW9uLCAqYXJncywgKiprdyk6CisgICAgICAgIHJhaXNlIFNhbmRib3hWaW9sYXRpb24ob3BlcmF0aW9uLCBhcmdzLCBrdykKKworICAgIGRlZiBfb3BlbihzZWxmLCBwYXRoLCBtb2RlPSdyJywgKmFyZ3MsICoqa3cpOgorICAgICAgICBpZiBtb2RlIG5vdCBpbiAoJ3InLCAncnQnLCAncmInLCAnclUnKSBhbmQgbm90IHNlbGYuX29rKHBhdGgpOgorICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJvcGVuIiwgcGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCisgICAgICAgIHJldHVybiBfb3BlbihwYXRoLG1vZGUsKmFyZ3MsKiprdykKKworICAgIGRlZiB0bXBuYW0oc2VsZik6CisgICAgICAgIHNlbGYuX3Zpb2xhdGlvbigidG1wbmFtIikKKworICAgIGRlZiBfb2soc2VsZixwYXRoKToKKyAgICAgICAgYWN0aXZlID0gc2VsZi5fYWN0aXZlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IEZhbHNlCisgICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChwYXRoKSkKKyAgICAgICAgICAgIGlmIHJlYWxwYXRoPT1zZWxmLl9zYW5kYm94IG9yIHJlYWxwYXRoLnN0YXJ0c3dpdGgoc2VsZi5fcHJlZml4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gYWN0aXZlCisKKyAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsb3BlcmF0aW9uLHBhdGgsKmFyZ3MsKiprdyk6CisgICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKKyAgICAgICAgaWYgb3BlcmF0aW9uIGluIHNlbGYud3JpdGVfb3BzIGFuZCBub3Qgc2VsZi5fb2socGF0aCk6CisgICAgICAgICAgICBzZWxmLl92aW9sYXRpb24ob3BlcmF0aW9uLCBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpLCAqYXJncywgKiprdykKKyAgICAgICAgcmV0dXJuIHBhdGgKKworICAgIGRlZiBfcmVtYXBfcGFpcihzZWxmLG9wZXJhdGlvbixzcmMsZHN0LCphcmdzLCoqa3cpOgorICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggcGFpcnMgbGlrZSByZW5hbWUsIGxpbmssIGFuZCBzeW1saW5rIG9wZXJhdGlvbnMiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX29rKHNyYykgb3Igbm90IHNlbGYuX29rKGRzdCk6CisgICAgICAgICAgICBzZWxmLl92aW9sYXRpb24ob3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpCisgICAgICAgIHJldHVybiAoc3JjLGRzdCkKKworCitjbGFzcyBTYW5kYm94VmlvbGF0aW9uKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJBIHNldHVwIHNjcmlwdCBhdHRlbXB0ZWQgdG8gbW9kaWZ5IHRoZSBmaWxlc3lzdGVtIG91dHNpZGUgdGhlIHNhbmRib3giIiIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiIiU2FuZGJveFZpb2xhdGlvbjogJXMlciAlcworCitUaGUgcGFja2FnZSBzZXR1cCBzY3JpcHQgaGFzIGF0dGVtcHRlZCB0byBtb2RpZnkgZmlsZXMgb24geW91ciBzeXN0ZW0KK3RoYXQgYXJlIG5vdCB3aXRoaW4gdGhlIEVhc3lJbnN0YWxsIGJ1aWxkIGFyZWEsIGFuZCBoYXMgYmVlbiBhYm9ydGVkLgorCitUaGlzIHBhY2thZ2UgY2Fubm90IGJlIHNhZmVseSBpbnN0YWxsZWQgYnkgRWFzeUluc3RhbGwsIGFuZCBtYXkgbm90CitzdXBwb3J0IGFsdGVybmF0ZSBpbnN0YWxsYXRpb24gbG9jYXRpb25zIGV2ZW4gaWYgeW91IHJ1biBpdHMgc2V0dXAKK3NjcmlwdCBieSBoYW5kLiAgUGxlYXNlIGluZm9ybSB0aGUgcGFja2FnZSdzIGF1dGhvciBhbmQgdGhlIEVhc3lJbnN0YWxsCittYWludGFpbmVycyB0byBmaW5kIG91dCBpZiBhIGZpeCBvciB3b3JrYXJvdW5kIGlzIGF2YWlsYWJsZS4iIiIgJSBzZWxmLmFyZ3MKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHkgYi9MaWIvc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIxYjI3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5CkBAIC0wLDAgKzEsNzQgQEAKK2RlZiBfX2Jvb3QoKToKKyAgICBpbXBvcnQgc3lzLCBpbXAsIG9zLCBvcy5wYXRoCisgICAgUFlUSE9OUEFUSCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJykKKyAgICBpZiBQWVRIT05QQVRIIGlzIE5vbmUgb3IgKHN5cy5wbGF0Zm9ybT09J3dpbjMyJyBhbmQgbm90IFBZVEhPTlBBVEgpOgorICAgICAgICBQWVRIT05QQVRIID0gW10KKyAgICBlbHNlOgorICAgICAgICBQWVRIT05QQVRIID0gUFlUSE9OUEFUSC5zcGxpdChvcy5wYXRoc2VwKQorCisgICAgcGljID0gZ2V0YXR0cihzeXMsJ3BhdGhfaW1wb3J0ZXJfY2FjaGUnLHt9KQorICAgIHN0ZHBhdGggPSBzeXMucGF0aFtsZW4oUFlUSE9OUEFUSCk6XQorICAgIG15ZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorICAgICNwcmludCAic2VhcmNoaW5nIixzdGRwYXRoLHN5cy5wYXRoCisKKyAgICBmb3IgaXRlbSBpbiBzdGRwYXRoOgorICAgICAgICBpZiBpdGVtPT1teWRpciBvciBub3QgaXRlbToKKyAgICAgICAgICAgIGNvbnRpbnVlICAgICMgc2tpcCBpZiBjdXJyZW50IGRpci4gb24gV2luZG93cywgb3IgbXkgb3duIGRpcmVjdG9yeQorICAgICAgICBpbXBvcnRlciA9IHBpYy5nZXQoaXRlbSkKKyAgICAgICAgaWYgaW1wb3J0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZSgnc2l0ZScpCisgICAgICAgICAgICBpZiBsb2FkZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBhY3R1YWxseSByZWxvYWQgdGhlIGN1cnJlbnQgbW9kdWxlCisgICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKCdzaXRlJykKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN0cmVhbSwgcGF0aCwgZGVzY3IgPSBpbXAuZmluZF9tb2R1bGUoJ3NpdGUnLFtpdGVtXSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgc3RyZWFtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlbG9hZCB0aGUgY3VycmVudCBtb2R1bGUKKyAgICAgICAgICAgICAgICBpbXAubG9hZF9tb2R1bGUoJ3NpdGUnLHN0cmVhbSxwYXRoLGRlc2NyKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ291bGRuJ3QgZmluZCB0aGUgcmVhbCAnc2l0ZScgbW9kdWxlIikKKworICAgICNwcmludCAibG9hZGVkIiwgX19maWxlX18KKworICAgIGtub3duX3BhdGhzID0gZGljdChbKG1ha2VwYXRoKGl0ZW0pWzFdLDEpIGZvciBpdGVtIGluIHN5cy5wYXRoXSkgIyAyLjIgY29tcAorCisgICAgb2xkcG9zID0gZ2V0YXR0cihzeXMsJ19fZWdnaW5zZXJ0JywwKSAgICMgc2F2ZSBvbGQgaW5zZXJ0aW9uIHBvc2l0aW9uCisgICAgc3lzLl9fZWdnaW5zZXJ0ID0gMCAgICAgICAgICAgICAgICAgICAgICMgYW5kIHJlc2V0IHRoZSBjdXJyZW50IG9uZQorCisgICAgZm9yIGl0ZW0gaW4gUFlUSE9OUEFUSDoKKyAgICAgICAgYWRkc2l0ZWRpcihpdGVtKQorCisgICAgc3lzLl9fZWdnaW5zZXJ0ICs9IG9sZHBvcyAgICAgICAgICAgIyByZXN0b3JlIGVmZmVjdGl2ZSBvbGQgcG9zaXRpb24KKworICAgIGQsbmQgPSBtYWtlcGF0aChzdGRwYXRoWzBdKQorICAgIGluc2VydF9hdCA9IE5vbmUKKyAgICBuZXdfcGF0aCA9IFtdCisKKyAgICBmb3IgaXRlbSBpbiBzeXMucGF0aDoKKyAgICAgICAgcCxucCA9IG1ha2VwYXRoKGl0ZW0pCisKKyAgICAgICAgaWYgbnA9PW5kIGFuZCBpbnNlcnRfYXQgaXMgTm9uZToKKyAgICAgICAgICAgICMgV2UndmUgaGl0IHRoZSBmaXJzdCAnc3lzdGVtJyBwYXRoIGVudHJ5LCBzbyBhZGRlZCBlbnRyaWVzIGdvIGhlcmUKKyAgICAgICAgICAgIGluc2VydF9hdCA9IGxlbihuZXdfcGF0aCkKKworICAgICAgICBpZiBucCBpbiBrbm93bl9wYXRocyBvciBpbnNlcnRfYXQgaXMgTm9uZToKKyAgICAgICAgICAgIG5ld19wYXRoLmFwcGVuZChpdGVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBuZXcgcGF0aCBhZnRlciB0aGUgaW5zZXJ0IHBvaW50LCBiYWNrLWluc2VydCBpdAorICAgICAgICAgICAgbmV3X3BhdGguaW5zZXJ0KGluc2VydF9hdCwgaXRlbSkKKyAgICAgICAgICAgIGluc2VydF9hdCArPSAxCisKKyAgICBzeXMucGF0aFs6XSA9IG5ld19wYXRoCisKK2lmIF9fbmFtZV9fPT0nc2l0ZSc6CisgICAgX19ib290KCkKKyAgICBkZWwgX19ib290CmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy90ZXN0cy9fX2luaXRfXy5weSBiL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzY3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy90ZXN0cy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDM2NCBAQAorIiIiVGVzdHMgZm9yIHRoZSAnc2V0dXB0b29scycgcGFja2FnZSIiIgorCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0U3VpdGUsIFRlc3RDYXNlLCBtYWtlU3VpdGUsIGRlZmF1bHRUZXN0TG9hZGVyCitpbXBvcnQgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5jbWQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgoraW1wb3J0IHNldHVwdG9vbHMsIHNldHVwdG9vbHMuZGlzdAorZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBGZWF0dXJlCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBFeHRlbnNpb24KK2Zyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBleHRyYWN0X2NvbnN0YW50LCBnZXRfbW9kdWxlX2NvbnN0YW50Citmcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgZmluZF9tb2R1bGUsIFJlcXVpcmUKK2Zyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24sIExvb3NlVmVyc2lvbgorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitpbXBvcnQgc3lzLCBvcy5wYXRoCisKK2RlZiBhZGRpdGlvbmFsX3Rlc3RzKCk6CisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICByZXR1cm4gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoCisgICAgICAgICdhcGlfdGVzdHMudHh0Jywgb3B0aW9uZmxhZ3M9ZG9jdGVzdC5FTExJUFNJUywgcGFja2FnZT1fX25hbWVfXywKKyAgICApCisKKworZGVmIG1ha2VTZXR1cCgqKmFyZ3MpOgorICAgICIiIlJldHVybiBkaXN0cmlidXRpb24gZnJvbSAnc2V0dXAoKiphcmdzKScsIHdpdGhvdXQgZXhlY3V0aW5nIGNvbW1hbmRzIiIiCisKKyAgICBkaXN0dXRpbHMuY29yZS5fc2V0dXBfc3RvcF9hZnRlciA9ICJjb21tYW5kbGluZSIKKworICAgICMgRG9uJ3QgbGV0IHN5c3RlbSBjb21tYW5kIGxpbmUgbGVhayBpbnRvIHRlc3RzIQorICAgIGFyZ3Muc2V0ZGVmYXVsdCgnc2NyaXB0X2FyZ3MnLFsnaW5zdGFsbCddKQorCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc2V0dXB0b29scy5zZXR1cCgqKmFyZ3MpCisgICAgZmluYWxseToKKyAgICAgICAgZGlzdHV0aWxzLmNvcmVfc2V0dXBfc3RvcF9hZnRlciA9IE5vbmUKKworCisKKworCisKKworY2xhc3MgRGVwZW5kc1Rlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0RXh0cmFjdENvbnN0KHNlbGYpOgorCisgICAgICAgIGZyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBleHRyYWN0X2NvbnN0YW50CisKKyAgICAgICAgZGVmIGYxKCk6CisgICAgICAgICAgICBnbG9iYWwgeCx5LHoKKyAgICAgICAgICAgIHggPSAidGVzdCIKKyAgICAgICAgICAgIHkgPSB6CisKKyAgICAgICAgIyB1bnJlY29nbml6ZWQgbmFtZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dHJhY3RfY29uc3RhbnQoZjEuZnVuY19jb2RlLCdxJywgLTEpLCBOb25lKQorCisgICAgICAgICMgY29uc3RhbnQgYXNzaWduZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRyYWN0X2NvbnN0YW50KGYxLmZ1bmNfY29kZSwneCcsIC0xKSwgInRlc3QiKQorCisgICAgICAgICMgZXhwcmVzc2lvbiBhc3NpZ25lZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dHJhY3RfY29uc3RhbnQoZjEuZnVuY19jb2RlLCd5JywgLTEpLCAtMSkKKworICAgICAgICAjIHJlY29nbml6ZWQgbmFtZSwgbm90IGFzc2lnbmVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0cmFjdF9jb25zdGFudChmMS5mdW5jX2NvZGUsJ3onLCAtMSksIE5vbmUpCisKKworICAgIGRlZiB0ZXN0RmluZE1vZHVsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIGZpbmRfbW9kdWxlLCAnbm8tc3VjaC4tdGhpbmcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvciwgZmluZF9tb2R1bGUsICdzZXR1cHRvb2xzLm5vbi1leGlzdGVudCcpCisgICAgICAgIGYscCxpID0gZmluZF9tb2R1bGUoJ3NldHVwdG9vbHMudGVzdHMnKTsgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdE1vZHVsZUV4dHJhY3Qoc2VsZik6CisgICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBfX3ZlcnNpb25fXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2V0X21vZHVsZV9jb25zdGFudCgnZGlzdHV0aWxzJywnX192ZXJzaW9uX18nKSwgX192ZXJzaW9uX18KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2V0X21vZHVsZV9jb25zdGFudCgnc3lzJywndmVyc2lvbicpLCBzeXMudmVyc2lvbgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBnZXRfbW9kdWxlX2NvbnN0YW50KCdzZXR1cHRvb2xzLnRlc3RzJywnX19kb2NfXycpLF9fZG9jX18KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RSZXF1aXJlKHNlbGYpOgorCisgICAgICAgIHJlcSA9IFJlcXVpcmUoJ0Rpc3R1dGlscycsJzEuMC4zJywnZGlzdHV0aWxzJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5uYW1lLCAnRGlzdHV0aWxzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEubW9kdWxlLCAnZGlzdHV0aWxzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEucmVxdWVzdGVkX3ZlcnNpb24sICcxLjAuMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmF0dHJpYnV0ZSwgJ19fdmVyc2lvbl9fJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZnVsbF9uYW1lKCksICdEaXN0dXRpbHMtMS4wLjMnKQorCisgICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBfX3ZlcnNpb25fXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfdmVyc2lvbigpLCBfX3ZlcnNpb25fXykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcS52ZXJzaW9uX29rKCcxLjAuOScpKQorICAgICAgICBzZWxmLmZhaWxJZihyZXEudmVyc2lvbl9vaygnMC45LjEnKSkKKyAgICAgICAgc2VsZi5mYWlsSWYocmVxLnZlcnNpb25fb2soJ3Vua25vd24nKSkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVxLmlzX3ByZXNlbnQoKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcS5pc19jdXJyZW50KCkpCisKKyAgICAgICAgcmVxID0gUmVxdWlyZSgnRGlzdHV0aWxzIDMwMDAnLCcwMzAwMCcsJ2Rpc3R1dGlscycsZm9ybWF0PUxvb3NlVmVyc2lvbikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcS5pc19wcmVzZW50KCkpCisgICAgICAgIHNlbGYuZmFpbElmKHJlcS5pc19jdXJyZW50KCkpCisgICAgICAgIHNlbGYuZmFpbElmKHJlcS52ZXJzaW9uX29rKCd1bmtub3duJykpCisKKyAgICAgICAgcmVxID0gUmVxdWlyZSgnRG8td2hhdC1JLW1lYW4nLCcxLjAnLCdkLXctaS1tJykKKyAgICAgICAgc2VsZi5mYWlsSWYocmVxLmlzX3ByZXNlbnQoKSkKKyAgICAgICAgc2VsZi5mYWlsSWYocmVxLmlzX2N1cnJlbnQoKSkKKworICAgICAgICByZXEgPSBSZXF1aXJlKCdUZXN0cycsIE5vbmUsICd0ZXN0cycsIGhvbWVwYWdlPSJodHRwOi8vZXhhbXBsZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5mb3JtYXQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmF0dHJpYnV0ZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEucmVxdWVzdGVkX3ZlcnNpb24sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmZ1bGxfbmFtZSgpLCAnVGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5ob21lcGFnZSwgJ2h0dHA6Ly9leGFtcGxlLmNvbScpCisKKyAgICAgICAgcGF0aHMgPSBbb3MucGF0aC5kaXJuYW1lKHApIGZvciBwIGluIF9fcGF0aF9fXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVxLmlzX3ByZXNlbnQocGF0aHMpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVxLmlzX2N1cnJlbnQocGF0aHMpKQorCisKKworY2xhc3MgRGlzdHJvVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmUxID0gRXh0ZW5zaW9uKCdiYXIuZXh0JyxbJ2Jhci5jJ10pCisgICAgICAgIHNlbGYuZTIgPSBFeHRlbnNpb24oJ2MueScsIFsneS5jJ10pCisKKyAgICAgICAgc2VsZi5kaXN0ID0gbWFrZVNldHVwKAorICAgICAgICAgICAgcGFja2FnZXM9WydhJywgJ2EuYicsICdhLmIuYycsICdiJywgJ2MnXSwKKyAgICAgICAgICAgIHB5X21vZHVsZXM9WydiLmQnLCd4J10sCisgICAgICAgICAgICBleHRfbW9kdWxlcyA9IChzZWxmLmUxLCBzZWxmLmUyKSwKKyAgICAgICAgICAgIHBhY2thZ2VfZGlyID0ge30sCisgICAgICAgICkKKworCisgICAgZGVmIHRlc3REaXN0cm9UeXBlKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLmRpc3Qsc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbikpCisKKworICAgIGRlZiB0ZXN0RXhjbHVkZVBhY2thZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlX3BhY2thZ2UoJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5wYWNrYWdlcywgWydiJywnYyddKQorCisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlX3BhY2thZ2UoJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5wYWNrYWdlcywgWydjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LnB5X21vZHVsZXMsIFsneCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5leHRfbW9kdWxlcywgW3NlbGYuZTEsIHNlbGYuZTJdKQorCisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlX3BhY2thZ2UoJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5wYWNrYWdlcywgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LnB5X21vZHVsZXMsIFsneCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5leHRfbW9kdWxlcywgW3NlbGYuZTFdKQorCisgICAgICAgICMgdGVzdCByZW1vdmFscyBmcm9tIHVuc3BlY2lmaWVkIG9wdGlvbnMKKyAgICAgICAgbWFrZVNldHVwKCkuZXhjbHVkZV9wYWNrYWdlKCd4JykKKworCisKKworCisKKworICAgIGRlZiB0ZXN0SW5jbHVkZUV4Y2x1ZGUoc2VsZik6CisgICAgICAgICMgcmVtb3ZlIGFuIGV4dGVuc2lvbgorICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZShleHRfbW9kdWxlcz1bc2VsZi5lMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LmV4dF9tb2R1bGVzLCBbc2VsZi5lMl0pCisKKyAgICAgICAgIyBhZGQgaXQgYmFjayBpbgorICAgICAgICBzZWxmLmRpc3QuaW5jbHVkZShleHRfbW9kdWxlcz1bc2VsZi5lMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LmV4dF9tb2R1bGVzLCBbc2VsZi5lMiwgc2VsZi5lMV0pCisKKyAgICAgICAgIyBzaG91bGQgbm90IGFkZCBkdXBsaWNhdGUKKyAgICAgICAgc2VsZi5kaXN0LmluY2x1ZGUoZXh0X21vZHVsZXM9W3NlbGYuZTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5leHRfbW9kdWxlcywgW3NlbGYuZTIsIHNlbGYuZTFdKQorCisgICAgZGVmIHRlc3RFeGNsdWRlUGFja2FnZXMoc2VsZik6CisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlKHBhY2thZ2VzPVsnYycsJ2InLCdhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LnBhY2thZ2VzLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QucHlfbW9kdWxlcywgWyd4J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LmV4dF9tb2R1bGVzLCBbc2VsZi5lMV0pCisKKyAgICBkZWYgdGVzdEVtcHR5KHNlbGYpOgorICAgICAgICBkaXN0ID0gbWFrZVNldHVwKCkKKyAgICAgICAgZGlzdC5pbmNsdWRlKHBhY2thZ2VzPVsnYSddLCBweV9tb2R1bGVzPVsnYiddLCBleHRfbW9kdWxlcz1bc2VsZi5lMl0pCisgICAgICAgIGRpc3QgPSBtYWtlU2V0dXAoKQorICAgICAgICBkaXN0LmV4Y2x1ZGUocGFja2FnZXM9WydhJ10sIHB5X21vZHVsZXM9WydiJ10sIGV4dF9tb2R1bGVzPVtzZWxmLmUyXSkKKworICAgIGRlZiB0ZXN0Q29udGVudHMoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmRpc3QuaGFzX2NvbnRlbnRzX2ZvcignYScpKQorICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZV9wYWNrYWdlKCdhJykKKyAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5kaXN0Lmhhc19jb250ZW50c19mb3IoJ2EnKSkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5kaXN0Lmhhc19jb250ZW50c19mb3IoJ2InKSkKKyAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGVfcGFja2FnZSgnYicpCisgICAgICAgIHNlbGYuZmFpbElmKHNlbGYuZGlzdC5oYXNfY29udGVudHNfZm9yKCdiJykpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuZGlzdC5oYXNfY29udGVudHNfZm9yKCdjJykpCisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlX3BhY2thZ2UoJ2MnKQorICAgICAgICBzZWxmLmZhaWxJZihzZWxmLmRpc3QuaGFzX2NvbnRlbnRzX2ZvcignYycpKQorCisKKworCisgICAgZGVmIHRlc3RJbnZhbGlkSW5jbHVkZUV4Y2x1ZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCisgICAgICAgICAgICBzZWxmLmRpc3QuaW5jbHVkZSwgbm9uZXhpc3RlbnRfb3B0aW9uPSd4JworICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCisgICAgICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZSwgbm9uZXhpc3RlbnRfb3B0aW9uPSd4JworICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCisgICAgICAgICAgICBzZWxmLmRpc3QuaW5jbHVkZSwgcGFja2FnZXM9eyd4JzoneSd9CisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwKKyAgICAgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlLCBwYWNrYWdlcz17J3gnOid5J30KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLAorICAgICAgICAgICAgc2VsZi5kaXN0LmluY2x1ZGUsIGV4dF9tb2R1bGVzPXsneCc6J3knfQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCisgICAgICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZSwgZXh0X21vZHVsZXM9eyd4JzoneSd9CisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLAorICAgICAgICAgICAgc2VsZi5kaXN0LmluY2x1ZGUsIHBhY2thZ2VfZGlyPVsncSddCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwKKyAgICAgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlLCBwYWNrYWdlX2Rpcj1bJ3EnXQorICAgICAgICApCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBGZWF0dXJlVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnJlcSA9IFJlcXVpcmUoJ0Rpc3R1dGlscycsJzEuMC4zJywnZGlzdHV0aWxzJykKKyAgICAgICAgc2VsZi5kaXN0ID0gbWFrZVNldHVwKAorICAgICAgICAgICAgZmVhdHVyZXM9eworICAgICAgICAgICAgICAgICdmb28nOiBGZWF0dXJlKCJmb28iLHN0YW5kYXJkPVRydWUscmVxdWlyZV9mZWF0dXJlcz1bJ2Jheicsc2VsZi5yZXFdKSwKKyAgICAgICAgICAgICAgICAnYmFyJzogRmVhdHVyZSgiYmFyIiwgIHN0YW5kYXJkPVRydWUsIHBhY2thZ2VzPVsncGtnLmJhciddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X21vZHVsZXM9WydiYXJfZXQnXSwgcmVtb3ZlPVsnYmFyLmV4dCddLAorICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICdiYXonOiBGZWF0dXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgImJheiIsIG9wdGlvbmFsPUZhbHNlLCBwYWNrYWdlcz1bJ3BrZy5iYXonXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMgPSBbJ3NjcmlwdHMvYmF6X2l0J10sCisgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9WygnbGliZm9vJywnZm9vL2Zvb2Zvby5jJyldCisgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgJ2R3aW0nOiBGZWF0dXJlKCJEV0lNIiwgYXZhaWxhYmxlPUZhbHNlLCByZW1vdmU9J2JhemlzaCcpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHNjcmlwdF9hcmdzPVsnLS13aXRob3V0LWJhcicsICdpbnN0YWxsJ10sCisgICAgICAgICAgICBwYWNrYWdlcyA9IFsncGtnLmJhcicsICdwa2cuZm9vJ10sCisgICAgICAgICAgICBweV9tb2R1bGVzID0gWydiYXJfZXQnLCAnYmF6aXNoJ10sCisgICAgICAgICAgICBleHRfbW9kdWxlcyA9IFtFeHRlbnNpb24oJ2Jhci5leHQnLFsnYmFyLmMnXSldCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0RGVmYXVsdHMoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbElmKAorICAgICAgICAgICAgRmVhdHVyZSgKKyAgICAgICAgICAgICAgICAidGVzdCIsc3RhbmRhcmQ9VHJ1ZSxyZW1vdmU9J3gnLGF2YWlsYWJsZT1GYWxzZQorICAgICAgICAgICAgKS5pbmNsdWRlX2J5X2RlZmF1bHQoKQorICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgIEZlYXR1cmUoInRlc3QiLHN0YW5kYXJkPVRydWUscmVtb3ZlPSd4JykuaW5jbHVkZV9ieV9kZWZhdWx0KCkKKyAgICAgICAgKQorICAgICAgICAjIEZlYXR1cmUgbXVzdCBoYXZlIGVpdGhlciBrd2FyZ3MsIHJlbW92ZXMsIG9yIHJlcXVpcmVfZmVhdHVyZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgRmVhdHVyZSwgInRlc3QiKQorCisgICAgZGVmIHRlc3RBdmFpbGFiaWxpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwKKyAgICAgICAgICAgIHNlbGYuZGlzdC5mZWF0dXJlc1snZHdpbSddLmluY2x1ZGVfaW4sIHNlbGYuZGlzdAorICAgICAgICApCisKKyAgICBkZWYgdGVzdEZlYXR1cmVPcHRpb25zKHNlbGYpOgorICAgICAgICBkaXN0ID0gc2VsZi5kaXN0CisgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgICgnd2l0aC1kd2ltJyxOb25lLCdpbmNsdWRlIERXSU0nKSBpbiBkaXN0LmZlYXR1cmVfb3B0aW9ucworICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgICgnd2l0aG91dC1kd2ltJyxOb25lLCdleGNsdWRlIERXSU0gKGRlZmF1bHQpJykgaW4gZGlzdC5mZWF0dXJlX29wdGlvbnMKKyAgICAgICAgKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoCisgICAgICAgICAgICAoJ3dpdGgtYmFyJyxOb25lLCdpbmNsdWRlIGJhciAoZGVmYXVsdCknKSBpbiBkaXN0LmZlYXR1cmVfb3B0aW9ucworICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgICgnd2l0aG91dC1iYXInLE5vbmUsJ2V4Y2x1ZGUgYmFyJykgaW4gZGlzdC5mZWF0dXJlX29wdGlvbnMKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZmVhdHVyZV9uZWdvcHRbJ3dpdGhvdXQtZm9vJ10sJ3dpdGgtZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LmZlYXR1cmVfbmVnb3B0Wyd3aXRob3V0LWJhciddLCd3aXRoLWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5mZWF0dXJlX25lZ29wdFsnd2l0aG91dC1kd2ltJ10sJ3dpdGgtZHdpbScpCisgICAgICAgIHNlbGYuZmFpbElmKCd3aXRob3V0LWJheicgaW4gZGlzdC5mZWF0dXJlX25lZ29wdCkKKworICAgIGRlZiB0ZXN0VXNlRmVhdHVyZXMoc2VsZik6CisgICAgICAgIGRpc3QgPSBzZWxmLmRpc3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LndpdGhfZm9vLDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC53aXRoX2JhciwwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3Qud2l0aF9iYXosMSkKKyAgICAgICAgc2VsZi5mYWlsSWYoJ2Jhcl9ldCcgaW4gZGlzdC5weV9tb2R1bGVzKQorICAgICAgICBzZWxmLmZhaWxJZigncGtnLmJhcicgaW4gZGlzdC5wYWNrYWdlcykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdwa2cuYmF6JyBpbiBkaXN0LnBhY2thZ2VzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ3NjcmlwdHMvYmF6X2l0JyBpbiBkaXN0LnNjcmlwdHMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygoJ2xpYmZvbycsJ2Zvby9mb29mb28uYycpIGluIGRpc3QubGlicmFyaWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZXh0X21vZHVsZXMsW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5yZXF1aXJlX2ZlYXR1cmVzLCBbc2VsZi5yZXFdKQorCisgICAgICAgICMgSWYgd2UgYXNrIGZvciBiYXIsIGl0IHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgZXhwbGljaXRseSBkaXNhYmxlZAorICAgICAgICAjIGl0IG9uIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGRpc3QuaW5jbHVkZV9mZWF0dXJlLCAnYmFyJykKKworICAgIGRlZiB0ZXN0RmVhdHVyZVdpdGhJbnZhbGlkUmVtb3ZlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFN5c3RlbUV4aXQsIG1ha2VTZXR1cCwgZmVhdHVyZXMgPSB7J3gnOkZlYXR1cmUoJ3gnLCByZW1vdmU9J3knKX0KKyAgICAgICAgKQorCitjbGFzcyBUZXN0Q29tbWFuZFRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0VGVzdElzQ29tbWFuZChzZWxmKToKKyAgICAgICAgdGVzdF9jbWQgPSBtYWtlU2V0dXAoKS5nZXRfY29tbWFuZF9vYmooJ3Rlc3QnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZSh0ZXN0X2NtZCwgZGlzdHV0aWxzLmNtZC5Db21tYW5kKSkKKworICAgIGRlZiB0ZXN0TG9uZ09wdFN1aXRlV05vRGVmYXVsdChzZWxmKToKKyAgICAgICAgdHMxID0gbWFrZVNldHVwKHNjcmlwdF9hcmdzPVsndGVzdCcsJy0tdGVzdC1zdWl0ZT1mb28udGVzdHMuc3VpdGUnXSkKKyAgICAgICAgdHMxID0gdHMxLmdldF9jb21tYW5kX29iaigndGVzdCcpCisgICAgICAgIHRzMS5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0czEudGVzdF9zdWl0ZSwgJ2Zvby50ZXN0cy5zdWl0ZScpCisKKyAgICBkZWYgdGVzdERlZmF1bHRTdWl0ZShzZWxmKToKKyAgICAgICAgdHMyID0gbWFrZVNldHVwKHRlc3Rfc3VpdGU9J2Jhci50ZXN0cy5zdWl0ZScpLmdldF9jb21tYW5kX29iaigndGVzdCcpCisgICAgICAgIHRzMi5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0czIudGVzdF9zdWl0ZSwgJ2Jhci50ZXN0cy5zdWl0ZScpCisKKyAgICBkZWYgdGVzdERlZmF1bHRXTW9kdWxlT25DbWRMaW5lKHNlbGYpOgorICAgICAgICB0czMgPSBtYWtlU2V0dXAoCisgICAgICAgICAgICB0ZXN0X3N1aXRlPSdiYXIudGVzdHMnLAorICAgICAgICAgICAgc2NyaXB0X2FyZ3M9Wyd0ZXN0JywnLW0nLCdmb28udGVzdHMnXQorICAgICAgICApLmdldF9jb21tYW5kX29iaigndGVzdCcpCisgICAgICAgIHRzMy5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0czMudGVzdF9tb2R1bGUsICdmb28udGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzMy50ZXN0X3N1aXRlLCAgJ2Zvby50ZXN0cy50ZXN0X3N1aXRlJykKKworICAgIGRlZiB0ZXN0Q29uZmxpY3RpbmdPcHRpb25zKHNlbGYpOgorICAgICAgICB0czQgPSBtYWtlU2V0dXAoCisgICAgICAgICAgICBzY3JpcHRfYXJncz1bJ3Rlc3QnLCctbScsJ2Jhci50ZXN0cycsICctcycsJ2Zvby50ZXN0cy5zdWl0ZSddCisgICAgICAgICkuZ2V0X2NvbW1hbmRfb2JqKCd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIHRzNC5lbnN1cmVfZmluYWxpemVkKQorCisgICAgZGVmIHRlc3ROb1N1aXRlKHNlbGYpOgorICAgICAgICB0czUgPSBtYWtlU2V0dXAoKS5nZXRfY29tbWFuZF9vYmooJ3Rlc3QnKQorICAgICAgICB0czUuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHM1LnRlc3Rfc3VpdGUsIE5vbmUpCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy90ZXN0cy9hcGlfdGVzdHMudHh0IGIvTGliL3NldHVwdG9vbHMvdGVzdHMvYXBpX3Rlc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MzVhZDhkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvdGVzdHMvYXBpX3Rlc3RzLnR4dApAQCAtMCwwICsxLDMzMCBAQAorUGx1Z2dhYmxlIERpc3RyaWJ1dGlvbnMgb2YgUHl0aG9uIFNvZnR3YXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRGlzdHJpYnV0aW9ucworLS0tLS0tLS0tLS0tLQorCitBICJEaXN0cmlidXRpb24iIGlzIGEgY29sbGVjdGlvbiBvZiBmaWxlcyB0aGF0IHJlcHJlc2VudCBhICJSZWxlYXNlIiBvZiBhCisiUHJvamVjdCIgYXMgb2YgYSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUsIGRlbm90ZWQgYnkgYQorIlZlcnNpb24iOjoKKworICAgID4+PiBpbXBvcnQgc3lzLCBwa2dfcmVzb3VyY2VzCisgICAgPj4+IGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uCisgICAgPj4+IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsIHZlcnNpb249IjEuMiIpCisgICAgRm9vIDEuMgorCitEaXN0cmlidXRpb25zIGhhdmUgYSBsb2NhdGlvbiwgd2hpY2ggY2FuIGJlIGEgZmlsZW5hbWUsIFVSTCwgb3IgcmVhbGx5IGFueXRoaW5nCitlbHNlIHlvdSBjYXJlIHRvIHVzZTo6CisKKyAgICA+Pj4gZGlzdCA9IERpc3RyaWJ1dGlvbigKKyAgICAuLi4gICAgIGxvY2F0aW9uPSJodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nIiwKKyAgICAuLi4gICAgIHByb2plY3RfbmFtZT0iQmFyIiwgdmVyc2lvbj0iMC45IgorICAgIC4uLiApCisKKyAgICA+Pj4gZGlzdAorICAgIEJhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpCisKKworRGlzdHJpYnV0aW9ucyBoYXZlIHZhcmlvdXMgaW50cm9zcGVjdGFibGUgYXR0cmlidXRlczo6CisKKyAgICA+Pj4gZGlzdC5sb2NhdGlvbgorICAgICdodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nJworCisgICAgPj4+IGRpc3QucHJvamVjdF9uYW1lCisgICAgJ0JhcicKKworICAgID4+PiBkaXN0LnZlcnNpb24KKyAgICAnMC45JworCisgICAgPj4+IGRpc3QucHlfdmVyc2lvbiA9PSBzeXMudmVyc2lvbls6M10KKyAgICBUcnVlCisKKyAgICA+Pj4gcHJpbnQgZGlzdC5wbGF0Zm9ybQorICAgIE5vbmUKKworSW5jbHVkaW5nIHZhcmlvdXMgY29tcHV0ZWQgYXR0cmlidXRlczo6CisKKyAgICA+Pj4gZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBwYXJzZV92ZXJzaW9uCisgICAgPj4+IGRpc3QucGFyc2VkX3ZlcnNpb24gPT0gcGFyc2VfdmVyc2lvbihkaXN0LnZlcnNpb24pCisgICAgVHJ1ZQorCisgICAgPj4+IGRpc3Qua2V5ICAgICMgY2FzZS1pbnNlbnNpdGl2ZSBmb3JtIG9mIHRoZSBwcm9qZWN0IG5hbWUKKyAgICAnYmFyJworCitEaXN0cmlidXRpb25zIGFyZSBjb21wYXJlZCAoYW5kIGhhc2hlZCkgYnkgdmVyc2lvbiBmaXJzdDo6CisKKyAgICA+Pj4gRGlzdHJpYnV0aW9uKHZlcnNpb249JzEuMCcpID09IERpc3RyaWJ1dGlvbih2ZXJzaW9uPScxLjAnKQorICAgIFRydWUKKyAgICA+Pj4gRGlzdHJpYnV0aW9uKHZlcnNpb249JzEuMCcpID09IERpc3RyaWJ1dGlvbih2ZXJzaW9uPScxLjEnKQorICAgIEZhbHNlCisgICAgPj4+IERpc3RyaWJ1dGlvbih2ZXJzaW9uPScxLjAnKSA8ICBEaXN0cmlidXRpb24odmVyc2lvbj0nMS4xJykKKyAgICBUcnVlCisKK2J1dCBhbHNvIGJ5IHByb2plY3QgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZSksIHBsYXRmb3JtLCBQeXRob24gdmVyc2lvbiwKK2xvY2F0aW9uLCBldGMuOjoKKworICAgID4+PiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iRm9vIix2ZXJzaW9uPSIxLjAiKQorICAgIFRydWUKKworICAgID4+PiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iZm9vIix2ZXJzaW9uPSIxLjAiKQorICAgIFRydWUKKworICAgID4+PiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iRm9vIix2ZXJzaW9uPSIxLjEiKQorICAgIEZhbHNlCisKKyAgICA+Pj4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iRm9vIixweV92ZXJzaW9uPSIyLjMiLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iRm9vIixweV92ZXJzaW9uPSIyLjQiLHZlcnNpb249IjEuMCIpCisgICAgRmFsc2UKKworICAgID4+PiBEaXN0cmlidXRpb24obG9jYXRpb249InNwYW0iLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKGxvY2F0aW9uPSJzcGFtIix2ZXJzaW9uPSIxLjAiKQorICAgIFRydWUKKworICAgID4+PiBEaXN0cmlidXRpb24obG9jYXRpb249InNwYW0iLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKGxvY2F0aW9uPSJiYXoiLHZlcnNpb249IjEuMCIpCisgICAgRmFsc2UKKworCisKK0hhc2ggYW5kIGNvbXBhcmUgZGlzdHJpYnV0aW9uIGJ5IHByaW8vcGxhdAorCitHZXQgdmVyc2lvbiBmcm9tIG1ldGFkYXRhCitwcm92aWRlciBjYXBhYmlsaXRpZXMKK2VnZ19uYW1lKCkKK2FzX3JlcXVpcmVtZW50KCkKK2Zyb21fbG9jYXRpb24sIGZyb21fZmlsZW5hbWUgKHcvcGF0aCBub3JtYWxpemF0aW9uKQorCitSZWxlYXNlcyBtYXkgaGF2ZSB6ZXJvIG9yIG1vcmUgIlJlcXVpcmVtZW50cyIsIHdoaWNoIGluZGljYXRlCit3aGF0IHJlbGVhc2VzIG9mIGFub3RoZXIgcHJvamVjdCB0aGUgcmVsZWFzZSByZXF1aXJlcyBpbiBvcmRlciB0bworZnVuY3Rpb24uICBBIFJlcXVpcmVtZW50IG5hbWVzIHRoZSBvdGhlciBwcm9qZWN0LCBleHByZXNzZXMgc29tZSBjcml0ZXJpYQorYXMgdG8gd2hhdCByZWxlYXNlcyBvZiB0aGF0IHByb2plY3QgYXJlIGFjY2VwdGFibGUsIGFuZCBsaXN0cyBhbnkgIkV4dHJhcyIKK3RoYXQgdGhlIHJlcXVpcmluZyByZWxlYXNlIG1heSBuZWVkIGZyb20gdGhhdCBwcm9qZWN0LiAgKEFuIEV4dHJhIGlzIGFuCitvcHRpb25hbCBmZWF0dXJlIG9mIGEgUmVsZWFzZSwgdGhhdCBjYW4gb25seSBiZSB1c2VkIGlmIGl0cyBhZGRpdGlvbmFsCitSZXF1aXJlbWVudHMgYXJlIHNhdGlzZmllZC4pCisKKworCitUaGUgV29ya2luZyBTZXQKKy0tLS0tLS0tLS0tLS0tLQorCitBIGNvbGxlY3Rpb24gb2YgYWN0aXZlIGRpc3RyaWJ1dGlvbnMgaXMgY2FsbGVkIGEgV29ya2luZyBTZXQuICBOb3RlIHRoYXQgYQorV29ya2luZyBTZXQgY2FuIGNvbnRhaW4gYW55IGltcG9ydGFibGUgZGlzdHJpYnV0aW9uLCBub3QganVzdCBwbHVnZ2FibGUgb25lcy4KK0ZvciBleGFtcGxlLCB0aGUgUHl0aG9uIHN0YW5kYXJkIGxpYnJhcnkgaXMgYW4gaW1wb3J0YWJsZSBkaXN0cmlidXRpb24gdGhhdAord2lsbCB1c3VhbGx5IGJlIHBhcnQgb2YgdGhlIFdvcmtpbmcgU2V0LCBldmVuIHRob3VnaCBpdCBpcyBub3QgcGx1Z2dhYmxlLgorU2ltaWxhcmx5LCB3aGVuIHlvdSBhcmUgZG9pbmcgZGV2ZWxvcG1lbnQgd29yayBvbiBhIHByb2plY3QsIHRoZSBmaWxlcyB5b3UgYXJlCitlZGl0aW5nIGFyZSBhbHNvIGEgRGlzdHJpYnV0aW9uLiAgKEFuZCwgd2l0aCBhIGxpdHRsZSBhdHRlbnRpb24gdG8gdGhlCitkaXJlY3RvcnkgbmFtZXMgdXNlZCwgIGFuZCBpbmNsdWRpbmcgc29tZSBhZGRpdGlvbmFsIG1ldGFkYXRhLCBzdWNoIGEKKyJkZXZlbG9wbWVudCBkaXN0cmlidXRpb24iIGNhbiBiZSBtYWRlIHBsdWdnYWJsZSBhcyB3ZWxsLikKKworICAgID4+PiBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IFdvcmtpbmdTZXQKKworQSB3b3JraW5nIHNldCdzIGVudHJpZXMgYXJlIHRoZSBzeXMucGF0aCBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgYWN0aXZlCitkaXN0cmlidXRpb25zLiAgQnkgZGVmYXVsdCwgdGhlIHdvcmtpbmcgc2V0J3MgZW50cmllcyBhcmUgdGhlIGl0ZW1zIG9uCitgYHN5cy5wYXRoYGA6OgorCisgICAgPj4+IHdzID0gV29ya2luZ1NldCgpCisgICAgPj4+IHdzLmVudHJpZXMgPT0gc3lzLnBhdGgKKyAgICBUcnVlCisKK0J1dCB5b3UgY2FuIGFsc28gY3JlYXRlIGFuIGVtcHR5IHdvcmtpbmcgc2V0IGV4cGxpY2l0bHksIGFuZCBhZGQgZGlzdHJpYnV0aW9ucwordG8gaXQ6OgorCisgICAgPj4+IHdzID0gV29ya2luZ1NldChbXSkKKyAgICA+Pj4gd3MuYWRkKGRpc3QpCisgICAgPj4+IHdzLmVudHJpZXMKKyAgICBbJ2h0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcnXQorICAgID4+PiBkaXN0IGluIHdzCisgICAgVHJ1ZQorICAgID4+PiBEaXN0cmlidXRpb24oJ2ZvbycsdmVyc2lvbj0iIikgaW4gd3MKKyAgICBGYWxzZQorCitBbmQgeW91IGNhbiBpdGVyYXRlIG92ZXIgaXRzIGRpc3RyaWJ1dGlvbnM6OgorCisgICAgPj4+IGxpc3Qod3MpCisgICAgW0JhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpXQorCitBZGRpbmcgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3A6OgorCisgICAgPj4+IHdzLmFkZChkaXN0KQorICAgID4+PiBsaXN0KHdzKQorICAgIFtCYXIgMC45IChodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nKV0KKworRm9yIHRoYXQgbWF0dGVyLCBhZGRpbmcgbXVsdGlwbGUgZGlzdHJpYnV0aW9ucyBmb3IgdGhlIHNhbWUgcHJvamVjdCBhbHNvIGRvZXMKK25vdGhpbmcsIGJlY2F1c2UgYSB3b3JraW5nIHNldCBjYW4gb25seSBob2xkIG9uZSBhY3RpdmUgZGlzdHJpYnV0aW9uIHBlcgorcHJvamVjdCAtLSB0aGUgZmlyc3Qgb25lIGFkZGVkIHRvIGl0OjoKKworICAgID4+PiB3cy5hZGQoCisgICAgLi4uICAgICBEaXN0cmlidXRpb24oCisgICAgLi4uICAgICAgICAgJ2h0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcnLCBwcm9qZWN0X25hbWU9IkJhciIsCisgICAgLi4uICAgICAgICAgdmVyc2lvbj0iNy4yIgorICAgIC4uLiAgICAgKQorICAgIC4uLiApCisgICAgPj4+IGxpc3Qod3MpCisgICAgW0JhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpXQorCitZb3UgY2FuIGFwcGVuZCBhIHBhdGggZW50cnkgdG8gYSB3b3JraW5nIHNldCB1c2luZyBgYGFkZF9lbnRyeSgpYGA6OgorCisgICAgPj4+IHdzLmVudHJpZXMKKyAgICBbJ2h0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcnXQorICAgID4+PiB3cy5hZGRfZW50cnkocGtnX3Jlc291cmNlcy5fX2ZpbGVfXykKKyAgICA+Pj4gd3MuZW50cmllcworICAgIFsnaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZycsICcuLi5wa2dfcmVzb3VyY2VzLnB5Li4uJ10KKworTXVsdGlwbGUgYWRkaXRpb25zIHJlc3VsdCBpbiBtdWx0aXBsZSBlbnRyaWVzLCBldmVuIGlmIHRoZSBlbnRyeSBpcyBhbHJlYWR5IGluCit0aGUgd29ya2luZyBzZXQgKGJlY2F1c2UgYGBzeXMucGF0aGBgIGNhbiBjb250YWluIHRoZSBzYW1lIGVudHJ5IG1vcmUgdGhhbgorb25jZSk6OgorCisgICAgPj4+IHdzLmFkZF9lbnRyeShwa2dfcmVzb3VyY2VzLl9fZmlsZV9fKQorICAgID4+PiB3cy5lbnRyaWVzCisgICAgWycuLi5leGFtcGxlLmNvbS4uLicsICcuLi5wa2dfcmVzb3VyY2VzLi4uJywgJy4uLnBrZ19yZXNvdXJjZXMuLi4nXQorCitBbmQgeW91IGNhbiBzcGVjaWZ5IHRoZSBwYXRoIGVudHJ5IGEgZGlzdHJpYnV0aW9uIHdhcyBmb3VuZCB1bmRlciwgdXNpbmcgdGhlCitvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyIHRvIGBgYWRkKClgYDo6CisKKyAgICA+Pj4gd3MgPSBXb3JraW5nU2V0KFtdKQorICAgID4+PiB3cy5hZGQoZGlzdCwiZm9vIikKKyAgICA+Pj4gd3MuZW50cmllcworICAgIFsnZm9vJ10KKworQnV0IGV2ZW4gaWYgYSBkaXN0cmlidXRpb24gaXMgZm91bmQgdW5kZXIgbXVsdGlwbGUgcGF0aCBlbnRyaWVzLCBpdCBzdGlsbCBvbmx5CitzaG93cyB1cCBvbmNlIHdoZW4gaXRlcmF0aW5nIHRoZSB3b3JraW5nIHNldDoKKworICAgID4+PiB3cy5hZGRfZW50cnkod3MuZW50cmllc1swXSkKKyAgICA+Pj4gbGlzdCh3cykKKyAgICBbQmFyIDAuOSAoaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyldCisKK1lvdSBjYW4gYXNrIGEgV29ya2luZ1NldCB0byBgYGZpbmQoKWBgIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGEgcmVxdWlyZW1lbnQ6OgorCisgICAgPj4+IGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgUmVxdWlyZW1lbnQKKyAgICA+Pj4gcHJpbnQgd3MuZmluZChSZXF1aXJlbWVudC5wYXJzZSgiRm9vPT0xLjAiKSkgICAgIyBubyBtYXRjaCwgcmV0dXJuIE5vbmUKKyAgICBOb25lCisKKyAgICA+Pj4gd3MuZmluZChSZXF1aXJlbWVudC5wYXJzZSgiQmFyPT0wLjkiKSkgICMgbWF0Y2gsIHJldHVybiBkaXN0cmlidXRpb24KKyAgICBCYXIgMC45IChodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nKQorCitOb3RlIHRoYXQgYXNraW5nIGZvciBhIGNvbmZsaWN0aW5nIHZlcnNpb24gb2YgYSBkaXN0cmlidXRpb24gYWxyZWFkeSBpbiBhCit3b3JraW5nIHNldCB0cmlnZ2VycyBhIGBgcGtnX3Jlc291cmNlcy5WZXJzaW9uQ29uZmxpY3RgYCBlcnJvcjoKKworICAgID4+PiB3cy5maW5kKFJlcXVpcmVtZW50LnBhcnNlKCJCYXI9PTEuMCIpKSAjIGRvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFZlcnNpb25Db25mbGljdDogKEJhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpLAorICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50LnBhcnNlKCdCYXI9PTEuMCcpKQorCitZb3UgY2FuIHN1YnNjcmliZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuZXZlciBhIG5ldworZGlzdHJpYnV0aW9uIGlzIGFkZGVkIHRvIGEgd29ya2luZyBzZXQuICBUaGUgY2FsbGJhY2sgaXMgaW1tZWRpYXRlbHkgaW52b2tlZAorb25jZSBmb3IgZWFjaCBleGlzdGluZyBkaXN0cmlidXRpb24gaW4gdGhlIHdvcmtpbmcgc2V0LCBhbmQgdGhlbiBpcyBjYWxsZWQKK2FnYWluIGZvciBuZXcgZGlzdHJpYnV0aW9ucyBhZGRlZCB0aGVyZWFmdGVyOjoKKworICAgID4+PiBkZWYgYWRkZWQoZGlzdCk6IHByaW50ICJBZGRlZCIsIGRpc3QKKyAgICA+Pj4gd3Muc3Vic2NyaWJlKGFkZGVkKQorICAgIEFkZGVkIEJhciAwLjkKKyAgICA+Pj4gZm9vMTIgPSBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLCB2ZXJzaW9uPSIxLjIiLCBsb2NhdGlvbj0iZjEyIikgCisgICAgPj4+IHdzLmFkZChmb28xMikKKyAgICBBZGRlZCBGb28gMS4yCisKK05vdGUsIGhvd2V2ZXIsIHRoYXQgb25seSB0aGUgZmlyc3QgZGlzdHJpYnV0aW9uIGFkZGVkIGZvciBhIGdpdmVuIHByb2plY3QgbmFtZQord2lsbCB0cmlnZ2VyIGEgY2FsbGJhY2ssIGV2ZW4gZHVyaW5nIHRoZSBpbml0aWFsIGBgc3Vic2NyaWJlKClgYCBjYWxsYmFjazo6CisKKyAgICA+Pj4gZm9vMTQgPSBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLCB2ZXJzaW9uPSIxLjQiLCBsb2NhdGlvbj0iZjE0IikgCisgICAgPj4+IHdzLmFkZChmb28xNCkgICAjIG5vIGNhbGxiYWNrLCBiZWNhdXNlIEZvbyAxLjIgaXMgYWxyZWFkeSBhY3RpdmUKKworICAgID4+PiB3cyA9IFdvcmtpbmdTZXQoW10pCisgICAgPj4+IHdzLmFkZChmb28xMikKKyAgICA+Pj4gd3MuYWRkKGZvbzE0KQorICAgID4+PiB3cy5zdWJzY3JpYmUoYWRkZWQpCisgICAgQWRkZWQgRm9vIDEuMgorICAgIAorQW5kIGFkZGluZyBhIGNhbGxiYWNrIG1vcmUgdGhhbiBvbmNlIGhhcyBubyBlZmZlY3QsIGVpdGhlcjo6CisKKyAgICA+Pj4gd3Muc3Vic2NyaWJlKGFkZGVkKSAgICAgIyBubyBjYWxsYmFja3MKKworICAgICMgYW5kIG5vIGRvdWJsZS1jYWxsYmFja3Mgb24gc3Vic2VxdWVudCBhZGRpdGlvbnMsIGVpdGhlcgorICAgID4+PiBqdXN0X2FfdGVzdCA9IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9Ikp1c3RBVGVzdCIsIHZlcnNpb249IjAuOTkiKQorICAgID4+PiB3cy5hZGQoanVzdF9hX3Rlc3QpCisgICAgQWRkZWQgSnVzdEFUZXN0IDAuOTkKKworCitGaW5kaW5nIFBsdWdpbnMKKy0tLS0tLS0tLS0tLS0tLQorCitgYFdvcmtpbmdTZXRgYCBvYmplY3RzIGNhbiBiZSB1c2VkIHRvIGZpZ3VyZSBvdXQgd2hhdCBwbHVnaW5zIGluIGFuCitgYEVudmlyb25tZW50YGAgY2FuIGJlIGxvYWRlZCB3aXRob3V0IGFueSByZXNvbHV0aW9uIGVycm9yczo6CisKKyAgICA+Pj4gZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBFbnZpcm9ubWVudAorCisgICAgPj4+IHBsdWdpbnMgPSBFbnZpcm9ubWVudChbXSkgICAjIG5vcm1hbGx5LCBhIGxpc3Qgb2YgcGx1Z2luIGRpcmVjdG9yaWVzCisgICAgPj4+IHBsdWdpbnMuYWRkKGZvbzEyKQorICAgID4+PiBwbHVnaW5zLmFkZChmb28xNCkKKyAgICA+Pj4gcGx1Z2lucy5hZGQoanVzdF9hX3Rlc3QpCisgICAgCitJbiB0aGUgc2ltcGxlc3QgY2FzZSwgd2UganVzdCBnZXQgdGhlIG5ld2VzdCB2ZXJzaW9uIG9mIGVhY2ggZGlzdHJpYnV0aW9uIGluCit0aGUgcGx1Z2luIGVudmlyb25tZW50OjoKKworICAgID4+PiB3cyA9IFdvcmtpbmdTZXQoW10pCisgICAgPj4+IHdzLmZpbmRfcGx1Z2lucyhwbHVnaW5zKQorICAgIChbSnVzdEFUZXN0IDAuOTksIEZvbyAxLjQgKGYxNCldLCB7fSkKKworQnV0IGlmIHRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggYSB2ZXJzaW9uIGNvbmZsaWN0IG9yIG1pc3NpbmcgcmVxdWlyZW1lbnRzLCB0aGUKK21ldGhvZCBmYWxscyBiYWNrIHRvIG9sZGVyIHZlcnNpb25zLCBhbmQgdGhlIGVycm9yIGluZm8gZGljdCB3aWxsIGNvbnRhaW4gYW4KK2V4Y2VwdGlvbiBpbnN0YW5jZSBmb3IgZWFjaCB1bmxvYWRhYmxlIHBsdWdpbjo6CisKKyAgICA+Pj4gd3MuYWRkKGZvbzEyKSAgICMgdGhpcyB3aWxsIGNvbmZsaWN0IHdpdGggRm9vIDEuNAorICAgID4+PiB3cy5maW5kX3BsdWdpbnMocGx1Z2lucykKKyAgICAoW0p1c3RBVGVzdCAwLjk5LCBGb28gMS4yIChmMTIpXSwge0ZvbyAxLjQgKGYxNCk6IFZlcnNpb25Db25mbGljdCguLi4pfSkKKworQnV0IGlmIHlvdSBkaXNhbGxvdyBmYWxsYmFja3MsIHRoZSBmYWlsZWQgcGx1Z2luIHdpbGwgYmUgc2tpcHBlZCBpbnN0ZWFkIG9mCit0cnlpbmcgb2xkZXIgdmVyc2lvbnM6OgorCisgICAgPj4+IHdzLmZpbmRfcGx1Z2lucyhwbHVnaW5zLCBmYWxsYmFjaz1GYWxzZSkKKyAgICAoW0p1c3RBVGVzdCAwLjk5XSwge0ZvbyAxLjQgKGYxNCk6IFZlcnNpb25Db25mbGljdCguLi4pfSkKKworCisKK1BsYXRmb3JtIENvbXBhdGliaWxpdHkgUnVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT24gdGhlIE1hYywgdGhlcmUgYXJlIHBvdGVudGlhbCBjb21wYXRpYmlsaXR5IGlzc3VlcyBmb3IgbW9kdWxlcyBjb21waWxlZAorb24gbmV3ZXIgdmVyc2lvbnMgb2YgTWFjIE9TIFggdGhhbiB3aGF0IHRoZSB1c2VyIGlzIHJ1bm5pbmcuIEFkZGl0aW9uYWxseSwKK01hYyBPUyBYIHdpbGwgc29vbiBoYXZlIHR3byBwbGF0Zm9ybXMgdG8gY29udGVuZCB3aXRoOiBJbnRlbCBhbmQgUG93ZXJQQy4KKworQmFzaWMgZXF1YWxpdHkgd29ya3MgYXMgb24gb3RoZXIgcGxhdGZvcm1zOjoKKworICAgID4+PiBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGNvbXBhdGlibGVfcGxhdGZvcm1zIGFzIGNwCisgICAgPj4+IHJlcWQgPSAnbWFjb3N4LTEwLjQtcHBjJworICAgID4+PiBjcChyZXFkLCByZXFkKQorICAgIFRydWUKKyAgICA+Pj4gY3AoIndpbjMyIiwgcmVxZCkKKyAgICBGYWxzZQorCitEaXN0cmlidXRpb25zIG1hZGUgb24gb3RoZXIgbWFjaGluZSB0eXBlcyBhcmUgbm90IGNvbXBhdGlibGU6OgorCisgICAgPj4+IGNwKCJtYWNvc3gtMTAuNC1pMzg2IiwgcmVxZCkKKyAgICBGYWxzZQorCitEaXN0cmlidXRpb25zIG1hZGUgb24gZWFybGllciB2ZXJzaW9ucyBvZiB0aGUgT1MgYXJlIGNvbXBhdGlibGUsIGFzCitsb25nIGFzIHRoZXkgYXJlIGZyb20gdGhlIHNhbWUgdG9wLWxldmVsIHZlcnNpb24uIFRoZSBwYXRjaGxldmVsIHZlcnNpb24KK251bWJlciBkb2VzIG5vdCBtYXR0ZXI6OgorCisgICAgPj4+IGNwKCJtYWNvc3gtMTAuNC1wcGMiLCByZXFkKQorICAgIFRydWUKKyAgICA+Pj4gY3AoIm1hY29zeC0xMC4zLXBwYyIsIHJlcWQpCisgICAgVHJ1ZQorICAgID4+PiBjcCgibWFjb3N4LTEwLjUtcHBjIiwgcmVxZCkKKyAgICBGYWxzZQorICAgID4+PiBjcCgibWFjb3N4LTkuNS1wcGMiLCByZXFkKQorICAgIEZhbHNlCisKK0JhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBwYWNrYWdlcyBtYWRlIHZpYSBlYXJsaWVyIHZlcnNpb25zIG9mIAorc2V0dXB0b29scyBpcyBwcm92aWRlZCBhcyB3ZWxsOjoKKworICAgID4+PiBjcCgiZGFyd2luLTguMi4wLVBvd2VyX01hY2ludG9zaCIsIHJlcWQpCisgICAgVHJ1ZQorICAgID4+PiBjcCgiZGFyd2luLTcuMi4wLVBvd2VyX01hY2ludG9zaCIsIHJlcWQpCisgICAgVHJ1ZQorICAgID4+PiBjcCgiZGFyd2luLTguMi4wLVBvd2VyX01hY2ludG9zaCIsICJtYWNvc3gtMTAuMy1wcGMiKQorICAgIEZhbHNlCisKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL3Rlc3RfcmVzb3VyY2VzLnB5IGIvTGliL3NldHVwdG9vbHMvdGVzdHMvdGVzdF9yZXNvdXJjZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyYzcyZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL3Rlc3RfcmVzb3VyY2VzLnB5CkBAIC0wLDAgKzEsNDgzIEBACitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZSwgbWFrZVN1aXRlCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICoKK2ltcG9ydCBwa2dfcmVzb3VyY2VzLCBzeXMKK2Zyb20gc2V0cyBpbXBvcnQgSW1tdXRhYmxlU2V0CisKK2NsYXNzIE1ldGFkYXRhKEVtcHR5UHJvdmlkZXIpOgorICAgICIiIk1vY2sgb2JqZWN0IHRvIHJldHVybiBtZXRhZGF0YSBhcyBpZiBmcm9tIGFuIG9uLWRpc2sgZGlzdHJpYnV0aW9uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwqcGFpcnMpOgorICAgICAgICBzZWxmLm1ldGFkYXRhID0gZGljdChwYWlycykKKworICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZixuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWUgaW4gc2VsZi5tZXRhZGF0YQorCisgICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5tZXRhZGF0YVtuYW1lXQorCisgICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCisKKworY2xhc3MgRGlzdHJvVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RDb2xsZWN0aW9uKHNlbGYpOgorICAgICAgICAjIGVtcHR5IHBhdGggc2hvdWxkIHByb2R1Y2Ugbm8gZGlzdHJpYnV0aW9ucworICAgICAgICBhZCA9IEVudmlyb25tZW50KFtdLCBwbGF0Zm9ybT1Ob25lLCBweXRob249Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGFkKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWRbJ0Zvb1BrZyddLFtdKQorCisgICAgICAgIGFkLmFkZChEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuM18xLmVnZyIpKQorICAgICAgICBhZC5hZGQoRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjQtcHkyLjQtd2luMzIuZWdnIikpCisgICAgICAgIGFkLmFkZChEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuMi1weTIuNC5lZ2ciKSkKKworICAgICAgICAjIE5hbWUgaXMgaW4gdGhlcmUgbm93CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhhZFsnRm9vUGtnJ10pCisKKyAgICAgICAgIyBCdXQgb25seSAxIHBhY2thZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGFkKSwgWydmb29wa2cnXSkKKworCisKKyAgICAgICAgIyBEaXN0cmlidXRpb25zIHNvcnQgYnkgdmVyc2lvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgW2Rpc3QudmVyc2lvbiBmb3IgZGlzdCBpbiBhZFsnRm9vUGtnJ11dLCBbJzEuNCcsJzEuMy0xJywnMS4yJ10KKyAgICAgICAgKQorICAgICAgICAjIFJlbW92aW5nIGEgZGlzdHJpYnV0aW9uIGxlYXZlcyBzZXF1ZW5jZSBhbG9uZQorICAgICAgICBhZC5yZW1vdmUoYWRbJ0Zvb1BrZyddWzFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgW2Rpc3QudmVyc2lvbiBmb3IgZGlzdCBpbiBhZFsnRm9vUGtnJ11dLCBbJzEuNCcsJzEuMiddCisgICAgICAgICkKKyAgICAgICAgIyBBbmQgaW5zZXJ0aW5nIGFkZHMgdGhlbSBpbiBvcmRlcgorICAgICAgICBhZC5hZGQoRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjkuZWdnIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBbZGlzdC52ZXJzaW9uIGZvciBkaXN0IGluIGFkWydGb29Qa2cnXV0sIFsnMS45JywnMS40JywnMS4yJ10KKyAgICAgICAgKQorCisgICAgICAgIHdzID0gV29ya2luZ1NldChbXSkKKyAgICAgICAgZm9vMTIgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuMi1weTIuNC5lZ2ciKQorICAgICAgICBmb28xNCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS40LXB5Mi40LXdpbjMyLmVnZyIpCisgICAgICAgIHJlcSwgPSBwYXJzZV9yZXF1aXJlbWVudHMoIkZvb1BrZz49MS4zIikKKworICAgICAgICAjIE5vbWluYWwgY2FzZTogbm8gZGlzdHJvcyBvbiBwYXRoLCBzaG91bGQgeWllbGQgYWxsIGFwcGxpY2FibGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZC5iZXN0X21hdGNoKHJlcSx3cykudmVyc2lvbiwgJzEuOScpCisgICAgICAgICMgSWYgYSBtYXRjaGluZyBkaXN0cm8gaXMgYWxyZWFkeSBpbnN0YWxsZWQsIHNob3VsZCByZXR1cm4gb25seSB0aGF0CisgICAgICAgIHdzLmFkZChmb28xNCk7IHNlbGYuYXNzZXJ0RXF1YWwoYWQuYmVzdF9tYXRjaChyZXEsd3MpLnZlcnNpb24sICcxLjQnKQorCisgICAgICAgICMgSWYgdGhlIGZpcnN0IG1hdGNoaW5nIGRpc3RybyBpcyB1bnN1aXRhYmxlLCBpdCdzIGEgdmVyc2lvbiBjb25mbGljdAorICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pOyB3cy5hZGQoZm9vMTIpOyB3cy5hZGQoZm9vMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZlcnNpb25Db25mbGljdCwgYWQuYmVzdF9tYXRjaCwgcmVxLCB3cykKKworICAgICAgICAjIElmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggb24gdGhlIHBhdGgsIHRoZSBmaXJzdCBvbmUgdGFrZXMgcHJlY2VkZW5jZQorICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pOyB3cy5hZGQoZm9vMTQpOyB3cy5hZGQoZm9vMTIpOyB3cy5hZGQoZm9vMTQpOworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkLmJlc3RfbWF0Y2gocmVxLHdzKS52ZXJzaW9uLCAnMS40JykKKworICAgIGRlZiBjaGVja0Zvb1BrZyhzZWxmLGQpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucHJvamVjdF9uYW1lLCAiRm9vUGtnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmtleSwgImZvb3BrZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC52ZXJzaW9uLCAiMS4zLTEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucHlfdmVyc2lvbiwgIjIuNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5wbGF0Zm9ybSwgIndpbjMyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBhcnNlZF92ZXJzaW9uLCBwYXJzZV92ZXJzaW9uKCIxLjMtMSIpKQorCisgICAgZGVmIHRlc3REaXN0cm9CYXNpY3Moc2VsZik6CisgICAgICAgIGQgPSBEaXN0cmlidXRpb24oCisgICAgICAgICAgICAiL3NvbWUvcGF0aCIsCisgICAgICAgICAgICBwcm9qZWN0X25hbWU9IkZvb1BrZyIsdmVyc2lvbj0iMS4zLTEiLHB5X3ZlcnNpb249IjIuNCIscGxhdGZvcm09IndpbjMyIgorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tGb29Qa2coZCkKKworICAgICAgICBkID0gRGlzdHJpYnV0aW9uKCIvc29tZS9wYXRoIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnB5X3ZlcnNpb24sIHN5cy52ZXJzaW9uWzozXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBsYXRmb3JtLCBOb25lKQorCisgICAgZGVmIHRlc3REaXN0cm9QYXJzZShzZWxmKToKKyAgICAgICAgZCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS4zXzEtcHkyLjQtd2luMzIuZWdnIikKKyAgICAgICAgc2VsZi5jaGVja0Zvb1BrZyhkKQorICAgICAgICBkID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjNfMS1weTIuNC13aW4zMi5lZ2ctaW5mbyIpCisgICAgICAgIHNlbGYuY2hlY2tGb29Qa2coZCkKKworICAgIGRlZiB0ZXN0RGlzdHJvTWV0YWRhdGEoc2VsZik6CisgICAgICAgIGQgPSBEaXN0cmlidXRpb24oCisgICAgICAgICAgICAiL3NvbWUvcGF0aCIsIHByb2plY3RfbmFtZT0iRm9vUGtnIiwgcHlfdmVyc2lvbj0iMi40IiwgcGxhdGZvcm09IndpbjMyIiwKKyAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgKCdQS0ctSU5GTycsIk1ldGFkYXRhLVZlcnNpb246IDEuMFxuVmVyc2lvbjogMS4zLTFcbiIpCisgICAgICAgICAgICApCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja0Zvb1BrZyhkKQorCisKKyAgICBkZWYgZGlzdFJlcXVpcmVzKHNlbGYsIHR4dCk6CisgICAgICAgIHJldHVybiBEaXN0cmlidXRpb24oIi9mb28iLCBtZXRhZGF0YT1NZXRhZGF0YSgoJ2RlcGVuZHMudHh0JywgdHh0KSkpCisKKyAgICBkZWYgY2hlY2tSZXF1aXJlcyhzZWxmLCBkaXN0LCB0eHQsIGV4dHJhcz0oKSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBsaXN0KGRpc3QucmVxdWlyZXMoZXh0cmFzKSksCisgICAgICAgICAgICBsaXN0KHBhcnNlX3JlcXVpcmVtZW50cyh0eHQpKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdERpc3Ryb0RlcGVuZHNTaW1wbGUoc2VsZik6CisgICAgICAgIGZvciB2IGluICJUd2lzdGVkPj0xLjUiLCAiVHdpc3RlZD49MS41XG5aQ29uZmlnPj0yLjAiOgorICAgICAgICAgICAgc2VsZi5jaGVja1JlcXVpcmVzKHNlbGYuZGlzdFJlcXVpcmVzKHYpLCB2KQorCisKKyAgICBkZWYgdGVzdFJlc29sdmUoc2VsZik6CisgICAgICAgIGFkID0gRW52aXJvbm1lbnQoW10pOyB3cyA9IFdvcmtpbmdTZXQoW10pCisgICAgICAgICMgUmVzb2x2aW5nIG5vIHJlcXVpcmVtZW50cyAtPiBub3RoaW5nIHRvIGluc3RhbGwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCggbGlzdCh3cy5yZXNvbHZlKFtdLGFkKSksIFtdICkKKyAgICAgICAgIyBSZXF1ZXN0IHNvbWV0aGluZyBub3QgaW4gdGhlIGNvbGxlY3Rpb24gLT4gRGlzdHJpYnV0aW9uTm90Rm91bmQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBEaXN0cmlidXRpb25Ob3RGb3VuZCwgd3MucmVzb2x2ZSwgcGFyc2VfcmVxdWlyZW1lbnRzKCJGb28iKSwgYWQKKyAgICAgICAgKQorICAgICAgICBGb28gPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKKyAgICAgICAgICAgICIvZm9vX2Rpci9Gb28tMS4yLmVnZyIsCisgICAgICAgICAgICBtZXRhZGF0YT1NZXRhZGF0YSgoJ2RlcGVuZHMudHh0JywgIltiYXJdXG5CYXo+PTIuMCIpKQorICAgICAgICApCisgICAgICAgIGFkLmFkZChGb28pOyBhZC5hZGQoRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvby0wLjkuZWdnIikpCisKKyAgICAgICAgIyBSZXF1ZXN0IHRoaW5nKHMpIHRoYXQgYXJlIGF2YWlsYWJsZSAtPiBsaXN0IHRvIGFjdGl2YXRlCisgICAgICAgIGZvciBpIGluIHJhbmdlKDMpOgorICAgICAgICAgICAgdGFyZ2V0cyA9IGxpc3Qod3MucmVzb2x2ZShwYXJzZV9yZXF1aXJlbWVudHMoIkZvbyIpLCBhZCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmdldHMsIFtGb29dKQorICAgICAgICAgICAgbWFwKHdzLmFkZCx0YXJnZXRzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWZXJzaW9uQ29uZmxpY3QsIHdzLnJlc29sdmUsCisgICAgICAgICAgICBwYXJzZV9yZXF1aXJlbWVudHMoIkZvbz09MC45IiksIGFkKQorICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pICMgcmVzZXQKKworICAgICAgICAjIFJlcXVlc3QgYW4gZXh0cmEgdGhhdCBjYXVzZXMgYW4gdW5yZXNvbHZlZCBkZXBlbmRlbmN5IGZvciAiQmF6IgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIERpc3RyaWJ1dGlvbk5vdEZvdW5kLCB3cy5yZXNvbHZlLHBhcnNlX3JlcXVpcmVtZW50cygiRm9vW2Jhcl0iKSwgYWQKKyAgICAgICAgKQorICAgICAgICBCYXogPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKKyAgICAgICAgICAgICIvZm9vX2Rpci9CYXotMi4xLmVnZyIsIG1ldGFkYXRhPU1ldGFkYXRhKCgnZGVwZW5kcy50eHQnLCAiRm9vIikpCisgICAgICAgICkKKyAgICAgICAgYWQuYWRkKEJheikKKworICAgICAgICAjIEFjdGl2YXRpb24gbGlzdCBub3cgaW5jbHVkZXMgcmVzb2x2ZWQgZGVwZW5kZW5jeQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbGlzdCh3cy5yZXNvbHZlKHBhcnNlX3JlcXVpcmVtZW50cygiRm9vW2Jhcl0iKSwgYWQpKSwgW0ZvbyxCYXpdCisgICAgICAgICkKKyAgICAgICAgIyBSZXF1ZXN0cyBmb3IgY29uZmxpY3RpbmcgdmVyc2lvbnMgcHJvZHVjZSBWZXJzaW9uQ29uZmxpY3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoIFZlcnNpb25Db25mbGljdCwKKyAgICAgICAgICAgIHdzLnJlc29sdmUsIHBhcnNlX3JlcXVpcmVtZW50cygiRm9vPT0xLjJcbkZvbyE9MS4yIiksIGFkCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0RGlzdHJvRGVwZW5kc09wdGlvbnMoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLmRpc3RSZXF1aXJlcygiIiIKKyAgICAgICAgICAgIFR3aXN0ZWQ+PTEuNQorICAgICAgICAgICAgW2RvY2dlbl0KKyAgICAgICAgICAgIFpDb25maWc+PTIuMAorICAgICAgICAgICAgZG9jdXRpbHM+PTAuMworICAgICAgICAgICAgW2Zhc3RjZ2ldCisgICAgICAgICAgICBmY2dpYXBwPj0wLjEiIiIpCisgICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcyhkLCJUd2lzdGVkPj0xLjUiKQorICAgICAgICBzZWxmLmNoZWNrUmVxdWlyZXMoCisgICAgICAgICAgICBkLCJUd2lzdGVkPj0xLjUgWkNvbmZpZz49Mi4wIGRvY3V0aWxzPj0wLjMiLnNwbGl0KCksIFsiZG9jZ2VuIl0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrUmVxdWlyZXMoCisgICAgICAgICAgICBkLCJUd2lzdGVkPj0xLjUgZmNnaWFwcD49MC4xIi5zcGxpdCgpLCBbImZhc3RjZ2kiXQorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcygKKyAgICAgICAgICAgIGQsIlR3aXN0ZWQ+PTEuNSBaQ29uZmlnPj0yLjAgZG9jdXRpbHM+PTAuMyBmY2dpYXBwPj0wLjEiLnNwbGl0KCksCisgICAgICAgICAgICBbImRvY2dlbiIsImZhc3RjZ2kiXQorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcygKKyAgICAgICAgICAgIGQsIlR3aXN0ZWQ+PTEuNSBmY2dpYXBwPj0wLjEgWkNvbmZpZz49Mi4wIGRvY3V0aWxzPj0wLjMiLnNwbGl0KCksCisgICAgICAgICAgICBbImZhc3RjZ2kiLCAiZG9jZ2VuIl0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmtub3duRXh0cmEsIGQucmVxdWlyZXMsIFsiZm9vIl0pCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3MgRW50cnlQb2ludFRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiBhc3NlcnRmaWVsZHMoc2VsZiwgZXApOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm5hbWUsImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubW9kdWxlX25hbWUsInNldHVwdG9vbHMudGVzdHMudGVzdF9yZXNvdXJjZXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLmF0dHJzLCAoIkVudHJ5UG9pbnRUZXN0cyIsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcC5leHRyYXMsICgieCIsKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGVwLmxvYWQoKSBpcyBFbnRyeVBvaW50VGVzdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzdHIoZXApLAorICAgICAgICAgICAgImZvbyA9IHNldHVwdG9vbHMudGVzdHMudGVzdF9yZXNvdXJjZXM6RW50cnlQb2ludFRlc3RzIFt4XSIKKyAgICAgICAgKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKKyAgICAgICAgICAgICJGb29Qa2ctMS4yLXB5Mi40LmVnZyIsIG1ldGFkYXRhPU1ldGFkYXRhKCgncmVxdWlyZXMudHh0JywnW3hdJykpKQorCisgICAgZGVmIHRlc3RCYXNpY3Moc2VsZik6CisgICAgICAgIGVwID0gRW50cnlQb2ludCgKKyAgICAgICAgICAgICJmb28iLCAic2V0dXB0b29scy50ZXN0cy50ZXN0X3Jlc291cmNlcyIsIFsiRW50cnlQb2ludFRlc3RzIl0sCisgICAgICAgICAgICBbIngiXSwgc2VsZi5kaXN0CisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRmaWVsZHMoZXApCisKKyAgICBkZWYgdGVzdFBhcnNlKHNlbGYpOgorICAgICAgICBzID0gImZvbyA9IHNldHVwdG9vbHMudGVzdHMudGVzdF9yZXNvdXJjZXM6RW50cnlQb2ludFRlc3RzIFt4XSIKKyAgICAgICAgZXAgPSBFbnRyeVBvaW50LnBhcnNlKHMsIHNlbGYuZGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRmaWVsZHMoZXApCisKKyAgICAgICAgZXAgPSBFbnRyeVBvaW50LnBhcnNlKCJiYXIgYmF6PSAgc3BhbW1pdHlbUElOR10iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm5hbWUsImJhciBiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm1vZHVsZV9uYW1lLCJzcGFtbWl0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAuYXR0cnMsICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLmV4dHJhcywgKCJwaW5nIiwpKQorCisgICAgICAgIGVwID0gRW50cnlQb2ludC5wYXJzZSgiIGZpenpseSA9ICB3b2NrYTpmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm5hbWUsImZpenpseSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubW9kdWxlX25hbWUsIndvY2thIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcC5hdHRycywgKCJmb28iLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAuZXh0cmFzLCAoKSkKKworICAgIGRlZiB0ZXN0UmVqZWN0cyhzZWxmKToKKyAgICAgICAgZm9yIGVwIGluIFsKKyAgICAgICAgICAgICJmb28iLCAieD0xPTIiLCAieD1hOmI6YyIsICJxPXgvbmEiLCAiZmV6PXBpc2g6dHVzaC16IiwgIng9ZlthXT4yIiwKKyAgICAgICAgXToKKyAgICAgICAgICAgIHRyeTogRW50cnlQb2ludC5wYXJzZShlcCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgICAgICBlbHNlOiByYWlzZSBBc3NlcnRpb25FcnJvcigiU2hvdWxkJ3ZlIGJlZW4gYmFkIiwgZXApCisKKyAgICBkZWYgY2hlY2tTdWJNYXAoc2VsZiwgbSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG0pLAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAiJ2ZlYXR1cmUyJzogRW50cnlQb2ludC5wYXJzZSgiCisgICAgICAgICAgICAgICAgIidmZWF0dXJlMiA9IGFub3RoZXIubW9kdWxlOlNvbWVDbGFzcyBbZXh0cmExLGV4dHJhMl0nKSwgIgorICAgICAgICAgICAgIidmZWF0dXJlMSc6IEVudHJ5UG9pbnQucGFyc2UoIgorICAgICAgICAgICAgICAgICInZmVhdHVyZTEgPSBzb21lbW9kdWxlOnNvbWVmdW5jdGlvbicpIgorICAgICAgICAgICAgIn0iCisgICAgICAgICkKKworICAgIHN1Ym1hcF9zdHIgPSAiIiIKKyAgICAgICAgICAgICMgZGVmaW5lIGZlYXR1cmVzIGZvciBibGFoIGJsYWgKKyAgICAgICAgICAgIGZlYXR1cmUxID0gc29tZW1vZHVsZTpzb21lZnVuY3Rpb24KKyAgICAgICAgICAgIGZlYXR1cmUyID0gYW5vdGhlci5tb2R1bGU6U29tZUNsYXNzIFtleHRyYTEsZXh0cmEyXQorICAgICIiIgorCisgICAgZGVmIHRlc3RQYXJzZUxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tTdWJNYXAoRW50cnlQb2ludC5wYXJzZV9ncm91cCgieHl6Iiwgc2VsZi5zdWJtYXBfc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRW50cnlQb2ludC5wYXJzZV9ncm91cCwgInggYSIsICJmb289YmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRW50cnlQb2ludC5wYXJzZV9ncm91cCwgIngiLAorICAgICAgICAgICAgWyJmb289YmF6IiwgImZvbz1iYXIiXSkKKworICAgIGRlZiB0ZXN0UGFyc2VNYXAoc2VsZik6CisgICAgICAgIG0gPSBFbnRyeVBvaW50LnBhcnNlX21hcCh7J3h5eic6c2VsZi5zdWJtYXBfc3RyfSkKKyAgICAgICAgc2VsZi5jaGVja1N1Yk1hcChtWyd4eXonXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmtleXMoKSxbJ3h5eiddKQorICAgICAgICBtID0gRW50cnlQb2ludC5wYXJzZV9tYXAoIlt4eXpdXG4iK3NlbGYuc3VibWFwX3N0cikKKyAgICAgICAgc2VsZi5jaGVja1N1Yk1hcChtWyd4eXonXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmtleXMoKSxbJ3h5eiddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBFbnRyeVBvaW50LnBhcnNlX21hcCwgWyJbeHl6XSIsICJbeHl6XSJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBFbnRyeVBvaW50LnBhcnNlX21hcCwgc2VsZi5zdWJtYXBfc3RyKQorCisKK2NsYXNzIFJlcXVpcmVtZW50c1Rlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0QmFzaWNzKHNlbGYpOgorICAgICAgICByID0gUmVxdWlyZW1lbnQucGFyc2UoIlR3aXN0ZWQ+PTEuMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHIpLCJUd2lzdGVkPj0xLjIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIociksIlJlcXVpcmVtZW50LnBhcnNlKCdUd2lzdGVkPj0xLjInKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgUmVxdWlyZW1lbnQoIlR3aXN0ZWQiLCBbKCc+PScsJzEuMicpXSwgKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIFJlcXVpcmVtZW50KCJ0d2lzVGVkIiwgWygnPj0nLCcxLjInKV0sICgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyLCBSZXF1aXJlbWVudCgiVHdpc3RlZCIsIFsoJz49JywnMi4wJyldLCAoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwociwgUmVxdWlyZW1lbnQoIlpvcGUiLCBbKCc+PScsJzEuMicpXSwgKCkpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHIsIFJlcXVpcmVtZW50KCJab3BlIiwgWygnPj0nLCczLjAnKV0sICgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyLCBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtleHRyYXNdPj0xLjIiKSkKKworICAgIGRlZiB0ZXN0T3JkZXJpbmcoc2VsZik6CisgICAgICAgIHIxID0gUmVxdWlyZW1lbnQoIlR3aXN0ZWQiLCBbKCc9PScsJzEuMmMxJyksKCc+PScsJzEuMicpXSwgKCkpCisgICAgICAgIHIyID0gUmVxdWlyZW1lbnQoIlR3aXN0ZWQiLCBbKCc+PScsJzEuMicpLCgnPT0nLCcxLjJjMScpXSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEscjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHIxKSxzdHIocjIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihyMiksIlR3aXN0ZWQ9PTEuMmMxLD49MS4yIikKKworICAgIGRlZiB0ZXN0QmFzaWNDb250YWlucyhzZWxmKToKKyAgICAgICAgciA9IFJlcXVpcmVtZW50KCJUd2lzdGVkIiwgWygnPj0nLCcxLjInKV0sICgpKQorICAgICAgICBmb29fZGlzdCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS4zXzEuZWdnIikKKyAgICAgICAgdHdpc3QxMSAgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiVHdpc3RlZC0xLjEuZWdnIikKKyAgICAgICAgdHdpc3QxMiAgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiVHdpc3RlZC0xLjIuZWdnIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHBhcnNlX3ZlcnNpb24oJzEuMicpIGluIHIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhwYXJzZV92ZXJzaW9uKCcxLjEnKSBub3QgaW4gcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCcxLjInIGluIHIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnMS4xJyBub3QgaW4gcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZvb19kaXN0IG5vdCBpbiByKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHdpc3QxMSBub3QgaW4gcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR3aXN0MTIgaW4gcikKKworICAgIGRlZiB0ZXN0QWR2YW5jZWRDb250YWlucyhzZWxmKToKKyAgICAgICAgciwgPSBwYXJzZV9yZXF1aXJlbWVudHMoIkZvbz49MS4yLDw9MS4zLD09MS45LD4yLjAsIT0yLjUsPDMuMCw9PTQuNSIpCisgICAgICAgIGZvciB2IGluICgnMS4yJywnMS4yLjInLCcxLjMnLCcxLjknLCcyLjAuMScsJzIuMycsJzIuNicsJzMuMGMxJywnNC41Jyk6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModiBpbiByLCAodixyKSkKKyAgICAgICAgZm9yIHYgaW4gKCcxLjJjMScsJzEuMy4xJywnMS41JywnMS45LjEnLCcyLjAnLCcyLjUnLCczLjAnLCc0LjAnKToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2IG5vdCBpbiByLCAodixyKSkKKworCisgICAgZGVmIHRlc3RPcHRpb25zQW5kSGFzaGluZyhzZWxmKToKKyAgICAgICAgcjEgPSBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtmb28sYmFyXT49MS4yIikKKyAgICAgICAgcjIgPSBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtiYXIsRk9PXT49MS4yIikKKyAgICAgICAgcjMgPSBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtCQVIsRk9PXT49MS4yLjAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLHIyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLHIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLmV4dHJhcywgKCJmb28iLCJiYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMi5leHRyYXMsICgiYmFyIiwiZm9vIikpICAjIGV4dHJhcyBhcmUgbm9ybWFsaXplZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocjEpLCBoYXNoKHIyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGhhc2gocjEpLCBoYXNoKCgidHdpc3RlZCIsICgoIj49IixwYXJzZV92ZXJzaW9uKCIxLjIiKSksKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQoWyJmb28iLCJiYXIiXSkpKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdFZlcnNpb25FcXVhbGl0eShzZWxmKToKKyAgICAgICAgcjEgPSBSZXF1aXJlbWVudC5wYXJzZSgic2V0dXB0b29scz09MC4zYTIiKQorICAgICAgICByMiA9IFJlcXVpcmVtZW50LnBhcnNlKCJzZXR1cHRvb2xzIT0wLjNhNCIpCisgICAgICAgIGQgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZQorCisgICAgICAgIHNlbGYuZmFpbElmKGQoInNldHVwdG9vbHMtMC4zYTQuZWdnIikgaW4gcjEpCisgICAgICAgIHNlbGYuZmFpbElmKGQoInNldHVwdG9vbHMtMC4zYTEuZWdnIikgaW4gcjEpCisgICAgICAgIHNlbGYuZmFpbElmKGQoInNldHVwdG9vbHMtMC4zYTQuZWdnIikgaW4gcjIpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQoInNldHVwdG9vbHMtMC4zYTIuZWdnIikgaW4gcjEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkKCJzZXR1cHRvb2xzLTAuM2EyLmVnZyIpIGluIHIyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZCgic2V0dXB0b29scy0wLjNhMy5lZ2ciKSBpbiByMikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQoInNldHVwdG9vbHMtMC4zYTUuZWdnIikgaW4gcjIpCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3MgUGFyc2VUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdEVtcHR5UGFyc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwYXJzZV9yZXF1aXJlbWVudHMoJycpKSwgW10pCisKKyAgICBkZWYgdGVzdFlpZWxkaW5nKHNlbGYpOgorICAgICAgICBmb3IgaW5wLG91dCBpbiBbCisgICAgICAgICAgICAoW10sIFtdKSwgKCd4JyxbJ3gnXSksIChbW11dLFtdKSwgKCcgeFxuIHknLCBbJ3gnLCd5J10pLAorICAgICAgICAgICAgKFsneFxuXG4nLCd5J10sIFsneCcsJ3knXSksCisgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocGtnX3Jlc291cmNlcy55aWVsZF9saW5lcyhpbnApKSxvdXQpCisKKyAgICBkZWYgdGVzdFNwbGl0dGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGxpc3QoCisgICAgICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5zcGxpdF9zZWN0aW9ucygiIiIKKyAgICAgICAgICAgICAgICAgICAgeAorICAgICAgICAgICAgICAgICAgICBbWV0KKyAgICAgICAgICAgICAgICAgICAgegorCisgICAgICAgICAgICAgICAgICAgIGEKKyAgICAgICAgICAgICAgICAgICAgW2IgXQorICAgICAgICAgICAgICAgICAgICAjIGZvbworICAgICAgICAgICAgICAgICAgICBjCisgICAgICAgICAgICAgICAgICAgIFsgZF0KKyAgICAgICAgICAgICAgICAgICAgW3FdCisgICAgICAgICAgICAgICAgICAgIHYKKyAgICAgICAgICAgICAgICAgICAgIiIiCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIFsoTm9uZSxbIngiXSksICgiWSIsWyJ6IiwiYSJdKSwgKCJiIixbImMiXSksICgiZCIsW10pLCAoInEiLFsidiJdKV0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLGxpc3QscGtnX3Jlc291cmNlcy5zcGxpdF9zZWN0aW9ucygiW2ZvbyIpKQorCisgICAgZGVmIHRlc3RTYWZlTmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX25hbWUoImFkbnMtcHl0aG9uIiksICJhZG5zLXB5dGhvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV9uYW1lKCJXU0dJIFV0aWxzIiksICAiV1NHSS1VdGlscyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV9uYW1lKCJXU0dJICBVdGlscyIpLCAiV1NHSS1VdGlscyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV9uYW1lKCJNb25leSQkJE1ha2VyIiksICJNb25leS1NYWtlciIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2FmZV9uYW1lKCJwZWFrLndlYiIpLCAicGVhay13ZWIiKQorCisgICAgZGVmIHRlc3RTYWZlVmVyc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX3ZlcnNpb24oIjEuMi0xIiksICIxLjItMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV92ZXJzaW9uKCIxLjIgYWxwaGEiKSwgICIxLjIuYWxwaGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhZmVfdmVyc2lvbigiMi4zLjQgMjAwNTA1MjEiKSwgIjIuMy40LjIwMDUwNTIxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX3ZlcnNpb24oIk1vbmV5JCQkTWFrZXIiKSwgIk1vbmV5LU1ha2VyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX3ZlcnNpb24oInBlYWsud2ViIiksICJwZWFrLndlYiIpCisKKyAgICBkZWYgdGVzdFNpbXBsZVJlcXVpcmVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGxpc3QocGFyc2VfcmVxdWlyZW1lbnRzKCdUd2lzLVRlZD49MS4yLTEnKSksCisgICAgICAgICAgICBbUmVxdWlyZW1lbnQoJ1R3aXMtVGVkJyxbKCc+PScsJzEuMi0xJyldLCAoKSldCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGxpc3QocGFyc2VfcmVxdWlyZW1lbnRzKCdUd2lzdGVkID49MS4yLCBcICMgbW9yZVxuPDIuMCcpKSwKKyAgICAgICAgICAgIFtSZXF1aXJlbWVudCgnVHdpc3RlZCcsWygnPj0nLCcxLjInKSwoJzwnLCcyLjAnKV0sICgpKV0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgUmVxdWlyZW1lbnQucGFyc2UoIkZvb0Jhcj09MS45OWEzIiksCisgICAgICAgICAgICBSZXF1aXJlbWVudCgiRm9vQmFyIiwgWygnPT0nLCcxLjk5YTMnKV0sICgpKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsUmVxdWlyZW1lbnQucGFyc2UsIj49Mi4zIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwieFxcIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwieD09MiBxIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwiWD09MVxuWT09MiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsUmVxdWlyZW1lbnQucGFyc2UsIiMiKQorCisgICAgZGVmIHRlc3RWZXJzaW9uRXF1YWxpdHkoc2VsZik6CisgICAgICAgIGRlZiBjKHMxLHMyKToKKyAgICAgICAgICAgIHAxLCBwMiA9IHBhcnNlX3ZlcnNpb24oczEpLHBhcnNlX3ZlcnNpb24oczIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLHAyLCAoczEsczIscDEscDIpKQorCisgICAgICAgIGMoJzEuMi1yYzEnLCAnMS4ycmMxJykKKyAgICAgICAgYygnMC40JywgJzAuNC4wJykKKyAgICAgICAgYygnMC40LjAuMCcsICcwLjQuMCcpCisgICAgICAgIGMoJzAuNC4wLTAnLCAnMC40LTAnKQorICAgICAgICBjKCcwcGwxJywgJzAuMHBsMScpCisgICAgICAgIGMoJzBwcmUxJywgJzAuMGMxJykKKyAgICAgICAgYygnMC4wLjBwcmV2aWV3MScsICcwYzEnKQorICAgICAgICBjKCcwLjBjMScsICcwLXJjMScpCisgICAgICAgIGMoJzEuMmExJywgJzEuMi5hLjEnKTsgYygnMS4yLi4uYScsICcxLjJhJykKKworICAgIGRlZiB0ZXN0VmVyc2lvbk9yZGVyaW5nKHNlbGYpOgorICAgICAgICBkZWYgYyhzMSxzMik6CisgICAgICAgICAgICBwMSwgcDIgPSBwYXJzZV92ZXJzaW9uKHMxKSxwYXJzZV92ZXJzaW9uKHMyKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHAxPHAyLCAoczEsczIscDEscDIpKQorCisgICAgICAgIGMoJzIuMScsJzIuMS4xJykKKyAgICAgICAgYygnMmExJywnMmIwJykKKyAgICAgICAgYygnMmExJywnMi4xJykKKyAgICAgICAgYygnMi4zYTEnLCAnMi4zJykKKyAgICAgICAgYygnMi4xLTEnLCAnMi4xLTInKQorICAgICAgICBjKCcyLjEtMScsICcyLjEuMScpCisgICAgICAgIGMoJzIuMScsICcyLjFwbDQnKQorICAgICAgICBjKCcyLjFhMC0yMDA0MDUwMScsICcyLjEnKQorICAgICAgICBjKCcxLjEnLCAnMDIuMScpCisgICAgICAgIGMoJ0E1NicsJ0IyNycpCisgICAgICAgIGMoJzMuMicsICczLjIucGwwJykKKyAgICAgICAgYygnMy4yLTEnLCAnMy4ycGwxJykKKyAgICAgICAgYygnMy4ycGwxJywgJzMuMnBsMS0xJykKKyAgICAgICAgYygnMC40JywgJzQuMCcpCisgICAgICAgIGMoJzAuMC40JywgJzAuNC4wJykKKyAgICAgICAgYygnMHBsMScsICcwLjRwbDEnKQorICAgICAgICBjKCcyLjEuMC1yYzEnLCcyLjEuMCcpCisKKyAgICAgICAgdG9ydHVyZSA9IiIiCisgICAgICAgIDAuODAuMS0zIDAuODAuMS0yIDAuODAuMS0xIDAuNzkuOTk5OSswLjgwLjBwcmU0LTEKKyAgICAgICAgMC43OS45OTk5KzAuODAuMHByZTItMyAwLjc5Ljk5OTkrMC44MC4wcHJlMi0yCisgICAgICAgIDAuNzcuMi0xIDAuNzcuMS0xIDAuNzcuMC0xCisgICAgICAgICIiIi5zcGxpdCgpCisKKyAgICAgICAgZm9yIHAsdjEgaW4gZW51bWVyYXRlKHRvcnR1cmUpOgorICAgICAgICAgICAgZm9yIHYyIGluIHRvcnR1cmVbcCsxOl06CisgICAgICAgICAgICAgICAgYyh2Mix2MSkKZGlmZiAtLWdpdCBhL0xpYi9zZ21sbGliLnB5IGIvTGliL3NnbWxsaWIucHkKaW5kZXggMDhlMzY1Yi4uM2U4NWE5MSAxMDA2NDQKLS0tIGEvTGliL3NnbWxsaWIucHkKKysrIGIvTGliL3NnbWxsaWIucHkKQEAgLTI2OSw5ICsyNjksMzcgQEAKICAgICAgICAgICAgIGF0dHJuYW1lLCByZXN0LCBhdHRydmFsdWUgPSBtYXRjaC5ncm91cCgxLCAyLCAzKQogICAgICAgICAgICAgaWYgbm90IHJlc3Q6CiAgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cm5hbWUKLSAgICAgICAgICAgIGVsaWYgYXR0cnZhbHVlWzoxXSA9PSAnXCcnID09IGF0dHJ2YWx1ZVstMTpdIG9yIFwKLSAgICAgICAgICAgICAgICAgYXR0cnZhbHVlWzoxXSA9PSAnIicgPT0gYXR0cnZhbHVlWy0xOl06Ci0gICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cnZhbHVlWzE6LTFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIChhdHRydmFsdWVbOjFdID09ICInIiA9PSBhdHRydmFsdWVbLTE6XSBvcgorICAgICAgICAgICAgICAgICAgICBhdHRydmFsdWVbOjFdID09ICciJyA9PSBhdHRydmFsdWVbLTE6XSk6CisgICAgICAgICAgICAgICAgICAgICMgc3RyaXAgcXVvdGVzCisgICAgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IGF0dHJ2YWx1ZVsxOi0xXQorICAgICAgICAgICAgICAgIGwgPSAwCisgICAgICAgICAgICAgICAgbmV3X2F0dHJ2YWx1ZSA9ICcnCisgICAgICAgICAgICAgICAgd2hpbGUgbCA8IGxlbihhdHRydmFsdWUpOgorICAgICAgICAgICAgICAgICAgICBhdl9tYXRjaCA9IGVudGl0eXJlZi5tYXRjaChhdHRydmFsdWUsIGwpCisgICAgICAgICAgICAgICAgICAgIGlmIChhdl9tYXRjaCBhbmQgYXZfbWF0Y2guZ3JvdXAoMSkgaW4gc2VsZi5lbnRpdHlkZWZzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnZhbHVlW2F2X21hdGNoLmVuZCgxKV0gPT0gJzsnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBzdWJzdGl0dXRlIGVudGl0eXJlZnMgZW5kaW5nIGluICc7JyBzaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2Ugd2UgbWF5IGJyZWFrIDxhIGhyZWY9Jz9wPXgmcT15Jz4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpY2ggaXMgdmVyeSBjb21tb24KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gc2VsZi5lbnRpdHlkZWZzW2F2X21hdGNoLmdyb3VwKDEpXQorICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGF2X21hdGNoLmVuZCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgY2hfbWF0Y2ggPSBjaGFycmVmLm1hdGNoKGF0dHJ2YWx1ZSwgbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hfbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciA9IGNocihpbnQoY2hfbWF0Y2guZ3JvdXAoMSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBjaF9tYXRjaC5lbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbnZhbGlkIGNoYXJhY3RlciByZWZlcmVuY2UsIGRvbid0IHN1YnN0aXR1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICMgYWxsIG90aGVyIGNhc2VzCisgICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gYXR0cnZhbHVlW2xdCisgICAgICAgICAgICAgICAgICAgIGwgKz0gMQorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IG5ld19hdHRydmFsdWUKICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgoYXR0cm5hbWUubG93ZXIoKSwgYXR0cnZhbHVlKSkKICAgICAgICAgICAgIGsgPSBtYXRjaC5lbmQoMCkKICAgICAgICAgaWYgcmF3ZGF0YVtqXSA9PSAnPic6CmRpZmYgLS1naXQgYS9MaWIvc2l0ZS5weSBiL0xpYi9zaXRlLnB5CmluZGV4IDVlN2ZmN2IuLjQ3ZWRhMjQgMTAwNjQ0Ci0tLSBhL0xpYi9zaXRlLnB5CisrKyBiL0xpYi9zaXRlLnB5CkBAIC02OSw2ICs2OSw4IEBACiBkZWYgYWJzX19maWxlX18oKToKICAgICAiIiJTZXQgYWxsIG1vZHVsZScgX19maWxlX18gYXR0cmlidXRlIHRvIGFuIGFic29sdXRlIHBhdGgiIiIKICAgICBmb3IgbSBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKKyAgICAgICAgaWYgaGFzYXR0cihtLCAnX19sb2FkZXJfXycpOgorICAgICAgICAgICAgY29udGludWUgICAjIGRvbid0IG1lc3Mgd2l0aCBhIFBFUCAzMDItc3VwcGxpZWQgX19maWxlX18KICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbS5fX2ZpbGVfXyA9IG9zLnBhdGguYWJzcGF0aChtLl9fZmlsZV9fKQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvc210cGxpYi5weSBiL0xpYi9zbXRwbGliLnB5CmluZGV4IDcxZDI1ZmQuLjA3OTE2Y2MgMTAwNzU1Ci0tLSBhL0xpYi9zbXRwbGliLnB5CisrKyBiL0xpYi9zbXRwbGliLnB5CkBAIC0yNTUsNyArMjU1LDExIEBACiAgICAgICAgICAgICAgICAgc2VsZi5sb2NhbF9ob3N0bmFtZSA9IGZxZG4KICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgIyBXZSBjYW4ndCBmaW5kIGFuIGZxZG4gaG9zdG5hbWUsIHNvIHVzZSBhIGRvbWFpbiBsaXRlcmFsCi0gICAgICAgICAgICAgICAgYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICAgICAgICAgIGFkZHIgPSAnMTI3LjAuMC4xJworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICBzZWxmLmxvY2FsX2hvc3RuYW1lID0gJ1slc10nICUgYWRkcgogCiAgICAgZGVmIHNldF9kZWJ1Z2xldmVsKHNlbGYsIGRlYnVnbGV2ZWwpOgpkaWZmIC0tZ2l0IGEvTGliL3NvY2tldC5weSBiL0xpYi9zb2NrZXQucHkKaW5kZXggZWUyNDU3Zi4uMzJhOTJiNCAxMDA2NDQKLS0tIGEvTGliL3NvY2tldC5weQorKysgYi9MaWIvc29ja2V0LnB5CkBAIC0xMjEsMTQgKzEyMSw2IEBACiAgICAgcmV0dXJuIG5hbWUKIAogCi0jCi0jIFRoZXNlIGNsYXNzZXMgYXJlIHVzZWQgYnkgdGhlIHNvY2tldCgpIGRlZmluZWQgb24gV2luZG93cyBhbmQgQmVPUwotIyBwbGF0Zm9ybXMgdG8gcHJvdmlkZSBhIGJlc3QtZWZmb3J0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGVhbnVwCi0jIHNlbWFudGljcyBuZWVkZWQgd2hlbiBzb2NrZXRzIGNhbid0IGJlIGR1cCgpZWQuCi0jCi0jIFRoZXNlIGFyZSBub3QgYWN0dWFsbHkgdXNlZCBvbiBvdGhlciBwbGF0Zm9ybXMuCi0jCi0KIF9zb2NrZXRtZXRob2RzID0gKAogICAgICdiaW5kJywgJ2Nvbm5lY3QnLCAnY29ubmVjdF9leCcsICdmaWxlbm8nLCAnbGlzdGVuJywKICAgICAnZ2V0cGVlcm5hbWUnLCAnZ2V0c29ja25hbWUnLCAnZ2V0c29ja29wdCcsICdzZXRzb2Nrb3B0JywKQEAgLTE4Myw2ICsxNzUsMTAgQEAKICAgICAgICAgYW5kIGJ1ZnNpemUgYXJndW1lbnRzIGFyZSBhcyBmb3IgdGhlIGJ1aWx0LWluIG9wZW4oKSBmdW5jdGlvbi4iIiIKICAgICAgICAgcmV0dXJuIF9maWxlb2JqZWN0KHNlbGYuX3NvY2ssIG1vZGUsIGJ1ZnNpemUpCiAKKyAgICBmYW1pbHkgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fc29jay5mYW1pbHksIGRvYz0idGhlIHNvY2tldCBmYW1pbHkiKQorICAgIHR5cGUgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fc29jay50eXBlLCBkb2M9InRoZSBzb2NrZXQgdHlwZSIpCisgICAgcHJvdG8gPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fc29jay5wcm90bywgZG9jPSJ0aGUgc29ja2V0IHByb3RvY29sIikKKwogICAgIF9zID0gKCJkZWYgJXMoc2VsZiwgKmFyZ3MpOiByZXR1cm4gc2VsZi5fc29jay4lcygqYXJncylcblxuIgogICAgICAgICAgICIlcy5fX2RvY19fID0gX3JlYWxzb2NrZXQuJXMuX19kb2NfX1xuIikKICAgICBmb3IgX20gaW4gX3NvY2tldG1ldGhvZHM6CmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy9fX2luaXRfXy5weSBiL0xpYi9zcWxpdGUzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZWYyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDI0IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL19faW5pdF9fLnB5OiB0aGUgcHlzcWxpdGUyIHBhY2thZ2UuCisjCisjIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworZnJvbSBkYmFwaTIgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL2RiYXBpMi5weSBiL0xpYi9zcWxpdGUzL2RiYXBpMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGM4YTg0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvZGJhcGkyLnB5CkBAIC0wLDAgKzEsODQgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvZGJhcGkyLnB5OiB0aGUgREItQVBJIDIuMCBpbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCBkYXRldGltZQorCitwYXJhbXN0eWxlID0gInFtYXJrIgorCit0aHJlYWRzYWZldHkgPSAxCisKK2FwaWxldmVsID0gIjIuMCIKKworZnJvbSBfc3FsaXRlMyBpbXBvcnQgKgorCitpbXBvcnQgZGF0ZXRpbWUsIHRpbWUKKworRGF0ZSA9IGRhdGV0aW1lLmRhdGUKKworVGltZSA9IGRhdGV0aW1lLnRpbWUKKworVGltZXN0YW1wID0gZGF0ZXRpbWUuZGF0ZXRpbWUKKworZGVmIERhdGVGcm9tVGlja3ModGlja3MpOgorICAgIHJldHVybiBhcHBseShEYXRlLHRpbWUubG9jYWx0aW1lKHRpY2tzKVs6M10pCisKK2RlZiBUaW1lRnJvbVRpY2tzKHRpY2tzKToKKyAgICByZXR1cm4gYXBwbHkoVGltZSx0aW1lLmxvY2FsdGltZSh0aWNrcylbMzo2XSkKKworZGVmIFRpbWVzdGFtcEZyb21UaWNrcyh0aWNrcyk6CisgICAgcmV0dXJuIGFwcGx5KFRpbWVzdGFtcCx0aW1lLmxvY2FsdGltZSh0aWNrcylbOjZdKQorCitfbWFqb3IsIF9taW5vciwgX21pY3JvID0gdmVyc2lvbi5zcGxpdCgiLiIpCit2ZXJzaW9uX2luZm8gPSAoaW50KF9tYWpvciksIGludChfbWlub3IpLCBfbWljcm8pCitfbWFqb3IsIF9taW5vciwgX21pY3JvID0gc3FsaXRlX3ZlcnNpb24uc3BsaXQoIi4iKQorc3FsaXRlX3ZlcnNpb25faW5mbyA9IChpbnQoX21ham9yKSwgaW50KF9taW5vciksIF9taWNybykKKworQmluYXJ5ID0gYnVmZmVyCisKK2RlZiBhZGFwdF9kYXRlKHZhbCk6CisgICAgcmV0dXJuIHZhbC5pc29mb3JtYXQoKQorCitkZWYgYWRhcHRfZGF0ZXRpbWUodmFsKToKKyAgICByZXR1cm4gdmFsLmlzb2Zvcm1hdCgiICIpCisKK2RlZiBjb252ZXJ0X2RhdGUodmFsKToKKyAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZSgqbWFwKGludCwgdmFsLnNwbGl0KCItIikpKQorCitkZWYgY29udmVydF90aW1lc3RhbXAodmFsKToKKyAgICBkYXRlcGFydCwgdGltZXBhcnQgPSB2YWwuc3BsaXQoIiAiKQorICAgIHllYXIsIG1vbnRoLCBkYXkgPSBtYXAoaW50LCBkYXRlcGFydC5zcGxpdCgiLSIpKQorICAgIHRpbWVwYXJ0X2Z1bGwgPSB0aW1lcGFydC5zcGxpdCgiLiIpCisgICAgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgPSBtYXAoaW50LCB0aW1lcGFydF9mdWxsWzBdLnNwbGl0KCI6IikpCisgICAgaWYgbGVuKHRpbWVwYXJ0X2Z1bGwpID09IDI6CisgICAgICAgIG1pY3Jvc2Vjb25kcyA9IGludChmbG9hdCgiMC4iICsgdGltZXBhcnRfZnVsbFsxXSkgKiAxMDAwMDAwKQorICAgIGVsc2U6CisgICAgICAgIG1pY3Jvc2Vjb25kcyA9IDAKKworICAgIHZhbCA9IGRhdGV0aW1lLmRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWNyb3NlY29uZHMpCisgICAgcmV0dXJuIHZhbAorCisKK3JlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZSwgYWRhcHRfZGF0ZSkKK3JlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZXRpbWUsIGFkYXB0X2RhdGV0aW1lKQorcmVnaXN0ZXJfY29udmVydGVyKCJkYXRlIiwgY29udmVydF9kYXRlKQorcmVnaXN0ZXJfY29udmVydGVyKCJ0aW1lc3RhbXAiLCBjb252ZXJ0X3RpbWVzdGFtcCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvX19pbml0X18ucHkgYi9MaWIvc3FsaXRlMy90ZXN0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDhkYTljCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpAQCAtMCwwICsxLDczMiBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi90ZXN0L2RiYXBpLnB5OiB0ZXN0cyBmb3IgREItQVBJIGNvbXBsaWFuY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCisKK2NsYXNzIE1vZHVsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgQ2hlY2tBUElMZXZlbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUuYXBpbGV2ZWwsICIyLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhcGlsZXZlbCBpcyAlcywgc2hvdWxkIGJlIDIuMCIgJSBzcWxpdGUuYXBpbGV2ZWwpCisKKyAgICBkZWYgQ2hlY2tUaHJlYWRTYWZldHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3FsaXRlLnRocmVhZHNhZmV0eSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkc2FmZXR5IGlzICVkLCBzaG91bGQgYmUgMSIgJSBzcWxpdGUudGhyZWFkc2FmZXR5KQorCisgICAgZGVmIENoZWNrUGFyYW1TdHlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUucGFyYW1zdHlsZSwgInFtYXJrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1zdHlsZSBpcyAnJXMnLCBzaG91bGQgYmUgJ3FtYXJrJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5wYXJhbXN0eWxlKQorCisgICAgZGVmIENoZWNrV2FybmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3Moc3FsaXRlLldhcm5pbmcsIFN0YW5kYXJkRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmcgaXMgbm90IGEgc3ViY2xhc3Mgb2YgU3RhbmRhcmRFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkVycm9yLCBTdGFuZGFyZEVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBTdGFuZGFyZEVycm9yIikKKworICAgIGRlZiBDaGVja0ludGVyZmFjZUVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJmYWNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXJyb3IiKQorCisgICAgZGVmIENoZWNrRGF0YWJhc2VFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkRhdGFiYXNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YWJhc2VFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tEYXRhRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5EYXRhRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tPcGVyYXRpb25hbEVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9wZXJhdGlvbmFsRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tJbnRlZ3JpdHlFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkludGVncml0eUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZWdyaXR5RXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tJbnRlcm5hbEVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJuYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tQcm9ncmFtbWluZ0Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlByb2dyYW1taW5nRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tOb3RTdXBwb3J0ZWRFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiTm90U3VwcG9ydGVkRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKK2NsYXNzIENvbm5lY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3UgPSBzZWxmLmN4LmN1cnNvcigpCisgICAgICAgIGN1LmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCkiKQorICAgICAgICBjdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jeC5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tDb21taXQoc2VsZik6CisgICAgICAgIHNlbGYuY3guY29tbWl0KCkKKworICAgIGRlZiBDaGVja0NvbW1pdEFmdGVyTm9DaGFuZ2VzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQSBjb21taXQgc2hvdWxkIGFsc28gd29yayB3aGVuIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3guY29tbWl0KCkKKyAgICAgICAgc2VsZi5jeC5jb21taXQoKQorCisgICAgZGVmIENoZWNrUm9sbGJhY2soc2VsZik6CisgICAgICAgIHNlbGYuY3gucm9sbGJhY2soKQorCisgICAgZGVmIENoZWNrUm9sbGJhY2tBZnRlck5vQ2hhbmdlcyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEEgcm9sbGJhY2sgc2hvdWxkIGFsc28gd29yayB3aGVuIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3gucm9sbGJhY2soKQorICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKKworICAgIGRlZiBDaGVja0N1cnNvcihzZWxmKToKKyAgICAgICAgY3UgPSBzZWxmLmN4LmN1cnNvcigpCisKKyAgICBkZWYgQ2hlY2tGYWlsZWRPcGVuKHNlbGYpOgorICAgICAgICBZT1VfQ0FOTk9UX09QRU5fVEhJUyA9ICIvZm9vL2Jhci9ibGEvMjM1MzQvbXlkYi5kYiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoWU9VX0NBTk5PVF9PUEVOX1RISVMpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmN4LmNsb3NlKCkKKworICAgIGRlZiBDaGVja0V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICMgT3B0aW9uYWwgREItQVBJIGV4dGVuc2lvbi4KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5XYXJuaW5nLCBzcWxpdGUuV2FybmluZykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5FcnJvciwgc3FsaXRlLkVycm9yKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4LkludGVyZmFjZUVycm9yLCBzcWxpdGUuSW50ZXJmYWNlRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guRGF0YWJhc2VFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guRGF0YUVycm9yLCBzcWxpdGUuRGF0YUVycm9yKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4Lk9wZXJhdGlvbmFsRXJyb3IsIHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4LkludGVncml0eUVycm9yLCBzcWxpdGUuSW50ZWdyaXR5RXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guSW50ZXJuYWxFcnJvciwgc3FsaXRlLkludGVybmFsRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guTm90U3VwcG9ydGVkRXJyb3IsIHNxbGl0ZS5Ob3RTdXBwb3J0ZWRFcnJvcikKKworY2xhc3MgQ3Vyc29yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jeCA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuY3UgPSBzZWxmLmN4LmN1cnNvcigpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB0ZXh0LCBpbmNvbWUgbnVtYmVyKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJmb28iLCkpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3UuY2xvc2UoKQorICAgICAgICBzZWxmLmN4LmNsb3NlKCkKKworICAgIGRlZiBDaGVja0V4ZWN1dGVOb0FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlSWxsZWdhbFNxbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgYXNkZiIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlVG9vTXVjaFNxbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgNSs0OyBzZWxlY3QgNCs1IikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgV2FybmluZyIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuV2FybmluZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVRvb011Y2hTcWwyKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1KzQ7IC0tIGZvbyBiYXIiKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVRvb011Y2hTcWwzKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIiIiCisgICAgICAgICAgICBzZWxlY3QgNSs0OworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgZm9vCisgICAgICAgICAgICAqLworICAgICAgICAgICAgIiIiKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nU3FsQXJnKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoNDIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFZhbHVlRXJyb3IiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24uIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVBcmdJbnQoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg0MiwpKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZUFyZ0Zsb2F0KHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgKDI1MDAuMzIsKSkKKworICAgIGRlZiBDaGVja0V4ZWN1dGVBcmdTdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJIdWdvIiwpKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MxKHNlbGYpOgorICAgICAgICAjIHRvbyBtYW55IHBhcmFtZXRlcnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDE3LCAiRWdvbiIpKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ05vT2ZBcmdzMihzZWxmKToKKyAgICAgICAgIyB0b28gbGl0dGxlIHBhcmFtZXRlcnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdOb09mQXJnczMoc2VsZik6CisgICAgICAgICMgbm8gcGFyYW1ldGVycywgcGFyYW1ldGVycyBhcmUgbmVlZGVkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIiwgeyJuYW1lIjogImZvbyJ9KQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAiZm9vIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ1Rvb0xpdHRsZUFyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUgYW5kIGlkPTppZCIsIHsibmFtZSI6ICJmb28ifSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdOb0FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ1VubmFtZWQoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIHsibmFtZSI6ICJmb28ifSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tDbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tSb3djb3VudEV4ZWN1dGUoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgidXBkYXRlIHRlc3Qgc2V0IG5hbWU9J2JhciciKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAyKQorCisgICAgZGVmIENoZWNrUm93Y291bnRFeGVjdXRlbWFueShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgWygxLCksICgyLCksICgzLCldKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAzKQorCisgICAgZGVmIENoZWNrVG90YWxDaGFuZ2VzKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBpZiBzZWxmLmN4LnRvdGFsX2NoYW5nZXMgPCAyOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ0b3RhbCBjaGFuZ2VzIHJlcG9ydGVkIHdyb25nIHZhbHVlIikKKworICAgICMgQ2hlY2tzIGZvciBleGVjdXRlbWFueToKKyAgICAjIFNlcXVlbmNlcyBhcmUgcmVxdWlyZWQgYnkgdGhlIERCLUFQSSwgaXRlcmF0b3JzCisgICAgIyBlbmhhbmNlbWVudHMgaW4gcHlzcWxpdGUuCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueVNlcXVlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIFsoeCwpIGZvciB4IGluIHJhbmdlKDEwMCwgMTEwKV0pCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueUl0ZXJhdG9yKHNlbGYpOgorICAgICAgICBjbGFzcyBNeUl0ZXI6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IDUKKworICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi52YWx1ZSA9PSAxMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgKz0gMQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYudmFsdWUsKQorCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgTXlJdGVyKCkpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueUdlbmVyYXRvcihzZWxmKToKKyAgICAgICAgZGVmIG15Z2VuKCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgICAgICB5aWVsZCAoaSwpCisKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCBteWdlbigpKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlXcm9uZ1NxbEFyZyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSg0MiwgWygzLCldKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueVNlbGVjdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgic2VsZWN0ID8iLCBbKDMsKV0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueU5vdEl0ZXJhYmxlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIDQyKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBUeXBlRXJyb3IiKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBwcmludCAicmFpc2VkIiwgZS5fX2NsYXNzX18KKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbi4iKQorCisgICAgZGVmIENoZWNrRmV0Y2hJdGVyKHNlbGYpOgorICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg1LCkpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg2LCkpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IGlkIGZyb20gdGVzdCBvcmRlciBieSBpZCIpCisgICAgICAgIGxzdCA9IFtdCisgICAgICAgIGZvciByb3cgaW4gc2VsZi5jdToKKyAgICAgICAgICAgIGxzdC5hcHBlbmQocm93WzBdKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsc3RbMF0sIDUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxzdFsxXSwgNikKKworICAgIGRlZiBDaGVja0ZldGNob25lKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sICJmb28iKQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93LCBOb25lKQorCisgICAgZGVmIENoZWNrRmV0Y2hvbmVOb1N0YXRlbWVudChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jeC5jdXJzb3IoKQorICAgICAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3csIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tBcnJheVNpemUoc2VsZik6CisgICAgICAgICMgbXVzdCBkZWZhdWx0IG90IDEKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jdS5hcnJheXNpemUsIDEpCisKKyAgICAgICAgIyBub3cgc2V0IHRvIDIKKyAgICAgICAgc2VsZi5jdS5hcnJheXNpemUgPSAyCisKKyAgICAgICAgIyBub3cgbWFrZSB0aGUgcXVlcnkgcmV0dXJuIDMgcm93cworICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnQScpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0InKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdDJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMikKKworICAgIGRlZiBDaGVja0ZldGNobWFueShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueSgxMDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueSgxMDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgW10pCisKKyAgICBkZWYgQ2hlY2tGZXRjaGFsbChzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsIFtdKQorCisgICAgZGVmIENoZWNrU2V0aW5wdXRzaXplcyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5zZXRpbnB1dHNpemVzKFszLCA0LCA1XSkKKworICAgIGRlZiBDaGVja1NldG91dHB1dHNpemUoc2VsZik6CisgICAgICAgIHNlbGYuY3Uuc2V0b3V0cHV0c2l6ZSg1LCAwKQorCisgICAgZGVmIENoZWNrU2V0b3V0cHV0c2l6ZU5vQ29sdW1uKHNlbGYpOgorICAgICAgICBzZWxmLmN1LnNldG91dHB1dHNpemUoNDIpCisKKyAgICBkZWYgQ2hlY2tDdXJzb3JDb25uZWN0aW9uKHNlbGYpOgorICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3UuY29ubmVjdGlvbiwgc2VsZi5jeCkKKworICAgIGRlZiBDaGVja1dyb25nQ3Vyc29yQ2FsbGFibGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlZiBmKCk6IHBhc3MKKyAgICAgICAgICAgIGN1ciA9IHNlbGYuY3guY3Vyc29yKGYpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFR5cGVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKKworICAgIGRlZiBDaGVja0N1cnNvcldyb25nQ2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEZvbzogcGFzcworICAgICAgICBmb28gPSBGb28oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIgPSBzcWxpdGUuQ3Vyc29yKGZvbykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVmFsdWVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIFRocmVhZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQsIGJpbiBiaW5hcnksIHJhdGlvIG51bWJlciwgdHMgdGltZXN0YW1wKSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrQ29uQ3Vyc29yKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0NvbkNvbW1pdChzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjb24sIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29uLmNvbW1pdCgpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjb24iOiBzZWxmLmNvbiwgImVycm9ycyI6IGVycm9yc30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCisKKyAgICBkZWYgQ2hlY2tDb25Sb2xsYmFjayhzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjb24sIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29uLnJvbGxiYWNrKCkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0NvbkNsb3NlKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY29uIjogc2VsZi5jb24sICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ3VySW1wbGljaXRCZWdpbihzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnYScpIikKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0N1ckNsb3NlKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIuY2xvc2UoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ3VyRXhlY3V0ZShzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0N1ckl0ZXJOZXh0KHNlbGYpOgorICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdhJykiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjdXIiOiBzZWxmLmN1ciwgImVycm9ycyI6IGVycm9yc30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCisKK2NsYXNzIENvbnN0cnVjdG9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBDaGVja0RhdGUoc2VsZik6CisgICAgICAgIGQgPSBzcWxpdGUuRGF0ZSgyMDA0LCAxMCwgMjgpCisKKyAgICBkZWYgQ2hlY2tUaW1lKHNlbGYpOgorICAgICAgICB0ID0gc3FsaXRlLlRpbWUoMTIsIDM5LCAzNSkKKworICAgIGRlZiBDaGVja1RpbWVzdGFtcChzZWxmKToKKyAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wKDIwMDQsIDEwLCAyOCwgMTIsIDM5LCAzNSkKKworICAgIGRlZiBDaGVja0RhdGVGcm9tVGlja3Moc2VsZik6CisgICAgICAgIGQgPSBzcWxpdGUuRGF0ZUZyb21UaWNrcyg0MikKKworICAgIGRlZiBDaGVja1RpbWVGcm9tVGlja3Moc2VsZik6CisgICAgICAgIHQgPSBzcWxpdGUuVGltZUZyb21UaWNrcyg0MikKKworICAgIGRlZiBDaGVja1RpbWVzdGFtcEZyb21UaWNrcyhzZWxmKToKKyAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wRnJvbVRpY2tzKDQyKQorCisgICAgZGVmIENoZWNrQmluYXJ5KHNlbGYpOgorICAgICAgICBiID0gc3FsaXRlLkJpbmFyeShjaHIoMCkgKyAiJyIpCisKK2NsYXNzIEV4dGVuc2lvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgQ2hlY2tTY3JpcHRTdHJpbmdTcWwoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZXNjcmlwdCgiIiIKKyAgICAgICAgICAgIC0tIGJsYSBibGEKKyAgICAgICAgICAgIC8qIGEgc3R1cGlkIGNvbW1lbnQgKi8KKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBhKGkpOworICAgICAgICAgICAgaW5zZXJ0IGludG8gYShpKSB2YWx1ZXMgKDUpOworICAgICAgICAgICAgIiIiKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSBhIikKKyAgICAgICAgcmVzID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCA1KQorCisgICAgZGVmIENoZWNrU2NyaXB0U3RyaW5nVW5pY29kZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KHUiIiIKKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBhKGkpOworICAgICAgICAgICAgaW5zZXJ0IGludG8gYShpKSB2YWx1ZXMgKDUpOworICAgICAgICAgICAgc2VsZWN0IGkgZnJvbSBhOworICAgICAgICAgICAgZGVsZXRlIGZyb20gYTsKKyAgICAgICAgICAgIGluc2VydCBpbnRvIGEoaSkgdmFsdWVzICg2KTsKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gYSIpCisgICAgICAgIHJlcyA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgNikKKworICAgIGRlZiBDaGVja1NjcmlwdEVycm9ySW5jb21wbGV0ZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIHJhaXNlZCA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChzYWRmc2FkZmRzYSIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlZCA9IFRydWUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgQ2hlY2tTY3JpcHRFcnJvck5vcm1hbChzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIHJhaXNlZCA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChzYWRmc2FkZmRzYSk7IHNlbGVjdCBmb28gZnJvbSBodXJ6OyIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlZCA9IFRydWUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCA1IikuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDUsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZSIpCisKKyAgICBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZW1hbnkoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChmb28pIikKKyAgICAgICAgY29uLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGZvbykgdmFsdWVzICg/KSIsIFsoMywpLCAoNCwpXSkKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IG9yZGVyIGJ5IGZvbyIpLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0WzBdWzBdLCAzLCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0WzFdWzBdLCA0LCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKKworICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlc2NyaXB0KHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKTsgaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoNSk7IikKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDUsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZXNjcmlwdCIpCisKK2NsYXNzIENsb3NlZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrQ2xvc2VkQ29uQ3Vyc29yKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlZENvbkNvbW1pdChzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmNvbW1pdCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRDb25Sb2xsYmFjayhzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLnJvbGxiYWNrKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlZEN1ckV4ZWN1dGUoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDQiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCitkZWYgc3VpdGUoKToKKyAgICBtb2R1bGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoTW9kdWxlVGVzdHMsICJDaGVjayIpCisgICAgY29ubmVjdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25uZWN0aW9uVGVzdHMsICJDaGVjayIpCisgICAgY3Vyc29yX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEN1cnNvclRlc3RzLCAiQ2hlY2siKQorICAgIHRocmVhZF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUaHJlYWRUZXN0cywgIkNoZWNrIikKKyAgICBjb25zdHJ1Y3Rvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25zdHJ1Y3RvclRlc3RzLCAiQ2hlY2siKQorICAgIGV4dF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShFeHRlbnNpb25UZXN0cywgIkNoZWNrIikKKyAgICBjbG9zZWRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ2xvc2VkVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgobW9kdWxlX3N1aXRlLCBjb25uZWN0aW9uX3N1aXRlLCBjdXJzb3Jfc3VpdGUsIHRocmVhZF9zdWl0ZSwgY29uc3RydWN0b3Jfc3VpdGUsIGV4dF9zdWl0ZSwgY2xvc2VkX3N1aXRlKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzgwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkKQEAgLTAsMCArMSwxNjQgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC9mYWN0b3J5LnB5OiB0ZXN0cyBmb3IgdGhlIHZhcmlvdXMgZmFjdG9yaWVzIGluIHB5c3FsaXRlCisjCisjIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworY2xhc3MgTXlDb25uZWN0aW9uKHNxbGl0ZS5Db25uZWN0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3FsaXRlLkNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorCitkZWYgZGljdF9mYWN0b3J5KGN1cnNvciwgcm93KToKKyAgICBkID0ge30KKyAgICBmb3IgaWR4LCBjb2wgaW4gZW51bWVyYXRlKGN1cnNvci5kZXNjcmlwdGlvbik6CisgICAgICAgIGRbY29sWzBdXSA9IHJvd1tpZHhdCisgICAgcmV0dXJuIGQKKworY2xhc3MgTXlDdXJzb3Ioc3FsaXRlLkN1cnNvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNxbGl0ZS5DdXJzb3IuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLnJvd19mYWN0b3J5ID0gZGljdF9mYWN0b3J5CisKK2NsYXNzIENvbm5lY3Rpb25GYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBmYWN0b3J5PU15Q29ubmVjdGlvbikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrSXNJbnN0YW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi5jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15Q29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGlvbiBpcyBub3QgaW5zdGFuY2Ugb2YgTXlDb25uZWN0aW9uIikKKworY2xhc3MgQ3Vyc29yRmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrSXNJbnN0YW5jZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9TXlDdXJzb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKGN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlDdXJzb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgImN1cnNvciBpcyBub3QgaW5zdGFuY2Ugb2YgTXlDdXJzb3IiKQorCitjbGFzcyBSb3dGYWN0b3J5VGVzdHNCYWNrd2FyZHNDb21wYXQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorCisgICAgZGVmIENoZWNrSXNQcm9kdWNlZEJ5RmFjdG9yeShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9TXlDdXJzb3IpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgNCs1IGFzIGZvbyIpCisgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdCksCisgICAgICAgICAgICAgICAgICAgICAgICAicm93IGlzIG5vdCBpbnN0YW5jZSBvZiBkaWN0IikKKyAgICAgICAgY3VyLmNsb3NlKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitjbGFzcyBSb3dGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorCisgICAgZGVmIENoZWNrQ3VzdG9tRmFjdG9yeShzZWxmKToKKyAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBsYW1iZGEgY3VyLCByb3c6IGxpc3Qocm93KQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSwgMiIpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uocm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIGxpc3QiKQorCisgICAgZGVmIENoZWNrU3FsaXRlUm93KHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5Sb3cpLAorICAgICAgICAgICAgICAgICAgICAgICAgInJvdyBpcyBub3QgaW5zdGFuY2Ugb2Ygc3FsaXRlLlJvdyIpCisKKyAgICAgICAgY29sMSwgY29sMiA9IHJvd1siYSJdLCByb3dbImIiXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMSA9PSAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDIgPT0gMiwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdhJyIpCisKKyAgICAgICAgY29sMSwgY29sMiA9IHJvd1siQSJdLCByb3dbIkIiXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMSA9PSAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0EnIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDIgPT0gMiwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdCJyIpCisKKyAgICAgICAgY29sMSwgY29sMiA9IHJvd1swXSwgcm93WzFdCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjb2wxID09IDEsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gMCIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjb2wyID09IDIsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gMSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworY2xhc3MgVGV4dEZhY3RvcnlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICBkZWYgQ2hlY2tVbmljb2RlKHNlbGYpOgorICAgICAgICBhdXN0cmlhID0gdW5pY29kZSgi1nN0ZXJyZWljaCIsICJsYXRpbjEiKQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKKworICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3RyCisgICAgICAgIGF1c3RyaWEgPSB1bmljb2RlKCLWc3RlcnJlaWNoIiwgImxhdGluMSIpCisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShyb3dbMF0pID09IHN0ciwgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgc3RyIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJvd1swXSA9PSBhdXN0cmlhLmVuY29kZSgidXRmLTgiKSwgImNvbHVtbiBtdXN0IGVxdWFsIG9yaWdpbmFsIGRhdGEgaW4gVVRGLTgiKQorCisgICAgZGVmIENoZWNrQ3VzdG9tKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBsYW1iZGEgeDogdW5pY29kZSh4LCAidXRmLTgiLCAiaWdub3JlIikKKyAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYS5lbmNvZGUoImxhdGluMSIpLCkpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJvd1swXS5lbmRzd2l0aCh1InJlaWNoIiksICJjb2x1bW4gbXVzdCBjb250YWluIG9yaWdpbmFsIGRhdGEiKQorCisgICAgZGVmIENoZWNrT3B0aW1pemVkVW5pY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKKyAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKKyAgICAgICAgZ2VybWFueSA9IHVuaWNvZGUoIkRldXRjaGxhbmQiKQorICAgICAgICBhX3JvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQorICAgICAgICBkX3JvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGdlcm1hbnksKSkuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShhX3Jvd1swXSkgPT0gdW5pY29kZSwgInR5cGUgb2Ygbm9uLUFTQ0lJIHJvdyBtdXN0IGJlIHVuaWNvZGUiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShkX3Jvd1swXSkgPT0gc3RyLCAidHlwZSBvZiBBU0NJSS1vbmx5IHJvdyBtdXN0IGJlIHN0ciIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworZGVmIHN1aXRlKCk6CisgICAgY29ubmVjdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25uZWN0aW9uRmFjdG9yeVRlc3RzLCAiQ2hlY2siKQorICAgIGN1cnNvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDdXJzb3JGYWN0b3J5VGVzdHMsICJDaGVjayIpCisgICAgcm93X3N1aXRlX2NvbXBhdCA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSb3dGYWN0b3J5VGVzdHNCYWNrd2FyZHNDb21wYXQsICJDaGVjayIpCisgICAgcm93X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFJvd0ZhY3RvcnlUZXN0cywgIkNoZWNrIikKKyAgICB0ZXh0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRleHRGYWN0b3J5VGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29ubmVjdGlvbl9zdWl0ZSwgY3Vyc29yX3N1aXRlLCByb3dfc3VpdGVfY29tcGF0LCByb3dfc3VpdGUsIHRleHRfc3VpdGUpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWY3Yjg4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQpAQCAtMCwwICsxLDExNSBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi90ZXN0L2hvb2tzLnB5OiB0ZXN0cyBmb3IgdmFyaW91cyBTUUxpdGUtc3BlY2lmaWMgaG9va3MKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgb3MsIHVuaXR0ZXN0CitpbXBvcnQgcHlzcWxpdGUyLmRiYXBpMiBhcyBzcWxpdGUKKworY2xhc3MgQ29sbGF0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tDcmVhdGVDb2xsYXRpb25Ob3RDYWxsYWJsZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIlgiLCA0MikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVHlwZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInBhcmFtZXRlciBtdXN0IGJlIGNhbGxhYmxlIikKKworICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdEFzY2lpKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiY29sbOQiLCBjbXApCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3IsIGU6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tDb2xsYXRpb25Jc1VzZWQoc2VsZik6CisgICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CisgICAgICAgICAgICAjIHJldmVyc2Ugb3JkZXIKKyAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCisKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIG15Y29sbCkKKyAgICAgICAgc3FsID0gIiIiCisgICAgICAgICAgICBzZWxlY3QgeCBmcm9tICgKKyAgICAgICAgICAgIHNlbGVjdCAnYScgYXMgeAorICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgIHNlbGVjdCAnYicgYXMgeAorICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgIHNlbGVjdCAnYycgYXMgeAorICAgICAgICAgICAgKSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCisgICAgICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoc3FsKS5mZXRjaGFsbCgpCisgICAgICAgIGlmIHJlc3VsdFswXVswXSAhPSAiYyIgb3IgcmVzdWx0WzFdWzBdICE9ICJiIiBvciByZXN1bHRbMl1bMF0gIT0gImEiOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ0aGUgZXhwZWN0ZWQgb3JkZXIgd2FzIG5vdCByZXR1cm5lZCIpCisKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgIm5vIHN1Y2ggY29sbGF0aW9uIHNlcXVlbmNlOiBteWNvbGwiKQorCisgICAgZGVmIENoZWNrQ29sbGF0aW9uUmVnaXN0ZXJUd2ljZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlZ2lzdGVyIHR3byBkaWZmZXJlbnQgY29sbGF0aW9uIGZ1bmN0aW9ucyB1bmRlciB0aGUgc2FtZSBuYW1lLgorICAgICAgICBWZXJpZnkgdGhhdCB0aGUgbGFzdCBvbmUgaXMgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBjbXApCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogLWNtcCh4LCB5KSkKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoIiIiCisgICAgICAgICAgICBzZWxlY3QgeCBmcm9tIChzZWxlY3QgJ2EnIGFzIHggdW5pb24gc2VsZWN0ICdiJyBhcyB4KSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCisgICAgICAgICAgICAiIiIpLmZldGNoYWxsKCkKKyAgICAgICAgaWYgcmVzdWx0WzBdWzBdICE9ICdiJyBvciByZXN1bHRbMV1bMF0gIT0gJ2EnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBjb2xsYXRpb24gZnVuY3Rpb24gaXMgdXNlZCIpCisKKyAgICBkZWYgQ2hlY2tEZXJlZ2lzdGVyQ29sbGF0aW9uKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVnaXN0ZXIgYSBjb2xsYXRpb24sIHRoZW4gZGVyZWdpc3RlciBpdC4gTWFrZSBzdXJlIGFuIGVycm9yIGlzIHJhaXNlZCBpZiB3ZSB0cnkKKyAgICAgICAgdG8gdXNlIGl0LgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGNtcCkKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgJ2EnIGFzIHggdW5pb24gc2VsZWN0ICdiJyBhcyB4IG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIGlmIG5vdCBlLmFyZ3NbMF0uc3RhcnRzd2l0aCgibm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2UiKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIE9wZXJhdGlvbmFsRXJyb3IgcmFpc2VkIikKKworZGVmIHN1aXRlKCk6CisgICAgY29sbGF0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbGxhdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGNvbGxhdGlvbl9zdWl0ZSwpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4YWRhNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQpAQCAtMCwwICsxLDQ4IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvcmVncmVzc2lvbi5weTogcHlzcWxpdGUgcmVncmVzc2lvbiB0ZXN0cworIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHB5c3FsaXRlMi5kYmFwaTIgYXMgc3FsaXRlCisKK2NsYXNzIFJlZ3Jlc3Npb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja1ByYWdtYVVzZXJWZXJzaW9uKHNlbGYpOgorICAgICAgICAjIFRoaXMgdXNlZCB0byBjcmFzaCBweXNxbGl0ZSBiZWNhdXNlIHRoaXMgcHJhZ21hIGNvbW1hbmQgcmV0dXJucyBOVUxMIGZvciB0aGUgY29sdW1uIG5hbWUKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInByYWdtYSB1c2VyX3ZlcnNpb24iKQorCitkZWYgc3VpdGUoKToKKyAgICByZWdyZXNzaW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFJlZ3Jlc3Npb25UZXN0cywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChyZWdyZXNzaW9uX3N1aXRlLCkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwYjE5YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5CkBAIC0wLDAgKzEsMTU2IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvdHJhbnNhY3Rpb25zLnB5OiB0ZXN0cyB0cmFuc2FjdGlvbnMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgb3MsIHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworZGVmIGdldF9kYl9wYXRoKCk6CisgICAgcmV0dXJuICJzcWxpdGVfdGVzdGRiIgorCitjbGFzcyBUcmFuc2FjdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShnZXRfZGJfcGF0aCgpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5jb24xID0gc3FsaXRlLmNvbm5lY3QoZ2V0X2RiX3BhdGgoKSwgdGltZW91dD0wLjEpCisgICAgICAgIHNlbGYuY3VyMSA9IHNlbGYuY29uMS5jdXJzb3IoKQorCisgICAgICAgIHNlbGYuY29uMiA9IHNxbGl0ZS5jb25uZWN0KGdldF9kYl9wYXRoKCksIHRpbWVvdXQ9MC4xKQorICAgICAgICBzZWxmLmN1cjIgPSBzZWxmLmNvbjIuY3Vyc29yKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24xLmNsb3NlKCkKKworICAgICAgICBzZWxmLmN1cjIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbjIuY2xvc2UoKQorCisgICAgICAgIG9zLnVubGluayhnZXRfZGJfcGF0aCgpKQorCisgICAgZGVmIENoZWNrRE1MZG9lc0F1dG9Db21taXRCZWZvcmUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QyKGopIikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAxKQorCisgICAgZGVmIENoZWNrSW5zZXJ0U3RhcnRzVHJhbnNhY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDApCisKKyAgICBkZWYgQ2hlY2tVcGRhdGVTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgidXBkYXRlIHRlc3Qgc2V0IGk9NiIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsIDUpCisKKyAgICBkZWYgQ2hlY2tEZWxldGVTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKworICAgIGRlZiBDaGVja1JlcGxhY2VTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgicmVwbGFjZSBpbnRvIHRlc3QoaSkgdmFsdWVzICg2KSIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzBdWzBdLCA1KQorCisgICAgZGVmIENoZWNrVG9nZ2xlQXV0b0NvbW1pdChzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5pc29sYXRpb25fbGV2ZWwgPSBOb25lCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY29uMS5pc29sYXRpb25fbGV2ZWwsIE5vbmUpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKworICAgICAgICBzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsID0gIkRFRkVSUkVEIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsICwgIkRFRkVSUkVEIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKworICAgIGRlZiBDaGVja1JhaXNlVGltZW91dChzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisKK2NsYXNzIFNwZWNpYWxDb21tYW5kVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisKKyAgICBkZWYgQ2hlY2tWYWN1dW0oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgidmFjdXVtIikKKworICAgIGRlZiBDaGVja0Ryb3BUYWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJkcm9wIHRhYmxlIHRlc3QiKQorCisgICAgZGVmIENoZWNrUHJhZ21hKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInByYWdtYSBjb3VudF9jaGFuZ2VzPTEiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworZGVmIHN1aXRlKCk6CisgICAgZGVmYXVsdF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUcmFuc2FjdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIHNwZWNpYWxfY29tbWFuZF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShTcGVjaWFsQ29tbWFuZFRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGRlZmF1bHRfc3VpdGUsIHNwZWNpYWxfY29tbWFuZF9zdWl0ZSkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OWY3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CkBAIC0wLDAgKzEsMzM5IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvdHlwZXMucHk6IHRlc3RzIGZvciB0eXBlIGNvbnZlcnNpb24gYW5kIGRldGVjdGlvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworY2xhc3MgU3FsaXRlVHlwZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpIGludGVnZXIsIHMgdmFyY2hhciwgZiBudW1iZXIsIGIgYmxvYikiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChzKSB2YWx1ZXMgKD8pIiwgKHUi1nN0ZXJyZWljaCIsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHMgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIHUi1nN0ZXJyZWljaCIpCisKKyAgICBkZWYgQ2hlY2tTbWFsbEludChzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCA0MikKKworICAgIGRlZiBDaGVja0xhcmdlSW50KHNlbGYpOgorICAgICAgICBudW0gPSAyKio0MAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAobnVtLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCBudW0pCisKKyAgICBkZWYgQ2hlY2tGbG9hdChzZWxmKToKKyAgICAgICAgdmFsID0gMy4xNAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoPykiLCAodmFsLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisKKyAgICBkZWYgQ2hlY2tCbG9iKHNlbGYpOgorICAgICAgICB2YWwgPSBidWZmZXIoIkd1Z2xodXBmIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYiBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgdmFsKQorCisgICAgZGVmIENoZWNrVW5pY29kZUV4ZWN1dGUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUodSJzZWxlY3QgJ9ZzdGVycmVpY2gnIikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIHUi1nN0ZXJyZWljaCIpCisKK2NsYXNzIERlY2xUeXBlc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBjbGFzcyBGb286CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfdmFsKToKKyAgICAgICAgICAgIHNlbGYudmFsID0gX3ZhbAorCisgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBEZWNsVHlwZXNUZXN0cy5Gb28pOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgIGlmIHNlbGYudmFsID09IG90aGVyLnZhbDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIGRlZiBfX2NvbmZvcm1fXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgICAgICBpZiBwcm90b2NvbCBpcyBzcWxpdGUuUHJlcGFyZVByb3RvY29sOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICI8JXM+IiAlIHNlbGYudmFsCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSBpbnQsIHMgc3RyLCBmIGZsb2F0LCBiIGJvb2wsIHUgdW5pY29kZSwgZm9vIGZvbywgYmluIGJsb2IpIikKKworICAgICAgICAjIG92ZXJyaWRlIGZsb2F0LCBtYWtlIHRoZW0gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBudW1iZXIKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImZsb2F0Il0gPSBsYW1iZGEgeDogNDcuMgorCisgICAgICAgICMgYW5kIGltcGxlbWVudCB0d28gY3VzdG9tIG9uZXMKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImJvb2wiXSA9IGxhbWJkYSB4OiBib29sKGludCh4KSkKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImZvbyJdID0gRGVjbFR5cGVzVGVzdHMuRm9vCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZmxvYXQiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImJvb2wiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImZvbyJdCisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrU3RyaW5nKHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChzKSB2YWx1ZXMgKD8pIiwgKCJmb28iLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBzIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAiZm9vIikKKworICAgIGRlZiBDaGVja1NtYWxsSW50KHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCA0MikKKworICAgIGRlZiBDaGVja0xhcmdlSW50KHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgbnVtID0gMioqNDAKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKG51bSwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgbnVtKQorCisgICAgZGVmIENoZWNrRmxvYXQoc2VsZik6CisgICAgICAgICMgY3VzdG9tCisgICAgICAgIHZhbCA9IDMuMTQKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZiBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgNDcuMikKKworICAgIGRlZiBDaGVja0Jvb2woc2VsZik6CisgICAgICAgICMgY3VzdG9tCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsIChGYWxzZSwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYiBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgRmFsc2UpCisKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsIChUcnVlLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCBUcnVlKQorCisgICAgZGVmIENoZWNrVW5pY29kZShzZWxmKToKKyAgICAgICAgIyBkZWZhdWx0CisgICAgICAgIHZhbCA9IHUiXHhkNnN0ZXJyZWljaCIKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh1KSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdSBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgdmFsKQorCisgICAgZGVmIENoZWNrRm9vKHNlbGYpOgorICAgICAgICB2YWwgPSBEZWNsVHlwZXNUZXN0cy5Gb28oImJsYSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZm9vIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisKKyAgICBkZWYgQ2hlY2tVbnN1cHBvcnRlZFNlcShzZWxmKToKKyAgICAgICAgY2xhc3MgQmFyOiBwYXNzCisgICAgICAgIHZhbCA9IEJhcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZikgdmFsdWVzICg/KSIsICh2YWwsKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEludGVyZmFjZUVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5JbnRlcmZhY2VFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gSW50ZXJmYWNlRXJyb3IiKQorCisgICAgZGVmIENoZWNrVW5zdXBwb3J0ZWREaWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBCYXI6IHBhc3MKKyAgICAgICAgdmFsID0gQmFyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKDp2YWwpIiwgeyJ2YWwiOiB2YWx9KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gSW50ZXJmYWNlRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkludGVyZmFjZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tCbG9iKHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgdmFsID0gYnVmZmVyKCJHdWdsaHVwZiIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYmluKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYmluIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisKK2NsYXNzIENvbE5hbWVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBkZXRlY3RfdHlwZXM9c3FsaXRlLlBBUlNFX0NPTE5BTUVTfHNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoeCBmb28pIikKKworICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZm9vIl0gPSBsYW1iZGEgeDogIlslc10iICUgeAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siYmFyIl0gPSBsYW1iZGEgeDogIjwlcz4iICUgeAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZXhjIl0gPSBsYW1iZGEgeDogNS8wCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZm9vIl0KKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJiYXIiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImV4YyJdCisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrRGVjbFR5cGUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsICgieHh4IiwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgeCBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgIlt4eHhdIikKKworICAgIGRlZiBDaGVja05vbmUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsIChOb25lLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB4IGZyb20gdGVzdCIpCisgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorCisgICAgZGVmIENoZWNrRXhjKHNlbGYpOgorICAgICAgICAjIEV4Y2VwdGlvbnMgaW4gdHlwZSBjb252ZXJ0ZXJzIHJlc3VsdCBpbiByZXR1cm5lZCBOb25lcworICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgNSBhcyAieCBbZXhjXSInKQorICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKworICAgIGRlZiBDaGVja0NvbE5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsICgieHh4IiwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgeCBhcyAieCBbYmFyXSIgZnJvbSB0ZXN0JykKKyAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsICI8eHh4PiIpCisKKyAgICAgICAgIyBDaGVjayBpZiB0aGUgc3RyaXBwaW5nIG9mIGNvbG5hbWVzIHdvcmtzLiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdAorICAgICAgICAjIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHN0cmlwcGVkLgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1ci5kZXNjcmlwdGlvblswXVswXSwgIngiKQorCisgICAgZGVmIENoZWNrQ3Vyc29yRGVzY3JpcHRpb25Ob1JvdyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIGN1cnNvci5kZXNjcmlwdGlvbiBzaG91bGQgYXQgbGVhc3QgcHJvdmlkZSB0aGUgY29sdW1uIG5hbWUocyksIGV2ZW4gaWYKKyAgICAgICAgbm8gcm93IHJldHVybmVkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIDAgPSAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuY3VyLmRlc2NyaXB0aW9uWzBdWzBdID09ICJ4IikKKworY2xhc3MgT2JqZWN0QWRhcHRhdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgY2FzdChvYmopOgorICAgICAgICByZXR1cm4gZmxvYXQob2JqKQorICAgIGNhc3QgPSBzdGF0aWNtZXRob2QoY2FzdCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc3FsaXRlLmFkYXB0ZXJzW2ludF0KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBzcWxpdGUucmVnaXN0ZXJfYWRhcHRlcihpbnQsIE9iamVjdEFkYXB0YXRpb25UZXN0cy5jYXN0KQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzcWxpdGUuYWRhcHRlcnNbKGludCwgc3FsaXRlLlByZXBhcmVQcm90b2NvbCldCisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrQ2FzdGVySXNVc2VkKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgPyIsICg0LCkpCisgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBmbG9hdCkKKworY2xhc3MgRGF0ZVRpbWVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfREVDTFRZUEVTKQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGQgZGF0ZSwgdHMgdGltZXN0YW1wKSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrU3FsaXRlRGF0ZShzZWxmKToKKyAgICAgICAgZCA9IHNxbGl0ZS5EYXRlKDIwMDQsIDIsIDE0KQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGQpIHZhbHVlcyAoPykiLCAoZCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZCBmcm9tIHRlc3QiKQorICAgICAgICBkMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZCwgZDIpCisKKyAgICBkZWYgQ2hlY2tTcWxpdGVUaW1lc3RhbXAoc2VsZik6CisgICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDApCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoPykiLCAodHMsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCisgICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHMsIHRzMikKKworICAgIGRlZiBDaGVja1NxbFRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgIyBUaGUgZGF0ZSBmdW5jdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIFNRTGl0ZSB2ZXJzaW9uIDMuMSBvciBsYXRlcgorICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAxKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgU1FMaXRlJ3MgY3VycmVudF90aW1lc3RhbXAgdXNlcyBVVEMgdGltZSwgd2hpbGUgZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkgdXNlcyBsb2NhbCB0aW1lLgorICAgICAgICBub3cgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKGN1cnJlbnRfdGltZXN0YW1wKSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQorICAgICAgICB0cyA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh0cyksIGRhdGV0aW1lLmRhdGV0aW1lKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0cy55ZWFyLCBub3cueWVhcikKKworICAgIGRlZiBDaGVja0RhdGVUaW1lU3ViU2Vjb25kcyhzZWxmKToKKyAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wKDIwMDQsIDIsIDE0LCA3LCAxNSwgMCwgNTAwMDAwKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKD8pIiwgKHRzLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQorICAgICAgICB0czIgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRzLCB0czIpCisKK2RlZiBzdWl0ZSgpOgorICAgIHNxbGl0ZV90eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFNxbGl0ZVR5cGVUZXN0cywgIkNoZWNrIikKKyAgICBkZWNsdHlwZXNfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShEZWNsVHlwZXNUZXN0cywgIkNoZWNrIikKKyAgICBjb2xuYW1lc190eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbE5hbWVzVGVzdHMsICJDaGVjayIpCisgICAgYWRhcHRhdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShPYmplY3RBZGFwdGF0aW9uVGVzdHMsICJDaGVjayIpCisgICAgZGF0ZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShEYXRlVGltZVRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKHNxbGl0ZV90eXBlX3N1aXRlLCBkZWNsdHlwZXNfdHlwZV9zdWl0ZSwgY29sbmFtZXNfdHlwZV9zdWl0ZSwgYWRhcHRhdGlvbl9zdWl0ZSwgZGF0ZV9zdWl0ZSkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjdkYjljCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CkBAIC0wLDAgKzEsMzMwIEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weTogdGVzdHMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYW5kCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZXMuCisjCisjIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworZGVmIGZ1bmNfcmV0dXJudGV4dCgpOgorICAgIHJldHVybiAiZm9vIgorZGVmIGZ1bmNfcmV0dXJudW5pY29kZSgpOgorICAgIHJldHVybiB1ImJhciIKK2RlZiBmdW5jX3JldHVybmludCgpOgorICAgIHJldHVybiA0MgorZGVmIGZ1bmNfcmV0dXJuZmxvYXQoKToKKyAgICByZXR1cm4gMy4xNAorZGVmIGZ1bmNfcmV0dXJubnVsbCgpOgorICAgIHJldHVybiBOb25lCitkZWYgZnVuY19yZXR1cm5ibG9iKCk6CisgICAgcmV0dXJuIGJ1ZmZlcigiYmxvYiIpCitkZWYgZnVuY19yYWlzZWV4Y2VwdGlvbigpOgorICAgIDUvMAorCitkZWYgZnVuY19pc3N0cmluZyh2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyB1bmljb2RlCitkZWYgZnVuY19pc2ludCh2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyBpbnQKK2RlZiBmdW5jX2lzZmxvYXQodik6CisgICAgcmV0dXJuIHR5cGUodikgaXMgZmxvYXQKK2RlZiBmdW5jX2lzbm9uZSh2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyB0eXBlKE5vbmUpCitkZWYgZnVuY19pc2Jsb2Iodik6CisgICAgcmV0dXJuIHR5cGUodikgaXMgYnVmZmVyCisKK2NsYXNzIEFnZ3JOb1N0ZXA6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIEFnZ3JOb0ZpbmFsaXplOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHN0ZXAoc2VsZiwgeCk6CisgICAgICAgIHBhc3MKKworY2xhc3MgQWdnckV4Y2VwdGlvbkluSW5pdDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIDUvMAorCisgICAgZGVmIHN0ZXAoc2VsZiwgeCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBBZ2dyRXhjZXB0aW9uSW5TdGVwOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHN0ZXAoc2VsZiwgeCk6CisgICAgICAgIDUvMAorCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gNDIKKworY2xhc3MgQWdnckV4Y2VwdGlvbkluRmluYWxpemU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgc3RlcChzZWxmLCB4KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICA1LzAKKworY2xhc3MgQWdnckNoZWNrVHlwZToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudmFsID0gTm9uZQorCisgICAgZGVmIHN0ZXAoc2VsZiwgd2hpY2hUeXBlLCB2YWwpOgorICAgICAgICB0aGVUeXBlID0geyJzdHIiOiB1bmljb2RlLCAiaW50IjogaW50LCAiZmxvYXQiOiBmbG9hdCwgIk5vbmUiOiB0eXBlKE5vbmUpLCAiYmxvYiI6IGJ1ZmZlcn0KKyAgICAgICAgc2VsZi52YWwgPSBpbnQodGhlVHlwZVt3aGljaFR5cGVdIGlzIHR5cGUodmFsKSkKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsCisKK2NsYXNzIEFnZ3JTdW06CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbCA9IDAuMAorCisgICAgZGVmIHN0ZXAoc2VsZiwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgKz0gdmFsCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbAorCitjbGFzcyBGdW5jdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybnRleHQiLCAwLCBmdW5jX3JldHVybnRleHQpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJudW5pY29kZSIsIDAsIGZ1bmNfcmV0dXJudW5pY29kZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5pbnQiLCAwLCBmdW5jX3JldHVybmludCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5mbG9hdCIsIDAsIGZ1bmNfcmV0dXJuZmxvYXQpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJubnVsbCIsIDAsIGZ1bmNfcmV0dXJubnVsbCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5ibG9iIiwgMCwgZnVuY19yZXR1cm5ibG9iKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJhaXNlZXhjZXB0aW9uIiwgMCwgZnVuY19yYWlzZWV4Y2VwdGlvbikKKworICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzc3RyaW5nIiwgMSwgZnVuY19pc3N0cmluZykKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2ludCIsIDEsIGZ1bmNfaXNpbnQpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNmbG9hdCIsIDEsIGZ1bmNfaXNmbG9hdCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc25vbmUiLCAxLCBmdW5jX2lzbm9uZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2Jsb2IiLCAxLCBmdW5jX2lzYmxvYikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrRnVuY1JlZkNvdW50KHNlbGYpOgorICAgICAgICBkZWYgZ2V0ZnVuYygpOgorICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsCisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJlZnRlc3QiLCAwLCBnZXRmdW5jKCkpCisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmVmdGVzdCgpIikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5UZXh0KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnRleHQoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAiZm9vIikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5Vbmljb2RlKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnVuaWNvZGUoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCB1ImJhciIpCisKKyAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuSW50KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmludCgpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBpbnQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgNDIpCisKKyAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuRmxvYXQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuZmxvYXQoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgZmxvYXQpCisgICAgICAgIGlmIHZhbCA8IDMuMTM5IG9yIHZhbCA+IDMuMTQxOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyB2YWx1ZSIpCisKKyAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuTnVsbChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5udWxsKCkiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIHR5cGUoTm9uZSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5CbG9iKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmJsb2IoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgYnVmZmVyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIGJ1ZmZlcigiYmxvYiIpKQorCisgICAgZGVmIENoZWNrRnVuY0V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByYWlzZWV4Y2VwdGlvbigpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorCisgICAgZGVmIENoZWNrUGFyYW1TdHJpbmcoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNzdHJpbmcoPykiLCAoImZvbyIsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrUGFyYW1JbnQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNpbnQoPykiLCAoNDIsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrUGFyYW1GbG9hdChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Zsb2F0KD8pIiwgKDMuMTQsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrUGFyYW1Ob25lKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzbm9uZSg/KSIsIChOb25lLCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja1BhcmFtQmxvYihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Jsb2IoPykiLCAoYnVmZmVyKCJibG9iIiksKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCitjbGFzcyBBZ2dyZWdhdGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHRlc3QoCisgICAgICAgICAgICAgICAgdCB0ZXh0LAorICAgICAgICAgICAgICAgIGkgaW50ZWdlciwKKyAgICAgICAgICAgICAgICBmIGZsb2F0LAorICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgYiBibG9iCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgIiIiKQorICAgICAgICBjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0LCBpLCBmLCBuLCBiKSB2YWx1ZXMgKD8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICgiZm9vIiwgNSwgMy4xNCwgTm9uZSwgYnVmZmVyKCJibG9iIiksKSkKKworICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJub3N0ZXAiLCAxLCBBZ2dyTm9TdGVwKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJub2ZpbmFsaXplIiwgMSwgQWdnck5vRmluYWxpemUpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y0luaXQiLCAxLCBBZ2dyRXhjZXB0aW9uSW5Jbml0KQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNTdGVwIiwgMSwgQWdnckV4Y2VwdGlvbkluU3RlcCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjRmluYWxpemUiLCAxLCBBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiY2hlY2tUeXBlIiwgMiwgQWdnckNoZWNrVHlwZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgibXlzdW0iLCAxLCBBZ2dyU3VtKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICAjc2VsZi5jb24uY2xvc2UoKQorICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tBZ2dyTm9TdGVwKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG5vc3RlcCh0KSBmcm9tIHRlc3QiKQorCisgICAgZGVmIENoZWNrQWdnck5vRmluYWxpemUoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5Jbml0KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0luaXQodCkgZnJvbSB0ZXN0IikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorCisgICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluU3RlcChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNTdGVwKHQpIGZyb20gdGVzdCIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgNDIpCisKKyAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNGaW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbVN0cihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ3N0cicsID8pIiwgKCJmb28iLCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtSW50KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnaW50JywgPykiLCAoNDIsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1GbG9hdChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2Zsb2F0JywgPykiLCAoMy4xNCwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbU5vbmUoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdOb25lJywgPykiLCAoTm9uZSwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdibG9iJywgPykiLCAoYnVmZmVyKCJibG9iIiksKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrQWdnckNoZWNrQWdnclN1bShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQorICAgICAgICBjdXIuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsIFsoMTAsKSwgKDIwLCksICgzMCwpXSkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBteXN1bShpKSBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDYwKQorCitkZWYgc3VpdGUoKToKKyAgICBmdW5jdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShGdW5jdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIGFnZ3JlZ2F0ZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBZ2dyZWdhdGVUZXN0cywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChmdW5jdGlvbl9zdWl0ZSwgYWdncmVnYXRlX3N1aXRlKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3NyZS5weSBiL0xpYi9zcmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwMDk0YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zcmUucHkKQEAgLTAsMCArMSwxMCBAQAorIiIiVGhpcyBmaWxlIGlzIG9ubHkgcmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICBzcmUgd2FzIG1vdmVkIHRvIHJlIGluIHZlcnNpb24gMi41LgorIiIiCisKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3Mud2FybigiVGhlIHNyZSBtb2R1bGUgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIGltcG9ydCByZS4iLAorICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisKK2Zyb20gcmUgaW1wb3J0ICoKK2Zyb20gcmUgaW1wb3J0IF9fYWxsX18KZGlmZiAtLWdpdCBhL0xpYi9zdWJwcm9jZXNzLnB5IGIvTGliL3N1YnByb2Nlc3MucHkKaW5kZXggNjgyNzI0NC4uM2NkMGRmNSAxMDA2NDQKLS0tIGEvTGliL3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3N1YnByb2Nlc3MucHkKQEAgLTQxNCw3ICs0MTQsMTMgQEAKIAogZGVmIF9jbGVhbnVwKCk6CiAgICAgZm9yIGluc3QgaW4gX2FjdGl2ZVs6XToKLSAgICAgICAgaW5zdC5wb2xsKCkKKyAgICAgICAgaWYgaW5zdC5wb2xsKF9kZWFkc3RhdGU9c3lzLm1heGludCkgPj0gMDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShpbnN0KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBUaGlzIGNhbiBoYXBwZW4gaWYgdHdvIHRocmVhZHMgY3JlYXRlIGEgbmV3IFBvcGVuIGluc3RhbmNlLgorICAgICAgICAgICAgICAgICMgSXQncyBoYXJtbGVzcyB0aGF0IGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQsIHNvIGlnbm9yZS4KKyAgICAgICAgICAgICAgICBwYXNzCiAKIFBJUEUgPSAtMQogU1RET1VUID0gLTIKQEAgLTUyNyw2ICs1MzMsNyBAQAogICAgICAgICAiIiJDcmVhdGUgbmV3IFBvcGVuIGluc3RhbmNlLiIiIgogICAgICAgICBfY2xlYW51cCgpCiAKKyAgICAgICAgc2VsZi5fY2hpbGRfY3JlYXRlZCA9IEZhbHNlCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ1ZnNpemUsIChpbnQsIGxvbmcpKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYnVmc2l6ZSBtdXN0IGJlIGFuIGludGVnZXIiKQogCkBAIC01OTIsMTQgKzU5OSwyNCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyciA9IG9zLmZkb3BlbihlcnJyZWFkLCAncmInLCBidWZzaXplKQogCi0gICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCi0KIAogICAgIGRlZiBfdHJhbnNsYXRlX25ld2xpbmVzKHNlbGYsIGRhdGEpOgogICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJcclxuIiwgIlxuIikKICAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHIiLCAiXG4iKQogICAgICAgICByZXR1cm4gZGF0YQogCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2NoaWxkX2NyZWF0ZWQ6CisgICAgICAgICAgICAjIFdlIGRpZG4ndCBnZXQgdG8gc3VjY2Vzc2Z1bGx5IGNyZWF0ZSBhIGNoaWxkIHByb2Nlc3MuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBJbiBjYXNlIHRoZSBjaGlsZCBoYXNuJ3QgYmVlbiB3YWl0ZWQgb24sIGNoZWNrIGlmIGl0J3MgZG9uZS4KKyAgICAgICAgc2VsZi5wb2xsKF9kZWFkc3RhdGU9c3lzLm1heGludCkKKyAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICAjIENoaWxkIGlzIHN0aWxsIHJ1bm5pbmcsIGtlZXAgdXMgYWxpdmUgdW50aWwgd2UgY2FuIHdhaXQgb24gaXQuCisgICAgICAgICAgICBfYWN0aXZlLmFwcGVuZChzZWxmKQorCisKICAgICBkZWYgY29tbXVuaWNhdGUoc2VsZiwgaW5wdXQ9Tm9uZSk6CiAgICAgICAgICIiIkludGVyYWN0IHdpdGggcHJvY2VzczogU2VuZCBkYXRhIHRvIHN0ZGluLiAgUmVhZCBkYXRhIGZyb20KICAgICAgICAgc3Rkb3V0IGFuZCBzdGRlcnIsIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuICBXYWl0IGZvcgpAQCAtNzc3LDYgKzc5NCw3IEBACiAgICAgICAgICAgICAgICAgcmFpc2UgV2luZG93c0Vycm9yKCplLmFyZ3MpCiAKICAgICAgICAgICAgICMgUmV0YWluIHRoZSBwcm9jZXNzIGhhbmRsZSwgYnV0IGNsb3NlIHRoZSB0aHJlYWQgaGFuZGxlCisgICAgICAgICAgICBzZWxmLl9jaGlsZF9jcmVhdGVkID0gVHJ1ZQogICAgICAgICAgICAgc2VsZi5faGFuZGxlID0gaHAKICAgICAgICAgICAgIHNlbGYucGlkID0gcGlkCiAgICAgICAgICAgICBodC5DbG9zZSgpCkBAIC03OTUsMTMgKzgxMywxMiBAQAogICAgICAgICAgICAgICAgIGVycndyaXRlLkNsb3NlKCkKIAogCi0gICAgICAgIGRlZiBwb2xsKHNlbGYpOgorICAgICAgICBkZWYgcG9sbChzZWxmLCBfZGVhZHN0YXRlPU5vbmUpOgogICAgICAgICAgICAgIiIiQ2hlY2sgaWYgY2hpbGQgcHJvY2VzcyBoYXMgdGVybWluYXRlZC4gIFJldHVybnMgcmV0dXJuY29kZQogICAgICAgICAgICAgYXR0cmlidXRlLiIiIgogICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgaWYgV2FpdEZvclNpbmdsZU9iamVjdChzZWxmLl9oYW5kbGUsIDApID09IFdBSVRfT0JKRUNUXzA6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IEdldEV4aXRDb2RlUHJvY2VzcyhzZWxmLl9oYW5kbGUpCi0gICAgICAgICAgICAgICAgICAgIF9hY3RpdmUucmVtb3ZlKHNlbGYpCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCiAKIApAQCAtODExLDcgKzgyOCw2IEBACiAgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKICAgICAgICAgICAgICAgICBvYmogPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KHNlbGYuX2hhbmRsZSwgSU5GSU5JVEUpCiAgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gR2V0RXhpdENvZGVQcm9jZXNzKHNlbGYuX2hhbmRsZSkKLSAgICAgICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShzZWxmKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuY29kZQogCiAKQEAgLTk1OCw2ICs5NzQsNyBAQAogICAgICAgICAgICAgc2VsZi5fc2V0X2Nsb2V4ZWNfZmxhZyhlcnJwaXBlX3dyaXRlKQogCiAgICAgICAgICAgICBzZWxmLnBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgc2VsZi5fY2hpbGRfY3JlYXRlZCA9IFRydWUKICAgICAgICAgICAgIGlmIHNlbGYucGlkID09IDA6CiAgICAgICAgICAgICAgICAgIyBDaGlsZAogICAgICAgICAgICAgICAgIHRyeToKQEAgLTEwNDIsMTAgKzEwNTksOCBAQAogICAgICAgICAgICAgICAgICMgU2hvdWxkIG5ldmVyIGhhcHBlbgogICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiVW5rbm93biBjaGlsZCBleGl0IHN0YXR1cyEiKQogCi0gICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShzZWxmKQogCi0KLSAgICAgICAgZGVmIHBvbGwoc2VsZik6CisgICAgICAgIGRlZiBwb2xsKHNlbGYsIF9kZWFkc3RhdGU9Tm9uZSk6CiAgICAgICAgICAgICAiIiJDaGVjayBpZiBjaGlsZCBwcm9jZXNzIGhhcyB0ZXJtaW5hdGVkLiAgUmV0dXJucyByZXR1cm5jb2RlCiAgICAgICAgICAgICBhdHRyaWJ1dGUuIiIiCiAgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKQEAgLTEwNTQsNyArMTA2OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIHBpZCA9PSBzZWxmLnBpZDoKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9leGl0c3RhdHVzKHN0cykKICAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgaWYgX2RlYWRzdGF0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IF9kZWFkc3RhdGUKICAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVsbmV0bGliLnB5IGIvTGliL3RlbG5ldGxpYi5weQppbmRleCA4YTI1MTNiLi4zNTIzMDM3IDEwMDY0NAotLS0gYS9MaWIvdGVsbmV0bGliLnB5CisrKyBiL0xpYi90ZWxuZXRsaWIucHkKQEAgLTQzOCw3ICs0MzgsNyBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pYWNzZXEgKz0gYwogICAgICAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYuaWFjc2VxKSA9PSAxOgotICAgICAgICAgICAgICAgICAgICAnSUFDOiBJQUMgQ01EIFtPUFRJT04gb25seSBmb3IgV0lMTC9XT05UL0RPL0RPTlRdJworICAgICAgICAgICAgICAgICAgICAjICdJQUM6IElBQyBDTUQgW09QVElPTiBvbmx5IGZvciBXSUxML1dPTlQvRE8vRE9OVF0nCiAgICAgICAgICAgICAgICAgICAgIGlmIGMgaW4gKERPLCBET05ULCBXSUxMLCBXT05UKToKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWFjc2VxICs9IGMKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jaGVja19zb3VuZGNhcmQudmJzIGIvTGliL3Rlc3QvY2hlY2tfc291bmRjYXJkLnZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIxODUyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY2hlY2tfc291bmRjYXJkLnZicwpAQCAtMCwwICsxLDEzIEBACityZW0gQ2hlY2sgZm9yIGEgd29ya2luZyBzb3VuZC1jYXJkIC0gZXhpdCB3aXRoIDAgaWYgT0ssIDEgb3RoZXJ3aXNlLgorc2V0IHdtaSA9IEdldE9iamVjdCgid2lubWdtdHM6IikKK3NldCBzY3MgPSB3bWkuSW5zdGFuY2VzT2YoIndpbjMyX3NvdW5kZGV2aWNlIikKK2ZvciBlYWNoIHNjIGluIHNjcworICAgc2V0IHN0YXR1cyA9IHNjLlByb3BlcnRpZXNfKCJTdGF0dXMiKQorICAgd3NjcmlwdC5FY2hvKHNjLlByb3BlcnRpZXNfKCJOYW1lIikgKyAiLyIgKyBzdGF0dXMpCisgICBpZiBzdGF0dXMgPSAiT0siIHRoZW4KKyAgICAgICB3c2NyaXB0LlF1aXQgMCByZW0gbm9ybWFsIGV4aXQKKyAgIGVuZCBpZgorbmV4dAorcmVtIE5vIHNvdW5kIGNhcmQgZm91bmQgLSBleGl0IHdpdGggc3RhdHVzIGNvZGUgb2YgMQord3NjcmlwdC5RdWl0IDEKKwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvUkVBRE1FIGIvTGliL3Rlc3QvY3Jhc2hlcnMvUkVBRE1FCmluZGV4IDkzNjkyODIuLjA3MGMzZjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2NyYXNoZXJzL1JFQURNRQorKysgYi9MaWIvdGVzdC9jcmFzaGVycy9SRUFETUUKQEAgLTEzLDMgKzEzLDggQEAKIFB1dCBhcyBtdWNoIGluZm8gaW50byBhIGRvY3N0cmluZyBvciBjb21tZW50cyB0byBoZWxwIGRldGVybWluZQogdGhlIGNhdXNlIG9mIHRoZSBmYWlsdXJlLiAgUGFydGljdWxhcmx5IG5vdGUgaWYgdGhlIGNhdXNlIGlzCiBzeXN0ZW0gb3IgZW52aXJvbm1lbnQgZGVwZW5kZW50IGFuZCB3aGF0IHRoZSB2YXJpYWJsZXMgYXJlLgorCitPbmNlIHRoZSBjcmFzaCBpcyBmaXhlZCwgdGhlIHRlc3QgY2FzZSBzaG91bGQgYmUgbW92ZWQgaW50byBhbiBhcHByb3ByaWF0ZQordGVzdCAoZXZlbiBpZiBpdCB3YXMgb3JpZ2luYWxseSBmcm9tIHRoZSB0ZXN0IHN1aXRlKS4gIFRoaXMgZW5zdXJlcyB0aGUKK3JlZ3Jlc3Npb24gZG9lc24ndCBoYXBwZW4gYWdhaW4uICBBbmQgaWYgaXQgZG9lcywgaXQgc2hvdWxkIGJlIGVhc2llcgordG8gdHJhY2sgZG93bi4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL2RpY3RyZXNpemVfYXR0YWNrLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvZGljdHJlc2l6ZV9hdHRhY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5NTc5MQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2RpY3RyZXNpemVfYXR0YWNrLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyMgaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE0NTYyMDkKKworIyBBIGRpY3RyZXNpemUoKSBhdHRhY2suICBJZiBvbGR0YWJsZSA9PSBtcC0+bWFfc21hbGx0YWJsZSB0aGVuIHB1cmUKKyMgUHl0aG9uIGNvZGUgY2FuIG1hbmdsZSB3aXRoIG1wLT5tYV9zbWFsbHRhYmxlIHdoaWxlIGl0IGlzIGJlaW5nIHdhbGtlZAorIyBvdmVyLgorCitjbGFzcyBYKG9iamVjdCk6CisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiA1CisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgcmVzaXppbmc6CisgICAgICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworZCA9IHt9CisKK3Jlc2l6aW5nID0gRmFsc2UKKworZFtYKCldID0gMQorZFtYKCldID0gMgorZFtYKCldID0gMworZFtYKCldID0gNAorZFtYKCldID0gNQorCisjIG5vdyB0cmlnZ2VyIGEgcmVzaXplCityZXNpemluZyA9IFRydWUKK2RbOV0gPSA2CisKKyMgXl5eIEkgZ2V0IFNlZ21lbnRhdGlvbiBmYXVsdCBvciBJbGxlZ2FsIGluc3RydWN0aW9uIGhlcmUuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9uYXN0eV9lcV92c19kaWN0LnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvbmFzdHlfZXFfdnNfZGljdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjMwODNkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvbmFzdHlfZXFfdnNfZGljdC5weQpAQCAtMCwwICsxLDQ3IEBACisjIGZyb20gaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDAxLUp1bmUvMDE1MjM5Lmh0bWwKKworIyBpZiB5b3Uga2VlcCBjaGFuZ2luZyBhIGRpY3Rpb25hcnkgd2hpbGUgbG9va2luZyB1cCBhIGtleSwgeW91IGNhbgorIyBwcm92b2tlIGFuIGluZmluaXRlIHJlY3Vyc2lvbiBpbiBDCisKKyMgQXQgdGhlIHRpbWUgbmVpdGhlciBUaW0gbm9yIE1pY2hhZWwgY291bGQgYmUgYm90aGVyZWQgdG8gdGhpbmsgb2YgYQorIyB3YXkgdG8gZml4IGl0LgorCitjbGFzcyBZdWNrOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5pID0gMAorCisgICAgZGVmIG1ha2VfZGFuZ2Vyb3VzKHNlbGYpOgorICAgICAgICBzZWxmLmkgPSAxCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICMgZGlyZWN0IHRvIHNsb3QgNCBpbiB0YWJsZSBvZiBzaXplIDg7IHNsb3QgMTIgd2hlbiBzaXplIDE2CisgICAgICAgIHJldHVybiA0ICsgOAorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHNlbGYuaSA9PSAwOgorICAgICAgICAgICAgIyBsZWF2ZSBkaWN0IGFsb25lCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsaWYgc2VsZi5pID09IDE6CisgICAgICAgICAgICAjIGZpZGRsZSB0byAxNiBzbG90cworICAgICAgICAgICAgc2VsZi5fX2ZpbGxfZGljdCg2KQorICAgICAgICAgICAgc2VsZi5pID0gMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBmaWRkbGUgdG8gOCBzbG90cworICAgICAgICAgICAgc2VsZi5fX2ZpbGxfZGljdCg0KQorICAgICAgICAgICAgc2VsZi5pID0gMQorCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgX19maWxsX2RpY3Qoc2VsZiwgbik6CisgICAgICAgIHNlbGYuaSA9IDAKKyAgICAgICAgZGljdC5jbGVhcigpCisgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgZGljdFtpXSA9IGkKKyAgICAgICAgZGljdFtzZWxmXSA9ICJPSyEiCisKK3kgPSBZdWNrKCkKK2RpY3QgPSB7eTogIk9LISJ9CisKK3ogPSBZdWNrKCkKK3kubWFrZV9kYW5nZXJvdXMoKQorcHJpbnQgZGljdFt6XQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZW1wdHkudmJzIGIvTGliL3Rlc3QvZW1wdHkudmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNWYwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9lbXB0eS52YnMKQEAgLTAsMCArMSBAQAorJ0VtcHR5IFZCUyBmaWxlLCBkb2VzIG5vdGhpbmcuICBIZWxwZXIgZm9yIExpYlx0ZXN0XHRlc3Rfc3RhcnRmaWxlLnB5LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2Zvcmtfd2FpdC5weSBiL0xpYi90ZXN0L2Zvcmtfd2FpdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjAwYmRiCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvZm9ya193YWl0LnB5CkBAIC0wLDAgKzEsNzEgQEAKKyIiIlRoaXMgdGVzdCBjYXNlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGNoZWNraW5nIGZvcmtpbmcgYW5kIHdhaXQgYmVoYXZpb3IuCisKK1RvIHRlc3QgZGlmZmVyZW50IHdhaXQgYmVoYXZpb3IsIG92ZXJyaXNlIHRoZSB3YWl0X2ltcGwgbWV0aG9kLgorCitXZSB3YW50IGZvcmsxKCkgc2VtYW50aWNzIC0tIG9ubHkgdGhlIGZvcmtpbmcgdGhyZWFkIHN1cnZpdmVzIGluIHRoZQorY2hpbGQgYWZ0ZXIgYSBmb3JrKCkuCisKK09uIHNvbWUgc3lzdGVtcyAoZS5nLiBTb2xhcmlzIHdpdGhvdXQgcG9zaXggdGhyZWFkcykgd2UgZmluZCB0aGF0IGFsbAorYWN0aXZlIHRocmVhZHMgc3Vydml2ZSBpbiB0aGUgY2hpbGQgYWZ0ZXIgYSBmb3JrKCk7IHRoaXMgaXMgYW4gZXJyb3IuCisKK1doaWxlIEJlT1MgZG9lc24ndCBvZmZpY2lhbGx5IHN1cHBvcnQgZm9yayBhbmQgbmF0aXZlIHRocmVhZGluZyBpbgordGhlIHNhbWUgYXBwbGljYXRpb24sIHRoZSBwcmVzZW50IGV4YW1wbGUgc2hvdWxkIHdvcmsganVzdCBmaW5lLiAgREMKKyIiIgorCitpbXBvcnQgb3MsIHN5cywgdGltZSwgdGhyZWFkLCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQKKworTE9OR1NMRUVQID0gMgorU0hPUlRTTEVFUCA9IDAuNQorTlVNX1RIUkVBRFMgPSA0CisKK2NsYXNzIEZvcmtXYWl0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5hbGl2ZSA9IHt9CisgICAgICAgIHNlbGYuc3RvcCA9IDAKKworICAgIGRlZiBmKHNlbGYsIGlkKToKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuc3RvcDoKKyAgICAgICAgICAgIHNlbGYuYWxpdmVbaWRdID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKFNIT1JUU0xFRVApCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgd2FpdF9pbXBsKHNlbGYsIGNwaWQpOgorICAgICAgICBzcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKGNwaWQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNwaWQsIGNwaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0YXR1cywgMCwgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkpCisKKyAgICBkZWYgdGVzdF93YWl0KHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShOVU1fVEhSRUFEUyk6CisgICAgICAgICAgICB0aHJlYWQuc3RhcnRfbmV3KHNlbGYuZiwgKGksKSkKKworICAgICAgICB0aW1lLnNsZWVwKExPTkdTTEVFUCkKKworICAgICAgICBhID0gc2VsZi5hbGl2ZS5rZXlzKCkKKyAgICAgICAgYS5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYSwgcmFuZ2UoTlVNX1RIUkVBRFMpKQorCisgICAgICAgIHByZWZvcmtfbGl2ZXMgPSBzZWxmLmFsaXZlLmNvcHkoKQorCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiBbJ3VuaXh3YXJlNyddOgorICAgICAgICAgICAgY3BpZCA9IG9zLmZvcmsxKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNwaWQgPSBvcy5mb3JrKCkKKworICAgICAgICBpZiBjcGlkID09IDA6CisgICAgICAgICAgICAjIENoaWxkCisgICAgICAgICAgICB0aW1lLnNsZWVwKExPTkdTTEVFUCkKKyAgICAgICAgICAgIG4gPSAwCisgICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuYWxpdmU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5hbGl2ZVtrZXldICE9IHByZWZvcmtfbGl2ZXNba2V5XToKKyAgICAgICAgICAgICAgICAgICAgbiArPSAxCisgICAgICAgICAgICBvcy5fZXhpdChuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBQYXJlbnQKKyAgICAgICAgICAgIHNlbGYud2FpdF9pbXBsKGNwaWQpCisgICAgICAgICAgICAjIFRlbGwgdGhyZWFkcyB0byBkaWUKKyAgICAgICAgICAgIHNlbGYuc3RvcCA9IDEKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMipTSE9SVFNMRUVQKSAjIFdhaXQgZm9yIHRocmVhZHMgdG8gZGllCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sZWFrZXJzL1JFQURNRS50eHQgYi9MaWIvdGVzdC9sZWFrZXJzL1JFQURNRS50eHQKaW5kZXggNjllZTM1YS4uYmVlZWUwZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbGVha2Vycy9SRUFETUUudHh0CisrKyBiL0xpYi90ZXN0L2xlYWtlcnMvUkVBRE1FLnR4dApAQCAtNSw2ICs1LDE1IEBACiBkb2Vzbid0IGluY3JlYXNlLCB0aGUgYnVnIGhhcyBiZWVuIGZpeGVkIGFuZCB0aGUgZmlsZSBzaG91bGQgYmUgcmVtb3ZlZAogZnJvbSB0aGUgcmVwb3NpdG9yeS4KIAorTm90ZTogIGJlIGNhcmVmdWwgdG8gY2hlY2sgZm9yIGN5Y2xpYyBnYXJiYWdlLiAgU29tZXRpbWVzIGl0IG1heSBiZSBoZWxwZnVsCit0byBkZWZpbmUgdGhlIGxlYWsgZnVuY3Rpb24gbGlrZToKKworZGVmIGxlYWsoKToKKyAgICBkZWYgaW5uZXJfbGVhaygpOgorICAgICAgICAjIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgbGVha3MsIGJ1dCBhbHNvIGNyZWF0ZXMgY3ljbGVzCisgICAgaW5uZXJfbGVhaygpCisgICAgZ2MuY29sbGVjdCgpIDsgZ2MuY29sbGVjdCgpIDsgZ2MuY29sbGVjdCgpCisKIEhlcmUncyBhbiBleGFtcGxlIGludGVycHJldGVyIHNlc3Npb24gZm9yIHRlc3RfZ2VzdGFsdCB3aGljaCBzdGlsbCBsZWFrczoKIAogPj4+IGZyb20gdGVzdC5sZWFrZXJzLnRlc3RfZ2VzdGFsdCBpbXBvcnQgbGVhawpAQCAtMTcsMyArMjYsNyBAQAogWzI4OTQwIHJlZnNdCiA+Pj4gCiAKK09uY2UgdGhlIGxlYWsgaXMgZml4ZWQsIHRoZSB0ZXN0IGNhc2Ugc2hvdWxkIGJlIG1vdmVkIGludG8gYW4gYXBwcm9wcmlhdGUKK3Rlc3QgKGV2ZW4gaWYgaXQgd2FzIG9yaWdpbmFsbHkgZnJvbSB0aGUgdGVzdCBzdWl0ZSkuICBUaGlzIGVuc3VyZXMgdGhlCityZWdyZXNzaW9uIGRvZXNuJ3QgaGFwcGVuIGFnYWluLiAgQW5kIGlmIGl0IGRvZXMsIGl0IHNob3VsZCBiZSBlYXNpZXIKK3RvIHRyYWNrIGRvd24uCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sZWFrZXJzL3Rlc3RfY3R5cGVzLnB5IGIvTGliL3Rlc3QvbGVha2Vycy90ZXN0X2N0eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjlhMmNkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGVha2Vycy90ZXN0X2N0eXBlcy5weQpAQCAtMCwwICsxLDE2IEBACisKKyMgVGFrZW4gZnJvbSBMaWIvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weSwgUG9pbnRlclRvU3RydWN0dXJlLnRlc3QoKS4KKyMgV2hlbiB0aGlzIGxlYWsgaXMgZml4ZWQsIHJlbWVtYmVyIHRvIHJlbW92ZSBmcm9tIE1pc2MvYnVpbGQuc2ggTEVBS1lfVEVTVFMuCisKK2Zyb20gY3R5cGVzIGltcG9ydCBTdHJ1Y3R1cmUsIGNfaW50LCBQT0lOVEVSCitpbXBvcnQgZ2MKKworZGVmIGxlYWtfaW5uZXIoKToKKyAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCldCisgICAgY2xhc3MgUkVDVChTdHJ1Y3R1cmUpOgorICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBQT0lOVEVSKFBPSU5UKSldCisKK2RlZiBsZWFrKCk6CisgICAgbGVha19pbm5lcigpCisgICAgZ2MuY29sbGVjdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sZWFrZXJzL3Rlc3Rfc2VsZnR5cGUucHkgYi9MaWIvdGVzdC9sZWFrZXJzL3Rlc3Rfc2VsZnR5cGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwN2MzMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xlYWtlcnMvdGVzdF9zZWxmdHlwZS5weQpAQCAtMCwwICsxLDEzIEBACisjIFJlZmVyZW5jZSBjeWNsZXMgaW52b2x2aW5nIG9ubHkgdGhlIG9iX3R5cGUgZmllbGQgYXJlIHJhdGhlciB1bmNvbW1vbgorIyBidXQgcG9zc2libGUuICBJbnNwaXJlZCBieSBTRiBidWcgMTQ2OTYyOS4KKworaW1wb3J0IGdjCisKK2RlZiBsZWFrKCk6CisgICAgY2xhc3MgVCh0eXBlKToKKyAgICAgICAgcGFzcworICAgIGNsYXNzIFUodHlwZSk6CisgICAgICAgIF9fbWV0YWNsYXNzX18gPSBUCisgICAgVS5fX2NsYXNzX18gPSBVCisgICAgZGVsIFUKKyAgICBnYy5jb2xsZWN0KCk7IGdjLmNvbGxlY3QoKTsgZ2MuY29sbGVjdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sZWFrZXJzL3Rlc3RfdGVlLnB5IGIvTGliL3Rlc3QvbGVha2Vycy90ZXN0X3RlZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlMjRjYS4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9sZWFrZXJzL3Rlc3RfdGVlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCi0jIFRlc3QgY2FzZSB0YWtlbiBmcm9tIHRlc3RfaXRlcnRvb2xzCi0jIFNlZSBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDUtTm92ZW1iZXIvMDU4MzM5Lmh0bWwKLQotZnJvbSBpdGVydG9vbHMgaW1wb3J0IHRlZQotCi1kZWYgbGVhaygpOgotICAgIGRlZiBmaWIoKToKLSAgICAgICAgZGVmIHlpZWxkX2lkZW50aXR5X2ZvcmV2ZXIoZyk6Ci0gICAgICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgICAgIHlpZWxkIGcKLSAgICAgICAgZGVmIF9maWIoKToKLSAgICAgICAgICAgIGZvciBpIGluIHlpZWxkX2lkZW50aXR5X2ZvcmV2ZXIoaGVhZCk6Ci0gICAgICAgICAgICAgICAgeWllbGQgaQotICAgICAgICBoZWFkLCB0YWlsLCByZXN1bHQgPSB0ZWUoX2ZpYigpLCAzKQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgICB4ID0gZmliKCkKLSAgICB4Lm5leHQoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfYXVnYXNzaWduIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfYXVnYXNzaWduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjZiN2U1Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2F1Z2Fzc2lnbgorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLXRlc3RfYXVnYXNzaWduCi02LjAKLTYKLVs2LjBdCi02Ci02LjAKLTYKLVsxLCAyLCAzLCA0LCAxLCAyLCAzLCA0XQotWzEsIDIsIDEsIDIsIDNdCi1UcnVlCi1UcnVlCi1UcnVlCi0xMQotVHJ1ZQotMTIKLVRydWUKLVRydWUKLTEzCi1fX2FkZF9fIGNhbGxlZAotX19yYWRkX18gY2FsbGVkCi1fX2lhZGRfXyBjYWxsZWQKLV9fc3ViX18gY2FsbGVkCi1fX3JzdWJfXyBjYWxsZWQKLV9faXN1Yl9fIGNhbGxlZAotX19tdWxfXyBjYWxsZWQKLV9fcm11bF9fIGNhbGxlZAotX19pbXVsX18gY2FsbGVkCi1fX3RydWVkaXZfXyBjYWxsZWQKLV9fcnRydWVkaXZfXyBjYWxsZWQKLV9faXRydWVkaXZfXyBjYWxsZWQKLV9fZmxvb3JkaXZfXyBjYWxsZWQKLV9fcmZsb29yZGl2X18gY2FsbGVkCi1fX2lmbG9vcmRpdl9fIGNhbGxlZAotX19tb2RfXyBjYWxsZWQKLV9fcm1vZF9fIGNhbGxlZAotX19pbW9kX18gY2FsbGVkCi1fX3Bvd19fIGNhbGxlZAotX19ycG93X18gY2FsbGVkCi1fX2lwb3dfXyBjYWxsZWQKLV9fb3JfXyBjYWxsZWQKLV9fcm9yX18gY2FsbGVkCi1fX2lvcl9fIGNhbGxlZAotX19hbmRfXyBjYWxsZWQKLV9fcmFuZF9fIGNhbGxlZAotX19pYW5kX18gY2FsbGVkCi1fX3hvcl9fIGNhbGxlZAotX19yeG9yX18gY2FsbGVkCi1fX2l4b3JfXyBjYWxsZWQKLV9fcnNoaWZ0X18gY2FsbGVkCi1fX3Jyc2hpZnRfXyBjYWxsZWQKLV9faXJzaGlmdF9fIGNhbGxlZAotX19sc2hpZnRfXyBjYWxsZWQKLV9fcmxzaGlmdF9fIGNhbGxlZAotX19pbHNoaWZ0X18gY2FsbGVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9jb2VyY2lvbiBiL0xpYi90ZXN0L291dHB1dC90ZXN0X2NvZXJjaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM1YjYwLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2NvZXJjaW9uCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NCArMCwwIEBACi10ZXN0X2NvZXJjaW9uCi0yICsgMiA9IDQKLTIgKz0gMiA9PiA0Ci0yIC0gMiA9IDAKLTIgLT0gMiA9PiAwCi0yICogMiA9IDQKLTIgKj0gMiA9PiA0Ci0yIC8gMiA9IDEKLTIgLz0gMiA9PiAxCi0yICoqIDIgPSA0Ci0yICoqPSAyID0+IDQKLTIgJSAyID0gMAotMiAlPSAyID0+IDAKLTIgKyA0LjAgPSA2LjAKLTIgKz0gNC4wID0+IDYuMAotMiAtIDQuMCA9IC0yLjAKLTIgLT0gNC4wID0+IC0yLjAKLTIgKiA0LjAgPSA4LjAKLTIgKj0gNC4wID0+IDguMAotMiAvIDQuMCA9IDAuNQotMiAvPSA0LjAgPT4gMC41Ci0yICoqIDQuMCA9IDE2LjAKLTIgKio9IDQuMCA9PiAxNi4wCi0yICUgNC4wID0gMi4wCi0yICU9IDQuMCA9PiAyLjAKLTIgKyAyID0gNAotMiArPSAyID0+IDQKLTIgLSAyID0gMAotMiAtPSAyID0+IDAKLTIgKiAyID0gNAotMiAqPSAyID0+IDQKLTIgLyAyID0gMQotMiAvPSAyID0+IDEKLTIgKiogMiA9IDQKLTIgKio9IDIgPT4gNAotMiAlIDIgPSAwCi0yICU9IDIgPT4gMAotMiArICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotMiArPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0yIC0gKDIrMGopID0gKDAuMCArIDAuMGopCi0yIC09ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLTIgKiAoMiswaikgPSAoNC4wICsgMC4waikKLTIgKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotMiAvICgyKzBqKSA9ICgxLjAgKyAwLjBqKQotMiAvPSAoMiswaikgPT4gKDEuMCArIDAuMGopCi0yICoqICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotMiAqKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotMiAlICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotMiAlPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi0yICsgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICogWzFdID0gWzEsIDFdCi0yICo9IFsxXSA9PiBbMSwgMV0KLTIgLyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC89IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICs9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiAoMiwpID0gKDIsIDIpCi0yICo9ICgyLCkgPT4gKDIsIDIpCi0yIC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICUgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAvPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci0yICs9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotMiAtIDxNZXRob2ROdW1iZXIgMj4gPSAwCi0yIC09IDxNZXRob2ROdW1iZXIgMj4gPT4gMAotMiAqIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci0yICo9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotMiAvIDxNZXRob2ROdW1iZXIgMj4gPSAxCi0yIC89IDxNZXRob2ROdW1iZXIgMj4gPT4gMQotMiAqKiA8TWV0aG9kTnVtYmVyIDI+ID0gNAotMiAqKj0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci0yICUgPE1ldGhvZE51bWJlciAyPiA9IDAKLTIgJT0gPE1ldGhvZE51bWJlciAyPiA9PiAwCi0yICsgPENvZXJjZU51bWJlciAyPiA9IDQKLTIgKz0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci0yIC0gPENvZXJjZU51bWJlciAyPiA9IDAKLTIgLT0gPENvZXJjZU51bWJlciAyPiA9PiAwCi0yICogPENvZXJjZU51bWJlciAyPiA9IDQKLTIgKj0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci0yIC8gPENvZXJjZU51bWJlciAyPiA9IDEKLTIgLz0gPENvZXJjZU51bWJlciAyPiA9PiAxCi0yICoqIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci0yICoqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTIgJSA8Q29lcmNlTnVtYmVyIDI+ID0gMAotMiAlPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDAKLTQuMCArIDIgPSA2LjAKLTQuMCArPSAyID0+IDYuMAotNC4wIC0gMiA9IDIuMAotNC4wIC09IDIgPT4gMi4wCi00LjAgKiAyID0gOC4wCi00LjAgKj0gMiA9PiA4LjAKLTQuMCAvIDIgPSAyLjAKLTQuMCAvPSAyID0+IDIuMAotNC4wICoqIDIgPSAxNi4wCi00LjAgKio9IDIgPT4gMTYuMAotNC4wICUgMiA9IDAuMAotNC4wICU9IDIgPT4gMC4wCi00LjAgKyA0LjAgPSA4LjAKLTQuMCArPSA0LjAgPT4gOC4wCi00LjAgLSA0LjAgPSAwLjAKLTQuMCAtPSA0LjAgPT4gMC4wCi00LjAgKiA0LjAgPSAxNi4wCi00LjAgKj0gNC4wID0+IDE2LjAKLTQuMCAvIDQuMCA9IDEuMAotNC4wIC89IDQuMCA9PiAxLjAKLTQuMCAqKiA0LjAgPSAyNTYuMAotNC4wICoqPSA0LjAgPT4gMjU2LjAKLTQuMCAlIDQuMCA9IDAuMAotNC4wICU9IDQuMCA9PiAwLjAKLTQuMCArIDIgPSA2LjAKLTQuMCArPSAyID0+IDYuMAotNC4wIC0gMiA9IDIuMAotNC4wIC09IDIgPT4gMi4wCi00LjAgKiAyID0gOC4wCi00LjAgKj0gMiA9PiA4LjAKLTQuMCAvIDIgPSAyLjAKLTQuMCAvPSAyID0+IDIuMAotNC4wICoqIDIgPSAxNi4wCi00LjAgKio9IDIgPT4gMTYuMAotNC4wICUgMiA9IDAuMAotNC4wICU9IDIgPT4gMC4wCi00LjAgKyAoMiswaikgPSAoNi4wICsgMC4waikKLTQuMCArPSAoMiswaikgPT4gKDYuMCArIDAuMGopCi00LjAgLSAoMiswaikgPSAoMi4wICsgMC4waikKLTQuMCAtPSAoMiswaikgPT4gKDIuMCArIDAuMGopCi00LjAgKiAoMiswaikgPSAoOC4wICsgMC4waikKLTQuMCAqPSAoMiswaikgPT4gKDguMCArIDAuMGopCi00LjAgLyAoMiswaikgPSAoMi4wICsgMC4waikKLTQuMCAvPSAoMiswaikgPT4gKDIuMCArIDAuMGopCi00LjAgKiogKDIrMGopID0gKDE2LjAgKyAwLjBqKQotNC4wICoqPSAoMiswaikgPT4gKDE2LjAgKyAwLjBqKQotNC4wICUgKDIrMGopID0gKDAuMCArIDAuMGopCi00LjAgJT0gKDIrMGopID0+ICgwLjAgKyAwLjBqKQotNC4wICsgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICs9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC8gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC89IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKio9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAlIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICs9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC09ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICo9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC89ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAlICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICUgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICsgPE1ldGhvZE51bWJlciAyPiA9IDYuMAotNC4wICs9IDxNZXRob2ROdW1iZXIgMj4gPT4gNi4wCi00LjAgLSA8TWV0aG9kTnVtYmVyIDI+ID0gMi4wCi00LjAgLT0gPE1ldGhvZE51bWJlciAyPiA9PiAyLjAKLTQuMCAqIDxNZXRob2ROdW1iZXIgMj4gPSA4LjAKLTQuMCAqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDguMAotNC4wIC8gPE1ldGhvZE51bWJlciAyPiA9IDIuMAotNC4wIC89IDxNZXRob2ROdW1iZXIgMj4gPT4gMi4wCi00LjAgKiogPE1ldGhvZE51bWJlciAyPiA9IDE2LjAKLTQuMCAqKj0gPE1ldGhvZE51bWJlciAyPiA9PiAxNi4wCi00LjAgJSA8TWV0aG9kTnVtYmVyIDI+ID0gMC4wCi00LjAgJT0gPE1ldGhvZE51bWJlciAyPiA9PiAwLjAKLTQuMCArIDxDb2VyY2VOdW1iZXIgMj4gPSA2LjAKLTQuMCArPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDYuMAotNC4wIC0gPENvZXJjZU51bWJlciAyPiA9IDIuMAotNC4wIC09IDxDb2VyY2VOdW1iZXIgMj4gPT4gMi4wCi00LjAgKiA8Q29lcmNlTnVtYmVyIDI+ID0gOC4wCi00LjAgKj0gPENvZXJjZU51bWJlciAyPiA9PiA4LjAKLTQuMCAvIDxDb2VyY2VOdW1iZXIgMj4gPSAyLjAKLTQuMCAvPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDIuMAotNC4wICoqIDxDb2VyY2VOdW1iZXIgMj4gPSAxNi4wCi00LjAgKio9IDxDb2VyY2VOdW1iZXIgMj4gPT4gMTYuMAotNC4wICUgPENvZXJjZU51bWJlciAyPiA9IDAuMAotNC4wICU9IDxDb2VyY2VOdW1iZXIgMj4gPT4gMC4wCi0yICsgMiA9IDQKLTIgKz0gMiA9PiA0Ci0yIC0gMiA9IDAKLTIgLT0gMiA9PiAwCi0yICogMiA9IDQKLTIgKj0gMiA9PiA0Ci0yIC8gMiA9IDEKLTIgLz0gMiA9PiAxCi0yICoqIDIgPSA0Ci0yICoqPSAyID0+IDQKLTIgJSAyID0gMAotMiAlPSAyID0+IDAKLTIgKyA0LjAgPSA2LjAKLTIgKz0gNC4wID0+IDYuMAotMiAtIDQuMCA9IC0yLjAKLTIgLT0gNC4wID0+IC0yLjAKLTIgKiA0LjAgPSA4LjAKLTIgKj0gNC4wID0+IDguMAotMiAvIDQuMCA9IDAuNQotMiAvPSA0LjAgPT4gMC41Ci0yICoqIDQuMCA9IDE2LjAKLTIgKio9IDQuMCA9PiAxNi4wCi0yICUgNC4wID0gMi4wCi0yICU9IDQuMCA9PiAyLjAKLTIgKyAyID0gNAotMiArPSAyID0+IDQKLTIgLSAyID0gMAotMiAtPSAyID0+IDAKLTIgKiAyID0gNAotMiAqPSAyID0+IDQKLTIgLyAyID0gMQotMiAvPSAyID0+IDEKLTIgKiogMiA9IDQKLTIgKio9IDIgPT4gNAotMiAlIDIgPSAwCi0yICU9IDIgPT4gMAotMiArICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotMiArPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0yIC0gKDIrMGopID0gKDAuMCArIDAuMGopCi0yIC09ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLTIgKiAoMiswaikgPSAoNC4wICsgMC4waikKLTIgKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotMiAvICgyKzBqKSA9ICgxLjAgKyAwLjBqKQotMiAvPSAoMiswaikgPT4gKDEuMCArIDAuMGopCi0yICoqICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotMiAqKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotMiAlICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotMiAlPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi0yICsgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICogWzFdID0gWzEsIDFdCi0yICo9IFsxXSA9PiBbMSwgMV0KLTIgLyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC89IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICs9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiAoMiwpID0gKDIsIDIpCi0yICo9ICgyLCkgPT4gKDIsIDIpCi0yIC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICUgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAvPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci0yICs9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotMiAtIDxNZXRob2ROdW1iZXIgMj4gPSAwCi0yIC09IDxNZXRob2ROdW1iZXIgMj4gPT4gMAotMiAqIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci0yICo9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotMiAvIDxNZXRob2ROdW1iZXIgMj4gPSAxCi0yIC89IDxNZXRob2ROdW1iZXIgMj4gPT4gMQotMiAqKiA8TWV0aG9kTnVtYmVyIDI+ID0gNAotMiAqKj0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci0yICUgPE1ldGhvZE51bWJlciAyPiA9IDAKLTIgJT0gPE1ldGhvZE51bWJlciAyPiA9PiAwCi0yICsgPENvZXJjZU51bWJlciAyPiA9IDQKLTIgKz0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci0yIC0gPENvZXJjZU51bWJlciAyPiA9IDAKLTIgLT0gPENvZXJjZU51bWJlciAyPiA9PiAwCi0yICogPENvZXJjZU51bWJlciAyPiA9IDQKLTIgKj0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci0yIC8gPENvZXJjZU51bWJlciAyPiA9IDEKLTIgLz0gPENvZXJjZU51bWJlciAyPiA9PiAxCi0yICoqIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci0yICoqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTIgJSA8Q29lcmNlTnVtYmVyIDI+ID0gMAotMiAlPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDAKLSgyKzBqKSArIDIgPSAoNC4wICsgMC4waikKLSgyKzBqKSArPSAyID0+ICg0LjAgKyAwLjBqKQotKDIrMGopIC0gMiA9ICgwLjAgKyAwLjBqKQotKDIrMGopIC09IDIgPT4gKDAuMCArIDAuMGopCi0oMiswaikgKiAyID0gKDQuMCArIDAuMGopCi0oMiswaikgKj0gMiA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAvIDIgPSAoMS4wICsgMC4waikKLSgyKzBqKSAvPSAyID0+ICgxLjAgKyAwLjBqKQotKDIrMGopICoqIDIgPSAoNC4wICsgMC4waikKLSgyKzBqKSAqKj0gMiA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAlIDIgPSAoMC4wICsgMC4waikKLSgyKzBqKSAlPSAyID0+ICgwLjAgKyAwLjBqKQotKDIrMGopICsgNC4wID0gKDYuMCArIDAuMGopCi0oMiswaikgKz0gNC4wID0+ICg2LjAgKyAwLjBqKQotKDIrMGopIC0gNC4wID0gKC0yLjAgKyAwLjBqKQotKDIrMGopIC09IDQuMCA9PiAoLTIuMCArIDAuMGopCi0oMiswaikgKiA0LjAgPSAoOC4wICsgMC4waikKLSgyKzBqKSAqPSA0LjAgPT4gKDguMCArIDAuMGopCi0oMiswaikgLyA0LjAgPSAoMC41ICsgMC4waikKLSgyKzBqKSAvPSA0LjAgPT4gKDAuNSArIDAuMGopCi0oMiswaikgKiogNC4wID0gKDE2LjAgKyAwLjBqKQotKDIrMGopICoqPSA0LjAgPT4gKDE2LjAgKyAwLjBqKQotKDIrMGopICUgNC4wID0gKDIuMCArIDAuMGopCi0oMiswaikgJT0gNC4wID0+ICgyLjAgKyAwLjBqKQotKDIrMGopICsgMiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICs9IDIgPT4gKDQuMCArIDAuMGopCi0oMiswaikgLSAyID0gKDAuMCArIDAuMGopCi0oMiswaikgLT0gMiA9PiAoMC4wICsgMC4waikKLSgyKzBqKSAqIDIgPSAoNC4wICsgMC4waikKLSgyKzBqKSAqPSAyID0+ICg0LjAgKyAwLjBqKQotKDIrMGopIC8gMiA9ICgxLjAgKyAwLjBqKQotKDIrMGopIC89IDIgPT4gKDEuMCArIDAuMGopCi0oMiswaikgKiogMiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICoqPSAyID0+ICg0LjAgKyAwLjBqKQotKDIrMGopICUgMiA9ICgwLjAgKyAwLjBqKQotKDIrMGopICU9IDIgPT4gKDAuMCArIDAuMGopCi0oMiswaikgKyAoMiswaikgPSAoNC4wICsgMC4waikKLSgyKzBqKSArPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0oMiswaikgLSAoMiswaikgPSAoMC4wICsgMC4waikKLSgyKzBqKSAtPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi0oMiswaikgKiAoMiswaikgPSAoNC4wICsgMC4waikKLSgyKzBqKSAqPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0oMiswaikgLyAoMiswaikgPSAoMS4wICsgMC4waikKLSgyKzBqKSAvPSAoMiswaikgPT4gKDEuMCArIDAuMGopCi0oMiswaikgKiogKDIrMGopID0gKDQuMCArIDAuMGopCi0oMiswaikgKio9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAlICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotKDIrMGopICU9ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLSgyKzBqKSArIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSArPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICo9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAvPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKiogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgJSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgJT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICsgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSArPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAtPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAqPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICoqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICU9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICo9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKiogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgJT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSArIDxNZXRob2ROdW1iZXIgMj4gPSAoNC4wICsgMC4waikKLSgyKzBqKSArPSA8TWV0aG9kTnVtYmVyIDI+ID0+ICg0LjAgKyAwLjBqKQotKDIrMGopIC0gPE1ldGhvZE51bWJlciAyPiA9ICgwLjAgKyAwLjBqKQotKDIrMGopIC09IDxNZXRob2ROdW1iZXIgMj4gPT4gKDAuMCArIDAuMGopCi0oMiswaikgKiA8TWV0aG9kTnVtYmVyIDI+ID0gKDQuMCArIDAuMGopCi0oMiswaikgKj0gPE1ldGhvZE51bWJlciAyPiA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAvIDxNZXRob2ROdW1iZXIgMj4gPSAoMS4wICsgMC4waikKLSgyKzBqKSAvPSA8TWV0aG9kTnVtYmVyIDI+ID0+ICgxLjAgKyAwLjBqKQotKDIrMGopICoqIDxNZXRob2ROdW1iZXIgMj4gPSAoNC4wICsgMC4waikKLSgyKzBqKSAqKj0gPE1ldGhvZE51bWJlciAyPiA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAlIDxNZXRob2ROdW1iZXIgMj4gPSAoMC4wICsgMC4waikKLSgyKzBqKSAlPSA8TWV0aG9kTnVtYmVyIDI+ID0+ICgwLjAgKyAwLjBqKQotKDIrMGopICsgPENvZXJjZU51bWJlciAyPiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICs9IDxDb2VyY2VOdW1iZXIgMj4gPT4gKDQuMCArIDAuMGopCi0oMiswaikgLSA8Q29lcmNlTnVtYmVyIDI+ID0gKDAuMCArIDAuMGopCi0oMiswaikgLT0gPENvZXJjZU51bWJlciAyPiA9PiAoMC4wICsgMC4waikKLSgyKzBqKSAqIDxDb2VyY2VOdW1iZXIgMj4gPSAoNC4wICsgMC4waikKLSgyKzBqKSAqPSA8Q29lcmNlTnVtYmVyIDI+ID0+ICg0LjAgKyAwLjBqKQotKDIrMGopIC8gPENvZXJjZU51bWJlciAyPiA9ICgxLjAgKyAwLjBqKQotKDIrMGopIC89IDxDb2VyY2VOdW1iZXIgMj4gPT4gKDEuMCArIDAuMGopCi0oMiswaikgKiogPENvZXJjZU51bWJlciAyPiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICoqPSA8Q29lcmNlTnVtYmVyIDI+ID0+ICg0LjAgKyAwLjBqKQotKDIrMGopICUgPENvZXJjZU51bWJlciAyPiA9ICgwLjAgKyAwLjBqKQotKDIrMGopICU9IDxDb2VyY2VOdW1iZXIgMj4gPT4gKDAuMCArIDAuMGopCi1bMV0gKyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiAyID0gWzEsIDFdCi1bMV0gKj0gMiA9PiBbMSwgMV0KLVsxXSAvIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICUgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICsgNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKj0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC8gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC89IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiAyID0gWzEsIDFdCi1bMV0gKj0gMiA9PiBbMSwgMV0KLVsxXSAvIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICUgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICsgKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtPSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKj0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC8gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC89ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyBbMV0gPSBbMSwgMV0KLVsxXSArPSBbMV0gPT4gWzEsIDFdCi1bMV0gLSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICo9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICsgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSArPSAoMiwpID0+IFsxLCAyXQotWzFdIC0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICU9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICo9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSArIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKz0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLT0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqIDxNZXRob2ROdW1iZXIgMj4gPSBbMSwgMV0KLVsxXSAqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IFsxLCAxXQotWzFdIC8gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICU9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiA8Q29lcmNlTnVtYmVyIDI+ID0gWzEsIDFdCi1bMV0gKj0gPENvZXJjZU51bWJlciAyPiA9PiBbMSwgMV0KLVsxXSAvIDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLz0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICUgPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiAyID0gKDIsIDIpCi0oMiwpICo9IDIgPT4gKDIsIDIpCi0oMiwpIC8gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKio9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKyA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC09IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICo9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLyA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC89IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiAyID0gKDIsIDIpCi0oMiwpICo9IDIgPT4gKDIsIDIpCi0oMiwpIC8gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKio9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKyAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC09ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICo9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLyAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC89ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICsgKDIsKSA9ICgyLCAyKQotKDIsKSArPSAoMiwpID0+ICgyLCAyKQotKDIsKSAtICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC09ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICU9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICsgPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKz0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqIDxNZXRob2ROdW1iZXIgMj4gPSAoMiwgMikKLSgyLCkgKj0gPE1ldGhvZE51bWJlciAyPiA9PiAoMiwgMikKLSgyLCkgLyA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiA8Q29lcmNlTnVtYmVyIDI+ID0gKDIsIDIpCi0oMiwpICo9IDxDb2VyY2VOdW1iZXIgMj4gPT4gKDIsIDIpCi0oMiwpIC8gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKio9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC09IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICogMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKj0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLT0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICsgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICo9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC8gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiogMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKio9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKyAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICs9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC09ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICo9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLyAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC89ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiogKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKj0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJT0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICsgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICo9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICs9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLT0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC89IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICU9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICsgPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqIDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICo9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC8gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiogPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKio9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJT0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKyAyID0gNAotPE1ldGhvZE51bWJlciAyPiArPSAyID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gLSAyID0gMAotPE1ldGhvZE51bWJlciAyPiAtPSAyID0+IDAKLTxNZXRob2ROdW1iZXIgMj4gKiAyID0gNAotPE1ldGhvZE51bWJlciAyPiAqPSAyID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gLyAyID0gMQotPE1ldGhvZE51bWJlciAyPiAvPSAyID0+IDEKLTxNZXRob2ROdW1iZXIgMj4gKiogMiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKio9IDIgPT4gNAotPE1ldGhvZE51bWJlciAyPiAlIDIgPSAwCi08TWV0aG9kTnVtYmVyIDI+ICU9IDIgPT4gMAotPE1ldGhvZE51bWJlciAyPiArIDQuMCA9IDYuMAotPE1ldGhvZE51bWJlciAyPiArPSA0LjAgPT4gNi4wCi08TWV0aG9kTnVtYmVyIDI+IC0gNC4wID0gLTIuMAotPE1ldGhvZE51bWJlciAyPiAtPSA0LjAgPT4gLTIuMAotPE1ldGhvZE51bWJlciAyPiAqIDQuMCA9IDguMAotPE1ldGhvZE51bWJlciAyPiAqPSA0LjAgPT4gOC4wCi08TWV0aG9kTnVtYmVyIDI+IC8gNC4wID0gMC41Ci08TWV0aG9kTnVtYmVyIDI+IC89IDQuMCA9PiAwLjUKLTxNZXRob2ROdW1iZXIgMj4gKiogNC4wID0gMTYuMAotPE1ldGhvZE51bWJlciAyPiAqKj0gNC4wID0+IDE2LjAKLTxNZXRob2ROdW1iZXIgMj4gJSA0LjAgPSAyLjAKLTxNZXRob2ROdW1iZXIgMj4gJT0gNC4wID0+IDIuMAotPE1ldGhvZE51bWJlciAyPiArIDIgPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICs9IDIgPT4gNAotPE1ldGhvZE51bWJlciAyPiAtIDIgPSAwCi08TWV0aG9kTnVtYmVyIDI+IC09IDIgPT4gMAotPE1ldGhvZE51bWJlciAyPiAqIDIgPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICo9IDIgPT4gNAotPE1ldGhvZE51bWJlciAyPiAvIDIgPSAxCi08TWV0aG9kTnVtYmVyIDI+IC89IDIgPT4gMQotPE1ldGhvZE51bWJlciAyPiAqKiAyID0gNAotPE1ldGhvZE51bWJlciAyPiAqKj0gMiA9PiA0Ci08TWV0aG9kTnVtYmVyIDI+ICUgMiA9IDAKLTxNZXRob2ROdW1iZXIgMj4gJT0gMiA9PiAwCi08TWV0aG9kTnVtYmVyIDI+ICsgKDIrMGopID0gKDQuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+ICs9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gLSAoMiswaikgPSAoMC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gLT0gKDIrMGopID0+ICgwLjAgKyAwLjBqKQotPE1ldGhvZE51bWJlciAyPiAqICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotPE1ldGhvZE51bWJlciAyPiAqPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+IC8gKDIrMGopID0gKDEuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+IC89ICgyKzBqKSA9PiAoMS4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gKiogKDIrMGopID0gKDQuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+ICoqPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+ICUgKDIrMGopID0gKDAuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+ICU9ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gKyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICs9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+IC09IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKiBbMV0gPSBbMSwgMV0KLTxNZXRob2ROdW1iZXIgMj4gKj0gWzFdID0+IFsxLCAxXQotPE1ldGhvZE51bWJlciAyPiAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICUgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICsgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAtPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqICgyLCkgPSAoMiwgMikKLTxNZXRob2ROdW1iZXIgMj4gKj0gKDIsKSA9PiAoMiwgMikKLTxNZXRob2ROdW1iZXIgMj4gLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAlPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+IC0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+IC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICoqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICU9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICsgPE1ldGhvZE51bWJlciAyPiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKz0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci08TWV0aG9kTnVtYmVyIDI+IC0gPE1ldGhvZE51bWJlciAyPiA9IDAKLTxNZXRob2ROdW1iZXIgMj4gLT0gPE1ldGhvZE51bWJlciAyPiA9PiAwCi08TWV0aG9kTnVtYmVyIDI+ICogPE1ldGhvZE51bWJlciAyPiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKj0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci08TWV0aG9kTnVtYmVyIDI+IC8gPE1ldGhvZE51bWJlciAyPiA9IDEKLTxNZXRob2ROdW1iZXIgMj4gLz0gPE1ldGhvZE51bWJlciAyPiA9PiAxCi08TWV0aG9kTnVtYmVyIDI+ICoqIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICoqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gJSA8TWV0aG9kTnVtYmVyIDI+ID0gMAotPE1ldGhvZE51bWJlciAyPiAlPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDAKLTxNZXRob2ROdW1iZXIgMj4gKyA8Q29lcmNlTnVtYmVyIDI+ID0gNAotPE1ldGhvZE51bWJlciAyPiArPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gLSA8Q29lcmNlTnVtYmVyIDI+ID0gMAotPE1ldGhvZE51bWJlciAyPiAtPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDAKLTxNZXRob2ROdW1iZXIgMj4gKiA8Q29lcmNlTnVtYmVyIDI+ID0gNAotPE1ldGhvZE51bWJlciAyPiAqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gLyA8Q29lcmNlTnVtYmVyIDI+ID0gMQotPE1ldGhvZE51bWJlciAyPiAvPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDEKLTxNZXRob2ROdW1iZXIgMj4gKiogPENvZXJjZU51bWJlciAyPiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKio9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNAotPE1ldGhvZE51bWJlciAyPiAlIDxDb2VyY2VOdW1iZXIgMj4gPSAwCi08TWV0aG9kTnVtYmVyIDI+ICU9IDxDb2VyY2VOdW1iZXIgMj4gPT4gMAotPENvZXJjZU51bWJlciAyPiArIDIgPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICs9IDIgPT4gNAotPENvZXJjZU51bWJlciAyPiAtIDIgPSAwCi08Q29lcmNlTnVtYmVyIDI+IC09IDIgPT4gMAotPENvZXJjZU51bWJlciAyPiAqIDIgPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICo9IDIgPT4gNAotPENvZXJjZU51bWJlciAyPiAvIDIgPSAxCi08Q29lcmNlTnVtYmVyIDI+IC89IDIgPT4gMQotPENvZXJjZU51bWJlciAyPiAqKiAyID0gNAotPENvZXJjZU51bWJlciAyPiAqKj0gMiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+ICUgMiA9IDAKLTxDb2VyY2VOdW1iZXIgMj4gJT0gMiA9PiAwCi08Q29lcmNlTnVtYmVyIDI+ICsgNC4wID0gNi4wCi08Q29lcmNlTnVtYmVyIDI+ICs9IDQuMCA9PiA2LjAKLTxDb2VyY2VOdW1iZXIgMj4gLSA0LjAgPSAtMi4wCi08Q29lcmNlTnVtYmVyIDI+IC09IDQuMCA9PiAtMi4wCi08Q29lcmNlTnVtYmVyIDI+ICogNC4wID0gOC4wCi08Q29lcmNlTnVtYmVyIDI+ICo9IDQuMCA9PiA4LjAKLTxDb2VyY2VOdW1iZXIgMj4gLyA0LjAgPSAwLjUKLTxDb2VyY2VOdW1iZXIgMj4gLz0gNC4wID0+IDAuNQotPENvZXJjZU51bWJlciAyPiAqKiA0LjAgPSAxNi4wCi08Q29lcmNlTnVtYmVyIDI+ICoqPSA0LjAgPT4gMTYuMAotPENvZXJjZU51bWJlciAyPiAlIDQuMCA9IDIuMAotPENvZXJjZU51bWJlciAyPiAlPSA0LjAgPT4gMi4wCi08Q29lcmNlTnVtYmVyIDI+ICsgMiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKz0gMiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+IC0gMiA9IDAKLTxDb2VyY2VOdW1iZXIgMj4gLT0gMiA9PiAwCi08Q29lcmNlTnVtYmVyIDI+ICogMiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKj0gMiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+IC8gMiA9IDEKLTxDb2VyY2VOdW1iZXIgMj4gLz0gMiA9PiAxCi08Q29lcmNlTnVtYmVyIDI+ICoqIDIgPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICoqPSAyID0+IDQKLTxDb2VyY2VOdW1iZXIgMj4gJSAyID0gMAotPENvZXJjZU51bWJlciAyPiAlPSAyID0+IDAKLTxDb2VyY2VOdW1iZXIgMj4gKyAoMiswaikgPSAoNC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gKz0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAtICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAtPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi08Q29lcmNlTnVtYmVyIDI+ICogKDIrMGopID0gKDQuMCArIDAuMGopCi08Q29lcmNlTnVtYmVyIDI+ICo9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gLyAoMiswaikgPSAoMS4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gLz0gKDIrMGopID0+ICgxLjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAqKiAoMiswaikgPSAoNC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gKio9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gJSAoMiswaikgPSAoMC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gJT0gKDIrMGopID0+ICgwLjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiArIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAqIFsxXSA9IFsxLCAxXQotPENvZXJjZU51bWJlciAyPiAqPSBbMV0gPT4gWzEsIDFdCi08Q29lcmNlTnVtYmVyIDI+IC8gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAvPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICoqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKio9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gJSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICU9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiArPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAtICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+IC09ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICogKDIsKSA9ICgyLCAyKQotPENvZXJjZU51bWJlciAyPiAqPSAoMiwpID0+ICgyLCAyKQotPENvZXJjZU51bWJlciAyPiAvICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+IC89ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICoqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICoqPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAlICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICU9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICsgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gLSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAtPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICo9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+IC8gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gLz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKiogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKio9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICUgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gJT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKyA8TWV0aG9kTnVtYmVyIDI+ID0gNAotPENvZXJjZU51bWJlciAyPiArPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDQKLTxDb2VyY2VOdW1iZXIgMj4gLSA8TWV0aG9kTnVtYmVyIDI+ID0gMAotPENvZXJjZU51bWJlciAyPiAtPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDAKLTxDb2VyY2VOdW1iZXIgMj4gKiA8TWV0aG9kTnVtYmVyIDI+ID0gNAotPENvZXJjZU51bWJlciAyPiAqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDQKLTxDb2VyY2VOdW1iZXIgMj4gLyA8TWV0aG9kTnVtYmVyIDI+ID0gMQotPENvZXJjZU51bWJlciAyPiAvPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDEKLTxDb2VyY2VOdW1iZXIgMj4gKiogPE1ldGhvZE51bWJlciAyPiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKio9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotPENvZXJjZU51bWJlciAyPiAlIDxNZXRob2ROdW1iZXIgMj4gPSAwCi08Q29lcmNlTnVtYmVyIDI+ICU9IDxNZXRob2ROdW1iZXIgMj4gPT4gMAotPENvZXJjZU51bWJlciAyPiArIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICs9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNAotPENvZXJjZU51bWJlciAyPiAtIDxDb2VyY2VOdW1iZXIgMj4gPSAwCi08Q29lcmNlTnVtYmVyIDI+IC09IDxDb2VyY2VOdW1iZXIgMj4gPT4gMAotPENvZXJjZU51bWJlciAyPiAqIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICo9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNAotPENvZXJjZU51bWJlciAyPiAvIDxDb2VyY2VOdW1iZXIgMj4gPSAxCi08Q29lcmNlTnVtYmVyIDI+IC89IDxDb2VyY2VOdW1iZXIgMj4gPT4gMQotPENvZXJjZU51bWJlciAyPiAqKiA8Q29lcmNlTnVtYmVyIDI+ID0gNAotPENvZXJjZU51bWJlciAyPiAqKj0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+ICUgPENvZXJjZU51bWJlciAyPiA9IDAKLTxDb2VyY2VOdW1iZXIgMj4gJT0gPENvZXJjZU51bWJlciAyPiA9PiAwCi1kaXZtb2QoMiwgMikgPSAoMSwgMCkKLWRpdm1vZCgyLCA0LjApID0gKDAuMCwgMi4wKQotZGl2bW9kKDIsIDIpID0gKDFMLCAwTCkKLWRpdm1vZCgyLCAoMiswaikpID0gKCgxKzBqKSwgMGopCi1kaXZtb2QoMiwgWzFdKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgyLCAoMiwpKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgyLCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgyLCA8TWV0aG9kTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgyLCA8Q29lcmNlTnVtYmVyIDI+KSA9ICgxLCAwKQotZGl2bW9kKDQuMCwgMikgPSAoMi4wLCAwLjApCi1kaXZtb2QoNC4wLCA0LjApID0gKDEuMCwgMC4wKQotZGl2bW9kKDQuMCwgMikgPSAoMi4wLCAwLjApCi1kaXZtb2QoNC4wLCAoMiswaikpID0gKCgyKzBqKSwgMGopCi1kaXZtb2QoNC4wLCBbMV0pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDQuMCwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoNC4wLCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg0LjAsIDxNZXRob2ROdW1iZXIgMj4pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDQuMCwgPENvZXJjZU51bWJlciAyPikgPSAoMi4wLCAwLjApCi1kaXZtb2QoMiwgMikgPSAoMUwsIDBMKQotZGl2bW9kKDIsIDQuMCkgPSAoMC4wLCAyLjApCi1kaXZtb2QoMiwgMikgPSAoMUwsIDBMKQotZGl2bW9kKDIsICgyKzBqKSkgPSAoKDErMGopLCAwaikKLWRpdm1vZCgyLCBbMV0pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsICgyLCkpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsIE5vbmUpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsIDxNZXRob2ROdW1iZXIgMj4pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsIDxDb2VyY2VOdW1iZXIgMj4pID0gKDFMLCAwTCkKLWRpdm1vZCgoMiswaiksIDIpID0gKCgxKzBqKSwgMGopCi1kaXZtb2QoKDIrMGopLCA0LjApID0gKDBqLCAoMiswaikpCi1kaXZtb2QoKDIrMGopLCAyKSA9ICgoMSswaiksIDBqKQotZGl2bW9kKCgyKzBqKSwgKDIrMGopKSA9ICgoMSswaiksIDBqKQotZGl2bW9kKCgyKzBqKSwgWzFdKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiswaiksICgyLCkpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKCgyKzBqKSwgTm9uZSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIrMGopLCA8TWV0aG9kTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiswaiksIDxDb2VyY2VOdW1iZXIgMj4pID0gKCgxKzBqKSwgMGopCi1kaXZtb2QoWzFdLCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChbMV0sIDQuMCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoWzFdLCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChbMV0sICgyKzBqKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoWzFdLCBbMV0pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKFsxXSwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoWzFdLCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChbMV0sIDxNZXRob2ROdW1iZXIgMj4pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKFsxXSwgPENvZXJjZU51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgMikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgNC4wKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiwpLCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiwpLCAoMiswaikpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKCgyLCksIFsxXSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgTm9uZSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgPE1ldGhvZE51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgPENvZXJjZU51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgMikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgNC4wKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChOb25lLCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChOb25lLCAoMiswaikpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKE5vbmUsIFsxXSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgTm9uZSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgPE1ldGhvZE51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgPENvZXJjZU51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgMikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgNC4wKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8TWV0aG9kTnVtYmVyIDI+LCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8TWV0aG9kTnVtYmVyIDI+LCAoMiswaikpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDxNZXRob2ROdW1iZXIgMj4sIFsxXSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgTm9uZSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgPE1ldGhvZE51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgPENvZXJjZU51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPENvZXJjZU51bWJlciAyPiwgMikgPSAoMSwgMCkKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCA0LjApID0gKDAuMCwgMi4wKQotZGl2bW9kKDxDb2VyY2VOdW1iZXIgMj4sIDIpID0gKDFMLCAwTCkKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCAoMiswaikpID0gKCgxKzBqKSwgMGopCi1kaXZtb2QoPENvZXJjZU51bWJlciAyPiwgWzFdKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCAoMiwpKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCA8TWV0aG9kTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCA8Q29lcmNlTnVtYmVyIDI+KSA9ICgxLCAwKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfY29tcGFyZSBiL0xpYi90ZXN0L291dHB1dC90ZXN0X2NvbXBhcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMGJkOTcuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfY29tcGFyZQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi10ZXN0X2NvbXBhcmUKLTIgPT0gMgotMiA9PSAyLjAKLTIgPT0gMgotMiA9PSAoMiswaikKLTIgIT0gWzFdCi0yICE9ICgzLCkKLTIgIT0gTm9uZQotMiAhPSA8RW1wdHk+Ci0yID09IDxDb2VyY2UgMj4KLTIgPT0gPENtcCAyLjA+Ci0yLjAgPT0gMgotMi4wID09IDIuMAotMi4wID09IDIKLTIuMCA9PSAoMiswaikKLTIuMCAhPSBbMV0KLTIuMCAhPSAoMywpCi0yLjAgIT0gTm9uZQotMi4wICE9IDxFbXB0eT4KLTIuMCA9PSA8Q29lcmNlIDI+Ci0yLjAgPT0gPENtcCAyLjA+Ci0yID09IDIKLTIgPT0gMi4wCi0yID09IDIKLTIgPT0gKDIrMGopCi0yICE9IFsxXQotMiAhPSAoMywpCi0yICE9IE5vbmUKLTIgIT0gPEVtcHR5PgotMiA9PSA8Q29lcmNlIDI+Ci0yID09IDxDbXAgMi4wPgotKDIrMGopID09IDIKLSgyKzBqKSA9PSAyLjAKLSgyKzBqKSA9PSAyCi0oMiswaikgPT0gKDIrMGopCi0oMiswaikgIT0gWzFdCi0oMiswaikgIT0gKDMsKQotKDIrMGopICE9IE5vbmUKLSgyKzBqKSAhPSA8RW1wdHk+Ci0oMiswaikgPT0gPENvZXJjZSAyPgotKDIrMGopID09IDxDbXAgMi4wPgotWzFdICE9IDIKLVsxXSAhPSAyLjAKLVsxXSAhPSAyCi1bMV0gIT0gKDIrMGopCi1bMV0gPT0gWzFdCi1bMV0gIT0gKDMsKQotWzFdICE9IE5vbmUKLVsxXSAhPSA8RW1wdHk+Ci1bMV0gIT0gPENvZXJjZSAyPgotWzFdICE9IDxDbXAgMi4wPgotKDMsKSAhPSAyCi0oMywpICE9IDIuMAotKDMsKSAhPSAyCi0oMywpICE9ICgyKzBqKQotKDMsKSAhPSBbMV0KLSgzLCkgPT0gKDMsKQotKDMsKSAhPSBOb25lCi0oMywpICE9IDxFbXB0eT4KLSgzLCkgIT0gPENvZXJjZSAyPgotKDMsKSAhPSA8Q21wIDIuMD4KLU5vbmUgIT0gMgotTm9uZSAhPSAyLjAKLU5vbmUgIT0gMgotTm9uZSAhPSAoMiswaikKLU5vbmUgIT0gWzFdCi1Ob25lICE9ICgzLCkKLU5vbmUgPT0gTm9uZQotTm9uZSAhPSA8RW1wdHk+Ci1Ob25lICE9IDxDb2VyY2UgMj4KLU5vbmUgIT0gPENtcCAyLjA+Ci08RW1wdHk+ICE9IDIKLTxFbXB0eT4gIT0gMi4wCi08RW1wdHk+ICE9IDIKLTxFbXB0eT4gIT0gKDIrMGopCi08RW1wdHk+ICE9IFsxXQotPEVtcHR5PiAhPSAoMywpCi08RW1wdHk+ICE9IE5vbmUKLTxFbXB0eT4gPT0gPEVtcHR5PgotPEVtcHR5PiAhPSA8Q29lcmNlIDI+Ci08RW1wdHk+ICE9IDxDbXAgMi4wPgotPENvZXJjZSAyPiA9PSAyCi08Q29lcmNlIDI+ID09IDIuMAotPENvZXJjZSAyPiA9PSAyCi08Q29lcmNlIDI+ID09ICgyKzBqKQotPENvZXJjZSAyPiAhPSBbMV0KLTxDb2VyY2UgMj4gIT0gKDMsKQotPENvZXJjZSAyPiAhPSBOb25lCi08Q29lcmNlIDI+ICE9IDxFbXB0eT4KLTxDb2VyY2UgMj4gPT0gPENvZXJjZSAyPgotPENvZXJjZSAyPiA9PSA8Q21wIDIuMD4KLTxDbXAgMi4wPiA9PSAyCi08Q21wIDIuMD4gPT0gMi4wCi08Q21wIDIuMD4gPT0gMgotPENtcCAyLjA+ID09ICgyKzBqKQotPENtcCAyLjA+ICE9IFsxXQotPENtcCAyLjA+ICE9ICgzLCkKLTxDbXAgMi4wPiAhPSBOb25lCi08Q21wIDIuMD4gIT0gPEVtcHR5PgotPENtcCAyLjA+ID09IDxDb2VyY2UgMj4KLTxDbXAgMi4wPiA9PSA8Q21wIDIuMD4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvcmVncnRlc3QucHkKaW5kZXggODVmNTdhNi4uNTY2ZTU0YiAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvcmVncnRlc3QucHkKKysrIGIvTGliL3Rlc3QvcmVncnRlc3QucHkKQEAgLTUyMCw3ICs1MjAsNyBAQAogICAgICAgICAgICAgICAgIGltcG9ydCBnYwogICAgICAgICAgICAgICAgIGRlZiBjbGVhbnVwKCk6CiAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBfc3RycHRpbWUsIGxpbmVjYWNoZSwgd2FybmluZ3MsIGRpcmNhY2hlCi0gICAgICAgICAgICAgICAgICAgIGltcG9ydCB1cmxwYXJzZSwgdXJsbGliLCB1cmxsaWIyCisgICAgICAgICAgICAgICAgICAgIGltcG9ydCB1cmxwYXJzZSwgdXJsbGliLCB1cmxsaWIyLCBtaW1ldHlwZXMsIGRvY3Rlc3QKICAgICAgICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IF9wYXRoX2NyZWF0ZWQKICAgICAgICAgICAgICAgICAgICAgX3BhdGhfY3JlYXRlZC5jbGVhcigpCiAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBmcwpAQCAtNTM2LDYgKzUzNiw4IEBACiAgICAgICAgICAgICAgICAgICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLnVwZGF0ZShwaWMpCiAgICAgICAgICAgICAgICAgICAgIGRpcmNhY2hlLnJlc2V0KCkKICAgICAgICAgICAgICAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZXMuX2RlZmF1bHRfbWltZV90eXBlcygpCisgICAgICAgICAgICAgICAgICAgIGRvY3Rlc3QubWFzdGVyID0gTm9uZQogICAgICAgICAgICAgICAgIGlmIGluZGlyZWN0X3Rlc3Q6CiAgICAgICAgICAgICAgICAgICAgIGRlZiBydW5fdGhlX3Rlc3QoKToKICAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0X3Rlc3QoKQpAQCAtNTQ3LDYgKzU0OSw3IEBACiAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgImJlZ2lubmluZyIsIHJlcGNvdW50LCAicmVwZXRpdGlvbnMiCiAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgXAogICAgICAgICAgICAgICAgICAgICAgICgiMTIzNDU2Nzg5MCIqKHJlcGNvdW50Ly8xMCArIDEpKVs6cmVwY291bnRdCisgICAgICAgICAgICAgICAgY2xlYW51cCgpCiAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocmVwY291bnQpOgogICAgICAgICAgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKICAgICAgICAgICAgICAgICAgICAgcnVuX3RoZV90ZXN0KCkKQEAgLTc0NCw2ICs3NDcsOCBAQAogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3RfdGhyZWFkc2lnbmFscwogICAgICAgICB0ZXN0X3RpbWluZworICAgICAgICB0ZXN0X3dhaXQzCisgICAgICAgIHRlc3Rfd2FpdDQKICAgICAgICAgIiIiLAogICAgICdsaW51eDInOgogICAgICAgICAiIiIKQEAgLTc2MSw2ICs3NjYsOCBAQAogICAgICAgICB0ZXN0X25pcwogICAgICAgICB0ZXN0X250cGF0aAogICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgIiIiLAogICAgJ21hYyc6CkBAIC04MDAsNiArODA3LDggQEAKICAgICAgICAgdGVzdF9wd2QKICAgICAgICAgdGVzdF9yZXNvdXJjZQogICAgICAgICB0ZXN0X3NpZ25hbAorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3Rfc3VuZHJ5CiAgICAgICAgIHRlc3RfdGFyZmlsZQpAQCAtODI0LDYgKzgzMyw4IEBACiAgICAgICAgIHRlc3Rfb3BlbnB0eQogICAgICAgICB0ZXN0X3B5ZXhwYXQKICAgICAgICAgdGVzdF9zYXgKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKKyAgICAgICAgdGVzdF9zcWxpdGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICB0ZXN0X3N1bmRyeQogICAgICAgICAiIiIsCkBAIC04NDYsNiArODU3LDggQEAKICAgICAgICAgdGVzdF9vcGVucHR5CiAgICAgICAgIHRlc3RfcHlleHBhdAogICAgICAgICB0ZXN0X3NheAorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3Rfc3VuZHJ5CiAgICAgICAgICIiIiwKQEAgLTg3Myw2ICs4ODYsOCBAQAogICAgICAgICB0ZXN0X3B5ZXhwYXQKICAgICAgICAgdGVzdF9xdWV1ZQogICAgICAgICB0ZXN0X3NheAorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3Rfc3VuZHJ5CiAgICAgICAgIHRlc3RfdGhyZWFkCkBAIC05MTMsNiArOTI4LDggQEAKICAgICAgICAgdGVzdF9wdHkKICAgICAgICAgdGVzdF9wd2QKICAgICAgICAgdGVzdF9zdHJvcAorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3Rfc3VuZHJ5CiAgICAgICAgIHRlc3RfdGhyZWFkCkBAIC05MzAsNyArOTQ3LDYgQEAKICAgICAgICAgdGVzdF9jZAogICAgICAgICB0ZXN0X2NsCiAgICAgICAgIHRlc3RfY3Vyc2VzCi0gICAgICAgIHRlc3RfZGwKICAgICAgICAgdGVzdF9nZGJtCiAgICAgICAgIHRlc3RfZ2wKICAgICAgICAgdGVzdF9pbWdmaWxlCkBAIC05NDIsNiArOTU4LDggQEAKICAgICAgICAgdGVzdF9udHBhdGgKICAgICAgICAgdGVzdF9vc3NhdWRpb2RldgogICAgICAgICB0ZXN0X3BvbGwKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICAiIiIsCiAgICAgJ3N1bm9zNSc6CkBAIC05NjAsNiArOTc4LDggQEAKICAgICAgICAgdGVzdF9pbWdmaWxlCiAgICAgICAgIHRlc3RfbGludXhhdWRpb2RldgogICAgICAgICB0ZXN0X29wZW5wdHkKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKICAgICAgICAgdGVzdF96aXBmaWxlCiAgICAgICAgIHRlc3RfemxpYgogICAgICAgICAiIiIsCkBAIC05ODYsNiArMTAwNiw4IEBACiAgICAgICAgIHRlc3Rfb3BlbnB0eQogICAgICAgICB0ZXN0X3B5ZXhwYXQKICAgICAgICAgdGVzdF9zYXgKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICB0ZXN0X3ppcGZpbGUKICAgICAgICAgdGVzdF96bGliCkBAIC0xMDExLDYgKzEwMzMsOCBAQAogICAgICAgICB0ZXN0X3BvbGwKICAgICAgICAgdGVzdF9wb3BlbjIKICAgICAgICAgdGVzdF9yZXNvdXJjZQorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgICIiIiwKICAgICAnY3lnd2luJzoKQEAgLTEwMzIsNiArMTA1Niw3IEBACiAgICAgICAgIHRlc3RfbmlzCiAgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKICAgICAgICAgdGVzdF9zb2NrZXRzZXJ2ZXIKKyAgICAgICAgdGVzdF9zcWxpdGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICAiIiIsCiAgICAgJ29zMmVteCc6CkBAIC0xMDU4LDYgKzEwODMsOCBAQAogICAgICAgICB0ZXN0X3B0eQogICAgICAgICB0ZXN0X3Jlc291cmNlCiAgICAgICAgIHRlc3Rfc2lnbmFsCisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgIiIiLAogICAgICdmcmVlYnNkNCc6CkBAIC0xMDg0LDYgKzExMTEsOCBAQAogICAgICAgICB0ZXN0X3NjcmlwdHBhY2thZ2VzCiAgICAgICAgIHRlc3Rfc29ja2V0X3NzbAogICAgICAgICB0ZXN0X3NvY2tldHNlcnZlcgorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3RfdGNsCiAgICAgICAgIHRlc3RfdGltZW91dApAQCAtMTExMyw2ICsxMTQyLDggQEAKICAgICAgICAgdGVzdF9tYWNvc3Rvb2xzCiAgICAgICAgIHRlc3RfbmlzCiAgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICB0ZXN0X3RjbAogICAgICAgICB0ZXN0X3dpbnJlZwpAQCAtMTEyMCw2ICsxMTUxLDM4IEBACiAgICAgICAgIHRlc3RfemlwaW1wb3J0CiAgICAgICAgIHRlc3RfemxpYgogICAgICAgICAiIiIsCisgICAgJ29wZW5ic2QzJzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfYWVwYWNrCisgICAgICAgIHRlc3RfYWwKKyAgICAgICAgdGVzdF9hcHBsZXNpbmdsZQorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIzCisgICAgICAgIHRlc3RfY2QKKyAgICAgICAgdGVzdF9jbAorICAgICAgICB0ZXN0X2N0eXBlcworICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2dsCisgICAgICAgIHRlc3RfaW1nZmlsZQorICAgICAgICB0ZXN0X2xpbnV4YXVkaW9kZXYKKyAgICAgICAgdGVzdF9sb2NhbGUKKyAgICAgICAgdGVzdF9tYWNmcworICAgICAgICB0ZXN0X21hY29zdG9vbHMKKyAgICAgICAgdGVzdF9uaXMKKyAgICAgICAgdGVzdF9ub3JtYWxpemF0aW9uCisgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKKyAgICAgICAgdGVzdF9wZXAyNzcKKyAgICAgICAgdGVzdF9wbGlzdGxpYgorICAgICAgICB0ZXN0X3NjcmlwdHBhY2thZ2VzCisgICAgICAgIHRlc3RfdGNsCisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCisgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKKyAgICAgICAgdGVzdF91bmljb2RlX2ZpbGUKKyAgICAgICAgdGVzdF93aW5yZWcKKyAgICAgICAgdGVzdF93aW5zb3VuZAorICAgICAgICAiIiIsCiB9CiBfZXhwZWN0YXRpb25zWydmcmVlYnNkNSddID0gX2V4cGVjdGF0aW9uc1snZnJlZWJzZDQnXQogX2V4cGVjdGF0aW9uc1snZnJlZWJzZDYnXSA9IF9leHBlY3RhdGlvbnNbJ2ZyZWVic2Q0J10KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX19hbGxfXy5weSBiL0xpYi90ZXN0L3Rlc3RfX19hbGxfXy5weQppbmRleCAwYjJlN2RhLi5jNDVlMTM5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X19fYWxsX18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9fX2FsbF9fLnB5CkBAIC01LDggKzUsNiBAQAogaW1wb3J0IHN5cwogaW1wb3J0IHdhcm5pbmdzCiAKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLiogcmVnc3ViIC4qIiwgRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgcidecmVnc3ViJCcpCiB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZ29waGVybGliIG1vZHVsZSBpcyBkZXByZWNhdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKQEAgLTEyOCw4ICsxMjYsNiBAQAogICAgICAgICBzZWxmLmNoZWNrX2FsbCgicXVvcHJpIikKICAgICAgICAgc2VsZi5jaGVja19hbGwoInJhbmRvbSIpCiAgICAgICAgIHNlbGYuY2hlY2tfYWxsKCJyZSIpCi0gICAgICAgIHNlbGYuY2hlY2tfYWxsKCJyZWNvbnZlcnQiKQotICAgICAgICBzZWxmLmNoZWNrX2FsbCgicmVnc3ViIikKICAgICAgICAgc2VsZi5jaGVja19hbGwoInJlcHIiKQogICAgICAgICBzZWxmLmNoZWNrX2FsbCgicmV4ZWMiKQogICAgICAgICBzZWxmLmNoZWNrX2FsbCgicmZjODIyIikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHkgYi9MaWIvdGVzdC90ZXN0X2FwcGxlc2luZ2xlLnB5CmluZGV4IDJhMmQ2MGEuLmQ1MzNmMWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcHBsZXNpbmdsZS5weQpAQCAtMTUsOCArMTUsOCBAQAogZGF0YWZvcmtkYXRhID0gJ2hlbGxvXHJcMHdvcmxkXG4nCiByZXNvdXJjZWZvcmtkYXRhID0gJ2dvb2RieWVcbmNydWVsXDB3b3JsZFxyJwogCi1hcHBsZXNpbmdsZWRhdGEgPSBzdHJ1Y3QucGFjaygibGwxNnNoIiwgQVNfTUFHSUMsIEFTX1ZFUlNJT04sICJmb28iLCAyKSArIFwKLSAgICBzdHJ1Y3QucGFjaygibGxsbGxsIiwgMSwgNTAsIGxlbihkYXRhZm9ya2RhdGEpLAorYXBwbGVzaW5nbGVkYXRhID0gc3RydWN0LnBhY2soIj5sbDE2c2giLCBBU19NQUdJQywgQVNfVkVSU0lPTiwgImZvbyIsIDIpICsgXAorICAgIHN0cnVjdC5wYWNrKCI+bGxsbGxsIiwgMSwgNTAsIGxlbihkYXRhZm9ya2RhdGEpLAogICAgICAgICAyLCA1MCtsZW4oZGF0YWZvcmtkYXRhKSwgbGVuKHJlc291cmNlZm9ya2RhdGEpKSArIFwKICAgICBkYXRhZm9ya2RhdGEgKyBcCiAgICAgcmVzb3VyY2Vmb3JrZGF0YQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weSBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKaW5kZXggODdkMzk1ZC4uNjIzNjFmYyAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAgIGJpID0gYS5idWZmZXJfaW5mbygpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGJpLCB0dXBsZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJpKSwgMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYmlbMF0sIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGJpWzBdLCAoaW50LCBsb25nKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGJpWzFdLCBpbnQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpWzFdLCBsZW4oYSkpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKaW5kZXggYjQyY2FhMy4uYzY0YWQyOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKQEAgLTExOSw3ICsxMTksOCBAQAogIyBleGNlcHRoYW5kbGVyLCBhcmd1bWVudHMsIGtleXdvcmRzLCBhbGlhcwogCiBpZiBfX25hbWVfXz09J19fbWFpbl9fJyBhbmQgc3lzLmFyZ3ZbMTpdID09IFsnLWcnXToKLSAgICBmb3Igc3RhdGVtZW50cywga2luZCBpbiAoKGV4ZWNfdGVzdHMsICJleGVjIiksIChzaW5nbGVfdGVzdHMsICJzaW5nbGUiKSwgKGV2YWxfdGVzdHMsICJldmFsIikpOgorICAgIGZvciBzdGF0ZW1lbnRzLCBraW5kIGluICgoZXhlY190ZXN0cywgImV4ZWMiKSwgKHNpbmdsZV90ZXN0cywgInNpbmdsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZhbF90ZXN0cywgImV2YWwiKSk6CiAgICAgICAgIHByaW50IGtpbmQrIl9yZXN1bHRzID0gWyIKICAgICAgICAgZm9yIHMgaW4gc3RhdGVtZW50czoKICAgICAgICAgICAgIHByaW50IHJlcHIodG9fdHVwbGUoY29tcGlsZShzLCAiPyIsIGtpbmQsIDB4NDAwKSkpKyIsIgpAQCAtMTMxLDcgKzEzMiw3IEBACiAKICAgICBpZiBub3QgaXNpbnN0YW5jZShhc3Rfbm9kZSwgX2FzdC5BU1QpIG9yIGFzdF9ub2RlLl9maWVsZHMgPT0gTm9uZToKICAgICAgICAgcmV0dXJuCi0gICAgaWYgaXNpbnN0YW5jZShhc3Rfbm9kZSwgKF9hc3QuZXhwciwgX2FzdC5zdG10KSk6CisgICAgaWYgaXNpbnN0YW5jZShhc3Rfbm9kZSwgKF9hc3QuZXhwciwgX2FzdC5zdG10LCBfYXN0LmV4Y2VwdGhhbmRsZXIpKToKICAgICAgICAgbm9kZV9wb3MgPSAoYXN0X25vZGUubGluZW5vLCBhc3Rfbm9kZS5jb2xfb2Zmc2V0KQogICAgICAgICBhc3NlcnQgbm9kZV9wb3MgPj0gcGFyZW50X3BvcywgKG5vZGVfcG9zLCBwYXJlbnRfcG9zKQogICAgICAgICBwYXJlbnRfcG9zID0gKGFzdF9ub2RlLmxpbmVubywgYXN0X25vZGUuY29sX29mZnNldCkKQEAgLTE0NSw4ICsxNDYsOCBAQAogCiBkZWYgcnVuX3Rlc3RzKCk6CiAgICAgZm9yIGlucHV0LCBvdXRwdXQsIGtpbmQgaW4gKChleGVjX3Rlc3RzLCBleGVjX3Jlc3VsdHMsICJleGVjIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmdsZV90ZXN0cywgc2luZ2xlX3Jlc3VsdHMsICJzaW5nbGUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZhbF90ZXN0cywgZXZhbF9yZXN1bHRzLCAiZXZhbCIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmdsZV90ZXN0cywgc2luZ2xlX3Jlc3VsdHMsICJzaW5nbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2YWxfdGVzdHMsIGV2YWxfcmVzdWx0cywgImV2YWwiKSk6CiAgICAgICAgIGZvciBpLCBvIGluIGl0ZXJ0b29scy5pemlwKGlucHV0LCBvdXRwdXQpOgogICAgICAgICAgICAgYXN0X3RyZWUgPSBjb21waWxlKGksICI/Iiwga2luZCwgMHg0MDApCiAgICAgICAgICAgICBhc3NlcnQgdG9fdHVwbGUoYXN0X3RyZWUpID09IG8KQEAgLTE2NSw3ICsxNjYsNyBAQAogKCdNb2R1bGUnLCBbKCdXaGlsZScsICgxLCAwKSwgKCdOYW1lJywgKDEsIDYpLCAndicsICgnTG9hZCcsKSksIFsoJ1Bhc3MnLCAoMSwgOCkpXSwgW10pXSksCiAoJ01vZHVsZScsIFsoJ0lmJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMyksICd2JywgKCdMb2FkJywpKSwgWygnUGFzcycsICgxLCA1KSldLCBbXSldKSwKICgnTW9kdWxlJywgWygnUmFpc2UnLCAoMSwgMCksICgnTmFtZScsICgxLCA2KSwgJ0V4Y2VwdGlvbicsICgnTG9hZCcsKSksICgnU3RyJywgKDEsIDE3KSwgJ3N0cmluZycpLCBOb25lKV0pLAotKCdNb2R1bGUnLCBbKCdUcnlFeGNlcHQnLCAoMSwgMCksIFsoJ1Bhc3MnLCAoMiwgMikpXSwgWygnZXhjZXB0aGFuZGxlcicsICgnTmFtZScsICgzLCA3KSwgJ0V4Y2VwdGlvbicsICgnTG9hZCcsKSksIE5vbmUsIFsoJ1Bhc3MnLCAoNCwgMikpXSldLCBbXSldKSwKKygnTW9kdWxlJywgWygnVHJ5RXhjZXB0JywgKDEsIDApLCBbKCdQYXNzJywgKDIsIDIpKV0sIFsoJ2V4Y2VwdGhhbmRsZXInLCAoMywgMCksICgnTmFtZScsICgzLCA3KSwgJ0V4Y2VwdGlvbicsICgnTG9hZCcsKSksIE5vbmUsIFsoJ1Bhc3MnLCAoNCwgMikpXSwgMywgMCldLCBbXSldKSwKICgnTW9kdWxlJywgWygnVHJ5RmluYWxseScsICgxLCAwKSwgWygnUGFzcycsICgyLCAyKSldLCBbKCdQYXNzJywgKDQsIDIpKV0pXSksCiAoJ01vZHVsZScsIFsoJ0Fzc2VydCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDcpLCAndicsICgnTG9hZCcsKSksIE5vbmUpXSksCiAoJ01vZHVsZScsIFsoJ0ltcG9ydCcsICgxLCAwKSwgWygnYWxpYXMnLCAnc3lzJywgTm9uZSldKV0pLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hdWRpb29wLnB5IGIvTGliL3Rlc3QvdGVzdF9hdWRpb29wLnB5CmluZGV4IDQ0MGFkYWIuLmY1ODU3MzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXVkaW9vcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2F1ZGlvb3AucHkKQEAgLTEzNiwxMiArMTM2LDMwIEBACiAgICAgICAgIHJldHVybiAwCiAgICAgcmV0dXJuIDEKIAorZGVmIHRlc3RsaW4yYWxhdyhkYXRhKToKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnbGluMmFsYXcnCisgICAgaWYgYXVkaW9vcC5saW4yYWxhdyhkYXRhWzBdLCAxKSAhPSAnXHhkNVx4YzVceGY1JyBvciBcCisgICAgICAgICAgICAgIGF1ZGlvb3AubGluMmFsYXcoZGF0YVsxXSwgMikgIT0gJ1x4ZDVceGQ1XHhkNScgb3IgXAorICAgICAgICAgICAgICBhdWRpb29wLmxpbjJhbGF3KGRhdGFbMl0sIDQpICE9ICdceGQ1XHhkNVx4ZDUnOgorICAgICAgICByZXR1cm4gMAorICAgIHJldHVybiAxCisKK2RlZiB0ZXN0YWxhdzJsaW4oZGF0YSk6CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2FsYXcybGluJworICAgICMgQ3Vyc29yeQorICAgIGQgPSBhdWRpb29wLmxpbjJhbGF3KGRhdGFbMF0sIDEpCisgICAgaWYgYXVkaW9vcC5hbGF3MmxpbihkLCAxKSAhPSBkYXRhWzBdOgorICAgICAgICByZXR1cm4gMAorICAgIHJldHVybiAxCisKIGRlZiB0ZXN0bGluMnVsYXcoZGF0YSk6CiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgJ2xpbjJ1bGF3JwotICAgIGlmIGF1ZGlvb3AubGluMnVsYXcoZGF0YVswXSwgMSkgIT0gJ1wzNzdcMzQ3XDMzMycgb3IgXAotICAgICAgICAgICAgICBhdWRpb29wLmxpbjJ1bGF3KGRhdGFbMV0sIDIpICE9ICdcMzc3XDM3N1wzNzcnIG9yIFwKLSAgICAgICAgICAgICAgYXVkaW9vcC5saW4ydWxhdyhkYXRhWzJdLCA0KSAhPSAnXDM3N1wzNzdcMzc3JzoKKyAgICBpZiBhdWRpb29wLmxpbjJ1bGF3KGRhdGFbMF0sIDEpICE9ICdceGZmXHhlN1x4ZGInIG9yIFwKKyAgICAgICAgICAgICAgYXVkaW9vcC5saW4ydWxhdyhkYXRhWzFdLCAyKSAhPSAnXHhmZlx4ZmZceGZmJyBvciBcCisgICAgICAgICAgICAgIGF1ZGlvb3AubGluMnVsYXcoZGF0YVsyXSwgNCkgIT0gJ1x4ZmZceGZmXHhmZic6CiAgICAgICAgIHJldHVybiAwCiAgICAgcmV0dXJuIDEKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkgYi9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weQppbmRleCAyMmNjYTQ0Li4wMzA5ZDZlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weQpAQCAtMSwyNTggKzEsMzEyIEBACiAjIEF1Z21lbnRlZCBhc3NpZ25tZW50IHRlc3QuCiAKLXggPSAyCi14ICs9IDEKLXggKj0gMgoteCAqKj0gMgoteCAtPSA4Ci14ICU9IDEyCi14ID4+PSAxCi14ICY9IDIKLXggfD0gNQoteCBePSAxCi14IDw8PSAyCi14IC89IDIKLXggLy89IDIKLQotcHJpbnQgeAotcHJpbnQgaW50KHgpCi0KLXggPSBbMl0KLXhbMF0gKz0gMQoteFswXSAqPSAyCi14WzBdICoqPSAyCi14WzBdIC09IDgKLXhbMF0gJT0gMTIKLXhbMF0gPj49IDEKLXhbMF0gJj0gMgoteFswXSB8PSA1Ci14WzBdIF49IDEKLXhbMF0gPDw9IDIKLXhbMF0gLz0gMgoteFswXSAvLz0gMgotCi1wcmludCB4Ci1wcmludCBpbnQoeFswXSkKLQoteCA9IHswOiAyfQoteFswXSArPSAxCi14WzBdICo9IDIKLXhbMF0gKio9IDIKLXhbMF0gLT0gOAoteFswXSAlPSAxMgoteFswXSA+Pj0gMQoteFswXSAmPSAyCi14WzBdIHw9IDUKLXhbMF0gXj0gMQoteFswXSA8PD0gMgoteFswXSAvPSAyCi14WzBdIC8vPSAyCi0KLXByaW50IHhbMF0KLXByaW50IGludCh4WzBdKQotCi14ID0gWzEsMl0KLXggKz0gWzMsNF0KLXggKj0gMgotCi1wcmludCB4Ci0KLXggPSBbMSwgMiwgM10KLXkgPSB4Ci14WzE6Ml0gKj0gMgoteVsxOjJdICs9IFsxXQotCi1wcmludCB4Ci1wcmludCB4IGlzIHkKLQotY2xhc3MgYXVnX3Rlc3Q6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKLSAgICAgICAgc2VsZi52YWwgPSB2YWx1ZQotICAgIGRlZiBfX3JhZGRfXyhzZWxmLCB2YWwpOgotICAgICAgICByZXR1cm4gc2VsZi52YWwgKyB2YWwKLSAgICBkZWYgX19hZGRfXyhzZWxmLCB2YWwpOgotICAgICAgICByZXR1cm4gYXVnX3Rlc3Qoc2VsZi52YWwgKyB2YWwpCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAogCiAKLWNsYXNzIGF1Z190ZXN0MihhdWdfdGVzdCk6Ci0gICAgZGVmIF9faWFkZF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHNlbGYudmFsID0gc2VsZi52YWwgKyB2YWwKLSAgICAgICAgcmV0dXJuIHNlbGYKK2NsYXNzIEF1Z0Fzc2lnblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0QmFzaWMoc2VsZik6CisgICAgICAgIHggPSAyCisgICAgICAgIHggKz0gMQorICAgICAgICB4ICo9IDIKKyAgICAgICAgeCAqKj0gMgorICAgICAgICB4IC09IDgKKyAgICAgICAgeCAvLz0gNQorICAgICAgICB4ICU9IDMKKyAgICAgICAgeCAmPSAyCisgICAgICAgIHggfD0gNQorICAgICAgICB4IF49IDEKKyAgICAgICAgeCAvPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIDMuMCkKIAotY2xhc3MgYXVnX3Rlc3QzKGF1Z190ZXN0KToKLSAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKLSAgICAgICAgcmV0dXJuIGF1Z190ZXN0MyhzZWxmLnZhbCArIHZhbCkKKyAgICBkZWYgdGVzdEluTGlzdChzZWxmKToKKyAgICAgICAgeCA9IFsyXQorICAgICAgICB4WzBdICs9IDEKKyAgICAgICAgeFswXSAqPSAyCisgICAgICAgIHhbMF0gKio9IDIKKyAgICAgICAgeFswXSAtPSA4CisgICAgICAgIHhbMF0gLy89IDUKKyAgICAgICAgeFswXSAlPSAzCisgICAgICAgIHhbMF0gJj0gMgorICAgICAgICB4WzBdIHw9IDUKKyAgICAgICAgeFswXSBePSAxCisgICAgICAgIHhbMF0gLz0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4WzBdLCAzLjApCiAKLXggPSBhdWdfdGVzdCgxKQoteSA9IHgKLXggKz0gMTAKKyAgICBkZWYgdGVzdEluRGljdChzZWxmKToKKyAgICAgICAgeCA9IHswOiAyfQorICAgICAgICB4WzBdICs9IDEKKyAgICAgICAgeFswXSAqPSAyCisgICAgICAgIHhbMF0gKio9IDIKKyAgICAgICAgeFswXSAtPSA4CisgICAgICAgIHhbMF0gLy89IDUKKyAgICAgICAgeFswXSAlPSAzCisgICAgICAgIHhbMF0gJj0gMgorICAgICAgICB4WzBdIHw9IDUKKyAgICAgICAgeFswXSBePSAxCisgICAgICAgIHhbMF0gLz0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4WzBdLCAzLjApCiAKLXByaW50IGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QpCi1wcmludCB5IGlzIG5vdCB4Ci1wcmludCB4LnZhbAorICAgIGRlZiB0ZXN0U2VxdWVuY2VzKHNlbGYpOgorICAgICAgICB4ID0gWzEsMl0KKyAgICAgICAgeCArPSBbMyw0XQorICAgICAgICB4ICo9IDIKIAoteCA9IGF1Z190ZXN0MigyKQoteSA9IHgKLXggKz0gMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgWzEsIDIsIDMsIDQsIDEsIDIsIDMsIDRdKQogCi1wcmludCB5IGlzIHgKLXByaW50IHgudmFsCisgICAgICAgIHggPSBbMSwgMiwgM10KKyAgICAgICAgeSA9IHgKKyAgICAgICAgeFsxOjJdICo9IDIKKyAgICAgICAgeVsxOjJdICs9IFsxXQogCi14ID0gYXVnX3Rlc3QzKDMpCi15ID0geAoteCArPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCBbMSwgMiwgMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh4IGlzIHkpCiAKLXByaW50IGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QzKQotcHJpbnQgeSBpcyBub3QgeAotcHJpbnQgeC52YWwKKyAgICBkZWYgdGVzdEN1c3RvbU1ldGhvZHMxKHNlbGYpOgogCi1jbGFzcyB0ZXN0YWxsOgorICAgICAgICBjbGFzcyBhdWdfdGVzdDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWwgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fcmFkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsICsgdmFsCisgICAgICAgICAgICBkZWYgX19hZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIHJldHVybiBhdWdfdGVzdChzZWxmLnZhbCArIHZhbCkKIAotICAgIGRlZiBfX2FkZF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2FkZF9fIGNhbGxlZCIKLSAgICBkZWYgX19yYWRkX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcmFkZF9fIGNhbGxlZCIKLSAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faWFkZF9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgY2xhc3MgYXVnX3Rlc3QyKGF1Z190ZXN0KToKKyAgICAgICAgICAgIGRlZiBfX2lhZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsID0gc2VsZi52YWwgKyB2YWwKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi0gICAgZGVmIF9fc3ViX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fc3ViX18gY2FsbGVkIgotICAgIGRlZiBfX3JzdWJfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19yc3ViX18gY2FsbGVkIgotICAgIGRlZiBfX2lzdWJfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pc3ViX18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBjbGFzcyBhdWdfdGVzdDMoYXVnX3Rlc3QpOgorICAgICAgICAgICAgZGVmIF9faWFkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGF1Z190ZXN0MyhzZWxmLnZhbCArIHZhbCkKIAotICAgIGRlZiBfX211bF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX211bF9fIGNhbGxlZCIKLSAgICBkZWYgX19ybXVsX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcm11bF9fIGNhbGxlZCIKLSAgICBkZWYgX19pbXVsX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faW11bF9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgeCA9IGF1Z190ZXN0KDEpCisgICAgICAgIHkgPSB4CisgICAgICAgIHggKz0gMTAKIAotICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fZmxvb3JkaXZfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCi0gICAgZGVmIF9faWZsb29yZGl2X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faWZsb29yZGl2X18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgotICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3JmbG9vcmRpdl9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QpKQorICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC52YWwsIDExKQogCi0gICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3RydWVkaXZfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCi0gICAgZGVmIF9faXRydWVkaXZfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pdHJ1ZWRpdl9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKLSAgICBkZWYgX19ydHJ1ZWRpdl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3J0cnVlZGl2X18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICB4ID0gYXVnX3Rlc3QyKDIpCisgICAgICAgIHkgPSB4CisgICAgICAgIHggKz0gMTAKIAotICAgIGRlZiBfX21vZF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX21vZF9fIGNhbGxlZCIKLSAgICBkZWYgX19ybW9kX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcm1vZF9fIGNhbGxlZCIKLSAgICBkZWYgX19pbW9kX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faW1vZF9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC52YWwsIDEyKQogCi0gICAgZGVmIF9fcG93X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcG93X18gY2FsbGVkIgotICAgIGRlZiBfX3Jwb3dfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19ycG93X18gY2FsbGVkIgotICAgIGRlZiBfX2lwb3dfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pcG93X18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICB4ID0gYXVnX3Rlc3QzKDMpCisgICAgICAgIHkgPSB4CisgICAgICAgIHggKz0gMTAKIAotICAgIGRlZiBfX29yX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fb3JfXyBjYWxsZWQiCi0gICAgZGVmIF9fcm9yX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcm9yX18gY2FsbGVkIgotICAgIGRlZiBfX2lvcl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2lvcl9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgudmFsLCAxMykKIAotICAgIGRlZiBfX2FuZF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2FuZF9fIGNhbGxlZCIKLSAgICBkZWYgX19yYW5kX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcmFuZF9fIGNhbGxlZCIKLSAgICBkZWYgX19pYW5kX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faWFuZF9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKIAotICAgIGRlZiBfX3hvcl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3hvcl9fIGNhbGxlZCIKLSAgICBkZWYgX19yeG9yX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcnhvcl9fIGNhbGxlZCIKLSAgICBkZWYgX19peG9yX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faXhvcl9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgdGVzdEN1c3RvbU1ldGhvZHMyKHRlc3Rfc2VsZik6CisgICAgICAgIG91dHB1dCA9IFtdCiAKLSAgICBkZWYgX19yc2hpZnRfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19yc2hpZnRfXyBjYWxsZWQiCi0gICAgZGVmIF9fcnJzaGlmdF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3Jyc2hpZnRfXyBjYWxsZWQiCi0gICAgZGVmIF9faXJzaGlmdF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2lyc2hpZnRfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGNsYXNzIHRlc3RhbGw6CisgICAgICAgICAgICBkZWYgX19hZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fYWRkX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JhZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcmFkZF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lhZGRfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLSAgICBkZWYgX19sc2hpZnRfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19sc2hpZnRfXyBjYWxsZWQiCi0gICAgZGVmIF9fcmxzaGlmdF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3Jsc2hpZnRfXyBjYWxsZWQiCi0gICAgZGVmIF9faWxzaGlmdF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2lsc2hpZnRfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19zdWJfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fc3ViX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JzdWJfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcnN1Yl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pc3ViX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lzdWJfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLXggPSB0ZXN0YWxsKCkKLXggKyAxCi0xICsgeAoteCArPSAxCisgICAgICAgICAgICBkZWYgX19tdWxfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fbXVsX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JtdWxfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcm11bF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pbXVsX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2ltdWxfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLXggLSAxCi0xIC0geAoteCAtPSAxCisgICAgICAgICAgICBkZWYgX19kaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcmRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLXggKiAxCi0xICogeAoteCAqPSAxCisgICAgICAgICAgICBkZWYgX19mbG9vcmRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19mbG9vcmRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBfX2lmbG9vcmRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pZmxvb3JkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19yZmxvb3JkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcmZsb29yZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi14IC8gMQotMSAvIHgKLXggLz0gMQorICAgICAgICAgICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX190cnVlZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9fcnRydWVkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcnRydWVkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19pdHJ1ZWRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pdHJ1ZWRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCAvLyAxCi0xIC8vIHgKLXggLy89IDEKKyAgICAgICAgICAgIGRlZiBfX21vZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19tb2RfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcm1vZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ybW9kX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2ltb2RfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faW1vZF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCAlIDEKLTEgJSB4Ci14ICU9IDEKKyAgICAgICAgICAgIGRlZiBfX3Bvd19fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19wb3dfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcnBvd19fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ycG93X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lwb3dfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXBvd19fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCAqKiAxCi0xICoqIHgKLXggKio9IDEKKyAgICAgICAgICAgIGRlZiBfX29yX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX29yX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3Jvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yb3JfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faW9yX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lvcl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCB8IDEKLTEgfCB4Ci14IHw9IDEKKyAgICAgICAgICAgIGRlZiBfX2FuZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19hbmRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcmFuZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yYW5kX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lhbmRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWFuZF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCAmIDEKLTEgJiB4Ci14ICY9IDEKKyAgICAgICAgICAgIGRlZiBfX3hvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX194b3JfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcnhvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yeG9yX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2l4b3JfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXhvcl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCBeIDEKLTEgXiB4Ci14IF49IDEKKyAgICAgICAgICAgIGRlZiBfX3JzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yc2hpZnRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcnJzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ycnNoaWZ0X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lyc2hpZnRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXJzaGlmdF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCA+PiAxCi0xID4+IHgKLXggPj49IDEKKyAgICAgICAgICAgIGRlZiBfX2xzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19sc2hpZnRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcmxzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ybHNoaWZ0X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lsc2hpZnRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWxzaGlmdF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCA8PCAxCi0xIDw8IHgKLXggPDw9IDEKKyAgICAgICAgeCA9IHRlc3RhbGwoKQorICAgICAgICB4ICsgMQorICAgICAgICAxICsgeAorICAgICAgICB4ICs9IDEKKworICAgICAgICB4IC0gMQorICAgICAgICAxIC0geAorICAgICAgICB4IC09IDEKKworICAgICAgICB4ICogMQorICAgICAgICAxICogeAorICAgICAgICB4ICo9IDEKKworICAgICAgICB4IC8gMQorICAgICAgICAxIC8geAorICAgICAgICB4IC89IDEKKworICAgICAgICB4IC8vIDEKKyAgICAgICAgMSAvLyB4CisgICAgICAgIHggLy89IDEKKworICAgICAgICB4ICUgMQorICAgICAgICAxICUgeAorICAgICAgICB4ICU9IDEKKworICAgICAgICB4ICoqIDEKKyAgICAgICAgMSAqKiB4CisgICAgICAgIHggKio9IDEKKworICAgICAgICB4IHwgMQorICAgICAgICAxIHwgeAorICAgICAgICB4IHw9IDEKKworICAgICAgICB4ICYgMQorICAgICAgICAxICYgeAorICAgICAgICB4ICY9IDEKKworICAgICAgICB4IF4gMQorICAgICAgICAxIF4geAorICAgICAgICB4IF49IDEKKworICAgICAgICB4ID4+IDEKKyAgICAgICAgMSA+PiB4CisgICAgICAgIHggPj49IDEKKworICAgICAgICB4IDw8IDEKKyAgICAgICAgMSA8PCB4CisgICAgICAgIHggPDw9IDEKKworICAgICAgICB0ZXN0X3NlbGYuYXNzZXJ0RXF1YWxzKG91dHB1dCwgJycnXAorX19hZGRfXyBjYWxsZWQKK19fcmFkZF9fIGNhbGxlZAorX19pYWRkX18gY2FsbGVkCitfX3N1Yl9fIGNhbGxlZAorX19yc3ViX18gY2FsbGVkCitfX2lzdWJfXyBjYWxsZWQKK19fbXVsX18gY2FsbGVkCitfX3JtdWxfXyBjYWxsZWQKK19faW11bF9fIGNhbGxlZAorX190cnVlZGl2X18gY2FsbGVkCitfX3J0cnVlZGl2X18gY2FsbGVkCitfX2l0cnVlZGl2X18gY2FsbGVkCitfX2Zsb29yZGl2X18gY2FsbGVkCitfX3JmbG9vcmRpdl9fIGNhbGxlZAorX19pZmxvb3JkaXZfXyBjYWxsZWQKK19fbW9kX18gY2FsbGVkCitfX3Jtb2RfXyBjYWxsZWQKK19faW1vZF9fIGNhbGxlZAorX19wb3dfXyBjYWxsZWQKK19fcnBvd19fIGNhbGxlZAorX19pcG93X18gY2FsbGVkCitfX29yX18gY2FsbGVkCitfX3Jvcl9fIGNhbGxlZAorX19pb3JfXyBjYWxsZWQKK19fYW5kX18gY2FsbGVkCitfX3JhbmRfXyBjYWxsZWQKK19faWFuZF9fIGNhbGxlZAorX194b3JfXyBjYWxsZWQKK19fcnhvcl9fIGNhbGxlZAorX19peG9yX18gY2FsbGVkCitfX3JzaGlmdF9fIGNhbGxlZAorX19ycnNoaWZ0X18gY2FsbGVkCitfX2lyc2hpZnRfXyBjYWxsZWQKK19fbHNoaWZ0X18gY2FsbGVkCitfX3Jsc2hpZnRfXyBjYWxsZWQKK19faWxzaGlmdF9fIGNhbGxlZAorJycnLnNwbGl0bGluZXMoKSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChBdWdBc3NpZ25UZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5IGIvTGliL3Rlc3QvdGVzdF9ic2RkYi5weQppbmRleCAxZWM0ODAxLi41MTNlNTQxIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkKQEAgLTExLDkgKzExLDEwIEBACiBmcm9tIHNldHMgaW1wb3J0IFNldAogCiBjbGFzcyBUZXN0QlNEREIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIG9wZW5mbGFnID0gJ2MnCiAKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuZiA9IHNlbGYub3Blbm1ldGhvZFswXShzZWxmLmZuYW1lLCAnYycpCisgICAgICAgIHNlbGYuZiA9IHNlbGYub3Blbm1ldGhvZFswXShzZWxmLmZuYW1lLCBzZWxmLm9wZW5mbGFnLCBjYWNoZXNpemU9MzI3NjgpCiAgICAgICAgIHNlbGYuZCA9IGRpY3QocT0nR3VpZG8nLCB3PSd2YW4nLCBlPSdSb3NzdW0nLCByPSdpbnZlbnRlZCcsIHQ9J1B5dGhvbicsIHk9JycpCiAgICAgICAgIGZvciBrLCB2IGluIHNlbGYuZC5pdGVyaXRlbXMoKToKICAgICAgICAgICAgIHNlbGYuZltrXSA9IHYKQEAgLTI2Nyw2ICsyNjgsMTEgQEAKICAgICBmbmFtZSA9IE5vbmUKICAgICBvcGVubWV0aG9kID0gW2JzZGRiLmJ0b3Blbl0KIAorY2xhc3MgVGVzdEJUcmVlX0luTWVtb3J5X1RydW5jYXRlKFRlc3RCU0REQik6CisgICAgZm5hbWUgPSBOb25lCisgICAgb3BlbmZsYWcgPSAnbicKKyAgICBvcGVubWV0aG9kID0gW2JzZGRiLmJ0b3Blbl0KKwogY2xhc3MgVGVzdEhhc2hUYWJsZShUZXN0QlNEREIpOgogICAgIGZuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgogICAgIG9wZW5tZXRob2QgPSBbYnNkZGIuaGFzaG9wZW5dCkBAIC0yODUsNiArMjkxLDcgQEAKICAgICAgICAgVGVzdEhhc2hUYWJsZSwKICAgICAgICAgVGVzdEJUcmVlX0luTWVtb3J5LAogICAgICAgICBUZXN0SGFzaFRhYmxlX0luTWVtb3J5LAorICAgICAgICBUZXN0QlRyZWVfSW5NZW1vcnlfVHJ1bmNhdGUsCiAgICAgKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5IGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CmluZGV4IDZmMTFmZGQuLmVmNGY0MDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKQEAgLTEwOCw2ICsxMDgsNyBAQAogICAgICAgICBfX2ltcG9ydF9fKCdzdHJpbmcnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvciwgX19pbXBvcnRfXywgJ3NwYW1zcGFtJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBfX2ltcG9ydF9fLCAxLCAyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBfX2ltcG9ydF9fLCAnJykKIAogICAgIGRlZiB0ZXN0X2FicyhzZWxmKToKICAgICAgICAgIyBpbnQKQEAgLTEzMTcsNiArMTMxOCw5IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtOC4wLCAtMSksIC0xMC4wKQogCisgICAgICAgICMgdGVzdCBuZXcga3dhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQobnVtYmVyPS04LjAsIG5kaWdpdHM9LTEpLCAtMTAuMCkKKwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJvdW5kKQogCiAgICAgZGVmIHRlc3Rfc2V0YXR0cihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkgYi9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CmluZGV4IDM0ZDM2NWIuLmU0MTQzMjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weQpAQCAtNCw2ICs0LDIwMiBAQAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAogCityZXN1bHRfMjAwNF90ZXh0ID0gIiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwNAorCisgICAgICBKYW51YXJ5ICAgICAgICAgICAgICAgICAgIEZlYnJ1YXJ5ICAgICAgICAgICAgICAgICAgIE1hcmNoCitNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UKKyAgICAgICAgICAxICAyICAzICA0ICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgMSAgMiAgMyAgNCAgNSAgNiAgNworIDUgIDYgIDcgIDggIDkgMTAgMTEgICAgICAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgICAgICA4ICA5IDEwIDExIDEyIDEzIDE0CisxMiAxMyAxNCAxNSAxNiAxNyAxOCAgICAgICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgICAgMTUgMTYgMTcgMTggMTkgMjAgMjEKKzE5IDIwIDIxIDIyIDIzIDI0IDI1ICAgICAgMTYgMTcgMTggMTkgMjAgMjEgMjIgICAgICAyMiAyMyAyNCAyNSAyNiAyNyAyOAorMjYgMjcgMjggMjkgMzAgMzEgICAgICAgICAyMyAyNCAyNSAyNiAyNyAyOCAyOSAgICAgIDI5IDMwIDMxCisKKyAgICAgICBBcHJpbCAgICAgICAgICAgICAgICAgICAgICBNYXkgICAgICAgICAgICAgICAgICAgICAgIEp1bmUKK01vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdQorICAgICAgICAgIDEgIDIgIDMgIDQgICAgICAgICAgICAgICAgICAgICAgMSAgMiAgICAgICAgICAxICAyICAzICA0ICA1ICA2CisgNSAgNiAgNyAgOCAgOSAxMCAxMSAgICAgICAzICA0ICA1ICA2ICA3ICA4ICA5ICAgICAgIDcgIDggIDkgMTAgMTEgMTIgMTMKKzEyIDEzIDE0IDE1IDE2IDE3IDE4ICAgICAgMTAgMTEgMTIgMTMgMTQgMTUgMTYgICAgICAxNCAxNSAxNiAxNyAxOCAxOSAyMAorMTkgMjAgMjEgMjIgMjMgMjQgMjUgICAgICAxNyAxOCAxOSAyMCAyMSAyMiAyMyAgICAgIDIxIDIyIDIzIDI0IDI1IDI2IDI3CisyNiAyNyAyOCAyOSAzMCAgICAgICAgICAgIDI0IDI1IDI2IDI3IDI4IDI5IDMwICAgICAgMjggMjkgMzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzEKKworICAgICAgICBKdWx5ICAgICAgICAgICAgICAgICAgICAgQXVndXN0ICAgICAgICAgICAgICAgICAgU2VwdGVtYmVyCitNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UKKyAgICAgICAgICAxICAyICAzICA0ICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgMSAgMiAgMyAgNCAgNQorIDUgIDYgIDcgIDggIDkgMTAgMTEgICAgICAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgICAgICA2ICA3ICA4ICA5IDEwIDExIDEyCisxMiAxMyAxNCAxNSAxNiAxNyAxOCAgICAgICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgICAgMTMgMTQgMTUgMTYgMTcgMTggMTkKKzE5IDIwIDIxIDIyIDIzIDI0IDI1ICAgICAgMTYgMTcgMTggMTkgMjAgMjEgMjIgICAgICAyMCAyMSAyMiAyMyAyNCAyNSAyNgorMjYgMjcgMjggMjkgMzAgMzEgICAgICAgICAyMyAyNCAyNSAyNiAyNyAyOCAyOSAgICAgIDI3IDI4IDI5IDMwCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMwIDMxCisKKyAgICAgIE9jdG9iZXIgICAgICAgICAgICAgICAgICAgTm92ZW1iZXIgICAgICAgICAgICAgICAgICBEZWNlbWJlcgorTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1CisgICAgICAgICAgICAgMSAgMiAgMyAgICAgICAxICAyICAzICA0ICA1ICA2ICA3ICAgICAgICAgICAgIDEgIDIgIDMgIDQgIDUKKyA0ICA1ICA2ICA3ICA4ICA5IDEwICAgICAgIDggIDkgMTAgMTEgMTIgMTMgMTQgICAgICAgNiAgNyAgOCAgOSAxMCAxMSAxMgorMTEgMTIgMTMgMTQgMTUgMTYgMTcgICAgICAxNSAxNiAxNyAxOCAxOSAyMCAyMSAgICAgIDEzIDE0IDE1IDE2IDE3IDE4IDE5CisxOCAxOSAyMCAyMSAyMiAyMyAyNCAgICAgIDIyIDIzIDI0IDI1IDI2IDI3IDI4ICAgICAgMjAgMjEgMjIgMjMgMjQgMjUgMjYKKzI1IDI2IDI3IDI4IDI5IDMwIDMxICAgICAgMjkgMzAgICAgICAgICAgICAgICAgICAgICAyNyAyOCAyOSAzMCAzMQorIiIiCisKK3Jlc3VsdF8yMDA0X2h0bWwgPSAiIiIKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9ImFzY2lpIj8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9YXNjaWkiIC8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjYWxlbmRhci5jc3MiIC8+Cis8dGl0bGU+Q2FsZW5kYXIgZm9yIDIwMDQ8L3RpdGxlCis8L2hlYWQ+Cis8Ym9keT4KKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InllYXIiPgorPHRyPjx0aCBjb2xzcGFuPSIzIiBjbGFzcz0ieWVhciI+MjAwNDwvdGg+PC90cj48dHI+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5KYW51YXJ5PC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yPC90ZD48dGQgY2xhc3M9InNhdCI+MzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjU8L3RkPjx0ZCBjbGFzcz0idHVlIj42PC90ZD48dGQgY2xhc3M9IndlZCI+NzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjg8L3RkPjx0ZCBjbGFzcz0iZnJpIj45PC90ZD48dGQgY2xhc3M9InNhdCI+MTA8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTI8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE0PC90ZD48dGQgY2xhc3M9InRodSI+MTU8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE3PC90ZD48dGQgY2xhc3M9InN1biI+MTg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE5PC90ZD48dGQgY2xhc3M9InR1ZSI+MjA8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIyPC90ZD48dGQgY2xhc3M9ImZyaSI+MjM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI1PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI3PC90ZD48dGQgY2xhc3M9IndlZCI+Mjg8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yOTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjMwPC90ZD48dGQgY2xhc3M9InNhdCI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+RmVicnVhcnk8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InN1biI+MTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjM8L3RkPjx0ZCBjbGFzcz0id2VkIj40PC90ZD48dGQgY2xhc3M9InRodSI+NTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij43PC90ZD48dGQgY2xhc3M9InN1biI+ODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+OTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEwPC90ZD48dGQgY2xhc3M9IndlZCI+MTE8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEzPC90ZD48dGQgY2xhc3M9InNhdCI+MTQ8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTY8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE4PC90ZD48dGQgY2xhc3M9InRodSI+MTk8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIxPC90ZD48dGQgY2xhc3M9InN1biI+MjI8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIzPC90ZD48dGQgY2xhc3M9InR1ZSI+MjQ8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI2PC90ZD48dGQgY2xhc3M9ImZyaSI+Mjc8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yODwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI5PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5NYXJjaDwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xPC90ZD48dGQgY2xhc3M9InR1ZSI+MjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjM8L3RkPjx0ZCBjbGFzcz0idGh1Ij40PC90ZD48dGQgY2xhc3M9ImZyaSI+NTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjY8L3RkPjx0ZCBjbGFzcz0ic3VuIj43PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj44PC90ZD48dGQgY2xhc3M9InR1ZSI+OTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjEwPC90ZD48dGQgY2xhc3M9InRodSI+MTE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjEzPC90ZD48dGQgY2xhc3M9InN1biI+MTQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE1PC90ZD48dGQgY2xhc3M9InR1ZSI+MTY8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE4PC90ZD48dGQgY2xhc3M9ImZyaSI+MTk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIxPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIzPC90ZD48dGQgY2xhc3M9IndlZCI+MjQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI2PC90ZD48dGQgY2xhc3M9InNhdCI+Mjc8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+Mjk8L3RkPjx0ZCBjbGFzcz0idHVlIj4zMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjMxPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48L3RyPjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkFwcmlsPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yPC90ZD48dGQgY2xhc3M9InNhdCI+MzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjU8L3RkPjx0ZCBjbGFzcz0idHVlIj42PC90ZD48dGQgY2xhc3M9IndlZCI+NzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjg8L3RkPjx0ZCBjbGFzcz0iZnJpIj45PC90ZD48dGQgY2xhc3M9InNhdCI+MTA8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTI8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE0PC90ZD48dGQgY2xhc3M9InRodSI+MTU8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE3PC90ZD48dGQgY2xhc3M9InN1biI+MTg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE5PC90ZD48dGQgY2xhc3M9InR1ZSI+MjA8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIyPC90ZD48dGQgY2xhc3M9ImZyaSI+MjM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI1PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI3PC90ZD48dGQgY2xhc3M9IndlZCI+Mjg8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yOTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjMwPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+TWF5PC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xPC90ZD48dGQgY2xhc3M9InN1biI+MjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjQ8L3RkPjx0ZCBjbGFzcz0id2VkIj41PC90ZD48dGQgY2xhc3M9InRodSI+NjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjc8L3RkPjx0ZCBjbGFzcz0ic2F0Ij44PC90ZD48dGQgY2xhc3M9InN1biI+OTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTA8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjEyPC90ZD48dGQgY2xhc3M9InRodSI+MTM8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE1PC90ZD48dGQgY2xhc3M9InN1biI+MTY8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE3PC90ZD48dGQgY2xhc3M9InR1ZSI+MTg8L3RkPjx0ZCBjbGFzcz0id2VkIj4xOTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIwPC90ZD48dGQgY2xhc3M9ImZyaSI+MjE8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yMjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIzPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI1PC90ZD48dGQgY2xhc3M9IndlZCI+MjY8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI4PC90ZD48dGQgY2xhc3M9InNhdCI+Mjk8L3RkPjx0ZCBjbGFzcz0ic3VuIj4zMDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkp1bmU8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0idHVlIj4xPC90ZD48dGQgY2xhc3M9IndlZCI+MjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjM8L3RkPjx0ZCBjbGFzcz0iZnJpIj40PC90ZD48dGQgY2xhc3M9InNhdCI+NTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjY8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjc8L3RkPjx0ZCBjbGFzcz0idHVlIj44PC90ZD48dGQgY2xhc3M9IndlZCI+OTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjEwPC90ZD48dGQgY2xhc3M9ImZyaSI+MTE8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjEzPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xNDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE1PC90ZD48dGQgY2xhc3M9IndlZCI+MTY8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE4PC90ZD48dGQgY2xhc3M9InNhdCI+MTk8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yMDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjE8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIzPC90ZD48dGQgY2xhc3M9InRodSI+MjQ8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yNTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI2PC90ZD48dGQgY2xhc3M9InN1biI+Mjc8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI4PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjk8L3RkPjx0ZCBjbGFzcz0id2VkIj4zMDwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PC90cj48dHI+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5KdWx5PC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yPC90ZD48dGQgY2xhc3M9InNhdCI+MzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjU8L3RkPjx0ZCBjbGFzcz0idHVlIj42PC90ZD48dGQgY2xhc3M9IndlZCI+NzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjg8L3RkPjx0ZCBjbGFzcz0iZnJpIj45PC90ZD48dGQgY2xhc3M9InNhdCI+MTA8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTI8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE0PC90ZD48dGQgY2xhc3M9InRodSI+MTU8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE3PC90ZD48dGQgY2xhc3M9InN1biI+MTg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE5PC90ZD48dGQgY2xhc3M9InR1ZSI+MjA8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIyPC90ZD48dGQgY2xhc3M9ImZyaSI+MjM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI1PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI3PC90ZD48dGQgY2xhc3M9IndlZCI+Mjg8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yOTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjMwPC90ZD48dGQgY2xhc3M9InNhdCI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+QXVndXN0PC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI8L3RkPjx0ZCBjbGFzcz0idHVlIj4zPC90ZD48dGQgY2xhc3M9IndlZCI+NDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjU8L3RkPjx0ZCBjbGFzcz0iZnJpIj42PC90ZD48dGQgY2xhc3M9InNhdCI+NzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjk8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjExPC90ZD48dGQgY2xhc3M9InRodSI+MTI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE0PC90ZD48dGQgY2xhc3M9InN1biI+MTU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE2PC90ZD48dGQgY2xhc3M9InR1ZSI+MTc8L3RkPjx0ZCBjbGFzcz0id2VkIj4xODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE5PC90ZD48dGQgY2xhc3M9ImZyaSI+MjA8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yMTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIyPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI0PC90ZD48dGQgY2xhc3M9IndlZCI+MjU8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI3PC90ZD48dGQgY2xhc3M9InNhdCI+Mjg8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yOTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MzA8L3RkPjx0ZCBjbGFzcz0idHVlIj4zMTwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPlNlcHRlbWJlcjwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9IndlZCI+MTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4zPC90ZD48dGQgY2xhc3M9InNhdCI+NDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjY8L3RkPjx0ZCBjbGFzcz0idHVlIj43PC90ZD48dGQgY2xhc3M9IndlZCI+ODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjk8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjExPC90ZD48dGQgY2xhc3M9InN1biI+MTI8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjEzPC90ZD48dGQgY2xhc3M9InR1ZSI+MTQ8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE2PC90ZD48dGQgY2xhc3M9ImZyaSI+MTc8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xODwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE5PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIxPC90ZD48dGQgY2xhc3M9IndlZCI+MjI8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yMzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI0PC90ZD48dGQgY2xhc3M9InNhdCI+MjU8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yNjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+Mjc8L3RkPjx0ZCBjbGFzcz0idHVlIj4yODwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI5PC90ZD48dGQgY2xhc3M9InRodSI+MzA8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48L3RyPjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPk9jdG9iZXI8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xPC90ZD48dGQgY2xhc3M9InNhdCI+MjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjM8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjQ8L3RkPjx0ZCBjbGFzcz0idHVlIj41PC90ZD48dGQgY2xhc3M9IndlZCI+NjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjc8L3RkPjx0ZCBjbGFzcz0iZnJpIj44PC90ZD48dGQgY2xhc3M9InNhdCI+OTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjEwPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEyPC90ZD48dGQgY2xhc3M9IndlZCI+MTM8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNDwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE1PC90ZD48dGQgY2xhc3M9InNhdCI+MTY8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNzwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTg8L3RkPjx0ZCBjbGFzcz0idHVlIj4xOTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIwPC90ZD48dGQgY2xhc3M9InRodSI+MjE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIzPC90ZD48dGQgY2xhc3M9InN1biI+MjQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI1PC90ZD48dGQgY2xhc3M9InR1ZSI+MjY8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI4PC90ZD48dGQgY2xhc3M9ImZyaSI+Mjk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjMxPC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5Ob3ZlbWJlcjwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xPC90ZD48dGQgY2xhc3M9InR1ZSI+MjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjM8L3RkPjx0ZCBjbGFzcz0idGh1Ij40PC90ZD48dGQgY2xhc3M9ImZyaSI+NTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjY8L3RkPjx0ZCBjbGFzcz0ic3VuIj43PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj44PC90ZD48dGQgY2xhc3M9InR1ZSI+OTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjEwPC90ZD48dGQgY2xhc3M9InRodSI+MTE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjEzPC90ZD48dGQgY2xhc3M9InN1biI+MTQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE1PC90ZD48dGQgY2xhc3M9InR1ZSI+MTY8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE4PC90ZD48dGQgY2xhc3M9ImZyaSI+MTk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIxPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIzPC90ZD48dGQgY2xhc3M9IndlZCI+MjQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI2PC90ZD48dGQgY2xhc3M9InNhdCI+Mjc8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+Mjk8L3RkPjx0ZCBjbGFzcz0idHVlIj4zMDwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkRlY2VtYmVyPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0id2VkIj4xPC90ZD48dGQgY2xhc3M9InRodSI+MjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij40PC90ZD48dGQgY2xhc3M9InN1biI+NTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjc8L3RkPjx0ZCBjbGFzcz0id2VkIj44PC90ZD48dGQgY2xhc3M9InRodSI+OTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEwPC90ZD48dGQgY2xhc3M9InNhdCI+MTE8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTM8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE1PC90ZD48dGQgY2xhc3M9InRodSI+MTY8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE4PC90ZD48dGQgY2xhc3M9InN1biI+MTk8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIwPC90ZD48dGQgY2xhc3M9InR1ZSI+MjE8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIzPC90ZD48dGQgY2xhc3M9ImZyaSI+MjQ8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI2PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI4PC90ZD48dGQgY2xhc3M9IndlZCI+Mjk8L3RkPjx0ZCBjbGFzcz0idGh1Ij4zMDwvdGQ+PHRkIGNsYXNzPSJmcmkiPjMxPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjwvdHI+PC90YWJsZT48L2JvZHk+Cis8L2h0bWw+CisiIiIKKworCitjbGFzcyBPdXRwdXRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIG5vcm1hbGl6ZV9jYWxlbmRhcihzZWxmLCBzKToKKyAgICAgICAgIyBGaWx0ZXJzIG91dCBsb2NhbGUgZGVwZW5kYW50IHN0cmluZ3MKKyAgICAgICAgZGVmIG5laXRoZXJzcGFjZW5vcmRpZ2l0KGMpOgorICAgICAgICAgICAgcmV0dXJuIG5vdCBjLmlzc3BhY2UoKSBhbmQgbm90IGMuaXNkaWdpdCgpCisKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiBzLnNwbGl0bGluZXMoRmFsc2UpOgorICAgICAgICAgICAgIyBEcm9wIHRleHRzLCBhcyB0aGV5IGFyZSBsb2NhbGUgZGVwZW5kZW50CisgICAgICAgICAgICBpZiBsaW5lIGFuZCBub3QgZmlsdGVyKG5laXRoZXJzcGFjZW5vcmRpZ2l0LCBsaW5lKToKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgcmV0dXJuIGxpbmVzCisKKyAgICBkZWYgdGVzdF9vdXRwdXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZV9jYWxlbmRhcihjYWxlbmRhci5jYWxlbmRhcigyMDA0KSksCisgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZV9jYWxlbmRhcihyZXN1bHRfMjAwNF90ZXh0KQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9vdXRwdXRfdGV4dGNhbGVuZGFyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2FsZW5kYXIuVGV4dENhbGVuZGFyKCkuZm9ybWF0eWVhcigyMDA0KS5zdHJpcCgpLAorICAgICAgICAgICAgcmVzdWx0XzIwMDRfdGV4dC5zdHJpcCgpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X291dHB1dF9odG1sY2FsZW5kYXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjYWxlbmRhci5IVE1MQ2FsZW5kYXIoKS5mb3JtYXR5ZWFycGFnZSgyMDA0KS5zdHJpcCgpLAorICAgICAgICAgICAgcmVzdWx0XzIwMDRfaHRtbC5zdHJpcCgpCisgICAgICAgICkKKworCiBjbGFzcyBDYWxlbmRhclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9pc2xlYXAoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdGhlIHJldHVybiBpcyByaWdodCBmb3IgYSBmZXcgeWVhcnMsIGFuZApAQCAtNzIsNTcgKzI2OCw1NyBAQAogICAgIGZpcnN0d2Vla2RheSA9IGNhbGVuZGFyLk1PTkRBWQogCiAgICAgZGVmIHRlc3RfZmVicnVhcnkoc2VsZik6Ci0gICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2YgbW9uZGF5ICg3KzcrNys3IGRheXMpCisgICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gbW9uZGF5ICg3KzcrNys3IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5OSwgMiwgKDcsIDcsIDcsIDcpKQogCi0gICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2YgdHVlc2RheSAoNis3KzcrNysxIGRheXMpCisgICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gdHVlc2RheSAoNis3KzcrNysxIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAwNSwgMiwgKDYsIDcsIDcsIDcsIDEpKQogCi0gICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2Ygc3VuZGF5ICgxKzcrNys3KzYgZGF5cykKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBzdW5kYXkgKDErNys3KzcrNiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODcsIDIsICgxLCA3LCA3LCA3LCA2KSkKIAotICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9mIG1vbmRheSAoNys3KzcrNysxIGRheXMpCisgICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gbW9uZGF5ICg3KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTg4LCAyLCAoNywgNywgNywgNywgMSkpCiAKLSAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiB0dWVzZGF5ICg2KzcrNys3KzIgZGF5cykKKyAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiB0dWVzZGF5ICg2KzcrNys3KzIgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTcyLCAyLCAoNiwgNywgNywgNywgMikpCiAKLSAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBzdW5kYXkgKDErNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHN1bmRheSAoMSs3KzcrNys3IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAwNCwgMiwgKDEsIDcsIDcsIDcsIDcpKQogCiAgICAgZGVmIHRlc3RfYXByaWwoc2VsZik6Ci0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2YgbW9uZGF5ICg3KzcrNys3KzIgZGF5cykKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBtb25kYXkgKDcrNys3KzcrMiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MzUsIDQsICg3LCA3LCA3LCA3LCAyKSkKIAotICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9mIHR1ZXNkYXkgKDYrNys3KzcrMyBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHR1ZXNkYXkgKDYrNys3KzcrMyBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NzUsIDQsICg2LCA3LCA3LCA3LCAzKSkKIAotICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9mIHN1bmRheSAoMSs3KzcrNys3KzEgZGF5cykKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBzdW5kYXkgKDErNys3KzcrNysxIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk0NSwgNCwgKDEsIDcsIDcsIDcsIDcsIDEpKQogCi0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2Ygc2F0dXJkYXkgKDIrNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgyKzcrNys3KzcgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk1LCA0LCAoMiwgNywgNywgNywgNykpCiAKLSAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvZiBmcmlkYXkgKDMrNys3KzcrNiBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIGZyaWRheSAoMys3KzcrNys2IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5NCwgNCwgKDMsIDcsIDcsIDcsIDYpKQogCiAgICAgZGVmIHRlc3RfZGVjZW1iZXIoc2VsZik6Ci0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgbW9uZGF5ICg3KzcrNys3KzMgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBtb25kYXkgKDcrNys3KzcrMyBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODAsIDEyLCAoNywgNywgNywgNywgMykpCiAKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiB0dWVzZGF5ICg2KzcrNys3KzQgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiB0dWVzZGF5ICg2KzcrNys3KzQgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTg3LCAxMiwgKDYsIDcsIDcsIDcsIDQpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2Ygc3VuZGF5ICgxKzcrNys3KzcrMiBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHN1bmRheSAoMSs3KzcrNys3KzIgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTY4LCAxMiwgKDEsIDcsIDcsIDcsIDcsIDIpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgdGh1cnNkYXkgKDQrNys3KzcrNiBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHRodXJzZGF5ICg0KzcrNys3KzYgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTg4LCAxMiwgKDQsIDcsIDcsIDcsIDYpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgZnJpZGF5ICgzKzcrNys3KzcgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBmcmlkYXkgKDMrNys3KzcrNyBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDIwMTcsIDEyLCAoMywgNywgNywgNywgNykpCiAKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiBzYXR1cmRheSAoMis3KzcrNys3KzEgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBzYXR1cmRheSAoMis3KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDY4LCAxMiwgKDIsIDcsIDcsIDcsIDcsIDEpKQogCiAKQEAgLTEzMCw2MiArMzI2LDYzIEBACiAgICAgZmlyc3R3ZWVrZGF5ID0gY2FsZW5kYXIuU1VOREFZCiAKICAgICBkZWYgdGVzdF9mZWJydWFyeShzZWxmKToKLSAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBzdW5kYXkgKDcrNys3KzcgZGF5cykKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBzdW5kYXkgKDcrNys3KzcgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDA5LCAyLCAoNywgNywgNywgNykpCiAKLSAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBtb25kYXkgKDYrNys3KzcrMSBkYXlzKQorICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIG1vbmRheSAoNis3KzcrNysxIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5OSwgMiwgKDYsIDcsIDcsIDcsIDEpKQogCi0gICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2Ygc2F0dXJkYXkgKDErNys3KzcrNiBkYXlzKQorICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgxKzcrNys3KzYgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk3LCAyLCAoMSwgNywgNywgNywgNikpCiAKLSAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBzdW5kYXkgKDcrNys3KzcrMSBkYXlzKQorICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHN1bmRheSAoNys3KzcrNysxIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAwNCwgMiwgKDcsIDcsIDcsIDcsIDEpKQogCi0gICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2YgbW9uZGF5ICg2KzcrNys3KzIgZGF5cykKKyAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBtb25kYXkgKDYrNys3KzcrMiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NjAsIDIsICg2LCA3LCA3LCA3LCAyKSkKIAotICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9mIHNhdHVyZGF5ICgxKzcrNys3KzcgZGF5cykKKyAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBzYXR1cmRheSAoMSs3KzcrNys3IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk2NCwgMiwgKDEsIDcsIDcsIDcsIDcpKQogCiAgICAgZGVmIHRlc3RfYXByaWwoc2VsZik6Ci0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2Ygc3VuZGF5ICg3KzcrNys3KzIgZGF5cykKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBzdW5kYXkgKDcrNys3KzcrMiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MjMsIDQsICg3LCA3LCA3LCA3LCAyKSkKIAotICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9mIG1vbmRheSAoNis3KzcrNyszIGRheXMpCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gbW9uZGF5ICg2KzcrNys3KzMgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTE4LCA0LCAoNiwgNywgNywgNywgMykpCiAKLSAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvZiBzYXR1cmRheSAoMSs3KzcrNys3KzEgZGF5cykKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBzYXR1cmRheSAoMSs3KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTUwLCA0LCAoMSwgNywgNywgNywgNywgMSkpCiAKLSAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvZiBmcmlkYXkgKDIrNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIGZyaWRheSAoMis3KzcrNys3IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk2MCwgNCwgKDIsIDcsIDcsIDcsIDcpKQogCi0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2YgdGh1cnNkYXkgKDMrNys3KzcrNiBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHRodXJzZGF5ICgzKzcrNys3KzYgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTA5LCA0LCAoMywgNywgNywgNywgNikpCiAKICAgICBkZWYgdGVzdF9kZWNlbWJlcihzZWxmKToKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiBzdW5kYXkgKDcrNys3KzcrMyBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHN1bmRheSAoNys3KzcrNyszIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjA4MCwgMTIsICg3LCA3LCA3LCA3LCAzKSkKIAotICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9mIG1vbmRheSAoNis3KzcrNys0IGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gbW9uZGF5ICg2KzcrNys3KzQgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTQxLCAxMiwgKDYsIDcsIDcsIDcsIDQpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2Ygc2F0dXJkYXkgKDErNys3KzcrNysyIGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gc2F0dXJkYXkgKDErNys3KzcrNysyIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTkyMywgMTIsICgxLCA3LCA3LCA3LCA3LCAyKSkKIAotICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9mIHdlZG5lc2RheSAoNCs3KzcrNys2IGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gd2VkbmVzZGF5ICg0KzcrNys3KzYgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTQ4LCAxMiwgKDQsIDcsIDcsIDcsIDYpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgdGh1cnNkYXkgKDMrNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHRodXJzZGF5ICgzKzcrNys3KzcgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTI3LCAxMiwgKDMsIDcsIDcsIDcsIDcpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgZnJpZGF5ICgyKzcrNys3KzcrMSBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIGZyaWRheSAoMis3KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk1LCAxMiwgKDIsIDcsIDcsIDcsIDcsIDEpKQogCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBPdXRwdXRUZXN0Q2FzZSwKICAgICAgICAgQ2FsZW5kYXJUZXN0Q2FzZSwKICAgICAgICAgTW9uZGF5VGVzdENhc2UsCiAgICAgICAgIFN1bmRheVRlc3RDYXNlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NhcGkucHkgYi9MaWIvdGVzdC90ZXN0X2NhcGkucHkKaW5kZXggMWRkMjQ2MS4uY2RkODRiYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQpAQCAtNSw0NCArNSw1MSBAQAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCBfdGVzdGNhcGkKIAotZm9yIG5hbWUgaW4gZGlyKF90ZXN0Y2FwaSk6Ci0gICAgaWYgbmFtZS5zdGFydHN3aXRoKCd0ZXN0XycpOgotICAgICAgICB0ZXN0ID0gZ2V0YXR0cihfdGVzdGNhcGksIG5hbWUpCitkZWYgdGVzdF9tYWluKCk6CisKKyAgICBmb3IgbmFtZSBpbiBkaXIoX3Rlc3RjYXBpKToKKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCd0ZXN0XycpOgorICAgICAgICAgICAgdGVzdCA9IGdldGF0dHIoX3Rlc3RjYXBpLCBuYW1lKQorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgImludGVybmFsIiwgbmFtZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlc3QoKQorICAgICAgICAgICAgZXhjZXB0IF90ZXN0Y2FwaS5lcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgc3lzLmV4Y19pbmZvKClbMV0KKworICAgICMgc29tZSBleHRyYSB0aHJlYWQtc3RhdGUgdGVzdHMgZHJpdmVuIHZpYSBfdGVzdGNhcGkKKyAgICBkZWYgVGVzdFRocmVhZFN0YXRlKCk6CisgICAgICAgIGltcG9ydCB0aHJlYWQKKyAgICAgICAgaW1wb3J0IHRpbWUKKwogICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgIHByaW50ICJpbnRlcm5hbCIsIG5hbWUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdCgpCi0gICAgICAgIGV4Y2VwdCBfdGVzdGNhcGkuZXJyb3I6Ci0gICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgIHByaW50ICJhdXRvLXRocmVhZC1zdGF0ZSIKIAotIyBzb21lIGV4dHJhIHRocmVhZC1zdGF0ZSB0ZXN0cyBkcml2ZW4gdmlhIF90ZXN0Y2FwaQotZGVmIFRlc3RUaHJlYWRTdGF0ZSgpOgotICAgIGltcG9ydCB0aHJlYWQKLSAgICBpbXBvcnQgdGltZQorICAgICAgICBpZGVudHMgPSBbXQogCi0gICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgIHByaW50ICJhdXRvLXRocmVhZC1zdGF0ZSIKKyAgICAgICAgZGVmIGNhbGxiYWNrKCk6CisgICAgICAgICAgICBpZGVudHMuYXBwZW5kKHRocmVhZC5nZXRfaWRlbnQoKSkKIAotICAgIGlkZW50cyA9IFtdCisgICAgICAgIF90ZXN0Y2FwaS5fdGVzdF90aHJlYWRfc3RhdGUoY2FsbGJhY2spCisgICAgICAgIGEgPSBiID0gY2FsbGJhY2sKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICAjIENoZWNrIG91ciBtYWluIHRocmVhZCBpcyBpbiB0aGUgbGlzdCBleGFjdGx5IDMgdGltZXMuCisgICAgICAgIGlmIGlkZW50cy5jb3VudCh0aHJlYWQuZ2V0X2lkZW50KCkpICE9IDM6CisgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgXAorICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgbWFpbiB0aHJlYWQgY29ycmVjdGx5IGluIHRoZSBsaXN0IgogCi0gICAgZGVmIGNhbGxiYWNrKCk6Ci0gICAgICAgIGlkZW50cy5hcHBlbmQodGhyZWFkLmdldF9pZGVudCgpKQorICAgIHRyeToKKyAgICAgICAgX3Rlc3RjYXBpLl90ZXN0X3RocmVhZF9zdGF0ZQorICAgICAgICBoYXZlX3RocmVhZF9zdGF0ZSA9IFRydWUKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIGhhdmVfdGhyZWFkX3N0YXRlID0gRmFsc2UKIAotICAgIF90ZXN0Y2FwaS5fdGVzdF90aHJlYWRfc3RhdGUoY2FsbGJhY2spCi0gICAgdGltZS5zbGVlcCgxKQotICAgICMgQ2hlY2sgb3VyIG1haW4gdGhyZWFkIGlzIGluIHRoZSBsaXN0IGV4YWN0bHkgMyB0aW1lcy4KLSAgICBpZiBpZGVudHMuY291bnQodGhyZWFkLmdldF9pZGVudCgpKSAhPSAzOgotICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgXAotICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBtYWluIHRocmVhZCBjb3JyZWN0bHkgaW4gdGhlIGxpc3QiCisgICAgaWYgaGF2ZV90aHJlYWRfc3RhdGU6CisgICAgICAgIFRlc3RUaHJlYWRTdGF0ZSgpCisgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKKyAgICAgICAgdD10aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1UZXN0VGhyZWFkU3RhdGUpCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQogCi10cnk6Ci0gICAgX3Rlc3RjYXBpLl90ZXN0X3RocmVhZF9zdGF0ZQotICAgIGhhdmVfdGhyZWFkX3N0YXRlID0gVHJ1ZQotZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgIGhhdmVfdGhyZWFkX3N0YXRlID0gRmFsc2UKLQotaWYgaGF2ZV90aHJlYWRfc3RhdGU6Ci0gICAgVGVzdFRocmVhZFN0YXRlKCkKLSAgICBpbXBvcnQgdGhyZWFkaW5nCi0gICAgdD10aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1UZXN0VGhyZWFkU3RhdGUpCi0gICAgdC5zdGFydCgpCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5IGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQppbmRleCBhNGE2NTZkLi4wMThiZWM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKQEAgLTEwLDYgKzEwLDkgQEAKICAgICAgICAgaW5mcC5jbG9zZSgpCiAgICAgICAgIGRhdGEgPSBvdXRmcC5yZWFkKCkKICAgICAgICAgb3V0ZnAuY2xvc2UoKQorICAgICAgICAjIHRyeSB0byBjbGVhbnVwIHRoZSBjaGlsZCBzbyB3ZSBkb24ndCBhcHBlYXIgdG8gbGVhayB3aGVuIHJ1bm5pbmcKKyAgICAgICAgIyB3aXRoIHJlZ3J0ZXN0IC1SLiAgVGhpcyBzaG91bGQgYmUgYSBuby1vcCBvbiBXaW5kb3dzLgorICAgICAgICBwb3BlbjIuX2NsZWFudXAoKQogICAgICAgICByZXR1cm4gZGF0YQogCiAgICAgZGVmIGV4aXRfY29kZShzZWxmLCBjbWRfbGluZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CmluZGV4IDkxM2FhOTEuLjZlYTQ5Y2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CkBAIC0xLDcgKzEsNyBAQAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGNvZGVjcwotaW1wb3J0IHN5cywgU3RyaW5nSU8KK2ltcG9ydCBzeXMsIFN0cmluZ0lPLCBfdGVzdGNhcGkKIAogY2xhc3MgUXVldWUob2JqZWN0KToKICAgICAiIiIKQEAgLTc4MSw5ICs3ODEsMTggQEAKICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkKCJUZXN0IDMuJWQ6ICVzIiAlIChwb3MrMSwgc3RyKGUpKSkKIAotY2xhc3MgQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgdGVzdF9idWlsdGluKHNlbGYpOgorY2xhc3MgSUROQUNvZGVjVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYnVpbHRpbl9kZWNvZGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHVuaWNvZGUoInB5dGhvbi5vcmciLCAiaWRuYSIpLCB1InB5dGhvbi5vcmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmljb2RlKCJweXRob24ub3JnLiIsICJpZG5hIiksIHUicHl0aG9uLm9yZy4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmljb2RlKCJ4bi0tcHl0aG4tbXVhLm9yZyIsICJpZG5hIiksIHUicHl0aFx4ZjZuLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHVuaWNvZGUoInhuLS1weXRobi1tdWEub3JnLiIsICJpZG5hIiksIHUicHl0aFx4ZjZuLm9yZy4iKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbl9lbmNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHUicHl0aG9uLm9yZyIuZW5jb2RlKCJpZG5hIiksICJweXRob24ub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoInB5dGhvbi5vcmcuIi5lbmNvZGUoImlkbmEiKSwgInB5dGhvbi5vcmcuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModSJweXRoXHhmNm4ub3JnIi5lbmNvZGUoImlkbmEiKSwgInhuLS1weXRobi1tdWEub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModSJweXRoXHhmNm4ub3JnLiIuZW5jb2RlKCJpZG5hIiksICJ4bi0tcHl0aG4tbXVhLm9yZy4iKQogCiAgICAgZGVmIHRlc3Rfc3RyZWFtKHNlbGYpOgogICAgICAgICBpbXBvcnQgU3RyaW5nSU8KQEAgLTc5MSw2ICs4MDAsNjQgQEAKICAgICAgICAgci5yZWFkKDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIucmVhZCgpLCB1IiIpCiAKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbF9kZWNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgIiIuam9pbihjb2RlY3MuaXRlcmRlY29kZSgicHl0aG9uLm9yZyIsICJpZG5hIikpLAorICAgICAgICAgICAgdSJweXRob24ub3JnIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgIiIuam9pbihjb2RlY3MuaXRlcmRlY29kZSgicHl0aG9uLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgIHUicHl0aG9uLm9yZy4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKCJ4bi0tcHl0aG4tbXVhLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgIHUicHl0aFx4ZjZuLm9yZy4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKCJ4bi0tcHl0aG4tbXVhLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgIHUicHl0aFx4ZjZuLm9yZy4iCisgICAgICAgICkKKworICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcigiaWRuYSIpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUoInhuLS14YW0iLCApLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlY29kZXIuZGVjb2RlKCJwbGUtOXRhLm8iLCApLCB1Ilx4ZTR4YW1wbGUuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUodSJyZyIpLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlY29kZXIuZGVjb2RlKHUiIiwgVHJ1ZSksIHUib3JnIikKKworICAgICAgICBkZWNvZGVyLnJlc2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUoInhuLS14YW0iLCApLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlY29kZXIuZGVjb2RlKCJwbGUtOXRhLm8iLCApLCB1Ilx4ZTR4YW1wbGUuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUoInJnLiIpLCB1Im9yZy4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWNvZGVyLmRlY29kZSgiIiwgVHJ1ZSksIHUiIikKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsX2VuY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZW5jb2RlKHUicHl0aG9uLm9yZyIsICJpZG5hIikpLAorICAgICAgICAgICAgInB5dGhvbi5vcmciCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZW5jb2RlKHUicHl0aG9uLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgICJweXRob24ub3JnLiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJlbmNvZGUodSJweXRoXHhmNm4ub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgInhuLS1weXRobi1tdWEub3JnLiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJlbmNvZGUodSJweXRoXHhmNm4ub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgInhuLS1weXRobi1tdWEub3JnLiIKKyAgICAgICAgKQorCisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKCJpZG5hIikoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlbmNvZGVyLmVuY29kZSh1Ilx4ZTR4IiksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlbmNvZGVyLmVuY29kZSh1ImFtcGxlLm9yZyIpLCAieG4tLXhhbXBsZS05dGEuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKSwgIm9yZyIpCisKKyAgICAgICAgZW5jb2Rlci5yZXNldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVuY29kZXIuZW5jb2RlKHUiXHhlNHgiKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVuY29kZXIuZW5jb2RlKHUiYW1wbGUub3JnLiIpLCAieG4tLXhhbXBsZS05dGEub3JnLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVuY29kZXIuZW5jb2RlKHUiIiwgVHJ1ZSksICIiKQorCiBjbGFzcyBDb2RlY3NNb2R1bGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKQEAgLTEwMzIsOSArMTA5OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ICs9IHJlYWRlci5yZWFkKCkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCiAKLSAgICAgICAgICAgICAgICAjIGNoZWNrIGluY3JlbWVudGFsIGRlY29kZXIvZW5jb2RlciBhbmQgaXRlcmVuY29kZSgpL2l0ZXJkZWNvZGUoKQorICAgICAgICAgICAgICAgICMgY2hlY2sgaW5jcmVtZW50YWwgZGVjb2Rlci9lbmNvZGVyIChmZXRjaGVkIHZpYSB0aGUgUHl0aG9uCisgICAgICAgICAgICAgICAgIyBhbmQgQyBBUEkpIGFuZCBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpCiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZykoKQorICAgICAgICAgICAgICAgICAgICBjZW5jb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGVuY29kZXIoZW5jb2RpbmcpCiAgICAgICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOiAjIG5vIEluY3JlbWVudGFsRW5jb2RlcgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgZWxzZToKQEAgLTEwNDIsMTAgKzExMTEsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCA9ICIiCiAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ICs9IGVuY29kZXIuZW5jb2RlKGMpCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgKz0gZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKQogICAgICAgICAgICAgICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcihlbmNvZGluZykoKQogICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ID0gdSIiCiAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIGVuY29kZWRyZXN1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ICs9IGRlY29kZXIuZGVjb2RlKGMpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gZGVjb2Rlci5kZWNvZGUoIiIsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIEMgQVBJCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgPSAiIgorICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBzOgorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBjZW5jb2Rlci5lbmNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBjZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKQorICAgICAgICAgICAgICAgICAgICBjZGVjb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgPSB1IiIKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gZW5jb2RlZHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gY2RlY29kZXIuZGVjb2RlKGMpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gY2RlY29kZXIuZGVjb2RlKCIiLCBUcnVlKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCiAKICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpCkBAIC0xMTQyLDcgKzEyMjUsNyBAQAogICAgICAgICBQdW55Y29kZVRlc3QsCiAgICAgICAgIFVuaWNvZGVJbnRlcm5hbFRlc3QsCiAgICAgICAgIE5hbWVwcmVwVGVzdCwKLSAgICAgICAgQ29kZWNUZXN0LAorICAgICAgICBJRE5BQ29kZWNUZXN0LAogICAgICAgICBDb2RlY3NNb2R1bGVUZXN0LAogICAgICAgICBTdHJlYW1SZWFkZXJUZXN0LAogICAgICAgICBTdHIyU3RyVGVzdCwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29lcmNpb24ucHkgYi9MaWIvdGVzdC90ZXN0X2NvZXJjaW9uLnB5CmluZGV4IGUxMmVmMGQuLjk2NGYxNjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29lcmNpb24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2VyY2lvbi5weQpAQCAtMSw2ICsxLDggQEAKIGltcG9ydCBjb3B5CiBpbXBvcnQgc3lzCiBpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKICMgRmFrZSBhIG51bWJlciB0aGF0IGltcGxlbWVudHMgbnVtZXJpYyBtZXRob2RzIHRocm91Z2ggX19jb2VyY2VfXwogY2xhc3MgQ29lcmNlTnVtYmVyOgpAQCAtMTYsMTAgKzE4LDE5IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gKHNlbGYuYXJnLCBvdGhlcikKIAorIyBOZXctc3R5bGUgY2xhc3MgdmVyc2lvbiBvZiBDb2VyY2VOdW1iZXIKK2NsYXNzIENvZXJjZVRvKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuYXJnID0gYXJnCisgICAgZGVmIF9fY29lcmNlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDb2VyY2VUbyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hcmcsIG90aGVyLmFyZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnLCBvdGhlcgorCiAKICMgRmFrZSBhIG51bWJlciB0aGF0IGltcGxlbWVudHMgbnVtZXJpYyBvcHMgdGhyb3VnaCBtZXRob2RzLgogY2xhc3MgTWV0aG9kTnVtYmVyOgotCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsYXJnKToKICAgICAgICAgc2VsZi5hcmcgPSBhcmcKIApAQCAtNTAsNiArNjEsMTggQEAKICAgICBkZWYgX19ydHJ1ZWRpdl9fKHNlbGYsb3RoZXIpOgogICAgICAgICByZXR1cm4gb3RoZXIgLyBzZWxmLmFyZwogCisgICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5hcmcgLyBvdGhlcgorCisgICAgZGVmIF9fcnRydWVkaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIG90aGVyIC8gc2VsZi5hcmcKKworICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmFyZyAvLyBvdGhlcgorCisgICAgZGVmIF9fcmZsb29yZGl2X18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBvdGhlciAvLyBzZWxmLmFyZworCiAgICAgZGVmIF9fcG93X18oc2VsZixvdGhlcik6CiAgICAgICAgIHJldHVybiBzZWxmLmFyZyAqKiBvdGhlcgogCkBAIC02NiwxMSArODksMTU3IEBACiAgICAgICAgIHJldHVybiBjbXAoc2VsZi5hcmcsIG90aGVyKQogCiAKLWNhbmRpZGF0ZXMgPSBbIDIsIDQuMCwgMkwsIDIrMGosIFsxXSwgKDIsKSwgTm9uZSwKLSAgICAgICAgICAgICAgIE1ldGhvZE51bWJlcigyKSwgQ29lcmNlTnVtYmVyKDIpXQorY2FuZGlkYXRlcyA9IFsyLCAyTCwgNC4wLCAyKzBqLCBbMV0sICgyLCksIE5vbmUsCisgICAgICAgICAgICAgIE1ldGhvZE51bWJlcigyKSwgQ29lcmNlTnVtYmVyKDIpXQogCi1pbmZpeF9iaW5vcHMgPSBbICcrJywgJy0nLCAnKicsICcvJywgJyoqJywgJyUnIF0KK2luZml4X2Jpbm9wcyA9IFsgJysnLCAnLScsICcqJywgJyoqJywgJyUnLCAnLy8nLCAnLycgXQorCitURSA9IFR5cGVFcnJvcgorIyBiID0gYm90aCBub3JtYWwgYW5kIGF1Z21lbnRlZCBnaXZlIHNhbWUgcmVzdWx0IGxpc3QKKyMgcyA9IHNpbmdsZSByZXN1bHQgbGlzdHMgZm9yIG5vcm1hbCBhbmQgYXVnbWVudGVkCisjIGUgPSBlcXVhbHMgb3RoZXIgcmVzdWx0cworIyByZXN1bHQgbGlzdHM6IFsnKycsICctJywgJyonLCAnKionLCAnJScsICcvLycsICgnY2xhc3NpYyAvJywgJ25ldyAvJyldCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi10dXBsZSBpZiByZXN1bHRzIGRpZmZlcgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG9ubHkgb25lIHZhbHVlCitpbmZpeF9yZXN1bHRzID0geworICAgICMgMgorICAgICgwLDApOiAoJ2InLCBbNCwgMCwgNCwgNCwgMCwgMSwgKDEsIDEuMCldKSwKKyAgICAoMCwxKTogKCdlJywgKDAsMCkpLAorICAgICgwLDIpOiAoJ2InLCBbNi4wLCAtMi4wLCA4LjAsIDE2LjAsIDIuMCwgMC4wLCAwLjVdKSwKKyAgICAoMCwzKTogKCdiJywgWzQrMGosIDArMGosIDQrMGosIDQrMGosIDArMGosIDErMGosIDErMGpdKSwKKyAgICAoMCw0KTogKCdiJywgW1RFLCBURSwgWzEsIDFdLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgwLDUpOiAoJ2InLCBbVEUsIFRFLCAoMiwgMiksIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDAsNik6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgwLDcpOiAoJ2UnLCAoMCwwKSksCisgICAgKDAsOCk6ICgnZScsICgwLDApKSwKKworICAgICMgMkwKKyAgICAoMSwwKTogKCdlJywgKDAsMCkpLAorICAgICgxLDEpOiAoJ2UnLCAoMCwxKSksCisgICAgKDEsMik6ICgnZScsICgwLDIpKSwKKyAgICAoMSwzKTogKCdlJywgKDAsMykpLAorICAgICgxLDQpOiAoJ2UnLCAoMCw0KSksCisgICAgKDEsNSk6ICgnZScsICgwLDUpKSwKKyAgICAoMSw2KTogKCdlJywgKDAsNikpLAorICAgICgxLDcpOiAoJ2UnLCAoMCw3KSksCisgICAgKDEsOCk6ICgnZScsICgwLDgpKSwKKworICAgICMgNC4wCisgICAgKDIsMCk6ICgnYicsIFs2LjAsIDIuMCwgOC4wLCAxNi4wLCAwLjAsIDIuMCwgMi4wXSksCisgICAgKDIsMSk6ICgnZScsICgyLDApKSwKKyAgICAoMiwyKTogKCdiJywgWzguMCwgMC4wLCAxNi4wLCAyNTYuMCwgMC4wLCAxLjAsIDEuMF0pLAorICAgICgyLDMpOiAoJ2InLCBbNiswaiwgMiswaiwgOCswaiwgMTYrMGosIDArMGosIDIrMGosIDIrMGpdKSwKKyAgICAoMiw0KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDIsNSk6ICgnZScsICgyLDQpKSwKKyAgICAoMiw2KTogKCdlJywgKDIsNCkpLAorICAgICgyLDcpOiAoJ2UnLCAoMiwwKSksCisgICAgKDIsOCk6ICgnZScsICgyLDApKSwKKworICAgICMgKDIrMGopCisgICAgKDMsMCk6ICgnYicsIFs0KzBqLCAwKzBqLCA0KzBqLCA0KzBqLCAwKzBqLCAxKzBqLCAxKzBqXSksCisgICAgKDMsMSk6ICgnZScsICgzLDApKSwKKyAgICAoMywyKTogKCdiJywgWzYrMGosIC0yKzBqLCA4KzBqLCAxNiswaiwgMiswaiwgMCswaiwgMC41KzBqXSksCisgICAgKDMsMyk6ICgnYicsIFs0KzBqLCAwKzBqLCA0KzBqLCA0KzBqLCAwKzBqLCAxKzBqLCAxKzBqXSksCisgICAgKDMsNCk6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgzLDUpOiAoJ2UnLCAoMyw0KSksCisgICAgKDMsNik6ICgnZScsICgzLDQpKSwKKyAgICAoMyw3KTogKCdlJywgKDMsMCkpLAorICAgICgzLDgpOiAoJ2UnLCAoMywwKSksCisKKyAgICAjIFsxXQorICAgICg0LDApOiAoJ2InLCBbVEUsIFRFLCBbMSwgMV0sIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsMSk6ICgnZScsICg0LDApKSwKKyAgICAoNCwyKTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsMyk6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg0LDQpOiAoJ2InLCBbWzEsIDFdLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsNSk6ICgncycsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0sIFtbMSwgMl0sIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNCw2KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsNyk6ICgnZScsICg0LDApKSwKKyAgICAoNCw4KTogKCdlJywgKDQsMCkpLAorCisgICAgIyAoMiwpCisgICAgKDUsMCk6ICgnYicsIFtURSwgVEUsICgyLCAyKSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNSwxKTogKCdlJywgKDUsMCkpLAorICAgICg1LDIpOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNSwzKTogKCdlJywgKDUsMikpLAorICAgICg1LDQpOiAoJ2UnLCAoNSwyKSksCisgICAgKDUsNSk6ICgnYicsIFsoMiwgMiksIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNSw2KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDUsNyk6ICgnZScsICg1LDApKSwKKyAgICAoNSw4KTogKCdlJywgKDUsMCkpLAorCisgICAgIyBOb25lCisgICAgKDYsMCk6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg2LDEpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsMik6ICgnZScsICg2LDApKSwKKyAgICAoNiwzKTogKCdlJywgKDYsMCkpLAorICAgICg2LDQpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsNSk6ICgnZScsICg2LDApKSwKKyAgICAoNiw2KTogKCdlJywgKDYsMCkpLAorICAgICg2LDcpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsOCk6ICgnZScsICg2LDApKSwKKworICAgICMgTWV0aG9kTnVtYmVyKDIpCisgICAgKDcsMCk6ICgnZScsICgwLDApKSwKKyAgICAoNywxKTogKCdlJywgKDAsMSkpLAorICAgICg3LDIpOiAoJ2UnLCAoMCwyKSksCisgICAgKDcsMyk6ICgnZScsICgwLDMpKSwKKyAgICAoNyw0KTogKCdlJywgKDAsNCkpLAorICAgICg3LDUpOiAoJ2UnLCAoMCw1KSksCisgICAgKDcsNik6ICgnZScsICgwLDYpKSwKKyAgICAoNyw3KTogKCdlJywgKDAsNykpLAorICAgICg3LDgpOiAoJ2UnLCAoMCw4KSksCisKKyAgICAjIENvZXJjZU51bWJlcigyKQorICAgICg4LDApOiAoJ2UnLCAoMCwwKSksCisgICAgKDgsMSk6ICgnZScsICgwLDEpKSwKKyAgICAoOCwyKTogKCdlJywgKDAsMikpLAorICAgICg4LDMpOiAoJ2UnLCAoMCwzKSksCisgICAgKDgsNCk6ICgnZScsICgwLDQpKSwKKyAgICAoOCw1KTogKCdlJywgKDAsNSkpLAorICAgICg4LDYpOiAoJ2UnLCAoMCw2KSksCisgICAgKDgsNyk6ICgnZScsICgwLDcpKSwKKyAgICAoOCw4KTogKCdlJywgKDAsOCkpLAorfQorCitkZWYgcHJvY2Vzc19pbmZpeF9yZXN1bHRzKCk6CisgICAgZm9yIGtleSBpbiBzb3J0ZWQoaW5maXhfcmVzdWx0cyk6CisgICAgICAgIHZhbCA9IGluZml4X3Jlc3VsdHNba2V5XQorICAgICAgICBpZiB2YWxbMF0gPT0gJ2UnOgorICAgICAgICAgICAgaW5maXhfcmVzdWx0c1trZXldID0gaW5maXhfcmVzdWx0c1t2YWxbMV1dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB2YWxbMF0gPT0gJ3MnOgorICAgICAgICAgICAgICAgIHJlcyA9ICh2YWxbMV0sIHZhbFsyXSkKKyAgICAgICAgICAgIGVsaWYgdmFsWzBdID09ICdiJzoKKyAgICAgICAgICAgICAgICByZXMgPSAodmFsWzFdLCB2YWxbMV0pCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc1tpXVs2XSwgdHVwbGUpOgorICAgICAgICAgICAgICAgICAgICBpZiAxLzIgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdGluZyB3aXRoIGNsYXNzaWMgKGZsb29yKSBkaXZpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2ldWzZdID0gcmVzW2ldWzZdWzBdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Rpbmcgd2l0aCAtUW5ldworICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2ldWzZdID0gcmVzW2ldWzZdWzFdCisgICAgICAgICAgICBpbmZpeF9yZXN1bHRzW2tleV0gPSByZXMKKworCisKK3Byb2Nlc3NfaW5maXhfcmVzdWx0cygpCisjIG5vdyBpbmZpeF9yZXN1bHRzIGhhcyB0d28gbGlzdHMgb2YgcmVzdWx0cyBmb3IgZXZlcnkgcGFpcmluZy4KKwogcHJlZml4X2Jpbm9wcyA9IFsgJ2Rpdm1vZCcgXQorcHJlZml4X3Jlc3VsdHMgPSBbCisgICAgWygxLDApLCAoMUwsMEwpLCAoMC4wLDIuMCksICgoMSswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKDEsMCldLAorICAgIFsoMUwsMEwpLCAoMUwsMEwpLCAoMC4wLDIuMCksICgoMSswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKDFMLDBMKV0sCisgICAgWygyLjAsMC4wKSwgKDIuMCwwLjApLCAoMS4wLDAuMCksICgoMiswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKDIuMCwwLjApXSwKKyAgICBbKCgxKzBqKSwwaiksICgoMSswaiksMGopLCAoMGosKDIrMGopKSwgKCgxKzBqKSwwaiksIFRFLCBURSwgVEUsIFRFLCAoKDErMGopLDBqKV0sCisgICAgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdLAorICAgIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSwKKyAgICBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0sCisgICAgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdLAorICAgIFsoMSwwKSwgKDFMLDBMKSwgKDAuMCwyLjApLCAoKDErMGopLDBqKSwgVEUsIFRFLCBURSwgVEUsICgxLDApXQorXQogCiBkZWYgZm9ybWF0X2Zsb2F0KHZhbHVlKToKICAgICBpZiBhYnModmFsdWUpIDwgMC4wMToKQEAgLTg3LDgzICsyNTYsNzQgQEAKICAgICAgICAgcmV0dXJuIGZvcm1hdF9mbG9hdCh2YWx1ZSkKICAgICByZXR1cm4gc3RyKHZhbHVlKQogCi1kZWYgZG9faW5maXhfYmlub3BzKCk6Ci0gICAgZm9yIGEgaW4gY2FuZGlkYXRlczoKLSAgICAgICAgZm9yIGIgaW4gY2FuZGlkYXRlczoKLSAgICAgICAgICAgIGZvciBvcCBpbiBpbmZpeF9iaW5vcHM6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyVzICVzICVzJyAlIChhLCBvcCwgYiksCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICB4ID0gZXZhbCgnYSAlcyBiJyAlIG9wKQotICAgICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBzeXMuZXhjX2luZm8oKVs6Ml0KLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgJy4uLiAlcy4lcycgJSAoZXJyb3JbMF0uX19tb2R1bGVfXywgZXJyb3JbMF0uX19uYW1lX18pCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgJz0nLCBmb3JtYXRfcmVzdWx0KHgpCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICB6ID0gY29weS5jb3B5KGEpCi0gICAgICAgICAgICAgICAgZXhjZXB0IGNvcHkuRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHogPSBhICMgYXNzdW1lIGl0IGhhcyBubyBpbnBsYWNlIG9wcwotICAgICAgICAgICAgICAgIHByaW50ICclcyAlcz0gJXMnICUgKGEsIG9wLCBiKSwKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGV4ZWMoJ3ogJXM9IGInICUgb3ApCi0gICAgICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHN5cy5leGNfaW5mbygpWzoyXQotICAgICAgICAgICAgICAgICAgICBwcmludCAnLi4uICVzLiVzJyAlIChlcnJvclswXS5fX21vZHVsZV9fLCBlcnJvclswXS5fX25hbWVfXykKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBwcmludCAnPT4nLCBmb3JtYXRfcmVzdWx0KHopCitjbGFzcyBDb2VyY2lvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2luZml4X2Jpbm9wcyhzZWxmKToKKyAgICAgICAgZm9yIGlhLCBhIGluIGVudW1lcmF0ZShjYW5kaWRhdGVzKToKKyAgICAgICAgICAgIGZvciBpYiwgYiBpbiBlbnVtZXJhdGUoY2FuZGlkYXRlcyk6CisgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGluZml4X3Jlc3VsdHNbKGlhLCBpYildCisgICAgICAgICAgICAgICAgZm9yIG9wLCByZXMsIGlyZXMgaW4gemlwKGluZml4X2Jpbm9wcywgcmVzdWx0c1swXSwgcmVzdWx0c1sxXSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHJlcyBpcyBURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhICVzIGInICUgb3AsIHsnYSc6IGEsICdiJzogYn0pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmb3JtYXRfcmVzdWx0KHJlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfcmVzdWx0KGV2YWwoJ2EgJXMgYicgJSBvcCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzICVzICVzID09ICVzIGZhaWxlZCcgJSAoYSwgb3AsIGIsIHJlcykpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHogPSBjb3B5LmNvcHkoYSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGNvcHkuRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICB6ID0gYSAjIGFzc3VtZSBpdCBoYXMgbm8gaW5wbGFjZSBvcHMKKyAgICAgICAgICAgICAgICAgICAgaWYgaXJlcyBpcyBURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjICd6ICVzPSBiJyAlIG9wCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJUeXBlRXJyb3Igbm90IHJhaXNlZCIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBleGVjKCd6ICVzPSBiJyAlIG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaXJlcywgeikKIAotZGVmIGRvX3ByZWZpeF9iaW5vcHMoKToKLSAgICBmb3IgYSBpbiBjYW5kaWRhdGVzOgotICAgICAgICBmb3IgYiBpbiBjYW5kaWRhdGVzOgotICAgICAgICAgICAgZm9yIG9wIGluIHByZWZpeF9iaW5vcHM6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyVzKCVzLCAlcyknICUgKG9wLCBhLCBiKSwKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHggPSBldmFsKCclcyhhLCBiKScgJSBvcCkKLSAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yID0gc3lzLmV4Y19pbmZvKClbOjJdCi0gICAgICAgICAgICAgICAgICAgIHByaW50ICcuLi4gJXMuJXMnICUgKGVycm9yWzBdLl9fbW9kdWxlX18sIGVycm9yWzBdLl9fbmFtZV9fKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICc9JywgZm9ybWF0X3Jlc3VsdCh4KQorICAgIGRlZiB0ZXN0X3ByZWZpeF9iaW5vcHMoc2VsZik6CisgICAgICAgIGZvciBpYSwgYSBpbiBlbnVtZXJhdGUoY2FuZGlkYXRlcyk6CisgICAgICAgICAgICBmb3IgaWIsIGIgaW4gZW51bWVyYXRlKGNhbmRpZGF0ZXMpOgorICAgICAgICAgICAgICAgIGZvciBvcCBpbiBwcmVmaXhfYmlub3BzOgorICAgICAgICAgICAgICAgICAgICByZXMgPSBwcmVmaXhfcmVzdWx0c1tpYV1baWJdCisgICAgICAgICAgICAgICAgICAgIGlmIHJlcyBpcyBURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcyhhLCBiKScgJSBvcCwgeydhJzogYSwgJ2InOiBifSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGZvcm1hdF9yZXN1bHQocmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9yZXN1bHQoZXZhbCgnJXMoYSwgYiknICUgb3ApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcyglcywgJXMpID09ICVzIGZhaWxlZCcgJSAob3AsIGEsIGIsIHJlcykpCiAKLSMgTmV3LXN0eWxlIGNsYXNzIHZlcnNpb24gb2YgQ29lcmNlTnVtYmVyCi1jbGFzcyBDb2VyY2VUbyhvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmcpOgotICAgICAgICBzZWxmLmFyZyA9IGFyZwotICAgIGRlZiBfX2NvZXJjZV9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQ29lcmNlVG8pOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnLCBvdGhlci5hcmcKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmFyZywgb3RoZXIKKyAgICBkZWYgdGVzdF9jbXB0eXBlcyhzZWxmKToKKyAgICAgICAgIyBCdWlsdC1pbiB0cF9jb21wYXJlIHNsb3RzIGV4cGVjdCB0aGVpciBhcmd1bWVudHMgdG8gaGF2ZSB0aGUKKyAgICAgICAgIyBzYW1lIHR5cGUsIGJ1dCBhIHVzZXItZGVmaW5lZCBfX2NvZXJjZV9fIGRvZXNuJ3QgaGF2ZSB0byBvYmV5LgorICAgICAgICAjIFNGICM5ODAzNTIKKyAgICAgICAgZXZpbF9jb2VyY2VyID0gQ29lcmNlVG8oNDIpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZXNlIGRvbid0IGNyYXNoIGFueSBtb3JlCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKGNtcCh1J2Zpc2gnLCBldmlsX2NvZXJjZXIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhjbXAoc2xpY2UoMSksIGV2aWxfY29lcmNlciksIDApCisgICAgICAgICMgLi4uYnV0IHRoYXQgdGhpcyBzdGlsbCB3b3JrcworICAgICAgICBjbGFzcyBXYWNreUNvbXBhcmVyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8ob3RoZXIgPT0gNDIsICdleHBlY3RlZCBldmlsX2NvZXJjZXIsIGdvdCAlcicgJSBvdGhlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjbXAoV2Fja3lDb21wYXJlcigpLCBldmlsX2NvZXJjZXIpLCAwKQorICAgICAgICAjIC4uLmFuZCBjbGFzc2ljIGNsYXNzZXMgdG9vLCBzaW5jZSB0aGF0IGNvZGUgcGF0aCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQKKyAgICAgICAgY2xhc3MgQ2xhc3NpY1dhY2t5Q29tcGFyZXI6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8ob3RoZXIgPT0gNDIsICdleHBlY3RlZCBldmlsX2NvZXJjZXIsIGdvdCAlcicgJSBvdGhlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjbXAoQ2xhc3NpY1dhY2t5Q29tcGFyZXIoKSwgZXZpbF9jb2VyY2VyKSwgMCkKIAotZGVmIGFzc2VydF8oZXhwciwgbXNnPU5vbmUpOgotICAgIGlmIG5vdCBleHByOgotICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgbXNnCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidjb21wbGV4IGRpdm1vZFwoXCksIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcid0ZXN0LnRlc3RfY29lcmNpb24kJykKKyAgICBydW5fdW5pdHRlc3QoQ29lcmNpb25UZXN0KQogCi1kZWYgZG9fY21wdHlwZXMoKToKLSAgICAjIEJ1aWx0LWluIHRwX2NvbXBhcmUgc2xvdHMgZXhwZWN0IHRoZWlyIGFyZ3VtZW50cyB0byBoYXZlIHRoZQotICAgICMgc2FtZSB0eXBlLCBidXQgYSB1c2VyLWRlZmluZWQgX19jb2VyY2VfXyBkb2Vzbid0IGhhdmUgdG8gb2JleS4KLSAgICAjIFNGICM5ODAzNTIKLSAgICBldmlsX2NvZXJjZXIgPSBDb2VyY2VUbyg0MikKLSAgICAjIE1ha2Ugc3VyZSB0aGVzZSBkb24ndCBjcmFzaCBhbnkgbW9yZQotICAgIGFzc2VydF8oY21wKHUnZmlzaCcsIGV2aWxfY29lcmNlcikgIT0gMCkKLSAgICBhc3NlcnRfKGNtcChzbGljZSgxKSwgZXZpbF9jb2VyY2VyKSAhPSAwKQotICAgICMgLi4uYnV0IHRoYXQgdGhpcyBzdGlsbCB3b3JrcwotICAgIGNsYXNzIFdhY2t5Q29tcGFyZXIob2JqZWN0KToKLSAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgotICAgICAgICAgICAgYXNzZXJ0XyhvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQotICAgICAgICAgICAgcmV0dXJuIDAKLSAgICBhc3NlcnRfKGNtcChXYWNreUNvbXBhcmVyKCksIGV2aWxfY29lcmNlcikgPT0gMCkKLSAgICAjIC4uLmFuZCBjbGFzc2ljIGNsYXNzZXMgdG9vLCBzaW5jZSB0aGF0IGNvZGUgcGF0aCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQKLSAgICBjbGFzcyBDbGFzc2ljV2Fja3lDb21wYXJlcjoKLSAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgotICAgICAgICAgICAgYXNzZXJ0XyhvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQotICAgICAgICAgICAgcmV0dXJuIDAKLSAgICBhc3NlcnRfKGNtcChDbGFzc2ljV2Fja3lDb21wYXJlcigpLCBldmlsX2NvZXJjZXIpID09IDApCi0KLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcidjb21wbGV4IGRpdm1vZFwoXCksIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkJywKLSAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHIndGVzdC50ZXN0X2NvZXJjaW9uJCcpCi1kb19pbmZpeF9iaW5vcHMoKQotZG9fcHJlZml4X2Jpbm9wcygpCi1kb19jbXB0eXBlcygpCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBhcmUucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBhcmUucHkKaW5kZXggNjg5OTkyNi4uMmZkZTYxNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21wYXJlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGFyZS5weQpAQCAtMSw0ICsxLDYgQEAKIGltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAogY2xhc3MgRW1wdHk6CiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgpAQCAtMjcsMjggKzI5LDMxIEBACiAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgogICAgICAgICByZXR1cm4gY21wKHNlbGYuYXJnLCBvdGhlcikKIAorY2xhc3MgQ29tcGFyaXNvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHNldDEgPSBbMiwgMi4wLCAyTCwgMiswaiwgQ29lcmNlKDIpLCBDbXAoMi4wKV0KKyAgICBzZXQyID0gW1sxXSwgKDMsKSwgTm9uZSwgRW1wdHkoKV0KKyAgICBjYW5kaWRhdGVzID0gc2V0MSArIHNldDIKIAotY2FuZGlkYXRlcyA9IFsyLCAyLjAsIDJMLCAyKzBqLCBbMV0sICgzLCksIE5vbmUsIEVtcHR5KCksIENvZXJjZSgyKSwgQ21wKDIuMCldCi0KLWRlZiB0ZXN0KCk6Ci0gICAgZm9yIGEgaW4gY2FuZGlkYXRlczoKLSAgICAgICAgZm9yIGIgaW4gY2FuZGlkYXRlczoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICB4ID0gYSA9PSBiCi0gICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJ2NtcCglcywgJXMpID0+ICVzJyAlIChhLCBiLCBzeXMuZXhjX2luZm8oKVswXSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgeDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzID09ICVzIiAlIChhLCBiKQorICAgIGRlZiB0ZXN0X2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBmb3IgYSBpbiBzZWxmLmNhbmRpZGF0ZXM6CisgICAgICAgICAgICBmb3IgYiBpbiBzZWxmLmNhbmRpZGF0ZXM6CisgICAgICAgICAgICAgICAgaWYgKChhIGluIHNlbGYuc2V0MSkgYW5kIChiIGluIHNlbGYuc2V0MSkpIG9yIGEgaXMgYjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQogICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICIlcyAhPSAlcyIgJSAoYSwgYikKLSAgICAjIEVuc3VyZSBkZWZhdWx0IGNvbXBhcmlzb24gY29tcGFyZXMgaWQoKSBvZiBhcmdzCi0gICAgTCA9IFtdCi0gICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICBMLmluc2VydChsZW4oTCkvLzIsIEVtcHR5KCkpCi0gICAgZm9yIGEgaW4gTDoKLSAgICAgICAgZm9yIGIgaW4gTDoKLSAgICAgICAgICAgIGlmIGNtcChhLCBiKSAhPSBjbXAoaWQoYSksIGlkKGIpKToKLSAgICAgICAgICAgICAgICBwcmludCAiRVJST1I6IiwgY21wKGEsIGIpLCBjbXAoaWQoYSksIGlkKGIpKSwgaWQoYSksIGlkKGIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYSwgYikKIAotdGVzdCgpCisgICAgZGVmIHRlc3RfaWRfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgICMgRW5zdXJlIGRlZmF1bHQgY29tcGFyaXNvbiBjb21wYXJlcyBpZCgpIG9mIGFyZ3MKKyAgICAgICAgTCA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIEwuaW5zZXJ0KGxlbihMKS8vMiwgRW1wdHkoKSkKKyAgICAgICAgZm9yIGEgaW4gTDoKKyAgICAgICAgICAgIGZvciBiIGluIEw6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoYSwgYiksIGNtcChpZChhKSwgaWQoYikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2E9JXIsIGI9JXInICUgKGEsIGIpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDb21wYXJpc29uVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CmluZGV4IDFkNDdmOTEuLjcyYzRmN2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKQEAgLTI4NCw2ICsyODQsMTAgQEAKICAgICAgICAgZjEsIGYyID0gZigpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZjEuZnVuY19jb2RlKSwgaWQoZjIuZnVuY19jb2RlKSkKIAorICAgIGRlZiB0ZXN0X3VuaWNvZGVfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIGNvZGUgPSB1IiMgLSotIGNvZGluZzogdXRmLTggLSotXG5wYXNzXG4iCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlLCBjb2RlLCAidG1wIiwgImV4ZWMiKQorCiAgICAgZGVmIHRlc3Rfc3Vic2NyaXB0cyhzZWxmKToKICAgICAgICAgIyBTRiBidWcgMTQ0ODgwNAogICAgICAgICAjIENsYXNzIHRvIG1ha2UgdGVzdGluZyBzdWJzY3JpcHQgcmVzdWx0cyBlYXN5CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQppbmRleCA1ZTdiMTVjLi5hNTlkNmFhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKQEAgLTEsMTAgKzEsMTIgQEAKIGltcG9ydCBjb21waWxlcgogZnJvbSBjb21waWxlci5hc3QgaW1wb3J0IGZsYXR0ZW4KLWltcG9ydCBvcworaW1wb3J0IG9zLCBzeXMsIHRpbWUsIHVuaXR0ZXN0CiBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKLWltcG9ydCB1bml0dGVzdAogZnJvbSByYW5kb20gaW1wb3J0IHJhbmRvbQogCisjIEhvdyBtdWNoIHRpbWUgaW4gc2Vjb25kcyBjYW4gcGFzcyBiZWZvcmUgd2UgcHJpbnQgYSAnU3RpbGwgd29ya2luZycgbWVzc2FnZS4KK19QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTCA9IDUgKiA2MAorCiBjbGFzcyBDb21waWxlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RDb21waWxlTGlicmFyeShzZWxmKToKQEAgLTEzLDExICsxNSwxOCBAQAogICAgICAgICAjIHRoYXQgYW55IG9mIHRoZSBjb2RlIGlzIGNvcnJlY3QsIG1lcmVseSB0aGUgY29tcGlsZXIgaXMgYWJsZQogICAgICAgICAjIHRvIGdlbmVyYXRlIHNvbWUga2luZCBvZiBjb2RlIGZvciBpdC4KIAorICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAogICAgICAgICBsaWJkaXIgPSBvcy5wYXRoLmRpcm5hbWUodW5pdHRlc3QuX19maWxlX18pCiAgICAgICAgIHRlc3RkaXIgPSBvcy5wYXRoLmRpcm5hbWUodGVzdC50ZXN0X3N1cHBvcnQuX19maWxlX18pCiAKICAgICAgICAgZm9yIGRpciBpbiBbbGliZGlyLCB0ZXN0ZGlyXToKICAgICAgICAgICAgIGZvciBiYXNlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcik6CisgICAgICAgICAgICAgICAgIyBQcmludCBzdGlsbCB3b3JraW5nIG1lc3NhZ2Ugc2luY2UgdGhpcyB0ZXN0IGNhbiBiZSByZWFsbHkgc2xvdworICAgICAgICAgICAgICAgIGlmIG5leHRfdGltZSA8PSB0aW1lLnRpbWUoKToKKyAgICAgICAgICAgICAgICAgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgXAorICAgICAgICAgICAgICAgICAgICAgICAnICB0ZXN0Q29tcGlsZUxpYnJhcnkgc3RpbGwgd29ya2luZywgYmUgcGF0aWVudC4uLicKKwogICAgICAgICAgICAgICAgIGlmIG5vdCBiYXNlbmFtZS5lbmRzd2l0aCgiLnB5Iik6CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgaWYgbm90IFRFU1RfQUxMIGFuZCByYW5kb20oKSA8IDAuOTg6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKaW5kZXggZjhkYjg4Yy4uOTc0NzBjNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQpAQCAtMiwxMiArMiwxNCBAQAogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CiAKK2ltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IGRlY2ltYWwKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdGhyZWFkaW5nCiBmcm9tIGNvbnRleHRsaWIgaW1wb3J0ICogICMgVGVzdHMgX19hbGxfXworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3N1aXRlCiAKIGNsYXNzIENvbnRleHRNYW5hZ2VyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC00NSw2ICs0NywyOCBAQAogICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBaZXJvRGl2aXNpb25FcnJvciIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFsxLCA0MiwgOTk5XSkKIAorICAgIGRlZiB0ZXN0X2NvbnRleHRtYW5hZ2VyX25vX3JlcmFpc2Uoc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgd2hlZSgpOgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgY3R4ID0gd2hlZSgpLl9fY29udGV4dF9fKCkKKyAgICAgICAgY3R4Ll9fZW50ZXJfXygpCisgICAgICAgICMgQ2FsbGluZyBfX2V4aXRfXyBzaG91bGQgbm90IHJlc3VsdCBpbiBhbiBleGNlcHRpb24KKyAgICAgICAgc2VsZi5mYWlsSWYoY3R4Ll9fZXhpdF9fKFR5cGVFcnJvciwgVHlwZUVycm9yKCJmb28iKSwgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl90cmFwX3lpZWxkX2FmdGVyX3Rocm93KHNlbGYpOgorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHdob28oKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHlpZWxkCisgICAgICAgIGN0eCA9IHdob28oKS5fX2NvbnRleHRfXygpCisgICAgICAgIGN0eC5fX2VudGVyX18oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwgY3R4Ll9fZXhpdF9fLCBUeXBlRXJyb3IsIFR5cGVFcnJvcigiZm9vIiksIE5vbmUKKyAgICAgICAgKQorCiAgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfZXhjZXB0KHNlbGYpOgogICAgICAgICBzdGF0ZSA9IFtdCiAgICAgICAgIEBjb250ZXh0bWFuYWdlcgpAQCAtNjIsNiArODYsMjEgQEAKICAgICAgICAgICAgIHJhaXNlIFplcm9EaXZpc2lvbkVycm9yKDk5OSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzEsIDQyLCA5OTldKQogCisgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfYXR0cmlicyhzZWxmKToKKyAgICAgICAgZGVmIGF0dHJpYnMoKiprdyk6CisgICAgICAgICAgICBkZWYgZGVjb3JhdGUoZnVuYyk6CisgICAgICAgICAgICAgICAgZm9yIGssdiBpbiBrdy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGZ1bmMsayx2KQorICAgICAgICAgICAgICAgIHJldHVybiBmdW5jCisgICAgICAgICAgICByZXR1cm4gZGVjb3JhdGUKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIEBhdHRyaWJzKGZvbz0nYmFyJykKKyAgICAgICAgZGVmIGJheihzcGFtKToKKyAgICAgICAgICAgICIiIldoZWUhIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmF6Ll9fbmFtZV9fLCdiYXonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhei5mb28sICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhei5fX2RvY19fLCAiV2hlZSEiKQorCiBjbGFzcyBOZXN0ZWRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICAjIFhYWCBUaGlzIG5lZWRzIG1vcmUgd29yawpAQCAtMjc0LDIxICszMTMsMzEgQEAKIAogICAgIGRlZiB0ZXN0QmFzaWMoc2VsZik6CiAgICAgICAgIGN0eCA9IGRlY2ltYWwuZ2V0Y29udGV4dCgpCi0gICAgICAgIGN0eC5wcmVjID0gc2F2ZV9wcmVjID0gZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYyArIDUKLSAgICAgICAgd2l0aCBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjaW1hbC5nZXRjb250ZXh0KCkucHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNpbWFsLmdldGNvbnRleHQoKS5wcmVjLCBzYXZlX3ByZWMpCisgICAgICAgIG9yaWdfY29udGV4dCA9IGN0eC5jb3B5KCkKICAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3R4LnByZWMgPSBzYXZlX3ByZWMgPSBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dC5wcmVjICsgNQogICAgICAgICAgICAgd2l0aCBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dDoKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dC5wcmVjKQotICAgICAgICAgICAgICAgIDEvMAotICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsIHNhdmVfcHJlYykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIGRlY2ltYWwuRXh0ZW5kZWRDb250ZXh0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYykKKyAgICAgICAgICAgICAgICAgICAgMS8wCisgICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNpbWFsLmdldGNvbnRleHQoKS5wcmVjLCBzYXZlX3ByZWMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlY2ltYWwuc2V0Y29udGV4dChvcmlnX2NvbnRleHQpCiAKIAorIyBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSB0ZXN0IGFjdHVhbGx5IHJ1biB1bmRlciByZWdydGVzdC5weSEKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fc3VpdGUoCisgICAgICAgIHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUoc3lzLm1vZHVsZXNbX19uYW1lX19dKQorICAgICkKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICB1bml0dGVzdC5tYWluKCkKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb3B5X3JlZy5weSBiL0xpYi90ZXN0L3Rlc3RfY29weV9yZWcucHkKaW5kZXggYzQxOTQ2YS4uYzNkMzk2NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb3B5X3JlZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvcHlfcmVnLnB5CkBAIC04LDYgKzgsMjIgQEAKICAgICBwYXNzCiAKIAorY2xhc3MgV2l0aG91dFNsb3RzKG9iamVjdCk6CisgICAgcGFzcworCitjbGFzcyBXaXRoV2Vha3JlZihvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICgnX193ZWFrcmVmX18nLCkKKworY2xhc3MgV2l0aFByaXZhdGUob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAoJ19fc3BhbScsKQorCitjbGFzcyBXaXRoU2luZ2xlU3RyaW5nKG9iamVjdCk6CisgICAgX19zbG90c19fID0gJ3NwYW0nCisKK2NsYXNzIFdpdGhJbmhlcml0ZWQoV2l0aFNpbmdsZVN0cmluZyk6CisgICAgX19zbG90c19fID0gKCdlZ2dzJywpCisKKwogY2xhc3MgQ29weVJlZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2NsYXNzKHNlbGYpOgpAQCAtODQsNiArMTAwLDE5IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb3B5X3JlZy5hZGRfZXh0ZW5zaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLCBmdW5jLCBjb2RlKQogCisgICAgZGVmIHRlc3Rfc2xvdG5hbWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb3B5X3JlZy5fc2xvdG5hbWVzKFdpdGhvdXRTbG90cyksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb3B5X3JlZy5fc2xvdG5hbWVzKFdpdGhXZWFrcmVmKSwgW10pCisgICAgICAgIGV4cGVjdGVkID0gWydfV2l0aFByaXZhdGVfX3NwYW0nXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb3B5X3JlZy5fc2xvdG5hbWVzKFdpdGhQcml2YXRlKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aFNpbmdsZVN0cmluZyksIFsnc3BhbSddKQorICAgICAgICBleHBlY3RlZCA9IFsnZWdncycsICdzcGFtJ10KKyAgICAgICAgZXhwZWN0ZWQuc29ydCgpCisgICAgICAgIHJlc3VsdCA9IGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aEluaGVyaXRlZCkKKyAgICAgICAgcmVzdWx0LnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGVkKQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvcHlSZWdUZXN0Q2FzZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jdXJzZXMucHkgYi9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQppbmRleCBhNGE0NWE3Li5kYzJmMjBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQpAQCAtMjQsNiArMjQsOSBAQAogaWYgbm90IHRlcm0gb3IgdGVybSA9PSAndW5rbm93bic6CiAgICAgcmFpc2UgVGVzdFNraXBwZWQsICIkVEVSTT0lciwgY2FsbGluZyBpbml0c2NyKCkgbWF5IGNhdXNlIGV4aXQiICUgdGVybQogCitpZiBzeXMucGxhdGZvcm0gPT0gImN5Z3dpbiI6CisgICAgcmFpc2UgVGVzdFNraXBwZWQoImN5Z3dpbidzIGN1cnNlcyBtb3N0bHkganVzdCBoYW5ncyIpCisKIGRlZiB3aW5kb3dfZnVuY3Moc3Rkc2NyKToKICAgICAiVGVzdCB0aGUgbWV0aG9kcyBvZiB3aW5kb3dzIgogICAgIHdpbiA9IGN1cnNlcy5uZXd3aW4oMTAsMTApCkBAIC0yMDEsMTEgKzIwNCwxMyBAQAogICAgICAgICBjdXJzZXMuaGFzX2tleSgxMykKIAogICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAnZ2V0bW91c2UnKToKLSAgICAgICAgY3Vyc2VzLm1vdXNlbWFzayhjdXJzZXMuQlVUVE9OMV9QUkVTU0VEKQotICAgICAgICBjdXJzZXMubW91c2VpbnRlcnZhbCgxMCkKLSAgICAgICAgIyBqdXN0IHZlcmlmeSB0aGVzZSBkb24ndCBjYXVzZSBlcnJvcnMKLSAgICAgICAgbSA9IGN1cnNlcy5nZXRtb3VzZSgpCi0gICAgICAgIGN1cnNlcy51bmdldG1vdXNlKCptKQorICAgICAgICAoYXZhaWxtYXNrLCBvbGRtYXNrKSA9IGN1cnNlcy5tb3VzZW1hc2soY3Vyc2VzLkJVVFRPTjFfUFJFU1NFRCkKKyAgICAgICAgIyBhdmFpbG1hc2sgaW5kaWNhdGVzIHRoYXQgbW91c2Ugc3R1ZmYgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgaWYgYXZhaWxtYXNrICE9IDA6CisgICAgICAgICAgICBjdXJzZXMubW91c2VpbnRlcnZhbCgxMCkKKyAgICAgICAgICAgICMganVzdCB2ZXJpZnkgdGhlc2UgZG9uJ3QgY2F1c2UgZXJyb3JzCisgICAgICAgICAgICBtID0gY3Vyc2VzLmdldG1vdXNlKCkKKyAgICAgICAgICAgIGN1cnNlcy51bmdldG1vdXNlKCptKQogCiBkZWYgdW5pdF90ZXN0cygpOgogICAgIGZyb20gY3Vyc2VzIGltcG9ydCBhc2NpaQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKaW5kZXggMjdmNDJjNi4uMjUyOGI0YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CkBAIC0xMTY4LDYgKzExNjgsMTcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIgLSBkdDEsIHVzKQogICAgICAgICBzZWxmLmFzc2VydF8oZHQxIDwgZHQyKQogCisgICAgZGVmIHRlc3Rfc3RyZnRpbWVfd2l0aF9iYWRfdHpuYW1lX3JlcGxhY2Uoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IG9rIGlmIHR6aW5mby50em5hbWUoKS5yZXBsYWNlKCkgcmV0dXJucyBhIG5vbi1zdHJpbmcKKyAgICAgICAgY2xhc3MgTXlUekluZm8oRml4ZWRPZmZzZXQpOgorICAgICAgICAgICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6CisgICAgICAgICAgICAgICAgY2xhc3MgTXlTdHIoc3RyKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIHJlcGxhY2Uoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gTXlTdHIoJ25hbWUnKQorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyMDA1LCAzLCAyLCAwLCAwLCAwLCAwLCBNeVR6SW5mbygzLCAnbmFtZScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuc3RyZnRpbWUsICclWicpCisKICAgICBkZWYgdGVzdF9iYWRfY29uc3RydWN0b3JfYXJndW1lbnRzKHNlbGYpOgogICAgICAgICAjIGJhZCB5ZWFycwogICAgICAgICBzZWxmLnRoZWNsYXNzKE1JTllFQVIsIDEsIDEpICAjIG5vIGV4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5IGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CmluZGV4IDFkMzNlYzQuLjM0MWFkNmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKQEAgLTI5LDcgKzI5LDggQEAKIGltcG9ydCBvcywgc3lzCiBpbXBvcnQgcGlja2xlLCBjb3B5CiBmcm9tIGRlY2ltYWwgaW1wb3J0ICoKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QsIHJ1bl9kb2N0ZXN0LCBpc19yZXNvdXJjZV9lbmFibGVkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAoVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdCwgcnVuX2RvY3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVzb3VyY2VfZW5hYmxlZCkKIGltcG9ydCByYW5kb20KIHRyeToKICAgICBpbXBvcnQgdGhyZWFkaW5nCkBAIC0zOSwxMiArNDAsMTUgQEAKICMgVXNlZnVsIFRlc3QgQ29uc3RhbnQKIFNpZ25hbHMgPSBnZXRjb250ZXh0KCkuZmxhZ3Mua2V5cygpCiAKLSMgVGVzdHMgYXJlIGJ1aWx0IGFyb3VuZCB0aGVzZSBhc3N1bWVkIGNvbnRleHQgZGVmYXVsdHMKLURlZmF1bHRDb250ZXh0LnByZWM9OQotRGVmYXVsdENvbnRleHQucm91bmRpbmc9Uk9VTkRfSEFMRl9FVkVOCi1EZWZhdWx0Q29udGV4dC50cmFwcz1kaWN0LmZyb21rZXlzKFNpZ25hbHMsIDApCi1zZXRjb250ZXh0KERlZmF1bHRDb250ZXh0KQotCisjIFRlc3RzIGFyZSBidWlsdCBhcm91bmQgdGhlc2UgYXNzdW1lZCBjb250ZXh0IGRlZmF1bHRzLgorIyB0ZXN0X21haW4oKSByZXN0b3JlcyB0aGUgb3JpZ2luYWwgY29udGV4dC4KK2RlZiBpbml0KCk6CisgICAgZ2xvYmFsIE9SSUdJTkFMX0NPTlRFWFQKKyAgICBPUklHSU5BTF9DT05URVhUID0gZ2V0Y29udGV4dCgpLmNvcHkoKQorICAgIERlZmF1bHRDb250ZXh0LnByZWMgPSA5CisgICAgRGVmYXVsdENvbnRleHQucm91bmRpbmcgPSBST1VORF9IQUxGX0VWRU4KKyAgICBEZWZhdWx0Q29udGV4dC50cmFwcyA9IGRpY3QuZnJvbWtleXMoU2lnbmFscywgMCkKKyAgICBzZXRjb250ZXh0KERlZmF1bHRDb250ZXh0KQogCiBURVNUREFUQURJUiA9ICdkZWNpbWFsdGVzdGRhdGEnCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpAQCAtNTAzLDE2ICs1MDcsMTcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdEZWNpbWFsKDEwKSAhPSBFKCknKSwgJ25lIDEwJykKIAogICAgICAgICAjIGluc2VydCBvcGVyYXRvciBtZXRob2RzIGFuZCB0aGVuIGV4ZXJjaXNlIHRoZW0KLSAgICAgICAgZm9yIHN5bSwgbG9wLCByb3AgaW4gKAotICAgICAgICAgICAgICAgICgnKycsICdfX2FkZF9fJywgJ19fcmFkZF9fJyksCi0gICAgICAgICAgICAgICAgKCctJywgJ19fc3ViX18nLCAnX19yc3ViX18nKSwKLSAgICAgICAgICAgICAgICAoJyonLCAnX19tdWxfXycsICdfX3JtdWxfXycpLAotICAgICAgICAgICAgICAgICgnLycsICdfX3RydWVkaXZfXycsICdfX3J0cnVlZGl2X18nKSwKLSAgICAgICAgICAgICAgICAoJyUnLCAnX19tb2RfXycsICdfX3Jtb2RfXycpLAotICAgICAgICAgICAgICAgICgnLy8nLCAnX19mbG9vcmRpdl9fJywgJ19fcmZsb29yZGl2X18nKSwKLSAgICAgICAgICAgICAgICAoJyoqJywgJ19fcG93X18nLCAnX19ycG93X18nKSwKLSAgICAgICAgICAgICk6CisgICAgICAgIG9wbGlzdCA9IFsKKyAgICAgICAgICAgICgnKycsICdfX2FkZF9fJywgJ19fcmFkZF9fJyksCisgICAgICAgICAgICAoJy0nLCAnX19zdWJfXycsICdfX3JzdWJfXycpLAorICAgICAgICAgICAgKCcqJywgJ19fbXVsX18nLCAnX19ybXVsX18nKSwKKyAgICAgICAgICAgICgnLycsICdfX3RydWVkaXZfXycsICdfX3J0cnVlZGl2X18nKQorICAgICAgICAgICAgKCclJywgJ19fbW9kX18nLCAnX19ybW9kX18nKSwKKyAgICAgICAgICAgICgnLy8nLCAnX19mbG9vcmRpdl9fJywgJ19fcmZsb29yZGl2X18nKSwKKyAgICAgICAgICAgICgnKionLCAnX19wb3dfXycsICdfX3Jwb3dfXycpCisgICAgICAgIF0KIAorICAgICAgICBmb3Igc3ltLCBsb3AsIHJvcCBpbiBvcGxpc3Q6CiAgICAgICAgICAgICBzZXRhdHRyKEUsIGxvcCwgbGFtYmRhIHNlbGYsIG90aGVyOiAnc3RyJyArIGxvcCArIHN0cihvdGhlcikpCiAgICAgICAgICAgICBzZXRhdHRyKEUsIHJvcCwgbGFtYmRhIHNlbGYsIG90aGVyOiBzdHIob3RoZXIpICsgcm9wICsgJ3N0cicpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ0UoKScgKyBzeW0gKyAnRGVjaW1hbCgxMCknKSwKQEAgLTEwNTksNiArMTA2NCw3IEBACiAgICAgaXMgZW5hYmxlZCBpbiByZWdydGVzdC5weQogICAgICIiIgogCisgICAgaW5pdCgpCiAgICAgZ2xvYmFsIFRFU1RfQUxMCiAgICAgVEVTVF9BTEwgPSBhcml0aCBvciBpc19yZXNvdXJjZV9lbmFibGVkKCdkZWNpbWFsJykKIApAQCAtMTA3MywxMCArMTA3OSwxMiBAQAogICAgICAgICBEZWNpbWFsVGVzdCwKICAgICBdCiAKLSAgICBydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKLSAgICBpbXBvcnQgZGVjaW1hbCBhcyBEZWNpbWFsTW9kdWxlCi0gICAgcnVuX2RvY3Rlc3QoRGVjaW1hbE1vZHVsZSwgdmVyYm9zZSkKLQorICAgIHRyeToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgIGltcG9ydCBkZWNpbWFsIGFzIERlY2ltYWxNb2R1bGUKKyAgICAgICAgcnVuX2RvY3Rlc3QoRGVjaW1hbE1vZHVsZSwgdmVyYm9zZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBzZXRjb250ZXh0KE9SSUdJTkFMX0NPTlRFWFQpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgIyBDYWxsaW5nIHdpdGggbm8gYXJndW1lbnRzIHJ1bnMgYWxsIHRlc3RzLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weSBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKaW5kZXggMTg1ZWRiMy4uODljZWJiMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CkBAIC0xNjM4LDcgKzE2MzgsOSBAQAogICAgIGMxID0gQygpCiAgICAgYzIgPSBDKCkKICAgICB2ZXJpZnkobm90IG5vdCBjMSkKLSAgICB2ZXJlcShoYXNoKGMxKSwgaWQoYzEpKQorICAgIHZlcmlmeShpZChjMSkgIT0gaWQoYzIpKQorICAgIGhhc2goYzEpCisgICAgaGFzaChjMikKICAgICB2ZXJlcShjbXAoYzEsIGMyKSwgY21wKGlkKGMxKSwgaWQoYzIpKSkKICAgICB2ZXJlcShjMSwgYzEpCiAgICAgdmVyaWZ5KGMxICE9IGMyKQpAQCAtMTY2MCw3ICsxNjYyLDkgQEAKICAgICBkMSA9IEQoKQogICAgIGQyID0gRCgpCiAgICAgdmVyaWZ5KG5vdCBub3QgZDEpCi0gICAgdmVyZXEoaGFzaChkMSksIGlkKGQxKSkKKyAgICB2ZXJpZnkoaWQoZDEpICE9IGlkKGQyKSkKKyAgICBoYXNoKGQxKQorICAgIGhhc2goZDIpCiAgICAgdmVyZXEoY21wKGQxLCBkMiksIGNtcChpZChkMSksIGlkKGQyKSkpCiAgICAgdmVyZXEoZDEsIGQxKQogICAgIHZlcmlmeShkMSAhPSBkMikKQEAgLTI5MTQsNyArMjkxOCw3IEBACiAgICAgY2xhc3MgRChCLCBDKToKICAgICAgICAgcGFzcwogICAgIGQgPSBEKCkKLSAgICB2ZXJlcShoYXNoKGQpLCBpZChkKSkKKyAgICBvcmlnX2hhc2ggPSBoYXNoKGQpICMgcmVsYXRlZCB0byBpZChkKSBpbiBwbGF0Zm9ybS1kZXBlbmRlbnQgd2F5cwogICAgIEEuX19oYXNoX18gPSBsYW1iZGEgc2VsZjogNDIKICAgICB2ZXJlcShoYXNoKGQpLCA0MikKICAgICBDLl9faGFzaF9fID0gbGFtYmRhIHNlbGY6IDMxNApAQCAtMjkzMCw3ICsyOTM0LDcgQEAKICAgICBkZWwgQy5fX2hhc2hfXwogICAgIHZlcmVxKGhhc2goZCksIDQyKQogICAgIGRlbCBBLl9faGFzaF9fCi0gICAgdmVyZXEoaGFzaChkKSwgaWQoZCkpCisgICAgdmVyZXEoaGFzaChkKSwgb3JpZ19oYXNoKQogICAgIGQuZm9vID0gNDIKICAgICBkLmJhciA9IDQyCiAgICAgdmVyZXEoZC5mb28sIDQyKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaWZmbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9kaWZmbGliLnB5CmluZGV4IDUyZmVlZjAuLjgzZmFkMTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpZmZsaWIucHkKQEAgLTE1Miw2ICsxNTIsMTAgQEAKICAgICAgICAgZGlmZmxpYi5TZXF1ZW5jZU1hdGNoZXIoTm9uZSwgb2xkLCBuZXcpLmdldF9vcGNvZGVzKCkKIAogCi1Eb2N0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKGRpZmZsaWIpCitkZWYgdGVzdF9tYWluKCk6CisgICAgZGlmZmxpYi5IdG1sRGlmZi5fZGVmYXVsdF9wcmVmaXggPSAwCisgICAgRG9jdGVzdHMgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZShkaWZmbGliKQorICAgIHJ1bl91bml0dGVzdChUZXN0U0ZwYXRjaGVzLCBUZXN0U0ZidWdzLCBEb2N0ZXN0cykKIAotcnVuX3VuaXR0ZXN0KFRlc3RTRnBhdGNoZXMsIFRlc3RTRmJ1Z3MsIERvY3Rlc3RzKQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kbC5weSBiL0xpYi90ZXN0L3Rlc3RfZGwucHkKaW5kZXggZDFmNzNiMi4uYjcwYTRjZiAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9kbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RsLnB5CkBAIC0xMCw2ICsxMCw3IEBACiAgICAgKCcvdXNyL2xpYi9saWJjLnNvJywgJ2dldHBpZCcpLAogICAgICgnL2xpYi9saWJjLnNvLjYnLCAnZ2V0cGlkJyksCiAgICAgKCcvdXNyL2Jpbi9jeWd3aW4xLmRsbCcsICdnZXRwaWQnKSwKKyAgICAoJy91c3IvbGliL2xpYmMuZHlsaWInLCAnZ2V0cGlkJyksCiAgICAgXQogCiBmb3IgcywgZnVuYyBpbiBzaGFyZWRsaWJzOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CmluZGV4IDFmODlhYzIuLmIxNzYwN2QgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKQEAgLTYwNCw4ICs2MDQsOCBAQAogICAgIC4uLiAgICAgPj4+IGZvciB4IGluIHJhbmdlKDEwKToKICAgICAuLi4gICAgIC4uLiAgICAgcHJpbnQgeCwKICAgICAuLi4gICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkKLSAgICAuLi4gICAgID4+PiB4LzIKLSAgICAuLi4gICAgIDYuMAorICAgIC4uLiAgICAgPj4+IHgvLzIKKyAgICAuLi4gICAgIDYKICAgICAuLi4gICAgICcnJwogICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgID4+PiBbZS5saW5lbm8gZm9yIGUgaW4gdGVzdC5leGFtcGxlc10KQEAgLTY3OSw4ICs2NzksOCBAQAogICAgIC4uLiAgICAgPj4+IHggPSAxMgogICAgIC4uLiAgICAgPj4+IHByaW50IHgKICAgICAuLi4gICAgIDEyCi0gICAgLi4uICAgICA+Pj4geC8yCi0gICAgLi4uICAgICA2LjAKKyAgICAuLi4gICAgID4+PiB4Ly8yCisgICAgLi4uICAgICA2CiAgICAgLi4uICAgICAnJycKICAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KIApAQCAtNzAwLDggKzcwMCw4IEBACiAgICAgLi4uICAgICA+Pj4geCA9IDEyCiAgICAgLi4uICAgICA+Pj4gcHJpbnQgeAogICAgIC4uLiAgICAgMTQKLSAgICAuLi4gICAgID4+PiB4LzIKLSAgICAuLi4gICAgIDYuMAorICAgIC4uLiAgICAgPj4+IHgvLzIKKyAgICAuLi4gICAgIDYKICAgICAuLi4gICAgICcnJwogICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1UcnVlKS5ydW4odGVzdCkKQEAgLTcyMyw5ICs3MjMsOSBAQAogICAgIEdvdDoKICAgICAgICAgMTIKICAgICBUcnlpbmc6Ci0gICAgICAgIHgvMgorICAgICAgICB4Ly8yCiAgICAgRXhwZWN0aW5nOgotICAgICAgICA2LjAKKyAgICAgICAgNgogICAgIG9rCiAgICAgKDEsIDMpCiAiIiIKQEAgLTczOCw4ICs3MzgsOCBAQAogICAgIC4uLiAgICAgPj4+IHggPSAxMgogICAgIC4uLiAgICAgPj4+IHByaW50IHgKICAgICAuLi4gICAgIDEyCi0gICAgLi4uICAgICA+Pj4geC8yCi0gICAgLi4uICAgICA2LjAKKyAgICAuLi4gICAgID4+PiB4Ly8yCisgICAgLi4uICAgICA2CiAgICAgLi4uICAgICAnJycKICAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KIApAQCAtNzU0LDkgKzc1NCw5IEBACiAgICAgICAgIDEyCiAgICAgb2sKICAgICBUcnlpbmc6Ci0gICAgICAgIHgvMgorICAgICAgICB4Ly8yCiAgICAgRXhwZWN0aW5nOgotICAgICAgICA2LjAKKyAgICAgICAgNgogICAgIG9rCiAgICAgKDAsIDMpCiAKQEAgLTc4NCw5ICs3ODQsOSBAQAogICAgICAgICAxMgogICAgIG9rCiAgICAgVHJ5aW5nOgotICAgICAgICB4LzIKKyAgICAgICAgeC8vMgogICAgIEV4cGVjdGluZzoKLSAgICAgICAgNi4wCisgICAgICAgIDYKICAgICBvawogICAgICgwLCAzKQogCkBAIC04MDYsOSArODA2LDkgQEAKICAgICA+Pj4gZGVmIGYoeCk6CiAgICAgLi4uICAgICAnJycKICAgICAuLi4gICAgID4+PiB4ID0gMTIKLSAgICAuLi4gICAgID4+PiBwcmludCB4LzAKKyAgICAuLi4gICAgID4+PiBwcmludCB4Ly8wCiAgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgLi4uICAgICBaZXJvRGl2aXNpb25FcnJvcjogZmxvYXQgZGl2aXNpb24KKyAgICAuLi4gICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCiAgICAgLi4uICAgICAnJycKICAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQpAQCAtODIyLDEwICs4MjIsMTAgQEAKICAgICA+Pj4gZGVmIGYoeCk6CiAgICAgLi4uICAgICAnJycKICAgICAuLi4gICAgID4+PiB4ID0gMTIKLSAgICAuLi4gICAgID4+PiBwcmludCAncHJlLWV4Y2VwdGlvbiBvdXRwdXQnLCB4LzAKKyAgICAuLi4gICAgID4+PiBwcmludCAncHJlLWV4Y2VwdGlvbiBvdXRwdXQnLCB4Ly8wCiAgICAgLi4uICAgICBwcmUtZXhjZXB0aW9uIG91dHB1dAogICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgIC4uLiAgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGZsb2F0IGRpdmlzaW9uCisgICAgLi4uICAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybwogICAgIC4uLiAgICAgJycnCiAgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKQEAgLTgzMywxMCArODMzLDEwIEBACiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIEZpbGUgLi4uLCBsaW5lIDQsIGluIGYKICAgICBGYWlsZWQgZXhhbXBsZToKLSAgICAgICAgcHJpbnQgJ3ByZS1leGNlcHRpb24gb3V0cHV0JywgeC8wCisgICAgICAgIHByaW50ICdwcmUtZXhjZXB0aW9uIG91dHB1dCcsIHgvLzAKICAgICBFeGNlcHRpb24gcmFpc2VkOgogICAgICAgICAuLi4KLSAgICAgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGZsb2F0IGRpdmlzaW9uCisgICAgICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCiAgICAgKDEsIDIpCiAKIEV4Y2VwdGlvbiBtZXNzYWdlcyBtYXkgY29udGFpbiBuZXdsaW5lczoKQEAgLTkyMCw3ICs5MjAsNyBAQAogCiAgICAgPj4+IGRlZiBmKHgpOgogICAgIC4uLiAgICAgcicnJwotICAgIC4uLiAgICAgPj4+IDEvMAorICAgIC4uLiAgICAgPj4+IDEvLzAKICAgICAuLi4gICAgIDAKICAgICAuLi4gICAgICcnJwogICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQpAQCAtOTI5LDExICs5MjksMTEgQEAKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgRmlsZSAuLi4sIGxpbmUgMywgaW4gZgogICAgIEZhaWxlZCBleGFtcGxlOgotICAgICAgICAxLzAKKyAgICAgICAgMS8vMAogICAgIEV4Y2VwdGlvbiByYWlzZWQ6CiAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAgLi4uCi0gICAgICAgIFplcm9EaXZpc2lvbkVycm9yOiBmbG9hdCBkaXZpc2lvbgorICAgICAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybwogICAgICgxLCAxKQogIiIiCiAgICAgZGVmIG9wdGlvbmZsYWdzKCk6IHIiIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2FmNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CkBAIC0wLDAgKzEsMTMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzCisKK2ltcG9ydCB1bml0dGVzdAorIyBUaGUgc3BlY2lmaWMgdGVzdHMgbm93IGxpdmUgaW4gTGliL2VtYWlsL3Rlc3QKK2Zyb20gZW1haWwudGVzdC50ZXN0X2VtYWlsX3JlbmFtZWQgaW1wb3J0IHN1aXRlCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fc3VpdGUKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl9zdWl0ZShzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKaW5kZXggZmQ1NjcwYS4uYWIzZGE4NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQpAQCAtMTAwLDEyICsxMDAsMTggQEAKICAgICBwcmludCAid3JpdGVsaW5lcyBhY2NlcHRlZCBzZXF1ZW5jZSBvZiBub24tc3RyaW5nIG9iamVjdHMiCiBmLmNsb3NlKCkKIAotdHJ5OgotICAgIHN5cy5zdGRpbi5zZWVrKC0xKQotZXhjZXB0IElPRXJyb3I6Ci0gICAgcGFzcworIyBUaGlzIGNhdXNlcyB0aGUgaW50ZXJwcmV0ZXIgdG8gZXhpdCBvbiBPU0YxIHY1LjEuCitpZiBzeXMucGxhdGZvcm0gIT0gJ29zZjFWNSc6CisgICAgdHJ5OgorICAgICAgICBzeXMuc3RkaW4uc2VlaygtMSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHByaW50ICJzaG91bGQgbm90IGJlIGFibGUgdG8gc2VlayBvbiBzeXMuc3RkaW4iCiBlbHNlOgotICAgIHByaW50ICJzaG91bGQgbm90IGJlIGFibGUgdG8gc2VlayBvbiBzeXMuc3RkaW4iCisgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgKAorICAgICAgICAnICBTa2lwcGluZyBzeXMuc3RkaW4uc2VlaygtMSksIGl0IG1heSBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIuJworICAgICAgICAnIFRlc3QgbWFudWFsbHkuJykKIAogdHJ5OgogICAgIHN5cy5zdGRpbi50cnVuY2F0ZSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CmluZGV4IGYzYTc4NDEuLjMwMTc2OWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CkBAIC0xNjIsNyArMTYyLDEwIEBACiAgICAgcHJpbnQgIjE1LiBVbmljb2RlIGZpbGVuYW1lcyIKIHRyeToKICAgICB0MSA9IHdyaXRlVG1wKDEsIFsiQVxuQiJdKQotICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPXVuaWNvZGUodDEsIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkpCisgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKKyAgICBpZiBlbmNvZGluZyBpcyBOb25lOgorICAgICAgICBlbmNvZGluZyA9ICdhc2NpaScKKyAgICBmaSA9IEZpbGVJbnB1dChmaWxlcz11bmljb2RlKHQxLCBlbmNvZGluZykpCiAgICAgbGluZXMgPSBsaXN0KGZpKQogICAgIHZlcmlmeShsaW5lcyA9PSBbIkFcbiIsICJCIl0pCiBmaW5hbGx5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mb3JrMS5weSBiL0xpYi90ZXN0L3Rlc3RfZm9yazEucHkKaW5kZXggYWNhN2E4NC4uY2JhNWZjNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mb3JrMS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZvcmsxLnB5CkBAIC0xLDc1ICsxLDIzIEBACiAiIiJUaGlzIHRlc3QgY2hlY2tzIGZvciBjb3JyZWN0IGZvcmsoKSBiZWhhdmlvci4KLQotV2Ugd2FudCBmb3JrMSgpIHNlbWFudGljcyAtLSBvbmx5IHRoZSBmb3JraW5nIHRocmVhZCBzdXJ2aXZlcyBpbiB0aGUKLWNoaWxkIGFmdGVyIGEgZm9yaygpLgotCi1PbiBzb21lIHN5c3RlbXMgKGUuZy4gU29sYXJpcyB3aXRob3V0IHBvc2l4IHRocmVhZHMpIHdlIGZpbmQgdGhhdCBhbGwKLWFjdGl2ZSB0aHJlYWRzIHN1cnZpdmUgaW4gdGhlIGNoaWxkIGFmdGVyIGEgZm9yaygpOyB0aGlzIGlzIGFuIGVycm9yLgotCi1XaGlsZSBCZU9TIGRvZXNuJ3Qgb2ZmaWNpYWxseSBzdXBwb3J0IGZvcmsgYW5kIG5hdGl2ZSB0aHJlYWRpbmcgaW4KLXRoZSBzYW1lIGFwcGxpY2F0aW9uLCB0aGUgcHJlc2VudCBleGFtcGxlIHNob3VsZCB3b3JrIGp1c3QgZmluZS4gIERDCiAiIiIKIAotaW1wb3J0IG9zLCBzeXMsIHRpbWUsIHRocmVhZAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyaWZ5LCB2ZXJib3NlLCBUZXN0U2tpcHBlZAoraW1wb3J0IG9zCitmcm9tIHRlc3QuZm9ya193YWl0IGltcG9ydCBGb3JrV2FpdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdAogCiB0cnk6CiAgICAgb3MuZm9yawogZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgIHJhaXNlIFRlc3RTa2lwcGVkLCAib3MuZm9yayBub3QgZGVmaW5lZCAtLSBza2lwcGluZyB0ZXN0X2ZvcmsxIgogCi1MT05HU0xFRVAgPSAyCi0KLVNIT1JUU0xFRVAgPSAwLjUKLQotTlVNX1RIUkVBRFMgPSA0Ci0KLWFsaXZlID0ge30KLQotc3RvcCA9IDAKLQotZGVmIGYoaWQpOgotICAgIHdoaWxlIG5vdCBzdG9wOgotICAgICAgICBhbGl2ZVtpZF0gPSBvcy5nZXRwaWQoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0aW1lLnNsZWVwKFNIT1JUU0xFRVApCi0gICAgICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICAgICAgcGFzcwotCi1kZWYgbWFpbigpOgotICAgIGZvciBpIGluIHJhbmdlKE5VTV9USFJFQURTKToKLSAgICAgICAgdGhyZWFkLnN0YXJ0X25ldyhmLCAoaSwpKQotCi0gICAgdGltZS5zbGVlcChMT05HU0xFRVApCi0KLSAgICBhID0gYWxpdmUua2V5cygpCi0gICAgYS5zb3J0KCkKLSAgICB2ZXJpZnkoYSA9PSByYW5nZShOVU1fVEhSRUFEUykpCi0KLSAgICBwcmVmb3JrX2xpdmVzID0gYWxpdmUuY29weSgpCi0KLSAgICBpZiBzeXMucGxhdGZvcm0gaW4gWyd1bml4d2FyZTcnXToKLSAgICAgICAgY3BpZCA9IG9zLmZvcmsxKCkKLSAgICBlbHNlOgotICAgICAgICBjcGlkID0gb3MuZm9yaygpCi0KLSAgICBpZiBjcGlkID09IDA6Ci0gICAgICAgICMgQ2hpbGQKLSAgICAgICAgdGltZS5zbGVlcChMT05HU0xFRVApCi0gICAgICAgIG4gPSAwCi0gICAgICAgIGZvciBrZXkgaW4gYWxpdmUua2V5cygpOgotICAgICAgICAgICAgaWYgYWxpdmVba2V5XSAhPSBwcmVmb3JrX2xpdmVzW2tleV06Ci0gICAgICAgICAgICAgICAgbiA9IG4rMQotICAgICAgICBvcy5fZXhpdChuKQotICAgIGVsc2U6Ci0gICAgICAgICMgUGFyZW50CitjbGFzcyBGb3JrVGVzdChGb3JrV2FpdCk6CisgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKICAgICAgICAgc3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChjcGlkLCAwKQotICAgICAgICB2ZXJpZnkoc3BpZCA9PSBjcGlkKQotICAgICAgICB2ZXJpZnkoc3RhdHVzID09IDAsCi0gICAgICAgICAgICAgICAgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkgKQotICAgICAgICBnbG9iYWwgc3RvcAotICAgICAgICAjIFRlbGwgdGhyZWFkcyB0byBkaWUKLSAgICAgICAgc3RvcCA9IDEKLSAgICAgICAgdGltZS5zbGVlcCgyKlNIT1JUU0xFRVApICMgV2FpdCBmb3IgdGhyZWFkcyB0byBkaWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGlkLCBjcGlkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXR1cywgMCwgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkpCiAKLW1haW4oKQorZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChGb3JrVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CmluZGV4IDRiZTFiNGMuLmE2MGE3NjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKQEAgLTQyMSw3ICs0MjEsNiBAQAogLi4uICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogLi4uICAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCiAuLi4gICAgICAgICBzZWxmLmdlbmVyYXRvciA9IHNlbGYuZ2VuZXJhdGUoKQotLi4uICAgICAgICAgc2VsZi5jbG9zZSA9IHNlbGYuZ2VuZXJhdG9yLmNsb3NlCiAuLi4KIC4uLiAgICAgZGVmIGdlbmVyYXRlKHNlbGYpOgogLi4uICAgICAgICAgd2hpbGUgbm90IHNlbGYucGFyZW50OgpAQCAtNDg0LDggKzQ4Myw2IEBACiBtZXJnZWQgQSBpbnRvIEcKIEEtPkcgQi0+RyBDLT5HIEQtPkcgRS0+RyBGLT5HIEctPkcgSC0+RyBJLT5HIEotPkcgSy0+RyBMLT5HIE0tPkcKIAotPj4+IGZvciBzIGluIHNldHM6IHMuY2xvc2UoKSAgICAjIGJyZWFrIGN5Y2xlcwotCiAiIiIKICMgRW1hY3MgdHVyZCAnCiAKQEAgLTU5Myw3ICs1OTAsNiBAQAogLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgZyk6CiAuLi4gICAgICAgICBzZWxmLnNvZmFyID0gW10KIC4uLiAgICAgICAgIHNlbGYuZmV0Y2ggPSBnLm5leHQKLS4uLiAgICAgICAgIHNlbGYuY2xvc2UgPSBnLmNsb3NlCiAuLi4KIC4uLiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgogLi4uICAgICAgICAgc29mYXIsIGZldGNoID0gc2VsZi5zb2Zhciwgc2VsZi5mZXRjaApAQCAtNjI0LDggKzYyMCw2IEBACiBbMjAwLCAyMTYsIDIyNSwgMjQwLCAyNDMsIDI1MCwgMjU2LCAyNzAsIDI4OCwgMzAwLCAzMjAsIDMyNCwgMzYwLCAzNzUsIDM4NF0KIFs0MDAsIDQwNSwgNDMyLCA0NTAsIDQ4MCwgNDg2LCA1MDAsIDUxMiwgNTQwLCA1NzYsIDYwMCwgNjI1LCA2NDAsIDY0OCwgNjc1XQogCi0+Pj4gbTIzNS5jbG9zZSgpCi0KIFllIG9sZGUgRmlib25hY2NpIGdlbmVyYXRvciwgTGF6eUxpc3Qgc3R5bGUuCiAKID4+PiBkZWYgZmliZ2VuKGEsIGIpOgpAQCAtNjQ4LDcgKzY0Miw2IEBACiA+Pj4gZmliID0gTGF6eUxpc3QoZmliZ2VuKDEsIDIpKQogPj4+IGZpcnN0bihpdGVyKGZpYiksIDE3KQogWzEsIDIsIDMsIDUsIDgsIDEzLCAyMSwgMzQsIDU1LCA4OSwgMTQ0LCAyMzMsIDM3NywgNjEwLCA5ODcsIDE1OTcsIDI1ODRdCi0+Pj4gZmliLmNsb3NlKCkKIAogCiBSdW5uaW5nIGFmdGVyIHlvdXIgdGFpbCB3aXRoIGl0ZXJ0b29scy50ZWUgKG5ldyBpbiB2ZXJzaW9uIDIuNCkKQEAgLTY4NSw3ICs2NzgsOCBAQAogLi4uICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UodGltZXMoMywgbTMpLAogLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMoNSwgbTUpKSk6CiAuLi4gICAgICAgICAgICAgeWllbGQgbgotLi4uICAgICBtMiwgbTMsIG01LCBtUmVzID0gdGVlKF9tMjM1KCksIDQpCisuLi4gICAgIG0xID0gX20yMzUoKQorLi4uICAgICBtMiwgbTMsIG01LCBtUmVzID0gdGVlKG0xLCA0KQogLi4uICAgICByZXR1cm4gbVJlcwogCiA+Pj4gaXQgPSBtMjM1KCkKQEAgLTcwMiwxMCArNjk2LDkgQEAKIGl0ZXJhdG9ycywgd2hlcmV1cG9uIGl0IGlzIGRlbGV0ZWQuIFlvdSBjYW4gdGhlcmVmb3JlIHByaW50IHRoZSBoYW1taW5nCiBzZXF1ZW5jZSBkdXJpbmcgaG91cnMgd2l0aG91dCBpbmNyZWFzaW5nIG1lbW9yeSB1c2FnZSwgb3IgdmVyeSBsaXR0bGUuCiAKLVRoZSBiZWF1dHkgb2YgaXQgaXMgdGhhdCByZWN1cnNpdmUgcnVubmluZyBhZnRlciB0aGVpciB0YWlsIEZQIGFsZ29yaXRobXMKK1RoZSBiZWF1dHkgb2YgaXQgaXMgdGhhdCByZWN1cnNpdmUgcnVubmluZy1hZnRlci10aGVpci10YWlsIEZQIGFsZ29yaXRobXMKIGFyZSBxdWl0ZSBzdHJhaWdodGZvcndhcmRseSBleHByZXNzZWQgd2l0aCB0aGlzIFB5dGhvbiBpZGlvbS4KIAotCiBZZSBvbGRlIEZpYm9uYWNjaSBnZW5lcmF0b3IsIHRlZSBzdHlsZS4KIAogPj4+IGRlZiBmaWIoKToKQEAgLTcyMSw3ICs3MTQsOCBAQAogLi4uICAgICAgICAgZm9yIHJlcyBpbiBfaXN1bShmaWJIZWFkLCBmaWJUYWlsKToKIC4uLiAgICAgICAgICAgICB5aWVsZCByZXMKIC4uLgotLi4uICAgICBmaWJIZWFkLCBmaWJUYWlsLCBmaWJSZXMgPSB0ZWUoX2ZpYigpLCAzKQorLi4uICAgICByZWFsZmliID0gX2ZpYigpCisuLi4gICAgIGZpYkhlYWQsIGZpYlRhaWwsIGZpYlJlcyA9IHRlZShyZWFsZmliLCAzKQogLi4uICAgICByZXR1cm4gZmliUmVzCiAKID4+PiBmaXJzdG4oZmliKCksIDE3KQpAQCAtMTU0NSw2ICsxNTM5LDkgQEAKID4+PiBnLnRocm93KFZhbHVlRXJyb3IsIFR5cGVFcnJvcigxKSkgICMgbWlzbWF0Y2hlZCB0eXBlLCByZXdyYXBwZWQKIGNhdWdodCBWYWx1ZUVycm9yICgxKQogCis+Pj4gZy50aHJvdyhWYWx1ZUVycm9yLCBWYWx1ZUVycm9yKDEpLCBOb25lKSAgICMgZXhwbGljaXQgTm9uZSB0cmFjZWJhY2sKK2NhdWdodCBWYWx1ZUVycm9yICgxKQorCiA+Pj4gZy50aHJvdyhWYWx1ZUVycm9yKDEpLCAiZm9vIikgICAgICAgIyBiYWQgYXJncwogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAuLi4KQEAgLTE1OTIsOCArMTU4OSw3IEBACiA+Pj4gZigpLnRocm93KCJhYmMiKSAgICAgIyB0aHJvdyBvbiBqdXN0LW9wZW5lZCBnZW5lcmF0b3IKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgLi4uCi1UeXBlRXJyb3I6IGV4Y2VwdGlvbnMgbXVzdCBiZSBjbGFzc2VzLCBvciBpbnN0YW5jZXMsIG5vdCBzdHIKLQorYWJjCiAKIE5vdyBsZXQncyB0cnkgY2xvc2luZyBhIGdlbmVyYXRvcjoKIApAQCAtMTcxMSw2ICsxNzA3LDgxIEBACiAKICIiIgogCityZWZsZWFrc190ZXN0cyA9ICIiIgorUHJpb3IgdG8gYWRkaW5nIGN5Y2xlLUdDIHN1cHBvcnQgdG8gaXRlcnRvb2xzLnRlZSwgdGhpcyBjb2RlIHdvdWxkIGxlYWsKK3JlZmVyZW5jZXMuIFdlIGFkZCBpdCB0byB0aGUgc3RhbmRhcmQgc3VpdGUgc28gdGhlIHJvdXRpbmUgcmVmbGVhay10ZXN0cword291bGQgdHJpZ2dlciBpZiBpdCBzdGFydHMgYmVpbmcgdW5jbGVhbmFibGUgYWdhaW4uCisKKz4+PiBpbXBvcnQgaXRlcnRvb2xzCis+Pj4gZGVmIGxlYWsoKToKKy4uLiAgICAgY2xhc3MgZ2VuOgorLi4uICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorLi4uICAgICAgICAgICAgIHJldHVybiBzZWxmCisuLi4gICAgICAgICBkZWYgbmV4dChzZWxmKToKKy4uLiAgICAgICAgICAgICByZXR1cm4gc2VsZi5pdGVtCisuLi4gICAgIGcgPSBnZW4oKQorLi4uICAgICBoZWFkLCB0YWlsID0gaXRlcnRvb2xzLnRlZShnKQorLi4uICAgICBnLml0ZW0gPSBoZWFkCisuLi4gICAgIHJldHVybiBoZWFkCis+Pj4gaXQgPSBsZWFrKCkKKworTWFrZSBzdXJlIHRvIGFsc28gdGVzdCB0aGUgaW52b2x2ZW1lbnQgb2YgdGhlIHRlZS1pbnRlcm5hbCB0ZWVkYXRhb2JqZWN0LAord2hpY2ggc3RvcmVzIHJldHVybmVkIGl0ZW1zLgorCis+Pj4gaXRlbSA9IGl0Lm5leHQoKQorCisKKworVGhpcyB0ZXN0IGxlYWtlZCBhdCBvbmUgcG9pbnQgZHVlIHRvIGdlbmVyYXRvciBmaW5hbGl6YXRpb24vZGVzdHJ1Y3Rpb24uCitJdCB3YXMgY29waWVkIGZyb20gTGliL3Rlc3QvbGVha2Vycy90ZXN0X2dlbmVyYXRvcl9jeWNsZS5weSBiZWZvcmUgdGhlIGZpbGUKK3dhcyByZW1vdmVkLgorCis+Pj4gZGVmIGxlYWsoKToKKy4uLiAgICBkZWYgZ2VuKCk6CisuLi4gICAgICAgIHdoaWxlIFRydWU6CisuLi4gICAgICAgICAgICB5aWVsZCBnCisuLi4gICAgZyA9IGdlbigpCisKKz4+PiBsZWFrKCkKKworCisKK1RoaXMgdGVzdCBpc24ndCByZWFsbHkgZ2VuZXJhdG9yIHJlbGF0ZWQsIGJ1dCByYXRoZXIgZXhjZXB0aW9uLWluLWNsZWFudXAKK3JlbGF0ZWQuIFRoZSBjb3JvdXRpbmUgdGVzdHMgKGFib3ZlKSBqdXN0IGhhcHBlbiB0byBjYXVzZSBhbiBleGNlcHRpb24gaW4KK3RoZSBnZW5lcmF0b3IncyBfX2RlbF9fICh0cF9kZWwpIG1ldGhvZC4gV2UgY2FuIGFsc28gdGVzdCBmb3IgdGhpcworZXhwbGljaXRseSwgd2l0aG91dCBnZW5lcmF0b3JzLiBXZSBkbyBoYXZlIHRvIHJlZGlyZWN0IHN0ZGVyciB0byBhdm9pZAorcHJpbnRpbmcgd2FybmluZ3MgYW5kIHRvIGRvdWJsZWNoZWNrIHRoYXQgd2UgYWN0dWFsbHkgdGVzdGVkIHdoYXQgd2Ugd2FudGVkCit0byB0ZXN0LgorCis+Pj4gaW1wb3J0IHN5cywgU3RyaW5nSU8KKz4+PiBvbGQgPSBzeXMuc3RkZXJyCis+Pj4gdHJ5OgorLi4uICAgICBzeXMuc3RkZXJyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorLi4uICAgICBjbGFzcyBMZWFrZXI6CisuLi4gICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKy4uLiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKy4uLgorLi4uICAgICBsID0gTGVha2VyKCkKKy4uLiAgICAgZGVsIGwKKy4uLiAgICAgZXJyID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpLnN0cmlwKCkKKy4uLiAgICAgZXJyLnN0YXJ0c3dpdGgoCisuLi4gICAgICAgICAiRXhjZXB0aW9uIGV4Y2VwdGlvbnMuUnVudGltZUVycm9yOiBSdW50aW1lRXJyb3IoKSBpbiA8IgorLi4uICAgICApCisuLi4gICAgIGVyci5lbmRzd2l0aCgiPiBpZ25vcmVkIikKKy4uLiAgICAgbGVuKGVyci5zcGxpdGxpbmVzKCkpCisuLi4gZmluYWxseToKKy4uLiAgICAgc3lzLnN0ZGVyciA9IG9sZAorVHJ1ZQorVHJ1ZQorMQorCisKKworVGhlc2UgcmVmbGVhayB0ZXN0cyBzaG91bGQgcGVyaGFwcyBiZSBpbiBhIHRlc3RmaWxlIG9mIHRoZWlyIG93biwKK3Rlc3RfZ2VuZXJhdG9ycyBqdXN0IGhhcHBlbmVkIHRvIGJlIHRoZSB0ZXN0IHRoYXQgZHJldyB0aGVzZSBvdXQuCisKKyIiIgorCiBfX3Rlc3RfXyA9IHsidHV0IjogICAgICB0dXRvcmlhbF90ZXN0cywKICAgICAgICAgICAgICJwZXAiOiAgICAgIHBlcF90ZXN0cywKICAgICAgICAgICAgICJlbWFpbCI6ICAgIGVtYWlsX3Rlc3RzLApAQCAtMTcxOSw2ICsxNzkwLDcgQEAKICAgICAgICAgICAgICJjb25qb2luIjogIGNvbmpvaW5fdGVzdHMsCiAgICAgICAgICAgICAid2Vha3JlZiI6ICB3ZWFrcmVmX3Rlc3RzLAogICAgICAgICAgICAgImNvcm91dGluZSI6ICBjb3JvdXRpbmVfdGVzdHMsCisgICAgICAgICAgICAicmVmbGVha3MiOiByZWZsZWFrc190ZXN0cywKICAgICAgICAgICAgIH0KIAogIyBNYWdpYyB0ZXN0IG5hbWUgdGhhdCByZWdydGVzdC5weSBpbnZva2VzICphZnRlciogaW1wb3J0aW5nIHRoaXMgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5CmluZGV4IDE1NTY2MDQuLmU0MTQ3NTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXhwcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkKQEAgLTEyOSw3ICsxMjksNyBAQAogVmVyaWZ5IHJlLXVzZSBvZiB0dXBsZXMgKGEgc2lkZSBiZW5lZml0IG9mIHVzaW5nIGdlbmV4cHMgb3ZlciBsaXN0Y29tcHMpCiAKICAgICA+Pj4gdHVwbGVpZHMgPSBtYXAoaWQsICgoaSxpKSBmb3IgaSBpbiB4cmFuZ2UoMTApKSkKLSAgICA+Pj4gbWF4KHR1cGxlaWRzKSAtIG1pbih0dXBsZWlkcykKKyAgICA+Pj4gaW50KG1heCh0dXBsZWlkcykgLSBtaW4odHVwbGVpZHMpKQogICAgIDAKIAogVmVyaWZ5IHRoYXQgc3ludGF4IGVycm9yJ3MgYXJlIHJhaXNlZCBmb3IgZ2VuZXhwcyB1c2VkIGFzIGx2YWx1ZXMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CmluZGV4IGQ0YzY4MWEuLjc0OGFkNDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQpAQCAtNDgsNyArNDgsNyBAQAogVkVSWV9MQVJHRSA9IDB4RkYwMDAwMTIxMjEyMTIxMjEyMTIxMjQyTAogCiBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgVUNIQVJfTUFYLCBVU0hSVF9NQVgsIFVJTlRfTUFYLCBVTE9OR19NQVgsIElOVF9NQVgsIFwKLSAgICAgSU5UX01JTiwgTE9OR19NSU4sIExPTkdfTUFYCisgICAgIElOVF9NSU4sIExPTkdfTUlOLCBMT05HX01BWCwgUFlfU1NJWkVfVF9NSU4sIFBZX1NTSVpFX1RfTUFYCiAKICMgZmFrZSwgdGhleSBhcmUgbm90IGRlZmluZWQgaW4gUHl0aG9uJ3MgaGVhZGVyIGZpbGVzCiBMTE9OR19NQVggPSAyKio2My0xCkBAIC0xODIsNiArMTgyLDIzIEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX2woNDJMKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19sLCBWRVJZX0xBUkdFKQogCisgICAgZGVmIHRlc3RfbihzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfbgorICAgICAgICAjIG4gcmV0dXJucyAnUHlfc3NpemVfdCcsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nCisgICAgICAgICMgKFBZX1NTSVpFX1RfTUlOIC4uLiBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ2V0YXJnc19uKDMuMTQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19uKExvbmcoKSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX24oSW50KCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfbiwgUFlfU1NJWkVfVF9NSU4tMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoUFlfU1NJWkVfVF9NSU4sIGdldGFyZ3NfbihQWV9TU0laRV9UX01JTikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBZX1NTSVpFX1RfTUFYLCBnZXRhcmdzX24oUFlfU1NJWkVfVF9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX24sIFBZX1NTSVpFX1RfTUFYKzEpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3Nfbig0MikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX24oNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19uLCBWRVJZX0xBUkdFKQorCiAKIGNsYXNzIExvbmdMb25nX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9MKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nbG9iLnB5IGIvTGliL3Rlc3QvdGVzdF9nbG9iLnB5CmluZGV4IDhhNmVmN2YuLjVjZTA5ZjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2xvYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dsb2IucHkKQEAgLTgwLDYgKzgwLDE0IEBACiAgICAgICAgIGVxKHNlbGYuZ2xvYignP2E/JywgJypGJyksIG1hcChzZWxmLm5vcm0sIFtvcy5wYXRoLmpvaW4oJ2FhYScsICd6enpGJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oJ2FhYicsICdGJyldKSkKIAorICAgIGRlZiB0ZXN0X2dsb2JfZGlyZWN0b3J5X3dpdGhfdHJhaWxpbmdfc2xhc2goc2VsZik6CisgICAgICAgICMgV2UgYXJlIHZlcmlmeWluZyB0aGF0IHdoZW4gdGhlcmUgaXMgd2lsZGNhcmQgcGF0dGVybiB3aGljaAorICAgICAgICAjIGVuZHMgd2l0aCBvcy5zZXAgZG9lc24ndCBibG93IHVwLgorICAgICAgICByZXMgPSBnbG9iLmdsb2Ioc2VsZi50ZW1wZGlyICsgJyonICsgb3Muc2VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICAjIGVpdGhlciBvZiB0aGVzZSByZXN1bHRzIGFyZSByZWFzb25hYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNbMF0gaW4gW3NlbGYudGVtcGRpciwgc2VsZi50ZW1wZGlyICsgb3Muc2VwXSkKKwogICAgIGRlZiB0ZXN0X2dsb2JfYnJva2VuX3N5bWxpbmtzKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc3ltbGluaycpOgogICAgICAgICAgICAgZXEgPSBzZWxmLmFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQppbmRleCA1YjIwYWIzLi40YmI0ZTQ1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CkBAIC0yNTUsNiArMjU1LDEwIEBACiBkMjJ2KCooMSwgMiwgMywgNCkpCiBkMjJ2KDEsIDIsICooMywgNCwgNSkpCiBkMjJ2KDEsICooMiwgMyksICoqeydkJzogNH0pCitkZWYgZDMxdigoeCkpOiBwYXNzCitkMzF2KDEpCitkZWYgZDMydigoeCwpKTogcGFzcworZDMydigoMSwpKQogCiAjIyMgbGFtYmRlZjogJ2xhbWJkYScgW3ZhcmFyZ3NsaXN0XSAnOicgdGVzdAogcHJpbnQgJ2xhbWJkZWYnCkBAIC04MTEsNiArODE1LDExIEBACiB4ID0gNTsgdCA9IFRydWU7CiB2ZXJpZnkoWyhpLGopIGZvciBpIGluIHJhbmdlKDEwKSBmb3IgaiBpbiByYW5nZSg1KV0gPT0gbGlzdChnKSkKIAorIyBHcmFtbWFyIGFsbG93cyBtdWx0aXBsZSBhZGphY2VudCAnaWYncyBpbiBsaXN0Y29tcHMgYW5kIGdlbmV4cHMsCisjIGV2ZW4gdGhvdWdoIGl0J3Mgc2lsbHkuIE1ha2Ugc3VyZSBpdCB3b3JrcyAoaWZlbHNlIGJyb2tlIHRoaXMuKQordmVyaWZ5KFsgeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMgXSwgWzEsIDUsIDddKQordmVyaWZ5KCh4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyksIFsxLCA1LCA3XSkKKwogIyBUZXN0IGlmZWxzZSBleHByZXNzaW9ucyBpbiB2YXJpb3VzIGNhc2VzCiBkZWYgX2NoZWNrZXZhbChtc2csIHJldCk6CiAgICAgImhlbHBlciB0byBjaGVjayB0aGF0IGV2YWx1YXRpb24gb2YgZXhwcmVzc2lvbnMgaXMgZG9uZSBjb3JyZWN0bHkiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2luZGV4LnB5IGIvTGliL3Rlc3QvdGVzdF9pbmRleC5weQppbmRleCBlNjlkZTI5Li40NWIzYjJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2luZGV4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW5kZXgucHkKQEAgLTAsMCArMSwxMzcgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBvcGVyYXRvcgorCitjbGFzcyBvbGRzdHlsZToKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbmQKKworY2xhc3MgbmV3c3R5bGUob2JqZWN0KToKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbmQKKworY2xhc3MgQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubyA9IG9sZHN0eWxlKCkKKyAgICAgICAgc2VsZi5uID0gbmV3c3R5bGUoKQorICAgICAgICBzZWxmLm8yID0gb2xkc3R5bGUoKQorICAgICAgICBzZWxmLm4yID0gbmV3c3R5bGUoKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAtMgorICAgICAgICBzZWxmLm4uaW5kID0gMgorICAgICAgICBhc3NlcnQoc2VsZi5zZXFbc2VsZi5uXSA9PSBzZWxmLnNlcVsyXSkKKyAgICAgICAgYXNzZXJ0KHNlbGYuc2VxW3NlbGYub10gPT0gc2VsZi5zZXFbLTJdKQorICAgICAgICBhc3NlcnQob3BlcmF0b3IuaW5kZXgoc2VsZi5vKSA9PSAtMikKKyAgICAgICAgYXNzZXJ0KG9wZXJhdG9yLmluZGV4KHNlbGYubikgPT0gMikKKworICAgIGRlZiB0ZXN0X2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gJ2R1bWInCisgICAgICAgIHNlbGYubi5pbmQgPSAnYmFkJworICAgICAgICBteWZ1bmMgPSBsYW1iZGEgeCwgb2JqOiBvYmouc2VxW3hdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4LCBzZWxmLm8pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4LCBzZWxmLm4pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG15ZnVuYywgc2VsZi5vLCBzZWxmKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBteWZ1bmMsIHNlbGYubiwgc2VsZikKKworICAgIGRlZiB0ZXN0X3NsaWNlKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gMQorICAgICAgICBzZWxmLm8yLmluZCA9IDMKKyAgICAgICAgc2VsZi5uLmluZCA9IDIKKyAgICAgICAgc2VsZi5uMi5pbmQgPSA0CisgICAgICAgIGFzc2VydChzZWxmLnNlcVtzZWxmLm86c2VsZi5vMl0gPT0gc2VsZi5zZXFbMTozXSkKKyAgICAgICAgYXNzZXJ0KHNlbGYuc2VxW3NlbGYubjpzZWxmLm4yXSA9PSBzZWxmLnNlcVsyOjRdKQorCisgICAgZGVmIHRlc3RfcmVwZWF0KHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gMworICAgICAgICBzZWxmLm4uaW5kID0gMgorICAgICAgICBhc3NlcnQoc2VsZi5zZXEgKiBzZWxmLm8gPT0gc2VsZi5zZXEgKiAzKQorICAgICAgICBhc3NlcnQoc2VsZi5zZXEgKiBzZWxmLm4gPT0gc2VsZi5zZXEgKiAyKQorICAgICAgICBhc3NlcnQoc2VsZi5vICogc2VsZi5zZXEgPT0gc2VsZi5zZXEgKiAzKQorICAgICAgICBhc3NlcnQoc2VsZi5uICogc2VsZi5zZXEgPT0gc2VsZi5zZXEgKiAyKQorCisgICAgZGVmIHRlc3Rfd3JhcHBlcnMoc2VsZik6CisgICAgICAgIG4gPSBzZWxmLm4KKyAgICAgICAgbi5pbmQgPSA1CisgICAgICAgIGFzc2VydCBuLl9faW5kZXhfXygpID09IDUKKyAgICAgICAgYXNzZXJ0IDYgLl9faW5kZXhfXygpID09IDYKKyAgICAgICAgYXNzZXJ0IC03TC5fX2luZGV4X18oKSA9PSAtNworICAgICAgICBhc3NlcnQgc2VsZi5zZXEuX19nZXRpdGVtX18obikgPT0gc2VsZi5zZXFbNV0KKyAgICAgICAgYXNzZXJ0IHNlbGYuc2VxLl9fbXVsX18obikgPT0gc2VsZi5zZXEgKiA1CisgICAgICAgIGFzc2VydCBzZWxmLnNlcS5fX3JtdWxfXyhuKSA9PSBzZWxmLnNlcSAqIDUKKworICAgIGRlZiB0ZXN0X2luZmluaXRlX3JlY3VzaW9uKHNlbGYpOgorICAgICAgICBjbGFzcyBUcmFwMShpbnQpOgorICAgICAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBjbGFzcyBUcmFwMihsb25nKToKKyAgICAgICAgICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgc2VsZi5zZXEsIFRyYXAxKCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIHNlbGYuc2VxLCBUcmFwMigpKQorCisKK2NsYXNzIExpc3RUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorICAgIHNlcSA9IFswLDEwLDIwLDMwLDQwLDUwXQorCisgICAgZGVmIHRlc3Rfc2V0ZGVsaXRlbShzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IC0yCisgICAgICAgIHNlbGYubi5pbmQgPSAyCisgICAgICAgIGxzdCA9IGxpc3QoJ2FiIWNkZWZnaGkhaicpCisgICAgICAgIGRlbCBsc3Rbc2VsZi5vXQorICAgICAgICBkZWwgbHN0W3NlbGYubl0KKyAgICAgICAgbHN0W3NlbGYub10gPSAnWCcKKyAgICAgICAgbHN0W3NlbGYubl0gPSAnWScKKyAgICAgICAgYXNzZXJ0IGxzdCA9PSBsaXN0KCdhYllkZWZnaFhqJykKKworICAgICAgICBsc3QgPSBbNSwgNiwgNywgOCwgOSwgMTAsIDExXQorICAgICAgICBsc3QuX19zZXRpdGVtX18oc2VsZi5uLCAiaGVyZSIpCisgICAgICAgIGFzc2VydCBsc3QgPT0gWzUsIDYsICJoZXJlIiwgOCwgOSwgMTAsIDExXQorICAgICAgICBsc3QuX19kZWxpdGVtX18oc2VsZi5uKQorICAgICAgICBhc3NlcnQgbHN0ID09IFs1LCA2LCA4LCA5LCAxMCwgMTFdCisKKyAgICBkZWYgdGVzdF9pbnBsYWNlX3JlcGVhdChzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IDIKKyAgICAgICAgc2VsZi5uLmluZCA9IDMKKyAgICAgICAgbHN0ID0gWzYsIDRdCisgICAgICAgIGxzdCAqPSBzZWxmLm8KKyAgICAgICAgYXNzZXJ0IGxzdCA9PSBbNiwgNCwgNiwgNF0KKyAgICAgICAgbHN0ICo9IHNlbGYubgorICAgICAgICBhc3NlcnQgbHN0ID09IFs2LCA0LCA2LCA0XSAqIDMKKworICAgICAgICBsc3QgPSBbNSwgNiwgNywgOCwgOSwgMTFdCisgICAgICAgIGwyID0gbHN0Ll9faW11bF9fKHNlbGYubikKKyAgICAgICAgYXNzZXJ0IGwyIGlzIGxzdAorICAgICAgICBhc3NlcnQgbHN0ID09IFs1LCA2LCA3LCA4LCA5LCAxMV0gKiAzCisKKworY2xhc3MgVHVwbGVUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorICAgIHNlcSA9ICgwLDEwLDIwLDMwLDQwLDUwKQorCitjbGFzcyBTdHJpbmdUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorICAgIHNlcSA9ICJ0aGlzIGlzIGEgdGVzdCIKKworY2xhc3MgVW5pY29kZVRlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgc2VxID0gdSJ0aGlzIGlzIGEgdGVzdCIKKworCitjbGFzcyBYUmFuZ2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF94cmFuZ2Uoc2VsZik6CisgICAgICAgIG4gPSBuZXdzdHlsZSgpCisgICAgICAgIG4uaW5kID0gNQorICAgICAgICBhc3NlcnQgeHJhbmdlKDEsIDIwKVtuXSA9PSA2CisgICAgICAgIGFzc2VydCB4cmFuZ2UoMSwgMjApLl9fZ2V0aXRlbV9fKG4pID09IDYKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgTGlzdFRlc3RDYXNlLAorICAgICAgICBUdXBsZVRlc3RDYXNlLAorICAgICAgICBTdHJpbmdUZXN0Q2FzZSwKKyAgICAgICAgVW5pY29kZVRlc3RDYXNlLAorICAgICAgICBYUmFuZ2VUZXN0Q2FzZSwKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQppbmRleCAwYmRmOTU5Li5kOWZkOTNkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CkBAIC0yOTUsMTAgKzI5NSwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoQS5tLCBbJ3NlbGYnXSkKIAogICAgIGRlZiB0ZXN0X2dldGFyZ3NwZWNfc3VibGlzdG9mb25lKHNlbGYpOgotICAgICAgICBkZWYgc3VibGlzdE9mT25lKChmb28pKTogcmV0dXJuIDEKLQorICAgICAgICBkZWYgc3VibGlzdE9mT25lKChmb28sKSk6IHJldHVybiAxCiAgICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhzdWJsaXN0T2ZPbmUsIFtbJ2ZvbyddXSkKIAorICAgICAgICBkZWYgZmFrZVN1Ymxpc3RPZk9uZSgoZm9vKSk6IHJldHVybiAxCisgICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhmYWtlU3VibGlzdE9mT25lLCBbJ2ZvbyddKQorCiAgICAgZGVmIHRlc3RfY2xhc3NpZnlfbmV3c3R5bGUoc2VsZik6CiAgICAgICAgIGNsYXNzIEEob2JqZWN0KToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQppbmRleCA1OTM5ZmY1Li44YzU4NGFkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQpAQCAtOCw2ICs4LDcgQEAKICMgVGVsbCBpdCB3ZSBkb24ndCBrbm93IGFib3V0IGV4dGVybmFsIGZpbGVzOgogbWltZXR5cGVzLmtub3duZmlsZXMgPSBbXQogbWltZXR5cGVzLmluaXRlZCA9IEZhbHNlCittaW1ldHlwZXMuX2RlZmF1bHRfbWltZV90eXBlcygpCiAKIAogY2xhc3MgTWltZVR5cGVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKaW5kZXggYWVmNzkzMS4uNGQwMmRlZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CkBAIC03LDEzICs3LDExNCBAQAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKLWltcG9ydCB1bml0dGVzdCwgU3RyaW5nSU8sIGNvZGVjcworaW1wb3J0IHVuaXR0ZXN0LCBTdHJpbmdJTywgY29kZWNzLCBzeXMKKworY2xhc3MgVGVzdF9NdWx0aWJ5dGVDb2RlYyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9udWxsY29kaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmRlY29kZSgnZ2IxODAzMCcpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnJywgJ2diMTgwMzAnKSwgdScnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnJy5lbmNvZGUoJ2diMTgwMzAnKSwgJycpCisKKyAgICBkZWYgdGVzdF9zdHJfZGVjb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmNkJy5lbmNvZGUoJ2diMTgwMzAnKSwgJ2FiY2QnKQorCisgICAgZGVmIHRlc3RfZXJyb3JjYWxsYmFja19sb25naW5kZXgoc2VsZik6CisgICAgICAgIGRlYyA9IGNvZGVjcy5nZXRkZWNvZGVyKCdldWMta3InKQorICAgICAgICBteXJlcGxhY2UgID0gbGFtYmRhIGV4YzogKHUnJywgc3lzLm1heGludCsxKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoJ3Rlc3QuY2prdGVzdCcsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGVceDkyaGFtXHg5M3NwYW0nLCAndGVzdC5jamt0ZXN0JykKKworY2xhc3MgVGVzdF9JbmNyZW1lbnRhbEVuY29kZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc3RhdGVsZXNzKHNlbGYpOgorICAgICAgICAjIGNwOTQ5IGVuY29kZXIgaXNuJ3Qgc3RhdGVmdWwgYXQgYWxsLgorICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcignY3A5NDknKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdWQzMGNcdWM3NzRcdWMzNmMgXHViOWM4XHVjNzQ0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4YzZceGM0XHhjMFx4Y2NceGJkXHhlMyBceGI4XHhiNlx4YzBceGJiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTI2MDZcdTIyM2NcdTI2MDYnLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXHhhMVx4ZDlceGExXHhhZFx4YTFceGQ5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodScnLCBUcnVlKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodScnLCBGYWxzZSksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIucmVzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3N0YXRlZnVsKHNlbGYpOgorICAgICAgICAjIGppc3gwMjEzIGVuY29kZXIgaXMgc3RhdGVmdWwgZm9yIGEgZmV3IGNvZGVwb2ludHMuIGVnKQorICAgICAgICAjICAgVSswMEU2ID0+IEE5REMKKyAgICAgICAgIyAgIFUrMDBFNiBVKzAzMDAgPT4gQUJDNAorICAgICAgICAjICAgVSswMzAwID0+IEFCREMKKworICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcignamlzeDAyMTMnKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAwZTZcdTAzMDAnKSwgJ1x4YWJceGM0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDMwMCcpLCAnXHhhYlx4YzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMGU2JywgVHJ1ZSksICdceGE5XHhkYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAzMDAnKSwgJ1x4YWJceGRjJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMGU2JyksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKCcnLCBUcnVlKSwgJ1x4YTlceGRjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSgnJywgVHJ1ZSksICcnKQorCisgICAgZGVmIHRlc3Rfc3RhdGVmdWxfa2VlcF9idWZmZXIoc2VsZik6CisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKCdqaXN4MDIxMycpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBlbmNvZGVyLmVuY29kZSwgdSdcdTAxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMzAwXHUwMGU2JyksICdceGFiXHhjNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgZW5jb2Rlci5lbmNvZGUsIHUnXHUwMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAzMDAnKSwgJ1x4YWJceGRjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBlbmNvZGVyLmVuY29kZSwgdSdcdTAxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnJywgVHJ1ZSksICdceGE5XHhkYycpCisKKworY2xhc3MgVGVzdF9JbmNyZW1lbnRhbERlY29kZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZGJjcyhzZWxmKToKKyAgICAgICAgIyBjcDk0OSBkZWNvZGVyIGlzIHNpbXBsZSB3aXRoIG9ubHkgMSBvciAyIGJ5dGVzIHNlcXVlbmNlcy4KKyAgICAgICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoJ2NwOTQ5JykoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdceGM2XHhjNFx4YzBceGNjXHhiZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXHVkMzBjXHVjNzc0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhlMyBceGI4XHhiNlx4YzBceGJiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcdWMzNmMgXHViOWM4XHVjNzQ0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnJyksIHUnJykKKworICAgIGRlZiB0ZXN0X2RiY3Nfa2VlcF9idWZmZXIoc2VsZik6CisgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKCdjcDk0OScpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhjNlx4YzRceGMwJyksIHUnXHVkMzBjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGVyLmRlY29kZSwgJycsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ1x4Y2MnKSwgdSdcdWM3NzQnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ1x4YzZceGM0XHhjMCcpLCB1J1x1ZDMwYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2Rlci5kZWNvZGUsICdceGNjXHhiZCcsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ1x4Y2MnKSwgdSdcdWM3NzQnKQorCisgICAgZGVmIHRlc3RfaXNvMjAyMihzZWxmKToKKyAgICAgICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoJ2lzbzIwMjItanAnKSgpCisgICAgICAgIEVTQyA9ICdceDFiJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKEVTQyArICcoJyksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnQicsIFRydWUpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoRVNDICsgJyQnKSwgdScnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdCQCQnKSwgdSdcdTRlMTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdAJEAnKSwgdSdcdTRlMTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCckJywgVHJ1ZSksIHUnXHU0ZTE2JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ0AkJyksIHUnQCQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKEVTQyArICckJyksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGVyLmRlY29kZSwgJycsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ0JAJCcpLCB1J1x1NGUxNicpCisKIAogY2xhc3MgVGVzdF9TdHJlYW1Xcml0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGlmIGxlbih1J1xVMDAwMTIzNDUnKSA9PSAyOiAjIFVDUzIKICAgICAgICAgZGVmIHRlc3RfZ2IxODAzMChzZWxmKToKICAgICAgICAgICAgIHM9IFN0cmluZ0lPLlN0cmluZ0lPKCkKLSAgICAgICAgICAgIGMgPSBjb2RlY3MubG9va3VwKCdnYjE4MDMwJylbM10ocykKKyAgICAgICAgICAgIGMgPSBjb2RlY3MuZ2V0d3JpdGVyKCdnYjE4MDMwJykocykKICAgICAgICAgICAgIGMud3JpdGUodScxMjMnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjMnKQogICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnKQpAQCAtMzAsMTUgKzEzMSwxNiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCiAgICAgICAgICAgICAgICAgICAgICcxMjNceDkwN1x4OTU5XHg5MDdceDk1OVx4OTA3XHg5NTlceDgyN1x4Y2Y1XHg4MTBceDg1MScpCiAKLSAgICAgICAgIyBzdGFuZGFyZCB1dGYtOCBjb2RlY3MgaGFzIGJyb2tlbiBTdHJlYW1SZWFkZXIKLSAgICAgICAgaWYgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0Ll9fY2prY29kZWNzX186Ci0gICAgICAgICAgICBkZWYgdGVzdF91dGZfOChzZWxmKToKLSAgICAgICAgICAgICAgICBzPSBTdHJpbmdJTy5TdHJpbmdJTygpCi0gICAgICAgICAgICAgICAgYyA9IGNvZGVjcy5sb29rdXAoJ3V0Zi04JylbM10ocykKLSAgICAgICAgICAgICAgICBjLndyaXRlKHUnMTIzJykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyMycpCi0gICAgICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzXHhmMFx4OTJceDhkXHg4NScpCisgICAgICAgIGRlZiB0ZXN0X3V0Zl84KHNlbGYpOgorICAgICAgICAgICAgcz0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgYyA9IGNvZGVjcy5nZXR3cml0ZXIoJ3V0Zi04JykocykKKyAgICAgICAgICAgIGMud3JpdGUodScxMjMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjMnKQorICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjNceGYwXHg5Mlx4OGRceDg1JykKKworICAgICAgICAgICAgIyBQeXRob24gdXRmLTggY29kZWMgY2FuJ3QgYnVmZmVyIHN1cnJvZ2F0ZSBwYWlycyB5ZXQuCisgICAgICAgICAgICBpZiAwOgogICAgICAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1J1swXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyM1x4ZjBceDkyXHg4ZFx4ODUnKQogICAgICAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1J1sxXSArIHUnXFUwMDAxMjM0NScgKyB1J1x1YWMwMFx1MDBhYycpCkBAIC02MSwxNCArMTYzLDYgQEAKICAgICBlbHNlOiAjIFVDUzQKICAgICAgICAgcGFzcwogCi0gICAgZGVmIHRlc3RfbnVsbGNvZGluZyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5kZWNvZGUoJ2diMTgwMzAnKSwgdScnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJycsICdnYjE4MDMwJyksIHUnJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JycuZW5jb2RlKCdnYjE4MDMwJyksICcnKQotCi0gICAgZGVmIHRlc3Rfc3RyX2RlY29kZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjZCcuZW5jb2RlKCdnYjE4MDMwJyksICdhYmNkJykKLQogICAgIGRlZiB0ZXN0X3N0cmVhbXdyaXRlcl9zdHJ3cml0ZShzZWxmKToKICAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKICAgICAgICAgd3IgPSBjb2RlY3MuZ2V0d3JpdGVyKCdnYjE4MDMwJykocykKQEAgLTgzLDYgKzE3Nyw5IEBACiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdF9NdWx0aWJ5dGVDb2RlYykpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdF9JbmNyZW1lbnRhbEVuY29kZXIpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRlc3RfSW5jcmVtZW50YWxEZWNvZGVyKSkKICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0X1N0cmVhbVdyaXRlcikpCiAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdF9JU08yMDIyKSkKICAgICB0ZXN0X3N1cHBvcnQucnVuX3N1aXRlKHN1aXRlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5CmluZGV4IDQ1YTYzZTcuLmJlYzMyZGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkKQEAgLTMsMTUgKzMsMTIgQEAKICMgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5CiAjICAgQ29tbW9uIFVuaXR0ZXN0IFJvdXRpbmVzIGZvciBDSksgY29kZWNzCiAjCi0jICRDSktDb2RlY3M6IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weSx2IDEuNiAyMDA0LzA2LzE5IDA2OjA5OjU1IHBlcmt5IEV4cCAkCiAKIGltcG9ydCBzeXMsIGNvZGVjcywgb3MucGF0aAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIAotX19jamtjb2RlY3NfXyA9IDAgIyBkZWZpbmUgdGhpcyBhcyAwIGZvciBweXRob24KLQogY2xhc3MgVGVzdEJhc2U6CiAgICAgZW5jb2RpbmcgICAgICAgID0gJycgICAjIGNvZGVjIG5hbWUKICAgICBjb2RlYyAgICAgICAgICAgPSBOb25lICMgY29kZWMgdHVwbGUgKHdpdGggNCBlbGVtZW50cykKQEAgLTIxLDExICsxOCwxNyBAQAogICAgIHJvdW5kdHJpcHRlc3QgICA9IDEgICAgIyBzZXQgaWYgcm91bmR0cmlwIGlzIHBvc3NpYmxlIHdpdGggdW5pY29kZQogICAgIGhhc19pc28xMDY0NiAgICA9IDAgICAgIyBzZXQgaWYgdGhpcyBlbmNvZGluZyBjb250YWlucyB3aG9sZSBpc28xMDY0NiBtYXAKICAgICB4bWxjaGFybmFtZXRlc3QgPSBOb25lICMgc3RyaW5nIHRvIHRlc3QgeG1sY2hhcnJlZnJlcGxhY2UKKyAgICB1bm1hcHBlZHVuaWNvZGUgPSB1J1x1ZGVlZScgIyBhIHVuaWNvZGUgY29kZXBvaW50IHRoYXQgaXMgbm90IG1hcHBlZC4KIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgaWYgc2VsZi5jb2RlYyBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5jb2RlYyA9IGNvZGVjcy5sb29rdXAoc2VsZi5lbmNvZGluZykKLSAgICAgICAgc2VsZi5lbmNvZGUsIHNlbGYuZGVjb2RlLCBzZWxmLnJlYWRlciwgc2VsZi53cml0ZXIgPSBzZWxmLmNvZGVjCisgICAgICAgIHNlbGYuZW5jb2RlID0gc2VsZi5jb2RlYy5lbmNvZGUKKyAgICAgICAgc2VsZi5kZWNvZGUgPSBzZWxmLmNvZGVjLmRlY29kZQorICAgICAgICBzZWxmLnJlYWRlciA9IHNlbGYuY29kZWMuc3RyZWFtcmVhZGVyCisgICAgICAgIHNlbGYud3JpdGVyID0gc2VsZi5jb2RlYy5zdHJlYW13cml0ZXIKKyAgICAgICAgc2VsZi5pbmNyZW1lbnRhbGVuY29kZXIgPSBzZWxmLmNvZGVjLmluY3JlbWVudGFsZW5jb2RlcgorICAgICAgICBzZWxmLmluY3JlbWVudGFsZGVjb2RlciA9IHNlbGYuY29kZWMuaW5jcmVtZW50YWxkZWNvZGVyCiAKICAgICBkZWYgdGVzdF9jaHVua2NvZGluZyhzZWxmKToKICAgICAgICAgZm9yIG5hdGl2ZSwgdXRmOCBpbiB6aXAoKltTdHJpbmdJTyhmKS5yZWFkbGluZXMoKQpAQCAtNDcsNTEgKzUwLDE1NSBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGZ1bmMsIHNvdXJjZSwgc2NoZW1lKQogCi0gICAgaWYgc3lzLmhleHZlcnNpb24gPj0gMHgwMjAzMDAwMDoKLSAgICAgICAgZGVmIHRlc3RfeG1sY2hhcnJlZnJlcGxhY2Uoc2VsZik6Ci0gICAgICAgICAgICBpZiBzZWxmLmhhc19pc28xMDY0NjoKLSAgICAgICAgICAgICAgICByZXR1cm4KKyAgICBkZWYgdGVzdF94bWxjaGFycmVmcmVwbGFjZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNfaXNvMTA2NDY6CisgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICAgICAgcyA9IHUiXHUwYjEzXHUwYjIzXHUwYjYwIG5kIGVnZ3MiCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RlKHMsICJ4bWxjaGFycmVmcmVwbGFjZSIpWzBdLAotICAgICAgICAgICAgICAgICImIzI4MzU7JiMyODUxOyYjMjkxMjsgbmQgZWdncyIKLSAgICAgICAgICAgICkKKyAgICAgICAgcyA9IHUiXHUwYjEzXHUwYjIzXHUwYjYwIG5kIGVnZ3MiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLmVuY29kZShzLCAieG1sY2hhcnJlZnJlcGxhY2UiKVswXSwKKyAgICAgICAgICAgICImIzI4MzU7JiMyODUxOyYjMjkxMjsgbmQgZWdncyIKKyAgICAgICAgKQogCi0gICAgICAgIGRlZiB0ZXN0X2N1c3RvbXJlcGxhY2Uoc2VsZik6Ci0gICAgICAgICAgICBpZiBzZWxmLmhhc19pc28xMDY0NjoKLSAgICAgICAgICAgICAgICByZXR1cm4KKyAgICBkZWYgdGVzdF9jdXN0b21yZXBsYWNlX2VuY29kZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNfaXNvMTA2NDY6CisgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICAgICAgaW1wb3J0IGh0bWxlbnRpdHlkZWZzCisgICAgICAgIGZyb20gaHRtbGVudGl0eWRlZnMgaW1wb3J0IGNvZGVwb2ludDJuYW1lCiAKLSAgICAgICAgICAgIG5hbWVzID0ge30KLSAgICAgICAgICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gaHRtbGVudGl0eWRlZnMuZW50aXR5ZGVmcy5pdGVtcygpOgotICAgICAgICAgICAgICAgIGlmIGxlbih2YWx1ZSk9PTE6Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzW3ZhbHVlLmRlY29kZSgnbGF0aW4tMScpXSA9IHNlbGYuZGVjb2RlKGtleSlbMF0KKyAgICAgICAgZGVmIHhtbGNoYXJuYW1lcmVwbGFjZShleGMpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhjLCBVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICVyIiAlIGV4YykKKyAgICAgICAgICAgIGwgPSBbXQorICAgICAgICAgICAgZm9yIGMgaW4gZXhjLm9iamVjdFtleGMuc3RhcnQ6ZXhjLmVuZF06CisgICAgICAgICAgICAgICAgaWYgb3JkKGMpIGluIGNvZGVwb2ludDJuYW1lOgorICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZCh1IiYlczsiICUgY29kZXBvaW50Mm5hbWVbb3JkKGMpXSkKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBuYW1lc1t1bmljaHIoaW50KHZhbHVlWzI6LTFdKSldID0gc2VsZi5kZWNvZGUoa2V5KVswXQorICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZCh1IiYjJWQ7IiAlIG9yZChjKSkKKyAgICAgICAgICAgIHJldHVybiAodSIiLmpvaW4obCksIGV4Yy5lbmQpCiAKLSAgICAgICAgICAgIGRlZiB4bWxjaGFybmFtZXJlcGxhY2UoZXhjKToKLSAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVFbmNvZGVFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICVyIiAlIGV4YykKLSAgICAgICAgICAgICAgICBsID0gW10KLSAgICAgICAgICAgICAgICBmb3IgYyBpbiBleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXToKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgbC5hcHBlbmQodSImJXM7IiAlIG5hbWVzW2NdKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZCh1IiYjJWQ7IiAlIG9yZChjKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKHUiIi5qb2luKGwpLCBleGMuZW5kKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QueG1sY2hhcm5hbWVyZXBsYWNlIiwgeG1sY2hhcm5hbWVyZXBsYWNlKQogCi0gICAgICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoCi0gICAgICAgICAgICAgICAgInRlc3QueG1sY2hhcm5hbWVyZXBsYWNlIiwgeG1sY2hhcm5hbWVyZXBsYWNlKQorICAgICAgICBpZiBzZWxmLnhtbGNoYXJuYW1ldGVzdDoKKyAgICAgICAgICAgIHNpbiwgc291dCA9IHNlbGYueG1sY2hhcm5hbWV0ZXN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaW4gPSB1Ilx4YWJcdTIxMWNceGJiID0gXHUyMzI5XHUxMjM0XHUyMzJhIgorICAgICAgICAgICAgc291dCA9ICImbGFxdW87JnJlYWw7JnJhcXVvOyA9ICZsYW5nOyYjNDY2MDsmcmFuZzsiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmNvZGUoc2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QueG1sY2hhcm5hbWVyZXBsYWNlIilbMF0sIHNvdXQpCiAKLSAgICAgICAgICAgIGlmIHNlbGYueG1sY2hhcm5hbWV0ZXN0OgotICAgICAgICAgICAgICAgIHNpbiwgc291dCA9IHNlbGYueG1sY2hhcm5hbWV0ZXN0CisgICAgZGVmIHRlc3RfY2FsbGJhY2tfd3Jvbmdfb2JqZWN0cyhzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuIChyZXQsIGV4Yy5lbmQpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorCisgICAgICAgIGZvciByZXQgaW4gKFsxLCAyLCAzXSwgW10sIE5vbmUsIG9iamVjdCgpLCAnc3RyaW5nJywgJycpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmVuY29kZSwgc2VsZi51bm1hcHBlZHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JykKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2xvbmdfaW5kZXgoc2VsZik6CisgICAgICAgIGRlZiBteXJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAodSd4JywgbG9uZyhleGMuZW5kKSkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmNvZGUodSdhYmNkJyArIHNlbGYudW5tYXBwZWR1bmljb2RlICsgdSdlZmdoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JyksICgnYWJjZHhlZmdoJywgOSkpCisKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1J3gnLCBzeXMubWF4aW50ICsgMSkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHNlbGYuZW5jb2RlLCBzZWxmLnVubWFwcGVkdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19Ob25lX2luZGV4KHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUneCcsIE5vbmUpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZW5jb2RlLCBzZWxmLnVubWFwcGVkdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19iYWNrd2FyZF9pbmRleChzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgaWYgbXlyZXBsYWNlLmxpbWl0ID4gMDoKKyAgICAgICAgICAgICAgICBteXJlcGxhY2UubGltaXQgLT0gMQorICAgICAgICAgICAgICAgIHJldHVybiAodSdSRVBMQUNFRCcsIDApCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNpbiA9IHUiXHhhYlx1MjExY1x4YmIgPSBcdTIzMjlcdTEyMzRcdTIzMmEiCi0gICAgICAgICAgICAgICAgc291dCA9ICImbGFxdW87JnJlYWw7JnJhcXVvOyA9ICZsYW5nOyYjNDY2MDsmcmFuZzsiCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5jb2RlKHNpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdC54bWxjaGFybmFtZXJlcGxhY2UiKVswXSwgc291dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHUnVEVSTUlOQUwnLCBleGMuZW5kKQorICAgICAgICBteXJlcGxhY2UubGltaXQgPSAzCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5jb2RlKHUnYWJjZCcgKyBzZWxmLnVubWFwcGVkdW5pY29kZSArIHUnZWZnaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpLAorICAgICAgICAgICAgICAgICgnYWJjZFJFUExBQ0VEYWJjZFJFUExBQ0VEYWJjZFJFUExBQ0VEYWJjZFRFUk1JTkFMZWZnaCcsIDkpKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfZm9yd2FyZF9pbmRleChzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1J1JFUExBQ0VEJywgZXhjLmVuZCArIDIpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5jb2RlKHUnYWJjZCcgKyBzZWxmLnVubWFwcGVkdW5pY29kZSArIHUnZWZnaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpLCAoJ2FiY2RSRVBMQUNFRGdoJywgOSkpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19pbmRleF9vdXRvZmJvdW5kKHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUnVEVSTScsIDEwMCkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHNlbGYuZW5jb2RlLCBzZWxmLnVubWFwcGVkdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbGVuY29kZXIoc2VsZik6CisgICAgICAgIFVURjhSZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCisgICAgICAgIGZvciBzaXplaGludCBpbiBbTm9uZV0gKyByYW5nZSgxLCAzMykgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICBbNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjRdOgorICAgICAgICAgICAgaXN0cmVhbSA9IFVURjhSZWFkZXIoU3RyaW5nSU8oc2VsZi50c3RyaW5nWzFdKSkKKyAgICAgICAgICAgIG9zdHJlYW0gPSBTdHJpbmdJTygpCisgICAgICAgICAgICBlbmNvZGVyID0gc2VsZi5pbmNyZW1lbnRhbGVuY29kZXIoKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBpZiBzaXplaGludCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGlzdHJlYW0ucmVhZChzaXplaGludCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gaXN0cmVhbS5yZWFkKCkKKworICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGUgPSBlbmNvZGVyLmVuY29kZShkYXRhKQorICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUoZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvc3RyZWFtLmdldHZhbHVlKCksIHNlbGYudHN0cmluZ1swXSkKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsZGVjb2RlcihzZWxmKToKKyAgICAgICAgVVRGOFdyaXRlciA9IGNvZGVjcy5nZXR3cml0ZXIoJ3V0Zi04JykKKyAgICAgICAgZm9yIHNpemVoaW50IGluIFtOb25lLCAtMV0gKyByYW5nZSgxLCAzMykgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICBbNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjRdOgorICAgICAgICAgICAgaXN0cmVhbSA9IFN0cmluZ0lPKHNlbGYudHN0cmluZ1swXSkKKyAgICAgICAgICAgIG9zdHJlYW0gPSBVVEY4V3JpdGVyKFN0cmluZ0lPKCkpCisgICAgICAgICAgICBkZWNvZGVyID0gc2VsZi5pbmNyZW1lbnRhbGRlY29kZXIoKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBkYXRhID0gaXN0cmVhbS5yZWFkKHNpemVoaW50KQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHUgPSBkZWNvZGVyLmRlY29kZShkYXRhKQorICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKHUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3N0cmVhbS5nZXR2YWx1ZSgpLCBzZWxmLnRzdHJpbmdbMV0pCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbGVuY29kZXJfZXJyb3JfY2FsbGJhY2soc2VsZik6CisgICAgICAgIGludiA9IHNlbGYudW5tYXBwZWR1bmljb2RlCisKKyAgICAgICAgZSA9IHNlbGYuaW5jcmVtZW50YWxlbmNvZGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBlLmVuY29kZSwgaW52LCBUcnVlKQorCisgICAgICAgIGUuZXJyb3JzID0gJ2lnbm9yZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmVuY29kZShpbnYsIFRydWUpLCAnJykKKworICAgICAgICBlLnJlc2V0KCkKKyAgICAgICAgZGVmIHRlbXByZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUnY2FsbGVkJywgZXhjLmVuZCkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCd0ZXN0LmluY3JlbWVudGFsX2Vycm9yX2NhbGxiYWNrJywgdGVtcHJlcGxhY2UpCisgICAgICAgIGUuZXJyb3JzID0gJ3Rlc3QuaW5jcmVtZW50YWxfZXJyb3JfY2FsbGJhY2snCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lbmNvZGUoaW52LCBUcnVlKSwgJ2NhbGxlZCcpCisKKyAgICAgICAgIyBhZ2FpbgorICAgICAgICBlLmVycm9ycyA9ICdpZ25vcmUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lbmNvZGUoaW52LCBUcnVlKSwgJycpCiAKICAgICBkZWYgdGVzdF9zdHJlYW1yZWFkZXIoc2VsZik6CiAgICAgICAgIFVURjhXcml0ZXIgPSBjb2RlY3MuZ2V0d3JpdGVyKCd1dGYtOCcpCkBAIC0xMTMsMTEgKzIyMCw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvc3RyZWFtLmdldHZhbHVlKCksIHNlbGYudHN0cmluZ1sxXSkKIAogICAgIGRlZiB0ZXN0X3N0cmVhbXdyaXRlcihzZWxmKToKLSAgICAgICAgaWYgX19jamtjb2RlY3NfXzoKLSAgICAgICAgICAgIHJlYWRmdW5jcyA9ICgncmVhZCcsICdyZWFkbGluZScsICdyZWFkbGluZXMnKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBzdGFuZGFyZCB1dGY4IGNvZGVjIGhhcyBicm9rZW4gcmVhZGxpbmUgYW5kIHJlYWRsaW5lcy4KLSAgICAgICAgICAgIHJlYWRmdW5jcyA9ICgncmVhZCcsKQorICAgICAgICByZWFkZnVuY3MgPSAoJ3JlYWQnLCAncmVhZGxpbmUnLCAncmVhZGxpbmVzJykKICAgICAgICAgVVRGOFJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKICAgICAgICAgZm9yIG5hbWUgaW4gcmVhZGZ1bmNzOgogICAgICAgICAgICAgZm9yIHNpemVoaW50IGluIFtOb25lXSArIHJhbmdlKDEsIDMzKSArIFwKQEAgLTIxMSwxMCArMzE0LDUgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShjc2V0Y2gsIHNlbGYuZW5jb2RpbmcpLCB1bmljaCkKIAogZGVmIGxvYWRfdGVzdHN0cmluZyhlbmNvZGluZyk6Ci0gICAgaWYgX19jamtjb2RlY3NfXzoKLSAgICAgICAgZXR4dCA9IG9wZW4ob3MucGF0aC5qb2luKCdzYW1wbGV0ZXh0cycsIGVuY29kaW5nKSArICcudHh0JykucmVhZCgpCi0gICAgICAgIHV0eHQgPSBvcGVuKG9zLnBhdGguam9pbignc2FtcGxldGV4dHMnLCBlbmNvZGluZykgKyAnLnV0ZjgnKS5yZWFkKCkKLSAgICAgICAgcmV0dXJuIChldHh0LCB1dHh0KQotICAgIGVsc2U6Ci0gICAgICAgIGZyb20gdGVzdCBpbXBvcnQgY2prZW5jb2RpbmdzX3Rlc3QKLSAgICAgICAgcmV0dXJuIGNqa2VuY29kaW5nc190ZXN0LnRlc3RzdHJpbmdbZW5jb2RpbmddCisgICAgZnJvbSB0ZXN0IGltcG9ydCBjamtlbmNvZGluZ3NfdGVzdAorICAgIHJldHVybiBjamtlbmNvZGluZ3NfdGVzdC50ZXN0c3RyaW5nW2VuY29kaW5nXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKaW5kZXggY2Y4M2Q3NS4uZjY1NmI5ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CkBAIC0xMzgyLDggKzEzODIsMTUgQEAKIAogY2xhc3MgVGVzdEhlbHAoQmFzZVRlc3QpOgogICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5vcmlnX2NvbHVtbnMgPSBvcy5lbnZpcm9uLmdldCgnQ09MVU1OUycpCiAgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5tYWtlX3BhcnNlcig4MCkKIAorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vcmlnX2NvbHVtbnMgaXMgTm9uZToKKyAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uWydDT0xVTU5TJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9zLmVudmlyb25bJ0NPTFVNTlMnXSA9IHNlbGYub3JpZ19jb2x1bW5zCisKICAgICBkZWYgbWFrZV9wYXJzZXIoc2VsZiwgY29sdW1ucyk6CiAgICAgICAgIG9wdGlvbnMgPSBbCiAgICAgICAgICAgICBtYWtlX29wdGlvbigiLWEiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSdhJywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKaW5kZXggNzcxZmU5ZC4uOGFhMTY1NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKQEAgLTUxLDYgKzUxLDEwIEBACiAgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiWzEsIDIsIDNdIikKICAgICAgICAgc2VsZi5jaGVja19leHByKCJbeCoqMyBmb3IgeCBpbiByYW5nZSgyMCldIikKICAgICAgICAgc2VsZi5jaGVja19leHByKCJbeCoqMyBmb3IgeCBpbiByYW5nZSgyMCkgaWYgeCAlIDNdIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJbeCoqMyBmb3IgeCBpbiByYW5nZSgyMCkgaWYgeCAlIDIgaWYgeCAlIDNdIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsaXN0KHgqKjMgZm9yIHggaW4gcmFuZ2UoMjApKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGlzdCh4KiozIGZvciB4IGluIHJhbmdlKDIwKSBpZiB4ICUgMykiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxpc3QoeCoqMyBmb3IgeCBpbiByYW5nZSgyMCkgaWYgeCAlIDIgaWYgeCAlIDMpIikKICAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oKmFyZ3MpIikKICAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oKmFyZ3MsICoqa3cpIikKICAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oKiprdykiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weSBiL0xpYi90ZXN0L3Rlc3RfcGxhdGZvcm0ucHkKaW5kZXggMjAwZmJhNS4uMjIzMDdjZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BsYXRmb3JtLnB5CkBAIC02Myw3ICs2MywxMiBAQAogICAgICAgICByZXMgPSBwbGF0Zm9ybS5kaXN0KCkKIAogICAgIGRlZiB0ZXN0X2xpYmNfdmVyKHNlbGYpOgotICAgICAgICByZXMgPSBwbGF0Zm9ybS5saWJjX3ZlcigpCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBleGVjdXRhYmxlCisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGV4ZWN1dGFibGUpIGFuZCBvcy5wYXRoLmV4aXN0cyhleGVjdXRhYmxlKycuZXhlJyk6CisgICAgICAgICAgICAjIEN5Z3dpbiBob3Jyb3IKKyAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBleGVjdXRhYmxlICsgJy5leGUnCisgICAgICAgIHJlcyA9IHBsYXRmb3JtLmxpYmNfdmVyKGV4ZWN1dGFibGUpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkgYi9MaWIvdGVzdC90ZXN0X3BvcGVuMi5weQppbmRleCAxODE0MmVjLi40ZGIzY2QxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BvcGVuMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BvcGVuMi5weQpAQCAtMzUsNiArMzUsOSBAQAogICAgICMgc2FtZSB0ZXN0IGFzIHBvcGVuMi5fdGVzdCgpLCBidXQgdXNpbmcgdGhlIG9zLnBvcGVuKigpIEFQSQogICAgIHByaW50ICJUZXN0aW5nIG9zIG1vZHVsZToiCiAgICAgaW1wb3J0IHBvcGVuMgorICAgICMgV2hlbiB0aGUgdGVzdCBydW5zLCB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IG9wZW4gcGlwZXMKKyAgICBwb3BlbjIuX2NsZWFudXAoKQorICAgIGFzc2VydCBub3QgcG9wZW4yLl9hY3RpdmUsICJBY3RpdmUgcGlwZXMgd2hlbiB0ZXN0IHN0YXJ0cyAiICsgcmVwcihbYy5jbWQgZm9yIGMgaW4gcG9wZW4yLl9hY3RpdmVdKQogICAgIGNtZCAgPSAiY2F0IgogICAgIHRlc3RzdHIgPSAiYWIgY2RcbiIKICAgICBpZiBvcy5uYW1lID09ICJudCI6CkBAIC02NSw2ICs2OCw3IEBACiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZXhwZWN0ZWQgJXIgb24gc3RkZXJyIiAlIChnb3QsKSkKICAgICBmb3IgaW5zdCBpbiBwb3BlbjIuX2FjdGl2ZVs6XToKICAgICAgICAgaW5zdC53YWl0KCkKKyAgICBwb3BlbjIuX2NsZWFudXAoKQogICAgIGlmIHBvcGVuMi5fYWN0aXZlOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJfYWN0aXZlIG5vdCBlbXB0eSIpCiAgICAgcHJpbnQgIkFsbCBPSyIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CmluZGV4IDFjY2M2MmIuLmY5OGM3MjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQpAQCAtNzMsNiArNzMsMTEgQEAKICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQogCisgICAgZGVmIHRlc3RfY29uZnN0cihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2NvbmZzdHInKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvc2l4LmNvbmZzdHIsICJDU19nYXJiYWdlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBvc2l4LmNvbmZzdHIoIkNTX1BBVEgiKSkgPiAwLCBUcnVlKQorCiAgICAgZGVmIHRlc3RfZHVwMihzZWxmKToKICAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2R1cDInKToKICAgICAgICAgICAgIGZwMSA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHR5LnB5IGIvTGliL3Rlc3QvdGVzdF9wdHkucHkKaW5kZXggZjhhZTQ3OS4uOTllMDFiNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wdHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wdHkucHkKQEAgLTE4LDYgKzE4LDI3IEBACiAgICAgZGVmIGRlYnVnKG1zZyk6CiAgICAgICAgIHBhc3MKIAorZGVmIG5vcm1hbGl6ZV9vdXRwdXQoZGF0YSk6CisgICAgIyBTb21lIG9wZXJhdGluZyBzeXN0ZW1zIGRvIGNvbnZlcnNpb25zIG9uIG5ld2xpbmUuICBXZSBjb3VsZCBwb3NzaWJseQorICAgICMgZml4IHRoYXQgYnkgZG9pbmcgdGhlIGFwcHJvcHJpYXRlIHRlcm1pb3MudGNzZXRhdHRyKClzLiAgSSBjb3VsZG4ndAorICAgICMgZmlndXJlIG91dCB0aGUgcmlnaHQgY29tYm8gb24gVHJ1NjQgYW5kIEkgZG9uJ3QgaGF2ZSBhbiBJUklYIGJveC4KKyAgICAjIFNvIGp1c3Qgbm9ybWFsaXplIHRoZSBvdXRwdXQgYW5kIGRvYyB0aGUgcHJvYmxlbSBPL1NlcyBieSBhbGxvd2luZworICAgICMgY2VydGFpbiBjb21iaW5hdGlvbnMgZm9yIHNvbWUgcGxhdGZvcm1zLCBidXQgYXZvaWQgYWxsb3dpbmcgb3RoZXIKKyAgICAjIGRpZmZlcmVuY2VzIChsaWtlIGV4dHJhIHdoaXRlc3BhY2UsIHRyYWlsaW5nIGdhcmJhZ2UsIGV0Yy4pCisKKyAgICAjIFRoaXMgaXMgYWJvdXQgdGhlIGJlc3Qgd2UgY2FuIGRvIHdpdGhvdXQgZ2V0dGluZyBzb21lIGZlZWRiYWNrCisgICAgIyBmcm9tIHNvbWVvbmUgbW9yZSBrbm93bGVkZ2FibGUuCisKKyAgICAjIE9TRi8xIChUcnU2NCkgYXBwYXJlbnRseSB0dXJucyBcbiBpbnRvIFxyXHJcbi4KKyAgICBpZiBkYXRhLmVuZHN3aXRoKCdcclxyXG4nKToKKyAgICAgICAgcmV0dXJuIGRhdGFbOi0zXSArICdcbicKKworICAgICMgSVJJWCBhcHBhcmVudGx5IHR1cm5zIFxuIGludG8gXHJcbi4KKyAgICBpZiBkYXRhLmVuZHN3aXRoKCdcclxuJyk6CisgICAgICAgIHJldHVybiBkYXRhWzotMl0gKyAnXG4nCisKKyAgICByZXR1cm4gZGF0YQorCiAjIE1hcmdpbmFsIHRlc3Rpbmcgb2YgcHR5IHN1aXRlLiBDYW5ub3QgZG8gZXh0ZW5zaXZlICdkbyBvciBmYWlsJyB0ZXN0aW5nCiAjIGJlY2F1c2UgcHR5IGNvZGUgaXMgbm90IHRvbyBwb3J0YWJsZS4KIApAQCAtMzYsMTkgKzU3LDE2IEBACiAgICAgaWYgbm90IG9zLmlzYXR0eShzbGF2ZV9mZCkgYW5kIHN5cy5wbGF0Zm9ybSBub3QgaW4gZmlja2xlX2lzYXR0eToKICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgInNsYXZlX2ZkIGlzIG5vdCBhIHR0eSIKIAotICAgICMgSVJJWCBhcHBhcmVudGx5IHR1cm5zIFxuIGludG8gXHJcbi4gQWxsb3cgdGhhdCwgYnV0IGF2b2lkIGFsbG93aW5nIG90aGVyCi0gICAgIyBkaWZmZXJlbmNlcyAobGlrZSBleHRyYSB3aGl0ZXNwYWNlLCB0cmFpbGluZyBnYXJiYWdlLCBldGMuKQotCiAgICAgZGVidWcoIldyaXRpbmcgdG8gc2xhdmVfZmQiKQogICAgIG9zLndyaXRlKHNsYXZlX2ZkLCBURVNUX1NUUklOR18xKQogICAgIHMxID0gb3MucmVhZChtYXN0ZXJfZmQsIDEwMjQpCi0gICAgc3lzLnN0ZG91dC53cml0ZShzMS5yZXBsYWNlKCJcclxuIiwgIlxuIikpCisgICAgc3lzLnN0ZG91dC53cml0ZShub3JtYWxpemVfb3V0cHV0KHMxKSkKIAogICAgIGRlYnVnKCJXcml0aW5nIGNodW5rZWQgb3V0cHV0IikKICAgICBvcy53cml0ZShzbGF2ZV9mZCwgVEVTVF9TVFJJTkdfMls6NV0pCiAgICAgb3Mud3JpdGUoc2xhdmVfZmQsIFRFU1RfU1RSSU5HXzJbNTpdKQogICAgIHMyID0gb3MucmVhZChtYXN0ZXJfZmQsIDEwMjQpCi0gICAgc3lzLnN0ZG91dC53cml0ZShzMi5yZXBsYWNlKCJcclxuIiwgIlxuIikpCisgICAgc3lzLnN0ZG91dC53cml0ZShub3JtYWxpemVfb3V0cHV0KHMyKSkKIAogICAgIG9zLmNsb3NlKHNsYXZlX2ZkKQogICAgIG9zLmNsb3NlKG1hc3Rlcl9mZCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5IGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKaW5kZXggMGViN2Q5MC4uMjQxMGIwMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKQEAgLTk3LDYgKzk3LDkgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShweV9pdGVtLCAoRnVuY3Rpb25UeXBlLCBCdWlsdGluRnVuY3Rpb25UeXBlKSkpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHB5X2l0ZW0sIChDbGFzc1R5cGUsIHR5cGUpKSkKKyAgICAgICAgICAgICAgICBpZiBweV9pdGVtLl9fbW9kdWxlX18gIT0gbW9kdWxlTmFtZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAjIHNraXAgY2xhc3NlcyB0aGF0IGNhbWUgZnJvbSBzb21ld2hlcmUgZWxzZQorCiAgICAgICAgICAgICAgICAgcmVhbF9iYXNlcyA9IFtiYXNlLl9fbmFtZV9fIGZvciBiYXNlIGluIHB5X2l0ZW0uX19iYXNlc19fXQogICAgICAgICAgICAgICAgIHB5Y2xicl9iYXNlcyA9IFsgZ2V0YXR0cihiYXNlLCAnbmFtZScsIGJhc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYmFzZSBpbiB2YWx1ZS5zdXBlciBdCkBAIC0xNzIsNyArMTc1LDcgQEAKICAgICAgICAgY20oJ3B5ZG9jJykKIAogICAgICAgICAjIFRlc3RzIGZvciBtb2R1bGVzIGluc2lkZSBwYWNrYWdlcwotICAgICAgICBjbSgnZW1haWwuUGFyc2VyJykKKyAgICAgICAgY20oJ2VtYWlsLnBhcnNlcicpCiAgICAgICAgIGNtKCd0ZXN0LnRlc3RfcHljbGJyJykKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9xdWV1ZS5weQppbmRleCBiNTVkZDAxLi42Njk3N2U2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcXVldWUucHkKQEAgLTIyMSw3ICsyMjEsNTEgQEAKICAgICBfZG9CbG9ja2luZ1Rlc3QocS5nZXQsICgpLCBxLnB1dCwgKCdlbXB0eScsKSkKICAgICBfZG9CbG9ja2luZ1Rlc3QocS5nZXQsIChUcnVlLCAxMCksIHEucHV0LCAoJ2VtcHR5JywpKQogCitjdW0gPSAwCitjdW1sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorCitkZWYgd29ya2VyKHEpOgorICAgIGdsb2JhbCBjdW0KKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB4ID0gcS5nZXQoKQorICAgICAgICBpZiB4IGlzIE5vbmU6CisgICAgICAgICAgICBxLnRhc2tfZG9uZSgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY3VtbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VtICs9IHgKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGN1bWxvY2sucmVsZWFzZSgpCisgICAgICAgIHEudGFza19kb25lKCkKKworZGVmIFF1ZXVlSm9pblRlc3QocSk6CisgICAgZ2xvYmFsIGN1bQorICAgIGN1bSA9IDAKKyAgICBmb3IgaSBpbiAoMCwxKToKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9d29ya2VyLCBhcmdzPShxLCkpLnN0YXJ0KCkKKyAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgcS5wdXQoaSkKKyAgICBxLmpvaW4oKQorICAgIHZlcmlmeShjdW09PXN1bShyYW5nZSgxMDApKSwgInEuam9pbigpIGRpZCBub3QgYmxvY2sgdW50aWwgYWxsIHRhc2tzIHdlcmUgZG9uZSIpCisgICAgZm9yIGkgaW4gKDAsMSk6CisgICAgICAgIHEucHV0KE5vbmUpICAgICAgICAgIyBpbnN0cnVjdCB0aGUgdGhyZWFkcyB0byBjbG9zZQorICAgIHEuam9pbigpICAgICAgICAgICAgICAgICMgdmVyaWZ5IHRoYXQgeW91IGNhbiBqb2luIHR3aWNlCisKK2RlZiBRdWV1ZVRhc2tEb25lVGVzdChxKToKKyAgICB0cnk6CisgICAgICAgIHEudGFza19kb25lKCkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIkRpZCBub3QgZGV0ZWN0IHRhc2sgY291bnQgZ29pbmcgbmVnYXRpdmUiKQorCiBkZWYgdGVzdCgpOgorICAgIHEgPSBRdWV1ZS5RdWV1ZSgpCisgICAgUXVldWVUYXNrRG9uZVRlc3QocSkKKyAgICBRdWV1ZUpvaW5UZXN0KHEpCisgICAgUXVldWVKb2luVGVzdChxKQorICAgIFF1ZXVlVGFza0RvbmVUZXN0KHEpCisKICAgICBxID0gUXVldWUuUXVldWUoUVVFVUVfU0laRSkKICAgICAjIERvIGl0IGEgY291cGxlIG9mIHRpbWVzIG9uIHRoZSBzYW1lIHF1ZXVlCiAgICAgU2ltcGxlUXVldWVUZXN0KHEpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3F1b3ByaS5weSBiL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CmluZGV4IGVkNjZkZmMuLjYzMWM5NzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CkBAIC0xLDcgKzEsNyBAQAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCi1pbXBvcnQgc3lzLCBvcywgY1N0cmluZ0lPCitpbXBvcnQgc3lzLCBvcywgY1N0cmluZ0lPLCBzdWJwcm9jZXNzCiBpbXBvcnQgcXVvcHJpCiAKIApAQCAtMTc2LDE3ICsxNzYsMjAgQEAKIAogICAgIGRlZiB0ZXN0X3NjcmlwdGVuY29kZShzZWxmKToKICAgICAgICAgKHAsIGUpID0gc2VsZi5TVFJJTkdTWy0xXQotICAgICAgICAoY2luLCBjb3V0KSA9IG9zLnBvcGVuMigiJXMgLW1xdW9wcmkiICUgc3lzLmV4ZWN1dGFibGUpCi0gICAgICAgIGNpbi53cml0ZShwKQotICAgICAgICBjaW4uY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8oY291dC5yZWFkKCkgPT0gZSkKKyAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLW1xdW9wcmkiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBjb3V0LCBjZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZShwKQorICAgICAgICAjIE9uIFdpbmRvd3MsIFB5dGhvbiB3aWxsIG91dHB1dCB0aGUgcmVzdWx0IHRvIHN0ZG91dCB1c2luZworICAgICAgICAjIENSTEYsIGFzIHRoZSBtb2RlIG9mIHN0ZG91dCBpcyB0ZXh0IG1vZGUuIFRvIGNvbXBhcmUgdGhpcworICAgICAgICAjIHdpdGggdGhlIGV4cGVjdGVkIHJlc3VsdCwgd2UgbmVlZCB0byBkbyBhIGxpbmUtYnktbGluZSBjb21wYXJpc29uLgorICAgICAgICBzZWxmLmFzc2VydF8oY291dC5zcGxpdGxpbmVzKCkgPT0gZS5zcGxpdGxpbmVzKCkpCiAKICAgICBkZWYgdGVzdF9zY3JpcHRkZWNvZGUoc2VsZik6CiAgICAgICAgIChwLCBlKSA9IHNlbGYuU1RSSU5HU1stMV0KLSAgICAgICAgKGNpbiwgY291dCkgPSBvcy5wb3BlbjIoIiVzIC1tcXVvcHJpIC1kIiAlIHN5cy5leGVjdXRhYmxlKQotICAgICAgICBjaW4ud3JpdGUoZSkKLSAgICAgICAgY2luLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvdXQucmVhZCgpID09IHApCisgICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1tcXVvcHJpIiwgIi1kIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgY291dCwgY2VyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNvdXQuc3BsaXRsaW5lcygpID09IHAuc3BsaXRsaW5lcygpKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChRdW9wcmlUZXN0Q2FzZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmFuZG9tLnB5IGIvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKaW5kZXggOWMyZTBkMC4uYmJhNGM3YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKQEAgLTkzLDEwICs5MywyOSBAQAogICAgICAgICBzZWxmLmdlbi5zYW1wbGUoc2V0KHJhbmdlKDIwKSksIDIpCiAgICAgICAgIHNlbGYuZ2VuLnNhbXBsZShyYW5nZSgyMCksIDIpCiAgICAgICAgIHNlbGYuZ2VuLnNhbXBsZSh4cmFuZ2UoMjApLCAyKQotICAgICAgICBzZWxmLmdlbi5zYW1wbGUoZGljdC5mcm9ta2V5cygnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSwgMikKICAgICAgICAgc2VsZi5nZW4uc2FtcGxlKHN0cignYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSwgMikKICAgICAgICAgc2VsZi5nZW4uc2FtcGxlKHR1cGxlKCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpLCAyKQogCisgICAgZGVmIHRlc3Rfc2FtcGxlX29uX2RpY3RzKHNlbGYpOgorICAgICAgICBzZWxmLmdlbi5zYW1wbGUoZGljdC5mcm9ta2V5cygnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSwgMikKKworICAgICAgICAjIFNGIGJ1ZyAjMTQ2MDM0MCAtLSByYW5kb20uc2FtcGxlIGNhbiByYWlzZSBLZXlFcnJvcgorICAgICAgICBhID0gZGljdC5mcm9ta2V5cyhyYW5nZSgxMCkrcmFuZ2UoMTAsMTAwLDIpK3JhbmdlKDEwMCwxMTApKQorICAgICAgICBzZWxmLmdlbi5zYW1wbGUoYSwgMykKKworICAgICAgICAjIEEgZm9sbG93dXAgdG8gYnVnICMxNDYwMzQwOiAgc2FtcGxpbmcgZnJvbSBhIGRpY3QgY291bGQgcmV0dXJuCisgICAgICAgICMgYSBzdWJzZXQgb2YgaXRzIGtleXMgb3Igb2YgaXRzIHZhbHVlcywgZGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mCisgICAgICAgICMgdGhlIHN1YnNldCByZXF1ZXN0ZWQuCisgICAgICAgIE4gPSAzMAorICAgICAgICBkID0gZGljdCgoaSwgY29tcGxleChpLCBpKSkgZm9yIGkgaW4geHJhbmdlKE4pKQorICAgICAgICBmb3IgayBpbiB4cmFuZ2UoTisxKToKKyAgICAgICAgICAgIHNhbXAgPSBzZWxmLmdlbi5zYW1wbGUoZCwgaykKKyAgICAgICAgICAgICMgVmVyaWZ5IHRoYXQgd2UgZ290IGludHMgYmFjayAoa2V5cyk7IHRoZSB2YWx1ZXMgYXJlIGNvbXBsZXguCisgICAgICAgICAgICBmb3IgeCBpbiBzYW1wOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHgpIGlzIGludCkKKyAgICAgICAgc2FtcC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYW1wLCByYW5nZShOKSkKKwogICAgIGRlZiB0ZXN0X2dhdXNzKHNlbGYpOgogICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBzZWVkKCkgbWV0aG9kIGluaXRpYWxpemVzIGFsbCB0aGUgaGlkZGVuIHN0YXRlLiAgSW4KICAgICAgICAgIyBwYXJ0aWN1bGFyLCB0aHJvdWdoIDIuMi4xIGl0IGZhaWxlZCB0byByZXNldCBhIHBpZWNlIG9mIHN0YXRlIHVzZWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmVnZXgucHkgYi9MaWIvdGVzdC90ZXN0X3JlZ2V4LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTJjOGY2Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L3Rlc3RfcmVnZXgucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgc29ydGRpY3QKLWltcG9ydCB3YXJuaW5ncwotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0aGUgcmVnZXggbW9kdWxlIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBfX25hbWVfXykKLWltcG9ydCByZWdleAotZnJvbSByZWdleF9zeW50YXggaW1wb3J0ICoKLQotcmUgPSAnYStiK2MrJwotcHJpbnQgJ25vIG1hdGNoOicsIHJlZ2V4Lm1hdGNoKHJlLCAnaGVsbG8gYWFhYWJjY2NjIHdvcmxkJykKLXByaW50ICdzdWNjZXNzZnVsIHNlYXJjaDonLCByZWdleC5zZWFyY2gocmUsICdoZWxsbyBhYWFhYmNjY2Mgd29ybGQnKQotdHJ5OgotICAgIGNyZSA9IHJlZ2V4LmNvbXBpbGUoJ1woJyArIHJlKQotZXhjZXB0IHJlZ2V4LmVycm9yOgotICAgIHByaW50ICdjYXVnaHQgZXhwZWN0ZWQgZXhjZXB0aW9uJwotZWxzZToKLSAgICBwcmludCAnZXhwZWN0ZWQgcmVnZXguZXJyb3Igbm90IHJhaXNlZCcKLQotcHJpbnQgJ2ZhaWxlZCBhd2sgc3ludGF4OicsIHJlZ2V4LnNlYXJjaCgnKGErKXwoYispJywgJ2NkYicpCi1wcmV2ID0gcmVnZXguc2V0X3N5bnRheChSRV9TWU5UQVhfQVdLKQotcHJpbnQgJ3N1Y2Nlc3NmdWwgYXdrIHN5bnRheDonLCByZWdleC5zZWFyY2goJyhhKyl8KGIrKScsICdjZGInKQotcmVnZXguc2V0X3N5bnRheChwcmV2KQotcHJpbnQgJ2ZhaWxlZCBhd2sgc3ludGF4OicsIHJlZ2V4LnNlYXJjaCgnKGErKXwoYispJywgJ2NkYicpCi0KLXJlID0gJ1woPG9uZT5bMC05XStcKSAqXCg8dHdvPlswLTldK1wpJwotcHJpbnQgJ21hdGNoaW5nIHdpdGggZ3JvdXAgbmFtZXMgYW5kIGNvbXBpbGUoKScKLWNyZSA9IHJlZ2V4LmNvbXBpbGUocmUpCi1wcmludCBjcmUubWF0Y2goJzgwMSA5OTknKQotdHJ5OgotICAgIHByaW50IGNyZS5ncm91cCgnb25lJykKLWV4Y2VwdCByZWdleC5lcnJvcjoKLSAgICBwcmludCAnY2F1Z2h0IGV4cGVjdGVkIGV4Y2VwdGlvbicKLWVsc2U6Ci0gICAgcHJpbnQgJ2V4cGVjdGVkIHJlZ2V4LmVycm9yIG5vdCByYWlzZWQnCi0KLXByaW50ICdtYXRjaGluZyB3aXRoIGdyb3VwIG5hbWVzIGFuZCBzeW1jb21wKCknCi1jcmUgPSByZWdleC5zeW1jb21wKHJlKQotcHJpbnQgY3JlLm1hdGNoKCc4MDEgOTk5JykKLXByaW50IGNyZS5ncm91cCgwKQotcHJpbnQgY3JlLmdyb3VwKCdvbmUnKQotcHJpbnQgY3JlLmdyb3VwKDEsIDIpCi1wcmludCBjcmUuZ3JvdXAoJ29uZScsICd0d28nKQotcHJpbnQgJ3JlYWxwYXQ6JywgY3JlLnJlYWxwYXQKLXByaW50ICdncm91cGluZGV4OicsIHNvcnRkaWN0KGNyZS5ncm91cGluZGV4KQotCi1yZSA9ICd3b3JsZCcKLWNyZSA9IHJlZ2V4LmNvbXBpbGUocmUpCi1wcmludCAnbm90IGNhc2UgZm9sZGVkIHNlYXJjaDonLCBjcmUuc2VhcmNoKCdIRUxMTyBXT1JMRCcpCi1jcmUgPSByZWdleC5jb21waWxlKHJlLCByZWdleC5jYXNlZm9sZCkKLXByaW50ICdjYXNlIGZvbGRlZCBzZWFyY2g6JywgY3JlLnNlYXJjaCgnSEVMTE8gV09STEQnKQotCi1wcmludCAnX19tZW1iZXJzX186JywgY3JlLl9fbWVtYmVyc19fCi1wcmludCAncmVnczonLCBjcmUucmVncwotcHJpbnQgJ2xhc3Q6JywgY3JlLmxhc3QKLXByaW50ICd0cmFuc2xhdGU6JywgbGVuKGNyZS50cmFuc2xhdGUpCi1wcmludCAnZ2l2ZW5wYXQ6JywgY3JlLmdpdmVucGF0Ci0KLXByaW50ICdtYXRjaCB3aXRoIHBvczonLCBjcmUubWF0Y2goJ2hlbGxvIHdvcmxkJywgNykKLXByaW50ICdzZWFyY2ggd2l0aCBwb3M6JywgY3JlLnNlYXJjaCgnaGVsbG8gd29ybGQgdGhlcmUgd29ybGQnLCA3KQotcHJpbnQgJ2JvZ3VzIGdyb3VwOicsIGNyZS5ncm91cCgwLCAxLCAzKQotdHJ5OgotICAgIHByaW50ICdubyBuYW1lOicsIGNyZS5ncm91cCgnb25lJykKLWV4Y2VwdCByZWdleC5lcnJvcjoKLSAgICBwcmludCAnY2F1Z2h0IGV4cGVjdGVkIGV4Y2VwdGlvbicKLWVsc2U6Ci0gICAgcHJpbnQgJ2V4cGVjdGVkIHJlZ2V4LmVycm9yIG5vdCByYWlzZWQnCi0KLWZyb20gcmVnZXhfdGVzdHMgaW1wb3J0ICoKLWlmIHZlcmJvc2U6IHByaW50ICdSdW5uaW5nIHJlZ2V4X3Rlc3RzIHRlc3Qgc3VpdGUnCi0KLWZvciB0IGluIHRlc3RzOgotICAgIHBhdHRlcm49cz1vdXRjb21lPXJlcGw9ZXhwZWN0ZWQ9Tm9uZQotICAgIGlmIGxlbih0KT09NToKLSAgICAgICAgcGF0dGVybiwgcywgb3V0Y29tZSwgcmVwbCwgZXhwZWN0ZWQgPSB0Ci0gICAgZWxpZiBsZW4odCk9PTM6Ci0gICAgICAgIHBhdHRlcm4sIHMsIG91dGNvbWUgPSB0Ci0gICAgZWxzZToKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgKCdUZXN0IHR1cGxlcyBzaG91bGQgaGF2ZSAzIG9yIDUgZmllbGRzJyx0KQotCi0gICAgdHJ5OgotICAgICAgICBvYmo9cmVnZXguY29tcGlsZShwYXR0ZXJuKQotICAgIGV4Y2VwdCByZWdleC5lcnJvcjoKLSAgICAgICAgaWYgb3V0Y29tZT09U1lOVEFYX0VSUk9SOiBwYXNzICAgICMgRXhwZWN0ZWQgYSBzeW50YXggZXJyb3IKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgUmVnZXggc3ludGF4IGVycm9ycyBhcmVuJ3QgeWV0IHJlcG9ydGVkLCBzbyBmb3IKLSAgICAgICAgICAgICMgdGhlIG9mZmljaWFsIHRlc3Qgc3VpdGUgdGhleSdsbCBiZSBxdWlldGx5IGlnbm9yZWQuCi0gICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICAjcHJpbnQgJz09PSBTeW50YXggZXJyb3I6JywgdAotICAgIGVsc2U6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlc3VsdD1vYmouc2VhcmNoKHMpCi0gICAgICAgIGV4Y2VwdCByZWdleC5lcnJvciwgbXNnOgotICAgICAgICAgICAgcHJpbnQgJz09PSBVbmV4cGVjdGVkIGV4Y2VwdGlvbicsIHQsIHJlcHIobXNnKQotICAgICAgICBpZiBvdXRjb21lPT1TWU5UQVhfRVJST1I6Ci0gICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBhIHN5bnRheCBlcnJvcjsgZm9yZ2V0IGl0LgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbGlmIG91dGNvbWU9PUZBSUw6Ci0gICAgICAgICAgICBpZiByZXN1bHQ9PS0xOiBwYXNzICAgIyBObyBtYXRjaCwgYXMgZXhwZWN0ZWQKLSAgICAgICAgICAgIGVsc2U6IHByaW50ICc9PT0gU3VjY2VlZGVkIGluY29ycmVjdGx5JywgdAotICAgICAgICBlbGlmIG91dGNvbWU9PVNVQ0NFRUQ6Ci0gICAgICAgICAgICBpZiByZXN1bHQhPS0xOgotICAgICAgICAgICAgICAgICMgTWF0Y2hlZCwgYXMgZXhwZWN0ZWQsIHNvIG5vdyB3ZSBjb21wdXRlIHRoZQotICAgICAgICAgICAgICAgICMgcmVzdWx0IHN0cmluZyBhbmQgY29tcGFyZSBpdCB0byBvdXIgZXhwZWN0ZWQgcmVzdWx0LgotICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBvYmoucmVnc1swXQotICAgICAgICAgICAgICAgIGZvdW5kPXNbc3RhcnQ6ZW5kXQotICAgICAgICAgICAgICAgIGdyb3Vwcz1vYmouZ3JvdXAoMSwyLDMsNCw1LDYsNyw4LDksMTApCi0gICAgICAgICAgICAgICAgdmFyZGljdD12YXJzKCkKLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZ3JvdXBzKSk6Ci0gICAgICAgICAgICAgICAgICAgIHZhcmRpY3RbJ2cnK3N0cihpKzEpXT1zdHIoZ3JvdXBzW2ldKQotICAgICAgICAgICAgICAgIHJlcGw9ZXZhbChyZXBsKQotICAgICAgICAgICAgICAgIGlmIHJlcGwhPWV4cGVjdGVkOgotICAgICAgICAgICAgICAgICAgICBwcmludCAnPT09IGdyb3VwaW5nIGVycm9yJywgdCwgcmVwcihyZXBsKSsnIHNob3VsZCBiZSAnK3JlcHIoZXhwZWN0ZWQpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICc9PT0gRmFpbGVkIGluY29ycmVjdGx5JywgdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NldC5weQppbmRleCA2ZmYxMjE1Li4wMjY4YmUyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NldC5weQpAQCAtMjI0LDcgKzIyNCw3IEBACiAgICAgICAgICMgQnVnICMxMjU3NzMxCiAgICAgICAgIGNsYXNzIEgoc2VsZi50aGV0eXBlKToKICAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICAgICAgICAgICAgICByZXR1cm4gaWQoc2VsZikKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50KGlkKHNlbGYpICYgMHg3ZmZmZmZmZikKICAgICAgICAgcz1IKCkKICAgICAgICAgZj1zZXQoKQogICAgICAgICBmLmFkZChzKQpAQCAtNDIxLDcgKzQyMSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJlZmVyZW5jZUVycm9yLCBzdHIsIHApCiAKICAgICAjIEMgQVBJIHRlc3Qgb25seSBhdmFpbGFibGUgaW4gYSBkZWJ1ZyBidWlsZAotICAgIGlmIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgIGlmIGhhc2F0dHIoc2V0LCAidGVzdF9jX2FwaSIpOgogICAgICAgICBkZWYgdGVzdF9jX2FwaShzZWxmKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KCdhYmMnKS50ZXN0X2NfYXBpKCksIFRydWUpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2V0dXB0b29scy5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0dXB0b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg4MzAzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zZXR1cHRvb2xzLnB5CkBAIC0wLDAgKzEsMTYgQEAKKyIiIlRlc3RzIGZvciBzZXR1cHRvb2xzLgorCitUaGUgdGVzdHMgZm9yIHNldHVwdG9vbHMgYXJlIGRlZmluZWQgaW4gdGhlIHNldHVwdG9vbHMudGVzdHMgcGFja2FnZTsKK3RoaXMgcnVucyB0aGVtIGZyb20gdGhlcmUuCisiIiIKKworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0Citmcm9tIHNldHVwdG9vbHMuY29tbWFuZC50ZXN0IGltcG9ydCBTY2FubmluZ0xvYWRlcgorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3N1aXRlKAorICAgICAgICBTY2FubmluZ0xvYWRlcigpLmxvYWRUZXN0c0Zyb21OYW1lKCdzZXR1cHRvb2xzLnRlc3RzJykKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weSBiL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weQppbmRleCBiYzI1YmQwLi44ZThiMDJmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5CkBAIC0yMTQsNiArMjE0LDIwIEBACiAgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImUiLCBbKCJhIiwgInJnYigxLDIsMykiKV0pLAogICAgICAgICAgICAgXSkKIAorICAgIGRlZiB0ZXN0X2F0dHJfdmFsdWVzX2VudGl0aWVzKHNlbGYpOgorICAgICAgICAiIiJTdWJzdGl0dXRpb24gb2YgZW50aXRpZXMgYW5kIGNoYXJyZWZzIGluIGF0dHJpYnV0ZSB2YWx1ZXMiIiIKKyAgICAgICAgIyBTRiBidWcgIzE0NTIyNDYKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYj0mbHQ7IGM9Jmx0OyZndDsgZD0mbHQtJmd0OyBlPScmbHQ7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZj0iJnh4eDsiIGc9JyYjMzI7JiMzMzsnIGg9JyYjNTAwOycgaT0neD9hPWImYz1kOyc+IiIiLAorICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCAiPD4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgIiZsdC0+IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZSIsICI8ICIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImYiLCAiJnh4eDsiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJnIiwgIiAhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsICImIzUwMDsiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgIng/YT1iJmM9ZDsiKSwgXSldKQorCiAgICAgZGVmIHRlc3RfYXR0cl9mdW5reV9uYW1lcyhzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYS5iPSd2JyBjOmQ9diBlLWY9dj4iIiIsIFsKICAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFsoImEuYiIsICJ2IiksICgiYzpkIiwgInYiKSwgKCJlLWYiLCAidiIpXSksCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CmluZGV4IDE4OTllNzguLjY5NDMwODAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CkBAIC0yNjgsOSArMjY4LDkgQEAKICAgICAgICAgICAgICMgUHJvYmFibHkgYSBzaW1pbGFyIHByb2JsZW0gYXMgYWJvdmU7IHNraXAgdGhpcyB0ZXN0CiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgYWxsX2hvc3RfbmFtZXMgPSBbaG9zdG5hbWUsIGhuYW1lXSArIGFsaWFzZXMKLSAgICAgICAgZnFobiA9IHNvY2tldC5nZXRmcWRuKCkKKyAgICAgICAgZnFobiA9IHNvY2tldC5nZXRmcWRuKGlwKQogICAgICAgICBpZiBub3QgZnFobiBpbiBhbGxfaG9zdF9uYW1lczoKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiRXJyb3IgdGVzdGluZyBob3N0IHJlc29sdXRpb24gbWVjaGFuaXNtcy4iKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJFcnJvciB0ZXN0aW5nIGhvc3QgcmVzb2x1dGlvbiBtZWNoYW5pc21zLiAoZnFkbjogJXMsIGFsbDogJXMpIiAlIChmcWhuLCByZXByKGFsbF9ob3N0X25hbWVzKSkpCiAKICAgICBkZWYgdGVzdFJlZkNvdW50R2V0TmFtZUluZm8oc2VsZik6CiAgICAgICAgICMgVGVzdGluZyByZWZlcmVuY2UgY291bnQgZm9yIGdldG5hbWVpbmZvCkBAIC00NjksNiArNDY5LDE0IEBACiAgICAgICAgIHNvY2suY2xvc2UoKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNvY2suc2VuZCwgInNwYW0iKQogCisgICAgZGVmIHRlc3ROZXdBdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICAjIHRlc3RpbmcgLmZhbWlseSwgLnR5cGUgYW5kIC5wcm90b2NvbAorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvY2suZmFtaWx5LCBzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb2NrLnR5cGUsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb2NrLnByb3RvLCAwKQorICAgICAgICBzb2NrLmNsb3NlKCkKKwogY2xhc3MgQmFzaWNUQ1BUZXN0KFNvY2tldENvbm5lY3RlZFRlc3QpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKQEAgLTgxNyw2ICs4MjUsMzIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3Moc29ja2V0LmdhaWVycm9yLCBzb2NrZXQuZXJyb3IpKQogICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhzb2NrZXQudGltZW91dCwgc29ja2V0LmVycm9yKSkKIAorY2xhc3MgVGVzdExpbnV4QWJzdHJhY3ROYW1lc3BhY2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgVU5JWF9QQVRIX01BWCA9IDEwOAorCisgICAgZGVmIHRlc3RMaW51eEFic3RyYWN0TmFtZXNwYWNlKHNlbGYpOgorICAgICAgICBhZGRyZXNzID0gIlx4MDBweXRob24tdGVzdC1oZWxsb1x4MDBceGZmIgorICAgICAgICBzMSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgczEuYmluZChhZGRyZXNzKQorICAgICAgICBzMS5saXN0ZW4oMSkKKyAgICAgICAgczIgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHMyLmNvbm5lY3QoczEuZ2V0c29ja25hbWUoKSkKKyAgICAgICAgczEuYWNjZXB0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMS5nZXRzb2NrbmFtZSgpLCBhZGRyZXNzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMyLmdldHBlZXJuYW1lKCksIGFkZHJlc3MpCisKKyAgICBkZWYgdGVzdE1heE5hbWUoc2VsZik6CisgICAgICAgIGFkZHJlc3MgPSAiXHgwMCIgKyAiaCIgKiAoc2VsZi5VTklYX1BBVEhfTUFYIC0gMSkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgcy5iaW5kKGFkZHJlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXRzb2NrbmFtZSgpLCBhZGRyZXNzKQorCisgICAgZGVmIHRlc3ROYW1lT3ZlcmZsb3coc2VsZik6CisgICAgICAgIGFkZHJlc3MgPSAiXHgwMCIgKyAiaCIgKiBzZWxmLlVOSVhfUEFUSF9NQVgKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzLmJpbmQsIGFkZHJlc3MpCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3RzID0gW0dlbmVyYWxNb2R1bGVUZXN0cywgQmFzaWNUQ1BUZXN0LCBUQ1BUaW1lb3V0VGVzdCwgVGVzdEV4Y2VwdGlvbnNdCkBAIC04MzIsNiArODY2LDggQEAKICAgICBdKQogICAgIGlmIGhhc2F0dHIoc29ja2V0LCAic29ja2V0cGFpciIpOgogICAgICAgICB0ZXN0cy5hcHBlbmQoQmFzaWNTb2NrZXRQYWlyVGVzdCkKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2xpbnV4Mic6CisgICAgICAgIHRlc3RzLmFwcGVuZChUZXN0TGludXhBYnN0cmFjdE5hbWVzcGFjZSkKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0X3NzbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0X3NzbC5weQppbmRleCA5ODY4MGI5Li4xMDkxMzgzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldF9zc2wucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRfc3NsLnB5CkBAIC0xLDUgKzEsNiBAQAogIyBUZXN0IGp1c3QgdGhlIFNTTCBzdXBwb3J0IGluIHRoZSBzb2NrZXQgbW9kdWxlLCBpbiBhIG1vZGVyYXRlbHkgYm9ndXMgd2F5LgogCitpbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogaW1wb3J0IHNvY2tldAogCkBAIC0xMyw2ICsxNCw5IEBACiAKICAgICBpbXBvcnQgdXJsbGliCiAKKyAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgcHJpbnQgInRlc3RfYmFzaWMgLi4uIgorCiAgICAgc29ja2V0LlJBTkRfc3RhdHVzKCkKICAgICB0cnk6CiAgICAgICAgIHNvY2tldC5SQU5EX2VnZCgxKQpAQCAtMjYsNyArMzAsNDEgQEAKICAgICBidWYgPSBmLnJlYWQoKQogICAgIGYuY2xvc2UoKQogCitkZWYgdGVzdF90aW1lb3V0KCk6CisgICAgdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCduZXR3b3JrJykKKworICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICBwcmludCAidGVzdF90aW1lb3V0IC4uLiIKKworICAgICMgQSBzZXJ2aWNlIHdoaWNoIGlzc3VlcyBhIHdlbGNvbWUgYmFubmVyICh3aXRob3V0IG5lZWQgdG8gd3JpdGUKKyAgICAjIGFueXRoaW5nKS4KKyAgICAjIFhYWCAoImdtYWlsLm9yZyIsIDk5NSkgaGFzIGJlZW4gdW5yZWxpYWJsZSBzbyBmYXIsIGZyb20gdGltZSB0byB0aW1lCisgICAgIyBYWFggbm9uLXJlc3BvbnNpdmUgZm9yIGhvdXJzIG9uIGVuZCAoJiBhY3Jvc3MgYWxsIGJ1aWxkYm90IHNsYXZlcywKKyAgICAjIFhYWCBzbyB0aGF0J3Mgbm90IGp1c3QgYSBsb2NhbCB0aGluZykuCisgICAgQUREUiA9ICJnbWFpbC5vcmciLCA5OTUKKworICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKKyAgICBzLnNldHRpbWVvdXQoMzAuMCkKKyAgICB0cnk6CisgICAgICAgIHMuY29ubmVjdChBRERSKQorICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIiIiXAorICAgIFdBUk5JTkc6ICBhbiBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gJXIgdGltZWQgb3V0LCBpbgorICAgIHRlc3RfdGltZW91dC4gIFRoYXQgbWF5IGJlIGxlZ2l0aW1hdGUsIGJ1dCBpcyBub3QgdGhlIG91dGNvbWUgd2UgaG9wZWQKKyAgICBmb3IuICBJZiB0aGlzIG1lc3NhZ2UgaXMgc2VlbiBvZnRlbiwgdGVzdF90aW1lb3V0IHNob3VsZCBiZSBjaGFuZ2VkIHRvCisgICAgdXNlIGEgbW9yZSByZWxpYWJsZSBhZGRyZXNzLiIiIiAlIChBRERSLCkKKyAgICAgICAgcmV0dXJuCisKKyAgICBzcyA9IHNvY2tldC5zc2wocykKKyAgICAjIFJlYWQgcGFydCBvZiByZXR1cm4gd2VsY29tZSBiYW5uZXIgdHdpY2UuCisgICAgc3MucmVhZCgxKQorICAgIHNzLnJlYWQoMSkKKyAgICBzLmNsb3NlKCkKKwogZGVmIHRlc3RfcnVkZV9zaHV0ZG93bigpOgorICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICBwcmludCAidGVzdF9ydWRlX3NodXRkb3duIC4uLiIKKwogICAgIHRyeToKICAgICAgICAgaW1wb3J0IHRocmVhZGluZwogICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKQEAgLTc0LDYgKzExMiw3IEBACiAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0U2tpcHBlZCgic29ja2V0IG1vZHVsZSBoYXMgbm8gc3NsIHN1cHBvcnQiKQogICAgIHRlc3RfcnVkZV9zaHV0ZG93bigpCiAgICAgdGVzdF9iYXNpYygpCisgICAgdGVzdF90aW1lb3V0KCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zcWxpdGUucHkgYi9MaWIvdGVzdC90ZXN0X3NxbGl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFkMGU1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zcWxpdGUucHkKQEAgLTAsMCArMSwxNiBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBUZXN0U2tpcHBlZAoraW1wb3J0IHVuaXR0ZXN0CisKK3RyeToKKyAgICBpbXBvcnQgX3NxbGl0ZTMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICByYWlzZSBUZXN0U2tpcHBlZCgnbm8gc3FsaXRlIGF2YWlsYWJsZScpCitmcm9tIHNxbGl0ZTMudGVzdCBpbXBvcnQgKGRiYXBpLCB0eXBlcywgdXNlcmZ1bmN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSwgdHJhbnNhY3Rpb25zKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KGRiYXBpLnN1aXRlKCksIHR5cGVzLnN1aXRlKCksIHVzZXJmdW5jdGlvbnMuc3VpdGUoKSwKKyAgICAgICAgICAgICAgICAgZmFjdG9yeS5zdWl0ZSgpLCB0cmFuc2FjdGlvbnMuc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdGFydGZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3N0YXJ0ZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQxMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zdGFydGZpbGUucHkKQEAgLTAsMCArMSwzNyBAQAorIyBSaWRpY3Vsb3VzbHkgc2ltcGxlIHRlc3Qgb2YgdGhlIG9zLnN0YXJ0ZmlsZSBmdW5jdGlvbiBmb3IgV2luZG93cy4KKyMKKyMgZW1wdHkudmJzIGlzIGFuIGVtcHR5IGZpbGUgKGV4Y2VwdCBmb3IgYSBjb21tZW50KSwgd2hpY2ggZG9lcworIyBub3RoaW5nIHdoZW4gcnVuIHdpdGggY3NjcmlwdCBvciB3c2NyaXB0LgorIworIyBBIHBvc3NpYmxlIGltcHJvdmVtZW50IHdvdWxkIGJlIHRvIGhhdmUgZW1wdHkudmJzIGRvIHNvbWV0aGluZyB0aGF0CisjIHdlIGNhbiBkZXRlY3QgaGVyZSwgdG8gbWFrZSBzdXJlIHRoYXQgbm90IG9ubHkgdGhlIG9zLnN0YXJ0ZmlsZSgpCisjIGNhbGwgc3VjY2VlZGVkLCBidXQgYWxzbyB0aGUgdGhlIHNjcmlwdCBhY3R1YWxseSBoYXMgcnVuLgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgdXNlIHRoaXMgZm9ybSBzbyB0aGF0IHRoZSB0ZXN0IGlzIHNraXBwZWQgd2hlbiBzdGFydGZpbGUgaXMgbm90IGF2YWlsYWJsZToKK2Zyb20gb3MgaW1wb3J0IHN0YXJ0ZmlsZSwgcGF0aAorCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfbm9uZXhpc3Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHN0YXJ0ZmlsZSwgIm5vbmV4aXN0aW5nLnZicyIpCisKKyAgICBkZWYgdGVzdF9ub25leGlzdGluZ191KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBzdGFydGZpbGUsIHUibm9uZXhpc3RpbmcudmJzIikKKworICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgorICAgICAgICBlbXB0eSA9IHBhdGguam9pbihwYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZW1wdHkudmJzIikKKyAgICAgICAgc3RhcnRmaWxlKGVtcHR5KQorICAgICAgICBzdGFydGZpbGUoZW1wdHksICJvcGVuIikKKworICAgIGRlZiB0ZXN0X2VtcHR5X3Uoc2VsZik6CisgICAgICAgIGVtcHR5ID0gcGF0aC5qb2luKHBhdGguZGlybmFtZShfX2ZpbGVfXyksICJlbXB0eS52YnMiKQorICAgICAgICBzdGFydGZpbGUodW5pY29kZShlbXB0eSwgIm1iY3MiKSkKKyAgICAgICAgc3RhcnRmaWxlKHVuaWNvZGUoZW1wdHksICJtYmNzIiksICJvcGVuIikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fPT0iX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1bmRyeS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3VuZHJ5LnB5CmluZGV4IGZkMTBiNjguLmFmMTM2ODQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VuZHJ5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VuZHJ5LnB5CkBAIC0xMiw3NSArMTIsNTAgQEAKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UKIAogaW1wb3J0IEJhc2VIVFRQU2VydmVyCitpbXBvcnQgRG9jWE1MUlBDU2VydmVyCiBpbXBvcnQgQ0dJSFRUUFNlcnZlcgotaW1wb3J0IFF1ZXVlCiBpbXBvcnQgU2ltcGxlSFRUUFNlcnZlcgotaW1wb3J0IFNvY2tldFNlcnZlcgoraW1wb3J0IFNpbXBsZVhNTFJQQ1NlcnZlcgogaW1wb3J0IGFpZmMKLWltcG9ydCBhbnlkYm0KIGltcG9ydCBhdWRpb2RldgogaW1wb3J0IGJkYgoraW1wb3J0IGNnaXRiCiBpbXBvcnQgY21kCiBpbXBvcnQgY29kZQotaW1wb3J0IGNvZGVvcAotaW1wb3J0IGNvbG9yc3lzCi1pbXBvcnQgY29tbWFuZHMKIGltcG9ydCBjb21waWxlYWxsCi10cnk6Ci0gICAgaW1wb3J0IGN1cnNlcyAgICMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgaWYgdmVyYm9zZToKLSAgICAgICAgcHJpbnQgInNraXBwaW5nIGN1cnNlcyIKLWltcG9ydCBkaXJjYWNoZQotaW1wb3J0IGRpcwotaW1wb3J0IGRpc3R1dGlscwotaW1wb3J0IGRvY3Rlc3QKLWltcG9ydCBkdW1iZGJtCiBpbXBvcnQgZW5jb2RpbmdzCi1pbXBvcnQgZm5tYXRjaAogaW1wb3J0IGZvcm1hdHRlcgotaW1wb3J0IGZwZm9ybWF0CiBpbXBvcnQgZnRwbGliCiBpbXBvcnQgZ2V0cGFzcwotaW1wb3J0IGdsb2IKIGltcG9ydCBnb3BoZXJsaWIKIGltcG9ydCBodG1sZW50aXR5ZGVmcwotaW1wb3J0IGh0bWxsaWIKLWltcG9ydCBodHRwbGliCi1pbXBvcnQgaW1hcGxpYgoraW1wb3J0IGlob29rcwogaW1wb3J0IGltZ2hkcgogaW1wb3J0IGltcHV0aWwKIGltcG9ydCBrZXl3b3JkCi1pbXBvcnQgbWFjcGF0aAoraW1wb3J0IGxpbmVjYWNoZQogaW1wb3J0IG1hY3VybDJwYXRoCiBpbXBvcnQgbWFpbGNhcAotaW1wb3J0IG1obGliCi1pbXBvcnQgbWltZXR5cGVzCiBpbXBvcnQgbWltaWZ5Ci1pbXBvcnQgbXVsdGlmaWxlCiBpbXBvcnQgbXV0ZXgKIGltcG9ydCBubnRwbGliCiBpbXBvcnQgbnR1cmwycGF0aAoraW1wb3J0IG9wY29kZQoraW1wb3J0IG9zMmVteHBhdGgKIGltcG9ydCBwZGIKIGltcG9ydCBwaXBlcwogI2ltcG9ydCBwb3BsaWIKIGltcG9ydCBwb3NpeGZpbGUKLWltcG9ydCBwcm9maWxlCiBpbXBvcnQgcHN0YXRzCiBpbXBvcnQgcHlfY29tcGlsZQotI2ltcG9ydCByZWNvbnZlcnQKLWltcG9ydCByZXByCitpbXBvcnQgcHlkb2MKK2ltcG9ydCByZXhlYwogdHJ5OgogICAgIGltcG9ydCBybGNvbXBsZXRlciAgICMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzCiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgInNraXBwaW5nIHJsY29tcGxldGVyIgotaW1wb3J0IHJvYm90cGFyc2VyCiBpbXBvcnQgc2NoZWQKLWltcG9ydCBzZ21sbGliCi1pbXBvcnQgc2hlbHZlCi1pbXBvcnQgc2hsZXgKLWltcG9ydCBzaHV0aWwKIGltcG9ydCBzbXRwbGliCiBpbXBvcnQgc25kaGRyCiBpbXBvcnQgc3RhdHZmcwpAQCAtOTAsMTIgKzY1LDE3IEBACiBpbXBvcnQgc3ltYm9sCiBpbXBvcnQgdGFibmFubnkKIGltcG9ydCB0ZWxuZXRsaWIKLWltcG9ydCB0ZXN0CitpbXBvcnQgdGltZWl0CiBpbXBvcnQgdG9haWZmCi1pbXBvcnQgdXJsbGliMgoraW1wb3J0IHRva2VuCit0cnk6CisgICAgaW1wb3J0IHR0eSAgICAgIyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAic2tpcHBpbmcgdHR5IgorCiAjIENhbid0IHRlc3QgdGhlICJ1c2VyIiBtb2R1bGUgLS0gaWYgdGhlIHVzZXIgaGFzIGEgfi8ucHl0aG9ucmMucHksIGl0CiAjIGNhbiBzY3JldyB1cCBhbGwgc29ydHMgb2YgdGhpbmdzIChlc3AuIGlmIGl0IHByaW50cyEpLgogI2ltcG9ydCB1c2VyCiBpbXBvcnQgd2ViYnJvd3NlcgotaW1wb3J0IHdoaWNoZGIKIGltcG9ydCB4bWwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3lzLnB5IGIvTGliL3Rlc3QvdGVzdF9zeXMucHkKaW5kZXggYjk4YzY0OC4uYWUyYTFjOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeXMucHkKQEAgLTI2MSw2ICsyNjEsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRfKHZpWzNdIGluICgiYWxwaGEiLCAiYmV0YSIsICJjYW5kaWRhdGUiLCAiZmluYWwiKSkKICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmlbNF0sIGludCkpCiAKKyAgICBkZWYgdGVzdF80MzU4MShzZWxmKToKKyAgICAgICAgIyBDYW4ndCB1c2Ugc3lzLnN0ZG91dCwgYXMgdGhpcyBpcyBhIGNTdHJpbmdJTyBvYmplY3Qgd2hlbgorICAgICAgICAjIHRoZSB0ZXN0IHJ1bnMgdW5kZXIgcmVncnRlc3QuCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzeXMuX19zdGRvdXRfXy5lbmNvZGluZyA9PSBzeXMuX19zdGRlcnJfXy5lbmNvZGluZykKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTeXNNb2R1bGVUZXN0KQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkgYi9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkKaW5kZXggY2IxOWQ5ZS4uNDMwOWU4YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weQpAQCAtMTEzLDggKzExMyw5IEBACiAKICAgICAgICAgIyBJZiB3ZSBhcmUgdG9vIGNsb3NlIHRvIHd3dy5weXRob24ub3JnLCB0aGlzIHRlc3Qgd2lsbCBmYWlsLgogICAgICAgICAjIFBpY2sgYSBob3N0IHRoYXQgc2hvdWxkIGJlIGZhcnRoZXIgYXdheS4KLSAgICAgICAgaWYgc29ja2V0LmdldGZxZG4oKS5zcGxpdCgnLicpWy0yOl0gPT0gWydweXRob24nLCAnb3JnJ106Ci0gICAgICAgICAgICBzZWxmLmFkZHJfcmVtb3RlID0gKCdweXRob24ubmV0JywgODApCisgICAgICAgIGlmIChzb2NrZXQuZ2V0ZnFkbigpLnNwbGl0KCcuJylbLTI6XSA9PSBbJ3B5dGhvbicsICdvcmcnXSBvcgorICAgICAgICAgICAgc29ja2V0LmdldGZxZG4oKS5zcGxpdCgnLicpWy0yOi0xXSA9PSBbJ3hzNGFsbCddKToKKyAgICAgICAgICAgIHNlbGYuYWRkcl9yZW1vdGUgPSAoJ3R1dC5maScsIDgwKQogCiAgICAgICAgIF90MSA9IHRpbWUudGltZSgpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhzb2NrZXQuZXJyb3IsIHNlbGYuc29jay5jb25uZWN0LApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weSBiL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKaW5kZXggZDNjMWNjNC4uYjA2NDk2NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CkBAIC0xLDcwICsxLDMwIEBACi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBmaW5kZmlsZSwgaXNfcmVzb3VyY2VfZW5hYmxlZCwgVGVzdEZhaWxlZAogaW1wb3J0IG9zLCBnbG9iLCByYW5kb20KK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKHZlcmJvc2UsIGZpbmRmaWxlLCBpc19yZXNvdXJjZV9lbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RGYWlsZWQpCiBmcm9tIHRva2VuaXplIGltcG9ydCAodG9rZW5pemUsIGdlbmVyYXRlX3Rva2VucywgdW50b2tlbml6ZSwKICAgICAgICAgICAgICAgICAgICAgICBOVU1CRVIsIE5BTUUsIE9QLCBTVFJJTkcpCiAKLWlmIHZlcmJvc2U6Ci0gICAgcHJpbnQgJ3N0YXJ0aW5nLi4uJwotCi1mID0gZmlsZShmaW5kZmlsZSgndG9rZW5pemVfdGVzdHMnICsgb3MuZXh0c2VwICsgJ3R4dCcpKQotdG9rZW5pemUoZi5yZWFkbGluZSkKLWYuY2xvc2UoKQotCi0KLQotIyMjIyMjIFRlc3Qgcm91bmR0cmlwIGZvciB1bnRva2VuaXplICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KKyMgVGVzdCByb3VuZHRyaXAgZm9yIGB1bnRva2VuaXplYC4gIGBmYCBpcyBhIGZpbGUgcGF0aC4gIFRoZSBzb3VyY2UgY29kZSBpbiBmCisjIGlzIHRva2VuaXplZCwgY29udmVydGVkIGJhY2sgdG8gc291cmNlIGNvZGUgdmlhIHRva2VuaXplLnVudG9rZW5pemUoKSwKKyMgYW5kIHRva2VuaXplZCBhZ2FpbiBmcm9tIHRoZSBsYXR0ZXIuICBUaGUgdGVzdCBmYWlscyBpZiB0aGUgc2Vjb25kCisjIHRva2VuaXphdGlvbiBkb2Vzbid0IG1hdGNoIHRoZSBmaXJzdC4KIGRlZiB0ZXN0X3JvdW5kdHJpcChmKToKICAgICAjIyBwcmludCAnVGVzdGluZzonLCBmCi0gICAgZiA9IGZpbGUoZikKKyAgICBmb2JqID0gb3BlbihmKQogICAgIHRyeToKLSAgICAgICAgZnVsbHRvayA9IGxpc3QoZ2VuZXJhdGVfdG9rZW5zKGYucmVhZGxpbmUpKQorICAgICAgICBmdWxsdG9rID0gbGlzdChnZW5lcmF0ZV90b2tlbnMoZm9iai5yZWFkbGluZSkpCiAgICAgZmluYWxseToKLSAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZvYmouY2xvc2UoKQogCiAgICAgdDEgPSBbdG9rWzoyXSBmb3IgdG9rIGluIGZ1bGx0b2tdCiAgICAgbmV3dGV4dCA9IHVudG9rZW5pemUodDEpCiAgICAgcmVhZGxpbmUgPSBpdGVyKG5ld3RleHQuc3BsaXRsaW5lcygxKSkubmV4dAogICAgIHQyID0gW3Rva1s6Ml0gZm9yIHRvayBpbiBnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpXQotICAgIGFzc2VydCB0MSA9PSB0MgorICAgIGlmIHQxICE9IHQyOgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJ1bnRva2VuaXplKCkgcm91bmR0cmlwIGZhaWxlZCBmb3IgJXIiICUgZikKIAotCi1mID0gZmluZGZpbGUoJ3Rva2VuaXplX3Rlc3RzJyArIG9zLmV4dHNlcCArICd0eHQnKQotdGVzdF9yb3VuZHRyaXAoZikKLQotdGVzdGRpciA9IG9zLnBhdGguZGlybmFtZShmKSBvciBvcy5jdXJkaXIKLXRlc3RmaWxlcyA9IGdsb2IuZ2xvYih0ZXN0ZGlyICsgb3Muc2VwICsgJ3Rlc3QqLnB5JykKLWlmIG5vdCBpc19yZXNvdXJjZV9lbmFibGVkKCdjb21waWxlcicpOgotICAgIHRlc3RmaWxlcyA9IHJhbmRvbS5zYW1wbGUodGVzdGZpbGVzLCAxMCkKLQotZm9yIGYgaW4gdGVzdGZpbGVzOgotICAgIHRlc3Rfcm91bmR0cmlwKGYpCi0KLQotIyMjIyMjIFRlc3QgZGV0ZWN0b24gb2YgSW5kZW50YXRpb25FcnJvciAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotCi1zYW1wbGVCYWRUZXh0ID0gIiIiCi1kZWYgZm9vKCk6Ci0gICAgYmFyCi0gIGJhegotIiIiCi0KLXRyeToKLSAgICBmb3IgdG9rIGluIGdlbmVyYXRlX3Rva2VucyhTdHJpbmdJTyhzYW1wbGVCYWRUZXh0KS5yZWFkbGluZSk6Ci0gICAgICAgIHBhc3MKLWV4Y2VwdCBJbmRlbnRhdGlvbkVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCgiRGlkIG5vdCBkZXRlY3QgSW5kZW50YXRpb25FcnJvcjoiKQotCi0KLSMjIyMjIyBUZXN0IGV4YW1wbGUgaW4gdGhlIGRvY3MgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1mcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotCisjIFRoaXMgaXMgYW4gZXhhbXBsZSBmcm9tIHRoZSBkb2NzLCBzZXQgdXAgYXMgYSBkb2N0ZXN0LgogZGVmIGRlY2lzdG10KHMpOgogICAgICIiIlN1YnN0aXR1dGUgRGVjaW1hbHMgZm9yIGZsb2F0cyBpbiBhIHN0cmluZyBvZiBzdGF0ZW1lbnRzLgogCkBAIC03MywxMiArMzMsMjEgQEAKICAgICA+Pj4gZGVjaXN0bXQocykKICAgICAicHJpbnQgK0RlY2ltYWwgKCcyMS4zZS01JykqLURlY2ltYWwgKCcuMTIzNCcpL0RlY2ltYWwgKCc4MS43JykiCiAKLSAgICA+Pj4gZXhlYyhzKQotICAgIC0zLjIxNzE2MDM0MjcyZS0wMDcKKyAgICBUaGUgZm9ybWF0IG9mIHRoZSBleHBvbmVudCBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgcGxhdGZvcm0gQyBsaWJyYXJ5LgorICAgIEtub3duIGNhc2VzIGFyZSAiZS0wMDciIChXaW5kb3dzKSBhbmQgImUtMDciIChub3QgV2luZG93cykuICBTaW5jZQorICAgIHdlJ3JlIG9ubHkgc2hvd2luZyAxMiBkaWdpdHMsIGFuZCB0aGUgMTN0aCBpc24ndCBjbG9zZSB0byA1LCB0aGUKKyAgICByZXN0IG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHBsYXRmb3JtLWluZGVwZW5kZW50LgorCisgICAgPj4+IGV4ZWMocykgI2RvY3Rlc3Q6ICtFTExJUFNJUworICAgIC0zLjIxNzE2MDM0MjcyZS0wLi4uNworCisgICAgT3V0cHV0IGZyb20gY2FsY3VsYXRpb25zIHdpdGggRGVjaW1hbCBzaG91bGQgYmUgaWRlbnRpY2FsIGFjcm9zcyBhbGwKKyAgICBwbGF0Zm9ybXMuCisKICAgICA+Pj4gZXhlYyhkZWNpc3RtdChzKSkKICAgICAtMy4yMTcxNjAzNDI3MTcyNTgyNjE5MzM5MDQ1MjlFLTcKLQogICAgICIiIgorCiAgICAgcmVzdWx0ID0gW10KICAgICBnID0gZ2VuZXJhdGVfdG9rZW5zKFN0cmluZ0lPKHMpLnJlYWRsaW5lKSAgICMgdG9rZW5pemUgdGhlIHN0cmluZwogICAgIGZvciB0b2tudW0sIHRva3ZhbCwgXywgXywgXyAgaW4gZzoKQEAgLTkzLDggKzYyLDUzIEBACiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCh0b2tudW0sIHRva3ZhbCkpCiAgICAgcmV0dXJuIHVudG9rZW5pemUocmVzdWx0KQogCi1pbXBvcnQgZG9jdGVzdAotZG9jdGVzdC50ZXN0bW9kKCkKK2RlZiB0ZXN0X21haW4oKToKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnc3RhcnRpbmcuLi4nCiAKLWlmIHZlcmJvc2U6Ci0gICAgcHJpbnQgJ2ZpbmlzaGVkJworICAgICMgVGhpcyBkaXNwbGF5cyB0aGUgdG9rZW5pemF0aW9uIG9mIHRva2VuaXplX3Rlc3RzLnB5IHRvIHN0ZG91dCwgYW5kCisgICAgIyByZWdydGVzdC5weSBjaGVja3MgdGhhdCB0aGlzIGVxdWFscyB0aGUgZXhwZWN0ZWQgb3V0cHV0IChpbiB0aGUKKyAgICAjIHRlc3Qvb3V0cHV0LyBkaXJlY3RvcnkpLgorICAgIGYgPSBvcGVuKGZpbmRmaWxlKCd0b2tlbml6ZV90ZXN0cycgKyBvcy5leHRzZXAgKyAndHh0JykpCisgICAgdG9rZW5pemUoZi5yZWFkbGluZSkKKyAgICBmLmNsb3NlKCkKKworICAgICMgTm93IHJ1biB0ZXN0X3JvdW5kdHJpcCgpIG92ZXIgdG9rZW5pemVfdGVzdC5weSB0b28sIGFuZCBvdmVyIGFsbAorICAgICMgKGlmIHRoZSAiY29tcGlsZXIiIHJlc291cmNlIGlzIGVuYWJsZWQpIG9yIGEgc21hbGwgcmFuZG9tIHNhbXBsZSAoaWYKKyAgICAjICJjb21waWxlciIgaXMgbm90IGVuYWJsZWQpIG9mIHRoZSB0ZXN0Ki5weSBmaWxlcy4KKyAgICBmID0gZmluZGZpbGUoJ3Rva2VuaXplX3Rlc3RzJyArIG9zLmV4dHNlcCArICd0eHQnKQorICAgIHRlc3Rfcm91bmR0cmlwKGYpCisKKyAgICB0ZXN0ZGlyID0gb3MucGF0aC5kaXJuYW1lKGYpIG9yIG9zLmN1cmRpcgorICAgIHRlc3RmaWxlcyA9IGdsb2IuZ2xvYih0ZXN0ZGlyICsgb3Muc2VwICsgJ3Rlc3QqLnB5JykKKyAgICBpZiBub3QgaXNfcmVzb3VyY2VfZW5hYmxlZCgnY29tcGlsZXInKToKKyAgICAgICAgdGVzdGZpbGVzID0gcmFuZG9tLnNhbXBsZSh0ZXN0ZmlsZXMsIDEwKQorCisgICAgZm9yIGYgaW4gdGVzdGZpbGVzOgorICAgICAgICB0ZXN0X3JvdW5kdHJpcChmKQorCisgICAgIyBUZXN0IGRldGVjdG9uIG9mIEluZGVudGF0aW9uRXJyb3IuCisgICAgc2FtcGxlQmFkVGV4dCA9ICIiIlwKK2RlZiBmb28oKToKKyAgICBiYXIKKyAgYmF6CisiIiIKKworICAgIHRyeToKKyAgICAgICAgZm9yIHRvayBpbiBnZW5lcmF0ZV90b2tlbnMoU3RyaW5nSU8oc2FtcGxlQmFkVGV4dCkucmVhZGxpbmUpOgorICAgICAgICAgICAgcGFzcworICAgIGV4Y2VwdCBJbmRlbnRhdGlvbkVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiRGlkIG5vdCBkZXRlY3QgSW5kZW50YXRpb25FcnJvcjoiKQorCisgICAgIyBSdW4gdGhlIGRvY3Rlc3RzIGluIHRoaXMgbW9kdWxlLgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF90b2tlbml6ZSAgIyBpLmUuLCB0aGlzIG1vZHVsZQorICAgIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl9kb2N0ZXN0CisgICAgcnVuX2RvY3Rlc3QodGVzdF90b2tlbml6ZSkKKworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdmaW5pc2hlZCcKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZS5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKaW5kZXggOTQ0ZmY5YS4uNGY5NDZmNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CkBAIC0xMyw3ICsxMywxNSBAQAogICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAogICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJyldCiAKLSMgQXJtaW4gUmlnbydzIGZhaWxpbmcgZXhhbXBsZToKKyMgTWFueSBvZiB0aGUgdGVzdHMgYmVsb3cgYXJlIHRyaWNreSBiZWNhdXNlIHRoZXkgaW52b2x2ZSBwYXNzIHN0YXRlbWVudHMuCisjIElmIHRoZXJlIGlzIGltcGxpY2l0IGNvbnRyb2wgZmxvdyBhcm91bmQgYSBwYXNzIHN0YXRlbWVudCAoaW4gYW4gZXhjZXB0CisjIGNsYXVzZSBvciBlbHNlIGNhbHVzZSkgdW5kZXIgd2hhdCBjb25kaXRpb25zIGRvIHlvdSBzZXQgYSBsaW5lIG51bWJlcgorIyBmb2xsb3dpbmcgdGhhdCBjbGF1c2U/CisKKworIyBUaGUgZW50aXJlICJ3aGlsZSAwOiIgc3RhdGVtZW50IGlzIG9wdGltaXplZCBhd2F5LiAgTm8gY29kZQorIyBleGlzdHMgZm9yIGl0LCBzbyB0aGUgbGluZSBudW1iZXJzIHNraXAgZGlyZWN0bHkgZnJvbSAiZGVsIHgiCisjIHRvICJ4ID0gMSIuCiBkZWYgYXJpZ29fZXhhbXBsZSgpOgogICAgIHggPSAxCiAgICAgZGVsIHgKQEAgLTI0LDcgKzMyLDYgQEAKIGFyaWdvX2V4YW1wbGUuZXZlbnRzID0gWygwLCAnY2FsbCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdsaW5lJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2xpbmUnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdsaW5lJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ3JldHVybicpXQogCkBAIC02MCwxNCArNjcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ3JldHVybicpXQogCiBkZWYgbm9fcG9wX2Jsb2NrcygpOgotICAgIHdoaWxlIDA6CisgICAgeSA9IDEKKyAgICB3aGlsZSBub3QgeToKICAgICAgICAgYmxhCiAgICAgeCA9IDEKIAogbm9fcG9wX2Jsb2Nrcy5ldmVudHMgPSBbKDAsICdjYWxsJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAotICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdyZXR1cm4nKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ3JldHVybicpXQogCiBkZWYgY2FsbGVkKCk6ICMgbGluZSAtMwogICAgIHggPSAxCkBAIC0xMjcsNiArMTM2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAncmV0dXJuJyldCiAKICMgaW1wbGljaXQgcmV0dXJuIGV4YW1wbGUKKyMgVGhpcyB0ZXN0IGlzIGludGVyZXN0aW5nIGJlY2F1c2Ugb2YgdGhlIGVsc2U6IHBhc3MKKyMgcGFydCBvZiB0aGUgY29kZS4gIFRoZSBjb2RlIGdlbmVyYXRlIGZvciB0aGUgdHJ1ZQorIyBwYXJ0IG9mIHRoZSBpZiBjb250YWlucyBhIGp1bXAgcGFzdCB0aGUgZWxzZSBicmFuY2guCisjIFRoZSBjb21waWxlciB0aGVuIGdlbmVyYXRlcyBhbiBpbXBsaWNpdCAicmV0dXJuIE5vbmUiCisjIEludGVybmFsbHksIHRoZSBjb21waWxlciB2aXNpdHMgdGhlIHBhc3Mgc3RhdGVtZW50CisjIGFuZCBzdG9yZXMgaXRzIGxpbmUgbnVtYmVyIGZvciB1c2Ugb24gdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCisjIFRoZSBuZXh0IGluc3RydWN0aW9uIGlzIHRoZSBpbXBsaWNpdCByZXR1cm4gTm9uZS4KIGRlZiBpcmV0dXJuX2V4YW1wbGUoKToKICAgICBhID0gNQogICAgIGIgPSA1CkBAIC0xNDAsNyArMTU2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdyZXR1cm4nKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDYsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICg2LCAncmV0dXJuJyldCiAKICMgVGlnaHQgbG9vcCB3aXRoIHdoaWxlKDEpIGV4YW1wbGUgKFNGICM3NjU2MjQpCiBkZWYgdGlnaHRsb29wX2V4YW1wbGUoKToKQEAgLTIyMSwxNCArMjM4LDEyIEBACiAKICAgICBkZWYgdGVzdF8wMV9iYXNpYyhzZWxmKToKICAgICAgICAgc2VsZi5ydW5fdGVzdChiYXNpYykKLSMjIFhYWDogVGhlc2UgdGVzdHMgZmFpbCB3aXRoIHRoZSBuZXcgYXN0IGNvbXBpbGVyLiAgVGhleSBtdXN0Ci0jIyBiZSBmaXhlZCBiZWZvcmUgYSByZWxlYXNlLgotIyMgICAgZGVmIHRlc3RfMDJfYXJpZ28oc2VsZik6Ci0jIyAgICAgICAgc2VsZi5ydW5fdGVzdChhcmlnb19leGFtcGxlKQorICAgIGRlZiB0ZXN0XzAyX2FyaWdvKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KGFyaWdvX2V4YW1wbGUpCiAgICAgZGVmIHRlc3RfMDNfb25lX2luc3RyKHNlbGYpOgogICAgICAgICBzZWxmLnJ1bl90ZXN0KG9uZV9pbnN0cl9saW5lKQotIyMgICAgZGVmIHRlc3RfMDRfbm9fcG9wX2Jsb2NrcyhzZWxmKToKLSMjICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF9ibG9ja3MpCisgICAgZGVmIHRlc3RfMDRfbm9fcG9wX2Jsb2NrcyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19wb3BfYmxvY2tzKQogIyMgICAgZGVmIHRlc3RfMDVfbm9fcG9wX3RvcHMoc2VsZik6CiAjIyAgICAgICAgc2VsZi5ydW5fdGVzdChub19wb3BfdG9wcykKICAgICBkZWYgdGVzdF8wNl9jYWxsKHNlbGYpOgpAQCAtMjQwLDggKzI1NSw4IEBACiAgICAgICAgIHNlbGYucnVuX3Rlc3QyKHNldHRyYWNlX2FuZF9yZXR1cm4pCiAgICAgZGVmIHRlc3RfMDlfc2V0dHJhY2VfYW5kX3JhaXNlKHNlbGYpOgogICAgICAgICBzZWxmLnJ1bl90ZXN0MihzZXR0cmFjZV9hbmRfcmFpc2UpCi0jIyAgICBkZWYgdGVzdF8xMF9pcmV0dXJuKHNlbGYpOgotIyMgICAgICAgIHNlbGYucnVuX3Rlc3QoaXJldHVybl9leGFtcGxlKQorICAgIGRlZiB0ZXN0XzEwX2lyZXR1cm4oc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QoaXJldHVybl9leGFtcGxlKQogICAgIGRlZiB0ZXN0XzExX3RpZ2h0bG9vcChzZWxmKToKICAgICAgICAgc2VsZi5ydW5fdGVzdCh0aWdodGxvb3BfZXhhbXBsZSkKICAgICBkZWYgdGVzdF8xMl90aWdodGVybG9vcChzZWxmKToKQEAgLTU3OSwxNyArNTk0LDE0IEBACiAgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b29fZmFyX2ZvcndhcmRzKQogICAgIGRlZiB0ZXN0XzA5X25vX2p1bXBfdG9vX2Zhcl9iYWNrd2FyZHMoc2VsZik6CiAgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b29fZmFyX2JhY2t3YXJkcykKLSMgWFhYOiBUaGVzZSB0ZXN0cyBjYXVzZSB0aGUgaW50ZXJwcmV0ZXIgdG8gY3Jhc2guICBUaGUgZnJhbWVfc2V0bGluZW5vKCkKLSMgZnVuY3Rpb24gbm8gbG9uZ2VyIHdvcmtzIGNvcnJlY3RseSBiZWNhdXNlIHRoZSBsaW5lbm8gdGFibGUgZ2VuZXJhdGVkIGJ5Ci0jIHRoZSBBU1QgY29tcGlsZXIgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gd2l0aCB0aGUgb2xkIGNvbXBpbGVyLgotIyAgICBkZWYgdGVzdF8xMF9ub19qdW1wX3RvX2V4Y2VwdF8xKHNlbGYpOgotIyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF8xKQotIyAgICBkZWYgdGVzdF8xMV9ub19qdW1wX3RvX2V4Y2VwdF8yKHNlbGYpOgotIyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF8yKQotIyAgICBkZWYgdGVzdF8xMl9ub19qdW1wX3RvX2V4Y2VwdF8zKHNlbGYpOgotIyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF8zKQotIyAgICBkZWYgdGVzdF8xM19ub19qdW1wX3RvX2V4Y2VwdF80KHNlbGYpOgotIyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF80KQorICAgIGRlZiB0ZXN0XzEwX25vX2p1bXBfdG9fZXhjZXB0XzEoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b19leGNlcHRfMSkKKyAgICBkZWYgdGVzdF8xMV9ub19qdW1wX3RvX2V4Y2VwdF8yKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzIpCisgICAgZGVmIHRlc3RfMTJfbm9fanVtcF90b19leGNlcHRfMyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF8zKQorICAgIGRlZiB0ZXN0XzEzX25vX2p1bXBfdG9fZXhjZXB0XzQoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b19leGNlcHRfNCkKICAgICBkZWYgdGVzdF8xNF9ub19qdW1wX2ZvcndhcmRzX2ludG9fYmxvY2soc2VsZik6CiAgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF9mb3J3YXJkc19pbnRvX2Jsb2NrKQogICAgIGRlZiB0ZXN0XzE1X25vX2p1bXBfYmFja3dhcmRzX2ludG9fYmxvY2soc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CmluZGV4IDI5YTEyMGYuLjIyYzA0NTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CkBAIC0yNCw2ICsyNCw5IEBACiAgICAgICAgICMgWFhYIHdoeSBkb2Vzbid0IGNvbXBpbGUgcmFpc2UgdGhlIHNhbWUgdHJhY2ViYWNrPwogICAgICAgICBpbXBvcnQgdGVzdC5iYWRzeW50YXhfbm9jYXJldAogCisgICAgZGVmIHN5bnRheF9lcnJvcl9iYWRfaW5kZW50YXRpb24oc2VsZik6CisgICAgICAgIGNvbXBpbGUoImRlZiBzcGFtKCk6XG4gIHByaW50IDFcbiBwcmludCAyIiwgIj8iLCAiZXhlYyIpCisKICAgICBkZWYgdGVzdF9jYXJldChzZWxmKToKICAgICAgICAgZXJyID0gc2VsZi5nZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLnN5bnRheF9lcnJvcl93aXRoX2NhcmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEVycm9yKQpAQCAtNDAsNiArNDMsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihlcnIpID09IDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhlcnJbMV0uc3RyaXAoKSA9PSAiW3ggZm9yIHggaW4geF0gPSB4IikKIAorICAgIGRlZiB0ZXN0X2JhZF9pbmRlbnRhdGlvbihzZWxmKToKKyAgICAgICAgZXJyID0gc2VsZi5nZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLnN5bnRheF9lcnJvcl9iYWRfaW5kZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZW50YXRpb25FcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihlcnIpID09IDQpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiXiIgaW4gZXJyWzJdKQorICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLnN0cmlwKCkgPT0gInByaW50IDIiKQorCiAgICAgZGVmIHRlc3RfYnVnNzM3NDczKHNlbGYpOgogICAgICAgICBpbXBvcnQgc3lzLCBvcywgdGVtcGZpbGUsIHRpbWUKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5IGIvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CmluZGV4IDQ5ZWYyOWQuLmM3MTEzYjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKQEAgLTgxMCw2ICs4MTAsMjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRm9vOSgiZm9vIikpLCAic3RyaW5nIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKEZvbzkoImZvbyIpKSwgdSJub3QgdW5pY29kZSIpCiAKKyAgICBkZWYgdGVzdF91bmljb2RlX3JlcHIoc2VsZik6CisgICAgICAgIGNsYXNzIHMxOgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAnXFxuJworCisgICAgICAgIGNsYXNzIHMyOgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1J1xcbicKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoczEoKSksICdcXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoczIoKSksICdcXG4nKQorCisKKworCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVuaWNvZGVUZXN0KQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKaW5kZXggMjg0MzEzOC4uNjRhMmVlOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQpAQCAtMTMsOCArMTMsNyBAQAogIyBwYXJzZV9rZXF2X2xpc3QsIHBhcnNlX2h0dHBfbGlzdCAoSSdtIGxlYXZpbmcgdGhpcyBmb3IgQW50aG9ueSBCYXh0ZXIKICMgIGFuZCBHcmVnIFN0ZWluLCBzaW5jZSB0aGV5J3JlIGRvaW5nIERpZ2VzdCBBdXRoZW50aWNhdGlvbikKICMgQXV0aGVudGljYXRpb24gc3R1ZmYgKGRpdHRvKQotIyBQcm94eUhhbmRsZXIsIEN1c3RvbVByb3h5LCBDdXN0b21Qcm94eUhhbmRsZXIgKEkgZG9uJ3QgdXNlIGEgcHJveHkpCi0jIEdvcGhlckhhbmRsZXIgKGhhdmVuJ3QgdXNlZCBnb3BoZXIgZm9yIGEgZGVjYWRlIG9yIHNvLi4uKQorIyBDdXN0b21Qcm94eSwgQ3VzdG9tUHJveHlIYW5kbGVyCiAKIGNsYXNzIFRyaXZpYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfdHJpdmlhbChzZWxmKToKQEAgLTkwLDYgKzg5LDcgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlKHNlbGYubWV0aF9uYW1lLCBzZWxmLmFjdGlvbiwgKmFyZ3MpCiAKIGNsYXNzIE1vY2tIYW5kbGVyOgorICAgIGhhbmRsZXJfb3JkZXIgPSA1MDAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kcyk6CiAgICAgICAgIHNlbGYuX2RlZmluZV9tZXRob2RzKG1ldGhvZHMpCiAgICAgZGVmIF9kZWZpbmVfbWV0aG9kcyhzZWxmLCBtZXRob2RzKToKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAgIGZvciBtZXRocyBpbiBtZXRoX3NwZWM6CiAgICAgICAgIGNsYXNzIE1vY2tIYW5kbGVyU3ViY2xhc3MoTW9ja0hhbmRsZXIpOiBwYXNzCiAgICAgICAgIGggPSBNb2NrSGFuZGxlclN1YmNsYXNzKG1ldGhzKQotICAgICAgICBoLmhhbmRsZXJfb3JkZXIgPSBjb3VudAorICAgICAgICBoLmhhbmRsZXJfb3JkZXIgKz0gY291bnQKICAgICAgICAgaC5hZGRfcGFyZW50KG9wZW5lcikKICAgICAgICAgY291bnQgPSBjb3VudCArIDEKICAgICAgICAgaGFuZGxlcnMuYXBwZW5kKGgpCkBAIC0zNDksMTMgKzM0OSwxOSBAQAogICAgICAgICBURVNURk4gPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCiAgICAgICAgIHVybHBhdGggPSBzYW5lcGF0aG5hbWUydXJsKG9zLnBhdGguYWJzcGF0aChURVNURk4pKQogICAgICAgICB0b3dyaXRlID0gImhlbGxvLCB3b3JsZFxuIgotICAgICAgICBmb3IgdXJsIGluIFsKKyAgICAgICAgdXJscyA9IFsKICAgICAgICAgICAgICJmaWxlOi8vbG9jYWxob3N0JXMiICUgdXJscGF0aCwKICAgICAgICAgICAgICJmaWxlOi8vJXMiICUgdXJscGF0aCwKICAgICAgICAgICAgICJmaWxlOi8vJXMlcyIgJSAoc29ja2V0LmdldGhvc3RieW5hbWUoJ2xvY2FsaG9zdCcpLCB1cmxwYXRoKSwKLSAgICAgICAgICAgICJmaWxlOi8vJXMlcyIgJSAoc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxwYXRoKSwKLSAgICAgICAgICAgIF06CisgICAgICAgICAgICBdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvY2FsYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICBleGNlcHQgc29ja2V0LmdhaWVycm9yOgorICAgICAgICAgICAgbG9jYWxhZGRyID0gJycKKyAgICAgICAgaWYgbG9jYWxhZGRyOgorICAgICAgICAgICAgdXJscy5hcHBlbmQoImZpbGU6Ly8lcyVzIiAlIChsb2NhbGFkZHIsIHVybHBhdGgpKQorCisgICAgICAgIGZvciB1cmwgaW4gdXJsczoKICAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgIndiIikKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICB0cnk6CkBAIC02MzYsNiArNjQyLDIzIEBACiAgICAgICAgIG8ub3BlbigiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQogICAgICAgICBzZWxmLmFzc2VydF8obm90IGhoLnJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKIAorICAgIGRlZiB0ZXN0X3Byb3h5KHNlbGYpOgorICAgICAgICBvID0gT3BlbmVyRGlyZWN0b3IoKQorICAgICAgICBwaCA9IHVybGxpYjIuUHJveHlIYW5kbGVyKGRpY3QoaHR0cD0icHJveHkuZXhhbXBsZS5jb206MzEyOCIpKQorICAgICAgICBvLmFkZF9oYW5kbGVyKHBoKQorICAgICAgICBtZXRoX3NwZWMgPSBbCisgICAgICAgICAgICBbKCJodHRwX29wZW4iLCAicmV0dXJuIHJlc3BvbnNlIildCisgICAgICAgICAgICBdCisgICAgICAgIGhhbmRsZXJzID0gYWRkX29yZGVyZWRfbW9ja19oYW5kbGVycyhvLCBtZXRoX3NwZWMpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2FjbWUuZXhhbXBsZS5jb20vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgImFjbWUuZXhhbXBsZS5jb20iKQorICAgICAgICByID0gby5vcGVuKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgInByb3h5LmV4YW1wbGUuY29tOjMxMjgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhoYW5kbGVyc1swXSwgImh0dHBfb3BlbiIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbdHVwWzA6Ml0gZm9yIHR1cCBpbiBvLmNhbGxzXSkKKwogCiBjbGFzcyBNaXNjVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC04MjEsNiArODQ0LDcgQEAKIAogCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHVybGxpYjIsIHZlcmJvc2UpCiAgICAgdGVzdHMgPSAoVHJpdmlhbFRlc3RzLAogICAgICAgICAgICAgIE9wZW5lckRpcmVjdG9yVGVzdHMsCiAgICAgICAgICAgICAgSGFuZGxlclRlc3RzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKaW5kZXggMzlhZGEwNi4uNWNlZTQ1OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CkBAIC0xMiwxNSArMTIsNTMgQEAKICAgICBkZWYgY2hlY2tSb3VuZHRyaXBzKHNlbGYsIHVybCwgcGFyc2VkLCBzcGxpdCk6CiAgICAgICAgIHJlc3VsdCA9IHVybHBhcnNlLnVybHBhcnNlKHVybCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHBhcnNlZCkKKyAgICAgICAgdCA9IChyZXN1bHQuc2NoZW1lLCByZXN1bHQubmV0bG9jLCByZXN1bHQucGF0aCwKKyAgICAgICAgICAgICByZXN1bHQucGFyYW1zLCByZXN1bHQucXVlcnksIHJlc3VsdC5mcmFnbWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBwYXJzZWQpCiAgICAgICAgICMgcHV0IGl0IGJhY2sgdG9nZXRoZXIgYW5kIGl0IHNob3VsZCBiZSB0aGUgc2FtZQogICAgICAgICByZXN1bHQyID0gdXJscGFyc2UudXJsdW5wYXJzZShyZXN1bHQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0MiwgdXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDIsIHJlc3VsdC5nZXR1cmwoKSkKKworICAgICAgICAjIHRoZSByZXN1bHQgb2YgZ2V0dXJsKCkgaXMgYSBmaXhwb2ludDsgd2UgY2FuIGFsd2F5cyBwYXJzZSBpdAorICAgICAgICAjIGFnYWluIHRvIGdldCB0aGUgc2FtZSByZXN1bHQ6CisgICAgICAgIHJlc3VsdDMgPSB1cmxwYXJzZS51cmxwYXJzZShyZXN1bHQuZ2V0dXJsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5nZXR1cmwoKSwgcmVzdWx0LmdldHVybCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMsICAgICAgICAgIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnNjaGVtZSwgICByZXN1bHQuc2NoZW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMubmV0bG9jLCAgIHJlc3VsdC5uZXRsb2MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wYXRoLCAgICAgcmVzdWx0LnBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wYXJhbXMsICAgcmVzdWx0LnBhcmFtcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnF1ZXJ5LCAgICByZXN1bHQucXVlcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5mcmFnbWVudCwgcmVzdWx0LmZyYWdtZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMudXNlcm5hbWUsIHJlc3VsdC51c2VybmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBhc3N3b3JkLCByZXN1bHQucGFzc3dvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5ob3N0bmFtZSwgcmVzdWx0Lmhvc3RuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucG9ydCwgICAgIHJlc3VsdC5wb3J0KQogCiAgICAgICAgICMgY2hlY2sgdGhlIHJvdW5kdHJpcCB1c2luZyB1cmxzcGxpdCgpIGFzIHdlbGwKICAgICAgICAgcmVzdWx0ID0gdXJscGFyc2UudXJsc3BsaXQodXJsKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc3BsaXQpCisgICAgICAgIHQgPSAocmVzdWx0LnNjaGVtZSwgcmVzdWx0Lm5ldGxvYywgcmVzdWx0LnBhdGgsCisgICAgICAgICAgICAgcmVzdWx0LnF1ZXJ5LCByZXN1bHQuZnJhZ21lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc3BsaXQpCiAgICAgICAgIHJlc3VsdDIgPSB1cmxwYXJzZS51cmx1bnNwbGl0KHJlc3VsdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQyLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0MiwgcmVzdWx0LmdldHVybCgpKQorCisgICAgICAgICMgY2hlY2sgdGhlIGZpeHBvaW50IHByb3BlcnR5IG9mIHJlLXBhcnNpbmcgdGhlIHJlc3VsdCBvZiBnZXR1cmwoKQorICAgICAgICByZXN1bHQzID0gdXJscGFyc2UudXJsc3BsaXQocmVzdWx0LmdldHVybCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuZ2V0dXJsKCksIHJlc3VsdC5nZXR1cmwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLCAgICAgICAgICByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5zY2hlbWUsICAgcmVzdWx0LnNjaGVtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLm5ldGxvYywgICByZXN1bHQubmV0bG9jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucGF0aCwgICAgIHJlc3VsdC5wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucXVlcnksICAgIHJlc3VsdC5xdWVyeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLmZyYWdtZW50LCByZXN1bHQuZnJhZ21lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My51c2VybmFtZSwgcmVzdWx0LnVzZXJuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucGFzc3dvcmQsIHJlc3VsdC5wYXNzd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLmhvc3RuYW1lLCByZXN1bHQuaG9zdG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wb3J0LCAgICAgcmVzdWx0LnBvcnQpCiAKICAgICBkZWYgdGVzdF9yb3VuZHRyaXBzKHNlbGYpOgogICAgICAgICB0ZXN0Y2FzZXMgPSBbCkBAIC0xODcsNiArMjI1LDY5IEBACiAgICAgICAgICAgICBdOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxkZWZyYWcodXJsKSwgKGRlZnJhZywgZnJhZykpCiAKKyAgICBkZWYgdGVzdF91cmxzcGxpdF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICB1cmwgPSAiSFRUUDovL1dXVy5QWVRIT04uT1JHL2RvYy8jZnJhZyIKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHNwbGl0KHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnNjaGVtZSwgImh0dHAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAiV1dXLlBZVEhPTi5PUkciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGF0aCwgIi9kb2MvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnF1ZXJ5LCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmZyYWdtZW50LCAiZnJhZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC51c2VybmFtZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhc3N3b3JkLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaG9zdG5hbWUsICJ3d3cucHl0aG9uLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3J0LCBOb25lKQorICAgICAgICAjIGdldHVybCgpIHdvbid0IHJldHVybiBleGFjdGx5IHRoZSBvcmlnaW5hbCBVUkwgaW4gdGhpcyBjYXNlCisgICAgICAgICMgc2luY2UgdGhlIHNjaGVtZSBpcyBhbHdheXMgY2FzZS1ub3JtYWxpemVkCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVybCkKKworICAgICAgICB1cmwgPSAiaHR0cDovL1VzZXI6UGFzc0B3d3cucHl0aG9uLm9yZzowODAvZG9jLz9xdWVyeT15ZXMjZnJhZyIKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHNwbGl0KHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnNjaGVtZSwgImh0dHAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAiVXNlcjpQYXNzQHd3dy5weXRob24ub3JnOjA4MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXRoLCAiL2RvYy8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucXVlcnksICJxdWVyeT15ZXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZnJhZ21lbnQsICJmcmFnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnVzZXJuYW1lLCAiVXNlciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXNzd29yZCwgIlBhc3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaG9zdG5hbWUsICJ3d3cucHl0aG9uLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3J0LCA4MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmdldHVybCgpLCB1cmwpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX2JhZF9wb3J0KHNlbGYpOgorICAgICAgICAiIiJDaGVjayBoYW5kbGluZyBvZiBub24taW50ZWdlciBwb3J0cy4iIiIKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHNwbGl0KCJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCisKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHBhcnNlKCJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX3dpdGhvdXRfbmV0bG9jKHNlbGYpOgorICAgICAgICAjIFRoaXMgZXhhbXBsZSBpcyBzdHJhaWdodCBmcm9tIFJGQyAzMjYxLiAgSXQgbG9va3MgbGlrZSBpdAorICAgICAgICAjIHNob3VsZCBhbGxvdyB0aGUgdXNlcm5hbWUsIGhvc3RuYW1lLCBhbmQgcG9ydCB0byBiZSBmaWxsZWQKKyAgICAgICAgIyBpbiwgYnV0IGRvZXNuJ3QuICBTaW5jZSBpdCdzIGEgVVJJIGFuZCBkb2Vzbid0IHVzZSB0aGUKKyAgICAgICAgIyBzY2hlbWU6Ly9uZXRsb2Mgc3ludGF4LCB0aGUgbmV0bG9jIGFuZCByZWxhdGVkIGF0dHJpYnV0ZXMKKyAgICAgICAgIyBzaG91bGQgYmUgbGVmdCBlbXB0eS4KKyAgICAgICAgdXJpID0gInNpcDphbGljZUBhdGxhbnRhLmNvbTttYWRkcj0yMzkuMjU1LjI1NS4xO3R0bD0xNSIKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHNwbGl0KHVyaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC51c2VybmFtZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhc3N3b3JkLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaG9zdG5hbWUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3J0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVyaSkKKworICAgICAgICBwID0gdXJscGFyc2UudXJscGFyc2UodXJpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnVzZXJuYW1lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGFzc3dvcmQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5ob3N0bmFtZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXR1cmwoKSwgdXJpKQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVybFBhcnNlVGVzdENhc2UpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2FpdDMucHkgYi9MaWIvdGVzdC90ZXN0X3dhaXQzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTQxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3dhaXQzLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyIiIlRoaXMgdGVzdCBjaGVja3MgZm9yIGNvcnJlY3Qgd2FpdDMoKSBiZWhhdmlvci4KKyIiIgorCitpbXBvcnQgb3MKK2Zyb20gdGVzdC5mb3JrX3dhaXQgaW1wb3J0IEZvcmtXYWl0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0CisKK3RyeToKKyAgICBvcy5mb3JrCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQsICJvcy5mb3JrIG5vdCBkZWZpbmVkIC0tIHNraXBwaW5nIHRlc3Rfd2FpdDMiCisKK3RyeToKKyAgICBvcy53YWl0MworZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIHJhaXNlIFRlc3RTa2lwcGVkLCAib3Mud2FpdDMgbm90IGRlZmluZWQgLS0gc2tpcHBpbmcgdGVzdF93YWl0MyIKKworY2xhc3MgV2FpdDNUZXN0KEZvcmtXYWl0KToKKyAgICBkZWYgd2FpdF9pbXBsKHNlbGYsIGNwaWQpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgc3BpZCwgc3RhdHVzLCBydXNhZ2UgPSBvcy53YWl0MygwKQorICAgICAgICAgICAgaWYgc3BpZCA9PSBjcGlkOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BpZCwgY3BpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0dXMsIDAsICJjYXVzZSA9ICVkLCBleGl0ID0gJWQiICUgKHN0YXR1cyYweGZmLCBzdGF0dXM+PjgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVzYWdlKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFdhaXQzVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YWl0NC5weSBiL0xpYi90ZXN0L3Rlc3Rfd2FpdDQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3ZTVjMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2FpdDQucHkKQEAgLTAsMCArMSwyOSBAQAorIiIiVGhpcyB0ZXN0IGNoZWNrcyBmb3IgY29ycmVjdCB3YWl0NCgpIGJlaGF2aW9yLgorIiIiCisKK2ltcG9ydCBvcworZnJvbSB0ZXN0LmZvcmtfd2FpdCBpbXBvcnQgRm9ya1dhaXQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QKKwordHJ5OgorICAgIG9zLmZvcmsKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICByYWlzZSBUZXN0U2tpcHBlZCwgIm9zLmZvcmsgbm90IGRlZmluZWQgLS0gc2tpcHBpbmcgdGVzdF93YWl0NCIKKwordHJ5OgorICAgIG9zLndhaXQ0CitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQsICJvcy53YWl0NCBub3QgZGVmaW5lZCAtLSBza2lwcGluZyB0ZXN0X3dhaXQ0IgorCitjbGFzcyBXYWl0NFRlc3QoRm9ya1dhaXQpOgorICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6CisgICAgICAgIHNwaWQsIHN0YXR1cywgcnVzYWdlID0gb3Mud2FpdDQoY3BpZCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGlkLCBjcGlkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXR1cywgMCwgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydXNhZ2UpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoV2FpdDRUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5IGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weQppbmRleCBiNzA2MWMxLi41ZDA1MWE1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKQEAgLTgyLDYgKzgyLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmNhdGVnb3J5LCAnVXNlcldhcm5pbmcnKQogCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgIyBPYnNjdXJlIGhhY2sgc28gdGhhdCB0aGlzIHRlc3QgcGFzc2VzIGFmdGVyIHJlbG9hZHMgb3IgcmVwZWF0ZWQgY2FsbHMKKyAgICAjIHRvIHRlc3RfbWFpbiAocmVncnRlc3QgLVIpLgorICAgIGlmICdfX3dhcm5pbmdyZWdpc3RyeV9fJyBpbiBnbG9iYWxzKCk6CisgICAgICAgIGRlbCBnbG9iYWxzKClbJ19fd2FybmluZ3JlZ2lzdHJ5X18nXQogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdE1vZHVsZSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2luc291bmQucHkgYi9MaWIvdGVzdC90ZXN0X3dpbnNvdW5kLnB5CmluZGV4IDc3YzQzMmEuLjE5ZDQ0NTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2luc291bmQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93aW5zb3VuZC5weQpAQCAtMyw2ICszLDkgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCB3aW5zb3VuZCwgdGltZQoraW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworCiAKIGNsYXNzIEJlZXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtNDQsNiArNDcsNyBAQAogICAgIGRlZiB0ZXN0X3F1ZXN0aW9uKHNlbGYpOgogICAgICAgICB3aW5zb3VuZC5NZXNzYWdlQmVlcCh3aW5zb3VuZC5NQl9JQ09OUVVFU1RJT04pCiAKKwogY2xhc3MgUGxheVNvdW5kVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CkBAIC01NiwxOSArNjAsNTQgQEAKICAgICAgICAgKQogCiAgICAgZGVmIHRlc3RfYWxpYXNfYXN0ZXJpc2soc2VsZik6Ci0gICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtQXN0ZXJpc2snLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1Bc3RlcmlzaycsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQsCisgICAgICAgICAgICAgICAgJ1N5c3RlbUFzdGVyaXNrJywgd2luc291bmQuU05EX0FMSUFTCisgICAgICAgICAgICApCiAKICAgICBkZWYgdGVzdF9hbGlhc19leGNsYW1hdGlvbihzZWxmKToKLSAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1FeGNsYW1hdGlvbicsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUV4Y2xhbWF0aW9uJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnU3lzdGVtRXhjbGFtYXRpb24nLCB3aW5zb3VuZC5TTkRfQUxJQVMKKyAgICAgICAgICAgICkKIAogICAgIGRlZiB0ZXN0X2FsaWFzX2V4aXQoc2VsZik6Ci0gICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtRXhpdCcsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUV4aXQnLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgICdTeXN0ZW1FeGl0Jywgd2luc291bmQuU05EX0FMSUFTCisgICAgICAgICAgICApCiAKICAgICBkZWYgdGVzdF9hbGlhc19oYW5kKHNlbGYpOgotICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUhhbmQnLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1IYW5kJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnU3lzdGVtSGFuZCcsIHdpbnNvdW5kLlNORF9BTElBUworICAgICAgICAgICAgKQogCiAgICAgZGVmIHRlc3RfYWxpYXNfcXVlc3Rpb24oc2VsZik6Ci0gICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtUXVlc3Rpb24nLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1RdWVzdGlvbicsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQsCisgICAgICAgICAgICAgICAgJ1N5c3RlbVF1ZXN0aW9uJywgd2luc291bmQuU05EX0FMSUFTCisgICAgICAgICAgICApCiAKICAgICBkZWYgdGVzdF9hbGlhc19mYWxsYmFjayhzZWxmKToKICAgICAgICAgIyBUaGlzIHRlc3QgY2FuJ3QgYmUgZXhwZWN0ZWQgdG8gd29yayBvbiBhbGwgc3lzdGVtcy4gIFRoZSBNUwpAQCAtODUsNDEgKzEyNCw4MyBAQAogICAgICAgICByZXR1cm4KIAogICAgIGRlZiB0ZXN0X2FsaWFzX25vZmFsbGJhY2soc2VsZik6Ci0gICAgICAgICMgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIGFzc2VydGluZyBSdW50aW1lRXJyb3IKLSAgICAgICAgIyB3aWxsIGdldCByYWlzZWQ6ICB5b3UgY2Fubm90IGNvbnZlcnQgdGhpcyB0bwotICAgICAgICAjIHNlbGYuYXNzZXJ0UmFpc2VzKC4uLikgZm9ybS4gIFRoZSBhdHRlbXB0IG1heSBvciBtYXkgbm90Ci0gICAgICAgICMgcmFpc2UgUnVudGltZUVycm9yLCBidXQgaXQgc2hvdWxkbid0IHJhaXNlIGFueXRoaW5nIG90aGVyCi0gICAgICAgICMgdGhhbiBSdW50aW1lRXJyb3IsIGFuZCB0aGF0J3MgYWxsIHdlJ3JlIHRyeWluZyB0byB0ZXN0IGhlcmUuCi0gICAgICAgICMgVGhlIE1TIGRvY3MgYXJlbid0IGNsZWFyIGFib3V0IHdoZXRoZXIgdGhlIFNESyBQbGF5U291bmQoKQotICAgICAgICAjIHdpdGggU05EX0FMSUFTIGFuZCBTTkRfTk9ERUZBVUxUIHdpbGwgcmV0dXJuIFRydWUgb3IgRmFsc2Ugd2hlbgotICAgICAgICAjIHRoZSBhbGlhcyBpcyB1bmtub3duLiAgT24gVGltJ3MgV2luWFAgYm94IHRvZGF5LCBpdCByZXR1cm5zCi0gICAgICAgICMgVHJ1ZSAobm8gZXhjZXB0aW9uIGlzIHJhaXNlZCkuICBXaGF0IHdlJ2QgcmVhbGx5IGxpa2UgdG8gdGVzdAotICAgICAgICAjIGlzIHRoYXQgbm8gc291bmQgaXMgcGxheWVkLCBidXQgdGhhdCByZXF1aXJlcyBmaXJzdCB3aXJpbmcgYW4KLSAgICAgICAgIyBlYXJkcnVtIGNsYXNzIGludG8gdW5pdHRlc3QgPHdpbms+LgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoCi0gICAgICAgICAgICAgICAgJyEiJCUmLygjKyonLAotICAgICAgICAgICAgICAgIHdpbnNvdW5kLlNORF9BTElBUyB8IHdpbnNvdW5kLlNORF9OT0RFRkFVTFQKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBhc3NlcnRpbmcgUnVudGltZUVycm9yCisgICAgICAgICAgICAjIHdpbGwgZ2V0IHJhaXNlZDogIHlvdSBjYW5ub3QgY29udmVydCB0aGlzIHRvCisgICAgICAgICAgICAjIHNlbGYuYXNzZXJ0UmFpc2VzKC4uLikgZm9ybS4gIFRoZSBhdHRlbXB0IG1heSBvciBtYXkgbm90CisgICAgICAgICAgICAjIHJhaXNlIFJ1bnRpbWVFcnJvciwgYnV0IGl0IHNob3VsZG4ndCByYWlzZSBhbnl0aGluZyBvdGhlcgorICAgICAgICAgICAgIyB0aGFuIFJ1bnRpbWVFcnJvciwgYW5kIHRoYXQncyBhbGwgd2UncmUgdHJ5aW5nIHRvIHRlc3QKKyAgICAgICAgICAgICMgaGVyZS4gIFRoZSBNUyBkb2NzIGFyZW4ndCBjbGVhciBhYm91dCB3aGV0aGVyIHRoZSBTREsKKyAgICAgICAgICAgICMgUGxheVNvdW5kKCkgd2l0aCBTTkRfQUxJQVMgYW5kIFNORF9OT0RFRkFVTFQgd2lsbCByZXR1cm4KKyAgICAgICAgICAgICMgVHJ1ZSBvciBGYWxzZSB3aGVuIHRoZSBhbGlhcyBpcyB1bmtub3duLiAgT24gVGltJ3MgV2luWFAKKyAgICAgICAgICAgICMgYm94IHRvZGF5LCBpdCByZXR1cm5zIFRydWUgKG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQpLiAgV2hhdAorICAgICAgICAgICAgIyB3ZSdkIHJlYWxseSBsaWtlIHRvIHRlc3QgaXMgdGhhdCBubyBzb3VuZCBpcyBwbGF5ZWQsIGJ1dAorICAgICAgICAgICAgIyB0aGF0IHJlcXVpcmVzIGZpcnN0IHdpcmluZyBhbiBlYXJkcnVtIGNsYXNzIGludG8gdW5pdHRlc3QKKyAgICAgICAgICAgICMgPHdpbms+LgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgJyEiJCUmLygjKyonLAorICAgICAgICAgICAgICAgICAgICB3aW5zb3VuZC5TTkRfQUxJQVMgfCB3aW5zb3VuZC5TTkRfTk9ERUZBVUxUCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgICchIiQlJi8oIysqJywgd2luc291bmQuU05EX0FMSUFTIHwgd2luc291bmQuU05EX05PREVGQVVMVAogICAgICAgICAgICAgKQotICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgotICAgICAgICAgICAgcGFzcwogCiAgICAgZGVmIHRlc3Rfc3RvcGFzeW5jKHNlbGYpOgotICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoCi0gICAgICAgICAgICAnU3lzdGVtUXVlc3Rpb24nLAotICAgICAgICAgICAgd2luc291bmQuU05EX0FMSUFTIHwgd2luc291bmQuU05EX0FTWU5DIHwgd2luc291bmQuU05EX0xPT1AKLSAgICAgICAgKQotICAgICAgICB0aW1lLnNsZWVwKDAuNSkKLSAgICAgICAgdHJ5OgorICAgICAgICBpZiBfaGF2ZV9zb3VuZGNhcmQoKToKICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgKICAgICAgICAgICAgICAgICAnU3lzdGVtUXVlc3Rpb24nLAotICAgICAgICAgICAgICAgIHdpbnNvdW5kLlNORF9BTElBUyB8IHdpbnNvdW5kLlNORF9OT1NUT1AKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5TTkRfQUxJQVMgfCB3aW5zb3VuZC5TTkRfQVNZTkMgfCB3aW5zb3VuZC5TTkRfTE9PUAogICAgICAgICAgICAgKQotICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOiAjIHRoZSBmaXJzdCBzb3VuZCBtaWdodCBhbHJlYWR5IGJlIGZpbmlzaGVkCi0gICAgICAgICAgICBwYXNzCi0gICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZChOb25lLCB3aW5zb3VuZC5TTkRfUFVSR0UpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuNSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoCisgICAgICAgICAgICAgICAgICAgICdTeXN0ZW1RdWVzdGlvbicsCisgICAgICAgICAgICAgICAgICAgIHdpbnNvdW5kLlNORF9BTElBUyB8IHdpbnNvdW5kLlNORF9OT1NUT1AKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6ICMgdGhlIGZpcnN0IHNvdW5kIG1pZ2h0IGFscmVhZHkgYmUgZmluaXNoZWQKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoTm9uZSwgd2luc291bmQuU05EX1BVUkdFKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICBOb25lLCB3aW5zb3VuZC5TTkRfUFVSR0UKKyAgICAgICAgICAgICkKKworCitkZWYgX2dldF9jc2NyaXB0X3BhdGgoKToKKyAgICAiIiJSZXR1cm4gdGhlIGZ1bGwgcGF0aCB0byBjc2NyaXB0LmV4ZSBvciBOb25lLiIiIgorICAgIGZvciBkaXIgaW4gb3MuZW52aXJvbi5nZXQoIlBBVEgiLCAiIikuc3BsaXQob3MucGF0aHNlcCk6CisgICAgICAgIGNzY3JpcHRfcGF0aCA9IG9zLnBhdGguam9pbihkaXIsICJjc2NyaXB0LmV4ZSIpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNzY3JpcHRfcGF0aCk6CisgICAgICAgICAgICByZXR1cm4gY3NjcmlwdF9wYXRoCisKK19faGF2ZV9zb3VuZGNhcmRfY2FjaGUgPSBOb25lCitkZWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgIiIiUmV0dXJuIFRydWUgaWZmIHRoaXMgY29tcHV0ZXIgaGFzIGEgc291bmRjYXJkLiIiIgorICAgIGdsb2JhbCBfX2hhdmVfc291bmRjYXJkX2NhY2hlCisgICAgaWYgX19oYXZlX3NvdW5kY2FyZF9jYWNoZSBpcyBOb25lOgorICAgICAgICBjc2NyaXB0X3BhdGggPSBfZ2V0X2NzY3JpcHRfcGF0aCgpCisgICAgICAgIGlmIGNzY3JpcHRfcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgIyBDb3VsZCBub3QgZmluZCBjc2NyaXB0LmV4ZSB0byBydW4gb3VyIFZCU2NyaXB0IGhlbHBlci4gRGVmYXVsdAorICAgICAgICAgICAgIyB0byBUcnVlOiBtb3N0IGNvbXB1dGVycyB0aGVzZSBkYXlzICpkbyogaGF2ZSBhIHNvdW5kY2FyZC4KKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgY2hlY2tfc2NyaXB0ID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tfc291bmRjYXJkLnZicyIpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtjc2NyaXB0X3BhdGgsIGNoZWNrX3NjcmlwdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIF9faGF2ZV9zb3VuZGNhcmRfY2FjaGUgPSBub3QgcC53YWl0KCkKKyAgICByZXR1cm4gX19oYXZlX3NvdW5kY2FyZF9jYWNoZQorCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJlZXBUZXN0LCBNZXNzYWdlQmVlcFRlc3QsIFBsYXlTb3VuZFRlc3QpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dpdGgucHkgYi9MaWIvdGVzdC90ZXN0X3dpdGgucHkKaW5kZXggNDg1NDQzNi4uNDhlMDBmNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93aXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQpAQCAtNDk0LDYgKzQ5NCw2MiBAQAogICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNXaXRoRXJyb3Ioc2VsZi5mb28pCiAgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c05vRXJyb3Ioc2VsZi5iYXIpCiAKKyAgICBkZWYgdGVzdFJhaXNlZFN0b3BJdGVyYXRpb24xKHNlbGYpOgorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIGNtKCk6CisgICAgICAgICAgICB5aWVsZAorCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBjbSgpOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oImZyb20gd2l0aCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgc2hvdWxkVGhyb3cpCisKKyAgICBkZWYgdGVzdFJhaXNlZFN0b3BJdGVyYXRpb24yKHNlbGYpOgorICAgICAgICBjbGFzcyBjbSAob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggY20oKToKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCJmcm9tIHdpdGgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHNob3VsZFRocm93KQorCisgICAgZGVmIHRlc3RSYWlzZWRHZW5lcmF0b3JFeGl0MShzZWxmKToKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBjbSgpOgorICAgICAgICAgICAgeWllbGQKKworICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggY20oKToKKyAgICAgICAgICAgICAgICByYWlzZSBHZW5lcmF0b3JFeGl0KCJmcm9tIHdpdGgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEdlbmVyYXRvckV4aXQsIHNob3VsZFRocm93KQorCisgICAgZGVmIHRlc3RSYWlzZWRHZW5lcmF0b3JFeGl0MihzZWxmKToKKyAgICAgICAgY2xhc3MgY20gKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19jb250ZXh0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIGNtKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgR2VuZXJhdG9yRXhpdCgiZnJvbSB3aXRoIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhHZW5lcmF0b3JFeGl0LCBzaG91bGRUaHJvdykKKwogCiBjbGFzcyBOb25Mb2NhbEZsb3dDb250cm9sVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3hyYW5nZS5weSBiL0xpYi90ZXN0L3Rlc3RfeHJhbmdlLnB5CmluZGV4IDQwNTkwY2QuLmMwZDFkYmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeHJhbmdlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfeHJhbmdlLnB5CkBAIC01NywxMiArNTcsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB4cmFuZ2UsIDAsIDIqc3lzLm1heGludCkKIAogICAgICAgICByID0geHJhbmdlKC1zeXMubWF4aW50LCBzeXMubWF4aW50LCAyKQotICAgICAgICBpZiBzeXMubWF4aW50ID4gMHg3ZmZmZmZmZjoKLSAgICAgICAgICAgICMgWFhYIHJhaXNpbmcgVmFsdWVFcnJvciBpcyBsZXNzIHRoYW4gaWRlYWwsIGJ1dCB0aGlzIGNhbid0Ci0gICAgICAgICAgICAjIGJlIGZpeGVkIHVudGlsIHJhbmdlX2xlbmd0aCgpIHJldHVybnMgYSBsb25nIGluIHJhbmdlb2JqZWN0LmMKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxlbiwgcikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHIpLCBzeXMubWF4aW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyKSwgc3lzLm1heGludCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgeHJhbmdlLCAtc3lzLm1heGludC0xLCBzeXMubWF4aW50LCAyKQogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5CmluZGV4IGViN2NiZjYuLjRlMWE4NDUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5CkBAIC0xMiw3ICsxMiwxMiBAQAogZnJvbSB0ZXN0LnRlc3RfaW1wb3J0aG9va3MgaW1wb3J0IEltcG9ydEhvb2tzQmFzZVRlc3RDYXNlLCB0ZXN0X3NyYywgdGVzdF9jbwogCiBpbXBvcnQgemlwaW1wb3J0Ci0KK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCBkb2N0ZXN0CitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IFN0cmluZ0lPCitmcm9tIHRyYWNlYmFjayBpbXBvcnQgZXh0cmFjdF90YiwgZXh0cmFjdF9zdGFjaywgcHJpbnRfdGIKK3JhaXNlX3NyYyA9ICdkZWYgZG9fcmFpc2UoKTogcmFpc2UgVHlwZUVycm9yXG4nCiAKICMgc28gd2Ugb25seSBydW4gdGVzdEFGYWtlWmxpYiBvbmNlIGlmIHRoaXMgdGVzdCBpcyBydW4gcmVwZWF0ZWRseQogIyB3aGljaCBoYXBwZW5zIHdoZW4gd2UgbG9vayBmb3IgcmVmIGxlYWtzCkBAIC01NCw3ICs1OSw4IEBACiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgICMgV2UncmUgcmV1c2luZyB0aGUgemlwIGFyY2hpdmUgcGF0aCwgc28gd2UgbXVzdCBjbGVhciB0aGUKLSAgICAgICAgIyBjYWNoZWQgZGlyZWN0b3J5IGluZm8uCisgICAgICAgICMgY2FjaGVkIGRpcmVjdG9yeSBpbmZvIGFuZCBsaW5lY2FjaGUKKyAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQogICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY2xlYXIoKQogICAgICAgICBJbXBvcnRIb29rc0Jhc2VUZXN0Q2FzZS5zZXRVcChzZWxmKQogCkBAIC04Myw2ICs4OSwxMSBAQAogCiAgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKCIuIi5qb2luKG1vZHVsZXMpLCBnbG9iYWxzKCksIGxvY2FscygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl9fZHVtbXlfXyJdKQorCisgICAgICAgICAgICBjYWxsID0ga3cuZ2V0KCdjYWxsJykKKyAgICAgICAgICAgIGlmIGNhbGwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY2FsbChtb2QpCisKICAgICAgICAgICAgIGlmIGV4cGVjdGVkX2V4dDoKICAgICAgICAgICAgICAgICBmaWxlID0gbW9kLmdldF9maWxlKCkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmaWxlLCBvcy5wYXRoLmpvaW4oVEVNUF9aSVAsCkBAIC0yNDksNiArMjYwLDc0IEBACiAgICAgICAgIHNlbGYuZG9UZXN0KCIucHkiLCBmaWxlcywgVEVTVE1PRCwKICAgICAgICAgICAgICAgICAgICAgc3R1ZmY9IlNvbWUgU3R1ZmYiKjMxKQogCisgICAgZGVmIGFzc2VydE1vZHVsZVNvdXJjZShzZWxmLCBtb2R1bGUpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlKG1vZHVsZSksIHRlc3Rfc3JjKQorCisgICAgZGVmIHRlc3RHZXRTb3VyY2Uoc2VsZik6CisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgdGVzdF9zcmMpfQorICAgICAgICBzZWxmLmRvVGVzdCgiLnB5IiwgZmlsZXMsIFRFU1RNT0QsIGNhbGw9c2VsZi5hc3NlcnRNb2R1bGVTb3VyY2UpCisKKyAgICBkZWYgdGVzdEdldENvbXBpbGVkU291cmNlKHNlbGYpOgorICAgICAgICBweWMgPSBtYWtlX3B5Yyhjb21waWxlKHRlc3Rfc3JjLCAiPD8/Pz4iLCAiZXhlYyIpLCBOT1cpCisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgdGVzdF9zcmMpLAorICAgICAgICAgICAgICAgICBURVNUTU9EICsgcHljX2V4dDogKE5PVywgcHljKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QocHljX2V4dCwgZmlsZXMsIFRFU1RNT0QsIGNhbGw9c2VsZi5hc3NlcnRNb2R1bGVTb3VyY2UpCisKKyAgICBkZWYgcnVuRG9jdGVzdChzZWxmLCBjYWxsYmFjayk6CisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgdGVzdF9zcmMpLAorICAgICAgICAgICAgICAgICAieHl6LnR4dCI6IChOT1csICI+Pj4gbG9nLmFwcGVuZChUcnVlKVxuIil9CisgICAgICAgIHNlbGYuZG9UZXN0KCIucHkiLCBmaWxlcywgVEVTVE1PRCwgY2FsbD1jYWxsYmFjaykKKworICAgIGRlZiBkb0RvY3Rlc3RGaWxlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIGxvZyA9IFtdCisgICAgICAgIG9sZF9tYXN0ZXIsIGRvY3Rlc3QubWFzdGVyID0gZG9jdGVzdC5tYXN0ZXIsIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZG9jdGVzdC50ZXN0ZmlsZSgKKyAgICAgICAgICAgICAgICAneHl6LnR4dCcsIHBhY2thZ2U9bW9kdWxlLCBtb2R1bGVfcmVsYXRpdmU9VHJ1ZSwKKyAgICAgICAgICAgICAgICBnbG9icz1sb2NhbHMoKQorICAgICAgICAgICAgKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZG9jdGVzdC5tYXN0ZXIgPSBvbGRfbWFzdGVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nLFtUcnVlXSkKKworICAgIGRlZiB0ZXN0RG9jdGVzdEZpbGUoc2VsZik6CisgICAgICAgIHNlbGYucnVuRG9jdGVzdChzZWxmLmRvRG9jdGVzdEZpbGUpCisKKyAgICBkZWYgZG9Eb2N0ZXN0U3VpdGUoc2VsZiwgbW9kdWxlKToKKyAgICAgICAgbG9nID0gW10KKyAgICAgICAgZG9jdGVzdC5Eb2NGaWxlVGVzdCgKKyAgICAgICAgICAgICd4eXoudHh0JywgcGFja2FnZT1tb2R1bGUsIG1vZHVsZV9yZWxhdGl2ZT1UcnVlLAorICAgICAgICAgICAgZ2xvYnM9bG9jYWxzKCkKKyAgICAgICAgKS5ydW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZyxbVHJ1ZV0pCisKKyAgICBkZWYgdGVzdERvY3Rlc3RTdWl0ZShzZWxmKToKKyAgICAgICAgc2VsZi5ydW5Eb2N0ZXN0KHNlbGYuZG9Eb2N0ZXN0U3VpdGUpCisKKworICAgIGRlZiBkb1RyYWNlYmFjayhzZWxmLCBtb2R1bGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2R1bGUuZG9fcmFpc2UoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpWzJdLnRiX25leHQKKworICAgICAgICAgICAgZixsbm8sbixsaW5lID0gZXh0cmFjdF90Yih0YiwgMSlbMF0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgcmFpc2Vfc3JjLnN0cmlwKCkpCisKKyAgICAgICAgICAgIGYsbG5vLG4sbGluZSA9IGV4dHJhY3Rfc3RhY2sodGIudGJfZnJhbWUsIDEpWzBdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIHJhaXNlX3NyYy5zdHJpcCgpKQorCisgICAgICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgcHJpbnRfdGIodGIsIDEsIHMpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5nZXR2YWx1ZSgpLmVuZHN3aXRoKHJhaXNlX3NyYykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVGhpcyBvdWdodCB0byBiZSBpbXBvc3NpYmxlIikKKworICAgIGRlZiB0ZXN0VHJhY2ViYWNrKHNlbGYpOgorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgIi5weSI6IChOT1csIHJhaXNlX3NyYyl9CisgICAgICAgIHNlbGYuZG9UZXN0KE5vbmUsIGZpbGVzLCBURVNUTU9ELCBjYWxsPXNlbGYuZG9UcmFjZWJhY2spCisKKwogY2xhc3MgQ29tcHJlc3NlZFppcEltcG9ydFRlc3RDYXNlKFVuY29tcHJlc3NlZFppcEltcG9ydFRlc3RDYXNlKToKICAgICBjb21wcmVzc2lvbiA9IFpJUF9ERUZMQVRFRAogCmRpZmYgLS1naXQgYS9MaWIvdG9rZW5pemUucHkgYi9MaWIvdG9rZW5pemUucHkKaW5kZXggMmI0MGU2Zi4uYTMwNzkxYyAxMDA2NDQKLS0tIGEvTGliL3Rva2VuaXplLnB5CisrKyBiL0xpYi90b2tlbml6ZS5weQpAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgZm9yIHRvayBpbiBpdGVyYWJsZToKICAgICAgICAgdG9rbnVtLCB0b2t2YWwgPSB0b2tbOjJdCiAKLSAgICAgICAgaWYgdG9rbnVtID09IE5BTUU6CisgICAgICAgIGlmIHRva251bSBpbiAoTkFNRSwgTlVNQkVSKToKICAgICAgICAgICAgIHRva3ZhbCArPSAnICcKIAogICAgICAgICBpZiB0b2tudW0gPT0gSU5ERU5UOgpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlYmFjay5weSBiL0xpYi90cmFjZWJhY2sucHkKaW5kZXggOTNhNjRiNy4uYWJkYTQyMiAxMDA2NDQKLS0tIGEvTGliL3RyYWNlYmFjay5weQorKysgYi9MaWIvdHJhY2ViYWNrLnB5CkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgIF9wcmludChmaWxlLAogICAgICAgICAgICAgICAgJyAgRmlsZSAiJXMiLCBsaW5lICVkLCBpbiAlcycgJSAoZmlsZW5hbWUsbGluZW5vLG5hbWUpKQogICAgICAgICBsaW5lY2FjaGUuY2hlY2tjYWNoZShmaWxlbmFtZSkKLSAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vLCBmLmZfZ2xvYmFscykKICAgICAgICAgaWYgbGluZTogX3ByaW50KGZpbGUsICcgICAgJyArIGxpbmUuc3RyaXAoKSkKICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CiAgICAgICAgIG4gPSBuKzEKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgZmlsZW5hbWUgPSBjby5jb19maWxlbmFtZQogICAgICAgICBuYW1lID0gY28uY29fbmFtZQogICAgICAgICBsaW5lY2FjaGUuY2hlY2tjYWNoZShmaWxlbmFtZSkKLSAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vLCBmLmZfZ2xvYmFscykKICAgICAgICAgaWYgbGluZTogbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICBlbHNlOiBsaW5lID0gTm9uZQogICAgICAgICBsaXN0LmFwcGVuZCgoZmlsZW5hbWUsIGxpbmVubywgbmFtZSwgbGluZSkpCkBAIC0xNTgsMTQgKzE1OCwxNCBAQAogICAgICIiIgogICAgIGxpc3QgPSBbXQogICAgIGlmICh0eXBlKGV0eXBlKSA9PSB0eXBlcy5DbGFzc1R5cGUKLSAgICAgICAgb3IgaXNzdWJjbGFzcyhldHlwZSwgRXhjZXB0aW9uKSk6CisgICAgICAgIG9yIChpc2luc3RhbmNlKGV0eXBlLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyhldHlwZSwgRXhjZXB0aW9uKSkpOgogICAgICAgICBzdHlwZSA9IGV0eXBlLl9fbmFtZV9fCiAgICAgZWxzZToKICAgICAgICAgc3R5cGUgPSBldHlwZQogICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgIGxpc3QuYXBwZW5kKHN0cihzdHlwZSkgKyAnXG4nKQogICAgIGVsc2U6Ci0gICAgICAgIGlmIGV0eXBlIGlzIFN5bnRheEVycm9yOgorICAgICAgICBpZiBpc3N1YmNsYXNzKGV0eXBlLCBTeW50YXhFcnJvcik6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgbXNnLCAoZmlsZW5hbWUsIGxpbmVubywgb2Zmc2V0LCBsaW5lKSA9IHZhbHVlCiAgICAgICAgICAgICBleGNlcHQ6CkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgZmlsZW5hbWUgPSBjby5jb19maWxlbmFtZQogICAgICAgICBuYW1lID0gY28uY29fbmFtZQogICAgICAgICBsaW5lY2FjaGUuY2hlY2tjYWNoZShmaWxlbmFtZSkKLSAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vLCBmLmZfZ2xvYmFscykKICAgICAgICAgaWYgbGluZTogbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICBlbHNlOiBsaW5lID0gTm9uZQogICAgICAgICBsaXN0LmFwcGVuZCgoZmlsZW5hbWUsIGxpbmVubywgbmFtZSwgbGluZSkpCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliLnB5IGIvTGliL3VybGxpYi5weQppbmRleCAxMzZmNDJlLi5kNjVjMGIwIDEwMDY0NAotLS0gYS9MaWIvdXJsbGliLnB5CisrKyBiL0xpYi91cmxsaWIucHkKQEAgLTQ0Miw5ICs0NDIsOSBAQAogICAgICAgICByZXR1cm4gYWRkaW5mb3VybChmcCwgbm9oZWFkZXJzKCksICJnb3BoZXI6IiArIHVybCkKIAogICAgIGRlZiBvcGVuX2ZpbGUoc2VsZiwgdXJsKToKKyAgICAgICAgIiIiVXNlIGxvY2FsIGZpbGUgb3IgRlRQIGRlcGVuZGluZyBvbiBmb3JtIG9mIFVSTC4iIiIKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodXJsLCBzdHIpOgogICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgKCdmaWxlIGVycm9yJywgJ3Byb3h5IHN1cHBvcnQgZm9yIGZpbGUgcHJvdG9jb2wgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCcpCi0gICAgICAgICIiIlVzZSBsb2NhbCBmaWxlIG9yIEZUUCBkZXBlbmRpbmcgb24gZm9ybSBvZiBVUkwuIiIiCiAgICAgICAgIGlmIHVybFs6Ml0gPT0gJy8vJyBhbmQgdXJsWzI6M10gIT0gJy8nIGFuZCB1cmxbMjoxMl0ubG93ZXIoKSAhPSAnbG9jYWxob3N0Lyc6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuX2Z0cCh1cmwpCiAgICAgICAgIGVsc2U6CkBAIC0xMDMyLDcgKzEwMzIsNyBAQAogICAgIGdsb2JhbCBfaG9zdHByb2cKICAgICBpZiBfaG9zdHByb2cgaXMgTm9uZToKICAgICAgICAgaW1wb3J0IHJlCi0gICAgICAgIF9ob3N0cHJvZyA9IHJlLmNvbXBpbGUoJ14vLyhbXi9dKikoLiopJCcpCisgICAgICAgIF9ob3N0cHJvZyA9IHJlLmNvbXBpbGUoJ14vLyhbXi8/XSopKC4qKSQnKQogCiAgICAgbWF0Y2ggPSBfaG9zdHByb2cubWF0Y2godXJsKQogICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIyLnB5IGIvTGliL3VybGxpYjIucHkKaW5kZXggNGM4M2JmYy4uZWMwMWM4ZiAxMDA2NDQKLS0tIGEvTGliL3VybGxpYjIucHkKKysrIGIvTGliL3VybGxpYjIucHkKQEAgLTE0LDcgKzE0LDcgQEAKIEhUVFAgMzAxLCAzMDIsIDMwMyBhbmQgMzA3IHJlZGlyZWN0IGVycm9ycywgYW5kIHRoZSBIVFRQRGlnZXN0QXV0aEhhbmRsZXIKIGRlYWxzIHdpdGggZGlnZXN0IGF1dGhlbnRpY2F0aW9uLgogCi11cmxvcGVuKHVybCwgZGF0YT1Ob25lKSAtLSBiYXNpYyB1c2FnZSBpcyB0aGF0IHNhbWUgYXMgb3JpZ2luYWwKK3VybG9wZW4odXJsLCBkYXRhPU5vbmUpIC0tIGJhc2ljIHVzYWdlIGlzIHRoZSBzYW1lIGFzIG9yaWdpbmFsCiB1cmxsaWIuICBwYXNzIHRoZSB1cmwgYW5kIG9wdGlvbmFsbHkgZGF0YSB0byBwb3N0IHRvIGFuIEhUVFAgVVJMLCBhbmQKIGdldCBhIGZpbGUtbGlrZSBvYmplY3QgYmFjay4gIE9uZSBkaWZmZXJlbmNlIGlzIHRoYXQgeW91IGNhbiBhbHNvIHBhc3MKIGEgUmVxdWVzdCBpbnN0YW5jZSBpbnN0ZWFkIG9mIFVSTC4gIFJhaXNlcyBhIFVSTEVycm9yIChzdWJjbGFzcyBvZgpAQCAtNzcsMTYgKzc3LDEzIEBACiAjIHRoZSBoYW5kbGVyIGtub3dzIHRoYXQgdGhlIHByb2JsZW0gd2FzLCBlLmcuLCB0aGF0IGl0IGRpZG4ndCBrbm93CiAjIHRoYXQgaGFzaCBhbGdvIHRoYXQgcmVxdWVzdGVkIGluIHRoZSBjaGFsbGVuZ2UsIGl0IHdvdWxkIGJlIGdvb2QgdG8KICMgcGFzcyB0aGF0IGluZm9ybWF0aW9uIGFsb25nIHRvIHRoZSBjbGllbnQsIHRvby4KLQotIyBYWFggdG8gZG86Ci0jIG5hbWUhCi0jIGRvY3VtZW50YXRpb24gKGdldHRpbmcgdGhlcmUpCi0jIGNvbXBsZXggcHJveGllcwotIyBhYnN0cmFjdCBmYWN0b3J5IGZvciBvcGVuZXIKICMgZnRwIGVycm9ycyBhcmVuJ3QgaGFuZGxlZCBjbGVhbmx5Ci0jIGdvcGhlciBjYW4gcmV0dXJuIGEgc29ja2V0LmVycm9yCiAjIGNoZWNrIGRpZ2VzdCBhZ2FpbnN0IGNvcnJlY3QgKGkuZS4gbm9uLWFwYWNoZSkgaW1wbGVtZW50YXRpb24KIAorIyBQb3NzaWJsZSBleHRlbnNpb25zOgorIyBjb21wbGV4IHByb3hpZXMgIFhYWCBub3Qgc3VyZSB3aGF0IGV4YWN0bHkgd2FzIG1lYW50IGJ5IHRoaXMKKyMgYWJzdHJhY3QgZmFjdG9yeSBmb3Igb3BlbmVyCisKIGltcG9ydCBiYXNlNjQKIGltcG9ydCBmdHBsaWIKIGltcG9ydCBodHRwbGliCkBAIC0xMTEsMTUgKzEwOCwxNSBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAKLSMgbm90IHN1cmUgaG93IG1hbnkgb2YgdGhlc2UgbmVlZCB0byBiZSBnb3R0ZW4gcmlkIG9mCi1mcm9tIHVybGxpYiBpbXBvcnQgKHVud3JhcCwgdW5xdW90ZSwgc3BsaXR0eXBlLCBzcGxpdGhvc3QsCitmcm9tIHVybGxpYiBpbXBvcnQgKHVud3JhcCwgdW5xdW90ZSwgc3BsaXR0eXBlLCBzcGxpdGhvc3QsIHF1b3RlLAogICAgICBhZGRpbmZvdXJsLCBzcGxpdHBvcnQsIHNwbGl0Z29waGVydHlwZSwgc3BsaXRxdWVyeSwKICAgICAgc3BsaXRhdHRyLCBmdHB3cmFwcGVyLCBub2hlYWRlcnMsIHNwbGl0dXNlciwgc3BsaXRwYXNzd2QsIHNwbGl0dmFsdWUpCiAKICMgc3VwcG9ydCBmb3IgRmlsZUhhbmRsZXIsIHByb3hpZXMgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcwogZnJvbSB1cmxsaWIgaW1wb3J0IGxvY2FsaG9zdCwgdXJsMnBhdGhuYW1lLCBnZXRwcm94aWVzCiAKLV9fdmVyc2lvbl9fID0gIjIuNCIKKyMgdXNlZCBpbiBVc2VyLUFnZW50IGhlYWRlciBzZW50CitfX3ZlcnNpb25fXyA9IHN5cy52ZXJzaW9uWzozXQogCiBfb3BlbmVyID0gTm9uZQogZGVmIHVybG9wZW4odXJsLCBkYXRhPU5vbmUpOgpAQCAtMzMwLDggKzMyNyw5IEBACiAgICAgICAgIHBhc3MKIAogICAgIGRlZiBfY2FsbF9jaGFpbihzZWxmLCBjaGFpbiwga2luZCwgbWV0aF9uYW1lLCAqYXJncyk6Ci0gICAgICAgICMgWFhYIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBubyBvbmUgZWxzZSBzaG91bGQgdHJ5IHRvIGhhbmRsZQotICAgICAgICAjIHRoaXMgdXJsLiAgcmV0dXJuIE5vbmUgaWYgeW91IGNhbid0IGJ1dCBzb21lb25lIGVsc2UgY291bGQuCisgICAgICAgICMgSGFuZGxlcnMgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIG5vIG9uZSBlbHNlIHNob3VsZCB0cnkgdG8gaGFuZGxlCisgICAgICAgICMgdGhlIHJlcXVlc3QsIG9yIHJldHVybiBOb25lIGlmIHRoZXkgY2FuJ3QgYnV0IGFub3RoZXIgaGFuZGxlcgorICAgICAgICAjIGNvdWxkLiAgT3RoZXJ3aXNlLCB0aGV5IHJldHVybiB0aGUgcmVzcG9uc2UuCiAgICAgICAgIGhhbmRsZXJzID0gY2hhaW4uZ2V0KGtpbmQsICgpKQogICAgICAgICBmb3IgaGFuZGxlciBpbiBoYW5kbGVyczoKICAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKGhhbmRsZXIsIG1ldGhfbmFtZSkKQEAgLTUwNyw2ICs1MDUsOCBAQAogICAgICAgICAgICAgIyBmcm9tIHRoZSB1c2VyIChvZiB1cmxsaWIyLCBpbiB0aGlzIGNhc2UpLiAgSW4gcHJhY3RpY2UsCiAgICAgICAgICAgICAjIGVzc2VudGlhbGx5IGFsbCBjbGllbnRzIGRvIHJlZGlyZWN0IGluIHRoaXMgY2FzZSwgc28gd2UKICAgICAgICAgICAgICMgZG8gdGhlIHNhbWUuCisgICAgICAgICAgICAjIGJlIGNvbmNpbGlhbnQgd2l0aCBVUklzIGNvbnRhaW5pbmcgYSBzcGFjZQorICAgICAgICAgICAgbmV3dXJsID0gbmV3dXJsLnJlcGxhY2UoJyAnLCAnJTIwJykKICAgICAgICAgICAgIHJldHVybiBSZXF1ZXN0KG5ld3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9cmVxLmhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5fcmVxX2hvc3Q9cmVxLmdldF9vcmlnaW5fcmVxX2hvc3QoKSwKQEAgLTU2MSw2ICs1NjEsODAgQEAKICAgICAgICAgICAgICAgImxlYWQgdG8gYW4gaW5maW5pdGUgbG9vcC5cbiIgXAogICAgICAgICAgICAgICAiVGhlIGxhc3QgMzB4IGVycm9yIG1lc3NhZ2Ugd2FzOlxuIgogCisKK2RlZiBfcGFyc2VfcHJveHkocHJveHkpOgorICAgICIiIlJldHVybiAoc2NoZW1lLCB1c2VyLCBwYXNzd29yZCwgaG9zdC9wb3J0KSBnaXZlbiBhIFVSTCBvciBhbiBhdXRob3JpdHkuCisKKyAgICBJZiBhIFVSTCBpcyBzdXBwbGllZCwgaXQgbXVzdCBoYXZlIGFuIGF1dGhvcml0eSAoaG9zdDpwb3J0KSBjb21wb25lbnQuCisgICAgQWNjb3JkaW5nIHRvIFJGQyAzOTg2LCBoYXZpbmcgYW4gYXV0aG9yaXR5IGNvbXBvbmVudCBtZWFucyB0aGUgVVJMIG11c3QKKyAgICBoYXZlIHR3byBzbGFzaGVzIGFmdGVyIHRoZSBzY2hlbWU6CisKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdmaWxlOi9mdHAuZXhhbXBsZS5jb20vJykKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVmFsdWVFcnJvcjogcHJveHkgVVJMIHdpdGggbm8gYXV0aG9yaXR5OiAnZmlsZTovZnRwLmV4YW1wbGUuY29tLycKKworICAgIFRoZSBmaXJzdCB0aHJlZSBpdGVtcyBvZiB0aGUgcmV0dXJuZWQgdHVwbGUgbWF5IGJlIE5vbmUuCisKKyAgICBFeGFtcGxlcyBvZiBhdXRob3JpdHkgcGFyc2luZzoKKworICAgID4+PiBfcGFyc2VfcHJveHkoJ3Byb3h5LmV4YW1wbGUuY29tJykKKyAgICAoTm9uZSwgTm9uZSwgTm9uZSwgJ3Byb3h5LmV4YW1wbGUuY29tJykKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKyAgICAoTm9uZSwgTm9uZSwgTm9uZSwgJ3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorCisgICAgVGhlIGF1dGhvcml0eSBjb21wb25lbnQgbWF5IG9wdGlvbmFsbHkgaW5jbHVkZSB1c2VyaW5mbyAoYXNzdW1lZCB0byBiZQorICAgIHVzZXJuYW1lOnBhc3N3b3JkKToKKworICAgID4+PiBfcGFyc2VfcHJveHkoJ2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbScpCisgICAgKE5vbmUsICdqb2UnLCAncGFzc3dvcmQnLCAncHJveHkuZXhhbXBsZS5jb20nKQorICAgID4+PiBfcGFyc2VfcHJveHkoJ2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKyAgICAoTm9uZSwgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKworICAgIFNhbWUgZXhhbXBsZXMsIGJ1dCB3aXRoIFVSTHMgaW5zdGVhZDoKKworICAgID4+PiBfcGFyc2VfcHJveHkoJ2h0dHA6Ly9wcm94eS5leGFtcGxlLmNvbS8nKQorICAgICgnaHR0cCcsIE5vbmUsIE5vbmUsICdwcm94eS5leGFtcGxlLmNvbScpCisgICAgPj4+IF9wYXJzZV9wcm94eSgnaHR0cDovL3Byb3h5LmV4YW1wbGUuY29tOjMxMjgvJykKKyAgICAoJ2h0dHAnLCBOb25lLCBOb25lLCAncHJveHkuZXhhbXBsZS5jb206MzEyOCcpCisgICAgPj4+IF9wYXJzZV9wcm94eSgnaHR0cDovL2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbS8nKQorICAgICgnaHR0cCcsICdqb2UnLCAncGFzc3dvcmQnLCAncHJveHkuZXhhbXBsZS5jb20nKQorICAgID4+PiBfcGFyc2VfcHJveHkoJ2h0dHA6Ly9qb2U6cGFzc3dvcmRAcHJveHkuZXhhbXBsZS5jb206MzEyOCcpCisgICAgKCdodHRwJywgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKworICAgIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGF1dGhvcml0eSBpcyBpZ25vcmVkOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgnZnRwOi8vam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tL3J1YmJpc2g6MzEyOCcpCisgICAgKCdmdHAnLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tJykKKworICAgIFRlc3QgZm9yIG5vIHRyYWlsaW5nICcvJyBjYXNlOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgnaHR0cDovL2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbScpCisgICAgKCdodHRwJywgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbScpCisKKyAgICAiIiIKKyAgICBmcm9tIHVybHBhcnNlIGltcG9ydCBfc3BsaXRuZXRsb2MKKyAgICBzY2hlbWUsIHJfc2NoZW1lID0gc3BsaXR0eXBlKHByb3h5KQorICAgIGlmIG5vdCByX3NjaGVtZS5zdGFydHN3aXRoKCIvIik6CisgICAgICAgICMgYXV0aG9yaXR5CisgICAgICAgIHNjaGVtZSA9IE5vbmUKKyAgICAgICAgYXV0aG9yaXR5ID0gcHJveHkKKyAgICBlbHNlOgorICAgICAgICAjIFVSTAorICAgICAgICBpZiBub3Qgcl9zY2hlbWUuc3RhcnRzd2l0aCgiLy8iKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInByb3h5IFVSTCB3aXRoIG5vIGF1dGhvcml0eTogJXIiICUgcHJveHkpCisgICAgICAgICMgV2UgaGF2ZSBhbiBhdXRob3JpdHksIHNvIGZvciBSRkMgMzk4Ni1jb21wbGlhbnQgVVJMcyAoYnkgc3MgMy4KKyAgICAgICAgIyBhbmQgMy4zLiksIHBhdGggaXMgZW1wdHkgb3Igc3RhcnRzIHdpdGggJy8nCisgICAgICAgIGVuZCA9IHJfc2NoZW1lLmZpbmQoIi8iLCAyKQorICAgICAgICBpZiBlbmQgPT0gLTE6CisgICAgICAgICAgICBlbmQgPSBOb25lCisgICAgICAgIGF1dGhvcml0eSA9IHJfc2NoZW1lWzI6ZW5kXQorICAgIHVzZXJpbmZvLCBob3N0cG9ydCA9IHNwbGl0dXNlcihhdXRob3JpdHkpCisgICAgaWYgdXNlcmluZm8gaXMgbm90IE5vbmU6CisgICAgICAgIHVzZXIsIHBhc3N3b3JkID0gc3BsaXRwYXNzd2QodXNlcmluZm8pCisgICAgZWxzZToKKyAgICAgICAgdXNlciA9IHBhc3N3b3JkID0gTm9uZQorICAgIHJldHVybiBzY2hlbWUsIHVzZXIsIHBhc3N3b3JkLCBob3N0cG9ydAorCiBjbGFzcyBQcm94eUhhbmRsZXIoQmFzZUhhbmRsZXIpOgogICAgICMgUHJveGllcyBtdXN0IGJlIGluIGZyb250CiAgICAgaGFuZGxlcl9vcmRlciA9IDEwMApAQCAtNTc3LDc2ICs2NTEsMjcgQEAKIAogICAgIGRlZiBwcm94eV9vcGVuKHNlbGYsIHJlcSwgcHJveHksIHR5cGUpOgogICAgICAgICBvcmlnX3R5cGUgPSByZXEuZ2V0X3R5cGUoKQotICAgICAgICB0eXBlLCByX3R5cGUgPSBzcGxpdHR5cGUocHJveHkpCi0gICAgICAgIGlmIG5vdCB0eXBlIG9yIHJfdHlwZS5pc2RpZ2l0KCk6Ci0gICAgICAgICAgICAjIHByb3h5IGlzIHNwZWNpZmllZCB3aXRob3V0IHByb3RvY29sCi0gICAgICAgICAgICB0eXBlID0gb3JpZ190eXBlCi0gICAgICAgICAgICBob3N0ID0gcHJveHkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGhvc3QsIHJfaG9zdCA9IHNwbGl0aG9zdChyX3R5cGUpCi0gICAgICAgIHVzZXJfcGFzcywgaG9zdCA9IHNwbGl0dXNlcihob3N0KQotICAgICAgICB1c2VyLCBwYXNzd29yZCA9IHNwbGl0cGFzc3dkKHVzZXJfcGFzcykKKyAgICAgICAgcHJveHlfdHlwZSwgdXNlciwgcGFzc3dvcmQsIGhvc3Rwb3J0ID0gX3BhcnNlX3Byb3h5KHByb3h5KQorICAgICAgICBpZiBwcm94eV90eXBlIGlzIE5vbmU6CisgICAgICAgICAgICBwcm94eV90eXBlID0gb3JpZ190eXBlCiAgICAgICAgIGlmIHVzZXIgYW5kIHBhc3N3b3JkOgotICAgICAgICAgICAgdXNlciwgcGFzc3dvcmQgPSB1c2VyX3Bhc3Muc3BsaXQoJzonLCAxKQotICAgICAgICAgICAgdXNlcl9wYXNzID0gYmFzZTY0LmVuY29kZXN0cmluZygnJXM6JXMnICUgKHVucXVvdGUodXNlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucXVvdGUocGFzc3dvcmQpKSkuc3RyaXAoKQotICAgICAgICAgICAgcmVxLmFkZF9oZWFkZXIoJ1Byb3h5LWF1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIHVzZXJfcGFzcykKLSAgICAgICAgaG9zdCA9IHVucXVvdGUoaG9zdCkKLSAgICAgICAgcmVxLnNldF9wcm94eShob3N0LCB0eXBlKQotICAgICAgICBpZiBvcmlnX3R5cGUgPT0gdHlwZToKKyAgICAgICAgICAgIHVzZXJfcGFzcyA9ICclczolcycgJSAodW5xdW90ZSh1c2VyKSwgdW5xdW90ZShwYXNzd29yZCkpCisgICAgICAgICAgICBjcmVkcyA9IGJhc2U2NC5lbmNvZGVzdHJpbmcodXNlcl9wYXNzKS5zdHJpcCgpCisgICAgICAgICAgICByZXEuYWRkX2hlYWRlcignUHJveHktYXV0aG9yaXphdGlvbicsICdCYXNpYyAnICsgY3JlZHMpCisgICAgICAgIGhvc3Rwb3J0ID0gdW5xdW90ZShob3N0cG9ydCkKKyAgICAgICAgcmVxLnNldF9wcm94eShob3N0cG9ydCwgcHJveHlfdHlwZSkKKyAgICAgICAgaWYgb3JpZ190eXBlID09IHByb3h5X3R5cGU6CiAgICAgICAgICAgICAjIGxldCBvdGhlciBoYW5kbGVycyB0YWtlIGNhcmUgb2YgaXQKLSAgICAgICAgICAgICMgWFhYIHRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB0aGUgcHJveHkgaXMgYmVmb3JlIHRoZQotICAgICAgICAgICAgIyBvdGhlciBoYW5kbGVycwogICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgbmVlZCB0byBzdGFydCBvdmVyLCBiZWNhdXNlIHRoZSBvdGhlciBoYW5kbGVycyBkb24ndAogICAgICAgICAgICAgIyBncm9rIHRoZSBwcm94eSdzIFVSTCB0eXBlCisgICAgICAgICAgICAjIGUuZy4gaWYgd2UgaGF2ZSBhIGNvbnN0cnVjdG9yIGFyZyBwcm94aWVzIGxpa2Ugc286CisgICAgICAgICAgICAjIHsnaHR0cCc6ICdmdHA6Ly9wcm94eS5leGFtcGxlLmNvbSd9LCB3ZSBtYXkgZW5kIHVwIHR1cm5pbmcKKyAgICAgICAgICAgICMgYSByZXF1ZXN0IGZvciBodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9hIGludG8gb25lIGZvcgorICAgICAgICAgICAgIyBmdHA6Ly9wcm94eS5leGFtcGxlLmNvbS9hCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQub3BlbihyZXEpCiAKLSMgZmVhdHVyZSBzdWdnZXN0ZWQgYnkgRHVuY2FuIEJvb3RoCi0jIFhYWCBjdXN0b20gaXMgbm90IGEgZ29vZCBuYW1lCi1jbGFzcyBDdXN0b21Qcm94eToKLSAgICAjIGVpdGhlciBwYXNzIGEgZnVuY3Rpb24gdG8gdGhlIGNvbnN0cnVjdG9yIG9yIG92ZXJyaWRlIGhhbmRsZQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90bywgZnVuYz1Ob25lLCBwcm94eV9hZGRyPU5vbmUpOgotICAgICAgICBzZWxmLnByb3RvID0gcHJvdG8KLSAgICAgICAgc2VsZi5mdW5jID0gZnVuYwotICAgICAgICBzZWxmLmFkZHIgPSBwcm94eV9hZGRyCi0KLSAgICBkZWYgaGFuZGxlKHNlbGYsIHJlcSk6Ci0gICAgICAgIGlmIHNlbGYuZnVuYyBhbmQgc2VsZi5mdW5jKHJlcSk6Ci0gICAgICAgICAgICByZXR1cm4gMQotCi0gICAgZGVmIGdldF9wcm94eShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuYWRkcgotCi1jbGFzcyBDdXN0b21Qcm94eUhhbmRsZXIoQmFzZUhhbmRsZXIpOgotICAgICMgUHJveGllcyBtdXN0IGJlIGluIGZyb250Ci0gICAgaGFuZGxlcl9vcmRlciA9IDEwMAotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsICpwcm94aWVzKToKLSAgICAgICAgc2VsZi5wcm94aWVzID0ge30KLQotICAgIGRlZiBwcm94eV9vcGVuKHNlbGYsIHJlcSk6Ci0gICAgICAgIHByb3RvID0gcmVxLmdldF90eXBlKCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcHJveGllcyA9IHNlbGYucHJveGllc1twcm90b10KLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgZm9yIHAgaW4gcHJveGllczoKLSAgICAgICAgICAgIGlmIHAuaGFuZGxlKHJlcSk6Ci0gICAgICAgICAgICAgICAgcmVxLnNldF9wcm94eShwLmdldF9wcm94eSgpKQotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5vcGVuKHJlcSkKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGRlZiBkb19wcm94eShzZWxmLCBwLCByZXEpOgotICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQub3BlbihyZXEpCi0KLSAgICBkZWYgYWRkX3Byb3h5KHNlbGYsIGNwbyk6Ci0gICAgICAgIGlmIGNwby5wcm90byBpbiBzZWxmLnByb3hpZXM6Ci0gICAgICAgICAgICBzZWxmLnByb3hpZXNbY3BvLnByb3RvXS5hcHBlbmQoY3BvKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5wcm94aWVzW2Nwby5wcm90b10gPSBbY3BvXQotCiBjbGFzcyBIVFRQUGFzc3dvcmRNZ3I6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICBzZWxmLnBhc3N3ZCA9IHt9CkBAIC0xMTI4LDggKzExNTMsMTEgQEAKICAgICBuYW1lcyA9IE5vbmUKICAgICBkZWYgZ2V0X25hbWVzKHNlbGYpOgogICAgICAgICBpZiBGaWxlSGFuZGxlci5uYW1lcyBpcyBOb25lOgotICAgICAgICAgICAgRmlsZUhhbmRsZXIubmFtZXMgPSAoc29ja2V0LmdldGhvc3RieW5hbWUoJ2xvY2FsaG9zdCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIEZpbGVIYW5kbGVyLm5hbWVzID0gKHNvY2tldC5nZXRob3N0YnluYW1lKCdsb2NhbGhvc3QnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKSkKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICAgICAgRmlsZUhhbmRsZXIubmFtZXMgPSAoc29ja2V0LmdldGhvc3RieW5hbWUoJ2xvY2FsaG9zdCcpLCkKICAgICAgICAgcmV0dXJuIEZpbGVIYW5kbGVyLm5hbWVzCiAKICAgICAjIG5vdCBlbnRpcmVseSBzdXJlIHdoYXQgdGhlIHJ1bGVzIGFyZSBoZXJlCkBAIC0xMjU4LDYgKzEyODYsNyBAQAogCiBjbGFzcyBHb3BoZXJIYW5kbGVyKEJhc2VIYW5kbGVyKToKICAgICBkZWYgZ29waGVyX29wZW4oc2VsZiwgcmVxKToKKyAgICAgICAgIyBYWFggY2FuIHJhaXNlIHNvY2tldC5lcnJvcgogICAgICAgICBpbXBvcnQgZ29waGVybGliICAjIHRoaXMgcmFpc2VzIERlcHJlY2F0aW9uV2FybmluZyBpbiAyLjUKICAgICAgICAgaG9zdCA9IHJlcS5nZXRfaG9zdCgpCiAgICAgICAgIGlmIG5vdCBob3N0OgpAQCAtMTI3MywyNSArMTMwMiwzIEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBmcCA9IGdvcGhlcmxpYi5zZW5kX3NlbGVjdG9yKHNlbGVjdG9yLCBob3N0KQogICAgICAgICByZXR1cm4gYWRkaW5mb3VybChmcCwgbm9oZWFkZXJzKCksIHJlcS5nZXRfZnVsbF91cmwoKSkKLQotI2JsZWNrISBkb24ndCB1c2UgdGhpcyB5ZXQKLWNsYXNzIE9wZW5lckZhY3Rvcnk6Ci0KLSAgICBkZWZhdWx0X2hhbmRsZXJzID0gW1Vua25vd25IYW5kbGVyLCBIVFRQSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyLCBIVFRQUmVkaXJlY3RIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRQSGFuZGxlciwgRmlsZUhhbmRsZXJdCi0gICAgaGFuZGxlcnMgPSBbXQotICAgIHJlcGxhY2VtZW50X2hhbmRsZXJzID0gW10KLQotICAgIGRlZiBhZGRfaGFuZGxlcihzZWxmLCBoKToKLSAgICAgICAgc2VsZi5oYW5kbGVycyA9IHNlbGYuaGFuZGxlcnMgKyBbaF0KLQotICAgIGRlZiByZXBsYWNlX2hhbmRsZXIoc2VsZiwgaCk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBidWlsZF9vcGVuZXIoc2VsZik6Ci0gICAgICAgIG9wZW5lciA9IE9wZW5lckRpcmVjdG9yKCkKLSAgICAgICAgZm9yIHBoIGluIHNlbGYuZGVmYXVsdF9oYW5kbGVyczoKLSAgICAgICAgICAgIGlmIGluc3BlY3QuaXNjbGFzcyhwaCk6Ci0gICAgICAgICAgICAgICAgcGggPSBwaCgpCi0gICAgICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIocGgpCmRpZmYgLS1naXQgYS9MaWIvdXJscGFyc2UucHkgYi9MaWIvdXJscGFyc2UucHkKaW5kZXggOGI3NTA1MS4uZWFkZTA0MCAxMDA2NDQKLS0tIGEvTGliL3VybHBhcnNlLnB5CisrKyBiL0xpYi91cmxwYXJzZS5weQpAQCAtMTYsMTIgKzE2LDEyIEBACiAgICAgICAgICAgICAgICAnc25ld3MnLCAncHJvc3Blcm8nLCAncnRzcCcsICdydHNwdScsICdyc3luYycsICcnLAogICAgICAgICAgICAgICAgJ3N2bicsICdzdm4rc3NoJywgJ3NmdHAnXQogbm9uX2hpZXJhcmNoaWNhbCA9IFsnZ29waGVyJywgJ2hkbCcsICdtYWlsdG8nLCAnbmV3cycsCi0gICAgICAgICAgICAgICAgICAgICd0ZWxuZXQnLCAnd2FpcycsICdpbWFwJywgJ3NuZXdzJywgJ3NpcCddCisgICAgICAgICAgICAgICAgICAgICd0ZWxuZXQnLCAnd2FpcycsICdpbWFwJywgJ3NuZXdzJywgJ3NpcCcsICdzaXBzJ10KIHVzZXNfcGFyYW1zID0gWydmdHAnLCAnaGRsJywgJ3Byb3NwZXJvJywgJ2h0dHAnLCAnaW1hcCcsCi0gICAgICAgICAgICAgICAnaHR0cHMnLCAnc2h0dHAnLCAncnRzcCcsICdydHNwdScsICdzaXAnLAorICAgICAgICAgICAgICAgJ2h0dHBzJywgJ3NodHRwJywgJ3J0c3AnLCAncnRzcHUnLCAnc2lwJywgJ3NpcHMnLAogICAgICAgICAgICAgICAgJ21tcycsICcnLCAnc2Z0cCddCiB1c2VzX3F1ZXJ5ID0gWydodHRwJywgJ3dhaXMnLCAnaW1hcCcsICdodHRwcycsICdzaHR0cCcsICdtbXMnLAotICAgICAgICAgICAgICAnZ29waGVyJywgJ3J0c3AnLCAncnRzcHUnLCAnc2lwJywgJyddCisgICAgICAgICAgICAgICdnb3BoZXInLCAncnRzcCcsICdydHNwdScsICdzaXAnLCAnc2lwcycsICcnXQogdXNlc19mcmFnbWVudCA9IFsnZnRwJywgJ2hkbCcsICdodHRwJywgJ2dvcGhlcicsICduZXdzJywKICAgICAgICAgICAgICAgICAgJ25udHAnLCAnd2FpcycsICdodHRwcycsICdzaHR0cCcsICdzbmV3cycsCiAgICAgICAgICAgICAgICAgICdmaWxlJywgJ3Byb3NwZXJvJywgJyddCkBAIC00MSw3ICs0MSwxMTEgQEAKICAgICBfcGFyc2VfY2FjaGUgPSB7fQogCiAKLWRlZiB1cmxwYXJzZSh1cmwsIHNjaGVtZT0nJywgYWxsb3dfZnJhZ21lbnRzPTEpOgorY2xhc3MgQmFzZVJlc3VsdCh0dXBsZSk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgdGhlIHBhcnNlZCByZXN1bHQgb2JqZWN0cy4KKworICAgIFRoaXMgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgc2hhcmVkIGJ5IHRoZSB0d28gZGVyaXZlZCByZXN1bHQKKyAgICBvYmplY3RzIGFzIHJlYWQtb25seSBwcm9wZXJ0aWVzLiAgVGhlIGRlcml2ZWQgY2xhc3NlcyBhcmUKKyAgICByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgdGhlIHJpZ2h0IG51bWJlciBvZiBhcmd1bWVudHMgd2VyZQorICAgIHN1cHBsaWVkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKworICAgICIiIgorCisgICAgX19zbG90c19fID0gKCkKKworICAgICMgQXR0cmlidXRlcyB0aGF0IGFjY2VzcyB0aGUgYmFzaWMgY29tcG9uZW50cyBvZiB0aGUgVVJMOgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNjaGVtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGZbMF0KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuZXRsb2Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmWzFdCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcGF0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGZbMl0KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBxdWVyeShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGZbLTJdCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZnJhZ21lbnQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmWy0xXQorCisgICAgIyBBZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byBwYXJzZWQtb3V0IHBvcnRpb25zCisgICAgIyBvZiB0aGUgbmV0bG9jOgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHVzZXJuYW1lKHNlbGYpOgorICAgICAgICBuZXRsb2MgPSBzZWxmLm5ldGxvYworICAgICAgICBpZiAiQCIgaW4gbmV0bG9jOgorICAgICAgICAgICAgdXNlcmluZm8gPSBuZXRsb2Muc3BsaXQoIkAiLCAxKVswXQorICAgICAgICAgICAgaWYgIjoiIGluIHVzZXJpbmZvOgorICAgICAgICAgICAgICAgIHVzZXJpbmZvID0gdXNlcmluZm8uc3BsaXQoIjoiLCAxKVswXQorICAgICAgICAgICAgcmV0dXJuIHVzZXJpbmZvCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcGFzc3dvcmQoc2VsZik6CisgICAgICAgIG5ldGxvYyA9IHNlbGYubmV0bG9jCisgICAgICAgIGlmICJAIiBpbiBuZXRsb2M6CisgICAgICAgICAgICB1c2VyaW5mbyA9IG5ldGxvYy5zcGxpdCgiQCIsIDEpWzBdCisgICAgICAgICAgICBpZiAiOiIgaW4gdXNlcmluZm86CisgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJpbmZvLnNwbGl0KCI6IiwgMSlbMV0KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBob3N0bmFtZShzZWxmKToKKyAgICAgICAgbmV0bG9jID0gc2VsZi5uZXRsb2MKKyAgICAgICAgaWYgIkAiIGluIG5ldGxvYzoKKyAgICAgICAgICAgIG5ldGxvYyA9IG5ldGxvYy5zcGxpdCgiQCIsIDEpWzFdCisgICAgICAgIGlmICI6IiBpbiBuZXRsb2M6CisgICAgICAgICAgICBuZXRsb2MgPSBuZXRsb2Muc3BsaXQoIjoiLCAxKVswXQorICAgICAgICByZXR1cm4gbmV0bG9jLmxvd2VyKCkgb3IgTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgIG5ldGxvYyA9IHNlbGYubmV0bG9jCisgICAgICAgIGlmICJAIiBpbiBuZXRsb2M6CisgICAgICAgICAgICBuZXRsb2MgPSBuZXRsb2Muc3BsaXQoIkAiLCAxKVsxXQorICAgICAgICBpZiAiOiIgaW4gbmV0bG9jOgorICAgICAgICAgICAgcG9ydCA9IG5ldGxvYy5zcGxpdCgiOiIsIDEpWzFdCisgICAgICAgICAgICByZXR1cm4gaW50KHBvcnQsIDEwKQorICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIFNwbGl0UmVzdWx0KEJhc2VSZXN1bHQpOgorCisgICAgX19zbG90c19fID0gKCkKKworICAgIGRlZiBfX25ld19fKGNscywgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCk6CisgICAgICAgIHJldHVybiBCYXNlUmVzdWx0Ll9fbmV3X18oCisgICAgICAgICAgICBjbHMsIChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50KSkKKworICAgIGRlZiBnZXR1cmwoc2VsZik6CisgICAgICAgIHJldHVybiB1cmx1bnNwbGl0KHNlbGYpCisKKworY2xhc3MgUGFyc2VSZXN1bHQoQmFzZVJlc3VsdCk6CisKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgZGVmIF9fbmV3X18oY2xzLCBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpOgorICAgICAgICByZXR1cm4gQmFzZVJlc3VsdC5fX25ld19fKAorICAgICAgICAgICAgY2xzLCAoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwYXJhbXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmWzNdCisKKyAgICBkZWYgZ2V0dXJsKHNlbGYpOgorICAgICAgICByZXR1cm4gdXJsdW5wYXJzZShzZWxmKQorCisKK2RlZiB1cmxwYXJzZSh1cmwsIHNjaGVtZT0nJywgYWxsb3dfZnJhZ21lbnRzPVRydWUpOgogICAgICIiIlBhcnNlIGEgVVJMIGludG8gNiBjb21wb25lbnRzOgogICAgIDxzY2hlbWU+Oi8vPG5ldGxvYz4vPHBhdGg+OzxwYXJhbXM+PzxxdWVyeT4jPGZyYWdtZW50PgogICAgIFJldHVybiBhIDYtdHVwbGU6IChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpLgpAQCAtNTMsNyArMTU3LDcgQEAKICAgICAgICAgdXJsLCBwYXJhbXMgPSBfc3BsaXRwYXJhbXModXJsKQogICAgIGVsc2U6CiAgICAgICAgIHBhcmFtcyA9ICcnCi0gICAgcmV0dXJuIHNjaGVtZSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50CisgICAgcmV0dXJuIFBhcnNlUmVzdWx0KHNjaGVtZSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KQogCiBkZWYgX3NwbGl0cGFyYW1zKHVybCk6CiAgICAgaWYgJy8nICBpbiB1cmw6CkBAIC03MywxMiArMTc3LDEzIEBACiAgICAgICAgIGRlbGltID0gbGVuKHVybCkKICAgICByZXR1cm4gdXJsW3N0YXJ0OmRlbGltXSwgdXJsW2RlbGltOl0KIAotZGVmIHVybHNwbGl0KHVybCwgc2NoZW1lPScnLCBhbGxvd19mcmFnbWVudHM9MSk6CitkZWYgdXJsc3BsaXQodXJsLCBzY2hlbWU9JycsIGFsbG93X2ZyYWdtZW50cz1UcnVlKToKICAgICAiIiJQYXJzZSBhIFVSTCBpbnRvIDUgY29tcG9uZW50czoKICAgICA8c2NoZW1lPjovLzxuZXRsb2M+LzxwYXRoPj88cXVlcnk+IzxmcmFnbWVudD4KICAgICBSZXR1cm4gYSA1LXR1cGxlOiAoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkuCiAgICAgTm90ZSB0aGF0IHdlIGRvbid0IGJyZWFrIHRoZSBjb21wb25lbnRzIHVwIGluIHNtYWxsZXIgYml0cwogICAgIChlLmcuIG5ldGxvYyBpcyBhIHNpbmdsZSBzdHJpbmcpIGFuZCB3ZSBkb24ndCBleHBhbmQgJSBlc2NhcGVzLiIiIgorICAgIGFsbG93X2ZyYWdtZW50cyA9IGJvb2woYWxsb3dfZnJhZ21lbnRzKQogICAgIGtleSA9IHVybCwgc2NoZW1lLCBhbGxvd19mcmFnbWVudHMKICAgICBjYWNoZWQgPSBfcGFyc2VfY2FjaGUuZ2V0KGtleSwgTm9uZSkKICAgICBpZiBjYWNoZWQ6CkBAIC05Nyw5ICsyMDIsOSBAQAogICAgICAgICAgICAgICAgIHVybCwgZnJhZ21lbnQgPSB1cmwuc3BsaXQoJyMnLCAxKQogICAgICAgICAgICAgaWYgJz8nIGluIHVybDoKICAgICAgICAgICAgICAgICB1cmwsIHF1ZXJ5ID0gdXJsLnNwbGl0KCc/JywgMSkKLSAgICAgICAgICAgIHR1cGxlID0gc2NoZW1lLCBuZXRsb2MsIHVybCwgcXVlcnksIGZyYWdtZW50Ci0gICAgICAgICAgICBfcGFyc2VfY2FjaGVba2V5XSA9IHR1cGxlCi0gICAgICAgICAgICByZXR1cm4gdHVwbGUKKyAgICAgICAgICAgIHYgPSBTcGxpdFJlc3VsdChzY2hlbWUsIG5ldGxvYywgdXJsLCBxdWVyeSwgZnJhZ21lbnQpCisgICAgICAgICAgICBfcGFyc2VfY2FjaGVba2V5XSA9IHYKKyAgICAgICAgICAgIHJldHVybiB2CiAgICAgICAgIGZvciBjIGluIHVybFs6aV06CiAgICAgICAgICAgICBpZiBjIG5vdCBpbiBzY2hlbWVfY2hhcnM6CiAgICAgICAgICAgICAgICAgYnJlYWsKQEAgLTExMSw5ICsyMTYsOSBAQAogICAgICAgICB1cmwsIGZyYWdtZW50ID0gdXJsLnNwbGl0KCcjJywgMSkKICAgICBpZiBzY2hlbWUgaW4gdXNlc19xdWVyeSBhbmQgJz8nIGluIHVybDoKICAgICAgICAgdXJsLCBxdWVyeSA9IHVybC5zcGxpdCgnPycsIDEpCi0gICAgdHVwbGUgPSBzY2hlbWUsIG5ldGxvYywgdXJsLCBxdWVyeSwgZnJhZ21lbnQKLSAgICBfcGFyc2VfY2FjaGVba2V5XSA9IHR1cGxlCi0gICAgcmV0dXJuIHR1cGxlCisgICAgdiA9IFNwbGl0UmVzdWx0KHNjaGVtZSwgbmV0bG9jLCB1cmwsIHF1ZXJ5LCBmcmFnbWVudCkKKyAgICBfcGFyc2VfY2FjaGVba2V5XSA9IHYKKyAgICByZXR1cm4gdgogCiBkZWYgdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIHVybCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpKToKICAgICAiIiJQdXQgYSBwYXJzZWQgVVJMIGJhY2sgdG9nZXRoZXIgYWdhaW4uICBUaGlzIG1heSByZXN1bHQgaW4gYQpAQCAtMTM2LDcgKzI0MSw3IEBACiAgICAgICAgIHVybCA9IHVybCArICcjJyArIGZyYWdtZW50CiAgICAgcmV0dXJuIHVybAogCi1kZWYgdXJsam9pbihiYXNlLCB1cmwsIGFsbG93X2ZyYWdtZW50cyA9IDEpOgorZGVmIHVybGpvaW4oYmFzZSwgdXJsLCBhbGxvd19mcmFnbWVudHM9VHJ1ZSk6CiAgICAgIiIiSm9pbiBhIGJhc2UgVVJMIGFuZCBhIHBvc3NpYmx5IHJlbGF0aXZlIFVSTCB0byBmb3JtIGFuIGFic29sdXRlCiAgICAgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGxhdHRlci4iIiIKICAgICBpZiBub3QgYmFzZToKZGlmZiAtLWdpdCBhL0xpYi91dS5weSBiL0xpYi91dS5weQppbmRleCA0MGU4YmYwLi4zY2NlZGIwIDEwMDc1NQotLS0gYS9MaWIvdXUucHkKKysrIGIvTGliL3V1LnB5CkBAIC0xMzIsNyArMTMyLDcgQEAKICAgICAgICAgICAgIGRhdGEgPSBiaW5hc2NpaS5hMmJfdXUocykKICAgICAgICAgZXhjZXB0IGJpbmFzY2lpLkVycm9yLCB2OgogICAgICAgICAgICAgIyBXb3JrYXJvdW5kIGZvciBicm9rZW4gdXVlbmNvZGVycyBieSAvRnJlZHJpayBMdW5kaAotICAgICAgICAgICAgbmJ5dGVzID0gKCgob3JkKHNbMF0pLTMyKSAmIDYzKSAqIDQgKyA1KSAvIDMKKyAgICAgICAgICAgIG5ieXRlcyA9ICgoKG9yZChzWzBdKS0zMikgJiA2MykgKiA0ICsgNSkgLy8gMwogICAgICAgICAgICAgZGF0YSA9IGJpbmFzY2lpLmEyYl91dShzWzpuYnl0ZXNdKQogICAgICAgICAgICAgaWYgbm90IHF1aWV0OgogICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6ICVzXG4iICUgdikKQEAgLTE1MSw3ICsxNTEsNyBAQAogCiAgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogICAgIGlmIGxlbihhcmdzKSA+IDI6Ci0gICAgICAgIHAuZXJyb3IoJ2luY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzJykKKyAgICAgICAgcGFyc2VyLmVycm9yKCdpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cycpCiAgICAgICAgIHN5cy5leGl0KDEpCiAKICAgICBpbnB1dCA9IHN5cy5zdGRpbgpkaWZmIC0tZ2l0IGEvTGliL3dhcm5pbmdzLnB5IGIvTGliL3dhcm5pbmdzLnB5CmluZGV4IGU2MjJiOWEuLmJjMGI4MTggMTAwNjQ0Ci0tLSBhL0xpYi93YXJuaW5ncy5weQorKysgYi9MaWIvd2FybmluZ3MucHkKQEAgLTU4LDEwICs1OCwxMSBAQAogICAgICAgICBpZiBub3QgZmlsZW5hbWU6CiAgICAgICAgICAgICBmaWxlbmFtZSA9IG1vZHVsZQogICAgIHJlZ2lzdHJ5ID0gZ2xvYmFscy5zZXRkZWZhdWx0KCJfX3dhcm5pbmdyZWdpc3RyeV9fIiwge30pCi0gICAgd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLCByZWdpc3RyeSkKKyAgICB3YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGUsIHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgZ2xvYmFscykKIAogZGVmIHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICBtb2R1bGU9Tm9uZSwgcmVnaXN0cnk9Tm9uZSk6CisgICAgICAgICAgICAgICAgICBtb2R1bGU9Tm9uZSwgcmVnaXN0cnk9Tm9uZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSk6CiAgICAgaWYgbW9kdWxlIGlzIE5vbmU6CiAgICAgICAgIG1vZHVsZSA9IGZpbGVuYW1lIG9yICI8dW5rbm93bj4iCiAgICAgICAgIGlmIG1vZHVsZVstMzpdLmxvd2VyKCkgPT0gIi5weSI6CkBAIC05Miw2ICs5MywxMSBAQAogICAgIGlmIGFjdGlvbiA9PSAiaWdub3JlIjoKICAgICAgICAgcmVnaXN0cnlba2V5XSA9IDEKICAgICAgICAgcmV0dXJuCisKKyAgICAjIFByaW1lIHRoZSBsaW5lY2FjaGUgZm9yIGZvcm1hdHRpbmcsIGluIGNhc2UgdGhlCisgICAgIyAiZmlsZSIgaXMgYWN0dWFsbHkgaW4gYSB6aXBmaWxlIG9yIHNvbWV0aGluZy4KKyAgICBsaW5lY2FjaGUuZ2V0bGluZXMoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzKQorCiAgICAgaWYgYWN0aW9uID09ICJlcnJvciI6CiAgICAgICAgIHJhaXNlIG1lc3NhZ2UKICAgICAjIE90aGVyIGFjdGlvbnMKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2RvbS9leHBhdGJ1aWxkZXIucHkgYi9MaWIveG1sY29yZS9kb20vZXhwYXRidWlsZGVyLnB5CmluZGV4IDgxZDljMmIuLjMyZmZhNDEgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS9leHBhdGJ1aWxkZXIucHkKKysrIGIvTGliL3htbGNvcmUvZG9tL2V4cGF0YnVpbGRlci5weQpAQCAtNTksNyArNTksNyBAQAogICAgICJOTVRPS0VOUyI6IG1pbmlkb20uVHlwZUluZm8oTm9uZSwgIm5tdG9rZW5zIiksCiAgICAgfQogCi1jbGFzcyBFbGVtZW50SW5mbyhOZXdTdHlsZSk6CitjbGFzcyBFbGVtZW50SW5mbyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9ICdfYXR0cl9pbmZvJywgJ19tb2RlbCcsICd0YWdOYW1lJwogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhZ05hbWUsIG1vZGVsPU5vbmUpOgpAQCAtNDYwLDcgKzQ2MCw3IEBACiAjIHdoZXJlIGFsbG93ZWQuCiBfQUxMT1dFRF9GSUxURVJfUkVUVVJOUyA9IChGSUxURVJfQUNDRVBULCBGSUxURVJfUkVKRUNULCBGSUxURVJfU0tJUCkKIAotY2xhc3MgRmlsdGVyVmlzaWJpbGl0eUNvbnRyb2xsZXIoTmV3U3R5bGUpOgorY2xhc3MgRmlsdGVyVmlzaWJpbGl0eUNvbnRyb2xsZXIob2JqZWN0KToKICAgICAiIiJXcmFwcGVyIGFyb3VuZCBhIERPTUJ1aWxkZXJGaWx0ZXIgd2hpY2ggaW1wbGVtZW50cyB0aGUgY2hlY2tzCiAgICAgdG8gbWFrZSB0aGUgd2hhdFRvU2hvdyBmaWx0ZXIgYXR0cmlidXRlIHdvcmsuIiIiCiAKQEAgLTUxOCw3ICs1MTgsNyBAQAogICAgICAgICB9CiAKIAotY2xhc3MgRmlsdGVyQ3J1dGNoKE5ld1N0eWxlKToKK2NsYXNzIEZpbHRlckNydXRjaChvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9ICdfYnVpbGRlcicsICdfbGV2ZWwnLCAnX29sZF9zdGFydCcsICdfb2xkX2VuZCcKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZGVyKToKQEAgLTkwOCw3ICs5MDgsNyBAQAogICAgICAgICByYWlzZSBQYXJzZUVzY2FwZSgpCiAKIAotZGVmIHBhcnNlKGZpbGUsIG5hbWVzcGFjZXM9MSk6CitkZWYgcGFyc2UoZmlsZSwgbmFtZXNwYWNlcz1UcnVlKToKICAgICAiIiJQYXJzZSBhIGRvY3VtZW50LCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZyBEb2N1bWVudCBub2RlLgogCiAgICAgJ2ZpbGUnIG1heSBiZSBlaXRoZXIgYSBmaWxlIG5hbWUgb3IgYW4gb3BlbiBmaWxlIG9iamVjdC4KQEAgLTkyOSw3ICs5MjksNyBAQAogICAgIHJldHVybiByZXN1bHQKIAogCi1kZWYgcGFyc2VTdHJpbmcoc3RyaW5nLCBuYW1lc3BhY2VzPTEpOgorZGVmIHBhcnNlU3RyaW5nKHN0cmluZywgbmFtZXNwYWNlcz1UcnVlKToKICAgICAiIiJQYXJzZSBhIGRvY3VtZW50IGZyb20gYSBzdHJpbmcsIHJldHVybmluZyB0aGUgcmVzdWx0aW5nCiAgICAgRG9jdW1lbnQgbm9kZS4KICAgICAiIiIKQEAgLTk0MCw3ICs5NDAsNyBAQAogICAgIHJldHVybiBidWlsZGVyLnBhcnNlU3RyaW5nKHN0cmluZykKIAogCi1kZWYgcGFyc2VGcmFnbWVudChmaWxlLCBjb250ZXh0LCBuYW1lc3BhY2VzPTEpOgorZGVmIHBhcnNlRnJhZ21lbnQoZmlsZSwgY29udGV4dCwgbmFtZXNwYWNlcz1UcnVlKToKICAgICAiIiJQYXJzZSBhIGZyYWdtZW50IG9mIGEgZG9jdW1lbnQsIGdpdmVuIHRoZSBjb250ZXh0IGZyb20gd2hpY2ggaXQKICAgICB3YXMgb3JpZ2luYWxseSBleHRyYWN0ZWQuICBjb250ZXh0IHNob3VsZCBiZSB0aGUgcGFyZW50IG9mIHRoZQogICAgIG5vZGUocykgd2hpY2ggYXJlIGluIHRoZSBmcmFnbWVudC4KQEAgLTk2Myw3ICs5NjMsNyBAQAogICAgIHJldHVybiByZXN1bHQKIAogCi1kZWYgcGFyc2VGcmFnbWVudFN0cmluZyhzdHJpbmcsIGNvbnRleHQsIG5hbWVzcGFjZXM9MSk6CitkZWYgcGFyc2VGcmFnbWVudFN0cmluZyhzdHJpbmcsIGNvbnRleHQsIG5hbWVzcGFjZXM9VHJ1ZSk6CiAgICAgIiIiUGFyc2UgYSBmcmFnbWVudCBvZiBhIGRvY3VtZW50IGZyb20gYSBzdHJpbmcsIGdpdmVuIHRoZSBjb250ZXh0CiAgICAgZnJvbSB3aGljaCBpdCB3YXMgb3JpZ2luYWxseSBleHRyYWN0ZWQuICBjb250ZXh0IHNob3VsZCBiZSB0aGUKICAgICBwYXJlbnQgb2YgdGhlIG5vZGUocykgd2hpY2ggYXJlIGluIHRoZSBmcmFnbWVudC4KZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2RvbS9taW5pY29tcGF0LnB5IGIvTGliL3htbGNvcmUvZG9tL21pbmljb21wYXQucHkKaW5kZXggMzY0Y2E0NS4uZjk5YjdmZSAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL21pbmljb21wYXQucHkKKysrIGIvTGliL3htbGNvcmUvZG9tL21pbmljb21wYXQucHkKQEAgLTQsMTAgKzQsNiBAQAogIwogIyBUaGUgZm9sbG93aW5nIG5hbWVzIGFyZSBkZWZpbmVkOgogIwotIyAgIGlzaW5zdGFuY2UgICAgLS0gdmVyc2lvbiBvZiB0aGUgaXNpbnN0YW5jZSgpIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cwotIyAgICAgICAgICAgICAgICAgICAgdHVwbGVzIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHJlZ2FyZGxlc3Mgb2YgdGhlCi0jICAgICAgICAgICAgICAgICAgICBQeXRob24gdmVyc2lvbgotIwogIyAgIE5vZGVMaXN0ICAgICAgLS0gbGlnaHRlc3QgcG9zc2libGUgTm9kZUxpc3QgaW1wbGVtZW50YXRpb24KICMKICMgICBFbXB0eU5vZGVMaXN0IC0tIGxpZ2h0ZXN0IHBvc3NpYmxlIE5vZGVMaXN0IHRoYXQgaXMgZ3VhcmF0ZWVkIHRvCkBAIC0xNSw4ICsxMSw2IEBACiAjCiAjICAgU3RyaW5nVHlwZXMgICAtLSB0dXBsZSBvZiBkZWZpbmVkIHN0cmluZyB0eXBlcwogIwotIyAgIEdldGF0dHJNYWdpYyAgLS0gYmFzZSBjbGFzcyB1c2VkIHRvIG1ha2UgX2dldF88YXR0cj4gYmUgbWFnaWNhbGx5Ci0jICAgICAgICAgICAgICAgICAgICBpbnZva2VkIHdoZW4gYXZhaWxhYmxlCiAjICAgZGVmcHJvcGVydHkgICAtLSBmdW5jdGlvbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggR2V0YXR0ck1hZ2ljOwogIyAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlc2UgdG9nZXRoZXIgaXMgbmVlZGVkIHRvIG1ha2UgdGhlbSB3b3JrCiAjICAgICAgICAgICAgICAgICAgICBhcyBlZmZpY2llbnRseSBhcyBwb3NzaWJsZSBpbiBib3RoIFB5dGhvbiAyLjIrCkBAIC00MSwxNCArMzUsOCBAQAogIwogIyAgICAgICAgICAgICAgICAgICAgZGVmcHJvcGVydHkoKSBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaCB2ZXJzaW9uIG9mCiAjICAgICAgICAgICAgICAgICAgICB0aGUgcmVsZXZhbnQgX2dldF88cHJvcGVydHk+KCkgZnVuY3Rpb24uCi0jCi0jICAgTmV3U3R5bGUgICAgICAtLSBiYXNlIGNsYXNzIHRvIGNhdXNlIF9fc2xvdHNfXyB0byBiZSBob25vcmVkIGluCi0jICAgICAgICAgICAgICAgICAgICB0aGUgbmV3IHdvcmxkCi0jCi0jICAgVHJ1ZSwgRmFsc2UgICAtLSBvbmx5IGZvciBQeXRob24gMi4yIGFuZCBlYXJsaWVyCiAKLV9fYWxsX18gPSBbIk5vZGVMaXN0IiwgIkVtcHR5Tm9kZUxpc3QiLCAiTmV3U3R5bGUiLAotICAgICAgICAgICAiU3RyaW5nVHlwZXMiLCAiZGVmcHJvcGVydHkiLCAiR2V0YXR0ck1hZ2ljIl0KK19fYWxsX18gPSBbIk5vZGVMaXN0IiwgIkVtcHR5Tm9kZUxpc3QiLCAiU3RyaW5nVHlwZXMiLCAiZGVmcHJvcGVydHkiXQogCiBpbXBvcnQgeG1sY29yZS5kb20KIApAQCAtNjAsMTI1ICs0OCw2MiBAQAogICAgIFN0cmluZ1R5cGVzID0gdHlwZSgnJyksIHR5cGUodW5pY29kZSgnJykpCiAKIAotIyBkZWZpbmUgVHJ1ZSBhbmQgRmFsc2Ugb25seSBpZiBub3QgZGVmaW5lZCBhcyBidWlsdC1pbnMKLXRyeToKLSAgICBUcnVlCi1leGNlcHQgTmFtZUVycm9yOgotICAgIFRydWUgPSAxCi0gICAgRmFsc2UgPSAwCi0gICAgX19hbGxfXy5leHRlbmQoWyJUcnVlIiwgIkZhbHNlIl0pCitjbGFzcyBOb2RlTGlzdChsaXN0KToKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgZGVmIGl0ZW0oc2VsZiwgaW5kZXgpOgorICAgICAgICBpZiAwIDw9IGluZGV4IDwgbGVuKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGZbaW5kZXhdCisKKyAgICBkZWYgX2dldF9sZW5ndGgoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZikKKworICAgIGRlZiBfc2V0X2xlbmd0aChzZWxmLCB2YWx1ZSk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICAgICAgImF0dGVtcHQgdG8gbW9kaWZ5IHJlYWQtb25seSBhdHRyaWJ1dGUgJ2xlbmd0aCciKQorCisgICAgbGVuZ3RoID0gcHJvcGVydHkoX2dldF9sZW5ndGgsIF9zZXRfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIGRvYz0iVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgTm9kZUxpc3QuIikKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYpCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZls6XSA9IHN0YXRlCisKK2NsYXNzIEVtcHR5Tm9kZUxpc3QodHVwbGUpOgorICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIE5MID0gTm9kZUxpc3QoKQorICAgICAgICBOTC5leHRlbmQob3RoZXIpCisgICAgICAgIHJldHVybiBOTAorCisgICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgTkwgPSBOb2RlTGlzdCgpCisgICAgICAgIE5MLmV4dGVuZChvdGhlcikKKyAgICAgICAgcmV0dXJuIE5MCisKKyAgICBkZWYgaXRlbShzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2dldF9sZW5ndGgoc2VsZik6CisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgX3NldF9sZW5ndGgoc2VsZiwgdmFsdWUpOgorICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgICAgICJhdHRlbXB0IHRvIG1vZGlmeSByZWFkLW9ubHkgYXR0cmlidXRlICdsZW5ndGgnIikKKworICAgIGxlbmd0aCA9IHByb3BlcnR5KF9nZXRfbGVuZ3RoLCBfc2V0X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICBkb2M9IlRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIE5vZGVMaXN0LiIpCiAKIAotdHJ5OgotICAgIGlzaW5zdGFuY2UoJycsIFN0cmluZ1R5cGVzKQotZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAjCi0gICAgIyBXcmFwIGlzaW5zdGFuY2UoKSB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBpbgotICAgICMgUHl0aG9uIDIuMiBhbmQgbmV3ZXIuCi0gICAgIwotICAgIF9pc2luc3RhbmNlID0gaXNpbnN0YW5jZQotICAgIGRlZiBpc2luc3RhbmNlKG9iaiwgdHlwZV9vcl9zZXEpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gX2lzaW5zdGFuY2Uob2JqLCB0eXBlX29yX3NlcSkKLSAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICAgICAgIGZvciB0IGluIHR5cGVfb3Jfc2VxOgotICAgICAgICAgICAgICAgIGlmIF9pc2luc3RhbmNlKG9iaiwgdCk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxCi0gICAgICAgICAgICByZXR1cm4gMAotICAgIF9fYWxsX18uYXBwZW5kKCJpc2luc3RhbmNlIikKLQotCi1pZiBsaXN0IGlzIHR5cGUoW10pOgotICAgIGNsYXNzIE5vZGVMaXN0KGxpc3QpOgotICAgICAgICBfX3Nsb3RzX18gPSAoKQotCi0gICAgICAgIGRlZiBpdGVtKHNlbGYsIGluZGV4KToKLSAgICAgICAgICAgIGlmIDAgPD0gaW5kZXggPCBsZW4oc2VsZik6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGZbaW5kZXhdCi0KLSAgICAgICAgZGVmIF9nZXRfbGVuZ3RoKHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmKQotCi0gICAgICAgIGRlZiBfc2V0X2xlbmd0aChzZWxmLCB2YWx1ZSk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCi0gICAgICAgICAgICAgICAgImF0dGVtcHQgdG8gbW9kaWZ5IHJlYWQtb25seSBhdHRyaWJ1dGUgJ2xlbmd0aCciKQotCi0gICAgICAgIGxlbmd0aCA9IHByb3BlcnR5KF9nZXRfbGVuZ3RoLCBfc2V0X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jPSJUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBOb2RlTGlzdC4iKQotCi0gICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6Ci0gICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmKQotCi0gICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgotICAgICAgICAgICAgc2VsZls6XSA9IHN0YXRlCi0KLSAgICBjbGFzcyBFbXB0eU5vZGVMaXN0KHR1cGxlKToKLSAgICAgICAgX19zbG90c19fID0gKCkKLQotICAgICAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgICAgICBOTCA9IE5vZGVMaXN0KCkKLSAgICAgICAgICAgIE5MLmV4dGVuZChvdGhlcikKLSAgICAgICAgICAgIHJldHVybiBOTAotCi0gICAgICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgICAgICBOTCA9IE5vZGVMaXN0KCkKLSAgICAgICAgICAgIE5MLmV4dGVuZChvdGhlcikKLSAgICAgICAgICAgIHJldHVybiBOTAotCi0gICAgICAgIGRlZiBpdGVtKHNlbGYsIGluZGV4KToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0KLSAgICAgICAgZGVmIF9nZXRfbGVuZ3RoKHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuIDAKLQotICAgICAgICBkZWYgX3NldF9sZW5ndGgoc2VsZiwgdmFsdWUpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAotICAgICAgICAgICAgICAgICJhdHRlbXB0IHRvIG1vZGlmeSByZWFkLW9ubHkgYXR0cmlidXRlICdsZW5ndGgnIikKLQotICAgICAgICBsZW5ndGggPSBwcm9wZXJ0eShfZ2V0X2xlbmd0aCwgX3NldF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvYz0iVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgTm9kZUxpc3QuIikKLQotZWxzZToKLSAgICBkZWYgTm9kZUxpc3QoKToKLSAgICAgICAgcmV0dXJuIFtdCi0KLSAgICBkZWYgRW1wdHlOb2RlTGlzdCgpOgotICAgICAgICByZXR1cm4gW10KLQotCi10cnk6Ci0gICAgcHJvcGVydHkKLWV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgZGVmIGRlZnByb3BlcnR5KGtsYXNzLCBuYW1lLCBkb2MpOgotICAgICAgICAjIHRha2VuIGNhcmUgb2YgYnkgdGhlIGJhc2UgX19nZXRhdHRyX18oKQotICAgICAgICBwYXNzCi0KLSAgICBjbGFzcyBHZXRhdHRyTWFnaWM6Ci0gICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBrZXkpOgotICAgICAgICAgICAgaWYga2V5LnN0YXJ0c3dpdGgoIl8iKToKLSAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwga2V5Ci0KLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBnZXQgPSBnZXRhdHRyKHNlbGYsICJfZ2V0XyIgKyBrZXkpCi0gICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIGtleQotICAgICAgICAgICAgcmV0dXJuIGdldCgpCi0KLSAgICBjbGFzcyBOZXdTdHlsZToKLSAgICAgICAgcGFzcwotCi1lbHNlOgotICAgIGRlZiBkZWZwcm9wZXJ0eShrbGFzcywgbmFtZSwgZG9jKToKLSAgICAgICAgZ2V0ID0gZ2V0YXR0cihrbGFzcywgKCJfZ2V0XyIgKyBuYW1lKSkuaW1fZnVuYwotICAgICAgICBkZWYgc2V0KHNlbGYsIHZhbHVlLCBuYW1lPW5hbWUpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAotICAgICAgICAgICAgICAgICJhdHRlbXB0IHRvIG1vZGlmeSByZWFkLW9ubHkgYXR0cmlidXRlICIgKyByZXByKG5hbWUpKQotICAgICAgICBhc3NlcnQgbm90IGhhc2F0dHIoa2xhc3MsICJfc2V0XyIgKyBuYW1lKSwgXAotICAgICAgICAgICAgICAgImV4cGVjdGVkIG5vdCB0byBmaW5kIF9zZXRfIiArIG5hbWUKLSAgICAgICAgcHJvcCA9IHByb3BlcnR5KGdldCwgc2V0LCBkb2M9ZG9jKQotICAgICAgICBzZXRhdHRyKGtsYXNzLCBuYW1lLCBwcm9wKQotCi0gICAgY2xhc3MgR2V0YXR0ck1hZ2ljOgotICAgICAgICBwYXNzCi0KLSAgICBOZXdTdHlsZSA9IG9iamVjdAorZGVmIGRlZnByb3BlcnR5KGtsYXNzLCBuYW1lLCBkb2MpOgorICAgIGdldCA9IGdldGF0dHIoa2xhc3MsICgiX2dldF8iICsgbmFtZSkpLmltX2Z1bmMKKyAgICBkZWYgc2V0KHNlbGYsIHZhbHVlLCBuYW1lPW5hbWUpOgorICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgICAgICJhdHRlbXB0IHRvIG1vZGlmeSByZWFkLW9ubHkgYXR0cmlidXRlICIgKyByZXByKG5hbWUpKQorICAgIGFzc2VydCBub3QgaGFzYXR0cihrbGFzcywgIl9zZXRfIiArIG5hbWUpLCBcCisgICAgICAgICAgICJleHBlY3RlZCBub3QgdG8gZmluZCBfc2V0XyIgKyBuYW1lCisgICAgcHJvcCA9IHByb3BlcnR5KGdldCwgc2V0LCBkb2M9ZG9jKQorICAgIHNldGF0dHIoa2xhc3MsIG5hbWUsIHByb3ApCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20vbWluaWRvbS5weSBiL0xpYi94bWxjb3JlL2RvbS9taW5pZG9tLnB5CmluZGV4IDU0NjIwZTEuLmE4YWJkMTQgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS9taW5pZG9tLnB5CisrKyBiL0xpYi94bWxjb3JlL2RvbS9taW5pZG9tLnB5CkBAIC0yMCw4ICsyMCw2IEBACiBmcm9tIHhtbGNvcmUuZG9tLm1pbmljb21wYXQgaW1wb3J0ICoKIGZyb20geG1sY29yZS5kb20ueG1sYnVpbGRlciBpbXBvcnQgRE9NSW1wbGVtZW50YXRpb25MUywgRG9jdW1lbnRMUwogCi1fVHVwbGVUeXBlID0gdHlwZSgoKSkKLQogIyBUaGlzIGlzIHVzZWQgYnkgdGhlIElELWNhY2hlIGludmFsaWRhdGlvbiBjaGVja3M7IHRoZSBsaXN0IGlzbid0CiAjIGFjdHVhbGx5IGNvbXBsZXRlLCBzaW5jZSB0aGUgbm9kZXMgYmVpbmcgY2hlY2tlZCB3aWxsIG5ldmVyIGJlIHRoZQogIyBET0NVTUVOVF9OT0RFIG9yIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUuICAoVGhlIG5vZGUgYmVpbmcgY2hlY2tlZCBpcwpAQCAtMzEsNyArMjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbGNvcmUuZG9tLk5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKQogCiAKLWNsYXNzIE5vZGUoeG1sY29yZS5kb20uTm9kZSwgR2V0YXR0ck1hZ2ljKToKK2NsYXNzIE5vZGUoeG1sY29yZS5kb20uTm9kZSk6CiAgICAgbmFtZXNwYWNlVVJJID0gTm9uZSAjIHRoaXMgaXMgbm9uLW51bGwgb25seSBmb3IgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMKICAgICBwYXJlbnROb2RlID0gTm9uZQogICAgIG93bmVyRG9jdW1lbnQgPSBOb25lCkBAIC00NTksNyArNDU3LDcgQEAKIGRlZnByb3BlcnR5KEF0dHIsICJzY2hlbWFUeXBlIiwgZG9jPSJTY2hlbWEgdHlwZSBmb3IgdGhpcyBhdHRyaWJ1dGUuIikKIAogCi1jbGFzcyBOYW1lZE5vZGVNYXAoTmV3U3R5bGUsIEdldGF0dHJNYWdpYyk6CitjbGFzcyBOYW1lZE5vZGVNYXAob2JqZWN0KToKICAgICAiIiJUaGUgYXR0cmlidXRlIGxpc3QgaXMgYSB0cmFuc2llbnQgaW50ZXJmYWNlIHRvIHRoZSB1bmRlcmx5aW5nCiAgICAgZGljdGlvbmFyaWVzLiAgTXV0YXRpb25zIGhlcmUgd2lsbCBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgZWxlbWVudCdzCiAgICAgZGljdGlvbmFyeS4KQEAgLTUyMyw3ICs1MjEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGNtcChpZChzZWxmKSwgaWQob3RoZXIpKQogCiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGF0dG5hbWVfb3JfdHVwbGUpOgotICAgICAgICBpZiBpc2luc3RhbmNlKGF0dG5hbWVfb3JfdHVwbGUsIF9UdXBsZVR5cGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGF0dG5hbWVfb3JfdHVwbGUsIHR1cGxlKToKICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc05TW2F0dG5hbWVfb3JfdHVwbGVdCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNbYXR0bmFtZV9vcl90dXBsZV0KQEAgLTYxMyw3ICs2MTEsNyBAQAogQXR0cmlidXRlTGlzdCA9IE5hbWVkTm9kZU1hcAogCiAKLWNsYXNzIFR5cGVJbmZvKE5ld1N0eWxlKToKK2NsYXNzIFR5cGVJbmZvKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gJ25hbWVzcGFjZScsICduYW1lJwogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZSwgbmFtZSk6CkBAIC0xMTQ2LDcgKzExNDQsNyBAQAogICAgICAgICB3cml0ZXIud3JpdGUoIjwhW0NEQVRBWyVzXV0+IiAlIHNlbGYuZGF0YSkKIAogCi1jbGFzcyBSZWFkT25seVNlcXVlbnRpYWxOYW1lZE5vZGVNYXAoTmV3U3R5bGUsIEdldGF0dHJNYWdpYyk6CitjbGFzcyBSZWFkT25seVNlcXVlbnRpYWxOYW1lZE5vZGVNYXAob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSAnX3NlcScsCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2VxPSgpKToKQEAgLTExNzAsNyArMTE2OCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG4KIAogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lX29yX3R1cGxlKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lX29yX3R1cGxlLCBfVHVwbGVUeXBlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lX29yX3R1cGxlLCB0dXBsZSk6CiAgICAgICAgICAgICBub2RlID0gc2VsZi5nZXROYW1lZEl0ZW1OUygqbmFtZV9vcl90dXBsZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmdldE5hbWVkSXRlbShuYW1lX29yX3R1cGxlKQpAQCAtMTQxOCw3ICsxNDE2LDcgQEAKICAgICBkZWYgX2NyZWF0ZV9kb2N1bWVudChzZWxmKToKICAgICAgICAgcmV0dXJuIERvY3VtZW50KCkKIAotY2xhc3MgRWxlbWVudEluZm8oTmV3U3R5bGUpOgorY2xhc3MgRWxlbWVudEluZm8ob2JqZWN0KToKICAgICAiIiJPYmplY3QgdGhhdCByZXByZXNlbnRzIGNvbnRlbnQtbW9kZWwgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAKICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBleHBlY3RlZCB0byBiZSB1c2VkIGluIHByYWN0aWNlOyBET00KZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2RvbS94bWxidWlsZGVyLnB5IGIvTGliL3htbGNvcmUvZG9tL3htbGJ1aWxkZXIucHkKaW5kZXggZDU4YzcyMy4uNjU2NmQzYyAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL3htbGJ1aWxkZXIucHkKKysrIGIvTGliL3htbGNvcmUvZG9tL3htbGJ1aWxkZXIucHkKQEAgLTMsOCArMyw2IEBACiBpbXBvcnQgY29weQogaW1wb3J0IHhtbGNvcmUuZG9tCiAKLWZyb20geG1sY29yZS5kb20ubWluaWNvbXBhdCBpbXBvcnQgKgotCiBmcm9tIHhtbGNvcmUuZG9tLk5vZGVGaWx0ZXIgaW1wb3J0IE5vZGVGaWx0ZXIKIAogCkBAIC0yMTEsNyArMjA5LDcgQEAKICAgICByZXR1cm4gbmFtZS5sb3dlcigpLnJlcGxhY2UoJy0nLCAnXycpCiAKIAotY2xhc3MgRE9NRW50aXR5UmVzb2x2ZXIoTmV3U3R5bGUpOgorY2xhc3MgRE9NRW50aXR5UmVzb2x2ZXIob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSAnX29wZW5lcicsCiAKICAgICBkZWYgcmVzb2x2ZUVudGl0eShzZWxmLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgpAQCAtMjU1LDcgKzI1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5zcGxpdCgiPSIsIDEpWzFdLmxvd2VyKCkKIAogCi1jbGFzcyBET01JbnB1dFNvdXJjZShOZXdTdHlsZSk6CitjbGFzcyBET01JbnB1dFNvdXJjZShvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9ICgnYnl0ZVN0cmVhbScsICdjaGFyYWN0ZXJTdHJlYW0nLCAnc3RyaW5nRGF0YScsCiAgICAgICAgICAgICAgICAgICdlbmNvZGluZycsICdwdWJsaWNJZCcsICdzeXN0ZW1JZCcsICdiYXNlVVJJJykKIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2NhcmJvbmV2dC9fQ2FyYm9uRXZ0bW9kdWxlLmMKaW5kZXggZmVlNDNjYy4uZmQ0YjI2NiAxMDA3NTUKLS0tIGEvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jCkBAIC00MCw3ICs0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICYob3V0LT5ldmVudENsYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICYob3V0LT5ldmVudEtpbmQpKSkKICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKiBlbmQgRXZlbnRUeXBlU3BlYyAqKioqKioqLwpAQCAtNzgsNyArNzgsNyBAQAogewogICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAibGwiLCAmb3V0LT5zaWduYXR1cmUsICZvdXQtPmlkKSkKICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKiBlbmQgRXZlbnRIb3RLZXlJRCAqKioqKioqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2YvX0NGbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9jZi9fQ0Ztb2R1bGUuYwppbmRleCAyMmU5Njc2Li41ZjkzNGMyIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jZi9fQ0Ztb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9jZi9fQ0Ztb2R1bGUuYwpAQCAtMTMyOSw3ICsxMzI5LDcgQEAKIAlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CiAJaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CiAJICAgIGNoYXIgKmNTdHI7Ci0JICAgIGludCBjTGVuOworCSAgICBQeV9zc2l6ZV90IGNMZW47CiAJICAgIGlmKCBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgJmNTdHIsICZjTGVuKSA8IDAgKSByZXR1cm4gMDsKIAkgICAgKnBfaXRzZWxmID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLCAodW5zaWduZWQgY2hhciAqKWNTdHIsIGNMZW4pOwogCSAgICByZXR1cm4gMTsKQEAgLTE4MjYsNyArMTgyNiw3IEBACiAJaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CiAJICAgIGNoYXIgKmNTdHI7CiAJICAgIGlmICghUHlBcmdfUGFyc2UodiwgImVzIiwgImFzY2lpIiwgJmNTdHIpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisJICAgICAgICByZXR1cm4gMDsKIAkgICAgICAgICpwX2l0c2VsZiA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsIGNTdHIsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkpOwogCSAgICAgICAgcmV0dXJuIDE7CiAJfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZ2VzdGFsdG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvZ2VzdGFsdG1vZHVsZS5jCmluZGV4IGY4MjY4N2UuLjZkODY3M2YgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2dlc3RhbHRtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9nZXN0YWx0bW9kdWxlLmMKQEAgLTMzLDE3ICszMywxMCBAQAogZ2VzdGFsdF9nZXN0YWx0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAlPU0VyciBpRXJyOwotCWNoYXIgKnN0cjsKLQlpbnQgc2l6ZTsKIAlPU1R5cGUgc2VsZWN0b3I7CiAJbG9uZyByZXNwb25zZTsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJzIyIsICZzdHIsICZzaXplKSkKKwlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yKSkKIAkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNpemUgIT0gNCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZ2VzdGFsdCBhcmcgbXVzdCBiZSA0LWNoYXIgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzZWxlY3RvciA9ICooT1NUeXBlKilzdHI7CiAJaUVyciA9IEdlc3RhbHQgKCBzZWxlY3RvciwgJnJlc3BvbnNlICk7CiAJaWYgKGlFcnIgIT0gMCkgCiAJCXJldHVybiBQeU1hY19FcnJvcihpRXJyKTsKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKaW5kZXggMTE4ZGZjNC4uYmZiMDQwZiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKQEAgLTU4MjQsNyArNTgyNCw2IEBACiB7CiAJUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCWNoYXIgKnRleHRCdWZfX2luX187Ci0JaW50IHRleHRCdWZfX2xlbl9fOwogCWludCB0ZXh0QnVmX19pbl9sZW5fXzsKIAlzaG9ydCBmaXJzdEJ5dGU7CiAJc2hvcnQgYnl0ZUNvdW50OwpAQCAtNTg4NSw3ICs1ODg0LDYgQEAKIAlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAJc2hvcnQgX3J2OwogCWNoYXIgKnRleHRCdWZfX2luX187Ci0JaW50IHRleHRCdWZfX2xlbl9fOwogCWludCB0ZXh0QnVmX19pbl9sZW5fXzsKIAlzaG9ydCBmaXJzdEJ5dGU7CiAJc2hvcnQgYnl0ZUNvdW50OwpAQCAtNjQ3MSw3ICs2NDY5LDYgQEAKIHsKIAlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAJY2hhciAqdGV4dEJ1Zl9faW5fXzsKLQlpbnQgdGV4dEJ1Zl9fbGVuX187CiAJaW50IHRleHRCdWZfX2luX2xlbl9fOwogCXNob3J0IGZpcnN0Qnl0ZTsKIAlzaG9ydCBieXRlQ291bnQ7CkBAIC02NTM0LDcgKzY1MzEsNyBAQAogCSAgICAgICAgcmV0dXJuIE5VTEw7CiAJaWYgKCBQeVN0cmluZ19TaXplKHNvdXJjZSkgIT0gc2l6ZW9mKEJpdE1hcCkgJiYgUHlTdHJpbmdfU2l6ZShzb3VyY2UpICE9IHNpemVvZihQaXhNYXApICkgewogCSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkgICAgICAgICAgICAgICAgIkFyZ3VtZW50IHNpemUgd2FzICVkLCBzaG91bGQgYmUgJWQgKHNpemVvZiBCaXRNYXApIG9yICVkIChzaXplb2YgUGl4TWFwKSIsCisJICAgICAgICAgICAgICAgICJBcmd1bWVudCBzaXplIHdhcyAlbGQsIHNob3VsZCBiZSAlbHUgKHNpemVvZiBCaXRNYXApIG9yICVsdSAoc2l6ZW9mIFBpeE1hcCkiLAogCSAgICAgICAgICAgICAgICBQeVN0cmluZ19TaXplKHNvdXJjZSksIHNpemVvZihCaXRNYXApLCBzaXplb2YoUGl4TWFwKSk7CiAJICAgICAgICByZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9NYWtlZmlsZS5wcmUuaW4gYi9NYWtlZmlsZS5wcmUuaW4KaW5kZXggMDU2YjU3OC4uZjhhNzQ4MSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUucHJlLmluCisrKyBiL01ha2VmaWxlLnByZS5pbgpAQCAtMzAsNiArMzAsNyBAQAogCiBDQz0JCUBDQ0AKIENYWD0JCUBDWFhACitNQUlOQ0M9CQlATUFJTkNDQAogTElOS0NDPQkJQExJTktDQ0AKIEFSPQkJQEFSQAogUkFOTElCPQkJQFJBTkxJQkAKQEAgLTE1Nyw3ICsxNTgsNiBAQAogU1lTTElCUz0JJChMSUJNKSAkKExJQkMpCiBTSExJQlM9CQlAU0hMSUJTQAogCi1NQUlOT0JKPQlATUFJTk9CSkAKIFRIUkVBRE9CSj0JQFRIUkVBRE9CSkAKIERMSU5DTERJUj0JQERMSU5DTERJUkAKIERZTkxPQURGSUxFPQlARFlOTE9BREZJTEVACkBAIC0yMTksMTMgKzIxOSwxNSBAQAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBBU1QKLUFTVF9IPQkJJChzcmNkaXIpL0luY2x1ZGUvUHl0aG9uLWFzdC5oCi1BU1RfQz0JCSQoc3JjZGlyKS9QeXRob24vUHl0aG9uLWFzdC5jCitBU1RfSF9ESVI9CSQoc3JjZGlyKS9JbmNsdWRlCitBU1RfSD0JCSQoQVNUX0hfRElSKS9QeXRob24tYXN0LmgKK0FTVF9DX0RJUj0JJChzcmNkaXIpL1B5dGhvbgorQVNUX0M9CQkkKEFTVF9DX0RJUikvUHl0aG9uLWFzdC5jCiBBU1RfQVNETD0JJChzcmNkaXIpL1BhcnNlci9QeXRob24uYXNkbAogCiBBU0RMR0VOX0ZJTEVTPQkkKHNyY2RpcikvUGFyc2VyL2FzZGwucHkgJChzcmNkaXIpL1BhcnNlci9hc2RsX2MucHkKICMgWFhYIE5vdGUgdGhhdCBhIGJ1aWxkIG5vdyByZXF1aXJlcyBQeXRob24gZXhpc3QgYmVmb3JlIHRoZSBidWlsZCBzdGFydHMKLUFTRExHRU49CSQoc3JjZGlyKS9QYXJzZXIvYXNkbF9jLnB5IC1oICQoc3JjZGlyKS9JbmNsdWRlIC1jICQoc3JjZGlyKS9QeXRob24KK0FTRExHRU49CSQoc3JjZGlyKS9QYXJzZXIvYXNkbF9jLnB5CiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIFB5dGhvbgpAQCAtMzI2LDkgKzMyOCw5IEBACiBhbGw6CQkkKEJVSUxEUFlUSE9OKSBvbGRzaGFyZWRtb2RzIHNoYXJlZG1vZHMKIAogIyBCdWlsZCB0aGUgaW50ZXJwcmV0ZXIKLSQoQlVJTERQWVRIT04pOglNb2R1bGVzLyQoTUFJTk9CSikgJChMSUJSQVJZKSAkKExETElCUkFSWSkKKyQoQlVJTERQWVRIT04pOglNb2R1bGVzL3B5dGhvbi5vICQoTElCUkFSWSkgJChMRExJQlJBUlkpCiAJCSQoTElOS0NDKSAkKExERkxBR1MpICQoTElOS0ZPUlNIQVJFRCkgLW8gJEAgXAotCQkJTW9kdWxlcy8kKE1BSU5PQkopIFwKKwkJCU1vZHVsZXMvcHl0aG9uLm8gXAogCQkJJChCTERMSUJSQVJZKSAkKExJQlMpICQoTU9ETElCUykgJChTWVNMSUJTKSAkKExETEFTVCkKIAogcGxhdGZvcm06ICQoQlVJTERQWVRIT04pCkBAIC00NDgsOCArNDUwLDggQEAKIAkJLURWUEFUSD0nIiQoVlBBVEgpIicgXAogCQktbyAkQCAkKHNyY2RpcikvTW9kdWxlcy9nZXRwYXRoLmMKIAotTW9kdWxlcy9jY3B5dGhvbi5vOiAkKHNyY2RpcikvTW9kdWxlcy9jY3B5dGhvbi5jYwotCSQoQ1hYKSAtYyAkKFBZX0NGTEFHUykgLW8gJEAgJChzcmNkaXIpL01vZHVsZXMvY2NweXRob24uY2MKK01vZHVsZXMvcHl0aG9uLm86ICQoc3JjZGlyKS9Nb2R1bGVzL3B5dGhvbi5jCisJJChNQUlOQ0MpIC1jICQoUFlfQ0ZMQUdTKSAtbyAkQCAkKHNyY2RpcikvTW9kdWxlcy9weXRob24uYwogCiAKICQoR1JBTU1BUl9IKSAkKEdSQU1NQVJfQyk6ICQoUEdFTikgJChHUkFNTUFSX0lOUFVUKQpAQCAtNDY1LDkgKzQ2NywxMiBAQAogCiBQYXJzZXIvdG9rZW5pemVyX3BnZW4ubzoJJChzcmNkaXIpL1BhcnNlci90b2tlbml6ZXIuYwogCi0kKEFTVF9IKSAkKEFTVF9DKTogJChBU1RfQVNETCkgJChBU0RMR0VOX0ZJTEVTKQotCSQoQVNETEdFTikgJChBU1RfQVNETCkKKyQoQVNUX0gpOiAkKEFTVF9BU0RMKSAkKEFTRExHRU5fRklMRVMpCisJJChBU0RMR0VOKSAtaCAkKEFTVF9IX0RJUikgJChBU1RfQVNETCkKIAorJChBU1RfQyk6ICQoQVNUX0FTREwpICQoQVNETEdFTl9GSUxFUykKKwkkKEFTRExHRU4pIC1jICQoQVNUX0NfRElSKSAkKEFTVF9BU0RMKQorCQogUHl0aG9uL2NvbXBpbGUubyBQeXRob24vc3ltdGFibGUubzogJChHUkFNTUFSX0gpICQoQVNUX0gpCiAKIFB5dGhvbi9nZXRwbGF0Zm9ybS5vOiAkKHNyY2RpcikvUHl0aG9uL2dldHBsYXRmb3JtLmMKQEAgLTUzNyw3ICs1NDIsNyBAQAogCQlJbmNsdWRlL3dlYWtyZWZvYmplY3QuaCBcCiAJCXB5Y29uZmlnLmgKIAotJChMSUJSQVJZX09CSlMpICQoTU9ET0JKUykgTW9kdWxlcy8kKE1BSU5PQkopOiAkKFBZVEhPTl9IRUFERVJTKQorJChMSUJSQVJZX09CSlMpICQoTU9ET0JKUykgTW9kdWxlcy9weXRob24ubzogJChQWVRIT05fSEVBREVSUykKIAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC02ODAsOSArNjg1LDEzIEBACiBQTEFUTUFDUEFUSD06cGxhdC1tYWM6cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzCiBMSUJTVUJESVJTPQlsaWItb2xkIGxpYi10ayBzaXRlLXBhY2thZ2VzIHRlc3QgdGVzdC9vdXRwdXQgdGVzdC9kYXRhIFwKIAkJdGVzdC9kZWNpbWFsdGVzdGRhdGEgXAotCQllbmNvZGluZ3MgZW1haWwgZW1haWwvdGVzdCBlbWFpbC90ZXN0L2RhdGEgY29tcGlsZXIgaG90c2hvdCBcCi0JCWxvZ2dpbmcgYnNkZGIgYnNkZGIvdGVzdCBjc3YgY3R5cGVzIGlkbGVsaWIgaWRsZWxpYi9JY29ucyBcCisJCWVuY29kaW5ncyBjb21waWxlciBob3RzaG90IFwKKwkJZW1haWwgZW1haWwvbWltZSBlbWFpbC90ZXN0IGVtYWlsL3Rlc3QvZGF0YSBcCisJCXNxbGl0ZTMgc3FsaXRlMy90ZXN0IFwKKwkJbG9nZ2luZyBic2RkYiBic2RkYi90ZXN0IGNzdiBcCisJCWN0eXBlcyBjdHlwZXMvdGVzdCBjdHlwZXMvbWFjaG9saWIgaWRsZWxpYiBpZGxlbGliL0ljb25zIFwKIAkJZGlzdHV0aWxzIGRpc3R1dGlscy9jb21tYW5kIGRpc3R1dGlscy90ZXN0cyAkKFhNTExJQlNVQkRJUlMpIFwKKwkJc2V0dXB0b29scyBzZXR1cHRvb2xzL2NvbW1hbmQgc2V0dXB0b29scy90ZXN0cyBzZXR1cHRvb2xzLmVnZy1pbmZvIFwKIAkJY3Vyc2VzICQoTUFDSERFUFMpCiBsaWJpbnN0YWxsOgkkKEJVSUxEUFlUSE9OKSAkKHNyY2RpcikvTGliLyQoUExBVERJUikKIAlAZm9yIGkgaW4gJChTQ1JJUFRESVIpICQoTElCREVTVCk7IFwKQEAgLTcxOCw2ICs3MjcsNyBAQAogCWRvIFwKIAkJYT0kKHNyY2RpcikvTGliLyQkZDsgXAogCQlpZiB0ZXN0ICEgLWQgJCRhOyB0aGVuIGNvbnRpbnVlOyBlbHNlIHRydWU7IGZpOyBcCisJCWlmIHRlc3QgYGxzICQkYSB8IHdjIC1sYCAtbHQgMTsgdGhlbiBjb250aW51ZTsgZmk7IFwKIAkJYj0kKExJQkRFU1QpLyQkZDsgXAogCQlmb3IgaSBpbiAkJGEvKjsgXAogCQlkbyBcCkBAIC04MDksNyArODE5LDcgQEAKIAkJZmk7IFwKIAlmaQogCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL2NvbmZpZy5jICQoREVTVERJUikkKExJQlBMKS9jb25maWcuYwotCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzLyQoTUFJTk9CSikgJChERVNURElSKSQoTElCUEwpLyQoTUFJTk9CSikKKwkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9weXRob24ubyAkKERFU1RESVIpJChMSUJQTCkvcHl0aG9uLm8KIAkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01vZHVsZXMvY29uZmlnLmMuaW4gJChERVNURElSKSQoTElCUEwpL2NvbmZpZy5jLmluCiAJJChJTlNUQUxMX0RBVEEpIE1ha2VmaWxlICQoREVTVERJUikkKExJQlBMKS9NYWtlZmlsZQogCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwICQoREVTVERJUikkKExJQlBMKS9TZXR1cApAQCAtODE3LDYgKzgyNywxMSBAQAogCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwLmNvbmZpZyAkKERFU1RESVIpJChMSUJQTCkvU2V0dXAuY29uZmlnCiAJJChJTlNUQUxMX1NDUklQVCkgJChzcmNkaXIpL01vZHVsZXMvbWFrZXNldHVwICQoREVTVERJUikkKExJQlBMKS9tYWtlc2V0dXAKIAkkKElOU1RBTExfU0NSSVBUKSAkKHNyY2RpcikvaW5zdGFsbC1zaCAkKERFU1RESVIpJChMSUJQTCkvaW5zdGFsbC1zaAorCSMgU3Vic3RpdHV0aW9uIGhhcHBlbnMgaGVyZSwgYXMgdGhlIGNvbXBsZXRlbHktZXhwYW5kZWQgQklORElSCisJIyBpcyBub3QgYXZhaWxhYmxlIGluIGNvbmZpZ3VyZQorCXNlZCAtZSAicyxAQklORElSQCwkKEJJTkRJUiksIiA8ICQoc3JjZGlyKS9NaXNjL3B5dGhvbi1jb25maWcuaW4gPnB5dGhvbi1jb25maWcKKwkkKElOU1RBTExfU0NSSVBUKSBweXRob24tY29uZmlnICQoQklORElSKS9weXRob24tY29uZmlnCisJcm0gcHl0aG9uLWNvbmZpZwogCUBpZiBbIC1zIE1vZHVsZXMvcHl0aG9uLmV4cCAtYSBcCiAJCSJgZWNobyAkKE1BQ0hERVApIHwgc2VkICdzL15cKC4uLlwpLiovXDEvJ2AiID0gImFpeCIgXTsgdGhlbiBcCiAJCWVjaG87IGVjaG8gIkluc3RhbGxpbmcgc3VwcG9ydCBmaWxlcyBmb3IgYnVpbGRpbmcgc2hhcmVkIGV4dGVuc2lvbiBtb2R1bGVzIG9uIEFJWDoiOyBcCkBAIC05NDIsNiArOTU3LDEwIEBACiAuYy5vOgogCSQoQ0MpIC1jICQoUFlfQ0ZMQUdTKSAtbyAkQCAkPAogCisjIFJ1biByZWluZGVudCBvbiB0aGUgbGlicmFyeQorcmVpbmRlbnQ6CisJLi9weXRob24kKEVYRUVYVCkgJChzcmNkaXIpL1Rvb2xzL3NjcmlwdHMvcmVpbmRlbnQucHkgLXIgJChzcmNkaXIpL0xpYgorCiAjIFJlcnVuIGNvbmZpZ3VyZSB3aXRoIHRoZSBzYW1lIG9wdGlvbnMgYXMgaXQgd2FzIHJ1biBsYXN0IHRpbWUsCiAjIHByb3ZpZGVkIHRoZSBjb25maWcuc3RhdHVzIHNjcmlwdCBleGlzdHMKIHJlY2hlY2s6CkBAIC05NjksMTMgKzk4OCwxNCBAQAogCiAjIFNhbml0YXRpb24gdGFyZ2V0cyAtLSBjbGVhbiBsZWF2ZXMgbGlicmFyaWVzLCBleGVjdXRhYmxlcyBhbmQgdGFncwogIyBmaWxlcywgd2hpY2ggY2xvYmJlciByZW1vdmVzIHRob3NlIGFzIHdlbGwKK3B5Y3JlbW92YWw6CisJZmluZCAkKHNyY2RpcikgLW5hbWUgJyoucHlbY29dJyAtZXhlYyBybSAtZiB7fSAnOycKIAotY2xlYW46CitjbGVhbjogcHljcmVtb3ZhbAogCWZpbmQgLiAtbmFtZSAnKi5vJyAtZXhlYyBybSAtZiB7fSAnOycKIAlmaW5kIC4gLW5hbWUgJyouc1tvbF0nIC1leGVjIHJtIC1mIHt9ICc7JwotCWZpbmQgJChzcmNkaXIpIC1uYW1lICcqLnB5W2NvXScgLWV4ZWMgcm0gLWYge30gJzsnCi0JZmluZCAkKHNyY2RpcikgLW5hbWUgJ2ZmaWNvbmZpZy5oJyAtZXhlYyBybSAtZiB7fSAnOycKLQlmaW5kICQoc3JjZGlyKSAtbmFtZSAnZmZpY29uZmlnLnB5JyAtZXhlYyBybSAtZiB7fSAnOycKKwlmaW5kICQoc3JjZGlyKS9idWlsZCAtbmFtZSAnZmZpY29uZmlnLmgnIC1leGVjIHJtIC1mIHt9ICc7JyB8fCB0cnVlCisJZmluZCAkKHNyY2RpcikvYnVpbGQgLW5hbWUgJ2ZmaWNvbmZpZy5weScgLWV4ZWMgcm0gLWYge30gJzsnIHx8IHRydWUKIAogY2xvYmJlcjogY2xlYW4KIAktcm0gLWYgJChCVUlMRFBZVEhPTikgJChQR0VOKSAkKExJQlJBUlkpICQoTERMSUJSQVJZKSAkKERMTExJQlJBUlkpIFwKZGlmZiAtLWdpdCBhL01pc2MvQUNLUyBiL01pc2MvQUNLUwppbmRleCA5MjI1MDMxLi5hODI0YTg2IDEwMDY0NAotLS0gYS9NaXNjL0FDS1MKKysrIGIvTWlzYy9BQ0tTCkBAIC0xMzIsNiArMTMyLDcgQEAKIE1hdHQgQ29ud2F5CiBEYXZpZCBNLiBDb29rZQogR3JlZyBDb3BlbGFuZAorQWxkbyBDb3J0ZXNpCiBEYXZpZCBDb3N0YW56bwogU2NvdHQgQ290dG9uCiBHcmVnIENvdWNoCkBAIC00NzcsNiArNDc4LDcgQEAKIERhbiBQaWVyc29uCiBNYXJ0aWpuIFBpZXRlcnMKIEZyYW7nb2lzIFBpbmFyZAorWmFjaCBQaW5jdXMKIE1pY2hhZWwgUGlvdHJvd3NraQogSXVzdGluIFBvcAogSm9obiBQb3BwbGV3ZWxsCkBAIC01MzYsNiArNTM4LDcgQEAKIEdyZWdvciBTY2htaWQKIFJhbGYgU2NobWl0dAogUGV0ZXIgU2NobmVpZGVyLUthbXAKK0NoYWQgSi4gU2Nocm9lZGVyCiBTYW0gU2NodWxlbmJ1cmcKIFN0ZWZhbiBTY2h3YXJ6ZXIKIERpZXRtYXIgU2Nod2VydGJlcmdlcgpkaWZmIC0tZ2l0IGEvTWlzYy9CZU9TLXNldHVwLnB5IGIvTWlzYy9CZU9TLXNldHVwLnB5CmluZGV4IDA3ZGJlMTUuLjk5MWU2MDggMTAwNjQ0Ci0tLSBhL01pc2MvQmVPUy1zZXR1cC5weQorKysgYi9NaXNjL0JlT1Mtc2V0dXAucHkKQEAgLTE3Niw4ICsxNzYsNiBAQAogICAgICAgICAjCiAKICAgICAgICAgIyBTb21lIG1vZHVsZXMgdGhhdCBhcmUgbm9ybWFsbHkgYWx3YXlzIG9uOgotICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdyZWdleCcsIFsncmVnZXhtb2R1bGUuYycsICdyZWdleHByLmMnXSkgKQotCiAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ193ZWFrcmVmJywgWydfd2Vha3JlZi5jJ10pICkKICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX3N5bXRhYmxlJywgWydzeW10YWJsZW1vZHVsZS5jJ10pICkKIApkaWZmIC0tZ2l0IGEvTWlzYy9ISVNUT1JZIGIvTWlzYy9ISVNUT1JZCmluZGV4IGQ4ODQ3YTguLmJlNGNhODggMTAwNjQ0Ci0tLSBhL01pc2MvSElTVE9SWQorKysgYi9NaXNjL0hJU1RPUlkKQEAgLTgsNiArOCw1MjkzIEBACiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAorV2hhdCdzIE5ldyBpbiBQeXRob24gMi40IGZpbmFsPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAzMC1OT1YtMjAwNCoKKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQnVnIDg3NTY5MjogSW1wcm92ZSBzaWduYWwgaGFuZGxpbmcsIGVzcGVjaWFsbHkgd2hlbiB1c2luZyB0aHJlYWRzLCBieQorICBmb3JjaW5nIGFuIGVhcmx5IHJlLWV4ZWN1dGlvbiBvZiBQeUV2YWxfRXZhbEZyYW1lKCkgInBlcmlvZGljIiBjb2RlIHdoZW4KKyAgdGhpbmdzX3RvX2RvIGlzIG5vdCBjbGVhcmVkIGJ5IFB5X01ha2VQZW5kaW5nQ2FsbHMoKS4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjQgKHJlbGVhc2UgY2FuZGlkYXRlIDEpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE4LU5PVi0yMDA0KgorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBCdWcgMTA2MTk2ODogIEZpeGVzIGluIDIuNGEzIHRvIGFkZHJlc3MgdGhyZWFkIGJ1ZyAxMDEwNjc3IHJlaW50cm9kdWNlZAorICB0aGUgeWVhcnMtb2xkIHRocmVhZCBzaHV0ZG93biByYWNlIGJ1ZyAyMjU2NzMuICBOdW1lcmljIGhpc3RvcnkgbGVzc29uCisgIGFzaWRlLCBhbGwgYnVncyBpbiBhbGwgdGhyZWUgcmVwb3J0cyBhcmUgZml4ZWQgbm93LgorCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBCdWcgMTA1MjI0MjogSWYgZXhjZXB0aW9ucyBhcmUgcmFpc2VkIGJ5IGFuIGF0ZXhpdCBoYW5kbGVyIGZ1bmN0aW9uIGFuCisgIGF0dGVtcHQgaXMgbWFkZSB0byBleGVjdXRlIHRoZSByZW1haW5pbmcgaGFuZGxlcnMuICBUaGUgbGFzdCBleGNlcHRpb24KKyAgcmFpc2VkIGlzIHJlLXJhaXNlZC4KKworLSBgYGRvY3Rlc3RgYCdzIG5ldyBzdXBwb3J0IGZvciBhZGRpbmcgYGBwZGIuc2V0X3RyYWNlKClgYCBjYWxscyB0bworICBkb2N0ZXN0cyB3YXMgYnJva2VuIGluIGEgZHJhbWF0aWMgYnV0IHNoYWxsb3cgd2F5LiAgRml4ZWQuCisKKy0gQnVnIDEwNjUzODg6ICBgYGNhbGVuZGFyYGAncyBgYGRheV9uYW1lYGAsIGBgZGF5X2FiYnJgYCwgYGBtb250aF9uYW1lYGAsCisgIGFuZCBgYG1vbnRoX2FiYnJgYCBhdHRyaWJ1dGVzIGVtdWxhdGUgc2VxdWVuY2VzIG9mIGxvY2FsZS1jb3JyZWN0CisgIHNwZWxsaW5ncyBvZiBtb250aCBhbmQgZGF5IG5hbWVzLiAgQmVjYXVzZSB0aGUgbG9jYWxlIGNhbiBjaGFuZ2UgYXQKKyAgYW55IHRpbWUsIHRoZSBjb3JyZWN0IHNwZWxsaW5nIGlzIHJlY29tcHV0ZWQgd2hlbmV2ZXIgb25lIG9mIHRoZXNlIGlzCisgIGluZGV4ZWQuICBJbiB0aGUgd29yc3QgY2FzZSwgdGhlIGluZGV4IG1heSBiZSBhIHNsaWNlIG9iamVjdCwgc28gdGhlc2UKKyAgcmVjb21wdXRlZCBldmVyeSBkYXkgb3IgbW9udGggbmFtZSBlYWNoIHRpbWUgdGhleSB3ZXJlIGluZGV4ZWQuICBUaGlzIGlzCisgIG11Y2ggc2xvd2VyIHRoYW4gbmVjZXNzYXJ5IGluIHRoZSB1c3VhbCBjYXNlLCB3aGVuIHRoZSBpbmRleCBpcyBqdXN0IGFuCisgIGludGVnZXIuICBJbiB0aGF0IGNhc2UsIG9ubHkgdGhlIHNpbmdsZSBzcGVsbGluZyBuZWVkZWQgaXMgcmVjb21wdXRlZAorICBub3c7IGFuZCwgd2hlbiB0aGUgaW5kZXggaXMgYSBzbGljZSBvYmplY3QsIG9ubHkgdGhlIHNwZWxsaW5ncyBuZWVkZWQKKyAgYnkgdGhlIHNsaWNlIGFyZSByZWNvbXB1dGVkIG5vdy4KKworLSBQYXRjaCAxMDYxNjc5OiBBZGRlZCBgYF9fYWxsX19gYCB0byBwaWNrbGV0b29scy5weS4KKworQnVpbGQKKy0tLS0tCisKKy0gQnVnIDEwMzQyNzcgLyBQYXRjaCAxMDM1MjU1OiBSZW1vdmUgY29tcGlsYXRpb24gb2YgY29yZSBhZ2FpbnN0IENvcmVTZXJ2aWNlcworICBhbmQgQ29yZUZvdW5kYXRpb24gb24gT1MgWC4gIEludm9sdmVkIHJlbW92aW5nIFB5TWFjX0dldEFwcGxldFNjcmlwdEZpbGUoKQorICB3aGljaCBoYXMgbm8ga25vd24gdXNlcnMuICBUaGFua3MgQm9iIElwcG9saXRvLgorCitDIEFQSQorLS0tLS0KKworLSBUaGUgUHlSYW5nZV9OZXcoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuNCBiZXRhIDI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwMy1OT1YtMjAwNCoKKworTGljZW5zZQorLS0tLS0tLQorCitUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gY2hhbmdlZCB0aGUgbGljZW5zZSB1bmRlciB3aGljaCBQeXRob24KK2lzIHJlbGVhc2VkLCB0byByZW1vdmUgUHl0aG9uIHZlcnNpb24gbnVtYmVycy4gIFRoZXJlIHdlcmUgbm8gb3RoZXIKK2NoYW5nZXMgdG8gdGhlIGxpY2Vuc2UuICBTbywgZm9yIGV4YW1wbGUsIHdoZXJldmVyIHRoZSBsaWNlbnNlIGZvcgorUHl0aG9uIDIuMyBzYWlkICJQeXRob24gMi4zIiwgdGhlIG5ldyBsaWNlbnNlIHNheXMgIlB5dGhvbiIuICBUaGUKK2ludGVudCBpcyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlZmVyIHRvIHRoZSBQU0YgbGljZW5zZSBpbiBhIG1vcmUKK2R1cmFibGUgd2F5LiAgRm9yIGV4YW1wbGUsIHNvbWUgcGVvcGxlIHNheSB0aGV5J3JlIGNvbmZ1c2VkIGJ5IHRoYXQKK3RoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlJ3MgZW50cnkgZm9yIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorTGljZW5zZTo6CisKKyAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvUHl0aG9uU29mdEZvdW5kYXRpb24ucGhwCisKK3NheXMgIlB5dGhvbiAyLjEuMSIgYWxsIG92ZXIgaXQsIHdvbmRlcmluZyB3aGV0aGVyIGl0IGFwcGxpZXMgb25seQordG8gUHl0aG9uIDIuMS4xLgorCitUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgbmV3IGxpY2Vuc2UgaXMgdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCitMaWNlbnNlIFZlcnNpb24gMi4KKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQnVnICMxMDU1ODIwIEN5Y2xpYyBnYXJiYWdlIGNvbGxlY3Rpb24gd2FzIG5vdCBwcm90ZWN0aW5nIGFnYWluc3QgdGhhdAorICBjYWxsaW5nIGEgbGl2ZSB3ZWFrcmVmIHRvIGEgcGllY2Ugb2YgY3ljbGljIHRyYXNoIGNvdWxkIHJlc3VycmVjdCBhbgorICBpbnNhbmUgbXV0YXRpb24gb2YgdGhlIHRyYXNoIGlmIGFueSBQeXRob24gY29kZSByYW4gZHVyaW5nIGdjICh2aWEKKyAgcnVubmluZyBhIGRlYWQgb2JqZWN0J3MgX19kZWxfXyBtZXRob2QsIHJ1bm5pbmcgYW5vdGhlciBjYWxsYmFjayBvbiBhCisgIHdlYWtyZWYgdG8gYSBkZWFkIG9iamVjdCwgb3IgdmlhIGFueSBQeXRob24gY29kZSBydW4gaW4gYW55IG90aGVyIHRocmVhZAorICB0aGF0IG1hbmFnZWQgdG8gb2J0YWluIHRoZSBHSUwgd2hpbGUgYSBfX2RlbF9fIG9yIGNhbGxiYWNrIHdhcyBydW5uaW5nCisgIGluIHRoZSB0aHJlYWQgZG9pbmcgZ2MpLiAgVGhlIG1vc3QgbGlrZWx5IHN5bXB0b20gd2FzICJpbXBvc3NpYmxlIgorICBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9ucywgYXBwZWFyaW5nIHNlZW1pbmdseSBhdCByYW5kb20sIG9uIHdlYWtseQorICByZWZlcmVuY2VkIG9iamVjdHMuICBUaGUgY3VyZSB3YXMgdG8gY2xlYXIgYWxsIHdlYWtyZWZzIHRvIHVucmVhY2hhYmxlCisgIG9iamVjdHMgYmVmb3JlIGFsbG93aW5nIGFueSBjYWxsYmFja3MgdG8gcnVuLgorCistIEJ1ZyAjMTA1NDEzOSBfUHlTdHJpbmdfUmVzaXplKCkgbm93IGludmFsaWRhdGVzIGl0cyBjYWNoZWQgaGFzaCB2YWx1ZS4KKworRXh0ZW5zaW9uIE1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQnVnICMxMDQ4ODcwOiAgdGhlIGNvbXBpbGVyIG5vdyBnZW5lcmF0ZXMgZGlzdGluY3QgY29kZSBvYmplY3RzIGZvcgorICBmdW5jdGlvbnMgd2l0aCBpZGVudGljYWwgYm9kaWVzLiAgVGhpcyB3YXMgcHJvZHVjaW5nIGNvbmZ1c2luZworICB0cmFjZWJhY2sgbWVzc2FnZXMgd2hpY2ggcG9pbnRlZCB0byB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIGNvZGUKKyAgb2JqZWN0IHdhcyBmaXJzdCBkZWZpbmVkIHJhdGhlciB0aGFuIHRoZSBmdW5jdGlvbiBiZWluZyBleGVjdXRlZC4KKworTGlicmFyeQorLS0tLS0tLQorCistIFBhdGNoICMxMDU2OTY3IGNoYW5nZXMgdGhlIHNlbWFudGljcyBvZiBUZW1wbGF0ZS5zYWZlX3N1YnN0aXR1dGUoKSBzbyB0aGF0CisgIG5vIFZhbHVlRXJyb3IgaXMgcmFpc2VkIG9uIGFuICdpbnZhbGlkJyBtYXRjaCBncm91cC4gIE5vdyB0aGUgZGVsaW1pdGVyIGlzCisgIHJldHVybmVkLgorCistIEJ1ZyAjMTA1MjUwMyBwZGIucnVuY2FsbCgpIHdhcyBub3QgcGFzc2luZyBhbG9uZyBrZXl3b3JkIGFyZ3VtZW50cy4KKworLSBCdWcgIzkwMjAzNzogWE1MLnNheC5zYXh1dGlscy5wcmVwYXJlX2lucHV0X3NvdXJjZSgpIG5vdyBjb21iaW5lcyByZWxhdGl2ZQorICBwYXRocyB3aXRoIGEgYmFzZSBwYXRoIGJlZm9yZSBjaGVja2luZyBvcy5wYXRoLmlzZmlsZSgpLgorCistIFRoZSB3aGljaGRiIG1vZHVsZSBjYW4gbm93IGJlIHJ1biBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisKKy0gQnVnICMxMDQ1MzgxOiB0aW1lLnN0cnB0aW1lKCkgY2FuIG5vdyBpbmZlciB0aGUgZGF0ZSB1c2luZyAlVSBvciAlVyAod2VlayBvZgorICB0aGUgeWVhcikgd2hlbiB0aGUgZGF5IG9mIHRoZSB3ZWVrIGFuZCB5ZWFyIGFyZSBhbHNvIHNwZWNpZmllZC4KKworLSBCdWcgIzEwNDg4MTY6IGZpeCBidWcgaW4gQ3RybC1LIGF0IHN0YXJ0IG9mIGxpbmUgaW4gY3Vyc2VzLnRleHRwYWQuVGV4dGJveAorCistIEJ1ZyAjMTAxNzU1MzogZml4IGJ1ZyBpbiB0YXJmaWxlLmZpbGVtb2RlKCkKKworLSBQYXRjaCAjNzM3NDczOiBmaXggYnVnIHRoYXQgb2xkIHNvdXJjZSBjb2RlIGlzIHNob3duIGluIHRyYWNlYmFja3MgZXZlbiBpZgorICB0aGUgc291cmNlIGNvZGUgaXMgdXBkYXRlZCBhbmQgcmVsb2FkZWQuCisKK0J1aWxkCistLS0tLQorCistIFBhdGNoICMxMDQ0Mzk1OiAtLWVuYWJsZS1zaGFyZWQgaXMgYWxsb3dlZCBpbiBGcmVlQlNEIGFsc28uCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuNCBiZXRhIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAxNS1PQ1QtMjAwNCoKKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gUGF0Y2ggIzk3NTA1NjogUmVzdGFydGFibGUgc2lnbmFscyB3ZXJlIG5vdCBjb3JyZWN0bHkgZGlzYWJsZWQgb24KKyAgQlNEIHN5c3RlbXMuIENvbnNpc3RlbnRseSB1c2UgUHlPU19zZXRzaWcoKSBpbnN0ZWFkIG9mIHNpZ25hbCgpLgorCistIFRoZSBpbnRlcm5hbCBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWQtbG9jYWwgc3RvcmFnZSAoVExTKSwgdXNlZAorICBieSB0aGUgYGBQeUdJTFN0YXRlX0Vuc3VyZSgpYGAvYGBQeUdJTFN0YXRlX1JlbGVhc2UoKWBgIEFQSSwgd2FzIG5vdAorICB0aHJlYWQtY29ycmVjdC4gIFRoaXMgY291bGQgbGVhZCB0byBhIHZhcmlldHkgb2YgcHJvYmxlbXMsIHVwIHRvIGFuZAorICBpbmNsdWRpbmcgc2VnZmF1bHRzLiAgU2VlIGJ1ZyAxMDQxNjQ1IGZvciBhbiBleGFtcGxlLgorCistIEFkZGVkIGEgY29tbWFuZCBsaW5lIG9wdGlvbiwgLW0gbW9kdWxlLCB3aGljaCBzZWFyY2hlcyBzeXMucGF0aCBmb3IgdGhlCisgIG1vZHVsZSBhbmQgdGhlbiBydW5zIGl0LiAgKENvbnRyaWJ1dGVkIGJ5IE5pY2sgQ29naGxhbi4pCisKKy0gVGhlIGJ5dGVjb2RlIG9wdGltaXplciBub3cgZm9sZHMgdHVwbGVzIG9mIGNvbnN0YW50cyBpbnRvIGEgc2luZ2xlCisgIGNvbnN0YW50LgorCistIFNGIGJ1ZyAjNTEzODY2OiAgRmxvYXQvbG9uZyBjb21wYXJpc29uIGFub21hbHkuICBQcmlvciB0byAyLjRiMSwgd2hlbgorICBhbiBpbnRlZ2VyIHdhcyBjb21wYXJlZCB0byBhIGZsb2F0LCB0aGUgaW50ZWdlciB3YXMgY29lcmNlZCB0byBhIGZsb2F0LgorICBUaGF0IGNvdWxkIHlpZWxkIHNwdXJpb3VzIG92ZXJmbG93IGVycm9ycyAoaWYgdGhlIGludGVnZXIgd2FzIHZlcnkKKyAgbGFyZ2UpLCBhbmQgdG8gYW5vbWFsaWVzIHN1Y2ggYXMKKyAgYGBsb25nKDFlMjAwKSsxID09IDFlMjAwID09IGxvbmcoMWUyMDApLTFgYC4gIENvZXJjaW9uIHRvIGZsb2F0IGlzIG5vCisgIGxvbmdlciBwZXJmb3JtZWQsIGFuZCBjYXNlcyBsaWtlIGBgbG9uZygxZTIwMCktMSA8IDFlMjAwYGAsCisgIGBgbG9uZygxZTIwMCkrMSA+IDFlMjAwYGAgYW5kIGBgKDEgPDwgMjAwMDApID4gMWUyMDBgYCBhcmUgY29tcHV0ZWQKKyAgY29ycmVjdGx5IG5vdy4KKworRXh0ZW5zaW9uIG1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gYGBjb2xsZWN0aW9ucy5kZXF1ZWBgIG9iamVjdHMgZGlkbid0IHBsYXkgcXVpdGUgcmlnaHQgd2l0aCBnYXJiYWdlCisgIGNvbGxlY3Rpb24sIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBzZWdmYXVsdCBpbiBhIHJlbGVhc2UgYnVpbGQsIG9yCisgIGFuIGFzc2VydCBmYWlsdXJlIGluIGEgZGVidWcgYnVpbGQuICBBbHNvLCBhZGRlZCBvdmVyZmxvdyBjaGVja3MsCisgIGJldHRlciBkZXRlY3Rpb24gb2YgbXV0YXRpb24gZHVyaW5nIGl0ZXJhdGlvbiwgYW5kIHNoaWVsZGVkIGRlcXVlCisgIGNvbXBhcmlzb25zIGZyb20gdW51c3VhbCBzdWJjbGFzcyBvdmVycmlkZXMgb2YgdGhlIF9faXRlcl9fKCkgbWV0aG9kLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gUGF0Y2ggMTA0NjY0NDogZGlzdHV0aWxzIGJ1aWxkX2V4dCBncmV3IHR3byBuZXcgb3B0aW9ucyAtIC0tc3dpZyBmb3IKKyAgc3BlY2lmeWluZyB0aGUgc3dpZyBleGVjdXRhYmxlIHRvIHVzZSwgYW5kIC0tc3dpZy1vcHRzIHRvIHNwZWNpZnkKKyAgb3B0aW9ucyB0byBwYXNzIHRvIHN3aWcuIC0tc3dpZy1vcHRzPSItYysrIiBpcyB0aGUgbmV3IHdheSB0byBzcGVsbAorICAtLXN3aWctY3BwLgorCistIFBhdGNoIDk4MzIwNjogZGlzdHV0aWxzIG5vdyBvYmV5cyBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRFNIQVJFRCwgaWYKKyAgaXQgaXMgc2V0LgorCistIEFkZGVkIFBldGVyIEFzdHJhbmQncyBzdWJwcm9jZXNzLnB5IG1vZHVsZS4gIFNlZSBQRVAgMzI0IGZvciBkZXRhaWxzLgorCistIHRpbWUuc3RycHRpbWUoKSBub3cgcHJvcGVybHkgZXNjYXBlcyB0aW1lem9uZXMgYW5kIGFsbCBvdGhlciBsb2NhbGUtc3BlY2lmaWMKKyAgc3RyaW5ncyBmb3IgcmVnZXgtc3BlY2lmaWMgc3ltYm9scy4gIFdhcyBicmVha2luZyB1bmRlciBKYXBhbmVzZSBXaW5kb3dzIHdoZW4KKyAgdGhlIHRpbWV6b25lIHdhcyBzcGVjaWZpZWQgYXMgIlRva3lvIChzdGFuZGFyZCB0aW1lKSIuCisgIENsb3NlcyBidWcgIzEwMzkyNzAuCisKKy0gVXBkYXRlcyBmb3IgdGhlIGVtYWlsIHBhY2thZ2U6CisKKyAgKyBlbWFpbC5VdGlscy5mb3JtYXRkYXRlKCkgZ3JldyBhICd1c2VnbXQnIGFyZ3VtZW50IGZvciBIVFRQIHN1cHBvcnQuCisgICsgQWxsIGRlcHJlY2F0ZWQgQVBJcyB0aGF0IGluIGVtYWlsIDIueCBpc3N1ZWQgd2FybmluZ3MgaGF2ZSBiZWVuIHJlbW92ZWQ6CisgICAgX2VuY29kZXIgYXJndW1lbnQgdG8gdGhlIE1JTUVUZXh0IGNvbnN0cnVjdG9yLCBNZXNzYWdlLmFkZF9wYXlsb2FkKCksCisgICAgVXRpbHMuZHVtcF9hZGRyZXNzX3BhaXIoKSwgVXRpbHMuZGVjb2RlKCksIFV0aWxzLmVuY29kZSgpCisgICsgTmV3IGRlcHJlY2F0aW9uczogR2VuZXJhdG9yLl9fY2FsbF9fKCksIE1lc3NhZ2UuZ2V0X3R5cGUoKSwKKyAgICBNZXNzYWdlLmdldF9tYWluX3R5cGUoKSwgTWVzc2FnZS5nZXRfc3VidHlwZSgpLCB0aGUgJ3N0cmljdCcgYXJndW1lbnQgdG8KKyAgICB0aGUgUGFyc2VyIGNvbnN0cnVjdG9yLiAgVGhlc2Ugd2lsbCBiZSByZW1vdmVkIGluIGVtYWlsIDMuMS4KKyAgKyBTdXBwb3J0IGZvciBQeXRob24gZWFybGllciB0aGFuIDIuMyBoYXMgYmVlbiByZW1vdmVkIChzZWUgUEVQIDI5MSkuCisgICsgQWxsIGRlZmVjdCBjbGFzc2VzIGhhdmUgYmVlbiByZW5hbWVkIHRvIGVuZCBpbiAnRGVmZWN0Jy4KKyAgKyBTb21lIEZlZWRQYXJzZXIgZml4ZXM7IGFsc28gYSBNdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3Qgd2lsbCBiZQorICAgIGFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgY2xhaW0gdG8gYmUgbXVsdGlwYXJ0IGJ1dCByZWFsbHkgYXJlbid0LgorICArIFVwZGF0ZXMgdG8gZG9jdW1lbnRhdGlvbi4KKworLSByZSdzIGZpbmRhbGwoKSBhbmQgZmluZGl0ZXIoKSBmdW5jdGlvbnMgbm93IHRha2UgYW4gb3B0aW9uYWwgZmxhZ3MgYXJndW1lbnQKKyAganVzdCBsaWtlIHRoZSBjb21waWxlKCksIHNlYXJjaCgpLCBhbmQgbWF0Y2goKSBmdW5jdGlvbnMuICBBbHNvLCBkb2N1bWVudGVkCisgIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIHN0YXJ0IGFuZCBzdG9wIHBhcmFtZXRlcnMgZm9yIHRoZSBmaW5kYWxsKCkgYW5kCisgIGZpbmRpdGVyKCkgbWV0aG9kcyBvZiByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cy4KKworLSByZmM4MjIgTWVzc2FnZXMgbm93IHN1cHBvcnQgaXRlcmF0aW5nIG92ZXIgdGhlIGhlYWRlcnMuCisKKy0gVGhlICh1bmRvY3VtZW50ZWQpIHRhcmZpbGUuVGFyZmlsZS5tZW1iZXJuYW1lcyBoYXMgYmVlbiByZW1vdmVkOworICBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUgZ2V0bWVtYmVyIGZ1bmN0aW9uLgorCistIGh0dHBsaWIgbm93IG9mZmVycyBzeW1ib2xpYyBjb25zdGFudHMgZm9yIHRoZSBIVFRQIHN0YXR1cyBjb2Rlcy4KKworLSBTRiBidWcgIzEwMjgzMDY6ICBUcnlpbmcgdG8gY29tcGFyZSBhIGBgZGF0ZXRpbWUuZGF0ZWBgIHRvIGEKKyAgYGBkYXRldGltZS5kYXRldGltZWBgIG1pc3Rha2VubHkgY29tcGFyZWQgb25seSB0aGUgeWVhciwgbW9udGggYW5kIGRheS4KKyAgTm93IGl0IGFjdHMgbGlrZSBhIG1peGVkLXR5cGUgY29tcGFyaXNvbjogIGBgRmFsc2VgYCBmb3IgYGA9PWBgLAorICBgYFRydWVgYCBmb3IgYGAhPWBgLCBhbmQgcmFpc2VzIGBgVHlwZUVycm9yYGAgZm9yIG90aGVyIGNvbXBhcmlzb24KKyAgb3BlcmF0b3JzLiAgQmVjYXVzZSBkYXRldGltZSBpcyBhIHN1YmNsYXNzIG9mIGRhdGUsIGNvbXBhcmluZyBvbmx5IHRoZQorICBiYXNlIGNsYXNzIChkYXRlKSBtZW1iZXJzIGNhbiBzdGlsbCBiZSBkb25lLCBpZiB0aGF0J3MgZGVzaXJlZCwgYnkKKyAgZm9yY2luZyB1c2luZyBvZiB0aGUgYXBwcm9wcmF0ZSBkYXRlIG1ldGhvZDsgZS5nLiwKKyAgYGBhX2RhdGUuX19lcV9fKGFfZGF0ZXRpbWUpYGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgeWVhciwgbW9udGgKKyAgYW5kIGRheSBtZW1iZXJzIG9mIGBgYV9kYXRlYGAgYW5kIGBgYV9kYXRldGltZWBgIGFyZSBlcXVhbC4KKworLSBiZGlzdF9ycG0gbm93IHN1cHBvcnRzIGNvbW1hbmQgbGluZSBvcHRpb25zIC0tZm9yY2UtYXJjaCwKKyAge3ByZSxwb3N0fS1pbnN0YWxsLCAge3ByZSxwb3N0fS11bmluc3RhbGwsIGFuZAorICB7cHJlcCxidWlsZCxpbnN0YWxsLGNsZWFuLHZlcmlmeX0tc2NyaXB0LgorCistIFNGIHBhdGNoICM5OTg5OTM6IFRoZSBVVEYtOCBhbmQgdGhlIFVURi0xNiBzdGF0ZWZ1bCBkZWNvZGVycyBub3cgc3VwcG9ydAorICBkZWNvZGluZyBpbmNvbXBsZXRlIGlucHV0ICh3aGVuIHRoZSBpbnB1dCBzdHJlYW0gaXMgdGVtcG9yYXJpbHkgZXhoYXVzdGVkKS4KKyAgYGBjb2RlY3MuU3RyZWFtUmVhZGVyYGAgbm93IGltcGxlbWVudHMgYnVmZmVyaW5nLCB3aGljaCBlbmFibGVzIHByb3BlcgorICByZWFkbGluZSBzdXBwb3J0IGZvciB0aGUgVVRGLTE2IGRlY29kZXJzLiBgYGNvZGVjcy5TdHJlYW1SZWFkZXIucmVhZCgpYGAKKyAgaGFzIGEgbmV3IGFyZ3VtZW50IGBgY2hhcnNgYCB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvCisgIHJldHVybi4gYGBjb2RlY3MuU3RyZWFtUmVhZGVyLnJlYWRsaW5lKClgYCBhbmQKKyAgYGBjb2RlY3MuU3RyZWFtUmVhZGVyLnJlYWRsaW5lcygpYGAgaGF2ZSBhIG5ldyBhcmd1bWVudCBgYGtlZXBlbmRzYGAuCisgIFRyYWlsaW5nICJcbiJzIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgbGluZXMgaWYgYGBrZWVwZW5kc2BgIGlzIGZhbHNlLgorCistIFRoZSBkb2N1bWVudGF0aW9uIGZvciBkb2N0ZXN0IGlzIGdyZWF0bHkgZXhwYW5kZWQsIGFuZCBub3cgY292ZXJzIGFsbAorICB0aGUgbmV3IHB1YmxpYyBmZWF0dXJlcyAob2Ygd2hpY2ggdGhlcmUgYXJlIG1hbnkpLgorCistIGBgZG9jdGVzdC5tYXN0ZXJgYCB3YXMgcHV0IGJhY2sgaW4sIGFuZCBgYGRvY3Rlc3QudGVzdG1vZCgpYGAgb25jZSBhZ2FpbgorICB1cGRhdGVzIGl0LiAgVGhpcyBpc24ndCBnb29kLCBiZWNhdXNlIGV2ZXJ5IGBgdGVzdG1vZCgpYGAgY2FsbAorICBjb250cmlidXRlcyB0byBibG9hdGluZyB0aGUgImhpZGRlbiIgc3RhdGUgb2YgYGBkb2N0ZXN0Lm1hc3RlcmBgLCBidXQKKyAgc29tZSBvbGQgY29kZSBhcHBhcmVudGx5IHJlbGllcyBvbiBpdC4gIEZvciBub3csIGFsbCB3ZSBjYW4gZG8gaXMKKyAgZW5jb3VyYWdlIHBlb3BsZSB0byBzdGl0Y2ggZG9jdGVzdHMgdG9nZXRoZXIgdmlhIGRvY3Rlc3QncyB1bml0dGVzdAorICBpbnRlZ3JhdGlvbiBmZWF0dXJlcyBpbnN0ZWFkLgorCistIGh0dHBsaWIgbm93IGhhbmRsZXMgaXB2NiBhZGRyZXNzL3BvcnQgcGFpcnMuCisKKy0gU0YgYnVnICMxMDE3ODY0OiBDb25maWdQYXJzZXIgbm93IGNvcnJlY3RseSBoYW5kbGVzIGRlZmF1bHQga2V5cywKKyAgcHJvY2Vzc2luZyB0aGVtIHdpdGggYGBDb25maWdQYXJzZXIub3B0aW9ueGZvcm1gYCB3aGVuIHN1cHBsaWVkLAorICBjb25zaXN0ZW50IHdpdGggdGhlIGhhbmRsaW5nIG9mIGNvbmZpZyBmaWxlIGVudHJpZXMgYW5kIHJ1bnRpbWUtc2V0CisgIG9wdGlvbnMuCisKKy0gU0YgYnVnICM5OTcwNTA6IERvY3VtZW50LCB0ZXN0LCAmIGNoZWNrIGZvciBub24tc3RyaW5nIHZhbHVlcyBpbgorICBDb25maWdQYXJzZXIuICBNb3ZlZCB0aGUgbmV3IHN0cmluZy1vbmx5IHJlc3RyaWN0aW9uIGFkZGVkIGluCisgIHJldi4gMS42NSB0byB0aGUgU2FmZUNvbmZpZ1BhcnNlciBjbGFzcywgbGVhdmluZyBleGlzdGluZworICBDb25maWdQYXJzZXIgJiBSYXdDb25maWdQYXJzZXIgYmVoYXZpb3IgYWxvbmUsIGFuZCBkb2N1bWVudGVkIHRoZQorICBjb25kaXRpb25zIHVuZGVyIHdoaWNoIG5vbi1zdHJpbmcgdmFsdWVzIHdvcmsuCisKK0J1aWxkCistLS0tLQorCistIEJ1aWxkaW5nIG9uIGRhcndpbiBub3cgaW5jbHVkZXMgL29wdC9sb2NhbC9pbmNsdWRlIGFuZCAvb3B0L2xvY2FsL2xpYiBmb3IKKyAgYnVpbGRpbmcgZXh0ZW5zaW9uIG1vZHVsZXMuICBUaGlzIGlzIHNvIGFzIHRvIGluY2x1ZGUgc29mdHdhcmUgaW5zdGFsbGVkIGFzCisgIGEgRGFyd2luUG9ydHMgcG9ydCA8aHR0cDovL2RhcndpbnBvcnRzLm9wZW5kYXJ3aW4ub3JnLz4KKworLSBweXBvcnQuaCBub3cgZGVmaW5lcyBhIFB5X0lTX05BTiBtYWNyby4gIEl0IHdvcmtzIGFzLWlzIHdoZW4gdGhlCisgIHBsYXRmb3JtIEMgY29tcHV0ZXMgdHJ1ZSBmb3IgYGB4ICE9IHhgYCBpZiBhbmQgb25seSBpZiBYIGlzIGEgTmFOLgorICBPdGhlciBwbGF0Zm9ybXMgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGRlZmluaXRpb24gd2l0aCBhIHBsYXRmb3JtLQorICBzcGVjaWZpYyBzcGVsbGluZyBpbiB0aGF0IHBsYXRmb3JtJ3MgcHljb25maWcuaC4gIFlvdSBjYW4gYWxzbyBvdmVycmlkZQorICBweXBvcnQuaCdzIGRlZmF1bHQgUHlfSVNfSU5GSU5JVFkgZGVmaW5pdGlvbiBub3cuCisKK0MgQVBJCistLS0tLQorCistIFNGIHBhdGNoIDEwNDQwODk6ICBOZXcgZnVuY3Rpb24gYGBQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkKClgYCByZXR1cm5zCisgIG5vbi16ZXJvIGlmIFB5RXZhbF9Jbml0VGhyZWFkcygpIGhhcyBiZWVuIGNhbGxlZC4KKworLSBUaGUgdW5kb2N1bWVudGVkIGFuZCB1bnVzZWQgZXh0ZXJuIGludCBgYF9QeVRocmVhZF9TdGFydGVkYGAgd2FzIHJlbW92ZWQuCisKKy0gVGhlIEMgQVBJIGNhbGxzIGBgUHlJbnRlcnByZXRlclN0YXRlX05ldygpYGAgYW5kIGBgUHlUaHJlYWRTdGF0ZV9OZXcoKWBgCisgIGFyZSB0d28gb2YgdGhlIHZlcnkgZmV3IGFkdmVydGlzZWQgYXMgYmVpbmcgc2FmZSB0byBjYWxsIHdpdGhvdXQgaG9sZGluZworICB0aGUgR0lMLiAgSG93ZXZlciwgdGhpcyB3YXNuJ3QgdHJ1ZSBpbiBhIGRlYnVnIGJ1aWxkLCBhcyBidWcgMTA0MTY0NQorICBkZW1vbnN0cmF0ZWQuICBJbiBhIGRlYnVnIGJ1aWxkLCBQeXRob24gcmVkaXJlY3RzIHRoZSBgYFB5TWVtYGAgZmFtaWx5CisgIG9mIGNhbGxzIHRvIFB5dGhvbidzIHNtYWxsLW9iamVjdCBhbGxvY2F0b3IsIHRvIGdldCB0aGUgYmVuZWZpdCBvZgorICBpdHMgZXh0cmEgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4gIEJ1dCBQeXRob24ncyBzbWFsbC1vYmplY3QgYWxsb2NhdG9yCisgIGlzbid0IHRocmVhZHNhZmUsIHJlbHlpbmcgb24gdGhlIEdJTCB0byBhdm9pZCB0aGUgZXhwZW5zZSBvZiBkb2luZyBpdHMKKyAgb3duIGxvY2tpbmcuICBgYFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcoKWBgIGFuZCBgYFB5VGhyZWFkU3RhdGVfTmV3KClgYAorICBjYWxsIHRoZSBwbGF0Zm9ybSBgYG1hbGxvYygpYGAgZGlyZWN0bHkgbm93LCByZWdhcmRsZXNzIG9mIGJ1aWxkIHR5cGUuCisKKy0gUHlMb25nX0FzVW5zaWduZWRMb25nW01hc2tdIG5vdyBzdXBwb3J0IGludCBvYmplY3RzIGFzIHdlbGwuCisKKy0gU0YgcGF0Y2ggIzk5ODk5MzogYGBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsYGAgYW5kCisgIGBgUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWxgYCBoYXZlIGJlZW4gYWRkZWQsIHdoaWNoIGltcGxlbWVudCBzdGF0ZWZ1bAorICBkZWNvZGluZy4KKworVGVzdHMKKy0tLS0tCisKKy0gdGVzdF9fbG9jYWxlIHBvcnRlZCB0byB1bml0dGVzdAorCitNYWMKKy0tLQorCistIGBgcGxpc3RsaWJgYCBub3cgc3VwcG9ydHMgbm9uLWRpY3Qgcm9vdCBvYmplY3RzLiAgVGhlcmUgaXMgYWxzbyBhIG5ldworICBpbnRlcmZhY2UgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgcGxpc3QgZmlsZXM6IGBgcmVhZFBsaXN0KHBhdGhPckZpbGUpYGAKKyAgYW5kIGBgd3JpdGVQbGlzdChyb290T2JqZWN0LCBwYXRoT3JGaWxlKWBgCisKK1Rvb2xzL0RlbW9zCistLS0tLS0tLS0tLQorCistIFRoZSB0ZXh0IGZpbGUgY29tcGFyaXNvbiBzY3JpcHRzIGBgbmRpZmYucHlgYCBhbmQgYGBkaWZmLnB5YGAgbm93CisgIHJlYWQgdGhlIGlucHV0IGZpbGVzIGluIHVuaXZlcnNhbC1uZXdsaW5lIG1vZGUuICBUaGlzIHNwYXJlcyB0aGVtCisgIGZyb20gY29uc3VtaW5nIGEgZ3JlYXQgZGVhbCBvZiB0aW1lIHRvIGRlZHVjZSB0aGUgdXNlbGVzcyByZXN1bHQgdGhhdCwKKyAgZS5nLiwgYSBmaWxlIHdpdGggV2luZG93cyBsaW5lIGVuZHMgYW5kIGEgZmlsZSB3aXRoIExpbnV4IGxpbmUgZW5kcworICBoYXZlIG5vIGxpbmVzIGluIGNvbW1vbi4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjQgYWxwaGEgMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwMi1TRVAtMjAwNCoKKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gU0YgcGF0Y2ggIzEwMDcxODk6IGBgZnJvbSAuLi4gaW1wb3J0IC4uLmBgIHN0YXRlbWVudHMgbm93IGFsbG93IHRoZSBuYW1lCisgIGxpc3QgdG8gYmUgc3Vycm91bmRlZCBieSBwYXJlbnRoZXNlcy4KKworLSBTb21lIHNwZWVkdXBzIGZvciBsb25nIGFyaXRobWV0aWMsIHRoYW5rcyB0byBUcmV2b3IgUGVycmluLiAgR3JhZGVzY2hvb2wKKyAgbXVsdGlwbGljYXRpb24gd2FzIHNwZWQgYSBsaXR0bGUgYnkgb3B0aW1pemluZyB0aGUgQyBjb2RlLiAgR3JhZGVzY2hvb2wKKyAgc3F1YXJpbmcgd2FzIHNwZWQgYnkgYWJvdXQgYSBmYWN0b3Igb2YgMiwgYnkgZXhwbG9pdGluZyB0aGF0IGFib3V0IGhhbGYKKyAgdGhlIGRpZ2l0IHByb2R1Y3RzIGFyZSBkdXBsaWNhdGVzIGluIGEgc3F1YXJlLiAgQmVjYXVzZSBleHBvbmVudGlhdGlvbgorICB1c2VzIHNxdWFyaW5nIG9mdGVuLCB0aGlzIGFsc28gc3BlZWRzIGxvbmcgcG93ZXIuICBGb3IgZXhhbXBsZSwgdGhlIHRpbWUKKyAgdG8gY29tcHV0ZSAxNyoqMTAwMDAwMCBkcm9wcGVkIGZyb20gYWJvdXQgMTQgc2Vjb25kcyB0byA5IG9uIG15IGJveCBkdWUKKyAgdG8gdGhpcyBtdWNoLiAgVGhlIGN1dG9mZiBmb3IgS2FyYXRzdWJhIG11bHRpcGxpY2F0aW9uIHdhcyByYWlzZWQsCisgIHNpbmNlIGdyYWRlc2Nob29sIG11bHRpcGxpY2F0aW9uIGdvdCBxdWlja2VyLCBhbmQgdGhlIGN1dG9mZiB3YXMKKyAgYWdncmVzc2l2ZWx5IHNtYWxsIHJlZ2FyZGxlc3MuICBUaGUgZXhwb25lbnRpYXRpb24gYWxnb3JpdGhtIHdhcyBzd2l0Y2hlZAorICBmcm9tIHJpZ2h0LXRvLWxlZnQgdG8gbGVmdC10by1yaWdodCwgd2hpY2ggaXMgbW9yZSBlZmZpY2llbnQgZm9yIHNtYWxsCisgIGJhc2VzLiAgSW4gYWRkaXRpb24sIGlmIHRoZSBleHBvbmVudCBpcyBsYXJnZSwgdGhlIGFsZ29yaXRobSBub3cgZG9lcworICA1IGJpdHMgKGluc3RlYWQgb2YgMSBiaXQpIGF0IGEgdGltZS4gIFRoYXQgY3V0IHRoZSB0aW1lIHRvIGNvbXB1dGUKKyAgMTcqKjEwMDAwMDAgb24gbXkgYm94IGluIGhhbGYgYWdhaW4sIGRvd24gdG8gYWJvdXQgNC41IHNlY29uZHMuCisKKy0gT3ZlcmZsb3dXYXJuaW5nIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQuICBQRVAgMjM3IHNjaGVkdWxlZCB0aGlzIHRvCisgIG9jY3VyIGluIFB5dGhvbiAyLjMsIGJ1dCBzaW5jZSBPdmVyZmxvd1dhcm5pbmcgd2FzIGRpc2FibGVkIGJ5IGRlZmF1bHQsCisgIG5vYm9keSByZWFsaXplZCBpdCB3YXMgc3RpbGwgYmVpbmcgZ2VuZXJhdGVkLiAgT24gdGhlIGNoYW5jZSB0aGF0IHVzZXIKKyAgY29kZSBpcyBzdGlsbCB1c2luZyB0aGVtLCB0aGUgUHl0aG9uIGJ1aWx0aW4gT3ZlcmZsb3dXYXJuaW5nLCBhbmQKKyAgY29ycmVzcG9uZGluZyBDIEFQSSBQeUV4Y19PdmVyZmxvd1dhcm5pbmcsIHdpbGwgZXhpc3QgdW50aWwgUHl0aG9uIDIuNS4KKworLSBQeV9Jbml0aWFsaXplRXggaGFzIGJlZW4gYWRkZWQuCisKKy0gRml4IHRoZSBvcmRlciBvZiBhcHBsaWNhdGlvbiBvZiBkZWNvcmF0b3JzLiAgVGhlIHByb3BlciBvcmRlciBpcyBib3R0b20tdXA7CisgIHRoZSBmaXJzdCBkZWNvcmF0b3IgbGlzdGVkIGlzIHRoZSBsYXN0IG9uZSBjYWxsZWQuCisKKy0gU0YgcGF0Y2ggIzEwMDU3NzguICBGaXggYSBzZWcgZmF1bHQgaWYgdGhlIGxpc3Qgc2l6ZSBjaGFuZ2VkIHdoaWxlCisgIGNhbGxpbmcgbGlzdC5pbmRleCgpLiAgVGhpcyBjb3VsZCBoYXBwZW4gaWYgYSByaWNoIGNvbXBhcmlzb24gZnVuY3Rpb24KKyAgbW9kaWZpZWQgdGhlIGxpc3QuCisKKy0gVGhlIGBgZnVuY19uYW1lYGAgKGEuay5hLiBgYF9fbmFtZV9fYGApIGF0dHJpYnV0ZSBvZiB1c2VyLWRlZmluZWQKKyAgZnVuY3Rpb25zIGlzIG5vdyB3cml0YWJsZS4KKworLSBjb2RlX25ldyAoYS5rLmEgbmV3LmNvZGUoKSkgbm93IGNoZWNrcyBpdHMgYXJndW1lbnRzIHN1ZmZpY2llbnRseQorICBjYXJlZnVsbHkgdGhhdCBwYXNzaW5nIHRoZW0gb24gdG8gUHlDb2RlX05ldygpIHdvbid0IHRyaWdnZXIgY2FsbHMKKyAgdG8gUHlfRmF0YWxFcnJvcigpIG9yIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpLiAgSXQgaXMgc3RpbGwgdGhlIGNhc2UKKyAgdGhhdCB0aGUgcmV0dXJuZWQgY29kZSBvYmplY3QgbWlnaHQgYmUgZW50aXJlbHkgaW5zYW5lLgorCistIFN1YmNsYXNzZXMgb2Ygc3RyaW5nIGNhbiBubyBsb25nZXIgYmUgaW50ZXJuZWQuICBUaGUgc2VtYW50aWNzIG9mCisgIGludGVybmluZyB3ZXJlIG5vdCBjbGVhciBoZXJlIC0tIGEgc3ViY2xhc3MgY291bGQgYmUgbXV0YWJsZSwgZm9yCisgIGV4YW1wbGUgLS0gYW5kIGhhZCBidWdzLiAgRXhwbGljaXRseSBpbnRlcm5pbmcgYSBzdWJjbGFzcyBvZiBzdHJpbmcKKyAgdmlhIGludGVybigpIHdpbGwgcmFpc2UgYSBUeXBlRXJyb3IuICBJbnRlcm5hbCBvcGVyYXRpb25zIHRoYXQgYXR0ZW1wdAorICB0byBpbnRlcm4gYSBzdHJpbmcgc3ViY2xhc3Mgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKworLSBCdWcgMTAwMzkzNTogIHhyYW5nZSgpIGNvdWxkIHJlcG9ydCBib2d1cyBPdmVyZmxvd0Vycm9ycy4gIERvY3VtZW50ZWQKKyAgd2hhdCB4cmFuZ2UoKSBpbnRlbmRzLCBhbmQgcmVwYWlyZWQgdGVzdHMgYWNjb3JkaW5nbHkuCisKK0V4dGVuc2lvbiBtb2R1bGVzCistLS0tLS0tLS0tLS0tLS0tLQorCistIGRpZmZsaWIgbm93IHN1cHBvcnRzIEhUTUwgc2lkZS1ieS1zaWRlIGRpZmYuCisKKy0gb3MudXJhbmRvbSBoYXMgYmVlbiBhZGRlZCBmb3Igc3lzdGVtcyB0aGF0IHN1cHBvcnQgc291cmNlcyBvZiByYW5kb20KKyAgZGF0YS4KKworLSBQYXRjaCAxMDEyNzQwOiAgdHJ1bmNhdGUoKSBvbiBhIHdyaXRlYWJsZSBjU3RyaW5nSU8gbm93IHJlc2V0cyB0aGUKKyAgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG9yaWdpbmFsCisgIFN0cmluZ0lPIG1vZHVsZSBhbmQgYXZvaWRzIGluYWR2ZXJ0ZW50bHkgcmVzdXJyZWN0aW5nIGRhdGEgdGhhdCB3YXMKKyAgc3VwcG9zZWQgdG8gaGF2ZSBiZWVuIHRydW5jYXRlZCBhd2F5LgorCistIEFkZGVkIHNvY2tldC5zb2NrZXRwYWlyKCkuCisKKy0gQWRkZWQgQ3VycmVudEJ5dGVJbmRleCwgQ3VycmVudENvbHVtbk51bWJlciwgQ3VycmVudExpbmVOdW1iZXIKKyAgbWVtYmVycyB0byB4bWwucGFyc2Vycy5leHBhdC5YTUxQYXJzZXIgb2JqZWN0LgorCistIFRoZSBtcHosIHJvdG9yLCBhbmQgeHJlYWRsaW5lcyBtb2R1bGVzLCBhbGwgZGVwcmVjYXRlZCBpbiBlYXJsaWVyCisgIHZlcnNpb25zIG9mIFB5dGhvbiwgaGF2ZSBub3cgYmVlbiByZW1vdmVkLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gUGF0Y2ggIzkzNDM1NjogaWYgYSBtb2R1bGUgZGVmaW5lcyBfX2FsbF9fLCBiZWxpZXZlIHRoYXQgcmF0aGVyIHRoYW4gdXNpbmcKKyAgaGV1cmlzdGljcyBmb3IgZmlsdGVyaW5nIG91dCBpbXBvcnRlZCBuYW1lcy4KKworLSBQYXRjaCAjOTQxNDg2OiBhZGRlZCBvcy5wYXRoLmxleGlzdHMoKSwgd2hpY2ggcmV0dXJucyBUcnVlIGZvciBicm9rZW4KKyAgc3ltbGlua3MsIHVubGlrZSBvcy5wYXRoLmV4aXN0cygpLgorCistIHRoZSByYW5kb20gbW9kdWxlIG5vdyB1c2VzIG9zLnVyYW5kb20oKSBmb3Igc2VlZGluZyBpZiBpdCBpcyBhdmFpbGFibGUuCisgIEFkZGVkIGEgbmV3IGdlbmVyYXRvciBiYXNlZCBvbiBvcy51cmFuZG9tKCkuCisKKy0gZGlmZmxpYiBhbmQgZGlmZi5weSBjYW4gbm93IGdlbmVyYXRlIEhUTUwuCisKKy0gYmRpc3RfcnBtIG5vdyBpbmNsdWRlcyB2ZXJzaW9uIGFuZCByZWxlYXNlIGluIHRoZSBCdWlsZFJvb3QsIGFuZAorICByZXBsYWNlcyAtIGJ5IGBgX2BgIGluIHZlcnNpb24gYW5kIHJlbGVhc2UuCisKKy0gZGlzdHV0aWxzIGJ1aWxkL2J1aWxkX3NjcmlwdHMgbm93IGhhcyBhbiAtZSBvcHRpb24gdG8gc3BlY2lmeSB0aGUKKyAgcGF0aCB0byB0aGUgUHl0aG9uIGludGVycHJldGVyIGZvciBpbnN0YWxsZWQgc2NyaXB0cy4KKworLSBQRVAgMjkyIGNsYXNzZXMgVGVtcGxhdGUgYW5kIFNhZmVUZW1wbGF0ZSBhcmUgYWRkZWQgdG8gdGhlIHN0cmluZyBtb2R1bGUuCisKKy0gdGFyZmlsZSBub3cgZ2VuZXJhdGVzIEdOVSB0YXIgZmlsZXMgYnkgZGVmYXVsdC4KKworLSBIVFRQUmVzcG9uc2UgaGFzIG5vdyBhIGdldGhlYWRlcnMgbWV0aG9kLgorCistIFBhdGNoICMxMDA2MjE5OiBsZXQgaW5zcGVjdC5nZXRzb3VyY2UgaGFuZGxlICdAJyBkZWNvcmF0b3JzLiBUaGFua3MgU2ltb24KKyAgUGVyY2l2YWxsLgorCistIGxvZ2dpbmcuaGFuZGxlcnMuU01UUEhhbmRsZXIuZGF0ZV90aW1lIGhhcyBiZWVuIHJlbW92ZWQ7CisgIHRoZSBjbGFzcyBub3cgdXNlcyBlbWFpbC5VdGlscy5mb3JtYXRkYXRlIHRvIGdlbmVyYXRlIHRoZSB0aW1lIHN0YW1wLgorCistIEEgbmV3IGZ1bmN0aW9uIHRrRm9udC5uYW1ldG9mb250IHdhcyBhZGRlZCB0byByZXR1cm4gYW4gZXhpc3RpbmcKKyAgZm9udC4gVGhlIEZvbnQgY2xhc3MgY29uc3RydWN0b3Igbm93IGhhcyBhbiBhZGRpdGlvbmFsIGV4aXN0cyBhcmd1bWVudAorICB3aGljaCwgaWYgVHJ1ZSwgcmVxdWVzdHMgdG8gcmV0dXJuL2NvbmZpZ3VyZSBhbiBleGlzdGluZyBmb250LCByYXRoZXIKKyAgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCisKKy0gVXBkYXRlZCB0aGUgZGVjaW1hbCBwYWNrYWdlJ3MgbWluKCkgYW5kIG1heCgpIG1ldGhvZHMgdG8gbWF0Y2ggdGhlCisgIGxhdGVzdCByZXZpc2lvbiBvZiB0aGUgR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgU3BlY2lmaWNhdGlvbi4KKyAgUXVpZXQgTmFOcyBhcmUgaWdub3JlZCBhbmQgZXF1YWwgdmFsdWVzIGFyZSBzb3J0ZWQgYmFzZWQgb24gc2lnbgorICBhbmQgZXhwb25lbnQuCisKKy0gVGhlIGRlY2ltYWwgcGFja2FnZSdzIENvbnRleHQuY29weSgpIG1ldGhvZCBub3cgcmV0dXJucyBkZWVwIGNvcGllcy4KKworLSBEZXByZWNhdGVkIHN5cy5leGl0ZnVuYyBpbiBmYXZvciBvZiB0aGUgYXRleGl0IG1vZHVsZS4gIFRoZSBzeXMuZXhpdGZ1bmMKKyAgYXR0cmlidXRlIHdpbGwgYmUga2VwdCBhcm91bmQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBhdGV4aXQKKyAgd2lsbCBqdXN0IGJlY29tZSB0aGUgb25lIHByZWZlcnJlZCB3YXkgdG8gZG8gaXQuCisKKy0gcGF0Y2ggIzY3NTU1MTogQWRkIGdldF9oaXN0b3J5X2l0ZW0gYW5kIHJlcGxhY2VfaGlzdG9yeV9pdGVtIGZ1bmN0aW9ucworICB0byB0aGUgcmVhZGxpbmUgbW9kdWxlLgorCistIGJ1ZyAjOTg5NjcyOiBwZGIuZG9jIGFuZCB0aGUgaGVscCBtZXNzYWdlcyBmb3IgdGhlIGhlbHBfZCBhbmQgaGVscF91IG1ldGhvZHMKKyAgb2YgdGhlIHBkYi5QZGIgY2xhc3MgZ2l2ZXMgaGF2ZSBiZWVuIGNvcnJlY3RlZC4gZChvd24pIGdvZXMgdG8gYSBuZXdlcgorICBmcmFtZSwgdShwKSB0byBhbiBvbGRlciBmcmFtZSwgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLgorCistIGJ1ZyAjOTkwNjY5OiBvcy5wYXRoLnJlYWxwYXRoKCkgd2lsbCByZXNvbHZlIHN5bWxpbmtzIGJlZm9yZSBub3JtYWxpemluZyB0aGUKKyAgcGF0aCwgYXMgbm9ybWFsaXppbmcgdGhlIHBhdGggbWF5IGFsdGVyIHRoZSBtZWFuaW5nIG9mIHRoZSBwYXRoIGlmIGl0CisgIGNvbnRhaW5zIHN5bWxpbmtzLgorCistIGJ1ZyAjODUxMTIzOiBzaHV0aWwuY29weWZpbGUgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gY29weSBhCisgIGZpbGUgb250byBhIGxpbmsgdG8gaXRzZWxmLiBUaGFua3MgR3JlZ29yeSBCYWxsLgorCistIGJ1ZyAjNTcwMzAwOiBGaXggaW5zcGVjdCB0byByZXNvbHZlIGZpbGUgbG9jYXRpb25zIHVzaW5nIG9zLnBhdGgucmVhbHBhdGgoKQorICBzbyBhcyB0byBwcm9wZXJseSBsaXN0IGFsbCBmdW5jdGlvbnMgaW4gYSBtb2R1bGUgd2hlbiB0aGUgbW9kdWxlIGl0c2VsZiBpcworICByZWFjaGVkIHRocm91Z2ggYSBzeW1saW5rLiAgVGhhbmtzIEpvaGFubmVzIEdpanNiZXJzLgorCistIGRvY3Rlc3QgcmVmYWN0b3JpbmcgY29udGludWVkLiAgU2VlIHRoZSBkb2NzIGZvciBkZXRhaWxzLiAgQXMgcGFydCBvZgorICB0aGlzIGVmZm9ydCwgc29tZSBvbGQgYW5kIGxpdHRsZS0gKG5ldmVyPykgdXNlZCBmZWF0dXJlcyBhcmUgbm93CisgIGRlcHJlY2F0ZWQ6ICB0aGUgVGVzdGVyIGNsYXNzLCB0aGUgbW9kdWxlIGlzX3ByaXZhdGUoKSBmdW5jdGlvbiwgYW5kIHRoZQorICBpc3ByaXZhdGUgYXJndW1lbnQgdG8gdGVzdG1vZCgpLiAgVGhlIFRlc3RlciBjbGFzcyBzdXBwbGllZCBhIGZlZWJsZQorICAiYnkgaGFuZCIgd2F5IHRvIGNvbWJpbmUgbXVsdGlwbGUgZG9jdGVzdHMsIGlmIHlvdSBrbmV3IGV4YWN0bHkgd2hhdAorICB5b3Ugd2VyZSBkb2luZy4gIFRoZSBuZXdlciBkb2N0ZXN0IGZlYXR1cmVzIGZvciB1bml0dGVzdCBpbnRlZ3JhdGlvbgorICBhbHJlYWR5IGRpZCBhIGJldHRlciBqb2Igb2YgdGhhdCwgYXJlIHN0cm9uZ2VyIG5vdyB0aGFuIGV2ZXIsIGFuZCB0aGUKKyAgbmV3IERvY1Rlc3RSdW5uZXIgY2xhc3MgaXMgYSBzYW5lciBmb3VuZGF0aW9uIGlmIHlvdSB3YW50IHRvIGRvIGl0IGJ5CisgIGhhbmQuICBUaGUgInByaXZhdGUgbmFtZSIgZmlsdGVyaW5nIGdpbW1pY2sgd2FzIGEgbWlzdGFrZSBmcm9tIHRoZQorICBzdGFydCwgYW5kIHRlc3Rtb2QoKSBjaGFuZ2VkIGxvbmcgYWdvIHRvIGlnbm9yZSBpdCBieSBkZWZhdWx0LiAgSWYKKyAgeW91IHdhbnQgdG8gZmlsdGVyIG91dCB0ZXN0cywgdGhlIG5ldyBEb2NUZXN0RmluZGVyIGNsYXNzIGNhbiBiZSB1c2VkCisgIHRvIHJldHVybiBhIGxpc3Qgb2YgYWxsIGRvY3Rlc3RzLCBhbmQgeW91IGNhbiBmaWx0ZXIgdGhhdCBsaXN0IGJ5CisgIGFueSBjb21wdXRhYmxlIGNyaXRlcmlhIGJlZm9yZSBwYXNzaW5nIGl0IHRvIGEgRG9jVGVzdFJ1bm5lciBpbnN0YW5jZS4KKworLSBCdWcgIzg5MTYzNywgcGF0Y2ggIzEwMDU0NjY6IGZpeCBpbnNwZWN0LmdldGFyZ3MoKSBjcmFzaCBvbiBkZWYgZm9vKChiYXIpKS4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gSURMRSdzIHNob3J0Y3V0IGtleXMgZm9yIHdpbmRvd3MgYXJlIG5vdyBjYXNlIGluc2Vuc2l0aXZlIHNvIHRoYXQKKyAgQ29udHJvbC1WIHdvcmtzIHRoZSBzYW1lIGFzIENvbnRyb2wtdi4KKworLSBweWdldHRleHQucHk6IEdlbmVyYXRlIFBPVC1DcmVhdGlvbi1EYXRlIGhlYWRlciBpbiBJU08gZm9ybWF0LgorCitCdWlsZAorLS0tLS0KKworLSBCYWNrd2FyZCBpbmNvbXBhdGliaWxpdHk6ICBsb25naW50cmVwci5oIG5vdyB0cmlnZ2VycyBhIGNvbXBpbGUtdGltZQorICBlcnJvciBpZiBTSElGVCAodGhlIG51bWJlciBvZiBiaXRzIGluIGEgUHl0aG9uIGxvbmcgImRpZ2l0IikgaXNuJ3QKKyAgZGl2aXNpYmxlIGJ5IDUuICBUaGlzIG5ldyByZXF1aXJlbWVudCBhbGxvd3Mgc2ltcGxlIGNvZGUgZm9yIHRoZSBuZXcKKyAgNS1iaXRzLWF0LWEtdGltZSBsb25nX3BvdygpIGltcGxlbWVudGF0aW9uLiAgSWYgbmVjZXNzYXJ5LCB0aGUKKyAgcmVzdHJpY3Rpb24gY291bGQgYmUgcmVtb3ZlZCAoYnkgY29tcGxpY2F0aW5nIGxvbmdfcG93KCksIG9yIGJ5CisgIGZhbGxpbmcgYmFjayB0byB0aGUgMS1iaXQtYXQtYS10aW1lIGFsZ29yaXRobSksIGJ1dCB0aGVyZSBhcmUgbm8KKyAgcGxhbnMgdG8gZG8gc28uCisKKy0gYnVnICM5OTE5NjI6IFdoZW4gYnVpbGRpbmcgd2l0aCAtLWRpc2FibGUtdG9vbGJveC1nbHVlIG9uIERhcndpbiBubworICBhdHRlbXB0IHRvIGJ1aWxkIE1hYy1zcGVjaWZpYyBtb2R1bGVzIG9jY3Vycy4KKworLSBUaGUgLS13aXRoLXRzYyBmbGFnIHRvIGNvbmZpZ3VyZSB0byBlbmFibGUgVk0gcHJvZmlsaW5nIHdpdGggdGhlCisgIHByb2Nlc3NvcidzIHRpbWVzdGFtcCBjb3VudGVyIG5vdyB3b3JrcyBvbiBQUEMgcGxhdGZvcm1zLgorCistIHBhdGNoICMxMDA2NjI5OiBEZWZpbmUgX1hPUEVOX1NPVVJDRSB0byA1MDAgb24gU29sYXJpcyA4LzkgdG8gbWF0Y2gKKyAgR0NDJ3MgZGVmaW5pdGlvbiBhbmQgYXZvaWQgcmVkZWZpbml0aW9uIHdhcm5pbmdzLgorCistIERldGVjdCBwdGhyZWFkcyBzdXBwb3J0IChwcm92aWRlZCBieSBnbnUgcHRoIHB0aHJlYWQgZW11bGF0aW9uKSBvbgorICBHTlUvaypCU0Qgc3lzdGVtcy4KKworLSBidWcgIzEwMDU3MzcsICMxMDA3MjQ5OiBGaXhlZCBzZXZlcmFsIGJ1aWxkIHByb2JsZW1zIGFuZCB3YXJuaW5ncworICBmb3VuZCBvbiBvbGQvbGVnYWN5IEMgY29tcGlsZXJzIG9mIEhQLVVYLCBJUklYIGFuZCBUcnU2NC4KKworQyBBUEkKKy0tLS0tCisKKy4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KKworLSBwYXRjaCAjMTAwNTkzNiwgYnVnICMxMDA5MzczOiBmaXggaW5kZXggZW50cmllcyB3aGljaCBjb250YWluCisgIGFuIHVuZGVyc2NvcmUgd2hlbiB2aWV3ZWQgd2l0aCBBY3JvYmF0LgorCistIGJ1ZyAjOTkwNjY5OiBvcy5wYXRoLm5vcm1wYXRoIG1heSBhbHRlciB0aGUgbWVhbmluZyBvZiBhIHBhdGggaWYKKyAgaXQgY29udGFpbnMgc3ltYm9saWMgbGlua3MuIFRoaXMgaGFzIGJlZW4gZG9jdW1lbnRlZCBpbiBhIGNvbW1lbnQKKyAgc2luY2UgMTk5MiwgYnV0IGlzIG5vdyBpbiB0aGUgbGlicmFyeSByZWZlcmVuY2UgYXMgd2VsbC4KKworTmV3IHBsYXRmb3JtcworLS0tLS0tLS0tLS0tLQorCistIEZyZWVCU0QgNiBpcyBub3cgc3VwcG9ydGVkLgorCitUZXN0cworLS0tLS0KKworLi4KKworV2luZG93cworLS0tLS0tLQorCistIEJvb3N0ZWQgdGhlIHN0YWNrIHJlc2VydmF0aW9uIGZvciBweXRob24uZXhlIGFuZCBweXRob253LmV4ZSBmcm9tCisgIHRoZSBkZWZhdWx0IDFNQiB0byAyTUIuICBTdGFjayBmcmFtZXMgdW5kZXIgVkMgNy4xIGZvciAyLjQgYXJlIGVub3VnaAorICBiaWdnZXIgdGhhbiB1bmRlciBWQyA2LjAgZm9yIDIuMy40IHRoYXQgZGVlcGx5IHJlY3Vyc2l2ZSBwcm9nYW1zCisgIHdpdGhpbiB0aGUgZGVmYXVsdCBzeXMuZ2V0cmVjdXJzaW9ubGltaXQoKSBkZWZhdWx0IHZhbHVlIG9mIDEwMDAgd2VyZQorICBhYmxlIHRvIHN1ZmZlciB1bmRldGVjdGVkIEMgc3RhY2sgb3ZlcmZsb3dzLiAgVGhlIHN0YW5kYXJkIHRlc3QgcHJvZ3JhbQorICB0ZXN0X2NvbXBpbGVyIHdhcyBvbmUgc3VjaCBwcm9ncmFtLiAgSWYgYSBQeXRob24gcHJvY2VzcyBvbiBXaW5kb3dzCisgICJqdXN0IHZhbmlzaGVzIiB3aXRob3V0IGEgdHJhY2UsIGFuZCB3aXRob3V0IGFuIGVycm9yIG1lc3NhZ2Ugb2YgYW55CisgIGtpbmQsIGJ1dCB3aXRoIGFuIGV4aXQgY29kZSBvZiAxMjgsIHVuZGV0ZWN0ZWQgc3RhY2sgb3ZlcmZsb3cgbWF5IGJlCisgIHRoZSBwcm9ibGVtLgorCitNYWMKKy0tLQorCisuLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuNCBhbHBoYSAyPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDA1LUFVRy0yMDA0KgorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBQYXRjaCAjOTgwNjk1OiAgSW1wbGVtZW50cyBlZmZpY2llbnQgc3RyaW5nIGNvbmNhdGVuYXRpb24gZm9yIHN0YXRlbWVudHMKKyAgb2YgdGhlIGZvcm0gcz1zK3QgYW5kIHMrPXQuICBUaGlzIHdpbGwgdmFyeSBhY3Jvc3MgaW1wbGVtZW50YXRpb25zLgorICBBY2NvcmRpbmdseSwgdGhlIHN0ci5qb2luKCkgbWV0aG9kIGlzIHN0cm9uZ2x5IHByZWZlcnJlZCBmb3IgcGVyZm9ybWFuY2UKKyAgc2Vuc2l0aXZlIGNvZGUuCisKKy0gUEVQLTAzMTgsIEZ1bmN0aW9uIERlY29yYXRvcnMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBsYW5ndWFnZS4gVGhlc2UgYXJlCisgIGltcGxlbWVudGVkIHVzaW5nIHRoZSBKYXZhLXN0eWxlIEBkZWNvcmF0b3Igc3ludGF4LCBsaWtlIHNvOjoKKworICAgICBAc3RhdGljbWV0aG9kCisgICAgIGRlZiBmb28oYmFyKToKKworICAoVGhlIFBFUCBuZWVkcyB0byBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdGUpCisKKy0gV2hlbiBpbXBvcnRpbmcgYSBtb2R1bGUgTSByYWlzZXMgYW4gZXhjZXB0aW9uLCBQeXRob24gbm8gbG9uZ2VyIGxlYXZlcyBNCisgIGluIHN5cy5tb2R1bGVzLiAgQmVmb3JlIDIuNGEyIGl0IGRpZCwgYW5kIGEgc3Vic2VxdWVudCBpbXBvcnQgb2YgTSB3b3VsZAorICBzdWNjZWVkLCBwaWNraW5nIHVwIGEgbW9kdWxlIG9iamVjdCBmcm9tIHN5cy5tb2R1bGVzIHJlZmxlY3RpbmcgYXMgbXVjaAorICBvZiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgTSBhcyBjb21wbGV0ZWQgYmVmb3JlIHRoZSBleGNlcHRpb24gd2FzIHJhaXNlZC4KKyAgU3Vic2VxdWVudCBpbXBvcnRzIGdvdCBubyBpbmRpY2F0aW9uIHRoYXQgTSB3YXMgaW4gYSBwYXJ0aWFsbHktCisgIGluaXRpYWxpemVkIHN0YXRlLCBhbmQgdGhlIGltcG9ydGVycyBjb3VsZCBnZXQgaW50byBhcmJpdHJhcmlseSBiYWQKKyAgdHJvdWJsZSBhcyBhIHJlc3VsdCAodGhlIE0gdGhleSBnb3Qgd2FzIGluIGFuIHVuaW50ZW5kZWQgc3RhdGUsCisgIGFyYml0cmFyaWx5IGZhciByZW1vdmVkIGZyb20gTSdzIGF1dGhvcidzIGludGVudCkuICBOb3cgc3Vic2VxdWVudAorICBpbXBvcnRzIG9mIE0gd2lsbCBjb250aW51ZSByYWlzaW5nIGV4Y2VwdGlvbnMgKGJ1dCBpZiwgZm9yIGV4YW1wbGUsIHRoZQorICBzb3VyY2UgY29kZSBmb3IgTSBpcyBlZGl0ZWQgYmV0d2VlbiBpbXBvcnQgYXR0ZW1wdHMsIHRoZW4gcGVyaGFwcyBsYXRlcgorICBhdHRlbXB0cyB3aWxsIHN1Y2NlZWQsIG9yIHJhaXNlIGEgZGlmZmVyZW50IGV4Y2VwdGlvbikuCisKKyAgVGhpcyBjYW4gYnJlYWsgZXhpc3RpbmcgY29kZSwgYnV0IGluIHN1Y2ggY2FzZXMgdGhlIGNvZGUgd2FzIHByb2JhYmx5CisgIHdvcmtpbmcgYmVmb3JlIGJ5IGFjY2lkZW50LiAgSW4gdGhlIFB5dGhvbiBzb3VyY2UsIHRoZSBvbmx5IGNhc2Ugb2YKKyAgYnJlYWthZ2UgZGlzY292ZXJlZCB3YXMgaW4gYSB0ZXN0IGFjY2lkZW50YWxseSByZWx5aW5nIG9uIGEgZGFtYWdlZAorICBtb2R1bGUgcmVtYWluaW5nIGluIHN5cy5tb2R1bGVzLiAgQ2FzZXMgYXJlIGFsc28ga25vd24gd2hlcmUgdGVzdHMKKyAgZGVsaWJlcmF0ZWx5IHByb3Zva2luZyBpbXBvcnQgZXJyb3JzIHJlbW92ZSBkYW1hZ2VkIG1vZHVsZXMgZnJvbQorICBzeXMubW9kdWxlcyB0aGVtc2VsdmVzLCBhbmQgc3VjaCB0ZXN0cyB3aWxsIGJyZWFrIG5vdyBpZiB0aGV5IGRvIGFuCisgIHVuY29uZGl0aW9uYWwgZGVsIHN5cy5tb2R1bGVzW01dLgorCistIHUnJXMnICUgb2JqIHdpbGwgbm93IHRyeSBvYmouX191bmljb2RlX18oKSBmaXJzdCBhbmQgZmFsbGJhY2sgdG8KKyAgb2JqLl9fc3RyX18oKSBpZiBubyBfX3VuaWNvZGVfXyBtZXRob2QgY2FuIGJlIGZvdW5kLgorCistIFBhdGNoICM1NTA3MzI6IEFkZCBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcygpLiAgQW5hbG9nb3VzIHRvCisgIFB5QXJnX1ZhUGFyc2UoKS4gIEJvdGggYXJlIG5vdyBkb2N1bWVudGVkLiAgVGhhbmtzIEdyZWcgQ2hhcG1hbi4KKworLSBBbGxvdyBzdHJpbmcgYW5kIHVuaWNvZGUgcmV0dXJuIHR5cGVzIGZyb20gLmVuY29kZSgpLy5kZWNvZGUoKQorICBtZXRob2RzIG9uIHN0cmluZyBhbmQgdW5pY29kZSBvYmplY3RzLiAgQWRkZWQgdW5pY29kZS5kZWNvZGUoKQorICB3aGljaCB3YXMgbWlzc2luZyBmb3Igbm8gYXBwYXJlbnQgcmVhc29uLgorCistIEFuIGF0dGVtcHQgdG8gZml4IHRoZSBtZXNzIHRoYXQgaXMgUHl0aG9uJ3MgYmVoYXZpb3VyIHdpdGgKKyAgc2lnbmFsIGhhbmRsZXJzIGFuZCB0aHJlYWRzLCBjb21wbGljYXRlZCBieSByZWFkbGluZSdzIGJlaGF2aW91ci4KKyAgSXQncyBxdWl0ZSBwb3NzaWJsZSB0aGF0IHRoZXJlIGFyZSBzdGlsbCBidWdzIGhlcmUuCisKKy0gQWRkZWQgQyBtYWNyb3MgUHlfQ0xFQVIgYW5kIFB5X1ZJU0lUIHRvIGVhc2UgdGhlIGltcGxlbWVudGF0aW9uIG9mCisgIHR5cGVzIHRoYXQgc3VwcG9ydCBnYXJiYWdlIGNvbGxlY3Rpb24uCisKKy0gQ29tcGlsZXIgbm93IHRyZWF0cyBOb25lIGFzIGEgY29uc3RhbnQuCisKKy0gVGhlIHR5cGUgb2YgdmFsdWVzIHJldHVybmVkIGJ5IF9faW50X18sIF9fZmxvYXRfXywgX19sb25nX18sCisgIF9fb2N0X18sIGFuZCBfX2hleF9fIGFyZSBub3cgY2hlY2tlZC4gIFJldHVybmluZyBhbiBpbnZhbGlkIHR5cGUKKyAgd2lsbCBjYXVzZSBhIFR5cGVFcnJvciB0byBiZSByYWlzZWQuICBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mCisgIEp5dGhvbi4KKworLSBJbXBsZW1lbnRlZCBiaW5kX3RleHRkb21haW5fY29kZXNldCgpIGluIGxvY2FsZSBtb2R1bGUuCisKKy0gQWRkZWQgYSB3b3JrYXJvdW5kIGZvciBwcm9wZXIgc3RyaW5nIG9wZXJhdGlvbnMgaW4gQlNEcy4gIHN0ci5zcGxpdAorICBhbmQgc3RyLmlzKiBtZXRob2RzIGNhbiBub3cgd29yayBjb3JyZWN0bHkgd2l0aCBVVEYtOCBsb2NhbGVzLgorCistIEJ1ZyAjOTg5MTg1OiB1bmljb2RlLmlzd2lkZSgpIGFuZCB1bmljb2RlLndpZHRoKCkgaXMgZHJvcHBlZCBhbmQKKyAgdGhlIEVhc3QgQXNpYW4gV2lkdGggc3VwcG9ydCBpcyBtb3ZlZCB0byB1bmljb2RlZGF0YSBleHRlbnNpb24KKyAgbW9kdWxlLgorCistIFBhdGNoICM5NDEyMjk6IFRoZSBzb3VyY2UgY29kZSBlbmNvZGluZyBpbiBpbnRlcmFjdGl2ZSBtb2RlCisgIG5vdyByZWZlcnMgc3lzLnN0ZGluLmVuY29kaW5nIG5vdCBqdXN0IElTTy04ODU5LTEgYW55bW9yZS4gIFRoaXMKKyAgYWxsb3dzIGZvciBub24tbGF0aW4tMSB1c2VycyB0byB3cml0ZSB1bmljb2RlIHN0cmluZ3MgZGlyZWN0bHkuCisKK0V4dGVuc2lvbiBtb2R1bGVzCistLS0tLS0tLS0tLS0tLS0tLQorCistIGNwaWNrbGUgbm93IHN1cHBvcnRzIHRoZSBzYW1lIGtleXdvcmQgYXJndW1lbnRzIGFzIHBpY2tsZS4KKworTGlicmFyeQorLS0tLS0tLQorCistIEFkZGVkIG5ldyBjb2RlY3MgYW5kIGFsaWFzZXMgZm9yIElTT184ODU5LTExLCBJU09fODg1OS0xNiBhbmQKKyAgVElTLTYyMAorCistIFRoYW5rcyB0byBFZHdhcmQgTG9wZXIsIGRvY3Rlc3QgaGFzIGJlZW4gbWFzc2l2ZWx5IHJlZmFjdG9yZWQsIGFuZAorICBtYW55IG5ldyBmZWF0dXJlcyB3ZXJlIGFkZGVkLiAgRnVsbCBkb2NzIHdpbGwgYXBwZWFyIGxhdGVyLiAgRm9yIG5vdworICB0aGUgZG9jdGVzdCBtb2R1bGUgY29tbWVudHMgYW5kIG5ldyB0ZXN0IGNhc2VzIGdpdmUgZ29vZCBjb3ZlcmFnZS4KKyAgVGhlIHJlZmFjdG9yaW5nIHByb3ZpZGVzIG1hbnkgaG9vayBwb2ludHMgZm9yIGN1c3RvbWl6aW5nIGJlaGF2aW9yCisgIChzdWNoIGFzIGhvdyB0byByZXBvcnQgZXJyb3JzLCBhbmQgaG93IHRvIGNvbXBhcmUgZXhwZWN0ZWQgdG8gYWN0dWFsCisgIG91dHB1dCkuICBOZXcgZmVhdHVyZXMgaW5jbHVkZSBhIDxCTEFOS0xJTkU+IG1hcmtlciBmb3IgZXhwZWN0ZWQKKyAgb3V0cHV0IGNvbnRhaW5pbmcgYmxhbmsgbGluZXMsIG9wdGlvbnMgdG8gcHJvZHVjZSB1bmlmaWVkIG9yIGNvbnRleHQKKyAgZGlmZnMgd2hlbiBhY3R1YWwgb3V0cHV0IGRvZXNuJ3QgbWF0Y2ggZXhwZWN0YXRpb25zLCBhbiBvcHRpb24gdG8KKyAgbm9ybWFsaXplIHdoaXRlc3BhY2UgYmVmb3JlIGNvbXBhcmluZywgYW5kIGFuIG9wdGlvbiB0byB1c2UgYW4KKyAgZWxsaXBzaXMgdG8gc2lnbmlmeSAiZG9uJ3QgY2FyZSIgcmVnaW9ucyBvZiBvdXRwdXQuCisKKy0gVGtpbnRlciBub3cgc3VwcG9ydHMgdGhlIHdpc2ggLXN5bmMgYW5kIC11c2Ugb3B0aW9ucy4KKworLSBUaGUgZm9sbG93aW5nIG1ldGhvZHMgaW4gdGltZSBzdXBwb3J0IHBhc3Npbmcgb2YgTm9uZTogY3RpbWUoKSwgZ210aW1lKCksCisgIGFuZCBsb2NhbHRpbWUoKS4gIElmIE5vbmUgaXMgcHJvdmlkZWQsIHRoZSBjdXJyZW50IHRpbWUgaXMgdXNlZCAodGhlCisgIHNhbWUgYXMgd2hlbiB0aGUgYXJndW1lbnQgaXMgb21pdHRlZCkuCisgIFtTRiBidWcgNjU4MjU0LCBwYXRjaCA2NjM0ODJdCisKKy0gbm50cGxpYiBkb2VzIG5vdyBhbGxvdyB0byBpZ25vcmUgYSAubmV0cmMgZmlsZS4KKworLSB1cmxsaWIyIG5vdyByZWNvZ25pemVzIEJhc2ljIGF1dGhlbnRpY2F0aW9uIGV2ZW4gaWYgb3RoZXIgYXV0aGVudGljYXRpb24KKyAgc2NoZW1lcyBhcmUgb2ZmZXJlZC4KKworLSBCdWcgIzEwMDEwNTMuICB3YXZlLm9wZW4oKSBub3cgYWNjZXB0cyB1bmljb2RlIGZpbGVuYW1lcy4KKworLSBnemlwLkd6aXBGaWxlIGhhcyBhIG5ldyBmaWxlbm8oKSBtZXRob2QsIHRvIHJldHJpZXZlIHRoZSBoYW5kbGUgb2YgdGhlCisgIHVuZGVybHlpbmcgZmlsZSBvYmplY3QgKHByb3ZpZGVkIGl0IGhhcyBhIGZpbGVubygpIG1ldGhvZCkuICBUaGlzIGlzCisgIG5lZWRlZCBpZiB5b3Ugd2FudCB0byB1c2Ugb3MuZnN5bmMoKSBvbiBhIEd6aXBGaWxlLgorCistIGltYXBsaWIgaGFzIHR3byBuZXcgbWV0aG9kczogZGVsZXRlYWNsIGFuZCBteXJpZ2h0cy4KKworLSBubnRwbGliIGhhcyB0d28gbmV3IG1ldGhvZHM6IGRlc2NyaXB0aW9uIGFuZCBkZXNjcmlwdGlvbnMuIFRoZXkKKyAgdXNlIGEgbW9yZSBSRkMtY29tcGxpYW50IHdheSBvZiBnZXR0aW5nIGEgbmV3c2dyb3VwIGRlc2NyaXB0aW9uLgorCistIEJ1ZyAjOTkzMzk0LiAgRml4IGEgcG9zc2libGUgcmVkIGhlcnJpbmcgb2YgS2V5RXJyb3IgaW4gJ3RocmVhZGluZycgYmVpbmcKKyAgcmFpc2VkIGR1cmluZyBpbnRlcnByZXRlciBzaHV0ZG93biBmcm9tIGEgcmVnaXN0ZXJlZCBmdW5jdGlvbiB3aXRoIGF0ZXhpdAorICB3aGVuIGR1bW15X3RocmVhZGluZyBpcyBiZWluZyB1c2VkLgorCistIEJ1ZyAjODU3Mjk3L1BhdGNoICM5MTY4NzQuICBGaXggYW4gZXJyb3Igd2hlbiBleHRyYWN0aW5nIGEgaGFyZCBsaW5rCisgIGZyb20gYSB0YXJmaWxlLgorCistIFBhdGNoICM4NDY2NTkuICBGaXggYW4gZXJyb3IgaW4gdGFyZmlsZS5weSB3aGVuIHVzaW5nCisgIEdOVSBsb25nbmFtZS9sb25nbGluayBjcmVhdGlvbi4KKworLSBUaGUgb2Jzb2xldGUgRkNOVEwucHkgaGFzIGJlZW4gZGVsZXRlZC4gIFRoZSBidWlsdGluIGZjbnRsIG1vZHVsZQorICBoYXMgYmVlbiBhdmFpbGFibGUgKG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgZmNudGwpIHNpbmNlIFB5dGhvbgorICAxLjVhMywgYW5kIGFsbCBGQ05UTC5weSBkaWQgaXMgZXhwb3J0IGZjbnRsJ3MgbmFtZXMsIGFmdGVyIGdlbmVyYXRpbmcKKyAgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHRlbGxpbmcgeW91IHRvIHVzZSBmY250bCBkaXJlY3RseS4KKworLSBTZXZlcmFsIG5ldyB1bmljb2RlIGNvZGVjcyBhcmUgYWRkZWQ6IGJpZzVoa3NjcywgZXVjX2ppc18yMDA0LAorICBpc28yMDIyX2pwXzIwMDQsIHNoaWZ0X2ppc18yMDA0LgorCistIEJ1ZyAjNzg4NTIwLiAgUXVldWUue2dldCwgZ2V0X25vd2FpdCwgcHV0LCBwdXRfbm93YWl0fSBoYXZlIG5ldworICBpbXBsZW1lbnRhdGlvbnMsIGV4cGxvaXRpbmcgQ29uZGl0aW9ucyAod2hpY2ggZGlkbid0IGV4aXN0IGF0IHRoZSB0aW1lCisgIFF1ZXVlIHdhcyBpbnRyb2R1Y2VkKS4gIEEgbWlub3Igc2VtYW50aWMgY2hhbmdlIGlzIHRoYXQgdGhlIEZ1bGwgYW5kCisgIEVtcHR5IGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IG5vbi1ibG9ja2luZyBjYWxscyBub3cgb2NjdXIgb25seSBpZiB0aGUKKyAgcXVldWUgdHJ1bHkgd2FzIGZ1bGwgb3IgZW1wdHkgYXQgdGhlIGluc3RhbnQgdGhlIHF1ZXVlIHdhcyBjaGVja2VkIChvZgorICBjb3Vyc2UgdGhlIFF1ZXVlIG1heSBubyBsb25nZXIgYmUgZnVsbCBvciBlbXB0eSBieSB0aGUgdGltZSBhIGNhbGxpbmcKKyAgdGhyZWFkIHNlZXMgdGhvc2UgZXhjZXB0aW9ucywgdGhvdWdoKS4gIEJlZm9yZSwgdGhlIGV4Y2VwdGlvbnMgY291bGQKKyAgYWxzbyBiZSByYWlzZWQgaWYgaXQgd2FzICJtZXJlbHkgaW5jb252ZW5pZW50IiBmb3IgdGhlIGltcGxlbWVudGF0aW9uCisgIHRvIGRldGVybWluZSB0aGUgdHJ1ZSBzdGF0ZSBvZiB0aGUgUXVldWUgKGJlY2F1c2UgdGhlIFF1ZXVlIHdhcyBsb2NrZWQKKyAgYnkgc29tZSBvdGhlciBtZXRob2QgaW4gcHJvZ3Jlc3MpLgorCistIEJ1Z3MgIzk3OTc5NCBhbmQgIzk4MDExNzogZGlmZmxpYi5nZXRfZ3JvdXBlZF9vcGNvZGVzKCkgbm93IGhhbmRsZXMgdGhlCisgIGNhc2Ugb2YgY29tcGFyaW5nIHR3byBlbXB0eSBsaXN0cy4gIFRoaXMgYWZmZWN0ZWQgYm90aCBjb250ZXh0X2RpZmYoKSBhbmQKKyAgdW5pZmllZF9kaWZmKCksCisKKy0gQnVnICM5ODA5Mzg6IHNtdHBsaWIgbm93IHByaW50cyBkZWJ1ZyBvdXRwdXQgdG8gc3lzLnN0ZGVyci4KKworLSBCdWcgIzkzMDAyNDogcG9zaXhwYXRoLnJlYWxwYXRoKCkgbm93IGhhbmRsZXMgaW5maW5pdGUgbG9vcHMgaW4gc3ltbGlua3MgYnkKKyAgcmV0dXJuaW5nIHRoZSBsYXN0IHBvaW50IGluIHRoZSBwYXRoIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGFueSBsb29wLiAgVGhhbmtzCisgIEFNIEt1Y2hsaW5nLgorCistIEJ1ZyAjOTgwMzI3OiBudHBhdGggbm90IGhhbmRsZXMgY29tcHJlc3NpbmcgZXJyb25lb3VzIHNsYXNoZXMgYmV0d2VlbiB0aGUKKyAgZHJpdmUgbGV0dGVyIGFuZCB0aGUgcmVzdCBvZiB0aGUgcGF0aC4gIEFsc28gY2xlYXJseSBoYW5kbGVzIFVOQyBhZGRyZXNzZXMgbm93CisgIGFzIHdlbGwuICBUaGFua3MgUGF1bCBNb29yZS4KKworLSBidWcgIzY3OTk1MzogemlwZmlsZS5weSBzaG91bGQgbm93IHdvcmsgZm9yIGZpbGVzIG92ZXIgMiBHQi4gIFRoZSBwYWNrZWQgZGF0YQorICBmb3IgZmlsZSBzaXplcyAoY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkKSB3YXMgYmVpbmcgc3RvcmVkIGFzIHNpZ25lZAorICBpbnN0ZWFkIG9mIHVuc2lnbmVkLgorCistIGRlY2ltYWwucHkgbm93IG9ubHkgdXNlcyBzaWduYWxzIGluIHRoZSBJQk0gc3BlYy4gIFRoZSBvdGhlciBjb25kaXRpb25zIGFyZQorICBubyBsb25nZXIgcGFydCBvZiB0aGUgcHVibGljIEFQSS4KKworLSBjb2RlY3MgbW9kdWxlIG5vdyBoYXMgdHdvIG5ldyBnZW5lcmljIEFQSXM6IGVuY29kZSgpIGFuZCBkZWNvZGUoKQorICB3aGljaCBkb24ndCByZXN0cmljdCB0aGUgcmV0dXJuIHR5cGVzICh1bmxpa2UgdGhlIHVuaWNvZGUgYW5kCisgIHN0cmluZyBtZXRob2RzIG9mIHRoZSBzYW1lIG5hbWUpLgorCistIE5vbi1ibG9ja2luZyBTU0wgc29ja2V0cyB3b3JrIGFnYWluOyB0aGV5IHdlcmUgYnJva2VuIGluIFB5dGhvbiAyLjMuCisgIFNGIHBhdGNoIDk0NTY0Mi4KKworLSBkb2N0ZXN0IHVuaXR0ZXN0IGludGVncmF0aW9uIGltcHJvdmVtZW50czoKKworICBvIEltcHJvdmVkIHRoZSB1bml0ZXN0IHRlc3Qgb3V0cHV0IGZvciBkb2N0ZXN0LWJhc2VkIHVuaXQgdGVzdHMKKworICBvIENhbiBub3cgcGFzcyBzZXRVcCBhbmQgdGVhckRvd24gZnVuY3Rpb25zIHdoZW4gY3JlYXRpbmcKKyAgICBEb2NUZXN0U3VpdGVzLgorCistIFRoZSB0aHJlYWRpbmcgbW9kdWxlIGhhcyBhIG5ldyBjbGFzcywgbG9jYWwsIGZvciBjcmVhdGluZyBvYmplY3RzCisgIHRoYXQgcHJvdmlkZSB0aHJlYWQtbG9jYWwgZGF0YS4KKworLSBCdWcgIzk5MDMwNzogd2hlbiBrZWVwX2VtcHR5X3ZhbHVlcyBpcyBUcnVlLCBjZ2kucGFyc2VfcXNsKCkKKyAgbm8gbG9uZ2VyIHJldHVybnMgc3B1cmlvdXMgZW1wdHkgZmllbGRzLgorCistIEltcGxlbWVudGVkIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCkgaW4gZ2V0dGV4dCBtb2R1bGUuCisKKy0gSW50cm9kdWNlZCBpbiBnZXR0ZXh0IG1vZHVsZSB0aGUgbCpnZXR0ZXh0KCkgZmFtaWx5IG9mIGZ1bmN0aW9ucywKKyAgd2hpY2ggcmV0dXJuIHRyYW5zbGF0aW9uIHN0cmluZ3MgZW5jb2RlZCBpbiB0aGUgcHJlZmVycmVkIGVuY29kaW5nLAorICBhcyBpbmZvcm1lZCBieSBsb2NhbGUgbW9kdWxlJ3MgZ2V0cHJlZmVycmVkZW5jb2RpbmcoKS4KKworLSBvcHRwYXJzZSBtb2R1bGUgKGFuZCB0ZXN0cykgdXBncmFkZWQgdG8gT3B0aWsgMS41YTEuICBDaGFuZ2VzOgorCisgIC0gQWRkIGV4cGFuc2lvbiBvZiBkZWZhdWx0IHZhbHVlcyBpbiBoZWxwIHRleHQ6IHRoZSBzdHJpbmcKKyAgICAiJWRlZmF1bHQiIGluIGFuIG9wdGlvbidzIGhlbHAgc3RyaW5nIGlzIGV4cGFuZGVkIHRvIHN0cigpIG9mCisgICAgdGhhdCBvcHRpb24ncyBkZWZhdWx0IHZhbHVlLCBvciAibm9uZSIgaWYgbm8gZGVmYXVsdCB2YWx1ZS4KKworICAtIEJ1ZyAjOTU1ODg5OiBvcHRpb24gZGVmYXVsdCB2YWx1ZXMgdGhhdCBoYXBwZW4gdG8gYmUgc3RyaW5ncyBhcmUKKyAgICBub3cgcHJvY2Vzc2VkIGluIHRoZSBzYW1lIHdheSBhcyB2YWx1ZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lOyB0aGlzCisgICAgYWxsb3dzIGdlbmVyYXRpb24gb2YgbmljZXIgaGVscCB3aGVuIHVzaW5nIGN1c3RvbSB0eXBlcy4gIENhbgorICAgIGJlIGRpc2FibGVkIHdpdGggcGFyc2VyLnNldF9wcm9jZXNzX2RlZmF1bHRfdmFsdWVzKEZhbHNlKS4KKworICAtIEJ1ZyAjOTYwNTE1OiBkb24ndCBjcmFzaCB3aGVuIGdlbmVyYXRpbmcgaGVscCBmb3IgY2FsbGJhY2sKKyAgICBvcHRpb25zIHRoYXQgc3BlY2lmeSAndHlwZScsIGJ1dCBub3QgJ2Rlc3QnIG9yICdtZXRhdmFyJy4KKworICAtIEZlYXR1cmUgIzgxNTI2NDogY2hhbmdlIHRoZSBkZWZhdWx0IGhlbHAgZm9ybWF0IGZvciBzaG9ydCBvcHRpb25zCisgICAgdGhhdCB0YWtlIGFuIGFyZ3VtZW50IGZyb20gZS5nLiAiLW9BUkciIHRvICItbyBBUkciOyBhZGQKKyAgICBzZXRfc2hvcnRfb3B0X2RlbGltaXRlcigpIGFuZCBzZXRfbG9uZ19vcHRfZGVsaW1pdGVyKCkgbWV0aG9kcyB0bworICAgIEhlbHBGb3JtYXR0ZXIgdG8gYWxsb3cgKHNsaWdodCkgY3VzdG9taXphdGlvbiBvZiB0aGUgZm9ybWF0dGluZy4KKworICAtIFBhdGNoICM3MzY5NDA6IGludGVybmF0aW9uYWxpemUgT3B0aWs6IGFsbCBidWlsdC1pbiB1c2VyLQorICAgIHRhcmdldGVkIGxpdGVyYWwgc3RyaW5ncyBhcmUgcGFzc2VkIHRocm91Z2ggZ2V0dGV4dC5nZXR0ZXh0KCkuICAoSWYKKyAgICB5b3Ugd2FudCB0cmFuc2xhdGlvbnMgKC5wbyBmaWxlcyksIHRoZXkncmUgbm90IGluY2x1ZGVkIHdpdGggUHl0aG9uCisgICAgLS0geW91J2xsIGZpbmQgdGhlbSBpbiB0aGUgT3B0aWsgc291cmNlIGRpc3RyaWJ1dGlvbiBmcm9tCisgICAgaHR0cDovL29wdGlrLnNvdXJjZWZvcmdlLm5ldC8gLikKKworICAtIEJ1ZyAjODc4NDUzOiByZXNwZWN0ICRDT0xVTU5TIGVudmlyb25tZW50IHZhcmlhYmxlIGZvcgorICAgIHdyYXBwaW5nIGhlbHAgb3V0cHV0LgorCisgIC0gRmVhdHVyZSAjOTg4MTIyOiBleHBhbmQgIiVwcm9nIiBpbiB0aGUgJ2Rlc2NyaXB0aW9uJyBwYXNzZWQKKyAgICB0byBPcHRpb25QYXJzZXIsIGp1c3QgbGlrZSBpbiB0aGUgJ3VzYWdlJyBhbmQgJ3ZlcnNpb24nIHN0cmluZ3MuCisgICAgKFRoaXMgaXMgKm5vdCogZG9uZSBpbiB0aGUgJ2Rlc2NyaXB0aW9uJyBwYXNzZWQgdG8gT3B0aW9uR3JvdXAuKQorCitDIEFQSQorLS0tLS0KKworLSBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZSgpIGFuZCBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KCk6ICBpZiBhbgorICBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgbW9kdWxlLCB0aGVzZSBub3cgZGVsZXRlIHRoZSBtb2R1bGUncworICBlbnRyeSBmcm9tIHN5cy5tb2R1bGVzLiAgQWxsIHdheXMgb2YgbG9hZGluZyBtb2R1bGVzIGV2ZW50dWFsbHkgY2FsbAorICBvbmUgb2YgdGhlc2UsIHNvIHRoaXMgaXMgYW4gZXJyb3ItY2FzZSBjaGFuZ2UgaW4gc2VtYW50aWNzIGZvciBhbGwKKyAgd2F5cyBvZiBsb2FkaW5nIG1vZHVsZXMuICBJbiByYXJlIGNhc2VzLCBhIG1vZHVsZSBsb2FkZXIgbWF5IHdpc2gKKyAgdG8ga2VlcCBhIG1vZHVsZSBvYmplY3QgaW4gc3lzLm1vZHVsZXMgZGVzcGl0ZSB0aGF0IHRoZSBtb2R1bGUncworICBjb2RlIGNhbm5vdCBiZSBleGVjdXRlZC4gIEluIHN1Y2ggY2FzZXMsIHRoZSBtb2R1bGUgbG9hZGVyIG11c3QKKyAgYXJyYW5nZSB0byByZWluc2VydCB0aGUgbmFtZSBhbmQgbW9kdWxlIG9iamVjdCBpbiBzeXMubW9kdWxlcy4KKyAgUHlJbXBvcnRfUmVsb2FkTW9kdWxlKCkgaGFzIGJlZW4gY2hhbmdlZCB0byByZWluc2VydCB0aGUgb3JpZ2luYWwKKyAgbW9kdWxlIG9iamVjdCBpbnRvIHN5cy5tb2R1bGVzIGlmIHRoZSBtb2R1bGUgcmVsb2FkIGZhaWxzLCBzbyB0aGF0CisgIGl0cyB2aXNpYmxlIHNlbWFudGljcyBoYXZlIG5vdCBjaGFuZ2VkLgorCistIEEgbGFyZ2UgcGlsZSBvZiBkYXRldGltZSBmaWVsZC1leHRyYWN0aW9uIG1hY3JvcyBpcyBub3cgZG9jdW1lbnRlZCwKKyAgdGhhbmtzIHRvIEFudGhvbnkgVHVpbmluZ2EgKHBhdGNoICM5ODYwMTApLgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCisKKy0gSW1wcm92ZWQgdGhlIHR1dG9yaWFsIG9uIGNyZWF0aW5nIHR5cGVzIGluIEMuCisKKyAgLSBwb2ludCBvdXQgdGhlIGltcG9ydGFuY2Ugb2YgcmVhc3NpZ25pbmcgZGF0YSBtZW1iZXJzIGJlZm9yZQorICAgIGFzc2lnbmluZyB0aGVpciB2YWx1ZXMKKworICAtIGNvcnJlY3QgbXkgbWlzY29uY2VwdGlvbiBhYm91dCByZXR1cm4gdmFsdWVzIGZyb20gdmlzaXRwcm9jcy4gU2lnaC4KKworICAtIG1lbnRpb24gdGhlIGxhYm9yIHNhdmluZyBQeV9WSVNJVCBhbmQgUHlfQ0xFQVIgbWFjcm9zLgorCistIE1ham9yIHJld3JpdGUgb2YgdGhlIG1hdGggbW9kdWxlIGRvY3MsIHRvIGFkZHJlc3MgY29tbW9uIGNvbmZ1c2lvbnMuCisKK1Rlc3RzCistLS0tLQorCistIFRoZSB0ZXN0IGRhdGEgZmlsZXMgZm9yIHRoZSBkZWNpbWFsIHRlc3Qgc3VpdGUgYXJlIG5vdyBpbnN0YWxsZWQgb24KKyAgcGxhdGZvcm1zIHRoYXQgdXNlIHRoZSBNYWtlZmlsZS4KKworLSBTRiBwYXRjaCA5OTUyMjU6ICBUaGUgdGVzdCBmaWxlIHRlc3R0YXIudGFyIGFjY2lkZW50YWxseSBjb250YWluZWQKKyAgQ1ZTIGtleXdvcmRzIChsaWtlICRJZCQpLCB3aGljaCBjb3VsZCBjYXVzZSBzcHVyaW91cyBmYWlsdXJlcyBpbgorICB0ZXN0X3RhcmZpbGUucHkgZGVwZW5kaW5nIG9uIGhvdyB0aGUgdGVzdCBmaWxlIHdhcyBjaGVja2VkIG91dC4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjQgYWxwaGEgMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwOC1KVUwtMjAwNCoKKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gd2Vha3JlZi5yZWYgaXMgbm93IHRoZSB0eXBlIG9iamVjdCBhbHNvIGtub3duIGFzCisgIHdlYWtyZWYuUmVmZXJlbmNlVHlwZTsgaXQgY2FuIGJlIHN1YmNsYXNzZWQgbGlrZSBhbnkgb3RoZXIgbmV3LXN0eWxlCisgIGNsYXNzLiAgVGhlcmUncyBsZXNzIHBlci1lbnRyeSBvdmVyaGVhZCBpbiBXZWFrVmFsdWVEaWN0aW9uYXJ5CisgIG9iamVjdHMgbm93IChvbmUgb2JqZWN0IGluc3RlYWQgb2YgdGhyZWUpLgorCistIEJ1ZyAjOTUxODUxOiBQeXRob24gY3Jhc2hlZCB3aGVuIHJlYWRpbmcgaW1wb3J0IHRhYmxlIG9mIGNlcnRhaW4KKyAgV2luZG93cyBETExzLgorCistIEJ1ZyAjMjE1MTI2LiAgVGhlIGxvY2FscyBhcmd1bWVudCB0byBldmFsKCksIGV4ZWNmaWxlKCksIGFuZCBleGVjIG5vdworICBhY2NlcHQgYW55IG1hcHBpbmcgdHlwZS4KKworLSBtYXJzaGFsIG5vdyBzaGFyZXMgaW50ZXJuZWQgc3RyaW5ncy4gVGhpcyBjaGFuZ2UgaW50cm9kdWNlcworICBhIG5ldyAucHljIG1hZ2ljLgorCistIEJ1ZyAjOTY2NjIzLiBjbGFzc2VzIGNyZWF0ZWQgd2l0aCB0eXBlKCkgaW4gYW4gZXhlYygsIHt9KSBkb24ndAorICBoYXZlIGEgX19tb2R1bGVfXywgYnV0IGNvZGUgaW4gdHlwZW9iamVjdCBhc3N1bWVkIGl0IHdvdWxkIGFsd2F5cworICBiZSB0aGVyZS4KKworLSBQeXRob24gbm8gbG9uZ2VyIHJlbGllcyBvbiB0aGUgTENfTlVNRVJJQyBsb2NhbGUgc2V0dGluZyB0byBiZQorICB0aGUgIkMiIGxvY2FsZTsgYXMgYSByZXN1bHQsIGl0IG5vIGxvbmdlciB0cmllcyB0byBwcmV2ZW50IGNoYW5naW5nCisgIHRoZSBMQ19OVU1FUklDIGNhdGVnb3J5LgorCistIEJ1ZyAjOTUyODA3OiAgVW5waWNrbGluZyBwaWNrbGVkIGluc3RhbmNlcyBvZiBzdWJjbGFzc2VzIG9mCisgIGRhdGV0aW1lLmRhdGUsIGRhdGV0aW1lLmRhdGV0aW1lIGFuZCBkYXRldGltZS50aW1lIGNvdWxkIHlpZWxkIGluc2FuZQorICBvYmplY3RzLiAgVGhhbmtzIHRvIEppd29uIFNlbyBmb3IgYSBmaXguCisKKy0gQnVnICM4NDU4MDI6IFB5dGhvbiBjcmFzaGVzIHdoZW4gX19pbml0X18ucHkgaXMgYSBkaXJlY3RvcnkuCisKKy0gVW5pY29kZSBvYmplY3RzIHJlY2VpdmVkIHR3byBuZXcgbWV0aG9kczogaXN3aWRlKCkgYW5kIHdpZHRoKCkuCisgIFRoZXNlIHF1ZXJ5IEVhc3QgQXNpYW4gd2lkdGggaW5mb3JtYXRpb24sIGFzIHNwZWNpZmllZCBpbiBVbmljb2RlCisgIFRSMTEuCisKKy0gSW1wcm92ZWQgdGhlIHR1cGxlIGhhc2hpbmcgYWxnb3JpdGhtIHRvIGdpdmUgZmV3ZXIgY29sbGlzaW9ucyBpbgorICBjb21tb24gY2FzZXMuICBGaXhlcyBidWcgICM5NDI5NTIuCisKKy0gSW1wbGVtZW50ZWQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIChQRVAgMjg5KS4gIENvZGVkIGJ5IEppd29uIFNlby4KKworLSBFbmFibGVkIHRoZSBwcm9maWxpbmcgb2YgQyBleHRlbnNpb24gZnVuY3Rpb25zIChhbmQgYnVpbHRpbnMpIC0gY2hlY2sKKyAgbmV3IGRvY3VtZW50YXRpb24gYW5kIG1vZGlmaWVkIHByb2ZpbGUgYW5kIGJkYiBtb2R1bGVzIGZvciBtb3JlIGRldGFpbHMKKworLSBTZXQgZmlsZS5uYW1lIHRvIHRoZSBvYmplY3QgcGFzc2VkIHRvIG9wZW4gKGluc3RlYWQgb2YgYSBuZXcgc3RyaW5nKQorCistIE1vdmVkIHRyYWNlYmFja29iamVjdCBpbnRvIHRyYWNlYmFjay5oIGFuZCByZW5hbWVkIHRvIFB5VHJhY2ViYWNrT2JqZWN0CisKKy0gT3B0aW1pemVkIHRoZSBieXRlIGNvZGluZyBmb3IgbXVsdGlwbGUgYXNzaWdubWVudHMgbGlrZSAiYSxiPWIsYSIgYW5kCisgICJhLGIsYz0xLDIsMyIuICBJbXByb3ZlcyB0aGVpciBzcGVlZCBieSAyNSUgdG8gMzAlLgorCistIExpbWl0IHRoZSBuZXN0ZWQgZGVwdGggb2YgYSB0dXBsZSBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCB0byBpc2luc3RhbmNlKCkKKyAgYW5kIGlzc3ViY2xhc3MoKSB0byB0aGUgcmVjdXJzaW9uIGxpbWl0IG9mIHRoZSBpbnRlcnByZXRlci4KKyAgRml4ZXMgYnVnICAjODU4MDE2IC4KKworLSBPcHRpbWl6ZWQgZGljdCBpdGVyYXRvcnMsIGNyZWF0aW5nIHNlcGFyYXRlIHR5cGVzIGZvciBlYWNoCisgIGFuZCBoYXZpbmcgdGhlbSByZXZlYWwgdGhlaXIgbGVuZ3RoLiAgQWxzbyBvcHRpbWl6ZWQgdGhlCisgIG1ldGhvZHM6ICBrZXlzKCksIHZhbHVlcygpLCBhbmQgaXRlbXMoKS4KKworLSBJbXBsZW1lbnRlZCBhIG5ld2NvZGUgb3Bjb2RlLCBMSVNUX0FQUEVORCwgdGhhdCBzaW1wbGlmaWVzCisgIHRoZSBnZW5lcmF0ZWQgYnl0ZWNvZGUgZm9yIGxpc3QgY29tcHJlaGVuc2lvbnMgYW5kIGZ1cnRoZXIKKyAgaW1wcm92ZXMgdGhlaXIgcGVyZm9ybWFuY2UgKGFib3V0IDM1JSkuCisKKy0gSW1wbGVtZW50ZWQgcmljaCBjb21wYXJpc29ucyBmb3IgZmxvYXRzLCB3aGljaCBzZWVtcyB0byBtYWtlCisgIGNvbXBhcmlzb25zIGludm9sdmluZyBOYU5zIHNvbWV3aGF0IGxlc3Mgc3VycHJpc2luZyB3aGVuIHRoZQorICB1bmRlcmx5aW5nIEMgY29tcGlsZXIgYWN0dWFsbHkgaW1wbGVtZW50cyBDOTkgc2VtYW50aWNzLgorCistIE9wdGltaXplZCBsaXN0LmV4dGVuZCgpIHRvIHNhdmUgbWVtb3J5IGFuZCBubyBsb25nZXIgY3JlYXRlCisgIGludGVybWVkaWF0ZSBzZXF1ZW5jZXMuICBBbHNvLCBleHRlbmQoKSBub3cgcHJlLWFsbG9jYXRlcyB0aGUKKyAgbmVlZGVkIG1lbW9yeSB3aGVuZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBpdGVyYWJsZSBpcyBrbm93biBpbgorICBhZHZhbmNlIC0tIHRoaXMgaGFsdmVzIHRoZSB0aW1lIHRvIGV4dGVuZCB0aGUgbGlzdC4KKworLSBPcHRpbWl6ZWQgbGlzdCByZXNpemUgb3BlcmF0aW9ucyB0byBtYWtlIGZld2VyIGNhbGxzIHRvIHRoZSBzeXN0ZW0KKyAgcmVhbGxvYygpLiAgU2lnbmlmaWNhbnRseSBzcGVlZHMgdXAgbGlzdCBhcHBlbmRzLCBsaXN0IHBvcHMsCisgIGxpc3QgY29tcHJlaGVuc2lvbnMsIGFuZCB0aGUgbGlzdCBjb25zdHJ1Y3RvciAod2hlbiB0aGUgaW5wdXQgaXRlcmFibGUKKyAgbGVuZ3RoIGlzIG5vdCBrbm93bikuCisKKy0gQ2hhbmdlZCB0aGUgaW50ZXJuYWwgbGlzdCBvdmVyLWFsbG9jYXRpb24gc2NoZW1lLiAgRm9yIGxhcmdlciBsaXN0cywKKyAgb3ZlcmFsbG9jYXRpb24gcmFuZ2VkIGJldHdlZW4gMyUgYW5kIDI1JS4gIE5vdywgaXQgaXMgYSBjb25zdGFudCAxMiUuCisgIEZvciBzbWFsbGVyIGxpc3RzIChuPDgpLCBvdmVyYWxsb2NhdGlvbiB3YXMgdXB0byBlaWdodCBlbGVtZW50cy4gIE5vdywKKyAgdGhlIG92ZXJhbGxvY2F0aW9uIGlzIG5vIG1vcmUgdGhhbiB0aHJlZSBlbGVtZW50cyAtLSB0aGlzIGltcHJvdmVzIHNwYWNlCisgIHV0aWxpemF0aW9uIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIGxhcmdlIG51bWJlcnMgb2Ygc21hbGwgbGlzdHMuCisKKy0gTW9zdCBsaXN0IGJvZGllcyBub3cgZ2V0IHJlLXVzZWQgcmF0aGVyIHRoYW4gZnJlZWQuICBTcGVlZHMgdXAgbGlzdAorICBpbnN0YW50aWF0aW9uIGFuZCBkZWxldGlvbiBieSBzYXZpbmcgY2FsbHMgdG8gbWFsbG9jKCkgYW5kIGZyZWUoKS4KKworLSBUaGUgZGljdC51cGRhdGUoKSBtZXRob2Qgbm93IGFjY2VwdHMgYWxsIHRoZSBzYW1lIGFyZ3VtZW50IGZvcm1zCisgIGFzIHRoZSBkaWN0KCkgY29uc3RydWN0b3IuICBUaGlzIG5vdyBpbmNsdWRlcyBpdGVtIGxpc3RzIGFuZC9vcgorICBrZXl3b3JkIGFyZ3VtZW50cy4KKworLSBTdXBwb3J0IGZvciBhcmJpdHJhcnkgb2JqZWN0cyBzdXBwb3J0aW5nIHRoZSByZWFkLW9ubHkgYnVmZmVyCisgIGludGVyZmFjZSBhcyB0aGUgY29fY29kZSBmaWVsZCBvZiBjb2RlIG9iamVjdHMgKHNvbWV0aGluZyB0aGF0IHdhcworICBvbmx5IHBvc3NpYmxlIHRvIGNyZWF0ZSBmcm9tIEMgY29kZSkgaGFzIGJlZW4gcmVtb3ZlZC4KKworLSBNYWRlIG9taXR0ZWQgY2FsbGJhY2sgYW5kIE5vbmUgZXF1aXZhbGVudCBmb3Igd2Vha3JlZi5yZWYoKSBhbmQKKyAgd2Vha3JlZi5wcm94eSgpOyB0aGUgTm9uZSBjYXNlIHdhc24ndCBoYW5kbGVkIGNvcnJlY3RseSBpbiBhbGwKKyAgY2FzZXMuCisKKy0gRml4ZWQgcHJvYmxlbSB3aGVyZSBQeVdlYWtyZWZfTmV3UmVmKCkgYW5kIFB5V2Vha3JlZl9OZXdQcm94eSgpCisgIGFzc3VtZWQgdGhhdCBpbml0aWFsIGV4aXN0aW5nIGVudHJpZXMgaW4gYW4gb2JqZWN0J3Mgd2Vha3JlZiBsaXN0CisgIHdvdWxkIG5vdCBiZSByZW1vdmVkIHdoaWxlIGFsbG9jYXRpbmcgYSBuZXcgd2Vha3JlZiBvYmplY3QuICBTaW5jZQorICBHQyBjb3VsZCBiZSBpbnZva2VkIGF0IHRoYXQgdGltZSwgaG93ZXZlciwgdGhhdCBhc3N1bXB0aW9uIHdhcworICBpbnZhbGlkLiAgSW4gYSB0cnVseSBvYnNjdXJlIGNhc2Ugb2YgR0MgYmVpbmcgdHJpZ2dlcmVkIGR1cmluZworICBjcmVhdGlvbiBmb3IgYSBuZXcgd2Vha3JlZiBvYmplY3QgZm9yIGFuIHJlZmVyZW50IHdoaWNoIGFscmVhZHkKKyAgaGFzIGEgd2Vha3JlZiB3aXRob3V0IGEgY2FsbGJhY2sgd2hpY2ggaXMgb25seSByZWZlcmVuY2VkIGZyb20KKyAgY3ljbGljIHRyYXNoLCBhIG1lbW9yeSBlcnJvciBjYW4gb2NjdXIuICBUaGlzIGNvbnNpc3RlbnRseSBjcmVhdGVkIGEKKyAgc2VnZmF1bHQgaW4gYSBkZWJ1ZyBidWlsZCwgYnV0IHByb3ZpZGVkIGxlc3MgcHJlZGljdGFibGUgYmVoYXZpb3IgaW4KKyAgYSByZWxlYXNlIGJ1aWxkLgorCistIGlucHV0KCkgYnVpbHRpbiBmdW5jdGlvbiBub3cgcmVzcGVjdHMgY29tcGlsZXIgZmxhZ3Mgc3VjaCBhcworICBfX2Z1dHVyZV9fIHN0YXRlbWVudHMuICBTRiBwYXRjaCA4NzYxNzguCisKKy0gUmVtb3ZlZCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIGZyb20gYXBwbHkoKS4gIGFwcGx5KCkgcmVtYWlucworICBkZXByZWNhdGVkLCBidXQgdGhlIG51aXNhbmNlIHdhcm5pbmcgd2lsbCBub3QgYmUgaXNzdWVkLgorCistIEF0IFB5dGhvbiBzaHV0ZG93biB0aW1lIChQeV9GaW5hbGl6ZSgpKSwgMi4zIGNhbGxlZCBjeWNsaWMgZ2FyYmFnZQorICBjb2xsZWN0aW9uIHR3aWNlLCBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGVhcmluZyBkb3duIG1vZHVsZXMuICBUaGUKKyAgY2FsbCBhZnRlciB0ZWFyaW5nIGRvd24gbW9kdWxlcyBoYXMgYmVlbiBkaXNhYmxlZCwgYmVjYXVzZSB0b28gbXVjaAorICBvZiBQeXRob24gaGFzIGJlZW4gdG9ybiBkb3duIHRoZW4gZm9yIF9fZGVsX18gbWV0aG9kcyBhbmQgd2Vha3JlZgorICBjYWxsYmFja3MgdG8gZXhlY3V0ZSBzYW5lbHkuICBUaGUgbW9zdCBjb21tb24gc3ltcHRvbSB3YXMgYSBzZXF1ZW5jZQorICBvZiB1bmluZm9ybWF0aXZlIG1lc3NhZ2VzIG9uIHN0ZGVyciB3aGVuIFB5dGhvbiBzaHV0IGRvd24sIHByb2R1Y2VkCisgIGJ5IHRocmVhZHMgdHJ5aW5nIHRvIHJhaXNlIGV4Y2VwdGlvbnMsIGJ1dCB1bmFibGUgdG8gcmVwb3J0IHRoZSBuYXR1cmUKKyAgb2YgdGhlaXIgcHJvYmxlbXMgYmVjYXVzZSB0b28gbXVjaCBvZiB0aGUgc3lzIG1vZHVsZSBoYWQgYWxyZWFkeSBiZWVuCisgIGRlc3Ryb3llZC4KKworLSBSZW1vdmVkIEZ1dHVyZVdhcm5pbmdzIHJlbGF0ZWQgdG8gaGV4L29jdCBsaXRlcmFscyBhbmQgY29udmVyc2lvbnMKKyAgYW5kIGxlZnQgc2hpZnRzLiAgKFRoYW5rcyB0byBLYWxsZSBTdmVuc3NvbiBmb3IgU0YgcGF0Y2ggODQ5MjI3LikKKyAgVGhpcyBhZGRyZXNzZXMgbW9zdCBvZiB0aGUgcmVtYWluaW5nIHNlbWFudGljIGNoYW5nZXMgcHJvbWlzZWQgYnkKKyAgUEVQIDIzNywgZXhjZXB0IGZvciByZXByKCkgb2YgYSBsb25nLCB3aGljaCBzdGlsbCBzaG93cyB0aGUgdHJhaWxpbmcKKyAgJ0wnLiAgVGhlIFBFUCBhcHBlYXJzIHRvIHByb21pc2Ugd2FybmluZ3MgZm9yIG9wZXJhdGlvbnMgdGhhdAorICBjaGFuZ2VkIHNlbWFudGljcyBjb21wYXJlZCB0byBQeXRob24gMi4zLCBidXQgdGhpcyBpcyBub3QKKyAgaW1wbGVtZW50ZWQ7IHdlJ3ZlIHN1ZmZlcmVkIHRocm91Z2ggZW5vdWdoIHdhcm5pbmdzIHJlbGF0ZWQgdG8KKyAgaGV4L29jdCBsaXRlcmFscyBhbmQgSSB0aGluayBpdCdzIGJlc3QgdG8gYmUgc2lsZW50IG5vdy4KKworLSBGb3Igc3RyIGFuZCB1bmljb2RlIG9iamVjdHMsIHRoZSBsanVzdCgpLCBjZW50ZXIoKSwgYW5kIHJqdXN0KCkKKyAgbWV0aG9kcyBub3cgYWNjZXB0IGFuIG9wdGlvbmFsIGFyZ3VtZW50IHNwZWNpZnlpbmcgYSBmaWxsCisgIGNoYXJhY3RlciBvdGhlciB0aGFuIGEgc3BhY2UuCisKKy0gV2hlbiBtZXRob2Qgb2JqZWN0cyBoYXZlIGFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSBzYXRpc2ZpZWQgZWl0aGVyCisgIGJ5IHRoZSBmdW5jdGlvbiBvYmplY3Qgb3IgYnkgdGhlIG1ldGhvZCBvYmplY3QsIHRoZSBmdW5jdGlvbgorICBvYmplY3QncyBhdHRyaWJ1dGUgdXN1YWxseSB3aW5zLiAgQ2hyaXN0aWFuIFRpc21lciBwb2ludGVkIG91dCB0aGF0CisgIHRoYXQgdGhpcyBpcyByZWFsbHkgYSBtaXN0YWtlLCBiZWNhdXNlIHRoaXMgb25seSBoYXBwZW5zIGZvciBzcGVjaWFsCisgIG1ldGhvZHMgKGxpa2UgX19yZWR1Y2VfXykgd2hlcmUgdGhlIG1ldGhvZCBvYmplY3QncyB2ZXJzaW9uIGlzCisgIHJlYWxseSBtb3JlIGFwcHJvcHJpYXRlIHRoYW4gdGhlIGZ1bmN0aW9uJ3MgYXR0cmlidXRlLiAgU28gZnJvbSBub3cKKyAgb24sIGFsbCBtZXRob2QgYXR0cmlidXRlcyB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIGZ1bmN0aW9uCisgIGF0dHJpYnV0ZXMgd2l0aCB0aGUgc2FtZSBuYW1lLgorCistIENyaXRpY2FsIGJ1Z2ZpeCwgZm9yIFNGIGJ1ZyA4Mzk1NDg6ICBpZiBhIHdlYWtyZWYgd2l0aCBhIGNhbGxiYWNrLAorICBpdHMgY2FsbGJhY2ssIGFuZCBpdHMgd2Vha2x5IHJlZmVyZW5jZWQgb2JqZWN0LCBhbGwgYmVjYW1lIHBhcnQgb2YKKyAgY3ljbGljIGdhcmJhZ2UgZHVyaW5nIGEgc2luZ2xlIHJ1biBvZiBnYXJiYWdlIGNvbGxlY3Rpb24sIHRoZSBvcmRlcgorICBpbiB3aGljaCB0aGV5IHdlcmUgdG9ybiBkb3duIHdhcyB1bnByZWRpY3RhYmxlLiAgSXQgd2FzIHBvc3NpYmxlIGZvcgorICB0aGUgY2FsbGJhY2sgdG8gc2VlIHBhcnRpYWxseS10b3JuLWRvd24gb2JqZWN0cywgbGVhZGluZyB0byBpbW1lZGlhdGUKKyAgc2VnZmF1bHRzLCBvciwgaWYgdGhlIGNhbGxiYWNrIHJlc3VycmVjdGVkIGdhcmJhZ2Ugb2JqZWN0cywgdG8KKyAgcmVzdXJyZWN0IGluc2FuZSBvYmplY3RzIHRoYXQgY2F1c2VkIHNlZ2ZhdWx0cyAob3Igb3RoZXIgc3VycHJpc2VzKQorICBsYXRlci4gIEluIG9uZSBzZW5zZSB0aGlzIHdhc24ndCBzdXJwcmlzaW5nLCBiZWNhdXNlIFB5dGhvbidzIGN5Y2xpYyBnYworICBoYWQgbm8ga25vd2xlZGdlIG9mIFB5dGhvbidzIHdlYWtyZWYgb2JqZWN0cy4gIEl0IGRvZXMgbm93LiAgV2hlbgorICB3ZWFrcmVmcyB3aXRoIGNhbGxiYWNrcyBiZWNvbWUgcGFydCBvZiBjeWNsaWMgZ2FyYmFnZSBub3csIHRob3NlCisgIHdlYWtyZWZzIGFyZSBjbGVhcmVkIGZpcnN0LiAgVGhlIGNhbGxiYWNrcyBkb24ndCB0cmlnZ2VyIHRoZW4sCisgIHByZXZlbnRpbmcgdGhlIHByb2JsZW1zLiAgSWYgeW91IG5lZWQgY2FsbGJhY2tzIHRvIHRyaWdnZXIsIHRoZW4ganVzdAorICBhcyB3aGVuIGN5Y2xpYyBnYyBpcyBub3QgaW52b2x2ZWQsIHlvdSBuZWVkIHRvIHdyaXRlIHlvdXIgY29kZSBzbworICB0aGF0IHdlYWtyZWYgb2JqZWN0cyBvdXRsaXZlIHRoZSBvYmplY3RzIHRoZXkgd2Vha2x5IHJlZmVyZW5jZS4KKworLSBDcml0aWNhbCBidWdmaXgsIGZvciBTRiBidWcgODQwODI5OiAgaWYgY3ljbGljIGdhcmJhZ2UgY29sbGVjdGlvbgorICBoYXBwZW5lZCB0byBvY2N1ciBkdXJpbmcgYSB3ZWFrcmVmIGNhbGxiYWNrIGZvciBhIG5ldy1zdHlsZSBjbGFzcworICBpbnN0YW5jZSwgc3VidGxlIG1lbW9yeSBjb3JydXB0aW9uIHdhcyB0aGUgcmVzdWx0IChpbiBhIHJlbGVhc2UgYnVpbGQ7CisgIGluIGEgZGVidWcgYnVpbGQsIGEgc2VnZmF1bHQgb2NjdXJyZWQgcmVsaWFibHkgdmVyeSBzb29uIGFmdGVyKS4KKyAgVGhpcyBoYXMgYmVlbiByZXBhaXJlZC4KKworLSBDb21waWxlciBmbGFncyBzZXQgaW4gUFlUSE9OU1RBUlRVUCBhcmUgbm93IGFjdGl2ZSBpbiBfX21haW5fXy4KKworLSBBZGRlZCB0d28gYnVpbHRpbiB0eXBlcywgc2V0KCkgYW5kIGZyb3plbnNldCgpLgorCistIEFkZGVkIGEgcmV2ZXJzZWQoKSBidWlsdGluIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJldmVyc2UgaXRlcmF0b3IKKyAgb3ZlciBhIHNlcXVlbmNlLgorCistIEFkZGVkIGEgc29ydGVkKCkgYnVpbHRpbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgc29ydGVkIGxpc3QKKyAgZnJvbSBhbnkgaXRlcmFibGUuCisKKy0gQ09iamVjdHMgYXJlIG5vdyBtdXRhYmxlIChvbiB0aGUgQyBsZXZlbCkgdGhyb3VnaCBQeUNPYmplY3RfU2V0Vm9pZFB0ci4KKworLSBsaXN0LnNvcnQoKSBub3cgc3VwcG9ydHMgdGhyZWUga2V5d29yZCBhcmd1bWVudHM6ICBjbXAsIGtleSwgYW5kIHJldmVyc2UuCisgIFRoZSBrZXkgYXJndW1lbnQgY2FuIGJlIGEgZnVuY3Rpb24gb2Ygb25lIGFyZ3VtZW50IHRoYXQgZXh0cmFjdHMgYQorICBjb21wYXJpc29uIGtleSBmcm9tIHRoZSBvcmlnaW5hbCByZWNvcmQ6ICBteWxpc3Quc29ydChrZXk9c3RyLmxvd2VyKS4KKyAgVGhlIHJldmVyc2UgYXJndW1lbnQgaXMgYSBib29sZWFuIHZhbHVlIGFuZCBpZiBUcnVlIHdpbGwgY2hhbmdlIHRoZQorICBzb3J0IG9yZGVyIGFzIGlmIHRoZSBjb21wYXJpc29uIGFyZ3VtZW50cyB3ZXJlIHJldmVyc2VkLiAgSW4gYWRkaXRpb24sCisgIHRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGFtZW5kZWQgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZSB0aGF0IGFsbCBzb3J0cworICBzdGFydGluZyB3aXRoIFB5Mi4zIGFyZSBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZSAodGhlIHJlbGF0aXZlIG9yZGVyIG9mCisgIHJlY29yZHMgd2l0aCBlcXVhbCBrZXlzIGlzIHVuY2hhbmdlZCkuCisKKy0gQWRkZWQgdGVzdCB3aGV0aGVyIHdjaGFyX3QgaXMgc2lnbmVkIG9yIG5vdC4gQSBzaWduZWQgd2NoYXJfdCBpcyBub3QKKyAgdXNhYmxlIGFzIGludGVybmFsIHVuaWNvZGUgdHlwZSBiYXNlIGZvciBQeV9VTklDT0RFIHNpbmNlIHRoZQorICB1bmljb2RlIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgYW4gdW5zaWduZWQgdHlwZS4KKworLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgY2FjaGUgb2YgbGVuZ3RoLW9uZSBVbmljb2RlIHN0cmluZ3MgdGhhdCBjb3VsZAorICBsZWFkIHRvIGEgc2VnIGZhdWx0LiAgVGhlIHNwZWNpZmljIHByb2JsZW0gb2NjdXJyZWQgd2hlbiBhbiBlYXJsaWVyLAorICBub24tZmF0YWwgZXJyb3IgbGVmdCBhbiB1bmluaXRpYWxpemVkIFVuaWNvZGUgb2JqZWN0IGluIHRoZQorICBmcmVlbGlzdC4KKworLSBUaGUgJSBmb3JtYXR0aW5nIG9wZXJhdG9yIG5vdyBzdXBwb3J0cyAnJUYnIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8KKyAgJyVmJy4gIFRoaXMgaGFzIGFsd2F5cyBiZWVuIGRvY3VtZW50ZWQgYnV0IG5ldmVyIGltcGxlbWVudGVkLgorCistIGNvbXBsZXgob2JqKSBjb3VsZCBsZWFrIGEgbGl0dGxlIG1lbW9yeSBpZiBvYmogd2Fzbid0IGEgc3RyaW5nIG9yCisgIG51bWJlci4KKworLSB6aXAoKSB3aXRoIG5vIGFyZ3VtZW50cyBub3cgcmV0dXJucyBhbiBlbXB0eSBsaXN0IGluc3RlYWQgb2YgcmFpc2luZworICBhIFR5cGVFcnJvciBleGNlcHRpb24uCisKKy0gb2JqLl9fY29udGFpbnNfXygpIG5vdyByZXR1cm5zIFRydWUvRmFsc2UgaW5zdGVhZCBvZiAxLzAuICBTRiBwYXRjaAorICA4MjAxOTUuCisKKy0gUHl0aG9uIG5vIGxvbmdlciB0cmllcyB0byBiZSBzbWFydCBhYm91dCByZWN1cnNpdmUgY29tcGFyaXNvbnMuCisgIFdoZW4gY29tcGFyaW5nIGNvbnRhaW5lcnMgd2l0aCBjeWNsaWMgcmVmZXJlbmNlcyB0byB0aGVtc2VsdmVzIGl0CisgIHdpbGwgbm93IGp1c3QgaGl0IHRoZSByZWN1cnNpb24gbGltaXQuICBTZWUgU0YgcGF0Y2ggODI1NjM5LgorCistIHN0ciBhbmQgdW5pY29kZSBidWlsdGluIHR5cGVzIG5vdyBoYXZlIGFuIHJzcGxpdCgpIG1ldGhvZCB0aGF0IGlzCisgIHNhbWUgYXMgc3BsaXQoKSBleGNlcHQgdGhhdCBpdCBzY2FucyB0aGUgc3RyaW5nIGZyb20gdGhlIGVuZAorICB3b3JraW5nIHRvd2FyZHMgdGhlIGJlZ2lubmluZy4gIFNlZSBTRiBmZWF0dXJlIHJlcXVlc3QgODAxODQ3LgorCistIEZpeGVkIGEgYnVnIGluIG9iamVjdC5fX3JlZHVjZV9leF9fIHdoZW4gdXNpbmcgcHJvdG9jb2wgMi4gIEZhaWx1cmUKKyAgdG8gY2xlYXIgdGhlIGVycm9yIHdoZW4gYXR0ZW1wdHMgdG8gZ2V0IHRoZSBfX2dldHN0YXRlX18gYXR0cmlidXRlCisgIGZhaWwgY2F1c2VkIGludGVybWl0dGVudCBlcnJvcnMgYW5kIG9kZCBiZWhhdmlvci4KKworLSBidWZmZXIgb2JqZWN0cyBiYXNlZCBvbiBvdGhlciBvYmplY3RzIG5vIGxvbmdlciBjYWNoZSBhIHBvaW50ZXIgdG8KKyAgdGhlIGRhdGEgYW5kIHRoZSBkYXRhIGxlbmd0aC4gIEluc3RlYWQsIHRoZSBhcHByb3ByaWF0ZSB0cF9hc19idWZmZXIKKyAgbWV0aG9kIGlzIGNhbGxlZCBhcyBuZWNlc3NhcnkuCisKKy0gZml4ZWQ6IGlmIGEgZmlsZSBpcyBvcGVuZWQgd2l0aCBhbiBleHBsaWNpdCBidWZmZXIgc2l6ZSA+PSAxLCByZXBlYXRlZAorICBjbG9zZSgpIGNhbGxzIHdvdWxkIGF0dGVtcHQgdG8gZnJlZSgpIHRoZSBidWZmZXIgYWxyZWFkeSBmcmVlKCllZCBvbgorICB0aGUgZmlyc3QgY2FsbC4KKworCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBZGRlZCBzb2NrZXQuZ2V0c2VydmJ5cG9ydCgpLCBhbmQgbWFrZSB0aGUgc2Vjb25kIGFyZ3VtZW50IGluCisgIGdldHNlcnZieW5hbWUoKSBhbmQgZ2V0c2VydmJ5cG9ydCgpIG9wdGlvbmFsLgorCistIHRpbWUgbW9kdWxlIGNvZGUgdGhhdCBkZWFscyB3aXRoIGlucHV0IFBPU0lYIHRpbWVzdGFtcHMgd2lsbCBub3cgcmFpc2UKKyAgVmFsdWVFcnJvciBpZiBtb3JlIHRoYW4gYSBzZWNvbmQgaXMgbG9zdCBpbiBwcmVjaXNpb24gd2hlbiB0aGUKKyAgdGltZXN0YW1wIGlzIGNhc3QgdG8gdGhlIHBsYXRmb3JtIEMgdGltZV90IHR5cGUuICBUaGVyZSdzIG5vIGNoYW5jZQorICB0aGF0IHRoZSBwbGF0Zm9ybSB3aWxsIGRvIGFueXRoaW5nIHNlbnNpYmxlIHdpdGggdGhlIHJlc3VsdCBpbiBzdWNoCisgIGNhc2VzLiAgVGhpcyBpbmNsdWRlcyBjdGltZSgpLCBsb2NhbHRpbWUoKSBhbmQgZ210aW1lKCkuICBBc3NvcnRlZAorICBmcm9tdGltZXN0YW1wKCkgYW5kIHV0Y2Zyb210aW1lc3RhbXAoKSBtZXRob2RzIGluIHRoZSBkYXRldGltZSBtb2R1bGUKKyAgd2VyZSBhbHNvIHByb3RlY3RlZC4gIENsb3NlcyBidWdzICM5MTkwMTIgYW5kIDk3NTk5Ni4KKworLSBmY250bC5pb2N0bCBub3cgd2FybnMgaWYgdGhlIG11dGF0ZSBmbGFnIGlzIG5vdCBzcGVjaWZpZWQuCisKKy0gbnQgbm93IHByb3Blcmx5IGFsbG93cyB0byByZWZlciB0byBVTkMgcm9vdHMsIGUuZy4gaW4gbnQuc3RhdCgpLgorCistIHRoZSB3ZWFrcmVmIG1vZHVsZSBub3cgc3VwcG9ydHMgYWRkaXRpb25hbCBvYmplY3RzOiAgYXJyYXkuYXJyYXksCisgIHNyZS5wYXR0ZXJuX29iamVjdHMsIGZpbGUgb2JqZWN0cywgYW5kIHNvY2tldHMuCisKKy0gb3BlcmF0b3IuaXNNYXBwaW5nVHlwZSgpIGFuZCBvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSgpIG5vdyBnaXZlCisgIGZld2VyIGZhbHNlIHBvc2l0aXZlcy4KKworLSBzb2NrZXQuc3NsZXJyb3IgaXMgbm93IGEgc3ViY2xhc3Mgb2Ygc29ja2V0LmVycm9yIC4gIEFsc28gYWRkZWQKKyAgc29ja2V0LmVycm9yIHRvIHRoZSBzb2NrZXQgbW9kdWxlJ3MgQyBBUEkuCisKKy0gQnVnICM5MjA1NzU6IEEgcHJvYmxlbSB3aGVyZSB0aGUgX2xvY2FsZSBtb2R1bGUgc2VnZmF1bHRzIG9uCisgIG5sX2xhbmdpbmZvKEVSQSkgY2F1c2VkIGJ5IEdOVSBsaWJjJ3MgaWxsZWdhbCBOVUxMIHJldHVybiBpcyBmaXhlZC4KKworLSBhcnJheSBvYmplY3RzIG5vdyBzdXBwb3J0IHRoZSBjb3B5IG1vZHVsZS4gIEFsc28sIHRoZWlyIHJlc2l6aW5nCisgIHNjaGVtZSBoYXMgYmVlbiB1cGRhdGVkIHRvIG1hdGNoIHRoYXQgdXNlZCBmb3IgbGlzdCBvYmplY3RzLiAgVGhpcyBpbXByb3ZlcworICB0aGUgcGVyZm9ybWFuY2UgKHNwZWVkIGFuZCBtZW1vcnkgdXNhZ2UpIG9mIGFwcGVuZCgpIG9wZXJhdGlvbnMuCisgIEFsc28sIGFycmF5LmFycmF5KCkgYW5kIGFycmF5LmV4dGVuZCgpIG5vdyBhY2NlcHQgYW55IGl0ZXJhYmxlIGFyZ3VtZW50CisgIGZvciByZXBlYXRlZCBhcHBlbmRzIHdpdGhvdXQgbmVlZGluZyB0byBjcmVhdGUgYW5vdGhlciB0ZW1wb3JhcnkgYXJyYXkuCisKKy0gY1N0cmluZ0lPLndyaXRlbGluZXMoKSBub3cgYWNjZXB0cyBhbnkgaXRlcmFibGUgYXJndW1lbnQgYW5kIHdyaXRlcworICB0aGUgbGluZXMgb25lIGF0IGEgdGltZSByYXRoZXIgdGhhbiBqb2luaW5nIHRoZW0gYW5kIHdyaXRpbmcgb25jZS4KKyAgTWFkZSBhIHBhcmFsbGVsIGNoYW5nZSB0byBTdHJpbmdJTy53cml0ZWxpbmVzKCkuICBTYXZlcyBtZW1vcnkgYW5kCisgIG1ha2VzIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMuCisKKy0gdGltZS5zdHJmdGltZSgpIG5vdyBjaGVja3MgdGhhdCB0aGUgdmFsdWVzIGluIGl0cyB0aW1lIHR1cGxlIGFyZ3VtZW50CisgIGFyZSB3aXRoaW4gdGhlIHByb3BlciBib3VuZGFyaWVzIHRvIHByZXZlbnQgcG9zc2libGUgY3Jhc2hlcyBmcm9tIHRoZQorICBwbGF0Zm9ybSdzIEMgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiBvZiBzdHJmdGltZSgpLiAgQ2FuIHBvc3NpYmx5CisgIGJyZWFrIGNvZGUgdGhhdCB1c2VzIHZhbHVlcyBvdXRzaWRlIHRoZSByYW5nZSB0aGF0IGRpZG4ndCBjYXVzZQorICBwcm9ibGVtcyBwcmV2aW91c2x5IChzdWNoIGFzIHNpdHRpbmcgZGF5IG9mIHllYXIgdG8gMCkuICBGaXhlcyBidWcKKyAgIzg5NzYyNS4KKworLSBUaGUgc29ja2V0IG1vZHVsZSBub3cgc3VwcG9ydHMgQmx1ZXRvb3RoIHNvY2tldHMsIGlmIHRoZQorICBzeXN0ZW0gaGFzIDxibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisKKy0gQWRkZWQgYSBjb2xsZWN0aW9ucyBtb2R1bGUgY29udGFpbmluZyBhIG5ldyBkYXRhdHlwZSwgZGVxdWUoKSwKKyAgb2ZmZXJpbmcgaGlnaC1wZXJmb3JtYW5jZSwgdGhyZWFkLXNhZmUsIG1lbW9yeSBmcmllbmRseSBhcHBlbmRzCisgIGFuZCBwb3BzIG9uIGVpdGhlciBzaWRlIG9mIHRoZSBkZXF1ZS4KKworLSBTZXZlcmFsIG1vZHVsZXMgbm93IHRha2UgYWR2YW50YWdlIG9mIGNvbGxlY3Rpb25zLmRlcXVlKCkgZm9yCisgIGltcHJvdmVkIHBlcmZvcm1hbmNlOiAgUXVldWUsIG11dGV4LCBzaGxleCwgdGhyZWFkaW5nLCBhbmQgcHlkb2MuCisKKy0gVGhlIG9wZXJhdG9yIG1vZHVsZSBoYXMgdHdvIG5ldyBmdW5jdGlvbnMsIGF0dHJnZXR0ZXIoKSBhbmQKKyAgaXRlbWdldHRlcigpIHdoaWNoIGFyZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGZhc3QgZGF0YSBleHRyYWN0b3IKKyAgZnVuY3Rpb25zIGZvciBtYXAoKSwgbGlzdC5zb3J0KCksIGl0ZXJ0b29scy5ncm91cGJ5KCksIGFuZAorICBvdGhlciBmdW5jdGlvbnMgdGhhdCBleHBlY3QgYSBmdW5jdGlvbiBhcmd1bWVudC4KKworLSBzb2NrZXQuU0hVVF97UkQsV1IsUkRXUn0gd2FzIGFkZGVkLgorCistIG9zLmdldHNpZCB3YXMgYWRkZWQuCisKKy0gVGhlIHB3ZCBtb2R1bGUgaW5jb3JyZWN0bHkgYWR2ZXJ0aXNlZCBpdHMgc3RydWN0IHR5cGUgYXMKKyAgc3RydWN0X3B3ZW50OyB0aGlzIGhhcyBiZWVuIHJlbmFtZWQgdG8gc3RydWN0X3Bhc3N3ZC4gIChUaGUgb2xkIG5hbWUKKyAgaXMgc3RpbGwgc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4pCisKKy0gVGhlIHhtbC5wYXJzZXJzLmV4cGF0IG1vZHVsZSBub3cgcHJvdmlkZXMgRXhwYXQgMS45NS43LgorCistIHNvY2tldC5JUFBST1RPX0lQVjYgd2FzIGFkZGVkLgorCistIHJlYWRsaW5lLmNsZWFyX2hpc3Rvcnkgd2FzIGFkZGVkLgorCistIHNlbGVjdC5zZWxlY3QoKSBub3cgYWNjZXB0cyBzZXF1ZW5jZXMgZm9yIGl0cyBmaXJzdCB0aHJlZSBhcmd1bWVudHMuCisKKy0gY1N0cmluZ0lPIG5vdyBzdXBwb3J0cyB0aGUgZi5jbG9zZWQgYXR0cmlidXRlLgorCistIFRoZSBzaWduYWwgbW9kdWxlIG5vdyBleHBvc2VzIFNJR1JUTUlOIGFuZCBTSUdSVE1BWCAoaWYgYXZhaWxhYmxlKS4KKworLSBjdXJzZXMgbW9kdWxlIG5vdyBzdXBwb3J0cyB1c2VfZGVmYXVsdF9jb2xvcnMoKS4gIFtwYXRjaCAjNzM5MTI0XQorCistIEJ1ZyAjODExMDI4OiBuY3Vyc2VzLmggYnJlYWthZ2Ugb24gRnJlZUJTRC9NYWNPUyBYCisKKy0gQnVnICM4MTQ2MTM6IElORVRfQUREUlNUUkxFTiBmaXggbmVlZGVkIGZvciBhbGwgY29tcGlsZXJzIG9uIFNHSQorCistIEltcGxlbWVudGVkIG5vbi1yZWN1cnNpdmUgU1JFIG1hdGNoaW5nIHNjaGVtZSAoIzc1NzYyNCkuCisKKy0gSW1wbGVtZW50ZWQgKD8oaWQvbmFtZSl5ZXN8bm8pIHN1cHBvcnQgaW4gU1JFICgjNTcyOTM2KS4KKworLSByYW5kb20uc2VlZCgpIHdpdGggbm8gYXJndW1lbnRzIG9yIE5vbmUgdXNlcyB0aW1lLnRpbWUoKSBhcyBhIGRlZmF1bHQKKyAgc2VlZC4gIE1vZGlmaWVkIHRvIG1hdGNoIFB5Mi4yIGJlaGF2aW9yIGFuZCB1c2UgZnJhY3Rpb25hbCBzZWNvbmRzIHNvCisgIHRoYXQgc3VjY2Vzc2l2ZSBydW5zIGFyZSBtb3JlIGxpa2VseSB0byBwcm9kdWNlIGRpZmZlcmVudCBzZXF1ZW5jZXMuCisKKy0gcmFuZG9tLlJhbmRvbSBoYXMgYSBuZXcgbWV0aG9kLCBnZXRyYW5kYml0cyhrKSwgd2hpY2ggcmV0dXJucyBhbiBpbnQKKyAgd2l0aCBrIHJhbmRvbSBiaXRzLiAgVGhpcyBtZXRob2QgaXMgbm93IGFuIG9wdGlvbmFsIHBhcnQgb2YgdGhlIEFQSQorICBmb3IgdXNlciBkZWZpbmVkIGdlbmVyYXRvcnMuICBBbnkgZ2VuZXJhdG9yIHRoYXQgZGVmaW5lcyBnZW5yYW5kYml0cygpCisgIGNhbiBub3cgdXNlIHJhbmRyYW5nZSgpIGZvciByYW5nZXMgd2l0aCBhIGxlbmd0aCA+PSAyKio1My4gIEZvcm1lcmx5LAorICByYW5kcmFuZ2Ugd291bGQgcmV0dXJuIG9ubHkgZXZlbiBudW1iZXJzIGZvciByYW5nZXMgdGhhdCBsYXJnZSAoc2VlCisgIFNGIGJ1ZyAjODEyMjAyKS4gIEdlbmVyYXRvcnMgdGhhdCBkbyBub3QgZGVmaW5lIGdlbnJhbmRiaXRzKCkgbm93CisgIGlzc3VlIGEgd2FybmluZyB3aGVuIHJhbmRyYW5nZSgpIGlzIGNhbGxlZCB3aXRoIGEgcmFuZ2UgdGhhdCBsYXJnZS4KKworLSBpdGVydG9vbHMgaGFzIGEgbmV3IGZ1bmN0aW9uLCBncm91cGJ5KCkgZm9yIGFnZ3JlZ2F0aW5nIGl0ZXJhYmxlcworICBpbnRvIGdyb3VwcyBzaGFyaW5nIHRoZSBzYW1lIGtleSAoYXMgZGV0ZXJtaW5lZCBieSBhIGtleSBmdW5jdGlvbikuCisgIEl0IG9mZmVycyBzb21lIG9mIGZ1bmN0aW9uYWxpdHkgb2YgU1FMJ3MgZ3JvdXBieSBrZXl3b3JkIGFuZCBvZgorICB0aGUgVW5peCB1bmlxIGZpbHRlci4KKworLSBpdGVydG9vbHMgbm93IGhhcyBhIG5ldyB0ZWUoKSBmdW5jdGlvbiB3aGljaCBwcm9kdWNlcyB0d28gaW5kZXBlbmRlbnQKKyAgaXRlcmF0b3JzIGZyb20gYSBzaW5nbGUgaXRlcmFibGUuCisKKy0gaXRlcnRvb2xzLml6aXAoKSB3aXRoIG5vIGFyZ3VtZW50cyBub3cgcmV0dXJucyBhbiBlbXB0eSBpdGVyYXRvciBpbnN0ZWFkCisgIG9mIHJhaXNpbmcgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgorCistIEZpeGVkICM4NTMwNjE6IGFsbG93IEJaMkNvbXByZXNzb3IuY29tcHJlc3MoKSB0byByZWNlaXZlIGFuIGVtcHR5IHN0cmluZworICBhcyBwYXJhbWV0ZXIuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBBZGRlZCBhIG5ldyBtb2R1bGU6IGNQcm9maWxlLCBhIEMgcHJvZmlsZXIgd2l0aCB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdGhlCisgIHByb2ZpbGUgbW9kdWxlLiAgY1Byb2ZpbGUgYXZvaWRzIHNvbWUgb2YgdGhlIGRyYXdiYWNrcyBvZiB0aGUgaG90c2hvdAorICBwcm9maWxlciBhbmQgcHJvdmlkZXMgYSBiaXQgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZSBvdGhlciB0d28gcHJvZmlsZXJzLgorICBCYXNlZCBvbiAibHNwcm9mIiAocGF0Y2ggIzEyMTI4MzcpLgorCistIEJ1ZyAjMTI2NjI4MzogVGhlIG5ldyBmdW5jdGlvbiAibGV4aXN0cyIgaXMgbm93IGluIG9zLnBhdGguX19hbGxfXy4KKworLSBCdWcgIzk4MTUzMDogRml4IFVuYm91bmRMb2NhbEVycm9yIGluIHNodXRpbC5ybXRyZWUoKS4gIFRoaXMgYWZmZWN0cworICB0aGUgZG9jdW1lbnRlZCBiZWhhdmlvcjogdGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgb25lcnJvcigpCisgIGhhbmRsZXIgY2FuIG5vdyBhbHNvIGJlIG9zLmxpc3RkaXIuCisKKy0gQnVnICM3NTQ0NDk6IHRocmVhZGluZy5UaHJlYWQgb2JqZWN0cyBubyBsb25nZXIgbWFzayBleGNlcHRpb25zIHJhaXNlZCBkdXJpbmcKKyAgaW50ZXJwcmV0ZXIgc2h1dGRvd24gd2l0aCBhbm90aGVyIGV4Y2VwdGlvbiBmcm9tIGF0dGVtcHRpbmcgdG8gaGFuZGxlIHRoZQorICBvcmlnaW5hbCBleGNlcHRpb24uCisKKy0gQWRkZWQgZGVjaW1hbC5weSBwZXIgUEVQIDMyNy4KKworLSBCdWcgIzk4MTI5OTogcnN5bmMgaXMgbm93IGEgcmVjb2duaXplZCBwcm90b2NvbCBpbiB1cmxwYXJzZSB0aGF0IHVzZXMgYQorICAibmV0bG9jIiBwb3J0aW9uIG9mIGEgVVJMLgorCistIEJ1ZyAjOTE5MDEyOiBzaHV0aWwubW92ZSgpIHdpbGwgbm90IHRyeSB0byBtb3ZlIGEgZGlyZWN0b3J5IGludG8gaXRzZWxmLgorICBUaGFua3MgSm9oYW5uZXMgR2lqc2JlcnMuCisKKy0gQnVnICM5MzQyODI6IHB5ZG9jLnN0cmlwaWQoKSBpcyBub3cgY2FzZS1pbnNlbnNpdGl2ZS4gIFRoYW5rcyBSb2JpbiBCZWNrZXIuCisKKy0gQnVnICM4MjMyMDk6ICBjbWF0aC5sb2coKSBub3cgdGFrZXMgYW4gb3B0aW9uYWwgYmFzZSBhcmd1bWVudCBzbyB0aGF0IGl0cworICBBUEkgbWF0Y2hlcyBtYXRoLmxvZygpLgorCistIEJ1ZyAjOTU3MzgxOiBkaXN0dXRpbHMgYmRpc3RfcnBtIG5vIGxvbmdlciBmYWlscyBvbiByZWNlbnQgUlBNIHZlcnNpb25zCisgIHRoYXQgZ2VuZXJhdGUgYSAtZGVidWdpbmZvLnJwbQorCistIG9zLnBhdGguZGV2bnVsbCBoYXMgYmVlbiBhZGRlZCBmb3IgYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisKKy0gRml4ZWQgIzg3NzE2NTogZGlzdHV0aWxzIG5vdyBwaWNrcyB0aGUgcmlnaHQgQysrIGNvbXBpbGVyIGNvbW1hbmQKKyAgb24gY3lnd2luIGFuZCBtaW5ndzMyLgorCistIHVybGxpYi51cmxvcGVuKCkucmVhZGxpbmUoKSBub3cgaGFuZGxlcyBIVFRQLzAuOSBjb3JyZWN0bHkuCisKKy0gcmVmYWN0b3JlZCBzaXRlLnB5IGludG8gZnVuY3Rpb25zLiAgQWxzbyB3cm90ZSByZWdyZXNzaW9uIHRlc3RzIGZvciB0aGUKKyAgbW9kdWxlLgorCistIFRoZSBkaXN0dXRpbHMgaW5zdGFsbCBjb21tYW5kIG5vdyBzdXBwb3J0cyB0aGUgLS1ob21lIG9wdGlvbiBhbmQKKyAgaW5zdGFsbGF0aW9uIHNjaGVtZSBmb3IgYWxsIHBsYXRmb3Jtcy4KKworLSBhc3luY29yZS5sb29wIG5vdyBoYXMgYSByZXBlYXQgY291bnQgcGFyYW1ldGVyIHRoYXQgZGVmYXVsdHMgdG8KKyAgbG9vcGluZyBmb3JldmVyLgorCistIFRoZSBkaXN0dXRpbHMgc2Rpc3QgY29tbWFuZCBub3cgaWdub3JlcyBhbGwgLnN2biBkaXJlY3RvcmllcywgaW4KKyAgYWRkaXRpb24gdG8gQ1ZTIGFuZCBSQ1MgZGlyZWN0b3JpZXMuICAuc3ZuIGRpcmVjdG9yaWVzIGhvbGQKKyAgYWRtaW5pc3RyYXRpdmUgZmlsZXMgZm9yIHRoZSBTdWJ2ZXJzaW9uIHNvdXJjZSBjb250cm9sIHN5c3RlbS4KKworLSBBZGRlZCBhIG5ldyBtb2R1bGU6IGNvb2tpZWxpYi4gIEF1dG9tYXRpYyBjb29raWUgaGFuZGxpbmcgZm9yIEhUVFAKKyAgY2xpZW50cy4gIEFsc28sIHN1cHBvcnQgZm9yIGNvb2tpZWxpYiBoYXMgYmVlbiBhZGRlZCB0byB1cmxsaWIyLCBzbworICB1cmxsaWIyLnVybG9wZW4oKSBjYW4gdHJhbnNwYXJlbnRseSBoYW5kbGUgY29va2llcy4KKworLSBzdHJpbmdwcmVwLnB5IG5vdyB1c2VzIGJ1aWx0LWluIHNldCgpIGluc3RlYWQgb2Ygc2V0cy5TZXQoKS4KKworLSBCdWcgIzg3NjI3ODogVW5ib3VuZGVkIHJlY3Vyc2lvbiBpbiBtb2R1bGVmaW5kZXIKKworLSBCdWcgIzc4MDMwMDogU3dhcCBwdWJsaWMgYW5kIHN5c3RlbSBJRCBpbiBMZXhpY2FsSGFuZGxlci5zdGFydERURC4KKyAgQXBwbGljYXRpb25zIHJlbHlpbmcgb24gdGhlIHdyb25nIG9yZGVyIG5lZWQgdG8gYmUgY29ycmVjdGVkLgorCistIEJ1ZyAjOTI2MDc1OiBGaXhlZCBhIGJ1ZyB0aGF0IHJldHVybnMgYSB3cm9uZyBwYXR0ZXJuIG9iamVjdAorICBmb3IgYSBzdHJpbmcgb3IgdW5pY29kZSBvYmplY3QgaW4gc3JlLmNvbXBpbGUoKSB3aGVuIGEgZGlmZmVyZW50CisgIHR5cGUgcGF0dGVybiB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0cy4KKworLSBBZGRlZCBjb3VudGNhbGxlcnMgYXJnIHRvIHRyYWNlLlRyYWNlIGNsYXNzICgtLXRyYWNrY2FsbHMgY29tbWFuZCBsaW5lIGFyZworICB3aGVuIHJ1biBmcm9tIHRoZSBjb21tYW5kIHByb21wdCkuCisKKy0gRml4ZWQgYSBjYWNoaW5nIGJ1ZyBpbiBwbGF0Zm9ybS5wbGF0Zm9ybSgpIHdoZXJlIHRoZSBhcmd1bWVudCBvZiAndGVyc2UnIHdhcworICBub3QgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIHdoZW4gY2FjaGluZyB2YWx1ZS4KKworLSBBZGRlZCB0d28gbmV3IGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIHByb2ZpbGUgKG91dHB1dCBmaWxlIGFuZAorICBkZWZhdWx0IHNvcnQpLgorCistIEFkZGVkIGdsb2JhbCBydW5jdHggZnVuY3Rpb24gdG8gcHJvZmlsZSBtb2R1bGUKKworLSBBZGQgaGxpc3QgbWlzc2luZyBlbnRyeWNvbmZpZ3VyZSBhbmQgZW50cnljZ2V0IG1ldGhvZHMuCisKKy0gVGhlIHB0Y3AxNTQgY29kZWMgd2FzIGFkZGVkIGZvciBLYXpha2ggY2hhcmFjdGVyIHNldCBzdXBwb3J0LgorCistIFN1cHBvcnQgbm9uLWFub255bW91cyBmdHAgVVJMcyBpbiB1cmxsaWIyLgorCistIFRoZSBlbmNvZGluZ3MgcGFja2FnZSB3aWxsIG5vdyBhcHBseSBjb2RlYyBuYW1lIGFsaWFzZXMKKyAgZmlyc3QgYmVmb3JlIHN0YXJ0aW5nIHRvIHRyeSB0aGUgaW1wb3J0IG9mIHRoZSBjb2RlYyBtb2R1bGUuCisgIFRoaXMgc2ltcGxpZmllcyBvdmVycmlkaW5nIGJ1aWx0LWluIGNvZGVjcyB3aXRoIGV4dGVybmFsCisgIHBhY2thZ2VzLCBlLmcuIHRoZSBpbmNsdWRlZCBDSksgY29kZWNzIHdpdGggdGhlIEphcGFuZXNlQ29kZWNzCisgIHBhY2thZ2UsIGJ5IGFkanVzdGluZyB0aGUgYWxpYXNlcyBkaWN0aW9uYXJ5IGluIGVuY29kaW5ncy5hbGlhc2VzCisgIGFjY29yZGluZ2x5LgorCistIGJhc2U2NCBub3cgc3VwcG9ydHMgUkZDIDM1NDggQmFzZTE2LCBCYXNlMzIsIGFuZCBCYXNlNjQgZW5jb2RpbmcgYW5kCisgIGRlY29kaW5nIHN0YW5kYXJkcy4KKworLSB1cmxsaWIyIG5vdyBzdXBwb3J0cyBwcm9jZXNzb3JzLiAgQSBwcm9jZXNzb3IgaXMgYSBoYW5kbGVyIHRoYXQKKyAgaW1wbGVtZW50cyBhbiB4eHhfcmVxdWVzdCBvciB4eHhfcmVzcG9uc2UgbWV0aG9kLiAgVGhlc2UgbWV0aG9kcyBhcmUKKyAgY2FsbGVkIGZvciBhbGwgcmVxdWVzdHMuCisKKy0gZGlzdHV0aWxzIGNvbXBpbGVycyBub3cgY29tcGlsZSBzb3VyY2UgZmlsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMKKyAgdGhleSBhcmUgcGFzc2VkIHRvIHRoZSBjb21waWxlci4KKworLSBwcHJpbnQucHByaW50KCkgYW5kIHBwcmludC5wZm9ybWF0KCkgbm93IGhhdmUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzCisgIGluZGVudCwgd2lkdGggYW5kIGRlcHRoLgorCistIFBhdGNoICM3NTA1NDI6IHBwcmludCBub3cgd2lsbCBwcmV0dHkgcHJpbnQgc3ViY2xhc3NlcyBvZiBsaXN0LCB0dXBsZQorICBhbmQgZGljdCB0b28sIGFzIGxvbmcgYXMgdGhleSBkb24ndCBvdmVyd3JpdGUgX19yZXByX18oKS4KKworLSBCdWcgIzg0ODYxNDogZGlzdHV0aWxzJyBtc3ZjY29tcGlsZXIgZmFpbHMgdG8gZmluZCB0aGUgTVNWQzYKKyAgY29tcGlsZXIgYmVjYXVzZSBvZiBpbmNvbXBsZXRlIHJlZ2lzdHJ5IGVudHJpZXMuCisKKy0gaHR0cGxpYi5IVFRQLnB1dHJlcXVlc3Qgbm93IG9mZmVycyB0byBvbWl0IHRoZSBpbXBsaWNpdCBBY2NlcHQtRW5jb2RpbmcuCisKKy0gUGF0Y2ggIzg0MTk3NzogbW9kdWxlZmluZGVyIGRpZG4ndCBmaW5kIGV4dGVuc2lvbiBtb2R1bGVzIGluIHBhY2thZ2VzCisKKy0gaW1hcGxpYi5JTUFQNC50aHJlYWQgd2FzIGFkZGVkLgorCistIFBsdWdnZWQgYSBtaW5vciBob2xlIGluIHRlbXBmaWxlLm1rdGVtcCgpIGR1ZSB0byB0aGUgdXNlIG9mCisgIG9zLnBhdGguZXhpc3RzKCksIHN3aXRjaGVkIHRvIHVzaW5nIG9zLmxzdGF0KCkgZGlyZWN0bHkgaWYgcG9zc2libGUuCisKKy0gYmlzZWN0LnB5IGFuZCBoZWFwcS5weSBub3cgaGF2ZSB1bmRlcmx5aW5nIEMgaW1wbGVtZW50YXRpb25zCisgIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuCisKKy0gaGVhcHEucHkgaGFzIHR3byBuZXcgZnVuY3Rpb25zLCBuc21hbGxlc3QoKSBhbmQgbmxhcmdlc3QoKS4KKworLSB0cmFjZWJhY2suZm9ybWF0X2V4YyBoYXMgYmVlbiBhZGRlZCAoc2ltaWxhciB0byBwcmludF9leGMgYnV0IGl0IHJldHVybnMKKyAgYSBzdHJpbmcpLgorCistIHhtbHJwY2xpYi5NdWx0aUNhbGwgaGFzIGJlZW4gYWRkZWQuCisKKy0gcG9wbGliLlBPUDNfU1NMIGhhcyBiZWVuIGFkZGVkLgorCistIHRtcGZpbGUubWtzdGVtcCBub3cgcmV0dXJucyBhbiBhYnNvbHV0ZSBwYXRoIGV2ZW4gaWYgZGlyIGlzIHJlbGF0aXZlLgorCistIHVybHBhcnNlIGlzIFJGQyAyMzk2IGNvbXBsaWFudC4KKworLSBUaGUgZmllbGRuYW1lcyBhcmd1bWVudCB0byB0aGUgY3N2IG1vZHVsZSdzIERpY3RSZWFkZXIgY29uc3RydWN0b3IgaXMgbm93CisgIG9wdGlvbmFsLiAgSWYgb21pdHRlZCwgdGhlIGZpcnN0IHJvdyBvZiB0aGUgZmlsZSB3aWxsIGJlIHVzZWQgYXMgdGhlCisgIGxpc3Qgb2YgZmllbGRuYW1lcy4KKworLSBlbmNvZGluZ3MuYnoyX2NvZGVjIHdhcyBhZGRlZCBmb3IgYWNjZXNzIHRvIGJ6MiBjb21wcmVzc2lvbgorICB1c2luZyAiYSBsb25nIHN0cmluZyIuZW5jb2RlKCdiejInKQorCistIFZhcmlvdXMgaW1wcm92ZW1lbnRzIHRvIHVuaXR0ZXN0LnB5LCByZWFsaWduZWQgd2l0aCBQeVVuaXQgQ1ZTLgorCistIGRpcmNhY2hlIG5vdyBwYXNzZXMgZXhjZXB0aW9ucyB0byB0aGUgY2FsbGVyLCBpbnN0ZWFkIG9mIHJldHVybmluZworICBlbXB0eSBsaXN0cy4KKworLSBUaGUgYnNkZGIgbW9kdWxlIGFuZCBkYmhhc2ggbW9kdWxlIG5vdyBzdXBwb3J0IHRoZSBpdGVyYXRvciBhbmQKKyAgbWFwcGluZyBwcm90b2NvbHMgd2hpY2ggbWFrZSB0aGVtIG1vcmUgc3Vic3RpdHV0YWJsZSBmb3IgZGljdGlvbmFyaWVzCisgIGFuZCBzaGVsdmVzLgorCistIFRoZSBjc3YgbW9kdWxlJ3MgRGljdFJlYWRlciBhbmQgRGljdFdyaXRlciBjbGFzc2VzIG5vdyBhY2NlcHQga2V5d29yZAorICBhcmd1bWVudHMuICBUaGlzIHdhcyBhbiBvbWlzc2lvbiBpbiB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KKworLSBUaGUgZW1haWwgcGFja2FnZSBoYW5kbGVzIHNvbWUgUkZDIDIyMzEgcGFyYW1ldGVycyB3aXRoIG1pc3NpbmcKKyAgQ0hBUlNFVCBmaWVsZHMgYmV0dGVyLiAgSXQgYWxzbyBpbmNsdWRlcyBhIHBhdGNoIHRvIHBhcmFtZXRlcgorICBwYXJzaW5nIHdoZW4gc2VtaWNvbG9ucyBhcHBlYXIgaW5zaWRlIHF1b3Rlcy4KKworLSBzZXRzLnB5IG5vdyBydW5zIHVuZGVyIFB5Mi4yLiAgSW4gYWRkaXRpb24sIHRoZSBhcmd1bWVudCByZXN0cmljdGlvbnMKKyAgZm9yIG1vc3Qgc2V0IG1ldGhvZHMgKGJ1dCBub3QgdGhlIG9wZXJhdG9ycykgaGF2ZSBiZWVuIHJlbGF4ZWQgdG8KKyAgYWxsb3cgYW55IGl0ZXJhYmxlLgorCistIF9zdHJwdGltZS5weSBub3cgaGFzIGEgYmVoaW5kLXRoZS1zY2VuZXMgY2FjaGluZyBtZWNoYW5pc20gZm9yIHRoZSBtb3N0CisgIHJlY2VudCBUaW1lUkUgaW5zdGFuY2UgdXNlZCBhbG9uZyB3aXRoIHRoZSBsYXN0IGZpdmUgdW5pcXVlIGRpcmVjdGl2ZQorICBwYXR0ZXJucy4gIFRoZSBvdmVyYWxsIG1vZHVsZSB3YXMgYWxzbyBtYWRlIG1vcmUgdGhyZWFkLXNhZmUuCisKKy0gcmFuZG9tLmN1bmlmdmFyaWF0ZSgpIGFuZCByYW5kb20uc3RkZ2FtbWEoKSB3ZXJlIGRlcHJlY2F0ZWQgaW4gUHkyLjMKKyAgYW5kIHJlbW92ZWQgaW4gUHkyLjQuCisKKy0gQnVnICM4MjMzMjg6IHVybGxpYjIucHkncyBIVFRQIERpZ2VzdCBBdXRoIHN1cHBvcnQgd29ya3MgYWdhaW4uCisKKy0gUGF0Y2ggIzg3MzU5NzogQ0pLIGNvZGVjcyBhcmUgaW1wb3J0ZWQgaW50byByYW5rIG9mIGRlZmF1bHQgY29kZWNzLgorCitUb29scy9EZW1vcworLS0tLS0tLS0tLS0KKworLSBBIGhvdHNob3RtYWluIHNjcmlwdCB3YXMgYWRkZWQgdG8gdGhlIFRvb2xzL3NjcmlwdHMgZGlyZWN0b3J5IHRoYXQKKyAgbWFrZXMgaXQgZWFzeSB0byBydW4gYSBzY3JpcHQgdW5kZXIgY29udHJvbCBvZiB0aGUgaG90c2hvdCBwcm9maWxlci4KKworLSBUaGUgZGIycGlja2xlIGFuZCBwaWNrbGUyZGIgc2NyaXB0cyBjYW4gbm93IGR1bXAvbG9hZCBnZGJtIGZpbGVzLgorCistIFRoZSBmaWxlIG9yZGVyIG9uIHRoZSBjb21tYW5kIGxpbmUgb2YgdGhlIHBpY2tsZTJkYiBzY3JpcHQgd2FzIHJldmVyc2VkLgorICBJdCBpcyBub3cgWyBwaWNrbGVmaWxlIF0gZGJmaWxlLiAgVGhpcyBwcm92aWRlcyBiZXR0ZXIgc3ltbWV0cnkgd2l0aAorICBkYjJwaWNrbGUuICBUaGUgZmlsZSBhcmd1bWVudHMgdG8gYm90aCBzY3JpcHRzIGFyZSBub3cgc291cmNlIGZvbGxvd2VkIGJ5CisgIGRlc3RpbmF0aW9uIGluIHNpdHVhdGlvbnMgd2hlcmUgYm90aCBmaWxlcyBhcmUgZ2l2ZW4uCisKKy0gVGhlIHB5ZG9jIHNjcmlwdCB3aWxsIGRpc3BsYXkgYSBsaW5rIHRvIHRoZSBtb2R1bGUgZG9jdW1lbnRhdGlvbiBmb3IKKyAgbW9kdWxlcyBkZXRlcm1pbmVkIHRvIGJlIHBhcnQgb2YgdGhlIGNvcmUgZGlzdHJpYnV0aW9uLiAgVGhlIGRvY3VtZW50YXRpb24KKyAgYmFzZSBkaXJlY3RvcnkgZGVmYXVsdHMgdG8gaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9jdXJyZW50L2xpYi8gYnV0IGNhbgorICBiZSBjaGFuZ2VkIGJ5IHNldHRpbmcgdGhlIFBZVEhPTkRPQ1MgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKy0gdGV4Y2hlY2sucHkgbm93IGRldGVjdHMgZG91YmxlIHdvcmQgZXJyb3JzLgorCistIG1kNXN1bS5weSBtaXN0YWtlbmx5IG9wZW5lZCBpbnB1dCBmaWxlcyBpbiB0ZXh0IG1vZGUgYnkgZGVmYXVsdCwgYQorICBzaWxlbnQgYW5kIGRhbmdlcm91cyBjaGFuZ2UgZnJvbSBwcmV2aW91cyByZWxlYXNlcy4gIEl0IG9uY2UgYWdhaW4KKyAgb3BlbnMgaW5wdXQgZmlsZXMgaW4gYmluYXJ5IG1vZGUgYnkgZGVmYXVsdC4gIFRoZSAtdCBhbmQgLWIgZmxhZ3MKKyAgcmVtYWluIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIDIuMyByZWxlYXNlLCBidXQgLWIgaXMgdGhlIGRlZmF1bHQKKyAgbm93LgorCistIHB5LWVsZWN0cmljLWNvbG9uIG5vdyB3b3JrcyB3aGVuIHBlbmRpbmctZGVsZXRlL2RlbGV0ZS1zZWxlY3Rpb24gbW9kZSBpcworICBpbiBlZmZlY3QKKworLSBweS1oZWxwLWF0LXBvaW50IGlzIG5vIGxvbmdlciBib3VuZCB0byB0aGUgRjEga2V5IC0gaXQncyBzdGlsbCBib3VuZCB0bworICBDLWMgQy1oCisKKy0gUHluY2hlIHdhcyBmaXhlZCB0byBub3QgY3Jhc2ggd2hlbiB0aGVyZSBpcyBubyB+Ly5weW5jaGUgZmlsZSBhbmQgbm8KKyAgLWQgb3B0aW9uIHdhcyBnaXZlbi4KKworQnVpbGQKKy0tLS0tCisKKy0gQnVnICM5Nzg2NDU6IE1vZHVsZXMvZ2V0cGF0aC5jIG5vdyBidWlsZHMgcHJvcGVybHkgaW4gLS1kaXNhYmxlLWZyYW1ld29yaworICBidWlsZCB1bmRlciBPUyBYLgorCistIFByb2ZpbGluZyB1c2luZyBncHJvZiBpcyBub3cgYXZhaWxhYmxlIGlmIFB5dGhvbiBpcyBjb25maWd1cmVkIHdpdGgKKyAgLS1lbmFibGUtcHJvZmlsaW5nLgorCistIFByb2ZpbGluZyB0aGUgVk0gdXNpbmcgdGhlIFBlbnRpdW0gVFNDIGlzIG5vdyBwb3NzaWJsZSBpZiBQeXRob24KKyAgaXMgY29uZmlndXJlZCAtLXdpdGgtdHNjLgorCistIEluIG9yZGVyIHRvIGZpbmQgbGlicmFyaWVzLCBzZXR1cC5weSBub3cgYWxzbyBsb29rcyBpbiAvbGliNjQsIGZvciB1c2UKKyAgb24gQU1ENjQuCisKKy0gQnVnICM5MzQ2MzU6IEZpeGVkIGEgYnVnIHdoZXJlIHRoZSBjb25maWd1cmUgc2NyaXB0IGNvdWxkbid0IGRldGVjdAorICBnZXRhZGRyaW5mbygpIHByb3Blcmx5IGlmIHRoZSBLQU1FIHN0YWNrIGhhZCBTQ1RQIHN1cHBvcnQuCisKKy0gU3VwcG9ydCBmb3IgbWlzc2luZyBBTlNJIEMgaGVhZGVyIGZpbGVzIChsaW1pdHMuaCwgc3RkZGVmLmgsIGV0Yykgd2FzCisgIHJlbW92ZWQuCisKKy0gU3lzdGVtcyByZXF1aXJpbmcgdGhlIEQ0LCBENiBvciBENyB2YXJpYW50cyBvZiBwdGhyZWFkcyBhcmUgbm8gbG9uZ2VyCisgIHN1cHBvcnRlZCAoc2VlIFBFUCAxMSkuCisKKy0gVW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydCBjYW4gbm8gbG9uZ2VyIGJlIGRpc2FibGVkIChzZWUgUEVQIDExKS4KKworLSBTdXBwb3J0IGZvciBER1VYLCBTdW5PUyA0LCBJUklYIDQgYW5kIE1pbml4IHdhcyByZW1vdmVkIChzZWUgUEVQIDExKS4KKworLSBTdXBwb3J0IGZvciBzeXN0ZW1zIHJlcXVpcmluZyAtLXdpdGgtZGwtZGxkIG9yIC0td2l0aC1zZ2ktZGwgd2FzIHJlbW92ZWQKKyAgKHNlZSBQRVAgMTEpLgorCistIFRlc3RzIGZvciBzaXplb2YoY2hhcikgd2VyZSByZW1vdmVkIHNpbmNlIEFOU0kgQyBtYW5kYXRlcyB0aGF0CisgIHNpemVvZihjaGFyKSBtdXN0IGJlIDEuCisKK0MgQVBJCistLS0tLQorCistIFRoYW5rcyB0byBBbnRob255IFR1aW5pbmdhLCB0aGUgZGF0ZXRpbWUgbW9kdWxlIG5vdyBzdXBwbGllcyBhIEMgQVBJCisgIGNvbnRhaW5pbmcgdHlwZS1jaGVjayBtYWNyb3MgYW5kIGNvbnN0cnVjdG9ycy4gIFNlZSBuZXcgZG9jcyBpbiB0aGUKKyAgUHl0aG9uL0MgQVBJIFJlZmVyZW5jZSBNYW51YWwgZm9yIGRldGFpbHMuCisKKy0gUHJpdmF0ZSBmdW5jdGlvbiBfUHlUaW1lX0RvdWJsZVRvVGltZXQgYWRkZWQsIHRvIGNvbnZlcnQgYSBQeXRob24KKyAgdGltZXN0YW1wIChDIGRvdWJsZSkgdG8gcGxhdGZvcm0gdGltZV90IHdpdGggc29tZSBvdXQtb2YtYm91bmRzCisgIGNoZWNraW5nLiAgRGVjbGFyZWQgaW4gbmV3IGhlYWRlciBmaWxlIHRpbWVmdW5jcy5oLiAgSXQgd291bGQgYmUKKyAgZ29vZCB0byBleHBvc2Ugc29tZSBvdGhlciBpbnRlcm5hbCB0aW1lbW9kdWxlLmMgZnVuY3Rpb25zIHRoZXJlLgorCistIE5ldyBwdWJsaWMgZnVuY3Rpb25zIFB5RXZhbF9FdmFsdWF0ZUZyYW1lIGFuZCBQeUdlbl9OZXcgdG8gZXhwb3NlCisgIGdlbmVyYXRvciBvYmplY3RzLgorCistIE5ldyBwdWJsaWMgZnVuY3Rpb25zIFB5X0luY1JlZigpIGFuZCBQeV9EZWNSZWYoKSwgZXhwb3NpbmcgdGhlCisgIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIFB5X1hJTkNSRUYoKSBhbmQgUHlfWERFQ1JFRiBtYWNyb3MuIFVzZWZ1bCBmb3IKKyAgcnVudGltZSBkeW5hbWljIGVtYmVkZGluZyBvZiBQeXRob24uICBTZWUgcGF0Y2ggIzkzODMwMiwgYnkgQm9iCisgIElwcG9saXRvLgorCistIEFkZGVkIGEgbmV3IG1hY3JvLCBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMsIHdoaWNoIHJldHJpZXZlcyBhIGZhc3Qgc2VxdWVuY2UncworICB1bmRlcmx5aW5nIGFycmF5IG9mIFB5T2JqZWN0IHBvaW50ZXJzLiAgVXNlZnVsIGZvciBoaWdoIHNwZWVkIGxvb3BpbmcuCisKKy0gQ3JlYXRlZCBhIG5ldyBtZXRob2QgZmxhZywgTUVUSF9DT0VYSVNULCB3aGljaCBjYXVzZXMgYSBtZXRob2QgdG8gYmUgbG9hZGVkCisgIGV2ZW4gaWYgYWxyZWFkeSBkZWZpbmVkIGJ5IGEgc2xvdCB3cmFwcGVyLiAgVGhpcyBhbGxvd3MgYSBfX2NvbnRhaW5zX18KKyAgbWV0aG9kLCBmb3IgZXhhbXBsZSwgdG8gY28tZXhpc3Qgd2l0aCBhIGRlZmluZWQgc3FfY29udGFpbnMgc2xvdC4gIFRoaXMKKyAgaXMgaGVscGZ1bCBiZWNhdXNlIHRoZSBQeUNGdW5jdGlvbiBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2Ygb3B0aW1pemVkIGNhbGxzCisgIHdoZW5ldmVyIE1FVEhfTyBvciBNRVRIX05PQVJHUyBmbGFncyBhcmUgZGVmaW5lZC4KKworLSBBZGRlZCBhIG5ldyBmdW5jdGlvbiwgUHlEaWN0X0NvbnRhaW5zKGQsIGspIHdoaWNoIGlzIGxpa2UKKyAgUHlTZXF1ZW5jZV9Db250YWlucygpIGJ1dCBpcyBzcGVjaWZpYyB0byBkaWN0aW9uYXJpZXMgYW5kIGV4ZWN1dGVzCisgIGFib3V0IDEwJSBmYXN0ZXIuCisKKy0gQWRkZWQgdGhyZWUgbmV3IG1hY3JvczogUHlfUkVUVVJOX05PTkUsIFB5X1JFVFVSTl9UUlVFLCBhbmQgUHlfUkVUVVJOX0ZBTFNFLgorICBFYWNoIHJldHVybiB0aGUgc2luZ2xldG9uIHRoZXkgbWVudGlvbiBhZnRlciBQeV9JTkNSRUYoKWluZyB0aGVtLgorCistIEFkZGVkIGEgbmV3IGZ1bmN0aW9uLCBQeVR1cGxlX1BhY2sobiwgLi4uKSBmb3IgY29uc3RydWN0aW5nIHR1cGxlcyBmcm9tIGEKKyAgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50IGxpc3Qgb2YgUHl0aG9uIG9iamVjdHMgd2l0aG91dCBoYXZpbmcgdG8gaW52b2tlCisgIHRoZSBtb3JlIGNvbXBsZXggbWFjaGluZXJ5IG9mIFB5X0J1aWxkVmFsdWUoKS4gIFB5VHVwbGVfUGFjaygzLCBhLCBiLCBjKQorICBpcyBlcXVpdmFsZW50IHRvIFB5X0J1aWxkVmFsdWUoIihPT08pIiwgYSwgYiwgYykuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBUaGUgX3dpbnJlZyBtb2R1bGUgY291bGQgc2VnZmF1bHQgd2hlbiByZWFkaW5nIHZlcnkgbGFyZ2UgcmVnaXN0cnkKKyAgdmFsdWVzLCBkdWUgdG8gdW5jaGVja2VkIGFsbG9jYSgpIGNhbGxzIChTRiBidWcgODUxMDU2KS4gIFRoZSBmaXggaXMKKyAgdXNlcyBlaXRoZXIgUHlNZW1fTWFsbG9jKG4pIG9yIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pLAorICBhcyBhcHByb3ByaWF0ZSwgZm9sbG93ZWQgYnkgYSBzaXplIGNoZWNrLgorCistIGZpbGUudHJ1bmNhdGUoKSBjb3VsZCBtaXNiZWhhdmUgaWYgdGhlIGZpbGUgd2FzIG9wZW4gZm9yIHVwZGF0ZQorICAobW9kZXMgcissIHJiKywgdyssIHdiKyksIGFuZCB0aGUgbW9zdCByZWNlbnQgZmlsZSBvcGVyYXRpb24gYmVmb3JlCisgIHRoZSB0cnVuY2F0ZSgpIGNhbGwgd2FzIGFuIGlucHV0IG9wZXJhdGlvbi4gIFNGIGJ1ZyA4MDE2MzEuCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4zIGZpbmFsPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyOS1KdWwtMjAwMyoKKworSURMRQorLS0tLQorCistIEJ1ZyA3Nzg0MDA6ICBJRExFIGhhbmdzIHdoZW4gc2VsZWN0aW5nICJFZGl0IHdpdGggSURMRSIgZnJvbSBleHBsb3Jlci4KKyAgVGhpcyB3YXMgdW5pcXVlIHRvIFdpbmRvd3MsIGFuZCB3YXMgZml4ZWQgYnkgYWRkaW5nIGFuIC1uIHN3aXRjaCB0bworICB0aGUgY29tbWFuZCB0aGUgV2luZG93cyBpbnN0YWxsZXIgY3JlYXRlcyB0byBleGVjdXRlICJFZGl0IHdpdGggSURMRSIKKyAgY29udGV4dC1tZW51IGFjdGlvbnMuCisKKy0gSURMRSBkaXNwbGF5cyBhIG5ldyBtZXNzYWdlIHVwb24gc3RhcnR1cDogIHNvbWUgInBlcnNvbmFsIGZpcmV3YWxsIgorICBraW5kcyBvZiBwcm9ncmFtcyAoZm9yIGV4YW1wbGUsIFpvbmVBbGFybSkgb3BlbiBhIGRpYWxvZyBvZiB0aGVpcgorICBvd24gd2hlbiBhbnkgcHJvZ3JhbSBvcGVucyBhIHNvY2tldC4gIElETEUgZG9lcyB1c2Ugc29ja2V0cywgdGFsa2luZworICBvbiB0aGUgY29tcHV0ZXIncyBpbnRlcm5hbCBsb29wYmFjayBpbnRlcmZhY2UuICBUaGlzIGNvbm5lY3Rpb24gaXMgbm90CisgIHZpc2libGUgb24gYW55IGV4dGVybmFsIGludGVyZmFjZSBhbmQgbm8gZGF0YSBpcyBzZW50IHRvIG9yIHJlY2VpdmVkCisgIGZyb20gdGhlIEludGVybmV0LiAgU28sIGlmIHlvdSBnZXQgc3VjaCBhIGRpYWxvZyB3aGVuIG9wZW5pbmcgSURMRSwKKyAgYXNraW5nIHdoZXRoZXIgdG8gbGV0IHB5dGhvbncuZXhlIHRhbGsgdG8gYWRkcmVzcyAxMjcuMC4wLjEsIHNheSB5ZXMsCisgIGFuZCByZXN0IGFzc3VyZWQgbm8gY29tbXVuaWNhdGlvbiBleHRlcm5hbCB0byB5b3VyIG1hY2hpbmUgaXMgdGFraW5nCisgIHBsYWNlLiAgSWYgeW91IGRvbid0IGFsbG93IGl0LCBJRExFIHdvbid0IGJlIGFibGUgdG8gc3RhcnQuCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4zIHJlbGVhc2UgY2FuZGlkYXRlIDI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjQtSnVsLTIwMDMqCisKK0NvcmUgYW5kIGJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIEl0IGlzIG5vdyBwb3NzaWJsZSB0byBpbXBvcnQgZnJvbSB6aXBmaWxlcyBjb250YWluaW5nIGFkZGl0aW9uYWwKKyAgZGF0YSBieXRlcyBiZWZvcmUgdGhlIHppcCBjb21wYXRpYmxlIGFyY2hpdmUuICBaaXBmaWxlcyBjb250YWluaW5nIGEKKyAgY29tbWVudCBhdCB0aGUgZW5kIGFyZSBzdGlsbCB1bnN1cHBvcnRlZC4KKworRXh0ZW5zaW9uIG1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQSBsb25nc3RhbmRpbmcgYnVnIGluIHRoZSBwYXJzZXIgbW9kdWxlJ3MgaW5pdGlhbGl6YXRpb24gY291bGQgY2F1c2UKKyAgZmF0YWwgaW50ZXJuYWwgcmVmY291bnQgY29uZnVzaW9uIHdoZW4gdGhlIG1vZHVsZSBnb3QgaW5pdGlhbGl6ZWQgbW9yZQorICB0aGFuIG9uY2UuICBUaGlzIGhhcyBiZWVuIGZpeGVkLgorCistIEZpeGVkIG1lbW9yeSBsZWFrIGluIHB5ZXhwYXQ7IHVzaW5nIHRoZSBwYXJzZXIncyBQYXJzZUZpbGUoKSBtZXRob2QKKyAgd2l0aCBvcGVuIGZpbGVzIHRoYXQgYXJlbid0IGluc3RhbmNlcyBvZiB0aGUgc3RhbmRhcmQgZmlsZSB0eXBlCisgIGNhdXNlZCBhbiBpbnN0YW5jZSBvZiB0aGUgYm91bmQgLnJlYWQoKSBtZXRob2QgdG8gYmUgbGVha2VkIG9uIGV2ZXJ5CisgIGNhbGwuCisKKy0gRml4ZWQgc29tZSBsZWFrcyBpbiB0aGUgbG9jYWxlIG1vZHVsZS4KKworTGlicmFyeQorLS0tLS0tLQorCistIExpYi9lbmNvZGluZ3Mvcm90XzEzLnB5IHdoZW4gdXNlZCBhcyBhIHNjcmlwdCwgbm93IG1vcmUgcHJvcGVybHkKKyAgdXNlcyB0aGUgZmlyc3QgUHl0aG9uIGludGVycHJldGVyIG9uIHlvdXIgcGF0aC4KKworLSBSZW1vdmVkIGNhY2hpbmcgb2YgVGltZVJFIChhbmQgdGh1cyBMb2NhbGVUaW1lKSBpbiBfc3RycHRpbWUucHkgdG8KKyAgZml4IGEgbG9jYWxlIHJlbGF0ZWQgYnVnIGluIHRoZSB0ZXN0IHN1aXRlLiAgQWx0aG91Z2ggYW5vdGhlciBwYXRjaAorICB3YXMgbmVlZGVkIHRvIGFjdHVhbGx5IGZpeCB0aGUgcHJvYmxlbSwgdGhlIGNhY2hlIGNvZGUgd2FzIG5vdAorICByZXN0b3JlZC4KKworSURMRQorLS0tLQorCistIENhbGx0aXBzIHBhdGNoZXMuCisKK0J1aWxkCistLS0tLQorCistIEZvciBNYWNPU1gsIGFkZGVkIC1tbm8tZnVzZWQtbWFkZCB0byBCQVNFQ0ZMQUdTIHRvIGZpeCB0ZXN0X2NvZXJjaW9uCisgIG9uIFBhbnRoZXIgKE9TWCAxMC4zKS4KKworQyBBUEkKKy0tLS0tCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBUaGUgdGVtcGZpbGUgbW9kdWxlIGNvdWxkIGRvIGluc2FuZSBpbXBvcnRzIG9uIFdpbmRvd3MgaWYgUFlUSE9OQ0FTRU9LCisgIHdhcyBzZXQsIG1ha2luZyB0ZW1wIGZpbGUgY3JlYXRpb24gaW1wb3NzaWJsZS4gIFJlcGFpcmVkLgorCistIEFkZCBhIHBhdGNoIHRvIHdvcmthcm91bmQgcHRocmVhZF9zaWdtYXNrKCkgYnVncyBpbiBDeWd3aW4uCisKK01hYworLS0tCisKKy0gVmFyaW91cyBmaXhlcyB0byBwaW1wLgorCistIFNjcmlwdHMgcnVucyB3aXRoIHB5dGhvbncgbm8gbG9uZ2VyIGhhZCBmdWxsIHdpbmRvdyBtYW5hZ2VyIGFjY2Vzcy4KKworLSBEb24ndCBmb3JjZSBib290LWRpc2stb25seSBpbnN0YWxsLCBmb3IgcmVhc29ucyB1bmtub3duIGl0IGNhdXNlcworICBtb3JlIHByb2JsZW1zIHRoYW4gaXQgc29sdmVzLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMyByZWxlYXNlIGNhbmRpZGF0ZSAxPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE4LUp1bC0yMDAzKgorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBUaGUgbmV3IGZ1bmN0aW9uIHN5cy5nZXRjaGVja2ludGVydmFsKCkgcmV0dXJucyB0aGUgbGFzdCB2YWx1ZSBzZXQKKyAgYnkgc3lzLnNldGNoZWNraW50ZXJ2YWwoKS4KKworLSBTZXZlcmFsIGJ1Z3MgaW4gdGhlIHN5bWJvbCB0YWJsZSBwaGFzZSBvZiB0aGUgY29tcGlsZXIgaGF2ZSBiZWVuCisgIGZpeGVkLiAgRXJyb3JzIGNvdWxkIGJlIGxvc3QgYW5kIGNvbXBpbGF0aW9uIGNvdWxkIGZhaWwgd2l0aG91dAorICByZXBvcnRpbmcgYW4gZXJyb3IuICBTRiBwYXRjaCA3NjMyMDEuCisKKy0gVGhlIGludGVycHJldGVyIGlzIG5vdyBtb3JlIHJvYnVzdCBhYm91dCBpbXBvcnRpbmcgdGhlIHdhcm5pbmdzCisgIG1vZHVsZS4gIEluIGFuIGV4ZWN1dGFibGUgZ2VuZXJhdGVkIGJ5IGZyZWV6ZSBvciBzaW1pbGFyIHByb2dyYW1zLAorICBlYXJsaWVyIHZlcnNpb25zIG9mIDIuMyB3b3VsZCBmYWlsIGlmIHRoZSB3YXJuaW5ncyBtb2R1bGUgY291bGQKKyAgbm90IGJlIGZvdW5kIG9uIHRoZSBmaWxlIHN5c3RlbS4gIEZpeGVzIFNGIGJ1ZyA3NzEwOTcuCisKKy0gQSB3YXJuaW5nIGFib3V0IGFzc2lnbm1lbnRzIHRvIG1vZHVsZSBhdHRyaWJ1dGVzIHRoYXQgc2hhZG93CisgIGJ1aWx0aW5zLCBwcmVzZW50IGluIGVhcmxpZXIgcmVsZWFzZXMgb2YgMi4zLCBoYXMgYmVlbiByZW1vdmVkLgorCistIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgc3ViY2xhc3NlcyBvZiBidWlsdGluIHR5cGVzIGxpa2Ugc3RyCisgIGFuZCB0dXBsZSB0aGF0IGRlZmluZSBhbiBpdGVtc2l6ZS4gIEVhcmxpZXIgcmVsZWFzZXMgb2YgUHl0aG9uIDIuMworICBhbGxvd2VkIHRoaXMgYnkgbWlzdGFrZSwgbGVhZGluZyB0byBjcmFzaGVzIGFuZCBvdGhlciBwcm9ibGVtcy4KKworLSBUaGUgdGhyZWFkX2lkIGlzIG5vdyBpbml0aWFsaXplZCB0byAwIGluIGEgbm9uLXRocmVhZCBidWlsZC4gIFNGIGJ1ZworICA3NzAyNDcuCisKKy0gU0YgYnVnIDc2Mjg5MTogImRlbCBwW2tleV0iIG9uIHByb3h5IG9iamVjdCBubyBsb25nZXIgcmFpc2VzIFN5c3RlbUVycm9yLgorCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSB3ZWFrcmVmLnByb3h5KCkgY2FuIG5vdyBoYW5kbGUgImRlbCBvYmpbaV0iIGZvciBwcm94eSBvYmplY3RzCisgIGRlZmluaW5nIF9fZGVsaXRlbV9fLiAgRm9ybWVybHksIGl0IGdlbmVyYXRlZCBhIFN5c3RlbUVycm9yLgorCistIFNTTCBubyBsb25nZXIgY3Jhc2hlcyB0aGUgaW50ZXJwcmV0ZXIgd2hlbiB0aGUgcmVtb3RlIHNpZGUgZGlzY29ubmVjdHMuCisKKy0gT24gVW5peCB0aGUgbW1hcCBtb2R1bGUgY2FuIGFnYWluIGJlIHVzZWQgdG8gbWFwIGRldmljZSBmaWxlcy4KKworLSB0aW1lLnN0cnB0aW1lIG5vdyBleGNsdXNpdmVseSB1c2VzIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24KKyAgY29udGFpbmVkIHdpdGhpbiB0aGUgX3N0cnB0aW1lIG1vZHVsZS4KKworLSBUaGUgcHJpbnQgc2xvdCBvZiB3ZWFrcmVmIHByb3h5IG9iamVjdHMgd2FzIHJlbW92ZWQsIGJlY2F1c2UgaXQgd2FzCisgIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIG9iamVjdCdzIHJlcHIgc2xvdC4KKworLSBUaGUgbW1hcCBtb2R1bGUgb25seSBjaGVja3MgZmlsZSBzaXplIGZvciByZWd1bGFyIGZpbGVzLCBub3QKKyAgY2hhcmFjdGVyIG9yIGJsb2NrIGRldmljZXMuICBTRiBwYXRjaCA3MDgzNzQuCisKKy0gVGhlIGNQaWNrbGUgUGlja2xlciBnYXJiYWdlIGNvbGxlY3Rpb24gc3VwcG9ydCB3YXMgZml4ZWQgdG8gdHJhdmVyc2UKKyAgdGhlIGZpbmRfY2xhc3MgYXR0cmlidXRlLCBpZiBwcmVzZW50LgorCistIFRoZXJlIGFyZSBzZXZlcmFsIGZpeGVzIGZvciB0aGUgYnNkZGIzIHdyYXBwZXIgbW9kdWxlLgorCisgIGJzZGRiMyBubyBsb25nZXIgY3Jhc2hlcyBpZiBhbiBlbnZpcm9ubWVudCBpcyBjbG9zZWQgYmVmb3JlIGEgY3Vyc29yCisgIChTRiBidWcgNzYzMjk4KS4KKworICBUaGUgREIgYW5kIERCRW52IHNldF9nZXRfcmV0dXJuc19ub25lIGZ1bmN0aW9uIHdhcyBleHRlbmRlZCB0byB0YWtlCisgIGEgbGV2ZWwgaW5zdGVhZCBvZiBhIGJvb2xlYW4gZmxhZy4gIFRoZSBuZXcgbGV2ZWwgMiBtZWFucyB0aGF0IGluCisgIGFkZGl0aW9uLCBjdXJzb3Iuc2V0KCkvLmdldCgpIG1ldGhvZHMgcmV0dXJuIE5vbmUgaW5zdGVhZCBvZiByYWlzaW5nCisgIGFuIGV4Y2VwdGlvbi4KKworICBBIHR5cG8gd2FzIGZpeGVkIGluIERCQ3Vyc29yLmpvaW5faXRlbSgpLCBwcmV2ZW50aW5nIGEgY3Jhc2guCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBkaXN0dXRpbHMgbm93IHN1cHBvcnRzIE1TVkMgNy4xCisKKy0gZG9jdGVzdCBub3cgZXhhbWluZXMgYWxsIGRvY3N0cmluZ3MgYnkgZGVmYXVsdC4gIFByZXZpb3VzbHksIGl0IHdvdWxkCisgIHNraXAgb3ZlciBmdW5jdGlvbnMgd2l0aCBwcml2YXRlIG5hbWVzIChhcyBpbmRpY2F0ZWQgYnkgdGhlIHVuZGVyc2NvcmUKKyAgbmFtaW5nIGNvbnZlbnRpb24pLiAgVGhlIG9sZCBkZWZhdWx0IGNyZWF0ZWQgdG9vIG11Y2ggb2YgYSByaXNrIHRoYXQKKyAgdXNlciB0ZXN0cyB3ZXJlIGJlaW5nIHNraXBwZWQgaW5hZHZlcnRlbnRseS4gIE5vdGUsIHRoaXMgY2hhbmdlIGNvdWxkCisgIGJyZWFrIGNvZGUgaW4gdGhlIHVubGlrZWx5IGNhc2UgdGhhdCBzb21lb25lIGhhZCBpbnRlbnRpb25hbGx5IHB1dAorICBmYWlsaW5nIHRlc3RzIGluIHRoZSBkb2NzdHJpbmdzIG9mIHByaXZhdGUgZnVuY3Rpb25zLiAgVGhlIGJyZWFrYWdlCisgIGlzIGVhc2lseSBmaXhhYmxlIGJ5IHNwZWNpZnlpbmcgdGhlIG9sZCBiZWhhdmlvciB3aGVuIGNhbGxpbmcgdGVzdG1vZCgpCisgIG9yIFRlc3RlcigpLgorCistIFRoZXJlIHdlcmUgc2V2ZXJhbCBmaXhlcyB0byB0aGUgd2F5IGR1bWJkYm1zIGFyZSBjbG9zZWQuICBJdCdzIHZpdGFsCisgIHRoYXQgYSBkdW1iZGJtIGRhdGFiYXNlIGJlIGNsb3NlZCBwcm9wZXJseSwgZWxzZSB0aGUgb24tZGlzayBkYXRhCisgIGFuZCBkaXJlY3RvcnkgZmlsZXMgY2FuIGJlIGxlZnQgaW4gbXV0dWFsbHkgaW5jb25zaXN0ZW50IHN0YXRlcy4KKyAgZHVtYmRibS5weSdzIF9EYXRhYmFzZS5fX2RlbF9fKCkgbWV0aG9kIGF0dGVtcHRlZCB0byBjbG9zZSB0aGUKKyAgZGF0YWJhc2UgcHJvcGVybHksIGJ1dCBhIHNodXRkb3duIHJhY2UgaW4gX0RhdGFiYXNlLl9jb21taXQoKSBjb3VsZAorICBwcmV2ZW50IHRoaXMgZnJvbSB3b3JraW5nLCBzbyB0aGF0IGEgcHJvZ3JhbSB0cnVzdGluZyBfX2RlbF9fKCkgdG8KKyAgZ2V0IHRoZSBvbi1kaXNrIGZpbGVzIGluIHN5bmNoIGNvdWxkIGJlIGJhZGx5IHN1cnByaXNlZC4gIFRoZSByYWNlCisgIGhhcyBiZWVuIHJlcGFpcmVkLiAgQSBzeW5jKCkgbWV0aG9kIHdhcyBhbHNvIGFkZGVkIHNvIHRoYXQgc2hlbHZlCisgIGNhbiBndWFyYW50ZWUgZGF0YSBpcyB3cml0dGVuIHRvIGRpc2suCisKKyAgVGhlIGNsb3NlKCkgbWV0aG9kIGNhbiBub3cgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHdpdGhvdXQgY29tcGxhaW50LgorCistIFRoZSBjbGFzc2VzIGluIHRocmVhZGluZy5weSBhcmUgbm93IG5ldy1zdHlsZSBjbGFzc2VzLiAgVGhhdCB0aGV5CisgIHdlcmVuJ3QgYmVmb3JlIHdhcyBhbiBvdmVyc2lnaHQuCisKKy0gVGhlIHVybGxpYjIgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGhhbmRsZXJzIG5vdyBkZWZpbmUgdGhlIGNvcnJlY3QKKyAgYXV0aF9oZWFkZXIuICBUaGUgZWFybGllciB2ZXJzaW9ucyB3b3VsZCBmYWlsIGF0IHJ1bnRpbWUuCisKKy0gU0YgYnVnIDc2MzAyMzogZml4IHVuY2F1Z2h0IFplcm9EaXZpc2lvbkVycm9yIGluIGRpZmZsaWIgcmF0aW8gbWV0aG9kcworICB3aGVuIHRoZXJlIGFyZSBubyBsaW5lcy4KKworLSBTRiBidWcgNzYzNjM3OiBmaXggZXhjZXB0aW9uIGluIFRraW50ZXIgd2l0aCBhZnRlcl9jYW5jZWwKKyAgd2hpY2ggY291bGQgb2NjdXIgd2l0aCBUayA4LjQKKworLSBTRiBidWcgNzcwNjAxOiBDR0lIVFRQU2VydmVyLnB5IG5vdyBwYXNzZXMgdGhlIGVudGlyZSBlbnZpcm9ubWVudAorICB0byBjaGlsZCBwcm9jZXNzZXMuCisKKy0gU0YgYnVnIDc2NTIzODogYWRkIGZpbHRlciB0byBmbm1hdGNoJ3MgX19hbGxfXy4KKworLSBTRiBidWcgNzQ4MjAxOiBtYWtlIHRpbWUuc3RycHRpbWUoKSBlcnJvciBtZXNzYWdlcyBtb3JlIGhlbHBmdWwuCisKKy0gU0YgcGF0Y2ggNzY0NDcwOiBEbyBub3QgZHVtcCB0aGUgYXJncyBhdHRyaWJ1dGUgb2YgYSBGYXVsdCBvYmplY3QgaW4KKyAgeG1scnBjbGliLgorCistIFNGIHBhdGNoIDU0OTE1MTogdXJsbGliIGFuZCB1cmxsaWIyIG5vdyByZWRpcmVjdCBQT1NUcyBvbiAzMDEKKyAgcmVzcG9uc2VzLgorCistIFNGIHBhdGNoIDc2NjY1MDogVGhlIHdoaWNoZGIgbW9kdWxlIHdhcyBmaXhlZCB0byByZWNvZ25pemUgZGJtIGZpbGVzCisgIGdlbmVyYXRlZCBieSBnZGJtIG9uIE9TLzIgRU1YLgorCistIFNGIGJ1Z3MgNzYzMDQ3IGFuZCA3NjMwNTI6IGZpeGVzIGJ1ZyBvZiB0aW1lem9uZSB2YWx1ZSBiZWluZyBsZWZ0IGFzCisgIC0xIHdoZW4gYGB0aW1lLnR6bmFtZVswXSA9PSB0aW1lLnR6bmFtZVsxXSBhbmQgbm90IHRpbWUuZGF5bGlnaHRgYAorICBpcyB0cnVlIHdoZW4gaXQgc2hvdWxkIG9ubHkgd2hlbiB0aW1lLmRheWxpZ2h0IGlzIHRydWUuCisKKy0gU0YgYnVnIDc2NDU0ODogcmUgbm93IGFsbG93cyBzdWJjbGFzc2VzIG9mIHN0ciBhbmQgdW5pY29kZSB0byBiZQorICB1c2VkIGFzIHBhdHRlcm5zLgorCistIFNGIGJ1ZyA3NjM2Mzc6IEluIFRraW50ZXIsIGNoYW5nZSBhZnRlcl9jYW5jZWwoKSB0byBoYW5kbGUgdHVwbGVzCisgIG9mIHZhcnlpbmcgc2l6ZXMuICBUayA4LjQgcmV0dXJucyBhIGRpZmZlcmVudCBudW1iZXIgb2YgdmFsdWVzCisgIHRoYW4gVGsgOC4zLgorCistIFNGIGJ1ZyA3NjMwMjM6IGRpZmZsaWIucmF0aW8oKSBkaWQgbm90IGNhdGNoIHplcm8gZGl2aXNpb24uCisKKy0gVGhlIFF1ZXVlIG1vZHVsZSBub3cgaGFzIGFuIF9fYWxsX18gYXR0cmlidXRlLgorCitUb29scy9EZW1vcworLS0tLS0tLS0tLS0KKworLSBTZWUgTGliL2lkbGVsaWIvTkVXUy50eHQgZm9yIElETEUgbmV3cy4KKworLSBTRiBidWcgNzUzNTkyOiB3ZWJjaGVja2VyL3dzZ3VpIG5vdyBoYW5kbGVzIHVzZXIgc3VwcGxpZWQgZGlyZWN0b3JpZXMuCisKKy0gVGhlIHRyYWNlLnB5IHNjcmlwdCBoYXMgYmVlbiByZW1vdmVkLiAgSXQgaXMgbm93IGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LgorCitCdWlsZAorLS0tLS0KKworLSBQeXRob24gbm93IGNvbXBpbGVzIHdpdGggLWZuby1zdHJpY3QtYWxpYXNpbmcgaWYgcG9zc2libGUgKFNGIGJ1ZyA3NjY2OTYpLgorCistIFRoZSBzb2NrZXQgbW9kdWxlIGNvbXBpbGVzIG9uIElSSVggNi41LjEwLgorCistIEFuIGlyaXg2NCBzeXN0ZW0gaXMgdHJlYXRlZCB0aGUgc2FtZSB3YXkgYXMgYW4gaXJpeDYgc3lzdGVtIChTRgorICBwYXRjaCA3NjQ1NjApLgorCistIFNldmVyYWwgZGVmaW5pdGlvbnMgd2VyZSBtaXNzaW5nIG9uIEZyZWVCU0QgNS54IHVubGVzcyB0aGUKKyAgX19CU0RfVklTSUJMRSBzeW1ib2wgd2FzIGRlZmluZWQuICBjb25maWd1cmUgbm93IGRlZmluZXMgaXQgYXMKKyAgbmVlZGVkLgorCitDIEFQSQorLS0tLS0KKworLSBVbmljb2RlIG9iamVjdHMgbm93IHN1cHBvcnQgbWJjcyBhcyBhIGJ1aWx0LWluIGVuY29kaW5nLCBzbyB0aGUgQworICBBUEkgY2FuIHVzZSBpdCB3aXRob3V0IGRlZmVycmluZyB0byB0aGUgZW5jb2RpbmdzIHBhY2thZ2UuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBUaGUgV2luZG93cyBpbXBsZW1lbnRhdGlvbiBvZiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKCkgbmV2ZXIKKyAgY2hlY2tlZCBlcnJvciByZXR1cm5zIGZyb20gV2luZG93cyBmdW5jdGlvbnMgY29ycmVjdGx5LiAgQXMgYSByZXN1bHQsCisgIGl0IGNvdWxkIGNsYWltIHRvIHN0YXJ0IGEgbmV3IHRocmVhZCBldmVuIHdoZW4gdGhlIE1pY3Jvc29mdAorICBfYmVnaW50aHJlYWQoKSBmdW5jdGlvbiBmYWlsZWQgKGR1ZSB0byAidG9vIG1hbnkgdGhyZWFkcyIgLS0gdGhpcyBpcworICBvbiB0aGUgb3JkZXIgb2YgdGhvdXNhbmRzIHdoZW4gaXQgaGFwcGVucykuICBJbiB0aGVzZSBjYXNlcywgdGhlCisgIFB5dGhvbiBleGNlcHRpb24gOjoKKworICAgICAgdGhyZWFkLmVycm9yOiBjYW4ndCBzdGFydCBuZXcgdGhyZWFkCisKKyAgaXMgcmFpc2VkIG5vdy4KKworLSBTRiBidWcgNzY2NjY5OiBQcmV2ZW50IGEgR1BGIG9uIGludGVycHJldGVyIGV4aXQgd2hlbiBzb2NrZXRzIGFyZSBpbgorICB1c2UuICBUaGUgaW50ZXJwcmV0ZXIgbm93IGNhbGxzIFdTQUNsZWFudXAoKSBmcm9tIFB5X0ZpbmFsaXplKCkKKyAgaW5zdGVhZCBvZiBmcm9tIERMTCB0ZWFyZG93bi4KKworTWFjCistLS0KKworLSBCdW5kbGVidWlsZGVyIG5vdyBpbmhlcml0cyBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgcmlnaHQgd2F5LiAgSXQgd2FzCisgIHByZXZpb3VzbHkgcG9zc2libGUgZm9yIGFwcCBidW5kbGVzIHRvIGdldCBhIHR5cGUgb2YgIkJOREwiIGluc3RlYWQKKyAgb2YgIkFQUEwuIiAgT3RoZXIgaW1wcm92ZW1lbnRzIGluY2x1ZGUsIGEgLS1idWlsZC1pZCBvcHRpb24gdG8KKyAgc3BlY2lmeSB0aGUgQ0ZCdW5kbGVJZGVudGlmaWVyIGFuZCB1c2luZyB0aGUgLS1weXRob24gb3B0aW9uIHRvIHNldAorICB0aGUgZXhlY3V0YWJsZSBpbiB0aGUgYnVuZGxlLgorCistIEZpeGVkIHR3byBidWdzIGluIE1hY09TWCBmcmFtZXdvcmsgaGFuZGxpbmcuCisKKy0gcHl0aG9udyBkaWQgbm90IGFsbG93IHVzZXIgaW50ZXJhY3Rpb24gaW4gMi4zcmMxLCB0aGlzIGhhcyBiZWVuIGZpeGVkLgorCistIFB5dGhvbiBpcyBub3cgY29tcGlsZWQgd2l0aCAtbW5vLWZ1c2VkLW1hZGQsIG1ha2luZyBhbGwgdGVzdHMgcGFzcworICBvbiBQYW50aGVyLgorCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjMgYmV0YSAyPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjktSnVuLTIwMDMqCisKK0NvcmUgYW5kIGJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIEEgcHJvZ3JhbSBjYW4gbm93IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUFlUSE9OSU5TUEVDVCB0byBzb21lCisgIHN0cmluZyB2YWx1ZSBpbiBQeXRob24sIGFuZCBjYXVzZSB0aGUgaW50ZXJwcmV0ZXIgdG8gZW50ZXIgdGhlCisgIGludGVyYWN0aXZlIHByb21wdCBhdCBwcm9ncmFtIGV4aXQsIGFzIGlmIFB5dGhvbiBoYWQgYmVlbiBpbnZva2VkCisgIHdpdGggdGhlIC1pIG9wdGlvbi4KKworLSBsaXN0LmluZGV4KCkgbm93IGFjY2VwdHMgb3B0aW9uYWwgc3RhcnQgYW5kIHN0b3AgYXJndW1lbnRzLiAgU2ltaWxhcgorICBjaGFuZ2VzIHdlcmUgbWFkZSB0byBVc2VyTGlzdC5pbmRleCgpLiBTRiBmZWF0dXJlIHJlcXVlc3QgNzU0MDE0LgorCistIFNGIHBhdGNoIDc1MTk5OCBmaXhlcyBhbiB1bndhbnRlZCBzaWRlIGVmZmVjdCBvZiB0aGUgcHJldmlvdXMgZml4CisgIGZvciBTRiBidWcgNzQyODYwICh0aGUgbmV4dCBpdGVtKS4KKworLSBTRiBidWcgNzQyODYwOiAiV2Vha0tleURpY3Rpb25hcnkgX19kZWxpdGVtX18gdXNlcyBpdGVya2V5cyIuICBUaGlzCisgIHdhc24ndCB0aHJlYWRzYWZlLCB3YXMgdmVyeSBpbmVmZmljaWVudCAoZXhwZWN0ZWQgdGltZSBPKGxlbihkaWN0KSkKKyAgaW5zdGVhZCBvZiBPKDEpKSwgYW5kIGNvdWxkIHJhaXNlIGEgc3B1cmlvdXMgUnVudGltZUVycm9yIGlmIGFub3RoZXIKKyAgdGhyZWFkIG11dGF0ZWQgdGhlIGRpY3QgZHVyaW5nIF9fZGVsaXRlbV9fLCBvciBpZiBhIGNvbXBhcmlzb24gZnVuY3Rpb24KKyAgbXV0YXRlZCBpdC4gIEl0IGFsc28gbmVnbGVjdGVkIHRvIHJhaXNlIEtleUVycm9yIHdoZW4gdGhlIGtleSB3YXNuJ3QKKyAgcHJlc2VudDsgZGlkbid0IHJhaXNlIFR5cGVFcnJvciB3aGVuIHRoZSBrZXkgd2Fzbid0IG9mIGEgd2Vha2x5CisgIHJlZmVyZW5jYWJsZSB0eXBlOyBhbmQgYnJva2UgdmFyaW91cyBtb3JlLW9yLWxlc3Mgb2JzY3VyZSBkaWN0CisgIGludmFyaWFudHMgYnkgdXNpbmcgYSBzZXF1ZW5jZSBvZiBlcXVhbGl0eSBjb21wYXJpc29ucyBvdmVyIHRoZSB3aG9sZQorICBzZXQgb2YgZGljdCBrZXlzIGluc3RlYWQgb2YgY29tcHV0aW5nIHRoZSBrZXkncyBoYXNoIGNvZGUgdG8gbmFycm93CisgIHRoZSBzZWFyY2ggdG8gdGhvc2Uga2V5cyB3aXRoIHRoZSBzYW1lIGhhc2ggY29kZS4gIEFsbCBvZiB0aGVzZSBhcmUKKyAgY29uc2lkZXJlZCB0byBiZSBidWdzLiAgQSBuZXcgaW1wbGVtZW50YXRpb24gb2YgX19kZWxpdGVtX18gcmVwYWlycyBhbGwKKyAgdGhhdCwgYnV0IG5vdGUgdGhhdCBmaXhpbmcgdGhlc2UgYnVncyBtYXkgY2hhbmdlIHZpc2libGUgYmVoYXZpb3IgaW4KKyAgY29kZSByZWx5aW5nICh3aGV0aGVyIGludGVudGlvbmFsbHkgb3IgYWNjaWRlbnRhbGx5KSBvbiBvbGQgYmVoYXZpb3IuCisKKy0gU0YgYnVnIDczNDg2OTogRml4ZWQgYSBjb21waWxlciBidWcgdGhhdCBjYXVzZWQgYSBmYXRhbCBlcnJvciB3aGVuCisgIGNvbXBpbGluZyBhIGxpc3QgY29tcHJlaGVuc2lvbiB0aGF0IGNvbnRhaW5lZCBhbm90aGVyIGxpc3QgY29tcHJlaGVuc2lvbgorICBlbWJlZGRlZCBpbiBhIGxhbWJkYSBleHByZXNzaW9uLgorCistIFNGIGJ1ZyA3MDUyMzE6ICBidWlsdGluIHBvdygpIG5vIGxvbmdlciBsZXRzIHRoZSBwbGF0Zm9ybSBDIHBvdygpCisgIHJhaXNlIC0xLjAgdG8gaW50ZWdlciBwb3dlcnMsIGJlY2F1c2UgKGF0IGxlYXN0KSBnbGliYyBnZXRzIGl0IHdyb25nCisgIGluIHNvbWUgY2FzZXMuICBUaGUgcmVzdWx0IHNob3VsZCBiZSAtMS4wIGlmIHRoZSBwb3dlciBpcyBvZGQgYW5kIDEuMAorICBpZiB0aGUgcG93ZXIgaXMgZXZlbiwgYW5kIGFueSBmbG9hdCB3aXRoIGEgc3VmZmljaWVudGx5IGxhcmdlIGV4cG9uZW50CisgIGlzIChtYXRoZW1hdGljYWxseSkgYW4gZXhhY3QgZXZlbiBpbnRlZ2VyLgorCistIFNGIGJ1ZyA3NTkyMjc6IEEgbmV3LXN0eWxlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBfX25vbnplcm9fXygpIG11c3QKKyAgcmV0dXJuIGEgYm9vbCBvciBpbnQgKGJ1dCBub3QgYW4gaW50IHN1YmNsYXNzKSBmcm9tIHRoYXQgbWV0aG9kLiAgVGhpcworICBtYXRjaGVzIHRoZSByZXN0cmljdGlvbiBvbiBjbGFzc2ljIGNsYXNzZXMuCisKKy0gVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBhZGRlZCBmb3IgZmlsZSBvYmplY3RzLCBhbmQgc2V0IHRvCisgIHRoZSB0ZXJtaW5hbCBlbmNvZGluZyBvbiBVbml4IGFuZCBXaW5kb3dzLgorCistIFRoZSBzb2Z0c3BhY2UgYXR0cmlidXRlIG9mIGZpbGUgb2JqZWN0cyBiZWNhbWUgcmVhZC1vbmx5IGJ5IG92ZXJzaWdodC4KKyAgSXQncyB3cml0YWJsZSBhZ2Fpbi4KKworLSBSZXZlcnRlZCBhIDIuMyBiZXRhIDEgY2hhbmdlIHRvIGl0ZXJhdG9ycyBmb3Igc3ViY2xhc3NlcyBvZiBsaXN0IGFuZAorICB0dXBsZS4gIEJ5IGRlZmF1bHQsIHRoZSBpdGVyYXRvcnMgbm93IGFjY2VzcyBkYXRhIGVsZW1lbnRzIGRpcmVjdGx5CisgIGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaCBfX2dldGl0ZW1fXy4gIElmIF9fZ2V0aXRlbV9fIGFjY2VzcyBpcworICBwcmVmZXJyZWQsIHRoZW4gX19pdGVyX18gY2FuIGJlIG92ZXJyaWRkZW4uCisKKy0gU0YgYnVnIDczNTI0NzogVGhlIHN0YXRpY21ldGhvZCBhbmQgc3VwZXIgdHlwZXMgcGFydGljaXBhdGUgaW4KKyAgZ2FyYmFnZSBjb2xsZWN0aW9uLiBCZWZvcmUgdGhpcyBjaGFuZ2UsIGl0IHdhcyBwb3NzaWJsZSBmb3IgbGVha3MgdG8KKyAgb2NjdXIgaW4gZnVuY3Rpb25zIHdpdGggbm9uLWdsb2JhbCBmcmVlIHZhcmlhYmxlcyB0aGF0IHVzZWQgdGhlc2UgdHlwZXMuCisKK0V4dGVuc2lvbiBtb2R1bGVzCistLS0tLS0tLS0tLS0tLS0tLQorCistIHRoZSBzb2NrZXQgbW9kdWxlIGhhcyBhIG5ldyBleGNlcHRpb24sIHNvY2tldC50aW1lb3V0LCB0byBhbGxvdworICB0aW1lb3V0cyB0byBiZSBoYW5kbGVkIHNlcGFyYXRlbHkgZnJvbSBvdGhlciBzb2NrZXQgZXJyb3JzLgorCistIFNGIGJ1ZyA3NTEyNzY6IGNQaWNrbGUgaGFzIGZpeGVkIHRvIHByb3BhZ2F0ZSBleGNlcHRpb25zIHJhaXNlZCBpbgorICB1c2VyIGNvZGUuICBJbiBlYXJsaWVyIHZlcnNpb25zLCBjUGlja2xlIGNhdWdodCBhbmQgaWdub3JlZCBhbnkKKyAgZXhjZXB0aW9uIHdoZW4gaXQgcGVyZm9ybWVkIG9wZXJhdGlvbnMgdGhhdCBpdCBleHBlY3RlZCB0byByYWlzZQorICBzcGVjaWZpYyBleGNlcHRpb25zIGxpa2UgQXR0cmlidXRlRXJyb3IuCisKKy0gY1BpY2tsZSBQaWNrbGVyIGFuZCBVbnBpY2tsZXIgb2JqZWN0cyBub3cgcGFydGljaXBhdGUgaW4gZ2FyYmFnZQorICBjb2xsZWN0aW9uLgorCistIG1pbWV0b29scy5jaG9vc2VfYm91bmRhcnkoKSBjb3VsZCByZXR1cm4gZHVwbGljYXRlIHN0cmluZ3MgYXQgdGltZXMsCisgIGVzcGVjaWFsbHkgbGlrZWx5IG9uIFdpbmRvd3MuICBUaGUgc3RyaW5ncyByZXR1cm5lZCBhcmUgbm93IGd1YXJhbnRlZWQKKyAgdW5pcXVlIHdpdGhpbiBhIHNpbmdsZSBwcm9ncmFtIHJ1bi4KKworLSB0aHJlYWQuaW50ZXJydXB0X21haW4oKSByYWlzZXMgS2V5Ym9hcmRJbnRlcnJ1cHQgaW4gdGhlIG1haW4gdGhyZWFkLgorICBkdW1teV90aHJlYWQgaGFzIGFsc28gYmVlbiBtb2RpZmllZCB0byB0cnkgdG8gc2ltdWxhdGUgdGhlIGJlaGF2aW9yLgorCistIGFycmF5LmFycmF5Lmluc2VydCgpIG5vdyB0cmVhdHMgbmVnYXRpdmUgaW5kaWNlcyBhcyBiZWluZyByZWxhdGl2ZQorICB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSwganVzdCBsaWtlIGxpc3QuaW5zZXJ0KCkgZG9lcy4gKFNGIGJ1ZyAjNzM5MzEzKQorCistIFRoZSBkYXRldGltZSBtb2R1bGUgY2xhc3NlcyBkYXRldGltZSwgdGltZSwgYW5kIHRpbWVkZWx0YSBhcmUgbm93CisgIHByb3Blcmx5IHN1YmNsYXNzYWJsZS4KKworLSBfdGtpbnRlci57Z2V0fHNldH1idXN5d2FpdGludGVydmFsIHdhcyBhZGRlZC4KKworLSBpdGVydG9vbHMuaXNsaWNlKCkgbm93IGFjY2VwdHMgc3RvcD1Ob25lIGFzIGRvY3VtZW50ZWQuCisgIEZpeGVzIFNGIGJ1ZyAjNzMwNjg1LgorCistIHRoZSBic2RkYjE4NSBtb2R1bGUgaXMgYnVpbHQgaW4gb25lIHJlc3RyaWN0ZWQgaW5zdGFuY2UgLQorICAvdXNyL2luY2x1ZGUvZGIuaCBleGlzdHMgYW5kIGRlZmluZXMgSEFTSFZFUlNJT04gdG8gYmUgMi4gIFRoaXMgaXMgdHJ1ZQorICBmb3IgbWFueSBCU0QtZGVyaXZlZCBzeXN0ZW1zLgorCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBTb21lIGhhcHB5IGRvY3Rlc3QgZXh0ZW5zaW9ucyBmcm9tIEppbSBGdWx0b24gaGF2ZSBiZWVuIGFkZGVkIHRvCisgIGRvY3Rlc3QucHkuICBUaGVzZSBhcmUgYWxyZWFkeSBiZWluZyB1c2VkIGluIFpvcGUzLiAgVGhlIHR3bworICBwcmltYXJ5IG9uZXM6CisKKyAgZG9jdGVzdC5kZWJ1Zyhtb2R1bGUsIG5hbWUpIGV4dHJhY3RzIHRoZSBkb2N0ZXN0cyBmcm9tIHRoZSBuYW1lZCBvYmplY3QKKyAgaW4gdGhlIGdpdmVuIG1vZHVsZSwgcHV0cyB0aGVtIGluIGEgdGVtcCBmaWxlLCBhbmQgc3RhcnRzIHBkYiBydW5uaW5nCisgIG9uIHRoYXQgZmlsZS4gIFRoaXMgaXMgZ3JlYXQgd2hlbiBhIGRvY3Rlc3QgZmFpbHMuCisKKyAgZG9jdGVzdC5Eb2NUZXN0U3VpdGUobW9kdWxlPU5vbmUpIHJldHVybnMgYSBzeW50aGVzaXplZCB1bml0dGVzdAorICBUZXN0U3VpdGUgaW5zdGFuY2UsIHRvIGJlIHJ1biBieSB0aGUgdW5pdHRlc3QgZnJhbWV3b3JrLCB3aGljaAorICBydW5zIGFsbCB0aGUgZG9jdGVzdHMgaW4gdGhlIG1vZHVsZS4gIFRoaXMgYWxsb3dzIHdyaXRpbmcgdGVzdHMgaW4KKyAgZG9jdGVzdCBzdHlsZSAod2hpY2ggY2FuIGJlIGNsZWFyZXIgYW5kIHNob3J0ZXIgdGhhbiB3cml0aW5nIHRlc3RzCisgIGluIHVuaXR0ZXN0IHN0eWxlKSwgd2l0aG91dCBsb3NpbmcgdW5pdHRlc3QncyBwb3dlcmZ1bCB0ZXN0aW5nCisgIGZyYW1ld29yayBmZWF0dXJlcyAod2hpY2ggZG9jdGVzdCBsYWNrcykuCisKKy0gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBkb2N0ZXN0cyBjcmVhdGVkIGJlZm9yZSAyLjMsIGlmIGFuIGV4cGVjdGVkCisgIG91dHB1dCBibG9jayBjb25zaXN0cyBzb2xlbHkgb2YgIjEiIGFuZCB0aGUgYWN0dWFsIG91dHB1dCBibG9jaworICBjb25zaXN0cyBzb2xlbHkgb2YgIlRydWUiLCBpdCdzIGFjY2VwdGVkIGFzIGEgbWF0Y2g7IHNpbWlsYXJseQorICBmb3IgIjAiIGFuZCAiRmFsc2UiLiAgVGhpcyBpcyBxdWl0ZSB1bi1kb2N0ZXN0LWxpa2UsIGJ1dCBpcyBwcmFjdGljYWwuCisgIFRoZSBiZWhhdmlvciBjYW4gYmUgZGlzYWJsZWQgYnkgcGFzc2luZyB0aGUgbmV3IGRvY3Rlc3QgbW9kdWxlCisgIGNvbnN0YW50IERPTlRfQUNDRVBUX1RSVUVfRk9SXzEgdG8gdGhlIG5ldyBvcHRpb25mbGFncyBvcHRpb25hbAorICBhcmd1bWVudC4KKworLSBaaXBGaWxlLnRlc3R6aXAoKSBub3cgb25seSB0cmFwcyBCYWRaaXBmaWxlIGV4Y2VwdGlvbnMuICBQcmV2aW91c2x5LAorICBhIGJhcmUgZXhjZXB0IGNhdWdodCB0byBtdWNoIGFuZCByZXBvcnRlZCBhbGwgZXJyb3JzIGFzIGEgcHJvYmxlbQorICBpbiB0aGUgYXJjaGl2ZS4KKworLSBUaGUgbG9nZ2luZyBtb2R1bGUgbm93IGhhcyBhIG5ldyBmdW5jdGlvbiwgbWFrZUxvZ1JlY29yZCgpIG1ha2luZworICBMb2dIYW5kbGVyIGVhc2llciB0byBpbnRlcmFjdCB3aXRoIERhdGFncmFtSGFuZGxlciBhbmQgU29ja2V0SGFuZGxlci4KKworLSBUaGUgY2dpdGIgbW9kdWxlIGhhcyBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgcGxhaW4gdGV4dCBkaXNwbGF5IChTRiBwYXRjaAorICA1Njk1NzQpLgorCistIEEgYnJhbmQgbmV3IHZlcnNpb24gb2YgSURMRSAoZnJvbSB0aGUgSURMRWZvcmsgcHJvamVjdCBhdAorICBTb3VyY2VGb3JnZSkgaXMgbm93IGluY2x1ZGVkIGFzIExpYi9pZGxlbGliLiAgVGhlIG9sZCBUb29scy9pZGxlIGlzCisgIG5vIG1vcmUuCisKKy0gQWRkZWQgYSBuZXcgbW9kdWxlOiB0cmFjZSAoZG9jdW1lbnRhdGlvbiBtaXNzaW5nKS4gIFRoaXMgbW9kdWxlIHVzZWQKKyAgdG8gYmUgZGlzdHJpYnV0ZWQgaW4gVG9vbHMvc2NyaXB0cy4gIEl0IHVzZXMgc3lzLnNldHRyYWNlKCkgdG8gdHJhY2UKKyAgY29kZSBleGVjdXRpb24gLS0gZWl0aGVyIGZ1bmN0aW9uIGNhbGxzIG9yIGluZGl2aWR1YWwgbGluZXMuICBJdCBjYW4KKyAgZ2VuZXJhdGUgdHJhY2luZyBvdXRwdXQgZHVyaW5nIGV4ZWN1dGlvbiBvciBhIHBvc3QtbW9ydGVtIHJlcG9ydCBvZgorICBjb2RlIGNvdmVyYWdlLgorCistIFRoZSB0aHJlYWRpbmcgbW9kdWxlIGhhcyBuZXcgZnVuY3Rpb25zIHNldHRyYWNlKCkgYW5kIHNldHByb2ZpbGUoKQorICB0aGF0IGNvb3BlcmF0ZSB3aXRoIHRoZSBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc3lzCisgIG1vZHVsZS4gIEEgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSB0aHJlYWRpbmcgbW9kdWxlIHdpbGwKKyAgYmUgdXNlZCBmb3IgYWxsIHRocmVhZHMgaXQgY3JlYXRlcy4gIFRoZSBuZXcgdHJhY2UgbW9kdWxlIHVzZXMgdGhpcworICB0byBwcm92aWRlIHRyYWNpbmcgZm9yIGNvZGUgcnVubmluZyBpbiB0aHJlYWRzLgorCistIGNvcHkucHk6IGFwcGxpZWQgU0YgcGF0Y2ggNzA3OTAwLCBmaXhpbmcgYnVnIDcwMjg1OCwgYnkgU3RldmVuCisgIFRhc2NodWsuICBDb3B5aW5nIGEgbmV3LXN0eWxlIGNsYXNzIHRoYXQgaGFkIGEgcmVmZXJlbmNlIHRvIGl0c2VsZgorICBkaWRuJ3Qgd29yay4gIChUaGUgc2FtZSB0aGluZyB3b3JrZWQgZmluZSBmb3Igb2xkLXN0eWxlIGNsYXNzZXMuKQorICBCdWlsdGluIGZ1bmN0aW9ucyBhcmUgbm93IHRyZWF0ZWQgYXMgYXRvbWljLCBmaXhpbmcgYnVnICM3NDYzMDQuCisKKy0gZGlmZmxpYi5weSBoYXMgdHdvIG5ldyBmdW5jdGlvbnM6ICBjb250ZXh0X2RpZmYoKSBhbmQgdW5pZmllZF9kaWZmKCkuCisKKy0gTW9yZSBmaXhlcyB0byB1cmxsaWIgKFNGIDU0OTE1MSk6IChhKSBXaGVuIHJlZGlyZWN0aW5nLCBhbHdheXMgdXNlCisgIEdFVC4gIFRoaXMgaXMgY29tbW9uIHByYWN0aWNlIGFuZCBtb3JlLW9yLWxlc3Mgc2FuY3Rpb25lZCBieSB0aGUKKyAgSFRUUCBzdGFuZGFyZC4gKGIpIEFkZCBhIGhhbmRsZXIgZm9yIDMwNyByZWRpcmVjdGlvbiwgd2hpY2ggYmVjb21lcworICBhbiBlcnJvciBmb3IgUE9TVCwgYnV0IGEgcmVndWxhciByZWRpcmVjdCBmb3IgR0VUIGFuZCBIRUFECisKKy0gQWRkZWQgb3B0aW9uYWwgJ29uZXJyb3InIGFyZ3VtZW50IHRvIG9zLndhbGsoKSwgdG8gY29udHJvbCBlcnJvcgorICBoYW5kbGluZy4KKworLSBpbnNwZWN0Lmlze21ldGhvZHxkYXRhfWRlc2NyaXB0b3Igd2FzIGFkZGVkLCB0byBhbGxvdyBweWRvYyBkaXNwbGF5CisgIF9fZG9jX18gb2YgZGF0YSBkZXNjcmlwdG9ycy4KKworLSBGaXhlZCBzb2NrZXQgc3BlZWQgbG9zcyBjYXVzZWQgYnkgdXNlIG9mIHRoZSBfc29ja2V0b2JqZWN0IHdyYXBwZXIgY2xhc3MKKyAgaW4gc29ja2V0LnB5LgorCistIHRpbWVpdC5weSBub3cgY2hlY2tzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmb3IgaW1wb3J0cy4KKworLSB1cmxsaWIyLnB5IG5vdyBrbm93cyBob3cgdG8gb3JkZXIgcHJveHkgY2xhc3Nlcywgc28gdGhlIHVzZXIgZG9lc24ndAorICBoYXZlIHRvIGluc2VydCBpdCBpbiBmcm9udCBvZiBvdGhlciBjbGFzc2VzLCBub3IgZG8gZGlydHkgdHJpY2tzIGxpa2UKKyAgaW5zZXJ0aW5nIGEgImR1bW15IiBIVFRQSGFuZGxlciBhZnRlciBhIFByb3h5SGFuZGxlciB3aGVuIGJ1aWxkaW5nIGFuCisgIG9wZW5lciB3aXRoIHByb3h5IHN1cHBvcnQuCisKKy0gSXRlcmF0b3JzIGhhdmUgYmVlbiBhZGRlZCBmb3IgZGJtIGtleXMuCisKKy0gcmFuZG9tLlJhbmRvbSBvYmplY3RzIGNhbiBub3cgYmUgcGlja2xlZC4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gcHlkb2Mgbm93IG9mZmVycyBoZWxwIG9uIGtleXdvcmRzIGFuZCB0b3BpY3MuCisKKy0gVG9vbHMvaWRsZSBpcyBnb25lOyBsb25nIGxpdmUgTGliL2lkbGVsaWIuCisKKy0gZGlmZi5weSBwcmludHMgZmlsZSBkaWZmcyBpbiBjb250ZXh0LCB1bmlmaWVkLCBvciBuZGlmZiBmb3JtYXRzLAorICBwcm92aWRpbmcgYSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIHRvIGRpZmZsaWIucHkuCisKKy0gdGV4Y2hlY2sucHkgaXMgYSBuZXcgc2NyaXB0IGZvciBtYWtpbmcgYSByb3VnaCB2YWxpZGF0aW9uIG9mIFB5dGhvbiBMYVRlWAorICBmaWxlcy4KKworQnVpbGQKKy0tLS0tCisKKy0gU2V0dGluZyBERVNURElSIGR1cmluZyAnbWFrZSBpbnN0YWxsJyBub3cgYWxsb3dzIHNwZWNpZnlpbmcgYQorICBkaWZmZXJlbnQgcm9vdCBkaXJlY3RvcnkuCisKK0MgQVBJCistLS0tLQorCistIFB5VHlwZV9SZWFkeSgpOiAgSWYgYSB0eXBlIGRlY2xhcmVzIHRoYXQgaXQgcGFydGljaXBhdGVzIGluIGdjCisgIChQeV9UUEZMQUdTX0hBVkVfR0MpLCBhbmQgaXRzIGJhc2UgY2xhc3MgZG9lcyBub3QsIGFuZCBpdHMgYmFzZSBjbGFzcydzCisgIHRwX2ZyZWUgc2xvdCBpcyB0aGUgZGVmYXVsdCBfUHlPYmplY3RfRGVsLCBhbmQgdHlwZSBkb2VzIG5vdCBkZWZpbmUKKyAgYSB0cF9mcmVlIHNsb3QgaXRzZWxmLCBfUHlPYmplY3RfR0NfRGVsIGlzIGFzc2lnbmVkIHRvIHR5cGUtPnRwX2ZyZWUuCisgIFByZXZpb3VzbHkgX1B5T2JqZWN0X0RlbCB3YXMgaW5oZXJpdGVkLCB3aGljaCBjb3VsZCBhdCBiZXN0IGxlYWQgdG8gYQorICBzZWdmYXVsdC4gIEluIGFkZGl0aW9uLCBpZiBldmVuIGFmdGVyIHRoaXMgbWFnaWMgdGhlIHR5cGUncyB0cF9mcmVlCisgIHNsb3QgaXMgX1B5T2JqZWN0X0RlbCBvciBOVUxMLCBhbmQgdGhlIHR5cGUgaXMgYSBiYXNlIHR5cGUKKyAgKFB5X1RQRkxBR1NfQkFTRVRZUEUpLCBUeXBlRXJyb3IgaXMgcmFpc2VkOiAgc2luY2UgdGhlIHR5cGUgaXMgYSBiYXNlCisgIHR5cGUsIGl0cyBkZWFsbG9jIGZ1bmN0aW9uIG11c3QgY2FsbCB0eXBlLT50cF9mcmVlLCBhbmQgc2luY2UgdGhlIHR5cGUKKyAgaXMgZ2MnYWJsZSwgdHBfZnJlZSBtdXN0IG5vdCBiZSBOVUxMIG9yIF9QeU9iamVjdF9EZWwuCisKKy0gUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4YygpOiBBIG5ldyBBUEkgKGRlbGliZXJhdGVseSBhY2Nlc3NpYmxlIG9ubHkKKyAgZnJvbSBDKSB0byBpbnRlcnJ1cHQgYSB0aHJlYWQgYnkgc2VuZGluZyBpdCBhbiBleGNlcHRpb24uICBJdCBpcworICBpbnRlbnRpb25hbCB0aGF0IHlvdSBoYXZlIHRvIHdyaXRlIHlvdXIgb3duIEMgZXh0ZW5zaW9uIHRvIGNhbGwgaXQKKyAgZnJvbSBQeXRob24uCisKKworTmV3IHBsYXRmb3JtcworLS0tLS0tLS0tLS0tLQorCitOb25lIHRoaXMgdGltZS4KKworVGVzdHMKKy0tLS0tCisKKy0gdGVzdF9pbXAgcmV3cml0dGVuIHNvIHRoYXQgaXQgZG9lc24ndCByYWlzZSBSdW50aW1lRXJyb3IgaWYgcnVuIGFzIGEKKyAgc2lkZSBlZmZlY3Qgb2YgYmVpbmcgaW1wb3J0ZWQgKCJpbXBvcnQgdGVzdC5hdXRvdGVzdCIpLgorCitXaW5kb3dzCistLS0tLS0tCisKKy0gVGhlIFdpbmRvd3MgaW5zdGFsbGVyIHNoaXBzIHdpdGggVGNsL1RrIDguNC4zICh1cGdyYWRlZCBmcm9tIDguNC4xKS4KKworLSBUaGUgaW5zdGFsbGVyIGFsd2F5cyBzdWdnZXN0ZWQgdGhhdCBQeXRob24gYmUgaW5zdGFsbGVkIG9uIHRoZSBDOgorICBkcml2ZSwgZHVlIHRvIGEgaGFyZGNvZGVkICJDOiIgZ2VuZXJhdGVkIGJ5IHRoZSBXaXNlIGluc3RhbGxhdGlvbgorICB3aXphcmQuICBQZW9wbGUgd2l0aCBtYWNoaW5lcyB3aGVyZSBDOiBpcyBub3QgdGhlIHN5c3RlbSBkcml2ZQorICB1c3VhbGx5IHdhbnQgUHl0aG9uIGluc3RhbGxlZCBvbiB3aGljaGV2ZXIgZHJpdmUgaXMgdGhlaXIgc3lzdGVtIGRyaXZlCisgIGluc3RlYWQuICBXZSByZW1vdmVkIHRoZSBoYXJkY29kZWQgIkM6IiwgYW5kIHR3byB0ZXN0ZXJzIG9uIG1hY2hpbmVzCisgIHdoZXJlIEM6IGlzIG5vdCB0aGUgc3lzdGVtIGRyaXZlIHJlcG9ydCB0aGF0IHRoZSBpbnN0YWxsZXIgbm93CisgIHN1Z2dlc3RzIHRoZWlyIHN5c3RlbSBkcml2ZS4gIE5vdGUgdGhhdCB5b3UgY2FuIGFsd2F5cyBzZWxlY3QgdGhlCisgIGRpcmVjdG9yeSB5b3Ugd2FudCBpbiB0aGUgIlNlbGVjdCBEZXN0aW5hdGlvbiBEaXJlY3RvcnkiIGRpYWxvZyAtLQorICB0aGF0J3Mgd2hhdCBpdCdzIGZvci4KKworTWFjCistLS0KKworLSBUaGVyZSdzIGEgbmV3IG1vZHVsZSBjYWxsZWQgImF1dG9HSUwiLCB3aGljaCBvZmZlcnMgYSBtZWNoYW5pc20gdG8KKyAgYXV0b21hdGljYWxseSByZWxlYXNlIHRoZSBHbG9iYWwgSW50ZXJwcmV0ZXIgTG9jayB3aGVuIGFuIGV2ZW50IGxvb3AKKyAgZ29lcyB0byBzbGVlcCwgYWxsb3dpbmcgb3RoZXIgdGhyZWFkcyB0byBydW4uIEl0J3MgY3VycmVudGx5IG9ubHkKKyAgc3VwcG9ydGVkIG9uIE9TWCwgaW4gdGhlIE1hY2gtTyB2ZXJzaW9uLgorLSBUaGUgT1NBIG1vZHVsZXMgbm93IGFsbG93IGRpcmVjdCBhY2Nlc3MgdG8gcHJvcGVydGllcyBvZiB0aGUKKyAgdG9wbGV2ZWwgYXBwbGljYXRpb24gY2xhc3MgKGluIEFwcGxlU2NyaXB0IHRlcm1pbm9sb2d5KS4KKy0gVGhlIFBhY2thZ2UgTWFuYWdlciBjYW4gbm93IHVwZGF0ZSBpdHNlbGYuCisKK1NvdXJjZUZvcmdlIEJ1Z3MgYW5kIFBhdGNoZXMgQXBwbGllZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzQzMDE2MCwgNDcxODkzLCA1MDE3MTYsIDU0MjU2MiwgNTQ5MTUxLCA1Njk1NzQsIDU5NTgzNywgNTk2NDM0LAorNTk4MTYzLCA2MDQyMTAsIDYwNDcxNiwgNjEwMzMyLCA2MTI2MjcsIDYxNDc3MCwgNjIwMTkwLCA2MjE4OTEsCis2MjIwNDIsIDYzOTEzOSwgNjQwMjM2LCA2NDQzNDUsIDY0OTc0MiwgNjQ5NzQyLCA2NTgyMzMsIDY2MDAyMiwKKzY2MTMxOCwgNjYxNjc2LCA2NjI4MDcsIDY2MjkyMywgNjY2MjE5LCA2NzI4NTUsIDY3ODMyNSwgNjgyMzQ3LAorNjgzNDg2LCA2ODQ5ODEsIDY4NTc3MywgNjg2MjU0LCA2OTI3NzYsIDY5Mjk1OSwgNjkzMDk0LCA2OTY3NzcsCis2OTc5ODksIDcwMDgyNywgNzAzNjY2LCA3MDg0OTUsIDcwODYwNCwgNzA4OTAxLCA3MTA3MzMsIDcxMTkwMiwKKzcxMzcyMiwgNzE1NzgyLCA3MTgyODYsIDcxOTM1OSwgNzE5MzY3LCA3MjMxMzYsIDcyMzgzMSwgNzIzOTYyLAorNzI0NTg4LCA3MjQ3NjcsIDcyNDc2NywgNzI1OTQyLCA3MjYxNTAsIDcyNjQ0NiwgNzI2ODY5LCA3MjcwNTEsCis3Mjc3MTksIDcyNzcxOSwgNzI3ODA1LCA3MjgyNzcsIDcyODU2MywgNzI4NjU2LCA3MjkwOTYsIDcyOTEwMywKKzcyOTI5MywgNzI5Mjk3LCA3MjkzMDAsIDcyOTMxNywgNzI5Mzk1LCA3Mjk2MjIsIDcyOTgxNywgNzMwMTcwLAorNzMwMjk2LCA3MzA1OTQsIDczMDY4NSwgNzMwODI2LCA3MzA5NjMsIDczMTIwOSwgNzMxNDAzLCA3MzE1MDQsCis3MzE1MTQsIDczMTYyNiwgNzMxNjM1LCA3MzE2NDMsIDczMTY0NCwgNzMxNjQ0LCA3MzE2ODksIDczMjEyNCwKKzczMjE0MywgNzMyMjM0LCA3MzIyODQsIDczMjI4NCwgNzMyNDc5LCA3MzI3NjEsIDczMjc4MywgNzMyOTUxLAorNzMzNjY3LCA3MzM3ODEsIDczNDExOCwgNzM0MjMxLCA3MzQ4NjksIDczNTA1MSwgNzM1MjkzLCA3MzU1MjcsCis3MzU2MTMsIDczNTY5NCwgNzM2OTYyLCA3MzY5NjIsIDczNzk3MCwgNzM4MDY2LCA3MzkzMTMsIDc0MDA1NSwKKzc0MDIzNCwgNzQwMzAxLCA3NDE4MDYsIDc0MjEyNiwgNzQyNzQxLCA3NDI4NjAsIDc0Mjg2MCwgNzQyOTExLAorNzQ0MDQxLCA3NDQxMDQsIDc0NDIzOCwgNzQ0Njg3LCA3NDQ4NzcsIDc0NTA1NSwgNzQ1NDc4LCA3NDU1MjUsCis3NDU2MjAsIDc0NjAxMiwgNzQ2MzA0LCA3NDYzNjYsIDc0NjgwMSwgNzQ2OTUzLCA3NDczNDgsIDc0NzY2NywKKzc0Nzk1NCwgNzQ4ODQ2LCA3NDg4NDksIDc0ODk3MywgNzQ4OTc1LCA3NDkxOTEsIDc0OTIxMCwgNzQ5NzU5LAorNzQ5ODMxLCA3NDk5MTEsIDc1MDAwOCwgNzUwMDkyLCA3NTA1NDIsIDc1MDU5NSwgNzUxMDM4LCA3NTExMDcsCis3NTEyNzYsIDc1MTQ1MSwgNzUxOTE2LCA3NTE5NDEsIDc1MTk1NiwgNzUxOTk4LCA3NTI2NzEsIDc1MzQ1MSwKKzc1MzYwMiwgNzUzNjE3LCA3NTM4NDUsIDc1MzkyNSwgNzU0MDE0LCA3NTQzNDAsIDc1NDQ0NywgNzU1MDMxLAorNzU1MDg3LCA3NTUxNDcsIDc1NTI0NSwgNzU1NjgzLCA3NTU5ODcsIDc1NjAzMiwgNzU2OTk2LCA3NTcwNTgsCis3NTcyMjksIDc1NzgxOCwgNzU3ODIxLCA3NTc4MjIsIDc1ODExMiwgNzU4OTEwLCA3NTkyMjcsIDc1OTg4OSwKKzc2MDI1NywgNzYwNzAzLCA3NjA3OTIsIDc2MTEwNCwgNzYxMzM3LCA3NjE1MTksIDc2MTgzMCwgNzYyNDU1CisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4zIGJldGEgMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDI1LUFwci0yMDAzKgorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBOZXcgZm9ybWF0IGNvZGVzIEIsIEgsIEksIGsgYW5kIEsgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGZvcgorICBQeUFyZ19QYXJzZVR1cGxlIGFuZCBQeUJ1aWxkX1ZhbHVlLgorCistIE5ldyBidWlsdGluIGZ1bmN0aW9uIHN1bShzZXEsIHN0YXJ0PTApIHJldHVybnMgdGhlIHN1bSBvZiBhbGwgdGhlCisgIGl0ZW1zIGluIGl0ZXJhYmxlIG9iamVjdCBzZXEsIHBsdXMgc3RhcnQgKGl0ZW1zIGFyZSBub3JtYWxseSBudW1iZXJzLAorICBhbmQgY2Fubm90IGJlIHN0cmluZ3MpLgorCistIGJvb2woKSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMgbm93IHJldHVybnMgRmFsc2UgcmF0aGVyIHRoYW4KKyAgcmFpc2luZyBhbiBleGNlcHRpb24uICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBjYWxsaW5nIHRoZQorICBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBvdGhlciBidWlsdGluIHR5cGVzIC0tIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50CisgIHRoZXkgYWxsIHJldHVybiB0aGUgZmFsc2UgdmFsdWUgb2YgdGhhdCB0eXBlLiAgKFNGIHBhdGNoICM3MjQxMzUpCisKKy0gSW4gc3VwcG9ydCBvZiBQRVAgMjY5IChtYWtpbmcgdGhlIHBnZW4gcGFyc2VyIGdlbmVyYXRvciBhY2Nlc3NpYmxlCisgIGZyb20gUHl0aG9uKSwgc29tZSBjaGFuZ2VzIHRvIHRoZSBwZ2VuIGNvZGUgc3RydWN0dXJlIHdlcmUgbWFkZTsgYQorICBmZXcgZmlsZXMgdGhhdCB1c2VkIHRvIGJlIGxpbmtlZCBvbmx5IHdpdGggcGdlbiBhcmUgbm93IGxpbmtlZCB3aXRoCisgIFB5dGhvbiBpdHNlbGYuCisKKy0gVGhlIHJlcHIoKSBvZiBhIHdlYWtyZWYgb2JqZWN0IG5vdyBzaG93cyB0aGUgX19uYW1lX18gYXR0cmlidXRlIG9mCisgIHRoZSByZWZlcmVuY2VkIG9iamVjdCwgaWYgaXQgaGFzIG9uZS4KKworLSBzdXBlcigpIG5vIGxvbmdlciBpZ25vcmVzIGRhdGEgZGVzY3JpcHRvcnMsIGV4Y2VwdCBfX2NsYXNzX18uICBTZWUKKyAgdGhlIHRocmVhZCBzdGFydGVkIGF0CisgIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAwMy1BcHJpbC8wMzQzMzguaHRtbAorCistIGxpc3QuaW5zZXJ0KGksIHgpIG5vdyBpbnRlcnByZXRzIG5lZ2F0aXZlIGkgYXMgaXQgd291bGQgYmUKKyAgaW50ZXJwcmV0ZWQgYnkgc2xpY2luZywgc28gbmVnYXRpdmUgdmFsdWVzIGNvdW50IGZyb20gdGhlIGVuZCBvZiB0aGUKKyAgbGlzdC4gIFRoaXMgd2FzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHN1Y2ggYW4gaW50ZXJwcmV0YXRpb24gd2FzIG5vdAorICBwbGFjZWQgb24gYSBsaXN0IGluZGV4LgorCistIHJhbmdlKCkgbm93IHdvcmtzIGV2ZW4gaWYgdGhlIGFyZ3VtZW50cyBhcmUgbG9uZ3Mgd2l0aCBtYWduaXR1ZGUKKyAgbGFyZ2VyIHRoYW4gc3lzLm1heGludCwgYXMgbG9uZyBhcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZQorICBmaXRzLiAgRS5nLiwgcmFuZ2UoMioqMTAwLCAyKioxMDEsIDIqKjEwMCkgaXMgdGhlIGZvbGxvd2luZyBsaXN0OgorICBbMTI2NzY1MDYwMDIyODIyOTQwMTQ5NjcwMzIwNTM3NkxdLiAgKFNGIHBhdGNoICM3MDc0MjcuKQorCistIFNvbWUgaG9ycmlkbHkgb2JzY3VyZSBwcm9ibGVtcyB3ZXJlIGZpeGVkIGludm9sdmluZyBpbnRlcmFjdGlvbgorICBiZXR3ZWVuIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgb2xkLXN0eWxlIGNsYXNzZXMgd2l0aCAiYW1iaXRpb3VzIgorICBnZXRhdHRyIGhvb2tzLiAgSWYgYW4gb2xkLXN0eWxlIGluc3RhbmNlIGRpZG4ndCBoYXZlIGEgX19kZWxfXyBtZXRob2QsCisgIGJ1dCBkaWQgaGF2ZSBhIF9fZ2V0YXR0cl9fIGhvb2ssIGFuZCB0aGUgaW5zdGFuY2UgYmVjYW1lIHJlYWNoYWJsZQorICBvbmx5IGZyb20gYW4gdW5yZWFjaGFibGUgY3ljbGUsIGFuZCB0aGUgaG9vayByZXN1cnJlY3RlZCBvciBkZWxldGVkCisgIHVucmVhY2hhYmxlIG9iamVjdHMgd2hlbiBhc2tlZCB0byByZXNvbHZlICJfX2RlbF9fIiwgYW55dGhpbmcgdXAgdG8KKyAgYSBzZWdmYXVsdCBjb3VsZCBoYXBwZW4uICBUaGF0J3MgYmVlbiByZXBhaXJlZC4KKworLSBkaWN0LnBvcCBub3cgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgc3BlY2lmeWluZyBhIGRlZmF1bHQKKyAgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBkaWN0LiAgSWYgYSBkZWZhdWx0IGlzIG5vdAorICBnaXZlbiBhbmQgdGhlIGtleSBpcyBub3QgZm91bmQsIGEgS2V5RXJyb3Igd2lsbCBzdGlsbCBiZSByYWlzZWQuCisgIFBhcmFsbGVsIGNoYW5nZXMgd2VyZSBtYWRlIHRvIFVzZXJEaWN0LlVzZXJEaWN0IGFuZCBVc2VyRGljdC5EaWN0TWl4aW4uCisgIFtTRiBwYXRjaCAjNjkzNzUzXSAoY29udHJpYnV0ZWQgYnkgTWljaGFlbCBTdG9uZS4pCisKKy0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpIHdhcyBhZGRlZCB0byBleHBvc2UKKyAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZy4KKworLSBOZXcgZnVuY3Rpb24gc3lzLmV4Y19jbGVhcigpIGNsZWFycyB0aGUgY3VycmVudCBleGNlcHRpb24uICBUaGlzIGlzCisgIHJhcmVseSBuZWVkZWQsIGJ1dCBjYW4gc29tZXRpbWVzIGJlIHVzZWZ1bCB0byByZWxlYXNlIG9iamVjdHMKKyAgcmVmZXJlbmNlZCBieSB0aGUgdHJhY2ViYWNrIGhlbGQgaW4gc3lzLmV4Y19pbmZvKClbMl0uICAoU0YgcGF0Y2gKKyAgIzY5MzE5NS4pCisKKy0gT24gNjQtYml0IHN5c3RlbXMsIGEgZGljdGlvbmFyeSBjb3VsZCBjb250YWluIGR1cGxpY2F0ZSBsb25nL2ludCBrZXlzCisgIGlmIHRoZSBrZXkgdmFsdWUgd2FzIGxhcmdlciB0aGFuIDIqKjMyLiAgU2VlIFNGIGJ1ZyAjNjg5NjU5LgorCistIEZpeGVkIFNGIGJ1ZyAjNjYzMDc0LiBUaGUgY29kZWMgc3lzdGVtIHdhcyB1c2luZyBnbG9iYWwgc3RhdGljCisgIHZhcmlhYmxlcyB0byBzdG9yZSBpbnRlcm5hbCBkYXRhLiBBcyBhIHJlc3VsdCwgYW55IGF0dGVtcHRzIHRvIHVzZSB0aGUKKyAgdW5pY29kZSBzeXN0ZW0gd2l0aCBtdWx0aXBsZSBhY3RpdmUgaW50ZXJwcmV0ZXJzLCBvciBzdWNjZXNzaXZlCisgIGludGVycHJldGVyIGV4ZWN1dGlvbnMsIHdvdWxkIGZhaWwuCisKKy0gIiVjIiAlIHUiYSIgbm93IHJldHVybnMgYSB1bmljb2RlIHN0cmluZyBpbnN0ZWFkIG9mIHJhaXNpbmcgYQorICBUeXBlRXJyb3IuIHUiJWMiICUgMHhmZmZmZmZmZiBub3cgcmFpc2VzIGEgT3ZlcmZsb3dFcnJvciBpbnN0ZWFkCisgIG9mIGEgVmFsdWVFcnJvciB0byBiZSBjb25zaXN0ZW50IHdpdGggIiVjIiAlIDI1Ni4gU2VlIFNGIHBhdGNoICM3MTAxMjcuCisKK0V4dGVuc2lvbiBtb2R1bGVzCistLS0tLS0tLS0tLS0tLS0tLQorCistIFRoZSBzb2NrZXQgbW9kdWxlIG5vdyBwcm92aWRlcyB0aGUgZnVuY3Rpb25zIGluZXRfcHRvbiBhbmQgaW5ldF9udG9wCisgIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gc3RyaW5nIGFuZCBwYWNrZWQgcmVwcmVzZW50YXRpb24gb2YgSVAKKyAgYWRkcmVzc2VzLiAgVGhlcmUgaXMgYWxzbyBhIG5ldyBtb2R1bGUgdmFyaWFibGUsIGhhc19pcHY2LCB3aGljaCBpcworICBUcnVlIGlmZiB0aGUgY3VycmVudCBQeXRob24gaGFzIElQdjYgc3VwcG9ydC4gIFNlZSBTRiBwYXRjaCAjNjU4MzI3LgorCistIFRraW50ZXIgd3JhcHBlcnMgYXJvdW5kIFRjbCB2YXJpYWJsZXMgbm93IHBhc3Mgb2JqZWN0cyBkaXJlY3RseQorICB0byBUY2wsIGluc3RlYWQgb2YgZmlyc3QgY29udmVydGluZyB0aGVtIHRvIHN0cmluZ3MuCisKKy0gVGhlIC4qPyBwYXR0ZXJuIGluIHRoZSByZSBtb2R1bGUgaXMgbm93IHNwZWNpYWwtY2FzZWQgdG8gYXZvaWQgdGhlCisgIHJlY3Vyc2lvbiBsaW1pdC4gIChTRiBwYXRjaCAjNzIwOTkxIC0tIG1hbnkgdGhhbmtzIHRvIEdhcnkgSGVycm9uCisgIGFuZCBHcmVnIENoYXBtYW4uKQorCistIE5ldyBmdW5jdGlvbiBzeXMuY2FsbF90cmFjaW5nKCkgYWxsb3dzIHBkYiB0byBkZWJ1ZyBjb2RlCisgIHJlY3Vyc2l2ZWx5LgorCistIE5ldyBmdW5jdGlvbiBnYy5nZXRfcmVmZXJlbnRzKG9iaikgcmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cworICBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IG9iai4gIEluIGVmZmVjdCwgaXQgZXhwb3NlcyB3aGF0IHRoZSBvYmplY3QncworICB0cF90cmF2ZXJzZSBzbG90IGRvZXMsIGFuZCBjYW4gYmUgaGVscGZ1bCB3aGVuIGRlYnVnZ2luZyBtZW1vcnkKKyAgbGVha3MuCisKKy0gVGhlIGljb252IG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhpcyByZWxlYXNlLgorCistIFRoZSBwbGF0Zm9ybS1pbmRlcGVuZGVudCByb3V0aW5lcyBmb3IgcGFja2luZyBmbG9hdHMgaW4gSUVFRSBmb3JtYXRzCisgIChzdHJ1Y3QucGFjaydzIDxmLCA+ZiwgPGQsIGFuZCA+ZCBjb2RlczsgcGlja2xlIGFuZCBjUGlja2xlJ3MgcHJvdG9jb2wgMQorICBwaWNrbGluZyBvZiBmbG9hdHMpIGlnbm9yZWQgdGhhdCByb3VuZGluZyBjYW4gY2F1c2UgYSBjYXJyeSB0bworICBwcm9wYWdhdGUuICBUaGUgd29yc3QgY29uc2VxdWVuY2Ugd2FzIHRoYXQsIGluIHJhcmUgY2FzZXMsIDxmIGFuZCA+ZgorICBjb3VsZCBwcm9kdWNlIHN0cmluZ3MgdGhhdCwgd2hlbiB1bnBhY2tlZCBhZ2Fpbiwgd2VyZSBhIGZhY3RvciBvZiAyCisgIGF3YXkgZnJvbSB0aGUgb3JpZ2luYWwgZmxvYXQuICBUaGlzIGhhcyBiZWVuIGZpeGVkLiAgU2VlIFNGIGJ1ZworICAjNzA1ODM2LgorCistIE5ldyBmdW5jdGlvbiB0aW1lLnR6c2V0KCkgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBDIGxpYnJhcnkgdHpzZXQoKQorICBmdW5jdGlvbiwgaWYgc3VwcG9ydGVkLiAgKFNGIHBhdGNoICM2NzU0MjIuKQorCistIFVzaW5nIGNyZWF0ZWZpbGVoYW5kbGVyLCBkZWxldGVmaWxlaGFuZGxlciwgY3JlYXRldGltZXJoYW5kbGVyIGZ1bmN0aW9ucworICBvbiBUa2ludGVyLnRraW50ZXIgKF90a2ludGVyIG1vZHVsZSkgbm8gbG9uZ2VyIGNyYXNoZXMgdGhlIGludGVycHJldGVyLgorICBTZWUgU0YgYnVnICM2OTI0MTYuCisKKy0gTW9kaWZpZWQgdGhlIGZjbnRsLmlvY3RsKCkgZnVuY3Rpb24gdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGEgcGFzc2VkCisgIG11dGFibGUgYnVmZmVyIChmb3IgZGV0YWlscyBzZWUgdGhlIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uKS4KKworLSBNYWRlIHVzZXIgcmVxdWVzdGVkIGNoYW5nZXMgdG8gdGhlIGl0ZXJ0b29scyBtb2R1bGUuCisgIFN1YnN1bWVkIHRoZSB0aW1lcygpIGZ1bmN0aW9uIGludG8gcmVwZWF0KCkuCisgIEFkZGVkIGNoYWluKCkgYW5kIGN5Y2xlKCkuCisKKy0gVGhlIHJvdG9yIG1vZHVsZSBpcyBub3cgZGVwcmVjYXRlZDsgdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtIGl0IHVzZXMKKyAgaXMgbm90IGJlbGlldmVkIHRvIGJlIHNlY3VyZSwgYW5kIGluY2x1ZGluZyBjcnlwdG8gY29kZSB3aXRoIFB5dGhvbgorICBoYXMgaW1wbGljYXRpb25zIGZvciBleHBvcnRpbmcgYW5kIGltcG9ydGluZyBpdCBpbiB2YXJpb3VzIGNvdW50cmllcy4KKworLSBUaGUgc29ja2V0IG1vZHVsZSBub3cgYWx3YXlzIHVzZXMgdGhlIF9zb2NrZXRvYmplY3Qgd3JhcHBlciBjbGFzcywgZXZlbiBvbgorICBwbGF0Zm9ybXMgd2hpY2ggaGF2ZSBkdXAoMikuICBUaGUgbWFrZWZpbGUoKSBtZXRob2QgaXMgYnVpbHQgZGlyZWN0bHkKKyAgb24gdG9wIG9mIHRoZSBzb2NrZXQgd2l0aG91dCBkdXBsaWNhdGluZyB0aGUgZmlsZSBkZXNjcmlwdG9yLCBhbGxvd2luZworICB0aW1lb3V0cyB0byB3b3JrIHByb3Blcmx5LgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gTmV3IGdlbmVyYXRvciBmdW5jdGlvbiBvcy53YWxrKCkgaXMgYW4gZWFzeS10by11c2UgYWx0ZXJuYXRpdmUgdG8KKyAgb3MucGF0aC53YWxrKCkuICBTZWUgb3MgbW9kdWxlIGRvY3MgZm9yIGRldGFpbHMuICBvcy5wYXRoLndhbGsoKQorICBpc24ndCBkZXByZWNhdGVkIGF0IHRoaXMgdGltZSwgYnV0IG1heSBiZWNvbWUgZGVwcmVjYXRlZCBpbiBhCisgIGZ1dHVyZSByZWxlYXNlLgorCistIEFkZGVkIG5ldyBtb2R1bGUgInBsYXRmb3JtIiB3aGljaCBwcm92aWRlcyBhIHdpZGUgcmFuZ2Ugb2YgdG9vbHMKKyAgZm9yIHF1ZXJ5aW5nIHBsYXRmb3JtIGRlcGVuZGVudCBmZWF0dXJlcy4KKworLSBuZXRyYyBub3cgYWxsb3dzIEFTQ0lJIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMgaW4gcGFzc3dvcmRzLgorCistIHNoZWx2ZSBub3cgc3VwcG9ydHMgdGhlIG9wdGlvbmFsIHdyaXRlYmFjayBhcmd1bWVudCwgYW5kIGV4cG9zZXMKKyAgcGlja2xlIHByb3RvY29sIHZlcnNpb25zLgorCistIFNldmVyYWwgbWV0aG9kcyBvZiBubnRwbGliLk5OVFAgaGF2ZSBncm93biBhbiBvcHRpb25hbCBmaWxlIGFyZ3VtZW50CisgIHdoaWNoIHNwZWNpZmllcyBhIGZpbGUgd2hlcmUgdG8gZGl2ZXJ0IHRoZSBjb21tYW5kJ3Mgb3V0cHV0CisgIChhbHJlYWR5IHN1cHBvcnRlZCBieSB0aGUgYm9keSgpIG1ldGhvZCkuICAoU0YgcGF0Y2ggIzcyMDQ2OCkKKworLSBUaGUgc2VsZi1kb2N1bWVudGluZyBYTUwgc2VydmVyIGxpYnJhcnkgRG9jWE1MUlBDU2VydmVyIHdhcyBhZGRlZC4KKworLSBTdXBwb3J0IGZvciBpbnRlcm5hdGlvbmFsaXplZCBkb21haW4gbmFtZXMgaGFzIGJlZW4gYWRkZWQgdGhyb3VnaAorICB0aGUgJ2lkbmEnIGFuZCAncHVueWNvZGUnIGVuY29kaW5ncywgdGhlICdzdHJpbmdwcmVwJyBtb2R1bGUsIHRoZQorICAnbWtzdHJpbmdwcmVwJyB0b29sLCBhbmQgZW5oYW5jZW1lbnRzIHRvIHRoZSBzb2NrZXQgYW5kIGh0dHBsaWIKKyAgbW9kdWxlcy4KKworLSBodG1sZW50aXR5ZGVmcyBoYXMgdHdvIG5ldyBkaWN0aW9uYXJpZXM6IG5hbWUyY29kZXBvaW50IG1hcHMKKyAgSFRNTCBlbnRpdHkgbmFtZXMgdG8gVW5pY29kZSBjb2RlcG9pbnRzIChhcyBpbnRlZ2VycykuCisgIGNvZGVwb2ludDJuYW1lIGlzIHRoZSByZXZlcnNlIG1hcHBpbmcuIFNlZSBTRiBwYXRjaCAjNzIyMDE3LgorCistIHBkYiBoYXMgYSBuZXcgY29tbWFuZCwgImRlYnVnIiwgd2hpY2ggbGV0cyB5b3Ugc3RlcCB0aHJvdWdoCisgIGFyYml0cmFyeSBjb2RlIGZyb20gdGhlIGRlYnVnZ2VyJ3MgKHBkYikgcHJvbXB0LgorCistIHVuaXR0ZXN0LmZhaWxVbmxlc3NFcXVhbCBhbmQgaXRzIGVxdWl2YWxlbnQgdW5pdHRlc3QuYXNzZXJ0RXF1YWwgbm93CisgIHJldHVybiAnbm90IGEgPT0gYicgcmF0aGVyIHRoYW4gJ2EgIT0gYicuICBUaGlzIGdpdmVzIHRoZSBkZXNpcmVkCisgIHJlc3VsdCBmb3IgY2xhc3NlcyB0aGF0IGRlZmluZSBfX2VxX18gd2l0aG91dCBkZWZpbmluZyBfX25lX18uCisKKy0gc2dtbGxpYiBub3cgc3VwcG9ydHMgU0dNTCBtYXJrZWQgc2VjdGlvbnMsIGluIHBhcnRpY3VsYXIgdGhlCisgIE1TIE9mZmljZSBleHRlbnNpb25zLgorCistIFRoZSB1cmxsaWIgbW9kdWxlIG5vdyBvZmZlcnMgc3VwcG9ydCBmb3IgdGhlIGl0ZXJhdG9yIHByb3RvY29sLgorICBTRiBwYXRjaCA2OTg1MjAgY29udHJpYnV0ZWQgYnkgQnJldHQgQ2Fubm9uLgorCistIE5ldyBtb2R1bGUgdGltZWl0IHByb3ZpZGVzIGEgc2ltcGxlIGZyYW1ld29yayBmb3IgdGltaW5nIHRoZQorICBleGVjdXRpb24gc3BlZWQgb2YgZXhwcmVzc2lvbnMgYW5kIHN0YXRlbWVudHMuCisKKy0gc2V0cy5TZXQgb2JqZWN0cyBub3cgc3VwcG9ydCBtaXhlZC10eXBlIF9fZXFfXyBhbmQgX19uZV9fLCBpbnN0ZWFkCisgIG9mIHJhaXNpbmcgVHlwZUVycm9yLiAgSWYgeCBpcyBhIFNldCBvYmplY3QgYW5kIHkgaXMgYSBub24tU2V0IG9iamVjdCwKKyAgeCA9PSB5IGlzIEZhbHNlLCBhbmQgeCAhPSB5IGlzIFRydWUuICBUaGlzIGlzIGFraW4gdG8gdGhlIGNoYW5nZSBtYWRlCisgIGZvciBtaXhlZC10eXBlIGNvbXBhcmlzb25zIG9mIGRhdGV0aW1lIG9iamVjdHMgaW4gMi4zYTI7IG1vcmUgaW5mbworICBhYm91dCB0aGUgcmF0aW9uYWxlIGlzIGluIHRoZSBORVdTIGVudHJ5IGZvciB0aGF0LiAgU2VlIGFsc28gU0YgYnVnCisgIHJlcG9ydCA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzY5MzEyMT4uCisKKy0gT24gVW5peCBwbGF0Zm9ybXMsIGlmIG9zLmxpc3RkaXIoKSBpcyBjYWxsZWQgd2l0aCBhIFVuaWNvZGUgYXJndW1lbnQsCisgIGl0IG5vdyByZXR1cm5zIFVuaWNvZGUgc3RyaW5ncy4gIChUaGlzIGJlaGF2aW9yIHdhcyBhZGRlZCBlYXJsaWVyCisgIHRvIHRoZSBXaW5kb3dzIE5ULzJrL1hQIHZlcnNpb24gb2Ygb3MubGlzdGRpcigpLikKKworLSBEaXN0dXRpbHM6IGJvdGggJ3B5X21vZHVsZXMnIGFuZCAncGFja2FnZXMnIGtleXdvcmRzIGNhbiBub3cgYmUgc3BlY2lmaWVkCisgIGluIGNvcmUuc2V0dXAoKS4gIFByZXZpb3VzbHkgeW91IGNvdWxkIHN1cHBseSBvbmUgb3IgdGhlIG90aGVyLCBidXQKKyAgbm90IGJvdGggb2YgdGhlbS4gIChTRiBwYXRjaCAjNjk1MDkwIGZyb20gQmVybmhhcmQgSGVyem9nKQorCistIE5ldyBjc3YgcGFja2FnZSBtYWtlcyBpdCBlYXN5IHRvIHJlYWQvd3JpdGUgQ1NWIGZpbGVzLgorCistIE1vZHVsZSBzaGxleCBoYXMgYmVlbiBleHRlbmRlZCB0byBhbGxvdyBwb3NpeC1saWtlIHNoZWxsIHBhcnNpbmdzLAorICBpbmNsdWRpbmcgYSBzcGxpdCgpIGZ1bmN0aW9uIGZvciBlYXN5IHNwbGl0aW5nIG9mIHF1b3RlZCBzdHJpbmdzIGFuZAorICBjb21tYW5kcy4gQW4gaXRlcmF0b3IgaW50ZXJmYWNlIHdhcyBhbHNvIGltcGxlbWVudGVkLgorCitUb29scy9EZW1vcworLS0tLS0tLS0tLS0KKworLSBOZXcgc2NyaXB0IGNvbWJpbmVyZWZzLnB5IGhlbHBzIGFuYWx5emUgbmV3IFBZVEhPTkRVTVBSRUZTIG91dHB1dC4KKyAgU2VlIHRoZSBtb2R1bGUgZG9jc3RyaW5nIGZvciBkZXRhaWxzLgorCitCdWlsZAorLS0tLS0KKworLSBGaXggcHJvYmxlbSBidWlsZGluZyBvbiBPU0YxIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG9ubHkgYWNjZXB0ZWQKKyAgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdGhhdCBzdGFydCBpbiBjb2x1bW4gMS4gIChTRiBidWcgIzY5MTc5My4pCisKK0MgQVBJCistLS0tLQorCistIEFkZGVkIFB5R0NfQ29sbGVjdCgpLCBlcXVpdmFsZW50IHRvIGNhbGxpbmcgZ2MuY29sbGVjdCgpLgorCistIFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpIHdhcyBjaGFuZ2VkIG5vdCB0byByYWlzZSBhbiBleGNlcHRpb24gb3IKKyAgaXNzdWUgYSBmYXRhbCBlcnJvciB3aGVuIG5vIGN1cnJlbnQgdGhyZWFkIHN0YXRlIGlzIGF2YWlsYWJsZS4gIFRoaXMKKyAgbWFrZXMgaXQgcG9zc2libGUgdG8gcHJpbnQgZGljdGlvbmFyaWVzIHdoZW4gbm8gdGhyZWFkIGlzIGFjdGl2ZS4KKworLSBMT05HX0xPTkcgd2FzIHJlbmFtZWQgdG8gUFlfTE9OR19MT05HLiAgRXh0ZW5zaW9ucyB0aGF0IHVzZSB0aGlzIGFuZAorICBuZWVkIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBjYW4gdXNlIHRoaXM6CisKKyAgICAjaWZuZGVmICBQWV9MT05HX0xPTkcKKyAgICAjZGVmaW5lICBQWV9MT05HX0xPTkcgIExPTkdfTE9ORworICAgICNlbmRpZgorCistIEFkZGVkIFB5T2JqZWN0X1NlbGZJdGVyKCkgdG8gZmlsbCB0aGUgdHBfaXRlciBzbG90IGZvciB0aGUKKyAgdHlwaWNhbCBjYXNlIHdoZXJlIHRoZSBtZXRob2QgcmV0dXJucyBpdHMgc2VsZiBhcmd1bWVudC4KKworLSBUaGUgZXh0ZW5kZWQgdHlwZSBzdHJ1Y3R1cmUgdXNlZCBmb3IgaGVhcCB0eXBlcyAobmV3LXN0eWxlCisgIGNsYXNzZXMgZGVmaW5lZCBieSBQeXRob24gY29kZSB1c2luZyBhIGNsYXNzIHN0YXRlbWVudCkgaXMgbm93CisgIGV4cG9ydGVkIGZyb20gb2JqZWN0LmggYXMgUHlIZWFwVHlwZU9iamVjdC4gIChTRiBwYXRjaCAjNjk2MTkzLikKKworTmV3IHBsYXRmb3JtcworLS0tLS0tLS0tLS0tLQorCitOb25lIHRoaXMgdGltZS4KKworVGVzdHMKKy0tLS0tCisKKy0gdGVzdF90aW1lb3V0IG5vdyByZXF1aXJlcyAtdSBuZXR3b3JrIHRvIGJlIHBhc3NlZCB0byByZWdydGVzdCB0byBydW4uCisgIFNlZSBTRiBidWcgIzY5Mjk4OC4KKworV2luZG93cworLS0tLS0tLQorCistIG9zLmZzeW5jKCkgbm93IGV4aXN0cyBvbiBXaW5kb3dzLCBhbmQgY2FsbHMgdGhlIE1pY3Jvc29mdCBfY29tbWl0KCkKKyAgZnVuY3Rpb24uCisKKy0gTmV3IGZ1bmN0aW9uIHdpbnNvdW5kLk1lc3NhZ2VCZWVwKCkgd3JhcHMgdGhlIFdpbjMyIEFQSQorICBNZXNzYWdlQmVlcCgpLgorCitNYWMKKy0tLQorCistIG9zLmxpc3RkaXIoKSBub3cgcmV0dXJucyBVbmljb2RlIHN0cmluZ3Mgb24gTWFjT1MgWCB3aGVuIGNhbGxlZCB3aXRoCisgIGEgVW5pY29kZSBhcmd1bWVudC4gU2VlIHRoZSBnZW5lcmFsIG5ld3MgaXRlbSB1bmRlciAiTGlicmFyeSIuCisKKy0gQSBuZXcgbWV0aG9kIE1hY09TLldNQXZhaWxhYmxlKCkgcmV0dXJucyB0cnVlIGlmIGl0IGlzIHNhZmUgdG8gYWNjZXNzCisgIHRoZSB3aW5kb3cgbWFuYWdlciwgZmFsc2Ugb3RoZXJ3aXNlLgorCistIEVhc3lEaWFsb2dzIGRpYWxvZ3MgYXJlIG5vdyBtb3ZhYmxlLW1vZGFsLCBhbmQgaWYgdGhlIGFwcGxpY2F0aW9uIGlzCisgIGN1cnJlbnRseSBpbiB0aGUgYmFja2dyb3VuZCB0aGV5IHdpbGwgYXNrIHRvIGJlIG1vdmVkIHRvIHRoZSBmb3JlZ3JvdW5kCisgIGJlZm9yZSBkaXNwbGF5aW5nLgorCistIE9TQSBTY3JpcHRpbmcgc3VwcG9ydCBoYXMgaW1wcm92ZWQgYSBsb3QsIGFuZCBnZW5zdWl0ZW1vZHVsZS5weSBjYW4gbm93CisgIGJlIHVzZWQgYnkgbWVyZSBtb3J0YWxzLiBUaGUgZG9jdW1lbnRhdGlvbiBpcyBub3cgYWxzbyBtb3JlIG9yIGxlc3MKKyAgY29tcGxldGUuCisKKy0gVGhlIElERSAoaW4gYSBmcmFtZXdvcmsgYnVpbGQpIG5vdyBpbmNsdWRlcyBpbnRyb2R1Y3RvcnkgZG9jdW1lbnRhdGlvbgorICBpbiBBcHBsZSBIZWxwIFZpZXdlciBmb3JtYXQuCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4zIGFscGhhIDI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMTktRmViLTIwMDMqCisKK0NvcmUgYW5kIGJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIE5lZ2F0aXZlIHBvc2l0aW9ucyByZXR1cm5lZCBmcm9tIFBFUCAyOTMgZXJyb3IgY2FsbGJhY2tzIGFyZSBub3cKKyAgdHJlYXRlZCBhcyBiZWluZyByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcuIFBvc2l0aW9ucworICB0aGF0IGFyZSBvdXQgb2YgYm91bmRzIHJhaXNlIGFuIEluZGV4RXJyb3IuCisKKy0gc3lzLnBhdGhbMF0gKHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0aGUgc2NyaXB0IGlzIGxvYWRlZCkgaXMgbm93CisgIHR1cm5lZCBpbnRvIGFuIGFic29sdXRlIHBhdGhuYW1lLCB1bmxlc3MgaXQgaXMgdGhlIGVtcHR5IHN0cmluZy4KKyAgKFNGIHBhdGNoICM2NjQzNzYuKQorCistIEZpbmFsbHkgZml4ZWQgdGhlIGJ1ZyBpbiBjb21waWxlKCkgYW5kIGV4ZWMgd2hlcmUgYSBzdHJpbmcgZW5kaW5nCisgIHdpdGggYW4gaW5kZW50ZWQgY29kZSBibG9jayBidXQgbm8gbmV3bGluZSB3b3VsZCByYWlzZSBTeW50YXhFcnJvci4KKyAgVGhpcyB3b3VsZCBoYXZlIGJlZW4gYSBmb3VyLWxpbmUgY2hhbmdlIGluIHBhcnNldG9rLmMuLi4gIEV4Y2VwdAorICBjb2Rlb3AucHkgZGVwZW5kcyBvbiB0aGlzIGJlaGF2aW9yLCBzbyBhIGNvbXBpbGF0aW9uIGZsYWcgaGFkIHRvIGJlCisgIGludmVudGVkIHRoYXQgY2F1c2VzIHRoZSB0b2tlbml6ZXIgdG8gcmV2ZXJ0IHRvIHRoZSBvbGQgYmVoYXZpb3I7CisgIHRoaXMgcmVxdWlyZWQgZXh0cmEgY2hhbmdlcyB0byAyIC5oIGZpbGVzLCAyIC5jIGZpbGVzLCBhbmQgMiAucHkKKyAgZmlsZXMuICAoRml4ZXMgU0YgYnVnICM1MDE2MjIuKQorCistIElmIGEgbmV3LXN0eWxlIGNsYXNzIGRlZmluZXMgbmVpdGhlciBfX25ld19fIG5vciBfX2luaXRfXywgaXRzCisgIGNvbnN0cnVjdG9yIHdvdWxkIGlnbm9yZSBhbGwgYXJndW1lbnRzLiAgVGhpcyBpcyBjaGFuZ2VkIG5vdzogdGhlCisgIGNvbnN0cnVjdG9yIHJlZnVzZXMgYXJndW1lbnRzIGluIHRoaXMgY2FzZS4gIFRoaXMgbWlnaHQgYnJlYWsgY29kZQorICB0aGF0IHdvcmtlZCB1bmRlciBQeXRob24gMi4yLiAgVGhlIHNpbXBsZXN0IGZpeCBpcyB0byBhZGQgYSBuby1vcAorICBfX2luaXRfXzogYGBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOiBwYXNzYGAuCisKKy0gVGhyb3VnaCBhIGJ5dGVjb2RlIG9wdGltaXplciBidWcgKGFuZCBJIGJldCB5b3UgZGlkbid0IGV2ZW4ga25vdworICBQeXRob24gKmhhZCogYSBieXRlY29kZSBvcHRpbWl6ZXIgOi0pLCAidW5zaWduZWQiIGhleC9vY3QgY29uc3RhbnRzCisgIHdpdGggYSBsZWFkaW5nIG1pbnVzIHNpZ24gd291bGQgY29tZSBvdXQgd2l0aCB0aGUgd3Jvbmcgc2lnbi4KKyAgKCJVbnNpZ25lZCIgaGV4L29jdCBjb25zdGFudHMgYXJlIHRob3NlIHdpdGggYSBmYWNlIHZhbHVlIGluIHRoZQorICByYW5nZSBzeXMubWF4aW50KzEgdGhyb3VnaCBzeXMubWF4aW50KjIrMSwgaW5jbHVzaXZlOyB0aGVzZSBoYXZlCisgIGFsd2F5cyBiZWVuIGludGVycHJldGVkIGFzIG5lZ2F0aXZlIG51bWJlcnMgdGhyb3VnaCBzaWduIGZvbGRpbmcuKQorICBFLmcuIDB4ZmZmZmZmZmYgaXMgLTEsIGFuZCAtKDB4ZmZmZmZmZmYpIGlzIDEsIGJ1dCAtMHhmZmZmZmZmZiB3b3VsZAorICBjb21lIG91dCBhcyAtNDI5NDk2NzI5NS4gIFRoaXMgd2FzIHRoZSBjYXNlIGluIFB5dGhvbiAyLjIgdGhyb3VnaAorICAyLjIuMiBhbmQgMi4zYTEsIGFuZCBpbiBQeXRob24gMi40IGl0IHdpbGwgb25jZSBhZ2FpbiBoYXZlIHRoYXQKKyAgdmFsdWUsIGJ1dCBhY2NvcmRpbmcgdG8gUEVQIDIzNyBpdCByZWFsbHkgbmVlZHMgdG8gYmUgMSBub3cuICBUaGlzCisgIHdpbGwgYmUgYmFja3BvcnRlZCB0byBQeXRob24gMi4yLjMgYSB3ZWxsLiAgKFNGICM2NjA0NTUpCisKKy0gaW50KHMsIGJhc2UpIHNvbWV0aW1lcyBzaWduLWZvbGRzIGhleCBhbmQgb2N0IGNvbnN0YW50czsgaXQgb25seQorICBkb2VzIHRoaXMgd2hlbiBiYXNlIGlzIDAgYW5kIHMuc3RyaXAoKSBzdGFydHMgd2l0aCBhICcwJy4gIFdoZW4gdGhlCisgIHNpZ24gaXMgYWN0dWFsbHkgZm9sZGVkLCBhcyBpbiBpbnQoIjB4ZmZmZmZmZmYiLCAwKSBvbiBhIDMyLWJpdAorICBtYWNoaW5lLCB3aGljaCByZXR1cm5zIC0xLCBhIEZ1dHVyZVdhcm5pbmcgaXMgbm93IGlzc3VlZDsgaW4gUHl0aG9uCisgIDIuNCwgdGhpcyB3aWxsIHJldHVybiA0Mjk0OTY3Mjk1TCwgYXMgZG8gaW50KCIrMHhmZmZmZmZmZiIsIDApIGFuZAorICBpbnQoIjB4ZmZmZmZmZmYiLCAxNikgcmlnaHQgbm93LiAgKFBFUCAzNDcpCisKKy0gc3VwZXIoWCwgeCk6IHggbWF5IG5vdyBiZSBhIHByb3h5IGZvciBhbiBYIGluc3RhbmNlLCBpLmUuCisgIGlzc3ViY2xhc3MoeC5fX2NsYXNzX18sIFgpIGJ1dCBub3QgaXNzdWJjbGFzcyh0eXBlKHgpLCBYKS4KKworLSBpc2luc3RhbmNlKHgsIFgpOiBpZiBYIGlzIGEgbmV3LXN0eWxlIGNsYXNzLCB0aGlzIGlzIG5vdyBlcXVpdmFsZW50CisgIHRvIGlzc3ViY2xhc3ModHlwZSh4KSwgWCkgb3IgaXNzdWJjbGFzcyh4Ll9fY2xhc3NfXywgWCkuICBQcmV2aW91c2x5CisgIG9ubHkgdHlwZSh4KSB3YXMgdGVzdGVkLiAgKEZvciBjbGFzc2ljIGNsYXNzZXMgdGhpcyB3YXMgYWxyZWFkeSB0aGUKKyAgY2FzZS4pCisKKy0gY29tcGlsZSgpLCBldmFsKCkgYW5kIHRoZSBleGVjIHN0YXRlbWVudCBub3cgZnVsbHkgc3VwcG9ydCBzb3VyY2UgY29kZQorICBwYXNzZWQgYXMgdW5pY29kZSBzdHJpbmdzLgorCistIGludCBzdWJjbGFzc2VzIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIGxvbmdzIGlmIHRoZSB2YWx1ZSBmaXRzIGluIGFuIGludC4KKyAgU2VlIFNGIGJ1ZyAjNjgzNDY3LgorCistIGxvbmcoc3RyaW5nLCBiYXNlKSB0YWtlcyB0aW1lIGxpbmVhciBpbiBsZW4oc3RyaW5nKSB3aGVuIGJhc2UgaXMgYSBwb3dlcgorICBvZiAyIG5vdy4gIEl0IHVzZWQgdG8gdGFrZSB0aW1lIHF1YWRyYXRpYyBpbiBsZW4oc3RyaW5nKS4KKworLSBmaWx0ZXIgcmV0dXJucyBub3cgVW5pY29kZSByZXN1bHRzIGZvciBVbmljb2RlIGFyZ3VtZW50cy4KKworLSByYXdfaW5wdXQgY2FuIG5vdyByZXR1cm4gVW5pY29kZSBvYmplY3RzLgorCistIExpc3Qgb2JqZWN0cycgc29ydCgpIG1ldGhvZCBub3cgYWNjZXB0cyBOb25lIGFzIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLgorICBQYXNzaW5nIE5vbmUgaXMgc2VtYW50aWNhbGx5IGlkZW50aWNhbCB0byBjYWxsaW5nIHNvcnQoKSB3aXRoIG5vCisgIGFyZ3VtZW50cy4KKworLSBGaXhlZCBjcmFzaCB3aGVuIHByaW50aW5nIGEgc3ViY2xhc3Mgb2Ygc3RyIGFuZCBfX3N0cl9fIHJldHVybmVkIHNlbGYuCisgIFNlZSBTRiBidWcgIzY2NzE0Ny4KKworLSBGaXhlZCBhbiBpbnZhbGlkIFJ1bnRpbWVXYXJuaW5nIGFuZCBhbiB1bmRldGVjdGVkIGVycm9yIHdoZW4gdHJ5aW5nCisgIHRvIGNvbnZlcnQgYSBsb25nIGludGVnZXIgaW50byBhIGZsb2F0IHdoaWNoIGNvdWxkbid0IGZpdC4KKyAgU2VlIFNGIGJ1ZyAjNjc2MTU1LgorCistIEZ1bmN0aW9uIG9iamVjdHMgbm93IGhhdmUgYSBfX21vZHVsZV9fIGF0dHJpYnV0ZSB0aGF0IGlzIGJvdW5kIHRvCisgIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLiAgVGhpcworICBhcHBsaWVzIGZvciBDIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcyBhcyB3ZWxsIGFzIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcworICBkZWZpbmVkIGluIFB5dGhvbi4gIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgYnkgcGlja2xlLndoaWNobW9kdWxlKCksCisgIHdoaWNoIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIHdoaWNobW9kdWxlIHNsaWdodGx5LiAgSW4gUHl0aG9uIDIuMgorICB3aGljaG1vZHVsZSgpIHJldHVybnMgIl9fbWFpbl9fIiBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBkZWZpbmVkCisgIGF0IHRoZSB0b3AtbGV2ZWwgb2YgYSBtb2R1bGUgKGV4YW1wbGVzOiBtZXRob2RzLCBuZXN0ZWQgZnVuY3Rpb25zKS4KKyAgTm93IHdoaWNobW9kdWxlKCkgd2lsbCByZXR1cm4gdGhlIHByb3BlciBtb2R1bGUgbmFtZS4KKworRXh0ZW5zaW9uIG1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gb3BlcmF0b3IuaXNOdW1iZXJUeXBlKCkgbm93IGNoZWNrcyB0aGF0IHRoZSBvYmplY3QgaGFzIGEgbmJfaW50IG9yCisgIG5iX2Zsb2F0IHNsb3QsIHJhdGhlciB0aGFuIHNpbXBseSBjaGVja2luZyB3aGV0aGVyIGl0IGhhcyBhIG5vbi1OVUxMCisgIHRwX2FzX251bWJlciBwb2ludGVyLgorCistIFRoZSBpbXAgbW9kdWxlIG5vdyBoYXMgd2F5cyB0byBhY3F1aXJlIGFuZCByZWxlYXNlIHRoZSAiaW1wb3J0CisgIGxvY2siOiBpbXAuYWNxdWlyZV9sb2NrKCkgYW5kIGltcC5yZWxlYXNlX2xvY2soKS4gIE5vdGU6IHRoaXMgaXMgYQorICByZWVudHJhbnQgbG9jaywgc28gcmVsZWFzaW5nIHRoZSBsb2NrIG9ubHkgdHJ1bHkgcmVsZWFzZXMgaXQgd2hlbgorICB0aGlzIGlzIHRoZSBsYXN0IHJlbGVhc2VfbG9jaygpIGNhbGwuICBZb3UgY2FuIGNoZWNrIHdpdGgKKyAgaW1wLmxvY2tfaGVsZCgpLiAgKFNGIGJ1ZyAjNTgwOTUyIGFuZCBwYXRjaCAjNjgzMjU3LikKKworLSBDaGFuZ2UgdG8gY1BpY2tsZSB0byBtYXRjaCBwaWNrbGUucHkgKHNlZSBiZWxvdyBhbmQgUEVQIDMwNykuCisKKy0gRml4IHNvbWUgYnVncyBpbiB0aGUgcGFyc2VyIG1vZHVsZS4gIFNGIGJ1ZyAjNjc4NTE4LgorCistIFRoYW5rcyB0byBTY290dCBEYXZpZCBEYW5pZWxzLCBhIHN1YnRsZSBidWcgaW4gaG93IHRoZSB6bGliCisgIGV4dGVuc2lvbiBpbXBsZW1lbnRlZCBmbHVzaCgpIHdhcyBmaXhlZC4gIFNjb3R0IGFsc28gcmV3cm90ZSB0aGUKKyAgemxpYiB0ZXN0IHN1aXRlIHVzaW5nIHRoZSB1bml0dGVzdCBtb2R1bGUuICAoU0YgYnVnICM2NDAyMzAgYW5kCisgIHBhdGNoICM2Nzg1MzEuKQorCistIEFkZGVkIGFuIGl0ZXJ0b29scyBtb2R1bGUgY29udGFpbmluZyBoaWdoIHNwZWVkLCBtZW1vcnkgZWZmaWNpZW50CisgIGxvb3BpbmcgY29uc3RydWN0cyBpbnNwaXJlZCBieSB0b29scyBmcm9tIEhhc2tlbGwgYW5kIFNNTC4KKworLSBUaGUgU1NMIG1vZHVsZSBub3cgaGFuZGxlcyBzb2NrZXRzIHdpdGggYSB0aW1lb3V0IHNldCBjb3JyZWN0bHkgKFNGCisgIHBhdGNoICM2NzU3NTAsIGZpeGluZyBTRiBidWcgIzY3NTU1MikuCisKKy0gb3MvcG9zaXhtb2R1bGUgaGFzIGdyb3duIHRoZSBzeXNleGl0cy5oIGNvbnN0YW50cyAoRVhfT0sgYW5kIGZyaWVuZHMpLgorCistIEZpeGVkIGJyb2tlbiB0aHJlYWRzdGF0ZSBzd2FwIGluIHJlYWRsaW5lIHRoYXQgY291bGQgY2F1c2UgZmF0YWwKKyAgZXJyb3JzIHdoZW4gYSByZWFkbGluZSBob29rIHdhcyBiZWluZyBpbnZva2VkIHdoaWxlIGEgYmFja2dyb3VuZAorICB0aHJlYWQgd2FzIGFjdGl2ZS4gIChTRiBidWdzICM2NjA0NzYgYW5kICM1MTMwMzMuKQorCistIGZjbnRsIG5vdyBleHBvc2VzIHRoZSBzdHJvcHMuaCBJXyogY29uc3RhbnRzLgorCistIEZpeCBhIGNyYXNoIG9uIFNvbGFyaXMgdGhhdCBvY2N1cnJlZCB3aGVuIGNhbGxpbmcgY2xvc2UoKSBvbgorICBhbiBtbWFwJ2VkIGZpbGUgd2hpY2ggd2FzIGFscmVhZHkgY2xvc2VkLiAgKFNGIHBhdGNoICM2NjU5MTMpCisKKy0gRml4ZWQgc2V2ZXJhbCBzZXJpb3VzIGJ1Z3MgaW4gdGhlIHppcGltcG9ydCBpbXBsZW1lbnRhdGlvbi4KKworLSBkYXRldGltZSBjaGFuZ2VzOgorCisgIFRoZSBkYXRlIGNsYXNzIGlzIG5vdyBwcm9wZXJseSBzdWJjbGFzc2FibGUuICAoU0YgYnVnICM3MjA5MDgpCisKKyAgVGhlIGRhdGV0aW1lIGFuZCBkYXRldGltZXR6IGNsYXNzZXMgaGF2ZSBiZWVuIGNvbGxhcHNlZCBpbnRvIGEgc2luZ2xlCisgIGRhdGV0aW1lIGNsYXNzLCBhbmQgbGlrZXdpc2UgdGhlIHRpbWUgYW5kIHRpbWV0eiBjbGFzc2VzIGludG8gYSBzaW5nbGUKKyAgdGltZSBjbGFzcy4gIFByZXZpb3VzbHksIGEgZGF0ZXRpbWV0eiBvYmplY3Qgd2l0aCB0emluZm89Tm9uZSBhY3RlZAorICBleGFjdGx5IGxpa2UgYSBkYXRldGltZSBvYmplY3QsIGFuZCBzaW1pbGFybHkgZm9yIHRpbWV0ei4gIFRoaXMgd2Fzbid0CisgIGVub3VnaCBvZiBhIGRpZmZlcmVuY2UgdG8ganVzdGlmeSBkaXN0aW5jdCBjbGFzc2VzLCBhbmQgbGlmZSBpcyBzaW1wbGVyCisgIG5vdy4KKworICB0b2RheSgpIGFuZCBub3coKSBub3cgcm91bmQgc3lzdGVtIHRpbWVzdGFtcHMgdG8gdGhlIGNsb3Nlc3QKKyAgbWljcm9zZWNvbmQgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi82NjEwODY+LiAgVGhpcyByZXBhaXJzIGFuCisgIGlycml0YXRpb24gbW9zdCBsaWtlbHkgc2VlbiBvbiBXaW5kb3dzIHN5c3RlbXMuCisKKyAgSW4gZHQuYXN0aW1lem9uZSh0eiksIGlmIHR6LnV0Y29mZnNldChkdCkgcmV0dXJucyBhIGR1cmF0aW9uLAorICBWYWx1ZUVycm9yIGlzIHJhaXNlZCBpZiB0ei5kc3QoZHQpIHJldHVybnMgTm9uZSAoMi4zYTEgdHJlYXRlZCBpdAorICBhcyAwIGluc3RlYWQsIGJ1dCBhIHR6aW5mbyBzdWJjbGFzcyB3aXNoaW5nIHRvIHBhcnRpY2lwYXRlIGluCisgIHRpbWUgem9uZSBjb252ZXJzaW9uIGhhcyB0byB0YWtlIGEgc3RhbmQgb24gd2hldGhlciBpdCBzdXBwb3J0cworICBEU1Q7IGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IERTVCwgdGhlbiBjb2RlIGRzdCgpIHRvIHJldHVybiAwIG1pbnV0ZXMsCisgIG1lYW5pbmcgdGhhdCBEU1QgaXMgbmV2ZXIgaW4gZWZmZWN0KS4KKworICBUaGUgdHppbmZvIG1ldGhvZHMgdXRjb2Zmc2V0KCkgYW5kIGRzdCgpIG11c3QgcmV0dXJuIGEgdGltZWRlbHRhIG9iamVjdAorICAob3IgTm9uZSkgbm93LiAgSW4gMi4zYTEgdGhleSBjb3VsZCBhbHNvIHJldHVybiBhbiBpbnQgb3IgbG9uZywgYnV0IHRoYXQKKyAgd2FzIGFuIHVuaGVscGZ1bGx5IHJlZHVuZGFudCBsZWZ0b3ZlciBmcm9tIGFuIGVhcmxpZXIgdmVyc2lvbiB3aGVyZWluCisgIHRoZXkgY291bGRuJ3QgcmV0dXJuIGEgdGltZWRlbHRhLiAgVE9PV1RESS4KKworICBUaGUgZXhhbXBsZSB0emluZm8gY2xhc3MgZm9yIGxvY2FsIHRpbWUgaGFkIGEgYnVnLiAgSXQgd2FzIHJlcGxhY2VkCisgIGJ5IGEgbGF0ZXIgZXhhbXBsZSBjb2RlZCBieSBHdWlkby4KKworICBkYXRldGltZS5hc3RpbWV6b25lKHR6KSBubyBsb25nZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZQorICBpbnB1dCBkYXRldGltZSBoYXMgbm8gVVRDIGVxdWl2YWxlbnQgaW4gdHouICBGb3IgdHlwaWNhbCAiaHlicmlkIiB0aW1lCisgIHpvbmVzIChhIHNpbmdsZSB0emluZm8gc3ViY2xhc3MgbW9kZWxpbmcgYm90aCBzdGFuZGFyZCBhbmQgZGF5bGlnaHQKKyAgdGltZSksIHRoaXMgY2FzZSBjYW4gYXJpc2Ugb25lIGhvdXIgcGVyIHllYXIsIGF0IHRoZSBob3VyIGRheWxpZ2h0IHRpbWUKKyAgZW5kcy4gIFNlZSBuZXcgZG9jcyBmb3IgZGV0YWlscy4gIEluIHNob3J0LCB0aGUgbmV3IGJlaGF2aW9yIG1pbWljcworICB0aGUgbG9jYWwgd2FsbCBjbG9jaydzIGJlaGF2aW9yIG9mIHJlcGVhdGluZyBhbiBob3VyIGluIGxvY2FsIHRpbWUuCisKKyAgZHQuYXN0aW1lem9uZSgpIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gbmFpdmUgYW5kIGF3YXJlCisgIGRhdGV0aW1lIG9iamVjdHMuICBJZiB5b3UgbWVyZWx5IHdhbnQgdG8gYXR0YWNoLCBvciByZW1vdmUsIGEgdHppbmZvCisgIG9iamVjdCwgd2l0aG91dCBhbnkgY29udmVyc2lvbiBvZiBkYXRlIGFuZCB0aW1lIG1lbWJlcnMsIHVzZQorICBkdC5yZXBsYWNlKHR6aW5mbz13aGF0ZXZlcikgaW5zdGVhZCwgd2hlcmUgIndoYXRldmVyIiBpcyBOb25lIG9yIGEKKyAgdHppbmZvIHN1YmNsYXNzIGluc3RhbmNlLgorCisgIEEgbmV3IG1ldGhvZCB0emluZm8uZnJvbXV0YyhkdCkgY2FuIGJlIG92ZXJyaWRkZW4gaW4gdHppbmZvIHN1YmNsYXNzZXMKKyAgdG8gZ2l2ZSBjb21wbGV0ZSBjb250cm9sIG92ZXIgaG93IGEgVVRDIHRpbWUgaXMgdG8gYmUgY29udmVydGVkIHRvCisgIGEgbG9jYWwgdGltZS4gIFRoZSBkZWZhdWx0IGFzdGltZXpvbmUoKSBpbXBsZW1lbnRhdGlvbiBjYWxscyBmcm9tdXRjKCkKKyAgYXMgaXRzIGxhc3Qgc3RlcCwgc28gYSB0emluZm8gc3ViY2xhc3MgY2FuIGFmZmVjdCB0aGF0IHRvbyBieSBvdmVycmlkaW5nCisgIGZyb211dGMoKS4gIEl0J3MgZXhwZWN0ZWQgdGhhdCB0aGUgZGVmYXVsdCBmcm9tdXRjKCkgaW1wbGVtZW50YXRpb24gd2lsbAorICBiZSBzdWl0YWJsZSBhcy1pcyBmb3IgImFsbW9zdCBhbGwiIHRpbWUgem9uZSBzdWJjbGFzc2VzLCBidXQgdGhlCisgIGNyZWF0aXZpdHkgb2YgcG9saXRpY2FsIHRpbWUgem9uZSBmaWRkbGluZyBhcHBlYXJzIHVuYm91bmRlZCAtLSBmcm9tdXRjKCkKKyAgYWxsb3dzIHRoZSBoaWdobHkgbW90aXZhdGVkIHRvIGVtdWxhdGUgYW55IHNjaGVtZSBleHByZXNzaWJsZSBpbiBQeXRob24uCisKKyAgZGF0ZXRpbWUubm93KCk6ICBUaGUgb3B0aW9uYWwgdHppbmZvIGFyZ3VtZW50IHdhcyB1bmRvY3VtZW50ZWQgKHRoYXQncworICByZXBhaXJlZCksIGFuZCBpdHMgbmFtZSB3YXMgY2hhbmdlZCB0byB0eiAoInR6aW5mbyIgaXMgb3ZlcmxvYWRlZCBlbm91Z2gKKyAgYWxyZWFkeSkuICBXaXRoIGEgdHogYXJndW1lbnQsIG5vdyh0eikgdXNlZCB0byByZXR1cm4gdGhlIGxvY2FsIGRhdGUKKyAgYW5kIHRpbWUsIGFuZCBhdHRhY2ggdHogdG8gaXQsIHdpdGhvdXQgYW55IGNvbnZlcnNpb24gb2YgZGF0ZSBhbmQgdGltZQorICBtZW1iZXJzLiAgVGhpcyB3YXMgbGVzcyB0aGFuIHVzZWZ1bC4gIE5vdyBub3codHopIHJldHVybnMgdGhlIGN1cnJlbnQKKyAgZGF0ZSBhbmQgdGltZSBhcyBsb2NhbCB0aW1lIGluIHR6J3MgdGltZSB6b25lLCBha2luIHRvIDo6CisKKyAgICAgIHR6LmZyb211dGMoZGF0ZXRpbWUudXRjbm93KCkucmVwbGFjZSh0emluZm89dXRjKSkKKworICB3aGVyZSAidXRjIiBpcyBhbiBpbnN0YW5jZSBvZiBhIHR6aW5mbyBzdWJjbGFzcyBtb2RlbGluZyBVVEMuICBXaXRob3V0CisgIGEgdHogYXJndW1lbnQsIG5vdygpIGNvbnRpbnVlcyB0byByZXR1cm4gdGhlIGN1cnJlbnQgbG9jYWwgZGF0ZSBhbmQgdGltZSwKKyAgYXMgYSBuYWl2ZSBkYXRldGltZSBvYmplY3QuCisKKyAgZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcCgpOiAgTGlrZSBkYXRldGltZS5ub3coKSBhYm92ZSwgdGhpcyBoYWQgbGVzcyB0aGFuCisgIHVzZWZ1bCBiZWhhdmlvciB3aGVuIHRoZSBvcHRpb25hbCB0aW56byBhcmd1bWVudCB3YXMgc3BlY2lmaWVkLiAgU2VlCisgIGFsc28gU0YgYnVnIHJlcG9ydCA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzY2MDg3Mj4uCisKKyAgZGF0ZSBhbmQgZGF0ZXRpbWUgY29tcGFyaXNvbjogIEluIG9yZGVyIHRvIHByZXZlbnQgY29tcGFyaXNvbiBmcm9tCisgIGZhbGxpbmcgYmFjayB0byB0aGUgZGVmYXVsdCBjb21wYXJlLW9iamVjdC1hZGRyZXNzZXMgc3RyYXRlZ3ksIHRoZXNlCisgIHJhaXNlZCBUeXBlRXJyb3Igd2hlbmV2ZXIgdGhleSBkaWRuJ3QgdW5kZXJzdGFuZCB0aGUgb3RoZXIgb2JqZWN0IHR5cGUuCisgIFRoZXkgc3RpbGwgZG8sIGV4Y2VwdCB3aGVuIHRoZSBvdGhlciBvYmplY3QgaGFzIGEgInRpbWV0dXBsZSIgYXR0cmlidXRlLAorICBpbiB3aGljaCBjYXNlIHRoZXkgcmV0dXJuIE5vdEltcGxlbWVudGVkIG5vdy4gIFRoaXMgZ2l2ZXMgb3RoZXIKKyAgZGF0ZXRpbWUgb2JqZWN0cyAoZS5nLiwgbXhEYXRlVGltZSkgYSBjaGFuY2UgdG8gaW50ZXJjZXB0IHRoZQorICBjb21wYXJpc29uLgorCisgIGRhdGUsIHRpbWUsIGRhdGV0aW1lIGFuZCB0aW1lZGVsdGEgY29tcGFyaXNvbjogIFdoZW4gdGhlIGV4Y2VwdGlvbgorICBmb3IgbWl4ZWQtdHlwZSBjb21wYXJpc29ucyBpbiB0aGUgbGFzdCBwYXJhZ3JhcGggZG9lc24ndCBhcHBseSwgaWYKKyAgdGhlIGNvbXBhcmlzb24gaXMgPT0gdGhlbiBGYWxzZSBpcyByZXR1cm5lZCwgYW5kIGlmIHRoZSBjb21wYXJpc29uIGlzCisgICE9IHRoZW4gVHJ1ZSBpcyByZXR1cm5lZC4gIEJlY2F1c2UgZGljdCBsb29rdXAgYW5kIHRoZSAiaW4iIG9wZXJhdG9yCisgIG9ubHkgaW52b2tlIF9fZXFfXywgdGhpcyBhbGxvd3MsIGZvciBleGFtcGxlLCA6OgorCisgICAgICBpZiBzb21lX2RhdGV0aW1lIGluIHNvbWVfc2VxdWVuY2U6CisKKyAgYW5kIDo6CisKKyAgICAgIHNvbWVfZGljdFtzb21lX3RpbWVkZWx0YV0gPSB3aGF0ZXZlcgorCisgIHRvIHdvcmsgYXMgZXhwZWN0ZWQsIHdpdGhvdXQgcmFpc2luZyBUeXBlRXJyb3IganVzdCBiZWNhdXNlIHRoZQorICBzZXF1ZW5jZSBpcyBoZXRlcm9nZW5lb3VzLCBvciB0aGUgZGljdCBoYXMgbWl4ZWQtdHlwZSBrZXlzLiAgW1RoaXMKKyAgc2VlbXMgbGlrZSBhIGdvb2QgaWRlYSB0byBpbXBsZW1lbnQgZm9yIGFsbCBtaXhlZC10eXBlIGNvbXBhcmlzb25zCisgIHRoYXQgZG9uJ3Qgd2FudCB0byBhbGxvdyBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uLl0KKworICBUaGUgY29uc3RydWN0b3JzIGJ1aWxkaW5nIGEgZGF0ZXRpbWUgZnJvbSBhIHRpbWVzdGFtcCBjb3VsZCByYWlzZQorICBWYWx1ZUVycm9yIGlmIHRoZSBwbGF0Zm9ybSBDIGxvY2FsdGltZSgpL2dtdGltZSgpIGluc2VydGVkICJsZWFwCisgIHNlY29uZHMiLiAgTGVhcCBzZWNvbmRzIGFyZSBpZ25vcmVkIG5vdy4gIE9uIHN1Y2ggcGxhdGZvcm1zLCBpdCdzCisgIHBvc3NpYmxlIHRvIGhhdmUgdGltZXN0YW1wcyB0aGF0IGRpZmZlciBieSBhIHNlY29uZCwgeWV0IHdoZXJlCisgIGRhdGV0aW1lcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZW0gYXJlIGVxdWFsLgorCisgIFRoZSBwaWNrbGUgZm9ybWF0IG9mIGRhdGUsIHRpbWUgYW5kIGRhdGV0aW1lIG9iamVjdHMgaGFzIGNoYW5nZWQKKyAgY29tcGxldGVseS4gIFRoZSB1bmRvY3VtZW50ZWQgcGlja2xlciBhbmQgdW5waWNrbGVyIGZ1bmN0aW9ucyBubworICBsb25nZXIgZXhpc3QuICBUaGUgdW5kb2N1bWVudGVkIF9fc2V0c3RhdGVfXygpIGFuZCBfX2dldHN0YXRlX18oKQorICBtZXRob2RzIG5vIGxvbmdlciBleGlzdCBlaXRoZXIuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBUaGUgbG9nZ2luZyBtb2R1bGUgd2FzIHVwZGF0ZWQgc2xpZ2h0bHk7IHRoZSBXQVJOIGxldmVsIHdhcyByZW5hbWVkCisgIHRvIFdBUk5JTkcsIGFuZCB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24vbWV0aG9kIHdhcm4oKSB0byB3YXJuaW5nKCkuCisKKy0gVGhlIHBpY2tsZSBhbmQgY1BpY2tsZSBtb2R1bGVzIHdlcmUgdXBkYXRlZCB3aXRoIGEgbmV3IHBpY2tsaW5nCisgIHByb3RvY29sIChkb2N1bWVudGVkIGJ5IHBpY2tsZXRvb2xzLnB5LCBzZWUgYmVsb3cpIGFuZCBzZXZlcmFsCisgIGV4dGVuc2lvbnMgdG8gdGhlIHBpY2tsZSBjdXN0b21pemF0aW9uIEFQSSAoX19yZWR1Y2VfXywgX19zZXRzdGF0ZV9fCisgIGV0Yy4pLiAgVGhlIGNvcHkgbW9kdWxlIG5vdyB1c2VzIG1vcmUgb2YgdGhlIHBpY2tsZSBjdXN0b21pemF0aW9uCisgIEFQSSB0byBjb3B5IG9iamVjdHMgdGhhdCBkb24ndCBpbXBsZW1lbnQgX19jb3B5X18gb3IgX19kZWVwY29weV9fLgorICBTZWUgUEVQIDMwNyBmb3IgZGV0YWlscy4KKworLSBUaGUgZGlzdHV0aWxzICJyZWdpc3RlciIgY29tbWFuZCBub3cgdXNlcyBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHlwaQorICBhcyB0aGUgZGVmYXVsdCByZXBvc2l0b3J5LiAgKFNlZSBQRVAgMzAxLikKKworLSB0aGUgcGxhdGZvcm0gZGVwZW5kZW50IHBhdGggcmVsYXRlZCB2YXJpYWJsZXMgc2VwLCBhbHRzZXAsIGV4dHNlcCwKKyAgcGF0aHNlcCwgY3VyZGlyLCBwYXJkaXIgYW5kIGRlZnBhdGggYXJlIG5vdyBkZWZpbmVkIGluIHRoZSBwbGF0Zm9ybQorICBkZXBlbmRlbnQgcGF0aCBtb2R1bGVzIChlLmcuIG50cGF0aC5weSkgcmF0aGVyIHRoYW4gb3MucHksIHNvIHRoZXNlCisgIHZhcmlhYmxlcyBhcmUgbm93IGF2YWlsYWJsZSB2aWEgb3MucGF0aC4gIFRoZXkgY29udGludWUgdG8gYmUKKyAgYXZhaWxhYmxlIGZyb20gdGhlIG9zIG1vZHVsZS4KKyAgKHNlZSA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzY4MDc4OT4pLgorCistIGFycmF5LmFycmF5IHdhcyBhZGRlZCB0byB0aGUgdHlwZXMgcmVwci5weSBrbm93cyBhYm91dCAoc2VlCisgIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNjgwNzg5PikuCisKKy0gVGhlIG5ldyBwaWNrbGV0b29scy5weSBjb250YWlucyBsb3RzIG9mIGRvY3VtZW50YXRpb24gYWJvdXQgcGlja2xlCisgIGludGVybmFscywgYW5kIHN1cHBsaWVzIHNvbWUgaGVscGVycyBmb3Igd29ya2luZyB3aXRoIHBpY2tsZXMsIHN1Y2ggYXMKKyAgYSBzeW1ib2xpYyBwaWNrbGUgZGlzYXNzZW1ibGVyLgorCistIFhtbHJwY2xpYi5weSBub3cgc3VwcG9ydHMgdGhlIGJ1aWx0aW4gYm9vbGVhbiB0eXBlLgorCistIHB5X2NvbXBpbGUgaGFzIGEgbmV3ICdkb3JhaXNlJyBmbGFnIGFuZCBhIG5ldyBQeUNvbXBpbGVFcnJvcgorICBleGNlcHRpb24uCisKKy0gU2ltcGxlWE1MUlBDU2VydmVyIG5vdyBzdXBwb3J0cyBDR0kgdGhyb3VnaCB0aGUgQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXIKKyAgY2xhc3MuCisKKy0gVGhlIHNldHMgbW9kdWxlIG5vdyByYWlzZXMgVHlwZUVycm9yIGluIF9fY21wX18sIHRvIGNsYXJpZnkgdGhhdAorICBzZXRzIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdGhyZWUtd2F5LWNvbXBhcmVkOyB0aGUgY29tcGFyaXNvbgorICBvcGVyYXRvcnMgYXJlIG92ZXJsb2FkZWQgYXMgc3Vic2V0L3N1cGVyc2V0IHRlc3RzLgorCistIEJhc3Rpb24ucHkgYW5kIHJleGVjLnB5IGFyZSBkaXNhYmxlZC4gIFRoZXNlIG1vZHVsZXMgYXJlIG5vdCBzYWZlIGluCisgIFB5dGhvbiAyLjIuIG9yIDIuMy4KKworLSByZWFscGF0aCBpcyBub3cgZXhwb3J0ZWQgd2hlbiBkb2luZyBgYGZyb20gcG94aXhwYXRoIGltcG9ydCAqYGAuCisgIEl0IGlzIGFsc28gZXhwb3J0ZWQgZm9yIG50cGF0aCwgbWFjcGF0aCwgYW5kIG9zMmVteHBhdGguCisgIFNlZSBTRiBidWcgIzY1OTIyOC4KKworLSBOZXcgbW9kdWxlIHRhcmZpbGUgZnJvbSBMYXJzIEd1c3TDpGJlbCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgaW50ZXJmYWNlCisgIHRvIHRhciBhcmNoaXZlIGZpbGVzIHdpdGggdHJhbnNwYXJlbnQgZ3ppcCBhbmQgYnppcDIgY29tcHJlc3Npb24uCisgIFNlZSBTRiBwYXRjaCAjNjUxMDgyLgorCistIHVybHBhcnNlIGNhbiBub3cgcGFyc2UgaW1hcDovLyBVUkxzLiAgU2VlIFNGIGZlYXR1cmUgcmVxdWVzdCAjNjE4MDI0LgorCistIFRraW50ZXIuQ2FudmFzLnNjYW5fZHJhZ3RvKCkgcHJvdmlkZXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHN1cHBvcnQKKyAgdGhlIGdhaW4gdmFsdWUgd2hpY2ggaXMgcGFzc2VkIHRvIFRrLiAgU0YgYnVnIyA2MDIyNTkuCisKKy0gRml4IGxvZ2dpbmcuaGFuZGxlcnMuU3lzTG9nSGFuZGxlciBwcm90b2NvbCB3aGVuIHVzaW5nIFVOSVggZG9tYWluIHNvY2tldHMuCisgIFNlZSBTRiBwYXRjaCAjNjQyOTc0LgorCistIFRoZSBkb3NwYXRoIG1vZHVsZSB3YXMgZGVsZXRlZC4gIFVzZSB0aGUgbnRwYXRoIG1vZHVsZSB3aGVuIG1hbmlwdWxhdGluZworICBET1MgcGF0aHMgZnJvbSBvdGhlciBwbGF0Zm9ybXMuCisKK1Rvb2xzL0RlbW9zCistLS0tLS0tLS0tLQorCistIFR3byBuZXcgc2NyaXB0cyAoZGIycGlja2xlLnB5IGFuZCBwaWNrbGUyZGIucHkpIHdlcmUgYWRkZWQgdG8gdGhlCisgIFRvb2xzL3NjcmlwdHMgZGlyZWN0b3J5IHRvIGZhY2lsaXRhdGUgY29udmVyc2lvbiBmcm9tIHRoZSBvbGQgYnNkZGIgbW9kdWxlCisgIHRvIHRoZSBuZXcgb25lLiAgV2hpbGUgdGhlIHVzZXItdmlzaWJsZSBBUEkgb2YgdGhlIG5ldyBtb2R1bGUgaXMKKyAgY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgb25lLCBpdCdzIGxpa2VseSB0aGF0IHRoZSB2ZXJzaW9uIG9mIHRoZQorICB1bmRlcmx5aW5nIGRhdGFiYXNlIGxpYnJhcnkgaGFzIGNoYW5nZWQuICBUbyBjb252ZXJ0IGZyb20gdGhlIG9sZCBsaWJyYXJ5LAorICBydW4gdGhlIGRiMnBpY2tsZS5weSBzY3JpcHQgdXNpbmcgdGhlIG9sZCB2ZXJzaW9uIG9mIFB5dGhvbiB0byBjb252ZXJ0IGl0CisgIHRvIGEgcGlja2xlIGZpbGUuICBBZnRlciB1cGdyYWRpbmcgUHl0aG9uLCBydW4gdGhlIHBpY2tsZTJkYi5weSBzY3JpcHQKKyAgdXNpbmcgdGhlIG5ldyB2ZXJzaW9uIG9mIFB5dGhvbiB0byByZWNvbnN0aXR1dGUgeW91ciBkYXRhYmFzZS4gIEZvcgorICBleGFtcGxlOgorCisgICAgJSBweXRob24yLjIgZGIycGlja2xlLnB5IC1oIHNvbWUuZGIgPiBzb21lLnBpY2tsZQorICAgICUgcHl0aG9uMi4zIHBpY2tsZTJkYi5weSAtaCBzb21lLmRiLm5ldyA8IHNvbWUucGlja2xlCisKKyAgUnVuIHRoZSBzY3JpcHRzIHdpdGhvdXQgYW55IGFyZ3MgdG8gZ2V0IGEgdXNhZ2UgbWVzc2FnZS4KKworCitCdWlsZAorLS0tLS0KKworLSBUaGUgYXVkaW8gZHJpdmVyIHRlc3RzICh0ZXN0X29zc2F1ZGlvZGV2LnB5IGFuZAorICB0ZXN0X2xpbnV4YXVkaW9kZXYucHkpIGFyZSBubyBsb25nZXIgcnVuIGJ5IGRlZmF1bHQuICBUaGlzIGlzCisgIGJlY2F1c2UgdGhleSBkb24ndCBhbHdheXMgd29yaywgZGVwZW5kaW5nIG9uIHlvdXIgaGFyZHdhcmUgYW5kCisgIHNvZnR3YXJlLiAgVG8gcnVuIHRoZXNlIHRlc3RzLCB5b3UgbXVzdCB1c2UgYW4gaW52b2NhdGlvbiBsaWtlIDo6CisKKyAgICAuL3B5dGhvbiBMaWIvdGVzdC9yZWdydGVzdC5weSAtdSBhdWRpbyB0ZXN0X29zc2F1ZGlvZGV2CisKKy0gT24gc3lzdGVtcyB3aGljaCBidWlsZCB1c2luZyB0aGUgY29uZmlndXJlIHNjcmlwdCwgY29tcGlsZXIgZmxhZ3Mgd2hpY2gKKyAgdXNlZCB0byBiZSBsdW1wZWQgdG9nZXRoZXIgdXNpbmcgdGhlIE9QVCBmbGFnIGhhdmUgYmVlbiBzcGxpdCBpbnRvIHR3bworICBncm91cHMsIE9QVCBhbmQgQkFTRUNGTEFHUy4gIE9QVCBpcyBtZWFudCB0byBjYXJyeSBqdXN0IG9wdGltaXphdGlvbi0gYW5kCisgIGRlYnVnLXJlbGF0ZWQgZmxhZ3MgbGlrZSAiLWciIGFuZCAiLU8zIi4gIEJBU0VDRkxBR1MgaXMgbWVhbnQgdG8gY2FycnkKKyAgY29tcGlsZXIgZmxhZ3MgdGhhdCBhcmUgcmVxdWlyZWQgdG8gZ2V0IGEgY2xlYW4gY29tcGlsZS4gIE9uIHNvbWUKKyAgcGxhdGZvcm1zIChtYW55IExpbnV4IGZsYXZvcnMgaW4gcGFydGljdWxhcikgQkFTRUNGTEFHUyB3aWxsIGJlIGVtcHR5IGJ5CisgIGRlZmF1bHQuICBPbiBvdGhlcnMsIHN1Y2ggYXMgTWFjIE9TIFggYW5kIFNDTywgaXQgd2lsbCBjb250YWluIHJlcXVpcmVkCisgIGZsYWdzLiAgVGhpcyBjaGFuZ2UgYWxsb3dzIHBlb3BsZSBidWlsZGluZyBQeXRob24gdG8gb3ZlcnJpZGUgT1BUIHdpdGhvdXQKKyAgZmVhciBvZiBjbG9iYmVyaW5nIGNvbXBpbGVyIGZsYWdzIHdoaWNoIGFyZSByZXF1aXJlZCB0byBnZXQgYSBjbGVhbiBidWlsZC4KKworLSBPbiBEYXJ3aW4vTWFjIE9TIFggcGxhdGZvcm1zLCAvc3cvbGliIGFuZCAvc3cvaW5jbHVkZSBhcmUgYWRkZWQgdG8gdGhlCisgIHJlbGV2YW50IHNlYXJjaCBsaXN0cyBpbiBzZXR1cC5weS4gIFRoaXMgYWxsb3dzIHVzZXJzIGJ1aWxkaW5nIFB5dGhvbiB0bworICB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbWFueSBwYWNrYWdlcyBhdmFpbGFibGUgZnJvbSB0aGUgZmluayBwcm9qZWN0CisgIDxodHRwOi8vZmluay5zZi5uZXQvPi4KKworLSBBIG5ldyBNYWtlZmlsZSB0YXJnZXQsIHNjcmlwdHNpbnN0YWxsLCBpbnN0YWxscyBhIG51bWJlciBvZiB1c2VmdWwgc2NyaXB0cworICBmcm9tIHRoZSBUb29scy9zY3JpcHRzIGRpcmVjdG9yeS4KKworQyBBUEkKKy0tLS0tCisKKy0gUHlFdmFsX0dldEZyYW1lKCkgaXMgbm93IGRlY2xhcmVkIHRvIHJldHVybiBhIGBgUHlGcmFtZU9iamVjdCAqYGAKKyAgaW5zdGVhZCBvZiBhIHBsYWluIGBgUHlPYmplY3QgKmBgLiAgKFNGIHBhdGNoICM2ODY2MDEuKQorCistIFB5TnVtYmVyX0NoZWNrKCkgbm93IGNoZWNrcyB0aGF0IHRoZSBvYmplY3QgaGFzIGEgbmJfaW50IG9yIG5iX2Zsb2F0CisgIHNsb3QsIHJhdGhlciB0aGFuIHNpbXBseSBjaGVja2luZyB3aGV0aGVyIGl0IGhhcyBhIG5vbi1OVUxMCisgIHRwX2FzX251bWJlciBwb2ludGVyLgorCistIEEgQyB0eXBlIHRoYXQgaW5oZXJpdHMgZnJvbSBhIGJhc2UgdHlwZSB0aGF0IGRlZmluZXMgdHBfYXNfYnVmZmVyCisgIHdpbGwgbm93IGluaGVyaXQgdGhlIHRwX2FzX2J1ZmZlciBwb2ludGVyIGlmIGl0IGRvZXNuJ3QgZGVmaW5lIG9uZS4KKyAgKFNGICM2ODEzNjcpCisKKy0gVGhlIFB5QXJnX1BhcnNlIGZ1bmN0aW9ucyBub3cgaXNzdWUgYSBEZXByZWNhdGlvbldhcm5pbmcgaWYgYSBmbG9hdAorICBhcmd1bWVudCBpcyBwcm92aWRlZCB3aGVuIGFuIGludGVnZXIgaXMgc3BlY2lmaWVkICh0aGlzIGFmZmVjdHMgdGhlICdiJywKKyAgJ0InLCAnaCcsICdIJywgJ2knLCBhbmQgJ2wnIGNvZGVzKS4gIEZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob24gd2lsbAorICByYWlzZSBhIFR5cGVFcnJvci4KKworVGVzdHMKKy0tLS0tCisKKy0gU2V2ZXJhbCB0ZXN0cyB3ZXJlbid0IGJlaW5nIHJ1biBmcm9tIHJlZ3J0ZXN0LnB5ICh0ZXN0X3RpbWVvdXQucHksCisgIHRlc3RfdGFyZmlsZS5weSwgdGVzdF9uZXRyYy5weSwgdGVzdF9tdWx0aWZpbGUucHksCisgIHRlc3RfaW1wb3J0aG9va3MucHkgYW5kIHRlc3RfaW1wLnB5KS4gIE5vdyB0aGV5IGFyZS4gIChOb3RlIHRvCisgIGRldmVsb3BlcnM6IHBsZWFzZSByZWFkIExpYi90ZXN0L1JFQURNRSB3aGVuIGNyZWF0aW5nIGEgbmV3IHRlc3QsIHRvCisgIG1ha2Ugc3VyZSB0byBkbyBpdCByaWdodCEgIEFsbCB0ZXN0cyBuZWVkIHRvIHVzZSBlaXRoZXIgdW5pdHRlc3Qgb3IKKyAgcHlkb2MuKQorCistIEFkZGVkIHRlc3RfcG9zaXgucHksIGEgdGVzdCBzdWl0ZSBmb3IgdGhlIHBvc2l4IG1vZHVsZS4KKworLSBBZGRlZCB0ZXN0X2hleG9jdC5weSwgYSB0ZXN0IHN1aXRlIGZvciBoZXgvb2N0IGNvbnN0YW50IGZvbGRpbmcuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBUaGUgdGltZW91dCBjb2RlIGZvciBzb2NrZXQgY29ubmVjdCgpIGRpZG4ndCB3b3JrIHJpZ2h0OyB0aGlzIGhhcworICBub3cgYmVlbiBmaXhlZC4gIHRlc3RfdGltZW91dC5weSBzaG91bGQgcGFzcyAoYXQgbGVhc3QgbW9zdCBvZiB0aGUKKyAgdGltZSkuCisKKy0gZGlzdHV0aWxzJyBtc3ZjY29tcGlsZXIgY2xhc3Mgbm93IHBhc3NlcyB0aGUgcHJlcHJvY2Vzc29yIG9wdGlvbnMgdG8KKyAgdGhlIHJlc291cmNlIGNvbXBpbGVyLiAgU2VlIFNGIHBhdGNoICM2NjkxOTguCisKKy0gVGhlIGJzZGRiIG1vZHVsZSBub3cgc2hpcHMgd2l0aCBTbGVlcHljYXQncyA0LjEuMjUuTkMsIHRoZSBsYXRlc3QKKyAgcmVsZWFzZSB3aXRob3V0IHN0cm9uZyBjcnlwdG9ncmFwaHkuCisKKy0gc3lzLnBhdGhbMF0sIGlmIGl0IGNvbnRhaW5zIGEgZGlyZWN0b3J5IG5hbWUsIGlzIG5vdyBhbHdheXMgYW4KKyAgYWJzb2x1dGUgcGF0aG5hbWUuIChTRiBwYXRjaCAjNjY0Mzc2LikKKworLSBUaGUgbmV3IGxvZ2dpbmcgcGFja2FnZSBpcyBub3cgaW5zdGFsbGVkIGJ5IHRoZSBXaW5kb3dzIGluc3RhbGxlci4gIEl0CisgIHdhc24ndCBpbiAyLjNhMSBkdWUgdG8gb3ZlcnNpZ2h0LgorCitNYWMKKy0tLQorCistIFRoZXJlIGFyZSBuZXcgZGlhbG9ncyBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbiwgQXNrRmlsZUZvclNhdmUKKyAgYW5kIEFza0ZvbGRlci4gVGhlIG9sZCBtYWNmcy5TdGFuZGFyZEdldEZpbGUgYW5kIGZyaWVuZHMgYXJlIGRlcHJlY2F0ZWQuCisKKy0gTW9zdCBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSBub3cgdXNlcyBwYXRobmFtZXMgb3IgRlNSZWZzIGluIHByZWZlcmVuY2UKKyAgb2YgRlNTcGVjcywgYW5kIHVzZSB0aGUgdW5kZXJseWluZyBDYXJib24uRmlsZSBhbmQgQ2FyYm9uLkZvbGRlciBtb2R1bGVzCisgIGluIHN0ZWFkIG9mIG1hY2ZzLiBtYWNmcyB3aWxsIHByb2JhYmx5IGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4KKworLSBUeXBlIENhcmJvbi5GaWxlLkZTQ2F0YWxvZ0luZm8gYW5kIHN1cHBvcnRpbmcgbWV0aG9kcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCisgIFRoaXMgYWxzbyBtYWtlcyBtYWNmcy5GU1NwZWMuU2V0RGF0ZXMoKSB3b3JrIGFnYWluLgorCistIFRoZXJlIGlzIGEgbmV3IG1vZHVsZSBwaW1wLCB0aGUgcGFja2FnZSBpbnN0YWxsIG1hbmFnZXIgZm9yIFB5dGhvbiwgYW5kCisgIGFjY29tcGFueWluZyBhcHBsZXQgUGFja2FnZU1hbmFnZXIuIFRoZXNlIGFsbG93IHlvdSB0byBlYXNpbHkgZG93bmxvYWQKKyAgYW5kIGluc3RhbGwgcHJldGVzdGVkIGV4dGVuc2lvbiBwYWNrYWdlcyBlaXRoZXIgaW4gc291cmNlIG9yIGJpbmFyeQorICBmb3JtLiBPbmx5IGluIE1hY1B5dGhvbi1PU1guCisKKy0gQXBwbGV0cyBhcmUgbm93IGJ1aWx0IHdpdGggYnVuZGxlYnVpbGRlciBpbiBNYWNQeXRob24tT1NYLCB3aGljaCBzaG91bGQgbWFrZQorICB0aGVtIG1vcmUgcm9idXN0IGFuZCBhbHNvIHByb3ZpZGVzIGEgcGF0aCB0b3dhcmRzIEJ1aWxkQXBwbGljYXRpb24uIFRoZQorICBkb3duc2lkZSBvZiB0aGlzIGNoYW5nZSBpcyB0aGF0IGFwcGxldHMgY2FuIG5vIGxvbmdlciBiZSBydW4gZnJvbSB0aGUKKyAgVGVybWluYWwgd2luZG93LCB0aGlzIHdpbGwgaG9wZWZ1bGx5IGJlIGZpeGVkIGluIHRoZSAyLjNiMS4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjMgYWxwaGEgMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAzMS1EZWMtMjAwMioKKworVHlwZS9jbGFzcyB1bmlmaWNhdGlvbiBhbmQgbmV3LXN0eWxlIGNsYXNzZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gT25lIGNhbiBub3cgYXNzaWduIHRvIF9fYmFzZXNfXyBhbmQgX19uYW1lX18gb2YgbmV3LXN0eWxlIGNsYXNzZXMuCisKKy0gZGljdCgpIG5vdyBhY2NlcHRzIGtleXdvcmQgYXJndW1lbnRzIHNvIHRoYXQgZGljdChvbmU9MSwgdHdvPTIpCisgIGlzIHRoZSBlcXVpdmFsZW50IG9mIHsib25lIjogMSwgInR3byI6IDJ9LiAgQWNjb3JkaW5nbHksCisgIHRoZSBleGlzdGluZyAoYnV0IHVuZG9jdW1lbnRlZCkgJ2l0ZW1zJyBrZXl3b3JkIGFyZ3VtZW50IGhhcworICBiZWVuIGVsaW1pbmF0ZWQuICBUaGlzIG1lYW5zIHRoYXQgZGljdChpdGVtcz1zb21lTWFwcGluZykgbm93IGhhcworICBhIGRpZmZlcmVudCBtZWFuaW5nIHRoYW4gYmVmb3JlLgorCistIGludCgpIG5vdyByZXR1cm5zIGEgbG9uZyBvYmplY3QgaWYgdGhlIGFyZ3VtZW50IGlzIG91dHNpZGUgdGhlCisgIGludGVnZXIgcmFuZ2UsIHNvIGludCgiNCIgKiAxMDAwKSwgaW50KDFlMjAwKSBhbmQgaW50KDFMPDwxMDAwKSB3aWxsCisgIGFsbCByZXR1cm4gbG9uZyBvYmplY3RzIGluc3RlYWQgb2YgcmFpc2luZyBhbiBPdmVyZmxvd0Vycm9yLgorCistIEFzc2lnbm1lbnQgdG8gX19jbGFzc19fIGlzIGRpc2FsbG93ZWQgaWYgZWl0aGVyIHRoZSBvbGQgb3IgdGhlIG5ldworICBjbGFzcyBpcyBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHR5cGUgb2JqZWN0IChzdWNoIGFzIGRlZmluZWQgYnkgYW4KKyAgZXh0ZW5zaW9uIG1vZHVsZSkuICBUaGlzIHByZXZlbnRzIGFub21hbGllcyBsaWtlIDIuX19jbGFzc19fID0gYm9vbC4KKworLSBOZXctc3R5bGUgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZWFsbG9jYXRpb24gaGF2ZSBiZWVuIHNwZWQgdXAKKyAgc2lnbmlmaWNhbnRseTsgdGhleSBhcmUgbm93IGZhc3RlciB0aGFuIGNsYXNzaWMgaW5zdGFuY2UgY3JlYXRpb24KKyAgYW5kIGRlYWxsb2NhdGlvbi4KKworLSBUaGUgX19zbG90c19fIHZhcmlhYmxlIGNhbiBub3cgbWVudGlvbiAicHJpdmF0ZSIgbmFtZXMsIGFuZCB0aGUKKyAgcmlnaHQgdGhpbmcgd2lsbCBoYXBwZW4gKGUuZy4gX19zbG90c19fID0gWyJfX2ZvbyJdKS4KKworLSBUaGUgYnVpbHQtaW5zIHNsaWNlKCkgYW5kIGJ1ZmZlcigpIGFyZSBub3cgY2FsbGFibGUgdHlwZXMuICBUaGUKKyAgdHlwZXMgY2xhc3NvYmogKGZvcm1lcmx5IGNsYXNzKSwgY29kZSwgZnVuY3Rpb24sIGluc3RhbmNlLCBhbmQKKyAgaW5zdGFuY2VtZXRob2QgKGZvcm1lcmx5IGluc3RhbmNlLW1ldGhvZCksIHdoaWNoIGhhdmUgbm8gYnVpbHQtaW4KKyAgbmFtZXMgYnV0IGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIHR5cGVzIG1vZHVsZSwgYXJlIG5vdyBhbHNvCisgIGNhbGxhYmxlLiAgVGhlIHR5cGUgZGljdC1wcm94eSBpcyByZW5hbWVkIHRvIGRpY3Rwcm94eS4KKworLSBDeWNsZXMgZ29pbmcgdGhyb3VnaCB0aGUgX19jbGFzc19fIGxpbmsgb2YgYSBuZXctc3R5bGUgaW5zdGFuY2UgYXJlCisgIG5vdyBkZXRlY3RlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCisKKy0gQ2xhc3NlcyB1c2luZyBfX3Nsb3RzX18gYXJlIG5vdyBwcm9wZXJseSBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgW1NGIGJ1ZyA1MTk2MjFdCisKKy0gVGlnaHRlbmVkIHRoZSBfX3Nsb3RzX18gcnVsZXM6IGEgc2xvdCBuYW1lIG11c3QgYmUgYSB2YWxpZCBQeXRob24KKyAgaWRlbnRpZmllci4KKworLSBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBtb2R1bGUgdHlwZSBub3cgcmVxdWlyZXMgYSBuYW1lIGFyZ3VtZW50IGFuZAorICB0YWtlcyBhbiBvcHRpb25hbCBkb2NzdHJpbmcgYXJndW1lbnQuICBQcmV2aW91c2x5LCB0aGlzIGNvbnN0cnVjdG9yCisgIGlnbm9yZWQgaXRzIGFyZ3VtZW50cy4gIEFzIGEgY29uc2VxdWVuY2UsIGRlcml2aW5nIGEgY2xhc3MgZnJvbSBhCisgIG1vZHVsZSAobm90IGZyb20gdGhlIG1vZHVsZSB0eXBlKSBpcyBub3cgaWxsZWdhbDsgcHJldmlvdXNseSB0aGlzCisgIGNyZWF0ZWQgYW4gdW5uYW1lZCBtb2R1bGUsIGp1c3QgbGlrZSBpbnZva2luZyB0aGUgbW9kdWxlIHR5cGUgZGlkLgorICBbU0YgYnVnIDU2MzA2MF0KKworLSBBIG5ldyB0eXBlIG9iamVjdCwgJ2Jhc2VzdHJpbmcnLCBpcyBhZGRlZC4gIFRoaXMgaXMgYSBjb21tb24gYmFzZSB0eXBlCisgIGZvciAnc3RyJyBhbmQgJ3VuaWNvZGUnLCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZgorICB0eXBlcy5TdHJpbmdUeXBlcywgZS5nLiB0byB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzICJhIHN0cmluZyI6CisgIGlzaW5zdGFuY2UoeCwgYmFzZXN0cmluZykgaXMgVHJ1ZSBmb3IgVW5pY29kZSBhbmQgOC1iaXQgc3RyaW5ncy4gIFRoaXMKKyAgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBhbmQgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS4KKworLSBDaGFuZ2VkIG5ldy1zdHlsZSBjbGFzcyBpbnN0YW50aWF0aW9uIHNvIHRoYXQgd2hlbiBDJ3MgX19uZXdfXworICBtZXRob2QgcmV0dXJucyBzb21ldGhpbmcgdGhhdCdzIG5vdCBhIEMgaW5zdGFuY2UsIGl0cyBfX2luaXRfXyBpcworICBub3QgY2FsbGVkLiAgW1NGIGJ1ZyAjNTM3NDUwXQorCistIEZpeGVkIHN1cGVyKCkgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBjbGFzcyBtZXRob2RzLiAgW1NGIGJ1ZyAjNTM1NDQ0XQorCistIElmIHlvdSB0cnkgdG8gcGlja2xlIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgX19zbG90c19fIGJ1dAorICBkb2Vzbid0IGRlZmluZSBvciBvdmVycmlkZSBfX2dldHN0YXRlX18sIGEgVHlwZUVycm9yIGlzIG5vdyByYWlzZWQuCisgIFRoaXMgaXMgZG9uZSBieSBhZGRpbmcgYSBib3pvIF9fZ2V0c3RhdGVfXyB0byB0aGUgY2xhc3MgdGhhdCBhbHdheXMKKyAgcmFpc2VzIFR5cGVFcnJvci4gIChCZWZvcmUsIHRoaXMgd291bGQgYXBwZWFyIHRvIGJlIHBpY2tsZWQsIGJ1dCB0aGUKKyAgc3RhdGUgb2YgdGhlIHNsb3RzIHdvdWxkIGJlIGxvc3QuKQorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBJbXBvcnQgZnJvbSB6aXBmaWxlcyBpcyBub3cgc3VwcG9ydGVkLiAgVGhlIG5hbWUgb2YgYSB6aXBmaWxlIHBsYWNlZAorICBvbiBzeXMucGF0aCBjYXVzZXMgdGhlIGltcG9ydCBzdGF0ZW1lbnQgdG8gbG9vayBmb3IgaW1wb3J0YWJsZSBQeXRob24KKyAgbW9kdWxlcyAod2l0aCAucHksIHB5YyBhbmQgLnB5byBleHRlbnNpb25zKSBhbmQgcGFja2FnZXMgaW5zaWRlIHRoZQorICB6aXBmaWxlLiAgVGhlIHppcGZpbGUgaW1wb3J0IGZvbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gKHRob3VnaCBub3QKKyAgdGhlIHNhbXBsZSBpbXBsZW1lbnRhdGlvbikgb2YgUEVQIDI3My4gIFRoZSBzZW1hbnRpY3Mgb2YgX19wYXRoX18gYXJlCisgIGNvbXBhdGlibGUgd2l0aCB0aG9zZSB0aGF0IGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBpbiBKeXRob24gc2luY2UKKyAgSnl0aG9uIDIuMS4KKworLSBQRVAgMzAyIGhhcyBiZWVuIGFjY2VwdGVkLiAgQWx0aG91Z2ggaXQgd2FzIGluaXRpYWxseSBkZXZlbG9wZWQgdG8KKyAgc3VwcG9ydCB6aXBpbXBvcnQsIGl0IG9mZmVycyBhIG5ldywgZ2VuZXJhbCBpbXBvcnQgaG9vayBtZWNoYW5pc20uCisgIFNldmVyYWwgbmV3IHZhcmlhYmxlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHN5cyBtb2R1bGU6CisgIHN5cy5tZXRhX3BhdGgsIHN5cy5wYXRoX2hvb2tzLCBhbmQgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGU7IHRoZXNlCisgIG1ha2UgZXh0ZW5kaW5nIHRoZSBpbXBvcnQgc3RhdGVtZW50IG11Y2ggbW9yZSBjb252ZW5pZW50IHRoYW4KKyAgb3ZlcnJpZGluZyB0aGUgX19pbXBvcnRfXyBidWlsdC1pbiBmdW5jdGlvbi4gIEZvciBhIGRlc2NyaXB0aW9uIG9mCisgIHRoZXNlLCBzZWUgUEVQIDMwMi4KKworLSBBIGZyYW1lIG9iamVjdCdzIGZfbGluZW5vIGF0dHJpYnV0ZSBjYW4gbm93IGJlIHdyaXR0ZW4gdG8gZnJvbSBhCisgIHRyYWNlIGZ1bmN0aW9uIHRvIGNoYW5nZSB3aGljaCBsaW5lIHdpbGwgZXhlY3V0ZSBuZXh0LiAgQSBjb21tYW5kIHRvCisgIGV4cGxvaXQgdGhpcyBmcm9tIHBkYiBoYXMgYmVlbiBhZGRlZC4gIFtTRiBwYXRjaCAjNjQzODM1XQorCistIFRoZSBfY29kZWNzIHN1cHBvcnQgbW9kdWxlIGZvciBjb2RlY3MucHkgd2FzIHR1cm5lZCBpbnRvIGEgYnVpbHRpbgorICBtb2R1bGUgdG8gYXNzdXJlIHRoYXQgYXQgbGVhc3QgdGhlIGJ1aWx0aW4gY29kZWNzIGFyZSBhdmFpbGFibGUKKyAgdG8gdGhlIFB5dGhvbiBwYXJzZXIgZm9yIHNvdXJjZSBjb2RlIGRlY29kaW5nIGFjY29yZGluZyB0byBQRVAgMjYzLgorCistIGlzc3ViY2xhc3Mgbm93IHN1cHBvcnRzIGEgdHVwbGUgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwganVzdCBsaWtlCisgIGlzaW5zdGFuY2UgZG9lcy4gYGBpc3N1YmNsYXNzKFgsIChBLCBCKSlgYCBpcyBlcXVpdmFsZW50IHRvCisgIGBgaXNzdWJjbGFzcyhYLCBBKSBvciBpc3N1YmNsYXNzKFgsIEIpYGAuCisKKy0gVGhhbmtzIHRvIEFybWluIFJpZ28sIHRoZSBsYXN0IGtub3duIHdheSB0byBwcm92b2tlIGEgc3lzdGVtIGNyYXNoCisgIGJ5IGNsZXZlcmx5IGFycmFuZ2luZyBmb3IgYSBjb21wYXJpc29uIGZ1bmN0aW9uIHRvIG11dGF0ZSBhIGxpc3QKKyAgZHVyaW5nIGEgbGlzdC5zb3J0KCkgb3BlcmF0aW9uIGhhcyBiZWVuIGZpeGVkLiAgVGhlIGVmZmVjdCBvZgorICBhdHRlbXB0aW5nIHRvIG11dGF0ZSBhIGxpc3QsIG9yIGV2ZW4gdG8gaW5zcGVjdCBpdHMgY29udGVudHMgb3IKKyAgbGVuZ3RoLCB3aGlsZSBhIHNvcnQgaXMgaW4gcHJvZ3Jlc3MsIGlzIG5vdCBkZWZpbmVkIGJ5IHRoZSBsYW5ndWFnZS4KKyAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIDIuMyBhdHRlbXB0cyB0byBkZXRlY3QgbXV0YXRpb25zLAorICBhbmQgcmFpc2UgVmFsdWVFcnJvciBpZiBvbmUgb2NjdXJzLCBidXQgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdAorICBhbGwgbXV0YXRpb25zIHdpbGwgYmUgY2F1Z2h0LCBvciB0aGF0IGFueSB3aWxsIGJlIGNhdWdodCBhY3Jvc3MKKyAgcmVsZWFzZXMgb3IgaW1wbGVtZW50YXRpb25zLgorCistIFVuaWNvZGUgZmlsZSBuYW1lIHByb2Nlc3NpbmcgZm9yIFdpbmRvd3MgKFBFUCAyNzcpIGlzIGltcGxlbWVudGVkLgorICBBbGwgcGxhdGZvcm1zIG5vdyBoYXZlIGFuIG9zLnBhdGguc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMgYXR0cmlidXRlLAorICB3aGljaCBpcyBzZXQgdG8gVHJ1ZSBvbiBXaW5kb3dzIE5ULzIwMDAvWFAsIGFuZCBGYWxzZSBlbHNld2hlcmUuCisKKy0gQ29kZWMgZXJyb3IgaGFuZGxpbmcgY2FsbGJhY2tzIChQRVAgMjkzKSBhcmUgaW1wbGVtZW50ZWQuCisgIEVycm9yIGhhbmRsaW5nIGluIHVuaWNvZGUuZW5jb2RlIG9yIHN0ci5kZWNvZGUgY2FuIG5vdyBiZSBjdXN0b21pemVkLgorCistIEEgc3VidGxlIGNoYW5nZSB0byB0aGUgc2VtYW50aWNzIG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBpbnRlcm4oKToKKyAgaW50ZXJuZWQgc3RyaW5ncyBhcmUgbm8gbG9uZ2VyIGltbW9ydGFsLiAgWW91IG11c3Qga2VlcCBhIHJlZmVyZW5jZQorICB0byB0aGUgcmV0dXJuIHZhbHVlIGludGVybigpIGFyb3VuZCB0byBnZXQgdGhlIGJlbmVmaXQuCisKKy0gVXNlIG9mICdOb25lJyBhcyBhIHZhcmlhYmxlLCBhcmd1bWVudCBvciBhdHRyaWJ1dGUgbmFtZSBub3cKKyAgaXNzdWVzIGEgU3ludGF4V2FybmluZy4gIEluIHRoZSBmdXR1cmUsIE5vbmUgbWF5IGJlY29tZSBhIGtleXdvcmQuCisKKy0gU0VUX0xJTkVOTyBpcyBnb25lLiAgY29fbG5vdGFiIGlzIG5vdyBjb25zdWx0ZWQgdG8gZGV0ZXJtaW5lIHdoZW4gdG8KKyAgY2FsbCB0aGUgdHJhY2UgZnVuY3Rpb24uICBDIGNvZGUgdGhhdCBhY2Nlc3NlZCBmX2xpbmVubyBzaG91bGQgY2FsbAorICBQeUNvZGVfQWRkcjJMaW5lIGluc3RlYWQgKGZfbGluZW5vIGlzIHN0aWxsIHRoZXJlLCBidXQgb25seSBrZXB0IHVwCisgIHRvIGRhdGUgd2hlbiB0aGVyZSBpcyBhIHRyYWNlIGZ1bmN0aW9uIHNldCkuCisKKy0gVGhlcmUncyBhIG5ldyB3YXJuaW5nIGNhdGVnb3J5LCBGdXR1cmVXYXJuaW5nLiAgVGhpcyBpcyB1c2VkIHRvIHdhcm4KKyAgYWJvdXQgYSBudW1iZXIgb2Ygc2l0dWF0aW9ucyB3aGVyZSB0aGUgdmFsdWUgb3Igc2lnbiBvZiBhbiBpbnRlZ2VyCisgIHJlc3VsdCB3aWxsIGNoYW5nZSBpbiBQeXRob24gMi40IGFzIGEgcmVzdWx0IG9mIFBFUCAyMzcgKGludGVnZXIKKyAgdW5pZmljYXRpb24pLiAgVGhlIHdhcm5pbmdzIGltcGxlbWVudCBzdGFnZSBCMCBtZW50aW9uZWQgaW4gdGhhdAorICBQRVAuICBUaGUgd2FybmluZ3MgYXJlIGFib3V0IHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczoKKworICAgIC0gT2N0YWwgYW5kIGhleCBsaXRlcmFscyB3aXRob3V0ICdMJyBwcmVmaXggaW4gdGhlIGluY2x1c2l2ZSByYW5nZQorICAgICAgWzB4ODAwMDAwMDAuLjB4ZmZmZmZmZmZdOyB0aGVzZSBhcmUgY3VycmVudGx5IG5lZ2F0aXZlIGludHMsIGJ1dAorICAgICAgaW4gUHl0aG9uIDIuNCB0aGV5IHdpbGwgYmUgcG9zaXRpdmUgbG9uZ3Mgd2l0aCB0aGUgc2FtZSBiaXQKKyAgICAgIHBhdHRlcm4uCisKKyAgICAtIExlZnQgc2hpZnRzIG9uIGludGVnZXIgdmFsdWVzIHRoYXQgY2F1c2UgdGhlIG91dGNvbWUgdG8gbG9zZQorICAgICAgYml0cyBvciBoYXZlIGEgZGlmZmVyZW50IHNpZ24gdGhhbiB0aGUgbGVmdCBvcGVyYW5kLiAgVG8gYmUKKyAgICAgIHByZWNpc2U6IHg8PG4gd2hlcmUgdGhpcyBjdXJyZW50bHkgZG9lc24ndCB5aWVsZCB0aGUgc2FtZSB2YWx1ZQorICAgICAgYXMgbG9uZyh4KTw8bjsgaW4gUHl0aG9uIDIuNCwgdGhlIG91dGNvbWUgd2lsbCBiZSBsb25nKHgpPDxuLgorCisgICAgLSBDb252ZXJzaW9ucyBmcm9tIGludHMgdG8gc3RyaW5nIHRoYXQgc2hvdyBuZWdhdGl2ZSB2YWx1ZXMgYXMKKyAgICAgIHVuc2lnbmVkIGludHMgaW4gdGhlIGluY2x1c2l2ZSByYW5nZSBbMHg4MDAwMDAwMC4uMHhmZmZmZmZmZl07CisgICAgICB0aGlzIGFmZmVjdHMgdGhlIGZ1bmN0aW9ucyBoZXgoKSBhbmQgb2N0KCksIGFuZCB0aGUgc3RyaW5nCisgICAgICBmb3JtYXR0aW5nIGNvZGVzICV1LCAlbywgJXgsIGFuZCAlWC4gIEluIFB5dGhvbiAyLjQsIHRoZXNlIHdpbGwKKyAgICAgIHNob3cgc2lnbmVkIHZhbHVlcyAoZS5nLiBoZXgoLTEpIGN1cnJlbnRseSByZXR1cm5zICIweGZmZmZmZmZmIjsKKyAgICAgIGluIFB5dGhvbiAyLjQgaXQgd2lsbCByZXR1cm4gIi0weDEiKS4KKworLSBUaGUgYml0cyBtYW5pcHVsYXRlZCB1bmRlciB0aGUgY292ZXIgYnkgc3lzLnNldGNoZWNraW50ZXJ2YWwoKSBoYXZlCisgIGJlZW4gY2hhbmdlZC4gIEJvdGggdGhlIGNoZWNrIGludGVydmFsIGFuZCB0aGUgdGlja2VyIHVzZWQgdG8gYmUKKyAgcGVyLXRocmVhZCB2YWx1ZXMuICBUaGV5IGFyZSBub3cganVzdCBhIHBhaXIgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKyAgSW4gYWRkaXRpb24sIHRoZSBkZWZhdWx0IGNoZWNrIGludGVydmFsIHdhcyBib29zdGVkIGZyb20gMTAgdG8gMTAwCisgIGJ5dGVjb2RlIGluc3RydWN0aW9ucy4gIFRoaXMgbWF5IGhhdmUgc29tZSBlZmZlY3Qgb24gc3lzdGVtcyB0aGF0CisgIHJlbGllZCBvbiB0aGUgb2xkIGRlZmF1bHQgdmFsdWUuICBJbiBwYXJ0aWN1bGFyLCBpbiBtdWx0aS10aHJlYWRlZAorICBhcHBsaWNhdGlvbnMgd2hpY2ggdHJ5IHRvIGJlIGhpZ2hseSByZXNwb25zaXZlLCByZXNwb25zZSB0aW1lIHdpbGwKKyAgaW5jcmVhc2UgYnkgc29tZSAocGVyaGFwcyBpbXBlcmNlcHRpYmxlKSBhbW91bnQuCisKKy0gV2hlbiBtdWx0aXBseWluZyB2ZXJ5IGxhcmdlIGludGVnZXJzLCBhIHZlcnNpb24gb2YgdGhlIHNvLWNhbGxlZAorICBLYXJhdHN1YmEgYWxnb3JpdGhtIGlzIG5vdyB1c2VkLiAgVGhpcyBpcyBtb3N0IGVmZmVjdGl2ZSBpZiB0aGUKKyAgaW5wdXRzIGhhdmUgcm91Z2hseSB0aGUgc2FtZSBzaXplLiAgSWYgdGhleSBib3RoIGhhdmUgYWJvdXQgTiBkaWdpdHMsCisgIEthcmF0c3ViYSBtdWx0aXBsaWNhdGlvbiBoYXMgTyhOKioxLjU4KSBydW50aW1lICh0aGUgZXhwb25lbnQgaXMKKyAgbG9nX2Jhc2VfMigzKSkgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgTyhOKioyKS4gIE1lYXN1cmVkIHJlc3VsdHMgbWF5CisgIGJlIGJldHRlciBvciB3b3JzZSB0aGFuIHRoYXQsIGRlcGVuZGluZyBvbiBwbGF0Zm9ybSBxdWlya3MuICBCZXNpZGVzCisgIHRoZSBPKCkgaW1wcm92ZW1lbnQgaW4gcmF3IGluc3RydWN0aW9uIGNvdW50LCB0aGUgS2FyYXRzdWJhIGFsZ29yaXRobQorICBhcHBlYXJzIHRvIGhhdmUgbXVjaCBiZXR0ZXIgY2FjaGUgYmVoYXZpb3Igb24gZXh0cmVtZWx5IGxhcmdlIGludGVnZXJzCisgIChzdGFydGluZyBpbiB0aGUgYmFsbHBhcmsgb2YgYSBtaWxsaW9uIGJpdHMpLiAgTm90ZSB0aGF0IHRoaXMgaXMgYQorICBzaW1wbGUgaW1wbGVtZW50YXRpb24sIGFuZCB0aGVyZSdzIG5vIGludGVudCBoZXJlIHRvIGNvbXBldGUgd2l0aCwKKyAgZS5nLiwgR01QLiAgSXQgZ2l2ZXMgYSB2ZXJ5IG5pY2Ugc3BlZWR1cCB3aGVuIGl0IGFwcGxpZXMsIGJ1dCBhIHBhY2thZ2UKKyAgZGV2b3RlZCB0byBmYXN0IGxhcmdlLWludGVnZXIgYXJpdGhtZXRpYyBzaG91bGQgcnVuIGNpcmNsZXMgYXJvdW5kIGl0LgorCistIHUnJWMnIHdpbGwgbm93IHJhaXNlIGEgVmFsdWVFcnJvciBpbiBjYXNlIHRoZSBhcmd1bWVudCBpcyBhbgorICBpbnRlZ2VyIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIG9mIFVuaWNvZGUgY29kZSBwb2ludCBvcmRpbmFscy4KKworLSBUaGUgdGVtcGZpbGUgbW9kdWxlIGhhcyBiZWVuIG92ZXJoYXVsZWQgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LiAgVGhlCisgIG1rdGVtcCgpIGZ1bmN0aW9uIGlzIG5vdyBkZXByZWNhdGVkOyBuZXcsIHNhZmUgcmVwbGFjZW1lbnRzIGFyZQorICBta3N0ZW1wKCkgKGZvciBmaWxlcykgYW5kIG1rZHRlbXAoKSAoZm9yIGRpcmVjdG9yaWVzKSwgYW5kIHRoZQorICBoaWdoZXItbGV2ZWwgZnVuY3Rpb25zIE5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFuZCBUZW1wb3JhcnlGaWxlKCkuCisgIFVzZSBvZiBzb21lIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhpcyBtb2R1bGUgaXMgYWxzbyBkZXByZWNhdGVkOyB0aGUKKyAgbmV3IGZ1bmN0aW9ucyBoYXZlIGtleXdvcmQgYXJndW1lbnRzIHRvIHByb3ZpZGUgdGhlIHNhbWUKKyAgZnVuY3Rpb25hbGl0eS4gIEFsbCBMaWIsIFRvb2xzIGFuZCBEZW1vIG1vZHVsZXMgdGhhdCB1c2VkIHRoZSB1bnNhZmUKKyAgaW50ZXJmYWNlcyBoYXZlIGJlZW4gdXBkYXRlZCB0byB1c2UgdGhlIHNhZmUgcmVwbGFjZW1lbnRzLiAgVGhhbmtzCisgIHRvIFphY2sgV2VpbmJlcmchCisKKy0gV2hlbiB4IGlzIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBpbXBsZW1lbnRzIF9fbXVsX18gYW5kIF9fcm11bF9fLAorICAxLjAqeCB3b3VsZCBjb3JyZWN0bHkgaW52b2tlIF9fcm11bF9fLCBidXQgMSp4IHdvdWxkIGVycm9uZW91c2x5CisgIGludm9rZSBfX211bF9fLiAgVGhpcyB3YXMgZHVlIHRvIHRoZSBzZXF1ZW5jZS1yZXBlYXQgY29kZSBpbiB0aGUgaW50CisgIHR5cGUuICBUaGlzIGhhcyBiZWVuIGZpeGVkIG5vdy4KKworLSBQcmV2aW91c2x5LCAic3RyMSBpbiBzdHIyIiByZXF1aXJlZCBzdHIxIHRvIGJlIGEgc3RyaW5nIG9mIGxlbmd0aCAxLgorICBUaGlzIHJlc3RyaWN0aW9uIGhhcyBiZWVuIHJlbGF4ZWQgdG8gYWxsb3cgc3RyMSB0byBiZSBhIHN0cmluZyBvZgorICBhbnkgbGVuZ3RoLiAgVGh1cyAiJ2VsJyBpbiAnaGVsbG8gd29ybGQnIiByZXR1cm5zIFRydWUgbm93LgorCistIEZpbGUgb2JqZWN0cyBhcmUgbm93IHRoZWlyIG93biBpdGVyYXRvcnMuICBGb3IgYSBmaWxlIGYsIGl0ZXIoZikgbm93CisgIHJldHVybnMgZiAodW5sZXNzIGYgaXMgY2xvc2VkKSwgYW5kIGYubmV4dCgpIGlzIHNpbWlsYXIgdG8KKyAgZi5yZWFkbGluZSgpIHdoZW4gRU9GIGlzIG5vdCByZWFjaGVkOyBob3dldmVyLCBmLm5leHQoKSB1c2VzIGEKKyAgcmVhZGFoZWFkIGJ1ZmZlciB0aGF0IG1lc3NlcyB1cCB0aGUgZmlsZSBwb3NpdGlvbiwgc28gbWl4aW5nCisgIGYubmV4dCgpIGFuZCBmLnJlYWRsaW5lKCkgKG9yIG90aGVyIG1ldGhvZHMpIGRvZXNuJ3Qgd29yayByaWdodC4KKyAgQ2FsbGluZyBmLnNlZWsoKSBkcm9wcyB0aGUgcmVhZGFoZWFkIGJ1ZmZlciwgYnV0IG90aGVyIG9wZXJhdGlvbnMKKyAgZG9uJ3QuICBJdCBzbyBoYXBwZW5zIHRoYXQgdGhpcyBnaXZlcyBhIG5pY2UgYWRkaXRpb25hbCBzcGVlZCBib29zdAorICB0byAiZm9yIGxpbmUgaW4gZmlsZToiOyB0aGUgeHJlYWRsaW5lcyBtZXRob2QgYW5kIGNvcnJlc3BvbmRpbmcKKyAgbW9kdWxlIGFyZSBub3cgb2Jzb2xldGUuICBUaGFua3MgdG8gT3JlbiBUaXJvc2ghCisKKy0gRW5jb2RpbmcgZGVjbGFyYXRpb25zIChQRVAgMjYzLCBwaGFzZSAxKSBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuICBBCisgIGNvbW1lbnQgb2YgdGhlIGZvcm0gIiMgLSotIGNvZGluZzogPGVuY29kaW5nbmFtZT4gLSotIiBpbiB0aGUgZmlyc3QKKyAgb3Igc2Vjb25kIGxpbmUgb2YgYSBQeXRob24gc291cmNlIGZpbGUgaW5kaWNhdGVzIHRoZSBlbmNvZGluZy4KKworLSBsaXN0LnNvcnQoKSBoYXMgYSBuZXcgaW1wbGVtZW50YXRpb24uICBXaGlsZSBjcm9zcy1wbGF0Zm9ybSByZXN1bHRzCisgIG1heSB2YXJ5LCBhbmQgaW4gZGF0YS1kZXBlbmRlbnQgd2F5cywgdGhpcyBpcyBtdWNoIGZhc3RlciBvbiBtYW55CisgIGtpbmRzIG9mIHBhcnRpYWxseSBvcmRlcmVkIGxpc3RzIHRoYW4gdGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLAorICBhbmQgcmVwb3J0ZWQgdG8gYmUganVzdCBhcyBmYXN0IG9uIHJhbmRvbWx5IG9yZGVyZWQgbGlzdHMgb24KKyAgc2V2ZXJhbCBtYWpvciBwbGF0Zm9ybXMuICBUaGlzIHNvcnQgaXMgYWxzbyBzdGFibGUgKGlmIEE9PUIgYW5kIEEKKyAgcHJlY2VkZXMgQiBpbiB0aGUgbGlzdCBhdCB0aGUgc3RhcnQsIEEgcHJlY2VkZXMgQiBhZnRlciB0aGUgc29ydCB0b28pLAorICBhbHRob3VnaCB0aGUgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBkb2VzIG5vdCBndWFyYW50ZWUgc3RhYmlsaXR5LiAgQQorICBwb3RlbnRpYWwgZHJhd2JhY2sgaXMgdGhhdCBsaXN0LnNvcnQoKSBtYXkgcmVxdWlyZSB0ZW1wIHNwYWNlIG9mCisgIGxlbihsaXN0KSoyIGJ5dGVzIChgYCo0YGAgb24gYSA2NC1iaXQgbWFjaGluZSkuICBJdCdzIHRoZXJlZm9yZSBwb3NzaWJsZQorICBmb3IgbGlzdC5zb3J0KCkgdG8gcmFpc2UgTWVtb3J5RXJyb3Igbm93LCBldmVuIGlmIGEgY29tcGFyaXNvbiBmdW5jdGlvbgorICBkb2VzIG5vdC4gIFNlZSA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzU4NzA3Nj4gZm9yIGZ1bGwgZGV0YWlscy4KKworLSBBbGwgc3RhbmRhcmQgaXRlcmF0b3JzIG5vdyBlbnN1cmUgdGhhdCwgb25jZSBTdG9wSXRlcmF0aW9uIGhhcyBiZWVuCisgIHJhaXNlZCwgYWxsIGZ1dHVyZSBjYWxscyB0byBuZXh0KCkgb24gdGhlIHNhbWUgaXRlcmF0b3Igd2lsbCBhbHNvCisgIHJhaXNlIFN0b3BJdGVyYXRpb24uICBUaGVyZSB1c2VkIHRvIGJlIHZhcmlvdXMgY291bnRlcmV4YW1wbGVzIHRvCisgIHRoaXMgYmVoYXZpb3IsIHdoaWNoIGNvdWxkIGNhdXNlZCBjb25mdXNpb24gb3Igc3VidGxlIHByb2dyYW0KKyAgYnJlYWthZ2UsIHdpdGhvdXQgYW55IGJlbmVmaXRzLiAgKE5vdGUgdGhhdCB0aGlzIGlzIHN0aWxsIGFuCisgIGl0ZXJhdG9yJ3MgcmVzcG9uc2liaWxpdHk7IHRoZSBpdGVyYXRvciBmcmFtZXdvcmsgZG9lcyBub3QgZW5mb3JjZQorICB0aGlzLikKKworLSBDdHJsK0MgaGFuZGxpbmcgb24gV2luZG93cyBoYXMgYmVlbiBtYWRlIG1vcmUgY29uc2lzdGVudCB3aXRoCisgIG90aGVyIHBsYXRmb3Jtcy4gIEtleWJvYXJkSW50ZXJydXB0IGNhbiBub3cgcmVsaWFibHkgYmUgY2F1Z2h0LAorICBhbmQgQ3RybCtDIGF0IGFuIGludGVyYWN0aXZlIHByb21wdCBubyBsb25nZXIgdGVybWluYXRlcyB0aGUKKyAgcHJvY2VzcyB1bmRlciBOVC8yay9YUCAoaXQgbmV2ZXIgZGlkIHVuZGVyIFdpbjl4KS4gIEN0cmwrQyB3aWxsCisgIGludGVycnVwdCB0aW1lLnNsZWVwKCkgaW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgYW55IGNoaWxkIHByb2Nlc3NlcworICBjcmVhdGVkIHZpYSB0aGUgcG9wZW4gZmFtaWx5IChvbiB3aW4yazsgd2UgY2FuJ3QgbWFrZSB3aW45eCB3b3JrCisgIHJlbGlhYmx5KSBhcmUgYWxzbyBpbnRlcnJ1cHRlZCAoYXMgZ2VuZXJhbGx5IGhhcHBlbnMgb24gZm9yIExpbnV4L1VuaXguKQorICBbU0YgYnVncyAyMzEyNzMsIDQzOTk5MiBhbmQgNTgxMjMyXQorCistIHN5cy5nZXR3aW5kb3dzdmVyc2lvbigpIGhhcyBiZWVuIGFkZGVkIG9uIFdpbmRvd3MuICBUaGlzCisgIHJldHVybnMgYSB0dXBsZSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mIFdpbmRvd3MKKyAgY3VycmVudGx5IHJ1bm5pbmcuCisKKy0gU2xpY2VzIGFuZCByZXBldGl0aW9ucyBvZiBidWZmZXIgb2JqZWN0cyBub3cgY29uc2lzdGVudGx5IHJldHVybgorICBhIHN0cmluZy4gIEZvcm1lcmx5LCBzdHJpbmdzIHdvdWxkIGJlIHJldHVybmVkIG1vc3Qgb2YgdGhlIHRpbWUsCisgIGJ1dCBhIGJ1ZmZlciBvYmplY3Qgd291bGQgYmUgcmV0dXJuZWQgd2hlbiB0aGUgcmVwZXRpdGlvbiBjb3VudAorICB3YXMgb25lIG9yIHdoZW4gdGhlIHNsaWNlIHJhbmdlIHdhcyBhbGwgaW5jbHVzaXZlLgorCistIFVuaWNvZGUgb2JqZWN0cyBpbiBzeXMucGF0aCBhcmUgbm8gbG9uZ2VyIGlnbm9yZWQgYnV0IHRyZWF0ZWQKKyAgYXMgZGlyZWN0b3J5IG5hbWVzLgorCistIEZpeGVkIHN0cmluZy5zdGFydHN3aXRoIGFuZCBzdHJpbmcuZW5kc3dpdGggYnVpbHRpbiBtZXRob2RzCisgIHNvIHRoZXkgYWNjZXB0IG5lZ2F0aXZlIGluZGljZXMuICBbU0YgYnVnIDQ5Mzk1MV0KKworLSBGaXhlZCBhIGJ1ZyB3aXRoIGEgY29udGludWUgaW5zaWRlIGEgdHJ5IGJsb2NrIGFuZCBhIHlpZWxkIGluIHRoZQorICBmaW5hbGx5IGNsYXVzZS4gIFtTRiBidWcgNTY3NTM4XQorCistIE1vc3QgYnVpbHRpbiBzZXF1ZW5jZXMgbm93IHN1cHBvcnQgImV4dGVuZGVkIHNsaWNlcyIsIGkuZS4gc2xpY2VzCisgIHdpdGggYSB0aGlyZCAic3RyaWRlIiBwYXJhbWV0ZXIuICBGb3IgZXhhbXBsZSwgImhlbGxvIHdvcmxkIls6Oi0xXQorICBnaXZlcyAiZGxyb3cgb2xsZWgiLgorCistIEEgbmV3IHdhcm5pbmcgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyB3YXMgYWRkZWQgdG8gcHJvdmlkZQorICBkaXJlY3Rpb24gb24gZmVhdHVyZXMgd2hpY2ggYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRlcHJlY2F0ZWQuCisgIFRoZSB3YXJuaW5nIHdpbGwgbm90IGJlIHByaW50ZWQgYnkgZGVmYXVsdC4gIFRvIHNlZSB0aGUgcGVuZGluZworICBkZXByZWNhdGlvbnMsIHVzZSAtV2Fsd2F5czo6UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZzo6CisgIGFzIGEgY29tbWFuZCBsaW5lIG9wdGlvbiBvciB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygpIGluIGNvZGUuCisKKy0gRGVwcmVjYXRlZCBmZWF0dXJlcyBvZiB4cmFuZ2Ugb2JqZWN0cyBoYXZlIGJlZW4gcmVtb3ZlZCBhcworICBwcm9taXNlZC4gIFRoZSBzdGFydCwgc3RvcCwgYW5kIHN0ZXAgYXR0cmlidXRlcyBhbmQgdGhlIHRvbGlzdCgpCisgIG1ldGhvZCBubyBsb25nZXIgZXhpc3QuICB4cmFuZ2UgcmVwZXRpdGlvbiBhbmQgc2xpY2luZyBoYXZlIGJlZW4KKyAgcmVtb3ZlZC4KKworLSBOZXcgYnVpbHRpbiBmdW5jdGlvbiBlbnVtZXJhdGUoeCksIGZyb20gUEVQIDI3OS4gIEV4YW1wbGU6CisgIGVudW1lcmF0ZSgiYWJjIikgaXMgYW4gaXRlcmF0b3IgcmV0dXJuaW5nICgwLCJhIiksICgxLCJiIiksICgyLCJjIikuCisgIFRoZSBhcmd1bWVudCBjYW4gYmUgYW4gYXJiaXRyYXJ5IGl0ZXJhYmxlIG9iamVjdC4KKworLSBUaGUgYXNzZXJ0IHN0YXRlbWVudCBubyBsb25nZXIgdGVzdHMgX19kZWJ1Z19fIGF0IHJ1bnRpbWUuICBUaGlzIG1lYW5zCisgIHRoYXQgYXNzZXJ0IHN0YXRlbWVudHMgY2Fubm90IGJlIGRpc2FibGVkIGJ5IGFzc2lnbmluZyBhIGZhbHNlIHZhbHVlCisgIHRvIF9fZGVidWdfXy4KKworLSBBIG1ldGhvZCB6ZmlsbCgpIHdhcyBhZGRlZCB0byBzdHIgYW5kIHVuaWNvZGUsIHRoYXQgZmlsbHMgYSBudW1lcmljCisgIHN0cmluZyB0byB0aGUgbGVmdCB3aXRoIHplcm9zLiAgRm9yIGV4YW1wbGUsCisgICIrMTIzIi56ZmlsbCg2KSAtPiAiKzAwMTIzIi4KKworLSBDb21wbGV4IG51bWJlcnMgc3VwcG9ydGVkIGRpdm1vZCgpIGFuZCB0aGUgLy8gYW5kICUgb3BlcmF0b3JzLCBidXQKKyAgdGhlc2UgbWFrZSBubyBzZW5zZS4gIFNpbmNlIHRoaXMgd2FzIGRvY3VtZW50ZWQsIHRoZXkncmUgYmVpbmcKKyAgZGVwcmVjYXRlZCBub3cuCisKKy0gU3RyaW5nIGFuZCB1bmljb2RlIG1ldGhvZHMgbHN0cmlwKCksIHJzdHJpcCgpIGFuZCBzdHJpcCgpIG5vdyB0YWtlCisgIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgc3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXJzIHRvIHN0cmlwLiAgRm9yCisgIGV4YW1wbGUsICJGb28hISE/IT8hPyIucnN0cmlwKCI/ISIpIC0+ICJGb28iLgorCistIFRoZXJlJ3MgYSBuZXcgZGljdGlvbmFyeSBjb25zdHJ1Y3RvciAoYSBjbGFzcyBtZXRob2Qgb2YgdGhlIGRpY3QKKyAgY2xhc3MpLCBkaWN0LmZyb21rZXlzKGl0ZXJhYmxlLCB2YWx1ZT1Ob25lKS4gIEl0IGNvbnN0cnVjdHMgYQorICBkaWN0aW9uYXJ5IHdpdGgga2V5cyB0YWtlbiBmcm9tIHRoZSBpdGVyYWJsZSBhbmQgYWxsIHZhbHVlcyBzZXQgdG8gYQorICBzaW5nbGUgdmFsdWUuICBJdCBjYW4gYmUgdXNlZCBmb3IgYnVpbGRpbmcgc2V0cyBhbmQgZm9yIHJlbW92aW5nCisgIGR1cGxpY2F0ZXMgZnJvbSBzZXF1ZW5jZXMuCisKKy0gQWRkZWQgYSBuZXcgZGljdCBtZXRob2QgcG9wKGtleSkuICBUaGlzIHJlbW92ZXMgYW5kIHJldHVybnMgdGhlCisgIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8ga2V5LiAgW1NGIHBhdGNoICM1Mzk5NDldCisKKy0gQSBuZXcgYnVpbHQtaW4gdHlwZSwgYm9vbCwgaGFzIGJlZW4gYWRkZWQsIGFzIHdlbGwgYXMgYnVpbHQtaW4KKyAgbmFtZXMgZm9yIGl0cyB0d28gdmFsdWVzLCBUcnVlIGFuZCBGYWxzZS4gIENvbXBhcmlzb25zIGFuZCBzdW5kcnkKKyAgb3RoZXIgb3BlcmF0aW9ucyB0aGF0IHJldHVybiBhIHRydXRoIHZhbHVlIGhhdmUgYmVlbiBjaGFuZ2VkIHRvCisgIHJldHVybiBhIGJvb2wgaW5zdGVhZC4gIFJlYWQgUEVQIDI4NSBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMKKyAgaXMgYmFja3dhcmQgY29tcGF0aWJsZS4KKworLSBGaXhlZCB0d28gYnVncyByZXBvcnRlZCBhcyBTRiAjNTM1OTA1OiB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsCisgIGRlYWxsb2NhdGluZyBhIGRlZXBseSBuZXN0ZWQgc3RydWN0dXJlIGNvdWxkIGNhdXNlIGEgc2VnZmF1bHQgaW4gdGhlCisgIGdhcmJhZ2UgY29sbGVjdG9yLCBkdWUgdG8gaW50ZXJhY3Rpb24gd2l0aCB0aGUgInRyYXNoY2FuIiBjb2RlOworICBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgZnJhbWUgZHVyaW5nIGRlc3RydWN0aW9uIG9mIGEgbG9jYWwgdmFyaWFibGUKKyAgY291bGQgYWNjZXNzIGEgcG9pbnRlciB0byBmcmVlZCBtZW1vcnkuCisKKy0gVGhlIG9wdGlvbmFsIG9iamVjdCBhbGxvY2F0b3IgKCJweW1hbGxvYyIpIGhhcyBiZWVuIGVuYWJsZWQgYnkKKyAgZGVmYXVsdC4gIFRoZSByZWNvbW1lbmRlZCBwcmFjdGljZSBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kCisgIGRlYWxsb2NhdGlvbiBoYXMgYmVlbiBzdHJlYW1saW5lZC4gIEEgaGVhZGVyIGZpbGUgaXMgaW5jbHVkZWQsCisgIE1pc2MvcHltZW1jb21wYXQuaCwgd2hpY2ggY2FuIGJlIGJ1bmRsZWQgd2l0aCAzcmQgcGFydHkgZXh0ZW5zaW9ucworICBhbmQgbGV0cyB0aGVtIHVzZSB0aGUgc2FtZSBBUEkgd2l0aCBQeXRob24gdmVyc2lvbnMgZnJvbSAxLjUuMgorICBvbndhcmRzLgorCistIFB5RXJyX0Rpc3BsYXkgd2lsbCBwcm92aWRlIGZpbGUgYW5kIGxpbmUgaW5mb3JtYXRpb24gZm9yIGFsbCBleGNlcHRpb25zCisgIHRoYXQgaGF2ZSBhbiBhdHRyaWJ1dGUgcHJpbnRfZmlsZV9hbmRfbGluZSwgbm90IGp1c3QgU3ludGF4RXJyb3JzLgorCistIFRoZSBVVEYtOCBjb2RlYyB3aWxsIG5vdyBlbmNvZGUgYW5kIGRlY29kZSBVbmljb2RlIHN1cnJvZ2F0ZXMKKyAgY29ycmVjdGx5IGFuZCB3aXRob3V0IHJhaXNpbmcgZXhjZXB0aW9ucyBmb3IgdW5wYWlyZWQgb25lcy4KKworLSBVbml2ZXJzYWwgbmV3bGluZXMgKFBFUCAyNzgpIGlzIGltcGxlbWVudGVkLiAgQnJpZWZseSwgdXNpbmcgJ1UnCisgIGluc3RlYWQgb2YgJ3InIHdoZW4gb3BlbmluZyBhIHRleHQgZmlsZSBmb3IgcmVhZGluZyBjaGFuZ2VzIHRoZSBsaW5lCisgIGVuZGluZyBjb252ZW50aW9uIHNvIHRoYXQgYW55IG9mICdccicsICdcclxuJywgYW5kICdcbicgaXMKKyAgcmVjb2duaXplZCAoZXZlbiBtaXhlZCBpbiBvbmUgZmlsZSk7IGFsbCB0aHJlZSBhcmUgY29udmVydGVkIHRvCisgICdcbicsIHRoZSBzdGFuZGFyZCBQeXRob24gbGluZSBlbmQgY2hhcmFjdGVyLgorCistIGZpbGUueHJlYWRsaW5lcygpIG5vdyByYWlzZXMgYSBWYWx1ZUVycm9yIGlmIHRoZSBmaWxlIGlzIGNsb3NlZDoKKyAgUHJldmlvdXNseSwgYW4geHJlYWRsaW5lcyBvYmplY3Qgd2FzIHJldHVybmVkIHdoaWNoIHdvdWxkIHJhaXNlCisgIGEgVmFsdWVFcnJvciB3aGVuIHRoZSB4cmVhZGxpbmVzLm5leHQoKSBtZXRob2Qgd2FzIGNhbGxlZC4KKworLSBzeXMuZXhpdCgpIGluYWR2ZXJ0ZW50bHkgYWxsb3dlZCBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LgorICBBbiBleGNlcHRpb24gd2lsbCBub3cgYmUgcmFpc2VkIGlmIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgaXMgdXNlZC4KKworLSBDaGFuZ2VkIGV2YWx1YXRpb24gb3JkZXIgb2YgZGljdGlvbmFyeSBsaXRlcmFscyB0byBjb25mb3JtIHRvIHRoZQorICBnZW5lcmFsIGxlZnQgdG8gcmlnaHQgZXZhbHVhdGlvbiBvcmRlciBydWxlLiBOb3cge2YxKCk6IGYyKCl9IHdpbGwKKyAgZXZhbHVhdGUgZjEgZmlyc3QuCisKKy0gRml4ZWQgYnVnICM1MjE3ODI6IHdoZW4gYSBmaWxlIHdhcyBpbiBub24tYmxvY2tpbmcgbW9kZSwgZmlsZS5yZWFkKCkKKyAgY291bGQgc2lsZW50bHkgbG9zZSBkYXRhIG9yIHdyb25nbHkgdGhyb3cgYW4gdW5rbm93biBlcnJvci4KKworLSBUaGUgc3FfcmVwZWF0LCBzcV9pbnBsYWNlX3JlcGVhdCwgc3FfY29uY2F0IGFuZCBzcV9pbnBsYWNlX2NvbmNhdAorICBzbG90cyBhcmUgbm93IGFsd2F5cyB0cmllZCBhZnRlciB0cnlpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbmJfKiBzbG90cy4KKyAgVGhpcyBmaXhlcyBhIG51bWJlciBvZiBtaW5vciBidWdzIChzZWUgYnVnICM2MjQ4MDcpLgorCistIEZpeCBwcm9ibGVtIHdpdGggZHluYW1pYyBsb2FkaW5nIG9uIDY0LWJpdCBBSVggKHNlZSBidWcgIzYzOTk0NSkuCisKK0V4dGVuc2lvbiBtb2R1bGVzCistLS0tLS0tLS0tLS0tLS0tLQorCistIEFkZGVkIHRocmVlIG9wZXJhdG9ycyB0byB0aGUgb3BlcmF0b3IgbW9kdWxlOgorICAgIG9wZXJhdG9yLnBvdyhhLGIpIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG86ICBhKipiLgorICAgIG9wZXJhdG9yLmlzXyhhLGIpIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG86ICBhIGlzIGIuCisgICAgb3BlcmF0b3IuaXNfbm90KGEsYikgd2hpY2ggaXMgZXF1aXZhbGVudCB0bzogIGEgaXMgbm90IGIuCisKKy0gcG9zaXgub3BlbnB0eSBub3cgd29ya3Mgb24gYWxsIHN5c3RlbXMgdGhhdCBoYXZlIC9kZXYvcHRteC4KKworLSBBIG1vZHVsZSB6aXBpbXBvcnQgZXhpc3RzIHRvIHN1cHBvcnQgaW1wb3J0aW5nIGNvZGUgZnJvbSB6aXAKKyAgYXJjaGl2ZXMuCisKKy0gVGhlIG5ldyBkYXRldGltZSBtb2R1bGUgc3VwcGxpZXMgY2xhc3NlcyBmb3IgbWFuaXB1bGF0aW5nIGRhdGVzIGFuZAorICB0aW1lcy4gIFRoZSBiYXNpYyBkZXNpZ24gY2FtZSBmcm9tIHRoZSBab3BlICJmaXNoYm93bCBwcm9jZXNzIiwgYW5kCisgIGZhdm9ycyBwcmFjdGljYWwgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMgb3ZlciBjYWxlbmRhciBlc290ZXJpY2EuICBTZWUKKworICAgICAgaHR0cDovL3d3dy56b3BlLm9yZy9NZW1iZXJzL2ZkcmFrZS9EYXRlVGltZVdpa2kvRnJvbnRQYWdlCisKKy0gX3RraW50ZXIgbm93IHJldHVybnMgVGNsIG9iamVjdHMsIGluc3RlYWQgb2Ygc3RyaW5ncy4gT2JqZWN0cyB3aGljaAorICBoYXZlIFB5dGhvbiBlcXVpdmFsZW50cyBhcmUgY29udmVydGVkIHRvIFB5dGhvbiBvYmplY3RzLCBvdGhlciBvYmplY3RzCisgIGFyZSB3cmFwcGVkLiBUaGlzIGNhbiBiZSBjb25maWd1cmVkIHRocm91Z2ggdGhlIHdhbnRvYmplY3RzIG1ldGhvZCwKKyAgb3IgVGtpbnRlci53YW50b2JqZWN0cy4KKworLSBUaGUgUHlCU0REQiB3cmFwcGVyIGFyb3VuZCB0aGUgU2xlZXB5Y2F0IEJlcmtlbGV5IERCIGxpYnJhcnkgaGFzCisgIGJlZW4gYWRkZWQgYXMgdGhlIHBhY2thZ2UgYnNkZGIuICBUaGUgdHJhZGl0aW9uYWwgYnNkZGIgbW9kdWxlIGlzCisgIHN0aWxsIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSwgYnV0IG5vdCBidWlsdCBhdXRvbWF0aWNhbGx5IGFueW1vcmUsCisgIGFuZCBpcyBub3cgbmFtZWQgYnNkZGIxODUuICBUaGlzIHN1cHBvcnRzIEJlcmtlbGV5IERCIHZlcnNpb25zIGZyb20KKyAgMy4wIHRvIDQuMS4gIEZvciBoZWxwIGNvbnZlcnRpbmcgeW91ciBkYXRhYmFzZXMgZnJvbSB0aGUgb2xkIG1vZHVsZSAod2hpY2gKKyAgcHJvYmFibHkgdXNlZCBhbiBvYnNvbGV0ZSB2ZXJzaW9uIG9mIEJlcmtlbGV5IERCKSB0byB0aGUgbmV3IG1vZHVsZSwgc2VlCisgIHRoZSBkYjJwaWNrbGUucHkgYW5kIHBpY2tsZTJkYi5weSBzY3JpcHRzIGRlc2NyaWJlZCBpbiB0aGUgVG9vbHMvRGVtb3MKKyAgc2VjdGlvbiBhYm92ZS4KKworLSB1bmljb2RlZGF0YSB3YXMgdXBkYXRlZCB0byBVbmljb2RlIDMuMi4gSXQgc3VwcG9ydHMgbm9ybWFsaXphdGlvbgorICBhbmQgbmFtZXMgZm9yIEhhbmd1bCBzeWxsYWJsZXMgYW5kIENKSyB1bmlmaWVkIGlkZW9ncmFwaHMuCisKKy0gcmVzb3VyY2UuZ2V0cmxpbWl0KCkgbm93IHJldHVybnMgbG9uZ3MgaW5zdGVhZCBvZiBpbnRzLgorCistIHJlYWRsaW5lIG5vdyBkeW5hbWljYWxseSBhZGp1c3RzIGl0cyBpbnB1dC9vdXRwdXQgc3RyZWFtIGlmCisgIHN5cy5zdGRpbi9zdGRvdXQgY2hhbmdlcy4KKworLSBUaGUgX3RraW50ZXIgbW9kdWxlIChhbmQgaGVuY2UgVGtpbnRlcikgaGFzIGRyb3BwZWQgc3VwcG9ydCBmb3IKKyAgVGNsL1RrIDguMCBhbmQgOC4xLiAgT25seSBUY2wvVGsgdmVyc2lvbnMgOC4yLCA4LjMgYW5kIDguNCBhcmUKKyAgc3VwcG9ydGVkLgorCistIGNQaWNrbGUuQmFkUGlja2xlR2V0IGlzIG5vdyBhIGNsYXNzLgorCistIFRoZSB0aW1lIHN0YW1wcyBpbiBvcy5zdGF0X3Jlc3VsdCBhcmUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycworICBhZnRlciBzdGF0X2Zsb2F0X3RpbWVzIGhhcyBiZWVuIGNhbGxlZC4KKworLSBJZiB0aGUgc2l6ZSBwYXNzZWQgdG8gbW1hcC5tbWFwKCkgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUKKyAgZmlsZSBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIGEgVmFsdWVFcnJvciBpcyByYWlzZWQuIFtTRiBidWcgNTg1NzkyXQorCistIFRoZSB4cmVhZGxpbmVzIG1vZHVsZSBpcyBzbGF0ZWQgZm9yIG9ic29sZXNjZW5jZS4KKworLSBUaGUgc3RycHRpbWUgZnVuY3Rpb24gaW4gdGhlIHRpbWUgbW9kdWxlIGlzIG5vdyBhbHdheXMgYXZhaWxhYmxlIChhCisgIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHdoZW4gdGhlIEMgbGlicmFyeSBkb2Vzbid0IGRlZmluZSBpdCkuCisKKy0gVGhlICduZXcnIG1vZHVsZSBpcyBubyBsb25nZXIgYW4gZXh0ZW5zaW9uLCBidXQgYSBQeXRob24gbW9kdWxlIHRoYXQKKyAgb25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgSXRzIGNvbnRlbnRzIGFyZSBubyBsb25nZXIKKyAgZnVuY3Rpb25zIGJ1dCBjYWxsYWJsZSB0eXBlIG9iamVjdHMuCisKKy0gVGhlIGJzZGRiLipvcGVuIGZ1bmN0aW9ucyBjYW4gbm93IHRha2UgJ05vbmUnIGFzIGEgZmlsZW5hbWUuCisgIFRoaXMgd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgaW4tbWVtb3J5IGJzZGRiIHRoYXQgd29uJ3QgYmUKKyAgd3JpdHRlbiB0byBkaXNrLgorCistIHBvc2l4LmdldGxvYWRhdmcsIHBvc2l4LmxjaG93biwgcG9zaXgua2lsbHBnLCBwb3NpeC5ta25vZCwgYW5kCisgIHBvc2l4LmdldHBnaWQgaGF2ZSBiZWVuIGFkZGVkIHdoZXJlIGF2YWlsYWJsZS4KKworLSBUaGUgbG9jYWxlIG1vZHVsZSBub3cgZXhwb3NlcyB0aGUgQyBsaWJyYXJ5J3MgZ2V0dGV4dCBpbnRlcmZhY2UuIEl0CisgIGFsc28gaGFzIGEgbmV3IGZ1bmN0aW9uIGdldHByZWZlcnJlZGVuY29kaW5nLgorCistIEEgc2VjdXJpdHkgaG9sZSAoImRvdWJsZSBmcmVlIikgd2FzIGZvdW5kIGluIHpsaWItMS4xLjMsIGEgcG9wdWxhcgorICB0aGlyZCBwYXJ0eSBjb21wcmVzc2lvbiBsaWJyYXJ5IHVzZWQgYnkgc29tZSBQeXRob24gbW9kdWxlcy4gIFRoZQorICBob2xlIHdhcyBxdWlja2x5IHBsdWdnZWQgaW4gemxpYi0xLjEuNCwgYW5kIHRoZSBXaW5kb3dzIGJ1aWxkIG9mCisgIFB5dGhvbiBub3cgc2hpcHMgd2l0aCB6bGliLTEuMS40LgorCistIHB3ZCwgZ3JwLCBhbmQgcmVzb3VyY2UgcmV0dXJuIGVuaGFuY2VkIHR1cGxlcyBub3csIHdpdGggc3ltYm9saWMKKyAgZmllbGQgbmFtZXMuCisKKy0gYXJyYXkuYXJyYXkgaXMgbm93IGEgdHlwZSBvYmplY3QuIEEgbmV3IGZvcm1hdCBjaGFyYWN0ZXIKKyAgJ3UnIGluZGljYXRlcyBQeV9VTklDT0RFIGFycmF5cy4gRm9yIHRob3NlLCAudG91bmljb2RlIGFuZAorICAuZnJvbXVuaWNvZGUgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLiBBcnJheXMgbm93IHN1cHBvcnQgX19pYWRkX18KKyAgYW5kIF9faW11bF9fLgorCistIGRsIG5vdyBidWlsZHMgb24gZXZlcnkgc3lzdGVtIHRoYXQgaGFzIGRsZmNuLmguICBGYWlsdXJlIGluIGNhc2UKKyAgb2Ygc2l6ZW9mKGludCkhPXNpemVvZihsb25nKSE9c2l6ZW9mKHZvaWQqKSBpcyBkZWxheWVkIHVudGlsIGRsLm9wZW4KKyAgaXMgY2FsbGVkLgorCistIFRoZSBzeXMgbW9kdWxlIGFjcXVpcmVkIGEgbmV3IGF0dHJpYnV0ZSwgYXBpX3ZlcnNpb24sIHdoaWNoIGV2YWx1YXRlcworICB0byB0aGUgdmFsdWUgb2YgdGhlIFBZVEhPTl9BUElfVkVSU0lPTiBtYWNybyB3aXRoIHdoaWNoIHRoZQorICBpbnRlcnByZXRlciB3YXMgY29tcGlsZWQuCisKKy0gRml4ZWQgYnVnICM0NzA1ODI6IHNyZSBtb2R1bGUgd291bGQgcmV0dXJuIGEgdHVwbGUgKE5vbmUsICdhJywgJ2FiJykKKyAgd2hlbiBhcHBseWluZyB0aGUgcmVndWxhciBleHByZXNzaW9uICdeKChhKWMpPyhhYikkJyBvbiAnYWInLiBJdCBub3cKKyAgcmV0dXJucyAoTm9uZSwgTm9uZSwgJ2FiJyksIGFzIGV4cGVjdGVkLiBBbHNvIGZpeGVkIGhhbmRsaW5nIG9mCisgIGxhc3RpbmRleC9sYXN0Z3JvdXAgbWF0Y2ggYXR0cmlidXRlcyBpbiBzaW1pbGFyIGNhc2VzLiBGb3IgZXhhbXBsZSwKKyAgd2hlbiBydW5uaW5nIHRoZSBleHByZXNzaW9uIHInKGEpKGIpP2InIG92ZXIgJ2FiJywgbGFzdGluZGV4IG11c3QgYmUKKyAgMSwgbm90IDIuCisKKy0gRml4ZWQgYnVnICM1ODEwODA6IHNyZSBzY2FubmVyIHdhcyBub3QgY2hlY2tpbmcgdGhlIGJ1ZmZlciBsaW1pdAorICBiZWZvcmUgaW5jcmVhc2luZyB0aGUgY3VycmVudCBwb2ludGVyLiBUaGlzIHdhcyBjcmVhdGluZyBhbiBpbmZpbml0ZQorICBsb29wIGluIHRoZSBzZWFyY2ggZnVuY3Rpb24sIG9uY2UgdGhlIHBvaW50ZXIgZXhjZWVkZWQgdGhlIGJ1ZmZlcgorICBsaW1pdC4KKworLSBUaGUgb3MuZmRvcGVuIGZ1bmN0aW9uIG5vdyBlbmZvcmNlcyBhIGZpbGUgbW9kZSBzdGFydGluZyB3aXRoIHRoZQorICBsZXR0ZXIgJ3InLCAndycgb3IgJ2EnLCBvdGhlcndpc2UgYSBWYWx1ZUVycm9yIGlzIHJhaXNlZC4gVGhpcyBmaXhlcworICBidWcgIzYyMzQ2NC4KKworLSBUaGUgbGludXhhdWRpb2RldiBtb2R1bGUgaXMgbm93IGRlcHJlY2F0ZWQ7IGl0IGlzIGJlaW5nIHJlcGxhY2VkIGJ5CisgIG9zc2F1ZGlvZGV2LiAgVGhlIGludGVyZmFjZSBoYXMgYmVlbiBleHRlbmRlZCB0byBjb3ZlciBhIGxvdCBtb3JlIG9mCisgIE9TUyAoc2VlIHd3dy5vcGVuc291bmQuY29tKSwgaW5jbHVkaW5nIG1vc3QgRFNQIGlvY3RscyBhbmQgdGhlCisgIE9TUyBtaXhlciBBUEkuICBEb2N1bWVudGF0aW9uIGZvcnRoY29taW5nIGluIDIuM2EyLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gaW1hcGxpYi5weSBub3cgc3VwcG9ydHMgU1NMIChUaW5vIExhbmdlIGFuZCBQaWVycyBMYXVkZXIpLgorCistIEZyZWV6ZSdzIG1vZHVsZWZpbmRlci5weSBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgc3RhbmRhcmQgbGlicmFyeTsKKyAgc2xpZ2h0bHkgaW1wcm92ZWQgc28gaXQgd2lsbCBpc3N1ZSBsZXNzIGZhbHNlIG1pc3Npbmcgc3VibW9kdWxlCisgIHJlcG9ydHMgKHNlZSBzZiBwYXRoICM2NDM3MTEgZm9yIGRldGFpbHMpLiAgRG9jdW1lbnRhdGlvbiB3aWxsIGZvbGxvdworICB3aXRoIFB5dGhvbiAyLjNhMi4KKworLSBvcy5wYXRoIGV4cG9zZXMgZ2V0Y3RpbWUuCisKKy0gdW5pdHRlc3QucHkgbm93IGhhcyB0d28gYWRkaXRpb25hbCBtZXRob2RzIGNhbGxlZCBhc3NlcnRBbG1vc3RFcXVhbCgpCisgIGFuZCBmYWlsSWZBbG1vc3RFcXVhbCgpLiAgVGhleSBpbXBsZW1lbnQgYW4gYXBwcm94aW1hdGUgY29tcGFyaXNvbgorICBieSByb3VuZGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gYXJndW1lbnRzIGFuZCBjb21wYXJpbmcKKyAgdGhlIHJlc3VsdCB0byB6ZXJvLiAgQXBwcm94aW1hdGUgY29tcGFyaXNvbiBpcyBlc3NlbnRpYWwgZm9yCisgIHVuaXQgdGVzdHMgb2YgZmxvYXRpbmcgcG9pbnQgcmVzdWx0cy4KKworLSBjYWxlbmRhci5weSBub3cgZGVwZW5kcyBvbiB0aGUgbmV3IGRhdGV0aW1lIG1vZHVsZSByYXRoZXIgdGhhbgorICB0aGUgdGltZSBtb2R1bGUuICBBcyBhIHJlc3VsdCwgdGhlIHJhbmdlIG9mIGFsbG93YWJsZSBkYXRlcworICBoYXMgYmVlbiBpbmNyZWFzZWQuCisKKy0gcGRiIGhhcyBhIG5ldyAnaih1bXApJyBjb21tYW5kIHRvIHNlbGVjdCB0aGUgbmV4dCBsaW5lIHRvIGJlCisgIGV4ZWN1dGVkLgorCistIFRoZSBkaXN0dXRpbHMgY3JlYXRlZCB3aW5kb3dzIGluc3RhbGxlcnMgbm93IGNhbiBydW4gYQorICBwb3N0aW5zdGFsbGF0aW9uIHNjcmlwdC4KKworLSBkb2N0ZXN0LnRlc3Rtb2QgY2FuIG5vdyBiZSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudCwgd2hpY2ggbWVhbnMgdG8KKyAgdGVzdCB0aGUgY3VycmVudCBtb2R1bGUuCisKKy0gV2hlbiBjYW5jZWxpbmcgYSBzZXJ2ZXIgdGhhdCBpbXBsZW1lbnRlZCB0aHJlYWRpbmcgd2l0aCBhIGtleWJvYXJkCisgIGludGVycnVwdCwgdGhlIHNlcnZlciB3b3VsZCBzaHV0IGRvd24gYnV0IG5vdCB0ZXJtaW5hdGUgKHdhaXRpbmcgb24KKyAgY2xpZW50IHRocmVhZHMpLiBBIG5ldyBtZW1iZXIgdmFyaWFibGUsIGRhZW1vbl90aHJlYWRzLCB3YXMgYWRkZWQgdG8KKyAgdGhlIFRocmVhZGluZ01peEluIGNsYXNzIGluIFNvY2tldFNlcnZlci5weSB0byBtYWtlIGl0IGV4cGxpY2l0IHRoYXQKKyAgdGhpcyBiZWhhdmlvciBuZWVkcyB0byBiZSBjb250cm9sbGVkLgorCistIEEgbmV3IG1vZHVsZSwgb3B0cGFyc2UsIHByb3ZpZGVzIGEgZmFuY3kgYWx0ZXJuYXRpdmUgdG8gZ2V0b3B0IGZvcgorICBjb21tYW5kIGxpbmUgcGFyc2luZy4gIEl0IGlzIGEgc2xpZ2h0bHkgbW9kaWZpZWQgdmVyc2lvbiBvZiBHcmVnCisgIFdhcmQncyBPcHRpayBwYWNrYWdlLgorCistIFVzZXJEaWN0LnB5IG5vdyBkZWZpbmVzIGEgRGljdE1peGluIGNsYXNzIHdoaWNoIGRlZmluZXMgYWxsIGRpY3Rpb25hcnkKKyAgbWV0aG9kcyBmb3IgY2xhc3NlcyB0aGF0IGFscmVhZHkgaGF2ZSBhIG1pbmltdW0gbWFwcGluZyBpbnRlcmZhY2UuCisgIFRoaXMgZ3JlYXRseSBzaW1wbGlmaWVzIHdyaXRpbmcgY2xhc3NlcyB0aGF0IG5lZWQgdG8gYmUgc3Vic3RpdHV0YWJsZQorICBmb3IgZGljdGlvbmFyaWVzIChzdWNoIGFzIHRoZSBzaGVsdmUgbW9kdWxlKS4KKworLSBzaGVsdmUucHkgbm93IHN1YmNsYXNzZXMgZnJvbSBVc2VyRGljdC5EaWN0TWl4aW4uICBOb3cgc2hlbHZlIHN1cHBvcnRzCisgIGFsbCBkaWN0aW9uYXJ5IG1ldGhvZHMuICBUaGlzIGVhc2VzIHRoZSB0cmFuc2l0aW9uIHRvIHBlcnNpc3RlbnQKKyAgc3RvcmFnZSBmb3Igc2NyaXB0cyBvcmlnaW5hbGx5IHdyaXR0ZW4gd2l0aCBkaWN0aW9uYXJpZXMgaW4gbWluZC4KKworLSBzaGVsdmUub3BlbiBhbmQgdGhlIHZhcmlvdXMgY2xhc3NlcyBpbiBzaGVsdmUucHkgbm93IGFjY2VwdCBhbiBvcHRpb25hbAorICBiaW5hcnkgZmxhZywgd2hpY2ggZGVmYXVsdHMgdG8gRmFsc2UuICBJZiBUcnVlLCB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUKKyAgc2hlbGYgYXJlIGJpbmFyeSBwaWNrbGVzLgorCistIEEgbmV3IHBhY2thZ2UsIGxvZ2dpbmcsIGltcGxlbWVudHMgdGhlIGxvZ2dpbmcgQVBJIGRlZmluZWQgYnkgUEVQCisgIDI4Mi4gIFRoZSBjb2RlIGlzIHdyaXR0ZW4gYnkgVmluYXkgU2FqaXAuCisKKy0gU3RyZWFtUmVhZGVyLCBTdHJlYW1SZWFkZXJXcml0ZXIgYW5kIFN0cmVhbVJlY29kZXIgaW4gdGhlIGNvZGVjcworICBtb2R1bGVzIGFyZSBpdGVyYXRvcnMgbm93LgorCistIGd6aXAucHkgbm93IGhhbmRsZXMgZmlsZXMgZXhjZWVkaW5nIDJHQi4gIEZpbGVzIG92ZXIgNEdCIGFsc28gd29yaworICBub3cgKHByb3ZpZGVkIHRoZSBPUyBzdXBwb3J0cyBpdCwgYW5kIFB5dGhvbiBpcyBjb25maWd1cmVkIHdpdGggbGFyZ2UKKyAgZmlsZSBzdXBwb3J0KSwgYnV0IGluIHRoYXQgY2FzZSB0aGUgdW5kZXJseWluZyBnemlwIGZpbGUgZm9ybWF0IGNhbgorICByZWNvcmQgb25seSB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgMzIgYml0cyBvZiB0aGUgZmlsZSBzaXplLCBzbyB0aGF0CisgIHNvbWUgdG9vbHMgd29ya2luZyB3aXRoIGd6aXBwZWQgZmlsZXMgbWF5IHJlcG9ydCBhbiBpbmNvcnJlY3QgZmlsZQorICBzaXplLgorCistIHhtbC5zYXguc2F4dXRpbHMudW5lc2NhcGUgaGFzIGJlZW4gYWRkZWQsIHRvIHJlcGxhY2UgZW50aXR5IHJlZmVyZW5jZXMKKyAgd2l0aCB0aGVpciBlbnRpdHkgdmFsdWUuCisKKy0gUXVldWUuUXVldWUue3B1dCxnZXR9IG5vdyBzdXBwb3J0IGFuIG9wdGlvbmFsIHRpbWVvdXQgYXJndW1lbnQuCisKKy0gVmFyaW91cyBmZWF0dXJlcyBvZiBUayA4LjQgYXJlIGV4cG9zZWQgaW4gVGtpbnRlci5weS4gVGhlIG11bHRpcGxlCisgIG9wdGlvbiBvZiB0a0ZpbGVEaWFsb2cgaXMgZXhwb3NlZCBhcyBmdW5jdGlvbiBhc2tvcGVuZmlsZXssbmFtZX1zLgorCistIFZhcmlvdXMgY29uZmlndXJlIG1ldGhvZHMgb2YgVGtpbnRlciBoYXZlIGJlZW4gc3RyZWFtLWxpbmVkLCBzbyB0aGF0CisgIHRhZ19jb25maWd1cmUsIGltYWdlX2NvbmZpZ3VyZSwgd2luZG93X2NvbmZpZ3VyZSBub3cgcmV0dXJuIGEKKyAgZGljdGlvbmFyeSB3aGVuIGludm9rZWQgd2l0aCBubyBhcmd1bWVudC4KKworLSBJbXBvcnRpbmcgdGhlIHJlYWRsaW5lIG1vZHVsZSBub3cgbm8gbG9uZ2VyIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YKKyAgY2FsbGluZyBzZXRsb2NhbGUoTENfQ1RZUEUsICIiKS4gIFRoZSBpbml0aWFsICJDIiBsb2NhbGUsIG9yCisgIHdoYXRldmVyIGxvY2FsZSBpcyBleHBsaWNpdGx5IHNldCBieSB0aGUgdXNlciwgaXMgcHJlc2VydmVkLiAgSWYgeW91CisgIHdhbnQgcmVwcigpIG9mIDgtYml0IHN0cmluZ3MgaW4geW91ciBwcmVmZXJyZWQgZW5jb2RpbmcgdG8gcHJlc2VydmUKKyAgYWxsIHByaW50YWJsZSBjaGFyYWN0ZXJzIG9mIHRoYXQgZW5jb2RpbmcsIHlvdSBoYXZlIHRvIGFkZCB0aGUKKyAgZm9sbG93aW5nIGNvZGUgdG8geW91ciAkUFlUSE9OU1RBUlRVUCBmaWxlIG9yIHRvIHlvdXIgYXBwbGljYXRpb24ncworICBtYWluKCk6CisKKyAgICBpbXBvcnQgbG9jYWxlCisgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUsICIiKQorCistIHNodXRpbC5tb3ZlIHdhcyBhZGRlZC4gc2h1dGlsLmNvcHl0cmVlIG5vdyByZXBvcnRzIGVycm9ycyBhcyBhbgorICBleGNlcHRpb24gYXQgdGhlIGVuZCwgaW5zdGVhZCBvZiBwcmludGluZyBlcnJvciBtZXNzYWdlcy4KKworLSBFbmNvZGluZyBuYW1lIG5vcm1hbGl6YXRpb24gd2FzIGdlbmVyYWxpemVkIHRvIG5vdCBvbmx5CisgIHJlcGxhY2UgaHlwaGVucyB3aXRoIHVuZGVyc2NvcmVzLCBidXQgYWxzbyBhbGwgb3RoZXIgbm9uLWFscGhhbnVtZXJpYworICBjaGFyYWN0ZXJzICh3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGRvdCB3aGljaCBpcyB1c2VkIGZvciBQeXRob24KKyAgcGFja2FnZSBuYW1lcyBkdXJpbmcgbG9va3VwKS4gVGhlIGFsaWFzZXMucHkgbWFwcGluZyB3YXMgdXBkYXRlZAorICB0byB0aGUgbmV3IHN0YW5kYXJkLgorCistIG1pbWV0eXBlcyBoYXMgdHdvIG5ldyBmdW5jdGlvbnM6IGd1ZXNzX2FsbF9leHRlbnNpb25zKCkgd2hpY2gKKyAgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGtub3duIGV4dGVuc2lvbnMgZm9yIGEgbWltZSB0eXBlLCBhbmQKKyAgYWRkX3R5cGUoKSB3aGljaCBhZGRzIG9uZSBtYXBwaW5nIGJldHdlZW4gYSBtaW1lIHR5cGUgYW5kCisgIGFuIGV4dGVuc2lvbiB0byB0aGUgZGF0YWJhc2UuCisKKy0gTmV3IG1vZHVsZTogc2V0cywgZGVmaW5lcyB0aGUgY2xhc3MgU2V0IHRoYXQgaW1wbGVtZW50cyBhIG11dGFibGUKKyAgc2V0IHR5cGUgdXNpbmcgdGhlIGtleXMgb2YgYSBkaWN0IHRvIHJlcHJlc2VudCB0aGUgc2V0LiAgVGhlcmUncworICBhbHNvIGEgY2xhc3MgSW1tdXRhYmxlU2V0IHdoaWNoIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHNldHMgb2Ygc2V0cworICBvciB3aGVuIHlvdSBuZWVkIHRvIHVzZSBzZXRzIGFzIGRpY3Qga2V5cywgYW5kIGEgY2xhc3MgQmFzZVNldCB3aGljaAorICBpcyB0aGUgYmFzZSBjbGFzcyBvZiB0aGUgdHdvLgorCistIEFkZGVkIHJhbmRvbS5zYW1wbGUocG9wdWxhdGlvbixrKSBmb3IgcmFuZG9tIHNhbXBsaW5nIHdpdGhvdXQgcmVwbGFjZW1lbnQuCisgIFJldHVybnMgYSBrIGxlbmd0aCBsaXN0IG9mIHVuaXF1ZSBlbGVtZW50cyBjaG9zZW4gZnJvbSB0aGUgcG9wdWxhdGlvbi4KKworLSByYW5kb20ucmFuZHJhbmdlKC1zeXMubWF4aW50LTEsIHN5cy5tYXhpbnQpIG5vIGxvbmdlciByYWlzZXMKKyAgT3ZlcmZsb3dFcnJvci4gIFRoYXQgaXMsIGl0IG5vdyBhY2NlcHRzIGFueSBjb21iaW5hdGlvbiBvZiAnc3RhcnQnCisgIGFuZCAnc3RvcCcgYXJndW1lbnRzIHNvIGxvbmcgYXMgZWFjaCBpcyBpbiB0aGUgcmFuZ2Ugb2YgUHl0aG9uJ3MKKyAgYm91bmRlZCBpbnRlZ2Vycy4KKworLSBUaGFua3MgdG8gUmF5bW9uZCBIZXR0aW5nZXIsIHJhbmRvbS5yYW5kb20oKSBub3cgdXNlcyBhIG5ldyBjb3JlCisgIGdlbmVyYXRvci4gIFRoZSBNZXJzZW5uZSBUd2lzdGVyIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCBpbiBDLAorICB0aHJlYWRzYWZlLCBmYXN0ZXIgdGhhbiB0aGUgcHJldmlvdXMgZ2VuZXJhdG9yLCBoYXMgYW4gYXN0cm9ub21pY2FsbHkKKyAgbGFyZ2UgcGVyaW9kICgyKioxOTkzNy0xKSwgY3JlYXRlcyByYW5kb20gZmxvYXRzIHRvIGZ1bGwgNTMtYml0CisgIHByZWNpc2lvbiwgYW5kIG1heSBiZSB0aGUgbW9zdCB3aWRlbHkgdGVzdGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgIGluIGV4aXN0ZW5jZS4KKworICBUaGUgcmFuZG9tLmp1bXBhaGVhZChuKSBtZXRob2QgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZm9yIHRoZSBuZXcKKyAgZ2VuZXJhdG9yLiAgSW5zdGVhZCBvZiBqdW1waW5nIG4gc3RlcHMgYWhlYWQsIGl0IHVzZXMgbiBhbmQgdGhlCisgIGV4aXN0aW5nIHN0YXRlIHRvIGNyZWF0ZSBhIG5ldyBzdGF0ZS4gIFRoaXMgbWVhbnMgdGhhdCBqdW1wYWhlYWQoKQorICBjb250aW51ZXMgdG8gc3VwcG9ydCBtdWx0aS10aHJlYWRlZCBjb2RlIG5lZWRpbmcgZ2VuZXJhdG9ycyBvZgorICBub24tb3ZlcmxhcHBpbmcgc2VxdWVuY2VzLiAgSG93ZXZlciwgaXQgd2lsbCBicmVhayBjb2RlIHdoaWNoIHJlbGllcworICBvbiBqdW1wYWhlYWQgbW92aW5nIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHN0ZXBzIGZvcndhcmQuCisKKyAgVGhlIGF0dHJpYnV0ZXMgcmFuZG9tLndoc2VlZCBhbmQgcmFuZG9tLl9fd2hzZWVkIGhhdmUgbm8gbWVhbmluZyBmb3IKKyAgdGhlIG5ldyBnZW5lcmF0b3IuICBDb2RlIHVzaW5nIHRoZXNlIGF0dHJpYnV0ZXMgc2hvdWxkIHN3aXRjaCB0byBhCisgIG5ldyBjbGFzcywgcmFuZG9tLldpY2htYW5uSGlsbCB3aGljaCBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmQKKyAgY29tcGF0aWJpbGl0eSBhbmQgdG8gbWFrZSBhbiBhbHRlcm5hdGUgZ2VuZXJhdG9yIGF2YWlsYWJsZS4KKworLSBOZXcgImFsZ29yaXRobXMiIG1vZHVsZTogaGVhcHEsIGltcGxlbWVudHMgYSBoZWFwIHF1ZXVlLiAgVGhhbmtzIHRvCisgIEtldmluIE8nQ29ubm9yIGZvciB0aGUgY29kZSBhbmQgRnJhbsOnb2lzIFBpbmFyZCBmb3IgYW4gZW50ZXJ0YWluaW5nCisgIHdyaXRlLXVwIGV4cGxhaW5pbmcgdGhlIHRoZW9yeSBhbmQgcHJhY3RpY2FsIHVzZXMgb2YgaGVhcHMuCisKKy0gTmV3IGVuY29kaW5nIGZvciB0aGUgUGFsbSBPUyBjaGFyYWN0ZXIgc2V0OiBwYWxtb3MuCisKKy0gYmluYXNjaWkuY3JjMzIoKSBhbmQgdGhlIHppcGZpbGUgbW9kdWxlIGhhZCBwcm9ibGVtcyBvbiBzb21lIDY0LWJpdAorICBwbGF0Zm9ybXMuICBUaGVzZSBoYXZlIGJlZW4gZml4ZWQuICBPbiBhIHBsYXRmb3JtIHdpdGggOC1ieXRlIEMgbG9uZ3MsCisgIGNyYzMyKCkgbm93IHJldHVybnMgYSBzaWduZWQtZXh0ZW5kZWQgNC1ieXRlIHJlc3VsdCwgc28gdGhhdCBpdHMgdmFsdWUKKyAgYXMgYSBQeXRob24gaW50IGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSBjb21wdXRlZCBhIDMyLWJpdCBwbGF0Zm9ybS4KKworLSB4bWwuZG9tLm1pbmlkb20udG94bWwgYW5kIHRvcHJldHR5eG1sIG5vdyB0YWtlIGFuIG9wdGlvbmFsIGVuY29kaW5nCisgIGFyZ3VtZW50LgorCistIFNvbWUgZml4ZXMgaW4gdGhlIGNvcHkgbW9kdWxlOiB3aGVuIGFuIG9iamVjdCBpcyBjb3BpZWQgdGhyb3VnaCBpdHMKKyAgX19yZWR1Y2VfXyBtZXRob2QsIHRoZXJlIHdhcyBubyBjaGVjayBmb3IgYSBfX3NldHN0YXRlX18gbWV0aG9kIG9uCisgIHRoZSByZXN1bHQgW1NGIHBhdGNoIDU2NTA4NV07IGRlZXBjb3B5IHNob3VsZCB0cmVhdCBpbnN0YW5jZXMgb2YKKyAgY3VzdG9tIG1ldGFjbGFzc2VzIHRoZSBzYW1lIHdheSBpdCB0cmVhdHMgaW5zdGFuY2VzIG9mIHR5cGUgJ3R5cGUnCisgIFtTRiBwYXRjaCA1NjA3OTRdLgorCistIFNvY2tldHMgbm93IHN1cHBvcnQgdGltZW91dCBtb2RlLiAgQWZ0ZXIgcy5zZXR0aW1lb3V0KFQpLCB3aGVyZSBUIGlzCisgIGEgZmxvYXQgZXhwcmVzc2luZyBzZWNvbmRzLCBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgcmFpc2UgYW4gZXhjZXB0aW9uCisgIGlmIHRoZXkgY2Fubm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gVCBzZWNvbmRzLiAgVG8gZGlzYWJsZSB0aW1lb3V0CisgIG1vZGUsIHVzZSBzLnNldHRpbWVvdXQoTm9uZSkuICBUaGVyZSdzIGFsc28gYSBtb2R1bGUgZnVuY3Rpb24sCisgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChUKSwgd2hpY2ggc2V0cyB0aGUgZGVmYXVsdCBmb3IgYWxsIHNvY2tldHMKKyAgY3JlYXRlZCBoZW5jZWZvcnRoLgorCistIGdldG9wdC5nbnVfZ2V0b3B0IHdhcyBhZGRlZC4gIFRoaXMgc3VwcG9ydHMgR05VLXN0eWxlIG9wdGlvbgorICBwcm9jZXNzaW5nLCB3aGVyZSBvcHRpb25zIGNhbiBiZSBtaXhlZCB3aXRoIG5vbi1vcHRpb24gYXJndW1lbnRzLgorCistIFN0b3AgdXNpbmcgc3RyaW5ncyBmb3IgZXhjZXB0aW9ucy4gIFN0cmluZyBvYmplY3RzIHVzZWQgZm9yCisgIGV4Y2VwdGlvbnMgYXJlIG5vdyBjbGFzc2VzIGRlcml2aW5nIGZyb20gRXhjZXB0aW9uLiAgVGhlIG9iamVjdHMKKyAgY2hhbmdlZCB3ZXJlOiBUa2ludGVyLlRjbEVycm9yLCBiZGIuQmRiUXVpdCwgbWFjcGF0aC5ub3JtX2Vycm9yLAorICB0YWJuYW5ueS5OYW5ueU5hZywgYW5kIHhkcmxpYi5FcnJvci4KKworLSBDb25zdGFudHMgQk9NX1VURjgsIEJPTV9VVEYxNiwgQk9NX1VURjE2X0xFLCBCT01fVVRGMTZfQkUsCisgIEJPTV9VVEYzMiwgQk9NX1VURjMyX0xFIGFuZCBCT01fVVRGMzJfQkUgdGhhdCByZXByZXNlbnQgdGhlIEJ5dGUKKyAgT3JkZXIgTWFyayBpbiBVVEYtOCwgVVRGLTE2IGFuZCBVVEYtMzIgZW5jb2RpbmdzIGZvciBsaXR0bGUgYW5kCisgIGJpZyBlbmRpYW4gc3lzdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSBjb2RlY3MgbW9kdWxlLiBUaGUgb2xkIG5hbWVzCisgIEJPTTMyXyogYW5kIEJPTTY0Xyogd2VyZSBvZmYgYnkgYSBmYWN0b3Igb2YgMi4KKworLSBBZGRlZCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBtYXRoLmRlZ3JlZXMoKSBhbmQgbWF0aC5yYWRpYW5zKCkuCisKKy0gbWF0aC5sb2coKSBub3cgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQ6ICBtYXRoLmxvZyh4WywgYmFzZV0pLgorCistIGZ0cGxpYi5yZXRybGluZXMoKSBub3cgdGVzdHMgZm9yIGNhbGxiYWNrIGlzIE5vbmUgcmF0aGVyIHRoYW4gdGVzdGluZworICBmb3IgRmFsc2UuICBXYXMgY2F1c2luZyBhbiBlcnJvciB3aGVuIGdpdmVuIGEgY2FsbGJhY2sgb2JqZWN0IHdoaWNoCisgIHdhcyBjYWxsYWJsZSBidXQgYWxzbyByZXR1cm5lZCBsZW4oKSBhcyB6ZXJvLiAgVGhlIGNoYW5nZSBtYXkKKyAgY3JlYXRlIG5ldyBicmVha2FnZSBpZiB0aGUgY2FsbGVyIHJlbGllZCBvbiB0aGUgdW5kb2N1bWVudGVkIGJlaGF2aW9yCisgIGFuZCBjYWxsZWQgd2l0aCBjYWxsYmFjayBzZXQgdG8gW10gb3Igc29tZSBvdGhlciBGYWxzZSB2YWx1ZSBub3QKKyAgaWRlbnRpY2FsIHRvIE5vbmUuCisKKy0gcmFuZG9tLmdhdXNzKCkgdXNlcyBhIHBpZWNlIG9mIGhpZGRlbiBzdGF0ZSB1c2VkIGJ5IG5vdGhpbmcgZWxzZSwKKyAgYW5kIHRoZSAuc2VlZCgpIGFuZCAud2hzZWVkKCkgbWV0aG9kcyBmYWlsZWQgdG8gcmVzZXQgaXQuICBJbiBvdGhlcgorICB3b3Jkcywgc2V0dGluZyB0aGUgc2VlZCBkaWRuJ3QgY29tcGxldGVseSBkZXRlcm1pbmUgdGhlIHNlcXVlbmNlIG9mCisgIHJlc3VsdHMgcHJvZHVjZWQgYnkgcmFuZG9tLmdhdXNzKCkuICBJdCBkb2VzIG5vdy4gIFByb2dyYW1zIHJlcGVhdGVkbHkKKyAgbWl4aW5nIGNhbGxzIHRvIGEgc2VlZCBtZXRob2Qgd2l0aCBjYWxscyB0byBnYXVzcygpIG1heSBzZWUgZGlmZmVyZW50CisgIHJlc3VsdHMgbm93LgorCistIFRoZSBwaWNrbGUuUGlja2xlciBjbGFzcyBncmV3IGEgY2xlYXJfbWVtbygpIG1ldGhvZCB0byBtaW1pYyB0aGF0CisgIHByb3ZpZGVkIGJ5IGNQaWNrbGUuUGlja2xlci4KKworLSBkaWZmbGliJ3MgU2VxdWVuY2VNYXRjaGVyIGNsYXNzIG5vdyBkb2VzIGEgZHluYW1pYyBhbmFseXNpcyBvZgorICB3aGljaCBlbGVtZW50cyBhcmUgc28gZnJlcXVlbnQgYXMgdG8gY29uc3RpdHV0ZSBub2lzZS4gIEZvcgorICBjb21wYXJpbmcgZmlsZXMgYXMgc2VxdWVuY2VzIG9mIGxpbmVzLCB0aGlzIGdlbmVyYWxseSB3b3JrcyBiZXR0ZXIKKyAgdGhhbiB0aGUgSVNfTElORV9KVU5LIGZ1bmN0aW9uLCBhbmQgZnVuY3Rpb24gbmRpZmYncyBsaW5lanVuaworICBhcmd1bWVudCBkZWZhdWx0cyB0byBOb25lIG5vdyBhcyBhIHJlc3VsdC4gIEEgaGFwcHkgYmVuZWZpdCBpcworICB0aGF0IFNlcXVlbmNlTWF0Y2hlciBtYXkgcnVuIG11Y2ggZmFzdGVyIG5vdyB3aGVuIGFwcGxpZWQKKyAgdG8gbGFyZ2UgZmlsZXMgd2l0aCBtYW55IGR1cGxpY2F0ZSBsaW5lcyAoZm9yIGV4YW1wbGUsIEMgcHJvZ3JhbQorICB0ZXh0IHdpdGggbG90cyBvZiByZXBlYXRlZCAifSIgYW5kICJyZXR1cm4gTlVMTDsiIGxpbmVzKS4KKworLSBOZXcgVGV4dC5kdW1wKCkgbWV0aG9kIGluIFRraW50ZXIgbW9kdWxlLgorCistIE5ldyBkaXN0dXRpbHMgY29tbWFuZHMgZm9yIGJ1aWxkaW5nIHBhY2thZ2VycyB3ZXJlIGFkZGVkIHRvCisgIHN1cHBvcnQgcGtndG9vbCBvbiBTb2xhcmlzIGFuZCBzd2luc3RhbGwgb24gSFAtVVguCisKKy0gZGlzdHV0aWxzIG5vdyBoYXMgYSBuZXcgYWJzdHJhY3QgYmluYXJ5IHBhY2thZ2VyIGJhc2UgY2xhc3MKKyAgY29tbWFuZC9iZGlzdF9wYWNrYWdlciwgd2hpY2ggc2ltcGxpZmllcyB3cml0aW5nIHBhY2thZ2Vycy4KKyAgVGhpcyB3aWxsIGhvcGVmdWxseSBwcm92aWRlIHRoZSBtaXNzaW5nIGJpdHMgdG8gZW5jb3VyYWdlCisgIHBlb3BsZSB0byBzdWJtaXQgbW9yZSBwYWNrYWdlcnMsIGUuZy4gZm9yIERlYmlhbiwgRnJlZUJTRAorICBhbmQgb3RoZXIgc3lzdGVtcy4KKworLSBUaGUgVVRGLTE2LCAtTEUgYW5kIC1CRSBzdHJlYW0gcmVhZGVycyBub3cgcmFpc2UgYQorICBOb3RJbXBsZW1lbnRlZEVycm9yIGZvciBhbGwgY2FsbHMgdG8gLnJlYWRsaW5lKCkuIFByZXZpb3VzbHksIHRoZXkKKyAgdXNlZCB0byBqdXN0IHByb2R1Y2UgZ2FyYmFnZSBvciBmYWlsIHdpdGggYW4gZW5jb2RpbmcgZXJyb3IgLS0KKyAgVVRGLTE2IGlzIGEgMi1ieXRlIGVuY29kaW5nIGFuZCB0aGUgQyBsaWIncyBsaW5lIHJlYWRpbmcgQVBJcyBkb24ndAorICB3b3JrIHdlbGwgd2l0aCB0aGVzZS4KKworLSBjb21waWxlYWxsIG5vdyBzdXBwb3J0cyBxdWlldCBvcGVyYXRpb24uCisKKy0gVGhlIEJhc2VIVFRQU2VydmVyIG5vdyBpbXBsZW1lbnRzIG9wdGlvbmFsIEhUVFAvMS4xIHBlcnNpc3RlbnQKKyAgY29ubmVjdGlvbnMuCisKKy0gc29ja2V0IG1vZHVsZTogdGhlIFNTTCBzdXBwb3J0IHdhcyBicm9rZW4gb3V0IG9mIHRoZSBtYWluCisgIF9zb2NrZXQgbW9kdWxlIEMgaGVscGVyIGFuZCBwbGFjZWQgaW50byBhIG5ldyBfc3NsIGhlbHBlcgorICB3aGljaCBub3cgZ2V0cyBpbXBvcnRlZCBieSBzb2NrZXQucHkgaWYgYXZhaWxhYmxlIGFuZCB3b3JraW5nLgorCistIGVuY29kaW5ncyBwYWNrYWdlOiBhZGRlZCBhbGlhc2VzIGZvciBhbGwgc3VwcG9ydGVkIElBTkEgY2hhcmFjdGVyCisgIHNldHMKKworLSBmdHBsaWI6IHRvIHNhZmVndWFyZCB0aGUgdXNlcidzIHByaXZhY3ksIGFub255bW91cyBsb2dpbiB3aWxsIHVzZQorICAiYW5vbnltb3VzQCIgYXMgZGVmYXVsdCBwYXNzd29yZCwgcmF0aGVyIHRoYW4gdGhlIHJlYWwgdXNlciBhbmQgaG9zdAorICBuYW1lLgorCistIHdlYmJyb3dzZXI6IHRpZ2h0ZW5lZCB1cCB0aGUgY29tbWFuZCBwYXNzZWQgdG8gb3Muc3lzdGVtKCkgc28gdGhhdAorICBhcmJpdHJhcnkgc2hlbGwgY29kZSBjYW4ndCBiZSBleGVjdXRlZCBiZWNhdXNlIGEgYm9ndXMgVVJMIHdhcworICBwYXNzZWQgaW4uCisKKy0gZ2V0dGV4dC50cmFuc2xhdGlvbiBoYXMgYW4gb3B0aW9uYWwgZmFsbGJhY2sgYXJndW1lbnQsIGFuZAorICBnZXR0ZXh0LmZpbmQgYW4gb3B0aW9uYWwgYWxsIGFyZ3VtZW50LiBUcmFuc2xhdGlvbnMgd2lsbCBub3cgZmFsbGJhY2sKKyAgb24gYSBwZXItbWVzc2FnZSBiYXNpcy4gVGhlIG1vZHVsZSBzdXBwb3J0cyBwbHVyYWwgZm9ybXMsIGJ5IG1lYW5zCisgIG9mIGdldHRleHQuW2RdbmdldHRleHQgYW5kIFRyYW5zbGF0aW9uLlt1XW5nZXR0ZXh0LgorCistIGRpc3R1dGlscyBiZGlzdCBjb21tYW5kcyBub3cgb2ZmZXIgYSAtLXNraXAtYnVpbGQgb3B0aW9uLgorCistIHdhcm5pbmdzLndhcm4gbm93IGFjY2VwdHMgYSBXYXJuaW5nIGluc3RhbmNlIGFzIGZpcnN0IGFyZ3VtZW50LgorCistIFRoZSB4bWwuc2F4LmV4cGF0cmVhZGVyLkV4cGF0UGFyc2VyIGNsYXNzIHdpbGwgbm8gbG9uZ2VyIGNyZWF0ZQorICBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IHVzaW5nIGl0c2VsZiBhcyB0aGUgbG9jYXRvciB0aGF0IGdldHMgcGFzc2VkCisgIHRvIHRoZSBjb250ZW50IGhhbmRsZXIgaW1wbGVtZW50YXRpb24uICBbU0YgYnVnICM1MzU0NzRdCisKKy0gVGhlIGVtYWlsLlBhcnNlci5QYXJzZXIgY2xhc3Mgbm93IHByb3Blcmx5IHBhcnNlcyBzdHJpbmdzIHJlZ2FyZGxlc3MKKyAgb2YgdGhlaXIgbGluZSBlbmRpbmdzLCB3aGljaCBjYW4gYmUgYW55IG9mIFxyLCBcbiwgb3IgXHJcbiAoQ1IsIExGLAorICBvciBDUkxGKS4gIEFsc28sIHRoZSBIZWFkZXIgY2xhc3MncyBjb25zdHJ1Y3RvciBkZWZhdWx0IGFyZ3VtZW50cworICBoYXMgY2hhbmdlZCBzbGlnaHRseSBzbyB0aGF0IGFuIGV4cGxpY2l0IG1heGxpbmVsZW4gdmFsdWUgaXMgYWx3YXlzCisgIGhvbm9yZWQsIGFuZCBzbyB1bmljb2RlIGNvbnZlcnNpb24gZXJyb3IgaGFuZGxpbmcgY2FuIGJlIHNwZWNpZmllZC4KKworLSBkaXN0dXRpbHMnIGJ1aWxkX2V4dCBjb21tYW5kIG5vdyBsaW5rcyBDKysgZXh0ZW5zaW9ucyB3aXRoIHRoZSBDKysKKyAgY29tcGlsZXIgYXZhaWxhYmxlIGluIHRoZSBNYWtlZmlsZSBvciBDWFggZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmCisgIHJ1bm5pbmcgdW5kZXIgXCpuaXguCisKKy0gTmV3IG1vZHVsZSBiejI6IHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBpbnRlcmZhY2UgZm9yIHRoZSBiejIgY29tcHJlc3Npb24KKyAgbGlicmFyeS4gIEl0IGltcGxlbWVudHMgYSBjb21wbGV0ZSBmaWxlIGludGVyZmFjZSwgb25lLXNob3QgKGRlKWNvbXByZXNzaW9uCisgIGZ1bmN0aW9ucywgYW5kIHR5cGVzIGZvciBzZXF1ZW50aWFsIChkZSljb21wcmVzc2lvbi4KKworLSBOZXcgcGRiIGNvbW1hbmQgJ3BwJyB3aGljaCBpcyBsaWtlICdwJyBleGNlcHQgdGhhdCBpdCBwcmV0dHktcHJpbnRzCisgIHRoZSB2YWx1ZSBvZiBpdHMgZXhwcmVzc2lvbiBhcmd1bWVudC4KKworLSBOb3cgYmRpc3RfcnBtIGRpc3R1dGlscyBjb21tYW5kIHVuZGVyc3RhbmRzIGEgdmVyaWZ5X3NjcmlwdCBvcHRpb24gaW4KKyAgdGhlIGNvbmZpZyBmaWxlLCBpbmNsdWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWZlcnJlZCBmaWxlbmFtZSBpbgorICB0aGUgIiV2ZXJpZnlzY3JpcHQiIHNlY3Rpb24gb2YgdGhlIHJwbSBzcGVjIGZpbGUuCisKKy0gRml4ZWQgYnVnICM0OTU2OTU6IHdlYmJyb3dzZXIgbW9kdWxlIHdvdWxkIHJ1biBncmFwaGljIGJyb3dzZXJzIGluIGEKKyAgdW5peCBlbnZpcm9ubWVudCBldmVuIGlmIERJU1BMQVkgd2FzIG5vdCBzZXQuIEFsc28sIHN1cHBvcnQgZm9yCisgIHNraXBzdG9uZSBicm93c2VyIHdhcyBpbmNsdWRlZC4KKworLSBGaXhlZCBidWcgIzYzNjc2OTogcmV4ZWMgd291bGQgcnVuIHVuYWxsb3dlZCBjb2RlIGlmIHN1YmNsYXNzZXMgb2YKKyAgc3RyaW5ncyB3ZXJlIHVzZWQgYXMgcGFyYW1ldGVycyBmb3IgY2VydGFpbiBmdW5jdGlvbnMuCisKK1Rvb2xzL0RlbW9zCistLS0tLS0tLS0tLQorCistIHB5Z2V0dGV4dC5weSBub3cgc3VwcG9ydHMgZ2xvYmJpbmcgb24gV2luZG93cywgYW5kIGFjY2VwdHMgbW9kdWxlCisgIG5hbWVzIGluIGFkZGl0aW9uIHRvIGFjY2VwdGluZyBmaWxlIG5hbWVzLgorCistIFRoZSBTR0kgZGVtb3MgKERlbW8vc2dpKSBoYXZlIGJlZW4gcmVtb3ZlZC4gIE5vYm9keSB0aG91Z2h0IHRoZXkKKyAgd2VyZSBpbnRlcmVzdGluZyBhbnkgbW9yZS4gIChUaGUgU0dJIGxpYnJhcnkgbW9kdWxlcyBhbmQgZXh0ZW5zaW9ucworICBhcmUgc3RpbGwgdGhlcmU7IGl0IGlzIGJlbGlldmVkIHRoYXQgYXQgbGVhc3Qgc29tZSBvZiB0aGVzZSBhcmUKKyAgc3RpbGwgdXNlZCBhbmQgdXNlZnVsLikKKworLSBJRExFIHN1cHBvcnRzIHRoZSBuZXcgZW5jb2RpbmcgZGVjbGFyYXRpb25zIChQRVAgMjYzKTsgaXQgY2FuIGFsc28KKyAgZGVhbCB3aXRoIGxlZ2FjeSA4LWJpdCBmaWxlcyBpZiB0aGV5IHVzZSB0aGUgbG9jYWxlJ3MgZW5jb2RpbmcuIEl0CisgIGFsbG93cyBub24tQVNDSUkgc3RyaW5ncyBpbiB0aGUgaW50ZXJhY3RpdmUgc2hlbGwgYW5kIGV4ZWN1dGVzIHRoZW0KKyAgaW4gdGhlIGxvY2FsZSdzIGVuY29kaW5nLgorCistIGZyZWV6ZS5weSBub3cgcHJvZHVjZXMgYmluYXJpZXMgd2hpY2ggY2FuIGltcG9ydCBzaGFyZWQgbW9kdWxlcywKKyAgdW5saWtlIGJlZm9yZSB3aGVuIHRoaXMgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHN5bWJvbCBleHBvcnRzIGluCisgIHRoZSBnZW5lcmF0ZWQgYmluYXJ5LgorCitCdWlsZAorLS0tLS0KKworLSBPbiBVbml4LCBJRExFIGlzIG5vdyBpbnN0YWxsZWQgYXV0b21hdGljYWxseS4KKworLSBUaGUgZnBlY3RsIG1vZHVsZSBpcyBub3QgYnVpbHQgYnkgZGVmYXVsdDsgaXQncyBkYW5nZXJvdXMgb3IgdXNlbGVzcworICBleGNlcHQgaW4gdGhlIGhhbmRzIG9mIGV4cGVydHMuCisKKy0gVGhlIHB1YmxpYyBQeXRob24gQyBBUEkgd2lsbCBnZW5lcmFsbHkgYmUgZGVjbGFyZWQgdXNpbmcgUHlBUElfRlVOQworICBhbmQgUHlBUElfREFUQSBtYWNyb3MsIHdoaWxlIFB5dGhvbiBleHRlbnNpb24gbW9kdWxlIGluaXQgZnVuY3Rpb25zCisgIHdpbGwgYmUgZGVjbGFyZWQgd2l0aCBQeU1PRElOSVRfRlVOQy4gIERMX0VYUE9SVC9ETF9JTVBPUlQgbWFjcm9zCisgIGFyZSBkZXByZWNhdGVkLgorCistIEEgYnVnIHdhcyBmaXhlZCB0aGF0IGNvdWxkIGNhdXNlIENPVU5UX0FMTE9DUyBidWlsZHMgdG8gc2VnZmF1bHQsIG9yCisgIGdldCBpbnRvIGluZmluaXRlIGxvb3BzLCB3aGVuIGEgbmV3LXN0eWxlIGNsYXNzIGdvdCBnYXJiYWdlLWNvbGxlY3RlZC4KKyAgVW5mb3J0dW5hdGVseSwgdG8gYXZvaWQgdGhpcywgdGhlIHdheSBDT1VOVF9BTExPQ1Mgd29ya3MgcmVxdWlyZXMKKyAgdGhhdCBuZXctc3R5bGUgY2xhc3NlcyBiZSBpbW1vcnRhbCBpbiBDT1VOVF9BTExPQ1MgYnVpbGRzLiAgTm90ZSB0aGF0CisgIENPVU5UX0FMTE9DUyBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LCBpbiBlaXRoZXIgcmVsZWFzZSBvciBkZWJ1ZworICBidWlsZHMsIGFuZCB0aGF0IG5ldy1zdHlsZSBjbGFzc2VzIGFyZSBpbW1vcnRhbCBvbmx5IGluIENPVU5UX0FMTE9DUworICBidWlsZHMuCisKKy0gQ29tcGlsaW5nIG91dCB0aGUgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIGlzIG5vIGxvbmdlciBhbiBvcHRpb24uCisgIFRoZSBvbGQgc3ltYm9sIFdJVEhfQ1lDTEVfR0MgaXMgbm93IGlnbm9yZWQsIGFuZCBQeXRob24uaCBhcnJhbmdlcworICB0aGF0IGl0J3MgYWx3YXlzIGRlZmluZWQgKGZvciB0aGUgYmVuZWZpdCBvZiBhbnkgZXh0ZW5zaW9uIG1vZHVsZXMKKyAgdGhhdCBtYXkgYmUgY29uZGl0aW9uYWxpemluZyBvbiBpdCkuICBBIGJvbnVzIGlzIHRoYXQgYW55IGV4dGVuc2lvbgorICB0eXBlIHBhcnRpY2lwYXRpbmcgaW4gY3ljbGljIGdjIGNhbiBjaG9vc2UgdG8gcGFydGljaXBhdGUgaW4gdGhlCisgIFB5X1RSQVNIQ0FOIG1lY2hhbmlzbSBub3cgdG9vOyBpbiB0aGUgYWJzZW5jZSBvZiBjeWNsaWMgZ2MsIHRoaXMgdXNlZAorICB0byByZXF1aXJlIGVkaXRpbmcgdGhlIGNvcmUgdG8gdGVhY2ggdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSBhYm91dCB0aGUKKyAgbmV3IHR5cGUuCisKKy0gQWNjb3JkaW5nIHRvIEFubmV4IEYgb2YgdGhlIGN1cnJlbnQgQyBzdGFuZGFyZCwKKworICAgIFRoZSBTdGFuZGFyZCBDIG1hY3JvIEhVR0VfVkFMIGFuZCBpdHMgZmxvYXQgYW5kIGxvbmcgZG91YmxlIGFuYWxvZ3MsCisgICAgSFVHRV9WQUxGIGFuZCBIVUdFX1ZBTEwsIGV4cGFuZCB0byBleHByZXNzaW9ucyB3aG9zZSB2YWx1ZXMgYXJlCisgICAgcG9zaXRpdmUgaW5maW5pdGllcy4KKworICBQeXRob24gb25seSB1c2VzIHRoZSBkb3VibGUgSFVHRV9WQUwsIGFuZCBvbmx5IHRvICNkZWZpbmUgaXRzIG93biBzeW1ib2wKKyAgUHlfSFVHRV9WQUwuICBTb21lIHBsYXRmb3JtcyBoYXZlIGluY29ycmVjdCBkZWZpbml0aW9ucyBmb3IgSFVHRV9WQUwuCisgIHB5cG9ydC5oIHVzZWQgdG8gdHJ5IHRvIHdvcm0gYXJvdW5kIHRoYXQsIGJ1dCB0aGUgd29ya2Fyb3VuZHMgdHJpZ2dlcmVkCisgIG90aGVyIGJ1Z3Mgb24gb3RoZXIgcGxhdGZvcm1zLCBzbyB3ZSBnYXZlIHVwLiAgSWYgeW91ciBwbGF0Zm9ybSBkZWZpbmVzCisgIEhVR0VfVkFMIGluY29ycmVjdGx5LCB5b3UnbGwgbmVlZCB0byAjZGVmaW5lIFB5X0hVR0VfVkFMIHRvIHNvbWV0aGluZworICB0aGF0IHdvcmtzIG9uIHlvdXIgcGxhdGZvcm0uICBUaGUgb25seSBpbnN0YW5jZSBvZiB0aGlzIEknbSBzdXJlIGFib3V0CisgIGlzIG9uIGFuIHVua25vd24gc3Vic2V0IG9mIENyYXkgc3lzdGVtcywgZGVzY3JpYmVkIGhlcmU6CisKKyAgaHR0cDovL3d3dy5jcmF5LmNvbS9zd3B1YnMvbWFudWFscy9TTi0yMTk0XzIuMC9odG1sLVNOLTIxOTRfMi4wL3gzMTM4Lmh0bQorCisgIFByZXN1bWFibHkgMi4zYTEgYnJlYWtzIHN1Y2ggc3lzdGVtcy4gIElmIGFueW9uZSB1c2VzIHN1Y2ggYSBzeXN0ZW0sIGhlbHAhCisKKy0gVGhlIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRob3V0LWRvYy1zdHJpbmdzIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUKKyAgZG9jIHN0cmluZ3MgZnJvbSB0aGUgYnVpbHRpbiBmdW5jdGlvbnMgYW5kIG1vZHVsZXM7IHRoaXMgcmVkdWNlcyB0aGUKKyAgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZS4KKworLSBUaGUgdW5pdmVyc2FsIG5ld2xpbmVzIG9wdGlvbiAoUEVQIDI3OCkgaXMgb24gYnkgZGVmYXVsdC4gIE9uIFVuaXgKKyAgaXQgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgLS13aXRob3V0LXVuaXZlcnNhbC1uZXdsaW5lcyB0byB0aGUKKyAgY29uZmlndXJlIHNjcmlwdC4gIE9uIG90aGVyIHBsYXRmb3JtcywgcmVtb3ZlCisgIFdJVEhfVU5JVkVSU0FMX05FV0xJTkVTIGZyb20gcHljb25maWcuaC4KKworLSBPbiBVbml4LCBhIHNoYXJlZCBsaWJweXRob24yLjMuc28gY2FuIGJlIGNyZWF0ZWQgd2l0aCAtLWVuYWJsZS1zaGFyZWQuCisKKy0gQWxsIHVzZXMgb2YgdGhlIENBQ0hFX0hBU0gsIElOVEVSTl9TVFJJTkdTLCBhbmQgRE9OVF9TSEFSRV9TSE9SVF9TVFJJTkdTCisgIHByZXByb2Nlc3NvciBzeW1ib2xzIHdlcmUgZWxpbWluYXRlZC4gIFRoZSBpbnRlcm5hbCBkZWNpc2lvbnMgdGhleQorICBjb250cm9sbGVkIHN0b3BwZWQgYmVpbmcgZXhwZXJpbWVudGFsIGxvbmcgYWdvLgorCistIFRoZSB0b29scyB1c2VkIHRvIGJ1aWxkIHRoZSBkb2N1bWVudGF0aW9uIG5vdyB3b3JrIHVuZGVyIEN5Z3dpbiBhcworICB3ZWxsIGFzIFVuaXguCisKKy0gVGhlIGJzZGRiIGFuZCBkYm0gbW9kdWxlIGJ1aWxkcyBoYXZlIGJlZW4gY2hhbmdlZCB0byB0cnkgYW5kIGF2b2lkIHZlcnNpb24KKyAgc2tldyBwcm9ibGVtcyBhbmQgZGlzYWJsZSBsaW5rYWdlIHdpdGggQmVya2VsZXkgREIgMS44NSB1bmxlc3MgdGhlCisgIGluc3RhbGxlciBrbm93cyB3aGF0IHMvaGUncyBkb2luZy4gIFNlZSB0aGUgc2VjdGlvbiBvbiBidWlsZGluZyB0aGVzZQorICBtb2R1bGVzIGluIHRoZSBSRUFETUUgZmlsZSBmb3IgZGV0YWlscy4KKworQyBBUEkKKy0tLS0tCisKKy0gUHlOdW1iZXJfQ2hlY2soKSBub3cgcmV0dXJucyB0cnVlIGZvciBzdHJpbmcgYW5kIHVuaWNvZGUgb2JqZWN0cy4KKyAgVGhpcyBpcyBhIHJlc3VsdCBvZiB0aGVzZSB0eXBlcyBoYXZpbmcgYSBwYXJ0aWFsbHkgZGVmaW5lZAorICB0cF9hc19udW1iZXIgc2xvdC4gIChUaGlzIGlzIG5vdCBhIGZlYXR1cmUsIGJ1dCBhbiBpbmRpY2F0aW9uIHRoYXQKKyAgUHlOdW1iZXJfQ2hlY2soKSBpcyBub3QgdmVyeSB1c2VmdWwgdG8gZGV0ZXJtaW5lIG51bWVyaWMgYmVoYXZpb3IuCisgIEl0IG1heSBiZSBkZXByZWNhdGVkLikKKworLSBUaGUgc3RyaW5nIG9iamVjdCdzIGxheW91dCBoYXMgY2hhbmdlZDogdGhlIHBvaW50ZXIgbWVtYmVyCisgIG9iX3NpbnRlcm5lZCBoYXMgYmVlbiByZXBsYWNlZCBieSBhbiBpbnQgbWVtYmVyIG9iX3NzdGF0ZS4gIE9uIHNvbWUKKyAgcGxhdGZvcm1zIChlLmcuIG1vc3QgNjQtYml0IHN5c3RlbXMpIHRoaXMgbWF5IGNoYW5nZSB0aGUgb2Zmc2V0IG9mCisgIHRoZSBvYl9zdmFsIG1lbWJlciwgc28gYXMgYSBwcmVjYXV0aW9uIHRoZSBBUElfVkVSU0lPTiBoYXMgYmVlbgorICBpbmNyZW1lbnRlZC4gIFRoZSBhcHBhcmVudGx5IHVudXNlZCBmZWF0dXJlIG9mICJpbmRpcmVjdCBpbnRlcm5lZAorICBzdHJpbmdzIiwgc3VwcG9ydGVkIGJ5IHRoZSBvYl9zaW50ZXJuZWQgbWVtYmVyLCBpcyBnb25lLiAgSW50ZXJuZWQKKyAgc3RyaW5ncyBhcmUgbm93IHVzdWFsbHkgbW9ydGFsOyB0aGVyZSBpcyBhIG5ldyBBUEksCisgIFB5U3RyaW5nX0ludGVybkltbW9ydGFsKCkgdGhhdCBjcmVhdGVzIGltbW9ydGFsIGludGVybmVkIHN0cmluZ3MuCisgIChUaGUgb2Jfc3N0YXRlIG1lbWJlciBjYW4gb25seSB0YWtlIHRocmVlIHZhbHVlczsgaG93ZXZlciwgd2hpbGUKKyAgbWFraW5nIGl0IGEgY2hhciBzYXZlcyBhIGZldyBieXRlcyBwZXIgc3RyaW5nIG9iamVjdCBvbiBhdmVyYWdlLCBpbgorICBpdCBhbHNvIHNsb3dlZCB0aGluZ3MgZG93biBhIGJpdCBiZWNhdXNlIG9iX3N2YWwgd2FzIG5vIGxvbmdlcgorICBhbGlnbmVkLikKKworLSBUaGUgUHlfSW5pdE1vZHVsZSooKSBmdW5jdGlvbnMgbm93IGFjY2VwdCBOVUxMIGZvciB0aGUgJ21ldGhvZHMnCisgIGFyZ3VtZW50LiAgTW9kdWxlcyB3aXRob3V0IGdsb2JhbCBmdW5jdGlvbnMgYXJlIGJlY29taW5nIG1vcmUgY29tbW9uCisgIG5vdyB0aGF0IGZhY3RvcmllcyBjYW4gYmUgdHlwZXMgcmF0aGVyIHRoYW4gZnVuY3Rpb25zLgorCistIE5ldyBDIEFQSSBQeVVuaWNvZGVfRnJvbU9yZGluYWwoKSB3aGljaCBleHBvc2VzIHVuaWNocigpIGF0IEMKKyAgbGV2ZWwuCisKKy0gTmV3IGZ1bmN0aW9ucyBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycigpIGFuZAorICBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgpLiBTaW1pbGFyIHRvCisgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKCkgYW5kCisgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKCksIGJ1dCB0aGV5IGFsbG93IHRvIHNwZWNpZnkKKyAgdGhlIGV4Y2VwdGlvbiB0eXBlIHRvIHJhaXNlLiBBdmFpbGFibGUgb24gV2luZG93cy4KKworLSBQeV9GYXRhbEVycm9yKCkgaXMgbm93IGRlY2xhcmVkIGFzIHRha2luZyBhIGNvbnN0IGNoYXIqIGFyZ3VtZW50LiAgSXQKKyAgd2FzIHByZXZpb3VzbHkgZGVjbGFyZWQgd2l0aG91dCBjb25zdC4gIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3Qgd29ya2luZworICBjb2RlLgorCistIEFkZGVkIG5ldyBtYWNybyBQeVNlcXVlbmNlX0lURU0obywgaSkgdGhhdCBkaXJlY3RseSBjYWxscworICBzcV9pdGVtIHdpdGhvdXQgcmVjaGVja2luZyB0aGF0IG8gaXMgYSBzZXF1ZW5jZSBhbmQgd2l0aG91dAorICBhZGp1c3RpbmcgZm9yIG5lZ2F0aXZlIGluZGljZXMuCisKKy0gUHlSYW5nZV9OZXcoKSBub3cgcmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIGZvdXJ0aCBhcmd1bWVudCBpcyBub3QgMS4KKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSByZW1vdmFsIG9mIGRlcHJlY2F0ZWQgZmVhdHVyZXMgb2YgdGhlIHhyYW5nZQorICBvYmplY3QuCisKKy0gUHlOdW1iZXJfQ29lcmNlKCkgYW5kIFB5TnVtYmVyX0NvZXJjZUV4KCkgbm93IGFsc28gaW52b2tlIHRoZSB0eXBlJ3MKKyAgY29lcmNpb24gaWYgYm90aCBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSB0eXBlIGJ1dCB0aGlzIHR5cGUgaGFzIHRoZQorICBDSEVDS1RZUEVTIGZsYWcgc2V0LiAgVGhpcyBpcyB0byBiZXR0ZXIgc3VwcG9ydCBwcm94aWVzLgorCistIFRoZSB0eXBlIG9mIHRwX2ZyZWUgaGFzIGJlZW4gY2hhbmdlZCBmcm9tICJgYHZvaWQgKCopKFB5T2JqZWN0ICopYGAiIHRvCisgICJgYHZvaWQgKCopKHZvaWQgKilgYCIuCisKKy0gUHlPYmplY3RfRGVsLCBQeU9iamVjdF9HQ19EZWwgYXJlIG5vdyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBtYWNyb3MuCisKKy0gQSB0eXBlIGNhbiBub3cgaW5oZXJpdCBpdHMgbWV0YXR5cGUgZnJvbSBpdHMgYmFzZSB0eXBlLiAgUHJldmlvdXNseSwKKyAgd2hlbiBQeVR5cGVfUmVhZHkoKSB3YXMgY2FsbGVkLCBpZiBvYl90eXBlIHdhcyBmb3VuZCB0byBiZSBOVUxMLCBpdAorICB3YXMgYWx3YXlzIHNldCB0byAmUHlUeXBlX1R5cGU7IG5vdyBpdCBpcyBzZXQgdG8gYmFzZS0+b2JfdHlwZSwKKyAgd2hlcmUgYmFzZSBpcyB0cF9iYXNlLCBkZWZhdWx0aW5nIHRvICZQeU9iamVjdF9UeXBlLgorCistIFB5VHlwZV9SZWFkeSgpIGFjY2lkZW50YWxseSBkaWQgbm90IGluaGVyaXQgdHBfaXNfZ2M7IG5vdyBpdCBkb2VzLgorCistIFRoZSBQeUNvcmVfKiBmYW1pbHkgb2YgQVBJcyBoYXZlIGJlZW4gcmVtb3ZlZC4KKworLSBUaGUgInUjIiBwYXJzZXIgbWFya2VyIHdpbGwgbm93IHBhc3MgdGhyb3VnaCBVbmljb2RlIG9iamVjdHMgYXMtaXMKKyAgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZSBidWZmZXIgQVBJLgorCistIFRoZSBlbnVtZXJhdG9ycyBvZiBjbXBfb3AgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gdXNlIHRoZSBwcmVmaXggYGBQeUNtcF9gYC4KKworLSBBbiBvbGQgI2RlZmluZSBvZiBBTlkgYXMgdm9pZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gcHlwb3J0LmguICBUaGlzCisgIGhhc24ndCBiZWVuIHVzZWQgc2luY2UgUHl0aG9uJ3MgcHJlLUFOU0kgZGF5cywgYW5kIHRoZSAjZGVmaW5lIGhhcworICBiZWVuIG1hcmtlZCBhcyBvYnNvbGV0ZSBzaW5jZSB0aGVuLiAgU0YgYnVnIDQ5NTU0OCBzYXlzIGl0IGNyZWF0ZWQKKyAgY29uZmxpY3RzIHdpdGggb3RoZXIgcGFja2FnZXMsIHNvIGtlZXBpbmcgaXQgYXJvdW5kIHdhc24ndCBoYXJtbGVzcy4KKworLSBCZWNhdXNlIFB5dGhvbidzIG1hZ2ljIG51bWJlciBzY2hlbWUgYnJva2Ugb24gSmFudWFyeSAxc3QsIHdlIGRlY2lkZWQKKyAgdG8gc3RvcCBQeXRob24gZGV2ZWxvcG1lbnQuICBUaGFua3MgZm9yIGFsbCB0aGUgZmlzaCEKKworLSBTb21lIG9mIHVzIGRvbid0IGxpa2UgZmlzaCwgc28gd2UgY2hhbmdlZCBQeXRob24ncyBtYWdpYyBudW1iZXIKKyAgc2NoZW1lIHRvIGEgbmV3IG9uZS4gU2VlIFB5dGhvbi9pbXBvcnQuYyBmb3IgZGV0YWlscy4KKworTmV3IHBsYXRmb3JtcworLS0tLS0tLS0tLS0tLQorCistIE9wZW5WTVMgaXMgbm93IHN1cHBvcnRlZC4KKworLSBBdGhlT1MgaXMgbm93IHN1cHBvcnRlZC4KKworLSB0aGUgRU1YIHJ1bnRpbWUgZW52aXJvbm1lbnQgb24gT1MvMiBpcyBub3cgc3VwcG9ydGVkLgorCistIEdOVS9IdXJkIGlzIG5vdyBzdXBwb3J0ZWQuCisKK1Rlc3RzCistLS0tLQorCistIFRoZSByZWdydGVzdC5weSBzY3JpcHQncyAtdSBvcHRpb24gbm93IHByb3ZpZGVzIGEgd2F5IHRvIHNheSAiYWxsb3cKKyAgYWxsIHJlc291cmNlcyBleGNlcHQgdGhpcyBvbmUuIiAgRm9yIGV4YW1wbGUsIHRvIGFsbG93IGV2ZXJ5dGhpbmcKKyAgZXhjZXB0IGJzZGRiLCBnaXZlIHRoZSBvcHRpb24gJy11YWxsLC1ic2RkYicuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBUaGUgV2luZG93cyBkaXN0cmlidXRpb24gbm93IHNoaXBzIHdpdGggdmVyc2lvbiA0LjAuMTQgb2YgdGhlCisgIFNsZWVweWNhdCBCZXJrZWxleSBkYXRhYmFzZSBsaWJyYXJ5LiAgVGhpcyBzaG91bGQgYmUgYSBodWdlCisgIGltcHJvdmVtZW50IG92ZXIgdGhlIHByZXZpb3VzIEJlcmtlbGV5IERCIDEuODUsIHdoaWNoIGhhZCBtYW55CisgIGJ1Z3MuCisgIFhYWCBXaGF0IGFyZSB0aGUgbGljZW5zaW5nIGlzc3VlcyBoZXJlPworICBYWFggSWYgYSB1c2VyIGhhcyBhIGRhdGFiYXNlIGNyZWF0ZWQgd2l0aCBhIHByZXZpb3VzIHZlcnNpb24gb2YKKyAgWFhYICAgICBQeXRob24sIHdoYXQgbXVzdCB0aGV5IGRvIHRvIGNvbnZlcnQgaXQ/CisgIFhYWCBJJ20gc3RpbGwgbm90IHN1cmUgaG93IHRvIGxpbmsgdGhpcyB0aGluZyAoc2VlIFBDYnVpbGQvcmVhZG1lLnR4dCkuCisgIFhYWCBUaGUgdmVyc2lvbiAjIGlzIGxpa2VseSB0byBjaGFuZ2UgYmVmb3JlIDIuM2ExLgorCistIFRoZSBXaW5kb3dzIGRpc3RyaWJ1dGlvbiBub3cgc2hpcHMgd2l0aCBhIFNlY3VyZSBTb2NrZXRzIExpYnJhcnkgKFNMTCkKKyAgIG1vZHVsZSAoX3NzbC5weWQpCisKKy0gVGhlIFdpbmRvd3MgZGlzdHJpYnV0aW9uIG5vdyBzaGlwcyB3aXRoIFRjbC9UayB2ZXJzaW9uIDguNC4xIChpdAorICBwcmV2aW91c2x5IHNoaXBwZWQgd2l0aCBUY2wvVGsgOC4zLjIpLgorCistIFdoZW4gUHl0aG9uIGlzIGJ1aWx0IHVuZGVyIGEgTWljcm9zb2Z0IGNvbXBpbGVyLCBzeXMudmVyc2lvbiBub3cKKyAgaW5jbHVkZXMgdGhlIGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyIChfTVNDX1ZFUikuICBGb3IgZXhhbXBsZSwgdW5kZXIKKyAgTVNWQyA2LCBzeXMudmVyc2lvbiBjb250YWlucyB0aGUgc3Vic3RyaW5nICJNU0Mgdi4xMjAwICIuICAxMjAwIGlzCisgIHRoZSB2YWx1ZSBvZiBfTVNDX1ZFUiB1bmRlciBNU1ZDIDYuCisKKy0gU29tZXRpbWVzIHRoZSB1bmluc3RhbGwgZXhlY3V0YWJsZSAoVU5XSVNFLkVYRSkgdmFuaXNoZXMuICBPbmUgY2F1c2UKKyAgb2YgdGhhdCBoYXMgYmVlbiBmaXhlZCBpbiB0aGUgaW5zdGFsbGVyIChkaXNhYmxlZCBXaXNlJ3MgImRlbGV0ZSBpbi0KKyAgdXNlIGZpbGVzIiB1bmluc3RhbGwgb3B0aW9uKS4KKworLSBGaXhlZCBhIGJ1ZyBpbiB1cmxsaWIncyBwcm94eSBoYW5kbGluZyBpbiBXaW5kb3dzLiAgW1NGIGJ1ZyAjNTAzMDMxXQorCistIFRoZSBpbnN0YWxsZXIgbm93IGluc3RhbGxzIFN0YXJ0IG1lbnUgc2hvcnRjdXRzIHVuZGVyICh0aGUgbG9jYWwKKyAgZXF1aXZhbGVudCBvZikgIkFsbCBVc2VycyIgd2hlbiBkb2luZyBhbiBBZG1pbiBpbnN0YWxsLgorCistIGZpbGUudHJ1bmNhdGUoW25ld3NpemVdKSBub3cgd29ya3Mgb24gV2luZG93cyBmb3IgYWxsIG5ld3NpemUgdmFsdWVzLgorICBJdCB1c2VkIHRvIGZhaWwgaWYgbmV3c2l6ZSBkaWRuJ3QgZml0IGluIDMyIGJpdHMsIHJlZmxlY3RpbmcgYQorICBsaW1pdGF0aW9uIG9mIE1TIF9jaHNpemUgKHdoaWNoIGlzIG5vIGxvbmdlciB1c2VkKS4KKworLSBvcy53YWl0cGlkKCkgaXMgbm93IGltcGxlbWVudGVkIGZvciBXaW5kb3dzLCBhbmQgY2FuIGJlIHVzZWQgdG8gYmxvY2sKKyAgdW50aWwgYSBzcGVjaWZpZWQgcHJvY2VzcyBleGl0cy4gIFRoaXMgaXMgc2ltaWxhciB0bywgYnV0IG5vdCBleGFjdGx5CisgIHRoZSBzYW1lIGFzLCBvcy53YWl0cGlkKCkgb24gUE9TSVggc3lzdGVtcy4gIElmIHlvdSdyZSB3YWl0aW5nIGZvcgorICBhIHNwZWNpZmljIHByb2Nlc3Mgd2hvc2UgcGlkIHdhcyBvYnRhaW5lZCBmcm9tIG9uZSBvZiB0aGUgc3Bhd24oKQorICBmdW5jdGlvbnMsIHRoZSBzYW1lIFB5dGhvbiBvcy53YWl0cGlkKCkgY29kZSB3b3JrcyBhY3Jvc3MgcGxhdGZvcm1zLgorICBTZWUgdGhlIGRvY3MgZm9yIGRldGFpbHMuICBUaGUgZG9jcyB3ZXJlIGNoYW5nZWQgdG8gY2xhcmlmeSB0aGF0CisgIHNwYXduIGZ1bmN0aW9ucyByZXR1cm4sIGFuZCB3YWl0cGlkIHJlcXVpcmVzLCBhIHByb2Nlc3MgaGFuZGxlIG9uCisgIFdpbmRvd3MgKG5vdCB0aGUgc2FtZSB0aGluZyBhcyBhIFdpbmRvd3MgcHJvY2VzcyBpZCkuCisKKy0gTmV3IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUgaW1wbGVtZW50YXRpb24gZm9yIFdpbmRvd3M6ICB0aGlzIGRvZXNuJ3QKKyAgbmVlZCBhIFRlbXBvcmFyeUZpbGVXcmFwcGVyIHdyYXBwZXIgYW55bW9yZSwgYW5kIHNob3VsZCBiZSBpbW11bmUKKyAgdG8gYSBuYXN0eSBwcm9ibGVtOiAgYmVmb3JlIDIuMywgaWYgeW91IGdvdCBhIHRlbXAgZmlsZSBvbiBXaW5kb3dzLCBpdAorICBnb3Qgd3JhcHBlZCBpbiBhbiBvYmplY3Qgd2hvc2UgY2xvc2UoKSBtZXRob2QgZmlyc3QgY2xvc2VkIHRoZQorICB1bmRlcmx5aW5nIGZpbGUsIHRoZW4gZGVsZXRlZCB0aGUgZmlsZS4gIFRoaXMgdXN1YWxseSB3b3JrZWQgZmluZS4KKyAgSG93ZXZlciwgdGhlIHNwYXduIGZhbWlseSBvZiBmdW5jdGlvbnMgb24gV2luZG93cyBjcmVhdGUgKGF0IGEgbG93IEMKKyAgbGV2ZWwpIHRoZSBzYW1lIHNldCBvZiBvcGVuIGZpbGVzIGluIHRoZSBzcGF3bmVkIHByb2Nlc3MgUSBhcyB3ZXJlCisgIG9wZW4gaW4gdGhlIHNwYXduaW5nIHByb2Nlc3MgUC4gIElmIGEgdGVtcCBmaWxlIGYgd2FzIGFtb25nIHRoZW0sIHRoZW4KKyAgZG9pbmcgZi5jbG9zZSgpIGluIFAgZmlyc3QgY2xvc2VkIFAncyBDLWxldmVsIGZpbGUgaGFuZGxlIG9uIGYsIGJ1dCBRJ3MKKyAgQy1sZXZlbCBmaWxlIGhhbmRsZSBvbiBmIHJlbWFpbmVkIG9wZW4sIHNvIHRoZSBhdHRlbXB0IGluIFAgdG8gZGVsZXRlIGYKKyAgYmxldyB1cCB3aXRoIGEgIlBlcm1pc3Npb24gZGVuaWVkIiBlcnJvciAoV2luZG93cyBkb2Vzbid0IGFsbG93CisgIGRlbGV0aW5nIG9wZW4gZmlsZXMpLiAgVGhpcyB3YXMgc3VycHJpc2luZywgc3VidGxlLCBhbmQgZGlmZmljdWx0IHRvCisgIHdvcmsgYXJvdW5kLgorCistIFRoZSBvcyBtb2R1bGUgbm93IGV4cG9ydHMgYWxsIHRoZSBzeW1ib2xpYyBjb25zdGFudHMgdXNhYmxlIHdpdGggdGhlCisgIGxvdy1sZXZlbCBvcy5vcGVuKCkgb24gV2luZG93czogIHRoZSBuZXcgY29uc3RhbnRzIGluIDIuMyBhcmUKKyAgT19OT0lOSEVSSVQsIE9fU0hPUlRfTElWRUQsIE9fVEVNUE9SQVJZLCBPX1JBTkRPTSBhbmQgT19TRVFVRU5USUFMLgorICBUaGUgb3RoZXJzIHdlcmUgYWxzbyBhdmFpbGFibGUgaW4gMi4yOiAgT19BUFBFTkQsIE9fQklOQVJZLCBPX0NSRUFULAorICBPX0VYQ0wsIE9fUkRPTkxZLCBPX1JEV1IsIE9fVEVYVCwgT19UUlVOQyBhbmQgT19XUk9OTFkuICBDb250cmFyeQorICB0byBNaWNyb3NvZnQgZG9jcywgT19TSE9SVF9MSVZFRCBkb2VzIG5vdCBzZWVtIHRvIGltcGx5IE9fVEVNUE9SQVJZCisgIChzbyBzcGVjaWZ5IGJvdGggaWYgeW91IHdhbnQgYm90aDsgbm90ZSB0aGF0IG5laXRoZXIgaXMgdXNlZnVsIHVubGVzcworICBzcGVjaWZpZWQgd2l0aCBPX0NSRUFUIHRvbykuCisKK01hYworLS0tLQorCistIE1hYy9SZWxub3RlcyBpcyBnb25lLCB0aGUgcmVsZWFzZSBub3RlcyBhcmUgbm93IGhlcmUuCisKKy0gUHl0aG9uICh0aGUgT1NYLW9ubHksIHVuaXgtYmFzZWQgdmVyc2lvbiwgbm90IHRoZSBPUzktY29tcGF0aWJsZSBDRk0KKyAgdmVyc2lvbikgbm93IGZ1bGx5IHN1cHBvcnRzIHVuaWNvZGUgc3RyaW5ncyBhcyBhcmd1bWVudHMgdG8gdmFyaW91cyBmaWxlCisgIHN5c3RlbSBjYWxscywgZWcuIG9wZW4oKSwgZmlsZSgpLCBvcy5zdGF0KCkgYW5kIG9zLmxpc3RkaXIoKS4KKworLSBUaGUgY3VycmVudCBuYW1pbmcgY29udmVudGlvbiBmb3IgUHl0aG9uIG9uIHRoZSBNYWNpbnRvc2ggaXMgdGhhdCBNYWNQeXRob24KKyAgcmVmZXJzIHRvIHRoZSB1bml4LWJhc2VkIE9TWC1vbmx5IHZlcnNpb24sIGFuZCBNYWNQeXRob24tT1M5IHJlZmVycyB0byB0aGUKKyAgQ0ZNLWJhc2VkIHZlcnNpb24gdGhhdCBydW5zIG9uIGJvdGggT1M5IGFuZCBPU1guCisKKy0gQWxsIE1hY1B5dGhvbi1PUzkgZnVuY3Rpb25hbGl0eSBpcyBub3cgYXZhaWxhYmxlIGluIGFuIE9TWCB1bml4IGJ1aWxkLAorICBpbmNsdWRpbmcgdGhlIENhcmJvbiBtb2R1bGVzLCB0aGUgSURFLCBPU0Egc3VwcG9ydCwgZXRjLiBBIGxvdCBvZiB0aGlzCisgIHdpbGwgb25seSB3b3JrIGNvcnJlY3RseSBpbiBhIGZyYW1ld29yayBidWlsZCwgdGhvdWdoLCBiZWNhdXNlIHlvdSBjYW5ub3QKKyAgdGFsayB0byB0aGUgd2luZG93IG1hbmFnZXIgdW5sZXNzIHlvdXIgYXBwbGljYXRpb24gaXMgcnVuIGZyb20gYSAuYXBwCisgIGJ1bmRsZS4gVGhlcmUgaXMgYSBjb21tYW5kIGxpbmUgdG9vbCAicHl0aG9udyIgdGhhdCBydW5zIHlvdXIgc2NyaXB0CisgIHdpdGggYW4gaW50ZXJwcmV0ZXIgbGl2aW5nIGluIHN1Y2ggYSAuYXBwIGJ1bmRsZSwgdGhpcyBpbnRlcnByZXRlciBzaG91bGQKKyAgYmUgdXNlZCB0byBydW4gYW55IFB5dGhvbiBzY3JpcHQgdXNpbmcgdGhlIHdpbmRvdyBtYW5hZ2VyIChpbmNsdWRpbmcKKyAgVGtpbnRlciBvciB3eFB5dGhvbiBzY3JpcHRzKS4KKworLSBNb3N0IG9mIE1hYy9MaWIgaGFzIG1vdmVkIHRvIExpYi9wbGF0LW1hYywgd2hpY2ggaXMgYWdhaW4gdXNlZCBib3RoIGluCisgIE1hY1B5dGhvbi1PU1ggYW5kIE1hY1B5dGhvbi1PUzkuIFRoZSBvbmx5IG1vZHVsZXMgcmVtYWluaW5nIGluIE1hYy9MaWIKKyAgYXJlIHNwZWNpZmljYWxseSBmb3IgTWFjUHl0aG9uLU9TOSAoQ0ZNIHN1cHBvcnQsIHByZWZlcmVuY2UgcmVzb3VyY2VzLCBldGMpLgorCistIEEgbmV3IHV0aWxpdHkgUHl0aG9uTGF1bmNoZXIgd2lsbCBzdGFydCBhIFB5dGhvbiBpbnRlcnByZXRlciB3aGVuIGEgLnB5IG9yCisgIC5weXcgc2NyaXB0IGlzIGRvdWJsZS1jbGlja2VkIGluIHRoZSBGaW5kZXIuIEJ5IGRlZmF1bHQgLnB5IHNjcmlwdHMgYXJlCisgIHJ1biB3aXRoIGEgbm9ybWFsIFB5dGhvbiBpbnRlcnByZXRlciBpbiBhIFRlcm1pbmFsIHdpbmRvdyBhbmQgLnB5dworICBmaWxlcyBhcmUgcnVuIHdpdGggYSB3aW5kb3ctYXdhcmUgcHl0aG9udyBpbnRlcnByZXRlciB3aXRob3V0IGEgVGVybWluYWwKKyAgd2luZG93LCBidXQgYWxsIHRoaXMgY2FuIGJlIGN1c3RvbWl6ZWQuCisKKy0gTWFjUHl0aG9uLU9TOSBpcyBub3cgQ2FyYm9uLW9ubHksIHNvIGl0IHJ1bnMgb24gTWFjIE9TIDkgb3IgTWFjIE9TIFggYW5kCisgIHBvc3NpYmx5IG9uIE1hYyBPUyA4LjYgd2l0aCB0aGUgcmlnaHQgQ2FyYm9uTGliIGluc3RhbGxlZCwgYnV0IG5vdCBvbiBlYXJsaWVyCisgIHJlbGVhc2VzLgorCistIE1hbnkgdG9vbHMgc3VjaCBhcyBCdWlsZEFwcGxldC5weSBhbmQgZ2Vuc3VpdGVtb2R1bGUucHkgbm93IHN1cHBvcnQgYSBjb21tYW5kCisgIGxpbmUgaW50ZXJmYWNlIHRvby4KKworLSBBbGwgdGhlIENhcmJvbiBjbGFzc2VzIGFyZSBub3cgUEVQMjUzIGNvbXBsaWFudCwgbWVhbmluZyB0aGF0IHlvdSBjYW4KKyAgc3ViY2xhc3MgdGhlbSBmcm9tIFB5dGhvbi4gTW9zdCBvZiB0aGUgYXR0cmlidXRlcyBoYXZlIGdvbmUsIHlvdSBzaG91bGQKKyAgbm93IHVzZSB0aGUgYWNjZXNzb3IgZnVuY3Rpb24gY2FsbCBBUEksIHdoaWNoIGlzIGFsc28gd2hhdCBBcHBsZSdzCisgIGRvY3VtZW50YXRpb24gdXNlcy4gU29tZSBhdHRyaWJ1dGVzIHN1Y2ggYXMgZ3JhZnBvcnQudmlzUmduIGFyZSBzdGlsbAorICBhdmFpbGFibGUgZm9yIGNvbnZlbmllbmNlLgorCistIE5ldyBDYXJib24gbW9kdWxlcyBGaWxlIChpbXBsZW1lbnRpbmcgdGhlIEFQSXMgaW4gRmlsZXMuaCBhbmQgQWxpYXNlcy5oKQorICBhbmQgRm9sZGVyIChBUElzIGZyb20gRm9sZGVycy5oKS4gVGhlIG9sZCBtYWNmcyBidWlsdGluIG1vZHVsZSBpcworICBnb25lLCBhbmQgcmVwbGFjZWQgYnkgYSBQeXRob24gd3JhcHBlciBhcm91bmQgdGhlIG5ldyBtb2R1bGVzLgorCistIFBhdGhuYW1lIGhhbmRsaW5nIHNob3VsZCBub3cgYmUgZnVsbHkgY29uc2lzdGVudDogTWFjUHl0aG9uLU9TWCBhbHdheXMgdXNlcworICB1bml4IHBhdGhuYW1lcyBhbmQgTWFjUHl0aG9uLU9TOSBhbHdheXMgdXNlcyBjb2xvbi1zZXBhcmF0ZWQgTWFjIHBhdGhuYW1lcworICAoYWxzbyB3aGVuIHJ1bm5pbmcgb24gTWFjIE9TIFgpLgorCistIE5ldyBDYXJib24gbW9kdWxlcyBIZWxwIGFuZCBBSCBnaXZlIGFjY2VzcyB0byB0aGUgQ2FyYm9uIEhlbHAgTWFuYWdlci4KKyAgVGhlcmUgYXJlIGhvb2tzIGluIHRoZSBJREUgdG8gYWxsb3cgYWNjZXNzaW5nIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbgorICAoYW5kIEFwcGxlJ3MgQ2FyYm9uIGFuZCBDb2NvYSBkb2N1bWVudGF0aW9uKSB0aHJvdWdoIHRoZSBIZWxwIFZpZXdlci4KKyAgU2VlIE1hYy9PU1gvUkVBRE1FIGZvciBjb252ZXJ0aW5nIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiB0byBhCisgIEhlbHAgVmlld2VyIGNvbXBhdGlibGUgZm9ybSBhbmQgaW5zdGFsbGluZyBpdC4KKworLSBPU0Egc3VwcG9ydCBoYXMgYmVlbiByZWRlc2lnbmVkIGFuZCB0aGUgZ2VuZXJhdGVkIFB5dGhvbiBjbGFzc2VzIG5vdworICBtaXJyb3IgdGhlIGluaGVyaXRhbmNlIGRlZmluZWQgYnkgdGhlIHVuZGVybHlpbmcgT1NBIGNsYXNzZXMuCisKKy0gTWFjUHl0aG9uIG5vIGxvbmdlciBtYXBzIGJvdGggXHIgYW5kIFxuIHRvIFxuIG9uIGlucHV0IGZvciBhbnkgdGV4dCBmaWxlLgorICBUaGlzIGZlYXR1cmUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydCAoUEVQMjc4KS4KKworLSBUaGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgUHl0aG9uIHNvdXJjZWZpbGVzIGluIE1hY1B5dGhvbi1PUzkgaXMgbm8gbG9uZ2VyCisgIG1hYy1yb21hbiAob3Igd2hhdGV2ZXIgeW91ciBsb2NhbCBNYWMgZW5jb2Rpbmcgd2FzKSBidXQgImFzY2lpIiwgbGlrZSBvbgorICBvdGhlciBwbGF0Zm9ybXMuIElmIHlvdSByZWFsbHkgbmVlZCBzb3VyY2VmaWxlcyB3aXRoIE1hYyBjaGFyYWN0ZXJzIGluIHRoZW0KKyAgeW91IGNhbiBjaGFuZ2UgdGhpcyBpbiBzaXRlLnB5LgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMiBmaW5hbD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjEtRGVjLTIwMDEqCisKK1R5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIHBpY2tsZS5weSwgY1BpY2tsZTogYWxsb3cgcGlja2xpbmcgaW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzCisgIHdpdGggYSBjdXN0b20gbWV0YWNsYXNzLgorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSB3ZWFrcmVmIHByb3h5IG9iamVjdDogd2hlbiBjb21wYXJpbmcsIHVud3JhcCBib3RoIGFyZ3VtZW50cyBpZiBib3RoCisgIGFyZSBwcm94aWVzLgorCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBiaW5hc2NpaS5iMmFfYmFzZTY0KCk6IGZpeCBhIHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1biB3aGVuIGVuY29kaW5nCisgIHZlcnkgc2hvcnQgc3RyaW5ncy4KKworLSBjUGlja2xlOiB0aGUgb2JzY3VyZSAiZmFzdCIgbW9kZSB3YXMgc3VzcGVjdGVkIG9mIGNhdXNpbmcgc3RhY2sKKyAgb3ZlcmZsb3dzIG9uIHRoZSBNYWMuICBIb3BlZnVsbHkgZml4ZWQgdGhpcyBieSBzZXR0aW5nIHRoZSByZWN1cnNpb24KKyAgbGltaXQgbXVjaCBzbWFsbGVyLiAgSWYgdGhlIGxpbWl0IGlzIHRvbyBsb3cgKGl0IG9ubHkgYWZmZWN0cworICBwZXJmb3JtYW5jZSksIHlvdSBjYW4gY2hhbmdlIGl0IGJ5IGRlZmluaW5nIFBZX0NQSUNLTEVfRkFTVF9MSU1JVAorICB3aGVuIGNvbXBpbGluZyBjUGlja2xlLmMgKG9yIGluIHB5Y29uZmlnLmgpLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gZHVtYmRibS5weTogZml4ZWQgYSBkdW1iIG9sZCBidWcgKHRoZSBmaWxlIGRpZG4ndCBnZXQgc3luY2hlZCBhdAorICBjbG9zZSBvciBkZWxldGUgdGltZSkuCisKKy0gcmZjODIyLnB5OiBmaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgYWRkcmVzcyAnPD4nIHdhcyBjb252ZXJ0ZWQgdG8gTm9uZQorICBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZyAoYWxzbyBmaXhlcyB0aGUgZW1haWwuVXRpbHMgbW9kdWxlKS4KKworLSB4bWxycGNsaWIucHk6IHZlcnNpb24gMS4wLjA7IHVzZXMgcHJlY2lzaW9uIGZvciBkb3VibGVzLgorCistIHRlc3Qgc3VpdGU6IHRoZSBwaWNrbGUgYW5kIGNQaWNrbGUgdGVzdHMgd2VyZSBub3QgZXhlY3V0aW5nIGFueSBjb2RlCisgIHdoZW4gcnVuIGZyb20gdGhlIHN0YW5kYXJkIHJlZ3Jlc3Npb24gdGVzdC4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKK0J1aWxkCistLS0tLQorCitDIEFQSQorLS0tLS0KKworTmV3IHBsYXRmb3JtcworLS0tLS0tLS0tLS0tLQorCitUZXN0cworLS0tLS0KKworV2luZG93cworLS0tLS0tLQorCistIGRpc3R1dGlscyBwYWNrYWdlOiBmaXhlZCBicm9rZW4gV2luZG93cyBpbnN0YWxsZXJzIChiZGlzdF93aW5pbnN0KS4KKworLSB0ZW1wZmlsZS5weTogcHJldmVudCBteXN0ZXJpb3VzIHdhcm5pbmdzIHdoZW4gVGVtcG9yYXJ5RmlsZVdyYXBwZXIKKyAgaW5zdGFuY2VzIGFyZSBkZWxldGVkIGF0IHByb2Nlc3MgZXhpdCB0aW1lLgorCistIHNvY2tldC5weTogcHJldmVudCBteXN0ZXJpb3VzIHdhcm5pbmdzIHdoZW4gc29ja2V0IGluc3RhbmNlcyBhcmUKKyAgZGVsZXRlZCBhdCBwcm9jZXNzIGV4aXQgdGltZS4KKworLSBwb3NpeG1vZHVsZS5jOiBmaXggYSBXaW5kb3dzIGNyYXNoIHdpdGggc3RhdCgpIG9mIGEgZmlsZW5hbWUgZW5kaW5nCisgIGluIGJhY2tzbGFzaC4KKworTWFjCistLS0tCisKKy0gVGhlIENhcmJvbiB0b29sYm94IG1vZHVsZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIHRvIFVuaXZlcnNhbCBIZWFkZXJzCisgIDMuNCwgYW5kIGV4cGVyaW1lbnRhbCBDb3JlR3JhcGhpY3MgYW5kIENhcmJvbkV2ZW50cyBtb2R1bGVzIGhhdmUKKyAgYmVlbiBhZGRlZC4gIEFsbCBvbmx5IGZvciBmcmFtZXdvcmstZW5hYmxlZCBNYWNPU1guCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYzE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMTQtRGVjLTIwMDEqCisKK1R5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEd1aWRvJ3MgdHV0b3JpYWwgaW50cm9kdWN0aW9uIHRvIHRoZSBuZXcgdHlwZS9jbGFzcyBmZWF0dXJlcyBoYXMKKyAgYmVlbiBleHRlbnNpdmVseSB1cGRhdGVkLiAgU2VlCisKKyAgICAgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvZGVzY3JpbnRyby5odG1sCisKKyAgVGhhdCByZW1haW5zIHRoZSBwcmltYXJ5IGRvY3VtZW50YXRpb24gaW4gdGhpcyBhcmVhLgorCistIEZpeGVkIGEgbGVhazogaW5zdGFuY2UgdmFyaWFibGVzIGRlY2xhcmVkIHdpdGggX19zbG90c19fIHdlcmUgbmV2ZXIKKyAgZGVsZXRlZCEKKworLSBUaGUgImRlbGV0ZSBhdHRyaWJ1dGUiIG1ldGhvZCBvZiBkZXNjcmlwdG9yIG9iamVjdHMgaXMgY2FsbGVkCisgIF9fZGVsZXRlX18sIG5vdCBfX2RlbF9fLiAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIGl0IHdhcyBtaXN0YWtlbmx5CisgIGNhbGxlZCBfX2RlbF9fLCB3aGljaCBjcmVhdGVkIGFuIHVuZm9ydHVuYXRlIG92ZXJsb2FkaW5nIGNvbmRpdGlvbgorICB3aXRoIGZpbmFsaXplcnMuICAoVGhlICJnZXQgYXR0cmlidXRlIiBhbmQgInNldCBhdHRyaWJ1dGUiIG1ldGhvZHMKKyAgYXJlIHN0aWxsIGNhbGxlZCBfX2dldF9fIGFuZCBfX3NldF9fLCByZXNwZWN0aXZlbHkuKQorCistIFNvbWUgc3VidGxlIGlzc3VlcyB3aXRoIHRoZSBzdXBlciBidWlsdC1pbiB3ZXJlIGZpeGVkOgorCisgIChhKSBXaGVuIHN1cGVyIGl0c2VsZiBpcyBzdWJjbGFzc2VkLCBpdHMgX19nZXRfXyBtZXRob2Qgd291bGQgc3RpbGwKKyAgICAgIHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBjbGFzcyAoaS5lLiwgb2Ygc3VwZXIpLgorCisgIChiKSBzdXBlcihDLCBDKCkpLl9fY2xhc3NfXyB3b3VsZCByZXR1cm4gQyByYXRoZXIgdGhhbiBzdXBlci4gIFRoaXMKKyAgICAgIGlzIGNvbmZ1c2luZy4gIFRvIGZpeCB0aGlzLCBJIGRlY2lkZWQgdG8gY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YKKyAgICAgIHN1cGVyIHNvIHRoYXQgaXQgb25seSBhcHBsaWVzIHRvIGNvZGUgYXR0cmlidXRlcywgbm90IHRvIGRhdGEKKyAgICAgIGF0dHJpYnV0ZXMuICBBZnRlciBhbGwsIG92ZXJyaWRpbmcgZGF0YSBhdHRyaWJ1dGVzIGlzIG5vdAorICAgICAgc3VwcG9ydGVkIGFueXdheS4KKworICAoYykgVGhlIF9fZ2V0X18gbWV0aG9kIGRpZG4ndCBjaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYW4KKyAgICAgIGluc3RhbmNlIG9mIHRoZSB0eXBlIHVzZWQgaW4gY3JlYXRpb24gb2YgdGhlIHN1cGVyIGluc3RhbmNlLgorCistIFByZXZpb3VzbHksIGhhc2goKSBvZiBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIGEgbXV0YWJsZSB0eXBlCisgIChsaXN0IG9yIGRpY3Rpb25hcnkpIHdvdWxkIHJldHVybiBzb21lIHZhbHVlLCByYXRoZXIgdGhhbiByYWlzaW5nCisgIFR5cGVFcnJvci4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuICBBbHNvLCBkaXJlY3RseSBjYWxsaW5nCisgIGRpY3QuX19oYXNoX18gYW5kIGxpc3QuX19oYXNoX18gbm93IHJhaXNlcyB0aGUgc2FtZSBUeXBlRXJyb3IKKyAgKHByZXZpb3VzbHksIHRoZXNlIHdlcmUgdGhlIHNhbWUgYXMgb2JqZWN0Ll9faGFzaF9fKS4KKworLSBOZXctc3R5bGUgb2JqZWN0cyBub3cgc3VwcG9ydCBkZWxldGluZyB0aGVpciBfX2RpY3RfXy4gIFRoaXMgaXMgZm9yCisgIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyBlcXVpdmFsZW50IHRvIGFzc2lnbmluZyBhIGJyYW5kIG5ldyBlbXB0eQorICBkaWN0aW9uYXJ5LCBidXQgc2F2ZXMgc3BhY2UgaWYgdGhlIG9iamVjdCBpcyBub3QgdXNlZCBmdXJ0aGVyLgorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSAtUW5ldyBub3cgd29ya3MgYXMgZG9jdW1lbnRlZCBpbiBQRVAgMjM4OiAgd2hlbiAtUW5ldyBpcyBwYXNzZWQgb24KKyAgdGhlIGNvbW1hbmQgbGluZSwgYWxsIG9jY3VycmVuY2VzIG9mICIvIiB1c2UgdHJ1ZSBkaXZpc2lvbiBpbnN0ZWFkCisgIG9mIGNsYXNzaWMgZGl2aXNpb24uICBTZWUgdGhlIFBFUCBmb3IgZGV0YWlscy4gIE5vdGUgdGhhdCAiYWxsIgorICBtZWFucyBhbGwgaW5zdGFuY2VzIGluIGxpYnJhcnkgYW5kIDNyZC1wYXJ0eSBtb2R1bGVzLCBhcyB3ZWxsIGFzIGluCisgIHlvdXIgb3duIGNvZGUuICBBcyB0aGUgUEVQIHNheXMsIC1RbmV3IGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBpbgorICBlZHVjYXRpb25hbCBlbnZpcm9ubWVudHMgd2l0aCBjb250cm9sIG92ZXIgdGhlIGxpYnJhcmllcyBpbiB1c2UuCisgIE5vdGUgdGhhdCB0ZXN0X2NvZXJjaW9uLnB5IGluIHRoZSBzdGFuZGFyZCBQeXRob24gdGVzdCBzdWl0ZSBmYWlscworICB1bmRlciAtUW5ldzsgdGhpcyBpcyBleHBlY3RlZCwgYW5kIHdvbid0IGJlIHJlcGFpcmVkIHVudGlsIHRydWUKKyAgZGl2aXNpb24gYmVjb21lcyB0aGUgZGVmYXVsdCAoaW4gdGhlIG1lYW50aW1lLCB0ZXN0X2NvZXJjaW9uIGlzCisgIHRlc3RpbmcgdGhlIGN1cnJlbnQgcnVsZXMpLgorCistIGNvbXBsZXgoKSBub3cgb25seSBhbGxvd3MgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGEgc3RyaW5nCisgIGFyZ3VtZW50LCBhbmQgcmFpc2VzIFR5cGVFcnJvciBpZiBlaXRoZXIgdGhlIHNlY29uZCBhcmcgaXMgYSBzdHJpbmcKKyAgb3IgaWYgdGhlIHNlY29uZCBhcmcgaXMgc3BlY2lmaWVkIHdoZW4gdGhlIGZpcnN0IGlzIGEgc3RyaW5nLgorCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBnYy5nZXRfcmVmZXJlbnRzIHdhcyByZW5hbWVkIHRvIGdjLmdldF9yZWZlcnJlcnMuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBGdW5jdGlvbnMgaW4gdGhlIG9zLnNwYXduKCkgZmFtaWx5IG5vdyByZWxlYXNlIHRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIKKyAgbG9jayBhcm91bmQgY2FsbGluZyB0aGUgcGxhdGZvcm0gc3Bhd24uICBUaGV5IHNob3VsZCBhbHdheXMgaGF2ZSBkb25lCisgIHRoaXMsIGJ1dCBkaWQgbm90IGJlZm9yZSAyLjJjMS4gIE11bHRpdGhyZWFkZWQgcHJvZ3JhbXMgY2FsbGluZworICBhbiBvcy5zcGF3biBmdW5jdGlvbiB3aXRoIFBfV0FJVCB3aWxsIG5vIGxvbmdlciBibG9jayBhbGwgUHl0aG9uIHRocmVhZHMKKyAgdW50aWwgdGhlIHNwYXduZWQgcHJvZ3JhbSBjb21wbGV0ZXMuICBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBwcm9ncmFtcworICByZWxpZXMgb24gYmxvY2tpbmcsIGFsdGhvdWdoIG1vcmUgbGlrZWx5IGJ5IGFjY2lkZW50IHRoYW4gYnkgZGVzaWduLgorCistIHdlYmJyb3dzZXIgZGVmYXVsdHMgdG8gbmV0c2NhcGUuZXhlIG9uIE9TLzIgbm93LgorCistIFRpeC5SZXNpemVIYW5kbGUgZXhwb3NlcyBkZXRhY2hfd2lkZ2V0LCBoaWRlLCBhbmQgc2hvdy4KKworLSBUaGUgY2hhcnNldCBhbGlhcyB3aW5kb3dzXzEyNTIgaGFzIGJlZW4gYWRkZWQuCisKKy0gdHlwZXMuU3RyaW5nVHlwZXMgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBkZWZpbmVkIHN0cmluZyB0eXBlczsKKyAgdXN1YWxseSB0aGlzIHdpbGwgYmUgKHN0ciwgdW5pY29kZSksIGJ1dCBpZiBQeXRob24gd2FzIGNvbXBpbGVkCisgIHdpdGhvdXQgVW5pY29kZSBzdXBwb3J0IGl0IHdpbGwgYmUganVzdCAoc3RyLCkuCisKKy0gVGhlIHB1bGxkb20gYW5kIG1pbmlkb20gbW9kdWxlcyB3ZXJlIHN5bmNocm9uaXplZCB0byBQeVhNTC4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gQSBuZXcgc2NyaXB0IGNhbGxlZCBUb29scy9zY3JpcHRzL2dvb2dsZS5weSB3YXMgYWRkZWQsIHdoaWNoIGZpcmVzCisgIG9mZiBhIHNlYXJjaCBvbiBHb29nbGUuCisKK0J1aWxkCistLS0tLQorCistIE5vdGUgdGhhdCByZWxlYXNlIGJ1aWxkcyBvZiBQeXRob24gc2hvdWxkIGFycmFuZ2UgdG8gZGVmaW5lIHRoZQorICBwcmVwcm9jZXNzb3Igc3ltYm9sIE5ERUJVRyBvbiB0aGUgY29tbWFuZCBsaW5lIChvciBlcXVpdmFsZW50KS4KKyAgSW4gdGhlIDIuMiBwcmUtcmVsZWFzZSBzZXJpZXMgd2UgdHJpZWQgdG8gZGVmaW5lIHRoaXMgYnkgbWFnaWMgaW4KKyAgUHl0aG9uLmggaW5zdGVhZCwgYnV0IGl0IHByb3ZlZCB0byBjYXVzZSBwcm9ibGVtcyBmb3IgZXh0ZW5zaW9uCisgIGF1dGhvcnMuICBUaGUgVW5peCwgV2luZG93cyBhbmQgTWFjIGJ1aWxkcyBub3cgYWxsIGRlZmluZSBOREVCVUcgaW4KKyAgcmVsZWFzZSBidWlsZHMgdmlhIGNtZGxpbmUgKG9yIGVxdWl2YWxlbnQpIGluc3RlYWQuICBQb3J0cyB0bworICBvdGhlciBwbGF0Zm9ybXMgc2hvdWxkIGRvIGxpa2V3aXNlLgorCistIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gdXNlIC0td2l0aC1zdWZmaXggd2hlbiBidWlsZGluZyBvbiBhCisgIGNhc2UtaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW0gKHN1Y2ggYXMgTWFjIE9TIFggSEZTKykuIEluIHRoZSBidWlsZAorICBkaXJlY3RvcnkgYW4gZXh0ZW5zaW9uIGlzIHVzZWQsIGJ1dCBub3QgaW4gdGhlIGluc3RhbGxlZCBweXRob24uCisKK0MgQVBJCistLS0tLQorCistIE5ldyBmdW5jdGlvbiBQeURpY3RfTWVyZ2VGcm9tU2VxMigpIGV4cG9zZXMgdGhlIGJ1aWx0aW4gZGljdAorICBjb25zdHJ1Y3RvcidzIGxvZ2ljIGZvciB1cGRhdGluZyBhIGRpY3Rpb25hcnkgZnJvbSBhbiBpdGVyYWJsZSBvYmplY3QKKyAgcHJvZHVjaW5nIGtleS12YWx1ZSBwYWlycy4KKworLSBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKSByZXF1aXJlcyB0aGF0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbgorICB0aGUga2V5d29yZCBsaXN0IGVxdWFsIHRoZSBudW1iZXIgb2YgYXJndW1lbnQgc3BlY2lmaWVycy4gIFRoaXMKKyAgd2Fzbid0IGNoZWNrZWQgY29ycmVjdGx5LCBhbmQgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIGNvdWxkIGV2ZW4KKyAgZHVtcCBjb3JlIGluIHNvbWUgYmFkIGNhc2VzLiAgVGhpcyBoYXMgYmVlbiByZXBhaXJlZC4gIEFzIGEgcmVzdWx0LAorICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMgbWF5IHJhaXNlIFJ1bnRpbWVFcnJvciBpbiBiYWQgY2FzZXMgdGhhdAorICBwcmV2aW91c2x5IHdlbnQgdW5jaGFsbGVuZ2VkLgorCitOZXcgcGxhdGZvcm1zCistLS0tLS0tLS0tLS0tCisKK1Rlc3RzCistLS0tLQorCitXaW5kb3dzCistLS0tLS0tCisKK01hYworLS0tLQorCistIEluIHVuaXgtUHl0aG9uIG9uIE1hYyBPUyBYIChhbmQgZGFyd2luKSBzeXMucGxhdGZvcm0gaXMgbm93ICJkYXJ3aW4iLAorICB3aXRob3V0IGFueSB0cmFpbGluZyBkaWdpdHMuCisKKy0gQ2hhbmdlZCBsb2dpYyBmb3IgZmluZGluZyBweXRob24gaG9tZSBpbiBNYWMgT1MgWCBmcmFtZXdvcmsgUHl0aG9ucy4KKyAgTm93IHN5cy5leGVjdXRhYmxlIHBvaW50cyB0byB0aGUgZXhlY3V0YWJsZSBhZ2FpbiwgaW4gc3RlYWQgb2YgdG8KKyAgdGhlIHNoYXJlZCBsaWJyYXJ5LiBUaGUgbGF0dGVyIGlzIHVzZWQgb25seSBmb3IgbG9jYXRpbmcgdGhlIHB5dGhvbgorICBob21lLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMmIyPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE2LU5vdi0yMDAxKgorCitUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBNdWx0aXBsZSBpbmhlcml0YW5jZSBtaXhpbmcgbmV3LXN0eWxlIGFuZCBjbGFzc2ljIGNsYXNzZXMgaW4gdGhlCisgIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIGlzIG5vdyBhbGxvd2VkLCBzbyB0aGlzIHdvcmtzIG5vdzoKKworICAgICAgY2xhc3MgQ2xhc3NpYzogcGFzcworICAgICAgY2xhc3MgTWl4ZWQoQ2xhc3NpYywgb2JqZWN0KTogcGFzcworCisgIFRoZSBNUk8gKG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyKSBmb3IgZWFjaCBiYXNlIGNsYXNzIGlzIHJlc3BlY3RlZAorICBhY2NvcmRpbmcgdG8gaXRzIGtpbmQsIGJ1dCB0aGUgTVJPIGZvciB0aGUgZGVyaXZlZCBjbGFzcyBpcyBjb21wdXRlZAorICB1c2luZyBuZXctc3R5bGUgTVJPIHJ1bGVzIGlmIGFueSBiYXNlIGNsYXNzIGlzIGEgbmV3LXN0eWxlIGNsYXNzLgorICBUaGlzIG5lZWRzIHRvIGJlIGRvY3VtZW50ZWQuCisKKy0gVGhlIG5ldyBidWlsdGluIGRpY3Rpb25hcnkoKSBjb25zdHJ1Y3RvciwgYW5kIGRpY3Rpb25hcnkgdHlwZSwgaGF2ZQorICBiZWVuIHJlbmFtZWQgdG8gZGljdC4gIFRoaXMgcmVmbGVjdHMgYSBkZWNhZGUgb2YgY29tbW9uIHVzYWdlLgorCistIGRpY3QoKSBub3cgYWNjZXB0cyBhbiBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nIDItc2VxdWVuY2VzLiAgRm9yCisgIGV4YW1wbGUsIGRpY3QoZC5pdGVtcygpKSA9PSBkIGZvciBhbnkgZGljdGlvbmFyeSBkLiAgVGhlIGFyZ3VtZW50LAorICBhbmQgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcmd1bWVudCwgY2FuIGJlIGFueSBpdGVyYWJsZSBvYmplY3RzLgorCistIE5ldy1zdHlsZSBjbGFzc2VzIGNhbiBub3cgaGF2ZSBhIF9fZGVsX18gbWV0aG9kLCB3aGljaCBpcyBjYWxsZWQKKyAgd2hlbiB0aGUgaW5zdGFuY2UgaXMgZGVsZXRlZCAoanVzdCBsaWtlIGZvciBjbGFzc2ljIGNsYXNzZXMpLgorCistIEFzc2lnbm1lbnQgdG8gb2JqZWN0Ll9fZGljdF9fIGlzIG5vdyBwb3NzaWJsZSwgZm9yIG9iamVjdHMgdGhhdCBhcmUKKyAgaW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzIHRoYXQgaGF2ZSBhIF9fZGljdF9fICh1bmxlc3MgdGhlIGJhc2UKKyAgY2xhc3MgZm9yYmlkcyBpdCkuCisKKy0gTWV0aG9kcyBvZiBidWlsdC1pbiB0eXBlcyBub3cgcHJvcGVybHkgY2hlY2sgZm9yIGtleXdvcmQgYXJndW1lbnRzCisgIChmb3JtZXJseSB0aGVzZSB3ZXJlIHNpbGVudGx5IGlnbm9yZWQpLiAgVGhlIG9ubHkgYnVpbHQtaW4gbWV0aG9kcworICB0aGF0IHRha2Uga2V5d29yZCBhcmd1bWVudHMgYXJlIF9fY2FsbF9fLCBfX2luaXRfXyBhbmQgX19uZXdfXy4KKworLSBUaGUgc29ja2V0IGZ1bmN0aW9uIGhhcyBiZWVuIGNvbnZlcnRlZCB0byBhIHR5cGU7IHNlZSBiZWxvdy4KKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQXNzaWdubWVudCB0byBfX2RlYnVnX18gcmFpc2VzIFN5bnRheEVycm9yIGF0IGNvbXBpbGUtdGltZS4gIFRoaXMKKyAgd2FzIHByb21pc2VkIHdoZW4gMi4xYzEgd2FzIHJlbGVhc2VkIGFzICJXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjFjMSIKKyAgKHNlZSBiZWxvdykgc2F5cy4KKworLSBDbGFyaWZpZWQgdGhlIGVycm9yIG1lc3NhZ2VzIGZvciB1bnN1cHBvcnRlZCBvcGVyYW5kcyB0byBhbiBvcGVyYXRvcgorICAobGlrZSAxICsgJycpLgorCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBtbWFwIGhhcyBhIG5ldyBrZXl3b3JkIGFyZ3VtZW50LCAiYWNjZXNzIiwgYWxsb3dpbmcgYSB1bmlmb3JtIHdheSBmb3IKKyAgYm90aCBXaW5kb3dzIGFuZCBVbml4IHVzZXJzIHRvIGNyZWF0ZSByZWFkLW9ubHksIHdyaXRlLXRocm91Z2ggYW5kCisgIGNvcHktb24td3JpdGUgbWVtb3J5IG1hcHBpbmdzLiAgVGhpcyB3YXMgcHJldmlvdXNseSBwb3NzaWJsZSBvbmx5IG9uCisgIFVuaXguICBBIG5ldyBrZXl3b3JkIGFyZ3VtZW50IHdhcyByZXF1aXJlZCB0byBzdXBwb3J0IHRoaXMgaW4gYQorICB1bmlmb3JtIHdheSBiZWNhdXNlIHRoZSBtbWFwKCkgc2lnbmF0dXJlcyBoYWQgZGl2ZXJnZWQgYWNyb3NzCisgIHBsYXRmb3Jtcy4gIFRoYW5rcyB0byBKYXkgVCBNaWxsZXIgZm9yIHJlcGFpcmluZyB0aGlzIQorCistIEJ5IGRlZmF1bHQsIHRoZSBnYy5nYXJiYWdlIGxpc3Qgbm93IGNvbnRhaW5zIG9ubHkgdGhvc2UgaW5zdGFuY2VzIGluCisgIHVucmVhY2hhYmxlIGN5Y2xlcyB0aGF0IGhhdmUgX19kZWxfXyBtZXRob2RzOyBpbiAyLjEgaXQgY29udGFpbmVkIGFsbAorICBpbnN0YW5jZXMgaW4gdW5yZWFjaGFibGUgY3ljbGVzLiAgIkluc3RhbmNlcyIgaGVyZSBoYXMgYmVlbiBnZW5lcmFsaXplZAorICB0byBpbmNsdWRlIGluc3RhbmNlcyBvZiBib3RoIG5ldy1zdHlsZSBhbmQgb2xkLXN0eWxlIGNsYXNzZXMuCisKKy0gVGhlIHNvY2tldCBtb2R1bGUgZGVmaW5lcyBhIG5ldyBtZXRob2QgZm9yIHNvY2tldCBvYmplY3RzLAorICBzZW5kYWxsKCkuICBUaGlzIGlzIGxpa2Ugc2VuZCgpIGJ1dCBtYXkgbWFrZSBtdWx0aXBsZSBjYWxscyB0bworICBzZW5kKCkgdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gc2VudC4gIEFsc28sIHRoZSBzb2NrZXQgZnVuY3Rpb24gaGFzCisgIGJlZW4gY29udmVydGVkIHRvIGEgc3ViY2xhc3NhYmxlIHR5cGUsIGxpa2UgbGlzdCBhbmQgdHVwbGUgKGV0Yy4pCisgIGJlZm9yZSBpdDsgc29ja2V0IGFuZCBTb2NrZXRUeXBlIGFyZSBub3cgdGhlIHNhbWUgdGhpbmcuCisKKy0gVmFyaW91cyBidWdmaXhlcyB0byB0aGUgY3Vyc2VzIG1vZHVsZS4gIFRoZXJlIGlzIG5vdyBhIHRlc3Qgc3VpdGUKKyAgZm9yIHRoZSBjdXJzZXMgbW9kdWxlICh5b3UgaGF2ZSB0byBydW4gaXQgbWFudWFsbHkpLgorCistIGJpbmFzY2lpLmIyYV9iYXNlNjQgbm8gbG9uZ2VyIHBsYWNlcyBhbiBhcmJpdHJhcnkgcmVzdHJpY3Rpb24gb2YgNTcKKyAgYnl0ZXMgb24gaXRzIGlucHV0LgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gdGtGaWxlRGlhbG9nIGV4cG9zZXMgYSBEaXJlY3RvcnkgY2xhc3MgYW5kIGFza2RpcmVjdG9yeQorICBjb252ZW5pZW5jZSBmdW5jdGlvbi4KKworLSBTeW1ib2xpYyBncm91cCBuYW1lcyBpbiByZWd1bGFyIGV4cHJlc3Npb25zIG11c3QgYmUgdW5pcXVlLiAgRm9yCisgIGV4YW1wbGUsIHRoZSByZWdleHAgcicoP1A8YWJjPikoP1A8YWJjPiknIGlzIG5vdCBhbGxvd2VkLCBiZWNhdXNlIGEKKyAgc2luZ2xlIG5hbWUgY2FuJ3QgbWVhbiBib3RoICJncm91cCAxIiBhbmQgImdyb3VwIDIiIHNpbXVsdGFuZW91c2x5LgorICBQeXRob24gMi4yIGRldGVjdHMgdGhpcyBlcnJvciBhdCByZWdleHAgY29tcGlsYXRpb24gdGltZTsKKyAgcHJldmlvdXNseSwgdGhlIGVycm9yIHdlbnQgdW5kZXRlY3RlZCwgYW5kIHJlc3VsdHMgd2VyZQorICB1bnByZWRpY3RhYmxlLiAgQWxzbyBpbiBzcmUsIHRoZSBwYXR0ZXJuLnNwbGl0KCksIHBhdHRlcm4uc3ViKCksIGFuZAorICBwYXR0ZXJuLnN1Ym4oKSBtZXRob2RzIGhhdmUgYmVlbiByZXdyaXR0ZW4gaW4gQy4gIEFsc28sIGFuCisgIGV4cGVyaW1lbnRhbCBmdW5jdGlvbi9tZXRob2QgZmluZGl0ZXIoKSBoYXMgYmVlbiBhZGRlZCwgd2hpY2ggd29ya3MKKyAgbGlrZSBmaW5kYWxsKCkgYnV0IHJldHVybnMgYW4gaXRlcmF0b3IuCisKKy0gVGl4IGV4cG9zZXMgbW9yZSBjb21tYW5kcyB0aHJvdWdoIHRoZSBjbGFzc2VzIERpclNlbGVjdEJveCwKKyAgRGlyU2VsZWN0RGlhbG9nLCBMaXN0Tm90ZUJvb2ssIE1ldGVyLCBDaGVja0xpc3QsIGFuZCB0aGUKKyAgbWV0aG9kcyB0aXhfYWRkYml0bWFwZGlyLCB0aXhfY2dldCwgdGl4X2NvbmZpZ3VyZSwgdGl4X2ZpbGVkaWFsb2csCisgIHRpeF9nZXRiaXRtYXAsIHRpeF9nZXRpbWFnZSwgdGl4X29wdGlvbl9nZXQsIGFuZCB0aXhfcmVzZXRvcHRpb25zLgorCistIFRyYWNlYmFjayBvYmplY3RzIGFyZSBub3cgc2Nhbm5lZCBieSBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0aW9uLCBzbworICBjeWNsZXMgY3JlYXRlZCBieSBjYXN1YWwgdXNlIG9mIHN5cy5leGNfaW5mbygpIG5vIGxvbmdlciBjYXVzZQorICBwZXJtYW5lbnQgbWVtb3J5IGxlYWtzIChwcm92aWRlZCBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgZW5hYmxlZCkuCisKKy0gb3MuZXh0c2VwIC0tIGEgbmV3IHZhcmlhYmxlIG5lZWRlZCBieSB0aGUgUklTQ09TIHN1cHBvcnQuICBJdCBpcyB0aGUKKyAgc2VwYXJhdG9yIHVzZWQgYnkgZXh0ZW5zaW9ucywgYW5kIGlzICcuJyBvbiBhbGwgcGxhdGZvcm1zIGV4Y2VwdAorICBSSVNDT1MsIHdoZXJlIGl0IGlzICcvJy4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoaXMgdmFyaWFibGUKKyAgdW5sZXNzIHlvdSBoYXZlIGEgbWFzb2NoaXN0aWMgZGVzaXJlIHRvIHBvcnQgeW91ciBjb2RlIHRvIFJJU0NPUy4KKworLSBtaW1ldHlwZXMucHkgaGFzIG9wdGlvbmFsIHN1cHBvcnQgZm9yIG5vbi1zdGFuZGFyZCwgYnV0IGNvbW1vbmx5CisgIGZvdW5kIHR5cGVzLiAgZ3Vlc3NfdHlwZSgpIGFuZCBndWVzc19leHRlbnNpb24oKSBub3cgYWNjZXB0IGFuCisgIG9wdGlvbmFsICdzdHJpY3QnIGZsYWcsIGRlZmF1bHRpbmcgdG8gdHJ1ZSwgd2hpY2ggY29udHJvbHMgd2hldGhlcgorICByZWNvZ25pemUgbm9uLXN0YW5kYXJkIHR5cGVzIG9yIG5vdC4gIEEgZmV3IG5vbi1zdGFuZGFyZCB0eXBlcyB3ZQorICBrbm93IGFib3V0IGhhdmUgYmVlbiBhZGRlZC4gIEFsc28sIHdoZW4gcnVuIGFzIGEgc2NyaXB0LCB0aGVyZSBhcmUKKyAgbmV3IC1sIGFuZCAtZSBvcHRpb25zLgorCistIHN0YXRjYWNoZSBpcyBub3cgZGVwcmVjYXRlZC4KKworLSBlbWFpbC5VdGlscy5mb3JtYXRkYXRlKCkgbm93IHByb2R1Y2VzIHRoZSBwcmVmZXJyZWQgUkZDIDI4MjIgc3R5bGUKKyAgZGF0ZXMgd2l0aCBudW1lcmljIHRpbWV6b25lcyAoaXQgdXNlZCB0byBwcm9kdWNlIG9ic29sZXRlIGRhdGVzCisgIGhhcmQgY29kZWQgdG8gIkdNVCIgdGltZXpvbmUpLiAgQW4gb3B0aW9uYWwgJ2xvY2FsdGltZScgZmxhZyBpcworICBhZGRlZCB0byBwcm9kdWNlIGRhdGVzIGluIHRoZSBsb2NhbCB0aW1lem9uZSwgd2l0aCBkYXlsaWdodCBzYXZpbmdzCisgIHRpbWUgcHJvcGVybHkgdGFrZW4gaW50byBhY2NvdW50LgorCistIEluIHBpY2tsZSBhbmQgY1BpY2tsZSwgaW5zdGVhZCBvZiBtYXNraW5nIGVycm9ycyBpbiBsb2FkKCkgYnkKKyAgdHJhbnNmb3JtaW5nIHRoZW0gaW50byBTeXN0ZW1FcnJvciwgd2UgbGV0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24KKyAgcHJvcGFnYXRlIG91dC4gIEFsc28sIGltcGxlbWVudCBzdXBwb3J0IGZvciBfX3NhZmVfZm9yX3VucGlja2xpbmdfXworICBpbiBwaWNrbGUsIGFzIGl0IGFscmVhZHkgd2FzIHN1cHBvcnRlZCBpbiBjUGlja2xlLgorCitUb29scy9EZW1vcworLS0tLS0tLS0tLS0KKworQnVpbGQKKy0tLS0tCisKKy0gVGhlIGRibSBtb2R1bGUgaXMgYnVpbHQgdXNpbmcgbGliZGIxIGlmIGF2YWlsYWJsZS4gIFRoZSBic2RkYiBtb2R1bGUKKyAgaXMgYnVpbHQgd2l0aCBsaWJkYjMgaWYgYXZhaWxhYmxlLgorCistIE1pc2MvTWFrZWZpbGUucHJlLmluIGhhcyBiZWVuIHJlbW92ZWQgYnkgQkRGTCBwcm9ub3VuY2VtZW50LgorCitDIEFQSQorLS0tLS0KKworLSBOZXcgZnVuY3Rpb24gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKCkgcmV0dXJucyB0aGUgc2l6ZSBvZiBhIG5vbi0KKyAgTlVMTCByZXN1bHQgZnJvbSBQeVNlcXVlbmNlX0Zhc3QoKSwgbW9yZSBxdWlja2x5IHRoYW4gY2FsbGluZworICBQeVNlcXVlbmNlX1NpemUoKS4KKworLSBOZXcgYXJndW1lbnQgdW5wYWNraW5nIGZ1bmN0aW9uIFB5QXJnX1VucGFja1R1cGxlKCkgYWRkZWQuCisKKy0gTmV3IGZ1bmN0aW9ucyBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKCkgYW5kCisgIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKCkgaGF2ZSBiZWVuIGFkZGVkIHRvIG1ha2UgaXQgbW9yZQorICBjb252ZW5pZW50IGFuZCBlZmZpY2llbnQgdG8gY2FsbCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgZnJvbSBDLgorCistIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpIG5vIGxvbmdlciBtYXNrcyBlcnJvcnMsIHNvIGl0J3MKKyAgcG9zc2libGUgdGhhdCB0aGlzIHdpbGwgcHJvcGFnYXRlIGVycm9ycyBpdCBkaWRuJ3QgYmVmb3JlLgorCistIE5ldyBmdW5jdGlvbiBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIoKSwgd2hpY2ggcmV0dXJucyB0cnVlIGlmIGl0cworICBhcmd1bWVudCBzdXBwb3J0cyB0aGUgc2luZ2xlLXNlZ21lbnQgcmVhZGFibGUgYnVmZmVyIGludGVyZmFjZS4KKworTmV3IHBsYXRmb3JtcworLS0tLS0tLS0tLS0tLQorCistIFdlJ3ZlIGZpbmFsbHkgY29uZmlybWVkIHRoYXQgdGhpcyByZWxlYXNlIGJ1aWxkcyBvbiBIUC1VWCAxMS4wMCwKKyAgKndpdGgqIHRocmVhZHMsIGFuZCBwYXNzZXMgdGhlIHRlc3Qgc3VpdGUuCisKKy0gVGhhbmtzIHRvIGEgc2VyaWVzIG9mIHBhdGNoZXMgZnJvbSBNaWNoYWVsIE11bGxlciwgUHl0aG9uIG1heSBidWlsZAorICBhZ2FpbiB1bmRlciBPUy8yIFZpc3VhbCBBZ2UgQysrLgorCistIFVwZGF0ZWQgUklTQ09TIHBvcnQgYnkgRGlldG1hciBTY2h3ZXJ0YmVyZ2VyLgorCitUZXN0cworLS0tLS0KKworLSBBZGRlZCBhIHRlc3Qgc2NyaXB0IGZvciB0aGUgY3Vyc2VzIG1vZHVsZS4gIEl0IGlzbid0IHJ1biBhdXRvbWF0aWNhbGx5OworICByZWdydGVzdC5weSBtdXN0IGJlIHJ1biB3aXRoICctdSBjdXJzZXMnIHRvIGVuYWJsZSBpdC4KKworV2luZG93cworLS0tLS0tLQorCitNYWMKKy0tLS0KKworLSBQeXRob25TY3JpcHQgaGFzIGJlZW4gbW92ZWQgdG8gdW5zdXBwb3J0ZWQgYW5kIGlzIHNsYXRlZCB0byBiZQorICByZW1vdmVkIGNvbXBsZXRlbHkgaW4gdGhlIG5leHQgcmVsZWFzZS4KKworLSBJdCBzaG91bGQgbm93IGJlIHBvc3NpYmxlIHRvIGJ1aWxkIGFwcGxldHMgdGhhdCB3b3JrIG9uIGJvdGggT1M5IGFuZAorICBPU1guCisKKy0gVGhlIGNvcmUgaXMgbm93IGxpbmtlZCB3aXRoIENvcmVTZXJ2aWNlcyBub3QgQ2FyYm9uOyBhcyBhIHNpZGUKKyAgcmVzdWx0LCBkZWZhdWx0IDhiaXQgZW5jb2Rpbmcgb24gT1NYIGlzIG5vdyBBU0NJSS4KKworLSBQeXRob24gc2hvdWxkIG5vdyBidWlsZCBvbiBPU1ggMTAuMS4xCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMTktT2N0LTIwMDEqCisKK1R5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIE5ldy1zdHlsZSBjbGFzc2VzIGFyZSBub3cgYWx3YXlzIGR5bmFtaWMgKGV4Y2VwdCBmb3IgYnVpbHQtaW4gYW5kCisgIGV4dGVuc2lvbiB0eXBlcykuICBUaGVyZSBpcyBubyBsb25nZXIgYSBwZXJmb3JtYW5jZSBwZW5hbHR5LCBhbmQgSQorICBubyBsb25nZXIgc2VlIGFub3RoZXIgcmVhc29uIHRvIGtlZXAgdGhpcyBiYWdnYWdlIGFyb3VuZC4gIE9uZSByZWxpYworICByZW1haW5zOiB0aGUgX19kaWN0X18gb2YgYSBuZXctc3R5bGUgY2xhc3MgaXMgYSByZWFkLW9ubHkgcHJveHk7IHlvdQorICBtdXN0IHNldCB0aGUgY2xhc3MncyBhdHRyaWJ1dGUgdG8gbW9kaWZ5IGl0LiAgQXMgYSBjb25zZXF1ZW5jZSwgdGhlCisgIF9fZGVmaW5lZF9fIGF0dHJpYnV0ZSBvZiBuZXctc3R5bGUgdHlwZXMgbm8gbG9uZ2VyIGV4aXN0cywgZm9yIGxhY2sKKyAgb2YgbmVlZDogdGhlcmUgaXMgb25jZSBhZ2FpbiBvbmx5IG9uZSBfX2RpY3RfXyAoYWx0aG91Z2ggaW4gdGhlCisgIGZ1dHVyZSBhIF9fY2FjaGVfXyBtYXkgYmUgcmVzdXJyZWN0ZWQgd2l0aCBhIHNpbWlsYXIgZnVuY3Rpb24sIGlmIEkKKyAgY2FuIHByb3ZlIHRoYXQgaXQgYWN0dWFsbHkgc3BlZWRzIHRoaW5ncyB1cCkuCisKKy0gQy5fX2RvY19fIG5vdyB3b3JrcyBhcyBleHBlY3RlZCBmb3IgbmV3LXN0eWxlIGNsYXNzZXMgKGluIDIuMmE0IGl0CisgIGFsd2F5cyByZXR1cm5lZCBOb25lLCBldmVuIHdoZW4gdGhlcmUgd2FzIGEgY2xhc3MgZG9jc3RyaW5nKS4KKworLSBkb2N0ZXN0IG5vdyBmaW5kcyBhbmQgcnVucyBkb2NzdHJpbmdzIGF0dGFjaGVkIHRvIG5ldy1zdHlsZSBjbGFzc2VzLAorICBjbGFzcyBtZXRob2RzLCBzdGF0aWMgbWV0aG9kcywgYW5kIHByb3BlcnRpZXMuCisKK0NvcmUgYW5kIGJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIEEgdmVyeSBzdWJ0bGUgc3ludGFjdGljYWwgcGl0ZmFsbCBpbiBsaXN0IGNvbXByZWhlbnNpb25zIHdhcyBmaXhlZC4KKyAgRm9yIGV4YW1wbGU6IFthK2IgZm9yIGEgaW4gJ2FiYycsIGZvciBiIGluICdkZWYnXS4gIFRoZSBjb21tYSBpbgorICB0aGlzIGV4YW1wbGUgaXMgYSBtaXN0YWtlLiAgUHJldmlvdXNseSwgdGhpcyB3b3VsZCBzaWxlbnRseSBsZXQgJ2EnCisgIGl0ZXJhdGUgb3ZlciB0aGUgc2luZ2xldG9uIHR1cGxlICgnYWJjJywpLCB5aWVsZGluZyBbJ2FiY2QnLCAnYWJjZScsCisgICdhYmNmJ10gcmF0aGVyIHRoYW4gdGhlIGludGVuZGVkIFsnYWQnLCAnYWUnLCAnYWYnLCAnYmQnLCAnYmUnLAorICAnYmYnLCAnY2QnLCAnY2UnLCAnY2YnXS4gIE5vdywgdGhpcyBpcyBmbGFnZ2VkIGFzIGEgc3ludGF4IGVycm9yLgorICBOb3RlIHRoYXQgW2EgZm9yIGEgaW4gPHNpbmdsZXRvbj5dIGlzIGEgY29udm9sdXRlZCB3YXkgdG8gc2F5CisgIFs8c2luZ2xldG9uPl0gYW55d2F5LCBzbyBpdCdzIG5vdCBsaWtlIGFueSBleHByZXNzaXZlbmVzcyBpcyBsb3N0LgorCistIGdldGF0dHIob2JqLCBuYW1lLCBkZWZhdWx0KSBub3cgb25seSBjYXRjaGVzIEF0dHJpYnV0ZUVycm9yLCBhcworICBkb2N1bWVudGVkLCByYXRoZXIgdGhhbiByZXR1cm5pbmcgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGFsbAorICBleGNlcHRpb25zICh3aGljaCBjb3VsZCBtYXNrIGJ1Z3MgaW4gYSBfX2dldGF0dHJfXyBob29rLCBmb3IKKyAgZXhhbXBsZSkuCisKKy0gV2VhayByZWZlcmVuY2Ugb2JqZWN0cyBhcmUgbm93IHBhcnQgb2YgdGhlIGNvcmUgYW5kIG9mZmVyIGEgQyBBUEkuCisgIEEgYnVnIHdoaWNoIGNvdWxkIGFsbG93IGEgY29yZSBkdW1wIHdoZW4gYmluYXJ5IG9wZXJhdGlvbnMgaW52b2x2ZWQKKyAgcHJveHkgcmVmZXJlbmNlIGhhcyBiZWVuIGZpeGVkLiAgd2Vha3JlZi5SZWZlcmVuY2VFcnJvciBpcyBub3cgYQorICBidWlsdC1pbiBleGNlcHRpb24uCisKKy0gdW5pY29kZShvYmopIG5vdyBiZWhhdmVzIG1vcmUgbGlrZSBzdHIob2JqKSwgYWNjZXB0aW5nIGFyYml0cmFyeQorICBvYmplY3RzLCBhbmQgY2FsbGluZyBhIF9fdW5pY29kZV9fIG1ldGhvZCBpZiBpdCBleGlzdHMuCisgIHVuaWNvZGUob2JqLCBlbmNvZGluZykgYW5kIHVuaWNvZGUob2JqLCBlbmNvZGluZywgZXJyb3JzKSBzdGlsbAorICByZXF1aXJlIGFuIDgtYml0IHN0cmluZyBvciBjaGFyYWN0ZXIgYnVmZmVyIGFyZ3VtZW50LgorCistIGlzaW5zdGFuY2UoKSBub3cgYWxsb3dzIGFueSBvYmplY3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCBhCisgIGNsYXNzLCBhIHR5cGUgb3Igc29tZXRoaW5nIHdpdGggYSBfX2Jhc2VzX18gdHVwbGUgYXR0cmlidXRlIGZvciB0aGUKKyAgc2Vjb25kIGFyZ3VtZW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBtYXkgYWxzbyBiZSBhIHR1cGxlIG9mIGEKKyAgY2xhc3MsIHR5cGUsIG9yIHNvbWV0aGluZyB3aXRoIF9fYmFzZXNfXywgaW4gd2hpY2ggY2FzZSBpc2luc3RhbmNlKCkKKyAgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgYW55IG9mIHRoZQorICB0aGluZ3MgY29udGFpbmVkIGluIHRoZSBzZWNvbmQgYXJndW1lbnQgdHVwbGUuICBFLmcuCisKKyAgaXNpbnN0YW5jZSh4LCAoQSwgQikpCisKKyAgcmV0dXJucyB0cnVlIGlmIHggaXMgYW4gaW5zdGFuY2Ugb2YgQSBvciBCLgorCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCgpIG5vdyByZXR1cm5zIHRoZSB0aHJlYWQgSUQgKHByZXZpb3VzbHkgTm9uZSkuCisKKy0gYmluYXNjaWkgaGFzIG5vdyB0d28gcXVvcHJpIHN1cHBvcnQgZnVuY3Rpb25zLCBhMmJfcXAgYW5kIGIyYV9xcC4KKworLSByZWFkbGluZSBub3cgc3VwcG9ydHMgc2V0dGluZyB0aGUgc3RhcnR1cF9ob29rIGFuZCB0aGUKKyAgcHJlX2V2ZW50X2hvb2ssIGFuZCBhZGRzIHRoZSBhZGRfaGlzdG9yeSgpIGZ1bmN0aW9uLgorCistIG9zIGFuZCBwb3NpeCBzdXBwb3J0cyBjaHJvb3QoKSwgc2V0Z3JvdXBzKCkgYW5kIHVuc2V0ZW52KCkgd2hlcmUKKyAgYXZhaWxhYmxlLiAgVGhlIHN0YXQoKSwgZnN0YXQoKSwgc3RhdHZmcygpIGFuZCBmc3RhdHZmcygpIGZ1bmN0aW9ucworICBub3cgcmV0dXJuICJwc2V1ZG8tc2VxdWVuY2VzIiAtLSB0aGUgdmFyaW91cyBmaWVsZHMgY2FuIG5vdyBiZQorICBhY2Nlc3NlZCBhcyBhdHRyaWJ1dGVzIChlLmcuIG9zLnN0YXQoIi8iKS5zdF9tdGltZSkgYnV0IGZvcgorICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB0aGV5IGFsc28gYmVoYXZlIGFzIGEgZml4ZWQtbGVuZ3RoIHNlcXVlbmNlLgorICBTb21lIHBsYXRmb3JtLXNwZWNpZmljIGZpZWxkcyAoZS5nLiBzdF9yZGV2KSBhcmUgb25seSBhY2Nlc3NpYmxlIGFzCisgIGF0dHJpYnV0ZXMuCisKKy0gdGltZTogbG9jYWx0aW1lKCksIGdtdGltZSgpIGFuZCBzdHJwdGltZSgpIG5vdyByZXR1cm4gYQorICBwc2V1ZG8tc2VxdWVuY2Ugc2ltaWxhciB0byB0aGUgb3Muc3RhdCgpIHJldHVybiB2YWx1ZSwgd2l0aAorICBhdHRyaWJ1dGVzIGxpa2UgdG1feWVhciBldGMuCisKKy0gRGVjb21wcmVzc2lvbiBvYmplY3RzIGluIHRoZSB6bGliIG1vZHVsZSBub3cgYWNjZXB0IGFuIG9wdGlvbmFsCisgIHNlY29uZCBwYXJhbWV0ZXIgdG8gZGVjb21wcmVzcygpIHRoYXQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudAorICBvZiBtZW1vcnkgdG8gdXNlIGZvciB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCisKKy0gb3B0aW9uYWwgU1NMIHN1cHBvcnQgaW4gdGhlIHNvY2tldCBtb2R1bGUgbm93IGV4cG9ydHMgT3BlblNTTAorICBmdW5jdGlvbnMgUkFORF9hZGQoKSwgUkFORF9lZ2QoKSwgYW5kIFJBTkRfc3RhdHVzKCkuICBUaGVzZSBjYWxscworICBhcmUgdXNlZnVsIG9uIHBsYXRmb3JtcyBsaWtlIFNvbGFyaXMgd2hlcmUgT3BlblNTTCBkb2VzIG5vdAorICBhdXRvbWF0aWNhbGx5IHNlZWQgaXRzIFBSTkcuICBBbHNvLCB0aGUga2V5ZmlsZSBhbmQgY2VydGZpbGUKKyAgYXJndW1lbnRzIHRvIHNvY2tldC5zc2woKSBhcmUgbm93IG9wdGlvbmFsLgorCistIHBvc2l4bW9kdWxlIChhbmQgYnkgZXh0ZW5zaW9uLCB0aGUgb3MgbW9kdWxlIG9uIFBPU0lYIHBsYXRmb3Jtcykgbm93CisgIGV4cG9ydHMgT19MQVJHRUZJTEUsIE9fRElSRUNULCBPX0RJUkVDVE9SWSwgYW5kIE9fTk9GT0xMT1cuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBkb2N0ZXN0IG5vdyBleGNsdWRlcyBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgbm90IGRlZmluZWQgYnkgdGhlIG1vZHVsZQorICBiZWluZyB0ZXN0ZWQsIHRoYW5rcyB0byBUaW0gSG9jaGJlcmcuCisKKy0gSG90U2hvdCwgYSBuZXcgcHJvZmlsZXIgaW1wbGVtZW50ZWQgdXNpbmcgYSBDLWJhc2VkIGNhbGxiYWNrLCBoYXMKKyAgYmVlbiBhZGRlZC4gIFRoaXMgc3Vic3RhbnRpYWxseSByZWR1Y2VzIHRoZSBvdmVyaGVhZCBvZiBwcm9maWxpbmcsCisgIGJ1dCBpdCBpcyBzdGlsbCBxdWl0ZSBwcmVsaW1pbmFyeS4gIFN1cHBvcnQgbW9kdWxlcyBhbmQKKyAgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGFkZGVkIGluIHVwY29taW5nIHJlbGVhc2VzIChiZWZvcmUgMi4yIGZpbmFsKS4KKworLSBwcm9maWxlIG5vdyBwcm9kdWNlcyBjb3JyZWN0IG91dHB1dCBpbiBzaXR1YXRpb25zIHdoZXJlIGFuIGV4Y2VwdGlvbgorICByYWlzZWQgaW4gUHl0aG9uIGlzIGNsZWFyZWQgYnkgQyBjb2RlIChlLmcuIGhhc2F0dHIoKSkuICBUaGlzIHVzZWQKKyAgdG8gY2F1c2Ugd3Jvbmcgb3V0cHV0LCBpbmNsdWRpbmcgc3B1cmlvdXMgY2xhaW1zIG9mIHJlY3Vyc2l2ZQorICBmdW5jdGlvbnMgYW5kIGF0dHJpYnV0aW9uIG9mIHRpbWUgc3BlbnQgdG8gdGhlIHdyb25nIGZ1bmN0aW9uLgorCisgIFRoZSBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgZGVyaXZlZCBPbGRQcm9maWxlIGFuZCBIb3RQcm9maWxlCisgIHByb2ZpbGluZyBjbGFzc2VzIHdhcyByZW1vdmVkLiAgVGhlIGNvZGUgaGFzbid0IHdvcmtlZCBmb3IgeWVhcnMgKGlmCisgIHlvdSB0cmllZCB0byB1c2UgdGhlbSwgdGhleSByYWlzZWQgZXhjZXB0aW9ucykuICBPbGRQcm9maWxlCisgIGludGVuZGVkIHRvIHJlcHJvZHVjZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHByb2ZpbGVyIFB5dGhvbiB1c2VkIG1vcmUKKyAgdGhhbiA3IHllYXJzIGFnbywgYW5kIGlzbid0IGludGVyZXN0aW5nIGFueW1vcmUuICBIb3RQcm9maWxlIGludGVuZGVkCisgIHRvIHByb3ZpZGUgYSBmYXN0ZXIgcHJvZmlsZXIgKGJ1dCBwcm9kdWNpbmcgbGVzcyBpbmZvcm1hdGlvbiksIGFuZAorICB0aGF0J3MgYSB3b3J0aHkgZ29hbCB3ZSBpbnRlbmQgdG8gbWVldCB2aWEgYSBkaWZmZXJlbnQgYXBwcm9hY2ggKGJ1dAorICB3aXRob3V0IGxvc2luZyBpbmZvcm1hdGlvbikuCisKKy0gUHJvZmlsZS5jYWxpYnJhdGUoKSBoYXMgYSBuZXcgaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGQgZGVsaXZlcgorICBhIG11Y2ggYmV0dGVyIHN5c3RlbS1zcGVjaWZpYyBjYWxpYnJhdGlvbiBjb25zdGFudC4gIFRoZSBjb25zdGFudCBjYW4KKyAgbm93IGJlIHNwZWNpZmllZCBpbiBhbiBpbnN0YW5jZSBjb25zdHJ1Y3Rvciwgb3IgYXMgYSBQcm9maWxlIGNsYXNzIG9yCisgIGluc3RhbmNlIHZhcmlhYmxlLCBpbnN0ZWFkIG9mIGJ5IGVkaXRpbmcgcHJvZmlsZS5weSdzIHNvdXJjZSBjb2RlLgorICBDYWxpYnJhdGlvbiBtdXN0IHN0aWxsIGJlIGRvbmUgbWFudWFsbHkgKHNlZSB0aGUgZG9jcyBmb3IgdGhlIHByb2ZpbGUKKyAgbW9kdWxlKS4KKworICBOb3RlIHRoYXQgUHJvZmlsZS5jYWxpYnJhdGUoKSBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgSW1wcm92aW5nIHRoZSBhY2N1cmFjeSByZXF1aXJlZCBleHBsb2l0aW5nIGRldGFpbGVkIGtub3dsZWRnZSBvZgorICBwcm9maWxlciBpbnRlcm5hbHM7IHRoZSBlYXJsaWVyIG1ldGhvZCBhYnN0cmFjdGVkIGF3YXkgdGhlIGRldGFpbHMKKyAgYW5kIG1lYXN1cmVkIGEgc2ltcGxpZmllZCBtb2RlbCBpbnN0ZWFkLCBidXQgY29uc2VxdWVudGx5IGNvbXB1dGVkCisgIGEgY29uc3RhbnQgdG9vIHNtYWxsIGJ5IGEgZmFjdG9yIG9mIDIgb24gc29tZSBtb2Rlcm4gbWFjaGluZXMuCisKKy0gcXVvcHJpJ3MgZW5jb2RlIGFuZCBkZWNvZGUgbWV0aG9kcyB0YWtlIGFuIG9wdGlvbmFsIGhlYWRlciBwYXJhbWV0ZXIsCisgIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIG91dHB1dCBpcyBpbnRlbmRlZCBmb3IgdGhlIGhlYWRlciAnUScKKyAgZW5jb2RpbmcuCisKKy0gVGhlIFNvY2tldFNlcnZlci5UaHJlYWRpbmdNaXhJbiBjbGFzcyBub3cgY2xvc2VzIHRoZSByZXF1ZXN0IGFmdGVyCisgIGZpbmlzaF9yZXF1ZXN0KCkgcmV0dXJucy4gIChOb3Qgd2hlbiBpdCBlcnJvcnMgb3V0IHRob3VnaC4pCisKKy0gVGhlIG5udHBsaWIgbW9kdWxlJ3MgTk5UUC5ib2R5KCkgbWV0aG9kIGhhcyBncm93biBhICdmaWxlJyBhcmd1bWVudAorICB0byBhbGxvdyBzYXZpbmcgdGhlIG1lc3NhZ2UgYm9keSB0byBhIGZpbGUuCisKKy0gVGhlIGVtYWlsIHBhY2thZ2UgaGFzIGFkZGVkIGEgY2xhc3MgZW1haWwuUGFyc2VyLkhlYWRlclBhcnNlciB3aGljaAorICBvbmx5IHBhcnNlcyBoZWFkZXJzIGFuZCBkb2VzIG5vdCByZWN1cnNlIGludG8gdGhlIG1lc3NhZ2UncyBib2R5LgorICBBbHNvLCB0aGUgbW9kdWxlL2NsYXNzIE1JTUVBdWRpbyBoYXMgYmVlbiBhZGRlZCBmb3IgcmVwcmVzZW50aW5nCisgIGF1ZGlvIGRhdGEgKGNvbnRyaWJ1dGVkIGJ5IEFudGhvbnkgQmF4dGVyKS4KKworLSBmdHBsaWIgc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGZpbGVzID4gMkdCLgorCistIENvbmZpZ1BhcnNlci5nZXRib29sZWFuKCkgbm93IGFsc28gaW50ZXJwcmV0cyBUUlVFLCBGQUxTRSwgWUVTLCBOTywKKyAgT04sIGFuZCBPRkYuCisKKy0geG1sLmRvbS5taW5pZG9tIE5vZGVMaXN0IG9iamVjdHMgbm93IHN1cHBvcnQgdGhlIGxlbmd0aCBhdHRyaWJ1dGUKKyAgYW5kIGl0ZW0oKSBtZXRob2QgYXMgcmVxdWlyZWQgYnkgdGhlIERPTSBzcGVjaWZpY2F0aW9ucy4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gRGVtby9kbnMgd2FzIHJlbW92ZWQuICBJdCBubyBsb25nZXIgc2VydmVzIGFueSBwdXJwb3NlOyBhIHBhY2thZ2UKKyAgZGVyaXZlZCBmcm9tIGl0IGlzIG5vdyBtYWludGFpbmVkIGJ5IEFudGhvbnkgQmF4dGVyLCBzZWUKKyAgaHR0cDovL1B5RE5TLlNvdXJjZUZvcmdlLm5ldC4KKworLSBUaGUgZnJlZXplIHRvb2wgaGFzIGJlZW4gbWFkZSBtb3JlIHJvYnVzdCwgYW5kIHR3byBuZXcgb3B0aW9ucyBoYXZlCisgIGJlZW4gYWRkZWQ6IC1YIGFuZCAtRS4KKworQnVpbGQKKy0tLS0tCisKKy0gY29uZmlndXJlIHdpbGwgdXNlIENYWCBpbiBMSU5LQ0MgaWYgQ1hYIGlzIHVzZWQgdG8gYnVpbGQgbWFpbigpIGFuZAorICB0aGUgc3lzdGVtIHJlcXVpcmVzIHRvIGxpbmsgYSBDKysgbWFpbiB1c2luZyB0aGUgQysrIGNvbXBpbGVyLgorCitDIEFQSQorLS0tLS0KKworLSBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHRwX2NvbXBhcmUgc2xvdCBpcyB1cGRhdGVkIHRvIHJlcXVpcmUgdGhhdAorICB0aGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgLTEsIDAsIDE7IGFuIGFyYml0cmFyeSBudW1iZXIgPDAgb3IgPjAgaXMKKyAgbm90IGNvcnJlY3QuICBUaGlzIGlzIG5vdCB5ZXQgZW5mb3JjZWQgYnV0IHdpbGwgYmUgZW5mb3JjZWQgaW4KKyAgUHl0aG9uIDIuMzsgZXZlbiBsYXRlciwgd2UgbWF5IHVzZSAtMiB0byBpbmRpY2F0ZSBlcnJvcnMgYW5kICsyIGZvcgorICAiTm90SW1wbGVtZW50ZWQiLiAgUmlnaHQgbm93LCAtMSBzaG91bGQgYmUgdXNlZCBmb3IgYW4gZXJyb3IgcmV0dXJuLgorCistIFB5TG9uZ19Bc0xvbmdMb25nKCkgbm93IGFjY2VwdHMgaW50IChhcyB3ZWxsIGFzIGxvbmcpIGFyZ3VtZW50cy4KKyAgQ29uc2VxdWVudGx5LCBQeUFyZ19QYXJzZVR1cGxlJ3MgJ0wnIGNvZGUgYWxzbyBhY2NlcHRzIGludCAoYXMgd2VsbAorICBhcyBsb25nKSBhcmd1bWVudHMuCisKKy0gUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCgpIG5vdyByZXR1cm5zIGEgbG9uZyBpbnQgZ2l2aW5nIHRoZSB0aHJlYWQKKyAgSUQsIGlmIG9uZSBjYW4gYmUgY2FsY3VsYXRlZDsgaXQgcmV0dXJucyAtMSBmb3IgZXJyb3IsIDAgaWYgbm8KKyAgdGhyZWFkIElEIGlzIGNhbGN1bGF0ZWQgKHRoaXMgaXMgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSwgYnV0IG9ubHkKKyAgdGhlIHRocmVhZCBtb2R1bGUgdXNlZCB0aGlzIEFQSSkuICBUaGlzIGNvZGUgaGFzIG9ubHkgcmVhbGx5IGJlZW4KKyAgdGVzdGVkIG9uIExpbnV4IGFuZCBXaW5kb3dzOyBvdGhlciBwbGF0Zm9ybXMgcGxlYXNlIGJld2FyZSAoYW5kCisgIHJlcG9ydCBhbnkgYnVncyBvciBzdHJhbmdlIGJlaGF2aW9yKS4KKworLSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoKSBubyBsb25nZXIgYWNjZXB0cyBVbmljb2RlIG9iamVjdHMgYXMKKyAgaW5wdXQuCisKK05ldyBwbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0KKworVGVzdHMKKy0tLS0tCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBJbnN0YWxsZXI6ICBJZiB5b3UgaW5zdGFsbCBJRExFLCBhbmQgZG9uJ3QgZGlzYWJsZSBmaWxlLWV4dGVuc2lvbgorICByZWdpc3RyYXRpb24sIGEgbmV3ICJFZGl0IHdpdGggSURMRSIgY29udGV4dCAocmlnaHQtY2xpY2spIG1lbnUgZW50cnkKKyAgaXMgY3JlYXRlZCBmb3IgLnB5IGFuZCAucHl3IGZpbGVzLgorCistIFRoZSBzaWduYWwgbW9kdWxlIG5vdyBzdXBwb3J0cyBTSUdCUkVBSyBvbiBXaW5kb3dzLCB0aGFua3MgdG8gU3RldmVuCisgIFNjb3R0LiAgTm90ZSB0aGF0IFNJR0JSRUFLIGlzIHVuaXF1ZSB0byBXaW5kb3dzLiAgVGhlIGRlZmF1bHQgU0lHQlJFQUsKKyAgYWN0aW9uIHJlbWFpbnMgdG8gY2FsbCBXaW4zMiBFeGl0UHJvY2VzcygpLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCB2aWEKKyAgc2lnbmFsLnNpZ25hbCgpLiAgRm9yIGV4YW1wbGU6OgorCisgICAgICAjIE1ha2UgQ3RybCtCcmVhayByYWlzZSBLZXlib2FyZEludGVycnVwdCwgbGlrZSBQeXRob24ncyBkZWZhdWx0IEN0cmwrQworICAgICAgIyAoU0lHSU5UKSBiZWhhdmlvci4KKyAgICAgIGltcG9ydCBzaWduYWwKKyAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0JSRUFLLCBzaWduYWwuZGVmYXVsdF9pbnRfaGFuZGxlcikKKworICAgICAgdHJ5OgorICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgIHBhc3MKKyAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAjIFdlIGdldCBoZXJlIG9uIEN0cmwrQyBvciBDdHJsK0JyZWFrIG5vdzsgaWYgd2UgaGFkIG5vdCBjaGFuZ2VkCisgICAgICAgICAgIyBTSUdCUkVBSywgb25seSBvbiBDdHJsK0MgKGFuZCBDdHJsK0JyZWFrIHdvdWxkIHRlcm1pbmF0ZSB0aGUKKyAgICAgICAgICAjIHByb2dyYW0gd2l0aG91dCB0aGUgcG9zc2liaWxpdHkgZm9yIGFueSBQeXRob24tbGV2ZWwgY2xlYW51cCkuCisgICAgICAgICAgcHJpbnQgIkNsZWFuIGV4aXQiCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTQ/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjgtU2VwLTIwMDEqCisKK1R5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIHB5ZG9jIGFuZCBpbnNwZWN0IGFyZSBub3cgYXdhcmUgb2YgbmV3LXN0eWxlIGNsYXNzZXM7CisgIGUuZy4gaGVscChsaXN0KSBhdCB0aGUgaW50ZXJhY3RpdmUgcHJvbXB0IG5vdyBzaG93cyBwcm9wZXIKKyAgZG9jdW1lbnRhdGlvbiBmb3IgYWxsIG9wZXJhdGlvbnMgb24gbGlzdCBvYmplY3RzLgorCistIEFwcGxpY2F0aW9ucyB1c2luZyBKaW0gRnVsdG9uJ3MgRXh0ZW5zaW9uQ2xhc3MgbW9kdWxlIGNhbiBub3cgc2FmZWx5CisgIGJlIHVzZWQgd2l0aCBQeXRob24gMi4yLiAgSW4gcGFydGljdWxhciwgWm9wZSAyLjQuMSBub3cgd29ya3Mgd2l0aAorICBQeXRob24gMi4yIChhcyB3ZWxsIGFzIHdpdGggUHl0aG9uIDIuMS4xKS4gIFRoZSBEZW1vL21ldGFjbGFzcworICBleGFtcGxlcyBhbHNvIHdvcmsgYWdhaW4uICBJdCBpcyBob3BlZCB0aGF0IEd0ayBhbmQgQm9vc3QgYWxzbyB3b3JrCisgIHdpdGggMi4yYTQgYW5kIGJleW9uZC4gIChJZiB5b3UgY2FuIGNvbmZpcm0gdGhpcywgcGxlYXNlIHdyaXRlCisgIHdlYm1hc3RlckBweXRob24ub3JnOyBpZiB0aGVyZSBhcmUgc3RpbGwgcHJvYmxlbXMsIHBsZWFzZSBvcGVuIGEgYnVnCisgIHJlcG9ydCBvbiBTb3VyY2VGb3JnZS4pCisKKy0gcHJvcGVydHkoKSBub3cgdGFrZXMgNCBrZXl3b3JkIGFyZ3VtZW50czogIGZnZXQsIGZzZXQsIGZkZWwgYW5kIGRvYy4KKyAgVGhlc2UgbWFwIHRvIHJlYWQtb25seSBhdHRyaWJ1dGVzICdmZ2V0JywgJ2ZzZXQnLCAnZmRlbCcsIGFuZCAnX19kb2NfXycKKyAgaW4gdGhlIGNvbnN0cnVjdGVkIHByb3BlcnR5IG9iamVjdC4gIGZnZXQsIGZzZXQgYW5kIGZkZWwgd2VyZW4ndAorICBkaXNjb3ZlcmFibGUgZnJvbSBQeXRob24gaW4gMi4yYTMuICBfX2RvY19fIGlzIG5ldywgYW5kIGFsbG93cyB0bworICBhc3NvY2lhdGUgYSBkb2NzdHJpbmcgd2l0aCBhIHByb3BlcnR5LgorCistIENvbXBhcmlzb24gb3ZlcmxvYWRpbmcgaXMgbm93IG1vcmUgY29tcGxldGVseSBpbXBsZW1lbnRlZC4gIEZvcgorICBleGFtcGxlLCBhIHN0ciBzdWJjbGFzcyBpbnN0YW5jZSBjYW4gcHJvcGVybHkgYmUgY29tcGFyZWQgdG8gYSBzdHIKKyAgaW5zdGFuY2UsIGFuZCBpdCBjYW4gcHJvcGVybHkgb3ZlcmxvYWQgY29tcGFyaXNvbi4gIERpdHRvIGZvciBtb3N0CisgIG90aGVyIGJ1aWx0LWluIG9iamVjdCB0eXBlcy4KKworLSBUaGUgcmVwcigpIG9mIG5ldy1zdHlsZSBjbGFzc2VzIGhhcyBjaGFuZ2VkOyBpbnN0ZWFkIG9mIDx0eXBlCisgICdNLkZvbyc+IGEgbmV3LXN0eWxlIGNsYXNzIGlzIG5vdyByZW5kZXJlZCBhcyA8Y2xhc3MgJ00uRm9vJz4sCisgICpleGNlcHQqIGZvciBidWlsdC1pbiB0eXBlcywgd2hpY2ggYXJlIHN0aWxsIHJlbmRlcmVkIGFzIDx0eXBlCisgICdGb28nPiAodG8gYXZvaWQgdXBzZXR0aW5nIGV4aXN0aW5nIGNvZGUgdGhhdCBtaWdodCBwYXJzZSBvcgorICBvdGhlcndpc2UgcmVseSBvbiByZXByKCkgb2YgY2VydGFpbiB0eXBlIG9iamVjdHMpLgorCistIFRoZSByZXByKCkgb2YgbmV3LXN0eWxlIG9iamVjdHMgaXMgbm93IGFsd2F5cyA8Rm9vIG9iamVjdCBhdCBYWFg+OworICBwcmV2aW91c2x5LCBpdCB3YXMgc29tZXRpbWVzIDxGb28gaW5zdGFuY2UgYXQgWFhYPi4KKworLSBGb3IgbmV3LXN0eWxlIGNsYXNzZXMsIHdoYXQgd2FzIHByZXZpb3VzbHkgY2FsbGVkIF9fZ2V0YXR0cl9fIGlzIG5vdworICBjYWxsZWQgX19nZXRhdHRyaWJ1dGVfXy4gIFRoaXMgbWV0aG9kLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgZm9yCisgICpldmVyeSogYXR0cmlidXRlIGFjY2Vzcy4gIEEgbmV3IF9fZ2V0YXR0cl9fIGhvb2sgbW9yZSBzaW1pbGFyIHRvIHRoZQorICBvbmUgaW4gY2xhc3NpYyBjbGFzc2VzIGlzIGRlZmluZWQgd2hpY2ggaXMgY2FsbGVkIG9ubHkgaWYgcmVndWxhcgorICBhdHRyaWJ1dGUgYWNjZXNzIHJhaXNlcyBBdHRyaWJ1dGVFcnJvcjsgdG8gY2F0Y2ggKmFsbCogYXR0cmlidXRlCisgIGFjY2VzcywgeW91IGNhbiB1c2UgX19nZXRhdHRyaWJ1dGVfXyAoZm9yIG5ldy1zdHlsZSBjbGFzc2VzKS4gIElmCisgIGJvdGggYXJlIGRlZmluZWQsIF9fZ2V0YXR0cmlidXRlX18gaXMgY2FsbGVkIGZpcnN0LCBhbmQgaWYgaXQgcmFpc2VzCisgIEF0dHJpYnV0ZUVycm9yLCBfX2dldGF0dHJfXyBpcyBjYWxsZWQuCisKKy0gVGhlIF9fY2xhc3NfXyBhdHRyaWJ1dGUgb2YgbmV3LXN0eWxlIG9iamVjdHMgY2FuIGJlIGFzc2lnbmVkIHRvLgorICBUaGUgbmV3IGNsYXNzIG11c3QgaGF2ZSB0aGUgc2FtZSBDLWxldmVsIG9iamVjdCBsYXlvdXQgYXMgdGhlIG9sZAorICBjbGFzcy4KKworLSBUaGUgYnVpbHRpbiBmaWxlIHR5cGUgY2FuIGJlIHN1YmNsYXNzZWQgbm93LiAgSW4gdGhlIHVzdWFsIHBhdHRlcm4sCisgICJmaWxlIiBpcyB0aGUgbmFtZSBvZiB0aGUgYnVpbHRpbiB0eXBlLCBhbmQgZmlsZSgpIGlzIGEgbmV3IGJ1aWx0aW4KKyAgY29uc3RydWN0b3IsIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoZSBidWlsdGluIG9wZW4oKSBmdW5jdGlvbi4KKyAgZmlsZSgpIGlzIG5vdyB0aGUgcHJlZmVycmVkIHdheSB0byBvcGVuIGEgZmlsZS4KKworLSBQcmV2aW91c2x5LCBfX25ld19fIHdvdWxkIG9ubHkgc2VlIHNlcXVlbnRpYWwgYXJndW1lbnRzIHBhc3NlZCB0bworICB0aGUgdHlwZSBpbiBhIGNvbnN0cnVjdG9yIGNhbGw7IF9faW5pdF9fIHdvdWxkIHNlZSBib3RoIHNlcXVlbnRpYWwKKyAgYW5kIGtleXdvcmQgYXJndW1lbnRzLiAgVGhpcyBtYWRlIG5vIHNlbnNlIHdoYXRzb2V2ZXIgYW55IG1vcmUsIHNvCisgIG5vdyBib3RoIF9fbmV3X18gYW5kIF9faW5pdF9fIHNlZSBhbGwgYXJndW1lbnRzLgorCistIFByZXZpb3VzbHksIGhhc2goKSBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2Ygc3RyIG9yCisgIHVuaWNvZGUgYWx3YXlzIHJldHVybmVkIDAuICBUaGlzIGhhcyBiZWVuIHJlcGFpcmVkLgorCistIFByZXZpb3VzbHksIGFuIG9wZXJhdGlvbiBvbiBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIGFuCisgIGltbXV0YWJsZSB0eXBlIChpbnQsIGxvbmcsIGZsb2F0LCBjb21wbGV4LCB0dXBsZSwgc3RyLCB1bmljb2RlKSwKKyAgd2hlcmUgdGhlIHN1YnR5cGUgZGlkbid0IG92ZXJyaWRlIHRoZSBvcGVyYXRpb24gKGFuZCBzbyB0aGUKKyAgb3BlcmF0aW9uIHdhcyBoYW5kbGVkIGJ5IHRoZSBidWlsdGluIHR5cGUpLCBjb3VsZCByZXR1cm4gdGhhdAorICBpbnN0YW5jZSBpbnN0ZWFkIGEgdmFsdWUgb2YgdGhlIGJhc2UgdHlwZS4gIEZvciBleGFtcGxlLCBpZiBzIHdhcyBvZgorICBhIHN0ciBzdWJjbGFzcyB0eXBlLCBzWzpdIHJldHVybmVkIHMgYXMtaXMuICBOb3cgaXQgcmV0dXJucyBhIHN0cgorICB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHMuCisKKy0gUHJvdmlzaW9uYWwgc3VwcG9ydCBmb3IgcGlja2xpbmcgbmV3LXN0eWxlIG9iamVjdHMgaGFzIGJlZW4gYWRkZWQuCisKK0NvcmUKKy0tLS0KKworLSBmaWxlLndyaXRlbGluZXMoKSBub3cgYWNjZXB0cyBhbnkgaXRlcmFibGUgb2JqZWN0IHByb2R1Y2luZyBzdHJpbmdzLgorCistIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCgpIG5vdyB3b3JrcyB2ZXJ5IG11Y2ggbGlrZQorICBQeU9iamVjdF9TdHIob2JqKSBpbiB0aGF0IGl0IHRyaWVzIHRvIHVzZSBfX3N0cl9fL3RwX3N0cgorICBvbiB0aGUgb2JqZWN0IGlmIHRoZSBvYmplY3QgaXMgbm90IGEgc3RyaW5nIG9yIGJ1ZmZlci4gVGhpcworICBtYWtlcyB1bmljb2RlKCkgYmVoYXZlIGxpa2Ugc3RyKCkgd2hlbiBhcHBsaWVkIHRvIG5vbi1zdHJpbmcvYnVmZmVyCisgIG9iamVjdHMuCisKKy0gUHlGaWxlX1dyaXRlT2JqZWN0IG5vdyBwYXNzZXMgVW5pY29kZSBvYmplY3RzIHRvIHRoZSBmaWxlJ3Mgd3JpdGUKKyAgbWV0aG9kLiBBcyBhIHJlc3VsdCwgYWxsIGZpbGUtbGlrZSBvYmplY3RzIHdoaWNoIG1heSBiZSB0aGUgdGFyZ2V0CisgIG9mIGEgcHJpbnQgc3RhdGVtZW50IG11c3Qgc3VwcG9ydCBVbmljb2RlIG9iamVjdHMsIGkuZS4gdGhleSBtdXN0CisgIGF0IGxlYXN0IGNvbnZlcnQgdGhlbSBpbnRvIEFTQ0lJIHN0cmluZ3MuCisKKy0gVGhyZWFkIHNjaGVkdWxpbmcgb24gU29sYXJpcyBzaG91bGQgYmUgaW1wcm92ZWQ7IGl0IGlzIG5vIGxvbmdlcgorICBuZWNlc3NhcnkgdG8gaW5zZXJ0IGEgc21hbGwgc2xlZXAgYXQgdGhlIHN0YXJ0IG9mIGEgdGhyZWFkIGluIG9yZGVyCisgIHRvIGxldCBvdGhlciBydW5uYWJsZSB0aHJlYWRzIGJlIHNjaGVkdWxlZC4KKworTGlicmFyeQorLS0tLS0tLQorCistIFN0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBhbmQgY1N0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBzdXBwb3J0CisgIHJlYWQgY2hhcmFjdGVyIGJ1ZmZlciBjb21wYXRpYmxlIG9iamVjdHMgZm9yIHRoZWlyIC53cml0ZSgpIG1ldGhvZHMuCisgIFRoZXNlIG9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzIGFuZCB0aGVuIGhhbmRsZWQgYXMgc3VjaAorICBieSB0aGUgaW5zdGFuY2VzLgorCistIFRoZSAiZW1haWwiIHBhY2thZ2UgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGlzIGJhc2ljYWxseSBhIHBvcnQgb2YgdGhlCisgIG1pbWVsaWIgcGFja2FnZSA8aHR0cDovL3NmLm5ldC9wcm9qZWN0cy9taW1lbGliPiB3aXRoIEFQSSBjaGFuZ2VzCisgIGFuZCBzb21lIGltcGxlbWVudGF0aW9ucyB1cGRhdGVkIHRvIHVzZSBpdGVyYXRvcnMgYW5kIGdlbmVyYXRvcnMuCisKKy0gZGlmZmxpYi5uZGlmZigpIGFuZCBkaWZmbGliLkRpZmZlci5jb21wYXJlKCkgYXJlIGdlbmVyYXRvcnMgbm93LiAgVGhpcworICByZXN0b3JlcyB0aGUgYWJpbGl0eSBvZiBUb29scy9zY3JpcHRzL25kaWZmLnB5IHRvIHN0YXJ0IHByb2R1Y2luZyBvdXRwdXQKKyAgYmVmb3JlIHRoZSBlbnRpcmUgY29tcGFyaXNvbiBpcyBjb21wbGV0ZS4KKworLSBTdHJpbmdJTy5TdHJpbmdJTyBpbnN0YW5jZXMgYW5kIGNTdHJpbmdJTy5TdHJpbmdJTyBpbnN0YW5jZXMgc3VwcG9ydAorICBpdGVyYXRpb24ganVzdCBsaWtlIGZpbGUgb2JqZWN0cyAoaS5lLiB0aGVpciAucmVhZGxpbmUoKSBtZXRob2QgaXMKKyAgY2FsbGVkIGZvciBlYWNoIGl0ZXJhdGlvbiB1bnRpbCBpdCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZykuCisKKy0gVGhlIGNvZGVjcyBtb2R1bGUgaGFzIGdyb3duIGZvdXIgbmV3IGhlbHBlciBBUElzIHRvIGFjY2VzcworICBidWlsdGluIGNvZGVjczogZ2V0ZW5jb2RlcigpLCBnZXRkZWNvZGVyKCksIGdldHJlYWRlcigpLAorICBnZXR3cml0ZXIoKS4KKworLSBTaW1wbGVYTUxSUENTZXJ2ZXI6IGEgbmV3IG1vZHVsZSAoYmFzZWQgdXBvbiBTaW1wbGVIVE1MU2VydmVyKQorICBzaW1wbGlmaWVzIHdyaXRpbmcgWE1MIFJQQyBzZXJ2ZXJzLgorCistIG9zLnBhdGgucmVhbHBhdGgoKTogYSBuZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRobmFtZQorICBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBzeW1ib2xpYyBsaW5rcy4gIE9uIG5vbi1Vbml4IHN5c3RlbXMsIHRoaXMKKyAgaXMgYW4gYWxpYXMgZm9yIG9zLnBhdGguYWJzcGF0aCgpLgorCistIG9wZXJhdG9yLmluZGV4T2YoKSAoUHlTZXF1ZW5jZV9JbmRleCgpIGluIHRoZSBDIEFQSSkgbm93IHdvcmtzIHdpdGggYW55CisgIGl0ZXJhYmxlIG9iamVjdC4KKworLSBzbXRwbGliIG5vdyBzdXBwb3J0cyB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIGFuZCBzZWN1cml0eSBmZWF0dXJlcyBvZgorICB0aGUgU01UUCBwcm90b2NvbCB0aHJvdWdoIHRoZSBuZXcgbG9naW4oKSBhbmQgc3RhcnR0bHMoKSBtZXRob2RzLgorCistIGhtYWM6IGEgbmV3IG1vZHVsZSBpbXBsZW1lbnRpbmcga2V5ZWQgaGFzaGluZyBmb3IgbWVzc2FnZQorICBhdXRoZW50aWNhdGlvbi4KKworLSBtaW1ldHlwZXMgbm93IHJlY29nbml6ZXMgbW9yZSBleHRlbnNpb25zIGFuZCBmaWxlIHR5cGVzLiAgQXQgdGhlCisgIHNhbWUgdGltZSwgc29tZSBtYXBwaW5ncyBub3Qgc2FuY3Rpb25lZCBieSBJQU5BIHdlcmUgcmVtb3ZlZC4KKworLSBUaGUgImNvbXBpbGVyIiBwYWNrYWdlIGhhcyBiZWVuIGJyb3VnaHQgdXAgdG8gZGF0ZSB0byB0aGUgc3RhdGUgb2YKKyAgUHl0aG9uIDIuMiBieXRlY29kZSBnZW5lcmF0aW9uLiAgSXQgaGFzIGFsc28gYmVlbiBwcm9tb3RlZCBmcm9tIGEKKyAgVG9vbCB0byBhIHN0YW5kYXJkIGxpYnJhcnkgcGFja2FnZS4gIChUb29scy9jb21waWxlciBzdGlsbCBleGlzdHMgYXMKKyAgYSBzYW1wbGUgZHJpdmVyLikKKworQnVpbGQKKy0tLS0tCisKKy0gTGFyZ2UgZmlsZSBzdXBwb3J0IChMRlMpIGlzIG5vdyBhdXRvbWF0aWMgd2hlbiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMKKyAgaXQ7IG5vIG1vcmUgbWFudWFsIGNvbmZpZ3VyYXRpb24gdHdlYWtzIGFyZSBuZWVkZWQuICBPbiBMaW51eCwgYXQKKyAgbGVhc3QsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBhIHN5c3RlbSB3aG9zZSBDIGxpYnJhcnkgc3VwcG9ydHMgbGFyZ2UKKyAgZmlsZXMgYnV0IHdob3NlIGtlcm5lbCBkb2Vzbid0OyBpbiB0aGlzIGNhc2UsIGxhcmdlIGZpbGUgc3VwcG9ydCBpcworICBzdGlsbCBlbmFibGVkIGJ1dCBkb2Vzbid0IGRvIHlvdSBhbnkgZ29vZCB1bmxlc3MgeW91IHVwZ3JhZGUgeW91cgorICBrZXJuZWwgb3Igc2hhcmUgeW91ciBQeXRob24gZXhlY3V0YWJsZSB3aXRoIGFub3RoZXIgc3lzdGVtIHdob3NlCisgIGtlcm5lbCBoYXMgbGFyZ2UgZmlsZSBzdXBwb3J0LgorCistIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBzdXBwbGllcyBwbGF1c2libGUgZGVmYXVsdHMgaW4gYQorICBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudC4gIFRoaXMgZG9lc24ndCBtZWFuIHRoYXQgdGhlIHN1cHBsaWVkCisgIHZhbHVlcyBhcmUgYWx3YXlzIGNvcnJlY3QsIG9yIHRoYXQgY3Jvc3MtY29tcGlsYXRpb24gbm93IHdvcmtzCisgIGZsYXdsZXNzbHkgLS0gYnV0IGl0J3MgYSBmaXJzdCBzdGVwIChhbmQgaXQgc2h1dHMgdXAgbW9zdCBvZgorICBhdXRvY29uZidzIHdhcm5pbmdzIGFib3V0IEFDX1RSWV9SVU4pLgorCistIFRoZSBVbml4IGJ1aWxkIGlzIG5vdyBhIGJpdCBsZXNzIGNoYXR0eSwgY291cnRlc3kgb2YgdGhlIHBhcnNlcgorICBnZW5lcmF0b3IuICBUaGUgYnVpbGQgaXMgY29tcGxldGVseSBzaWxlbnQgKGV4Y2VwdCBmb3IgZXJyb3JzKSB3aGVuCisgIHVzaW5nICJtYWtlIC1zIiwgdGhhbmtzIHRvIGEgLXEgb3B0aW9uIHRvIHNldHVwLnB5LgorCitDIEFQSQorLS0tLS0KKworLSBUaGUgInN0cnVjdG1lbWJlciIgQVBJIG5vdyBzdXBwb3J0cyBzb21lIG5ldyBmbGFnIGJpdHMgdG8gZGVueSByZWFkCisgIGFuZC9vciB3cml0ZSBhY2Nlc3MgdG8gYXR0cmlidXRlcyBpbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlLgorCitOZXcgcGxhdGZvcm1zCistLS0tLS0tLS0tLS0tCisKKy0gQ29tcGFxJ3MgaVBBUSBoYW5kaGVsZCwgcnVubmluZyB0aGUgImZhbWlsaWFyIiBMaW51eCBkaXN0cmlidXRpb24KKyAgKGh0dHA6Ly9mYW1pbGlhci5oYW5kaGVsZHMub3JnKS4KKworVGVzdHMKKy0tLS0tCisKKy0gVGhlICJjbGFzc2ljIiBzdGFuZGFyZCB0ZXN0cywgd2hpY2ggd29yayBieSBjb21wYXJpbmcgc3Rkb3V0IHRvCisgIGFuIGV4cGVjdGVkLW91dHB1dCBmaWxlIHVuZGVyIExpYi90ZXN0L291dHB1dC8sIG5vIGxvbmdlciBzdG9wIGF0CisgIHRoZSBmaXJzdCBtaXNtYXRjaC4gIEluc3RlYWQgdGhlIHRlc3QgaXMgcnVuIHRvIGNvbXBsZXRpb24sIGFuZCBhCisgIHZhcmlhbnQgb2YgbmRpZmYtc3R5bGUgY29tcGFyaXNvbiBpcyB1c2VkIHRvIHJlcG9ydCBhbGwgZGlmZmVyZW5jZXMuCisgIFRoaXMgaXMgbXVjaCBlYXNpZXIgdG8gdW5kZXJzdGFuZCB0aGFuIHRoZSBwcmV2aW91cyBzdHlsZSBvZiByZXBvcnRpbmcuCisKKy0gVGhlIHVuaXR0ZXN0LWJhc2VkIHN0YW5kYXJkIHRlc3RzIG5vdyB1c2UgcmVncnRlc3QncyB0ZXN0X21haW4oKQorICBjb252ZW50aW9uLCBpbnN0ZWFkIG9mIHJ1bm5pbmcgYXMgYSBzaWRlLWVmZmVjdCBvZiBtZXJlbHkgYmVpbmcKKyAgaW1wb3J0ZWQuICBUaGlzIGFsbG93cyB0aGVzZSB0ZXN0cyB0byBiZSBydW4gaW4gbW9yZSBuYXR1cmFsIGFuZAorICBmbGV4aWJsZSB3YXlzIGFzIHVuaXR0ZXN0cywgb3V0c2lkZSB0aGUgcmVncnRlc3QgZnJhbWV3b3JrLgorCistIHJlZ3J0ZXN0LnB5IGlzIG11Y2ggYmV0dGVyIGludGVncmF0ZWQgd2l0aCB1bml0dGVzdCBhbmQgZG9jdGVzdCBub3csCisgIGVzcGVjaWFsbHkgaW4gcmVnYXJkIHRvIHJlcG9ydGluZyBlcnJvcnMuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBMYXJnZSBmaWxlIHN1cHBvcnQgbm93IGFsc28gd29ya3MgZm9yIGZpbGVzID4gNEdCLCBvbiBmaWxlc3lzdGVtcworICB0aGF0IHN1cHBvcnQgaXQgKE5URlMgdW5kZXIgV2luZG93cyAyMDAwKS4gIFNlZSAiV2hhdCdzIE5ldyBpbgorICBQeXRob24gMi4yYTMiIGZvciBtb3JlIGRldGFpbC4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJhMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBEYXRlOiAwNy1TZXAtMjAwMSoKKworQ29yZQorLS0tLQorCistIENvbnZlcnNpb24gb2YgbG9uZyB0byBmbG9hdCBub3cgcmFpc2VzIE92ZXJmbG93RXJyb3IgaWYgdGhlIGxvbmcgaXMgdG9vCisgIGJpZyB0byByZXByZXNlbnQgYXMgYSBDIGRvdWJsZS4KKworLSBUaGUgMy1hcmd1bWVudCBidWlsdGluIHBvdygpIG5vIGxvbmdlciBhbGxvd3MgYSB0aGlyZCBub24tTm9uZSBhcmd1bWVudAorICBpZiBlaXRoZXIgb2YgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgaXMgYSBmbG9hdCwgb3IgaWYgYm90aCBhcmUgb2YKKyAgaW50ZWdlciB0eXBlcyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBuZWdhdGl2ZSAoaW4gd2hpY2ggbGF0dGVyIGNhc2UKKyAgdGhlIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGZsb2F0LCBzbyB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZQorICByZXN0cmljdGlvbikuCisKKy0gVGhlIGJ1aWx0aW4gZGlyKCkgbm93IHJldHVybnMgbW9yZSBpbmZvcm1hdGlvbiwgYW5kIHNvbWV0aW1lcyBtdWNoCisgIG1vcmUsIGdlbmVyYWxseSBuYW1pbmcgYWxsIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0LCBhbmQgYWxsIGF0dHJpYnV0ZXMKKyAgcmVhY2hhYmxlIGZyb20gdGhlIG9iamVjdCB2aWEgaXRzIGNsYXNzLCBhbmQgZnJvbSBpdHMgY2xhc3MncyBiYXNlCisgIGNsYXNzZXMsIGFuZCBzbyBvbiBmcm9tIHRoZW0gdG9vLiAgRXhhbXBsZTogIGluIDIuMmEyLCBkaXIoW10pIHJldHVybmVkCisgIGFuIGVtcHR5IGxpc3QuICBJbiAyLjJhMywKKworICA+Pj4gZGlyKFtdKQorICBbJ19fYWRkX18nLCAnX19jbGFzc19fJywgJ19fY29udGFpbnNfXycsICdfX2RlbGF0dHJfXycsICdfX2RlbGl0ZW1fXycsCisgICAnX19lcV9fJywgJ19fZ2VfXycsICdfX2dldGF0dHJfXycsICdfX2dldGl0ZW1fXycsICdfX2dldHNsaWNlX18nLAorICAgJ19fZ3RfXycsICdfX2hhc2hfXycsICdfX2lhZGRfXycsICdfX2ltdWxfXycsICdfX2luaXRfXycsICdfX2xlX18nLAorICAgJ19fbGVuX18nLCAnX19sdF9fJywgJ19fbXVsX18nLCAnX19uZV9fJywgJ19fbmV3X18nLCAnX19yZXByX18nLAorICAgJ19fcm11bF9fJywgJ19fc2V0YXR0cl9fJywgJ19fc2V0aXRlbV9fJywgJ19fc2V0c2xpY2VfXycsICdfX3N0cl9fJywKKyAgICdhcHBlbmQnLCAnY291bnQnLCAnZXh0ZW5kJywgJ2luZGV4JywgJ2luc2VydCcsICdwb3AnLCAncmVtb3ZlJywKKyAgICdyZXZlcnNlJywgJ3NvcnQnXQorCisgIGRpcihtb2R1bGUpIGNvbnRpbnVlcyB0byByZXR1cm4gb25seSB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcywgdGhvdWdoLgorCistIE92ZXJmbG93aW5nIG9wZXJhdGlvbnMgb24gcGxhaW4gaW50cyBub3cgcmV0dXJuIGEgbG9uZyBpbnQgcmF0aGVyCisgIHRoYW4gcmFpc2luZyBPdmVyZmxvd0Vycm9yLiAgVGhpcyBpcyBhIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgUEVQCisgIDIzNy4gIFlvdSBjYW4gdXNlIC1XZGVmYXVsdDo6T3ZlcmZsb3dXYXJuaW5nIHRvIGVuYWJsZSBhIHdhcm5pbmcgZm9yCisgIHRoaXMgc2l0dWF0aW9uLCBhbmQgLVdlcnJvcjo6T3ZlcmZsb3dXYXJuaW5nIHRvIHJldmVydCB0byB0aGUgb2xkCisgIE92ZXJmbG93RXJyb3IgZXhjZXB0aW9uLgorCistIEEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24sIC1RPGFyZz4sIGlzIGFkZGVkIHRvIGNvbnRyb2wgcnVuLXRpbWUKKyAgd2FybmluZ3MgZm9yIHRoZSB1c2Ugb2YgY2xhc3NpYyBkaXZpc2lvbi4gIChTZWUgUEVQIDIzOC4pICBQb3NzaWJsZQorICB2YWx1ZXMgYXJlIC1Rb2xkLCAtUXdhcm4sIC1Rd2FybmFsbCwgYW5kIC1RbmV3LiAgVGhlIGRlZmF1bHQgaXMKKyAgLVFvbGQsIG1lYW5pbmcgdGhlIC8gb3BlcmF0b3IgaGFzIGl0cyBjbGFzc2ljIG1lYW5pbmcgYW5kIG5vCisgIHdhcm5pbmdzIGFyZSBpc3N1ZWQuICBVc2luZyAtUXdhcm4gaXNzdWVzIGEgcnVuLXRpbWUgd2FybmluZyBhYm91dAorICBhbGwgdXNlcyBvZiBjbGFzc2ljIGRpdmlzaW9uIGZvciBpbnQgYW5kIGxvbmcgYXJndW1lbnRzOyAtUXdhcm5hbGwKKyAgYWxzbyB3YXJucyBhYm91dCBjbGFzc2ljIGRpdmlzaW9uIGZvciBmbG9hdCBhbmQgY29tcGxleCBhcmd1bWVudHMKKyAgKGZvciB1c2Ugd2l0aCBmaXhkaXYucHkpLgorICBbTm90ZTogIHRoZSByZW1haW5kZXIgb2YgdGhpcyBpdGVtIChwcmVzZXJ2ZWQgYmVsb3cpIGJlY2FtZQorICBvYnNvbGV0ZSBpbiAyLjJjMSAtLSAtUW5ldyBoYXMgZ2xvYmFsIGVmZmVjdCBpbiAyLjJdIDo6CisKKyAgICBVc2luZyAtUW5ldyBpcyBxdWVzdGlvbmFibGU7IGl0IHR1cm5zIG9uIG5ldyBkaXZpc2lvbiBieSBkZWZhdWx0LCBidXQKKyAgICBvbmx5IGluIHRoZSBfX21haW5fXyBtb2R1bGUuICBZb3UgY2FuIHVzZWZ1bGx5IGNvbWJpbmUgLVF3YXJuIG9yCisgICAgLVF3YXJuYWxsIGFuZCAtUW5ldzogdGhpcyBnaXZlcyB0aGUgX19tYWluX18gbW9kdWxlIG5ldyBkaXZpc2lvbiwgYW5kCisgICAgd2FybnMgYWJvdXQgY2xhc3NpYyBkaXZpc2lvbiBldmVyeXdoZXJlIGVsc2UuCisKKy0gTWFueSBidWlsdC1pbiB0eXBlcyBjYW4gbm93IGJlIHN1YmNsYXNzZWQuICBUaGlzIGFwcGxpZXMgdG8gaW50LAorICBsb25nLCBmbG9hdCwgc3RyLCB1bmljb2RlLCBhbmQgdHVwbGUuICAoVGhlIHR5cGVzIGNvbXBsZXgsIGxpc3QgYW5kCisgIGRpY3Rpb25hcnkgY2FuIGFsc28gYmUgc3ViY2xhc3NlZDsgdGhpcyB3YXMgaW50cm9kdWNlZCBlYXJsaWVyLikKKyAgTm90ZSB0aGF0IHJlc3RyaWN0aW9ucyBhcHBseSB3aGVuIHN1YmNsYXNzaW5nIGltbXV0YWJsZSBidWlsdC1pbgorICB0eXBlczogeW91IGNhbiBvbmx5IGFmZmVjdCB0aGUgdmFsdWUgb2YgdGhlIGluc3RhbmNlIGJ5IG92ZXJsb2FkaW5nCisgIF9fbmV3X18uICBZb3UgY2FuIGFkZCBtdXRhYmxlIGF0dHJpYnV0ZXMsIGFuZCB0aGUgc3ViY2xhc3MgaW5zdGFuY2VzCisgIHdpbGwgaGF2ZSBhIF9fZGljdF9fIGF0dHJpYnV0ZSwgYnV0IHlvdSBjYW5ub3QgY2hhbmdlIHRoZSAidmFsdWUiCisgIChhcyBpbXBsZW1lbnRlZCBieSB0aGUgYmFzZSBjbGFzcykgb2YgYW4gaW1tdXRhYmxlIHN1YmNsYXNzIGluc3RhbmNlCisgIG9uY2UgaXQgaXMgY3JlYXRlZC4KKworLSBUaGUgZGljdGlvbmFyeSBjb25zdHJ1Y3RvciBub3cgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQsIGEKKyAgbWFwcGluZy1saWtlIG9iamVjdCwgYW5kIGluaXRpYWxpemVzIHRoZSBkaWN0aW9uYXJ5IGZyb20gaXRzCisgIChrZXksIHZhbHVlKSBwYWlycy4KKworLSBBIG5ldyBidWlsdC1pbiB0eXBlLCBzdXBlciwgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGZhY2lsaXRhdGVzIG1ha2luZworICAiY29vcGVyYXRpdmUgc3VwZXIgY2FsbHMiIGluIGEgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugc2V0dGluZy4gIEZvciBhbgorICBleHBsYW5hdGlvbiwgc2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvZGVzY3JpbnRyby5odG1sI2Nvb3BlcmF0aW9uCisKKy0gQSBuZXcgYnVpbHQtaW4gdHlwZSwgcHJvcGVydHksIGhhcyBiZWVuIGFkZGVkLiAgVGhpcyBlbmFibGVzIHRoZQorICBjcmVhdGlvbiBvZiAicHJvcGVydGllcyIuICBUaGVzZSBhcmUgYXR0cmlidXRlcyBpbXBsZW1lbnRlZCBieQorICBnZXR0ZXIgYW5kIHNldHRlciBmdW5jdGlvbnMgKG9yIG9ubHkgb25lIG9mIHRoZXNlIGZvciByZWFkLW9ubHkgb3IKKyAgd3JpdGUtb25seSBhdHRyaWJ1dGVzKSwgd2l0aG91dCB0aGUgbmVlZCB0byBvdmVycmlkZSBfX2dldGF0dHJfXy4KKyAgU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvZGVzY3JpbnRyby5odG1sI3Byb3BlcnR5CisKKy0gVGhlIHN5bnRheCBvZiBmbG9hdGluZy1wb2ludCBhbmQgaW1hZ2luYXJ5IGxpdGVyYWxzIGhhcyBiZWVuCisgIGxpYmVyYWxpemVkLCB0byBhbGxvdyBsZWFkaW5nIHplcm9lcy4gIEV4YW1wbGVzIG9mIGxpdGVyYWxzIG5vdworICBsZWdhbCB0aGF0IHdlcmUgU3ludGF4RXJyb3JzIGJlZm9yZToKKworICAgICAgMDAuMCAgICAwZTMgICAwMTAwaiAgIDA3LjUgICAwMDAwMDAwMDAwMDAwMDAwMDAwOC4KKworLSBBbiBvbGQgdG9rZW5pemVyIGJ1ZyBhbGxvd2VkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIHdpdGggYW4gaW5jb21wbGV0ZQorICBleHBvbmVudCwgc3VjaCBhcyAxZSBhbmQgMy4xZS0uICBTdWNoIGxpdGVyYWxzIG5vdyByYWlzZSBTeW50YXhFcnJvci4KKworTGlicmFyeQorLS0tLS0tLQorCistIHRlbG5ldGxpYiBpbmNsdWRlcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIG9wdGlvbnMsIGFuZCBzdXBwb3J0IGZvcgorICBzZXR0aW5nIGFuIG9wdGlvbiBuZWdvdGlhdGlvbiBjYWxsYmFjay4gSXQgYWxzbyBzdXBwb3J0cyBwcm9jZXNzaW5nCisgIG9mIHN1Ym9wdGlvbnMuCisKKy0gVGhlIG5ldyBDIHN0YW5kYXJkIG5vIGxvbmdlciByZXF1aXJlcyB0aGF0IG1hdGggbGlicmFyaWVzIHNldCBlcnJubyB0bworICBFUkFOR0Ugb24gb3ZlcmZsb3cuICBGb3IgcGxhdGZvcm0gbGlicmFyaWVzIHRoYXQgZXhwbG9pdCB0aGlzIG5ldworICBmcmVlZG9tLCBQeXRob24ncyBvdmVyZmxvdy1jaGVja2luZyB3YXMgd2hvbGx5IGJyb2tlbi4gIEEgbmV3IG92ZXJmbG93LQorICBjaGVja2luZyBzY2hlbWUgYXR0ZW1wdHMgdG8gcmVwYWlyIHRoYXQsIGJ1dCBtYXkgbm90IGJlIHJlbGlhYmxlIG9uIGFsbAorICBwbGF0Zm9ybXMgKEMgZG9lc24ndCBzZWVtIHRvIHByb3ZpZGUgYW55dGhpbmcgYm90aCB1c2VmdWwgYW5kIHBvcnRhYmxlCisgIGluIHRoaXMgYXJlYSBhbnltb3JlKS4KKworLSBBc3luY2hyb25vdXMgdGltZW91dCBhY3Rpb25zIGFyZSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgbmV3IGNsYXNzCisgIHRocmVhZGluZy5UaW1lci4KKworLSBtYXRoLmxvZyBhbmQgbWF0aC5sb2cxMCBub3cgcmV0dXJuIHNlbnNpYmxlIHJlc3VsdHMgZm9yIGV2ZW4gaHVnZQorICBsb25nIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCBtYXRoLmxvZzEwKDEwICoqIDEwMDAwKSB+PSAxMDAwMC4wLgorCistIEEgbmV3IGZ1bmN0aW9uLCBpbXAubG9ja19oZWxkKCksIHJldHVybnMgMSB3aGVuIHRoZSBpbXBvcnQgbG9jayBpcworICBjdXJyZW50bHkgaGVsZC4gIFNlZSB0aGUgZG9jcyBmb3IgdGhlIGltcCBtb2R1bGUuCisKKy0gcGlja2xlLCBjUGlja2xlIGFuZCBtYXJzaGFsIG9uIDMyLWJpdCBwbGF0Zm9ybXMgY2FuIG5vdyBjb3JyZWN0bHkgcmVhZAorICBkdW1wcyBjb250YWluaW5nIGludHMgd3JpdHRlbiBvbiBwbGF0Zm9ybXMgd2hlcmUgUHl0aG9uIGludHMgYXJlIDggYnl0ZXMuCisgIFdoZW4gcmVhZCBvbiBhIGJveCB3aGVyZSBQeXRob24gaW50cyBhcmUgNCBieXRlcywgc3VjaCB2YWx1ZXMgYXJlCisgIGNvbnZlcnRlZCB0byBQeXRob24gbG9uZ3MuCisKKy0gSW4gcmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZSAodXNpbmcgdGhlIHJleGVjIG1vZHVsZSksIHVubWFyc2hhbGxpbmcKKyAgY29kZSBvYmplY3RzIGlzIG5vIGxvbmdlciBhbGxvd2VkLiAgVGhpcyBwbHVncyBhIHNlY3VyaXR5IGhvbGUuCisKKy0gdW5pdHRlc3QuVGVzdFJlc3VsdCBpbnN0YW5jZXMgbm8gbG9uZ2VyIHN0b3JlIHJlZmVyZW5jZXMgdG8gdHJhY2ViYWNrcworICBnZW5lcmF0ZWQgYnkgdGVzdCBmYWlsdXJlcy4gVGhpcyBwcmV2ZW50cyB1bmV4cGVjdGVkIGRhbmdsaW5nIHJlZmVyZW5jZXMKKyAgdG8gb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBnYXJiYWdlIGNvbGxlY3RlZCBiZXR3ZWVuIHRlc3RzLgorCitUb29scworLS0tLS0KKworLSBUb29scy9zY3JpcHRzL2ZpeGRpdi5weSBoYXMgYmVlbiBhZGRlZCB3aGljaCBjYW4gYmUgdXNlZCB0byBmaXgKKyAgZGl2aXNpb24gb3BlcmF0b3JzIGFzIHBlciBQRVAgMjM4LgorCitCdWlsZAorLS0tLS0KKworLSBJZiB5b3UgYXJlIGFuIGFkdmVudHVyb3VzIHBlcnNvbiB1c2luZyBNYWMgT1MgWCB5b3UgbWF5IHdhbnQgdG8gbG9vayBhdAorICBNYWMvT1NYLiBUaGVyZSBpcyBhIE1ha2VmaWxlIHRoZXJlIHRoYXQgd2lsbCBidWlsZCBQeXRob24gYXMgYSByZWFsIE1hYworICBhcHBsaWNhdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGV4cGVyaW1lbnRpbmcgd2l0aCBDYXJib24gb3IgQ29jb2EuCisgIERpc2N1c3Npb24gb2YgdGhpcyBvbiBweXRob25tYWMtc2lnLCBwbGVhc2UuCisKK0MgQVBJCistLS0tLQorCistIE5ldyBmdW5jdGlvbiBQeU9iamVjdF9EaXIob2JqKSwgbGlrZSBQeXRob24gX19idWlsdGluX18uZGlyKG9iaikuCisKKy0gTm90ZSB0aGF0IFB5TG9uZ19Bc0RvdWJsZSBjYW4gZmFpbCEgIFRoaXMgaGFzIGFsd2F5cyBiZWVuIHRydWUsIGJ1dCBubworICBjYWxsZXJzIGNoZWNrZWQgZm9yIGl0LiAgSXQncyBtb3JlIGxpa2VseSB0byBmYWlsIG5vdywgYmVjYXVzZSBvdmVyZmxvdworICBlcnJvcnMgYXJlIHByb3Blcmx5IGRldGVjdGVkIG5vdy4gIFRoZSBwcm9wZXIgd2F5IHRvIGNoZWNrOjoKKworICAgICAgZG91YmxlIHggPSBQeUxvbmdfQXNEb3VibGUoc29tZV9sb25nX29iamVjdCk7CisgICAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgLyogVGhlIGNvbnZlcnNpb24gZmFpbGVkLiAqLworICAgICAgfQorCistIFRoZSBHQyBBUEkgaGFzIGJlZW4gY2hhbmdlZC4gIEV4dGVuc2lvbnMgdGhhdCB1c2UgdGhlIG9sZCBBUEkgd2lsbCBzdGlsbAorICBjb21waWxlIGJ1dCB3aWxsIG5vdCBwYXJ0aWNpcGF0ZSBpbiBHQy4gIFRvIHVwZ3JhZGUgYW4gZXh0ZW5zaW9uCisgIG1vZHVsZToKKworICAgIC0gcmVuYW1lIFB5X1RQRkxBR1NfR0MgdG8gUHlUUEZMQUdTX0hBVkVfR0MKKworICAgIC0gdXNlIFB5T2JqZWN0X0dDX05ldyBvciBQeU9iamVjdF9HQ19OZXdWYXIgdG8gYWxsb2NhdGUgb2JqZWN0cyBhbmQKKyAgICAgIFB5T2JqZWN0X0dDX0RlbCB0byBkZWFsbG9jYXRlIHRoZW0KKworICAgIC0gcmVuYW1lIFB5T2JqZWN0X0dDX0luaXQgdG8gUHlPYmplY3RfR0NfVHJhY2sgYW5kIFB5T2JqZWN0X0dDX0ZpbmkKKyAgICAgIHRvIFB5T2JqZWN0X0dDX1VuVHJhY2sKKworICAgIC0gcmVtb3ZlIFB5R0NfSEVBRF9TSVpFIGZyb20gb2JqZWN0IHNpemUgY2FsY3VsYXRpb25zCisKKyAgICAtIHJlbW92ZSBjYWxscyB0byBQeU9iamVjdF9BU19HQyBhbmQgUHlPYmplY3RfRlJPTV9HQworCistIFR3byBuZXcgZnVuY3Rpb25zOiBQeVN0cmluZ19Gcm9tRm9ybWF0KCkgYW5kIFB5U3RyaW5nX0Zyb21Gb3JtYXRWKCkuCisgIFRoZXNlIGNhbiBiZSB1c2VkIHNhZmVseSB0byBjb25zdHJ1Y3Qgc3RyaW5nIG9iamVjdHMgZnJvbSBhCisgIHNwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZyAoc2ltaWxhciB0byB0aGUgZm9ybWF0IHN0cmluZyBzdXBwb3J0ZWQKKyAgYnkgUHlFcnJfRm9ybWF0KCkpLgorCitOZXcgcGxhdGZvcm1zCistLS0tLS0tLS0tLS0tCisKKy0gU3RlcGhlbiBIYW5zZW4gY29udHJpYnV0ZWQgcGF0Y2hlcyBzdWZmaWNpZW50IHRvIGdldCBhIGNsZWFuIGNvbXBpbGUKKyAgdW5kZXIgQm9ybGFuZCBDIChXaW5kb3dzKSwgYnV0IGhlIHJlcG9ydHMgcHJvYmxlbXMgcnVubmluZyBpdCBhbmQgcmFuCisgIG91dCBvZiB0aW1lIHRvIGNvbXBsZXRlIHRoZSBwb3J0LiAgVm9sdW50ZWVycz8gIEV4cGVjdCBhIE1lbW9yeUVycm9yCisgIHdoZW4gaW1wb3J0aW5nIHRoZSB0eXBlcyBtb2R1bGU7IHRoaXMgaXMgcHJvYmFibHkgc2hhbGxvdywgYW5kCisgIGNhdXNpbmcgbGF0ZXIgZmFpbHVyZXMgdG9vLgorCitUZXN0cworLS0tLS0KKworV2luZG93cworLS0tLS0tLQorCistIExhcmdlIGZpbGUgc3VwcG9ydCBpcyBub3cgZW5hYmxlZCBvbiBXaW4zMiBwbGF0Zm9ybXMgYXMgd2VsbCBhcyBvbgorICBXaW42NC4gIFRoaXMgbWVhbnMgdGhhdCwgZm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIGYudGVsbCgpIGFuZCBmLnNlZWsoKQorICB0byBtYW5pcHVsYXRlIGZpbGVzIGxhcmdlciB0aGFuIDIgZ2lnYWJ5dGVzIChwcm92aWRlZCB5b3UgaGF2ZSBlbm91Z2gKKyAgZGlzayBzcGFjZSwgYW5kIGFyZSB1c2luZyBhIFdpbmRvd3MgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIGxhcmdlCisgIHBhcnRpdGlvbnMpLiAgV2luZG93cyBmaWxlc3lzdGVtIGxpbWl0czogIEZBVCBoYXMgYSAyR0IgKGdpZ2FieXRlKQorICBmaWxlc2l6ZSBsaW1pdCwgYW5kIGxhcmdlIGZpbGUgc3VwcG9ydCBtYWtlcyBubyBkaWZmZXJlbmNlIHRoZXJlLgorICBGQVQzMidzIGxpbWl0IGlzIDRHQiwgYW5kIGZpbGVzID49IDJHQiBhcmUgZWFzaWVyIHRvIHVzZSBmcm9tIFB5dGhvbiBub3cuCisgIE5URlMgaGFzIG5vIHByYWN0aWNhbCBsaW1pdCBvbiBmaWxlIHNpemUsIGFuZCBmaWxlcyBvZiBhbnkgc2l6ZSBjYW4gYmUKKyAgdXNlZCBmcm9tIFB5dGhvbiBub3cuCisKKy0gVGhlIHc5eHBvcGVuIGhhY2sgaXMgbm93IHVzZWQgb24gV2luZG93cyBOVCBhbmQgMjAwMCB0b28gd2hlbiBDT01QU1BFQworICBwb2ludHMgdG8gY29tbWFuZC5jb20gKHBhdGNoIGZyb20gQnJpYW4gUXVpbmxhbikuCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgRGF0ZTogMjItQXVnLTIwMDEqCisKK0J1aWxkCistLS0tLQorCistIFRpbSBQZXRlcnMgZGV2ZWxvcGVkIGEgYnJhbmQgbmV3IFdpbmRvd3MgaW5zdGFsbGVyIHVzaW5nIFdpc2UgOC4xLAorICBnZW5lcm91c2x5IGRvbmF0ZWQgdG8gdXMgYnkgV2lzZSBTb2x1dGlvbnMuCisKKy0gY29uZmlndXJlIHN1cHBvcnRzIGEgbmV3IG9wdGlvbiAtLWVuYWJsZS11bmljb2RlLCB3aXRoIHRoZSB2YWx1ZXMKKyAgdWNzMiBhbmQgdWNzNCAobmV3IGluIDIuMmExKS4gV2l0aCAtLWRpc2FibGUtdW5pY29kZSwgdGhlIFVuaWNvZGUKKyAgdHlwZSBhbmQgc3VwcG9ydGluZyBjb2RlIGlzIGNvbXBsZXRlbHkgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcnByZXRlci4KKworLSBBIG5ldyBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLWZyYW1ld29yayBidWlsZHMgYSBNYWMgT1MgWCBmcmFtZXdvcmssCisgIHdoaWNoICJtYWtlIGZyYW1ld29ya2luc3RhbGwiIHdpbGwgaW5zdGFsbC4gVGhpcyBwcm92aWRlcyBhIHN0YXJ0aW5nCisgIHBvaW50IGZvciBtb3JlIG1hYy1saWtlIGZ1bmN0aW9uYWxpdHksIGpvaW4gcHl0aG9ubWFjLXNpZ0BweXRob24ub3JnCisgIGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBoZWxwaW5nLgorCistIFRoZSBOZVhUIHBsYXRmb3JtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCisKKy0gVGhlICduZXcnIG1vZHVsZSBpcyBub3cgc3RhdGljYWxseSBsaW5rZWQuCisKK1Rvb2xzCistLS0tLQorCistIFRoZSBuZXcgVG9vbHMvc2NyaXB0cy9jbGVhbmZ1dHVyZS5weSBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5CisgIGVkaXQgb3V0IG9ic29sZXRlIGZ1dHVyZSBzdGF0ZW1lbnRzIGZyb20gUHl0aG9uIHNvdXJjZSBjb2RlLiAgU2VlCisgIHRoZSBtb2R1bGUgZG9jc3RyaW5nIGZvciBkZXRhaWxzLgorCitUZXN0cworLS0tLS0KKworLSByZWdydGVzdC5weSBub3cga25vd3Mgd2hpY2ggdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHNraXBwZWQgb24gc29tZQorICBwbGF0Zm9ybXMsIGFsbG93aW5nIHRvIGdpdmUgY2xlYXJlciB0ZXN0IHJlc3VsdCBvdXRwdXQuICByZWdydGVzdAorICBhbHNvIGhhcyBvcHRpb25hbCAtLXVzZS8tdSBzd2l0Y2ggdG8gcnVuIG5vcm1hbGx5IGRpc2FibGVkIHRlc3RzCisgIHdoaWNoIHJlcXVpcmUgbmV0d29yayBhY2Nlc3Mgb3IgY29uc3VtZSBzaWduaWZpY2FudCBkaXNrIHJlc291cmNlcy4KKworLSBTZXZlcmFsIG5ldyB0ZXN0cyBpbiB0aGUgc3RhbmRhcmQgdGVzdCBzdWl0ZSwgd2l0aCBzcGVjaWFsIHRoYW5rcyB0bworICBOaWNrIE1hdGhld3Nvbi4KKworQ29yZQorLS0tLQorCistIFRoZSBmbG9vciBkaXZpc2lvbiBvcGVyYXRvciAvLyBoYXMgYmVlbiBhZGRlZCBhcyBvdXRsaW5lZCBpbiBQRVAKKyAgMjM4LiAgVGhlIC8gb3BlcmF0b3Igc3RpbGwgcHJvdmlkZXMgY2xhc3NpYyBkaXZpc2lvbiAoYW5kIHdpbGwgdW50aWwKKyAgUHl0aG9uIDMuMCkgdW5sZXNzICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uIiBpcyBpbmNsdWRlZCwgaW4KKyAgd2hpY2ggY2FzZSB0aGUgLyBvcGVyYXRvciB3aWxsIHByb3ZpZGUgdHJ1ZSBkaXZpc2lvbi4gIFRoZSBvcGVyYXRvcgorICBtb2R1bGUgcHJvdmlkZXMgdHJ1ZWRpdigpIGFuZCBmbG9vcmRpdigpIGZ1bmN0aW9ucy4gIEF1Z21lbnRlZAorICBhc3NpZ25tZW50IHZhcmlhbnRzIGFyZSBpbmNsdWRlZCwgYXMgYXJlIHRoZSBlcXVpdmFsZW50IG92ZXJsb2FkYWJsZQorICBtZXRob2RzIGFuZCBDIEFQSSBtZXRob2RzLiAgU2VlIHRoZSBQRVAgZm9yIGEgZnVsbCBkaXNjdXNzaW9uOgorICA8aHR0cDovL3B5dGhvbi5zZi5uZXQvcGVwcy9wZXAtMDIzOC5odG1sPgorCistIEZ1dHVyZSBzdGF0ZW1lbnRzIGFyZSBub3cgZWZmZWN0aXZlIGluIHNpbXVsYXRlZCBpbnRlcmFjdGl2ZSBzaGVsbHMKKyAgKGxpa2UgSURMRSkuICBUaGlzIHNob3VsZCAianVzdCB3b3JrIiBieSBtYWdpYywgYnV0IHJlYWQgTWljaGFlbAorICBIdWRzb24ncyAiRnV0dXJlIHN0YXRlbWVudHMgaW4gc2ltdWxhdGVkIHNoZWxscyIgUEVQIDI2NCBmb3IgZnVsbAorICBkZXRhaWxzOiAgPGh0dHA6Ly9weXRob24uc2YubmV0L3BlcHMvcGVwLTAyNjQuaHRtbD4uCisKKy0gVGhlIHR5cGUvY2xhc3MgdW5pZmljYXRpb24gKFBFUCAyNTItMjUzKSB3YXMgaW50ZWdyYXRlZCBpbnRvIHRoZQorICB0cnVuayBhbmQgaXMgbm90IHNvIHRlbnRhdGl2ZSBhbnkgbW9yZSAodGhlIGV4YWN0IHNwZWNpZmljYXRpb24gb2YKKyAgc29tZSBmZWF0dXJlcyBpcyBzdGlsbCB0ZW50YXRpdmUpLiAgQSBsb3Qgb2Ygd29yayBoYXMgZG9uZSBvbiBmaXhpbmcKKyAgYnVncyBhbmQgYWRkaW5nIHJvYnVzdG5lc3MgYW5kIGZlYXR1cmVzIChwZXJmb3JtYW5jZSBzdGlsbCBoYXMgdG8KKyAgY29tZSBhIGxvbmcgd2F5KS4KKworLSBXYXJuaW5ncyBhYm91dCBhIG1pc21hdGNoIGluIHRoZSBQeXRob24gQVBJIGR1cmluZyBleHRlbnNpb24gaW1wb3J0CisgIG5vdyB1c2UgdGhlIFB5dGhvbiB3YXJuaW5nIGZyYW1ld29yayAod2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8KKyAgd3JpdGUgZmlsdGVycyBmb3IgdGhlc2Ugd2FybmluZ3MpLgorCistIEEgZnVuY3Rpb24ncyBfX2RpY3RfXyAoYWthIGZ1bmNfZGljdCkgd2lsbCBub3cgYWx3YXlzIGJlIGEKKyAgZGljdGlvbmFyeS4gIEl0IHVzZWQgdG8gYmUgcG9zc2libGUgdG8gZGVsZXRlIGl0IG9yIHNldCBpdCB0byBOb25lLAorICBidXQgbm93IGJvdGggYWN0aW9ucyByYWlzZSBUeXBlRXJyb3JzLiAgSXQgaXMgc3RpbGwgbGVnYWwgdG8gc2V0IGl0CisgIHRvIGEgZGljdGlvbmFyeSBvYmplY3QuICBHZXR0aW5nIGZ1bmMuX19kaWN0X18gYmVmb3JlIGFueSBhdHRyaWJ1dGVzCisgIGhhdmUgYmVlbiBhc3NpZ25lZCBub3cgcmV0dXJucyBhbiBlbXB0eSBkaWN0aW9uYXJ5IGluc3RlYWQgb2YgTm9uZS4KKworLSBBIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uLCAtRSwgd2FzIGFkZGVkIHdoaWNoIGRpc2FibGVzIHRoZSB1c2Ugb2YKKyAgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcywgb3IgYXQgbGVhc3QgdGhvc2UgdGhhdCBhcmUgc3BlY2lmaWNhbGx5CisgIHNpZ25pZmljYW50IHRvIFB5dGhvbi4gIFVzdWFsbHkgdGhvc2UgaGF2ZSBhIG5hbWUgc3RhcnRpbmcgd2l0aAorICAiUFlUSE9OIi4gIFRoaXMgd2FzIHVzZWQgdG8gZml4IGEgcHJvYmxlbSB3aGVyZSB0aGUgdGVzdHMgZmFpbCBpZgorICB0aGUgdXNlciBoYXBwZW5zIHRvIGhhdmUgUFlUSE9OSE9NRSBvciBQWVRIT05QQVRIIHBvaW50aW5nIHRvIGFuCisgIG9sZGVyIGRpc3RyaWJ1dGlvbi4KKworTGlicmFyeQorLS0tLS0tLQorCistIE5ldyBjbGFzcyBEaWZmZXIgYW5kIG5ldyBmdW5jdGlvbnMgbmRpZmYoKSBhbmQgcmVzdG9yZSgpIGluIGRpZmZsaWIucHkuCisgIFRoZXNlIHBhY2thZ2UgdGhlIGFsZ29yaXRobXMgdXNlZCBieSB0aGUgcG9wdWxhciBUb29scy9zY3JpcHRzL25kaWZmLnB5LAorICBmb3IgcHJvZ3JhbW1hdGljIHJldXNlLgorCistIE5ldyBmdW5jdGlvbiB4bWwuc2F4LnNheHV0aWxzLnF1b3RlYXR0cigpOiAgUXVvdGUgYW4gWE1MIGF0dHJpYnV0ZQorICB2YWx1ZSB1c2luZyB0aGUgbWluaW1hbCBxdW90aW5nIHJlcXVpcmVkIGZvciB0aGUgdmFsdWU7IG1vcmUKKyAgcmVsaWFibGUgdGhhbiB1c2luZyB4bWwuc2F4LnNheHV0aWxzLmVzY2FwZSgpIGZvciBhdHRyaWJ1dGUgdmFsdWVzLgorCistIFJlYWRsaW5lIGNvbXBsZXRpb24gc3VwcG9ydCBmb3IgY21kLkNtZCB3YXMgYWRkZWQuCisKKy0gQ2FsbGluZyBvcy50ZW1wbmFtKCkgb3Igb3MudG1wbmFtKCkgZ2VuZXJhdGUgUnVudGltZVdhcm5pbmdzLgorCistIEFkZGVkIGZ1bmN0aW9uIHRocmVhZGluZy5Cb3VuZGVkU2VtYXBob3JlKCkKKworLSBBZGRlZCBLYS1QaW5nIFllZSdzIGNnaXRiLnB5IG1vZHVsZS4KKworLSBUaGUgJ25ldycgbW9kdWxlIG5vdyBleHBvc2VzIHRoZSBDT194eHggZmxhZ3MuCisKKy0gVGhlIGdjIG1vZHVsZSBvZmZlcnMgdGhlIGdldF9yZWZlcmVudHMgZnVuY3Rpb24uCisKK05ldyBwbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0KKworQyBBUEkKKy0tLS0tCisKKy0gVHdvIG5ldyBBUElzIFB5T1Nfc25wcmludGYoKSBhbmQgUHlPU192c25wcmludGYoKSB3ZXJlIGFkZGVkCisgIHdoaWNoIHByb3ZpZGUgYSBjcm9zcy1wbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZQorICByZWxhdGl2ZWx5IG5ldyBzbnByaW50ZigpL3ZzbnByaW50ZigpIEMgbGliIEFQSXMuIEluIGNvbnRyYXN0IHRvCisgIHRoZSBzdGFuZGFyZCBzcHJpbnRmKCkgYW5kIHZzcHJpbnRmKCkgQyBsaWIgQVBJcywgdGhlc2UgdmVyc2lvbnMKKyAgYXBwbHkgYm91bmRzIGNoZWNraW5nIG9uIHRoZSB1c2VkIGJ1ZmZlciB3aGljaCBlbmhhbmNlcyBwcm90ZWN0aW9uCisgIGFnYWluc3QgYnVmZmVyIG92ZXJydW5zLgorCistIFVuaWNvZGUgQVBJcyBub3cgdXNlIG5hbWUgbWFuZ2xpbmcgdG8gYXNzdXJlIHRoYXQgbWl4aW5nIGludGVycHJldGVycworICBhbmQgZXh0ZW5zaW9ucyB1c2luZyBkaWZmZXJlbnQgVW5pY29kZSB3aWR0aHMgaXMgcmVuZGVyZWQgbmV4dCB0bworICBpbXBvc3NpYmxlLiBUcnlpbmcgdG8gaW1wb3J0IGFuIGluY29tcGF0aWJsZSBVbmljb2RlLWF3YXJlIGV4dGVuc2lvbgorICB3aWxsIHJlc3VsdCBpbiBhbiBJbXBvcnRFcnJvci4gIFVuaWNvZGUgZXh0ZW5zaW9ucyB3cml0ZXJzIG11c3QgbWFrZQorICBzdXJlIHRvIGNoZWNrIHRoZSBVbmljb2RlIHdpZHRoIGNvbXBhdGliaWxpdHkgaW4gdGhlaXIgZXh0ZW5zaW9ucyBieQorICB1c2luZyBhdCBsZWFzdCBvbmUgb2YgdGhlIG1hbmdsZWQgVW5pY29kZSBBUElzIGluIHRoZSBleHRlbnNpb24uCisKKy0gVHdvIG5ldyBmbGFncyBNRVRIX05PQVJHUyBhbmQgTUVUSF9PIGFyZSBhdmFpbGFibGUgaW4gbWV0aG9kIGRlZmluaXRpb24KKyAgdGFibGVzIHRvIHNpbXBsaWZ5IGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgd2l0aCBubyBhcmd1bWVudHMgYW5kIGEKKyAgc2luZ2xlIHVudHlwZWQgYXJndW1lbnQuIENhbGxpbmcgc3VjaCBtZXRob2RzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KKyAgY2FsbGluZyBjb3JyZXNwb25kaW5nIE1FVEhfVkFSQVJHUyBtZXRob2RzLiBNRVRIX09MREFSR1MgaXMgbm93CisgIGRlcHJlY2F0ZWQuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSAiaW1wb3J0IG1vZHVsZSIgbm93IGNvbXBpbGVzIG1vZHVsZS5weXcgaWYgaXQgZXhpc3RzIGFuZCBub3RoaW5nIGVsc2UKKyAgcmVsZXZhbnQgaXMgZm91bmQuCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMTgtSnVsLTIwMDEqCisKK0NvcmUKKy0tLS0KKworLSBURU5UQVRJVkVMWSwgYSBsYXJnZSBhbW91bnQgb2YgY29kZSBpbXBsZW1lbnRpbmcgbXVjaCBvZiB3aGF0J3MKKyAgZGVzY3JpYmVkIGluIFBFUCAyNTIgKE1ha2luZyBUeXBlcyBMb29rIE1vcmUgTGlrZSBDbGFzc2VzKSBhbmQgUEVQCisgIDI1MyAoU3VidHlwaW5nIEJ1aWx0LWluIFR5cGVzKSB3YXMgYWRkZWQuICBUaGlzIHdpbGwgYmUgcmVsZWFzZWQKKyAgd2l0aCBQeXRob24gMi4yYTEuICBEb2N1bWVudGF0aW9uIHdpbGwgYmUgcHJvdmlkZWQgc2VwYXJhdGVseQorICB0aHJvdWdoIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvLiAgVGhlIHB1cnBvc2Ugb2YgcmVsZWFzaW5nIHRoaXMKKyAgd2l0aCBQeXRob24gMi4yYTEgaXMgdG8gdGVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEl0IGlzCisgIHBvc3NpYmxlLCB0aG91Z2ggbm90IGxpa2VseSwgdGhhdCBhIGRlY2lzaW9uIGlzIG1hZGUgbm90IHRvIHJlbGVhc2UKKyAgdGhpcyBjb2RlIGFzIHBhcnQgb2YgMi4yIGZpbmFsLCBpZiBhbnkgc2VyaW91cyBiYWNrd2FyZHMKKyAgaW5jb21wYXRpYmlsaXRpZXMgYXJlIGZvdW5kIGR1cmluZyBhbHBoYSB0ZXN0aW5nIHRoYXQgY2Fubm90IGJlCisgIHJlcGFpcmVkLgorCistIEdlbmVyYXRvcnMgd2VyZSBhZGRlZDsgdGhpcyBpcyBhIG5ldyB3YXkgdG8gY3JlYXRlIGFuIGl0ZXJhdG9yIChzZWUKKyAgYmVsb3cpIHVzaW5nIHdoYXQgbG9va3MgbGlrZSBhIHNpbXBsZSBmdW5jdGlvbiBjb250YWluaW5nIG9uZSBvcgorICBtb3JlICd5aWVsZCcgc3RhdGVtZW50cy4gIFNlZSBQRVAgMjU1LiAgU2luY2UgdGhpcyBhZGRzIGEgbmV3CisgIGtleXdvcmQgdG8gdGhlIGxhbmd1YWdlLCB0aGlzIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIGJ5IGluY2x1ZGluZyBhCisgIGZ1dHVyZSBzdGF0ZW1lbnQ6ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMiIChzZWUgUEVQIDIzNikuCisgIEdlbmVyYXRvcnMgd2lsbCBiZWNvbWUgYSBzdGFuZGFyZCBmZWF0dXJlIGluIGEgZnV0dXJlIHJlbGVhc2UKKyAgKHByb2JhYmx5IDIuMykuICBXaXRob3V0IHRoaXMgZnV0dXJlIHN0YXRlbWVudCwgJ3lpZWxkJyByZW1haW5zIGFuCisgIG9yZGluYXJ5IGlkZW50aWZpZXIsIGJ1dCBhIHdhcm5pbmcgaXMgaXNzdWVkIGVhY2ggdGltZSBpdCBpcyB1c2VkLgorICAoVGhlc2Ugd2FybmluZ3MgY3VycmVudGx5IGRvbid0IGNvbmZvcm0gdG8gdGhlIHdhcm5pbmdzIGZyYW1ld29yayBvZgorICBQRVAgMjMwOyB3ZSBpbnRlbmQgdG8gZml4IHRoaXMgaW4gMi4yYTIuKQorCistIFRoZSBVVEYtMTYgY29kZWMgd2FzIG1vZGlmaWVkIHRvIGJlIG1vcmUgUkZDIGNvbXBsaWFudC4gSXQgd2lsbCBub3cKKyAgb25seSByZW1vdmUgQk9NIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgYW5kIHRoZW4KKyAgb25seSBpZiBydW5uaW5nIGluIG5hdGl2ZSBtb2RlIChVVEYtMTYtTEUgYW5kIC1CRSB3b24ndCByZW1vdmUgYQorICBsZWFkaW5nIEJNTyBjaGFyYWN0ZXIpLgorCistIFN0cmluZ3Mgbm93IGhhdmUgYSBuZXcgbWV0aG9kIC5kZWNvZGUoKSB0byBjb21wbGVtZW50IHRoZSBhbHJlYWR5CisgIGV4aXN0aW5nIC5lbmNvZGUoKSBtZXRob2QuIFRoZXNlIHR3byBtZXRob2RzIHByb3ZpZGUgZGlyZWN0IGFjY2VzcworICB0byB0aGUgY29ycmVzcG9uZGluZyBkZWNvZGVycyBhbmQgZW5jb2RlcnMgb2YgdGhlIHJlZ2lzdGVyZWQgY29kZWNzLgorCisgIFRvIGVuaGFuY2UgdGhlIHVzYWJpbGl0eSBvZiB0aGUgLmVuY29kZSgpIG1ldGhvZCwgdGhlIHNwZWNpYWwKKyAgY2FzaW5nIG9mIFVuaWNvZGUgb2JqZWN0IHJldHVybiB2YWx1ZXMgd2FzIGRyb3BwZWQgKFVuaWNvZGUgb2JqZWN0cworICB3ZXJlIGF1dG8tbWFnaWNhbGx5IGNvbnZlcnRlZCB0byBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgorCisgIEJvdGggbWV0aG9kcyB3aWxsIG5vdyByZXR1cm4gd2hhdGV2ZXIgdGhlIGNvZGVjIGluIGNoYXJnZSBvZiB0aGUKKyAgcmVxdWVzdGVkIGVuY29kaW5nIHJldHVybnMgYXMgb2JqZWN0LCBlLmcuIFVuaWNvZGUgY29kZWNzIHdpbGwKKyAgcmV0dXJuIFVuaWNvZGUgb2JqZWN0cyB3aGVuIGRlY29kaW5nIGlzIHJlcXVlc3RlZCAoIsOkw7bDvCIuZGVjb2RlKCJsYXRpbi0xIikKKyAgd2lsbCByZXR1cm4gdSLDpMO2w7wiKS4gVGhpcyBlbmFibGVzIGNvZGVjIHdyaXRlciB0byBjcmVhdGUgY29kZWNzCisgIGZvciB2YXJpb3VzIHNpbXBsZSB0byB1c2UgY29udmVyc2lvbnMuCisKKyAgTmV3IGNvZGVjcyB3ZXJlIGFkZGVkIHRvIGRlbW9uc3RyYXRlIHRoZXNlIG5ldyBmZWF0dXJlcyAodGhlIC5lbmNvZGUoKQorICBhbmQgLmRlY29kZSgpIGNvbHVtbnMgaW5kaWNhdGUgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIG9iamVjdHMpOgorCisgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHxOYW1lICAgICB8IC5lbmNvZGUoKSB8IC5kZWNvZGUoKSB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICB8CisgICs9PT09PT09PT0rPT09PT09PT09PT0rPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCisgIHx1dSAgICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IFVVIGNvZGVjIChlLmcuIGZvciBlbWFpbCkgICB8CisgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHxiYXNlNjQgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IGJhc2U2NCBjb2RlYyAgICAgICAgICAgICAgICB8CisgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHxxdW9wcmkgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IHF1b3RlZC1wcmludGFibGUgY29kZWMgICAgICB8CisgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHx6bGliICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IHpsaWIgY29tcHJlc3Npb24gICAgICAgICAgICB8CisgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHxoZXggICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IDItYnl0ZSBoZXggY29kZWMgICAgICAgICAgICB8CisgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHxyb3QtMTMgICB8IHN0cmluZyAgICB8IFVuaWNvZGUgICB8IFJPVC0xMyBVbmljb2RlIGNoYXJtYXAgY29kZWN8CisgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKy0gU29tZSBvcGVyYXRpbmcgc3lzdGVtcyBub3cgc3VwcG9ydCB0aGUgY29uY2VwdCBvZiBhIGRlZmF1bHQgVW5pY29kZQorICBlbmNvZGluZyBmb3IgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4gIE5vdGFibHksIFdpbmRvd3Mgc3VwcG9ydHMgJ21iY3MnCisgIGFzIHRoZSBkZWZhdWx0LiAgVGhlIE1hY2ludG9zaCB3aWxsIGFsc28gYWRvcHQgdGhpcyBjb25jZXB0IGluIHRoZSBtZWRpdW0KKyAgdGVybSwgYWx0aG91Z2ggdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoYXQgcGxhdGZvcm0gd2lsbCBiZSBvdGhlciB0aGFuCisgICdtYmNzJy4KKworICBPbiBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgc3VwcG9ydCBub24tQVNDSUkgZmlsZW5hbWVzLCBpdCBpcyBjb21tb24gZm9yCisgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBmaWxlbmFtZXMgKHN1Y2ggYXMgb3MubGlzdGRpcigpKSB0byByZXR1cm4gUHl0aG9uCisgIHN0cmluZyBvYmplY3RzIHByZS1lbmNvZGVkIHVzaW5nIHRoZSBkZWZhdWx0IGZpbGUgc3lzdGVtIGVuY29kaW5nIGZvcgorICB0aGUgcGxhdGZvcm0uICBBcyB0aGlzIGVuY29kaW5nIGlzIGxpa2VseSB0byBiZSBkaWZmZXJlbnQgZnJvbSBQeXRob24ncworICBkZWZhdWx0IGVuY29kaW5nLCBjb252ZXJ0aW5nIHRoaXMgbmFtZSB0byBhIFVuaWNvZGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nCisgIGl0IGJhY2sgdG8gdGhlIE9wZXJhdGluZyBTeXN0ZW0gd291bGQgcmVzdWx0IGluIGEgVW5pY29kZSBlcnJvciwgYXMgUHl0aG9uCisgIHdvdWxkIGF0dGVtcHQgdG8gdXNlIGl0cyBkZWZhdWx0IGVuY29kaW5nIChnZW5lcmFsbHkgQVNDSUkpIHJhdGhlciB0aGFuCisgIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgZmlsZSBzeXN0ZW0uCisKKyAgSW4gZ2VuZXJhbCwgdGhpcyBjaGFuZ2Ugc2ltcGx5IHJlbW92ZXMgc3VycHJpc2VzIHdoZW4gd29ya2luZyB3aXRoCisgIFVuaWNvZGUgYW5kIHRoZSBmaWxlIHN5c3RlbSwgbWFraW5nIHRoZXNlIG9wZXJhdGlvbnMgd29yayBhcyB5b3UgZXhwZWN0LAorICBpbmNyZWFzaW5nIHRoZSB0cmFuc3BhcmVuY3kgb2YgVW5pY29kZSBvYmplY3RzIGluIHRoaXMgY29udGV4dC4KKyAgU2VlIFs/Pz8/XSBmb3IgbW9yZSBkZXRhaWxzLCBpbmNsdWRpbmcgZXhhbXBsZXMuCisKKy0gRmxvYXQgKGFuZCBjb21wbGV4KSBsaXRlcmFscyBpbiBzb3VyY2UgY29kZSB3ZXJlIGV2YWx1YXRlZCB0byBmdWxsCisgIHByZWNpc2lvbiBvbmx5IHdoZW4gcnVubmluZyBmcm9tIGEgLnB5IGZpbGU7IHRoZSBzYW1lIGNvZGUgbG9hZGVkIGZyb20gYQorICAucHljIChvciAucHlvKSBmaWxlIGNvdWxkIHN1ZmZlciBudW1lcmljIGRpZmZlcmVuY2VzIHN0YXJ0aW5nIGF0IGFib3V0IHRoZQorICAxMnRoIHNpZ25pZmljYW50IGRlY2ltYWwgZGlnaXQuICBGb3IgZXhhbXBsZSwgb24gYSBtYWNoaW5lIHdpdGggSUVFRS03NTQKKyAgZmxvYXRpbmcgYXJpdGhtZXRpYywKKworICAgICAgeCA9IDkwMDcxOTkyNTQ3NDA5OTIuMAorICAgICAgcHJpbnQgbG9uZyh4KQorCisgIHByaW50ZWQgOTAwNzE5OTI1NDc0MDk5MiBpZiBydW4gZGlyZWN0bHkgZnJvbSAucHksIGJ1dCA5MDA3MTk5MjU0NzQwMDAwCisgIGlmIGZyb20gYSBjb21waWxlZCAoLnB5YyBvciAucHlvKSBmaWxlLiAgVGhpcyB3YXMgZHVlIHRvIG1hcnNoYWwgdXNpbmcKKyAgc3RyKGZsb2F0KSBpbnN0ZWFkIG9mIHJlcHIoZmxvYXQpIHdoZW4gYnVpbGRpbmcgY29kZSBvYmplY3RzLiAgbWFyc2hhbAorICBub3cgdXNlcyByZXByKGZsb2F0KSBpbnN0ZWFkLCB3aGljaCBzaG91bGQgcmVwcm9kdWNlIGZsb2F0cyB0byBmdWxsCisgIG1hY2hpbmUgcHJlY2lzaW9uIChhc3N1bWluZyB0aGUgcGxhdGZvcm0gQyBmbG9hdDwtPnN0cmluZyBJL08gY29udmVyc2lvbgorICBmdW5jdGlvbnMgYXJlIG9mIGdvb2QgcXVhbGl0eSkuCisKKyAgVGhpcyBtYXkgY2F1c2UgZmxvYXRpbmctcG9pbnQgcmVzdWx0cyB0byBjaGFuZ2UgaW4gc29tZSBjYXNlcywgYW5kCisgIHVzdWFsbHkgZm9yIHRoZSBiZXR0ZXIsIGJ1dCBtYXkgYWxzbyBjYXVzZSBudW1lcmljYWxseSB1bnN0YWJsZQorICBhbGdvcml0aG1zIHRvIGJyZWFrLgorCistIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkaWN0cyBzdWZmZXJzIGZld2VyIGNvbGxpc2lvbnMsIHdoaWNoIGhhcyBzcGVlZAorICBiZW5lZml0cy4gIEhvd2V2ZXIsIHRoZSBvcmRlciBpbiB3aGljaCBkaWN0IGVudHJpZXMgYXBwZWFyIGluIGRpY3Qua2V5cygpLAorICBkaWN0LnZhbHVlcygpIGFuZCBkaWN0Lml0ZW1zKCkgbWF5IGRpZmZlciBmcm9tIHByZXZpb3VzIHJlbGVhc2VzIGZvciBhCisgIGdpdmVuIGRpY3QuICBOb3RoaW5nIGlzIGRlZmluZWQgYWJvdXQgdGhpcyBvcmRlciwgc28gbm8gcHJvZ3JhbSBzaG91bGQKKyAgcmVseSBvbiBpdC4gIE5ldmVydGhlbGVzcywgaXQncyBlYXN5IHRvIHdyaXRlIHRlc3QgY2FzZXMgdGhhdCByZWx5IG9uIHRoZQorICBvcmRlciBieSBhY2NpZGVudCwgdHlwaWNhbGx5IGJlY2F1c2Ugb2YgcHJpbnRpbmcgdGhlIHN0cigpIG9yIHJlcHIoKSBvZiBhCisgIGRpY3QgdG8gYW4gImV4cGVjdGVkIHJlc3VsdHMiIGZpbGUuICBTZWUgTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5J3MgbmV3CisgIHNvcnRkaWN0KGRpY3QpIGZ1bmN0aW9uIGZvciBhIHNpbXBsZSB3YXkgdG8gZGlzcGxheSBhIGRpY3QgaW4gc29ydGVkCisgIG9yZGVyLgorCistIE1hbnkgb3RoZXIgc21hbGwgY2hhbmdlcyB0byBkaWN0cyB3ZXJlIG1hZGUsIHJlc3VsdGluZyBpbiBmYXN0ZXIKKyAgb3BlcmF0aW9uIGFsb25nIHRoZSBtb3N0IGNvbW1vbiBjb2RlIHBhdGhzLgorCistIERpY3Rpb25hcnkgb2JqZWN0cyBub3cgc3VwcG9ydCB0aGUgImluIiBvcGVyYXRvcjogInggaW4gZGljdCIgbWVhbnMKKyAgdGhlIHNhbWUgYXMgZGljdC5oYXNfa2V5KHgpLgorCistIFRoZSB1cGRhdGUoKSBtZXRob2Qgb2YgZGljdGlvbmFyaWVzIG5vdyBhY2NlcHRzIGdlbmVyaWMgbWFwcGluZworICBvYmplY3RzLiAgU3BlY2lmaWNhbGx5IHRoZSBhcmd1bWVudCBvYmplY3QgbXVzdCBzdXBwb3J0IHRoZSAua2V5cygpCisgIGFuZCBfX2dldGl0ZW1fXygpIG1ldGhvZHMuICBUaGlzIGFsbG93cyB5b3UgdG8gc2F5LCBmb3IgZXhhbXBsZSwKKyAge30udXBkYXRlKFVzZXJEaWN0KCkpCisKKy0gSXRlcmF0b3JzIHdlcmUgYWRkZWQ7IHRoaXMgaXMgYSBnZW5lcmFsaXplZCB3YXkgb2YgcHJvdmlkaW5nIHZhbHVlcworICB0byBhIGZvciBsb29wLiAgU2VlIFBFUCAyMzQuICBUaGVyZSdzIGEgbmV3IGJ1aWx0LWluIGZ1bmN0aW9uIGl0ZXIoKQorICB0byByZXR1cm4gYW4gaXRlcmF0b3IuICBUaGVyZSdzIGEgbmV3IHByb3RvY29sIHRvIGdldCB0aGUgbmV4dCB2YWx1ZQorICBmcm9tIGFuIGl0ZXJhdG9yIHVzaW5nIHRoZSBuZXh0KCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZQorICB0cF9pdGVybmV4dCBzbG90IChpbiBDKS4gIFRoZXJlJ3MgYSBuZXcgcHJvdG9jb2wgdG8gZ2V0IGl0ZXJhdG9ycworICB1c2luZyB0aGUgX19pdGVyX18oKSBtZXRob2QgKGluIFB5dGhvbikgb3IgdGhlIHRwX2l0ZXIgc2xvdCAoaW4gQykuCisgIEl0ZXJhdGluZyAoaS5lLiBhIGZvciBsb29wKSBvdmVyIGEgZGljdGlvbmFyeSBnZW5lcmF0ZXMgaXRzIGtleXMuCisgIEl0ZXJhdGluZyBvdmVyIGEgZmlsZSBnZW5lcmF0ZXMgaXRzIGxpbmVzLgorCistIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdlcmUgZ2VuZXJhbGl6ZWQgdG8gd29yayBuaWNlbHkgd2l0aCBpdGVyYXRvcgorICBhcmd1bWVudHM6OgorCisgICAgbWFwKCksIGZpbHRlcigpLCByZWR1Y2UoKSwgemlwKCkKKyAgICBsaXN0KCksIHR1cGxlKCkgKFB5U2VxdWVuY2VfVHVwbGUoKSBhbmQgUHlTZXF1ZW5jZV9GYXN0KCkgaW4gQyBBUEkpCisgICAgbWF4KCksIG1pbigpCisgICAgam9pbigpIG1ldGhvZCBvZiBzdHJpbmdzCisgICAgZXh0ZW5kKCkgbWV0aG9kIG9mIGxpc3RzCisgICAgJ3ggaW4geScgYW5kICd4IG5vdCBpbiB5JyAoUHlTZXF1ZW5jZV9Db250YWlucygpIGluIEMgQVBJKQorICAgIG9wZXJhdG9yLmNvdW50T2YoKSAoUHlTZXF1ZW5jZV9Db3VudCgpIGluIEMgQVBJKQorICAgIHJpZ2h0LWhhbmQgc2lkZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudHMgd2l0aCBtdWx0aXBsZSB0YXJnZXRzLCBzdWNoIGFzIDo6CisgICAgICAgIHgsIHksIHogPSBzb21lX2l0ZXJhYmxlX29iamVjdF9yZXR1cm5pbmdfZXhhY3RseV8zX3ZhbHVlcworCistIEFjY2Vzc2luZyBtb2R1bGUgYXR0cmlidXRlcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciAoZm9yIGV4YW1wbGUsCisgIHJhbmRvbS5yYW5kb20gb3Igb3MucGF0aCBvciB5b3VyUHl0aG9uTW9kdWxlLnlvdXJBdHRyaWJ1dGUpLgorCistIENvbXBhcmluZyBkaWN0aW9uYXJ5IG9iamVjdHMgdmlhID09IGFuZCAhPSBpcyBmYXN0ZXIsIGFuZCBub3cgd29ya3MgZXZlbgorICBpZiB0aGUga2V5cyBhbmQgdmFsdWVzIGRvbid0IHN1cHBvcnQgY29tcGFyaXNvbnMgb3RoZXIgdGhhbiA9PS4KKworLSBDb21wYXJpbmcgZGljdGlvbmFyaWVzIGluIHdheXMgb3RoZXIgdGhhbiA9PSBhbmQgIT0gaXMgc2xvd2VyOiAgdGhlcmUgd2VyZQorICBpbnNlY3VyaXRpZXMgaW4gdGhlIGRpY3QgY29tcGFyaXNvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGNvdWxkIGNhdXNlIFB5dGhvbgorICB0byBjcmFzaCBpZiB0aGUgZWxlbWVudCBjb21wYXJpc29uIHJvdXRpbmVzIGZvciB0aGUgZGljdCBrZXlzIGFuZC9vcgorICB2YWx1ZXMgbXV0YXRlZCB0aGUgZGljdHMuICBNYWtpbmcgdGhlIGNvZGUgYnVsbGV0cHJvb2Ygc2xvd2VkIGl0IGRvd24uCisKKy0gQ29sbGlzaW9ucyBpbiBkaWN0cyBhcmUgcmVzb2x2ZWQgdmlhIGEgbmV3IGFwcHJvYWNoLCB3aGljaCBjYW4gaGVscAorICBkcmFtYXRpY2FsbHkgaW4gYmFkIGNhc2VzLiAgRm9yIGV4YW1wbGUsIGxvb2tpbmcgdXAgZXZlcnkga2V5IGluIGEgZGljdAorICBkIHdpdGggZC5rZXlzKCkgPT0gW2kgPDwgMTYgZm9yIGkgaW4gcmFuZ2UoMjAwMDApXSBpcyBhcHByb3hpbWF0ZWx5IDUwMHgKKyAgZmFzdGVyIG5vdy4gIFRoYW5rcyB0byBDaHJpc3RpYW4gVGlzbWVyIGZvciBwb2ludGluZyBvdXQgdGhlIGNhdXNlIGFuZAorICB0aGUgbmF0dXJlIG9mIGFuIGVmZmVjdGl2ZSBjdXJlIChsYXN0IERlY2VtYmVyISBiZXR0ZXIgbGF0ZSB0aGFuIG5ldmVyKS4KKworLSByZXByKCkgaXMgbXVjaCBmYXN0ZXIgZm9yIGxhcmdlIGNvbnRhaW5lcnMgKGRpY3QsIGxpc3QsIHR1cGxlKS4KKworCitMaWJyYXJ5CistLS0tLS0tCisKKy0gVGhlIGNvbnN0YW50cyBhc2NpaV9sZXR0ZXJzLCBhc2NpaV9sb3dlcmNhc2UuIGFuZCBhc2NpaV91cHBlcmNhc2UKKyAgd2VyZSBhZGRlZCB0byB0aGUgc3RyaW5nIG1vZHVsZS4gIFRoZXNlIGEgbG9jYWxlLWluZGVwZW5kZW50CisgIGNvbnN0YW50cywgdW5saWtlIGxldHRlcnMsIGxvd2VyY2FzZSwgYW5kIHVwcGVyY2FzZS4gIFRoZXNlIGFyZSBub3cKKyAgdXNlIGluIGFwcHJvcHJpYXRlIGxvY2F0aW9ucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4KKworLSBUaGUgZmxhZ3MgdXNlZCBpbiBkbG9wZW4gY2FsbHMgY2FuIG5vdyBiZSBjb25maWd1cmVkIHVzaW5nCisgIHN5cy5zZXRkbG9wZW5mbGFncyBhbmQgcXVlcmllZCB1c2luZyBzeXMuZ2V0ZGxvcGVuZmxhZ3MuCisKKy0gRnJlZHJpayBMdW5kaCdzIHhtbHJwY2xpYiBpcyBub3cgYSBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZS4gIFRoaXMKKyAgcHJvdmlkZXMgZnVsbCBjbGllbnQtc2lkZSBYTUwtUlBDIHN1cHBvcnQuICBJbiBhZGRpdGlvbiwKKyAgRGVtby94bWxycGMvIGNvbnRhaW5zIHR3byBzZXJ2ZXIgZnJhbWV3b3JrcyAob25lIFNvY2tldFNlcnZlci1iYXNlZCwKKyAgb25lIGFzeW5jb3JlLWJhc2VkKS4gIFRoYW5rcyB0byBFcmljIFJheW1vbmQgZm9yIHRoZSBkb2N1bWVudGF0aW9uLgorCistIFRoZSB4cmFuZ2UoKSBvYmplY3QgaXMgc2ltcGxpZmllZDogaXQgbm8gbG9uZ2VyIHN1cHBvcnRzIHNsaWNpbmcsCisgIHJlcGV0aXRpb24sIGNvbXBhcmlzb25zLCBlZmZpY2llbnQgJ2luJyBjaGVja2luZywgdGhlIHRvbGlzdCgpCisgIG1ldGhvZCwgb3IgdGhlIHN0YXJ0LCBzdG9wIGFuZCBzdGVwIGF0dHJpYnV0ZXMuICBTZWUgUEVQIDI2MC4KKworLSBBIG5ldyBmdW5jdGlvbiBmbm1hdGNoLmZpbHRlciB0byBmaWx0ZXIgbGlzdHMgb2YgZmlsZSBuYW1lcyB3YXMgYWRkZWQuCisKKy0gY2FsZW5kYXIucHkgdXNlcyBtb250aCBhbmQgZGF5IG5hbWVzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxvY2FsZS4KKworLSBzdHJvcCBpcyBub3cgKnJlYWxseSogb2Jzb2xldGUgKHRoaXMgd2FzIGFubm91bmNlZCBiZWZvcmUgd2l0aCAxLjYpLAorICBhbmQgaXNzdWVzIERlcHJlY2F0aW9uV2FybmluZyB3aGVuIHVzZWQgKGV4Y2VwdCBmb3IgdGhlIGZvdXIgaXRlbXMKKyAgdGhhdCBhcmUgc3RpbGwgaW1wb3J0ZWQgaW50byBzdHJpbmcucHkpLgorCistIENvb2tpZS5weSBub3cgc29ydHMga2V5K3ZhbHVlIHBhaXJzIGJ5IGtleSBpbiBvdXRwdXQgc3RyaW5ncy4KKworLSBwcHJpbnQuaXNyZWN1cnNpdmUob2JqZWN0KSBkaWRuJ3QgY29ycmVjdGx5IGlkZW50aWZ5IHJlY3Vyc2l2ZSBvYmplY3RzLgorICBOb3cgaXQgZG9lcy4KKworLSBwcHJpbnQgZnVuY3Rpb25zIG5vdyBtdWNoIGZhc3RlciBmb3IgbGFyZ2UgY29udGFpbmVycyAodHVwbGUsIGxpc3QsIGRpY3QpLgorCistIE5ldyAncScgYW5kICdRJyBmb3JtYXQgY29kZXMgaW4gdGhlIHN0cnVjdCBtb2R1bGUsIGNvcnJlc3BvbmRpbmcgdG8gQworICB0eXBlcyAibG9uZyBsb25nIiBhbmQgInVuc2lnbmVkIGxvbmcgbG9uZyIgKG9uIFdpbmRvd3MsIF9faW50NjQpLiAgSW4KKyAgbmF0aXZlIG1vZGUsIHRoZXNlIGNhbiBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gQyBjb21waWxlciBzdXBwb3J0cworICB0aGVzZSB0eXBlcyAod2hlbiBIQVZFX0xPTkdfTE9ORyBpcyAjZGVmaW5lJ2QgYnkgdGhlIFB5dGhvbiBjb25maWcKKyAgcHJvY2VzcyksIGFuZCB0aGVuIHRoZXkgaW5oZXJpdCB0aGUgc2l6ZXMgYW5kIGFsaWdubWVudHMgb2YgdGhlIEMgdHlwZXMuCisgIEluIHN0YW5kYXJkIG1vZGUsICdxJyBhbmQgJ1EnIGFyZSBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcywgYW5kIGFyZQorICA4LWJ5dGUgaW50ZWdyYWwgdHlwZXMuCisKKy0gVGhlIHNpdGUgbW9kdWxlIGluc3RhbGxzIGEgbmV3IGJ1aWx0LWluIGZ1bmN0aW9uICdoZWxwJyB0aGF0IGludm9rZXMKKyAgcHlkb2MuaGVscC4gIEl0IG11c3QgYmUgaW52b2tlZCBhcyAnaGVscCgpJzsgd2hlbiBpbnZva2VkIGFzICdoZWxwJywKKyAgaXQgZGlzcGxheXMgYSBtZXNzYWdlIHJlbWluZGluZyB0aGUgdXNlciB0byB1c2UgJ2hlbHAoKScgb3IKKyAgJ2hlbHAob2JqZWN0KScuCisKK1Rlc3RzCistLS0tLQorCistIE5ldyB0ZXN0X211dGFudHMucHkgcnVucyBkaWN0IGNvbXBhcmlzb25zIHdoZXJlIHRoZSBrZXkgYW5kIHZhbHVlCisgIGNvbXBhcmlzb24gb3BlcmF0b3JzIG11dGF0ZSB0aGUgZGljdHMgcmFuZG9tbHkgZHVyaW5nIGNvbXBhcmlzb24uICBUaGlzCisgIHJhcGlkbHkgY2F1c2VzIFB5dGhvbiB0byBjcmFzaCB1bmRlciBlYXJsaWVyIHJlbGVhc2VzIChub3QgZm9yIHRoZSBmYWludAorICBvZiBoZWFydDogIGl0IGNhbiBhbHNvIGNhdXNlIFdpbjl4IHRvIGZyZWV6ZSBvciByZWJvb3QhKS4KKworLSBOZXcgdGVzdF9wcHJpbnQucHkgdmVyaWZpZXMgdGhhdCBwcHJpbnQuaXNyZWN1cnNpdmUoKSBhbmQKKyAgcHByaW50LmlzcmVhZGFibGUoKSByZXR1cm4gc2Vuc2libGUgcmVzdWx0cy4gIEFsc28gdmVyaWZpZXMgdGhhdCBzaW1wbGUKKyAgY2FzZXMgcHJvZHVjZSBjb3JyZWN0IG91dHB1dC4KKworQyBBUEkKKy0tLS0tCisKKy0gUmVtb3ZlZCB0aGUgdW51c2VkIGxhc3RfaXNfc3RpY2t5IGFyZ3VtZW50IGZyb20gdGhlIGludGVybmFsCisgIF9QeVR1cGxlX1Jlc2l6ZSgpLiAgSWYgdGhpcyBhZmZlY3RzIHlvdSwgeW91IHdlcmUgY2hlYXRpbmcuCisKIFdoYXQncyBOZXcgaW4gUHl0aG9uIDIuMSAoZmluYWwpPwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL01pc2MvUkVBRE1FLnZhbGdyaW5kIGIvTWlzYy9SRUFETUUudmFsZ3JpbmQKaW5kZXggMTU3YmRjMy4uYjVhOWEzMiAxMDA2NDQKLS0tIGEvTWlzYy9SRUFETUUudmFsZ3JpbmQKKysrIGIvTWlzYy9SRUFETUUudmFsZ3JpbmQKQEAgLTI0LDYgKzI0LDEyIEBACiB0aGUgbWVtb3J5IHVzYWdlIGRvd24gdG8gYWxsb3cgdGhlIHRlc3RzIHRvIGNvbXBsZXRlLiAgSXQgc2VlbXMgdG8gdGFrZQogYWJvdXQgNSB0aW1lcyBsb25nZXIgdG8gcnVuIC0td2l0aG91dC1weW1hbGxvYy4KIAorQXByIDE1LCAyMDA2OgorICB0ZXN0X2N0eXBlcyBjYXVzZXMgVmFsZ3JpbmQgMy4xLjEgdG8gZmFpbCAoY3Jhc2gpLgorICB0ZXN0X3NvY2tldF9zc2wgc2hvdWxkIGJlIHNraXBwZWQgd2hlbiBydW5uaW5nIHZhbGdyaW5kLgorCVRoZSByZWFzb24gaXMgdGhhdCBpdCBwdXJwb3NlbHkgdXNlcyB1bmluaXRpYWxpemVkIG1lbW9yeS4KKwlUaGlzIGNhdXNlcyBtYW55IHNwdXJpb3VzIHdhcm5pbmdzLCBzbyBpdCdzIGVhc2llciB0byBqdXN0IHNraXAgaXQuCisKIAogRGV0YWlsczoKIC0tLS0tLS0tCmRpZmYgLS1naXQgYS9NaXNjL1JQTS9weXRob24tMi40LnNwZWMgYi9NaXNjL1JQTS9weXRob24tMi41LnNwZWMKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTWlzYy9SUE0vcHl0aG9uLTIuNC5zcGVjCnJlbmFtZSB0byBNaXNjL1JQTS9weXRob24tMi41LnNwZWMKaW5kZXggYmQ0YzdmNy4uMzUxNTg1NiAxMDA2NDQKLS0tIGEvTWlzYy9SUE0vcHl0aG9uLTIuNC5zcGVjCisrKyBiL01pc2MvUlBNL3B5dGhvbi0yLjUuc3BlYwpAQCAtNiw3ICs2LDcgQEAKICMgICJweXRob24yIj8KICNXQVJOSU5HOiBDb21tZW50aW5nIG91dCBkb2Vzbid0IHdvcmsuICBMYXN0IGxpbmUgaXMgd2hhdCdzIHVzZWQuCiAlZGVmaW5lIGNvbmZpZ19iaW5zdWZmaXggbm9uZQotJWRlZmluZSBjb25maWdfYmluc3VmZml4IDIuNAorJWRlZmluZSBjb25maWdfYmluc3VmZml4IDIuNQogCiAjICBCdWlsZCB0a2ludGVyPyAgImF1dG8iIGVuYWJsZXMgaXQgaWYgL3Vzci9iaW4vd2lzaCBleGlzdHMuCiAjV0FSTklORzogQ29tbWVudGluZyBvdXQgZG9lc24ndCB3b3JrLiAgTGFzdCBsaW5lIGlzIHdoYXQncyB1c2VkLgpAQCAtMzMsOSArMzMsOSBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICVkZWZpbmUgbmFtZSBweXRob24KLSVkZWZpbmUgdmVyc2lvbiAyLjQKLSVkZWZpbmUgbGlidmVycyAyLjQKLSVkZWZpbmUgcmVsZWFzZSAycHlkb3RvcmcKKyVkZWZpbmUgdmVyc2lvbiAyLjVhMQorJWRlZmluZSBsaWJ2ZXJzIDIuNQorJWRlZmluZSByZWxlYXNlIDFweWRvdG9yZwogJWRlZmluZSBfX3ByZWZpeCAvdXNyCiAKICMgIGtsdWRnZSB0byBnZXQgYXJvdW5kIHJwbSA8cGVyY2VudD5kZWZpbmUgd2VpcmRuZXNzCkBAIC02Miw2ICs2Miw3IEBACiBCdWlsZFByZXJlcTogZXhwYXQtZGV2ZWwKIEJ1aWxkUHJlcmVxOiBkYjQtZGV2ZWwKIEJ1aWxkUHJlcmVxOiBnZGJtLWRldmVsCitCdWlsZFByZXJlcTogc3FsaXRlLWRldmVsCiBQcmVmaXg6ICV7X19wcmVmaXh9CiBQYWNrYWdlcjogU2VhbiBSZWlmc2NobmVpZGVyIDxqYWZvLXJwbXNAdHVtbXkuY29tPgogCkBAIC0zNTQsNiArMzU1LDggQEAKICV7X19wcmVmaXh9LyV7bGliZGlybmFtZX0vcHl0aG9uJXtsaWJ2ZXJzfS90ZXN0CiAle19fcHJlZml4fS8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30veG1sCiAle19fcHJlZml4fS8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30vZW1haWwKKyV7X19wcmVmaXh9LyV7bGliZGlybmFtZX0vcHl0aG9uJXtsaWJ2ZXJzfS9lbWFpbC9taW1lCisle19fcHJlZml4fS8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30vc3FsaXRlMwogJXtfX3ByZWZpeH0vJXtsaWJkaXJuYW1lfS9weXRob24le2xpYnZlcnN9L2NvbXBpbGVyCiAle19fcHJlZml4fS8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30vYnNkZGIKICV7X19wcmVmaXh9LyV7bGliZGlybmFtZX0vcHl0aG9uJXtsaWJ2ZXJzfS9ob3RzaG90CmRpZmYgLS1naXQgYS9NaXNjL1NwZWNpYWxCdWlsZHMudHh0IGIvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dAppbmRleCBhZTlhYjRjLi5lMGIzMzE1IDEwMDY0NAotLS0gYS9NaXNjL1NwZWNpYWxCdWlsZHMudHh0CisrKyBiL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQKQEAgLTEsOCArMSw4IEBACiBUaGlzIGZpbGUgZGVzY3JpYmVzIHNvbWUgc3BlY2lhbCBQeXRob24gYnVpbGQgdHlwZXMgZW5hYmxlZCB2aWEKIGNvbXBpbGUtdGltZSBwcmVwcm9jZXNzb3IgZGVmaW5lcy4KIAotSXQgaXMgYmVzdCB0byBkZWZpbmUgdGhlc2Ugb3B0aW9ucyBpbiB0aGUgRVhUUkFfQ0ZMQUdTIGVudmlyb25tZW50IHZhcmlhYmxlOwotYGBFWFRSQV9DRkxBR1M9Ii1EUHlfUkVGX0RFQlVHIiAuL2NvbmZpZ3VyZWBgLgorSXQgaXMgYmVzdCB0byBkZWZpbmUgdGhlc2Ugb3B0aW9ucyBpbiB0aGUgRVhUUkFfQ0ZMQUdTIG1ha2UgdmFyaWFibGU7CitgYG1ha2UgRVhUUkFfQ0ZMQUdTPSItRFB5X1JFRl9ERUJVRyJgYC4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBQeV9SRUZfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm9kdWNlZCBpbiAxLjQKZGlmZiAtLWdpdCBhL01pc2MvYnVpbGQuc2ggYi9NaXNjL2J1aWxkLnNoCmluZGV4IDNjNjY5YTAuLmRlNTE1MzkgMTAwNzU1Ci0tLSBhL01pc2MvYnVpbGQuc2gKKysrIGIvTWlzYy9idWlsZC5zaApAQCAtNTUsMTMgKzU1LDIxIEBACiBSU1lOQ19PUFRTPSItYUMgLWUgc3NoIgogCiBSRUZMT0c9ImJ1aWxkL3JlZmxvZy50eHQub3V0IgotIyBUaGVzZSB0ZXN0cyBhcmUgbm90IHN0YWJsZSBhbmQgc29tZXRpbWVzIHJlcG9ydCBsZWFrczsgaG93ZXZlciwKLSMgdGVzdF9nZW5lcmF0b3JzIHJlYWxseSBsZWFrcy4gIFNpbmNlIHRlc3RfZ2VuZXJhdG9ycyBwcm9iYWJseSB3b24ndAotIyBiZSBmaXhlZCByZWFsIHNvb24sIGRpc2FibGUgd2FybmluZyBhYm91dCBpdCBmb3Igbm93LgorIyBUaGVzZSB0ZXN0cyBhcmUgbm90IHN0YWJsZSBhbmQgZmFsc2VseSByZXBvcnQgbGVha3Mgc29tZXRpbWVzLgogIyBUaGUgZW50aXJlIGxlYWsgcmVwb3J0IHdpbGwgYmUgbWFpbGVkIGlmIGFueSB0ZXN0IG5vdCBpbiB0aGlzIGxpc3QgbGVha3MuCi1MRUFLWV9URVNUUz0idGVzdF8oY2FwaXxjZmdwYXJzZXJ8Y2hhcm1hcGNvZGVjfGNtZF9saW5lfGNvbXBpbGVyfGZpbGVjbXB8Z2VuZXJhdG9yc3xxdW9wcml8c29ja2V0fHRocmVhZGVkX2ltcG9ydHx0aHJlYWRlZHRlbXBmaWxlfHRocmVhZGluZ3x0aHJlYWRpbmdfbG9jYWx8dXJsbGliMikiCisjIE5vdGU6IHRlc3RfWFhYIChub25lIGN1cnJlbnRseSkgcmVhbGx5IGxlYWssIGJ1dCBhcmUgZGlzYWJsZWQKKyMgc28gd2UgZG9uJ3Qgc2VuZCBzcGFtLiAgQW55IHRlc3Qgd2hpY2ggcmVhbGx5IGxlYWtzIHNob3VsZCBvbmx5IAorIyBiZSBsaXN0ZWQgaGVyZSBpZiB0aGVyZSBhcmUgYWxzbyB0ZXN0IGNhc2VzIHVuZGVyIExpYi90ZXN0L2xlYWtlcnMuCitMRUFLWV9URVNUUz0idGVzdF8oY3R5cGVzfGZpbGVjbXB8c29ja2V0fHRocmVhZGVkdGVtcGZpbGV8dGhyZWFkaW5nfHVybGxpYjIpIgogCi0jIENoYW5nZSB0aGlzIGZsYWcgdG8gInllcyIgZm9yIG9sZCByZWxlYXNlcyB0byBqdXN0IHVwZGF0ZS9idWlsZCB0aGUgZG9jcy4KKyMgU2tpcCB0aGVzZSB0ZXN0cyBhbHRvZ2V0aGVyIHdoZW4gbG9va2luZyBmb3IgbGVha3MuICBUaGVzZSB0ZXN0cworIyBkbyBub3QgbmVlZCB0byBiZSBzdG9yZWQgYWJvdmUgaW4gTEVBS1lfVEVTVFMgdG9vLgorIyB0ZXN0X2NvbXBpbGVyIGFsbW9zdCBuZXZlciBmaW5pc2hlcyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiByZWZzCisjIHNpbmNlIGl0IGRlcGVuZHMgb24gb3RoZXIgbW9kdWxlcywgc2tpcCBpdC4KKyMgdGVzdF9sb2dnaW5nIGNhdXNlcyBoYW5ncywgc2tpcCBpdC4KK0xFQUtZX1NLSVBTPSIteCB0ZXN0X2NvbXBpbGVyIHRlc3RfbG9nZ2luZyIKKworIyBDaGFuZ2UgdGhpcyBmbGFnIHRvICJ5ZXMiIGZvciBvbGQgcmVsZWFzZXMgdG8gb25seSB1cGRhdGUvYnVpbGQgdGhlIGRvY3MuCiBCVUlMRF9ESVNBQkxFRD0ibm8iCiAKICMjIHV0aWxpdHkgZnVuY3Rpb25zCkBAIC0xNTksNyArMTY3LDkgQEAKICAgICAgICAgICAgICMjIHJ1biB0aGUgdGVzdHMgbG9va2luZyBmb3IgbGVha3MKICAgICAgICAgICAgIEY9bWFrZS10ZXN0LXJlZmxlYWsub3V0CiAgICAgICAgICAgICBzdGFydD1gY3VycmVudF90aW1lYAotICAgICAgICAgICAgLi9weXRob24gLi9MaWIvdGVzdC9yZWdydGVzdC5weSAtUiA0OjM6JFJFRkxPRyAtdSBuZXR3b3JrID4mIGJ1aWxkLyRGCisgICAgICAgICAgICAjIyBlbnN1cmUgdGhhdCB0aGUgcmVmbG9nIGV4aXN0cyBzbyB0aGUgZ3JlcCBkb2Vzbid0IGZhaWwKKyAgICAgICAgICAgIHRvdWNoICRSRUZMT0cKKyAgICAgICAgICAgIC4vcHl0aG9uIC4vTGliL3Rlc3QvcmVncnRlc3QucHkgLVIgNDozOiRSRUZMT0cgLXUgbmV0d29yayAkTEVBS1lfU0tJUFMgPiYgYnVpbGQvJEYKICAgICAgICAgICAgIE5VTV9GQUlMVVJFUz1gZWdyZXAgLXZjICIkTEVBS1lfVEVTVFMiICRSRUZMT0dgCiAgICAgICAgICAgICB1cGRhdGVfc3RhdHVzICJUZXN0aW5nIHJlZmxlYWtzICgkTlVNX0ZBSUxVUkVTIGZhaWx1cmVzKSIgIiRGIiAkc3RhcnQKICAgICAgICAgICAgIG1haWxfb25fZmFpbHVyZSAicmVmbGVhayIgJFJFRkxPRwpkaWZmIC0tZ2l0IGEvTWlzYy9jaGVhdHNoZWV0IGIvTWlzYy9jaGVhdHNoZWV0CmluZGV4IGI4ZGU0MjgxLi4wMjQ1NDVkIDEwMDY0NAotLS0gYS9NaXNjL2NoZWF0c2hlZXQKKysrIGIvTWlzYy9jaGVhdHNoZWV0CkBAIC0xOTQ2LDggKzE5NDYsNiBAQAogcmFuZCAgICAgICAgICAgICBEb24ndCB1c2UgdW5sZXNzIHlvdSB3YW50IGNvbXBhdGliaWxpdHkgd2l0aCBDJ3MgcmFuZCgpLgogcmFuZG9tICAgICAgICAgICBSYW5kb20gdmFyaWFibGUgZ2VuZXJhdG9ycwogcmUgICAgICAgICAgICAgICBSZWd1bGFyIEV4cHJlc3Npb25zLgotcmVjb252ZXJ0ICAgICAgICBDb252ZXJ0IG9sZCAoInJlZ2V4IikgcmVndWxhciBleHByZXNzaW9ucyB0byBuZXcgc3ludGF4Ci0gICAgICAgICAgICAgICAgICgicmUiKS4KIHJlcHIgICAgICAgICAgICAgUmVkbyByZXByKCkgYnV0IHdpdGggbGltaXRzIG9uIG1vc3Qgc2l6ZXMuCiByZXhlYyAgICAgICAgICAgIFJlc3RyaWN0ZWQgZXhlY3V0aW9uIGZhY2lsaXRpZXMgKCJzYWZlIiBleGVjLCBldmFsLCBldGMpLgogcmZjODIyICAgICAgICAgICBSRkMtODIyIG1lc3NhZ2UgbWFuaXB1bGF0aW9uIGNsYXNzLgpAQCAtMjAyNSw3ICsyMDIzLDYgQEAKICAgICAgICAgICAgIGFycmF5ICAgICAgICAgICAgICAgT2JqIGVmZmljaWVudGx5IHJlcHJlc2VudGluZyBhcnJheXMgb2YgYmFzaWMgdmFsdWVzCiAgICAgICAgICAgICBtYXRoICAgICAgICAgICAgICAgIE1hdGggZnVuY3Rpb25zIG9mIEMgc3RhbmRhcmQKICAgICAgICAgICAgIHRpbWUgICAgICAgICAgICAgICAgVGltZS1yZWxhdGVkIGZ1bmN0aW9ucyAoYWxzbyB0aGUgbmV3ZXIgZGF0ZXRpbWUgbW9kdWxlKQotICAgICAgICAgICAgcmVnZXggICAgICAgICAgICAgICBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgb3BlcmF0aW9ucwogICAgICAgICAgICAgbWFyc2hhbCAgICAgICAgICAgICBSZWFkIGFuZCB3cml0ZSBzb21lIHB5dGhvbiB2YWx1ZXMgaW4gYmluYXJ5IGZvcm1hdAogICAgICAgICAgICAgc3RydWN0ICAgICAgICAgICAgICBDb252ZXJ0IGJldHdlZW4gcHl0aG9uIHZhbHVlcyBhbmQgQyBzdHJ1Y3RzCiAKZGlmZiAtLWdpdCBhL01pc2MvZGV2ZWxvcGVycy50eHQgYi9NaXNjL2RldmVsb3BlcnMudHh0CmluZGV4IGMzZGMzMDYuLmZmODQ3MGUgMTAwNjQ0Ci0tLSBhL01pc2MvZGV2ZWxvcGVycy50eHQKKysrIGIvTWlzYy9kZXZlbG9wZXJzLnR4dApAQCAtMTcsNiArMTcsMTIgQEAKIFBlcm1pc3Npb25zIEhpc3RvcnkKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAorLSBHZW9yZ2UgWW9zaGlkYSAoU0YgbmFtZSAicXVpdmVyIikgYWRkZWQgdG8gdGhlIFNvdXJjZUZvcmdlIFB5dGhvbgorICBwcm9qZWN0IDE0IEFwciAyMDA2LCBieSBUaW0gUGV0ZXJzLCBhcyBhIHRyYWNrZXIgYWRtaW4uICBTZWUKKyAgY29udGVtcG9yYW5lb3VzIHB5dGhvbi1jaGVja2lucyB0aHJlYWQgd2l0aCB0aGUgdW5saWtlbHkgU3ViamVjdDoKKworICAgICAgcjQ1MzI5IC0gcHl0aG9uL3RydW5rL0RvYy93aGF0c25ldy93aGF0c25ldzI1LnRleAorCiAtIFJvbmFsZCBPdXNzb3JlbiB3YXMgZ2l2ZW4gU1ZOIGFjY2VzcyBvbiAzIE1hciAyMDA2IGJ5IE5DTiwgZm9yIE1hYwogICByZWxhdGVkIHdvcmsuCiAKZGlmZiAtLWdpdCBhL01pc2MvcHl0aG9uLWNvbmZpZy5pbiBiL01pc2MvcHl0aG9uLWNvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU2OTllCi0tLSAvZGV2L251bGwKKysrIGIvTWlzYy9weXRob24tY29uZmlnLmluCkBAIC0wLDAgKzEsNTAgQEAKKyMhQEJJTkRJUkAvcHl0aG9uCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IGdldG9wdAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZworCit2YWxpZF9vcHRzID0gWydwcmVmaXgnLCAnZXhlYy1wcmVmaXgnLCAnaW5jbHVkZXMnLCAnbGlicycsICdjZmxhZ3MnLCAKKyAgICAgICAgICAgICAgJ2xkZmxhZ3MnLCAnaGVscCddCisKK2RlZiBleGl0X3dpdGhfdXNhZ2UoY29kZT0xKToKKyAgICBwcmludCA+PnN5cy5zdGRlcnIsICJVc2FnZTogJXMgWyVzXSIgJSAoc3lzLmFyZ3ZbMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcuam9pbignLS0nK29wdCBmb3Igb3B0IGluIHZhbGlkX29wdHMpKQorICAgIHN5cy5leGl0KGNvZGUpCisKK3RyeToKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICcnLCB2YWxpZF9vcHRzKQorZXhjZXB0IGdldG9wdC5lcnJvcjoKKyAgICBleGl0X3dpdGhfdXNhZ2UoKQorCitpZiBub3Qgb3B0czoKKyAgICBleGl0X3dpdGhfdXNhZ2UoKQorCitvcHQgPSBvcHRzWzBdWzBdCisKK3B5dmVyID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdWRVJTSU9OJykKK2dldHZhciA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcgorCitpZiBvcHQgPT0gJy0taGVscCc6CisgICAgZXhpdF93aXRoX3VzYWdlKDApCisKK2VsaWYgb3B0ID09ICctLXByZWZpeCc6CisgICAgcHJpbnQgc3lzY29uZmlnLlBSRUZJWAorCitlbGlmIG9wdCA9PSAnLS1leGVjLXByZWZpeCc6CisgICAgcHJpbnQgc3lzY29uZmlnLkVYRUNfUFJFRklYCisKK2VsaWYgb3B0IGluICgnLS1pbmNsdWRlcycsICctLWNmbGFncycpOgorICAgIGZsYWdzID0gWyctSScrZGlyIGZvciBkaXIgaW4gZ2V0dmFyKCdJTkNMRElSU1RPTUFLRScpLnNwbGl0KCldCisgICAgaWYgb3B0ID09ICctLWNmbGFncyc6CisgICAgICAgIGZsYWdzLmV4dGVuZChnZXR2YXIoJ0NGTEFHUycpLnNwbGl0KCkpCisgICAgcHJpbnQgJyAnLmpvaW4oZmxhZ3MpCisKK2VsaWYgb3B0IGluICgnLS1saWJzJywgJy0tbGRmbGFncycpOgorICAgIGxpYnMgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0xJQlMnKS5zcGxpdCgpCisgICAgbGlicy5hcHBlbmQoJy1scHl0aG9uJytweXZlcikKKyAgICBpZiBvcHQgPT0gJy0tbGRmbGFncyc6CisgICAgICAgIGxpYnMuaW5zZXJ0KDAsICctTCcgKyBnZXR2YXIoJ0xJQlBMJykpCisgICAgcHJpbnQgJyAnLmpvaW4obGlicykKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9TZXR1cC5kaXN0IGIvTW9kdWxlcy9TZXR1cC5kaXN0CmluZGV4IDNhNTEyYjUuLjQ5Yzg0MjUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvU2V0dXAuZGlzdAorKysgYi9Nb2R1bGVzL1NldHVwLmRpc3QKQEAgLTIzNiw5ICsyMzYsOSBAQAogCiAjIFRoZSBtZDUgbW9kdWxlIGltcGxlbWVudHMgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENQogIyBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0sIGRlc2NyaWJlZCBpbiBSRkMgMTMyMS4gIFRoZSBuZWNlc3NhcnkgZmlsZXMKLSMgbWQ1Yy5jIGFuZCBtZDUuaCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMgbWQ1LmMgYW5kIG1kNS5oIGFyZSBpbmNsdWRlZCBoZXJlLgogCi0jbWQ1IG1kNW1vZHVsZS5jIG1kNWMuYworI21kNSBtZDVtb2R1bGUuYyBtZDUuYwogCiAKICMgVGhlIHNoYSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgU0hBIGNoZWNrc3VtIGFsZ29yaXRobS4KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JzZGRiLmMgYi9Nb2R1bGVzL19ic2RkYi5jCmluZGV4IDhlOWVjMGYuLjE2NDFlMjAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2JzZGRiLmMKKysrIGIvTW9kdWxlcy9fYnNkZGIuYwpAQCAtMTAxLDYgKzEwMSwxMCBAQAogc3RhdGljIGNoYXIgKnJjc19pZCA9ICIkSWQkIjsKIAogCisjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKKyNkZWZpbmUgUHlfc3NpemVfdCAgICAgIGludAorI2VuZGlmCisKICNpZmRlZiBXSVRIX1RIUkVBRAogCiAvKiBUaGVzZSBhcmUgZm9yIHdoZW4gY2FsbGluZyBQeXRob24gLS0+IEMgKi8KQEAgLTQ2ODgsNyArNDY5MiwxMSBAQAogCiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIERCX21hcHBpbmcgPSB7CisjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKKyAgICAgICAgKGlucXVpcnkpREJfbGVuZ3RoLCAgICAgICAgICAvKm1wX2xlbmd0aCovCisjZWxzZQogICAgICAgICAobGVuZnVuYylEQl9sZW5ndGgsICAgICAgICAgIC8qbXBfbGVuZ3RoKi8KKyNlbmRpZgogICAgICAgICAoYmluYXJ5ZnVuYylEQl9zdWJzY3JpcHQsICAgIC8qbXBfc3Vic2NyaXB0Ki8KICAgICAgICAgKG9iam9iamFyZ3Byb2MpREJfYXNzX3N1YiwgICAvKm1wX2Fzc19zdWJzY3JpcHQqLwogfTsKQEAgLTUzODUsOSArNTM5MywyMSBAQAogICAgIEFERF9JTlQoZCwgREJfU0VUX1RYTl9USU1FT1VUKTsKICNlbmRpZgogCisgICAgLyogVGhlIGV4Y2VwdGlvbiBuYW1lIG11c3QgYmUgY29ycmVjdCBmb3IgcGlja2xlZCBleGNlcHRpb24gKgorICAgICAqIG9iamVjdHMgdG8gdW5waWNrbGUgcHJvcGVybHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgUFlCU0REQl9TVEFOREFMT05FICAvKiBkaWZmZXJlbnQgdmFsdWUgbmVlZGVkIGZvciBzdGFuZGFsb25lIHB5YnNkZGIgKi8KKyNkZWZpbmUgUFlCU0REQl9FWENFUFRJT05fQkFTRSAgImJzZGRiMy5kYi4iCisjZWxzZQorI2RlZmluZSBQWUJTRERCX0VYQ0VQVElPTl9CQVNFICAiYnNkZGIuZGIuIgorI2VuZGlmCisKKyAgICAvKiBBbGwgdGhlIHJlc3Qgb2YgdGhlIGV4Y2VwdGlvbnMgZGVyaXZlIG9ubHkgZnJvbSBEQkVycm9yICovCisjZGVmaW5lIE1BS0VfRVgobmFtZSkgICBuYW1lID0gUHlFcnJfTmV3RXhjZXB0aW9uKFBZQlNEREJfRVhDRVBUSU9OX0JBU0UgI25hbWUsIERCRXJyb3IsIE5VTEwpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAjbmFtZSwgbmFtZSkKKwogICAgIC8qIFRoZSBiYXNlIGV4Y2VwdGlvbiBjbGFzcyBpcyBEQkVycm9yICovCi0gICAgREJFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYnNkZGIuX2RiLkRCRXJyb3IiLCBOVUxMLCBOVUxMKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREJFcnJvciIsIERCRXJyb3IpOworICAgIERCRXJyb3IgPSBOVUxMOyAgICAgLyogdXNlZCBpbiBNQUtFX0VYIHNvIHRoYXQgaXQgZGVyaXZlcyBmcm9tIG5vdGhpbmcgKi8KKyAgICBNQUtFX0VYKERCRXJyb3IpOwogCiAgICAgLyogU29tZSBtYWdpYyB0byBtYWtlIERCTm90Rm91bmRFcnJvciBhbmQgREJLZXlFbXB0eUVycm9yIGRlcml2ZQogICAgICAqIGZyb20gYm90aCBEQkVycm9yIGFuZCBLZXlFcnJvciwgc2luY2UgdGhlIEFQSSBvbmx5IHN1cHBvcnRzCkBAIC01NDAxLDEwICs1NDIxLDYgQEAKICAgICBQeURpY3RfRGVsSXRlbVN0cmluZyhkLCAiS2V5RXJyb3IiKTsKIAogCi0gICAgLyogQWxsIHRoZSByZXN0IG9mIHRoZSBleGNlcHRpb25zIGRlcml2ZSBvbmx5IGZyb20gREJFcnJvciAqLwotI2RlZmluZSBNQUtFX0VYKG5hbWUpICAgbmFtZSA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYnNkZGIuX2RiLiIgI25hbWUsIERCRXJyb3IsIE5VTEwpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAjbmFtZSwgbmFtZSkKLQogI2lmICFJTkNPTVBMRVRFX0lTX1dBUk5JTkcKICAgICBNQUtFX0VYKERCSW5jb21wbGV0ZUVycm9yKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3N2LmMgYi9Nb2R1bGVzL19jc3YuYwppbmRleCA0NjljZDY0Li40NzA0YzE2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jc3YuYworKysgYi9Nb2R1bGVzL19jc3YuYwpAQCAtMzcsNiArMzcsMjggQEAKICMJCWRlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCiAjCWVuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAjZW5kaWYKKworI2lmbmRlZiBQeV9DTEVBUgorI2RlZmluZSBQeV9DTEVBUihvcCkJCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmIChvcCkgewkJCQkJXAorCQkJUHlPYmplY3QgKnRtcCA9IChQeU9iamVjdCAqKShvcCk7CVwKKwkJCShvcCkgPSBOVUxMOwkJCQlcCisJCQlQeV9ERUNSRUYodG1wKTsJCQkJXAorCQl9CQkJCQkJXAorCX0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgUHlfVklTSVQKKyNkZWZpbmUgUHlfVklTSVQob3ApCQkJCQkJCVwKKyAgICAgICAgZG8geyAJCQkJCQkJCVwKKyAgICAgICAgICAgICAgICBpZiAob3ApIHsJCQkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnJldCA9IHZpc2l0KChQeU9iamVjdCAqKShvcCksIGFyZyk7CVwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cmV0KQkJCQkJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsJCQkJXAorICAgICAgICAgICAgICAgIH0JCQkJCQkJXAorICAgICAgICB9IHdoaWxlICgwKQorI2VuZGlmCisKIC8qIGVuZCAyLjIgY29tcGF0aWJpbGl0eSBtYWNyb3MgKi8KIAogI2RlZmluZSBJU19CQVNFU1RSSU5HKG8pIFwKQEAgLTgxMiwyOCArODM0LDE4IEBACiBzdGF0aWMgaW50CiBSZWFkZXJfdHJhdmVyc2UoUmVhZGVyT2JqICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpbnQgZXJyOwotI2RlZmluZSBWSVNJVChTTE9UKSBcCi0JaWYgKFNMT1QpIHsgXAotCQllcnIgPSB2aXNpdCgoUHlPYmplY3QgKikoU0xPVCksIGFyZyk7IFwKLQkJaWYgKGVycikgXAotCQkJcmV0dXJuIGVycjsgXAotCX0KLQlWSVNJVChzZWxmLT5kaWFsZWN0KTsKLQlWSVNJVChzZWxmLT5pbnB1dF9pdGVyKTsKLQlWSVNJVChzZWxmLT5maWVsZHMpOworCVB5X1ZJU0lUKHNlbGYtPmRpYWxlY3QpOworCVB5X1ZJU0lUKHNlbGYtPmlucHV0X2l0ZXIpOworCVB5X1ZJU0lUKHNlbGYtPmZpZWxkcyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFJlYWRlcl9jbGVhcihSZWFkZXJPYmogKnNlbGYpCiB7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZGlhbGVjdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+aW5wdXRfaXRlcik7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZmllbGRzKTsKLSAgICAgICAgc2VsZi0+ZGlhbGVjdCA9IE5VTEw7Ci0gICAgICAgIHNlbGYtPmlucHV0X2l0ZXIgPSBOVUxMOwotICAgICAgICBzZWxmLT5maWVsZHMgPSBOVUxMOworCVB5X0NMRUFSKHNlbGYtPmRpYWxlY3QpOworCVB5X0NMRUFSKHNlbGYtPmlucHV0X2l0ZXIpOworCVB5X0NMRUFSKHNlbGYtPmZpZWxkcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNDUsMjUgKzEyNTcsMTYgQEAKIHN0YXRpYyBpbnQKIFdyaXRlcl90cmF2ZXJzZShXcml0ZXJPYmogKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWludCBlcnI7Ci0jZGVmaW5lIFZJU0lUKFNMT1QpIFwKLQlpZiAoU0xPVCkgeyBcCi0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKShTTE9UKSwgYXJnKTsgXAotCQlpZiAoZXJyKSBcCi0JCQlyZXR1cm4gZXJyOyBcCi0JfQotCVZJU0lUKHNlbGYtPmRpYWxlY3QpOwotCVZJU0lUKHNlbGYtPndyaXRlbGluZSk7CisJUHlfVklTSVQoc2VsZi0+ZGlhbGVjdCk7CisJUHlfVklTSVQoc2VsZi0+d3JpdGVsaW5lKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogV3JpdGVyX2NsZWFyKFdyaXRlck9iaiAqc2VsZikKIHsKLSAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5kaWFsZWN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihzZWxmLT53cml0ZWxpbmUpOwotCXNlbGYtPmRpYWxlY3QgPSBOVUxMOwotCXNlbGYtPndyaXRlbGluZSA9IE5VTEw7CisJUHlfQ0xFQVIoc2VsZi0+ZGlhbGVjdCk7CisJUHlfQ0xFQVIoc2VsZi0+d3JpdGVsaW5lKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ5NSw3ICsxNDk4LDcgQEAKIFB5RG9jX1NUUlZBUihjc3Zfd3JpdGVyX2RvYywKICIgICAgY3N2X3dyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiBbLCBkaWFsZWN0PSdleGNlbCddXG4iCiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25hbCBrZXl3b3JkIGFyZ3NdKVxuIgotIiAgICBmb3Igcm93IGluIGNzdl93cml0ZXI6XG4iCisiICAgIGZvciByb3cgaW4gc2VxdWVuY2U6XG4iCiAiICAgICAgICBjc3Zfd3JpdGVyLndyaXRlcm93KHJvdylcbiIKICJcbiIKICIgICAgW29yXVxuIgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKaW5kZXggOTI2Yzg1Yi4uZTZkNmFhNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCkBAIC0xMDUsNiArMTA1LDEwIEBACiAjaW5jbHVkZSA8ZmZpLmg+CiAjaWZkZWYgTVNfV0lOMzIKICNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaWZuZGVmIElTX0lOVFJFU09VUkNFCisjZGVmaW5lIElTX0lOVFJFU09VUkNFKHgpICgoKHNpemVfdCkoeCkgPj4gMTYpID09IDApCisjZW5kaWYKICMgaWZkZWYgX1dJTjMyX1dDRQogLyogVW5saWtlIGRlc2t0b3AgV2luZG93cywgV2luQ0UgaGFzIGJvdGggVyBhbmQgQSB2YXJpYW50cyBvZgogICAgR2V0UHJvY0FkZHJlc3MsIGJ1dCB0aGUgZGVmYXVsdCBXIHZlcnNpb24gaXMgbm90IHdoYXQgd2Ugd2FudCAqLwpAQCAtMjg1LDYgKzI4OSw3IEBACiAJaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgewogCQlQeUNBcmdPYmplY3QgKnAgPSAoUHlDQXJnT2JqZWN0ICopdmFsdWU7CiAJCVB5T2JqZWN0ICpvYiA9IHAtPm9iajsKKwkJY29uc3QgY2hhciAqb2JfbmFtZTsKIAkJU3RnRGljdE9iamVjdCAqZGljdDsKIAkJZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwogCkBAIC0yOTYsMTAgKzMwMSwxMCBAQAogCQkJUHlfSU5DUkVGKHZhbHVlKTsKIAkJCXJldHVybiB2YWx1ZTsKIAkJfQorCQlvYl9uYW1lID0gKG9iKSA/IG9iLT5vYl90eXBlLT50cF9uYW1lIDogIj8/PyI7CiAJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCiAJCQkgICAgICJleHBlY3RlZCAlcyBpbnN0YW5jZSBpbnN0ZWFkIG9mIHBvaW50ZXIgdG8gJXMiLAotCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLAotCQkJICAgICBvYi0+b2JfdHlwZS0+dHBfbmFtZSk7CisJCQkgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUsIG9iX25hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAjaWYgMQpAQCAtNTA2LDEyICs1MTEsMTIgQEAKIHN0YXRpYyBpbnQKIFBvaW50ZXJUeXBlX1NldFByb3RvKFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsIFB5T2JqZWN0ICpwcm90bykKIHsKLQlpZiAocHJvdG8gJiYgIVB5VHlwZV9DaGVjayhwcm90bykpIHsKKwlpZiAoIXByb3RvIHx8ICFQeVR5cGVfQ2hlY2socHJvdG8pKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJIl90eXBlXyBtdXN0IGJlIGEgdHlwZSIpOwogCQlyZXR1cm4gLTE7CiAJfQotCWlmIChwcm90byAmJiAhUHlUeXBlX3N0Z2RpY3QocHJvdG8pKSB7CisJaWYgKCFQeVR5cGVfc3RnZGljdChwcm90bykpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCQkiX3R5cGVfIG11c3QgaGF2ZSBzdG9yYWdlIGluZm8iKTsKIAkJcmV0dXJuIC0xOwpAQCAtNTQzLDggKzU0OCw4IEBACiAJCXJldHVybiBOVUxMOwogCXN0Z2RpY3QtPnNpemUgPSBzaXplb2Yodm9pZCAqKTsKIAlzdGdkaWN0LT5hbGlnbiA9IGdldGVudHJ5KCJQIiktPnBmZmlfdHlwZS0+YWxpZ25tZW50OwotCXN0Z2RpY3QtPmxlbmd0aCA9IDI7Ci0Jc3RnZGljdC0+ZmZpX3R5cGUgPSBmZmlfdHlwZV9wb2ludGVyOworCXN0Z2RpY3QtPmxlbmd0aCA9IDE7CisJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9IGZmaV90eXBlX3BvaW50ZXI7CiAKIAlwcm90byA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGVkaWN0LCAiX3R5cGVfIik7IC8qIEJvcnJvd2VkIHJlZiAqLwogCWlmIChwcm90byAmJiAtMSA9PSBQb2ludGVyVHlwZV9TZXRQcm90byhzdGdkaWN0LCBwcm90bykpIHsKQEAgLTg5OSw3ICs5MDQsNyBAQAogCVB5T2JqZWN0ICp0eXBlZGljdDsKIAlpbnQgbGVuZ3RoOwogCi0JaW50IGl0ZW1zaXplLCBpdGVtYWxpZ24sIGl0ZW1sZW47CisJaW50IGl0ZW1zaXplLCBpdGVtYWxpZ247CiAKIAl0eXBlZGljdCA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAyKTsKIAlpZiAoIXR5cGVkaWN0KQpAQCAtOTM2LDcgKzk0MSw2IEBACiAKIAlpdGVtc2l6ZSA9IGl0ZW1kaWN0LT5zaXplOwogCWl0ZW1hbGlnbiA9IGl0ZW1kaWN0LT5hbGlnbjsKLQlpdGVtbGVuID0gaXRlbWRpY3QtPmxlbmd0aDsKIAogCXN0Z2RpY3QtPnNpemUgPSBpdGVtc2l6ZSAqIGxlbmd0aDsKIAlzdGdkaWN0LT5hbGlnbiA9IGl0ZW1hbGlnbjsKQEAgLTk0NSw3ICs5NDksNyBAQAogCXN0Z2RpY3QtPnByb3RvID0gcHJvdG87CiAKIAkvKiBBcnJheXMgYXJlIHBhc3NlZCBhcyBwb2ludGVycyB0byBmdW5jdGlvbiBjYWxscy4gKi8KLQlzdGdkaWN0LT5mZmlfdHlwZSA9IGZmaV90eXBlX3BvaW50ZXI7CisJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9IGZmaV90eXBlX3BvaW50ZXI7CiAKIAkvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKIAkgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCkBAIC0xMjY0LDkgKzEyNjgsMTMgQEAKIAlQeVR5cGVPYmplY3QgKnJlc3VsdDsKIAlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwogCVB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlQeU9iamVjdCAqc3dhcHBlZF9hcmdzID0gUHlUdXBsZV9OZXcoUHlUdXBsZV9HRVRfU0laRShhcmdzKSk7CisJUHlPYmplY3QgKnN3YXBwZWRfYXJnczsKIAlzdGF0aWMgUHlPYmplY3QgKnN1ZmZpeDsKLQlpbnQgaTsKKwlQeV9zc2l6ZV90IGk7CisKKwlzd2FwcGVkX2FyZ3MgPSBQeVR1cGxlX05ldyhQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKTsKKwlpZiAoIXN3YXBwZWRfYXJncykKKwkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoc3VmZml4ID09IE5VTEwpCiAjaWZkZWYgV09SRFNfQklHRU5ESUFOCkBAIC0xMjc1LDggKzEyODMsMTAgQEAKIAkJc3VmZml4ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX2JlIik7CiAjZW5kaWYKIAotCVB5X0lOQ1JFRihzdWZmaXgpOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmbmFtZSwgc3VmZml4KTsKKwlQeV9JTkNSRUYobmFtZSk7CisJUHlTdHJpbmdfQ29uY2F0KCZuYW1lLCBzdWZmaXgpOworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCiAJUHlUdXBsZV9TRVRfSVRFTShzd2FwcGVkX2FyZ3MsIDAsIG5hbWUpOwogCWZvciAoaT0xOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7ICsraSkgewpAQCAtMTI5Nyw3ICsxMzA3LDcgQEAKIAlpZiAoIXN0Z2RpY3QpIC8qIFhYWCBsZWFrcyByZXN1bHQhICovCiAJCXJldHVybiBOVUxMOwogCi0Jc3RnZGljdC0+ZmZpX3R5cGUgPSAqZm10LT5wZmZpX3R5cGU7CisJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9ICpmbXQtPnBmZmlfdHlwZTsKIAlzdGdkaWN0LT5hbGlnbiA9IGZtdC0+cGZmaV90eXBlLT5hbGlnbm1lbnQ7CiAJc3RnZGljdC0+bGVuZ3RoID0gMDsKIAlzdGdkaWN0LT5zaXplID0gZm10LT5wZmZpX3R5cGUtPnNpemU7CkBAIC0xMzU1LDcgKzEzNjUsNyBAQAogCiAJZm10ID0gZ2V0ZW50cnkoUHlTdHJpbmdfQVNfU1RSSU5HKHByb3RvKSk7CiAKLQlzdGdkaWN0LT5mZmlfdHlwZSA9ICpmbXQtPnBmZmlfdHlwZTsKKwlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyID0gKmZtdC0+cGZmaV90eXBlOwogCXN0Z2RpY3QtPmFsaWduID0gZm10LT5wZmZpX3R5cGUtPmFsaWdubWVudDsKIAlzdGdkaWN0LT5sZW5ndGggPSAwOwogCXN0Z2RpY3QtPnNpemUgPSBmbXQtPnBmZmlfdHlwZS0+c2l6ZTsKQEAgLTE0NTAsNiArMTQ2MCw3IEBACiAJCVB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc3dhcHBlZCwgIl9fY3R5cGVfbGVfXyIsIChQeU9iamVjdCAqKXJlc3VsdCk7CiAJCVB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc3dhcHBlZCwgIl9fY3R5cGVfYmVfXyIsIHN3YXBwZWQpOwogI2VuZGlmCisJCVB5X0RFQ1JFRihzd2FwcGVkKTsKIAl9OwogCiAJcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKQEAgLTE2MjQsNyArMTYzNSw3IEBACiAJc3RnZGljdC0+c2l6ZSA9IHNpemVvZih2b2lkICopOwogCXN0Z2RpY3QtPnNldGZ1bmMgPSBOVUxMOwogCXN0Z2RpY3QtPmdldGZ1bmMgPSBOVUxMOwotCXN0Z2RpY3QtPmZmaV90eXBlID0gZmZpX3R5cGVfcG9pbnRlcjsKKwlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyID0gZmZpX3R5cGVfcG9pbnRlcjsKIAogCW9iID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopc3RnZGljdCwgIl9mbGFnc18iKTsKIAlpZiAoIW9iIHx8ICFQeUludF9DaGVjayhvYikpIHsKQEAgLTE4NDYsNyArMTg1Nyw3IEBACiAJU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CiAJUHlfQ0xFQVIoc2VsZi0+Yl9vYmplY3RzKTsKIAlpZiAoKHNlbGYtPmJfbmVlZHNmcmVlKQotCSAgICAmJiAoZGljdC0+c2l6ZSA+IHNpemVvZihzZWxmLT5iX3ZhbHVlKSkpCisJICAgICYmICgoc2l6ZV90KWRpY3QtPnNpemUgPiBzaXplb2Yoc2VsZi0+Yl92YWx1ZSkpKQogCQlQeU1lbV9GcmVlKHNlbGYtPmJfcHRyKTsKIAlzZWxmLT5iX3B0ciA9IE5VTEw7CiAJUHlfQ0xFQVIoc2VsZi0+Yl9iYXNlKTsKQEAgLTE4NzMsOCArMTg4NCw5IEBACiAJeyBOVUxMIH0sCiB9OwogCi1zdGF0aWMgUHlfc3NpemVfdCBDRGF0YV9HZXRCdWZmZXIoQ0RhdGFPYmplY3QgKnNlbGYsIFB5X3NzaXplX3Qgc2VnLCB2b2lkICoqcHB0cikKK3N0YXRpYyBQeV9zc2l6ZV90IENEYXRhX0dldEJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3Qgc2VnLCB2b2lkICoqcHB0cikKIHsKKwlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCWlmIChzZWcgIT0gMCkgewogCQkvKiBIbS4gTXVzdCB0aGlzIHNldCBhbiBleGNlcHRpb24/ICovCiAJCXJldHVybiAtMTsKQEAgLTE4ODMsNyArMTg5NSw3IEBACiAJcmV0dXJuIHNlbGYtPmJfc2l6ZTsKIH0KIAotc3RhdGljIFB5X3NzaXplX3QgQ0RhdGFfR2V0U2VnY291bnQoQ0RhdGFPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgKmxlbnApCitzdGF0aWMgUHlfc3NpemVfdCBDRGF0YV9HZXRTZWdjb3VudChQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgKmxlbnApCiB7CiAJaWYgKGxlbnApCiAJCSpsZW5wID0gMTsKQEAgLTE4OTEsMTAgKzE5MDMsMTAgQEAKIH0KIAogc3RhdGljIFB5QnVmZmVyUHJvY3MgQ0RhdGFfYXNfYnVmZmVyID0gewotCShyZWFkYnVmZmVycHJvYylDRGF0YV9HZXRCdWZmZXIsCi0JKHdyaXRlYnVmZmVycHJvYylDRGF0YV9HZXRCdWZmZXIsCi0JKHNlZ2NvdW50cHJvYylDRGF0YV9HZXRTZWdjb3VudCwKLQkoY2hhcmJ1ZmZlcnByb2MpTlVMTCwKKwlDRGF0YV9HZXRCdWZmZXIsCisJQ0RhdGFfR2V0QnVmZmVyLAorCUNEYXRhX0dldFNlZ2NvdW50LAorCU5VTEwsCiB9OwogCiAvKgpAQCAtMTk2Nyw3ICsxOTc5LDcgQEAKIAogc3RhdGljIHZvaWQgQ0RhdGFfTWFsbG9jQnVmZmVyKENEYXRhT2JqZWN0ICpvYmosIFN0Z0RpY3RPYmplY3QgKmRpY3QpCiB7Ci0JaWYgKGRpY3QtPnNpemUgPD0gc2l6ZW9mKG9iai0+Yl92YWx1ZSkpIHsKKwlpZiAoKHNpemVfdClkaWN0LT5zaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7CiAJCS8qIE5vIG5lZWQgdG8gY2FsbCBtYWxsb2MsIGNhbiB1c2UgdGhlIGRlZmF1bHQgYnVmZmVyICovCiAJCW9iai0+Yl9wdHIgPSAoY2hhciAqKSZvYmotPmJfdmFsdWU7CiAJCW9iai0+Yl9uZWVkc2ZyZWUgPSAxOwpAQCAtMTk3NSw3ICsxOTg3LDcgQEAKIAkJLyogSW4gcHl0aG9uIDIuNCwgYW5kIGN0eXBlcyAwLjkuNiwgdGhlIG1hbGxvYyBjYWxsIHRvb2sgYWJvdXQKIAkJICAgMzMlIG9mIHRoZSBjcmVhdGlvbiB0aW1lIGZvciBjX2ludCgpLgogCQkqLwotCQlvYmotPmJfcHRyID0gUHlNZW1fTWFsbG9jKGRpY3QtPnNpemUpOworCQlvYmotPmJfcHRyID0gKGNoYXIgKilQeU1lbV9NYWxsb2MoZGljdC0+c2l6ZSk7CiAJCW9iai0+Yl9uZWVkc2ZyZWUgPSAxOwogCQltZW1zZXQob2JqLT5iX3B0ciwgMCwgZGljdC0+c2l6ZSk7CiAJfQpAQCAtMjA0MCw3ICsyMDUyLDcgQEAKIAlpZiAoIXBkKQogCQlyZXR1cm4gTlVMTDsKIAlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2socGQpKTsKLQlwZC0+Yl9wdHIgPSBidWY7CisJcGQtPmJfcHRyID0gKGNoYXIgKilidWY7CiAJcGQtPmJfbGVuZ3RoID0gZGljdC0+bGVuZ3RoOwogCXBkLT5iX3NpemUgPSBkaWN0LT5zaXplOwogCXJldHVybiAoUHlPYmplY3QgKilwZDsKQEAgLTIzODMsNiArMjM5NSwxMSBAQAogCWFkZHJlc3MgPSAoUFBST0MpR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCBuYW1lKTsKIAlpZiAoYWRkcmVzcykKIAkJcmV0dXJuIGFkZHJlc3M7CisKKwlpZiAoKChzaXplX3QpbmFtZSAmIH4weEZGRkYpID09IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCiAJLyogSXQgc2hvdWxkIG5vdCBoYXBwZW4gdGhhdCBkaWN0IGlzIE5VTEwsIGJ1dCBiZXR0ZXIgYmUgc2FmZSAqLwogCWlmIChkaWN0PT1OVUxMIHx8IGRpY3QtPmZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpCiAJCXJldHVybiBhZGRyZXNzOwpAQCAtMjM5MSw3ICsyNDA4LDcgQEAKIAkgICBmdW5jbmFtZSAtPiBfZnVuY25hbWVAPG4+CiAJICAgd2hlcmUgbiBpcyAwLCA0LCA4LCAxMiwgLi4uLCAxMjgKIAkgKi8KLQltYW5nbGVkX25hbWUgPSBfYWxsb2NhKHN0cmxlbihuYW1lKSArIDEgKyAxICsgMSArIDMpOyAvKiBcMCBfIEAgJWQgKi8KKwltYW5nbGVkX25hbWUgPSBhbGxvY2Eoc3RybGVuKG5hbWUpICsgMSArIDEgKyAxICsgMyk7IC8qIFwwIF8gQCAlZCAqLwogCWZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7CiAJCXNwcmludGYobWFuZ2xlZF9uYW1lLCAiXyVzQCVkIiwgbmFtZSwgaSo0KTsKIAkJYWRkcmVzcyA9IChQUFJPQylHZXRQcm9jQWRkcmVzcyhoYW5kbGUsIG1hbmdsZWRfbmFtZSk7CkBAIC0yNDg4LDYgKzI1MDUsMjggQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludAorX2dldF9uYW1lKFB5T2JqZWN0ICpvYmosIGNoYXIgKipwbmFtZSkKK3sKKyNpZmRlZiBNU19XSU4zMgorCWlmIChQeUludF9DaGVjayhvYmopIHx8IFB5TG9uZ19DaGVjayhvYmopKSB7CisJCS8qIFdlIGhhdmUgdG8gdXNlIE1BS0VJTlRSRVNPVVJDRUEgZm9yIFdpbmRvd3MgQ0UuCisJCSAgIFdvcmtzIG9uIFdpbmRvd3MgYXMgd2VsbCwgb2YgY291cnNlLgorCQkqLworCQkqcG5hbWUgPSBNQUtFSU5UUkVTT1VSQ0VBKFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhvYmopICYgMHhGRkZGKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikgfHwgUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKwkJKnBuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcob2JqKTsKKwkJcmV0dXJuICpwbmFtZSA/IDEgOiAwOworCX0KKwlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkJImZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBzdHJpbmcgb3IgaW50ZWdlciIpOworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0cl9Gcm9tRGxsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewpAQCAtMjQ5OSw3ICsyNTM4LDcgQEAKIAl2b2lkICpoYW5kbGU7CiAJUHlPYmplY3QgKnBhcmFtZmxhZ3MgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzT3xPIiwgJm5hbWUsICZkbGwsICZwYXJhbWZsYWdzKSkKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIihPJk8pfE8iLCBfZ2V0X25hbWUsICZuYW1lLCAmZGxsLCAmcGFyYW1mbGFncykpCiAJCXJldHVybiBOVUxMOwogCWlmIChwYXJhbWZsYWdzID09IFB5X05vbmUpCiAJCXBhcmFtZmxhZ3MgPSBOVUxMOwpAQCAtMjUyNCw5ICsyNTYzLDE0IEBACiAjaWZkZWYgTVNfV0lOMzIKIAlhZGRyZXNzID0gRmluZEFkZHJlc3MoaGFuZGxlLCBuYW1lLCAoUHlPYmplY3QgKil0eXBlKTsKIAlpZiAoIWFkZHJlc3MpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICAgICAiZnVuY3Rpb24gJyVzJyBub3QgZm91bmQiLAotCQkJICAgICBuYW1lKTsKKwkJaWYgKCFJU19JTlRSRVNPVVJDRShuYW1lKSkKKwkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKwkJCQkgICAgICJmdW5jdGlvbiAnJXMnIG5vdCBmb3VuZCIsCisJCQkJICAgICBuYW1lKTsKKwkJZWxzZQorCQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorCQkJCSAgICAgImZ1bmN0aW9uIG9yZGluYWwgJWQgbm90IGZvdW5kIiwKKwkJCQkgICAgIChXT1JEKShzaXplX3QpbmFtZSk7CiAJCXJldHVybiBOVUxMOwogCX0KICNlbHNlCkBAIC0yNjAzLDggKzI2NDcsOSBAQAogICAiTyIgLSBtdXN0IGJlIGEgY2FsbGFibGUsIGNyZWF0ZXMgYSBDIGNhbGxhYmxlIGZ1bmN0aW9uCiAKICAgdHdvIG9yIG1vcmUgYXJndW1lbnQgZm9ybXMgKHRoZSB0aGlyZCBhcmd1bWVudCBpcyBhIHBhcmFtZmxhZ3MgdHVwbGUpCi0gICJzT3xPIiAtIGZ1bmN0aW9uIG5hbWUsIGRsbCBvYmplY3QgKHdpdGggYW4gaW50ZWdlciBoYW5kbGUpCi0gICJpc3xPIiAtIHZ0YWJsZSBpbmRleCwgbWV0aG9kIG5hbWUsIGNyZWF0ZXMgY2FsbGFibGUgY2FsbGluZyBDT00gdnRibAorICAiKHNPKXwuLi4iIC0gKGZ1bmN0aW9uIG5hbWUsIGRsbCBvYmplY3QgKHdpdGggYW4gaW50ZWdlciBoYW5kbGUpKSwgcGFyYW1mbGFncworICAiKGlPKXwuLi4iIC0gKGZ1bmN0aW9uIG9yZGluYWwsIGRsbCBvYmplY3QgKHdpdGggYW4gaW50ZWdlciBoYW5kbGUpKSwgcGFyYW1mbGFncworICAiaXN8Li4uIiAtIHZ0YWJsZSBpbmRleCwgbWV0aG9kIG5hbWUsIGNyZWF0ZXMgY2FsbGFibGUgY2FsbGluZyBDT00gdnRibAogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0cl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCkBAIC0yNjEyLDE5ICsyNjU3LDE4IEBACiAJQ0Z1bmNQdHJPYmplY3QgKnNlbGY7CiAJUHlPYmplY3QgKmNhbGxhYmxlOwogCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JVEhVTksgdGh1bms7CisJZmZpX2luZm8gKnRodW5rOwogCiAJaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKIAkJcmV0dXJuIEdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CiAKLQkvKiBTaG91bGRuJ3QgdGhlIGZvbGxvd2luZyBiZXR0ZXIgYmUgZG9uZSBpbiBfX2luaXRfXz8gKi8KLQlpZiAoMiA8PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKSB7Ci0jaWZkZWYgTVNfV0lOMzIKLQkJaWYgKFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpKQotCQkJcmV0dXJuIENGdW5jUHRyX0Zyb21WdGJsSW5kZXgodHlwZSwgYXJncywga3dkcyk7Ci0jZW5kaWYKKwlpZiAoMSA8PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICYmIFB5VHVwbGVfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCiAJCXJldHVybiBDRnVuY1B0cl9Gcm9tRGxsKHR5cGUsIGFyZ3MsIGt3ZHMpOwotCX0KKworI2lmZGVmIE1TX1dJTjMyCisJaWYgKDIgPD0gUHlUdXBsZV9HRVRfU0laRShhcmdzKSAmJiBQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSkKKwkJcmV0dXJuIENGdW5jUHRyX0Zyb21WdGJsSW5kZXgodHlwZSwgYXJncywga3dkcyk7CisjZW5kaWYKIAogCWlmICgxID09IFB5VHVwbGVfR0VUX1NJWkUoYXJncykKIAkgICAgJiYgKFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpCkBAIC0yNzgxLDcgKzI4MjUsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9idWlsZF9jYWxsYXJncyhDRnVuY1B0ck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3R5cGVzLAogCQlQeU9iamVjdCAqaW5hcmdzLCBQeU9iamVjdCAqa3dkcywKLQkJaW50ICpwb3V0bWFzaywgaW50ICpwaW5vdXRtYXNrLCBpbnQgKnBudW1yZXR2YWxzKQorCQlpbnQgKnBvdXRtYXNrLCBpbnQgKnBpbm91dG1hc2ssIHVuc2lnbmVkIGludCAqcG51bXJldHZhbHMpCiB7CiAJUHlPYmplY3QgKnBhcmFtZmxhZ3MgPSBzZWxmLT5wYXJhbWZsYWdzOwogCVB5T2JqZWN0ICpjYWxsYXJnczsKQEAgLTI4MzUsOCArMjg3OSwxNCBAQAogCiAJCXN3aXRjaCAoZmxhZyAmIChQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZPVVQgfCBQQVJBTUZMQUdfRkxDSUQpKSB7CiAJCWNhc2UgUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GTENJRDoKLQkJCS8qIFsnaW4nLCAnbGNpZCddIHBhcmFtZXRlci4gIEFsd2F5cyB0YWtlbiBmcm9tIGRlZnZhbCAqLwotCQkJUHlfSU5DUkVGKGRlZnZhbCk7CisJCQkvKiBbJ2luJywgJ2xjaWQnXSBwYXJhbWV0ZXIuICBBbHdheXMgdGFrZW4gZnJvbSBkZWZ2YWwsCisJCQkgaWYgZ2l2ZW4sIGVsc2UgdGhlIGludGVnZXIgMC4gKi8KKwkJCWlmIChkZWZ2YWwgPT0gTlVMTCkgeworCQkJCWRlZnZhbCA9IFB5SW50X0Zyb21Mb25nKDApOworCQkJCWlmIChkZWZ2YWwgPT0gTlVMTCkKKwkJCQkJZ290byBlcnJvcjsKKwkJCX0gZWxzZQorCQkJCVB5X0lOQ1JFRihkZWZ2YWwpOwogCQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgaSwgZGVmdmFsKTsKIAkJCWJyZWFrOwogCQljYXNlIChQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZPVVQpOgpAQCAtMjkzOSw5ICsyOTg5LDEwIEBACiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIF9idWlsZF9yZXN1bHQoUHlPYmplY3QgKnJlc3VsdCwgUHlPYmplY3QgKmNhbGxhcmdzLAotCSAgICAgIGludCBvdXRtYXNrLCBpbnQgaW5vdXRtYXNrLCBpbnQgbnVtcmV0dmFscykKKwkgICAgICBpbnQgb3V0bWFzaywgaW50IGlub3V0bWFzaywgdW5zaWduZWQgaW50IG51bXJldHZhbHMpCiB7Ci0JaW50IGksIGluZGV4LCBiaXQ7CisJdW5zaWduZWQgaW50IGksIGluZGV4OworCWludCBiaXQ7CiAJUHlPYmplY3QgKnR1cCA9IE5VTEw7CiAKIAlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKQEAgLTI5NTIsNiArMzAwMyw3IEBACiAJfQogCVB5X0RFQ1JFRihyZXN1bHQpOwogCisJLyogdHVwIHdpbGwgbm90IGJlIGFsbG9jYXRlZCBpZiBudW1yZXR2YWxzID09IDEgKi8KIAkvKiBhbGxvY2F0ZSB0dXBsZSB0byBob2xkIHRoZSByZXN1bHQgKi8KIAlpZiAobnVtcmV0dmFscyA+IDEpIHsKIAkJdHVwID0gUHlUdXBsZV9OZXcobnVtcmV0dmFscyk7CkBAIC0zMDA5LDcgKzMwNjEsNyBAQAogCiAJaW50IGlub3V0bWFzazsKIAlpbnQgb3V0bWFzazsKLQlpbnQgbnVtcmV0dmFsczsKKwl1bnNpZ25lZCBpbnQgbnVtcmV0dmFsczsKIAogCWFzc2VydChkaWN0KTsgLyogaWYgbm90LCBpdCdzIGEgYnVnICovCiAJcmVzdHlwZSA9IHNlbGYtPnJlc3R5cGUgPyBzZWxmLT5yZXN0eXBlIDogZGljdC0+cmVzdHlwZTsKQEAgLTMxNDUsOSArMzE5NywxMSBAQAogCVB5X0NMRUFSKHNlbGYtPmNvbnZlcnRlcnMpOwogCVB5X0NMRUFSKHNlbGYtPnBhcmFtZmxhZ3MpOwogCi0JaWYgKHNlbGYtPnRodW5rKQotCQlGcmVlQ2FsbGJhY2soc2VsZi0+dGh1bmspOwotCXNlbGYtPnRodW5rID0gTlVMTDsKKwlpZiAoc2VsZi0+dGh1bmspIHsKKwkJRnJlZUNsb3N1cmUoc2VsZi0+dGh1bmstPnBjbCk7CisJCVB5TWVtX0ZyZWUoc2VsZi0+dGh1bmspOworCQlzZWxmLT50aHVuayA9IE5VTEw7CisJfQogCiAJcmV0dXJuIENEYXRhX2NsZWFyKChDRGF0YU9iamVjdCAqKXNlbGYpOwogfQpAQCAtMzI0MSw3ICszMjk1LDcgQEAKIAogCXBhcmctPnRhZyA9ICdWJzsKIAlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlwYXJnLT5wZmZpX3R5cGUgPSAmc3RnZGljdC0+ZmZpX3R5cGU7CisJcGFyZy0+cGZmaV90eXBlID0gJnN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXI7CiAJLyogRm9yIHN0cnVjdHVyZSBwYXJhbWV0ZXJzIChieSB2YWx1ZSksIHBhcmctPnZhbHVlIGRvZXNuJ3QgY29udGFpbiB0aGUgc3RydWN0dXJlCiAJICAgZGF0YSBpdHNlbGYsIGluc3RlYWQgcGFyZy0+dmFsdWUucCAqcG9pbnRzKiB0byB0aGUgc3RydWN0dXJlJ3MgZGF0YQogCSAgIFNlZSBhbHNvIF9jdHlwZXMuYywgZnVuY3Rpb24gX2NhbGxfZnVuY3Rpb25fcG9pbnRlcigpLgpAQCAtMzI3NSw2ICszMzI5LDggQEAKIAkJaWYgKCFmaWVsZHMpIHsKIAkJCVB5RXJyX0NsZWFyKCk7CiAJCQlmaWVsZHMgPSBQeVR1cGxlX05ldygwKTsKKwkJCWlmICghZmllbGRzKQorCQkJCXJldHVybiAtMTsKIAkJfQogCiAJCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID4gUHlTZXF1ZW5jZV9MZW5ndGgoZmllbGRzKSkgewpAQCAtMzQ0NSw4ICszNTAxLDkgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLUFycmF5X2l0ZW0oQ0RhdGFPYmplY3QgKnNlbGYsIGludCBpbmRleCkKK0FycmF5X2l0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGluZGV4KQogeworCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJaW50IG9mZnNldCwgc2l6ZTsKIAlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwogCkBAIC0zNDY5LDggKzM1MjYsOSBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotQXJyYXlfc2xpY2UoQ0RhdGFPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKK0FycmF5X3NsaWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoKQogeworCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OwogCVB5T2JqZWN0ICpwcm90bzsKIAlQeUxpc3RPYmplY3QgKm5wOwpAQCAtMzUwNCwxNSArMzU2MiwxNiBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqdiA9IEFycmF5X2l0ZW0oc2VsZiwgaStpbG93KTsKKwkJUHlPYmplY3QgKnYgPSBBcnJheV9pdGVtKF9zZWxmLCBpK2lsb3cpOwogCQlQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOwogCX0KIAlyZXR1cm4gKFB5T2JqZWN0ICopbnA7CiB9CiAKIHN0YXRpYyBpbnQKLUFycmF5X2Fzc19pdGVtKENEYXRhT2JqZWN0ICpzZWxmLCBpbnQgaW5kZXgsIFB5T2JqZWN0ICp2YWx1ZSkKK0FycmF5X2Fzc19pdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKnZhbHVlKQogeworCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJaW50IHNpemUsIG9mZnNldDsKIAlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwogCWNoYXIgKnB0cjsKQEAgLTM1MzgsOCArMzU5Nyw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLUFycmF5X2Fzc19zbGljZShDRGF0YU9iamVjdCAqc2VsZiwgaW50IGlsb3csIGludCBpaGlnaCwgUHlPYmplY3QgKnZhbHVlKQorQXJyYXlfYXNzX3NsaWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoLCBQeU9iamVjdCAqdmFsdWUpCiB7CisJQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKIAlpbnQgaSwgbGVuOwogCiAJaWYgKHZhbHVlID09IE5VTEwpIHsKQEAgLTM1NzAsNyArMzYzMCw3IEBACiAJCWludCByZXN1bHQ7CiAJCWlmIChpdGVtID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7Ci0JCXJlc3VsdCA9IEFycmF5X2Fzc19pdGVtKHNlbGYsIGkraWxvdywgaXRlbSk7CisJCXJlc3VsdCA9IEFycmF5X2Fzc19pdGVtKF9zZWxmLCBpK2lsb3csIGl0ZW0pOwogCQlQeV9ERUNSRUYoaXRlbSk7CiAJCWlmIChyZXN1bHQgPT0gLTEpCiAJCQlyZXR1cm4gLTE7CkBAIC0zNTc4LDIwICszNjM4LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLUFycmF5X2xlbmd0aChDRGF0YU9iamVjdCAqc2VsZikKK3N0YXRpYyBQeV9zc2l6ZV90CitBcnJheV9sZW5ndGgoUHlPYmplY3QgKl9zZWxmKQogeworCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJcmV0dXJuIHNlbGYtPmJfbGVuZ3RoOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgQXJyYXlfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpQXJyYXlfbGVuZ3RoLAkJCS8qIHNxX2xlbmd0aDsgKi8KKwlBcnJheV9sZW5ndGgsCQkJCS8qIHNxX2xlbmd0aDsgKi8KIAkwLAkJCQkJLyogc3FfY29uY2F0OyAqLwogCTAsCQkJCQkvKiBzcV9yZXBlYXQ7ICovCi0JKHNzaXplYXJnZnVuYylBcnJheV9pdGVtLAkJLyogc3FfaXRlbTsgKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpQXJyYXlfc2xpY2UsCQkvKiBzcV9zbGljZTsgKi8KLQkoc3NpemVvYmphcmdwcm9jKUFycmF5X2Fzc19pdGVtLAkvKiBzcV9hc3NfaXRlbTsgKi8KLQkoc3NpemVzc2l6ZW9iamFyZ3Byb2MpQXJyYXlfYXNzX3NsaWNlLAkvKiBzcV9hc3Nfc2xpY2U7ICovCisJQXJyYXlfaXRlbSwJCQkJLyogc3FfaXRlbTsgKi8KKwlBcnJheV9zbGljZSwJCQkJLyogc3Ffc2xpY2U7ICovCisJQXJyYXlfYXNzX2l0ZW0sCQkJCS8qIHNxX2Fzc19pdGVtOyAqLworCUFycmF5X2Fzc19zbGljZSwJCQkvKiBzcV9hc3Nfc2xpY2U7ICovCiAJMCwJCQkJCS8qIHNxX2NvbnRhaW5zOyAqLwogCQogCTAsCQkJCQkvKiBzcV9pbnBsYWNlX2NvbmNhdDsgKi8KQEAgLTM5NDIsOCArNDAwMyw5IEBACiAgIFBvaW50ZXJfVHlwZQogKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1Qb2ludGVyX2l0ZW0oQ0RhdGFPYmplY3QgKnNlbGYsIGludCBpbmRleCkKK1BvaW50ZXJfaXRlbShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaW5kZXgpCiB7CisJQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKIAlpbnQgc2l6ZSwgb2Zmc2V0OwogCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKIAlQeU9iamVjdCAqcHJvdG87CkBAIC0zOTY5LDggKzQwMzEsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1Qb2ludGVyX2Fzc19pdGVtKENEYXRhT2JqZWN0ICpzZWxmLCBpbnQgaW5kZXgsIFB5T2JqZWN0ICp2YWx1ZSkKK1BvaW50ZXJfYXNzX2l0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGluZGV4LCBQeU9iamVjdCAqdmFsdWUpCiB7CisJQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKIAlpbnQgc2l6ZTsKIAlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwogCkBAIC00MTExLDggKzQxNzQsOSBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotUG9pbnRlcl9zbGljZShDRGF0YU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoKQorUG9pbnRlcl9zbGljZShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKIHsKKwlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCVB5TGlzdE9iamVjdCAqbnA7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OwogCVB5T2JqZWN0ICpwcm90bzsKQEAgLTQxNDIsNyArNDIwNiw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUG9pbnRlcl9pdGVtKHNlbGYsIGkraWxvdyk7CisJCVB5T2JqZWN0ICp2ID0gUG9pbnRlcl9pdGVtKF9zZWxmLCBpK2lsb3cpOwogCQlQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOwogCX0KIAlyZXR1cm4gKFB5T2JqZWN0ICopbnA7CkBAIC00MTUyLDkgKzQyMTYsOSBAQAogCTAsCQkJCQkvKiBpbnF1aXJ5IHNxX2xlbmd0aDsgKi8KIAkwLAkJCQkJLyogYmluYXJ5ZnVuYyBzcV9jb25jYXQ7ICovCiAJMCwJCQkJCS8qIGludGFyZ2Z1bmMgc3FfcmVwZWF0OyAqLwotCShzc2l6ZWFyZ2Z1bmMpUG9pbnRlcl9pdGVtLAkJLyogaW50YXJnZnVuYyBzcV9pdGVtOyAqLwotCShzc2l6ZXNzaXplYXJnZnVuYylQb2ludGVyX3NsaWNlLAkvKiBpbnRpbnRhcmdmdW5jIHNxX3NsaWNlOyAqLwotCShzc2l6ZW9iamFyZ3Byb2MpUG9pbnRlcl9hc3NfaXRlbSwJLyogaW50b2JqYXJncHJvYyBzcV9hc3NfaXRlbTsgKi8KKwlQb2ludGVyX2l0ZW0sCQkJCS8qIGludGFyZ2Z1bmMgc3FfaXRlbTsgKi8KKwlQb2ludGVyX3NsaWNlLAkJCQkvKiBpbnRpbnRhcmdmdW5jIHNxX3NsaWNlOyAqLworCVBvaW50ZXJfYXNzX2l0ZW0sCQkJLyogaW50b2JqYXJncHJvYyBzcV9hc3NfaXRlbTsgKi8KIAkwLAkJCQkJLyogaW50aW50b2JqYXJncHJvYyBzcV9hc3Nfc2xpY2U7ICovCiAJMCwJCQkJCS8qIG9iam9ianByb2Mgc3FfY29udGFpbnM7ICovCiAJLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KQEAgLTQzMzQsNiArNDM5OCw0MiBAQAogCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIsIHNpemUpOwogfQogCitzdGF0aWMgaW50CitjYXN0X2NoZWNrX3BvaW50ZXJ0eXBlKFB5T2JqZWN0ICphcmcpCit7CisJU3RnRGljdE9iamVjdCAqZGljdDsKKworCWlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayhhcmcpKQorCQlyZXR1cm4gMTsKKwlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoYXJnKTsKKwlpZiAoZGljdCkgeworCQlpZiAoUHlTdHJpbmdfQ2hlY2soZGljdC0+cHJvdG8pCisJCSAgICAmJiAoc3RyY2hyKCJzUHpVWlhPIiwgUHlTdHJpbmdfQVNfU1RSSU5HKGRpY3QtPnByb3RvKVswXSkpKSB7CisJCQkvKiBzaW1wbGUgcG9pbnRlciB0eXBlcywgY192b2lkX3AsIGNfd2NoYXJfcCwgQlNUUiwgLi4uICovCisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorCQkgICAgICJjYXN0KCkgYXJndW1lbnQgMiBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBub3QgJXMiLAorCQkgICAgIFB5VHlwZV9DaGVjayhhcmcpCisJCSAgICAgPyAoKFB5VHlwZU9iamVjdCAqKWFyZyktPnRwX25hbWUKKwkJICAgICA6IGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitjYXN0KHZvaWQgKnB0ciwgUHlPYmplY3QgKmN0eXBlKQoreworCUNEYXRhT2JqZWN0ICpyZXN1bHQ7CisJaWYgKDAgPT0gY2FzdF9jaGVja19wb2ludGVydHlwZShjdHlwZSkpCisJCXJldHVybiBOVUxMOworCXJlc3VsdCA9IChDRGF0YU9iamVjdCAqKVB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY3R5cGUsIE5VTEwpOworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJLyogU2hvdWxkIHdlIGFzc2VydCB0aGF0IHJlc3VsdCBpcyBhIHBvaW50ZXIgdHlwZT8gKi8KKwltZW1jcHkocmVzdWx0LT5iX3B0ciwgJnB0ciwgc2l6ZW9mKHZvaWQgKikpOworCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7Cit9CiAKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ0NjksMTQgKzQ1NjksMjUgQEAKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1tb3ZlX2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIobWVtbW92ZSkpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX21lbXNldF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbXNldCkpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3N0cmluZ19hdF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKHN0cmluZ19hdCkpOworCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX2Nhc3RfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihjYXN0KSk7CiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl93c3RyaW5nX2F0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIod3N0cmluZ19hdCkpOwogI2VuZGlmCiAKLSNpZmRlZiBSVExEX0xPQ0FMCisvKiBJZiBSVExEX0xPQ0FMIGlzIG5vdCBkZWZpbmVkIChXaW5kb3dzISksIHNldCBpdCB0byB6ZXJvLiAqLworI2lmbmRlZiBSVExEX0xPQ0FMCisjZGVmaW5lIFJUTERfTE9DQUwgMAorI2VuZGlmCisKKy8qIElmIFJUTERfR0xPQkFMIGlzIG5vdCBkZWZpbmVkIChjeWd3aW4pLCBzZXQgaXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMKKyAgIFJUTERfTE9DQUwuCisqLworI2lmbmRlZiBSVExEX0dMT0JBTAorI2RlZmluZSBSVExEX0dMT0JBTCBSVExEX0xPQ0FMCisjZW5kaWYKKwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUlRMRF9MT0NBTCIsIFB5SW50X0Zyb21Mb25nKFJUTERfTE9DQUwpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJUTERfR0xPQkFMIiwgUHlJbnRfRnJvbUxvbmcoUlRMRF9HTE9CQUwpKTsKLSNlbmRpZgogCQogCVB5RXhjX0FyZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjdHlwZXMuQXJndW1lbnRFcnJvciIsIE5VTEwsIE5VTEwpOwogCWlmIChQeUV4Y19BcmdFcnJvcikgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCmluZGV4IGE0NmY1ZTQuLmFkM2IwNDcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKQEAgLTUxLDIxICs1MSwyMSBAQAogCSpwcmVzdWx0ID0gYSArIGI7CiB9CiAKLUVYUE9SVChpbnQpIF90ZXN0ZnVuY19pX2JoaWxmZChjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsIGRvdWJsZSBkKQorRVhQT1JUKGludCkgX3Rlc3RmdW5jX2lfYmhpbGZkKHNpZ25lZCBjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsIGRvdWJsZSBkKQogewogLy8JcHJpbnRmKCJfdGVzdGZ1bmNfaV9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKIC8vCSAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKIAlyZXR1cm4gKGludCkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKIH0KIAotRVhQT1JUKGZsb2F0KSBfdGVzdGZ1bmNfZl9iaGlsZmQoY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKK0VYUE9SVChmbG9hdCkgX3Rlc3RmdW5jX2ZfYmhpbGZkKHNpZ25lZCBjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsIGRvdWJsZSBkKQogewogLy8JcHJpbnRmKCJfdGVzdGZ1bmNfZl9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKIC8vCSAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKIAlyZXR1cm4gKGZsb2F0KShiICsgaCArIGkgKyBsICsgZiArIGQpOwogfQogCi1FWFBPUlQoZG91YmxlKSBfdGVzdGZ1bmNfZF9iaGlsZmQoY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKK0VYUE9SVChkb3VibGUpIF90ZXN0ZnVuY19kX2JoaWxmZChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKIHsKIC8vCXByaW50ZigiX3Rlc3RmdW5jX2RfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCiAvLwkgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CkBAIC03NCw3ICs3NCw3IEBACiAKIEVYUE9SVChjaGFyICopIF90ZXN0ZnVuY19wX3Aodm9pZCAqcykKIHsKLQlyZXR1cm4gczsKKwlyZXR1cm4gKGNoYXIgKilzOwogfQogCiBFWFBPUlQodm9pZCAqKSBfdGVzdGZ1bmNfY19wX3AoaW50ICphcmdjcCwgY2hhciAqKmFyZ3YpCkBAIC04OSw3ICs4OSw3IEBACiAKIEVYUE9SVChjaGFyICopIG15X3N0cmR1cChjaGFyICpzcmMpCiB7Ci0JY2hhciAqZHN0ID0gbWFsbG9jKHN0cmxlbihzcmMpKzEpOworCWNoYXIgKmRzdCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihzcmMpKzEpOwogCWlmICghZHN0KQogCQlyZXR1cm4gTlVMTDsKIAlzdHJjcHkoZHN0LCBzcmMpOwpAQCAtOTksOCArOTksOCBAQAogI2lmZGVmIEhBVkVfV0NIQVJfSAogRVhQT1JUKHdjaGFyX3QgKikgbXlfd2NzZHVwKHdjaGFyX3QgKnNyYykKIHsKLQlpbnQgbGVuID0gd2NzbGVuKHNyYyk7Ci0Jd2NoYXJfdCAqcHRyID0gbWFsbG9jKChsZW4gKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7CisJc2l6ZV90IGxlbiA9IHdjc2xlbihzcmMpOworCXdjaGFyX3QgKnB0ciA9ICh3Y2hhcl90ICopbWFsbG9jKChsZW4gKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7CiAJaWYgKHB0ciA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAltZW1jcHkocHRyLCBzcmMsIChsZW4rMSkgKiBzaXplb2Yod2NoYXJfdCkpOwpAQCAtMTUyLDEzICsxNTIsMTMgQEAKIH0KIAogI2lmZGVmIEhBVkVfTE9OR19MT05HCi1FWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfcV9iaGlsZmRxKGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwKK0VYUE9SVChQWV9MT05HX0xPTkcpIF90ZXN0ZnVuY19xX2JoaWxmZHEoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwKIAkJCQkgICAgIGRvdWJsZSBkLCBQWV9MT05HX0xPTkcgcSkKIHsKIAlyZXR1cm4gKFBZX0xPTkdfTE9ORykoYiArIGggKyBpICsgbCArIGYgKyBkICsgcSk7CiB9CiAKLUVYUE9SVChQWV9MT05HX0xPTkcpIF90ZXN0ZnVuY19xX2JoaWxmZChjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsIGRvdWJsZSBkKQorRVhQT1JUKFBZX0xPTkdfTE9ORykgX3Rlc3RmdW5jX3FfYmhpbGZkKHNpZ25lZCBjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsIGRvdWJsZSBkKQogewogCXJldHVybiAoUFlfTE9OR19MT05HKShiICsgaCArIGkgKyBsICsgZiArIGQpOwogfQpAQCAtMTkxLDcgKzE5MSw3IEBACiB7CiAJc3RhdGljIGNoYXIgbWVzc2FnZVtdID0gIkhlbGxvLCBXb3JsZCI7CiAJaWYgKHApIHsKLQkJKnAgPSBtYWxsb2Moc2l6ZW9mKGNoYXIgKikpOworCQkqcCA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSk7CiAJCXByaW50ZigibWFsbG9jIHJldHVybmVkICVwXG4iLCAqcCk7CiAJCSoqcCA9IG1lc3NhZ2U7CiAJCXJldHVybiAxOwpAQCAtMzg1LDcgKzM4NSw3IEBACiAjZGVmaW5lIFMgbGFzdF90Zl9hcmdfcyA9IChQWV9MT05HX0xPTkcpYwogI2RlZmluZSBVIGxhc3RfdGZfYXJnX3UgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKWMKIAotRVhQT1JUKGNoYXIpIHRmX2IoY2hhciBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVChzaWduZWQgY2hhcikgdGZfYihzaWduZWQgY2hhciBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVCh1bnNpZ25lZCBjaGFyKSB0Zl9CKHVuc2lnbmVkIGNoYXIgYykgeyBVOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQoc2hvcnQpIHRmX2goc2hvcnQgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQodW5zaWduZWQgc2hvcnQpIHRmX0godW5zaWduZWQgc2hvcnQgYykgeyBVOyByZXR1cm4gYy8zOyB9CkBAIC0zOTksNyArMzk5LDcgQEAKIEVYUE9SVChkb3VibGUpIHRmX2QoZG91YmxlIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQogCiAjaWZkZWYgTVNfV0lOMzIKLUVYUE9SVChjaGFyKSBfX3N0ZGNhbGwgc190Zl9iKGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQoc2lnbmVkIGNoYXIpIF9fc3RkY2FsbCBzX3RmX2Ioc2lnbmVkIGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQodW5zaWduZWQgY2hhcikgX19zdGRjYWxsIHNfdGZfQih1bnNpZ25lZCBjaGFyIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKHNob3J0KSBfX3N0ZGNhbGwgc190Zl9oKHNob3J0IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKHVuc2lnbmVkIHNob3J0KSBfX3N0ZGNhbGwgc190Zl9IKHVuc2lnbmVkIHNob3J0IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQpAQCAtNDE0LDMzICs0MTQsMzMgQEAKICNlbmRpZgogLyoqKioqKiovCiAKLUVYUE9SVChjaGFyKSB0Zl9iYihjaGFyIHgsIGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQodW5zaWduZWQgY2hhcikgdGZfYkIoY2hhciB4LCB1bnNpZ25lZCBjaGFyIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHNob3J0KSB0Zl9iaChjaGFyIHgsIHNob3J0IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIHNob3J0KSB0Zl9iSChjaGFyIHgsIHVuc2lnbmVkIHNob3J0IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKGludCkgdGZfYmkoY2hhciB4LCBpbnQgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQodW5zaWduZWQgaW50KSB0Zl9iSShjaGFyIHgsIHVuc2lnbmVkIGludCBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChsb25nKSB0Zl9ibChjaGFyIHgsIGxvbmcgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQodW5zaWduZWQgbG9uZykgdGZfYkwoY2hhciB4LCB1bnNpZ25lZCBsb25nIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKFBZX0xPTkdfTE9ORykgdGZfYnEoY2hhciB4LCBQWV9MT05HX0xPTkcgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQodW5zaWduZWQgUFlfTE9OR19MT05HKSB0Zl9iUShjaGFyIHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChmbG9hdCkgdGZfYmYoY2hhciB4LCBmbG9hdCBjKSB7IFM7IHJldHVybiBjLzM7IH0KLUVYUE9SVChkb3VibGUpIHRmX2JkKGNoYXIgeCwgZG91YmxlIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHNpZ25lZCBjaGFyKSB0Zl9iYihzaWduZWQgY2hhciB4LCBzaWduZWQgY2hhciBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBjaGFyKSB0Zl9iQihzaWduZWQgY2hhciB4LCB1bnNpZ25lZCBjaGFyIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHNob3J0KSB0Zl9iaChzaWduZWQgY2hhciB4LCBzaG9ydCBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBzaG9ydCkgdGZfYkgoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgc2hvcnQgYykgeyBVOyByZXR1cm4gYy8zOyB9CitFWFBPUlQoaW50KSB0Zl9iaShzaWduZWQgY2hhciB4LCBpbnQgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgaW50KSB0Zl9iSShzaWduZWQgY2hhciB4LCB1bnNpZ25lZCBpbnQgYykgeyBVOyByZXR1cm4gYy8zOyB9CitFWFBPUlQobG9uZykgdGZfYmwoc2lnbmVkIGNoYXIgeCwgbG9uZyBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBsb25nKSB0Zl9iTChzaWduZWQgY2hhciB4LCB1bnNpZ25lZCBsb25nIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKFBZX0xPTkdfTE9ORykgdGZfYnEoc2lnbmVkIGNoYXIgeCwgUFlfTE9OR19MT05HIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgdGZfYlEoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgUFlfTE9OR19MT05HIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGZsb2F0KSB0Zl9iZihzaWduZWQgY2hhciB4LCBmbG9hdCBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVChkb3VibGUpIHRmX2JkKHNpZ25lZCBjaGFyIHgsIGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVCh2b2lkKSB0dl9pKGludCBjKSB7IFM7IHJldHVybjsgfQogCiAjaWZkZWYgTVNfV0lOMzIKLUVYUE9SVChjaGFyKSBfX3N0ZGNhbGwgc190Zl9iYihjaGFyIHgsIGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQodW5zaWduZWQgY2hhcikgX19zdGRjYWxsIHNfdGZfYkIoY2hhciB4LCB1bnNpZ25lZCBjaGFyIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHNob3J0KSBfX3N0ZGNhbGwgc190Zl9iaChjaGFyIHgsIHNob3J0IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIHNob3J0KSBfX3N0ZGNhbGwgc190Zl9iSChjaGFyIHgsIHVuc2lnbmVkIHNob3J0IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKGludCkgX19zdGRjYWxsIHNfdGZfYmkoY2hhciB4LCBpbnQgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQodW5zaWduZWQgaW50KSBfX3N0ZGNhbGwgc190Zl9iSShjaGFyIHgsIHVuc2lnbmVkIGludCBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChsb25nKSBfX3N0ZGNhbGwgc190Zl9ibChjaGFyIHgsIGxvbmcgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQodW5zaWduZWQgbG9uZykgX19zdGRjYWxsIHNfdGZfYkwoY2hhciB4LCB1bnNpZ25lZCBsb25nIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKFBZX0xPTkdfTE9ORykgX19zdGRjYWxsIHNfdGZfYnEoY2hhciB4LCBQWV9MT05HX0xPTkcgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQodW5zaWduZWQgUFlfTE9OR19MT05HKSBfX3N0ZGNhbGwgc190Zl9iUShjaGFyIHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChmbG9hdCkgX19zdGRjYWxsIHNfdGZfYmYoY2hhciB4LCBmbG9hdCBjKSB7IFM7IHJldHVybiBjLzM7IH0KLUVYUE9SVChkb3VibGUpIF9fc3RkY2FsbCBzX3RmX2JkKGNoYXIgeCwgZG91YmxlIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHNpZ25lZCBjaGFyKSBfX3N0ZGNhbGwgc190Zl9iYihzaWduZWQgY2hhciB4LCBzaWduZWQgY2hhciBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBjaGFyKSBfX3N0ZGNhbGwgc190Zl9iQihzaWduZWQgY2hhciB4LCB1bnNpZ25lZCBjaGFyIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHNob3J0KSBfX3N0ZGNhbGwgc190Zl9iaChzaWduZWQgY2hhciB4LCBzaG9ydCBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBzaG9ydCkgX19zdGRjYWxsIHNfdGZfYkgoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgc2hvcnQgYykgeyBVOyByZXR1cm4gYy8zOyB9CitFWFBPUlQoaW50KSBfX3N0ZGNhbGwgc190Zl9iaShzaWduZWQgY2hhciB4LCBpbnQgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgaW50KSBfX3N0ZGNhbGwgc190Zl9iSShzaWduZWQgY2hhciB4LCB1bnNpZ25lZCBpbnQgYykgeyBVOyByZXR1cm4gYy8zOyB9CitFWFBPUlQobG9uZykgX19zdGRjYWxsIHNfdGZfYmwoc2lnbmVkIGNoYXIgeCwgbG9uZyBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBsb25nKSBfX3N0ZGNhbGwgc190Zl9iTChzaWduZWQgY2hhciB4LCB1bnNpZ25lZCBsb25nIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKFBZX0xPTkdfTE9ORykgX19zdGRjYWxsIHNfdGZfYnEoc2lnbmVkIGNoYXIgeCwgUFlfTE9OR19MT05HIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgX19zdGRjYWxsIHNfdGZfYlEoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgUFlfTE9OR19MT05HIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGZsb2F0KSBfX3N0ZGNhbGwgc190Zl9iZihzaWduZWQgY2hhciB4LCBmbG9hdCBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVChkb3VibGUpIF9fc3RkY2FsbCBzX3RmX2JkKHNpZ25lZCBjaGFyIHgsIGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVCh2b2lkKSBfX3N0ZGNhbGwgc190dl9pKGludCBjKSB7IFM7IHJldHVybjsgfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwppbmRleCAyOTQ4ZDk4Li44YzI5YzU1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCkBAIC0yNjQsMTYgKzI2NCw2IEBACiAJUHlHSUxTdGF0ZV9SZWxlYXNlKHN0YXRlKTsKIH0KIAotdHlwZWRlZiBzdHJ1Y3QgewotCWZmaV9jbG9zdXJlICpwY2w7IC8qIHRoZSBDIGNhbGxhYmxlICovCi0JZmZpX2NpZiBjaWY7Ci0JUHlPYmplY3QgKmNvbnZlcnRlcnM7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOwotCVNFVEZVTkMgc2V0ZnVuYzsKLQlmZmlfdHlwZSAqcmVzdHlwZTsKLQlmZmlfdHlwZSAqYXR5cGVzWzBdOwotfSBmZmlfaW5mbzsKLQogc3RhdGljIHZvaWQgY2xvc3VyZV9mY24oZmZpX2NpZiAqY2lmLAogCQkJdm9pZCAqcmVzcCwKIAkJCXZvaWQgKiphcmdzLApAQCAtMjg5LDE2ICsyNzksMTAgQEAKIAkJCSAgYXJncyk7CiB9CiAKLXZvaWQgRnJlZUNhbGxiYWNrKFRIVU5LIHRodW5rKQotewotCUZyZWVDbG9zdXJlKCgoZmZpX2luZm8gKil0aHVuayktPnBjbCk7Ci0JUHlNZW1fRnJlZSh0aHVuayk7Ci19Ci0KLVRIVU5LIEFsbG9jRnVuY3Rpb25DYWxsYmFjayhQeU9iamVjdCAqY2FsbGFibGUsCi0JCQkgICAgUHlPYmplY3QgKmNvbnZlcnRlcnMsCi0JCQkgICAgUHlPYmplY3QgKnJlc3R5cGUsCi0JCQkgICAgaW50IGlzX2NkZWNsKQorZmZpX2luZm8gKkFsbG9jRnVuY3Rpb25DYWxsYmFjayhQeU9iamVjdCAqY2FsbGFibGUsCisJCQkJUHlPYmplY3QgKmNvbnZlcnRlcnMsCisJCQkJUHlPYmplY3QgKnJlc3R5cGUsCisJCQkJaW50IGlzX2NkZWNsKQogewogCWludCByZXN1bHQ7CiAJZmZpX2luZm8gKnA7CkBAIC0zMTMsMTMgKzI5NywxNCBAQAogCX0KIAlwLT5wY2wgPSBNYWxsb2NDbG9zdXJlKCk7CiAJaWYgKHAtPnBjbCA9PSBOVUxMKSB7Ci0JCVB5TWVtX0ZyZWUocCk7CiAJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOworCQlnb3RvIGVycm9yOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBuQXJnczsgKytpKSB7CiAJCVB5T2JqZWN0ICpjbnYgPSBQeVNlcXVlbmNlX0dldEl0ZW0oY29udmVydGVycywgaSk7CisJCWlmIChjbnYgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3I7CiAJCXAtPmF0eXBlc1tpXSA9IEdldFR5cGUoY252KTsKIAkJUHlfREVDUkVGKGNudik7CiAJfQpAQCAtMzMwLDEyICszMTUsMTAgQEAKIAkJcC0+cmVzdHlwZSA9ICZmZmlfdHlwZV92b2lkOwogCX0gZWxzZSB7CiAJCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdChyZXN0eXBlKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkgewotCQkJUHlNZW1fRnJlZShwKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisJCWlmIChkaWN0ID09IE5VTEwpCisJCQlnb3RvIGVycm9yOwogCQlwLT5zZXRmdW5jID0gZGljdC0+c2V0ZnVuYzsKLQkJcC0+cmVzdHlwZSA9ICZkaWN0LT5mZmlfdHlwZTsKKwkJcC0+cmVzdHlwZSA9ICZkaWN0LT5mZmlfdHlwZV9wb2ludGVyOwogCX0KIAogCWNjID0gRkZJX0RFRkFVTFRfQUJJOwpAQCAtMzQ5LDIxICszMzIsMjYgQEAKIAlpZiAocmVzdWx0ICE9IEZGSV9PSykgewogCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAogCQkJICAgICAiZmZpX3ByZXBfY2lmIGZhaWxlZCB3aXRoICVkIiwgcmVzdWx0KTsKLQkJUHlNZW1fRnJlZShwKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZXJyb3I7CiAJfQogCXJlc3VsdCA9IGZmaV9wcmVwX2Nsb3N1cmUocC0+cGNsLCAmcC0+Y2lmLCBjbG9zdXJlX2ZjbiwgcCk7CiAJaWYgKHJlc3VsdCAhPSBGRklfT0spIHsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKIAkJCSAgICAgImZmaV9wcmVwX2Nsb3N1cmUgZmFpbGVkIHdpdGggJWQiLCByZXN1bHQpOwotCQlQeU1lbV9GcmVlKHApOwotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBlcnJvcjsKIAl9CiAKIAlwLT5jb252ZXJ0ZXJzID0gY29udmVydGVyczsKIAlwLT5jYWxsYWJsZSA9IGNhbGxhYmxlOworCXJldHVybiBwOwogCi0JcmV0dXJuIChUSFVOSylwOworICBlcnJvcjoKKwlpZiAocCkgeworCQlpZiAocC0+cGNsKQorCQkJRnJlZUNsb3N1cmUocC0+cGNsKTsKKwkJUHlNZW1fRnJlZShwKTsKKwl9CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCmluZGV4IDlkOWUzMjIuLjgxNjNmNDkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCkBAIC02NCwxNCArNjQsMTcgQEAKICNlbmRpZgogCiAjaWZkZWYgTVNfV0lOMzIKLSNkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyNpbmNsdWRlIDxtYWxsb2MuaD4KICNlbmRpZgogCiAjaW5jbHVkZSA8ZmZpLmg+CiAjaW5jbHVkZSAiY3R5cGVzLmgiCiAKLSNpZmRlZiBfREVCVUcKLSNkZWZpbmUgREVCVUdfRVhDRVBUSU9OUyAvKiAqLworI2lmIGRlZmluZWQoX0RFQlVHKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorLyogRG9uJ3QgdXNlIHN0cnVjdHVyZWQgZXhjZXB0aW9uIGhhbmRsaW5nIG9uIFdpbmRvd3MgaWYgdGhpcyBpcyBkZWZpbmVkLgorICAgTWluZ1csIEFGQUlLLCBkb2Vzbid0IHN1cHBvcnQgaXQuCisqLworI2RlZmluZSBET05UX1VTRV9TRUgKICNlbmRpZgogCiAjaWZkZWYgTVNfV0lOMzIKQEAgLTk2LDYgKzk5LDcgQEAKIAlyZXR1cm4gbHBNc2dCdWY7CiB9CiAKKyNpZm5kZWYgRE9OVF9VU0VfU0VICiB2b2lkIFNldEV4Y2VwdGlvbihEV09SRCBjb2RlLCBFWENFUFRJT05fUkVDT1JEICpwcikKIHsKIAlUQ0hBUiAqbHBNc2dCdWY7CkBAIC0yNTQsNiArMjU4LDcgQEAKIAkqcmVjb3JkID0gKnB0cnMtPkV4Y2VwdGlvblJlY29yZDsKIAlyZXR1cm4gRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUjsKIH0KKyNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogY2hlY2tfaHJlc3VsdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCkBAIC01NzYsMTQgKzU4MSwxNCBAQAogCS8qIFRoaXMgbGl0dGxlIHRyaWNrIHdvcmtzIGNvcnJlY3RseSB3aXRoIE1TVkMuCiAJICAgSXQgcmV0dXJucyBzbWFsbCBzdHJ1Y3R1cmVzIGluIHJlZ2lzdGVycwogCSovCi0JaWYgKGRpY3QtPmZmaV90eXBlLnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSB7Ci0JCWlmIChkaWN0LT5mZmlfdHlwZS5zaXplIDw9IDQpCisJaWYgKGRpY3QtPmZmaV90eXBlX3BvaW50ZXIudHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpIHsKKwkJaWYgKGRpY3QtPmZmaV90eXBlX3BvaW50ZXIuc2l6ZSA8PSA0KQogCQkJcmV0dXJuICZmZmlfdHlwZV9zaW50MzI7Ci0JCWVsc2UgaWYgKGRpY3QtPmZmaV90eXBlLnNpemUgPD0gOCkKKwkJZWxzZSBpZiAoZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5zaXplIDw9IDgpCiAJCQlyZXR1cm4gJmZmaV90eXBlX3NpbnQ2NDsKIAl9CiAjZW5kaWYKLQlyZXR1cm4gJmRpY3QtPmZmaV90eXBlOworCXJldHVybiAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKIH0KIAogCkBAIC02MTIsOSArNjE3LDExIEBACiAJaW50IGNjOwogI2lmZGVmIE1TX1dJTjMyCiAJaW50IGRlbHRhOworI2lmbmRlZiBET05UX1VTRV9TRUgKIAlEV09SRCBkd0V4Y2VwdGlvbkNvZGUgPSAwOwogCUVYQ0VQVElPTl9SRUNPUkQgcmVjb3JkOwogI2VuZGlmCisjZW5kaWYKIAkvKiBYWFggY2hlY2sgYmVmb3JlIGhlcmUgKi8KIAlpZiAocmVzdHlwZSA9PSBOVUxMKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCkBAIC02NDAsMTQgKzY0NywxNCBAQAogCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19QWVRIT05BUEkpID09IDApCiAJCVB5X1VOQkxPQ0tfVEhSRUFEUwogI2lmZGVmIE1TX1dJTjMyCi0jaWZuZGVmIERFQlVHX0VYQ0VQVElPTlMKKyNpZm5kZWYgRE9OVF9VU0VfU0VICiAJX190cnkgewogI2VuZGlmCiAJCWRlbHRhID0KICNlbmRpZgogCQkJZmZpX2NhbGwoJmNpZiwgKHZvaWQgKilwUHJvYywgcmVzbWVtLCBhdmFsdWVzKTsKICNpZmRlZiBNU19XSU4zMgotI2lmbmRlZiBERUJVR19FWENFUFRJT05TCisjaWZuZGVmIERPTlRfVVNFX1NFSAogCX0KIAlfX2V4Y2VwdCAoSGFuZGxlRXhjZXB0aW9uKEdldEV4Y2VwdGlvbkluZm9ybWF0aW9uKCksCiAJCQkJICAmZHdFeGNlcHRpb25Db2RlLCAmcmVjb3JkKSkgewpAQCAtNjU4LDEwICs2NjUsMTIgQEAKIAlpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQogCQlQeV9CTE9DS19USFJFQURTCiAjaWZkZWYgTVNfV0lOMzIKKyNpZm5kZWYgRE9OVF9VU0VfU0VICiAJaWYgKGR3RXhjZXB0aW9uQ29kZSkgewogCQlTZXRFeGNlcHRpb24oZHdFeGNlcHRpb25Db2RlLCAmcmVjb3JkKTsKIAkJcmV0dXJuIC0xOwogCX0KKyNlbmRpZgogCWlmIChkZWx0YSA8IDApIHsKIAkJaWYgKGZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpCiAJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKQEAgLTc1OCw2ICs3NjcsOCBAQAogCWlmIChjbHNfc3RyKSB7CiAJCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgY2xzX3N0cik7CiAJCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlTdHJpbmdfRnJvbVN0cmluZygiOiAiKSk7CisJCWlmIChzID09IE5VTEwpCisJCQlnb3RvIGVycm9yOwogCX0gZWxzZQogCQlQeUVycl9DbGVhcigpOwogCW1zZ19zdHIgPSBQeU9iamVjdF9TdHIodik7CkBAIC03NjYsMTIgKzc3NywxNSBAQAogCWVsc2UgewogCQlQeUVycl9DbGVhcigpOwogCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIj8/PyIpKTsKKwkJaWYgKHMgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3I7CiAJfQogCVB5RXJyX1NldE9iamVjdChleGNfY2xhc3MsIHMpOworZXJyb3I6CiAJUHlfWERFQ1JFRih0cCk7CiAJUHlfWERFQ1JFRih2KTsKIAlQeV9YREVDUkVGKHRiKTsKLQlQeV9ERUNSRUYocyk7CisJUHlfWERFQ1JFRihzKTsKIH0KIAogCkBAIC0xMzYzLDcgKzEzNzcsNyBAQAogY29udmVydGVyKFB5T2JqZWN0ICpvYmosIHZvaWQgKiphZGRyZXNzKQogewogCSphZGRyZXNzID0gUHlMb25nX0FzVm9pZFB0cihvYmopOwotCXJldHVybiBhZGRyZXNzICE9IE5VTEw7CisJcmV0dXJuICphZGRyZXNzICE9IE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNDIzLDcxICsxNDM3LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgY2hhciBjYXN0X2RvY1tdID0KLSJjYXN0KGNvYmplY3QsIGN0eXBlKSAtPiBjdHlwZS1pbnN0YW5jZVxuXAotXG5cCi1DcmVhdGUgYW4gaW5zdGFuY2Ugb2YgY3R5cGUsIGFuZCBjb3B5IHRoZSBpbnRlcm5hbCBtZW1vcnkgYnVmZmVyXG5cCi1vZiBjb2JqZWN0IHRvIHRoZSBuZXcgaW5zdGFuY2UuICBTaG91bGQgYmUgdXNlZCB0byBjYXN0IG9uZSB0eXBlXG5cCi1vZiBwb2ludGVyIHRvIGFub3RoZXIgdHlwZSBvZiBwb2ludGVyLlxuXAotRG9lc24ndCB3b3JrIGNvcnJlY3RseSB3aXRoIGN0eXBlcyBpbnRlZ2Vycy5cbiI7Ci0KLXN0YXRpYyBpbnQgY2FzdF9jaGVja19wb2ludGVydHlwZShQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqKnBvYmopCi17Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQotCWlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayhhcmcpKSB7Ci0JCSpwb2JqID0gYXJnOwotCQlyZXR1cm4gMTsKLQl9Ci0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFyZyk7Ci0JaWYgKGRpY3QpIHsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGRpY3QtPnByb3RvKQotCQkgICAgJiYgKHN0cmNocigic1B6VVpYTyIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgewotCQkJLyogc2ltcGxlIHBvaW50ZXIgdHlwZXMsIGNfdm9pZF9wLCBjX3djaGFyX3AsIEJTVFIsIC4uLiAqLwotCQkJKnBvYmogPSBhcmc7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlpZiAoUHlUeXBlX0NoZWNrKGFyZykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhc3QoKSBhcmd1bWVudCAyIG11c3QgYmUgYSBwb2ludGVyIHR5cGUsIG5vdCAlcyIsCi0JCQkgICAgICgoUHlUeXBlT2JqZWN0ICopYXJnKS0+dHBfbmFtZSk7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhc3QoKSBhcmd1bWVudCAyIG11c3QgYmUgYSBwb2ludGVyIHR5cGUsIG5vdCBhICVzIiwKLQkJCSAgICAgYXJnLT5vYl90eXBlLT50cF9uYW1lKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqY2FzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JUHlPYmplY3QgKm9iaiwgKmN0eXBlOwotCXN0cnVjdCBhcmd1bWVudCBhOwotCUNEYXRhT2JqZWN0ICpyZXN1bHQ7Ci0KLQkvKiBXZSBjb3VsZCBhbmQgc2hvdWxkIGFsbG93IGFycmF5IHR5cGVzIGZvciB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0JICAgYWxzbywgYnV0IHdlIGNhbm5vdCB1c2UgdGhlIHNpbXBsZSBtZW1jcHkgYmVsb3cgZm9yIHRoZW0uICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyY6Y2FzdCIsICZvYmosICZjYXN0X2NoZWNrX3BvaW50ZXJ0eXBlLCAmY3R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoLTEgPT0gQ29udlBhcmFtKG9iaiwgMSwgJmEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSAoQ0RhdGFPYmplY3QgKilQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGN0eXBlLCBOVUxMKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRihhLmtlZXApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLy8gcmVzdWx0LT5iX3NpemUKLQkvLyBhLmZmaV90eXBlLT5zaXplCi0JbWVtY3B5KHJlc3VsdC0+Yl9wdHIsICZhLnZhbHVlLAotCSAgICAgICBtaW4ocmVzdWx0LT5iX3NpemUsIChpbnQpYS5mZmlfdHlwZS0+c2l6ZSkpOwotCVB5X1hERUNSRUYoYS5rZWVwKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwotfQotCi0KIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7Ci0JeyJjYXN0IiwgY2FzdCwgTUVUSF9WQVJBUkdTLCBjYXN0X2RvY30sCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKIAl7InNldF9jb252ZXJzaW9uX21vZGUiLCBzZXRfY29udmVyc2lvbl9tb2RlLCBNRVRIX1ZBUkFSR1MsIHNldF9jb252ZXJzaW9uX21vZGVfZG9jfSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jIGIvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCmluZGV4IDMzNmYyNjUuLjdiZWY0MTIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKQEAgLTQ5OSw3ICs0OTksNyBAQAogCWxvbmcgdmFsOwogCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQkqKGNoYXIgKilwdHIgPSAoY2hhcilTRVQoKihjaGFyICopcHRyLCAoY2hhcil2YWwsIHNpemUpOworCSooc2lnbmVkIGNoYXIgKilwdHIgPSAoc2lnbmVkIGNoYXIpU0VUKCooc2lnbmVkIGNoYXIgKilwdHIsIChzaWduZWQgY2hhcil2YWwsIHNpemUpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC01MDcsNyArNTA3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JY2hhciB2YWwgPSAqKGNoYXIgKilwdHI7CisJc2lnbmVkIGNoYXIgdmFsID0gKihzaWduZWQgY2hhciAqKXB0cjsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KQEAgLTUzNiw5ICs1MzYsMTIgQEAKIGhfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKQogewogCWxvbmcgdmFsOworCXNob3J0IHg7CiAJaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCSooc2hvcnQgKilwdHIgPSAoc2hvcnQpU0VUKCooc2hvcnQgKilwdHIsIChzaG9ydCl2YWwsIHNpemUpOworCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworCXggPSBTRVQoeCwgKHNob3J0KXZhbCwgc2l6ZSk7CisJbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTU1MCwyNCArNTUzLDI4IEBACiAJc2hvcnQgZmllbGQ7CiAJaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCWZpZWxkID0gU1dBUF8yKCooc2hvcnQgKilwdHIpOworCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisJZmllbGQgPSBTV0FQXzIoZmllbGQpOwogCWZpZWxkID0gU0VUKGZpZWxkLCAoc2hvcnQpdmFsLCBzaXplKTsKLQkqKHNob3J0ICopcHRyID0gU1dBUF8yKGZpZWxkKTsKKwlmaWVsZCA9IFNXQVBfMihmaWVsZCk7CisJbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGhfZ2V0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQlzaG9ydCB2YWwgPSAqKHNob3J0ICopcHRyOworCXNob3J0IHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX2dldF9zdyh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0Jc2hvcnQgdmFsID0gKihzaG9ydCAqKXB0cjsKKwlzaG9ydCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCXZhbCA9IFNXQVBfMih2YWwpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwpAQCAtNTc3LDEwICs1ODQsMTIgQEAKIEhfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgdmFsOworCXVuc2lnbmVkIHNob3J0IHg7CiAJaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQkqKHVuc2lnbmVkIHNob3J0ICopcHRyID0gKHVuc2lnbmVkIHNob3J0KVNFVCgqKHVuc2lnbmVkIHNob3J0ICopcHRyLAotCQkJCQkJICAgICAodW5zaWduZWQgc2hvcnQpdmFsLCBzaXplKTsKKwltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKwl4ID0gU0VUKHgsICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC01OTEsOSArNjAwLDExIEBACiAJdW5zaWduZWQgc2hvcnQgZmllbGQ7CiAJaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQlmaWVsZCA9IFNXQVBfMigqKHVuc2lnbmVkIHNob3J0ICopcHRyKTsKKwltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworCWZpZWxkID0gU1dBUF8yKGZpZWxkKTsKIAlmaWVsZCA9IFNFVChmaWVsZCwgKHVuc2lnbmVkIHNob3J0KXZhbCwgc2l6ZSk7Ci0JKih1bnNpZ25lZCBzaG9ydCAqKXB0ciA9IFNXQVBfMihmaWVsZCk7CisJZmllbGQgPSBTV0FQXzIoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTYwMSw3ICs2MTIsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEhfZ2V0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBzaG9ydCB2YWwgPSAqKHVuc2lnbmVkIHNob3J0ICopcHRyOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CkBAIC02MDksNyArNjIxLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBIX2dldF9zdyh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsID0gKih1bnNpZ25lZCBzaG9ydCAqKXB0cjsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCXZhbCA9IFNXQVBfMih2YWwpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwpAQCAtNjE5LDkgKzYzMiwxMiBAQAogaV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIHVuc2lnbmVkIHNpemUpCiB7CiAJbG9uZyB2YWw7CisJaW50IHg7CiAJaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCSooaW50ICopcHRyID0gKGludClTRVQoKihpbnQgKilwdHIsIChpbnQpdmFsLCBzaXplKTsKKwltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKwl4ID0gU0VUKHgsIChpbnQpdmFsLCBzaXplKTsKKwltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIApAQCAtNjMyLDkgKzY0OCwxMSBAQAogCWludCBmaWVsZDsKIAlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JZmllbGQgPSBTV0FQX0lOVCgqKGludCAqKXB0cik7CisJbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKwlmaWVsZCA9IFNXQVBfSU5UKGZpZWxkKTsKIAlmaWVsZCA9IFNFVChmaWVsZCwgKGludCl2YWwsIHNpemUpOwotCSooaW50ICopcHRyID0gU1dBUF9JTlQoZmllbGQpOworCWZpZWxkID0gU1dBUF9JTlQoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTY0Miw3ICs2NjAsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGlfZ2V0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQlpbnQgdmFsID0gKihpbnQgKilwdHI7CisJaW50IHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CkBAIC02NTAsNyArNjY5LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpX2dldF9zdyh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JaW50IHZhbCA9ICooaW50ICopcHRyOworCWludCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCXZhbCA9IFNXQVBfSU5UKHZhbCk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CkBAIC02ODQsOSArNzA0LDEyIEBACiBJX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgdW5zaWduZWQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKKwl1bnNpZ25lZCBpbnQgeDsKIAlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiAgTlVMTDsKLQkqKHVuc2lnbmVkIGludCAqKXB0ciA9ICh1bnNpZ25lZCBpbnQpU0VUKCoodW5zaWduZWQgaW50ICopcHRyLCAodW5zaWduZWQgaW50KXZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCAodW5zaWduZWQgaW50KXZhbCwgc2l6ZSk7CisJbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTY5Nyw5ICs3MjAsMTAgQEAKIAl1bnNpZ25lZCBpbnQgZmllbGQ7CiAJaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gIE5VTEw7Ci0JZmllbGQgPSBTV0FQX0lOVCgqKHVuc2lnbmVkIGludCAqKXB0cik7CisJbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKIAlmaWVsZCA9ICh1bnNpZ25lZCBpbnQpU0VUKGZpZWxkLCAodW5zaWduZWQgaW50KXZhbCwgc2l6ZSk7Ci0JKih1bnNpZ25lZCBpbnQgKilwdHIgPSBTV0FQX0lOVChmaWVsZCk7CisJZmllbGQgPSBTV0FQX0lOVChmaWVsZCk7CisJbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIApAQCAtNzA3LDcgKzczMSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogSV9nZXQodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCXVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKXB0cjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKIH0KQEAgLTcxNSw3ICs3NDAsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIElfZ2V0X3N3KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKilwdHI7CisJdW5zaWduZWQgaW50IHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJdmFsID0gU1dBUF9JTlQodmFsKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKQEAgLTcyNSw5ICs3NTEsMTIgQEAKIGxfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKQogewogCWxvbmcgdmFsOworCWxvbmcgeDsKIAlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JKihsb25nICopcHRyID0gKGxvbmcpU0VUKCoobG9uZyAqKXB0ciwgdmFsLCBzaXplKTsKKwltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKwl4ID0gU0VUKHgsIHZhbCwgc2l6ZSk7CisJbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTczOCw5ICs3NjcsMTEgQEAKIAlsb25nIGZpZWxkOwogCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQlmaWVsZCA9IFNXQVBfTE9ORygqKGxvbmcgKilwdHIpOworCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisJZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOwogCWZpZWxkID0gKGxvbmcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOwotCSoobG9uZyAqKXB0ciA9IFNXQVBfTE9ORyhmaWVsZCk7CisJZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTc0OCw3ICs3NzksOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxfZ2V0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQlsb25nIHZhbCA9ICoobG9uZyAqKXB0cjsKKwlsb25nIHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CkBAIC03NTYsNyArNzg4LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsX2dldF9zdyh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JbG9uZyB2YWwgPSAqKGxvbmcgKilwdHI7CisJbG9uZyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCXZhbCA9IFNXQVBfTE9ORyh2YWwpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwpAQCAtNzY2LDkgKzc5OSwxMiBAQAogTF9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIHVuc2lnbmVkIHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CisJdW5zaWduZWQgbG9uZyB4OwogCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuICBOVUxMOwotCSoodW5zaWduZWQgbG9uZyAqKXB0ciA9ICh1bnNpZ25lZCBsb25nKVNFVCgqKHVuc2lnbmVkIGxvbmcgKilwdHIsIHZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCB2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC03NzksOSArODE1LDExIEBACiAJdW5zaWduZWQgbG9uZyBmaWVsZDsKIAlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiAgTlVMTDsKLQlmaWVsZCA9IFNXQVBfTE9ORygqKHVuc2lnbmVkIGxvbmcgKilwdHIpOworCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisJZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOwogCWZpZWxkID0gKHVuc2lnbmVkIGxvbmcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOwotCSoodW5zaWduZWQgbG9uZyAqKXB0ciA9IFNXQVBfTE9ORyhmaWVsZCk7CisJZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTc4OSw3ICs4MjcsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIExfZ2V0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbCA9ICoodW5zaWduZWQgbG9uZyAqKXB0cjsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CiB9CkBAIC03OTcsNyArODM2LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBMX2dldF9zdyh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWwgPSAqKHVuc2lnbmVkIGxvbmcgKilwdHI7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCXZhbCA9IFNXQVBfTE9ORyh2YWwpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOwpAQCAtODA4LDkgKzg0OCwxMiBAQAogcV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIHVuc2lnbmVkIHNpemUpCiB7CiAJUFlfTE9OR19MT05HIHZhbDsKKwlQWV9MT05HX0xPTkcgeDsKIAlpZiAoZ2V0X2xvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCSooUFlfTE9OR19MT05HICopcHRyID0gKFBZX0xPTkdfTE9ORylTRVQoKihQWV9MT05HX0xPTkcgKilwdHIsIHZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCB2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC04MjEsMTYgKzg2NCwxOSBAQAogCVBZX0xPTkdfTE9ORyBmaWVsZDsKIAlpZiAoZ2V0X2xvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCWZpZWxkID0gU1dBUF84KCooUFlfTE9OR19MT05HICopcHRyKTsKKwltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworCWZpZWxkID0gU1dBUF84KGZpZWxkKTsKIAlmaWVsZCA9IChQWV9MT05HX0xPTkcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOwotCSooUFlfTE9OR19MT05HICopcHRyID0gU1dBUF84KGZpZWxkKTsKKwlmaWVsZCA9IFNXQVBfOChmaWVsZCk7CisJbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHFfZ2V0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQlQWV9MT05HX0xPTkcgdmFsID0gKihQWV9MT05HX0xPTkcgKilwdHI7CisJUFlfTE9OR19MT05HIHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsKTsKIH0KQEAgLTgzOCw3ICs4ODQsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHFfZ2V0X3N3KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQlQWV9MT05HX0xPTkcgdmFsID0gKihQWV9MT05HX0xPTkcgKilwdHI7CisJUFlfTE9OR19MT05HIHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJdmFsID0gU1dBUF84KHZhbCk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsKTsKQEAgLTg0OCw5ICs4OTUsMTIgQEAKIFFfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKQogewogCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CisJdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CiAJaWYgKGdldF91bG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JKih1bnNpZ25lZCBQWV9MT05HX0xPTkcgKilwdHIgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKVNFVCgqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKXB0ciwgdmFsLCBzaXplKTsKKwltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKwl4ID0gU0VUKHgsIHZhbCwgc2l6ZSk7CisJbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTg2MSwxNiArOTExLDE5IEBACiAJdW5zaWduZWQgUFlfTE9OR19MT05HIGZpZWxkOwogCWlmIChnZXRfdWxvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCWZpZWxkID0gU1dBUF84KCoodW5zaWduZWQgUFlfTE9OR19MT05HICopcHRyKTsKKwltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworCWZpZWxkID0gU1dBUF84KGZpZWxkKTsKIAlmaWVsZCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOwotCSoodW5zaWduZWQgUFlfTE9OR19MT05HICopcHRyID0gU1dBUF84KGZpZWxkKTsKKwlmaWVsZCA9IFNXQVBfOChmaWVsZCk7CisJbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFFfZ2V0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsID0gKih1bnNpZ25lZCBQWV9MT05HX0xPTkcgKilwdHI7CisJdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWwpOwogfQpAQCAtODc4LDcgKzkzMSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUV9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWwgPSAqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKXB0cjsKKwl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQXzgodmFsKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbCk7CkBAIC05MDMsMTQgKzk1NywxNiBAQAogCQkJICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCXJldHVybiBOVUxMOwogCX0KLQkqKGRvdWJsZSAqKXB0ciA9IHg7CisJbWVtY3B5KHB0ciwgJngsIHNpemVvZihkb3VibGUpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRfZ2V0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKCooZG91YmxlICopcHRyKTsKKwlkb3VibGUgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKwlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC05NTcsMTQgKzEwMTMsMTYgQEAKIAkJCSAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JKihmbG9hdCAqKXB0ciA9IHg7CisJbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgqKGZsb2F0ICopcHRyKTsKKwlmbG9hdCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEzMTcsNiArMTM3NSw3IEBACiAJCWlmICgtMSA9PSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigoUHlVbmljb2RlT2JqZWN0ICopdmFsdWUsCiAJCQkJCSAgICAgICBidWZmZXIsIFB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSkpKSB7CiAJCQlQeV9ERUNSRUYodmFsdWUpOworCQkJUHlfREVDUkVGKGtlZXApOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJUHlfREVDUkVGKHZhbHVlKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaCBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAppbmRleCAxNzlkY2YxLi43OTg4NTk1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCkBAIC0yLDE1ICsyLDYgQEAKIAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCiB0eXBlZGVmIGludCBQeV9zc2l6ZV90OwotI2RlZmluZSBsZW5mdW5jIGlucXVpcnkKLSNkZWZpbmUgcmVhZGJ1ZmZlcnByb2MgZ2V0cmVhZGJ1ZmZlcnByb2MKLSNkZWZpbmUgd3JpdGVidWZmZXJwcm9jIGdldHdyaXRlYnVmZmVycHJvYwotI2RlZmluZSBzZWdjb3VudHByb2MgZ2V0c2VnY291bnRwcm9jCi0jZGVmaW5lIGNoYXJidWZmZXJwcm9jIGdldGNoYXJidWZmZXJwcm9jCi0jZGVmaW5lIHNzaXplYXJnZnVuYyBpbnRhcmdmdW5jCi0jZGVmaW5lIHNzaXplc3NpemVhcmdmdW5jIGludGludGFyZ2Z1bmMKLSNkZWZpbmUgc3NpemVvYmphcmdwcm9jIGludG9iamFyZ3Byb2MKLSNkZWZpbmUgc3NpemVzc2l6ZW9iamFyZ3Byb2MgaW50aW50b2JqYXJncHJvYwogI2VuZGlmCiAKICNpZm5kZWYgTVNfV0lOMzIKQEAgLTMwLDggKzIxLDkgQEAKICNkZWZpbmUgUFlfTE9OR19MT05HIExPTkdfTE9ORwogI2VuZGlmCiAKLXR5cGVkZWYgaW50ICgqVEhVTkspKHZvaWQpOwogdHlwZWRlZiBzdHJ1Y3QgdGFnQ0RhdGFPYmplY3QgQ0RhdGFPYmplY3Q7Cit0eXBlZGVmIFB5T2JqZWN0ICooKiBHRVRGVU5DKSh2b2lkICosIHVuc2lnbmVkIHNpemUpOwordHlwZWRlZiBQeU9iamVjdCAqKCogU0VURlVOQykodm9pZCAqLCBQeU9iamVjdCAqdmFsdWUsIHVuc2lnbmVkIHNpemUpOwogCiAvKiBBIGRlZmF1bHQgYnVmZmVyIGluIENEYXRhT2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3Igc21hbGwgQyB0eXBlcy4gIElmCiB0aGlzIGJ1ZmZlciBpcyB0b28gc21hbGwsIFB5TWVtX01hbGxvYyB3aWxsIGJlIGNhbGxlZCB0byBjcmVhdGUgYSBsYXJnZXIgb25lLApAQCAtNzIsNiArNjQsMTYgQEAKIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKKwlmZmlfY2xvc3VyZSAqcGNsOyAvKiB0aGUgQyBjYWxsYWJsZSAqLworCWZmaV9jaWYgY2lmOworCVB5T2JqZWN0ICpjb252ZXJ0ZXJzOworCVB5T2JqZWN0ICpjYWxsYWJsZTsKKwlTRVRGVU5DIHNldGZ1bmM7CisJZmZpX3R5cGUgKnJlc3R5cGU7CisJZmZpX3R5cGUgKmF0eXBlc1swXTsKK30gZmZpX2luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKIAkvKiBGaXJzdCBwYXJ0IGlkZW50aWNhbCB0byB0YWdDRGF0YU9iamVjdCAqLwogCVB5T2JqZWN0X0hFQUQKIAljaGFyICpiX3B0cjsJCS8qIHBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrICovCkBAIC04NSw3ICs4Nyw3IEBACiAJdW5pb24gdmFsdWUgYl92YWx1ZTsKIAkvKiBlbmQgb2YgdGFnQ0RhdGFPYmplY3QsIGFkZGl0aW9uYWwgZmllbGRzIGZvbGxvdyAqLwogCi0JVEhVTksgdGh1bms7CisJZmZpX2luZm8gKnRodW5rOwogCVB5T2JqZWN0ICpjYWxsYWJsZTsKIAogCS8qIFRoZXNlIHR3byBmaWVsZHMgd2lsbCBvdmVycmlkZSB0aGUgb25lcyBpbiB0aGUgdHlwZSdzIHN0Z2RpY3QgaWYKQEAgLTE1NCwxNyArMTU2LDEyIEBACiAKIGV4dGVybiB2b2lkIGluaXRfY2FsbGJhY2tzX2luX21vZHVsZShQeU9iamVjdCAqbSk7CiAKLWV4dGVybiBUSFVOSyBBbGxvY0Z1bmN0aW9uQ2FsbGJhY2soUHlPYmplY3QgKmNhbGxhYmxlLAotCQkJCSAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAotCQkJCSAgIFB5T2JqZWN0ICpyZXN0eXBlLAotCQkJCSAgIGludCBzdGRjYWxsKTsKLWV4dGVybiB2b2lkIEZyZWVDYWxsYmFjayhUSFVOSyk7Ci0KIGV4dGVybiBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdOwogCi10eXBlZGVmIFB5T2JqZWN0ICooKiBHRVRGVU5DKSh2b2lkICosIHVuc2lnbmVkIHNpemUpOwotdHlwZWRlZiBQeU9iamVjdCAqKCogU0VURlVOQykodm9pZCAqLCBQeU9iamVjdCAqdmFsdWUsIHVuc2lnbmVkIHNpemUpOwotCitleHRlcm4gZmZpX2luZm8gKkFsbG9jRnVuY3Rpb25DYWxsYmFjayhQeU9iamVjdCAqY2FsbGFibGUsCisJCQkJICAgICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAorCQkJCSAgICAgICBQeU9iamVjdCAqcmVzdHlwZSwKKwkJCQkgICAgICAgaW50IHN0ZGNhbGwpOwogLyogYSB0YWJsZSBlbnRyeSBkZXNjcmliaW5nIGEgcHJlZGVmaW5lZCBjdHlwZXMgdHlwZSAqLwogc3RydWN0IGZpZWxkZGVzYyB7CiAJY2hhciBjb2RlOwpAQCAtMjAxLDcgKzE5OCw3IEBACiAJUHlfc3NpemVfdCBzaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgKi8KIAlQeV9zc2l6ZV90IGFsaWduOwkvKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCiAJUHlfc3NpemVfdCBsZW5ndGg7CS8qIG51bWJlciBvZiBmaWVsZHMgKi8KLQlmZmlfdHlwZSBmZmlfdHlwZTsKKwlmZmlfdHlwZSBmZmlfdHlwZV9wb2ludGVyOwogCVB5T2JqZWN0ICpwcm90bzsJLyogT25seSBmb3IgUG9pbnRlci9BcnJheU9iamVjdCAqLwogCVNFVEZVTkMgc2V0ZnVuYzsJLyogT25seSBmb3Igc2ltcGxlIG9iamVjdHMgKi8KIAlHRVRGVU5DIGdldGZ1bmM7CS8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZSBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlCmluZGV4IDA5OTFiNjMuLmMxZTVjZDQgMTAwNzU1Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlCkBAIC0zNDkwLDYgKzM0OTAsNyBAQAogaSo4Ni0qLWJlb3MqKSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1mcmVlYnNkKiB8IGkqODYtKi1rZnJlZWJzZCotZ251KSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1uZXRic2RlbGYqIHwgaSo4Ni0qLWtuZXRic2QqLWdudSkgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CitpKjg2LSotb3BlbmJzZCopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLXJ0ZW1zKikgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotd2luMzIqKSBUQVJHRVQ9WDg2X1dJTjMyOyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1jeWd3aW4qKSBUQVJHRVQ9WDg2X1dJTjMyOyBUQVJHRVRESVI9eDg2OzsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKaW5kZXggNzZiZjE2ZS4uYzdmMDVkNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKQEAgLTI4LDYgKzI4LDcgQEAKIGkqODYtKi1iZW9zKikgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotZnJlZWJzZCogfCBpKjg2LSota2ZyZWVic2QqLWdudSkgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotbmV0YnNkZWxmKiB8IGkqODYtKi1rbmV0YnNkKi1nbnUpIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OworaSo4Ni0qLW9wZW5ic2QqKSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1ydGVtcyopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLXdpbjMyKikgVEFSR0VUPVg4Nl9XSU4zMjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotY3lnd2luKikgVEFSR0VUPVg4Nl9XSU4zMjsgVEFSR0VURElSPXg4Njs7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMKaW5kZXggNzk1OTgzOC4uNmQ5YTM2NCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAvKiBFTkQoZmZpX2Nsb3N1cmVfQVNNKSAgKi8KIAogLmRhdGEKLS5zZWN0aW9uIF9fVEVYVCxfX2VoX2ZyYW1lLGNvYWxlc2NlZCxub190b2Mrc3RyaXBfc3RhdGljX3N5bXMrbGl2ZV9zdXBwb3J0Cisuc2VjdGlvbiBfX1RFWFQsX19laF9mcmFtZSxjb2FsZXNjZWQsbm9fdG9jK3N0cmlwX3N0YXRpY19zeW1zCiBFSF9mcmFtZTE6CiAJLnNldAlMJHNldCQwLExFQ0lFMS1MU0NJRTEKIAkubG9uZwlMJHNldCQwCTsgTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaS5jCmluZGV4IGU0ZDVmYzMuLjdmNzkyYjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnR5cGUpCiAgICAgewogICAgIGNhc2UgRkZJX1RZUEVfVk9JRDoKLSNpZm5kZWYgWDg2X1dJTjMyCisjaWYgIWRlZmluZWQoWDg2X1dJTjMyKSAmJiAhZGVmaW5lZChfX09wZW5CU0RfXykgJiYgIWRlZmluZWQoX19GcmVlQlNEX18pCiAgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CiAjZW5kaWYKICAgICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX1NJTlQ2NDsKICAgICAgIGJyZWFrOwogCi0jaWZkZWYgWDg2X1dJTjMyCisjaWYgZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CiAgICAgICBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSAxKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jIGIvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYwppbmRleCBjYjNkNTk5Li4zMzZiZTM3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMKQEAgLTM4LDcgKzM4LDcgQEAKIFN0Z0RpY3RfZGVhbGxvYyhTdGdEaWN0T2JqZWN0ICpzZWxmKQogewogCVN0Z0RpY3RfY2xlYXIoc2VsZik7Ci0JUHlNZW1fRnJlZShzZWxmLT5mZmlfdHlwZS5lbGVtZW50cyk7CisJUHlNZW1fRnJlZShzZWxmLT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzKTsKIAlQeURpY3RfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCkBAIC00OSw4ICs0OSw4IEBACiAJaW50IHNpemU7CiAKIAlTdGdEaWN0X2NsZWFyKGRzdCk7Ci0JUHlNZW1fRnJlZShkc3QtPmZmaV90eXBlLmVsZW1lbnRzKTsKLQlkc3QtPmZmaV90eXBlLmVsZW1lbnRzID0gTlVMTDsKKwlQeU1lbV9GcmVlKGRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7CisJZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gTlVMTDsKIAogCWQgPSAoY2hhciAqKWRzdDsKIAlzID0gKGNoYXIgKilzcmM7CkBAIC02NCwxMyArNjQsMTUgQEAKIAlQeV9YSU5DUkVGKGRzdC0+cmVzdHlwZSk7CiAJUHlfWElOQ1JFRihkc3QtPmNoZWNrZXIpOwogCi0JaWYgKHNyYy0+ZmZpX3R5cGUuZWxlbWVudHMgPT0gTlVMTCkKKwlpZiAoc3JjLT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpCiAJCXJldHVybiAwOwogCXNpemUgPSBzaXplb2YoZmZpX3R5cGUgKikgKiAoc3JjLT5sZW5ndGggKyAxKTsKLQlkc3QtPmZmaV90eXBlLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemUpOwotCWlmIChkc3QtPmZmaV90eXBlLmVsZW1lbnRzID09IE5VTEwpCisJZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemUpOworCWlmIChkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwotCW1lbWNweShkc3QtPmZmaV90eXBlLmVsZW1lbnRzLCBzcmMtPmZmaV90eXBlLmVsZW1lbnRzLCBzaXplKTsKKwltZW1jcHkoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAorCSAgICAgICBzcmMtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCisJICAgICAgIHNpemUpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzQsOCArMjM2LDggQEAKIAkgICBzdHVmZiBpcyBzdWNlc3NmdWxseSBmaW5pc2hlZC4gKi8KIAlzdGdkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsJLyogc2V0IGZpbmFsICovCiAKLQlpZiAoc3RnZGljdC0+ZmZpX3R5cGUuZWxlbWVudHMpCi0JCVB5TWVtX0ZyZWUoc3RnZGljdC0+ZmZpX3R5cGUuZWxlbWVudHMpOworCWlmIChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzKQorCQlQeU1lbV9GcmVlKHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMpOwogCiAJYmFzZWRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKikoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9iYXNlKTsKIAlpZiAoYmFzZWRpY3QgJiYgIXVzZV9icm9rZW5fb2xkX2N0eXBlc19zZW1hbnRpY3MpIHsKQEAgLTI0MywxMCArMjQ1LDEyIEBACiAJCWFsaWduID0gYmFzZWRpY3QtPmFsaWduOwogCQl1bmlvbl9zaXplID0gMDsKIAkJdG90YWxfYWxpZ24gPSBhbGlnbiA/IGFsaWduIDogMTsKLQkJc3RnZGljdC0+ZmZpX3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKLQkJc3RnZGljdC0+ZmZpX3R5cGUuZWxlbWVudHMgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGggKyBsZW4gKyAxKSk7Ci0JCW1lbXNldChzdGdkaWN0LT5mZmlfdHlwZS5lbGVtZW50cywgMCwgc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGggKyBsZW4gKyAxKSk7Ci0JCW1lbWNweShzdGdkaWN0LT5mZmlfdHlwZS5lbGVtZW50cywgYmFzZWRpY3QtPmZmaV90eXBlLmVsZW1lbnRzLAorCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisJCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGggKyBsZW4gKyAxKSk7CisJCW1lbXNldChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLCAwLAorCQkgICAgICAgc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGggKyBsZW4gKyAxKSk7CisJCW1lbWNweShzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAorCQkgICAgICAgYmFzZWRpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCiAJCSAgICAgICBzaXplb2YoZmZpX3R5cGUgKikgKiAoYmFzZWRpY3QtPmxlbmd0aCkpOwogCQlmZmlfb2ZzID0gYmFzZWRpY3QtPmxlbmd0aDsKIAl9IGVsc2UgewpAQCAtMjU1LDkgKzI1OSwxMCBAQAogCQlhbGlnbiA9IDA7CiAJCXVuaW9uX3NpemUgPSAwOwogCQl0b3RhbF9hbGlnbiA9IDE7Ci0JCXN0Z2RpY3QtPmZmaV90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7Ci0JCXN0Z2RpY3QtPmZmaV90eXBlLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7Ci0JCW1lbXNldChzdGdkaWN0LT5mZmlfdHlwZS5lbGVtZW50cywgMCwgc2l6ZW9mKGZmaV90eXBlICopICogKGxlbiArIDEpKTsKKwkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7CisJCW1lbXNldChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLCAwLAorCQkgICAgICAgc2l6ZW9mKGZmaV90eXBlICopICogKGxlbiArIDEpKTsKIAkJZmZpX29mcyA9IDA7CiAJfQogCkBAIC0yODMsMTAgKzI4OCwxMCBAQAogCQkJCSAgICAgaSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQkJc3RnZGljdC0+ZmZpX3R5cGUuZWxlbWVudHNbZmZpX29mcyArIGldID0gJmRpY3QtPmZmaV90eXBlOworCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzW2ZmaV9vZnMgKyBpXSA9ICZkaWN0LT5mZmlfdHlwZV9wb2ludGVyOwogCQlkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsgLyogbWFyayBmaWVsZCB0eXBlIGZpbmFsICovCiAJCWlmIChQeVR1cGxlX1NpemUocGFpcikgPT0gMykgeyAvKiBiaXRzIHNwZWNpZmllZCAqLwotCQkJc3dpdGNoKGRpY3QtPmZmaV90eXBlLnR5cGUpIHsKKwkJCXN3aXRjaChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUpIHsKIAkJCWNhc2UgRkZJX1RZUEVfVUlOVDg6CiAJCQljYXNlIEZGSV9UWVBFX1VJTlQxNjoKIAkJCWNhc2UgRkZJX1RZUEVfVUlOVDMyOgpAQCAtMzU3LDggKzM2Miw4IEBACiAJLyogQWRqdXN0IHRoZSBzaXplIGFjY29yZGluZyB0byB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLwogCXNpemUgPSAoKHNpemUgKyB0b3RhbF9hbGlnbiAtIDEpIC8gdG90YWxfYWxpZ24pICogdG90YWxfYWxpZ247CiAKLQlzdGdkaWN0LT5mZmlfdHlwZS5hbGlnbm1lbnQgPSB0b3RhbF9hbGlnbjsKLQlzdGdkaWN0LT5mZmlfdHlwZS5zaXplID0gc2l6ZTsKKwlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmFsaWdubWVudCA9IHRvdGFsX2FsaWduOworCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuc2l6ZSA9IHNpemU7CiAKIAlzdGdkaWN0LT5zaXplID0gc2l6ZTsKIAlzdGdkaWN0LT5hbGlnbiA9IHRvdGFsX2FsaWduOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faG90c2hvdC5jIGIvTW9kdWxlcy9faG90c2hvdC5jCmluZGV4IGQ1YjRjZGUuLjJlZTRlYjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2hvdHNob3QuYworKysgYi9Nb2R1bGVzL19ob3RzaG90LmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpZm5kZWYgSEFWRV9HRVRUSU1FT0ZEQVkKICNlcnJvciAiVGhpcyBtb2R1bGUgcmVxdWlyZXMgZ2V0dGltZW9mZGF5KCkgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zISIKICNlbmRpZgotI2lmIChkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKSkKKyNpZiAoZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykpIHx8IGRlZmluZWQoX19RTlhfXykKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2Vsc2UKICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KQEAgLTMwOCw3ICszMDgsNyBAQAogICAgIGlmICgoZXJyID0gdW5wYWNrX3BhY2tlZF9pbnQoc2VsZiwgJmxlbiwgMCkpKQogICAgICAgICByZXR1cm4gZXJyOwogCi0gICAgYnVmID0gbWFsbG9jKGxlbik7CisgICAgYnVmID0gKGNoYXIgKiltYWxsb2MobGVuKTsKICAgICBmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgIGNoID0gZmdldGMoc2VsZi0+bG9nZnApOwogCWJ1ZltpXSA9IGNoOwpAQCAtOTE4LDcgKzkxOCw3IEBACiAjZW5kaWYKICAgICB9CiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKSB8fCBkZWZpbmVkKFBZT1NfT1MyKSB8fCBcCi0gICAgZGVmaW5lZChfX1ZNUykKKyAgICBkZWZpbmVkKF9fVk1TKSB8fCBkZWZpbmVkIChfX1FOWF9fKQogICAgIHJ1c2FnZV9kaWZmID0gLTE7CiAjZWxzZQogICAgIHsKQEAgLTE0MDMsNyArMTQwMyw3IEBACiAgICAgICAgICsrcmV2OwogICAgIHdoaWxlIChyZXZbaV0gIT0gJyAnICYmIHJldltpXSAhPSAnXDAnKQogICAgICAgICArK2k7Ci0gICAgYnVmZmVyID0gbWFsbG9jKGkgKyAxKTsKKyAgICBidWZmZXIgPSAoY2hhciAqKW1hbGxvYyhpICsgMSk7CiAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgIG1lbW1vdmUoYnVmZmVyLCByZXYsIGkpOwogICAgICAgICBidWZmZXJbaV0gPSAnXDAnOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbHNwcm9mLmMgYi9Nb2R1bGVzL19sc3Byb2YuYwppbmRleCAxN2M3MWU5Li5kNjY1ZjgzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sc3Byb2YuYworKysgYi9Nb2R1bGVzL19sc3Byb2YuYwpAQCAtNTE1LDYgKzUxNSw3IEBACiAJNQogfTsKIAorc3RhdGljIGludCBpbml0aWFsaXplZDsKIHN0YXRpYyBQeVR5cGVPYmplY3QgU3RhdHNFbnRyeVR5cGU7CiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0YXRzU3ViRW50cnlUeXBlOwogCkBAIC04NTcsOCArODU4LDEyIEBACiAJCXJldHVybjsKIAlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUHJvZmlsZXIiLCAoUHlPYmplY3QgKikmUHlQcm9maWxlcl9UeXBlKTsKIAotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRzRW50cnlUeXBlLCAmcHJvZmlsZXJfZW50cnlfZGVzYyk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RhdHNTdWJFbnRyeVR5cGUsICZwcm9maWxlcl9zdWJlbnRyeV9kZXNjKTsKKwlpZiAoIWluaXRpYWxpemVkKSB7CisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRzRW50cnlUeXBlLCAKKwkJCQkJICAmcHJvZmlsZXJfZW50cnlfZGVzYyk7CisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRzU3ViRW50cnlUeXBlLCAKKwkJCQkJICAmcHJvZmlsZXJfc3ViZW50cnlfZGVzYyk7CisJfQogCVB5X0lOQ1JFRigoUHlPYmplY3QqKSAmU3RhdHNFbnRyeVR5cGUpOwogCVB5X0lOQ1JFRigoUHlPYmplY3QqKSAmU3RhdHNTdWJFbnRyeVR5cGUpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJwcm9maWxlcl9lbnRyeSIsCkBAIC04NjYsNCArODcxLDUgQEAKIAlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAicHJvZmlsZXJfc3ViZW50cnkiLAogCQkJICAgKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlKTsKIAllbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApOworCWluaXRpYWxpemVkID0gMTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5jIGIvTW9kdWxlcy9fc3FsaXRlL2FkYXB0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmZGUwMwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIGFkYXB0ZXJzLmMgLSBkZWZhdWx0IGFkYXB0ZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAiYWRhcHRlcnMuaCIKKworLyogZHVtbXksIHdpbGwgYmUgaW1wbGVtZW50ZWQgaW4gYSBsYXRlciB2ZXJzaW9uICovCisKK1B5T2JqZWN0KiBhZGFwdF9kYXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK1B5T2JqZWN0KiBhZGFwdF9kYXRldGltZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2FkYXB0ZXJzLmggYi9Nb2R1bGVzL19zcWxpdGUvYWRhcHRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU4NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2FkYXB0ZXJzLmgKQEAgLTAsMCArMSwzMyBAQAorLyogYWRhcHRlcnMuaCAtIGRlZmF1bHQgYWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9BREFQVEVSU19ICisjZGVmaW5lIFBZU1FMSVRFX0FEQVBURVJTX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJweXRocmVhZC5oIgorI2luY2x1ZGUgInNxbGl0ZTMuaCIKKworUHlPYmplY3QqIGFkYXB0X2RhdGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKK1B5T2JqZWN0KiBhZGFwdF9kYXRldGltZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jIGIvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwMmU5NwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCkBAIC0wLDAgKzEsMzYyIEBACisvKiBjYWNoZSAuYyAtIGEgTFJVIGNhY2hlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisKKy8qIG9ubHkgdXNlZCBpbnRlcm5hbGx5ICovCitOb2RlKiBuZXdfbm9kZShQeU9iamVjdCoga2V5LCBQeU9iamVjdCogZGF0YSkKK3sKKyAgICBOb2RlKiBub2RlOworCisgICAgbm9kZSA9IChOb2RlKikgKE5vZGVUeXBlLnRwX2FsbG9jKCZOb2RlVHlwZSwgMCkpOworICAgIGlmICghbm9kZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICBub2RlLT5rZXkgPSBrZXk7CisKKyAgICBQeV9JTkNSRUYoZGF0YSk7CisgICAgbm9kZS0+ZGF0YSA9IGRhdGE7CisKKyAgICBub2RlLT5wcmV2ID0gTlVMTDsKKyAgICBub2RlLT5uZXh0ID0gTlVMTDsKKworICAgIHJldHVybiBub2RlOworfQorCit2b2lkIG5vZGVfZGVhbGxvYyhOb2RlKiBzZWxmKQoreworICAgIFB5X0RFQ1JFRihzZWxmLT5rZXkpOworICAgIFB5X0RFQ1JFRihzZWxmLT5kYXRhKTsKKworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworaW50IGNhY2hlX2luaXQoQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5T2JqZWN0KiBmYWN0b3J5OworICAgIGludCBzaXplID0gMTA7CisKKyAgICBzZWxmLT5mYWN0b3J5ID0gTlVMTDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpIiwgJmZhY3RvcnksICZzaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsgCisgICAgfQorCisgICAgaWYgKHNpemUgPCA1KSB7CisgICAgICAgIHNpemUgPSA1OworICAgIH0KKyAgICBzZWxmLT5zaXplID0gc2l6ZTsKKyAgICBzZWxmLT5maXJzdCA9IE5VTEw7CisgICAgc2VsZi0+bGFzdCA9IE5VTEw7CisKKyAgICBzZWxmLT5tYXBwaW5nID0gUHlEaWN0X05ldygpOworICAgIGlmICghc2VsZi0+bWFwcGluZykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgUHlfSU5DUkVGKGZhY3RvcnkpOworICAgIHNlbGYtPmZhY3RvcnkgPSBmYWN0b3J5OworCisgICAgc2VsZi0+ZGVjcmVmX2ZhY3RvcnkgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2FjaGVfZGVhbGxvYyhDYWNoZSogc2VsZikKK3sKKyAgICBOb2RlKiBub2RlOworICAgIE5vZGUqIGRlbGV0ZV9ub2RlOworCisgICAgaWYgKCFzZWxmLT5mYWN0b3J5KSB7CisgICAgICAgIC8qIGNvbnN0cnVjdG9yIGZhaWxlZCwganVzdCBnZXQgb3V0IG9mIGhlcmUgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5vZGUgPSBzZWxmLT5maXJzdDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBkZWxldGVfbm9kZSA9IG5vZGU7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICBQeV9ERUNSRUYoZGVsZXRlX25vZGUpOworICAgIH0KKworICAgIGlmIChzZWxmLT5kZWNyZWZfZmFjdG9yeSkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+ZmFjdG9yeSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihzZWxmLT5tYXBwaW5nKTsKKworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworUHlPYmplY3QqIGNhY2hlX2dldChDYWNoZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlPYmplY3QqIGtleSA9IGFyZ3M7CisgICAgTm9kZSogbm9kZTsKKyAgICBOb2RlKiBwdHI7CisgICAgUHlPYmplY3QqIGRhdGE7CisKKyAgICBub2RlID0gKE5vZGUqKVB5RGljdF9HZXRJdGVtKHNlbGYtPm1hcHBpbmcsIGtleSk7CisgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgbm9kZS0+Y291bnQrKzsKKyAgICAgICAgaWYgKG5vZGUtPnByZXYgJiYgbm9kZS0+Y291bnQgPiBub2RlLT5wcmV2LT5jb3VudCkgeworICAgICAgICAgICAgcHRyID0gbm9kZS0+cHJldjsKKworICAgICAgICAgICAgd2hpbGUgKHB0ci0+cHJldiAmJiBub2RlLT5jb3VudCA+IHB0ci0+cHJldi0+Y291bnQpIHsKKyAgICAgICAgICAgICAgICBwdHIgPSBwdHItPnByZXY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChub2RlLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGYtPmxhc3QgPSBub2RlLT5wcmV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vZGUtPnByZXYpIHsKKyAgICAgICAgICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdHItPnByZXYpIHsKKyAgICAgICAgICAgICAgICBwdHItPnByZXYtPm5leHQgPSBub2RlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5maXJzdCA9IG5vZGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vZGUtPm5leHQgPSBwdHI7CisgICAgICAgICAgICBub2RlLT5wcmV2ID0gcHRyLT5wcmV2OworICAgICAgICAgICAgaWYgKCFub2RlLT5wcmV2KSB7CisgICAgICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRyLT5wcmV2ID0gbm9kZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChQeURpY3RfU2l6ZShzZWxmLT5tYXBwaW5nKSA9PSBzZWxmLT5zaXplKSB7CisgICAgICAgICAgICBpZiAoc2VsZi0+bGFzdCkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLT5sYXN0OworCisgICAgICAgICAgICAgICAgaWYgKFB5RGljdF9EZWxJdGVtKHNlbGYtPm1hcHBpbmcsIHNlbGYtPmxhc3QtPmtleSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobm9kZS0+cHJldikgeworICAgICAgICAgICAgICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi0+bGFzdCA9IG5vZGUtPnByZXY7CisgICAgICAgICAgICAgICAgbm9kZS0+cHJldiA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmZhY3RvcnksICJPIiwga2V5KTsKKworICAgICAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgbm9kZSA9IG5ld19ub2RlKGtleSwgZGF0YSk7CisgICAgICAgIGlmICghbm9kZSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbm9kZS0+cHJldiA9IHNlbGYtPmxhc3Q7CisKKyAgICAgICAgUHlfREVDUkVGKGRhdGEpOworCisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5tYXBwaW5nLCBrZXksIChQeU9iamVjdCopbm9kZSkgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG5vZGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi0+bGFzdCkgeworICAgICAgICAgICAgc2VsZi0+bGFzdC0+bmV4dCA9IG5vZGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLT5maXJzdCA9IG5vZGU7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+bGFzdCA9IG5vZGU7CisgICAgfQorCisgICAgUHlfSU5DUkVGKG5vZGUtPmRhdGEpOworICAgIHJldHVybiBub2RlLT5kYXRhOworfQorCitQeU9iamVjdCogY2FjaGVfZGlzcGxheShDYWNoZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgTm9kZSogcHRyOworICAgIFB5T2JqZWN0KiBwcmV2a2V5OworICAgIFB5T2JqZWN0KiBuZXh0a2V5OworICAgIFB5T2JqZWN0KiBmbXRfYXJnczsKKyAgICBQeU9iamVjdCogdGVtcGxhdGU7CisgICAgUHlPYmplY3QqIGRpc3BsYXlfc3RyOworCisgICAgcHRyID0gc2VsZi0+Zmlyc3Q7CisKKyAgICB3aGlsZSAocHRyKSB7CisgICAgICAgIGlmIChwdHItPnByZXYpIHsKKyAgICAgICAgICAgIHByZXZrZXkgPSBwdHItPnByZXYtPmtleTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZXZrZXkgPSBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihwcmV2a2V5KTsKKworICAgICAgICBpZiAocHRyLT5uZXh0KSB7CisgICAgICAgICAgICBuZXh0a2V5ID0gcHRyLT5uZXh0LT5rZXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXh0a2V5ID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYobmV4dGtleSk7CisKKyAgICAgICAgZm10X2FyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPT08iLCBwcmV2a2V5LCBwdHItPmtleSwgbmV4dGtleSk7CisgICAgICAgIGlmICghZm10X2FyZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlID0gUHlTdHJpbmdfRnJvbVN0cmluZygiJXMgPC0gJXMgLT4lc1xuIik7CisgICAgICAgIGlmICghdGVtcGxhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGRpc3BsYXlfc3RyID0gUHlTdHJpbmdfRm9ybWF0KHRlbXBsYXRlLCBmbXRfYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRih0ZW1wbGF0ZSk7CisgICAgICAgIFB5X0RFQ1JFRihmbXRfYXJncyk7CisgICAgICAgIGlmICghZGlzcGxheV9zdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5T2JqZWN0X1ByaW50KGRpc3BsYXlfc3RyLCBzdGRvdXQsIFB5X1BSSU5UX1JBVyk7CisgICAgICAgIFB5X0RFQ1JFRihkaXNwbGF5X3N0cik7CisKKyAgICAgICAgUHlfREVDUkVGKHByZXZrZXkpOworICAgICAgICBQeV9ERUNSRUYobmV4dGtleSk7CisKKyAgICAgICAgcHRyID0gcHRyLT5uZXh0OworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIGNhY2hlX21ldGhvZHNbXSA9IHsKKyAgICB7ImdldCIsIChQeUNGdW5jdGlvbiljYWNoZV9nZXQsIE1FVEhfTywKKyAgICAgICAgUHlEb2NfU1RSKCJHZXRzIGFuIGVudHJ5IGZyb20gdGhlIGNhY2hlLiIpfSwKKyAgICB7ImRpc3BsYXkiLCAoUHlDRnVuY3Rpb24pY2FjaGVfZGlzcGxheSwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRm9yIGRlYnVnZ2luZyBvbmx5LiIpfSwKKyAgICB7TlVMTCwgTlVMTH0KK307CisKK1B5VHlwZU9iamVjdCBOb2RlVHlwZSA9IHsKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAgICAgTU9EVUxFX05BTUUgIk5vZGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2YoTm9kZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3Ipbm9kZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgICAgICAoaW5pdHByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCit9OworCitQeVR5cGVPYmplY3QgQ2FjaGVUeXBlID0geworICAgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICAgICBNT0RVTEVfTkFNRSAiLkNhY2hlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgICAgIHNpemVvZihDYWNoZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgICAgICAoZGVzdHJ1Y3RvciljYWNoZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgICAgY2FjaGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAgIChpbml0cHJvYyljYWNoZV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KK307CisKK2V4dGVybiBpbnQgY2FjaGVfc2V0dXBfdHlwZXModm9pZCkKK3sKKyAgICBpbnQgcmM7CisKKyAgICBOb2RlVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBDYWNoZVR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisKKyAgICByYyA9IFB5VHlwZV9SZWFkeSgmTm9kZVR5cGUpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJjID0gUHlUeXBlX1JlYWR5KCZDYWNoZVR5cGUpOworICAgIHJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5oIGIvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjMTZmMwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIGNhY2hlLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIExSVSBjYWNoZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgUFlTUUxJVEVfQ0FDSEVfSAorI2RlZmluZSBQWVNRTElURV9DQUNIRV9ICisjaW5jbHVkZSAiUHl0aG9uLmgiCisKK3R5cGVkZWYgc3RydWN0IF9Ob2RlCit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0KiBrZXk7CisgICAgUHlPYmplY3QqIGRhdGE7CisgICAgbG9uZyBjb3VudDsKKyAgICBzdHJ1Y3QgX05vZGUqIHByZXY7CisgICAgc3RydWN0IF9Ob2RlKiBuZXh0OworfSBOb2RlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBpbnQgc2l6ZTsKKyAgICBQeU9iamVjdCogbWFwcGluZzsKKyAgICBQeU9iamVjdCogZmFjdG9yeTsKKyAgICBOb2RlKiBmaXJzdDsKKyAgICBOb2RlKiBsYXN0OworICAgIGludCBkZWNyZWZfZmFjdG9yeTsKK30gQ2FjaGU7CisKK2V4dGVybiBQeVR5cGVPYmplY3QgTm9kZVR5cGU7CitleHRlcm4gUHlUeXBlT2JqZWN0IENhY2hlVHlwZTsKKworaW50IG5vZGVfaW5pdChOb2RlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7Cit2b2lkIG5vZGVfZGVhbGxvYyhOb2RlKiBzZWxmKTsKKworaW50IGNhY2hlX2luaXQoQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKK3ZvaWQgY2FjaGVfZGVhbGxvYyhDYWNoZSogc2VsZik7CitQeU9iamVjdCogY2FjaGVfZ2V0KENhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CisKK2ludCBjYWNoZV9zZXR1cF90eXBlcyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFhZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYwpAQCAtMCwwICsxLDEwODIgQEAKKy8qIGNvbm5lY3Rpb24uYyAtIHRoZSBjb25uZWN0aW9uIHR5cGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgInN0YXRlbWVudC5oIgorI2luY2x1ZGUgImN1cnNvci5oIgorI2luY2x1ZGUgInByZXBhcmVfcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCisKKyNpbmNsdWRlICJweXRocmVhZC5oIgorCitzdGF0aWMgaW50IGNvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsKTsKKworaW50IGNvbm5lY3Rpb25faW5pdChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGFiYXNlIiwgInRpbWVvdXQiLCAiZGV0ZWN0X3R5cGVzIiwgImlzb2xhdGlvbl9sZXZlbCIsICJjaGVja19zYW1lX3RocmVhZCIsICJmYWN0b3J5IiwgImNhY2hlZF9zdGF0ZW1lbnRzIiwgTlVMTCwgTlVMTH07CisKKyAgICBjaGFyKiBkYXRhYmFzZTsKKyAgICBpbnQgZGV0ZWN0X3R5cGVzID0gMDsKKyAgICBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsID0gTlVMTDsKKyAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7CisgICAgaW50IGNoZWNrX3NhbWVfdGhyZWFkID0gMTsKKyAgICBpbnQgY2FjaGVkX3N0YXRlbWVudHMgPSAxMDA7CisgICAgZG91YmxlIHRpbWVvdXQgPSA1LjA7CisgICAgaW50IHJjOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xkaU9pT2kiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFiYXNlLCAmdGltZW91dCwgJmRldGVjdF90eXBlcywgJmlzb2xhdGlvbl9sZXZlbCwgJmNoZWNrX3NhbWVfdGhyZWFkLCAmZmFjdG9yeSwgJmNhY2hlZF9zdGF0ZW1lbnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsgCisgICAgfQorCisgICAgc2VsZi0+YmVnaW5fc3RhdGVtZW50ID0gTlVMTDsKKworICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZSA9IE5VTEw7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgc2VsZi0+cm93X2ZhY3RvcnkgPSBQeV9Ob25lOworCisgICAgUHlfSU5DUkVGKCZQeVVuaWNvZGVfVHlwZSk7CisgICAgc2VsZi0+dGV4dF9mYWN0b3J5ID0gKFB5T2JqZWN0KikmUHlVbmljb2RlX1R5cGU7CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBzcWxpdGUzX29wZW4oZGF0YWJhc2UsICZzZWxmLT5kYik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghaXNvbGF0aW9uX2xldmVsKSB7CisgICAgICAgIGlzb2xhdGlvbl9sZXZlbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihpc29sYXRpb25fbGV2ZWwpOworICAgIH0KKyAgICBzZWxmLT5pc29sYXRpb25fbGV2ZWwgPSBOVUxMOworICAgIGNvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChzZWxmLCBpc29sYXRpb25fbGV2ZWwpOworICAgIFB5X0RFQ1JFRihpc29sYXRpb25fbGV2ZWwpOworCisgICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlID0gKENhY2hlKilQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikmQ2FjaGVUeXBlLCAiT2kiLCBzZWxmLCBjYWNoZWRfc3RhdGVtZW50cyk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEJ5IGRlZmF1bHQsIHRoZSBDYWNoZSBjbGFzcyBJTkNSRUZzIHRoZSBmYWN0b3J5IGluIGl0cyBpbml0aWFsaXplciwgYW5kCisgICAgICogZGVjcmVmcyBpdCBpbiBpdHMgZGVhbGxvY2F0b3IgbWV0aG9kLiBTaW5jZSB0aGlzIHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyCisgICAgICogcmVmZXJlbmNlIGhlcmUsIHdlJ3JlIGJyZWFraW5nIGl0IGJ5IGRlY3JlbWVudGluZyBzZWxmLCBhbmQgdGVsbGluZyB0aGUKKyAgICAgKiBjYWNoZSBjbGFzcyB0byBub3QgZGVjcmVmIHRoZSBmYWN0b3J5IChzZWxmKSBpbiBpdHMgZGVhbGxvY2F0b3IuCisgICAgICovCisgICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlLT5kZWNyZWZfZmFjdG9yeSA9IDA7CisgICAgUHlfREVDUkVGKHNlbGYpOworCisgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDA7CisgICAgc2VsZi0+ZGV0ZWN0X3R5cGVzID0gZGV0ZWN0X3R5cGVzOworICAgIHNlbGYtPnRpbWVvdXQgPSB0aW1lb3V0OworICAgICh2b2lkKXNxbGl0ZTNfYnVzeV90aW1lb3V0KHNlbGYtPmRiLCAoaW50KSh0aW1lb3V0KjEwMDApKTsKKworICAgIHNlbGYtPnRocmVhZF9pZGVudCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBzZWxmLT5jaGVja19zYW1lX3RocmVhZCA9IGNoZWNrX3NhbWVfdGhyZWFkOworCisgICAgc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc2VsZi0+Y29sbGF0aW9ucyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIXNlbGYtPmNvbGxhdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNlbGYtPldhcm5pbmcgPSBXYXJuaW5nOworICAgIHNlbGYtPkVycm9yID0gRXJyb3I7CisgICAgc2VsZi0+SW50ZXJmYWNlRXJyb3IgPSBJbnRlcmZhY2VFcnJvcjsKKyAgICBzZWxmLT5EYXRhYmFzZUVycm9yID0gRGF0YWJhc2VFcnJvcjsKKyAgICBzZWxmLT5EYXRhRXJyb3IgPSBEYXRhRXJyb3I7CisgICAgc2VsZi0+T3BlcmF0aW9uYWxFcnJvciA9IE9wZXJhdGlvbmFsRXJyb3I7CisgICAgc2VsZi0+SW50ZWdyaXR5RXJyb3IgPSBJbnRlZ3JpdHlFcnJvcjsKKyAgICBzZWxmLT5JbnRlcm5hbEVycm9yID0gSW50ZXJuYWxFcnJvcjsKKyAgICBzZWxmLT5Qcm9ncmFtbWluZ0Vycm9yID0gUHJvZ3JhbW1pbmdFcnJvcjsKKyAgICBzZWxmLT5Ob3RTdXBwb3J0ZWRFcnJvciA9IE5vdFN1cHBvcnRlZEVycm9yOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmx1c2hfc3RhdGVtZW50X2NhY2hlKENvbm5lY3Rpb24qIHNlbGYpCit7CisgICAgTm9kZSogbm9kZTsKKyAgICBTdGF0ZW1lbnQqIHN0YXRlbWVudDsKKworICAgIG5vZGUgPSBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUtPmZpcnN0OworCisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgc3RhdGVtZW50ID0gKFN0YXRlbWVudCopKG5vZGUtPmRhdGEpOworICAgICAgICAodm9pZClzdGF0ZW1lbnRfZmluYWxpemUoc3RhdGVtZW50KTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorCisgICAgUHlfREVDUkVGKHNlbGYtPnN0YXRlbWVudF9jYWNoZSk7CisgICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlID0gKENhY2hlKilQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikmQ2FjaGVUeXBlLCAiTyIsIHNlbGYpOworICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUtPmRlY3JlZl9mYWN0b3J5ID0gMDsKK30KKwordm9pZCByZXNldF9hbGxfc3RhdGVtZW50cyhDb25uZWN0aW9uKiBzZWxmKQoreworICAgIE5vZGUqIG5vZGU7CisgICAgU3RhdGVtZW50KiBzdGF0ZW1lbnQ7CisKKyAgICBub2RlID0gc2VsZi0+c3RhdGVtZW50X2NhY2hlLT5maXJzdDsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIHN0YXRlbWVudCA9IChTdGF0ZW1lbnQqKShub2RlLT5kYXRhKTsKKyAgICAgICAgKHZvaWQpc3RhdGVtZW50X3Jlc2V0KHN0YXRlbWVudCk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KK30KKwordm9pZCBjb25uZWN0aW9uX2RlYWxsb2MoQ29ubmVjdGlvbiogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPnN0YXRlbWVudF9jYWNoZSk7CisKKyAgICAvKiBDbGVhbiB1cCBpZiB1c2VyIGhhcyBub3QgY2FsbGVkIC5jbG9zZSgpIGV4cGxpY2l0bHkuICovCisgICAgaWYgKHNlbGYtPmRiKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgc3FsaXRlM19jbG9zZShzZWxmLT5kYik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorCisgICAgaWYgKHNlbGYtPmJlZ2luX3N0YXRlbWVudCkgeworICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmJlZ2luX3N0YXRlbWVudCk7CisgICAgfQorICAgIFB5X1hERUNSRUYoc2VsZi0+aXNvbGF0aW9uX2xldmVsKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJvd19mYWN0b3J5KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnRleHRfZmFjdG9yeSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jb2xsYXRpb25zKTsKKworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworUHlPYmplY3QqIGNvbm5lY3Rpb25fY3Vyc29yKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmFjdG9yeSIsIE5VTEwsIE5VTEx9OworICAgIFB5T2JqZWN0KiBmYWN0b3J5ID0gTlVMTDsKKyAgICBQeU9iamVjdCogY3Vyc29yOworCisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TyIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFjdG9yeSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFjaGVja190aHJlYWQoc2VsZikgfHwgIWNoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGZhY3RvcnkgPT0gTlVMTCkgeworICAgICAgICBmYWN0b3J5ID0gKFB5T2JqZWN0KikmQ3Vyc29yVHlwZTsKKyAgICB9CisKKyAgICBjdXJzb3IgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZmFjdG9yeSwgIk8iLCBzZWxmKTsKKworICAgIGlmIChjdXJzb3IgJiYgc2VsZi0+cm93X2ZhY3RvcnkgIT0gUHlfTm9uZSkgeworICAgICAgICBQeV9YREVDUkVGKCgoQ3Vyc29yKiljdXJzb3IpLT5yb3dfZmFjdG9yeSk7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5yb3dfZmFjdG9yeSk7CisgICAgICAgICgoQ3Vyc29yKiljdXJzb3IpLT5yb3dfZmFjdG9yeSA9IHNlbGYtPnJvd19mYWN0b3J5OworICAgIH0KKworICAgIHJldHVybiBjdXJzb3I7Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2Nsb3NlKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIGludCByYzsKKworICAgIGlmICghY2hlY2tfdGhyZWFkKHNlbGYpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZsdXNoX3N0YXRlbWVudF9jYWNoZShzZWxmKTsKKworICAgIGlmIChzZWxmLT5kYikgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJjID0gc3FsaXRlM19jbG9zZShzZWxmLT5kYik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi0+ZGIgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCisvKgorICogQ2hlY2tzIGlmIGEgY29ubmVjdGlvbiBvYmplY3QgaXMgdXNhYmxlIChpLiBlLiBub3QgY2xvc2VkKS4KKyAqCisgKiAwID0+IGVycm9yOyAxID0+IG9rCisgKi8KK2ludCBjaGVja19jb25uZWN0aW9uKENvbm5lY3Rpb24qIGNvbikKK3sKKyAgICBpZiAoIWNvbi0+ZGIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFByb2dyYW1taW5nRXJyb3IsICJDYW5ub3Qgb3BlcmF0ZSBvbiBhIGNsb3NlZCBkYXRhYmFzZS4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitQeU9iamVjdCogX2Nvbm5lY3Rpb25fYmVnaW4oQ29ubmVjdGlvbiogc2VsZikKK3sKKyAgICBpbnQgcmM7CisgICAgY29uc3QgY2hhciogdGFpbDsKKyAgICBzcWxpdGUzX3N0bXQqIHN0YXRlbWVudDsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IHNxbGl0ZTNfcHJlcGFyZShzZWxmLT5kYiwgc2VsZi0+YmVnaW5fc3RhdGVtZW50LCAtMSwgJnN0YXRlbWVudCwgJnRhaWwpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmMgPSBfc3FsaXRlX3N0ZXBfd2l0aF9idXN5aGFuZGxlcihzdGF0ZW1lbnQsIHNlbGYpOworICAgIGlmIChyYyA9PSBTUUxJVEVfRE9ORSkgeworICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgIH0KKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgaWYgKHJjICE9IFNRTElURV9PSyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgIH0KKworZXJyb3I6CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2NvbW1pdChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBpbnQgcmM7CisgICAgY29uc3QgY2hhciogdGFpbDsKKyAgICBzcWxpdGUzX3N0bXQqIHN0YXRlbWVudDsKKworICAgIGlmICghY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFjaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChzZWxmLT5pblRyYW5zYWN0aW9uKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsICJDT01NSVQiLCAtMSwgJnN0YXRlbWVudCwgJnRhaWwpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc3RhdGVtZW50LCBzZWxmKTsKKyAgICAgICAgaWYgKHJjID09IFNRTElURV9ET05FKSB7CisgICAgICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIH0KKworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICB9CisKKyAgICB9CisKK2Vycm9yOgorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9yb2xsYmFjayhDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBpbnQgcmM7CisgICAgY29uc3QgY2hhciogdGFpbDsKKyAgICBzcWxpdGUzX3N0bXQqIHN0YXRlbWVudDsKKworICAgIGlmICghY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFjaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChzZWxmLT5pblRyYW5zYWN0aW9uKSB7CisgICAgICAgIHJlc2V0X2FsbF9zdGF0ZW1lbnRzKHNlbGYpOworCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsICJST0xMQkFDSyIsIC0xLCAmc3RhdGVtZW50LCAmdGFpbCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBfc3FsaXRlX3N0ZXBfd2l0aF9idXN5aGFuZGxlcihzdGF0ZW1lbnQsIHNlbGYpOworICAgICAgICBpZiAocmMgPT0gU1FMSVRFX0RPTkUpIHsKKyAgICAgICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgfQorCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIH0KKworICAgIH0KKworZXJyb3I6CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKK3ZvaWQgX3NldF9yZXN1bHQoc3FsaXRlM19jb250ZXh0KiBjb250ZXh0LCBQeU9iamVjdCogcHlfdmFsKQoreworICAgIGxvbmcgbG9uZ3ZhbDsKKyAgICBjb25zdCBjaGFyKiBidWZmZXI7CisgICAgUHlfc3NpemVfdCBidWZsZW47CisgICAgUHlPYmplY3QqIHN0cmluZ3ZhbDsKKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIC8qIEVycm9ycyBpbiBjYWxsYmFja3MgYXJlIGlnbm9yZWQsIGFuZCB3ZSByZXR1cm4gTlVMTCAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBzcWxpdGUzX3Jlc3VsdF9udWxsKGNvbnRleHQpOworICAgIH0gZWxzZSBpZiAocHlfdmFsID09IFB5X05vbmUpIHsKKyAgICAgICAgc3FsaXRlM19yZXN1bHRfbnVsbChjb250ZXh0KTsKKyAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHB5X3ZhbCkpIHsKKyAgICAgICAgbG9uZ3ZhbCA9IFB5SW50X0FzTG9uZyhweV92YWwpOworICAgICAgICAvKiBUT0RPOiBpbnZlc3RpZ2F0ZSB3aGF0IHRvIGRvIHdpdGggcmFuZ2Ugb3ZlcmZsb3dzIC0gbG9uZyB2cy4gbG9uZyBsb25nICovCisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2ludDY0KGNvbnRleHQsIChQWV9MT05HX0xPTkcpbG9uZ3ZhbCk7CisgICAgfSBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKHB5X3ZhbCkpIHsKKyAgICAgICAgc3FsaXRlM19yZXN1bHRfZG91YmxlKGNvbnRleHQsIFB5RmxvYXRfQXNEb3VibGUocHlfdmFsKSk7CisgICAgfSBlbHNlIGlmIChQeUJ1ZmZlcl9DaGVjayhweV92YWwpKSB7CisgICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocHlfdmFsLCAmYnVmZmVyLCAmYnVmbGVuKSAhPSAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImNvdWxkIG5vdCBjb252ZXJ0IEJMT0IgdG8gYnVmZmVyIik7CisgICAgICAgIH0KKyAgICAgICAgc3FsaXRlM19yZXN1bHRfYmxvYihjb250ZXh0LCBidWZmZXIsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7CisgICAgfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhweV92YWwpKSB7CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X3RleHQoY29udGV4dCwgUHlTdHJpbmdfQXNTdHJpbmcocHlfdmFsKSwgLTEsIFNRTElURV9UUkFOU0lFTlQpOworICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHB5X3ZhbCkpIHsKKyAgICAgICAgc3RyaW5ndmFsID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhweV92YWwpOworICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZ3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVE9ETzogcmFpc2UgZXJyb3IgKi8KKyAgICB9Cit9CisKK1B5T2JqZWN0KiBfYnVpbGRfcHlfcGFyYW1zKHNxbGl0ZTNfY29udGV4dCAqY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUqKiBhcmd2KQoreworICAgIFB5T2JqZWN0KiBhcmdzOworICAgIGludCBpOworICAgIHNxbGl0ZTNfdmFsdWUqIGN1cl92YWx1ZTsKKyAgICBQeU9iamVjdCogY3VyX3B5X3ZhbHVlOworICAgIGNvbnN0IGNoYXIqIHZhbF9zdHI7CisgICAgUFlfTE9OR19MT05HIHZhbF9pbnQ7CisgICAgUHlfc3NpemVfdCBidWZsZW47CisgICAgdm9pZCogcmF3X2J1ZmZlcjsKKworICAgIGFyZ3MgPSBQeVR1cGxlX05ldyhhcmdjKTsKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjdXJfdmFsdWUgPSBhcmd2W2ldOworICAgICAgICBzd2l0Y2ggKHNxbGl0ZTNfdmFsdWVfdHlwZShhcmd2W2ldKSkgeworICAgICAgICAgICAgY2FzZSBTUUxJVEVfSU5URUdFUjoKKyAgICAgICAgICAgICAgICB2YWxfaW50ID0gc3FsaXRlM192YWx1ZV9pbnQ2NChjdXJfdmFsdWUpOworICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5SW50X0Zyb21Mb25nKChsb25nKXZhbF9pbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTUUxJVEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlGbG9hdF9Gcm9tRG91YmxlKHNxbGl0ZTNfdmFsdWVfZG91YmxlKGN1cl92YWx1ZSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTUUxJVEVfVEVYVDoKKyAgICAgICAgICAgICAgICB2YWxfc3RyID0gKGNvbnN0IGNoYXIqKXNxbGl0ZTNfdmFsdWVfdGV4dChjdXJfdmFsdWUpOworICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHZhbF9zdHIsIHN0cmxlbih2YWxfc3RyKSwgTlVMTCk7CisgICAgICAgICAgICAgICAgLyogVE9ETzogaGF2ZSBhIHdheSB0byBzaG93IGVycm9ycyBoZXJlICovCisgICAgICAgICAgICAgICAgaWYgKCFjdXJfcHlfdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1FMSVRFX0JMT0I6CisgICAgICAgICAgICAgICAgYnVmbGVuID0gc3FsaXRlM192YWx1ZV9ieXRlcyhjdXJfdmFsdWUpOworICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5QnVmZmVyX05ldyhidWZsZW4pOworICAgICAgICAgICAgICAgIGlmICghY3VyX3B5X3ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IGVycm9yICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKGN1cl9weV92YWx1ZSwgJnJhd19idWZmZXIsICZidWZsZW4pKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IGVycm9yICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbWNweShyYXdfYnVmZmVyLCBzcWxpdGUzX3ZhbHVlX2Jsb2IoY3VyX3ZhbHVlKSwgYnVmbGVuKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1FMSVRFX05VTEw6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU2V0SXRlbShhcmdzLCBpLCBjdXJfcHlfdmFsdWUpOworCisgICAgfQorCisgICAgcmV0dXJuIGFyZ3M7Cit9CisKK3ZvaWQgX2Z1bmNfY2FsbGJhY2soc3FsaXRlM19jb250ZXh0KiBjb250ZXh0LCBpbnQgYXJnYywgc3FsaXRlM192YWx1ZSoqIGFyZ3YpCit7CisgICAgUHlPYmplY3QqIGFyZ3M7CisgICAgUHlPYmplY3QqIHB5X2Z1bmM7CisgICAgUHlPYmplY3QqIHB5X3JldHZhbDsKKworCisgICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsKKworICAgIHRocmVhZHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKworICAgIHB5X2Z1bmMgPSAoUHlPYmplY3QqKXNxbGl0ZTNfdXNlcl9kYXRhKGNvbnRleHQpOworCisgICAgYXJncyA9IF9idWlsZF9weV9wYXJhbXMoY29udGV4dCwgYXJnYywgYXJndik7CisKKyAgICBweV9yZXR2YWwgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHB5X2Z1bmMsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKworICAgIF9zZXRfcmVzdWx0KGNvbnRleHQsIHB5X3JldHZhbCk7CisgICAgUHlfWERFQ1JFRihweV9yZXR2YWwpOworCisgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKK30KKworc3RhdGljIHZvaWQgX3N0ZXBfY2FsbGJhY2soc3FsaXRlM19jb250ZXh0ICpjb250ZXh0LCBpbnQgYXJnYywgc3FsaXRlM192YWx1ZSoqIHBhcmFtcykKK3sKKyAgICBQeU9iamVjdCogYXJnczsKKyAgICBQeU9iamVjdCogZnVuY3Rpb25fcmVzdWx0OworICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7CisgICAgUHlPYmplY3QqKiBhZ2dyZWdhdGVfaW5zdGFuY2U7CisgICAgUHlPYmplY3QqIHN0ZXBtZXRob2Q7CisKKyAgICBQeUdJTFN0YXRlX1NUQVRFIHRocmVhZHN0YXRlOworCisgICAgdGhyZWFkc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworCisgICAgYWdncmVnYXRlX2NsYXNzID0gKFB5T2JqZWN0KilzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKKworICAgIGFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IChQeU9iamVjdCoqKXNxbGl0ZTNfYWdncmVnYXRlX2NvbnRleHQoY29udGV4dCwgc2l6ZW9mKFB5T2JqZWN0KikpOworCisgICAgaWYgKCphZ2dyZWdhdGVfaW5zdGFuY2UgPT0gMCkgeworICAgICAgICAqYWdncmVnYXRlX2luc3RhbmNlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGFnZ3JlZ2F0ZV9jbGFzcywgIiIpOworCisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IDA7CisgICAgICAgICAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc3RlcG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSwgInN0ZXAiKTsKKyAgICBpZiAoIXN0ZXBtZXRob2QpCisgICAgeworICAgICAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXJncyA9IF9idWlsZF9weV9wYXJhbXMoY29udGV4dCwgYXJnYywgcGFyYW1zKTsKKworICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3Qoc3RlcG1ldGhvZCwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihzdGVwbWV0aG9kKTsKKworICAgIGlmIChmdW5jdGlvbl9yZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jdGlvbl9yZXN1bHQpOworICAgIH0KKworICAgIFB5R0lMU3RhdGVfUmVsZWFzZSh0aHJlYWRzdGF0ZSk7Cit9CisKK3ZvaWQgX2ZpbmFsX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCogY29udGV4dCkKK3sKKyAgICBQeU9iamVjdCogYXJnczsKKyAgICBQeU9iamVjdCogZnVuY3Rpb25fcmVzdWx0OworICAgIFB5T2JqZWN0KiogYWdncmVnYXRlX2luc3RhbmNlOworICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7CisgICAgUHlPYmplY3QqIGZpbmFsaXplbWV0aG9kOworCisgICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsKKworICAgIHRocmVhZHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKworICAgIGFnZ3JlZ2F0ZV9jbGFzcyA9IChQeU9iamVjdCopc3FsaXRlM191c2VyX2RhdGEoY29udGV4dCk7CisKKyAgICBhZ2dyZWdhdGVfaW5zdGFuY2UgPSAoUHlPYmplY3QqKilzcWxpdGUzX2FnZ3JlZ2F0ZV9jb250ZXh0KGNvbnRleHQsIHNpemVvZihQeU9iamVjdCopKTsKKyAgICBpZiAoISphZ2dyZWdhdGVfaW5zdGFuY2UpIHsKKyAgICAgICAgLyogdGhpcyBicmFuY2ggaXMgZXhlY3V0ZWQgaWYgdGhlcmUgd2FzIGFuIGV4Y2VwdGlvbiBpbiB0aGUgYWdncmVnYXRlJ3MKKyAgICAgICAgICogX19pbml0X18gKi8KKworICAgICAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmluYWxpemVtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKCphZ2dyZWdhdGVfaW5zdGFuY2UsICJmaW5hbGl6ZSIpOworCisgICAgaWYgKCFmaW5hbGl6ZW1ldGhvZCkgeworICAgICAgICAvKgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHJvZ3JhbW1pbmdFcnJvciwgImZpbmFsaXplIG1ldGhvZCBtaXNzaW5nIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgZnVuY3Rpb25fcmVzdWx0ID0gUHlfTm9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGlmICghYXJncykKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZmluYWxpemVtZXRob2QsIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihmaW5hbGl6ZW1ldGhvZCk7CisgICAgfQorCisgICAgX3NldF9yZXN1bHQoY29udGV4dCwgZnVuY3Rpb25fcmVzdWx0KTsKKyAgICBQeV9YREVDUkVGKCphZ2dyZWdhdGVfaW5zdGFuY2UpOworICAgIFB5X1hERUNSRUYoZnVuY3Rpb25fcmVzdWx0KTsKKworICAgIFB5R0lMU3RhdGVfUmVsZWFzZSh0aHJlYWRzdGF0ZSk7Cit9CisKKworUHlPYmplY3QqIGNvbm5lY3Rpb25fY3JlYXRlX2Z1bmN0aW9uKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJuYXJnIiwgImZ1bmMiLCBOVUxMLCBOVUxMfTsKKworICAgIFB5T2JqZWN0KiBmdW5jOworICAgIGNoYXIqIG5hbWU7CisgICAgaW50IG5hcmc7CisgICAgaW50IHJjOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic2lPIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCAmbmFyZywgJmZ1bmMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmMgPSBzcWxpdGUzX2NyZWF0ZV9mdW5jdGlvbihzZWxmLT5kYiwgbmFtZSwgbmFyZywgU1FMSVRFX1VURjgsICh2b2lkKilmdW5jLCBfZnVuY19jYWxsYmFjaywgTlVMTCwgTlVMTCk7CisKKyAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgZnVuYywgUHlfTm9uZSk7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2NyZWF0ZV9hZ2dyZWdhdGUoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIGFnZ3JlZ2F0ZV9jbGFzczsKKworICAgIGludCBuX2FyZzsKKyAgICBjaGFyKiBuYW1lOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsgIm5hbWUiLCAibl9hcmciLCAiYWdncmVnYXRlX2NsYXNzIiwgTlVMTCB9OworICAgIGludCByYzsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInNpTzpjcmVhdGVfYWdncmVnYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmbmFtZSwgJm5fYXJnLCAmYWdncmVnYXRlX2NsYXNzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByYyA9IHNxbGl0ZTNfY3JlYXRlX2Z1bmN0aW9uKHNlbGYtPmRiLCBuYW1lLCBuX2FyZywgU1FMSVRFX1VURjgsICh2b2lkKilhZ2dyZWdhdGVfY2xhc3MsIDAsICZfc3RlcF9jYWxsYmFjaywgJl9maW5hbF9jYWxsYmFjayk7CisgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgYWdncmVnYXRlX2NsYXNzLCBQeV9Ob25lKTsKKworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KK30KKworaW50IGNoZWNrX3RocmVhZChDb25uZWN0aW9uKiBzZWxmKQoreworICAgIGlmIChzZWxmLT5jaGVja19zYW1lX3RocmVhZCkgeworICAgICAgICBpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IHNlbGYtPnRocmVhZF9pZGVudCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFByb2dyYW1taW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiU1FMaXRlIG9iamVjdHMgY3JlYXRlZCBpbiBhIHRocmVhZCBjYW4gb25seSBiZSB1c2VkIGluIHRoYXQgc2FtZSB0aHJlYWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgaW4gdGhyZWFkIGlkICVsZCBhbmQgdGhpcyBpcyB0aHJlYWQgaWQgJWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnRocmVhZF9pZGVudCwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBjb25uZWN0aW9uX2dldF9pc29sYXRpb25fbGV2ZWwoQ29ubmVjdGlvbiogc2VsZiwgdm9pZCogdW51c2VkKQoreworICAgIFB5X0lOQ1JFRihzZWxmLT5pc29sYXRpb25fbGV2ZWwpOworICAgIHJldHVybiBzZWxmLT5pc29sYXRpb25fbGV2ZWw7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogY29ubmVjdGlvbl9nZXRfdG90YWxfY2hhbmdlcyhDb25uZWN0aW9uKiBzZWxmLCB2b2lkKiB1bnVzZWQpCit7CisgICAgaWYgKCFjaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3FsaXRlM190b3RhbF9jaGFuZ2VzKHNlbGYtPmRiKSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsKQoreworICAgIFB5T2JqZWN0KiBlbXB0eTsKKyAgICBQeU9iamVjdCogcmVzOworICAgIFB5T2JqZWN0KiBiZWdpbl9zdGF0ZW1lbnQ7CisKKyAgICBQeV9YREVDUkVGKHNlbGYtPmlzb2xhdGlvbl9sZXZlbCk7CisKKyAgICBpZiAoc2VsZi0+YmVnaW5fc3RhdGVtZW50KSB7CisgICAgICAgIFB5TWVtX0ZyZWUoc2VsZi0+YmVnaW5fc3RhdGVtZW50KTsKKyAgICAgICAgc2VsZi0+YmVnaW5fc3RhdGVtZW50ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoaXNvbGF0aW9uX2xldmVsID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBzZWxmLT5pc29sYXRpb25fbGV2ZWwgPSBQeV9Ob25lOworCisgICAgICAgIGVtcHR5ID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGlmICghZW1wdHkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBjb25uZWN0aW9uX2NvbW1pdChzZWxmLCBlbXB0eSk7CisgICAgICAgIGlmICghcmVzKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGVtcHR5KTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisKKyAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKGlzb2xhdGlvbl9sZXZlbCk7CisgICAgICAgIHNlbGYtPmlzb2xhdGlvbl9sZXZlbCA9IGlzb2xhdGlvbl9sZXZlbDsKKworICAgICAgICBiZWdpbl9zdGF0ZW1lbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJCRUdJTiAiKTsKKyAgICAgICAgaWYgKCFiZWdpbl9zdGF0ZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeVN0cmluZ19Db25jYXQoJmJlZ2luX3N0YXRlbWVudCwgaXNvbGF0aW9uX2xldmVsKTsKKyAgICAgICAgaWYgKCFiZWdpbl9zdGF0ZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGYtPmJlZ2luX3N0YXRlbWVudCA9IFB5TWVtX01hbGxvYyhQeVN0cmluZ19TaXplKGJlZ2luX3N0YXRlbWVudCkgKyAyKTsKKyAgICAgICAgaWYgKCFzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmNweShzZWxmLT5iZWdpbl9zdGF0ZW1lbnQsIFB5U3RyaW5nX0FzU3RyaW5nKGJlZ2luX3N0YXRlbWVudCkpOworICAgICAgICBQeV9ERUNSRUYoYmVnaW5fc3RhdGVtZW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworUHlPYmplY3QqIGNvbm5lY3Rpb25fY2FsbChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeU9iamVjdCogc3FsOworICAgIFN0YXRlbWVudCogc3RhdGVtZW50OworICAgIGludCByYzsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyIsICZzcWwpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0YXRlbWVudCA9IFB5T2JqZWN0X05ldyhTdGF0ZW1lbnQsICZTdGF0ZW1lbnRUeXBlKTsKKyAgICBpZiAoIXN0YXRlbWVudCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByYyA9IHN0YXRlbWVudF9jcmVhdGUoc3RhdGVtZW50LCBzZWxmLCBzcWwpOworCisgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICBpZiAocmMgPT0gUFlTUUxJVEVfVE9PX01VQ0hfU1FMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoV2FybmluZywgIllvdSBjYW4gb25seSBleGVjdXRlIG9uZSBzdGF0ZW1lbnQgYXQgYSB0aW1lLiIpOworICAgICAgICB9IGVsc2UgaWYgKHJjID09IFBZU1FMSVRFX1NRTF9XUk9OR19UWVBFKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoV2FybmluZywgIlNRTCBpcyBvZiB3cm9uZyB0eXBlLiBNdXN0IGJlIHN0cmluZyBvciB1bmljb2RlLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgfQorCisgICAgICAgIFB5X0RFQ1JFRihzdGF0ZW1lbnQpOworICAgICAgICBzdGF0ZW1lbnQgPSAwOworICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QqKXN0YXRlbWVudDsKK30KKworUHlPYmplY3QqIGNvbm5lY3Rpb25fZXhlY3V0ZShDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeU9iamVjdCogY3Vyc29yID0gMDsKKyAgICBQeU9iamVjdCogcmVzdWx0ID0gMDsKKyAgICBQeU9iamVjdCogbWV0aG9kID0gMDsKKworICAgIGN1cnNvciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0KilzZWxmLCAiY3Vyc29yIiwgIiIpOworICAgIGlmICghY3Vyc29yKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjdXJzb3IsICJleGVjdXRlIik7CisgICAgaWYgKCFtZXRob2QpIHsKKyAgICAgICAgUHlfREVDUkVGKGN1cnNvcik7CisgICAgICAgIGN1cnNvciA9IDA7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChtZXRob2QsIGFyZ3MpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIFB5X0RFQ1JFRihjdXJzb3IpOworICAgICAgICBjdXJzb3IgPSAwOworICAgIH0KKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIFB5X1hERUNSRUYobWV0aG9kKTsKKworICAgIHJldHVybiBjdXJzb3I7Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2V4ZWN1dGVtYW55KENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5T2JqZWN0KiBjdXJzb3IgPSAwOworICAgIFB5T2JqZWN0KiByZXN1bHQgPSAwOworICAgIFB5T2JqZWN0KiBtZXRob2QgPSAwOworCisgICAgY3Vyc29yID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QqKXNlbGYsICJjdXJzb3IiLCAiIik7CisgICAgaWYgKCFjdXJzb3IpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGN1cnNvciwgImV4ZWN1dGVtYW55Iik7CisgICAgaWYgKCFtZXRob2QpIHsKKyAgICAgICAgUHlfREVDUkVGKGN1cnNvcik7CisgICAgICAgIGN1cnNvciA9IDA7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChtZXRob2QsIGFyZ3MpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIFB5X0RFQ1JFRihjdXJzb3IpOworICAgICAgICBjdXJzb3IgPSAwOworICAgIH0KKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIFB5X1hERUNSRUYobWV0aG9kKTsKKworICAgIHJldHVybiBjdXJzb3I7Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2V4ZWN1dGVzY3JpcHQoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIGN1cnNvciA9IDA7CisgICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7CisgICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7CisKKyAgICBjdXJzb3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgImN1cnNvciIsICIiKTsKKyAgICBpZiAoIWN1cnNvcikgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY3Vyc29yLCAiZXhlY3V0ZXNjcmlwdCIpOworICAgIGlmICghbWV0aG9kKSB7CisgICAgICAgIFB5X0RFQ1JFRihjdXJzb3IpOworICAgICAgICBjdXJzb3IgPSAwOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBQeV9ERUNSRUYoY3Vyc29yKTsKKyAgICAgICAgY3Vyc29yID0gMDsKKyAgICB9CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICBQeV9YREVDUkVGKG1ldGhvZCk7CisKKyAgICByZXR1cm4gY3Vyc29yOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTExBVElPTiBDT0RFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50Citjb2xsYXRpb25fY2FsbGJhY2soCisgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgIGludCB0ZXh0MV9sZW5ndGgsIGNvbnN0IHZvaWQqIHRleHQxX2RhdGEsCisgICAgICAgIGludCB0ZXh0Ml9sZW5ndGgsIGNvbnN0IHZvaWQqIHRleHQyX2RhdGEpCit7CisgICAgUHlPYmplY3QqIGNhbGxiYWNrID0gKFB5T2JqZWN0Kiljb250ZXh0OworICAgIFB5T2JqZWN0KiBzdHJpbmcxID0gMDsKKyAgICBQeU9iamVjdCogc3RyaW5nMiA9IDA7CisgICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZTsKKworICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIHN0cmluZzEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciopdGV4dDFfZGF0YSwgdGV4dDFfbGVuZ3RoKTsKKyAgICBzdHJpbmcyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIqKXRleHQyX2RhdGEsIHRleHQyX2xlbmd0aCk7CisKKyAgICBpZiAoIXN0cmluZzEgfHwgIXN0cmluZzIpIHsKKyAgICAgICAgZ290byBmaW5hbGx5OyAvKiBmYWlsZWQgdG8gYWxsb2NhdGUgc3RyaW5ncyAqLworICAgIH0KKworICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2FsbGJhY2ssIHN0cmluZzEsIHN0cmluZzIsIE5VTEwpOworCisgICAgaWYgKCFyZXR2YWwpIHsKKyAgICAgICAgLyogZXhlY3V0aW9uIGZhaWxlZCAqLworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlJbnRfQXNMb25nKHJldHZhbCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CisKK2ZpbmFsbHk6CisgICAgUHlfWERFQ1JFRihzdHJpbmcxKTsKKyAgICBQeV9YREVDUkVGKHN0cmluZzIpOworICAgIFB5X1hERUNSRUYocmV0dmFsKTsKKworICAgIFB5R0lMU3RhdGVfUmVsZWFzZShnaWxzdGF0ZSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgUHlPYmplY3QgKgorY29ubmVjdGlvbl9jcmVhdGVfY29sbGF0aW9uKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIFB5T2JqZWN0KiBjYWxsYWJsZTsKKyAgICBQeU9iamVjdCogdXBwZXJjYXNlX25hbWUgPSAwOworICAgIFB5T2JqZWN0KiBuYW1lOworICAgIFB5T2JqZWN0KiByZXR2YWw7CisgICAgY2hhciogY2hrOworICAgIGludCByYzsKKworICAgIGlmICghY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFjaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hTzpjcmVhdGVfY29sbGF0aW9uKG5hbWUsIGNhbGxiYWNrKSIsICZQeVN0cmluZ19UeXBlLCAmbmFtZSwgJmNhbGxhYmxlKSkgeworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorCisgICAgdXBwZXJjYXNlX25hbWUgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG5hbWUsICJ1cHBlciIsICIiKTsKKyAgICBpZiAoIXVwcGVyY2FzZV9uYW1lKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKKyAgICBjaGsgPSBQeVN0cmluZ19Bc1N0cmluZyh1cHBlcmNhc2VfbmFtZSk7CisgICAgd2hpbGUgKCpjaGspIHsKKyAgICAgICAgaWYgKCgqY2hrID49ICcwJyAmJiAqY2hrIDw9ICc5JykKKyAgICAgICAgIHx8ICgqY2hrID49ICdBJyAmJiAqY2hrIDw9ICdaJykKKyAgICAgICAgIHx8ICgqY2hrID09ICdfJykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoaysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFByb2dyYW1taW5nRXJyb3IsICJpbnZhbGlkIGNoYXJhY3RlciBpbiBjb2xsYXRpb24gbmFtZSIpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNhbGxhYmxlICE9IFB5X05vbmUgJiYgIVB5Q2FsbGFibGVfQ2hlY2soY2FsbGFibGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJwYXJhbWV0ZXIgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorCisgICAgaWYgKGNhbGxhYmxlICE9IFB5X05vbmUpIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW0oc2VsZi0+Y29sbGF0aW9ucywgdXBwZXJjYXNlX25hbWUsIGNhbGxhYmxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeURpY3RfRGVsSXRlbShzZWxmLT5jb2xsYXRpb25zLCB1cHBlcmNhc2VfbmFtZSk7CisgICAgfQorCisgICAgcmMgPSBzcWxpdGUzX2NyZWF0ZV9jb2xsYXRpb24oc2VsZi0+ZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcodXBwZXJjYXNlX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTElURV9VVEY4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWxsYWJsZSAhPSBQeV9Ob25lKSA/IGNhbGxhYmxlIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsbGFibGUgIT0gUHlfTm9uZSkgPyBjb2xsYXRpb25fY2FsbGJhY2sgOiBOVUxMKTsKKyAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIFB5RGljdF9EZWxJdGVtKHNlbGYtPmNvbGxhdGlvbnMsIHVwcGVyY2FzZV9uYW1lKTsKKyAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworZmluYWxseToKKyAgICBQeV9YREVDUkVGKHVwcGVyY2FzZV9uYW1lKTsKKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR2YWwgPSBQeV9Ob25lOworICAgIH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBjaGFyIGNvbm5lY3Rpb25fZG9jW10gPQorUHlEb2NfU1RSKCI8bWlzc2luZyBkb2NzdHJpbmc+Iik7CisKK3N0YXRpYyBQeUdldFNldERlZiBjb25uZWN0aW9uX2dldHNldFtdID0geworICAgIHsiaXNvbGF0aW9uX2xldmVsIiwgIChnZXR0ZXIpY29ubmVjdGlvbl9nZXRfaXNvbGF0aW9uX2xldmVsLCAoc2V0dGVyKWNvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbH0sCisgICAgeyJ0b3RhbF9jaGFuZ2VzIiwgIChnZXR0ZXIpY29ubmVjdGlvbl9nZXRfdG90YWxfY2hhbmdlcywgKHNldHRlcikwfSwKKyAgICB7TlVMTH0KK307CisKK3N0YXRpYyBQeU1ldGhvZERlZiBjb25uZWN0aW9uX21ldGhvZHNbXSA9IHsKKyAgICB7ImN1cnNvciIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2N1cnNvciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgICAgIFB5RG9jX1NUUigiUmV0dXJuIGEgY3Vyc29yIGZvciB0aGUgY29ubmVjdGlvbi4iKX0sCisgICAgeyJjbG9zZSIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2Nsb3NlLCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJDbG9zZXMgdGhlIGNvbm5lY3Rpb24uIil9LAorICAgIHsiY29tbWl0IiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fY29tbWl0LCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJDb21taXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uIil9LAorICAgIHsicm9sbGJhY2siLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9yb2xsYmFjaywgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiUm9sbCBiYWNrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiIpfSwKKyAgICB7ImNyZWF0ZV9mdW5jdGlvbiIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2NyZWF0ZV9mdW5jdGlvbiwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7ImNyZWF0ZV9hZ2dyZWdhdGUiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jcmVhdGVfYWdncmVnYXRlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKKyAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgbmV3IGFnZ3JlZ2F0ZS4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7ImV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9leGVjdXRlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LiBOb24tc3RhbmRhcmQuIil9LAorICAgIHsiZXhlY3V0ZW1hbnkiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9leGVjdXRlbWFueSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIlJlcGVhdGVkbHkgZXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LiBOb24tc3RhbmRhcmQuIil9LAorICAgIHsiZXhlY3V0ZXNjcmlwdCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2V4ZWN1dGVzY3JpcHQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlcyBhIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzIGF0IG9uY2UuIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJjcmVhdGVfY29sbGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbiwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBjb2xsYXRpb24gZnVuY3Rpb24uIil9LAorICAgIHtOVUxMLCBOVUxMfQorfTsKKworc3RhdGljIHN0cnVjdCBQeU1lbWJlckRlZiBjb25uZWN0aW9uX21lbWJlcnNbXSA9Cit7CisgICAgeyJXYXJuaW5nIiwgVF9PQkpFQ1QsIG9mZnNldG9mKENvbm5lY3Rpb24sIFdhcm5pbmcpLCBST30sCisgICAgeyJFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBFcnJvciksIFJPfSwKKyAgICB7IkludGVyZmFjZUVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKENvbm5lY3Rpb24sIEludGVyZmFjZUVycm9yKSwgUk99LAorICAgIHsiRGF0YWJhc2VFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBEYXRhYmFzZUVycm9yKSwgUk99LAorICAgIHsiRGF0YUVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKENvbm5lY3Rpb24sIERhdGFFcnJvciksIFJPfSwKKyAgICB7Ik9wZXJhdGlvbmFsRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgT3BlcmF0aW9uYWxFcnJvciksIFJPfSwKKyAgICB7IkludGVncml0eUVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKENvbm5lY3Rpb24sIEludGVncml0eUVycm9yKSwgUk99LAorICAgIHsiSW50ZXJuYWxFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBJbnRlcm5hbEVycm9yKSwgUk99LAorICAgIHsiUHJvZ3JhbW1pbmdFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBQcm9ncmFtbWluZ0Vycm9yKSwgUk99LAorICAgIHsiTm90U3VwcG9ydGVkRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgTm90U3VwcG9ydGVkRXJyb3IpLCBST30sCisgICAgeyJyb3dfZmFjdG9yeSIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCByb3dfZmFjdG9yeSl9LAorICAgIHsidGV4dF9mYWN0b3J5IiwgVF9PQkpFQ1QsIG9mZnNldG9mKENvbm5lY3Rpb24sIHRleHRfZmFjdG9yeSl9LAorICAgIHtOVUxMfQorfTsKKworUHlUeXBlT2JqZWN0IENvbm5lY3Rpb25UeXBlID0geworICAgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICAgICBNT0RVTEVfTkFNRSAiLkNvbm5lY3Rpb24iLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgICAgIHNpemVvZihDb25uZWN0aW9uKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgICAgICAoZGVzdHJ1Y3Rvciljb25uZWN0aW9uX2RlYWxsb2MsICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICAgICAodGVybmFyeWZ1bmMpY29ubmVjdGlvbl9jYWxsLCAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgY29ubmVjdGlvbl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgICAgY29ubmVjdGlvbl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgICBjb25uZWN0aW9uX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAgIGNvbm5lY3Rpb25fZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAgIChpbml0cHJvYyljb25uZWN0aW9uX2luaXQsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KK307CisKK2V4dGVybiBpbnQgY29ubmVjdGlvbl9zZXR1cF90eXBlcyh2b2lkKQoreworICAgIENvbm5lY3Rpb25UeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIHJldHVybiBQeVR5cGVfUmVhZHkoJkNvbm5lY3Rpb25UeXBlKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmggYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYWU2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiBjb25uZWN0aW9uLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIGNvbm5lY3Rpb24gdHlwZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgUFlTUUxJVEVfQ09OTkVDVElPTl9ICisjZGVmaW5lIFBZU1FMSVRFX0NPTk5FQ1RJT05fSAorI2luY2x1ZGUgIlB5dGhvbi5oIgorI2luY2x1ZGUgInB5dGhyZWFkLmgiCisjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorCisjaW5jbHVkZSAic3FsaXRlMy5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBzcWxpdGUzKiBkYjsKKworICAgIGludCBpblRyYW5zYWN0aW9uOworICAgIGludCBkZXRlY3RfdHlwZXM7CisKKyAgICAvKiB0aGUgdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzIGZvciBkYXRhYmFzZSBsb2NrcyAqLworICAgIGRvdWJsZSB0aW1lb3V0OworCisgICAgLyogZm9yIGludGVybmFsIHVzZSBpbiB0aGUgdGltZW91dCBoYW5kbGVyOiB3aGVuIGRpZCB0aGUgdGltZW91dCBoYW5kbGVyCisgICAgICogZmlyc3QgZ2V0IGNhbGxlZCB3aXRoIGNvdW50PTA/ICovCisgICAgZG91YmxlIHRpbWVvdXRfc3RhcnRlZDsKKworICAgIC8qIE5vbmUgZm9yIGF1dG9jb21taXQsIG90aGVyd2lzZSBhIFB5U3RyaW5nIHdpdGggdGhlIGlzb2xhdGlvbiBsZXZlbCAqLworICAgIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWw7CisKKyAgICAvKiBOVUxMIGZvciBhdXRvY29tbWl0LCBvdGhlcndpc2UgYSBzdHJpbmcgd2l0aCB0aGUgQkVHSU4gc3RhdG1lbnQ7IHdpbGwgYmUKKyAgICAgKiBmcmVlZCBpbiBjb25uZWN0aW9uIGRlc3RydWN0b3IgKi8KKyAgICBjaGFyKiBiZWdpbl9zdGF0ZW1lbnQ7CisKKyAgICBpbnQgY2hlY2tfc2FtZV90aHJlYWQ7CisgICAgbG9uZyB0aHJlYWRfaWRlbnQ7CisKKyAgICBDYWNoZSogc3RhdGVtZW50X2NhY2hlOworCisgICAgUHlPYmplY3QqIHJvd19mYWN0b3J5OworCisgICAgUHlPYmplY3QqIHRleHRfZmFjdG9yeTsKKworICAgIC8qIHJlbWVtYmVyIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zL2NsYXNzZXMgdXNlZCBpbgorICAgICAqIGNyZWF0ZV9mdW5jdGlvbi9jcmVhdGUvYWdncmVnYXRlLCB1c2UgdGhlc2UgYXMgZGljdGlvbmFyeSBrZXlzLCBzbyB3ZQorICAgICAqIGNhbiBrZWVwIHRoZSB0b3RhbCBzeXN0ZW0gcmVmY291bnQgY29uc3RhbnQgYnkgY2xlYXJpbmcgdGhhdCBkaWN0aW9uYXJ5CisgICAgICogaW4gY29ubmVjdGlvbl9kZWFsbG9jICovCisgICAgUHlPYmplY3QqIGZ1bmN0aW9uX3BpbmJvYXJkOworCisgICAgLyogYSBkaWN0aW9uYXJ5IG9mIHJlZ2lzdGVyZWQgY29sbGF0aW9uIG5hbWUgPT4gY29sbGF0aW9uIGNhbGxhYmxlIG1hcHBpbmdzICovCisgICAgUHlPYmplY3QqIGNvbGxhdGlvbnM7CisKKyAgICAvKiBFeGNlcHRpb24gb2JqZWN0cyAqLworICAgIFB5T2JqZWN0KiBXYXJuaW5nOworICAgIFB5T2JqZWN0KiBFcnJvcjsKKyAgICBQeU9iamVjdCogSW50ZXJmYWNlRXJyb3I7CisgICAgUHlPYmplY3QqIERhdGFiYXNlRXJyb3I7CisgICAgUHlPYmplY3QqIERhdGFFcnJvcjsKKyAgICBQeU9iamVjdCogT3BlcmF0aW9uYWxFcnJvcjsKKyAgICBQeU9iamVjdCogSW50ZWdyaXR5RXJyb3I7CisgICAgUHlPYmplY3QqIEludGVybmFsRXJyb3I7CisgICAgUHlPYmplY3QqIFByb2dyYW1taW5nRXJyb3I7CisgICAgUHlPYmplY3QqIE5vdFN1cHBvcnRlZEVycm9yOworfSBDb25uZWN0aW9uOworCitleHRlcm4gUHlUeXBlT2JqZWN0IENvbm5lY3Rpb25UeXBlOworCitQeU9iamVjdCogY29ubmVjdGlvbl9hbGxvYyhQeVR5cGVPYmplY3QqIHR5cGUsIGludCBhd2FyZSk7Cit2b2lkIGNvbm5lY3Rpb25fZGVhbGxvYyhDb25uZWN0aW9uKiBzZWxmKTsKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2N1cnNvcihDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CitQeU9iamVjdCogY29ubmVjdGlvbl9jbG9zZShDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogX2Nvbm5lY3Rpb25fYmVnaW4oQ29ubmVjdGlvbiogc2VsZik7CitQeU9iamVjdCogY29ubmVjdGlvbl9iZWdpbihDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogY29ubmVjdGlvbl9jb21taXQoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIGNvbm5lY3Rpb25fcm9sbGJhY2soQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIGNvbm5lY3Rpb25fbmV3KFB5VHlwZU9iamVjdCogdHlwZSwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrdyk7CitpbnQgY29ubmVjdGlvbl9pbml0KENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKKworaW50IGNoZWNrX3RocmVhZChDb25uZWN0aW9uKiBzZWxmKTsKK2ludCBjaGVja19jb25uZWN0aW9uKENvbm5lY3Rpb24qIGNvbik7CisKK2ludCBjb25uZWN0aW9uX3NldHVwX3R5cGVzKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb252ZXJ0ZXJzLmMgYi9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxODA2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIGNvbnZlcnRlcnMuYyAtIGRlZmF1bHQgY29udmVydGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgImFkYXB0ZXJzLmgiCisKKy8qIGR1bW15LCB3aWxsIGJlIGltcGxlbWVudGVkIGluIGEgbGF0ZXIgdmVyc2lvbiAqLworCitQeU9iamVjdCogY29udmVydF9kYXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK1B5T2JqZWN0KiBjb252ZXJ0X3RpbWVzdGFtcChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuaCBiL01vZHVsZXMvX3NxbGl0ZS9jb252ZXJ0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzNzY4YQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jb252ZXJ0ZXJzLmgKQEAgLTAsMCArMSwzMyBAQAorLyogY29udmVydGVycy5oIC0gZGVmYXVsdCBjb252ZXJ0ZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgUFlTUUxJVEVfQ09OVkVSVEVSU19ICisjZGVmaW5lIFBZU1FMSVRFX0NPTlZFUlRFUlNfSAorI2luY2x1ZGUgIlB5dGhvbi5oIgorI2luY2x1ZGUgInB5dGhyZWFkLmgiCisjaW5jbHVkZSAic3FsaXRlMy5oIgorCitQeU9iamVjdCogY29udmVydF9kYXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CitQeU9iamVjdCogY29udmVydF90aW1lc3RhbXAoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZiOGM3NwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYwpAQCAtMCwwICsxLDEwMjcgQEAKKy8qIGN1cnNvci5jIC0gdGhlIGN1cnNvciB0eXBlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgImN1cnNvci5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCIKKworLyogdXNlZCB0byBkZWNpZGUgd2V0aGVyIHRvIGNhbGwgUHlJbnRfRnJvbUxvbmcgb3IgUHlMb25nX0Zyb21Mb25nTG9uZyAqLworI2RlZmluZSBJTlQzMl9NSU4gKC0yMTQ3NDgzNjQ3IC0gMSkKKyNkZWZpbmUgSU5UMzJfTUFYIDIxNDc0ODM2NDcKKworUHlPYmplY3QqIGN1cnNvcl9pdGVybmV4dChDdXJzb3IgKnNlbGYpOworCitzdGF0aWMgU3RhdGVtZW50S2luZCBkZXRlY3Rfc3RhdGVtZW50X3R5cGUoY2hhciogc3RhdGVtZW50KQoreworICAgIGNoYXIgYnVmWzIwXTsKKyAgICBjaGFyKiBzcmM7CisgICAgY2hhciogZHN0OworCisgICAgc3JjID0gc3RhdGVtZW50OworICAgIC8qIHNraXAgb3ZlciB3aGl0ZXBhY2UgKi8KKyAgICB3aGlsZSAoKnNyYyA9PSAnXHInIHx8ICpzcmMgPT0gJ1xuJyB8fCAqc3JjID09ICcgJyB8fCAqc3JjID09ICdcdCcpIHsKKyAgICAgICAgc3JjKys7CisgICAgfQorCisgICAgaWYgKCpzcmMgPT0gMCkKKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9JTlZBTElEOworCisgICAgZHN0ID0gYnVmOworICAgICpkc3QgPSAwOworICAgIHdoaWxlIChpc2FscGhhKCpzcmMpICYmIGRzdCAtIGJ1ZiA8IHNpemVvZihidWYpIC0gMikgeworICAgICAgICAqZHN0KysgPSB0b2xvd2VyKCpzcmMrKyk7CisgICAgfQorCisgICAgKmRzdCA9IDA7CisKKyAgICBpZiAoIXN0cmNtcChidWYsICJzZWxlY3QiKSkgeworICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1NFTEVDVDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiaW5zZXJ0IikpIHsKKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9JTlNFUlQ7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInVwZGF0ZSIpKSB7CisgICAgICAgIHJldHVybiBTVEFURU1FTlRfVVBEQVRFOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChidWYsICJkZWxldGUiKSkgeworICAgICAgICByZXR1cm4gU1RBVEVNRU5UX0RFTEVURTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAicmVwbGFjZSIpKSB7CisgICAgICAgIHJldHVybiBTVEFURU1FTlRfUkVQTEFDRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU1RBVEVNRU5UX09USEVSOworICAgIH0KK30KKworaW50IGN1cnNvcl9pbml0KEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgQ29ubmVjdGlvbiogY29ubmVjdGlvbjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmQ29ubmVjdGlvblR5cGUsICZjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsgCisgICAgfQorCisgICAgUHlfSU5DUkVGKGNvbm5lY3Rpb24pOworICAgIHNlbGYtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgIHNlbGYtPnN0YXRlbWVudCA9IE5VTEw7CisgICAgc2VsZi0+bmV4dF9yb3cgPSBOVUxMOworCisgICAgc2VsZi0+cm93X2Nhc3RfbWFwID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoIXNlbGYtPnJvd19jYXN0X21hcCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHNlbGYtPmRlc2NyaXB0aW9uID0gUHlfTm9uZTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT5sYXN0cm93aWQ9IFB5X05vbmU7CisKKyAgICBzZWxmLT5hcnJheXNpemUgPSAxOworCisgICAgc2VsZi0+cm93Y291bnQgPSBQeUludF9Gcm9tTG9uZygtMUwpOworICAgIGlmICghc2VsZi0+cm93Y291bnQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT5yb3dfZmFjdG9yeSA9IFB5X05vbmU7CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmLT5jb25uZWN0aW9uKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY3Vyc29yX2RlYWxsb2MoQ3Vyc29yKiBzZWxmKQoreworICAgIGludCByYzsKKworICAgIC8qIFJlc2V0IHRoZSBzdGF0ZW1lbnQgaWYgdGhlIHVzZXIgaGFzIG5vdCBjbG9zZWQgdGhlIGN1cnNvciAqLworICAgIGlmIChzZWxmLT5zdGF0ZW1lbnQpIHsKKyAgICAgICAgcmMgPSBzdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YXRlbWVudCk7CisgICAgfQorCisgICAgUHlfWERFQ1JFRihzZWxmLT5jb25uZWN0aW9uKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJvd19jYXN0X21hcCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kZXNjcmlwdGlvbik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5sYXN0cm93aWQpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cm93Y291bnQpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cm93X2ZhY3RvcnkpOworICAgIFB5X1hERUNSRUYoc2VsZi0+bmV4dF9yb3cpOworCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCitpbnQgYnVpbGRfcm93X2Nhc3RfbWFwKEN1cnNvciogc2VsZikKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBjaGFyKiB0eXBlX3N0YXJ0ID0gKGNvbnN0IGNoYXIqKS0xOworICAgIGNvbnN0IGNoYXIqIHBvczsKKworICAgIGNvbnN0IGNoYXIqIGNvbG5hbWU7CisgICAgY29uc3QgY2hhciogZGVjbHR5cGU7CisgICAgUHlPYmplY3QqIHB5X2RlY2x0eXBlOworICAgIFB5T2JqZWN0KiBjb252ZXJ0ZXI7CisgICAgUHlPYmplY3QqIGtleTsKKworICAgIGlmICghc2VsZi0+Y29ubmVjdGlvbi0+ZGV0ZWN0X3R5cGVzKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFB5X1hERUNSRUYoc2VsZi0+cm93X2Nhc3RfbWFwKTsKKyAgICBzZWxmLT5yb3dfY2FzdF9tYXAgPSBQeUxpc3RfTmV3KDApOworCisgICAgZm9yIChpID0gMDsgaSA8IHNxbGl0ZTNfY29sdW1uX2NvdW50KHNlbGYtPnN0YXRlbWVudC0+c3QpOyBpKyspIHsKKyAgICAgICAgY29udmVydGVyID0gTlVMTDsKKworICAgICAgICBpZiAoc2VsZi0+Y29ubmVjdGlvbi0+ZGV0ZWN0X3R5cGVzIHwgUEFSU0VfQ09MTkFNRVMpIHsKKyAgICAgICAgICAgIGNvbG5hbWUgPSBzcWxpdGUzX2NvbHVtbl9uYW1lKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpOworCisgICAgICAgICAgICBmb3IgKHBvcyA9IGNvbG5hbWU7ICpwb3MgIT0gMDsgcG9zKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKnBvcyA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZV9zdGFydCA9IHBvcyArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgqcG9zID09ICddJyAmJiB0eXBlX3N0YXJ0ICE9IChjb25zdCBjaGFyKiktMSkgeworICAgICAgICAgICAgICAgICAgICBrZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0eXBlX3N0YXJ0LCBwb3MgLSB0eXBlX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0aW5nIGEgc3RyaW5nIGZhaWxlZCwgYnV0IGl0IGlzIHRvbyBjb21wbGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBoZXJlLCB3ZSBqdXN0IGFzc3VtZSB0aGVyZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICogbm8gY29udmVydGVyIGFuZCBwcm9jZWVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5RGljdF9HZXRJdGVtKGNvbnZlcnRlcnMsIGtleSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29udmVydGVyICYmIHNlbGYtPmNvbm5lY3Rpb24tPmRldGVjdF90eXBlcyB8IFBBUlNFX0RFQ0xUWVBFUykgeworICAgICAgICAgICAgZGVjbHR5cGUgPSBzcWxpdGUzX2NvbHVtbl9kZWNsdHlwZShzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKKyAgICAgICAgICAgIGlmIChkZWNsdHlwZSkgeworICAgICAgICAgICAgICAgIGZvciAocG9zID0gZGVjbHR5cGU7O3BvcysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcG9zID09ICcgJyB8fCAqcG9zID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB5X2RlY2x0eXBlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGVjbHR5cGUsIHBvcyAtIGRlY2x0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHlfZGVjbHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5RGljdF9HZXRJdGVtKGNvbnZlcnRlcnMsIHB5X2RlY2x0eXBlKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocHlfZGVjbHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjb252ZXJ0ZXIpIHsKKyAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5X05vbmU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5yb3dfY2FzdF9tYXAsIGNvbnZlcnRlcikgIT0gMCkgeworICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNvbnZlcnRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9YREVDUkVGKHNlbGYtPnJvd19jYXN0X21hcCk7CisgICAgICAgICAgICBzZWxmLT5yb3dfY2FzdF9tYXAgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworUHlPYmplY3QqIF9idWlsZF9jb2x1bW5fbmFtZShjb25zdCBjaGFyKiBjb2xuYW1lKQoreworICAgIGNvbnN0IGNoYXIqIHBvczsKKworICAgIGlmICghY29sbmFtZSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKworICAgIGZvciAocG9zID0gY29sbmFtZTs7IHBvcysrKSB7CisgICAgICAgIGlmICgqcG9zID09IDAgfHwgKnBvcyA9PSAnICcpIHsKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjb2xuYW1lLCBwb3MgLSBjb2xuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KKworUHlPYmplY3QqIHVuaWNvZGVfZnJvbV9zdHJpbmcoY29uc3QgY2hhciogdmFsX3N0ciwgaW50IG9wdGltaXplKQoreworICAgIGNvbnN0IGNoYXIqIGNoZWNrOworICAgIGludCBpc19hc2NpaSA9IDA7CisKKyAgICBpZiAob3B0aW1pemUpIHsKKyAgICAgICAgaXNfYXNjaWkgPSAxOworCisgICAgICAgIGNoZWNrID0gdmFsX3N0cjsKKyAgICAgICAgd2hpbGUgKCpjaGVjaykgeworICAgICAgICAgICAgaWYgKCpjaGVjayAmIDB4ODApIHsKKyAgICAgICAgICAgICAgICBpc19hc2NpaSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoZWNrKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfYXNjaWkpIHsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsX3N0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4KHZhbF9zdHIsIHN0cmxlbih2YWxfc3RyKSwgTlVMTCk7CisgICAgfQorfQorCisvKgorICogUmV0dXJucyBhIHJvdyBmcm9tIHRoZSBjdXJyZW50bHkgYWN0aXZlIFNRTGl0ZSBzdGF0ZW1lbnQKKyAqCisgKiBQcmVjb25kaWRpdGlvbjoKKyAqIC0gc3FsaXRlM19zdGVwKCkgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSBhbmQgaXQgcmV0dXJuZWQgU1FMSVRFX1JPVy4KKyAqLworUHlPYmplY3QqIF9mZXRjaF9vbmVfcm93KEN1cnNvciogc2VsZikKK3sKKyAgICBpbnQgaSwgbnVtY29sczsKKyAgICBQeU9iamVjdCogcm93OworICAgIFB5T2JqZWN0KiBpdGVtID0gTlVMTDsKKyAgICBpbnQgY29sdHlwZTsKKyAgICBQWV9MT05HX0xPTkcgaW50dmFsOworICAgIFB5T2JqZWN0KiBjb252ZXJ0ZXI7CisgICAgUHlPYmplY3QqIGNvbnZlcnRlZDsKKyAgICBQeV9zc2l6ZV90IG5ieXRlczsKKyAgICBQeU9iamVjdCogYnVmZmVyOworICAgIHZvaWQqIHJhd19idWZmZXI7CisgICAgY29uc3QgY2hhciogdmFsX3N0cjsKKyAgICBjaGFyIGJ1ZlsyMDBdOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIG51bWNvbHMgPSBzcWxpdGUzX2RhdGFfY291bnQoc2VsZi0+c3RhdGVtZW50LT5zdCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIHJvdyA9IFB5VHVwbGVfTmV3KG51bWNvbHMpOworICAgIGlmICghcm93KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1jb2xzOyBpKyspIHsKKyAgICAgICAgaWYgKHNlbGYtPmNvbm5lY3Rpb24tPmRldGVjdF90eXBlcykgeworICAgICAgICAgICAgY29udmVydGVyID0gUHlMaXN0X0dldEl0ZW0oc2VsZi0+cm93X2Nhc3RfbWFwLCBpKTsKKyAgICAgICAgICAgIGlmICghY29udmVydGVyKSB7CisgICAgICAgICAgICAgICAgY29udmVydGVyID0gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5X05vbmU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udmVydGVyICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIHZhbF9zdHIgPSAoY29uc3QgY2hhciopc3FsaXRlM19jb2x1bW5fdGV4dChzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKKyAgICAgICAgICAgIGlmICghdmFsX3N0cikgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeV9Ob25lOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWxfc3RyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjb252ZXJ0ZXIsICJPIiwgaXRlbSk7CisgICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogaGF2ZSBhIHdheSB0byBsb2cgdGhlc2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgY29sdHlwZSA9IHNxbGl0ZTNfY29sdW1uX3R5cGUoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgaWYgKGNvbHR5cGUgPT0gU1FMSVRFX05VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlfTm9uZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdHlwZSA9PSBTUUxJVEVfSU5URUdFUikgeworICAgICAgICAgICAgICAgIGludHZhbCA9IHNxbGl0ZTNfY29sdW1uX2ludDY0KHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpOworICAgICAgICAgICAgICAgIGlmIChpbnR2YWwgPCBJTlQzMl9NSU4gfHwgaW50dmFsID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoaW50dmFsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeUludF9Gcm9tTG9uZygobG9uZylpbnR2YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdHlwZSA9PSBTUUxJVEVfRkxPQVQpIHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoc3FsaXRlM19jb2x1bW5fZG91YmxlKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdHlwZSA9PSBTUUxJVEVfVEVYVCkgeworICAgICAgICAgICAgICAgIHZhbF9zdHIgPSAoY29uc3QgY2hhciopc3FsaXRlM19jb2x1bW5fdGV4dChzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoKHNlbGYtPmNvbm5lY3Rpb24tPnRleHRfZmFjdG9yeSA9PSAoUHlPYmplY3QqKSZQeVVuaWNvZGVfVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHNlbGYtPmNvbm5lY3Rpb24tPnRleHRfZmFjdG9yeSA9PSBPcHRpbWl6ZWRVbmljb2RlKSkgeworCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IHVuaWNvZGVfZnJvbV9zdHJpbmcodmFsX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNvbm5lY3Rpb24tPnRleHRfZmFjdG9yeSA9PSBPcHRpbWl6ZWRVbmljb2RlID8gMSA6IDApOworCisgICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAiQ291bGQgbm90IGRlY29kZSB0byBVVEYtOCBjb2x1bW4gJXMgd2l0aCB0ZXh0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZTNfY29sdW1uX25hbWUoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSksIHZhbF9zdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE9wZXJhdGlvbmFsRXJyb3IsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYtPmNvbm5lY3Rpb24tPnRleHRfZmFjdG9yeSA9PSAoUHlPYmplY3QqKSZQeVN0cmluZ19UeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsX3N0cik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmNvbm5lY3Rpb24tPnRleHRfZmFjdG9yeSwgInMiLCB2YWxfc3RyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGNvbHR5cGUgPT0gU1FMSVRFX0JMT0IgKi8KKyAgICAgICAgICAgICAgICBuYnl0ZXMgPSBzcWxpdGUzX2NvbHVtbl9ieXRlcyhzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBQeUJ1ZmZlcl9OZXcobmJ5dGVzKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIoYnVmZmVyLCAmcmF3X2J1ZmZlciwgJm5ieXRlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbWNweShyYXdfYnVmZmVyLCBzcWxpdGUzX2NvbHVtbl9ibG9iKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpLCBuYnl0ZXMpOworICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyb3csIGksIGNvbnZlcnRlZCk7CisgICAgfQorCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJvdyk7CisgICAgICAgIHJvdyA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHJvdzsKK30KKworUHlPYmplY3QqIF9xdWVyeV9leGVjdXRlKEN1cnNvciogc2VsZiwgaW50IG11bHRpcGxlLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBQeU9iamVjdCogb3BlcmF0aW9uOworICAgIFB5T2JqZWN0KiBvcGVyYXRpb25fYnl0ZXN0ciA9IE5VTEw7CisgICAgY2hhciogb3BlcmF0aW9uX2NzdHI7CisgICAgUHlPYmplY3QqIHBhcmFtZXRlcnNfbGlzdCA9IE5VTEw7CisgICAgUHlPYmplY3QqIHBhcmFtZXRlcnNfaXRlciA9IE5VTEw7CisgICAgUHlPYmplY3QqIHBhcmFtZXRlcnMgPSBOVUxMOworICAgIGludCBpOworICAgIGludCByYzsKKyAgICBQeU9iamVjdCogZnVuY19hcmdzOworICAgIFB5T2JqZWN0KiByZXN1bHQ7CisgICAgaW50IG51bWNvbHM7CisgICAgUFlfTE9OR19MT05HIGxhc3Ryb3dpZDsKKyAgICBpbnQgc3RhdGVtZW50X3R5cGU7CisgICAgUHlPYmplY3QqIGRlc2NyaXB0b3I7CisgICAgUHlPYmplY3QqIHNlY29uZF9hcmd1bWVudCA9IE5VTEw7CisgICAgbG9uZyByb3djb3VudCA9IDA7CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmLT5jb25uZWN0aW9uKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmLT5jb25uZWN0aW9uKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9YREVDUkVGKHNlbGYtPm5leHRfcm93KTsKKyAgICBzZWxmLT5uZXh0X3JvdyA9IE5VTEw7CisKKyAgICBpZiAobXVsdGlwbGUpIHsKKyAgICAgICAgLyogZXhlY3V0ZW1hbnkoKSAqLworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJm9wZXJhdGlvbiwgJnNlY29uZF9hcmd1bWVudCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAKKyAgICAgICAgfQorCisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sob3BlcmF0aW9uKSAmJiAhUHlVbmljb2RlX0NoZWNrKG9wZXJhdGlvbikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib3BlcmF0aW9uIHBhcmFtZXRlciBtdXN0IGJlIHN0ciBvciB1bmljb2RlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChQeUl0ZXJfQ2hlY2soc2Vjb25kX2FyZ3VtZW50KSkgeworICAgICAgICAgICAgLyogaXRlcmF0b3IgKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihzZWNvbmRfYXJndW1lbnQpOworICAgICAgICAgICAgcGFyYW1ldGVyc19pdGVyID0gc2Vjb25kX2FyZ3VtZW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc2VxdWVuY2UgKi8KKyAgICAgICAgICAgIHBhcmFtZXRlcnNfaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2Vjb25kX2FyZ3VtZW50KTsKKyAgICAgICAgICAgIGlmICghcGFyYW1ldGVyc19pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZXhlY3V0ZSgpICovCisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPIiwgJm9wZXJhdGlvbiwgJnNlY29uZF9hcmd1bWVudCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAKKyAgICAgICAgfQorCisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sob3BlcmF0aW9uKSAmJiAhUHlVbmljb2RlX0NoZWNrKG9wZXJhdGlvbikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib3BlcmF0aW9uIHBhcmFtZXRlciBtdXN0IGJlIHN0ciBvciB1bmljb2RlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtZXRlcnNfbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmICghcGFyYW1ldGVyc19saXN0KSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWNvbmRfYXJndW1lbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgc2Vjb25kX2FyZ3VtZW50ID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgICAgICBpZiAoIXNlY29uZF9hcmd1bWVudCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoc2Vjb25kX2FyZ3VtZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChwYXJhbWV0ZXJzX2xpc3QsIHNlY29uZF9hcmd1bWVudCkgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlY29uZF9hcmd1bWVudCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihzZWNvbmRfYXJndW1lbnQpOworCisgICAgICAgIHBhcmFtZXRlcnNfaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIocGFyYW1ldGVyc19saXN0KTsKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXJzX2l0ZXIpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2VsZi0+c3RhdGVtZW50ICE9IE5VTEwpIHsKKyAgICAgICAgLyogVGhlcmUgaXMgYW4gYWN0aXZlIHN0YXRlbWVudCAqLworICAgICAgICByYyA9IHN0YXRlbWVudF9yZXNldChzZWxmLT5zdGF0ZW1lbnQpOworICAgIH0KKworICAgIGlmIChQeVN0cmluZ19DaGVjayhvcGVyYXRpb24pKSB7CisgICAgICAgIG9wZXJhdGlvbl9jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob3BlcmF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvcGVyYXRpb25fYnl0ZXN0ciA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcob3BlcmF0aW9uKTsKKyAgICAgICAgaWYgKCFvcGVyYXRpb25fYnl0ZXN0cikgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIG9wZXJhdGlvbl9jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob3BlcmF0aW9uX2J5dGVzdHIpOworICAgIH0KKworICAgIC8qIHJlc2V0IGRlc2NyaXB0aW9uIGFuZCByb3djb3VudCAqLworICAgIFB5X0RFQ1JFRihzZWxmLT5kZXNjcmlwdGlvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHNlbGYtPmRlc2NyaXB0aW9uID0gUHlfTm9uZTsKKworICAgIFB5X0RFQ1JFRihzZWxmLT5yb3djb3VudCk7CisgICAgc2VsZi0+cm93Y291bnQgPSBQeUludF9Gcm9tTG9uZygtMUwpOworICAgIGlmICghc2VsZi0+cm93Y291bnQpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBzdGF0ZW1lbnRfdHlwZSA9IGRldGVjdF9zdGF0ZW1lbnRfdHlwZShvcGVyYXRpb25fY3N0cik7CisgICAgaWYgKHNlbGYtPmNvbm5lY3Rpb24tPmJlZ2luX3N0YXRlbWVudCkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlbWVudF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9VUERBVEU6CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9ERUxFVEU6CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9JTlNFUlQ6CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9SRVBMQUNFOgorICAgICAgICAgICAgICAgIGlmICghc2VsZi0+Y29ubmVjdGlvbi0+aW5UcmFuc2FjdGlvbikgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfY29ubmVjdGlvbl9iZWdpbihzZWxmLT5jb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfT1RIRVI6CisgICAgICAgICAgICAgICAgLyogaXQncyBhIERETCBzdGF0ZW1lbnQgb3Igc29tZXRoaW5nIHNpbWlsYXIKKyAgICAgICAgICAgICAgICAgICAtIHdlIGJldHRlciBDT01NSVQgZmlyc3Qgc28gaXQgd29ya3MgZm9yIGFsbCBjYXNlcyAqLworICAgICAgICAgICAgICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT5pblRyYW5zYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmNfYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZ1bmNfYXJncykgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25uZWN0aW9uX2NvbW1pdChzZWxmLT5jb25uZWN0aW9uLCBmdW5jX2FyZ3MpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuY19hcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfU0VMRUNUOgorICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHJvZ3JhbW1pbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBjYW5ub3QgZXhlY3V0ZSBTRUxFQ1Qgc3RhdGVtZW50cyBpbiBleGVjdXRlbWFueSgpLiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmNfYXJncyA9IFB5VHVwbGVfTmV3KDEpOworICAgIGlmICghZnVuY19hcmdzKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5X0lOQ1JFRihvcGVyYXRpb24pOworICAgIGlmIChQeVR1cGxlX1NldEl0ZW0oZnVuY19hcmdzLCAwLCBvcGVyYXRpb24pICE9IDApIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+c3RhdGVtZW50KSB7CisgICAgICAgICh2b2lkKXN0YXRlbWVudF9yZXNldChzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+c3RhdGVtZW50KTsKKyAgICB9CisKKyAgICBzZWxmLT5zdGF0ZW1lbnQgPSAoU3RhdGVtZW50KiljYWNoZV9nZXQoc2VsZi0+Y29ubmVjdGlvbi0+c3RhdGVtZW50X2NhY2hlLCBmdW5jX2FyZ3MpOworICAgIFB5X0RFQ1JFRihmdW5jX2FyZ3MpOworCisgICAgaWYgKCFzZWxmLT5zdGF0ZW1lbnQpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+c3RhdGVtZW50LT5pbl91c2UpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgIHNlbGYtPnN0YXRlbWVudCA9IFB5T2JqZWN0X05ldyhTdGF0ZW1lbnQsICZTdGF0ZW1lbnRUeXBlKTsKKyAgICAgICAgaWYgKCFzZWxmLT5zdGF0ZW1lbnQpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBzdGF0ZW1lbnRfY3JlYXRlKHNlbGYtPnN0YXRlbWVudCwgc2VsZi0+Y29ubmVjdGlvbiwgb3BlcmF0aW9uKTsKKyAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgc2VsZi0+c3RhdGVtZW50ID0gMDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKKyAgICBzdGF0ZW1lbnRfbWFya19kaXJ0eShzZWxmLT5zdGF0ZW1lbnQpOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcGFyYW1ldGVycyA9IFB5SXRlcl9OZXh0KHBhcmFtZXRlcnNfaXRlcik7CisgICAgICAgIGlmICghcGFyYW1ldGVycykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnRfbWFya19kaXJ0eShzZWxmLT5zdGF0ZW1lbnQpOworCisgICAgICAgIHN0YXRlbWVudF9iaW5kX3BhcmFtZXRlcnMoc2VsZi0+c3RhdGVtZW50LCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVpbGRfcm93X2Nhc3RfbWFwKHNlbGYpICE9IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPcGVyYXRpb25hbEVycm9yLCAiRXJyb3Igd2hpbGUgYnVpbGRpbmcgcm93X2Nhc3RfbWFwIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBfc3FsaXRlX3N0ZXBfd2l0aF9idXN5aGFuZGxlcihzZWxmLT5zdGF0ZW1lbnQtPnN0LCBzZWxmLT5jb25uZWN0aW9uKTsKKyAgICAgICAgaWYgKHJjICE9IFNRTElURV9ET05FICYmIHJjICE9IFNRTElURV9ST1cpIHsKKyAgICAgICAgICAgIHJjID0gc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgICAgICBpZiAocmMgPT0gU1FMSVRFX1NDSEVNQSkgeworICAgICAgICAgICAgICAgIHJjID0gc3RhdGVtZW50X3JlY29tcGlsZShzZWxmLT5zdGF0ZW1lbnQsIHBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIGlmIChyYyA9PSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBfc3FsaXRlX3N0ZXBfd2l0aF9idXN5aGFuZGxlcihzZWxmLT5zdGF0ZW1lbnQtPnN0LCBzZWxmLT5jb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJjID09IFNRTElURV9ST1cgfHwgKHJjID09IFNRTElURV9ET05FICYmIHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9TRUxFQ1QpKSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICBudW1jb2xzID0gc3FsaXRlM19jb2x1bW5fY291bnQoc2VsZi0+c3RhdGVtZW50LT5zdCk7CisgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgICAgICAgICBpZiAoc2VsZi0+ZGVzY3JpcHRpb24gPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5kZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgc2VsZi0+ZGVzY3JpcHRpb24gPSBQeVR1cGxlX05ldyhudW1jb2xzKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNlbGYtPmRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1jb2xzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IFB5VHVwbGVfTmV3KDcpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKGRlc2NyaXB0b3IsIDAsIF9idWlsZF9jb2x1bW5fbmFtZShzcWxpdGUzX2NvbHVtbl9uYW1lKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpKSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsgUHlUdXBsZV9TZXRJdGVtKGRlc2NyaXB0b3IsIDEsIFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7IFB5VHVwbGVfU2V0SXRlbShkZXNjcmlwdG9yLCAyLCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOyBQeVR1cGxlX1NldEl0ZW0oZGVzY3JpcHRvciwgMywgUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsgUHlUdXBsZV9TZXRJdGVtKGRlc2NyaXB0b3IsIDQsIFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7IFB5VHVwbGVfU2V0SXRlbShkZXNjcmlwdG9yLCA1LCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOyBQeVR1cGxlX1NldEl0ZW0oZGVzY3JpcHRvciwgNiwgUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShzZWxmLT5kZXNjcmlwdGlvbiwgaSwgZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJjID09IFNRTElURV9ST1cpIHsKKyAgICAgICAgICAgIGlmIChtdWx0aXBsZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCAiZXhlY3V0ZW1hbnkoKSBjYW4gb25seSBleGVjdXRlIERNTCBzdGF0ZW1lbnRzLiIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlbGYtPm5leHRfcm93ID0gX2ZldGNoX29uZV9yb3coc2VsZik7CisgICAgICAgIH0gZWxzZSBpZiAocmMgPT0gU1FMSVRFX0RPTkUgJiYgIW11bHRpcGxlKSB7CisgICAgICAgICAgICBzdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICAgICAgc2VsZi0+c3RhdGVtZW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoc3RhdGVtZW50X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1VQREFURToKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX0RFTEVURToKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX0lOU0VSVDoKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1JFUExBQ0U6CisgICAgICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgICAgIHJvd2NvdW50ICs9IChsb25nKXNxbGl0ZTNfY2hhbmdlcyhzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZi0+cm93Y291bnQpOworICAgICAgICAgICAgICAgIHNlbGYtPnJvd2NvdW50ID0gUHlJbnRfRnJvbUxvbmcocm93Y291bnQpOworICAgICAgICB9CisKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPmxhc3Ryb3dpZCk7CisgICAgICAgIGlmIChzdGF0ZW1lbnRfdHlwZSA9PSBTVEFURU1FTlRfSU5TRVJUKSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICBsYXN0cm93aWQgPSBzcWxpdGUzX2xhc3RfaW5zZXJ0X3Jvd2lkKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICBzZWxmLT5sYXN0cm93aWQgPSBQeUludF9Gcm9tTG9uZygobG9uZylsYXN0cm93aWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgc2VsZi0+bGFzdHJvd2lkID0gUHlfTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtdWx0aXBsZSkgeworICAgICAgICAgICAgcmMgPSBzdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKHBhcmFtZXRlcnMpOworICAgIH0KKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihvcGVyYXRpb25fYnl0ZXN0cik7CisgICAgUHlfWERFQ1JFRihwYXJhbWV0ZXJzKTsKKyAgICBQeV9YREVDUkVGKHBhcmFtZXRlcnNfaXRlcik7CisgICAgUHlfWERFQ1JFRihwYXJhbWV0ZXJzX2xpc3QpOworCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIH0KK30KKworUHlPYmplY3QqIGN1cnNvcl9leGVjdXRlKEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgcmV0dXJuIF9xdWVyeV9leGVjdXRlKHNlbGYsIDAsIGFyZ3MpOworfQorCitQeU9iamVjdCogY3Vyc29yX2V4ZWN1dGVtYW55KEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgcmV0dXJuIF9xdWVyeV9leGVjdXRlKHNlbGYsIDEsIGFyZ3MpOworfQorCitQeU9iamVjdCogY3Vyc29yX2V4ZWN1dGVzY3JpcHQoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBQeU9iamVjdCogc2NyaXB0X29iajsKKyAgICBQeU9iamVjdCogc2NyaXB0X3N0ciA9IE5VTEw7CisgICAgY29uc3QgY2hhciogc2NyaXB0X2NzdHI7CisgICAgc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQ7CisgICAgaW50IHJjOworICAgIFB5T2JqZWN0KiBmdW5jX2FyZ3M7CisgICAgUHlPYmplY3QqIHJlc3VsdDsKKyAgICBpbnQgc3RhdGVtZW50X2NvbXBsZXRlZCA9IDA7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmc2NyaXB0X29iaikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7IAorICAgIH0KKworICAgIGlmICghY2hlY2tfdGhyZWFkKHNlbGYtPmNvbm5lY3Rpb24pIHx8ICFjaGVja19jb25uZWN0aW9uKHNlbGYtPmNvbm5lY3Rpb24pKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChQeVN0cmluZ19DaGVjayhzY3JpcHRfb2JqKSkgeworICAgICAgICBzY3JpcHRfY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHNjcmlwdF9vYmopOworICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHNjcmlwdF9vYmopKSB7CisgICAgICAgIHNjcmlwdF9zdHIgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHNjcmlwdF9vYmopOworICAgICAgICBpZiAoIXNjcmlwdF9zdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc2NyaXB0X2NzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzY3JpcHRfc3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNjcmlwdCBhcmd1bWVudCBtdXN0IGJlIHVuaWNvZGUgb3Igc3RyaW5nLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBjb21taXQgZmlyc3QgKi8KKyAgICBmdW5jX2FyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAoIWZ1bmNfYXJncykgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICByZXN1bHQgPSBjb25uZWN0aW9uX2NvbW1pdChzZWxmLT5jb25uZWN0aW9uLCBmdW5jX2FyZ3MpOworICAgIFB5X0RFQ1JFRihmdW5jX2FyZ3MpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCFzcWxpdGUzX2NvbXBsZXRlKHNjcmlwdF9jc3RyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGVtZW50X2NvbXBsZXRlZCA9IDE7CisKKyAgICAgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+Y29ubmVjdGlvbi0+ZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF9jc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdF9jc3RyKTsKKyAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICAvKiBleGVjdXRlIHN0YXRlbWVudCwgYW5kIGlnbm9yZSByZXN1bHRzIG9mIFNFTEVDVCBzdGF0ZW1lbnRzICovCisgICAgICAgIHJjID0gU1FMSVRFX1JPVzsKKyAgICAgICAgd2hpbGUgKHJjID09IFNRTElURV9ST1cpIHsKKyAgICAgICAgICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc3RhdGVtZW50LCBzZWxmLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfRE9ORSkgeworICAgICAgICAgICAgKHZvaWQpc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOworICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKKyAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYoc2NyaXB0X3N0cik7CisKKyAgICBpZiAoIXN0YXRlbWVudF9jb21wbGV0ZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFByb2dyYW1taW5nRXJyb3IsICJ5b3UgZGlkIG5vdCBwcm92aWRlIGEgY29tcGxldGUgU1FMIHN0YXRlbWVudCIpOworICAgIH0KKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICB9Cit9CisKK1B5T2JqZWN0KiBjdXJzb3JfZ2V0aXRlcihDdXJzb3IgKnNlbGYpCit7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7Cit9CisKK1B5T2JqZWN0KiBjdXJzb3JfaXRlcm5leHQoQ3Vyc29yICpzZWxmKQoreworICAgIFB5T2JqZWN0KiBuZXh0X3Jvd190dXBsZTsKKyAgICBQeU9iamVjdCogbmV4dF9yb3c7CisgICAgaW50IHJjOworCisgICAgaWYgKCFjaGVja190aHJlYWQoc2VsZi0+Y29ubmVjdGlvbikgfHwgIWNoZWNrX2Nvbm5lY3Rpb24oc2VsZi0+Y29ubmVjdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFzZWxmLT5uZXh0X3JvdykgeworICAgICAgICAgaWYgKHNlbGYtPnN0YXRlbWVudCkgeworICAgICAgICAgICAgKHZvaWQpc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlbWVudCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbmV4dF9yb3dfdHVwbGUgPSBzZWxmLT5uZXh0X3JvdzsKKyAgICBzZWxmLT5uZXh0X3JvdyA9IE5VTEw7CisKKyAgICBpZiAoc2VsZi0+cm93X2ZhY3RvcnkgIT0gUHlfTm9uZSkgeworICAgICAgICBuZXh0X3JvdyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5yb3dfZmFjdG9yeSwgIk9PIiwgc2VsZiwgbmV4dF9yb3dfdHVwbGUpOworICAgICAgICBQeV9ERUNSRUYobmV4dF9yb3dfdHVwbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG5leHRfcm93ID0gbmV4dF9yb3dfdHVwbGU7CisgICAgfQorCisgICAgcmMgPSBfc3FsaXRlX3N0ZXBfd2l0aF9idXN5aGFuZGxlcihzZWxmLT5zdGF0ZW1lbnQtPnN0LCBzZWxmLT5jb25uZWN0aW9uKTsKKyAgICBpZiAocmMgIT0gU1FMSVRFX0RPTkUgJiYgcmMgIT0gU1FMSVRFX1JPVykgeworICAgICAgICBQeV9ERUNSRUYobmV4dF9yb3cpOworICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocmMgPT0gU1FMSVRFX1JPVykgeworICAgICAgICBzZWxmLT5uZXh0X3JvdyA9IF9mZXRjaF9vbmVfcm93KHNlbGYpOworICAgIH0KKworICAgIHJldHVybiBuZXh0X3JvdzsKK30KKworUHlPYmplY3QqIGN1cnNvcl9mZXRjaG9uZShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIFB5T2JqZWN0KiByb3c7CisKKyAgICByb3cgPSBjdXJzb3JfaXRlcm5leHQoc2VsZik7CisgICAgaWYgKCFyb3cgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisKKyAgICByZXR1cm4gcm93OworfQorCitQeU9iamVjdCogY3Vyc29yX2ZldGNobWFueShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIFB5T2JqZWN0KiByb3c7CisgICAgUHlPYmplY3QqIGxpc3Q7CisgICAgaW50IG1heHJvd3MgPSBzZWxmLT5hcnJheXNpemU7CisgICAgaW50IGNvdW50ZXIgPSAwOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aSIsICZtYXhyb3dzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsgCisgICAgfQorCisgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKCFsaXN0KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGp1c3QgbWFrZSBzdXJlIHdlIGVudGVyIHRoZSBsb29wICovCisgICAgcm93ID0gUHlfTm9uZTsKKworICAgIHdoaWxlIChyb3cpIHsKKyAgICAgICAgcm93ID0gY3Vyc29yX2l0ZXJuZXh0KHNlbGYpOworICAgICAgICBpZiAocm93KSB7CisgICAgICAgICAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIHJvdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYocm93KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCsrY291bnRlciA9PSBtYXhyb3dzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorfQorCitQeU9iamVjdCogY3Vyc29yX2ZldGNoYWxsKEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlPYmplY3QqIHJvdzsKKyAgICBQeU9iamVjdCogbGlzdDsKKworICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICghbGlzdCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBqdXN0IG1ha2Ugc3VyZSB3ZSBlbnRlciB0aGUgbG9vcCAqLworICAgIHJvdyA9IChQeU9iamVjdCopUHlfTm9uZTsKKworICAgIHdoaWxlIChyb3cpIHsKKyAgICAgICAgcm93ID0gY3Vyc29yX2l0ZXJuZXh0KHNlbGYpOworICAgICAgICBpZiAocm93KSB7CisgICAgICAgICAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIHJvdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYocm93KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorfQorCitQeU9iamVjdCogcHlzcWxpdGVfbm9vcChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICAvKiBkb24ndCBjYXJlLCByZXR1cm4gTm9uZSAqLworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworUHlPYmplY3QqIGN1cnNvcl9jbG9zZShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIGlmICghY2hlY2tfdGhyZWFkKHNlbGYtPmNvbm5lY3Rpb24pIHx8ICFjaGVja19jb25uZWN0aW9uKHNlbGYtPmNvbm5lY3Rpb24pKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChzZWxmLT5zdGF0ZW1lbnQpIHsKKyAgICAgICAgKHZvaWQpc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICBzZWxmLT5zdGF0ZW1lbnQgPSAwOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIGN1cnNvcl9tZXRob2RzW10gPSB7CisgICAgeyJleGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKWN1cnNvcl9leGVjdXRlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LiIpfSwKKyAgICB7ImV4ZWN1dGVtYW55IiwgKFB5Q0Z1bmN0aW9uKWN1cnNvcl9leGVjdXRlbWFueSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIlJlcGVhdGVkbHkgZXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LiIpfSwKKyAgICB7ImV4ZWN1dGVzY3JpcHQiLCAoUHlDRnVuY3Rpb24pY3Vyc29yX2V4ZWN1dGVzY3JpcHQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlcyBhIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzIGF0IG9uY2UuIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJmZXRjaG9uZSIsIChQeUNGdW5jdGlvbiljdXJzb3JfZmV0Y2hvbmUsIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIkZldGNoZXMgc2V2ZXJhbCByb3dzIGZyb20gdGhlIHJlc3VsdHNldC4iKX0sCisgICAgeyJmZXRjaG1hbnkiLCAoUHlDRnVuY3Rpb24pY3Vyc29yX2ZldGNobWFueSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIkZldGNoZXMgYWxsIHJvd3MgZnJvbSB0aGUgcmVzdWx0c2V0LiIpfSwKKyAgICB7ImZldGNoYWxsIiwgKFB5Q0Z1bmN0aW9uKWN1cnNvcl9mZXRjaGFsbCwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRmV0Y2hlcyBvbmUgcm93IGZyb20gdGhlIHJlc3VsdHNldC4iKX0sCisgICAgeyJjbG9zZSIsIChQeUNGdW5jdGlvbiljdXJzb3JfY2xvc2UsIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIkNsb3NlcyB0aGUgY3Vyc29yLiIpfSwKKyAgICB7InNldGlucHV0c2l6ZXMiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfbm9vcCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIlJlcXVpcmVkIGJ5IERCLUFQSS4gRG9lcyBub3RoaW5nIGluIHB5c3FsaXRlLiIpfSwKKyAgICB7InNldG91dHB1dHNpemUiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfbm9vcCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIlJlcXVpcmVkIGJ5IERCLUFQSS4gRG9lcyBub3RoaW5nIGluIHB5c3FsaXRlLiIpfSwKKyAgICB7TlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgUHlNZW1iZXJEZWYgY3Vyc29yX21lbWJlcnNbXSA9Cit7CisgICAgeyJjb25uZWN0aW9uIiwgVF9PQkpFQ1QsIG9mZnNldG9mKEN1cnNvciwgY29ubmVjdGlvbiksIFJPfSwKKyAgICB7ImRlc2NyaXB0aW9uIiwgVF9PQkpFQ1QsIG9mZnNldG9mKEN1cnNvciwgZGVzY3JpcHRpb24pLCBST30sCisgICAgeyJhcnJheXNpemUiLCBUX0lOVCwgb2Zmc2V0b2YoQ3Vyc29yLCBhcnJheXNpemUpLCAwfSwKKyAgICB7Imxhc3Ryb3dpZCIsIFRfT0JKRUNULCBvZmZzZXRvZihDdXJzb3IsIGxhc3Ryb3dpZCksIFJPfSwKKyAgICB7InJvd2NvdW50IiwgVF9PQkpFQ1QsIG9mZnNldG9mKEN1cnNvciwgcm93Y291bnQpLCBST30sCisgICAgeyJyb3dfZmFjdG9yeSIsIFRfT0JKRUNULCBvZmZzZXRvZihDdXJzb3IsIHJvd19mYWN0b3J5KSwgMH0sCisgICAge05VTEx9Cit9OworCitQeVR5cGVPYmplY3QgQ3Vyc29yVHlwZSA9IHsKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAgICAgTU9EVUxFX05BTUUgIi5DdXJzb3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2YoQ3Vyc29yKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpY3Vyc29yX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0hBVkVfSVRFUnxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAgICAgKGdldGl0ZXJmdW5jKWN1cnNvcl9nZXRpdGVyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgICAgICAoaXRlcm5leHRmdW5jKWN1cnNvcl9pdGVybmV4dCwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgICAgICBjdXJzb3JfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgICAgIGN1cnNvcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAgICAgKGluaXRwcm9jKWN1cnNvcl9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworfTsKKworZXh0ZXJuIGludCBjdXJzb3Jfc2V0dXBfdHlwZXModm9pZCkKK3sKKyAgICBDdXJzb3JUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIHJldHVybiBQeVR5cGVfUmVhZHkoJkN1cnNvclR5cGUpOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTY3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmgKQEAgLTAsMCArMSw3MSBAQAorLyogY3Vyc29yLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIGN1cnNvciB0eXBlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9DVVJTT1JfSAorI2RlZmluZSBQWVNRTElURV9DVVJTT1JfSAorI2luY2x1ZGUgIlB5dGhvbi5oIgorCisjaW5jbHVkZSAic3RhdGVtZW50LmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDb25uZWN0aW9uKiBjb25uZWN0aW9uOworICAgIFB5T2JqZWN0KiBkZXNjcmlwdGlvbjsKKyAgICBQeU9iamVjdCogcm93X2Nhc3RfbWFwOworICAgIGludCBhcnJheXNpemU7CisgICAgUHlPYmplY3QqIGxhc3Ryb3dpZDsKKyAgICBQeU9iamVjdCogcm93Y291bnQ7CisgICAgUHlPYmplY3QqIHJvd19mYWN0b3J5OworICAgIFN0YXRlbWVudCogc3RhdGVtZW50OworCisgICAgLyogdGhlIG5leHQgcm93IHRvIGJlIHJldHVybmVkLCBOVUxMIGlmIG5vIG5leHQgcm93IGF2YWlsYWJsZSAqLworICAgIFB5T2JqZWN0KiBuZXh0X3JvdzsKK30gQ3Vyc29yOworCit0eXBlZGVmIGVudW0geworICAgIFNUQVRFTUVOVF9JTlZBTElELCBTVEFURU1FTlRfSU5TRVJULCBTVEFURU1FTlRfREVMRVRFLAorICAgIFNUQVRFTUVOVF9VUERBVEUsIFNUQVRFTUVOVF9SRVBMQUNFLCBTVEFURU1FTlRfU0VMRUNULAorICAgIFNUQVRFTUVOVF9PVEhFUgorfSBTdGF0ZW1lbnRLaW5kOworCitleHRlcm4gUHlUeXBlT2JqZWN0IEN1cnNvclR5cGU7CisKK2ludCBjdXJzb3JfaW5pdChDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKK3ZvaWQgY3Vyc29yX2RlYWxsb2MoQ3Vyc29yKiBzZWxmKTsKK1B5T2JqZWN0KiBjdXJzb3JfZXhlY3V0ZShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK1B5T2JqZWN0KiBjdXJzb3JfZXhlY3V0ZW1hbnkoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogY3Vyc29yX2dldGl0ZXIoQ3Vyc29yICpzZWxmKTsKK1B5T2JqZWN0KiBjdXJzb3JfaXRlcm5leHQoQ3Vyc29yICpzZWxmKTsKK1B5T2JqZWN0KiBjdXJzb3JfZmV0Y2hvbmUoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogY3Vyc29yX2ZldGNobWFueShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK1B5T2JqZWN0KiBjdXJzb3JfZmV0Y2hhbGwoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogcHlzcWxpdGVfbm9vcChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogY3Vyc29yX2Nsb3NlKEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworCitpbnQgY3Vyc29yX3NldHVwX3R5cGVzKHZvaWQpOworCisjZGVmaW5lIFVOS05PV04gKC0xKQorI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuYyBiL01vZHVsZXMvX3NxbGl0ZS9taWNyb3Byb3RvY29scy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTZhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuYwpAQCAtMCwwICsxLDE0MiBAQAorLyogbWljcm9wcm90b2NvbHMuYyAtIG1pbmltYWxpc3QgYW5kIG5vbi12YWxpZGF0aW5nIHByb3RvY29scyBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEZlZGVyaWNvIERpIEdyZWdvcmlvIDxmb2dAZGViaWFuLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBwc3ljb3BnIGFuZCB3YXMgYWRhcHRlZCBmb3IgcHlzcWxpdGUuIEZlZGVyaWNvIERpCisgKiBHcmVnb3JpbyBnYXZlIHRoZSBwZXJtaXNzaW9uIHRvIHVzZSBpdCB3aXRoaW4gcHlzcWxpdGUgdW5kZXIgdGhlIGZvbGxvd2luZworICogbGljZW5zZToKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlIDxzdHJ1Y3RtZW1iZXIuaD4KKworI2luY2x1ZGUgImN1cnNvci5oIgorI2luY2x1ZGUgIm1pY3JvcHJvdG9jb2xzLmgiCisjaW5jbHVkZSAicHJlcGFyZV9wcm90b2NvbC5oIgorCisKKy8qKiB0aGUgYWRhcHRlcnMgcmVnaXN0cnkgKiovCisKK1B5T2JqZWN0ICpwc3ljb19hZGFwdGVyczsKKworLyogbWljcm9wcm90b2NvbHNfaW5pdCAtIGluaXRpYWxpemUgdGhlIGFkYXB0ZXJzIGRpY3Rpb25hcnkgKi8KKworaW50CittaWNyb3Byb3RvY29sc19pbml0KFB5T2JqZWN0ICpkaWN0KQoreworICAgIC8qIGNyZWF0ZSBhZGFwdGVycyBkaWN0aW9uYXJ5IGFuZCBwdXQgaXQgaW4gbW9kdWxlIG5hbWVzcGFjZSAqLworICAgIGlmICgocHN5Y29fYWRhcHRlcnMgPSBQeURpY3RfTmV3KCkpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiYWRhcHRlcnMiLCBwc3ljb19hZGFwdGVycyk7Cit9CisKKworLyogbWljcm9wcm90b2NvbHNfYWRkIC0gYWRkIGEgcmV2ZXJzZSB0eXBlLWNhc3RlciB0byB0aGUgZGljdGlvbmFyeSAqLworCitpbnQKK21pY3JvcHJvdG9jb2xzX2FkZChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpwcm90bywgUHlPYmplY3QgKmNhc3QpCit7CisgICAgUHlPYmplY3QqIGtleTsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAocHJvdG8gPT0gTlVMTCkgcHJvdG8gPSAoUHlPYmplY3QqKSZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlOworCisgICAga2V5ID0gUHlfQnVpbGRWYWx1ZSgiKE9PKSIsIChQeU9iamVjdCopdHlwZSwgcHJvdG8pOworICAgIGlmICgha2V5KSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByYyA9IFB5RGljdF9TZXRJdGVtKHBzeWNvX2FkYXB0ZXJzLCBrZXksIGNhc3QpOworICAgIFB5X0RFQ1JFRihrZXkpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKiBtaWNyb3Byb3RvY29sc19hZGFwdCAtIGFkYXB0IGFuIG9iamVjdCB0byB0aGUgYnVpbHQtaW4gcHJvdG9jb2wgKi8KKworUHlPYmplY3QgKgorbWljcm9wcm90b2NvbHNfYWRhcHQoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnByb3RvLCBQeU9iamVjdCAqYWx0KQoreworICAgIFB5T2JqZWN0ICphZGFwdGVyLCAqa2V5OworCisgICAgLyogd2UgZG9uJ3QgY2hlY2sgZm9yIGV4YWN0IHR5cGUgY29uZm9ybWFuY2UgYXMgc3BlY2lmaWVkIGluIFBFUCAyNDYKKyAgICAgICBiZWNhdXNlIHRoZSBTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlIHR5cGUgaXMgYWJzdHJhY3QgYW5kIHRoZXJlIGlzIG5vCisgICAgICAgd2F5IHRvIGdldCBhIHF1b3RhYmxlIG9iamVjdCB0byBiZSBpdHMgaW5zdGFuY2UgKi8KKworICAgIC8qIGxvb2sgZm9yIGFuIGFkYXB0ZXIgaW4gdGhlIHJlZ2lzdHJ5ICovCisgICAga2V5ID0gUHlfQnVpbGRWYWx1ZSgiKE9PKSIsIChQeU9iamVjdCopb2JqLT5vYl90eXBlLCBwcm90byk7CisgICAgaWYgKCFrZXkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFkYXB0ZXIgPSBQeURpY3RfR2V0SXRlbShwc3ljb19hZGFwdGVycywga2V5KTsKKyAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICBpZiAoYWRhcHRlcikgeworICAgICAgICBQeU9iamVjdCAqYWRhcHRlZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoYWRhcHRlciwgb2JqLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIGFkYXB0ZWQ7CisgICAgfQorCisgICAgLyogdHJ5IHRvIGhhdmUgdGhlIHByb3RvY29sIGFkYXB0IHRoaXMgb2JqZWN0Ki8KKyAgICBpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhwcm90bywgIl9fYWRhcHRfXyIpKSB7CisgICAgICAgIFB5T2JqZWN0ICphZGFwdGVkID0gUHlPYmplY3RfQ2FsbE1ldGhvZChwcm90bywgIl9fYWRhcHRfXyIsICJPIiwgb2JqKTsKKyAgICAgICAgaWYgKGFkYXB0ZWQpIHsKKyAgICAgICAgICAgIGlmIChhZGFwdGVkICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFkYXB0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkgJiYgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGFuZCBmaW5hbGx5IHRyeSB0byBoYXZlIHRoZSBvYmplY3QgYWRhcHQgaXRzZWxmICovCisgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcob2JqLCAiX19jb25mb3JtX18iKSkgeworICAgICAgICBQeU9iamVjdCAqYWRhcHRlZCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qob2JqLCAiX19jb25mb3JtX18iLCJPIiwgcHJvdG8pOworICAgICAgICBpZiAoYWRhcHRlZCkgeworICAgICAgICAgICAgaWYgKGFkYXB0ZWQgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhZGFwdGVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYWRhcHRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSAmJiAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGVsc2Ugc2V0IHRoZSByaWdodCBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFByb2dyYW1taW5nRXJyb3IsICJjYW4ndCBhZGFwdCIpOworICAgIHJldHVybiBOVUxMOworfQorCisvKiogbW9kdWxlLWxldmVsIGZ1bmN0aW9ucyAqKi8KKworUHlPYmplY3QgKgorcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHQoQ3Vyc29yICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeU9iamVjdCAqb2JqLCAqYWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcHJvdG8gPSAoUHlPYmplY3QqKSZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE9PIiwgJm9iaiwgJnByb3RvLCAmYWx0KSkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG1pY3JvcHJvdG9jb2xzX2FkYXB0KG9iaiwgcHJvdG8sIGFsdCk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaCBiL01vZHVsZXMvX3NxbGl0ZS9taWNyb3Byb3RvY29scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDliNjUKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaApAQCAtMCwwICsxLDU5IEBACisvKiBtaWNyb3Byb3RvY29scy5jIC0gZGVmaW5pdGlvbnMgZm9yIG1pbmltYWxpc3QgYW5kIG5vbi12YWxpZGF0aW5nIHByb3RvY29scworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEZlZGVyaWNvIERpIEdyZWdvcmlvIDxmb2dAZGViaWFuLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBwc3ljb3BnIGFuZCB3YXMgYWRhcHRlZCBmb3IgcHlzcWxpdGUuIEZlZGVyaWNvIERpCisgKiBHcmVnb3JpbyBnYXZlIHRoZSBwZXJtaXNzaW9uIHRvIHVzZSBpdCB3aXRoaW4gcHlzcWxpdGUgdW5kZXIgdGhlIGZvbGxvd2luZworICogbGljZW5zZToKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgUFNZQ09QR19NSUNST1BST1RPQ09MU19ICisjZGVmaW5lIFBTWUNPUEdfTUlDUk9QUk9UT0NPTFNfSCAxCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogYWRhcHRlcnMgcmVnaXN0cnkgKiovCisKK2V4dGVybiBQeU9iamVjdCAqcHN5Y29fYWRhcHRlcnM7CisKKy8qKiB0aGUgbmFtZXMgb2YgdGhlIHRocmVlIG1hbmRhdG9yeSBtZXRob2RzICoqLworCisjZGVmaW5lIE1JQ1JPUFJPVE9DT0xTX0dFVFFVT1RFRF9OQU1FICJnZXRxdW90ZWQiCisjZGVmaW5lIE1JQ1JPUFJPVE9DT0xTX0dFVFNUUklOR19OQU1FICJnZXRzdHJpbmciCisjZGVmaW5lIE1JQ1JPUFJPVE9DT0xTX0dFVEJJTkFSWV9OQU1FICJnZXRiaW5hcnkiCisKKy8qKiBleHBvcnRlZCBmdW5jdGlvbnMgKiovCisKKy8qIHVzZWQgYnkgbW9kdWxlLmMgdG8gaW5pdCB0aGUgbWljcm9wcm90b2NvbHMgc3lzdGVtICovCitleHRlcm4gaW50IG1pY3JvcHJvdG9jb2xzX2luaXQoUHlPYmplY3QgKmRpY3QpOworZXh0ZXJuIGludCBtaWNyb3Byb3RvY29sc19hZGQoCisgICAgUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqcHJvdG8sIFB5T2JqZWN0ICpjYXN0KTsKK2V4dGVybiBQeU9iamVjdCAqbWljcm9wcm90b2NvbHNfYWRhcHQoCisgICAgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnByb3RvLCBQeU9iamVjdCAqYWx0KTsKKworZXh0ZXJuIFB5T2JqZWN0ICoKKyAgICBwc3ljb19taWNyb3Byb3RvY29sc19hZGFwdChDdXJzb3IqIHNlbGYsIFB5T2JqZWN0ICphcmdzKTsgICAKKyNkZWZpbmUgcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHRfZG9jIFwKKyAgICAiYWRhcHQob2JqLCBwcm90b2NvbCwgYWx0ZXJuYXRlKSAtPiBhZGFwdCBvYmogdG8gZ2l2ZW4gcHJvdG9jb2wiCisgICAgCisjZW5kaWYgLyogIWRlZmluZWQoUFNZQ09QR19NSUNST1BST1RPQ09MU19IKSAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MzdlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qIG1vZHVsZS5jIC0gdGhlIG1vZHVsZSBpdHNlbGYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgInN0YXRlbWVudC5oIgorI2luY2x1ZGUgImN1cnNvci5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicHJlcGFyZV9wcm90b2NvbC5oIgorI2luY2x1ZGUgIm1pY3JvcHJvdG9jb2xzLmgiCisjaW5jbHVkZSAicm93LmgiCisKKyNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMzAwMworI2RlZmluZSBIQVZFX1NIQVJFRF9DQUNIRQorI2VuZGlmCisKKy8qIHN0YXRpYyBvYmplY3RzIGF0IG1vZHVsZS1sZXZlbCAqLworCitQeU9iamVjdCogRXJyb3IsICpXYXJuaW5nLCAqSW50ZXJmYWNlRXJyb3IsICpEYXRhYmFzZUVycm9yLCAqSW50ZXJuYWxFcnJvciwKKyAgICAqT3BlcmF0aW9uYWxFcnJvciwgKlByb2dyYW1taW5nRXJyb3IsICpJbnRlZ3JpdHlFcnJvciwgKkRhdGFFcnJvciwKKyAgICAqTm90U3VwcG9ydGVkRXJyb3IsICpPcHRpbWl6ZWRVbmljb2RlOworCitQeU9iamVjdCogY29udmVydGVyczsKKworc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfY29ubmVjdChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KgorICAgICAgICBrd2FyZ3MpCit7CisgICAgLyogUHl0aG9uIHNlZW1zIHRvIGhhdmUgbm8gd2F5IG9mIGV4dHJhY3RpbmcgYSBzaW5nbGUga2V5d29yZC1hcmcgYXQKKyAgICAgKiBDLWxldmVsLCBzbyB0aGlzIGNvZGUgaXMgcmVkdW5kYW50IHdpdGggdGhlIG9uZSBpbiBjb25uZWN0aW9uX2luaXQgaW4KKyAgICAgKiBjb25uZWN0aW9uLmMgYW5kIG11c3QgYWx3YXlzIGJlIGNvcGllZCBmcm9tIHRoZXJlIC4uLiAqLworCisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhYmFzZSIsICJ0aW1lb3V0IiwgImRldGVjdF90eXBlcyIsICJpc29sYXRpb25fbGV2ZWwiLCAiY2hlY2tfc2FtZV90aHJlYWQiLCAiZmFjdG9yeSIsICJjYWNoZWRfc3RhdGVtZW50cyIsIE5VTEwsIE5VTEx9OworICAgIGNoYXIqIGRhdGFiYXNlOworICAgIGludCBkZXRlY3RfdHlwZXMgPSAwOworICAgIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWw7CisgICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOworICAgIGludCBjaGVja19zYW1lX3RocmVhZCA9IDE7CisgICAgaW50IGNhY2hlZF9zdGF0ZW1lbnRzOworICAgIGRvdWJsZSB0aW1lb3V0ID0gNS4wOworCisgICAgUHlPYmplY3QqIHJlc3VsdDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInN8ZGlPaU9pIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhYmFzZSwgJnRpbWVvdXQsICZkZXRlY3RfdHlwZXMsICZpc29sYXRpb25fbGV2ZWwsICZjaGVja19zYW1lX3RocmVhZCwgJmZhY3RvcnksICZjYWNoZWRfc3RhdGVtZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsgCisgICAgfQorCisgICAgaWYgKGZhY3RvcnkgPT0gTlVMTCkgeworICAgICAgICBmYWN0b3J5ID0gKFB5T2JqZWN0KikmQ29ubmVjdGlvblR5cGU7CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmYWN0b3J5LCBhcmdzLCBrd2FyZ3MpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfY29tcGxldGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKKyAgICAgICAga3dhcmdzKQoreworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic3RhdGVtZW50IiwgTlVMTCwgTlVMTH07CisgICAgY2hhciogc3RhdGVtZW50OworCisgICAgUHlPYmplY3QqIHJlc3VsdDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMiLCBrd2xpc3QsICZzdGF0ZW1lbnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7IAorICAgIH0KKworICAgIGlmIChzcWxpdGUzX2NvbXBsZXRlKHN0YXRlbWVudCkpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfVHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeV9GYWxzZTsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBIQVZFX1NIQVJFRF9DQUNIRQorc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfZW5hYmxlX3NoYXJlZF9jYWNoZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KgorICAgICAgICBrd2FyZ3MpCit7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkb19lbmFibGUiLCBOVUxMLCBOVUxMfTsKKyAgICBpbnQgZG9fZW5hYmxlOworICAgIGludCByYzsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImkiLCBrd2xpc3QsICZkb19lbmFibGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7IAorICAgIH0KKworICAgIHJjID0gc3FsaXRlM19lbmFibGVfc2hhcmVkX2NhY2hlKGRvX2VuYWJsZSk7CisKKyAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhPcGVyYXRpb25hbEVycm9yLCAiQ2hhbmdpbmcgdGhlIHNoYXJlZF9jYWNoZSBmbGFnIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KK30KKyNlbmRpZiAvKiBIQVZFX1NIQVJFRF9DQUNIRSAqLworCitzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeVR5cGVPYmplY3QqIHR5cGU7CisgICAgUHlPYmplY3QqIGNhc3RlcjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmdHlwZSwgJmNhc3RlcikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWljcm9wcm90b2NvbHNfYWRkKHR5cGUsIChQeU9iamVjdCopJlNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUsIGNhc3Rlcik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIG5hbWU7CisgICAgUHlPYmplY3QqIGNhbGxhYmxlOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZuYW1lLCAmY2FsbGFibGUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChQeURpY3RfU2V0SXRlbShjb252ZXJ0ZXJzLCBuYW1lLCBjYWxsYWJsZSkgIT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3ZvaWQgY29udmVydGVyc19pbml0KFB5T2JqZWN0KiBkaWN0KQoreworICAgIGNvbnZlcnRlcnMgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFjb252ZXJ0ZXJzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiY29udmVydGVycyIsIGNvbnZlcnRlcnMpOworfQorCitzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKKyAgICB7ImNvbm5lY3QiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9jb25uZWN0LCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFB5RG9jX1NUUigiQ3JlYXRlcyBhIGNvbm5lY3Rpb24uIil9LAorICAgIHsiY29tcGxldGVfc3RhdGVtZW50IiwgIChQeUNGdW5jdGlvbiltb2R1bGVfY29tcGxldGUsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgUHlEb2NfU1RSKCJDaGVja3MgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBjb21wbGV0ZSBTUUwgc3RhdGVtZW50LiIpfSwKKyNpZmRlZiBIQVZFX1NIQVJFRF9DQUNIRQorICAgIHsiZW5hYmxlX3NoYXJlZF9jYWNoZSIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGUsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgUHlEb2NfU1RSKCJFbmFibGUgb3IgZGlzYWJsZSBzaGFyZWQgY2FjaGUgbW9kZSBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkLiIpfSwKKyNlbmRpZgorICAgIHsicmVnaXN0ZXJfYWRhcHRlciIsIChQeUNGdW5jdGlvbiltb2R1bGVfcmVnaXN0ZXJfYWRhcHRlciwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoIlJlZ2lzdGVycyBhbiBhZGFwdGVyIHdpdGggc3FsaXRlJ3MgYWRhcHRlciByZWdpc3RyeS4iKX0sCisgICAgeyJyZWdpc3Rlcl9jb252ZXJ0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlciwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoIlJlZ2lzdGVycyBhIGNvbnZlcnRlciB3aXRoIHNxbGl0ZS4iKX0sCisgICAgeyJhZGFwdCIsICAoUHlDRnVuY3Rpb24pcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHQsIE1FVEhfVkFSQVJHUywgcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHRfZG9jfSwKKyAgICB7TlVMTCwgTlVMTH0KK307CisKK1B5TU9ESU5JVF9GVU5DIGluaXRfc3FsaXRlMyh2b2lkKQoreworICAgIFB5T2JqZWN0ICptb2R1bGUsICpkaWN0OworICAgIFB5T2JqZWN0ICp0bXBfb2JqOworCisgICAgbW9kdWxlID0gUHlfSW5pdE1vZHVsZSgiX3NxbGl0ZTMiLCBtb2R1bGVfbWV0aG9kcyk7CisKKyAgICBpZiAoIW1vZHVsZSB8fAorICAgICAgICAocm93X3NldHVwX3R5cGVzKCkgPCAwKSB8fAorICAgICAgICAoY3Vyc29yX3NldHVwX3R5cGVzKCkgPCAwKSB8fAorICAgICAgICAoY29ubmVjdGlvbl9zZXR1cF90eXBlcygpIDwgMCkgfHwKKyAgICAgICAgKGNhY2hlX3NldHVwX3R5cGVzKCkgPCAwKSB8fAorICAgICAgICAoc3RhdGVtZW50X3NldHVwX3R5cGVzKCkgPCAwKSB8fAorICAgICAgICAocHJlcGFyZV9wcm90b2NvbF9zZXR1cF90eXBlcygpIDwgMCkKKyAgICAgICApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFB5X0lOQ1JFRigmQ29ubmVjdGlvblR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJDb25uZWN0aW9uIiwgKFB5T2JqZWN0KikgJkNvbm5lY3Rpb25UeXBlKTsKKyAgICBQeV9JTkNSRUYoJkN1cnNvclR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJDdXJzb3IiLCAoUHlPYmplY3QqKSAmQ3Vyc29yVHlwZSk7CisgICAgUHlfSU5DUkVGKCZDYWNoZVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJTdGF0ZW1lbnQiLCAoUHlPYmplY3QqKSZTdGF0ZW1lbnRUeXBlKTsKKyAgICBQeV9JTkNSRUYoJlN0YXRlbWVudFR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJDYWNoZSIsIChQeU9iamVjdCopICZDYWNoZVR5cGUpOworICAgIFB5X0lOQ1JFRigmU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlByZXBhcmVQcm90b2NvbCIsIChQeU9iamVjdCopICZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlKTsKKyAgICBQeV9JTkNSRUYoJlJvd1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJSb3ciLCAoUHlPYmplY3QqKSAmUm93VHlwZSk7CisKKyAgICBpZiAoIShkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2R1bGUpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qKiogQ3JlYXRlIERCLUFQSSBFeGNlcHRpb24gaGllcmFyY2h5ICovCisKKyAgICBpZiAoIShFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkVycm9yIiwgUHlFeGNfU3RhbmRhcmRFcnJvciwgTlVMTCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJFcnJvciIsIEVycm9yKTsKKworICAgIGlmICghKFdhcm5pbmcgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5XYXJuaW5nIiwgUHlFeGNfU3RhbmRhcmRFcnJvciwgTlVMTCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJXYXJuaW5nIiwgV2FybmluZyk7CisKKyAgICAvKiBFcnJvciBzdWJjbGFzc2VzICovCisKKyAgICBpZiAoIShJbnRlcmZhY2VFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkludGVyZmFjZUVycm9yIiwgRXJyb3IsIE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiSW50ZXJmYWNlRXJyb3IiLCBJbnRlcmZhY2VFcnJvcik7CisKKyAgICBpZiAoIShEYXRhYmFzZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuRGF0YWJhc2VFcnJvciIsIEVycm9yLCBOVUxMKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkRhdGFiYXNlRXJyb3IiLCBEYXRhYmFzZUVycm9yKTsKKworICAgIC8qIERhdGFiYXNlRXJyb3Igc3ViY2xhc3NlcyAqLworCisgICAgaWYgKCEoSW50ZXJuYWxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkludGVybmFsRXJyb3IiLCBEYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkludGVybmFsRXJyb3IiLCBJbnRlcm5hbEVycm9yKTsKKworICAgIGlmICghKE9wZXJhdGlvbmFsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5PcGVyYXRpb25hbEVycm9yIiwgRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJPcGVyYXRpb25hbEVycm9yIiwgT3BlcmF0aW9uYWxFcnJvcik7CisKKyAgICBpZiAoIShQcm9ncmFtbWluZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuUHJvZ3JhbW1pbmdFcnJvciIsIERhdGFiYXNlRXJyb3IsIE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUHJvZ3JhbW1pbmdFcnJvciIsIFByb2dyYW1taW5nRXJyb3IpOworCisgICAgaWYgKCEoSW50ZWdyaXR5RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlZ3JpdHlFcnJvciIsIERhdGFiYXNlRXJyb3IsTlVMTCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJJbnRlZ3JpdHlFcnJvciIsIEludGVncml0eUVycm9yKTsKKworICAgIGlmICghKERhdGFFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkRhdGFFcnJvciIsIERhdGFiYXNlRXJyb3IsIE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiRGF0YUVycm9yIiwgRGF0YUVycm9yKTsKKworICAgIGlmICghKE5vdFN1cHBvcnRlZEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuTm90U3VwcG9ydGVkRXJyb3IiLCBEYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk5vdFN1cHBvcnRlZEVycm9yIiwgTm90U3VwcG9ydGVkRXJyb3IpOworCisgICAgLyogV2UganVzdCBuZWVkICJzb21ldGhpbmciIHVuaXF1ZSBmb3IgT3B0aW1pemVkVW5pY29kZS4gSXQgZG9lcyBub3QgcmVhbGx5CisgICAgICogbmVlZCB0byBiZSBhIHN0cmluZyBzdWJjbGFzcy4gSnVzdCBhbnl0aGluZyB0aGF0IGNhbiBhY3QgYXMgYSBzcGVjaWFsCisgICAgICogbWFya2VyIGZvciB1cy4gU28gSSBwdWxsZWQgUHlDZWxsX1R5cGUgb3V0IG9mIG15IG1hZ2ljIGhhdC4KKyAgICAgKi8KKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KikmUHlDZWxsX1R5cGUpOworICAgIE9wdGltaXplZFVuaWNvZGUgPSAoUHlPYmplY3QqKSZQeUNlbGxfVHlwZTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiT3B0aW1pemVkVW5pY29kZSIsIE9wdGltaXplZFVuaWNvZGUpOworCisgICAgaWYgKCEodG1wX29iaiA9IFB5SW50X0Zyb21Mb25nKFBBUlNFX0RFQ0xUWVBFUykpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJQQVJTRV9ERUNMVFlQRVMiLCB0bXBfb2JqKTsKKworICAgIGlmICghKHRtcF9vYmogPSBQeUludF9Gcm9tTG9uZyhQQVJTRV9DT0xOQU1FUykpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJQQVJTRV9DT0xOQU1FUyIsIHRtcF9vYmopOworCisgICAgaWYgKCEodG1wX29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoUFlTUUxJVEVfVkVSU0lPTikpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJ2ZXJzaW9uIiwgdG1wX29iaik7CisKKyAgICBpZiAoISh0bXBfb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzcWxpdGUzX2xpYnZlcnNpb24oKSkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJzcWxpdGVfdmVyc2lvbiIsIHRtcF9vYmopOworCisgICAgLyogaW5pdGlhbGl6ZSBtaWNyb3Byb3RvY29scyBsYXllciAqLworICAgIG1pY3JvcHJvdG9jb2xzX2luaXQoZGljdCk7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBkZWZhdWx0IGNvbnZlcnRlcnMgKi8KKyAgICBjb252ZXJ0ZXJzX2luaXQoZGljdCk7CisKKyAgICAvKiBPcmlnaW5hbCBjb21tZW50IGZvcm0gX2JzZGRiLmMgaW4gdGhlIFB5dGhvbiBjb3JlLiBUaGlzIGlzIGFsc28gc3RpbGwKKyAgICAgKiBuZWVkZWQgbm93YWRheXMgZm9yIFB5dGhvbiAyLjMvMi40LgorICAgICAqIAorICAgICAqIFB5RXZhbF9Jbml0VGhyZWFkcyBpcyBjYWxsZWQgaGVyZSBkdWUgdG8gYSBxdWlyayBpbiBweXRob24gMS41CisgICAgICogLSAyLjIuMSAoYXQgbGVhc3QpIGFjY29yZGluZyB0byBSdXNzZWxsIFdpbGxpYW1zb24gPG1lcmVsQHd0Lm5ldD46CisgICAgICogVGhlIGdsb2JhbCBpbnRlcmVwcmV0ZXIgbG9jayBpcyBub3QgaW5pdGlhbGl6ZWQgdW50aWwgdGhlIGZpcnN0CisgICAgICogdGhyZWFkIGlzIGNyZWF0ZWQgdXNpbmcgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoKSBvciBmb3JrKCkgaXMKKyAgICAgKiBjYWxsZWQuICB0aGF0IHdvdWxkIGNhdXNlIHRoZSBBTExPV19USFJFQURTIGhlcmUgdG8gc2VnZmF1bHQgZHVlCisgICAgICogdG8gYSBudWxsIHBvaW50ZXIgcmVmZXJlbmNlIGlmIG5vIHRocmVhZHMgb3IgY2hpbGQgcHJvY2Vzc2VzCisgICAgICogaGF2ZSBiZWVuIGNyZWF0ZWQuICBUaGlzIHdvcmtzIGFyb3VuZCB0aGF0IGFuZCBpcyBhIG5vLW9wIGlmCisgICAgICogdGhyZWFkcyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKyAgICAgKiAgKHNlZSBweWJzZGRiLXVzZXJzIG1haWxpbmcgbGlzdCBwb3N0IG9uIDIwMDItMDgtMDcpCisgICAgICovCisgICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7CisKK2Vycm9yOgorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBNT0RVTEVfTkFNRSAiOiBpbml0IGZhaWxlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaCBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njk0NzM1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIG1vZHVsZS5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBtb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX01PRFVMRV9ICisjZGVmaW5lIFBZU1FMSVRFX01PRFVMRV9ICisjaW5jbHVkZSAiUHl0aG9uLmgiCisKKyNkZWZpbmUgUFlTUUxJVEVfVkVSU0lPTiAiMi4yLjAiCisKK2V4dGVybiBQeU9iamVjdCogRXJyb3I7CitleHRlcm4gUHlPYmplY3QqIFdhcm5pbmc7CitleHRlcm4gUHlPYmplY3QqIEludGVyZmFjZUVycm9yOworZXh0ZXJuIFB5T2JqZWN0KiBEYXRhYmFzZUVycm9yOworZXh0ZXJuIFB5T2JqZWN0KiBJbnRlcm5hbEVycm9yOworZXh0ZXJuIFB5T2JqZWN0KiBPcGVyYXRpb25hbEVycm9yOworZXh0ZXJuIFB5T2JqZWN0KiBQcm9ncmFtbWluZ0Vycm9yOworZXh0ZXJuIFB5T2JqZWN0KiBJbnRlZ3JpdHlFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogRGF0YUVycm9yOworZXh0ZXJuIFB5T2JqZWN0KiBOb3RTdXBwb3J0ZWRFcnJvcjsKKworZXh0ZXJuIFB5T2JqZWN0KiBPcHRpbWl6ZWRVbmljb2RlOworCisvKiB0aGUgZnVuY3Rpb25zIHRpbWUudGltZSgpIGFuZCB0aW1lLnNsZWVwKCkgKi8KK2V4dGVybiBQeU9iamVjdCogdGltZV90aW1lOworZXh0ZXJuIFB5T2JqZWN0KiB0aW1lX3NsZWVwOworCisvKiBBIGRpY3Rpb25hcnksIG1hcHBpbmcgY29sdW0gdHlwZXMgKElOVEVHRVIsIFZBUkNIQVIsIGV0Yy4pIHRvIGNvbnZlcnRlcgorICogZnVuY3Rpb25zLCB0aGF0IGNvbnZlcnQgdGhlIFNRTCB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgUHl0aG9uIHZhbHVlLgorICogVGhlIGtleSBpcyB1cHBlcmNhc2UuCisgKi8KK2V4dGVybiBQeU9iamVjdCogY29udmVydGVyczsKKworI2RlZmluZSBQQVJTRV9ERUNMVFlQRVMgMQorI2RlZmluZSBQQVJTRV9DT0xOQU1FUyAyCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9wcmVwYXJlX3Byb3RvY29sLmMgYi9Nb2R1bGVzL19zcWxpdGUvcHJlcGFyZV9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YjY2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvcHJlcGFyZV9wcm90b2NvbC5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIHByZXBhcmVfcHJvdG9jb2wuYyAtIHRoZSBwcm90b2NvbCBmb3IgcHJlcGFyaW5nIHZhbHVlcyBmb3IgU1FMaXRlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgInByZXBhcmVfcHJvdG9jb2wuaCIKKworaW50IHByZXBhcmVfcHJvdG9jb2xfaW5pdChTUUxpdGVQcmVwYXJlUHJvdG9jb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIHByZXBhcmVfcHJvdG9jb2xfZGVhbGxvYyhTUUxpdGVQcmVwYXJlUHJvdG9jb2wqIHNlbGYpCit7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCitQeVR5cGVPYmplY3QgU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZT0geworICAgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICAgICBNT0RVTEVfTkFNRSAiLlByZXBhcmVQcm90b2NvbCIsICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgICAgIHNpemVvZihTUUxpdGVQcmVwYXJlUHJvdG9jb2wpLCAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgICAgICAoZGVzdHJ1Y3RvcilwcmVwYXJlX3Byb3RvY29sX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAgIChpbml0cHJvYylwcmVwYXJlX3Byb3RvY29sX2luaXQsICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KK307CisKK2V4dGVybiBpbnQgcHJlcGFyZV9wcm90b2NvbF9zZXR1cF90eXBlcyh2b2lkKQoreworICAgIFNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZS5vYl90eXBlPSAmUHlUeXBlX1R5cGU7CisgICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZSk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvcHJlcGFyZV9wcm90b2NvbC5oIGIvTW9kdWxlcy9fc3FsaXRlL3ByZXBhcmVfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmM0ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3ByZXBhcmVfcHJvdG9jb2wuaApAQCAtMCwwICsxLDQxIEBACisvKiBwcmVwYXJlX3Byb3RvY29sLmggLSB0aGUgcHJvdG9jb2wgZm9yIHByZXBhcmluZyB2YWx1ZXMgZm9yIFNRTGl0ZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX1BSRVBBUkVfUFJPVE9DT0xfSAorI2RlZmluZSBQWVNRTElURV9QUkVQQVJFX1BST1RPQ09MX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECit9IFNRTGl0ZVByZXBhcmVQcm90b2NvbDsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlOworCitpbnQgcHJlcGFyZV9wcm90b2NvbF9pbml0KFNRTGl0ZVByZXBhcmVQcm90b2NvbCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOwordm9pZCBwcmVwYXJlX3Byb3RvY29sX2RlYWxsb2MoU1FMaXRlUHJlcGFyZVByb3RvY29sKiBzZWxmKTsKKworaW50IHByZXBhcmVfcHJvdG9jb2xfc2V0dXBfdHlwZXModm9pZCk7CisKKyNkZWZpbmUgVU5LTk9XTiAoLTEpCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9yb3cuYyBiL01vZHVsZXMvX3NxbGl0ZS9yb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGI2MTM1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3Jvdy5jCkBAIC0wLDAgKzEsMjAyIEBACisvKiByb3cuYyAtIGFuIGVuaGFuY2VkIHR1cGxlIGZvciBkYXRhYmFzZSByb3dzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgInJvdy5oIgorI2luY2x1ZGUgImN1cnNvci5oIgorI2luY2x1ZGUgInNxbGl0ZWNvbXBhdC5oIgorCit2b2lkIHJvd19kZWFsbG9jKFJvdyogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPmRhdGEpOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZGVzY3JpcHRpb24pOworCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCitpbnQgcm93X2luaXQoUm93KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeU9iamVjdCogZGF0YTsKKyAgICBDdXJzb3IqIGN1cnNvcjsKKworICAgIHNlbGYtPmRhdGEgPSAwOworICAgIHNlbGYtPmRlc2NyaXB0aW9uID0gMDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmY3Vyc29yLCAmZGF0YSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghUHlPYmplY3RfSXNJbnN0YW5jZSgoUHlPYmplY3QqKWN1cnNvciwgKFB5T2JqZWN0KikmQ3Vyc29yVHlwZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImluc3RhbmNlIG9mIGN1cnNvciByZXF1aXJlZCBmb3IgZmlyc3QgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghUHlUdXBsZV9DaGVjayhkYXRhKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidHVwbGUgcmVxdWlyZWQgZm9yIHNlY29uZCBhcmd1bWVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgUHlfSU5DUkVGKGRhdGEpOworICAgIHNlbGYtPmRhdGEgPSBkYXRhOworCisgICAgUHlfSU5DUkVGKGN1cnNvci0+ZGVzY3JpcHRpb24pOworICAgIHNlbGYtPmRlc2NyaXB0aW9uID0gY3Vyc29yLT5kZXNjcmlwdGlvbjsKKworICAgIHJldHVybiAwOworfQorCitQeU9iamVjdCogcm93X3N1YnNjcmlwdChSb3cqIHNlbGYsIFB5T2JqZWN0KiBpZHgpCit7CisgICAgbG9uZyBfaWR4OworICAgIGNoYXIqIGtleTsKKyAgICBpbnQgbml0ZW1zLCBpOworICAgIGNoYXIqIGNvbXBhcmVfa2V5OworCisgICAgY2hhciogcDE7CisgICAgY2hhciogcDI7CisKKyAgICBQeU9iamVjdCogaXRlbTsKKworICAgIGlmIChQeUludF9DaGVjayhpZHgpKSB7CisgICAgICAgIF9pZHggPSBQeUludF9Bc0xvbmcoaWR4KTsKKyAgICAgICAgaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShzZWxmLT5kYXRhLCBfaWR4KTsKKyAgICAgICAgUHlfWElOQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2soaWR4KSkgeworICAgICAgICBfaWR4ID0gUHlMb25nX0FzTG9uZyhpZHgpOworICAgICAgICBpdGVtID0gUHlUdXBsZV9HZXRJdGVtKHNlbGYtPmRhdGEsIF9pZHgpOworICAgICAgICBQeV9YSU5DUkVGKGl0ZW0pOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGlkeCkpIHsKKyAgICAgICAga2V5ID0gUHlTdHJpbmdfQXNTdHJpbmcoaWR4KTsKKworICAgICAgICBuaXRlbXMgPSBQeVR1cGxlX1NpemUoc2VsZi0+ZGVzY3JpcHRpb24pOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuaXRlbXM7IGkrKykgeworICAgICAgICAgICAgY29tcGFyZV9rZXkgPSBQeVN0cmluZ19Bc1N0cmluZyhQeVR1cGxlX0dFVF9JVEVNKFB5VHVwbGVfR0VUX0lURU0oc2VsZi0+ZGVzY3JpcHRpb24sIGkpLCAwKSk7CisgICAgICAgICAgICBpZiAoIWNvbXBhcmVfa2V5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAxID0ga2V5OworICAgICAgICAgICAgcDIgPSBjb21wYXJlX2tleTsKKworICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCpwMSA9PSAoY2hhcikwKSB8fCAoKnAyID09IChjaGFyKTApKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKnAxIHwgMHgyMCkgIT0gKCpwMiB8IDB4MjApKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHAxKys7CisgICAgICAgICAgICAgICAgcDIrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgqcDEgPT0gKGNoYXIpMCkgJiYgKCpwMiA9PSAoY2hhcikwKSkgeworICAgICAgICAgICAgICAgIC8qIGZvdW5kIGl0ZW0gKi8KKyAgICAgICAgICAgICAgICBpdGVtID0gUHlUdXBsZV9HZXRJdGVtKHNlbGYtPmRhdGEsIGkpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJObyBpdGVtIHdpdGggdGhhdCBrZXkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGlkeCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzbGljZXMgbm90IGltcGxlbWVudGVkLCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJJbmRleCBtdXN0IGJlIGludCBvciBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitQeV9zc2l6ZV90IHJvd19sZW5ndGgoUm93KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICByZXR1cm4gUHlUdXBsZV9HRVRfU0laRShzZWxmLT5kYXRhKTsKK30KKworc3RhdGljIGludCByb3dfcHJpbnQoUm93KiBzZWxmLCBGSUxFICpmcCwgaW50IGZsYWdzKQoreworICAgIHJldHVybiAoJlB5VHVwbGVfVHlwZSktPnRwX3ByaW50KHNlbGYtPmRhdGEsIGZwLCBmbGFncyk7Cit9CisKKworUHlNYXBwaW5nTWV0aG9kcyByb3dfYXNfbWFwcGluZyA9IHsKKyAgICAvKiBtcF9sZW5ndGggICAgICAgICovIChsZW5mdW5jKXJvd19sZW5ndGgsCisgICAgLyogbXBfc3Vic2NyaXB0ICAgICAqLyAoYmluYXJ5ZnVuYylyb3dfc3Vic2NyaXB0LAorICAgIC8qIG1wX2Fzc19zdWJzY3JpcHQgKi8gKG9iam9iamFyZ3Byb2MpMCwKK307CisKKworUHlUeXBlT2JqZWN0IFJvd1R5cGUgPSB7CisgICAgICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisgICAgICAgIE1PRFVMRV9OQU1FICIuUm93IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAgICAgc2l6ZW9mKFJvdyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgICAgIChkZXN0cnVjdG9yKXJvd19kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAgICAgKHByaW50ZnVuYylyb3dfcHJpbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAgICAgKGluaXRwcm9jKXJvd19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworfTsKKworZXh0ZXJuIGludCByb3dfc2V0dXBfdHlwZXModm9pZCkKK3sKKyAgICBSb3dUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIFJvd1R5cGUudHBfYXNfbWFwcGluZyA9ICZyb3dfYXNfbWFwcGluZzsKKyAgICByZXR1cm4gUHlUeXBlX1JlYWR5KCZSb3dUeXBlKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9yb3cuaCBiL01vZHVsZXMvX3NxbGl0ZS9yb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmUwODNjCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3Jvdy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIHJvdy5oIC0gYW4gZW5oYW5jZWQgdHVwbGUgZm9yIGRhdGFiYXNlIHJvd3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9ST1dfSAorI2RlZmluZSBQWVNRTElURV9ST1dfSAorI2luY2x1ZGUgIlB5dGhvbi5oIgorCit0eXBlZGVmIHN0cnVjdCBfUm93Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0KiBkYXRhOworICAgIFB5T2JqZWN0KiBkZXNjcmlwdGlvbjsKK30gUm93OworCitleHRlcm4gUHlUeXBlT2JqZWN0IFJvd1R5cGU7CisKK2ludCByb3dfc2V0dXBfdHlwZXModm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3NxbGl0ZWNvbXBhdC5oIGIvTW9kdWxlcy9fc3FsaXRlL3NxbGl0ZWNvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzk4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvc3FsaXRlY29tcGF0LmgKQEAgLTAsMCArMSwzNCBAQAorLyogc3FsaXRlY29tcGF0LmggLSBjb21wYXRpYmlsaXR5IG1hY3JvcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX0NPTVBBVF9ICisjZGVmaW5lIFBZU1FMSVRFX0NPTVBBVF9ICisKKy8qIGRlZmluZSBQeV9zc2l6ZV90IGZvciBwcmUtMi41IHZlcnNpb25zIG9mIFB5dGhvbiAqLworCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwCit0eXBlZGVmIGludCBQeV9zc2l6ZV90OwordHlwZWRlZiBpbnQgKCpsZW5mdW5jKShQeU9iamVjdCopOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jIGIvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTM2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qIHN0YXRlbWVudC5jIC0gdGhlIHN0YXRlbWVudCB0eXBlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgInN0YXRlbWVudC5oIgorI2luY2x1ZGUgImN1cnNvci5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgorI2luY2x1ZGUgInByZXBhcmVfcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCIKKworLyogcHJvdG90eXBlcyAqLworaW50IGNoZWNrX3JlbWFpbmluZ19zcWwoY29uc3QgY2hhciogdGFpbCk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTElORUNPTU1FTlRfMSwKKyAgICBJTl9MSU5FQ09NTUVOVCwKKyAgICBDT01NRU5UU1RBUlRfMSwKKyAgICBJTl9DT01NRU5ULAorICAgIENPTU1FTlRFTkRfMSwKKyAgICBOT1JNQUwKK30gcGFyc2VfcmVtYWluaW5nX3NxbF9zdGF0ZTsKKworaW50IHN0YXRlbWVudF9jcmVhdGUoU3RhdGVtZW50KiBzZWxmLCBDb25uZWN0aW9uKiBjb25uZWN0aW9uLCBQeU9iamVjdCogc3FsKQoreworICAgIGNvbnN0IGNoYXIqIHRhaWw7CisgICAgaW50IHJjOworICAgIFB5T2JqZWN0KiBzcWxfc3RyOworICAgIGNoYXIqIHNxbF9jc3RyOworCisgICAgc2VsZi0+c3QgPSBOVUxMOworICAgIHNlbGYtPmluX3VzZSA9IDA7CisKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3FsKSkgeworICAgICAgICBzcWxfc3RyID0gc3FsOworICAgICAgICBQeV9JTkNSRUYoc3FsX3N0cik7CisgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3FsKSkgeworICAgICAgICBzcWxfc3RyID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhzcWwpOworICAgICAgICBpZiAoIXNxbF9zdHIpIHsKKyAgICAgICAgICAgIHJjID0gUFlTUUxJVEVfU1FMX1dST05HX1RZUEU7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IFBZU1FMSVRFX1NRTF9XUk9OR19UWVBFOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgc2VsZi0+c3FsID0gc3FsX3N0cjsKKworICAgIHNxbF9jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoc3FsX3N0cik7CisKKyAgICByYyA9IHNxbGl0ZTNfcHJlcGFyZShjb25uZWN0aW9uLT5kYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcWxfY3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRhaWwpOworCisgICAgc2VsZi0+ZGIgPSBjb25uZWN0aW9uLT5kYjsKKworICAgIGlmIChyYyA9PSBTUUxJVEVfT0sgJiYgY2hlY2tfcmVtYWluaW5nX3NxbCh0YWlsKSkgeworICAgICAgICAodm9pZClzcWxpdGUzX2ZpbmFsaXplKHNlbGYtPnN0KTsKKyAgICAgICAgc2VsZi0+c3QgPSBOVUxMOworICAgICAgICByYyA9IFBZU1FMSVRFX1RPT19NVUNIX1NRTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIoU3RhdGVtZW50KiBzZWxmLCBpbnQgcG9zLCBQeU9iamVjdCogcGFyYW1ldGVyKQoreworICAgIGludCByYyA9IFNRTElURV9PSzsKKyAgICBsb25nIGxvbmd2YWw7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgICBQWV9MT05HX0xPTkcgbG9uZ2xvbmd2YWw7CisjZW5kaWYKKyAgICBjb25zdCBjaGFyKiBidWZmZXI7CisgICAgY2hhciogc3RyaW5nOworICAgIFB5X3NzaXplX3QgYnVmbGVuOworICAgIFB5T2JqZWN0KiBzdHJpbmd2YWw7CisKKyAgICBpZiAocGFyYW1ldGVyID09IFB5X05vbmUpIHsKKyAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfbnVsbChzZWxmLT5zdCwgcG9zKTsKKyAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHBhcmFtZXRlcikpIHsKKyAgICAgICAgbG9uZ3ZhbCA9IFB5SW50X0FzTG9uZyhwYXJhbWV0ZXIpOworICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9pbnQ2NChzZWxmLT5zdCwgcG9zLCAoc3FsaXRlX2ludDY0KWxvbmd2YWwpOworI2lmZGVmIEhBVkVfTE9OR19MT05HCisgICAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2socGFyYW1ldGVyKSkgeworICAgICAgICBsb25nbG9uZ3ZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKHBhcmFtZXRlcik7CisgICAgICAgIC8qIGluIHRoZSBvdmVyZmxvdyBlcnJvciBjYXNlLCBsb25nbG9uZ3ZhbCBpcyAtMSwgYW5kIGFuIGV4Y2VwdGlvbiBpcyBzZXQgKi8KKyAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfaW50NjQoc2VsZi0+c3QsIHBvcywgKHNxbGl0ZV9pbnQ2NClsb25nbG9uZ3ZhbCk7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2socGFyYW1ldGVyKSkgeworICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9kb3VibGUoc2VsZi0+c3QsIHBvcywgUHlGbG9hdF9Bc0RvdWJsZShwYXJhbWV0ZXIpKTsKKyAgICB9IGVsc2UgaWYgKFB5QnVmZmVyX0NoZWNrKHBhcmFtZXRlcikpIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihwYXJhbWV0ZXIsICZidWZmZXIsICZidWZsZW4pID09IDApIHsKKyAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2Jsb2Ioc2VsZi0+c3QsIHBvcywgYnVmZmVyLCBidWZsZW4sIFNRTElURV9UUkFOU0lFTlQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJjb3VsZCBub3QgY29udmVydCBCTE9CIHRvIGJ1ZmZlciIpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiBQeVN0cmluZ19DaGVjayhwYXJhbWV0ZXIpIHsKKyAgICAgICAgc3RyaW5nID0gUHlTdHJpbmdfQXNTdHJpbmcocGFyYW1ldGVyKTsKKyAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICB9IGVsc2UgaWYgUHlVbmljb2RlX0NoZWNrKHBhcmFtZXRlcikgeworICAgICAgICBzdHJpbmd2YWwgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHBhcmFtZXRlcik7CisgICAgICAgIHN0cmluZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZ3ZhbCk7CisgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX3RleHQoc2VsZi0+c3QsIHBvcywgc3RyaW5nLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7CisgICAgICAgIFB5X0RFQ1JFRihzdHJpbmd2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJjID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIHN0YXRlbWVudF9iaW5kX3BhcmFtZXRlcnMoU3RhdGVtZW50KiBzZWxmLCBQeU9iamVjdCogcGFyYW1ldGVycykKK3sKKyAgICBQeU9iamVjdCogY3VycmVudF9wYXJhbTsKKyAgICBQeU9iamVjdCogYWRhcHRlZDsKKyAgICBjb25zdCBjaGFyKiBiaW5kaW5nX25hbWU7CisgICAgaW50IGk7CisgICAgaW50IHJjOworICAgIGludCBudW1fcGFyYW1zX25lZWRlZDsKKyAgICBpbnQgbnVtX3BhcmFtczsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBudW1fcGFyYW1zX25lZWRlZCA9IHNxbGl0ZTNfYmluZF9wYXJhbWV0ZXJfY291bnQoc2VsZi0+c3QpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBpZiAoUHlEaWN0X0NoZWNrKHBhcmFtZXRlcnMpKSB7CisgICAgICAgIC8qIHBhcmFtZXRlcnMgcGFzc2VkIGFzIGRpY3Rpb25hcnkgKi8KKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBudW1fcGFyYW1zX25lZWRlZDsgaSsrKSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICBiaW5kaW5nX25hbWUgPSBzcWxpdGUzX2JpbmRfcGFyYW1ldGVyX25hbWUoc2VsZi0+c3QsIGkpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGlmICghYmluZGluZ19uYW1lKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFByb2dyYW1taW5nRXJyb3IsICJCaW5kaW5nICVkIGhhcyBubyBuYW1lLCBidXQgeW91IHN1cHBsaWVkIGEgZGljdGlvbmFyeSAod2hpY2ggaGFzIG9ubHkgbmFtZXMpLiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmluZGluZ19uYW1lKys7IC8qIHNraXAgZmlyc3QgY2hhciAodGhlIGNvbG9uKSAqLworICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHBhcmFtZXRlcnMsIGJpbmRpbmdfbmFtZSk7CisgICAgICAgICAgICBpZiAoIWN1cnJlbnRfcGFyYW0pIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHJvZ3JhbW1pbmdFcnJvciwgIllvdSBkaWQgbm90IHN1cHBseSBhIHZhbHVlIGZvciBiaW5kaW5nICVkLiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUHlfSU5DUkVGKGN1cnJlbnRfcGFyYW0pOworICAgICAgICAgICAgYWRhcHRlZCA9IG1pY3JvcHJvdG9jb2xzX2FkYXB0KGN1cnJlbnRfcGFyYW0sIChQeU9iamVjdCopJlNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUsIE5VTEwpOworICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VycmVudF9wYXJhbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgYWRhcHRlZCA9IGN1cnJlbnRfcGFyYW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVyKHNlbGYsIGksIGFkYXB0ZWQpOworICAgICAgICAgICAgUHlfREVDUkVGKGFkYXB0ZWQpOworCisgICAgICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KEludGVyZmFjZUVycm9yLCAiRXJyb3IgYmluZGluZyBwYXJhbWV0ZXIgOiVzIC0gcHJvYmFibHkgdW5zdXBwb3J0ZWQgdHlwZS4iLCBiaW5kaW5nX25hbWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogcGFyYW1ldGVycyBwYXNzZWQgYXMgc2VxdWVuY2UgKi8KKyAgICAgICAgbnVtX3BhcmFtcyA9IFB5U2VxdWVuY2VfTGVuZ3RoKHBhcmFtZXRlcnMpOworICAgICAgICBpZiAobnVtX3BhcmFtcyAhPSBudW1fcGFyYW1zX25lZWRlZCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFByb2dyYW1taW5nRXJyb3IsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGJpbmRpbmdzIHN1cHBsaWVkLiBUaGUgY3VycmVudCBzdGF0ZW1lbnQgdXNlcyAlZCwgYW5kIHRoZXJlIGFyZSAlZCBzdXBwbGllZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wYXJhbXNfbmVlZGVkLCBudW1fcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmFtczsgaSsrKSB7CisgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHBhcmFtZXRlcnMsIGkpOworICAgICAgICAgICAgaWYgKCFjdXJyZW50X3BhcmFtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRhcHRlZCA9IG1pY3JvcHJvdG9jb2xzX2FkYXB0KGN1cnJlbnRfcGFyYW0sIChQeU9iamVjdCopJlNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUsIE5VTEwpOworCisgICAgICAgICAgICBpZiAoYWRhcHRlZCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJyZW50X3BhcmFtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBhZGFwdGVkID0gY3VycmVudF9wYXJhbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIoc2VsZiwgaSArIDEsIGFkYXB0ZWQpOworICAgICAgICAgICAgUHlfREVDUkVGKGFkYXB0ZWQpOworCisgICAgICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KEludGVyZmFjZUVycm9yLCAiRXJyb3IgYmluZGluZyBwYXJhbWV0ZXIgJWQgLSBwcm9iYWJseSB1bnN1cHBvcnRlZCB0eXBlLiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworaW50IHN0YXRlbWVudF9yZWNvbXBpbGUoU3RhdGVtZW50KiBzZWxmLCBQeU9iamVjdCogcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIqIHRhaWw7CisgICAgaW50IHJjOworICAgIGNoYXIqIHNxbF9jc3RyOworICAgIHNxbGl0ZTNfc3RtdCogbmV3X3N0OworCisgICAgc3FsX2NzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5zcWwpOworCisgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3FsX2NzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdGFpbCk7CisKKyAgICBpZiAocmMgPT0gU1FMSVRFX09LKSB7CisgICAgICAgIC8qIFRoZSBlZmZpY2llbnQgc3FsaXRlM190cmFuc2Zlcl9iaW5kaW5ncyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBTUUxpdGUKKyAgICAgICAgICogdmVyc2lvbiAzLjIuMiBvciBsYXRlci4gRm9yIG9sZGVyIFNRTGl0ZSByZWxlYXNlcywgdGhhdCBtaWdodCBub3QKKyAgICAgICAgICogZXZlbiBkZWZpbmUgU1FMSVRFX1ZFUlNJT05fTlVNQkVSLCB3ZSBkbyBpdCB0aGUgbWFudWFsIHdheS4KKyAgICAgICAgICovCisgICAgICAgICNpZmRlZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIKKyAgICAgICAgI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAyMDAyCisgICAgICAgICh2b2lkKXNxbGl0ZTNfdHJhbnNmZXJfYmluZGluZ3Moc2VsZi0+c3QsIG5ld19zdCk7CisgICAgICAgICNlbmRpZgorICAgICAgICAjZWxzZQorICAgICAgICBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXJzKHNlbGYsIHBhcmFtcyk7CisgICAgICAgICNlbmRpZgorCisgICAgICAgICh2b2lkKXNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOworICAgICAgICBzZWxmLT5zdCA9IG5ld19zdDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBzdGF0ZW1lbnRfZmluYWxpemUoU3RhdGVtZW50KiBzZWxmKQoreworICAgIGludCByYzsKKworICAgIHJjID0gU1FMSVRFX09LOworICAgIGlmIChzZWxmLT5zdCkgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzZWxmLT5zdCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHNlbGYtPnN0ID0gTlVMTDsKKyAgICB9CisKKyAgICBzZWxmLT5pbl91c2UgPSAwOworCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc3RhdGVtZW50X3Jlc2V0KFN0YXRlbWVudCogc2VsZikKK3sKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IFNRTElURV9PSzsKKworICAgIGlmIChzZWxmLT5pbl91c2UgJiYgc2VsZi0+c3QpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByYyA9IHNxbGl0ZTNfcmVzZXQoc2VsZi0+c3QpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgICAgIGlmIChyYyA9PSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIHNlbGYtPmluX3VzZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3ZvaWQgc3RhdGVtZW50X21hcmtfZGlydHkoU3RhdGVtZW50KiBzZWxmKQoreworICAgIHNlbGYtPmluX3VzZSA9IDE7Cit9CisKK3ZvaWQgc3RhdGVtZW50X2RlYWxsb2MoU3RhdGVtZW50KiBzZWxmKQoreworICAgIGludCByYzsKKworICAgIGlmIChzZWxmLT5zdCkgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzZWxmLT5zdCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorCisgICAgc2VsZi0+c3QgPSBOVUxMOworCisgICAgUHlfWERFQ1JFRihzZWxmLT5zcWwpOworCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCisvKgorICogQ2hlY2tzIGlmIHRoZXJlIGlzIGFueXRoaW5nIGxlZnQgaW4gYW4gU1FMIHN0cmluZyBhZnRlciBTUUxpdGUgY29tcGlsZWQgaXQuCisgKiBUaGlzIGlzIHVzZWQgdG8gY2hlY2sgaWYgc29tZWJvZHkgdHJpZWQgdG8gZXhlY3V0ZSBtb3JlIHRoYW4gb25lIFNRTCBjb21tYW5kCisgKiB3aXRoIG9uZSBleGVjdXRlKCkvZXhlY3V0ZW1hbnkoKSBjb21tYW5kLCB3aGljaCB0aGUgREItQVBJIGFuZCB3ZSBkb24ndAorICogYWxsb3cuCisgKgorICogUmV0dXJucyAxIGlmIHRoZXJlIGlzIG1vcmUgbGVmdCB0aGFuIHNob3VsZCBiZS4gMCBpZiBvay4KKyAqLworaW50IGNoZWNrX3JlbWFpbmluZ19zcWwoY29uc3QgY2hhciogdGFpbCkKK3sKKyAgICBjb25zdCBjaGFyKiBwb3MgPSB0YWlsOworCisgICAgcGFyc2VfcmVtYWluaW5nX3NxbF9zdGF0ZSBzdGF0ZSA9IE5PUk1BTDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgc3dpdGNoICgqcG9zKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTk9STUFMKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlICA9IExJTkVDT01NRU5UXzE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBMSU5FQ09NTUVOVF8xKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fTElORUNPTU1FTlQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBJTl9MSU5FQ09NTUVOVCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IE5PUk1BTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTk9STUFMKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gQ09NTUVOVFNUQVJUXzE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBDT01NRU5URU5EXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBOT1JNQUw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBDT01NRU5UU1RBUlRfMSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTk9STUFMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gTElORUNPTU1FTlRfMSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IENPTU1FTlRTVEFSVF8xKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fQ09NTUVOVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOX0NPTU1FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBDT01NRU5URU5EXzE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQ09NTUVOVEVORF8xKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fQ09NTUVOVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOX0xJTkVDT01NRU5UKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9DT01NRU5UKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcG9zKys7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK1B5VHlwZU9iamVjdCBTdGF0ZW1lbnRUeXBlID0geworICAgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICAgICBNT0RVTEVfTkFNRSAiLlN0YXRlbWVudCIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgICAgIHNpemVvZihTdGF0ZW1lbnQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgICAgICAoZGVzdHJ1Y3RvcilzdGF0ZW1lbnRfZGVhbGxvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAgIChpbml0cHJvYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KK307CisKK2V4dGVybiBpbnQgc3RhdGVtZW50X3NldHVwX3R5cGVzKHZvaWQpCit7CisgICAgU3RhdGVtZW50VHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICByZXR1cm4gUHlUeXBlX1JlYWR5KCZTdGF0ZW1lbnRUeXBlKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuaCBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVhMGZjCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIHN0YXRlbWVudC5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBzdGF0ZW1lbnQgdHlwZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX1NUQVRFTUVOVF9ICisjZGVmaW5lIFBZU1FMSVRFX1NUQVRFTUVOVF9ICisjaW5jbHVkZSAiUHl0aG9uLmgiCisKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAic3FsaXRlMy5oIgorCisjZGVmaW5lIFBZU1FMSVRFX1RPT19NVUNIX1NRTCAoLTEwMCkKKyNkZWZpbmUgUFlTUUxJVEVfU1FMX1dST05HX1RZUEUgKC0xMDEpCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIHNxbGl0ZTMqIGRiOworICAgIHNxbGl0ZTNfc3RtdCogc3Q7CisgICAgUHlPYmplY3QqIHNxbDsKKyAgICBpbnQgaW5fdXNlOworfSBTdGF0ZW1lbnQ7CisKK2V4dGVybiBQeVR5cGVPYmplY3QgU3RhdGVtZW50VHlwZTsKKworaW50IHN0YXRlbWVudF9jcmVhdGUoU3RhdGVtZW50KiBzZWxmLCBDb25uZWN0aW9uKiBjb25uZWN0aW9uLCBQeU9iamVjdCogc3FsKTsKK3ZvaWQgc3RhdGVtZW50X2RlYWxsb2MoU3RhdGVtZW50KiBzZWxmKTsKKworaW50IHN0YXRlbWVudF9iaW5kX3BhcmFtZXRlcihTdGF0ZW1lbnQqIHNlbGYsIGludCBwb3MsIFB5T2JqZWN0KiBwYXJhbWV0ZXIpOwordm9pZCBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXJzKFN0YXRlbWVudCogc2VsZiwgUHlPYmplY3QqIHBhcmFtZXRlcnMpOworCitpbnQgc3RhdGVtZW50X3JlY29tcGlsZShTdGF0ZW1lbnQqIHNlbGYsIFB5T2JqZWN0KiBwYXJhbWV0ZXJzKTsKK2ludCBzdGF0ZW1lbnRfZmluYWxpemUoU3RhdGVtZW50KiBzZWxmKTsKK2ludCBzdGF0ZW1lbnRfcmVzZXQoU3RhdGVtZW50KiBzZWxmKTsKK3ZvaWQgc3RhdGVtZW50X21hcmtfZGlydHkoU3RhdGVtZW50KiBzZWxmKTsKKworaW50IHN0YXRlbWVudF9zZXR1cF90eXBlcyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvdXRpbC5jIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzc0OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYwpAQCAtMCwwICsxLDk2IEBACisvKiB1dGlsLmMgLSB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKworaW50IF9zcWxpdGVfc3RlcF93aXRoX2J1c3loYW5kbGVyKHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50LCBDb25uZWN0aW9uKiBjb25uZWN0aW9uCispCit7CisgICAgaW50IHJjOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIHJldHVybiByYzsKK30KKworLyoqCisgKiBDaGVja3MgdGhlIFNRTGl0ZSBlcnJvciBjb2RlIGFuZCBzZXRzIHRoZSBhcHByb3ByaWF0ZSBEQi1BUEkgZXhjZXB0aW9uLgorICogUmV0dXJucyB0aGUgZXJyb3IgY29kZSAoMCBtZWFucyBubyBlcnJvciBvY2N1cmVkKS4KKyAqLworaW50IF9zZXRlcnJvcihzcWxpdGUzKiBkYikKK3sKKyAgICBpbnQgZXJyb3Jjb2RlOworCisgICAgZXJyb3Jjb2RlID0gc3FsaXRlM19lcnJjb2RlKGRiKTsKKworICAgIHN3aXRjaCAoZXJyb3Jjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBTUUxJVEVfT0s6CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX0lOVEVSTkFMOgorICAgICAgICBjYXNlIFNRTElURV9OT1RGT1VORDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbnRlcm5hbEVycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX05PTUVNOgorICAgICAgICAgICAgKHZvaWQpUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9FUlJPUjoKKyAgICAgICAgY2FzZSBTUUxJVEVfUEVSTToKKyAgICAgICAgY2FzZSBTUUxJVEVfQUJPUlQ6CisgICAgICAgIGNhc2UgU1FMSVRFX0JVU1k6CisgICAgICAgIGNhc2UgU1FMSVRFX0xPQ0tFRDoKKyAgICAgICAgY2FzZSBTUUxJVEVfUkVBRE9OTFk6CisgICAgICAgIGNhc2UgU1FMSVRFX0lOVEVSUlVQVDoKKyAgICAgICAgY2FzZSBTUUxJVEVfSU9FUlI6CisgICAgICAgIGNhc2UgU1FMSVRFX0ZVTEw6CisgICAgICAgIGNhc2UgU1FMSVRFX0NBTlRPUEVOOgorICAgICAgICBjYXNlIFNRTElURV9QUk9UT0NPTDoKKyAgICAgICAgY2FzZSBTUUxJVEVfRU1QVFk6CisgICAgICAgIGNhc2UgU1FMSVRFX1NDSEVNQToKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPcGVyYXRpb25hbEVycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX0NPUlJVUFQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGF0YWJhc2VFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9UT09CSUc6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGF0YUVycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX0NPTlNUUkFJTlQ6CisgICAgICAgIGNhc2UgU1FMSVRFX01JU01BVENIOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEludGVncml0eUVycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX01JU1VTRToKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGF0YWJhc2VFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmggYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWE0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIHV0aWwuaCAtIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX1VUSUxfSAorI2RlZmluZSBQWVNRTElURV9VVElMX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJweXRocmVhZC5oIgorI2luY2x1ZGUgInNxbGl0ZTMuaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisKK2ludCBfc3FsaXRlX3N0ZXBfd2l0aF9idXN5aGFuZGxlcihzcWxpdGUzX3N0bXQqIHN0YXRlbWVudCwgQ29ubmVjdGlvbiogY29ubmVjdGlvbik7CisKKy8qKgorICogQ2hlY2tzIHRoZSBTUUxpdGUgZXJyb3IgY29kZSBhbmQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgREItQVBJIGV4Y2VwdGlvbi4KKyAqIFJldHVybnMgdGhlIGVycm9yIGNvZGUgKDAgbWVhbnMgbm8gZXJyb3Igb2NjdXJlZCkuCisgKi8KK2ludCBfc2V0ZXJyb3Ioc3FsaXRlMyogZGIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcmUuYyBiL01vZHVsZXMvX3NyZS5jCmluZGV4IDgxMjIzZDcuLjRhZjA4ZWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NyZS5jCisrKyBiL01vZHVsZXMvX3NyZS5jCkBAIC0yNzUsNyArMjc1LDcgQEAKICAgICAgICAgICAgIGRhdGFfc3RhY2tfZGVhbGxvYyhzdGF0ZSk7CiAgICAgICAgICAgICByZXR1cm4gU1JFX0VSUk9SX01FTU9SWTsKICAgICAgICAgfQotICAgICAgICBzdGF0ZS0+ZGF0YV9zdGFjayA9IHN0YWNrOworICAgICAgICBzdGF0ZS0+ZGF0YV9zdGFjayA9IChjaGFyICopc3RhY2s7CiAgICAgICAgIHN0YXRlLT5kYXRhX3N0YWNrX3NpemUgPSBjdXJzaXplOwogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTMzNSw3ICszMzUsNyBAQAogewogICAgIC8qIGNoZWNrIGlmIHBvaW50ZXIgaXMgYXQgZ2l2ZW4gcG9zaXRpb24gKi8KIAotICAgIGludCB0aGlzLCB0aGF0OworICAgIGludCB0aGlzcCwgdGhhdHA7CiAKICAgICBzd2l0Y2ggKGF0KSB7CiAKQEAgLTM2Miw1NyArMzYyLDU3IEBACiAgICAgY2FzZSBTUkVfQVRfQk9VTkRBUlk6CiAgICAgICAgIGlmIChzdGF0ZS0+YmVnaW5uaW5nID09IHN0YXRlLT5lbmQpCiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgdGhhdCA9ICgodm9pZCopIHB0ciA+IHN0YXRlLT5iZWdpbm5pbmcpID8KKyAgICAgICAgdGhhdHAgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CiAgICAgICAgICAgICBTUkVfSVNfV09SRCgoaW50KSBwdHJbLTFdKSA6IDA7Ci0gICAgICAgIHRoaXMgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CisgICAgICAgIHRoaXNwID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPwogICAgICAgICAgICAgU1JFX0lTX1dPUkQoKGludCkgcHRyWzBdKSA6IDA7Ci0gICAgICAgIHJldHVybiB0aGlzICE9IHRoYXQ7CisgICAgICAgIHJldHVybiB0aGlzcCAhPSB0aGF0cDsKIAogICAgIGNhc2UgU1JFX0FUX05PTl9CT1VOREFSWToKICAgICAgICAgaWYgKHN0YXRlLT5iZWdpbm5pbmcgPT0gc3RhdGUtPmVuZCkKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB0aGF0ID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPworICAgICAgICB0aGF0cCA9ICgodm9pZCopIHB0ciA+IHN0YXRlLT5iZWdpbm5pbmcpID8KICAgICAgICAgICAgIFNSRV9JU19XT1JEKChpbnQpIHB0clstMV0pIDogMDsKLSAgICAgICAgdGhpcyA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KKyAgICAgICAgdGhpc3AgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CiAgICAgICAgICAgICBTUkVfSVNfV09SRCgoaW50KSBwdHJbMF0pIDogMDsKLSAgICAgICAgcmV0dXJuIHRoaXMgPT0gdGhhdDsKKyAgICAgICAgcmV0dXJuIHRoaXNwID09IHRoYXRwOwogCiAgICAgY2FzZSBTUkVfQVRfTE9DX0JPVU5EQVJZOgogICAgICAgICBpZiAoc3RhdGUtPmJlZ2lubmluZyA9PSBzdGF0ZS0+ZW5kKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHRoYXQgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CisgICAgICAgIHRoYXRwID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPwogICAgICAgICAgICAgU1JFX0xPQ19JU19XT1JEKChpbnQpIHB0clstMV0pIDogMDsKLSAgICAgICAgdGhpcyA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KKyAgICAgICAgdGhpc3AgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CiAgICAgICAgICAgICBTUkVfTE9DX0lTX1dPUkQoKGludCkgcHRyWzBdKSA6IDA7Ci0gICAgICAgIHJldHVybiB0aGlzICE9IHRoYXQ7CisgICAgICAgIHJldHVybiB0aGlzcCAhPSB0aGF0cDsKIAogICAgIGNhc2UgU1JFX0FUX0xPQ19OT05fQk9VTkRBUlk6CiAgICAgICAgIGlmIChzdGF0ZS0+YmVnaW5uaW5nID09IHN0YXRlLT5lbmQpCiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgdGhhdCA9ICgodm9pZCopIHB0ciA+IHN0YXRlLT5iZWdpbm5pbmcpID8KKyAgICAgICAgdGhhdHAgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CiAgICAgICAgICAgICBTUkVfTE9DX0lTX1dPUkQoKGludCkgcHRyWy0xXSkgOiAwOwotICAgICAgICB0aGlzID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPworICAgICAgICB0aGlzcCA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KICAgICAgICAgICAgIFNSRV9MT0NfSVNfV09SRCgoaW50KSBwdHJbMF0pIDogMDsKLSAgICAgICAgcmV0dXJuIHRoaXMgPT0gdGhhdDsKKyAgICAgICAgcmV0dXJuIHRoaXNwID09IHRoYXRwOwogCiAjaWYgZGVmaW5lZChIQVZFX1VOSUNPREUpCiAgICAgY2FzZSBTUkVfQVRfVU5JX0JPVU5EQVJZOgogICAgICAgICBpZiAoc3RhdGUtPmJlZ2lubmluZyA9PSBzdGF0ZS0+ZW5kKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHRoYXQgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CisgICAgICAgIHRoYXRwID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPwogICAgICAgICAgICAgU1JFX1VOSV9JU19XT1JEKChpbnQpIHB0clstMV0pIDogMDsKLSAgICAgICAgdGhpcyA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KKyAgICAgICAgdGhpc3AgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CiAgICAgICAgICAgICBTUkVfVU5JX0lTX1dPUkQoKGludCkgcHRyWzBdKSA6IDA7Ci0gICAgICAgIHJldHVybiB0aGlzICE9IHRoYXQ7CisgICAgICAgIHJldHVybiB0aGlzcCAhPSB0aGF0cDsKIAogICAgIGNhc2UgU1JFX0FUX1VOSV9OT05fQk9VTkRBUlk6CiAgICAgICAgIGlmIChzdGF0ZS0+YmVnaW5uaW5nID09IHN0YXRlLT5lbmQpCiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgdGhhdCA9ICgodm9pZCopIHB0ciA+IHN0YXRlLT5iZWdpbm5pbmcpID8KKyAgICAgICAgdGhhdHAgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CiAgICAgICAgICAgICBTUkVfVU5JX0lTX1dPUkQoKGludCkgcHRyWy0xXSkgOiAwOwotICAgICAgICB0aGlzID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPworICAgICAgICB0aGlzcCA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KICAgICAgICAgICAgIFNSRV9VTklfSVNfV09SRCgoaW50KSBwdHJbMF0pIDogMDsKLSAgICAgICAgcmV0dXJuIHRoaXMgPT0gdGhhdDsKKyAgICAgICAgcmV0dXJuIHRoaXNwID09IHRoYXRwOwogI2VuZGlmCiAKICAgICB9CkBAIC01MTYsOCArNTE2LDggQEAKIFNSRV9DT1VOVChTUkVfU1RBVEUqIHN0YXRlLCBTUkVfQ09ERSogcGF0dGVybiwgaW50IG1heGNvdW50KQogewogICAgIFNSRV9DT0RFIGNocjsKLSAgICBTUkVfQ0hBUiogcHRyID0gc3RhdGUtPnB0cjsKLSAgICBTUkVfQ0hBUiogZW5kID0gc3RhdGUtPmVuZDsKKyAgICBTUkVfQ0hBUiogcHRyID0gKFNSRV9DSEFSICopc3RhdGUtPnB0cjsKKyAgICBTUkVfQ0hBUiogZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICBpbnQgaTsKIAogICAgIC8qIGFkanVzdCBlbmQgKi8KQEAgLTgwMyw3ICs4MDMsNyBAQAogTE9DQUwoaW50KQogU1JFX01BVENIKFNSRV9TVEFURSogc3RhdGUsIFNSRV9DT0RFKiBwYXR0ZXJuKQogewotICAgIFNSRV9DSEFSKiBlbmQgPSBzdGF0ZS0+ZW5kOworICAgIFNSRV9DSEFSKiBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwogICAgIGludCBhbGxvY19wb3MsIGN0eF9wb3MgPSAtMTsKICAgICBpbnQgaSwgcmV0ID0gMDsKICAgICBpbnQganVtcDsKQEAgLTgyMSw3ICs4MjEsNyBAQAogCiBlbnRyYW5jZToKIAotICAgIGN0eC0+cHRyID0gc3RhdGUtPnB0cjsKKyAgICBjdHgtPnB0ciA9IChTUkVfQ0hBUiAqKXN0YXRlLT5wdHI7CiAKICAgICBpZiAoY3R4LT5wYXR0ZXJuWzBdID09IFNSRV9PUF9JTkZPKSB7CiAgICAgICAgIC8qIG9wdGltaXphdGlvbiBpbmZvIGJsb2NrICovCkBAIC0xNDc3LDggKzE0NzcsOCBAQAogTE9DQUwoaW50KQogU1JFX1NFQVJDSChTUkVfU1RBVEUqIHN0YXRlLCBTUkVfQ09ERSogcGF0dGVybikKIHsKLSAgICBTUkVfQ0hBUiogcHRyID0gc3RhdGUtPnN0YXJ0OwotICAgIFNSRV9DSEFSKiBlbmQgPSBzdGF0ZS0+ZW5kOworICAgIFNSRV9DSEFSKiBwdHIgPSAoU1JFX0NIQVIgKilzdGF0ZS0+c3RhcnQ7CisgICAgU1JFX0NIQVIqIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50IHByZWZpeF9sZW4gPSAwOwogICAgIGludCBwcmVmaXhfc2tpcCA9IDA7CkBAIC0xNTI0LDcgKzE1MjQsNyBAQAogICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEga25vd24gcHJlZml4LiAgdXNlIHRoZSBvdmVybGFwCiAgICAgICAgICAgIHRhYmxlIHRvIHNraXAgZm9yd2FyZCBhcyBmYXN0IGFzIHdlIHBvc3NpYmx5IGNhbiAqLwogICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGVuZCA9IHN0YXRlLT5lbmQ7CisgICAgICAgIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7CiAgICAgICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKICAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgICBpZiAoKFNSRV9DT0RFKSBwdHJbMF0gIT0gcHJlZml4W2ldKSB7CkBAIC0xNTU5LDcgKzE1NTksNyBAQAogICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgbGl0ZXJhbCBjaGFyYWN0ZXIuICB0aGlzIGlzIHVzZWQKICAgICAgICAgICAgZm9yIHNob3J0IHByZWZpeGVzLCBhbmQgaWYgZmFzdCBzZWFyY2ggaXMgZGlzYWJsZWQgKi8KICAgICAgICAgU1JFX0NPREUgY2hyID0gcGF0dGVyblsxXTsKLSAgICAgICAgZW5kID0gc3RhdGUtPmVuZDsKKyAgICAgICAgZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgd2hpbGUgKHB0ciA8IGVuZCAmJiAoU1JFX0NPREUpIHB0clswXSAhPSBjaHIpCiAgICAgICAgICAgICAgICAgcHRyKys7CkBAIC0xNTc2LDcgKzE1NzYsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChjaGFyc2V0KSB7CiAgICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBjaGFyYWN0ZXIgZnJvbSBhIGtub3duIHNldCAqLwotICAgICAgICBlbmQgPSBzdGF0ZS0+ZW5kOworICAgICAgICBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwogICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICB3aGlsZSAocHRyIDwgZW5kICYmICFTUkVfQ0hBUlNFVChjaGFyc2V0LCBwdHJbMF0pKQogICAgICAgICAgICAgICAgIHB0cisrOwpAQCAtMTYxOSw3MiArMTYxOSw4IEBACiAvKiBmYWN0b3JpZXMgYW5kIGRlc3RydWN0b3JzICovCiAKIC8qIHNlZSBzcmUuaCBmb3Igb2JqZWN0IGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgUHlUeXBlT2JqZWN0IFBhdHRlcm5fVHlwZTsKLXN0YXRpYyBQeVR5cGVPYmplY3QgTWF0Y2hfVHlwZTsKLXN0YXRpYyBQeVR5cGVPYmplY3QgU2Nhbm5lcl9UeXBlOwotCi1zdGF0aWMgUHlPYmplY3QgKgotX2NvbXBpbGUoUHlPYmplY3QqIHNlbGZfLCBQeU9iamVjdCogYXJncykKLXsKLSAgICAvKiAiY29tcGlsZSIgcGF0dGVybiBkZXNjcmlwdG9yIHRvIHBhdHRlcm4gb2JqZWN0ICovCi0KLSAgICBQYXR0ZXJuT2JqZWN0KiBzZWxmOwotICAgIGludCBpLCBuOwotCi0gICAgUHlPYmplY3QqIHBhdHRlcm47Ci0gICAgaW50IGZsYWdzID0gMDsKLSAgICBQeU9iamVjdCogY29kZTsKLSAgICBpbnQgZ3JvdXBzID0gMDsKLSAgICBQeU9iamVjdCogZ3JvdXBpbmRleCA9IE5VTEw7Ci0gICAgUHlPYmplY3QqIGluZGV4Z3JvdXAgPSBOVUxMOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2lPIXxpT08iLCAmcGF0dGVybiwgJmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlMaXN0X1R5cGUsICZjb2RlLCAmZ3JvdXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JvdXBpbmRleCwgJmluZGV4Z3JvdXApKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoY29kZSk7Ci0KLSAgICBzZWxmID0gUHlPYmplY3RfTkVXX1ZBUihQYXR0ZXJuT2JqZWN0LCAmUGF0dGVybl9UeXBlLCBuKTsKLSAgICBpZiAoIXNlbGYpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgc2VsZi0+Y29kZXNpemUgPSBuOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICBQeU9iamVjdCAqbyA9IFB5TGlzdF9HRVRfSVRFTShjb2RlLCBpKTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IFB5SW50X0NoZWNrKG8pID8gKHVuc2lnbmVkIGxvbmcpUHlJbnRfQXNMb25nKG8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQeUxvbmdfQXNVbnNpZ25lZExvbmcobyk7Ci0gICAgICAgIHNlbGYtPmNvZGVbaV0gPSAoU1JFX0NPREUpIHZhbHVlOwotICAgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHNlbGYtPmNvZGVbaV0gIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWd1bGFyIGV4cHJlc3Npb24gY29kZSBzaXplIGxpbWl0IGV4Y2VlZGVkIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgUHlfSU5DUkVGKHBhdHRlcm4pOwotICAgIHNlbGYtPnBhdHRlcm4gPSBwYXR0ZXJuOwotCi0gICAgc2VsZi0+ZmxhZ3MgPSBmbGFnczsKLQotICAgIHNlbGYtPmdyb3VwcyA9IGdyb3VwczsKLQotICAgIFB5X1hJTkNSRUYoZ3JvdXBpbmRleCk7Ci0gICAgc2VsZi0+Z3JvdXBpbmRleCA9IGdyb3VwaW5kZXg7Ci0KLSAgICBQeV9YSU5DUkVGKGluZGV4Z3JvdXApOwotICAgIHNlbGYtPmluZGV4Z3JvdXAgPSBpbmRleGdyb3VwOwotCi0gICAgc2VsZi0+d2Vha3JlZmxpc3QgPSBOVUxMOwotCi0gICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7Ci19CitzdGF0aWMgUHlPYmplY3QqcGF0dGVybl9uZXdfbWF0Y2goUGF0dGVybk9iamVjdCosIFNSRV9TVEFURSosIGludCk7CitzdGF0aWMgUHlPYmplY3QqcGF0dGVybl9zY2FubmVyKFBhdHRlcm5PYmplY3QqLCBQeU9iamVjdCopOwogCiBzdGF0aWMgUHlPYmplY3QgKgogc3JlX2NvZGVzaXplKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKQEAgLTE5MDAsOTggKzE4MzYsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIFB5T2JqZWN0KgotcGF0dGVybl9uZXdfbWF0Y2goUGF0dGVybk9iamVjdCogcGF0dGVybiwgU1JFX1NUQVRFKiBzdGF0ZSwgaW50IHN0YXR1cykKLXsKLSAgICAvKiBjcmVhdGUgbWF0Y2ggb2JqZWN0IChmcm9tIHN0YXRlIG9iamVjdCkgKi8KLQotICAgIE1hdGNoT2JqZWN0KiBtYXRjaDsKLSAgICBpbnQgaSwgajsKLSAgICBjaGFyKiBiYXNlOwotICAgIGludCBuOwotCi0gICAgaWYgKHN0YXR1cyA+IDApIHsKLQotICAgICAgICAvKiBjcmVhdGUgbWF0Y2ggb2JqZWN0ICh3aXRoIHJvb20gZm9yIGV4dHJhIGdyb3VwIG1hcmtzKSAqLwotICAgICAgICBtYXRjaCA9IFB5T2JqZWN0X05FV19WQVIoTWF0Y2hPYmplY3QsICZNYXRjaF9UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMioocGF0dGVybi0+Z3JvdXBzKzEpKTsKLSAgICAgICAgaWYgKCFtYXRjaCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICAgIFB5X0lOQ1JFRihwYXR0ZXJuKTsKLSAgICAgICAgbWF0Y2gtPnBhdHRlcm4gPSBwYXR0ZXJuOwotCi0gICAgICAgIFB5X0lOQ1JFRihzdGF0ZS0+c3RyaW5nKTsKLSAgICAgICAgbWF0Y2gtPnN0cmluZyA9IHN0YXRlLT5zdHJpbmc7Ci0KLSAgICAgICAgbWF0Y2gtPnJlZ3MgPSBOVUxMOwotICAgICAgICBtYXRjaC0+Z3JvdXBzID0gcGF0dGVybi0+Z3JvdXBzKzE7Ci0KLSAgICAgICAgLyogZmlsbCBpbiBncm91cCBzbGljZXMgKi8KLQotICAgICAgICBiYXNlID0gKGNoYXIqKSBzdGF0ZS0+YmVnaW5uaW5nOwotICAgICAgICBuID0gc3RhdGUtPmNoYXJzaXplOwotCi0gICAgICAgIG1hdGNoLT5tYXJrWzBdID0gKChjaGFyKikgc3RhdGUtPnN0YXJ0IC0gYmFzZSkgLyBuOwotICAgICAgICBtYXRjaC0+bWFya1sxXSA9ICgoY2hhciopIHN0YXRlLT5wdHIgLSBiYXNlKSAvIG47Ci0KLSAgICAgICAgZm9yIChpID0gaiA9IDA7IGkgPCBwYXR0ZXJuLT5ncm91cHM7IGkrKywgais9MikKLSAgICAgICAgICAgIGlmIChqKzEgPD0gc3RhdGUtPmxhc3RtYXJrICYmIHN0YXRlLT5tYXJrW2pdICYmIHN0YXRlLT5tYXJrW2orMV0pIHsKLSAgICAgICAgICAgICAgICBtYXRjaC0+bWFya1tqKzJdID0gKChjaGFyKikgc3RhdGUtPm1hcmtbal0gLSBiYXNlKSAvIG47Ci0gICAgICAgICAgICAgICAgbWF0Y2gtPm1hcmtbaiszXSA9ICgoY2hhciopIHN0YXRlLT5tYXJrW2orMV0gLSBiYXNlKSAvIG47Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBtYXRjaC0+bWFya1tqKzJdID0gbWF0Y2gtPm1hcmtbaiszXSA9IC0xOyAvKiB1bmRlZmluZWQgKi8KLQotICAgICAgICBtYXRjaC0+cG9zID0gc3RhdGUtPnBvczsKLSAgICAgICAgbWF0Y2gtPmVuZHBvcyA9IHN0YXRlLT5lbmRwb3M7Ci0KLSAgICAgICAgbWF0Y2gtPmxhc3RpbmRleCA9IHN0YXRlLT5sYXN0aW5kZXg7Ci0KLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIG1hdGNoOwotCi0gICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gMCkgewotCi0gICAgICAgIC8qIG5vIG1hdGNoICovCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7Ci0KLSAgICB9Ci0KLSAgICAvKiBpbnRlcm5hbCBlcnJvciAqLwotICAgIHBhdHRlcm5fZXJyb3Ioc3RhdHVzKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIFB5T2JqZWN0KgotcGF0dGVybl9zY2FubmVyKFBhdHRlcm5PYmplY3QqIHBhdHRlcm4sIFB5T2JqZWN0KiBhcmdzKQotewotICAgIC8qIGNyZWF0ZSBzZWFyY2ggc3RhdGUgb2JqZWN0ICovCi0KLSAgICBTY2FubmVyT2JqZWN0KiBzZWxmOwotCi0gICAgUHlPYmplY3QqIHN0cmluZzsKLSAgICBpbnQgc3RhcnQgPSAwOwotICAgIGludCBlbmQgPSBJTlRfTUFYOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpaTpzY2FubmVyIiwgJnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBjcmVhdGUgc2Nhbm5lciBvYmplY3QgKi8KLSAgICBzZWxmID0gUHlPYmplY3RfTkVXKFNjYW5uZXJPYmplY3QsICZTY2FubmVyX1R5cGUpOwotICAgIGlmICghc2VsZikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBzdHJpbmcgPSBzdGF0ZV9pbml0KCZzZWxmLT5zdGF0ZSwgcGF0dGVybiwgc3RyaW5nLCBzdGFydCwgZW5kKTsKLSAgICBpZiAoIXN0cmluZykgewotICAgICAgICBQeU9iamVjdF9ERUwoc2VsZik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFB5X0lOQ1JFRihwYXR0ZXJuKTsKLSAgICBzZWxmLT5wYXR0ZXJuID0gKFB5T2JqZWN0KikgcGF0dGVybjsKLQotICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwotfQotCiBzdGF0aWMgdm9pZAogcGF0dGVybl9kZWFsbG9jKFBhdHRlcm5PYmplY3QqIHNlbGYpCiB7CkBAIC0yNDE0LDcgKzIyNTgsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QqCi1wYXR0ZXJuX3N1YngoUGF0dGVybk9iamVjdCogc2VsZiwgUHlPYmplY3QqIHRlbXBsYXRlLCBQeU9iamVjdCogc3RyaW5nLAorcGF0dGVybl9zdWJ4KFBhdHRlcm5PYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBwdGVtcGxhdGUsIFB5T2JqZWN0KiBzdHJpbmcsCiAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgc3VibikKIHsKICAgICBTUkVfU1RBVEUgc3RhdGU7CkBAIC0yNDI5LDIxICsyMjczLDIxIEBACiAgICAgaW50IGksIGIsIGU7CiAgICAgaW50IGZpbHRlcl9pc19jYWxsYWJsZTsKIAotICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKHRlbXBsYXRlKSkgeworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKHB0ZW1wbGF0ZSkpIHsKICAgICAgICAgLyogc3ViL3N1Ym4gdGFrZXMgZWl0aGVyIGEgZnVuY3Rpb24gb3IgYSB0ZW1wbGF0ZSAqLwotICAgICAgICBmaWx0ZXIgPSB0ZW1wbGF0ZTsKKyAgICAgICAgZmlsdGVyID0gcHRlbXBsYXRlOwogICAgICAgICBQeV9JTkNSRUYoZmlsdGVyKTsKICAgICAgICAgZmlsdGVyX2lzX2NhbGxhYmxlID0gMTsKICAgICB9IGVsc2UgewogICAgICAgICAvKiBpZiBub3QgY2FsbGFibGUsIGNoZWNrIGlmIGl0J3MgYSBsaXRlcmFsIHN0cmluZyAqLwogICAgICAgICBpbnQgbGl0ZXJhbDsKLSAgICAgICAgcHRyID0gZ2V0c3RyaW5nKHRlbXBsYXRlLCAmbiwgJmIpOworICAgICAgICBwdHIgPSBnZXRzdHJpbmcocHRlbXBsYXRlLCAmbiwgJmIpOwogICAgICAgICBpZiAocHRyKSB7CiAgICAgICAgICAgICBpZiAoYiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbGl0ZXJhbCA9IHNyZV9saXRlcmFsX3RlbXBsYXRlKHB0ciwgbik7CisJCSAgICBsaXRlcmFsID0gc3JlX2xpdGVyYWxfdGVtcGxhdGUoKHVuc2lnbmVkIGNoYXIgKilwdHIsIG4pOwogICAgICAgICAgICAgfSBlbHNlIHsKICNpZiBkZWZpbmVkKEhBVkVfVU5JQ09ERSkKLSAgICAgICAgICAgICAgICBsaXRlcmFsID0gc3JlX3VsaXRlcmFsX3RlbXBsYXRlKHB0ciwgbik7CisJCSAgICBsaXRlcmFsID0gc3JlX3VsaXRlcmFsX3RlbXBsYXRlKChQeV9VTklDT0RFICopcHRyLCBuKTsKICNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewpAQCAtMjQ1MSwxNCArMjI5NSwxNCBAQAogICAgICAgICAgICAgbGl0ZXJhbCA9IDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxpdGVyYWwpIHsKLSAgICAgICAgICAgIGZpbHRlciA9IHRlbXBsYXRlOworICAgICAgICAgICAgZmlsdGVyID0gcHRlbXBsYXRlOwogICAgICAgICAgICAgUHlfSU5DUkVGKGZpbHRlcik7CiAgICAgICAgICAgICBmaWx0ZXJfaXNfY2FsbGFibGUgPSAwOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogbm90IGEgbGl0ZXJhbDsgaGFuZCBpdCBvdmVyIHRvIHRoZSB0ZW1wbGF0ZSBjb21waWxlciAqLwogICAgICAgICAgICAgZmlsdGVyID0gY2FsbCgKICAgICAgICAgICAgICAgICBTUkVfUFlfTU9EVUxFLCAiX3N1YngiLAotICAgICAgICAgICAgICAgIFB5VHVwbGVfUGFjaygyLCBzZWxmLCB0ZW1wbGF0ZSkKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1BhY2soMiwgc2VsZiwgcHRlbXBsYXRlKQogICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBpZiAoIWZpbHRlcikKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI1OTcsMjkgKzI0NDEsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHBhdHRlcm5fc3ViKFBhdHRlcm5PYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3cpCiB7Ci0gICAgUHlPYmplY3QqIHRlbXBsYXRlOworICAgIFB5T2JqZWN0KiBwdGVtcGxhdGU7CiAgICAgUHlPYmplY3QqIHN0cmluZzsKICAgICBpbnQgY291bnQgPSAwOwogICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInJlcGwiLCAic3RyaW5nIiwgImNvdW50IiwgTlVMTCB9OwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098aTpzdWIiLCBrd2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBsYXRlLCAmc3RyaW5nLCAmY291bnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdGVtcGxhdGUsICZzdHJpbmcsICZjb3VudCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgcmV0dXJuIHBhdHRlcm5fc3VieChzZWxmLCB0ZW1wbGF0ZSwgc3RyaW5nLCBjb3VudCwgMCk7CisgICAgcmV0dXJuIHBhdHRlcm5fc3VieChzZWxmLCBwdGVtcGxhdGUsIHN0cmluZywgY291bnQsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwYXR0ZXJuX3N1Ym4oUGF0dGVybk9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrdykKIHsKLSAgICBQeU9iamVjdCogdGVtcGxhdGU7CisgICAgUHlPYmplY3QqIHB0ZW1wbGF0ZTsKICAgICBQeU9iamVjdCogc3RyaW5nOwogICAgIGludCBjb3VudCA9IDA7CiAgICAgc3RhdGljIGNoYXIqIGt3bGlzdFtdID0geyAicmVwbCIsICJzdHJpbmciLCAiY291bnQiLCBOVUxMIH07CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPT3xpOnN1Ym4iLCBrd2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBsYXRlLCAmc3RyaW5nLCAmY291bnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdGVtcGxhdGUsICZzdHJpbmcsICZjb3VudCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgcmV0dXJuIHBhdHRlcm5fc3VieChzZWxmLCB0ZW1wbGF0ZSwgc3RyaW5nLCBjb3VudCwgMSk7CisgICAgcmV0dXJuIHBhdHRlcm5fc3VieChzZWxmLCBwdGVtcGxhdGUsIHN0cmluZywgY291bnQsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCkBAIC0yNzk5LDYgKzI2NDMsNjggQEAKICAgICBvZmZzZXRvZihQYXR0ZXJuT2JqZWN0LCB3ZWFrcmVmbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiB9OwogCitzdGF0aWMgUHlPYmplY3QgKgorX2NvbXBpbGUoUHlPYmplY3QqIHNlbGZfLCBQeU9iamVjdCogYXJncykKK3sKKyAgICAvKiAiY29tcGlsZSIgcGF0dGVybiBkZXNjcmlwdG9yIHRvIHBhdHRlcm4gb2JqZWN0ICovCisKKyAgICBQYXR0ZXJuT2JqZWN0KiBzZWxmOworICAgIGludCBpLCBuOworCisgICAgUHlPYmplY3QqIHBhdHRlcm47CisgICAgaW50IGZsYWdzID0gMDsKKyAgICBQeU9iamVjdCogY29kZTsKKyAgICBpbnQgZ3JvdXBzID0gMDsKKyAgICBQeU9iamVjdCogZ3JvdXBpbmRleCA9IE5VTEw7CisgICAgUHlPYmplY3QqIGluZGV4Z3JvdXAgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2lPIXxpT08iLCAmcGF0dGVybiwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlMaXN0X1R5cGUsICZjb2RlLCAmZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JvdXBpbmRleCwgJmluZGV4Z3JvdXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoY29kZSk7CisKKyAgICBzZWxmID0gUHlPYmplY3RfTkVXX1ZBUihQYXR0ZXJuT2JqZWN0LCAmUGF0dGVybl9UeXBlLCBuKTsKKyAgICBpZiAoIXNlbGYpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc2VsZi0+Y29kZXNpemUgPSBuOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqbyA9IFB5TGlzdF9HRVRfSVRFTShjb2RlLCBpKTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IFB5SW50X0NoZWNrKG8pID8gKHVuc2lnbmVkIGxvbmcpUHlJbnRfQXNMb25nKG8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQeUxvbmdfQXNVbnNpZ25lZExvbmcobyk7CisgICAgICAgIHNlbGYtPmNvZGVbaV0gPSAoU1JFX0NPREUpIHZhbHVlOworICAgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHNlbGYtPmNvZGVbaV0gIT0gdmFsdWUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWd1bGFyIGV4cHJlc3Npb24gY29kZSBzaXplIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKHBhdHRlcm4pOworICAgIHNlbGYtPnBhdHRlcm4gPSBwYXR0ZXJuOworCisgICAgc2VsZi0+ZmxhZ3MgPSBmbGFnczsKKworICAgIHNlbGYtPmdyb3VwcyA9IGdyb3VwczsKKworICAgIFB5X1hJTkNSRUYoZ3JvdXBpbmRleCk7CisgICAgc2VsZi0+Z3JvdXBpbmRleCA9IGdyb3VwaW5kZXg7CisKKyAgICBQeV9YSU5DUkVGKGluZGV4Z3JvdXApOworICAgIHNlbGYtPmluZGV4Z3JvdXAgPSBpbmRleGdyb3VwOworCisgICAgc2VsZi0+d2Vha3JlZmxpc3QgPSBOVUxMOworCisgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7Cit9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBtYXRjaCBtZXRob2RzICovCiAKQEAgLTI4NjgsMTQgKzI3NzQsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCoKIG1hdGNoX2V4cGFuZChNYXRjaE9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0gICAgUHlPYmplY3QqIHRlbXBsYXRlOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpleHBhbmQiLCAmdGVtcGxhdGUpKQorICAgIFB5T2JqZWN0KiBwdGVtcGxhdGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOmV4cGFuZCIsICZwdGVtcGxhdGUpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIGRlbGVnYXRlIHRvIFB5dGhvbiBjb2RlICovCiAgICAgcmV0dXJuIGNhbGwoCiAgICAgICAgIFNSRV9QWV9NT0RVTEUsICJfZXhwYW5kIiwKLSAgICAgICAgUHlUdXBsZV9QYWNrKDMsIHNlbGYtPnBhdHRlcm4sIHNlbGYsIHRlbXBsYXRlKQorICAgICAgICBQeVR1cGxlX1BhY2soMywgc2VsZi0+cGF0dGVybiwgc2VsZiwgcHRlbXBsYXRlKQogICAgICAgICApOwogfQogCkBAIC0zMjYyLDYgKzMxNjgsNjkgQEAKICAgICAoZ2V0YXR0cmZ1bmMpbWF0Y2hfZ2V0YXR0ciAvKnRwX2dldGF0dHIqLwogfTsKIAorc3RhdGljIFB5T2JqZWN0KgorcGF0dGVybl9uZXdfbWF0Y2goUGF0dGVybk9iamVjdCogcGF0dGVybiwgU1JFX1NUQVRFKiBzdGF0ZSwgaW50IHN0YXR1cykKK3sKKyAgICAvKiBjcmVhdGUgbWF0Y2ggb2JqZWN0IChmcm9tIHN0YXRlIG9iamVjdCkgKi8KKworICAgIE1hdGNoT2JqZWN0KiBtYXRjaDsKKyAgICBpbnQgaSwgajsKKyAgICBjaGFyKiBiYXNlOworICAgIGludCBuOworCisgICAgaWYgKHN0YXR1cyA+IDApIHsKKworICAgICAgICAvKiBjcmVhdGUgbWF0Y2ggb2JqZWN0ICh3aXRoIHJvb20gZm9yIGV4dHJhIGdyb3VwIG1hcmtzKSAqLworICAgICAgICBtYXRjaCA9IFB5T2JqZWN0X05FV19WQVIoTWF0Y2hPYmplY3QsICZNYXRjaF9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMioocGF0dGVybi0+Z3JvdXBzKzEpKTsKKyAgICAgICAgaWYgKCFtYXRjaCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIFB5X0lOQ1JFRihwYXR0ZXJuKTsKKyAgICAgICAgbWF0Y2gtPnBhdHRlcm4gPSBwYXR0ZXJuOworCisgICAgICAgIFB5X0lOQ1JFRihzdGF0ZS0+c3RyaW5nKTsKKyAgICAgICAgbWF0Y2gtPnN0cmluZyA9IHN0YXRlLT5zdHJpbmc7CisKKyAgICAgICAgbWF0Y2gtPnJlZ3MgPSBOVUxMOworICAgICAgICBtYXRjaC0+Z3JvdXBzID0gcGF0dGVybi0+Z3JvdXBzKzE7CisKKyAgICAgICAgLyogZmlsbCBpbiBncm91cCBzbGljZXMgKi8KKworICAgICAgICBiYXNlID0gKGNoYXIqKSBzdGF0ZS0+YmVnaW5uaW5nOworICAgICAgICBuID0gc3RhdGUtPmNoYXJzaXplOworCisgICAgICAgIG1hdGNoLT5tYXJrWzBdID0gKChjaGFyKikgc3RhdGUtPnN0YXJ0IC0gYmFzZSkgLyBuOworICAgICAgICBtYXRjaC0+bWFya1sxXSA9ICgoY2hhciopIHN0YXRlLT5wdHIgLSBiYXNlKSAvIG47CisKKyAgICAgICAgZm9yIChpID0gaiA9IDA7IGkgPCBwYXR0ZXJuLT5ncm91cHM7IGkrKywgais9MikKKyAgICAgICAgICAgIGlmIChqKzEgPD0gc3RhdGUtPmxhc3RtYXJrICYmIHN0YXRlLT5tYXJrW2pdICYmIHN0YXRlLT5tYXJrW2orMV0pIHsKKyAgICAgICAgICAgICAgICBtYXRjaC0+bWFya1tqKzJdID0gKChjaGFyKikgc3RhdGUtPm1hcmtbal0gLSBiYXNlKSAvIG47CisgICAgICAgICAgICAgICAgbWF0Y2gtPm1hcmtbaiszXSA9ICgoY2hhciopIHN0YXRlLT5tYXJrW2orMV0gLSBiYXNlKSAvIG47CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBtYXRjaC0+bWFya1tqKzJdID0gbWF0Y2gtPm1hcmtbaiszXSA9IC0xOyAvKiB1bmRlZmluZWQgKi8KKworICAgICAgICBtYXRjaC0+cG9zID0gc3RhdGUtPnBvczsKKyAgICAgICAgbWF0Y2gtPmVuZHBvcyA9IHN0YXRlLT5lbmRwb3M7CisKKyAgICAgICAgbWF0Y2gtPmxhc3RpbmRleCA9IHN0YXRlLT5sYXN0aW5kZXg7CisKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIG1hdGNoOworCisgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gMCkgeworCisgICAgICAgIC8qIG5vIG1hdGNoICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisKKyAgICB9CisKKyAgICAvKiBpbnRlcm5hbCBlcnJvciAqLworICAgIHBhdHRlcm5fZXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogc2Nhbm5lciBtZXRob2RzIChleHBlcmltZW50YWwpICovCiAKQEAgLTMzNzIsNiArMzM0MSwzNiBAQAogICAgIChnZXRhdHRyZnVuYylzY2FubmVyX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCiB9OwogCitzdGF0aWMgUHlPYmplY3QqCitwYXR0ZXJuX3NjYW5uZXIoUGF0dGVybk9iamVjdCogcGF0dGVybiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgLyogY3JlYXRlIHNlYXJjaCBzdGF0ZSBvYmplY3QgKi8KKworICAgIFNjYW5uZXJPYmplY3QqIHNlbGY7CisKKyAgICBQeU9iamVjdCogc3RyaW5nOworICAgIGludCBzdGFydCA9IDA7CisgICAgaW50IGVuZCA9IElOVF9NQVg7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGlpOnNjYW5uZXIiLCAmc3RyaW5nLCAmc3RhcnQsICZlbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIGNyZWF0ZSBzY2FubmVyIG9iamVjdCAqLworICAgIHNlbGYgPSBQeU9iamVjdF9ORVcoU2Nhbm5lck9iamVjdCwgJlNjYW5uZXJfVHlwZSk7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHN0cmluZyA9IHN0YXRlX2luaXQoJnNlbGYtPnN0YXRlLCBwYXR0ZXJuLCBzdHJpbmcsIHN0YXJ0LCBlbmQpOworICAgIGlmICghc3RyaW5nKSB7CisgICAgICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKHBhdHRlcm4pOworICAgIHNlbGYtPnBhdHRlcm4gPSAoUHlPYmplY3QqKSBwYXR0ZXJuOworCisgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7Cit9CisKIHN0YXRpYyBQeU1ldGhvZERlZiBfZnVuY3Rpb25zW10gPSB7CiAgICAgeyJjb21waWxlIiwgX2NvbXBpbGUsIE1FVEhfVkFSQVJHU30sCiAgICAgeyJnZXRjb2Rlc2l6ZSIsIHNyZV9jb2Rlc2l6ZSwgTUVUSF9WQVJBUkdTfSwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NzbC5jIGIvTW9kdWxlcy9fc3NsLmMKaW5kZXggNWY1NDFmNS4uNGMwZGE2ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3NsLmMKKysrIGIvTW9kdWxlcy9fc3NsLmMKQEAgLTU1LDcgKzU1LDYgQEAKIAlTU0xfQ1RYKiAJY3R4OwogCVNTTCogICAgIAlzc2w7CiAJWDUwOSogICAgCXNlcnZlcl9jZXJ0OwotCUJJTyoJCXNiaW87CiAJY2hhciAgICAJc2VydmVyW1g1MDlfTkFNRV9NQVhMRU5dOwogCWNoYXIJCWlzc3VlcltYNTA5X05BTUVfTUFYTEVOXTsKIApAQCAtNDc0LDE1ICs0NzMsMjIgQEAKIAogCWlmICghKGJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIGxlbikpKQogCQlyZXR1cm4gTlVMTDsKKwkKKwkvKiBmaXJzdCBjaGVjayBpZiB0aGVyZSBhcmUgYnl0ZXMgcmVhZHkgdG8gYmUgcmVhZCAqLworCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwljb3VudCA9IFNTTF9wZW5kaW5nKHNlbGYtPnNzbCk7CisJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCXNvY2tzdGF0ZSA9IGNoZWNrX3NvY2tldF9hbmRfd2FpdF9mb3JfdGltZW91dChzZWxmLT5Tb2NrZXQsIDApOwotCWlmIChzb2Nrc3RhdGUgPT0gU09DS0VUX0hBU19USU1FRF9PVVQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5U1NMRXJyb3JPYmplY3QsICJUaGUgcmVhZCBvcGVyYXRpb24gdGltZWQgb3V0Iik7Ci0JCVB5X0RFQ1JFRihidWYpOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgaWYgKHNvY2tzdGF0ZSA9PSBTT0NLRVRfVE9PX0xBUkdFX0ZPUl9TRUxFQ1QpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5U1NMRXJyb3JPYmplY3QsICJVbmRlcmx5aW5nIHNvY2tldCB0b28gbGFyZ2UgZm9yIHNlbGVjdCgpLiIpOwotCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWNvdW50KSB7CisJCXNvY2tzdGF0ZSA9IGNoZWNrX3NvY2tldF9hbmRfd2FpdF9mb3JfdGltZW91dChzZWxmLT5Tb2NrZXQsIDApOworCQlpZiAoc29ja3N0YXRlID09IFNPQ0tFVF9IQVNfVElNRURfT1VUKSB7CisJCQlQeUVycl9TZXRTdHJpbmcoUHlTU0xFcnJvck9iamVjdCwgIlRoZSByZWFkIG9wZXJhdGlvbiB0aW1lZCBvdXQiKTsKKwkJCVB5X0RFQ1JFRihidWYpOworCQkJcmV0dXJuIE5VTEw7CisJCX0gZWxzZSBpZiAoc29ja3N0YXRlID09IFNPQ0tFVF9UT09fTEFSR0VfRk9SX1NFTEVDVCkgeworCQkJUHlFcnJfU2V0U3RyaW5nKFB5U1NMRXJyb3JPYmplY3QsICJVbmRlcmx5aW5nIHNvY2tldCB0b28gbGFyZ2UgZm9yIHNlbGVjdCgpLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAl9CiAJZG8gewogCQllcnIgPSAwOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYyBiL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKaW5kZXggNmQ4ZWEzYy4uZTg4ODFkYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYworKysgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaWZkZWYgV0lUSF9USFJFQUQKICNpbmNsdWRlICJweXRocmVhZC5oIgogI2VuZGlmIC8qIFdJVEhfVEhSRUFEICovCi0KIHN0YXRpYyBQeU9iamVjdCAqVGVzdEVycm9yOwkvKiBzZXQgdG8gZXhjZXB0aW9uIG9iamVjdCBpbiBpbml0ICovCiAKIC8qIFJhaXNlIFRlc3RFcnJvciB3aXRoIHRlc3RfbmFtZSArICI6ICIgKyBtc2csIGFuZCByZXR1cm4gTlVMTC4gKi8KQEAgLTIzNSw3ICsyMzQsNyBAQAogI2luY2x1ZGUgInRlc3RjYXBpX2xvbmcuaCIKIAogc3RhdGljIFB5T2JqZWN0ICoKLXRlc3RfbG9uZ2xvbmdfYXBpKFB5T2JqZWN0KiBzZWxmKQordGVzdF9sb25nbG9uZ19hcGkoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCXJldHVybiBURVNUTkFNRShyYWlzZV90ZXN0X2xvbmdsb25nX2Vycm9yKTsKIH0KQEAgLTM2MSw2ICszNjAsMTUgQEAKIAlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKHZhbHVlKTsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK2dldGFyZ3NfbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJUHlfc3NpemVfdCB2YWx1ZTsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm4iLCAmdmFsdWUpKQorCXJldHVybiBOVUxMOworCXJldHVybiBQeUludF9Gcm9tU3NpemVfdCh2YWx1ZSk7Cit9CisKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfTChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCkBAIC00MDUsNyArNDEzLDcgQEAKIAogICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOwogCi0gICAgICAgIHZhbHVlID0gLTE7CisgICAgICAgIHZhbHVlID0gMDsKICAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJrOnRlc3Rfa19jb2RlIiwgJnZhbHVlKSA8IDApCiAgICAgICAgIAlyZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKHZhbHVlICE9IFVMT05HX01BWCkKQEAgLTQyNCw3ICs0MzIsNyBAQAogCiAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CiAKLQl2YWx1ZSA9IC0xOworCXZhbHVlID0gMDsKICAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJrOnRlc3Rfa19jb2RlIiwgJnZhbHVlKSA8IDApCiAgICAgICAgIAlyZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKHZhbHVlICE9ICh1bnNpZ25lZCBsb25nKS0weDQyKQpAQCAtNDc4LDYgKzQ4NiwyNiBAQAogCXJldHVybiBQeV9Ob25lOwogfQogCitzdGF0aWMKK1B5T2JqZWN0ICpjb2RlY19pbmNyZW1lbnRhbGVuY29kZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWNvbnN0IGNoYXIgKmVuY29kaW5nLCAqZXJyb3JzID0gTlVMTDsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp0ZXN0X2luY3JlbWVudGFsZW5jb2RlciIsCisJCQkgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXIoZW5jb2RpbmcsIGVycm9ycyk7Cit9CisKK3N0YXRpYworUHlPYmplY3QgKmNvZGVjX2luY3JlbWVudGFsZGVjb2RlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJY29uc3QgY2hhciAqZW5jb2RpbmcsICplcnJvcnMgPSBOVUxMOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOnRlc3RfaW5jcmVtZW50YWxkZWNvZGVyIiwKKwkJCSAgICAgICZlbmNvZGluZywgJmVycm9ycykpCisJCXJldHVybiBOVUxMOworCXJldHVybiBQeUNvZGVjX0luY3JlbWVudGFsRGVjb2RlcihlbmNvZGluZywgZXJyb3JzKTsKK30KKwogI2VuZGlmCiAKIC8qIFNpbXBsZSB0ZXN0IG9mIF9QeUxvbmdfTnVtQml0cyBhbmQgX1B5TG9uZ19TaWduLiAqLwpAQCAtNTYzLDcgKzU5MSwxNyBAQAogCiAjaWZkZWYgV0lUSF9USFJFQUQKIAotdm9pZCBfbWFrZV9jYWxsKHZvaWQgKmNhbGxhYmxlKQorLyogdGVzdF90aHJlYWRfc3RhdGUgc3Bhd25zIGEgdGhyZWFkIG9mIGl0cyBvd24sIGFuZCB0aGF0IHRocmVhZCByZWxlYXNlcworICogYHRocmVhZF9kb25lYCB3aGVuIGl0J3MgZmluaXNoZWQuICBUaGUgZHJpdmVyIGNvZGUgaGFzIHRvIGtub3cgd2hlbiB0aGUKKyAqIHRocmVhZCBmaW5pc2hlcywgYmVjYXVzZSB0aGUgdGhyZWFkIHVzZXMgYSBQeU9iamVjdCAodGhlIGNhbGxhYmxlKSB0aGF0CisgKiBtYXkgZ28gYXdheSB3aGVuIHRoZSBkcml2ZXIgZmluaXNoZXMuICBUaGUgZm9ybWVyIGxhY2sgb2YgdGhpcyBleHBsaWNpdAorICogc3luY2hyb25pemF0aW9uIGNhdXNlZCByYXJlIHNlZ2ZhdWx0cywgc28gcmFyZSB0aGF0IHRoZXkgd2VyZSBzZWVuIG9ubHkKKyAqIG9uIGEgTWFjIGJ1aWxkYm90IChhbHRob3VnaCB0aGV5IHdlcmUgcG9zc2libGUgb24gYW55IGJveCkuCisgKi8KK3N0YXRpYyBQeVRocmVhZF90eXBlX2xvY2sgdGhyZWFkX2RvbmUgPSBOVUxMOworCitzdGF0aWMgdm9pZAorX21ha2VfY2FsbCh2b2lkICpjYWxsYWJsZSkKIHsKIAlQeU9iamVjdCAqcmM7CiAJUHlHSUxTdGF0ZV9TVEFURSBzID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKQEAgLTU3MiwzMiArNjEwLDUzIEBACiAJUHlHSUxTdGF0ZV9SZWxlYXNlKHMpOwogfQogCisvKiBTYW1lIHRoaW5nLCBidXQgcmVsZWFzZXMgYHRocmVhZF9kb25lYCB3aGVuIGl0IHJldHVybnMuICBUaGlzIHZhcmlhbnQKKyAqIHNob3VsZCBiZSBjYWxsZWQgb25seSBmcm9tIHRocmVhZHMgc3Bhd25lZCBieSB0ZXN0X3RocmVhZF9zdGF0ZSgpLgorICovCitzdGF0aWMgdm9pZAorX21ha2VfY2FsbF9mcm9tX3RocmVhZCh2b2lkICpjYWxsYWJsZSkKK3sKKwlfbWFrZV9jYWxsKGNhbGxhYmxlKTsKKwlQeVRocmVhZF9yZWxlYXNlX2xvY2sodGhyZWFkX2RvbmUpOworfQorCiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF90aHJlYWRfc3RhdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCVB5T2JqZWN0ICpmbjsKKwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzp0ZXN0X3RocmVhZF9zdGF0ZSIsICZmbikpCiAJCXJldHVybiBOVUxMOwotCS8qIEVuc3VyZSBQeXRob24gaXMgc2V0dXAgZm9yIHRocmVhZGluZyAqLworCisJLyogRW5zdXJlIFB5dGhvbiBpcyBzZXQgdXAgZm9yIHRocmVhZGluZyAqLwogCVB5RXZhbF9Jbml0VGhyZWFkcygpOwotCS8qIFN0YXJ0IGEgbmV3IHRocmVhZCBmb3Igb3VyIGNhbGxiYWNrLiAqLwotCVB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoIF9tYWtlX2NhbGwsIGZuKTsKKwl0aHJlYWRfZG9uZSA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKwlpZiAodGhyZWFkX2RvbmUgPT0gTlVMTCkKKwkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRocmVhZF9kb25lLCAxKTsKKworCS8qIFN0YXJ0IGEgbmV3IHRocmVhZCB3aXRoIG91ciBjYWxsYmFjay4gKi8KKwlQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKF9tYWtlX2NhbGxfZnJvbV90aHJlYWQsIGZuKTsKIAkvKiBNYWtlIHRoZSBjYWxsYmFjayB3aXRoIHRoZSB0aHJlYWQgbG9jayBoZWxkIGJ5IHRoaXMgdGhyZWFkICovCiAJX21ha2VfY2FsbChmbik7CiAJLyogRG8gaXQgYWxsIGFnYWluLCBidXQgdGhpcyB0aW1lIHdpdGggdGhlIHRocmVhZC1sb2NrIHJlbGVhc2VkICovCiAJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCV9tYWtlX2NhbGwoZm4pOworCVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0aHJlYWRfZG9uZSwgMSk7ICAvKiB3YWl0IGZvciB0aHJlYWQgdG8gZmluaXNoICovCiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwogCS8qIEFuZCBvbmNlIG1vcmUgd2l0aCBhbmQgd2l0aG91dCBhIHRocmVhZAotCSAgIFhYWCAtIHNob3VsZCB1c2UgYSBsb2NrIGFuZCB3b3JrIG91dCBleGFjdGx5IHdoYXQgd2UgYXJlIHRyeWluZyAKLQkgICB0byB0ZXN0IDx3aW5rPiAKKwkgICBYWFggLSBzaG91bGQgdXNlIGEgbG9jayBhbmQgd29yayBvdXQgZXhhY3RseSB3aGF0IHdlIGFyZSB0cnlpbmcKKwkgICB0byB0ZXN0IDx3aW5rPgogCSovCiAJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCVB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoIF9tYWtlX2NhbGwsIGZuKTsKKwlQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKF9tYWtlX2NhbGxfZnJvbV90aHJlYWQsIGZuKTsKIAlfbWFrZV9jYWxsKGZuKTsKKwlQeVRocmVhZF9hY3F1aXJlX2xvY2sodGhyZWFkX2RvbmUsIDEpOyAgLyogd2FpdCBmb3IgdGhyZWFkIHRvIGZpbmlzaCAqLwogCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworCisJUHlUaHJlYWRfZnJlZV9sb2NrKHRocmVhZF9kb25lKTsKKwlQeV9SRVRVUk5fTk9ORTsKIH0KICNlbmRpZgogCkBAIC02MTEsMjQgKzY3MCwyOSBAQAogCXsidGVzdF9rX2NvZGUiLAkJKFB5Q0Z1bmN0aW9uKXRlc3Rfa19jb2RlLAkgTUVUSF9OT0FSR1N9LAogCXsidGVzdF9udWxsX3N0cmluZ3MiLAkoUHlDRnVuY3Rpb24pdGVzdF9udWxsX3N0cmluZ3MsCSBNRVRIX05PQVJHU30sCiAKLQl7ImdldGFyZ3NfYiIsCQkoUHlDRnVuY3Rpb24pZ2V0YXJnc19iLAkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX0IiLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfQiwJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19IIiwJCShQeUNGdW5jdGlvbilnZXRhcmdzX0gsCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfSSIsCQkoUHlDRnVuY3Rpb24pZ2V0YXJnc19JLAkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX2siLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfaywJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19pIiwJCShQeUNGdW5jdGlvbilnZXRhcmdzX2ksCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfbCIsCQkoUHlDRnVuY3Rpb24pZ2V0YXJnc19sLAkJIE1FVEhfVkFSQVJHU30sCisJeyJnZXRhcmdzX2IiLAkJZ2V0YXJnc19iLAkJCSBNRVRIX1ZBUkFSR1N9LAorCXsiZ2V0YXJnc19CIiwJCWdldGFyZ3NfQiwJCQkgTUVUSF9WQVJBUkdTfSwKKwl7ImdldGFyZ3NfSCIsCQlnZXRhcmdzX0gsCQkJIE1FVEhfVkFSQVJHU30sCisJeyJnZXRhcmdzX0kiLAkJZ2V0YXJnc19JLAkJCSBNRVRIX1ZBUkFSR1N9LAorCXsiZ2V0YXJnc19rIiwJCWdldGFyZ3NfaywJCQkgTUVUSF9WQVJBUkdTfSwKKwl7ImdldGFyZ3NfaSIsCQlnZXRhcmdzX2ksCQkJIE1FVEhfVkFSQVJHU30sCisJeyJnZXRhcmdzX2wiLAkJZ2V0YXJnc19sLAkJCSBNRVRIX1ZBUkFSR1N9LAorCXsiZ2V0YXJnc19uIiwJCWdldGFyZ3NfbiwgCQkJIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQl7ImdldGFyZ3NfTCIsCQkoUHlDRnVuY3Rpb24pZ2V0YXJnc19MLAkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX0siLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfSywJCSBNRVRIX1ZBUkFSR1N9LAotCXsidGVzdF9sb25nbG9uZ19hcGkiLAkoUHlDRnVuY3Rpb24pdGVzdF9sb25nbG9uZ19hcGksCSBNRVRIX05PQVJHU30sCisJeyJnZXRhcmdzX0wiLAkJZ2V0YXJnc19MLAkJCSBNRVRIX1ZBUkFSR1N9LAorCXsiZ2V0YXJnc19LIiwJCWdldGFyZ3NfSywJCQkgTUVUSF9WQVJBUkdTfSwKKwl7InRlc3RfbG9uZ2xvbmdfYXBpIiwJdGVzdF9sb25nbG9uZ19hcGksCQkgTUVUSF9OT0FSR1N9LAogCXsidGVzdF9MX2NvZGUiLAkJKFB5Q0Z1bmN0aW9uKXRlc3RfTF9jb2RlLAkgTUVUSF9OT0FSR1N9LAorCXsiY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyIiwKKwkgKFB5Q0Z1bmN0aW9uKWNvZGVjX2luY3JlbWVudGFsZW5jb2RlciwJIE1FVEhfVkFSQVJHU30sCisJeyJjb2RlY19pbmNyZW1lbnRhbGRlY29kZXIiLAorCSAoUHlDRnVuY3Rpb24pY29kZWNfaW5jcmVtZW50YWxkZWNvZGVyLAkgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIAl7InRlc3RfdV9jb2RlIiwJCShQeUNGdW5jdGlvbil0ZXN0X3VfY29kZSwJIE1FVEhfTk9BUkdTfSwKICNlbmRpZgogI2lmZGVmIFdJVEhfVEhSRUFECi0JeyJfdGVzdF90aHJlYWRfc3RhdGUiLCAoUHlDRnVuY3Rpb24pdGVzdF90aHJlYWRfc3RhdGUsIE1FVEhfVkFSQVJHU30sCisJeyJfdGVzdF90aHJlYWRfc3RhdGUiLCAgdGVzdF90aHJlYWRfc3RhdGUsIAkJIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKIAl7TlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KIH07CkBAIC02NTAsOCArNzE0LDEwIEBACiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVTE9OR19NQVgiLCBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhVTE9OR19NQVgpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIklOVF9NSU4iLCBQeUludF9Gcm9tTG9uZyhJTlRfTUlOKSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMT05HX01JTiIsIFB5SW50X0Zyb21Mb25nKExPTkdfTUlOKSk7CisJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQWV9TU0laRV9UX01JTiIsIFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUlOKSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJTlRfTUFYIiwgUHlJbnRfRnJvbUxvbmcoSU5UX01BWCkpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTE9OR19NQVgiLCBQeUludF9Gcm9tTG9uZyhMT05HX01BWCkpOworCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NQVgiLCBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCkpOwogCiAJVGVzdEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfdGVzdGNhcGkuZXJyb3IiLCBOVUxMLCBOVUxMKTsKIAlQeV9JTkNSRUYoVGVzdEVycm9yKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3RraW50ZXIuYyBiL01vZHVsZXMvX3RraW50ZXIuYwppbmRleCBlOGVmYWE3Li5jMTdiNmM2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190a2ludGVyLmMKKysrIGIvTW9kdWxlcy9fdGtpbnRlci5jCkBAIC02NDcsNyArNjQ3LDcgQEAKIAogCXN0cmNweShhcmd2MCwgY2xhc3NOYW1lKTsKIAlpZiAoaXN1cHBlcihQeV9DSEFSTUFTSyhhcmd2MFswXSkpKQotCQlhcmd2MFswXSA9IHRvbG93ZXIoYXJndjBbMF0pOworCQlhcmd2MFswXSA9IHRvbG93ZXIoUHlfQ0hBUk1BU0soYXJndjBbMF0pKTsKIAlUY2xfU2V0VmFyKHYtPmludGVycCwgImFyZ3YwIiwgYXJndjAsIFRDTF9HTE9CQUxfT05MWSk7CiAJY2tmcmVlKGFyZ3YwKTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hbG1vZHVsZS5jIGIvTW9kdWxlcy9hbG1vZHVsZS5jCmluZGV4IDUyNTRmY2EuLmZiZWIxM2EgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYWxtb2R1bGUuYworKysgYi9Nb2R1bGVzL2FsbW9kdWxlLmMKQEAgLTE0ODIsNyArMTQ4Miw4IEBACiAJfQogCWlmIChhbEdldFBhcmFtcyhyZXNvdXJjZSwgcHZzLCBucHZzKSA8IDApCiAJCWdvdG8gZXJyb3I7Ci0JdiA9IFB5TGlzdF9OZXcobnB2cyk7CisJaWYgKCEodiA9IFB5TGlzdF9OZXcobnB2cykpKQorCQlnb3RvIGVycm9yOwogCWZvciAoaSA9IDA7IGkgPCBucHZzOyBpKyspIHsKIAkJaWYgKHB2c1tpXS5zaXplT3V0IDwgMCkgewogCQkJY2hhciBidWZbMzJdOwpAQCAtMTY5Miw2ICsxNjkzLDcgQEAKIAlpZiAoYWxHZXRQYXJhbUluZm8ocmVzLCBwYXJhbSwgJnBpbmZvKSA8IDApCiAJCXJldHVybiBOVUxMOwogCXYgPSBQeURpY3RfTmV3KCk7CisJaWYgKCF2KSByZXR1cm4gTlVMTDsKIAogCWl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8ucmVzb3VyY2UpOwogCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJyZXNvdXJjZSIsIGl0ZW0pOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCmluZGV4IDE2NTBmZjIuLjUyYTdmNWUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXJyYXltb2R1bGUuYworKysgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKQEAgLTE4Niw3ICsxODYsOCBAQAogCWlmICghUHlBcmdfUGFyc2UodiwgInUjO2FycmF5IGl0ZW0gbXVzdCBiZSB1bmljb2RlIGNoYXJhY3RlciIsICZwLCAmbGVuKSkKIAkJcmV0dXJuIC0xOwogCWlmIChsZW4gIT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJyYXkgaXRlbSBtdXN0IGJlIHVuaWNvZGUgY2hhcmFjdGVyIik7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisJCQkJImFycmF5IGl0ZW0gbXVzdCBiZSB1bmljb2RlIGNoYXJhY3RlciIpOwogCQlyZXR1cm4gLTE7CiAJfQogCWlmIChpID49IDApCkBAIC0xMTYzLDcgKzExNjQsNyBAQAogCXJlZ2lzdGVyIGNoYXIgKnAsICpxOwogCS8qIGxpdHRsZSBidWZmZXIgdG8gaG9sZCBpdGVtcyB3aGlsZSBzd2FwcGluZyAqLwogCWNoYXIgdG1wWzI1Nl07CS8qIDggaXMgcHJvYmFibHkgZW5vdWdoIC0tIGJ1dCB3aHkgc2tpbXAgKi8KLQlhc3NlcnQoaXRlbXNpemUgPD0gc2l6ZW9mKHRtcCkpOworCWFzc2VydCgoc2l6ZV90KWl0ZW1zaXplIDw9IHNpemVvZih0bXApKTsKIAogCWlmIChzZWxmLT5vYl9zaXplID4gMSkgewogCQlmb3IgKHAgPSBzZWxmLT5vYl9pdGVtLApAQCAtMTY3Myw3ICsxNjc0LDggQEAKIAkJCX0KIAogCQkJc2VsZi0+b2Jfc2l6ZSAtPSBzbGljZWxlbmd0aDsKLQkJCXNlbGYtPm9iX2l0ZW0gPSBQeU1lbV9SRUFMTE9DKHNlbGYtPm9iX2l0ZW0sIGl0ZW1zaXplKnNlbGYtPm9iX3NpemUpOworCQkJc2VsZi0+b2JfaXRlbSA9IChjaGFyICopUHlNZW1fUkVBTExPQyhzZWxmLT5vYl9pdGVtLAorCQkJCQkJCSAgICAgIGl0ZW1zaXplKnNlbGYtPm9iX3NpemUpOwogCQkJc2VsZi0+YWxsb2NhdGVkID0gc2VsZi0+b2Jfc2l6ZTsKIAogCQkJcmV0dXJuIDA7CkBAIC0xODY1LDcgKzE4NjcsNyBAQAogCQkJCWlmIChuID4gMCkgewogCQkJCQlhcnJheW9iamVjdCAqc2VsZiA9IChhcnJheW9iamVjdCAqKWE7CiAJCQkJCWNoYXIgKml0ZW0gPSBzZWxmLT5vYl9pdGVtOwotCQkJCQlpdGVtID0gUHlNZW1fUmVhbGxvYyhpdGVtLCBuKTsKKwkJCQkJaXRlbSA9IChjaGFyICopUHlNZW1fUmVhbGxvYyhpdGVtLCBuKTsKIAkJCQkJaWYgKGl0ZW0gPT0gTlVMTCkgewogCQkJCQkJUHlFcnJfTm9NZW1vcnkoKTsKIAkJCQkJCVB5X0RFQ1JFRihhKTsKQEAgLTIwNjAsOCArMjA2Miw3IEBACiBzdGF0aWMgaW50CiBhcnJheWl0ZXJfdHJhdmVyc2UoYXJyYXlpdGVyb2JqZWN0ICppdCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKGl0LT5hbyAhPSBOVUxMKQotCQlyZXR1cm4gdmlzaXQoKFB5T2JqZWN0ICopKGl0LT5hbyksIGFyZyk7CisJUHlfVklTSVQoaXQtPmFvKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hdWRpb29wLmMgYi9Nb2R1bGVzL2F1ZGlvb3AuYwppbmRleCBiZWVhY2QzLi5lZDcwY2RmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2F1ZGlvb3AuYworKysgYi9Nb2R1bGVzL2F1ZGlvb3AuYwpAQCAtMTUsNiArMTUsOCBAQAogI2VuZGlmCiAjZW5kaWYKIAordHlwZWRlZiBzaG9ydCBQeUludDE2OworCiAjaWYgZGVmaW5lZChfX0NIQVJfVU5TSUdORURfXykKICNpZiBkZWZpbmVkKHNpZ25lZCkKIC8qIFRoaXMgbW9kdWxlIGN1cnJlbnRseSBkb2VzIG5vdCB3b3JrIG9uIHN5c3RlbXMgd2hlcmUgb25seSB1bnNpZ25lZApAQCAtMjIsMTIyICsyNCwyNjcgQEAKICNlbmRpZgogI2VuZGlmCiAKLS8qIENvZGUgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gc294LAorLyogQ29kZSBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBzb3gsIDEyLjE3LjcsIGc3MTEuYwogKiogKGMpIENyYWlnIFJlZXNlLCBKb2UgQ2FtcGJlbGwgYW5kIEplZmYgUG9za2FuemVyIDE5ODkgKi8KIAotI2RlZmluZSBNSU5MSU4gLTMyNzY4Ci0jZGVmaW5lIE1BWExJTiAzMjc2NwotI2RlZmluZSBMSU5DTElQKHgpIGRvIHsgaWYgKCB4IDwgTUlOTElOICkgeCA9IE1JTkxJTiA7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB4ID4gTUFYTElOICkgeCA9IE1BWExJTjsgXAotICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgc3RfbGluZWFyX3RvX3VsYXcoaW50IHNhbXBsZSk7Ci0KLS8qCi0qKiBUaGlzIG1hY3JvIGNvbnZlcnRzIGZyb20gdWxhdyB0byAxNiBiaXQgbGluZWFyLCBmYXN0ZXIuCi0qKgotKiogSmVmIFBvc2thbnplcgotKiogMjMgT2N0b2JlciAxOTg5Ci0qKgotKiogSW5wdXQ6IDggYml0IHVsYXcgc2FtcGxlCi0qKiBPdXRwdXQ6IHNpZ25lZCAxNiBiaXQgbGluZWFyIHNhbXBsZQotKi8KLSNkZWZpbmUgc3RfdWxhd190b19saW5lYXIodWxhd2J5dGUpIHVsYXdfdGFibGVbdWxhd2J5dGVdCi0KLXN0YXRpYyBpbnQgdWxhd190YWJsZVsyNTZdID0gewotCS0zMjEyNCwgLTMxMTAwLCAtMzAwNzYsIC0yOTA1MiwgLTI4MDI4LCAtMjcwMDQsIC0yNTk4MCwgLTI0OTU2LAotCS0yMzkzMiwgLTIyOTA4LCAtMjE4ODQsIC0yMDg2MCwgLTE5ODM2LCAtMTg4MTIsIC0xNzc4OCwgLTE2NzY0LAotCS0xNTk5NiwgLTE1NDg0LCAtMTQ5NzIsIC0xNDQ2MCwgLTEzOTQ4LCAtMTM0MzYsIC0xMjkyNCwgLTEyNDEyLAotCS0xMTkwMCwgLTExMzg4LCAtMTA4NzYsIC0xMDM2NCwgIC05ODUyLCAgLTkzNDAsICAtODgyOCwgIC04MzE2LAotCS03OTMyLCAgLTc2NzYsICAtNzQyMCwgIC03MTY0LCAgLTY5MDgsICAtNjY1MiwgIC02Mzk2LCAgLTYxNDAsCi0JLTU4ODQsICAtNTYyOCwgIC01MzcyLCAgLTUxMTYsICAtNDg2MCwgIC00NjA0LCAgLTQzNDgsICAtNDA5MiwKLQktMzkwMCwgIC0zNzcyLCAgLTM2NDQsICAtMzUxNiwgIC0zMzg4LCAgLTMyNjAsICAtMzEzMiwgIC0zMDA0LAotCS0yODc2LCAgLTI3NDgsICAtMjYyMCwgIC0yNDkyLCAgLTIzNjQsICAtMjIzNiwgIC0yMTA4LCAgLTE5ODAsCi0JLTE4ODQsICAtMTgyMCwgIC0xNzU2LCAgLTE2OTIsICAtMTYyOCwgIC0xNTY0LCAgLTE1MDAsICAtMTQzNiwKLQktMTM3MiwgIC0xMzA4LCAgLTEyNDQsICAtMTE4MCwgIC0xMTE2LCAgLTEwNTIsICAgLTk4OCwgICAtOTI0LAotCS04NzYsICAgLTg0NCwgICAtODEyLCAgIC03ODAsICAgLTc0OCwgICAtNzE2LCAgIC02ODQsICAgLTY1MiwKLQktNjIwLCAgIC01ODgsICAgLTU1NiwgICAtNTI0LCAgIC00OTIsICAgLTQ2MCwgICAtNDI4LCAgIC0zOTYsCi0JLTM3MiwgICAtMzU2LCAgIC0zNDAsICAgLTMyNCwgICAtMzA4LCAgIC0yOTIsICAgLTI3NiwgICAtMjYwLAotCS0yNDQsICAgLTIyOCwgICAtMjEyLCAgIC0xOTYsICAgLTE4MCwgICAtMTY0LCAgIC0xNDgsICAgLTEzMiwKLQktMTIwLCAgIC0xMTIsICAgLTEwNCwgICAgLTk2LCAgICAtODgsICAgIC04MCwgICAgLTcyLCAgICAtNjQsCi0JLTU2LCAgICAtNDgsICAgIC00MCwgICAgLTMyLCAgICAtMjQsICAgIC0xNiwgICAgIC04LCAgICAgIDAsCi0JMzIxMjQsICAzMTEwMCwgIDMwMDc2LCAgMjkwNTIsICAyODAyOCwgIDI3MDA0LCAgMjU5ODAsICAyNDk1NiwKLQkyMzkzMiwgIDIyOTA4LCAgMjE4ODQsICAyMDg2MCwgIDE5ODM2LCAgMTg4MTIsICAxNzc4OCwgIDE2NzY0LAotCTE1OTk2LCAgMTU0ODQsICAxNDk3MiwgIDE0NDYwLCAgMTM5NDgsICAxMzQzNiwgIDEyOTI0LCAgMTI0MTIsCi0JMTE5MDAsICAxMTM4OCwgIDEwODc2LCAgMTAzNjQsICAgOTg1MiwgICA5MzQwLCAgIDg4MjgsICAgODMxNiwKLQk3OTMyLCAgIDc2NzYsICAgNzQyMCwgICA3MTY0LCAgIDY5MDgsICAgNjY1MiwgICA2Mzk2LCAgIDYxNDAsCi0JNTg4NCwgICA1NjI4LCAgIDUzNzIsICAgNTExNiwgICA0ODYwLCAgIDQ2MDQsICAgNDM0OCwgICA0MDkyLAotCTM5MDAsICAgMzc3MiwgICAzNjQ0LCAgIDM1MTYsICAgMzM4OCwgICAzMjYwLCAgIDMxMzIsICAgMzAwNCwKLQkyODc2LCAgIDI3NDgsICAgMjYyMCwgICAyNDkyLCAgIDIzNjQsICAgMjIzNiwgICAyMTA4LCAgIDE5ODAsCi0JMTg4NCwgICAxODIwLCAgIDE3NTYsICAgMTY5MiwgICAxNjI4LCAgIDE1NjQsICAgMTUwMCwgICAxNDM2LAotCTEzNzIsICAgMTMwOCwgICAxMjQ0LCAgIDExODAsICAgMTExNiwgICAxMDUyLCAgICA5ODgsICAgIDkyNCwKLQk4NzYsICAgIDg0NCwgICAgODEyLCAgICA3ODAsICAgIDc0OCwgICAgNzE2LCAgICA2ODQsICAgIDY1MiwKLQk2MjAsICAgIDU4OCwgICAgNTU2LCAgICA1MjQsICAgIDQ5MiwgICAgNDYwLCAgICA0MjgsICAgIDM5NiwKLQkzNzIsICAgIDM1NiwgICAgMzQwLCAgICAzMjQsICAgIDMwOCwgICAgMjkyLCAgICAyNzYsICAgIDI2MCwKLQkyNDQsICAgIDIyOCwgICAgMjEyLCAgICAxOTYsICAgIDE4MCwgICAgMTY0LCAgICAxNDgsICAgIDEzMiwKLQkxMjAsICAgIDExMiwgICAgMTA0LCAgICAgOTYsICAgICA4OCwgICAgIDgwLCAgICAgNzIsICAgICA2NCwKLQk1NiwgICAgIDQ4LCAgICAgNDAsICAgICAzMiwgICAgIDI0LCAgICAgMTYsICAgICAgOCwgICAgICAwIH07Ci0KLS8qICNkZWZpbmUgWkVST1RSQVAgKi8gICAvKiB0dXJuIG9uIHRoZSB0cmFwIGFzIHBlciB0aGUgTUlMLVNURCAqLworLyogRnJvbSBnNzExLmM6CisgKgorICogRGVjZW1iZXIgMzAsIDE5OTQ6CisgKiBGdW5jdGlvbnMgbGluZWFyMmFsYXcsIGxpbmVhcjJ1bGF3IGhhdmUgYmVlbiB1cGRhdGVkIHRvIGNvcnJlY3RseQorICogY29udmVydCB1bnF1YW50aXplZCAxNiBiaXQgdmFsdWVzLgorICogVGFibGVzIGZvciBkaXJlY3QgdS0gdG8gQS1sYXcgYW5kIEEtIHRvIHUtbGF3IGNvbnZlcnNpb25zIGhhdmUgYmVlbgorICogY29ycmVjdGVkLgorICogQm9yZ2UgTGluZGJlcmcsIENlbnRlciBmb3IgUGVyc29uS29tbXVuaWthdGlvbiwgQWFsYm9yZyBVbml2ZXJzaXR5LgorICogYmxpQGNway5hdWMuZGsKKyAqCisgKi8KICNkZWZpbmUgQklBUyAweDg0ICAgLyogZGVmaW5lIHRoZSBhZGQtaW4gYmlhcyBmb3IgMTYgYml0IHNhbXBsZXMgKi8KICNkZWZpbmUgQ0xJUCAzMjYzNQorI2RlZmluZSBTSUdOX0JJVCAgICAgICAgKDB4ODApICAgICAgICAgIC8qIFNpZ24gYml0IGZvciBhIEEtbGF3IGJ5dGUuICovCisjZGVmaW5lIFFVQU5UX01BU0sgICAgICAoMHhmKSAgICAgICAgICAgLyogUXVhbnRpemF0aW9uIGZpZWxkIG1hc2suICovCisjZGVmaW5lIFNFR19TSElGVCAgICAgICAoNCkgICAgICAgICAgICAgLyogTGVmdCBzaGlmdCBmb3Igc2VnbWVudCBudW1iZXIuICovCisjZGVmaW5lIFNFR19NQVNLICAgICAgICAoMHg3MCkgICAgICAgICAgLyogU2VnbWVudCBmaWVsZCBtYXNrLiAqLwogCi1zdGF0aWMgdW5zaWduZWQgY2hhcgotc3RfbGluZWFyX3RvX3VsYXcoaW50IHNhbXBsZSkKK3N0YXRpYyBQeUludDE2IHNlZ19hZW5kWzhdID0gezB4MUYsIDB4M0YsIDB4N0YsIDB4RkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGRiwgMHgzRkYsIDB4N0ZGLCAweEZGRn07CitzdGF0aWMgUHlJbnQxNiBzZWdfdWVuZFs4XSA9IHsweDNGLCAweDdGLCAweEZGLCAweDFGRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGLCAweDdGRiwgMHhGRkYsIDB4MUZGRn07CisKK3N0YXRpYyBQeUludDE2CitzZWFyY2goUHlJbnQxNiB2YWwsIFB5SW50MTYgKnRhYmxlLCBpbnQgc2l6ZSkKIHsKLQlzdGF0aWMgaW50IGV4cF9sdXRbMjU2XSA9IHswLDAsMSwxLDIsMiwyLDIsMywzLDMsMywzLDMsMywzLAotCQkJCSAgIDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCi0JCQkJICAgNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSwKLQkJCQkgICA1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LAotCQkJCSAgIDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCi0JCQkJICAgNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLQkJCQkgICA2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAotCQkJCSAgIDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCi0JCQkJICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLQkJCQkgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotCQkJCSAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi0JCQkJICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLQkJCQkgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotCQkJCSAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi0JCQkJICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLQkJCQkgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3fTsKLQlpbnQgc2lnbiwgZXhwb25lbnQsIG1hbnRpc3NhOwotCXVuc2lnbmVkIGNoYXIgdWxhd2J5dGU7CisgICAgICAgIGludCBpOwogCi0JLyogR2V0IHRoZSBzYW1wbGUgaW50byBzaWduLW1hZ25pdHVkZS4gKi8KLQlzaWduID0gKHNhbXBsZSA+PiA4KSAmIDB4ODA7CQkvKiBzZXQgYXNpZGUgdGhlIHNpZ24gKi8KLQlpZiAoIHNpZ24gIT0gMCApIHNhbXBsZSA9IC1zYW1wbGU7CS8qIGdldCBtYWduaXR1ZGUgKi8KLQlpZiAoIHNhbXBsZSA+IENMSVAgKSBzYW1wbGUgPSBDTElQOwkvKiBjbGlwIHRoZSBtYWduaXR1ZGUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh2YWwgPD0gKnRhYmxlKyspCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2l6ZSk7Cit9CisjZGVmaW5lIHN0X3VsYXcybGluZWFyMTYodWMpIChfc3RfdWxhdzJsaW5lYXIxNlt1Y10pCisjZGVmaW5lIHN0X2FsYXcybGluZWFyMTYodWMpIChfc3RfYWxhdzJsaW5lYXIxNlt1Y10pCiAKLQkvKiBDb252ZXJ0IGZyb20gMTYgYml0IGxpbmVhciB0byB1bGF3LiAqLwotCXNhbXBsZSA9IHNhbXBsZSArIEJJQVM7Ci0JZXhwb25lbnQgPSBleHBfbHV0Wyggc2FtcGxlID4+IDcgKSAmIDB4RkZdOwotCW1hbnRpc3NhID0gKCBzYW1wbGUgPj4gKCBleHBvbmVudCArIDMgKSApICYgMHgwRjsKLQl1bGF3Ynl0ZSA9IH4gKCBzaWduIHwgKCBleHBvbmVudCA8PCA0ICkgfCBtYW50aXNzYSApOwotI2lmZGVmIFpFUk9UUkFQCi0JaWYgKCB1bGF3Ynl0ZSA9PSAwICkgdWxhd2J5dGUgPSAweDAyOwkvKiBvcHRpb25hbCBDQ0lUVCB0cmFwICovCi0jZW5kaWYKK3N0YXRpYyBQeUludDE2IF9zdF91bGF3MmxpbmVhcjE2WzI1Nl0gPSB7CisgICAgLTMyMTI0LCAgLTMxMTAwLCAgLTMwMDc2LCAgLTI5MDUyLCAgLTI4MDI4LCAgLTI3MDA0LCAgLTI1OTgwLAorICAgIC0yNDk1NiwgIC0yMzkzMiwgIC0yMjkwOCwgIC0yMTg4NCwgIC0yMDg2MCwgIC0xOTgzNiwgIC0xODgxMiwKKyAgICAtMTc3ODgsICAtMTY3NjQsICAtMTU5OTYsICAtMTU0ODQsICAtMTQ5NzIsICAtMTQ0NjAsICAtMTM5NDgsCisgICAgLTEzNDM2LCAgLTEyOTI0LCAgLTEyNDEyLCAgLTExOTAwLCAgLTExMzg4LCAgLTEwODc2LCAgLTEwMzY0LAorICAgICAtOTg1MiwgICAtOTM0MCwgICAtODgyOCwgICAtODMxNiwgICAtNzkzMiwgICAtNzY3NiwgICAtNzQyMCwKKyAgICAgLTcxNjQsICAgLTY5MDgsICAgLTY2NTIsICAgLTYzOTYsICAgLTYxNDAsICAgLTU4ODQsICAgLTU2MjgsCisgICAgIC01MzcyLCAgIC01MTE2LCAgIC00ODYwLCAgIC00NjA0LCAgIC00MzQ4LCAgIC00MDkyLCAgIC0zOTAwLAorICAgICAtMzc3MiwgICAtMzY0NCwgICAtMzUxNiwgICAtMzM4OCwgICAtMzI2MCwgICAtMzEzMiwgICAtMzAwNCwKKyAgICAgLTI4NzYsICAgLTI3NDgsICAgLTI2MjAsICAgLTI0OTIsICAgLTIzNjQsICAgLTIyMzYsICAgLTIxMDgsCisgICAgIC0xOTgwLCAgIC0xODg0LCAgIC0xODIwLCAgIC0xNzU2LCAgIC0xNjkyLCAgIC0xNjI4LCAgIC0xNTY0LAorICAgICAtMTUwMCwgICAtMTQzNiwgICAtMTM3MiwgICAtMTMwOCwgICAtMTI0NCwgICAtMTE4MCwgICAtMTExNiwKKyAgICAgLTEwNTIsICAgIC05ODgsICAgIC05MjQsICAgIC04NzYsICAgIC04NDQsICAgIC04MTIsICAgIC03ODAsCisgICAgICAtNzQ4LCAgICAtNzE2LCAgICAtNjg0LCAgICAtNjUyLCAgICAtNjIwLCAgICAtNTg4LCAgICAtNTU2LAorICAgICAgLTUyNCwgICAgLTQ5MiwgICAgLTQ2MCwgICAgLTQyOCwgICAgLTM5NiwgICAgLTM3MiwgICAgLTM1NiwKKyAgICAgIC0zNDAsICAgIC0zMjQsICAgIC0zMDgsICAgIC0yOTIsICAgIC0yNzYsICAgIC0yNjAsICAgIC0yNDQsCisgICAgICAtMjI4LCAgICAtMjEyLCAgICAtMTk2LCAgICAtMTgwLCAgICAtMTY0LCAgICAtMTQ4LCAgICAtMTMyLAorICAgICAgLTEyMCwgICAgLTExMiwgICAgLTEwNCwgICAgIC05NiwgICAgIC04OCwgICAgIC04MCwgICAgIC03MiwKKyAgICAgICAtNjQsICAgICAtNTYsICAgICAtNDgsICAgICAtNDAsICAgICAtMzIsICAgICAtMjQsICAgICAtMTYsCisgICAgICAgIC04LCAgICAgICAwLCAgIDMyMTI0LCAgIDMxMTAwLCAgIDMwMDc2LCAgIDI5MDUyLCAgIDI4MDI4LAorICAgICAyNzAwNCwgICAyNTk4MCwgICAyNDk1NiwgICAyMzkzMiwgICAyMjkwOCwgICAyMTg4NCwgICAyMDg2MCwKKyAgICAgMTk4MzYsICAgMTg4MTIsICAgMTc3ODgsICAgMTY3NjQsICAgMTU5OTYsICAgMTU0ODQsICAgMTQ5NzIsCisgICAgIDE0NDYwLCAgIDEzOTQ4LCAgIDEzNDM2LCAgIDEyOTI0LCAgIDEyNDEyLCAgIDExOTAwLCAgIDExMzg4LAorICAgICAxMDg3NiwgICAxMDM2NCwgICAgOTg1MiwgICAgOTM0MCwgICAgODgyOCwgICAgODMxNiwgICAgNzkzMiwKKyAgICAgIDc2NzYsICAgIDc0MjAsICAgIDcxNjQsICAgIDY5MDgsICAgIDY2NTIsICAgIDYzOTYsICAgIDYxNDAsCisgICAgICA1ODg0LCAgICA1NjI4LCAgICA1MzcyLCAgICA1MTE2LCAgICA0ODYwLCAgICA0NjA0LCAgICA0MzQ4LAorICAgICAgNDA5MiwgICAgMzkwMCwgICAgMzc3MiwgICAgMzY0NCwgICAgMzUxNiwgICAgMzM4OCwgICAgMzI2MCwKKyAgICAgIDMxMzIsICAgIDMwMDQsICAgIDI4NzYsICAgIDI3NDgsICAgIDI2MjAsICAgIDI0OTIsICAgIDIzNjQsCisgICAgICAyMjM2LCAgICAyMTA4LCAgICAxOTgwLCAgICAxODg0LCAgICAxODIwLCAgICAxNzU2LCAgICAxNjkyLAorICAgICAgMTYyOCwgICAgMTU2NCwgICAgMTUwMCwgICAgMTQzNiwgICAgMTM3MiwgICAgMTMwOCwgICAgMTI0NCwKKyAgICAgIDExODAsICAgIDExMTYsICAgIDEwNTIsICAgICA5ODgsICAgICA5MjQsICAgICA4NzYsICAgICA4NDQsCisgICAgICAgODEyLCAgICAgNzgwLCAgICAgNzQ4LCAgICAgNzE2LCAgICAgNjg0LCAgICAgNjUyLCAgICAgNjIwLAorICAgICAgIDU4OCwgICAgIDU1NiwgICAgIDUyNCwgICAgIDQ5MiwgICAgIDQ2MCwgICAgIDQyOCwgICAgIDM5NiwKKyAgICAgICAzNzIsICAgICAzNTYsICAgICAzNDAsICAgICAzMjQsICAgICAzMDgsICAgICAyOTIsICAgICAyNzYsCisgICAgICAgMjYwLCAgICAgMjQ0LCAgICAgMjI4LCAgICAgMjEyLCAgICAgMTk2LCAgICAgMTgwLCAgICAgMTY0LAorICAgICAgIDE0OCwgICAgIDEzMiwgICAgIDEyMCwgICAgIDExMiwgICAgIDEwNCwgICAgICA5NiwgICAgICA4OCwKKyAgICAgICAgODAsICAgICAgNzIsICAgICAgNjQsICAgICAgNTYsICAgICAgNDgsICAgICAgNDAsICAgICAgMzIsCisgICAgICAgIDI0LCAgICAgIDE2LCAgICAgICA4LCAgICAgICAwCit9OwogCi0JcmV0dXJuIHVsYXdieXRlOworLyoKKyAqIGxpbmVhcjJ1bGF3KCkgYWNjZXB0cyBhIDE0LWJpdCBzaWduZWQgaW50ZWdlciBhbmQgZW5jb2RlcyBpdCBhcyB1LWxhdyBkYXRhCisgKiBzdG9yZWQgaW4gYSB1bnNpZ25lZCBjaGFyLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgd2l0aAorICogdGhlIGRhdGEgc2hpZnRlZCBzdWNoIHRoYXQgaXQgb25seSBjb250YWlucyBpbmZvcm1hdGlvbiBpbiB0aGUgbG93ZXIKKyAqIDE0LWJpdHMuCisgKgorICogSW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhlIGVuY29kaW5nIHByb2Nlc3MsIHRoZSBvcmlnaW5hbCBsaW5lYXIgbWFnbml0dWRlCisgKiBpcyBiaWFzZWQgYnkgYWRkaW5nIDMzIHdoaWNoIHNoaWZ0cyB0aGUgZW5jb2RpbmcgcmFuZ2UgZnJvbSAoMCAtIDgxNTgpIHRvCisgKiAoMzMgLSA4MTkxKS4gVGhlIHJlc3VsdCBjYW4gYmUgc2VlbiBpbiB0aGUgZm9sbG93aW5nIGVuY29kaW5nIHRhYmxlOgorICoKKyAqICAgICAgQmlhc2VkIExpbmVhciBJbnB1dCBDb2RlICAgICAgICBDb21wcmVzc2VkIENvZGUKKyAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAtLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgMDAwMDAwMDF3eHl6YSAgICAgICAgICAgICAgICAgICAwMDB3eHl6CisgKiAgICAgIDAwMDAwMDF3eHl6YWIgICAgICAgICAgICAgICAgICAgMDAxd3h5egorICogICAgICAwMDAwMDF3eHl6YWJjICAgICAgICAgICAgICAgICAgIDAxMHd4eXoKKyAqICAgICAgMDAwMDF3eHl6YWJjZCAgICAgICAgICAgICAgICAgICAwMTF3eHl6CisgKiAgICAgIDAwMDF3eHl6YWJjZGUgICAgICAgICAgICAgICAgICAgMTAwd3h5egorICogICAgICAwMDF3eHl6YWJjZGVmICAgICAgICAgICAgICAgICAgIDEwMXd4eXoKKyAqICAgICAgMDF3eHl6YWJjZGVmZyAgICAgICAgICAgICAgICAgICAxMTB3eHl6CisgKiAgICAgIDF3eHl6YWJjZGVmZ2ggICAgICAgICAgICAgICAgICAgMTExd3h5egorICoKKyAqIEVhY2ggYmlhc2VkIGxpbmVhciBjb2RlIGhhcyBhIGxlYWRpbmcgMSB3aGljaCBpZGVudGlmaWVzIHRoZSBzZWdtZW50CisgKiBudW1iZXIuIFRoZSB2YWx1ZSBvZiB0aGUgc2VnbWVudCBudW1iZXIgaXMgZXF1YWwgdG8gNyBtaW51cyB0aGUgbnVtYmVyCisgKiBvZiBsZWFkaW5nIDAncy4gVGhlIHF1YW50aXphdGlvbiBpbnRlcnZhbCBpcyBkaXJlY3RseSBhdmFpbGFibGUgYXMgdGhlCisgKiBmb3VyIGJpdHMgd3h5ei4gICogVGhlIHRyYWlsaW5nIGJpdHMgKGEgLSBoKSBhcmUgaWdub3JlZC4KKyAqCisgKiBPcmRpbmFyaWx5IHRoZSBjb21wbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgY29kZSB3b3JkIGlzIHVzZWQgZm9yCisgKiB0cmFuc21pc3Npb24sIGFuZCBzbyB0aGUgY29kZSB3b3JkIGlzIGNvbXBsZW1lbnRlZCBiZWZvcmUgaXQgaXMgcmV0dXJuZWQuCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gc2VlIEpvaG4gQy4gQmVsbGFteSdzIERpZ2l0YWwgVGVsZXBob255LCAxOTgyLAorICogSm9obiBXaWxleSAmIFNvbnMsIHBwcyA5OC0xMTEgYW5kIDQ3Mi00NzYuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitzdF8xNGxpbmVhcjJ1bGF3KFB5SW50MTYgcGNtX3ZhbCkJLyogMidzIGNvbXBsZW1lbnQgKDE0LWJpdCByYW5nZSkgKi8KK3sKKyAgICAgICAgUHlJbnQxNiAgICAgICAgIG1hc2s7CisgICAgICAgIFB5SW50MTYgICAgICAgICBzZWc7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgICB1dmFsOworCisgICAgICAgIC8qIFRoZSBvcmlnaW5hbCBzb3ggY29kZSBkb2VzIHRoaXMgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCBoZXJlICovCisgICAgICAgIHBjbV92YWwgPSBwY21fdmFsID4+IDI7CisKKyAgICAgICAgLyogdS1sYXcgaW52ZXJ0cyBhbGwgYml0cyAqLworICAgICAgICAvKiBHZXQgdGhlIHNpZ24gYW5kIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZhbHVlLiAqLworICAgICAgICBpZiAocGNtX3ZhbCA8IDApIHsKKyAgICAgICAgICAgICAgICBwY21fdmFsID0gLXBjbV92YWw7CisgICAgICAgICAgICAgICAgbWFzayA9IDB4N0Y7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFzayA9IDB4RkY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBwY21fdmFsID4gQ0xJUCApIHBjbV92YWwgPSBDTElQOyAgICAgICAgICAgLyogY2xpcCB0aGUgbWFnbml0dWRlICovCisgICAgICAgIHBjbV92YWwgKz0gKEJJQVMgPj4gMik7CisKKyAgICAgICAgLyogQ29udmVydCB0aGUgc2NhbGVkIG1hZ25pdHVkZSB0byBzZWdtZW50IG51bWJlci4gKi8KKyAgICAgICAgc2VnID0gc2VhcmNoKHBjbV92YWwsIHNlZ191ZW5kLCA4KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb21iaW5lIHRoZSBzaWduLCBzZWdtZW50LCBxdWFudGl6YXRpb24gYml0czsKKyAgICAgICAgICogYW5kIGNvbXBsZW1lbnQgdGhlIGNvZGUgd29yZC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzZWcgPj0gOCkgICAgICAgICAgIC8qIG91dCBvZiByYW5nZSwgcmV0dXJuIG1heGltdW0gdmFsdWUuICovCisgICAgICAgICAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAoMHg3RiBeIG1hc2spOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB1dmFsID0gKHVuc2lnbmVkIGNoYXIpIChzZWcgPDwgNCkgfCAoKHBjbV92YWwgPj4gKHNlZyArIDEpKSAmIDB4Rik7CisgICAgICAgICAgICAgICAgcmV0dXJuICh1dmFsIF4gbWFzayk7CisgICAgICAgIH0KKworfQorCitzdGF0aWMgUHlJbnQxNiBfc3RfYWxhdzJsaW5lYXIxNlsyNTZdID0geworICAgICAtNTUwNCwgICAtNTI0OCwgICAtNjAxNiwgICAtNTc2MCwgICAtNDQ4MCwgICAtNDIyNCwgICAtNDk5MiwKKyAgICAgLTQ3MzYsICAgLTc1NTIsICAgLTcyOTYsICAgLTgwNjQsICAgLTc4MDgsICAgLTY1MjgsICAgLTYyNzIsCisgICAgIC03MDQwLCAgIC02Nzg0LCAgIC0yNzUyLCAgIC0yNjI0LCAgIC0zMDA4LCAgIC0yODgwLCAgIC0yMjQwLAorICAgICAtMjExMiwgICAtMjQ5NiwgICAtMjM2OCwgICAtMzc3NiwgICAtMzY0OCwgICAtNDAzMiwgICAtMzkwNCwKKyAgICAgLTMyNjQsICAgLTMxMzYsICAgLTM1MjAsICAgLTMzOTIsICAtMjIwMTYsICAtMjA5OTIsICAtMjQwNjQsCisgICAgLTIzMDQwLCAgLTE3OTIwLCAgLTE2ODk2LCAgLTE5OTY4LCAgLTE4OTQ0LCAgLTMwMjA4LCAgLTI5MTg0LAorICAgIC0zMjI1NiwgIC0zMTIzMiwgIC0yNjExMiwgIC0yNTA4OCwgIC0yODE2MCwgIC0yNzEzNiwgIC0xMTAwOCwKKyAgICAtMTA0OTYsICAtMTIwMzIsICAtMTE1MjAsICAgLTg5NjAsICAgLTg0NDgsICAgLTk5ODQsICAgLTk0NzIsCisgICAgLTE1MTA0LCAgLTE0NTkyLCAgLTE2MTI4LCAgLTE1NjE2LCAgLTEzMDU2LCAgLTEyNTQ0LCAgLTE0MDgwLAorICAgIC0xMzU2OCwgICAgLTM0NCwgICAgLTMyOCwgICAgLTM3NiwgICAgLTM2MCwgICAgLTI4MCwgICAgLTI2NCwKKyAgICAgIC0zMTIsICAgIC0yOTYsICAgIC00NzIsICAgIC00NTYsICAgIC01MDQsICAgIC00ODgsICAgIC00MDgsCisgICAgICAtMzkyLCAgICAtNDQwLCAgICAtNDI0LCAgICAgLTg4LCAgICAgLTcyLCAgICAtMTIwLCAgICAtMTA0LAorICAgICAgIC0yNCwgICAgICAtOCwgICAgIC01NiwgICAgIC00MCwgICAgLTIxNiwgICAgLTIwMCwgICAgLTI0OCwKKyAgICAgIC0yMzIsICAgIC0xNTIsICAgIC0xMzYsICAgIC0xODQsICAgIC0xNjgsICAgLTEzNzYsICAgLTEzMTIsCisgICAgIC0xNTA0LCAgIC0xNDQwLCAgIC0xMTIwLCAgIC0xMDU2LCAgIC0xMjQ4LCAgIC0xMTg0LCAgIC0xODg4LAorICAgICAtMTgyNCwgICAtMjAxNiwgICAtMTk1MiwgICAtMTYzMiwgICAtMTU2OCwgICAtMTc2MCwgICAtMTY5NiwKKyAgICAgIC02ODgsICAgIC02NTYsICAgIC03NTIsICAgIC03MjAsICAgIC01NjAsICAgIC01MjgsICAgIC02MjQsCisgICAgICAtNTkyLCAgICAtOTQ0LCAgICAtOTEyLCAgIC0xMDA4LCAgICAtOTc2LCAgICAtODE2LCAgICAtNzg0LAorICAgICAgLTg4MCwgICAgLTg0OCwgICAgNTUwNCwgICAgNTI0OCwgICAgNjAxNiwgICAgNTc2MCwgICAgNDQ4MCwKKyAgICAgIDQyMjQsICAgIDQ5OTIsICAgIDQ3MzYsICAgIDc1NTIsICAgIDcyOTYsICAgIDgwNjQsICAgIDc4MDgsCisgICAgICA2NTI4LCAgICA2MjcyLCAgICA3MDQwLCAgICA2Nzg0LCAgICAyNzUyLCAgICAyNjI0LCAgICAzMDA4LAorICAgICAgMjg4MCwgICAgMjI0MCwgICAgMjExMiwgICAgMjQ5NiwgICAgMjM2OCwgICAgMzc3NiwgICAgMzY0OCwKKyAgICAgIDQwMzIsICAgIDM5MDQsICAgIDMyNjQsICAgIDMxMzYsICAgIDM1MjAsICAgIDMzOTIsICAgMjIwMTYsCisgICAgIDIwOTkyLCAgIDI0MDY0LCAgIDIzMDQwLCAgIDE3OTIwLCAgIDE2ODk2LCAgIDE5OTY4LCAgIDE4OTQ0LAorICAgICAzMDIwOCwgICAyOTE4NCwgICAzMjI1NiwgICAzMTIzMiwgICAyNjExMiwgICAyNTA4OCwgICAyODE2MCwKKyAgICAgMjcxMzYsICAgMTEwMDgsICAgMTA0OTYsICAgMTIwMzIsICAgMTE1MjAsICAgIDg5NjAsICAgIDg0NDgsCisgICAgICA5OTg0LCAgICA5NDcyLCAgIDE1MTA0LCAgIDE0NTkyLCAgIDE2MTI4LCAgIDE1NjE2LCAgIDEzMDU2LAorICAgICAxMjU0NCwgICAxNDA4MCwgICAxMzU2OCwgICAgIDM0NCwgICAgIDMyOCwgICAgIDM3NiwgICAgIDM2MCwKKyAgICAgICAyODAsICAgICAyNjQsICAgICAzMTIsICAgICAyOTYsICAgICA0NzIsICAgICA0NTYsICAgICA1MDQsCisgICAgICAgNDg4LCAgICAgNDA4LCAgICAgMzkyLCAgICAgNDQwLCAgICAgNDI0LCAgICAgIDg4LCAgICAgIDcyLAorICAgICAgIDEyMCwgICAgIDEwNCwgICAgICAyNCwgICAgICAgOCwgICAgICA1NiwgICAgICA0MCwgICAgIDIxNiwKKyAgICAgICAyMDAsICAgICAyNDgsICAgICAyMzIsICAgICAxNTIsICAgICAxMzYsICAgICAxODQsICAgICAxNjgsCisgICAgICAxMzc2LCAgICAxMzEyLCAgICAxNTA0LCAgICAxNDQwLCAgICAxMTIwLCAgICAxMDU2LCAgICAxMjQ4LAorICAgICAgMTE4NCwgICAgMTg4OCwgICAgMTgyNCwgICAgMjAxNiwgICAgMTk1MiwgICAgMTYzMiwgICAgMTU2OCwKKyAgICAgIDE3NjAsICAgIDE2OTYsICAgICA2ODgsICAgICA2NTYsICAgICA3NTIsICAgICA3MjAsICAgICA1NjAsCisgICAgICAgNTI4LCAgICAgNjI0LCAgICAgNTkyLCAgICAgOTQ0LCAgICAgOTEyLCAgICAxMDA4LCAgICAgOTc2LAorICAgICAgIDgxNiwgICAgIDc4NCwgICAgIDg4MCwgICAgIDg0OAorfTsKKworLyoKKyAqIGxpbmVhcjJhbGF3KCkgYWNjZXB0cyBhbiAxMy1iaXQgc2lnbmVkIGludGVnZXIgYW5kIGVuY29kZXMgaXQgYXMgQS1sYXcgZGF0YQorICogc3RvcmVkIGluIGEgdW5zaWduZWQgY2hhci4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGgKKyAqIHRoZSBkYXRhIHNoaWZ0ZWQgc3VjaCB0aGF0IGl0IG9ubHkgY29udGFpbnMgaW5mb3JtYXRpb24gaW4gdGhlIGxvd2VyCisgKiAxMy1iaXRzLgorICoKKyAqICAgICAgICAgICAgICBMaW5lYXIgSW5wdXQgQ29kZSAgICAgICBDb21wcmVzc2VkIENvZGUKKyAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAtLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgMDAwMDAwMHd4eXphICAgICAgICAgICAgICAgICAgICAwMDB3eHl6CisgKiAgICAgIDAwMDAwMDF3eHl6YSAgICAgICAgICAgICAgICAgICAgMDAxd3h5egorICogICAgICAwMDAwMDF3eHl6YWIgICAgICAgICAgICAgICAgICAgIDAxMHd4eXoKKyAqICAgICAgMDAwMDF3eHl6YWJjICAgICAgICAgICAgICAgICAgICAwMTF3eHl6CisgKiAgICAgIDAwMDF3eHl6YWJjZCAgICAgICAgICAgICAgICAgICAgMTAwd3h5egorICogICAgICAwMDF3eHl6YWJjZGUgICAgICAgICAgICAgICAgICAgIDEwMXd4eXoKKyAqICAgICAgMDF3eHl6YWJjZGVmICAgICAgICAgICAgICAgICAgICAxMTB3eHl6CisgKiAgICAgIDF3eHl6YWJjZGVmZyAgICAgICAgICAgICAgICAgICAgMTExd3h5egorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSBKb2huIEMuIEJlbGxhbXkncyBEaWdpdGFsIFRlbGVwaG9ueSwgMTk4MiwKKyAqIEpvaG4gV2lsZXkgJiBTb25zLCBwcHMgOTgtMTExIGFuZCA0NzItNDc2LgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhcgorc3RfbGluZWFyMmFsYXcoUHlJbnQxNiBwY21fdmFsKQkvKiAyJ3MgY29tcGxlbWVudCAoMTMtYml0IHJhbmdlKSAqLworeworICAgICAgICBQeUludDE2ICAgICAgICAgbWFzazsKKyAgICAgICAgc2hvcnQgICAgICAgICAgIHNlZzsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgIGF2YWw7CisKKyAgICAgICAgLyogVGhlIG9yaWdpbmFsIHNveCBjb2RlIGRvZXMgdGhpcyBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiwgbm90IGhlcmUgKi8KKyAgICAgICAgcGNtX3ZhbCA9IHBjbV92YWwgPj4gMzsKKworICAgICAgICAvKiBBLWxhdyB1c2luZyBldmVuIGJpdCBpbnZlcnNpb24gKi8KKyAgICAgICAgaWYgKHBjbV92YWwgPj0gMCkgeworICAgICAgICAgICAgICAgIG1hc2sgPSAweEQ1OyAgICAgICAgICAgIC8qIHNpZ24gKDd0aCkgYml0ID0gMSAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hc2sgPSAweDU1OyAgICAgICAgICAgIC8qIHNpZ24gYml0ID0gMCAqLworICAgICAgICAgICAgICAgIHBjbV92YWwgPSAtcGNtX3ZhbCAtIDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb252ZXJ0IHRoZSBzY2FsZWQgbWFnbml0dWRlIHRvIHNlZ21lbnQgbnVtYmVyLiAqLworICAgICAgICBzZWcgPSBzZWFyY2gocGNtX3ZhbCwgc2VnX2FlbmQsIDgpOworCisgICAgICAgIC8qIENvbWJpbmUgdGhlIHNpZ24sIHNlZ21lbnQsIGFuZCBxdWFudGl6YXRpb24gYml0cy4gKi8KKworICAgICAgICBpZiAoc2VnID49IDgpICAgICAgICAgICAvKiBvdXQgb2YgcmFuZ2UsIHJldHVybiBtYXhpbXVtIHZhbHVlLiAqLworICAgICAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgY2hhcikgKDB4N0YgXiBtYXNrKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYXZhbCA9ICh1bnNpZ25lZCBjaGFyKSBzZWcgPDwgU0VHX1NISUZUOworICAgICAgICAgICAgICAgIGlmIChzZWcgPCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZhbCB8PSAocGNtX3ZhbCA+PiAxKSAmIFFVQU5UX01BU0s7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYXZhbCB8PSAocGNtX3ZhbCA+PiBzZWcpICYgUVVBTlRfTUFTSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGF2YWwgXiBtYXNrKTsKKyAgICAgICAgfQogfQogLyogRW5kIG9mIGNvZGUgdGFrZW4gZnJvbSBzb3ggKi8KIAogLyogSW50ZWwgQURQQ00gc3RlcCB2YXJpYXRpb24gdGFibGUgKi8KIHN0YXRpYyBpbnQgaW5kZXhUYWJsZVsxNl0gPSB7Ci0JLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDgsCi0JLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDgsCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgMiwgNCwgNiwgOCwKIH07CiAKIHN0YXRpYyBpbnQgc3RlcHNpemVUYWJsZVs4OV0gPSB7Ci0JNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsCi0JMTksIDIxLCAyMywgMjUsIDI4LCAzMSwgMzQsIDM3LCA0MSwgNDUsCi0JNTAsIDU1LCA2MCwgNjYsIDczLCA4MCwgODgsIDk3LCAxMDcsIDExOCwKLQkxMzAsIDE0MywgMTU3LCAxNzMsIDE5MCwgMjA5LCAyMzAsIDI1MywgMjc5LCAzMDcsCi0JMzM3LCAzNzEsIDQwOCwgNDQ5LCA0OTQsIDU0NCwgNTk4LCA2NTgsIDcyNCwgNzk2LAotCTg3NiwgOTYzLCAxMDYwLCAxMTY2LCAxMjgyLCAxNDExLCAxNTUyLCAxNzA3LCAxODc4LCAyMDY2LAotCTIyNzIsIDI0OTksIDI3NDksIDMwMjQsIDMzMjcsIDM2NjAsIDQwMjYsIDQ0MjgsIDQ4NzEsIDUzNTgsCi0JNTg5NCwgNjQ4NCwgNzEzMiwgNzg0NSwgODYzMCwgOTQ5MywgMTA0NDIsIDExNDg3LCAxMjYzNSwgMTM4OTksCi0JMTUyODksIDE2ODE4LCAxODUwMCwgMjAzNTAsIDIyMzg1LCAyNDYyMywgMjcwODYsIDI5Nzk0LCAzMjc2NworICAgICAgICA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE2LCAxNywKKyAgICAgICAgMTksIDIxLCAyMywgMjUsIDI4LCAzMSwgMzQsIDM3LCA0MSwgNDUsCisgICAgICAgIDUwLCA1NSwgNjAsIDY2LCA3MywgODAsIDg4LCA5NywgMTA3LCAxMTgsCisgICAgICAgIDEzMCwgMTQzLCAxNTcsIDE3MywgMTkwLCAyMDksIDIzMCwgMjUzLCAyNzksIDMwNywKKyAgICAgICAgMzM3LCAzNzEsIDQwOCwgNDQ5LCA0OTQsIDU0NCwgNTk4LCA2NTgsIDcyNCwgNzk2LAorICAgICAgICA4NzYsIDk2MywgMTA2MCwgMTE2NiwgMTI4MiwgMTQxMSwgMTU1MiwgMTcwNywgMTg3OCwgMjA2NiwKKyAgICAgICAgMjI3MiwgMjQ5OSwgMjc0OSwgMzAyNCwgMzMyNywgMzY2MCwgNDAyNiwgNDQyOCwgNDg3MSwgNTM1OCwKKyAgICAgICAgNTg5NCwgNjQ4NCwgNzEzMiwgNzg0NSwgODYzMCwgOTQ5MywgMTA0NDIsIDExNDg3LCAxMjYzNSwgMTM4OTksCisgICAgICAgIDE1Mjg5LCAxNjgxOCwgMTg1MDAsIDIwMzUwLCAyMjM4NSwgMjQ2MjMsIDI3MDg2LCAyOTc5NCwgMzI3NjcKIH07CiAgICAgCiAjZGVmaW5lIENIQVJQKGNwLCBpKSAoKHNpZ25lZCBjaGFyICopKGNwK2kpKQpAQCAtMTUxLDEzNyArMjk4LDEzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfZ2V0c2FtcGxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlpbnQgaTsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBpbnQgaTsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpaSkiLCAmY3AsICZsZW4sICZzaXplLCAmaSkgKQotCQlyZXR1cm4gMDsKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIGkgPCAwIHx8IGkgPj0gbGVuL3NpemUgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSoyKTsKLQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkqNCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpaSkiLCAmY3AsICZsZW4sICZzaXplLCAmaSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGkgPCAwIHx8IGkgPj0gbGVuL3NpemUgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIkluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkqMik7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSo0KTsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX21heChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCWludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0JaW50IGk7Ci0JaW50IG1heCA9IDA7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBtYXggPSAwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotCQlyZXR1cm4gMDsKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KLQlmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLQkJaWYgKCB2YWwgPCAwICkgdmFsID0gKC12YWwpOwotCQlpZiAoIHZhbCA+IG1heCApIG1heCA9IHZhbDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1heCk7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgICAgICAgICAgaWYgKCB2YWwgPCAwICkgdmFsID0gKC12YWwpOworICAgICAgICAgICAgICAgIGlmICggdmFsID4gbWF4ICkgbWF4ID0gdmFsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9taW5tYXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotCWludCBpOwotCWludCBtaW4gPSAweDdmZmZmZmZmLCBtYXggPSAtMHg3ZmZmZmZmZjsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IG1pbiA9IDB4N2ZmZmZmZmYsIG1heCA9IC0weDdmZmZmZmZmOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gc2l6ZSkgewotCQlpZiAoc2l6ZSA9PSAxKSB2YWwgPSAoaW50KSAqQ0hBUlAoY3AsIGkpOwotCQllbHNlIGlmIChzaXplID09IDIpIHZhbCA9IChpbnQpICpTSE9SVFAoY3AsIGkpOwotCQllbHNlIGlmIChzaXplID09IDQpIHZhbCA9IChpbnQpICpMT05HUChjcCwgaSk7Ci0JCWlmICh2YWwgPiBtYXgpIG1heCA9IHZhbDsKLQkJaWYgKHZhbCA8IG1pbikgbWluID0gdmFsOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIG1pbiwgbWF4KTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChzaXplID09IDEpIHZhbCA9IChpbnQpICpDSEFSUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKSB2YWwgPSAoaW50KSAqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDQpIHZhbCA9IChpbnQpICpMT05HUChjcCwgaSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA+IG1heCkgbWF4ID0gdmFsOworICAgICAgICAgICAgICAgIGlmICh2YWwgPCBtaW4pIG1pbiA9IHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIG1pbiwgbWF4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfYXZnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlpbnQgaTsKLQlkb3VibGUgYXZnID0gMC4wOworICAgICAgICBzaWduZWQgY2hhciAqY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBkb3VibGUgYXZnID0gMC4wOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotCQlyZXR1cm4gMDsKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KLQlmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLQkJYXZnICs9IHZhbDsKLQl9Ci0JaWYgKCBsZW4gPT0gMCApCi0JCXZhbCA9IDA7Ci0JZWxzZQotCQl2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKShsZW4vc2l6ZSkpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOworICAgICAgICAgICAgICAgIGF2ZyArPSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBsZW4gPT0gMCApCisgICAgICAgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbCA9IChpbnQpKGF2ZyAvIChkb3VibGUpKGxlbi9zaXplKSk7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9ybXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotCWludCBpOwotCWRvdWJsZSBzdW1fc3F1YXJlcyA9IDAuMDsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZG91YmxlIHN1bV9zcXVhcmVzID0gMC4wOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotCQlyZXR1cm4gMDsKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KLQlmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLQkJc3VtX3NxdWFyZXMgKz0gKGRvdWJsZSl2YWwqKGRvdWJsZSl2YWw7Ci0JfQotCWlmICggbGVuID09IDAgKQotCQl2YWwgPSAwOwotCWVsc2UKLQkJdmFsID0gKGludClzcXJ0KHN1bV9zcXVhcmVzIC8gKGRvdWJsZSkobGVuL3NpemUpKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBzdW1fc3F1YXJlcyArPSAoZG91YmxlKXZhbCooZG91YmxlKXZhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGxlbiA9PSAwICkKKyAgICAgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFsID0gKGludClzcXJ0KHN1bV9zcXVhcmVzIC8gKGRvdWJsZSkobGVuL3NpemUpKTsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBkb3VibGUgX3N1bTIoc2hvcnQgKmEsIHNob3J0ICpiLCBpbnQgbGVuKQogewotCWludCBpOwotCWRvdWJsZSBzdW0gPSAwLjA7CisgICAgICAgIGludCBpOworICAgICAgICBkb3VibGUgc3VtID0gMC4wOwogCi0JZm9yKCBpPTA7IGk8bGVuOyBpKyspIHsKLQkJc3VtID0gc3VtICsgKGRvdWJsZSlhW2ldKihkb3VibGUpYltpXTsKLQl9Ci0JcmV0dXJuIHN1bTsKKyAgICAgICAgZm9yKCBpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdW0gPSBzdW0gKyAoZG91YmxlKWFbaV0qKGRvdWJsZSliW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdW07CiB9CiAKIC8qCkBAIC0zMDMsMTUgKzQ1MCwxNSBAQAogKiogdmogPSAoIHN1bShBW2oraV1eMikqc3VtKFJbaV1eMikgLSBzdW0oQVtqK2ldUltpXSleMiApIC8gc3VtKCBBW2oraV1eMiApCiAqKgogKiogSW4gdGhlIGNvZGUgdmFyaWFibGVzIGNvcnJlc3BvbmQgYXMgZm9sbG93czoKLSoqIGNwMQkJQQotKiogY3AyCQlSCi0qKiBsZW4xCQlOCi0qKiBsZW4yCQluCi0qKiBhal9tMQlBW2otMV0KLSoqIGFqX2xtMQlBW2orbi0xXQotKiogc3VtX3JpXzIJc3VtKFJbaV1eMikKLSoqIHN1bV9haWpfMglzdW0oQVtpK2pdXjIpCi0qKiBzdW1fYWlqX3JpCXN1bShBW2kral1SW2ldKQorKiogY3AxICAgICAgICAgIEEKKyoqIGNwMiAgICAgICAgICBSCisqKiBsZW4xICAgICAgICAgTgorKiogbGVuMiAgICAgICAgIG4KKyoqIGFqX20xICAgICAgICBBW2otMV0KKyoqIGFqX2xtMSAgICAgICBBW2orbi0xXQorKiogc3VtX3JpXzIgICAgIHN1bShSW2ldXjIpCisqKiBzdW1fYWlqXzIgICAgc3VtKEFbaStqXV4yKQorKiogc3VtX2Fpal9yaSAgIHN1bShBW2kral1SW2ldKQogKioKICoqIHN1bV9yaSBpcyBjYWxjdWxhdGVkIG9uY2UsIHN1bV9haWpfMiBpcyB1cGRhdGVkIGVhY2ggc3RlcCBhbmQgc3VtX2Fpal9yaQogKiogaXMgY29tcGxldGVseSByZWNhbGN1bGF0ZWQgZWFjaCBzdGVwLgpAQCAtMzE5LDU1ICs0NjYsNTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2ZpbmRmaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0ICpjcDEsICpjcDI7Ci0JaW50IGxlbjEsIGxlbjI7Ci0JaW50IGosIGJlc3RfajsKLQlkb3VibGUgYWpfbTEsIGFqX2xtMTsKLQlkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfMiwgc3VtX2Fpal9yaSwgcmVzdWx0LCBiZXN0X3Jlc3VsdCwgZmFjdG9yOworICAgICAgICBzaG9ydCAqY3AxLCAqY3AyOworICAgICAgICBpbnQgbGVuMSwgbGVuMjsKKyAgICAgICAgaW50IGosIGJlc3RfajsKKyAgICAgICAgZG91YmxlIGFqX20xLCBhal9sbTE7CisgICAgICAgIGRvdWJsZSBzdW1fcmlfMiwgc3VtX2Fpal8yLCBzdW1fYWlqX3JpLCByZXN1bHQsIGJlc3RfcmVzdWx0LCBmYWN0b3I7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjcyMpIiwgJmNwMSwgJmxlbjEsICZjcDIsICZsZW4yKSApCi0JCXJldHVybiAwOwotCWlmICggbGVuMSAmIDEgfHwgbGVuMiAmIDEgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTdHJpbmdzIHNob3VsZCBiZSBldmVuLXNpemVkIik7Ci0JCXJldHVybiAwOwotCX0KLQlsZW4xID4+PSAxOwotCWxlbjIgPj49IDE7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNzIykiLCAmY3AxLCAmbGVuMSwgJmNwMiwgJmxlbjIpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBsZW4xICYgMSB8fCBsZW4yICYgMSApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGxlbjEgPj49IDE7CisgICAgICAgIGxlbjIgPj49IDE7CiAgICAgCi0JaWYgKCBsZW4xIDwgbGVuMiApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIkZpcnN0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7Ci0JCXJldHVybiAwOwotCX0KLQlzdW1fcmlfMiA9IF9zdW0yKGNwMiwgY3AyLCBsZW4yKTsKLQlzdW1fYWlqXzIgPSBfc3VtMihjcDEsIGNwMSwgbGVuMik7Ci0Jc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKKyAgICAgICAgaWYgKCBsZW4xIDwgbGVuMiApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiRmlyc3Qgc2FtcGxlIHNob3VsZCBiZSBsb25nZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzdW1fcmlfMiA9IF9zdW0yKGNwMiwgY3AyLCBsZW4yKTsKKyAgICAgICAgc3VtX2Fpal8yID0gX3N1bTIoY3AxLCBjcDEsIGxlbjIpOworICAgICAgICBzdW1fYWlqX3JpID0gX3N1bTIoY3AxLCBjcDIsIGxlbjIpOwogCi0JcmVzdWx0ID0gKHN1bV9yaV8yKnN1bV9haWpfMiAtIHN1bV9haWpfcmkqc3VtX2Fpal9yaSkgLyBzdW1fYWlqXzI7CisgICAgICAgIHJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpIC8gc3VtX2Fpal8yOwogCi0JYmVzdF9yZXN1bHQgPSByZXN1bHQ7Ci0JYmVzdF9qID0gMDsKLQlqID0gMDsKKyAgICAgICAgYmVzdF9yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgIGJlc3RfaiA9IDA7CisgICAgICAgIGogPSAwOwogCi0JZm9yICggaj0xOyBqPD1sZW4xLWxlbjI7IGorKykgewotCQlhal9tMSA9IChkb3VibGUpY3AxW2otMV07Ci0JCWFqX2xtMSA9IChkb3VibGUpY3AxW2orbGVuMi0xXTsKKyAgICAgICAgZm9yICggaj0xOyBqPD1sZW4xLWxlbjI7IGorKykgeworICAgICAgICAgICAgICAgIGFqX20xID0gKGRvdWJsZSljcDFbai0xXTsKKyAgICAgICAgICAgICAgICBhal9sbTEgPSAoZG91YmxlKWNwMVtqK2xlbjItMV07CiAKLQkJc3VtX2Fpal8yID0gc3VtX2Fpal8yICsgYWpfbG0xKmFqX2xtMSAtIGFqX20xKmFqX20xOwotCQlzdW1fYWlqX3JpID0gX3N1bTIoY3AxK2osIGNwMiwgbGVuMik7CisgICAgICAgICAgICAgICAgc3VtX2Fpal8yID0gc3VtX2Fpal8yICsgYWpfbG0xKmFqX2xtMSAtIGFqX20xKmFqX20xOworICAgICAgICAgICAgICAgIHN1bV9haWpfcmkgPSBfc3VtMihjcDEraiwgY3AyLCBsZW4yKTsKIAotCQlyZXN1bHQgPSAoc3VtX3JpXzIqc3VtX2Fpal8yIC0gc3VtX2Fpal9yaSpzdW1fYWlqX3JpKQotCQkJLyBzdW1fYWlqXzI7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHN1bV9yaV8yKnN1bV9haWpfMiAtIHN1bV9haWpfcmkqc3VtX2Fpal9yaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gc3VtX2Fpal8yOwogCi0JCWlmICggcmVzdWx0IDwgYmVzdF9yZXN1bHQgKSB7Ci0JCQliZXN0X3Jlc3VsdCA9IHJlc3VsdDsKLQkJCWJlc3RfaiA9IGo7Ci0JCX0KLQkKLQl9CisgICAgICAgICAgICAgICAgaWYgKCByZXN1bHQgPCBiZXN0X3Jlc3VsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9qID0gajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CiAKLQlmYWN0b3IgPSBfc3VtMihjcDErYmVzdF9qLCBjcDIsIGxlbjIpIC8gc3VtX3JpXzI7CisgICAgICAgIGZhY3RvciA9IF9zdW0yKGNwMStiZXN0X2osIGNwMiwgbGVuMikgLyBzdW1fcmlfMjsKICAgICAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlmKSIsIGJlc3RfaiwgZmFjdG9yKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpZikiLCBiZXN0X2osIGZhY3Rvcik7CiB9CiAKIC8qCkBAIC0zNzcsMjcgKzUyNCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfZmluZGZhY3RvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgKmNwMSwgKmNwMjsKLQlpbnQgbGVuMSwgbGVuMjsKLQlkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfcmksIHJlc3VsdDsKKyAgICAgICAgc2hvcnQgKmNwMSwgKmNwMjsKKyAgICAgICAgaW50IGxlbjEsIGxlbjI7CisgICAgICAgIGRvdWJsZSBzdW1fcmlfMiwgc3VtX2Fpal9yaSwgcmVzdWx0OwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI3MjKSIsICZjcDEsICZsZW4xLCAmY3AyLCAmbGVuMikgKQotCQlyZXR1cm4gMDsKLQlpZiAoIGxlbjEgJiAxIHx8IGxlbjIgJiAxICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCBsZW4xICE9IGxlbjIgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTYW1wbGVzIHNob3VsZCBiZSBzYW1lIHNpemUiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWxlbjIgPj49IDE7Ci0Jc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7Ci0Jc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI3MjKSIsICZjcDEsICZsZW4xLCAmY3AyLCAmbGVuMikgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIGxlbjEgJiAxIHx8IGxlbjIgJiAxICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTdHJpbmdzIHNob3VsZCBiZSBldmVuLXNpemVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBsZW4xICE9IGxlbjIgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNhbXBsZXMgc2hvdWxkIGJlIHNhbWUgc2l6ZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGxlbjIgPj49IDE7CisgICAgICAgIHN1bV9yaV8yID0gX3N1bTIoY3AyLCBjcDIsIGxlbjIpOworICAgICAgICBzdW1fYWlqX3JpID0gX3N1bTIoY3AxLCBjcDIsIGxlbjIpOwogCi0JcmVzdWx0ID0gc3VtX2Fpal9yaSAvIHN1bV9yaV8yOworICAgICAgICByZXN1bHQgPSBzdW1fYWlqX3JpIC8gc3VtX3JpXzI7CiAKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocmVzdWx0KTsKIH0KIAogLyoKQEAgLTQwNyw5ODEgKzU1NCwxMDUzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9maW5kbWF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCAqY3AxOwotCWludCBsZW4xLCBsZW4yOwotCWludCBqLCBiZXN0X2o7Ci0JZG91YmxlIGFqX20xLCBhal9sbTE7Ci0JZG91YmxlIHJlc3VsdCwgYmVzdF9yZXN1bHQ7CisgICAgICAgIHNob3J0ICpjcDE7CisgICAgICAgIGludCBsZW4xLCBsZW4yOworICAgICAgICBpbnQgaiwgYmVzdF9qOworICAgICAgICBkb3VibGUgYWpfbTEsIGFqX2xtMTsKKyAgICAgICAgZG91YmxlIHJlc3VsdCwgYmVzdF9yZXN1bHQ7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AxLCAmbGVuMSwgJmxlbjIpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBsZW4xICYgMSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWxlbjEgPj49IDE7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcDEsICZsZW4xLCAmbGVuMikgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIGxlbjEgJiAxICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTdHJpbmdzIHNob3VsZCBiZSBldmVuLXNpemVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgbGVuMSA+Pj0gMTsKICAgICAKLQlpZiAoIGxlbjEgPCBsZW4yICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiSW5wdXQgc2FtcGxlIHNob3VsZCBiZSBsb25nZXIiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIGxlbjEgPCBsZW4yICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJJbnB1dCBzYW1wbGUgc2hvdWxkIGJlIGxvbmdlciIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAKLQlyZXN1bHQgPSBfc3VtMihjcDEsIGNwMSwgbGVuMik7CisgICAgICAgIHJlc3VsdCA9IF9zdW0yKGNwMSwgY3AxLCBsZW4yKTsKIAotCWJlc3RfcmVzdWx0ID0gcmVzdWx0OwotCWJlc3RfaiA9IDA7Ci0JaiA9IDA7CisgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICBiZXN0X2ogPSAwOworICAgICAgICBqID0gMDsKIAotCWZvciAoIGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKLQkJYWpfbTEgPSAoZG91YmxlKWNwMVtqLTFdOwotCQlhal9sbTEgPSAoZG91YmxlKWNwMVtqK2xlbjItMV07CisgICAgICAgIGZvciAoIGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKKyAgICAgICAgICAgICAgICBhal9tMSA9IChkb3VibGUpY3AxW2otMV07CisgICAgICAgICAgICAgICAgYWpfbG0xID0gKGRvdWJsZSljcDFbaitsZW4yLTFdOwogCi0JCXJlc3VsdCA9IHJlc3VsdCArIGFqX2xtMSphal9sbTEgLSBhal9tMSphal9tMTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBhal9sbTEqYWpfbG0xIC0gYWpfbTEqYWpfbTE7CiAKLQkJaWYgKCByZXN1bHQgPiBiZXN0X3Jlc3VsdCApIHsKLQkJCWJlc3RfcmVzdWx0ID0gcmVzdWx0OwotCQkJYmVzdF9qID0gajsKLQkJfQotCQotCX0KKyAgICAgICAgICAgICAgICBpZiAoIHJlc3VsdCA+IGJlc3RfcmVzdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2ogPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhiZXN0X2opOworICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoYmVzdF9qKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfYXZncHAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCi0JCXByZXZleHRyZW1lID0gMDsKLQlpbnQgaTsKLQlkb3VibGUgYXZnID0gMC4wOwotCWludCBkaWZmLCBwcmV2ZGlmZiwgZXh0cmVtZWRpZmYsIG5leHRyZW1lID0gMDsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCisgICAgICAgICAgICAgICAgcHJldmV4dHJlbWUgPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZG91YmxlIGF2ZyA9IDAuMDsKKyAgICAgICAgaW50IGRpZmYsIHByZXZkaWZmLCBleHRyZW1lZGlmZiwgbmV4dHJlbWUgPSAwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotCQlyZXR1cm4gMDsKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBDb21wdXRlIGZpcnN0IGRlbHRhIHZhbHVlIGFoZWFkLiBBbHNvIGF1dG9tYXRpY2FsbHkgbWFrZXMgdXMKLQkqKiBza2lwIHRoZSBmaXJzdCBleHRyZW1lIHZhbHVlCi0JKi8KLQlpZiAoIHNpemUgPT0gMSApICAgICAgcHJldnZhbCA9IChpbnQpKkNIQVJQKGNwLCAwKTsKLQllbHNlIGlmICggc2l6ZSA9PSAyICkgcHJldnZhbCA9IChpbnQpKlNIT1JUUChjcCwgMCk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gNCApIHByZXZ2YWwgPSAoaW50KSpMT05HUChjcCwgMCk7Ci0JaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBzaXplKTsKLQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBzaXplKTsKLQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIHNpemUpOwotCXByZXZkaWZmID0gdmFsIC0gcHJldnZhbDsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBDb21wdXRlIGZpcnN0IGRlbHRhIHZhbHVlIGFoZWFkLiBBbHNvIGF1dG9tYXRpY2FsbHkgbWFrZXMgdXMKKyAgICAgICAgKiogc2tpcCB0aGUgZmlyc3QgZXh0cmVtZSB2YWx1ZQorICAgICAgICAqLworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgcHJldnZhbCA9IChpbnQpKkNIQVJQKGNwLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHByZXZ2YWwgPSAoaW50KSpTSE9SVFAoY3AsIDApOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgcHJldnZhbCA9IChpbnQpKkxPTkdQKGNwLCAwKTsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBzaXplKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgc2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgc2l6ZSk7CisgICAgICAgIHByZXZkaWZmID0gdmFsIC0gcHJldnZhbDsKICAgICAKLQlmb3IgKCBpPXNpemU7IGk8bGVuOyBpKz0gc2l6ZSkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLQkJZGlmZiA9IHZhbCAtIHByZXZ2YWw7Ci0JCWlmICggZGlmZipwcmV2ZGlmZiA8IDAgKSB7Ci0JCQkvKiBEZXJpdmF0aXZlIGNoYW5nZWQgc2lnbi4gQ29tcHV0ZSBkaWZmZXJlbmNlIHRvIGxhc3QKLQkJCSoqIGV4dHJlbWUgdmFsdWUgYW5kIHJlbWVtYmVyLgotCQkJKi8KLQkJCWlmICggcHJldmV4dHJlbWV2YWxpZCApIHsKLQkJCQlleHRyZW1lZGlmZiA9IHByZXZ2YWwgLSBwcmV2ZXh0cmVtZTsKLQkJCQlpZiAoIGV4dHJlbWVkaWZmIDwgMCApCi0JCQkJCWV4dHJlbWVkaWZmID0gLWV4dHJlbWVkaWZmOwotCQkJCWF2ZyArPSBleHRyZW1lZGlmZjsKLQkJCQluZXh0cmVtZSsrOwotCQkJfQotCQkJcHJldmV4dHJlbWV2YWxpZCA9IDE7Ci0JCQlwcmV2ZXh0cmVtZSA9IHByZXZ2YWw7Ci0JCX0KLQkJcHJldnZhbCA9IHZhbDsKLQkJaWYgKCBkaWZmICE9IDAgKQotCQkJcHJldmRpZmYgPSBkaWZmOwkKLQl9Ci0JaWYgKCBuZXh0cmVtZSA9PSAwICkKLQkJdmFsID0gMDsKLQllbHNlCi0JCXZhbCA9IChpbnQpKGF2ZyAvIChkb3VibGUpbmV4dHJlbWUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgICAgICBmb3IgKCBpPXNpemU7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBkaWZmID0gdmFsIC0gcHJldnZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIGRpZmYqcHJldmRpZmYgPCAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0byBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAqKiBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByZXZleHRyZW1ldmFsaWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gcHJldnZhbCAtIHByZXZleHRyZW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGV4dHJlbWVkaWZmIDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSAtZXh0cmVtZWRpZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZyArPSBleHRyZW1lZGlmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHJlbWUrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZleHRyZW1ldmFsaWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcHJldmV4dHJlbWUgPSBwcmV2dmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2dmFsID0gdmFsOworICAgICAgICAgICAgICAgIGlmICggZGlmZiAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZkaWZmID0gZGlmZjsgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGlmICggbmV4dHJlbWUgPT0gMCApCisgICAgICAgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbCA9IChpbnQpKGF2ZyAvIChkb3VibGUpbmV4dHJlbWUpOworICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbWF4cHAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCi0JCXByZXZleHRyZW1lID0gMDsKLQlpbnQgaTsKLQlpbnQgbWF4ID0gMDsKLQlpbnQgZGlmZiwgcHJldmRpZmYsIGV4dHJlbWVkaWZmOworICAgICAgICBzaWduZWQgY2hhciAqY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDAsIHByZXZ2YWwgPSAwLCBwcmV2ZXh0cmVtZXZhbGlkID0gMCwKKyAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZSA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgbWF4ID0gMDsKKyAgICAgICAgaW50IGRpZmYsIHByZXZkaWZmLCBleHRyZW1lZGlmZjsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCi0JKiogc2tpcCB0aGUgZmlyc3QgZXh0cmVtZSB2YWx1ZQotCSovCi0JaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gMiApIHByZXZ2YWwgPSAoaW50KSpTSE9SVFAoY3AsIDApOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSBwcmV2dmFsID0gKGludCkqTE9OR1AoY3AsIDApOwotCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgc2l6ZSk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBzaXplKTsKLQlwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCisgICAgICAgICoqIHNraXAgdGhlIGZpcnN0IGV4dHJlbWUgdmFsdWUKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBwcmV2dmFsID0gKGludCkqU0hPUlRQKGNwLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHByZXZ2YWwgPSAoaW50KSpMT05HUChjcCwgMCk7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIHNpemUpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIHNpemUpOworICAgICAgICBwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7CiAKLQlmb3IgKCBpPXNpemU7IGk8bGVuOyBpKz0gc2l6ZSkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLQkJZGlmZiA9IHZhbCAtIHByZXZ2YWw7Ci0JCWlmICggZGlmZipwcmV2ZGlmZiA8IDAgKSB7Ci0JCQkvKiBEZXJpdmF0aXZlIGNoYW5nZWQgc2lnbi4gQ29tcHV0ZSBkaWZmZXJlbmNlIHRvCi0JCQkqKiBsYXN0IGV4dHJlbWUgdmFsdWUgYW5kIHJlbWVtYmVyLgotCQkJKi8KLQkJCWlmICggcHJldmV4dHJlbWV2YWxpZCApIHsKLQkJCQlleHRyZW1lZGlmZiA9IHByZXZ2YWwgLSBwcmV2ZXh0cmVtZTsKLQkJCQlpZiAoIGV4dHJlbWVkaWZmIDwgMCApCi0JCQkJCWV4dHJlbWVkaWZmID0gLWV4dHJlbWVkaWZmOwotCQkJCWlmICggZXh0cmVtZWRpZmYgPiBtYXggKQotCQkJCQltYXggPSBleHRyZW1lZGlmZjsKLQkJCX0KLQkJCXByZXZleHRyZW1ldmFsaWQgPSAxOwotCQkJcHJldmV4dHJlbWUgPSBwcmV2dmFsOwotCQl9Ci0JCXByZXZ2YWwgPSB2YWw7Ci0JCWlmICggZGlmZiAhPSAwICkKLQkJCXByZXZkaWZmID0gZGlmZjsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1heCk7CisgICAgICAgIGZvciAoIGk9c2l6ZTsgaTxsZW47IGkrPSBzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOworICAgICAgICAgICAgICAgIGRpZmYgPSB2YWwgLSBwcmV2dmFsOworICAgICAgICAgICAgICAgIGlmICggZGlmZipwcmV2ZGlmZiA8IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXJpdmF0aXZlIGNoYW5nZWQgc2lnbi4gQ29tcHV0ZSBkaWZmZXJlbmNlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAqKiBsYXN0IGV4dHJlbWUgdmFsdWUgYW5kIHJlbWVtYmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHJldmV4dHJlbWV2YWxpZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSBwcmV2dmFsIC0gcHJldmV4dHJlbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IC1leHRyZW1lZGlmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA+IG1heCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gZXh0cmVtZWRpZmY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZXZhbGlkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZleHRyZW1lID0gcHJldnZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldnZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIGRpZmYgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZGlmZiA9IGRpZmY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1heCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2Nyb3NzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlpbnQgaTsKLQlpbnQgcHJldnZhbCwgbmNyb3NzOworICAgICAgICBzaWduZWQgY2hhciAqY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgcHJldnZhbCwgbmNyb3NzOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotCQlyZXR1cm4gMDsKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KLQluY3Jvc3MgPSAtMTsKLQlwcmV2dmFsID0gMTc7IC8qIEFueXRoaW5nIDw+IDAsMSAqLwotCWZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA+PiA3OwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKChpbnQpKlNIT1JUUChjcCwgaSkpID4+IDE1OwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMzE7Ci0JCXZhbCA9IHZhbCAmIDE7Ci0JCWlmICggdmFsICE9IHByZXZ2YWwgKSBuY3Jvc3MrKzsKLQkJcHJldnZhbCA9IHZhbDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKG5jcm9zcyk7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgbmNyb3NzID0gLTE7CisgICAgICAgIHByZXZ2YWwgPSAxNzsgLyogQW55dGhpbmcgPD4gMCwxICovCisgICAgICAgIGZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpID4+IDc7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9ICgoaW50KSpTSE9SVFAoY3AsIGkpKSA+PiAxNTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMzE7CisgICAgICAgICAgICAgICAgdmFsID0gdmFsICYgMTsKKyAgICAgICAgICAgICAgICBpZiAoIHZhbCAhPSBwcmV2dmFsICkgbmNyb3NzKys7CisgICAgICAgICAgICAgICAgcHJldnZhbCA9IHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobmNyb3NzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbXVsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlkb3VibGUgZmFjdG9yLCBmdmFsLCBtYXh2YWw7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOworICAgICAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgICAgIGRvdWJsZSBmYWN0b3IsIGZ2YWwsIG1heHZhbDsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworICAgICAgICBpbnQgaTsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpZCkiLCAmY3AsICZsZW4sICZzaXplLCAmZmFjdG9yICkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2lkKSIsICZjcCwgJmxlbiwgJnNpemUsICZmYWN0b3IgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgCi0JaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOwotCWVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7Ci0JZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZmZmZmY7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKICAgICAKICAgICAKLQlmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCWZ2YWwgPSAoZG91YmxlKXZhbCpmYWN0b3I7Ci0JCWlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7Ci0JCWVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOwotCQl2YWwgPSAoaW50KWZ2YWw7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcil2YWw7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpdmFsOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpdmFsOwotCX0KLQlyZXR1cm4gcnY7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwqZmFjdG9yOworICAgICAgICAgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7CisgICAgICAgICAgICAgICAgdmFsID0gKGludClmdmFsOworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcil2YWw7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCl2YWw7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKXZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3RvbW9ubyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotCWludCBsZW4sIHNpemUsIHZhbDEgPSAwLCB2YWwyID0gMDsKLQlkb3VibGUgZmFjMSwgZmFjMiwgZnZhbCwgbWF4dmFsOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaTsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwxID0gMCwgdmFsMiA9IDA7CisgICAgICAgIGRvdWJsZSBmYWMxLCBmYWMyLCBmdmFsLCBtYXh2YWw7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWRkKSIsICZjcCwgJmxlbiwgJnNpemUsICZmYWMxLCAmZmFjMiApICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpZGQpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhYzEsICZmYWMyICkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgIAotCWlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKLQllbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vMik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi8yKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogICAgIAogICAgIAotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplKjIgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMSA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwxID0gKGludCkqTE9OR1AoY3AsIGkpOwotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMiA9IChpbnQpKkNIQVJQKGNwLCBpKzEpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMiA9IChpbnQpKlNIT1JUUChjcCwgaSsyKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDIgPSAoaW50KSpMT05HUChjcCwgaSs0KTsKLQkJZnZhbCA9IChkb3VibGUpdmFsMSpmYWMxICsgKGRvdWJsZSl2YWwyKmZhYzI7Ci0JCWlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7Ci0JCWVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOwotCQl2YWwxID0gKGludClmdmFsOwotCQlpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaS8yKSA9IChzaWduZWQgY2hhcil2YWwxOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkvMikgPSAoc2hvcnQpdmFsMTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkvMik9IChQeV9JbnQzMil2YWwxOwotCX0KLQlyZXR1cm4gcnY7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplKjIgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDEgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDEgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwxID0gKGludCkqTE9OR1AoY3AsIGkpOworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwyID0gKGludCkqQ0hBUlAoY3AsIGkrMSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDIgPSAoaW50KSpTSE9SVFAoY3AsIGkrMik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDIgPSAoaW50KSpMT05HUChjcCwgaSs0KTsKKyAgICAgICAgICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwxKmZhYzEgKyAoZG91YmxlKXZhbDIqZmFjMjsKKyAgICAgICAgICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOworICAgICAgICAgICAgICAgIHZhbDEgPSAoaW50KWZ2YWw7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkvMikgPSAoc2lnbmVkIGNoYXIpdmFsMTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkvMikgPSAoc2hvcnQpdmFsMTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaS8yKT0gKFB5X0ludDMyKXZhbDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF90b3N0ZXJlbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotCWludCBsZW4sIHNpemUsIHZhbDEsIHZhbDIsIHZhbCA9IDA7Ci0JZG91YmxlIGZhYzEsIGZhYzIsIGZ2YWwsIG1heHZhbDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsMSwgdmFsMiwgdmFsID0gMDsKKyAgICAgICAgZG91YmxlIGZhYzEsIGZhYzIsIGZ2YWwsIG1heHZhbDsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworICAgICAgICBpbnQgaTsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpZGQpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhYzEsICZmYWMyICkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2lkZCkiLCAmY3AsICZsZW4sICZzaXplLCAmZmFjMSwgJmZhYzIgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgCi0JaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOwotCWVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7Ci0JZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZmZmZmY7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKjIpOworICAgICAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAgICAgCiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CiAKLQkJZnZhbCA9IChkb3VibGUpdmFsKmZhYzE7Ci0JCWlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7Ci0JCWVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOwotCQl2YWwxID0gKGludClmdmFsOworICAgICAgICAgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWMxOworICAgICAgICAgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7CisgICAgICAgICAgICAgICAgdmFsMSA9IChpbnQpZnZhbDsKIAotCQlmdmFsID0gKGRvdWJsZSl2YWwqZmFjMjsKLQkJaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKLQkJZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7Ci0JCXZhbDIgPSAoaW50KWZ2YWw7CisgICAgICAgICAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsKmZhYzI7CisgICAgICAgICAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKKyAgICAgICAgICAgICAgICB2YWwyID0gKGludClmdmFsOwogCi0JCWlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKjIpID0gKHNpZ25lZCBjaGFyKXZhbDE7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSoyKSA9IChzaG9ydCl2YWwxOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSoyKSA9IChQeV9JbnQzMil2YWwxOworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKjIpID0gKHNpZ25lZCBjaGFyKXZhbDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKjIpID0gKHNob3J0KXZhbDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkqMikgPSAoUHlfSW50MzIpdmFsMTsKIAotCQlpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKzEpID0gKHNpZ25lZCBjaGFyKXZhbDI7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSoyKzIpID0gKHNob3J0KXZhbDI7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKjIrNCkgPSAoUHlfSW50MzIpdmFsMjsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKjIrMSkgPSAoc2lnbmVkIGNoYXIpdmFsMjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMisyKSA9IChzaG9ydCl2YWwyOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKjIrNCkgPSAoUHlfSW50MzIpdmFsMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2FkZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwMSwgKmNwMiwgKm5jcDsKLQlpbnQgbGVuMSwgbGVuMiwgc2l6ZSwgdmFsMSA9IDAsIHZhbDIgPSAwLCBtYXh2YWwsIG5ld3ZhbDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDEsICpjcDIsICpuY3A7CisgICAgICAgIGludCBsZW4xLCBsZW4yLCBzaXplLCB2YWwxID0gMCwgdmFsMiA9IDAsIG1heHZhbCwgbmV3dmFsOworICAgICAgICBQeU9iamVjdCAqcnY7CisgICAgICAgIGludCBpOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI3MjaSkiLAotCQkJICAmY3AxLCAmbGVuMSwgJmNwMiwgJmxlbjIsICZzaXplICkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI3MjaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AxLCAmbGVuMSwgJmNwMiwgJmxlbjIsICZzaXplICkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCBsZW4xICE9IGxlbjIgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJMZW5ndGhzIHNob3VsZCBiZSB0aGUgc2FtZSIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICggbGVuMSAhPSBsZW4yICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJMZW5ndGhzIHNob3VsZCBiZSB0aGUgc2FtZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAweDdmOwotCWVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAweDdmZmY7Ci0JZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IDB4N2ZmZmZmZmY7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IDB4N2Y7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAweDdmZmY7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAweDdmZmZmZmZmOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuMSk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbjEpOworICAgICAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLQlmb3IgKCBpPTA7IGkgPCBsZW4xOyBpICs9IHNpemUgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AxLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDEgPSAoaW50KSpTSE9SVFAoY3AxLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDEgPSAoaW50KSpMT05HUChjcDEsIGkpOwotCQotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMiA9IChpbnQpKkNIQVJQKGNwMiwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwMiwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AyLCBpKTsKKyAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuMTsgaSArPSBzaXplICkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AxLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMSA9IChpbnQpKlNIT1JUUChjcDEsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwxID0gKGludCkqTE9OR1AoY3AxLCBpKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDIgPSAoaW50KSpDSEFSUChjcDIsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwMiwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDIgPSAoaW50KSpMT05HUChjcDIsIGkpOwogCi0JCW5ld3ZhbCA9IHZhbDEgKyB2YWwyOwotCQkvKiB0cnVuY2F0ZSBpbiBjYXNlIG9mIG92ZXJmbG93ICovCi0JCWlmIChuZXd2YWwgPiBtYXh2YWwpIG5ld3ZhbCA9IG1heHZhbDsKLQkJZWxzZSBpZiAobmV3dmFsIDwgLW1heHZhbCkgbmV3dmFsID0gLW1heHZhbDsKLQkJZWxzZSBpZiAoc2l6ZSA9PSA0ICYmIChuZXd2YWxedmFsMSkgPCAwICYmIChuZXd2YWxedmFsMikgPCAwKQotCQkJbmV3dmFsID0gdmFsMSA+IDAgPyBtYXh2YWwgOiAtIG1heHZhbDsKKyAgICAgICAgICAgICAgICBuZXd2YWwgPSB2YWwxICsgdmFsMjsKKyAgICAgICAgICAgICAgICAvKiB0cnVuY2F0ZSBpbiBjYXNlIG9mIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgaWYgKG5ld3ZhbCA+IG1heHZhbCkgbmV3dmFsID0gbWF4dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld3ZhbCA8IC1tYXh2YWwpIG5ld3ZhbCA9IC1tYXh2YWw7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0ICYmIChuZXd2YWxedmFsMSkgPCAwICYmIChuZXd2YWxedmFsMikgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsID0gdmFsMSA+IDAgPyBtYXh2YWwgOiAtIG1heHZhbDsKIAotCQlpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpbmV3dmFsOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KW5ld3ZhbDsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKW5ld3ZhbDsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhciluZXd2YWw7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCluZXd2YWw7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKW5ld3ZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2JpYXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaTsKLQlpbnQgYmlhczsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBQeU9iamVjdCAqcnY7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgYmlhczsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpaSkiLAotCQkJICAmY3AsICZsZW4sICZzaXplICwgJmJpYXMpICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplICwgJmJpYXMpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCWlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKICAgICAKICAgICAKLQlmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCi0JCWlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsK2JpYXMpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwrYmlhcyk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFsK2JpYXMpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWwrYmlhcyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsK2JpYXMpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFsK2JpYXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfcmV2ZXJzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCXVuc2lnbmVkIGNoYXIgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaSwgajsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGksIGo7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLAotCQkJICAmY3AsICZsZW4sICZzaXplKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CiAKLQkJaiA9IGxlbiAtIGkgLSBzaXplOwotCQotCQlpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaikgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBqKSA9IChzaG9ydCkodmFsKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICAgICAgICAgIGogPSBsZW4gLSBpIC0gc2l6ZTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGopID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBqKSA9IChzaG9ydCkodmFsKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaikgPSAoUHlfSW50MzIpKHZhbDw8MTYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbGluMmxpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCXVuc2lnbmVkIGNoYXIgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCBzaXplMiwgdmFsID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIGo7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCBzaXplMiwgdmFsID0gMDsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworICAgICAgICBpbnQgaSwgajsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpaSkiLAotCQkJICAmY3AsICZsZW4sICZzaXplLCAmc2l6ZTIpICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmc2l6ZTIpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCWlmICggKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB8fAotCSAgICAgKHNpemUyICE9IDEgJiYgc2l6ZTIgIT0gMiAmJiBzaXplMiAhPSA0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHx8CisgICAgICAgICAgICAgKHNpemUyICE9IDEgJiYgc2l6ZTIgIT0gMiAmJiBzaXplMiAhPSA0KSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGxlbi9zaXplKSpzaXplMik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGxlbi9zaXplKSpzaXplMik7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogICAgIAotCWZvciAoIGk9MCwgaj0wOyBpIDwgbGVuOyBpICs9IHNpemUsIGogKz0gc2l6ZTIgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworICAgICAgICBmb3IgKCBpPTAsIGo9MDsgaSA8IGxlbjsgaSArPSBzaXplLCBqICs9IHNpemUyICkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKIAotCQlpZiAoIHNpemUyID09IDEgKSAgKkNIQVJQKG5jcCwgaikgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKLQkJZWxzZSBpZiAoIHNpemUyID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7Ci0JCWVsc2UgaWYgKCBzaXplMiA9PSA0ICkgKkxPTkdQKG5jcCwgaikgPSAoUHlfSW50MzIpKHZhbDw8MTYpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplMiA9PSAxICkgICpDSEFSUChuY3AsIGopID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUyID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUyID09IDQgKSAqTE9OR1AobmNwLCBqKSA9IChQeV9JbnQzMikodmFsPDwxNik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgaW50CiBnY2QoaW50IGEsIGludCBiKQogewotCXdoaWxlIChiID4gMCkgewotCQlpbnQgdG1wID0gYSAlIGI7Ci0JCWEgPSBiOwotCQliID0gdG1wOwotCX0KLQlyZXR1cm4gYTsKKyAgICAgICAgd2hpbGUgKGIgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IHRtcCA9IGEgJSBiOworICAgICAgICAgICAgICAgIGEgPSBiOworICAgICAgICAgICAgICAgIGIgPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3JhdGVjdihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqY3AsICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgbmNoYW5uZWxzLCBpbnJhdGUsIG91dHJhdGUsIHdlaWdodEEsIHdlaWdodEI7Ci0JaW50IGNoYW4sIGQsICpwcmV2X2ksICpjdXJfaSwgY3VyX287Ci0JUHlPYmplY3QgKnN0YXRlLCAqc2FtcHMsICpzdHIsICpydiA9IE5VTEw7Ci0JaW50IGJ5dGVzX3Blcl9mcmFtZTsKKyAgICAgICAgY2hhciAqY3AsICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIG5jaGFubmVscywgaW5yYXRlLCBvdXRyYXRlLCB3ZWlnaHRBLCB3ZWlnaHRCOworICAgICAgICBpbnQgY2hhbiwgZCwgKnByZXZfaSwgKmN1cl9pLCBjdXJfbzsKKyAgICAgICAgUHlPYmplY3QgKnN0YXRlLCAqc2FtcHMsICpzdHIsICpydiA9IE5VTEw7CisgICAgICAgIGludCBieXRlc19wZXJfZnJhbWU7CiAKLQl3ZWlnaHRBID0gMTsKLQl3ZWlnaHRCID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpaU98aWk6cmF0ZWN2IiwgJmNwLCAmbGVuLCAmc2l6ZSwgJm5jaGFubmVscywKLQkJCSAgICAgICZpbnJhdGUsICZvdXRyYXRlLCAmc3RhdGUsICZ3ZWlnaHRBLCAmd2VpZ2h0QikpCi0JCXJldHVybiBOVUxMOwotCWlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobmNoYW5uZWxzIDwgMSkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiIyBvZiBjaGFubmVscyBzaG91bGQgYmUgPj0gMSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYnl0ZXNfcGVyX2ZyYW1lID0gc2l6ZSAqIG5jaGFubmVsczsKLQlpZiAoYnl0ZXNfcGVyX2ZyYW1lIC8gbmNoYW5uZWxzICE9IHNpemUpIHsKLQkJLyogVGhpcyBvdmVyZmxvdyB0ZXN0IGlzIHJpZ29yb3VzbHkgY29ycmVjdCBiZWNhdXNlCi0JCSAgIGJvdGggbXVsdGlwbGljYW5kcyBhcmUgPj0gMS4gIFVzZSB0aGUgYXJndW1lbnQgbmFtZXMKLQkJICAgZnJvbSB0aGUgZG9jcyBmb3IgdGhlIGVycm9yIG1zZy4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCSAgICAgICAgICAgICAgICAid2lkdGggKiBuY2hhbm5lbHMgdG9vIGJpZyBmb3IgYSBDIGludCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHdlaWdodEEgPCAxIHx8IHdlaWdodEIgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsCi0JCQkid2VpZ2h0QSBzaG91bGQgYmUgPj0gMSwgd2VpZ2h0QiBzaG91bGQgYmUgPj0gMCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGxlbiAlIGJ5dGVzX3Blcl9mcmFtZSAhPSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJub3QgYSB3aG9sZSBudW1iZXIgb2YgZnJhbWVzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoaW5yYXRlIDw9IDAgfHwgb3V0cmF0ZSA8PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJzYW1wbGluZyByYXRlIG5vdCA+IDAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIGRpdmlkZSBpbnJhdGUgYW5kIG91dHJhdGUgYnkgdGhlaXIgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3IgKi8KLQlkID0gZ2NkKGlucmF0ZSwgb3V0cmF0ZSk7Ci0JaW5yYXRlIC89IGQ7Ci0Jb3V0cmF0ZSAvPSBkOworICAgICAgICB3ZWlnaHRBID0gMTsKKyAgICAgICAgd2VpZ2h0QiA9IDA7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWlpT3xpaTpyYXRlY3YiLCAmY3AsICZsZW4sICZzaXplLCAmbmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucmF0ZSwgJm91dHJhdGUsICZzdGF0ZSwgJndlaWdodEEsICZ3ZWlnaHRCKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChuY2hhbm5lbHMgPCAxKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIiMgb2YgY2hhbm5lbHMgc2hvdWxkIGJlID49IDEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBieXRlc19wZXJfZnJhbWUgPSBzaXplICogbmNoYW5uZWxzOworICAgICAgICBpZiAoYnl0ZXNfcGVyX2ZyYW1lIC8gbmNoYW5uZWxzICE9IHNpemUpIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIG92ZXJmbG93IHRlc3QgaXMgcmlnb3JvdXNseSBjb3JyZWN0IGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICBib3RoIG11bHRpcGxpY2FuZHMgYXJlID49IDEuICBVc2UgdGhlIGFyZ3VtZW50IG5hbWVzCisgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgZG9jcyBmb3IgdGhlIGVycm9yIG1zZy4gKi8KKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoICogbmNoYW5uZWxzIHRvbyBiaWcgZm9yIGEgQyBpbnQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAod2VpZ2h0QSA8IDEgfHwgd2VpZ2h0QiA8IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIndlaWdodEEgc2hvdWxkIGJlID49IDEsIHdlaWdodEIgc2hvdWxkIGJlID49IDAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuICUgYnl0ZXNfcGVyX2ZyYW1lICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAibm90IGEgd2hvbGUgbnVtYmVyIG9mIGZyYW1lcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChpbnJhdGUgPD0gMCB8fCBvdXRyYXRlIDw9IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAic2FtcGxpbmcgcmF0ZSBub3QgPiAwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogZGl2aWRlIGlucmF0ZSBhbmQgb3V0cmF0ZSBieSB0aGVpciBncmVhdGVzdCBjb21tb24gZGl2aXNvciAqLworICAgICAgICBkID0gZ2NkKGlucmF0ZSwgb3V0cmF0ZSk7CisgICAgICAgIGlucmF0ZSAvPSBkOworICAgICAgICBvdXRyYXRlIC89IGQ7CiAKLQlwcmV2X2kgPSAoaW50ICopIG1hbGxvYyhuY2hhbm5lbHMgKiBzaXplb2YoaW50KSk7Ci0JY3VyX2kgPSAoaW50ICopIG1hbGxvYyhuY2hhbm5lbHMgKiBzaXplb2YoaW50KSk7Ci0JaWYgKHByZXZfaSA9PSBOVUxMIHx8IGN1cl9pID09IE5VTEwpIHsKLQkJKHZvaWQpIFB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXhpdDsKLQl9CisgICAgICAgIHByZXZfaSA9IChpbnQgKikgbWFsbG9jKG5jaGFubmVscyAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgY3VyX2kgPSAoaW50ICopIG1hbGxvYyhuY2hhbm5lbHMgKiBzaXplb2YoaW50KSk7CisgICAgICAgIGlmIChwcmV2X2kgPT0gTlVMTCB8fCBjdXJfaSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CiAKLQlsZW4gLz0gYnl0ZXNfcGVyX2ZyYW1lOwkvKiAjIG9mIGZyYW1lcyAqLworICAgICAgICBsZW4gLz0gYnl0ZXNfcGVyX2ZyYW1lOyAvKiAjIG9mIGZyYW1lcyAqLwogCi0JaWYgKHN0YXRlID09IFB5X05vbmUpIHsKLQkJZCA9IC1vdXRyYXRlOwotCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspCi0JCQlwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXSA9IDA7Ci0JfQotCWVsc2UgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsCi0JCQkJImlPITthdWRpb29wLnJhdGVjdjogaWxsZWdhbCBzdGF0ZSBhcmd1bWVudCIsCi0JCQkJJmQsICZQeVR1cGxlX1R5cGUsICZzYW1wcykpCi0JCQlnb3RvIGV4aXQ7Ci0JCWlmIChQeVR1cGxlX1NpemUoc2FtcHMpICE9IG5jaGFubmVscykgewotCQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwKLQkJCQkJImlsbGVnYWwgc3RhdGUgYXJndW1lbnQiKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKLQkJCWlmICghUHlBcmdfUGFyc2VUdXBsZShQeVR1cGxlX0dldEl0ZW0oc2FtcHMsIGNoYW4pLAotCQkJCQkgICAgICAiaWk6cmF0ZWN2IiwmcHJldl9pW2NoYW5dLCZjdXJfaVtjaGFuXSkpCi0JCQkJZ290byBleGl0OwotCQl9Ci0JfQorICAgICAgICBpZiAoc3RhdGUgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIGQgPSAtb3V0cmF0ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaU8hO2F1ZGlvb3AucmF0ZWN2OiBpbGxlZ2FsIHN0YXRlIGFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQsICZQeVR1cGxlX1R5cGUsICZzYW1wcykpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZShzYW1wcykgIT0gbmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHN0YXRlIGFyZ3VtZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKFB5VHVwbGVfR2V0SXRlbShzYW1wcywgY2hhbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlpOnJhdGVjdiIsJnByZXZfaVtjaGFuXSwmY3VyX2lbY2hhbl0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkvKiBzdHIgPC0gU3BhY2UgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAqLwotCXsKLQkJLyogVGhlcmUgYXJlIGxlbiBpbnB1dCBmcmFtZXMsIHNvIHdlIG5lZWQgKG1hdGhlbWF0aWNhbGx5KQotCQkgICBjZWlsaW5nKGxlbipvdXRyYXRlL2lucmF0ZSkgb3V0cHV0IGZyYW1lcywgYW5kIGVhY2ggZnJhbWUKLQkJICAgcmVxdWlyZXMgYnl0ZXNfcGVyX2ZyYW1lIGJ5dGVzLiAgQ29tcHV0aW5nIHRoaXMKLQkJICAgd2l0aG91dCBzcHVyaW91cyBvdmVyZmxvdyBpcyB0aGUgY2hhbGxlbmdlOyB3ZSBjYW4KLQkJICAgc2V0dGxlIGZvciBhIHJlYXNvbmFibGUgdXBwZXIgYm91bmQsIHRob3VnaC4gKi8KLQkJaW50IGNlaWxpbmc7ICAgLyogdGhlIG51bWJlciBvZiBvdXRwdXQgZnJhbWVzICovCi0JCWludCBuYnl0ZXM7ICAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIG5lZWRlZCAqLwotCQlpbnQgcSA9IGxlbiAvIGlucmF0ZTsKLQkJLyogTm93IGxlbiA9IHEgKiBpbnJhdGUgKyByIGV4YWN0bHkgKHdpdGggciA9IGxlbiAlIGlucmF0ZSksCi0JCSAgIGFuZCB0aGlzIGlzIGxlc3MgdGhhbiBxICogaW5yYXRlICsgaW5yYXRlID0gKHErMSkqaW5yYXRlLgotCQkgICBTbyBhIHJlYXNvbmFibGUgdXBwZXIgYm91bmQgb24gbGVuKm91dHJhdGUvaW5yYXRlIGlzCi0JCSAgICgocSsxKSppbnJhdGUpKm91dHJhdGUvaW5yYXRlID0KLQkJICAgKHErMSkqb3V0cmF0ZS4KLQkJKi8KLQkJY2VpbGluZyA9IChxKzEpICogb3V0cmF0ZTsKLQkJbmJ5dGVzID0gY2VpbGluZyAqIGJ5dGVzX3Blcl9mcmFtZTsKLQkJLyogU2VlIHdoZXRoZXIgYW55dGhpbmcgb3ZlcmZsb3dlZDsgaWYgbm90LCBnZXQgdGhlIHNwYWNlLiAqLwotCQlpZiAocSsxIDwgMCB8fAotCQkgICAgY2VpbGluZyAvIG91dHJhdGUgIT0gcSsxIHx8Ci0JCSAgICBuYnl0ZXMgLyBieXRlc19wZXJfZnJhbWUgIT0gY2VpbGluZykKLQkJCXN0ciA9IE5VTEw7Ci0JCWVsc2UKLQkJCXN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ieXRlcyk7CisgICAgICAgIC8qIHN0ciA8LSBTcGFjZSBmb3IgdGhlIG91dHB1dCBidWZmZXIuICovCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUaGVyZSBhcmUgbGVuIGlucHV0IGZyYW1lcywgc28gd2UgbmVlZCAobWF0aGVtYXRpY2FsbHkpCisgICAgICAgICAgICAgICAgICAgY2VpbGluZyhsZW4qb3V0cmF0ZS9pbnJhdGUpIG91dHB1dCBmcmFtZXMsIGFuZCBlYWNoIGZyYW1lCisgICAgICAgICAgICAgICAgICAgcmVxdWlyZXMgYnl0ZXNfcGVyX2ZyYW1lIGJ5dGVzLiAgQ29tcHV0aW5nIHRoaXMKKyAgICAgICAgICAgICAgICAgICB3aXRob3V0IHNwdXJpb3VzIG92ZXJmbG93IGlzIHRoZSBjaGFsbGVuZ2U7IHdlIGNhbgorICAgICAgICAgICAgICAgICAgIHNldHRsZSBmb3IgYSByZWFzb25hYmxlIHVwcGVyIGJvdW5kLCB0aG91Z2guICovCisgICAgICAgICAgICAgICAgaW50IGNlaWxpbmc7ICAgLyogdGhlIG51bWJlciBvZiBvdXRwdXQgZnJhbWVzICovCisgICAgICAgICAgICAgICAgaW50IG5ieXRlczsgICAgLyogdGhlIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgbmVlZGVkICovCisgICAgICAgICAgICAgICAgaW50IHEgPSBsZW4gLyBpbnJhdGU7CisgICAgICAgICAgICAgICAgLyogTm93IGxlbiA9IHEgKiBpbnJhdGUgKyByIGV4YWN0bHkgKHdpdGggciA9IGxlbiAlIGlucmF0ZSksCisgICAgICAgICAgICAgICAgICAgYW5kIHRoaXMgaXMgbGVzcyB0aGFuIHEgKiBpbnJhdGUgKyBpbnJhdGUgPSAocSsxKSppbnJhdGUuCisgICAgICAgICAgICAgICAgICAgU28gYSByZWFzb25hYmxlIHVwcGVyIGJvdW5kIG9uIGxlbipvdXRyYXRlL2lucmF0ZSBpcworICAgICAgICAgICAgICAgICAgICgocSsxKSppbnJhdGUpKm91dHJhdGUvaW5yYXRlID0KKyAgICAgICAgICAgICAgICAgICAocSsxKSpvdXRyYXRlLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgY2VpbGluZyA9IChxKzEpICogb3V0cmF0ZTsKKyAgICAgICAgICAgICAgICBuYnl0ZXMgPSBjZWlsaW5nICogYnl0ZXNfcGVyX2ZyYW1lOworICAgICAgICAgICAgICAgIC8qIFNlZSB3aGV0aGVyIGFueXRoaW5nIG92ZXJmbG93ZWQ7IGlmIG5vdCwgZ2V0IHRoZSBzcGFjZS4gKi8KKyAgICAgICAgICAgICAgICBpZiAocSsxIDwgMCB8fAorICAgICAgICAgICAgICAgICAgICBjZWlsaW5nIC8gb3V0cmF0ZSAhPSBxKzEgfHwKKyAgICAgICAgICAgICAgICAgICAgbmJ5dGVzIC8gYnl0ZXNfcGVyX2ZyYW1lICE9IGNlaWxpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBOVUxMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ieXRlcyk7CiAKLQkJaWYgKHN0ciA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0JCQkJIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0JbmNwID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5jcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CiAKLQlmb3IgKDs7KSB7Ci0JCXdoaWxlIChkIDwgMCkgewotCQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQkJc2FtcHMgPSBQeVR1cGxlX05ldyhuY2hhbm5lbHMpOwotCQkJCWlmIChzYW1wcyA9PSBOVUxMKQotCQkJCQlnb3RvIGV4aXQ7Ci0JCQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKQotCQkJCQlQeVR1cGxlX1NldEl0ZW0oc2FtcHMsIGNoYW4sCi0JCQkJCQlQeV9CdWlsZFZhbHVlKCIoaWkpIiwKLQkJCQkJCQkgICAgICBwcmV2X2lbY2hhbl0sCi0JCQkJCQkJICAgICAgY3VyX2lbY2hhbl0pKTsKLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJZ290byBleGl0OwotCQkJCS8qIFdlIGhhdmUgY2hlY2tlZCBiZWZvcmUgdGhhdCB0aGUgbGVuZ3RoCi0JCQkJICogb2YgdGhlIHN0cmluZyBmaXRzIGludG8gaW50LiAqLwotCQkJCWxlbiA9IChpbnQpKG5jcCAtIFB5U3RyaW5nX0FzU3RyaW5nKHN0cikpOwotCQkJCWlmIChsZW4gPT0gMCkgewotCQkJCQkvKmRvbid0IHdhbnQgdG8gcmVzaXplIHRvIHplcm8gbGVuZ3RoKi8KLQkJCQkJcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0JCQkJCVB5X0RFQ1JFRihzdHIpOwotCQkJCQlzdHIgPSBydjsKLQkJCQl9IGVsc2UgaWYgKF9QeVN0cmluZ19SZXNpemUoJnN0ciwgbGVuKSA8IDApCi0JCQkJCWdvdG8gZXhpdDsKLQkJCQlydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlPKSkiLCBzdHIsIGQsIHNhbXBzKTsKLQkJCQlQeV9ERUNSRUYoc2FtcHMpOwotCQkJCVB5X0RFQ1JFRihzdHIpOwotCQkJCWdvdG8gZXhpdDsgLyogcmV0dXJuIHJ2ICovCi0JCQl9Ci0JCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKLQkJCQlwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXTsKLQkJCQlpZiAoc2l6ZSA9PSAxKQotCQkJCSAgICBjdXJfaVtjaGFuXSA9ICgoaW50KSpDSEFSUChjcCwgMCkpIDw8IDg7Ci0JCQkJZWxzZSBpZiAoc2l6ZSA9PSAyKQotCQkJCSAgICBjdXJfaVtjaGFuXSA9IChpbnQpKlNIT1JUUChjcCwgMCk7Ci0JCQkJZWxzZSBpZiAoc2l6ZSA9PSA0KQotCQkJCSAgICBjdXJfaVtjaGFuXSA9ICgoaW50KSpMT05HUChjcCwgMCkpID4+IDE2OwotCQkJCWNwICs9IHNpemU7Ci0JCQkJLyogaW1wbGVtZW50cyBhIHNpbXBsZSBkaWdpdGFsIGZpbHRlciAqLwotCQkJCWN1cl9pW2NoYW5dID0KLQkJCQkJKHdlaWdodEEgKiBjdXJfaVtjaGFuXSArCi0JCQkJCSB3ZWlnaHRCICogcHJldl9pW2NoYW5dKSAvCi0JCQkJCSh3ZWlnaHRBICsgd2VpZ2h0Qik7Ci0JCQl9Ci0JCQlsZW4tLTsKLQkJCWQgKz0gb3V0cmF0ZTsKLQkJfQotCQl3aGlsZSAoZCA+PSAwKSB7Ci0JCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKLQkJCQljdXJfbyA9IChwcmV2X2lbY2hhbl0gKiBkICsKLQkJCQkJIGN1cl9pW2NoYW5dICogKG91dHJhdGUgLSBkKSkgLwotCQkJCQlvdXRyYXRlOwotCQkJCWlmIChzaXplID09IDEpCi0JCQkJICAgICpDSEFSUChuY3AsIDApID0gKHNpZ25lZCBjaGFyKShjdXJfbyA+PiA4KTsKLQkJCQllbHNlIGlmIChzaXplID09IDIpCi0JCQkJICAgICpTSE9SVFAobmNwLCAwKSA9IChzaG9ydCkoY3VyX28pOwotCQkJCWVsc2UgaWYgKHNpemUgPT0gNCkKLQkJCQkgICAgKkxPTkdQKG5jcCwgMCkgPSAoUHlfSW50MzIpKGN1cl9vPDwxNik7Ci0JCQkJbmNwICs9IHNpemU7Ci0JCQl9Ci0JCQlkIC09IGlucmF0ZTsKLQkJfQotCX0KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIHdoaWxlIChkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBzID0gUHlUdXBsZV9OZXcobmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhbXBzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHNhbXBzLCBjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgiKGlpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfaVtjaGFuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIGNoZWNrZWQgYmVmb3JlIHRoYXQgdGhlIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgc3RyaW5nIGZpdHMgaW50byBpbnQuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IChpbnQpKG5jcCAtIFB5U3RyaW5nX0FzU3RyaW5nKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmRvbid0IHdhbnQgdG8gcmVzaXplIHRvIHplcm8gbGVuZ3RoKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCIiLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBydjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfUHlTdHJpbmdfUmVzaXplKCZzdHIsIGxlbikgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpTykpIiwgc3RyLCBkLCBzYW1wcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzYW1wcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7IC8qIHJldHVybiBydiAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfaVtjaGFuXSA9IGN1cl9pW2NoYW5dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqQ0hBUlAoY3AsIDApKSA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9IChpbnQpKlNIT1JUUChjcCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0gKChpbnQpKkxPTkdQKGNwLCAwKSkgPj4gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwICs9IHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltcGxlbWVudHMgYSBzaW1wbGUgZGlnaXRhbCBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZWlnaHRBICogY3VyX2lbY2hhbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRCICogcHJldl9pW2NoYW5dKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdlaWdodEEgKyB3ZWlnaHRCKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBvdXRyYXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX28gPSAocHJldl9pW2NoYW5dICogZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dICogKG91dHJhdGUgLSBkKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQ0hBUlAobmNwLCAwKSA9IChzaWduZWQgY2hhcikoY3VyX28gPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTSE9SVFAobmNwLCAwKSA9IChzaG9ydCkoY3VyX28pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTE9OR1AobmNwLCAwKSA9IChQeV9JbnQzMikoY3VyX288PDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNwICs9IHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkIC09IGlucmF0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KICAgZXhpdDoKLQlpZiAocHJldl9pICE9IE5VTEwpCi0JCWZyZWUocHJldl9pKTsKLQlpZiAoY3VyX2kgIT0gTlVMTCkKLQkJZnJlZShjdXJfaSk7Ci0JcmV0dXJuIHJ2OworICAgICAgICBpZiAocHJldl9pICE9IE5VTEwpCisgICAgICAgICAgICAgICAgZnJlZShwcmV2X2kpOworICAgICAgICBpZiAoY3VyX2kgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBmcmVlKGN1cl9pKTsKKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9saW4ydWxhdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCXVuc2lnbmVkIGNoYXIgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaTsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLAotCQkJICAmY3AsICZsZW4sICZzaXplKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vc2l6ZSk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuL3NpemUpOworICAgICAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKICAgICAKLQlmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKIAotCQkqbmNwKysgPSBzdF9saW5lYXJfdG9fdWxhdyh2YWwpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgICAgICAgICAgICAgKm5jcCsrID0gc3RfMTRsaW5lYXIydWxhdyh2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfdWxhdzJsaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgKmNwOwotCXVuc2lnbmVkIGNoYXIgY3ZhbDsKLQlzaWduZWQgY2hhciAqbmNwOwotCWludCBsZW4sIHNpemUsIHZhbDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgICAgICB1bnNpZ25lZCBjaGFyIGN2YWw7CisgICAgICAgIHNpZ25lZCBjaGFyICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbDsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworICAgICAgICBpbnQgaTsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsCi0JCQkgICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCWlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbipzaXplKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKnNpemUpOworICAgICAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuKnNpemU7IGkgKz0gc2l6ZSApIHsKLQkJY3ZhbCA9ICpjcCsrOwotCQl2YWwgPSBzdF91bGF3X3RvX2xpbmVhcihjdmFsKTsKLQkKLQkJaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFsPDwxNik7Ci0JfQotCXJldHVybiBydjsKKyAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuKnNpemU7IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBjdmFsID0gKmNwKys7CisgICAgICAgICAgICAgICAgdmFsID0gc3RfdWxhdzJsaW5lYXIxNihjdmFsKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbDw8MTYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2F1ZGlvb3BfbGluMmFsYXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgICAgICBzaWduZWQgY2hhciAqY3A7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIAorICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi9zaXplKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgCisgICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKworICAgICAgICAgICAgICAgICpuY3ArKyA9IHN0X2xpbmVhcjJhbGF3KHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OworfQorCitzdGF0aWMgUHlPYmplY3QgKgorYXVkaW9vcF9hbGF3MmxpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgICAgICB1bnNpZ25lZCBjaGFyIGN2YWw7CisgICAgICAgIHNpZ25lZCBjaGFyICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbDsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIAorICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbipzaXplKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIAorICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW4qc2l6ZTsgaSArPSBzaXplICkgeworICAgICAgICAgICAgICAgIGN2YWwgPSAqY3ArKzsKKyAgICAgICAgICAgICAgICB2YWwgPSBzdF9hbGF3MmxpbmVhcjE2KGN2YWwpOworICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFsPDwxNik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9saW4yYWRwY20oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQlzaWduZWQgY2hhciAqbmNwOwotCWludCBsZW4sIHNpemUsIHZhbCA9IDAsIHN0ZXAsIHZhbHByZWQsIGRlbHRhLAotCQlpbmRleCwgc2lnbiwgdnBkaWZmLCBkaWZmOwotCVB5T2JqZWN0ICpydiwgKnN0YXRlLCAqc3RyOwotCWludCBpLCBvdXRwdXRidWZmZXIgPSAwLCBidWZmZXJzdGVwOworICAgICAgICBzaWduZWQgY2hhciAqY3A7CisgICAgICAgIHNpZ25lZCBjaGFyICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDAsIHN0ZXAsIHZhbHByZWQsIGRlbHRhLAorICAgICAgICAgICAgICAgIGluZGV4LCBzaWduLCB2cGRpZmYsIGRpZmY7CisgICAgICAgIFB5T2JqZWN0ICpydiwgKnN0YXRlLCAqc3RyOworICAgICAgICBpbnQgaSwgb3V0cHV0YnVmZmVyID0gMCwgYnVmZmVyc3RlcDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpTykiLAotCQkJICAmY3AsICZsZW4sICZzaXplLCAmc3RhdGUpICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmc3RhdGUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAKIAotCWlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAKLQlzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vKHNpemUqMikpOwotCWlmICggc3RyID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhzdHIpOworICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vKHNpemUqMikpOworICAgICAgICBpZiAoIHN0ciA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKIAotCS8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLwotCWlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKLQkJLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLwotCQl2YWxwcmVkID0gMDsKLQkJc3RlcCA9IDc7Ci0JCWluZGV4ID0gMDsKLQl9IGVsc2UgaWYgKCAhUHlBcmdfUGFyc2Uoc3RhdGUsICIoaWkpIiwgJnZhbHByZWQsICZpbmRleCkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgLyogRGVjb2RlIHN0YXRlLCBzaG91bGQgaGF2ZSAodmFsdWUsIHN0ZXApICovCisgICAgICAgIGlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgICAgICAgICAvKiBGaXJzdCB0aW1lLCBpdCBzZWVtcy4gU2V0IGRlZmF1bHRzICovCisgICAgICAgICAgICAgICAgdmFscHJlZCA9IDA7CisgICAgICAgICAgICAgICAgc3RlcCA9IDc7CisgICAgICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICB9IGVsc2UgaWYgKCAhUHlBcmdfUGFyc2Uoc3RhdGUsICIoaWkpIiwgJnZhbHByZWQsICZpbmRleCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0Jc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOwotCWJ1ZmZlcnN0ZXAgPSAxOworICAgICAgICBzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07CisgICAgICAgIGJ1ZmZlcnN0ZXAgPSAxOwogCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CiAKLQkJLyogU3RlcCAxIC0gY29tcHV0ZSBkaWZmZXJlbmNlIHdpdGggcHJldmlvdXMgdmFsdWUgKi8KLQkJZGlmZiA9IHZhbCAtIHZhbHByZWQ7Ci0JCXNpZ24gPSAoZGlmZiA8IDApID8gOCA6IDA7Ci0JCWlmICggc2lnbiApIGRpZmYgPSAoLWRpZmYpOworICAgICAgICAgICAgICAgIC8qIFN0ZXAgMSAtIGNvbXB1dGUgZGlmZmVyZW5jZSB3aXRoIHByZXZpb3VzIHZhbHVlICovCisgICAgICAgICAgICAgICAgZGlmZiA9IHZhbCAtIHZhbHByZWQ7CisgICAgICAgICAgICAgICAgc2lnbiA9IChkaWZmIDwgMCkgPyA4IDogMDsKKyAgICAgICAgICAgICAgICBpZiAoIHNpZ24gKSBkaWZmID0gKC1kaWZmKTsKIAotCQkvKiBTdGVwIDIgLSBEaXZpZGUgYW5kIGNsYW1wICovCi0JCS8qIE5vdGU6Ci0JCSoqIFRoaXMgY29kZSAqYXBwcm94aW1hdGVseSogY29tcHV0ZXM6Ci0JCSoqICAgIGRlbHRhID0gZGlmZio0L3N0ZXA7Ci0JCSoqICAgIHZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNDsKLQkJKiogYnV0IGluIHNoaWZ0IHN0ZXAgYml0cyBhcmUgZHJvcHBlZC4gVGhlIG5ldCByZXN1bHQgb2YgdGhpcwotCQkqKiBpcyB0aGF0IGV2ZW4gaWYgeW91IGhhdmUgZmFzdCBtdWwvZGl2IGhhcmR3YXJlIHlvdSBjYW5ub3QKLQkJKiogcHV0IGl0IHRvIGdvb2QgdXNlIHNpbmNlIHRoZSBmaXh1cCB3b3VsZCBiZSB0b28gZXhwZW5zaXZlLgotCQkqLwotCQlkZWx0YSA9IDA7Ci0JCXZwZGlmZiA9IChzdGVwID4+IDMpOwotCQotCQlpZiAoIGRpZmYgPj0gc3RlcCApIHsKLQkJCWRlbHRhID0gNDsKLQkJCWRpZmYgLT0gc3RlcDsKLQkJCXZwZGlmZiArPSBzdGVwOwotCQl9Ci0JCXN0ZXAgPj49IDE7Ci0JCWlmICggZGlmZiA+PSBzdGVwICApIHsKLQkJCWRlbHRhIHw9IDI7Ci0JCQlkaWZmIC09IHN0ZXA7Ci0JCQl2cGRpZmYgKz0gc3RlcDsKLQkJfQotCQlzdGVwID4+PSAxOwotCQlpZiAoIGRpZmYgPj0gc3RlcCApIHsKLQkJCWRlbHRhIHw9IDE7Ci0JCQl2cGRpZmYgKz0gc3RlcDsKLQkJfQorICAgICAgICAgICAgICAgIC8qIFN0ZXAgMiAtIERpdmlkZSBhbmQgY2xhbXAgKi8KKyAgICAgICAgICAgICAgICAvKiBOb3RlOgorICAgICAgICAgICAgICAgICoqIFRoaXMgY29kZSAqYXBwcm94aW1hdGVseSogY29tcHV0ZXM6CisgICAgICAgICAgICAgICAgKiogICAgZGVsdGEgPSBkaWZmKjQvc3RlcDsKKyAgICAgICAgICAgICAgICAqKiAgICB2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQ7CisgICAgICAgICAgICAgICAgKiogYnV0IGluIHNoaWZ0IHN0ZXAgYml0cyBhcmUgZHJvcHBlZC4gVGhlIG5ldCByZXN1bHQgb2YgdGhpcworICAgICAgICAgICAgICAgICoqIGlzIHRoYXQgZXZlbiBpZiB5b3UgaGF2ZSBmYXN0IG11bC9kaXYgaGFyZHdhcmUgeW91IGNhbm5vdAorICAgICAgICAgICAgICAgICoqIHB1dCBpdCB0byBnb29kIHVzZSBzaW5jZSB0aGUgZml4dXAgd291bGQgYmUgdG9vIGV4cGVuc2l2ZS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGRlbHRhID0gMDsKKyAgICAgICAgICAgICAgICB2cGRpZmYgPSAoc3RlcCA+PiAzKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBkaWZmID49IHN0ZXAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWZmIC09IHN0ZXA7CisgICAgICAgICAgICAgICAgICAgICAgICB2cGRpZmYgKz0gc3RlcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RlcCA+Pj0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIGRpZmYgPj0gc3RlcCAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSB8PSAyOworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiAtPSBzdGVwOworICAgICAgICAgICAgICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZXAgPj49IDE7CisgICAgICAgICAgICAgICAgaWYgKCBkaWZmID49IHN0ZXAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSB8PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgfQogCi0JCS8qIFN0ZXAgMyAtIFVwZGF0ZSBwcmV2aW91cyB2YWx1ZSAqLwotCQlpZiAoIHNpZ24gKQotCQkJdmFscHJlZCAtPSB2cGRpZmY7Ci0JCWVsc2UKLQkJCXZhbHByZWQgKz0gdnBkaWZmOworICAgICAgICAgICAgICAgIC8qIFN0ZXAgMyAtIFVwZGF0ZSBwcmV2aW91cyB2YWx1ZSAqLworICAgICAgICAgICAgICAgIGlmICggc2lnbiApCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkIC09IHZwZGlmZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkICs9IHZwZGlmZjsKIAotCQkvKiBTdGVwIDQgLSBDbGFtcCBwcmV2aW91cyB2YWx1ZSB0byAxNiBiaXRzICovCi0JCWlmICggdmFscHJlZCA+IDMyNzY3ICkKLQkJCXZhbHByZWQgPSAzMjc2NzsKLQkJZWxzZSBpZiAoIHZhbHByZWQgPCAtMzI3NjggKQotCQkJdmFscHJlZCA9IC0zMjc2ODsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDQgLSBDbGFtcCBwcmV2aW91cyB2YWx1ZSB0byAxNiBiaXRzICovCisgICAgICAgICAgICAgICAgaWYgKCB2YWxwcmVkID4gMzI3NjcgKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCA9IDMyNzY3OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAtMzI3Njg7CiAKLQkJLyogU3RlcCA1IC0gQXNzZW1ibGUgdmFsdWUsIHVwZGF0ZSBpbmRleCBhbmQgc3RlcCB2YWx1ZXMgKi8KLQkJZGVsdGEgfD0gc2lnbjsKLQkKLQkJaW5kZXggKz0gaW5kZXhUYWJsZVtkZWx0YV07Ci0JCWlmICggaW5kZXggPCAwICkgaW5kZXggPSAwOwotCQlpZiAoIGluZGV4ID4gODggKSBpbmRleCA9IDg4OwotCQlzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07CisgICAgICAgICAgICAgICAgLyogU3RlcCA1IC0gQXNzZW1ibGUgdmFsdWUsIHVwZGF0ZSBpbmRleCBhbmQgc3RlcCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICBkZWx0YSB8PSBzaWduOworICAgICAgICAKKyAgICAgICAgICAgICAgICBpbmRleCArPSBpbmRleFRhYmxlW2RlbHRhXTsKKyAgICAgICAgICAgICAgICBpZiAoIGluZGV4IDwgMCApIGluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIGluZGV4ID4gODggKSBpbmRleCA9IDg4OworICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKIAotCQkvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KLQkJaWYgKCBidWZmZXJzdGVwICkgewotCQkJb3V0cHV0YnVmZmVyID0gKGRlbHRhIDw8IDQpICYgMHhmMDsKLQkJfSBlbHNlIHsKLQkJCSpuY3ArKyA9IChkZWx0YSAmIDB4MGYpIHwgb3V0cHV0YnVmZmVyOwotCQl9Ci0JCWJ1ZmZlcnN0ZXAgPSAhYnVmZmVyc3RlcDsKLQl9Ci0JcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpaSkpIiwgc3RyLCB2YWxwcmVkLCBpbmRleCk7Ci0JUHlfREVDUkVGKHN0cik7Ci0JcmV0dXJuIHJ2OworICAgICAgICAgICAgICAgIC8qIFN0ZXAgNiAtIE91dHB1dCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIGlmICggYnVmZmVyc3RlcCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dGJ1ZmZlciA9IChkZWx0YSA8PCA0KSAmIDB4ZjA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpuY3ArKyA9IChkZWx0YSAmIDB4MGYpIHwgb3V0cHV0YnVmZmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZmZXJzdGVwID0gIWJ1ZmZlcnN0ZXA7CisgICAgICAgIH0KKyAgICAgICAgcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpaSkpIiwgc3RyLCB2YWxwcmVkLCBpbmRleCk7CisgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2FkcGNtMmxpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCXNpZ25lZCBjaGFyICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFscHJlZCwgc3RlcCwgZGVsdGEsIGluZGV4LCBzaWduLCB2cGRpZmY7Ci0JUHlPYmplY3QgKnJ2LCAqc3RyLCAqc3RhdGU7Ci0JaW50IGksIGlucHV0YnVmZmVyID0gMCwgYnVmZmVyc3RlcDsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBzaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWxwcmVkLCBzdGVwLCBkZWx0YSwgaW5kZXgsIHNpZ24sIHZwZGlmZjsKKyAgICAgICAgUHlPYmplY3QgKnJ2LCAqc3RyLCAqc3RhdGU7CisgICAgICAgIGludCBpLCBpbnB1dGJ1ZmZlciA9IDAsIGJ1ZmZlcnN0ZXA7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaU8pIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JLyogRGVjb2RlIHN0YXRlLCBzaG91bGQgaGF2ZSAodmFsdWUsIHN0ZXApICovCi0JaWYgKCBzdGF0ZSA9PSBQeV9Ob25lICkgewotCQkvKiBGaXJzdCB0aW1lLCBpdCBzZWVtcy4gU2V0IGRlZmF1bHRzICovCi0JCXZhbHByZWQgPSAwOwotCQlzdGVwID0gNzsKLQkJaW5kZXggPSAwOwotCX0gZWxzZSBpZiAoICFQeUFyZ19QYXJzZShzdGF0ZSwgIihpaSkiLCAmdmFscHJlZCwgJmluZGV4KSApCi0JCXJldHVybiAwOworICAgICAgICAvKiBEZWNvZGUgc3RhdGUsIHNob3VsZCBoYXZlICh2YWx1ZSwgc3RlcCkgKi8KKyAgICAgICAgaWYgKCBzdGF0ZSA9PSBQeV9Ob25lICkgeworICAgICAgICAgICAgICAgIC8qIEZpcnN0IHRpbWUsIGl0IHNlZW1zLiBTZXQgZGVmYXVsdHMgKi8KKyAgICAgICAgICAgICAgICB2YWxwcmVkID0gMDsKKyAgICAgICAgICAgICAgICBzdGVwID0gNzsKKyAgICAgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoICFQeUFyZ19QYXJzZShzdGF0ZSwgIihpaSkiLCAmdmFscHJlZCwgJmluZGV4KSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgCi0Jc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKnNpemUqMik7Ci0JaWYgKCBzdHIgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CisgICAgICAgIHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbipzaXplKjIpOworICAgICAgICBpZiAoIHN0ciA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKIAotCXN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKLQlidWZmZXJzdGVwID0gMDsKKyAgICAgICAgc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOworICAgICAgICBidWZmZXJzdGVwID0gMDsKICAgICAKLQlmb3IgKCBpPTA7IGkgPCBsZW4qc2l6ZSoyOyBpICs9IHNpemUgKSB7Ci0JCS8qIFN0ZXAgMSAtIGdldCB0aGUgZGVsdGEgdmFsdWUgYW5kIGNvbXB1dGUgbmV4dCBpbmRleCAqLwotCQlpZiAoIGJ1ZmZlcnN0ZXAgKSB7Ci0JCQlkZWx0YSA9IGlucHV0YnVmZmVyICYgMHhmOwotCQl9IGVsc2UgewotCQkJaW5wdXRidWZmZXIgPSAqY3ArKzsKLQkJCWRlbHRhID0gKGlucHV0YnVmZmVyID4+IDQpICYgMHhmOwotCQl9CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbipzaXplKjI7IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDEgLSBnZXQgdGhlIGRlbHRhIHZhbHVlIGFuZCBjb21wdXRlIG5leHQgaW5kZXggKi8KKyAgICAgICAgICAgICAgICBpZiAoIGJ1ZmZlcnN0ZXAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGlucHV0YnVmZmVyICYgMHhmOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dGJ1ZmZlciA9ICpjcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAoaW5wdXRidWZmZXIgPj4gNCkgJiAweGY7CisgICAgICAgICAgICAgICAgfQogCi0JCWJ1ZmZlcnN0ZXAgPSAhYnVmZmVyc3RlcDsKKyAgICAgICAgICAgICAgICBidWZmZXJzdGVwID0gIWJ1ZmZlcnN0ZXA7CiAKLQkJLyogU3RlcCAyIC0gRmluZCBuZXcgaW5kZXggdmFsdWUgKGZvciBsYXRlcikgKi8KLQkJaW5kZXggKz0gaW5kZXhUYWJsZVtkZWx0YV07Ci0JCWlmICggaW5kZXggPCAwICkgaW5kZXggPSAwOwotCQlpZiAoIGluZGV4ID4gODggKSBpbmRleCA9IDg4OworICAgICAgICAgICAgICAgIC8qIFN0ZXAgMiAtIEZpbmQgbmV3IGluZGV4IHZhbHVlIChmb3IgbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaW5kZXggKz0gaW5kZXhUYWJsZVtkZWx0YV07CisgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA8IDAgKSBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA+IDg4ICkgaW5kZXggPSA4ODsKIAotCQkvKiBTdGVwIDMgLSBTZXBhcmF0ZSBzaWduIGFuZCBtYWduaXR1ZGUgKi8KLQkJc2lnbiA9IGRlbHRhICYgODsKLQkJZGVsdGEgPSBkZWx0YSAmIDc7CisgICAgICAgICAgICAgICAgLyogU3RlcCAzIC0gU2VwYXJhdGUgc2lnbiBhbmQgbWFnbml0dWRlICovCisgICAgICAgICAgICAgICAgc2lnbiA9IGRlbHRhICYgODsKKyAgICAgICAgICAgICAgICBkZWx0YSA9IGRlbHRhICYgNzsKIAotCQkvKiBTdGVwIDQgLSBDb21wdXRlIGRpZmZlcmVuY2UgYW5kIG5ldyBwcmVkaWN0ZWQgdmFsdWUgKi8KLQkJLyoKLQkJKiogQ29tcHV0ZXMgJ3ZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNCcsIGJ1dCBzZWUgY29tbWVudAotCQkqKiBpbiBhZHBjbV9jb2Rlci4KLQkJKi8KLQkJdnBkaWZmID0gc3RlcCA+PiAzOwotCQlpZiAoIGRlbHRhICYgNCApIHZwZGlmZiArPSBzdGVwOwotCQlpZiAoIGRlbHRhICYgMiApIHZwZGlmZiArPSBzdGVwPj4xOwotCQlpZiAoIGRlbHRhICYgMSApIHZwZGlmZiArPSBzdGVwPj4yOworICAgICAgICAgICAgICAgIC8qIFN0ZXAgNCAtIENvbXB1dGUgZGlmZmVyZW5jZSBhbmQgbmV3IHByZWRpY3RlZCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgKiogQ29tcHV0ZXMgJ3ZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNCcsIGJ1dCBzZWUgY29tbWVudAorICAgICAgICAgICAgICAgICoqIGluIGFkcGNtX2NvZGVyLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdnBkaWZmID0gc3RlcCA+PiAzOworICAgICAgICAgICAgICAgIGlmICggZGVsdGEgJiA0ICkgdnBkaWZmICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgaWYgKCBkZWx0YSAmIDIgKSB2cGRpZmYgKz0gc3RlcD4+MTsKKyAgICAgICAgICAgICAgICBpZiAoIGRlbHRhICYgMSApIHZwZGlmZiArPSBzdGVwPj4yOwogCi0JCWlmICggc2lnbiApCi0JCQl2YWxwcmVkIC09IHZwZGlmZjsKLQkJZWxzZQotCQkJdmFscHJlZCArPSB2cGRpZmY7CisgICAgICAgICAgICAgICAgaWYgKCBzaWduICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgLT0gdnBkaWZmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgKz0gdnBkaWZmOwogCi0JCS8qIFN0ZXAgNSAtIGNsYW1wIG91dHB1dCB2YWx1ZSAqLwotCQlpZiAoIHZhbHByZWQgPiAzMjc2NyApCi0JCQl2YWxwcmVkID0gMzI3Njc7Ci0JCWVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKLQkJCXZhbHByZWQgPSAtMzI3Njg7CisgICAgICAgICAgICAgICAgLyogU3RlcCA1IC0gY2xhbXAgb3V0cHV0IHZhbHVlICovCisgICAgICAgICAgICAgICAgaWYgKCB2YWxwcmVkID4gMzI3NjcgKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCA9IDMyNzY3OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAtMzI3Njg7CiAKLQkJLyogU3RlcCA2IC0gVXBkYXRlIHN0ZXAgdmFsdWUgKi8KLQkJc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOworICAgICAgICAgICAgICAgIC8qIFN0ZXAgNiAtIFVwZGF0ZSBzdGVwIHZhbHVlICovCisgICAgICAgICAgICAgICAgc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOwogCi0JCS8qIFN0ZXAgNiAtIE91dHB1dCB2YWx1ZSAqLwotCQlpZiAoIHNpemUgPT0gMSApICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWxwcmVkID4+IDgpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWxwcmVkKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWxwcmVkPDwxNik7Ci0JfQorICAgICAgICAgICAgICAgIC8qIFN0ZXAgNiAtIE91dHB1dCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbHByZWQgPj4gOCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFscHJlZCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWxwcmVkPDwxNik7CisgICAgICAgIH0KIAotCXJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaWkpKSIsIHN0ciwgdmFscHJlZCwgaW5kZXgpOwotCVB5X0RFQ1JFRihzdHIpOwotCXJldHVybiBydjsKKyAgICAgICAgcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpaSkpIiwgc3RyLCB2YWxwcmVkLCBpbmRleCk7CisgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBhdWRpb29wX21ldGhvZHNbXSA9IHsKLQl7ICJtYXgiLCBhdWRpb29wX21heCwgTUVUSF9PTERBUkdTIH0sCi0JeyAibWlubWF4IiwgYXVkaW9vcF9taW5tYXgsIE1FVEhfT0xEQVJHUyB9LAotCXsgImF2ZyIsIGF1ZGlvb3BfYXZnLCBNRVRIX09MREFSR1MgfSwKLQl7ICJtYXhwcCIsIGF1ZGlvb3BfbWF4cHAsIE1FVEhfT0xEQVJHUyB9LAotCXsgImF2Z3BwIiwgYXVkaW9vcF9hdmdwcCwgTUVUSF9PTERBUkdTIH0sCi0JeyAicm1zIiwgYXVkaW9vcF9ybXMsIE1FVEhfT0xEQVJHUyB9LAotCXsgImZpbmRmaXQiLCBhdWRpb29wX2ZpbmRmaXQsIE1FVEhfT0xEQVJHUyB9LAotCXsgImZpbmRtYXgiLCBhdWRpb29wX2ZpbmRtYXgsIE1FVEhfT0xEQVJHUyB9LAotCXsgImZpbmRmYWN0b3IiLCBhdWRpb29wX2ZpbmRmYWN0b3IsIE1FVEhfT0xEQVJHUyB9LAotCXsgImNyb3NzIiwgYXVkaW9vcF9jcm9zcywgTUVUSF9PTERBUkdTIH0sCi0JeyAibXVsIiwgYXVkaW9vcF9tdWwsIE1FVEhfT0xEQVJHUyB9LAotCXsgImFkZCIsIGF1ZGlvb3BfYWRkLCBNRVRIX09MREFSR1MgfSwKLQl7ICJiaWFzIiwgYXVkaW9vcF9iaWFzLCBNRVRIX09MREFSR1MgfSwKLQl7ICJ1bGF3MmxpbiIsIGF1ZGlvb3BfdWxhdzJsaW4sIE1FVEhfT0xEQVJHUyB9LAotCXsgImxpbjJ1bGF3IiwgYXVkaW9vcF9saW4ydWxhdywgTUVUSF9PTERBUkdTIH0sCi0JeyAibGluMmxpbiIsIGF1ZGlvb3BfbGluMmxpbiwgTUVUSF9PTERBUkdTIH0sCi0JeyAiYWRwY20ybGluIiwgYXVkaW9vcF9hZHBjbTJsaW4sIE1FVEhfT0xEQVJHUyB9LAotCXsgImxpbjJhZHBjbSIsIGF1ZGlvb3BfbGluMmFkcGNtLCBNRVRIX09MREFSR1MgfSwKLQl7ICJ0b21vbm8iLCBhdWRpb29wX3RvbW9ubywgTUVUSF9PTERBUkdTIH0sCi0JeyAidG9zdGVyZW8iLCBhdWRpb29wX3Rvc3RlcmVvLCBNRVRIX09MREFSR1MgfSwKLQl7ICJnZXRzYW1wbGUiLCBhdWRpb29wX2dldHNhbXBsZSwgTUVUSF9PTERBUkdTIH0sCi0JeyAicmV2ZXJzZSIsIGF1ZGlvb3BfcmV2ZXJzZSwgTUVUSF9PTERBUkdTIH0sCi0JeyAicmF0ZWN2IiwgYXVkaW9vcF9yYXRlY3YsIE1FVEhfVkFSQVJHUyB9LAotCXsgMCwgICAgICAgICAgMCB9CisgICAgICAgIHsgIm1heCIsIGF1ZGlvb3BfbWF4LCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAibWlubWF4IiwgYXVkaW9vcF9taW5tYXgsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJhdmciLCBhdWRpb29wX2F2ZywgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgIm1heHBwIiwgYXVkaW9vcF9tYXhwcCwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImF2Z3BwIiwgYXVkaW9vcF9hdmdwcCwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgInJtcyIsIGF1ZGlvb3Bfcm1zLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiZmluZGZpdCIsIGF1ZGlvb3BfZmluZGZpdCwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImZpbmRtYXgiLCBhdWRpb29wX2ZpbmRtYXgsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJmaW5kZmFjdG9yIiwgYXVkaW9vcF9maW5kZmFjdG9yLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiY3Jvc3MiLCBhdWRpb29wX2Nyb3NzLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAibXVsIiwgYXVkaW9vcF9tdWwsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJhZGQiLCBhdWRpb29wX2FkZCwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImJpYXMiLCBhdWRpb29wX2JpYXMsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJ1bGF3MmxpbiIsIGF1ZGlvb3BfdWxhdzJsaW4sIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJsaW4ydWxhdyIsIGF1ZGlvb3BfbGluMnVsYXcsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJhbGF3MmxpbiIsIGF1ZGlvb3BfYWxhdzJsaW4sIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJsaW4yYWxhdyIsIGF1ZGlvb3BfbGluMmFsYXcsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJsaW4ybGluIiwgYXVkaW9vcF9saW4ybGluLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiYWRwY20ybGluIiwgYXVkaW9vcF9hZHBjbTJsaW4sIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJsaW4yYWRwY20iLCBhdWRpb29wX2xpbjJhZHBjbSwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgInRvbW9ubyIsIGF1ZGlvb3BfdG9tb25vLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAidG9zdGVyZW8iLCBhdWRpb29wX3Rvc3RlcmVvLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiZ2V0c2FtcGxlIiwgYXVkaW9vcF9nZXRzYW1wbGUsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJyZXZlcnNlIiwgYXVkaW9vcF9yZXZlcnNlLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAicmF0ZWN2IiwgYXVkaW9vcF9yYXRlY3YsIE1FVEhfVkFSQVJHUyB9LAorICAgICAgICB7IDAsICAgICAgICAgIDAgfQogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRhdWRpb29wKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCW0gPSBQeV9Jbml0TW9kdWxlKCJhdWRpb29wIiwgYXVkaW9vcF9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JQXVkaW9vcEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhdWRpb29wLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JaWYgKEF1ZGlvb3BFcnJvciAhPSBOVUxMKQotCSAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiZXJyb3IiLEF1ZGlvb3BFcnJvcik7CisgICAgICAgIFB5T2JqZWN0ICptLCAqZDsKKyAgICAgICAgbSA9IFB5X0luaXRNb2R1bGUoImF1ZGlvb3AiLCBhdWRpb29wX21ldGhvZHMpOworICAgICAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgICAgIGlmIChkID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBBdWRpb29wRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImF1ZGlvb3AuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKEF1ZGlvb3BFcnJvciAhPSBOVUxMKQorICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsImVycm9yIixBdWRpb29wRXJyb3IpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jUGlja2xlLmMgYi9Nb2R1bGVzL2NQaWNrbGUuYwppbmRleCA3MjdkY2M5Li4xOGRmNTk5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NQaWNrbGUuYworKysgYi9Nb2R1bGVzL2NQaWNrbGUuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAgICpfX2dldHN0YXRlX19fc3RyLCAqX19zZXRzdGF0ZV9fX3N0ciwgKl9fbmFtZV9fX3N0ciwgKl9fcmVkdWNlX19fc3RyLAogICAqX19yZWR1Y2VfZXhfX19zdHIsCiAgICp3cml0ZV9zdHIsICphcHBlbmRfc3RyLAotICAqcmVhZF9zdHIsICpyZWFkbGluZV9zdHIsICpfX21haW5fX19zdHIsICpfX2Jhc2ljbmV3X19fc3RyLAorICAqcmVhZF9zdHIsICpyZWFkbGluZV9zdHIsICpfX21haW5fX19zdHIsIAogICAqY29weV9yZWdfc3RyLCAqZGlzcGF0Y2hfdGFibGVfc3RyOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjkwOSwzOCArMjkwOSwyOCBAQAogc3RhdGljIGludAogUGlja2xlcl90cmF2ZXJzZShQaWNrbGVyb2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpbnQgZXJyOwotI2RlZmluZSBWSVNJVChTTE9UKSBcCi0JaWYgKFNMT1QpIHsgXAotCQllcnIgPSB2aXNpdCgoUHlPYmplY3QgKikoU0xPVCksIGFyZyk7IFwKLQkJaWYgKGVycikgXAotCQkJcmV0dXJuIGVycjsgXAotCX0KLQlWSVNJVChzZWxmLT53cml0ZSk7Ci0JVklTSVQoc2VsZi0+bWVtbyk7Ci0JVklTSVQoc2VsZi0+ZmFzdF9tZW1vKTsKLQlWSVNJVChzZWxmLT5hcmcpOwotCVZJU0lUKHNlbGYtPmZpbGUpOwotCVZJU0lUKHNlbGYtPnBlcnNfZnVuYyk7Ci0JVklTSVQoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOwotCVZJU0lUKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKLSN1bmRlZiBWSVNJVAorCVB5X1ZJU0lUKHNlbGYtPndyaXRlKTsKKwlQeV9WSVNJVChzZWxmLT5tZW1vKTsKKwlQeV9WSVNJVChzZWxmLT5mYXN0X21lbW8pOworCVB5X1ZJU0lUKHNlbGYtPmFyZyk7CisJUHlfVklTSVQoc2VsZi0+ZmlsZSk7CisJUHlfVklTSVQoc2VsZi0+cGVyc19mdW5jKTsKKwlQeV9WSVNJVChzZWxmLT5pbnN0X3BlcnNfZnVuYyk7CisJUHlfVklTSVQoc2VsZi0+ZGlzcGF0Y2hfdGFibGUpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBQaWNrbGVyX2NsZWFyKFBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0jZGVmaW5lIENMRUFSKFNMT1QpIFB5X1hERUNSRUYoU0xPVCk7IFNMT1QgPSBOVUxMOwotCUNMRUFSKHNlbGYtPndyaXRlKTsKLQlDTEVBUihzZWxmLT5tZW1vKTsKLQlDTEVBUihzZWxmLT5mYXN0X21lbW8pOwotCUNMRUFSKHNlbGYtPmFyZyk7Ci0JQ0xFQVIoc2VsZi0+ZmlsZSk7Ci0JQ0xFQVIoc2VsZi0+cGVyc19mdW5jKTsKLQlDTEVBUihzZWxmLT5pbnN0X3BlcnNfZnVuYyk7Ci0JQ0xFQVIoc2VsZi0+ZGlzcGF0Y2hfdGFibGUpOwotI3VuZGVmIENMRUFSCisJUHlfQ0xFQVIoc2VsZi0+d3JpdGUpOworCVB5X0NMRUFSKHNlbGYtPm1lbW8pOworCVB5X0NMRUFSKHNlbGYtPmZhc3RfbWVtbyk7CisJUHlfQ0xFQVIoc2VsZi0+YXJnKTsKKwlQeV9DTEVBUihzZWxmLT5maWxlKTsKKwlQeV9DTEVBUihzZWxmLT5wZXJzX2Z1bmMpOworCVB5X0NMRUFSKHNlbGYtPmluc3RfcGVyc19mdW5jKTsKKwlQeV9DTEVBUihzZWxmLT5kaXNwYXRjaF90YWJsZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUyNjAsNDEgKzUyNTAsMzAgQEAKIHN0YXRpYyBpbnQKIFVucGlja2xlcl90cmF2ZXJzZShVbnBpY2tsZXJvYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWludCBlcnI7Ci0KLSNkZWZpbmUgVklTSVQoU0xPVCkgXAotCWlmIChTTE9UKSB7IFwKLQkJZXJyID0gdmlzaXQoKFB5T2JqZWN0ICopKFNMT1QpLCBhcmcpOyBcCi0JCWlmIChlcnIpIFwKLQkJCXJldHVybiBlcnI7IFwKLQl9Ci0JVklTSVQoc2VsZi0+cmVhZGxpbmUpOwotCVZJU0lUKHNlbGYtPnJlYWQpOwotCVZJU0lUKHNlbGYtPmZpbGUpOwotCVZJU0lUKHNlbGYtPm1lbW8pOwotCVZJU0lUKHNlbGYtPnN0YWNrKTsKLQlWSVNJVChzZWxmLT5wZXJzX2Z1bmMpOwotCVZJU0lUKHNlbGYtPmFyZyk7Ci0JVklTSVQoc2VsZi0+bGFzdF9zdHJpbmcpOwotCVZJU0lUKHNlbGYtPmZpbmRfY2xhc3MpOwotI3VuZGVmIFZJU0lUCisJUHlfVklTSVQoc2VsZi0+cmVhZGxpbmUpOworCVB5X1ZJU0lUKHNlbGYtPnJlYWQpOworCVB5X1ZJU0lUKHNlbGYtPmZpbGUpOworCVB5X1ZJU0lUKHNlbGYtPm1lbW8pOworCVB5X1ZJU0lUKHNlbGYtPnN0YWNrKTsKKwlQeV9WSVNJVChzZWxmLT5wZXJzX2Z1bmMpOworCVB5X1ZJU0lUKHNlbGYtPmFyZyk7CisJUHlfVklTSVQoc2VsZi0+bGFzdF9zdHJpbmcpOworCVB5X1ZJU0lUKHNlbGYtPmZpbmRfY2xhc3MpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBVbnBpY2tsZXJfY2xlYXIoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotI2RlZmluZSBDTEVBUihTTE9UKSBQeV9YREVDUkVGKFNMT1QpOyBTTE9UID0gTlVMTAotCUNMRUFSKHNlbGYtPnJlYWRsaW5lKTsKLQlDTEVBUihzZWxmLT5yZWFkKTsKLQlDTEVBUihzZWxmLT5maWxlKTsKLQlDTEVBUihzZWxmLT5tZW1vKTsKLQlDTEVBUihzZWxmLT5zdGFjayk7Ci0JQ0xFQVIoc2VsZi0+cGVyc19mdW5jKTsKLQlDTEVBUihzZWxmLT5hcmcpOwotCUNMRUFSKHNlbGYtPmxhc3Rfc3RyaW5nKTsKLQlDTEVBUihzZWxmLT5maW5kX2NsYXNzKTsKLSN1bmRlZiBDTEVBUgorCVB5X0NMRUFSKHNlbGYtPnJlYWRsaW5lKTsKKwlQeV9DTEVBUihzZWxmLT5yZWFkKTsKKwlQeV9DTEVBUihzZWxmLT5maWxlKTsKKwlQeV9DTEVBUihzZWxmLT5tZW1vKTsKKwlQeV9DTEVBUihzZWxmLT5zdGFjayk7CisJUHlfQ0xFQVIoc2VsZi0+cGVyc19mdW5jKTsKKwlQeV9DTEVBUihzZWxmLT5hcmcpOworCVB5X0NMRUFSKHNlbGYtPmxhc3Rfc3RyaW5nKTsKKwlQeV9DTEVBUihzZWxmLT5maW5kX2NsYXNzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTYwMiw3ICs1NTgxLDYgQEAKIAlJTklUX1NUUihyZWFkbGluZSk7CiAJSU5JVF9TVFIoY29weV9yZWcpOwogCUlOSVRfU1RSKGRpc3BhdGNoX3RhYmxlKTsKLQlJTklUX1NUUihfX2Jhc2ljbmV3X18pOwogCiAJaWYgKCEoIGNvcHlfcmVnID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJjb3B5X3JlZyIpKSkKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jU3RyaW5nSU8uYyBiL01vZHVsZXMvY1N0cmluZ0lPLmMKaW5kZXggYmRjOWYwMC4uNGRlYmI3MiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jU3RyaW5nSU8uYworKysgYi9Nb2R1bGVzL2NTdHJpbmdJTy5jCkBAIC01MDMsMTcgKzUwMywxNyBAQAogICAwLAkgICAgICAgCQkJLyp0cF9pdGVtc2l6ZSovCiAgIC8qIG1ldGhvZHMgKi8KICAgKGRlc3RydWN0b3IpT19kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotICAocHJpbnRmdW5jKTAsCQkJLyp0cF9wcmludCovCisgIDAsCQkJCS8qdHBfcHJpbnQqLwogICAwLAkJIAkJLyp0cF9nZXRhdHRyICovCiAgIDAsCQkgCQkvKnRwX3NldGF0dHIgKi8KLSAgKGNtcGZ1bmMpMCwJCQkvKnRwX2NvbXBhcmUqLwotICAocmVwcmZ1bmMpMCwJCQkvKnRwX3JlcHIqLworICAwLAkJCQkvKnRwX2NvbXBhcmUqLworICAwLAkJCQkvKnRwX3JlcHIqLwogICAwLAkJCQkvKnRwX2FzX251bWJlciovCiAgIDAsCQkJCS8qdHBfYXNfc2VxdWVuY2UqLwogICAwLAkJCQkvKnRwX2FzX21hcHBpbmcqLwotICAoaGFzaGZ1bmMpMCwJCQkvKnRwX2hhc2gqLwotICAodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0gIChyZXByZnVuYykwLAkJCS8qdHBfc3RyKi8KKyAgMCwJCQkJLyp0cF9oYXNoKi8KKyAgMAksCQkJLyp0cF9jYWxsKi8KKyAgMCwJCQkJLyp0cF9zdHIqLwogICAwLAkJCQkvKnRwX2dldGF0dHJvICovCiAgIDAsCQkJCS8qdHBfc2V0YXR0cm8gKi8KICAgMCwJCQkJLyp0cF9hc19idWZmZXIgKi8KQEAgLTYyNCwxNyArNjI0LDE3IEBACiAgIDAsCQkJCQkvKnRwX2l0ZW1zaXplKi8KICAgLyogbWV0aG9kcyAqLwogICAoZGVzdHJ1Y3RvcilJX2RlYWxsb2MsCQkvKnRwX2RlYWxsb2MqLwotICAocHJpbnRmdW5jKTAsCQkJCS8qdHBfcHJpbnQqLworICAwLAkJCQkJLyp0cF9wcmludCovCiAgIDAsCQkgCQkJLyogdHBfZ2V0YXR0ciAqLwotICAoc2V0YXR0cmZ1bmMpMCwJCQkvKnRwX3NldGF0dHIqLwotICAoY21wZnVuYykwLAkJCQkvKnRwX2NvbXBhcmUqLwotICAocmVwcmZ1bmMpMCwJCQkJLyp0cF9yZXByKi8KKyAgMCwJCQkJCS8qdHBfc2V0YXR0ciovCisgIDAsCQkJCQkvKnRwX2NvbXBhcmUqLworICAwLAkJCQkJLyp0cF9yZXByKi8KICAgMCwJCQkJCS8qdHBfYXNfbnVtYmVyKi8KICAgMCwJCQkJCS8qdHBfYXNfc2VxdWVuY2UqLwogICAwLAkJCQkJLyp0cF9hc19tYXBwaW5nKi8KLSAgKGhhc2hmdW5jKTAsCQkJCS8qdHBfaGFzaCovCi0gICh0ZXJuYXJ5ZnVuYykwLAkJCS8qdHBfY2FsbCovCi0gIChyZXByZnVuYykwLAkJCQkvKnRwX3N0ciovCisgIDAsCQkJCQkvKnRwX2hhc2gqLworICAwLAkJCQkJLyp0cF9jYWxsKi8KKyAgMCwJCQkJCS8qdHBfc3RyKi8KICAgMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCiAgIDAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwogICAwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NjcHl0aG9uLmNjIGIvTW9kdWxlcy9jY3B5dGhvbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlOTdmZi4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL2NjcHl0aG9uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogTWluaW1hbCBtYWluIHByb2dyYW0gLS0gZXZlcnl0aGluZyBpcyBsb2FkZWQgZnJvbSB0aGUgbGlicmFyeSAqLwotCi0jaW5jbHVkZSAiUHl0aG9uLmgiCi0KLWV4dGVybiAiQyIKLURMX0VYUE9SVChpbnQpIFB5X01haW4oIGludCBhcmdjLCBjaGFyICphcmd2W10gKTsKLQotaW50IG1haW4oIGludCBhcmdjLCBjaGFyICphcmd2W10gKQotewotCXJldHVybiBQeV9NYWluKGFyZ2MsIGFyZ3YpOwotfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19jbi5jIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19jbi5jCmluZGV4IGZkMDQ4ZDkuLmZiNTEyOTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfY24uYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2NuLmMKQEAgLTIxNywxMSArMjE3LDggQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCi0JCQlpZiAodXRycmFuZ2UtPmZpcnN0ID09IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkJInVuaWNvZGUgbWFwcGluZyBpbnZhbGlkIik7CisJCQlpZiAodXRycmFuZ2UtPmZpcnN0ID09IDApCiAJCQkJcmV0dXJuIDE7Ci0JCQl9CiAJCQljb250aW51ZTsKIAkJfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jIGIvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYwppbmRleCBmNTFiNmYyLi4zNDBkZTE4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jCisrKyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmMKQEAgLTYsNiArNiw3IEBACiAKICNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgogI2luY2x1ZGUgIlB5dGhvbi5oIgorI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogI2luY2x1ZGUgIm11bHRpYnl0ZWNvZGVjLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTM4LDIyICszOSwxNCBAQAogYXJlICdpZ25vcmUnIGFuZCAncmVwbGFjZScgYXMgd2VsbCBhcyBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmQgd2l0aFxuXAogY29kZWNzLnJlZ2lzdGVyX2Vycm9yIHRoYXQgaXMgYWJsZSB0byBoYW5kbGUgVW5pY29kZURlY29kZUVycm9ycy4iKTsKIAotUHlEb2NfU1RSVkFSKE11bHRpYnl0ZUNvZGVjX1N0cmVhbVJlYWRlcl9fZG9jX18sCi0iSS5TdHJlYW1SZWFkZXIoc3RyZWFtWywgZXJyb3JzXSkgLT4gU3RyZWFtUmVhZGVyIGluc3RhbmNlIik7Ci0KLVB5RG9jX1NUUlZBUihNdWx0aWJ5dGVDb2RlY19TdHJlYW1Xcml0ZXJfX2RvY19fLAotIkkuU3RyZWFtV3JpdGVyKHN0cmVhbVssIGVycm9yc10pIC0+IFN0cmVhbVdyaXRlciBpbnN0YW5jZSIpOwotCiBzdGF0aWMgY2hhciAqY29kZWNrd2FyZ2xpc3RbXSA9IHsiaW5wdXQiLCAiZXJyb3JzIiwgTlVMTH07CitzdGF0aWMgY2hhciAqaW5jbmV3a3dhcmdsaXN0W10gPSB7ImVycm9ycyIsIE5VTEx9Oworc3RhdGljIGNoYXIgKmluY3JlbWVudGFsa3dhcmdsaXN0W10gPSB7ImlucHV0IiwgImZpbmFsIiwgTlVMTH07CiBzdGF0aWMgY2hhciAqc3RyZWFta3dhcmdsaXN0W10gPSB7InN0cmVhbSIsICJlcnJvcnMiLCBOVUxMfTsKIAogc3RhdGljIFB5T2JqZWN0ICptdWx0aWJ5dGVjb2RlY19lbmNvZGUoTXVsdGlieXRlQ29kZWMgKiwKIAkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKiwgY29uc3QgUHlfVU5JQ09ERSAqKiwgUHlfc3NpemVfdCwKIAkJUHlPYmplY3QgKiwgaW50KTsKLXN0YXRpYyBQeU9iamVjdCAqbWJzdHJlYW1yZWFkZXJfY3JlYXRlKE11bHRpYnl0ZUNvZGVjICosCi0JCVB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgUHlPYmplY3QgKm1ic3RyZWFtd3JpdGVyX2NyZWF0ZShNdWx0aWJ5dGVDb2RlYyAqLAotCQlQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOwogCiAjZGVmaW5lIE1CRU5DX1JFU0VUCU1CRU5DX01BWDw8MSAvKiByZXNldCBhZnRlciBhbiBlbmNvZGluZyBzZXNzaW9uICovCiAKQEAgLTgzLDcgKzc2LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWdldF9lcnJvcmNhbGxiYWNrKGNvbnN0IGNoYXIgKmVycm9ycykKK2ludGVybmFsX2Vycm9yX2NhbGxiYWNrKGNvbnN0IGNoYXIgKmVycm9ycykKIHsKIAlpZiAoZXJyb3JzID09IE5VTEwgfHwgc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApCiAJCXJldHVybiBFUlJPUl9TVFJJQ1Q7CkBAIC05MSwxNyArODQsODggQEAKIAkJcmV0dXJuIEVSUk9SX0lHTk9SRTsKIAllbHNlIGlmIChzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpID09IDApCiAJCXJldHVybiBFUlJPUl9SRVBMQUNFOwotCWVsc2UgewotCQlyZXR1cm4gUHlDb2RlY19Mb29rdXBFcnJvcihlcnJvcnMpOwotCX0KKwllbHNlCisJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGVycm9ycyk7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCAqCitjYWxsX2Vycm9yX2NhbGxiYWNrKFB5T2JqZWN0ICplcnJvcnMsIFB5T2JqZWN0ICpleGMpCit7CisJUHlPYmplY3QgKmFyZ3MsICpjYiwgKnI7CisKKwlhc3NlcnQoUHlTdHJpbmdfQ2hlY2soZXJyb3JzKSk7CisJY2IgPSBQeUNvZGVjX0xvb2t1cEVycm9yKFB5U3RyaW5nX0FTX1NUUklORyhlcnJvcnMpKTsKKwlpZiAoY2IgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlhcmdzID0gUHlUdXBsZV9OZXcoMSk7CisJaWYgKGFyZ3MgPT0gTlVMTCkgeworCQlQeV9ERUNSRUYoY2IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIGV4Yyk7CisJUHlfSU5DUkVGKGV4Yyk7CisKKwlyID0gUHlPYmplY3RfQ2FsbE9iamVjdChjYiwgYXJncyk7CisJUHlfREVDUkVGKGFyZ3MpOworCVB5X0RFQ1JFRihjYik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitjb2RlY2N0eF9lcnJvcnNfZ2V0KE11bHRpYnl0ZVN0YXRlZnVsQ29kZWNDb250ZXh0ICpzZWxmKQoreworCWNvbnN0IGNoYXIgKmVycm9yczsKKworCWlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfU1RSSUNUKQorCQllcnJvcnMgPSAic3RyaWN0IjsKKwllbHNlIGlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfSUdOT1JFKQorCQllcnJvcnMgPSAiaWdub3JlIjsKKwllbHNlIGlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkKKwkJZXJyb3JzID0gInJlcGxhY2UiOworCWVsc2UgeworCQlQeV9JTkNSRUYoc2VsZi0+ZXJyb3JzKTsKKwkJcmV0dXJuIHNlbGYtPmVycm9yczsKKwl9CisKKwlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOworfQorCitzdGF0aWMgaW50Citjb2RlY2N0eF9lcnJvcnNfc2V0KE11bHRpYnl0ZVN0YXRlZnVsQ29kZWNDb250ZXh0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCisJCSAgICB2b2lkICpjbG9zdXJlKQoreworCVB5T2JqZWN0ICpjYjsKKworCWlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJlcnJvcnMgbXVzdCBiZSBhIHN0cmluZyIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2IgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpKTsKKwlpZiAoY2IgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7CisJc2VsZi0+ZXJyb3JzID0gY2I7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZ2V0c2V0IGhhbmRsZXJzIGxpc3QgaXMgdXNlZCBieSBhbGwgdGhlIHN0YXRlZnVsIGNvZGVjIG9iamVjdHMgKi8KK3N0YXRpYyBQeUdldFNldERlZiBjb2RlY2N0eF9nZXRzZXRzW10gPSB7CisJeyJlcnJvcnMiLAkoZ2V0dGVyKWNvZGVjY3R4X2Vycm9yc19nZXQsCisJCQkoc2V0dGVyKWNvZGVjY3R4X2Vycm9yc19zZXQsCisJCQlQeURvY19TVFIoImhvdyB0byB0cmVhdCBlcnJvcnMiKX0sCisJe05VTEwsfQorfTsKKwogc3RhdGljIGludAogZXhwYW5kX2VuY29kZWJ1ZmZlcihNdWx0aWJ5dGVFbmNvZGVCdWZmZXIgKmJ1ZiwgUHlfc3NpemVfdCBlc2l6ZSkKIHsKIAlQeV9zc2l6ZV90IG9yZ3Bvcywgb3Jnc2l6ZTsKIAotCW9yZ3BvcyA9IChQeV9zc2l6ZV90KSgoY2hhciopYnVmLT5vdXRidWYgLQorCW9yZ3BvcyA9IChQeV9zc2l6ZV90KSgoY2hhciAqKWJ1Zi0+b3V0YnVmIC0KIAkJCQlQeVN0cmluZ19BU19TVFJJTkcoYnVmLT5vdXRvYmopKTsKIAlvcmdzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwogCWlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYtPm91dG9iaiwgb3Jnc2l6ZSArICgKQEAgLTEyNSw4ICsxODksNyBAQAogewogCVB5X3NzaXplX3Qgb3JncG9zLCBvcmdzaXplOwogCi0Jb3JncG9zID0gKFB5X3NzaXplX3QpKGJ1Zi0+b3V0YnVmIC0KLQkJCQlQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikpOworCW9yZ3BvcyA9IChQeV9zc2l6ZV90KShidWYtPm91dGJ1ZiAtIFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi0+b3V0b2JqKSk7CiAJb3Jnc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShidWYtPm91dG9iaik7CiAJaWYgKFB5VW5pY29kZV9SZXNpemUoJmJ1Zi0+b3V0b2JqLCBvcmdzaXplICsgKAogCSAgICBlc2l6ZSA8IChvcmdzaXplID4+IDEpID8gKG9yZ3NpemUgPj4gMSkgfCAxIDogZXNpemUpKSA9PSAtMSkKQEAgLTE0NCwxNiArMjA3LDIxIEBACiAJCQlnb3RvIGVycm9yZXhpdDsJCQkJCVwKIH0KIAorCisvKioKKyAqIE11bHRpYnl0ZUNvZGVjIG9iamVjdAorICovCisKIHN0YXRpYyBpbnQKIG11bHRpYnl0ZWNvZGVjX2VuY2Vycm9yKE11bHRpYnl0ZUNvZGVjICpjb2RlYywKIAkJCU11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKIAkJCU11bHRpYnl0ZUVuY29kZUJ1ZmZlciAqYnVmLAogCQkJUHlPYmplY3QgKmVycm9ycywgUHlfc3NpemVfdCBlKQogewotCVB5T2JqZWN0ICpyZXRvYmogPSBOVUxMLCAqcmV0c3RyID0gTlVMTCwgKmFyZ3NvYmosICp0b2JqOworCVB5T2JqZWN0ICpyZXRvYmogPSBOVUxMLCAqcmV0c3RyID0gTlVMTCwgKnRvYmo7CiAJUHlfc3NpemVfdCByZXRzdHJzaXplLCBuZXdwb3M7Ci0JY29uc3QgY2hhciAqcmVhc29uOwogCVB5X3NzaXplX3QgZXNpemUsIHN0YXJ0LCBlbmQ7CisJY29uc3QgY2hhciAqcmVhc29uOwogCiAJaWYgKGUgPiAwKSB7CiAJCXJlYXNvbiA9ICJpbGxlZ2FsIG11bHRpYnl0ZSBzZXF1ZW5jZSI7CkBAIC0xNjYsNyArMjM0LDcgQEAKIAkJCXJldHVybiAwOyAvKiByZXRyeSBpdCAqLwogCQljYXNlIE1CRVJSX1RPT0ZFVzoKIAkJCXJlYXNvbiA9ICJpbmNvbXBsZXRlIG11bHRpYnl0ZSBzZXF1ZW5jZSI7Ci0JCQllc2l6ZSA9IChzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7CisJCQllc2l6ZSA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUJFUlJfSU5URVJOQUw6CiAJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLApAQCAtMjMwLDIxICsyOTgsMTUgQEAKIAkJZ290byBlcnJvcmV4aXQ7CiAJfQogCi0JYXJnc29iaiA9IFB5VHVwbGVfTmV3KDEpOwotCWlmIChhcmdzb2JqID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCi0JUHlUdXBsZV9TRVRfSVRFTShhcmdzb2JqLCAwLCBidWYtPmV4Y29iaik7Ci0JUHlfSU5DUkVGKGJ1Zi0+ZXhjb2JqKTsKLQlyZXRvYmogPSBQeU9iamVjdF9DYWxsT2JqZWN0KGVycm9ycywgYXJnc29iaik7Ci0JUHlfREVDUkVGKGFyZ3NvYmopOworCXJldG9iaiA9IGNhbGxfZXJyb3JfY2FsbGJhY2soZXJyb3JzLCBidWYtPmV4Y29iaik7CiAJaWYgKHJldG9iaiA9PSBOVUxMKQogCQlnb3RvIGVycm9yZXhpdDsKIAogCWlmICghUHlUdXBsZV9DaGVjayhyZXRvYmopIHx8IFB5VHVwbGVfR0VUX1NJWkUocmV0b2JqKSAhPSAyIHx8CiAJICAgICFQeVVuaWNvZGVfQ2hlY2soKHRvYmogPSBQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMCkpKSB8fAotCSAgICAhUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKwkgICAgIShQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpIHx8CisJICAgICAgUHlMb25nX0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkpKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJImVuY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gIgogCQkJCSIodW5pY29kZSwgaW50KSB0dXBsZSIpOwogCQlnb3RvIGVycm9yZXhpdDsKQEAgLTI2NywxMiArMzI5LDEzIEBACiAJYnVmLT5vdXRidWYgKz0gcmV0c3Ryc2l6ZTsKIAogCW5ld3BvcyA9IFB5SW50X0FzU3NpemVfdChQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpOwotCWlmIChuZXdwb3MgPCAwKQorCWlmIChuZXdwb3MgPCAwICYmICFQeUVycl9PY2N1cnJlZCgpKQogCQluZXdwb3MgKz0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zl90b3ApOwogCWlmIChuZXdwb3MgPCAwIHx8IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zID4gYnVmLT5pbmJ1Zl9lbmQpIHsKKwkJUHlFcnJfQ2xlYXIoKTsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsCi0JCQkgICAgICJwb3NpdGlvbiAlZCBmcm9tIGVycm9yIGhhbmRsZXIgb3V0IG9mIGJvdW5kcyIsCi0JCQkgICAgIChpbnQpbmV3cG9zKTsKKwkJCSAgICAgInBvc2l0aW9uICV6ZCBmcm9tIGVycm9yIGhhbmRsZXIgb3V0IG9mIGJvdW5kcyIsCisJCQkgICAgIG5ld3Bvcyk7CiAJCWdvdG8gZXJyb3JleGl0OwogCX0KIAlidWYtPmluYnVmID0gYnVmLT5pbmJ1Zl90b3AgKyBuZXdwb3M7CkBAIC0yOTMsNyArMzU2LDcgQEAKIAkJCU11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmLAogCQkJUHlPYmplY3QgKmVycm9ycywgUHlfc3NpemVfdCBlKQogewotCVB5T2JqZWN0ICphcmdzb2JqLCAqcmV0b2JqID0gTlVMTCwgKnJldHVuaSA9IE5VTEw7CisJUHlPYmplY3QgKnJldG9iaiA9IE5VTEwsICpyZXR1bmkgPSBOVUxMOwogCVB5X3NzaXplX3QgcmV0dW5pc2l6ZSwgbmV3cG9zOwogCWNvbnN0IGNoYXIgKnJlYXNvbjsKIAlQeV9zc2l6ZV90IGVzaXplLCBzdGFydCwgZW5kOwpAQCAtMzA5LDcgKzM3Miw3IEBACiAJCQlyZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KIAkJY2FzZSBNQkVSUl9UT09GRVc6CiAJCQlyZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOwotCQkJZXNpemUgPSAoc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOworCQkJZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKIAkJCWJyZWFrOwogCQljYXNlIE1CRVJSX0lOVEVSTkFMOgogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKQEAgLTM1NCwyMSArNDE3LDE1IEBACiAJCWdvdG8gZXJyb3JleGl0OwogCX0KIAotCWFyZ3NvYmogPSBQeVR1cGxlX05ldygxKTsKLQlpZiAoYXJnc29iaiA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQotCVB5VHVwbGVfU0VUX0lURU0oYXJnc29iaiwgMCwgYnVmLT5leGNvYmopOwotCVB5X0lOQ1JFRihidWYtPmV4Y29iaik7Ci0JcmV0b2JqID0gUHlPYmplY3RfQ2FsbE9iamVjdChlcnJvcnMsIGFyZ3NvYmopOwotCVB5X0RFQ1JFRihhcmdzb2JqKTsKKwlyZXRvYmogPSBjYWxsX2Vycm9yX2NhbGxiYWNrKGVycm9ycywgYnVmLT5leGNvYmopOwogCWlmIChyZXRvYmogPT0gTlVMTCkKIAkJZ290byBlcnJvcmV4aXQ7CiAKIAlpZiAoIVB5VHVwbGVfQ2hlY2socmV0b2JqKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJldG9iaikgIT0gMiB8fAogCSAgICAhUHlVbmljb2RlX0NoZWNrKChyZXR1bmkgPSBQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMCkpKSB8fAotCSAgICAhUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKwkgICAgIShQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpIHx8CisJICAgICAgUHlMb25nX0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkpKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJImRlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gIgogCQkJCSIodW5pY29kZSwgaW50KSB0dXBsZSIpOwogCQlnb3RvIGVycm9yZXhpdDsKQEAgLTM4MywxMiArNDQwLDEzIEBACiAJfQogCiAJbmV3cG9zID0gUHlJbnRfQXNTc2l6ZV90KFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSk7Ci0JaWYgKG5ld3BvcyA8IDApCisJaWYgKG5ld3BvcyA8IDAgJiYgIVB5RXJyX09jY3VycmVkKCkpCiAJCW5ld3BvcyArPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmX3RvcCk7CiAJaWYgKG5ld3BvcyA8IDAgfHwgYnVmLT5pbmJ1Zl90b3AgKyBuZXdwb3MgPiBidWYtPmluYnVmX2VuZCkgeworCQlQeUVycl9DbGVhcigpOwogCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkicG9zaXRpb24gJWQgZnJvbSBlcnJvciBoYW5kbGVyIG91dCBvZiBib3VuZHMiLAotCQkJCShpbnQpbmV3cG9zKTsKKwkJCSAgICAgInBvc2l0aW9uICV6ZCBmcm9tIGVycm9yIGhhbmRsZXIgb3V0IG9mIGJvdW5kcyIsCisJCQkgICAgIG5ld3Bvcyk7CiAJCWdvdG8gZXJyb3JleGl0OwogCX0KIAlidWYtPmluYnVmID0gYnVmLT5pbmJ1Zl90b3AgKyBuZXdwb3M7CkBAIC00NTMsNyArNTExLDcgQEAKIAkJCQlnb3RvIGVycm9yZXhpdDsKIAkJfQogCi0JZmluYWxzaXplID0gKFB5X3NzaXplX3QpKChjaGFyKilidWYub3V0YnVmIC0KKwlmaW5hbHNpemUgPSAoUHlfc3NpemVfdCkoKGNoYXIgKilidWYub3V0YnVmIC0KIAkJCQkgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi5vdXRvYmopKTsKIAogCWlmIChmaW5hbHNpemUgIT0gUHlTdHJpbmdfR0VUX1NJWkUoYnVmLm91dG9iaikpCkBAIC01MDAsNyArNTU4LDcgQEAKIAlkYXRhID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYXJnKTsKIAlkYXRhbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKGFyZyk7CiAKLQllcnJvcmNiID0gZ2V0X2Vycm9yY2FsbGJhY2soZXJyb3JzKTsKKwllcnJvcmNiID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKIAlpZiAoZXJyb3JjYiA9PSBOVUxMKSB7CiAJCVB5X1hERUNSRUYodWN2dCk7CiAJCXJldHVybiBOVUxMOwpAQCAtNTE1LDE2ICs1NzMsMTIgQEAKIAlpZiAociA9PSBOVUxMKQogCQlnb3RvIGVycm9yZXhpdDsKIAotCWlmIChlcnJvcmNiID4gRVJST1JfTUFYKSB7Ci0JCVB5X0RFQ1JFRihlcnJvcmNiKTsKLQl9CisJRVJST1JfREVDUkVGKGVycm9yY2IpOwogCVB5X1hERUNSRUYodWN2dCk7CiAJcmV0dXJuIG1ha2VfdHVwbGUociwgZGF0YWxlbik7CiAKIGVycm9yZXhpdDoKLQlpZiAoZXJyb3JjYiA+IEVSUk9SX01BWCkgewotCQlQeV9ERUNSRUYoZXJyb3JjYik7Ci0JfQorCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKIAlQeV9YREVDUkVGKHVjdnQpOwogCXJldHVybiBOVUxMOwogfQpAQCAtNTQzLDE4ICs1OTcsMTYgQEAKIAkJCQljb2RlY2t3YXJnbGlzdCwgJmRhdGEsICZkYXRhbGVuLCAmZXJyb3JzKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQllcnJvcmNiID0gZ2V0X2Vycm9yY2FsbGJhY2soZXJyb3JzKTsKKwllcnJvcmNiID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKIAlpZiAoZXJyb3JjYiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChkYXRhbGVuID09IDApIHsKLQkJaWYgKGVycm9yY2IgPiBFUlJPUl9NQVgpIHsKLQkJCVB5X0RFQ1JFRihlcnJvcmNiKTsKLQkJfQorCQlFUlJPUl9ERUNSRUYoZXJyb3JjYik7CiAJCXJldHVybiBtYWtlX3R1cGxlKFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCAwKSwgMCk7CiAJfQogCi0JYnVmLm91dG9iaiA9IGJ1Zi5leGNvYmogPSBOVUxMOworCWJ1Zi5leGNvYmogPSBOVUxMOwogCWJ1Zi5pbmJ1ZiA9IGJ1Zi5pbmJ1Zl90b3AgPSAodW5zaWduZWQgY2hhciAqKWRhdGE7CiAJYnVmLmluYnVmX2VuZCA9IGJ1Zi5pbmJ1Zl90b3AgKyBkYXRhbGVuOwogCWJ1Zi5vdXRvYmogPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgZGF0YWxlbik7CkBAIC01OTAsNDkgKzY0MiwxNyBAQAogCQkJZ290byBlcnJvcmV4aXQ7CiAKIAlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCWlmIChlcnJvcmNiID4gRVJST1JfTUFYKSB7Ci0JCVB5X0RFQ1JFRihlcnJvcmNiKTsKLQl9CisJRVJST1JfREVDUkVGKGVycm9yY2IpOwogCXJldHVybiBtYWtlX3R1cGxlKGJ1Zi5vdXRvYmosIGRhdGFsZW4pOwogCiBlcnJvcmV4aXQ6Ci0JaWYgKGVycm9yY2IgPiBFUlJPUl9NQVgpIHsKLQkJUHlfREVDUkVGKGVycm9yY2IpOwotCX0KKwlFUlJPUl9ERUNSRUYoZXJyb3JjYik7CiAJUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKIAlQeV9YREVDUkVGKGJ1Zi5vdXRvYmopOwogCiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1NdWx0aWJ5dGVDb2RlY19TdHJlYW1SZWFkZXIoTXVsdGlieXRlQ29kZWNPYmplY3QgKnNlbGYsCi0JCQkgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCi17Ci0JUHlPYmplY3QgKnN0cmVhbTsKLQljaGFyICplcnJvcnMgPSBOVUxMOwotCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xzOlN0cmVhbVJlYWRlciIsCi0JCQkJc3RyZWFta3dhcmdsaXN0LCAmc3RyZWFtLCAmZXJyb3JzKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gbWJzdHJlYW1yZWFkZXJfY3JlYXRlKHNlbGYtPmNvZGVjLCBzdHJlYW0sIGVycm9ycyk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1NdWx0aWJ5dGVDb2RlY19TdHJlYW1Xcml0ZXIoTXVsdGlieXRlQ29kZWNPYmplY3QgKnNlbGYsCi0JCQkgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCi17Ci0JUHlPYmplY3QgKnN0cmVhbTsKLQljaGFyICplcnJvcnMgPSBOVUxMOwotCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xzOlN0cmVhbVdyaXRlciIsCi0JCQkJc3RyZWFta3dhcmdsaXN0LCAmc3RyZWFtLCAmZXJyb3JzKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gbWJzdHJlYW13cml0ZXJfY3JlYXRlKHNlbGYtPmNvZGVjLCBzdHJlYW0sIGVycm9ycyk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbXVsdGlieXRlY29kZWNfbWV0aG9kc1tdID0gewogCXsiZW5jb2RlIiwJKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX0VuY29kZSwKIAkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCkBAIC02NDAsMTIgKzY2MCw2IEBACiAJeyJkZWNvZGUiLAkoUHlDRnVuY3Rpb24pTXVsdGlieXRlQ29kZWNfRGVjb2RlLAogCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKIAkJCU11bHRpYnl0ZUNvZGVjX0RlY29kZV9fZG9jX199LAotCXsiU3RyZWFtUmVhZGVyIiwoUHlDRnVuY3Rpb24pTXVsdGlieXRlQ29kZWNfU3RyZWFtUmVhZGVyLAotCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkJCU11bHRpYnl0ZUNvZGVjX1N0cmVhbVJlYWRlcl9fZG9jX199LAotCXsiU3RyZWFtV3JpdGVyIiwoUHlDRnVuY3Rpb24pTXVsdGlieXRlQ29kZWNfU3RyZWFtV3JpdGVyLAotCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkJCU11bHRpYnl0ZUNvZGVjX1N0cmVhbVdyaXRlcl9fZG9jX199LAogCXtOVUxMLAkJTlVMTH0sCiB9OwogCkBAIC02NTUsOCArNjY5LDYgQEAKIAlQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKLQotCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE11bHRpYnl0ZUNvZGVjX1R5cGUgPSB7CiAJUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCiAJMCwJCQkJLyogb2Jfc2l6ZSAqLwpAQCAtNjkwLDEzICs3MDIsNDk4IEBACiAJbXVsdGlieXRlY29kZWNfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KIH07CiAKKworLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igc3RhdGVmdWwgY29kZWMgbWVjaGFuaXNtCisgKi8KKworI2RlZmluZSBTVEFURUZVTF9EQ1RYKG8pCSgoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqKShvKSkKKyNkZWZpbmUgU1RBVEVGVUxfRUNUWChvKQkoKE11bHRpYnl0ZVN0YXRlZnVsRW5jb2RlckNvbnRleHQgKikobykpCisKK3N0YXRpYyBQeU9iamVjdCAqCitlbmNvZGVyX2VuY29kZV9zdGF0ZWZ1bChNdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJDb250ZXh0ICpjdHgsCisJCQlQeU9iamVjdCAqdW5pc3RyLCBpbnQgZmluYWwpCit7CisJUHlPYmplY3QgKnVjdnQsICpyID0gTlVMTDsKKwlQeV9VTklDT0RFICppbmJ1ZiwgKmluYnVmX2VuZCwgKmluYnVmX3RtcCA9IE5VTEw7CisJUHlfc3NpemVfdCBkYXRhbGVuLCBvcmlncGVuZGluZzsKKworCWlmIChQeVVuaWNvZGVfQ2hlY2sodW5pc3RyKSkKKwkJdWN2dCA9IE5VTEw7CisJZWxzZSB7CisJCXVuaXN0ciA9IHVjdnQgPSBQeU9iamVjdF9Vbmljb2RlKHVuaXN0cik7CisJCWlmICh1bmlzdHIgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQllbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHVuaXN0cikpIHsKKwkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisJCQkJImNvdWxkbid0IGNvbnZlcnQgdGhlIG9iamVjdCB0byB1bmljb2RlLiIpOworCQkJUHlfREVDUkVGKHVjdnQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlkYXRhbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKHVuaXN0cik7CisJb3JpZ3BlbmRpbmcgPSBjdHgtPnBlbmRpbmdzaXplOworCisJaWYgKG9yaWdwZW5kaW5nID4gMCkgeworCQlpbmJ1Zl90bXAgPSBQeU1lbV9OZXcoUHlfVU5JQ09ERSwgZGF0YWxlbiArIGN0eC0+cGVuZGluZ3NpemUpOworCQlpZiAoaW5idWZfdG1wID09IE5VTEwpCisJCQlnb3RvIGVycm9yZXhpdDsKKwkJbWVtY3B5KGluYnVmX3RtcCwgY3R4LT5wZW5kaW5nLAorCQkJUHlfVU5JQ09ERV9TSVpFICogY3R4LT5wZW5kaW5nc2l6ZSk7CisJCW1lbWNweShpbmJ1Zl90bXAgKyBjdHgtPnBlbmRpbmdzaXplLAorCQkJUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKSwKKwkJCVB5X1VOSUNPREVfU0laRSAqIGRhdGFsZW4pOworCQlkYXRhbGVuICs9IGN0eC0+cGVuZGluZ3NpemU7CisJCWN0eC0+cGVuZGluZ3NpemUgPSAwOworCQlpbmJ1ZiA9IGluYnVmX3RtcDsKKwl9CisJZWxzZQorCQlpbmJ1ZiA9IChQeV9VTklDT0RFICopUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKTsKKworCWluYnVmX2VuZCA9IGluYnVmICsgZGF0YWxlbjsKKworCXIgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoY3R4LT5jb2RlYywgJmN0eC0+c3RhdGUsCisJCQkoY29uc3QgUHlfVU5JQ09ERSAqKikmaW5idWYsCisJCQlkYXRhbGVuLCBjdHgtPmVycm9ycywgZmluYWwgPyBNQkVOQ19GTFVTSCA6IDApOworCWlmIChyID09IE5VTEwpIHsKKwkJLyogcmVjb3ZlciB0aGUgb3JpZ2luYWwgcGVuZGluZyBidWZmZXIgKi8KKwkJaWYgKG9yaWdwZW5kaW5nID4gMCkKKwkJCW1lbWNweShjdHgtPnBlbmRpbmcsIGluYnVmX3RtcCwKKwkJCQlQeV9VTklDT0RFX1NJWkUgKiBvcmlncGVuZGluZyk7CisJCWN0eC0+cGVuZGluZ3NpemUgPSBvcmlncGVuZGluZzsKKwkJZ290byBlcnJvcmV4aXQ7CisJfQorCisJaWYgKGluYnVmIDwgaW5idWZfZW5kKSB7CisJCWN0eC0+cGVuZGluZ3NpemUgPSAoUHlfc3NpemVfdCkoaW5idWZfZW5kIC0gaW5idWYpOworCQlpZiAoY3R4LT5wZW5kaW5nc2l6ZSA+IE1BWEVOQ1BFTkRJTkcpIHsKKwkJCS8qIG5vcm1hbCBjb2RlY3MgY2FuJ3QgcmVhY2ggaGVyZSAqLworCQkJY3R4LT5wZW5kaW5nc2l6ZSA9IDA7CisJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVW5pY29kZUVycm9yLAorCQkJCQkicGVuZGluZyBidWZmZXIgb3ZlcmZsb3ciKTsKKwkJCWdvdG8gZXJyb3JleGl0OworCQl9CisJCW1lbWNweShjdHgtPnBlbmRpbmcsIGluYnVmLAorCQkJY3R4LT5wZW5kaW5nc2l6ZSAqIFB5X1VOSUNPREVfU0laRSk7CisJfQorCisJaWYgKGluYnVmX3RtcCAhPSBOVUxMKQorCQlQeU1lbV9EZWwoaW5idWZfdG1wKTsKKwlQeV9YREVDUkVGKHVjdnQpOworCXJldHVybiByOworCitlcnJvcmV4aXQ6CisJaWYgKGluYnVmX3RtcCAhPSBOVUxMKQorCQlQeU1lbV9EZWwoaW5idWZfdG1wKTsKKwlQeV9YREVDUkVGKHIpOworCVB5X1hERUNSRUYodWN2dCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZXJfYXBwZW5kX3BlbmRpbmcoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqY3R4LAorCQkgICAgICAgTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYpCit7CisJUHlfc3NpemVfdCBucGVuZGluZ3M7CisKKwlucGVuZGluZ3MgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKKwlpZiAobnBlbmRpbmdzICsgY3R4LT5wZW5kaW5nc2l6ZSA+IE1BWERFQ1BFTkRJTkcpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuaWNvZGVFcnJvciwgInBlbmRpbmcgYnVmZmVyIG92ZXJmbG93Iik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5KGN0eC0+cGVuZGluZyArIGN0eC0+cGVuZGluZ3NpemUsIGJ1Zi0+aW5idWYsIG5wZW5kaW5ncyk7CisJY3R4LT5wZW5kaW5nc2l6ZSArPSBucGVuZGluZ3M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZXJfcHJlcGFyZV9idWZmZXIoTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYsIGNvbnN0IGNoYXIgKmRhdGEsCisJCSAgICAgICBQeV9zc2l6ZV90IHNpemUpCit7CisJYnVmLT5pbmJ1ZiA9IGJ1Zi0+aW5idWZfdG9wID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilkYXRhOworCWJ1Zi0+aW5idWZfZW5kID0gYnVmLT5pbmJ1Zl90b3AgKyBzaXplOworCWlmIChidWYtPm91dG9iaiA9PSBOVUxMKSB7IC8qIG9ubHkgaWYgb3V0b2JqIGlzIG5vdCBhbGxvY2F0ZWQgeWV0ICovCisJCWJ1Zi0+b3V0b2JqID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHNpemUpOworCQlpZiAoYnVmLT5vdXRvYmogPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJYnVmLT5vdXRidWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaik7CisJCWJ1Zi0+b3V0YnVmX2VuZCA9IGJ1Zi0+b3V0YnVmICsKKwkJCQkgIFB5VW5pY29kZV9HRVRfU0laRShidWYtPm91dG9iaik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZXJfZmVlZF9idWZmZXIoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqY3R4LAorCQkgICAgTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYpCit7CisJd2hpbGUgKGJ1Zi0+aW5idWYgPCBidWYtPmluYnVmX2VuZCkgeworCQlQeV9zc2l6ZV90IGlubGVmdCwgb3V0bGVmdDsKKwkJaW50IHI7CisKKwkJaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7CisJCW91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWZfZW5kIC0gYnVmLT5vdXRidWYpOworCisJCXIgPSBjdHgtPmNvZGVjLT5kZWNvZGUoJmN0eC0+c3RhdGUsIGN0eC0+Y29kZWMtPmNvbmZpZywKKwkJCSZidWYtPmluYnVmLCBpbmxlZnQsICZidWYtPm91dGJ1Ziwgb3V0bGVmdCk7CisJCWlmIChyID09IDAgfHwgciA9PSBNQkVSUl9UT09GRVcpCisJCQlicmVhazsKKwkJZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZGVjZXJyb3IoY3R4LT5jb2RlYywgJmN0eC0+c3RhdGUsCisJCQkJCQkgYnVmLCBjdHgtPmVycm9ycywgcikpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisKKy8qKgorICogTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyIG9iamVjdAorICovCisKK3N0YXRpYyBQeU9iamVjdCAqCittYmllbmNvZGVyX2VuY29kZShNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYsCisJCSAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisJUHlPYmplY3QgKmRhdGE7CisJaW50IGZpbmFsID0gMDsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aTplbmNvZGUiLAorCQkJaW5jcmVtZW50YWxrd2FyZ2xpc3QsICZkYXRhLCAmZmluYWwpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBlbmNvZGVyX2VuY29kZV9zdGF0ZWZ1bChTVEFURUZVTF9FQ1RYKHNlbGYpLCBkYXRhLCBmaW5hbCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCittYmllbmNvZGVyX3Jlc2V0KE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdCAqc2VsZikKK3sKKwlpZiAoc2VsZi0+Y29kZWMtPmRlY3Jlc2V0ICE9IE5VTEwgJiYKKwkgICAgc2VsZi0+Y29kZWMtPmRlY3Jlc2V0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJc2VsZi0+cGVuZGluZ3NpemUgPSAwOworCisJUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbWJpZW5jb2Rlcl9tZXRob2RzW10gPSB7CisJeyJlbmNvZGUiLAkoUHlDRnVuY3Rpb24pbWJpZW5jb2Rlcl9lbmNvZGUsCisJCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBOVUxMfSwKKwl7InJlc2V0IiwJKFB5Q0Z1bmN0aW9uKW1iaWVuY29kZXJfcmVzZXQsCisJCQlNRVRIX05PQVJHUywgTlVMTH0sCisJe05VTEwsCQlOVUxMfSwKK307CisKK3N0YXRpYyBQeU9iamVjdCAqCittYmllbmNvZGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKwlNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGY7CisJUHlPYmplY3QgKmNvZGVjID0gTlVMTDsKKwljaGFyICplcnJvcnMgPSBOVUxMOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxzOkluY3JlbWVudGFsRW5jb2RlciIsCisJCQkJCSBpbmNuZXdrd2FyZ2xpc3QsICZlcnJvcnMpKQorCQlyZXR1cm4gTlVMTDsKKworCXNlbGYgPSAoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisJaWYgKHNlbGYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwljb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopdHlwZSwgImNvZGVjIik7CisJaWYgKGNvZGVjID09IE5VTEwpCisJCWdvdG8gZXJyb3JleGl0OworCWlmICghTXVsdGlieXRlQ29kZWNfQ2hlY2soY29kZWMpKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBpcyB1bmV4cGVjdGVkIHR5cGUiKTsKKwkJZ290byBlcnJvcmV4aXQ7CisJfQorCisJc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKKwlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisJc2VsZi0+ZXJyb3JzID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKKwlpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCisJCWdvdG8gZXJyb3JleGl0OworCWlmIChzZWxmLT5jb2RlYy0+ZW5jaW5pdCAhPSBOVUxMICYmCisJICAgIHNlbGYtPmNvZGVjLT5lbmNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKwkJZ290byBlcnJvcmV4aXQ7CisKKwlQeV9ERUNSRUYoY29kZWMpOworCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworCitlcnJvcmV4aXQ6CisJUHlfWERFQ1JFRihzZWxmKTsKKwlQeV9YREVDUkVGKGNvZGVjKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludAorbWJpZW5jb2Rlcl90cmF2ZXJzZShNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYsCisJCSAgICB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKwlpZiAoRVJST1JfSVNDVVNUT00oc2VsZi0+ZXJyb3JzKSkKKwkJUHlfVklTSVQoc2VsZi0+ZXJyb3JzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK21iaWVuY29kZXJfZGVhbGxvYyhNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYpCit7CisJUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKwlFUlJPUl9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKKwlzZWxmLT5vYl90eXBlLT50cF9mcmVlKHNlbGYpOworfQorCitzdGF0aWMgUHlUeXBlT2JqZWN0IE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlcl9UeXBlID0geworCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorCTAsCQkJCS8qIG9iX3NpemUgKi8KKwkiTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyIiwJLyogdHBfbmFtZSAqLworCXNpemVvZihNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QpLCAvKiB0cF9iYXNpY3NpemUgKi8KKwkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLworCS8qICBtZXRob2RzICAqLworCShkZXN0cnVjdG9yKW1iaWVuY29kZXJfZGVhbGxvYywgLyogdHBfZGVhbGxvYyAqLworCTAsCQkJCS8qIHRwX3ByaW50ICovCisJMCwJCQkJLyogdHBfZ2V0YXR0ciAqLworCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KKwkwLAkJCQkvKiB0cF9jb21wYXJlICovCisJMCwJCQkJLyogdHBfcmVwciAqLworCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLworCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCisJMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLworCTAsCQkJCS8qIHRwX2hhc2ggKi8KKwkwLAkJCQkvKiB0cF9jYWxsICovCisJMCwJCQkJLyogdHBfc3RyICovCisJUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCisJMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KKwkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KKwlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKKwkJfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLworCTAsCQkJCS8qIHRwX2RvYyAqLworCSh0cmF2ZXJzZXByb2MpbWJpZW5jb2Rlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KKwkwLAkJCQkvKiB0cF9jbGVhciAqLworCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCisJMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKwkwLAkJCQkvKiB0cF9pdGVyICovCisJMCwJCQkJLyogdHBfaXRlcmV4dCAqLworCW1iaWVuY29kZXJfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KKwkwLAkJCQkvKiB0cF9tZW1iZXJzICovCisJY29kZWNjdHhfZ2V0c2V0cywJCS8qIHRwX2dldHNldCAqLworCTAsCQkJCS8qIHRwX2Jhc2UgKi8KKwkwLAkJCQkvKiB0cF9kaWN0ICovCisJMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCisJMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisJMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLworCTAsCQkJCS8qIHRwX2luaXQgKi8KKwkwLAkJCQkvKiB0cF9hbGxvYyAqLworCW1iaWVuY29kZXJfbmV3LAkJCS8qIHRwX25ldyAqLworfTsKKworCisvKioKKyAqIE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciBvYmplY3QKKyAqLworCitzdGF0aWMgUHlPYmplY3QgKgorbWJpZGVjb2Rlcl9kZWNvZGUoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmLAorCQkgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworCU11bHRpYnl0ZURlY29kZUJ1ZmZlciBidWY7CisJY2hhciAqZGF0YSwgKndkYXRhOworCVB5X3NzaXplX3Qgd3NpemUsIGZpbmFsc2l6ZSA9IDAsIHNpemUsIG9yaWdwZW5kaW5nOworCWludCBmaW5hbCA9IDA7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ0I3xpOmRlY29kZSIsCisJCQlpbmNyZW1lbnRhbGt3YXJnbGlzdCwgJmRhdGEsICZzaXplLCAmZmluYWwpKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1Zi5vdXRvYmogPSBidWYuZXhjb2JqID0gTlVMTDsKKwlvcmlncGVuZGluZyA9IHNlbGYtPnBlbmRpbmdzaXplOworCisJaWYgKHNlbGYtPnBlbmRpbmdzaXplID09IDApIHsKKwkJd3NpemUgPSBzaXplOworCQl3ZGF0YSA9IGRhdGE7CisJfQorCWVsc2UgeworCQl3c2l6ZSA9IHNpemUgKyBzZWxmLT5wZW5kaW5nc2l6ZTsKKwkJd2RhdGEgPSBQeU1lbV9NYWxsb2Mod3NpemUpOworCQlpZiAod2RhdGEgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3JleGl0OworCQltZW1jcHkod2RhdGEsIHNlbGYtPnBlbmRpbmcsIHNlbGYtPnBlbmRpbmdzaXplKTsKKwkJbWVtY3B5KHdkYXRhICsgc2VsZi0+cGVuZGluZ3NpemUsIGRhdGEsIHNpemUpOworCQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisJfQorCisJaWYgKGRlY29kZXJfcHJlcGFyZV9idWZmZXIoJmJ1Ziwgd2RhdGEsIHdzaXplKSAhPSAwKQorCQlnb3RvIGVycm9yZXhpdDsKKworCWlmIChkZWNvZGVyX2ZlZWRfYnVmZmVyKFNUQVRFRlVMX0RDVFgoc2VsZiksICZidWYpKQorCQlnb3RvIGVycm9yZXhpdDsKKworCWlmIChmaW5hbCAmJiBidWYuaW5idWYgPCBidWYuaW5idWZfZW5kKSB7CisJCWlmIChtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihzZWxmLT5jb2RlYywgJnNlbGYtPnN0YXRlLAorCQkJCSZidWYsIHNlbGYtPmVycm9ycywgTUJFUlJfVE9PRkVXKSkgeworCQkJLyogcmVjb3ZlciB0aGUgb3JpZ2luYWwgcGVuZGluZyBidWZmZXIgKi8KKwkJCW1lbWNweShzZWxmLT5wZW5kaW5nLCB3ZGF0YSwgb3JpZ3BlbmRpbmcpOworCQkJc2VsZi0+cGVuZGluZ3NpemUgPSBvcmlncGVuZGluZzsKKwkJCWdvdG8gZXJyb3JleGl0OworCQl9CisJfQorCisJaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsgLyogcGVuZGluZyBzZXF1ZW5jZSBzdGlsbCBleGlzdHMgKi8KKwkJaWYgKGRlY29kZXJfYXBwZW5kX3BlbmRpbmcoU1RBVEVGVUxfRENUWChzZWxmKSwgJmJ1ZikgIT0gMCkKKwkJCWdvdG8gZXJyb3JleGl0OworCX0KKworCWZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmIC0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOworCWlmIChmaW5hbHNpemUgIT0gUHlVbmljb2RlX0dFVF9TSVpFKGJ1Zi5vdXRvYmopKQorCQlpZiAoUHlVbmljb2RlX1Jlc2l6ZSgmYnVmLm91dG9iaiwgZmluYWxzaXplKSA9PSAtMSkKKwkJCWdvdG8gZXJyb3JleGl0OworCisJaWYgKHdkYXRhICE9IGRhdGEpCisJCVB5TWVtX0RlbCh3ZGF0YSk7CisJUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKKwlyZXR1cm4gYnVmLm91dG9iajsKKworZXJyb3JleGl0OgorCWlmICh3ZGF0YSAhPSBOVUxMICYmIHdkYXRhICE9IGRhdGEpCisJCVB5TWVtX0RlbCh3ZGF0YSk7CisJUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKKwlQeV9YREVDUkVGKGJ1Zi5vdXRvYmopOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbWJpZGVjb2Rlcl9yZXNldChNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKnNlbGYpCit7CisJaWYgKHNlbGYtPmNvZGVjLT5kZWNyZXNldCAhPSBOVUxMICYmCisJICAgIHNlbGYtPmNvZGVjLT5kZWNyZXNldCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisJCXJldHVybiBOVUxMOworCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKworCVB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG1iaWRlY29kZXJfbWV0aG9kc1tdID0geworCXsiZGVjb2RlIiwJKFB5Q0Z1bmN0aW9uKW1iaWRlY29kZXJfZGVjb2RlLAorCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgTlVMTH0sCisJeyJyZXNldCIsCShQeUNGdW5jdGlvbiltYmlkZWNvZGVyX3Jlc2V0LAorCQkJTUVUSF9OT0FSR1MsIE5VTEx9LAorCXtOVUxMLAkJTlVMTH0sCit9OworCitzdGF0aWMgUHlPYmplY3QgKgorbWJpZGVjb2Rlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisJTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmOworCVB5T2JqZWN0ICpjb2RlYyA9IE5VTEw7CisJY2hhciAqZXJyb3JzID0gTlVMTDsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8czpJbmNyZW1lbnRhbERlY29kZXIiLAorCQkJCQkgaW5jbmV3a3dhcmdsaXN0LCAmZXJyb3JzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzZWxmID0gKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisJCWdvdG8gZXJyb3JleGl0OworCX0KKworCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisJc2VsZi0+cGVuZGluZ3NpemUgPSAwOworCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisJaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgorCSAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisJCWdvdG8gZXJyb3JleGl0OworCisJUHlfREVDUkVGKGNvZGVjKTsKKwlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKworZXJyb3JleGl0OgorCVB5X1hERUNSRUYoc2VsZik7CisJUHlfWERFQ1JFRihjb2RlYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK21iaWRlY29kZXJfdHJhdmVyc2UoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmLAorCQkgICAgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCit7CisJaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisJCVB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCittYmlkZWNvZGVyX2RlYWxsb2MoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmKQoreworCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisJRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7CisJc2VsZi0+b2JfdHlwZS0+dHBfZnJlZShzZWxmKTsKK30KKworc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJfVHlwZSA9IHsKKwlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKwkwLAkJCQkvKiBvYl9zaXplICovCisJIk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciIsCS8qIHRwX25hbWUgKi8KKwlzaXplb2YoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCisJMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KKwkvKiAgbWV0aG9kcyAgKi8KKwkoZGVzdHJ1Y3RvciltYmlkZWNvZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KKwkwLAkJCQkvKiB0cF9wcmludCAqLworCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KKwkwLAkJCQkvKiB0cF9zZXRhdHRyICovCisJMCwJCQkJLyogdHBfY29tcGFyZSAqLworCTAsCQkJCS8qIHRwX3JlcHIgKi8KKwkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KKwkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLworCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KKwkwLAkJCQkvKiB0cF9oYXNoICovCisJMCwJCQkJLyogdHBfY2FsbCAqLworCTAsCQkJCS8qIHRwX3N0ciAqLworCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLworCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCisJMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisJCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KKwkwLAkJCQkvKiB0cF9kb2MgKi8KKwkodHJhdmVyc2Vwcm9jKW1iaWRlY29kZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCisJMCwJCQkJLyogdHBfY2xlYXIgKi8KKwkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLworCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisJMCwJCQkJLyogdHBfaXRlciAqLworCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KKwltYmlkZWNvZGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCisJMCwJCQkJLyogdHBfbWVtYmVycyAqLworCWNvZGVjY3R4X2dldHNldHMsCQkvKiB0cF9nZXRzZXQgKi8KKwkwLAkJCQkvKiB0cF9iYXNlICovCisJMCwJCQkJLyogdHBfZGljdCAqLworCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLworCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KKwkwLAkJCQkvKiB0cF9pbml0ICovCisJMCwJCQkJLyogdHBfYWxsb2MgKi8KKwltYmlkZWNvZGVyX25ldywJCQkvKiB0cF9uZXcgKi8KK307CisKKworLyoqCisgKiBNdWx0aWJ5dGVTdHJlYW1SZWFkZXIgb2JqZWN0CisgKi8KKwogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtcmVhZGVyX2lyZWFkKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZiwKIAkJICAgICBjb25zdCBjaGFyICptZXRob2QsIFB5X3NzaXplX3Qgc2l6ZWhpbnQpCiB7CiAJTXVsdGlieXRlRGVjb2RlQnVmZmVyIGJ1ZjsKIAlQeU9iamVjdCAqY3JlczsKLQlQeV9zc2l6ZV90IHJzaXplLCByLCBmaW5hbHNpemUgPSAwOworCVB5X3NzaXplX3QgcnNpemUsIGZpbmFsc2l6ZSA9IDA7CiAKIAlpZiAoc2l6ZWhpbnQgPT0gMCkKIAkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCAwKTsKQEAgLTc0MCwzOSArMTIzNywxMyBAQAogCQl9CiAKIAkJcnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjcmVzKTsKLQkJYnVmLmluYnVmID0gYnVmLmluYnVmX3RvcCA9Ci0JCQkodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhjcmVzKTsKLQkJYnVmLmluYnVmX2VuZCA9IGJ1Zi5pbmJ1Zl90b3AgKyByc2l6ZTsKLQkJaWYgKGJ1Zi5vdXRvYmogPT0gTlVMTCkgewotCQkJYnVmLm91dG9iaiA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCByc2l6ZSk7Ci0JCQlpZiAoYnVmLm91dG9iaiA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3JleGl0OwotCQkJYnVmLm91dGJ1ZiA9IFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi5vdXRvYmopOwotCQkJYnVmLm91dGJ1Zl9lbmQgPSBidWYub3V0YnVmICsKLQkJCQkJUHlVbmljb2RlX0dFVF9TSVpFKGJ1Zi5vdXRvYmopOwotCQl9CisJCWlmIChkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKCZidWYsIFB5U3RyaW5nX0FTX1NUUklORyhjcmVzKSwKKwkJCQkJICAgcnNpemUpICE9IDApCisJCQlnb3RvIGVycm9yZXhpdDsKIAotCQlyID0gMDsKLQkJaWYgKHJzaXplID4gMCkKLQkJCXdoaWxlIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kKSB7Ci0JCQkJUHlfc3NpemVfdCBpbmxlZnQsIG91dGxlZnQ7Ci0KLQkJCQlpbmxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLmluYnVmX2VuZCAtCi0JCQkJCQkgICAgICBidWYuaW5idWYpOwotCQkJCW91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1Zl9lbmQgLQotCQkJCQkJICAgICAgIGJ1Zi5vdXRidWYpOwotCi0JCQkJciA9IHNlbGYtPmNvZGVjLT5kZWNvZGUoJnNlbGYtPnN0YXRlLAotCQkJCQkJCXNlbGYtPmNvZGVjLT5jb25maWcsCi0JCQkJCQkJJmJ1Zi5pbmJ1ZiwgaW5sZWZ0LAotCQkJCQkJCSZidWYub3V0YnVmLCBvdXRsZWZ0KTsKLQkJCQlpZiAociA9PSAwIHx8IHIgPT0gTUJFUlJfVE9PRkVXKQotCQkJCQlicmVhazsKLQkJCQllbHNlIGlmIChtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihzZWxmLT5jb2RlYywKLQkJCQkJCSZzZWxmLT5zdGF0ZSwgJmJ1ZiwKLQkJCQkJCXNlbGYtPmVycm9ycywgcikpCi0JCQkJCWdvdG8gZXJyb3JleGl0OwotCQkJfQorCQlpZiAocnNpemUgPiAwICYmIGRlY29kZXJfZmVlZF9idWZmZXIoCisJCQkJKE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQgKilzZWxmLCAmYnVmKSkKKwkJCWdvdG8gZXJyb3JleGl0OwogCiAJCWlmIChyc2l6ZSA9PSAwIHx8IHNpemVoaW50IDwgMCkgeyAvKiBlbmQgb2YgZmlsZSAqLwogCQkJaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQgJiYKQEAgLTc4MiwyMCArMTI1Myw5IEBACiAJCX0KIAogCQlpZiAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeyAvKiBwZW5kaW5nIHNlcXVlbmNlIGV4aXN0cyAqLwotCQkJUHlfc3NpemVfdCBucGVuZGluZ3M7Ci0KLQkJCS8qIHdlIGNhbid0IGFzc3VtZSB0aGF0IHBlbmRpbmdzaXplIGlzIHN0aWxsIDAgaGVyZS4KLQkJCSAqIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5Ci0JCQkgKiBmcm9tIGVycm9yIGNhbGxiYWNrICovCi0JCQlucGVuZGluZ3MgPSAoUHlfc3NpemVfdCkoYnVmLmluYnVmX2VuZCAtIGJ1Zi5pbmJ1Zik7Ci0JCQlpZiAobnBlbmRpbmdzICsgc2VsZi0+cGVuZGluZ3NpemUgPiBNQVhERUNQRU5ESU5HKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJCSJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOworCQkJaWYgKGRlY29kZXJfYXBwZW5kX3BlbmRpbmcoU1RBVEVGVUxfRENUWChzZWxmKSwKKwkJCQkJCSAgICZidWYpICE9IDApCiAJCQkJZ290byBlcnJvcmV4aXQ7Ci0JCQl9Ci0JCQltZW1jcHkoc2VsZi0+cGVuZGluZyArIHNlbGYtPnBlbmRpbmdzaXplLCBidWYuaW5idWYsCi0JCQkJbnBlbmRpbmdzKTsKLQkJCXNlbGYtPnBlbmRpbmdzaXplICs9IG5wZW5kaW5nczsKIAkJfQogCiAJCWZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmIC0KQEAgLTkwMSw4ICsxMzYxLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJc2VsZi0+cGVuZGluZ3NpemUgPSAwOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworCVB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG1ic3RyZWFtcmVhZGVyX21ldGhvZHNbXSA9IHsKQEAgLTkxNywxOCArMTM3Niw3NSBAQAogCXtOVUxMLAkJTlVMTH0sCiB9OwogCitzdGF0aWMgUHlNZW1iZXJEZWYgbWJzdHJlYW1yZWFkZXJfbWVtYmVyc1tdID0geworCXsic3RyZWFtIiwJVF9PQkpFQ1QsCisJCQlvZmZzZXRvZihNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QsIHN0cmVhbSksCisJCQlSRUFET05MWSwgTlVMTH0sCisJe05VTEwsfQorfTsKKworc3RhdGljIFB5T2JqZWN0ICoKK21ic3RyZWFtcmVhZGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKwlNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKnNlbGY7CisJUHlPYmplY3QgKnN0cmVhbSwgKmNvZGVjID0gTlVMTDsKKwljaGFyICplcnJvcnMgPSBOVUxMOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98czpTdHJlYW1SZWFkZXIiLAorCQkJCXN0cmVhbWt3YXJnbGlzdCwgJnN0cmVhbSwgJmVycm9ycykpCisJCXJldHVybiBOVUxMOworCisJc2VsZiA9IChNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWNvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKil0eXBlLCAiY29kZWMiKTsKKwlpZiAoY29kZWMgPT0gTlVMTCkKKwkJZ290byBlcnJvcmV4aXQ7CisJaWYgKCFNdWx0aWJ5dGVDb2RlY19DaGVjayhjb2RlYykpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvZGVjIGlzIHVuZXhwZWN0ZWQgdHlwZSIpOworCQlnb3RvIGVycm9yZXhpdDsKKwl9CisKKwlzZWxmLT5jb2RlYyA9ICgoTXVsdGlieXRlQ29kZWNPYmplY3QgKiljb2RlYyktPmNvZGVjOworCXNlbGYtPnN0cmVhbSA9IHN0cmVhbTsKKwlQeV9JTkNSRUYoc3RyZWFtKTsKKwlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisJc2VsZi0+ZXJyb3JzID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKKwlpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCisJCWdvdG8gZXJyb3JleGl0OworCWlmIChzZWxmLT5jb2RlYy0+ZGVjaW5pdCAhPSBOVUxMICYmCisJICAgIHNlbGYtPmNvZGVjLT5kZWNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKwkJZ290byBlcnJvcmV4aXQ7CisKKwlQeV9ERUNSRUYoY29kZWMpOworCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworCitlcnJvcmV4aXQ6CisJUHlfWERFQ1JFRihzZWxmKTsKKwlQeV9YREVDUkVGKGNvZGVjKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludAorbWJzdHJlYW1yZWFkZXJfdHJhdmVyc2UoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmLAorCQkJdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCit7CisJaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisJCVB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisJUHlfVklTSVQoc2VsZi0+c3RyZWFtKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQKIG1ic3RyZWFtcmVhZGVyX2RlYWxsb2MoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5lcnJvcnMgPiBFUlJPUl9NQVgpIHsKLQkJUHlfREVDUkVGKHNlbGYtPmVycm9ycyk7Ci0JfQorCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisJRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7CiAJUHlfREVDUkVGKHNlbGYtPnN0cmVhbSk7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoc2VsZik7CiB9CiAKLQotCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE11bHRpYnl0ZVN0cmVhbVJlYWRlcl9UeXBlID0gewogCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQogCTAsCQkJCS8qIG9iX3NpemUgKi8KQEAgLTk1MSw5NyArMTQ2Nyw1MCBAQAogCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwogCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCiAJMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJLyogdHBfZmxhZ3MgKi8KKwlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKKwkJfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwogCTAsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCS8qIHRwX3RyYXZlcnNlICovCisJKHRyYXZlcnNlcHJvYyltYnN0cmVhbXJlYWRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KIAkwLAkJCQkvKiB0cF9jbGVhciAqLwogCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCiAJMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KIAkwLAkJCQkvKiB0cF9pdGVyICovCiAJMCwJCQkJLyogdHBfaXRlcmV4dCAqLwogCW1ic3RyZWFtcmVhZGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCisJbWJzdHJlYW1yZWFkZXJfbWVtYmVycywJCS8qIHRwX21lbWJlcnMgKi8KKwljb2RlY2N0eF9nZXRzZXRzLAkJLyogdHBfZ2V0c2V0ICovCisJMCwJCQkJLyogdHBfYmFzZSAqLworCTAsCQkJCS8qIHRwX2RpY3QgKi8KKwkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KKwkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKwkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCisJMCwJCQkJLyogdHBfaW5pdCAqLworCTAsCQkJCS8qIHRwX2FsbG9jICovCisJbWJzdHJlYW1yZWFkZXJfbmV3LAkJLyogdHBfbmV3ICovCiB9OwogCisKKy8qKgorICogTXVsdGlieXRlU3RyZWFtV3JpdGVyIG9iamVjdAorICovCisKIHN0YXRpYyBpbnQKIG1ic3RyZWFtd3JpdGVyX2l3cml0ZShNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGYsCiAJCSAgICAgIFB5T2JqZWN0ICp1bmlzdHIpCiB7Ci0JUHlPYmplY3QgKndyLCAqdWN2dCwgKnIgPSBOVUxMOwotCVB5X1VOSUNPREUgKmluYnVmLCAqaW5idWZfZW5kLCAqaW5idWZfdG1wID0gTlVMTDsKLQlQeV9zc2l6ZV90IGRhdGFsZW47CisJUHlPYmplY3QgKnN0ciwgKndyOwogCi0JaWYgKFB5VW5pY29kZV9DaGVjayh1bmlzdHIpKQotCQl1Y3Z0ID0gTlVMTDsKLQllbHNlIHsKLQkJdW5pc3RyID0gdWN2dCA9IFB5T2JqZWN0X1VuaWNvZGUodW5pc3RyKTsKLQkJaWYgKHVuaXN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQllbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHVuaXN0cikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNvdWxkbid0IGNvbnZlcnQgdGhlIG9iamVjdCB0byB1bmljb2RlLiIpOwotCQkJUHlfREVDUkVGKHVjdnQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorCXN0ciA9IGVuY29kZXJfZW5jb2RlX3N0YXRlZnVsKFNUQVRFRlVMX0VDVFgoc2VsZiksIHVuaXN0ciwgMCk7CisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CiAKLQlkYXRhbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKHVuaXN0cik7Ci0JaWYgKGRhdGFsZW4gPT0gMCkgewotCQlQeV9YREVDUkVGKHVjdnQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc2VsZi0+cGVuZGluZ3NpemUgPiAwKSB7Ci0JCWluYnVmX3RtcCA9IFB5TWVtX05ldyhQeV9VTklDT0RFLCBkYXRhbGVuICsgc2VsZi0+cGVuZGluZ3NpemUpOwotCQlpZiAoaW5idWZfdG1wID09IE5VTEwpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQkJbWVtY3B5KGluYnVmX3RtcCwgc2VsZi0+cGVuZGluZywKLQkJCVB5X1VOSUNPREVfU0laRSAqIHNlbGYtPnBlbmRpbmdzaXplKTsKLQkJbWVtY3B5KGluYnVmX3RtcCArIHNlbGYtPnBlbmRpbmdzaXplLAotCQkJUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKSwKLQkJCVB5X1VOSUNPREVfU0laRSAqIGRhdGFsZW4pOwotCQlkYXRhbGVuICs9IHNlbGYtPnBlbmRpbmdzaXplOwotCQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7Ci0JCWluYnVmID0gaW5idWZfdG1wOwotCX0KLQllbHNlCi0JCWluYnVmID0gKFB5X1VOSUNPREUgKilQeVVuaWNvZGVfQVNfVU5JQ09ERSh1bmlzdHIpOwotCi0JaW5idWZfZW5kID0gaW5idWYgKyBkYXRhbGVuOwotCi0JciA9IG11bHRpYnl0ZWNvZGVjX2VuY29kZShzZWxmLT5jb2RlYywgJnNlbGYtPnN0YXRlLAotCQkJKGNvbnN0IFB5X1VOSUNPREUgKiopJmluYnVmLCBkYXRhbGVuLCBzZWxmLT5lcnJvcnMsIDApOwotCWlmIChyID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCi0JaWYgKGluYnVmIDwgaW5idWZfZW5kKSB7Ci0JCXNlbGYtPnBlbmRpbmdzaXplID0gKFB5X3NzaXplX3QpKGluYnVmX2VuZCAtIGluYnVmKTsKLQkJaWYgKHNlbGYtPnBlbmRpbmdzaXplID4gTUFYRU5DUEVORElORykgewotCQkJc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJInBlbmRpbmcgYnVmZmVyIG92ZXJmbG93Iik7Ci0JCQlnb3RvIGVycm9yZXhpdDsKLQkJfQotCQltZW1jcHkoc2VsZi0+cGVuZGluZywgaW5idWYsCi0JCQlzZWxmLT5wZW5kaW5nc2l6ZSAqIFB5X1VOSUNPREVfU0laRSk7Ci0JfQotCi0Jd3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPnN0cmVhbSwgIndyaXRlIiwgIk8iLCByKTsKKwl3ciA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+c3RyZWFtLCAid3JpdGUiLCAiTyIsIHN0cik7CisJUHlfREVDUkVGKHN0cik7CiAJaWYgKHdyID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OworCQlyZXR1cm4gLTE7CiAKLQlpZiAoaW5idWZfdG1wICE9IE5VTEwpCi0JCVB5TWVtX0RlbChpbmJ1Zl90bXApOwotCVB5X0RFQ1JFRihyKTsKIAlQeV9ERUNSRUYod3IpOwotCVB5X1hERUNSRUYodWN2dCk7CiAJcmV0dXJuIDA7Ci0KLWVycm9yZXhpdDoKLQlpZiAoaW5idWZfdG1wICE9IE5VTEwpCi0JCVB5TWVtX0RlbChpbmJ1Zl90bXApOwotCVB5X1hERUNSRUYocik7Ci0JUHlfWERFQ1JFRih1Y3Z0KTsKLQlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMDU0LDEwICsxNTIzLDggQEAKIAogCWlmIChtYnN0cmVhbXdyaXRlcl9pd3JpdGUoc2VsZiwgc3Ryb2JqKSkKIAkJcmV0dXJuIE5VTEw7Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorCWVsc2UKKwkJUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMDg3LDggKzE1NTQsNyBAQAogCQkJcmV0dXJuIE5VTEw7CiAJfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworCVB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTExOSwxOCArMTU4NSw2OSBAQAogCX0KIAlQeV9ERUNSRUYocHdydCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisJUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCittYnN0cmVhbXdyaXRlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisJTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmOworCVB5T2JqZWN0ICpzdHJlYW0sICpjb2RlYyA9IE5VTEw7CisJY2hhciAqZXJyb3JzID0gTlVMTDsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfHM6U3RyZWFtV3JpdGVyIiwKKwkJCQlzdHJlYW1rd2FyZ2xpc3QsICZzdHJlYW0sICZlcnJvcnMpKQorCQlyZXR1cm4gTlVMTDsKKworCXNlbGYgPSAoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisJaWYgKHNlbGYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwljb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopdHlwZSwgImNvZGVjIik7CisJaWYgKGNvZGVjID09IE5VTEwpCisJCWdvdG8gZXJyb3JleGl0OworCWlmICghTXVsdGlieXRlQ29kZWNfQ2hlY2soY29kZWMpKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBpcyB1bmV4cGVjdGVkIHR5cGUiKTsKKwkJZ290byBlcnJvcmV4aXQ7CisJfQorCisJc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKKwlzZWxmLT5zdHJlYW0gPSBzdHJlYW07CisJUHlfSU5DUkVGKHN0cmVhbSk7CisJc2VsZi0+cGVuZGluZ3NpemUgPSAwOworCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisJaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoc2VsZi0+Y29kZWMtPmVuY2luaXQgIT0gTlVMTCAmJgorCSAgICBzZWxmLT5jb2RlYy0+ZW5jaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisJCWdvdG8gZXJyb3JleGl0OworCisJUHlfREVDUkVGKGNvZGVjKTsKKwlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKworZXJyb3JleGl0OgorCVB5X1hERUNSRUYoc2VsZik7CisJUHlfWERFQ1JFRihjb2RlYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK21ic3RyZWFtd3JpdGVyX3RyYXZlcnNlKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZiwKKwkJCXZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworCWlmIChFUlJPUl9JU0NVU1RPTShzZWxmLT5lcnJvcnMpKQorCQlQeV9WSVNJVChzZWxmLT5lcnJvcnMpOworCVB5X1ZJU0lUKHNlbGYtPnN0cmVhbSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBtYnN0cmVhbXdyaXRlcl9kZWFsbG9jKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+ZXJyb3JzID4gRVJST1JfTUFYKSB7Ci0JCVB5X0RFQ1JFRihzZWxmLT5lcnJvcnMpOwotCX0KKwlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOwogCVB5X0RFQ1JFRihzZWxmLT5zdHJlYW0pOwotCVB5T2JqZWN0X0RlbChzZWxmKTsKKwlzZWxmLT5vYl90eXBlLT50cF9mcmVlKHNlbGYpOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG1ic3RyZWFtd3JpdGVyX21ldGhvZHNbXSA9IHsKQEAgLTExNDMsNyArMTY2MCwxMiBAQAogCXtOVUxMLAkJTlVMTH0sCiB9OwogCi0KK3N0YXRpYyBQeU1lbWJlckRlZiBtYnN0cmVhbXdyaXRlcl9tZW1iZXJzW10gPSB7CisJeyJzdHJlYW0iLAlUX09CSkVDVCwKKwkJCW9mZnNldG9mKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCwgc3RyZWFtKSwKKwkJCVJFQURPTkxZLCBOVUxMfSwKKwl7TlVMTCx9Cit9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE11bHRpYnl0ZVN0cmVhbVdyaXRlcl9UeXBlID0gewogCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQpAQCAtMTE2NywxNyArMTY4OSwzMyBAQAogCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwogCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCiAJMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJLyogdHBfZmxhZ3MgKi8KKwlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKKwkJfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwogCTAsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCS8qIHRwX3RyYXZlcnNlICovCisJKHRyYXZlcnNlcHJvYyltYnN0cmVhbXdyaXRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KIAkwLAkJCQkvKiB0cF9jbGVhciAqLwogCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCiAJMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KIAkwLAkJCQkvKiB0cF9pdGVyICovCiAJMCwJCQkJLyogdHBfaXRlcmV4dCAqLwogCW1ic3RyZWFtd3JpdGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCisJbWJzdHJlYW13cml0ZXJfbWVtYmVycywJCS8qIHRwX21lbWJlcnMgKi8KKwljb2RlY2N0eF9nZXRzZXRzLAkJLyogdHBfZ2V0c2V0ICovCisJMCwJCQkJLyogdHBfYmFzZSAqLworCTAsCQkJCS8qIHRwX2RpY3QgKi8KKwkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KKwkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKwkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCisJMCwJCQkJLyogdHBfaW5pdCAqLworCTAsCQkJCS8qIHRwX2FsbG9jICovCisJbWJzdHJlYW13cml0ZXJfbmV3LAkJLyogdHBfbmV3ICovCiB9OwogCisKKy8qKgorICogRXhwb3NlZCBmYWN0b3J5IGZ1bmN0aW9uCisgKi8KKwogc3RhdGljIFB5T2JqZWN0ICoKIF9fY3JlYXRlX2NvZGVjKFB5T2JqZWN0ICppZ25vcmUsIFB5T2JqZWN0ICphcmcpCiB7CkBAIC0xMjAxLDgwICsxNzM5LDM4IEBACiAJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1tYnN0cmVhbXJlYWRlcl9jcmVhdGUoTXVsdGlieXRlQ29kZWMgKmNvZGVjLAotCQkgICAgICBQeU9iamVjdCAqc3RyZWFtLCBjb25zdCBjaGFyICplcnJvcnMpCi17Ci0JTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmOwotCi0Jc2VsZiA9IFB5T2JqZWN0X05ldyhNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QsCi0JCQkmTXVsdGlieXRlU3RyZWFtUmVhZGVyX1R5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0Jc2VsZi0+Y29kZWMgPSBjb2RlYzsKLQlzZWxmLT5zdHJlYW0gPSBzdHJlYW07Ci0JUHlfSU5DUkVGKHN0cmVhbSk7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCXNlbGYtPmVycm9ycyA9IGdldF9lcnJvcmNhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OwotCi0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci0KLWVycm9yZXhpdDoKLQlQeV9YREVDUkVGKHNlbGYpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbWJzdHJlYW13cml0ZXJfY3JlYXRlKE11bHRpYnl0ZUNvZGVjICpjb2RlYywKLQkJICAgICAgUHlPYmplY3QgKnN0cmVhbSwgY29uc3QgY2hhciAqZXJyb3JzKQotewotCU11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZjsKLQotCXNlbGYgPSBQeU9iamVjdF9OZXcoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0LAotCQkJJk11bHRpYnl0ZVN0cmVhbVdyaXRlcl9UeXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXNlbGYtPmNvZGVjID0gY29kZWM7Ci0Jc2VsZi0+c3RyZWFtID0gc3RyZWFtOwotCVB5X0lOQ1JFRihzdHJlYW0pOwotCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKLQlzZWxmLT5lcnJvcnMgPSBnZXRfZXJyb3JjYWxsYmFjayhlcnJvcnMpOwotCWlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKHNlbGYtPmNvZGVjLT5lbmNpbml0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmVuY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlnb3RvIGVycm9yZXhpdDsKLQotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotCi1lcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihzZWxmKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBfX21ldGhvZHNbXSA9IHsKIAl7Il9fY3JlYXRlX2NvZGVjIiwgKFB5Q0Z1bmN0aW9uKV9fY3JlYXRlX2NvZGVjLCBNRVRIX099LAogCXtOVUxMLCBOVUxMfSwKIH07CiAKLXZvaWQKK1B5TU9ESU5JVF9GVU5DCiBpbml0X211bHRpYnl0ZWNvZGVjKHZvaWQpCiB7CisJaW50IGk7CisJUHlPYmplY3QgKm07CisJUHlUeXBlT2JqZWN0ICp0eXBlbGlzdFtdID0geworCQkmTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyX1R5cGUsCisJCSZNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJfVHlwZSwKKwkJJk11bHRpYnl0ZVN0cmVhbVJlYWRlcl9UeXBlLAorCQkmTXVsdGlieXRlU3RyZWFtV3JpdGVyX1R5cGUsCisJCU5VTEwKKwl9OworCiAJaWYgKFB5VHlwZV9SZWFkeSgmTXVsdGlieXRlQ29kZWNfVHlwZSkgPCAwKQogCQlyZXR1cm47Ci0JaWYgKFB5VHlwZV9SZWFkeSgmTXVsdGlieXRlU3RyZWFtUmVhZGVyX1R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChQeVR5cGVfUmVhZHkoJk11bHRpYnl0ZVN0cmVhbVdyaXRlcl9UeXBlKSA8IDApCisKKwltID0gUHlfSW5pdE1vZHVsZSgiX211bHRpYnl0ZWNvZGVjIiwgX19tZXRob2RzKTsKKwlpZiAobSA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlQeV9Jbml0TW9kdWxlKCJfbXVsdGlieXRlY29kZWMiLCBfX21ldGhvZHMpOworCWZvciAoaSA9IDA7IHR5cGVsaXN0W2ldICE9IE5VTEw7IGkrKykgeworCQlpZiAoUHlUeXBlX1JlYWR5KHR5cGVsaXN0W2ldKSA8IDApCisJCQlyZXR1cm47CisJCVB5X0lOQ1JFRih0eXBlbGlzdFtpXSk7CisJCVB5TW9kdWxlX0FkZE9iamVjdChtLCB0eXBlbGlzdFtpXS0+dHBfbmFtZSwKKwkJCQkgICAoUHlPYmplY3QgKil0eXBlbGlzdFtpXSk7CisJfQogCiAJaWYgKFB5RXJyX09jY3VycmVkKCkpCiAJCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgdGhlIF9tdWx0aWJ5dGVjb2RlYyBtb2R1bGUiKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmggYi9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5oCmluZGV4IGVjNDljNzguLjIyZWE1ZDQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmgKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuaApAQCAtNjcsMjQgKzY3LDUxIEBACiAJTXVsdGlieXRlQ29kZWMgKmNvZGVjOwogfSBNdWx0aWJ5dGVDb2RlY09iamVjdDsKIAotI2RlZmluZSBNQVhERUNQRU5ESU5HCTgKKyNkZWZpbmUgTXVsdGlieXRlQ29kZWNfQ2hlY2sob3ApICgob3ApLT5vYl90eXBlID09ICZNdWx0aWJ5dGVDb2RlY19UeXBlKQorCisjZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQJCVwKKwlQeU9iamVjdF9IRUFECQkJCVwKKwlNdWx0aWJ5dGVDb2RlYyAqY29kZWM7CQkJXAorCU11bHRpYnl0ZUNvZGVjX1N0YXRlIHN0YXRlOwkJXAorCVB5T2JqZWN0ICplcnJvcnM7CiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCU11bHRpYnl0ZUNvZGVjICpjb2RlYzsKLQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsKLQl1bnNpZ25lZCBjaGFyIHBlbmRpbmdbTUFYREVDUEVORElOR107Ci0JUHlfc3NpemVfdCBwZW5kaW5nc2l6ZTsKLQlQeU9iamVjdCAqc3RyZWFtLCAqZXJyb3JzOwotfSBNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3Q7CisJX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRAorfSBNdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjQ29udGV4dDsKIAogI2RlZmluZSBNQVhFTkNQRU5ESU5HCTIKLXR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTXVsdGlieXRlQ29kZWMgKmNvZGVjOwotCU11bHRpYnl0ZUNvZGVjX1N0YXRlIHN0YXRlOwotCVB5X1VOSUNPREUgcGVuZGluZ1tNQVhFTkNQRU5ESU5HXTsKKyNkZWZpbmUgX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECQlcCisJX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRAkJXAorCVB5X1VOSUNPREUgcGVuZGluZ1tNQVhFTkNQRU5ESU5HXTsJXAogCVB5X3NzaXplX3QgcGVuZGluZ3NpemU7Ci0JUHlPYmplY3QgKnN0cmVhbSwgKmVycm9yczsKK3R5cGVkZWYgc3RydWN0IHsKKwlfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQKK30gTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyQ29udGV4dDsKKworI2RlZmluZSBNQVhERUNQRU5ESU5HCTgKKyNkZWZpbmUgX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFECQlcCisJX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRAkJXAorCXVuc2lnbmVkIGNoYXIgcGVuZGluZ1tNQVhERUNQRU5ESU5HXTsJXAorCVB5X3NzaXplX3QgcGVuZGluZ3NpemU7Cit0eXBlZGVmIHN0cnVjdCB7CisJX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFECit9IE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQKK30gTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisJX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFECit9IE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAorCVB5T2JqZWN0ICpzdHJlYW07Cit9IE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRAorCVB5T2JqZWN0ICpzdHJlYW07CiB9IE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdDsKIAogLyogcG9zaXRpdmUgdmFsdWVzIGZvciBpbGxlZ2FsIHNlcXVlbmNlcyAqLwpAQCAtOTUsNyArMTIyLDEyIEBACiAjZGVmaW5lIEVSUk9SX1NUUklDVAkJKFB5T2JqZWN0ICopKDEpCiAjZGVmaW5lIEVSUk9SX0lHTk9SRQkJKFB5T2JqZWN0ICopKDIpCiAjZGVmaW5lIEVSUk9SX1JFUExBQ0UJCShQeU9iamVjdCAqKSgzKQotI2RlZmluZSBFUlJPUl9NQVgJCUVSUk9SX1JFUExBQ0UKKyNkZWZpbmUgRVJST1JfSVNDVVNUT00ocCkJKChwKSA8IEVSUk9SX1NUUklDVCB8fCBFUlJPUl9SRVBMQUNFIDwgKHApKQorI2RlZmluZSBFUlJPUl9ERUNSRUYocCkgZG8gewkJCVwKKwlpZiAocCAhPSBOVUxMICYmIEVSUk9SX0lTQ1VTVE9NKHApKSB7CVwKKwkJUHlfREVDUkVGKHApOwkJCVwKKwl9CQkJCQlcCit9IHdoaWxlICgwKTsKIAogI2RlZmluZSBNQkVOQ19GTFVTSAkJMHgwMDAxIC8qIGVuY29kZSBhbGwgY2hhcmFjdGVycyBlbmNvZGFibGUgKi8KICNkZWZpbmUgTUJFTkNfTUFYCQlNQkVOQ19GTFVTSApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jb2xsZWN0aW9uc21vZHVsZS5jIGIvTW9kdWxlcy9jb2xsZWN0aW9uc21vZHVsZS5jCmluZGV4IGI4MGFiMDcuLmM3ZTJjODUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY29sbGVjdGlvbnNtb2R1bGUuYworKysgYi9Nb2R1bGVzL2NvbGxlY3Rpb25zbW9kdWxlLmMKQEAgLTgzMiwxMSArODMyLDExIEBACiAJMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KIAkvKiBtZXRob2RzICovCiAJKGRlc3RydWN0b3IpZGVxdWVfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCShwcmludGZ1bmMpZGVxdWVfdHBfcHJpbnQsCS8qIHRwX3ByaW50ICovCisJZGVxdWVfdHBfcHJpbnQsCQkJLyogdHBfcHJpbnQgKi8KIAkwLAkJCQkvKiB0cF9nZXRhdHRyICovCiAJMCwJCQkJLyogdHBfc2V0YXR0ciAqLwogCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZGVxdWVfcmVwciwJCS8qIHRwX3JlcHIgKi8KKwlkZXF1ZV9yZXByLAkJCS8qIHRwX3JlcHIgKi8KIAkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KIAkmZGVxdWVfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwogCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KQEAgLTEyMzYsMTAgKzEyMzYsNyBAQAogc3RhdGljIGludAogZGVmZGljdF90cF9jbGVhcihkZWZkaWN0b2JqZWN0ICpkZCkKIHsKLQlpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSAhPSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKLQkJZGQtPmRlZmF1bHRfZmFjdG9yeSA9IE5VTEw7Ci0JfQorCVB5X0NMRUFSKGRkLT5kZWZhdWx0X2ZhY3RvcnkpOwogCXJldHVybiBQeURpY3RfVHlwZS50cF9jbGVhcigoUHlPYmplY3QgKilkZCk7CiB9CiAKQEAgLTEyNzcsOCArMTI3NCwxMSBAQAogQSBkZWZhdWx0ZGljdCBjb21wYXJlcyBlcXVhbCB0byBhIGRpY3Qgd2l0aCB0aGUgc2FtZSBpdGVtcy5cblwKICIpOwogCisvKiBTZWUgY29tbWVudCBpbiB4eHN1YnR5cGUuYyAqLworI2RlZmluZSBERUZFUlJFRF9BRERSRVNTKEFERFIpIDAKKwogc3RhdGljIFB5VHlwZU9iamVjdCBkZWZkaWN0X3R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisJUHlPYmplY3RfSEVBRF9JTklUKERFRkVSUkVEX0FERFJFU1MoJlB5VHlwZV9UeXBlKSkKIAkwLAkJCQkvKiBvYl9zaXplICovCiAJImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0IiwJLyogdHBfbmFtZSAqLwogCXNpemVvZihkZWZkaWN0b2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwpAQCAtMTMwMiw3ICsxMzAyLDcgQEAKIAlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKIAkJUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLAkvKiB0cF9mbGFncyAqLwogCWRlZmRpY3RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZGVmZGljdF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KKwlkZWZkaWN0X3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KIAkoaW5xdWlyeSlkZWZkaWN0X3RwX2NsZWFyLAkvKiB0cF9jbGVhciAqLwogCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCiAJMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQqLwpAQCAtMTMxMSwxMiArMTMxMSwxMiBAQAogCWRlZmRpY3RfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KIAlkZWZkaWN0X21lbWJlcnMsCQkvKiB0cF9tZW1iZXJzICovCiAJMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JJlB5RGljdF9UeXBlLAkJCS8qIHRwX2Jhc2UgKi8KKwlERUZFUlJFRF9BRERSRVNTKCZQeURpY3RfVHlwZSksCS8qIHRwX2Jhc2UgKi8KIAkwLAkJCQkvKiB0cF9kaWN0ICovCiAJMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCiAJMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCiAJMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylkZWZkaWN0X2luaXQsCQkvKiB0cF9pbml0ICovCisJZGVmZGljdF9pbml0LAkJCS8qIHRwX2luaXQgKi8KIAlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJLyogdHBfYWxsb2MgKi8KIAkwLAkJCQkvKiB0cF9uZXcgKi8KIAlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCkBAIC0xMzQ0LDYgKzEzNDQsNyBAQAogCVB5X0lOQ1JFRigmZGVxdWVfdHlwZSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkZXF1ZSIsIChQeU9iamVjdCAqKSZkZXF1ZV90eXBlKTsKIAorCWRlZmRpY3RfdHlwZS50cF9iYXNlID0gJlB5RGljdF9UeXBlOwogCWlmIChQeVR5cGVfUmVhZHkoJmRlZmRpY3RfdHlwZSkgPCAwKQogCQlyZXR1cm47CiAJUHlfSU5DUkVGKCZkZWZkaWN0X3R5cGUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jb25maWcuYy5pbiBiL01vZHVsZXMvY29uZmlnLmMuaW4KaW5kZXggOWVjMjgxYy4uZjgxMTk5MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jb25maWcuYy5pbgorKysgYi9Nb2R1bGVzL2NvbmZpZy5jLmluCkBAIC0xNyw2ICsxNywxMCBAQAogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwogCiAvKiAtLSBBRERNT0RVTEUgTUFSS0VSIDEgLS0gKi8KIApAQCAtNTAsMyArNTQsOSBAQAogCS8qIFNlbnRpbmVsICovCiAJezAsIDB9CiB9OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYyBiL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYwppbmRleCBjMWEwY2IzLi45YWUyMzVhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9kYXRldGltZW1vZHVsZS5jCkBAIC0xMjI4LDggKzEyMjgsOCBAQAogCQkJCX0KIAkJCX0KIAkJCWFzc2VydCh6cmVwbGFjZW1lbnQgIT0gTlVMTCk7Ci0JCQlwdG9hcHBlbmQgPSBQeVN0cmluZ19Bc1N0cmluZyh6cmVwbGFjZW1lbnQpOwotCQkJbnRvYXBwZW5kID0gUHlTdHJpbmdfU2l6ZSh6cmVwbGFjZW1lbnQpOworCQkJcHRvYXBwZW5kID0gUHlTdHJpbmdfQVNfU1RSSU5HKHpyZXBsYWNlbWVudCk7CisJCQludG9hcHBlbmQgPSBQeVN0cmluZ19HRVRfU0laRSh6cmVwbGFjZW1lbnQpOwogCQl9CiAJCWVsc2UgaWYgKGNoID09ICdaJykgewogCQkJLyogZm9ybWF0IHR6bmFtZSAqLwpAQCAtMTI1NywxNCArMTI1NywxOCBAQAogCQkJCQkJUHlfREVDUkVGKHRlbXApOwogCQkJCQkJaWYgKFpyZXBsYWNlbWVudCA9PSBOVUxMKQogCQkJCQkJCWdvdG8gRG9uZTsKKwkJCQkJCWlmICghUHlTdHJpbmdfQ2hlY2soWnJlcGxhY2VtZW50KSkgeworCQkJCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ0em5hbWUucmVwbGFjZSgpIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nIik7CisJCQkJCQkJZ290byBEb25lOworCQkJCQkJfQogCQkJCQl9CiAJCQkJCWVsc2UKIAkJCQkJCVB5X0RFQ1JFRih0ZW1wKTsKIAkJCQl9CiAJCQl9CiAJCQlhc3NlcnQoWnJlcGxhY2VtZW50ICE9IE5VTEwpOwotCQkJcHRvYXBwZW5kID0gUHlTdHJpbmdfQXNTdHJpbmcoWnJlcGxhY2VtZW50KTsKLQkJCW50b2FwcGVuZCA9IFB5U3RyaW5nX1NpemUoWnJlcGxhY2VtZW50KTsKKwkJCXB0b2FwcGVuZCA9IFB5U3RyaW5nX0FTX1NUUklORyhacmVwbGFjZW1lbnQpOworCQkJbnRvYXBwZW5kID0gUHlTdHJpbmdfR0VUX1NJWkUoWnJlcGxhY2VtZW50KTsKIAkJfQogCQllbHNlIHsKIAkJCS8qIHBlcmNlbnQgZm9sbG93ZWQgYnkgbmVpdGhlciB6IG5vciBaICovCkBAIC0xMjc1LDYgKzEyNzksNyBAQAogIAkJLyogQXBwZW5kIHRoZSBudG9hcHBlbmQgY2hhcnMgc3RhcnRpbmcgYXQgcHRvYXBwZW5kIHRvCiAgCQkgKiB0aGUgbmV3IGZvcm1hdC4KICAJCSAqLworIAkJYXNzZXJ0KHB0b2FwcGVuZCAhPSBOVUxMKTsKICAJCWFzc2VydChudG9hcHBlbmQgPj0gMCk7CiAgCQlpZiAobnRvYXBwZW5kID09IDApCiAgCQkJY29udGludWU7CkBAIC0yNDA0LDExICsyNDA5LDExIEBACiBkYXRlX3JlcHIoUHlEYXRlVGltZV9EYXRlICpzZWxmKQogewogCWNoYXIgYnVmZmVyWzEwMjhdOwotCWNvbnN0IGNoYXIgKnR5cGVuYW1lOworCWNvbnN0IGNoYXIgKnR5cGVfbmFtZTsKIAotCXR5cGVuYW1lID0gc2VsZi0+b2JfdHlwZS0+dHBfbmFtZTsKKwl0eXBlX25hbWUgPSBzZWxmLT5vYl90eXBlLT50cF9uYW1lOwogCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzKCVkLCAlZCwgJWQpIiwKLQkJICAgICAgdHlwZW5hbWUsCisJCSAgICAgIHR5cGVfbmFtZSwKIAkJICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CiAKIAlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOwpAQCAtMzEzMCw3ICszMTM1LDcgQEAKIHRpbWVfcmVwcihQeURhdGVUaW1lX1RpbWUgKnNlbGYpCiB7CiAJY2hhciBidWZmZXJbMTAwXTsKLQljb25zdCBjaGFyICp0eXBlbmFtZSA9IHNlbGYtPm9iX3R5cGUtPnRwX25hbWU7CisJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gc2VsZi0+b2JfdHlwZS0+dHBfbmFtZTsKIAlpbnQgaCA9IFRJTUVfR0VUX0hPVVIoc2VsZik7CiAJaW50IG0gPSBUSU1FX0dFVF9NSU5VVEUoc2VsZik7CiAJaW50IHMgPSBUSU1FX0dFVF9TRUNPTkQoc2VsZik7CkBAIC0zMTM5LDEzICszMTQ0LDEzIEBACiAKIAlpZiAodXMpCiAJCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICIlcyglZCwgJWQsICVkLCAlZCkiLCB0eXBlbmFtZSwgaCwgbSwgcywgdXMpOworCQkJICAgICAgIiVzKCVkLCAlZCwgJWQsICVkKSIsIHR5cGVfbmFtZSwgaCwgbSwgcywgdXMpOwogCWVsc2UgaWYgKHMpCiAJCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICIlcyglZCwgJWQsICVkKSIsIHR5cGVuYW1lLCBoLCBtLCBzKTsKKwkJCSAgICAgICIlcyglZCwgJWQsICVkKSIsIHR5cGVfbmFtZSwgaCwgbSwgcyk7CiAJZWxzZQogCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkKSIsIHR5cGVuYW1lLCBoLCBtKTsKKwkJCSAgICAgICIlcyglZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtKTsKIAlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CiAJaWYgKHJlc3VsdCAhPSBOVUxMICYmIEhBU1RaSU5GTyhzZWxmKSkKIAkJcmVzdWx0ID0gYXBwZW5kX2tleXdvcmRfdHppbmZvKHJlc3VsdCwgc2VsZi0+dHppbmZvKTsKQEAgLTM4MTYsNiArMzgyMSwxMCBAQAogCQlpZiAoUHlTZXF1ZW5jZV9DaGVjayhvYmopICYmIFB5U2VxdWVuY2VfU2l6ZShvYmopID49IDYpCiAJCQlmb3IgKGk9MDsgaSA8IDY7IGkrKykgewogCQkJCVB5T2JqZWN0ICpwID0gUHlTZXF1ZW5jZV9HZXRJdGVtKG9iaiwgaSk7CisJCQkJaWYgKHAgPT0gTlVMTCkgeworCQkJCQlQeV9ERUNSRUYob2JqKTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQogCQkJCWlmIChQeUludF9DaGVjayhwKSkKIAkJCQkJaWFbaV0gPSBQeUludF9Bc0xvbmcocCk7CiAJCQkJZWxzZQpAQCAtNDAyMywxMyArNDAzMiwxMyBAQAogZGF0ZXRpbWVfcmVwcihQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewogCWNoYXIgYnVmZmVyWzEwMDBdOwotCWNvbnN0IGNoYXIgKnR5cGVuYW1lID0gc2VsZi0+b2JfdHlwZS0+dHBfbmFtZTsKKwljb25zdCBjaGFyICp0eXBlX25hbWUgPSBzZWxmLT5vYl90eXBlLT50cF9uYW1lOwogCVB5T2JqZWN0ICpiYXNlcmVwcjsKIAogCWlmIChEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSkgewogCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCiAJCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQpIiwKLQkJCSAgICAgIHR5cGVuYW1lLAorCQkJICAgICAgdHlwZV9uYW1lLAogCQkJICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSwKIAkJCSAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksIERBVEVfR0VUX01JTlVURShzZWxmKSwKIAkJCSAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKQEAgLTQwMzgsNyArNDA0Nyw3IEBACiAJZWxzZSBpZiAoREFURV9HRVRfU0VDT05EKHNlbGYpKSB7CiAJCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKIAkJCSAgICAgICIlcyglZCwgJWQsICVkLCAlZCwgJWQsICVkKSIsCi0JCQkgICAgICB0eXBlbmFtZSwKKwkJCSAgICAgIHR5cGVfbmFtZSwKIAkJCSAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCiAJCQkgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCiAJCQkgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZikpOwpAQCAtNDA0Niw3ICs0MDU1LDcgQEAKIAllbHNlIHsKIAkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAogCQkJICAgICAgIiVzKCVkLCAlZCwgJWQsICVkLCAlZCkiLAotCQkJICAgICAgdHlwZW5hbWUsCisJCQkgICAgICB0eXBlX25hbWUsCiAJCQkgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpLAogCQkJICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpKTsKIAl9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Z1bmN0aW9uYWxtb2R1bGUuYyBiL01vZHVsZXMvZnVuY3Rpb25hbG1vZHVsZS5jCmluZGV4IDRiMmU5YjQuLjM4ZWY0M2EgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZnVuY3Rpb25hbG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZnVuY3Rpb25hbG1vZHVsZS5jCkBAIC00OCw3ICs0OCw3IEBACiAKIAlwdG8tPmZuID0gZnVuYzsKIAlQeV9JTkNSRUYoZnVuYyk7Ci0JcHRvLT5hcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBJTlRfTUFYKTsKKwlwdG8tPmFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIFBZX1NTSVpFX1RfTUFYKTsKIAlpZiAocHRvLT5hcmdzID09IE5VTEwpIHsKIAkJcHRvLT5rdyA9IE5VTEw7CiAJCVB5X0RFQ1JFRihwdG8pOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nY21vZHVsZS5jIGIvTW9kdWxlcy9nY21vZHVsZS5jCmluZGV4IDdlM2Y5NWEuLjAxNzZkNmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2Ntb2R1bGUuYworKysgYi9Nb2R1bGVzL2djbW9kdWxlLmMKQEAgLTQxMyw4ICs0MTMsMTIgQEAKIAkJYXNzZXJ0KGRlbHN0ciAhPSBOVUxMKTsKIAkJcmV0dXJuIF9QeUluc3RhbmNlX0xvb2t1cChvcCwgZGVsc3RyKSAhPSBOVUxMOwogCX0KLQllbHNlIAorCWVsc2UgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKG9wLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKIAkJcmV0dXJuIG9wLT5vYl90eXBlLT50cF9kZWwgIT0gTlVMTDsKKwllbHNlIGlmIChQeUdlbl9DaGVja0V4YWN0KG9wKSkKKwkJcmV0dXJuIFB5R2VuX05lZWRzRmluYWxpemluZygoUHlHZW5PYmplY3QgKilvcCk7CisJZWxzZQorCQlyZXR1cm4gMDsKIH0KIAogLyogTW92ZSB0aGUgb2JqZWN0cyBpbiB1bnJlYWNoYWJsZSB3aXRoIF9fZGVsX18gbWV0aG9kcyBpbnRvIGBmaW5hbGl6ZXJzYC4KQEAgLTczMCw2ICs3MzQsOCBAQAogCVB5R0NfSGVhZCB1bnJlYWNoYWJsZTsgLyogbm9uLXByb2JsZW1hdGljIHVucmVhY2hhYmxlIHRyYXNoICovCiAJUHlHQ19IZWFkIGZpbmFsaXplcnM7ICAvKiBvYmplY3RzIHdpdGgsICYgcmVhY2hhYmxlIGZyb20sIF9fZGVsX18gKi8KIAlQeUdDX0hlYWQgKmdjOworCXN0YXRpYyBQeU9iamVjdCAqdG1vZCA9IE5VTEw7CisJZG91YmxlIHQxID0gMC4wOwogCiAJaWYgKGRlbHN0ciA9PSBOVUxMKSB7CiAJCWRlbHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsX18iKTsKQEAgLTczNywxOSArNzQzLDI5IEBACiAJCQlQeV9GYXRhbEVycm9yKCJnYyBjb3VsZG4ndCBhbGxvY2F0ZSBcIl9fZGVsX19cIiIpOwogCX0KIAorCWlmICh0bW9kID09IE5VTEwpIHsKKwkJdG1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgidGltZSIpOworCQlpZiAodG1vZCA9PSBOVUxMKQorCQkJUHlFcnJfQ2xlYXIoKTsKKwl9CisKIAlpZiAoZGVidWcgJiBERUJVR19TVEFUUykgeworCQlpZiAodG1vZCAhPSBOVUxMKSB7CisJCQlQeU9iamVjdCAqZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodG1vZCwgInRpbWUiLCBOVUxMKTsKKwkJCWlmIChmID09IE5VTEwpIHsKKwkJCQlQeUVycl9DbGVhcigpOworCQkJfQorCQkJZWxzZSB7CisJCQkJdDEgPSBQeUZsb2F0X0FzRG91YmxlKGYpOworCQkJCVB5X0RFQ1JFRihmKTsKKwkJCX0KKwkJfQogCQlQeVN5c19Xcml0ZVN0ZGVycigiZ2M6IGNvbGxlY3RpbmcgZ2VuZXJhdGlvbiAlZC4uLlxuIiwKIAkJCQkgIGdlbmVyYXRpb24pOwogCQlQeVN5c19Xcml0ZVN0ZGVycigiZ2M6IG9iamVjdHMgaW4gZWFjaCBnZW5lcmF0aW9uOiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspIHsKLSNpZmRlZiBNU19XSU42NAotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiAlSWQiLCBnY19saXN0X3NpemUoR0VOX0hFQUQoaSkpKTsKLSNlbHNlCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiICVsZCIsCi0JCQkJUHlfU0FGRV9ET1dOQ0FTVChnY19saXN0X3NpemUoR0VOX0hFQUQoaSkpLAotCQkJCQkJIFB5X3NzaXplX3QsIGxvbmcpKTsKLSNlbmRpZgotCQl9CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fR0VORVJBVElPTlM7IGkrKykKKwkJCVB5U3lzX1dyaXRlU3RkZXJyKCIgJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCisJCQkJCSAgZ2NfbGlzdF9zaXplKEdFTl9IRUFEKGkpKSk7CiAJCVB5U3lzX1dyaXRlU3RkZXJyKCJcbiIpOwogCX0KIApAQCAtODE2LDYgKzgzMiwxNyBAQAogCQlpZiAoZGVidWcgJiBERUJVR19DT0xMRUNUQUJMRSkgewogCQkJZGVidWdfY3ljbGUoImNvbGxlY3RhYmxlIiwgRlJPTV9HQyhnYykpOwogCQl9CisJCWlmICh0bW9kICE9IE5VTEwgJiYgKGRlYnVnICYgREVCVUdfU1RBVFMpKSB7CisJCQlQeU9iamVjdCAqZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodG1vZCwgInRpbWUiLCBOVUxMKTsKKwkJCWlmIChmID09IE5VTEwpIHsKKwkJCQlQeUVycl9DbGVhcigpOworCQkJfQorCQkJZWxzZSB7CisJCQkJdDEgPSBQeUZsb2F0X0FzRG91YmxlKGYpLXQxOworCQkJCVB5X0RFQ1JFRihmKTsKKwkJCQlQeVN5c19Xcml0ZVN0ZGVycigiZ2M6ICUuNGZzIGVsYXBzZWQuXG4iLCB0MSk7CisJCQl9CisJCX0KIAl9CiAKIAkvKiBDbGVhciB3ZWFrcmVmcyBhbmQgaW52b2tlIGNhbGxiYWNrcyBhcyBuZWNlc3NhcnkuICovCkBAIC04MzcsMjEgKzg2NCwxNCBAQAogCQkJZGVidWdfY3ljbGUoInVuY29sbGVjdGFibGUiLCBGUk9NX0dDKGdjKSk7CiAJfQogCWlmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSB7Ci0JCWlmIChtID09IDAgJiYgbiA9PSAwKSB7CisJCWlmIChtID09IDAgJiYgbiA9PSAwKQogCQkJUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBkb25lLlxuIik7Ci0JCX0KLQkJZWxzZSB7Ci0jaWZkZWYgTVNfV0lONjQKKwkJZWxzZQogCQkJUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkgICAgImdjOiBkb25lLCAlSWQgdW5yZWFjaGFibGUsICVJZCB1bmNvbGxlY3RhYmxlLlxuIiwKKwkJCSAgICAiZ2M6IGRvbmUsICIKKwkJCSAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCB1bnJlYWNoYWJsZSwgIgorCQkJICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIHVuY29sbGVjdGFibGUuXG4iLAogCQkJICAgIG4rbSwgbik7Ci0jZWxzZQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkgICAgImdjOiBkb25lLCAlbGQgdW5yZWFjaGFibGUsICVsZCB1bmNvbGxlY3RhYmxlLlxuIiwKLQkJCSAgICBQeV9TQUZFX0RPV05DQVNUKG4rbSwgUHlfc3NpemVfdCwgbG9uZyksCi0JCQkgICAgUHlfU0FGRV9ET1dOQ0FTVChuLCBQeV9zc2l6ZV90LCBsb25nKSk7Ci0jZW5kaWYKLQkJfQogCX0KIAogCS8qIEFwcGVuZCBpbnN0YW5jZXMgaW4gdGhlIHVuY29sbGVjdGFibGUgc2V0IHRvIGEgUHl0aG9uCkBAIC0xMDUwLDcgKzEwNzAsNyBAQAogc3RhdGljIGludAogcmVmZXJyZXJzdmlzaXQoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QgKm9ianMpCiB7Ci0JaW50IGk7CisJUHlfc3NpemVfdCBpOwogCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKG9ianMpOyBpKyspCiAJCWlmIChQeVR1cGxlX0dFVF9JVEVNKG9ianMsIGkpID09IG9iaikKIAkJCXJldHVybiAxOwpAQCAtMTA4NSw2ICsxMTA1LDggQEAKIHsKIAlpbnQgaTsKIAlQeU9iamVjdCAqcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKKwlpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CisKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspIHsKIAkJaWYgKCEoZ2NfcmVmZXJyZXJzX2ZvcihhcmdzLCBHRU5fSEVBRChpKSwgcmVzdWx0KSkpIHsKIAkJCVB5X0RFQ1JFRihyZXN1bHQpOwpAQCAtMTEwOCw3ICsxMTMwLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19nZXRfcmVmZXJlbnRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaTsKKwlQeV9zc2l6ZV90IGk7CiAJUHlPYmplY3QgKnJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7CiAKIAlpZiAocmVzdWx0ID09IE5VTEwpCkBAIC0xMjg4LDcgKzEzMTAsOCBAQAogX1B5T2JqZWN0X0dDX01hbGxvYyhzaXplX3QgYmFzaWNzaXplKQogewogCVB5T2JqZWN0ICpvcDsKLQlQeUdDX0hlYWQgKmcgPSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5R0NfSGVhZCkgKyBiYXNpY3NpemUpOworCVB5R0NfSGVhZCAqZyA9IChQeUdDX0hlYWQgKilQeU9iamVjdF9NQUxMT0MoCisgICAgICAgICAgICAgICAgc2l6ZW9mKFB5R0NfSGVhZCkgKyBiYXNpY3NpemUpOwogCWlmIChnID09IE5VTEwpCiAJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCWctPmdjLmdjX3JlZnMgPSBHQ19VTlRSQUNLRUQ7CkBAIC0xMzMwLDcgKzEzNTMsNyBAQAogewogCWNvbnN0IHNpemVfdCBiYXNpY3NpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUob3AtPm9iX3R5cGUsIG5pdGVtcyk7CiAJUHlHQ19IZWFkICpnID0gQVNfR0Mob3ApOwotCWcgPSBQeU9iamVjdF9SRUFMTE9DKGcsICBzaXplb2YoUHlHQ19IZWFkKSArIGJhc2ljc2l6ZSk7CisJZyA9IChQeUdDX0hlYWQgKilQeU9iamVjdF9SRUFMTE9DKGcsICBzaXplb2YoUHlHQ19IZWFkKSArIGJhc2ljc2l6ZSk7CiAJaWYgKGcgPT0gTlVMTCkKIAkJcmV0dXJuIChQeVZhck9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7CiAJb3AgPSAoUHlWYXJPYmplY3QgKikgRlJPTV9HQyhnKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2V0cGF0aC5jIGIvTW9kdWxlcy9nZXRwYXRoLmMKaW5kZXggNDcxNmQxNS4uOGViYTczMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRwYXRoLmMKKysrIGIvTW9kdWxlcy9nZXRwYXRoLmMKQEAgLTkxLDYgKzkxLDExIEBACiAgKiBwcm9jZXNzIHRvIGZpbmQgdGhlIGluc3RhbGxlZCBQeXRob24gdHJlZS4KICAqLwogCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKICNpZm5kZWYgVkVSU0lPTgogI2lmIGRlZmluZWQoX19WTVMpCiAjZGVmaW5lIFZFUlNJT04gIjJfMSIKQEAgLTU2Niw3ICs1NzEsNyBAQAogICAgIGJ1ZnN6ICs9IHN0cmxlbihleGVjX3ByZWZpeCkgKyAxOwogCiAgICAgLyogVGhpcyBpcyB0aGUgb25seSBtYWxsb2MgY2FsbCBpbiB0aGlzIGZpbGUgKi8KLSAgICBidWYgPSBQeU1lbV9NYWxsb2MoYnVmc3opOworICAgIGJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKGJ1ZnN6KTsKIAogICAgIGlmIChidWYgPT0gTlVMTCkgewogICAgICAgICAvKiBXZSBjYW4ndCBleGl0LCBzbyBwcmludCBhIHdhcm5pbmcgYW5kIGxpbXAgYWxvbmcgKi8KQEAgLTY4MSwzICs2ODYsOSBAQAogICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOwogICAgIHJldHVybiBwcm9ncGF0aDsKIH0KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dycG1vZHVsZS5jIGIvTW9kdWxlcy9ncnBtb2R1bGUuYwppbmRleCBkZTg0OWM5Li4xMmQzM2RkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2dycG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZ3JwbW9kdWxlLmMKQEAgLTI5LDYgKzI5LDcgQEAKIH07CiAKIAorc3RhdGljIGludCBpbml0aWFsaXplZDsKIHN0YXRpYyBQeVR5cGVPYmplY3QgU3RydWN0R3JwVHlwZTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTE3NCw2ICsxNzUsOCBAQAogICAgIGlmIChtID09IE5VTEwpCiAgICAgICAgIHJldHVybjsKICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLSAgICBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RHcnBUeXBlLCAmc3RydWN0X2dyb3VwX3R5cGVfZGVzYyk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKwkgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0R3JwVHlwZSwgJnN0cnVjdF9ncm91cF90eXBlX2Rlc2MpOwogICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJzdHJ1Y3RfZ3JvdXAiLCAoUHlPYmplY3QgKikgJlN0cnVjdEdycFR5cGUpOworICAgIGluaXRpYWxpemVkID0gMTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCmluZGV4IDQ5ZDI0MWYuLjk0NjE3YTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwpAQCAtMzQwLDcgKzM0MCw3IEBACiB7CiAJdGVlZGF0YW9iamVjdCAqdGRvOwogCi0JdGRvID0gUHlPYmplY3RfTmV3KHRlZWRhdGFvYmplY3QsICZ0ZWVkYXRhb2JqZWN0X3R5cGUpOworCXRkbyA9IFB5T2JqZWN0X0dDX05ldyh0ZWVkYXRhb2JqZWN0LCAmdGVlZGF0YW9iamVjdF90eXBlKTsKIAlpZiAodGRvID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCkBAIC0zNDgsNiArMzQ4LDcgQEAKIAl0ZG8tPm5leHRsaW5rID0gTlVMTDsKIAlQeV9JTkNSRUYoaXQpOwogCXRkby0+aXQgPSBpdDsKKwlQeU9iamVjdF9HQ19UcmFjayh0ZG8pOwogCXJldHVybiAoUHlPYmplY3QgKil0ZG87CiB9CiAKQEAgLTM4MSwxNiArMzgyLDM0IEBACiAJcmV0dXJuIHZhbHVlOwogfQogCitzdGF0aWMgaW50Cit0ZWVkYXRhb2JqZWN0X3RyYXZlcnNlKHRlZWRhdGFvYmplY3QgKnRkbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICogYXJnKQoreworCWludCBpOworCVB5X1ZJU0lUKHRkby0+aXQpOworCWZvciAoaSA9IDA7IGkgPCB0ZG8tPm51bXJlYWQ7IGkrKykKKwkJUHlfVklTSVQodGRvLT52YWx1ZXNbaV0pOworCVB5X1ZJU0lUKHRkby0+bmV4dGxpbmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0ZWVkYXRhb2JqZWN0X2NsZWFyKHRlZWRhdGFvYmplY3QgKnRkbykKK3sKKwlpbnQgaTsKKwlQeV9DTEVBUih0ZG8tPml0KTsKKwlmb3IgKGk9MCA7IGk8dGRvLT5udW1yZWFkIDsgaSsrKQorCQlQeV9DTEVBUih0ZG8tPnZhbHVlc1tpXSk7CisJUHlfQ0xFQVIodGRvLT5uZXh0bGluayk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkCiB0ZWVkYXRhb2JqZWN0X2RlYWxsb2ModGVlZGF0YW9iamVjdCAqdGRvKQogewotCWludCBpOwotCi0JZm9yIChpPTAgOyBpPHRkby0+bnVtcmVhZCA7IGkrKykKLQkJUHlfREVDUkVGKHRkby0+dmFsdWVzW2ldKTsKLQlQeV9YREVDUkVGKHRkby0+aXQpOwotCVB5X1hERUNSRUYodGRvLT5uZXh0bGluayk7Ci0JUHlPYmplY3RfRGVsKHRkbyk7CisJUHlPYmplY3RfR0NfVW5UcmFjayh0ZG8pOworCXRlZWRhdGFvYmplY3RfY2xlYXIodGRvKTsKKwlQeU9iamVjdF9HQ19EZWwodGRvKTsKIH0KIAogUHlEb2NfU1RSVkFSKHRlZWRhdGFvYmplY3RfZG9jLCAiRGF0YSBjb250YWluZXIgY29tbW9uIHRvIG11bHRpcGxlIHRlZSBvYmplY3RzLiIpOwpAQCAtNDE3LDkgKzQzNiwyNiBAQAogCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KIAkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJCS8qIHRwX2ZsYWdzICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLAkvKiB0cF9mbGFncyAqLwogCXRlZWRhdGFvYmplY3RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLworCSh0cmF2ZXJzZXByb2MpdGVlZGF0YW9iamVjdF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KKwkoaW5xdWlyeSl0ZWVkYXRhb2JqZWN0X2NsZWFyLAkJLyogdHBfY2xlYXIgKi8KKwkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKwkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKwkwLAkJCQkJLyogdHBfaXRlciAqLworCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLworCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCisJMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KKwkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCisJMCwJCQkJCS8qIHRwX2Jhc2UgKi8KKwkwLAkJCQkJLyogdHBfZGljdCAqLworCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KKwkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisJMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KKwkwLAkJCQkJLyogdHBfaW5pdCAqLworCTAsCQkJCQkvKiB0cF9hbGxvYyAqLworCTAsCQkJCQkvKiB0cF9uZXcgKi8KKwlQeU9iamVjdF9HQ19EZWwsCQkJLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC00NDMsMTggKzQ3OSwyNiBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGludAordGVlX3RyYXZlcnNlKHRlZW9iamVjdCAqdG8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworCVB5X1ZJU0lUKChQeU9iamVjdCAqKXRvLT5kYXRhb2JqKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIHRlZV9jb3B5KHRlZW9iamVjdCAqdG8pCiB7CiAJdGVlb2JqZWN0ICpuZXd0bzsKIAotCW5ld3RvID0gUHlPYmplY3RfTmV3KHRlZW9iamVjdCwgJnRlZV90eXBlKTsKKwluZXd0byA9IFB5T2JqZWN0X0dDX05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7CiAJaWYgKG5ld3RvID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCVB5X0lOQ1JFRih0by0+ZGF0YW9iaik7CiAJbmV3dG8tPmRhdGFvYmogPSB0by0+ZGF0YW9iajsKIAluZXd0by0+aW5kZXggPSB0by0+aW5kZXg7CiAJbmV3dG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKKwlQeU9iamVjdF9HQ19UcmFjayhuZXd0byk7CiAJcmV0dXJuIChQeU9iamVjdCAqKW5ld3RvOwogfQogCkBAIC00NzQsMTIgKzUxOCwxMyBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0JdG8gPSBQeU9iamVjdF9OZXcodGVlb2JqZWN0LCAmdGVlX3R5cGUpOworCXRvID0gUHlPYmplY3RfR0NfTmV3KHRlZW9iamVjdCwgJnRlZV90eXBlKTsKIAlpZiAodG8gPT0gTlVMTCkgCiAJCWdvdG8gZG9uZTsKIAl0by0+ZGF0YW9iaiA9ICh0ZWVkYXRhb2JqZWN0ICopdGVlZGF0YW9iamVjdF9uZXcoaXQpOwogCXRvLT5pbmRleCA9IDA7CiAJdG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKKwlQeU9iamVjdF9HQ19UcmFjayh0byk7CiBkb25lOgogCVB5X1hERUNSRUYoaXQpOwogCXJldHVybiAoUHlPYmplY3QgKil0bzsKQEAgLTQ5NSwxMyArNTQwLDIxIEBACiAJcmV0dXJuIHRlZV9mcm9taXRlcmFibGUoaXRlcmFibGUpOwogfQogCi1zdGF0aWMgdm9pZAotdGVlX2RlYWxsb2ModGVlb2JqZWN0ICp0bykKK3N0YXRpYyBpbnQKK3RlZV9jbGVhcih0ZWVvYmplY3QgKnRvKQogewogCWlmICh0by0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKIAkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgdG8pOwotCVB5X1hERUNSRUYodG8tPmRhdGFvYmopOwotCVB5T2JqZWN0X0RlbCh0byk7CisJUHlfQ0xFQVIodG8tPmRhdGFvYmopOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordGVlX2RlYWxsb2ModGVlb2JqZWN0ICp0bykKK3sKKwlQeU9iamVjdF9HQ19VblRyYWNrKHRvKTsKKwl0ZWVfY2xlYXIodG8pOworCVB5T2JqZWN0X0dDX0RlbCh0byk7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZWVvYmplY3RfZG9jLApAQCAtNTM0LDEwICs1ODcsMTAgQEAKIAkwLAkJCQkvKiB0cF9nZXRhdHRybyAqLwogCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCiAJMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJLyogdHBfZmxhZ3MgKi8KKwlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCS8qIHRwX2ZsYWdzICovCiAJdGVlb2JqZWN0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCisJKHRyYXZlcnNlcHJvYyl0ZWVfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCisJKGlucXVpcnkpdGVlX2NsZWFyLAkJLyogdHBfY2xlYXIgKi8KIAkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwogCW9mZnNldG9mKHRlZW9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwpAQCAtNTUzLDcgKzYwNiw3IEBACiAJMCwJCQkJLyogdHBfaW5pdCAqLwogCTAsCQkJCS8qIHRwX2FsbG9jICovCiAJdGVlX25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsCQkJLyogdHBfZnJlZSAqLworCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21haW4uYyBiL01vZHVsZXMvbWFpbi5jCmluZGV4IGIzY2UxNmUuLjczMjZhMjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWFpbi5jCisrKyBiL01vZHVsZXMvbWFpbi5jCkBAIC0yOCw2ICsyOCwxMCBAQAogICAgICJUeXBlIFwiaGVscFwiLCBcImNvcHlyaWdodFwiLCBcImNyZWRpdHNcIiBvciBcImxpY2Vuc2VcIiAiIFwKICAgICAiZm9yIG1vcmUgaW5mb3JtYXRpb24uIgogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKIC8qIEZvciBQeV9HZXRBcmdjQXJndigpOyBzZXQgYnkgbWFpbigpICovCiBzdGF0aWMgY2hhciAqKm9yaWdfYXJndjsKIHN0YXRpYyBpbnQgIG9yaWdfYXJnYzsKQEAgLTIwNiw3ICsyMTAsNyBAQAogCQkJLyogLWMgaXMgdGhlIGxhc3Qgb3B0aW9uOyBmb2xsb3dpbmcgYXJndW1lbnRzCiAJCQkgICB0aGF0IGxvb2sgbGlrZSBvcHRpb25zIGFyZSBsZWZ0IGZvciB0aGUKIAkJCSAgIGNvbW1hbmQgdG8gaW50ZXJwcmV0LiAqLwotCQkJY29tbWFuZCA9IG1hbGxvYyhzdHJsZW4oX1B5T1Nfb3B0YXJnKSArIDIpOworCQkJY29tbWFuZCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihfUHlPU19vcHRhcmcpICsgMik7CiAJCQlpZiAoY29tbWFuZCA9PSBOVUxMKQogCQkJCVB5X0ZhdGFsRXJyb3IoCiAJCQkJICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvcHkgLWMgYXJndW1lbnQiKTsKQEAgLTIxOSw3ICsyMjMsNyBAQAogCQkJLyogLW0gaXMgdGhlIGxhc3Qgb3B0aW9uOyBmb2xsb3dpbmcgYXJndW1lbnRzCiAJCQkgICB0aGF0IGxvb2sgbGlrZSBvcHRpb25zIGFyZSBsZWZ0IGZvciB0aGUKIAkJCSAgIG1vZHVsZSB0byBpbnRlcnByZXQuICovCi0JCQltb2R1bGUgPSBtYWxsb2Moc3RybGVuKF9QeU9TX29wdGFyZykgKyAyKTsKKwkJCW1vZHVsZSA9IChjaGFyICopbWFsbG9jKHN0cmxlbihfUHlPU19vcHRhcmcpICsgMik7CiAJCQlpZiAobW9kdWxlID09IE5VTEwpCiAJCQkJUHlfRmF0YWxFcnJvcigKIAkJCQkgICAibm90IGVub3VnaCBtZW1vcnkgdG8gY29weSAtbSBhcmd1bWVudCIpOwpAQCAtNTA5LDMgKzUxMyw4IEBACiAJKmFyZ2MgPSBvcmlnX2FyZ2M7CiAJKmFyZ3YgPSBvcmlnX2FyZ3Y7CiB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvbWQ1LmMgYi9Nb2R1bGVzL21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNWQ5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL21kNS5jCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEwuIFBldGVyIERldXRzY2gKKyAgZ2hvc3RAYWxhZGRpbi5jb20KKworICovCisvKiAkSWQ6IG1kNS5jLHYgMS42IDIwMDIvMDQvMTMgMTk6MjA6MjggbHBkIEV4cCAkICovCisvKgorICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KKworICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQorICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0CisgIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKKyAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCisgIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKKyAgY29weXJpZ2h0ZWQuCisKKyAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5jIGlzIEwuIFBldGVyIERldXRzY2gKKyAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQorICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6CisKKyAgMjAwMi0wNC0xMyBscGQgQ2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsgbm93IGhhbmRsZXMgYnl0ZSBvcmRlcgorCWVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5OyBhZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdHJpbmcuaD4KKwlpbiBsaWJyYXJ5LgorICAyMDAyLTAzLTExIGxwZCBDb3JyZWN0ZWQgYXJndW1lbnQgbGlzdCBmb3IgbWFpbigpLCBhbmQgYWRkZWQgaW50IHJldHVybgorCXR5cGUsIGluIHRlc3QgcHJvZ3JhbSBhbmQgVCB2YWx1ZSBwcm9ncmFtLgorICAyMDAyLTAyLTIxIGxwZCBBZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdGRpby5oPiBpbiB0ZXN0IHByb2dyYW0uCisgIDIwMDAtMDctMDMgbHBkIFBhdGNoZWQgdG8gZWxpbWluYXRlIHdhcm5pbmdzIGFib3V0ICJjb25zdGFudCBpcworCXVuc2lnbmVkIGluIEFOU0kgQywgc2lnbmVkIGluIHRyYWRpdGlvbmFsIjsgbWFkZSB0ZXN0IHByb2dyYW0KKwlzZWxmLWNoZWNraW5nLgorICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KKyAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KS4KKyAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSAibWQ1LmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyN1bmRlZiBCWVRFX09SREVSCS8qIDEgPSBiaWctZW5kaWFuLCAtMSA9IGxpdHRsZS1lbmRpYW4sIDAgPSB1bmtub3duICovCisjaWZkZWYgQVJDSF9JU19CSUdfRU5ESUFOCisjICBkZWZpbmUgQllURV9PUkRFUiAoQVJDSF9JU19CSUdfRU5ESUFOID8gMSA6IC0xKQorI2Vsc2UKKyMgIGRlZmluZSBCWVRFX09SREVSIDAKKyNlbmRpZgorCisjZGVmaW5lIFRfTUFTSyAoKG1kNV93b3JkX3QpfjApCisjZGVmaW5lIFQxIC8qIDB4ZDc2YWE0NzggKi8gKFRfTUFTSyBeIDB4Mjg5NTViODcpCisjZGVmaW5lIFQyIC8qIDB4ZThjN2I3NTYgKi8gKFRfTUFTSyBeIDB4MTczODQ4YTkpCisjZGVmaW5lIFQzICAgIDB4MjQyMDcwZGIKKyNkZWZpbmUgVDQgLyogMHhjMWJkY2VlZSAqLyAoVF9NQVNLIF4gMHgzZTQyMzExMSkKKyNkZWZpbmUgVDUgLyogMHhmNTdjMGZhZiAqLyAoVF9NQVNLIF4gMHgwYTgzZjA1MCkKKyNkZWZpbmUgVDYgICAgMHg0Nzg3YzYyYQorI2RlZmluZSBUNyAvKiAweGE4MzA0NjEzICovIChUX01BU0sgXiAweDU3Y2ZiOWVjKQorI2RlZmluZSBUOCAvKiAweGZkNDY5NTAxICovIChUX01BU0sgXiAweDAyYjk2YWZlKQorI2RlZmluZSBUOSAgICAweDY5ODA5OGQ4CisjZGVmaW5lIFQxMCAvKiAweDhiNDRmN2FmICovIChUX01BU0sgXiAweDc0YmIwODUwKQorI2RlZmluZSBUMTEgLyogMHhmZmZmNWJiMSAqLyAoVF9NQVNLIF4gMHgwMDAwYTQ0ZSkKKyNkZWZpbmUgVDEyIC8qIDB4ODk1Y2Q3YmUgKi8gKFRfTUFTSyBeIDB4NzZhMzI4NDEpCisjZGVmaW5lIFQxMyAgICAweDZiOTAxMTIyCisjZGVmaW5lIFQxNCAvKiAweGZkOTg3MTkzICovIChUX01BU0sgXiAweDAyNjc4ZTZjKQorI2RlZmluZSBUMTUgLyogMHhhNjc5NDM4ZSAqLyAoVF9NQVNLIF4gMHg1OTg2YmM3MSkKKyNkZWZpbmUgVDE2ICAgIDB4NDliNDA4MjEKKyNkZWZpbmUgVDE3IC8qIDB4ZjYxZTI1NjIgKi8gKFRfTUFTSyBeIDB4MDllMWRhOWQpCisjZGVmaW5lIFQxOCAvKiAweGMwNDBiMzQwICovIChUX01BU0sgXiAweDNmYmY0Y2JmKQorI2RlZmluZSBUMTkgICAgMHgyNjVlNWE1MQorI2RlZmluZSBUMjAgLyogMHhlOWI2YzdhYSAqLyAoVF9NQVNLIF4gMHgxNjQ5Mzg1NSkKKyNkZWZpbmUgVDIxIC8qIDB4ZDYyZjEwNWQgKi8gKFRfTUFTSyBeIDB4MjlkMGVmYTIpCisjZGVmaW5lIFQyMiAgICAweDAyNDQxNDUzCisjZGVmaW5lIFQyMyAvKiAweGQ4YTFlNjgxICovIChUX01BU0sgXiAweDI3NWUxOTdlKQorI2RlZmluZSBUMjQgLyogMHhlN2QzZmJjOCAqLyAoVF9NQVNLIF4gMHgxODJjMDQzNykKKyNkZWZpbmUgVDI1ICAgIDB4MjFlMWNkZTYKKyNkZWZpbmUgVDI2IC8qIDB4YzMzNzA3ZDYgKi8gKFRfTUFTSyBeIDB4M2NjOGY4MjkpCisjZGVmaW5lIFQyNyAvKiAweGY0ZDUwZDg3ICovIChUX01BU0sgXiAweDBiMmFmMjc4KQorI2RlZmluZSBUMjggICAgMHg0NTVhMTRlZAorI2RlZmluZSBUMjkgLyogMHhhOWUzZTkwNSAqLyAoVF9NQVNLIF4gMHg1NjFjMTZmYSkKKyNkZWZpbmUgVDMwIC8qIDB4ZmNlZmEzZjggKi8gKFRfTUFTSyBeIDB4MDMxMDVjMDcpCisjZGVmaW5lIFQzMSAgICAweDY3NmYwMmQ5CisjZGVmaW5lIFQzMiAvKiAweDhkMmE0YzhhICovIChUX01BU0sgXiAweDcyZDViMzc1KQorI2RlZmluZSBUMzMgLyogMHhmZmZhMzk0MiAqLyAoVF9NQVNLIF4gMHgwMDA1YzZiZCkKKyNkZWZpbmUgVDM0IC8qIDB4ODc3MWY2ODEgKi8gKFRfTUFTSyBeIDB4Nzg4ZTA5N2UpCisjZGVmaW5lIFQzNSAgICAweDZkOWQ2MTIyCisjZGVmaW5lIFQzNiAvKiAweGZkZTUzODBjICovIChUX01BU0sgXiAweDAyMWFjN2YzKQorI2RlZmluZSBUMzcgLyogMHhhNGJlZWE0NCAqLyAoVF9NQVNLIF4gMHg1YjQxMTViYikKKyNkZWZpbmUgVDM4ICAgIDB4NGJkZWNmYTkKKyNkZWZpbmUgVDM5IC8qIDB4ZjZiYjRiNjAgKi8gKFRfTUFTSyBeIDB4MDk0NGI0OWYpCisjZGVmaW5lIFQ0MCAvKiAweGJlYmZiYzcwICovIChUX01BU0sgXiAweDQxNDA0MzhmKQorI2RlZmluZSBUNDEgICAgMHgyODliN2VjNgorI2RlZmluZSBUNDIgLyogMHhlYWExMjdmYSAqLyAoVF9NQVNLIF4gMHgxNTVlZDgwNSkKKyNkZWZpbmUgVDQzIC8qIDB4ZDRlZjMwODUgKi8gKFRfTUFTSyBeIDB4MmIxMGNmN2EpCisjZGVmaW5lIFQ0NCAgICAweDA0ODgxZDA1CisjZGVmaW5lIFQ0NSAvKiAweGQ5ZDRkMDM5ICovIChUX01BU0sgXiAweDI2MmIyZmM2KQorI2RlZmluZSBUNDYgLyogMHhlNmRiOTllNSAqLyAoVF9NQVNLIF4gMHgxOTI0NjYxYSkKKyNkZWZpbmUgVDQ3ICAgIDB4MWZhMjdjZjgKKyNkZWZpbmUgVDQ4IC8qIDB4YzRhYzU2NjUgKi8gKFRfTUFTSyBeIDB4M2I1M2E5OWEpCisjZGVmaW5lIFQ0OSAvKiAweGY0MjkyMjQ0ICovIChUX01BU0sgXiAweDBiZDZkZGJiKQorI2RlZmluZSBUNTAgICAgMHg0MzJhZmY5NworI2RlZmluZSBUNTEgLyogMHhhYjk0MjNhNyAqLyAoVF9NQVNLIF4gMHg1NDZiZGM1OCkKKyNkZWZpbmUgVDUyIC8qIDB4ZmM5M2EwMzkgKi8gKFRfTUFTSyBeIDB4MDM2YzVmYzYpCisjZGVmaW5lIFQ1MyAgICAweDY1NWI1OWMzCisjZGVmaW5lIFQ1NCAvKiAweDhmMGNjYzkyICovIChUX01BU0sgXiAweDcwZjMzMzZkKQorI2RlZmluZSBUNTUgLyogMHhmZmVmZjQ3ZCAqLyAoVF9NQVNLIF4gMHgwMDEwMGI4MikKKyNkZWZpbmUgVDU2IC8qIDB4ODU4NDVkZDEgKi8gKFRfTUFTSyBeIDB4N2E3YmEyMmUpCisjZGVmaW5lIFQ1NyAgICAweDZmYTg3ZTRmCisjZGVmaW5lIFQ1OCAvKiAweGZlMmNlNmUwICovIChUX01BU0sgXiAweDAxZDMxOTFmKQorI2RlZmluZSBUNTkgLyogMHhhMzAxNDMxNCAqLyAoVF9NQVNLIF4gMHg1Y2ZlYmNlYikKKyNkZWZpbmUgVDYwICAgIDB4NGUwODExYTEKKyNkZWZpbmUgVDYxIC8qIDB4Zjc1MzdlODIgKi8gKFRfTUFTSyBeIDB4MDhhYzgxN2QpCisjZGVmaW5lIFQ2MiAvKiAweGJkM2FmMjM1ICovIChUX01BU0sgXiAweDQyYzUwZGNhKQorI2RlZmluZSBUNjMgICAgMHgyYWQ3ZDJiYgorI2RlZmluZSBUNjQgLyogMHhlYjg2ZDM5MSAqLyAoVF9NQVNLIF4gMHgxNDc5MmM2ZSkKKworCitzdGF0aWMgdm9pZAorbWQ1X3Byb2Nlc3MobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSAvKls2NF0qLykKK3sKKyAgICBtZDVfd29yZF90CisJYSA9IHBtcy0+YWJjZFswXSwgYiA9IHBtcy0+YWJjZFsxXSwKKwljID0gcG1zLT5hYmNkWzJdLCBkID0gcG1zLT5hYmNkWzNdOworICAgIG1kNV93b3JkX3QgdDsKKyNpZiBCWVRFX09SREVSID4gMAorICAgIC8qIERlZmluZSBzdG9yYWdlIG9ubHkgZm9yIGJpZy1lbmRpYW4gQ1BVcy4gKi8KKyAgICBtZDVfd29yZF90IFhbMTZdOworI2Vsc2UKKyAgICAvKiBEZWZpbmUgc3RvcmFnZSBmb3IgbGl0dGxlLWVuZGlhbiBvciBib3RoIHR5cGVzIG9mIENQVXMuICovCisgICAgbWQ1X3dvcmRfdCB4YnVmWzE2XTsKKyAgICBjb25zdCBtZDVfd29yZF90ICpYOworI2VuZGlmCisKKyAgICB7CisjaWYgQllURV9PUkRFUiA9PSAwCisJLyoKKwkgKiBEZXRlcm1pbmUgZHluYW1pY2FsbHkgd2hldGhlciB0aGlzIGlzIGEgYmlnLWVuZGlhbiBvcgorCSAqIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgc2luY2Ugd2UgY2FuIHVzZSBhIG1vcmUgZWZmaWNpZW50CisJICogYWxnb3JpdGhtIG9uIHRoZSBsYXR0ZXIuCisJICovCisJc3RhdGljIGNvbnN0IGludCB3ID0gMTsKKworCWlmICgqKChjb25zdCBtZDVfYnl0ZV90ICopJncpKSAvKiBkeW5hbWljIGxpdHRsZS1lbmRpYW4gKi8KKyNlbmRpZgorI2lmIEJZVEVfT1JERVIgPD0gMAkJLyogbGl0dGxlLWVuZGlhbiAqLworCXsKKwkgICAgLyoKKwkgICAgICogT24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgd2UgY2FuIHByb2Nlc3MgcHJvcGVybHkgYWxpZ25lZAorCSAgICAgKiBkYXRhIHdpdGhvdXQgY29weWluZyBpdC4KKwkgICAgICovCisJICAgIGlmICghKChkYXRhIC0gKGNvbnN0IG1kNV9ieXRlX3QgKikwKSAmIDMpKSB7CisJCS8qIGRhdGEgYXJlIHByb3Blcmx5IGFsaWduZWQgKi8KKwkJWCA9IChjb25zdCBtZDVfd29yZF90ICopZGF0YTsKKwkgICAgfSBlbHNlIHsKKwkJLyogbm90IGFsaWduZWQgKi8KKwkJbWVtY3B5KHhidWYsIGRhdGEsIDY0KTsKKwkJWCA9IHhidWY7CisJICAgIH0KKwl9CisjZW5kaWYKKyNpZiBCWVRFX09SREVSID09IDAKKwllbHNlCQkJLyogZHluYW1pYyBiaWctZW5kaWFuICovCisjZW5kaWYKKyNpZiBCWVRFX09SREVSID49IDAJCS8qIGJpZy1lbmRpYW4gKi8KKwl7CisJICAgIC8qCisJICAgICAqIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHdlIG11c3QgYXJyYW5nZSB0aGUgYnl0ZXMgaW4gdGhlCisJICAgICAqIHJpZ2h0IG9yZGVyLgorCSAgICAgKi8KKwkgICAgY29uc3QgbWQ1X2J5dGVfdCAqeHAgPSBkYXRhOworCSAgICBpbnQgaTsKKworIyAgaWYgQllURV9PUkRFUiA9PSAwCisJICAgIFggPSB4YnVmOwkJLyogKGR5bmFtaWMgb25seSkgKi8KKyMgIGVsc2UKKyMgICAgZGVmaW5lIHhidWYgWAkJLyogKHN0YXRpYyBvbmx5KSAqLworIyAgZW5kaWYKKwkgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2ksIHhwICs9IDQpCisJCXhidWZbaV0gPSB4cFswXSArICh4cFsxXSA8PCA4KSArICh4cFsyXSA8PCAxNikgKyAoeHBbM10gPDwgMjQpOworCX0KKyNlbmRpZgorICAgIH0KKworI2RlZmluZSBST1RBVEVfTEVGVCh4LCBuKSAoKCh4KSA8PCAobikpIHwgKCh4KSA+PiAoMzIgLSAobikpKSkKKworICAgIC8qIFJvdW5kIDEuICovCisgICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorICAgICAgIGEgPSBiICsgKChhICsgRihiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLworI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICh+KHgpICYgKHopKSkKKyNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKKyAgdCA9IGEgKyBGKGIsYyxkKSArIFhba10gKyBUaTtcCisgIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKKyAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCisgICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNywgIFQxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDEsIDEyLCAgVDIpOworICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTcsICBUMyk7CisgICAgU0VUKGIsIGMsIGQsIGEsICAzLCAyMiwgIFQ0KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA3LCAgVDUpOworICAgIFNFVChkLCBhLCBiLCBjLCAgNSwgMTIsICBUNik7CisgICAgU0VUKGMsIGQsIGEsIGIsICA2LCAxNywgIFQ3KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDcsIDIyLCAgVDgpOworICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDcsICBUOSk7CisgICAgU0VUKGQsIGEsIGIsIGMsICA5LCAxMiwgVDEwKTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE3LCBUMTEpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMSwgMjIsIFQxMik7CisgICAgU0VUKGEsIGIsIGMsIGQsIDEyLCAgNywgVDEzKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgMTMsIDEyLCBUMTQpOworICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTcsIFQxNSk7CisgICAgU0VUKGIsIGMsIGQsIGEsIDE1LCAyMiwgVDE2KTsKKyN1bmRlZiBTRVQKKworICAgICAvKiBSb3VuZCAyLiAqLworICAgICAvKiBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCisgICAgICAgICAgYSA9IGIgKyAoKGEgKyBHKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCisjZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmIH4oeikpKQorI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAorICB0ID0gYSArIEcoYixjLGQpICsgWFtrXSArIFRpO1wKKyAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgorICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCisgICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNSwgVDE3KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDYsICA5LCBUMTgpOworICAgIFNFVChjLCBkLCBhLCBiLCAxMSwgMTQsIFQxOSk7CisgICAgU0VUKGIsIGMsIGQsIGEsICAwLCAyMCwgVDIwKTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA1LCBUMjEpOworICAgIFNFVChkLCBhLCBiLCBjLCAxMCwgIDksIFQyMik7CisgICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNCwgVDIzKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDQsIDIwLCBUMjQpOworICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDUsIFQyNSk7CisgICAgU0VUKGQsIGEsIGIsIGMsIDE0LCAgOSwgVDI2KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDMsIDE0LCBUMjcpOworICAgIFNFVChiLCBjLCBkLCBhLCAgOCwgMjAsIFQyOCk7CisgICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNSwgVDI5KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDIsICA5LCBUMzApOworICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTQsIFQzMSk7CisgICAgU0VUKGIsIGMsIGQsIGEsIDEyLCAyMCwgVDMyKTsKKyN1bmRlZiBTRVQKKworICAgICAvKiBSb3VuZCAzLiAqLworICAgICAvKiBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCisgICAgICAgICAgYSA9IGIgKyAoKGEgKyBIKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCisjZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKyNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKKyAgdCA9IGEgKyBIKGIsYyxkKSArIFhba10gKyBUaTtcCisgIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKKyAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLworICAgIFNFVChhLCBiLCBjLCBkLCAgNSwgIDQsIFQzMyk7CisgICAgU0VUKGQsIGEsIGIsIGMsICA4LCAxMSwgVDM0KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE2LCBUMzUpOworICAgIFNFVChiLCBjLCBkLCBhLCAxNCwgMjMsIFQzNik7CisgICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNCwgVDM3KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDQsIDExLCBUMzgpOworICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTYsIFQzOSk7CisgICAgU0VUKGIsIGMsIGQsIGEsIDEwLCAyMywgVDQwKTsKKyAgICBTRVQoYSwgYiwgYywgZCwgMTMsICA0LCBUNDEpOworICAgIFNFVChkLCBhLCBiLCBjLCAgMCwgMTEsIFQ0Mik7CisgICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNiwgVDQzKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDYsIDIzLCBUNDQpOworICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDQsIFQ0NSk7CisgICAgU0VUKGQsIGEsIGIsIGMsIDEyLCAxMSwgVDQ2KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTUsIDE2LCBUNDcpOworICAgIFNFVChiLCBjLCBkLCBhLCAgMiwgMjMsIFQ0OCk7CisjdW5kZWYgU0VUCisKKyAgICAgLyogUm91bmQgNC4gKi8KKyAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgIGEgPSBiICsgKChhICsgSShiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLworI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgfih6KSkpCisjZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCisgIHQgPSBhICsgSShiLGMsZCkgKyBYW2tdICsgVGk7XAorICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCisgICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KKyAgICBTRVQoYSwgYiwgYywgZCwgIDAsICA2LCBUNDkpOworICAgIFNFVChkLCBhLCBiLCBjLCAgNywgMTAsIFQ1MCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDE0LCAxNSwgVDUxKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDUsIDIxLCBUNTIpOworICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDYsIFQ1Myk7CisgICAgU0VUKGQsIGEsIGIsIGMsICAzLCAxMCwgVDU0KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE1LCBUNTUpOworICAgIFNFVChiLCBjLCBkLCBhLCAgMSwgMjEsIFQ1Nik7CisgICAgU0VUKGEsIGIsIGMsIGQsICA4LCAgNiwgVDU3KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgMTUsIDEwLCBUNTgpOworICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTUsIFQ1OSk7CisgICAgU0VUKGIsIGMsIGQsIGEsIDEzLCAyMSwgVDYwKTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA2LCBUNjEpOworICAgIFNFVChkLCBhLCBiLCBjLCAxMSwgMTAsIFQ2Mik7CisgICAgU0VUKGMsIGQsIGEsIGIsICAyLCAxNSwgVDYzKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDksIDIxLCBUNjQpOworI3VuZGVmIFNFVAorCisgICAgIC8qIFRoZW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucy4gKFRoYXQgaXMgaW5jcmVtZW50IGVhY2gKKyAgICAgICAgb2YgdGhlIGZvdXIgcmVnaXN0ZXJzIGJ5IHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHRoaXMgYmxvY2sKKyAgICAgICAgd2FzIHN0YXJ0ZWQuKSAqLworICAgIHBtcy0+YWJjZFswXSArPSBhOworICAgIHBtcy0+YWJjZFsxXSArPSBiOworICAgIHBtcy0+YWJjZFsyXSArPSBjOworICAgIHBtcy0+YWJjZFszXSArPSBkOworfQorCit2b2lkCittZDVfaW5pdChtZDVfc3RhdGVfdCAqcG1zKQoreworICAgIHBtcy0+Y291bnRbMF0gPSBwbXMtPmNvdW50WzFdID0gMDsKKyAgICBwbXMtPmFiY2RbMF0gPSAweDY3NDUyMzAxOworICAgIHBtcy0+YWJjZFsxXSA9IC8qMHhlZmNkYWI4OSovIFRfTUFTSyBeIDB4MTAzMjU0NzY7CisgICAgcG1zLT5hYmNkWzJdID0gLyoweDk4YmFkY2ZlKi8gVF9NQVNLIF4gMHg2NzQ1MjMwMTsKKyAgICBwbXMtPmFiY2RbM10gPSAweDEwMzI1NDc2OworfQorCit2b2lkCittZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpCit7CisgICAgY29uc3QgbWQ1X2J5dGVfdCAqcCA9IGRhdGE7CisgICAgaW50IGxlZnQgPSBuYnl0ZXM7CisgICAgaW50IG9mZnNldCA9IChwbXMtPmNvdW50WzBdID4+IDMpICYgNjM7CisgICAgbWQ1X3dvcmRfdCBuYml0cyA9IChtZDVfd29yZF90KShuYnl0ZXMgPDwgMyk7CisKKyAgICBpZiAobmJ5dGVzIDw9IDApCisJcmV0dXJuOworCisgICAgLyogVXBkYXRlIHRoZSBtZXNzYWdlIGxlbmd0aC4gKi8KKyAgICBwbXMtPmNvdW50WzFdICs9IG5ieXRlcyA+PiAyOTsKKyAgICBwbXMtPmNvdW50WzBdICs9IG5iaXRzOworICAgIGlmIChwbXMtPmNvdW50WzBdIDwgbmJpdHMpCisJcG1zLT5jb3VudFsxXSsrOworCisgICAgLyogUHJvY2VzcyBhbiBpbml0aWFsIHBhcnRpYWwgYmxvY2suICovCisgICAgaWYgKG9mZnNldCkgeworCWludCBjb3B5ID0gKG9mZnNldCArIG5ieXRlcyA+IDY0ID8gNjQgLSBvZmZzZXQgOiBuYnl0ZXMpOworCisJbWVtY3B5KHBtcy0+YnVmICsgb2Zmc2V0LCBwLCBjb3B5KTsKKwlpZiAob2Zmc2V0ICsgY29weSA8IDY0KQorCSAgICByZXR1cm47CisJcCArPSBjb3B5OworCWxlZnQgLT0gY29weTsKKwltZDVfcHJvY2VzcyhwbXMsIHBtcy0+YnVmKTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIGZ1bGwgYmxvY2tzLiAqLworICAgIGZvciAoOyBsZWZ0ID49IDY0OyBwICs9IDY0LCBsZWZ0IC09IDY0KQorCW1kNV9wcm9jZXNzKHBtcywgcCk7CisKKyAgICAvKiBQcm9jZXNzIGEgZmluYWwgcGFydGlhbCBibG9jay4gKi8KKyAgICBpZiAobGVmdCkKKwltZW1jcHkocG1zLT5idWYsIHAsIGxlZnQpOworfQorCit2b2lkCittZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSkKK3sKKyAgICBzdGF0aWMgY29uc3QgbWQ1X2J5dGVfdCBwYWRbNjRdID0geworCTB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICB9OworICAgIG1kNV9ieXRlX3QgZGF0YVs4XTsKKyAgICBpbnQgaTsKKworICAgIC8qIFNhdmUgdGhlIGxlbmd0aCBiZWZvcmUgcGFkZGluZy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCWRhdGFbaV0gPSAobWQ1X2J5dGVfdCkocG1zLT5jb3VudFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKKyAgICAvKiBQYWQgdG8gNTYgYnl0ZXMgbW9kIDY0LiAqLworICAgIG1kNV9hcHBlbmQocG1zLCBwYWQsICgoNTUgLSAocG1zLT5jb3VudFswXSA+PiAzKSkgJiA2MykgKyAxKTsKKyAgICAvKiBBcHBlbmQgdGhlIGxlbmd0aC4gKi8KKyAgICBtZDVfYXBwZW5kKHBtcywgZGF0YSwgOCk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCisJZGlnZXN0W2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+YWJjZFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvbWQ1LmggYi9Nb2R1bGVzL21kNS5oCmluZGV4IDEzNjI4ZGYuLjVlYjZkNmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWQ1LmgKKysrIGIvTW9kdWxlcy9tZDUuaApAQCAtMSw2MiArMSw5MSBAQAotLyogTUQ1LkggLSBoZWFkZXIgZmlsZSBmb3IgTUQ1Qy5DCisvKgorICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEwuIFBldGVyIERldXRzY2gKKyAgZ2hvc3RAYWxhZGRpbi5jb20KKworICovCisvKiAkSWQkICovCisvKgorICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KKworICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQorICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0CisgIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKKyAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCisgIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKKyAgY29weXJpZ2h0ZWQuCisKKyAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5oIGlzIEwuIFBldGVyIERldXRzY2gKKyAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQorICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6CisKKyAgMjAwMi0wNC0xMyBscGQgUmVtb3ZlZCBzdXBwb3J0IGZvciBub24tQU5TSSBjb21waWxlcnM7IHJlbW92ZWQKKwlyZWZlcmVuY2VzIHRvIEdob3N0c2NyaXB0OyBjbGFyaWZpZWQgZGVyaXZhdGlvbiBmcm9tIFJGQyAxMzIxOworCW5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIgZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkuCisgIDE5OTktMTEtMDQgbHBkIEVkaXRlZCBjb21tZW50cyBzbGlnaHRseSBmb3IgYXV0b21hdGljIFRPQyBleHRyYWN0aW9uLgorICAxOTk5LTEwLTE4IGxwZCBGaXhlZCB0eXBvIGluIGhlYWRlciBjb21tZW50IChhbnNpMmtuciByYXRoZXIgdGhhbiBtZDUpOworCWFkZGVkIGNvbmRpdGlvbmFsaXphdGlvbiBmb3IgQysrIGNvbXBpbGF0aW9uIGZyb20gTWFydGluCisJUHVyc2Noa2UgPHB1cnNjaGtlQGJubC5nb3Y+LgorICAxOTk5LTA1LTAzIGxwZCBPcmlnaW5hbCB2ZXJzaW9uLgogICovCiAKLS8qIENvcHlyaWdodCAoQykgMTk5MS0yLCBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBDcmVhdGVkIDE5OTEuIEFsbAotcmlnaHRzIHJlc2VydmVkLgorI2lmbmRlZiBtZDVfSU5DTFVERUQKKyMgIGRlZmluZSBtZDVfSU5DTFVERUQKIAotTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgaXQKLWlzIGlkZW50aWZpZWQgYXMgdGhlICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QKLUFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhpcyBzb2Z0d2FyZQotb3IgdGhpcyBmdW5jdGlvbi4KLQotTGljZW5zZSBpcyBhbHNvIGdyYW50ZWQgdG8gbWFrZSBhbmQgdXNlIGRlcml2YXRpdmUgd29ya3MgcHJvdmlkZWQKLXRoYXQgc3VjaCB3b3JrcyBhcmUgaWRlbnRpZmllZCBhcyAiZGVyaXZlZCBmcm9tIHRoZSBSU0EgRGF0YQotU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsCi1tZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoZSBkZXJpdmVkIHdvcmsuCi0KLVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBjb25jZXJuaW5nIGVpdGhlcgotdGhlIG1lcmNoYW50YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIG9yIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCi1zb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgotd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkgb2YgYW55IGtpbmQuCi0KLVRoZXNlIG5vdGljZXMgbXVzdCBiZSByZXRhaW5lZCBpbiBhbnkgY29waWVzIG9mIGFueSBwYXJ0IG9mIHRoaXMKLWRvY3VtZW50YXRpb24gYW5kL29yIHNvZnR3YXJlLgorLyoKKyAqIFRoaXMgcGFja2FnZSBzdXBwb3J0cyBib3RoIGNvbXBpbGUtdGltZSBhbmQgcnVuLXRpbWUgZGV0ZXJtaW5hdGlvbiBvZiBDUFUKKyAqIGJ5dGUgb3JkZXIuICBJZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgZGVmaW5lZCBhcyAwLCB0aGUgY29kZSB3aWxsIGJlCisgKiBjb21waWxlZCB0byBydW4gb25seSBvbiBsaXR0bGUtZW5kaWFuIENQVXM7IGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcworICogZGVmaW5lZCBhcyBub24temVybywgdGhlIGNvZGUgd2lsbCBiZSBjb21waWxlZCB0byBydW4gb25seSBvbiBiaWctZW5kaWFuCisgKiBDUFVzOyBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgbm90IGRlZmluZWQsIHRoZSBjb2RlIHdpbGwgYmUgY29tcGlsZWQgdG8KKyAqIHJ1biBvbiBlaXRoZXIgYmlnLSBvciBsaXR0bGUtZW5kaWFuIENQVXMsIGJ1dCB3aWxsIHJ1biBzbGlnaHRseSBsZXNzCisgKiBlZmZpY2llbnRseSBvbiBlaXRoZXIgb25lIHRoYW4gaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIGRlZmluZWQuCiAgKi8KIAotLyogPT09PT09PT09PSBpbmNsdWRlIGdsb2JhbC5oID09PT09PT09PT0gKi8KLS8qIEdMT0JBTC5IIC0gUlNBUkVGIHR5cGVzIGFuZCBjb25zdGFudHMKLSAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG1kNV9ieXRlX3Q7IC8qIDgtYml0IGJ5dGUgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IG1kNV93b3JkX3Q7IC8qIDMyLWJpdCB3b3JkICovCiAKLS8qIFBPSU5URVIgZGVmaW5lcyBhIGdlbmVyaWMgcG9pbnRlciB0eXBlICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgKlBPSU5URVI7CisvKiBEZWZpbmUgdGhlIHN0YXRlIG9mIHRoZSBNRDUgQWxnb3JpdGhtLiAqLwordHlwZWRlZiBzdHJ1Y3QgbWQ1X3N0YXRlX3MgeworICAgIG1kNV93b3JkX3QgY291bnRbMl07CS8qIG1lc3NhZ2UgbGVuZ3RoIGluIGJpdHMsIGxzdyBmaXJzdCAqLworICAgIG1kNV93b3JkX3QgYWJjZFs0XTsJCS8qIGRpZ2VzdCBidWZmZXIgKi8KKyAgICBtZDVfYnl0ZV90IGJ1Zls2NF07CQkvKiBhY2N1bXVsYXRlIGJsb2NrICovCit9IG1kNV9zdGF0ZV90OwogCi0vKiBVSU5UNCBkZWZpbmVzIGEgZm91ciBieXRlIHdvcmQgKi8KLSNpZiBTSVpFT0ZfTE9ORyA9PSA0Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IFVJTlQ0OwotI2VsaWYgU0laRU9GX1NIT1JUID09IDQKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IFVJTlQ0OwotI2VsaWYgSU5UX01BWCA9PSAyMTQ3NDgzNjQ3Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UNDsKLSNlbHNlCi0jZXJyb3IgIkNhbid0IGZpbmQgYSA0LWJ5dGUgaW50ZWdyYWwgdHlwZSIKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiAKK3sKICNlbmRpZgogCi0vKiA9PT09PT09PT09IEVuZCBnbG9iYWwuaDsgY29udGludWUgbWQ1LmggPT09PT09PT09PSAqLworLyogSW5pdGlhbGl6ZSB0aGUgYWxnb3JpdGhtLiAqLwordm9pZCBtZDVfaW5pdChtZDVfc3RhdGVfdCAqcG1zKTsKIAotLyogTUQ1IGNvbnRleHQuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUlOVDQgc3RhdGVbNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGF0ZSAoQUJDRCkgKi8KLSAgICBVSU5UNCBjb3VudFsyXTsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzLCBtb2R1bG8gMl42NCAobHNiIGZpcnN0KSAqLwotICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzY0XTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgYnVmZmVyICovCi19IE1ENV9DVFg7CisvKiBBcHBlbmQgYSBzdHJpbmcgdG8gdGhlIG1lc3NhZ2UuICovCit2b2lkIG1kNV9hcHBlbmQobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSwgaW50IG5ieXRlcyk7CiAKLS8qIFJlbmFtZSBhbGwgZXhwb3J0ZWQgc3ltYm9scyB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBzaW1pbGFybHkgbmFtZWQKLSAgIHN5bWJvbHMgaW4gc29tZSBzeXN0ZW1zJyBzdGFuZGFyZCBDIGxpYnJhcmllcy4uLiAqLworLyogRmluaXNoIHRoZSBtZXNzYWdlIGFuZCByZXR1cm4gdGhlIGRpZ2VzdC4gKi8KK3ZvaWQgbWQ1X2ZpbmlzaChtZDVfc3RhdGVfdCAqcG1zLCBtZDVfYnl0ZV90IGRpZ2VzdFsxNl0pOwogCi0jZGVmaW5lIE1ENUluaXQgX1B5X01ENUluaXQKLSNkZWZpbmUgTUQ1VXBkYXRlIF9QeV9NRDVVcGRhdGUKLSNkZWZpbmUgTUQ1RmluYWwgX1B5X01ENUZpbmFsCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKIAotdm9pZCBNRDVJbml0KE1ENV9DVFggKik7Ci12b2lkIE1ENVVwZGF0ZShNRDVfQ1RYICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50KTsKLXZvaWQgTUQ1RmluYWwodW5zaWduZWQgY2hhciBbMTZdLCBNRDVfQ1RYICopOworI2VuZGlmIC8qIG1kNV9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tZDVjLmMgYi9Nb2R1bGVzL21kNWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZGZkYi4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL21kNWMuYworKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKiBNRDVDLkMgLSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiwgTUQ1IG1lc3NhZ2UtZGlnZXN0IGFsZ29yaXRobQotICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk5MS0yLCBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBDcmVhdGVkIDE5OTEuIEFsbAotcmlnaHRzIHJlc2VydmVkLgotCi1MaWNlbnNlIHRvIGNvcHkgYW5kIHVzZSB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhhdCBpdAotaXMgaWRlbnRpZmllZCBhcyB0aGUgIlJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdAotQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwgbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGlzIHNvZnR3YXJlCi1vciB0aGlzIGZ1bmN0aW9uLgotCi1MaWNlbnNlIGlzIGFsc28gZ3JhbnRlZCB0byBtYWtlIGFuZCB1c2UgZGVyaXZhdGl2ZSB3b3JrcyBwcm92aWRlZAotdGhhdCBzdWNoIHdvcmtzIGFyZSBpZGVudGlmaWVkIGFzICJkZXJpdmVkIGZyb20gdGhlIFJTQSBEYXRhCi1TZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwKLW1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhlIGRlcml2ZWQgd29yay4KLQotUlNBIERhdGEgU2VjdXJpdHksIEluYy4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGNvbmNlcm5pbmcgZWl0aGVyCi10aGUgbWVyY2hhbnRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgb3IgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMKLXNvZnR3YXJlIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCi13aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eSBvZiBhbnkga2luZC4KLQotVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHJldGFpbmVkIGluIGFueSBjb3BpZXMgb2YgYW55IHBhcnQgb2YgdGhpcwotZG9jdW1lbnRhdGlvbiBhbmQvb3Igc29mdHdhcmUuCi0gKi8KLQotI2luY2x1ZGUgIlB5dGhvbi5oIgotI2luY2x1ZGUgIm1kNS5oIgotCi0vKiBDb25zdGFudHMgZm9yIE1ENVRyYW5zZm9ybSByb3V0aW5lLiAqLwotCi0jZGVmaW5lIFMxMSA3Ci0jZGVmaW5lIFMxMiAxMgotI2RlZmluZSBTMTMgMTcKLSNkZWZpbmUgUzE0IDIyCi0jZGVmaW5lIFMyMSA1Ci0jZGVmaW5lIFMyMiA5Ci0jZGVmaW5lIFMyMyAxNAotI2RlZmluZSBTMjQgMjAKLSNkZWZpbmUgUzMxIDQKLSNkZWZpbmUgUzMyIDExCi0jZGVmaW5lIFMzMyAxNgotI2RlZmluZSBTMzQgMjMKLSNkZWZpbmUgUzQxIDYKLSNkZWZpbmUgUzQyIDEwCi0jZGVmaW5lIFM0MyAxNQotI2RlZmluZSBTNDQgMjEKLQotc3RhdGljIHZvaWQgTUQ1VHJhbnNmb3JtKFVJTlQ0WzRdLCB1bnNpZ25lZCBjaGFyWzY0XSk7Ci0KLQotLyogRW5jb2RlcyBpbnB1dCAoVUlOVDQpIGludG8gb3V0cHV0ICh1bnNpZ25lZCBjaGFyKS4gQXNzdW1lcyBsZW4gaXMKLSAgIGEgbXVsdGlwbGUgb2YgNC4KLSAqLwotc3RhdGljIHZvaWQKLUVuY29kZSh1bnNpZ25lZCBjaGFyICpvdXRwdXQsIFVJTlQ0ICppbnB1dCwgdW5zaWduZWQgaW50IGxlbikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSwgajsKLQotICAgIGZvciAoaSA9IDAsIGogPSAwOyBqIDwgbGVuOyBpKyssIGogKz0gNCkgewotICAgICAgICBvdXRwdXRbal0gPSAodW5zaWduZWQgY2hhcikoaW5wdXRbaV0gJiAweGZmKTsKLSAgICAgICAgb3V0cHV0W2orMV0gPSAodW5zaWduZWQgY2hhcikoKGlucHV0W2ldID4+IDgpICYgMHhmZik7Ci0gICAgICAgIG91dHB1dFtqKzJdID0gKHVuc2lnbmVkIGNoYXIpKChpbnB1dFtpXSA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgb3V0cHV0W2orM10gPSAodW5zaWduZWQgY2hhcikoKGlucHV0W2ldID4+IDI0KSAmIDB4ZmYpOwotICAgIH0KLX0KLQotCi0vKiBEZWNvZGVzIGlucHV0ICh1bnNpZ25lZCBjaGFyKSBpbnRvIG91dHB1dCAoVUlOVDQpLiBBc3N1bWVzIGxlbiBpcwotICAgYSBtdWx0aXBsZSBvZiA0LgotICovCi1zdGF0aWMgdm9pZAotRGVjb2RlKFVJTlQ0ICpvdXRwdXQsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCB1bnNpZ25lZCBpbnQgbGVuKQotewotICAgIHVuc2lnbmVkIGludCBpLCBqOwotCi0gICAgZm9yIChpID0gMCwgaiA9IDA7IGogPCBsZW47IGkrKywgaiArPSA0KSB7Ci0gICAgICAgIG91dHB1dFtpXSA9ICgoVUlOVDQpaW5wdXRbal0pIHwgKCgoVUlOVDQpaW5wdXRbaisxXSkgPDwgOCkgfAotICAgICAgICAgICAgKCgoVUlOVDQpaW5wdXRbaisyXSkgPDwgMTYpIHwgKCgoVUlOVDQpaW5wdXRbaiszXSkgPDwgMjQpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBQQURESU5HWzY0XSA9IHsKLSAgICAweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotfTsKLQotLyogRiwgRywgSCBhbmQgSSBhcmUgYmFzaWMgTUQ1IGZ1bmN0aW9ucy4gKi8KLSNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAoKH54KSAmICh6KSkpCi0jZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQotI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCi0jZGVmaW5lIEkoeCwgeSwgeikgKCh5KSBeICgoeCkgfCAofnopKSkKLQotLyogUk9UQVRFX0xFRlQgcm90YXRlcyB4IGxlZnQgbiBiaXRzLiAqLwotI2RlZmluZSBST1RBVEVfTEVGVCh4LCBuKSAoKCh4KSA8PCAobikpIHwgKCh4KSA+PiAoMzItKG4pKSkpCi0KLS8qIEZGLCBHRywgSEgsIGFuZCBJSSB0cmFuc2Zvcm1hdGlvbnMgZm9yIHJvdW5kcyAxLCAyLCAzLCBhbmQgNC4KLSAgIFJvdGF0aW9uIGlzIHNlcGFyYXRlIGZyb20gYWRkaXRpb24gdG8gcHJldmVudCByZWNvbXB1dGF0aW9uLgotICovCi0jZGVmaW5lIEZGKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7IFwKLSAgICAgKGEpICs9IEYgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQ0KShhYyk7IFwKLSAgICAgKGEpID0gUk9UQVRFX0xFRlQgKChhKSwgKHMpKTsgXAotICAgICAoYSkgKz0gKGIpOyBcCi0gICAgfQotI2RlZmluZSBHRyhhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyBcCi0gICAgIChhKSArPSBHICgoYiksIChjKSwgKGQpKSArICh4KSArIChVSU5UNCkoYWMpOyBcCi0gICAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKLSAgICAgKGEpICs9IChiKTsgXAotICAgIH0KLSNkZWZpbmUgSEgoYSwgYiwgYywgZCwgeCwgcywgYWMpIHsgXAotICAgICAoYSkgKz0gSCAoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAoVUlOVDQpKGFjKTsgXAotICAgICAoYSkgPSBST1RBVEVfTEVGVCAoKGEpLCAocykpOyBcCi0gICAgIChhKSArPSAoYik7IFwKLSAgICB9Ci0jZGVmaW5lIElJKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7IFwKLSAgICAgKGEpICs9IEkgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQ0KShhYyk7IFwKLSAgICAgKGEpID0gUk9UQVRFX0xFRlQgKChhKSwgKHMpKTsgXAotICAgICAoYSkgKz0gKGIpOyBcCi0gICAgfQotCi0KLS8qIE1ENSBpbml0aWFsaXphdGlvbi4gQmVnaW5zIGFuIE1ENSBvcGVyYXRpb24sIHdyaXRpbmcgYSBuZXcgY29udGV4dC4gKi8KLXZvaWQKLU1ENUluaXQoTUQ1X0NUWCAqY29udGV4dCkKLXsKLSAgICBjb250ZXh0LT5jb3VudFswXSA9IGNvbnRleHQtPmNvdW50WzFdID0gMDsKLSAgICAvKiBMb2FkIG1hZ2ljIGluaXRpYWxpemF0aW9uIGNvbnN0YW50cy4gKi8KLSAgICBjb250ZXh0LT5zdGF0ZVswXSA9IDB4Njc0NTIzMDE7Ci0gICAgY29udGV4dC0+c3RhdGVbMV0gPSAweGVmY2RhYjg5OwotICAgIGNvbnRleHQtPnN0YXRlWzJdID0gMHg5OGJhZGNmZTsKLSAgICBjb250ZXh0LT5zdGF0ZVszXSA9IDB4MTAzMjU0NzY7Ci19Ci0KLQotLyogTUQ1IGJsb2NrIHVwZGF0ZSBvcGVyYXRpb24uIENvbnRpbnVlcyBhbiBNRDUgbWVzc2FnZS1kaWdlc3QKLSAgIG9wZXJhdGlvbiwgcHJvY2Vzc2luZyBhbm90aGVyIG1lc3NhZ2UgYmxvY2ssIGFuZCB1cGRhdGluZyB0aGUKLSAgIGNvbnRleHQuCi0gKi8KLXZvaWQKLU1ENVVwZGF0ZShNRDVfQ1RYICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgdW5zaWduZWQgaW50IGlucHV0TGVuKQotewotICAgIHVuc2lnbmVkIGludCBpLCBpbmRleCwgcGFydExlbjsKLQotICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLwotICAgIGluZGV4ID0gKHVuc2lnbmVkIGludCkoKGNvbnRleHQtPmNvdW50WzBdID4+IDMpICYgMHgzRik7Ci0KLSAgICAvKiBVcGRhdGUgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICBpZiAoKGNvbnRleHQtPmNvdW50WzBdICs9ICgoVUlOVDQpaW5wdXRMZW4gPDwgMykpCi0gICAgICAgIDwgKChVSU5UNClpbnB1dExlbiA8PCAzKSkKLSAgICAgICAgY29udGV4dC0+Y291bnRbMV0rKzsKLSAgICBjb250ZXh0LT5jb3VudFsxXSArPSAoKFVJTlQ0KWlucHV0TGVuID4+IDI5KTsKLQotICAgIHBhcnRMZW4gPSA2NCAtIGluZGV4OwotCi0gICAgLyogVHJhbnNmb3JtIGFzIG1hbnkgdGltZXMgYXMgcG9zc2libGUuICovCi0gICAgaWYgKGlucHV0TGVuID49IHBhcnRMZW4pIHsKLSAgICAgICAgbWVtY3B5KChQT0lOVEVSKSZjb250ZXh0LT5idWZmZXJbaW5kZXhdLCAoUE9JTlRFUilpbnB1dCwgcGFydExlbik7Ci0gICAgICAgIE1ENVRyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgY29udGV4dC0+YnVmZmVyKTsKLQotICAgICAgICBmb3IgKGkgPSBwYXJ0TGVuOyBpICsgNjMgPCBpbnB1dExlbjsgaSArPSA2NCkKLSAgICAgICAgICAgIE1ENVRyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgJmlucHV0W2ldKTsKLQotICAgICAgICBpbmRleCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgaSA9IDA7Ci0KLSAgICAvKiBCdWZmZXIgcmVtYWluaW5nIGlucHV0ICovCi0gICAgbWVtY3B5KChQT0lOVEVSKSZjb250ZXh0LT5idWZmZXJbaW5kZXhdLAotICAgICAgICAgICAgICAgKFBPSU5URVIpJmlucHV0W2ldLCBpbnB1dExlbi1pKTsKLX0KLQotLyogTUQ1IGZpbmFsaXphdGlvbi4gRW5kcyBhbiBNRDUgbWVzc2FnZS1kaWdlc3Qgb3BlcmF0aW9uLCB3cml0aW5nIHRoZQotICBtZXNzYWdlIGRpZ2VzdCBhbmQgemVyb2luZyB0aGUgY29udGV4dC4KLSAqLwotdm9pZAotTUQ1RmluYWwodW5zaWduZWQgY2hhciBkaWdlc3RbMTZdLCBNRDVfQ1RYICpjb250ZXh0KQotewotICAgIHVuc2lnbmVkIGNoYXIgYml0c1s4XTsKLSAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIHBhZExlbjsKLQotICAgIC8qIFNhdmUgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICBFbmNvZGUgKGJpdHMsIGNvbnRleHQtPmNvdW50LCA4KTsKLQotICAgIC8qIFBhZCBvdXQgdG8gNTYgbW9kIDY0LiAqLwotICAgIGluZGV4ID0gKHVuc2lnbmVkIGludCkoKGNvbnRleHQtPmNvdW50WzBdID4+IDMpICYgMHgzZik7Ci0gICAgcGFkTGVuID0gKGluZGV4IDwgNTYpID8gKDU2IC0gaW5kZXgpIDogKDEyMCAtIGluZGV4KTsKLSAgICBNRDVVcGRhdGUoY29udGV4dCwgUEFERElORywgcGFkTGVuKTsKLQotICAgIC8qIEFwcGVuZCBsZW5ndGggKGJlZm9yZSBwYWRkaW5nKSAqLwotICAgIE1ENVVwZGF0ZShjb250ZXh0LCBiaXRzLCA4KTsKLQotICAgIC8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLwotICAgIEVuY29kZShkaWdlc3QsIGNvbnRleHQtPnN0YXRlLCAxNik7Ci0KLSAgICAvKiBaZXJvaXplIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gKi8KLSAgICBtZW1zZXQoKFBPSU5URVIpY29udGV4dCwgMCwgc2l6ZW9mICgqY29udGV4dCkpOwotfQotCi0KLS8qIE1ENSBiYXNpYyB0cmFuc2Zvcm1hdGlvbi4gVHJhbnNmb3JtcyBzdGF0ZSBiYXNlZCBvbiBibG9jay4gKi8KLXN0YXRpYyB2b2lkCi1NRDVUcmFuc2Zvcm0oVUlOVDQgc3RhdGVbNF0sIHVuc2lnbmVkIGNoYXIgYmxvY2tbNjRdKQotewotICAgIFVJTlQ0IGEgPSBzdGF0ZVswXSwgYiA9IHN0YXRlWzFdLCBjID0gc3RhdGVbMl0sIGQgPSBzdGF0ZVszXSwgeFsxNl07Ci0KLSAgICBEZWNvZGUgKHgsIGJsb2NrLCA2NCk7Ci0KLSAgICAvKiBSb3VuZCAxICovCi0gICAgRkYoYSwgYiwgYywgZCwgeFsgMF0sIFMxMSwgMHhkNzZhYTQ3OCk7IC8qIDEgKi8KLSAgICBGRihkLCBhLCBiLCBjLCB4WyAxXSwgUzEyLCAweGU4YzdiNzU2KTsgLyogMiAqLwotICAgIEZGKGMsIGQsIGEsIGIsIHhbIDJdLCBTMTMsIDB4MjQyMDcwZGIpOyAvKiAzICovCi0gICAgRkYoYiwgYywgZCwgYSwgeFsgM10sIFMxNCwgMHhjMWJkY2VlZSk7IC8qIDQgKi8KLSAgICBGRihhLCBiLCBjLCBkLCB4WyA0XSwgUzExLCAweGY1N2MwZmFmKTsgLyogNSAqLwotICAgIEZGKGQsIGEsIGIsIGMsIHhbIDVdLCBTMTIsIDB4NDc4N2M2MmEpOyAvKiA2ICovCi0gICAgRkYoYywgZCwgYSwgYiwgeFsgNl0sIFMxMywgMHhhODMwNDYxMyk7IC8qIDcgKi8KLSAgICBGRihiLCBjLCBkLCBhLCB4WyA3XSwgUzE0LCAweGZkNDY5NTAxKTsgLyogOCAqLwotICAgIEZGKGEsIGIsIGMsIGQsIHhbIDhdLCBTMTEsIDB4Njk4MDk4ZDgpOyAvKiA5ICovCi0gICAgRkYoZCwgYSwgYiwgYywgeFsgOV0sIFMxMiwgMHg4YjQ0ZjdhZik7IC8qIDEwICovCi0gICAgRkYoYywgZCwgYSwgYiwgeFsxMF0sIFMxMywgMHhmZmZmNWJiMSk7IC8qIDExICovCi0gICAgRkYoYiwgYywgZCwgYSwgeFsxMV0sIFMxNCwgMHg4OTVjZDdiZSk7IC8qIDEyICovCi0gICAgRkYoYSwgYiwgYywgZCwgeFsxMl0sIFMxMSwgMHg2YjkwMTEyMik7IC8qIDEzICovCi0gICAgRkYoZCwgYSwgYiwgYywgeFsxM10sIFMxMiwgMHhmZDk4NzE5Myk7IC8qIDE0ICovCi0gICAgRkYoYywgZCwgYSwgYiwgeFsxNF0sIFMxMywgMHhhNjc5NDM4ZSk7IC8qIDE1ICovCi0gICAgRkYoYiwgYywgZCwgYSwgeFsxNV0sIFMxNCwgMHg0OWI0MDgyMSk7IC8qIDE2ICovCi0KLSAgICAvKiBSb3VuZCAyICovCi0gICAgR0coYSwgYiwgYywgZCwgeFsgMV0sIFMyMSwgMHhmNjFlMjU2Mik7IC8qIDE3ICovCi0gICAgR0coZCwgYSwgYiwgYywgeFsgNl0sIFMyMiwgMHhjMDQwYjM0MCk7IC8qIDE4ICovCi0gICAgR0coYywgZCwgYSwgYiwgeFsxMV0sIFMyMywgMHgyNjVlNWE1MSk7IC8qIDE5ICovCi0gICAgR0coYiwgYywgZCwgYSwgeFsgMF0sIFMyNCwgMHhlOWI2YzdhYSk7IC8qIDIwICovCi0gICAgR0coYSwgYiwgYywgZCwgeFsgNV0sIFMyMSwgMHhkNjJmMTA1ZCk7IC8qIDIxICovCi0gICAgR0coZCwgYSwgYiwgYywgeFsxMF0sIFMyMiwgIDB4MjQ0MTQ1Myk7IC8qIDIyICovCi0gICAgR0coYywgZCwgYSwgYiwgeFsxNV0sIFMyMywgMHhkOGExZTY4MSk7IC8qIDIzICovCi0gICAgR0coYiwgYywgZCwgYSwgeFsgNF0sIFMyNCwgMHhlN2QzZmJjOCk7IC8qIDI0ICovCi0gICAgR0coYSwgYiwgYywgZCwgeFsgOV0sIFMyMSwgMHgyMWUxY2RlNik7IC8qIDI1ICovCi0gICAgR0coZCwgYSwgYiwgYywgeFsxNF0sIFMyMiwgMHhjMzM3MDdkNik7IC8qIDI2ICovCi0gICAgR0coYywgZCwgYSwgYiwgeFsgM10sIFMyMywgMHhmNGQ1MGQ4Nyk7IC8qIDI3ICovCi0gICAgR0coYiwgYywgZCwgYSwgeFsgOF0sIFMyNCwgMHg0NTVhMTRlZCk7IC8qIDI4ICovCi0gICAgR0coYSwgYiwgYywgZCwgeFsxM10sIFMyMSwgMHhhOWUzZTkwNSk7IC8qIDI5ICovCi0gICAgR0coZCwgYSwgYiwgYywgeFsgMl0sIFMyMiwgMHhmY2VmYTNmOCk7IC8qIDMwICovCi0gICAgR0coYywgZCwgYSwgYiwgeFsgN10sIFMyMywgMHg2NzZmMDJkOSk7IC8qIDMxICovCi0gICAgR0coYiwgYywgZCwgYSwgeFsxMl0sIFMyNCwgMHg4ZDJhNGM4YSk7IC8qIDMyICovCi0KLSAgICAvKiBSb3VuZCAzICovCi0gICAgSEgoYSwgYiwgYywgZCwgeFsgNV0sIFMzMSwgMHhmZmZhMzk0Mik7IC8qIDMzICovCi0gICAgSEgoZCwgYSwgYiwgYywgeFsgOF0sIFMzMiwgMHg4NzcxZjY4MSk7IC8qIDM0ICovCi0gICAgSEgoYywgZCwgYSwgYiwgeFsxMV0sIFMzMywgMHg2ZDlkNjEyMik7IC8qIDM1ICovCi0gICAgSEgoYiwgYywgZCwgYSwgeFsxNF0sIFMzNCwgMHhmZGU1MzgwYyk7IC8qIDM2ICovCi0gICAgSEgoYSwgYiwgYywgZCwgeFsgMV0sIFMzMSwgMHhhNGJlZWE0NCk7IC8qIDM3ICovCi0gICAgSEgoZCwgYSwgYiwgYywgeFsgNF0sIFMzMiwgMHg0YmRlY2ZhOSk7IC8qIDM4ICovCi0gICAgSEgoYywgZCwgYSwgYiwgeFsgN10sIFMzMywgMHhmNmJiNGI2MCk7IC8qIDM5ICovCi0gICAgSEgoYiwgYywgZCwgYSwgeFsxMF0sIFMzNCwgMHhiZWJmYmM3MCk7IC8qIDQwICovCi0gICAgSEgoYSwgYiwgYywgZCwgeFsxM10sIFMzMSwgMHgyODliN2VjNik7IC8qIDQxICovCi0gICAgSEgoZCwgYSwgYiwgYywgeFsgMF0sIFMzMiwgMHhlYWExMjdmYSk7IC8qIDQyICovCi0gICAgSEgoYywgZCwgYSwgYiwgeFsgM10sIFMzMywgMHhkNGVmMzA4NSk7IC8qIDQzICovCi0gICAgSEgoYiwgYywgZCwgYSwgeFsgNl0sIFMzNCwgIDB4NDg4MWQwNSk7IC8qIDQ0ICovCi0gICAgSEgoYSwgYiwgYywgZCwgeFsgOV0sIFMzMSwgMHhkOWQ0ZDAzOSk7IC8qIDQ1ICovCi0gICAgSEgoZCwgYSwgYiwgYywgeFsxMl0sIFMzMiwgMHhlNmRiOTllNSk7IC8qIDQ2ICovCi0gICAgSEgoYywgZCwgYSwgYiwgeFsxNV0sIFMzMywgMHgxZmEyN2NmOCk7IC8qIDQ3ICovCi0gICAgSEgoYiwgYywgZCwgYSwgeFsgMl0sIFMzNCwgMHhjNGFjNTY2NSk7IC8qIDQ4ICovCi0KLSAgICAvKiBSb3VuZCA0ICovCi0gICAgSUkoYSwgYiwgYywgZCwgeFsgMF0sIFM0MSwgMHhmNDI5MjI0NCk7IC8qIDQ5ICovCi0gICAgSUkoZCwgYSwgYiwgYywgeFsgN10sIFM0MiwgMHg0MzJhZmY5Nyk7IC8qIDUwICovCi0gICAgSUkoYywgZCwgYSwgYiwgeFsxNF0sIFM0MywgMHhhYjk0MjNhNyk7IC8qIDUxICovCi0gICAgSUkoYiwgYywgZCwgYSwgeFsgNV0sIFM0NCwgMHhmYzkzYTAzOSk7IC8qIDUyICovCi0gICAgSUkoYSwgYiwgYywgZCwgeFsxMl0sIFM0MSwgMHg2NTViNTljMyk7IC8qIDUzICovCi0gICAgSUkoZCwgYSwgYiwgYywgeFsgM10sIFM0MiwgMHg4ZjBjY2M5Mik7IC8qIDU0ICovCi0gICAgSUkoYywgZCwgYSwgYiwgeFsxMF0sIFM0MywgMHhmZmVmZjQ3ZCk7IC8qIDU1ICovCi0gICAgSUkoYiwgYywgZCwgYSwgeFsgMV0sIFM0NCwgMHg4NTg0NWRkMSk7IC8qIDU2ICovCi0gICAgSUkoYSwgYiwgYywgZCwgeFsgOF0sIFM0MSwgMHg2ZmE4N2U0Zik7IC8qIDU3ICovCi0gICAgSUkoZCwgYSwgYiwgYywgeFsxNV0sIFM0MiwgMHhmZTJjZTZlMCk7IC8qIDU4ICovCi0gICAgSUkoYywgZCwgYSwgYiwgeFsgNl0sIFM0MywgMHhhMzAxNDMxNCk7IC8qIDU5ICovCi0gICAgSUkoYiwgYywgZCwgYSwgeFsxM10sIFM0NCwgMHg0ZTA4MTFhMSk7IC8qIDYwICovCi0gICAgSUkoYSwgYiwgYywgZCwgeFsgNF0sIFM0MSwgMHhmNzUzN2U4Mik7IC8qIDYxICovCi0gICAgSUkoZCwgYSwgYiwgYywgeFsxMV0sIFM0MiwgMHhiZDNhZjIzNSk7IC8qIDYyICovCi0gICAgSUkoYywgZCwgYSwgYiwgeFsgMl0sIFM0MywgMHgyYWQ3ZDJiYik7IC8qIDYzICovCi0gICAgSUkoYiwgYywgZCwgYSwgeFsgOV0sIFM0NCwgMHhlYjg2ZDM5MSk7IC8qIDY0ICovCi0KLSAgICBzdGF0ZVswXSArPSBhOwotICAgIHN0YXRlWzFdICs9IGI7Ci0gICAgc3RhdGVbMl0gKz0gYzsKLSAgICBzdGF0ZVszXSArPSBkOwotCi0gICAgLyogWmVyb2l6ZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uICovCi0gICAgbWVtc2V0KChQT0lOVEVSKXgsIDAsIHNpemVvZiAoeCkpOwotfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tZDVtb2R1bGUuYyBiL01vZHVsZXMvbWQ1bW9kdWxlLmMKaW5kZXggZTEyYmVmOC4uNWU0ZjExNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tZDVtb2R1bGUuYworKysgYi9Nb2R1bGVzL21kNW1vZHVsZS5jCkBAIC0xNSw3ICsxNSw3IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKIAlQeU9iamVjdF9IRUFECi0gICAgICAgIE1ENV9DVFgJbWQ1OwkJLyogdGhlIGNvbnRleHQgaG9sZGVyICovCisgICAgICAgIG1kNV9zdGF0ZV90CW1kNTsJCS8qIHRoZSBjb250ZXh0IGhvbGRlciAqLwogfSBtZDVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTUQ1dHlwZTsKQEAgLTMxLDcgKzMxLDcgQEAKIAlpZiAobWQ1cCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCU1ENUluaXQoJm1kNXAtPm1kNSk7CS8qIGFjdHVhbCBpbml0aWFsaXNhdGlvbiAqLworCW1kNV9pbml0KCZtZDVwLT5tZDUpOwkvKiBhY3R1YWwgaW5pdGlhbGlzYXRpb24gKi8KIAlyZXR1cm4gbWQ1cDsKIH0KIApAQCAtNTYsNyArNTYsNyBAQAogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6dXBkYXRlIiwgJmNwLCAmbGVuKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlNRDVVcGRhdGUoJnNlbGYtPm1kNSwgY3AsIGxlbik7CisJbWQ1X2FwcGVuZCgmc2VsZi0+bWQ1LCBjcCwgbGVuKTsKIAogCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAlyZXR1cm4gUHlfTm9uZTsKQEAgLTczLDEyICs3MywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1kNV9kaWdlc3QobWQ1b2JqZWN0ICpzZWxmKQogewotIAlNRDVfQ1RYIG1kQ29udGV4dDsKKyAJbWQ1X3N0YXRlX3QgbWRDb250ZXh0OwogCXVuc2lnbmVkIGNoYXIgYURpZ2VzdFsxNl07CiAKIAkvKiBtYWtlIGEgdGVtcG9yYXJ5IGNvcHksIGFuZCBwZXJmb3JtIHRoZSBmaW5hbCAqLwogCW1kQ29udGV4dCA9IHNlbGYtPm1kNTsKLQlNRDVGaW5hbChhRGlnZXN0LCAmbWRDb250ZXh0KTsKKwltZDVfZmluaXNoKCZtZENvbnRleHQsIGFEaWdlc3QpOwogCiAJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopYURpZ2VzdCwgMTYpOwogfQpAQCAtOTQsMTQgKzk0LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWQ1X2hleGRpZ2VzdChtZDVvYmplY3QgKnNlbGYpCiB7Ci0gCU1ENV9DVFggbWRDb250ZXh0OworIAltZDVfc3RhdGVfdCBtZENvbnRleHQ7CiAJdW5zaWduZWQgY2hhciBkaWdlc3RbMTZdOwogCXVuc2lnbmVkIGNoYXIgaGV4ZGlnZXN0WzMyXTsKIAlpbnQgaSwgajsKIAogCS8qIG1ha2UgYSB0ZW1wb3JhcnkgY29weSwgYW5kIHBlcmZvcm0gdGhlIGZpbmFsICovCiAJbWRDb250ZXh0ID0gc2VsZi0+bWQ1OwotCU1ENUZpbmFsKGRpZ2VzdCwgJm1kQ29udGV4dCk7CisJbWQ1X2ZpbmlzaCgmbWRDb250ZXh0LCBkaWdlc3QpOwogCiAJLyogTWFrZSBoZXggdmVyc2lvbiBvZiB0aGUgZGlnZXN0ICovCiAJZm9yKGk9aj0wOyBpPDE2OyBpKyspIHsKQEAgLTI3Miw3ICsyNzIsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChjcCkKLQkJTUQ1VXBkYXRlKCZtZDVwLT5tZDUsIGNwLCBsZW4pOworCQltZDVfYXBwZW5kKCZtZDVwLT5tZDUsIGNwLCBsZW4pOwogCiAJcmV0dXJuIChQeU9iamVjdCAqKW1kNXA7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL29wZXJhdG9yLmMgYi9Nb2R1bGVzL29wZXJhdG9yLmMKaW5kZXggMjRmNGUwYS4uY2JjZTE2ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9vcGVyYXRvci5jCisrKyBiL01vZHVsZXMvb3BlcmF0b3IuYwpAQCAtMzU0LDggKzM1NCw3IEBACiBzdGF0aWMgaW50CiBpdGVtZ2V0dGVyX3RyYXZlcnNlKGl0ZW1nZXR0ZXJvYmplY3QgKmlnLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpZiAoaWctPml0ZW0pCi0JCXJldHVybiB2aXNpdChpZy0+aXRlbSwgYXJnKTsKKwlQeV9WSVNJVChpZy0+aXRlbSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ5Myw4ICs0OTIsNyBAQAogc3RhdGljIGludAogYXR0cmdldHRlcl90cmF2ZXJzZShhdHRyZ2V0dGVyb2JqZWN0ICphZywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKGFnLT5hdHRyKQotCQlyZXR1cm4gdmlzaXQoYWctPmF0dHIsIGFyZyk7CisJUHlfVklTSVQoYWctPmF0dHIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL29zc2F1ZGlvZGV2LmMgYi9Nb2R1bGVzL29zc2F1ZGlvZGV2LmMKaW5kZXggY2U4YTBkMC4uNTYzNjIwYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9vc3NhdWRpb2Rldi5jCisrKyBiL01vZHVsZXMvb3NzYXVkaW9kZXYuYwpAQCAtOTM1LDI0ICs5MzUsMzIgQEAKIAogICAgIGxhYmVscyA9IFB5TGlzdF9OZXcobnVtX2NvbnRyb2xzKTsKICAgICBuYW1lcyA9IFB5TGlzdF9OZXcobnVtX2NvbnRyb2xzKTsKKyAgICBpZiAobGFiZWxzID09IE5VTEwgfHwgbmFtZXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjI7CiAgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb250cm9sczsgaSsrKSB7CiAgICAgICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGNvbnRyb2xfbGFiZWxzW2ldKTsKICAgICAgICAgaWYgKHMgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3IyOwogICAgICAgICBQeUxpc3RfU0VUX0lURU0obGFiZWxzLCBpLCBzKTsKIAogICAgICAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjb250cm9sX25hbWVzW2ldKTsKICAgICAgICAgaWYgKHMgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3IyOwogICAgICAgICBQeUxpc3RfU0VUX0lURU0obmFtZXMsIGksIHMpOwogICAgIH0KIAogICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiY29udHJvbF9sYWJlbHMiLCBsYWJlbHMpID09IC0xKQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGdvdG8gZXJyb3IyOwogICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiY29udHJvbF9uYW1lcyIsIG5hbWVzKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBnb3RvIGVycm9yMTsKIAogICAgIHJldHVybiAwOworCitlcnJvcjI6CisgICAgUHlfWERFQ1JFRihsYWJlbHMpOworZXJyb3IxOgorICAgIFB5X1hERUNSRUYobmFtZXMpOworICAgIHJldHVybiAtMTsKIH0KIAogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jIGIvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYwppbmRleCA4MzE2NWJhLi5jOWVkYWU2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCisrKyBiL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKQEAgLTY1Nyw5ICs2NTcsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIW9rKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRPYmplY3QocGFyc2VyX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIm9zIiwgZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIG5vZGUgY29uc3RydWN0LiIpKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICplcnIgPSBQeV9CdWlsZFZhbHVlKCJvcyIsIGVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBub2RlIGNvbnN0cnVjdC4iKTsKKyAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChwYXJzZXJfZXJyb3IsIGVycik7CisgICAgICAgICAgICBQeV9YREVDUkVGKGVycik7CiAgICAgICAgICAgICBQeV9YREVDUkVGKGVsZW0pOwogICAgICAgICAgICAgcmV0dXJuICgwKTsKICAgICAgICAgfQpAQCAtNzAwLDcgKzcwMSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodGVtcCkgKyAxOwotICAgICAgICAgICAgc3RybiA9IChjaGFyICopUHlNZW1fTUFMTE9DKGxlbik7CisgICAgICAgICAgICBzdHJuID0gKGNoYXIgKilQeU9iamVjdF9NQUxMT0MobGVuKTsKICAgICAgICAgICAgIGlmIChzdHJuICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgKHZvaWQpIG1lbWNweShzdHJuLCBQeVN0cmluZ19BU19TVFJJTkcodGVtcCksIGxlbik7CiAgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CkBAIC03MTAsMTggKzcxMSwxOSBAQAogICAgICAgICAgICAgICogIEl0IGhhcyB0byBiZSBvbmUgb3IgdGhlIG90aGVyOyB0aGlzIGlzIGFuIGVycm9yLgogICAgICAgICAgICAgICogIFRocm93IGFuIGV4Y2VwdGlvbi4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHBhcnNlcl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJvcyIsIGVsZW0sICJ1bmtub3duIG5vZGUgdHlwZS4iKSk7CisgICAgICAgICAgICBQeU9iamVjdCAqZXJyID0gUHlfQnVpbGRWYWx1ZSgib3MiLCBlbGVtLCAidW5rbm93biBub2RlIHR5cGUuIik7CisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QocGFyc2VyX2Vycm9yLCBlcnIpOworICAgICAgICAgICAgUHlfWERFQ1JFRihlcnIpOwogICAgICAgICAgICAgUHlfWERFQ1JFRihlbGVtKTsKICAgICAgICAgICAgIHJldHVybiAoMCk7CiAgICAgICAgIH0KICAgICAgICAgZXJyID0gUHlOb2RlX0FkZENoaWxkKHJvb3QsIHR5cGUsIHN0cm4sICpsaW5lX251bSwgMCk7CiAgICAgICAgIGlmIChlcnIgPT0gRV9OT01FTSkgewotICAgICAgICAgICAgUHlNZW1fREVMKHN0cm4pOworICAgICAgICAgICAgUHlPYmplY3RfRlJFRShzdHJuKTsKICAgICAgICAgICAgIHJldHVybiAobm9kZSAqKSBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChlcnIgPT0gRV9PVkVSRkxPVykgewotICAgICAgICAgICAgUHlNZW1fREVMKHN0cm4pOworICAgICAgICAgICAgUHlPYmplY3RfRlJFRShzdHJuKTsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBudW1iZXIgb2YgY2hpbGQgbm9kZXMiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNzQwLDcgKzc0Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgUHlfWERFQ1JFRihlbGVtKTsKICAgICB9Ci0gICAgcmV0dXJuIChyb290KTsKKyAgICByZXR1cm4gcm9vdDsKIH0KIAogCkBAIC03NjIsNiArNzY0LDcgQEAKICAgICAgICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJvcyIsIHR1cGxlLAogICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBzeW50YXgtdHJlZTsgY2Fubm90IHN0YXJ0IHdpdGggdGVybWluYWwgc3ltYm9sLiIpOwogICAgICAgICBQeUVycl9TZXRPYmplY3QocGFyc2VyX2Vycm9yLCB0dXBsZSk7CisgICAgICAgIFB5X1hERUNSRUYodHVwbGUpOwogICAgIH0KICAgICBlbHNlIGlmIChJU05PTlRFUk1JTkFMKG51bSkpIHsKICAgICAgICAgLyoKQEAgLTc4NCw3ICs3ODcsNyBAQAogICAgICAgICAgICAgaWYgKHJlcyAmJiBlbmNvZGluZykgewogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuOwogICAgICAgICAgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGVuY29kaW5nKSArIDE7Ci0gICAgICAgICAgICAgICAgcmVzLT5uX3N0ciA9IChjaGFyICopUHlNZW1fTUFMTE9DKGxlbik7CisgICAgICAgICAgICAgICAgcmVzLT5uX3N0ciA9IChjaGFyICopUHlPYmplY3RfTUFMTE9DKGxlbik7CiAgICAgICAgICAgICAgICAgaWYgKHJlcy0+bl9zdHIgIT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG1lbWNweShyZXMtPm5fc3RyLCBQeVN0cmluZ19BU19TVFJJTkcoZW5jb2RpbmcpLCBsZW4pOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbmNvZGluZyk7CkBAIC03OTIsMTQgKzc5NSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGVsc2UKKyAgICBlbHNlIHsKICAgICAgICAgLyogIFRoZSB0dXBsZSBpcyBpbGxlZ2FsIC0tIGlmIHRoZSBudW1iZXIgaXMgbmVpdGhlciBURVJNSU5BTCBub3IKICAgICAgICAgICogIE5PTlRFUk1JTkFMLCB3ZSBjYW4ndCB1c2UgaXQuICBOb3Qgc3VyZSB0aGUgaW1wbGVtZW50YXRpb24KICAgICAgICAgICogIGFsbG93cyB0aGlzIGNvbmRpdGlvbiwgYnV0IHRoZSBBUEkgZG9lc24ndCBwcmVjbHVkZSBpdC4KICAgICAgICAgICovCi0gICAgICAgIFB5RXJyX1NldE9iamVjdChwYXJzZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJvcyIsIHR1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBjb21wb25lbnQgdHVwbGUuIikpOworICAgICAgICBQeU9iamVjdCAqZXJyID0gUHlfQnVpbGRWYWx1ZSgib3MiLCB0dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgY29tcG9uZW50IHR1cGxlLiIpOworICAgICAgICBQeUVycl9TZXRPYmplY3QocGFyc2VyX2Vycm9yLCBlcnIpOworICAgICAgICBQeV9YREVDUkVGKGVycik7CisgICAgfQogCiAgICAgcmV0dXJuIChyZXMpOwogfQpAQCAtMTMyMSw3ICsxMzI2LDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi0vKiAgbGlzdF9pZjogICdpZicgdGVzdCBbbGlzdF9pdGVyXQorLyogIGxpc3RfaWY6ICAnaWYnIG9sZF90ZXN0IFtsaXN0X2l0ZXJdCiAgKi8KIHN0YXRpYyBpbnQKIHZhbGlkYXRlX2xpc3RfaWYobm9kZSAqdHJlZSkKQEAgLTEzMzYsMTIgKzEzNDEsMTIgQEAKIAogICAgIGlmIChyZXMpCiAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaWYiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSkpOworICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfb2xkX3Rlc3QoQ0hJTEQodHJlZSwgMSkpKTsKIAogICAgIHJldHVybiByZXM7CiB9CiAKLS8qICBnZW5faWY6ICAnaWYnIHRlc3QgW2dlbl9pdGVyXQorLyogIGdlbl9pZjogICdpZicgb2xkX3Rlc3QgW2dlbl9pdGVyXQogICovCiBzdGF0aWMgaW50CiB2YWxpZGF0ZV9nZW5faWYobm9kZSAqdHJlZSkKQEAgLTEzNTYsNyArMTM2MSw3IEBACiAgICAgCiAgICAgaWYgKHJlcykKICAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJpZiIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKSk7CisgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9vbGRfdGVzdChDSElMRCh0cmVlLCAxKSkpOwogCiAgICAgcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcG9zaXhtb2R1bGUuYyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwppbmRleCAxZmJjMzUzLi5iNTFiYTVkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCkBAIC0yMiw2ICsyMiwxMCBAQAogIyAgICBpbmNsdWRlIDx1bml4aW8uaD4KICNlbmRpZiAvKiBkZWZpbmVkKF9fVk1TKSAqLwogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKIFB5RG9jX1NUUlZBUihwb3NpeF9fZG9jX18sCiAiVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIG9wZXJhdGluZyBzeXN0ZW0gZnVuY3Rpb25hbGl0eSB0aGF0IGlzXG5cCiBzdGFuZGFyZGl6ZWQgYnkgdGhlIEMgU3RhbmRhcmQgYW5kIHRoZSBQT1NJWCBzdGFuZGFyZCAoYSB0aGlubHlcblwKQEAgLTI2NCw2ICsyNjgsMTIgQEAKICNkZWZpbmUgV1RFUk1TSUcodV93YWl0KSAoKHVfd2FpdCkud190ZXJtc2lnKQogI2VuZGlmCiAKKyNkZWZpbmUgV0FJVF9UWVBFIHVuaW9uIHdhaXQKKyNkZWZpbmUgV0FJVF9TVEFUVVNfSU5UKHMpIChzLndfc3RhdHVzKQorCisjZWxzZSAvKiAhVU5JT05fV0FJVCAqLworI2RlZmluZSBXQUlUX1RZUEUgaW50CisjZGVmaW5lIFdBSVRfU1RBVFVTX0lOVChzKSAocykKICNlbmRpZiAvKiBVTklPTl9XQUlUICovCiAKIC8qIERvbid0IHVzZSB0aGUgIl9yIiBmb3JtIGlmIHdlIGRvbid0IG5lZWQgaXQgKGFsc28sIHdvbid0IGhhdmUgYQpAQCAtOTcxLDYgKzk4MSw3IEBACiAJMTAKIH07CiAKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0YXRSZXN1bHRUeXBlOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdGF0VkZTUmVzdWx0VHlwZTsKIHN0YXRpYyBuZXdmdW5jIHN0cnVjdHNlcV9uZXc7CkBAIC0xODM5LDYgKzE4NTAsNyBAQAogCXN0cnVjdCBkaXJlbnQgKmVwOwogCWludCBhcmdfaXNfdW5pY29kZSA9IDE7CiAKKwllcnJubyA9IDA7CiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVOmxpc3RkaXIiLCAmdikpIHsKIAkJYXJnX2lzX3VuaWNvZGUgPSAwOwogCQlQeUVycl9DbGVhcigpOwpAQCAtMTg5NSw2ICsxOTA3LDEyIEBACiAJCX0KIAkJUHlfREVDUkVGKHYpOwogCX0KKwlpZiAoZXJybm8gIT0gMCAmJiBkICE9IE5VTEwpIHsKKwkJLyogcmVhZGRpcigpIHJldHVybmVkIE5VTEwgYW5kIHNldCBlcnJubyAqLworCQljbG9zZWRpcihkaXJwKTsKKwkJUHlfREVDUkVGKGQpOworCQlyZXR1cm4gcG9zaXhfZXJyb3Jfd2l0aF9hbGxvY2F0ZWRfZmlsZW5hbWUobmFtZSk7IAorCX0KIAljbG9zZWRpcihkaXJwKTsKIAlQeU1lbV9GcmVlKG5hbWUpOwogCkBAIC0xOTk1LDEzICsyMDEzLDEzIEBACiB9CiAKIAotI2lmZGVmIEhBVkVfTklDRQotI2lmIGRlZmluZWQoSEFWRV9CUk9LRU5fTklDRSkgJiYgZGVmaW5lZChIQVZFX1NZU19SRVNPVVJDRV9IKQotI2lmIGRlZmluZWQoSEFWRV9HRVRQUklPUklUWSkgJiYgIWRlZmluZWQoUFJJT19QUk9DRVNTKQorLyogc3lzL3Jlc291cmNlLmggaXMgbmVlZGVkIGZvciBhdCBsZWFzdDogd2FpdDMoKSwgd2FpdDQoKSwgYnJva2VuIG5pY2UuICovCisjaWYgZGVmaW5lZChIQVZFX1NZU19SRVNPVVJDRV9IKQogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogI2VuZGlmCi0jZW5kaWYKIAorCisjaWZkZWYgSEFWRV9OSUNFCiBQeURvY19TVFJWQVIocG9zaXhfbmljZV9fZG9jX18sCiAibmljZShpbmMpIC0+IG5ld19wcmlvcml0eVxuXG5cCiBEZWNyZWFzZSB0aGUgcHJpb3JpdHkgb2YgcHJvY2VzcyBieSBpbmMgYW5kIHJldHVybiB0aGUgbmV3IHByaW9yaXR5LiIpOwpAQCAtMzA4OCw3ICszMTA2LDcgQEAKICNpZiBkZWZpbmVkKEhBVkVfREVWX1BUTVgpICYmICFkZWZpbmVkKEhBVkVfT1BFTlBUWSkgJiYgIWRlZmluZWQoSEFWRV9fR0VUUFRZKQogCVB5T1Nfc2lnaGFuZGxlcl90IHNpZ19zYXZlZDsKICNpZmRlZiBzdW4KLQlleHRlcm4gY2hhciAqcHRzbmFtZSgpOworCWV4dGVybiBjaGFyICpwdHNuYW1lKGludCBmaWxkZXMpOwogI2VuZGlmCiAjZW5kaWYKIApAQCAtNTA5MSw2ICs1MTA5LDExNCBAQAogfQogI2VuZGlmIC8qIEhBVkVfU0VUR1JPVVBTICovCiAKKyNpZiBkZWZpbmVkKEhBVkVfV0FJVDMpIHx8IGRlZmluZWQoSEFWRV9XQUlUNCkKK3N0YXRpYyBQeU9iamVjdCAqCit3YWl0X2hlbHBlcihpbnQgcGlkLCBpbnQgc3RhdHVzLCBzdHJ1Y3QgcnVzYWdlICpydSkKK3sKKwlQeU9iamVjdCAqcmVzdWx0OworICAgCXN0YXRpYyBQeU9iamVjdCAqc3RydWN0X3J1c2FnZTsKKworCWlmIChwaWQgPT0gLTEpCisJCXJldHVybiBwb3NpeF9lcnJvcigpOworCisJaWYgKHN0cnVjdF9ydXNhZ2UgPT0gTlVMTCkgeworCQlQeU9iamVjdCAqbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgicmVzb3VyY2UiKTsKKwkJaWYgKG0gPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlzdHJ1Y3RfcnVzYWdlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtLCAic3RydWN0X3J1c2FnZSIpOworCQlQeV9ERUNSRUYobSk7CisJCWlmIChzdHJ1Y3RfcnVzYWdlID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBYWFgobm5vcndpdHopOiBDb3BpZWQgKHcvbW9kcykgZnJvbSByZXNvdXJjZS5jLCB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUuICovCisJcmVzdWx0ID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoKFB5VHlwZU9iamVjdCopIHN0cnVjdF9ydXNhZ2UpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gTlVMTDsKKworI2lmbmRlZiBkb3VibGV0aW1lCisjZGVmaW5lIGRvdWJsZXRpbWUoVFYpICgoZG91YmxlKShUVikudHZfc2VjICsgKFRWKS50dl91c2VjICogMC4wMDAwMDEpCisjZW5kaWYKKworCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAwLAorCQkJUHlGbG9hdF9Gcm9tRG91YmxlKGRvdWJsZXRpbWUocnUtPnJ1X3V0aW1lKSkpOworCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxLAorCQkJUHlGbG9hdF9Gcm9tRG91YmxlKGRvdWJsZXRpbWUocnUtPnJ1X3N0aW1lKSkpOworI2RlZmluZSBTRVRfSU5UKHJlc3VsdCwgaW5kZXgsIHZhbHVlKVwKKwkJUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIGluZGV4LCBQeUludF9Gcm9tTG9uZyh2YWx1ZSkpCisJU0VUX0lOVChyZXN1bHQsIDIsIHJ1LT5ydV9tYXhyc3MpOworCVNFVF9JTlQocmVzdWx0LCAzLCBydS0+cnVfaXhyc3MpOworCVNFVF9JTlQocmVzdWx0LCA0LCBydS0+cnVfaWRyc3MpOworCVNFVF9JTlQocmVzdWx0LCA1LCBydS0+cnVfaXNyc3MpOworCVNFVF9JTlQocmVzdWx0LCA2LCBydS0+cnVfbWluZmx0KTsKKwlTRVRfSU5UKHJlc3VsdCwgNywgcnUtPnJ1X21hamZsdCk7CisJU0VUX0lOVChyZXN1bHQsIDgsIHJ1LT5ydV9uc3dhcCk7CisJU0VUX0lOVChyZXN1bHQsIDksIHJ1LT5ydV9pbmJsb2NrKTsKKwlTRVRfSU5UKHJlc3VsdCwgMTAsIHJ1LT5ydV9vdWJsb2NrKTsKKwlTRVRfSU5UKHJlc3VsdCwgMTEsIHJ1LT5ydV9tc2dzbmQpOworCVNFVF9JTlQocmVzdWx0LCAxMiwgcnUtPnJ1X21zZ3Jjdik7CisJU0VUX0lOVChyZXN1bHQsIDEzLCBydS0+cnVfbnNpZ25hbHMpOworCVNFVF9JTlQocmVzdWx0LCAxNCwgcnUtPnJ1X252Y3N3KTsKKwlTRVRfSU5UKHJlc3VsdCwgMTUsIHJ1LT5ydV9uaXZjc3cpOworI3VuZGVmIFNFVF9JTlQKKworCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisJCVB5X0RFQ1JFRihyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlOIiwgcGlkLCBzdGF0dXMsIHJlc3VsdCk7Cit9CisjZW5kaWYgLyogSEFWRV9XQUlUMyB8fCBIQVZFX1dBSVQ0ICovCisKKyNpZmRlZiBIQVZFX1dBSVQzCitQeURvY19TVFJWQVIocG9zaXhfd2FpdDNfX2RvY19fLAorIndhaXQzKG9wdGlvbnMpIC0+IChwaWQsIHN0YXR1cywgcnVzYWdlKVxuXG5cCitXYWl0IGZvciBjb21wbGV0aW9uIG9mIGEgY2hpbGQgcHJvY2Vzcy4iKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK3Bvc2l4X3dhaXQzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwlpbnQgcGlkLCBvcHRpb25zOworCXN0cnVjdCBydXNhZ2UgcnU7CisJV0FJVF9UWVBFIHN0YXR1czsKKwlXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSA9IDA7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6d2FpdDMiLCAmb3B0aW9ucykpCisJCXJldHVybiBOVUxMOworCisJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCXBpZCA9IHdhaXQzKCZzdGF0dXMsIG9wdGlvbnMsICZydSk7CisJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworCXJldHVybiB3YWl0X2hlbHBlcihwaWQsIFdBSVRfU1RBVFVTX0lOVChzdGF0dXMpLCAmcnUpOworfQorI2VuZGlmIC8qIEhBVkVfV0FJVDMgKi8KKworI2lmZGVmIEhBVkVfV0FJVDQKK1B5RG9jX1NUUlZBUihwb3NpeF93YWl0NF9fZG9jX18sCisid2FpdDQocGlkLCBvcHRpb25zKSAtPiAocGlkLCBzdGF0dXMsIHJ1c2FnZSlcblxuXAorV2FpdCBmb3IgY29tcGxldGlvbiBvZiBhIGdpdmVuIGNoaWxkIHByb2Nlc3MuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitwb3NpeF93YWl0NChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJaW50IHBpZCwgb3B0aW9uczsKKwlzdHJ1Y3QgcnVzYWdlIHJ1OworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTp3YWl0NCIsICZwaWQsICZvcHRpb25zKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlQeV9CRUdJTl9BTExPV19USFJFQURTCisJcGlkID0gd2FpdDQocGlkLCAmc3RhdHVzLCBvcHRpb25zLCAmcnUpOworCVB5X0VORF9BTExPV19USFJFQURTCisKKwlyZXR1cm4gd2FpdF9oZWxwZXIocGlkLCBXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSwgJnJ1KTsKK30KKyNlbmRpZiAvKiBIQVZFX1dBSVQ0ICovCisKICNpZmRlZiBIQVZFX1dBSVRQSUQKIFB5RG9jX1NUUlZBUihwb3NpeF93YWl0cGlkX19kb2NfXywKICJ3YWl0cGlkKHBpZCwgb3B0aW9ucykgLT4gKHBpZCwgc3RhdHVzKVxuXG5cCkBAIC01MTAwLDE0ICs1MjI2LDggQEAKIHBvc2l4X3dhaXRwaWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCWludCBwaWQsIG9wdGlvbnM7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6d2FpdHBpZCIsICZwaWQsICZvcHRpb25zKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC01MTE2LDggKzUyMzYsOCBAQAogCVB5X0VORF9BTExPV19USFJFQURTCiAJaWYgKHBpZCA9PSAtMSkKIAkJcmV0dXJuIHBvc2l4X2Vycm9yKCk7Ci0JZWxzZQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBwaWQsIHN0YXR1c19pKTsKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIHBpZCwgV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpOwogfQogCiAjZWxpZiBkZWZpbmVkKEhBVkVfQ1dBSVQpCkBAIC01MTQwLDEwICs1MjYwLDkgQEAKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCWlmIChwaWQgPT0gLTEpCiAJCXJldHVybiBwb3NpeF9lcnJvcigpOwotCWVsc2UKLQkJLyogc2hpZnQgdGhlIHN0YXR1cyBsZWZ0IGEgYnl0ZSBzbyB0aGlzIGlzIG1vcmUgbGlrZSB0aGUKLQkJICAgUE9TSVggd2FpdHBpZCAqLwotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBwaWQsIHN0YXR1cyA8PCA4KTsKKworCS8qIHNoaWZ0IHRoZSBzdGF0dXMgbGVmdCBhIGJ5dGUgc28gdGhpcyBpcyBtb3JlIGxpa2UgdGhlIFBPU0lYIHdhaXRwaWQgKi8KKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBwaWQsIHN0YXR1cyA8PCA4KTsKIH0KICNlbmRpZiAvKiBIQVZFX1dBSVRQSUQgfHwgSEFWRV9DV0FJVCAqLwogCkBAIC01MTU2LDIzICs1Mjc1LDE2IEBACiBwb3NpeF93YWl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewogCWludCBwaWQ7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgorCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOwogCi0Jc3RhdHVzX2kgPSAwOwogCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAlwaWQgPSB3YWl0KCZzdGF0dXMpOwogCVB5X0VORF9BTExPV19USFJFQURTCiAJaWYgKHBpZCA9PSAtMSkKIAkJcmV0dXJuIHBvc2l4X2Vycm9yKCk7Ci0JZWxzZQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBwaWQsIHN0YXR1c19pKTsKLSN1bmRlZiBzdGF0dXNfaQorCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgcGlkLCBXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSk7CiB9CiAjZW5kaWYKIApAQCAtNTY2OCw5ICs1NzgwLDI0IEBACiAJCQkgICAgICJpbnZhbGlkIGZpbGUgbW9kZSAnJXMnIiwgbW9kZSk7CiAJCXJldHVybiBOVUxMOwogCX0KLQogCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyNpZiAhZGVmaW5lZChNU19XSU5ET1dTKSAmJiBkZWZpbmVkKEhBVkVfRkNOVExfSCkKKwlpZiAobW9kZVswXSA9PSAnYScpIHsKKwkJLyogdHJ5IHRvIG1ha2Ugc3VyZSB0aGUgT19BUFBFTkQgZmxhZyBpcyBzZXQgKi8KKwkJaW50IGZsYWdzOworCQlmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMKTsKKwkJaWYgKGZsYWdzICE9IC0xKQorCQkJZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzIHwgT19BUFBFTkQpOworCQlmcCA9IGZkb3BlbihmZCwgbW9kZSk7CisJCWlmIChmcCA9PSBOVUxMICYmIGZsYWdzICE9IC0xKQorCQkJLyogcmVzdG9yZSBvbGQgbW9kZSBpZiBmZG9wZW4gZmFpbGVkICovCisJCQlmY250bChmZCwgRl9TRVRGTCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCWZwID0gZmRvcGVuKGZkLCBtb2RlKTsKKwl9CisjZWxzZQogCWZwID0gZmRvcGVuKGZkLCBtb2RlKTsKKyNlbmRpZgogCVB5X0VORF9BTExPV19USFJFQURTCiAJaWYgKGZwID09IE5VTEwpCiAJCXJldHVybiBwb3NpeF9lcnJvcigpOwpAQCAtNTg4Nyw3ICs2MDE0LDcgQEAKIHBvc2l4X3B1dGVudihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgICAgIGNoYXIgKnMxLCAqczI7Ci0gICAgICAgIGNoYXIgKm5ldzsKKyAgICAgICAgY2hhciAqbmV3ZW52OwogCVB5T2JqZWN0ICpuZXdzdHI7CiAJc2l6ZV90IGxlbjsKIApAQCAtNTkxOCw5ICs2MDQ1LDkgQEAKIAluZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoaW50KWxlbiAtIDEpOwogCWlmIChuZXdzdHIgPT0gTlVMTCkKIAkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JbmV3ID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld3N0cik7Ci0JUHlPU19zbnByaW50ZihuZXcsIGxlbiwgIiVzPSVzIiwgczEsIHMyKTsKLQlpZiAocHV0ZW52KG5ldykpIHsKKwluZXdlbnYgPSBQeVN0cmluZ19BU19TVFJJTkcobmV3c3RyKTsKKwlQeU9TX3NucHJpbnRmKG5ld2VudiwgbGVuLCAiJXM9JXMiLCBzMSwgczIpOworCWlmIChwdXRlbnYobmV3ZW52KSkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdzdHIpOwogICAgICAgICAgICAgICAgIHBvc2l4X2Vycm9yKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC02MDEwLDIyICs2MTM3LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfV0NPUkVEVU1QKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSNpZmRlZiBVTklPTl9XQUlUCi0JdW5pb24gd2FpdCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIChzdGF0dXMud19zdGF0dXMpCi0jZWxzZQotCWludCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIHN0YXR1cwotI2VuZGlmCi0Jc3RhdHVzX2kgPSAwOworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldDT1JFRFVNUCIsICZzdGF0dXNfaSkpCi0JeworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXQ09SRURVTVAiLCAmV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFdDT1JFRFVNUChzdGF0dXMpKTsKLSN1bmRlZiBzdGF0dXNfaQogfQogI2VuZGlmIC8qIFdDT1JFRFVNUCAqLwogCkBAIC02MDM4LDIyICs2MTU2LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfV0lGQ09OVElOVUVEKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSNpZmRlZiBVTklPTl9XQUlUCi0JdW5pb24gd2FpdCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIChzdGF0dXMud19zdGF0dXMpCi0jZWxzZQotCWludCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIHN0YXR1cwotI2VuZGlmCi0Jc3RhdHVzX2kgPSAwOworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldDT05USU5VRUQiLCAmc3RhdHVzX2kpKQotCXsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V0NPTlRJTlVFRCIsICZXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSkpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoV0lGQ09OVElOVUVEKHN0YXR1cykpOwotI3VuZGVmIHN0YXR1c19pCiB9CiAjZW5kaWYgLyogV0lGQ09OVElOVUVEICovCiAKQEAgLTYwNjUsMjIgKzYxNzQsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9XSUZTVE9QUEVEKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSNpZmRlZiBVTklPTl9XQUlUCi0JdW5pb24gd2FpdCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIChzdGF0dXMud19zdGF0dXMpCi0jZWxzZQotCWludCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIHN0YXR1cwotI2VuZGlmCi0Jc3RhdHVzX2kgPSAwOworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldJRlNUT1BQRUQiLCAmc3RhdHVzX2kpKQotCXsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V0lGU1RPUFBFRCIsICZXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSkpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoV0lGU1RPUFBFRChzdGF0dXMpKTsKLSN1bmRlZiBzdGF0dXNfaQogfQogI2VuZGlmIC8qIFdJRlNUT1BQRUQgKi8KIApAQCAtNjA5MiwyMiArNjE5MiwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X1dJRlNJR05BTEVEKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSNpZmRlZiBVTklPTl9XQUlUCi0JdW5pb24gd2FpdCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIChzdGF0dXMud19zdGF0dXMpCi0jZWxzZQotCWludCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIHN0YXR1cwotI2VuZGlmCi0Jc3RhdHVzX2kgPSAwOworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldJRlNJR05BTEVEIiwgJnN0YXR1c19pKSkKLQl7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldJRlNJR05BTEVEIiwgJldBSVRfU1RBVFVTX0lOVChzdGF0dXMpKSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhXSUZTSUdOQUxFRChzdGF0dXMpKTsKLSN1bmRlZiBzdGF0dXNfaQogfQogI2VuZGlmIC8qIFdJRlNJR05BTEVEICovCiAKQEAgLTYxMjAsMjIgKzYyMTEsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9XSUZFWElURUQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotI2lmZGVmIFVOSU9OX1dBSVQKLQl1bmlvbiB3YWl0IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgKHN0YXR1cy53X3N0YXR1cykKLSNlbHNlCi0JaW50IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgc3RhdHVzCi0jZW5kaWYKLQlzdGF0dXNfaSA9IDA7CisJV0FJVF9UWVBFIHN0YXR1czsKKwlXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V0lGRVhJVEVEIiwgJnN0YXR1c19pKSkKLQl7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldJRkVYSVRFRCIsICZXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSkpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoV0lGRVhJVEVEKHN0YXR1cykpOwotI3VuZGVmIHN0YXR1c19pCiB9CiAjZW5kaWYgLyogV0lGRVhJVEVEICovCiAKQEAgLTYxNDcsMjIgKzYyMjksMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9XRVhJVFNUQVRVUyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXRVhJVFNUQVRVUyIsICZzdGF0dXNfaSkpCi0JeworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXRVhJVFNUQVRVUyIsICZXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSkpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7Ci0jdW5kZWYgc3RhdHVzX2kKIH0KICNlbmRpZiAvKiBXRVhJVFNUQVRVUyAqLwogCkBAIC02MTc1LDIyICs2MjQ4LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfV1RFUk1TSUcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotI2lmZGVmIFVOSU9OX1dBSVQKLQl1bmlvbiB3YWl0IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgKHN0YXR1cy53X3N0YXR1cykKLSNlbHNlCi0JaW50IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgc3RhdHVzCi0jZW5kaWYKLQlzdGF0dXNfaSA9IDA7CisJV0FJVF9UWVBFIHN0YXR1czsKKwlXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V1RFUk1TSUciLCAmc3RhdHVzX2kpKQotCXsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V1RFUk1TSUciLCAmV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIFdURVJNU0lHKHN0YXR1cykpOwotI3VuZGVmIHN0YXR1c19pCiB9CiAjZW5kaWYgLyogV1RFUk1TSUcgKi8KIApAQCAtNjIwMywyMiArNjI2NywxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X1dTVE9QU0lHKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSNpZmRlZiBVTklPTl9XQUlUCi0JdW5pb24gd2FpdCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIChzdGF0dXMud19zdGF0dXMpCi0jZWxzZQotCWludCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIHN0YXR1cwotI2VuZGlmCi0Jc3RhdHVzX2kgPSAwOworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldTVE9QU0lHIiwgJnN0YXR1c19pKSkKLQl7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldTVE9QU0lHIiwgJldBSVRfU1RBVFVTX0lOVChzdGF0dXMpKSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBXU1RPUFNJRyhzdGF0dXMpKTsKLSN1bmRlZiBzdGF0dXNfaQogfQogI2VuZGlmIC8qIFdTVE9QU0lHICovCiAKQEAgLTYzOTYsMTUgKzY0NTEsMTYgQEAKICAgICBuYW1lID0gdG1wbmFtKGJ1ZmZlcik7CiAjZW5kaWYKICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19PU0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgiaXMiLCAwLAorCVB5T2JqZWN0ICplcnIgPSBQeV9CdWlsZFZhbHVlKCJpcyIsIDAsCiAjaWZkZWYgVVNFX1RNUE5BTV9SCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgZnJvbSB0bXBuYW1fciIKICNlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgZnJvbSB0bXBuYW0iCiAjZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCVB5RXJyX1NldE9iamVjdChQeUV4Y19PU0Vycm9yLCBlcnIpOworCVB5X1hERUNSRUYoZXJyKTsKKwlyZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKIH0KQEAgLTY3NTMsMjYgKzY4MDksMzAgQEAKIHsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKICAgICBpbnQgbmFtZTsKLSAgICBjaGFyIGJ1ZmZlcls2NF07CisgICAgY2hhciBidWZmZXJbMjU2XTsKIAogICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpjb25mc3RyIiwgY29udl9jb25mc3RyX2NvbmZuYW1lLCAmbmFtZSkpIHsKLSAgICAgICAgaW50IGxlbiA9IGNvbmZzdHIobmFtZSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisJaW50IGxlbjsKIAogICAgICAgICBlcnJubyA9IDA7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgaWYgKGVycm5vICE9IDApCi0gICAgICAgICAgICAgICAgcG9zaXhfZXJyb3IoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKwlsZW4gPSBjb25mc3RyKG5hbWUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCWlmIChsZW4gPT0gMCkgeworCSAgICBpZiAoZXJybm8pIHsKKwkJcG9zaXhfZXJyb3IoKTsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJcmVzdWx0ID0gUHlfTm9uZTsKKwkJUHlfSU5DUkVGKFB5X05vbmUpOworCSAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAobGVuID49IHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKKwkgICAgaWYgKCh1bnNpZ25lZCBpbnQpbGVuID49IHNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLTEpOwogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgY29uZnN0cihuYW1lLCBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwgbGVuKzEpOworICAgICAgICAgICAgICAgICAgICBjb25mc3RyKG5hbWUsIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpLCBsZW4pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIGxlbi0xKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNzQyMyw2ICs3NDgzLDQ0IEBACiAJY2hhciAqZmlsZXBhdGg7CiAJY2hhciAqb3BlcmF0aW9uID0gTlVMTDsKIAlISU5TVEFOQ0UgcmM7CisjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCisJaWYgKHVuaWNvZGVfZmlsZV9uYW1lcygpKSB7CisJCVB5T2JqZWN0ICp1bmlwYXRoLCAqd29wZXJhdGlvbiA9IE5VTEw7CisJCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXxzOnN0YXJ0ZmlsZSIsCisJCQkJICAgICAgJnVuaXBhdGgsICZvcGVyYXRpb24pKSB7CisJCQlQeUVycl9DbGVhcigpOworCQkJZ290byBub3JtYWw7CisJCX0KKwkJCisKKwkJaWYgKG9wZXJhdGlvbikgeworCQkgICAgd29wZXJhdGlvbiA9IFB5VW5pY29kZV9EZWNvZGVBU0NJSShvcGVyYXRpb24sIAorCQkJCQkJICAgICAgIHN0cmxlbihvcGVyYXRpb24pLCBOVUxMKTsKKwkJICAgIGlmICghd29wZXJhdGlvbikgeworCQkJICAgIFB5RXJyX0NsZWFyKCk7CisJCQkgICAgb3BlcmF0aW9uID0gTlVMTDsKKwkJCSAgICBnb3RvIG5vcm1hbDsKKwkJICAgIH0KKwkJfQorCQkJCisJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwkJcmMgPSBTaGVsbEV4ZWN1dGVXKChIV05EKTAsIHdvcGVyYXRpb24gPyBQeVVuaWNvZGVfQVNfVU5JQ09ERSh3b3BlcmF0aW9uKSA6IDAsCisJCQlQeVVuaWNvZGVfQVNfVU5JQ09ERSh1bmlwYXRoKSwKKwkJCU5VTEwsIE5VTEwsIFNXX1NIT1dOT1JNQUwpOworCQlQeV9FTkRfQUxMT1dfVEhSRUFEUworCisJCVB5X1hERUNSRUYod29wZXJhdGlvbik7CisJCWlmIChyYyA8PSAoSElOU1RBTkNFKTMyKSB7CisJCQlQeU9iamVjdCAqZXJydmFsID0gd2luMzJfZXJyb3JfdW5pY29kZSgic3RhcnRmaWxlIiwKKwkJCQkJCVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXBhdGgpKTsKKwkJCXJldHVybiBlcnJ2YWw7CisJCX0KKwkJUHlfSU5DUkVGKFB5X05vbmUpOworCQlyZXR1cm4gUHlfTm9uZTsKKwl9CisjZW5kaWYKKworbm9ybWFsOgogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXR8czpzdGFydGZpbGUiLCAKIAkJCSAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZmaWxlcGF0aCwgCiAJCQkgICAgICAmb3BlcmF0aW9uKSkKQEAgLTc2OTUsNiArNzc5MywxMiBAQAogI2lmZGVmIEhBVkVfV0FJVAogCXsid2FpdCIsCXBvc2l4X3dhaXQsIE1FVEhfTk9BUkdTLCBwb3NpeF93YWl0X19kb2NfX30sCiAjZW5kaWYgLyogSEFWRV9XQUlUICovCisjaWZkZWYgSEFWRV9XQUlUMworICAgICAgICB7IndhaXQzIiwJcG9zaXhfd2FpdDMsIE1FVEhfVkFSQVJHUywgcG9zaXhfd2FpdDNfX2RvY19ffSwKKyNlbmRpZiAvKiBIQVZFX1dBSVQzICovCisjaWZkZWYgSEFWRV9XQUlUNAorICAgICAgICB7IndhaXQ0IiwJcG9zaXhfd2FpdDQsIE1FVEhfVkFSQVJHUywgcG9zaXhfd2FpdDRfX2RvY19ffSwKKyNlbmRpZiAvKiBIQVZFX1dBSVQ0ICovCiAjaWYgZGVmaW5lZChIQVZFX1dBSVRQSUQpIHx8IGRlZmluZWQoSEFWRV9DV0FJVCkKIAl7IndhaXRwaWQiLAlwb3NpeF93YWl0cGlkLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X3dhaXRwaWRfX2RvY19ffSwKICNlbmRpZiAvKiBIQVZFX1dBSVRQSUQgKi8KQEAgLTgxNDIsMTkgKzgyNDYsMjcgQEAKIAkJcG9zaXhfcHV0ZW52X2dhcmJhZ2UgPSBQeURpY3RfTmV3KCk7CiAjZW5kaWYKIAotCXN0YXRfcmVzdWx0X2Rlc2MubmFtZSA9IE1PRE5BTUUgIi5zdGF0X3Jlc3VsdCI7Ci0Jc3RhdF9yZXN1bHRfZGVzYy5maWVsZHNbN10ubmFtZSA9IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkOwotCXN0YXRfcmVzdWx0X2Rlc2MuZmllbGRzWzhdLm5hbWUgPSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZDsKLQlzdGF0X3Jlc3VsdF9kZXNjLmZpZWxkc1s5XS5uYW1lID0gUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQ7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RhdFJlc3VsdFR5cGUsICZzdGF0X3Jlc3VsdF9kZXNjKTsKLQlzdHJ1Y3RzZXFfbmV3ID0gU3RhdFJlc3VsdFR5cGUudHBfbmV3OwotCVN0YXRSZXN1bHRUeXBlLnRwX25ldyA9IHN0YXRyZXN1bHRfbmV3OworCWlmICghaW5pdGlhbGl6ZWQpIHsKKwkJc3RhdF9yZXN1bHRfZGVzYy5uYW1lID0gTU9ETkFNRSAiLnN0YXRfcmVzdWx0IjsKKwkJc3RhdF9yZXN1bHRfZGVzYy5maWVsZHNbN10ubmFtZSA9IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkOworCQlzdGF0X3Jlc3VsdF9kZXNjLmZpZWxkc1s4XS5uYW1lID0gUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQ7CisJCXN0YXRfcmVzdWx0X2Rlc2MuZmllbGRzWzldLm5hbWUgPSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZDsKKwkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RhdFJlc3VsdFR5cGUsICZzdGF0X3Jlc3VsdF9kZXNjKTsKKwkJc3RydWN0c2VxX25ldyA9IFN0YXRSZXN1bHRUeXBlLnRwX25ldzsKKwkJU3RhdFJlc3VsdFR5cGUudHBfbmV3ID0gc3RhdHJlc3VsdF9uZXc7CisKKwkJc3RhdHZmc19yZXN1bHRfZGVzYy5uYW1lID0gTU9ETkFNRSAiLnN0YXR2ZnNfcmVzdWx0IjsKKwkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RhdFZGU1Jlc3VsdFR5cGUsICZzdGF0dmZzX3Jlc3VsdF9kZXNjKTsKKwl9CiAJUHlfSU5DUkVGKChQeU9iamVjdCopICZTdGF0UmVzdWx0VHlwZSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdGF0X3Jlc3VsdCIsIChQeU9iamVjdCopICZTdGF0UmVzdWx0VHlwZSk7Ci0KLQlzdGF0dmZzX3Jlc3VsdF9kZXNjLm5hbWUgPSBNT0ROQU1FICIuc3RhdHZmc19yZXN1bHQiOwotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRWRlNSZXN1bHRUeXBlLCAmc3RhdHZmc19yZXN1bHRfZGVzYyk7CiAJUHlfSU5DUkVGKChQeU9iamVjdCopICZTdGF0VkZTUmVzdWx0VHlwZSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdGF0dmZzX3Jlc3VsdCIsCiAJCQkgICAoUHlPYmplY3QqKSAmU3RhdFZGU1Jlc3VsdFR5cGUpOworCWluaXRpYWxpemVkID0gMTsKIH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wd2Rtb2R1bGUuYyBiL01vZHVsZXMvcHdkbW9kdWxlLmMKaW5kZXggOWU3Yjg2NC4uOWUwMWY0OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wd2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3B3ZG1vZHVsZS5jCkBAIC00Miw2ICs0Miw3IEBACiBleGNlcHRpb24gaXMgcmFpc2VkIGlmIHRoZSBlbnRyeSBhc2tlZCBmb3IgY2Fubm90IGJlIGZvdW5kLiIpOwogCiAgICAgICAKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0cnVjdFB3ZFR5cGU7CiAKIHN0YXRpYyB2b2lkCkBAIC0xODYsOSArMTg3LDEyIEBACiAJaWYgKG0gPT0gTlVMTCkKICAgICAJCXJldHVybjsKIAotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFB3ZFR5cGUsICZzdHJ1Y3RfcHdkX3R5cGVfZGVzYyk7CisJaWYgKCFpbml0aWFsaXplZCkKKwkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0UHdkVHlwZSwgCisJCQkJCSAgJnN0cnVjdF9wd2RfdHlwZV9kZXNjKTsKIAlQeV9JTkNSRUYoKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgInN0cnVjdF9wYXNzd2QiLCAoUHlPYmplY3QgKikgJlN0cnVjdFB3ZFR5cGUpOwogCS8qIEFuZCBmb3IgYi93IGNvbXBhdGliaWxpdHkgKHRoaXMgd2FzIGRlZmluZWQgYnkgbWlzdGFrZSk6ICovCiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcHdlbnQiLCAoUHlPYmplY3QgKikgJlN0cnVjdFB3ZFR5cGUpOworCWluaXRpYWxpemVkID0gMTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcHlleHBhdC5jIGIvTW9kdWxlcy9weWV4cGF0LmMKaW5kZXggZTRiZjE4MC4uZmU1MGUzNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9weWV4cGF0LmMKKysrIGIvTW9kdWxlcy9weWV4cGF0LmMKQEAgLTE1MTksNiArMTUxOSw4IEBACiAgICAgaWYgKHN0cmNtcChuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwKSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBQeU9iamVjdCAqcmMgPSBQeUxpc3RfTmV3KDApOworCWlmICghcmMpCisJCXJldHVybiBOVUxMOwogICAgICAgICBmb3IgKGkgPSAwOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gZ2V0X2hhbmRsZXJfbmFtZSgmaGFuZGxlcl9pbmZvW2ldKTsKICAgICAgICAgICAgIGlmIChvICE9IE5VTEwpCkBAIC0xNjUyLDE0ICsxNjU0LDkgQEAKIHN0YXRpYyBpbnQKIHhtbHBhcnNlX3RyYXZlcnNlKHhtbHBhcnNlb2JqZWN0ICpvcCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0gICAgaW50IGksIGVycjsKLSAgICBmb3IgKGkgPSAwOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKLSAgICAgICAgaWYgKCFvcC0+aGFuZGxlcnNbaV0pCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZXJyID0gdmlzaXQob3AtPmhhbmRsZXJzW2ldLCBhcmcpOwotICAgICAgICBpZiAoZXJyKQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICBQeV9WSVNJVChvcC0+aGFuZGxlcnNbaV0pOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xNjY3LDggKzE2NjQsNyBAQAogeG1scGFyc2VfY2xlYXIoeG1scGFyc2VvYmplY3QgKm9wKQogewogICAgIGNsZWFyX2hhbmRsZXJzKG9wLCAwKTsKLSAgICBQeV9YREVDUkVGKG9wLT5pbnRlcm4pOwotICAgIG9wLT5pbnRlcm4gPSAwOworICAgIFB5X0NMRUFSKG9wLT5pbnRlcm4pOwogICAgIHJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3JlZ2V4bW9kdWxlLmMgYi9Nb2R1bGVzL3JlZ2V4bW9kdWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjQxOTguLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9yZWdleG1vZHVsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkwICswLDAgQEAKLS8qCi1YWFggc3VwcG9ydCByYW5nZSBwYXJhbWV0ZXIgb24gc2VhcmNoCi1YWFggc3VwcG9ydCBtc3RvcCBwYXJhbWV0ZXIgb24gc2VhcmNoCi0qLwotCi0KLS8qIFJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzICovCi0vKiBUaGlzIHVzZXMgVGF0dSBZbG9uZW4ncyBjb3B5bGVmdC1mcmVlIHJlaW1wbGVtZW50YXRpb24gb2YKLSAgIEdOVSByZWd1bGFyIGV4cHJlc3Npb25zICovCi0KLSNpbmNsdWRlICJQeXRob24uaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJyZWdleHByLmgiCi0KLXN0YXRpYyBQeU9iamVjdCAqUmVnZXhFcnJvcjsJLyogRXhjZXB0aW9uICovCQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCXN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciByZV9wYXRidWY7IC8qIFRoZSBjb21waWxlZCBleHByZXNzaW9uICovCi0Jc3RydWN0IHJlX3JlZ2lzdGVycyByZV9yZWdzOyAvKiBUaGUgcmVnaXN0ZXJzIGZyb20gdGhlIGxhc3QgbWF0Y2ggKi8KLQljaGFyIHJlX2Zhc3RtYXBbMjU2XTsJLyogU3RvcmFnZSBmb3IgZmFzdG1hcCAqLwotCVB5T2JqZWN0ICpyZV90cmFuc2xhdGU7CS8qIFN0cmluZyBvYmplY3QgZm9yIHRyYW5zbGF0ZSB0YWJsZSAqLwotCVB5T2JqZWN0ICpyZV9sYXN0b2s7CS8qIFN0cmluZyBvYmplY3QgbGFzdCBtYXRjaGVkL3NlYXJjaGVkICovCi0JUHlPYmplY3QgKnJlX2dyb3VwaW5kZXg7CS8qIEdyb3VwIG5hbWUgdG8gaW5kZXggZGljdGlvbmFyeSAqLwotCVB5T2JqZWN0ICpyZV9naXZlbnBhdDsJLyogUGF0dGVybiB3aXRoIHN5bWJvbGljIGdyb3VwcyAqLwotCVB5T2JqZWN0ICpyZV9yZWFscGF0OwkvKiBQYXR0ZXJuIHdpdGhvdXQgc3ltYm9saWMgZ3JvdXBzICovCi19IHJlZ2V4b2JqZWN0OwotCi0vKiBSZWdleCBvYmplY3QgbWV0aG9kcyAqLwotCi1zdGF0aWMgdm9pZAotcmVnX2RlYWxsb2MocmVnZXhvYmplY3QgKnJlKQotewotCWlmIChyZS0+cmVfcGF0YnVmLmJ1ZmZlcikKLQkJZnJlZShyZS0+cmVfcGF0YnVmLmJ1ZmZlcik7Ci0JUHlfWERFQ1JFRihyZS0+cmVfdHJhbnNsYXRlKTsKLQlQeV9YREVDUkVGKHJlLT5yZV9sYXN0b2spOwotCVB5X1hERUNSRUYocmUtPnJlX2dyb3VwaW5kZXgpOwotCVB5X1hERUNSRUYocmUtPnJlX2dpdmVucGF0KTsKLQlQeV9YREVDUkVGKHJlLT5yZV9yZWFscGF0KTsKLQlQeU9iamVjdF9EZWwocmUpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbWFrZXJlc3VsdChzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpyZWdzKQotewotCVB5T2JqZWN0ICp2OwotCWludCBpOwotCXN0YXRpYyBQeU9iamVjdCAqZmlsbGVyID0gTlVMTDsKLQotCWlmIChmaWxsZXIgPT0gTlVMTCkgewotCQlmaWxsZXIgPSBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgLTEsIC0xKTsKLQkJaWYgKGZpbGxlciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXYgPSBQeVR1cGxlX05ldyhSRV9OUkVHUyk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUkVfTlJFR1M7IGkrKykgewotCQlpbnQgbG8gPSByZWdzLT5zdGFydFtpXTsKLQkJaW50IGhpID0gcmVncy0+ZW5kW2ldOwotCQlQeU9iamVjdCAqdzsKLQkJaWYgKGxvID09IC0xICYmIGhpID09IC0xKSB7Ci0JCQl3ID0gZmlsbGVyOwotCQkJUHlfSU5DUkVGKHcpOwotCQl9Ci0JCWVsc2UKLQkJCXcgPSBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgbG8sIGhpKTsKLQkJaWYgKHcgPT0gTlVMTCB8fCBQeVR1cGxlX1NldEl0ZW0odiwgaSwgdykgPCAwKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gdjsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ29ial9tYXRjaChyZWdleG9iamVjdCAqcmUsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICphcmdzdHJpbmc7Ci0JY2hhciAqYnVmZmVyOwotCWludCBzaXplOwotCWludCBvZmZzZXQgPSAwOwotCWludCByZXN1bHQ7Ci0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTptYXRjaCIsICZhcmdzdHJpbmcsICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3N0cmluZywgInQjIiwgJmJ1ZmZlciwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IHNpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFJlZ2V4RXJyb3IsICJtYXRjaCBvZmZzZXQgb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9YREVDUkVGKHJlLT5yZV9sYXN0b2spOwotCXJlLT5yZV9sYXN0b2sgPSBOVUxMOwotCXJlc3VsdCA9IF9QeV9yZV9tYXRjaCgmcmUtPnJlX3BhdGJ1ZiwgKHVuc2lnbmVkIGNoYXIgKilidWZmZXIsIHNpemUsIG9mZnNldCwKLQkJCSAgICAgICZyZS0+cmVfcmVncyk7Ci0JaWYgKHJlc3VsdCA8IC0xKSB7Ci0JCS8qIFNlcmlvdXMgZmFpbHVyZSBvZiBzb21lIHNvcnQ7IGlmIHJlX21hdGNoIGRpZG4ndCAKLQkJICAgc2V0IGFuIGV4Y2VwdGlvbiwgcmFpc2UgYSBnZW5lcmljIGVycm9yICovCi0JICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFJlZ2V4RXJyb3IsICJtYXRjaCBmYWlsdXJlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmVzdWx0ID49IDApIHsKLQkJUHlfSU5DUkVGKGFyZ3N0cmluZyk7Ci0JCXJlLT5yZV9sYXN0b2sgPSBhcmdzdHJpbmc7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXN1bHQpOyAvKiBMZW5ndGggb2YgdGhlIG1hdGNoIG9yIC0xICovCi19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1yZWdvYmpfc2VhcmNoKHJlZ2V4b2JqZWN0ICpyZSwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JUHlPYmplY3QgKmFyZ3N0cmluZzsKLQljaGFyICpidWZmZXI7Ci0JaW50IHNpemU7Ci0JaW50IG9mZnNldCA9IDA7Ci0JaW50IHJhbmdlOwotCWludCByZXN1bHQ7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6c2VhcmNoIiwgJmFyZ3N0cmluZywgJm9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfUGFyc2UoYXJnc3RyaW5nLCAidCM6c2VhcmNoIiwgJmJ1ZmZlciwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IHNpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFJlZ2V4RXJyb3IsICJzZWFyY2ggb2Zmc2V0IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogTkI6IEluIEVtYWNzIDE4LjU3LCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgcmVfc2VhcmNoW18yXSBhbmQKLQkgICB0aGUgaW1wbGVtZW50YXRpb24gZG9uJ3QgbWF0Y2g6IHRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0Ci0JICAgfHJhbmdlfCBwb3NpdGlvbnMgYXJlIHRyaWVkLCB3aGlsZSB0aGUgY29kZSB0cmllcyB8cmFuZ2V8KzEKLQkgICBwb3NpdGlvbnMuICBJdCBzZWVtcyBtb3JlIHByb2R1Y3RpdmUgdG8gYmVsaWV2ZSB0aGUgY29kZSEgKi8KLQlyYW5nZSA9IHNpemUgLSBvZmZzZXQ7Ci0JUHlfWERFQ1JFRihyZS0+cmVfbGFzdG9rKTsKLQlyZS0+cmVfbGFzdG9rID0gTlVMTDsKLQlyZXN1bHQgPSBfUHlfcmVfc2VhcmNoKCZyZS0+cmVfcGF0YnVmLCAodW5zaWduZWQgY2hhciAqKWJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCByYW5nZSwKLQkJCSAgICZyZS0+cmVfcmVncyk7Ci0JaWYgKHJlc3VsdCA8IC0xKSB7Ci0JCS8qIFNlcmlvdXMgZmFpbHVyZSBvZiBzb21lIHNvcnQ7IGlmIHJlX21hdGNoIGRpZG4ndCAKLQkJICAgc2V0IGFuIGV4Y2VwdGlvbiwgcmFpc2UgYSBnZW5lcmljIGVycm9yICovCi0JICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JICAJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUmVnZXhFcnJvciwgIm1hdGNoIGZhaWx1cmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChyZXN1bHQgPj0gMCkgewotCQlQeV9JTkNSRUYoYXJnc3RyaW5nKTsKLQkJcmUtPnJlX2xhc3RvayA9IGFyZ3N0cmluZzsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXJlc3VsdCk7IC8qIFBvc2l0aW9uIG9mIHRoZSBtYXRjaCBvciAtMSAqLwotfQotCi0vKiBnZXQgdGhlIGdyb3VwIGZyb20gdGhlIHJlZ2V4IHdoZXJlIGluZGV4IGNhbiBiZSBhIHN0cmluZyAoZ3JvdXAgbmFtZSkgb3IKLSAgIGFuIGludGVnZXIgaW5kZXggWzAgLi4gOTldCi0gKi8KLXN0YXRpYyBQeU9iamVjdCoKLWdyb3VwX2Zyb21faW5kZXgocmVnZXhvYmplY3QgKnJlLCBQeU9iamVjdCAqaW5kZXgpCi17Ci0JaW50IGksIGEsIGI7Ci0JY2hhciAqdjsKLQotCWlmIChQeVN0cmluZ19DaGVjayhpbmRleCkpCi0JCWlmIChyZS0+cmVfZ3JvdXBpbmRleCA9PSBOVUxMIHx8Ci0JCSAgICAhKGluZGV4ID0gUHlEaWN0X0dldEl0ZW0ocmUtPnJlX2dyb3VwaW5kZXgsIGluZGV4KSkpCi0JCXsKLQkJCVB5RXJyX1NldFN0cmluZyhSZWdleEVycm9yLAotCQkJCQkiZ3JvdXAoKSBncm91cCBuYW1lIGRvZXNuJ3QgZXhpc3QiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQlpID0gUHlJbnRfQXNMb25nKGluZGV4KTsKLQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChpIDwgMCB8fCBpID49IFJFX05SRUdTKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhSZWdleEVycm9yLCAiZ3JvdXAoKSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChyZS0+cmVfbGFzdG9rID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFJlZ2V4RXJyb3IsCi0JCQkgICAiZ3JvdXAoKSBvbmx5IHZhbGlkIGFmdGVyIHN1Y2Nlc3NmdWwgbWF0Y2gvc2VhcmNoIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhID0gcmUtPnJlX3JlZ3Muc3RhcnRbaV07Ci0JYiA9IHJlLT5yZV9yZWdzLmVuZFtpXTsKLQlpZiAoYSA8IDAgfHwgYiA8IDApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JCi0JaWYgKCEodiA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlLT5yZV9sYXN0b2spKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodithLCBiLWEpOwotfQotCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1yZWdvYmpfZ3JvdXAocmVnZXhvYmplY3QgKnJlLCBQeU9iamVjdCAqYXJncykKLXsKLQlpbnQgbiA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKLQlpbnQgaTsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQotCWlmIChuIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG4gPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibm90IGVub3VnaCBhcmd1bWVudHMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuID09IDEpIHsKLQkJLyogcmV0dXJuIHZhbHVlIGlzIGEgc2luZ2xlIHN0cmluZyAqLwotCQlQeU9iamVjdCAqaW5kZXggPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JCWlmICghaW5kZXgpCi0JCQlyZXR1cm4gTlVMTDsKLQkJCi0JCXJldHVybiBncm91cF9mcm9tX2luZGV4KHJlLCBpbmRleCk7Ci0JfQotCi0JLyogcmV0dXJuIHZhbHVlIGlzIGEgdHVwbGUgKi8KLQlpZiAoIShyZXMgPSBQeVR1cGxlX05ldyhuKSkpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqaW5kZXggPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7Ci0JCVB5T2JqZWN0ICpncm91cCA9IE5VTEw7Ci0KLQkJaWYgKCFpbmRleCkKLQkJCWdvdG8gZmluYWxseTsKLQkJaWYgKCEoZ3JvdXAgPSBncm91cF9mcm9tX2luZGV4KHJlLCBpbmRleCkpKQotCQkJZ290byBmaW5hbGx5OwotCQlpZiAoUHlUdXBsZV9TZXRJdGVtKHJlcywgaSwgZ3JvdXApIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKLQl9Ci0JcmV0dXJuIHJlczsKLQotICBmaW5hbGx5OgotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgcmVnX21ldGhvZHNbXSA9IHsKLQl7Im1hdGNoIiwJKFB5Q0Z1bmN0aW9uKXJlZ29ial9tYXRjaCwgTUVUSF9WQVJBUkdTfSwKLQl7InNlYXJjaCIsCShQeUNGdW5jdGlvbilyZWdvYmpfc2VhcmNoLCBNRVRIX1ZBUkFSR1N9LAotCXsiZ3JvdXAiLAkoUHlDRnVuY3Rpb24pcmVnb2JqX2dyb3VwLCBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCi19OwotCi0KLQwKLXN0YXRpYyBjaGFyKiBtZW1iZXJzW10gPSB7Ci0JImxhc3QiLCAicmVncyIsICJ0cmFuc2xhdGUiLAotCSJncm91cGluZGV4IiwgInJlYWxwYXQiLCAiZ2l2ZW5wYXQiLAotCU5VTEwKLX07Ci0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ29ial9nZXRhdHRyKHJlZ2V4b2JqZWN0ICpyZSwgY2hhciAqbmFtZSkKLXsKLQlpZiAoc3RyY21wKG5hbWUsICJyZWdzIikgPT0gMCkgewotCQlpZiAocmUtPnJlX2xhc3RvayA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQlyZXR1cm4gbWFrZXJlc3VsdCgmcmUtPnJlX3JlZ3MpOwotCX0KLQlpZiAoc3RyY21wKG5hbWUsICJsYXN0IikgPT0gMCkgewotCQlpZiAocmUtPnJlX2xhc3RvayA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQlQeV9JTkNSRUYocmUtPnJlX2xhc3Rvayk7Ci0JCXJldHVybiByZS0+cmVfbGFzdG9rOwotCX0KLQlpZiAoc3RyY21wKG5hbWUsICJ0cmFuc2xhdGUiKSA9PSAwKSB7Ci0JCWlmIChyZS0+cmVfdHJhbnNsYXRlID09IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JCVB5X0lOQ1JFRihyZS0+cmVfdHJhbnNsYXRlKTsKLQkJcmV0dXJuIHJlLT5yZV90cmFuc2xhdGU7Ci0JfQotCWlmIChzdHJjbXAobmFtZSwgImdyb3VwaW5kZXgiKSA9PSAwKSB7Ci0JCWlmIChyZS0+cmVfZ3JvdXBpbmRleCA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQlQeV9JTkNSRUYocmUtPnJlX2dyb3VwaW5kZXgpOwotCQlyZXR1cm4gcmUtPnJlX2dyb3VwaW5kZXg7Ci0JfQotCWlmIChzdHJjbXAobmFtZSwgInJlYWxwYXQiKSA9PSAwKSB7Ci0JCWlmIChyZS0+cmVfcmVhbHBhdCA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQlQeV9JTkNSRUYocmUtPnJlX3JlYWxwYXQpOwotCQlyZXR1cm4gcmUtPnJlX3JlYWxwYXQ7Ci0JfQotCWlmIChzdHJjbXAobmFtZSwgImdpdmVucGF0IikgPT0gMCkgewotCQlpZiAocmUtPnJlX2dpdmVucGF0ID09IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JCVB5X0lOQ1JFRihyZS0+cmVfZ2l2ZW5wYXQpOwotCQlyZXR1cm4gcmUtPnJlX2dpdmVucGF0OwotCX0KLQlpZiAoc3RyY21wKG5hbWUsICJfX21lbWJlcnNfXyIpID09IDApIHsKLQkJaW50IGkgPSAwOwotCQlQeU9iamVjdCAqbGlzdCA9IE5VTEw7Ci0KLQkJLyogb2theSwgc28gaXQncyB1bmxpa2VseSB0aGlzIGxpc3Qgd2lsbCBjaGFuZ2UgdGhhdCBvZnRlbi4KLQkJICAgc3RpbGwsIGl0J3MgZWFzaWVyIHRvIGNoYW5nZSBpdCBpbiBqdXN0IG9uZSBwbGFjZS4KLQkJICovCi0JCXdoaWxlIChtZW1iZXJzW2ldKQotCQkJaSsrOwotCQlpZiAoIShsaXN0ID0gUHlMaXN0X05ldyhpKSkpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQlpID0gMDsKLQkJd2hpbGUgKG1lbWJlcnNbaV0pIHsKLQkJCVB5T2JqZWN0KiB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtZW1iZXJzW2ldKTsKLQkJCWlmICghdiB8fCBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCB2KSA8IDApIHsKLQkJCQlQeV9ERUNSRUYobGlzdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCXJldHVybiBQeV9GaW5kTWV0aG9kKHJlZ19tZXRob2RzLCAoUHlPYmplY3QgKilyZSwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBQeVR5cGVPYmplY3QgUmVnZXh0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsCQkJCSAgICAgLypvYl9zaXplKi8KLQkicmVnZXgucmVnZXgiLAkJCSAgICAgLyp0cF9uYW1lKi8KLQlzaXplb2YocmVnZXhvYmplY3QpLAkJICAgICAvKnRwX3NpemUqLwotCTAsCQkJCSAgICAgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXJlZ19kZWFsbG9jLAkgICAgIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkJICAgICAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpcmVnb2JqX2dldGF0dHIsCSAgICAgLyp0cF9nZXRhdHRyKi8KLQkwLAkJCQkgICAgIC8qdHBfc2V0YXR0ciovCi0JMCwJCQkJICAgICAvKnRwX2NvbXBhcmUqLwotCTAsCQkJCSAgICAgLyp0cF9yZXByKi8KLX07Ci0KLS8qIHJlZmVyZW5jZSBjb3VudGluZyBpbnZhcmlhbnRzOgotICAgcGF0dGVybjogYm9ycm93ZWQKLSAgIHRyYW5zbGF0ZTogYm9ycm93ZWQKLSAgIGdpdmVucGF0OiBib3Jyb3dlZAotICAgZ3JvdXBpbmRleDogdHJhbnNmZXJyZWQKLSovCi1zdGF0aWMgUHlPYmplY3QgKgotbmV3cmVnZXhvYmplY3QoUHlPYmplY3QgKnBhdHRlcm4sIFB5T2JqZWN0ICp0cmFuc2xhdGUsIFB5T2JqZWN0ICpnaXZlbnBhdCwgUHlPYmplY3QgKmdyb3VwaW5kZXgpCi17Ci0JcmVnZXhvYmplY3QgKnJlOwotCWNoYXIgKnBhdDsKLQlpbnQgc2l6ZTsKLQotCWlmICghUHlBcmdfUGFyc2UocGF0dGVybiwgInQjIiwgJnBhdCwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiAodHJhbnNsYXRlICE9IE5VTEwgJiYgUHlTdHJpbmdfU2l6ZSh0cmFuc2xhdGUpICE9IDI1NikgewotCQlQeUVycl9TZXRTdHJpbmcoUmVnZXhFcnJvciwKLQkJCQkidHJhbnNsYXRpb24gdGFibGUgbXVzdCBiZSAyNTYgYnl0ZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlID0gUHlPYmplY3RfTmV3KHJlZ2V4b2JqZWN0LCAmUmVnZXh0eXBlKTsKLQlpZiAocmUgIT0gTlVMTCkgewotCQljaGFyICplcnJvcjsKLQkJcmUtPnJlX3BhdGJ1Zi5idWZmZXIgPSBOVUxMOwotCQlyZS0+cmVfcGF0YnVmLmFsbG9jYXRlZCA9IDA7Ci0JCXJlLT5yZV9wYXRidWYuZmFzdG1hcCA9ICh1bnNpZ25lZCBjaGFyICopcmUtPnJlX2Zhc3RtYXA7Ci0JCWlmICh0cmFuc2xhdGUpIHsKLQkJCXJlLT5yZV9wYXRidWYudHJhbnNsYXRlID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyh0cmFuc2xhdGUpOwotCQkJaWYgKCFyZS0+cmVfcGF0YnVmLnRyYW5zbGF0ZSkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQlQeV9JTkNSRUYodHJhbnNsYXRlKTsKLQkJfQotCQllbHNlCi0JCQlyZS0+cmVfcGF0YnVmLnRyYW5zbGF0ZSA9IE5VTEw7Ci0JCXJlLT5yZV90cmFuc2xhdGUgPSB0cmFuc2xhdGU7Ci0JCXJlLT5yZV9sYXN0b2sgPSBOVUxMOwotCQlyZS0+cmVfZ3JvdXBpbmRleCA9IGdyb3VwaW5kZXg7Ci0JCVB5X0lOQ1JFRihwYXR0ZXJuKTsKLQkJcmUtPnJlX3JlYWxwYXQgPSBwYXR0ZXJuOwotCQlQeV9JTkNSRUYoZ2l2ZW5wYXQpOwotCQlyZS0+cmVfZ2l2ZW5wYXQgPSBnaXZlbnBhdDsKLQkJZXJyb3IgPSBfUHlfcmVfY29tcGlsZV9wYXR0ZXJuKCh1bnNpZ25lZCBjaGFyICopcGF0LCBzaXplLCAmcmUtPnJlX3BhdGJ1Zik7Ci0JCWlmIChlcnJvciAhPSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUmVnZXhFcnJvciwgZXJyb3IpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilyZTsKLSAgZmluYWxseToKLQlQeV9ERUNSRUYocmUpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmVnZXhfY29tcGlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JUHlPYmplY3QgKnBhdCA9IE5VTEw7Ci0JUHlPYmplY3QgKnRyYW4gPSBOVUxMOwotCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTfFM6Y29tcGlsZSIsICZwYXQsICZ0cmFuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld3JlZ2V4b2JqZWN0KHBhdCwgdHJhbiwgcGF0LCBOVUxMKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXN5bWNvbXAoUHlPYmplY3QgKnBhdHRlcm4sIFB5T2JqZWN0ICpnZGljdCkKLXsKLQljaGFyICpvcGF0LCAqb2VuZCwgKm8sICpuLCAqZywgKnY7Ci0JaW50IGdyb3VwX2NvdW50ID0gMDsKLQlpbnQgc3o7Ci0JaW50IGVzY2FwZWQgPSAwOwotCWNoYXIgbmFtZV9idWZbMTI4XTsKLQlQeU9iamVjdCAqbnBhdHRlcm47Ci0JaW50IHJlcXVpcmVfZXNjYXBlID0gcmVfc3ludGF4ICYgUkVfTk9fQktfUEFSRU5TID8gMCA6IDE7Ci0KLQlpZiAoIShvcGF0ID0gUHlTdHJpbmdfQXNTdHJpbmcocGF0dGVybikpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICgoc3ogPSBQeVN0cmluZ19TaXplKHBhdHRlcm4pKSA8IDApCi0JCXJldHVybiBOVUxMOwotCi0Jb2VuZCA9IG9wYXQgKyBzejsKLQlvID0gb3BhdDsKLQotCWlmIChvZW5kID09IG9wYXQpIHsKLQkJUHlfSU5DUkVGKHBhdHRlcm4pOwotCQlyZXR1cm4gcGF0dGVybjsKLQl9Ci0KLQlpZiAoIShucGF0dGVybiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKilOVUxMLCBzeikpIHx8Ci0JICAgICEobiA9IFB5U3RyaW5nX0FzU3RyaW5nKG5wYXR0ZXJuKSkpCi0JCXJldHVybiBOVUxMOwotCi0Jd2hpbGUgKG8gPCBvZW5kKSB7Ci0JCWlmICgqbyA9PSAnKCcgJiYgZXNjYXBlZCA9PSByZXF1aXJlX2VzY2FwZSkgewotCQkJY2hhciAqYmFja3RyYWNrOwotCQkJZXNjYXBlZCA9IDA7Ci0JCQkrK2dyb3VwX2NvdW50OwotCQkJKm4rKyA9ICpvOwotCQkJaWYgKCsrbyA+PSBvZW5kIHx8ICpvICE9ICc8JykKLQkJCQljb250aW51ZTsKLQkJCS8qICpvID09ICc8JyAqLwotCQkJaWYgKG8rMSA8IG9lbmQgJiYgKihvKzEpID09ICc+JykKLQkJCQljb250aW51ZTsKLQkJCWJhY2t0cmFjayA9IG87Ci0JCQlnID0gbmFtZV9idWY7Ci0JCQlmb3IgKCsrbzsgbyA8IG9lbmQ7KSB7Ci0JCQkJaWYgKCpvID09ICc+JykgewotCQkJCSAgICBQeU9iamVjdCAqZ3JvdXBfbmFtZSA9IE5VTEw7Ci0JCQkJICAgIFB5T2JqZWN0ICpncm91cF9pbmRleCA9IE5VTEw7Ci0JCQkJICAgICpnKysgPSAnXDAnOwotCQkJCSAgICBncm91cF9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lX2J1Zik7Ci0JCQkJICAgIGdyb3VwX2luZGV4ID0gUHlJbnRfRnJvbUxvbmcoZ3JvdXBfY291bnQpOwotCQkJCSAgICBpZiAoZ3JvdXBfbmFtZSA9PSBOVUxMIHx8Ci0JCQkJCWdyb3VwX2luZGV4ID09IE5VTEwgfHwKLQkJCQkJUHlEaWN0X1NldEl0ZW0oZ2RpY3QsIGdyb3VwX25hbWUsCi0JCQkJCQkgICAgICAgZ3JvdXBfaW5kZXgpICE9IDApCi0JCQkJICAgIHsKLQkJCQkJICAgIFB5X1hERUNSRUYoZ3JvdXBfbmFtZSk7Ci0JCQkJCSAgICBQeV9YREVDUkVGKGdyb3VwX2luZGV4KTsKLQkJCQkJICAgIFB5X1hERUNSRUYobnBhdHRlcm4pOwotCQkJCQkgICAgcmV0dXJuIE5VTEw7Ci0JCQkJICAgIH0KLQkJCQkgICAgUHlfREVDUkVGKGdyb3VwX25hbWUpOwotCQkJCSAgICBQeV9ERUNSRUYoZ3JvdXBfaW5kZXgpOwotCQkJCSAgICArK287ICAgICAvKiBlYXQgdGhlICc+JyAqLwotCQkJCSAgICBicmVhazsKLQkJCQl9Ci0JCQkJaWYgKCFpc2FsbnVtKFB5X0NIQVJNQVNLKCpvKSkgJiYgKm8gIT0gJ18nKSB7Ci0JCQkJCW8gPSBiYWNrdHJhY2s7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkqZysrID0gKm8rKzsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgqbyA9PSAnWycgJiYgIWVzY2FwZWQpIHsKLQkJCSpuKysgPSAqbzsKLQkJCSsrbzsJCSAgICAgLyogZWF0IHRoZSBjaGFyIGZvbGxvd2luZyAnWycgKi8KLQkJCSpuKysgPSAqbzsKLQkJCXdoaWxlIChvIDwgb2VuZCAmJiAqbyAhPSAnXScpIHsKLQkJCQkrK287Ci0JCQkJKm4rKyA9ICpvOwotCQkJfQotCQkJaWYgKG8gPCBvZW5kKQotCQkJCSsrbzsKLQkJfQotCQllbHNlIGlmICgqbyA9PSAnXFwnKSB7Ci0JCQllc2NhcGVkID0gMTsKLQkJCSpuKysgPSAqbzsKLQkJCSsrbzsKLQkJfQotCQllbHNlIHsKLQkJCWVzY2FwZWQgPSAwOwotCQkJKm4rKyA9ICpvOwotCQkJKytvOwotCQl9Ci0JfQotCi0JaWYgKCEodiA9IFB5U3RyaW5nX0FzU3RyaW5nKG5wYXR0ZXJuKSkpIHsKLQkJUHlfREVDUkVGKG5wYXR0ZXJuKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIF9QeVN0cmluZ19SZXNpemUoKSBkZWNyZW1lbnRzIG5wYXR0ZXJuIG9uIGZhaWx1cmUgKi8KLQlfUHlTdHJpbmdfUmVzaXplKCZucGF0dGVybiwgbiAtIHYpOwotCXJldHVybiBucGF0dGVybjsKLQotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmVnZXhfc3ltY29tcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JUHlPYmplY3QgKnBhdHRlcm47Ci0JUHlPYmplY3QgKnRyYW4gPSBOVUxMOwotCVB5T2JqZWN0ICpnZGljdCA9IE5VTEw7Ci0JUHlPYmplY3QgKm5wYXR0ZXJuOwotCVB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOwotCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTfFM6c3ltY29tcCIsICZwYXR0ZXJuLCAmdHJhbikpCi0JCXJldHVybiBOVUxMOwotCi0JZ2RpY3QgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKGdkaWN0ID09IE5VTEwgfHwgKG5wYXR0ZXJuID0gc3ltY29tcChwYXR0ZXJuLCBnZGljdCkpID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRihnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR2YWwgPSBuZXdyZWdleG9iamVjdChucGF0dGVybiwgdHJhbiwgcGF0dGVybiwgZ2RpY3QpOwotCVB5X0RFQ1JFRihucGF0dGVybik7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotCi1zdGF0aWMgUHlPYmplY3QgKmNhY2hlX3BhdDsKLXN0YXRpYyBQeU9iamVjdCAqY2FjaGVfcHJvZzsKLQotc3RhdGljIGludAotdXBkYXRlX2NhY2hlKFB5T2JqZWN0ICpwYXQpCi17Ci0JUHlPYmplY3QgKnR1cGxlID0gUHlUdXBsZV9QYWNrKDEsIHBhdCk7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlpZiAoIXR1cGxlKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAocGF0ICE9IGNhY2hlX3BhdCkgewotCQlQeV9YREVDUkVGKGNhY2hlX3BhdCk7Ci0JCWNhY2hlX3BhdCA9IE5VTEw7Ci0JCVB5X1hERUNSRUYoY2FjaGVfcHJvZyk7Ci0JCWNhY2hlX3Byb2cgPSByZWdleF9jb21waWxlKChQeU9iamVjdCAqKU5VTEwsIHR1cGxlKTsKLQkJaWYgKGNhY2hlX3Byb2cgPT0gTlVMTCkgewotCQkJc3RhdHVzID0gLTE7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJY2FjaGVfcGF0ID0gcGF0OwotCQlQeV9JTkNSRUYoY2FjaGVfcGF0KTsKLQl9Ci0gIGZpbmFsbHk6Ci0JUHlfREVDUkVGKHR1cGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmVnZXhfbWF0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICpwYXQsICpzdHJpbmc7Ci0JUHlPYmplY3QgKnR1cGxlLCAqdjsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU1M6bWF0Y2giLCAmcGF0LCAmc3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVwZGF0ZV9jYWNoZShwYXQpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoISh0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihTKSIsIHN0cmluZykpKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gcmVnb2JqX21hdGNoKChyZWdleG9iamVjdCAqKWNhY2hlX3Byb2csIHR1cGxlKTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCXJldHVybiB2OwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmVnZXhfc2VhcmNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLQlQeU9iamVjdCAqcGF0LCAqc3RyaW5nOwotCVB5T2JqZWN0ICp0dXBsZSwgKnY7Ci0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlNTOnNlYXJjaCIsICZwYXQsICZzdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodXBkYXRlX2NhY2hlKHBhdCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICghKHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiKFMpIiwgc3RyaW5nKSkpCi0JCXJldHVybiBOVUxMOwotCXYgPSByZWdvYmpfc2VhcmNoKChyZWdleG9iamVjdCAqKWNhY2hlX3Byb2csIHR1cGxlKTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCXJldHVybiB2OwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmVnZXhfc2V0X3N5bnRheChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JaW50IHN5bnRheDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0X3N5bnRheCIsICZzeW50YXgpKQotCQlyZXR1cm4gTlVMTDsKLQlzeW50YXggPSByZV9zZXRfc3ludGF4KHN5bnRheCk7Ci0JLyogd2lwZSB0aGUgZ2xvYmFsIHBhdHRlcm4gY2FjaGUgKi8KLQlQeV9YREVDUkVGKGNhY2hlX3BhdCk7Ci0JY2FjaGVfcGF0ID0gTlVMTDsKLQlQeV9YREVDUkVGKGNhY2hlX3Byb2cpOwotCWNhY2hlX3Byb2cgPSBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzeW50YXgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmVnZXhfZ2V0X3N5bnRheChQeU9iamVjdCAqc2VsZikKLXsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmVfc3ludGF4KTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHJlZ2V4X2dsb2JhbF9tZXRob2RzW10gPSB7Ci0JeyJjb21waWxlIiwJcmVnZXhfY29tcGlsZSwgTUVUSF9WQVJBUkdTfSwKLQl7InN5bWNvbXAiLAlyZWdleF9zeW1jb21wLCBNRVRIX1ZBUkFSR1N9LAotCXsibWF0Y2giLAlyZWdleF9tYXRjaCwgTUVUSF9WQVJBUkdTfSwKLQl7InNlYXJjaCIsCXJlZ2V4X3NlYXJjaCwgTUVUSF9WQVJBUkdTfSwKLQl7InNldF9zeW50YXgiLAlyZWdleF9zZXRfc3ludGF4LCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0X3N5bnRheCIsICAoUHlDRnVuY3Rpb24pcmVnZXhfZ2V0X3N5bnRheCwgTUVUSF9OT0FSR1N9LAotCXtOVUxMLAkJTlVMTH0JCSAgICAgLyogc2VudGluZWwgKi8KLX07Ci0KLVB5TU9ESU5JVF9GVU5DCi1pbml0cmVnZXgodm9pZCkKLXsKLQlQeU9iamVjdCAqbSwgKmQsICp2OwotCWludCBpOwotCWNoYXIgKnM7Ci0JCi0JLyogSW5pdGlhbGl6ZSBvYmplY3QgdHlwZSAqLwotCVJlZ2V4dHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCi0JbSA9IFB5X0luaXRNb2R1bGUoInJlZ2V4IiwgcmVnZXhfZ2xvYmFsX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQotCWlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJICAgICAgICJ0aGUgcmVnZXggbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7ICIKLQkJICAgICAgICJwbGVhc2UgdXNlIHRoZSByZSBtb2R1bGUiKSA8IDApCi0JCXJldHVybjsKLQkKLQkvKiBJbml0aWFsaXplIHJlZ2V4LmVycm9yIGV4Y2VwdGlvbiAqLwotCXYgPSBSZWdleEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJyZWdleC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmICh2ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgdikgIT0gMCkKLQkJZ290byBmaW5hbGx5OwotCQotCS8qIEluaXRpYWxpemUgcmVnZXguY2FzZWZvbGQgY29uc3RhbnQgKi8KLQlpZiAoISh2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCAyNTYpKSkKLQkJZ290byBmaW5hbGx5OwotCQotCWlmICghKHMgPSBQeVN0cmluZ19Bc1N0cmluZyh2KSkpCi0JCWdvdG8gZmluYWxseTsKLQotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlpZiAoaXN1cHBlcihpKSkKLQkJCXNbaV0gPSB0b2xvd2VyKGkpOwotCQllbHNlCi0JCQlzW2ldID0gaTsKLQl9Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjYXNlZm9sZCIsIHYpIDwgMCkKLQkJZ290byBmaW5hbGx5OwotCVB5X0RFQ1JFRih2KTsKLQotCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuOwotICBmaW5hbGx5OgotCS8qIE5vdGhpbmcgKi8gOwotfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9yZWdleHByLmMgYi9Nb2R1bGVzL3JlZ2V4cHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhNTQxNy4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL3JlZ2V4cHIuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOTQgKzAsMCBAQAotLyogcmVnZXhwci5jCi0gKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQG5ncy5maT4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEgVGF0dSBZbG9uZW4sIEVzcG9vLCBGaW5sYW5kCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQotICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0Ci0gKiBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKLSAqIHdhcnJhbnR5LgotICoKLSAqIENyZWF0ZWQ6IFRodSBTZXAgMjYgMTc6MTQ6MDUgMTk5MSB5bG8KLSAqIExhc3QgbW9kaWZpZWQ6IE1vbiBOb3YgIDQgMTc6MDY6NDggMTk5MSB5bG8KLSAqIFBvcnRlZCB0byBUaGluayBDOiAxOSBKYW4gMTk5MiBndWlkb0Bjd2kubmwKLSAqCi0gKiBUaGlzIGNvZGUgZHJhd3MgbWFueSBpZGVhcyBmcm9tIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGFja2FnZXMgYnkKLSAqIEhlbnJ5IFNwZW5jZXIgb2YgdGhlIFVuaXZlcnNpdHkgb2YgVG9yb250byBhbmQgUmljaGFyZCBTdGFsbG1hbiBvZgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBFbWFjcy1zcGVjaWZpYyBjb2RlIGFuZCBzeW50YXggdGFibGUgY29kZSBpcyBhbG1vc3QgZGlyZWN0bHkgYm9ycm93ZWQKLSAqIGZyb20gR05VIHJlZ2V4cC4KLSAqCi0gKiBCdWdzIGZpeGVkIGFuZCBsb3RzIG9mIHJlb3JnYW5pemF0aW9uIGJ5IEplZmZyZXkgQy4gT2xsaWUsIEFwcmlsCi0gKiAxOTk3IFRoYW5rcyBmb3IgYnVnIHJlcG9ydHMgYW5kIGlkZWFzIGZyb20gQW5kcmV3IEt1Y2hsaW5nLCBUaW0KLSAqIFBldGVycywgR3VpZG8gdmFuIFJvc3N1bSwgS2EtUGluZyBZZWUsIFNqb2VyZCBNdWxsZW5kZXIsIGFuZAotICogcHJvYmFibHkgb25lIG9yIHR3byBvdGhlcnMgdGhhdCBJJ20gZm9yZ2V0dGluZy4KLSAqCi0gKiAkSWQkICovCi0KLSNpbmNsdWRlICJQeXRob24uaCIKLSNpbmNsdWRlICJyZWdleHByLmgiCi0KLS8qIFRoZSBvcmlnaW5hbCBjb2RlIGJsaXRoZWx5IGFzc3VtZWQgdGhhdCBzaXplb2Yoc2hvcnQpID09IDIuICBOb3QKLSAqIGFsd2F5cyB0cnVlLiAgT3JpZ2luYWwgaW5zdGFuY2VzIG9mICIoc2hvcnQpeCIgd2VyZSByZXBsYWNlZCBieQotICogU0hPUlQoeCksIHdoZXJlIFNIT1JUIGlzICNkZWZpbmVkIGJlbG93LiAgKi8KLQotI2RlZmluZSBTSE9SVCh4KSAoKHgpICYgMHg4MDAwID8gKHgpIC0gMHgxMDAwMCA6ICh4KSkKLQotLyogVGhlIHN0YWNrIGltcGxlbWVudGF0aW9uIGlzIHRha2VuIGZyb20gYW4gaWRlYSBieSBBbmRyZXcgS3VjaGxpbmcuCi0gKiBJdCdzIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGFycmF5cy4gVGhlIGFkdmFudGFnZXMgb2YgdGhpcyBvdmVyIGEKLSAqIHNpbXBsZSBsaW5rZWQgbGlzdCBhcmUgdGhhdCB0aGUgbnVtYmVyIG9mIG1hbGxvY3MgcmVxdWlyZWQgYXJlCi0gKiByZWR1Y2VkLiBJdCBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN0YXRpY2FsbHkgYWxsb2NhdGUgZW5vdWdoCi0gKiBzcGFjZSBzbyB0aGF0IHNtYWxsIHBhdHRlcm5zIGRvbid0IGV2ZXIgbmVlZCB0byBjYWxsIG1hbGxvYy4KLSAqCi0gKiBUaGUgYWR2YW50YWdlcyBvdmVyIGEgc2luZ2xlIGFycmF5IGlzIHRoYXQgaXMgcGVyaW9kaWNhbGx5Ci0gKiByZWFsbG9jZWQgd2hlbiBtb3JlIHNwYWNlIGlzIG5lZWRlZCBpcyB0aGF0IHdlIGF2b2lkIGV2ZXIgY29weWluZwotICogdGhlIHN0YWNrLiAqLwotCi0vKiBpdGVtX3QgaXMgdGhlIGJhc2ljIHN0YWNrIGVsZW1lbnQuICBEZWZpbmVkIGFzIGEgdW5pb24gb2YKLSAqIHN0cnVjdHVyZXMgc28gdGhhdCBib3RoIHJlZ2lzdGVycywgZmFpbHVyZSBwb2ludHMsIGFuZCBjb3VudGVycyBjYW4KLSAqIGJlIHB1c2hlZC9wb3BwZWQgZnJvbSB0aGUgc3RhY2suICBUaGVyZSdzIG5vdGhpbmcgYnVpbHQgaW50byB0aGUKLSAqIGl0ZW0gdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGEgY2VydGFpbiBzdGFjayBpdGVtIGlzIGEgcmVnaXN0ZXIsIGEKLSAqIGZhaWx1cmUgcG9pbnQsIG9yIGEgY291bnRlci4gKi8KLQotdHlwZWRlZiB1bmlvbiBpdGVtX3QKLXsKLQlzdHJ1Y3QKLQl7Ci0JCWludCBudW07Ci0JCWludCBsZXZlbDsKLQkJdW5zaWduZWQgY2hhciAqc3RhcnQ7Ci0JCXVuc2lnbmVkIGNoYXIgKmVuZDsKLQl9IHJlZzsKLQlzdHJ1Y3QKLQl7Ci0JCWludCBjb3VudDsKLQkJaW50IGxldmVsOwotCQlpbnQgcGhhbnRvbTsKLQkJdW5zaWduZWQgY2hhciAqY29kZTsKLQkJdW5zaWduZWQgY2hhciAqdGV4dDsKLQl9IGZhaWw7Ci0Jc3RydWN0Ci0JewotCQlpbnQgbnVtOwotCQlpbnQgbGV2ZWw7Ci0JCWludCBjb3VudDsKLQl9IGNudHI7Ci19IGl0ZW1fdDsKLQotI2RlZmluZSBTVEFDS19QQUdFX1NJWkUgMjU2Ci0jZGVmaW5lIE5VTV9SRUdJU1RFUlMgMjU2Ci0KLS8qIEEgJ3BhZ2UnIG9mIHN0YWNrIGl0ZW1zLiAqLwotCi10eXBlZGVmIHN0cnVjdCBpdGVtX3BhZ2VfdAotewotCWl0ZW1fdCBpdGVtc1tTVEFDS19QQUdFX1NJWkVdOwotCXN0cnVjdCBpdGVtX3BhZ2VfdCAqcHJldjsKLQlzdHJ1Y3QgaXRlbV9wYWdlX3QgKm5leHQ7Ci19IGl0ZW1fcGFnZV90OwotCi0KLXR5cGVkZWYgc3RydWN0IG1hdGNoX3N0YXRlCi17Ci0JLyogVGhlIG51bWJlciBvZiByZWdpc3RlcnMgdGhhdCBoYXZlIGJlZW4gcHVzaGVkIG9udG8gdGhlIHN0YWNrCi0JICogc2luY2UgdGhlIGxhc3QgZmFpbHVyZSBwb2ludC4gKi8KLQotCWludCBjb3VudDsKLQotCS8qIFVzZWQgdG8gY29udHJvbCB3aGVuIHJlZ2lzdGVycyBuZWVkIHRvIGJlIHB1c2hlZCBvbnRvIHRoZQotCSAqIHN0YWNrLiAqLwotCQotCWludCBsZXZlbDsKLQkKLQkvKiBUaGUgbnVtYmVyIG9mIGZhaWx1cmUgcG9pbnRzIG9uIHRoZSBzdGFjay4gKi8KLQkKLQlpbnQgcG9pbnQ7Ci0JCi0JLyogU3RvcmFnZSBmb3IgdGhlIHJlZ2lzdGVycy4gIEVhY2ggcmVnaXN0ZXIgY29uc2lzdHMgb2YgdHdvCi0JICogcG9pbnRlcnMgdG8gY2hhcmFjdGVycy4gIFNvIHJlZ2lzdGVyIE4gaXMgcmVwcmVzZW50ZWQgYXMKLQkgKiBzdGFydFtOXSBhbmQgZW5kW05dLiAgVGhlIHBvaW50ZXJzIG11c3QgYmUgY29udmVydGVkIHRvCi0JICogb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBiZWZvcmUgcmV0dXJuaW5nIHRoZQotCSAqIHJlZ2lzdGVycyB0byB0aGUgY2FsbGluZyBwcm9ncmFtLiAqLwotCQotCXVuc2lnbmVkIGNoYXIgKnN0YXJ0W05VTV9SRUdJU1RFUlNdOwotCXVuc2lnbmVkIGNoYXIgKmVuZFtOVU1fUkVHSVNURVJTXTsKLQkKLQkvKiBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIGEgcmVnaXN0ZXIgaGFzIGNoYW5nZWQgcmVjZW50bHkuICovCi0JCi0JaW50IGNoYW5nZWRbTlVNX1JFR0lTVEVSU107Ci0JCi0JLyogU3RydWN0dXJlIHRvIGVuY2Fwc3VsYXRlIHRoZSBzdGFjay4gKi8KLQlzdHJ1Y3QKLQl7Ci0JCS8qIGluZGV4IGludG8gdGhlIGN1cnJlbnQgcGFnZS4gIElmIGluZGV4ID09IDAgYW5kIHlvdSBuZWVkCi0JCSAqIHRvIHBvcCBhbiBpdGVtLCBtb3ZlIHRvIHRoZSBwcmV2aW91cyBwYWdlIGFuZCBzZXQgaW5kZXgKLQkJICogPSBTVEFDS19QQUdFX1NJWkUgLSAxLiAgT3RoZXJ3aXNlIGRlY3JlbWVudCBpbmRleCB0bwotCQkgKiBwdXNoIGEgcGFnZS4gSWYgaW5kZXggPT0gU1RBQ0tfUEFHRV9TSVpFIGFuZCB5b3UgbmVlZAotCQkgKiB0byBwdXNoIGEgcGFnZSBtb3ZlIHRvIHRoZSBuZXh0IHBhZ2UgYW5kIHNldCBpbmRleCA9Ci0JCSAqIDAuIElmIHRoZXJlIGlzIG5vIG5ldyBuZXh0IHBhZ2UsIGFsbG9jYXRlIGEgbmV3IHBhZ2UKLQkJICogYW5kIGxpbmsgaXQgaW4uIE90aGVyd2lzZSwgaW5jcmVtZW50IGluZGV4IHRvIHB1c2ggYQotCQkgKiBwYWdlLiAqLwotCQkKLQkJaW50IGluZGV4OwotCQlpdGVtX3BhZ2VfdCAqY3VycmVudDsgLyogUG9pbnRlciB0byB0aGUgY3VycmVudCBwYWdlLiAqLwotCQlpdGVtX3BhZ2VfdCBmaXJzdDsgLyogRmlyc3QgcGFnZSBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4gKi8KLQl9IHN0YWNrOwotfSBtYXRjaF9zdGF0ZTsKLQotLyogSW5pdGlhbGl6ZSBhIHN0YXRlIG9iamVjdCAqLwotCi0vKiAjZGVmaW5lIE5FV19TVEFURShzdGF0ZSkgXCAqLwotLyogbWVtc2V0KCZzdGF0ZSwgMCwgKHZvaWQgKikoJnN0YXRlLnN0YWNrKSAtICh2b2lkICopKCZzdGF0ZSkpOyBcICovCi0vKiBzdGF0ZS5zdGFjay5jdXJyZW50ID0gJnN0YXRlLnN0YWNrLmZpcnN0OyBcICovCi0vKiBzdGF0ZS5zdGFjay5maXJzdC5wcmV2ID0gTlVMTDsgXCAqLwotLyogc3RhdGUuc3RhY2suZmlyc3QubmV4dCA9IE5VTEw7IFwgKi8KLS8qIHN0YXRlLnN0YWNrLmluZGV4ID0gMDsgXCAqLwotLyogc3RhdGUubGV2ZWwgPSAxICovCi0KLSNkZWZpbmUgTkVXX1NUQVRFKHN0YXRlLCBucmVncykgXAoteyBcCi0JaW50IGk7IFwKLQlmb3IgKGkgPSAwOyBpIDwgbnJlZ3M7IGkrKykgXAotCXsgXAotCQlzdGF0ZS5zdGFydFtpXSA9IE5VTEw7IFwKLQkJc3RhdGUuZW5kW2ldID0gTlVMTDsgXAotCQlzdGF0ZS5jaGFuZ2VkW2ldID0gMDsgXAotCX0gXAotCXN0YXRlLnN0YWNrLmN1cnJlbnQgPSAmc3RhdGUuc3RhY2suZmlyc3Q7IFwKLQlzdGF0ZS5zdGFjay5maXJzdC5wcmV2ID0gTlVMTDsgXAotCXN0YXRlLnN0YWNrLmZpcnN0Lm5leHQgPSBOVUxMOyBcCi0Jc3RhdGUuc3RhY2suaW5kZXggPSAwOyBcCi0Jc3RhdGUubGV2ZWwgPSAxOyBcCi0Jc3RhdGUuY291bnQgPSAwOyBcCi0Jc3RhdGUubGV2ZWwgPSAwOyBcCi0Jc3RhdGUucG9pbnQgPSAwOyBcCi19Ci0KLS8qIEZyZWUgYW55IG1lbW9yeSB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBtYWxsb2MnZCAqLwotCi0jZGVmaW5lIEZSRUVfU1RBVEUoc3RhdGUpIFwKLXdoaWxlKHN0YXRlLnN0YWNrLmZpcnN0Lm5leHQgIT0gTlVMTCkgXAoteyBcCi0Jc3RhdGUuc3RhY2suY3VycmVudCA9IHN0YXRlLnN0YWNrLmZpcnN0Lm5leHQ7IFwKLQlzdGF0ZS5zdGFjay5maXJzdC5uZXh0ID0gc3RhdGUuc3RhY2suY3VycmVudC0+bmV4dDsgXAotCWZyZWUoc3RhdGUuc3RhY2suY3VycmVudCk7IFwKLX0KLQotLyogRGlzY2FyZCB0aGUgdG9wICdjb3VudCcgc3RhY2sgaXRlbXMuICovCi0KLSNkZWZpbmUgU1RBQ0tfRElTQ0FSRChzdGFjaywgY291bnQsIG9uX2Vycm9yKSBcCi1zdGFjay5pbmRleCAtPSBjb3VudDsgXAotd2hpbGUgKHN0YWNrLmluZGV4IDwgMCkgXAoteyBcCi0JaWYgKHN0YWNrLmN1cnJlbnQtPnByZXYgPT0gTlVMTCkgXAotCQlvbl9lcnJvcjsgXAotCXN0YWNrLmN1cnJlbnQgPSBzdGFjay5jdXJyZW50LT5wcmV2OyBcCi0Jc3RhY2suaW5kZXggKz0gU1RBQ0tfUEFHRV9TSVpFOyBcCi19Ci0KLS8qIFN0b3JlIGEgcG9pbnRlciB0byB0aGUgcHJldmlvdXMgaXRlbSBvbiB0aGUgc3RhY2suIFVzZWQgdG8gcG9wIGFuCi0gKiBpdGVtIG9mZiBvZiB0aGUgc3RhY2suICovCi0KLSNkZWZpbmUgU1RBQ0tfUFJFVihzdGFjaywgdG9wLCBvbl9lcnJvcikgXAotaWYgKHN0YWNrLmluZGV4ID09IDApIFwKLXsgXAotCWlmIChzdGFjay5jdXJyZW50LT5wcmV2ID09IE5VTEwpIFwKLQkJb25fZXJyb3I7IFwKLQlzdGFjay5jdXJyZW50ID0gc3RhY2suY3VycmVudC0+cHJldjsgXAotCXN0YWNrLmluZGV4ID0gU1RBQ0tfUEFHRV9TSVpFIC0gMTsgXAotfSBcCi1lbHNlIFwKLXsgXAotCXN0YWNrLmluZGV4LS07IFwKLX0gXAotdG9wID0gJihzdGFjay5jdXJyZW50LT5pdGVtc1tzdGFjay5pbmRleF0pCi0KLS8qIFN0b3JlIGEgcG9pbnRlciB0byB0aGUgbmV4dCBpdGVtIG9uIHRoZSBzdGFjay4gVXNlZCB0byBwdXNoIGFuIGl0ZW0KLSAqIG9uIHRvIHRoZSBzdGFjay4gKi8KLQotI2RlZmluZSBTVEFDS19ORVhUKHN0YWNrLCB0b3AsIG9uX2Vycm9yKSBcCi1pZiAoc3RhY2suaW5kZXggPT0gU1RBQ0tfUEFHRV9TSVpFKSBcCi17IFwKLQlpZiAoc3RhY2suY3VycmVudC0+bmV4dCA9PSBOVUxMKSBcCi0JeyBcCi0JCXN0YWNrLmN1cnJlbnQtPm5leHQgPSAoaXRlbV9wYWdlX3QgKiltYWxsb2Moc2l6ZW9mKGl0ZW1fcGFnZV90KSk7IFwKLQkJaWYgKHN0YWNrLmN1cnJlbnQtPm5leHQgPT0gTlVMTCkgXAotCQkJb25fZXJyb3I7IFwKLQkJc3RhY2suY3VycmVudC0+bmV4dC0+cHJldiA9IHN0YWNrLmN1cnJlbnQ7IFwKLQkJc3RhY2suY3VycmVudC0+bmV4dC0+bmV4dCA9IE5VTEw7IFwKLQl9IFwKLQlzdGFjay5jdXJyZW50ID0gc3RhY2suY3VycmVudC0+bmV4dDsgXAotCXN0YWNrLmluZGV4ID0gMDsgXAotfSBcCi10b3AgPSAmKHN0YWNrLmN1cnJlbnQtPml0ZW1zW3N0YWNrLmluZGV4KytdKQotCi0vKiBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGl0ZW0gdGhhdCBpcyAnY291bnQnIGl0ZW1zIGJhY2sgaW4gdGhlCi0gKiBzdGFjay4gU1RBQ0tfQkFDSyhzdGFjaywgdG9wLCAxLCBvbl9lcnJvcikgaXMgZXF1aXZhbGVudCB0bwotICogU1RBQ0tfVE9QKHN0YWNrLCB0b3AsIG9uX2Vycm9yKS4gICovCi0KLSNkZWZpbmUgU1RBQ0tfQkFDSyhzdGFjaywgdG9wLCBjb3VudCwgb25fZXJyb3IpIFwKLXsgXAotCWludCBpbmRleDsgXAotCWl0ZW1fcGFnZV90ICpjdXJyZW50OyBcCi0JY3VycmVudCA9IHN0YWNrLmN1cnJlbnQ7IFwKLQlpbmRleCA9IHN0YWNrLmluZGV4IC0gKGNvdW50KTsgXAotCXdoaWxlIChpbmRleCA8IDApIFwKLQl7IFwKLQkJaWYgKGN1cnJlbnQtPnByZXYgPT0gTlVMTCkgXAotCQkJb25fZXJyb3I7IFwKLQkJY3VycmVudCA9IGN1cnJlbnQtPnByZXY7IFwKLQkJaW5kZXggKz0gU1RBQ0tfUEFHRV9TSVpFOyBcCi0JfSBcCi0JdG9wID0gJihjdXJyZW50LT5pdGVtc1tpbmRleF0pOyBcCi19Ci0KLS8qIFN0b3JlIGEgcG9pbnRlciB0byB0aGUgdG9wIGl0ZW0gb24gdGhlIHN0YWNrLiBFeGVjdXRlIHRoZQotICogJ29uX2Vycm9yJyBjb2RlIGlmIHRoZXJlIGFyZSBubyBpdGVtcyBvbiB0aGUgc3RhY2suICovCi0KLSNkZWZpbmUgU1RBQ0tfVE9QKHN0YWNrLCB0b3AsIG9uX2Vycm9yKSBcCi1pZiAoc3RhY2suaW5kZXggPT0gMCkgXAoteyBcCi0JaWYgKHN0YWNrLmN1cnJlbnQtPnByZXYgPT0gTlVMTCkgXAotCQlvbl9lcnJvcjsgXAotCXRvcCA9ICYoc3RhY2suY3VycmVudC0+cHJldi0+aXRlbXNbU1RBQ0tfUEFHRV9TSVpFIC0gMV0pOyBcCi19IFwKLWVsc2UgXAoteyBcCi0JdG9wID0gJihzdGFjay5jdXJyZW50LT5pdGVtc1tzdGFjay5pbmRleCAtIDFdKTsgXAotfQotCi0vKiBUZXN0IHRvIHNlZSBpZiB0aGUgc3RhY2sgaXMgZW1wdHkgKi8KLQotI2RlZmluZSBTVEFDS19FTVBUWShzdGFjaykgKChzdGFjay5pbmRleCA9PSAwKSAmJiBcCi0JCQkgICAgKHN0YWNrLmN1cnJlbnQtPnByZXYgPT0gTlVMTCkpCi0KLS8qIFJldHVybiB0aGUgc3RhcnQgb2YgcmVnaXN0ZXIgJ3JlZycgKi8KLQotI2RlZmluZSBHRVRfUkVHX1NUQVJUKHN0YXRlLCByZWcpIChzdGF0ZS5zdGFydFtyZWddKQotCi0vKiBSZXR1cm4gdGhlIGVuZCBvZiByZWdpc3RlciAncmVnJyAqLwotCi0jZGVmaW5lIEdFVF9SRUdfRU5EKHN0YXRlLCByZWcpIChzdGF0ZS5lbmRbcmVnXSkKLQotLyogU2V0IHRoZSBzdGFydCBvZiByZWdpc3RlciAncmVnJy4gSWYgdGhlIHN0YXRlIG9mIHRoZSByZWdpc3RlciBuZWVkcwotICogc2F2aW5nLCBwdXNoIGl0IG9uIHRoZSBzdGFjay4gKi8KLQotI2RlZmluZSBTRVRfUkVHX1NUQVJUKHN0YXRlLCByZWcsIHRleHQsIG9uX2Vycm9yKSBcCi1pZihzdGF0ZS5jaGFuZ2VkW3JlZ10gPCBzdGF0ZS5sZXZlbCkgXAoteyBcCi0JaXRlbV90ICppdGVtOyBcCi0JU1RBQ0tfTkVYVChzdGF0ZS5zdGFjaywgaXRlbSwgb25fZXJyb3IpOyBcCi0JaXRlbS0+cmVnLm51bSA9IHJlZzsgXAotCWl0ZW0tPnJlZy5zdGFydCA9IHN0YXRlLnN0YXJ0W3JlZ107IFwKLQlpdGVtLT5yZWcuZW5kID0gc3RhdGUuZW5kW3JlZ107IFwKLQlpdGVtLT5yZWcubGV2ZWwgPSBzdGF0ZS5jaGFuZ2VkW3JlZ107IFwKLQlzdGF0ZS5jaGFuZ2VkW3JlZ10gPSBzdGF0ZS5sZXZlbDsgXAotCXN0YXRlLmNvdW50Kys7IFwKLX0gXAotc3RhdGUuc3RhcnRbcmVnXSA9IHRleHQKLQotLyogU2V0IHRoZSBlbmQgb2YgcmVnaXN0ZXIgJ3JlZycuIElmIHRoZSBzdGF0ZSBvZiB0aGUgcmVnaXN0ZXIgbmVlZHMKLSAqIHNhdmluZywgcHVzaCBpdCBvbiB0aGUgc3RhY2suICovCi0KLSNkZWZpbmUgU0VUX1JFR19FTkQoc3RhdGUsIHJlZywgdGV4dCwgb25fZXJyb3IpIFwKLWlmKHN0YXRlLmNoYW5nZWRbcmVnXSA8IHN0YXRlLmxldmVsKSBcCi17IFwKLQlpdGVtX3QgKml0ZW07IFwKLQlTVEFDS19ORVhUKHN0YXRlLnN0YWNrLCBpdGVtLCBvbl9lcnJvcik7IFwKLQlpdGVtLT5yZWcubnVtID0gcmVnOyBcCi0JaXRlbS0+cmVnLnN0YXJ0ID0gc3RhdGUuc3RhcnRbcmVnXTsgXAotCWl0ZW0tPnJlZy5lbmQgPSBzdGF0ZS5lbmRbcmVnXTsgXAotCWl0ZW0tPnJlZy5sZXZlbCA9IHN0YXRlLmNoYW5nZWRbcmVnXTsgXAotCXN0YXRlLmNoYW5nZWRbcmVnXSA9IHN0YXRlLmxldmVsOyBcCi0Jc3RhdGUuY291bnQrKzsgXAotfSBcCi1zdGF0ZS5lbmRbcmVnXSA9IHRleHQKLQotI2RlZmluZSBQVVNIX0ZBSUxVUkUoc3RhdGUsIHhjb2RlLCB4dGV4dCwgb25fZXJyb3IpIFwKLXsgXAotCWl0ZW1fdCAqaXRlbTsgXAotCVNUQUNLX05FWFQoc3RhdGUuc3RhY2ssIGl0ZW0sIG9uX2Vycm9yKTsgXAotCWl0ZW0tPmZhaWwuY29kZSA9IHhjb2RlOyBcCi0JaXRlbS0+ZmFpbC50ZXh0ID0geHRleHQ7IFwKLQlpdGVtLT5mYWlsLmNvdW50ID0gc3RhdGUuY291bnQ7IFwKLQlpdGVtLT5mYWlsLmxldmVsID0gc3RhdGUubGV2ZWw7IFwKLQlpdGVtLT5mYWlsLnBoYW50b20gPSAwOyBcCi0Jc3RhdGUuY291bnQgPSAwOyBcCi0Jc3RhdGUubGV2ZWwrKzsgXAotCXN0YXRlLnBvaW50Kys7IFwKLX0KLQotLyogVXBkYXRlIHRoZSBsYXN0IGZhaWx1cmUgcG9pbnQgd2l0aCBhIG5ldyBwb3NpdGlvbiBpbiB0aGUgdGV4dC4gKi8KLQotI2RlZmluZSBVUERBVEVfRkFJTFVSRShzdGF0ZSwgeHRleHQsIG9uX2Vycm9yKSBcCi17IFwKLQlpdGVtX3QgKml0ZW07IFwKLQlTVEFDS19CQUNLKHN0YXRlLnN0YWNrLCBpdGVtLCBzdGF0ZS5jb3VudCArIDEsIG9uX2Vycm9yKTsgXAotCWlmICghaXRlbS0+ZmFpbC5waGFudG9tKSBcCi0JeyBcCi0JCWl0ZW1fdCAqaXRlbTI7IFwKLQkJU1RBQ0tfTkVYVChzdGF0ZS5zdGFjaywgaXRlbTIsIG9uX2Vycm9yKTsgXAotCQlpdGVtMi0+ZmFpbC5jb2RlID0gaXRlbS0+ZmFpbC5jb2RlOyBcCi0JCWl0ZW0yLT5mYWlsLnRleHQgPSB4dGV4dDsgXAotCQlpdGVtMi0+ZmFpbC5jb3VudCA9IHN0YXRlLmNvdW50OyBcCi0JCWl0ZW0yLT5mYWlsLmxldmVsID0gc3RhdGUubGV2ZWw7IFwKLQkJaXRlbTItPmZhaWwucGhhbnRvbSA9IDE7IFwKLQkJc3RhdGUuY291bnQgPSAwOyBcCi0JCXN0YXRlLmxldmVsKys7IFwKLQkJc3RhdGUucG9pbnQrKzsgXAotCX0gXAotCWVsc2UgXAotCXsgXAotCQlTVEFDS19ESVNDQVJEKHN0YXRlLnN0YWNrLCBzdGF0ZS5jb3VudCwgb25fZXJyb3IpOyBcCi0JCVNUQUNLX1RPUChzdGF0ZS5zdGFjaywgaXRlbSwgb25fZXJyb3IpOyBcCi0JCWl0ZW0tPmZhaWwudGV4dCA9IHh0ZXh0OyBcCi0JCXN0YXRlLmNvdW50ID0gMDsgXAotCQlzdGF0ZS5sZXZlbCsrOyBcCi0JfSBcCi19Ci0KLSNkZWZpbmUgUE9QX0ZBSUxVUkUoc3RhdGUsIHhjb2RlLCB4dGV4dCwgb25fZW1wdHksIG9uX2Vycm9yKSBcCi17IFwKLQlpdGVtX3QgKml0ZW07IFwKLQlkbyBcCi0JeyBcCi0JCXdoaWxlKHN0YXRlLmNvdW50ID4gMCkgXAotCQl7IFwKLQkJCVNUQUNLX1BSRVYoc3RhdGUuc3RhY2ssIGl0ZW0sIG9uX2Vycm9yKTsgXAotCQkJc3RhdGUuc3RhcnRbaXRlbS0+cmVnLm51bV0gPSBpdGVtLT5yZWcuc3RhcnQ7IFwKLQkJCXN0YXRlLmVuZFtpdGVtLT5yZWcubnVtXSA9IGl0ZW0tPnJlZy5lbmQ7IFwKLQkJCXN0YXRlLmNoYW5nZWRbaXRlbS0+cmVnLm51bV0gPSBpdGVtLT5yZWcubGV2ZWw7IFwKLQkJCXN0YXRlLmNvdW50LS07IFwKLQkJfSBcCi0JCVNUQUNLX1BSRVYoc3RhdGUuc3RhY2ssIGl0ZW0sIG9uX2VtcHR5KTsgXAotCQl4Y29kZSA9IGl0ZW0tPmZhaWwuY29kZTsgXAotCQl4dGV4dCA9IGl0ZW0tPmZhaWwudGV4dDsgXAotCQlzdGF0ZS5jb3VudCA9IGl0ZW0tPmZhaWwuY291bnQ7IFwKLQkJc3RhdGUubGV2ZWwgPSBpdGVtLT5mYWlsLmxldmVsOyBcCi0JCXN0YXRlLnBvaW50LS07IFwKLQl9IFwKLQl3aGlsZSAoaXRlbS0+ZmFpbC50ZXh0ID09IE5VTEwpOyBcCi19Ci0KLWVudW0gcmVnZXhwX2NvbXBpbGVkX29wcyAvKiBvcGNvZGVzIGZvciBjb21waWxlZCByZWdleHAgKi8KLXsKLQlDZW5kLAkJICAgICAgLyogZW5kIG9mIHBhdHRlcm4gcmVhY2hlZCAqLwotCUNib2wsCQkgICAgICAvKiBiZWdpbm5pbmcgb2YgbGluZSAqLwotCUNlb2wsCQkgICAgICAvKiBlbmQgb2YgbGluZSAqLwotCUNzZXQsCQkgICAgICAvKiBjaGFyYWN0ZXIgc2V0LiAgRm9sbG93ZWQgYnkgMzIgYnl0ZXMgb2Ygc2V0LiAqLwotCUNleGFjdCwJCSAgICAgIC8qIGZvbGxvd2VkIGJ5IGEgYnl0ZSB0byBtYXRjaCAqLwotCUNhbnljaGFyLAkgICAgICAvKiBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgZXhjZXB0IG5ld2xpbmUgKi8KLQlDc3RhcnRfbWVtb3J5LAkgICAgICAvKiBzZXQgcmVnaXN0ZXIgc3RhcnQgYWRkciAoZm9sbG93ZWQgYnkgcmVnIG51bWJlcikgKi8KLQlDZW5kX21lbW9yeSwJICAgICAgLyogc2V0IHJlZ2lzdGVyIGVuZCBhZGRyIChmb2xsb3dlZCBieSByZWcgbnVtYmVyKSAqLwotCUNtYXRjaF9tZW1vcnksCSAgICAgIC8qIG1hdGNoIGEgZHVwbGljYXRlIG9mIHJlZyBjb250ZW50cyAocmVnbnVtIGZvbGxvd3MpKi8KLQlDanVtcCwJCSAgICAgIC8qIGZvbGxvd2VkIGJ5IHR3byBieXRlcyAobHNiLG1zYikgb2YgZGlzcGxhY2VtZW50LiAqLwotCUNzdGFyX2p1bXAsCSAgICAgIC8qIHdpbGwgY2hhbmdlIHRvIGp1bXAvdXBkYXRlX2ZhaWx1cmVfanVtcCBhdCBydW50aW1lICovCi0JQ2ZhaWx1cmVfanVtcCwJICAgICAgLyoganVtcCB0byBhZGRyIG9uIGZhaWx1cmUgKi8KLQlDdXBkYXRlX2ZhaWx1cmVfanVtcCwgLyogdXBkYXRlIHRvcG1vc3QgZmFpbHVyZSBwb2ludCBhbmQganVtcCAqLwotCUNkdW1teV9mYWlsdXJlX2p1bXAsICAvKiBwdXNoIGEgZHVtbXkgZmFpbHVyZSBwb2ludCBhbmQganVtcCAqLwotCUNiZWdidWYsCSAgICAgIC8qIG1hdGNoIGF0IGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLQlDZW5kYnVmLAkgICAgICAvKiBtYXRjaCBhdCBlbmQgb2YgYnVmZmVyICovCi0JQ3dvcmRiZWcsCSAgICAgIC8qIG1hdGNoIGF0IGJlZ2lubmluZyBvZiB3b3JkICovCi0JQ3dvcmRlbmQsCSAgICAgIC8qIG1hdGNoIGF0IGVuZCBvZiB3b3JkICovCi0JQ3dvcmRib3VuZCwJICAgICAgLyogbWF0Y2ggaWYgYXQgd29yZCBib3VuZGFyeSAqLwotCUNub3R3b3JkYm91bmQsICAgICAgICAvKiBtYXRjaCBpZiBub3QgYXQgd29yZCBib3VuZGFyeSAqLwotCUNzeW50YXhzcGVjLAkgICAgICAvKiBtYXRjaGVzIHN5bnRheCBjb2RlICgxIGJ5dGUgZm9sbG93cykgKi8KLQlDbm90c3ludGF4c3BlYywgICAgICAgLyogbWF0Y2hlcyBpZiBzeW50YXggY29kZSBkb2VzIG5vdCBtYXRjaCAoMSBieXRlIGZvbGxvd3MpICovCi0JQ3JlcGVhdDEKLX07Ci0KLWVudW0gcmVnZXhwX3N5bnRheF9vcAkvKiBzeW50YXggY29kZXMgZm9yIHBsYWluIGFuZCBxdW90ZWQgY2hhcmFjdGVycyAqLwotewotCVJlbmQsCQkgIC8qIHNwZWNpYWwgY29kZSBmb3IgZW5kIG9mIHJlZ2V4cCAqLwotCVJub3JtYWwsCSAgLyogbm9ybWFsIGNoYXJhY3RlciAqLwotCVJhbnljaGFyLAkgIC8qIGFueSBjaGFyYWN0ZXIgZXhjZXB0IG5ld2xpbmUgKi8KLQlScXVvdGUsCQkgIC8qIHRoZSBxdW90ZSBjaGFyYWN0ZXIgKi8KLQlSYm9sLAkJICAvKiBtYXRjaCBiZWdpbm5pbmcgb2YgbGluZSAqLwotCVJlb2wsCQkgIC8qIG1hdGNoIGVuZCBvZiBsaW5lICovCi0JUm9wdGlvbmFsLAkgIC8qIG1hdGNoIHByZWNlZGluZyBleHByZXNzaW9uIG9wdGlvbmFsbHkgKi8KLQlSc3RhciwJCSAgLyogbWF0Y2ggcHJlY2VkaW5nIGV4cHIgemVybyBvciBtb3JlIHRpbWVzICovCi0JUnBsdXMsCQkgIC8qIG1hdGNoIHByZWNlZGluZyBleHByIG9uZSBvciBtb3JlIHRpbWVzICovCi0JUm9yLAkJICAvKiBtYXRjaCBlaXRoZXIgb2YgYWx0ZXJuYXRpdmVzICovCi0JUm9wZW5wYXIsCSAgLyogb3BlbmluZyBwYXJlbnRoZXNpcyAqLwotCVJjbG9zZXBhciwJICAvKiBjbG9zaW5nIHBhcmVudGhlc2lzICovCi0JUm1lbW9yeSwJICAvKiBtYXRjaCBtZW1vcnkgcmVnaXN0ZXIgKi8KLQlSZXh0ZW5kZWRfbWVtb3J5LCAvKiBcdm5uIHRvIG1hdGNoIHJlZ2lzdGVycyAxMC05OSAqLwotCVJvcGVuc2V0LAkgIC8qIG9wZW4gc2V0LiAgSW50ZXJuYWwgc3ludGF4IGhhcmQtY29kZWQgYmVsb3cuICovCi0JLyogdGhlIGZvbGxvd2luZyBhcmUgZ251IGV4dGVuc2lvbnMgdG8gIm5vcm1hbCIgcmVnZXhwIHN5bnRheCAqLwotCVJiZWdidWYsCSAgLyogYmVnaW5uaW5nIG9mIGJ1ZmZlciAqLwotCVJlbmRidWYsCSAgLyogZW5kIG9mIGJ1ZmZlciAqLwotCVJ3b3JkY2hhciwJICAvKiB3b3JkIGNoYXJhY3RlciAqLwotCVJub3R3b3JkY2hhciwJICAvKiBub3Qgd29yZCBjaGFyYWN0ZXIgKi8KLQlSd29yZGJlZywJICAvKiBiZWdpbm5pbmcgb2Ygd29yZCAqLwotCVJ3b3JkZW5kLAkgIC8qIGVuZCBvZiB3b3JkICovCi0JUndvcmRib3VuZCwJICAvKiB3b3JkIGJvdW5kICovCi0JUm5vdHdvcmRib3VuZCwJICAvKiBub3Qgd29yZCBib3VuZCAqLwotCVJudW1fb3BzCi19OwotCi1zdGF0aWMgaW50IHJlX2NvbXBpbGVfaW5pdGlhbGl6ZWQgPSAwOwotc3RhdGljIGludCByZWdleHBfc3ludGF4ID0gMDsKLWludCByZV9zeW50YXggPSAwOyAvKiBFeHBvcnRlZCBjb3B5IG9mIHJlZ2V4cF9zeW50YXggKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJlZ2V4cF9wbGFpbl9vcHNbMjU2XTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJlZ2V4cF9xdW90ZWRfb3BzWzI1Nl07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciByZWdleHBfcHJlY2VkZW5jZXNbUm51bV9vcHNdOwotc3RhdGljIGludCByZWdleHBfY29udGV4dF9pbmRlcF9vcHM7Ci1zdGF0aWMgaW50IHJlZ2V4cF9hbnNpX3NlcXVlbmNlczsKLQotI2RlZmluZSBOVU1fTEVWRUxTICA1ICAgIC8qIG51bWJlciBvZiBwcmVjZWRlbmNlIGxldmVscyBpbiB1c2UgKi8KLSNkZWZpbmUgTUFYX05FU1RJTkcgMTAwICAvKiBtYXggbmVzdGluZyBsZXZlbCBvZiBvcGVyYXRvcnMgKi8KLQotI2RlZmluZSBTWU5UQVgoY2gpIHJlX3N5bnRheF90YWJsZVsodW5zaWduZWQgY2hhcikoY2gpXQotCi11bnNpZ25lZCBjaGFyIHJlX3N5bnRheF90YWJsZVsyNTZdOwotCi12b2lkIHJlX2NvbXBpbGVfaW5pdGlhbGl6ZSh2b2lkKQotewotCWludCBhOwotICAKLQlzdGF0aWMgaW50IHN5bnRheF90YWJsZV9pbml0ZWQgPSAwOwotCi0JaWYgKCFzeW50YXhfdGFibGVfaW5pdGVkKQotCXsKLQkJc3ludGF4X3RhYmxlX2luaXRlZCA9IDE7Ci0JCW1lbXNldChyZV9zeW50YXhfdGFibGUsIDAsIDI1Nik7Ci0JCWZvciAoYSA9ICdhJzsgYSA8PSAneic7IGErKykKLQkJCXJlX3N5bnRheF90YWJsZVthXSA9IFN3b3JkOwotCQlmb3IgKGEgPSAnQSc7IGEgPD0gJ1onOyBhKyspCi0JCQlyZV9zeW50YXhfdGFibGVbYV0gPSBTd29yZDsKLQkJZm9yIChhID0gJzAnOyBhIDw9ICc5JzsgYSsrKQotCQkJcmVfc3ludGF4X3RhYmxlW2FdID0gU3dvcmQgfCBTZGlnaXQgfCBTaGV4ZGlnaXQ7Ci0JCWZvciAoYSA9ICcwJzsgYSA8PSAnNyc7IGErKykKLQkJCXJlX3N5bnRheF90YWJsZVthXSB8PSBTb2N0YWxkaWdpdDsKLQkJZm9yIChhID0gJ0EnOyBhIDw9ICdGJzsgYSsrKQotCQkJcmVfc3ludGF4X3RhYmxlW2FdIHw9IFNoZXhkaWdpdDsKLQkJZm9yIChhID0gJ2EnOyBhIDw9ICdmJzsgYSsrKQotCQkJcmVfc3ludGF4X3RhYmxlW2FdIHw9IFNoZXhkaWdpdDsKLQkJcmVfc3ludGF4X3RhYmxlWydfJ10gPSBTd29yZDsKLQkJZm9yIChhID0gOTsgYSA8PSAxMzsgYSsrKQotCQkJcmVfc3ludGF4X3RhYmxlW2FdID0gU3doaXRlc3BhY2U7Ci0JCXJlX3N5bnRheF90YWJsZVsnICddID0gU3doaXRlc3BhY2U7Ci0JfQotCXJlX2NvbXBpbGVfaW5pdGlhbGl6ZWQgPSAxOwotCWZvciAoYSA9IDA7IGEgPCAyNTY7IGErKykKLQl7Ci0JCXJlZ2V4cF9wbGFpbl9vcHNbYV0gPSBSbm9ybWFsOwotCQlyZWdleHBfcXVvdGVkX29wc1thXSA9IFJub3JtYWw7Ci0JfQotCWZvciAoYSA9ICcwJzsgYSA8PSAnOSc7IGErKykKLQkJcmVnZXhwX3F1b3RlZF9vcHNbYV0gPSBSbWVtb3J5OwotCXJlZ2V4cF9wbGFpbl9vcHNbJ1wxMzQnXSA9IFJxdW90ZTsKLQlpZiAocmVnZXhwX3N5bnRheCAmIFJFX05PX0JLX1BBUkVOUykKLQl7Ci0JCXJlZ2V4cF9wbGFpbl9vcHNbJygnXSA9IFJvcGVucGFyOwotCQlyZWdleHBfcGxhaW5fb3BzWycpJ10gPSBSY2xvc2VwYXI7Ci0JfQotCWVsc2UKLQl7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWycoJ10gPSBSb3BlbnBhcjsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJyknXSA9IFJjbG9zZXBhcjsKLQl9Ci0JaWYgKHJlZ2V4cF9zeW50YXggJiBSRV9OT19CS19WQkFSKQotCQlyZWdleHBfcGxhaW5fb3BzWydcMTc0J10gPSBSb3I7Ci0JZWxzZQotCQlyZWdleHBfcXVvdGVkX29wc1snXDE3NCddID0gUm9yOwotCXJlZ2V4cF9wbGFpbl9vcHNbJyonXSA9IFJzdGFyOwotCWlmIChyZWdleHBfc3ludGF4ICYgUkVfQktfUExVU19RTSkKLQl7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWycrJ10gPSBScGx1czsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJz8nXSA9IFJvcHRpb25hbDsKLQl9Ci0JZWxzZQotCXsKLQkJcmVnZXhwX3BsYWluX29wc1snKyddID0gUnBsdXM7Ci0JCXJlZ2V4cF9wbGFpbl9vcHNbJz8nXSA9IFJvcHRpb25hbDsKLQl9Ci0JaWYgKHJlZ2V4cF9zeW50YXggJiBSRV9ORVdMSU5FX09SKQotCQlyZWdleHBfcGxhaW5fb3BzWydcbiddID0gUm9yOwotCXJlZ2V4cF9wbGFpbl9vcHNbJ1wxMzMnXSA9IFJvcGVuc2V0OwotCXJlZ2V4cF9wbGFpbl9vcHNbJ1wxMzYnXSA9IFJib2w7Ci0JcmVnZXhwX3BsYWluX29wc1snJCddID0gUmVvbDsKLQlyZWdleHBfcGxhaW5fb3BzWycuJ10gPSBSYW55Y2hhcjsKLQlpZiAoIShyZWdleHBfc3ludGF4ICYgUkVfTk9fR05VX0VYVEVOU0lPTlMpKQotCXsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJ3cnXSA9IFJ3b3JkY2hhcjsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJ1cnXSA9IFJub3R3b3JkY2hhcjsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJzwnXSA9IFJ3b3JkYmVnOwotCQlyZWdleHBfcXVvdGVkX29wc1snPiddID0gUndvcmRlbmQ7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWydiJ10gPSBSd29yZGJvdW5kOwotCQlyZWdleHBfcXVvdGVkX29wc1snQiddID0gUm5vdHdvcmRib3VuZDsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJ2AnXSA9IFJiZWdidWY7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWydcJyddID0gUmVuZGJ1ZjsKLQl9Ci0JaWYgKHJlZ2V4cF9zeW50YXggJiBSRV9BTlNJX0hFWCkKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJ3YnXSA9IFJleHRlbmRlZF9tZW1vcnk7Ci0JZm9yIChhID0gMDsgYSA8IFJudW1fb3BzOyBhKyspCi0JCXJlZ2V4cF9wcmVjZWRlbmNlc1thXSA9IDQ7Ci0JaWYgKHJlZ2V4cF9zeW50YXggJiBSRV9USUdIVF9WQkFSKQotCXsKLQkJcmVnZXhwX3ByZWNlZGVuY2VzW1Jvcl0gPSAzOwotCQlyZWdleHBfcHJlY2VkZW5jZXNbUmJvbF0gPSAyOwotCQlyZWdleHBfcHJlY2VkZW5jZXNbUmVvbF0gPSAyOwotCX0KLQllbHNlCi0JewotCQlyZWdleHBfcHJlY2VkZW5jZXNbUm9yXSA9IDI7Ci0JCXJlZ2V4cF9wcmVjZWRlbmNlc1tSYm9sXSA9IDM7Ci0JCXJlZ2V4cF9wcmVjZWRlbmNlc1tSZW9sXSA9IDM7Ci0JfQotCXJlZ2V4cF9wcmVjZWRlbmNlc1tSY2xvc2VwYXJdID0gMTsKLQlyZWdleHBfcHJlY2VkZW5jZXNbUmVuZF0gPSAwOwotCXJlZ2V4cF9jb250ZXh0X2luZGVwX29wcyA9IChyZWdleHBfc3ludGF4ICYgUkVfQ09OVEVYVF9JTkRFUF9PUFMpICE9IDA7Ci0JcmVnZXhwX2Fuc2lfc2VxdWVuY2VzID0gKHJlZ2V4cF9zeW50YXggJiBSRV9BTlNJX0hFWCkgIT0gMDsKLX0KLQotaW50IHJlX3NldF9zeW50YXgoaW50IHN5bnRheCkKLXsKLQlpbnQgcmV0OwotCQotCXJldCA9IHJlZ2V4cF9zeW50YXg7Ci0JcmVnZXhwX3N5bnRheCA9IHN5bnRheDsKLQlyZV9zeW50YXggPSBzeW50YXg7IC8qIEV4cG9ydGVkIGNvcHkgKi8KLQlyZV9jb21waWxlX2luaXRpYWxpemUoKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGhleF9jaGFyX3RvX2RlY2ltYWwoaW50IGNoKQotewotCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQotCQlyZXR1cm4gY2ggLSAnMCc7Ci0JaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpCi0JCXJldHVybiBjaCAtICdhJyArIDEwOwotCWlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQotCQlyZXR1cm4gY2ggLSAnQScgKyAxMDsKLQlyZXR1cm4gMTY7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlX2NvbXBpbGVfZmFzdG1hcF9hdXgodW5zaWduZWQgY2hhciAqY29kZSwgaW50IHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdmlzaXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2FuX2JlX251bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmZhc3RtYXApCi17Ci0JaW50IGE7Ci0JaW50IGI7Ci0JaW50IHN5bnRheGNvZGU7Ci0JCi0JaWYgKHZpc2l0ZWRbcG9zXSkKLQkJcmV0dXJuOyAgLyogd2UgaGF2ZSBhbHJlYWR5IGJlZW4gaGVyZSAqLwotCXZpc2l0ZWRbcG9zXSA9IDE7Ci0JZm9yICg7OykKLQkJc3dpdGNoIChjb2RlW3BvcysrXSkgewotCQljYXNlIENlbmQ6Ci0JCQl7Ci0JCQkJKmNhbl9iZV9udWxsID0gMTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCWNhc2UgQ2JvbDoKLQkJY2FzZSBDYmVnYnVmOgotCQljYXNlIENlbmRidWY6Ci0JCWNhc2UgQ3dvcmRiZWc6Ci0JCWNhc2UgQ3dvcmRlbmQ6Ci0JCWNhc2UgQ3dvcmRib3VuZDoKLQkJY2FzZSBDbm90d29yZGJvdW5kOgotCQl7Ci0JCQlmb3IgKGEgPSAwOyBhIDwgMjU2OyBhKyspCi0JCQkJZmFzdG1hcFthXSA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENzeW50YXhzcGVjOgotCQl7Ci0JCQlzeW50YXhjb2RlID0gY29kZVtwb3MrK107Ci0JCQlmb3IgKGEgPSAwOyBhIDwgMjU2OyBhKyspCi0JCQkJaWYgKFNZTlRBWChhKSAmIHN5bnRheGNvZGUpIAotCQkJCQlmYXN0bWFwW2FdID0gMTsKLQkJCXJldHVybjsKLQkJfQotCQljYXNlIENub3RzeW50YXhzcGVjOgotCQl7Ci0JCQlzeW50YXhjb2RlID0gY29kZVtwb3MrK107Ci0JCQlmb3IgKGEgPSAwOyBhIDwgMjU2OyBhKyspCi0JCQkJaWYgKCEoU1lOVEFYKGEpICYgc3ludGF4Y29kZSkgKQotCQkJCQlmYXN0bWFwW2FdID0gMTsKLQkJCXJldHVybjsKLQkJfQotCQljYXNlIENlb2w6Ci0JCXsKLQkJCWZhc3RtYXBbJ1xuJ10gPSAxOwotCQkJaWYgKCpjYW5fYmVfbnVsbCA9PSAwKQotCQkJCSpjYW5fYmVfbnVsbCA9IDI7IC8qIGNhbiBtYXRjaCBudWxsLCBidXQgb25seSBhdCBlbmQgb2YgYnVmZmVyKi8KLQkJCXJldHVybjsKLQkJfQotCQljYXNlIENzZXQ6Ci0JCXsKLQkJCWZvciAoYSA9IDA7IGEgPCAyNTYvODsgYSsrKQotCQkJCWlmIChjb2RlW3BvcyArIGFdICE9IDApCi0JCQkJCWZvciAoYiA9IDA7IGIgPCA4OyBiKyspCi0JCQkJCQlpZiAoY29kZVtwb3MgKyBhXSAmICgxIDw8IGIpKQotCQkJCQkJCWZhc3RtYXBbKGEgPDwgMykgKyBiXSA9IDE7Ci0JCQlwb3MgKz0gMjU2Lzg7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2FzZSBDZXhhY3Q6Ci0JCXsKLQkJCWZhc3RtYXBbKHVuc2lnbmVkIGNoYXIpY29kZVtwb3NdXSA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2FzZSBDYW55Y2hhcjoKLQkJewotCQkJZm9yIChhID0gMDsgYSA8IDI1NjsgYSsrKQotCQkJCWlmIChhICE9ICdcbicpCi0JCQkJCWZhc3RtYXBbYV0gPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNhc2UgQ3N0YXJ0X21lbW9yeToKLQkJY2FzZSBDZW5kX21lbW9yeToKLQkJewotCQkJcG9zKys7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENtYXRjaF9tZW1vcnk6Ci0JCXsKLQkJCWZvciAoYSA9IDA7IGEgPCAyNTY7IGErKykKLQkJCQlmYXN0bWFwW2FdID0gMTsKLQkJCSpjYW5fYmVfbnVsbCA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2FzZSBDanVtcDoKLQkJY2FzZSBDZHVtbXlfZmFpbHVyZV9qdW1wOgotCQljYXNlIEN1cGRhdGVfZmFpbHVyZV9qdW1wOgotCQljYXNlIENzdGFyX2p1bXA6Ci0JCXsKLQkJCWEgPSAodW5zaWduZWQgY2hhciljb2RlW3BvcysrXTsKLQkJCWEgfD0gKHVuc2lnbmVkIGNoYXIpY29kZVtwb3MrK10gPDwgODsKLQkJCXBvcyArPSAoaW50KVNIT1JUKGEpOwotCQkJaWYgKHZpc2l0ZWRbcG9zXSkKLQkJCXsKLQkJCQkvKiBhcmdoLi4uIHRoZSByZWdleHAgY29udGFpbnMgZW1wdHkgbG9vcHMuICBUaGlzIGlzIG5vdAotCQkJCSAgIGdvb2QsIGFzIHRoaXMgbWF5IGNhdXNlIGEgZmFpbHVyZSBzdGFjayBvdmVyZmxvdyB3aGVuCi0JCQkJICAgbWF0Y2hpbmcuICBPaCB3ZWxsLiAqLwotCQkJCS8qIHRoaXMgcGF0aCBsZWFkcyBub3doZXJlOyBwdXJzdWUgb3RoZXIgcGF0aHMuICovCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJdmlzaXRlZFtwb3NdID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQ2ZhaWx1cmVfanVtcDoKLQkJewotCQkJYSA9ICh1bnNpZ25lZCBjaGFyKWNvZGVbcG9zKytdOwotCQkJYSB8PSAodW5zaWduZWQgY2hhciljb2RlW3BvcysrXSA8PCA4OwotCQkJYSA9IHBvcyArIChpbnQpU0hPUlQoYSk7Ci0JCQlyZV9jb21waWxlX2Zhc3RtYXBfYXV4KGNvZGUsIGEsIHZpc2l0ZWQsIGNhbl9iZV9udWxsLCBmYXN0bWFwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQ3JlcGVhdDE6Ci0JCXsKLQkJCXBvcyArPSAyOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJewotCQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlVua25vd24gcmVnZXggb3Bjb2RlOiBtZW1vcnkgY29ycnVwdGVkPyIpOwotCQkgICAgICAgIHJldHVybjsKLQkJCS8qTk9UUkVBQ0hFRCovCi0JCX0KLQkJfQotfQotCi1zdGF0aWMgaW50IHJlX2RvX2NvbXBpbGVfZmFzdG1hcCh1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCB1c2VkLCBpbnQgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2FuX2JlX251bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpmYXN0bWFwKQotewotCXVuc2lnbmVkIGNoYXIgc21hbGxfdmlzaXRlZFs1MTJdLCAqdmlzaXRlZDsKLSAgIAotCWlmICh1c2VkIDw9IHNpemVvZihzbWFsbF92aXNpdGVkKSkKLQkJdmlzaXRlZCA9IHNtYWxsX3Zpc2l0ZWQ7Ci0JZWxzZQotCXsKLQkJdmlzaXRlZCA9IG1hbGxvYyh1c2VkKTsKLQkJaWYgKCF2aXNpdGVkKQotCQkJcmV0dXJuIDA7Ci0JfQotCSpjYW5fYmVfbnVsbCA9IDA7Ci0JbWVtc2V0KGZhc3RtYXAsIDAsIDI1Nik7Ci0JbWVtc2V0KHZpc2l0ZWQsIDAsIHVzZWQpOwotCXJlX2NvbXBpbGVfZmFzdG1hcF9hdXgoYnVmZmVyLCBwb3MsIHZpc2l0ZWQsIGNhbl9iZV9udWxsLCBmYXN0bWFwKTsKLQlpZiAodmlzaXRlZCAhPSBzbWFsbF92aXNpdGVkKQotCQlmcmVlKHZpc2l0ZWQpOwotCXJldHVybiAxOwotfQotCi12b2lkIHJlX2NvbXBpbGVfZmFzdG1hcChyZWdleHBfdCBidWZwKQotewotCWlmICghYnVmcC0+ZmFzdG1hcCB8fCBidWZwLT5mYXN0bWFwX2FjY3VyYXRlKQotCQlyZXR1cm47Ci0JYXNzZXJ0KGJ1ZnAtPnVzZWQgPiAwKTsKLQlpZiAoIXJlX2RvX2NvbXBpbGVfZmFzdG1hcChidWZwLT5idWZmZXIsCi0JCQkJICAgYnVmcC0+dXNlZCwKLQkJCQkgICAwLAotCQkJCSAgICZidWZwLT5jYW5fYmVfbnVsbCwKLQkJCQkgICBidWZwLT5mYXN0bWFwKSkKLQkJcmV0dXJuOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSByZXR1cm47Ci0JaWYgKGJ1ZnAtPmJ1ZmZlclswXSA9PSBDYm9sKQotCQlidWZwLT5hbmNob3IgPSAxOyAgIC8qIGJlZ2xpbmUgKi8KLQllbHNlCi0JCWlmIChidWZwLT5idWZmZXJbMF0gPT0gQ2JlZ2J1ZikKLQkJCWJ1ZnAtPmFuY2hvciA9IDI7IC8qIGJlZ2J1ZiAqLwotCQllbHNlCi0JCQlidWZwLT5hbmNob3IgPSAwOyAvKiBub25lICovCi0JYnVmcC0+ZmFzdG1hcF9hY2N1cmF0ZSA9IDE7Ci19Ci0KLS8qIAotICogc3RhciBpcyBjb2RlZCBhczoKLSAqIDE6IGZhaWx1cmVfanVtcCAyCi0gKiAgICAuLi4gY29kZSBmb3Igb3BlcmFuZCBvZiBzdGFyCi0gKiAgICBzdGFyX2p1bXAgMQotICogMjogLi4uIGNvZGUgYWZ0ZXIgc3RhcgotICoKLSAqIFdlIGNoYW5nZSB0aGUgc3Rhcl9qdW1wIHRvIHVwZGF0ZV9mYWlsdXJlX2p1bXAgaWYgd2UgY2FuIGRldGVybWluZQotICogdGhhdCBpdCBpcyBzYWZlIHRvIGRvIHNvOyBvdGhlcndpc2Ugd2UgY2hhbmdlIGl0IHRvIGFuIG9yZGluYXJ5Ci0gKiBqdW1wLgotICoKLSAqIHBsdXMgaXMgY29kZWQgYXMKLSAqCi0gKiAgICBqdW1wIDIKLSAqIDE6IGZhaWx1cmVfanVtcCAzCi0gKiAyOiAuLi4gY29kZSBmb3Igb3BlcmFuZCBvZiBwbHVzCi0gKiAgICBzdGFyX2p1bXAgMQotICogMzogLi4uIGNvZGUgYWZ0ZXIgcGx1cwotICoKLSAqIEZvciBzdGFyX2p1bXAgY29uc2lkZXJhdGlvbnMgdGhpcyBpcyBwcm9jZXNzZWQgaWRlbnRpY2FsbHkgdG8gc3Rhci4KLSAqCi0gKi8KLQotc3RhdGljIGludCByZV9vcHRpbWl6ZV9zdGFyX2p1bXAocmVnZXhwX3QgYnVmcCwgdW5zaWduZWQgY2hhciAqY29kZSkKLXsKLQl1bnNpZ25lZCBjaGFyIG1hcFsyNTZdOwotCXVuc2lnbmVkIGNoYXIgY2FuX2JlX251bGw7Ci0JdW5zaWduZWQgY2hhciAqcDE7Ci0JdW5zaWduZWQgY2hhciAqcDI7Ci0JdW5zaWduZWQgY2hhciBjaDsKLQlpbnQgYTsKLQlpbnQgYjsKLQlpbnQgbnVtX2luc3RydWN0aW9ucyA9IDA7Ci0KLQlhID0gKHVuc2lnbmVkIGNoYXIpKmNvZGUrKzsKLQlhIHw9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKysgPDwgODsKLQlhID0gKGludClTSE9SVChhKTsKLQkKLQlwMSA9IGNvZGUgKyBhICsgMzsgLyogc2tpcCB0aGUgZmFpbHVyZV9qdW1wICovCi0JLyogQ2hlY2sgdGhhdCB0aGUganVtcCBpcyB3aXRoaW4gdGhlIHBhdHRlcm4gKi8KLQlpZiAocDE8YnVmcC0+YnVmZmVyIHx8IGJ1ZnAtPmJ1ZmZlcitidWZwLT51c2VkPHAxKQotCSAgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJSZWdleCBWTSBqdW1wIG91dCBvZiBib3VuZHMgKGZhaWx1cmVfanVtcCBvcHQpIik7Ci0JICAgIHJldHVybiAwOwotCSAgfQotCQotCWFzc2VydChwMVstM10gPT0gQ2ZhaWx1cmVfanVtcCk7Ci0JcDIgPSBjb2RlOwotCS8qIHAxIHBvaW50cyBpbnNpZGUgbG9vcCwgcDIgcG9pbnRzIHRvIGFmdGVyIGxvb3AgKi8KLQlpZiAoIXJlX2RvX2NvbXBpbGVfZmFzdG1hcChidWZwLT5idWZmZXIsIGJ1ZnAtPnVzZWQsCi0JCQkJICAgKGludCkocDIgLSBidWZwLT5idWZmZXIpLAotCQkJCSAgICZjYW5fYmVfbnVsbCwgbWFwKSkKLQkJZ290byBtYWtlX25vcm1hbF9qdW1wOwotCQotCS8qIElmIHdlIG1pZ2h0IGludHJvZHVjZSBhIG5ldyB1cGRhdGUgcG9pbnQgaW5zaWRlIHRoZQotCSAqIGxvb3AsIHdlIGNhbid0IG9wdGltaXplIGJlY2F1c2UgdGhlbiB1cGRhdGVfanVtcCB3b3VsZAotCSAqIHVwZGF0ZSBhIHdyb25nIGZhaWx1cmUgcG9pbnQuICBUaHVzIHdlIGhhdmUgdG8gYmUKLQkgKiBxdWl0ZSBjYXJlZnVsIGhlcmUuCi0JICovCi0JCi0JLyogbG9vcCB1bnRpbCB3ZSBmaW5kIHNvbWV0aGluZyB0aGF0IGNvbnN1bWVzIGEgY2hhcmFjdGVyICovCi0gIGxvb3BfcDE6Ci0JbnVtX2luc3RydWN0aW9ucysrOwotCXN3aXRjaCAoKnAxKyspCi0JewotCWNhc2UgQ2JvbDoKLQljYXNlIENlb2w6Ci0JY2FzZSBDYmVnYnVmOgotCWNhc2UgQ2VuZGJ1ZjoKLQljYXNlIEN3b3JkYmVnOgotCWNhc2UgQ3dvcmRlbmQ6Ci0JY2FzZSBDd29yZGJvdW5kOgotCWNhc2UgQ25vdHdvcmRib3VuZDoKLQl7Ci0JCWdvdG8gbG9vcF9wMTsKLQl9Ci0JY2FzZSBDc3RhcnRfbWVtb3J5OgotCWNhc2UgQ2VuZF9tZW1vcnk6Ci0JewotCQlwMSsrOwotCQlnb3RvIGxvb3BfcDE7Ci0JfQotCWNhc2UgQ2V4YWN0OgotCXsKLQkJY2ggPSAodW5zaWduZWQgY2hhcikqcDErKzsKLQkJaWYgKG1hcFsoaW50KWNoXSkKLQkJCWdvdG8gbWFrZV9ub3JtYWxfanVtcDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQ2FueWNoYXI6Ci0JewotCQlmb3IgKGIgPSAwOyBiIDwgMjU2OyBiKyspCi0JCQlpZiAoYiAhPSAnXG4nICYmIG1hcFtiXSkKLQkJCQlnb3RvIG1ha2Vfbm9ybWFsX2p1bXA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIENzZXQ6Ci0JewotCQlmb3IgKGIgPSAwOyBiIDwgMjU2OyBiKyspCi0JCQlpZiAoKHAxW2IgPj4gM10gJiAoMSA8PCAoYiAmIDcpKSkgJiYgbWFwW2JdKQotCQkJCWdvdG8gbWFrZV9ub3JtYWxfanVtcDsKLQkJcDEgKz0gMjU2Lzg7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCXsKLQkJZ290byBtYWtlX25vcm1hbF9qdW1wOwotCX0KLQl9Ci0JLyogbm93IHdlIGtub3cgdGhhdCB3ZSBjYW4ndCBiYWNrdHJhY2suICovCi0Jd2hpbGUgKHAxICE9IHAyIC0gMykKLQl7Ci0JCW51bV9pbnN0cnVjdGlvbnMrKzsKLQkJc3dpdGNoICgqcDErKykKLQkJewotCQljYXNlIENlbmQ6Ci0JCXsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgQ2JvbDoKLQkJY2FzZSBDZW9sOgotCQljYXNlIENhbnljaGFyOgotCQljYXNlIENiZWdidWY6Ci0JCWNhc2UgQ2VuZGJ1ZjoKLQkJY2FzZSBDd29yZGJlZzoKLQkJY2FzZSBDd29yZGVuZDoKLQkJY2FzZSBDd29yZGJvdW5kOgotCQljYXNlIENub3R3b3JkYm91bmQ6Ci0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQ3NldDoKLQkJewotCQkJcDEgKz0gMjU2Lzg7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENleGFjdDoKLQkJY2FzZSBDc3RhcnRfbWVtb3J5OgotCQljYXNlIENlbmRfbWVtb3J5OgotCQljYXNlIENtYXRjaF9tZW1vcnk6Ci0JCWNhc2UgQ3N5bnRheHNwZWM6Ci0JCWNhc2UgQ25vdHN5bnRheHNwZWM6Ci0JCXsKLQkJCXAxKys7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENqdW1wOgotCQljYXNlIENzdGFyX2p1bXA6Ci0JCWNhc2UgQ2ZhaWx1cmVfanVtcDoKLQkJY2FzZSBDdXBkYXRlX2ZhaWx1cmVfanVtcDoKLQkJY2FzZSBDZHVtbXlfZmFpbHVyZV9qdW1wOgotCQl7Ci0JCQlnb3RvIG1ha2Vfbm9ybWFsX2p1bXA7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJfQotCX0KLQkKLQkvKiBtYWtlX3VwZGF0ZV9qdW1wOiAqLwotCWNvZGUgLT0gMzsKLQlhICs9IDM7ICAvKiBqdW1wIHRvIGFmdGVyIHRoZSBDZmFpbHVyZV9qdW1wICovCi0JY29kZVswXSA9IEN1cGRhdGVfZmFpbHVyZV9qdW1wOwotCWNvZGVbMV0gPSBhICYgMHhmZjsKLQljb2RlWzJdID0gYSA+PiA4OwotCWlmIChudW1faW5zdHJ1Y3Rpb25zID4gMSkKLQkJcmV0dXJuIDE7Ci0JYXNzZXJ0KG51bV9pbnN0cnVjdGlvbnMgPT0gMSk7Ci0JLyogaWYgdGhlIG9ubHkgaW5zdHJ1Y3Rpb24gbWF0Y2hlcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIHdlIGNhbiBkbwotCSAqIGJldHRlciAqLwotCXAxID0gY29kZSArIDMgKyBhOyAgIC8qIHN0YXJ0IG9mIHNvbGUgaW5zdHJ1Y3Rpb24gKi8KLQlpZiAoKnAxID09IENzZXQgfHwgKnAxID09IENleGFjdCB8fCAqcDEgPT0gQ2FueWNoYXIgfHwKLQkgICAgKnAxID09IENzeW50YXhzcGVjIHx8ICpwMSA9PSBDbm90c3ludGF4c3BlYykKLQkJY29kZVswXSA9IENyZXBlYXQxOwotCXJldHVybiAxOwotCQotICBtYWtlX25vcm1hbF9qdW1wOgotCWNvZGUgLT0gMzsKLQkqY29kZSA9IENqdW1wOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHJlX29wdGltaXplKHJlZ2V4cF90IGJ1ZnApCi17Ci0JdW5zaWduZWQgY2hhciAqY29kZTsKLQkKLQljb2RlID0gYnVmcC0+YnVmZmVyOwotCQotCXdoaWxlKDEpCi0JewotCQlzd2l0Y2ggKCpjb2RlKyspCi0JCXsKLQkJY2FzZSBDZW5kOgotCQl7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQljYXNlIENhbnljaGFyOgotCQljYXNlIENib2w6Ci0JCWNhc2UgQ2VvbDoKLQkJY2FzZSBDYmVnYnVmOgotCQljYXNlIENlbmRidWY6Ci0JCWNhc2UgQ3dvcmRiZWc6Ci0JCWNhc2UgQ3dvcmRlbmQ6Ci0JCWNhc2UgQ3dvcmRib3VuZDoKLQkJY2FzZSBDbm90d29yZGJvdW5kOgotCQl7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENzZXQ6Ci0JCXsKLQkJCWNvZGUgKz0gMjU2Lzg7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENleGFjdDoKLQkJY2FzZSBDc3RhcnRfbWVtb3J5OgotCQljYXNlIENlbmRfbWVtb3J5OgotCQljYXNlIENtYXRjaF9tZW1vcnk6Ci0JCWNhc2UgQ3N5bnRheHNwZWM6Ci0JCWNhc2UgQ25vdHN5bnRheHNwZWM6Ci0JCXsKLQkJCWNvZGUrKzsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQ3N0YXJfanVtcDoKLQkJewotCQkJaWYgKCFyZV9vcHRpbWl6ZV9zdGFyX2p1bXAoYnVmcCwgY29kZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkvKiBmYWxsIHRocm91Z2ggKi8KLQkJfQotCQljYXNlIEN1cGRhdGVfZmFpbHVyZV9qdW1wOgotCQljYXNlIENqdW1wOgotCQljYXNlIENkdW1teV9mYWlsdXJlX2p1bXA6Ci0JCWNhc2UgQ2ZhaWx1cmVfanVtcDoKLQkJY2FzZSBDcmVwZWF0MToKLQkJewotCQkJY29kZSArPSAyOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJfQotCX0KLX0KLQotI2RlZmluZSBORVhUQ0hBUih2YXIpIFwKLXsgXAotCWlmIChwb3MgPj0gc2l6ZSkgXAotCQlnb3RvIGVuZHNfcHJlbWF0dXJlbHk7IFwKLQkodmFyKSA9IHJlZ2V4W3Bvc107IFwKLQlwb3MrKzsgXAotfQotCi0jZGVmaW5lIEFMTE9DKGFtb3VudCkgXAoteyBcCi0JICBpZiAocGF0dGVybl9vZmZzZXQrKGFtb3VudCkgPiBhbGxvYykgXAotCSAgeyBcCi0JCSAgYWxsb2MgKz0gMjU2ICsgKGFtb3VudCk7IFwKLQkJICBwYXR0ZXJuID0gcmVhbGxvYyhwYXR0ZXJuLCBhbGxvYyk7IFwKLQkJICBpZiAoIXBhdHRlcm4pIFwKLQkJCSAgZ290byBvdXRfb2ZfbWVtb3J5OyBcCi0JICB9IFwKLX0KLQotI2RlZmluZSBTVE9SRShjaCkgcGF0dGVybltwYXR0ZXJuX29mZnNldCsrXSA9IChjaCkKLQotI2RlZmluZSBDVVJSRU5UX0xFVkVMX1NUQVJUIChzdGFydHNbc3RhcnRzX2Jhc2UgKyBjdXJyZW50X2xldmVsXSkKLQotI2RlZmluZSBTRVRfTEVWRUxfU1RBUlQgc3RhcnRzW3N0YXJ0c19iYXNlICsgY3VycmVudF9sZXZlbF0gPSBwYXR0ZXJuX29mZnNldAotCi0jZGVmaW5lIFBVU0hfTEVWRUxfU1RBUlRTIFwKLWlmIChzdGFydHNfYmFzZSA8IChNQVhfTkVTVElORy0xKSpOVU1fTEVWRUxTKSBcCi0Jc3RhcnRzX2Jhc2UgKz0gTlVNX0xFVkVMUzsgXAotZWxzZSBcCi0JZ290byB0b29fY29tcGxleCBcCi0KLSNkZWZpbmUgUE9QX0xFVkVMX1NUQVJUUyBzdGFydHNfYmFzZSAtPSBOVU1fTEVWRUxTCi0KLSNkZWZpbmUgUFVUX0FERFIob2Zmc2V0LGFkZHIpIFwKLXsgXAotCWludCBkaXNwID0gKGFkZHIpIC0gKG9mZnNldCkgLSAyOyBcCi0JcGF0dGVyblsob2Zmc2V0KV0gPSBkaXNwICYgMHhmZjsgXAotCXBhdHRlcm5bKG9mZnNldCkrMV0gPSAoZGlzcD4+OCkgJiAweGZmOyBcCi19Ci0KLSNkZWZpbmUgSU5TRVJUX0pVTVAocG9zLHR5cGUsYWRkcikgXAoteyBcCi0JaW50IGEsIHAgPSAocG9zKSwgdCA9ICh0eXBlKSwgYWQgPSAoYWRkcik7IFwKLQlmb3IgKGEgPSBwYXR0ZXJuX29mZnNldCAtIDE7IGEgPj0gcDsgYS0tKSBcCi0JCXBhdHRlcm5bYSArIDNdID0gcGF0dGVyblthXTsgXAotCXBhdHRlcm5bcF0gPSB0OyBcCi0JUFVUX0FERFIocCsxLGFkKTsgXAotCXBhdHRlcm5fb2Zmc2V0ICs9IDM7IFwKLX0KLQotI2RlZmluZSBTRVRCSVQoYnVmLG9mZnNldCxiaXQpIChidWYpWyhvZmZzZXQpKyhiaXQpLzhdIHw9ICgxPDwoKGJpdCkgJiA3KSkKLQotI2RlZmluZSBTRVRfRklFTERTIFwKLXsgXAotCWJ1ZnAtPmFsbG9jYXRlZCA9IGFsbG9jOyBcCi0JYnVmcC0+YnVmZmVyID0gcGF0dGVybjsgXAotCWJ1ZnAtPnVzZWQgPSBwYXR0ZXJuX29mZnNldDsgXAotfQotICAgIAotI2RlZmluZSBHRVRIRVgodmFyKSBcCi17IFwKLQl1bnNpZ25lZCBjaGFyIGdldGhleF9jaCwgZ2V0aGV4X3ZhbHVlOyBcCi0JTkVYVENIQVIoZ2V0aGV4X2NoKTsgXAotCWdldGhleF92YWx1ZSA9IGhleF9jaGFyX3RvX2RlY2ltYWwoZ2V0aGV4X2NoKTsgXAotCWlmIChnZXRoZXhfdmFsdWUgPT0gMTYpIFwKLQkJZ290byBoZXhfZXJyb3I7IFwKLQlORVhUQ0hBUihnZXRoZXhfY2gpOyBcCi0JZ2V0aGV4X2NoID0gaGV4X2NoYXJfdG9fZGVjaW1hbChnZXRoZXhfY2gpOyBcCi0JaWYgKGdldGhleF9jaCA9PSAxNikgXAotCQlnb3RvIGhleF9lcnJvcjsgXAotCSh2YXIpID0gZ2V0aGV4X3ZhbHVlICogMTYgKyBnZXRoZXhfY2g7IFwKLX0KLQotI2RlZmluZSBBTlNJX1RSQU5TTEFURShjaCkgXAoteyBcCi0Jc3dpdGNoIChjaCkgXAotCXsgXAotCWNhc2UgJ2EnOiBcCi0JY2FzZSAnQSc6IFwKLQl7IFwKLQkJY2ggPSA3OyAvKiBhdWRpYmxlIGJlbGwgKi8gXAotCQlicmVhazsgXAotCX0gXAotCWNhc2UgJ2InOiBcCi0JY2FzZSAnQic6IFwKLQl7IFwKLQkJY2ggPSA4OyAvKiBiYWNrc3BhY2UgKi8gXAotCQlicmVhazsgXAotCX0gXAotCWNhc2UgJ2YnOiBcCi0JY2FzZSAnRic6IFwKLQl7IFwKLQkJY2ggPSAxMjsgLyogZm9ybSBmZWVkICovIFwKLQkJYnJlYWs7IFwKLQl9IFwKLQljYXNlICduJzogXAotCWNhc2UgJ04nOiBcCi0JeyBcCi0JCWNoID0gMTA7IC8qIGxpbmUgZmVlZCAqLyBcCi0JCWJyZWFrOyBcCi0JfSBcCi0JY2FzZSAncic6IFwKLQljYXNlICdSJzogXAotCXsgXAotCQljaCA9IDEzOyAvKiBjYXJyaWFnZSByZXR1cm4gKi8gXAotCQlicmVhazsgXAotCX0gXAotCWNhc2UgJ3QnOiBcCi0JY2FzZSAnVCc6IFwKLQl7IFwKLQkgICAgICBjaCA9IDk7IC8qIHRhYiAqLyBcCi0JICAgICAgYnJlYWs7IFwKLQl9IFwKLQljYXNlICd2JzogXAotCWNhc2UgJ1YnOiBcCi0JeyBcCi0JCWNoID0gMTE7IC8qIHZlcnRpY2FsIHRhYiAqLyBcCi0JCWJyZWFrOyBcCi0JfSBcCi0JY2FzZSAneCc6IC8qIGhleCBjb2RlICovIFwKLQljYXNlICdYJzogXAotCXsgXAotCQlHRVRIRVgoY2gpOyBcCi0JCWJyZWFrOyBcCi0JfSBcCi0JZGVmYXVsdDogXAotCXsgXAotCQkvKiBvdGhlciBjaGFyYWN0ZXJzIHBhc3NlZCB0aHJvdWdoICovIFwKLQkJaWYgKHRyYW5zbGF0ZSkgXAotCQkJY2ggPSB0cmFuc2xhdGVbKHVuc2lnbmVkIGNoYXIpY2hdOyBcCi0JCWJyZWFrOyBcCi0JfSBcCi0JfSBcCi19Ci0KLWNoYXIgKnJlX2NvbXBpbGVfcGF0dGVybih1bnNpZ25lZCBjaGFyICpyZWdleCwgaW50IHNpemUsIHJlZ2V4cF90IGJ1ZnApCi17Ci0JaW50IGE7Ci0JaW50IHBvczsKLQlpbnQgb3A7Ci0JaW50IGN1cnJlbnRfbGV2ZWw7Ci0JaW50IGxldmVsOwotCWludCBvcGNvZGU7Ci0JaW50IHBhdHRlcm5fb2Zmc2V0ID0gMCwgYWxsb2M7Ci0JaW50IHN0YXJ0c1tOVU1fTEVWRUxTICogTUFYX05FU1RJTkddOwotCWludCBzdGFydHNfYmFzZTsKLQlpbnQgZnV0dXJlX2p1bXBzW01BWF9ORVNUSU5HXTsKLQlpbnQgbnVtX2p1bXBzOwotCXVuc2lnbmVkIGNoYXIgY2ggPSAnXDAnOwotCXVuc2lnbmVkIGNoYXIgKnBhdHRlcm47Ci0JdW5zaWduZWQgY2hhciAqdHJhbnNsYXRlOwotCWludCBuZXh0X3JlZ2lzdGVyOwotCWludCBwYXJlbl9kZXB0aDsKLQlpbnQgbnVtX29wZW5fcmVnaXN0ZXJzOwotCWludCBvcGVuX3JlZ2lzdGVyc1tSRV9OUkVHU107Ci0JaW50IGJlZ2lubmluZ19jb250ZXh0OwotCQotCWlmICghcmVfY29tcGlsZV9pbml0aWFsaXplZCkKLQkJcmVfY29tcGlsZV9pbml0aWFsaXplKCk7Ci0JYnVmcC0+dXNlZCA9IDA7Ci0JYnVmcC0+ZmFzdG1hcF9hY2N1cmF0ZSA9IDA7Ci0JYnVmcC0+dXNlc19yZWdpc3RlcnMgPSAxOwotCWJ1ZnAtPm51bV9yZWdpc3RlcnMgPSAxOwotCXRyYW5zbGF0ZSA9IGJ1ZnAtPnRyYW5zbGF0ZTsKLQlwYXR0ZXJuID0gYnVmcC0+YnVmZmVyOwotCWFsbG9jID0gYnVmcC0+YWxsb2NhdGVkOwotCWlmIChhbGxvYyA9PSAwIHx8IHBhdHRlcm4gPT0gTlVMTCkKLQl7Ci0JCWFsbG9jID0gMjU2OwotCQlwYXR0ZXJuID0gbWFsbG9jKGFsbG9jKTsKLQkJaWYgKCFwYXR0ZXJuKQotCQkJZ290byBvdXRfb2ZfbWVtb3J5OwotCX0KLQlwYXR0ZXJuX29mZnNldCA9IDA7Ci0Jc3RhcnRzX2Jhc2UgPSAwOwotCW51bV9qdW1wcyA9IDA7Ci0JY3VycmVudF9sZXZlbCA9IDA7Ci0JU0VUX0xFVkVMX1NUQVJUOwotCW51bV9vcGVuX3JlZ2lzdGVycyA9IDA7Ci0JbmV4dF9yZWdpc3RlciA9IDE7Ci0JcGFyZW5fZGVwdGggPSAwOwotCWJlZ2lubmluZ19jb250ZXh0ID0gMTsKLQlvcCA9IC0xOwotCS8qIHdlIHVzZSBSZW5kIGR1bW15IHRvIGVuc3VyZSB0aGF0IHBlbmRpbmcganVtcHMgYXJlIHVwZGF0ZWQKLQkgICAoZHVlIHRvIGxvdyBwcmlvcml0eSBvZiBSZW5kKSBiZWZvcmUgZXhpdGluZyB0aGUgbG9vcC4gKi8KLQlwb3MgPSAwOwotCXdoaWxlIChvcCAhPSBSZW5kKQotCXsKLQkJaWYgKHBvcyA+PSBzaXplKQotCQkJb3AgPSBSZW5kOwotCQllbHNlCi0JCXsKLQkJCU5FWFRDSEFSKGNoKTsKLQkJCWlmICh0cmFuc2xhdGUpCi0JCQkJY2ggPSB0cmFuc2xhdGVbKHVuc2lnbmVkIGNoYXIpY2hdOwotCQkJb3AgPSByZWdleHBfcGxhaW5fb3BzWyh1bnNpZ25lZCBjaGFyKWNoXTsKLQkJCWlmIChvcCA9PSBScXVvdGUpCi0JCQl7Ci0JCQkJTkVYVENIQVIoY2gpOwotCQkJCW9wID0gcmVnZXhwX3F1b3RlZF9vcHNbKHVuc2lnbmVkIGNoYXIpY2hdOwotCQkJCWlmIChvcCA9PSBSbm9ybWFsICYmIHJlZ2V4cF9hbnNpX3NlcXVlbmNlcykKLQkJCQkJQU5TSV9UUkFOU0xBVEUoY2gpOwotCQkJfQotCQl9Ci0JCWxldmVsID0gcmVnZXhwX3ByZWNlZGVuY2VzW29wXTsKLQkJLyogcHJpbnRmKCJjaD0nJWMnIG9wPSVkIGxldmVsPSVkIGN1cnJlbnRfbGV2ZWw9JWQKLQkJICAgY3VybGV2c3RhcnQ9JWRcbiIsIGNoLCBvcCwgbGV2ZWwsIGN1cnJlbnRfbGV2ZWwsCi0JCSAgIENVUlJFTlRfTEVWRUxfU1RBUlQpOyAqLwotCQlpZiAobGV2ZWwgPiBjdXJyZW50X2xldmVsKQotCQl7Ci0JCQlmb3IgKGN1cnJlbnRfbGV2ZWwrKzsgY3VycmVudF9sZXZlbCA8IGxldmVsOyBjdXJyZW50X2xldmVsKyspCi0JCQkJU0VUX0xFVkVMX1NUQVJUOwotCQkJU0VUX0xFVkVMX1NUQVJUOwotCQl9Ci0JCWVsc2UKLQkJCWlmIChsZXZlbCA8IGN1cnJlbnRfbGV2ZWwpCi0JCQl7Ci0JCQkJY3VycmVudF9sZXZlbCA9IGxldmVsOwotCQkJCWZvciAoO251bV9qdW1wcyA+IDAgJiYKLQkJCQkJICAgICBmdXR1cmVfanVtcHNbbnVtX2p1bXBzLTFdID49IENVUlJFTlRfTEVWRUxfU1RBUlQ7Ci0JCQkJICAgICBudW1fanVtcHMtLSkKLQkJCQkJUFVUX0FERFIoZnV0dXJlX2p1bXBzW251bV9qdW1wcy0xXSwgcGF0dGVybl9vZmZzZXQpOwotCQkJfQotCQlzd2l0Y2ggKG9wKQotCQl7Ci0JCWNhc2UgUmVuZDoKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSbm9ybWFsOgotCQl7Ci0JCSAgbm9ybWFsX2NoYXI6Ci0JCQlvcGNvZGUgPSBDZXhhY3Q7Ci0JCSAgc3RvcmVfb3Bjb2RlX2FuZF9hcmc6IC8qIG9wY29kZSAmIGNoIG11c3QgYmUgc2V0ICovCi0JCQlTRVRfTEVWRUxfU1RBUlQ7Ci0JCQlBTExPQygyKTsKLQkJCVNUT1JFKG9wY29kZSk7Ci0JCQlTVE9SRShjaCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFJhbnljaGFyOgotCQl7Ci0JCQlvcGNvZGUgPSBDYW55Y2hhcjsKLQkJICBzdG9yZV9vcGNvZGU6Ci0JCQlTRVRfTEVWRUxfU1RBUlQ7Ci0JCQlBTExPQygxKTsKLQkJCVNUT1JFKG9wY29kZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFJxdW90ZToKLQkJewotCQkJUHlfRmF0YWxFcnJvcigiUnF1b3RlIik7Ci0JCQkvKk5PVFJFQUNIRUQqLwotCQl9Ci0JCWNhc2UgUmJvbDoKLQkJewotCQkJaWYgKCFiZWdpbm5pbmdfY29udGV4dCkgewotCQkJCWlmIChyZWdleHBfY29udGV4dF9pbmRlcF9vcHMpCi0JCQkJCWdvdG8gb3BfZXJyb3I7Ci0JCQkJZWxzZQotCQkJCQlnb3RvIG5vcm1hbF9jaGFyOwotCQkJfQotCQkJb3Bjb2RlID0gQ2JvbDsKLQkJCWdvdG8gc3RvcmVfb3Bjb2RlOwotCQl9Ci0JCWNhc2UgUmVvbDoKLQkJewotCQkJaWYgKCEoKHBvcyA+PSBzaXplKSB8fAotCQkJICAgICAgKChyZWdleHBfc3ludGF4ICYgUkVfTk9fQktfVkJBUikgPwotCQkJICAgICAgIChyZWdleFtwb3NdID09ICdcMTc0JykgOgotCQkJICAgICAgIChwb3MrMSA8IHNpemUgJiYgcmVnZXhbcG9zXSA9PSAnXDEzNCcgJiYKLQkJCQlyZWdleFtwb3MrMV0gPT0gJ1wxNzQnKSkgfHwKLQkJCSAgICAgICgocmVnZXhwX3N5bnRheCAmIFJFX05PX0JLX1BBUkVOUyk/Ci0JCQkgICAgICAgKHJlZ2V4W3Bvc10gPT0gJyknKToKLQkJCSAgICAgICAocG9zKzEgPCBzaXplICYmIHJlZ2V4W3Bvc10gPT0gJ1wxMzQnICYmCi0JCQkJcmVnZXhbcG9zKzFdID09ICcpJykpKSkgewotCQkJCWlmIChyZWdleHBfY29udGV4dF9pbmRlcF9vcHMpCi0JCQkJCWdvdG8gb3BfZXJyb3I7Ci0JCQkJZWxzZQotCQkJCQlnb3RvIG5vcm1hbF9jaGFyOwotCQkJfQotCQkJb3Bjb2RlID0gQ2VvbDsKLQkJCWdvdG8gc3RvcmVfb3Bjb2RlOwotCQkJLyogTk9UUkVBQ0hFRCAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSb3B0aW9uYWw6Ci0JCXsKLQkJCWlmIChiZWdpbm5pbmdfY29udGV4dCkgewotCQkJCWlmIChyZWdleHBfY29udGV4dF9pbmRlcF9vcHMpCi0JCQkJCWdvdG8gb3BfZXJyb3I7Ci0JCQkJZWxzZQotCQkJCQlnb3RvIG5vcm1hbF9jaGFyOwotCQkJfQotCQkJaWYgKENVUlJFTlRfTEVWRUxfU1RBUlQgPT0gcGF0dGVybl9vZmZzZXQpCi0JCQkJYnJlYWs7IC8qIGlnbm9yZSBlbXB0eSBwYXR0ZXJucyBmb3IgPyAqLwotCQkJQUxMT0MoMyk7Ci0JCQlJTlNFUlRfSlVNUChDVVJSRU5UX0xFVkVMX1NUQVJULCBDZmFpbHVyZV9qdW1wLAotCQkJCSAgICBwYXR0ZXJuX29mZnNldCArIDMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSc3RhcjoKLQkJY2FzZSBScGx1czoKLQkJewotCQkJaWYgKGJlZ2lubmluZ19jb250ZXh0KSB7Ci0JCQkJaWYgKHJlZ2V4cF9jb250ZXh0X2luZGVwX29wcykKLQkJCQkJZ290byBvcF9lcnJvcjsKLQkJCQllbHNlCi0JCQkJCWdvdG8gbm9ybWFsX2NoYXI7Ci0JCQl9Ci0JCQlpZiAoQ1VSUkVOVF9MRVZFTF9TVEFSVCA9PSBwYXR0ZXJuX29mZnNldCkKLQkJCQlicmVhazsgLyogaWdub3JlIGVtcHR5IHBhdHRlcm5zIGZvciArIGFuZCAqICovCi0JCQlBTExPQyg5KTsKLQkJCUlOU0VSVF9KVU1QKENVUlJFTlRfTEVWRUxfU1RBUlQsIENmYWlsdXJlX2p1bXAsCi0JCQkJICAgIHBhdHRlcm5fb2Zmc2V0ICsgNik7Ci0JCQlJTlNFUlRfSlVNUChwYXR0ZXJuX29mZnNldCwgQ3N0YXJfanVtcCwgQ1VSUkVOVF9MRVZFTF9TVEFSVCk7Ci0JCQlpZiAob3AgPT0gUnBsdXMpICAvKiBqdW1wIG92ZXIgaW5pdGlhbCBmYWlsdXJlX2p1bXAgKi8KLQkJCQlJTlNFUlRfSlVNUChDVVJSRU5UX0xFVkVMX1NUQVJULCBDZHVtbXlfZmFpbHVyZV9qdW1wLAotCQkJCQkgICAgQ1VSUkVOVF9MRVZFTF9TVEFSVCArIDYpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSb3I6Ci0JCXsKLQkJCUFMTE9DKDYpOwotCQkJSU5TRVJUX0pVTVAoQ1VSUkVOVF9MRVZFTF9TVEFSVCwgQ2ZhaWx1cmVfanVtcCwKLQkJCQkgICAgcGF0dGVybl9vZmZzZXQgKyA2KTsKLQkJCWlmIChudW1fanVtcHMgPj0gTUFYX05FU1RJTkcpCi0JCQkJZ290byB0b29fY29tcGxleDsKLQkJCVNUT1JFKENqdW1wKTsKLQkJCWZ1dHVyZV9qdW1wc1tudW1fanVtcHMrK10gPSBwYXR0ZXJuX29mZnNldDsKLQkJCVNUT1JFKDApOwotCQkJU1RPUkUoMCk7Ci0JCQlTRVRfTEVWRUxfU1RBUlQ7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFJvcGVucGFyOgotCQl7Ci0JCQlTRVRfTEVWRUxfU1RBUlQ7Ci0JCQlpZiAobmV4dF9yZWdpc3RlciA8IFJFX05SRUdTKQotCQkJewotCQkJCWJ1ZnAtPnVzZXNfcmVnaXN0ZXJzID0gMTsKLQkJCQlBTExPQygyKTsKLQkJCQlTVE9SRShDc3RhcnRfbWVtb3J5KTsKLQkJCQlTVE9SRShuZXh0X3JlZ2lzdGVyKTsKLQkJCQlvcGVuX3JlZ2lzdGVyc1tudW1fb3Blbl9yZWdpc3RlcnMrK10gPSBuZXh0X3JlZ2lzdGVyOwotCQkJCWJ1ZnAtPm51bV9yZWdpc3RlcnMrKzsKLQkJCQluZXh0X3JlZ2lzdGVyKys7Ci0JCQl9Ci0JCQlwYXJlbl9kZXB0aCsrOwotCQkJUFVTSF9MRVZFTF9TVEFSVFM7Ci0JCQljdXJyZW50X2xldmVsID0gMDsKLQkJCVNFVF9MRVZFTF9TVEFSVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUmNsb3NlcGFyOgotCQl7Ci0JCQlpZiAocGFyZW5fZGVwdGggPD0gMCkKLQkJCQlnb3RvIHBhcmVudGhlc2lzX2Vycm9yOwotCQkJUE9QX0xFVkVMX1NUQVJUUzsKLQkJCWN1cnJlbnRfbGV2ZWwgPSByZWdleHBfcHJlY2VkZW5jZXNbUm9wZW5wYXJdOwotCQkJcGFyZW5fZGVwdGgtLTsKLQkJCWlmIChwYXJlbl9kZXB0aCA8IG51bV9vcGVuX3JlZ2lzdGVycykKLQkJCXsKLQkJCQlidWZwLT51c2VzX3JlZ2lzdGVycyA9IDE7Ci0JCQkJQUxMT0MoMik7Ci0JCQkJU1RPUkUoQ2VuZF9tZW1vcnkpOwotCQkJCW51bV9vcGVuX3JlZ2lzdGVycy0tOwotCQkJCVNUT1JFKG9wZW5fcmVnaXN0ZXJzW251bV9vcGVuX3JlZ2lzdGVyc10pOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSbWVtb3J5OgotCQl7Ci0JCQlpZiAoY2ggPT0gJzAnKQotCQkJCWdvdG8gYmFkX21hdGNoX3JlZ2lzdGVyOwotCQkJYXNzZXJ0KGNoID49ICcwJyAmJiBjaCA8PSAnOScpOwotCQkJYnVmcC0+dXNlc19yZWdpc3RlcnMgPSAxOwotCQkJb3Bjb2RlID0gQ21hdGNoX21lbW9yeTsKLQkJCWNoIC09ICcwJzsKLQkJCWdvdG8gc3RvcmVfb3Bjb2RlX2FuZF9hcmc7Ci0JCX0KLQkJY2FzZSBSZXh0ZW5kZWRfbWVtb3J5OgotCQl7Ci0JCQlORVhUQ0hBUihjaCk7Ci0JCQlpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCi0JCQkJZ290byBiYWRfbWF0Y2hfcmVnaXN0ZXI7Ci0JCQlORVhUQ0hBUihhKTsKLQkJCWlmIChhIDwgJzAnIHx8IGEgPiAnOScpCi0JCQkJZ290byBiYWRfbWF0Y2hfcmVnaXN0ZXI7Ci0JCQljaCA9IDEwICogKGEgLSAnMCcpICsgY2ggLSAnMCc7Ci0JCQlpZiAoY2ggPT0gMCB8fCBjaCA+PSBSRV9OUkVHUykKLQkJCQlnb3RvIGJhZF9tYXRjaF9yZWdpc3RlcjsKLQkJCWJ1ZnAtPnVzZXNfcmVnaXN0ZXJzID0gMTsKLQkJCW9wY29kZSA9IENtYXRjaF9tZW1vcnk7Ci0JCQlnb3RvIHN0b3JlX29wY29kZV9hbmRfYXJnOwotCQl9Ci0JCWNhc2UgUm9wZW5zZXQ6Ci0JCXsKLQkJCWludCBjb21wbGVtZW50OwotCQkJaW50IHByZXY7Ci0JCQlpbnQgb2Zmc2V0OwotCQkJaW50IHJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0Y2hhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJU0VUX0xFVkVMX1NUQVJUOwotCQkJQUxMT0MoMSsyNTYvOCk7Ci0JCQlTVE9SRShDc2V0KTsKLQkJCW9mZnNldCA9IHBhdHRlcm5fb2Zmc2V0OwotCQkJZm9yIChhID0gMDsgYSA8IDI1Ni84OyBhKyspCi0JCQkJU1RPUkUoMCk7Ci0JCQlORVhUQ0hBUihjaCk7Ci0JCQlpZiAodHJhbnNsYXRlKQotCQkJCWNoID0gdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKWNoXTsKLQkJCWlmIChjaCA9PSAnXDEzNicpCi0JCQl7Ci0JCQkJY29tcGxlbWVudCA9IDE7Ci0JCQkJTkVYVENIQVIoY2gpOwotCQkJCWlmICh0cmFuc2xhdGUpCi0JCQkJCWNoID0gdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKWNoXTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljb21wbGVtZW50ID0gMDsKLQkJCXByZXYgPSAtMTsKLQkJCXJhbmdlID0gMDsKLQkJCWZpcnN0Y2hhciA9IDE7Ci0JCQl3aGlsZSAoY2ggIT0gJ1wxMzUnIHx8IGZpcnN0Y2hhcikKLQkJCXsKLQkJCQlmaXJzdGNoYXIgPSAwOwotCQkJCWlmIChyZWdleHBfYW5zaV9zZXF1ZW5jZXMgJiYgY2ggPT0gJ1wxMzQnKQotCQkJCXsKLQkJCQkJTkVYVENIQVIoY2gpOwotCQkJCQlBTlNJX1RSQU5TTEFURShjaCk7Ci0JCQkJfQotCQkJCWlmIChyYW5nZSkKLQkJCQl7Ci0JCQkJCWZvciAoYSA9IHByZXY7IGEgPD0gKGludCljaDsgYSsrKQotCQkJCQkJU0VUQklUKHBhdHRlcm4sIG9mZnNldCwgYSk7Ci0JCQkJCXByZXYgPSAtMTsKLQkJCQkJcmFuZ2UgPSAwOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWlmIChwcmV2ICE9IC0xICYmIGNoID09ICctJykKLQkJCQkJCXJhbmdlID0gMTsKLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlTRVRCSVQocGF0dGVybiwgb2Zmc2V0LCBjaCk7Ci0JCQkJCQlwcmV2ID0gY2g7Ci0JCQkJCX0KLQkJCQlORVhUQ0hBUihjaCk7Ci0JCQkJaWYgKHRyYW5zbGF0ZSkKLQkJCQkJY2ggPSB0cmFuc2xhdGVbKHVuc2lnbmVkIGNoYXIpY2hdOwotCQkJfQotCQkJaWYgKHJhbmdlKQotCQkJCVNFVEJJVChwYXR0ZXJuLCBvZmZzZXQsICctJyk7Ci0JCQlpZiAoY29tcGxlbWVudCkKLQkJCXsKLQkJCQlmb3IgKGEgPSAwOyBhIDwgMjU2Lzg7IGErKykKLQkJCQkJcGF0dGVybltvZmZzZXQrYV0gXj0gMHhmZjsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUmJlZ2J1ZjoKLQkJewotCQkJb3Bjb2RlID0gQ2JlZ2J1ZjsKLQkJCWdvdG8gc3RvcmVfb3Bjb2RlOwotCQl9Ci0JCWNhc2UgUmVuZGJ1ZjoKLQkJewotCQkJb3Bjb2RlID0gQ2VuZGJ1ZjsKLQkJCWdvdG8gc3RvcmVfb3Bjb2RlOwotCQl9Ci0JCWNhc2UgUndvcmRjaGFyOgotCQl7Ci0JCQlvcGNvZGUgPSBDc3ludGF4c3BlYzsKLQkJCWNoID0gU3dvcmQ7Ci0JCQlnb3RvIHN0b3JlX29wY29kZV9hbmRfYXJnOwotCQl9Ci0JCWNhc2UgUm5vdHdvcmRjaGFyOgotCQl7Ci0JCQlvcGNvZGUgPSBDbm90c3ludGF4c3BlYzsKLQkJCWNoID0gU3dvcmQ7Ci0JCQlnb3RvIHN0b3JlX29wY29kZV9hbmRfYXJnOwotCQl9Ci0JCWNhc2UgUndvcmRiZWc6Ci0JCXsKLQkJCW9wY29kZSA9IEN3b3JkYmVnOwotCQkJZ290byBzdG9yZV9vcGNvZGU7Ci0JCX0KLQkJY2FzZSBSd29yZGVuZDoKLQkJewotCQkJb3Bjb2RlID0gQ3dvcmRlbmQ7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJfQotCQljYXNlIFJ3b3JkYm91bmQ6Ci0JCXsKLQkJCW9wY29kZSA9IEN3b3JkYm91bmQ7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJfQotCQljYXNlIFJub3R3b3JkYm91bmQ6Ci0JCXsKLQkJCW9wY29kZSA9IENub3R3b3JkYm91bmQ7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJfQotCQlkZWZhdWx0OgotCQl7Ci0JCQlhYm9ydCgpOwotCQl9Ci0JCX0KLQkJYmVnaW5uaW5nX2NvbnRleHQgPSAob3AgPT0gUm9wZW5wYXIgfHwgb3AgPT0gUm9yKTsKLQl9Ci0JaWYgKHN0YXJ0c19iYXNlICE9IDApCi0JCWdvdG8gcGFyZW50aGVzaXNfZXJyb3I7Ci0JYXNzZXJ0KG51bV9qdW1wcyA9PSAwKTsKLQlBTExPQygxKTsKLQlTVE9SRShDZW5kKTsKLQlTRVRfRklFTERTOwotCWlmKCFyZV9vcHRpbWl6ZShidWZwKSkKLQkJcmV0dXJuICJPcHRpbWl6YXRpb24gZXJyb3IiOwotCXJldHVybiBOVUxMOwotCi0gIG9wX2Vycm9yOgotCVNFVF9GSUVMRFM7Ci0JcmV0dXJuICJCYWRseSBwbGFjZWQgc3BlY2lhbCBjaGFyYWN0ZXIiOwotCi0gIGJhZF9tYXRjaF9yZWdpc3RlcjoKLQlTRVRfRklFTERTOwotCXJldHVybiAiQmFkIG1hdGNoIHJlZ2lzdGVyIG51bWJlciI7Ci0gICAKLSAgaGV4X2Vycm9yOgotCVNFVF9GSUVMRFM7Ci0JcmV0dXJuICJCYWQgaGV4YWRlY2ltYWwgbnVtYmVyIjsKLSAgIAotICBwYXJlbnRoZXNpc19lcnJvcjoKLQlTRVRfRklFTERTOwotCXJldHVybiAiQmFkbHkgcGxhY2VkIHBhcmVudGhlc2lzIjsKLSAgIAotICBvdXRfb2ZfbWVtb3J5OgotCVNFVF9GSUVMRFM7Ci0JcmV0dXJuICJPdXQgb2YgbWVtb3J5IjsKLSAgIAotICBlbmRzX3ByZW1hdHVyZWx5OgotCVNFVF9GSUVMRFM7Ci0JcmV0dXJuICJSZWd1bGFyIGV4cHJlc3Npb24gZW5kcyBwcmVtYXR1cmVseSI7Ci0KLSAgdG9vX2NvbXBsZXg6Ci0JU0VUX0ZJRUxEUzsKLQlyZXR1cm4gIlJlZ3VsYXIgZXhwcmVzc2lvbiB0b28gY29tcGxleCI7Ci19Ci0KLSN1bmRlZiBDSEFSQVQKLSN1bmRlZiBORVhUQ0hBUgotI3VuZGVmIEdFVEhFWAotI3VuZGVmIEFMTE9DCi0jdW5kZWYgU1RPUkUKLSN1bmRlZiBDVVJSRU5UX0xFVkVMX1NUQVJUCi0jdW5kZWYgU0VUX0xFVkVMX1NUQVJUCi0jdW5kZWYgUFVTSF9MRVZFTF9TVEFSVFMKLSN1bmRlZiBQT1BfTEVWRUxfU1RBUlRTCi0jdW5kZWYgUFVUX0FERFIKLSN1bmRlZiBJTlNFUlRfSlVNUAotI3VuZGVmIFNFVEJJVAotI3VuZGVmIFNFVF9GSUVMRFMKLQotI2RlZmluZSBQUkVGRVRDSCBpZiAodGV4dCA9PSB0ZXh0ZW5kKSBnb3RvIGZhaWwKLQotI2RlZmluZSBORVhUQ0hBUih2YXIpIFwKLVBSRUZFVENIOyBcCi12YXIgPSAodW5zaWduZWQgY2hhcikqdGV4dCsrOyBcCi1pZiAodHJhbnNsYXRlKSBcCi0JdmFyID0gdHJhbnNsYXRlW3Zhcl0KLQotaW50IHJlX21hdGNoKHJlZ2V4cF90IGJ1ZnAsIHVuc2lnbmVkIGNoYXIgKnN0cmluZywgaW50IHNpemUsIGludCBwb3MsCi0gICAgICAgICAgICAgcmVnZXhwX3JlZ2lzdGVyc190IG9sZF9yZWdzKQotewotCXVuc2lnbmVkIGNoYXIgKmNvZGU7Ci0JdW5zaWduZWQgY2hhciAqdHJhbnNsYXRlOwotCXVuc2lnbmVkIGNoYXIgKnRleHQ7Ci0JdW5zaWduZWQgY2hhciAqdGV4dHN0YXJ0OwotCXVuc2lnbmVkIGNoYXIgKnRleHRlbmQ7Ci0JaW50IGE7Ci0JaW50IGI7Ci0JaW50IGNoOwotCWludCByZWc7Ci0JaW50IG1hdGNoX2VuZDsKLQl1bnNpZ25lZCBjaGFyICpyZWdzdGFydDsKLQl1bnNpZ25lZCBjaGFyICpyZWdlbmQ7Ci0JaW50IHJlZ3NpemU7Ci0JbWF0Y2hfc3RhdGUgc3RhdGU7Ci0gIAotCWFzc2VydChwb3MgPj0gMCAmJiBzaXplID49IDApOwotCWFzc2VydChwb3MgPD0gc2l6ZSk7Ci0gIAotCXRleHQgPSBzdHJpbmcgKyBwb3M7Ci0JdGV4dHN0YXJ0ID0gc3RyaW5nOwotCXRleHRlbmQgPSBzdHJpbmcgKyBzaXplOwotICAKLQljb2RlID0gYnVmcC0+YnVmZmVyOwotICAKLQl0cmFuc2xhdGUgPSBidWZwLT50cmFuc2xhdGU7Ci0gIAotCU5FV19TVEFURShzdGF0ZSwgYnVmcC0+bnVtX3JlZ2lzdGVycyk7Ci0KLSAgY29udGludWVfbWF0Y2hpbmc6Ci0Jc3dpdGNoICgqY29kZSsrKQotCXsKLQljYXNlIENlbmQ6Ci0JewotCQltYXRjaF9lbmQgPSB0ZXh0IC0gdGV4dHN0YXJ0OwotCQlpZiAob2xkX3JlZ3MpCi0JCXsKLQkJCW9sZF9yZWdzLT5zdGFydFswXSA9IHBvczsKLQkJCW9sZF9yZWdzLT5lbmRbMF0gPSBtYXRjaF9lbmQ7Ci0JCQlpZiAoIWJ1ZnAtPnVzZXNfcmVnaXN0ZXJzKQotCQkJewotCQkJCWZvciAoYSA9IDE7IGEgPCBSRV9OUkVHUzsgYSsrKQotCQkJCXsKLQkJCQkJb2xkX3JlZ3MtPnN0YXJ0W2FdID0gLTE7Ci0JCQkJCW9sZF9yZWdzLT5lbmRbYV0gPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZm9yIChhID0gMTsgYSA8IGJ1ZnAtPm51bV9yZWdpc3RlcnM7IGErKykKLQkJCQl7Ci0JCQkJCWlmICgoR0VUX1JFR19TVEFSVChzdGF0ZSwgYSkgPT0gTlVMTCkgfHwKLQkJCQkJICAgIChHRVRfUkVHX0VORChzdGF0ZSwgYSkgPT0gTlVMTCkpCi0JCQkJCXsKLQkJCQkJCW9sZF9yZWdzLT5zdGFydFthXSA9IC0xOwotCQkJCQkJb2xkX3JlZ3MtPmVuZFthXSA9IC0xOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJb2xkX3JlZ3MtPnN0YXJ0W2FdID0gR0VUX1JFR19TVEFSVChzdGF0ZSwgYSkgLSB0ZXh0c3RhcnQ7Ci0JCQkJCW9sZF9yZWdzLT5lbmRbYV0gPSBHRVRfUkVHX0VORChzdGF0ZSwgYSkgLSB0ZXh0c3RhcnQ7Ci0JCQkJfQotCQkJCWZvciAoOyBhIDwgUkVfTlJFR1M7IGErKykKLQkJCQl7Ci0JCQkJCW9sZF9yZWdzLT5zdGFydFthXSA9IC0xOwotCQkJCQlvbGRfcmVncy0+ZW5kW2FdID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUZSRUVfU1RBVEUoc3RhdGUpOwotCQlyZXR1cm4gbWF0Y2hfZW5kIC0gcG9zOwotCX0KLQljYXNlIENib2w6Ci0JewotCQlpZiAodGV4dCA9PSB0ZXh0c3RhcnQgfHwgdGV4dFstMV0gPT0gJ1xuJykKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDZW9sOgotCXsKLQkJaWYgKHRleHQgPT0gdGV4dGVuZCB8fCAqdGV4dCA9PSAnXG4nKQotCQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJZ290byBmYWlsOwotCX0KLQljYXNlIENzZXQ6Ci0JewotCQlORVhUQ0hBUihjaCk7Ci0JCWlmIChjb2RlW2NoLzhdICYgKDE8PChjaCAmIDcpKSkKLQkJewotCQkJY29kZSArPSAyNTYvODsKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCX0KLQkJZ290byBmYWlsOwotCX0KLQljYXNlIENleGFjdDoKLQl7Ci0JCU5FWFRDSEFSKGNoKTsKLQkJaWYgKGNoICE9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKyspCi0JCQlnb3RvIGZhaWw7Ci0JCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JfQotCWNhc2UgQ2FueWNoYXI6Ci0JewotCQlORVhUQ0hBUihjaCk7Ci0JCWlmIChjaCA9PSAnXG4nKQotCQkJZ290byBmYWlsOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENzdGFydF9tZW1vcnk6Ci0JewotCQlyZWcgPSAqY29kZSsrOwotCQlTRVRfUkVHX1NUQVJUKHN0YXRlLCByZWcsIHRleHQsIGdvdG8gZXJyb3IpOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENlbmRfbWVtb3J5OgotCXsKLQkJcmVnID0gKmNvZGUrKzsKLQkJU0VUX1JFR19FTkQoc3RhdGUsIHJlZywgdGV4dCwgZ290byBlcnJvcik7Ci0JCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JfQotCWNhc2UgQ21hdGNoX21lbW9yeToKLQl7Ci0JCXJlZyA9ICpjb2RlKys7Ci0JCXJlZ3N0YXJ0ID0gR0VUX1JFR19TVEFSVChzdGF0ZSwgcmVnKTsKLQkJcmVnZW5kID0gR0VUX1JFR19FTkQoc3RhdGUsIHJlZyk7Ci0JCWlmICgocmVnc3RhcnQgPT0gTlVMTCkgfHwgKHJlZ2VuZCA9PSBOVUxMKSkKLQkJCWdvdG8gZmFpbDsgIC8qIG9yIHNob3VsZCB3ZSBqdXN0IG1hdGNoIG5vdGhpbmc/ICovCi0JCXJlZ3NpemUgPSByZWdlbmQgLSByZWdzdGFydDsKLQotCQlpZiAocmVnc2l6ZSA+ICh0ZXh0ZW5kIC0gdGV4dCkpCi0JCQlnb3RvIGZhaWw7Ci0JCWlmKHRyYW5zbGF0ZSkKLQkJewotCQkJZm9yICg7IHJlZ3N0YXJ0IDwgcmVnZW5kOyByZWdzdGFydCsrLCB0ZXh0KyspCi0JCQkJaWYgKHRyYW5zbGF0ZVsqcmVnc3RhcnRdICE9IHRyYW5zbGF0ZVsqdGV4dF0pCi0JCQkJCWdvdG8gZmFpbDsKLQkJfQotCQllbHNlCi0JCQlmb3IgKDsgcmVnc3RhcnQgPCByZWdlbmQ7IHJlZ3N0YXJ0KyssIHRleHQrKykKLQkJCQlpZiAoKnJlZ3N0YXJ0ICE9ICp0ZXh0KQotCQkJCQlnb3RvIGZhaWw7Ci0JCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JfQotCWNhc2UgQ3VwZGF0ZV9mYWlsdXJlX2p1bXA6Ci0JewotCQlVUERBVEVfRkFJTFVSRShzdGF0ZSwgdGV4dCwgZ290byBlcnJvcik7Ci0JCS8qIGZhbGwgdG8gbmV4dCBjYXNlICovCi0JfQotCS8qIHRyZWF0IENzdGFyX2p1bXAganVzdCBsaWtlIENqdW1wIGlmIGl0IGhhc24ndCBiZWVuIG9wdGltaXplZCAqLwotCWNhc2UgQ3N0YXJfanVtcDoKLQljYXNlIENqdW1wOgotCXsKLQkJYSA9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKys7Ci0JCWEgfD0gKHVuc2lnbmVkIGNoYXIpKmNvZGUrKyA8PCA4OwotCQljb2RlICs9IChpbnQpU0hPUlQoYSk7Ci0JCWlmIChjb2RlPGJ1ZnAtPmJ1ZmZlciB8fCBidWZwLT5idWZmZXIrYnVmcC0+dXNlZDxjb2RlKSB7Ci0JCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiUmVnZXggVk0ganVtcCBvdXQgb2YgYm91bmRzIChDanVtcCkiKTsKLQkJCUZSRUVfU1RBVEUoc3RhdGUpOwotICAgICAgICAgICAgCSAgICAgICAgcmV0dXJuIC0yOwotICAgICAgICAgCX0KLQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQl9Ci0JY2FzZSBDZHVtbXlfZmFpbHVyZV9qdW1wOgotCXsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpmYWlsdXJlZGVzdDsKLQkgIAotCQlhID0gKHVuc2lnbmVkIGNoYXIpKmNvZGUrKzsKLQkJYSB8PSAodW5zaWduZWQgY2hhcikqY29kZSsrIDw8IDg7Ci0JCWEgPSAoaW50KVNIT1JUKGEpOwotCQlhc3NlcnQoKmNvZGUgPT0gQ2ZhaWx1cmVfanVtcCk7Ci0JCWIgPSAodW5zaWduZWQgY2hhciljb2RlWzFdOwotCQliIHw9ICh1bnNpZ25lZCBjaGFyKWNvZGVbMl0gPDwgODsKLSAgICAgICAgICAgICAgICBmYWlsdXJlZGVzdCA9IGNvZGUgKyAoaW50KVNIT1JUKGIpICsgMzsKLQkJaWYgKGZhaWx1cmVkZXN0PGJ1ZnAtPmJ1ZmZlciB8fCBidWZwLT5idWZmZXIrYnVmcC0+dXNlZCA8IGZhaWx1cmVkZXN0KSB7Ci0JCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiUmVnZXggVk0ganVtcCBvdXQgb2YgYm91bmRzIChDZHVtbXlfZmFpbHVyZV9qdW1wIGZhaWx1cmVkZXN0KSIpOwotCQkJRlJFRV9TVEFURShzdGF0ZSk7Ci0gICAgICAgICAgICAJICAgICAgICByZXR1cm4gLTI7Ci0JCX0KLQkJUFVTSF9GQUlMVVJFKHN0YXRlLCBmYWlsdXJlZGVzdCwgTlVMTCwgZ290byBlcnJvcik7Ci0JCWNvZGUgKz0gYTsKLQkJaWYgKGNvZGU8YnVmcC0+YnVmZmVyIHx8IGJ1ZnAtPmJ1ZmZlcitidWZwLT51c2VkIDwgY29kZSkgewotCQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlJlZ2V4IFZNIGp1bXAgb3V0IG9mIGJvdW5kcyAoQ2R1bW15X2ZhaWx1cmVfanVtcCBjb2RlKSIpOwotCQkJRlJFRV9TVEFURShzdGF0ZSk7Ci0gICAgICAgICAgICAJICAgICAgICByZXR1cm4gLTI7Ci0gICAgICAgICAJfQotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENmYWlsdXJlX2p1bXA6Ci0JewotCQlhID0gKHVuc2lnbmVkIGNoYXIpKmNvZGUrKzsKLQkJYSB8PSAodW5zaWduZWQgY2hhcikqY29kZSsrIDw8IDg7Ci0JCWEgPSAoaW50KVNIT1JUKGEpOwotCQlpZiAoY29kZSthPGJ1ZnAtPmJ1ZmZlciB8fCBidWZwLT5idWZmZXIrYnVmcC0+dXNlZCA8IGNvZGUrYSkgewotCQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlJlZ2V4IFZNIGp1bXAgb3V0IG9mIGJvdW5kcyAoQ2ZhaWx1cmVfanVtcCkiKTsKLQkJCUZSRUVfU1RBVEUoc3RhdGUpOwotICAgICAgICAgICAgCSAgICAgICAgcmV0dXJuIC0yOwotICAgICAgICAgCX0KLQkJUFVTSF9GQUlMVVJFKHN0YXRlLCBjb2RlICsgYSwgdGV4dCwgZ290byBlcnJvcik7Ci0JCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JfQotCWNhc2UgQ3JlcGVhdDE6Ci0JewotCQl1bnNpZ25lZCBjaGFyICpwaW5zdDsKLQkJYSA9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKys7Ci0JCWEgfD0gKHVuc2lnbmVkIGNoYXIpKmNvZGUrKyA8PCA4OwotCQlhID0gKGludClTSE9SVChhKTsKLQkJcGluc3QgPSBjb2RlICsgYTsKLQkJaWYgKHBpbnN0PGJ1ZnAtPmJ1ZmZlciB8fCBidWZwLT5idWZmZXIrYnVmcC0+dXNlZDxwaW5zdCkgewotCQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlJlZ2V4IFZNIGp1bXAgb3V0IG9mIGJvdW5kcyAoQ3JlcGVhdDEpIik7Ci0JCQlGUkVFX1NUQVRFKHN0YXRlKTsKLSAgICAgICAgICAgIAkgICAgICAgIHJldHVybiAtMjsKLSAgICAgICAgIAl9Ci0JCS8qIHBpbnN0IGlzIHNvbGUgaW5zdHJ1Y3Rpb24gaW4gbG9vcCwgYW5kIGl0IG1hdGNoZXMgYQotCQkgKiBzaW5nbGUgY2hhcmFjdGVyLiAgU2luY2UgQ3JlcGVhdDEgd2FzIG9yaWdpbmFsbHkgYQotCQkgKiBDdXBkYXRlX2ZhaWx1cmVfanVtcCwgd2UgYWxzbyBrbm93IHRoYXQgYmFja3RyYWNraW5nCi0JCSAqIGlzIHVzZWxlc3M6IHNvIGxvbmcgYXMgdGhlIHNpbmdsZS1jaGFyYWN0ZXIKLQkJICogZXhwcmVzc2lvbiBtYXRjaGVzLCBpdCBtdXN0IGJlIHVzZWQuICBBbHNvLCBpbiB0aGUKLQkJICogY2FzZSBvZiArLCB3ZSd2ZSBhbHJlYWR5IG1hdGNoZWQgb25lIGNoYXJhY3Rlciwgc28gKwotCQkgKiBjYW4ndCBmYWlsOiBub3RoaW5nIGhlcmUgY2FuIGNhdXNlIGEgZmFpbHVyZS4gICovCi0JCXN3aXRjaCAoKnBpbnN0KyspCi0JCXsKLQkJY2FzZSBDc2V0OgotCQkgIHsKLQkJICAgICAgICBpZiAodHJhbnNsYXRlKQotCQkJewotCQkJCXdoaWxlICh0ZXh0IDwgdGV4dGVuZCkKLQkJCQl7Ci0JCQkJCWNoID0gdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKSp0ZXh0XTsKLQkJCQkJaWYgKHBpbnN0W2NoLzhdICYgKDE8PChjaCAmIDcpKSkKLQkJCQkJCXRleHQrKzsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXdoaWxlICh0ZXh0IDwgdGV4dGVuZCkKLQkJCQl7Ci0JCQkJCWNoID0gKHVuc2lnbmVkIGNoYXIpKnRleHQ7Ci0JCQkJCWlmIChwaW5zdFtjaC84XSAmICgxPDwoY2ggJiA3KSkpCi0JCQkJCQl0ZXh0Kys7Ci0JCQkJCWVsc2UKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQkJY2FzZSBDZXhhY3Q6Ci0JCXsKLQkJCWNoID0gKHVuc2lnbmVkIGNoYXIpKnBpbnN0OwotCQkJaWYgKHRyYW5zbGF0ZSkKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQgJiYKLQkJCQkgICAgICAgdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKSp0ZXh0XSA9PSBjaCkKLQkJCQkJdGV4dCsrOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXdoaWxlICh0ZXh0IDwgdGV4dGVuZCAmJiAodW5zaWduZWQgY2hhcikqdGV4dCA9PSBjaCkKLQkJCQkJdGV4dCsrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDYW55Y2hhcjoKLQkJewotCQkJd2hpbGUgKHRleHQgPCB0ZXh0ZW5kICYmICh1bnNpZ25lZCBjaGFyKSp0ZXh0ICE9ICdcbicpCi0JCQkJdGV4dCsrOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDc3ludGF4c3BlYzoKLQkJewotCQkJYSA9ICh1bnNpZ25lZCBjaGFyKSpwaW5zdDsKLQkJCWlmICh0cmFuc2xhdGUpCi0JCQl7Ci0JCQkJd2hpbGUgKHRleHQgPCB0ZXh0ZW5kICYmCi0JCQkJICAgICAgIChTWU5UQVgodHJhbnNsYXRlWyp0ZXh0XSkgJiBhKSApCi0JCQkJCXRleHQrKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQgJiYgKFNZTlRBWCgqdGV4dCkgJiBhKSApCi0JCQkJCXRleHQrKzsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQ25vdHN5bnRheHNwZWM6Ci0JCXsKLQkJCWEgPSAodW5zaWduZWQgY2hhcikqcGluc3Q7Ci0JCQlpZiAodHJhbnNsYXRlKQotCQkJewotCQkJCXdoaWxlICh0ZXh0IDwgdGV4dGVuZCAmJgotCQkJCSAgICAgICAhKFNZTlRBWCh0cmFuc2xhdGVbKnRleHRdKSAmIGEpICkKLQkJCQkJdGV4dCsrOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXdoaWxlICh0ZXh0IDwgdGV4dGVuZCAmJiAhKFNZTlRBWCgqdGV4dCkgJiBhKSApCi0JCQkJCXRleHQrKzsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCXsKLQkJICAgICAgICBGUkVFX1NUQVRFKHN0YXRlKTsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJVbmtub3duIHJlZ2V4IG9wY29kZTogbWVtb3J5IGNvcnJ1cHRlZD8iKTsKLQkJICAgICAgICByZXR1cm4gLTI7Ci0JCQkvKk5PVFJFQUNIRUQqLwotCQl9Ci0JCX0KLQkJLyogZHVlIHRvIHRoZSBmdW5reSB3YXkgKyBhbmQgKiBhcmUgY29tcGlsZWQsIHRoZSB0b3AKLQkJICogZmFpbHVyZS0gc3RhY2sgZW50cnkgYXQgdGhpcyBwb2ludCBpcyBhY3R1YWxseSBhCi0JCSAqIHN1Y2Nlc3MgZW50cnkgLS0gdXBkYXRlIGl0ICYgcG9wIGl0ICovCi0JCVVQREFURV9GQUlMVVJFKHN0YXRlLCB0ZXh0LCBnb3RvIGVycm9yKTsKLQkJZ290byBmYWlsOyAgICAgIC8qIGkuZS4sIHN1Y2NlZWQgPHdpbmsvc2lnaD4gKi8KLQl9Ci0JY2FzZSBDYmVnYnVmOgotCXsKLQkJaWYgKHRleHQgPT0gdGV4dHN0YXJ0KQotCQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJZ290byBmYWlsOwotCX0KLQljYXNlIENlbmRidWY6Ci0JewotCQlpZiAodGV4dCA9PSB0ZXh0ZW5kKQotCQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJZ290byBmYWlsOwotCX0KLQljYXNlIEN3b3JkYmVnOgotCXsKLQkJaWYgKHRleHQgPT0gdGV4dGVuZCkKLQkJCWdvdG8gZmFpbDsKLQkJaWYgKCEoU1lOVEFYKCp0ZXh0KSAmIFN3b3JkKSkgCi0JCQlnb3RvIGZhaWw7Ci0JCWlmICh0ZXh0ID09IHRleHRzdGFydCkKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWlmICghKFNZTlRBWCh0ZXh0Wy0xXSkgJiBTd29yZCkpCi0JCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCQlnb3RvIGZhaWw7Ci0JfQotCWNhc2UgQ3dvcmRlbmQ6Ci0JewotCQlpZiAodGV4dCA9PSB0ZXh0c3RhcnQpCi0JCQlnb3RvIGZhaWw7Ci0JCWlmICghKFNZTlRBWCh0ZXh0Wy0xXSkgJiBTd29yZCkpCi0JCQlnb3RvIGZhaWw7Ci0JCWlmICh0ZXh0ID09IHRleHRlbmQpCi0JCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCQlpZiAoIShTWU5UQVgoKnRleHQpICYgU3dvcmQpKQotCQkgICAgICAgIGdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotCX0KLQljYXNlIEN3b3JkYm91bmQ6Ci0JewotCQkvKiBOb3RlOiBhcyBpbiBnbnUgcmVnZXhwLCB0aGlzIGFsc28gbWF0Y2hlcyBhdCB0aGUKLQkJICogYmVnaW5uaW5nIGFuZCBlbmQgb2YgYnVmZmVyLiAgKi8KLQotCQlpZiAodGV4dCA9PSB0ZXh0c3RhcnQgfHwgdGV4dCA9PSB0ZXh0ZW5kKQotCQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJaWYgKChTWU5UQVgodGV4dFstMV0pICYgU3dvcmQpIF4gKFNZTlRBWCgqdGV4dCkgJiBTd29yZCkpCi0JCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCQlnb3RvIGZhaWw7Ci0JfQotCWNhc2UgQ25vdHdvcmRib3VuZDoKLQl7Ci0JCS8qIE5vdGU6IGFzIGluIGdudSByZWdleHAsIHRoaXMgbmV2ZXIgbWF0Y2hlcyBhdCB0aGUKLQkJICogYmVnaW5uaW5nIGFuZCBlbmQgb2YgYnVmZmVyLiAgKi8KLQkJaWYgKHRleHQgPT0gdGV4dHN0YXJ0IHx8IHRleHQgPT0gdGV4dGVuZCkKLQkJCWdvdG8gZmFpbDsKLQkJaWYgKCEoKFNZTlRBWCh0ZXh0Wy0xXSkgJiBTd29yZCkgXiAoU1lOVEFYKCp0ZXh0KSAmIFN3b3JkKSkpCi0gICAgICAJCSAgICAgICAgZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJZ290byBmYWlsOwotCX0KLQljYXNlIENzeW50YXhzcGVjOgotCXsKLQkJTkVYVENIQVIoY2gpOwotCQlpZiAoIShTWU5UQVgoY2gpICYgKHVuc2lnbmVkIGNoYXIpKmNvZGUrKykpCi0JCQlnb3RvIGZhaWw7Ci0JCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JfQotCWNhc2UgQ25vdHN5bnRheHNwZWM6Ci0JewotCQlORVhUQ0hBUihjaCk7Ci0JCWlmIChTWU5UQVgoY2gpICYgKHVuc2lnbmVkIGNoYXIpKmNvZGUrKykKLQkJCWdvdG8gZmFpbDsKLQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQl9Ci0JZGVmYXVsdDoKLQl7Ci0JICAgICAgICBGUkVFX1NUQVRFKHN0YXRlKTsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlVua25vd24gcmVnZXggb3Bjb2RlOiBtZW1vcnkgY29ycnVwdGVkPyIpOwotCQlyZXR1cm4gLTI7Ci0JCS8qTk9UUkVBQ0hFRCovCi0JfQotCX0KLQkKLQkKLQotI2lmIDAgLyogVGhpcyBsaW5lIGlzIG5ldmVyIHJlYWNoZWQgLS1HdWlkbyAqLwotCWFib3J0KCk7Ci0jZW5kaWYKLQkvKgotCSAqTk9UUkVBQ0hFRAotCSAqLwotCi0JLyogVXNpbmcgImJyZWFrOyIgaW4gdGhlIGFib3ZlIHN3aXRjaCBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byAiZ290byBmYWlsOyIgKi8KLSAgZmFpbDoKLQlQT1BfRkFJTFVSRShzdGF0ZSwgY29kZSwgdGV4dCwgZ290byBkb25lX21hdGNoaW5nLCBnb3RvIGVycm9yKTsKLQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotICAKLSAgZG9uZV9tYXRjaGluZzoKLS8qICAgaWYodHJhbnNsYXRlZCAhPSBOVUxMKSAqLwotLyogICAgICBmcmVlKHRyYW5zbGF0ZWQpOyAqLwotCUZSRUVfU1RBVEUoc3RhdGUpOwotCXJldHVybiAtMTsKLQotICBlcnJvcjoKLS8qICAgaWYgKHRyYW5zbGF0ZWQgIT0gTlVMTCkgKi8KLS8qICAgICAgZnJlZSh0cmFuc2xhdGVkKTsgKi8KLQlGUkVFX1NUQVRFKHN0YXRlKTsKLQlyZXR1cm4gLTI7Ci19Ci0JCi0KLSN1bmRlZiBQUkVGRVRDSAotI3VuZGVmIE5FWFRDSEFSCi0KLWludCByZV9zZWFyY2gocmVnZXhwX3QgYnVmcCwgdW5zaWduZWQgY2hhciAqc3RyaW5nLCBpbnQgc2l6ZSwgaW50IHBvcywKLSAgICAgICAgICAgICAgaW50IHJhbmdlLCByZWdleHBfcmVnaXN0ZXJzX3QgcmVncykKLXsKLQl1bnNpZ25lZCBjaGFyICpmYXN0bWFwOwotCXVuc2lnbmVkIGNoYXIgKnRyYW5zbGF0ZTsKLQl1bnNpZ25lZCBjaGFyICp0ZXh0OwotCXVuc2lnbmVkIGNoYXIgKnBhcnRzdGFydDsKLQl1bnNpZ25lZCBjaGFyICpwYXJ0ZW5kOwotCWludCBkaXI7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBjaGFyIGFuY2hvcjsKLSAgCi0JYXNzZXJ0KHNpemUgPj0gMCAmJiBwb3MgPj0gMCk7Ci0JYXNzZXJ0KHBvcyArIHJhbmdlID49IDAgJiYgcG9zICsgcmFuZ2UgPD0gc2l6ZSk7IC8qIEJ1Z2ZpeCBieSB5bG8gKi8KLSAgCi0JZmFzdG1hcCA9IGJ1ZnAtPmZhc3RtYXA7Ci0JdHJhbnNsYXRlID0gYnVmcC0+dHJhbnNsYXRlOwotCWlmIChmYXN0bWFwICYmICFidWZwLT5mYXN0bWFwX2FjY3VyYXRlKSB7Ci0gICAgICAgICAgICAgICAgcmVfY29tcGlsZV9mYXN0bWFwKGJ1ZnApOwotCSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHJldHVybiAtMjsKLQl9Ci0JCi0JYW5jaG9yID0gYnVmcC0+YW5jaG9yOwotCWlmIChidWZwLT5jYW5fYmVfbnVsbCA9PSAxKSAvKiBjYW5fYmVfbnVsbCA9PSAyOiBjYW4gbWF0Y2ggbnVsbCBhdCBlb2IgKi8KLQkJZmFzdG1hcCA9IE5VTEw7Ci0KLQlpZiAocmFuZ2UgPCAwKQotCXsKLQkJZGlyID0gLTE7Ci0JCXJhbmdlID0gLXJhbmdlOwotCX0KLQllbHNlCi0JCWRpciA9IDE7Ci0KLQlpZiAoYW5jaG9yID09IDIpIHsKLQkJaWYgKHBvcyAhPSAwKQotCQkJcmV0dXJuIC0xOwotCQllbHNlCi0JCQlyYW5nZSA9IDA7Ci0JfQotCi0JZm9yICg7IHJhbmdlID49IDA7IHJhbmdlLS0sIHBvcyArPSBkaXIpCi0JewotCQlpZiAoZmFzdG1hcCkKLQkJewotCQkJaWYgKGRpciA9PSAxKQotCQkJeyAvKiBzZWFyY2hpbmcgZm9yd2FyZHMgKi8KLQotCQkJCXRleHQgPSBzdHJpbmcgKyBwb3M7Ci0JCQkJcGFydGVuZCA9IHN0cmluZyArIHNpemU7Ci0JCQkJcGFydHN0YXJ0ID0gdGV4dDsKLQkJCQlpZiAodHJhbnNsYXRlKQotCQkJCQl3aGlsZSAodGV4dCAhPSBwYXJ0ZW5kICYmCi0JCQkJCSAgICAgICAhZmFzdG1hcFsodW5zaWduZWQgY2hhcikgdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKSp0ZXh0XV0pCi0JCQkJCQl0ZXh0Kys7Ci0JCQkJZWxzZQotCQkJCQl3aGlsZSAodGV4dCAhPSBwYXJ0ZW5kICYmICFmYXN0bWFwWyh1bnNpZ25lZCBjaGFyKSp0ZXh0XSkKLQkJCQkJCXRleHQrKzsKLQkJCQlwb3MgKz0gdGV4dCAtIHBhcnRzdGFydDsKLQkJCQlyYW5nZSAtPSB0ZXh0IC0gcGFydHN0YXJ0OwotCQkJCWlmIChwb3MgPT0gc2l6ZSAmJiBidWZwLT5jYW5fYmVfbnVsbCA9PSAwKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7IC8qIHNlYXJjaGluZyBiYWNrd2FyZHMgKi8KLQkJCQl0ZXh0ID0gc3RyaW5nICsgcG9zOwotCQkJCXBhcnRzdGFydCA9IHN0cmluZyArIHBvcyAtIHJhbmdlOwotCQkJCXBhcnRlbmQgPSB0ZXh0OwotCQkJCWlmICh0cmFuc2xhdGUpCi0JCQkJCXdoaWxlICh0ZXh0ICE9IHBhcnRzdGFydCAmJgotCQkJCQkgICAgICAgIWZhc3RtYXBbKHVuc2lnbmVkIGNoYXIpCi0JCQkJCQkgICAgICAgdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKSp0ZXh0XV0pCi0JCQkJCQl0ZXh0LS07Ci0JCQkJZWxzZQotCQkJCQl3aGlsZSAodGV4dCAhPSBwYXJ0c3RhcnQgJiYKLQkJCQkJICAgICAgICFmYXN0bWFwWyh1bnNpZ25lZCBjaGFyKSp0ZXh0XSkKLQkJCQkJCXRleHQtLTsKLQkJCQlwb3MgLT0gcGFydGVuZCAtIHRleHQ7Ci0JCQkJcmFuZ2UgLT0gcGFydGVuZCAtIHRleHQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFuY2hvciA9PSAxKQotCQl7IC8qIGFuY2hvcmVkIHRvIGJlZ2xpbmUgKi8KLQkJCWlmIChwb3MgPiAwICYmIChzdHJpbmdbcG9zIC0gMV0gIT0gJ1xuJykpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJYXNzZXJ0KHBvcyA+PSAwICYmIHBvcyA8PSBzaXplKTsKLQkJcmV0ID0gcmVfbWF0Y2goYnVmcCwgc3RyaW5nLCBzaXplLCBwb3MsIHJlZ3MpOwotCQlpZiAocmV0ID49IDApCi0JCQlyZXR1cm4gcG9zOwotCQlpZiAocmV0ID09IC0yKQotCQkJcmV0dXJuIC0yOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qCi0qKiBMb2NhbCBWYXJpYWJsZXM6Ci0qKiBtb2RlOiBjCi0qKiBjLWZpbGUtc3R5bGU6ICJweXRob24iCi0qKiBFbmQ6Ci0qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9yZWdleHByLmggYi9Nb2R1bGVzL3JlZ2V4cHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlZTYyZC4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL3JlZ2V4cHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogLSotIG1vZGU6IGMtbW9kZTsgYy1maWxlLXN0eWxlOiBweXRob24gLSotCi0gKi8KLQotI2lmbmRlZiBQeV9SRUdFWFBSX0gKLSNkZWZpbmUgUHlfUkVHRVhQUl9ICi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qCi0gKiByZWdleHByLmgKLSAqCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AbmdzLmZpPgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5MSBUYXR1IFlsb25lbiwgRXNwb28sIEZpbmxhbmQKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCi0gKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4gIFRoaXMKLSAqIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogQ3JlYXRlZDogVGh1IFNlcCAyNiAxNzoxNTozNiAxOTkxIHlsbwotICogTGFzdCBtb2RpZmllZDogTW9uIE5vdiAgNCAxNTo0OTo0NiAxOTkxIHlsbwotICovCi0KLS8qICRJZCQgKi8KLQotI2lmbmRlZiBSRUdFWFBSX0gKLSNkZWZpbmUgUkVHRVhQUl9ICi0KLSNkZWZpbmUgUkVfTlJFR1MJMTAwICAvKiBudW1iZXIgb2YgcmVnaXN0ZXJzIGF2YWlsYWJsZSAqLwotCi10eXBlZGVmIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlcgotewotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsgICAgICAgICAgLyogY29tcGlsZWQgcGF0dGVybiAqLwotCWludCBhbGxvY2F0ZWQ7ICAgICAgICAgLyogYWxsb2NhdGVkIHNpemUgb2YgY29tcGlsZWQgcGF0dGVybiAqLwotCWludCB1c2VkOyAgICAgICAgICAgICAgLyogYWN0dWFsIGxlbmd0aCBvZiBjb21waWxlZCBwYXR0ZXJuICovCi0JdW5zaWduZWQgY2hhciAqZmFzdG1hcDsgICAgICAgICAvKiBmYXN0bWFwW2NoXSBpcyB0cnVlIGlmIGNoIGNhbiBzdGFydCBwYXR0ZXJuICovCi0JdW5zaWduZWQgY2hhciAqdHJhbnNsYXRlOyAgICAgICAvKiB0cmFuc2xhdGlvbiB0byBhcHBseSBkdXJpbmcgY29tcGlsYXRpb24vbWF0Y2hpbmcgKi8KLQl1bnNpZ25lZCBjaGFyIGZhc3RtYXBfYWNjdXJhdGU7IC8qIHRydWUgaWYgZmFzdG1hcCBpcyB2YWxpZCAqLwotCXVuc2lnbmVkIGNoYXIgY2FuX2JlX251bGw7ICAgICAgLyogdHJ1ZSBpZiBjYW4gbWF0Y2ggZW1wdHkgc3RyaW5nICovCi0JdW5zaWduZWQgY2hhciB1c2VzX3JlZ2lzdGVyczsgICAvKiByZWdpc3RlcnMgYXJlIHVzZWQgYW5kIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgKi8KLQlpbnQgbnVtX3JlZ2lzdGVyczsgICAgIC8qIG51bWJlciBvZiByZWdpc3RlcnMgdXNlZCAqLwotCXVuc2lnbmVkIGNoYXIgYW5jaG9yOyAgICAgICAgICAgLyogYW5jaG9yOiAwPW5vbmUgMT1iZWdsaW5lIDI9YmVnYnVmICovCi19ICpyZWdleHBfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcmVfcmVnaXN0ZXJzCi17Ci0JaW50IHN0YXJ0W1JFX05SRUdTXTsgIC8qIHN0YXJ0IG9mZnNldCBvZiByZWdpb24gKi8KLQlpbnQgZW5kW1JFX05SRUdTXTsgICAgLyogZW5kIG9mZnNldCBvZiByZWdpb24gKi8KLX0gKnJlZ2V4cF9yZWdpc3RlcnNfdDsKLQotLyogYml0IGRlZmluaXRpb25zIGZvciBzeW50YXggKi8KLSNkZWZpbmUgUkVfTk9fQktfUEFSRU5TCQkxICAgIC8qIG5vIHF1b3RpbmcgZm9yIHBhcmVudGhlc2VzICovCi0jZGVmaW5lIFJFX05PX0JLX1ZCQVIJCTIgICAgLyogbm8gcXVvdGluZyBmb3IgdmVydGljYWwgYmFyICovCi0jZGVmaW5lIFJFX0JLX1BMVVNfUU0JCTQgICAgLyogcXVvdGluZyBuZWVkZWQgZm9yICsgYW5kID8gKi8KLSNkZWZpbmUgUkVfVElHSFRfVkJBUgkJOCAgICAvKiB8IGJpbmRzIHRpZ2h0ZXIgdGhhbiBeIGFuZCAkICovCi0jZGVmaW5lIFJFX05FV0xJTkVfT1IJCTE2ICAgLyogdHJlYXQgbmV3bGluZSBhcyBvciAqLwotI2RlZmluZSBSRV9DT05URVhUX0lOREVQX09QUwkzMiAgIC8qIF4kPyorIGFyZSBzcGVjaWFsIGluIGFsbCBjb250ZXh0cyAqLwotI2RlZmluZSBSRV9BTlNJX0hFWAkJNjQgICAvKiBhbnNpIHNlcXVlbmNlcyAoXG4gZXRjKSBhbmQgXHhoaCAqLwotI2RlZmluZSBSRV9OT19HTlVfRVhURU5TSU9OUyAgIDEyOCAgIC8qIG5vIGdudSBleHRlbnNpb25zICovCi0KLS8qIGRlZmluaXRpb25zIGZvciBzb21lIGNvbW1vbiByZWdleHAgc3R5bGVzICovCi0jZGVmaW5lIFJFX1NZTlRBWF9BV0sJKFJFX05PX0JLX1BBUkVOU3xSRV9OT19CS19WQkFSfFJFX0NPTlRFWFRfSU5ERVBfT1BTKQotI2RlZmluZSBSRV9TWU5UQVhfRUdSRVAJKFJFX1NZTlRBWF9BV0t8UkVfTkVXTElORV9PUikKLSNkZWZpbmUgUkVfU1lOVEFYX0dSRVAJKFJFX0JLX1BMVVNfUU18UkVfTkVXTElORV9PUikKLSNkZWZpbmUgUkVfU1lOVEFYX0VNQUNTCTAKLQotI2RlZmluZSBTd29yZCAgICAgICAxCi0jZGVmaW5lIFN3aGl0ZXNwYWNlIDIKLSNkZWZpbmUgU2RpZ2l0ICAgICAgNAotI2RlZmluZSBTb2N0YWxkaWdpdCA4Ci0jZGVmaW5lIFNoZXhkaWdpdCAgIDE2Ci0KLS8qIFJlbmFtZSBhbGwgZXhwb3J0ZWQgc3ltYm9scyB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBzaW1pbGFybHkgbmFtZWQKLSAgIHN5bWJvbHMgaW4gc29tZSBzeXN0ZW1zJyBzdGFuZGFyZCBDIGxpYnJhcmllcy4uLiAqLwotCi0jZGVmaW5lIHJlX3N5bnRheCBfUHlfcmVfc3ludGF4Ci0jZGVmaW5lIHJlX3N5bnRheF90YWJsZSBfUHlfcmVfc3ludGF4X3RhYmxlCi0jZGVmaW5lIHJlX2NvbXBpbGVfaW5pdGlhbGl6ZSBfUHlfcmVfY29tcGlsZV9pbml0aWFsaXplCi0jZGVmaW5lIHJlX3NldF9zeW50YXggX1B5X3JlX3NldF9zeW50YXgKLSNkZWZpbmUgcmVfY29tcGlsZV9wYXR0ZXJuIF9QeV9yZV9jb21waWxlX3BhdHRlcm4KLSNkZWZpbmUgcmVfbWF0Y2ggX1B5X3JlX21hdGNoCi0jZGVmaW5lIHJlX3NlYXJjaCBfUHlfcmVfc2VhcmNoCi0jZGVmaW5lIHJlX2NvbXBpbGVfZmFzdG1hcCBfUHlfcmVfY29tcGlsZV9mYXN0bWFwCi0jZGVmaW5lIHJlX2NvbXAgX1B5X3JlX2NvbXAKLSNkZWZpbmUgcmVfZXhlYyBfUHlfcmVfZXhlYwotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi0KLWV4dGVybiBpbnQgcmVfc3ludGF4OwotLyogVGhpcyBpcyB0aGUgYWN0dWFsIHN5bnRheCBtYXNrLiAgSXQgd2FzIGFkZGVkIHNvIHRoYXQgUHl0aG9uIGNvdWxkIGRvCi0gKiBzeW50YXgtZGVwZW5kZW50IG11bmdpbmcgb2YgcGF0dGVybnMgYmVmb3JlIGNvbXBpbGF0aW9uLiAqLwotCi1leHRlcm4gdW5zaWduZWQgY2hhciByZV9zeW50YXhfdGFibGVbMjU2XTsKLQotdm9pZCByZV9jb21waWxlX2luaXRpYWxpemUodm9pZCk7Ci0KLWludCByZV9zZXRfc3ludGF4KGludCBzeW50YXgpOwotLyogVGhpcyBzZXRzIHRoZSBzeW50YXggdG8gdXNlIGFuZCByZXR1cm5zIHRoZSBwcmV2aW91cyBzeW50YXguICBUaGUKLSAqIHN5bnRheCBpcyBzcGVjaWZpZWQgYnkgYSBiaXQgbWFzayBvZiB0aGUgYWJvdmUgZGVmaW5lZCBiaXRzLiAqLwotCi1jaGFyICpyZV9jb21waWxlX3BhdHRlcm4odW5zaWduZWQgY2hhciAqcmVnZXgsIGludCByZWdleF9zaXplLCByZWdleHBfdCBjb21waWxlZCk7Ci0vKiBUaGlzIGNvbXBpbGVzIHRoZSByZWdleHAgKGdpdmVuIGluIHJlZ2V4IGFuZCBsZW5ndGggaW4gcmVnZXhfc2l6ZSkuCi0gKiBUaGlzIHJldHVybnMgTlVMTCBpZiB0aGUgcmVnZXhwIGNvbXBpbGVkIHN1Y2Nlc3NmdWxseSwgYW5kIGFuIGVycm9yCi0gKiBtZXNzYWdlIGlmIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZC4gIFRoZSBidWZmZXIgZmllbGQgbXVzdCBiZQotICogaW5pdGlhbGl6ZWQgdG8gYSBtZW1vcnkgYXJlYSBhbGxvY2F0ZWQgYnkgbWFsbG9jIChvciB0byBOVUxMKSBiZWZvcmUKLSAqIHVzZSwgYW5kIHRoZSBhbGxvY2F0ZWQgZmllbGQgbXVzdCBiZSBzZXQgdG8gaXRzIGxlbmd0aCAob3IgMCBpZgotICogYnVmZmVyIGlzIE5VTEwpLiAgQWxzbywgdGhlIHRyYW5zbGF0ZSBmaWVsZCBtdXN0IGJlIHNldCB0byBwb2ludCB0byBhCi0gKiB2YWxpZCB0cmFuc2xhdGlvbiB0YWJsZSwgb3IgTlVMTCBpZiBpdCBpcyBub3QgdXNlZC4gKi8KLQotaW50IHJlX21hdGNoKHJlZ2V4cF90IGNvbXBpbGVkLCB1bnNpZ25lZCBjaGFyICpzdHJpbmcsIGludCBzaXplLCBpbnQgcG9zLAotCSAgICAgcmVnZXhwX3JlZ2lzdGVyc190IG9sZF9yZWdzKTsKLS8qIFRoaXMgdHJpZXMgdG8gbWF0Y2ggdGhlIHJlZ2V4cCBhZ2FpbnN0IHRoZSBzdHJpbmcuICBUaGlzIHJldHVybnMgdGhlCi0gKiBsZW5ndGggb2YgdGhlIG1hdGNoZWQgcG9ydGlvbiwgb3IgLTEgaWYgdGhlIHBhdHRlcm4gY291bGQgbm90IGJlCi0gKiBtYXRjaGVkIGFuZCAtMiBpZiBhbiBlcnJvciAoc3VjaCBhcyBmYWlsdXJlIHN0YWNrIG92ZXJmbG93KSBpcwotICogZW5jb3VudGVyZWQuICovCi0KLWludCByZV9zZWFyY2gocmVnZXhwX3QgY29tcGlsZWQsIHVuc2lnbmVkIGNoYXIgKnN0cmluZywgaW50IHNpemUsIGludCBzdGFydHBvcywKLQkgICAgICBpbnQgcmFuZ2UsIHJlZ2V4cF9yZWdpc3RlcnNfdCByZWdzKTsKLS8qIFRoaXMgc2VhcmNoZXMgZm9yIGEgc3Vic3RyaW5nIG1hdGNoaW5nIHRoZSByZWdleHAuICBUaGlzIHJldHVybnMgdGhlCi0gKiBmaXJzdCBpbmRleCBhdCB3aGljaCBhIG1hdGNoIGlzIGZvdW5kLiAgcmFuZ2Ugc3BlY2lmaWVzIGF0IGhvdyBtYW55Ci0gKiBwb3NpdGlvbnMgdG8gdHJ5IG1hdGNoaW5nOyBwb3NpdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgc2VhcmNoaW5nCi0gKiBmb3J3YXJkcywgYW5kIG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBzZWFyY2hpbmcgYmFja3dhcmRzLiAgbXN0b3AKLSAqIHNwZWNpZmllcyB0aGUgb2Zmc2V0IGJleW9uZCB3aGljaCBhIG1hdGNoIG11c3Qgbm90IGdvLiAgVGhpcyByZXR1cm5zCi0gKiAtMSBpZiBubyBtYXRjaCBpcyBmb3VuZCwgYW5kIC0yIGlmIGFuIGVycm9yIChzdWNoIGFzIGZhaWx1cmUgc3RhY2sKLSAqIG92ZXJmbG93KSBpcyBlbmNvdW50ZXJlZC4gKi8KLQotdm9pZCByZV9jb21waWxlX2Zhc3RtYXAocmVnZXhwX3QgY29tcGlsZWQpOwotLyogVGhpcyBjb21wdXRlcyB0aGUgZmFzdG1hcCBmb3IgdGhlIHJlZ2V4cC4gIEZvciB0aGlzIHRvIGhhdmUgYW55IGVmZmVjdCwKLSAqIHRoZSBjYWxsaW5nIHByb2dyYW0gbXVzdCBoYXZlIGluaXRpYWxpemVkIHRoZSBmYXN0bWFwIGZpZWxkIHRvIHBvaW50Ci0gKiB0byBhbiBhcnJheSBvZiAyNTYgY2hhcmFjdGVycy4gKi8KLQotI2Vsc2UgLyogSEFWRV9QUk9UT1RZUEVTICovCi0KLWV4dGVybiBpbnQgcmVfc3ludGF4OwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVfc3ludGF4X3RhYmxlWzI1Nl07Ci12b2lkIHJlX2NvbXBpbGVfaW5pdGlhbGl6ZSgpOwotaW50IHJlX3NldF9zeW50YXgoKTsKLWNoYXIgKnJlX2NvbXBpbGVfcGF0dGVybigpOwotaW50IHJlX21hdGNoKCk7Ci1pbnQgcmVfc2VhcmNoKCk7Ci12b2lkIHJlX2NvbXBpbGVfZmFzdG1hcCgpOwotCi0jZW5kaWYgLyogSEFWRV9QUk9UT1RZUEVTICovCi0KLSNlbmRpZiAvKiBSRUdFWFBSX0ggKi8KLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYgLyogIVB5X1JFR0VYUFJfSCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9yZXNvdXJjZS5jIGIvTW9kdWxlcy9yZXNvdXJjZS5jCmluZGV4IDdjYmQyYzkuLmU3M2M4NzggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcmVzb3VyY2UuYworKysgYi9Nb2R1bGVzL3Jlc291cmNlLmMKQEAgLTU1LDYgKzU1LDcgQEAKIAkxNgkvKiBuX2luX3NlcXVlbmNlICovCiB9OwogCitzdGF0aWMgaW50IGluaXRpYWxpemVkOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJ1Y3RSVXNhZ2VUeXBlOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMjQ0LDcgKzI0NSwxMCBAQAogCX0KIAlQeV9JTkNSRUYoUmVzb3VyY2VFcnJvcik7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFJlc291cmNlRXJyb3IpOwotIAlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RSVXNhZ2VUeXBlLCAmc3RydWN0X3J1c2FnZV9kZXNjKTsKKwlpZiAoIWluaXRpYWxpemVkKQorCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RSVXNhZ2VUeXBlLCAKKwkJCQkJICAmc3RydWN0X3J1c2FnZV9kZXNjKTsKKwlQeV9JTkNSRUYoJlN0cnVjdFJVc2FnZVR5cGUpOwogIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgInN0cnVjdF9ydXNhZ2UiLCAKIAkJCSAgIChQeU9iamVjdCopICZTdHJ1Y3RSVXNhZ2VUeXBlKTsKIApAQCAtMzIwLDQgKzMyNCw1IEBACiAJaWYgKHYpIHsKIAkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSTElNX0lORklOSVRZIiwgdik7CiAJfQorCWluaXRpYWxpemVkID0gMTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCmluZGV4IGM1MjZkNzUuLmM5ZGQ0YTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwpAQCAtNjIsNiArNjIsNyBAQAogKi8KIAogI2luY2x1ZGUgIlB5dGhvbi5oIgorI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCiAjdW5kZWYgTUFYCiAjZGVmaW5lIE1BWCh4LCB5KSAoKHgpIDwgKHkpID8gKHkpIDogKHgpKQpAQCAtOTY3LDcgKzk2OCwxOCBAQAogCWNhc2UgQUZfVU5JWDoKIAl7CiAJCXN0cnVjdCBzb2NrYWRkcl91biAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4gKikgYWRkcjsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYS0+c3VuX3BhdGgpOworI2lmZGVmIGxpbnV4CisJCWlmIChhLT5zdW5fcGF0aFswXSA9PSAwKSB7ICAvKiBMaW51eCBhYnN0cmFjdCBuYW1lc3BhY2UgKi8KKwkJCWFkZHJsZW4gLT0gKHNpemVvZigqYSkgLSBzaXplb2YoYS0+c3VuX3BhdGgpKTsKKwkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShhLT5zdW5fcGF0aCwKKwkJCQkJCQkgIGFkZHJsZW4pOworCQl9CisJCWVsc2UKKyNlbmRpZiAvKiBsaW51eCAqLworCQl7CisJCQkvKiByZWd1bGFyIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgKi8KKwkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGEtPnN1bl9wYXRoKTsKKwkJfQogCX0KICNlbmRpZiAvKiBBRl9VTklYICovCiAKQEAgLTEwOTcsMTQgKzExMDksMjggQEAKIAkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4qKSYocy0+c29ja19hZGRyKS51bjsKIAkJaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAidCMiLCAmcGF0aCwgJmxlbikpCiAJCQlyZXR1cm4gMDsKLQkJaWYgKGxlbiA+IHNpemVvZiBhZGRyLT5zdW5fcGF0aCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkJIkFGX1VOSVggcGF0aCB0b28gbG9uZyIpOwotCQkJcmV0dXJuIDA7CisjaWZkZWYgbGludXgKKwkJaWYgKGxlbiA+IDAgJiYgcGF0aFswXSA9PSAwKSB7CisJCQkvKiBMaW51eCBhYnN0cmFjdCBuYW1lc3BhY2UgZXh0ZW5zaW9uICovCisJCQlpZiAobGVuID4gc2l6ZW9mIGFkZHItPnN1bl9wYXRoKSB7CisJCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKwkJCQkJCSJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQllbHNlCisjZW5kaWYgLyogbGludXggKi8KKyAgICAgICAgICAgICAgICB7CisJCQkvKiByZWd1bGFyIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgKi8KKwkJCWlmIChsZW4gPj0gc2l6ZW9mIGFkZHItPnN1bl9wYXRoKSB7CisJCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKwkJCQkJCSJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWFkZHItPnN1bl9wYXRoW2xlbl0gPSAwOwogCQl9CiAJCWFkZHItPnN1bl9mYW1pbHkgPSBzLT5zb2NrX2ZhbWlseTsKIAkJbWVtY3B5KGFkZHItPnN1bl9wYXRoLCBwYXRoLCBsZW4pOwotCQlhZGRyLT5zdW5fcGF0aFtsZW5dID0gMDsKIAkJKmFkZHJfcmV0ID0gKHN0cnVjdCBzb2NrYWRkciAqKSBhZGRyOwogI2lmIGRlZmluZWQoUFlPU19PUzIpCiAJCSpsZW5fcmV0ID0gc2l6ZW9mKCphZGRyKTsKQEAgLTIyMDcsMTggKzIyMzMsMjAgQEAKIAlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKIAl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOwotCWlmICghdGltZW91dCkKLQkJbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLCBsZW4sIGZsYWdzLAorCWlmICghdGltZW91dCkgewogI2lmbmRlZiBNU19XSU5ET1dTCiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJidWYsICZhZGRybGVuCisJCW4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgbGVuLCBmbGFncywKKwkJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmJ1ZiwgJmFkZHJsZW4pOwogI2Vsc2UKLQkJCSAgICAgKHZvaWQgKikgJmFkZHJidWYsICZhZGRybGVuCisJCW4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgbGVuLCBmbGFncywKKwkJCSAgICAgKHZvaWQgKikgJmFkZHJidWYsICZhZGRybGVuKTsKICNlbmRpZgogI2Vsc2UKLQkJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmJ1ZiwgJmFkZHJsZW4KKwkJbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLCBsZW4sIGZsYWdzLAorCQkJICAgICAoc3RydWN0IHNvY2thZGRyICopICZhZGRyYnVmLCAmYWRkcmxlbik7CiAjZW5kaWYKLQkJCSk7CisJfQogCVB5X0VORF9BTExPV19USFJFQURTCiAKIAlpZiAodGltZW91dCkgewpAQCAtMjUwMiw2ICsyNTMwLDE0IEBACiAJe05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCiB9OwogCisvKiBTb2NrT2JqZWN0IG1lbWJlcnMgKi8KK3N0YXRpYyBQeU1lbWJlckRlZiBzb2NrX21lbWJlcmxpc3RbXSA9IHsKKyAgICAgICB7ImZhbWlseSIsIFRfSU5ULCBvZmZzZXRvZihQeVNvY2tldFNvY2tPYmplY3QsIHNvY2tfZmFtaWx5KSwgUkVBRE9OTFksICJ0aGUgc29ja2V0IGZhbWlseSJ9LAorICAgICAgIHsidHlwZSIsIFRfSU5ULCBvZmZzZXRvZihQeVNvY2tldFNvY2tPYmplY3QsIHNvY2tfdHlwZSksIFJFQURPTkxZLCAidGhlIHNvY2tldCB0eXBlIn0sCisgICAgICAgeyJwcm90byIsIFRfSU5ULCBvZmZzZXRvZihQeVNvY2tldFNvY2tPYmplY3QsIHNvY2tfcHJvdG8pLCBSRUFET05MWSwgInRoZSBzb2NrZXQgcHJvdG9jb2wifSwKKyAgICAgICB7InRpbWVvdXQiLCBUX0RPVUJMRSwgb2Zmc2V0b2YoUHlTb2NrZXRTb2NrT2JqZWN0LCBzb2NrX3RpbWVvdXQpLCBSRUFET05MWSwgInRoZSBzb2NrZXQgdGltZW91dCJ9LAorICAgICAgIHswfSwKK307CiAKIC8qIERlYWxsb2NhdGUgYSBzb2NrZXQgb2JqZWN0IGluIHJlc3BvbnNlIHRvIHRoZSBsYXN0IFB5X0RFQ1JFRigpLgogICAgRmlyc3QgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRpb24uICovCkBAIC0yNjI1LDcgKzI2NjEsNyBAQAogCTAsCQkJCQkvKiB0cF9pdGVyICovCiAJMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCiAJc29ja19tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KKwlzb2NrX21lbWJlcmxpc3QsCQkJLyogdHBfbWVtYmVycyAqLwogCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KIAkwLAkJCQkJLyogdHBfYmFzZSAqLwogCTAsCQkJCQkvKiB0cF9kaWN0ICovCkBAIC0zMTU5LDcgKzMxOTUsOCBAQAogUHlEb2NfU1RSVkFSKGZyb21mZF9kb2MsCiAiZnJvbWZkKGZkLCBmYW1pbHksIHR5cGVbLCBwcm90b10pIC0+IHNvY2tldCBvYmplY3RcblwKIFxuXAotQ3JlYXRlIGEgc29ja2V0IG9iamVjdCBmcm9tIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuXG5cCitDcmVhdGUgYSBzb2NrZXQgb2JqZWN0IGZyb20gYSBkdXBsaWNhdGUgb2YgdGhlIGdpdmVuXG5cCitmaWxlIGRlc2NyaXB0b3IuXG5cCiBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHNvY2tldCgpLiIpOwogCiAjZW5kaWYgLyogTk9fRFVQICovCkBAIC00MDI2LDcgKzQwNjMsMTIgQEAKIAkvKiAgKi8KIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfTkVUTElOSyIsIEFGX05FVExJTkspOwogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1JPVVRFIiwgTkVUTElOS19ST1VURSk7CisjaWZkZWYgTkVUTElOS19TS0lQCiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfU0tJUCIsIE5FVExJTktfU0tJUCk7CisjZW5kaWYKKyNpZmRlZiBORVRMSU5LX1cxCisJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfVzEiLCBORVRMSU5LX1cxKTsKKyNlbmRpZgogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1VTRVJTT0NLIiwgTkVUTElOS19VU0VSU09DSyk7CiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfRklSRVdBTEwiLCBORVRMSU5LX0ZJUkVXQUxMKTsKICNpZmRlZiBORVRMSU5LX1RDUERJQUcKQEAgLTQwMzgsMTIgKzQwODAsMTggQEAKICNpZmRlZiBORVRMSU5LX1hGUk0KIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19YRlJNIiwgTkVUTElOS19YRlJNKTsKICNlbmRpZgorI2lmZGVmIE5FVExJTktfQVJQRAogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0FSUEQiLCBORVRMSU5LX0FSUEQpOworI2VuZGlmCisjaWZkZWYgTkVUTElOS19ST1VURTYKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ST1VURTYiLCBORVRMSU5LX1JPVVRFNik7CisjZW5kaWYKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19JUDZfRlciLCBORVRMSU5LX0lQNl9GVyk7CiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfRE5SVE1TRyIsIE5FVExJTktfRE5SVE1TRyk7CisjaWZkZWYgTkVUTElOS19UQVBCQVNFCiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfVEFQQkFTRSIsIE5FVExJTktfVEFQQkFTRSk7CiAjZW5kaWYKKyNlbmRpZiAvKiBBRl9ORVRMSU5LICovCiAjaWZkZWYgQUZfUk9VVEUKIAkvKiBBbGlhcyB0byBlbXVsYXRlIDQuNEJTRCAqLwogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ST1VURSIsIEFGX1JPVVRFKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvc3B3ZG1vZHVsZS5jIGIvTW9kdWxlcy9zcHdkbW9kdWxlLmMKaW5kZXggN2M2MThlNy4uYjdiZjIwZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zcHdkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zcHdkbW9kdWxlLmMKQEAgLTUyLDYgKzUyLDcgQEAKIAk5LAogfTsKIAorc3RhdGljIGludCBpbml0aWFsaXplZDsKIHN0YXRpYyBQeVR5cGVPYmplY3QgU3RydWN0U3B3ZFR5cGU7CiAKIApAQCAtMTczLDcgKzE3NCwxMCBAQAogCW09UHlfSW5pdE1vZHVsZTMoInNwd2QiLCBzcHdkX21ldGhvZHMsIHNwd2RfX2RvY19fKTsKIAlpZiAobSA9PSBOVUxMKQogCQlyZXR1cm47Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0U3B3ZFR5cGUsICZzdHJ1Y3Rfc3B3ZF90eXBlX2Rlc2MpOworCWlmICghaW5pdGlhbGl6ZWQpCisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFNwd2RUeXBlLCAKKwkJCQkJICAmc3RydWN0X3Nwd2RfdHlwZV9kZXNjKTsKIAlQeV9JTkNSRUYoKFB5T2JqZWN0ICopICZTdHJ1Y3RTcHdkVHlwZSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3Rfc3B3ZCIsIChQeU9iamVjdCAqKSAmU3RydWN0U3B3ZFR5cGUpOworCWluaXRpYWxpemVkID0gMTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc3Ryb3Btb2R1bGUuYyBiL01vZHVsZXMvc3Ryb3Btb2R1bGUuYwppbmRleCBjZmZlZjNhLi44YjAwZmVkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3N0cm9wbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zdHJvcG1vZHVsZS5jCkBAIC0zMzMsNyArMzMzLDcgQEAKIHsKIAljaGFyICpzLCAqc3ViOwogCVB5X3NzaXplX3QgbGVuLCBuLCBqOwotCVB5X3NzaXplX3QgaSA9IDAsIGxhc3QgPSBJTlRfTUFYOworCVB5X3NzaXplX3QgaSA9IDAsIGxhc3QgPSBQWV9TU0laRV9UX01BWDsKIAogCVdBUk47CiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjfG5uOnJmaW5kIiwgJnMsICZsZW4sICZzdWIsICZuLCAmaSwgJmxhc3QpKQpAQCAtNDQ2LDE2ICs0NDYsMTYgQEAKIHsKIAljaGFyICpzLCAqc19uZXc7CiAJUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpuZXc7CisJUHlPYmplY3QgKm5ld3N0cjsKIAlpbnQgY2hhbmdlZDsKIAogCVdBUk47CiAJaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQogCQlyZXR1cm4gTlVMTDsKLQluZXcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3ID09IE5VTEwpCisJbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisJaWYgKG5ld3N0ciA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ldyk7CisJc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOwogCWNoYW5nZWQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKQEAgLTQ2NywxMSArNDY3LDExIEBACiAJCXNfbmV3Kys7CiAJfQogCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYobmV3KTsKKwkJUHlfREVDUkVGKG5ld3N0cik7CiAJCVB5X0lOQ1JFRihhcmdzKTsKIAkJcmV0dXJuIGFyZ3M7CiAJfQotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld3N0cjsKIH0KIAogCkBAIC00ODUsMTYgKzQ4NSwxNiBAQAogewogCWNoYXIgKnMsICpzX25ldzsKIAlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKm5ldzsKKwlQeU9iamVjdCAqbmV3c3RyOwogCWludCBjaGFuZ2VkOwogCiAJV0FSTjsKIAlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCiAJCXJldHVybiBOVUxMOwotCW5ldyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXcgPT0gTlVMTCkKKwluZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKwlpZiAobmV3c3RyID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3KTsKKwlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7CiAJY2hhbmdlZCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwpAQCAtNTA2LDExICs1MDYsMTEgQEAKIAkJc19uZXcrKzsKIAl9CiAJaWYgKCFjaGFuZ2VkKSB7Ci0JCVB5X0RFQ1JFRihuZXcpOworCQlQeV9ERUNSRUYobmV3c3RyKTsKIAkJUHlfSU5DUkVGKGFyZ3MpOwogCQlyZXR1cm4gYXJnczsKIAl9Ci0JcmV0dXJuIG5ldzsKKwlyZXR1cm4gbmV3c3RyOwogfQogCiAKQEAgLTUyNSwxNiArNTI1LDE2IEBACiB7CiAJY2hhciAqcywgKnNfbmV3OwogCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdzdHI7CiAJaW50IGNoYW5nZWQ7CiAKIAlXQVJOOwogCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKIAkJcmV0dXJuIE5VTEw7Ci0JbmV3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ldyA9PSBOVUxMKQorCW5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworCWlmIChuZXdzdHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXcpOworCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKIAljaGFuZ2VkID0gMDsKIAlpZiAoMCA8IG4pIHsKIAkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKQEAgLTU1NSwxMSArNTU1LDExIEBACiAJCXNfbmV3Kys7CiAJfQogCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYobmV3KTsKKwkJUHlfREVDUkVGKG5ld3N0cik7CiAJCVB5X0lOQ1JFRihhcmdzKTsKIAkJcmV0dXJuIGFyZ3M7CiAJfQotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld3N0cjsKIH0KIAogCkBAIC02NDcsNyArNjQ3LDcgQEAKIHsKIAljaGFyICpzLCAqc3ViOwogCVB5X3NzaXplX3QgbGVuLCBuOwotCVB5X3NzaXplX3QgaSA9IDAsIGxhc3QgPSBJTlRfTUFYOworCVB5X3NzaXplX3QgaSA9IDAsIGxhc3QgPSBQWV9TU0laRV9UX01BWDsKIAlQeV9zc2l6ZV90IG0sIHI7CiAKIAlXQVJOOwpAQCAtNjkxLDE2ICs2OTEsMTYgQEAKIHsKIAljaGFyICpzLCAqc19uZXc7CiAJUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpuZXc7CisJUHlPYmplY3QgKm5ld3N0cjsKIAlpbnQgY2hhbmdlZDsKIAogCVdBUk47CiAJaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQogCQlyZXR1cm4gTlVMTDsKLQluZXcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3ID09IE5VTEwpCisJbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisJaWYgKG5ld3N0ciA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ldyk7CisJc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOwogCWNoYW5nZWQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKQEAgLTcxNywxMSArNzE3LDExIEBACiAJCXNfbmV3Kys7CiAJfQogCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYobmV3KTsKKwkJUHlfREVDUkVGKG5ld3N0cik7CiAJCVB5X0lOQ1JFRihhcmdzKTsKIAkJcmV0dXJuIGFyZ3M7CiAJfQotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld3N0cjsKIH0KIAogCkBAIC05NDIsNyArOTQyLDcgQEAKIAl9CiAKIAl0YWJsZSA9IHRhYmxlMTsKLQlpbmxlbiA9IFB5U3RyaW5nX1NpemUoaW5wdXRfb2JqKTsKKwlpbmxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGlucHV0X29iaik7CiAJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBpbmxlbik7CiAJaWYgKHJlc3VsdCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKQEAgLTEwNzgsNyArMTA3OCw3IEBACiAJLyogZmluZCBsZW5ndGggb2Ygb3V0cHV0IHN0cmluZyAqLwogCW5mb3VuZCA9IG15bWVtY250KHN0ciwgbGVuLCBwYXQsIHBhdF9sZW4pOwogCWlmIChjb3VudCA8IDApCi0JCWNvdW50ID0gSU5UX01BWDsKKwkJY291bnQgPSBQWV9TU0laRV9UX01BWDsKIAllbHNlIGlmIChuZm91bmQgPiBjb3VudCkKIAkJbmZvdW5kID0gY291bnQ7CiAJaWYgKG5mb3VuZCA9PSAwKQpAQCAtMTE0MSw3ICsxMTQxLDcgQEAKIAljaGFyICpzdHIsICpwYXQsKnN1YiwqbmV3X3M7CiAJUHlfc3NpemVfdCBsZW4scGF0X2xlbixzdWJfbGVuLG91dF9sZW47CiAJUHlfc3NpemVfdCBjb3VudCA9IC0xOwotCVB5T2JqZWN0ICpuZXc7CisJUHlPYmplY3QgKm5ld3N0cjsKIAogCVdBUk47CiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjdCN8bjpyZXBsYWNlIiwKQEAgLTExNjUsMTQgKzExNjUsMTQgQEAKIAl9CiAJaWYgKG91dF9sZW4gPT0gLTEpIHsKIAkJLyogd2UncmUgcmV0dXJuaW5nIGFub3RoZXIgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBzdHJpbmcgKi8KLQkJbmV3ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCQlQeV9YSU5DUkVGKG5ldyk7CisJCW5ld3N0ciA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKwkJUHlfWElOQ1JFRihuZXdzdHIpOwogCX0KIAllbHNlIHsKLQkJbmV3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobmV3X3MsIG91dF9sZW4pOworCQluZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuZXdfcywgb3V0X2xlbik7CiAJCVB5TWVtX0ZSRUUobmV3X3MpOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdzdHI7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aHJlYWRtb2R1bGUuYyBiL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKaW5kZXggOWE2YzVkOC4uODMzMTNkZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy90aHJlYWRtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCkBAIC0yMiwyNCArMjIsNiBAQAogCVB5VGhyZWFkX3R5cGVfbG9jayBsb2NrX2xvY2s7CiB9IGxvY2tvYmplY3Q7CiAKLXN0YXRpYyBQeVR5cGVPYmplY3QgTG9ja3R5cGU7Ci0KLXN0YXRpYyBsb2Nrb2JqZWN0ICoKLW5ld2xvY2tvYmplY3Qodm9pZCkKLXsKLQlsb2Nrb2JqZWN0ICpzZWxmOwotCXNlbGYgPSBQeU9iamVjdF9OZXcobG9ja29iamVjdCwgJkxvY2t0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5sb2NrX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKHNlbGYtPmxvY2tfbG9jayA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0X0RlbChzZWxmKTsKLQkJc2VsZiA9IE5VTEw7Ci0JCVB5RXJyX1NldFN0cmluZyhUaHJlYWRFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKLQl9Ci0JcmV0dXJuIHNlbGY7Ci19Ci0KIHN0YXRpYyB2b2lkCiBsb2NrX2RlYWxsb2MobG9ja29iamVjdCAqc2VsZikKIHsKQEAgLTE2Niw2ICsxNDgsMjIgQEAKIAkwLAkJCQkvKnRwX3JlcHIqLwogfTsKIAorc3RhdGljIGxvY2tvYmplY3QgKgorbmV3bG9ja29iamVjdCh2b2lkKQoreworCWxvY2tvYmplY3QgKnNlbGY7CisJc2VsZiA9IFB5T2JqZWN0X05ldyhsb2Nrb2JqZWN0LCAmTG9ja3R5cGUpOworCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXNlbGYtPmxvY2tfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKwlpZiAoc2VsZi0+bG9ja19sb2NrID09IE5VTEwpIHsKKwkJUHlPYmplY3RfRGVsKHNlbGYpOworCQlzZWxmID0gTlVMTDsKKwkJUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLCAiY2FuJ3QgYWxsb2NhdGUgbG9jayIpOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKwogLyogVGhyZWFkLWxvY2FsIG9iamVjdHMgKi8KIAogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgpAQCAtMTc4LDggKzE3Niw2IEBACiAJUHlPYmplY3QgKmRpY3Q7CiB9IGxvY2Fsb2JqZWN0OwogCi1zdGF0aWMgUHlUeXBlT2JqZWN0IGxvY2FsdHlwZTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGxvY2FsX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7CkBAIC0zMTUsMjkgKzMxMSw2IEBACiAJcmV0dXJuIGxkaWN0OwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotbG9jYWxfZ2V0YXR0cm8obG9jYWxvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuYW1lKQotewotCVB5T2JqZWN0ICpsZGljdCwgKnZhbHVlOwotCi0JbGRpY3QgPSBfbGRpY3Qoc2VsZik7Ci0JaWYgKGxkaWN0ID09IE5VTEwpIAotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChzZWxmLT5vYl90eXBlICE9ICZsb2NhbHR5cGUpCi0JCS8qIHVzZSBnZW5lcmljIGxvb2t1cCBmb3Igc3VidHlwZXMgKi8KLQkJcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwotCi0JLyogT3B0aW1pemF0aW9uOiBqdXN0IGxvb2sgaW4gZGljdCBvdXJzZWx2ZXMgKi8KLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKGxkaWN0LCBuYW1lKTsKLQlpZiAodmFsdWUgPT0gTlVMTCkgCi0JCS8qIEZhbGwgYmFjayBvbiBnZW5lcmljIHRvIGdldCBfX2NsYXNzX18gYW5kIF9fZGljdF9fICovCi0JCXJldHVybiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKLQotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JcmV0dXJuIHZhbHVlOwotfQotCiBzdGF0aWMgaW50CiBsb2NhbF9zZXRhdHRybyhsb2NhbG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2KQogewpAQCAtMzY4LDYgKzM0MSw4IEBACiAJe05VTEx9ICAvKiBTZW50aW5lbCAqLwogfTsKIAorc3RhdGljIFB5T2JqZWN0ICpsb2NhbF9nZXRhdHRybyhsb2NhbG9iamVjdCAqLCBQeU9iamVjdCAqKTsKKwogc3RhdGljIFB5VHlwZU9iamVjdCBsb2NhbHR5cGUgPSB7CiAJUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCiAJLyogb2Jfc2l6ZSAgICAgICAgICAgKi8gMCwKQEAgLTM3NSwxNyArMzUwLDE3IEBACiAJLyogdHBfYmFzaWNzaXplICAgICAgKi8gc2l6ZW9mKGxvY2Fsb2JqZWN0KSwKIAkvKiB0cF9pdGVtc2l6ZSAgICAgICAqLyAwLAogCS8qIHRwX2RlYWxsb2MgICAgICAgICovIChkZXN0cnVjdG9yKWxvY2FsX2RlYWxsb2MsCi0JLyogdHBfcHJpbnQgICAgICAgICAgKi8gKHByaW50ZnVuYykwLAotCS8qIHRwX2dldGF0dHIgICAgICAgICovIChnZXRhdHRyZnVuYykwLAotCS8qIHRwX3NldGF0dHIgICAgICAgICovIChzZXRhdHRyZnVuYykwLAotCS8qIHRwX2NvbXBhcmUgICAgICAgICovIChjbXBmdW5jKTAsCi0JLyogdHBfcmVwciAgICAgICAgICAgKi8gKHJlcHJmdW5jKTAsCisJLyogdHBfcHJpbnQgICAgICAgICAgKi8gMCwKKwkvKiB0cF9nZXRhdHRyICAgICAgICAqLyAwLAorCS8qIHRwX3NldGF0dHIgICAgICAgICovIDAsCisJLyogdHBfY29tcGFyZSAgICAgICAgKi8gMCwKKwkvKiB0cF9yZXByICAgICAgICAgICAqLyAwLAogCS8qIHRwX2FzX251bWJlciAgICAgICovIDAsCiAJLyogdHBfYXNfc2VxdWVuY2UgICAgKi8gMCwKIAkvKiB0cF9hc19tYXBwaW5nICAgICAqLyAwLAotCS8qIHRwX2hhc2ggICAgICAgICAgICovIChoYXNoZnVuYykwLAotCS8qIHRwX2NhbGwgICAgICAgICAgICovICh0ZXJuYXJ5ZnVuYykwLAotCS8qIHRwX3N0ciAgICAgICAgICAgICovIChyZXByZnVuYykwLAorCS8qIHRwX2hhc2ggICAgICAgICAgICovIDAsCisJLyogdHBfY2FsbCAgICAgICAgICAgKi8gMCwKKwkvKiB0cF9zdHIgICAgICAgICAgICAqLyAwLAogCS8qIHRwX2dldGF0dHJvICAgICAgICovIChnZXRhdHRyb2Z1bmMpbG9jYWxfZ2V0YXR0cm8sCiAJLyogdHBfc2V0YXR0cm8gICAgICAgKi8gKHNldGF0dHJvZnVuYylsb2NhbF9zZXRhdHRybywKIAkvKiB0cF9hc19idWZmZXIgICAgICAqLyAwLApAQCAtMzkzLDI1ICszNjgsNDcgQEAKIAkvKiB0cF9kb2MgICAgICAgICAgICAqLyAiVGhyZWFkLWxvY2FsIGRhdGEiLAogCS8qIHRwX3RyYXZlcnNlICAgICAgICovICh0cmF2ZXJzZXByb2MpbG9jYWxfdHJhdmVyc2UsCiAJLyogdHBfY2xlYXIgICAgICAgICAgKi8gKGlucXVpcnkpbG9jYWxfY2xlYXIsCi0JLyogdHBfcmljaGNvbXBhcmUgICAgKi8gKHJpY2hjbXBmdW5jKTAsCi0JLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8gKGxvbmcpMCwKLQkvKiB0cF9pdGVyICAgICAgICAgICAqLyAoZ2V0aXRlcmZ1bmMpMCwKLQkvKiB0cF9pdGVybmV4dCAgICAgICAqLyAoaXRlcm5leHRmdW5jKTAsCisJLyogdHBfcmljaGNvbXBhcmUgICAgKi8gMCwKKwkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLyAwLAorCS8qIHRwX2l0ZXIgICAgICAgICAgICovIDAsCisJLyogdHBfaXRlcm5leHQgICAgICAgKi8gMCwKIAkvKiB0cF9tZXRob2RzICAgICAgICAqLyAwLAogCS8qIHRwX21lbWJlcnMgICAgICAgICovIDAsCiAJLyogdHBfZ2V0c2V0ICAgICAgICAgKi8gbG9jYWxfZ2V0c2V0LAogCS8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCiAJLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwgLyogaW50ZXJuYWwgdXNlICovCi0JLyogdHBfZGVzY3JfZ2V0ICAgICAgKi8gKGRlc2NyZ2V0ZnVuYykwLAotCS8qIHRwX2Rlc2NyX3NldCAgICAgICovIChkZXNjcnNldGZ1bmMpMCwKKwkvKiB0cF9kZXNjcl9nZXQgICAgICAqLyAwLAorCS8qIHRwX2Rlc2NyX3NldCAgICAgICovIDAsCiAJLyogdHBfZGljdG9mZnNldCAgICAgKi8gb2Zmc2V0b2YobG9jYWxvYmplY3QsIGRpY3QpLAotCS8qIHRwX2luaXQgICAgICAgICAgICovIChpbml0cHJvYykwLAotCS8qIHRwX2FsbG9jICAgICAgICAgICovIChhbGxvY2Z1bmMpMCwKLQkvKiB0cF9uZXcgICAgICAgICAgICAqLyAobmV3ZnVuYylsb2NhbF9uZXcsCisJLyogdHBfaW5pdCAgICAgICAgICAgKi8gMCwKKwkvKiB0cF9hbGxvYyAgICAgICAgICAqLyAwLAorCS8qIHRwX25ldyAgICAgICAgICAgICovIGxvY2FsX25ldywKIAkvKiB0cF9mcmVlICAgICAgICAgICAqLyAwLCAvKiBMb3ctbGV2ZWwgZnJlZS1tZW0gcm91dGluZSAqLwotCS8qIHRwX2lzX2djICAgICAgICAgICovIChpbnF1aXJ5KTAsIC8qIEZvciBQeU9iamVjdF9JU19HQyAqLworCS8qIHRwX2lzX2djICAgICAgICAgICovIDAsIC8qIEZvciBQeU9iamVjdF9JU19HQyAqLwogfTsKIAorc3RhdGljIFB5T2JqZWN0ICoKK2xvY2FsX2dldGF0dHJvKGxvY2Fsb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbmFtZSkKK3sKKwlQeU9iamVjdCAqbGRpY3QsICp2YWx1ZTsKKworCWxkaWN0ID0gX2xkaWN0KHNlbGYpOworCWlmIChsZGljdCA9PSBOVUxMKSAKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoc2VsZi0+b2JfdHlwZSAhPSAmbG9jYWx0eXBlKQorCQkvKiB1c2UgZ2VuZXJpYyBsb29rdXAgZm9yIHN1YnR5cGVzICovCisJCXJldHVybiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKworCS8qIE9wdGltaXphdGlvbjoganVzdCBsb29rIGluIGRpY3Qgb3Vyc2VsdmVzICovCisJdmFsdWUgPSBQeURpY3RfR2V0SXRlbShsZGljdCwgbmFtZSk7CisJaWYgKHZhbHVlID09IE5VTEwpIAorCQkvKiBGYWxsIGJhY2sgb24gZ2VuZXJpYyB0byBnZXQgX19jbGFzc19fIGFuZCBfX2RpY3RfXyAqLworCQlyZXR1cm4gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisKKwlQeV9JTkNSRUYodmFsdWUpOworCXJldHVybiB2YWx1ZTsKK30KIAogLyogTW9kdWxlIGZ1bmN0aW9ucyAqLwogCkBAIC01NjAsNiArNTU3LDggQEAKIH0KICNlbmRpZgogCitzdGF0aWMgbG9ja29iamVjdCAqbmV3bG9ja29iamVjdCh2b2lkKTsKKwogc3RhdGljIFB5T2JqZWN0ICoKIHRocmVhZF9QeVRocmVhZF9hbGxvY2F0ZV9sb2NrKFB5T2JqZWN0ICpzZWxmKQogewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwppbmRleCBiYTkzOTU3Li4wOGQyOGExIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwpAQCAtMjI4LDYgKzIyOCw3IEBACiAJOSwKIH07CiAKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0cnVjdFRpbWVUeXBlOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDQzLDcgKzQ0NCw3IEBACiAJICogd2lsbCBiZSBhaGVhZCBvZiB0aW1lLi4uCiAJICovCiAJZm9yIChpID0gMTAyNDsgOyBpICs9IGkpIHsKLQkJb3V0YnVmID0gbWFsbG9jKGkpOworCQlvdXRidWYgPSAoY2hhciAqKW1hbGxvYyhpKTsKIAkJaWYgKG91dGJ1ZiA9PSBOVUxMKSB7CiAJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAkJfQpAQCAtODA3LDkgKzgwOCwxMyBAQAogCWhJbnRlcnJ1cHRFdmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKIAlTZXRDb25zb2xlQ3RybEhhbmRsZXIoIFB5Q3RybEhhbmRsZXIsIFRSVUUpOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KLSAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0VGltZVR5cGUsICZzdHJ1Y3RfdGltZV90eXBlX2Rlc2MpOworCWlmICghaW5pdGlhbGl6ZWQpIHsKKwkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0VGltZVR5cGUsIAorCQkJCQkgICZzdHJ1Y3RfdGltZV90eXBlX2Rlc2MpOworCX0KIAlQeV9JTkNSRUYoJlN0cnVjdFRpbWVUeXBlKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgInN0cnVjdF90aW1lIiwgKFB5T2JqZWN0KikgJlN0cnVjdFRpbWVUeXBlKTsKKwlpbml0aWFsaXplZCA9IDE7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy91bmljb2RlZGF0YS5jIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCmluZGV4IDllZGE2NTMuLjI5NzYxMWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdW5pY29kZWRhdGEuYworKysgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKQEAgLTQ0Niw3ICs0NDYsNyBAQAogICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlY29tcCk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBnZXRfZGVjb21wX3JlY29yZChQeU9iamVjdCAqc2VsZiwgUHlfVUNTNCBjb2RlLCBpbnQgKmluZGV4LCBpbnQgKnByZWZpeCwgaW50ICpjb3VudCkKIHsKICAgICBpZiAoY29kZSA+PSAweDExMDAwMCkgewpAQCAtNDg2LDggKzQ4Niw4IEBACiAgICAgUHlfVU5JQ09ERSAqaSwgKmVuZCwgKm87CiAgICAgLyogTG9uZ2VzdCBkZWNvbXBvc2l0aW9uIGluIFVuaWNvZGUgMy4yOiBVK0ZERkEgKi8KICAgICBQeV9VTklDT0RFIHN0YWNrWzIwXTsgCi0gICAgaW50IHNwYWNlLCBzdGFja3B0ciwgaXNpemU7Ci0gICAgaW50IGluZGV4LCBwcmVmaXgsIGNvdW50OworICAgIFB5X3NzaXplX3Qgc3BhY2UsIGlzaXplOworICAgIGludCBpbmRleCwgcHJlZml4LCBjb3VudCwgc3RhY2twdHI7CiAgICAgdW5zaWduZWQgY2hhciBwcmV2LCBjdXI7CiAJCiAgICAgc3RhY2twdHIgPSAwOwpAQCAtNTA4LDcgKzUwOCw3IEBACiAgICAgICAgICAgICAvKiBIYW5ndWwgRGVjb21wb3NpdGlvbiBhZGRzIHRocmVlIGNoYXJhY3RlcnMgaW4KICAgICAgICAgICAgICAgIGEgc2luZ2xlIHN0ZXAsIHNvIHdlIG5lZWQgYXRsZWFzdCB0aGF0IG11Y2ggcm9vbS4gKi8KICAgICAgICAgICAgIGlmIChzcGFjZSA8IDMpIHsKLSAgICAgICAgICAgICAgICBpbnQgbmV3c2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHJlc3VsdCkgKyAxMDsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5ld3NpemUgPSBQeVN0cmluZ19HRVRfU0laRShyZXN1bHQpICsgMTA7CiAgICAgICAgICAgICAgICAgc3BhY2UgKz0gMTA7CiAgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9SZXNpemUoJnJlc3VsdCwgbmV3c2l6ZSkgPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNzU5LDcgKzc1OSw3IEBACiAgICAgdW5zaWduZWQgbG9uZyBoID0gMDsKICAgICB1bnNpZ25lZCBsb25nIGl4OwogICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICBoID0gKGggKiBzY2FsZSkgKyAodW5zaWduZWQgY2hhcikgdG91cHBlcihzW2ldKTsKKyAgICAgICAgaCA9IChoICogc2NhbGUpICsgKHVuc2lnbmVkIGNoYXIpIHRvdXBwZXIoUHlfQ0hBUk1BU0soc1tpXSkpOwogICAgICAgICBpeCA9IGggJiAweGZmMDAwMDAwOwogICAgICAgICBpZiAoaXgpCiAgICAgICAgICAgICBoID0gKGggXiAoKGl4Pj4yNCkgJiAweGZmKSkgJiAweDAwZmZmZmZmOwpAQCAtOTA2LDcgKzkwNiw3IEBACiAgICAgaWYgKCFfZ2V0dWNuYW1lKHNlbGYsIGNvZGUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQogICAgICAgICByZXR1cm4gMDsKICAgICBmb3IgKGkgPSAwOyBpIDwgbmFtZWxlbjsgaSsrKSB7Ci0gICAgICAgIGlmICh0b3VwcGVyKG5hbWVbaV0pICE9IGJ1ZmZlcltpXSkKKyAgICAgICAgaWYgKHRvdXBwZXIoUHlfQ0hBUk1BU0sobmFtZVtpXSkpICE9IGJ1ZmZlcltpXSkKICAgICAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICByZXR1cm4gYnVmZmVyW25hbWVsZW5dID09ICdcMCc7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3h4c3VidHlwZS5jIGIvTW9kdWxlcy94eHN1YnR5cGUuYwppbmRleCBmZmJjNzJiLi44OGNlNmM1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3h4c3VidHlwZS5jCisrKyBiL01vZHVsZXMveHhzdWJ0eXBlLmMKQEAgLTc5LDggKzc5LDYgQEAKIAl7TlVMTCwJTlVMTH0sCiB9OwogCi1zdGF0aWMgUHlUeXBlT2JqZWN0IHNwYW1saXN0X3R5cGU7Ci0KIHN0YXRpYyBpbnQKIHNwYW1saXN0X2luaXQoc3BhbWxpc3RvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKQEAgLTE3OSw4ICsxNzcsNiBAQAogCXtOVUxMLAlOVUxMfSwKIH07CiAKLXN0YXRpYyBQeVR5cGVPYmplY3Qgc3BhbWRpY3RfdHlwZTsKLQogc3RhdGljIGludAogc3BhbWRpY3RfaW5pdChzcGFtZGljdG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96aXBpbXBvcnQuYyBiL01vZHVsZXMvemlwaW1wb3J0LmMKaW5kZXggNjM3ZGM0OC4uZDU5ZWJkOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy96aXBpbXBvcnQuYworKysgYi9Nb2R1bGVzL3ppcGltcG9ydC5jCkBAIC00MCw3ICs0MCw2IEBACiAJUHlPYmplY3QgKmZpbGVzOyAgICAvKiBkaWN0IHdpdGggZmlsZSBpbmZvIHtwYXRoOiB0b2NfZW50cnl9ICovCiB9OwogCi1zdGF0aWMgUHlUeXBlT2JqZWN0IFppcEltcG9ydGVyX1R5cGU7CiBzdGF0aWMgUHlPYmplY3QgKlppcEltcG9ydEVycm9yOwogc3RhdGljIFB5T2JqZWN0ICp6aXBfZGlyZWN0b3J5X2NhY2hlID0gTlVMTDsKIApAQCAtMTcxLDEzICsxNzAsNyBAQAogemlwaW1wb3J0ZXJfdHJhdmVyc2UoUHlPYmplY3QgKm9iaiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7CiAJWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7Ci0JaW50IGVycjsKLQotCWlmIChzZWxmLT5maWxlcyAhPSBOVUxMKSB7Ci0JCWVyciA9IHZpc2l0KHNlbGYtPmZpbGVzLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9CisJUHlfVklTSVQoc2VsZi0+ZmlsZXMpOwogCXJldHVybiAwOwogfQogCkBAIC05NTgsNyArOTUxLDcgQEAKIAlQeU9iamVjdCAqZml4ZWRfc291cmNlOwogCiAJLyogb25lIGNoYXIgZXh0cmEgZm9yIHRyYWlsaW5nIFxuIGFuZCBvbmUgZm9yIHRlcm1pbmF0aW5nIFwwICovCi0JYnVmID0gUHlNZW1fTWFsbG9jKFB5U3RyaW5nX1NpemUoc291cmNlKSArIDIpOworCWJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKFB5U3RyaW5nX1NpemUoc291cmNlKSArIDIpOwogCWlmIChidWYgPT0gTlVMTCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCiAJCQkJInppcGltcG9ydDogbm8gbWVtb3J5IHRvIGFsbG9jYXRlICIKZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYm1vZHVsZS5jIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKaW5kZXggNzI1NzU1ZC4uMzViOGMzMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGlibW9kdWxlLmMKKysrIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKQEAgLTY1NCw3ICs2NTQsOSBAQAogfQogCiBQeURvY19TVFJWQVIoZGVjb21wX2ZsdXNoX19kb2NfXywKLSJmbHVzaCgpIC0tIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFueSByZW1haW5pbmcgZGVjb21wcmVzc2VkIGRhdGEuXG4iCisiZmx1c2goIFtsZW5ndGhdICkgLS0gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW55IHJlbWFpbmluZ1xuIgorImRlY29tcHJlc3NlZCBkYXRhLiBsZW5ndGgsIGlmIGdpdmVuLCBpcyB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZVxuIgorIm91dHB1dCBidWZmZXIuXG4iCiAiXG4iCiAiVGhlIGRlY29tcHJlc3NvciBvYmplY3QgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGFmdGVyIHRoaXMgY2FsbC4iKTsKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9hYnN0cmFjdC5jIGIvT2JqZWN0cy9hYnN0cmFjdC5jCmluZGV4IGM3NTU2NTQuLjEzYTk0NzMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYWJzdHJhY3QuYworKysgYi9PYmplY3RzL2Fic3RyYWN0LmMKQEAgLTEwLDYgKzEwLDcgQEAKIAogI2RlZmluZSBIQVNJTkRFWChvKSBQeVR5cGVfSGFzRmVhdHVyZSgobyktPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9JTkRFWCkKIAorCiAvKiBTaG9ydGhhbmRzIHRvIHJldHVybiBjZXJ0YWluIGVycm9ycyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtOTQwLDggKzk0MSw5IEBACiAJCXZhbHVlID0gbmItPm5iX2luZGV4KGl0ZW0pOwogCX0KIAllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsIAotCQkJCSJvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4Iik7CisJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCQkgICAgICInJS4yMDBzJyBvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkICIKKwkJCSAgICAgImFzIGFuIGluZGV4IiwgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJfQogCXJldHVybiB2YWx1ZTsKIH0KQEAgLTEyNDUsMjQgKzEyNDcsNiBAQAogCXJldHVybiB0eXBlX2Vycm9yKCJ1bmluZGV4YWJsZSBvYmplY3QiKTsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICoKLXNsaWNlb2JqX2Zyb21faW50aW50KFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBqKQotewotCVB5T2JqZWN0ICpzdGFydCwgKmVuZCwgKnNsaWNlOwotCXN0YXJ0ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaSk7Ci0JaWYgKCFzdGFydCkKLQkJcmV0dXJuIE5VTEw7Ci0JZW5kID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaik7Ci0JaWYgKCFlbmQpIHsKLQkJUHlfREVDUkVGKHN0YXJ0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNsaWNlID0gUHlTbGljZV9OZXcoc3RhcnQsIGVuZCwgTlVMTCk7Ci0JUHlfREVDUkVGKHN0YXJ0KTsKLQlQeV9ERUNSRUYoZW5kKTsKLQlyZXR1cm4gc2xpY2U7Ci19Ci0KIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfR2V0U2xpY2UoUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIpCiB7CkBAIC0xMjg3LDcgKzEyNzEsNyBAQAogCQlyZXR1cm4gbS0+c3Ffc2xpY2UocywgaTEsIGkyKTsKIAl9IGVsc2UgaWYgKChtcCA9IHMtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcpICYmIG1wLT5tcF9zdWJzY3JpcHQpIHsKIAkJUHlPYmplY3QgKnJlczsKLQkJUHlPYmplY3QgKnNsaWNlID0gc2xpY2VvYmpfZnJvbV9pbnRpbnQoaTEsIGkyKTsKKwkJUHlPYmplY3QgKnNsaWNlID0gX1B5U2xpY2VfRnJvbUluZGljZXMoaTEsIGkyKTsKIAkJaWYgKCFzbGljZSkKIAkJCXJldHVybiBOVUxMOwogCQlyZXMgPSBtcC0+bXBfc3Vic2NyaXB0KHMsIHNsaWNlKTsKQEAgLTEzNzksNyArMTM2Myw3IEBACiAJCXJldHVybiBtLT5zcV9hc3Nfc2xpY2UocywgaTEsIGkyLCBvKTsKIAl9IGVsc2UgaWYgKChtcCA9IHMtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcpICYmIG1wLT5tcF9hc3Nfc3Vic2NyaXB0KSB7CiAJCWludCByZXM7Ci0JCVB5T2JqZWN0ICpzbGljZSA9IHNsaWNlb2JqX2Zyb21faW50aW50KGkxLCBpMik7CisJCVB5T2JqZWN0ICpzbGljZSA9IF9QeVNsaWNlX0Zyb21JbmRpY2VzKGkxLCBpMik7CiAJCWlmICghc2xpY2UpCiAJCQlyZXR1cm4gLTE7CiAJCXJlcyA9IG1wLT5tcF9hc3Nfc3Vic2NyaXB0KHMsIHNsaWNlLCBvKTsKQEAgLTE4MTUsMTEgKzE3OTksMzcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIFB5T2JqZWN0KgorY2FsbF9mdW5jdGlvbl90YWlsKFB5T2JqZWN0ICpjYWxsYWJsZSwgUHlPYmplY3QgKmFyZ3MpCit7CisJUHlPYmplY3QgKnJldHZhbDsKKworCWlmIChhcmdzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisJCVB5T2JqZWN0ICphOworCisJCWEgPSBQeVR1cGxlX05ldygxKTsKKwkJaWYgKGEgPT0gTlVMTCkgeworCQkJUHlfREVDUkVGKGFyZ3MpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJUHlUdXBsZV9TRVRfSVRFTShhLCAwLCBhcmdzKTsKKwkJYXJncyA9IGE7CisJfQorCXJldHZhbCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOworCisJUHlfREVDUkVGKGFyZ3MpOworCisJcmV0dXJuIHJldHZhbDsKK30KKwogUHlPYmplY3QgKgogUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5T2JqZWN0ICpjYWxsYWJsZSwgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAJdmFfbGlzdCB2YTsKLQlQeU9iamVjdCAqYXJncywgKnJldHZhbDsKKwlQeU9iamVjdCAqYXJnczsKIAogCWlmIChjYWxsYWJsZSA9PSBOVUxMKQogCQlyZXR1cm4gbnVsbF9lcnJvcigpOwpAQCAtMTgzMiwzMSArMTg0MiwzNCBAQAogCWVsc2UKIAkJYXJncyA9IFB5VHVwbGVfTmV3KDApOwogCi0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGNhbGxfZnVuY3Rpb25fdGFpbChjYWxsYWJsZSwgYXJncyk7Cit9CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJUHlPYmplY3QgKmE7CitQeU9iamVjdCAqCitfUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUKFB5T2JqZWN0ICpjYWxsYWJsZSwgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKwlQeU9iamVjdCAqYXJnczsKIAotCQlhID0gUHlUdXBsZV9OZXcoMSk7Ci0JCWlmIChhID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKFB5VHVwbGVfU2V0SXRlbShhLCAwLCBhcmdzKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJYXJncyA9IGE7CisJaWYgKGNhbGxhYmxlID09IE5VTEwpCisJCXJldHVybiBudWxsX2Vycm9yKCk7CisKKwlpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKKwkJdmFfc3RhcnQodmEsIGZvcm1hdCk7CisJCWFyZ3MgPSBfUHlfVmFCdWlsZFZhbHVlX1NpemVUKGZvcm1hdCwgdmEpOworCQl2YV9lbmQodmEpOwogCX0KLQlyZXR2YWwgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBhcmdzLCBOVUxMKTsKKwllbHNlCisJCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKIAotCVB5X0RFQ1JFRihhcmdzKTsKLQotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGNhbGxfZnVuY3Rpb25fdGFpbChjYWxsYWJsZSwgYXJncyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0NhbGxNZXRob2QoUHlPYmplY3QgKm8sIGNoYXIgKm5hbWUsIGNoYXIgKmZvcm1hdCwgLi4uKQogewogCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QgKmFyZ3MgPSBOVUxMOworCVB5T2JqZWN0ICphcmdzOwogCVB5T2JqZWN0ICpmdW5jID0gTlVMTDsKIAlQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKIApAQCAtMTg4MiwyNCArMTg5NSw0OSBAQAogCWVsc2UKIAkJYXJncyA9IFB5VHVwbGVfTmV3KDApOwogCi0JaWYgKCFhcmdzKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJUHlPYmplY3QgKmE7Ci0KLQkJYSA9IFB5VHVwbGVfTmV3KDEpOwotCQlpZiAoYSA9PSBOVUxMKQotCQkJZ290byBleGl0OwotCQlpZiAoUHlUdXBsZV9TZXRJdGVtKGEsIDAsIGFyZ3MpIDwgMCkKLQkJCWdvdG8gZXhpdDsKLQkJYXJncyA9IGE7Ci0JfQotCi0JcmV0dmFsID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKKwlyZXR2YWwgPSBjYWxsX2Z1bmN0aW9uX3RhaWwoZnVuYywgYXJncyk7CiAKICAgZXhpdDoKLQlQeV9YREVDUkVGKGFyZ3MpOworCS8qIGFyZ3MgZ2V0cyBjb25zdW1lZCBpbiBjYWxsX2Z1bmN0aW9uX3RhaWwgKi8KKwlQeV9YREVDUkVGKGZ1bmMpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworUHlPYmplY3QgKgorX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQoUHlPYmplY3QgKm8sIGNoYXIgKm5hbWUsIGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisJUHlPYmplY3QgKmFyZ3M7CisJUHlPYmplY3QgKmZ1bmMgPSBOVUxMOworCVB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOworCisJaWYgKG8gPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCisJCXJldHVybiBudWxsX2Vycm9yKCk7CisKKwlmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvLCBuYW1lKTsKKwlpZiAoZnVuYyA9PSBOVUxMKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworCQl0eXBlX2Vycm9yKCJjYWxsIG9mIG5vbi1jYWxsYWJsZSBhdHRyaWJ1dGUiKTsgCisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKKwkJdmFfc3RhcnQodmEsIGZvcm1hdCk7CisJCWFyZ3MgPSBfUHlfVmFCdWlsZFZhbHVlX1NpemVUKGZvcm1hdCwgdmEpOworCQl2YV9lbmQodmEpOworCX0KKwllbHNlCisJCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKworCXJldHZhbCA9IGNhbGxfZnVuY3Rpb25fdGFpbChmdW5jLCBhcmdzKTsKKworICBleGl0OgorCS8qIGFyZ3MgZ2V0cyBjb25zdW1lZCBpbiBjYWxsX2Z1bmN0aW9uX3RhaWwgKi8KIAlQeV9YREVDUkVGKGZ1bmMpOwogCiAJcmV0dXJuIHJldHZhbDsKZGlmZiAtLWdpdCBhL09iamVjdHMvYm9vbG9iamVjdC5jIGIvT2JqZWN0cy9ib29sb2JqZWN0LmMKaW5kZXggMDU3ODRlNS4uNzliZTE4NCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9ib29sb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9ib29sb2JqZWN0LmMKQEAgLTEwMyw0MiArMTAzLDQyIEBACiAvKiBBcml0aG1ldGljIG1ldGhvZHMgLS0gb25seSBzbyB3ZSBjYW4gb3ZlcnJpZGUgJiwgfCwgXi4gKi8KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBib29sX2FzX251bWJlciA9IHsKLQkwLAkJCQkJLyogbmJfYWRkICovCi0JMCwJCQkJCS8qIG5iX3N1YnRyYWN0ICovCi0JMCwJCQkJCS8qIG5iX211bHRpcGx5ICovCi0JMCwJCQkJCS8qIG5iX3JlbWFpbmRlciAqLwotCTAsCQkJCQkvKiBuYl9kaXZtb2QgKi8KLQkwLAkJCQkJLyogbmJfcG93ZXIgKi8KLQkwLAkJCQkJLyogbmJfbmVnYXRpdmUgKi8KLQkwLAkJCQkJLyogbmJfcG9zaXRpdmUgKi8KLQkwLAkJCQkJLyogbmJfYWJzb2x1dGUgKi8KLQkwLAkJCQkJLyogbmJfbm9uemVybyAqLwotCTAsCQkJCQkvKiBuYl9pbnZlcnQgKi8KLQkwLAkJCQkJLyogbmJfbHNoaWZ0ICovCi0JMCwJCQkJCS8qIG5iX3JzaGlmdCAqLwotCShiaW5hcnlmdW5jKWJvb2xfYW5kLAkJCS8qIG5iX2FuZCAqLwotCShiaW5hcnlmdW5jKWJvb2xfeG9yLAkJCS8qIG5iX3hvciAqLwotCShiaW5hcnlmdW5jKWJvb2xfb3IsCQkJLyogbmJfb3IgKi8KLQkwLAkJCQkJLyogbmJfY29lcmNlICovCi0JMCwJCQkJCS8qIG5iX2ludCAqLwotCTAsCQkJCQkvKiBuYl9sb25nICovCi0JMCwJCQkJCS8qIG5iX2Zsb2F0ICovCi0JMCwJCQkJCS8qIG5iX29jdCAqLwotCTAsCQkgCQkJLyogbmJfaGV4ICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfYWRkICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9tdWx0aXBseSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3Bvd2VyICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfYW5kICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfeG9yICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2Vfb3IgKi8KLQkwLAkJCQkJLyogbmJfZmxvb3JfZGl2aWRlICovCi0JMCwJCQkJCS8qIG5iX3RydWVfZGl2aWRlICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KKwkwLAkJCS8qIG5iX2FkZCAqLworCTAsCQkJLyogbmJfc3VidHJhY3QgKi8KKwkwLAkJCS8qIG5iX211bHRpcGx5ICovCisJMCwJCQkvKiBuYl9yZW1haW5kZXIgKi8KKwkwLAkJCS8qIG5iX2Rpdm1vZCAqLworCTAsCQkJLyogbmJfcG93ZXIgKi8KKwkwLAkJCS8qIG5iX25lZ2F0aXZlICovCisJMCwJCQkvKiBuYl9wb3NpdGl2ZSAqLworCTAsCQkJLyogbmJfYWJzb2x1dGUgKi8KKwkwLAkJCS8qIG5iX25vbnplcm8gKi8KKwkwLAkJCS8qIG5iX2ludmVydCAqLworCTAsCQkJLyogbmJfbHNoaWZ0ICovCisJMCwJCQkvKiBuYl9yc2hpZnQgKi8KKwlib29sX2FuZCwJCS8qIG5iX2FuZCAqLworCWJvb2xfeG9yLAkJLyogbmJfeG9yICovCisJYm9vbF9vciwJCS8qIG5iX29yICovCisJMCwJCQkvKiBuYl9jb2VyY2UgKi8KKwkwLAkJCS8qIG5iX2ludCAqLworCTAsCQkJLyogbmJfbG9uZyAqLworCTAsCQkJLyogbmJfZmxvYXQgKi8KKwkwLAkJCS8qIG5iX29jdCAqLworCTAsCQkgCS8qIG5iX2hleCAqLworCTAsCQkJLyogbmJfaW5wbGFjZV9hZGQgKi8KKwkwLAkJCS8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KKwkwLAkJCS8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KKwkwLAkJCS8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCisJMCwJCQkvKiBuYl9pbnBsYWNlX3Bvd2VyICovCisJMCwJCQkvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLworCTAsCQkJLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KKwkwLAkJCS8qIG5iX2lucGxhY2VfYW5kICovCisJMCwJCQkvKiBuYl9pbnBsYWNlX3hvciAqLworCTAsCQkJLyogbmJfaW5wbGFjZV9vciAqLworCTAsCQkJLyogbmJfZmxvb3JfZGl2aWRlICovCisJMCwJCQkvKiBuYl90cnVlX2RpdmlkZSAqLworCTAsCQkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KKwkwLAkJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KIH07CiAKIC8qIFRoZSB0eXBlIG9iamVjdCBmb3IgYm9vbC4gIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBiZSBzdWJjbGFzc2VkISAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9idWZmZXJvYmplY3QuYyBiL09iamVjdHMvYnVmZmVyb2JqZWN0LmMKaW5kZXggZWZmMDZhYS4uZDI1OTdiOSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9idWZmZXJvYmplY3QuYworKysgYi9PYmplY3RzL2J1ZmZlcm9iamVjdC5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAl9CiAJLyogWFhYOiBjaGVjayBmb3Igb3ZlcmZsb3cgaW4gbXVsdGlwbHkgKi8KIAkvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCi0JbyA9IFB5T2JqZWN0X01BTExPQyhzaXplb2YoKmIpICsgc2l6ZSk7CisJbyA9IChQeU9iamVjdCAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoKmIpICsgc2l6ZSk7CiAJaWYgKCBvID09IE5VTEwgKQogCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAliID0gKFB5QnVmZmVyT2JqZWN0ICopIFB5T2JqZWN0X0lOSVQobywgJlB5QnVmZmVyX1R5cGUpOwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJUHlfc3NpemVfdCBzaXplOwogCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSkpCiAJCXJldHVybiBOVUxMOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIsIHNpemUpOworCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciAqKXB0ciwgc2l6ZSk7CiB9CiAKIC8qIFNlcXVlbmNlIG1ldGhvZHMgKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvY2VsbG9iamVjdC5jIGIvT2JqZWN0cy9jZWxsb2JqZWN0LmMKaW5kZXggM2I4NzA5My4uZGE0OGRlYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jZWxsb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jZWxsb2JqZWN0LmMKQEAgLTczLDE5ICs3MywyOSBAQAogc3RhdGljIGludAogY2VsbF90cmF2ZXJzZShQeUNlbGxPYmplY3QgKm9wLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpZiAob3AtPm9iX3JlZikKLQkJcmV0dXJuIHZpc2l0KG9wLT5vYl9yZWYsIGFyZyk7CisJUHlfVklTSVQob3AtPm9iX3JlZik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGNlbGxfY2xlYXIoUHlDZWxsT2JqZWN0ICpvcCkKIHsKLQlQeV9YREVDUkVGKG9wLT5vYl9yZWYpOwotCW9wLT5vYl9yZWYgPSBOVUxMOworCVB5X0NMRUFSKG9wLT5vYl9yZWYpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgUHlPYmplY3QgKgorY2VsbF9nZXRfY29udGVudHMoUHlDZWxsT2JqZWN0ICpvcCwgdm9pZCAqY2xvc3VyZSkKK3sKKwlQeV9YSU5DUkVGKG9wLT5vYl9yZWYpOworCXJldHVybiBvcC0+b2JfcmVmOworfQorCitzdGF0aWMgUHlHZXRTZXREZWYgY2VsbF9nZXRzZXRsaXN0W10gPSB7CisJeyJjZWxsX2NvbnRlbnRzIiwgKGdldHRlciljZWxsX2dldF9jb250ZW50cywgTlVMTH0sCisJe05VTEx9IC8qIHNlbnRpbmVsICovCit9OworCiBQeVR5cGVPYmplY3QgUHlDZWxsX1R5cGUgPSB7CiAJUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKIAkwLApAQCAtMTExLDQgKzEyMSwxMSBAQAogIAkwLAkJCQkJLyogdHBfZG9jICovCiAgCSh0cmF2ZXJzZXByb2MpY2VsbF90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCiAgCShpbnF1aXJ5KWNlbGxfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KKwkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKwkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKwkwLCAJCQkJCS8qIHRwX2l0ZXIgKi8KKwkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KKwkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLworCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCisJY2VsbF9nZXRzZXRsaXN0LAkJCS8qIHRwX2dldHNldCAqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvY2xhc3NvYmplY3QuYyBiL09iamVjdHMvY2xhc3NvYmplY3QuYwppbmRleCA5M2FjYjUwLi41OTRkZTExIDEwMDY0NAotLS0gYS9PYmplY3RzL2NsYXNzb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jbGFzc29iamVjdC5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIHsKIAlyZWdpc3RlciBQeU9iamVjdCAqdjsKIAlyZWdpc3RlciBjaGFyICpzbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOwotCVB5Q2xhc3NPYmplY3QgKmNsYXNzOworCVB5Q2xhc3NPYmplY3QgKmtsYXNzOwogCWRlc2NyZ2V0ZnVuYyBmOwogCiAJaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKQEAgLTIzNCw3ICsyMzQsNyBAQAogCQkJcmV0dXJuIHY7CiAJCX0KIAl9Ci0JdiA9IGNsYXNzX2xvb2t1cChvcCwgbmFtZSwgJmNsYXNzKTsKKwl2ID0gY2xhc3NfbG9va3VwKG9wLCBuYW1lLCAma2xhc3MpOwogCWlmICh2ID09IE5VTEwpIHsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAogCQkJICAgICAiY2xhc3MgJS41MHMgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCkBAIC0zODgsMTUgKzM4OCwxNSBAQAogCQlQeV9JTkNSRUYobmFtZSk7CiAJCXJldHVybiBuYW1lOwogCX0KLQltID0gUHlTdHJpbmdfU2l6ZShtb2QpOwotCW4gPSBQeVN0cmluZ19TaXplKG5hbWUpOworCW0gPSBQeVN0cmluZ19HRVRfU0laRShtb2QpOworCW4gPSBQeVN0cmluZ19HRVRfU0laRShuYW1lKTsKIAlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG0rMStuKTsKIAlpZiAocmVzICE9IE5VTEwpIHsKLQkJY2hhciAqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcyk7Ci0JCW1lbWNweShzLCBQeVN0cmluZ19Bc1N0cmluZyhtb2QpLCBtKTsKKwkJY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXMpOworCQltZW1jcHkocywgUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCksIG0pOwogCQlzICs9IG07CiAJCSpzKysgPSAnLic7Ci0JCW1lbWNweShzLCBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSwgbik7CisJCW1lbWNweShzLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksIG4pOwogCX0KIAlyZXR1cm4gcmVzOwogfQpAQCAtNDA0LDM3ICs0MDQsMTIgQEAKIHN0YXRpYyBpbnQKIGNsYXNzX3RyYXZlcnNlKFB5Q2xhc3NPYmplY3QgKm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWludCBlcnI7Ci0JaWYgKG8tPmNsX2Jhc2VzKSB7Ci0JCWVyciA9IHZpc2l0KG8tPmNsX2Jhc2VzLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKG8tPmNsX2RpY3QpIHsKLQkJZXJyID0gdmlzaXQoby0+Y2xfZGljdCwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChvLT5jbF9uYW1lKSB7Ci0JCWVyciA9IHZpc2l0KG8tPmNsX25hbWUsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoby0+Y2xfZ2V0YXR0cikgewotCQllcnIgPSB2aXNpdChvLT5jbF9nZXRhdHRyLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKG8tPmNsX3NldGF0dHIpIHsKLQkJZXJyID0gdmlzaXQoby0+Y2xfc2V0YXR0ciwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChvLT5jbF9kZWxhdHRyKSB7Ci0JCWVyciA9IHZpc2l0KG8tPmNsX2RlbGF0dHIsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KKwlQeV9WSVNJVChvLT5jbF9iYXNlcyk7CisJUHlfVklTSVQoby0+Y2xfZGljdCk7CisJUHlfVklTSVQoby0+Y2xfbmFtZSk7CisJUHlfVklTSVQoby0+Y2xfZ2V0YXR0cik7CisJUHlfVklTSVQoby0+Y2xfc2V0YXR0cik7CisJUHlfVklTSVQoby0+Y2xfZGVsYXR0cik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ4MSwyMyArNDU2LDIzIEBACiB9OwogCiBpbnQKLVB5Q2xhc3NfSXNTdWJjbGFzcyhQeU9iamVjdCAqY2xhc3MsIFB5T2JqZWN0ICpiYXNlKQorUHlDbGFzc19Jc1N1YmNsYXNzKFB5T2JqZWN0ICprbGFzcywgUHlPYmplY3QgKmJhc2UpCiB7CiAJUHlfc3NpemVfdCBpLCBuOwogCVB5Q2xhc3NPYmplY3QgKmNwOwotCWlmIChjbGFzcyA9PSBiYXNlKQorCWlmIChrbGFzcyA9PSBiYXNlKQogCQlyZXR1cm4gMTsKIAlpZiAoUHlUdXBsZV9DaGVjayhiYXNlKSkgewogCQluID0gUHlUdXBsZV9HRVRfU0laRShiYXNlKTsKIAkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJaWYgKFB5Q2xhc3NfSXNTdWJjbGFzcyhjbGFzcywgUHlUdXBsZV9HRVRfSVRFTShiYXNlLCBpKSkpCisJCQlpZiAoUHlDbGFzc19Jc1N1YmNsYXNzKGtsYXNzLCBQeVR1cGxlX0dFVF9JVEVNKGJhc2UsIGkpKSkKIAkJCQlyZXR1cm4gMTsKIAkJfQogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKGNsYXNzID09IE5VTEwgfHwgIVB5Q2xhc3NfQ2hlY2soY2xhc3MpKQorCWlmIChrbGFzcyA9PSBOVUxMIHx8ICFQeUNsYXNzX0NoZWNrKGtsYXNzKSkKIAkJcmV0dXJuIDA7Ci0JY3AgPSAoUHlDbGFzc09iamVjdCAqKWNsYXNzOworCWNwID0gKFB5Q2xhc3NPYmplY3QgKilrbGFzczsKIAluID0gUHlUdXBsZV9TaXplKGNwLT5jbF9iYXNlcyk7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQlpZiAoUHlDbGFzc19Jc1N1YmNsYXNzKFB5VHVwbGVfR2V0SXRlbShjcC0+Y2xfYmFzZXMsIGkpLCBiYXNlKSkKQEAgLTcxOSw3ICs2OTQsNyBAQAogaW5zdGFuY2VfZ2V0YXR0cjIocmVnaXN0ZXIgUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKm5hbWUpCiB7CiAJcmVnaXN0ZXIgUHlPYmplY3QgKnY7Ci0JUHlDbGFzc09iamVjdCAqY2xhc3M7CisJUHlDbGFzc09iamVjdCAqa2xhc3M7CiAJZGVzY3JnZXRmdW5jIGY7CiAKIAl2ID0gUHlEaWN0X0dldEl0ZW0oaW5zdC0+aW5fZGljdCwgbmFtZSk7CkBAIC03MjcsNyArNzAyLDcgQEAKIAkJUHlfSU5DUkVGKHYpOwogCQlyZXR1cm4gdjsKIAl9Ci0JdiA9IGNsYXNzX2xvb2t1cChpbnN0LT5pbl9jbGFzcywgbmFtZSwgJmNsYXNzKTsKKwl2ID0gY2xhc3NfbG9va3VwKGluc3QtPmluX2NsYXNzLCBuYW1lLCAma2xhc3MpOwogCWlmICh2ICE9IE5VTEwpIHsKIAkJUHlfSU5DUkVGKHYpOwogCQlmID0gVFBfREVTQ1JfR0VUKHYtPm9iX3R5cGUpOwpAQCAtNzY3LDcgKzc0Miw3IEBACiBfUHlJbnN0YW5jZV9Mb29rdXAoUHlPYmplY3QgKnBpbnN0LCBQeU9iamVjdCAqbmFtZSkKIHsKIAlQeU9iamVjdCAqdjsKLQlQeUNsYXNzT2JqZWN0ICpjbGFzczsKKwlQeUNsYXNzT2JqZWN0ICprbGFzczsKIAlQeUluc3RhbmNlT2JqZWN0ICppbnN0OwkvKiBwaW5zdCBjYXN0IHRvIHRoZSByaWdodCB0eXBlICovCiAKIAlhc3NlcnQoUHlJbnN0YW5jZV9DaGVjayhwaW5zdCkpOwpAQCAtNzc3LDcgKzc1Miw3IEBACiAKICAJdiA9IFB5RGljdF9HZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUpOwogCWlmICh2ID09IE5VTEwpCi0JCXYgPSBjbGFzc19sb29rdXAoaW5zdC0+aW5fY2xhc3MsIG5hbWUsICZjbGFzcyk7CisJCXYgPSBjbGFzc19sb29rdXAoaW5zdC0+aW5fY2xhc3MsIG5hbWUsICZrbGFzcyk7CiAJcmV0dXJuIHY7CiB9CiAKQEAgLTk3OSwxNyArOTU0LDggQEAKIHN0YXRpYyBpbnQKIGluc3RhbmNlX3RyYXZlcnNlKFB5SW5zdGFuY2VPYmplY3QgKm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWludCBlcnI7Ci0JaWYgKG8tPmluX2NsYXNzKSB7Ci0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKShvLT5pbl9jbGFzcyksIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoby0+aW5fZGljdCkgewotCQllcnIgPSB2aXNpdChvLT5pbl9kaWN0LCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9CisJUHlfVklTSVQoby0+aW5fY2xhc3MpOworCVB5X1ZJU0lUKG8tPmluX2RpY3QpOwogCXJldHVybiAwOwogfQogCkBAIC0xMTI4LDI3ICsxMDk0LDYgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXNsaWNlb2JqX2Zyb21faW50aW50KFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBqKQotewotCVB5T2JqZWN0ICpzdGFydCwgKmVuZCwgKnJlczsKLQotCXN0YXJ0ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaSk7Ci0JaWYgKCFzdGFydCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQllbmQgPSBQeUludF9Gcm9tTG9uZygobG9uZylqKTsKLQlpZiAoIWVuZCkgewotCQlQeV9ERUNSRUYoc3RhcnQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gUHlTbGljZV9OZXcoc3RhcnQsIGVuZCwgTlVMTCk7Ci0JUHlfREVDUkVGKHN0YXJ0KTsKLQlQeV9ERUNSRUYoZW5kKTsKLQlyZXR1cm4gcmVzOwotfQotCi0KLXN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9zbGljZShQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeV9zc2l6ZV90IGksIFB5X3NzaXplX3QgaikKIHsKIAlQeU9iamVjdCAqZnVuYywgKmFyZywgKnJlczsKQEAgLTExNjgsNyArMTExMyw3IEBACiAJCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGdldGl0ZW1zdHIpOwogCQlpZiAoZnVuYyA9PSBOVUxMKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihOKSIsIHNsaWNlb2JqX2Zyb21faW50aW50KGksIGopKTsKKwkJYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE4pIiwgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaikpOwogCX0gZWxzZQogCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIobm4pIiwgaSwgaik7CiAKQEAgLTEyMzksNyArMTE4NCw3IEBACiAJCQkJcmV0dXJuIC0xOwogCiAJCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIoTikiLAotCQkJCQkgICAgc2xpY2VvYmpfZnJvbV9pbnRpbnQoaSwgaikpOworCQkJCQkgICAgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaikpOwogCQl9IGVsc2UKIAkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihubikiLCBpLCBqKTsKIAl9CkBAIC0xMjYwLDcgKzEyMDUsNyBAQAogCQkJCXJldHVybiAtMTsKIAogCQkJYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE5PKSIsCi0JCQkJCSAgICBzbGljZW9ial9mcm9tX2ludGludChpLCBqKSwgdmFsdWUpOworCQkJCQkgICAgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaiksIHZhbHVlKTsKIAkJfSBlbHNlCiAJCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIobm5PKSIsIGksIGosIHZhbHVlKTsKIAl9CkBAIC0yMDQ5LDQzICsxOTk0LDQzIEBACiAKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBpbnN0YW5jZV9hc19udW1iZXIgPSB7Ci0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfYWRkLAkJLyogbmJfYWRkICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2Vfc3ViLAkJLyogbmJfc3VidHJhY3QgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9tdWwsCQkvKiBuYl9tdWx0aXBseSAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX21vZCwJCS8qIG5iX3JlbWFpbmRlciAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX2Rpdm1vZCwJCS8qIG5iX2Rpdm1vZCAqLwotCSh0ZXJuYXJ5ZnVuYylpbnN0YW5jZV9wb3csCQkvKiBuYl9wb3dlciAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfbmVnLAkJLyogbmJfbmVnYXRpdmUgKi8KLQkodW5hcnlmdW5jKWluc3RhbmNlX3BvcywJCS8qIG5iX3Bvc2l0aXZlICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9hYnMsCQkvKiBuYl9hYnNvbHV0ZSAqLwotCShpbnF1aXJ5KWluc3RhbmNlX25vbnplcm8sCQkvKiBuYl9ub256ZXJvICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9pbnZlcnQsCQkvKiBuYl9pbnZlcnQgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9sc2hpZnQsCQkvKiBuYl9sc2hpZnQgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9yc2hpZnQsCQkvKiBuYl9yc2hpZnQgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9hbmQsCQkvKiBuYl9hbmQgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV94b3IsCQkvKiBuYl94b3IgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9vciwJCS8qIG5iX29yICovCi0JKGNvZXJjaW9uKWluc3RhbmNlX2NvZXJjZSwJCS8qIG5iX2NvZXJjZSAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaW50LAkJLyogbmJfaW50ICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9sb25nLAkJLyogbmJfbG9uZyAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfZmxvYXQsCQkvKiBuYl9mbG9hdCAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2Vfb2N0LAkJLyogbmJfb2N0ICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9oZXgsCQkvKiBuYl9oZXggKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9pYWRkLAkJLyogbmJfaW5wbGFjZV9hZGQgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9pc3ViLAkJLyogbmJfaW5wbGFjZV9zdWJ0cmFjdCAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX2ltdWwsCQkvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfaW1vZCwJCS8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCi0JKHRlcm5hcnlmdW5jKWluc3RhbmNlX2lwb3csCQkvKiBuYl9pbnBsYWNlX3Bvd2VyICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfaWxzaGlmdCwJCS8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfaXJzaGlmdCwJCS8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfaWFuZCwJCS8qIG5iX2lucGxhY2VfYW5kICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfaXhvciwJCS8qIG5iX2lucGxhY2VfeG9yICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfaW9yLAkJLyogbmJfaW5wbGFjZV9vciAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX2Zsb29yZGl2LAkJLyogbmJfZmxvb3JfZGl2aWRlICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfdHJ1ZWRpdiwJCS8qIG5iX3RydWVfZGl2aWRlICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfaWZsb29yZGl2LAkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9pdHJ1ZWRpdiwJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KLQkobGVuZnVuYylpbnN0YW5jZV9pbmRleCwJCS8qIG5iX2luZGV4ICovCisJaW5zdGFuY2VfYWRkLAkJCS8qIG5iX2FkZCAqLworCWluc3RhbmNlX3N1YiwJCQkvKiBuYl9zdWJ0cmFjdCAqLworCWluc3RhbmNlX211bCwJCQkvKiBuYl9tdWx0aXBseSAqLworCWluc3RhbmNlX21vZCwJCQkvKiBuYl9yZW1haW5kZXIgKi8KKwlpbnN0YW5jZV9kaXZtb2QsCQkvKiBuYl9kaXZtb2QgKi8KKwlpbnN0YW5jZV9wb3csCQkJLyogbmJfcG93ZXIgKi8KKwkodW5hcnlmdW5jKWluc3RhbmNlX25lZywJLyogbmJfbmVnYXRpdmUgKi8KKwkodW5hcnlmdW5jKWluc3RhbmNlX3BvcywJLyogbmJfcG9zaXRpdmUgKi8KKwkodW5hcnlmdW5jKWluc3RhbmNlX2FicywJLyogbmJfYWJzb2x1dGUgKi8KKwkoaW5xdWlyeSlpbnN0YW5jZV9ub256ZXJvLAkvKiBuYl9ub256ZXJvICovCisJKHVuYXJ5ZnVuYylpbnN0YW5jZV9pbnZlcnQsCS8qIG5iX2ludmVydCAqLworCWluc3RhbmNlX2xzaGlmdCwJCS8qIG5iX2xzaGlmdCAqLworCWluc3RhbmNlX3JzaGlmdCwJCS8qIG5iX3JzaGlmdCAqLworCWluc3RhbmNlX2FuZCwJCQkvKiBuYl9hbmQgKi8KKwlpbnN0YW5jZV94b3IsCQkJLyogbmJfeG9yICovCisJaW5zdGFuY2Vfb3IsCQkJLyogbmJfb3IgKi8KKwlpbnN0YW5jZV9jb2VyY2UsCQkvKiBuYl9jb2VyY2UgKi8KKwkodW5hcnlmdW5jKWluc3RhbmNlX2ludCwJLyogbmJfaW50ICovCisJKHVuYXJ5ZnVuYylpbnN0YW5jZV9sb25nLAkvKiBuYl9sb25nICovCisJKHVuYXJ5ZnVuYylpbnN0YW5jZV9mbG9hdCwJLyogbmJfZmxvYXQgKi8KKwkodW5hcnlmdW5jKWluc3RhbmNlX29jdCwJLyogbmJfb2N0ICovCisJKHVuYXJ5ZnVuYylpbnN0YW5jZV9oZXgsCS8qIG5iX2hleCAqLworCWluc3RhbmNlX2lhZGQsCQkJLyogbmJfaW5wbGFjZV9hZGQgKi8KKwlpbnN0YW5jZV9pc3ViLAkJCS8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KKwlpbnN0YW5jZV9pbXVsLAkJCS8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KKwlpbnN0YW5jZV9pbW9kLAkJCS8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCisJaW5zdGFuY2VfaXBvdywJCQkvKiBuYl9pbnBsYWNlX3Bvd2VyICovCisJaW5zdGFuY2VfaWxzaGlmdCwJCS8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCisJaW5zdGFuY2VfaXJzaGlmdCwJCS8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCisJaW5zdGFuY2VfaWFuZCwJCQkvKiBuYl9pbnBsYWNlX2FuZCAqLworCWluc3RhbmNlX2l4b3IsCQkJLyogbmJfaW5wbGFjZV94b3IgKi8KKwlpbnN0YW5jZV9pb3IsCQkJLyogbmJfaW5wbGFjZV9vciAqLworCWluc3RhbmNlX2Zsb29yZGl2LAkJLyogbmJfZmxvb3JfZGl2aWRlICovCisJaW5zdGFuY2VfdHJ1ZWRpdiwJCS8qIG5iX3RydWVfZGl2aWRlICovCisJaW5zdGFuY2VfaWZsb29yZGl2LAkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KKwlpbnN0YW5jZV9pdHJ1ZWRpdiwJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KKwkobGVuZnVuYylpbnN0YW5jZV9pbmRleCwJLyogbmJfaW5kZXggKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUluc3RhbmNlX1R5cGUgPSB7CkBAIC0yMTQwLDcgKzIwODUsNyBAQAogc3RhdGljIFB5TWV0aG9kT2JqZWN0ICpmcmVlX2xpc3Q7CiAKIFB5T2JqZWN0ICoKLVB5TWV0aG9kX05ldyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpjbGFzcykKK1B5TWV0aG9kX05ldyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICprbGFzcykKIHsKIAlyZWdpc3RlciBQeU1ldGhvZE9iamVjdCAqaW07CiAJaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7CkBAIC0yMTYyLDggKzIxMDcsOCBAQAogCWltLT5pbV9mdW5jID0gZnVuYzsKIAlQeV9YSU5DUkVGKHNlbGYpOwogCWltLT5pbV9zZWxmID0gc2VsZjsKLQlQeV9YSU5DUkVGKGNsYXNzKTsKLQlpbS0+aW1fY2xhc3MgPSBjbGFzczsKKwlQeV9YSU5DUkVGKGtsYXNzKTsKKwlpbS0+aW1fY2xhc3MgPSBrbGFzczsKIAlfUHlPYmplY3RfR0NfVFJBQ0soaW0pOwogCXJldHVybiAoUHlPYmplY3QgKilpbTsKIH0KQEAgLTIzNjUsMzUgKzIzMTAsMjIgQEAKIHN0YXRpYyBpbnQKIGluc3RhbmNlbWV0aG9kX3RyYXZlcnNlKFB5TWV0aG9kT2JqZWN0ICppbSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVycjsKLQlpZiAoaW0tPmltX2Z1bmMpIHsKLQkJZXJyID0gdmlzaXQoaW0tPmltX2Z1bmMsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoaW0tPmltX3NlbGYpIHsKLQkJZXJyID0gdmlzaXQoaW0tPmltX3NlbGYsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoaW0tPmltX2NsYXNzKSB7Ci0JCWVyciA9IHZpc2l0KGltLT5pbV9jbGFzcywgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQorCVB5X1ZJU0lUKGltLT5pbV9mdW5jKTsKKwlQeV9WSVNJVChpbS0+aW1fc2VsZik7CisJUHlfVklTSVQoaW0tPmltX2NsYXNzKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKLWdldGNsYXNzbmFtZShQeU9iamVjdCAqY2xhc3MsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpemUpCitnZXRjbGFzc25hbWUoUHlPYmplY3QgKmtsYXNzLCBjaGFyICpidWYsIGludCBidWZzaXplKQogewogCVB5T2JqZWN0ICpuYW1lOwogCiAJYXNzZXJ0KGJ1ZnNpemUgPiAxKTsKIAlzdHJjcHkoYnVmLCAiPyIpOyAvKiBEZWZhdWx0IG91dGNvbWUgKi8KLQlpZiAoY2xhc3MgPT0gTlVMTCkKKwlpZiAoa2xhc3MgPT0gTlVMTCkKIAkJcmV0dXJuOwotCW5hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNsYXNzLCAiX19uYW1lX18iKTsKKwluYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhrbGFzcywgIl9fbmFtZV9fIik7CiAJaWYgKG5hbWUgPT0gTlVMTCkgewogCQkvKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYW4gZXhjZXB0aW9uICovCiAJCVB5RXJyX0NsZWFyKCk7CkBAIC0yNDA5LDcgKzIzNDEsNyBAQAogc3RhdGljIHZvaWQKIGdldGluc3RjbGFzc25hbWUoUHlPYmplY3QgKmluc3QsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpemUpCiB7Ci0JUHlPYmplY3QgKmNsYXNzOworCVB5T2JqZWN0ICprbGFzczsKIAogCWlmIChpbnN0ID09IE5VTEwpIHsKIAkJYXNzZXJ0KGJ1ZnNpemUgPiAwICYmIChzaXplX3QpYnVmc2l6ZSA+IHN0cmxlbigibm90aGluZyIpKTsKQEAgLTI0MTcsMjIgKzIzNDksMjIgQEAKIAkJcmV0dXJuOwogCX0KIAotCWNsYXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhpbnN0LCAiX19jbGFzc19fIik7Ci0JaWYgKGNsYXNzID09IE5VTEwpIHsKKwlrbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoaW5zdCwgIl9fY2xhc3NfXyIpOworCWlmIChrbGFzcyA9PSBOVUxMKSB7CiAJCS8qIFRoaXMgZnVuY3Rpb24gY2Fubm90IHJldHVybiBhbiBleGNlcHRpb24gKi8KIAkJUHlFcnJfQ2xlYXIoKTsKLQkJY2xhc3MgPSAoUHlPYmplY3QgKikoaW5zdC0+b2JfdHlwZSk7Ci0JCVB5X0lOQ1JFRihjbGFzcyk7CisJCWtsYXNzID0gKFB5T2JqZWN0ICopKGluc3QtPm9iX3R5cGUpOworCQlQeV9JTkNSRUYoa2xhc3MpOwogCX0KLQlnZXRjbGFzc25hbWUoY2xhc3MsIGJ1ZiwgYnVmc2l6ZSk7Ci0JUHlfWERFQ1JFRihjbGFzcyk7CisJZ2V0Y2xhc3NuYW1lKGtsYXNzLCBidWYsIGJ1ZnNpemUpOworCVB5X1hERUNSRUYoa2xhc3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VtZXRob2RfY2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKmt3KQogewogCVB5T2JqZWN0ICpzZWxmID0gUHlNZXRob2RfR0VUX1NFTEYoZnVuYyk7Ci0JUHlPYmplY3QgKmNsYXNzID0gUHlNZXRob2RfR0VUX0NMQVNTKGZ1bmMpOworCVB5T2JqZWN0ICprbGFzcyA9IFB5TWV0aG9kX0dFVF9DTEFTUyhmdW5jKTsKIAlQeU9iamVjdCAqcmVzdWx0OwogCiAJZnVuYyA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKTsKQEAgLTI0NDUsMTQgKzIzNzcsMTQgQEAKIAkJaWYgKHNlbGYgPT0gTlVMTCkKIAkJCW9rID0gMDsKIAkJZWxzZSB7Ci0JCQlvayA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwgY2xhc3MpOworCQkJb2sgPSBQeU9iamVjdF9Jc0luc3RhbmNlKHNlbGYsIGtsYXNzKTsKIAkJCWlmIChvayA8IDApCiAJCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJaWYgKCFvaykgewogCQkJY2hhciBjbHNidWZbMjU2XTsKIAkJCWNoYXIgaW5zdGJ1ZlsyNTZdOwotCQkJZ2V0Y2xhc3NuYW1lKGNsYXNzLCBjbHNidWYsIHNpemVvZihjbHNidWYpKTsKKwkJCWdldGNsYXNzbmFtZShrbGFzcywgY2xzYnVmLCBzaXplb2YoY2xzYnVmKSk7CiAJCQlnZXRpbnN0Y2xhc3NuYW1lKHNlbGYsIGluc3RidWYsIHNpemVvZihpbnN0YnVmKSk7CiAJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogCQkJCSAgICAgInVuYm91bmQgbWV0aG9kICVzJXMgbXVzdCBiZSBjYWxsZWQgd2l0aCAiCkBAIC0yNTMxLDcgKzI0NjMsNyBAQAogCShoYXNoZnVuYylpbnN0YW5jZW1ldGhvZF9oYXNoLAkJLyogdHBfaGFzaCAqLwogCWluc3RhbmNlbWV0aG9kX2NhbGwsCQkJLyogdHBfY2FsbCAqLwogCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkoZ2V0YXR0cm9mdW5jKWluc3RhbmNlbWV0aG9kX2dldGF0dHJvLAkvKiB0cF9nZXRhdHRybyAqLworCWluc3RhbmNlbWV0aG9kX2dldGF0dHJvLAkJLyogdHBfZ2V0YXR0cm8gKi8KIAlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCiAJMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwogCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyAgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsIC8qIHRwX2ZsYWdzICovCmRpZmYgLS1naXQgYS9PYmplY3RzL2NvYmplY3QuYyBiL09iamVjdHMvY29iamVjdC5jCmluZGV4IGY3NjRhMWQuLmIyY2FlOWEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY29iamVjdC5jCisrKyBiL09iamVjdHMvY29iamVjdC5jCkBAIC0xMzYsMjUgKzEzNiwyNiBAQAogCiBQeVR5cGVPYmplY3QgUHlDT2JqZWN0X1R5cGUgPSB7CiAgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLSAgICAwLAkJCQkJLypvYl9zaXplKi8KLSAgICAiUHlDT2JqZWN0IiwJCQkvKnRwX25hbWUqLwotICAgIHNpemVvZihQeUNPYmplY3QpLAkJCS8qdHBfYmFzaWNzaXplKi8KLSAgICAwLAkJCQkJLyp0cF9pdGVtc2l6ZSovCisgICAgMCwJCQkJLypvYl9zaXplKi8KKyAgICAiUHlDT2JqZWN0IiwJCS8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5Q09iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwJCQkJLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKVB5Q09iamVjdF9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotICAgIChwcmludGZ1bmMpMCwJCQkvKnRwX3ByaW50Ki8KLSAgICAoZ2V0YXR0cmZ1bmMpMCwJCQkvKnRwX2dldGF0dHIqLwotICAgIChzZXRhdHRyZnVuYykwLAkJCS8qdHBfc2V0YXR0ciovCi0gICAgKGNtcGZ1bmMpMCwJCQkJLyp0cF9jb21wYXJlKi8KLSAgICAocmVwcmZ1bmMpMCwJCQkvKnRwX3JlcHIqLwotICAgIDAsCQkJCQkvKnRwX2FzX251bWJlciovCi0gICAgMCwJCQkJCS8qdHBfYXNfc2VxdWVuY2UqLwotICAgIDAsCQkJCQkvKnRwX2FzX21hcHBpbmcqLwotICAgIChoYXNoZnVuYykwLAkJCS8qdHBfaGFzaCovCi0gICAgKHRlcm5hcnlmdW5jKTAsCQkJLyp0cF9jYWxsKi8KLSAgICAocmVwcmZ1bmMpMCwJCQkvKnRwX3N0ciovCi0KLSAgICAvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotICAgIDBMLDBMLDBMLDBMLAotICAgIFB5Q09iamVjdF9UeXBlX19kb2NfXyAJCS8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCisgICAgKGRlc3RydWN0b3IpUHlDT2JqZWN0X2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwJCQkJLyp0cF9wcmludCovCisgICAgMCwJCQkJLyp0cF9nZXRhdHRyKi8KKyAgICAwLAkJCQkvKnRwX3NldGF0dHIqLworICAgIDAsCQkJCS8qdHBfY29tcGFyZSovCisgICAgMCwJCQkJLyp0cF9yZXByKi8KKyAgICAwLAkJCQkvKnRwX2FzX251bWJlciovCisgICAgMCwJCQkJLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwJCQkJLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLAkJCQkvKnRwX2hhc2gqLworICAgIDAsCQkJCS8qdHBfY2FsbCovCisgICAgMCwJCQkJLyp0cF9zdHIqLworICAgIDAsCQkJCS8qdHBfZ2V0YXR0cm8qLworICAgIDAsCQkJCS8qdHBfc2V0YXR0cm8qLworICAgIDAsCQkJCS8qdHBfYXNfYnVmZmVyKi8KKyAgICAwLAkJCQkvKnRwX2ZsYWdzKi8KKyAgICBQeUNPYmplY3RfVHlwZV9fZG9jX18JLyp0cF9kb2MqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvY29kZW9iamVjdC5jIGIvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKaW5kZXggZjgzMjkxMS4uOGFlMjM5OSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKQEAgLTQ1MSwzICs0NTEsMTM2IEBACiAJfQogCXJldHVybiBsaW5lOwogfQorCisvKiAKKyAgIENoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworICovCisKKwkvKiBUaGUgdGhlb3J5IG9mIFNFVF9MSU5FTk8tbGVzcyB0cmFjaW5nLgorCisJICAgSW4gYSBudXRzaGVsbCwgd2UgdXNlIHRoZSBjb19sbm90YWIgZmllbGQgb2YgdGhlIGNvZGUgb2JqZWN0CisJICAgdG8gdGVsbCB3aGVuIGV4ZWN1dGlvbiBoYXMgbW92ZWQgb250byBhIGRpZmZlcmVudCBsaW5lLgorCisJICAgQXMgbWVudGlvbmVkIGFib3ZlLCB0aGUgYmFzaWMgaWRlYSBpcyBzbyBzZXQgdGhpbmdzIHVwIHNvCisJICAgdGhhdAorCisJICAgICAgICAgKmluc3RyX2xiIDw9IGZyYW1lLT5mX2xhc3RpIDwgKmluc3RyX3ViCisKKwkgICBpcyB0cnVlIHNvIGxvbmcgYXMgZXhlY3V0aW9uIGRvZXMgbm90IGNoYW5nZSBsaW5lcy4KKworCSAgIFRoaXMgaXMgYWxsIGZhaXJseSBzaW1wbGUuICBEaWdnaW5nIHRoZSBpbmZvcm1hdGlvbiBvdXQgb2YKKwkgICBjb19sbm90YWIgdGFrZXMgc29tZSB3b3JrLCBidXQgaXMgY29uY2VwdHVhbGx5IGNsZWFyLgorCisJICAgU29tZXdoYXQgaGFyZGVyIHRvIGV4cGxhaW4gaXMgd2h5IHdlIGRvbid0ICphbHdheXMqIGNhbGwgdGhlCisJICAgbGluZSB0cmFjZSBmdW5jdGlvbiB3aGVuIHRoZSBhYm92ZSB0ZXN0IGZhaWxzLgorCisJICAgQ29uc2lkZXIgdGhpcyBjb2RlOgorCisJICAgMTogZGVmIGYoYSk6CisJICAgMjogICAgIGlmIGE6CisJICAgMzogICAgICAgIHByaW50IDEKKwkgICA0OiAgICAgZWxzZToKKwkgICA1OiAgICAgICAgcHJpbnQgMgorCisJICAgd2hpY2ggY29tcGlsZXMgdG8gdGhpczoKKworCSAgIDIgICAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGEpCisJCSAgICAgICAzIEpVTVBfSUZfRkFMU0UgICAgICAgICAgICA5ICh0byAxNSkKKwkJICAgICAgIDYgUE9QX1RPUAorCisJICAgMyAgICAgICAgICAgNyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKwkJICAgICAgMTAgUFJJTlRfSVRFTQorCQkgICAgICAxMSBQUklOVF9ORVdMSU5FCisJCSAgICAgIDEyIEpVTVBfRk9SV0FSRCAgICAgICAgICAgICA2ICh0byAyMSkKKwkJID4+ICAgMTUgUE9QX1RPUAorCisJICAgNSAgICAgICAgICAxNiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMikKKwkJICAgICAgMTkgUFJJTlRfSVRFTQorCQkgICAgICAyMCBQUklOVF9ORVdMSU5FCisJCSA+PiAgIDIxIExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorCQkgICAgICAyNCBSRVRVUk5fVkFMVUUKKworCSAgIElmICdhJyBpcyBmYWxzZSwgZXhlY3V0aW9uIHdpbGwganVtcCB0byBpbnN0cnVjdGlvbiBhdCBvZmZzZXQKKwkgICAxNSBhbmQgdGhlIGNvX2xub3RhYiB3aWxsIGNsYWltIHRoYXQgZXhlY3V0aW9uIGhhcyBtb3ZlZCB0bworCSAgIGxpbmUgMy4gIFRoaXMgaXMgYXQgYmVzdCBtaXNsZWFkaW5nLiAgSW4gdGhpcyBjYXNlIHdlIGNvdWxkCisJICAgYXNzb2NpYXRlIHRoZSBQT1BfVE9QIHdpdGggbGluZSA0LCBidXQgdGhhdCBkb2Vzbid0IG1ha2UKKwkgICBzZW5zZSBpbiBhbGwgY2FzZXMgKEkgdGhpbmspLgorCisJICAgV2hhdCB3ZSBkbyBpcyBvbmx5IGNhbGwgdGhlIGxpbmUgdHJhY2UgZnVuY3Rpb24gaWYgdGhlIGNvX2xub3RhYgorCSAgIGluZGljYXRlcyB3ZSBoYXZlIGp1bXBlZCB0byB0aGUgKnN0YXJ0KiBvZiBhIGxpbmUsIGkuZS4gaWYgdGhlCisJICAgY3VycmVudCBpbnN0cnVjdGlvbiBvZmZzZXQgbWF0Y2hlcyB0aGUgb2Zmc2V0IGdpdmVuIGZvciB0aGUKKwkgICBzdGFydCBvZiBhIGxpbmUgYnkgdGhlIGNvX2xub3RhYi4KKworCSAgIFRoaXMgYWxzbyB0YWtlcyBjYXJlIG9mIHRoZSBzaXR1YXRpb24gd2hlcmUgJ2EnIGlzIHRydWUuCisJICAgRXhlY3V0aW9uIHdpbGwganVtcCBmcm9tIGluc3RydWN0aW9uIG9mZnNldCAxMiB0byBvZmZzZXQgMjEuCisJICAgVGhlbiB0aGUgY29fbG5vdGFiIHdvdWxkIGltcGx5IHRoYXQgZXhlY3V0aW9uIGhhcyBtb3ZlZCB0byBsaW5lCisJICAgNSwgd2hpY2ggaXMgYWdhaW4gbWlzbGVhZGluZy4KKworCSAgIFdoeSBkbyB3ZSBzZXQgZl9saW5lbm8gd2hlbiB0cmFjaW5nPyAgV2VsbCwgY29uc2lkZXIgdGhlIGNvZGUKKwkgICBhYm92ZSB3aGVuICdhJyBpcyB0cnVlLiAgSWYgc3RlcHBpbmcgdGhyb3VnaCB0aGlzIHdpdGggJ24nIGluCisJICAgcGRiLCB5b3Ugd291bGQgc3RvcCBhdCBsaW5lIDEgd2l0aCBhICJjYWxsIiB0eXBlIGV2ZW50LCB0aGVuCisJICAgbGluZSBldmVudHMgb24gbGluZXMgMiBhbmQgMywgdGhlbiBhICJyZXR1cm4iIHR5cGUgZXZlbnQgLS0gYnV0CisJICAgeW91IHdvdWxkIGJlIHNob3duIGxpbmUgNSBkdXJpbmcgdGhpcyBldmVudC4gIFRoaXMgaXMgYSBjaGFuZ2UKKwkgICBmcm9tIHRoZSBiZWhhdmlvdXIgaW4gMi4yIGFuZCBiZWZvcmUsIGFuZCBJJ3ZlIGZvdW5kIGl0CisJICAgY29uZnVzaW5nIGluIHByYWN0aWNlLiAgQnkgc2V0dGluZyBhbmQgdXNpbmcgZl9saW5lbm8gd2hlbgorCSAgIHRyYWNpbmcsIG9uZSBjYW4gcmVwb3J0IGEgbGluZSBudW1iZXIgZGlmZmVyZW50IGZyb20gdGhhdAorCSAgIHN1Z2dlc3RlZCBieSBmX2xhc3RpIG9uIHRoaXMgb25lIG9jY2FzaW9uIHdoZXJlIGl0J3MgZGVzaXJhYmxlLgorCSovCisKKworaW50IAorUHlDb2RlX0NoZWNrTGluZU51bWJlcihQeUNvZGVPYmplY3QqIGNvLCBpbnQgbGFzdGksIFB5QWRkclBhaXIgKmJvdW5kcykKK3sKKyAgICAgICAgaW50IHNpemUsIGFkZHIsIGxpbmU7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqIHA7CisKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilQeVN0cmluZ19BU19TVFJJTkcoY28tPmNvX2xub3RhYik7CisgICAgICAgIHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjby0+Y29fbG5vdGFiKSAvIDI7CisKKyAgICAgICAgYWRkciA9IDA7CisgICAgICAgIGxpbmUgPSBjby0+Y29fZmlyc3RsaW5lbm87CisgICAgICAgIGFzc2VydChsaW5lID4gMCk7CisKKyAgICAgICAgLyogcG9zc2libGUgb3B0aW1pemF0aW9uOiBpZiBmLT5mX2xhc3RpID09IGluc3RyX3ViCisgICAgICAgICAgIChsaWtlbHkgdG8gYmUgYSBjb21tb24gY2FzZSkgdGhlbiB3ZSBhbHJlYWR5IGtub3cKKyAgICAgICAgICAgaW5zdHJfbGIgLS0gaWYgd2Ugc3RvcmVkIHRoZSBtYXRjaGluZyB2YWx1ZSBvZiBwCisgICAgICAgICAgIHNvbXdoZXJlIHdlIGNvdWxkIHNraXAgdGhlIGZpcnN0IHdoaWxlIGxvb3AuICovCisKKyAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIGNvbXBpbGUuYyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mCisgICAgICAgICAgIGNvX2xub3RhYi4gIEEgcG9pbnQgdG8gcmVtZW1iZXI6IGluY3JlbWVudHMgdG8gcAorICAgICAgICAgICBzaG91bGQgY29tZSBpbiBwYWlycyAtLSBhbHRob3VnaCB3ZSBkb24ndCBjYXJlIGFib3V0CisgICAgICAgICAgIHRoZSBsaW5lIGluY3JlbWVudHMgaGVyZSwgdHJlYXRpbmcgdGhlbSBhcyBieXRlCisgICAgICAgICAgIGluY3JlbWVudHMgZ2V0cyBjb25mdXNpbmcsIHRvIHNheSB0aGUgbGVhc3QuICovCisKKyAgICAgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGFkZHIgKyAqcCA+IGxhc3RpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYWRkciArPSAqcCsrOworICAgICAgICAgICAgICAgIGlmICgqcCkgCisgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMtPmFwX2xvd2VyID0gYWRkcjsKKyAgICAgICAgICAgICAgICBsaW5lICs9ICpwKys7CisgICAgICAgICAgICAgICAgLS1zaXplOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgbGFzdGkgYW5kIGFkZHIgZG9uJ3QgbWF0Y2ggZXhhY3RseSwgd2UgZG9uJ3Qgd2FudCB0bworICAgICAgICAgICBjaGFuZ2UgdGhlIGxpbmVubyBzbG90IG9uIHRoZSBmcmFtZSBvciBleGVjdXRlIGEgdHJhY2UKKyAgICAgICAgICAgZnVuY3Rpb24uICBSZXR1cm4gLTEgaW5zdGVhZC4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGFkZHIgIT0gbGFzdGkpCisgICAgICAgICAgICAgICAgbGluZSA9IC0xOworICAgICAgICAKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKC0tc2l6ZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyICs9ICpwKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnArKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvdW5kcy0+YXBfdXBwZXIgPSBhZGRyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGJvdW5kcy0+YXBfdXBwZXIgPSBJTlRfTUFYOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxpbmU7Cit9CmRpZmYgLS1naXQgYS9PYmplY3RzL2NvbXBsZXhvYmplY3QuYyBiL09iamVjdHMvY29tcGxleG9iamVjdC5jCmluZGV4IGYwOTE1ZGQuLmM2MDIxZTkgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY29tcGxleG9iamVjdC5jCisrKyBiL09iamVjdHMvY29tcGxleG9iamVjdC5jCkBAIC02NjcsNyArNjY3LDcgQEAKIAl9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQlpZiAoUHlVbmljb2RlX0dFVF9TSVpFKHYpID49IHNpemVvZihzX2J1ZmZlcikpIHsKKwkJaWYgKFB5VW5pY29kZV9HRVRfU0laRSh2KSA+PSAoUHlfc3NpemVfdClzaXplb2Yoc19idWZmZXIpKSB7CiAJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKIAkJCQkgImNvbXBsZXgoKSBsaXRlcmFsIHRvbyBsYXJnZSB0byBjb252ZXJ0Iik7CiAJCQlyZXR1cm4gTlVMTDsKQEAgLTk0MCwxMCArOTQwLDEwIEBACiAJMCwJCQkJCS8qIG5iX2FuZCAqLwogCTAsCQkJCQkvKiBuYl94b3IgKi8KIAkwLAkJCQkJLyogbmJfb3IgKi8KLQkoY29lcmNpb24pY29tcGxleF9jb2VyY2UsCQkvKiBuYl9jb2VyY2UgKi8KLQkodW5hcnlmdW5jKWNvbXBsZXhfaW50LAkJCS8qIG5iX2ludCAqLwotCSh1bmFyeWZ1bmMpY29tcGxleF9sb25nLAkJLyogbmJfbG9uZyAqLwotCSh1bmFyeWZ1bmMpY29tcGxleF9mbG9hdCwJCS8qIG5iX2Zsb2F0ICovCisJY29tcGxleF9jb2VyY2UsCQkJCS8qIG5iX2NvZXJjZSAqLworCWNvbXBsZXhfaW50LAkJCQkvKiBuYl9pbnQgKi8KKwljb21wbGV4X2xvbmcsCQkJCS8qIG5iX2xvbmcgKi8KKwljb21wbGV4X2Zsb2F0LAkJCQkvKiBuYl9mbG9hdCAqLwogCTAsCQkJCQkvKiBuYl9vY3QgKi8KIAkwLAkJCQkJLyogbmJfaGV4ICovCiAJMCwJCQkJCS8qIG5iX2lucGxhY2VfYWRkICovCkBAIC05NjgsNyArOTY4LDcgQEAKIAkiY29tcGxleCIsCiAJc2l6ZW9mKFB5Q29tcGxleE9iamVjdCksCiAJMCwKLQkoZGVzdHJ1Y3Rvciljb21wbGV4X2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCisJY29tcGxleF9kZWFsbG9jLAkJCS8qIHRwX2RlYWxsb2MgKi8KIAkocHJpbnRmdW5jKWNvbXBsZXhfcHJpbnQsCQkvKiB0cF9wcmludCAqLwogCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCiAJMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvZGVzY3JvYmplY3QuYyBiL09iamVjdHMvZGVzY3JvYmplY3QuYwppbmRleCA5NDk0MDYyLi41NjFiYTRhIDEwMDY0NAotLS0gYS9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9kZXNjcm9iamVjdC5jCkBAIC0zNzcsMTMgKzM3Nyw3IEBACiBkZXNjcl90cmF2ZXJzZShQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7CiAJUHlEZXNjck9iamVjdCAqZGVzY3IgPSAoUHlEZXNjck9iamVjdCAqKXNlbGY7Ci0JaW50IGVycjsKLQotCWlmIChkZXNjci0+ZF90eXBlKSB7Ci0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKShkZXNjci0+ZF90eXBlKSwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQorCVB5X1ZJU0lUKGRlc2NyLT5kX3R5cGUpOwogCXJldHVybiAwOwogfQogCkBAIC00ODAsNyArNDc0LDcgQEAKIAkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KIAkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwogCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKTAsCQkJCS8qIHRwX2NhbGwgKi8KKwkwLAkJCQkJLyogdHBfY2FsbCAqLwogCTAsCQkJCQkvKiB0cF9zdHIgKi8KIAlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCiAJMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCkBAIC01MTgsNyArNTEyLDcgQEAKIAkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KIAkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwogCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKTAsCQkJCS8qIHRwX2NhbGwgKi8KKwkwLAkJCQkJLyogdHBfY2FsbCAqLwogCTAsCQkJCQkvKiB0cF9zdHIgKi8KIAlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCiAJMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCkBAIC04MTQsMTMgKzgwOCw3IEBACiBwcm94eV90cmF2ZXJzZShQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7CiAJcHJveHlvYmplY3QgKnBwID0gKHByb3h5b2JqZWN0ICopc2VsZjsKLQlpbnQgZXJyOwotCi0JaWYgKHBwLT5kaWN0KSB7Ci0JCWVyciA9IHZpc2l0KHBwLT5kaWN0LCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9CisJUHlfVklTSVQocHAtPmRpY3QpOwogCXJldHVybiAwOwogfQogCkBAIC05OTksMTggKzk4Nyw4IEBACiB3cmFwcGVyX3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKIAl3cmFwcGVyb2JqZWN0ICp3cCA9ICh3cmFwcGVyb2JqZWN0ICopc2VsZjsKLQlpbnQgZXJyOwotCi0JaWYgKHdwLT5kZXNjcikgewotCQllcnIgPSB2aXNpdCgoUHlPYmplY3QgKikod3AtPmRlc2NyKSwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmICh3cC0+c2VsZikgewotCQllcnIgPSB2aXNpdCh3cC0+c2VsZiwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQorCVB5X1ZJU0lUKHdwLT5kZXNjcik7CisJUHlfVklTSVQod3AtPnNlbGYpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjM3LDIwICsxMjE1LDEwIEBACiBwcm9wZXJ0eV90cmF2ZXJzZShQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7CiAJcHJvcGVydHlvYmplY3QgKnBwID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKLQlpbnQgZXJyOwotCi0jZGVmaW5lIFZJU0lUKFNMT1QpIFwKLQlpZiAocHAtPlNMT1QpIHsgXAotCQllcnIgPSB2aXNpdCgoUHlPYmplY3QgKikocHAtPlNMT1QpLCBhcmcpOyBcCi0JCWlmIChlcnIpIFwKLQkJCXJldHVybiBlcnI7IFwKLQl9Ci0KLQlWSVNJVChwcm9wX2dldCk7Ci0JVklTSVQocHJvcF9zZXQpOwotCVZJU0lUKHByb3BfZGVsKTsKLQlWSVNJVChwcm9wX2RvYyk7Ci0KKwlQeV9WSVNJVChwcC0+cHJvcF9nZXQpOworCVB5X1ZJU0lUKHBwLT5wcm9wX3NldCk7CisJUHlfVklTSVQocHAtPnByb3BfZGVsKTsKKwlQeV9WSVNJVChwcC0+cHJvcF9kb2MpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL2RpY3RvYmplY3QuYyBiL09iamVjdHMvZGljdG9iamVjdC5jCmluZGV4IDBlY2NkYmIuLmY1Nzk5ZWUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGljdG9iamVjdC5jCisrKyBiL09iamVjdHMvZGljdG9iamVjdC5jCkBAIC0xMTUsNiArMTE1LDE0IEBACiAvKiBPYmplY3QgdXNlZCBhcyBkdW1teSBrZXkgdG8gZmlsbCBkZWxldGVkIGVudHJpZXMgKi8KIHN0YXRpYyBQeU9iamVjdCAqZHVtbXkgPSBOVUxMOyAvKiBJbml0aWFsaXplZCBieSBmaXJzdCBjYWxsIHRvIG5ld2RpY3RvYmplY3QoKSAqLwogCisjaWZkZWYgUHlfUkVGX0RFQlVHCitQeU9iamVjdCAqCitfUHlEaWN0X0R1bW15KHZvaWQpCit7CisJcmV0dXJuIGR1bW15OworfQorI2VuZGlmCisKIC8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCiBzdGF0aWMgZGljdGVudHJ5ICoKIGxvb2tkaWN0X3N0cmluZyhkaWN0b2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoKTsKQEAgLTE3MjQsMTcgKzE3MzIsMTIgQEAKIGRpY3RfdHJhdmVyc2UoUHlPYmplY3QgKm9wLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKIAlQeV9zc2l6ZV90IGkgPSAwOwotCWludCBlcnI7CiAJUHlPYmplY3QgKnBrOwogCVB5T2JqZWN0ICpwdjsKIAogCXdoaWxlIChQeURpY3RfTmV4dChvcCwgJmksICZwaywgJnB2KSkgewotCQllcnIgPSB2aXNpdChwaywgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWVyciA9IHZpc2l0KHB2LCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKKwkJUHlfVklTSVQocGspOworCQlQeV9WSVNJVChwdik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTg4MCwxNiArMTg4MywxNiBAQAogCiAvKiBIYWNrIHRvIGltcGxlbWVudCAia2V5IGluIGRpY3QiICovCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgZGljdF9hc19zZXF1ZW5jZSA9IHsKLQkwLAkJCQkJLyogc3FfbGVuZ3RoICovCi0JMCwJCQkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJCQkvKiBzcV9yZXBlYXQgKi8KLQkwLAkJCQkJLyogc3FfaXRlbSAqLwotCTAsCQkJCQkvKiBzcV9zbGljZSAqLwotCTAsCQkJCQkvKiBzcV9hc3NfaXRlbSAqLwotCTAsCQkJCQkvKiBzcV9hc3Nfc2xpY2UgKi8KLQkob2Jqb2JqcHJvYylQeURpY3RfQ29udGFpbnMsCQkvKiBzcV9jb250YWlucyAqLwotCTAsCQkJCQkvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLwotCTAsCQkJCQkvKiBzcV9pbnBsYWNlX3JlcGVhdCAqLworCTAsCQkJLyogc3FfbGVuZ3RoICovCisJMCwJCQkvKiBzcV9jb25jYXQgKi8KKwkwLAkJCS8qIHNxX3JlcGVhdCAqLworCTAsCQkJLyogc3FfaXRlbSAqLworCTAsCQkJLyogc3Ffc2xpY2UgKi8KKwkwLAkJCS8qIHNxX2Fzc19pdGVtICovCisJMCwJCQkvKiBzcV9hc3Nfc2xpY2UgKi8KKwlQeURpY3RfQ29udGFpbnMsCS8qIHNxX2NvbnRhaW5zICovCisJMCwJCQkvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLworCTAsCQkJLyogc3FfaW5wbGFjZV9yZXBlYXQgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xOTY2LDggKzE5NjksOCBAQAogCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CiAJCVB5X1RQRkxBR1NfQkFTRVRZUEUsCQkvKiB0cF9mbGFncyAqLwogCWRpY3Rpb25hcnlfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWRpY3RfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KWRpY3RfdHBfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KKwlkaWN0X3RyYXZlcnNlLAkJCQkvKiB0cF90cmF2ZXJzZSAqLworCWRpY3RfdHBfY2xlYXIsCQkJCS8qIHRwX2NsZWFyICovCiAJZGljdF9yaWNoY29tcGFyZSwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwogCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogCShnZXRpdGVyZnVuYylkaWN0X2l0ZXIsCQkJLyogdHBfaXRlciAqLwpAQCAtMTk4MCw3ICsxOTgzLDcgQEAKIAkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCiAJMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwogCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JKGluaXRwcm9jKWRpY3RfaW5pdCwJCQkvKiB0cF9pbml0ICovCisJZGljdF9pbml0LAkJCQkvKiB0cF9pbml0ICovCiAJUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwogCWRpY3RfbmV3LAkJCQkvKiB0cF9uZXcgKi8KIAlQeU9iamVjdF9HQ19EZWwsICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvZW51bW9iamVjdC5jIGIvT2JqZWN0cy9lbnVtb2JqZWN0LmMKaW5kZXggNDgxMTIzOS4uYThmNDNlMCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9lbnVtb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9lbnVtb2JqZWN0LmMKQEAgLTksOCArOSw2IEBACiAJUHlPYmplY3QqIGVuX3Jlc3VsdDsJICAgLyogcmVzdWx0IHR1cGxlICAqLwogfSBlbnVtb2JqZWN0OwogCi1QeVR5cGVPYmplY3QgUHlFbnVtX1R5cGU7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBlbnVtX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKQEAgLTUxLDE4ICs0OSw4IEBACiBzdGF0aWMgaW50CiBlbnVtX3RyYXZlcnNlKGVudW1vYmplY3QgKmVuLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpbnQgZXJyOwotCi0JaWYgKGVuLT5lbl9zaXQpIHsKLQkJZXJyID0gdmlzaXQoZW4tPmVuX3NpdCwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChlbi0+ZW5fcmVzdWx0KSB7Ci0JCWVyciA9IHZpc2l0KGVuLT5lbl9yZXN1bHQsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KKwlQeV9WSVNJVChlbi0+ZW5fc2l0KTsKKwlQeV9WSVNJVChlbi0+ZW5fcmVzdWx0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA3LDggKzE5NSw3IEBACiBzdGF0aWMgaW50CiByZXZlcnNlZF90cmF2ZXJzZShyZXZlcnNlZG9iamVjdCAqcm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmIChyby0+c2VxKQotCQlyZXR1cm4gdmlzaXQoKFB5T2JqZWN0ICopKHJvLT5zZXEpLCBhcmcpOworCVB5X1ZJU0lUKHJvLT5zZXEpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL2ZpbGVvYmplY3QuYyBiL09iamVjdHMvZmlsZW9iamVjdC5jCmluZGV4IGY5NmVlN2IuLjYzMmFiMDQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZmlsZW9iamVjdC5jCisrKyBiL09iamVjdHMvZmlsZW9iamVjdC5jCkBAIC00OCw2ICs0OCwxMCBAQAogI2RlZmluZSBORVdMSU5FX0xGIDIJCS8qIFxuIG5ld2xpbmUgc2VlbiAqLwogI2RlZmluZSBORVdMSU5FX0NSTEYgNAkJLyogXHJcbiBuZXdsaW5lIHNlZW4gKi8KIAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCiBGSUxFICoKIFB5RmlsZV9Bc0ZpbGUoUHlPYmplY3QgKmYpCiB7CkBAIC0zMTMsNyArMzE3LDggQEAKIAkJCVB5TWVtX0ZyZWUoZmlsZS0+Zl9zZXRidWYpOwogCQkJZmlsZS0+Zl9zZXRidWYgPSBOVUxMOwogCQl9IGVsc2UgewotCQkJZmlsZS0+Zl9zZXRidWYgPSBQeU1lbV9SZWFsbG9jKGZpbGUtPmZfc2V0YnVmLCBidWZzaXplKTsKKwkJCWZpbGUtPmZfc2V0YnVmID0gKGNoYXIgKilQeU1lbV9SZWFsbG9jKGZpbGUtPmZfc2V0YnVmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplKTsKIAkJfQogI2lmZGVmIEhBVkVfU0VUVkJVRgogCQlzZXR2YnVmKGZpbGUtPmZfZnAsIGZpbGUtPmZfc2V0YnVmLCB0eXBlLCBidWZzaXplKTsKQEAgLTgxOCw3ICs4MjMsNyBAQAogCQlidWZmZXJzaXplID0gbmV3X2J1ZmZlcnNpemUoZiwgKHNpemVfdCkwKTsKIAllbHNlCiAJCWJ1ZmZlcnNpemUgPSBieXRlc3JlcXVlc3RlZDsKLQlpZiAoYnVmZmVyc2l6ZSA+IElOVF9NQVgpIHsKKwlpZiAoYnVmZmVyc2l6ZSA+IFBZX1NTSVpFX1RfTUFYKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAogCSJyZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzIGlzIG1vcmUgdGhhbiBhIFB5dGhvbiBzdHJpbmcgY2FuIGhvbGQiKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMDkzLDcgKzEwOTgsNyBAQAogCQlhc3NlcnQoKihwdmVuZC0xKSA9PSAnXDAnKTsKIAkJaW5jcmVtZW50ID0gdG90YWxfdl9zaXplID4+IDI7CS8qIG1pbGQgZXhwb25lbnRpYWwgZ3Jvd3RoICovCiAJCXRvdGFsX3Zfc2l6ZSArPSBpbmNyZW1lbnQ7Ci0JCWlmICh0b3RhbF92X3NpemUgPiBJTlRfTUFYKSB7CisJCWlmICh0b3RhbF92X3NpemUgPiBQWV9TU0laRV9UX01BWCkgewogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CiAJCQlQeV9ERUNSRUYodik7CkBAIC0xMjA0LDcgKzEyMDksNyBAQAogCQl1c2VkX3Zfc2l6ZSA9IHRvdGFsX3Zfc2l6ZTsKIAkJaW5jcmVtZW50ID0gdG90YWxfdl9zaXplID4+IDI7IC8qIG1pbGQgZXhwb25lbnRpYWwgZ3Jvd3RoICovCiAJCXRvdGFsX3Zfc2l6ZSArPSBpbmNyZW1lbnQ7Ci0JCWlmICh0b3RhbF92X3NpemUgPiBJTlRfTUFYKSB7CisJCWlmICh0b3RhbF92X3NpemUgPiBQWV9TU0laRV9UX01BWCkgewogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CiAJCQlQeV9ERUNSRUYodik7CkBAIC0xMzkxLDEyICsxMzk2LDEyIEBACiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAkJdG90YWxyZWFkICs9IG5yZWFkOwotCQlwID0gbWVtY2hyKGJ1ZmZlcituZmlsbGVkLCAnXG4nLCBucmVhZCk7CisJCXAgPSAoY2hhciAqKW1lbWNocihidWZmZXIrbmZpbGxlZCwgJ1xuJywgbnJlYWQpOwogCQlpZiAocCA9PSBOVUxMKSB7CiAJCQkvKiBOZWVkIGEgbGFyZ2VyIGJ1ZmZlciB0byBmaXQgdGhpcyBsaW5lICovCiAJCQluZmlsbGVkICs9IG5yZWFkOwogCQkJYnVmZmVyc2l6ZSAqPSAyOwotCQkJaWYgKGJ1ZmZlcnNpemUgPiBJTlRfTUFYKSB7CisJCQlpZiAoYnVmZmVyc2l6ZSA+IFBZX1NTSVpFX1RfTUFYKSB7CiAJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CiAJCQkJZ290byBlcnJvcjsKQEAgLTE0MzEsNyArMTQzNiw3IEBACiAJCQlpZiAoZXJyICE9IDApCiAJCQkJZ290byBlcnJvcjsKIAkJCXEgPSBwOwotCQkJcCA9IG1lbWNocihxLCAnXG4nLCBlbmQtcSk7CisJCQlwID0gKGNoYXIgKiltZW1jaHIocSwgJ1xuJywgZW5kLXEpOwogCQl9IHdoaWxlIChwICE9IE5VTEwpOwogCQkvKiBNb3ZlIHRoZSByZW1haW5pbmcgaW5jb21wbGV0ZSBsaW5lIHRvIHRoZSBzdGFydCAqLwogCQluZmlsbGVkID0gZW5kLXE7CkBAIC0xNzkwLDcgKzE3OTUsNyBAQAogCiAvKiBNYWtlIHN1cmUgdGhhdCBmaWxlIGhhcyBhIHJlYWRhaGVhZCBidWZmZXIgd2l0aCBhdCBsZWFzdCBvbmUgYnl0ZQogICAgKHVubGVzcyBhdCBFT0YpIGFuZCBubyBtb3JlIHRoYW4gYnVmc2l6ZS4gIFJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24KLSAgIGVycm9yICovCisgICBlcnJvciwgd2lsbCBzZXQgTWVtb3J5RXJyb3IgaWYgYnVmc2l6ZSBieXRlcyBjYW5ub3QgYmUgYWxsb2NhdGVkLiAqLwogc3RhdGljIGludAogcmVhZGFoZWFkKFB5RmlsZU9iamVjdCAqZiwgaW50IGJ1ZnNpemUpCiB7CkBAIC0xODAyLDcgKzE4MDcsOCBAQAogCQllbHNlCiAJCQlkcm9wX3JlYWRhaGVhZChmKTsKIAl9Ci0JaWYgKChmLT5mX2J1ZiA9IFB5TWVtX01hbGxvYyhidWZzaXplKSkgPT0gTlVMTCkgeworCWlmICgoZi0+Zl9idWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhidWZzaXplKSkgPT0gTlVMTCkgeworCQlQeUVycl9Ob01lbW9yeSgpOwogCQlyZXR1cm4gLTE7CiAJfQogCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKQEAgLTE4NDQsNyArMTg1MCw3IEBACiAJaWYgKGxlbiA9PSAwKQogCQlyZXR1cm4gKFB5U3RyaW5nT2JqZWN0ICopCiAJCQlQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwKTsKLQlidWZwdHIgPSBtZW1jaHIoZi0+Zl9idWZwdHIsICdcbicsIGxlbik7CisJYnVmcHRyID0gKGNoYXIgKiltZW1jaHIoZi0+Zl9idWZwdHIsICdcbicsIGxlbik7CiAJaWYgKGJ1ZnB0ciAhPSBOVUxMKSB7CiAJCWJ1ZnB0cisrOwkJCS8qIENvdW50IHRoZSAnXG4nICovCiAJCWxlbiA9IGJ1ZnB0ciAtIGYtPmZfYnVmcHRyOwpAQCAtMjA1Niw3ICsyMDYyLDcgQEAKIAkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCiAJMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwogCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JKGluaXRwcm9jKWZpbGVfaW5pdCwJCQkvKiB0cF9pbml0ICovCisJZmlsZV9pbml0LAkJCQkvKiB0cF9pbml0ICovCiAJUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwogCWZpbGVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KIAlQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwpAQCAtMjQzMiwzICsyNDM4LDggQEAKIAlmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOwogCXJldHVybiBkc3QgLSBidWY7CiB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL09iamVjdHMvZmxvYXRvYmplY3QuYyBiL09iamVjdHMvZmxvYXRvYmplY3QuYwppbmRleCAyMGVkODZlLi44NzA4NjkwIDEwMDY0NAotLS0gYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCkBAIC05Nyw3ICs5Nyw3IEBACiAJfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIAllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLQkJaWYgKFB5VW5pY29kZV9HRVRfU0laRSh2KSA+PSBzaXplb2Yoc19idWZmZXIpKSB7CisJCWlmIChQeVVuaWNvZGVfR0VUX1NJWkUodikgPj0gKFB5X3NzaXplX3Qpc2l6ZW9mKHNfYnVmZmVyKSkgewogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAJCQkJIlVuaWNvZGUgZmxvYXQoKSBsaXRlcmFsIHRvbyBsb25nIHRvIGNvbnZlcnQiKTsKIAkJCXJldHVybiBOVUxMOwpAQCAtOTQwLDIxICs5NDAsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqdG1wLCAqbmV3OworCVB5T2JqZWN0ICp0bXAsICpuZXdvYmo7CiAKIAlhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlGbG9hdF9UeXBlKSk7CiAJdG1wID0gZmxvYXRfbmV3KCZQeUZsb2F0X1R5cGUsIGFyZ3MsIGt3ZHMpOwogCWlmICh0bXAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJYXNzZXJ0KFB5RmxvYXRfQ2hlY2tFeGFjdCh0bXApKTsKLQluZXcgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobmV3ID09IE5VTEwpIHsKKwluZXdvYmogPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKwlpZiAobmV3b2JqID09IE5VTEwpIHsKIAkJUHlfREVDUkVGKHRtcCk7CiAJCXJldHVybiBOVUxMOwogCX0KLQkoKFB5RmxvYXRPYmplY3QgKiluZXcpLT5vYl9mdmFsID0gKChQeUZsb2F0T2JqZWN0ICopdG1wKS0+b2JfZnZhbDsKKwkoKFB5RmxvYXRPYmplY3QgKiluZXdvYmopLT5vYl9mdmFsID0gKChQeUZsb2F0T2JqZWN0ICopdG1wKS0+b2JfZnZhbDsKIAlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdvYmo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMTA2LDEyICsxMTA2LDEyIEBACiAKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBmbG9hdF9hc19udW1iZXIgPSB7Ci0JKGJpbmFyeWZ1bmMpZmxvYXRfYWRkLCAvKm5iX2FkZCovCi0JKGJpbmFyeWZ1bmMpZmxvYXRfc3ViLCAvKm5iX3N1YnRyYWN0Ki8KLQkoYmluYXJ5ZnVuYylmbG9hdF9tdWwsIC8qbmJfbXVsdGlwbHkqLwotCShiaW5hcnlmdW5jKWZsb2F0X3JlbSwgLypuYl9yZW1haW5kZXIqLwotCShiaW5hcnlmdW5jKWZsb2F0X2Rpdm1vZCwgLypuYl9kaXZtb2QqLwotCSh0ZXJuYXJ5ZnVuYylmbG9hdF9wb3csIC8qbmJfcG93ZXIqLworCWZsb2F0X2FkZCwgCS8qbmJfYWRkKi8KKwlmbG9hdF9zdWIsIAkvKm5iX3N1YnRyYWN0Ki8KKwlmbG9hdF9tdWwsIAkvKm5iX211bHRpcGx5Ki8KKwlmbG9hdF9yZW0sIAkvKm5iX3JlbWFpbmRlciovCisJZmxvYXRfZGl2bW9kLCAJLypuYl9kaXZtb2QqLworCWZsb2F0X3BvdywgCS8qbmJfcG93ZXIqLwogCSh1bmFyeWZ1bmMpZmxvYXRfbmVnLCAvKm5iX25lZ2F0aXZlKi8KIAkodW5hcnlmdW5jKWZsb2F0X3BvcywgLypuYl9wb3NpdGl2ZSovCiAJKHVuYXJ5ZnVuYylmbG9hdF9hYnMsIC8qbmJfYWJzb2x1dGUqLwpAQCAtMTEyMiwxMCArMTEyMiwxMCBAQAogCTAsCQkvKm5iX2FuZCovCiAJMCwJCS8qbmJfeG9yKi8KIAkwLAkJLypuYl9vciovCi0JKGNvZXJjaW9uKWZsb2F0X2NvZXJjZSwgLypuYl9jb2VyY2UqLwotCSh1bmFyeWZ1bmMpZmxvYXRfaW50LCAvKm5iX2ludCovCi0JKHVuYXJ5ZnVuYylmbG9hdF9sb25nLCAvKm5iX2xvbmcqLwotCSh1bmFyeWZ1bmMpZmxvYXRfZmxvYXQsIC8qbmJfZmxvYXQqLworCWZsb2F0X2NvZXJjZSwgCS8qbmJfY29lcmNlKi8KKwlmbG9hdF9pbnQsIAkvKm5iX2ludCovCisJZmxvYXRfbG9uZywgCS8qbmJfbG9uZyovCisJZmxvYXRfZmxvYXQsCS8qbmJfZmxvYXQqLwogCTAsCQkvKiBuYl9vY3QgKi8KIAkwLAkJLyogbmJfaGV4ICovCiAJMCwJCS8qIG5iX2lucGxhY2VfYWRkICovCkBAIC0xMTcwLDcgKzExNzAsNyBAQAogCWZsb2F0X2RvYywJCQkJLyogdHBfZG9jICovCiAgCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwogCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylmbG9hdF9yaWNoY29tcGFyZSwJCS8qIHRwX3JpY2hjb21wYXJlICovCisJZmxvYXRfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KIAkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KIAkwLAkJCQkJLyogdHBfaXRlciAqLwogCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jIGIvT2JqZWN0cy9mcmFtZW9iamVjdC5jCmluZGV4IDZlM2YyOTcuLjlhYWJjN2EgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZnJhbWVvYmplY3QuYworKysgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKQEAgLTEsNCArMSwzIEBACi0KIC8qIEZyYW1lIG9iamVjdCBpbXBsZW1lbnRhdGlvbiAqLwogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCkBAIC0zMzMsNyArMzMyLDcgQEAKIAogCVB5X1hJTkNSRUYodik7CiAJZi0+Zl90cmFjZSA9IHY7Ci0JCisKIAlpZiAodiAhPSBOVUxMKQogCQlmLT5mX2xpbmVubyA9IFB5Q29kZV9BZGRyMkxpbmUoZi0+Zl9jb2RlLCBmLT5mX2xhc3RpKTsKIApAQCAtMzk5LDcgKzM5OCw3IEBACiAJCWZvciAocCA9IGYtPmZfdmFsdWVzdGFjazsgcCA8IGYtPmZfc3RhY2t0b3A7IHArKykKIAkJCVB5X1hERUNSRUYoKnApOwogCX0KLQkKKwogCVB5X1hERUNSRUYoZi0+Zl9iYWNrKTsKIAlQeV9ERUNSRUYoZi0+Zl9jb2RlKTsKIAlQeV9ERUNSRUYoZi0+Zl9idWlsdGlucyk7CkBAIC00MjMsMzAgKzQyMiwyOCBAQAogZnJhbWVfdHJhdmVyc2UoUHlGcmFtZU9iamVjdCAqZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7CiAJUHlPYmplY3QgKipmYXN0bG9jYWxzLCAqKnA7Ci0JaW50IGksIGVyciwgc2xvdHM7Ci0jZGVmaW5lIFZJU0lUKG8pIGlmIChvKSB7aWYgKChlcnIgPSB2aXNpdCgoUHlPYmplY3QgKikobyksIGFyZykpKSByZXR1cm4gZXJyO30KKwlpbnQgaSwgc2xvdHM7CiAKLQlWSVNJVChmLT5mX2JhY2spOwotCVZJU0lUKGYtPmZfY29kZSk7Ci0JVklTSVQoZi0+Zl9idWlsdGlucyk7Ci0JVklTSVQoZi0+Zl9nbG9iYWxzKTsKLQlWSVNJVChmLT5mX2xvY2Fscyk7Ci0JVklTSVQoZi0+Zl90cmFjZSk7Ci0JVklTSVQoZi0+Zl9leGNfdHlwZSk7Ci0JVklTSVQoZi0+Zl9leGNfdmFsdWUpOwotCVZJU0lUKGYtPmZfZXhjX3RyYWNlYmFjayk7CisJUHlfVklTSVQoZi0+Zl9iYWNrKTsKKwlQeV9WSVNJVChmLT5mX2NvZGUpOworCVB5X1ZJU0lUKGYtPmZfYnVpbHRpbnMpOworCVB5X1ZJU0lUKGYtPmZfZ2xvYmFscyk7CisJUHlfVklTSVQoZi0+Zl9sb2NhbHMpOworCVB5X1ZJU0lUKGYtPmZfdHJhY2UpOworCVB5X1ZJU0lUKGYtPmZfZXhjX3R5cGUpOworCVB5X1ZJU0lUKGYtPmZfZXhjX3ZhbHVlKTsKKwlQeV9WSVNJVChmLT5mX2V4Y190cmFjZWJhY2spOwogCiAJLyogbG9jYWxzICovCiAJc2xvdHMgPSBmLT5mX25sb2NhbHMgKyBmLT5mX25jZWxscyArIGYtPmZfbmZyZWV2YXJzOwogCWZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JZm9yIChpID0gc2xvdHM7IC0taSA+PSAwOyArK2Zhc3Rsb2NhbHMpIHsKLQkJVklTSVQoKmZhc3Rsb2NhbHMpOwotCX0KKwlmb3IgKGkgPSBzbG90czsgLS1pID49IDA7ICsrZmFzdGxvY2FscykKKwkJUHlfVklTSVQoKmZhc3Rsb2NhbHMpOwogCiAJLyogc3RhY2sgKi8KIAlpZiAoZi0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7CiAJCWZvciAocCA9IGYtPmZfdmFsdWVzdGFjazsgcCA8IGYtPmZfc3RhY2t0b3A7IHArKykKLQkJCVZJU0lUKCpwKTsKKwkJCVB5X1ZJU0lUKCpwKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00NTQsMzcgKzQ1MSwzMiBAQAogc3RhdGljIHZvaWQKIGZyYW1lX2NsZWFyKFB5RnJhbWVPYmplY3QgKmYpCiB7Ci0JUHlPYmplY3QgKipmYXN0bG9jYWxzLCAqKnA7CisJUHlPYmplY3QgKipmYXN0bG9jYWxzLCAqKnAsICoqb2xkdG9wOwogCWludCBpLCBzbG90czsKIAotCVB5X1hERUNSRUYoZi0+Zl9leGNfdHlwZSk7Ci0JZi0+Zl9leGNfdHlwZSA9IE5VTEw7CisJLyogQmVmb3JlIGFueXRoaW5nIGVsc2UsIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZnJhbWUgaXMgY2xlYXJseSBtYXJrZWQKKyAgICAgICAgICogYXMgYmVpbmcgZGVmdW5jdCEgIEVsc2UsIGUuZy4sIGEgZ2VuZXJhdG9yIHJlYWNoYWJsZSBmcm9tIHRoaXMKKyAgICAgICAgICogZnJhbWUgbWF5IGFsc28gcG9pbnQgdG8gdGhpcyBmcmFtZSwgYmVsaWV2ZSBpdHNlbGYgdG8gc3RpbGwgYmUKKyAgICAgICAgICogYWN0aXZlLCBhbmQgdHJ5IGNsZWFuaW5nIHVwIHRoaXMgZnJhbWUgYWdhaW4uCisgICAgICAgICAqLworCW9sZHRvcCA9IGYtPmZfc3RhY2t0b3A7CisgICAgICAgIGYtPmZfc3RhY2t0b3AgPSBOVUxMOwogCi0JUHlfWERFQ1JFRihmLT5mX2V4Y192YWx1ZSk7Ci0JZi0+Zl9leGNfdmFsdWUgPSBOVUxMOwotCi0JUHlfWERFQ1JFRihmLT5mX2V4Y190cmFjZWJhY2spOwotCWYtPmZfZXhjX3RyYWNlYmFjayA9IE5VTEw7Ci0KLQlQeV9YREVDUkVGKGYtPmZfdHJhY2UpOwotCWYtPmZfdHJhY2UgPSBOVUxMOworCVB5X0NMRUFSKGYtPmZfZXhjX3R5cGUpOworCVB5X0NMRUFSKGYtPmZfZXhjX3ZhbHVlKTsKKwlQeV9DTEVBUihmLT5mX2V4Y190cmFjZWJhY2spOworCVB5X0NMRUFSKGYtPmZfdHJhY2UpOwogCiAJLyogbG9jYWxzICovCiAJc2xvdHMgPSBmLT5mX25sb2NhbHMgKyBmLT5mX25jZWxscyArIGYtPmZfbmZyZWV2YXJzOwogCWZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JZm9yIChpID0gc2xvdHM7IC0taSA+PSAwOyArK2Zhc3Rsb2NhbHMpIHsKLQkJaWYgKCpmYXN0bG9jYWxzICE9IE5VTEwpIHsKLQkJCVB5X1hERUNSRUYoKmZhc3Rsb2NhbHMpOwotCQkJKmZhc3Rsb2NhbHMgPSBOVUxMOwotCQl9Ci0JfQorCWZvciAoaSA9IHNsb3RzOyAtLWkgPj0gMDsgKytmYXN0bG9jYWxzKQorCQlQeV9DTEVBUigqZmFzdGxvY2Fscyk7CiAKIAkvKiBzdGFjayAqLwotCWlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKLQkJZm9yIChwID0gZi0+Zl92YWx1ZXN0YWNrOyBwIDwgZi0+Zl9zdGFja3RvcDsgcCsrKSB7Ci0JCQlQeV9YREVDUkVGKCpwKTsKLQkJCSpwID0gTlVMTDsKLQkJfQorCWlmIChvbGR0b3AgIT0gTlVMTCkgeworCQlmb3IgKHAgPSBmLT5mX3ZhbHVlc3RhY2s7IHAgPCBvbGR0b3A7IHArKykKKwkJCVB5X0NMRUFSKCpwKTsKIAl9CiB9CiAKQEAgLTUzNCw3ICs1MjYsNyBAQAogfQogCiBQeUZyYW1lT2JqZWN0ICoKLVB5RnJhbWVfTmV3KFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSwgUHlDb2RlT2JqZWN0ICpjb2RlLCBQeU9iamVjdCAqZ2xvYmFscywgCitQeUZyYW1lX05ldyhQeVRocmVhZFN0YXRlICp0c3RhdGUsIFB5Q29kZU9iamVjdCAqY29kZSwgUHlPYmplY3QgKmdsb2JhbHMsCiAJICAgIFB5T2JqZWN0ICpsb2NhbHMpCiB7CiAJUHlGcmFtZU9iamVjdCAqYmFjayA9IHRzdGF0ZS0+ZnJhbWU7CkBAIC01NjMsMTAgKzU1NSwxMCBAQAogCQkJCWJ1aWx0aW5zID0gTlVMTDsKIAkJfQogCQlpZiAoYnVpbHRpbnMgPT0gTlVMTCkgewotCQkJLyogTm8gYnVpbHRpbnMhICBNYWtlIHVwIGEgbWluaW1hbCBvbmUgCisJCQkvKiBObyBidWlsdGlucyEgIE1ha2UgdXAgYSBtaW5pbWFsIG9uZQogCQkJICAgR2l2ZSB0aGVtICdOb25lJywgYXQgbGVhc3QuICovCiAJCQlidWlsdGlucyA9IFB5RGljdF9OZXcoKTsKLQkJCWlmIChidWlsdGlucyA9PSBOVUxMIHx8IAorCQkJaWYgKGJ1aWx0aW5zID09IE5VTEwgfHwKIAkJCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZygKIAkJCQkgICAgYnVpbHRpbnMsICJOb25lIiwgUHlfTm9uZSkgPCAwKQogCQkJCXJldHVybiBOVUxMOwpAQCAtNjExLDcgKzYwMyw3IEBACiAJUHlfSU5DUkVGKGdsb2JhbHMpOwogCWYtPmZfZ2xvYmFscyA9IGdsb2JhbHM7CiAJLyogTW9zdCBmdW5jdGlvbnMgaGF2ZSBDT19ORVdMT0NBTFMgYW5kIENPX09QVElNSVpFRCBzZXQuICovCi0JaWYgKChjb2RlLT5jb19mbGFncyAmIChDT19ORVdMT0NBTFMgfCBDT19PUFRJTUlaRUQpKSA9PSAKKwlpZiAoKGNvZGUtPmNvX2ZsYWdzICYgKENPX05FV0xPQ0FMUyB8IENPX09QVElNSVpFRCkpID09CiAJCShDT19ORVdMT0NBTFMgfCBDT19PUFRJTUlaRUQpKQogCQlsb2NhbHMgPSBOVUxMOyAvKiBQeUZyYW1lX0Zhc3RUb0xvY2FscygpIHdpbGwgc2V0LiAqLwogCWVsc2UgaWYgKGNvZGUtPmNvX2ZsYWdzICYgQ09fTkVXTE9DQUxTKSB7CkBAIC03NDksNyArNzQxLDcgQEAKIAkJcmV0dXJuOwogCVB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwogCWZhc3QgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JaiA9IFB5VHVwbGVfU2l6ZShtYXApOworCWogPSBQeVR1cGxlX0dFVF9TSVpFKG1hcCk7CiAJaWYgKGogPiBmLT5mX25sb2NhbHMpCiAJCWogPSBmLT5mX25sb2NhbHM7CiAJaWYgKGYtPmZfbmxvY2FscykKQEAgLTc1OSwxMCArNzUxLDEwIEBACiAJCSAgICAgICYmIFB5VHVwbGVfQ2hlY2soZi0+Zl9jb2RlLT5jb19mcmVldmFycykpKSB7CiAJCQlyZXR1cm47CiAJCX0KLQkJbWFwX3RvX2RpY3QoZi0+Zl9jb2RlLT5jb19jZWxsdmFycywgCisJCW1hcF90b19kaWN0KGYtPmZfY29kZS0+Y29fY2VsbHZhcnMsCiAJCQkgICAgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2NlbGx2YXJzKSwKIAkJCSAgICBsb2NhbHMsIGZhc3QgKyBmLT5mX25sb2NhbHMsIDEpOwotCQltYXBfdG9fZGljdChmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzLCAKKwkJbWFwX3RvX2RpY3QoZi0+Zl9jb2RlLT5jb19mcmVldmFycywKIAkJCSAgICBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMpLAogCQkJICAgIGxvY2FscywgZmFzdCArIGYtPmZfbmxvY2FscyArIGYtPmZfbmNlbGxzLCAxKTsKIAl9CkBAIC03ODcsNyArNzc5LDcgQEAKIAkJcmV0dXJuOwogCVB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwogCWZhc3QgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JaiA9IFB5VHVwbGVfU2l6ZShtYXApOworCWogPSBQeVR1cGxlX0dFVF9TSVpFKG1hcCk7CiAJaWYgKGogPiBmLT5mX25sb2NhbHMpCiAJCWogPSBmLT5mX25sb2NhbHM7CiAJaWYgKGYtPmZfbmxvY2FscykKQEAgLTc5NiwxMiArNzg4LDEyIEBACiAJCWlmICghKFB5VHVwbGVfQ2hlY2soZi0+Zl9jb2RlLT5jb19jZWxsdmFycykKIAkJICAgICAgJiYgUHlUdXBsZV9DaGVjayhmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKSkpCiAJCQlyZXR1cm47Ci0JCWRpY3RfdG9fbWFwKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMsIAorCQlkaWN0X3RvX21hcChmLT5mX2NvZGUtPmNvX2NlbGx2YXJzLAogCQkJICAgIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19jZWxsdmFycyksCiAJCQkgICAgbG9jYWxzLCBmYXN0ICsgZi0+Zl9ubG9jYWxzLCAxLCBjbGVhcik7Ci0JCWRpY3RfdG9fbWFwKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMsIAorCQlkaWN0X3RvX21hcChmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzLAogCQkJICAgIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19mcmVldmFycyksCi0JCQkgICAgbG9jYWxzLCBmYXN0ICsgZi0+Zl9ubG9jYWxzICsgZi0+Zl9uY2VsbHMsIDEsIAorCQkJICAgIGxvY2FscywgZmFzdCArIGYtPmZfbmxvY2FscyArIGYtPmZfbmNlbGxzLCAxLAogCQkJICAgIGNsZWFyKTsKIAl9CiAJUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKZGlmZiAtLWdpdCBhL09iamVjdHMvZnVuY29iamVjdC5jIGIvT2JqZWN0cy9mdW5jb2JqZWN0LmMKaW5kZXggMDBhZTJlYi4uNTljYjUxOSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mdW5jb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mdW5jb2JqZWN0LmMKQEAgLTQ2Niw0NyArNDY2LDE0IEBACiBzdGF0aWMgaW50CiBmdW5jX3RyYXZlcnNlKFB5RnVuY3Rpb25PYmplY3QgKmYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWludCBlcnI7Ci0JaWYgKGYtPmZ1bmNfY29kZSkgewotCQllcnIgPSB2aXNpdChmLT5mdW5jX2NvZGUsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoZi0+ZnVuY19nbG9iYWxzKSB7Ci0JCWVyciA9IHZpc2l0KGYtPmZ1bmNfZ2xvYmFscywgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChmLT5mdW5jX21vZHVsZSkgewotCQllcnIgPSB2aXNpdChmLT5mdW5jX21vZHVsZSwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChmLT5mdW5jX2RlZmF1bHRzKSB7Ci0JCWVyciA9IHZpc2l0KGYtPmZ1bmNfZGVmYXVsdHMsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoZi0+ZnVuY19kb2MpIHsKLQkJZXJyID0gdmlzaXQoZi0+ZnVuY19kb2MsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoZi0+ZnVuY19uYW1lKSB7Ci0JCWVyciA9IHZpc2l0KGYtPmZ1bmNfbmFtZSwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChmLT5mdW5jX2RpY3QpIHsKLQkJZXJyID0gdmlzaXQoZi0+ZnVuY19kaWN0LCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKGYtPmZ1bmNfY2xvc3VyZSkgewotCQllcnIgPSB2aXNpdChmLT5mdW5jX2Nsb3N1cmUsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KKwlQeV9WSVNJVChmLT5mdW5jX2NvZGUpOworCVB5X1ZJU0lUKGYtPmZ1bmNfZ2xvYmFscyk7CisJUHlfVklTSVQoZi0+ZnVuY19tb2R1bGUpOworCVB5X1ZJU0lUKGYtPmZ1bmNfZGVmYXVsdHMpOworCVB5X1ZJU0lUKGYtPmZ1bmNfZG9jKTsKKwlQeV9WSVNJVChmLT5mdW5jX25hbWUpOworCVB5X1ZJU0lUKGYtPmZ1bmNfZGljdCk7CisJUHlfVklTSVQoZi0+ZnVuY19jbG9zdXJlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjQ3LDE3ICs2MTQsMTQgQEAKIHN0YXRpYyBpbnQKIGNtX3RyYXZlcnNlKGNsYXNzbWV0aG9kICpjbSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKCFjbS0+Y21fY2FsbGFibGUpCi0JCXJldHVybiAwOwotCXJldHVybiB2aXNpdChjbS0+Y21fY2FsbGFibGUsIGFyZyk7CisJUHlfVklTSVQoY20tPmNtX2NhbGxhYmxlKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogY21fY2xlYXIoY2xhc3NtZXRob2QgKmNtKQogewotCVB5X1hERUNSRUYoY20tPmNtX2NhbGxhYmxlKTsKLQljbS0+Y21fY2FsbGFibGUgPSBOVUxMOwotCisJUHlfQ0xFQVIoY20tPmNtX2NhbGxhYmxlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODA4LDkgKzc3Miw4IEBACiBzdGF0aWMgaW50CiBzbV90cmF2ZXJzZShzdGF0aWNtZXRob2QgKnNtLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpZiAoIXNtLT5zbV9jYWxsYWJsZSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHZpc2l0KHNtLT5zbV9jYWxsYWJsZSwgYXJnKTsKKwlQeV9WSVNJVChzbS0+c21fY2FsbGFibGUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9PYmplY3RzL2dlbm9iamVjdC5jIGIvT2JqZWN0cy9nZW5vYmplY3QuYwppbmRleCAzZjZlZjg1Li4xNWU1M2RkIDEwMDY0NAotLS0gYS9PYmplY3RzL2dlbm9iamVjdC5jCisrKyBiL09iamVjdHMvZ2Vub2JqZWN0LmMKQEAgLTUsMTEgKzUsMTMgQEAKICNpbmNsdWRlICJnZW5vYmplY3QuaCIKICNpbmNsdWRlICJjZXZhbC5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgorI2luY2x1ZGUgIm9wY29kZS5oIgogCiBzdGF0aWMgaW50CiBnZW5fdHJhdmVyc2UoUHlHZW5PYmplY3QgKmdlbiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JcmV0dXJuIHZpc2l0KChQeU9iamVjdCAqKWdlbi0+Z2lfZnJhbWUsIGFyZyk7CisJUHlfVklTSVQoKFB5T2JqZWN0ICopZ2VuLT5naV9mcmFtZSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yMCwxMiArMjIsMTEgQEAKIAlfUHlPYmplY3RfR0NfVU5UUkFDSyhnZW4pOwogCiAJaWYgKGdlbi0+Z2lfd2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgZ2VuKTsKLQorCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKHNlbGYpOwogCiAJX1B5T2JqZWN0X0dDX1RSQUNLKHNlbGYpOwogCi0JaWYgKGdlbi0+Z2lfZnJhbWUtPmZfc3RhY2t0b3AhPU5VTEwpIHsKKwlpZiAoZ2VuLT5naV9mcmFtZSAhPSBOVUxMICYmIGdlbi0+Z2lfZnJhbWUtPmZfc3RhY2t0b3AgIT0gTlVMTCkgewogCQkvKiBHZW5lcmF0b3IgaXMgcGF1c2VkLCBzbyB3ZSBuZWVkIHRvIGNsb3NlICovCiAJCWdlbi0+b2JfdHlwZS0+dHBfZGVsKHNlbGYpOwogCQlpZiAoc2VsZi0+b2JfcmVmY250ID4gMCkKQEAgLTMzLDcgKzM0LDcgQEAKIAl9CiAKIAlfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKLQlQeV9YREVDUkVGKGdlbi0+Z2lfZnJhbWUpOworCVB5X0NMRUFSKGdlbi0+Z2lfZnJhbWUpOwogCVB5T2JqZWN0X0dDX0RlbChnZW4pOwogfQogCkBAIC01MCwxNiArNTEsMTggQEAKIAkJCQkiZ2VuZXJhdG9yIGFscmVhZHkgZXhlY3V0aW5nIik7CiAJCXJldHVybiBOVUxMOwogCX0KLQlpZiAoKFB5T2JqZWN0ICopZiA9PSBQeV9Ob25lIHx8IGYtPmZfc3RhY2t0b3AgPT0gTlVMTCkgeworCWlmIChmPT1OVUxMIHx8IGYtPmZfc3RhY2t0b3AgPT0gTlVMTCkgewogCQkvKiBPbmx5IHNldCBleGNlcHRpb24gaWYgY2FsbGVkIGZyb20gc2VuZCgpICovCi0JCWlmIChhcmcgJiYgIWV4YykgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKwkJaWYgKGFyZyAmJiAhZXhjKQorCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJaWYgKGYtPmZfbGFzdGkgPT0gLTEpIHsKIAkJaWYgKGFyZyAmJiBhcmcgIT0gUHlfTm9uZSkgewogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3Qgc2VuZCBub24tTm9uZSB2YWx1ZSB0byBhIGp1c3Qtc3RhcnRlZCBnZW5lcmF0b3IiKTsKKwkJCQkJImNhbid0IHNlbmQgbm9uLU5vbmUgdmFsdWUgdG8gYSAiCisJCQkJCSJqdXN0LXN0YXJ0ZWQgZ2VuZXJhdG9yIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0gZWxzZSB7CkBAIC05MSwyMSArOTQsMjIgQEAKIAkJUHlfREVDUkVGKHJlc3VsdCk7CiAJCXJlc3VsdCA9IE5VTEw7CiAJCS8qIFNldCBleGNlcHRpb24gaWYgbm90IGNhbGxlZCBieSBnZW5faXRlcm5leHQoKSAqLwotCQlpZiAoYXJnKSBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworCQlpZiAoYXJnKQorCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKIAl9CiAKIAlpZiAoIXJlc3VsdCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKIAkJLyogZ2VuZXJhdG9yIGNhbid0IGJlIHJlcnVuLCBzbyByZWxlYXNlIHRoZSBmcmFtZSAqLwogCQlQeV9ERUNSRUYoZik7Ci0JCWdlbi0+Z2lfZnJhbWUgPSAoUHlGcmFtZU9iamVjdCAqKVB5X05vbmU7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwkJZ2VuLT5naV9mcmFtZSA9IE5VTEw7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHNlbmRfZG9jLAotInNlbmQoYXJnKSAtPiBzZW5kICdhcmcnIGludG8gZ2VuZXJhdG9yLCByZXR1cm4gbmV4dCB5aWVsZGVkIHZhbHVlIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24uIik7Cisic2VuZChhcmcpIC0+IHNlbmQgJ2FyZycgaW50byBnZW5lcmF0b3IsXG5cCityZXR1cm4gbmV4dCB5aWVsZGVkIHZhbHVlIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24uIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5fc2VuZChQeUdlbk9iamVjdCAqZ2VuLCBQeU9iamVjdCAqYXJnKQpAQCAtMTI1LDExICsxMjksMTEgQEAKIAlpZiAocmV0dmFsKSB7CiAJCVB5X0RFQ1JFRihyZXR2YWwpOwogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJImdlbmVyYXRvciBpZ25vcmVkIEdlbmVyYXRvckV4aXQiKTsKKwkJCQkiZ2VuZXJhdG9yIGlnbm9yZWQgR2VuZXJhdG9yRXhpdCIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JaWYgKCBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pIAotCSAgICAgfHwgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19HZW5lcmF0b3JFeGl0KSApIAorCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pCisJICAgIHx8IFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfR2VuZXJhdG9yRXhpdCkpCiAJewogCQlQeUVycl9DbGVhcigpOwkvKiBpZ25vcmUgdGhlc2UgZXJyb3JzICovCiAJCVB5X0lOQ1JFRihQeV9Ob25lKTsKQEAgLTE0NSw3ICsxNDksNyBAQAogICAgICAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOwogCVB5R2VuT2JqZWN0ICpnZW4gPSAoUHlHZW5PYmplY3QgKilzZWxmOwogCi0JaWYgKChQeU9iamVjdCAqKWdlbi0+Z2lfZnJhbWUgPT0gUHlfTm9uZSB8fCBnZW4tPmdpX2ZyYW1lLT5mX3N0YWNrdG9wPT1OVUxMKQorCWlmIChnZW4tPmdpX2ZyYW1lID09IE5VTEwgfHwgZ2VuLT5naV9mcmFtZS0+Zl9zdGFja3RvcCA9PSBOVUxMKQogCQkvKiBHZW5lcmF0b3IgaXNuJ3QgcGF1c2VkLCBzbyBubyBuZWVkIHRvIGNsb3NlICovCiAJCXJldHVybjsKIApAQCAtMTU2LDEwICsxNjAsMTAgQEAKICAgICAgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KICAgICAgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CiAKLQlyZXMgPSBnZW5fY2xvc2UoKFB5R2VuT2JqZWN0ICopc2VsZiwgTlVMTCk7CisJcmVzID0gZ2VuX2Nsb3NlKGdlbiwgTlVMTCk7CiAKIAlpZiAocmVzID09IE5VTEwpCi0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QgKilzZWxmKTsKKwkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHNlbGYpOwogCWVsc2UKIAkJUHlfREVDUkVGKHJlcyk7CiAKQEAgLTE4MSw3ICsxODUsNyBAQAogICAgICAgICAgICAgICAgIF9QeV9OZXdSZWZlcmVuY2Uoc2VsZik7CiAgICAgICAgICAgICAgICAgc2VsZi0+b2JfcmVmY250ID0gcmVmY250OwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydCghUHlUeXBlX0lTX0dDKHNlbGYtPm9iX3R5cGUpIHx8CisgICAgICAgIGFzc2VydChQeVR5cGVfSVNfR0Moc2VsZi0+b2JfdHlwZSkgJiYKICAgICAgICAgICAgICAgIF9QeV9BU19HQyhzZWxmKS0+Z2MuZ2NfcmVmcyAhPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCk7CiAKICAgICAgICAgLyogSWYgUHlfUkVGX0RFQlVHLCBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCBfUHlfUmVmVG90YWwsIHNvCkBAIC0yMDIsMTAgKzIwNiwxMSBAQAogCiAKIFB5RG9jX1NUUlZBUih0aHJvd19kb2MsCi0idGhyb3codHlwWyx2YWxbLHRiXV0pIC0+IHJhaXNlIGV4Y2VwdGlvbiBpbiBnZW5lcmF0b3IsIHJldHVybiBuZXh0IHlpZWxkZWQgdmFsdWUgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbi4iKTsKKyJ0aHJvdyh0eXBbLHZhbFssdGJdXSkgLT4gcmFpc2UgZXhjZXB0aW9uIGluIGdlbmVyYXRvcixcblwKK3JldHVybiBuZXh0IHlpZWxkZWQgdmFsdWUgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbi4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWdlbl90aHJvdyhQeUdlbk9iamVjdCAqZ2VuLCBQeU9iamVjdCAqYXJncykgCitnZW5fdGhyb3coUHlHZW5PYmplY3QgKmdlbiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAJUHlPYmplY3QgKnR5cDsKIAlQeU9iamVjdCAqdGIgPSBOVUxMOwpAQCAtMjE2LDEwICsyMjEsOCBAQAogCiAJLyogRmlyc3QsIGNoZWNrIHRoZSB0cmFjZWJhY2sgYXJndW1lbnQsIHJlcGxhY2luZyBOb25lIHdpdGgKIAkgICBOVUxMLiAqLwotCWlmICh0YiA9PSBQeV9Ob25lKSB7Ci0JCVB5X0RFQ1JFRih0Yik7CisJaWYgKHRiID09IFB5X05vbmUpCiAJCXRiID0gTlVMTDsKLQl9CiAJZWxzZSBpZiAodGIgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sodGIpKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkidGhyb3coKSB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIGEgdHJhY2ViYWNrIG9iamVjdCIpOwpAQCAtMjQ5LDcgKzI1MiwxMCBAQAogCQkJUHlfSU5DUkVGKHR5cCk7CiAJCX0KIAl9Ci0JZWxzZSB7CisKKwkvKiBBbGxvdyByYWlzaW5nIGJ1aWx0aW4gc3RyaW5nIGV4Y2VwdGlvbnMgKi8KKworCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KHR5cCkpIHsKIAkJLyogTm90IHNvbWV0aGluZyB5b3UgY2FuIHJhaXNlLiAgdGhyb3coKSBmYWlscy4gKi8KIAkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKIAkJCSAgICAgImV4Y2VwdGlvbnMgbXVzdCBiZSBjbGFzc2VzLCBvciBpbnN0YW5jZXMsIG5vdCAlcyIsCkBAIC0yNTcsNyArMjYzLDcgQEAKIAkJCWdvdG8gZmFpbGVkX3Rocm93OwogCX0KIAotCVB5RXJyX1Jlc3RvcmUodHlwLHZhbCx0Yik7CisJUHlFcnJfUmVzdG9yZSh0eXAsIHZhbCwgdGIpOwogCXJldHVybiBnZW5fc2VuZF9leChnZW4sIFB5X05vbmUsIDEpOwogCiBmYWlsZWRfdGhyb3c6CkBAIC0zMjQsNyArMzMwLDcgQEAKIAkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCiAJMCwJCQkJCS8qIHRwX2Jhc2UgKi8KIAkwLAkJCQkJLyogdHBfZGljdCAqLwotICAgICAgICAKKwogCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KIAkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCiAJMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KQEAgLTM1NSwzICszNjEsMjMgQEAKIAlfUHlPYmplY3RfR0NfVFJBQ0soZ2VuKTsKIAlyZXR1cm4gKFB5T2JqZWN0ICopZ2VuOwogfQorCitpbnQKK1B5R2VuX05lZWRzRmluYWxpemluZyhQeUdlbk9iamVjdCAqZ2VuKQoreworCWludCBpOworCVB5RnJhbWVPYmplY3QgKmYgPSBnZW4tPmdpX2ZyYW1lOworCisJaWYgKGYgPT0gTlVMTCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwgfHwgZi0+Zl9pYmxvY2sgPD0gMCkKKwkJcmV0dXJuIDA7IC8qIG5vIGZyYW1lIG9yIGVtcHR5IGJsb2Nrc3RhY2sgPT0gbm8gZmluYWxpemF0aW9uICovCisKKwkvKiBBbnkgYmxvY2sgdHlwZSBiZXNpZGVzIGEgbG9vcCByZXF1aXJlcyBjbGVhbnVwLiAqLworCWkgPSBmLT5mX2libG9jazsKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJaWYgKGYtPmZfYmxvY2tzdGFja1tpXS5iX3R5cGUgIT0gU0VUVVBfTE9PUCkKKwkJCXJldHVybiAxOworCX0KKworCS8qIE5vIGJsb2NrcyBleGNlcHQgbG9vcHMsIGl0J3Mgc2FmZSB0byBza2lwIGZpbmFsaXphdGlvbi4gKi8KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL09iamVjdHMvaW50b2JqZWN0LmMgYi9PYmplY3RzL2ludG9iamVjdC5jCmluZGV4IGM3MzQ4NDAuLmZiMzIyMWYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvaW50b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9pbnRvYmplY3QuYwpAQCAtMjU1LDE4ICsyNTUsMTggQEAKIAlpZiAob3AgPT0gTlVMTCB8fCAobmIgPSBvcC0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8CiAJICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKIAl9CiAKIAlpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKIAlpZiAoaW8gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CiAJaWYgKCFQeUludF9DaGVjayhpbykpIHsKIAkJaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKIAkJCXZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKFB5T2JqZWN0ICopaW8pOwogCQkJUHlfREVDUkVGKGlvKTsKIAkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKKwkJCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CiAJCQlyZXR1cm4gdmFsOwogCQl9CiAJCWVsc2UKQEAgLTI3NCw3ICsyNzQsNyBAQAogCQkJUHlfREVDUkVGKGlvKTsKIAkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJCSJuYl9pbnQgc2hvdWxkIHJldHVybiBpbnQgb2JqZWN0Iik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CiAJCX0KIAl9CiAKQEAgLTMwMCwxOCArMzAwLDE4IEBACiAJaWYgKG9wID09IE5VTEwgfHwgKG5iID0gb3AtPm9iX3R5cGUtPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAogCSAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKIAl9CiAKIAlpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKIAlpZiAoaW8gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKIAlpZiAoIVB5SW50X0NoZWNrKGlvKSkgewogCQlpZiAoUHlMb25nX0NoZWNrKGlvKSkgewogCQkJdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soKFB5T2JqZWN0ICopaW8pOwogCQkJUHlfREVDUkVGKGlvKTsKIAkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKKwkJCQlyZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKIAkJCXJldHVybiB2YWw7CiAJCX0KIAkJZWxzZQpAQCAtMzE5LDcgKzMxOSw3IEBACiAJCQlQeV9ERUNSRUYoaW8pOwogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCQkJIm5iX2ludCBzaG91bGQgcmV0dXJuIGludCBvYmplY3QiKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOwogCQl9CiAJfQogCkBAIC0zMzUsNyArMzM1LDggQEAKIHsKIAljaGFyICplbmQ7CiAJbG9uZyB4OwotCWNoYXIgYnVmZmVyWzI1Nl07IC8qIEZvciBlcnJvcnMgKi8KKwlQeV9zc2l6ZV90IHNsZW47CisJUHlPYmplY3QgKnNvYmosICpzcmVwcjsKIAogCWlmICgoYmFzZSAhPSAwICYmIGJhc2UgPCAyKSB8fCBiYXNlID4gMzYpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCkBAIC0zNTksOSArMzYwLDE4IEBACiAJCWVuZCsrOwogCWlmICgqZW5kICE9ICdcMCcpIHsKICAgYmFkOgotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKTogJS4yMDBzIiwgcyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOworCQlzbGVuID0gc3RybGVuKHMpIDwgMjAwID8gc3RybGVuKHMpIDogMjAwOworCQlzb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgc2xlbik7CisJCWlmIChzb2JqID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3JlcHIgPSBQeU9iamVjdF9SZXByKHNvYmopOworCQlQeV9ERUNSRUYoc29iaik7CisJCWlmIChzcmVwciA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorCQkJICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgJWQ6ICVzIiwKKwkJCSAgICAgYmFzZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHNyZXByKSk7CisJCVB5X0RFQ1JFRihzcmVwcik7CiAJCXJldHVybiBOVUxMOwogCX0KIAllbHNlIGlmIChlcnJubyAhPSAwKQpAQCAtMzc2LDcgKzM4Niw3IEBACiBQeUludF9Gcm9tVW5pY29kZShQeV9VTklDT0RFICpzLCBQeV9zc2l6ZV90IGxlbmd0aCwgaW50IGJhc2UpCiB7CiAJUHlPYmplY3QgKnJlc3VsdDsKLQljaGFyICpidWZmZXIgPSBQeU1lbV9NQUxMT0MobGVuZ3RoKzEpOworCWNoYXIgKmJ1ZmZlciA9IChjaGFyICopUHlNZW1fTUFMTE9DKGxlbmd0aCsxKTsKIAogCWlmIChidWZmZXIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CkBAIC05NjEsNyArOTcxLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfc3VidHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnRtcCwgKm5ldzsKKwlQeU9iamVjdCAqdG1wLCAqbmV3b2JqOwogCWxvbmcgaXZhbDsKIAogCWFzc2VydChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeUludF9UeXBlKSk7CkBAIC05NzgsMTQgKzk4OCwxNCBAQAogCQlpdmFsID0gKChQeUludE9iamVjdCAqKXRtcCktPm9iX2l2YWw7CiAJfQogCi0JbmV3ID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKG5ldyA9PSBOVUxMKSB7CisJbmV3b2JqID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisJaWYgKG5ld29iaiA9PSBOVUxMKSB7CiAJCVB5X0RFQ1JFRih0bXApOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JKChQeUludE9iamVjdCAqKW5ldyktPm9iX2l2YWwgPSBpdmFsOworCSgoUHlJbnRPYmplY3QgKiluZXdvYmopLT5vYl9pdmFsID0gaXZhbDsKIAlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdvYmo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMDQ2LDcgKzEwNTYsNyBAQAogCWludF90cnVlX2RpdmlkZSwJLyogbmJfdHJ1ZV9kaXZpZGUgKi8KIAkwLAkJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCiAJMCwJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCi0JKGxlbmZ1bmMpUHlJbnRfQXNTc2l6ZV90LCAvKiBuYl9pbmRleCAqLworCVB5SW50X0FzU3NpemVfdCwJLyogbmJfaW5kZXggKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUludF9UeXBlID0gewpAQCAtMTExOSw2ICsxMTI5LDcgQEAKIAlQeUludE9iamVjdCAqcDsKIAlQeUludEJsb2NrICpsaXN0LCAqbmV4dDsKIAlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgY3RyOwogCWludCBiYywgYmY7CS8qIGJsb2NrIGNvdW50LCBudW1iZXIgb2YgZnJlZWQgYmxvY2tzICovCiAJaW50IGlyZW0sIGlzdW07CS8qIHJlbWFpbmluZyB1bmZyZWVkIGludHMgcGVyIGJsb2NrLCB0b3RhbCAqLwogCkBAIC0xMTQxLDkgKzExNTIsOSBAQAogCXdoaWxlIChsaXN0ICE9IE5VTEwpIHsKIAkJYmMrKzsKIAkJaXJlbSA9IDA7Ci0JCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJICAgICBpIDwgTl9JTlRPQkpFQ1RTOwotCQkgICAgIGkrKywgcCsrKSB7CisJCWZvciAoY3RyID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOworCQkgICAgIGN0ciA8IE5fSU5UT0JKRUNUUzsKKwkJICAgICBjdHIrKywgcCsrKSB7CiAJCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdChwKSAmJiBwLT5vYl9yZWZjbnQgIT0gMCkKIAkJCQlpcmVtKys7CiAJCX0KQEAgLTExNTEsOSArMTE2Miw5IEBACiAJCWlmIChpcmVtKSB7CiAJCQlsaXN0LT5uZXh0ID0gYmxvY2tfbGlzdDsKIAkJCWJsb2NrX2xpc3QgPSBsaXN0OwotCQkJZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOwotCQkJICAgICBpIDwgTl9JTlRPQkpFQ1RTOwotCQkJICAgICBpKyssIHArKykgeworCQkJZm9yIChjdHIgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07CisJCQkgICAgIGN0ciA8IE5fSU5UT0JKRUNUUzsKKwkJCSAgICAgY3RyKyssIHArKykgewogCQkJCWlmICghUHlJbnRfQ2hlY2tFeGFjdChwKSB8fAogCQkJCSAgICBwLT5vYl9yZWZjbnQgPT0gMCkgewogCQkJCQlwLT5vYl90eXBlID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKQpAQCAtMTE5NCw5ICsxMjA1LDkgQEAKIAlpZiAoUHlfVmVyYm9zZUZsYWcgPiAxKSB7CiAJCWxpc3QgPSBibG9ja19saXN0OwogCQl3aGlsZSAobGlzdCAhPSBOVUxMKSB7Ci0JCQlmb3IgKGkgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07Ci0JCQkgICAgIGkgPCBOX0lOVE9CSkVDVFM7Ci0JCQkgICAgIGkrKywgcCsrKSB7CisJCQlmb3IgKGN0ciA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKKwkJCSAgICAgY3RyIDwgTl9JTlRPQkpFQ1RTOworCQkJICAgICBjdHIrKywgcCsrKSB7CiAJCQkJaWYgKFB5SW50X0NoZWNrRXhhY3QocCkgJiYgcC0+b2JfcmVmY250ICE9IDApCiAJCQkJCS8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0bwogCQkJCQkgICBsb25nIHVudGlsICV6ZCBpcyB1bml2ZXJzYWxseQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9pdGVyb2JqZWN0LmMgYi9PYmplY3RzL2l0ZXJvYmplY3QuYwppbmRleCA1MWY1NTFiLi5jZjgzOWY0IDEwMDY0NAotLS0gYS9PYmplY3RzL2l0ZXJvYmplY3QuYworKysgYi9PYmplY3RzL2l0ZXJvYmplY3QuYwpAQCAtMzgsOSArMzgsOCBAQAogc3RhdGljIGludAogaXRlcl90cmF2ZXJzZShzZXFpdGVyb2JqZWN0ICppdCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKGl0LT5pdF9zZXEgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHZpc2l0KGl0LT5pdF9zZXEsIGFyZyk7CisJUHlfVklTSVQoaXQtPml0X3NlcSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMjMsNyArMTIyLDcgQEAKIAkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KIAkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KIAlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylpdGVyX2l0ZXJuZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KKwlpdGVyX2l0ZXJuZXh0LAkJCQkvKiB0cF9pdGVybmV4dCAqLwogCXNlcWl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCiAJMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KIH07CkBAIC0xNjIsMTEgKzE2MSw4IEBACiBzdGF0aWMgaW50CiBjYWxsaXRlcl90cmF2ZXJzZShjYWxsaXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWludCBlcnI7Ci0JaWYgKGl0LT5pdF9jYWxsYWJsZSAhPSBOVUxMICYmIChlcnIgPSB2aXNpdChpdC0+aXRfY2FsbGFibGUsIGFyZykpKQotCQlyZXR1cm4gZXJyOwotCWlmIChpdC0+aXRfc2VudGluZWwgIT0gTlVMTCAmJiAoZXJyID0gdmlzaXQoaXQtPml0X3NlbnRpbmVsLCBhcmcpKSkKLQkJcmV0dXJuIGVycjsKKwlQeV9WSVNJVChpdC0+aXRfY2FsbGFibGUpOworCVB5X1ZJU0lUKGl0LT5pdF9zZW50aW5lbCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvbGlzdG9iamVjdC5jIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKaW5kZXggOTY2ZDY1OS4uMTA1ZGY0YyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9saXN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKQEAgLTE4MSw3ICsxODEsNyBAQAogCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAobiA9PSBJTlRfTUFYKSB7CisJaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkiY2Fubm90IGFkZCBtb3JlIG9iamVjdHMgdG8gbGlzdCIpOwogCQlyZXR1cm4gLTE7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAlQeV9zc2l6ZV90IG4gPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7CiAKIAlhc3NlcnQgKHYgIT0gTlVMTCk7Ci0JaWYgKG4gPT0gSU5UX01BWCkgeworCWlmIChuID09IFBZX1NTSVpFX1RfTUFYKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAogCQkJImNhbm5vdCBhZGQgbW9yZSBvYmplY3RzIHRvIGxpc3QiKTsKIAkJcmV0dXJuIC0xOwpAQCAtMTgwNSwyOCArMTgwNSwxMSBAQAogCVB5T2JqZWN0ICp2YWx1ZTsKIH0gc29ydHdyYXBwZXJvYmplY3Q7CiAKLXN0YXRpYyBQeVR5cGVPYmplY3Qgc29ydHdyYXBwZXJfdHlwZTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLXNvcnR3cmFwcGVyX3JpY2hjb21wYXJlKHNvcnR3cmFwcGVyb2JqZWN0ICphLCBzb3J0d3JhcHBlcm9iamVjdCAqYiwgaW50IG9wKQotewotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKGIsICZzb3J0d3JhcHBlcl90eXBlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZShhLT5rZXksIGItPmtleSwgb3ApOwotfQotCi1zdGF0aWMgdm9pZAotc29ydHdyYXBwZXJfZGVhbGxvYyhzb3J0d3JhcHBlcm9iamVjdCAqc28pCi17Ci0JUHlfWERFQ1JFRihzby0+a2V5KTsKLQlQeV9YREVDUkVGKHNvLT52YWx1ZSk7Ci0JUHlPYmplY3RfRGVsKHNvKTsKLX0KLQogUHlEb2NfU1RSVkFSKHNvcnR3cmFwcGVyX2RvYywgIk9iamVjdCB3cmFwcGVyIHdpdGggYSBjdXN0b20gc29ydCBrZXkuIik7CitzdGF0aWMgUHlPYmplY3QgKgorc29ydHdyYXBwZXJfcmljaGNvbXBhcmUoc29ydHdyYXBwZXJvYmplY3QgKiwgc29ydHdyYXBwZXJvYmplY3QgKiwgaW50KTsKK3N0YXRpYyB2b2lkCitzb3J0d3JhcHBlcl9kZWFsbG9jKHNvcnR3cmFwcGVyb2JqZWN0ICopOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHNvcnR3cmFwcGVyX3R5cGUgPSB7CiAJUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKQEAgLTE4NTgsNiArMTg0MSwyNiBAQAogCShyaWNoY21wZnVuYylzb3J0d3JhcHBlcl9yaWNoY29tcGFyZSwJLyogdHBfcmljaGNvbXBhcmUgKi8KIH07CiAKKworc3RhdGljIFB5T2JqZWN0ICoKK3NvcnR3cmFwcGVyX3JpY2hjb21wYXJlKHNvcnR3cmFwcGVyb2JqZWN0ICphLCBzb3J0d3JhcHBlcm9iamVjdCAqYiwgaW50IG9wKQoreworCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKGIsICZzb3J0d3JhcHBlcl90eXBlKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkJImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZShhLT5rZXksIGItPmtleSwgb3ApOworfQorCitzdGF0aWMgdm9pZAorc29ydHdyYXBwZXJfZGVhbGxvYyhzb3J0d3JhcHBlcm9iamVjdCAqc28pCit7CisJUHlfWERFQ1JFRihzby0+a2V5KTsKKwlQeV9YREVDUkVGKHNvLT52YWx1ZSk7CisJUHlPYmplY3RfRGVsKHNvKTsKK30KKwogLyogUmV0dXJucyBhIG5ldyByZWZlcmVuY2UgdG8gYSBzb3J0d3JhcHBlci4KICAgIENvbnN1bWVzIHRoZSByZWZlcmVuY2VzIHRvIHRoZSB0d28gdW5kZXJseWluZyBvYmplY3RzLiAqLwogCkBAIC0yMjcxLDE2ICsyMjc0LDkgQEAKIGxpc3RfdHJhdmVyc2UoUHlMaXN0T2JqZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKIAlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKng7CiAKLQlmb3IgKGkgPSBvLT5vYl9zaXplOyAtLWkgPj0gMDsgKSB7Ci0JCXggPSBvLT5vYl9pdGVtW2ldOwotCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQlpbnQgZXJyID0gdmlzaXQoeCwgYXJnKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KKwlmb3IgKGkgPSBvLT5vYl9zaXplOyAtLWkgPj0gMDsgKQorCQlQeV9WSVNJVChvLT5vYl9pdGVtW2ldKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjY5OCw3OCArMjY5NCwxMSBAQAogCVB5TGlzdE9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBsaXN0aXRlcm9iamVjdDsKIAotUHlUeXBlT2JqZWN0IFB5TGlzdEl0ZXJfVHlwZTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLWxpc3RfaXRlcihQeU9iamVjdCAqc2VxKQotewotCWxpc3RpdGVyb2JqZWN0ICppdDsKLQotCWlmICghUHlMaXN0X0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhsaXN0aXRlcm9iamVjdCwgJlB5TGlzdEl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0LT5pdF9pbmRleCA9IDA7Ci0JUHlfSU5DUkVGKHNlcSk7Ci0JaXQtPml0X3NlcSA9IChQeUxpc3RPYmplY3QgKilzZXE7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1saXN0aXRlcl9kZWFsbG9jKGxpc3RpdGVyb2JqZWN0ICppdCkKLXsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhpdCk7Ci0JUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKLQlQeU9iamVjdF9HQ19EZWwoaXQpOwotfQotCi1zdGF0aWMgaW50Ci1saXN0aXRlcl90cmF2ZXJzZShsaXN0aXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQotewotCWlmIChpdC0+aXRfc2VxID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiB2aXNpdCgoUHlPYmplY3QgKilpdC0+aXRfc2VxLCBhcmcpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbGlzdGl0ZXJfbmV4dChsaXN0aXRlcm9iamVjdCAqaXQpCi17Ci0JUHlMaXN0T2JqZWN0ICpzZXE7Ci0JUHlPYmplY3QgKml0ZW07Ci0KLQlhc3NlcnQoaXQgIT0gTlVMTCk7Ci0Jc2VxID0gaXQtPml0X3NlcTsKLQlpZiAoc2VxID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeUxpc3RfQ2hlY2soc2VxKSk7Ci0KLQlpZiAoaXQtPml0X2luZGV4IDwgUHlMaXN0X0dFVF9TSVpFKHNlcSkpIHsKLQkJaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShzZXEsIGl0LT5pdF9pbmRleCk7Ci0JCSsraXQtPml0X2luZGV4OwotCQlQeV9JTkNSRUYoaXRlbSk7Ci0JCXJldHVybiBpdGVtOwotCX0KLQotCVB5X0RFQ1JFRihzZXEpOwotCWl0LT5pdF9zZXEgPSBOVUxMOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbGlzdGl0ZXJfbGVuKGxpc3RpdGVyb2JqZWN0ICppdCkKLXsKLQlQeV9zc2l6ZV90IGxlbjsKLQlpZiAoaXQtPml0X3NlcSkgewotCQlsZW4gPSBQeUxpc3RfR0VUX1NJWkUoaXQtPml0X3NlcSkgLSBpdC0+aXRfaW5kZXg7Ci0JCWlmIChsZW4gPj0gMCkKLQkJCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChsZW4pOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7Ci19CitzdGF0aWMgUHlPYmplY3QgKmxpc3RfaXRlcihQeU9iamVjdCAqKTsKK3N0YXRpYyB2b2lkIGxpc3RpdGVyX2RlYWxsb2MobGlzdGl0ZXJvYmplY3QgKik7CitzdGF0aWMgaW50IGxpc3RpdGVyX3RyYXZlcnNlKGxpc3RpdGVyb2JqZWN0ICosIHZpc2l0cHJvYywgdm9pZCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqbGlzdGl0ZXJfbmV4dChsaXN0aXRlcm9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqbGlzdGl0ZXJfbGVuKGxpc3RpdGVyb2JqZWN0ICopOwogCiBQeURvY19TVFJWQVIobGVuZ3RoX2hpbnRfZG9jLCAiUHJpdmF0ZSBtZXRob2QgcmV0dXJuaW5nIGFuIGVzdGltYXRlIG9mIGxlbihsaXN0KGl0KSkuIik7CiAKQEAgLTI4MTIsNiArMjc0MSw3NiBAQAogCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCiB9OwogCisKK3N0YXRpYyBQeU9iamVjdCAqCitsaXN0X2l0ZXIoUHlPYmplY3QgKnNlcSkKK3sKKwlsaXN0aXRlcm9iamVjdCAqaXQ7CisKKwlpZiAoIVB5TGlzdF9DaGVjayhzZXEpKSB7CisJCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaXQgPSBQeU9iamVjdF9HQ19OZXcobGlzdGl0ZXJvYmplY3QsICZQeUxpc3RJdGVyX1R5cGUpOworCWlmIChpdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpdC0+aXRfaW5kZXggPSAwOworCVB5X0lOQ1JFRihzZXEpOworCWl0LT5pdF9zZXEgPSAoUHlMaXN0T2JqZWN0ICopc2VxOworCV9QeU9iamVjdF9HQ19UUkFDSyhpdCk7CisJcmV0dXJuIChQeU9iamVjdCAqKWl0OworfQorCitzdGF0aWMgdm9pZAorbGlzdGl0ZXJfZGVhbGxvYyhsaXN0aXRlcm9iamVjdCAqaXQpCit7CisJX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOworCVB5X1hERUNSRUYoaXQtPml0X3NlcSk7CisJUHlPYmplY3RfR0NfRGVsKGl0KTsKK30KKworc3RhdGljIGludAorbGlzdGl0ZXJfdHJhdmVyc2UobGlzdGl0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKwlQeV9WSVNJVChpdC0+aXRfc2VxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2xpc3RpdGVyX25leHQobGlzdGl0ZXJvYmplY3QgKml0KQoreworCVB5TGlzdE9iamVjdCAqc2VxOworCVB5T2JqZWN0ICppdGVtOworCisJYXNzZXJ0KGl0ICE9IE5VTEwpOworCXNlcSA9IGl0LT5pdF9zZXE7CisJaWYgKHNlcSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlhc3NlcnQoUHlMaXN0X0NoZWNrKHNlcSkpOworCisJaWYgKGl0LT5pdF9pbmRleCA8IFB5TGlzdF9HRVRfU0laRShzZXEpKSB7CisJCWl0ZW0gPSBQeUxpc3RfR0VUX0lURU0oc2VxLCBpdC0+aXRfaW5kZXgpOworCQkrK2l0LT5pdF9pbmRleDsKKwkJUHlfSU5DUkVGKGl0ZW0pOworCQlyZXR1cm4gaXRlbTsKKwl9CisKKwlQeV9ERUNSRUYoc2VxKTsKKwlpdC0+aXRfc2VxID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2xpc3RpdGVyX2xlbihsaXN0aXRlcm9iamVjdCAqaXQpCit7CisJUHlfc3NpemVfdCBsZW47CisJaWYgKGl0LT5pdF9zZXEpIHsKKwkJbGVuID0gUHlMaXN0X0dFVF9TSVpFKGl0LT5pdF9zZXEpIC0gaXQtPml0X2luZGV4OworCQlpZiAobGVuID49IDApCisJCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobGVuKTsKKwl9CisJcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOworfQogLyoqKioqKioqKioqKioqKioqKioqKioqIExpc3QgUmV2ZXJzZSBJdGVyYXRvciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMjgyMCw2OSArMjgxOSwxMSBAQAogCVB5TGlzdE9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBsaXN0cmV2aXRlcm9iamVjdDsKIAotUHlUeXBlT2JqZWN0IFB5TGlzdFJldkl0ZXJfVHlwZTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLWxpc3RfcmV2ZXJzZWQoUHlMaXN0T2JqZWN0ICpzZXEsIFB5T2JqZWN0ICp1bnVzZWQpCi17Ci0JbGlzdHJldml0ZXJvYmplY3QgKml0OwotCi0JaXQgPSBQeU9iamVjdF9HQ19OZXcobGlzdHJldml0ZXJvYmplY3QsICZQeUxpc3RSZXZJdGVyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKHNlcSkpOwotCWl0LT5pdF9pbmRleCA9IFB5TGlzdF9HRVRfU0laRShzZXEpIC0gMTsKLQlQeV9JTkNSRUYoc2VxKTsKLQlpdC0+aXRfc2VxID0gc2VxOwotCVB5T2JqZWN0X0dDX1RyYWNrKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1saXN0cmV2aXRlcl9kZWFsbG9jKGxpc3RyZXZpdGVyb2JqZWN0ICppdCkKLXsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGl0KTsKLQlQeV9YREVDUkVGKGl0LT5pdF9zZXEpOwotCVB5T2JqZWN0X0dDX0RlbChpdCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWxpc3RyZXZpdGVyX3RyYXZlcnNlKGxpc3RyZXZpdGVyb2JqZWN0ICppdCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCi17Ci0JaWYgKGl0LT5pdF9zZXEgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHZpc2l0KChQeU9iamVjdCAqKWl0LT5pdF9zZXEsIGFyZyk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1saXN0cmV2aXRlcl9uZXh0KGxpc3RyZXZpdGVyb2JqZWN0ICppdCkKLXsKLQlQeU9iamVjdCAqaXRlbTsKLQlQeV9zc2l6ZV90IGluZGV4ID0gaXQtPml0X2luZGV4OwotCVB5TGlzdE9iamVjdCAqc2VxID0gaXQtPml0X3NlcTsKLQotCWlmIChpbmRleD49MCAmJiBpbmRleCA8IFB5TGlzdF9HRVRfU0laRShzZXEpKSB7Ci0JCWl0ZW0gPSBQeUxpc3RfR0VUX0lURU0oc2VxLCBpbmRleCk7Ci0JCWl0LT5pdF9pbmRleC0tOwotCQlQeV9JTkNSRUYoaXRlbSk7Ci0JCXJldHVybiBpdGVtOwotCX0KLQlpdC0+aXRfaW5kZXggPSAtMTsKLQlpZiAoc2VxICE9IE5VTEwpIHsKLQkJaXQtPml0X3NlcSA9IE5VTEw7Ci0JCVB5X0RFQ1JFRihzZXEpOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIFB5X3NzaXplX3QKLWxpc3RyZXZpdGVyX2xlbihsaXN0cmV2aXRlcm9iamVjdCAqaXQpCi17Ci0JUHlfc3NpemVfdCBsZW4gPSBpdC0+aXRfaW5kZXggKyAxOwotCWlmIChpdC0+aXRfc2VxID09IE5VTEwgfHwgUHlMaXN0X0dFVF9TSVpFKGl0LT5pdF9zZXEpIDwgbGVuKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gbGVuOwotfQorc3RhdGljIFB5T2JqZWN0ICpsaXN0X3JldmVyc2VkKFB5TGlzdE9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3N0YXRpYyB2b2lkIGxpc3RyZXZpdGVyX2RlYWxsb2MobGlzdHJldml0ZXJvYmplY3QgKik7CitzdGF0aWMgaW50IGxpc3RyZXZpdGVyX3RyYXZlcnNlKGxpc3RyZXZpdGVyb2JqZWN0ICosIHZpc2l0cHJvYywgdm9pZCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqbGlzdHJldml0ZXJfbmV4dChsaXN0cmV2aXRlcm9iamVjdCAqKTsKK3N0YXRpYyBQeV9zc2l6ZV90IGxpc3RyZXZpdGVyX2xlbihsaXN0cmV2aXRlcm9iamVjdCAqKTsKIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGxpc3RyZXZpdGVyX2FzX3NlcXVlbmNlID0gewogCShsZW5mdW5jKWxpc3RyZXZpdGVyX2xlbiwJLyogc3FfbGVuZ3RoICovCkBAIC0yOTIxLDMgKzI4NjIsNjUgQEAKIAkoaXRlcm5leHRmdW5jKWxpc3RyZXZpdGVyX25leHQsCQkvKiB0cF9pdGVybmV4dCAqLwogCTAsCiB9OworCitzdGF0aWMgUHlPYmplY3QgKgorbGlzdF9yZXZlcnNlZChQeUxpc3RPYmplY3QgKnNlcSwgUHlPYmplY3QgKnVudXNlZCkKK3sKKwlsaXN0cmV2aXRlcm9iamVjdCAqaXQ7CisKKwlpdCA9IFB5T2JqZWN0X0dDX05ldyhsaXN0cmV2aXRlcm9iamVjdCwgJlB5TGlzdFJldkl0ZXJfVHlwZSk7CisJaWYgKGl0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWFzc2VydChQeUxpc3RfQ2hlY2soc2VxKSk7CisJaXQtPml0X2luZGV4ID0gUHlMaXN0X0dFVF9TSVpFKHNlcSkgLSAxOworCVB5X0lOQ1JFRihzZXEpOworCWl0LT5pdF9zZXEgPSBzZXE7CisJUHlPYmplY3RfR0NfVHJhY2soaXQpOworCXJldHVybiAoUHlPYmplY3QgKilpdDsKK30KKworc3RhdGljIHZvaWQKK2xpc3RyZXZpdGVyX2RlYWxsb2MobGlzdHJldml0ZXJvYmplY3QgKml0KQoreworCVB5T2JqZWN0X0dDX1VuVHJhY2soaXQpOworCVB5X1hERUNSRUYoaXQtPml0X3NlcSk7CisJUHlPYmplY3RfR0NfRGVsKGl0KTsKK30KKworc3RhdGljIGludAorbGlzdHJldml0ZXJfdHJhdmVyc2UobGlzdHJldml0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKwlQeV9WSVNJVChpdC0+aXRfc2VxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2xpc3RyZXZpdGVyX25leHQobGlzdHJldml0ZXJvYmplY3QgKml0KQoreworCVB5T2JqZWN0ICppdGVtOworCVB5X3NzaXplX3QgaW5kZXggPSBpdC0+aXRfaW5kZXg7CisJUHlMaXN0T2JqZWN0ICpzZXEgPSBpdC0+aXRfc2VxOworCisJaWYgKGluZGV4Pj0wICYmIGluZGV4IDwgUHlMaXN0X0dFVF9TSVpFKHNlcSkpIHsKKwkJaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShzZXEsIGluZGV4KTsKKwkJaXQtPml0X2luZGV4LS07CisJCVB5X0lOQ1JFRihpdGVtKTsKKwkJcmV0dXJuIGl0ZW07CisJfQorCWl0LT5pdF9pbmRleCA9IC0xOworCWlmIChzZXEgIT0gTlVMTCkgeworCQlpdC0+aXRfc2VxID0gTlVMTDsKKwkJUHlfREVDUkVGKHNlcSk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgUHlfc3NpemVfdAorbGlzdHJldml0ZXJfbGVuKGxpc3RyZXZpdGVyb2JqZWN0ICppdCkKK3sKKwlQeV9zc2l6ZV90IGxlbiA9IGl0LT5pdF9pbmRleCArIDE7CisJaWYgKGl0LT5pdF9zZXEgPT0gTlVMTCB8fCBQeUxpc3RfR0VUX1NJWkUoaXQtPml0X3NlcSkgPCBsZW4pCisJCXJldHVybiAwOworCXJldHVybiBsZW47Cit9CisKZGlmZiAtLWdpdCBhL09iamVjdHMvbG9uZ29iamVjdC5jIGIvT2JqZWN0cy9sb25nb2JqZWN0LmMKaW5kZXggN2M1ZWJjNC4uMzA3MzkyMyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9sb25nb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9sb25nb2JqZWN0LmMKQEAgLTI4MSw3ICsyODEsNyBAQAogCWlmIChzaWduID4gMCkgCiAJCXJldHVybiBQWV9TU0laRV9UX01BWDsKIAllbHNlIAotCQlyZXR1cm4gLVBZX1NTSVpFX1RfTUFYLTE7CisJCXJldHVybiBQWV9TU0laRV9UX01JTjsKIH0KIAogLyogR2V0IGEgUHlfc3NpemVfdCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LgpAQCAtMzAxLDcgKzMwMSw3IEBACiAvKiBHZXQgYSBQeV9zc2l6ZV90IGZyb20gYSBsb25nIGludCBvYmplY3QuCiAgICBTaWxlbnRseSByZWR1Y2UgdmFsdWVzIGxhcmdlciB0aGFuIFBZX1NTSVpFX1RfTUFYIHRvIFBZX1NTSVpFX1RfTUFYLAogICAgYW5kIHNpbGVudGx5IGJvb3N0IHZhbHVlcyBsZXNzIHRoYW4gLVBZX1NTSVpFX1RfTUFYLTEgdG8gLVBZX1NTSVpFX1RfTUFYLTEuCi0gICBSZXR1cm4gMCBvbiBlcnJvciwgMSBvbiBzdWNjZXNzLgorICAgT24gZXJyb3IsIHJldHVybiAtMSB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQuCiAqLwogCiBzdGF0aWMgUHlfc3NpemVfdApAQCAtNDE5LDcgKzQxOSw3IEBACiAJCWRpZ2l0IG1zZCA9IHYtPm9iX2RpZ2l0W25kaWdpdHMgLSAxXTsKIAogCQlyZXN1bHQgPSAobmRpZ2l0cyAtIDEpICogU0hJRlQ7Ci0JCWlmIChyZXN1bHQgLyBTSElGVCAhPSBuZGlnaXRzIC0gMSkKKwkJaWYgKHJlc3VsdCAvIFNISUZUICE9IChzaXplX3QpKG5kaWdpdHMgLSAxKSkKIAkJCWdvdG8gT3ZlcmZsb3c7CiAJCWRvIHsKIAkJCSsrcmVzdWx0OwpAQCAtNzcxLDYgKzc3MSw4IEBACiBQeUxvbmdfRnJvbVZvaWRQdHIodm9pZCAqcCkKIHsKICNpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HCisJaWYgKChsb25nKXAgPCAwKQorCQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpcCk7CiAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXApOwogI2Vsc2UKIApAQCAtNzgzLDcgKzc4NSw3IEBACiAJLyogb3B0aW1pemUgbnVsbCBwb2ludGVycyAqLwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXApOworCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylwKTsKIAogI2VuZGlmIC8qIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcgKi8KIH0KQEAgLTgwMiw4ICs4MDQsMTAgQEAKIAogCWlmIChQeUludF9DaGVjayh2dikpCiAJCXggPSBQeUludF9BU19MT05HKHZ2KTsKLQllbHNlCisJZWxzZSBpZiAoUHlMb25nX0NoZWNrKHZ2KSAmJiBfUHlMb25nX1NpZ24odnYpIDwgMCkKIAkJeCA9IFB5TG9uZ19Bc0xvbmcodnYpOworCWVsc2UKKwkJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2dik7CiAjZWxzZQogCiAjaWZuZGVmIEhBVkVfTE9OR19MT05HCkBAIC04MTYsOCArODIwLDEwIEBACiAKIAlpZiAoUHlJbnRfQ2hlY2sodnYpKQogCQl4ID0gUHlJbnRfQVNfTE9ORyh2dik7Ci0JZWxzZQorCWVsc2UgaWYgKFB5TG9uZ19DaGVjayh2dikgJiYgX1B5TG9uZ19TaWduKHZ2KSA8IDApCiAJCXggPSBQeUxvbmdfQXNMb25nTG9uZyh2dik7CisJZWxzZQorCQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2dik7CiAKICNlbmRpZiAvKiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HICovCiAKQEAgLTk0Nyw3ICs5NTMsNyBAQAogCiAJaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKIAkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7CiAJfQogCiAJcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgKQEAgLTEzOTQsNiArMTQwMCw4IEBACiAJaW50IHNpZ24gPSAxOwogCWNoYXIgKnN0YXJ0LCAqb3JpZ19zdHIgPSBzdHI7CiAJUHlMb25nT2JqZWN0ICp6OworCVB5T2JqZWN0ICpzdHJvYmosICpzdHJyZXByOworCVB5X3NzaXplX3Qgc2xlbjsKIAogCWlmICgoYmFzZSAhPSAwICYmIGJhc2UgPCAyKSB8fCBiYXNlID4gMzYpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCkBAIC0xNDU5LDkgKzE0NjcsMTkgQEAKIAlyZXR1cm4gKFB5T2JqZWN0ICopIHo7CiAKICBvbkVycm9yOgotCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGxvbmcoKTogJS4yMDBzIiwgb3JpZ19zdHIpOwogCVB5X1hERUNSRUYoeik7CisJc2xlbiA9IHN0cmxlbihvcmlnX3N0cikgPCAyMDAgPyBzdHJsZW4ob3JpZ19zdHIpIDogMjAwOworCXN0cm9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG9yaWdfc3RyLCBzbGVuKTsKKwlpZiAoc3Ryb2JqID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXN0cnJlcHIgPSBQeU9iamVjdF9SZXByKHN0cm9iaik7CisJUHlfREVDUkVGKHN0cm9iaik7CisJaWYgKHN0cnJlcHIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisJCSAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgbG9uZygpIHdpdGggYmFzZSAlZDogJXMiLAorCQkgICAgIGJhc2UsIFB5U3RyaW5nX0FTX1NUUklORyhzdHJyZXByKSk7CisJUHlfREVDUkVGKHN0cnJlcHIpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0xNDcwLDcgKzE0ODgsNyBAQAogUHlMb25nX0Zyb21Vbmljb2RlKFB5X1VOSUNPREUgKnUsIFB5X3NzaXplX3QgbGVuZ3RoLCBpbnQgYmFzZSkKIHsKIAlQeU9iamVjdCAqcmVzdWx0OwotCWNoYXIgKmJ1ZmZlciA9IFB5TWVtX01BTExPQyhsZW5ndGgrMSk7CisJY2hhciAqYnVmZmVyID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobGVuZ3RoKzEpOwogCiAJaWYgKGJ1ZmZlciA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKQEAgLTMwNjYsNyArMzA4NCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeUxvbmdPYmplY3QgKnRtcCwgKm5ldzsKKwlQeUxvbmdPYmplY3QgKnRtcCwgKm5ld29iajsKIAlQeV9zc2l6ZV90IGksIG47CiAKIAlhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlMb25nX1R5cGUpKTsKQEAgLTMwNzcsMTcgKzMwOTUsMTcgQEAKIAluID0gdG1wLT5vYl9zaXplOwogCWlmIChuIDwgMCkKIAkJbiA9IC1uOwotCW5ldyA9IChQeUxvbmdPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCBuKTsKLQlpZiAobmV3ID09IE5VTEwpIHsKKwluZXdvYmogPSAoUHlMb25nT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgbik7CisJaWYgKG5ld29iaiA9PSBOVUxMKSB7CiAJCVB5X0RFQ1JFRih0bXApOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JYXNzZXJ0KFB5TG9uZ19DaGVjayhuZXcpKTsKLQluZXctPm9iX3NpemUgPSB0bXAtPm9iX3NpemU7CisJYXNzZXJ0KFB5TG9uZ19DaGVjayhuZXdvYmopKTsKKwluZXdvYmotPm9iX3NpemUgPSB0bXAtPm9iX3NpemU7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJbmV3LT5vYl9kaWdpdFtpXSA9IHRtcC0+b2JfZGlnaXRbaV07CisJCW5ld29iai0+b2JfZGlnaXRbaV0gPSB0bXAtPm9iX2RpZ2l0W2ldOwogCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiAoUHlPYmplY3QgKiluZXc7CisJcmV0dXJuIChQeU9iamVjdCAqKW5ld29iajsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTMxMTQsMjUgKzMxMzIsMjUgQEAKIAkoYmluYXJ5ZnVuYykJbG9uZ19hZGQsCS8qbmJfYWRkKi8KIAkoYmluYXJ5ZnVuYykJbG9uZ19zdWIsCS8qbmJfc3VidHJhY3QqLwogCShiaW5hcnlmdW5jKQlsb25nX211bCwJLypuYl9tdWx0aXBseSovCi0JKGJpbmFyeWZ1bmMpCWxvbmdfbW9kLAkvKm5iX3JlbWFpbmRlciovCi0JKGJpbmFyeWZ1bmMpCWxvbmdfZGl2bW9kLAkvKm5iX2Rpdm1vZCovCi0JKHRlcm5hcnlmdW5jKQlsb25nX3BvdywJLypuYl9wb3dlciovCisJCQlsb25nX21vZCwJLypuYl9yZW1haW5kZXIqLworCQkJbG9uZ19kaXZtb2QsCS8qbmJfZGl2bW9kKi8KKwkJCWxvbmdfcG93LAkvKm5iX3Bvd2VyKi8KIAkodW5hcnlmdW5jKSAJbG9uZ19uZWcsCS8qbmJfbmVnYXRpdmUqLwogCSh1bmFyeWZ1bmMpIAlsb25nX3BvcywJLyp0cF9wb3NpdGl2ZSovCiAJKHVuYXJ5ZnVuYykgCWxvbmdfYWJzLAkvKnRwX2Fic29sdXRlKi8KIAkoaW5xdWlyeSkJbG9uZ19ub256ZXJvLAkvKnRwX25vbnplcm8qLwogCSh1bmFyeWZ1bmMpCWxvbmdfaW52ZXJ0LAkvKm5iX2ludmVydCovCi0JKGJpbmFyeWZ1bmMpCWxvbmdfbHNoaWZ0LAkvKm5iX2xzaGlmdCovCisJCQlsb25nX2xzaGlmdCwJLypuYl9sc2hpZnQqLwogCShiaW5hcnlmdW5jKQlsb25nX3JzaGlmdCwJLypuYl9yc2hpZnQqLwotCShiaW5hcnlmdW5jKQlsb25nX2FuZCwJLypuYl9hbmQqLwotCShiaW5hcnlmdW5jKQlsb25nX3hvciwJLypuYl94b3IqLwotCShiaW5hcnlmdW5jKQlsb25nX29yLAkvKm5iX29yKi8KLQkoY29lcmNpb24pCWxvbmdfY29lcmNlLAkvKm5iX2NvZXJjZSovCi0JKHVuYXJ5ZnVuYykJbG9uZ19pbnQsCS8qbmJfaW50Ki8KLQkodW5hcnlmdW5jKQlsb25nX2xvbmcsCS8qbmJfbG9uZyovCi0JKHVuYXJ5ZnVuYykJbG9uZ19mbG9hdCwJLypuYl9mbG9hdCovCi0JKHVuYXJ5ZnVuYykJbG9uZ19vY3QsCS8qbmJfb2N0Ki8KLQkodW5hcnlmdW5jKQlsb25nX2hleCwJLypuYl9oZXgqLworCQkJbG9uZ19hbmQsCS8qbmJfYW5kKi8KKwkJCWxvbmdfeG9yLAkvKm5iX3hvciovCisJCQlsb25nX29yLAkvKm5iX29yKi8KKwkJCWxvbmdfY29lcmNlLAkvKm5iX2NvZXJjZSovCisJCQlsb25nX2ludCwJLypuYl9pbnQqLworCQkJbG9uZ19sb25nLAkvKm5iX2xvbmcqLworCQkJbG9uZ19mbG9hdCwJLypuYl9mbG9hdCovCisJCQlsb25nX29jdCwJLypuYl9vY3QqLworCQkJbG9uZ19oZXgsCS8qbmJfaGV4Ki8KIAkwLAkJCQkvKiBuYl9pbnBsYWNlX2FkZCAqLwogCTAsCQkJCS8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KIAkwLAkJCQkvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCkBAIC0zMTQzLDExICszMTYxLDExIEBACiAJMCwJCQkJLyogbmJfaW5wbGFjZV9hbmQgKi8KIAkwLAkJCQkvKiBuYl9pbnBsYWNlX3hvciAqLwogCTAsCQkJCS8qIG5iX2lucGxhY2Vfb3IgKi8KLQkoYmluYXJ5ZnVuYylsb25nX2RpdiwJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLworCWxvbmdfZGl2LAkJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwogCWxvbmdfdHJ1ZV9kaXZpZGUsCQkvKiBuYl90cnVlX2RpdmlkZSAqLwogCTAsCQkJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCiAJMCwJCQkJLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLwotCShsZW5mdW5jKWxvbmdfaW5kZXgsICAgICAgICAgICAgLyogbmJfaW5kZXggKi8KKwlsb25nX2luZGV4LAkJCS8qIG5iX2luZGV4ICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlMb25nX1R5cGUgPSB7CkBAIC0zMTU2LDE4ICszMTc0LDE4IEBACiAJImxvbmciLAkJCQkJLyogdHBfbmFtZSAqLwogCXNpemVvZihQeUxvbmdPYmplY3QpIC0gc2l6ZW9mKGRpZ2l0KSwJLyogdHBfYmFzaWNzaXplICovCiAJc2l6ZW9mKGRpZ2l0KSwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkoZGVzdHJ1Y3Rvcilsb25nX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCisJbG9uZ19kZWFsbG9jLAkJCQkvKiB0cF9kZWFsbG9jICovCiAJMCwJCQkJCS8qIHRwX3ByaW50ICovCiAJMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KIAkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwogCShjbXBmdW5jKWxvbmdfY29tcGFyZSwJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWxvbmdfcmVwciwJCQkvKiB0cF9yZXByICovCisJbG9uZ19yZXByLAkJCQkvKiB0cF9yZXByICovCiAJJmxvbmdfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwogCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwogCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCiAJKGhhc2hmdW5jKWxvbmdfaGFzaCwJCQkvKiB0cF9oYXNoICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAJCQkvKiB0cF9jYWxsICovCi0gICAgICAgIChyZXByZnVuYylsb25nX3N0ciwJCQkvKiB0cF9zdHIgKi8KKyAgICAgICAgbG9uZ19zdHIsCQkJCS8qIHRwX3N0ciAqLwogCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KIAkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCmRpZmYgLS1naXQgYS9PYmplY3RzL21ldGhvZG9iamVjdC5jIGIvT2JqZWN0cy9tZXRob2RvYmplY3QuYwppbmRleCA4ZTNiZjg2Li5lY2M5YTBhIDEwMDY0NAotLS0gYS9PYmplY3RzL21ldGhvZG9iamVjdC5jCisrKyBiL09iamVjdHMvbWV0aG9kb2JqZWN0LmMKQEAgLTE0OSwxNyArMTQ5LDggQEAKIHN0YXRpYyBpbnQKIG1ldGhfdHJhdmVyc2UoUHlDRnVuY3Rpb25PYmplY3QgKm0sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWludCBlcnI7Ci0JaWYgKG0tPm1fc2VsZiAhPSBOVUxMKSB7Ci0JCWVyciA9IHZpc2l0KG0tPm1fc2VsZiwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChtLT5tX21vZHVsZSAhPSBOVUxMKSB7Ci0JCWVyciA9IHZpc2l0KG0tPm1fbW9kdWxlLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9CisJUHlfVklTSVQobS0+bV9zZWxmKTsKKwlQeV9WSVNJVChtLT5tX21vZHVsZSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvbW9kdWxlb2JqZWN0LmMgYi9PYmplY3RzL21vZHVsZW9iamVjdC5jCmluZGV4IDgxMjQ5NjguLmU0NTRmY2YgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbW9kdWxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9tb2R1bGVvYmplY3QuYwpAQCAtMjA0LDggKzIwNCw3IEBACiBzdGF0aWMgaW50CiBtb2R1bGVfdHJhdmVyc2UoUHlNb2R1bGVPYmplY3QgKm0sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmIChtLT5tZF9kaWN0ICE9IE5VTEwpCi0JCXJldHVybiB2aXNpdChtLT5tZF9kaWN0LCBhcmcpOworCVB5X1ZJU0lUKG0tPm1kX2RpY3QpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL29iamVjdC5jIGIvT2JqZWN0cy9vYmplY3QuYwppbmRleCA5YjZhMzBhLi5hNzVjMTRlIDEwMDY0NAotLS0gYS9PYmplY3RzL29iamVjdC5jCisrKyBiL09iamVjdHMvb2JqZWN0LmMKQEAgLTMsOSArMywzMCBAQAogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwogI2lmZGVmIFB5X1JFRl9ERUJVRwogUHlfc3NpemVfdCBfUHlfUmVmVG90YWw7Ci0jZW5kaWYKKworUHlfc3NpemVfdAorX1B5X0dldFJlZlRvdGFsKHZvaWQpCit7CisJUHlPYmplY3QgKm87CisJUHlfc3NpemVfdCB0b3RhbCA9IF9QeV9SZWZUb3RhbDsKKyAgICAgICAgLyogaWdub3JlIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBkdW1teSBvYmplY3Qgb2YgdGhlIGRpY3RzIGFuZCBzZXRzCisgICAgICAgICAgIGJlY2F1c2UgdGhleSBhcmUgbm90IHJlbGlhYmxlIGFuZCBub3QgdXNlZnVsIChub3cgdGhhdCB0aGUKKyAgICAgICAgICAgaGFzaCB0YWJsZSBjb2RlIGlzIHdlbGwtdGVzdGVkKSAqLworCW8gPSBfUHlEaWN0X0R1bW15KCk7CisJaWYgKG8gIT0gTlVMTCkKKwkJdG90YWwgLT0gby0+b2JfcmVmY250OworCW8gPSBfUHlTZXRfRHVtbXkoKTsKKwlpZiAobyAhPSBOVUxMKQorCQl0b3RhbCAtPSBvLT5vYl9yZWZjbnQ7CisJcmV0dXJuIHRvdGFsOworfQorI2VuZGlmIC8qIFB5X1JFRl9ERUJVRyAqLwogCiBpbnQgUHlfRGl2aXNpb25XYXJuaW5nRmxhZzsKIApAQCAtNTMsMjMgKzc0LDMwIEBACiAKICNpZmRlZiBDT1VOVF9BTExPQ1MKIHN0YXRpYyBQeVR5cGVPYmplY3QgKnR5cGVfbGlzdDsKKy8qIEFsbCB0eXBlcyBhcmUgYWRkZWQgdG8gdHlwZV9saXN0LCBhdCBsZWFzdCB3aGVuCisgICB0aGV5IGdldCBvbmUgb2JqZWN0IGNyZWF0ZWQuIFRoYXQgbWFrZXMgdGhlbQorICAgaW1tb3J0YWwsIHdoaWNoIHVuZm9ydHVuYXRlbHkgY29udHJpYnV0ZXMgdG8KKyAgIGdhcmJhZ2UgaXRzZWxmLiBJZiB1bmxpc3RfdHlwZXNfd2l0aG91dF9vYmplY3RzCisgICBpcyBzZXQsIHRoZXkgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHR5cGVfbGlzdAorICAgb25jZSB0aGUgbGFzdCBvYmplY3QgaXMgZGVhbGxvY2F0ZWQuICovCitpbnQgdW5saXN0X3R5cGVzX3dpdGhvdXRfb2JqZWN0czsKIGV4dGVybiBpbnQgdHVwbGVfemVyb19hbGxvY3MsIGZhc3RfdHVwbGVfYWxsb2NzOwogZXh0ZXJuIGludCBxdWlja19pbnRfYWxsb2NzLCBxdWlja19uZWdfaW50X2FsbG9jczsKIGV4dGVybiBpbnQgbnVsbF9zdHJpbmdzLCBvbmVfc3RyaW5nczsKIHZvaWQKLWR1bXBfY291bnRzKHZvaWQpCitkdW1wX2NvdW50cyhGSUxFKiBmKQogewogCVB5VHlwZU9iamVjdCAqdHA7CiAKIAlmb3IgKHRwID0gdHlwZV9saXN0OyB0cDsgdHAgPSB0cC0+dHBfbmV4dCkKLQkJZnByaW50ZihzdGRlcnIsICIlcyBhbGxvYydkOiAlZCwgZnJlZWQ6ICVkLCBtYXggaW4gdXNlOiAlZFxuIiwKKwkJZnByaW50ZihmLCAiJXMgYWxsb2MnZDogJWQsIGZyZWVkOiAlZCwgbWF4IGluIHVzZTogJWRcbiIsCiAJCQl0cC0+dHBfbmFtZSwgdHAtPnRwX2FsbG9jcywgdHAtPnRwX2ZyZWVzLAogCQkJdHAtPnRwX21heGFsbG9jKTsKLQlmcHJpbnRmKHN0ZGVyciwgImZhc3QgdHVwbGUgYWxsb2NzOiAlZCwgZW1wdHk6ICVkXG4iLAorCWZwcmludGYoZiwgImZhc3QgdHVwbGUgYWxsb2NzOiAlZCwgZW1wdHk6ICVkXG4iLAogCQlmYXN0X3R1cGxlX2FsbG9jcywgdHVwbGVfemVyb19hbGxvY3MpOwotCWZwcmludGYoc3RkZXJyLCAiZmFzdCBpbnQgYWxsb2NzOiBwb3M6ICVkLCBuZWc6ICVkXG4iLAorCWZwcmludGYoZiwgImZhc3QgaW50IGFsbG9jczogcG9zOiAlZCwgbmVnOiAlZFxuIiwKIAkJcXVpY2tfaW50X2FsbG9jcywgcXVpY2tfbmVnX2ludF9hbGxvY3MpOwotCWZwcmludGYoc3RkZXJyLCAibnVsbCBzdHJpbmdzOiAlZCwgMS1zdHJpbmdzOiAlZFxuIiwKKwlmcHJpbnRmKGYsICJudWxsIHN0cmluZ3M6ICVkLCAxLXN0cmluZ3M6ICVkXG4iLAogCQludWxsX3N0cmluZ3MsIG9uZV9zdHJpbmdzKTsKIH0KIApAQCAtMTAzLDEwICsxMzEsMTIgQEAKIHZvaWQKIGluY19jb3VudChQeVR5cGVPYmplY3QgKnRwKQogewotCWlmICh0cC0+dHBfYWxsb2NzID09IDApIHsKKwlpZiAodHAtPnRwX25leHQgPT0gTlVMTCAmJiB0cC0+dHBfcHJldiA9PSBOVUxMKSB7CiAJCS8qIGZpcnN0IHRpbWU7IGluc2VydCBpbiBsaW5rZWQgbGlzdCAqLwogCQlpZiAodHAtPnRwX25leHQgIT0gTlVMTCkgLyogc2FuaXR5IGNoZWNrICovCiAJCQlQeV9GYXRhbEVycm9yKCJYWFggaW5jX2NvdW50IHNhbml0eSBjaGVjayIpOworCQlpZiAodHlwZV9saXN0KQorCQkJdHlwZV9saXN0LT50cF9wcmV2ID0gdHA7CiAJCXRwLT50cF9uZXh0ID0gdHlwZV9saXN0OwogCQkvKiBOb3RlIHRoYXQgYXMgb2YgUHl0aG9uIDIuMiwgaGVhcC1hbGxvY2F0ZWQgdHlwZSBvYmplY3RzCiAJCSAqIGNhbiBnbyBhd2F5LCBidXQgdGhpcyBjb2RlIHJlcXVpcmVzIHRoYXQgdGhleSBzdGF5IGFsaXZlCkBAIC0xMjksNiArMTU5LDI0IEBACiAJaWYgKHRwLT50cF9hbGxvY3MgLSB0cC0+dHBfZnJlZXMgPiB0cC0+dHBfbWF4YWxsb2MpCiAJCXRwLT50cF9tYXhhbGxvYyA9IHRwLT50cF9hbGxvY3MgLSB0cC0+dHBfZnJlZXM7CiB9CisKK3ZvaWQgZGVjX2NvdW50KFB5VHlwZU9iamVjdCAqdHApCit7CisJdHAtPnRwX2ZyZWVzKys7CisJaWYgKHVubGlzdF90eXBlc193aXRob3V0X29iamVjdHMgJiYKKwkgICAgdHAtPnRwX2FsbG9jcyA9PSB0cC0+dHBfZnJlZXMpIHsKKwkJLyogdW5saW5rIHRoZSB0eXBlIGZyb20gdHlwZV9saXN0ICovCisJCWlmICh0cC0+dHBfcHJldikKKwkJCXRwLT50cF9wcmV2LT50cF9uZXh0ID0gdHAtPnRwX25leHQ7CisJCWVsc2UKKwkJCXR5cGVfbGlzdCA9IHRwLT50cF9uZXh0OworCQlpZiAodHAtPnRwX25leHQpCisJCQl0cC0+dHBfbmV4dC0+dHBfcHJldiA9IHRwLT50cF9wcmV2OworCQl0cC0+dHBfbmV4dCA9IHRwLT50cF9wcmV2ID0gTlVMTDsKKwkJUHlfREVDUkVGKHRwKTsKKwl9Cit9CisKICNlbmRpZgogCiAjaWZkZWYgUHlfUkVGX0RFQlVHCkBAIC0xMzgsMTEgKzE4NiwxMCBAQAogewogCWNoYXIgYnVmWzMwMF07CiAKLQkvKiBYWFgodHdvdXRlcnMpIGNhc3QgcmVmY291bnQgdG8gbG9uZyB1bnRpbCAlemQgaXMgdW5pdmVyc2FsbHkKLQkgICBhdmFpbGFibGUgKi8KIAlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSAgICAgICIlczolaSBvYmplY3QgYXQgJXAgaGFzIG5lZ2F0aXZlIHJlZiBjb3VudCAlbGQiLAotCQkgICAgICBmbmFtZSwgbGluZW5vLCBvcCwgKGxvbmcpb3AtPm9iX3JlZmNudCk7CisJCSAgICAgICIlczolaSBvYmplY3QgYXQgJXAgaGFzIG5lZ2F0aXZlIHJlZiBjb3VudCAiCisJCSAgICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKKwkJICAgICAgZm5hbWUsIGxpbmVubywgb3AsIG9wLT5vYl9yZWZjbnQpOwogCVB5X0ZhdGFsRXJyb3IoYnVmKTsKIH0KIApAQCAtMzE3LDcgKzM2NCw3IEBACiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogCQlpZiAoUHlVbmljb2RlX0NoZWNrKHJlcykpIHsKIAkJCVB5T2JqZWN0KiBzdHI7Ci0JCQlzdHIgPSBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nKHJlcyk7CisJCQlzdHIgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHJlcywgTlVMTCwgTlVMTCk7CiAJCQlQeV9ERUNSRUYocmVzKTsKIAkJCWlmIChzdHIpCiAJCQkJcmVzID0gc3RyOwpAQCAtMTc3NSwxMiArMTgyMiwxMiBAQAogCSJOb25lVHlwZSIsCiAJMCwKIAkwLAotCShkZXN0cnVjdG9yKW5vbmVfZGVhbGxvYywJICAgICAvKnRwX2RlYWxsb2MqLyAvKm5ldmVyIGNhbGxlZCovCisJbm9uZV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLyAvKm5ldmVyIGNhbGxlZCovCiAJMCwJCS8qdHBfcHJpbnQqLwogCTAsCQkvKnRwX2dldGF0dHIqLwogCTAsCQkvKnRwX3NldGF0dHIqLwogCTAsCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYylub25lX3JlcHIsIC8qdHBfcmVwciovCisJbm9uZV9yZXByLAkvKnRwX3JlcHIqLwogCTAsCQkvKnRwX2FzX251bWJlciovCiAJMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwogCTAsCQkvKnRwX2FzX21hcHBpbmcqLwpAQCAtMTgwNiwxMiArMTg1MywxMiBAQAogCSJOb3RJbXBsZW1lbnRlZFR5cGUiLAogCTAsCiAJMCwKLQkoZGVzdHJ1Y3Rvcilub25lX2RlYWxsb2MsCSAgICAgLyp0cF9kZWFsbG9jKi8gLypuZXZlciBjYWxsZWQqLworCW5vbmVfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8gLypuZXZlciBjYWxsZWQqLwogCTAsCQkvKnRwX3ByaW50Ki8KIAkwLAkJLyp0cF9nZXRhdHRyKi8KIAkwLAkJLyp0cF9zZXRhdHRyKi8KIAkwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpTm90SW1wbGVtZW50ZWRfcmVwciwgLyp0cF9yZXByKi8KKwlOb3RJbXBsZW1lbnRlZF9yZXByLCAvKnRwX3JlcHIqLwogCTAsCQkvKnRwX2FzX251bWJlciovCiAJMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwogCTAsCQkvKnRwX2FzX21hcHBpbmcqLwpAQCAtMTkwMSw5ICsxOTQ4LDcgQEAKIAlQeU9iamVjdCAqb3A7CiAJZnByaW50ZihmcCwgIlJlbWFpbmluZyBvYmplY3RzOlxuIik7CiAJZm9yIChvcCA9IHJlZmNoYWluLl9vYl9uZXh0OyBvcCAhPSAmcmVmY2hhaW47IG9wID0gb3AtPl9vYl9uZXh0KSB7Ci0JCS8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0byBsb25nIHVudGlsICV6ZCBpcwotCQkgICB1bml2ZXJzYWxseSBhdmFpbGFibGUgKi8KLQkJZnByaW50ZihmcCwgIiVwIFslbGRdICIsIG9wLCAobG9uZylvcC0+b2JfcmVmY250KTsKKwkJZnByaW50ZihmcCwgIiVwIFslIiBQWV9GT1JNQVRfU0laRV9UICJkXSAiLCBvcCwgb3AtPm9iX3JlZmNudCk7CiAJCWlmIChQeU9iamVjdF9QcmludChvcCwgZnAsIDApICE9IDApCiAJCQlQeUVycl9DbGVhcigpOwogCQlwdXRjKCdcbicsIGZwKTsKQEAgLTE5MTksMTAgKzE5NjQsOCBAQAogCVB5T2JqZWN0ICpvcDsKIAlmcHJpbnRmKGZwLCAiUmVtYWluaW5nIG9iamVjdCBhZGRyZXNzZXM6XG4iKTsKIAlmb3IgKG9wID0gcmVmY2hhaW4uX29iX25leHQ7IG9wICE9ICZyZWZjaGFpbjsgb3AgPSBvcC0+X29iX25leHQpCi0JCS8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0byBsb25nIHVudGlsICV6ZCBpcwotCQkgICB1bml2ZXJzYWxseSBhdmFpbGFibGUgKi8KLQkJZnByaW50ZihmcCwgIiVwIFslbGRdICVzXG4iLCBvcCwgKGxvbmcpb3AtPm9iX3JlZmNudCwKLQkJCQkJICAgIG9wLT5vYl90eXBlLT50cF9uYW1lKTsKKwkJZnByaW50ZihmcCwgIiVwIFslIiBQWV9GT1JNQVRfU0laRV9UICJkXSAlc1xuIiwgb3AsCisJCQlvcC0+b2JfcmVmY250LCBvcC0+b2JfdHlwZS0+dHBfbmFtZSk7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTIxMDAsMyArMjE0Myw4IEBACiAJCS0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7CiAJfQogfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9PYmplY3RzL29ibWFsbG9jLmMgYi9PYmplY3RzL29ibWFsbG9jLmMKaW5kZXggODcwZjkzYy4uYTM5M2NiYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9vYm1hbGxvYy5jCisrKyBiL09iamVjdHMvb2JtYWxsb2MuYwpAQCAtNTI5LDcgKzUyOSw3IEBACiAJCW5ieXRlcyA9IG51bWFyZW5hcyAqIHNpemVvZigqYXJlbmFzKTsKIAkJaWYgKG5ieXRlcyAvIHNpemVvZigqYXJlbmFzKSAhPSBudW1hcmVuYXMpCiAJCQlyZXR1cm4gTlVMTDsJLyogb3ZlcmZsb3cgKi8KLQkJYXJlbmFvYmogPSByZWFsbG9jKGFyZW5hcywgbmJ5dGVzKTsKKwkJYXJlbmFvYmogPSAoc3RydWN0IGFyZW5hX29iamVjdCAqKXJlYWxsb2MoYXJlbmFzLCBuYnl0ZXMpOwogCQlpZiAoYXJlbmFvYmogPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOwogCQlhcmVuYXMgPSBhcmVuYW9iajsKZGlmZiAtLWdpdCBhL09iamVjdHMvcmFuZ2VvYmplY3QuYyBiL09iamVjdHMvcmFuZ2VvYmplY3QuYwppbmRleCBhOWMwYjU1Li5jNDhiZWUwIDEwMDY0NAotLS0gYS9PYmplY3RzL3Jhbmdlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9yYW5nZW9iamVjdC5jCkBAIC0xMDQsMTMgKzEwNCw2IEBACiBzdGF0aWMgUHlfc3NpemVfdAogcmFuZ2VfbGVuZ3RoKHJhbmdlb2JqZWN0ICpyKQogewotI2lmIExPTkdfTUFYICE9IElOVF9NQVggLyogWFhYIHNzaXplX3RfbWF4ICovCi0JaWYgKHItPmxlbiA+IElOVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInhyYW5nZSBvYmplY3Qgc2l6ZSBjYW5ub3QgYmUgcmVwb3J0ZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLSNlbmRpZgogCXJldHVybiAoUHlfc3NpemVfdCkoci0+bGVuKTsKIH0KIApAQCAtMTU3LDQ0ICsxNTAsNDQgQEAKIAogUHlUeXBlT2JqZWN0IFB5UmFuZ2VfVHlwZSA9IHsKIAlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJCS8qIE51bWJlciBvZiBpdGVtcyBmb3IgdmFyb2JqZWN0ICovCi0JInhyYW5nZSIsCQkJLyogTmFtZSBvZiB0aGlzIHR5cGUgKi8KLQlzaXplb2YocmFuZ2VvYmplY3QpLAkJLyogQmFzaWMgb2JqZWN0IHNpemUgKi8KLQkwLAkJCQkvKiBJdGVtIHNpemUgZm9yIHZhcm9iamVjdCAqLwotCShkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXJhbmdlX3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJnJhbmdlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCi0JcmFuZ2VfZG9jLAkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JKGdldGl0ZXJmdW5jKXJhbmdlX2l0ZXIsCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXJhbmdlX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlyYW5nZV9uZXcsCQkJLyogdHBfbmV3ICovCisJMCwJCQkvKiBOdW1iZXIgb2YgaXRlbXMgZm9yIHZhcm9iamVjdCAqLworCSJ4cmFuZ2UiLAkJLyogTmFtZSBvZiB0aGlzIHR5cGUgKi8KKwlzaXplb2YocmFuZ2VvYmplY3QpLAkvKiBCYXNpYyBvYmplY3Qgc2l6ZSAqLworCTAsCQkJLyogSXRlbSBzaXplIGZvciB2YXJvYmplY3QgKi8KKwkoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsIC8qIHRwX2RlYWxsb2MgKi8KKwkwLAkJCS8qIHRwX3ByaW50ICovCisJMCwJCQkvKiB0cF9nZXRhdHRyICovCisJMCwJCQkvKiB0cF9zZXRhdHRyICovCisJMCwJCQkvKiB0cF9jb21wYXJlICovCisJKHJlcHJmdW5jKXJhbmdlX3JlcHIsCS8qIHRwX3JlcHIgKi8KKwkwLAkJCS8qIHRwX2FzX251bWJlciAqLworCSZyYW5nZV9hc19zZXF1ZW5jZSwJLyogdHBfYXNfc2VxdWVuY2UgKi8KKwkwLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KKwkwLAkJCS8qIHRwX2hhc2ggKi8KKwkwLAkJCS8qIHRwX2NhbGwgKi8KKwkwLAkJCS8qIHRwX3N0ciAqLworCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgLyogdHBfZ2V0YXR0cm8gKi8KKwkwLAkJCS8qIHRwX3NldGF0dHJvICovCisJMCwJCQkvKiB0cF9hc19idWZmZXIgKi8KKwlQeV9UUEZMQUdTX0RFRkFVTFQsCS8qIHRwX2ZsYWdzICovCisJcmFuZ2VfZG9jLAkJLyogdHBfZG9jICovCisJMCwJCQkvKiB0cF90cmF2ZXJzZSAqLworCTAsCQkJLyogdHBfY2xlYXIgKi8KKwkwLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCisJMCwJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworCXJhbmdlX2l0ZXIsCQkvKiB0cF9pdGVyICovCisJMCwJCQkvKiB0cF9pdGVybmV4dCAqLworCXJhbmdlX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCisJMCwJCQkvKiB0cF9tZW1iZXJzICovCisJMCwJCQkvKiB0cF9nZXRzZXQgKi8KKwkwLAkJCS8qIHRwX2Jhc2UgKi8KKwkwLAkJCS8qIHRwX2RpY3QgKi8KKwkwLAkJCS8qIHRwX2Rlc2NyX2dldCAqLworCTAsCQkJLyogdHBfZGVzY3Jfc2V0ICovCisJMCwJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCisJMCwJCQkvKiB0cF9pbml0ICovCisJMCwJCQkvKiB0cF9hbGxvYyAqLworCXJhbmdlX25ldywJCS8qIHRwX25ldyAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqIFhyYW5nZSBJdGVyYXRvciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIwNyw1MyArMjAwLDYgQEAKIAlsb25nCWxlbjsKIH0gcmFuZ2VpdGVyb2JqZWN0OwogCi1zdGF0aWMgUHlUeXBlT2JqZWN0IFB5cmFuZ2VpdGVyX1R5cGU7Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1yYW5nZV9pdGVyKFB5T2JqZWN0ICpzZXEpCi17Ci0JcmFuZ2VpdGVyb2JqZWN0ICppdDsKLQotCWlmICghUHlSYW5nZV9DaGVjayhzZXEpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9OZXcocmFuZ2VpdGVyb2JqZWN0LCAmUHlyYW5nZWl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0LT5pbmRleCA9IDA7Ci0JaXQtPnN0YXJ0ID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0YXJ0OwotCWl0LT5zdGVwID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0ZXA7Ci0JaXQtPmxlbiA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5sZW47Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmFuZ2VfcmV2ZXJzZShQeU9iamVjdCAqc2VxKQotewotCXJhbmdlaXRlcm9iamVjdCAqaXQ7Ci0JbG9uZyBzdGFydCwgc3RlcCwgbGVuOwotCi0JaWYgKCFQeVJhbmdlX0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05ldyhyYW5nZWl0ZXJvYmplY3QsICZQeXJhbmdlaXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzdGFydCA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5zdGFydDsKLQlzdGVwID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0ZXA7Ci0JbGVuID0gKChyYW5nZW9iamVjdCAqKXNlcSktPmxlbjsKLQotCWl0LT5pbmRleCA9IDA7Ci0JaXQtPnN0YXJ0ID0gc3RhcnQgKyAobGVuLTEpICogc3RlcDsKLQlpdC0+c3RlcCA9IC1zdGVwOwotCWl0LT5sZW4gPSBsZW47Ci0KLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7Ci19Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZWl0ZXJfbmV4dChyYW5nZWl0ZXJvYmplY3QgKnIpCiB7CkBAIC0zMDgsMyArMjU0LDQ4IEBACiAJcmFuZ2VpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwogCTAsCiB9OworCitzdGF0aWMgUHlPYmplY3QgKgorcmFuZ2VfaXRlcihQeU9iamVjdCAqc2VxKQoreworCXJhbmdlaXRlcm9iamVjdCAqaXQ7CisKKwlpZiAoIVB5UmFuZ2VfQ2hlY2soc2VxKSkgeworCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWl0ID0gUHlPYmplY3RfTmV3KHJhbmdlaXRlcm9iamVjdCwgJlB5cmFuZ2VpdGVyX1R5cGUpOworCWlmIChpdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpdC0+aW5kZXggPSAwOworCWl0LT5zdGFydCA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5zdGFydDsKKwlpdC0+c3RlcCA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5zdGVwOworCWl0LT5sZW4gPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+bGVuOworCXJldHVybiAoUHlPYmplY3QgKilpdDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK3JhbmdlX3JldmVyc2UoUHlPYmplY3QgKnNlcSkKK3sKKwlyYW5nZWl0ZXJvYmplY3QgKml0OworCWxvbmcgc3RhcnQsIHN0ZXAsIGxlbjsKKworCWlmICghUHlSYW5nZV9DaGVjayhzZXEpKSB7CisJCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaXQgPSBQeU9iamVjdF9OZXcocmFuZ2VpdGVyb2JqZWN0LCAmUHlyYW5nZWl0ZXJfVHlwZSk7CisJaWYgKGl0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3RhcnQgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RhcnQ7CisJc3RlcCA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5zdGVwOworCWxlbiA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5sZW47CisKKwlpdC0+aW5kZXggPSAwOworCWl0LT5zdGFydCA9IHN0YXJ0ICsgKGxlbi0xKSAqIHN0ZXA7CisJaXQtPnN0ZXAgPSAtc3RlcDsKKwlpdC0+bGVuID0gbGVuOworCisJcmV0dXJuIChQeU9iamVjdCAqKWl0OworfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zZXRvYmplY3QuYyBiL09iamVjdHMvc2V0b2JqZWN0LmMKaW5kZXggODlkNTc0Zi4uMjZhMjMyYiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zZXRvYmplY3QuYworKysgYi9PYmplY3RzL3NldG9iamVjdC5jCkBAIC0zLDcgKzMsNyBAQAogICAgV3JpdHRlbiBhbmQgbWFpbnRhaW5lZCBieSBSYXltb25kIEQuIEhldHRpbmdlciA8cHl0aG9uQHJjbi5jb20+CiAgICBEZXJpdmVkIGZyb20gTGliL3NldHMucHkgYW5kIE9iamVjdHMvZGljdG9iamVjdC5jLgogCi0gICBDb3B5cmlnaHQgKGMpIDIwMDMtNSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KKyAgIENvcHlyaWdodCAoYykgMjAwMy02IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICovCiAKQEAgLTE2LDYgKzE2LDE0IEBACiAvKiBPYmplY3QgdXNlZCBhcyBkdW1teSBrZXkgdG8gZmlsbCBkZWxldGVkIGVudHJpZXMgKi8KIHN0YXRpYyBQeU9iamVjdCAqZHVtbXkgPSBOVUxMOyAvKiBJbml0aWFsaXplZCBieSBmaXJzdCBjYWxsIHRvIG1ha2VfbmV3X3NldCgpICovCiAKKyNpZmRlZiBQeV9SRUZfREVCVUcKK1B5T2JqZWN0ICoKK19QeVNldF9EdW1teSh2b2lkKQoreworCXJldHVybiBkdW1teTsKK30KKyNlbmRpZgorCiAjZGVmaW5lIElOSVRfTk9OWkVST19TRVRfU0xPVFMoc28pIGRvIHsJCQkJXAogCShzbyktPnRhYmxlID0gKHNvKS0+c21hbGx0YWJsZTsJCQkJXAogCShzbyktPm1hc2sgPSBQeVNldF9NSU5TSVpFIC0gMTsJCQkJXApAQCAtNDQ1LDcgKzQ1Myw3IEBACiAJCX0KICNpZmRlZiBQeV9ERUJVRwogCQllbHNlCi0JCQlhc3NlcnQoZW50cnktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgPT0gZHVtbXkpOworCQkJYXNzZXJ0KGVudHJ5LT5rZXkgPT0gTlVMTCk7CiAjZW5kaWYKIAl9CiAKQEAgLTcxOSw4ICs3MjcsNiBAQAogCiAvKioqKiogU2V0IGl0ZXJhdG9yIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBQeVR5cGVPYmplY3QgUHlTZXRJdGVyX1R5cGU7IC8qIEZvcndhcmQgKi8KLQogdHlwZWRlZiBzdHJ1Y3QgewogCVB5T2JqZWN0X0hFQUQKIAlQeVNldE9iamVjdCAqc2lfc2V0OyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwpAQCAtNzI5LDIwICs3MzUsNiBAQAogCWxvbmcgbGVuOwogfSBzZXRpdGVyb2JqZWN0OwogCi1zdGF0aWMgUHlPYmplY3QgKgotc2V0X2l0ZXIoUHlTZXRPYmplY3QgKnNvKQotewotCXNldGl0ZXJvYmplY3QgKnNpID0gUHlPYmplY3RfTmV3KHNldGl0ZXJvYmplY3QsICZQeVNldEl0ZXJfVHlwZSk7Ci0JaWYgKHNpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihzbyk7Ci0Jc2ktPnNpX3NldCA9IHNvOwotCXNpLT5zaV91c2VkID0gc28tPnVzZWQ7Ci0Jc2ktPnNpX3BvcyA9IDA7Ci0Jc2ktPmxlbiA9IHNvLT51c2VkOwotCXJldHVybiAoUHlPYmplY3QgKilzaTsKLX0KLQogc3RhdGljIHZvaWQKIHNldGl0ZXJfZGVhbGxvYyhzZXRpdGVyb2JqZWN0ICpzaSkKIHsKQEAgLTgzOCw2ICs4MzAsMjAgQEAKIAkwLAogfTsKIAorc3RhdGljIFB5T2JqZWN0ICoKK3NldF9pdGVyKFB5U2V0T2JqZWN0ICpzbykKK3sKKwlzZXRpdGVyb2JqZWN0ICpzaSA9IFB5T2JqZWN0X05ldyhzZXRpdGVyb2JqZWN0LCAmUHlTZXRJdGVyX1R5cGUpOworCWlmIChzaSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlQeV9JTkNSRUYoc28pOworCXNpLT5zaV9zZXQgPSBzbzsKKwlzaS0+c2lfdXNlZCA9IHNvLT51c2VkOworCXNpLT5zaV9wb3MgPSAwOworCXNpLT5sZW4gPSBzby0+dXNlZDsKKwlyZXR1cm4gKFB5T2JqZWN0ICopc2k7Cit9CisKIHN0YXRpYyBpbnQKIHNldF91cGRhdGVfaW50ZXJuYWwoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7CkBAIC05NzIsOCArOTc4LDggQEAKIAkJc28gPSBmcmVlX3NldHNbbnVtX2ZyZWVfc2V0c107CiAJCVB5T2JqZWN0X0dDX0RlbChzbyk7CiAJfQotCVB5X1hERUNSRUYoZHVtbXkpOwotCVB5X1hERUNSRUYoZW1wdHlmcm96ZW5zZXQpOworCVB5X0NMRUFSKGR1bW15KTsKKwlQeV9DTEVBUihlbXB0eWZyb3plbnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNTMxLDcgKzE1MzcsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1zZXRfbm9jbXAoUHlPYmplY3QgKnNlbGYpCitzZXRfbm9jbXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlcikKIHsKIAlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2Fubm90IGNvbXBhcmUgc2V0cyB1c2luZyBjbXAoKSIpOwogCXJldHVybiAtMTsKQEAgLTE2ODgsNyArMTY5NCw3IEBACiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBzZXRfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpc2V0X2xlbiwJCS8qIHNxX2xlbmd0aCAqLworCXNldF9sZW4sCQkJLyogc3FfbGVuZ3RoICovCiAJMCwJCQkJLyogc3FfY29uY2F0ICovCiAJMCwJCQkJLyogc3FfcmVwZWF0ICovCiAJMCwJCQkJLyogc3FfaXRlbSAqLwpAQCAtMTgwMiw3ICsxODA4LDcgQEAKIAkocHJpbnRmdW5jKXNldF90cF9wcmludCwJLyogdHBfcHJpbnQgKi8KIAkwLAkJCQkvKiB0cF9nZXRhdHRyICovCiAJMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKXNldF9ub2NtcCwJCS8qIHRwX2NvbXBhcmUgKi8KKwlzZXRfbm9jbXAsCQkJLyogdHBfY29tcGFyZSAqLwogCShyZXByZnVuYylzZXRfcmVwciwJCS8qIHRwX3JlcHIgKi8KIAkmc2V0X2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KIAkmc2V0X2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KQEAgLTE4OTYsNyArMTkwMiw3IEBACiAJKHByaW50ZnVuYylzZXRfdHBfcHJpbnQsCS8qIHRwX3ByaW50ICovCiAJMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwogCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYylzZXRfbm9jbXAsCQkvKiB0cF9jb21wYXJlICovCisJc2V0X25vY21wLAkJCS8qIHRwX2NvbXBhcmUgKi8KIAkocmVwcmZ1bmMpc2V0X3JlcHIsCQkvKiB0cF9yZXByICovCiAJJmZyb3plbnNldF9hc19udW1iZXIsCQkvKiB0cF9hc19udW1iZXIgKi8KIAkmc2V0X2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KQEAgLTE5NjYsNiArMTk3MiwxNiBAQAogfQogCiBpbnQKK1B5U2V0X0NsZWFyKFB5T2JqZWN0ICpzZXQpCit7CisJaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKHNldC0+b2JfdHlwZSwgJlB5U2V0X1R5cGUpKSB7CisJCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBzZXRfY2xlYXJfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopc2V0KTsKK30KKworaW50CiBQeVNldF9Db250YWlucyhQeU9iamVjdCAqYW55c2V0LCBQeU9iamVjdCAqa2V5KQogewogCWlmICghUHlBbnlTZXRfQ2hlY2soYW55c2V0KSkgewpAQCAtMTk5NSw2ICsyMDExLDIxIEBACiAJcmV0dXJuIHNldF9hZGRfa2V5KChQeVNldE9iamVjdCAqKXNldCwga2V5KTsKIH0KIAoraW50CitfUHlTZXRfTmV4dChQeU9iamVjdCAqc2V0LCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqZW50cnkpCit7CisJc2V0ZW50cnkgKmVudHJ5X3B0cjsKKworCWlmICghUHlBbnlTZXRfQ2hlY2soc2V0KSkgeworCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopc2V0LCBwb3MsICZlbnRyeV9wdHIpID09IDApCisJCXJldHVybiAwOworCSplbnRyeSA9IGVudHJ5X3B0ci0+a2V5OworCXJldHVybiAxOworfQorCiBQeU9iamVjdCAqCiBQeVNldF9Qb3AoUHlPYmplY3QgKnNldCkKIHsKQEAgLTIwMDUsNiArMjAzNiwxNSBAQAogCXJldHVybiBzZXRfcG9wKChQeVNldE9iamVjdCAqKXNldCk7CiB9CiAKK2ludAorX1B5U2V0X1VwZGF0ZShQeU9iamVjdCAqc2V0LCBQeU9iamVjdCAqaXRlcmFibGUpCit7CisJaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKHNldC0+b2JfdHlwZSwgJlB5U2V0X1R5cGUpKSB7CisJCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBzZXRfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKXNldCwgaXRlcmFibGUpOworfQogCiAjaWZkZWYgUHlfREVCVUcKIApAQCAtMjAyMSw3ICsyMDYxLDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9jX2FwaShQeVNldE9iamVjdCAqc28pCiB7Ci0JUHlPYmplY3QgKmVsZW0sICpkdXAsICp0LCAqZiwgKm9iID0gKFB5T2JqZWN0ICopc287CisJaW50IGNvdW50OworCWNoYXIgKnM7CisJUHlfc3NpemVfdCBpOworCVB5T2JqZWN0ICplbGVtLCAqZHVwLCAqdCwgKmYsICpkdXAyOworCVB5T2JqZWN0ICpvYiA9IChQeU9iamVjdCAqKXNvOwogCiAJLyogVmVyaWZ5IHByZWNvbmRpdGlvbnMgYW5kIGV4ZXJjaXNlIHR5cGUvc2l6ZSBjaGVja3MgKi8KIAlhc3NlcnQoUHlBbnlTZXRfQ2hlY2sob2IpKTsKQEAgLTIwNTIsNiArMjA5NiwzNSBAQAogCWFzc2VydChQeVNldF9EaXNjYXJkKG9iLCBlbGVtKSA9PSAwKTsKIAlhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDIpOwogCisJLyogRXhlcmNpc2UgY2xlYXIgKi8KKwlkdXAyID0gUHlTZXRfTmV3KGR1cCk7CisJYXNzZXJ0KFB5U2V0X0NsZWFyKGR1cDIpID09IDApOworCWFzc2VydChQeVNldF9TaXplKGR1cDIpID09IDApOworCVB5X0RFQ1JFRihkdXAyKTsKKworCS8qIFJhaXNlIFN5c3RlbUVycm9yIG9uIGNsZWFyIG9yIHVwZGF0ZSBvZiBmcm96ZW4gc2V0ICovCisJZiA9IFB5RnJvemVuU2V0X05ldyhkdXApOworCWFzc2VydFJhaXNlcyhQeVNldF9DbGVhcihmKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOworCWFzc2VydFJhaXNlcyhfUHlTZXRfVXBkYXRlKGYsIGR1cCkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKKwlQeV9ERUNSRUYoZik7CisKKwkvKiBFeGVyY2lzZSBkaXJlY3QgaXRlcmF0aW9uICovCisJaSA9IDAsIGNvdW50ID0gMDsKKwl3aGlsZSAoX1B5U2V0X05leHQoKFB5T2JqZWN0ICopZHVwLCAmaSwgJmVsZW0pKSB7CisJCXMgPSBQeVN0cmluZ19Bc1N0cmluZyhlbGVtKTsKKwkJYXNzZXJ0KHMgJiYgKHNbMF0gPT0gJ2EnIHx8IHNbMF0gPT0gJ2InIHx8IHNbMF0gPT0gJ2MnKSk7CisJCWNvdW50Kys7CisJfQorCWFzc2VydChjb3VudCA9PSAzKTsKKworCS8qIEV4ZXJjaXNlIHVwZGF0ZXMgKi8KKwlkdXAyID0gUHlTZXRfTmV3KE5VTEwpOworCWFzc2VydChfUHlTZXRfVXBkYXRlKGR1cDIsIGR1cCkgPT0gMCk7CisJYXNzZXJ0KFB5U2V0X1NpemUoZHVwMikgPT0gMyk7CisJYXNzZXJ0KF9QeVNldF9VcGRhdGUoZHVwMiwgZHVwKSA9PSAwKTsKKwlhc3NlcnQoUHlTZXRfU2l6ZShkdXAyKSA9PSAzKTsKKwlQeV9ERUNSRUYoZHVwMik7CisKIAkvKiBSYWlzZSBTeXN0ZW1FcnJvciB3aGVuIHNlbGYgYXJndW1lbnQgaXMgbm90IGEgc2V0IG9yIGZyb3plbnNldC4gKi8KIAl0ID0gUHlUdXBsZV9OZXcoMCk7CiAJYXNzZXJ0UmFpc2VzKFB5U2V0X1NpemUodCkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKZGlmZiAtLWdpdCBhL09iamVjdHMvc2xpY2VvYmplY3QuYyBiL09iamVjdHMvc2xpY2VvYmplY3QuYwppbmRleCAzYjM3ZGJiLi4yNzFhOWFkIDEwMDY0NAotLS0gYS9PYmplY3RzL3NsaWNlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zbGljZW9iamVjdC5jCkBAIC0yNCwyNiArMjQsMjYgQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeUVsbGlwc2lzX1R5cGUgPSB7CiAJUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkJLyogb2Jfc2l6ZSAqLwotCSJlbGxpcHNpcyIsCQkJCS8qIHRwX25hbWUgKi8KLQkwLAkJCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwgLypuZXZlciBjYWxsZWQqLwkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZWxsaXBzaXNfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJCS8qIHRwX2ZsYWdzICovCisJMCwJCQkJLyogb2Jfc2l6ZSAqLworCSJlbGxpcHNpcyIsCQkJLyogdHBfbmFtZSAqLworCTAsCQkJCS8qIHRwX2Jhc2ljc2l6ZSAqLworCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCisJMCwgLypuZXZlciBjYWxsZWQqLwkJLyogdHBfZGVhbGxvYyAqLworCTAsCQkJCS8qIHRwX3ByaW50ICovCisJMCwJCQkJLyogdHBfZ2V0YXR0ciAqLworCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KKwkwLAkJCQkvKiB0cF9jb21wYXJlICovCisJZWxsaXBzaXNfcmVwciwJCQkvKiB0cF9yZXByICovCisJMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCisJMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KKwkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCisJMCwJCQkJLyogdHBfaGFzaCAqLworCTAsCQkJCS8qIHRwX2NhbGwgKi8KKwkwLAkJCQkvKiB0cF9zdHIgKi8KKwlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KKwkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLworCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLworCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCiB9OwogCiBQeU9iamVjdCBfUHlfRWxsaXBzaXNPYmplY3QgPSB7CkBAIC03OSw2ICs3OSwyNSBAQAogCXJldHVybiAoUHlPYmplY3QgKikgb2JqOwogfQogCitQeU9iamVjdCAqCitfUHlTbGljZV9Gcm9tSW5kaWNlcyhQeV9zc2l6ZV90IGlzdGFydCwgUHlfc3NpemVfdCBpc3RvcCkKK3sKKwlQeU9iamVjdCAqc3RhcnQsICplbmQsICpzbGljZTsKKwlzdGFydCA9IFB5SW50X0Zyb21Tc2l6ZV90KGlzdGFydCk7CisJaWYgKCFzdGFydCkKKwkJcmV0dXJuIE5VTEw7CisJZW5kID0gUHlJbnRfRnJvbVNzaXplX3QoaXN0b3ApOworCWlmICghZW5kKSB7CisJCVB5X0RFQ1JFRihzdGFydCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNsaWNlID0gUHlTbGljZV9OZXcoc3RhcnQsIGVuZCwgTlVMTCk7CisJUHlfREVDUkVGKHN0YXJ0KTsKKwlQeV9ERUNSRUYoZW5kKTsKKwlyZXR1cm4gc2xpY2U7Cit9CisKIGludAogUHlTbGljZV9HZXRJbmRpY2VzKFB5U2xpY2VPYmplY3QgKnIsIFB5X3NzaXplX3QgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICpzdG9wLCBQeV9zc2l6ZV90ICpzdGVwKQpAQCAtODcsMjEgKzEwNiwyMSBAQAogCWlmIChyLT5zdGVwID09IFB5X05vbmUpIHsKIAkJKnN0ZXAgPSAxOwogCX0gZWxzZSB7Ci0JCWlmICghUHlJbnRfQ2hlY2soci0+c3RlcCkpIHJldHVybiAtMTsKLQkJKnN0ZXAgPSBQeUludF9Bc0xvbmcoci0+c3RlcCk7CisJCWlmICghUHlJbnRfQ2hlY2soci0+c3RlcCkgJiYgIVB5TG9uZ19DaGVjayhyLT5zdGVwKSkgcmV0dXJuIC0xOworCQkqc3RlcCA9IFB5SW50X0FzU3NpemVfdChyLT5zdGVwKTsKIAl9CiAJaWYgKHItPnN0YXJ0ID09IFB5X05vbmUpIHsKIAkJKnN0YXJ0ID0gKnN0ZXAgPCAwID8gbGVuZ3RoLTEgOiAwOwogCX0gZWxzZSB7Ci0JCWlmICghUHlJbnRfQ2hlY2soci0+c3RhcnQpKSByZXR1cm4gLTE7Ci0JCSpzdGFydCA9IFB5SW50X0FzTG9uZyhyLT5zdGFydCk7CisJCWlmICghUHlJbnRfQ2hlY2soci0+c3RhcnQpICYmICFQeUxvbmdfQ2hlY2soci0+c3RlcCkpIHJldHVybiAtMTsKKwkJKnN0YXJ0ID0gUHlJbnRfQXNTc2l6ZV90KHItPnN0YXJ0KTsKIAkJaWYgKCpzdGFydCA8IDApICpzdGFydCArPSBsZW5ndGg7CiAJfQogCWlmIChyLT5zdG9wID09IFB5X05vbmUpIHsKIAkJKnN0b3AgPSAqc3RlcCA8IDAgPyAtMSA6IGxlbmd0aDsKIAl9IGVsc2UgewotCQlpZiAoIVB5SW50X0NoZWNrKHItPnN0b3ApKSByZXR1cm4gLTE7Ci0JCSpzdG9wID0gUHlJbnRfQXNMb25nKHItPnN0b3ApOworCQlpZiAoIVB5SW50X0NoZWNrKHItPnN0b3ApICYmICFQeUxvbmdfQ2hlY2soci0+c3RlcCkpIHJldHVybiAtMTsKKwkJKnN0b3AgPSBQeUludF9Bc1NzaXplX3Qoci0+c3RvcCk7CiAJCWlmICgqc3RvcCA8IDApICpzdG9wICs9IGxlbmd0aDsKIAl9CiAJaWYgKCpzdG9wID4gbGVuZ3RoKSByZXR1cm4gLTE7CkBAIC0yMzMsNyArMjUyLDcgQEAKIHsKIAlQeV9zc2l6ZV90IGlsZW4sIHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aDsKIAotCWlsZW4gPSBQeUludF9Bc0xvbmcobGVuKTsKKwlpbGVuID0gUHlJbnRfQXNTc2l6ZV90KGxlbik7CiAKIAlpZiAoaWxlbiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAJCXJldHVybiBOVUxMOwpAQCAtMjQ0LDcgKzI2Myw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsIHN0YXJ0LCBzdG9wLCBzdGVwKTsKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKG5ubikiLCBzdGFydCwgc3RvcCwgc3RlcCk7CiB9CiAKIFB5RG9jX1NUUlZBUihzbGljZV9pbmRpY2VzX2RvYywKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nb2JqZWN0LmMgYi9PYmplY3RzL3N0cmluZ29iamVjdC5jCmluZGV4IDMyYWFjZjUuLjMyZTgyNWUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zdHJpbmdvYmplY3QuYwpAQCAtMSw1ICsxLDYgQEAKIC8qIFN0cmluZyBvYmplY3QgaW1wbGVtZW50YXRpb24gKi8KIAorI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKICNpbmNsdWRlIDxjdHlwZS5oPgpAQCAtMTYsNyArMTcsNyBAQAogICAgV2hlbiB0aGUgaW50ZXJuZWQgc3RyaW5nIHJlYWNoZXMgYSByZWZjbnQgb2YgMCB0aGUgc3RyaW5nIGRlYWxsb2NhdGlvbgogICAgZnVuY3Rpb24gd2lsbCBkZWxldGUgdGhlIHJlZmVyZW5jZSBmcm9tIHRoaXMgZGljdGlvbmFyeS4KIAotICAgQW5vdGhlciB3YXkgdG8gbG9vayBhdCB0aGlzIGlzIHRoYXQgdG8gc2F5IHRoYXQgdGhlIGFjdHVhbCByZWZlcmVuY2UgCisgICBBbm90aGVyIHdheSB0byBsb29rIGF0IHRoaXMgaXMgdGhhdCB0byBzYXkgdGhhdCB0aGUgYWN0dWFsIHJlZmVyZW5jZQogICAgY291bnQgb2YgYSBzdHJpbmcgaXM6ICBzLT5vYl9yZWZjbnQgKyAocy0+b2Jfc3N0YXRlPzI6MCkKICovCiBzdGF0aWMgUHlPYmplY3QgKmludGVybmVkOwpAQCAtMTA1LDcgKzEwNiw3IEBACiAKIAlhc3NlcnQoc3RyICE9IE5VTEwpOwogCXNpemUgPSBzdHJsZW4oc3RyKTsKLQlpZiAoc2l6ZSA+IElOVF9NQVgpIHsKKwlpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAogCQkJInN0cmluZyBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CiAJCXJldHVybiBOVUxMOwpAQCAtMTgzLDcgKzE4NCw3IEBACiAJCQkJKytmOwogCQkJLyogbGlrZXdpc2UgZm9yICV6ZCAqLwogCQkJaWYgKCpmID09ICd6JyAmJiAqKGYrMSkgPT0gJ2QnKQotCQkJCSsrZjsJCQkKKwkJCQkrK2Y7CiAKIAkJCXN3aXRjaCAoKmYpIHsKIAkJCWNhc2UgJ2MnOgpAQCAtMjczLDE4ICsyNzQsOSBAQAogCQkJY2FzZSAnZCc6CiAJCQkJaWYgKGxvbmdmbGFnKQogCQkJCQlzcHJpbnRmKHMsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKLQkJCQllbHNlIGlmIChzaXplX3RmbGFnKSB7Ci0JCQkJCS8qIEluc3RlYWQgb2YgY2hlY2tpbmcgd2hldGhlciB0aGUgQwotCQkJCQkgICBsaWJyYXJ5IHN1cHBvcnRzICV6ZCwgaGFuZGxlIHRoZQotCQkJCQkgICBjb21tb24gY2FzZXMuICovCi0JCQkJICAgICAgICAjaWYgU0laRU9GX1NJWkVfVCA9PSBTSVpFT0ZfTE9ORwotCQkJCQlzcHJpbnRmKHMsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKLQkJCQkJI2VsaWYgZGVmaW5lZChNU19XSU5ET1dTKQotCQkJCQlzcHJpbnRmKHMsICIlSWQiLCB2YV9hcmcodmFyZ3MsIHNpemVfdCkpOwotCQkJCQkjZWxzZQotCQkJCQkjZXJyb3IgQ2Fubm90IHByaW50IHNpemVfdCB2YWx1ZXMKLQkJCQkJI2VuZGlmCi0JCQkJfQorCQkJCWVsc2UgaWYgKHNpemVfdGZsYWcpCisJCQkJCXNwcmludGYocywgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgInUiLAorCQkJCQkgICAgICAgIHZhX2FyZyh2YXJncywgc2l6ZV90KSk7CiAJCQkJZWxzZQogCQkJCQlzcHJpbnRmKHMsICIlZCIsIHZhX2FyZyh2YXJncywgaW50KSk7CiAJCQkJcyArPSBzdHJsZW4ocyk7CkBAIC01NzgsOCArNTcwLDkgQEAKIAkJCQlpZiAoIXcpCWdvdG8gZmFpbGVkOwogCiAJCQkJLyogQXBwZW5kIGJ5dGVzIHRvIG91dHB1dCBidWZmZXIuICovCi0JCQkJciA9IFB5U3RyaW5nX0FzU3RyaW5nKHcpOwotCQkJCXJuID0gUHlTdHJpbmdfU2l6ZSh3KTsKKwkJCQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2sodykpOworCQkJCXIgPSBQeVN0cmluZ19BU19TVFJJTkcodyk7CisJCQkJcm4gPSBQeVN0cmluZ19HRVRfU0laRSh3KTsKIAkJCQltZW1jcHkocCwgciwgcm4pOwogCQkJCXAgKz0gcm47CiAJCQkJUHlfREVDUkVGKHcpOwpAQCAtNjIyLDcgKzYxNSw3IEBACiAJCQkqcCsrID0gYzsKIAkJCWJyZWFrOwogCQljYXNlICd4JzoKLQkJCWlmIChpc3hkaWdpdChQeV9DSEFSTUFTSyhzWzBdKSkgCisJCQlpZiAoaXN4ZGlnaXQoUHlfQ0hBUk1BU0soc1swXSkpCiAJCQkgICAgJiYgaXN4ZGlnaXQoUHlfQ0hBUk1BU0soc1sxXSkpKSB7CiAJCQkJdW5zaWduZWQgaW50IHggPSAwOwogCQkJCWMgPSBQeV9DSEFSTUFTSygqcyk7CkBAIC02NDYsNyArNjM5LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmICghZXJyb3JzIHx8IHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIAorCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogCQkJCQkJImludmFsaWQgXFx4IGVzY2FwZSIpOwogCQkJCWdvdG8gZmFpbGVkOwogCQkJfQpAQCAtNzUzLDcgKzc0Niw3IEBACiAJKnMgPSBQeVN0cmluZ19BU19TVFJJTkcob2JqKTsKIAlpZiAobGVuICE9IE5VTEwpCiAJCSpsZW4gPSBQeVN0cmluZ19HRVRfU0laRShvYmopOwotCWVsc2UgaWYgKHN0cmxlbigqcykgIT0gUHlTdHJpbmdfR0VUX1NJWkUob2JqKSkgeworCWVsc2UgaWYgKHN0cmxlbigqcykgIT0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRShvYmopKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJImV4cGVjdGVkIHN0cmluZyB3aXRob3V0IG51bGwgYnl0ZXMiKTsKIAkJcmV0dXJuIC0xOwpAQCAtODIyLDcgKzgxNSw3IEBACiAJcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QqIG9wID0gKFB5U3RyaW5nT2JqZWN0Kikgb2JqOwogCXNpemVfdCBuZXdzaXplID0gMiArIDQgKiBvcC0+b2Jfc2l6ZTsKIAlQeU9iamVjdCAqdjsKLQlpZiAobmV3c2l6ZSA+IElOVF9NQVgpIHsKKwlpZiAobmV3c2l6ZSA+IFBZX1NTSVpFX1RfTUFYKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAogCQkJInN0cmluZyBpcyB0b28gbGFyZ2UgdG8gbWFrZSByZXByIik7CiAJfQpAQCAtODM4LDcgKzgzMSw3IEBACiAKIAkJLyogZmlndXJlIG91dCB3aGljaCBxdW90ZSB0byB1c2U7IHNpbmdsZSBpcyBwcmVmZXJyZWQgKi8KIAkJcXVvdGUgPSAnXCcnOwotCQlpZiAoc21hcnRxdW90ZXMgJiYgCisJCWlmIChzbWFydHF1b3RlcyAmJgogCQkgICAgbWVtY2hyKG9wLT5vYl9zdmFsLCAnXCcnLCBvcC0+b2Jfc2l6ZSkgJiYKIAkJICAgICFtZW1jaHIob3AtPm9iX3N2YWwsICciJywgb3AtPm9iX3NpemUpKQogCQkJcXVvdGUgPSAnIic7CkBAIC0xMDAzLDcgKzk5Niw3IEBACiAvKiBTdHJpbmcgc2xpY2UgYVtpOmpdIGNvbnNpc3RzIG9mIGNoYXJhY3RlcnMgYVtpXSAuLi4gYVtqLTFdICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1zdHJpbmdfc2xpY2UocmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKmEsIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgCitzdHJpbmdfc2xpY2UocmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKmEsIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwKIAkgICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaikKICAgICAgLyogaiAtLSBtYXkgYmUgbmVnYXRpdmUhICovCiB7CkBAIC0xMDQ3LDcgKzEwNDAsNyBAQAogCiAJaWYgKGxlbl9zdWIgPT0gMCkKIAkJcmV0dXJuIDE7Ci0JLyogbGFzdCBwb2ludHMgdG8gb25lIGNoYXIgYmV5b25kIHRoZSBzdGFydCBvZiB0aGUgcmlnaHRtb3N0IAorCS8qIGxhc3QgcG9pbnRzIHRvIG9uZSBjaGFyIGJleW9uZCB0aGUgc3RhcnQgb2YgdGhlIHJpZ2h0bW9zdAogCSAgIHN1YnN0cmluZy4gIFdoZW4gczxsYXN0LCB0aGVyZSBpcyBzdGlsbCByb29tIGZvciBhIHBvc3NpYmxlIG1hdGNoCiAJICAgYW5kIHNbMF0gdGhyb3VnaCBzW2xlbl9zdWItMV0gd2lsbCBiZSBpbiBib3VuZHMuCiAJICAgc2hvcnRzdWIgaXMgbGVuX3N1YiBtaW51cyB0aGUgbGFzdCBjaGFyYWN0ZXIgd2hpY2ggaXMgY2hlY2tlZApAQCAtMTA1OSw3ICsxMDUyLDcgQEAKIAlsYXN0Y2hhciA9IHN1YltzaG9ydHN1Yl07CiAJbGFzdCA9IHMgKyBQeVN0cmluZ19HRVRfU0laRShhKSAtIGxlbl9zdWIgKyAxOwogCXdoaWxlIChzIDwgbGFzdCkgewotCQlzID0gbWVtY2hyKHMsIGZpcnN0Y2hhciwgbGFzdC1zKTsKKwkJcyA9IChjaGFyICopbWVtY2hyKHMsIGZpcnN0Y2hhciwgbGFzdC1zKTsKIAkJaWYgKHMgPT0gTlVMTCkKIAkJCXJldHVybiAwOwogCQlhc3NlcnQocyA8IGxhc3QpOwpAQCAtMTIwNyw3ICsxMjAwLDcgQEAKIAkJY2hhciogcmVzdWx0X2J1ZjsKIAkJUHlPYmplY3QqIHJlc3VsdDsKIAotCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIAorCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sCiAJCQkJIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAogCQkJCSAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKIAkJCXJldHVybiBOVUxMOwpAQCAtMTIxOCwyMyArMTIxMSwyMyBAQAogCQl9CiAJCWVsc2UgewogCQkJc291cmNlX2J1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKChQeU9iamVjdCopc2VsZik7Ci0JCQlyZXN1bHRfYnVmID0gUHlNZW1fTWFsbG9jKHNsaWNlbGVuZ3RoKTsKKwkJCXJlc3VsdF9idWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhzbGljZWxlbmd0aCk7CiAJCQlpZiAocmVzdWx0X2J1ZiA9PSBOVUxMKQogCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOyAKKwkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CiAJCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKIAkJCQlyZXN1bHRfYnVmW2ldID0gc291cmNlX2J1ZltjdXJdOwogCQkJfQotCQkJCi0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXN1bHRfYnVmLCAKKworCQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzdWx0X2J1ZiwKIAkJCQkJCQkgICAgc2xpY2VsZW5ndGgpOwogCQkJUHlNZW1fRnJlZShyZXN1bHRfYnVmKTsKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0KLQl9IAorCX0KIAllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJInN0cmluZyBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTM0MCw3ICsxMzMzLDcgQEAKIAkJUHlfREVDUkVGKHN0cik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1zcGxpdF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuLCBpbnQgbWF4c3BsaXQpCitzcGxpdF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogewogCVB5X3NzaXplX3QgaSwgajsKIAlQeU9iamVjdCAqc3RyOwpAQCAtMTM3NCw3ICsxMzY3LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXNwbGl0X2NoYXIoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4sIGNoYXIgY2gsIGludCBtYXhjb3VudCkKK3NwbGl0X2NoYXIoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4sIGNoYXIgY2gsIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7CiAJcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqOwogCVB5T2JqZWN0ICpzdHI7CkBAIC0xNDE1LDE0ICsxNDA4LDE0IEBACiB7CiAJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgbiwgaSwgajsKIAlpbnQgZXJyOwotCWludCBtYXhzcGxpdCA9IC0xOworCVB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMTsKIAljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwogCVB5T2JqZWN0ICpsaXN0LCAqaXRlbSwgKnN1Ym9iaiA9IFB5X05vbmU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPaTpzcGxpdCIsICZzdWJvYmosICZtYXhzcGxpdCkpCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8T246c3BsaXQiLCAmc3Vib2JqLCAmbWF4c3BsaXQpKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAobWF4c3BsaXQgPCAwKQotCQltYXhzcGxpdCA9IElOVF9NQVg7CisJCW1heHNwbGl0ID0gUFlfU1NJWkVfVF9NQVg7CiAJaWYgKHN1Ym9iaiA9PSBQeV9Ob25lKQogCQlyZXR1cm4gc3BsaXRfd2hpdGVzcGFjZShzLCBsZW4sIG1heHNwbGl0KTsKIAlpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgewpAQCAtMTQ4MCw3ICsxNDczLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXJzcGxpdF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuLCBpbnQgbWF4c3BsaXQpCityc3BsaXRfd2hpdGVzcGFjZShjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbiwgUHlfc3NpemVfdCBtYXhzcGxpdCkKIHsKIAlQeV9zc2l6ZV90IGksIGo7CiAJUHlPYmplY3QgKnN0cjsKQEAgLTE1MTQsNyArMTUwNyw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1yc3BsaXRfY2hhcihjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbiwgY2hhciBjaCwgaW50IG1heGNvdW50KQorcnNwbGl0X2NoYXIoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4sIGNoYXIgY2gsIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7CiAJcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqOwogCVB5T2JqZWN0ICpzdHI7CkBAIC0xNTU2LDE0ICsxNTQ5LDE0IEBACiB7CiAJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgbiwgaSwgajsKIAlpbnQgZXJyOwotCWludCBtYXhzcGxpdCA9IC0xOworCVB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMTsKIAljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwogCVB5T2JqZWN0ICpsaXN0LCAqaXRlbSwgKnN1Ym9iaiA9IFB5X05vbmU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPaTpyc3BsaXQiLCAmc3Vib2JqLCAmbWF4c3BsaXQpKQorCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE9uOnJzcGxpdCIsICZzdWJvYmosICZtYXhzcGxpdCkpCiAJCXJldHVybiBOVUxMOwogCWlmIChtYXhzcGxpdCA8IDApCi0JCW1heHNwbGl0ID0gSU5UX01BWDsKKwkJbWF4c3BsaXQgPSBQWV9TU0laRV9UX01BWDsKIAlpZiAoc3Vib2JqID09IFB5X05vbmUpCiAJCXJldHVybiByc3BsaXRfd2hpdGVzcGFjZShzLCBsZW4sIG1heHNwbGl0KTsKIAlpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgewpAQCAtMTY2MSw3ICsxNjU0LDcgQEAKIAl9CiAKIAkvKiBUaGVyZSBhcmUgYXQgbGVhc3QgdHdvIHRoaW5ncyB0byBqb2luLCBvciBlbHNlIHdlIGhhdmUgYSBzdWJjbGFzcwotCSAqIG9mIHRoZSBidWlsdGluIHR5cGVzIGluIHRoZSBzZXF1ZW5jZS4gIAorCSAqIG9mIHRoZSBidWlsdGluIHR5cGVzIGluIHRoZSBzZXF1ZW5jZS4KIAkgKiBEbyBhIHByZS1wYXNzIHRvIGZpZ3VyZSBvdXQgdGhlIHRvdGFsIGFtb3VudCBvZiBzcGFjZSB3ZSdsbAogCSAqIG5lZWQgKHN6KSwgc2VlIHdoZXRoZXIgYW55IGFyZ3VtZW50IGlzIGFic3VyZCwgYW5kIGRlZmVyIHRvCiAJICogdGhlIFVuaWNvZGUgam9pbiBpZiBhcHByb3ByaWF0ZS4KQEAgLTE2ODQsMTYgKzE2NzcsMTYgQEAKIAkJCX0KICNlbmRpZgogCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJzZXF1ZW5jZSBpdGVtICVpOiBleHBlY3RlZCBzdHJpbmcsIgorCQkJCSAgICAgInNlcXVlbmNlIGl0ZW0gJXpkOiBleHBlY3RlZCBzdHJpbmcsIgogCQkJCSAgICAgIiAlLjgwcyBmb3VuZCIsCi0JCQkJICAgICAvKlhYWCovKGludClpLCBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKKwkJCQkgICAgIGksIGl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOwogCQkJUHlfREVDUkVGKHNlcSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlzeiArPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKIAkJaWYgKGkgIT0gMCkKIAkJCXN6ICs9IHNlcGxlbjsKLQkJaWYgKHN6IDwgb2xkX3N6IHx8IHN6ID4gSU5UX01BWCkgeworCQlpZiAoc3ogPCBvbGRfc3ogfHwgc3ogPiBQWV9TU0laRV9UX01BWCkgewogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkJImpvaW4oKSBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CiAJCQlQeV9ERUNSRUYoc2VxKTsKQEAgLTE3NTQsNyArMTc0Nyw3IEBACiB7CiAJY29uc3QgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnN1YjsKIAlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCVB5X3NzaXplX3QgbiwgaSA9IDAsIGxhc3QgPSBJTlRfTUFYOworCVB5X3NzaXplX3QgbiwgaSA9IDAsIGxhc3QgPSBQWV9TU0laRV9UX01BWDsKIAlQeU9iamVjdCAqc3Vib2JqOwogCiAJLyogWFhYIHNzaXplX3QgaSAqLwpAQCAtMTk2MCwxNyArMTk1MywxNCBAQAogCQkJcmV0dXJuIHJlczsKIAkJfQogI2VuZGlmCi0JCWVsc2UgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKwkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQkJICAgICAiJXMgYXJnIG11c3QgYmUgTm9uZSwgc3RyIG9yIHVuaWNvZGUiLAorCQkJICAgICAiJXMgYXJnIG11c3QgYmUgTm9uZSwgc3RyIG9yIHVuaWNvZGUiLAogI2Vsc2UKLQkJCQkgICAgICIlcyBhcmcgbXVzdCBiZSBOb25lIG9yIHN0ciIsCisJCQkgICAgICIlcyBhcmcgbXVzdCBiZSBOb25lIG9yIHN0ciIsCiAjZW5kaWYKLQkJCQkgICAgIFNUUklQTkFNRShzdHJpcHR5cGUpKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBkb194c3RyaXAoc2VsZiwgc3RyaXB0eXBlLCBzZXApOworCQkJICAgICBTVFJJUE5BTUUoc3RyaXB0eXBlKSk7CisJCXJldHVybiBOVUxMOwogCX0KIAogCXJldHVybiBkb19zdHJpcChzZWxmLCBzdHJpcHR5cGUpOwpAQCAtMjAzOSwxMiArMjAyOSwxMiBAQAogewogCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKIAlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdvYmo7CiAKLQluZXcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3ID09IE5VTEwpCisJbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisJaWYgKG5ld29iaiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ldyk7CisJc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKIAkJaWYgKGlzdXBwZXIoYykpIHsKQEAgLTIwNTMsNyArMjA0Myw3IEBACiAJCQkqc19uZXcgPSBjOwogCQlzX25ldysrOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdvYmo7CiB9CiAKIApAQCAtMjA2NywxMiArMjA1NywxMiBAQAogewogCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKIAlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdvYmo7CiAKLQluZXcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3ID09IE5VTEwpCisJbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisJaWYgKG5ld29iaiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ldyk7CisJc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKIAkJaWYgKGlzbG93ZXIoYykpIHsKQEAgLTIwODEsNyArMjA3MSw3IEBACiAJCQkqc19uZXcgPSBjOwogCQlzX25ldysrOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdvYmo7CiB9CiAKIApAQCAtMjA5NywxMiArMjA4NywxMiBAQAogCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKIAlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKIAlpbnQgcHJldmlvdXNfaXNfY2FzZWQgPSAwOwotCVB5T2JqZWN0ICpuZXc7CisJUHlPYmplY3QgKm5ld29iajsKIAotCW5ldyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXcgPT0gTlVMTCkKKwluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKwlpZiAobmV3b2JqID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3KTsKKwlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwogCQlpZiAoaXNsb3dlcihjKSkgewpAQCAtMjExNyw3ICsyMTA3LDcgQEAKIAkJCXByZXZpb3VzX2lzX2Nhc2VkID0gMDsKIAkJKnNfbmV3KysgPSBjOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdvYmo7CiB9CiAKIFB5RG9jX1NUUlZBUihjYXBpdGFsaXplX19kb2NfXywKQEAgLTIxMzEsMTIgKzIxMjEsMTIgQEAKIHsKIAljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc19uZXc7CiAJUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKm5ldzsKKwlQeU9iamVjdCAqbmV3b2JqOwogCi0JbmV3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ldyA9PSBOVUxMKQorCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworCWlmIChuZXdvYmogPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXcpOworCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKIAlpZiAoMCA8IG4pIHsKIAkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKIAkJaWYgKGlzbG93ZXIoYykpCkBAIC0yMTUzLDcgKzIxNDMsNyBAQAogCQkJKnNfbmV3ID0gYzsKIAkJc19uZXcrKzsKIAl9Ci0JcmV0dXJuIG5ldzsKKwlyZXR1cm4gbmV3b2JqOwogfQogCiAKQEAgLTIxNjksNyArMjE1OSw3IEBACiB7CiAJY29uc3QgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnN1YiwgKnQ7CiAJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgbjsKLQlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gSU5UX01BWDsKKwlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7CiAJUHlfc3NpemVfdCBtLCByOwogCVB5T2JqZWN0ICpzdWJvYmo7CiAKQEAgLTIyMTAsNyArMjIwMCw3IEBACiAJCX0KIAkJaWYgKGkgPj0gbSkKIAkJCWJyZWFrOwotCQl0ID0gbWVtY2hyKHMraSwgc3ViWzBdLCBtLWkpOworCQl0ID0gKGNvbnN0IGNoYXIgKiltZW1jaHIocytpLCBzdWJbMF0sIG0taSk7CiAJCWlmICh0ID09IE5VTEwpCiAJCQlicmVhazsKIAkJaSA9IHQgLSBzOwpAQCAtMjIyOSwxMiArMjIxOSwxMiBAQAogewogCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKIAlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdvYmo7CiAKLQluZXcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3ID09IE5VTEwpCisJbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisJaWYgKG5ld29iaiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ldyk7CisJc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKIAkJaWYgKGlzbG93ZXIoYykpIHsKQEAgLTIyNDcsNyArMjIzNyw3IEBACiAJCQkqc19uZXcgPSBjOwogCQlzX25ldysrOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdvYmo7CiB9CiAKIApAQCAtMjMyMywxMiArMjMxMywxMiBAQAogCX0KIAogCXRhYmxlID0gdGFibGUxOwotCWlubGVuID0gUHlTdHJpbmdfU2l6ZShpbnB1dF9vYmopOworCWlubGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRfb2JqKTsKIAlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGlubGVuKTsKIAlpZiAocmVzdWx0ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCW91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCk7Ci0JaW5wdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhpbnB1dF9vYmopOworCWlucHV0ID0gUHlTdHJpbmdfQVNfU1RSSU5HKGlucHV0X29iaik7CiAKIAlpZiAoZGVsbGVuID09IDApIHsKIAkJLyogSWYgbm8gZGVsZXRpb25zIGFyZSByZXF1aXJlZCwgdXNlIGZhc3RlciBjb2RlICovCkBAIC0yNDU3LDcgKzI0NDcsNyBAQAogCS8qIGZpbmQgbGVuZ3RoIG9mIG91dHB1dCBzdHJpbmcgKi8KIAluZm91bmQgPSAocGF0X2xlbiA+IDApID8gbXltZW1jbnQoc3RyLCBsZW4sIHBhdCwgcGF0X2xlbikgOiBsZW4gKyAxOwogCWlmIChjb3VudCA8IDApCi0JCWNvdW50ID0gSU5UX01BWDsKKwkJY291bnQgPSBQWV9TU0laRV9UX01BWDsKIAllbHNlIGlmIChuZm91bmQgPiBjb3VudCkKIAkJbmZvdW5kID0gY291bnQ7CiAJaWYgKG5mb3VuZCA9PSAwKQpAQCAtMjUzNCwxMSArMjUyNCwxMSBAQAogCWNoYXIgKm5ld19zOwogCWNvbnN0IFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAJUHlfc3NpemVfdCBzdWJfbGVuLCByZXBsX2xlbiwgb3V0X2xlbjsKLQlpbnQgY291bnQgPSAtMTsKLQlQeU9iamVjdCAqbmV3OworCVB5X3NzaXplX3QgY291bnQgPSAtMTsKKwlQeU9iamVjdCAqbmV3b2JqOwogCVB5T2JqZWN0ICpzdWJvYmosICpyZXBsb2JqOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xpOnJlcGxhY2UiLAorCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098bjpyZXBsYWNlIiwKIAkJCSAgICAgICZzdWJvYmosICZyZXBsb2JqLCAmY291bnQpKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMjU3NCwyMCArMjU2NCwyMCBAQAogCWlmIChvdXRfbGVuID09IC0xKSB7CiAJCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CiAJCQkvKiB3ZSdyZSByZXR1cm5pbmcgYW5vdGhlciByZWZlcmVuY2UgdG8gc2VsZiAqLwotCQkJbmV3ID0gKFB5T2JqZWN0KilzZWxmOwotCQkJUHlfSU5DUkVGKG5ldyk7CisJCQluZXdvYmogPSAoUHlPYmplY3QqKXNlbGY7CisJCQlQeV9JTkNSRUYobmV3b2JqKTsKIAkJfQogCQllbHNlIHsKLQkJCW5ldyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0ciwgbGVuKTsKLQkJCWlmIChuZXcgPT0gTlVMTCkKKwkJCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0ciwgbGVuKTsKKwkJCWlmIChuZXdvYmogPT0gTlVMTCkKIAkJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0KIAllbHNlIHsKLQkJbmV3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobmV3X3MsIG91dF9sZW4pOworCQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuZXdfcywgb3V0X2xlbik7CiAJCVB5TWVtX0ZSRUUobmV3X3MpOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdvYmo7CiB9CiAKIApAQCAtMjYwNiw3ICsyNTk2LDcgQEAKIAljb25zdCBjaGFyKiBwcmVmaXg7CiAJUHlfc3NpemVfdCBwbGVuOwogCVB5X3NzaXplX3Qgc3RhcnQgPSAwOwotCVB5X3NzaXplX3QgZW5kID0gSU5UX01BWDsKKwlQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogCVB5T2JqZWN0ICpzdWJvYmo7CiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpzdGFydHN3aXRoIiwgJnN1Ym9iaiwKQEAgLTI2NTcsNyArMjY0Nyw3IEBACiAJY29uc3QgY2hhciogc3VmZml4OwogCVB5X3NzaXplX3Qgc2xlbjsKIAlQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLQlQeV9zc2l6ZV90IGVuZCA9IElOVF9NQVg7CisJUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKIAlQeU9iamVjdCAqc3Vib2JqOwogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6ZW5kc3dpdGgiLCAmc3Vib2JqLApAQCAtMjcxMSw3ICsyNzAxLDcgQEAKICAgICBjaGFyICplbmNvZGluZyA9IE5VTEw7CiAgICAgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBQeU9iamVjdCAqdjsKLSAgICAKKwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHNzOmVuY29kZSIsICZlbmNvZGluZywgJmVycm9ycykpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHYgPSBQeVN0cmluZ19Bc0VuY29kZWRPYmplY3QoKFB5T2JqZWN0ICopc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk7CkBAIC0yNzQ4LDcgKzI3MzgsNyBAQAogICAgIGNoYXIgKmVuY29kaW5nID0gTlVMTDsKICAgICBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICp2OwotICAgIAorCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8c3M6ZGVjb2RlIiwgJmVuY29kaW5nLCAmZXJyb3JzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IFB5U3RyaW5nX0FzRGVjb2RlZE9iamVjdCgoUHlPYmplY3QgKilzZWxmLCBlbmNvZGluZywgZXJyb3JzKTsKQEAgLTI4NzAsMTAgKzI4NjAsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfbGp1c3QoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIGludCB3aWR0aDsKKyAgICBQeV9zc2l6ZV90IHdpZHRoOwogICAgIGNoYXIgZmlsbGNoYXIgPSAnICc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8YzpsanVzdCIsICZ3aWR0aCwgJmZpbGxjaGFyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58YzpsanVzdCIsICZ3aWR0aCwgJmZpbGxjaGFyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPj0gd2lkdGggJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewpAQCAtMjg5NCwxMCArMjg4NCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19yanVzdChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgaW50IHdpZHRoOworICAgIFB5X3NzaXplX3Qgd2lkdGg7CiAgICAgY2hhciBmaWxsY2hhciA9ICcgJzsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxjOnJqdXN0IiwgJndpZHRoLCAmZmlsbGNoYXIpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxjOnJqdXN0IiwgJndpZHRoLCAmZmlsbGNoYXIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA+PSB3aWR0aCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CkBAIC0yOTE5LDEwICsyOTA5LDEwIEBACiBzdHJpbmdfY2VudGVyKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeV9zc2l6ZV90IG1hcmcsIGxlZnQ7Ci0gICAgbG9uZyB3aWR0aDsKKyAgICBQeV9zc2l6ZV90IHdpZHRoOwogICAgIGNoYXIgZmlsbGNoYXIgPSAnICc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImx8YzpjZW50ZXIiLCAmd2lkdGgsICZmaWxsY2hhcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGM6Y2VudGVyIiwgJndpZHRoLCAmZmlsbGNoYXIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA+PSB3aWR0aCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CkBAIC0yOTQ4LDkgKzI5MzgsOSBAQAogICAgIFB5X3NzaXplX3QgZmlsbDsKICAgICBQeU9iamVjdCAqczsKICAgICBjaGFyICpwOworICAgIFB5X3NzaXplX3Qgd2lkdGg7CiAKLSAgICBsb25nIHdpZHRoOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDp6ZmlsbCIsICZ3aWR0aCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuOnpmaWxsIiwgJndpZHRoKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPj0gd2lkdGgpIHsKQEAgLTM0NjcsMjIgKzM0NTcsMjIgQEAKIAkic3RyIiwKIAlzaXplb2YoUHlTdHJpbmdPYmplY3QpLAogCXNpemVvZihjaGFyKSwKLSAJKGRlc3RydWN0b3Ipc3RyaW5nX2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLworIAlzdHJpbmdfZGVhbGxvYywgCQkJLyogdHBfZGVhbGxvYyAqLwogCShwcmludGZ1bmMpc3RyaW5nX3ByaW50LCAJCS8qIHRwX3ByaW50ICovCiAJMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KIAkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwogCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXN0cmluZ19yZXByLCAJCQkvKiB0cF9yZXByICovCisJc3RyaW5nX3JlcHIsIAkJCQkvKiB0cF9yZXByICovCiAJJnN0cmluZ19hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCiAJJnN0cmluZ19hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwogCSZzdHJpbmdfYXNfbWFwcGluZywJCQkvKiB0cF9hc19tYXBwaW5nICovCiAJKGhhc2hmdW5jKXN0cmluZ19oYXNoLCAJCQkvKiB0cF9oYXNoICovCiAJMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpc3RyaW5nX3N0ciwJCQkvKiB0cF9zdHIgKi8KKwlzdHJpbmdfc3RyLAkJCQkvKiB0cF9zdHIgKi8KIAlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCiAJMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCiAJJnN0cmluZ19hc19idWZmZXIsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwgCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKIAkJUHlfVFBGTEFHU19CQVNFVFlQRSwJCS8qIHRwX2ZsYWdzICovCiAJc3RyaW5nX2RvYywJCQkJLyogdHBfZG9jICovCiAJMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCkBAIC0zNjM1LDcgKzM2MjUsNyBAQAogCSAgICAgbGVuID0gMSArIDUwICsgMSArIHByZWMgPSA1MiArIHByZWMKIAogCSAgIElmIHByZWM9MCB0aGUgZWZmZWN0aXZlIHByZWNpc2lvbiBpcyAxICh0aGUgbGVhZGluZyBkaWdpdCBpcwotCSAgIGFsd2F5cyBnaXZlbiksIHRoZXJlZm9yZSBpbmNyZWFzZSB0aGUgbGVuZ3RoIGJ5IG9uZS4gCisJICAgYWx3YXlzIGdpdmVuKSwgdGhlcmVmb3JlIGluY3JlYXNlIHRoZSBsZW5ndGggYnkgb25lLgogCiAJKi8KIAlpZiAoKHR5cGUgPT0gJ2cnICYmIGJ1ZmxlbiA8PSAoc2l6ZV90KTEwICsgKHNpemVfdClwcmVjKSB8fApAQCAtMzcxMSw3ICszNzAxLDcgQEAKIAl9CiAJYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KTsKIAlsbGVuID0gUHlTdHJpbmdfU2l6ZShyZXN1bHQpOwotCWlmIChsbGVuID4gSU5UX01BWCkgeworCWlmIChsbGVuID4gUFlfU1NJWkVfVF9NQVgpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzdHJpbmcgdG9vIGxhcmdlIGluIF9QeVN0cmluZ19Gb3JtYXRMb25nIik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTQ0MzksNyArNDQyOSw3IEBACiAJICAgZGV0ZWN0b3IsIGludGVybmVkIHN0cmluZ3MgYXJlIG5vdCBmb3JjaWJseSBkZWFsbG9jYXRlZDsgcmF0aGVyLCB3ZQogCSAgIGdpdmUgdGhlbSB0aGVpciBzdG9sZW4gcmVmZXJlbmNlcyBiYWNrLCBhbmQgdGhlbiBjbGVhciBhbmQgREVDUkVGCiAJICAgdGhlIGludGVybmVkIGRpY3QuICovCi0JICAgCisKIAlmcHJpbnRmKHN0ZGVyciwgInJlbGVhc2luZyBpbnRlcm5lZCBzdHJpbmdzXG4iKTsKIAluID0gUHlMaXN0X0dFVF9TSVpFKGtleXMpOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RydWN0c2VxLmMgYi9PYmplY3RzL3N0cnVjdHNlcS5jCmluZGV4IDIxOGQwYjQuLmUwNzQ4MTAgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RydWN0c2VxLmMKKysrIGIvT2JqZWN0cy9zdHJ1Y3RzZXEuYwpAQCAtMzE1LDcgKzMxNSw3IEBACiAJMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwogCSZzdHJ1Y3RzZXFfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KIAkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylzdHJ1Y3RzZXFfaGFzaCwgICAgICAgICAgICAgIAkvKiB0cF9oYXNoICovCisJc3RydWN0c2VxX2hhc2gsCQkJCS8qIHRwX2hhc2ggKi8KIAkwLCAgICAgICAgICAgICAgCQkJLyogdHBfY2FsbCAqLwogCTAsCQkJCQkvKiB0cF9zdHIgKi8KIAkwLCAgICAgICAgICAgICAgICAgICAgICAgCQkvKiB0cF9nZXRhdHRybyAqLwpAQCAtMzQ5LDYgKzM0OSwxNCBAQAogCVB5TWVtYmVyRGVmKiBtZW1iZXJzOwogCWludCBuX21lbWJlcnMsIG5fdW5uYW1lZF9tZW1iZXJzLCBpLCBrOwogCisjaWZkZWYgUHlfVFJBQ0VfUkVGUworCS8qIGlmIHRoZSB0eXBlIG9iamVjdCB3YXMgY2hhaW5lZCwgdW5jaGFpbiBpdCBmaXJzdAorCSAgIGJlZm9yZSBvdmVyd3JpdGluZyBpdHMgc3RvcmFnZSAqLworCWlmICh0eXBlLT5fb2JfbmV4dCkgeworCQlfUHlfRm9yZ2V0UmVmZXJlbmNlKChQeU9iamVjdCopdHlwZSk7CisJfQorI2VuZGlmCisKIAluX3VubmFtZWRfbWVtYmVycyA9IDA7CiAJZm9yIChpID0gMDsgZGVzYy0+ZmllbGRzW2ldLm5hbWUgIT0gTlVMTDsgKytpKQogCQlpZiAoZGVzYy0+ZmllbGRzW2ldLm5hbWUgPT0gUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQpCmRpZmYgLS1naXQgYS9PYmplY3RzL3R1cGxlb2JqZWN0LmMgYi9PYmplY3RzL3R1cGxlb2JqZWN0LmMKaW5kZXggMzg0YjM1NS4uMjE2MWFiOSAxMDA2NDQKLS0tIGEvT2JqZWN0cy90dXBsZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHVwbGVvYmplY3QuYwpAQCAtNDM4LDE2ICs0MzgsOSBAQAogdHVwbGV0cmF2ZXJzZShQeVR1cGxlT2JqZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKIAlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKng7CiAKLQlmb3IgKGkgPSBvLT5vYl9zaXplOyAtLWkgPj0gMDsgKSB7Ci0JCXggPSBvLT5vYl9pdGVtW2ldOwotCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQlpbnQgZXJyID0gdmlzaXQoeCwgYXJnKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KKwlmb3IgKGkgPSBvLT5vYl9zaXplOyAtLWkgPj0gMDsgKQorCQlQeV9WSVNJVChvLT5vYl9pdGVtW2ldKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTQ3LDcgKzU0MCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVfc3VidHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnRtcCwgKm5ldywgKml0ZW07CisJUHlPYmplY3QgKnRtcCwgKm5ld29iaiwgKml0ZW07CiAJUHlfc3NpemVfdCBpLCBuOwogCiAJYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5VHVwbGVfVHlwZSkpOwpAQCAtNTU1LDE2ICs1NDgsMTYgQEAKIAlpZiAodG1wID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCWFzc2VydChQeVR1cGxlX0NoZWNrKHRtcCkpOwotCW5ldyA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIG4gPSBQeVR1cGxlX0dFVF9TSVpFKHRtcCkpOwotCWlmIChuZXcgPT0gTlVMTCkKKwluZXdvYmogPSB0eXBlLT50cF9hbGxvYyh0eXBlLCBuID0gUHlUdXBsZV9HRVRfU0laRSh0bXApKTsKKwlpZiAobmV3b2JqID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0odG1wLCBpKTsKIAkJUHlfSU5DUkVGKGl0ZW0pOwotCQlQeVR1cGxlX1NFVF9JVEVNKG5ldywgaSwgaXRlbSk7CisJCVB5VHVwbGVfU0VUX0lURU0obmV3b2JqLCBpLCBpdGVtKTsKIAl9CiAJUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIG5ldzsKKwlyZXR1cm4gbmV3b2JqOwogfQogCiBQeURvY19TVFJWQVIodHVwbGVfZG9jLApAQCAtNjE1LDYgKzYwOCw3IEBACiAJCX0KIAkJZWxzZSB7CiAJCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhzbGljZWxlbmd0aCk7CisJCQlpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CiAKIAkJCXNyYyA9IHNlbGYtPm9iX2l0ZW07CiAJCQlkZXN0ID0gKChQeVR1cGxlT2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbTsKQEAgLTc5MCwyNyArNzg0LDYgQEAKIAlQeVR1cGxlT2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHR1cGxlaXRlcm9iamVjdDsKIAotUHlUeXBlT2JqZWN0IFB5VHVwbGVJdGVyX1R5cGU7Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi10dXBsZV9pdGVyKFB5T2JqZWN0ICpzZXEpCi17Ci0JdHVwbGVpdGVyb2JqZWN0ICppdDsKLQotCWlmICghUHlUdXBsZV9DaGVjayhzZXEpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9HQ19OZXcodHVwbGVpdGVyb2JqZWN0LCAmUHlUdXBsZUl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0LT5pdF9pbmRleCA9IDA7Ci0JUHlfSU5DUkVGKHNlcSk7Ci0JaXQtPml0X3NlcSA9IChQeVR1cGxlT2JqZWN0ICopc2VxOwotCV9QeU9iamVjdF9HQ19UUkFDSyhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OwotfQotCiBzdGF0aWMgdm9pZAogdHVwbGVpdGVyX2RlYWxsb2ModHVwbGVpdGVyb2JqZWN0ICppdCkKIHsKQEAgLTgyMiw5ICs3OTUsOCBAQAogc3RhdGljIGludAogdHVwbGVpdGVyX3RyYXZlcnNlKHR1cGxlaXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmIChpdC0+aXRfc2VxID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiB2aXNpdCgoUHlPYmplY3QgKilpdC0+aXRfc2VxLCBhcmcpOworCVB5X1ZJU0lUKGl0LT5pdF9zZXEpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtOTAwLDMgKzg3MiwyMiBAQAogCXR1cGxlaXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KIAkwLAogfTsKKworc3RhdGljIFB5T2JqZWN0ICoKK3R1cGxlX2l0ZXIoUHlPYmplY3QgKnNlcSkKK3sKKwl0dXBsZWl0ZXJvYmplY3QgKml0OworCisJaWYgKCFQeVR1cGxlX0NoZWNrKHNlcSkpIHsKKwkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpdCA9IFB5T2JqZWN0X0dDX05ldyh0dXBsZWl0ZXJvYmplY3QsICZQeVR1cGxlSXRlcl9UeXBlKTsKKwlpZiAoaXQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJaXQtPml0X2luZGV4ID0gMDsKKwlQeV9JTkNSRUYoc2VxKTsKKwlpdC0+aXRfc2VxID0gKFB5VHVwbGVPYmplY3QgKilzZXE7CisJX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKKwlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7Cit9CmRpZmYgLS1naXQgYS9PYmplY3RzL3R5cGVvYmplY3QuYyBiL09iamVjdHMvdHlwZW9iamVjdC5jCmluZGV4IGMwMmYwNjAuLjRjYWY1MzggMTAwNjQ0Ci0tLSBhL09iamVjdHMvdHlwZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHlwZW9iamVjdC5jCkBAIC00NTMsNyArNDUzLDcgQEAKIAlpZiAoUHlUeXBlX0lTX0dDKHR5cGUpKQogCQlvYmogPSBfUHlPYmplY3RfR0NfTWFsbG9jKHNpemUpOwogCWVsc2UKLQkJb2JqID0gUHlPYmplY3RfTUFMTE9DKHNpemUpOworCQlvYmogPSAoUHlPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZSk7CiAKIAlpZiAob2JqID09IE5VTEwpCiAJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwpAQCAtNTI1LDIxICs1MjUsMTUgQEAKIAogCWlmICh0eXBlLT50cF9kaWN0b2Zmc2V0ICE9IGJhc2UtPnRwX2RpY3RvZmZzZXQpIHsKIAkJUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoc2VsZik7Ci0JCWlmIChkaWN0cHRyICYmICpkaWN0cHRyKSB7Ci0JCQlpbnQgZXJyID0gdmlzaXQoKmRpY3RwdHIsIGFyZyk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7Ci0JCX0KKwkJaWYgKGRpY3RwdHIgJiYgKmRpY3RwdHIpCisJCQlQeV9WSVNJVCgqZGljdHB0cik7CiAJfQogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgeworCWlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCiAJCS8qIEZvciBhIGhlYXB0eXBlLCB0aGUgaW5zdGFuY2VzIGNvdW50IGFzIHJlZmVyZW5jZXMKIAkJICAgdG8gdGhlIHR5cGUuICBUcmF2ZXJzZSB0aGUgdHlwZSBzbyB0aGUgY29sbGVjdG9yCiAJCSAgIGNhbiBmaW5kIGN5Y2xlcyBpbnZvbHZpbmcgdGhpcyBsaW5rLiAqLwotCQlpbnQgZXJyID0gdmlzaXQoKFB5T2JqZWN0ICopdHlwZSwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQorCQlQeV9WSVNJVCh0eXBlKTsKIAogCWlmIChiYXNldHJhdmVyc2UpCiAJCXJldHVybiBiYXNldHJhdmVyc2Uoc2VsZiwgdmlzaXQsIGFyZyk7CkBAIC01NTksOCArNTUzLDggQEAKIAkJCWNoYXIgKmFkZHIgPSAoY2hhciAqKXNlbGYgKyBtcC0+b2Zmc2V0OwogCQkJUHlPYmplY3QgKm9iaiA9ICooUHlPYmplY3QgKiopYWRkcjsKIAkJCWlmIChvYmogIT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihvYmopOwogCQkJCSooUHlPYmplY3QgKiopYWRkciA9IE5VTEw7CisJCQkJUHlfREVDUkVGKG9iaik7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMTA2LDE0ICsxMTAwLDE3IEBACiAJY2hhciBidWZbMTAwMF07CiAJUHlPYmplY3QgKmssICp2OwogCVB5T2JqZWN0ICpzZXQgPSBQeURpY3RfTmV3KCk7CisJaWYgKCFzZXQpIHJldHVybjsKIAogCXRvX21lcmdlX3NpemUgPSBQeUxpc3RfR0VUX1NJWkUodG9fbWVyZ2UpOwogCWZvciAoaSA9IDA7IGkgPCB0b19tZXJnZV9zaXplOyBpKyspIHsKIAkJUHlPYmplY3QgKkwgPSBQeUxpc3RfR0VUX0lURU0odG9fbWVyZ2UsIGkpOwogCQlpZiAocmVtYWluW2ldIDwgUHlMaXN0X0dFVF9TSVpFKEwpKSB7CiAJCQlQeU9iamVjdCAqYyA9IFB5TGlzdF9HRVRfSVRFTShMLCByZW1haW5baV0pOwotCQkJaWYgKFB5RGljdF9TZXRJdGVtKHNldCwgYywgUHlfTm9uZSkgPCAwKQorCQkJaWYgKFB5RGljdF9TZXRJdGVtKHNldCwgYywgUHlfTm9uZSkgPCAwKSB7CisJCQkJUHlfREVDUkVGKHNldCk7CiAJCQkJcmV0dXJuOworCQkJfQogCQl9CiAJfQogCW4gPSBQeURpY3RfU2l6ZShzZXQpOwpAQCAtMTEyMSwxMiArMTExOCwxMiBAQAogCW9mZiA9IFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkNhbm5vdCBjcmVhdGUgYSBcCiBjb25zaXN0ZW50IG1ldGhvZCByZXNvbHV0aW9uXG5vcmRlciAoTVJPKSBmb3IgYmFzZXMiKTsKIAlpID0gMDsKLQl3aGlsZSAoUHlEaWN0X05leHQoc2V0LCAmaSwgJmssICZ2KSAmJiBvZmYgPCBzaXplb2YoYnVmKSkgeworCXdoaWxlIChQeURpY3RfTmV4dChzZXQsICZpLCAmaywgJnYpICYmIChzaXplX3Qpb2ZmIDwgc2l6ZW9mKGJ1ZikpIHsKIAkJUHlPYmplY3QgKm5hbWUgPSBjbGFzc19uYW1lKGspOwogCQlvZmYgKz0gUHlPU19zbnByaW50ZihidWYgKyBvZmYsIHNpemVvZihidWYpIC0gb2ZmLCAiICVzIiwKIAkJCQkgICAgIG5hbWUgPyBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkgOiAiPyIpOwogCQlQeV9YREVDUkVGKG5hbWUpOwotCQlpZiAoLS1uICYmIG9mZisxIDwgc2l6ZW9mKGJ1ZikpIHsKKwkJaWYgKC0tbiAmJiAoc2l6ZV90KShvZmYrMSkgPCBzaXplb2YoYnVmKSkgewogCQkJYnVmW29mZisrXSA9ICcsJzsKIAkJCWJ1ZltvZmZdID0gJ1wwJzsKIAkJfQpAQCAtMTE0Nyw3ICsxMTQ0LDcgQEAKIAkgICByZW1haW5baV0gaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJhc2UgaW4gdG9fbWVyZ2VbaV0KIAkgICB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBhY2MuCiAJKi8KLQlyZW1haW4gPSBQeU1lbV9NQUxMT0MoU0laRU9GX0lOVCp0b19tZXJnZV9zaXplKTsKKwlyZW1haW4gPSAoaW50ICopUHlNZW1fTUFMTE9DKFNJWkVPRl9JTlQqdG9fbWVyZ2Vfc2l6ZSk7CiAJaWYgKHJlbWFpbiA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAJZm9yIChpID0gMDsgaSA8IHRvX21lcmdlX3NpemU7IGkrKykKQEAgLTE4OTMsNyArMTg5MCw3IEBACiAJCVB5T2JqZWN0ICpkb2MgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiX19kb2NfXyIpOwogCQlpZiAoZG9jICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2soZG9jKSkgewogCQkJY29uc3Qgc2l6ZV90IG4gPSAoc2l6ZV90KVB5U3RyaW5nX0dFVF9TSVpFKGRvYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp0cF9kb2MgPSBQeU9iamVjdF9NQUxMT0MobisxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnRwX2RvYyA9IChjaGFyICopUHlPYmplY3RfTUFMTE9DKG4rMSk7CiAJCQlpZiAodHBfZG9jID09IE5VTEwpIHsKIAkJCQlQeV9ERUNSRUYodHlwZSk7CiAJCQkJcmV0dXJuIE5VTEw7CkBAIC0yMTk1LDUxICsyMTkyLDMxIEBACiBzdGF0aWMgaW50CiB0eXBlX3RyYXZlcnNlKFB5VHlwZU9iamVjdCAqdHlwZSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVycjsKLQogCS8qIEJlY2F1c2Ugb2YgdHlwZV9pc19nYygpLCB0aGUgY29sbGVjdG9yIG9ubHkgY2FsbHMgdGhpcwogCSAgIGZvciBoZWFwdHlwZXMuICovCiAJYXNzZXJ0KHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSk7CiAKLSNkZWZpbmUgVklTSVQoU0xPVCkgXAotCWlmIChTTE9UKSB7IFwKLQkJZXJyID0gdmlzaXQoKFB5T2JqZWN0ICopKFNMT1QpLCBhcmcpOyBcCi0JCWlmIChlcnIpIFwKLQkJCXJldHVybiBlcnI7IFwKLQl9Ci0KLQlWSVNJVCh0eXBlLT50cF9kaWN0KTsKLQlWSVNJVCh0eXBlLT50cF9jYWNoZSk7Ci0JVklTSVQodHlwZS0+dHBfbXJvKTsKLQlWSVNJVCh0eXBlLT50cF9iYXNlcyk7Ci0JVklTSVQodHlwZS0+dHBfYmFzZSk7CisJUHlfVklTSVQodHlwZS0+dHBfZGljdCk7CisJUHlfVklTSVQodHlwZS0+dHBfY2FjaGUpOworCVB5X1ZJU0lUKHR5cGUtPnRwX21ybyk7CisJUHlfVklTSVQodHlwZS0+dHBfYmFzZXMpOworCVB5X1ZJU0lUKHR5cGUtPnRwX2Jhc2UpOwogCiAJLyogVGhlcmUncyBubyBuZWVkIHRvIHZpc2l0IHR5cGUtPnRwX3N1YmNsYXNzZXMgb3IKIAkgICAoKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlKS0+aHRfc2xvdHMsIGJlY2F1c2UgdGhleSBjYW4ndCBiZSBpbnZvbHZlZAogCSAgIGluIGN5Y2xlczsgdHBfc3ViY2xhc3NlcyBpcyBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzLAogCSAgIGFuZCBzbG90cyBpcyBhIHR1cGxlIG9mIHN0cmluZ3MuICovCiAKLSN1bmRlZiBWSVNJVAotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfY2xlYXIoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5T2JqZWN0ICp0bXA7Ci0KIAkvKiBCZWNhdXNlIG9mIHR5cGVfaXNfZ2MoKSwgdGhlIGNvbGxlY3RvciBvbmx5IGNhbGxzIHRoaXMKIAkgICBmb3IgaGVhcHR5cGVzLiAqLwogCWFzc2VydCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpOwogCi0jZGVmaW5lIENMRUFSKFNMT1QpIFwKLQlpZiAoU0xPVCkgeyBcCi0JCXRtcCA9IChQeU9iamVjdCAqKShTTE9UKTsgXAotCQlTTE9UID0gTlVMTDsgXAotCQlQeV9ERUNSRUYodG1wKTsgXAotCX0KLQogCS8qIFRoZSBvbmx5IGZpZWxkIHdlIG5lZWQgdG8gY2xlYXIgaXMgdHBfbXJvLCB3aGljaCBpcyBwYXJ0IG9mIGEKIAkgICBoYXJkIGN5Y2xlIChpdHMgZmlyc3QgZWxlbWVudCBpcyB0aGUgY2xhc3MgaXRzZWxmKSB0aGF0IHdvbid0CiAJICAgYmUgYnJva2VuIG90aGVyd2lzZSAoaXQncyBhIHR1cGxlIGFuZCB0dXBsZXMgZG9uJ3QgaGF2ZSBhCkBAIC0yMjY1LDkgKzIyNDIsNyBAQAogCSAgICAgICBBIHR1cGxlIG9mIHN0cmluZ3MgY2FuJ3QgYmUgcGFydCBvZiBhIGN5Y2xlLgogCSovCiAKLQlDTEVBUih0eXBlLT50cF9tcm8pOwotCi0jdW5kZWYgQ0xFQVIKKwlQeV9DTEVBUih0eXBlLT50cF9tcm8pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNDQzLDIzICsyNDE4LDIzIEBACiB9CiAKIHN0YXRpYyBpbnQKLWNvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQoUHlUeXBlT2JqZWN0KiBvbGQsIFB5VHlwZU9iamVjdCogbmV3LCBjaGFyKiBhdHRyKQorY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QqIG9sZHRvLCBQeVR5cGVPYmplY3QqIG5ld3RvLCBjaGFyKiBhdHRyKQogewogCVB5VHlwZU9iamVjdCAqbmV3YmFzZSwgKm9sZGJhc2U7CiAKLQlpZiAobmV3LT50cF9kZWFsbG9jICE9IG9sZC0+dHBfZGVhbGxvYyB8fAotCSAgICBuZXctPnRwX2ZyZWUgIT0gb2xkLT50cF9mcmVlKQorCWlmIChuZXd0by0+dHBfZGVhbGxvYyAhPSBvbGR0by0+dHBfZGVhbGxvYyB8fAorCSAgICBuZXd0by0+dHBfZnJlZSAhPSBvbGR0by0+dHBfZnJlZSkKIAl7CiAJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCiAJCQkgICAgICIlcyBhc3NpZ25tZW50OiAiCiAJCQkgICAgICInJXMnIGRlYWxsb2NhdG9yIGRpZmZlcnMgZnJvbSAnJXMnIiwKIAkJCSAgICAgYXR0ciwKLQkJCSAgICAgbmV3LT50cF9uYW1lLAotCQkJICAgICBvbGQtPnRwX25hbWUpOworCQkJICAgICBuZXd0by0+dHBfbmFtZSwKKwkJCSAgICAgb2xkdG8tPnRwX25hbWUpOwogCQlyZXR1cm4gMDsKIAl9Ci0JbmV3YmFzZSA9IG5ldzsKLQlvbGRiYXNlID0gb2xkOworCW5ld2Jhc2UgPSBuZXd0bzsKKwlvbGRiYXNlID0gb2xkdG87CiAJd2hpbGUgKGVxdWl2X3N0cnVjdHMobmV3YmFzZSwgbmV3YmFzZS0+dHBfYmFzZSkpCiAJCW5ld2Jhc2UgPSBuZXdiYXNlLT50cF9iYXNlOwogCXdoaWxlIChlcXVpdl9zdHJ1Y3RzKG9sZGJhc2UsIG9sZGJhc2UtPnRwX2Jhc2UpKQpAQCAtMjQ3MSw4ICsyNDQ2LDggQEAKIAkJCSAgICAgIiVzIGFzc2lnbm1lbnQ6ICIKIAkJCSAgICAgIiclcycgb2JqZWN0IGxheW91dCBkaWZmZXJzIGZyb20gJyVzJyIsCiAJCQkgICAgIGF0dHIsCi0JCQkgICAgIG5ldy0+dHBfbmFtZSwKLQkJCSAgICAgb2xkLT50cF9uYW1lKTsKKwkJCSAgICAgbmV3dG8tPnRwX25hbWUsCisJCQkgICAgIG9sZHRvLT50cF9uYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yNDgyLDggKzI0NTcsOCBAQAogc3RhdGljIGludAogb2JqZWN0X3NldF9jbGFzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjbG9zdXJlKQogewotCVB5VHlwZU9iamVjdCAqb2xkID0gc2VsZi0+b2JfdHlwZTsKLQlQeVR5cGVPYmplY3QgKm5ldzsKKwlQeVR5cGVPYmplY3QgKm9sZHRvID0gc2VsZi0+b2JfdHlwZTsKKwlQeVR5cGVPYmplY3QgKm5ld3RvOwogCiAJaWYgKHZhbHVlID09IE5VTEwpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKQEAgLTI0OTYsMTggKzI0NzEsMTggQEAKIAkJICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCXJldHVybiAtMTsKIAl9Ci0JbmV3ID0gKFB5VHlwZU9iamVjdCAqKXZhbHVlOwotCWlmICghKG5ldy0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSB8fAotCSAgICAhKG9sZC0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKKwluZXd0byA9IChQeVR5cGVPYmplY3QgKil2YWx1ZTsKKwlpZiAoIShuZXd0by0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSB8fAorCSAgICAhKG9sZHRvLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQogCXsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKIAkJCSAgICAgIl9fY2xhc3NfXyBhc3NpZ25tZW50OiBvbmx5IGZvciBoZWFwIHR5cGVzIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKGNvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQobmV3LCBvbGQsICJfX2NsYXNzX18iKSkgewotCQlQeV9JTkNSRUYobmV3KTsKLQkJc2VsZi0+b2JfdHlwZSA9IG5ldzsKLQkJUHlfREVDUkVGKG9sZCk7CisJaWYgKGNvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQobmV3dG8sIG9sZHRvLCAiX19jbGFzc19fIikpIHsKKwkJUHlfSU5DUkVGKG5ld3RvKTsKKwkJc2VsZi0+b2JfdHlwZSA9IG5ld3RvOworCQlQeV9ERUNSRUYob2xkdG8pOwogCQlyZXR1cm4gMDsKIAl9CiAJZWxzZSB7CkBAIC0yNzg1LDcgKzI3NjAsNyBAQAogCSJvYmplY3QiLAkJCQkvKiB0cF9uYW1lICovCiAJc2l6ZW9mKFB5T2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KIAkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkoZGVzdHJ1Y3RvcilvYmplY3RfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KKwlvYmplY3RfZGVhbGxvYywJCQkJLyogdHBfZGVhbGxvYyAqLwogCTAsCQkJCQkvKiB0cF9wcmludCAqLwogCTAsCQkJIAkJLyogdHBfZ2V0YXR0ciAqLwogCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCkBAIC0zMzI2LDcgKzMzMDEsNyBAQAogewogCVB5X3NzaXplX3QgaTsKIAlpbnQgcmVzdWx0OwotCVB5T2JqZWN0ICpsaXN0LCAqcmVmLCAqbmV3OworCVB5T2JqZWN0ICpsaXN0LCAqcmVmLCAqbmV3b2JqOwogCiAJbGlzdCA9IGJhc2UtPnRwX3N1YmNsYXNzZXM7CiAJaWYgKGxpc3QgPT0gTlVMTCkgewpAQCAtMzMzNSwxNiArMzMxMCwxNiBAQAogCQkJcmV0dXJuIC0xOwogCX0KIAlhc3NlcnQoUHlMaXN0X0NoZWNrKGxpc3QpKTsKLQluZXcgPSBQeVdlYWtyZWZfTmV3UmVmKChQeU9iamVjdCAqKXR5cGUsIE5VTEwpOworCW5ld29iaiA9IFB5V2Vha3JlZl9OZXdSZWYoKFB5T2JqZWN0ICopdHlwZSwgTlVMTCk7CiAJaSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKIAl3aGlsZSAoLS1pID49IDApIHsKIAkJcmVmID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwogCQlhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOwogCQlpZiAoUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKSA9PSBQeV9Ob25lKQotCQkJcmV0dXJuIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIG5ldyk7CisJCQlyZXR1cm4gUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgbmV3b2JqKTsKIAl9Ci0JcmVzdWx0ID0gUHlMaXN0X0FwcGVuZChsaXN0LCBuZXcpOwotCVB5X0RFQ1JFRihuZXcpOworCXJlc3VsdCA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbmV3b2JqKTsKKwlQeV9ERUNSRUYobmV3b2JqKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0zNTM2LDEyICszNTExLDE2IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi13cmFwX3NzaXplYXJnZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCit3cmFwX2luZGV4YXJnZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7CiAJc3NpemVhcmdmdW5jIGZ1bmMgPSAoc3NpemVhcmdmdW5jKXdyYXBwZWQ7CisJUHlPYmplY3QqIG87CiAJUHlfc3NpemVfdCBpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuIiwgJmkpKQorCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDEsICZvKSkKKwkJcmV0dXJuIE5VTEw7CisJaSA9IFB5TnVtYmVyX0luZGV4KG8pOworCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiAoKmZ1bmMpKHNlbGYsIGkpOwogfQpAQCAtMzU1MSw3ICszNTMwLDcgQEAKIHsKIAlQeV9zc2l6ZV90IGk7CiAKLQlpID0gUHlJbnRfQXNTc2l6ZV90KGFyZyk7CisJaSA9IFB5TnVtYmVyX0luZGV4KGFyZyk7CiAJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKIAkJcmV0dXJuIC0xOwogCWlmIChpIDwgMCkgewpAQCAtNDM1OSwzNiArNDMzOCwyMSBAQAogc3RhdGljIFB5X3NzaXplX3QgCiBzbG90X25iX2luZGV4KFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jLCAqYXJnczsKIAlzdGF0aWMgUHlPYmplY3QgKmluZGV4X3N0cjsKLQlQeV9zc2l6ZV90IHJlc3VsdCA9IC0xOworCVB5T2JqZWN0ICp0ZW1wID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9faW5kZXhfXyIsICZpbmRleF9zdHIsICIoKSIpOworCVB5X3NzaXplX3QgcmVzdWx0OwogCi0JZnVuYyA9IGxvb2t1cF9tYXliZShzZWxmLCAiX19pbmRleF9fIiwgJmluZGV4X3N0cik7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotCQkJCSJvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4Iik7Ci0JCX0KKwlpZiAodGVtcCA9PSBOVUxMKQogCQlyZXR1cm4gLTE7Ci0gCX0KLQlhcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0JaWYgKGFyZ3MgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqdGVtcCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQkJaWYgKHRlbXAgIT0gTlVMTCkgewotCQkJaWYgKFB5SW50X0NoZWNrKHRlbXApIHx8IFB5TG9uZ19DaGVjayh0ZW1wKSkgewotCQkJCXJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbmRleCh0ZW1wKTsKLQkJCX0KLQkJCWVsc2UgewotIAkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkgICAgIl9faW5kZXhfXyBtdXN0IHJldHVybiBhbiBpbnQgb3IgYSBsb25nIik7Ci0JCQkJcmVzdWx0ID0gLTE7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYodGVtcCk7Ci0JCX0KKwlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh0ZW1wKSB8fCBQeUxvbmdfQ2hlY2tFeGFjdCh0ZW1wKSkgeworCQlyZXN1bHQgPSB0ZW1wLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2luZGV4KHRlbXApOwogCX0KLQlQeV9ERUNSRUYoZnVuYyk7CisJZWxzZSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAorCQkJCSJfX2luZGV4X18gbXVzdCByZXR1cm4gYW4gaW50IG9yIGEgbG9uZyIpOworCQlyZXN1bHQgPSAtMTsKKwl9CisJUHlfREVDUkVGKHRlbXApOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTUwMTgsOSArNDk4Miw5IEBACiAJICAgdGVzdF9kZXNjci5ub3RpbXBsZW1lbnRlZCgpICovCiAJU1FTTE9UKCJfX2FkZF9fIiwgc3FfY29uY2F0LCBOVUxMLCB3cmFwX2JpbmFyeWZ1bmMsCiAgICAgICAgICAgInguX19hZGRfXyh5KSA8PT0+IHgreSIpLAotCVNRU0xPVCgiX19tdWxfXyIsIHNxX3JlcGVhdCwgTlVMTCwgd3JhcF9zc2l6ZWFyZ2Z1bmMsCisJU1FTTE9UKCJfX211bF9fIiwgc3FfcmVwZWF0LCBOVUxMLCB3cmFwX2luZGV4YXJnZnVuYywKICAgICAgICAgICAieC5fX211bF9fKG4pIDw9PT4geCpuIiksCi0JU1FTTE9UKCJfX3JtdWxfXyIsIHNxX3JlcGVhdCwgTlVMTCwgd3JhcF9zc2l6ZWFyZ2Z1bmMsCisJU1FTTE9UKCJfX3JtdWxfXyIsIHNxX3JlcGVhdCwgTlVMTCwgd3JhcF9pbmRleGFyZ2Z1bmMsCiAgICAgICAgICAgInguX19ybXVsX18obikgPD09PiBuKngiKSwKIAlTUVNMT1QoIl9fZ2V0aXRlbV9fIiwgc3FfaXRlbSwgc2xvdF9zcV9pdGVtLCB3cmFwX3NxX2l0ZW0sCiAJICAgICAgICJ4Ll9fZ2V0aXRlbV9fKHkpIDw9PT4geFt5XSIpLApAQCAtNTA0Niw3ICs1MDEwLDcgQEAKIAlTUVNMT1QoIl9faWFkZF9fIiwgc3FfaW5wbGFjZV9jb25jYXQsIE5VTEwsCiAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAieC5fX2lhZGRfXyh5KSA8PT0+IHgrPXkiKSwKIAlTUVNMT1QoIl9faW11bF9fIiwgc3FfaW5wbGFjZV9yZXBlYXQsIE5VTEwsCi0gICAgICAgICAgd3JhcF9zc2l6ZWFyZ2Z1bmMsICJ4Ll9faW11bF9fKHkpIDw9PT4geCo9eSIpLAorICAgICAgICAgIHdyYXBfaW5kZXhhcmdmdW5jLCAieC5fX2ltdWxfXyh5KSA8PT0+IHgqPXkiKSwKIAogCU1QU0xPVCgiX19sZW5fXyIsIG1wX2xlbmd0aCwgc2xvdF9tcF9sZW5ndGgsIHdyYXBfbGVuZnVuYywKIAkgICAgICAgInguX19sZW5fXygpIDw9PT4gbGVuKHgpIiksCkBAIC01MjExLDIxICs1MTc1LDIxIEBACiAKIAkvKiBOb3RlOiB0aGlzIGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIHRoZSBtZW1iZXJzIG9mIFB5SGVhcFR5cGVPYmplY3QhICovCiAJYXNzZXJ0KG9mZnNldCA+PSAwKTsKLQlhc3NlcnQob2Zmc2V0IDwgb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfYnVmZmVyKSk7Ci0JaWYgKG9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19zZXF1ZW5jZSkpIHsKLQkJcHRyID0gKHZvaWQgKil0eXBlLT50cF9hc19zZXF1ZW5jZTsKKwlhc3NlcnQoKHNpemVfdClvZmZzZXQgPCBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19idWZmZXIpKTsKKwlpZiAoKHNpemVfdClvZmZzZXQgPj0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfc2VxdWVuY2UpKSB7CisJCXB0ciA9IChjaGFyICopdHlwZS0+dHBfYXNfc2VxdWVuY2U7CiAJCW9mZnNldCAtPSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19zZXF1ZW5jZSk7CiAJfQotCWVsc2UgaWYgKG9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19tYXBwaW5nKSkgewotCQlwdHIgPSAodm9pZCAqKXR5cGUtPnRwX2FzX21hcHBpbmc7CisJZWxzZSBpZiAoKHNpemVfdClvZmZzZXQgPj0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbWFwcGluZykpIHsKKwkJcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19tYXBwaW5nOwogCQlvZmZzZXQgLT0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbWFwcGluZyk7CiAJfQotCWVsc2UgaWYgKG9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19udW1iZXIpKSB7Ci0JCXB0ciA9ICh2b2lkICopdHlwZS0+dHBfYXNfbnVtYmVyOworCWVsc2UgaWYgKChzaXplX3Qpb2Zmc2V0ID49IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX251bWJlcikpIHsKKwkJcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19udW1iZXI7CiAJCW9mZnNldCAtPSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19udW1iZXIpOwogCX0KIAllbHNlIHsKLQkJcHRyID0gKHZvaWQgKil0eXBlOworCQlwdHIgPSAoY2hhciAqKXR5cGU7CiAJfQogCWlmIChwdHIgIT0gTlVMTCkKIAkJcHRyICs9IG9mZnNldDsKQEAgLTU3NDMsNyArNTcwNyw3IEBACiBzdXBlcl9kZXNjcl9nZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewogCXN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7Ci0Jc3VwZXJvYmplY3QgKm5ldzsKKwlzdXBlcm9iamVjdCAqbmV3b2JqOwogCiAJaWYgKG9iaiA9PSBOVUxMIHx8IG9iaiA9PSBQeV9Ob25lIHx8IHN1LT5vYmogIT0gTlVMTCkgewogCQkvKiBOb3QgYmluZGluZyB0byBhbiBvYmplY3QsIG9yIGFscmVhZHkgYm91bmQgKi8KQEAgLTU3NjAsMTYgKzU3MjQsMTYgQEAKIAkJUHlUeXBlT2JqZWN0ICpvYmpfdHlwZSA9IHN1cGVyY2hlY2soc3UtPnR5cGUsIG9iaik7CiAJCWlmIChvYmpfdHlwZSA9PSBOVUxMKQogCQkJcmV0dXJuIE5VTEw7Ci0JCW5ldyA9IChzdXBlcm9iamVjdCAqKVB5U3VwZXJfVHlwZS50cF9uZXcoJlB5U3VwZXJfVHlwZSwKKwkJbmV3b2JqID0gKHN1cGVyb2JqZWN0ICopUHlTdXBlcl9UeXBlLnRwX25ldygmUHlTdXBlcl9UeXBlLAogCQkJCQkJCSBOVUxMLCBOVUxMKTsKLQkJaWYgKG5ldyA9PSBOVUxMKQorCQlpZiAobmV3b2JqID09IE5VTEwpCiAJCQlyZXR1cm4gTlVMTDsKIAkJUHlfSU5DUkVGKHN1LT50eXBlKTsKIAkJUHlfSU5DUkVGKG9iaik7Ci0JCW5ldy0+dHlwZSA9IHN1LT50eXBlOwotCQluZXctPm9iaiA9IG9iajsKLQkJbmV3LT5vYmpfdHlwZSA9IG9ial90eXBlOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3OworCQluZXdvYmotPnR5cGUgPSBzdS0+dHlwZTsKKwkJbmV3b2JqLT5vYmogPSBvYmo7CisJCW5ld29iai0+b2JqX3R5cGUgPSBvYmpfdHlwZTsKKwkJcmV0dXJuIChQeU9iamVjdCAqKW5ld29iajsKIAl9CiB9CiAKQEAgLTU4MTEsMjAgKzU3NzUsMTAgQEAKIHN1cGVyX3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKIAlzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOwotCWludCBlcnI7CiAKLSNkZWZpbmUgVklTSVQoU0xPVCkgXAotCWlmIChTTE9UKSB7IFwKLQkJZXJyID0gdmlzaXQoKFB5T2JqZWN0ICopKFNMT1QpLCBhcmcpOyBcCi0JCWlmIChlcnIpIFwKLQkJCXJldHVybiBlcnI7IFwKLQl9Ci0KLQlWSVNJVChzdS0+b2JqKTsKLQlWSVNJVChzdS0+dHlwZSk7Ci0JVklTSVQoc3UtPm9ial90eXBlKTsKLQotI3VuZGVmIFZJU0lUCisJUHlfVklTSVQoc3UtPm9iaik7CisJUHlfVklTSVQoc3UtPnR5cGUpOworCVB5X1ZJU0lUKHN1LT5vYmpfdHlwZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvdW5pY29kZW9iamVjdC5jIGIvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKaW5kZXggN2ZiY2UxNC4uZTYyYzc3NCAxMDA2NDQKLS0tIGEvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKQEAgLTM2LDYgKzM2LDcgQEAKIAogKi8KIAorI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKICNpbmNsdWRlICJ1bmljb2Rlb2JqZWN0LmgiCkBAIC04Myw2ICs4NCwxMSBAQAogCiAqLwogCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwogLyogRnJlZSBsaXN0IGZvciBVbmljb2RlIG9iamVjdHMgKi8KIHN0YXRpYyBQeVVuaWNvZGVPYmplY3QgKnVuaWNvZGVfZnJlZWxpc3Q7CiBzdGF0aWMgaW50IHVuaWNvZGVfZnJlZWxpc3Rfc2l6ZTsKQEAgLTEzMCwxNCArMTM2LDkgQEAKICAgICAvKiBSZXNpemluZyBzaGFyZWQgb2JqZWN0ICh1bmljb2RlX2VtcHR5IG9yIHNpbmdsZSBjaGFyYWN0ZXIKICAgICAgICBvYmplY3RzKSBpbi1wbGFjZSBpcyBub3QgYWxsb3dlZC4gVXNlIFB5VW5pY29kZV9SZXNpemUoKQogICAgICAgIGluc3RlYWQgISAqLwotICAgIGlmICh1bmljb2RlID09IHVuaWNvZGVfZW1wdHkgfHwKLQkodW5pY29kZS0+bGVuZ3RoID09IDEgJiYKLSAgICAgICAgIC8qIE12TCBzYWlkIHVuaWNvZGUtPnN0cltdIG1heSBiZSBzaWduZWQuICBQeXRob24gZ2VuZXJhbGx5IGFzc3VtZXMKLSAgICAgICAgICAqIGFuIGludCBjb250YWlucyBhdCBsZWFzdCAzMiBiaXRzLCBhbmQgd2UgZG9uJ3QgdXNlIG1vcmUgdGhhbgotICAgICAgICAgICogMzIgYml0cyBldmVuIGluIGEgVUNTNCBidWlsZCwgc28gY2FzdGluZyB0byB1bnNpZ25lZCBpbnQgc2hvdWxkCi0gICAgICAgICAgKiBiZSBjb3JyZWN0LgotICAgICAgICAgICovCi0JICh1bnNpZ25lZCBpbnQpdW5pY29kZS0+c3RyWzBdIDwgMjU2VSAmJgorICAgIGlmICh1bmljb2RlID09IHVuaWNvZGVfZW1wdHkgfHwgCisJKHVuaWNvZGUtPmxlbmd0aCA9PSAxICYmIAorCSB1bmljb2RlLT5zdHJbMF0gPCAyNTZVICYmCiAJIHVuaWNvZGVfbGF0aW4xW3VuaWNvZGUtPnN0clswXV0gPT0gdW5pY29kZSkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHJlc2l6ZSBzaGFyZWQgdW5pY29kZSBvYmplY3RzIik7CkBAIC0xNDksMTMgKzE1MCwxMiBAQAogICAgIG9sZHN0ciA9IHVuaWNvZGUtPnN0cjsKICAgICBQeU1lbV9SRVNJWkUodW5pY29kZS0+c3RyLCBQeV9VTklDT0RFLCBsZW5ndGggKyAxKTsKICAgICBpZiAoIXVuaWNvZGUtPnN0cikgewotCXVuaWNvZGUtPnN0ciA9IG9sZHN0cjsKKwl1bmljb2RlLT5zdHIgPSAoUHlfVU5JQ09ERSAqKW9sZHN0cjsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICB1bmljb2RlLT5zdHJbbGVuZ3RoXSA9IDA7Ci0JYXNzZXJ0KGxlbmd0aCA8IElOVF9NQVgpOwotICAgIHVuaWNvZGUtPmxlbmd0aCA9IChpbnQpbGVuZ3RoOworICAgIHVuaWNvZGUtPmxlbmd0aCA9IGxlbmd0aDsKIAogIHJlc2V0OgogICAgIC8qIFJlc2V0IHRoZSBvYmplY3QgY2FjaGVzICovCkBAIC0yMjYsOCArMjI2LDcgQEAKICAgICAgKi8KICAgICB1bmljb2RlLT5zdHJbMF0gPSAwOwogICAgIHVuaWNvZGUtPnN0cltsZW5ndGhdID0gMDsKLQlhc3NlcnQobGVuZ3RoPElOVF9NQVgpOwotICAgIHVuaWNvZGUtPmxlbmd0aCA9IChpbnQpbGVuZ3RoOworICAgIHVuaWNvZGUtPmxlbmd0aCA9IGxlbmd0aDsKICAgICB1bmljb2RlLT5oYXNoID0gLTE7CiAgICAgdW5pY29kZS0+ZGVmZW5jID0gTlVMTDsKICAgICByZXR1cm4gdW5pY29kZTsKQEAgLTM2OCw3ICszNjcsNyBAQAogI2Vsc2UKICAgICB7CiAJcmVnaXN0ZXIgUHlfVU5JQ09ERSAqdTsKLQlyZWdpc3RlciBpbnQgaTsKKwlyZWdpc3RlciBQeV9zc2l6ZV90IGk7CiAJdSA9IFB5VW5pY29kZV9BU19VTklDT0RFKHVuaWNvZGUpOwogCWZvciAoaSA9IHNpemU7IGkgPiAwOyBpLS0pCiAJICAgICp1KysgPSAqdysrOwpAQCAtMzk2LDcgKzM5NSw3IEBACiAjZWxzZQogICAgIHsKIAlyZWdpc3RlciBQeV9VTklDT0RFICp1OwotCXJlZ2lzdGVyIGludCBpOworCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKIAl1ID0gUHlVbmljb2RlX0FTX1VOSUNPREUodW5pY29kZSk7CiAJZm9yIChpID0gc2l6ZTsgaSA+IDA7IGktLSkKIAkgICAgKncrKyA9ICp1Kys7CkBAIC0xMzU4LDcgKzEzNTcsNyBAQAogICAgIFB5T2JqZWN0ICp2OyAgICAgICAgLyogcmVzdWx0IHN0cmluZyBvYmplY3QgKi8KICAgICBjaGFyICpwOyAgICAgICAgICAgIC8qIG5leHQgZnJlZSBieXRlIGluIG91dHB1dCBidWZmZXIgKi8KICAgICBQeV9zc2l6ZV90IG5hbGxvY2F0ZWQ7ICAvKiBudW1iZXIgb2YgcmVzdWx0IGJ5dGVzIGFsbG9jYXRlZCAqLwotICAgIGludCBubmVlZGVkOyAgICAgICAgLyogbnVtYmVyIG9mIHJlc3VsdCBieXRlcyBuZWVkZWQgKi8KKyAgICBQeV9zc2l6ZV90IG5uZWVkZWQ7ICAgICAgICAvKiBudW1iZXIgb2YgcmVzdWx0IGJ5dGVzIG5lZWRlZCAqLwogICAgIGNoYXIgc3RhY2tidWZbTUFYX1NIT1JUX1VOSUNIQVJTICogNF07CiAKICAgICBhc3NlcnQocyAhPSBOVUxMKTsKQEAgLTE0MjcsMTMgKzE0MjYsMTMgQEAKIAogICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgLyogVGhpcyB3YXMgc3RhY2sgYWxsb2NhdGVkLiAqLwotICAgICAgICBubmVlZGVkID0gUHlfU0FGRV9ET1dOQ0FTVChwIC0gc3RhY2tidWYsIGxvbmcsIGludCk7CisgICAgICAgIG5uZWVkZWQgPSBwIC0gc3RhY2tidWY7CiAgICAgICAgIGFzc2VydChubmVlZGVkIDw9IG5hbGxvY2F0ZWQpOwogICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RhY2tidWYsIG5uZWVkZWQpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAJLyogQ3V0IGJhY2sgdG8gc2l6ZSBhY3R1YWxseSBuZWVkZWQuICovCi0gICAgICAgIG5uZWVkZWQgPSBQeV9TQUZFX0RPV05DQVNUKHAgLSBQeVN0cmluZ19BU19TVFJJTkcodiksIGxvbmcsIGludCk7CisgICAgICAgIG5uZWVkZWQgPSBwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpOwogICAgICAgICBhc3NlcnQobm5lZWRlZCA8PSBuYWxsb2NhdGVkKTsKICAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgbm5lZWRlZCk7CiAgICAgfQpAQCAtMTg4NCw3ICsxODgzLDcgQEAKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobSk7CiAgICAgICAgICAgICAgICAgaWYgKGFwaSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIHVjbmhhc2hFcnJvcjsKLSAgICAgICAgICAgICAgICB1Y25oYXNoX0NBUEkgPSBQeUNPYmplY3RfQXNWb2lkUHRyKGFwaSk7CisgICAgICAgICAgICAgICAgdWNuaGFzaF9DQVBJID0gKF9QeVVuaWNvZGVfTmFtZV9DQVBJICopUHlDT2JqZWN0X0FzVm9pZFB0cihhcGkpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcGkpOwogICAgICAgICAgICAgICAgIGlmICh1Y25oYXNoX0NBUEkgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byB1Y25oYXNoRXJyb3I7CkBAIC0xOTM0LDcgKzE5MzMsNyBAQAogICAgICAgICBuZXh0Qnl0ZToKICAgICAgICAgOwogICAgIH0KLSAgICBpZiAoX1B5VW5pY29kZV9SZXNpemUoJnYsIChpbnQpKHAgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSkpIDwgMCkKKyAgICBpZiAoX1B5VW5pY29kZV9SZXNpemUoJnYsIHAgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSkgPCAwKQogICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOwogICAgIFB5X1hERUNSRUYoZXhjKTsKQEAgLTIwMDMsNyArMjAwMiw3IEBACiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgICAgIC8qIE1hcCAyMS1iaXQgY2hhcmFjdGVycyB0byAnXFUwMHh4eHh4eCcgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPj0gMHgxMDAwMCkgewotCSAgICBpbnQgb2Zmc2V0ID0gcCAtIFB5U3RyaW5nX0FTX1NUUklORyhyZXByKTsKKwkgICAgUHlfc3NpemVfdCBvZmZzZXQgPSBwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlcHIpOwogCiAJICAgIC8qIFJlc2l6ZSB0aGUgc3RyaW5nIGlmIG5lY2Vzc2FyeSAqLwogCSAgICBpZiAob2Zmc2V0ICsgMTIgPiBQeVN0cmluZ19HRVRfU0laRShyZXByKSkgewpAQCAtMjIwNSw3ICsyMjA0LDcgQEAKIAluZXh0Qnl0ZToKIAk7CiAgICAgfQotICAgIGlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmdiwgKGludCkocCAtIFB5VW5pY29kZV9BU19VTklDT0RFKHYpKSkgPCAwKQorICAgIGlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmdiwgcCAtIFB5VW5pY29kZV9BU19VTklDT0RFKHYpKSA8IDApCiAJZ290byBvbkVycm9yOwogICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CkBAIC0yMzQ4LDcgKzIzNDcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZ2LCAoaW50KShwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodikpKSA8IDApCisgICAgaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZ2LCBwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodikpIDwgMCkKICAgICAgICAgZ290byBvbkVycm9yOwogICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CkBAIC0yNDk5LDggKzI0OTgsOCBAQAogICAgIC8qIGN1cnJlbnQgb3V0cHV0IHBvc2l0aW9uICovCiAgICAgUHlfc3NpemVfdCByZXNwb3MgPSAwOwogICAgIFB5X3NzaXplX3QgcmVzc2l6ZTsKLSAgICBjaGFyICplbmNvZGluZyA9IChsaW1pdCA9PSAyNTYpID8gImxhdGluLTEiIDogImFzY2lpIjsKLSAgICBjaGFyICpyZWFzb24gPSAobGltaXQgPT0gMjU2KSA/ICJvcmRpbmFsIG5vdCBpbiByYW5nZSgyNTYpIiA6ICJvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpIjsKKyAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IChsaW1pdCA9PSAyNTYpID8gImxhdGluLTEiIDogImFzY2lpIjsKKyAgICBjb25zdCBjaGFyICpyZWFzb24gPSAobGltaXQgPT0gMjU2KSA/ICJvcmRpbmFsIG5vdCBpbiByYW5nZSgyNTYpIiA6ICJvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpIjsKICAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKICAgICAvKiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGNhY2hpbmcgc3RyaW5nIGNvbXBhcmlzb25zCkBAIC0yNzIzLDcgKzI3MjIsNyBAQAogCX0KICAgICB9CiAgICAgaWYgKHAgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSA8IFB5U3RyaW5nX0dFVF9TSVpFKHYpKQotCWlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmdiwgKGludCkocCAtIFB5VW5pY29kZV9BU19VTklDT0RFKHYpKSkgPCAwKQorCWlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmdiwgcCAtIFB5VW5pY29kZV9BU19VTklDT0RFKHYpKSA8IDApCiAJICAgIGdvdG8gb25FcnJvcjsKICAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CiAgICAgUHlfWERFQ1JFRihleGMpOwpAQCAtMjk4Miw3ICsyOTgxLDcgQEAKIAl9CiAgICAgfQogICAgIGlmIChwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodikgPCBQeVVuaWNvZGVfR0VUX1NJWkUodikpCi0JaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZ2LCAoaW50KShwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodikpKSA8IDApCisJaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZ2LCBwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodikpIDwgMCkKIAkgICAgZ290byBvbkVycm9yOwogICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CkBAIC0zMzM2LDkgKzMzMzUsOSBAQAogICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgZW5kcG9zLAogICAgIFB5X3NzaXplX3QgKm5ld3BvcykKIHsKLSAgICBzdGF0aWMgY2hhciAqYXJncGFyc2UgPSAiTyFpO3RyYW5zbGF0aW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHVuaWNvZGUsIGludCkgdHVwbGUiOworICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPIW47dHJhbnNsYXRpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAodW5pY29kZSwgaW50KSB0dXBsZSI7CiAKLSAgICBpbnQgaV9uZXdwb3M7CisgICAgUHlfc3NpemVfdCBpX25ld3BvczsKICAgICBQeU9iamVjdCAqcmVzdHVwbGU7CiAgICAgUHlPYmplY3QgKnJlc3VuaWNvZGU7CiAKQEAgLTM3OTgsNyArMzc5Nyw3IEBACiAJCSBQeV9zc2l6ZV90IGVuZCwKIAkJIFB5VW5pY29kZU9iamVjdCAqc3Vic3RyaW5nKQogewotICAgIGludCBjb3VudCA9IDA7CisgICAgUHlfc3NpemVfdCBjb3VudCA9IDA7CiAKICAgICBpZiAoc3RhcnQgPCAwKQogICAgICAgICBzdGFydCArPSBzZWxmLT5sZW5ndGg7CkBAIC00MTU3LDcgKzQxNTYsNyBAQAogICAgIFB5T2JqZWN0ICpmc2VxOyAgICAgICAgICAvKiBQeVNlcXVlbmNlX0Zhc3Qoc2VxKSAqLwogICAgIFB5X3NzaXplX3Qgc2VxbGVuOyAgICAgICAgICAgICAgLyogbGVuKGZzZXEpIC0tIG51bWJlciBvZiBpdGVtcyBpbiBzZXF1ZW5jZSAqLwogICAgIFB5T2JqZWN0ICppdGVtOwotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKIAogICAgIGZzZXEgPSBQeVNlcXVlbmNlX0Zhc3Qoc2VxLCAiIik7CiAgICAgaWYgKGZzZXEgPT0gTlVMTCkgewpAQCAtNDIwNiw3ICs0MjA1LDcgQEAKICAgICB9CiAKICAgICAvKiBHZXQgc3BhY2UuICovCi0gICAgcmVzID0gX1B5VW5pY29kZV9OZXcoKGludClyZXNfYWxsb2MpOworICAgIHJlcyA9IF9QeVVuaWNvZGVfTmV3KHJlc19hbGxvYyk7CiAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgcmVzX3AgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpOwpAQCAtNDIyMCw3ICs0MjE5LDcgQEAKIAkvKiBDb252ZXJ0IGl0ZW0gdG8gVW5pY29kZS4gKi8KIAlpZiAoISBQeVVuaWNvZGVfQ2hlY2soaXRlbSkgJiYgISBQeVN0cmluZ19DaGVjayhpdGVtKSkgewogCSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICJzZXF1ZW5jZSBpdGVtICVpOiBleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSwiCisJCQkgInNlcXVlbmNlIGl0ZW0gJXpkOiBleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSwiCiAJCQkgIiAlLjgwcyBmb3VuZCIsCiAJCQkgaSwgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJICAgIGdvdG8gb25FcnJvcjsKQEAgLTQyMzYsMTEgKzQyMzUsMTEgQEAKICAgICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgc2VwYXJhdG9yIGFuZCB0aGUgaXRlbS4gKi8KIAlpdGVtbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKGl0ZW0pOwogCW5ld19yZXNfdXNlZCA9IHJlc191c2VkICsgaXRlbWxlbjsKLQlpZiAobmV3X3Jlc191c2VkIDwgcmVzX3VzZWQgfHwgIG5ld19yZXNfdXNlZCA+IElOVF9NQVgpCisJaWYgKG5ld19yZXNfdXNlZCA8IHJlc191c2VkIHx8ICBuZXdfcmVzX3VzZWQgPiBQWV9TU0laRV9UX01BWCkKIAkgICAgZ290byBPdmVyZmxvdzsKIAlpZiAoaSA8IHNlcWxlbiAtIDEpIHsKIAkgICAgbmV3X3Jlc191c2VkICs9IHNlcGxlbjsKLQkgICAgaWYgKG5ld19yZXNfdXNlZCA8IHJlc191c2VkIHx8ICBuZXdfcmVzX3VzZWQgPiBJTlRfTUFYKQorCSAgICBpZiAobmV3X3Jlc191c2VkIDwgcmVzX3VzZWQgfHwgIG5ld19yZXNfdXNlZCA+IFBZX1NTSVpFX1RfTUFYKQogCQlnb3RvIE92ZXJmbG93OwogCX0KIAlpZiAobmV3X3Jlc191c2VkID4gcmVzX2FsbG9jKSB7CkBAIC00MjQ4LDEwICs0MjQ3LDEwIEBACiAJICAgIGRvIHsKIAkgICAgICAgIHNpemVfdCBvbGRzaXplID0gcmVzX2FsbG9jOwogCSAgICAgICAgcmVzX2FsbG9jICs9IHJlc19hbGxvYzsKLQkgICAgICAgIGlmIChyZXNfYWxsb2MgPCBvbGRzaXplIHx8IHJlc19hbGxvYyA+IElOVF9NQVgpCisJICAgICAgICBpZiAocmVzX2FsbG9jIDwgb2xkc2l6ZSB8fCByZXNfYWxsb2MgPiBQWV9TU0laRV9UX01BWCkKIAkgICAgICAgICAgICBnb3RvIE92ZXJmbG93OwogCSAgICB9IHdoaWxlIChuZXdfcmVzX3VzZWQgPiByZXNfYWxsb2MpOwotCSAgICBpZiAoX1B5VW5pY29kZV9SZXNpemUoJnJlcywgKGludClyZXNfYWxsb2MpIDwgMCkgeworCSAgICBpZiAoX1B5VW5pY29kZV9SZXNpemUoJnJlcywgcmVzX2FsbG9jKSA8IDApIHsKIAkJUHlfREVDUkVGKGl0ZW0pOwogCQlnb3RvIG9uRXJyb3I7CiAJICAgIH0KQEAgLTQyNTksMTAgKzQyNTgsMTAgQEAKIAl9CiAKIAkvKiBDb3B5IGl0ZW0sIGFuZCBtYXliZSB0aGUgc2VwYXJhdG9yLiAqLwotCVB5X1VOSUNPREVfQ09QWShyZXNfcCwgUHlVbmljb2RlX0FTX1VOSUNPREUoaXRlbSksIChpbnQpaXRlbWxlbik7CisJUHlfVU5JQ09ERV9DT1BZKHJlc19wLCBQeVVuaWNvZGVfQVNfVU5JQ09ERShpdGVtKSwgaXRlbWxlbik7CiAJcmVzX3AgKz0gaXRlbWxlbjsKIAlpZiAoaSA8IHNlcWxlbiAtIDEpIHsKLQkgICAgUHlfVU5JQ09ERV9DT1BZKHJlc19wLCBzZXAsIChpbnQpc2VwbGVuKTsKKwkgICAgUHlfVU5JQ09ERV9DT1BZKHJlc19wLCBzZXAsIHNlcGxlbik7CiAJICAgIHJlc19wICs9IHNlcGxlbjsKIAl9CiAJUHlfREVDUkVGKGl0ZW0pOwpAQCAtNDI3Miw3ICs0MjcxLDcgQEAKICAgICAvKiBTaHJpbmsgcmVzIHRvIG1hdGNoIHRoZSB1c2VkIGFyZWE7IHRoaXMgcHJvYmFibHkgY2FuJ3QgZmFpbCwKICAgICAgKiBidXQgaXQncyBjaGVhcCB0byBjaGVjay4KICAgICAgKi8KLSAgICBpZiAoX1B5VW5pY29kZV9SZXNpemUoJnJlcywgKGludClyZXNfdXNlZCkgPCAwKQorICAgIGlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmcmVzLCByZXNfdXNlZCkgPCAwKQogCWdvdG8gb25FcnJvcjsKIAogIERvbmU6CkBAIC00NjA1LDcgKzQ2MDQsNyBAQAogICAgIFB5T2JqZWN0ICpsaXN0OwogCiAgICAgaWYgKG1heGNvdW50IDwgMCkKLSAgICAgICAgbWF4Y291bnQgPSBJTlRfTUFYOworICAgICAgICBtYXhjb3VudCA9IFBZX1NTSVpFX1RfTUFYOwogCiAgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CiAgICAgaWYgKCFsaXN0KQpAQCAtNDYzNCw3ICs0NjMzLDcgQEAKICAgICBQeU9iamVjdCAqbGlzdDsKIAogICAgIGlmIChtYXhjb3VudCA8IDApCi0gICAgICAgIG1heGNvdW50ID0gSU5UX01BWDsKKyAgICAgICAgbWF4Y291bnQgPSBQWV9TU0laRV9UX01BWDsKIAogICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOwogICAgIGlmICghbGlzdCkKQEAgLTQ2NjQsMTAgKzQ2NjMsMTAgQEAKICAgICBQeVVuaWNvZGVPYmplY3QgKnU7CiAKICAgICBpZiAobWF4Y291bnQgPCAwKQotCW1heGNvdW50ID0gSU5UX01BWDsKKwltYXhjb3VudCA9IFBZX1NTSVpFX1RfTUFYOwogCiAgICAgaWYgKHN0cjEtPmxlbmd0aCA9PSAxICYmIHN0cjItPmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgIGludCBpOworICAgICAgICBQeV9zc2l6ZV90IGk7CiAKICAgICAgICAgLyogcmVwbGFjZSBjaGFyYWN0ZXJzICovCiAgICAgICAgIGlmICghZmluZGNoYXIoc2VsZi0+c3RyLCBzZWxmLT5sZW5ndGgsIHN0cjEtPnN0clswXSkgJiYKQEAgLTUwODgsNyArNTA4Nyw3IEBACiB7CiAgICAgUHlVbmljb2RlT2JqZWN0ICpzdWJzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBJTlRfTUFYOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmNvdW50IiwgJnN1YnN0cmluZywKQEAgLTUyNjUsNyArNTI2NCw3IEBACiB7CiAgICAgUHlVbmljb2RlT2JqZWN0ICpzdWJzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBJTlRfTUFYOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmZpbmQiLCAmc3Vic3RyaW5nLApAQCAtNTMzMSw3ICs1MzMwLDcgQEAKICAgICBQeV9zc2l6ZV90IHJlc3VsdDsKICAgICBQeVVuaWNvZGVPYmplY3QgKnN1YnN0cmluZzsKICAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLSAgICBQeV9zc2l6ZV90IGVuZCA9IElOVF9NQVg7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmluZGV4IiwgJnN1YnN0cmluZywKIAkJX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCkBAIC01NjY5LDEwICs1NjY4LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdW5pY29kZV9sanVzdChQeVVuaWNvZGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIGludCB3aWR0aDsKKyAgICBQeV9zc2l6ZV90IHdpZHRoOwogICAgIFB5X1VOSUNPREUgZmlsbGNoYXIgPSAnICc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8TyY6bGp1c3QiLCAmd2lkdGgsIGNvbnZlcnRfdWMsICZmaWxsY2hhcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufE8mOmxqdXN0IiwgJndpZHRoLCBjb252ZXJ0X3VjLCAmZmlsbGNoYXIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChzZWxmLT5sZW5ndGggPj0gd2lkdGggJiYgUHlVbmljb2RlX0NoZWNrRXhhY3Qoc2VsZikpIHsKQEAgLTU5OTYsNyArNTk5NSw3IEBACiB7CiAgICAgUHlVbmljb2RlT2JqZWN0ICpzdWJzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBJTlRfTUFYOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOnJmaW5kIiwgJnN1YnN0cmluZywKQEAgLTYwMjQsNyArNjAyMyw3IEBACiAgICAgUHlfc3NpemVfdCByZXN1bHQ7CiAgICAgUHlVbmljb2RlT2JqZWN0ICpzdWJzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBJTlRfTUFYOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpyaW5kZXgiLCAmc3Vic3RyaW5nLAogCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKQEAgLTYwNTMsMTAgKzYwNTIsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX3JqdXN0KFB5VW5pY29kZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgaW50IHdpZHRoOworICAgIFB5X3NzaXplX3Qgd2lkdGg7CiAgICAgUHlfVU5JQ09ERSBmaWxsY2hhciA9ICcgJzsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxPJjpyanVzdCIsICZ3aWR0aCwgY29udmVydF91YywgJmZpbGxjaGFyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58TyY6cmp1c3QiLCAmd2lkdGgsIGNvbnZlcnRfdWMsICZmaWxsY2hhcikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKHNlbGYtPmxlbmd0aCA+PSB3aWR0aCAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChzZWxmKSkgewpAQCAtNjMxOCw3ICs2MzE3LDcgQEAKIHsKICAgICBQeVVuaWNvZGVPYmplY3QgKnN1YnN0cmluZzsKICAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLSAgICBQeV9zc2l6ZV90IGVuZCA9IElOVF9NQVg7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKICAgICBQeU9iamVjdCAqcmVzdWx0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6c3RhcnRzd2l0aCIsICZzdWJzdHJpbmcsCkBAIC02MzQ5LDcgKzYzNDgsNyBAQAogewogICAgIFB5VW5pY29kZU9iamVjdCAqc3Vic3RyaW5nOwogICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwotICAgIFB5X3NzaXplX3QgZW5kID0gSU5UX01BWDsKKyAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjplbmRzd2l0aCIsICZzdWJzdHJpbmcsCkBAIC02NDUwLDEzICs2NDQ5LDEzIEBACiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyB1bmljb2RlX2FzX3NlcXVlbmNlID0gewogICAgIChsZW5mdW5jKSB1bmljb2RlX2xlbmd0aCwgCQkvKiBzcV9sZW5ndGggKi8KLSAgICAoYmluYXJ5ZnVuYykgUHlVbmljb2RlX0NvbmNhdCwgCS8qIHNxX2NvbmNhdCAqLworICAgIFB5VW5pY29kZV9Db25jYXQsCQkgCS8qIHNxX2NvbmNhdCAqLwogICAgIChzc2l6ZWFyZ2Z1bmMpIHVuaWNvZGVfcmVwZWF0LCAJLyogc3FfcmVwZWF0ICovCiAgICAgKHNzaXplYXJnZnVuYykgdW5pY29kZV9nZXRpdGVtLCAJLyogc3FfaXRlbSAqLwogICAgIChzc2l6ZXNzaXplYXJnZnVuYykgdW5pY29kZV9zbGljZSwgCS8qIHNxX3NsaWNlICovCiAgICAgMCwgCQkJCQkvKiBzcV9hc3NfaXRlbSAqLwogICAgIDAsIAkJCQkJLyogc3FfYXNzX3NsaWNlICovCi0gICAgKG9iam9ianByb2MpUHlVbmljb2RlX0NvbnRhaW5zLCAJLypzcV9jb250YWlucyovCisgICAgUHlVbmljb2RlX0NvbnRhaW5zLCAJCS8qIHNxX2NvbnRhaW5zICovCiB9OwogCiAjZGVmaW5lIEhBU0lOREVYKG8pIFB5VHlwZV9IYXNGZWF0dXJlKChvKS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lOREVYKQpAQCAtNjQ4Nyw3ICs2NDg2LDggQEAKICAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzb3VyY2VfYnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUoKFB5T2JqZWN0KilzZWxmKTsKLSAgICAgICAgICAgIHJlc3VsdF9idWYgPSBQeU1lbV9NQUxMT0Moc2xpY2VsZW5ndGgqc2l6ZW9mKFB5X1VOSUNPREUpKTsKKyAgICAgICAgICAgIHJlc3VsdF9idWYgPSAoUHlfVU5JQ09ERSAqKVB5TWVtX01BTExPQyhzbGljZWxlbmd0aCoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUHlfVU5JQ09ERSkpOwogCSAgICAKIAkgICAgaWYgKHJlc3VsdF9idWYgPT0gTlVMTCkKIAkJICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwpAQCAtNzMzNiw3ICs3MzM2LDcgQEAKICAgICAwLAkJCQkgCS8qIHRwX2dldGF0dHIgKi8KICAgICAwLCAJCQkJCS8qIHRwX3NldGF0dHIgKi8KICAgICAoY21wZnVuYykgdW5pY29kZV9jb21wYXJlLCAJCS8qIHRwX2NvbXBhcmUgKi8KLSAgICAocmVwcmZ1bmMpIHVuaWNvZGVfcmVwciwgCQkvKiB0cF9yZXByICovCisgICAgdW5pY29kZV9yZXByLCAJCQkvKiB0cF9yZXByICovCiAgICAgJnVuaWNvZGVfYXNfbnVtYmVyLCAJCS8qIHRwX2FzX251bWJlciAqLwogICAgICZ1bmljb2RlX2FzX3NlcXVlbmNlLCAJCS8qIHRwX2FzX3NlcXVlbmNlICovCiAgICAgJnVuaWNvZGVfYXNfbWFwcGluZywgCQkvKiB0cF9hc19tYXBwaW5nICovCkBAIC03NDE2LDYgKzc0MTYsMTEgQEAKICAgICB1bmljb2RlX2ZyZWVsaXN0X3NpemUgPSAwOwogfQogCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKIC8qCiBMb2NhbCB2YXJpYWJsZXM6CiBjLWJhc2ljLW9mZnNldDogNApkaWZmIC0tZ2l0IGEvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwppbmRleCAzOTU5NWFlLi4zZjJjMjYxIDEwMDY0NAotLS0gYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYworKysgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwpAQCAtMTA5LDggKzEwOSw3IEBACiBzdGF0aWMgaW50CiBnY190cmF2ZXJzZShQeVdlYWtSZWZlcmVuY2UgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotICAgIGlmIChzZWxmLT53cl9jYWxsYmFjayAhPSBOVUxMKQotICAgICAgICByZXR1cm4gdmlzaXQoc2VsZi0+d3JfY2FsbGJhY2ssIGFyZyk7CisgICAgUHlfVklTSVQoc2VsZi0+d3JfY2FsbGJhY2spOwogICAgIHJldHVybiAwOwogfQogCkBAIC0zNjcsNyArMzY2LDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCi0gICAgKGluaXRwcm9jKXdlYWtyZWZfX19pbml0X18sIC8qdHBfaW5pdCovCisgICAgd2Vha3JlZl9fX2luaXRfXywgICAgICAgICAgIC8qdHBfaW5pdCovCiAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgIC8qdHBfYWxsb2MqLwogICAgIHdlYWtyZWZfX19uZXdfXywgICAgICAgICAgICAvKnRwX25ldyovCiAgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgIC8qdHBfZnJlZSovCkBAIC01ODYsMzggKzU4NSwzOCBAQAogCiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgcHJveHlfYXNfbnVtYmVyID0gewotICAgIChiaW5hcnlmdW5jKXByb3h5X2FkZCwgICAgICAvKm5iX2FkZCovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfc3ViLCAgICAgIC8qbmJfc3VidHJhY3QqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X211bCwgICAgICAvKm5iX211bHRpcGx5Ki8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9tb2QsICAgICAgLypuYl9yZW1haW5kZXIqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X2Rpdm1vZCwgICAvKm5iX2Rpdm1vZCovCi0gICAgKHRlcm5hcnlmdW5jKXByb3h5X3BvdywgICAgIC8qbmJfcG93ZXIqLwotICAgICh1bmFyeWZ1bmMpcHJveHlfbmVnLCAgICAgICAvKm5iX25lZ2F0aXZlKi8KLSAgICAodW5hcnlmdW5jKXByb3h5X3BvcywgICAgICAgLypuYl9wb3NpdGl2ZSovCi0gICAgKHVuYXJ5ZnVuYylwcm94eV9hYnMsICAgICAgIC8qbmJfYWJzb2x1dGUqLwotICAgIChpbnF1aXJ5KXByb3h5X25vbnplcm8sICAgICAvKm5iX25vbnplcm8qLwotICAgICh1bmFyeWZ1bmMpcHJveHlfaW52ZXJ0LCAgICAvKm5iX2ludmVydCovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfbHNoaWZ0LCAgIC8qbmJfbHNoaWZ0Ki8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9yc2hpZnQsICAgLypuYl9yc2hpZnQqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X2FuZCwgICAgICAvKm5iX2FuZCovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfeG9yLCAgICAgIC8qbmJfeG9yKi8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9vciwgICAgICAgLypuYl9vciovCi0gICAgKGNvZXJjaW9uKTAsICAgICAgICAgICAgICAgIC8qbmJfY29lcmNlKi8KLSAgICAodW5hcnlmdW5jKXByb3h5X2ludCwgICAgICAgLypuYl9pbnQqLwotICAgICh1bmFyeWZ1bmMpcHJveHlfbG9uZywgICAgICAvKm5iX2xvbmcqLwotICAgICh1bmFyeWZ1bmMpcHJveHlfZmxvYXQsICAgICAvKm5iX2Zsb2F0Ki8KLSAgICAodW5hcnlmdW5jKTAsICAgICAgICAgICAgICAgLypuYl9vY3QqLwotICAgICh1bmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAvKm5iX2hleCovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfaWFkZCwgICAgIC8qbmJfaW5wbGFjZV9hZGQqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X2lzdWIsICAgICAvKm5iX2lucGxhY2Vfc3VidHJhY3QqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X2ltdWwsICAgICAvKm5iX2lucGxhY2VfbXVsdGlwbHkqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X2ltb2QsICAgICAvKm5iX2lucGxhY2VfcmVtYWluZGVyKi8KLSAgICAodGVybmFyeWZ1bmMpcHJveHlfaXBvdywgICAgLypuYl9pbnBsYWNlX3Bvd2VyKi8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9pbHNoaWZ0LCAgLypuYl9pbnBsYWNlX2xzaGlmdCovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfaXJzaGlmdCwgIC8qbmJfaW5wbGFjZV9yc2hpZnQqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X2lhbmQsICAgICAvKm5iX2lucGxhY2VfYW5kKi8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9peG9yLCAgICAgLypuYl9pbnBsYWNlX3hvciovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfaW9yLCAgICAgIC8qbmJfaW5wbGFjZV9vciovCisgICAgcHJveHlfYWRkLCAgICAgICAgICAgICAgLypuYl9hZGQqLworICAgIHByb3h5X3N1YiwgICAgICAgICAgICAgIC8qbmJfc3VidHJhY3QqLworICAgIHByb3h5X211bCwgICAgICAgICAgICAgIC8qbmJfbXVsdGlwbHkqLworICAgIHByb3h5X21vZCwgICAgICAgICAgICAgIC8qbmJfcmVtYWluZGVyKi8KKyAgICBwcm94eV9kaXZtb2QsICAgICAgICAgICAvKm5iX2Rpdm1vZCovCisgICAgcHJveHlfcG93LCAgICAgICAgICAgICAgLypuYl9wb3dlciovCisgICAgcHJveHlfbmVnLCAgICAgICAgICAgICAgLypuYl9uZWdhdGl2ZSovCisgICAgcHJveHlfcG9zLCAgICAgICAgICAgICAgLypuYl9wb3NpdGl2ZSovCisgICAgcHJveHlfYWJzLCAgICAgICAgICAgICAgLypuYl9hYnNvbHV0ZSovCisgICAgKGlucXVpcnkpcHJveHlfbm9uemVybywgLypuYl9ub256ZXJvKi8KKyAgICBwcm94eV9pbnZlcnQsICAgICAgICAgICAvKm5iX2ludmVydCovCisgICAgcHJveHlfbHNoaWZ0LCAgICAgICAgICAgLypuYl9sc2hpZnQqLworICAgIHByb3h5X3JzaGlmdCwgICAgICAgICAgIC8qbmJfcnNoaWZ0Ki8KKyAgICBwcm94eV9hbmQsICAgICAgICAgICAgICAvKm5iX2FuZCovCisgICAgcHJveHlfeG9yLCAgICAgICAgICAgICAgLypuYl94b3IqLworICAgIHByb3h5X29yLCAgICAgICAgICAgICAgIC8qbmJfb3IqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qbmJfY29lcmNlKi8KKyAgICBwcm94eV9pbnQsICAgICAgICAgICAgICAvKm5iX2ludCovCisgICAgcHJveHlfbG9uZywgICAgICAgICAgICAgLypuYl9sb25nKi8KKyAgICBwcm94eV9mbG9hdCwgICAgICAgICAgICAvKm5iX2Zsb2F0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKm5iX29jdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLypuYl9oZXgqLworICAgIHByb3h5X2lhZGQsICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9hZGQqLworICAgIHByb3h5X2lzdWIsICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9zdWJ0cmFjdCovCisgICAgcHJveHlfaW11bCwgICAgICAgICAgICAgLypuYl9pbnBsYWNlX211bHRpcGx5Ki8KKyAgICBwcm94eV9pbW9kLCAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcmVtYWluZGVyKi8KKyAgICBwcm94eV9pcG93LCAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcG93ZXIqLworICAgIHByb3h5X2lsc2hpZnQsICAgICAgICAgIC8qbmJfaW5wbGFjZV9sc2hpZnQqLworICAgIHByb3h5X2lyc2hpZnQsICAgICAgICAgIC8qbmJfaW5wbGFjZV9yc2hpZnQqLworICAgIHByb3h5X2lhbmQsICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9hbmQqLworICAgIHByb3h5X2l4b3IsICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV94b3IqLworICAgIHByb3h5X2lvciwgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9vciovCiB9OwogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgcHJveHlfYXNfc2VxdWVuY2UgPSB7CkBAIC02MzIsOCArNjMxLDggQEAKIH07CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIHByb3h5X2FzX21hcHBpbmcgPSB7Ci0gICAgKGxlbmZ1bmMpcHJveHlfbGVuZ3RoLCAgICAgIC8qbXBfbGVuZ3RoKi8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9nZXRpdGVtLCAgLyptcF9zdWJzY3JpcHQqLworICAgIChsZW5mdW5jKXByb3h5X2xlbmd0aCwgICAgICAgIC8qbXBfbGVuZ3RoKi8KKyAgICBwcm94eV9nZXRpdGVtLCAgICAgICAgICAgICAgICAvKm1wX3N1YnNjcmlwdCovCiAgICAgKG9iam9iamFyZ3Byb2MpcHJveHlfc2V0aXRlbSwgLyptcF9hc3Nfc3Vic2NyaXB0Ki8KIH07CiAKQEAgLTY1MSwxNCArNjUwLDE0IEBACiAgICAgMCwJCQkJICAgICAgICAvKiB0cF9nZXRhdHRyICovCiAgICAgMCwgCQkJCSAgICAgICAgLyogdHBfc2V0YXR0ciAqLwogICAgIHByb3h5X2NvbXBhcmUsCQkgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLSAgICAodW5hcnlmdW5jKXByb3h5X3JlcHIsCSAgICAgICAgLyogdHBfcmVwciAqLworICAgIChyZXByZnVuYylwcm94eV9yZXByLAkgICAgICAgIC8qIHRwX3JlcHIgKi8KICAgICAmcHJveHlfYXNfbnVtYmVyLAkJICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KICAgICAmcHJveHlfYXNfc2VxdWVuY2UsCQkgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCiAgICAgJnByb3h5X2FzX21hcHBpbmcsCQkgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAwLAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KLSAgICAodGVybmFyeWZ1bmMpMCwJICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLSAgICAodW5hcnlmdW5jKXByb3h5X3N0ciwJICAgICAgICAvKiB0cF9zdHIgKi8KLSAgICAoZ2V0YXR0cm9mdW5jKXByb3h5X2dldGF0dHIsICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIHByb3h5X3N0ciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIHByb3h5X2dldGF0dHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgKHNldGF0dHJvZnVuYylwcm94eV9zZXRhdHRyLCAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLAkJCQkgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQwpAQCAtNjkxLDkgKzY5MCw5IEBACiAgICAgJnByb3h5X2FzX3NlcXVlbmNlLAkJICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwogICAgICZwcm94eV9hc19tYXBwaW5nLAkJICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCiAgICAgMCwJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0gICAgKHRlcm5hcnlmdW5jKXByb3h5X2NhbGwsCSAgICAgICAgLyogdHBfY2FsbCAqLwotICAgICh1bmFyeWZ1bmMpcHJveHlfc3RyLAkgICAgICAgIC8qIHRwX3N0ciAqLwotICAgIChnZXRhdHRyb2Z1bmMpcHJveHlfZ2V0YXR0ciwgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgcHJveHlfY2FsbCwJICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIHByb3h5X3N0ciwJICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgcHJveHlfZ2V0YXR0ciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAoc2V0YXR0cm9mdW5jKXByb3h5X3NldGF0dHIsICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsCQkJCSAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCmRpZmYgLS1naXQgYS9QQy9WQzYvcHl0aG9uY29yZS5kc3AgYi9QQy9WQzYvcHl0aG9uY29yZS5kc3AKaW5kZXggMDRhMTIyNC4uY2YzMjAwYyAxMDA2NDQKLS0tIGEvUEMvVkM2L3B5dGhvbmNvcmUuZHNwCisrKyBiL1BDL1ZDNi9weXRob25jb3JlLmRzcApAQCAtNTM1LDE0ICs1MzUsNiBAQAogIyBFbmQgU291cmNlIEZpbGUNCiAjIEJlZ2luIFNvdXJjZSBGaWxlDQogDQotU09VUkNFPS4uXC4uXE1vZHVsZXNccmVnZXhtb2R1bGUuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uLlwuLlxNb2R1bGVzXHJlZ2V4cHIuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KIFNPVVJDRT0uLlwuLlxNb2R1bGVzXHJnYmltZ21vZHVsZS5jDQogIyBFbmQgU291cmNlIEZpbGUNCiAjIEJlZ2luIFNvdXJjZSBGaWxlDQpkaWZmIC0tZ2l0IGEvUEMvX3N1YnByb2Nlc3MuYyBiL1BDL19zdWJwcm9jZXNzLmMKaW5kZXggMWNhNGVjZS4uNzhjZWI3ZCAxMDA2NDQKLS0tIGEvUEMvX3N1YnByb2Nlc3MuYworKysgYi9QQy9fc3VicHJvY2Vzcy5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIHsKIAlpZiAoc2VsZi0+aGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQogCQlDbG9zZUhhbmRsZShzZWxmLT5oYW5kbGUpOwotCVB5TWVtX0RFTChzZWxmKTsKKwlQeU9iamVjdF9GUkVFKHNlbGYpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3BfaGFuZGxlX21ldGhvZHNbXSA9IHsKZGlmZiAtLWdpdCBhL1BDL2NvbmZpZy5jIGIvUEMvY29uZmlnLmMKaW5kZXggZWU2MmRjNS4uNzVlMWEzYyAxMDA2NDQKLS0tIGEvUEMvY29uZmlnLmMKKysrIGIvUEMvY29uZmlnLmMKQEAgLTIwLDcgKzIwLDYgQEAKIGV4dGVybiB2b2lkIGluaXRfbWQ1KHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdG50KHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdG9wZXJhdG9yKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdHJlZ2V4KHZvaWQpOwogI2lmbmRlZiBNU19XSU42NAogZXh0ZXJuIHZvaWQgaW5pdHJnYmltZyh2b2lkKTsKICNlbmRpZgpAQCAtOTUsNyArOTQsNiBAQAogICAgICAgICB7Il9tZDUiLCBpbml0X21kNX0sCiAgICAgICAgIHsibnQiLCBpbml0bnR9LCAvKiBVc2UgdGhlIE5UIG9zIGZ1bmN0aW9ucywgbm90IHBvc2l4ICovCiAgICAgICAgIHsib3BlcmF0b3IiLCBpbml0b3BlcmF0b3J9LAotICAgICAgICB7InJlZ2V4IiwgaW5pdHJlZ2V4fSwKICNpZm5kZWYgTVNfV0lONjQKICAgICAgICAgeyJyZ2JpbWciLCBpbml0cmdiaW1nfSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvUEMvZGxsYmFzZV9udC50eHQgYi9QQy9kbGxiYXNlX250LnR4dAppbmRleCA5NDRlZjk1Li5jMDZlNDk3IDEwMDY0NAotLS0gYS9QQy9kbGxiYXNlX250LnR4dAorKysgYi9QQy9kbGxiYXNlX250LnR4dApAQCAtMzMsNiArMzMsNyBAQAogIC0gYloyICAgICAgICAgICAgICAgICAgICAgICAxRDE3MDAwMCAtIDFEMTgwMDAwCiAgLSBkYXRldGltZSAgICAgICAgICAgICAgICAgIDFEMTgwMDAwIC0gMUQxOTAwMDAgICAgcHlkIHJlbW92ZWQgaW4gMi40CiAgLSBfY3N2ICAgICAgICAgICAgICAgICAgICAgIDFEMTkwMDAwIC0gMUQxQTAwMDAgICAgcHlkIHJlbW92ZWQgaW4gMi40CisgLSBfY3R5cGVzICAgICAgICAgICAgICAgICAgIDFEMUEwMDAwIC0gMUQxQjAwMDAKIAogT3RoZXIgZXh0ZW5zaW9uIG1vZHVsZXMKICAtIHdpbjMyYXBpICAgICAgICAgICAgICAgICAgMWUyMDAwMDAgLSAxZTIyMDAwMApkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L01ha2VmaWxlIGIvUEMvb3MyZW14L01ha2VmaWxlCmluZGV4IDg0N2ZhNjcuLjc2MmJmZGIgMTAwNjQ0Ci0tLSBhL1BDL29zMmVteC9NYWtlZmlsZQorKysgYi9QQy9vczJlbXgvTWFrZWZpbGUKQEAgLTMwNCw4ICszMDQsNiBAQAogCQlNb2R1bGVzL21kNW1vZHVsZS5jIFwKIAkJTW9kdWxlcy9vcGVyYXRvci5jIFwKIAkJTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMgXAotCQlNb2R1bGVzL3JlZ2V4bW9kdWxlLmMgXAotCQlNb2R1bGVzL3JlZ2V4cHIuYyBcCiAJCU1vZHVsZXMvcmdiaW1nbW9kdWxlLmMgXAogCQlNb2R1bGVzL3NoYW1vZHVsZS5jIFwKIAkJTW9kdWxlcy9fc3JlLmMgXApkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L2NvbmZpZy5jIGIvUEMvb3MyZW14L2NvbmZpZy5jCmluZGV4IDVlZTQzNDMuLjQwYzJjZGMgMTAwNjQ0Ci0tLSBhL1BDL29zMmVteC9jb25maWcuYworKysgYi9QQy9vczJlbXgvY29uZmlnLmMKQEAgLTY0LDcgKzY0LDYgQEAKIGV4dGVybiB2b2lkIGluaXRtYXRoKCk7CiBleHRlcm4gdm9pZCBpbml0bWQ1KCk7CiBleHRlcm4gdm9pZCBpbml0b3BlcmF0b3IoKTsKLWV4dGVybiB2b2lkIGluaXRyZWdleCgpOwogZXh0ZXJuIHZvaWQgaW5pdHJnYmltZygpOwogZXh0ZXJuIHZvaWQgaW5pdHNoYSgpOwogZXh0ZXJuIHZvaWQgaW5pdHN0cm9wKCk7CkBAIC0xMjgsNyArMTI3LDYgQEAKIAl7Im1hdGgiLCBpbml0bWF0aH0sCiAJeyJtZDUiLCBpbml0bWQ1fSwKIAl7Im9wZXJhdG9yIiwgaW5pdG9wZXJhdG9yfSwKLQl7InJlZ2V4IiwgaW5pdHJlZ2V4fSwKIAl7InJnYmltZyIsIGluaXRyZ2JpbWd9LAogCXsic2hhIiwgaW5pdHNoYX0sCiAJeyJzdHJvcCIsIGluaXRzdHJvcH0sCmRpZmYgLS1naXQgYS9QQy9vczJlbXgvcHl0aG9uMjQuZGVmIGIvUEMvb3MyZW14L3B5dGhvbjI0LmRlZgppbmRleCA0Zjc4OTE0Li41MzRkZmY4IDEwMDY0NAotLS0gYS9QQy9vczJlbXgvcHl0aG9uMjQuZGVmCisrKyBiL1BDL29zMmVteC9weXRob24yNC5kZWYKQEAgLTExMzQsMTkgKzExMzQsNiBAQAogOyBGcm9tIHB5dGhvbjI0X3MubGliKF9yYW5kb21tb2R1bGUpCiA7ICAiaW5pdF9yYW5kb20iCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihyZWdleG1vZHVsZSkKLTsgICJpbml0cmVnZXgiCi0KLTsgRnJvbSBweXRob24yNF9zLmxpYihyZWdleHByKQotOyAgIl9QeV9yZV9zeW50YXhfdGFibGUiCi07ICAiX1B5X3JlX2NvbXBpbGVfaW5pdGlhbGl6ZSIKLTsgICJfUHlfcmVfY29tcGlsZV9wYXR0ZXJuIgotOyAgIl9QeV9yZV9tYXRjaCIKLTsgICJfUHlfcmVfc2VhcmNoIgotOyAgIl9QeV9yZV9zZXRfc3ludGF4IgotOyAgIl9QeV9yZV9jb21waWxlX2Zhc3RtYXAiCi07ICAiX1B5X3JlX3N5bnRheCIKLQogOyBGcm9tIHB5dGhvbjI0X3MubGliKHJnYmltZ21vZHVsZSkKIDsgICJpbml0cmdiaW1nIgogCmRpZmYgLS1naXQgYS9QQy9vczJ2YWNwcC9jb25maWcuYyBiL1BDL29zMnZhY3BwL2NvbmZpZy5jCmluZGV4IDc1MTJkZTUuLjliYjU3NTIgMTAwNjQ0Ci0tLSBhL1BDL29zMnZhY3BwL2NvbmZpZy5jCisrKyBiL1BDL29zMnZhY3BwL2NvbmZpZy5jCkBAIC0yNyw3ICsyNyw2IEBACiBleHRlcm4gdm9pZCBpbml0b3MyKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdG9wZXJhdG9yKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdHBvc2l4KHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdHJlZ2V4KHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdHJnYmltZyh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRzaWduYWwodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0c2VsZWN0KHZvaWQpOwpAQCAtNzAsNyArNjksNiBAQAogI2VuZGlmCiAjZW5kaWYKICAgICAgICAgeyJvcGVyYXRvciIsIGluaXRvcGVyYXRvcn0sCi0gICAgICAgIHsicmVnZXgiLCBpbml0cmVnZXh9LAogLy8gICAgICAgIHsicmdiaW1nIiwgaW5pdHJnYmltZ30sCiAgICAgICAgIHsic2lnbmFsIiwgaW5pdHNpZ25hbH0sCiAjaWZkZWYgVVNFX1NPQ0tFVApkaWZmIC0tZ2l0IGEvUEMvb3MydmFjcHAvbWFrZWZpbGUgYi9QQy9vczJ2YWNwcC9tYWtlZmlsZQppbmRleCA5OTRhYzQ5Li5mMzQwNDdmIDEwMDY0NAotLS0gYS9QQy9vczJ2YWNwcC9tYWtlZmlsZQorKysgYi9QQy9vczJ2YWNwcC9tYWtlZmlsZQpAQCAtOTQ4LDM0ICs5NDgsNiBAQAogCSAkKFBZX0lOQ0xVREUpXHNsaWNlb2JqZWN0LmggJChQWV9JTkNMVURFKVxzdHJpbmdvYmplY3QuaCBcCiAJICQoUFlfSU5DTFVERSlcc3lzbW9kdWxlLmggJChQWV9JTkNMVURFKVx0cmFjZWJhY2suaCAkKFBZX0lOQ0xVREUpXHR1cGxlb2JqZWN0LmgKIAotcmVnZXhtb2R1bGUub2JqOiAkKFBZX0lOQ0xVREUpXGFic3RyYWN0LmggJChQWV9JTkNMVURFKVxjZXZhbC5oIFwKLQkgJChQWV9JTkNMVURFKVxjbGFzc29iamVjdC5oICQoUFlfSU5DTFVERSlcY29iamVjdC5oICQoUFlfSU5DTFVERSlcY29tcGxleG9iamVjdC5oIFwKLQkgcHljb25maWcuaCAkKFBZX0lOQ0xVREUpXGRpY3RvYmplY3QuaCAkKFBZX0lOQ0xVREUpXGZpbGVvYmplY3QuaCBcCi0JICQoUFlfSU5DTFVERSlcZmxvYXRvYmplY3QuaCAkKFBZX0lOQ0xVREUpXGZ1bmNvYmplY3QuaCAkKFBZX0lOQ0xVREUpXGltcG9ydC5oIFwKLQkgJChQWV9JTkNMVURFKVxpbnRvYmplY3QuaCAkKFBZX0lOQ0xVREUpXGludHJjaGVjay5oICQoUFlfSU5DTFVERSlcbGlzdG9iamVjdC5oIFwKLQkgJChQWV9JTkNMVURFKVxsb25nb2JqZWN0LmggJChQWV9JTkNMVURFKVxtZXRob2RvYmplY3QuaCBcCi0JICQoUFlfSU5DTFVERSlcbW9kc3VwcG9ydC5oICQoUFlfSU5DTFVERSlcbW9kdWxlb2JqZWN0LmggJChQWV9JTkNMVURFKVxteW1hbGxvYy5oIFwKLQkgJChQWV9JTkNMVURFKVxteXByb3RvLmggJChQWV9JTkNMVURFKVxvYmplY3QuaCAkKFBZX0lOQ0xVREUpXG9iamltcGwuaCBcCi0JICQoUFlfSU5DTFVERSlccHlkZWJ1Zy5oICQoUFlfSU5DTFVERSlccHllcnJvcnMuaCAkKFBZX0lOQ0xVREUpXHB5ZnBlLmggXAotCSAkKFBZX0lOQ0xVREUpXHB5c3RhdGUuaCAkKFBZX0lOQ0xVREUpXHB5dGhvbi5oICQoUFlfSU5DTFVERSlccHl0aG9ucnVuLmggXAotCSAkKFBZX0lOQ0xVREUpXHJhbmdlb2JqZWN0LmggJChQWV9NT0RVTEVTKVxyZWdleHByLmggJChQWV9JTkNMVURFKVxzbGljZW9iamVjdC5oIFwKLQkgJChQWV9JTkNMVURFKVxzdHJpbmdvYmplY3QuaCAkKFBZX0lOQ0xVREUpXHN5c21vZHVsZS5oICQoUFlfSU5DTFVERSlcdHJhY2ViYWNrLmggXAotCSAkKFBZX0lOQ0xVREUpXHR1cGxlb2JqZWN0LmgKLQotcmVnZXhwci5vYmo6ICQoUFlfSU5DTFVERSlcYWJzdHJhY3QuaCAkKFBZX0lOQ0xVREUpXGNldmFsLmggXAotCSAkKFBZX0lOQ0xVREUpXGNsYXNzb2JqZWN0LmggJChQWV9JTkNMVURFKVxjb2JqZWN0LmggJChQWV9JTkNMVURFKVxjb21wbGV4b2JqZWN0LmggXAotCSBweWNvbmZpZy5oICQoUFlfSU5DTFVERSlcZGljdG9iamVjdC5oICQoUFlfSU5DTFVERSlcZmlsZW9iamVjdC5oIFwKLQkgJChQWV9JTkNMVURFKVxmbG9hdG9iamVjdC5oICQoUFlfSU5DTFVERSlcZnVuY29iamVjdC5oICQoUFlfSU5DTFVERSlcaW1wb3J0LmggXAotCSAkKFBZX0lOQ0xVREUpXGludG9iamVjdC5oICQoUFlfSU5DTFVERSlcaW50cmNoZWNrLmggJChQWV9JTkNMVURFKVxsaXN0b2JqZWN0LmggXAotCSAkKFBZX0lOQ0xVREUpXGxvbmdvYmplY3QuaCAkKFBZX0lOQ0xVREUpXG1ldGhvZG9iamVjdC5oIFwKLQkgJChQWV9JTkNMVURFKVxtb2RzdXBwb3J0LmggJChQWV9JTkNMVURFKVxtb2R1bGVvYmplY3QuaCAkKFBZX0lOQ0xVREUpXG15bWFsbG9jLmggXAotCSAkKFBZX0lOQ0xVREUpXG15cHJvdG8uaCAkKFBZX0lOQ0xVREUpXG9iamVjdC5oICQoUFlfSU5DTFVERSlcb2JqaW1wbC5oIFwKLQkgJChQWV9JTkNMVURFKVxweWRlYnVnLmggJChQWV9JTkNMVURFKVxweWVycm9ycy5oICQoUFlfSU5DTFVERSlccHlmcGUuaCBcCi0JICQoUFlfSU5DTFVERSlccHlzdGF0ZS5oICQoUFlfSU5DTFVERSlccHl0aG9uLmggJChQWV9JTkNMVURFKVxweXRob25ydW4uaCBcCi0JICQoUFlfSU5DTFVERSlccmFuZ2VvYmplY3QuaCAkKFBZX01PRFVMRVMpXHJlZ2V4cHIuaCAkKFBZX0lOQ0xVREUpXHNsaWNlb2JqZWN0LmggXAotCSAkKFBZX0lOQ0xVREUpXHN0cmluZ29iamVjdC5oICQoUFlfSU5DTFVERSlcc3lzbW9kdWxlLmggJChQWV9JTkNMVURFKVx0cmFjZWJhY2suaCBcCi0JICQoUFlfSU5DTFVERSlcdHVwbGVvYmplY3QuaAotCiByZXNvdXJjZS5vYmo6ICQoUFlfSU5DTFVERSlcYWJzdHJhY3QuaCAkKE9TMlRDUElQKVxJbmNsdWRlXHN5c1x0aW1lLmggJChQWV9JTkNMVURFKVxjZXZhbC5oIFwKIAkgJChQWV9JTkNMVURFKVxjbGFzc29iamVjdC5oICQoUFlfSU5DTFVERSlcY29iamVjdC5oICQoUFlfSU5DTFVERSlcY29tcGxleG9iamVjdC5oIFwKIAkgcHljb25maWcuaCAkKFBZX0lOQ0xVREUpXGRpY3RvYmplY3QuaCAkKFBZX0lOQ0xVREUpXGZpbGVvYmplY3QuaCBcCmRpZmYgLS1naXQgYS9QQy9vczJ2YWNwcC9tYWtlZmlsZS5vbWsgYi9QQy9vczJ2YWNwcC9tYWtlZmlsZS5vbWsKaW5kZXggMGQxMWI2YS4uOTU4MjMzOCAxMDA2NDQKLS0tIGEvUEMvb3MydmFjcHAvbWFrZWZpbGUub21rCisrKyBiL1BDL29zMnZhY3BwL21ha2VmaWxlLm9tawpAQCAtNjk5LDMwICs2OTksNiBAQAogCSBweXRob25ydW4uaCByYW5nZW9iamVjdC5oIHNsaWNlb2JqZWN0Lmggc3RyaW5nb2JqZWN0Lmggc3lzbW9kdWxlLmggXAogCSB0cmFjZWJhY2suaCB0dXBsZW9iamVjdC5oCiAKLXJlZ2V4bW9kdWxlLm9iajogYWJzdHJhY3QuaCBjZXZhbC5oIGNsYXNzb2JqZWN0LmggY29iamVjdC5oIGNvbXBsZXhvYmplY3QuaCBcCi0JIHB5Y29uZmlnLmggZGljdG9iamVjdC5oIGZpbGVvYmplY3QuaCBmbG9hdG9iamVjdC5oIGZ1bmNvYmplY3QuaCBcCi0JIGltcG9ydC5oIGludG9iamVjdC5oIGludHJjaGVjay5oIGxpc3RvYmplY3QuaCBsb25nb2JqZWN0LmggXAotCSBtZXRob2RvYmplY3QuaCBtb2RzdXBwb3J0LmggbW9kdWxlb2JqZWN0LmggbXltYWxsb2MuaCBteXByb3RvLmggXAotCSBvYmplY3QuaCBvYmppbXBsLmggcHlkZWJ1Zy5oIHB5ZXJyb3JzLmggcHlmcGUuaCBweXN0YXRlLmggcHl0aG9uLmggXAotCSBweXRob25ydW4uaCByYW5nZW9iamVjdC5oIHJlZ2V4cHIuaCBzbGljZW9iamVjdC5oIHN0cmluZ29iamVjdC5oIFwKLQkgc3lzbW9kdWxlLmggdHJhY2ViYWNrLmggdHVwbGVvYmplY3QuaAotCi1yZWdleHByLm9iajogYWJzdHJhY3QuaCBjZXZhbC5oIGNsYXNzb2JqZWN0LmggY29iamVjdC5oIFwKLQkgY29tcGxleG9iamVjdC5oIHB5Y29uZmlnLmggZGljdG9iamVjdC5oIGZpbGVvYmplY3QuaCBmbG9hdG9iamVjdC5oIFwKLQkgZnVuY29iamVjdC5oIGltcG9ydC5oIGludG9iamVjdC5oIGludHJjaGVjay5oIGxpc3RvYmplY3QuaCBcCi0JIGxvbmdvYmplY3QuaCBtZXRob2RvYmplY3QuaCBtb2RzdXBwb3J0LmggbW9kdWxlb2JqZWN0LmggbXltYWxsb2MuaCBcCi0JIG15cHJvdG8uaCBvYmplY3QuaCBvYmppbXBsLmggcHlkZWJ1Zy5oIHB5ZXJyb3JzLmggcHlmcGUuaCBcCi0JIHB5c3RhdGUuaCBweXRob24uaCBweXRob25ydW4uaCByYW5nZW9iamVjdC5oIHJlZ2V4cHIuaCBcCi0JIHNsaWNlb2JqZWN0Lmggc3RyaW5nb2JqZWN0Lmggc3lzbW9kdWxlLmggdHJhY2ViYWNrLmggdHVwbGVvYmplY3QuaAotCi1yZW9wbW9kdWxlLm9iajogYWJzdHJhY3QuaCBjZXZhbC5oIGNsYXNzb2JqZWN0LmggY29iamVjdC5oIGNvbXBsZXhvYmplY3QuaCBcCi0JIHB5Y29uZmlnLmggZGljdG9iamVjdC5oIGZpbGVvYmplY3QuaCBmbG9hdG9iamVjdC5oIGZ1bmNvYmplY3QuaCBcCi0JIGltcG9ydC5oIGludG9iamVjdC5oIGludHJjaGVjay5oIGxpc3RvYmplY3QuaCBsb25nb2JqZWN0LmggXAotCSBtZXRob2RvYmplY3QuaCBtb2RzdXBwb3J0LmggbW9kdWxlb2JqZWN0LmggbXltYWxsb2MuaCBteXByb3RvLmggXAotCSBvYmplY3QuaCBvYmppbXBsLmggcHlkZWJ1Zy5oIHB5ZXJyb3JzLmggcHlmcGUuaCBweXN0YXRlLmggcHl0aG9uLmggXAotCSBweXRob25ydW4uaCByYW5nZW9iamVjdC5oIHJlZ2V4cHIuaCBzbGljZW9iamVjdC5oIHN0cmluZ29iamVjdC5oIFwKLQkgc3lzbW9kdWxlLmggdHJhY2ViYWNrLmggdHVwbGVvYmplY3QuaAotCiByZXNvdXJjZS5vYmo6IGFic3RyYWN0LmggYzpcbXB0blxpbmNsdWRlXHN5c1x0aW1lLmggY2V2YWwuaCBjbGFzc29iamVjdC5oIFwKIAkgY29iamVjdC5oIGNvbXBsZXhvYmplY3QuaCBweWNvbmZpZy5oIGRpY3RvYmplY3QuaCBmaWxlb2JqZWN0LmggXAogCSBmbG9hdG9iamVjdC5oIGZ1bmNvYmplY3QuaCBpbXBvcnQuaCBpbnRvYmplY3QuaCBpbnRyY2hlY2suaCBcCmRpZmYgLS1naXQgYS9QQy9vczJ2YWNwcC9weXRob24uZGVmIGIvUEMvb3MydmFjcHAvcHl0aG9uLmRlZgppbmRleCBiYzczZmFjLi43OWQwNWIwIDEwMDY0NAotLS0gYS9QQy9vczJ2YWNwcC9weXRob24uZGVmCisrKyBiL1BDL29zMnZhY3BwL3B5dGhvbi5kZWYKQEAgLTQ2NCwxMiArNDY0LDYgQEAKIDsgICAgICAgICAgICAgICBfUHlfbWVyZ2ViaXRzZXQKIDsgICAgICAgICAgICAgICBfUHlfbWV0YV9ncmFtbWFyCiA7ICAgICAgICAgICAgICAgX1B5X25ld2JpdHNldAotICAgICAgICAgICAgICAgX1B5X3JlX2NvbXBpbGVfZmFzdG1hcAotICAgICAgICAgICAgICAgX1B5X3JlX2NvbXBpbGVfaW5pdGlhbGl6ZQotICAgICAgICAgICAgICAgX1B5X3JlX2NvbXBpbGVfcGF0dGVybgotICAgICAgICAgICAgICAgX1B5X3JlX21hdGNoCi0gICAgICAgICAgICAgICBfUHlfcmVfc2VhcmNoCi0gICAgICAgICAgICAgICBfUHlfcmVfc2V0X3N5bnRheAogOyAgICAgICAgICAgICAgIF9QeV9zYW1lYml0c2V0CiAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9UeXBlCiAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9Gcm9tT2JqZWN0CmRpZmYgLS1naXQgYS9QQy90ZXN0cHkucHkgYi9QQy90ZXN0cHkucHkKaW5kZXggZjg3NDZhMy4uNzhhZDYzYyAxMDA2NDQKLS0tIGEvUEMvdGVzdHB5LnB5CisrKyBiL1BDL3Rlc3RweS5weQpAQCAtNSwyMyArNSwyMyBAQAogIyBjaGFuZ2UgdGhpcyBtb2R1bGUgdG9vLgogCiB0cnk6Ci0gICAgaW1wb3J0IHN0cmluZworICAgIGltcG9ydCBvcwogZXhjZXB0OgotICAgIHByaW50ICIiIkNvdWxkIG5vdCBpbXBvcnQgdGhlIHN0YW5kYXJkICJzdHJpbmciIG1vZHVsZS4KKyAgICBwcmludCAiIiJDb3VsZCBub3QgaW1wb3J0IHRoZSBzdGFuZGFyZCAib3MiIG1vZHVsZS4KICAgUGxlYXNlIGNoZWNrIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4iIiIKICAgICBzeXMuZXhpdCgxKQogCiB0cnk6Ci0gICAgaW1wb3J0IHJlZ2V4X3N5bnRheAorICAgIGltcG9ydCBzeW1ib2wKIGV4Y2VwdDoKLSAgICBwcmludCAiIiJDb3VsZCBub3QgaW1wb3J0IHRoZSBzdGFuZGFyZCAicmVnZXhfc3ludGF4IiBtb2R1bGUuICBJZiB0aGlzIGlzCisgICAgcHJpbnQgIiIiQ291bGQgbm90IGltcG9ydCB0aGUgc3RhbmRhcmQgInN5bWJvbCIgbW9kdWxlLiAgSWYgdGhpcyBpcwogICBhIFBDLCB5b3Ugc2hvdWxkIGFkZCB0aGUgZG9zXzh4MyBkaXJlY3RvcnkgdG8geW91ciBQWVRIT05QQVRILiIiIgogICAgIHN5cy5leGl0KDEpCiAKIGltcG9ydCBvcwogCiBmb3IgZGlyIGluIHN5cy5wYXRoOgotICAgIGZpbGUgPSBvcy5wYXRoLmpvaW4oZGlyLCAic3RyaW5nLnB5IikKKyAgICBmaWxlID0gb3MucGF0aC5qb2luKGRpciwgIm9zLnB5IikKICAgICBpZiBvcy5wYXRoLmlzZmlsZShmaWxlKToKICAgICAgICAgdGVzdCA9IG9zLnBhdGguam9pbihkaXIsICJ0ZXN0IikKICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0ZXN0KToKZGlmZiAtLWdpdCBhL1BDL3RpeC5kaWZmIGIvUEMvdGl4LmRpZmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTI3MWYuLjAwMDAwMDAKLS0tIGEvUEMvdGl4LmRpZmYKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotZGlmZiAtdXIgdGl4LTguMS40L3dpbi9jb21tb24ubWFrIHRpeC04LjEuNC5uZXcvd2luL2NvbW1vbi5tYWsKLS0tLSB0aXgtOC4xLjQvd2luL2NvbW1vbi5tYWsJMjAwMi0xMi0xMSAwNzoxOTo0Mi4wMDAwMDAwMDAgKzAxMDAKLSsrKyB0aXgtOC4xLjQubmV3L3dpbi9jb21tb24ubWFrCTIwMDQtMDgtMDMgMjE6NDU6MDkuODU5Mzc1MDAwICswMjAwCi1AQCAtMTgsMTAgKzE4LDEwIEBACi0gIwkgICAgc3VwcG9ydCBmaWxlcwotICMKLSAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLVRDTF9WRVIgICAgICAgICAgPSA4LjMKLStUQ0xfVkVSICAgICAgICAgID0gOC40Ci0gSVRDTF9WRVIgICAgICAgICAgPSAKLSAKLS1JTlNUQUxMRElSICAgICAgPSBDOlxwcm9ncmF+MVx0Y2wKLStJTlNUQUxMRElSICAgICAgPSAuLlwuLlx0Y2x0awotIAotICFJRk5ERUYgVElYX0RFQlVHCi0gTk9ERUJVRyA9IDEKLUBAIC02MSw3ICs2MSw3IEBACi0gIUlGICIkKFRDTF9WRVIpIiA9PSAiOC40IgotIFRDTE1BSk9SPTgKLSBUQ0xNSU5PUj00Ci0tVENMUEFUQ0g9MQotK1RDTFBBVENIPTcKLSBUTVBESVIgICAgICAgICAgPSB0ayQoVENMX1ZFUikKLSAhRU5ESUYKLSAKLUBAIC0xNzYsMTQgKzE3NiwxNCBAQAotIAkkKFRNUERJUilcdGl4V2luV20ub2JqCi0gCi0gUk1ESVIJCT0gJChUQ0xESVIpXHdpblxybWQuYmF0Ci0tTUtESVIJCT0gJChUQ0xESVIpXHdpblxta2QuYmF0Ci0rTUtESVIJCT0gbWtkaXIKLSBSTQkJPSBkZWwKLSAKLSBpbnN0YWxsOiAgICBpbnN0YWxsLWJpbmFyaWVzIGluc3RhbGwtbGlicmFyaWVzCi0gCi0gaW5zdGFsbC1iaW5hcmllczogJChUQ0xTSCkKLS0JJChNS0RJUikgIiQoQklOX0lOU1RBTExfRElSKSIKLS0JJChNS0RJUikgIiQoTElCX0lOU1RBTExfRElSKSIKLSsJLSQoTUtESVIpICIkKEJJTl9JTlNUQUxMX0RJUikiCi0rCS0kKE1LRElSKSAiJChMSUJfSU5TVEFMTF9ESVIpIgotIAlAZWNobyBpbnN0YWxsaW5nICQoVElYRExMKQotIAlAY29weSAiJChUSVhETEwpIiAiJChCSU5fSU5TVEFMTF9ESVIpIgotIAlAY29weSAiJChUSVhMSUIpIiAiJChMSUJfSU5TVEFMTF9ESVIpIgotZGlmZiAtdXIgdGl4LTguMS40L3dpbi9tYWtlZmlsZS52YyB0aXgtOC4xLjQubmV3L3dpbi9tYWtlZmlsZS52YwotLS0tIHRpeC04LjEuNC93aW4vbWFrZWZpbGUudmMJMjAwMi0xMi0wMiAwNDowMjo1NC4wMDAwMDAwMDAgKzAxMDAKLSsrKyB0aXgtOC4xLjQubmV3L3dpbi9tYWtlZmlsZS52YwkyMDA0LTA4LTAzIDIxOjQyOjA3Ljk1MzEyNTAwMCArMDIwMAotQEAgLTU0LDEyICs1NCwxMSBAQAotIERCR1ggPSBkCi0gIUVORElGCi0gCi0tY2MzMiAgID0gIiQoVE9PTFMzMilcYmluXGNsLmV4ZSIKLS1yYzMyICAgPSAiJChUT09MUzMyX3JjKVxiaW5ccmMuZXhlIgotLWxpbmszMiA9ICIkKFRPT0xTMzIpXGJpblxsaW5rLmV4ZSIKLS1pbmNsdWRlMzIgPSAtSSIkKFRPT0xTMzIpXGluY2x1ZGUiCi0rY2MzMiAgID0gImNsLmV4ZSIKLStyYzMyICAgPSAicmMuZXhlIgotK2xpbmszMiA9ICJsaW5rLmV4ZSIKLSAKLS1USVhfSU5DTFVERVMgPSAkKGluY2x1ZGUzMikgXAotK1RJWF9JTkNMVURFUyA9IFwKLSAJLUkkKFJPT1QpXHdpbiAtSSQoUk9PVClcZ2VuZXJpYyBcCi0gCS1JJChUS0RJUilcZ2VuZXJpYyAtSSQoVEtESVIpXHdpbiAtSSQoVEtESVIpXHhsaWIgXAotIAktSSQoVENMRElSKVxnZW5lcmljICQoSVRDTF9DRkxBR1MpCi1AQCAtMTcxLDcgKzE3MCw3IEBACi0gIwotIGN2YXJzZGxsICA9IC1EX1g4Nl89MSAtRFdJTjMyIC1EX1dJTjMyIC1EX01UIC1EX0RMTAotIGNmbGFnc2RsbCA9ICQoY3ZhcnNkbGwpIC1jIC1XMyAtbm9sb2dvIC1GcCQoVE1QRElSKVwgLVlYIC1NRCBcCi0tCSAgICAtT3RpIC1HcyAtR0QKLSsJICAgIC1PdGkgLUdzIC1HZAotIAotICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAjIFByb2plY3Qgc3BlY2lmaWMgdGFyZ2V0cwotQEAgLTE4MSw3ICsxODAsNiBAQAotIAotICQoRFVNUEVYVFMpOiAkKFdJTkRJUilcd2luRHVtcEV4dHMuYwotIAkkKGNjMzIpICQoQ09OX0NGTEFHUykgLUZvJChUTVBESVIpXCAvYyAkPwotLQlzZXQgTElCPSIkKFRPT0xTMzIpXGxpYiIKLSAJJChsaW5rMzIpICQobGRlYnVnKSAkKGNvbmxmbGFncykgJChndWlsaWJzKSAtb3V0OiRAIFwKLSAJCSQoVE1QRElSKVx3aW5EdW1wRXh0cy5vYmogCi0gCi1AQCAtMTkzLDcgKzE5MSw2IEBACi0gIyAoVG9EbykgJChUSVhETEwpIGRvZXNuJ3QgaGF2ZSByZXNvdXJjZXMgdG8gZGVmaW5lIGl0cyBpY29uLCBldGMuCi0gIwotICQoVElYRExMKTogJChUSVhPQkpTKSAkKFRNUERJUilcdGl4dmMuZGVmCi0tCXNldCBMSUI9IiQoVE9PTFMzMilcbGliIgotIAkkKGxpbmszMikgJChsZGVidWcpICQoZGxsbGZsYWdzKSAtZGVmOiQoVE1QRElSKVx0aXh2Yy5kZWYgXAotIAkJJChUS0xJQkRJUilcJChUS0xJQikgJChUQ0xMSUJESVIpXCQoVENMTElCKSAkKGd1aWxpYnNkbGwpIFwKLSAJCSQoSVRDTF9MSUJTKSAtb3V0OiRAIEA8PAotQEAgLTIwMiw3ICsxOTksNiBAQAotIAotIAotICQoVElYV0lTSCk6ICQoV0lTSE9CSlMpICQoVElYT0JKUykgJChUSVhMSUIpICQoVE1QRElSKVx0aXh3aXNoLnJlcwotLQlzZXQgTElCPSIkKFRPT0xTMzIpXGxpYiIKLSAJJChsaW5rMzIpICQobGRlYnVnKSAkKGd1aWxmbGFncykgXAotIAkJJChXSVNIT0JKUykgJChUTVBESVIpXHRpeHdpc2gucmVzICQoVElYTElCKSBcCi0gCQkkKFRLTElCRElSKVwkKFRLTElCKSAkKFRDTExJQkRJUilcJChUQ0xMSUIpICQoZ3VpbGlic2RsbCkgXAotZGlmZiAtdXIgdGl4LTguMS40L3dpbi90azguNC9wa2dJbmRleC50Y2wgdGl4LTguMS40Lm5ldy93aW4vdGs4LjQvcGtnSW5kZXgudGNsCi0tLS0gdGl4LTguMS40L3dpbi90azguNC9wa2dJbmRleC50Y2wJMjAwMi0xMi0xNSAwNDoyMTo1NC4wMDAwMDAwMDAgKzAxMDAKLSsrKyB0aXgtOC4xLjQubmV3L3dpbi90azguNC9wa2dJbmRleC50Y2wJMjAwNC0wOC0zMSAwODozODo0My45MjE4NzUwMDAgKzAyMDAKLUBAIC0xNSw3ICsxNSw3IEBACi0gIyBXZSBsb29rIGluIHRoZSAuLi8uLi9iaW4gZGlyZWN0b3J5IChhbiBpbnN0YWxsZWQgVGNsKQotIGxhcHBlbmQgZGlycyAuLi8uLi9iaW4KLSAjIFdlIGxvb2sgaW4gdGhlIC4uLy4uL0RMTHMgZGlyZWN0b3J5IChhbiBpbnN0YWxsZWQgUHl0aG9uKQotLWxhcHBlbmQgZGlycyAuLi8uLi9EbGxzCi0rbGFwcGVuZCBkaXJzIFtmaWxlIGpvaW4gW2ZpbGUgZGlybmFtZSBbaW5mbyBuYW1lb2ZleGVdXSBETExzXQotICMgSWYgbm90LCB0aGlzIHBrZ0luZGV4LnRjbCB3aWxsIHByb2JhYmx5IGZhaWwuCi0gCi0gCmRpZmYgLS1naXQgYS9QQ2J1aWxkL19jdHlwZXMudmNwcm9qIGIvUENidWlsZC9fY3R5cGVzLnZjcHJvagppbmRleCA3NjUxOGU2Li40OTkwYzllIDEwMDY0NAotLS0gYS9QQ2J1aWxkL19jdHlwZXMudmNwcm9qCisrKyBiL1BDYnVpbGQvX2N0eXBlcy52Y3Byb2oKQEAgLTMzLDEyICszMywxNCBAQAogCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL0VYUE9SVDpEbGxHZXRDbGFzc09iamVjdCxQUklWQVRFIC9FWFBPUlQ6RGxsQ2FuVW5sb2FkTm93LFBSSVZBVEUiCiAJCQkJT3V0cHV0RmlsZT0iLi9fY3R5cGVzX2QucHlkIgogCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiCiAJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIgogCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fY3R5cGVzX2QucGRiIgogCQkJCVN1YlN5c3RlbT0iMCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDFBMDAwMCIKIAkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX2N0eXBlc19kLmxpYiIKIAkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+CiAJCQk8VG9vbApAQCAtODUsNiArODcsNyBAQAogCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL0VYUE9SVDpEbGxHZXRDbGFzc09iamVjdCxQUklWQVRFIC9FWFBPUlQ6RGxsQ2FuVW5sb2FkTm93LFBSSVZBVEUiCiAJCQkJT3V0cHV0RmlsZT0iLi9fY3R5cGVzLnB5ZCIKIAkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgpAQCAtOTMsNiArOTYsNyBAQAogCQkJCVN1YlN5c3RlbT0iMCIKIAkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjAiCiAJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDFBMDAwMCIKIAkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX2N0eXBlcy5saWIiCiAJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPgogCQkJPFRvb2wKQEAgLTE0Miw3ICsxNDYsNyBAQAogCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKLQkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOkFNRDY0IC9VU0VMSU5LOk1TX1NESyIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOkFNRDY0IC9VU0VMSU5LOk1TX1NESyAvRVhQT1JUOkRsbEdldENsYXNzT2JqZWN0LFBSSVZBVEUgL0VYUE9SVDpEbGxDYW5VbmxvYWROb3csUFJJVkFURSIKIAkJCQlPdXRwdXRGaWxlPSIuL19jdHlwZXMucHlkIgogCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiCkBAIC0xNTEsNiArMTU1LDcgQEAKIAkJCQlTdWJTeXN0ZW09IjAiCiAJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIwIgogCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjAiCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxQTAwMDAiCiAJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19jdHlwZXMubGliIgogCQkJCVRhcmdldE1hY2hpbmU9IjAiLz4KIAkJCTxUb29sCkBAIC0yMDAsNyArMjA1LDcgQEAKIAkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgogCQkJPFRvb2wKIAkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCi0JCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpJQTY0IC9VU0VMSU5LOk1TX1NESyIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOklBNjQgL1VTRUxJTks6TVNfU0RLIC9FWFBPUlQ6RGxsR2V0Q2xhc3NPYmplY3QsUFJJVkFURSAvRVhQT1JUOkRsbENhblVubG9hZE5vdyxQUklWQVRFIgogCQkJCU91dHB1dEZpbGU9Ii4vX2N0eXBlcy5weWQiCiAJCQkJTGlua0luY3JlbWVudGFsPSIxIgogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIKQEAgLTIwOSw2ICsyMTQsNyBAQAogCQkJCVN1YlN5c3RlbT0iMCIKIAkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjAiCiAJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDFBMDAwMCIKIAkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX2N0eXBlcy5saWIiCiAJCQkJVGFyZ2V0TWFjaGluZT0iMCIvPgogCQkJPFRvb2wKZGlmZiAtLWdpdCBhL1BDYnVpbGQvX3NxbGl0ZTMudmNwcm9qIGIvUENidWlsZC9fc3FsaXRlMy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiMWE5YgotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQvX3NxbGl0ZTMudmNwcm9qCkBAIC0wLDAgKzEsMjg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iNy4xMCIKKwlOYW1lPSJfc3FsaXRlMyIKKwlQcm9qZWN0R1VJRD0iezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0iCisJU2NjUHJvamVjdE5hbWU9Il9zcWxpdGUzIgorCVNjY0xvY2FsUGF0aD0iLi4iPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiLz4KKwk8L1BsYXRmb3Jtcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLWRlYnVnXF9zcWxpdGUzIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGU7Li5cUEM7Li5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO1dJTjMyO19XSU5ET1dTO01PRFVMRV9OQU1FPVwmcXVvdDtzcWxpdGUzXCZxdW90OyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ29tcGlsZUFzPSIwIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxzcWxpdGUtc291cmNlLTMuMy40XHNxbGl0ZTMubGliIgorCQkJCU91dHB1dEZpbGU9Ii4vX3NxbGl0ZTNfZC5weWQiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIKKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fc3FsaXRlM19kLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjIiCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxODAwMDAiCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19zcWxpdGUzX2QubGliIgorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLXJlbGVhc2VcX3NxbGl0ZTMiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZTsuLlxQQzsuLlwuLlxzcWxpdGUtc291cmNlLTMuMy40IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X1dJTkRPV1M7TU9EVUxFX05BTUU9XCZxdW90O3NxbGl0ZTNcJnF1b3Q7IgorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNvbXBpbGVBcz0iMCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iLi5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNFxzcWxpdGUzLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIuL19zcWxpdGUzLnB5ZCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19zcWxpdGUzLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjIiCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxODAwMDAiCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19zcWxpdGUzLmxpYiIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuLy4iCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5caWE2NC10ZW1wLXJlbGVhc2VcX3NxbGl0ZTMiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19JVEFOSVVNIgorCQkJCU9wdGltaXphdGlvbj0iMiIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSJ7TVNTREtQQVRIfVxpbmNsdWRlXFdpbjY0XGF0bDt7TVNTREtQQVRIfVxpbmNsdWRlXFdpbjY0XGNydDt7TVNTREtQQVRIfVxpbmNsdWRlXFdpbjY0XGNydFxzeXM7e01TU0RLUEFUSH1caW5jbHVkZVxXaW42NFxtZmM7Li5cSW5jbHVkZTsuLlxQQzsuLlwuLlxzcWxpdGUtc291cmNlLTMuMy40IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X1dJTkRPV1M7TU9EVUxFX05BTUU9XCZxdW90O3NxbGl0ZTNcJnF1b3Q7IgorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9IkZBTFNFIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJUUlVFIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ29tcGlsZUFzPSIwIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOklBNjQgL1VTRUxJTks6TVNfU0RLIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXHNxbGl0ZS1zb3VyY2UtMy4zLjRcaWE2NFxzcWxpdGUzLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIuL19zcWxpdGUzLnB5ZCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19zcWxpdGUzLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjIiCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxODAwMDAiCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19zcWxpdGUzLmxpYiIKKwkJCQlUYXJnZXRNYWNoaW5lPSIwIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2VBTUQ2NHxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLiIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iYW1kNjQtdGVtcC1yZWxlYXNlXF9zcWxpdGUzIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0ie01TU0RLUEFUSH1caW5jbHVkZVxXaW42NFxhdGxcYW1kNjQ7e01TU0RLUEFUSH1caW5jbHVkZVxXaW42NFxjcnRcYW1kNjQ7e01TU0RLUEFUSH1caW5jbHVkZVxXaW42NFxjcnRcYW1kNjRcc3lzO3tNU1NES1BBVEh9XGluY2x1ZGVcV2luNjRcbWZjXGFtZDY0Oy4uXEluY2x1ZGU7Li5cUEM7Li5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTO01PRFVMRV9OQU1FPVwmcXVvdDtzcWxpdGUzXCZxdW90OyIKKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJGQUxTRSIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iVFJVRSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNvbXBpbGVBcz0iMCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpBTUQ2NCAvVVNFTElOSzpNU19TREsiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iLi5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNFxhbWQ2NFxzcWxpdGUzLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIuL19zcWxpdGUzLnB5ZCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19zcWxpdGUzLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjIiCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxODAwMDAiCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19zcWxpdGUzLmxpYiIKKwkJCQlUYXJnZXRNYWNoaW5lPSIwIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxhZGFwdGVycy5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcY2FjaGUuYyI+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXGNvbm5lY3Rpb24uYyI+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXGNvbnZlcnRlcnMuYyI+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXGN1cnNvci5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcbWljcm9wcm90b2NvbHMuYyI+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXG1vZHVsZS5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVccHJlcGFyZV9wcm90b2NvbC5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVccm93LmMiPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxzdGF0ZW1lbnQuYyI+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXHV0aWwuYyI+CisJCTwvRmlsZT4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvX3NzbC5tYWsgYi9QQ2J1aWxkL19zc2wubWFrCmluZGV4IGMxNTBkNjUuLjJjNDdjNmIgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvX3NzbC5tYWsKKysrIGIvUENidWlsZC9fc3NsLm1hawpAQCAtMiwxNyArMiwxNyBAQAogIUlGREVGIERFQlVHCiBNT0RVTEU9X3NzbF9kLnB5ZAogVEVNUF9ESVI9eDg2LXRlbXAtZGVidWcvX3NzbAotQ0ZMQUdTPS9PZCAvWmkgL01EZCAvTERkIC9EREVCVUcgL0RfREVCVUcKK0NGTEFHUz0vT2QgL1ppIC9NRGQgL0xEZCAvRERFQlVHIC9EX0RFQlVHIC9EV0lOMzIKIFNTTF9MSUJfRElSPSQoU1NMX0RJUikvb3V0MzIuZGJnCiAhRUxTRQogTU9EVUxFPV9zc2wucHlkCiBURU1QX0RJUj14ODYtdGVtcC1yZWxlYXNlL19zc2wKLUNGTEFHUz0vT3ggL01EIC9MRAorQ0ZMQUdTPS9PeCAvTUQgL0xEIC9EV0lOMzIKIFNTTF9MSUJfRElSPSQoU1NMX0RJUikvb3V0MzIKICFFTkRJRgogCiBJTkNMVURFUz0tSSAuLi9JbmNsdWRlIC1JIC4uL1BDIC1JICQoU1NMX0RJUikvaW5jMzIKLUxJQlM9Z2RpMzIubGliIHdzb2NrMzIubGliIC9saWJwYXRoOiQoU1NMX0xJQl9ESVIpIGxpYmVheTMyLmxpYiBzc2xlYXkzMi5saWIKK0xJQlM9Z2RpMzIubGliIHdzb2NrMzIubGliIHVzZXIzMi5saWIgYWR2YXBpMzIubGliIC9saWJwYXRoOiQoU1NMX0xJQl9ESVIpIGxpYmVheTMyLmxpYiBzc2xlYXkzMi5saWIKIAogU09VUkNFPS4uL01vZHVsZXMvX3NzbC5jICQoU1NMX0xJQl9ESVIpL2xpYmVheTMyLmxpYiAkKFNTTF9MSUJfRElSKS9zc2xlYXkzMi5saWIKIApkaWZmIC0tZ2l0IGEvUENidWlsZC9kYi5idWlsZCBiL1BDYnVpbGQvZGIuYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4N2Y3NAotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQvZGIuYnVpbGQKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cHJvamVjdD4KKyA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVzY3JpcHRpb249IkJ1aWxkIGFsbCB0YXJnZXRzLiI+CisgICA8c29sdXRpb24gY29uZmlndXJhdGlvbj0icmVsZWFzZSI+CisgICAgIDxwcm9qZWN0cz4KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJkYl9zdGF0aWMudmNwcm9qIiAvPgorICAgICA8L3Byb2plY3RzPgorICAgPC9zb2x1dGlvbj4KKyA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvbWFrZV9idWlsZGluZm8uYyBiL1BDYnVpbGQvbWFrZV9idWlsZGluZm8uYwppbmRleCA5ZDJmOWYwLi40Y2ViZjQ1IDEwMDY0NAotLS0gYS9QQ2J1aWxkL21ha2VfYnVpbGRpbmZvLmMKKysrIGIvUENidWlsZC9tYWtlX2J1aWxkaW5mby5jCkBAIC0yNyw2ICsyNyw5IEBACiAJRFdPUkQgdHlwZSwgc2l6ZTsKIAlpZiAoX3N0YXQoIi5zdm4iLCAmc3QpIDwgMCkKIAkJcmV0dXJuIDA7CisJLyogQWxsb3cgc3VwcHJlc3Npb24gb2Ygc3Vid2NyZXYuZXhlIGludm9jYXRpb24gaWYgYSBub19zdWJ3Y3JldiBmaWxlIGlzIHByZXNlbnQuICovCisJaWYgKF9zdGF0KCJub19zdWJ3Y3JldiIsICZzdCkgPT0gMCkKKwkJcmV0dXJuIDA7CiAJaWYgKFJlZ09wZW5LZXkoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUyAmJgogCSAgICBSZWdPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUykKIAkJLyogVG9ydG9pc2Ugbm90IGluc3RhbGxlZCAqLwpkaWZmIC0tZ2l0IGEvUENidWlsZC9wY2J1aWxkLnNsbiBiL1BDYnVpbGQvcGNidWlsZC5zbG4KaW5kZXggODhkOGM0NS4uMjBkM2VjZiAxMDA2NDQKLS0tIGEvUENidWlsZC9wY2J1aWxkLnNsbgorKysgYi9QQ2J1aWxkL3BjYnVpbGQuc2xuCkBAIC05Niw2ICs5NiwxMiBAQAogRW5kUHJvamVjdAogUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJfY3R5cGVzX3Rlc3QiLCAiX2N0eXBlc190ZXN0LnZjcHJvaiIsICJ7OENGMzM0RDktNEY4Mi00MkVCLTk3QUYtODM1OTJDNUFGRDJGfSIKIAlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXtGMjJGNDBGNC1EMzE4LTQwREMtOTZCMy04OERDODFDRTA4OTR9ID0ge0YyMkY0MEY0LUQzMTgtNDBEQy05NkIzLTg4REM4MUNFMDg5NH0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJfc3FsaXRlMyIsICJfc3FsaXRlMy52Y3Byb2oiLCAiezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0iCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorCQl7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fSA9IHtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9CiAJRW5kUHJvamVjdFNlY3Rpb24KIEVuZFByb2plY3QKIEdsb2JhbApAQCAtMjYwLDYgKzI2NiwxNCBAQAogCQl7OENGMzM0RDktNEY4Mi00MkVCLTk3QUYtODM1OTJDNUFGRDJGfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCiAJCXs4Q0YzMzREOS00RjgyLTQyRUItOTdBRi04MzU5MkM1QUZEMkZ9LlJlbGVhc2VBTUQ2NC5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzIKIAkJezhDRjMzNEQ5LTRGODItNDJFQi05N0FGLTgzNTkyQzVBRkQyRn0uUmVsZWFzZUl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZUl0YW5pdW18V2luMzIKKwkJezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXsyRkYwQTMxMi0yMkY5LTRDMzQtQjA3MC04NDI5MTZERTI3QTl9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXsyRkYwQTMxMi0yMkY5LTRDMzQtQjA3MC04NDI5MTZERTI3QTl9LlJlbGVhc2VBTUQ2NC5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzIKKwkJezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0uUmVsZWFzZUFNRDY0LkJ1aWxkLjAgPSBSZWxlYXNlQU1ENjR8V2luMzIKKwkJezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0uUmVsZWFzZUl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZUl0YW5pdW18V2luMzIKKwkJezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0uUmVsZWFzZUl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyCiAJRW5kR2xvYmFsU2VjdGlvbgogCUdsb2JhbFNlY3Rpb24oU29sdXRpb25JdGVtcykgPSBwb3N0U29sdXRpb24KIAkJLi5cTW9kdWxlc1xnZXRidWlsZGluZm8uYyA9IC4uXE1vZHVsZXNcZ2V0YnVpbGRpbmZvLmMKZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHl0aG9uLmJ1aWxkIGIvUENidWlsZC9weXRob24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiYmU4OQotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQvcHl0aG9uLmJ1aWxkCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHByb2plY3Q+CisgPHRhcmdldCBuYW1lPSJhbGwiIGRlc2NyaXB0aW9uPSJCdWlsZCBhbGwgdGFyZ2V0cy4iPgorICAgPHNvbHV0aW9uIGNvbmZpZ3VyYXRpb249InJlbGVhc2UiPgorICAgICA8cHJvamVjdHM+CisgICAgICAgPGluY2x1ZGUgbmFtZT0ibWFrZV92ZXJzaW9uaW5mby52Y3Byb2oiIC8+CisgICAgIDwvcHJvamVjdHM+CisgICA8L3NvbHV0aW9uPgorICAgPGV4ZWMgcHJvZ3JhbT0ibWFrZV92ZXJzaW9uaW5mbyIgb3V0cHV0PSJweXRob25udF9yYy5oIiAvPgorCisgICA8c29sdXRpb24gY29uZmlndXJhdGlvbj0icmVsZWFzZSIgc29sdXRpb25maWxlPSJwY2J1aWxkLnNsbiI+CisgICAgIDxleGNsdWRlcHJvamVjdHM+CisgICAgICAgPGluY2x1ZGUgbmFtZT0iX3RraW50ZXIudmNwcm9qIiAvPgorICAgICAgIDxpbmNsdWRlIG5hbWU9ImJ6Mi52Y3Byb2oiIC8+CisgICAgICAgPGluY2x1ZGUgbmFtZT0iX2JzZGRiLnZjcHJvaiIgLz4KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJfc3FsaXRlMy52Y3Byb2oiIC8+CisgICAgICAgPGluY2x1ZGUgbmFtZT0iX3NzbC52Y3Byb2oiIC8+CisgICAgIDwvZXhjbHVkZXByb2plY3RzPgorICAgPC9zb2x1dGlvbj4KKyA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3Byb2ogYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmNwcm9qCmluZGV4IGExYmIwZWQuLjNiZDc0MGYgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3Byb2oKKysrIGIvUENidWlsZC9weXRob25jb3JlLnZjcHJvagpAQCAtMyw3ICszLDcgQEAKIAlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKIAlWZXJzaW9uPSI3LjEwIgogCU5hbWU9InB5dGhvbmNvcmUiCi0JUHJvamVjdEdVSUQ9Ins3QUZBMUYwQi1BOEExLTQ1NUEtQTgzMi1CRjI2MzQwNEJCRUZ9IgorCVByb2plY3RHVUlEPSJ7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fSIKIAlSb290TmFtZXNwYWNlPSJweXRob25jb3JlIgogCVNjY1Byb2plY3ROYW1lPSJweXRob25jb3JlIgogCVNjY0xvY2FsUGF0aD0iLi4iPgpAQCAtNjIzLDcgKzYyMyw3IEBACiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcbWF0aG1vZHVsZS5jIj4KIAkJPC9GaWxlPgogCQk8RmlsZQotCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXG1kNWMuYyI+CisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcbWQ1LmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcbWQ1bW9kdWxlLmMiPgpAQCAtNzA3LDEyICs3MDcsNiBAQAogCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHJhbmdlb2JqZWN0LmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCi0JCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNccmVnZXhtb2R1bGUuYyI+Ci0JCTwvRmlsZT4KLQkJPEZpbGUKLQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xyZWdleHByLmMiPgotCQk8L0ZpbGU+Ci0JCTxGaWxlCiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNccmdiaW1nbW9kdWxlLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3JlYWRtZS50eHQgYi9QQ2J1aWxkL3JlYWRtZS50eHQKaW5kZXggNzZjMzE0ZC4uZTMwMzMxMyAxMDA2NDQKLS0tIGEvUENidWlsZC9yZWFkbWUudHh0CisrKyBiL1BDYnVpbGQvcmVhZG1lLnR4dApAQCAtNjQsMjcgKzY0LDIxIEBACiAKIF90a2ludGVyCiAgICAgUHl0aG9uIHdyYXBwZXIgZm9yIHRoZSBUayB3aW5kb3dpbmcgc3lzdGVtLiAgUmVxdWlyZXMgYnVpbGRpbmcKLSAgICBUY2wvVGsgZmlyc3QuICBGb2xsb3dpbmcgYXJlIGluc3RydWN0aW9ucyBmb3IgVGNsL1RrIDguNC43OyB0aGVzZQotICAgIHNob3VsZCB3b3JrIGZvciB2ZXJzaW9uIDguNC42IHRvbywgd2l0aCBzdWl0YWJsZSBzdWJzdGl0dXRpb25zOgorICAgIFRjbC9UayBmaXJzdC4gIEZvbGxvd2luZyBhcmUgaW5zdHJ1Y3Rpb25zIGZvciBUY2wvVGsgOC40LjEyLgogCiAgICAgR2V0IHNvdXJjZQogICAgIC0tLS0tLS0tLS0KLSAgICBHbyB0bwotICAgICAgICBodHRwOi8vcHJkb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L3RjbC8KLSAgICBhbmQgZG93bmxvYWQKLSAgICAgICAgdGNsODQ3LXNyYy56aXAKLSAgICAgICAgdGs4NDctc3JjLnppcAotICAgIFVuemlwIGludG8KLSAgICAgICAgZGlzdFx0Y2w4LjQuN1wKLSAgICAgICAgZGlzdFx0azguNC43XAotICAgIHJlc3BlY3RpdmVseS4KKyAgICBJbiB0aGUgZGlzdCBkaXJlY3RvcnksIHJ1bgorICAgIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL3RjbDguNC4xMgorICAgIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL3RrOC40LjEyCisgICAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvdGl4LTguNC4wCiAKICAgICBCdWlsZCBUY2wgZmlyc3QgKGRvbmUgaGVyZSB3LyBNU1ZDIDcuMSBvbiBXaW5kb3dzIFhQKQogICAgIC0tLS0tLS0tLS0tLS0tLQogICAgIFVzZSAiU3RhcnQgLT4gQWxsIFByb2dyYW1zIC0+IE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIC5ORVQgMjAwMwogICAgICAgICAgLT4gVmlzdWFsIFN0dWRpbyAuTkVUIFRvb2xzIC0+IFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzIENvbW1hbmQgUHJvbXB0IgogICAgIHRvIGdldCBhIHNoZWxsIHdpbmRvdyB3aXRoIHRoZSBjb3JyZWN0IGVudmlyb25tZW50IHNldHRpbmdzCi0gICAgY2QgZGlzdFx0Y2w4LjQuN1x3aW4KKyAgICBjZCBkaXN0XHRjbDguNC4xMlx3aW4KICAgICBubWFrZSAtZiBtYWtlZmlsZS52YwogICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIElOU1RBTExESVI9Li5cLi5cdGNsdGsgaW5zdGFsbAogCkBAIC05OSw5ICs5Myw5IEBACiAKICAgICBCdWlsZCBUawogICAgIC0tLS0tLS0tCi0gICAgY2QgZGlzdFx0azguNC43XHdpbgotICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIFRDTERJUj0uLlwuLlx0Y2w4LjQuNwotICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIFRDTERJUj0uLlwuLlx0Y2w4LjQuNyBJTlNUQUxMRElSPS4uXC4uXHRjbHRrIGluc3RhbGwKKyAgICBjZCBkaXN0XHRrOC40LjEyXHdpbgorICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIFRDTERJUj0uLlwuLlx0Y2w4LjQuMTIKKyAgICBubWFrZSAtZiBtYWtlZmlsZS52YyBUQ0xESVI9Li5cLi5cdGNsOC40LjEyIElOU1RBTExESVI9Li5cLi5cdGNsdGsgaW5zdGFsbAogCiAgICAgWFhYIFNob3VsZCB3ZSBjb21waWxlIHdpdGggT1BUUz10aHJlYWRzPwogCkBAIC0xMDksNyArMTAzLDcgQEAKICAgICBYWFggZGlyZWN0b3J5LiAgSXMgYWxsIG9mIHRoYXQgcmVhbGx5IG5lZWRlZCBmb3IgUHl0aG9uIHVzZSBvZiBUY2wvVGs/CiAKICAgICBPcHRpb25hbDogIHJ1biB0ZXN0cywgdmlhCi0gICAgICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIFRDTERJUj0uLlwuLlx0Y2w4LjQuNyB0ZXN0CisgICAgICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIFRDTERJUj0uLlwuLlx0Y2w4LjQuMTIgdGVzdAogCiAgICAgICAgIE9uIFdpblhQIFBybywgd2hvbGx5IHVwIHRvIGRhdGUgYXMgb2YgMzAtQXVnLTIwMDQ6CiAgICAgICAgIGFsbC50Y2w6ICAgICAgICBUb3RhbCAgIDg0MjAgICAgUGFzc2VkICA2ODI2ICAgIFNraXBwZWQgMTU4MSAgICBGYWlsZWQgIDEzCkBAIC0xMTgsMTIgKzExMiw5IEBACiAKICAgIEJ1aWx0IFRpeAogICAgLS0tLS0tLS0tCi0gICBEb3dubG9hZCBmcm9tIGh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvdGl4L3RpeC04LjEuNC50YXIuZ3oKLSAgIGNkIGRpc3RcdGl4LTguMS40Ci0gICBbY3lnd2luXXBhdGNoIC1wMSA8IC4uXC4uXHB5dGhvblxQQ1x0aXguZGlmZgotICAgY2Qgd2luCi0gICBubWFrZSAtZiBtYWtlZmlsZS52YwotICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgaW5zdGFsbAorICAgY2QgZGlzdFx0aXgtOC40LjBcd2luCisgICBubWFrZSAtZiBweXRob24ubWFrCisgICBubWFrZSAtZiBweXRob24ubWFrIGluc3RhbGwKIAogYnoyCiAgICAgUHl0aG9uIHdyYXBwZXIgZm9yIHRoZSBsaWJiejIgY29tcHJlc3Npb24gbGlicmFyeS4gIEhvbWVwYWdlCkBAIC0yMjMsMjMgKzIxNCwyNCBAQAogICAgICAgdGFyZ2V0ICgiUmVsZWFzZSBJQTY0IiBmb3IgSXRhbml1bSwgIlJlbGVhc2UgQU1ENjQiIGZvciBBTUQ2NCksIGUuZy4KICAgICBkZXZlbnYgZGItNC40LjIwXGJ1aWxkX3dpbjMyXEJlcmtlbGV5X0RCLnNsbiAvYnVpbGQgIlJlbGVhc2UgQU1ENjQiIC9wcm9qZWN0IGRiX3N0YXRpYyAvdXNlZW52CiAKK19zcWxpdGUzCisgICAgUHl0aG9uIHdyYXBwZXIgZm9yIFNRTGl0ZSBsaWJyYXJ5LgorICAgIAorICAgIEdldCB0aGUgc291cmNlIGNvZGUgdGhyb3VnaAorICAgIAorICAgIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL3NxbGl0ZS1zb3VyY2UtMy4zLjQKKyAgICAKKyAgICBUbyB1c2UgdGhlIGV4dGVuc2lvbiBtb2R1bGUgaW4gYSBQeXRob24gYnVpbGQgdHJlZSwgY29weSBzcWxpdGUzLmRsbCBpbnRvCisgICAgdGhlIFBDYnVpbGQgZm9sZGVyLgogCiBfc3NsCiAgICAgUHl0aG9uIHdyYXBwZXIgZm9yIHRoZSBzZWN1cmUgc29ja2V0cyBsaWJyYXJ5LgogCi0gICAgR2V0IHRoZSBsYXRlc3Qgc291cmNlIGNvZGUgZm9yIE9wZW5TU0wgZnJvbQotICAgICAgICBodHRwOi8vd3d3Lm9wZW5zc2wub3JnCisgICAgR2V0IHRoZSBzb3VyY2UgY29kZSB0aHJvdWdoCiAKLSAgICBZb3UgKHByb2JhYmx5KSBkb24ndCB3YW50IHRoZSAiZW5naW5lIiBjb2RlLiAgRm9yIGV4YW1wbGUsIGdldAotICAgICAgICBvcGVuc3NsLTAuOS43ZC50YXIuZ3oKLSAgICBub3QKLSAgICAgICAgb3BlbnNzbC1lbmdpbmUtMC45LjdkLnRhci5negorICAgIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL29wZW5zc2wtMC45LjhhCiAKLSAgICAoc2VlICMxMjMzMDQ5IGZvciB1c2luZyAwLjkuOCkuCi0gICAgVW5wYWNrIGludG8gdGhlICJkaXN0IiBkaXJlY3RvcnksIHJldGFpbmluZyB0aGUgZm9sZGVyIG5hbWUgZnJvbQotICAgIHRoZSBhcmNoaXZlIC0gZm9yIGV4YW1wbGUsIHRoZSBsYXRlc3Qgc3RhYmxlIE9wZW5TU0wgd2lsbCBpbnN0YWxsIGFzCi0gICAgICAgIGRpc3Qvb3BlbnNzbC0wLjkuN2QKLQorICAgIEFsdGVybmF0aXZlbHksIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnLgogICAgIFlvdSBjYW4gKHRoZW9yZXRpY2FsbHkpIHVzZSBhbnkgdmVyc2lvbiBvZiBPcGVuU1NMIHlvdSBsaWtlIC0gdGhlCiAgICAgYnVpbGQgcHJvY2VzcyB3aWxsIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBsYXRlc3QgdmVyc2lvbi4KIApAQCAtMjgxLDYgKzI3MywxNDMgQEAKIHRvIHRoZSBJdGFuaXVtIGNvbmZpZ3VyYXRpb247IG1ha2Ugc3VyZSB5b3UgdXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZgogdnNleHRjb21wLgogCitCdWlsZGluZyBQeXRob24gVXNpbmcgdGhlIGZyZWUgTVMgVG9vbGtpdCBDb21waWxlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGJ1aWxkIHByb2Nlc3MgZm9yIFZpc3VhbCBDKysgY2FuIGJlIHVzZWQgYWxtb3N0IHVuY2hhbmdlZCB3aXRoIHRoZSBmcmVlIE1TCitUb29sa2l0IENvbXBpbGVyLiBUaGlzIHByb3ZpZGVzIGEgd2F5IG9mIGJ1aWxkaW5nIFB5dGhvbiB1c2luZyBmcmVlbHkKK2F2YWlsYWJsZSBzb2Z0d2FyZS4KKworUmVxdWlyZW1lbnRzCisKKyAgICBUbyBidWlsZCBQeXRob24sIHRoZSBmb2xsb3dpbmcgdG9vbHMgYXJlIHJlcXVpcmVkOgorCisgICAgKiBUaGUgVmlzdWFsIEMrKyBUb29sa2l0IENvbXBpbGVyCisgICAgICAgIGZyb20gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS92aXN1YWxjL3ZjdG9vbGtpdDIwMDMvCisgICAgKiBBIHJlY2VudCBQbGF0Zm9ybSBTREsKKyAgICAgICAgZnJvbSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZG93bmxvYWRzL2RldGFpbHMuYXNweD9GYW1pbHlJRD00ODQyNjllMi0zYjg5LTQ3ZTMtOGViNy0xZjJiZTZkNzEyM2EKKyAgICAqIFRoZSAuTkVUIDEuMSBTREsKKyAgICAgICAgZnJvbSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZG93bmxvYWRzL2RldGFpbHMuYXNweD9GYW1pbHlJRD05YjNhMmNhNi0zNjQ3LTQwNzAtOWY0MS1hMzMzYzZiOTE4MWQKKworICAgIFtEb2VzIGFueW9uZSBoYXZlIGJldHRlciBVUkxzIGZvciB0aGUgbGFzdCAyIG9mIHRoZXNlP10KKworICAgIFRoZSB0b29sa2l0IGNvbXBpbGVyIGlzIG5lZWRlZCBhcyBpdCBpcyBhbiBvcHRpbWlzaW5nIGNvbXBpbGVyICh0aGUKKyAgICBjb21waWxlciBzdXBwbGllZCB3aXRoIHRoZSAuTkVUIFNESyBpcyBhIG5vbi1vcHRpbWlzaW5nIHZlcnNpb24pLiBUaGUKKyAgICBwbGF0Zm9ybSBTREsgaXMgbmVlZGVkIHRvIHByb3ZpZGUgdGhlIFdpbmRvd3MgaGVhZGVyIGZpbGVzIGFuZCBsaWJyYXJpZXMKKyAgICAodGhlIFdpbmRvd3MgMjAwMyBTZXJ2ZXIgU1AxIGVkaXRpb24sIHR5cGljYWwgaW5zdGFsbCwgaXMga25vd24gdG8gd29yayAtCisgICAgb3RoZXIgY29uZmlndXJhdGlvbnMgb3IgdmVyc2lvbnMgYXJlIHByb2JhYmx5IGZpbmUgYXMgd2VsbCkuIFRoZSAuTkVUIDEuMQorICAgIFNESyBpcyBuZWVkZWQgYmVjYXVzZSBpdCBjb250YWlucyBhIHZlcnNpb24gb2YgbXN2Y3J0LmRsbCB3aGljaCBsaW5rcyB0bworICAgIHRoZSBtc3ZjcjcxLmRsbCBDUlQuIE5vdGUgdGhhdCB0aGUgLk5FVCAyLjAgU0RLIGlzIE5PVCBhY2NlcHRhYmxlLCBhcyBpdAorICAgIHJlZmVyZW5jZXMgbXN2Y3I4MC5kbGwuCisKKyAgICBBbGwgb2YgdGhlIGFib3ZlIGl0ZW1zIHNob3VsZCBiZSBpbnN0YWxsZWQgYXMgbm9ybWFsLgorCisgICAgSWYgeW91IGludGVuZCB0byBidWlsZCB0aGUgb3BlbnNzbCAobmVlZGVkIGZvciB0aGUgX3NzbCBleHRlbnNpb24pIHlvdQorICAgIHdpbGwgbmVlZCB0aGUgQyBydW50aW1lIHNvdXJjZXMgaW5zdGFsbGVkIGFzIHBhcnQgb2YgdGhlIHBsYXRmb3JtIFNESy4KKworICAgIEluIGFkZGl0aW9uLCB5b3Ugd2lsbCBuZWVkIE5hbnQsIGF2YWlsYWJsZSBmcm9tCisgICAgaHR0cDovL25hbnQuc291cmNlZm9yZ2UubmV0LiBUaGUgMC44NSByZWxlYXNlIGNhbmRpZGF0ZSAzIHZlcnNpb24gaXMga25vd24KKyAgICB0byB3b3JrLiBUaGlzIGlzIHRoZSBsYXRlc3QgcmVsZWFzZWQgdmVyc2lvbiBhdCB0aGUgdGltZSBvZiB3cml0aW5nLiBMYXRlcgorICAgICJuaWdodGx5IGJ1aWxkIiB2ZXJzaW9ucyBhcmUga25vd24gTk9UIHRvIHdvcmsgLSBpdCBpcyBub3QgY2xlYXIgYXQKKyAgICBwcmVzZW50IHdoZXRoZXIgZnV0dXJlIHJlbGVhc2VkIHZlcnNpb25zIHdpbGwgd29yay4KKworU2V0dGluZyB1cCB0aGUgZW52aXJvbm1lbnQKKworICAgIFN0YXJ0IGEgcGxhdGZvcm0gU0RLICJidWlsZCBlbnZpcm9ubWVudCB3aW5kb3ciIGZyb20gdGhlIHN0YXJ0IG1lbnUuIFRoZQorICAgICJXaW5kb3dzIFhQIDMyLWJpdCByZXRhaWwiIHZlcnNpb24gaXMga25vd24gdG8gd29yay4KKworICAgIEFkZCB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIHRvIHlvdXIgUEFUSDoKKyAgICAgICAgKiBUaGUgdG9vbGtpdCBjb21waWxlciBkaXJlY3RvcnkKKyAgICAgICAgKiBUaGUgU0RLICJXaW42NCIgYmluYXJpZXMgZGlyZWN0b3J5CisJKiBUaGUgTmFudCBkaXJlY3RvcnkKKyAgICBBZGQgdG8geW91ciBJTkNMVURFIGVudmlyb25tZW50IHZhcmlhYmxlOgorICAgICAgICAqIFRoZSB0b29sa2l0IGNvbXBpbGVyIElOQ0xVREUgZGlyZWN0b3J5CisgICAgQWRkIHRvIHlvdXIgTElCIGVudmlyb25tZW50IHZhcmlhYmxlOgorICAgICAgICAqIFRoZSB0b29sa2l0IGNvbXBpbGVyIExJQiBkaXJlY3RvcnkKKwkqIFRoZSAuTkVUIFNESyBWaXN1YWwgU3R1ZGlvIDIwMDMgVkM3XGxpYiBkaXJlY3RvcnkKKworICAgIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgc2hvdWxkIHNldCB0aGluZ3MgdXAgYXMgeW91IG5lZWQgdGhlbToKKworICAgICAgICByZW0gU2V0IHRoZXNlIHZhbHVlcyBhY2NvcmRpbmcgdG8gd2hlcmUgeW91IGluc3RhbGxlZCB0aGUgc29mdHdhcmUKKyAgICAgICAgc2V0IFRPT0xLSVQ9QzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgVmlzdWFsIEMrKyBUb29sa2l0IDIwMDMKKyAgICAgICAgc2V0IFNESz1DOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBQbGF0Zm9ybSBTREsKKyAgICAgICAgc2V0IE5FVD1DOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIC5ORVQgMjAwMworICAgICAgICBzZXQgTkFOVD1DOlxVdGlsc1xOYW50CisKKyAgICAgICAgc2V0IFBBVEg9JVRPT0xLSVQlXGJpbjslUEFUSCU7JVNESyVcQmluXHdpbjY0OyVOQU5UJVxiaW4KKyAgICAgICAgc2V0IElOQ0xVREU9JVRPT0xLSVQlXGluY2x1ZGU7JUlOQ0xVREUlCisgICAgICAgIHNldCBMSUI9JVRPT0xLSVQlXGxpYjslTkVUJVxWQzdcbGliOyVMSUIlCisKKyAgICBUaGUgIndpbjY0IiBkaXJlY3RvcnkgZnJvbSB0aGUgU0RLIGlzIGFkZGVkIHRvIHN1cHBseSBleGVjdXRhYmxlcyBzdWNoIGFzCisgICAgImN2dHJlcyIgYW5kICJsaWIiLCB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSBlbHNld2hlcmUuIFRoZSB2ZXJzaW9ucyBpbiB0aGUKKyAgICAid2luNjQiIGRpcmVjdG9yeSBhcmUgMzItYml0IHByb2dyYW1zLCBzbyB0aGV5IGFyZSBmaW5lIHRvIHVzZSBoZXJlLgorCisgICAgVGhhdCdzIGl0LiBUbyBidWlsZCBQeXRob24gKHRoZSBjb3JlIG9ubHksIG5vIGJpbmFyeSBleHRlbnNpb25zIHdoaWNoCisgICAgZGVwZW5kIG9uIGV4dGVybmFsIGxpYnJhcmllcykgeW91IGp1c3QgbmVlZCB0byBpc3N1ZSB0aGUgY29tbWFuZAorCisgICAgICAgIG5hbnQgLWJ1aWxkZmlsZTpweXRob24uYnVpbGQgYWxsCisKKyAgICBmcm9tIHdpdGhpbiB0aGUgUENCdWlsZCBkaXJlY3RvcnkuCisKK0V4dGVuc2lvbiBtb2R1bGVzCisKKyAgICBUbyBidWlsZCB0aG9zZSBleHRlbnNpb24gbW9kdWxlcyB3aGljaCByZXF1aXJlIGV4dGVybmFsIGxpYnJhcmllcworICAgIChfdGtpbnRlciwgYnoyLCBfYnNkZGIsIF9zcWxpdGUzLCBfc3NsKSB5b3UgY2FuIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCisgICAgZm9yIHRoZSBWaXN1YWwgU3R1ZGlvIGJ1aWxkIGFib3ZlLCB3aXRoIGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMuIFRoZXNlCisgICAgaW5zdHJ1Y3Rpb25zIGhhdmUgb25seSBiZWVuIHRlc3RlZCB1c2luZyB0aGUgc291cmNlcyBpbiB0aGUgUHl0aG9uCisgICAgc3VidmVyc2lvbiByZXBvc2l0b3J5IC0gYnVpbGRpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2VzIHNob3VsZCB3b3JrLCBidXQKKyAgICBoYXMgbm90IGJlZW4gdGVzdGVkLgorCisgICAgRm9yIGVhY2ggZXh0ZW5zaW9uIG1vZHVsZSB5b3Ugd2lzaCB0byBidWlsZCwgeW91IHNob3VsZCByZW1vdmUgdGhlCisgICAgYXNzb2NpYXRlZCBpbmNsdWRlIGxpbmUgZnJvbSB0aGUgZXhjbHVkZXByb2plY3RzIHNlY3Rpb24gb2YgcGMuYnVpbGQuCisKKyAgICBUaGUgY2hhbmdlcyByZXF1aXJlZCBhcmU6CisKKyAgICBfdGtpbnRlcgorICAgICAgICBUaGUgdGl4IG1ha2VmaWxlICh0aXgtOC40LjBcd2luXG1ha2VmaWxlLnZjKSBtdXN0IGJlIG1vZGlmaWVkIHRvCisJcmVtb3ZlIHJlZmVyZW5jZXMgdG8gVE9PTFMzMi4gVGhlIHJlbGV2YW50IGxpbmVzIHNob3VsZCBiZSBjaGFuZ2VkIHRvCisJcmVhZDoKKyAgICAgICAgICAgIGNjMzIgPSBjbC5leGUKKyAgICAgICAgICAgIGxpbmszMiA9IGxpbmsuZXhlCisgICAgICAgICAgICBpbmNsdWRlMzIgPSAKKwlUaGUgcmVtYWluZGVyIG9mIHRoZSBidWlsZCBpbnN0cnVjdGlvbnMgd2lsbCB3b3JrIGFzIGdpdmVuLgorCisgICAgYnoyCisgICAgICAgIE5vIGNoYW5nZXMgYXJlIG5lZWRlZAorCisgICAgX2JzZGRiCisgICAgICAgIFRoZSBmaWxlIGRiLmJ1aWxkIHNob3VsZCBiZSBjb3BpZWQgZnJvbSB0aGUgUHl0aG9uIFBDQnVpbGQgZGlyZWN0b3J5CisJdG8gdGhlIGRpcmVjdG9yeSBkYi00LjQuMjBcYnVpbGRfd2luMzIuCisKKwlUaGUgZmlsZSBkYl9zdGF0aWMudmNwcm9qIGluIGRiLTQuNC4yMFxidWlsZF93aW4zMiBzaG91bGQgYmUgZWRpdGVkIHRvCisJcmVtb3ZlIHRoZSBzdHJpbmcgIiQoU29sdXRpb25EaXIpIiAtIHRoaXMgb2NjdXJzIGluIDIgcGxhY2VzLCBvbmx5CisJcmVsZXZhbnQgZm9yIDY0LWJpdCBidWlsZHMuIChUaGUgZWRpdCBpcyByZXF1aXJlZCBhcyBvdGhlcndpc2UsIG5hbnQKKwl3YW50cyB0byByZWFkIHRoZSBzb2x1dGlvbiBmaWxlLCB3aGljaCBpcyBub3QgaW4gYSBzdWl0YWJsZSBmb3JtKS4KKworCVRoZSBic2RkYiBsaWJyYXJ5IGNhbiB0aGVuIGJlIGJ1aWxkIHdpdGggdGhlIGNvbW1hbmQKKwkgICAgbmFudCAtYnVpbGRmaWxlOmRiLmJ1aWxkIGFsbAorCXJ1biBmcm9tIHRoZSBkYi00LjQuMjBcYnVpbGRfd2luMzIgZGlyZWN0b3J5LgorCisgICAgX3NxbGl0ZTMKKyAgICAgICAgTm8gY2hhbmdlcyBhcmUgbmVlZGVkLiBIb3dldmVyLCBpbiBvcmRlciBmb3IgdGhlIHRlc3RzIHRvIHN1Y2NlZWQsIGEKKwljb3B5IG9mIHNxbGl0ZTMuZGxsIG11c3QgYmUgZG93bmxvYWRlZCwgYW5kIHBsYWNlZCBhbG9uZ3NpZGUKKwlweXRob24uZXhlLgorCisgICAgX3NzbAorICAgICAgICBUaGUgZG9jdW1lbnRlZCBidWlsZCBwcm9jZXNzIHdvcmtzIGFzIHdyaXR0ZW4uIEhvd2V2ZXIsIGl0IG5lZWRzIGEKKwljb3B5IG9mIHRoZSBmaWxlIHNldGFyZ3Yub2JqLCB3aGljaCBpcyBub3Qgc3VwcGxpZWQgaW4gdGhlIHBsYXRmb3JtCisJU0RLLiBIb3dldmVyLCB0aGUgc291cmNlcyBhcmUgYXZhaWxhYmxlIChpbiB0aGUgY3J0IHNvdXJjZSBjb2RlKS4gVG8KKwlidWlsZCBzZXRhcmd2Lm9iaiwgcHJvY2VlZCBhcyBmb2xsb3dzOgorCisgICAgICAgIENvcHkgc2V0YXJndi5jLCBjcnVudGltZS5oIGFuZCBpbnRlcm5hbC5oIGZyb20gJVNESyVcc3JjXGNydCB0byBhCisJdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKwlDb21waWxlIHVzaW5nICJjbCAvYyAvSS4gL01EIC9EX0NSVEJMRCBzZXRhcmd2LmMiCisJQ29weSB0aGUgcmVzdWx0aW5nIHNldGFyZ3Yub2JqIHRvIHNvbWV3aGVyZSBvbiB5b3VyIExJQiBlbnZpcm9ubWVudAorCSglU0RLJVxsaWIgaXMgYSByZWFzb25hYmxlIHBsYWNlKS4KKworCVdpdGggc2V0YXJndi5vYmogaW4gcGxhY2UsIHRoZSBzdGFuZGFyZCBidWlsZCBwcm9jZXNzIHNob3VsZCB3b3JrCisJZmluZS4KKwogWU9VUiBPV04gRVhURU5TSU9OIERMTHMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBvd24gZXh0ZW5zaW9uIG1vZHVsZSBETEwsIHRoZXJlJ3MgYW4gZXhhbXBsZQpkaWZmIC0tZ2l0IGEvUGFyc2VyL1B5dGhvbi5hc2RsIGIvUGFyc2VyL1B5dGhvbi5hc2RsCmluZGV4IDQzOTdkODkuLjAwZGUzODEgMTAwNjQ0Ci0tLSBhL1BhcnNlci9QeXRob24uYXNkbAorKysgYi9QYXJzZXIvUHl0aG9uLmFzZGwKQEAgLTk4LDggKzk4LDExIEBACiAJY29tcHJlaGVuc2lvbiA9IChleHByIHRhcmdldCwgZXhwciBpdGVyLCBleHByKiBpZnMpCiAKIAktLSBub3Qgc3VyZSB3aGF0IHRvIGNhbGwgdGhlIGZpcnN0IGFyZ3VtZW50IGZvciByYWlzZSBhbmQgZXhjZXB0Ci0KLQlleGNlcHRoYW5kbGVyID0gKGV4cHI/IHR5cGUsIGV4cHI/IG5hbWUsIHN0bXQqIGJvZHkpCisJLS0gVE9ETyhqaHlsdG9uKTogRmlndXJlIG91dCBpZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgdG8gaGFuZGxlCisJLS0gICAgICAgICAgICAgICAgbGluZW5vIGFuZCBjb2xfb2Zmc2V0IGZpZWxkcywgcGFydGljdWxhcmx5IHdoZW4KKyAgICAgICAgLS0gICAgICAgICAgICAgICAgYXN0IGlzIGV4cG9zZWQgdG8gUHl0aG9uLgorCWV4Y2VwdGhhbmRsZXIgPSAoZXhwcj8gdHlwZSwgZXhwcj8gbmFtZSwgc3RtdCogYm9keSwgaW50IGxpbmVubywKKwkgICAgICAgICAgICAgICAgIGludCBjb2xfb2Zmc2V0KQogCiAJYXJndW1lbnRzID0gKGV4cHIqIGFyZ3MsIGlkZW50aWZpZXI/IHZhcmFyZywgCiAJCSAgICAgaWRlbnRpZmllcj8ga3dhcmcsIGV4cHIqIGRlZmF1bHRzKQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2FzZGxfYy5weSBiL1BhcnNlci9hc2RsX2MucHkKaW5kZXggYWQyMjA5ZC4uYjZkOTgzMCAxMDA3NTUKLS0tIGEvUGFyc2VyL2FzZGxfYy5weQorKysgYi9QYXJzZXIvYXNkbF9jLnB5CkBAIC0xNTUsOCArMTU1LDEwIEBACiAgICAgICAgICAgICB0eXBlID0gc3VtLnR5cGVzW2ldCiAgICAgICAgICAgICBlbnVtLmFwcGVuZCgiJXNfa2luZD0lZCIgJSAodHlwZS5uYW1lLCBpICsgMSkpCiAKKyAgICAgICAgZW1pdCgiZW51bSBfJShuYW1lKXNfa2luZCB7IiArICIsICIuam9pbihlbnVtKSArICJ9OyIpCisKICAgICAgICAgZW1pdCgic3RydWN0IF8lKG5hbWUpcyB7IikKLSAgICAgICAgZW1pdCgiZW51bSB7ICIgKyAiLCAiLmpvaW4oZW51bSkgKyAiIH0ga2luZDsiLCBkZXB0aCArIDEpCisgICAgICAgIGVtaXQoImVudW0gXyUobmFtZSlzX2tpbmQga2luZDsiLCBkZXB0aCArIDEpCiAgICAgICAgIGVtaXQoInVuaW9uIHsiLCBkZXB0aCArIDEpCiAgICAgICAgIGZvciB0IGluIHN1bS50eXBlczoKICAgICAgICAgICAgIHNlbGYudmlzaXQodCwgZGVwdGggKyAyKQpAQCAtMTg2LDcgKzE4OCwxMCBAQAogICAgICAgICBjdHlwZSA9IGdldF9jX3R5cGUoZmllbGQudHlwZSkKICAgICAgICAgbmFtZSA9IGZpZWxkLm5hbWUKICAgICAgICAgaWYgZmllbGQuc2VxOgotICAgICAgICAgICAgc2VsZi5lbWl0KCJhc2RsX3NlcSAqJShuYW1lKXM7IiAlIGxvY2FscygpLCBkZXB0aCkKKyAgICAgICAgICAgIGlmIGZpZWxkLnR5cGUudmFsdWUgaW4gKCdjbXBvcCcsKToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoImFzZGxfaW50X3NlcSAqJShuYW1lKXM7IiAlIGxvY2FscygpLCBkZXB0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCJhc2RsX3NlcSAqJShuYW1lKXM7IiAlIGxvY2FscygpLCBkZXB0aCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZW1pdCgiJShjdHlwZSlzICUobmFtZSlzOyIgJSBsb2NhbHMoKSwgZGVwdGgpCiAKQEAgLTIzMiw3ICsyMzcsMTAgQEAKICAgICAgICAgICAgICAgICBuYW1lID0gZi5uYW1lCiAgICAgICAgICAgICAjIFhYWCBzaG91bGQgZXh0ZW5kIGdldF9jX3R5cGUoKSB0byBoYW5kbGUgdGhpcwogICAgICAgICAgICAgaWYgZi5zZXE6Ci0gICAgICAgICAgICAgICAgY3R5cGUgPSAiYXNkbF9zZXEgKiIKKyAgICAgICAgICAgICAgICBpZiBmLnR5cGUudmFsdWUgaW4gKCdjbXBvcCcsKToKKyAgICAgICAgICAgICAgICAgICAgY3R5cGUgPSAiYXNkbF9pbnRfc2VxICoiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY3R5cGUgPSAiYXNkbF9zZXEgKiIKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgY3R5cGUgPSBnZXRfY190eXBlKGYudHlwZSkKICAgICAgICAgICAgIGFyZ3MuYXBwZW5kKChjdHlwZSwgbmFtZSwgZi5vcHQgb3IgZi5zZXEpKQpAQCAtMjc2LDcgKzI4NCw3IEBACiAgICAgICAgIGVtaXQoIiVzIHA7IiAlIGN0eXBlLCAxKQogICAgICAgICBmb3IgYXJndHlwZSwgYXJnbmFtZSwgb3B0IGluIGFyZ3M6CiAgICAgICAgICAgICAjIFhYWCBoYWNrIGFsZXJ0OiBmYWxzZSBpcyBhbGxvd2VkIGZvciBhIGJvb2wKLSAgICAgICAgICAgIGlmIG5vdCBvcHQgYW5kIG5vdCBhcmd0eXBlID09ICJib29sIjoKKyAgICAgICAgICAgIGlmIG5vdCBvcHQgYW5kIG5vdCAoYXJndHlwZSA9PSAiYm9vbCIgb3IgYXJndHlwZSA9PSAiaW50Iik6CiAgICAgICAgICAgICAgICAgZW1pdCgiaWYgKCElcykgeyIgJSBhcmduYW1lLCAxKQogICAgICAgICAgICAgICAgIGVtaXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCIsIDIpCiAgICAgICAgICAgICAgICAgbXNnID0gImZpZWxkICVzIGlzIHJlcXVpcmVkIGZvciAlcyIgJSAoYXJnbmFtZSwgbmFtZSkKQEAgLTQxMywxMCArNDIxLDEwIEBACiAKIHN0YXRpYyBpbnQgYWRkX2F0dHJpYnV0ZXMoUHlUeXBlT2JqZWN0KiB0eXBlLCBjaGFyKiphdHRycywgaW50IG51bV9maWVsZHMpCiB7Ci0gICAgaW50IGk7CisgICAgaW50IGksIHJlc3VsdDsKICAgICBQeU9iamVjdCAqcywgKmwgPSBQeUxpc3RfTmV3KG51bV9maWVsZHMpOwogICAgIGlmICghbCkgcmV0dXJuIDA7Ci0gICAgZm9yKGk9MDsgaSA8IG51bV9maWVsZHM7IGkrKykgeworICAgIGZvcihpID0gMDsgaSA8IG51bV9maWVsZHM7IGkrKykgewogICAgICAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhdHRyc1tpXSk7CiAgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgUHlfREVDUkVGKGwpOwpAQCAtNDI0LDcgKzQzMiw5IEBACiAgICAgICAgIH0KICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGwsIGksIHMpOwogICAgIH0KLSAgICByZXR1cm4gUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QqKXR5cGUsICJfYXR0cmlidXRlcyIsIGwpID49MDsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKChQeU9iamVjdCopdHlwZSwgIl9hdHRyaWJ1dGVzIiwgbCkgPj0gMDsKKyAgICBQeV9ERUNSRUYobCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0KiBhc3Qyb2JqX2xpc3QoYXNkbF9zZXEgKnNlcSwgUHlPYmplY3QqICgqZnVuYykodm9pZCopKQpAQCAtNDY1LDkgKzQ3NSw5IEBACiB9CiAiIiIsIDAsIHJlZmxvdz1GYWxzZSkKIAotICAgICAgICBzZWxmLmVtaXQoInN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7IiwgMCkKICAgICAgICAgc2VsZi5lbWl0KCJzdGF0aWMgaW50IGluaXRfdHlwZXModm9pZCkiLDApCiAgICAgICAgIHNlbGYuZW1pdCgieyIsIDApCisgICAgICAgIHNlbGYuZW1pdCgic3RhdGljIGludCBpbml0aWFsaXplZDsiLCAxKQogICAgICAgICBzZWxmLmVtaXQoImlmIChpbml0aWFsaXplZCkgcmV0dXJuIDE7IiwgMSkKICAgICAgICAgc2VsZi5lbWl0KCdBU1RfdHlwZSA9IG1ha2VfdHlwZSgiQVNUIiwgJlB5QmFzZU9iamVjdF9UeXBlLCBOVUxMLCAwKTsnLCAxKQogICAgICAgICBmb3IgZGZuIGluIG1vZC5kZm5zOgpAQCAtNTQzLDcgKzU1Myw3IEBACiAgICAgICAgIHNlbGYuYWRkT2JqKGNvbnMubmFtZSkKIAogICAgIGRlZiBhZGRPYmooc2VsZiwgbmFtZSk6Ci0gICAgICAgIHNlbGYuZW1pdCgnaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIiVzIiwgKFB5T2JqZWN0Kiklc190eXBlKSA8IDApIHJldHVybjsnICUgKG5hbWUsIG5hbWUpLCAxKQorICAgICAgICBzZWxmLmVtaXQoJ2lmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiJXMiLCAoUHlPYmplY3QqKSVzX3R5cGUpIDwgMCkgcmV0dXJuOycgJSAobmFtZSwgbmFtZSksIDEpCiAKIF9TUEVDSUFMSVpFRF9TRVFVRU5DRVMgPSAoJ3N0bXQnLCAnZXhwcicpCiAKQEAgLTY3Nyw4ICs2ODcsOCBAQAogICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgiaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7IiwgZGVwdGgrMSkKICAgICAgICAgICAgICAgICBzZWxmLmVtaXQoImZvcihpID0gMDsgaSA8IG47IGkrKykiLCBkZXB0aCsxKQogICAgICAgICAgICAgICAgICMgVGhpcyBjYW5ub3QgZmFpbCwgc28gbm8gbmVlZCBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgICAgICAgICAgICAgICBzZWxmLmVtaXQoIlB5TGlzdF9TRVRfSVRFTSh2YWx1ZSwgaSwgYXN0Mm9ial8lcygoJXNfdHkpYXNkbF9zZXFfR0VUKCVzLCBpKSkpOyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmllbGQudHlwZSwgZmllbGQudHlwZSwgdmFsdWUpLCBkZXB0aCsyLCByZWZsb3c9RmFsc2UpCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCJQeUxpc3RfU0VUX0lURU0odmFsdWUsIGksIGFzdDJvYmpfY21wb3AoKGNtcG9wX3R5KWFzZGxfc2VxX0dFVCglcywgaSkpKTsiICUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKzIsIHJlZmxvdz1GYWxzZSkKICAgICAgICAgICAgICAgICBzZWxmLmVtaXQoIn0iLCBkZXB0aCkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCJ2YWx1ZSA9IGFzdDJvYmpfbGlzdCglcywgYXN0Mm9ial8lcyk7IiAlICh2YWx1ZSwgZmllbGQudHlwZSksIGRlcHRoKQpAQCAtNzE2LDM5ICs3MjYsMzUgQEAKICAgICAgICAgc3lzLmV4aXQoMSkKICAgICBpZiBJTkNfRElSOgogICAgICAgICBwID0gIiVzLyVzLWFzdC5oIiAlIChJTkNfRElSLCBtb2QubmFtZSkKLSAgICBlbHNlOgotICAgICAgICBwID0gIiVzLWFzdC5oIiAlIG1vZC5uYW1lCi0gICAgZiA9IG9wZW4ocCwgIndiIikKLSAgICBwcmludCA+PiBmLCBhdXRvX2dlbl9tc2cKLSAgICBwcmludCA+PiBmLCAnI2luY2x1ZGUgImFzZGwuaCJcbicKLSAgICBjID0gQ2hhaW5PZlZpc2l0b3JzKFR5cGVEZWZWaXNpdG9yKGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0VmlzaXRvcihmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvdHlwZVZpc2l0b3IoZiksCi0gICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgYy52aXNpdChtb2QpCi0gICAgcHJpbnQgPj5mLCAiUHlPYmplY3QqIFB5QVNUX21vZDJvYmoobW9kX3R5IHQpOyIKLSAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IG9wZW4ocCwgIndiIikKKyAgICAgICAgcHJpbnQgPj4gZiwgYXV0b19nZW5fbXNnCisgICAgICAgIHByaW50ID4+IGYsICcjaW5jbHVkZSAiYXNkbC5oIlxuJworICAgICAgICBjID0gQ2hhaW5PZlZpc2l0b3JzKFR5cGVEZWZWaXNpdG9yKGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdFZpc2l0b3IoZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG90eXBlVmlzaXRvcihmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIGMudmlzaXQobW9kKQorICAgICAgICBwcmludCA+PmYsICJQeU9iamVjdCogUHlBU1RfbW9kMm9iaihtb2RfdHkgdCk7IgorICAgICAgICBmLmNsb3NlKCkKIAogICAgIGlmIFNSQ19ESVI6Ci0gICAgICAgIHAgPSAiJXMvJXMtYXN0LmMiICUgKFNSQ19ESVIsIG1vZC5uYW1lKQotICAgIGVsc2U6Ci0gICAgICAgIHAgPSAiJXMtYXN0LmMiICUgbW9kLm5hbWUKLSAgICBmID0gb3BlbihwLCAid2IiKQotICAgIHByaW50ID4+IGYsIGF1dG9fZ2VuX21zZwotICAgIHByaW50ID4+IGYsICcjaW5jbHVkZSAiUHl0aG9uLmgiJwotICAgIHByaW50ID4+IGYsICcjaW5jbHVkZSAiJXMtYXN0LmgiJyAlIG1vZC5uYW1lCi0gICAgcHJpbnQgPj4gZgotICAgIHByaW50ID4+ZiwgInN0YXRpYyBQeVR5cGVPYmplY3QqIEFTVF90eXBlOyIKLSAgICB2ID0gQ2hhaW5PZlZpc2l0b3JzKAotICAgICAgICAgICAgICAgICAgICAgICAgUHlUeXBlc0RlY2xhcmVWaXNpdG9yKGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlUeXBlc1Zpc2l0b3IoZiksCi0gICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblZpc2l0b3IoZiksCi0gICAgICAgICAgICAgICAgICAgICAgICBPYmpWaXNpdG9yKGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgQVNUTW9kdWxlVmlzaXRvcihmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpbmdTaG90cyhmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICB2LnZpc2l0KG1vZCkKLSAgICBmLmNsb3NlKCkKKyAgICAgICAgcCA9IG9zLnBhdGguam9pbihTUkNfRElSLCBzdHIobW9kLm5hbWUpICsgIi1hc3QuYyIpCisgICAgICAgIGYgPSBvcGVuKHAsICJ3YiIpCisgICAgICAgIHByaW50ID4+IGYsIGF1dG9fZ2VuX21zZworICAgICAgICBwcmludCA+PiBmLCAnI2luY2x1ZGUgIlB5dGhvbi5oIicKKyAgICAgICAgcHJpbnQgPj4gZiwgJyNpbmNsdWRlICIlcy1hc3QuaCInICUgbW9kLm5hbWUKKyAgICAgICAgcHJpbnQgPj4gZgorICAgICAgICBwcmludCA+PmYsICJzdGF0aWMgUHlUeXBlT2JqZWN0KiBBU1RfdHlwZTsiCisgICAgICAgIHYgPSBDaGFpbk9mVmlzaXRvcnMoCisgICAgICAgICAgICBQeVR5cGVzRGVjbGFyZVZpc2l0b3IoZiksCisgICAgICAgICAgICBQeVR5cGVzVmlzaXRvcihmKSwKKyAgICAgICAgICAgIEZ1bmN0aW9uVmlzaXRvcihmKSwKKyAgICAgICAgICAgIE9ialZpc2l0b3IoZiksCisgICAgICAgICAgICBBU1RNb2R1bGVWaXNpdG9yKGYpLAorICAgICAgICAgICAgUGFydGluZ1Nob3RzKGYpLAorICAgICAgICAgICAgKQorICAgICAgICB2LnZpc2l0KG1vZCkKKyAgICAgICAgZi5jbG9zZSgpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHN5cwpAQCAtNzU3LDYgKzc2Myw5IEBACiAgICAgSU5DX0RJUiA9ICcnCiAgICAgU1JDX0RJUiA9ICcnCiAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiaDpjOiIpCisgICAgaWYgbGVuKG9wdHMpICE9IDE6CisgICAgICAgIHByaW50ICJNdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgb3V0cHV0IGZpbGUiCisgICAgICAgIHN5cy5leGl0KDEpCiAgICAgZm9yIG8sIHYgaW4gb3B0czoKICAgICAgICAgaWYgbyA9PSAnLWgnOgogICAgICAgICAgICAgSU5DX0RJUiA9IHYKQEAgLTc2NCw0ICs3NzMsNSBAQAogICAgICAgICAgICAgU1JDX0RJUiA9IHYKICAgICBpZiBsZW4oYXJncykgIT0gMToKICAgICAgICAgcHJpbnQgIk11c3Qgc3BlY2lmeSBzaW5nbGUgaW5wdXQgZmlsZSIKKyAgICAgICAgc3lzLmV4aXQoMSkKICAgICBtYWluKGFyZ3NbMF0pCmRpZmYgLS1naXQgYS9QYXJzZXIvYml0c2V0LmMgYi9QYXJzZXIvYml0c2V0LmMKaW5kZXggMzgzNGUxOS4uYjU1NDNiOCAxMDA2NDQKLS0tIGEvUGFyc2VyL2JpdHNldC5jCisrKyBiL1BhcnNlci9iaXRzZXQuYwpAQCAtOCw3ICs4LDcgQEAKIG5ld2JpdHNldChpbnQgbmJpdHMpCiB7CiAJaW50IG5ieXRlcyA9IE5CWVRFUyhuYml0cyk7Ci0JYml0c2V0IHNzID0gUHlNZW1fTkVXKEJZVEUsIG5ieXRlcyk7CisJYml0c2V0IHNzID0gKGNoYXIgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKEJZVEUpICogIG5ieXRlcyk7CiAJCiAJaWYgKHNzID09IE5VTEwpCiAJCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgYml0c2V0Iik7CkBAIC0yMiw3ICsyMiw3IEBACiB2b2lkCiBkZWxiaXRzZXQoYml0c2V0IHNzKQogewotCVB5TWVtX0RFTChzcyk7CisJUHlPYmplY3RfRlJFRShzcyk7CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvUGFyc2VyL2ZpcnN0c2V0cy5jIGIvUGFyc2VyL2ZpcnN0c2V0cy5jCmluZGV4IDBmNGUwOWQuLjAwNDY3YjMgMTAwNjQ0Ci0tLSBhL1BhcnNlci9maXJzdHNldHMuYworKysgYi9QYXJzZXIvZmlyc3RzZXRzLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAluYml0cyA9IGctPmdfbGwubGxfbmxhYmVsczsKIAlyZXN1bHQgPSBuZXdiaXRzZXQobmJpdHMpOwogCQotCXN5bSA9IFB5TWVtX05FVyhpbnQsIDEpOworCXN5bSA9IChpbnQgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKGludCkpOwogCWlmIChzeW0gPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgc3ltIGluIGNhbGNmaXJzdHNldCIpOwogCW5zeW1zID0gMTsKQEAgLTczLDcgKzczLDggQEAKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoaiA+PSBuc3ltcykgeyAvKiBOZXcgbGFiZWwgKi8KLQkJCVB5TWVtX1JFU0laRShzeW0sIGludCwgbnN5bXMgKyAxKTsKKwkJCXN5bSA9IChpbnQgKilQeU9iamVjdF9SRUFMTE9DKHN5bSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIChuc3ltcyArIDEpKTsKIAkJCWlmIChzeW0gPT0gTlVMTCkKIAkJCQlQeV9GYXRhbEVycm9yKAogCQkJCSAgICAibm8gbWVtIHRvIHJlc2l6ZSBzeW0gaW4gY2FsY2ZpcnN0c2V0Iik7CkBAIC0xMDgsNSArMTA5LDUgQEAKIAkJcHJpbnRmKCIgfVxuIik7CiAJfQogCi0JUHlNZW1fRlJFRShzeW0pOworCVB5T2JqZWN0X0ZSRUUoc3ltKTsKIH0KZGlmZiAtLWdpdCBhL1BhcnNlci9ncmFtbWFyLmMgYi9QYXJzZXIvZ3JhbW1hci5jCmluZGV4IGQ4ZTM4OTcuLmIwZGFmZTcgMTAwNjQ0Ci0tLSBhL1BhcnNlci9ncmFtbWFyLmMKKysrIGIvUGFyc2VyL2dyYW1tYXIuYwpAQCAtMjAsNyArMjAsNyBAQAogewogCWdyYW1tYXIgKmc7CiAJCi0JZyA9IFB5TWVtX05FVyhncmFtbWFyLCAxKTsKKwlnID0gKGdyYW1tYXIgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKGdyYW1tYXIpKTsKIAlpZiAoZyA9PSBOVUxMKQogCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIG5ldyBncmFtbWFyIik7CiAJZy0+Z19uZGZhcyA9IDA7CkBAIC0zNyw3ICszNyw4IEBACiB7CiAJZGZhICpkOwogCQotCVB5TWVtX1JFU0laRShnLT5nX2RmYSwgZGZhLCBnLT5nX25kZmFzICsgMSk7CisJZy0+Z19kZmEgPSAoZGZhICopUHlPYmplY3RfUkVBTExPQyhnLT5nX2RmYSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZmEpICogKGctPmdfbmRmYXMgKyAxKSk7CiAJaWYgKGctPmdfZGZhID09IE5VTEwpCiAJCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgZGZhIGluIGFkZGRmYSIpOwogCWQgPSAmZy0+Z19kZmFbZy0+Z19uZGZhcysrXTsKQEAgLTU1LDcgKzU2LDggQEAKIHsKIAlzdGF0ZSAqczsKIAkKLQlQeU1lbV9SRVNJWkUoZC0+ZF9zdGF0ZSwgc3RhdGUsIGQtPmRfbnN0YXRlcyArIDEpOworCWQtPmRfc3RhdGUgPSAoc3RhdGUgKilQeU9iamVjdF9SRUFMTE9DKGQtPmRfc3RhdGUsCisJCQkJICAgICAgc2l6ZW9mKHN0YXRlKSAqIChkLT5kX25zdGF0ZXMgKyAxKSk7CiAJaWYgKGQtPmRfc3RhdGUgPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBzdGF0ZSBpbiBhZGRzdGF0ZSIpOwogCXMgPSAmZC0+ZF9zdGF0ZVtkLT5kX25zdGF0ZXMrK107CkBAIC03OCw3ICs4MCw3IEBACiAJYXNzZXJ0KDAgPD0gdG8gJiYgdG8gPCBkLT5kX25zdGF0ZXMpOwogCQogCXMgPSAmZC0+ZF9zdGF0ZVtmcm9tXTsKLQlQeU1lbV9SRVNJWkUocy0+c19hcmMsIGFyYywgcy0+c19uYXJjcyArIDEpOworCXMtPnNfYXJjID0gKGFyYyAqKVB5T2JqZWN0X1JFQUxMT0Mocy0+c19hcmMsIHNpemVvZihhcmMpICogKHMtPnNfbmFyY3MgKyAxKSk7CiAJaWYgKHMtPnNfYXJjID09IE5VTEwpCiAJCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgYXJjIGxpc3QgaW4gYWRkYXJjIik7CiAJYSA9ICZzLT5zX2FyY1tzLT5zX25hcmNzKytdOwpAQCAtOTcsNyArOTksOCBAQAogCQkJc3RyY21wKGxsLT5sbF9sYWJlbFtpXS5sYl9zdHIsIHN0cikgPT0gMCkKIAkJCXJldHVybiBpOwogCX0KLQlQeU1lbV9SRVNJWkUobGwtPmxsX2xhYmVsLCBsYWJlbCwgbGwtPmxsX25sYWJlbHMgKyAxKTsKKwlsbC0+bGxfbGFiZWwgPSAobGFiZWwgKilQeU9iamVjdF9SRUFMTE9DKGxsLT5sbF9sYWJlbCwKKwkJCQkJc2l6ZW9mKGxhYmVsKSAqIChsbC0+bGxfbmxhYmVscyArIDEpKTsKIAlpZiAobGwtPmxsX2xhYmVsID09IE5VTEwpCiAJCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgbGFiZWxsaXN0IGluIGFkZGxhYmVsIik7CiAJbGIgPSAmbGwtPmxsX2xhYmVsW2xsLT5sbF9ubGFiZWxzKytdOwpAQCAtMTk1LDcgKzE5OCw3IEBACiAJCQkJbmFtZV9sZW4gPSBwIC0gc3JjOwogCQkJZWxzZQogCQkJCW5hbWVfbGVuID0gc3RybGVuKHNyYyk7Ci0JCQlkZXN0ID0gbWFsbG9jKG5hbWVfbGVuICsgMSk7CisJCQlkZXN0ID0gKGNoYXIgKiltYWxsb2MobmFtZV9sZW4gKyAxKTsKIAkJCXN0cm5jcHkoZGVzdCwgc3JjLCBuYW1lX2xlbik7CiAJCQlkZXN0W25hbWVfbGVuXSA9ICdcMCc7CiAJCQlmcmVlKGxiLT5sYl9zdHIpOwpkaWZmIC0tZ2l0IGEvUGFyc2VyL215cmVhZGxpbmUuYyBiL1BhcnNlci9teXJlYWRsaW5lLmMKaW5kZXggYTkzMmE4Ny4uMzJhMTA4OCAxMDA2NDQKLS0tIGEvUGFyc2VyL215cmVhZGxpbmUuYworKysgYi9QYXJzZXIvbXlyZWFkbGluZS5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAlzaXplX3QgbjsKIAljaGFyICpwOwogCW4gPSAxMDA7Ci0JaWYgKChwID0gUHlNZW1fTUFMTE9DKG4pKSA9PSBOVUxMKQorCWlmICgocCA9IChjaGFyICopUHlNZW1fTUFMTE9DKG4pKSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlmZmx1c2goc3lzX3N0ZG91dCk7CiAjaWZuZGVmIFJJU0NPUwpAQCAtMTQxLDcgKzE0MSw3IEBACiAJbiA9IHN0cmxlbihwKTsKIAl3aGlsZSAobiA+IDAgJiYgcFtuLTFdICE9ICdcbicpIHsKIAkJc2l6ZV90IGluY3IgPSBuKzI7Ci0JCXAgPSBQeU1lbV9SRUFMTE9DKHAsIG4gKyBpbmNyKTsKKwkJcCA9IChjaGFyICopUHlNZW1fUkVBTExPQyhwLCBuICsgaW5jcik7CiAJCWlmIChwID09IE5VTEwpCiAJCQlyZXR1cm4gTlVMTDsKIAkJaWYgKGluY3IgPiBJTlRfTUFYKSB7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAkJCWJyZWFrOwogCQluICs9IHN0cmxlbihwK24pOwogCX0KLQlyZXR1cm4gUHlNZW1fUkVBTExPQyhwLCBuKzEpOworCXJldHVybiAoY2hhciAqKVB5TWVtX1JFQUxMT0MocCwgbisxKTsKIH0KIAogCmRpZmYgLS1naXQgYS9QYXJzZXIvbm9kZS5jIGIvUGFyc2VyL25vZGUuYwppbmRleCA3ZWQ2YzBlLi45N2Y4ODdhIDEwMDY0NAotLS0gYS9QYXJzZXIvbm9kZS5jCisrKyBiL1BhcnNlci9ub2RlLmMKQEAgLTYyLDcgKzYyLDcgQEAKICAqIFdpbjk4KS4KICAqCiAgKiBJbiBhIHJ1biBvZiBjb21waWxlYWxsIGFjcm9zcyB0aGUgMi4zYTAgTGliIGRpcmVjdG9yeSwgQW5kcmV3IE1hY0ludHlyZQotICogcmVwb3J0ZWQgdGhhdCwgd2l0aCB0aGlzIHNjaGVtZSwgODklIG9mIFB5TWVtX1JFU0laRSBjYWxscyBpbgorICogcmVwb3J0ZWQgdGhhdCwgd2l0aCB0aGlzIHNjaGVtZSwgODklIG9mIFB5T2JqZWN0X1JFQUxMT0MgY2FsbHMgaW4KICAqIFB5Tm9kZV9BZGRDaGlsZCBwYXNzZWQgMSBmb3IgdGhlIHNpemUsIGFuZCA5JSBwYXNzZWQgNC4gIFNvIHRoaXMgdXN1YWxseQogICogd2FzdGVzIHZlcnkgbGl0dGxlIG1lbW9yeSwgYnV0IGlzIHZlcnkgZWZmZWN0aXZlIGF0IHNpZGVzdGVwcGluZwogICogcGxhdGZvcm0tcmVhbGxvYyBkaXNhc3RlcnMgb24gdnVsbmVybmFibGUgcGxhdGZvcm1zLgpkaWZmIC0tZ2l0IGEvUGFyc2VyL3BhcnNlci5jIGIvUGFyc2VyL3BhcnNlci5jCmluZGV4IDIxMzQxMGMuLjQ1MzAyZWQgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wYXJzZXIuYworKysgYi9QYXJzZXIvcGFyc2VyLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAkKIAlpZiAoIWctPmdfYWNjZWwpCiAJCVB5R3JhbW1hcl9BZGRBY2NlbGVyYXRvcnMoZyk7Ci0JcHMgPSBQeU1lbV9ORVcocGFyc2VyX3N0YXRlLCAxKTsKKwlwcyA9IChwYXJzZXJfc3RhdGUgKilQeU1lbV9NQUxMT0Moc2l6ZW9mKHBhcnNlcl9zdGF0ZSkpOwogCWlmIChwcyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlwcy0+cF9ncmFtbWFyID0gZzsKQEAgLTg0LDcgKzg0LDcgQEAKICNlbmRpZgogCXBzLT5wX3RyZWUgPSBQeU5vZGVfTmV3KHN0YXJ0KTsKIAlpZiAocHMtPnBfdHJlZSA9PSBOVUxMKSB7Ci0JCVB5TWVtX0RFTChwcyk7CisJCVB5TWVtX0ZSRUUocHMpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJc19yZXNldCgmcHMtPnBfc3RhY2spOwpAQCAtOTgsNyArOTgsNyBAQAogCS8qIE5CIElmIHlvdSB3YW50IHRvIHNhdmUgdGhlIHBhcnNlIHRyZWUsCiAJICAgeW91IG11c3Qgc2V0IHBfdHJlZSB0byBOVUxMIGJlZm9yZSBjYWxsaW5nIGRlbHBhcnNlciEgKi8KIAlQeU5vZGVfRnJlZShwcy0+cF90cmVlKTsKLQlQeU1lbV9ERUwocHMpOworCVB5TWVtX0ZSRUUocHMpOwogfQogCiAKZGlmZiAtLWdpdCBhL1BhcnNlci9wZ2VuLmMgYi9QYXJzZXIvcGdlbi5jCmluZGV4IGU2NDNkMzMuLmRmZTdjYWMgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wZ2VuLmMKKysrIGIvUGFyc2VyL3BnZW4uYwpAQCAtNDksNyArNDksOCBAQAogewogCW5mYXN0YXRlICpzdDsKIAkKLQlQeU1lbV9SRVNJWkUobmYtPm5mX3N0YXRlLCBuZmFzdGF0ZSwgbmYtPm5mX25zdGF0ZXMgKyAxKTsKKwluZi0+bmZfc3RhdGUgPSAobmZhc3RhdGUgKilQeU9iamVjdF9SRUFMTE9DKG5mLT5uZl9zdGF0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmZhc3RhdGUpICogKG5mLT5uZl9uc3RhdGVzICsgMSkpOwogCWlmIChuZi0+bmZfc3RhdGUgPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOwogCXN0ID0gJm5mLT5uZl9zdGF0ZVtuZi0+bmZfbnN0YXRlcysrXTsKQEAgLTY1LDcgKzY2LDggQEAKIAluZmFhcmMgKmFyOwogCQogCXN0ID0gJm5mLT5uZl9zdGF0ZVtmcm9tXTsKLQlQeU1lbV9SRVNJWkUoc3QtPnN0X2FyYywgbmZhYXJjLCBzdC0+c3RfbmFyY3MgKyAxKTsKKwlzdC0+c3RfYXJjID0gKG5mYWFyYyAqKVB5T2JqZWN0X1JFQUxMT0Moc3QtPnN0X2FyYywKKwkJCQkgICAgICBzaXplb2YobmZhYXJjKSAqIChzdC0+c3RfbmFyY3MgKyAxKSk7CiAJaWYgKHN0LT5zdF9hcmMgPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOwogCWFyID0gJnN0LT5zdF9hcmNbc3QtPnN0X25hcmNzKytdOwpAQCAtNzksNyArODEsNyBAQAogCW5mYSAqbmY7CiAJc3RhdGljIGludCB0eXBlID0gTlRfT0ZGU0VUOyAvKiBBbGwgdHlwZXMgd2lsbCBiZSBkaXNqdW5jdCAqLwogCQotCW5mID0gUHlNZW1fTkVXKG5mYSwgMSk7CisJbmYgPSAobmZhICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihuZmEpKTsKIAlpZiAobmYgPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgbmZhIik7CiAJbmYtPm5mX3R5cGUgPSB0eXBlKys7CkBAIC0xMDQsNyArMTA2LDcgQEAKIHsKIAluZmFncmFtbWFyICpncjsKIAkKLQlnciA9IFB5TWVtX05FVyhuZmFncmFtbWFyLCAxKTsKKwlnciA9IChuZmFncmFtbWFyICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihuZmFncmFtbWFyKSk7CiAJaWYgKGdyID09IE5VTEwpCiAJCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IG5mYSBncmFtbWFyIik7CiAJZ3ItPmdyX25uZmFzID0gMDsKQEAgLTEyMSw3ICsxMjMsOCBAQAogCW5mYSAqbmY7CiAJCiAJbmYgPSBuZXduZmEobmFtZSk7Ci0JUHlNZW1fUkVTSVpFKGdyLT5ncl9uZmEsIG5mYSAqLCBnci0+Z3Jfbm5mYXMgKyAxKTsKKwlnci0+Z3JfbmZhID0gKG5mYSAqKilQeU9iamVjdF9SRUFMTE9DKGdyLT5ncl9uZmEsCisJCQkJICAgICAgc2l6ZW9mKG5mYSkgKiAoZ3ItPmdyX25uZmFzICsgMSkpOwogCWlmIChnci0+Z3JfbmZhID09IE5VTEwpCiAJCVB5X0ZhdGFsRXJyb3IoIm91dCBvZiBtZW0iKTsKIAlnci0+Z3JfbmZhW2dyLT5ncl9ubmZhcysrXSA9IG5mOwpAQCAtMzYxLDcgKzM2NCw3IEBACiB0eXBlZGVmIHN0cnVjdCBfc3Nfc3RhdGUgewogCWJpdHNldAlzc19zczsKIAlpbnQJc3NfbmFyY3M7Ci0Jc3NfYXJjCSpzc19hcmM7CisJc3RydWN0IF9zc19hcmMJKnNzX2FyYzsKIAlpbnQJc3NfZGVsZXRlZDsKIAlpbnQJc3NfZmluaXNoOwogCWludAlzc19yZW5hbWU7CkBAIC0zOTIsNyArMzk1LDcgQEAKIAkKIAlzcyA9IG5ld2JpdHNldChuYml0cyk7CiAJYWRkY2xvc3VyZShzcywgbmYsIG5mLT5uZl9zdGFydCk7Ci0JeHhfc3RhdGUgPSBQeU1lbV9ORVcoc3Nfc3RhdGUsIDEpOworCXh4X3N0YXRlID0gKHNzX3N0YXRlICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihzc19zdGF0ZSkpOwogCWlmICh4eF9zdGF0ZSA9PSBOVUxMKQogCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIHh4X3N0YXRlIGluIG1ha2VkZmEiKTsKIAl4eF9uc3RhdGVzID0gMTsKQEAgLTQxMSw2ICs0MTQsNyBAQAogCiAJLyogRm9yIGVhY2ggdW5tYXJrZWQgc3RhdGUuLi4gKi8KIAlmb3IgKGlzdGF0ZSA9IDA7IGlzdGF0ZSA8IHh4X25zdGF0ZXM7ICsraXN0YXRlKSB7CisJCXNpemVfdCBzaXplOwogCQl5eSA9ICZ4eF9zdGF0ZVtpc3RhdGVdOwogCQlzcyA9IHl5LT5zc19zczsKIAkJLyogRm9yIGFsbCBpdHMgc3RhdGVzLi4uICovCkBAIC00MzAsOCArNDM0LDkgQEAKIAkJCQkJCWdvdG8gZm91bmQ7CiAJCQkJfQogCQkJCS8qIEFkZCBuZXcgYXJjIGZvciB0aGlzIHN0YXRlICovCi0JCQkJUHlNZW1fUkVTSVpFKHl5LT5zc19hcmMsIHNzX2FyYywKLQkJCQkJICAgICB5eS0+c3NfbmFyY3MgKyAxKTsKKwkJCQlzaXplID0gc2l6ZW9mKHNzX2FyYykgKiAoeXktPnNzX25hcmNzICsgMSk7CisJCQkJeXktPnNzX2FyYyA9IChzc19hcmMgKilQeU9iamVjdF9SRUFMTE9DKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXktPnNzX2FyYywgc2l6ZSk7CiAJCQkJaWYgKHl5LT5zc19hcmMgPT0gTlVMTCkKIAkJCQkJUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOwogCQkJCXp6ID0gJnl5LT5zc19hcmNbeXktPnNzX25hcmNzKytdOwpAQCAtNDUzLDcgKzQ1OCw5IEBACiAJCQkJCWdvdG8gZG9uZTsKIAkJCQl9CiAJCQl9Ci0JCQlQeU1lbV9SRVNJWkUoeHhfc3RhdGUsIHNzX3N0YXRlLCB4eF9uc3RhdGVzICsgMSk7CisJCQlzaXplID0gc2l6ZW9mKHNzX3N0YXRlKSAqICh4eF9uc3RhdGVzICsgMSk7CisJCQl4eF9zdGF0ZSA9IChzc19zdGF0ZSAqKVB5T2JqZWN0X1JFQUxMT0MoeHhfc3RhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKIAkJCWlmICh4eF9zdGF0ZSA9PSBOVUxMKQogCQkJCVB5X0ZhdGFsRXJyb3IoIm91dCBvZiBtZW0iKTsKIAkJCXp6LT5zYV9hcnJvdyA9IHh4X25zdGF0ZXM7CmRpZmYgLS1naXQgYS9QYXJzZXIvcGdlbm1haW4uYyBiL1BhcnNlci9wZ2VubWFpbi5jCmluZGV4IDY5NWUyYjcuLmZjMjdhMmMgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wZ2VubWFpbi5jCisrKyBiL1BhcnNlci9wZ2VubWFpbi5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkJCQkJcHV0YygnICcsIHN0ZGVycik7CiAJCQl9CiAJCQlmcHJpbnRmKHN0ZGVyciwgIl5cbiIpOwotCQkJUHlNZW1fREVMKGVyci50ZXh0KTsKKwkJCVB5T2JqZWN0X0ZSRUUoZXJyLnRleHQpOwogCQl9CiAJCVB5X0V4aXQoMSk7CiAJfQpAQCAtMTM2LDcgKzEzNiw3IEBACiBQeU9TX1JlYWRsaW5lKEZJTEUgKnN5c19zdGRpbiwgRklMRSAqc3lzX3N0ZG91dCwgY2hhciAqcHJvbXB0KQogewogCXNpemVfdCBuID0gMTAwMDsKLQljaGFyICpwID0gUHlNZW1fTUFMTE9DKG4pOworCWNoYXIgKnAgPSAoY2hhciAqKVB5TWVtX01BTExPQyhuKTsKIAljaGFyICpxOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJbiA9IHN0cmxlbihwKTsKIAlpZiAobiA+IDAgJiYgcFtuLTFdICE9ICdcbicpCiAJCXBbbi0xXSA9ICdcbic7Ci0JcmV0dXJuIFB5TWVtX1JFQUxMT0MocCwgbisxKTsKKwlyZXR1cm4gKGNoYXIgKilQeU1lbV9SRUFMTE9DKHAsIG4rMSk7CiB9CiAKIC8qIE5vLW5vbnNlbnNlIGZnZXRzICovCmRpZmYgLS1naXQgYS9QYXJzZXIvdG9rZW5pemVyLmMgYi9QYXJzZXIvdG9rZW5pemVyLmMKaW5kZXggMDYzMWNhMy4uZDlkY2M0MSAxMDA2NDQKLS0tIGEvUGFyc2VyL3Rva2VuaXplci5jCisrKyBiL1BhcnNlci90b2tlbml6ZXIuYwpAQCAtMTA1LDcgKzEwNSw4IEBACiBzdGF0aWMgc3RydWN0IHRva19zdGF0ZSAqCiB0b2tfbmV3KHZvaWQpCiB7Ci0Jc3RydWN0IHRva19zdGF0ZSAqdG9rID0gUHlNZW1fTkVXKHN0cnVjdCB0b2tfc3RhdGUsIDEpOworCXN0cnVjdCB0b2tfc3RhdGUgKnRvayA9IChzdHJ1Y3QgdG9rX3N0YXRlICopUHlNZW1fTUFMTE9DKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB0b2tfc3RhdGUpKTsKIAlpZiAodG9rID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCXRvay0+YnVmID0gdG9rLT5jdXIgPSB0b2stPmVuZCA9IHRvay0+aW5wID0gdG9rLT5zdGFydCA9IE5VTEw7CkBAIC0xNjMsNyArMTY0LDcgQEAKIHsKIAl0b2stPmRlY29kaW5nX2VycmVkID0gMTsKIAlpZiAodG9rLT5mcCAhPSBOVUxMICYmIHRvay0+YnVmICE9IE5VTEwpIC8qIHNlZSBQeVRva2VuaXplcl9GcmVlICovCi0JCVB5TWVtX0RFTCh0b2stPmJ1Zik7CisJCVB5TWVtX0ZSRUUodG9rLT5idWYpOwogCXRvay0+YnVmID0gTlVMTDsKIAlyZXR1cm4gTlVMTDsJCS8qIGFzIGlmIGl0IHdlcmUgRU9GICovCiB9CkBAIC0xNzEsNyArMTcyLDcgQEAKIHN0YXRpYyBjaGFyICoKIG5ld19zdHJpbmcoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7Ci0JY2hhciogcmVzdWx0ID0gUHlNZW1fTkVXKGNoYXIsIGxlbiArIDEpOworCWNoYXIqIHJlc3VsdCA9IChjaGFyICopUHlNZW1fTUFMTE9DKGxlbiArIDEpOwogCWlmIChyZXN1bHQgIT0gTlVMTCkgewogCQltZW1jcHkocmVzdWx0LCBzLCBsZW4pOwogCQlyZXN1bHRbbGVuXSA9ICdcMCc7CkBAIC0yMzYsNyArMjM3LDcgQEAKIAkJCQljaGFyKiByID0gbmV3X3N0cmluZyhiZWdpbiwgdCAtIGJlZ2luKTsKIAkJCQljaGFyKiBxID0gZ2V0X25vcm1hbF9uYW1lKHIpOwogCQkJCWlmIChyICE9IHEpIHsKLQkJCQkJUHlNZW1fREVMKHIpOworCQkJCQlQeU1lbV9GUkVFKHIpOwogCQkJCQlyID0gbmV3X3N0cmluZyhxLCBzdHJsZW4ocSkpOwogCQkJCX0KIAkJCQlyZXR1cm4gcjsKQEAgLTI3NywxOCArMjc4LDE4IEBACiAJCQkJCXRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAtMTsKIAkJCQl9CiAJCQkJZWxzZQotCQkJCQlQeU1lbV9ERUwoY3MpOworCQkJCQlQeU1lbV9GUkVFKGNzKTsKICNlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdpdGhvdXQgVW5pY29kZSBzdXBwb3J0LCB3ZSBjYW5ub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyB0aGUgY29kaW5nIHNwZWMuIFNpbmNlIHRoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbid0IGJlIGFueSBVbmljb2RlIGxpdGVyYWxzLCB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbid0IG1hdHRlci4gKi8KLQkJCQlQeU1lbV9ERUwoY3MpOworCQkJCVB5TWVtX0ZSRUUoY3MpOwogI2VuZGlmCiAJCQl9CiAJCX0gZWxzZSB7CS8qIHRoZW4sIGNvbXBhcmUgY3Mgd2l0aCBCT00gKi8KIAkJCXIgPSAoc3RyY21wKHRvay0+ZW5jb2RpbmcsIGNzKSA9PSAwKTsKLQkJCVB5TWVtX0RFTChjcyk7CisJCQlQeU1lbV9GUkVFKGNzKTsKIAkJfQogCX0KIAlpZiAoIXIpIHsKQEAgLTMzNCw3ICszMzUsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAJaWYgKHRvay0+ZW5jb2RpbmcgIT0gTlVMTCkKLQkJUHlNZW1fREVMKHRvay0+ZW5jb2RpbmcpOworCQlQeU1lbV9GUkVFKHRvay0+ZW5jb2RpbmcpOwogCXRvay0+ZW5jb2RpbmcgPSBuZXdfc3RyaW5nKCJ1dGYtOCIsIDUpOwkvKiByZXN1bHRpbmcgaXMgaW4gdXRmLTggKi8KIAlyZXR1cm4gMTsKICAgTk9OX0JPTToKQEAgLTM0NSw3ICszNDYsNyBAQAogCiAvKiBSZWFkIGEgbGluZSBvZiB0ZXh0IGZyb20gVE9LIGludG8gUywgdXNpbmcgdGhlIHN0cmVhbSBpbiBUT0suCiAgICBSZXR1cm4gTlVMTCBvbiBmYWlsdXJlLCBlbHNlIFMuCi0gICAKKwogICAgT24gZW50cnksIHRvay0+ZGVjb2RpbmdfYnVmZmVyIHdpbGwgYmUgb25lIG9mOgogICAgICAxKSBOVUxMOiBuZWVkIHRvIGNhbGwgdG9rLT5kZWNvZGluZ19yZWFkbGluZSB0byBnZXQgYSBuZXcgbGluZQogICAgICAyKSBQeVVuaWNvZGVPYmplY3QgKjogZGVjb2RpbmdfZmVvZiBoYXMgY2FsbGVkIHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUgYW5kCkBAIC0zNTQsNyArMzU1LDcgQEAKICAgICAgICAgICAgKGluIHRoZSBzIGJ1ZmZlcikgdG8gY29weSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGxpbmUgcmVhZAogICAgICAgICAgICBieSB0b2stPmRlY29kaW5nX3JlYWRsaW5lLiAgdG9rLT5kZWNvZGluZ19idWZmZXIgaGFzIHRoZSBvdmVyZmxvdy4KICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBmcF9yZWFkbCBpcyBjYWxsZWQgaW4gYSBsb29wICh3aXRoIGFuIGV4cGFuZGVkIGJ1ZmZlcikKLSAgICAgICAgICAgdW50aWwgdGhlIGJ1ZmZlciBlbmRzIHdpdGggYSAnXG4nIChvciB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIAorICAgICAgICAgICB1bnRpbCB0aGUgYnVmZmVyIGVuZHMgd2l0aCBhICdcbicgKG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMKICAgICAgICAgICAgcmVhY2hlZCk6IHNlZSB0b2tfbmV4dGMgYW5kIGl0cyBjYWxscyB0byBkZWNvZGluZ19mZ2V0cy4KICovCiAKQEAgLTQ3MCw3ICs0NzEsNyBAQAogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAodG9rLT5kZWNvZGluZ19zdGF0ZSA+IDApIHsKIAkJCS8qIFdlIHdhbnQgYSAncmF3JyByZWFkLiAqLwotCQkJbGluZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhzLCBzaXplLCAKKwkJCWxpbmUgPSBQeV9Vbml2ZXJzYWxOZXdsaW5lRmdldHMocywgc2l6ZSwKIAkJCQkJCQl0b2stPmZwLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9IGVsc2UgewpAQCAtNTAyLDExICs1MDMsMTEgQEAKIAkJY2hhciBidWZbNTAwXTsKIAkJLyogTmVlZCB0byBhZGQgMSB0byB0aGUgbGluZSBudW1iZXIsIHNpbmNlIHRoaXMgbGluZQogCQkgICBoYXMgbm90IGJlZW4gY291bnRlZCwgeWV0LiAgKi8KLQkJc3ByaW50ZihidWYsIAorCQlzcHJpbnRmKGJ1ZiwKIAkJCSJOb24tQVNDSUkgY2hhcmFjdGVyICdcXHglLjJ4JyAiCiAJCQkiaW4gZmlsZSAlLjIwMHMgb24gbGluZSAlaSwgIgogCQkJImJ1dCBubyBlbmNvZGluZyBkZWNsYXJlZDsgIgotCQkJInNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcGVwcy9wZXAtMDI2My5odG1sIGZvciBkZXRhaWxzIiwgCisJCQkic2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wZXBzL3BlcC0wMjYzLmh0bWwgZm9yIGRldGFpbHMiLAogCQkJYmFkY2hhciwgdG9rLT5maWxlbmFtZSwgdG9rLT5saW5lbm8gKyAxKTsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLCBidWYpOwogCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7CkBAIC01MzcsMTMgKzUzOCwxNSBAQAogCiAvKiBGZXRjaCBhIGJ5dGUgZnJvbSBUT0ssIHVzaW5nIHRoZSBzdHJpbmcgYnVmZmVyLiAqLwogCi1zdGF0aWMgaW50IGJ1Zl9nZXRjKHN0cnVjdCB0b2tfc3RhdGUgKnRvaykgeworc3RhdGljIGludAorYnVmX2dldGMoc3RydWN0IHRva19zdGF0ZSAqdG9rKSB7CiAJcmV0dXJuIFB5X0NIQVJNQVNLKCp0b2stPnN0cisrKTsKIH0KIAogLyogVW5mZXRjaCBhIGJ5dGUgZnJvbSBUT0ssIHVzaW5nIHRoZSBzdHJpbmcgYnVmZmVyLiAqLwogCi1zdGF0aWMgdm9pZCBidWZfdW5nZXRjKGludCBjLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spIHsKK3N0YXRpYyB2b2lkCitidWZfdW5nZXRjKGludCBjLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spIHsKIAl0b2stPnN0ci0tOwogCWFzc2VydChQeV9DSEFSTUFTSygqdG9rLT5zdHIpID09IGMpOwkvKiB0b2stPmN1ciBtYXkgcG9pbnQgdG8gcmVhZC1vbmx5IHNlZ21lbnQgKi8KIH0KQEAgLTU1MSw3ICs1NTQsOCBAQAogLyogU2V0IHRoZSByZWFkbGluZSBmdW5jdGlvbiBmb3IgVE9LIHRvIEVOQy4gRm9yIHRoZSBzdHJpbmctYmFzZWQKICAgIHRva2VuaXplciwgdGhpcyBtZWFucyB0byBqdXN0IHJlY29yZCB0aGUgZW5jb2RpbmcuICovCiAKLXN0YXRpYyBpbnQgYnVmX3NldHJlYWRsKHN0cnVjdCB0b2tfc3RhdGUgKnRvaywgY29uc3QgY2hhciogZW5jKSB7CitzdGF0aWMgaW50CitidWZfc2V0cmVhZGwoc3RydWN0IHRva19zdGF0ZSAqdG9rLCBjb25zdCBjaGFyKiBlbmMpIHsKIAl0b2stPmVuYyA9IGVuYzsKIAlyZXR1cm4gMTsKIH0KQEAgLTY1Myw3ICs2NTcsNyBAQAogCXN0cnVjdCB0b2tfc3RhdGUgKnRvayA9IHRva19uZXcoKTsKIAlpZiAodG9rID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCWlmICgodG9rLT5idWYgPSBQeU1lbV9ORVcoY2hhciwgQlVGU0laKSkgPT0gTlVMTCkgeworCWlmICgodG9rLT5idWYgPSAoY2hhciAqKVB5TWVtX01BTExPQyhCVUZTSVopKSA9PSBOVUxMKSB7CiAJCVB5VG9rZW5pemVyX0ZyZWUodG9rKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNjcyLDE0ICs2NzYsMTQgQEAKIFB5VG9rZW5pemVyX0ZyZWUoc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewogCWlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpCi0JCVB5TWVtX0RFTCh0b2stPmVuY29kaW5nKTsKKwkJUHlNZW1fRlJFRSh0b2stPmVuY29kaW5nKTsKICNpZm5kZWYgUEdFTgogCVB5X1hERUNSRUYodG9rLT5kZWNvZGluZ19yZWFkbGluZSk7CiAJUHlfWERFQ1JFRih0b2stPmRlY29kaW5nX2J1ZmZlcik7CiAjZW5kaWYKIAlpZiAodG9rLT5mcCAhPSBOVUxMICYmIHRvay0+YnVmICE9IE5VTEwpCi0JCVB5TWVtX0RFTCh0b2stPmJ1Zik7Ci0JUHlNZW1fREVMKHRvayk7CisJCVB5TWVtX0ZSRUUodG9rLT5idWYpOworCVB5TWVtX0ZSRUUodG9rKTsKIH0KIAogI2lmICFkZWZpbmVkKFBHRU4pICYmIGRlZmluZWQoUHlfVVNJTkdfVU5JQ09ERSkKQEAgLTcxMSw3ICs3MTUsOSBAQAogCWlmICh1dGY4ID09IE5VTEwpCiAJCWdvdG8gZXJyb3JfY2xlYXI7CiAKLQljb252ZXJ0ZWQgPSBuZXdfc3RyaW5nKFB5U3RyaW5nX0FzU3RyaW5nKHV0ZjgpLCBQeVN0cmluZ19TaXplKHV0ZjgpKTsKKwlhc3NlcnQoUHlTdHJpbmdfQ2hlY2sodXRmOCkpOworCWNvbnZlcnRlZCA9IG5ld19zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHV0ZjgpLAorCQkJICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHV0ZjgpKTsKIAlQeV9ERUNSRUYodXRmOCk7CiAJaWYgKGNvbnZlcnRlZCA9PSBOVUxMKQogCQlnb3RvIGVycm9yX25vbWVtOwpAQCAtNzE5LDcgKzcyNSw3IEBACiAJUHlNZW1fRlJFRSgqaW5wKTsKIAkqaW5wID0gY29udmVydGVkOwogCWlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpCi0JCVB5TWVtX0RFTCh0b2stPmVuY29kaW5nKTsKKwkJUHlNZW1fRlJFRSh0b2stPmVuY29kaW5nKTsKIAl0b2stPmVuY29kaW5nID0gbmV3X3N0cmluZyhlbmNvZGluZywgc3RybGVuKGVuY29kaW5nKSk7CiAJaWYgKHRvay0+ZW5jb2RpbmcgPT0gTlVMTCkKIAkJZ290byBlcnJvcl9ub21lbTsKQEAgLTc3MCwzOCArNzc2LDM4IEBACiAJCQlyZXR1cm4gUHlfQ0hBUk1BU0soKnRvay0+Y3VyKyspOwogCQl9CiAJCWlmICh0b2stPnByb21wdCAhPSBOVUxMKSB7Ci0JCQljaGFyICpuZXcgPSBQeU9TX1JlYWRsaW5lKHN0ZGluLCBzdGRvdXQsIHRvay0+cHJvbXB0KTsKKwkJCWNoYXIgKm5ld3RvayA9IFB5T1NfUmVhZGxpbmUoc3RkaW4sIHN0ZG91dCwgdG9rLT5wcm9tcHQpOwogCQkJaWYgKHRvay0+bmV4dHByb21wdCAhPSBOVUxMKQogCQkJCXRvay0+cHJvbXB0ID0gdG9rLT5uZXh0cHJvbXB0OwotCQkJaWYgKG5ldyA9PSBOVUxMKQorCQkJaWYgKG5ld3RvayA9PSBOVUxMKQogCQkJCXRvay0+ZG9uZSA9IEVfSU5UUjsKLQkJCWVsc2UgaWYgKCpuZXcgPT0gJ1wwJykgewotCQkJCVB5TWVtX0ZSRUUobmV3KTsKKwkJCWVsc2UgaWYgKCpuZXd0b2sgPT0gJ1wwJykgeworCQkJCVB5TWVtX0ZSRUUobmV3dG9rKTsKIAkJCQl0b2stPmRvbmUgPSBFX0VPRjsKIAkJCX0KICNpZiAhZGVmaW5lZChQR0VOKSAmJiBkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpCi0JCQllbHNlIGlmICh0b2tfc3RkaW5fZGVjb2RlKHRvaywgJm5ldykgIT0gMCkKLQkJCQlQeU1lbV9GUkVFKG5ldyk7CisJCQllbHNlIGlmICh0b2tfc3RkaW5fZGVjb2RlKHRvaywgJm5ld3RvaykgIT0gMCkKKwkJCQlQeU1lbV9GUkVFKG5ld3Rvayk7CiAjZW5kaWYKIAkJCWVsc2UgaWYgKHRvay0+c3RhcnQgIT0gTlVMTCkgewogCQkJCXNpemVfdCBzdGFydCA9IHRvay0+c3RhcnQgLSB0b2stPmJ1ZjsKIAkJCQlzaXplX3Qgb2xkbGVuID0gdG9rLT5jdXIgLSB0b2stPmJ1ZjsKLQkJCQlzaXplX3QgbmV3bGVuID0gb2xkbGVuICsgc3RybGVuKG5ldyk7CisJCQkJc2l6ZV90IG5ld2xlbiA9IG9sZGxlbiArIHN0cmxlbihuZXd0b2spOwogCQkJCWNoYXIgKmJ1ZiA9IHRvay0+YnVmOwotCQkJCVB5TWVtX1JFU0laRShidWYsIGNoYXIsIG5ld2xlbisxKTsKKwkJCQlidWYgPSAoY2hhciAqKVB5TWVtX1JFQUxMT0MoYnVmLCBuZXdsZW4rMSk7CiAJCQkJdG9rLT5saW5lbm8rKzsKIAkJCQlpZiAoYnVmID09IE5VTEwpIHsKLQkJCQkJUHlNZW1fREVMKHRvay0+YnVmKTsKKwkJCQkJUHlNZW1fRlJFRSh0b2stPmJ1Zik7CiAJCQkJCXRvay0+YnVmID0gTlVMTDsKLQkJCQkJUHlNZW1fRlJFRShuZXcpOworCQkJCQlQeU1lbV9GUkVFKG5ld3Rvayk7CiAJCQkJCXRvay0+ZG9uZSA9IEVfTk9NRU07CiAJCQkJCXJldHVybiBFT0Y7CiAJCQkJfQogCQkJCXRvay0+YnVmID0gYnVmOwogCQkJCXRvay0+Y3VyID0gdG9rLT5idWYgKyBvbGRsZW47CiAJCQkJdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5jdXI7Ci0JCQkJc3RyY3B5KHRvay0+YnVmICsgb2xkbGVuLCBuZXcpOwotCQkJCVB5TWVtX0ZSRUUobmV3KTsKKwkJCQlzdHJjcHkodG9rLT5idWYgKyBvbGRsZW4sIG5ld3Rvayk7CisJCQkJUHlNZW1fRlJFRShuZXd0b2spOwogCQkJCXRvay0+aW5wID0gdG9rLT5idWYgKyBuZXdsZW47CiAJCQkJdG9rLT5lbmQgPSB0b2stPmlucCArIDE7CiAJCQkJdG9rLT5zdGFydCA9IHRvay0+YnVmICsgc3RhcnQ7CkBAIC04MDksOCArODE1LDggQEAKIAkJCWVsc2UgewogCQkJCXRvay0+bGluZW5vKys7CiAJCQkJaWYgKHRvay0+YnVmICE9IE5VTEwpCi0JCQkJCVB5TWVtX0RFTCh0b2stPmJ1Zik7Ci0JCQkJdG9rLT5idWYgPSBuZXc7CisJCQkJCVB5TWVtX0ZSRUUodG9rLT5idWYpOworCQkJCXRvay0+YnVmID0gbmV3dG9rOwogCQkJCXRvay0+bGluZV9zdGFydCA9IHRvay0+YnVmOwogCQkJCXRvay0+Y3VyID0gdG9rLT5idWY7CiAJCQkJdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5idWY7CkBAIC04MjQsNyArODMwLDggQEAKIAkJCWNoYXIgKnB0OwogCQkJaWYgKHRvay0+c3RhcnQgPT0gTlVMTCkgewogCQkJCWlmICh0b2stPmJ1ZiA9PSBOVUxMKSB7Ci0JCQkJCXRvay0+YnVmID0gUHlNZW1fTkVXKGNoYXIsIEJVRlNJWik7CisJCQkJCXRvay0+YnVmID0gKGNoYXIgKikKKwkJCQkJCVB5TWVtX01BTExPQyhCVUZTSVopOwogCQkJCQlpZiAodG9rLT5idWYgPT0gTlVMTCkgewogCQkJCQkJdG9rLT5kb25lID0gRV9OT01FTTsKIAkJCQkJCXJldHVybiBFT0Y7CkBAIC04NTksNyArODY2LDggQEAKIAkJCQlQeV9zc2l6ZV90IGN1cnZhbGlkID0gdG9rLT5pbnAgLSB0b2stPmJ1ZjsKIAkJCQlQeV9zc2l6ZV90IG5ld3NpemUgPSBjdXJ2YWxpZCArIEJVRlNJWjsKIAkJCQljaGFyICpuZXdidWYgPSB0b2stPmJ1ZjsKLQkJCQlQeU1lbV9SRVNJWkUobmV3YnVmLCBjaGFyLCBuZXdzaXplKTsKKwkJCQluZXdidWYgPSAoY2hhciAqKVB5TWVtX1JFQUxMT0MobmV3YnVmLAorCQkJCQkJCSAgICAgICBuZXdzaXplKTsKIAkJCQlpZiAobmV3YnVmID09IE5VTEwpIHsKIAkJCQkJdG9rLT5kb25lID0gRV9OT01FTTsKIAkJCQkJdG9rLT5jdXIgPSB0b2stPmlucDsKQEAgLTExODIsOSArMTE5MCw5IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAl0b2stPnN0YXJ0ID0gdG9rLT5jdXI7Ci0JCisKIAkvKiBSZXR1cm4gcGVuZGluZyBpbmRlbnRzL2RlZGVudHMgKi8KIAlpZiAodG9rLT5wZW5kaW4gIT0gMCkgewogCQlpZiAodG9rLT5wZW5kaW4gPCAwKSB7CkBAIC0xMTk2LDI3ICsxMjA0LDI3IEBACiAJCQlyZXR1cm4gSU5ERU5UOwogCQl9CiAJfQotCQorCiAgYWdhaW46CiAJdG9rLT5zdGFydCA9IE5VTEw7CiAJLyogU2tpcCBzcGFjZXMgKi8KIAlkbyB7CiAJCWMgPSB0b2tfbmV4dGModG9rKTsKIAl9IHdoaWxlIChjID09ICcgJyB8fCBjID09ICdcdCcgfHwgYyA9PSAnXDAxNCcpOwotCQorCiAJLyogU2V0IHN0YXJ0IG9mIGN1cnJlbnQgdG9rZW4gKi8KIAl0b2stPnN0YXJ0ID0gdG9rLT5jdXIgLSAxOwotCQorCiAJLyogU2tpcCBjb21tZW50ICovCiAJaWYgKGMgPT0gJyMnKQogCQl3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQogCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQorCiAJLyogQ2hlY2sgZm9yIEVPRiBhbmQgZXJyb3JzIG5vdyAqLwogCWlmIChjID09IEVPRikgewogCQlyZXR1cm4gdG9rLT5kb25lID09IEVfRU9GID8gRU5ETUFSS0VSIDogRVJST1JUT0tFTjsKIAl9Ci0JCisKIAkvKiBJZGVudGlmaWVyIChtb3N0IGZyZXF1ZW50IHRva2VuISkgKi8KIAlpZiAoaXNhbHBoYShjKSB8fCBjID09ICdfJykgewogCQkvKiBQcm9jZXNzIHIiIiwgdSIiIGFuZCB1ciIiICovCkBAIC0xMjQ0LDcgKzEyNTIsNyBAQAogCQkqcF9lbmQgPSB0b2stPmN1cjsKIAkJcmV0dXJuIE5BTUU7CiAJfQotCQorCiAJLyogTmV3bGluZSAqLwogCWlmIChjID09ICdcbicpIHsKIAkJdG9rLT5hdGJvbCA9IDE7CkBAIC0xMjU1LDcgKzEyNjMsNyBAQAogICAgICAgICAgICAgICAgIHRvay0+Y29udF9saW5lID0gMDsKIAkJcmV0dXJuIE5FV0xJTkU7CiAJfQotCQorCiAJLyogUGVyaW9kIG9yIG51bWJlciBzdGFydGluZyB3aXRoIHBlcmlvZD8gKi8KIAlpZiAoYyA9PSAnLicpIHsKIAkJYyA9IHRva19uZXh0Yyh0b2spOwpAQCAtMTQxOCw3ICsxNDI2LDcgQEAKIAkJKnBfZW5kID0gdG9rLT5jdXI7CiAJCXJldHVybiBTVFJJTkc7CiAJfQotCQorCiAJLyogTGluZSBjb250aW51YXRpb24gKi8KIAlpZiAoYyA9PSAnXFwnKSB7CiAJCWMgPSB0b2tfbmV4dGModG9rKTsKQEAgLTE0MzAsNyArMTQzOCw3IEBACiAgICAgICAgICAgICAgICAgdG9rLT5jb250X2xpbmUgPSAxOwogCQlnb3RvIGFnYWluOyAvKiBSZWFkIG5leHQgbGluZSAqLwogCX0KLQkKKwogCS8qIENoZWNrIGZvciB0d28tY2hhcmFjdGVyIHRva2VuICovCiAJewogCQlpbnQgYzIgPSB0b2tfbmV4dGModG9rKTsKQEAgLTE0NDksNyArMTQ1Nyw3IEBACiAJCX0KIAkJdG9rX2JhY2t1cCh0b2ssIGMyKTsKIAl9Ci0JCisKIAkvKiBLZWVwIHRyYWNrIG9mIHBhcmVudGhlc2VzIG5lc3RpbmcgbGV2ZWwgKi8KIAlzd2l0Y2ggKGMpIHsKIAljYXNlICcoJzoKQEAgLTE0NjMsNyArMTQ3MSw3IEBACiAJCXRvay0+bGV2ZWwtLTsKIAkJYnJlYWs7CiAJfQotCQorCiAJLyogUHVuY3R1YXRpb24gY2hhcmFjdGVyICovCiAJKnBfc3RhcnQgPSB0b2stPnN0YXJ0OwogCSpwX2VuZCA9IHRvay0+Y3VyOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL1B5dGhvbi1hc3QuYyBiL1B5dGhvbi9QeXRob24tYXN0LmMKaW5kZXggM2Y4MzQ1ZS4uMjQ5ZjcwZSAxMDA2NDQKLS0tIGEvUHl0aG9uL1B5dGhvbi1hc3QuYworKysgYi9QeXRob24vUHl0aG9uLWFzdC5jCkBAIC0zMzEsNiArMzMxLDggQEAKICAgICAgICAgInR5cGUiLAogICAgICAgICAibmFtZSIsCiAgICAgICAgICJib2R5IiwKKyAgICAgICAgImxpbmVubyIsCisgICAgICAgICJjb2xfb2Zmc2V0IiwKIH07CiBzdGF0aWMgUHlUeXBlT2JqZWN0ICphcmd1bWVudHNfdHlwZTsKIHN0YXRpYyBQeU9iamVjdCogYXN0Mm9ial9hcmd1bWVudHModm9pZCopOwpAQCAtMzgxLDEwICszODMsMTAgQEAKIAogc3RhdGljIGludCBhZGRfYXR0cmlidXRlcyhQeVR5cGVPYmplY3QqIHR5cGUsIGNoYXIqKmF0dHJzLCBpbnQgbnVtX2ZpZWxkcykKIHsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgcmVzdWx0OwogICAgIFB5T2JqZWN0ICpzLCAqbCA9IFB5TGlzdF9OZXcobnVtX2ZpZWxkcyk7CiAgICAgaWYgKCFsKSByZXR1cm4gMDsKLSAgICBmb3IoaT0wOyBpIDwgbnVtX2ZpZWxkczsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpIDwgbnVtX2ZpZWxkczsgaSsrKSB7CiAgICAgICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGF0dHJzW2ldKTsKICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYobCk7CkBAIC0zOTIsNyArMzk0LDkgQEAKICAgICAgICAgfQogICAgICAgICBQeUxpc3RfU0VUX0lURU0obCwgaSwgcyk7CiAgICAgfQotICAgIHJldHVybiBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKChQeU9iamVjdCopdHlwZSwgIl9hdHRyaWJ1dGVzIiwgbCkgPj0wOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0Kil0eXBlLCAiX2F0dHJpYnV0ZXMiLCBsKSA+PSAwOworICAgIFB5X0RFQ1JFRihsKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqIGFzdDJvYmpfbGlzdChhc2RsX3NlcSAqc2VxLCBQeU9iamVjdCogKCpmdW5jKSh2b2lkKikpCkBAIC00MzIsOSArNDM2LDkgQEAKICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoYik7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgaW50IGluaXRfdHlwZXModm9pZCkKIHsKKyAgICAgICAgc3RhdGljIGludCBpbml0aWFsaXplZDsKICAgICAgICAgaWYgKGluaXRpYWxpemVkKSByZXR1cm4gMTsKICAgICAgICAgQVNUX3R5cGUgPSBtYWtlX3R5cGUoIkFTVCIsICZQeUJhc2VPYmplY3RfVHlwZSwgTlVMTCwgMCk7CiAgICAgICAgIG1vZF90eXBlID0gbWFrZV90eXBlKCJtb2QiLCBBU1RfdHlwZSwgTlVMTCwgMCk7CkBAIC03MTAsNyArNzE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZWhlbnNpb25fZmllbGRzLCAzKTsKICAgICAgICAgaWYgKCFjb21wcmVoZW5zaW9uX3R5cGUpIHJldHVybiAwOwogICAgICAgICBleGNlcHRoYW5kbGVyX3R5cGUgPSBtYWtlX3R5cGUoImV4Y2VwdGhhbmRsZXIiLCBBU1RfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGhhbmRsZXJfZmllbGRzLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGhhbmRsZXJfZmllbGRzLCA1KTsKICAgICAgICAgaWYgKCFleGNlcHRoYW5kbGVyX3R5cGUpIHJldHVybiAwOwogICAgICAgICBhcmd1bWVudHNfdHlwZSA9IG1ha2VfdHlwZSgiYXJndW1lbnRzIiwgQVNUX3R5cGUsIGFyZ3VtZW50c19maWVsZHMsIDQpOwogICAgICAgICBpZiAoIWFyZ3VtZW50c190eXBlKSByZXR1cm4gMDsKQEAgLTE0OTksOCArMTUwMyw4IEBACiB9CiAKIGV4cHJfdHkKLUNvbXBhcmUoZXhwcl90eSBsZWZ0LCBhc2RsX3NlcSAqIG9wcywgYXNkbF9zZXEgKiBjb21wYXJhdG9ycywgaW50IGxpbmVubywgaW50Ci0gICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQorQ29tcGFyZShleHByX3R5IGxlZnQsIGFzZGxfaW50X3NlcSAqIG9wcywgYXNkbF9zZXEgKiBjb21wYXJhdG9ycywgaW50IGxpbmVubywKKyAgICAgICAgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQogewogICAgICAgICBleHByX3R5IHA7CiAgICAgICAgIGlmICghbGVmdCkgewpAQCAtMTg0MSw3ICsxODQ1LDggQEAKIH0KIAogZXhjZXB0aGFuZGxlcl90eQotZXhjZXB0aGFuZGxlcihleHByX3R5IHR5cGUsIGV4cHJfdHkgbmFtZSwgYXNkbF9zZXEgKiBib2R5LCBQeUFyZW5hICphcmVuYSkKK2V4Y2VwdGhhbmRsZXIoZXhwcl90eSB0eXBlLCBleHByX3R5IG5hbWUsIGFzZGxfc2VxICogYm9keSwgaW50IGxpbmVubywgaW50CisgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQogewogICAgICAgICBleGNlcHRoYW5kbGVyX3R5IHA7CiAgICAgICAgIHAgPSAoZXhjZXB0aGFuZGxlcl90eSlQeUFyZW5hX01hbGxvYyhhcmVuYSwgc2l6ZW9mKCpwKSk7CkBAIC0xODUyLDYgKzE4NTcsOCBAQAogICAgICAgICBwLT50eXBlID0gdHlwZTsKICAgICAgICAgcC0+bmFtZSA9IG5hbWU7CiAgICAgICAgIHAtPmJvZHkgPSBib2R5OworICAgICAgICBwLT5saW5lbm8gPSBsaW5lbm87CisgICAgICAgIHAtPmNvbF9vZmZzZXQgPSBjb2xfb2Zmc2V0OwogICAgICAgICByZXR1cm4gcDsKIH0KIApAQCAtMjkxNSw2ICsyOTIyLDE2IEBACiAgICAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHJlc3VsdCwgImJvZHkiLCB2YWx1ZSkgPT0gLTEpCiAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CiAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIHZhbHVlID0gYXN0Mm9ial9pbnQoby0+bGluZW5vKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHJlc3VsdCwgImxpbmVubyIsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2ludChvLT5jb2xfb2Zmc2V0KTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHJlc3VsdCwgImNvbF9vZmZzZXQiLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiBmYWlsZWQ6CiAgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOwpAQCAtMzAzMywxNDYgKzMwNTAsMTQ2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBpZiAoUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fdmVyc2lvbl9fIiwgIjQyNzUzIikgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1vZCIsIChQeU9iamVjdCopbW9kX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTW9kdWxlIiwgKFB5T2JqZWN0KilNb2R1bGVfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbnRlcmFjdGl2ZSIsIChQeU9iamVjdCopSW50ZXJhY3RpdmVfdHlwZSkKLSAgICAgICAgICAgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFeHByZXNzaW9uIiwgKFB5T2JqZWN0KilFeHByZXNzaW9uX3R5cGUpIDwKLSAgICAgICAgICAgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU3VpdGUiLCAoUHlPYmplY3QqKVN1aXRlX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic3RtdCIsIChQeU9iamVjdCopc3RtdF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZ1bmN0aW9uRGVmIiwgKFB5T2JqZWN0KilGdW5jdGlvbkRlZl90eXBlKQotICAgICAgICAgICA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNsYXNzRGVmIiwgKFB5T2JqZWN0KilDbGFzc0RlZl90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJldHVybiIsIChQeU9iamVjdCopUmV0dXJuX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRGVsZXRlIiwgKFB5T2JqZWN0KilEZWxldGVfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBc3NpZ24iLCAoUHlPYmplY3QqKUFzc2lnbl90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkF1Z0Fzc2lnbiIsIChQeU9iamVjdCopQXVnQXNzaWduX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUHJpbnQiLCAoUHlPYmplY3QqKVByaW50X3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRm9yIiwgKFB5T2JqZWN0KilGb3JfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJXaGlsZSIsIChQeU9iamVjdCopV2hpbGVfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJZiIsIChQeU9iamVjdCopSWZfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJXaXRoIiwgKFB5T2JqZWN0KilXaXRoX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUmFpc2UiLCAoUHlPYmplY3QqKVJhaXNlX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVHJ5RXhjZXB0IiwgKFB5T2JqZWN0KilUcnlFeGNlcHRfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUcnlGaW5hbGx5IiwgKFB5T2JqZWN0KilUcnlGaW5hbGx5X3R5cGUpIDwKLSAgICAgICAgICAgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXNzZXJ0IiwgKFB5T2JqZWN0KilBc3NlcnRfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbXBvcnQiLCAoUHlPYmplY3QqKUltcG9ydF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkltcG9ydEZyb20iLCAoUHlPYmplY3QqKUltcG9ydEZyb21fdHlwZSkgPAotICAgICAgICAgICAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFeGVjIiwgKFB5T2JqZWN0KilFeGVjX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR2xvYmFsIiwgKFB5T2JqZWN0KilHbG9iYWxfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFeHByIiwgKFB5T2JqZWN0KilFeHByX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUGFzcyIsIChQeU9iamVjdCopUGFzc190eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJyZWFrIiwgKFB5T2JqZWN0KilCcmVha190eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNvbnRpbnVlIiwgKFB5T2JqZWN0KilDb250aW51ZV90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImV4cHIiLCAoUHlPYmplY3QqKWV4cHJfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCb29sT3AiLCAoUHlPYmplY3QqKUJvb2xPcF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJpbk9wIiwgKFB5T2JqZWN0KilCaW5PcF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVuYXJ5T3AiLCAoUHlPYmplY3QqKVVuYXJ5T3BfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMYW1iZGEiLCAoUHlPYmplY3QqKUxhbWJkYV90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklmRXhwIiwgKFB5T2JqZWN0KilJZkV4cF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRpY3QiLCAoUHlPYmplY3QqKURpY3RfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMaXN0Q29tcCIsIChQeU9iamVjdCopTGlzdENvbXBfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHZW5lcmF0b3JFeHAiLAotICAgICAgICAgICAoUHlPYmplY3QqKUdlbmVyYXRvckV4cF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllpZWxkIiwgKFB5T2JqZWN0KilZaWVsZF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNvbXBhcmUiLCAoUHlPYmplY3QqKUNvbXBhcmVfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDYWxsIiwgKFB5T2JqZWN0KilDYWxsX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUmVwciIsIChQeU9iamVjdCopUmVwcl90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk51bSIsIChQeU9iamVjdCopTnVtX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU3RyIiwgKFB5T2JqZWN0KilTdHJfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBdHRyaWJ1dGUiLCAoUHlPYmplY3QqKUF0dHJpYnV0ZV90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN1YnNjcmlwdCIsIChQeU9iamVjdCopU3Vic2NyaXB0X3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTmFtZSIsIChQeU9iamVjdCopTmFtZV90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxpc3QiLCAoUHlPYmplY3QqKUxpc3RfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUdXBsZSIsIChQeU9iamVjdCopVHVwbGVfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJleHByX2NvbnRleHQiLAotICAgICAgICAgICAoUHlPYmplY3QqKWV4cHJfY29udGV4dF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxvYWQiLCAoUHlPYmplY3QqKUxvYWRfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdG9yZSIsIChQeU9iamVjdCopU3RvcmVfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJEZWwiLCAoUHlPYmplY3QqKURlbF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkF1Z0xvYWQiLCAoUHlPYmplY3QqKUF1Z0xvYWRfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBdWdTdG9yZSIsIChQeU9iamVjdCopQXVnU3RvcmVfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQYXJhbSIsIChQeU9iamVjdCopUGFyYW1fdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJzbGljZSIsIChQeU9iamVjdCopc2xpY2VfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFbGxpcHNpcyIsIChQeU9iamVjdCopRWxsaXBzaXNfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTbGljZSIsIChQeU9iamVjdCopU2xpY2VfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFeHRTbGljZSIsIChQeU9iamVjdCopRXh0U2xpY2VfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbmRleCIsIChQeU9iamVjdCopSW5kZXhfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJib29sb3AiLCAoUHlPYmplY3QqKWJvb2xvcF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFuZCIsIChQeU9iamVjdCopQW5kX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT3IiLCAoUHlPYmplY3QqKU9yX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAib3BlcmF0b3IiLCAoUHlPYmplY3QqKW9wZXJhdG9yX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQWRkIiwgKFB5T2JqZWN0KilBZGRfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdWIiLCAoUHlPYmplY3QqKVN1Yl90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk11bHQiLCAoUHlPYmplY3QqKU11bHRfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJEaXYiLCAoUHlPYmplY3QqKURpdl90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1vZCIsIChQeU9iamVjdCopTW9kX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUG93IiwgKFB5T2JqZWN0KilQb3dfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMU2hpZnQiLCAoUHlPYmplY3QqKUxTaGlmdF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJTaGlmdCIsIChQeU9iamVjdCopUlNoaWZ0X3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQml0T3IiLCAoUHlPYmplY3QqKUJpdE9yX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQml0WG9yIiwgKFB5T2JqZWN0KilCaXRYb3JfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCaXRBbmQiLCAoUHlPYmplY3QqKUJpdEFuZF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZsb29yRGl2IiwgKFB5T2JqZWN0KilGbG9vckRpdl90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInVuYXJ5b3AiLCAoUHlPYmplY3QqKXVuYXJ5b3BfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbnZlcnQiLCAoUHlPYmplY3QqKUludmVydF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5vdCIsIChQeU9iamVjdCopTm90X3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVUFkZCIsIChQeU9iamVjdCopVUFkZF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVTdWIiLCAoUHlPYmplY3QqKVVTdWJfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjbXBvcCIsIChQeU9iamVjdCopY21wb3BfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcSIsIChQeU9iamVjdCopRXFfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOb3RFcSIsIChQeU9iamVjdCopTm90RXFfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMdCIsIChQeU9iamVjdCopTHRfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMdEUiLCAoUHlPYmplY3QqKUx0RV90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkd0IiwgKFB5T2JqZWN0KilHdF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkd0RSIsIChQeU9iamVjdCopR3RFX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSXMiLCAoUHlPYmplY3QqKUlzX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSXNOb3QiLCAoUHlPYmplY3QqKUlzTm90X3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSW4iLCAoUHlPYmplY3QqKUluX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTm90SW4iLCAoUHlPYmplY3QqKU5vdEluX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY29tcHJlaGVuc2lvbiIsCi0gICAgICAgICAgIChQeU9iamVjdCopY29tcHJlaGVuc2lvbl90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImV4Y2VwdGhhbmRsZXIiLAotICAgICAgICAgICAoUHlPYmplY3QqKWV4Y2VwdGhhbmRsZXJfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJhcmd1bWVudHMiLCAoUHlPYmplY3QqKWFyZ3VtZW50c190eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImtleXdvcmQiLCAoUHlPYmplY3QqKWtleXdvcmRfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJhbGlhcyIsIChQeU9iamVjdCopYWxpYXNfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibW9kIiwgKFB5T2JqZWN0Kiltb2RfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTW9kdWxlIiwgKFB5T2JqZWN0KilNb2R1bGVfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkludGVyYWN0aXZlIiwgKFB5T2JqZWN0KilJbnRlcmFjdGl2ZV90eXBlKQorICAgICAgICAgICAgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXhwcmVzc2lvbiIsIChQeU9iamVjdCopRXhwcmVzc2lvbl90eXBlKSA8CisgICAgICAgICAgICAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU3VpdGUiLCAoUHlPYmplY3QqKVN1aXRlX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInN0bXQiLCAoUHlPYmplY3QqKXN0bXRfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRnVuY3Rpb25EZWYiLCAoUHlPYmplY3QqKUZ1bmN0aW9uRGVmX3R5cGUpCisgICAgICAgICAgICA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDbGFzc0RlZiIsIChQeU9iamVjdCopQ2xhc3NEZWZfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJldHVybiIsIChQeU9iamVjdCopUmV0dXJuX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJEZWxldGUiLCAoUHlPYmplY3QqKURlbGV0ZV90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXNzaWduIiwgKFB5T2JqZWN0KilBc3NpZ25fdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkF1Z0Fzc2lnbiIsIChQeU9iamVjdCopQXVnQXNzaWduX3R5cGUpIDwKKyAgICAgICAgICAgIDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQcmludCIsIChQeU9iamVjdCopUHJpbnRfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRm9yIiwgKFB5T2JqZWN0KilGb3JfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiV2hpbGUiLCAoUHlPYmplY3QqKVdoaWxlX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklmIiwgKFB5T2JqZWN0KilJZl90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJXaXRoIiwgKFB5T2JqZWN0KilXaXRoX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJhaXNlIiwgKFB5T2JqZWN0KilSYWlzZV90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUcnlFeGNlcHQiLCAoUHlPYmplY3QqKVRyeUV4Y2VwdF90eXBlKSA8CisgICAgICAgICAgICAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVHJ5RmluYWxseSIsIChQeU9iamVjdCopVHJ5RmluYWxseV90eXBlKSA8CisgICAgICAgICAgICAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXNzZXJ0IiwgKFB5T2JqZWN0KilBc3NlcnRfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkltcG9ydCIsIChQeU9iamVjdCopSW1wb3J0X3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbXBvcnRGcm9tIiwgKFB5T2JqZWN0KilJbXBvcnRGcm9tX3R5cGUpIDwKKyAgICAgICAgICAgIDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFeGVjIiwgKFB5T2JqZWN0KilFeGVjX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkdsb2JhbCIsIChQeU9iamVjdCopR2xvYmFsX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFeHByIiwgKFB5T2JqZWN0KilFeHByX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBhc3MiLCAoUHlPYmplY3QqKVBhc3NfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQnJlYWsiLCAoUHlPYmplY3QqKUJyZWFrX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNvbnRpbnVlIiwgKFB5T2JqZWN0KilDb250aW51ZV90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXhwciIsIChQeU9iamVjdCopZXhwcl90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCb29sT3AiLCAoUHlPYmplY3QqKUJvb2xPcF90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQmluT3AiLCAoUHlPYmplY3QqKUJpbk9wX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVuYXJ5T3AiLCAoUHlPYmplY3QqKVVuYXJ5T3BfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxhbWJkYSIsIChQeU9iamVjdCopTGFtYmRhX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJZkV4cCIsIChQeU9iamVjdCopSWZFeHBfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRGljdCIsIChQeU9iamVjdCopRGljdF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMaXN0Q29tcCIsIChQeU9iamVjdCopTGlzdENvbXBfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkdlbmVyYXRvckV4cCIsCisgICAgICAgICAgICAoUHlPYmplY3QqKUdlbmVyYXRvckV4cF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZaWVsZCIsIChQeU9iamVjdCopWWllbGRfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ29tcGFyZSIsIChQeU9iamVjdCopQ29tcGFyZV90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ2FsbCIsIChQeU9iamVjdCopQ2FsbF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSZXByIiwgKFB5T2JqZWN0KilSZXByX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk51bSIsIChQeU9iamVjdCopTnVtX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN0ciIsIChQeU9iamVjdCopU3RyX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkF0dHJpYnV0ZSIsIChQeU9iamVjdCopQXR0cmlidXRlX3R5cGUpIDwKKyAgICAgICAgICAgIDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdWJzY3JpcHQiLCAoUHlPYmplY3QqKVN1YnNjcmlwdF90eXBlKSA8CisgICAgICAgICAgICAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTmFtZSIsIChQeU9iamVjdCopTmFtZV90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMaXN0IiwgKFB5T2JqZWN0KilMaXN0X3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlR1cGxlIiwgKFB5T2JqZWN0KilUdXBsZV90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJleHByX2NvbnRleHQiLAorICAgICAgICAgICAgKFB5T2JqZWN0KilleHByX2NvbnRleHRfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTG9hZCIsIChQeU9iamVjdCopTG9hZF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdG9yZSIsIChQeU9iamVjdCopU3RvcmVfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRGVsIiwgKFB5T2JqZWN0KilEZWxfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXVnTG9hZCIsIChQeU9iamVjdCopQXVnTG9hZF90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXVnU3RvcmUiLCAoUHlPYmplY3QqKUF1Z1N0b3JlX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQYXJhbSIsIChQeU9iamVjdCopUGFyYW1fdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic2xpY2UiLCAoUHlPYmplY3QqKXNsaWNlX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVsbGlwc2lzIiwgKFB5T2JqZWN0KilFbGxpcHNpc190eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU2xpY2UiLCAoUHlPYmplY3QqKVNsaWNlX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkV4dFNsaWNlIiwgKFB5T2JqZWN0KilFeHRTbGljZV90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSW5kZXgiLCAoUHlPYmplY3QqKUluZGV4X3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImJvb2xvcCIsIChQeU9iamVjdCopYm9vbG9wX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBbmQiLCAoUHlPYmplY3QqKUFuZF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPciIsIChQeU9iamVjdCopT3JfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAib3BlcmF0b3IiLCAoUHlPYmplY3QqKW9wZXJhdG9yX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBZGQiLCAoUHlPYmplY3QqKUFkZF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdWIiLCAoUHlPYmplY3QqKVN1Yl90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNdWx0IiwgKFB5T2JqZWN0KilNdWx0X3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRpdiIsIChQeU9iamVjdCopRGl2X3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1vZCIsIChQeU9iamVjdCopTW9kX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBvdyIsIChQeU9iamVjdCopUG93X3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxTaGlmdCIsIChQeU9iamVjdCopTFNoaWZ0X3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSU2hpZnQiLCAoUHlPYmplY3QqKVJTaGlmdF90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQml0T3IiLCAoUHlPYmplY3QqKUJpdE9yX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJpdFhvciIsIChQeU9iamVjdCopQml0WG9yX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCaXRBbmQiLCAoUHlPYmplY3QqKUJpdEFuZF90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRmxvb3JEaXYiLCAoUHlPYmplY3QqKUZsb29yRGl2X3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJ1bmFyeW9wIiwgKFB5T2JqZWN0Kil1bmFyeW9wX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbnZlcnQiLCAoUHlPYmplY3QqKUludmVydF90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTm90IiwgKFB5T2JqZWN0KilOb3RfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVUFkZCIsIChQeU9iamVjdCopVUFkZF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVU3ViIiwgKFB5T2JqZWN0KilVU3ViX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNtcG9wIiwgKFB5T2JqZWN0KiljbXBvcF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcSIsIChQeU9iamVjdCopRXFfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTm90RXEiLCAoUHlPYmplY3QqKU5vdEVxX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkx0IiwgKFB5T2JqZWN0KilMdF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMdEUiLCAoUHlPYmplY3QqKUx0RV90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHdCIsIChQeU9iamVjdCopR3RfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR3RFIiwgKFB5T2JqZWN0KilHdEVfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSXMiLCAoUHlPYmplY3QqKUlzX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklzTm90IiwgKFB5T2JqZWN0KilJc05vdF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbiIsIChQeU9iamVjdCopSW5fdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTm90SW4iLCAoUHlPYmplY3QqKU5vdEluX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNvbXByZWhlbnNpb24iLAorICAgICAgICAgICAgKFB5T2JqZWN0Kiljb21wcmVoZW5zaW9uX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImV4Y2VwdGhhbmRsZXIiLAorICAgICAgICAgICAgKFB5T2JqZWN0KilleGNlcHRoYW5kbGVyX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImFyZ3VtZW50cyIsIChQeU9iamVjdCopYXJndW1lbnRzX3R5cGUpIDwKKyAgICAgICAgICAgIDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJrZXl3b3JkIiwgKFB5T2JqZWN0KilrZXl3b3JkX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJhbGlhcyIsIChQeU9iamVjdCopYWxpYXNfdHlwZSkgPCAwKSByZXR1cm47CiB9CiAKIApkaWZmIC0tZ2l0IGEvUHl0aG9uL2FzZGwuYyBiL1B5dGhvbi9hc2RsLmMKaW5kZXggMjI1ZGY2ZS4uNzIzMjliOSAxMDA2NDQKLS0tIGEvUHl0aG9uL2FzZGwuYworKysgYi9QeXRob24vYXNkbC5jCkBAIC04LDcgKzgsMjQgQEAKIAlzaXplX3QgbiA9IHNpemVvZihhc2RsX3NlcSkgKwogCQkJKHNpemUgPyAoc2l6ZW9mKHZvaWQgKikgKiAoc2l6ZSAtIDEpKSA6IDApOwogCi0gICAgc2VxID0gKGFzZGxfc2VxICopUHlBcmVuYV9NYWxsb2MoYXJlbmEsIG4pOworCXNlcSA9IChhc2RsX3NlcSAqKVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBuKTsKKwlpZiAoIXNlcSkgeworCQlQeUVycl9Ob01lbW9yeSgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KHNlcSwgMCwgbik7CisJc2VxLT5zaXplID0gc2l6ZTsKKwlyZXR1cm4gc2VxOworfQorCithc2RsX2ludF9zZXEgKgorYXNkbF9pbnRfc2VxX25ldyhpbnQgc2l6ZSwgUHlBcmVuYSAqYXJlbmEpCit7CisJYXNkbF9pbnRfc2VxICpzZXEgPSBOVUxMOworCXNpemVfdCBuID0gc2l6ZW9mKGFzZGxfc2VxKSArCisJCQkoc2l6ZSA/IChzaXplb2YoaW50KSAqIChzaXplIC0gMSkpIDogMCk7CisKKwlzZXEgPSAoYXNkbF9pbnRfc2VxICopUHlBcmVuYV9NYWxsb2MoYXJlbmEsIG4pOwogCWlmICghc2VxKSB7CiAJCVB5RXJyX05vTWVtb3J5KCk7CiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2FzdC5jIGIvUHl0aG9uL2FzdC5jCmluZGV4IGJiMTc3NGIuLjBiM2I0ODUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9hc3QuYworKysgYi9QeXRob24vYXN0LmMKQEAgLTMxLDcgKzMxLDcgQEAKIHN0YXRpYyBleHByX3R5IGFzdF9mb3JfZXhwcihzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IG5vZGUgKik7CiBzdGF0aWMgc3RtdF90eSBhc3RfZm9yX3N0bXQoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICopOwogc3RhdGljIGFzZGxfc2VxICphc3RfZm9yX3N1aXRlKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqKTsKLXN0YXRpYyBhc2RsX3NlcSAqYXN0X2Zvcl9leHBybGlzdChzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IG5vZGUgKiwgaW50KTsKK3N0YXRpYyBhc2RsX3NlcSAqYXN0X2Zvcl9leHBybGlzdChzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IG5vZGUgKiwgZXhwcl9jb250ZXh0X3R5KTsKIHN0YXRpYyBleHByX3R5IGFzdF9mb3JfdGVzdGxpc3Qoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICopOwogc3RhdGljIGV4cHJfdHkgYXN0X2Zvcl90ZXN0bGlzdF9nZXhwKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqKTsKIApAQCAtMTkxLDYgKzE5MSwxMCBAQAogCiAgICAgaWYgKGZsYWdzICYmIGZsYWdzLT5jZl9mbGFncyAmIFB5Q0ZfU09VUkNFX0lTX1VURjgpIHsKICAgICAgICAgYy5jX2VuY29kaW5nID0gInV0Zi04IjsKKyAgICAgICAgaWYgKFRZUEUobikgPT0gZW5jb2RpbmdfZGVjbCkgeworICAgICAgICAgICAgICAgIGFzdF9lcnJvcihuLCAiZW5jb2RpbmcgZGVjbGFyYXRpb24gaW4gVW5pY29kZSBzdHJpbmciKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChUWVBFKG4pID09IGVuY29kaW5nX2RlY2wpIHsKICAgICAgICAgYy5jX2VuY29kaW5nID0gU1RSKG4pOwogICAgICAgICBuID0gQ0hJTEQobiwgMCk7CkBAIC0yNDMsNyArMjQ3LDggQEAKICAgICAgICAgICAgICAgICBzdG10cyA9IGFzZGxfc2VxX25ldygxLCBhcmVuYSk7CiAgICAgICAgICAgICAgICAgaWYgKCFzdG10cykKIAkJICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKHN0bXRzLCAwLCBQYXNzKG4tPm5fbGluZW5vLCBuLT5uX2NvbF9vZmZzZXQsIGFyZW5hKSk7CisgICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKHN0bXRzLCAwLCBQYXNzKG4tPm5fbGluZW5vLCBuLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZW5hKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVyYWN0aXZlKHN0bXRzLCBhcmVuYSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTMxMSw3ICszMTYsNyBAQAogICAgICAgICBjYXNlIFBFUkNFTlQ6CiAgICAgICAgICAgICByZXR1cm4gTW9kOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZXR1cm4gKG9wZXJhdG9yX3R5KTA7CiAgICAgfQogfQogCkBAIC00MTksNyArNDI0LDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4ocyk7IGkrKykgewotCSAgICBpZiAoIXNldF9jb250ZXh0KGFzZGxfc2VxX0dFVChzLCBpKSwgY3R4LCBuKSkKKwkgICAgaWYgKCFzZXRfY29udGV4dCgoZXhwcl90eSlhc2RsX3NlcV9HRVQocywgaSksIGN0eCwgbikpCiAJCXJldHVybiAwOwogCX0KICAgICB9CkBAIC00NjAsNyArNDY1LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTXVsdDsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgImludmFsaWQgYXVnYXNzaWduOiAlcyIsIFNUUihuKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiAob3BlcmF0b3JfdHkpMDsKICAgICB9CiB9CiAKQEAgLTQ5NCw3ICs0OTksNyBAQAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICJpbnZhbGlkIGNvbXBfb3A6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSKG4pKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGNtcG9wX3R5KTA7CiAJfQogICAgIH0KICAgICBlbHNlIGlmIChOQ0gobikgPT0gMikgewpAQCAtNTA4LDEyICs1MTMsMTIgQEAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAiaW52YWxpZCBjb21wX29wOiAlcyAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUihDSElMRChuLCAwKSksIFNUUihDSElMRChuLCAxKSkpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIHJldHVybiAoY21wb3BfdHkpMDsKIAl9CiAgICAgfQogICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgImludmFsaWQgY29tcF9vcDogaGFzICVkIGNoaWxkcmVuIiwKICAgICAgICAgICAgICAgICAgTkNIKG4pKTsKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKGNtcG9wX3R5KTA7CiB9CiAKIHN0YXRpYyBhc2RsX3NlcSAqCkBAIC01NjQsOCArNTY5LDggQEAKIAkgICAgCQlhc3RfZXJyb3IoY2hpbGQsICJhc3NpZ25tZW50IHRvIE5vbmUiKTsKIAkJICAgIAlyZXR1cm4gTlVMTDsKIAkJICAgIH0gICAKLSAgICAgICAgICAgIGFyZyA9IE5hbWUoTkVXX0lERU5USUZJRVIoY2hpbGQpLCBTdG9yZSwgTElORU5PKGNoaWxkKSwgY2hpbGQtPm5fY29sX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgYy0+Y19hcmVuYSk7CisgICAgICAgICAgICBhcmcgPSBOYW1lKE5FV19JREVOVElGSUVSKGNoaWxkKSwgU3RvcmUsIExJTkVOTyhjaGlsZCksCisgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogCSAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgYXJnID0gY29tcGlsZXJfY29tcGxleF9hcmdzKGMsIENISUxEKENISUxEKG4sIDIqaSksIDEpKTsKQEAgLTY0MSwxNyArNjQ2LDI1IEBACiAJCSAgICBnb3RvIGVycm9yOwogCQl9CiAgICAgICAgICAgICAgICAgaWYgKE5DSChjaCkgPT0gMykgewotICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoYXJncywgaysrLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyX2NvbXBsZXhfYXJncyhjLCBDSElMRChjaCwgMSkpKTsgCi0JCX0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUWVBFKENISUxEKGNoLCAwKSkgPT0gTkFNRSkgeworCQkgICAgY2ggPSBDSElMRChjaCwgMSk7CisJCSAgICAvKiBkZWYgZm9vKCh4KSk6IGlzIG5vdCBjb21wbGV4LCBzcGVjaWFsIGNhc2UuICovCisJCSAgICBpZiAoTkNIKGNoKSAhPSAxKSB7CisJCQkvKiBXZSBoYXZlIGNvbXBsZXggYXJndW1lbnRzLCBzZXR1cCBmb3IgdW5wYWNraW5nLiAqLworCQkJYXNkbF9zZXFfU0VUKGFyZ3MsIGsrKywgY29tcGlsZXJfY29tcGxleF9hcmdzKGMsIGNoKSk7CisJCSAgICB9IGVsc2UgeworCQkJLyogZGVmIGZvbygoeCkpOiBzZXR1cCBmb3IgY2hlY2tpbmcgTkFNRSBiZWxvdy4gKi8KKwkJCWNoID0gQ0hJTEQoY2gsIDApOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoVFlQRShDSElMRChjaCwgMCkpID09IE5BTUUpIHsKIAkJICAgIGV4cHJfdHkgbmFtZTsKIAkJICAgIGlmICghc3RyY21wKFNUUihDSElMRChjaCwgMCkpLCAiTm9uZSIpKSB7CiAJCQkgICAgYXN0X2Vycm9yKENISUxEKGNoLCAwKSwgImFzc2lnbm1lbnQgdG8gTm9uZSIpOwogCQkJICAgIGdvdG8gZXJyb3I7CiAJCSAgICB9CiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOYW1lKE5FV19JREVOVElGSUVSKENISUxEKGNoLCAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtLCBMSU5FTk8oY2gpLCBjaC0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW0sIExJTkVOTyhjaCksIGNoLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoYXJncywgaysrLCBuYW1lKTsKQEAgLTc0Myw3ICs3NTYsOCBAQAogCW5hbWVfZXhwciA9IE5VTEw7CiAgICAgfQogICAgIGVsc2UgaWYgKE5DSChuKSA9PSA1KSB7IC8qIENhbGwgd2l0aCBubyBhcmd1bWVudHMgKi8KLQlkID0gQ2FsbChuYW1lX2V4cHIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKwlkID0gQ2FsbChuYW1lX2V4cHIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIExJTkVOTyhuKSwKKyAgICAgICAgICAgICAgICAgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKIAlpZiAoIWQpCiAJICAgIHJldHVybiBOVUxMOwogCW5hbWVfZXhwciA9IE5VTEw7CkBAIC04MTUsNyArODI5LDggQEAKICAgICBpZiAoIWJvZHkpCiAJcmV0dXJuIE5VTEw7CiAKLSAgICByZXR1cm4gRnVuY3Rpb25EZWYobmFtZSwgYXJncywgYm9keSwgZGVjb3JhdG9yX3NlcSwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgIHJldHVybiBGdW5jdGlvbkRlZihuYW1lLCBhcmdzLCBib2R5LCBkZWNvcmF0b3Jfc2VxLCBMSU5FTk8obiksCisgICAgICAgICAgICAgICAgICAgICAgIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiB9CiAKIHN0YXRpYyBleHByX3R5CkBAIC04NjEsNyArODc2LDggQEAKICAgICBvcmVsc2UgPSBhc3RfZm9yX2V4cHIoYywgQ0hJTEQobiwgNCkpOwogICAgIGlmICghb3JlbHNlKQogCXJldHVybiBOVUxMOwotICAgIHJldHVybiBJZkV4cChleHByZXNzaW9uLCBib2R5LCBvcmVsc2UsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICByZXR1cm4gSWZFeHAoZXhwcmVzc2lvbiwgYm9keSwgb3JlbHNlLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgYy0+Y19hcmVuYSk7CiB9CiAKIC8qIENvdW50IHRoZSBudW1iZXIgb2YgJ2ZvcicgbG9vcCBpbiBhIGxpc3QgY29tcHJlaGVuc2lvbi4KQEAgLTk2OSwxMCArOTg1LDExIEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAogCWlmIChhc2RsX3NlcV9MRU4odCkgPT0gMSkKLQkgICAgbGMgPSBjb21wcmVoZW5zaW9uKGFzZGxfc2VxX0dFVCh0LCAwKSwgZXhwcmVzc2lvbiwgTlVMTCwKKwkgICAgbGMgPSBjb21wcmVoZW5zaW9uKChleHByX3R5KWFzZGxfc2VxX0dFVCh0LCAwKSwgZXhwcmVzc2lvbiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKIAllbHNlCi0JICAgIGxjID0gY29tcHJlaGVuc2lvbihUdXBsZSh0LCBTdG9yZSwgTElORU5PKGNoKSwgY2gtPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSksCisJICAgIGxjID0gY29tcHJlaGVuc2lvbihUdXBsZSh0LCBTdG9yZSwgTElORU5PKGNoKSwgY2gtPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLCBOVUxMLCBjLT5jX2FyZW5hKTsKICAgICAgICAgaWYgKCFsYykKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTExNCwxMCArMTEzMSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAgICAgaWYgKGFzZGxfc2VxX0xFTih0KSA9PSAxKQotICAgICAgICAgICAgZ2UgPSBjb21wcmVoZW5zaW9uKGFzZGxfc2VxX0dFVCh0LCAwKSwgZXhwcmVzc2lvbiwKKyAgICAgICAgICAgIGdlID0gY29tcHJlaGVuc2lvbigoZXhwcl90eSlhc2RsX3NlcV9HRVQodCwgMCksIGV4cHJlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgYy0+Y19hcmVuYSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdlID0gY29tcHJlaGVuc2lvbihUdXBsZSh0LCBTdG9yZSwgTElORU5PKGNoKSwgY2gtPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSksCisgICAgICAgICAgICBnZSA9IGNvbXByZWhlbnNpb24oVHVwbGUodCwgU3RvcmUsIExJTkVOTyhjaCksIGNoLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y19hcmVuYSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgTlVMTCwgYy0+Y19hcmVuYSk7CiAKICAgICAgICAgaWYgKCFnZSkKQEAgLTEzMTcsMTYgKzEzMzUsMjAgQEAKIAogICAgIGNoID0gQ0hJTEQobiwgTkNIKG4pIC0gMSk7CiAgICAgaWYgKFRZUEUoY2gpID09IHNsaWNlb3ApIHsKLQlpZiAoTkNIKGNoKSA9PSAxKQotICAgICAgICAgICAgLyogWFhYOiBJZiBvbmx5IDEgY2hpbGQsIHRoZW4gc2hvdWxkIGp1c3QgYmUgYSBjb2xvbi4gIFNob3VsZCB3ZQotICAgICAgICAgICAgICAganVzdCBza2lwIGFzc2lnbmluZyBhbmQganVzdCBnZXQgdG8gdGhlIHJldHVybj8gKi8KLQkgICAgY2ggPSBDSElMRChjaCwgMCk7Ci0JZWxzZQotCSAgICBjaCA9IENISUxEKGNoLCAxKTsKLQlpZiAoVFlQRShjaCkgPT0gdGVzdCkgewotCSAgICBzdGVwID0gYXN0X2Zvcl9leHByKGMsIGNoKTsKKyAgICAgICAgaWYgKE5DSChjaCkgPT0gMSkgeworICAgICAgICAgICAgLyogTm8gZXhwcmVzc2lvbiwgc28gc3RlcCBpcyBOb25lICovCisgICAgICAgICAgICBjaCA9IENISUxEKGNoLCAwKTsKKyAgICAgICAgICAgIHN0ZXAgPSBOYW1lKG5ld19pZGVudGlmaWVyKCJOb25lIiwgYy0+Y19hcmVuYSksIExvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBMSU5FTk8oY2gpLCBjaC0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICAgICAgICAgIGlmICghc3RlcCkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoID0gQ0hJTEQoY2gsIDEpOworICAgICAgICAgICAgaWYgKFRZUEUoY2gpID09IHRlc3QpIHsKKyAgICAgICAgICAgICAgICBzdGVwID0gYXN0X2Zvcl9leHByKGMsIGNoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0ZXApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzQzLDcgKzEzNjUsNyBAQAogCiAJaW50IGksIG5vcHM7CiAJZXhwcl90eSBleHByMSwgZXhwcjIsIHJlc3VsdDsKLSAgICAgICAgb3BlcmF0b3JfdHkgb3BlcmF0b3I7CisgICAgICAgIG9wZXJhdG9yX3R5IG5ld29wZXJhdG9yOwogCiAgICAgICAgIGV4cHIxID0gYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIDApKTsKICAgICAgICAgaWYgKCFleHByMSkKQEAgLTEzNTMsMTEgKzEzNzUsMTIgQEAKICAgICAgICAgaWYgKCFleHByMikKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIG9wZXJhdG9yID0gZ2V0X29wZXJhdG9yKENISUxEKG4sIDEpKTsKLSAgICAgICAgaWYgKCFvcGVyYXRvcikKKyAgICAgICAgbmV3b3BlcmF0b3IgPSBnZXRfb3BlcmF0b3IoQ0hJTEQobiwgMSkpOworICAgICAgICBpZiAoIW5ld29wZXJhdG9yKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHQgPSBCaW5PcChleHByMSwgb3BlcmF0b3IsIGV4cHIyLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisJcmVzdWx0ID0gQmluT3AoZXhwcjEsIG5ld29wZXJhdG9yLCBleHByMiwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOwogCWlmICghcmVzdWx0KQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTEzNjYsMTYgKzEzODksMTcgQEAKIAkJZXhwcl90eSB0bXBfcmVzdWx0LCB0bXA7CiAJCWNvbnN0IG5vZGUqIG5leHRfb3BlciA9IENISUxEKG4sIGkgKiAyICsgMSk7CiAKLQkJb3BlcmF0b3IgPSBnZXRfb3BlcmF0b3IobmV4dF9vcGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoIW9wZXJhdG9yKQorCQluZXdvcGVyYXRvciA9IGdldF9vcGVyYXRvcihuZXh0X29wZXIpOworICAgICAgICAgICAgICAgIGlmICghbmV3b3BlcmF0b3IpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgICAgICAgICAgICAgdG1wID0gYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIGkgKiAyICsgMikpOwogICAgICAgICAgICAgICAgIGlmICghdG1wKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICAgICAgICAgIHRtcF9yZXN1bHQgPSBCaW5PcChyZXN1bHQsIG9wZXJhdG9yLCB0bXAsIAotCQkJCSAgIExJTkVOTyhuZXh0X29wZXIpLCBuZXh0X29wZXItPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisgICAgICAgICAgICAgICAgdG1wX3Jlc3VsdCA9IEJpbk9wKHJlc3VsdCwgbmV3b3BlcmF0b3IsIHRtcCwgCisJCQkJICAgTElORU5PKG5leHRfb3BlciksIG5leHRfb3Blci0+bl9jb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKIAkJaWYgKCF0bXApIAogCQkJcmV0dXJuIE5VTEw7CiAJCXJlc3VsdCA9IHRtcF9yZXN1bHQ7CkBAIC0xMzkzLDcgKzE0MTcsOCBAQAogICAgIFJFUShuLCB0cmFpbGVyKTsKICAgICBpZiAoVFlQRShDSElMRChuLCAwKSkgPT0gTFBBUikgewogICAgICAgICBpZiAoTkNIKG4pID09IDIpCi0gICAgICAgICAgICByZXR1cm4gQ2FsbChsZWZ0X2V4cHIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgICAgIHJldHVybiBDYWxsKGxlZnRfZXhwciwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTElORU5PKG4pLAorICAgICAgICAgICAgICAgICAgICAgICAgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmV0dXJuIGFzdF9mb3JfY2FsbChjLCBDSElMRChuLCAxKSwgbGVmdF9leHByKTsKICAgICB9CkBAIC0xNDA5LDcgKzE0MzQsOCBAQAogICAgICAgICAgICAgc2xpY2VfdHkgc2xjID0gYXN0X2Zvcl9zbGljZShjLCBDSElMRChuLCAwKSk7CiAgICAgICAgICAgICBpZiAoIXNsYykKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBTdWJzY3JpcHQobGVmdF9leHByLCBzbGMsIExvYWQsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgICAgIHJldHVybiBTdWJzY3JpcHQobGVmdF9leHByLCBzbGMsIExvYWQsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIC8qIFRoZSBncmFtbWFyIGlzIGFtYmlndW91cyBoZXJlLiBUaGUgYW1iaWd1aXR5IGlzIHJlc29sdmVkIApAQCAtMTU1MCw3ICsxNTc2LDggQEAKICAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoc2VxLCBpIC8gMiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChTVFIoQ0hJTEQobiwgMSkpLCAiYW5kIikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xPcChBbmQsIHNlcSwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgICAgICAgICAgICAgIHJldHVybiBCb29sT3AoQW5kLCBzZXEsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y19hcmVuYSk7CiAgICAgICAgICAgICBhc3NlcnQoIXN0cmNtcChTVFIoQ0hJTEQobiwgMSkpLCAib3IiKSk7CiAgICAgICAgICAgICByZXR1cm4gQm9vbE9wKE9yLCBzZXEsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICAgICAgY2FzZSBub3RfdGVzdDoKQEAgLTE1NjMsNyArMTU5MCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKCFleHByZXNzaW9uKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICAgICAgICAgIHJldHVybiBVbmFyeU9wKE5vdCwgZXhwcmVzc2lvbiwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgICAgICAgICAgICAgIHJldHVybiBVbmFyeU9wKE5vdCwgZXhwcmVzc2lvbiwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y19hcmVuYSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgY29tcGFyaXNvbjoKICAgICAgICAgICAgIGlmIChOQ0gobikgPT0gMSkgewpAQCAtMTU3Miw4ICsxNjAwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGV4cHJfdHkgZXhwcmVzc2lvbjsKLSAgICAgICAgICAgICAgICBhc2RsX3NlcSAqb3BzLCAqY21wczsKLSAgICAgICAgICAgICAgICBvcHMgPSBhc2RsX3NlcV9uZXcoTkNIKG4pIC8gMiwgYy0+Y19hcmVuYSk7CisgICAgICAgICAgICAgICAgYXNkbF9pbnRfc2VxICpvcHM7CisJCWFzZGxfc2VxICpjbXBzOworICAgICAgICAgICAgICAgIG9wcyA9IGFzZGxfaW50X3NlcV9uZXcoTkNIKG4pIC8gMiwgYy0+Y19hcmVuYSk7CiAgICAgICAgICAgICAgICAgaWYgKCFvcHMpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIGNtcHMgPSBhc2RsX3NlcV9uZXcoTkNIKG4pIC8gMiwgYy0+Y19hcmVuYSk7CkBAIC0xNTgxLDExICsxNjEwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTkNIKG4pOyBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogWFhYIGNtcG9wX3R5IGlzIGp1c3QgYW4gZW51bSAqLwotICAgICAgICAgICAgICAgICAgICBjbXBvcF90eSBvcGVyYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgY21wb3BfdHkgbmV3b3BlcmF0b3I7CiAKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPSBhc3RfZm9yX2NvbXBfb3AoQ0hJTEQobiwgaSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW9wZXJhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld29wZXJhdG9yID0gYXN0X2Zvcl9jb21wX29wKENISUxEKG4sIGkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdvcGVyYXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAJCSAgICB9CiAKQEAgLTE1OTQsNyArMTYyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAkJICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQob3BzLCBpIC8gMiwgKHZvaWQgKikoUHlfdWludHB0cl90KW9wZXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKG9wcywgaSAvIDIsIG5ld29wZXJhdG9yKTsKICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGNtcHMsIGkgLyAyLCBleHByZXNzaW9uKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGFzdF9mb3JfZXhwcihjLCBDSElMRChuLCAwKSk7CkBAIC0xNjAyLDcgKzE2MzAsOCBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAkJfQogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGFyZShleHByZXNzaW9uLCBvcHMsIGNtcHMsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGFyZShleHByZXNzaW9uLCBvcHMsIGNtcHMsIExJTkVOTyhuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTE4NTMsNyArMTg4Miw3IEBACiAgICAgfQogICAgIGVsc2UgaWYgKFRZUEUoQ0hJTEQobiwgMSkpID09IGF1Z2Fzc2lnbikgewogICAgICAgICBleHByX3R5IGV4cHIxLCBleHByMjsKLSAgICAgICAgb3BlcmF0b3JfdHkgb3BlcmF0b3I7CisgICAgICAgIG9wZXJhdG9yX3R5IG5ld29wZXJhdG9yOwogCW5vZGUgKmNoID0gQ0hJTEQobiwgMCk7CiAKIAlpZiAoVFlQRShjaCkgPT0gdGVzdGxpc3QpCkBAIC0xODk1LDExICsxOTI0LDExIEBACiAgICAgICAgIGlmICghZXhwcjIpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBvcGVyYXRvciA9IGFzdF9mb3JfYXVnYXNzaWduKENISUxEKG4sIDEpKTsKLSAgICAgICAgaWYgKCFvcGVyYXRvcikKKyAgICAgICAgbmV3b3BlcmF0b3IgPSBhc3RfZm9yX2F1Z2Fzc2lnbihDSElMRChuLCAxKSk7CisgICAgICAgIGlmICghbmV3b3BlcmF0b3IpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBBdWdBc3NpZ24oZXhwcjEsIG9wZXJhdG9yLCBleHByMiwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworCXJldHVybiBBdWdBc3NpZ24oZXhwcjEsIG5ld29wZXJhdG9yLCBleHByMiwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgIH0KICAgICBlbHNlIHsKIAlpbnQgaTsKQEAgLTE5NzMsNyArMjAwMiw3IEBACiB9CiAKIHN0YXRpYyBhc2RsX3NlcSAqCi1hc3RfZm9yX2V4cHJsaXN0KHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4sIGludCBjb250ZXh0KQorYXN0X2Zvcl9leHBybGlzdChzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuLCBleHByX2NvbnRleHRfdHkgY29udGV4dCkKIHsKICAgICBhc2RsX3NlcSAqc2VxOwogICAgIGludCBpOwpAQCAtMjUxMiw4ICsyNTQxLDggQEAKIAkgICAgaW50IG9mZiA9IDUgKyAobl9lbGlmIC0gaSAtIDEpICogNDsKICAgICAgICAgICAgIGV4cHJfdHkgZXhwcmVzc2lvbjsKICAgICAgICAgICAgIGFzZGxfc2VxICpzdWl0ZV9zZXE7Ci0JICAgIGFzZGxfc2VxICpuZXcgPSBhc2RsX3NlcV9uZXcoMSwgYy0+Y19hcmVuYSk7Ci0JICAgIGlmICghbmV3KQorCSAgICBhc2RsX3NlcSAqbmV3b2JqID0gYXNkbF9zZXFfbmV3KDEsIGMtPmNfYXJlbmEpOworCSAgICBpZiAoIW5ld29iaikKIAkJcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBleHByZXNzaW9uID0gYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIG9mZikpOwogICAgICAgICAgICAgaWYgKCFleHByZXNzaW9uKQpAQCAtMjUyMiwxMCArMjU1MSwxMCBAQAogICAgICAgICAgICAgaWYgKCFzdWl0ZV9zZXEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkgICAgYXNkbF9zZXFfU0VUKG5ldywgMCwKKwkgICAgYXNkbF9zZXFfU0VUKG5ld29iaiwgMCwKIAkJCSBJZihleHByZXNzaW9uLCBzdWl0ZV9zZXEsIG9yZWxzZSwgCiAJCQkgICAgTElORU5PKENISUxEKG4sIG9mZikpLCBDSElMRChuLCBvZmYpLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpKTsKLQkgICAgb3JlbHNlID0gbmV3OworCSAgICBvcmVsc2UgPSBuZXdvYmo7CiAJfQogCXJldHVybiBJZihhc3RfZm9yX2V4cHIoYywgQ0hJTEQobiwgMSkpLAogCQkgIGFzdF9mb3Jfc3VpdGUoYywgQ0hJTEQobiwgMykpLApAQCAtMjU5Nyw3ICsyNjI2LDcgQEAKICAgICBpZiAoIV90YXJnZXQpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChhc2RsX3NlcV9MRU4oX3RhcmdldCkgPT0gMSkKLQl0YXJnZXQgPSBhc2RsX3NlcV9HRVQoX3RhcmdldCwgMCk7CisJdGFyZ2V0ID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKF90YXJnZXQsIDApOwogICAgIGVsc2UKIAl0YXJnZXQgPSBUdXBsZShfdGFyZ2V0LCBTdG9yZSwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogCkBAIC0yNjA4LDcgKzI2MzcsOCBAQAogICAgIGlmICghc3VpdGVfc2VxKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHJldHVybiBGb3IodGFyZ2V0LCBleHByZXNzaW9uLCBzdWl0ZV9zZXEsIHNlcSwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgIHJldHVybiBGb3IodGFyZ2V0LCBleHByZXNzaW9uLCBzdWl0ZV9zZXEsIHNlcSwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKIH0KIAogc3RhdGljIGV4Y2VwdGhhbmRsZXJfdHkKQEAgLTI2MjMsNyArMjY1Myw4IEBACiAgICAgICAgIGlmICghc3VpdGVfc2VxKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gZXhjZXB0aGFuZGxlcihOVUxMLCBOVUxMLCBzdWl0ZV9zZXEsIGMtPmNfYXJlbmEpOworCXJldHVybiBleGNlcHRoYW5kbGVyKE5VTEwsIE5VTEwsIHN1aXRlX3NlcSwgTElORU5PKGV4YyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICB9CiAgICAgZWxzZSBpZiAoTkNIKGV4YykgPT0gMikgewogICAgICAgICBleHByX3R5IGV4cHJlc3Npb247CkBAIC0yNjM2LDcgKzI2NjcsOCBAQAogICAgICAgICBpZiAoIXN1aXRlX3NlcSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIGV4Y2VwdGhhbmRsZXIoZXhwcmVzc2lvbiwgTlVMTCwgc3VpdGVfc2VxLCBjLT5jX2FyZW5hKTsKKwlyZXR1cm4gZXhjZXB0aGFuZGxlcihleHByZXNzaW9uLCBOVUxMLCBzdWl0ZV9zZXEsIExJTkVOTyhleGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAgICAgfQogICAgIGVsc2UgaWYgKE5DSChleGMpID09IDQpIHsKICAgICAgICAgYXNkbF9zZXEgKnN1aXRlX3NlcTsKQEAgLTI2NTMsNyArMjY4NSw4IEBACiAgICAgICAgIGlmICghc3VpdGVfc2VxKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gZXhjZXB0aGFuZGxlcihleHByZXNzaW9uLCBlLCBzdWl0ZV9zZXEsIGMtPmNfYXJlbmEpOworCXJldHVybiBleGNlcHRoYW5kbGVyKGV4cHJlc3Npb24sIGUsIHN1aXRlX3NlcSwgTElORU5PKGV4YyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICB9CiAKICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCkBAIC0yNzIyLDcgKzI3NTUsOCBAQAogICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGhhbmRsZXJzLCBpLCBlKTsKICAgICAgICAgfQogCi0JZXhjZXB0X3N0ID0gVHJ5RXhjZXB0KGJvZHksIGhhbmRsZXJzLCBvcmVsc2UsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKwlleGNlcHRfc3QgPSBUcnlFeGNlcHQoYm9keSwgaGFuZGxlcnMsIG9yZWxzZSwgTElORU5PKG4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICAgICAgaWYgKCFmaW5hbGx5KQogCSAgICByZXR1cm4gZXhjZXB0X3N0OwogCkBAIC0yNzk3LDE2ICsyODMxLDE2IEBACiAgICAgICAgIHMgPSBhc3RfZm9yX3N1aXRlKGMsIENISUxEKG4sIDMpKTsKICAgICAgICAgaWYgKCFzKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIENsYXNzRGVmKE5FV19JREVOVElGSUVSKENISUxEKG4sIDEpKSwgTlVMTCwgcywgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKKwlyZXR1cm4gQ2xhc3NEZWYoTkVXX0lERU5USUZJRVIoQ0hJTEQobiwgMSkpLCBOVUxMLCBzLCBMSU5FTk8obiksCisgICAgICAgICAgICAgICAgICAgICAgICBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgIH0KICAgICAvKiBjaGVjayBmb3IgZW1wdHkgYmFzZSBsaXN0ICovCiAgICAgaWYgKFRZUEUoQ0hJTEQobiwzKSkgPT0gUlBBUikgewogCXMgPSBhc3RfZm9yX3N1aXRlKGMsIENISUxEKG4sNSkpOwogCWlmICghcykKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIENsYXNzRGVmKE5FV19JREVOVElGSUVSKENISUxEKG4sIDEpKSwgTlVMTCwgcywgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKKwlyZXR1cm4gQ2xhc3NEZWYoTkVXX0lERU5USUZJRVIoQ0hJTEQobiwgMSkpLCBOVUxMLCBzLCBMSU5FTk8obiksCisgICAgICAgICAgICAgICAgICAgICAgICBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgIH0KIAogICAgIC8qIGVsc2UgaGFuZGxlIHRoZSBiYXNlIGNsYXNzIGxpc3QgKi8KQEAgLTI4MTcsOCArMjg1MSw4IEBACiAgICAgcyA9IGFzdF9mb3Jfc3VpdGUoYywgQ0hJTEQobiwgNikpOwogICAgIGlmICghcykKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIENsYXNzRGVmKE5FV19JREVOVElGSUVSKENISUxEKG4sIDEpKSwgYmFzZXMsIHMsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKKyAgICByZXR1cm4gQ2xhc3NEZWYoTkVXX0lERU5USUZJRVIoQ0hJTEQobiwgMSkpLCBiYXNlcywgcywgTElORU5PKG4pLAorICAgICAgICAgICAgICAgICAgICBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogfQogCiBzdGF0aWMgc3RtdF90eQpAQCAtMzA5MCw3ICszMTI0LDggQEAKICNpZm5kZWYgUHlfVVNJTkdfVU5JQ09ERQogCQkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAtIHdlIG5ldmVyIHNlZSBhbnkgb3RoZXIKIAkJCSAgIGVuY29kaW5nLiAqLwotCQkJUHlfRmF0YWxFcnJvcigiY2Fubm90IGRlYWwgd2l0aCBlbmNvZGluZ3MgaW4gdGhpcyBidWlsZC4iKTsKKwkJCVB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBkZWFsIHdpdGggZW5jb2RpbmdzIGluIHRoaXMgYnVpbGQuIik7CiAjZWxzZQogCQkJUHlPYmplY3QgKnYsICp1ID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgbGVuLCBOVUxMKTsKIAkJCWlmICh1ID09IE5VTEwpCmRpZmYgLS1naXQgYS9QeXRob24vYmx0aW5tb2R1bGUuYyBiL1B5dGhvbi9ibHRpbm1vZHVsZS5jCmluZGV4IDM0MmMyZGIuLjkxNGUwZDEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9ibHRpbm1vZHVsZS5jCisrKyBiL1B5dGhvbi9ibHRpbm1vZHVsZS5jCkBAIC0zMSwyMyArMzEsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqZmlsdGVydHVwbGUgKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnVpbHRpbl9fX2ltcG9ydF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK2J1aWx0aW5fX19pbXBvcnRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogeworCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJnbG9iYWxzIiwgImxvY2FscyIsICJmcm9tbGlzdCIsCisJCQkJICJsZXZlbCIsIDB9OwogCWNoYXIgKm5hbWU7CiAJUHlPYmplY3QgKmdsb2JhbHMgPSBOVUxMOwogCVB5T2JqZWN0ICpsb2NhbHMgPSBOVUxMOwogCVB5T2JqZWN0ICpmcm9tbGlzdCA9IE5VTEw7CiAJaW50IGxldmVsID0gLTE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8T09PaTpfX2ltcG9ydF9fIiwKLQkJCSZuYW1lLCAmZ2xvYmFscywgJmxvY2FscywgJmZyb21saXN0LCAmbGV2ZWwpKQorCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJzfE9PT2k6X19pbXBvcnRfXyIsCisJCQlrd2xpc3QsICZuYW1lLCAmZ2xvYmFscywgJmxvY2FscywgJmZyb21saXN0LCAmbGV2ZWwpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwobmFtZSwgZ2xvYmFscywgbG9jYWxzLAogCQkJCQkgIGZyb21saXN0LCBsZXZlbCk7CiB9CiAKIFB5RG9jX1NUUlZBUihpbXBvcnRfZG9jLAotIl9faW1wb3J0X18obmFtZSwgZ2xvYmFscywgbG9jYWxzLCBmcm9tbGlzdCkgLT4gbW9kdWxlXG5cCisiX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzPXt9LCBsb2NhbHM9e30sIGZyb21saXN0PVtdLCBsZXZlbD0tMSkgLT4gbW9kdWxlXG5cCiBcblwKIEltcG9ydCBhIG1vZHVsZS4gIFRoZSBnbG9iYWxzIGFyZSBvbmx5IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0O1xuXAogdGhleSBhcmUgbm90IG1vZGlmaWVkLiAgVGhlIGxvY2FscyBhcmUgY3VycmVudGx5IHVudXNlZC4gIFRoZSBmcm9tbGlzdFxuXApAQCAtNTUsNyArNTcsMTAgQEAKIGVtcHR5IGxpc3QgdG8gZW11bGF0ZSBgYGltcG9ydCBuYW1lJycuXG5cCiBXaGVuIGltcG9ydGluZyBhIG1vZHVsZSBmcm9tIGEgcGFja2FnZSwgbm90ZSB0aGF0IF9faW1wb3J0X18oJ0EuQicsIC4uLilcblwKIHJldHVybnMgcGFja2FnZSBBIHdoZW4gZnJvbWxpc3QgaXMgZW1wdHksIGJ1dCBpdHMgc3VibW9kdWxlIEIgd2hlblxuXAotZnJvbWxpc3QgaXMgbm90IGVtcHR5LiIpOworZnJvbWxpc3QgaXMgbm90IGVtcHR5LiAgTGV2ZWwgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBwZXJmb3JtIFxuXAorYWJzb2x1dGUgb3IgcmVsYXRpdmUgaW1wb3J0cy4gIC0xIGlzIHRoZSBvcmlnaW5hbCBzdHJhdGVneSBvZiBhdHRlbXB0aW5nXG5cCitib3RoIGFic29sdXRlIGFuZCByZWxhdGl2ZSBpbXBvcnRzLCAwIGlzIGFic29sdXRlLCBhIHBvc2l0aXZlIG51bWJlclxuXAoraXMgdGhlIG51bWJlciBvZiBwYXJlbnQgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IG1vZHVsZS4iKTsKIAogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTcwNCwzMiArMTcwOSwzNCBAQAogCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1idWlsdGluX3JvdW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK2J1aWx0aW5fcm91bmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlkb3VibGUgeDsKKwlkb3VibGUgbnVtYmVyOwogCWRvdWJsZSBmOwogCWludCBuZGlnaXRzID0gMDsKIAlpbnQgaTsKKwlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im51bWJlciIsICJuZGlnaXRzIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImR8aTpyb3VuZCIsICZ4LCAmbmRpZ2l0cykpCi0JCQlyZXR1cm4gTlVMTDsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiZHxpOnJvdW5kIiwKKyAgICAgICAgICAgICAgICBrd2xpc3QsICZudW1iZXIsICZuZGlnaXRzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAlmID0gMS4wOwogCWkgPSBhYnMobmRpZ2l0cyk7CiAJd2hpbGUgICgtLWkgPj0gMCkKIAkJZiA9IGYqMTAuMDsKIAlpZiAobmRpZ2l0cyA8IDApCi0JCXggLz0gZjsKKwkJbnVtYmVyIC89IGY7CiAJZWxzZQotCQl4ICo9IGY7Ci0JaWYgKHggPj0gMC4wKQotCQl4ID0gZmxvb3IoeCArIDAuNSk7CisJCW51bWJlciAqPSBmOworCWlmIChudW1iZXIgPj0gMC4wKQorCQludW1iZXIgPSBmbG9vcihudW1iZXIgKyAwLjUpOwogCWVsc2UKLQkJeCA9IGNlaWwoeCAtIDAuNSk7CisJCW51bWJlciA9IGNlaWwobnVtYmVyIC0gMC41KTsKIAlpZiAobmRpZ2l0cyA8IDApCi0JCXggKj0gZjsKKwkJbnVtYmVyICo9IGY7CiAJZWxzZQotCQl4IC89IGY7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKwkJbnVtYmVyIC89IGY7CisJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShudW1iZXIpOwogfQogCiBQeURvY19TVFJWQVIocm91bmRfZG9jLApAQCAtMjA0Miw3ICsyMDQ5LDcgQEAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYgYnVpbHRpbl9tZXRob2RzW10gPSB7Ci0gCXsiX19pbXBvcnRfXyIsCWJ1aWx0aW5fX19pbXBvcnRfXywgTUVUSF9WQVJBUkdTLCBpbXBvcnRfZG9jfSwKKyAJeyJfX2ltcG9ydF9fIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fX19pbXBvcnRfXywgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgaW1wb3J0X2RvY30sCiAgCXsiYWJzIiwJCWJ1aWx0aW5fYWJzLCAgICAgICAgTUVUSF9PLCBhYnNfZG9jfSwKICAJeyJhbGwiLAkJYnVpbHRpbl9hbGwsICAgICAgICBNRVRIX08sIGFsbF9kb2N9LAogIAl7ImFueSIsCQlidWlsdGluX2FueSwgICAgICAgIE1FVEhfTywgYW55X2RvY30sCkBAIC0yMDc5LDcgKzIwODYsNyBAQAogIAl7InJlZHVjZSIsCWJ1aWx0aW5fcmVkdWNlLCAgICAgTUVUSF9WQVJBUkdTLCByZWR1Y2VfZG9jfSwKICAJeyJyZWxvYWQiLAlidWlsdGluX3JlbG9hZCwgICAgIE1FVEhfTywgcmVsb2FkX2RvY30sCiAgCXsicmVwciIsCWJ1aWx0aW5fcmVwciwgICAgICAgTUVUSF9PLCByZXByX2RvY30sCi0gCXsicm91bmQiLAlidWlsdGluX3JvdW5kLCAgICAgIE1FVEhfVkFSQVJHUywgcm91bmRfZG9jfSwKKyAJeyJyb3VuZCIsCShQeUNGdW5jdGlvbilidWlsdGluX3JvdW5kLCAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHJvdW5kX2RvY30sCiAgCXsic2V0YXR0ciIsCWJ1aWx0aW5fc2V0YXR0ciwgICAgTUVUSF9WQVJBUkdTLCBzZXRhdHRyX2RvY30sCiAgCXsic29ydGVkIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fc29ydGVkLCAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgc29ydGVkX2RvY30sCiAgCXsic3VtIiwJCWJ1aWx0aW5fc3VtLCAgICAgICAgTUVUSF9WQVJBUkdTLCBzdW1fZG9jfSwKZGlmZiAtLWdpdCBhL1B5dGhvbi9jZXZhbC5jIGIvUHl0aG9uL2NldmFsLmMKaW5kZXggNmY3Njc4MS4uNmM4YWZiYSAxMDA2NDQKLS0tIGEvUHl0aG9uL2NldmFsLmMKKysrIGIvUHl0aG9uL2NldmFsLmMKQEAgLTUwNyw3ICs1MDcsNyBAQAogfQogCiBQeU9iamVjdCAqCi1QeUV2YWxfRXZhbEZyYW1lRXgoUHlGcmFtZU9iamVjdCAqZiwgaW50IHRocm93KQorUHlFdmFsX0V2YWxGcmFtZUV4KFB5RnJhbWVPYmplY3QgKmYsIGludCB0aHJvd2ZsYWcpCiB7CiAjaWZkZWYgRFhQQUlSUwogCWludCBsYXN0b3Bjb2RlID0gMDsKQEAgLTc1Niw3ICs3NTYsNyBAQAogCXggPSBQeV9Ob25lOwkvKiBOb3QgYSByZWZlcmVuY2UsIGp1c3QgYW55dGhpbmcgbm9uLU5VTEwgKi8KIAl3ID0gTlVMTDsKIAotCWlmICh0aHJvdykgeyAvKiBzdXBwb3J0IGZvciBnZW5lcmF0b3IudGhyb3coKSAqLworCWlmICh0aHJvd2ZsYWcpIHsgLyogc3VwcG9ydCBmb3IgZ2VuZXJhdG9yLnRocm93KCkgKi8KIAkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKIAkJZ290byBvbl9lcnJvcjsKIAl9CkBAIC0yMTUzLDYgKzIxNTMsOSBAQAogCQljYXNlIFNFVFVQX0xPT1A6CiAJCWNhc2UgU0VUVVBfRVhDRVBUOgogCQljYXNlIFNFVFVQX0ZJTkFMTFk6CisJCQkvKiBOT1RFOiBJZiB5b3UgYWRkIGFueSBuZXcgYmxvY2stc2V0dXAgb3Bjb2RlcyB0aGF0IGFyZSBub3QgdHJ5L2V4Y2VwdC9maW5hbGx5CisJCQkgICBoYW5kbGVycywgeW91IG1heSBuZWVkIHRvIHVwZGF0ZSB0aGUgUHlHZW5fTmVlZHNGaW5hbGl6aW5nKCkgZnVuY3Rpb24uICovCisKIAkJCVB5RnJhbWVfQmxvY2tTZXR1cChmLCBvcGNvZGUsIElOU1RSX09GRlNFVCgpICsgb3BhcmcsCiAJCQkJCSAgIFNUQUNLX0xFVkVMKCkpOwogCQkJY29udGludWU7CkBAIC0zMTgwLDEzMiArMzE4MywyOSBAQAogCQkgICAgICBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50ICppbnN0cl9sYiwgaW50ICppbnN0cl91YiwKIAkJICAgICAgaW50ICppbnN0cl9wcmV2KQogewotCS8qIFRoZSB0aGVvcnkgb2YgU0VUX0xJTkVOTy1sZXNzIHRyYWNpbmcuCi0KLQkgICBJbiBhIG51dHNoZWxsLCB3ZSB1c2UgdGhlIGNvX2xub3RhYiBmaWVsZCBvZiB0aGUgY29kZSBvYmplY3QKLQkgICB0byB0ZWxsIHdoZW4gZXhlY3V0aW9uIGhhcyBtb3ZlZCBvbnRvIGEgZGlmZmVyZW50IGxpbmUuCi0KLQkgICBBcyBtZW50aW9uZWQgYWJvdmUsIHRoZSBiYXNpYyBpZGVhIGlzIHNvIHNldCB0aGluZ3MgdXAgc28KLQkgICB0aGF0Ci0KLQkgICAgICAgICAqaW5zdHJfbGIgPD0gZnJhbWUtPmZfbGFzdGkgPCAqaW5zdHJfdWIKLQotCSAgIGlzIHRydWUgc28gbG9uZyBhcyBleGVjdXRpb24gZG9lcyBub3QgY2hhbmdlIGxpbmVzLgotCi0JICAgVGhpcyBpcyBhbGwgZmFpcmx5IHNpbXBsZS4gIERpZ2dpbmcgdGhlIGluZm9ybWF0aW9uIG91dCBvZgotCSAgIGNvX2xub3RhYiB0YWtlcyBzb21lIHdvcmssIGJ1dCBpcyBjb25jZXB0dWFsbHkgY2xlYXIuCi0KLQkgICBTb21ld2hhdCBoYXJkZXIgdG8gZXhwbGFpbiBpcyB3aHkgd2UgZG9uJ3QgKmFsd2F5cyogY2FsbCB0aGUKLQkgICBsaW5lIHRyYWNlIGZ1bmN0aW9uIHdoZW4gdGhlIGFib3ZlIHRlc3QgZmFpbHMuCi0KLQkgICBDb25zaWRlciB0aGlzIGNvZGU6Ci0KLQkgICAxOiBkZWYgZihhKToKLQkgICAyOiAgICAgaWYgYToKLQkgICAzOiAgICAgICAgcHJpbnQgMQotCSAgIDQ6ICAgICBlbHNlOgotCSAgIDU6ICAgICAgICBwcmludCAyCi0KLQkgICB3aGljaCBjb21waWxlcyB0byB0aGlzOgotCi0JICAgMiAgICAgICAgICAgMCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoYSkKLQkJICAgICAgIDMgSlVNUF9JRl9GQUxTRSAgICAgICAgICAgIDkgKHRvIDE1KQotCQkgICAgICAgNiBQT1BfVE9QCi0KLQkgICAzICAgICAgICAgICA3IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotCQkgICAgICAxMCBQUklOVF9JVEVNCi0JCSAgICAgIDExIFBSSU5UX05FV0xJTkUKLQkJICAgICAgMTIgSlVNUF9GT1JXQVJEICAgICAgICAgICAgIDYgKHRvIDIxKQotCQkgPj4gICAxNSBQT1BfVE9QCi0KLQkgICA1ICAgICAgICAgIDE2IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICgyKQotCQkgICAgICAxOSBQUklOVF9JVEVNCi0JCSAgICAgIDIwIFBSSU5UX05FV0xJTkUKLQkJID4+ICAgMjEgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0JCSAgICAgIDI0IFJFVFVSTl9WQUxVRQotCi0JICAgSWYgJ2EnIGlzIGZhbHNlLCBleGVjdXRpb24gd2lsbCBqdW1wIHRvIGluc3RydWN0aW9uIGF0IG9mZnNldAotCSAgIDE1IGFuZCB0aGUgY29fbG5vdGFiIHdpbGwgY2xhaW0gdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIHRvCi0JICAgbGluZSAzLiAgVGhpcyBpcyBhdCBiZXN0IG1pc2xlYWRpbmcuICBJbiB0aGlzIGNhc2Ugd2UgY291bGQKLQkgICBhc3NvY2lhdGUgdGhlIFBPUF9UT1Agd2l0aCBsaW5lIDQsIGJ1dCB0aGF0IGRvZXNuJ3QgbWFrZQotCSAgIHNlbnNlIGluIGFsbCBjYXNlcyAoSSB0aGluaykuCi0KLQkgICBXaGF0IHdlIGRvIGlzIG9ubHkgY2FsbCB0aGUgbGluZSB0cmFjZSBmdW5jdGlvbiBpZiB0aGUgY29fbG5vdGFiCi0JICAgaW5kaWNhdGVzIHdlIGhhdmUganVtcGVkIHRvIHRoZSAqc3RhcnQqIG9mIGEgbGluZSwgaS5lLiBpZiB0aGUKLQkgICBjdXJyZW50IGluc3RydWN0aW9uIG9mZnNldCBtYXRjaGVzIHRoZSBvZmZzZXQgZ2l2ZW4gZm9yIHRoZQotCSAgIHN0YXJ0IG9mIGEgbGluZSBieSB0aGUgY29fbG5vdGFiLgotCi0JICAgVGhpcyBhbHNvIHRha2VzIGNhcmUgb2YgdGhlIHNpdHVhdGlvbiB3aGVyZSAnYScgaXMgdHJ1ZS4KLQkgICBFeGVjdXRpb24gd2lsbCBqdW1wIGZyb20gaW5zdHJ1Y3Rpb24gb2Zmc2V0IDEyIHRvIG9mZnNldCAyMS4KLQkgICBUaGVuIHRoZSBjb19sbm90YWIgd291bGQgaW1wbHkgdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIHRvIGxpbmUKLQkgICA1LCB3aGljaCBpcyBhZ2FpbiBtaXNsZWFkaW5nLgotCi0JICAgV2h5IGRvIHdlIHNldCBmX2xpbmVubyB3aGVuIHRyYWNpbmc/ICBXZWxsLCBjb25zaWRlciB0aGUgY29kZQotCSAgIGFib3ZlIHdoZW4gJ2EnIGlzIHRydWUuICBJZiBzdGVwcGluZyB0aHJvdWdoIHRoaXMgd2l0aCAnbicgaW4KLQkgICBwZGIsIHlvdSB3b3VsZCBzdG9wIGF0IGxpbmUgMSB3aXRoIGEgImNhbGwiIHR5cGUgZXZlbnQsIHRoZW4KLQkgICBsaW5lIGV2ZW50cyBvbiBsaW5lcyAyIGFuZCAzLCB0aGVuIGEgInJldHVybiIgdHlwZSBldmVudCAtLSBidXQKLQkgICB5b3Ugd291bGQgYmUgc2hvd24gbGluZSA1IGR1cmluZyB0aGlzIGV2ZW50LiAgVGhpcyBpcyBhIGNoYW5nZQotCSAgIGZyb20gdGhlIGJlaGF2aW91ciBpbiAyLjIgYW5kIGJlZm9yZSwgYW5kIEkndmUgZm91bmQgaXQKLQkgICBjb25mdXNpbmcgaW4gcHJhY3RpY2UuICBCeSBzZXR0aW5nIGFuZCB1c2luZyBmX2xpbmVubyB3aGVuCi0JICAgdHJhY2luZywgb25lIGNhbiByZXBvcnQgYSBsaW5lIG51bWJlciBkaWZmZXJlbnQgZnJvbSB0aGF0Ci0JICAgc3VnZ2VzdGVkIGJ5IGZfbGFzdGkgb24gdGhpcyBvbmUgb2NjYXNpb24gd2hlcmUgaXQncyBkZXNpcmFibGUuCi0JKi8KLQogCWludCByZXN1bHQgPSAwOwogCisgICAgICAgIC8qIElmIHRoZSBsYXN0IGluc3RydWN0aW9uIGV4ZWN1dGVkIGlzbid0IGluIHRoZSBjdXJyZW50CisgICAgICAgICAgIGluc3RydWN0aW9uIHdpbmRvdywgcmVzZXQgdGhlIHdpbmRvdy4gIElmIHRoZSBsYXN0CisgICAgICAgICAgIGluc3RydWN0aW9uIGhhcHBlbnMgdG8gZmFsbCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIG9yIGlmIGl0CisgICAgICAgICAgIHJlcHJlc2VudHMgYSBqdW1wIGJhY2t3YXJkcywgY2FsbCB0aGUgdHJhY2UgZnVuY3Rpb24uCisgICAgICAgICovCiAJaWYgKChmcmFtZS0+Zl9sYXN0aSA8ICppbnN0cl9sYiB8fCBmcmFtZS0+Zl9sYXN0aSA+PSAqaW5zdHJfdWIpKSB7Ci0JCVB5Q29kZU9iamVjdCogY28gPSBmcmFtZS0+Zl9jb2RlOwotCQlpbnQgc2l6ZSwgYWRkciwgbGluZTsKLQkJdW5zaWduZWQgY2hhciogcDsKKyAgICAgICAgICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgICAgICAgICBQeUFkZHJQYWlyIGJvdW5kczsKIAotCQlzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY28tPmNvX2xub3RhYikgLyAyOwotCQlwID0gKHVuc2lnbmVkIGNoYXIqKVB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fbG5vdGFiKTsKLQotCQlhZGRyID0gMDsKLQkJbGluZSA9IGNvLT5jb19maXJzdGxpbmVubzsKLQotCQkvKiBwb3NzaWJsZSBvcHRpbWl6YXRpb246IGlmIGYtPmZfbGFzdGkgPT0gaW5zdHJfdWIKLQkJICAgKGxpa2VseSB0byBiZSBhIGNvbW1vbiBjYXNlKSB0aGVuIHdlIGFscmVhZHkga25vdwotCQkgICBpbnN0cl9sYiAtLSBpZiB3ZSBzdG9yZWQgdGhlIG1hdGNoaW5nIHZhbHVlIG9mIHAKLQkJICAgc29td2hlcmUgd2UgY291bGQgc2tpcCB0aGUgZmlyc3Qgd2hpbGUgbG9vcC4gKi8KLQotCQkvKiBzZWUgY29tbWVudHMgaW4gY29tcGlsZS5jIGZvciB0aGUgZGVzY3JpcHRpb24gb2YKLQkJICAgY29fbG5vdGFiLiAgQSBwb2ludCB0byByZW1lbWJlcjogaW5jcmVtZW50cyB0byBwCi0JCSAgIHNob3VsZCBjb21lIGluIHBhaXJzIC0tIGFsdGhvdWdoIHdlIGRvbid0IGNhcmUgYWJvdXQKLQkJICAgdGhlIGxpbmUgaW5jcmVtZW50cyBoZXJlLCB0cmVhdGluZyB0aGVtIGFzIGJ5dGUKLQkJICAgaW5jcmVtZW50cyBnZXRzIGNvbmZ1c2luZywgdG8gc2F5IHRoZSBsZWFzdC4gKi8KLQotCQl3aGlsZSAoc2l6ZSA+IDApIHsKLQkJCWlmIChhZGRyICsgKnAgPiBmcmFtZS0+Zl9sYXN0aSkKLQkJCQlicmVhazsKLQkJCWFkZHIgKz0gKnArKzsKLQkJCWlmICgqcCkgKmluc3RyX2xiID0gYWRkcjsKLQkJCWxpbmUgKz0gKnArKzsKLQkJCS0tc2l6ZTsKLQkJfQotCi0JCWlmIChhZGRyID09IGZyYW1lLT5mX2xhc3RpKSB7CisgICAgICAgICAgICAgICAgbGluZSA9IFB5Q29kZV9DaGVja0xpbmVOdW1iZXIoZnJhbWUtPmZfY29kZSwgZnJhbWUtPmZfbGFzdGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPj0gMCkgewogCQkJZnJhbWUtPmZfbGluZW5vID0gbGluZTsKIAkJCXJlc3VsdCA9IGNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwKIAkJCQkJICAgIFB5VHJhY2VfTElORSwgUHlfTm9uZSk7Ci0JCX0KLQotCQlpZiAoc2l6ZSA+IDApIHsKLQkJCXdoaWxlICgtLXNpemUgPj0gMCkgewotCQkJCWFkZHIgKz0gKnArKzsKLQkJCQlpZiAoKnArKykKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkqaW5zdHJfdWIgPSBhZGRyOwotCQl9Ci0JCWVsc2UgewotCQkJKmluc3RyX3ViID0gSU5UX01BWDsKLQkJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqaW5zdHJfbGIgPSBib3VuZHMuYXBfbG93ZXI7CisgICAgICAgICAgICAgICAgKmluc3RyX3ViID0gYm91bmRzLmFwX3VwcGVyOwogCX0KIAllbHNlIGlmIChmcmFtZS0+Zl9sYXN0aSA8PSAqaW5zdHJfcHJldikgewotCQkvKiBqdW1waW5nIGJhY2sgaW4gdGhlIHNhbWUgbGluZSBmb3JjZXMgYSB0cmFjZSBldmVudCAqLwotCQlyZXN1bHQgPSBjYWxsX3RyYWNlKGZ1bmMsIG9iaiwgZnJhbWUsCi0JCQkJICAgIFB5VHJhY2VfTElORSwgUHlfTm9uZSk7CisJCXJlc3VsdCA9IGNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwgUHlUcmFjZV9MSU5FLCBQeV9Ob25lKTsKIAl9CiAJKmluc3RyX3ByZXYgPSBmcmFtZS0+Zl9sYXN0aTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMzYyMyw5ICszNTIzLDkgQEAKIAkJUHlfREVDUkVGKGZ1bmMpOwogCX0KIAotCS8qIENsZWFyIHRoZSBzdGFjayBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0IGFuZCB0aGUgYXJndW1lbnRzLAotCSAgIGluIGNhc2UgdGhleSB3ZXJlbid0IGNvbnN1bWVkIGFscmVhZHkuCi0JICAgWFhYKHR3b3V0ZXJzKSB3aGVuIGFyZSB0aGV5IG5vdCBjb25zdW1lZCBhbHJlYWR5PworCS8qIENsZWFyIHRoZSBzdGFjayBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgQWxzbyByZW1vdmVzCisgICAgICAgICAgIHRoZSBhcmd1bWVudHMgaW4gY2FzZSB0aGV5IHdlcmVuJ3QgY29uc3VtZWQgYWxyZWFkeQorICAgICAgICAgICAoZmFzdF9mdW5jdGlvbigpIGFuZCBlcnJfYXJncygpIGxlYXZlIHRoZW0gb24gdGhlIHN0YWNrKS4KIAkgKi8KIAl3aGlsZSAoKCpwcF9zdGFjaykgPiBwZnVuYykgewogCQl3ID0gRVhUX1BPUCgqcHBfc3RhY2spOwpAQCAtMzg5OSw3ICszNzk5LDcgQEAKIAlpZiAodiAhPSBOVUxMKSB7CiAJCVB5X3NzaXplX3QgeDsKIAkJaWYgKFB5SW50X0NoZWNrKHYpKSB7Ci0JCQl4ID0gUHlJbnRfQXNMb25nKHYpOworCQkJeCA9IFB5SW50X0FzU3NpemVfdCh2KTsKIAkJfSAKIAkJZWxzZSBpZiAodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICYmCiAJCQkgUHlUeXBlX0hhc0ZlYXR1cmUodi0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lOREVYKQpAQCAtNDMwMiw4ICs0MjAyLDggQEAKIAkJLyogTm93IHdlIG93biB0aGUgbGFzdCByZWZlcmVuY2UgdG8gJ3YnLCBzbyB3ZSBjYW4gcmVzaXplIGl0CiAJCSAqIGluLXBsYWNlLgogCQkgKi8KLQkJaW50IHZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7Ci0JCWludCB3X2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHcpOworCQlQeV9zc2l6ZV90IHZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisJCVB5X3NzaXplX3Qgd19sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh3KTsKIAkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIHZfbGVuICsgd19sZW4pICE9IDApIHsKIAkJCS8qIFhYWCBpZiBfUHlTdHJpbmdfUmVzaXplKCkgZmFpbHMsICd2JyBoYXMgYmVlbgogCQkJICogZGVhbGxvY2F0ZWQgc28gaXQgY2Fubm90IGJlIHB1dCBiYWNrIGludG8gJ3ZhcmlhYmxlJy4KZGlmZiAtLWdpdCBhL1B5dGhvbi9jb2RlY3MuYyBiL1B5dGhvbi9jb2RlY3MuYwppbmRleCAwZThjMzc0Li4yMTI0ODI0IDEwMDY0NAotLS0gYS9QeXRob24vY29kZWNzLmMKKysrIGIvUHl0aG9uL2NvZGVjcy5jCkBAIC01NiwxMiArNTYsMTIgQEAKICAgICBjaGFyICpwOwogICAgIFB5T2JqZWN0ICp2OwogICAgIAotCWlmIChsZW4gPiBJTlRfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIGlzIHRvbyBsYXJnZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYKSB7CisJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzdHJpbmcgaXMgdG9vIGxhcmdlIik7CisJcmV0dXJuIE5VTEw7CisgICAgfQogCQotICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoaW50KWxlbik7CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CiAgICAgaWYgKHYgPT0gTlVMTCkKIAlyZXR1cm4gTlVMTDsKICAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpOwpAQCAtMjAwLDI0ICsyMDAsNjUgQEAKICAgICByZXR1cm4gYXJnczsKIH0KIAotLyogQnVpbGQgYSBjb2RlYyBieSBjYWxsaW5nIGZhY3Rvcnkoc3RyZWFtWyxlcnJvcnNdKSBvciBqdXN0Ci0gICBmYWN0b3J5KGVycm9ycykgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGdpdmVuIHBhcmFtZXRlcnMgYXJlCi0gICBub24tTlVMTC4gKi8KKy8qIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgYSBjb2RlYyBpdGVtICovCiAKIHN0YXRpYwotUHlPYmplY3QgKmJ1aWxkX3N0cmVhbV9jb2RlYyhQeU9iamVjdCAqZmFjdG9yeSwKLQkJCSAgICAgUHlPYmplY3QgKnN0cmVhbSwKLQkJCSAgICAgY29uc3QgY2hhciAqZXJyb3JzKQorUHlPYmplY3QgKmNvZGVjX2dldGl0ZW0oY29uc3QgY2hhciAqZW5jb2RpbmcsIGludCBpbmRleCkKIHsKLSAgICBQeU9iamVjdCAqYXJncywgKmNvZGVjOworICAgIFB5T2JqZWN0ICpjb2RlY3M7CisgICAgUHlPYmplY3QgKnY7CiAKLSAgICBhcmdzID0gYXJnc190dXBsZShzdHJlYW0sIGVycm9ycyk7Ci0gICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOworICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKIAlyZXR1cm4gTlVMTDsKLSAgICAKLSAgICBjb2RlYyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZhY3RvcnksIGFyZ3MpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICByZXR1cm4gY29kZWM7CisgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oY29kZWNzLCBpbmRleCk7CisgICAgUHlfREVDUkVGKGNvZGVjcyk7CisgICAgUHlfSU5DUkVGKHYpOworICAgIHJldHVybiB2OworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIGluY3JlbWVudGFsIGNvZGVjLiAqLworCitzdGF0aWMKK1B5T2JqZWN0ICpjb2RlY19nZXRpbmNyZW1lbnRhbGNvZGVjKGNvbnN0IGNoYXIgKmVuY29kaW5nLAorCQkJCSAgICBjb25zdCBjaGFyICplcnJvcnMsCisJCQkJICAgIGNvbnN0IGNoYXIgKmF0dHJuYW1lKQoreworICAgIFB5T2JqZWN0ICpjb2RlY3MsICpyZXQsICppbmNjb2RlYzsKKworICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7CisgICAgaWYgKGNvZGVjcyA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgIGluY2NvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb2RlY3MsIGF0dHJuYW1lKTsKKyAgICBQeV9ERUNSRUYoY29kZWNzKTsKKyAgICBpZiAoaW5jY29kZWMgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZXJyb3JzKQorCXJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihpbmNjb2RlYywgInMiLCBlcnJvcnMpOworICAgIGVsc2UKKwlyZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oaW5jY29kZWMsIE5VTEwpOworICAgIFB5X0RFQ1JFRihpbmNjb2RlYyk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHN0cmVhbSBjb2RlYy4gKi8KKworc3RhdGljCitQeU9iamVjdCAqY29kZWNfZ2V0c3RyZWFtY29kZWMoY29uc3QgY2hhciAqZW5jb2RpbmcsCisJCQkgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKKwkJCSAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCisJCQkgICAgICAgY29uc3QgaW50IGluZGV4KQoreworICAgIFB5T2JqZWN0ICpjb2RlY3MsICpzdHJlYW1jb2RlYzsKKworICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7CisgICAgaWYgKGNvZGVjcyA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgc3RyZWFtY29kZWMgPSBQeUV2YWxfQ2FsbEZ1bmN0aW9uKAorCVB5VHVwbGVfR0VUX0lURU0oY29kZWNzLCBpbmRleCksICJPcyIsIHN0cmVhbSwgZXJyb3JzKTsKKyAgICBQeV9ERUNSRUYoY29kZWNzKTsKKyAgICByZXR1cm4gc3RyZWFtY29kZWM7CiB9CiAKIC8qIENvbnZlbmllbmNlIEFQSXMgdG8gcXVlcnkgdGhlIENvZGVjIHJlZ2lzdHJ5LiAKQEAgLTIyOCwxMjAgKzI2OSwzOCBAQAogCiBQeU9iamVjdCAqUHlDb2RlY19FbmNvZGVyKGNvbnN0IGNoYXIgKmVuY29kaW5nKQogewotICAgIFB5T2JqZWN0ICpjb2RlY3M7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOwotICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7Ci0gICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oY29kZWNzLDApOwotICAgIFB5X0RFQ1JFRihjb2RlY3MpOwotICAgIFB5X0lOQ1JFRih2KTsKLSAgICByZXR1cm4gdjsKLQotIG9uRXJyb3I6Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNvZGVjX2dldGl0ZW0oZW5jb2RpbmcsIDApOwogfQogCiBQeU9iamVjdCAqUHlDb2RlY19EZWNvZGVyKGNvbnN0IGNoYXIgKmVuY29kaW5nKQogewotICAgIFB5T2JqZWN0ICpjb2RlY3M7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOwotICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7Ci0gICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oY29kZWNzLDEpOwotICAgIFB5X0RFQ1JFRihjb2RlY3MpOwotICAgIFB5X0lOQ1JFRih2KTsKLSAgICByZXR1cm4gdjsKLQotIG9uRXJyb3I6Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNvZGVjX2dldGl0ZW0oZW5jb2RpbmcsIDEpOwogfQogCiBQeU9iamVjdCAqUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXIoY29uc3QgY2hhciAqZW5jb2RpbmcsCiAJCQkJICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7Ci0gICAgUHlPYmplY3QgKmNvZGVjcywgKnJldCwgKmVuY29kZXI7Ci0KLSAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOwotICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7Ci0gICAgZW5jb2RlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29kZWNzLCAiaW5jcmVtZW50YWxlbmNvZGVyIik7Ci0gICAgaWYgKGVuY29kZXIgPT0gTlVMTCkgewotCVB5X0RFQ1JFRihjb2RlY3MpOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoZXJyb3JzKQotCXJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihlbmNvZGVyLCAiTyIsIGVycm9ycyk7Ci0gICAgZWxzZQotCXJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihlbmNvZGVyLCBOVUxMKTsKLSAgICBQeV9ERUNSRUYoZW5jb2Rlcik7Ci0gICAgUHlfREVDUkVGKGNvZGVjcyk7Ci0gICAgcmV0dXJuIHJldDsKLQotIG9uRXJyb3I6Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNvZGVjX2dldGluY3JlbWVudGFsY29kZWMoZW5jb2RpbmcsIGVycm9ycywgImluY3JlbWVudGFsZW5jb2RlciIpOwogfQogCiBQeU9iamVjdCAqUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIoY29uc3QgY2hhciAqZW5jb2RpbmcsCiAJCQkJICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7Ci0gICAgUHlPYmplY3QgKmNvZGVjcywgKnJldCwgKmRlY29kZXI7Ci0KLSAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOwotICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7Ci0gICAgZGVjb2RlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29kZWNzLCAiaW5jcmVtZW50YWxkZWNvZGVyIik7Ci0gICAgaWYgKGRlY29kZXIgPT0gTlVMTCkgewotCVB5X0RFQ1JFRihjb2RlY3MpOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoZXJyb3JzKQotCXJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihkZWNvZGVyLCAiTyIsIGVycm9ycyk7Ci0gICAgZWxzZQotCXJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihkZWNvZGVyLCBOVUxMKTsKLSAgICBQeV9ERUNSRUYoZGVjb2Rlcik7Ci0gICAgUHlfREVDUkVGKGNvZGVjcyk7Ci0gICAgcmV0dXJuIHJldDsKLQotIG9uRXJyb3I6Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNvZGVjX2dldGluY3JlbWVudGFsY29kZWMoZW5jb2RpbmcsIGVycm9ycywgImluY3JlbWVudGFsZGVjb2RlciIpOwogfQogCiBQeU9iamVjdCAqUHlDb2RlY19TdHJlYW1SZWFkZXIoY29uc3QgY2hhciAqZW5jb2RpbmcsCiAJCQkgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKIAkJCSAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7Ci0gICAgUHlPYmplY3QgKmNvZGVjcywgKnJldDsKLQotICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7Ci0gICAgaWYgKGNvZGVjcyA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKLSAgICByZXQgPSBidWlsZF9zdHJlYW1fY29kZWMoUHlUdXBsZV9HRVRfSVRFTShjb2RlY3MsMiksc3RyZWFtLGVycm9ycyk7Ci0gICAgUHlfREVDUkVGKGNvZGVjcyk7Ci0gICAgcmV0dXJuIHJldDsKLQotIG9uRXJyb3I6Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNvZGVjX2dldHN0cmVhbWNvZGVjKGVuY29kaW5nLCBzdHJlYW0sIGVycm9ycywgMik7CiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX1N0cmVhbVdyaXRlcihjb25zdCBjaGFyICplbmNvZGluZywKIAkJCSAgICAgICBQeU9iamVjdCAqc3RyZWFtLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKLSAgICBQeU9iamVjdCAqY29kZWNzLCAqcmV0OwotCi0gICAgY29kZWNzID0gX1B5Q29kZWNfTG9va3VwKGVuY29kaW5nKTsKLSAgICBpZiAoY29kZWNzID09IE5VTEwpCi0JZ290byBvbkVycm9yOwotICAgIHJldCA9IGJ1aWxkX3N0cmVhbV9jb2RlYyhQeVR1cGxlX0dFVF9JVEVNKGNvZGVjcywzKSxzdHJlYW0sZXJyb3JzKTsKLSAgICBQeV9ERUNSRUYoY29kZWNzKTsKLSAgICByZXR1cm4gcmV0OwotCi0gb25FcnJvcjoKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY29kZWNfZ2V0c3RyZWFtY29kZWMoZW5jb2RpbmcsIHN0cmVhbSwgZXJyb3JzLCAzKTsKIH0KIAogLyogRW5jb2RlIGFuIG9iamVjdCAoZS5nLiBhbiBVbmljb2RlIG9iamVjdCkgdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nCmRpZmYgLS1naXQgYS9QeXRob24vY29tcGlsZS5jIGIvUHl0aG9uL2NvbXBpbGUuYwppbmRleCBiOTJmYjYyLi4xMmIxOTBhIDEwMDY0NAotLS0gYS9QeXRob24vY29tcGlsZS5jCisrKyBiL1B5dGhvbi9jb21waWxlLmMKQEAgLTU4LDggKzU4LDkgQEAKIH07CiAKIHR5cGVkZWYgc3RydWN0IGJhc2ljYmxvY2tfIHsKLQkvKiBuZXh0IGJsb2NrIGluIHRoZSBsaXN0IG9mIGJsb2NrcyBmb3IgYSB1bml0IChkb24ndCBjb25mdXNlIHdpdGgKLQkgKiBiX25leHQpICovCisgICAgLyogRWFjaCBiYXNpY2Jsb2NrIGluIGEgY29tcGlsYXRpb24gdW5pdCBpcyBsaW5rZWQgdmlhIGJfbGlzdCBpbiB0aGUKKyAgICAgICByZXZlcnNlIG9yZGVyIHRoYXQgdGhlIGJsb2NrIGFyZSBhbGxvY2F0ZWQuICBiX2xpc3QgcG9pbnRzIHRvIHRoZSBuZXh0CisgICAgICAgYmxvY2ssIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGJfbmV4dCwgd2hpY2ggaXMgbmV4dCBieSBjb250cm9sIGZsb3cuICovCiAJc3RydWN0IGJhc2ljYmxvY2tfICpiX2xpc3Q7CiAJLyogbnVtYmVyIG9mIGluc3RydWN0aW9ucyB1c2VkICovCiAJaW50IGJfaXVzZWQ7CkBAIC0xMTQsNyArMTE1LDkgQEAKIAlQeU9iamVjdCAqdV9wcml2YXRlOwkvKiBmb3IgcHJpdmF0ZSBuYW1lIG1hbmdsaW5nICovCiAKIAlpbnQgdV9hcmdjb3VudDsJICAgLyogbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgYmxvY2sgKi8gCi0JYmFzaWNibG9jayAqdV9ibG9ja3M7IC8qIHBvaW50ZXIgdG8gbGlzdCBvZiBibG9ja3MgKi8KKyAgICAvKiBQb2ludGVyIHRvIHRoZSBtb3N0IHJlY2VudGx5IGFsbG9jYXRlZCBibG9jay4gIEJ5IGZvbGxvd2luZyBiX2xpc3QKKyAgICAgICBtZW1iZXJzLCB5b3UgY2FuIHJlYWNoIGFsbCBlYXJseSBhbGxvY2F0ZWQgYmxvY2tzLiAqLworCWJhc2ljYmxvY2sgKnVfYmxvY2tzOwogCWJhc2ljYmxvY2sgKnVfY3VyYmxvY2s7IC8qIHBvaW50ZXIgdG8gY3VycmVudCBibG9jayAqLwogCWludCB1X3RtcG5hbWU7CSAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgZm9yIGxpc3QgY29tcHMgKi8KIApAQCAtMTk0LDE5ICsxOTcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqX19kb2NfXzsKIAogUHlPYmplY3QgKgotX1B5X01hbmdsZShQeU9iamVjdCAqcHJpdmF0ZSwgUHlPYmplY3QgKmlkZW50KQorX1B5X01hbmdsZShQeU9iamVjdCAqcHJpdmF0ZW9iaiwgUHlPYmplY3QgKmlkZW50KQogewogCS8qIE5hbWUgbWFuZ2xpbmc6IF9fcHJpdmF0ZSBiZWNvbWVzIF9jbGFzc25hbWVfX3ByaXZhdGUuCiAJICAgVGhpcyBpcyBpbmRlcGVuZGVudCBmcm9tIGhvdyB0aGUgbmFtZSBpcyB1c2VkLiAqLwogCWNvbnN0IGNoYXIgKnAsICpuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoaWRlbnQpOwogCWNoYXIgKmJ1ZmZlcjsKIAlzaXplX3QgbmxlbiwgcGxlbjsKLQlpZiAocHJpdmF0ZSA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCB8fCBuYW1lWzBdICE9ICdfJyB8fAorCWlmIChwcml2YXRlb2JqID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gIT0gJ18nIHx8CiAgICAgICAgICAgICBuYW1lWzFdICE9ICdfJykgewogCQlQeV9JTkNSRUYoaWRlbnQpOwogCQlyZXR1cm4gaWRlbnQ7CiAJfQotCXAgPSBQeVN0cmluZ19Bc1N0cmluZyhwcml2YXRlKTsKKwlwID0gUHlTdHJpbmdfQXNTdHJpbmcocHJpdmF0ZW9iaik7CiAJbmxlbiA9IHN0cmxlbihuYW1lKTsKIAlpZiAobmFtZVtubGVuLTFdID09ICdfJyAmJiBuYW1lW25sZW4tMl0gPT0gJ18nKSB7CiAJCVB5X0lOQ1JFRihpZGVudCk7CkBAIC0zMTEsNyArMzE0LDcgQEAKIAlpZiAoYy0+Y19zdCkKIAkJUHlTeW10YWJsZV9GcmVlKGMtPmNfc3QpOwogCWlmIChjLT5jX2Z1dHVyZSkKLQkJUHlNZW1fRnJlZShjLT5jX2Z1dHVyZSk7CisJCVB5T2JqZWN0X0ZyZWUoYy0+Y19mdXR1cmUpOwogCVB5X0RFQ1JFRihjLT5jX3N0YWNrKTsKIH0KIApAQCAtMzE5LDcgKzMyMiw5IEBACiBsaXN0MmRpY3QoUHlPYmplY3QgKmxpc3QpCiB7CiAJUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICp2LCAqaywgKmRpY3QgPSBQeURpY3RfTmV3KCk7CisJUHlPYmplY3QgKnYsICprOworCVB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOworCWlmICghZGljdCkgcmV0dXJuIE5VTEw7CiAKIAluID0gUHlMaXN0X1NpemUobGlzdCk7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewpAQCAtNjAyLDcgKzYwNyw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50ICoKIG1hcmtibG9ja3ModW5zaWduZWQgY2hhciAqY29kZSwgaW50IGxlbikKIHsKLQl1bnNpZ25lZCBpbnQgKmJsb2NrcyA9IFB5TWVtX01hbGxvYyhsZW4qc2l6ZW9mKGludCkpOworCXVuc2lnbmVkIGludCAqYmxvY2tzID0gKHVuc2lnbmVkIGludCAqKVB5TWVtX01hbGxvYyhsZW4qc2l6ZW9mKGludCkpOwogCWludCBpLGosIG9wY29kZSwgYmxvY2tjbnQgPSAwOwogCiAJaWYgKGJsb2NrcyA9PSBOVUxMKQpAQCAtNjgzLDEwICs2ODgsMTEgQEAKIAkJZ290byBleGl0VW5jaGFuZ2VkOwogCiAJLyogTWFrZSBhIG1vZGlmaWFibGUgY29weSBvZiB0aGUgY29kZSBzdHJpbmcgKi8KLQljb2Rlc3RyID0gUHlNZW1fTWFsbG9jKGNvZGVsZW4pOworCWNvZGVzdHIgPSAodW5zaWduZWQgY2hhciAqKVB5TWVtX01hbGxvYyhjb2RlbGVuKTsKIAlpZiAoY29kZXN0ciA9PSBOVUxMKQogCQlnb3RvIGV4aXRVbmNoYW5nZWQ7Ci0JY29kZXN0ciA9IG1lbWNweShjb2Rlc3RyLCBQeVN0cmluZ19BU19TVFJJTkcoY29kZSksIGNvZGVsZW4pOworCWNvZGVzdHIgPSAodW5zaWduZWQgY2hhciAqKW1lbWNweShjb2Rlc3RyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoY29kZSksIGNvZGVsZW4pOwogCiAJLyogVmVyaWZ5IHRoYXQgUkVUVVJOX1ZBTFVFIHRlcm1pbmF0ZXMgdGhlIGNvZGVzdHJpbmcuCVRoaXMgYWxsb3dzCiAJICAgdGhlIHZhcmlvdXMgdHJhbnNmb3JtYXRpb24gcGF0dGVybnMgdG8gbG9vayBhaGVhZCBzZXZlcmFsCkBAIC02OTcsNyArNzAzLDcgQEAKIAkJZ290byBleGl0VW5jaGFuZ2VkOwogCiAJLyogTWFwcGluZyB0byBuZXcganVtcCB0YXJnZXRzIGFmdGVyIE5PUHMgYXJlIHJlbW92ZWQgKi8KLQlhZGRybWFwID0gUHlNZW1fTWFsbG9jKGNvZGVsZW4gKiBzaXplb2YoaW50KSk7CisJYWRkcm1hcCA9IChpbnQgKilQeU1lbV9NYWxsb2MoY29kZWxlbiAqIHNpemVvZihpbnQpKTsKIAlpZiAoYWRkcm1hcCA9PSBOVUxMKQogCQlnb3RvIGV4aXRVbmNoYW5nZWQ7CiAKQEAgLTEwNzcsNyArMTA4Myw4IEBACiB7CiAJc3RydWN0IGNvbXBpbGVyX3VuaXQgKnU7CiAKLQl1ID0gUHlPYmplY3RfTWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tcGlsZXJfdW5pdCkpOworCXUgPSAoc3RydWN0IGNvbXBpbGVyX3VuaXQgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGVyX3VuaXQpKTsKIAlpZiAoIXUpIHsKIAkJUHlFcnJfTm9NZW1vcnkoKTsKIAkJcmV0dXJuIDA7CkBAIC0xMTg3LDcgKzExOTQsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAJbWVtc2V0KCh2b2lkICopYiwgMCwgc2l6ZW9mKGJhc2ljYmxvY2spKTsKLQlhc3NlcnQgKGItPmJfbmV4dCA9PSBOVUxMKTsKKyAgICAvKiBFeHRlbmQgdGhlIHNpbmdseSBsaW5rZWQgbGlzdCBvZiBibG9ja3Mgd2l0aCBuZXcgYmxvY2suICovCiAJYi0+Yl9saXN0ID0gdS0+dV9ibG9ja3M7CiAJdS0+dV9ibG9ja3MgPSBiOwogCXJldHVybiBiOwpAQCAtMTIzMyw4ICsxMjQwLDggQEAKIHsKIAlhc3NlcnQoYiAhPSBOVUxMKTsKIAlpZiAoYi0+Yl9pbnN0ciA9PSBOVUxMKSB7Ci0JCWItPmJfaW5zdHIgPSBQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnN0cikgKgotCQkJCQkgICAgIERFRkFVTFRfQkxPQ0tfU0laRSk7CisJCWItPmJfaW5zdHIgPSAoc3RydWN0IGluc3RyICopUHlPYmplY3RfTWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbnN0cikgKiBERUZBVUxUX0JMT0NLX1NJWkUpOwogCQlpZiAoYi0+Yl9pbnN0ciA9PSBOVUxMKSB7CiAJCQlQeUVycl9Ob01lbW9yeSgpOwogCQkJcmV0dXJuIC0xOwpAQCAtMTI1Miw3ICsxMjU5LDggQEAKIAkJCXJldHVybiAtMTsKIAkJfQogCQliLT5iX2lhbGxvYyA8PD0gMTsKLQkJYi0+Yl9pbnN0ciA9IFB5T2JqZWN0X1JlYWxsb2MoKHZvaWQgKiliLT5iX2luc3RyLCBuZXdzaXplKTsKKwkJYi0+Yl9pbnN0ciA9IChzdHJ1Y3QgaW5zdHIgKilQeU9iamVjdF9SZWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiliLT5iX2luc3RyLCBuZXdzaXplKTsKIAkJaWYgKGItPmJfaW5zdHIgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKIAkJbWVtc2V0KChjaGFyICopYi0+Yl9pbnN0ciArIG9sZHNpemUsIDAsIG5ld3NpemUgLSBvbGRzaXplKTsKQEAgLTEyNjAsNiArMTI2OCwxMyBAQAogCXJldHVybiBiLT5iX2l1c2VkKys7CiB9CiAKKy8qIFNldCB0aGUgaV9saW5lbm8gbWVtYmVyIG9mIHRoZSBpbnN0cnVjdGlvbiBhdCBvZmZzZSBvZmYgaWYgdGhlCisgICBsaW5lIG51bWJlciBmb3IgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbi9zdGF0ZW1lbnQgKD8pIGhhcyBub3QKKyAgIGFscmVhZHkgYmVlbiBzZXQuICBJZiBpdCBoYXMgYmVlbiBzZXQsIHRoZSBjYWxsIGhhcyBubyBlZmZlY3QuCisKKyAgIEV2ZXJ5IHRpbWUgYSBuZXcgbm9kZSBpcyBiCisgICAqLworCiBzdGF0aWMgdm9pZAogY29tcGlsZXJfc2V0X2xpbmVubyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBvZmYpCiB7CkBAIC0xNjAwLDcgKzE2MTUsNiBAQAogCW9mZiA9IGNvbXBpbGVyX25leHRfaW5zdHIoYywgYy0+dS0+dV9jdXJibG9jayk7CiAJaWYgKG9mZiA8IDApCiAJCXJldHVybiAwOwotCWNvbXBpbGVyX3NldF9saW5lbm8oYywgb2ZmKTsKIAlpID0gJmMtPnUtPnVfY3VyYmxvY2stPmJfaW5zdHJbb2ZmXTsKIAlpLT5pX29wY29kZSA9IG9wY29kZTsKIAlpLT5pX3RhcmdldCA9IGI7CkBAIC0xNjA5LDYgKzE2MjMsNyBAQAogCQlpLT5pX2phYnMgPSAxOwogCWVsc2UKIAkJaS0+aV9qcmVsID0gMTsKKwljb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE2OTUsNyArMTcxMCw3IEBACiAJaW50IF9pOyBcCiAJYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKIAlmb3IgKF9pID0gMDsgX2kgPCBhc2RsX3NlcV9MRU4oc2VxKTsgX2krKykgeyBcCi0JCVRZUEUgIyMgX3R5IGVsdCA9IGFzZGxfc2VxX0dFVChzZXEsIF9pKTsgXAorCQlUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgX2kpOyBcCiAJCWlmICghY29tcGlsZXJfdmlzaXRfICMjIFRZUEUoKEMpLCBlbHQpKSBcCiAJCQlyZXR1cm4gMDsgXAogCX0gXApAQCAtMTcwNSw3ICsxNzIwLDcgQEAKIAlpbnQgX2k7IFwKIAlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAogCWZvciAoX2kgPSAwOyBfaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBfaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gYXNkbF9zZXFfR0VUKHNlcSwgX2kpOyBcCisJCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBfaSk7IFwKIAkJaWYgKCFjb21waWxlcl92aXNpdF8gIyMgVFlQRSgoQyksIGVsdCkpIHsgXAogCQkJY29tcGlsZXJfZXhpdF9zY29wZShjKTsgXAogCQkJcmV0dXJuIDA7IFwKQEAgLTE3MzEsNyArMTc0Niw3IEBACiAKIAlpZiAoIWFzZGxfc2VxX0xFTihzdG10cykpCiAJCXJldHVybiAxOwotCXN0ID0gYXNkbF9zZXFfR0VUKHN0bXRzLCAwKTsKKwlzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzdG10cywgMCk7CiAJaWYgKGNvbXBpbGVyX2lzZG9jc3RyaW5nKHN0KSkgewogCQlpID0gMTsKIAkJVklTSVQoYywgZXhwciwgc3QtPnYuRXhwci52YWx1ZSk7CkBAIC0xNzM5LDcgKzE3NTQsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCWZvciAoOyBpIDwgYXNkbF9zZXFfTEVOKHN0bXRzKTsgaSsrKQotCSAgICBWSVNJVChjLCBzdG10LCBhc2RsX3NlcV9HRVQoc3RtdHMsIGkpKTsKKwkgICAgVklTSVQoYywgc3RtdCwgKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHN0bXRzLCBpKSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE3NjUsNyArMTc4MCw4IEBACiAJCWJyZWFrOwogCWNhc2UgSW50ZXJhY3RpdmVfa2luZDoKIAkJYy0+Y19pbnRlcmFjdGl2ZSA9IDE7Ci0JCVZJU0lUX1NFUV9JTl9TQ09QRShjLCBzdG10LCBtb2QtPnYuSW50ZXJhY3RpdmUuYm9keSk7CisJCVZJU0lUX1NFUV9JTl9TQ09QRShjLCBzdG10LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QtPnYuSW50ZXJhY3RpdmUuYm9keSk7CiAJCWJyZWFrOwogCWNhc2UgRXhwcmVzc2lvbl9raW5kOgogCQlWSVNJVF9JTl9TQ09QRShjLCBleHByLCBtb2QtPnYuRXhwcmVzc2lvbi5ib2R5KTsKQEAgLTE4ODIsNyArMTg5OCw3IEBACiAJCXJldHVybiAxOwogCiAJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihkZWNvcyk7IGkrKykgewotCQlWSVNJVChjLCBleHByLCBhc2RsX3NlcV9HRVQoZGVjb3MsIGkpKTsKKwkJVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGRlY29zLCBpKSk7CiAJfQogCXJldHVybiAxOwogfQpAQCAtMTg5NCw3ICsxOTEwLDcgQEAKIAlpbnQgbiA9IGFzZGxfc2VxX0xFTihhcmdzLT5hcmdzKTsKIAkvKiBDb3JyZWN0bHkgaGFuZGxlIG5lc3RlZCBhcmd1bWVudCBsaXN0cyAqLwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZXhwcl90eSBhcmcgPSBhc2RsX3NlcV9HRVQoYXJncy0+YXJncywgaSk7CisJCWV4cHJfdHkgYXJnID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGFyZ3MtPmFyZ3MsIGkpOwogCQlpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQpIHsKIAkJCVB5T2JqZWN0ICppZCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIi4lZCIsIGkpOwogCQkJaWYgKGlkID09IE5VTEwpIHsKQEAgLTE5MzEsNyArMTk0Nyw3IEBACiAJCQkJICBzLT5saW5lbm8pKQogCQlyZXR1cm4gMDsKIAotCXN0ID0gYXNkbF9zZXFfR0VUKHMtPnYuRnVuY3Rpb25EZWYuYm9keSwgMCk7CisJc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQocy0+di5GdW5jdGlvbkRlZi5ib2R5LCAwKTsKIAlkb2NzdHJpbmcgPSBjb21waWxlcl9pc2RvY3N0cmluZyhzdCk7CiAJaWYgKGRvY3N0cmluZykKIAkgICAgZmlyc3RfY29uc3QgPSBzdC0+di5FeHByLnZhbHVlLT52LlN0ci5zOwpAQCAtMTk0Nyw3ICsxOTYzLDcgQEAKIAluID0gYXNkbF9zZXFfTEVOKHMtPnYuRnVuY3Rpb25EZWYuYm9keSk7CiAJLyogaWYgdGhlcmUgd2FzIGEgZG9jc3RyaW5nLCB3ZSBuZWVkIHRvIHNraXAgdGhlIGZpcnN0IHN0YXRlbWVudCAqLwogCWZvciAoaSA9IGRvY3N0cmluZzsgaSA8IG47IGkrKykgewotCQlzdG10X3R5IHMyID0gYXNkbF9zZXFfR0VUKHMtPnYuRnVuY3Rpb25EZWYuYm9keSwgaSk7CisJCXN0bXRfdHkgczIgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQocy0+di5GdW5jdGlvbkRlZi5ib2R5LCBpKTsKIAkJaWYgKGkgPT0gMCAmJiBzMi0+a2luZCA9PSBFeHByX2tpbmQgJiYKIAkJICAgIHMyLT52LkV4cHIudmFsdWUtPmtpbmQgPT0gU3RyX2tpbmQpCiAJCQljb250aW51ZTsKQEAgLTIyMjEsNyArMjIzNyw3IEBACiAJCUFERE9QKGMsIFBPUF9CTE9DSyk7CiAJfQogCWNvbXBpbGVyX3BvcF9mYmxvY2soYywgTE9PUCwgbG9vcCk7Ci0JaWYgKG9yZWxzZSAhPSBOVUxMKQorCWlmIChvcmVsc2UgIT0gTlVMTCkgLyogd2hhdCBpZiBvcmVsc2UgaXMganVzdCBwYXNzPyAqLwogCQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5XaGlsZS5vcmVsc2UpOwogCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CiAKQEAgLTIzNzUsMTAgKzIzOTEsMTIgQEAKIAluID0gYXNkbF9zZXFfTEVOKHMtPnYuVHJ5RXhjZXB0LmhhbmRsZXJzKTsKIAljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBleGNlcHQpOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZXhjZXB0aGFuZGxlcl90eSBoYW5kbGVyID0gYXNkbF9zZXFfR0VUKAorCQlleGNlcHRoYW5kbGVyX3R5IGhhbmRsZXIgPSAoZXhjZXB0aGFuZGxlcl90eSlhc2RsX3NlcV9HRVQoCiAJCQkJCQlzLT52LlRyeUV4Y2VwdC5oYW5kbGVycywgaSk7CiAJCWlmICghaGFuZGxlci0+dHlwZSAmJiBpIDwgbi0xKQogCQkgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICJkZWZhdWx0ICdleGNlcHQ6JyBtdXN0IGJlIGxhc3QiKTsKKyAgICAgICAgYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7CisgICAgICAgIGMtPnUtPnVfbGluZW5vID0gaGFuZGxlci0+bGluZW5vOwogCQlleGNlcHQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CiAJCWlmIChleGNlcHQgPT0gTlVMTCkKIAkJCXJldHVybiAwOwpAQCAtMjQ1Myw3ICsyNDcxLDcgQEAKIAlpbnQgaSwgbiA9IGFzZGxfc2VxX0xFTihzLT52LkltcG9ydC5uYW1lcyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWFsaWFzX3R5IGFsaWFzID0gYXNkbF9zZXFfR0VUKHMtPnYuSW1wb3J0Lm5hbWVzLCBpKTsKKwkJYWxpYXNfdHkgYWxpYXMgPSAoYWxpYXNfdHkpYXNkbF9zZXFfR0VUKHMtPnYuSW1wb3J0Lm5hbWVzLCBpKTsKIAkJaW50IHI7CiAJCVB5T2JqZWN0ICpsZXZlbDsKIApAQCAtMjUwOCw3ICsyNTI2LDcgQEAKIAogCS8qIGJ1aWxkIHVwIHRoZSBuYW1lcyAqLwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJYWxpYXNfdHkgYWxpYXMgPSBhc2RsX3NlcV9HRVQocy0+di5JbXBvcnRGcm9tLm5hbWVzLCBpKTsKKwkJYWxpYXNfdHkgYWxpYXMgPSAoYWxpYXNfdHkpYXNkbF9zZXFfR0VUKHMtPnYuSW1wb3J0RnJvbS5uYW1lcywgaSk7CiAJCVB5X0lOQ1JFRihhbGlhcy0+bmFtZSk7CiAJCVB5VHVwbGVfU0VUX0lURU0obmFtZXMsIGksIGFsaWFzLT5uYW1lKTsKIAl9CkBAIC0yNTMxLDcgKzI1NDksNyBAQAogCVB5X0RFQ1JFRihuYW1lcyk7CiAJQURET1BfTkFNRShjLCBJTVBPUlRfTkFNRSwgcy0+di5JbXBvcnRGcm9tLm1vZHVsZSwgbmFtZXMpOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJYWxpYXNfdHkgYWxpYXMgPSBhc2RsX3NlcV9HRVQocy0+di5JbXBvcnRGcm9tLm5hbWVzLCBpKTsKKwkJYWxpYXNfdHkgYWxpYXMgPSAoYWxpYXNfdHkpYXNkbF9zZXFfR0VUKHMtPnYuSW1wb3J0RnJvbS5uYW1lcywgaSk7CiAJCWlkZW50aWZpZXIgc3RvcmVfbmFtZTsKIAogCQlpZiAoaSA9PSAwICYmICpQeVN0cmluZ19BU19TVFJJTkcoYWxpYXMtPm5hbWUpID09ICcqJykgewpAQCAtMjU5Miw4ICsyNjEwLDEwIEBACiB7CiAJaW50IGksIG47CiAKKyAgICAvKiBBbHdheXMgYXNzaWduIGEgbGluZW5vIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIGZvciBhIHN0bXQuICovCiAJYy0+dS0+dV9saW5lbm8gPSBzLT5saW5lbm87CiAJYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7CisKIAlzd2l0Y2ggKHMtPmtpbmQpIHsKIAljYXNlIEZ1bmN0aW9uRGVmX2tpbmQ6CiAJCXJldHVybiBjb21waWxlcl9mdW5jdGlvbihjLCBzKTsKQEAgLTI5NjIsMTEgKzI5ODIsMTEgQEAKIAlzID0gZS0+di5Cb29sT3AudmFsdWVzOwogCW4gPSBhc2RsX3NlcV9MRU4ocykgLSAxOwogCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJVklTSVQoYywgZXhwciwgYXNkbF9zZXFfR0VUKHMsIGkpKTsKKwkJVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMsIGkpKTsKIAkJQURET1BfSlJFTChjLCBqdW1waSwgZW5kKTsKIAkJQURET1AoYywgUE9QX1RPUCkKIAl9Ci0JVklTSVQoYywgZXhwciwgYXNkbF9zZXFfR0VUKHMsIG4pKTsKKwlWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQocywgbikpOwogCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CiAJcmV0dXJuIDE7CiB9CkBAIC0zMDEzLDI0ICszMDMzLDI1IEBACiAJCWNsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CiAJCWlmIChjbGVhbnVwID09IE5VTEwpCiAJCSAgICByZXR1cm4gMDsKLQkJVklTSVQoYywgZXhwciwgYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycywgMCkpOworCQlWSVNJVChjLCBleHByLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIDApKTsKIAl9CiAJZm9yIChpID0gMTsgaSA8IG47IGkrKykgewogCQlBRERPUChjLCBEVVBfVE9QKTsKIAkJQURET1AoYywgUk9UX1RIUkVFKTsKLQkJLyogWFhYIFdlJ3JlIGNhc3RpbmcgYSB2b2lkKiB0byBjbXBvcF90eSBpbiB0aGUgbmV4dCBzdG10LiAqLwogCQlBRERPUF9JKGMsIENPTVBBUkVfT1AsCi0JCQljbXBvcCgoY21wb3BfdHkpYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5vcHMsIGkgLSAxKSkpOworCQkJY21wb3AoKGNtcG9wX3R5KShhc2RsX3NlcV9HRVQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPnYuQ29tcGFyZS5vcHMsIGkgLSAxKSkpKTsKIAkJQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBjbGVhbnVwKTsKIAkJTkVYVF9CTE9DSyhjKTsKIAkJQURET1AoYywgUE9QX1RPUCk7CiAJCWlmIChpIDwgKG4gLSAxKSkKLQkJICAgIFZJU0lUKGMsIGV4cHIsIGFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIGkpKTsKKwkJICAgIFZJU0lUKGMsIGV4cHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIGkpKTsKIAl9Ci0JVklTSVQoYywgZXhwciwgYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycywgbiAtIDEpKTsKKwlWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzLCBuIC0gMSkpOwogCUFERE9QX0koYywgQ09NUEFSRV9PUCwKLQkJLyogWFhYIFdlJ3JlIGNhc3RpbmcgYSB2b2lkKiB0byBjbXBvcF90eSBpbiB0aGUgbmV4dCBzdG10LiAqLwotCSAgICAgICBjbXBvcCgoY21wb3BfdHkpYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5vcHMsIG4gLSAxKSkpOworCSAgICAgICBjbXBvcCgoY21wb3BfdHkpKGFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUub3BzLCBuIC0gMSkpKSk7CiAJaWYgKG4gPiAxKSB7CiAJCWJhc2ljYmxvY2sgKmVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKIAkJaWYgKGVuZCA9PSBOVUxMKQpAQCAtMzA0Myw2ICszMDY0LDcgQEAKIAl9CiAJcmV0dXJuIDE7CiB9CisjdW5kZWYgQ01QQ0FTVAogCiBzdGF0aWMgaW50CiBjb21waWxlcl9jYWxsKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQpAQCAtMzEwMiw3ICszMTI0LDcgQEAKIAkJYW5jaG9yID09IE5VTEwpCiAJICAgIHJldHVybiAwOwogCi0JbCA9IGFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCBnZW5faW5kZXgpOworCWwgPSAoY29tcHJlaGVuc2lvbl90eSlhc2RsX3NlcV9HRVQoZ2VuZXJhdG9ycywgZ2VuX2luZGV4KTsKIAlWSVNJVChjLCBleHByLCBsLT5pdGVyKTsKIAlBRERPUChjLCBHRVRfSVRFUik7CiAJY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc3RhcnQpOwpAQCAtMzExMyw3ICszMTM1LDcgQEAKIAkvKiBYWFggdGhpcyBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLi4uYSBsb3QhICovCiAJbiA9IGFzZGxfc2VxX0xFTihsLT5pZnMpOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZXhwcl90eSBlID0gYXNkbF9zZXFfR0VUKGwtPmlmcywgaSk7CisJCWV4cHJfdHkgZSA9IChleHByX3R5KWFzZGxfc2VxX0dFVChsLT5pZnMsIGkpOwogCQlWSVNJVChjLCBleHByLCBlKTsKIAkJQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBpZl9jbGVhbnVwKTsKIAkJTkVYVF9CTE9DSyhjKTsKQEAgLTMxOTgsNyArMzIyMCw3IEBACiAJICAgIGFuY2hvciA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAotCWdlID0gYXNkbF9zZXFfR0VUKGdlbmVyYXRvcnMsIGdlbl9pbmRleCk7CisJZ2UgPSAoY29tcHJlaGVuc2lvbl90eSlhc2RsX3NlcV9HRVQoZ2VuZXJhdG9ycywgZ2VuX2luZGV4KTsKIAlBRERPUF9KUkVMKGMsIFNFVFVQX0xPT1AsIGVuZCk7CiAJaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBMT09QLCBzdGFydCkpCiAJCXJldHVybiAwOwpAQCAtMzIyMSw3ICszMjQzLDcgQEAKIAkvKiBYWFggdGhpcyBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLi4uYSBsb3QhICovCiAJbiA9IGFzZGxfc2VxX0xFTihnZS0+aWZzKTsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWV4cHJfdHkgZSA9IGFzZGxfc2VxX0dFVChnZS0+aWZzLCBpKTsKKwkJZXhwcl90eSBlID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGdlLT5pZnMsIGkpOwogCQlWSVNJVChjLCBleHByLCBlKTsKIAkJQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBpZl9jbGVhbnVwKTsKIAkJTkVYVF9CTE9DSyhjKTsKQEAgLTM0NjIsNiArMzQ4NCw5IEBACiB7CiAJaW50IGksIG47CiAKKyAgICAvKiBJZiBleHByIGUgaGFzIGEgZGlmZmVyZW50IGxpbmUgbnVtYmVyIHRoYW4gdGhlIGxhc3QgZXhwci9zdG10LAorICAgICAgIHNldCBhIG5ldyBsaW5lIG51bWJlciBmb3IgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCisgICAgICAgKi8KIAlpZiAoZS0+bGluZW5vID4gYy0+dS0+dV9saW5lbm8pIHsKIAkJYy0+dS0+dV9saW5lbm8gPSBlLT5saW5lbm87CiAJCWMtPnUtPnVfbGluZW5vX3NldCA9IGZhbHNlOwpAQCAtMzQ5MCw5ICszNTE1LDExIEBACiAJCSAgIEl0IHdhbnRzIHRoZSBzdGFjayB0byBsb29rIGxpa2UgKHZhbHVlKSAoZGljdCkgKGtleSkgKi8KIAkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQkJQURET1AoYywgRFVQX1RPUCk7Ci0JCQlWSVNJVChjLCBleHByLCBhc2RsX3NlcV9HRVQoZS0+di5EaWN0LnZhbHVlcywgaSkpOworCQkJVklTSVQoYywgZXhwciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3QudmFsdWVzLCBpKSk7CiAJCQlBRERPUChjLCBST1RfVFdPKTsKLQkJCVZJU0lUKGMsIGV4cHIsIGFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkpOworCQkJVklTSVQoYywgZXhwciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkpOwogCQkJQURET1AoYywgU1RPUkVfU1VCU0NSKTsKIAkJfQogCQlicmVhazsKQEAgLTM4NTksNyArMzg4Niw4IEBACiAJCWlmIChjdHggIT0gQXVnU3RvcmUpIHsKIAkJCWludCBpLCBuID0gYXNkbF9zZXFfTEVOKHMtPnYuRXh0U2xpY2UuZGltcyk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJc2xpY2VfdHkgc3ViID0gYXNkbF9zZXFfR0VUKHMtPnYuRXh0U2xpY2UuZGltcywgaSk7CisJCQkJc2xpY2VfdHkgc3ViID0gKHNsaWNlX3R5KWFzZGxfc2VxX0dFVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT52LkV4dFNsaWNlLmRpbXMsIGkpOwogCQkJCWlmICghY29tcGlsZXJfdmlzaXRfbmVzdGVkX3NsaWNlKGMsIHN1YiwgY3R4KSkKIAkJCQkJcmV0dXJuIDA7CiAJCQl9CkBAIC00MDQ4LDcgKzQwNzYsNyBAQAogewogCWludCBkX2J5dGVjb2RlLCBkX2xpbmVubzsKIAlpbnQgbGVuOwotCWNoYXIgKmxub3RhYjsKKwl1bnNpZ25lZCBjaGFyICpsbm90YWI7CiAKIAlkX2J5dGVjb2RlID0gYS0+YV9vZmZzZXQgLSBhLT5hX2xpbmVub19vZmY7CiAJZF9saW5lbm8gPSBpLT5pX2xpbmVubyAtIGEtPmFfbGluZW5vOwpAQCAtNDA3MSw3ICs0MDk5LDggQEAKIAkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZhLT5hX2xub3RhYiwgbGVuKSA8IDApCiAJCQkJcmV0dXJuIDA7CiAJCX0KLQkJbG5vdGFiID0gUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKKwkJbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikKKwkJCSAgIFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7CiAJCWZvciAoaiA9IDA7IGogPCBuY29kZXM7IGorKykgewogCQkJKmxub3RhYisrID0gMjU1OwogCQkJKmxub3RhYisrID0gMDsKQEAgLTQwOTIsNyArNDEyMSw4IEBACiAJCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS0+YV9sbm90YWIsIGxlbikgPCAwKQogCQkJCXJldHVybiAwOwogCQl9Ci0JCWxub3RhYiA9IFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7CisJCWxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopCisJCQkgICBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOwogCQkqbG5vdGFiKysgPSAyNTU7CiAJCSpsbm90YWIrKyA9IGRfYnl0ZWNvZGU7CiAJCWRfYnl0ZWNvZGUgPSAwOwpAQCAtNDEwOSw3ICs0MTM5LDggQEAKIAkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmEtPmFfbG5vdGFiLCBsZW4gKiAyKSA8IDApCiAJCQlyZXR1cm4gMDsKIAl9Ci0JbG5vdGFiID0gUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKKwlsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQorCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKIAogCWEtPmFfbG5vdGFiX29mZiArPSAyOwogCWlmIChkX2J5dGVjb2RlKSB7CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF93aW4uYyBiL1B5dGhvbi9keW5sb2FkX3dpbi5jCmluZGV4IDZlOGY4MjIuLjM2NzQ2ZTIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX3dpbi5jCisrKyBiL1B5dGhvbi9keW5sb2FkX3dpbi5jCkBAIC0xMSwxMCArMTEsMTYgQEAKIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiW10gPSB7CiAjaWZkZWYgX0RFQlVHCiAJeyJfZC5weWQiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisJLyogVGVtcG9yYXJpbHkgZGlzYWJsZSAuZGxsLCB0byBhdm9pZCBjb25mbGljdHMgYmV0d2VlbiBzcWxpdGUzLmRsbAorCSAgIGFuZCB0aGUgc3FsaXRlMyBwYWNrYWdlLiBJZiB0aGlzIG5lZWRzIHRvIGJlIHJldmVydGVkIGZvciAyLjUsCisJICAgc29tZSBvdGhlciBzb2x1dGlvbiBmb3IgdGhlIG5hbWluZyBjb25mbGljdCBtdXN0IGJlIGZvdW5kLgogCXsiX2QuZGxsIiwgInJiIiwgQ19FWFRFTlNJT059LAorCSovCiAjZWxzZQogCXsiLnB5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKKwkvKiBMaWtld2lzZQogCXsiLmRsbCIsICJyYiIsIENfRVhURU5TSU9OfSwKKwkqLwogI2VuZGlmCiAJezAsIDB9CiB9OwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Vycm9ycy5jIGIvUHl0aG9uL2Vycm9ycy5jCmluZGV4IDY3Zjg2ZWQuLjJhZTA2MmYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9lcnJvcnMuYworKysgYi9QeXRob24vZXJyb3JzLmMKQEAgLTE2LDYgKzE2LDExIEBACiAKICNpbmNsdWRlIDxjdHlwZS5oPgogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwogdm9pZAogUHlFcnJfUmVzdG9yZShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdHJhY2ViYWNrKQogewpAQCAtNjA5LDYgKzYxNCw3IEBACiAJCQkJUHlGaWxlX1dyaXRlU3RyaW5nKCI6ICIsIGYpOwogCQkJCVB5RmlsZV9Xcml0ZU9iamVjdCh2LCBmLCAwKTsKIAkJCX0KKwkJCVB5X1hERUNSRUYobW9kdWxlTmFtZSk7CiAJCX0KIAkJUHlGaWxlX1dyaXRlU3RyaW5nKCIgaW4gIiwgZik7CiAJCVB5RmlsZV9Xcml0ZU9iamVjdChvYmosIGYsIDApOwpAQCAtNzk2LDMgKzgwMiw4IEBACiAJfQogCXJldHVybiBOVUxMOwogfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9QeXRob24vZXhjZXB0aW9ucy5jIGIvUHl0aG9uL2V4Y2VwdGlvbnMuYwppbmRleCBiMTQ2Yzk3Li41YzgyNGU2IDEwMDY0NAotLS0gYS9QeXRob24vZXhjZXB0aW9ucy5jCisrKyBiL1B5dGhvbi9leGNlcHRpb25zLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIGJ5IFNlY3JldCBMYWJzIEFCLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJvc2RlZnMuaCIKIApAQCAtODkzLDcgKzg5NCw3IEBACiAJICAgIGlmIChoYXZlX2ZpbGVuYW1lKQogCQlidWZzaXplICs9IFB5U3RyaW5nX0dFVF9TSVpFKGZpbGVuYW1lKTsKIAotCSAgICBidWZmZXIgPSBQeU1lbV9NQUxMT0MoYnVmc2l6ZSk7CisJICAgIGJ1ZmZlciA9IChjaGFyICopUHlNZW1fTUFMTE9DKGJ1ZnNpemUpOwogCSAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKIAkJaWYgKGhhdmVfZmlsZW5hbWUgJiYgaGF2ZV9saW5lbm8pCiAJCSAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgYnVmc2l6ZSwgIiVzICglcywgbGluZSAlbGQpIiwKQEAgLTE0NTAsOCArMTQ1MSw4IEBACiAJYXNzZXJ0KGxlbmd0aCA8IElOVF9NQVgpOwogCWFzc2VydChzdGFydCA8IElOVF9NQVgpOwogCWFzc2VydChlbmQgPCBJTlRfTUFYKTsKLSAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvciwgInNzI2lpcyIsCi0JZW5jb2RpbmcsIG9iamVjdCwgKGludClsZW5ndGgsIChpbnQpc3RhcnQsIChpbnQpZW5kLCByZWFzb24pOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUHlFeGNfVW5pY29kZURlY29kZUVycm9yLCAic3Mjbm5zIiwKKwllbmNvZGluZywgb2JqZWN0LCBsZW5ndGgsIHN0YXJ0LCBlbmQsIHJlYXNvbik7CiB9CiAKIApAQCAtMTU2NSw3ICsxNTY2LDcgQEAKIAljb25zdCBQeV9VTklDT0RFICpvYmplY3QsIFB5X3NzaXplX3QgbGVuZ3RoLAogCVB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3QgZW5kLCBjb25zdCBjaGFyICpyZWFzb24pCiB7Ci0gICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IsICJ1I2lpcyIsCisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IsICJ1I25ucyIsCiAJb2JqZWN0LCBsZW5ndGgsIHN0YXJ0LCBlbmQsIHJlYXNvbik7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1B5dGhvbi9mdXR1cmUuYyBiL1B5dGhvbi9mdXR1cmUuYwppbmRleCAxOTAyZjFkLi5kMjNmYWQ2IDEwMDY0NAotLS0gYS9QeXRob24vZnV0dXJlLmMKKysrIGIvUHl0aG9uL2Z1dHVyZS5jCkBAIC0xOSw3ICsxOSw3IEBACiAKIAluYW1lcyA9IHMtPnYuSW1wb3J0RnJvbS5uYW1lczsKIAlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKG5hbWVzKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYWxpYXNfdHkgbmFtZSA9IGFzZGxfc2VxX0dFVChuYW1lcywgaSk7CisgICAgICAgICAgICAgICAgYWxpYXNfdHkgbmFtZSA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQobmFtZXMsIGkpOwogCQljb25zdCBjaGFyICpmZWF0dXJlID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZS0+bmFtZSk7CiAJCWlmICghZmVhdHVyZSkKIAkJCXJldHVybiAwOwpAQCAtMjksNyArMjksNyBAQAogCQkJY29udGludWU7CiAJCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9ESVZJU0lPTikgPT0gMCkgewogCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9BQlNJTVBPUlQpID09IDApIHsKKwkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX0FCU09MVVRFX0lNUE9SVCkgPT0gMCkgewogCQkJY29udGludWU7CiAJCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9XSVRIX1NUQVRFTUVOVCkgPT0gMCkgewogCQkJY29udGludWU7CkBAIC03Myw3ICs3Myw3IEBACiAJICAgCiAKIAlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKG1vZC0+di5Nb2R1bGUuYm9keSk7IGkrKykgewotCQlzdG10X3R5IHMgPSBhc2RsX3NlcV9HRVQobW9kLT52Lk1vZHVsZS5ib2R5LCBpKTsKKwkJc3RtdF90eSBzID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKG1vZC0+di5Nb2R1bGUuYm9keSwgaSk7CiAKIAkJaWYgKGRvbmUgJiYgcy0+bGluZW5vID4gcHJldl9saW5lKQogCQkJcmV0dXJuIDE7CkBAIC0xMjAsMTQgKzEyMCwxNCBAQAogewogCVB5RnV0dXJlRmVhdHVyZXMgKmZmOwogCi0JZmYgPSAoUHlGdXR1cmVGZWF0dXJlcyAqKVB5TWVtX01hbGxvYyhzaXplb2YoUHlGdXR1cmVGZWF0dXJlcykpOworCWZmID0gKFB5RnV0dXJlRmVhdHVyZXMgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKFB5RnV0dXJlRmVhdHVyZXMpKTsKIAlpZiAoZmYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJZmYtPmZmX2ZlYXR1cmVzID0gMDsKIAlmZi0+ZmZfbGluZW5vID0gLTE7CiAKIAlpZiAoIWZ1dHVyZV9wYXJzZShmZiwgbW9kLCBmaWxlbmFtZSkpIHsKLQkJUHlNZW1fRnJlZSgodm9pZCAqKWZmKTsKKwkJUHlPYmplY3RfRnJlZShmZik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gZmY7CmRpZmYgLS1naXQgYS9QeXRob24vZ2V0YXJncy5jIGIvUHl0aG9uL2dldGFyZ3MuYwppbmRleCBmYWMwYjZmLi5iMDcxNWJhIDEwMDY0NAotLS0gYS9QeXRob24vZ2V0YXJncy5jCisrKyBiL1B5dGhvbi9nZXRhcmdzLmMKQEAgLTYsNiArNiw5IEBACiAjaW5jbHVkZSA8Y3R5cGUuaD4KIAogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyAKKyNlbmRpZgogaW50IFB5QXJnX1BhcnNlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKIGludCBQeUFyZ19QYXJzZVR1cGxlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKIGludCBQeUFyZ19WYVBhcnNlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CkBAIC0xNSw2ICsxOCwxOCBAQAogaW50IFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAJCQkJY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0KTsKIAorI2lmZGVmIEhBVkVfREVDTFNQRUNfRExMCisvKiBFeHBvcnQgZnVuY3Rpb25zICovCitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlX1NpemVUKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZV9TaXplVChQeU9iamVjdCAqLCBjaGFyICosIC4uLik7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIC4uLik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeV9CdWlsZFZhbHVlX1NpemVUKGNvbnN0IGNoYXIgKiwgLi4uKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqLCBjaGFyICosIHZhX2xpc3QpOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCk7CisjZW5kaWYKKwogI2RlZmluZSBGTEFHX0NPTVBBVCAxCiAjZGVmaW5lIEZMQUdfU0laRV9UIDIKIApAQCAtNjMxLDggKzY0Niw4IEBACiAJCXVuc2lnbmVkIGludCBpdmFsOwogCQlpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKIAkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpdmFsID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7Ci0JCWlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisJCWl2YWwgPSAodW5zaWduZWQgaW50KVB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOworCQlpZiAoaXZhbCA9PSAodW5zaWduZWQgaW50KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAJCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxJPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKIAkJZWxzZQogCQkJKnAgPSBpdmFsOwpAQCAtNjQ1LDEwICs2NjAsMTAgQEAKIAkJUHlfc3NpemVfdCAqcCA9IHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCAqKTsKIAkJUHlfc3NpemVfdCBpdmFsOwogCQlpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAJCWl2YWwgPSBQeUludF9Bc1NzaXplX3QoYXJnKTsKIAkJaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAJCSpwID0gaXZhbDsKIAkJYnJlYWs7CiAJfQpAQCAtMTA0MCwxMSArMTA1NSw4IEBACiAJCQkJU1RPUkVfU0laRShQeVVuaWNvZGVfR0VUX1NJWkUoYXJnKSk7CiAJCQl9CiAJCQllbHNlIHsKLQkJCWNoYXIgKmJ1ZjsKLQkJCVB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7Ci0JCQlpZiAoY291bnQgPCAwKQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKGJ1ZiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJU1RPUkVfU0laRShjb3VudC8oc2l6ZW9mKFB5X1VOSUNPREUpKSk7IAorCQkJCXJldHVybiBjb252ZXJ0ZXJyKCJjYW5ub3QgY29udmVydCByYXcgYnVmZmVycyIsCisJCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKIAkJCX0KIAkJCWZvcm1hdCsrOwogCQl9IGVsc2UgewpAQCAtMTc0MywzICsxNzU1LDYgQEAKIAkJCWZ1bmNuYW1lKTsKIAlyZXR1cm4gMDsKIH0KKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dldG10aW1lLmMgYi9QeXRob24vZ2V0bXRpbWUuYwppbmRleCBmMGFjODk5Li41NGVkYjUzIDEwMDY0NAotLS0gYS9QeXRob24vZ2V0bXRpbWUuYworKysgYi9QeXRob24vZ2V0bXRpbWUuYwpAQCAtNiw2ICs2LDEwIEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAicHljb25maWcuaCIKIAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCiB0aW1lX3QKIFB5T1NfR2V0TGFzdE1vZGlmaWNhdGlvblRpbWUoY2hhciAqcGF0aCwgRklMRSAqZnApCiB7CkBAIC0xNSwzICsxOSw4IEBACiAJZWxzZQogCQlyZXR1cm4gc3Quc3RfbXRpbWU7CiB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL1B5dGhvbi9nZXRvcHQuYyBiL1B5dGhvbi9nZXRvcHQuYwppbmRleCBkODBmNjA3Li41NDI5ZmFjIDEwMDY0NAotLS0gYS9QeXRob24vZ2V0b3B0LmMKKysrIGIvUHl0aG9uL2dldG9wdC5jCkBAIC0yNyw2ICsyNywxMCBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwogaW50IF9QeU9TX29wdGVyciA9IDE7ICAgICAgICAgIC8qIGdlbmVyYXRlIGVycm9yIG1lc3NhZ2VzICovCiBpbnQgX1B5T1Nfb3B0aW5kID0gMTsgICAgICAgICAgLyogaW5kZXggaW50byBhcmd2IGFycmF5ICAgKi8KIGNoYXIgKl9QeU9TX29wdGFyZyA9IE5VTEw7ICAgICAvKiBvcHRpb25hbCBhcmd1bWVudCAgICAgICAqLwpAQCAtODEsMyArODUsOCBAQAogCiAJcmV0dXJuIG9wdGlvbjsKIH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dyYW1pbml0LmMgYi9QeXRob24vZ3JhbWluaXQuYwppbmRleCA0MGYxNzcwLi5hNmFjMTI0IDEwMDY0NAotLS0gYS9QeXRob24vZ3JhbWluaXQuYworKysgYi9QeXRob24vZ3JhbWluaXQuYwpAQCAtMTY3NSw3ICsxNjc1LDcgQEAKIAl7OTEsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc183N18xWzFdID0gewotCXsyNiwgMn0sCisJezEwNSwgMn0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzc3XzJbMl0gPSB7CiAJezE2MiwgM30sCkBAIC0xNzMyLDcgKzE3MzIsNyBAQAogCXs5MSwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzgwXzFbMV0gPSB7Ci0JezI2LCAyfSwKKwl7MTA1LCAyfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfODBfMlsyXSA9IHsKIAl7MTY0LCAzfSwKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnQuYyBiL1B5dGhvbi9pbXBvcnQuYwppbmRleCBiNjQ1OTRkLi5kYWFlMTVmIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0LmMKKysrIGIvUHl0aG9uL2ltcG9ydC5jCkBAIC0xNyw2ICsxNyw5IEBACiAjaWZkZWYgSEFWRV9GQ05UTF9ICiAjaW5jbHVkZSA8ZmNudGwuaD4KICNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgCisjZW5kaWYKIAogZXh0ZXJuIHRpbWVfdCBQeU9TX0dldExhc3RNb2RpZmljYXRpb25UaW1lKGNoYXIgKiwgRklMRSAqKTsKIAkJCQkJCS8qIEluIGdldG10aW1lLmMgKi8KQEAgLTQwLDYgKzQzLDcgQEAKICAgICAgICBQeXRob24gMS41OiAgIDIwMTIxCiAgICAgICAgUHl0aG9uIDEuNS4xOiAyMDEyMQogICAgICAgIFB5dGhvbiAxLjUuMjogMjAxMjEKKyAgICAgICBQeXRob24gMS42OiAgIDUwNDI4CiAgICAgICAgUHl0aG9uIDIuMDogICA1MDgyMwogICAgICAgIFB5dGhvbiAyLjAuMTogNTA4MjMKICAgICAgICBQeXRob24gMi4xOiAgIDYwMjAyCkBAIC0xMjE3LDEyICsxMjIxLDEyIEBACiAjZW5kaWYKIAkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkKIAkJCWNvbnRpbnVlOwotCQlsZW4gPSBQeVN0cmluZ19TaXplKHYpOworCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKIAkJaWYgKGxlbiArIDIgKyBuYW1lbGVuICsgTUFYU1VGRklYU0laRSA+PSBidWZsZW4pIHsKIAkJCVB5X1hERUNSRUYoY29weSk7CiAJCQljb250aW51ZTsgLyogVG9vIGxvbmcgKi8KIAkJfQotCQlzdHJjcHkoYnVmLCBQeVN0cmluZ19Bc1N0cmluZyh2KSk7CisJCXN0cmNweShidWYsIFB5U3RyaW5nX0FTX1NUUklORyh2KSk7CiAJCWlmIChzdHJsZW4oYnVmKSAhPSBsZW4pIHsKIAkJCVB5X1hERUNSRUYoY29weSk7CiAJCQljb250aW51ZTsgLyogdiBjb250YWlucyAnXDAnICovCkBAIC0xOTM0LDYgKzE5MzgsMTYgQEAKIAkJfQogCQl0YWlsID0gbmV4dDsKIAl9CisJaWYgKHRhaWwgPT0gUHlfTm9uZSkgeworCQkvKiBJZiB0YWlsIGlzIFB5X05vbmUsIGJvdGggZ2V0X3BhcmVudCBhbmQgbG9hZF9uZXh0IGZvdW5kCisJCSAgIGFuIGVtcHR5IG1vZHVsZSBuYW1lOiBzb21lb25lIGNhbGxlZCBfX2ltcG9ydF9fKCIiKSBvcgorCQkgICBkb2N0b3JlZCBmYXVsdHkgYnl0ZWNvZGUgKi8KKwkJUHlfREVDUkVGKHRhaWwpOworCQlQeV9ERUNSRUYoaGVhZCk7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorCQkJCSJFbXB0eSBtb2R1bGUgbmFtZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlpZiAoZnJvbWxpc3QgIT0gTlVMTCkgewogCQlpZiAoZnJvbWxpc3QgPT0gUHlfTm9uZSB8fCAhUHlPYmplY3RfSXNUcnVlKGZyb21saXN0KSkKQEAgLTIwOTQsNyArMjEwOCw4IEBACiAJUHlPYmplY3QgKnJlc3VsdDsKIAogCWlmIChzdHJsZW4obmFtZSkgPT0gMCkgewotCQkvKiBlbXB0eSBtb2R1bGUgbmFtZSBvbmx5IGhhcHBlbnMgaW4gJ2Zyb20gLiBpbXBvcnQnICovCisJCS8qIGNvbXBsZXRlbHkgZW1wdHkgbW9kdWxlIG5hbWUgc2hvdWxkIG9ubHkgaGFwcGVuIGluCisJCSAgICdmcm9tIC4gaW1wb3J0JyAob3IgJ19faW1wb3J0X18oIiIpJykqLwogCQlQeV9JTkNSRUYobW9kKTsKIAkJKnBfbmFtZSA9IE5VTEw7CiAJCXJldHVybiBtb2Q7CkBAIC0yOTM2LDMgKzI5NTEsNyBAQAogCiAJcmV0dXJuIFB5SW1wb3J0X0V4dGVuZEluaXR0YWIobmV3dGFiKTsKIH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1B5dGhvbi9tYWN0b29sYm94Z2x1ZS5jIGIvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKaW5kZXggN2YwNjI3ZS4uMGFhMmNmZCAxMDA2NDQKLS0tIGEvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKKysrIGIvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInB5bWFjdG9vbGJveC5oIgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgkvKiBmb3IgbnRvaGwsIGh0b25sICovCiAKIAogLyogTGlrZSBzdHJlcnJvcigpIGJ1dCBmb3IgTWFjIE9TIGVycm9yIG51bWJlcnMgKi8KQEAgLTE1NiwxMiArMTU3LDE0IEBACiBpbnQKIFB5TWFjX0dldE9TVHlwZShQeU9iamVjdCAqdiwgT1NUeXBlICpwcikKIHsKKwl1aW50MzJfdCB0bXA7CiAJaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeVN0cmluZ19TaXplKHYpICE9IDQpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCSJPU1R5cGUgYXJnIG11c3QgYmUgc3RyaW5nIG9mIDQgY2hhcnMiKTsKIAkJcmV0dXJuIDA7CiAJfQotCW1lbWNweSgoY2hhciAqKXByLCBQeVN0cmluZ19Bc1N0cmluZyh2KSwgNCk7CisJbWVtY3B5KChjaGFyICopJnRtcCwgUHlTdHJpbmdfQXNTdHJpbmcodiksIDQpOworCSpwciA9IChPU1R5cGUpbnRvaGwodG1wKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTY5LDcgKzE3Miw4IEBACiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZE9TVHlwZShPU1R5cGUgdCkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmdCwgNCk7CisJdWludDMyX3QgdG1wID0gaHRvbmwoKHVpbnQzMl90KXQpOworCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZ0bXAsIDQpOwogfQogCiAvKiBDb252ZXJ0IGFuIE51bVZlcnNpb24gdmFsdWUgdG8gYSA0LWVsZW1lbnQgdHVwbGUgKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9tb2RzdXBwb3J0LmMgYi9QeXRob24vbW9kc3VwcG9ydC5jCmluZGV4IGNiNmJkZmQuLmUyOTEwMTQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9tb2RzdXBwb3J0LmMKKysrIGIvUHl0aG9uL21vZHN1cHBvcnQuYwpAQCAtMyw4ICszLDExIEBACiAKICNpbmNsdWRlICJQeXRob24uaCIKIAorI2RlZmluZSBGTEFHX1NJWkVfVCAxCiB0eXBlZGVmIGRvdWJsZSB2YV9kb3VibGU7CiAKK3N0YXRpYyBQeU9iamVjdCAqdmFfYnVpbGRfdmFsdWUoY29uc3QgY2hhciAqLCB2YV9saXN0LCBpbnQpOworCiAvKiBQYWNrYWdlIGNvbnRleHQgLS0gdGhlIGZ1bGwgbW9kdWxlIG5hbWUgZm9yIHBhY2thZ2UgaW1wb3J0cyAqLwogY2hhciAqX1B5X1BhY2thZ2VDb250ZXh0ID0gTlVMTDsKIApAQCAtMTQ2LDE0ICsxNDksMTQgQEAKIC8qIEdlbmVyaWMgZnVuY3Rpb24gdG8gY3JlYXRlIGEgdmFsdWUgLS0gdGhlIGludmVyc2Ugb2YgZ2V0YXJncygpICovCiAvKiBBZnRlciBhbiBvcmlnaW5hbCBpZGVhIGFuZCBmaXJzdCBpbXBsZW1lbnRhdGlvbiBieSBTdGV2ZW4gTWlhbGUgKi8KIAotc3RhdGljIFB5T2JqZWN0ICpkb19ta3R1cGxlKGNvbnN0IGNoYXIqKiwgdmFfbGlzdCAqLCBpbnQsIGludCk7Ci1zdGF0aWMgUHlPYmplY3QgKmRvX21rbGlzdChjb25zdCBjaGFyKiosIHZhX2xpc3QgKiwgaW50LCBpbnQpOwotc3RhdGljIFB5T2JqZWN0ICpkb19ta2RpY3QoY29uc3QgY2hhcioqLCB2YV9saXN0ICosIGludCwgaW50KTsKLXN0YXRpYyBQeU9iamVjdCAqZG9fbWt2YWx1ZShjb25zdCBjaGFyKiosIHZhX2xpc3QgKik7CitzdGF0aWMgUHlPYmplY3QgKmRvX21rdHVwbGUoY29uc3QgY2hhcioqLCB2YV9saXN0ICosIGludCwgaW50LCBpbnQpOworc3RhdGljIFB5T2JqZWN0ICpkb19ta2xpc3QoY29uc3QgY2hhcioqLCB2YV9saXN0ICosIGludCwgaW50LCBpbnQpOworc3RhdGljIFB5T2JqZWN0ICpkb19ta2RpY3QoY29uc3QgY2hhcioqLCB2YV9saXN0ICosIGludCwgaW50LCBpbnQpOworc3RhdGljIFB5T2JqZWN0ICpkb19ta3ZhbHVlKGNvbnN0IGNoYXIqKiwgdmFfbGlzdCAqLCBpbnQpOwogCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kb19ta2RpY3QoY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZW5kY2hhciwgaW50IG4pCitkb19ta2RpY3QoY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZW5kY2hhciwgaW50IG4sIGludCBmbGFncykKIHsKIAlQeU9iamVjdCAqZDsKIAlpbnQgaTsKQEAgLTE2NywxMyArMTcwLDEzIEBACiAJZm9yIChpID0gMDsgaSA8IG47IGkrPSAyKSB7CiAJCVB5T2JqZWN0ICprLCAqdjsKIAkJaW50IGVycjsKLQkJayA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEpOworCQlrID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOwogCQlpZiAoayA9PSBOVUxMKSB7CiAJCQlpdGVtZmFpbGVkID0gMTsKIAkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAkJCWsgPSBQeV9Ob25lOwogCQl9Ci0JCXYgPSBkb19ta3ZhbHVlKHBfZm9ybWF0LCBwX3ZhKTsKKwkJdiA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEsIGZsYWdzKTsKIAkJaWYgKHYgPT0gTlVMTCkgewogCQkJaXRlbWZhaWxlZCA9IDE7CiAJCQlQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC0xOTksNyArMjAyLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRvX21rbGlzdChjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBlbmRjaGFyLCBpbnQgbikKK2RvX21rbGlzdChjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBlbmRjaGFyLCBpbnQgbiwgaW50IGZsYWdzKQogewogCVB5T2JqZWN0ICp2OwogCWludCBpOwpAQCAtMjEyLDEzICsyMTUsMTMgQEAKIAkvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYmFpbCBpbW1lZGlhdGVseSBvbiBlcnJvciBhcyB0aGlzIHdpbGwgbGVhawogCSAgIHJlZmNvdW50cyBvbiBhbnkgJ04nIGFyZ3VtZW50cy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSk7CisJCVB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOwogCQlpZiAodyA9PSBOVUxMKSB7CiAJCQlpdGVtZmFpbGVkID0gMTsKIAkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAkJCXcgPSBQeV9Ob25lOwogCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKHYsIGksIHcpOworCQlQeUxpc3RfU0VUX0lURU0odiwgaSwgdyk7CiAJfQogCiAJaWYgKGl0ZW1mYWlsZWQpIHsKQEAgLTIzMiw3ICsyMzUsNiBAQAogCQkJCSJVbm1hdGNoZWQgcGFyZW4gaW4gZm9ybWF0Iik7CiAJCXJldHVybiBOVUxMOwogCX0KLQogCWlmIChlbmRjaGFyKQogCQkrKypwX2Zvcm1hdDsKIAlyZXR1cm4gdjsKQEAgLTI1MCw3ICsyNTIsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kb19ta3R1cGxlKGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGVuZGNoYXIsIGludCBuKQorZG9fbWt0dXBsZShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBlbmRjaGFyLCBpbnQgbiwgaW50IGZsYWdzKQogewogCVB5T2JqZWN0ICp2OwogCWludCBpOwpAQCAtMjYyLDQ1ICsyNjQsNDYgQEAKIAkvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYmFpbCBpbW1lZGlhdGVseSBvbiBlcnJvciBhcyB0aGlzIHdpbGwgbGVhawogCSAgIHJlZmNvdW50cyBvbiBhbnkgJ04nIGFyZ3VtZW50cy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSk7CisJCVB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOwogCQlpZiAodyA9PSBOVUxMKSB7CiAJCQlpdGVtZmFpbGVkID0gMTsKIAkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAkJCXcgPSBQeV9Ob25lOwogCQl9Ci0JCVB5VHVwbGVfU2V0SXRlbSh2LCBpLCB3KTsKKwkJUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCB3KTsKIAl9Ci0JaWYgKHYgIT0gTlVMTCAmJiAqKnBfZm9ybWF0ICE9IGVuZGNoYXIpIHsKKwlpZiAoaXRlbWZhaWxlZCkgeworCQkvKiBkb19ta3ZhbHVlKCkgc2hvdWxkIGhhdmUgYWxyZWFkeSBzZXQgYW4gZXJyb3IgKi8KIAkJUHlfREVDUkVGKHYpOwotCQl2ID0gTlVMTDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgqKnBfZm9ybWF0ICE9IGVuZGNoYXIpIHsKKwkJUHlfREVDUkVGKHYpOwogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCiAJCQkJIlVubWF0Y2hlZCBwYXJlbiBpbiBmb3JtYXQiKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQotCWVsc2UgaWYgKGVuZGNoYXIpCisJaWYgKGVuZGNoYXIpCiAJCSsrKnBfZm9ybWF0OwotCWlmIChpdGVtZmFpbGVkKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJdiA9IE5VTEw7Ci0JfQogCXJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZG9fbWt2YWx1ZShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEpCitkb19ta3ZhbHVlKGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzKQogewogCWZvciAoOzspIHsKIAkJc3dpdGNoICgqKCpwX2Zvcm1hdCkrKykgewogCQljYXNlICcoJzoKIAkJCXJldHVybiBkb19ta3R1cGxlKHBfZm9ybWF0LCBwX3ZhLCAnKScsCi0JCQkJCSAgY291bnRmb3JtYXQoKnBfZm9ybWF0LCAnKScpKTsKKwkJCQkJICBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICcpJyksIGZsYWdzKTsKIAogCQljYXNlICdbJzoKIAkJCXJldHVybiBkb19ta2xpc3QocF9mb3JtYXQsIHBfdmEsICddJywKLQkJCQkJIGNvdW50Zm9ybWF0KCpwX2Zvcm1hdCwgJ10nKSk7CisJCQkJCSBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICddJyksIGZsYWdzKTsKIAogCQljYXNlICd7JzoKIAkJCXJldHVybiBkb19ta2RpY3QocF9mb3JtYXQsIHBfdmEsICd9JywKLQkJCQkJIGNvdW50Zm9ybWF0KCpwX2Zvcm1hdCwgJ30nKSk7CisJCQkJCSBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICd9JyksIGZsYWdzKTsKIAogCQljYXNlICdiJzoKIAkJY2FzZSAnQic6CkBAIC0zNTEsMTAgKzM1NCwxMyBAQAogCQl7CiAJCQlQeU9iamVjdCAqdjsKIAkJCVB5X1VOSUNPREUgKnUgPSB2YV9hcmcoKnBfdmEsIFB5X1VOSUNPREUgKik7Ci0JCQlpbnQgbjsKKwkJCVB5X3NzaXplX3QgbjsJCiAJCQlpZiAoKipwX2Zvcm1hdCA9PSAnIycpIHsKIAkJCQkrKypwX2Zvcm1hdDsKLQkJCQluID0gdmFfYXJnKCpwX3ZhLCBpbnQpOworCQkJCWlmIChmbGFncyAmIEZMQUdfU0laRV9UKQorCQkJCQluID0gdmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90KTsKKwkJCQllbHNlCisJCQkJCW4gPSB2YV9hcmcoKnBfdmEsIGludCk7CiAJCQl9CiAJCQllbHNlCiAJCQkJbiA9IC0xOwpAQCAtMzkzLDEwICszOTksMTMgQEAKIAkJewogCQkJUHlPYmplY3QgKnY7CiAJCQljaGFyICpzdHIgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7Ci0JCQlpbnQgbjsKKwkJCVB5X3NzaXplX3QgbjsKIAkJCWlmICgqKnBfZm9ybWF0ID09ICcjJykgewogCQkJCSsrKnBfZm9ybWF0OwotCQkJCW4gPSB2YV9hcmcoKnBfdmEsIGludCk7CisJCQkJaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpCisJCQkJCW4gPSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QpOworCQkJCWVsc2UKKwkJCQkJbiA9IHZhX2FyZygqcF92YSwgaW50KTsKIAkJCX0KIAkJCWVsc2UKIAkJCQluID0gLTE7CkBAIC00MDcsNyArNDE2LDcgQEAKIAkJCWVsc2UgewogCQkJCWlmIChuIDwgMCkgewogCQkJCQlzaXplX3QgbSA9IHN0cmxlbihzdHIpOwotCQkJCQlpZiAobSA+IElOVF9NQVgpIHsKKwkJCQkJaWYgKG0gPiBQWV9TU0laRV9UX01BWCkgewogCQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkJCQkJInN0cmluZyB0b28gbG9uZyBmb3IgUHl0aG9uIHN0cmluZyIpOwogCQkJCQkJcmV0dXJuIE5VTEw7CkBAIC00NzIsNyArNDgxLDE4IEBACiAJdmFfbGlzdCB2YTsKIAlQeU9iamVjdCogcmV0dmFsOwogCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXJldHZhbCA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKwlyZXR2YWwgPSB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCAwKTsKKwl2YV9lbmQodmEpOworCXJldHVybiByZXR2YWw7Cit9CisKK1B5T2JqZWN0ICoKK19QeV9CdWlsZFZhbHVlX1NpemVUKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisJUHlPYmplY3QqIHJldHZhbDsKKwl2YV9zdGFydCh2YSwgZm9ybWF0KTsKKwlyZXR2YWwgPSB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCBGTEFHX1NJWkVfVCk7CiAJdmFfZW5kKHZhKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNDgwLDYgKzUwMCwxOCBAQAogUHlPYmplY3QgKgogUHlfVmFCdWlsZFZhbHVlKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKKwlyZXR1cm4gdmFfYnVpbGRfdmFsdWUoZm9ybWF0LCB2YSwgMCk7Cit9CisKK1B5T2JqZWN0ICoKK19QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQoreworCXJldHVybiB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCBGTEFHX1NJWkVfVCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCit2YV9idWlsZF92YWx1ZShjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEsIGludCBmbGFncykKK3sKIAljb25zdCBjaGFyICpmID0gZm9ybWF0OwogCWludCBuID0gY291bnRmb3JtYXQoZiwgJ1wwJyk7CiAJdmFfbGlzdCBsdmE7CkBAIC01MDEsOCArNTMzLDggQEAKIAkJcmV0dXJuIFB5X05vbmU7CiAJfQogCWlmIChuID09IDEpCi0JCXJldHVybiBkb19ta3ZhbHVlKCZmLCAmbHZhKTsKLQlyZXR1cm4gZG9fbWt0dXBsZSgmZiwgJmx2YSwgJ1wwJywgbik7CisJCXJldHVybiBkb19ta3ZhbHVlKCZmLCAmbHZhLCBmbGFncyk7CisJcmV0dXJuIGRvX21rdHVwbGUoJmYsICZsdmEsICdcMCcsIG4sIGZsYWdzKTsKIH0KIAogCmRpZmYgLS1naXQgYS9QeXRob24vcHlhcmVuYS5jIGIvUHl0aG9uL3B5YXJlbmEuYwppbmRleCAyNDJjYTFkLi5mMTFhOTA1IDEwMDY0NAotLS0gYS9QeXRob24vcHlhcmVuYS5jCisrKyBiL1B5dGhvbi9weWFyZW5hLmMKQEAgLTYsOSArNiwxNiBAQAogICAgTWVhc3VyZW1lbnRzIHdpdGggc3RhbmRhcmQgbGlicmFyeSBtb2R1bGVzIHN1Z2dlc3QgdGhlIGF2ZXJhZ2UKICAgIGFsbG9jYXRpb24gaXMgYWJvdXQgMjAgYnl0ZXMgYW5kIHRoYXQgbW9zdCBjb21waWxlcyB1c2UgYSBzaW5nbGUKICAgIGJsb2NrLgorCisgICBUT0RPKGpoeWx0b24pOiBUaGluayBhYm91dCBhIHJlYWxsb2MgQVBJLCBtYXliZSBqdXN0IGZvciB0aGUgbGFzdAorICAgYWxsb2NhdGlvbj8KICovCiAKICNkZWZpbmUgREVGQVVMVF9CTE9DS19TSVpFIDgxOTIKKyNkZWZpbmUgQUxJR05NRU5UCQk4CisjZGVmaW5lIEFMSUdOTUVOVF9NQVNLCQkoQUxJR05NRU5UIC0gMSkKKyNkZWZpbmUgUk9VTkRVUCh4KQkJKCgoeCkgKyBBTElHTk1FTlRfTUFTSykgJiB+QUxJR05NRU5UX01BU0spCisKIHR5cGVkZWYgc3RydWN0IF9ibG9jayB7CiAJLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIG93bmVkIGJ5IHRoaXMgYmxvY2sgYXZhaWxhYmxlIHRvIHBhc3Mgb3V0LgogCSAqIFJlYWQtb25seSBhZnRlciBpbml0aWFsaXphdGlvbi4gIFRoZSBmaXJzdCBzdWNoIGJ5dGUgc3RhcnRzIGF0CkBAIC0zOSw5ICs0NiwyNSBAQAogKi8KIAogc3RydWN0IF9hcmVuYSB7CisgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGJsb2NrIGFsbG9jYXRlZCBmb3IgdGhlIGFyZW5hLCBuZXZlciBOVUxMLgorICAgICAgICAgICBJdCBpcyB1c2VkIG9ubHkgdG8gZmluZCB0aGUgZmlyc3QgYmxvY2sgd2hlbiB0aGUgYXJlbmEgaXMKKyAgICAgICAgICAgYmVpbmcgZnJlZWQuCisgICAgICAgICAqLwogCWJsb2NrICphX2hlYWQ7CisKKyAgICAgICAgLyogUG9pbnRlciB0byB0aGUgYmxvY2sgY3VycmVudGx5IHVzZWQgZm9yIGFsbG9jYXRpb24uICBJdCdzCisgICAgICAgICAgIGFiX25leHQgZmllbGQgc2hvdWxkIGJlIE5VTEwuICBJZiBpdCBpcyBub3QtbnVsbCBhZnRlciBhCisgICAgICAgICAgIGNhbGwgdG8gYmxvY2tfYWxsb2MoKSwgaXQgbWVhbnMgYSBuZXcgYmxvY2sgaGFzIGJlZW4gYWxsb2NhdGVkCisgICAgICAgICAgIGFuZCBhX2N1ciBzaG91bGQgYmUgcmVzZXQgdG8gcG9pbnQgaXQuCisgICAgICAgICAqLwogCWJsb2NrICphX2N1cjsKKworICAgICAgICAvKiBBIFB5dGhvbiBsaXN0IG9iamVjdCBjb250YWluaW5nIHJlZmVyZW5jZXMgdG8gYWxsIHRoZSBQeU9iamVjdAorICAgICAgICAgICBwb2ludGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhcmVhLiAgVGhleSB3aWxsIGJlIERFQ1JFRmVkCisgICAgICAgICAgIHdoZW4gdGhlIGFyZW5hIGlzIGZyZWVkLgorICAgICAgICAqLwogICAgICAgICBQeU9iamVjdCAqYV9vYmplY3RzOworCiAjaWYgZGVmaW5lZChQeV9ERUJVRykKICAgICAgICAgLyogRGVidWcgb3V0cHV0ICovCiAgICAgICAgIHNpemVfdCB0b3RhbF9hbGxvY3M7CkBAIC02Myw3ICs4Niw4IEBACiAJYi0+YWJfc2l6ZSA9IHNpemU7CiAJYi0+YWJfbWVtID0gKHZvaWQgKikoYiArIDEpOwogCWItPmFiX25leHQgPSBOVUxMOwotCWItPmFiX29mZnNldCA9IDA7CisJYi0+YWJfb2Zmc2V0ID0gUk9VTkRVUCgoUHlfdWludHB0cl90KShiLT5hYl9tZW0pKSAtIAorCSAgKFB5X3VpbnRwdHJfdCkoYi0+YWJfbWVtKTsKIAlyZXR1cm4gYjsKIH0KIApAQCAtODEsMTkgKzEwNSwyMCBAQAogewogCXZvaWQgKnA7CiAJYXNzZXJ0KGIpOworCXNpemUgPSBST1VORFVQKHNpemUpOwogCWlmIChiLT5hYl9vZmZzZXQgKyBzaXplID4gYi0+YWJfc2l6ZSkgewogCQkvKiBJZiB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5IHRoYW4gd2lsbCBmaXQgaW4KIAkJICAgdGhlIGRlZmF1bHQgYmxvY2ssIGFsbG9jYXRlIGEgb25lLW9mZiBibG9jayB0aGF0IGlzCiAJCSAgIGV4YWN0bHkgdGhlIHJpZ2h0IHNpemUuICovCiAJCS8qIFRPRE8oamh5bHRvbik6IFRoaW5rIGFib3V0IHNwYWNlIHdhc3RlIGF0IGVuZCBvZiBibG9jayAqLwotCQlibG9jayAqbmV3ID0gYmxvY2tfbmV3KAorCQlibG9jayAqbmV3YmwgPSBibG9ja19uZXcoCiAJCQkJc2l6ZSA8IERFRkFVTFRfQkxPQ0tfU0laRSA/CiAJCQkJREVGQVVMVF9CTE9DS19TSVpFIDogc2l6ZSk7Ci0JCWlmICghbmV3KQorCQlpZiAoIW5ld2JsKQogCQkJcmV0dXJuIE5VTEw7CiAJCWFzc2VydCghYi0+YWJfbmV4dCk7Ci0JCWItPmFiX25leHQgPSBuZXc7Ci0JCWIgPSBuZXc7CisJCWItPmFiX25leHQgPSBuZXdibDsKKwkJYiA9IG5ld2JsOwogCX0KIAogCWFzc2VydChiLT5hYl9vZmZzZXQgKyBzaXplIDw9IGItPmFiX3NpemUpOwpAQCAtMTM0LDYgKzE1OSw3IEBACiB2b2lkCiBQeUFyZW5hX0ZyZWUoUHlBcmVuYSAqYXJlbmEpCiB7CisgICAgICAgIGludCByOwogCWFzc2VydChhcmVuYSk7CiAjaWYgZGVmaW5lZChQeV9ERUJVRykKICAgICAgICAgLyoKQEAgLTE0NSw3ICsxNzEsMTcgQEAKICAgICAgICAgKi8KICNlbmRpZgogCWJsb2NrX2ZyZWUoYXJlbmEtPmFfaGVhZCk7CisJLyogVGhpcyBwcm9wZXJ0eSBub3JtYWxseSBob2xkcywgZXhjZXB0IHdoZW4gdGhlIGNvZGUgYmVpbmcgY29tcGlsZWQKKwkgICBpcyBzeXMuZ2V0b2JqZWN0cygwKSwgaW4gd2hpY2ggY2FzZSB0aGVyZSB3aWxsIGJlIHR3byByZWZlcmVuY2VzLgogICAgICAgICBhc3NlcnQoYXJlbmEtPmFfb2JqZWN0cy0+b2JfcmVmY250ID09IDEpOworCSovCisKKyAgICAgICAgLyogQ2xlYXIgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0LiAgVGhpcyBpcyBuZWNlc3NhcnkKKyAgICAgICAgICAgdG8gZ3VhcmFudGVlIHRoYXQgdGhleSB3aWxsIGJlIERFQ1JFRmVkLiAqLworICAgICAgICByID0gUHlMaXN0X1NldFNsaWNlKGFyZW5hLT5hX29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUHlMaXN0X0dFVF9TSVpFKGFyZW5hLT5hX29iamVjdHMpLCBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KHIgPT0gMCk7CisgICAgICAgIGFzc2VydChQeUxpc3RfR0VUX1NJWkUoYXJlbmEtPmFfb2JqZWN0cykgPT0gMCk7CiAgICAgICAgIFB5X0RFQ1JFRihhcmVuYS0+YV9vYmplY3RzKTsKIAlmcmVlKGFyZW5hKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0YXRlLmMgYi9QeXRob24vcHlzdGF0ZS5jCmluZGV4IDg2NzMzNGUuLmI4ZjQ2MGYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXN0YXRlLmMKKysrIGIvUHl0aG9uL3B5c3RhdGUuYwpAQCAtMjMsMTMgKzIzLDYgQEAKICNlbmRpZgogCiAKLSNkZWZpbmUgWkFQKHgpIHsgXAotCVB5T2JqZWN0ICp0bXAgPSAoUHlPYmplY3QgKikoeCk7IFwKLQkoeCkgPSBOVUxMOyBcCi0JUHlfWERFQ1JFRih0bXApOyBcCi19Ci0KLQogI2lmZGVmIFdJVEhfVEhSRUFECiAjaW5jbHVkZSAicHl0aHJlYWQuaCIKIHN0YXRpYyBQeVRocmVhZF90eXBlX2xvY2sgaGVhZF9tdXRleCA9IE5VTEw7IC8qIFByb3RlY3RzIGludGVycC0+dHN0YXRlX2hlYWQgKi8KQEAgLTM3LDYgKzMwLDEwIEBACiAjZGVmaW5lIEhFQURfTE9DSygpIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhoZWFkX211dGV4LCBXQUlUX0xPQ0spCiAjZGVmaW5lIEhFQURfVU5MT0NLKCkgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGhlYWRfbXV0ZXgpCiAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwogLyogVGhlIHNpbmdsZSBQeUludGVycHJldGVyU3RhdGUgdXNlZCBieSB0aGlzIHByb2Nlc3MnCiAgICBHSUxTdGF0ZSBpbXBsZW1lbnRhdGlvbgogKi8KQEAgLTEwMiwxMiArOTksMTIgQEAKIAlmb3IgKHAgPSBpbnRlcnAtPnRzdGF0ZV9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQogCQlQeVRocmVhZFN0YXRlX0NsZWFyKHApOwogCUhFQURfVU5MT0NLKCk7Ci0JWkFQKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGgpOwotCVpBUChpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSk7Ci0JWkFQKGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkpOwotCVpBUChpbnRlcnAtPm1vZHVsZXMpOwotCVpBUChpbnRlcnAtPnN5c2RpY3QpOwotCVpBUChpbnRlcnAtPmJ1aWx0aW5zKTsKKwlQeV9DTEVBUihpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoKTsKKwlQeV9DTEVBUihpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSk7CisJUHlfQ0xFQVIoaW50ZXJwLT5jb2RlY19lcnJvcl9yZWdpc3RyeSk7CisJUHlfQ0xFQVIoaW50ZXJwLT5tb2R1bGVzKTsKKwlQeV9DTEVBUihpbnRlcnAtPnN5c2RpY3QpOworCVB5X0NMRUFSKGludGVycC0+YnVpbHRpbnMpOwogfQogCiAKQEAgLTIxMSwyMyArMjA4LDIzIEBACiAJCWZwcmludGYoc3RkZXJyLAogCQkgICJQeVRocmVhZFN0YXRlX0NsZWFyOiB3YXJuaW5nOiB0aHJlYWQgc3RpbGwgaGFzIGEgZnJhbWVcbiIpOwogCi0JWkFQKHRzdGF0ZS0+ZnJhbWUpOworCVB5X0NMRUFSKHRzdGF0ZS0+ZnJhbWUpOwogCi0JWkFQKHRzdGF0ZS0+ZGljdCk7Ci0JWkFQKHRzdGF0ZS0+YXN5bmNfZXhjKTsKKwlQeV9DTEVBUih0c3RhdGUtPmRpY3QpOworCVB5X0NMRUFSKHRzdGF0ZS0+YXN5bmNfZXhjKTsKIAotCVpBUCh0c3RhdGUtPmN1cmV4Y190eXBlKTsKLQlaQVAodHN0YXRlLT5jdXJleGNfdmFsdWUpOwotCVpBUCh0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2spOworCVB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3R5cGUpOworCVB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlKTsKKwlQeV9DTEVBUih0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2spOwogCi0JWkFQKHRzdGF0ZS0+ZXhjX3R5cGUpOwotCVpBUCh0c3RhdGUtPmV4Y192YWx1ZSk7Ci0JWkFQKHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayk7CisJUHlfQ0xFQVIodHN0YXRlLT5leGNfdHlwZSk7CisJUHlfQ0xFQVIodHN0YXRlLT5leGNfdmFsdWUpOworCVB5X0NMRUFSKHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayk7CiAKIAl0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgPSBOVUxMOwogCXRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBOVUxMOwotCVpBUCh0c3RhdGUtPmNfcHJvZmlsZW9iaik7Ci0JWkFQKHRzdGF0ZS0+Y190cmFjZW9iaik7CisJUHlfQ0xFQVIodHN0YXRlLT5jX3Byb2ZpbGVvYmopOworCVB5X0NMRUFSKHRzdGF0ZS0+Y190cmFjZW9iaik7CiB9CiAKIApAQCAtMjk3LDIzICsyOTQsMjMgQEAKIAogCiBQeVRocmVhZFN0YXRlICoKLVB5VGhyZWFkU3RhdGVfU3dhcChQeVRocmVhZFN0YXRlICpuZXcpCitQeVRocmVhZFN0YXRlX1N3YXAoUHlUaHJlYWRTdGF0ZSAqbmV3dHMpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqb2xkID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKKwlQeVRocmVhZFN0YXRlICpvbGR0cyA9IF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CiAKLQlfUHlUaHJlYWRTdGF0ZV9DdXJyZW50ID0gbmV3OworCV9QeVRocmVhZFN0YXRlX0N1cnJlbnQgPSBuZXd0czsKIAkvKiBJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGZvciBtb3JlIHRoYW4gb25lIHRocmVhZCBzdGF0ZQogCSAgIHRvIGJlIHVzZWQgZm9yIGEgdGhyZWFkLiAgQ2hlY2sgdGhpcyB0aGUgYmVzdCB3ZSBjYW4gaW4gZGVidWcKIAkgICBidWlsZHMuCiAJKi8KICNpZiBkZWZpbmVkKFB5X0RFQlVHKSAmJiBkZWZpbmVkKFdJVEhfVEhSRUFEKQotCWlmIChuZXcpIHsKKwlpZiAobmV3dHMpIHsKIAkJUHlUaHJlYWRTdGF0ZSAqY2hlY2sgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOwotCQlpZiAoY2hlY2sgJiYgY2hlY2stPmludGVycCA9PSBuZXctPmludGVycCAmJiBjaGVjayAhPSBuZXcpCisJCWlmIChjaGVjayAmJiBjaGVjay0+aW50ZXJwID09IG5ld3RzLT5pbnRlcnAgJiYgY2hlY2sgIT0gbmV3dHMpCiAJCQlQeV9GYXRhbEVycm9yKCJJbnZhbGlkIHRocmVhZCBzdGF0ZSBmb3IgdGhpcyB0aHJlYWQiKTsKIAl9CiAjZW5kaWYKLQlyZXR1cm4gb2xkOworCXJldHVybiBvbGR0czsKIH0KIAogLyogQW4gZXh0ZW5zaW9uIG1lY2hhbmlzbSB0byBzdG9yZSBhcmJpdHJhcnkgYWRkaXRpb25hbCBwZXItdGhyZWFkIHN0YXRlLgpAQCAtMzU2LDcgKzM1Myw3IEBACiAJZm9yIChwID0gaW50ZXJwLT50c3RhdGVfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgewogCQlpZiAocC0+dGhyZWFkX2lkICE9IGlkKQogCQkJY29udGludWU7Ci0JCVpBUChwLT5hc3luY19leGMpOworCQlQeV9DTEVBUihwLT5hc3luY19leGMpOwogCQlQeV9YSU5DUkVGKGV4Yyk7CiAJCXAtPmFzeW5jX2V4YyA9IGV4YzsKIAkJY291bnQgKz0gMTsKQEAgLTQ5MSw3ICs0ODgsNyBAQAogCSAgIGNhbGxlZCBQeV9Jbml0aWFsaXplKCkgYW5kIHVzdWFsbHkgUHlFdmFsX0luaXRUaHJlYWRzKCkuCiAJKi8KIAlhc3NlcnQoYXV0b0ludGVycHJldGVyU3RhdGUpOyAvKiBQeV9Jbml0aWFsaXplKCkgaGFzbid0IGJlZW4gY2FsbGVkISAqLwotCXRjdXIgPSBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpOworCXRjdXIgPSAoUHlUaHJlYWRTdGF0ZSAqKVB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSk7CiAJaWYgKHRjdXIgPT0gTlVMTCkgewogCQkvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIHN0YXRlIGZvciB0aGlzIHRocmVhZCAqLwogCQl0Y3VyID0gUHlUaHJlYWRTdGF0ZV9OZXcoYXV0b0ludGVycHJldGVyU3RhdGUpOwpAQCAtNTE4LDcgKzUxNSw4IEBACiB2b2lkCiBQeUdJTFN0YXRlX1JlbGVhc2UoUHlHSUxTdGF0ZV9TVEFURSBvbGRzdGF0ZSkKIHsKLQlQeVRocmVhZFN0YXRlICp0Y3VyID0gUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KTsKKwlQeVRocmVhZFN0YXRlICp0Y3VyID0gKFB5VGhyZWFkU3RhdGUgKilQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9UTFNrZXkpOwogCWlmICh0Y3VyID09IE5VTEwpCiAJCVB5X0ZhdGFsRXJyb3IoImF1dG8tcmVsZWFzaW5nIHRocmVhZC1zdGF0ZSwgIgogCQkgICAgICAgICAgICAgICJidXQgbm8gdGhyZWFkLXN0YXRlIGZvciB0aGlzIHRocmVhZCIpOwpAQCAtNTUxLDQgKzU0OSwxMSBAQAogCWVsc2UgaWYgKG9sZHN0YXRlID09IFB5R0lMU3RhdGVfVU5MT0NLRUQpCiAJCVB5RXZhbF9TYXZlVGhyZWFkKCk7CiB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLworCisKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0cnRvZC5jIGIvUHl0aG9uL3B5c3RydG9kLmMKaW5kZXggODNlNzkyZC4uZGI0Y2FkMSAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RydG9kLmMKKysrIGIvUHl0aG9uL3B5c3RydG9kLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQljaGFyICpjb3B5LCAqYzsKIAogCQkvKiBXZSBuZWVkIHRvIGNvbnZlcnQgdGhlICcuJyB0byB0aGUgbG9jYWxlIHNwZWNpZmljIGRlY2ltYWwgcG9pbnQgKi8KLQkJY29weSA9IG1hbGxvYyhlbmQgLSBucHRyICsgMSArIGRlY2ltYWxfcG9pbnRfbGVuKTsKKwkJY29weSA9IChjaGFyICopbWFsbG9jKGVuZCAtIG5wdHIgKyAxICsgZGVjaW1hbF9wb2ludF9sZW4pOwogCiAJCWMgPSBjb3B5OwogCQltZW1jcHkoYywgbnB0ciwgZGVjaW1hbF9wb2ludF9wb3MgLSBucHRyKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXRob25ydW4uYyBiL1B5dGhvbi9weXRob25ydW4uYwppbmRleCAyYzU0MDBkLi45OWQ2ZDlkIDEwMDY0NAotLS0gYS9QeXRob24vcHl0aG9ucnVuLmMKKysrIGIvUHl0aG9uL3B5dGhvbnJ1bi5jCkBAIC0zMCwxNCArMzAsMTUgQEAKICNlbmRpZgogCiAjaWZuZGVmIFB5X1JFRl9ERUJVRwotIyAgZGVmaW5lIFBSSU5UX1RPVEFMX1JFRlMoKQorI2RlZmluZSBQUklOVF9UT1RBTF9SRUZTKCkKICNlbHNlIC8qIFB5X1JFRl9ERUJVRyAqLwotIyAgaWYgZGVmaW5lZChNU19XSU42NCkKLSMgICAgZGVmaW5lIFBSSU5UX1RPVEFMX1JFRlMoKSBmcHJpbnRmKHN0ZGVyciwgIlslSWQgcmVmc11cbiIsIF9QeV9SZWZUb3RhbCk7Ci0jICBlbHNlIC8qICEgTVNfV0lONjQgKi8KLSMgICAgZGVmaW5lIFBSSU5UX1RPVEFMX1JFRlMoKSBmcHJpbnRmKHN0ZGVyciwgIlslbGQgcmVmc11cbiIsIFwKLQkJCVB5X1NBRkVfRE9XTkNBU1QoX1B5X1JlZlRvdGFsLCBQeV9zc2l6ZV90LCBsb25nKSk7Ci0jICBlbmRpZiAvKiBNU19XSU42NCAqLworI2RlZmluZSBQUklOVF9UT1RBTF9SRUZTKCkgZnByaW50ZihzdGRlcnIsCQkJCVwKKwkJCQkgICAiWyUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgcmVmc11cbiIsCVwKKwkJCQkgICBfUHlfR2V0UmVmVG90YWwoKSkKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgewogI2VuZGlmCiAKIGV4dGVybiBjaGFyICpQeV9HZXRQYXRoKHZvaWQpOwpAQCAtMjgwLDYgKzI4MSwxNiBAQAogCQl9CiAJCVB5X1hERUNSRUYoc3lzX2lzYXR0eSk7CiAKKwkJc3lzX3N0cmVhbSA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7CisJCXN5c19pc2F0dHkgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHN5c19zdHJlYW0sICJpc2F0dHkiLCAiIik7CisJCWlmICghc3lzX2lzYXR0eSkKKwkJCVB5RXJyX0NsZWFyKCk7CisJCWlmKHN5c19pc2F0dHkgJiYgUHlPYmplY3RfSXNUcnVlKHN5c19pc2F0dHkpKSB7CisJCQlpZiAoIVB5RmlsZV9TZXRFbmNvZGluZyhzeXNfc3RyZWFtLCBjb2Rlc2V0KSkKKwkJCQlQeV9GYXRhbEVycm9yKCJDYW5ub3Qgc2V0IGNvZGVzZXQgb2Ygc3RkZXJyIik7CisJCX0KKwkJUHlfWERFQ1JFRihzeXNfaXNhdHR5KTsKKwogCQlpZiAoIVB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpCiAJCQlQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nID0gY29kZXNldDsKIAkJZWxzZQpAQCAtMjk2LDcgKzMwNyw3IEBACiAKIAogI2lmZGVmIENPVU5UX0FMTE9DUwotZXh0ZXJuIHZvaWQgZHVtcF9jb3VudHModm9pZCk7CitleHRlcm4gdm9pZCBkdW1wX2NvdW50cyhGSUxFKik7CiAjZW5kaWYKIAogLyogVW5kbyB0aGUgZWZmZWN0IG9mIFB5X0luaXRpYWxpemUoKS4KQEAgLTM1OCw2ICszNjksMTMgQEAKIAkgKiBYWFggSSBoYXZlbid0IHNlZW4gYSByZWFsLWxpZmUgcmVwb3J0IG9mIGVpdGhlciBvZiB0aGVzZS4KIAkgKi8KIAlQeUdDX0NvbGxlY3QoKTsKKyNpZmRlZiBDT1VOVF9BTExPQ1MKKwkvKiBXaXRoIENPVU5UX0FMTE9DUywgaXQgaGVscHMgdG8gcnVuIEdDIG11bHRpcGxlIHRpbWVzOgorCSAgIGVhY2ggY29sbGVjdGlvbiBtaWdodCByZWxlYXNlIHNvbWUgdHlwZXMgZnJvbSB0aGUgdHlwZQorCSAgIGxpc3QsIHNvIHRoZXkgYmVjb21lIGdhcmJhZ2UuICovCisJd2hpbGUgKFB5R0NfQ29sbGVjdCgpID4gMCkKKwkJLyogbm90aGluZyAqLzsKKyNlbmRpZgogCiAJLyogRGVzdHJveSBhbGwgbW9kdWxlcyAqLwogCVB5SW1wb3J0X0NsZWFudXAoKTsKQEAgLTM4NiwxMCArNDA0LDEwIEBACiAKIAkvKiBEZWJ1Z2dpbmcgc3R1ZmYgKi8KICNpZmRlZiBDT1VOVF9BTExPQ1MKLQlkdW1wX2NvdW50cygpOworCWR1bXBfY291bnRzKHN0ZG91dCk7CiAjZW5kaWYKIAotCVBSSU5UX1RPVEFMX1JFRlMoKQorCVBSSU5UX1RPVEFMX1JFRlMoKTsKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKIAkvKiBEaXNwbGF5IGFsbCBvYmplY3RzIHN0aWxsIGFsaXZlIC0tIHRoaXMgY2FuIGludm9rZSBhcmJpdHJhcnkKQEAgLTY3OSw3ICs2OTcsNyBAQAogCX0KIAlmb3IgKDs7KSB7CiAJCXJldCA9IFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoZnAsIGZpbGVuYW1lLCBmbGFncyk7Ci0JCVBSSU5UX1RPVEFMX1JFRlMoKQorCQlQUklOVF9UT1RBTF9SRUZTKCk7CiAJCWlmIChyZXQgPT0gRV9FT0YpCiAJCQlyZXR1cm4gMDsKIAkJLyoKQEAgLTE0NTEsNyArMTQ2OSw3IEBACiAJdiA9IFB5X0J1aWxkVmFsdWUoIih6aWl6KSIsIGVyci0+ZmlsZW5hbWUsCiAJCQkgIGVyci0+bGluZW5vLCBlcnItPm9mZnNldCwgZXJyLT50ZXh0KTsKIAlpZiAoZXJyLT50ZXh0ICE9IE5VTEwpIHsKLQkJUHlNZW1fREVMKGVyci0+dGV4dCk7CisJCVB5T2JqZWN0X0ZSRUUoZXJyLT50ZXh0KTsKIAkJZXJyLT50ZXh0ID0gTlVMTDsKIAl9CiAJdyA9IE5VTEw7CkBAIC0xNjY2LDE2ICsxNjg0LDExMyBAQAogLyogRGVwcmVjYXRlZCBDIEFQSSBmdW5jdGlvbnMgc3RpbGwgcHJvdmlkZWQgZm9yIGJpbmFyeSBjb21wYXRpYmxpdHkgKi8KIAogI3VuZGVmIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZQotI3VuZGVmIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nCi0KLW5vZGUgKgorUHlBUElfRlVOQyhub2RlICopCiBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGUoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQpCiB7CiAJcmV0dXJuIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzKGZwLCBmaWxlbmFtZSwgc3RhcnQsIDApOwogfQogCi1ub2RlICoKKyN1bmRlZiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZworUHlBUElfRlVOQyhub2RlICopCiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzdGFydCkKIHsKIAlyZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhzdHIsIHN0YXJ0LCAwKTsKIH0KKworI3VuZGVmIFB5UnVuX0FueUZpbGUKK1B5QVBJX0ZVTkMoaW50KQorUHlSdW5fQW55RmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIE5VTEwpOworfQorCisjdW5kZWYgUHlSdW5fQW55RmlsZUV4CitQeUFQSV9GVU5DKGludCkKK1B5UnVuX0FueUZpbGVFeChGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGNsb3NlaXQpCit7CisJcmV0dXJuIFB5UnVuX0FueUZpbGVFeEZsYWdzKGZwLCBuYW1lLCBjbG9zZWl0LCBOVUxMKTsKK30KKworI3VuZGVmIFB5UnVuX0FueUZpbGVGbGFncworUHlBUElfRlVOQyhpbnQpCitQeVJ1bl9BbnlGaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKm5hbWUsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCit7CisJcmV0dXJuIFB5UnVuX0FueUZpbGVFeEZsYWdzKGZwLCBuYW1lLCAwLCBmbGFncyk7Cit9CisKKyN1bmRlZiBQeVJ1bl9GaWxlCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopCitQeVJ1bl9GaWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpwLCBpbnQgcywgUHlPYmplY3QgKmcsIFB5T2JqZWN0ICpsKQoreworICAgICAgICByZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIE5VTEwpOworfQorCisjdW5kZWYgUHlSdW5fRmlsZUV4CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopCitQeVJ1bl9GaWxlRXgoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnAsIGludCBzLCBQeU9iamVjdCAqZywgUHlPYmplY3QgKmwsIGludCBjKQoreworICAgICAgICByZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIGMsIE5VTEwpOworfQorCisjdW5kZWYgUHlSdW5fRmlsZUZsYWdzCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopCitQeVJ1bl9GaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnAsIGludCBzLCBQeU9iamVjdCAqZywgUHlPYmplY3QgKmwsCisJCVB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCit7CisgICAgICAgIHJldHVybiBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgZmxhZ3MpOworfQorCisjdW5kZWYgUHlSdW5fU2ltcGxlRmlsZQorUHlBUElfRlVOQyhpbnQpCitQeVJ1bl9TaW1wbGVGaWxlKEZJTEUgKmYsIGNvbnN0IGNoYXIgKnApCit7CisJcmV0dXJuIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGYsIHAsIDAsIE5VTEwpOworfQorCisjdW5kZWYgUHlSdW5fU2ltcGxlRmlsZUV4CitQeUFQSV9GVU5DKGludCkKK1B5UnVuX1NpbXBsZUZpbGVFeChGSUxFICpmLCBjb25zdCBjaGFyICpwLCBpbnQgYykKK3sKKwlyZXR1cm4gUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgYywgTlVMTCk7Cit9CisKKworI3VuZGVmIFB5UnVuX1N0cmluZworUHlBUElfRlVOQyhQeU9iamVjdCAqKQorUHlSdW5fU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHMsIFB5T2JqZWN0ICpnLCBQeU9iamVjdCAqbCkKK3sKKwlyZXR1cm4gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBzLCBnLCBsLCBOVUxMKTsKK30KKworI3VuZGVmIFB5UnVuX1NpbXBsZVN0cmluZworUHlBUElfRlVOQyhpbnQpCitQeVJ1bl9TaW1wbGVTdHJpbmcoY29uc3QgY2hhciAqcykKK3sKKwlyZXR1cm4gUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MocywgTlVMTCk7Cit9CisKKyN1bmRlZiBQeV9Db21waWxlU3RyaW5nCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopCitQeV9Db21waWxlU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcCwgaW50IHMpCit7CisJcmV0dXJuIFB5X0NvbXBpbGVTdHJpbmdGbGFncyhzdHIsIHAsIHMsIE5VTEwpOworfQorCisjdW5kZWYgUHlSdW5fSW50ZXJhY3RpdmVPbmUKK1B5QVBJX0ZVTkMoaW50KQorUHlSdW5fSW50ZXJhY3RpdmVPbmUoRklMRSAqZiwgY29uc3QgY2hhciAqcCkKK3sKKwlyZXR1cm4gUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhmLCBwLCBOVUxMKTsKK30KKworI3VuZGVmIFB5UnVuX0ludGVyYWN0aXZlTG9vcAorUHlBUElfRlVOQyhpbnQpCitQeVJ1bl9JbnRlcmFjdGl2ZUxvb3AoRklMRSAqZiwgY29uc3QgY2hhciAqcCkKK3sKKwlyZXR1cm4gUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoZiwgcCwgTlVMTCk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL1B5dGhvbi9zeW10YWJsZS5jIGIvUHl0aG9uL3N5bXRhYmxlLmMKaW5kZXggYzhlYWI1OC4uMTg0NzIzZCAxMDA2NDQKLS0tIGEvUHl0aG9uL3N5bXRhYmxlLmMKKysrIGIvUHl0aG9uL3N5bXRhYmxlLmMKQEAgLTIyNyw3ICsyMjcsOCBAQAogCWNhc2UgTW9kdWxlX2tpbmQ6CiAJCXNlcSA9IG1vZC0+di5Nb2R1bGUuYm9keTsKIAkJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspCi0JCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X3N0bXQoc3QsIGFzZGxfc2VxX0dFVChzZXEsIGkpKSkKKwkJCWlmICghc3ltdGFibGVfdmlzaXRfc3RtdChzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RtdF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKSkpCiAJCQkJZ290byBlcnJvcjsKIAkJYnJlYWs7CiAJY2FzZSBFeHByZXNzaW9uX2tpbmQ6CkBAIC0yMzcsNyArMjM4LDggQEAKIAljYXNlIEludGVyYWN0aXZlX2tpbmQ6CiAJCXNlcSA9IG1vZC0+di5JbnRlcmFjdGl2ZS5ib2R5OwogCQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykKLQkJCWlmICghc3ltdGFibGVfdmlzaXRfc3RtdChzdCwgYXNkbF9zZXFfR0VUKHNlcSwgaSkpKQorCQkJaWYgKCFzeW10YWJsZV92aXNpdF9zdG10KHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdG10X3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpKSkKIAkJCQlnb3RvIGVycm9yOwogCQlicmVhazsKIAljYXNlIFN1aXRlX2tpbmQ6CkBAIC01MDYsNyArNTA4LDcgQEAKICovCiBzdGF0aWMgaW50CiB1cGRhdGVfc3ltYm9scyhQeU9iamVjdCAqc3ltYm9scywgUHlPYmplY3QgKnNjb3BlLCAKLSAgICAgICAgICAgICAgIFB5T2JqZWN0ICpib3VuZCwgUHlPYmplY3QgKmZyZWUsIGludCBjbGFzcykKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICpib3VuZCwgUHlPYmplY3QgKmZyZWUsIGludCBjbGFzc2ZsYWcpCiB7CiAJUHlPYmplY3QgKm5hbWUsICp2LCAqdSwgKncsICpmcmVlX3ZhbHVlID0gTlVMTDsKIAlQeV9zc2l6ZV90IHBvcyA9IDA7CkBAIC01NDEsNyArNTQzLDcgQEAKIAkJCSAgIHRoZSBjbGFzcyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgbG9jYWwKIAkJCSAgIG9yIGdsb2JhbCBpbiB0aGUgY2xhc3Mgc2NvcGUuCiAJCQkqLwotCQkJaWYgIChjbGFzcyAmJiAKKwkJCWlmICAoY2xhc3NmbGFnICYmIAogCQkJICAgICBQeUludF9BU19MT05HKG8pICYgKERFRl9CT1VORCB8IERFRl9HTE9CQUwpKSB7CiAJCQkJbG9uZyBpID0gUHlJbnRfQVNfTE9ORyhvKSB8IERFRl9GUkVFX0NMQVNTOwogCQkJCW8gPSBQeUludF9Gcm9tTG9uZyhpKTsKQEAgLTg1MSw3ICs4NTMsNyBAQAogCWludCBpOyBcCiAJYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKIAlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeyBcCi0JCVRZUEUgIyMgX3R5IGVsdCA9IGFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCisJCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAogCQlpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIGVsdCkpIFwKIAkJCXJldHVybiAwOyBcCiAJfSBcCkBAIC04NjEsNyArODYzLDcgQEAKIAlpbnQgaTsgXAogCWFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCiAJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAotCQlUWVBFICMjIF90eSBlbHQgPSBhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAorCQlUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKIAkJaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSB7IFwKIAkJCXN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAogCQkJcmV0dXJuIDA7IFwKQEAgLTg3Myw3ICs4NzUsNyBAQAogCWludCBpOyBcCiAJYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKIAlmb3IgKGkgPSAoU1RBUlQpOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeyBcCi0JCVRZUEUgIyMgX3R5IGVsdCA9IGFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCisJCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAogCQlpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIGVsdCkpIFwKIAkJCXJldHVybiAwOyBcCiAJfSBcCkBAIC04ODMsNyArODg1LDcgQEAKIAlpbnQgaTsgXAogCWFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCiAJZm9yIChpID0gKFNUQVJUKTsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAotCQlUWVBFICMjIF90eSBlbHQgPSBhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAorCQlUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKIAkJaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSB7IFwKIAkJCXN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAogCQkJcmV0dXJuIDA7IFwKQEAgLTEwMzYsNyArMTAzOCw3IEBACiAJCWludCBpOwogCQlhc2RsX3NlcSAqc2VxID0gcy0+di5HbG9iYWwubmFtZXM7CiAJCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7Ci0JCQlpZGVudGlmaWVyIG5hbWUgPSBhc2RsX3NlcV9HRVQoc2VxLCBpKTsKKwkJCWlkZW50aWZpZXIgbmFtZSA9IChpZGVudGlmaWVyKWFzZGxfc2VxX0dFVChzZXEsIGkpOwogCQkJY2hhciAqY19uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpOwogCQkJbG9uZyBjdXIgPSBzeW10YWJsZV9sb29rdXAoc3QsIG5hbWUpOwogCQkJaWYgKGN1ciA8IDApCkBAIC0xMjAwLDcgKzEyMDIsNyBAQAogCQogICAgICAgICAvKiBnbyB0aHJvdWdoIGFsbCB0aGUgdG9wbGV2ZWwgYXJndW1lbnRzIGZpcnN0ICovCiAJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihhcmdzKTsgaSsrKSB7Ci0JCWV4cHJfdHkgYXJnID0gYXNkbF9zZXFfR0VUKGFyZ3MsIGkpOworCQlleHByX3R5IGFyZyA9IChleHByX3R5KWFzZGxfc2VxX0dFVChhcmdzLCBpKTsKIAkJaWYgKGFyZy0+a2luZCA9PSBOYW1lX2tpbmQpIHsKIAkJCWFzc2VydChhcmctPnYuTmFtZS5jdHggPT0gUGFyYW0gfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJnLT52Lk5hbWUuY3R4ID09IFN0b3JlICYmICF0b3BsZXZlbCkpOwpAQCAtMTIzNiw3ICsxMjM4LDcgQEAKIHsKIAlpbnQgaTsKIAlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGFyZ3MpOyBpKyspIHsKLQkJZXhwcl90eSBhcmcgPSBhc2RsX3NlcV9HRVQoYXJncywgaSk7CisJCWV4cHJfdHkgYXJnID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGFyZ3MsIGkpOwogCQlpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQgJiYKIAkJICAgICFzeW10YWJsZV92aXNpdF9wYXJhbXMoc3QsIGFyZy0+di5UdXBsZS5lbHRzLCAwKSkKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5c21vZHVsZS5jIGIvUHl0aG9uL3N5c21vZHVsZS5jCmluZGV4IDg3NWY3M2YuLmM2ZWI5MWYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeXNtb2R1bGUuYworKysgYi9QeXRob24vc3lzbW9kdWxlLmMKQEAgLTYwMCwxMCArNjAwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0dG90YWxyZWZjb3VudChQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoX1B5X1JlZlRvdGFsKTsKKwlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoX1B5X0dldFJlZlRvdGFsKCkpOwogfQotCi0jZW5kaWYgLyogUHlfVFJBQ0VfUkVGUyAqLworI2VuZGlmIC8qIFB5X1JFRl9ERUJVRyAqLwogCiBQeURvY19TVFJWQVIoZ2V0cmVmY291bnRfZG9jLAogImdldHJlZmNvdW50KG9iamVjdCkgLT4gaW50ZWdlclxuXApAQCAtNjk3LDYgKzY5NiwxMCBAQAogMTAuIE51bWJlciBvZiBzdGFjayBwb3BzIHBlcmZvcm1lZCBieSBjYWxsX2Z1bmN0aW9uKCkiCiApOwogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKICNpZmRlZiBQeV9UUkFDRV9SRUZTCiAvKiBEZWZpbmVkIGluIG9iamVjdHMuYyBiZWNhdXNlIGl0IHVzZXMgc3RhdGljIGdsb2JhbHMgaWYgdGhhdCBmaWxlICovCiBleHRlcm4gUHlPYmplY3QgKl9QeV9HZXRPYmplY3RzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwpAQCAtNzA3LDYgKzcxMCwxMCBAQAogZXh0ZXJuIFB5T2JqZWN0ICpfUHlfR2V0RFhQcm9maWxlKFB5T2JqZWN0ICosICBQeU9iamVjdCAqKTsKICNlbmRpZgogCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCiBzdGF0aWMgUHlNZXRob2REZWYgc3lzX21ldGhvZHNbXSA9IHsKIAkvKiBNaWdodCBhcyB3ZWxsIGtlZXAgdGhpcyBpbiBhbHBoYWJldGljIG9yZGVyICovCiAJeyJjYWxsc3RhdHMiLCAoUHlDRnVuY3Rpb24pUHlFdmFsX0dldENhbGxTdGF0cywgTUVUSF9OT0FSR1MsCkBAIC0xMDY1LDYgKzEwNzIsMTEgQEAKIAkJaWYgKCFQeUZpbGVfU2V0RW5jb2Rpbmcoc3lzb3V0LCBidWYpKQogCQkJcmV0dXJuIE5VTEw7CiAJfQorCWlmKGlzYXR0eShfZmlsZW5vKHN0ZGVycikpKSB7CisJCXNwcmludGYoYnVmLCAiY3AlZCIsIEdldENvbnNvbGVPdXRwdXRDUCgpKTsKKwkJaWYgKCFQeUZpbGVfU2V0RW5jb2Rpbmcoc3lzZXJyLCBidWYpKQorCQkJcmV0dXJuIE5VTEw7CisJfQogI2VuZGlmCiAKIAlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAic3RkaW4iLCBzeXNpbik7CkBAIC0xNDA2LDcgKzE0MTgsNyBAQAogCQkJUHlFcnJfQ2xlYXIoKTsKIAkJCWZwdXRzKGJ1ZmZlciwgZnApOwogCQl9Ci0JCWlmICh3cml0dGVuIDwgMCB8fCB3cml0dGVuID49IHNpemVvZihidWZmZXIpKSB7CisJCWlmICh3cml0dGVuIDwgMCB8fCAoc2l6ZV90KXdyaXR0ZW4gPj0gc2l6ZW9mKGJ1ZmZlcikpIHsKIAkJCWNvbnN0IGNoYXIgKnRydW5jYXRlZCA9ICIuLi4gdHJ1bmNhdGVkIjsKIAkJCWlmIChQeUZpbGVfV3JpdGVTdHJpbmcodHJ1bmNhdGVkLCBmaWxlKSAhPSAwKSB7CiAJCQkJUHlFcnJfQ2xlYXIoKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfcHRocmVhZC5oIGIvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKaW5kZXggNzgxNDY3Zi4uYzI5YTYxYyAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKKysrIGIvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKQEAgLTI2LDYgKzI2LDE2IEBACiAjZW5kaWYKICNlbmRpZgogCisvKiBCZWZvcmUgRnJlZUJTRCA1LjQsIHN5c3RlbSBzY29wZSB0aHJlYWRzIHdhcyB2ZXJ5IGxpbWl0ZWQgcmVzb3VyY2UKKyAgIGluIGRlZmF1bHQgc2V0dGluZy4gIFNvIHRoZSBwcm9jZXNzIHNjb3BlIGlzIHByZWZlcnJlZCB0byBnZXQKKyAgIGVub3VnaCBudW1iZXIgb2YgdGhyZWFkcyB0byB3b3JrLiAqLworI2lmZGVmIF9fRnJlZUJTRF9fCisjaW5jbHVkZSA8b3NyZWxkYXRlLmg+CisjaWYgX19GcmVlQlNEX3ZlcnNpb24gPj0gNTAwMDAwICYmIF9fRnJlZUJTRF92ZXJzaW9uIDwgNTA0MTAxCisjdW5kZWYgUFRIUkVBRF9TWVNURU1fU0NIRURfU1VQUE9SVEVECisjZW5kaWYKKyNlbmRpZgorCiAjaWYgIWRlZmluZWQocHRocmVhZF9hdHRyX2RlZmF1bHQpCiAjICBkZWZpbmUgcHRocmVhZF9hdHRyX2RlZmF1bHQgKChwdGhyZWFkX2F0dHJfdCAqKU5VTEwpCiAjZW5kaWYKQEAgLTEzOCw3ICsxNDgsNyBAQAogI2lmZGVmIFRIUkVBRF9TVEFDS19TSVpFCiAJcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0cnMsIFRIUkVBRF9TVEFDS19TSVpFKTsKICNlbmRpZgotI2lmIGRlZmluZWQoUFRIUkVBRF9TWVNURU1fU0NIRURfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykKKyNpZiBkZWZpbmVkKFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCkKICAgICAgICAgcHRocmVhZF9hdHRyX3NldHNjb3BlKCZhdHRycywgUFRIUkVBRF9TQ09QRV9TWVNURU0pOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL1B5dGhvbi90cmFjZWJhY2suYyBiL1B5dGhvbi90cmFjZWJhY2suYwppbmRleCA2YzExY2Y1Li5jZmJkODMzIDEwMDY0NAotLS0gYS9QeXRob24vdHJhY2ViYWNrLmMKKysrIGIvUHl0aG9uL3RyYWNlYmFjay5jCkBAIC0zOSwyNCArMzksMTYgQEAKIHN0YXRpYyBpbnQKIHRiX3RyYXZlcnNlKFB5VHJhY2ViYWNrT2JqZWN0ICp0YiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVyciA9IDA7Ci0JaWYgKHRiLT50Yl9uZXh0KSB7Ci0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKXRiLT50Yl9uZXh0LCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKHRiLT50Yl9mcmFtZSkgCi0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKXRiLT50Yl9mcmFtZSwgYXJnKTsKLQlyZXR1cm4gZXJyOworCVB5X1ZJU0lUKHRiLT50Yl9uZXh0KTsKKwlQeV9WSVNJVCh0Yi0+dGJfZnJhbWUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogdGJfY2xlYXIoUHlUcmFjZWJhY2tPYmplY3QgKnRiKQogewotCVB5X1hERUNSRUYodGItPnRiX25leHQpOwotCVB5X1hERUNSRUYodGItPnRiX2ZyYW1lKTsKLQl0Yi0+dGJfbmV4dCA9IE5VTEw7Ci0JdGItPnRiX2ZyYW1lID0gTlVMTDsKKwlQeV9DTEVBUih0Yi0+dGJfbmV4dCk7CisJUHlfQ0xFQVIodGItPnRiX2ZyYW1lKTsKIH0KIAogUHlUeXBlT2JqZWN0IFB5VHJhY2VCYWNrX1R5cGUgPSB7CkBAIC0xNjUsNyArMTU3LDcgQEAKIAkJCQl9CiAJCQkJaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CiAJCQkJCXNpemVfdCBsZW47Ci0JCQkJCWxlbiA9IFB5U3RyaW5nX1NpemUodik7CisJCQkJCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwogCQkJCQlpZiAobGVuICsgMSArIHRhaWxsZW4gPj0gTUFYUEFUSExFTikKIAkJCQkJCWNvbnRpbnVlOyAvKiBUb28gbG9uZyAqLwogCQkJCQlzdHJjcHkobmFtZWJ1ZiwgUHlTdHJpbmdfQXNTdHJpbmcodikpOwpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDkxOWFmNGMuLjFkYTU0MzAgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTg5LDcgKzg5LDcgQEAKIGF1dGhvcnMsIHRyYW5zbGF0b3JzLCBhbmQgcGVvcGxlIHdpdGggc3BlY2lhbCBmb3JtYXR0aW5nIHJlcXVpcmVtZW50cy4KIAogVW5mb3J0dW5hdGVseSwgbmV3LXN0eWxlIGNsYXNzZXMgKG5ldyBpbiBQeXRob24gMi4yKSBoYXZlIG5vdCB5ZXQgYmVlbgotaW50ZWdyYXRlZCBpbnRvIFB5dGhvbidzIHN0YW5kYXJkIGRvY3VtZW50aW9uLiAgQSBjb2xsZWN0aW9uIG9mCitpbnRlZ3JhdGVkIGludG8gUHl0aG9uJ3Mgc3RhbmRhcmQgZG9jdW1lbnRhdGlvbi4gIEEgY29sbGVjdGlvbiBvZgogcG9pbnRlcnMgdG8gd2hhdCBoYXMgYmVlbiB3cml0dGVuIGlzIGF0OgogCiAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9uZXdzdHlsZS5odG1sCkBAIC0xMTQsNyArMTE0LDcgQEAKIG1haWxpbmcgbGlzdHM6IHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvY29tbXVuaXR5L2xpc3RzLmh0bWwgZm9yIGFuCiBvdmVydmlldyBvZiB0aGVzZSBhbmQgbWFueSBvdGhlciBQeXRob24tcmVsYXRlZCBtYWlsaW5nIGxpc3RzLgogCi1BcmNoaXZlcyBhcmUgYWNjZXNzaWJsZSB2aWEgdGhlIEdvb2dsZSBHcm91cHMgdXNlbmV0IGFyY2hpdmU7IHNlZQorQXJjaGl2ZXMgYXJlIGFjY2Vzc2libGUgdmlhIHRoZSBHb29nbGUgR3JvdXBzIFVzZW5ldCBhcmNoaXZlOyBzZWUKIGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS8uICBUaGUgbWFpbGluZyBsaXN0cyBhcmUgYWxzbyBhcmNoaXZlZCwgc2VlCiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvY29tbXVuaXR5L2xpc3RzLmh0bWwgZm9yIGRldGFpbHMuCiAKQEAgLTI1NywyOCArMjU3LDI4IEBACiBhYm92ZSkgc28gd2UgY2FuIHJlbW92ZSB0aGVtISkKIAogVW5peCBwbGF0Zm9ybXM6IElmIHlvdXIgdmVuZG9yIHN0aWxsIHNoaXBzIChhbmQgeW91IHN0aWxsIHVzZSkgQmVya2VsZXkgREIKLQkxLjg1IHlvdSB3aWxsIG5lZWQgdG8gZWRpdCBNb2R1bGVzL1NldHVwIHRvIGJ1aWxkIHRoZSBic2RkYjE4NQotCW1vZHVsZSBhbmQgYWRkIGEgbGluZSB0byBzaXRlY3VzdG9taXplLnB5IHdoaWNoIG1ha2VzIGl0IHRoZQotCWRlZmF1bHQuICBJbiBNb2R1bGVzL1NldHVwIGEgbGluZSBsaWtlCisgICAgICAgIDEuODUgeW91IHdpbGwgbmVlZCB0byBlZGl0IE1vZHVsZXMvU2V0dXAgdG8gYnVpbGQgdGhlIGJzZGRiMTg1CisgICAgICAgIG1vZHVsZSBhbmQgYWRkIGEgbGluZSB0byBzaXRlY3VzdG9taXplLnB5IHdoaWNoIG1ha2VzIGl0IHRoZQorICAgICAgICBkZWZhdWx0LiAgSW4gTW9kdWxlcy9TZXR1cCBhIGxpbmUgbGlrZQogCi0JICAgIGJzZGRiMTg1IGJzZGRibW9kdWxlLmMKKyAgICAgICAgICAgIGJzZGRiMTg1IGJzZGRibW9kdWxlLmMKIAotCXNob3VsZCB3b3JrLiAgKFlvdSBtYXkgbmVlZCB0byBhZGQgLUksIC1MIG9yIC1sIGZsYWdzIHRvIGRpcmVjdCB0aGUKLQljb21waWxlciBhbmQgbGlua2VyIHRvIHlvdXIgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzLikKKyAgICAgICAgc2hvdWxkIHdvcmsuICAoWW91IG1heSBuZWVkIHRvIGFkZCAtSSwgLUwgb3IgLWwgZmxhZ3MgdG8gZGlyZWN0IHRoZQorICAgICAgICBjb21waWxlciBhbmQgbGlua2VyIHRvIHlvdXIgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzLikKIAogWFhYIEkgdGhpbmsgdGhpcyBuZXh0IGJpdCBpcyBvdXQgb2YgZGF0ZToKIAogNjQtYml0IHBsYXRmb3JtczogVGhlIG1vZHVsZXMgYXVkaW9vcCwgaW1hZ2VvcCBhbmQgcmdiaW1nIGRvbid0IHdvcmsuCi0JVGhlIHNldHVwLnB5IHNjcmlwdCBkaXNhYmxlcyB0aGVtIG9uIDY0LWJpdCBpbnN0YWxsYXRpb25zLgotCURvbid0IHRyeSB0byBlbmFibGUgdGhlbSBpbiB0aGUgTW9kdWxlcy9TZXR1cCBmaWxlLiAgVGhleQotCWNvbnRhaW4gY29kZSB0aGF0IGlzIHF1aXRlIHdvcmRzaXplIHNlbnNpdGl2ZS4gIChJZiB5b3UgaGF2ZSBhCi0JZml4LCBsZXQgdXMga25vdyEpCisgICAgICAgIFRoZSBzZXR1cC5weSBzY3JpcHQgZGlzYWJsZXMgdGhlbSBvbiA2NC1iaXQgaW5zdGFsbGF0aW9ucy4KKyAgICAgICAgRG9uJ3QgdHJ5IHRvIGVuYWJsZSB0aGVtIGluIHRoZSBNb2R1bGVzL1NldHVwIGZpbGUuICBUaGV5CisgICAgICAgIGNvbnRhaW4gY29kZSB0aGF0IGlzIHF1aXRlIHdvcmRzaXplIHNlbnNpdGl2ZS4gIChJZiB5b3UgaGF2ZSBhCisgICAgICAgIGZpeCwgbGV0IHVzIGtub3chKQogCiBTb2xhcmlzOiBXaGVuIHVzaW5nIFN1bidzIEMgY29tcGlsZXIgd2l0aCB0aHJlYWRzLCBhdCBsZWFzdCBvbiBTb2xhcmlzCi0JMi41LjEsIHlvdSBuZWVkIHRvIGFkZCB0aGUgIi1tdCIgY29tcGlsZXIgb3B0aW9uICh0aGUgc2ltcGxlc3QKLQl3YXkgaXMgcHJvYmFibHkgdG8gc3BlY2lmeSB0aGUgY29tcGlsZXIgd2l0aCB0aGlzIG9wdGlvbiBhcwotCXRoZSAiQ0MiIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyB0aGUgY29uZmlndXJlCi0Jc2NyaXB0KS4KKyAgICAgICAgMi41LjEsIHlvdSBuZWVkIHRvIGFkZCB0aGUgIi1tdCIgY29tcGlsZXIgb3B0aW9uICh0aGUgc2ltcGxlc3QKKyAgICAgICAgd2F5IGlzIHByb2JhYmx5IHRvIHNwZWNpZnkgdGhlIGNvbXBpbGVyIHdpdGggdGhpcyBvcHRpb24gYXMKKyAgICAgICAgdGhlICJDQyIgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBydW5uaW5nIHRoZSBjb25maWd1cmUKKyAgICAgICAgc2NyaXB0KS4KIAogICAgICAgICBXaGVuIHVzaW5nIEdDQyBvbiBTb2xhcmlzLCBiZXdhcmUgb2YgYmludXRpbHMgMi4xMyBvciBHQ0MKICAgICAgICAgdmVyc2lvbnMgYnVpbHQgdXNpbmcgaXQuICBUaGlzIG1pc3Rha2VubHkgZW5hYmxlcyB0aGUKQEAgLTI5MCwxMzYgKzI5MCwxMzYgQEAKICAgICAgICAgYW5kIDIuOCwgYnV0IG1heSBhbHNvIGFmZmVjdCBlYXJsaWVyIGFuZCBsYXRlciB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICAgT1MuCiAKLQlXaGVuIHRoZSBkeW5hbWljIGxvYWRlciBjb21wbGFpbnMgYWJvdXQgZXJyb3JzIGZpbmRpbmcgc2hhcmVkCi0JbGlicmFyaWVzLCBzdWNoIGFzCisgICAgICAgIFdoZW4gdGhlIGR5bmFtaWMgbG9hZGVyIGNvbXBsYWlucyBhYm91dCBlcnJvcnMgZmluZGluZyBzaGFyZWQKKyAgICAgICAgbGlicmFyaWVzLCBzdWNoIGFzCiAKLQlsZC5zby4xOiAuL3B5dGhvbjogZmF0YWw6IGxpYnN0ZGMrKy5zby41OiBvcGVuIGZhaWxlZDoKLQlObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisgICAgICAgIGxkLnNvLjE6IC4vcHl0aG9uOiBmYXRhbDogbGlic3RkYysrLnNvLjU6IG9wZW4gZmFpbGVkOgorICAgICAgICBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CiAKLQl5b3UgbmVlZCB0byBmaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGUgbGlicmFyeSBpcyBhdmFpbGFibGUgb24KLQl5b3VyIHN5c3RlbS4gVGhlbiwgeW91IG5lZWQgdG8gaW5zdHJ1Y3QgdGhlIGR5bmFtaWMgbG9hZGVyIGhvdwotCXRvIGZpbmQgaXQuIFlvdSBjYW4gY2hvb3NlIGFueSBvZiB0aGUgZm9sbG93aW5nIHN0cmF0ZWdpZXM6CisgICAgICAgIHlvdSBuZWVkIHRvIGZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBvbgorICAgICAgICB5b3VyIHN5c3RlbS4gVGhlbiwgeW91IG5lZWQgdG8gaW5zdHJ1Y3QgdGhlIGR5bmFtaWMgbG9hZGVyIGhvdworICAgICAgICB0byBmaW5kIGl0LiBZb3UgY2FuIGNob29zZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzOgogCi0JMS4gV2hlbiBjb21waWxpbmcgUHl0aG9uLCBzZXQgTERfUlVOX1BBVEggdG8gdGhlIGRpcmVjdG9yaWVzCi0JICAgY29udGFpbmluZyBtaXNzaW5nIGxpYnJhcmllcy4KLQkyLiBXaGVuIHJ1bm5pbmcgUHl0aG9uLCBzZXQgTERfTElCUkFSWV9QQVRIIHRvIHRoZXNlIGRpcmVjdG9yaWVzLgotCTMuIFVzZSBjcmxlKDgpIHRvIGV4dGVuZCB0aGUgc2VhcmNoIHBhdGggb2YgdGhlIGxvYWRlci4KLQk0LiBNb2RpZnkgdGhlIGluc3RhbGxlZCBHQ0Mgc3BlY3MgZmlsZSwgYWRkaW5nIC1SIG9wdGlvbnMgaW50byB0aGUKLQkgICAqbGluazogc2VjdGlvbi4KKyAgICAgICAgMS4gV2hlbiBjb21waWxpbmcgUHl0aG9uLCBzZXQgTERfUlVOX1BBVEggdG8gdGhlIGRpcmVjdG9yaWVzCisgICAgICAgICAgIGNvbnRhaW5pbmcgbWlzc2luZyBsaWJyYXJpZXMuCisgICAgICAgIDIuIFdoZW4gcnVubmluZyBQeXRob24sIHNldCBMRF9MSUJSQVJZX1BBVEggdG8gdGhlc2UgZGlyZWN0b3JpZXMuCisgICAgICAgIDMuIFVzZSBjcmxlKDgpIHRvIGV4dGVuZCB0aGUgc2VhcmNoIHBhdGggb2YgdGhlIGxvYWRlci4KKyAgICAgICAgNC4gTW9kaWZ5IHRoZSBpbnN0YWxsZWQgR0NDIHNwZWNzIGZpbGUsIGFkZGluZyAtUiBvcHRpb25zIGludG8gdGhlCisgICAgICAgICAgICpsaW5rOiBzZWN0aW9uLgogCiAgICAgICAgIFRoZSBjb21wbGV4IG9iamVjdCBmYWlscyB0byBjb21waWxlIG9uIFNvbGFyaXMgMTAgd2l0aCBnY2MgMy40IChhdAogICAgICAgICBsZWFzdCB1cCB0byAzLjQuMykuICBUbyB3b3JrIGFyb3VuZCBpdCwgZGVmaW5lIFB5X0hVR0VfVkFMIGFzCiAgICAgICAgIEhVR0VfVkFMKCksIGUuZy46CiAKICAgICAgICAgICBtYWtlIENQUEZMQUdTPSctRCJQeV9IVUdFX1ZBTD1IVUdFX1ZBTCgpIiAtSS4gLUkkKHNyY2RpcikvSW5jbHVkZScKLQkgIC4vcHl0aG9uIHNldHVwLnB5IENQUEZMQUdTPSctRCJQeV9IVUdFX1ZBTD1IVUdFX1ZBTCgpIicKKyAgICAgICAgICAuL3B5dGhvbiBzZXR1cC5weSBDUFBGTEFHUz0nLUQiUHlfSFVHRV9WQUw9SFVHRV9WQUwoKSInCiAKIExpbnV4OiAgQSBwcm9ibGVtIHdpdGggdGhyZWFkcyBhbmQgZm9yaygpIHdhcyB0cmFja2VkIGRvd24gdG8gYSBidWcgaW4KLQl0aGUgcHRocmVhZHMgY29kZSBpbiBnbGliYyB2ZXJzaW9uIDIuMC41OyBnbGliYyB2ZXJzaW9uIDIuMC43Ci0Jc29sdmVzIHRoZSBwcm9ibGVtLiAgVGhpcyBjYXVzZXMgdGhlIHBvcGVuMiB0ZXN0IHRvIGZhaWw7Ci0JcHJvYmxlbSBhbmQgc29sdXRpb24gcmVwb3J0ZWQgYnkgUGFibG8gQmxleWVyLgorICAgICAgICB0aGUgcHRocmVhZHMgY29kZSBpbiBnbGliYyB2ZXJzaW9uIDIuMC41OyBnbGliYyB2ZXJzaW9uIDIuMC43CisgICAgICAgIHNvbHZlcyB0aGUgcHJvYmxlbS4gIFRoaXMgY2F1c2VzIHRoZSBwb3BlbjIgdGVzdCB0byBmYWlsOworICAgICAgICBwcm9ibGVtIGFuZCBzb2x1dGlvbiByZXBvcnRlZCBieSBQYWJsbyBCbGV5ZXIuCiAKIFJlZCBIYXQgTGludXg6IFJlZCBIYXQgOSBidWlsdCBQeXRob24yLjIgaW4gVUNTLTQgbW9kZSBhbmQgaGFja2VkCi0JVGNsIHRvIHN1cHBvcnQgaXQuIFRvIGNvbXBpbGUgUHl0aG9uMi4zIHdpdGggVGtpbnRlciwgeW91IHdpbGwKLQluZWVkIHRvIHBhc3MgLS1lbmFibGUtdW5pY29kZT11Y3M0IGZsYWcgdG8gLi9jb25maWd1cmUuCisgICAgICAgIFRjbCB0byBzdXBwb3J0IGl0LiBUbyBjb21waWxlIFB5dGhvbjIuMyB3aXRoIFRraW50ZXIsIHlvdSB3aWxsCisgICAgICAgIG5lZWQgdG8gcGFzcyAtLWVuYWJsZS11bmljb2RlPXVjczQgZmxhZyB0byAuL2NvbmZpZ3VyZS4KIAotCVRoZXJlJ3MgYW4gZXhlY3V0YWJsZSAvdXNyL2Jpbi9weXRob24gd2hpY2ggaXMgUHl0aG9uCi0JMS41LjIgb24gbW9zdCBvbGRlciBSZWQgSGF0IGluc3RhbGxhdGlvbnM7IHNldmVyYWwga2V5IFJlZCBIYXQgdG9vbHMKLQlyZXF1aXJlIHRoaXMgdmVyc2lvbi4gIFB5dGhvbiAyLjEueCBtYXkgYmUgaW5zdGFsbGVkIGFzCi0JL3Vzci9iaW4vcHl0aG9uMi4gIFRoZSBNYWtlZmlsZSBpbnN0YWxscyBQeXRob24gYXMKLQkvdXNyL2xvY2FsL2Jpbi9weXRob24sIHdoaWNoIG1heSBvciBtYXkgbm90IHRha2UgcHJlY2VkZW5jZQotCW92ZXIgL3Vzci9iaW4vcHl0aG9uLCBkZXBlbmRpbmcgb24gaG93IHlvdSBoYXZlIHNldCB1cCAkUEFUSC4KKyAgICAgICAgVGhlcmUncyBhbiBleGVjdXRhYmxlIC91c3IvYmluL3B5dGhvbiB3aGljaCBpcyBQeXRob24KKyAgICAgICAgMS41LjIgb24gbW9zdCBvbGRlciBSZWQgSGF0IGluc3RhbGxhdGlvbnM7IHNldmVyYWwga2V5IFJlZCBIYXQgdG9vbHMKKyAgICAgICAgcmVxdWlyZSB0aGlzIHZlcnNpb24uICBQeXRob24gMi4xLnggbWF5IGJlIGluc3RhbGxlZCBhcworICAgICAgICAvdXNyL2Jpbi9weXRob24yLiAgVGhlIE1ha2VmaWxlIGluc3RhbGxzIFB5dGhvbiBhcworICAgICAgICAvdXNyL2xvY2FsL2Jpbi9weXRob24sIHdoaWNoIG1heSBvciBtYXkgbm90IHRha2UgcHJlY2VkZW5jZQorICAgICAgICBvdmVyIC91c3IvYmluL3B5dGhvbiwgZGVwZW5kaW5nIG9uIGhvdyB5b3UgaGF2ZSBzZXQgdXAgJFBBVEguCiAKIEZyZWVCU0QgMy54IGFuZCBwcm9iYWJseSBwbGF0Zm9ybXMgd2l0aCBOQ3Vyc2VzIHRoYXQgdXNlIGxpYm15dGluZm8gb3IKLQlzaW1pbGFyOiBXaGVuIHVzaW5nIGN1cnNlc21vZHVsZSwgdGhlIGxpbmtpbmcgaXMgbm90IGRvbmUgaW4KLQl0aGUgY29ycmVjdCBvcmRlciB3aXRoIHRoZSBkZWZhdWx0cy4gIFJlbW92ZSAiLWx0ZXJtY2FwIiBmcm9tCi0JdGhlIHJlYWRsaW5lIGVudHJ5IGluIFNldHVwLCBhbmQgdXNlIGFzIGN1cnNlcyBlbnRyeTogImN1cnNlcwotCWN1cnNlc21vZHVsZS5jIC1sbXl0aW5mbyAtbG5jdXJzZXMgLWx0ZXJtY2FwIiAtICJteXRpbmZvIiAoc28KLQljYWxsZWQgb24gRnJlZUJTRCkgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBhdXhpbGlhcnkgbGlicmFyeQotCXJlcXVpcmVkIG9uIHlvdXIgcGxhdGZvcm0uICBOb3JtYWxseSwgaXQgd291bGQgYmUgbGlua2VkCi0JYXV0b21hdGljYWxseSwgYnV0IG5vdCBuZWNlc3NhcmlseSBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAgICAgICAgc2ltaWxhcjogV2hlbiB1c2luZyBjdXJzZXNtb2R1bGUsIHRoZSBsaW5raW5nIGlzIG5vdCBkb25lIGluCisgICAgICAgIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGggdGhlIGRlZmF1bHRzLiAgUmVtb3ZlICItbHRlcm1jYXAiIGZyb20KKyAgICAgICAgdGhlIHJlYWRsaW5lIGVudHJ5IGluIFNldHVwLCBhbmQgdXNlIGFzIGN1cnNlcyBlbnRyeTogImN1cnNlcworICAgICAgICBjdXJzZXNtb2R1bGUuYyAtbG15dGluZm8gLWxuY3Vyc2VzIC1sdGVybWNhcCIgLSAibXl0aW5mbyIgKHNvCisgICAgICAgIGNhbGxlZCBvbiBGcmVlQlNEKSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGF1eGlsaWFyeSBsaWJyYXJ5CisgICAgICAgIHJlcXVpcmVkIG9uIHlvdXIgcGxhdGZvcm0uICBOb3JtYWxseSwgaXQgd291bGQgYmUgbGlua2VkCisgICAgICAgIGF1dG9tYXRpY2FsbHksIGJ1dCBub3QgbmVjZXNzYXJpbHkgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCiAKLUJTREk6CUJTREkgdmVyc2lvbnMgYmVmb3JlIDQuMSBoYXZlIGtub3duIHByb2JsZW1zIHdpdGggdGhyZWFkcywKLQl3aGljaCBjYW4gY2F1c2Ugc3RyYW5nZSBlcnJvcnMgaW4gYSBudW1iZXIgb2YgbW9kdWxlcyAoZm9yCi0JaW5zdGFuY2UsIHRoZSAndGVzdF9zaWduYWwnIHRlc3Qgc2NyaXB0IHdpbGwgaGFuZyBmb3JldmVyLikKLQlUdXJuaW5nIG9mZiB0aHJlYWRzICh3aXRoIC0td2l0aC10aHJlYWRzPW5vKSBvciB1cGdyYWRpbmcgdG8KLQlCU0RJIDQuMSBzb2x2ZXMgdGhpcyBwcm9ibGVtLgorQlNESTogICBCU0RJIHZlcnNpb25zIGJlZm9yZSA0LjEgaGF2ZSBrbm93biBwcm9ibGVtcyB3aXRoIHRocmVhZHMsCisgICAgICAgIHdoaWNoIGNhbiBjYXVzZSBzdHJhbmdlIGVycm9ycyBpbiBhIG51bWJlciBvZiBtb2R1bGVzIChmb3IKKyAgICAgICAgaW5zdGFuY2UsIHRoZSAndGVzdF9zaWduYWwnIHRlc3Qgc2NyaXB0IHdpbGwgaGFuZyBmb3JldmVyLikKKyAgICAgICAgVHVybmluZyBvZmYgdGhyZWFkcyAod2l0aCAtLXdpdGgtdGhyZWFkcz1ubykgb3IgdXBncmFkaW5nIHRvCisgICAgICAgIEJTREkgNC4xIHNvbHZlcyB0aGlzIHByb2JsZW0uCiAKIERFQyBVbml4OiBSdW4gY29uZmlndXJlIHdpdGggLS13aXRoLWRlYy10aHJlYWRzLCBvciB3aXRoCi0JLS13aXRoLXRocmVhZHM9bm8gaWYgbm8gdGhyZWFkcyBhcmUgZGVzaXJlZCAodGhyZWFkcyBhcmUgb24gYnkKLQlkZWZhdWx0KS4gIFdoZW4gdXNpbmcgR0NDLCBpdCBpcyBwb3NzaWJsZSB0byBnZXQgYW4gaW50ZXJuYWwKLQljb21waWxlciBlcnJvciBpZiBvcHRpbWl6YXRpb24gaXMgdXNlZC4gIFRoaXMgd2FzIHJlcG9ydGVkIGZvcgotCUdDQyAyLjcuMi4zIG9uIHNlbGVjdG1vZHVsZS5jLiAgTWFudWFsbHkgY29tcGlsZSB0aGUgYWZmZWN0ZWQKLQlmaWxlIHdpdGhvdXQgb3B0aW1pemF0aW9uIHRvIHNvbHZlIHRoZSBwcm9ibGVtLgorICAgICAgICAtLXdpdGgtdGhyZWFkcz1ubyBpZiBubyB0aHJlYWRzIGFyZSBkZXNpcmVkICh0aHJlYWRzIGFyZSBvbiBieQorICAgICAgICBkZWZhdWx0KS4gIFdoZW4gdXNpbmcgR0NDLCBpdCBpcyBwb3NzaWJsZSB0byBnZXQgYW4gaW50ZXJuYWwKKyAgICAgICAgY29tcGlsZXIgZXJyb3IgaWYgb3B0aW1pemF0aW9uIGlzIHVzZWQuICBUaGlzIHdhcyByZXBvcnRlZCBmb3IKKyAgICAgICAgR0NDIDIuNy4yLjMgb24gc2VsZWN0bW9kdWxlLmMuICBNYW51YWxseSBjb21waWxlIHRoZSBhZmZlY3RlZAorICAgICAgICBmaWxlIHdpdGhvdXQgb3B0aW1pemF0aW9uIHRvIHNvbHZlIHRoZSBwcm9ibGVtLgogCiBERUMgVWx0cml4OiBjb21waWxlIHdpdGggR0NDIHRvIGF2b2lkIGJ1Z3MgaW4gdGhlIG5hdGl2ZSBjb21waWxlciwKLQlhbmQgcGFzcyBTSEVMTD0vYmluL3NoNSB0byBNYWtlIHdoZW4gaW5zdGFsbGluZy4KKyAgICAgICAgYW5kIHBhc3MgU0hFTEw9L2Jpbi9zaDUgdG8gTWFrZSB3aGVuIGluc3RhbGxpbmcuCiAKLUFJWDoJQSBjb21wbGV0ZSBvdmVyaGF1bCBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBpcyBub3cgaW4KLQlwbGFjZS4gIFNlZSBNaXNjL0FJWC1OT1RFUyBmb3Igc29tZSBub3RlcyBvbiBob3cgaXQncyBkb25lLgotCShUaGUgb3B0aW1pemVyIGJ1ZyByZXBvcnRlZCBhdCB0aGlzIHBsYWNlIGluIHByZXZpb3VzIHJlbGVhc2VzCi0JaGFzIGJlZW4gd29ya2VkIGFyb3VuZCBieSBhIG1pbmltYWwgY29kZSBjaGFuZ2UuKSBJZiB5b3UgZ2V0Ci0JZXJyb3JzIGFib3V0IHB0aHJlYWRfKiBmdW5jdGlvbnMsIGR1cmluZyBjb21waWxlIG9yIGR1cmluZwotCXRlc3RpbmcsIHRyeSBzZXR0aW5nIENDIHRvIGEgdGhyZWFkLXNhZmUgKHJlZW50cmFudCkgY29tcGlsZXIsCi0JbGlrZSAiY2NfciIuICBGb3IgZnVsbCBDKysgbW9kdWxlIHN1cHBvcnQsIHNldCBDQz0ieGxDX3IiIChvcgotCUNDPSJ4bEMiIHdpdGhvdXQgdGhyZWFkIHN1cHBvcnQpLgorQUlYOiAgICBBIGNvbXBsZXRlIG92ZXJoYXVsIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGlzIG5vdyBpbgorICAgICAgICBwbGFjZS4gIFNlZSBNaXNjL0FJWC1OT1RFUyBmb3Igc29tZSBub3RlcyBvbiBob3cgaXQncyBkb25lLgorICAgICAgICAoVGhlIG9wdGltaXplciBidWcgcmVwb3J0ZWQgYXQgdGhpcyBwbGFjZSBpbiBwcmV2aW91cyByZWxlYXNlcworICAgICAgICBoYXMgYmVlbiB3b3JrZWQgYXJvdW5kIGJ5IGEgbWluaW1hbCBjb2RlIGNoYW5nZS4pIElmIHlvdSBnZXQKKyAgICAgICAgZXJyb3JzIGFib3V0IHB0aHJlYWRfKiBmdW5jdGlvbnMsIGR1cmluZyBjb21waWxlIG9yIGR1cmluZworICAgICAgICB0ZXN0aW5nLCB0cnkgc2V0dGluZyBDQyB0byBhIHRocmVhZC1zYWZlIChyZWVudHJhbnQpIGNvbXBpbGVyLAorICAgICAgICBsaWtlICJjY19yIi4gIEZvciBmdWxsIEMrKyBtb2R1bGUgc3VwcG9ydCwgc2V0IENDPSJ4bENfciIgKG9yCisgICAgICAgIENDPSJ4bEMiIHdpdGhvdXQgdGhyZWFkIHN1cHBvcnQpLgogCiBBSVggNS4zOiBUbyBidWlsZCBhIDY0LWJpdCB2ZXJzaW9uIHdpdGggSUJNJ3MgY29tcGlsZXIsIEkgdXNlZCB0aGUKICAgICAgICAgZm9sbG93aW5nOgogCiAgICAgICAgIGV4cG9ydCBQQVRIPS91c3IvYmluOi91c3IvdmFjcHAvYmluCi0JLi9jb25maWd1cmUgLS13aXRoLWdjYz0ieGxjX3IgLXE2NCIgLS13aXRoLWN4eD0ieGxDX3IgLXE2NCIgXAorICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtZ2NjPSJ4bGNfciAtcTY0IiAtLXdpdGgtY3h4PSJ4bENfciAtcTY0IiBcCiAgICAgICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1pcHY2IEFSPSJhciAtWDY0IgotCW1ha2UKKyAgICAgICAgbWFrZQogCiBIUC1VWDogIFdoZW4gdXNpbmcgdGhyZWFkaW5nLCB5b3UgbWF5IGhhdmUgdG8gYWRkIC1EX1JFRU5UUkFOVCB0byB0aGUKLQlPUFQgdmFyaWFibGUgaW4gdGhlIHRvcC1sZXZlbCBNYWtlZmlsZTsgcmVwb3J0ZWQgYnkgUGF0IEtuaWdodCwKLQl0aGlzIHNlZW1zIHRvIG1ha2UgYSBkaWZmZXJlbmNlIChhdCBsZWFzdCBmb3IgSFAtVVggMTAuMjApCi0JZXZlbiB0aG91Z2ggcHljb25maWcuaCBkZWZpbmVzIGl0LiBUaGlzIHNlZW1zIHVubmVjZXNzYXJ5IHdoZW4KLQl1c2luZyBIUC9VWCAxMSBhbmQgbGF0ZXIgLSB0aHJlYWRpbmcgc2VlbXMgdG8gd29yayAib3V0IG9mIHRoZQotCWJveCIuCisgICAgICAgIE9QVCB2YXJpYWJsZSBpbiB0aGUgdG9wLWxldmVsIE1ha2VmaWxlOyByZXBvcnRlZCBieSBQYXQgS25pZ2h0LAorICAgICAgICB0aGlzIHNlZW1zIHRvIG1ha2UgYSBkaWZmZXJlbmNlIChhdCBsZWFzdCBmb3IgSFAtVVggMTAuMjApCisgICAgICAgIGV2ZW4gdGhvdWdoIHB5Y29uZmlnLmggZGVmaW5lcyBpdC4gVGhpcyBzZWVtcyB1bm5lY2Vzc2FyeSB3aGVuCisgICAgICAgIHVzaW5nIEhQL1VYIDExIGFuZCBsYXRlciAtIHRocmVhZGluZyBzZWVtcyB0byB3b3JrICJvdXQgb2YgdGhlCisgICAgICAgIGJveCIuCiAKIEhQLVVYIGlhNjQ6IFdoZW4gYnVpbGRpbmcgb24gdGhlIGlhNjQgKEl0YW5pdW0pIHBsYXRmb3JtIHVzaW5nIEhQJ3MKLQljb21waWxlciwgc29tZSBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IHRoZSBjb21waWxlcidzCi0Jb3B0aW1pc2VyIHByb2R1Y2VzIGEgY29tcGxldGVseSBicm9rZW4gdmVyc2lvbiBvZiBweXRob24KLQkoc2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi84MTQ5NzYpLiBUbyB3b3JrIGFyb3VuZCB0aGlzLAotCWVkaXQgdGhlIE1ha2VmaWxlIGFuZCByZW1vdmUgLU8gZnJvbSB0aGUgT1BUIGxpbmUuCisgICAgICAgIGNvbXBpbGVyLCBzb21lIGV4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQgdGhlIGNvbXBpbGVyJ3MKKyAgICAgICAgb3B0aW1pc2VyIHByb2R1Y2VzIGEgY29tcGxldGVseSBicm9rZW4gdmVyc2lvbiBvZiBweXRob24KKyAgICAgICAgKHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvODE0OTc2KS4gVG8gd29yayBhcm91bmQgdGhpcywKKyAgICAgICAgZWRpdCB0aGUgTWFrZWZpbGUgYW5kIHJlbW92ZSAtTyBmcm9tIHRoZSBPUFQgbGluZS4KIAotCVRvIGJ1aWxkIGEgNjQtYml0IGV4ZWN1dGFibGUgb24gYW4gSXRhbml1bSAyIHN5c3RlbSB1c2luZyBIUCdzCi0JY29tcGlsZXIsIHVzZSB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgICAgICAgIFRvIGJ1aWxkIGEgNjQtYml0IGV4ZWN1dGFibGUgb24gYW4gSXRhbml1bSAyIHN5c3RlbSB1c2luZyBIUCdzCisgICAgICAgIGNvbXBpbGVyLCB1c2UgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzOgogCi0JCUNDPWNjCi0JCUNYWD1hQ0MKLQkJQkFTRUNGTEFHUz0iK0RENjQiCi0JCUxERkxBR1M9IitERDY0IC1seG5ldCIKKyAgICAgICAgICAgICAgICBDQz1jYworICAgICAgICAgICAgICAgIENYWD1hQ0MKKyAgICAgICAgICAgICAgICBCQVNFQ0ZMQUdTPSIrREQ2NCIKKyAgICAgICAgICAgICAgICBMREZMQUdTPSIrREQ2NCAtbHhuZXQiCiAKLQlhbmQgY2FsbCBjb25maWd1cmUgYXM6CisgICAgICAgIGFuZCBjYWxsIGNvbmZpZ3VyZSBhczoKIAotCQkuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtZ2NjCisgICAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRob3V0LWdjYwogCi0JdGhlbiAqdW5zZXQqIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYWdhaW4gYmVmb3JlIHJ1bm5pbmcKLQltYWtlLiAgKEF0IGxlYXN0IG9uZSBvZiB0aGVzZSBmbGFncyBjYXVzZXMgdGhlIGJ1aWxkIHRvIGZhaWwKLQlpZiBpdCByZW1haW5zIHNldC4pICBZb3Ugc3RpbGwgaGF2ZSB0byBlZGl0IHRoZSBNYWtlZmlsZSBhbmQKLQlyZW1vdmUgLU8gZnJvbSB0aGUgT1BUIGxpbmUuCisgICAgICAgIHRoZW4gKnVuc2V0KiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFnYWluIGJlZm9yZSBydW5uaW5nCisgICAgICAgIG1ha2UuICAoQXQgbGVhc3Qgb25lIG9mIHRoZXNlIGZsYWdzIGNhdXNlcyB0aGUgYnVpbGQgdG8gZmFpbAorICAgICAgICBpZiBpdCByZW1haW5zIHNldC4pICBZb3Ugc3RpbGwgaGF2ZSB0byBlZGl0IHRoZSBNYWtlZmlsZSBhbmQKKyAgICAgICAgcmVtb3ZlIC1PIGZyb20gdGhlIE9QVCBsaW5lLgogCiBIUCBQQS1SSVNDIDIuMDogQSByZWNlbnQgYnVnIHJlcG9ydCAoaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzU0NjExNykKLQlzdWdnZXN0cyB0aGF0IHRoZSBDIGNvbXBpbGVyIGluIHRoaXMgNjQtYml0IHN5c3RlbSBoYXMgYnVncwotCWluIHRoZSBvcHRpbWl6ZXIgdGhhdCBicmVhayBQeXRob24uICBDb21waWxpbmcgd2l0aG91dAotCW9wdGltaXphdGlvbiBzb2x2ZXMgdGhlIHByb2JsZW1zLgorICAgICAgICBzdWdnZXN0cyB0aGF0IHRoZSBDIGNvbXBpbGVyIGluIHRoaXMgNjQtYml0IHN5c3RlbSBoYXMgYnVncworICAgICAgICBpbiB0aGUgb3B0aW1pemVyIHRoYXQgYnJlYWsgUHl0aG9uLiAgQ29tcGlsaW5nIHdpdGhvdXQKKyAgICAgICAgb3B0aW1pemF0aW9uIHNvbHZlcyB0aGUgcHJvYmxlbXMuCiAKLVNDTzoJVGhlIGZvbGxvd2luZyBhcHBseSB0byBTQ08gMyBvbmx5OyBQeXRob24gYnVpbGRzIG91dCBvZiB0aGUgYm94Ci0Jb24gU0NPIDUgKG9yIHNvIHdlJ3ZlIGhlYXJkKS4KK1NDTzogICAgVGhlIGZvbGxvd2luZyBhcHBseSB0byBTQ08gMyBvbmx5OyBQeXRob24gYnVpbGRzIG91dCBvZiB0aGUgYm94CisgICAgICAgIG9uIFNDTyA1IChvciBzbyB3ZSd2ZSBoZWFyZCkuCiAKLQkxKSBFdmVyeXRoaW5nIHdvcmtzIG11Y2ggYmV0dGVyIGlmIHlvdSBhZGQgLVVfX1NURENfXyB0byB0aGUKLQlkZWZzLiAgVGhpcyBpcyBiZWNhdXNlIGFsbCB0aGUgU0NPIGhlYWRlciBmaWxlcyBhcmUgYnJva2VuLgotCUFueXRoaW5nIHRoYXQgaXNuJ3QgbWVudGlvbmVkIGluIHRoZSBDIHN0YW5kYXJkIGlzCi0JY29uZGl0aW9uYWxseSBleGNsdWRlZCB3aGVuIF9fU1REQ19fIGlzIGRlZmluZWQuCisgICAgICAgIDEpIEV2ZXJ5dGhpbmcgd29ya3MgbXVjaCBiZXR0ZXIgaWYgeW91IGFkZCAtVV9fU1REQ19fIHRvIHRoZQorICAgICAgICBkZWZzLiAgVGhpcyBpcyBiZWNhdXNlIGFsbCB0aGUgU0NPIGhlYWRlciBmaWxlcyBhcmUgYnJva2VuLgorICAgICAgICBBbnl0aGluZyB0aGF0IGlzbid0IG1lbnRpb25lZCBpbiB0aGUgQyBzdGFuZGFyZCBpcworICAgICAgICBjb25kaXRpb25hbGx5IGV4Y2x1ZGVkIHdoZW4gX19TVERDX18gaXMgZGVmaW5lZC4KIAotCTIpIER1ZSB0byB0aGUgVS5TLiBleHBvcnQgcmVzdHJpY3Rpb25zLCBTQ08gYnJva2UgdGhlIGNyeXB0Ci0Jc3R1ZmYgb3V0IGludG8gYSBzZXBhcmF0ZSBsaWJyYXJ5LCBsaWJjcnlwdF9pLmEgc28gdGhlIExJQlMKLQluZWVkZWQgYmUgc2V0IHRvOgorICAgICAgICAyKSBEdWUgdG8gdGhlIFUuUy4gZXhwb3J0IHJlc3RyaWN0aW9ucywgU0NPIGJyb2tlIHRoZSBjcnlwdAorICAgICAgICBzdHVmZiBvdXQgaW50byBhIHNlcGFyYXRlIGxpYnJhcnksIGxpYmNyeXB0X2kuYSBzbyB0aGUgTElCUworICAgICAgICBuZWVkZWQgYmUgc2V0IHRvOgogCi0JCUxJQlM9JyAtbHNvY2tldCAtbGNyeXB0X2knCisgICAgICAgICAgICAgICAgTElCUz0nIC1sc29ja2V0IC1sY3J5cHRfaScKIAogVW5peFdhcmU6IFRoZXJlIGFyZSBrbm93biBidWdzIGluIHRoZSBtYXRoIGxpYnJhcnkgb2YgdGhlIHN5c3RlbSwgYXMgd2VsbCBhcwogICAgICAgICBwcm9ibGVtcyBpbiB0aGUgaGFuZGxpbmcgb2YgdGhyZWFkcyAoY2FsbGluZyBmb3JrIGluIG9uZQpAQCAtNDI3LDYxICs0MjcsNjEgQEAKICAgICAgICAgdGVzdHMgaW52b2x2aW5nIHRocmVhZHMgd2lsbCBmYWlsIHVudGlsIHRob3NlIHByb2JsZW1zIGFyZSBmaXhlZC4KIAogU3VuT1MgNC54OiBXaGVuIHVzaW5nIHRoZSBTdW5Qcm8gQyBjb21waWxlciwgeW91IG1heSB3YW50IHRvIHVzZSB0aGUKLQknLVhhJyBvcHRpb24gaW5zdGVhZCBvZiAnLVhjJywgdG8gZW5hYmxlIHNvbWUgbmVlZGVkIG5vbi1BTlNJCi0JU3VuaXNtcy4KLQlUSElTIFNZU1RFTSBJUyBOTyBMT05HRVIgU1VQUE9SVEVELgorICAgICAgICAnLVhhJyBvcHRpb24gaW5zdGVhZCBvZiAnLVhjJywgdG8gZW5hYmxlIHNvbWUgbmVlZGVkIG5vbi1BTlNJCisgICAgICAgIFN1bmlzbXMuCisgICAgICAgIFRISVMgU1lTVEVNIElTIE5PIExPTkdFUiBTVVBQT1JURUQuCiAKIE5lWFQ6ICAgTm90IHN1cHBvcnRlZCBhbnltb3JlLiBTdGFydCB3aXRoIHRoZSBNYWNPU1gvRGFyd2luIGNvZGUgaWYgeW91Ci0Jd2FudCB0byByZXZpdmUgaXQuCisgICAgICAgIHdhbnQgdG8gcmV2aXZlIGl0LgogCi1RTlg6CUNocmlzIEhlcmJvcnRoIChjaHJpc2hAcW54LmNvbSkgd3JpdGVzOgotCWNvbmZpZ3VyZSB3b3JrcyBiZXN0IGlmIHlvdSB1c2UgR05VIGJhc2g7IGEgcG9ydCBpcyBhdmFpbGFibGUgb24KLQlmdHAucW54LmNvbSBpbiAvdXNyL2ZyZWUuICBJIHVzZWQgdGhlIGZvbGxvd2luZyBwcm9jZXNzIHRvIGJ1aWxkLAotCXRlc3QgYW5kIGluc3RhbGwgUHl0aG9uIDEuNS54IHVuZGVyIFFOWDoKK1FOWDogICAgQ2hyaXMgSGVyYm9ydGggKGNocmlzaEBxbnguY29tKSB3cml0ZXM6CisgICAgICAgIGNvbmZpZ3VyZSB3b3JrcyBiZXN0IGlmIHlvdSB1c2UgR05VIGJhc2g7IGEgcG9ydCBpcyBhdmFpbGFibGUgb24KKyAgICAgICAgZnRwLnFueC5jb20gaW4gL3Vzci9mcmVlLiAgSSB1c2VkIHRoZSBmb2xsb3dpbmcgcHJvY2VzcyB0byBidWlsZCwKKyAgICAgICAgdGVzdCBhbmQgaW5zdGFsbCBQeXRob24gMS41LnggdW5kZXIgUU5YOgogCi0JMSkgQ09ORklHX1NIRUxMPS91c3IvbG9jYWwvYmluL2Jhc2ggQ0M9Y2MgUkFOTElCPTogXAotCSAgICAuL2NvbmZpZ3VyZSAtLXZlcmJvc2UgLS13aXRob3V0LWdjYyAtLXdpdGgtbGlibT0iIgorICAgICAgICAxKSBDT05GSUdfU0hFTEw9L3Vzci9sb2NhbC9iaW4vYmFzaCBDQz1jYyBSQU5MSUI9OiBcCisgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXZlcmJvc2UgLS13aXRob3V0LWdjYyAtLXdpdGgtbGlibT0iIgogCi0JMikgZWRpdCBNb2R1bGVzL1NldHVwIHRvIGFjdGl2YXRlIGV2ZXJ5dGhpbmcgdGhhdCBtYWtlcyBzZW5zZSBmb3IKLQkgICB5b3VyIHN5c3RlbS4uLiB0ZXN0ZWQgaGVyZSBhdCBRTlggd2l0aCB0aGUgZm9sbG93aW5nIG1vZHVsZXM6CisgICAgICAgIDIpIGVkaXQgTW9kdWxlcy9TZXR1cCB0byBhY3RpdmF0ZSBldmVyeXRoaW5nIHRoYXQgbWFrZXMgc2Vuc2UgZm9yCisgICAgICAgICAgIHlvdXIgc3lzdGVtLi4uIHRlc3RlZCBoZXJlIGF0IFFOWCB3aXRoIHRoZSBmb2xsb3dpbmcgbW9kdWxlczoKIAotCQlhcnJheSwgYXVkaW9vcCwgYmluYXNjaWksIGNQaWNrbGUsIGNTdHJpbmdJTywgY21hdGgsCi0JCWNyeXB0LCBjdXJzZXMsIGVycm5vLCBmY250bCwgZ2RibSwgZ3JwLCBpbWFnZW9wLAotCQlfbG9jYWxlLCBtYXRoLCBtZDUsIG5ldywgb3BlcmF0b3IsIHBhcnNlciwgcGNyZSwKLQkJcG9zaXgsIHB3ZCwgcmVhZGxpbmUsIHJlZ2V4LCByZW9wLCByZ2JpbWcsIHJvdG9yLAotCQlzZWxlY3QsIHNpZ25hbCwgc29ja2V0LCBzb3VuZGV4LCBzdHJvcCwgc3RydWN0LAotCQlzeXNsb2csIHRlcm1pb3MsIHRpbWUsIHRpbWluZywgemxpYiwgYXVkaW9vcCwgaW1hZ2VvcCwgcmdiaW1nCisgICAgICAgICAgICAgICAgYXJyYXksIGF1ZGlvb3AsIGJpbmFzY2lpLCBjUGlja2xlLCBjU3RyaW5nSU8sIGNtYXRoLAorICAgICAgICAgICAgICAgIGNyeXB0LCBjdXJzZXMsIGVycm5vLCBmY250bCwgZ2RibSwgZ3JwLCBpbWFnZW9wLAorICAgICAgICAgICAgICAgIF9sb2NhbGUsIG1hdGgsIG1kNSwgbmV3LCBvcGVyYXRvciwgcGFyc2VyLCBwY3JlLAorICAgICAgICAgICAgICAgIHBvc2l4LCBwd2QsIHJlYWRsaW5lLCByZWdleCwgcmVvcCwgcmdiaW1nLCByb3RvciwKKyAgICAgICAgICAgICAgICBzZWxlY3QsIHNpZ25hbCwgc29ja2V0LCBzb3VuZGV4LCBzdHJvcCwgc3RydWN0LAorICAgICAgICAgICAgICAgIHN5c2xvZywgdGVybWlvcywgdGltZSwgdGltaW5nLCB6bGliLCBhdWRpb29wLCBpbWFnZW9wLCByZ2JpbWcKIAotCTMpIG1ha2UgU0hFTEw9L3Vzci9sb2NhbC9iaW4vYmFzaAorICAgICAgICAzKSBtYWtlIFNIRUxMPS91c3IvbG9jYWwvYmluL2Jhc2gKIAotCSAgIG9yLCBpZiB5b3UgZmVlbCB0aGUgbmVlZCBmb3Igc3BlZWQ6CisgICAgICAgICAgIG9yLCBpZiB5b3UgZmVlbCB0aGUgbmVlZCBmb3Igc3BlZWQ6CiAKLQkgICBtYWtlIFNIRUxMPS91c3IvbG9jYWwvYmluL2Jhc2ggT1BUPSItNSAtT2lsK25ydCIKKyAgICAgICAgICAgbWFrZSBTSEVMTD0vdXNyL2xvY2FsL2Jpbi9iYXNoIE9QVD0iLTUgLU9pbCtucnQiCiAKLQk0KSBtYWtlIFNIRUxMPS91c3IvbG9jYWwvYmluL2Jhc2ggdGVzdAorICAgICAgICA0KSBtYWtlIFNIRUxMPS91c3IvbG9jYWwvYmluL2Jhc2ggdGVzdAogCi0JICAgVXNpbmcgR05VIHJlYWRsaW5lIDIuMiBzZWVtcyB0byBiZWhhdmUgc3RyYW5nZWx5LCBidXQgSQotCSAgIHRoaW5rIHRoYXQncyBhIHByb2JsZW0gd2l0aCBteSByZWFkbGluZSAyLjIgcG9ydC4gIDotXAorICAgICAgICAgICBVc2luZyBHTlUgcmVhZGxpbmUgMi4yIHNlZW1zIHRvIGJlaGF2ZSBzdHJhbmdlbHksIGJ1dCBJCisgICAgICAgICAgIHRoaW5rIHRoYXQncyBhIHByb2JsZW0gd2l0aCBteSByZWFkbGluZSAyLjIgcG9ydC4gIDotXAogCi0JNSkgbWFrZSBTSEVMTD0vdXNyL2xvY2FsL2Jpbi9iYXNoIGluc3RhbGwKKyAgICAgICAgNSkgbWFrZSBTSEVMTD0vdXNyL2xvY2FsL2Jpbi9iYXNoIGluc3RhbGwKIAotCUlmIHlvdSBnZXQgU0lHU0VHVnMgd2hpbGUgcnVubmluZyBQeXRob24gKEkgaGF2ZW4ndCB5ZXQsIGJ1dAotCUkndmUgb25seSBydW4gc21hbGwgcHJvZ3JhbXMgYW5kIHRoZSB0ZXN0IGNhc2VzKSwgeW91J3JlCi0JcHJvYmFibHkgcnVubmluZyBvdXQgb2Ygc3RhY2s7IHRoZSBkZWZhdWx0IDMyayBjb3VsZCBiZSBhCi0JbGl0dGxlIHRpZ2h0LiAgVG8gaW5jcmVhc2UgdGhlIHN0YWNrIHNpemUsIGVkaXQgdGhlIE1ha2VmaWxlCi0JdG8gcmVhZDogTERGTEFHUyA9IC1OIDQ4aworICAgICAgICBJZiB5b3UgZ2V0IFNJR1NFR1ZzIHdoaWxlIHJ1bm5pbmcgUHl0aG9uIChJIGhhdmVuJ3QgeWV0LCBidXQKKyAgICAgICAgSSd2ZSBvbmx5IHJ1biBzbWFsbCBwcm9ncmFtcyBhbmQgdGhlIHRlc3QgY2FzZXMpLCB5b3UncmUKKyAgICAgICAgcHJvYmFibHkgcnVubmluZyBvdXQgb2Ygc3RhY2s7IHRoZSBkZWZhdWx0IDMyayBjb3VsZCBiZSBhCisgICAgICAgIGxpdHRsZSB0aWdodC4gIFRvIGluY3JlYXNlIHRoZSBzdGFjayBzaXplLCBlZGl0IHRoZSBNYWtlZmlsZQorICAgICAgICB0byByZWFkOiBMREZMQUdTID0gLU4gNDhrCiAKLUJlT1M6CVNlZSBNaXNjL0JlT1MtTk9URVMgZm9yIG5vdGVzIGFib3V0IGNvbXBpbGluZy9pbnN0YWxsaW5nCi0JUHl0aG9uIG9uIEJlT1MgUjMgb3IgbGF0ZXIuICBOb3RlIHRoYXQgb25seSB0aGUgUG93ZXJQQwotCXBsYXRmb3JtIGlzIHN1cHBvcnRlZCBmb3IgUjM7IGJvdGggUG93ZXJQQyBhbmQgeDg2IGFyZQotCXN1cHBvcnRlZCBmb3IgUjQuCitCZU9TOiAgIFNlZSBNaXNjL0JlT1MtTk9URVMgZm9yIG5vdGVzIGFib3V0IGNvbXBpbGluZy9pbnN0YWxsaW5nCisgICAgICAgIFB5dGhvbiBvbiBCZU9TIFIzIG9yIGxhdGVyLiAgTm90ZSB0aGF0IG9ubHkgdGhlIFBvd2VyUEMKKyAgICAgICAgcGxhdGZvcm0gaXMgc3VwcG9ydGVkIGZvciBSMzsgYm90aCBQb3dlclBDIGFuZCB4ODYgYXJlCisgICAgICAgIHN1cHBvcnRlZCBmb3IgUjQuCiAKIENyYXkgVDNFOiBNYXJrIEhhZGZpZWxkIChtLmhhZGZpZWxkQG5pd2EuY28ubnopIHdyaXRlczoKLQlQeXRob24gY2FuIGJlIGJ1aWx0IHNhdGlzZmFjdG9yaWx5IG9uIGEgQ3JheSBUM0UgYnV0IGJhc2VkIG9uCi0JbXkgZXhwZXJpZW5jZSB3aXRoIHRoZSBOSVdBIFQzRSAoMjAwMi0wNS0yMiwgdmVyc2lvbiAyLjIuMSkKLQl0aGVyZSBhcmUgYSBmZXcgYnVncyBhbmQgZ290Y2hhcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIGEKLQl0aHJlYWQgb24gY29tcC5sYW5nLnB5dGhvbiBpbiBNYXkgMjAwMiBlbnRpdGxlZCAiQnVpbGRpbmcKLQlQeXRob24gb24gQ3JheSBUM0UiLgorICAgICAgICBQeXRob24gY2FuIGJlIGJ1aWx0IHNhdGlzZmFjdG9yaWx5IG9uIGEgQ3JheSBUM0UgYnV0IGJhc2VkIG9uCisgICAgICAgIG15IGV4cGVyaWVuY2Ugd2l0aCB0aGUgTklXQSBUM0UgKDIwMDItMDUtMjIsIHZlcnNpb24gMi4yLjEpCisgICAgICAgIHRoZXJlIGFyZSBhIGZldyBidWdzIGFuZCBnb3RjaGFzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgYQorICAgICAgICB0aHJlYWQgb24gY29tcC5sYW5nLnB5dGhvbiBpbiBNYXkgMjAwMiBlbnRpdGxlZCAiQnVpbGRpbmcKKyAgICAgICAgUHl0aG9uIG9uIENyYXkgVDNFIi4KIAogICAgICAgICAxKSBVc2UgQ3JheSdzIGNjIGFuZCBub3QgZ2NjLiBUaGUgbGF0dGVyIHdhcyByZXBvcnRlZCBub3QgdG8KICAgICAgICAgICAgd29yayBieSBLb25yYWQgSGluc2VuLiBJdCBtYXkgd29yayBub3csIGJ1dCBpdCBtYXkgbm90LgpAQCAtNDkxLDE2ICs0OTEsMTYgQEAKIAogICAgICAgICAgICAgIE1BQ0hERVA9dW5pY29zbWsKIAotCTIpIFJ1biBjb25maWd1cmUgd2l0aCBvcHRpb24gIi0tZW5hYmxlLXVuaWNvZGU9dWNzNCIuCisgICAgICAgIDIpIFJ1biBjb25maWd1cmUgd2l0aCBvcHRpb24gIi0tZW5hYmxlLXVuaWNvZGU9dWNzNCIuCiAKLQkzKSBUaGUgQ3JheSBUM0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcsIHNvIGV4dGVuc2lvbgotCSAgIG1vZHVsZXMgaGF2ZSB0byBiZSBidWlsdCBieSBhZGRpbmcgKG9yIHVuY29tbWVudGluZykgbGluZXMKLQkgICBpbiBNb2R1bGVzL1NldHVwLiBUaGUgbWluaW11bSBzZXQgb2YgbW9kdWxlcyBpcworICAgICAgICAzKSBUaGUgQ3JheSBUM0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcsIHNvIGV4dGVuc2lvbgorICAgICAgICAgICBtb2R1bGVzIGhhdmUgdG8gYmUgYnVpbHQgYnkgYWRkaW5nIChvciB1bmNvbW1lbnRpbmcpIGxpbmVzCisgICAgICAgICAgIGluIE1vZHVsZXMvU2V0dXAuIFRoZSBtaW5pbXVtIHNldCBvZiBtb2R1bGVzIGlzCiAKLQkgICAgIHBvc2l4LCBuZXcsIF9zcmUsIHVuaWNvZGVkYXRhCisgICAgICAgICAgICAgcG9zaXgsIG5ldywgX3NyZSwgdW5pY29kZWRhdGEKIAotCSAgIE9uIE5JV0EncyB2YW5pbGxhIFQzRSBzeXN0ZW0gdGhlIGZvbGxvd2luZyBoYXZlIGFsc28gYmVlbgotCSAgIGluY2x1ZGVkIHN1Y2Nlc3NmdWxseToKKyAgICAgICAgICAgT24gTklXQSdzIHZhbmlsbGEgVDNFIHN5c3RlbSB0aGUgZm9sbG93aW5nIGhhdmUgYWxzbyBiZWVuCisgICAgICAgICAgIGluY2x1ZGVkIHN1Y2Nlc3NmdWxseToKIAogCSAgICAgX2NvZGVjcywgX2xvY2FsZSwgX3NvY2tldCwgX3N5bXRhYmxlLCBfdGVzdGNhcGksIF93ZWFrcmVmCiAJICAgICBhcnJheSwgYmluYXNjaWksIGNtYXRoLCBjUGlja2xlLCBjcnlwdCwgY1N0cmluZ0lPLCBkYm0KQEAgLTUwOCwyOCArNTA4LDI4IEBACiAJICAgICByb3Rvciwgc2VsZWN0LCBzdHJ1Y3QsIHN0cm9wLCBzeXNsb2csIHRlcm1pb3MsCiAJICAgICB0aW1lLCB0aW1pbmcKIAotCTQpIE9uY2UgdGhlIHB5dGhvbiBleGVjdXRhYmxlIGFuZCBsaWJyYXJ5IGhhdmUgYmVlbiBidWlsdCwgbWFrZQotCSAgIHdpbGwgZXhlY3V0ZSBzZXR1cC5weSwgd2hpY2ggd2lsbCBhdHRlbXB0IHRvIGJ1aWxkIHJlbWFpbmluZwotCSAgIGV4dGVuc2lvbnMgYW5kIGxpbmsgdGhlbSBkeW5hbWljYWxseS4gRWFjaCBvZiB0aGVzZSBhdHRlbXB0cwotCSAgIHdpbGwgZmFpbCBidXQgc2hvdWxkIG5vdCBoYWx0IHRoZSBtYWtlIHByb2Nlc3MuIFRoaXMgaXMKLQkgICBub3JtYWwuCisgICAgICAgIDQpIE9uY2UgdGhlIHB5dGhvbiBleGVjdXRhYmxlIGFuZCBsaWJyYXJ5IGhhdmUgYmVlbiBidWlsdCwgbWFrZQorICAgICAgICAgICB3aWxsIGV4ZWN1dGUgc2V0dXAucHksIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBidWlsZCByZW1haW5pbmcKKyAgICAgICAgICAgZXh0ZW5zaW9ucyBhbmQgbGluayB0aGVtIGR5bmFtaWNhbGx5LiBFYWNoIG9mIHRoZXNlIGF0dGVtcHRzCisgICAgICAgICAgIHdpbGwgZmFpbCBidXQgc2hvdWxkIG5vdCBoYWx0IHRoZSBtYWtlIHByb2Nlc3MuIFRoaXMgaXMKKyAgICAgICAgICAgbm9ybWFsLgogCi0JNSkgUnVubmluZyAibWFrZSB0ZXN0IiB1c2VzIGEgbG90IG9mIHJlc291cmNlcyBhbmQgY2F1c2VzCi0JICAgcHJvYmxlbXMgb24gb3VyIHN5c3RlbS4gWW91IG1pZ2h0IHdhbnQgdG8gdHJ5IHJ1bm5pbmcgdGVzdHMKLQkgICBzaW5nbHkgb3IgaW4gc21hbGwgZ3JvdXBzLgorICAgICAgICA1KSBSdW5uaW5nICJtYWtlIHRlc3QiIHVzZXMgYSBsb3Qgb2YgcmVzb3VyY2VzIGFuZCBjYXVzZXMKKyAgICAgICAgICAgcHJvYmxlbXMgb24gb3VyIHN5c3RlbS4gWW91IG1pZ2h0IHdhbnQgdG8gdHJ5IHJ1bm5pbmcgdGVzdHMKKyAgICAgICAgICAgc2luZ2x5IG9yIGluIHNtYWxsIGdyb3Vwcy4KIAotU0dJOglTR0kncyBzdGFuZGFyZCAibWFrZSIgdXRpbGl0eSAoL2Jpbi9tYWtlIG9yIC91c3IvYmluL21ha2UpCi0JZG9lcyBub3QgY2hlY2sgd2hldGhlciBhIGNvbW1hbmQgYWN0dWFsbHkgY2hhbmdlZCB0aGUgZmlsZSBpdAotCWlzIHN1cHBvc2VkIHRvIGJ1aWxkLiAgVGhpcyBtZWFucyB0aGF0IHdoZW5ldmVyIHlvdSBzYXkgIm1ha2UiCi0JaXQgd2lsbCByZWRvIHRoZSBsaW5rIHN0ZXAuICBUaGUgcmVtZWR5IGlzIHRvIHVzZSBTR0kncyBtdWNoCi0Jc21hcnRlciAic21ha2UiIHV0aWxpdHkgKC91c3Ivc2Jpbi9zbWFrZSksIG9yIEdOVSBtYWtlLiAgSWYKLQl5b3Ugc2V0IHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBNYWtlZmlsZSB0byAjIS91c3Ivc2Jpbi9zbWFrZQotCXNtYWtlIHdpbGwgYmUgaW52b2tlZCBieSBtYWtlIChsaWtld2lzZSBmb3IgR05VIG1ha2UpLgorU0dJOiAgICBTR0kncyBzdGFuZGFyZCAibWFrZSIgdXRpbGl0eSAoL2Jpbi9tYWtlIG9yIC91c3IvYmluL21ha2UpCisgICAgICAgIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgYSBjb21tYW5kIGFjdHVhbGx5IGNoYW5nZWQgdGhlIGZpbGUgaXQKKyAgICAgICAgaXMgc3VwcG9zZWQgdG8gYnVpbGQuICBUaGlzIG1lYW5zIHRoYXQgd2hlbmV2ZXIgeW91IHNheSAibWFrZSIKKyAgICAgICAgaXQgd2lsbCByZWRvIHRoZSBsaW5rIHN0ZXAuICBUaGUgcmVtZWR5IGlzIHRvIHVzZSBTR0kncyBtdWNoCisgICAgICAgIHNtYXJ0ZXIgInNtYWtlIiB1dGlsaXR5ICgvdXNyL3NiaW4vc21ha2UpLCBvciBHTlUgbWFrZS4gIElmCisgICAgICAgIHlvdSBzZXQgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIE1ha2VmaWxlIHRvICMhL3Vzci9zYmluL3NtYWtlCisgICAgICAgIHNtYWtlIHdpbGwgYmUgaW52b2tlZCBieSBtYWtlIChsaWtld2lzZSBmb3IgR05VIG1ha2UpLgogCi0JV0FSTklORzogVGhlcmUgYXJlIGJ1Z3MgaW4gdGhlIG9wdGltaXplciBvZiBzb21lIHZlcnNpb25zIG9mCi0JU0dJJ3MgY29tcGlsZXJzIHRoYXQgY2FuIGNhdXNlIGJ1cyBlcnJvcnMgb3Igb3RoZXIgc3RyYW5nZQotCWJlaGF2aW9yLCBlc3BlY2lhbGx5IG9uIG51bWVyaWNhbCBvcGVyYXRpb25zLiAgVG8gYXZvaWQgdGhpcywKLQl0cnkgYnVpbGRpbmcgd2l0aCAibWFrZSBPUFQ9Ii4KKyAgICAgICAgV0FSTklORzogVGhlcmUgYXJlIGJ1Z3MgaW4gdGhlIG9wdGltaXplciBvZiBzb21lIHZlcnNpb25zIG9mCisgICAgICAgIFNHSSdzIGNvbXBpbGVycyB0aGF0IGNhbiBjYXVzZSBidXMgZXJyb3JzIG9yIG90aGVyIHN0cmFuZ2UKKyAgICAgICAgYmVoYXZpb3IsIGVzcGVjaWFsbHkgb24gbnVtZXJpY2FsIG9wZXJhdGlvbnMuICBUbyBhdm9pZCB0aGlzLAorICAgICAgICB0cnkgYnVpbGRpbmcgd2l0aCAibWFrZSBPUFQ9Ii4KIAogT1MvMjogICBJZiB5b3UgYXJlIHJ1bm5pbmcgV2FycDMgb3IgV2FycDQgYW5kIGhhdmUgSUJNJ3MgVmlzdWFsQWdlIEMvQysrCiAgICAgICAgIGNvbXBpbGVyIGluc3RhbGxlZCwganVzdCBjaGFuZ2UgaW50byB0aGUgcGNcb3MydmFjcHAgZGlyZWN0b3J5CkBAIC01NjksOCArNTY5LDggQEAKICAgICAgICAgYWRkaXRpb25zLgogCiAgICAgICAgIFNvbWUgcGVvcGxlIGhhdmUgcmVwb3J0ZWQgcHJvYmxlbXMgYnVpbGRpbmcgUHl0aG9uIGFmdGVyIHVzaW5nICJmaW5rIgotICAgICAgICB0byBpbnN0YWxsIGFkZGl0aW9uYWwgdW5peCBzb2Z0d2FyZS4gRGlzYWJsaW5nIGZpbmsgKHJlbW92ZSBhbGwgcmVmZXJlbmNlcwotICAgICAgICB0byAvc3cgZnJvbSB5b3VyIC5wcm9maWxlIG9yIC5sb2dpbikgc2hvdWxkIHNvbHZlIHRoaXMuCisgICAgICAgIHRvIGluc3RhbGwgYWRkaXRpb25hbCB1bml4IHNvZnR3YXJlLiBEaXNhYmxpbmcgZmluayAocmVtb3ZlIGFsbCAKKyAgICAgICAgcmVmZXJlbmNlcyB0byAvc3cgZnJvbSB5b3VyIC5wcm9maWxlIG9yIC5sb2dpbikgc2hvdWxkIHNvbHZlIHRoaXMuCiAKICAgICAgICAgWW91IG1heSB3YW50IHRvIHRyeSB0aGUgY29uZmlndXJlIG9wdGlvbiAiLS1lbmFibGUtZnJhbWV3b3JrIgogICAgICAgICB3aGljaCBpbnN0YWxscyBQeXRob24gYXMgYSBmcmFtZXdvcmsuIFRoZSBsb2NhdGlvbiBjYW4gYmUgc2V0CkBAIC02MDIsOCArNjAyLDggQEAKIAogICAgICAgICAjU1NMPS91c3IvbG9jYWwvc3NsCiAgICAgICAgICNfc29ja2V0IHNvY2tldG1vZHVsZS5jIFwKLSAgICAgICAgIwktRFVTRV9TU0wgLUkkKFNTTCkvaW5jbHVkZSAtSSQoU1NMKS9pbmNsdWRlL29wZW5zc2wgXAotICAgICAgICAjCS1MJChTU0wpL2xpYiAtbHNzbCAtbGNyeXB0bworICAgICAgICAjICAgICAgIC1EVVNFX1NTTCAtSSQoU1NMKS9pbmNsdWRlIC1JJChTU0wpL2luY2x1ZGUvb3BlbnNzbCBcCisgICAgICAgICMgICAgICAgLUwkKFNTTCkvbGliIC1sc3NsIC1sY3J5cHRvCiAKICAgICAgICAgYW5kIHJlbW92ZSAibG9jYWwvIiBmcm9tIHRoZSBTU0wgdmFyaWFibGUuICBGaW5hbGx5LCBqdXN0IHJ1bgogICAgICAgICAibWFrZSIhCkBAIC02NDgsNjkgKzY0OCw2OSBAQAogCiBBdGhlT1M6IEZyb20gT2N0YXZpYW4gQ2VybmEgPHRhdnkgYXQgeWxhYnMuY29tPjoKIAotCUJlZm9yZSBidWlsZGluZzoKKyAgICAgICAgQmVmb3JlIGJ1aWxkaW5nOgogCi0JICAgIE1ha2Ugc3VyZSB5b3UgaGF2ZSBzaGFyZWQgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcmllcyB5b3UKLQkgICAgd2FudCB0byB1c2Ugd2l0aCBQeXRob24uIFlvdSB3aWxsIGhhdmUgdG8gY29tcGlsZSB0aGVtCi0JICAgIHlvdXJzZWxmLCBvciBkb3dubG9hZCBwcmVjb21waWxlZCBwYWNrYWdlcy4KKyAgICAgICAgICAgIE1ha2Ugc3VyZSB5b3UgaGF2ZSBzaGFyZWQgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcmllcyB5b3UKKyAgICAgICAgICAgIHdhbnQgdG8gdXNlIHdpdGggUHl0aG9uLiBZb3Ugd2lsbCBoYXZlIHRvIGNvbXBpbGUgdGhlbQorICAgICAgICAgICAgeW91cnNlbGYsIG9yIGRvd25sb2FkIHByZWNvbXBpbGVkIHBhY2thZ2VzLgogCi0JICAgIFJlY29tbWVuZGVkIGxpYnJhcmllczoKKyAgICAgICAgICAgIFJlY29tbWVuZGVkIGxpYnJhcmllczoKIAotCQluY3Vyc2VzLTQuMgotCQlyZWFkbGluZS00LjJhCi0JCXpsaWItMS4xLjQKKyAgICAgICAgICAgICAgICBuY3Vyc2VzLTQuMgorICAgICAgICAgICAgICAgIHJlYWRsaW5lLTQuMmEKKyAgICAgICAgICAgICAgICB6bGliLTEuMS40CiAKLQlCdWlsZDoKKyAgICAgICAgQnVpbGQ6CiAKLQkgICAgJCAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyL3B5dGhvbgotCSAgICAkIG1ha2UKKyAgICAgICAgICAgICQgLi9jb25maWd1cmUgLS1wcmVmaXg9L3Vzci9weXRob24KKyAgICAgICAgICAgICQgbWFrZQogCi0JICAgIFB5dGhvbiBpcyBhbHdheXMgYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeSwgb3RoZXJ3aXNlCi0JICAgIGR5bmFtaWMgbG9hZGluZyB3b3VsZCBub3Qgd29yay4KKyAgICAgICAgICAgIFB5dGhvbiBpcyBhbHdheXMgYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeSwgb3RoZXJ3aXNlCisgICAgICAgICAgICBkeW5hbWljIGxvYWRpbmcgd291bGQgbm90IHdvcmsuCiAKLQlUZXN0aW5nOgorICAgICAgICBUZXN0aW5nOgogCi0JICAgICQgbWFrZSB0ZXN0CisgICAgICAgICAgICAkIG1ha2UgdGVzdAogCi0JSW5zdGFsbDoKKyAgICAgICAgSW5zdGFsbDoKIAotCSAgICAjIG1ha2UgaW5zdGFsbAotCSAgICAjIHBrZ21hbmFnZXIgLWEgL3Vzci9weXRob24KKyAgICAgICAgICAgICMgbWFrZSBpbnN0YWxsCisgICAgICAgICAgICAjIHBrZ21hbmFnZXIgLWEgL3Vzci9weXRob24KIAogCi0JQXRoZU9TIGlzc3VlczoKKyAgICAgICAgQXRoZU9TIGlzc3VlczoKIAotCSAgICAtIGxhcmdlIGZpbGUgc3VwcG9ydDogZHVlIHRvIGEgc3RkaW8gYnVnIGluIGdsaWJjL2xpYmlvLAotCSAgICAgIGFjY2VzcyB0byBsYXJnZSBmaWxlcyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LiAgZnNlZWtvKCkKLQkgICAgICB0cmllcyB0byBzZWVrIHRvIGEgbmVnYXRpdmUgb2Zmc2V0LiAgZnRlbGxvKCkgcmV0dXJucyBhCi0JICAgICAgbmVnYXRpdmUgb2Zmc2V0LCBpdCBsb29rcyBsaWtlIGEgMzItPjY0Yml0Ci0JICAgICAgc2lnbi1leHRlbnNpb24gaXNzdWUuICBUaGUgbG93bGV2ZWwgZnVuY3Rpb25zIChvcGVuLAotCSAgICAgIGxzZWVrLCBldGMpIGFyZSBPSy4KLQkgICAgLSBzb2NrZXRzOiBBRl9VTklYIGlzIGRlZmluZWQgaW4gdGhlIEMgbGlicmFyeSBhbmQgaW4KLQkgICAgICBQeXRob24sIGJ1dCBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIHN5c3RlbS4KLQkgICAgLSBzZWxlY3Q6IHBvbGwgaXMgYXZhaWxhYmxlIGluIHRoZSBDIGxpYnJhcnksIGJ1dCBkb2VzIG5vdAotCSAgICAgIHdvcmsgKEl0IGRvZXMgbm90IHJldHVybiBQT0xMTlZBTCBmb3IgYmFkIGZkcyBhbmQKLQkgICAgICBoYW5ncykuCi0JICAgIC0gcG9zaXg6IHN0YXR2ZnMgYW5kIGZzdGF0dmZzIGFsd2F5cyByZXR1cm4gRU5PU1lTLgotCSAgICAtIGRpc2FibGVkIG1vZHVsZXM6Ci0JCS0gbW1hcDogbm90IHlldCBpbXBsZW1lbnRlZCBpbiBBdGhlT1MKLQkJLSBuaXM6IGJyb2tlbiAob24gYW4gdW5jb25maWd1cmVkIHN5c3RlbQotCQkgIHlwX2dldF9kZWZhdWx0X2RvbWFpbigpIHJldHVybnMganVuayBpbnN0ZWFkIG9mCi0JCSAgZXJyb3IpCi0JCS0gZGw6IGR5bmFtaWMgbG9hZGluZyBkb2Vzbid0IHdvcmsgdmlhIGRsb3BlbigpCi0JCS0gcmVzb3VyY2U6IGdldHJpbWl0IGFuZCBzZXRybGltaXQgYXJlIG5vdCB5ZXQKLQkJICBpbXBsZW1lbnRlZAorICAgICAgICAgICAgLSBsYXJnZSBmaWxlIHN1cHBvcnQ6IGR1ZSB0byBhIHN0ZGlvIGJ1ZyBpbiBnbGliYy9saWJpbywKKyAgICAgICAgICAgICAgYWNjZXNzIHRvIGxhcmdlIGZpbGVzIG1heSBub3Qgd29yayBjb3JyZWN0bHkuICBmc2Vla28oKQorICAgICAgICAgICAgICB0cmllcyB0byBzZWVrIHRvIGEgbmVnYXRpdmUgb2Zmc2V0LiAgZnRlbGxvKCkgcmV0dXJucyBhCisgICAgICAgICAgICAgIG5lZ2F0aXZlIG9mZnNldCwgaXQgbG9va3MgbGlrZSBhIDMyLT42NGJpdAorICAgICAgICAgICAgICBzaWduLWV4dGVuc2lvbiBpc3N1ZS4gIFRoZSBsb3dsZXZlbCBmdW5jdGlvbnMgKG9wZW4sCisgICAgICAgICAgICAgIGxzZWVrLCBldGMpIGFyZSBPSy4KKyAgICAgICAgICAgIC0gc29ja2V0czogQUZfVU5JWCBpcyBkZWZpbmVkIGluIHRoZSBDIGxpYnJhcnkgYW5kIGluCisgICAgICAgICAgICAgIFB5dGhvbiwgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgc3lzdGVtLgorICAgICAgICAgICAgLSBzZWxlY3Q6IHBvbGwgaXMgYXZhaWxhYmxlIGluIHRoZSBDIGxpYnJhcnksIGJ1dCBkb2VzIG5vdAorICAgICAgICAgICAgICB3b3JrIChJdCBkb2VzIG5vdCByZXR1cm4gUE9MTE5WQUwgZm9yIGJhZCBmZHMgYW5kCisgICAgICAgICAgICAgIGhhbmdzKS4KKyAgICAgICAgICAgIC0gcG9zaXg6IHN0YXR2ZnMgYW5kIGZzdGF0dmZzIGFsd2F5cyByZXR1cm4gRU5PU1lTLgorICAgICAgICAgICAgLSBkaXNhYmxlZCBtb2R1bGVzOgorICAgICAgICAgICAgICAgIC0gbW1hcDogbm90IHlldCBpbXBsZW1lbnRlZCBpbiBBdGhlT1MKKyAgICAgICAgICAgICAgICAtIG5pczogYnJva2VuIChvbiBhbiB1bmNvbmZpZ3VyZWQgc3lzdGVtCisgICAgICAgICAgICAgICAgICB5cF9nZXRfZGVmYXVsdF9kb21haW4oKSByZXR1cm5zIGp1bmsgaW5zdGVhZCBvZgorICAgICAgICAgICAgICAgICAgZXJyb3IpCisgICAgICAgICAgICAgICAgLSBkbDogZHluYW1pYyBsb2FkaW5nIGRvZXNuJ3Qgd29yayB2aWEgZGxvcGVuKCkKKyAgICAgICAgICAgICAgICAtIHJlc291cmNlOiBnZXRyaW1pdCBhbmQgc2V0cmxpbWl0IGFyZSBub3QgeWV0CisgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZAogCi0JICAgIC0gaWYgeW91IGFyZSBnZXR0aW5nIHNlZ21lbnRhdGlvbiBmYXVsdHMsIHlvdSBwcm9iYWJseSBhcmUKLQkgICAgICBsb3cgb24gbWVtb3J5LiAgQXRoZU9TIGRvZXNuJ3QgaGFuZGxlIHZlcnkgd2VsbCBhbgotCSAgICAgIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uIGFuZCBzaW1wbHkgU0VHVnMgdGhlIHByb2Nlc3MuCisgICAgICAgICAgICAtIGlmIHlvdSBhcmUgZ2V0dGluZyBzZWdtZW50YXRpb24gZmF1bHRzLCB5b3UgcHJvYmFibHkgYXJlCisgICAgICAgICAgICAgIGxvdyBvbiBtZW1vcnkuICBBdGhlT1MgZG9lc24ndCBoYW5kbGUgdmVyeSB3ZWxsIGFuCisgICAgICAgICAgICAgIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uIGFuZCBzaW1wbHkgU0VHVnMgdGhlIHByb2Nlc3MuCiAKLQlUZXN0ZWQgb246CisgICAgICAgIFRlc3RlZCBvbjoKIAotCSAgICBBdGhlT1MtMC4zLjcKLQkgICAgZ2NjLTIuOTUKLQkgICAgYmludXRpbHMtMi4xMAotCSAgICBtYWtlLTMuNzgKKyAgICAgICAgICAgIEF0aGVPUy0wLjMuNworICAgICAgICAgICAgZ2NjLTIuOTUKKyAgICAgICAgICAgIGJpbnV0aWxzLTIuMTAKKyAgICAgICAgICAgIG1ha2UtMy43OAogCiAKIENvbmZpZ3VyaW5nIHRoZSBic2RkYiBhbmQgZGJtIG1vZHVsZXMKQEAgLTcxOSwxNSArNzE5LDI1IEBACiBCZWdpbm5pbmcgd2l0aCBQeXRob24gdmVyc2lvbiAyLjMsIHRoZSBQeUJzZGRiIHBhY2thZ2UKIDxodHRwOi8vcHlic2RkYi5zZi5uZXQvPiB3YXMgYWRvcHRlZCBpbnRvIFB5dGhvbiBhcyB0aGUgYnNkZGIgcGFja2FnZSwKIGV4cG9zaW5nIGEgc2V0IG9mIHBhY2thZ2UtbGV2ZWwgZnVuY3Rpb25zIHdoaWNoIHByb3ZpZGUKLWJhY2t3YXJkcy1jb21wYXRpYmxlIGJlaGF2aW9yLiAgT25seSB2ZXJzaW9ucyAzLjEgdGhyb3VnaCA0LjEgb2YKK2JhY2t3YXJkcy1jb21wYXRpYmxlIGJlaGF2aW9yLiAgT25seSB2ZXJzaW9ucyAzLjMgdGhyb3VnaCA0LjQgb2YKIFNsZWVweWNhdCdzIGxpYnJhcmllcyBwcm92aWRlIHRoZSBuZWNlc3NhcnkgQVBJLCBzbyBvbGRlciB2ZXJzaW9ucwogYXJlbid0IHN1cHBvcnRlZCB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLiAgVGhlIG9sZCBic2RkYiBtb2R1bGUgaGFzCiBiZWVuIHJldGFpbmVkIGFzIGJzZGRiMTg1LCB0aG91Z2ggaXQgaXMgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuICBVc2Vycwogd2lzaGluZyB0byB1c2UgaXQgd2lsbCBoYXZlIHRvIHR3ZWFrIE1vZHVsZXMvU2V0dXAgdG8gYnVpbGQgaXQuICBUaGUKIGRibSBtb2R1bGUgd2lsbCBzdGlsbCBiZSBidWlsdCBhZ2FpbnN0IHRoZSBTbGVlcHljYXQgbGlicmFyaWVzIGlmCi1vdGhlciBwcmVmZXJyZWQgYWx0ZXJuYXRpdmVzIChuZGJtLCBnZGJtKSBhcmUgbm90IGZvdW5kLCB0aG91Z2gKLXZlcnNpb25zIG9mIHRoZSBTbGVlcHljYXQgbGlicmFyeSBwcmlvciB0byAzLjEgYXJlIG5vdCBjb25zaWRlcmVkLgorb3RoZXIgcHJlZmVycmVkIGFsdGVybmF0aXZlcyAobmRibSwgZ2RibSkgYXJlIG5vdCBmb3VuZC4KIAorQnVpbGRpbmcgdGhlIHNxbGl0ZTMgbW9kdWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gYnVpbGQgdGhlIHNxbGl0ZTMgbW9kdWxlLCB5b3UnbGwgbmVlZCB0aGUgc3FsaXRlMyBvciBsaWJzcWxpdGUzCitwYWNrYWdlcyBpbnN0YWxsZWQsIGluY2x1ZGluZyB0aGUgaGVhZGVyIGZpbGVzLiBNYW55IG1vZGVybiBvcGVyYXRpbmcKK3N5c3RlbXMgZGlzdHJpYnV0ZSB0aGUgaGVhZGVycyBpbiBhIHNlcGFyYXRlIHBhY2thZ2UgdG8gdGhlIGxpYnJhcnkgLQorb2Z0ZW4gaXQgd2lsbCBiZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBtYWluIHBhY2thZ2UsIGJ1dCB3aXRoIGEgLWRldiBvcgorLWRldmVsIHN1ZmZpeC4gCisKK1RoZSB2ZXJzaW9uIG9mIHB5c3FsaXRlMiB0aGF0J3MgaW5jbHVkaW5nIGluIFB5dGhvbiBuZWVkcyBzcWxpdGUzIDMuMC44CitvciBsYXRlci4gc2V0dXAucHkgYXR0ZW1wdHMgdG8gY2hlY2sgdGhhdCBpdCBjYW4gZmluZCBhIGNvcnJlY3QgdmVyc2lvbi4KIAogQ29uZmlndXJpbmcgdGhyZWFkcwogLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzU3LDE3ICs3NjcsMTcgQEAKICAgICBTdW5PUyA1LnsxLTV9L3tnY2MsU3VuUHJvIGNjfS9zb2xhcmlzICAgLW10CiAgICAgU3VuT1MgNS41L3tnY2MsU3VuUHJvIGNjfS9QT1NJWCAgICAgICAgIChub3RoaW5nKQogICAgIERFQyBPU0YvMSAzLngvY2MvRENFICAgICAgICAgICAgICAgICAgICAtdGhyZWFkcwotCSAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCisgICAgICAgICAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCiAgICAgRGlnaXRhbCBVTklYIDQueC9jYy9EQ0UgICAgICAgICAgICAgICAgIC10aHJlYWRzCi0JICAgIChidXRlbmhvZkB6a28uZGVjLmNvbSkKKyAgICAgICAgICAgIChidXRlbmhvZkB6a28uZGVjLmNvbSkKICAgICBEaWdpdGFsIFVOSVggNC54L2NjL1BPU0lYICAgICAgICAgICAgICAgLXB0aHJlYWQKLQkgICAgKGJ1dGVuaG9mQHprby5kZWMuY29tKQorICAgICAgICAgICAgKGJ1dGVuaG9mQHprby5kZWMuY29tKQogICAgIEFJWCA0LjEuNC9jY19yL2Q3ICAgICAgICAgICAgICAgICAgICAgICAobm90aGluZykKLQkgICAgKGJ1aHJ0QGlxdWVzdC5uZXQpCisgICAgICAgICAgICAoYnVocnRAaXF1ZXN0Lm5ldCkKICAgICBBSVggNC4xLjQvY2NfcjQvRENFICAgICAgICAgICAgICAgICAgICAgKG5vdGhpbmcpCi0JICAgIChidWhydEBpcXVlc3QubmV0KQorICAgICAgICAgICAgKGJ1aHJ0QGlxdWVzdC5uZXQpCiAgICAgSVJJWCA2LjIvY2MvUE9TSVggICAgICAgICAgICAgICAgICAgICAgIChub3RoaW5nKQotCSAgICAocm9iZXJ0bEBjd2kubmwpCisgICAgICAgICAgICAocm9iZXJ0bEBjd2kubmwpCiAKIAogTGlua2VyIChsZCkgbGlicmFyaWVzIGFuZCBmbGFncyBmb3IgdGhyZWFkcwpAQCAtNzc4LDE1ICs3ODgsMTUgQEAKICAgICBTdW5PUyA1LnsxLTV9L3NvbGFyaXMgICAgICAgICAgICAgICAtbHRocmVhZAogICAgIFN1bk9TIDUuNS9QT1NJWCAgICAgICAgICAgICAgICAgICAgIC1scHRocmVhZAogICAgIERFQyBPU0YvMSAzLngvRENFICAgICAgICAgICAgICAgICAgIC1scHRocmVhZHMgLWxtYWNoIC1sY19yIC1sYwotCSAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCisgICAgICAgICAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCiAgICAgRGlnaXRhbCBVTklYIDQueC9EQ0UgICAgICAgICAgICAgICAgLWxwdGhyZWFkcyAtbHB0aHJlYWQgLWxtYWNoIC1sZXhjIC1sYwotCSAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCisgICAgICAgICAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCiAgICAgRGlnaXRhbCBVTklYIDQueC9QT1NJWCAgICAgICAgICAgICAgLWxwdGhyZWFkIC1sbWFjaCAtbGV4YyAtbGMKLQkgICAgKGJ1dGVuaG9mQHprby5kZWMuY29tKQorICAgICAgICAgICAgKGJ1dGVuaG9mQHprby5kZWMuY29tKQogICAgIEFJWCA0LjEuNC97ZHJhZnQ3LERDRX0gICAgICAgICAgICAgIChub3RoaW5nKQotCSAgICAoYnVocnRAaXF1ZXN0Lm5ldCkKKyAgICAgICAgICAgIChidWhydEBpcXVlc3QubmV0KQogICAgIElSSVggNi4yL1BPU0lYICAgICAgICAgICAgICAgICAgICAgIC1scHRocmVhZAotCSAgICAoanBoQGVtaWxpYS5lbmdyLnNnaS5jb20pCisgICAgICAgICAgICAoanBoQGVtaWxpYS5lbmdyLnNnaS5jb20pCiAKIAogQnVpbGRpbmcgYSBzaGFyZWQgbGlicHl0aG9uCkBAIC04OTYsNyArOTA2LDcgQEAKICpkb24ndCogaW5jbHVkZSB0aGUgb3V0cHV0IG9mICJtYWtlIHRlc3QiLiAgSXQgaXMgdXNlbGVzcy4gIFJ1biB0aGUKIGZhaWxpbmcgdGVzdCBtYW51YWxseSwgYXMgZm9sbG93czoKIAotCS4vcHl0aG9uIC4vTGliL3Rlc3QvdGVzdF93aGF0ZXZlci5weQorICAgICAgICAuL3B5dGhvbiAuL0xpYi90ZXN0L3Rlc3Rfd2hhdGV2ZXIucHkKIAogKHN1YnN0aXR1dGluZyB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSBmb3IgJy4nIGlmIHlvdSBidWlsdCBpbiBhCiBkaWZmZXJlbnQgZGlyZWN0b3J5KS4gIFRoaXMgcnVucyB0aGUgdGVzdCBpbiB2ZXJib3NlIG1vZGUuCkBAIC05MDksNyArOTE5LDcgQEAKIChzZWUgYmVsb3cpLCBpbmNsdWRlIGZpbGVzLCBjb25maWd1cmF0aW9uIGZpbGVzLCBhbmQgdGhlIG1hbnVhbCBwYWdlLAoganVzdCB0eXBlCiAKLQltYWtlIGluc3RhbGwKKyAgICAgICAgbWFrZSBpbnN0YWxsCiAKIFRoaXMgd2lsbCBpbnN0YWxsIGFsbCBwbGF0Zm9ybS1pbmRlcGVuZGVudCBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcyBvZgogdGhlIGRpcmVjdG9yeSBnaXZlbiB3aXRoIHRoZSAtLXByZWZpeCBvcHRpb24gdG8gY29uZmlndXJlIG9yIHRvIHRoZQpAQCAtOTM0LDcgKzk0NCw3IEBACiBJZiB5b3UgaGF2ZSBhIHByZXZpb3VzIGluc3RhbGxhdGlvbiBvZiBQeXRob24gdGhhdCB5b3UgZG9uJ3QKIHdhbnQgdG8gcmVwbGFjZSB5ZXQsIHVzZQogCi0JbWFrZSBhbHRpbnN0YWxsCisgICAgICAgIG1ha2UgYWx0aW5zdGFsbAogCiBUaGlzIGluc3RhbGxzIHRoZSBzYW1lIHNldCBvZiBmaWxlcyBhcyAibWFrZSBpbnN0YWxsIiBleGNlcHQgaXQKIGRvZXNuJ3QgY3JlYXRlIHRoZSBoYXJkIGxpbmsgdG8gInB5dGhvbjx2ZXJzaW9uPiIgbmFtZWQgInB5dGhvbiIgYW5kCkBAIC05NjMsMTA0ICs5NzMsMTI0IEBACiBNb2R1bGVzL2dldHBhdGguby4KIAogLS13aXRoKG91dCktZ2NjOiBUaGUgY29uZmlndXJlIHNjcmlwdCB1c2VzIGdjYyAodGhlIEdOVSBDIGNvbXBpbGVyKSBpZgotCWl0IGZpbmRzIGl0LiAgSWYgeW91IGRvbid0IHdhbnQgdGhpcywgb3IgaWYgdGhpcyBjb21waWxlciBpcwotCWluc3RhbGxlZCBidXQgYnJva2VuIG9uIHlvdXIgcGxhdGZvcm0sIHBhc3MgdGhlIG9wdGlvbgotCS0td2l0aG91dC1nY2MuICBZb3UgY2FuIGFsc28gcGFzcyAiQ0M9Y2MiIChvciB3aGF0ZXZlciB0aGUKLQluYW1lIG9mIHRoZSBwcm9wZXIgQyBjb21waWxlciBpcykgaW4gdGhlIGVudmlyb25tZW50LCBidXQgdGhlCi0JYWR2YW50YWdlIG9mIHVzaW5nIC0td2l0aG91dC1nY2MgaXMgdGhhdCB0aGlzIG9wdGlvbiBpcwotCXJlbWVtYmVyZWQgYnkgdGhlIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGZvciBpdHMgLS1yZWNoZWNrCi0Jb3B0aW9uLgorICAgICAgICBpdCBmaW5kcyBpdC4gIElmIHlvdSBkb24ndCB3YW50IHRoaXMsIG9yIGlmIHRoaXMgY29tcGlsZXIgaXMKKyAgICAgICAgaW5zdGFsbGVkIGJ1dCBicm9rZW4gb24geW91ciBwbGF0Zm9ybSwgcGFzcyB0aGUgb3B0aW9uCisgICAgICAgIC0td2l0aG91dC1nY2MuICBZb3UgY2FuIGFsc28gcGFzcyAiQ0M9Y2MiIChvciB3aGF0ZXZlciB0aGUKKyAgICAgICAgbmFtZSBvZiB0aGUgcHJvcGVyIEMgY29tcGlsZXIgaXMpIGluIHRoZSBlbnZpcm9ubWVudCwgYnV0IHRoZQorICAgICAgICBhZHZhbnRhZ2Ugb2YgdXNpbmcgLS13aXRob3V0LWdjYyBpcyB0aGF0IHRoaXMgb3B0aW9uIGlzCisgICAgICAgIHJlbWVtYmVyZWQgYnkgdGhlIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGZvciBpdHMgLS1yZWNoZWNrCisgICAgICAgIG9wdGlvbi4KIAogLS1wcmVmaXgsIC0tZXhlYy1wcmVmaXg6IElmIHlvdSB3YW50IHRvIGluc3RhbGwgdGhlIGJpbmFyaWVzIGFuZCB0aGUKLQlQeXRob24gbGlicmFyeSBzb21ld2hlcmUgZWxzZSB0aGFuIGluIC91c3IvbG9jYWwve2JpbixsaWJ9LAotCXlvdSBjYW4gcGFzcyB0aGUgb3B0aW9uIC0tcHJlZml4PURJUkVDVE9SWTsgdGhlIGludGVycHJldGVyCi0JYmluYXJ5IHdpbGwgYmUgaW5zdGFsbGVkIGFzIERJUkVDVE9SWS9iaW4vcHl0aG9uIGFuZCB0aGUKLQlsaWJyYXJ5IGZpbGVzIGFzIERJUkVDVE9SWS9saWIvcHl0aG9uLyouICBJZiB5b3UgcGFzcwotCS0tZXhlYy1wcmVmaXg9RElSRUNUT1JZIChhcyB3ZWxsKSB0aGlzIG92ZXJyaWRlcyB0aGUKLQlpbnN0YWxsYXRpb24gcHJlZml4IGZvciBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIChsaWtlIHRoZQotCWludGVycHJldGVyIGJpbmFyeSkuICBOb3RlIHRoYXQgLS1wcmVmaXg9RElSRUNUT1JZIGFsc28KLQlhZmZlY3RzIHRoZSBkZWZhdWx0IG1vZHVsZSBzZWFyY2ggcGF0aCAoc3lzLnBhdGgpLCB3aGVuCi0JTW9kdWxlcy9jb25maWcuYyBpcyBjb21waWxlZC4gIFBhc3NpbmcgbWFrZSB0aGUgb3B0aW9uCi0JcHJlZml4PURJUkVDVE9SWSAoYW5kL29yIGV4ZWNfcHJlZml4PURJUkVDVE9SWSkgb3ZlcnJpZGVzIHRoZQotCXByZWZpeCBzZXQgYXQgY29uZmlndXJhdGlvbiB0aW1lOyB0aGlzIG1heSBiZSBtb3JlIGNvbnZlbmllbnQKLQl0aGFuIHJlLXJ1bm5pbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaWYgeW91IGNoYW5nZSB5b3VyIG1pbmQKLQlhYm91dCB0aGUgaW5zdGFsbCBwcmVmaXguCisgICAgICAgIFB5dGhvbiBsaWJyYXJ5IHNvbWV3aGVyZSBlbHNlIHRoYW4gaW4gL3Vzci9sb2NhbC97YmluLGxpYn0sCisgICAgICAgIHlvdSBjYW4gcGFzcyB0aGUgb3B0aW9uIC0tcHJlZml4PURJUkVDVE9SWTsgdGhlIGludGVycHJldGVyCisgICAgICAgIGJpbmFyeSB3aWxsIGJlIGluc3RhbGxlZCBhcyBESVJFQ1RPUlkvYmluL3B5dGhvbiBhbmQgdGhlCisgICAgICAgIGxpYnJhcnkgZmlsZXMgYXMgRElSRUNUT1JZL2xpYi9weXRob24vKi4gIElmIHlvdSBwYXNzCisgICAgICAgIC0tZXhlYy1wcmVmaXg9RElSRUNUT1JZIChhcyB3ZWxsKSB0aGlzIG92ZXJyaWRlcyB0aGUKKyAgICAgICAgaW5zdGFsbGF0aW9uIHByZWZpeCBmb3IgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyAobGlrZSB0aGUKKyAgICAgICAgaW50ZXJwcmV0ZXIgYmluYXJ5KS4gIE5vdGUgdGhhdCAtLXByZWZpeD1ESVJFQ1RPUlkgYWxzbworICAgICAgICBhZmZlY3RzIHRoZSBkZWZhdWx0IG1vZHVsZSBzZWFyY2ggcGF0aCAoc3lzLnBhdGgpLCB3aGVuCisgICAgICAgIE1vZHVsZXMvY29uZmlnLmMgaXMgY29tcGlsZWQuICBQYXNzaW5nIG1ha2UgdGhlIG9wdGlvbgorICAgICAgICBwcmVmaXg9RElSRUNUT1JZIChhbmQvb3IgZXhlY19wcmVmaXg9RElSRUNUT1JZKSBvdmVycmlkZXMgdGhlCisgICAgICAgIHByZWZpeCBzZXQgYXQgY29uZmlndXJhdGlvbiB0aW1lOyB0aGlzIG1heSBiZSBtb3JlIGNvbnZlbmllbnQKKyAgICAgICAgdGhhbiByZS1ydW5uaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0IGlmIHlvdSBjaGFuZ2UgeW91ciBtaW5kCisgICAgICAgIGFib3V0IHRoZSBpbnN0YWxsIHByZWZpeC4KIAogLS13aXRoLXJlYWRsaW5lOiBUaGlzIG9wdGlvbiBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAgR05VCi0JcmVhZGxpbmUgaXMgYXV0b21hdGljYWxseSBlbmFibGVkIGJ5IHNldHVwLnB5IHdoZW4gcHJlc2VudC4KKyAgICAgICAgcmVhZGxpbmUgaXMgYXV0b21hdGljYWxseSBlbmFibGVkIGJ5IHNldHVwLnB5IHdoZW4gcHJlc2VudC4KIAogLS13aXRoLXRocmVhZHM6IE9uIG1vc3QgVW5peCBzeXN0ZW1zLCB5b3UgY2FuIG5vdyB1c2UgbXVsdGlwbGUKLQl0aHJlYWRzLCBhbmQgc3VwcG9ydCBmb3IgdGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuICBUbwotCWRpc2FibGUgdGhpcywgcGFzcyAtLXdpdGgtdGhyZWFkcz1uby4gIElmIHRoZSBsaWJyYXJ5IHJlcXVpcmVkCi0JZm9yIHRocmVhZHMgbGl2ZXMgaW4gYSBwZWN1bGlhciBwbGFjZSwgeW91IGNhbiB1c2UKLQktLXdpdGgtdGhyZWFkPURJUkVDVE9SWS4gIElNUE9SVEFOVDogcnVuICJtYWtlIGNsZWFuIiBhZnRlcgotCWNoYW5naW5nIChlaXRoZXIgZW5hYmxpbmcgb3IgZGlzYWJsaW5nKSB0aGlzIG9wdGlvbiwgb3IgeW91Ci0Jd2lsbCBnZXQgbGluayBlcnJvcnMhICBOb3RlOiBmb3IgREVDIFVuaXggdXNlCi0JLS13aXRoLWRlYy10aHJlYWRzIGluc3RlYWQuCisgICAgICAgIHRocmVhZHMsIGFuZCBzdXBwb3J0IGZvciB0aGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gIFRvCisgICAgICAgIGRpc2FibGUgdGhpcywgcGFzcyAtLXdpdGgtdGhyZWFkcz1uby4gIElmIHRoZSBsaWJyYXJ5IHJlcXVpcmVkCisgICAgICAgIGZvciB0aHJlYWRzIGxpdmVzIGluIGEgcGVjdWxpYXIgcGxhY2UsIHlvdSBjYW4gdXNlCisgICAgICAgIC0td2l0aC10aHJlYWQ9RElSRUNUT1JZLiAgSU1QT1JUQU5UOiBydW4gIm1ha2UgY2xlYW4iIGFmdGVyCisgICAgICAgIGNoYW5naW5nIChlaXRoZXIgZW5hYmxpbmcgb3IgZGlzYWJsaW5nKSB0aGlzIG9wdGlvbiwgb3IgeW91CisgICAgICAgIHdpbGwgZ2V0IGxpbmsgZXJyb3JzISAgTm90ZTogZm9yIERFQyBVbml4IHVzZQorICAgICAgICAtLXdpdGgtZGVjLXRocmVhZHMgaW5zdGVhZC4KIAogLS13aXRoLXNnaS1kbDogT24gU0dJIElSSVggNCwgZHluYW1pYyBsb2FkaW5nIG9mIGV4dGVuc2lvbiBtb2R1bGVzIGlzCi0Jc3VwcG9ydGVkIGJ5IHRoZSAiZGwiIGxpYnJhcnkgYnkgSmFjayBKYW5zZW4sIHdoaWNoIGlzCi0JZnRwJ2FibGUgZnJvbSBmdHA6Ly9mdHAuY3dpLm5sL3B1Yi9keW5sb2FkL2RsLTEuNi50YXIuWi4KLQlUaGlzIGlzIGVuYWJsZWQgKGFmdGVyIHlvdSd2ZSBmdHAnZWQgYW5kIGNvbXBpbGVkIHRoZSBkbAotCWxpYnJhcnkpIGJ5IHBhc3NpbmcgLS13aXRoLXNnaS1kbD1ESVJFQ1RPUlkgd2hlcmUgRElSRUNUT1JZCi0JaXMgdGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBkbCBsaWJyYXJ5LiAgKERvbid0IGJvdGhlciBvbgotCUlSSVggNSwgaXQgYWxyZWFkeSBoYXMgZHluYW1pYyBsaW5raW5nIHVzaW5nIFN1bk9TIHN0eWxlCi0Jc2hhcmVkIGxpYnJhcmllcy4pICBUSElTIE9QVElPTiBJUyBVTlNVUFBPUlRFRC4KKyAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSAiZGwiIGxpYnJhcnkgYnkgSmFjayBKYW5zZW4sIHdoaWNoIGlzCisgICAgICAgIGZ0cCdhYmxlIGZyb20gZnRwOi8vZnRwLmN3aS5ubC9wdWIvZHlubG9hZC9kbC0xLjYudGFyLlouCisgICAgICAgIFRoaXMgaXMgZW5hYmxlZCAoYWZ0ZXIgeW91J3ZlIGZ0cCdlZCBhbmQgY29tcGlsZWQgdGhlIGRsCisgICAgICAgIGxpYnJhcnkpIGJ5IHBhc3NpbmcgLS13aXRoLXNnaS1kbD1ESVJFQ1RPUlkgd2hlcmUgRElSRUNUT1JZCisgICAgICAgIGlzIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUgZGwgbGlicmFyeS4gIChEb24ndCBib3RoZXIgb24KKyAgICAgICAgSVJJWCA1LCBpdCBhbHJlYWR5IGhhcyBkeW5hbWljIGxpbmtpbmcgdXNpbmcgU3VuT1Mgc3R5bGUKKyAgICAgICAgc2hhcmVkIGxpYnJhcmllcy4pICBUSElTIE9QVElPTiBJUyBVTlNVUFBPUlRFRC4KIAogLS13aXRoLWRsLWRsZDogRHluYW1pYyBsb2FkaW5nIG9mIG1vZHVsZXMgaXMgcnVtb3JlZCB0byBiZSBzdXBwb3J0ZWQKLQlvbiBzb21lIG90aGVyIHN5c3RlbXM6IFZBWCAoVWx0cml4KSwgU3VuMyAoU3VuT1MgMy40KSwgU2VxdWVudAotCVN5bW1ldHJ5IChEeW5peCksIGFuZCBBdGFyaSBTVC4gIFRoaXMgaXMgZG9uZSB1c2luZyBhCi0JY29tYmluYXRpb24gb2YgdGhlIEdOVSBkeW5hbWljIGxvYWRpbmcgcGFja2FnZQotCShmdHA6Ly9mdHAuY3dpLm5sL3B1Yi9keW5sb2FkL2RsLWRsZC0xLjEudGFyLlopIGFuZCBhbgotCWVtdWxhdGlvbiBvZiB0aGUgU0dJIGRsIGxpYnJhcnkgbWVudGlvbmVkIGFib3ZlICh0aGUgZW11bGF0aW9uCi0JY2FuIGJlIGZvdW5kIGF0Ci0JZnRwOi8vZnRwLmN3aS5ubC9wdWIvZHlubG9hZC9kbGQtMy4yLjMudGFyLlopLiAgVG8KLQllbmFibGUgdGhpcywgZnRwIGFuZCBjb21waWxlIGJvdGggbGlicmFyaWVzLCB0aGVuIGNhbGwKLQljb25maWd1cmUsIHBhc3NpbmcgaXQgdGhlIG9wdGlvbgotCS0td2l0aC1kbC1kbGQ9RExfRElSRUNUT1JZLERMRF9ESVJFQ1RPUlkgd2hlcmUgRExfRElSRUNUT1JZIGlzCi0JdGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBkbCBlbXVsYXRpb24gbGlicmFyeSBhbmQKLQlETERfRElSRUNUT1JZIGlzIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUgR05VIGRsZCBsaWJyYXJ5LgotCShEb24ndCBib3RoZXIgb24gU3VuT1MgNCBvciA1LCB0aGV5IGFscmVhZHkgaGF2ZSBkeW5hbWljCi0JbGlua2luZyB1c2luZyBzaGFyZWQgbGlicmFyaWVzLikgIFRISVMgT1BUSU9OIElTIFVOU1VQUE9SVEVELgorICAgICAgICBvbiBzb21lIG90aGVyIHN5c3RlbXM6IFZBWCAoVWx0cml4KSwgU3VuMyAoU3VuT1MgMy40KSwgU2VxdWVudAorICAgICAgICBTeW1tZXRyeSAoRHluaXgpLCBhbmQgQXRhcmkgU1QuICBUaGlzIGlzIGRvbmUgdXNpbmcgYQorICAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgR05VIGR5bmFtaWMgbG9hZGluZyBwYWNrYWdlCisgICAgICAgIChmdHA6Ly9mdHAuY3dpLm5sL3B1Yi9keW5sb2FkL2RsLWRsZC0xLjEudGFyLlopIGFuZCBhbgorICAgICAgICBlbXVsYXRpb24gb2YgdGhlIFNHSSBkbCBsaWJyYXJ5IG1lbnRpb25lZCBhYm92ZSAodGhlIGVtdWxhdGlvbgorICAgICAgICBjYW4gYmUgZm91bmQgYXQKKyAgICAgICAgZnRwOi8vZnRwLmN3aS5ubC9wdWIvZHlubG9hZC9kbGQtMy4yLjMudGFyLlopLiAgVG8KKyAgICAgICAgZW5hYmxlIHRoaXMsIGZ0cCBhbmQgY29tcGlsZSBib3RoIGxpYnJhcmllcywgdGhlbiBjYWxsCisgICAgICAgIGNvbmZpZ3VyZSwgcGFzc2luZyBpdCB0aGUgb3B0aW9uCisgICAgICAgIC0td2l0aC1kbC1kbGQ9RExfRElSRUNUT1JZLERMRF9ESVJFQ1RPUlkgd2hlcmUgRExfRElSRUNUT1JZIGlzCisgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUgZGwgZW11bGF0aW9uIGxpYnJhcnkgYW5kCisgICAgICAgIERMRF9ESVJFQ1RPUlkgaXMgdGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBHTlUgZGxkIGxpYnJhcnkuCisgICAgICAgIChEb24ndCBib3RoZXIgb24gU3VuT1MgNCBvciA1LCB0aGV5IGFscmVhZHkgaGF2ZSBkeW5hbWljCisgICAgICAgIGxpbmtpbmcgdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4pICBUSElTIE9QVElPTiBJUyBVTlNVUFBPUlRFRC4KIAogLS13aXRoLWxpYm0sIC0td2l0aC1saWJjOiBJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGFsdGVybmF0aXZlCi0JdmVyc2lvbnMgZm9yIHRoZSBNYXRoIGxpYnJhcnkgKGRlZmF1bHQgLWxtKSBhbmQgdGhlIEMgbGlicmFyeQotCShkZWZhdWx0IHRoZSBlbXB0eSBzdHJpbmcpIHVzaW5nIHRoZSBvcHRpb25zCi0JLS13aXRoLWxpYm09U1RSSU5HIGFuZCAtLXdpdGgtbGliYz1TVFJJTkcsIHJlc3BlY3RpdmVseS4gIEZvcgotCWV4YW1wbGUsIGlmIHlvdXIgc3lzdGVtIHJlcXVpcmVzIHRoYXQgeW91IHBhc3MgLWxjX3MgdG8gdGhlIEMKLQljb21waWxlciB0byB1c2UgdGhlIHNoYXJlZCBDIGxpYnJhcnksIHlvdSBjYW4gcGFzcwotCS0td2l0aC1saWJjPS1sY19zLiBUaGVzZSBsaWJyYXJpZXMgYXJlIHBhc3NlZCBhZnRlciBhbGwgb3RoZXIKLQlsaWJyYXJpZXMsIHRoZSBDIGxpYnJhcnkgbGFzdC4KKyAgICAgICAgdmVyc2lvbnMgZm9yIHRoZSBNYXRoIGxpYnJhcnkgKGRlZmF1bHQgLWxtKSBhbmQgdGhlIEMgbGlicmFyeQorICAgICAgICAoZGVmYXVsdCB0aGUgZW1wdHkgc3RyaW5nKSB1c2luZyB0aGUgb3B0aW9ucworICAgICAgICAtLXdpdGgtbGlibT1TVFJJTkcgYW5kIC0td2l0aC1saWJjPVNUUklORywgcmVzcGVjdGl2ZWx5LiAgRm9yCisgICAgICAgIGV4YW1wbGUsIGlmIHlvdXIgc3lzdGVtIHJlcXVpcmVzIHRoYXQgeW91IHBhc3MgLWxjX3MgdG8gdGhlIEMKKyAgICAgICAgY29tcGlsZXIgdG8gdXNlIHRoZSBzaGFyZWQgQyBsaWJyYXJ5LCB5b3UgY2FuIHBhc3MKKyAgICAgICAgLS13aXRoLWxpYmM9LWxjX3MuIFRoZXNlIGxpYnJhcmllcyBhcmUgcGFzc2VkIGFmdGVyIGFsbCBvdGhlcgorICAgICAgICBsaWJyYXJpZXMsIHRoZSBDIGxpYnJhcnkgbGFzdC4KIAogLS13aXRoLWxpYnM9J2xpYnMnOiBBZGQgJ2xpYnMnIHRvIHRoZSBMSUJTIHRoYXQgdGhlIHB5dGhvbiBpbnRlcnByZXRlcgotCWlzIGxpbmtlZCBhZ2FpbnN0LgorICAgICAgICBpcyBsaW5rZWQgYWdhaW5zdC4KIAotLS13aXRoLWN4eD08Y29tcGlsZXI+OiBTb21lIEMrKyBjb21waWxlcnMgcmVxdWlyZSB0aGF0IG1haW4oKSBpcwotICAgICAgICBjb21waWxlZCB3aXRoIHRoZSBDKysgaWYgdGhlcmUgaXMgYW55IEMrKyBjb2RlIGluIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgU3BlY2lmaWNhbGx5LCBnKysgb24gYS5vdXQgc3lzdGVtcyBtYXkgcmVxdWlyZSB0aGF0IHRvIHN1cHBvcnQKLSAgICAgICAgY29uc3RydWN0aW9uIG9mIGdsb2JhbCBvYmplY3RzLiBXaXRoIHRoaXMgb3B0aW9uLCB0aGUgbWFpbigpIGZ1bmN0aW9uCi0gICAgICAgIG9mIFB5dGhvbiB3aWxsIGJlIGNvbXBpbGVkIHdpdGggPGNvbXBpbGVyPjsgdXNlIHRoYXQgb25seSBpZiB5b3UKLSAgICAgICAgcGxhbiB0byB1c2UgQysrIGV4dGVuc2lvbiBtb2R1bGVzLCBhbmQgaWYgeW91ciBjb21waWxlciByZXF1aXJlcwotICAgICAgICBjb21waWxhdGlvbiBvZiBtYWluKCkgYXMgYSBDKysgcHJvZ3JhbS4KKy0td2l0aC1jeHgtbWFpbj08Y29tcGlsZXI+OiBJZiB5b3UgcGxhbiB0byB1c2UgQysrIGV4dGVuc2lvbiBtb2R1bGVzLAorICAgICAgICB0aGVuIC0tIG9uIHNvbWUgcGxhdGZvcm1zIC0tIHlvdSBuZWVkIHRvIGNvbXBpbGUgcHl0aG9uJ3MgbWFpbigpCisgICAgICAgIGZ1bmN0aW9uIHdpdGggdGhlIEMrKyBjb21waWxlci4gV2l0aCB0aGlzIG9wdGlvbiwgbWFrZSB3aWxsIHVzZQorICAgICAgICA8Y29tcGlsZXI+IHRvIGNvbXBpbGUgbWFpbigpICphbmQqIHRvIGxpbmsgdGhlIHB5dGhvbiBleGVjdXRhYmxlLgorICAgICAgICBJdCBpcyBsaWtlbHkgdGhhdCB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgZGVwZW5kcyBvbiB0aGUgQysrCisgICAgICAgIHJ1bnRpbWUgbGlicmFyeSBvZiA8Y29tcGlsZXI+LiAoVGhlIGRlZmF1bHQgaXMgLS13aXRob3V0LWN4eC1tYWluLikKKworICAgICAgICBUaGVyZSBhcmUgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHJlcXVpcmUgeW91IHRvIGJ1aWxkIFB5dGhvbgorICAgICAgICB3aXRoIGEgQysrIGNvbXBpbGVyIGluIG9yZGVyIHRvIHVzZSBDKysgZXh0ZW5zaW9uIG1vZHVsZXMuCisgICAgICAgIEUuZy4sIHg4NiBMaW51eCB3aXRoIEVMRiBzaGFyZWQgYmluYXJpZXMgYW5kIEdDQyAzLngsIDQueCBpcyBzdWNoCisgICAgICAgIGEgcGxhdGZvcm0uIFdlIHJlY29tbWVuZCB0aGF0IHlvdSBjb25maWd1cmUgUHl0aG9uCisgICAgICAgIC0td2l0aG91dC1jeHgtbWFpbiBvbiB0aG9zZSBwbGF0Zm9ybXMgYmVjYXVzZSBhIG1pc21hdGNoCisgICAgICAgIGJldHdlZW4gdGhlIEMrKyBjb21waWxlciB2ZXJzaW9uIHVzZWQgdG8gYnVpbGQgUHl0aG9uIGFuZCB0bworICAgICAgICBidWlsZCBhIEMrKyBleHRlbnNpb24gbW9kdWxlIGlzIGxpa2VseSB0byBjYXVzZSBhIGNyYXNoIGF0CisgICAgICAgIHJ1bnRpbWUuCisKKyAgICAgICAgVGhlIFB5dGhvbiBpbnN0YWxsYXRpb24gYWxzbyBzdG9yZXMgdGhlIHZhcmlhYmxlIENYWCB0aGF0CisgICAgICAgIGRldGVybWluZXMsIGUuZy4sIHRoZSBDKysgY29tcGlsZXIgZGlzdHV0aWxzIGNhbGxzIGJ5IGRlZmF1bHQKKyAgICAgICAgdG8gYnVpbGQgQysrIGV4dGVuc2lvbnMuIElmIHlvdSBzZXQgQ1hYIG9uIHRoZSBjb25maWd1cmUgY29tbWFuZAorICAgICAgICBsaW5lIHRvIGFueSBzdHJpbmcgb2Ygbm9uLXplcm8gbGVuZ3RoLCB0aGVuIGNvbmZpZ3VyZSB3b24ndAorICAgICAgICBjaGFuZ2UgQ1hYLiBJZiB5b3UgZG8gbm90IHByZXNldCBDWFggYnV0IHBhc3MKKyAgICAgICAgLS13aXRoLWN4eC1tYWluPTxjb21waWxlcj4sIHRoZW4gY29uZmlndXJlIHNldHMgQ1hYPTxjb21waWxlcj4uCisgICAgICAgIEluIGFsbCBvdGhlciBjYXNlcywgY29uZmlndXJlIGxvb2tzIGZvciBhIEMrKyBjb21waWxlciBieQorICAgICAgICBzb21lIGNvbW1vbiBuYW1lcyAoYysrLCBnKyssIGdjYywgQ0MsIGN4eCwgY2MrKywgY2wpIGFuZCBzZXRzCisgICAgICAgIENYWCB0byB0aGUgZmlyc3QgY29tcGlsZXIgaXQgZmluZHMuIElmIGl0IGRvZXMgbm90IGZpbmQgYW55CisgICAgICAgIEMrKyBjb21waWxlciwgdGhlbiBpdCBzZXRzIENYWD0iIi4KKworICAgICAgICBTaW1pbGFybHksIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgY29tbWFuZCB1c2VkIHRvIGxpbmsgdGhlCisgICAgICAgIHB5dGhvbiBleGVjdXRhYmxlLCB0aGVuIHNldCBMSU5LQ0Mgb24gdGhlIGNvbmZpZ3VyZSBjb21tYW5kIGxpbmUuCiAKIAogLS13aXRoLXB5ZGVidWc6ICBFbmFibGUgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgY29kZSB0byBoZWxwIHRyYWNrIGRvd24KLQltZW1vcnkgbWFuYWdlbWVudCBwcm9ibGVtcy4gIFRoaXMgYWxsb3dzIHByaW50aW5nIGEgbGlzdCBvZiBhbGwKLQlsaXZlIG9iamVjdHMgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgdGVybWluYXRlcy4KKyAgICAgICAgbWVtb3J5IG1hbmFnZW1lbnQgcHJvYmxlbXMuICBUaGlzIGFsbG93cyBwcmludGluZyBhIGxpc3Qgb2YgYWxsCisgICAgICAgIGxpdmUgb2JqZWN0cyB3aGVuIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzLgogCiAtLXdpdGgob3V0KS11bml2ZXJzYWwtbmV3bGluZXM6IGVuYWJsZSByZWFkaW5nIG9mIHRleHQgZmlsZXMgd2l0aAotCWZvcmVpZ24gbmV3bGluZSBjb252ZW50aW9uIChkZWZhdWx0OiBlbmFibGVkKS4gSW4gb3RoZXIgd29yZHMsCi0JYW55IG9mIFxyLCBcbiBvciBcclxuIGlzIGFjY2VwdGFibGUgYXMgZW5kLW9mLWxpbmUgY2hhcmFjdGVyLgotCUlmIGVuYWJsZWQgaW1wb3J0IGFuZCBleGVjZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGFueSBuZXdsaW5lCi0JaW4gZmlsZXMuIFB5dGhvbiBjb2RlIGNhbiBvcGVuIGEgZmlsZSB3aXRoIG9wZW4oZmlsZSwgJ1UnKSB0bwotCXJlYWQgaXQgaW4gdW5pdmVyc2FsIG5ld2xpbmUgbW9kZS4gVEhJUyBPUFRJT04gSVMgVU5TVVBQT1JURUQuCisgICAgICAgIGZvcmVpZ24gbmV3bGluZSBjb252ZW50aW9uIChkZWZhdWx0OiBlbmFibGVkKS4gSW4gb3RoZXIgd29yZHMsCisgICAgICAgIGFueSBvZiBcciwgXG4gb3IgXHJcbiBpcyBhY2NlcHRhYmxlIGFzIGVuZC1vZi1saW5lIGNoYXJhY3Rlci4KKyAgICAgICAgSWYgZW5hYmxlZCBpbXBvcnQgYW5kIGV4ZWNmaWxlIHdpbGwgYXV0b21hdGljYWxseSBhY2NlcHQgYW55IG5ld2xpbmUKKyAgICAgICAgaW4gZmlsZXMuIFB5dGhvbiBjb2RlIGNhbiBvcGVuIGEgZmlsZSB3aXRoIG9wZW4oZmlsZSwgJ1UnKSB0bworICAgICAgICByZWFkIGl0IGluIHVuaXZlcnNhbCBuZXdsaW5lIG1vZGUuIFRISVMgT1BUSU9OIElTIFVOU1VQUE9SVEVELgogCiAtLXdpdGgtdHNjOiBQcm9maWxlIHVzaW5nIHRoZSBQZW50aXVtIHRpbWVzdGFtcGluZyBjb3VudGVyIChUU0MpLgogCi0tLXdpdGgtZnBlY3RsOiAgRW5hYmxlIGJ1aWxkaW5nIHRoZSBgYGZwZWN0bCcnIG1vZHVsZSB3aGljaCBjYW4gYmUgdXNlZAotCXRvIGNvbnRyb2wgdGhlIGdlbmVyYXRpb24gb2YgU0lHRlBFIGFuZCBpdHMgY29udmVyc2lvbiBpbnRvIGEKLQlQeXRob24gZXhjZXB0aW9uLiBOb3RlOiB0aGlzIG1vZHVsZSBpcyBkYW5nZXJvdXMgb3IgdXNlbGVzcwotCWV4Y2VwdCBpbiB0aGUgaGFuZHMgb2YgZXhwZXJ0cy4KKy0td2l0aC1zeXN0ZW0tZmZpOiAgQnVpbGQgdGhlIF9jdHlwZXMgZXh0ZW5zaW9uIG1vZHVsZSB1c2luZyBhbiBmZmkKKwlsaWJyYXJ5IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLgogCiAKIEJ1aWxkaW5nIGZvciBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzICh1c2luZyB0aGUgVlBBVEggZmVhdHVyZSkKQEAgLTEwODEsMTMgKzExMTEsMTMgQEAKIGluIC91c3IvdG1wL3B5dGhvbiAoYXNzdW1pbmcgfmd1aWRvL3NyYy9weXRob24gaXMgdGhlIHRvcGxldmVsCiBkaXJlY3RvcnkgYW5kIHlvdSB3YW50IHRvIGJ1aWxkIGluIC91c3IvdG1wL3B5dGhvbik6CiAKLQkkIG1rZGlyIC91c3IvdG1wL3B5dGhvbgotCSQgY2QgL3Vzci90bXAvcHl0aG9uCi0JJCB+Z3VpZG8vc3JjL3B5dGhvbi9jb25maWd1cmUKLQlbLi4uXQotCSQgbWFrZQotCVsuLi5dCi0JJAorICAgICAgICAkIG1rZGlyIC91c3IvdG1wL3B5dGhvbgorICAgICAgICAkIGNkIC91c3IvdG1wL3B5dGhvbgorICAgICAgICAkIH5ndWlkby9zcmMvcHl0aG9uL2NvbmZpZ3VyZQorICAgICAgICBbLi4uXQorICAgICAgICAkIG1ha2UKKyAgICAgICAgWy4uLl0KKyAgICAgICAgJAogCiBOb3RlIHRoYXQgY29uZmlndXJlIGNvcGllcyB0aGUgb3JpZ2luYWwgU2V0dXAgZmlsZSB0byB0aGUgYnVpbGQKIGRpcmVjdG9yeSBpZiBpdCBmaW5kcyBubyBTZXR1cCBmaWxlIHRoZXJlLiAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4KQEAgLTExODQsMTMgKzEyMTQsMTIgQEAKIE1vc3Qgc3ViZGlyZWN0b3JpZXMgaGF2ZSB0aGVpciBvd24gUkVBRE1FIGZpbGVzLiAgTW9zdCBmaWxlcyBoYXZlCiBjb21tZW50cy4KIAotLmN2c2lnbm9yZQlBZGRpdGlvbmFsIGZpbGVuYW1lIG1hdGNoaW5nIHBhdHRlcm5zIGZvciBDVlMgdG8gaWdub3JlCi1CZU9TLwkJRmlsZXMgc3BlY2lmaWMgdG8gdGhlIEJlT1MgcG9ydAorQmVPUy8gICAgICAgICAgIEZpbGVzIHNwZWNpZmljIHRvIHRoZSBCZU9TIHBvcnQKIERlbW8vICAgICAgICAgICBEZW1vbnN0cmF0aW9uIHNjcmlwdHMsIG1vZHVsZXMgYW5kIHByb2dyYW1zCi1Eb2MvCQlEb2N1bWVudGF0aW9uIHNvdXJjZXMgKExhVGVYKQorRG9jLyAgICAgICAgICAgIERvY3VtZW50YXRpb24gc291cmNlcyAoTGFUZVgpCiBHcmFtbWFyLyAgICAgICAgSW5wdXQgZm9yIHRoZSBwYXJzZXIgZ2VuZXJhdG9yCiBJbmNsdWRlLyAgICAgICAgUHVibGljIGhlYWRlciBmaWxlcwotTElDRU5TRQkJTGljZW5zaW5nIGluZm9ybWF0aW9uCitMSUNFTlNFICAgICAgICAgTGljZW5zaW5nIGluZm9ybWF0aW9uCiBMaWIvICAgICAgICAgICAgUHl0aG9uIGxpYnJhcnkgbW9kdWxlcwogTWFjLyAgICAgICAgICAgIE1hY2ludG9zaCBzcGVjaWZpYyByZXNvdXJjZXMKIE1ha2VmaWxlLnByZS5pbiBTb3VyY2UgZnJvbSB3aGljaCBjb25maWcuc3RhdHVzIGNyZWF0ZXMgdGhlIE1ha2VmaWxlLnByZQpAQCAtMTE5OCw3ICsxMjI3LDcgQEAKIE1vZHVsZXMvICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBtb3N0IGJ1aWx0LWluIG1vZHVsZXMKIE9iamVjdHMvICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBtb3N0IGJ1aWx0LWluIG9iamVjdCB0eXBlcwogUEMvICAgICAgICAgICAgIEZpbGVzIHNwZWNpZmljIHRvIFBDIHBvcnRzIChET1MsIFdpbmRvd3MsIE9TLzIpCi1QQ2J1aWxkLwlCdWlsZCBkaXJlY3RvcnkgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrCitQQ2J1aWxkLyAgICAgICAgQnVpbGQgZGlyZWN0b3J5IGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKwogUGFyc2VyLyAgICAgICAgIFRoZSBwYXJzZXIgYW5kIHRva2VuaXplciBhbmQgdGhlaXIgaW5wdXQgaGFuZGxpbmcKIFB5dGhvbi8gICAgICAgICBUaGUgYnl0ZS1jb21waWxlciBhbmQgaW50ZXJwcmV0ZXIKIFJFQURNRSAgICAgICAgICBUaGUgZmlsZSB5b3UncmUgcmVhZGluZyBub3cKQEAgLTEyMDcsNiArMTIzNiw3IEBACiBjb25maWd1cmUgICAgICAgQ29uZmlndXJhdGlvbiBzaGVsbCBzY3JpcHQgKEdOVSBhdXRvY29uZiBvdXRwdXQpCiBjb25maWd1cmUuaW4gICAgQ29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIChpbnB1dCBmb3IgR05VIGF1dG9jb25mKQogaW5zdGFsbC1zaCAgICAgIFNoZWxsIHNjcmlwdCB1c2VkIHRvIGluc3RhbGwgZmlsZXMKK3NldHVwLnB5ICAgICAgICBQeXRob24gc2NyaXB0IHVzZWQgdG8gYnVpbGQgZXh0ZW5zaW9uIG1vZHVsZXMKIAogVGhlIGZvbGxvd2luZyBmaWxlcyB3aWxsIChtYXkpIGJlIGNyZWF0ZWQgaW4gdGhlIHRvcGxldmVsIGRpcmVjdG9yeSBieQogdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGJ1aWxkIHByb2Nlc3NlczoKQEAgLTEyMTgsOCArMTI0OCw4IEBACiBweWNvbmZpZy5oICAgICAgQ29uZmlndXJhdGlvbiBoZWFkZXIKIGNvbmZpZy5sb2cgICAgICBMb2cgZnJvbSBsYXN0IGNvbmZpZ3VyZSBydW4KIGNvbmZpZy5zdGF0dXMgICBTdGF0dXMgZnJvbSBsYXN0IHJ1biBvZiB0aGUgY29uZmlndXJlIHNjcmlwdAotZ2V0YnVpbGRpbmZvLm8JT2JqZWN0IGZpbGUgZnJvbSBNb2R1bGVzL2dldGJ1aWxkaW5mby5jCi1saWJweXRob248dmVyc2lvbj4uYQlUaGUgbGlicmFyeSBhcmNoaXZlCitnZXRidWlsZGluZm8ubyAgT2JqZWN0IGZpbGUgZnJvbSBNb2R1bGVzL2dldGJ1aWxkaW5mby5jCitsaWJweXRob248dmVyc2lvbj4uYSAgICBUaGUgbGlicmFyeSBhcmNoaXZlCiBweXRob24gICAgICAgICAgVGhlIGV4ZWN1dGFibGUgaW50ZXJwcmV0ZXIKIHRhZ3MsIFRBR1MgICAgICBUYWdzIGZpbGVzIGZvciB2aSBhbmQgRW1hY3MKIApkaWZmIC0tZ2l0IGEvUklTQ09TL01ha2VmaWxlIGIvUklTQ09TL01ha2VmaWxlCmluZGV4IDkyZjUyNzIuLjE3ODhiNWMgMTAwNjQ0Ci0tLSBhL1JJU0NPUy9NYWtlZmlsZQorKysgYi9SSVNDT1MvTWFrZWZpbGUKQEAgLTc0LDcgKzc0LDYgQEAKIAlALl4uTGliLm1kNS9weWRcCiAJQC5eLkxpYi5vcGVyYXRvci9weWRcCiAJQC5eLkxpYi5wYXJzZXIvcHlkXAotCUAuXi5MaWIucmVnZXgvcHlkXAogCUAuXi5MaWIucmdiaW1nL3B5ZFwKIAlALl4uTGliLnNoYS9weWRcCiAJQC5eLkxpYi5zaWduYWwvcHlkXApAQCAtMjg0LDEwICsyODMsNiBAQAogQC5eLkxpYi5wYXJzZXIvcHlkOiBALl4uTW9kdWxlcy5vLnBhcnNlcm1vZHVsZSBzLmxpbmt0YWIKIAkkKE1BS0VETEspIC1kIEAuXi5MaWIucGFyc2VyL3B5ZCAtcyBzLmxpbmt0YWIgLW8gQC5eLk1vZHVsZXMuby5wYXJzZXJtb2R1bGUgLWUgaW5pdHBhcnNlcgogCi1ALl4uTGliLnJlZ2V4L3B5ZDogQC5eLk1vZHVsZXMuby5yZWdleG1vZHVsZSBALl4uTW9kdWxlcy5vLnJlZ2V4cHIgcy5saW5rdGFiCi0JJChMSU5LKSAtYW9mIC1vIEAuXi5Nb2R1bGVzLm8ucmVnZXhsaW5rIEAuXi5Nb2R1bGVzLm8ucmVnZXhtb2R1bGUgQC5eLk1vZHVsZXMuby5yZWdleHByCi0JJChNQUtFRExLKSAtZCBALl4uTGliLnJlZ2V4L3B5ZCAtcyBzLmxpbmt0YWIgLW8gQC5eLk1vZHVsZXMuby5yZWdleGxpbmsgLWUgaW5pdHJlZ2V4Ci0KIEAuXi5MaWIucmdiaW1nL3B5ZDogQC5eLk1vZHVsZXMuby5yZ2JpbWdtb2R1bGUgcy5saW5rdGFiCiAJJChNQUtFRExLKSAtZCBALl4uTGliLnJnYmltZy9weWQgLXMgcy5saW5rdGFiIC1vIEAuXi5Nb2R1bGVzLm8ucmdiaW1nbW9kdWxlIC1lIGluaXRyZ2JpbWcKIApkaWZmIC0tZ2l0IGEvVG9vbHMvYmdlbi9iZ2VuL2JnZW5PYmplY3REZWZpbml0aW9uLnB5IGIvVG9vbHMvYmdlbi9iZ2VuL2JnZW5PYmplY3REZWZpbml0aW9uLnB5CmluZGV4IGE4MDJmOTMuLjZmOWJkNTMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuT2JqZWN0RGVmaW5pdGlvbi5weQorKysgYi9Ub29scy9iZ2VuL2JnZW4vYmdlbk9iamVjdERlZmluaXRpb24ucHkKQEAgLTM4Myw2ICszODMsOCBAQAogICAgICAgICBPdXRwdXQoIiVzX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8iLCBzZWxmLnByZWZpeCkKIAogICAgIGRlZiBvdXRwdXRfdHBfaW5pdEJvZHlfYmFzZWNhbGwoc2VsZik6CisgICAgICAgICIiIklmIGEgdHlwZSBzaGFyZXMgaXRzIGluaXQgY2FsbCB3aXRoIGl0cyBiYXNlIHR5cGUgc2V0IG91dHB1dF90cF9pbml0Qm9keQorICAgICAgICB0byBvdXRwdXRfdHBfaW5pdEJvZHlfYmFzZWNhbGwiIiIKICAgICAgICAgaWYgc2VsZi5iYXNldHlwZToKICAgICAgICAgICAgIE91dHB1dCgiaWYgKCVzLnRwX2luaXQpIiwgc2VsZi5iYXNldHlwZSkKICAgICAgICAgICAgIE91dExicmFjZSgpCkBAIC0zOTUsNyArMzk3LDYgQEAKICAgICAgICAgaWYgc2VsZi5vdXRwdXRfdHBfaW5pdEJvZHk6CiAgICAgICAgICAgICBPdXRwdXQoInN0YXRpYyBpbnQgJXNfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKSIsIHNlbGYucHJlZml4KQogICAgICAgICAgICAgT3V0TGJyYWNlKCkKLSAgICAgICAgICAgIHNlbGYub3V0cHV0X3RwX2luaXRCb2R5X2Jhc2VjYWxsKCkKICAgICAgICAgICAgIHNlbGYub3V0cHV0X3RwX2luaXRCb2R5KCkKICAgICAgICAgICAgIE91dFJicmFjZSgpCiAgICAgICAgIGVsc2U6CkBAIC00MjUsNyArNDI2LDcgQEAKICAgICAgICAgaWYgc2VsZi5iYXNldHlwZToKICAgICAgICAgICAgIE91dHB1dCgiaWYgKCVzLnRwX25ldykiLCBzZWxmLmJhc2V0eXBlKQogICAgICAgICAgICAgT3V0TGJyYWNlKCkKLSAgICAgICAgICAgIE91dHB1dCgiaWYgKCAoKiVzLnRwX2luaXQpKF9zZWxmLCBfYXJncywgX2t3ZHMpID09IE5VTEwpIHJldHVybiBOVUxMOyIsIHNlbGYuYmFzZXR5cGUpCisgICAgICAgICAgICBPdXRwdXQoImlmICggKColcy50cF9uZXcpKHR5cGUsIF9hcmdzLCBfa3dkcykgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Iiwgc2VsZi5iYXNldHlwZSkKICAgICAgICAgICAgIERlZGVudCgpCiAgICAgICAgICAgICBPdXRwdXQoIn0gZWxzZSB7IikKICAgICAgICAgICAgIEluZGVudCgpCmRpZmYgLS1naXQgYS9Ub29scy9idWlsZGJvdC9idWlsZC5iYXQgYi9Ub29scy9idWlsZGJvdC9idWlsZC5iYXQKaW5kZXggZTNiNzdiZS4uZTk2MzIzYyAxMDA2NDQKLS0tIGEvVG9vbHMvYnVpbGRib3QvYnVpbGQuYmF0CisrKyBiL1Rvb2xzL2J1aWxkYm90L2J1aWxkLmJhdApAQCAtMSw0ICsxLDUgQEAKIEByZW0gVXNlZCBieSB0aGUgYnVpbGRib3QgImNvbXBpbGUiIHN0ZXAuCiBjbWQgL2MgVG9vbHNcYnVpbGRib3RcZXh0ZXJuYWwuYmF0CiBjYWxsICIlVlM3MUNPTU5UT09MUyV2c3ZhcnMzMi5iYXQiCitjbWQgL3EvYyBUb29sc1xidWlsZGJvdFxraWxsX3B5dGhvbi5iYXQKIGRldmVudi5jb20gL3VzZWVudiAvYnVpbGQgRGVidWcgUENidWlsZFxwY2J1aWxkLnNsbgpkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3QvZXh0ZXJuYWwuYmF0IGIvVG9vbHMvYnVpbGRib3QvZXh0ZXJuYWwuYmF0CmluZGV4IDFiMDMyYWUuLmM2ZDI1MmQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2J1aWxkYm90L2V4dGVybmFsLmJhdAorKysgYi9Ub29scy9idWlsZGJvdC9leHRlcm5hbC5iYXQKQEAgLTEyLDMgKzEyLDI0IEBACiBpZiBub3QgZXhpc3QgZGItNC40LjIwXGJ1aWxkX3dpbjMyXGRlYnVnXGxpYmRiNDRzZC5saWIgKA0KICAgIGRldmVudiBkYi00LjQuMjBcYnVpbGRfd2luMzJcQmVya2VsZXlfREIuc2xuIC9idWlsZCBEZWJ1ZyAvcHJvamVjdCBkYl9zdGF0aWMNCiApDQorDQorQHJlbSBPcGVuU1NMDQoraWYgbm90IGV4aXN0IG9wZW5zc2wtMC45LjhhIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL29wZW5zc2wtMC45LjhhDQorDQorQHJlbSB0Y2x0aw0KK2lmIG5vdCBleGlzdCB0Y2w4LjQuMTIgKA0KKyAgIGlmIGV4aXN0IHRjbHRrIHJkIC9zL3EgdGNsdGsNCisgICBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC90Y2w4LjQuMTINCisgICBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC90azguNC4xMg0KKyAgIGNkIHRjbDguNC4xMlx3aW4NCisgICBubWFrZSAtZiBtYWtlZmlsZS52Yw0KKyAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIElOU1RBTExESVI9Li5cLi5cdGNsdGsgaW5zdGFsbA0KKyAgIGNkIC4uXC4uDQorICAgY2QgdGs4LjQuMTJcd2luDQorICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgVENMRElSPS4uXC4uXHRjbDguNC4xMg0KKyAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIFRDTERJUj0uLlwuLlx0Y2w4LjQuMTIgSU5TVEFMTERJUj0uLlwuLlx0Y2x0ayBpbnN0YWxsDQorKQ0KKw0KK0ByZW0gc3FsaXRlDQoraWYgbm90IGV4aXN0IHNxbGl0ZS1zb3VyY2UtMy4zLjQgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvc3FsaXRlLXNvdXJjZS0zLjMuNA0KK2lmIG5vdCBleGlzdCBidWlsZFxQQ2J1aWxkXHNxbGl0ZTMuZGxsIGNvcHkgc3FsaXRlLXNvdXJjZS0zLjMuNFxzcWxpdGUzLmRsbCBidWlsZFxQQ2J1aWxkDQpkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24uYmF0IGIvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OGI2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5iYXQKQEAgLTAsMCArMSwzIEBACitjZCBUb29sc1xidWlsZGJvdAorbm1ha2UgL0MgL1MgL2Yga2lsbF9weXRob24ubWFrCitraWxsX3B5dGhvbi5leGUKZGlmZiAtLWdpdCBhL1Rvb2xzL2J1aWxkYm90L2tpbGxfcHl0aG9uLmMgYi9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzlhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIFRoaXMgcHJvZ3JhbSBsb29rcyBmb3IgcHJvY2Vzc2VzIHdoaWNoIGhhdmUgYnVpbGRcUENidWlsZFxweXRob24uZXhlCisgICBpbiB0aGVpciBwYXRoIGFuZCB0ZXJtaW5hdGVzIHRoZW0uICovCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHBzYXBpLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oKQoreworCURXT1JEIHBpZHNbMTAyNF0sIGNiTmVlZGVkOworCWludCBpLCBudW1fcHJvY2Vzc2VzOworCWlmICghRW51bVByb2Nlc3NlcyhwaWRzLCBzaXplb2YocGlkcyksICZjYk5lZWRlZCkpIHsKKwkJcHJpbnRmKCJFbnVtUHJvY2Vzc2VzIGZhaWxlZFxuIik7CisJCXJldHVybiAxOworCX0KKwludW1fcHJvY2Vzc2VzID0gY2JOZWVkZWQvc2l6ZW9mKHBpZHNbMF0pOworCWZvciAoaSA9IDA7IGkgPCBudW1fcHJvY2Vzc2VzOyBpKyspIHsKKwkJSEFORExFIGhQcm9jZXNzOworCQljaGFyIHBhdGhbTUFYX1BBVEhdOworCQlITU9EVUxFIG1vZHNbMTAyNF07CisJCWludCBrLCBudW1fbW9kczsKKwkJaFByb2Nlc3MgPSBPcGVuUHJvY2VzcyhQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OIAorCQkJCQl8IFBST0NFU1NfVk1fUkVBRCAKKwkJCQkJfCAgUFJPQ0VTU19URVJNSU5BVEUgLAorCQkJCQlGQUxTRSwgcGlkc1tpXSk7CisJCWlmICghaFByb2Nlc3MpCisJCQkvKiBwcm9jZXNzIG5vdCBhY2Nlc3NpYmxlICovCisJCQljb250aW51ZTsKKwkJaWYgKCFFbnVtUHJvY2Vzc01vZHVsZXMoaFByb2Nlc3MsIG1vZHMsIHNpemVvZihtb2RzKSwgJmNiTmVlZGVkKSkgeworCQkJLyogRm9yIHVua25vd24gcmVhc29ucywgdGhpcyBzb21ldGltZXMgcmV0dXJucyBFUlJPUl9QQVJUSUFMX0NPUFk7CisJCQkgICB0aGlzIGFwcGFyZW50bHkgbWVhbnMgd2UgYXJlIG5vdCBzdXBwb3NlZCB0byByZWFkIHRoZSBwcm9jZXNzLiAqLworCQkJaWYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX1BBUlRJQUxfQ09QWSkgeworCQkJCUNsb3NlSGFuZGxlKGhQcm9jZXNzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXByaW50ZigiRW51bVByb2Nlc3NNb2R1bGVzIGZhaWxlZDogJWRcbiIsIEdldExhc3RFcnJvcigpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICghR2V0TW9kdWxlRmlsZU5hbWVFeChoUHJvY2VzcywgTlVMTCwgcGF0aCwgc2l6ZW9mKHBhdGgpKSkgeworCQkJcHJpbnRmKCJHZXRQcm9jZXNzSW1hZ2VGaWxlTmFtZSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlfc3RybHdyKHBhdGgpOworCQkvKiBwcmludGYoIiVzXG4iLCBwYXRoKTsgKi8KKwkJaWYgKHN0cnN0cihwYXRoLCAiYnVpbGRcXHBjYnVpbGRcXHB5dGhvbl9kLmV4ZSIpICE9IE5VTEwpIHsKKwkJCXByaW50ZigiVGVybWluYXRpbmcgJXMgKHBpZCAlZClcbiIsIHBhdGgsIHBpZHNbaV0pOworCQkJaWYgKCFUZXJtaW5hdGVQcm9jZXNzKGhQcm9jZXNzLCAxKSkgeworCQkJCXByaW50ZigiVGVybWluYXRpb24gZmFpbGVkOiAlZFxuIiwgR2V0TGFzdEVycm9yKCkpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKworCQlDbG9zZUhhbmRsZShoUHJvY2Vzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24ubWFrIGIvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24ubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjdkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5tYWsKQEAgLTAsMCArMSwyIEBACitraWxsX3B5dGhvbi5leGU6CWtpbGxfcHl0aG9uLmMKKwkJY2wgLW5vbG9nbyAtbyBraWxsX3B5dGhvbi5leGUga2lsbF9weXRob24uYyBwc2FwaS5saWIKZGlmZiAtLWdpdCBhL1Rvb2xzL2kxOG4vbXNnZm10LnB5IGIvVG9vbHMvaTE4bi9tc2dmbXQucHkKaW5kZXggYjRhZTNlOS4uNjQzMzEzMSAxMDA3NTUKLS0tIGEvVG9vbHMvaTE4bi9tc2dmbXQucHkKKysrIGIvVG9vbHMvaTE4bi9tc2dmbXQucHkKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAgICAgc2VjdGlvbiA9IE5vbmUKICAgICAgICAgICAgIGZ1enp5ID0gMAogICAgICAgICAjIFJlY29yZCBhIGZ1enp5IG1hcmsKLSAgICAgICAgaWYgbFs6Ml0gPT0gJyMsJyBhbmQgbC5maW5kKCdmdXp6eScpOgorICAgICAgICBpZiBsWzoyXSA9PSAnIywnIGFuZCAnZnV6enknIGluIGw6CiAgICAgICAgICAgICBmdXp6eSA9IDEKICAgICAgICAgIyBTa2lwIGNvbW1lbnRzCiAgICAgICAgIGlmIGxbMF0gPT0gJyMnOgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL21zaS5weSBiL1Rvb2xzL21zaS9tc2kucHkKaW5kZXggNjY2NWQzNi4uZWZhMTY5NiAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL21zaS5weQorKysgYi9Ub29scy9tc2kvbXNpLnB5CkBAIC02LDYgKzYsNyBAQAogaW1wb3J0IHVpc2FtcGxlCiBmcm9tIHdpbjMyY29tLmNsaWVudCBpbXBvcnQgY29uc3RhbnRzCiBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCitmcm9tIHV1aWRzIGltcG9ydCBwcm9kdWN0X2NvZGVzCiAKICMgU2V0dGluZ3MgY2FuIGJlIG92ZXJyaWRkZW4gaW4gY29uZmlnLnB5IGJlbG93CiAjIDAgZm9yIG9mZmljaWFsIHB5dGhvbi5vcmcgcmVsZWFzZXMKQEAgLTIzLDYgKzI0LDggQEAKIGZ1bGxfY3VycmVudF92ZXJzaW9uID0gTm9uZQogIyBJcyBUY2wgYXZhaWxhYmxlIGF0IGFsbD8KIGhhdmVfdGNsID0gVHJ1ZQorIyBXaGVyZSBpcyBzcWxpdGUzLmRsbCBsb2NhdGVkLCByZWxhdGl2ZSB0byBzcmNkaXI/CitzcWxpdGVfZGlyID0gIi4uL3NxbGl0ZS1zb3VyY2UtMy4zLjQiCiAKIHRyeToKICAgICBmcm9tIGNvbmZpZyBpbXBvcnQgKgpAQCAtNjIsMzAgKzY1LDYgQEAKIHVwZ3JhZGVfY29kZV9zbmFwc2hvdD0nezkyQTI0NDgxLTNFQ0ItNDBGQy04ODM2LTA0Qjc5NjZFQzBENX0nCiB1cGdyYWRlX2NvZGU9J3s2NUU2REU0OC1BMzU4LTQzNEQtQUE0Ri00QUY3MkRCNDcxOEZ9JwogCi0jIFRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBlYWNoIFB5dGhvbiByZWxlYXNlLgotIyBUaGUgcHJvZHVjdCBjb2RlIG11c3QgY2hhbmdlIHdoZW5ldmVyIHRoZSBuYW1lIG9mIHRoZSBNU0kgZmlsZQotIyBjaGFuZ2VzLCBhbmQgd2hlbiBuZXcgY29tcG9uZW50IGNvZGVzIGFyZSBpc3N1ZWQgZm9yIGV4aXN0aW5nCi0jIGNvbXBvbmVudHMuIFNlZSAiQ2hhbmdpbmcgdGhlIFByb2R1Y3QgQ29kZSIuIEFzIHdlIGNoYW5nZSB0aGUKLSMgY29tcG9uZW50IGNvZGVzIHdpdGggZXZlcnkgYnVpbGQsIHdlIG5lZWQgYSBuZXcgcHJvZHVjdCBjb2RlCi0jIGVhY2ggdGltZS4gRm9yIGludGVybWVkaWF0ZSAoc25hcHNob3QpIHJlbGVhc2VzLCB0aGV5IGFyZSBhdXRvbWF0aWNhbGx5Ci0jIGdlbmVyYXRlZC4gRm9yIG9mZmljaWFsIHJlbGVhc2VzLCB3ZSByZWNvcmQgdGhlIHByb2R1Y3QgY29kZXMsCi0jIHNvIHBlb3BsZSBjYW4gcmVmZXIgdG8gdGhlbS4KLXByb2R1Y3RfY29kZXMgPSB7Ci0gICAgJzIuNC4xMDEnOiAnezBlOWI0ZDhlLTZjZGEtNDQ2ZS1hMjA4LTdiOTJmM2RkZmZhMH0nLCAjIDIuNGExLCByZWxlYXNlZCBhcyBhIHNuYXBzaG90Ci0gICAgJzIuNC4xMDInOiAnezFiOTk4NzQ1LTQ5MDEtNGVkYi1iYzUyLTIxMzY4OWUxYjkyMn0nLCAjIDIuNGEyCi0gICAgJzIuNC4xMDMnOiAnezMzZmM4YmQyLTFlOGYtNGFkZC1hNDBhLWFkZTI3MjhkNTk0Mn0nLCAjIDIuNGEzCi0gICAgJzIuNC4xMTEnOiAnezUxYTdlMmE4LTIwMjUtNGVmMC04NmZmLWU2YWFiNzQyZDFmYX0nLCAjIDIuNGIxCi0gICAgJzIuNC4xMTInOiAnezRhNWU3YzFkLWM2NTktNGZlMy1iOGM5LTdjNjViZDljOTVhNX0nLCAjIDIuNGIyCi0gICAgJzIuNC4xMjEnOiAnezc1NTA4ODIxLWE4ZTktNDBhOC05NWJkLWRiZTYwMzNkZGJlYX0nLCAjIDIuNGMxCi0gICAgJzIuNC4xMjInOiAnezgzYTkxMThiLTRiZGQtNDczYi1hZmMzLWJjYjE0MmZlY2E5ZX0nLCAjIDIuNGMyCi0gICAgJzIuNC4xNTAnOiAnezgyZDkzMDJlLWYyMDktNDgwNS1iNTQ4LTUyMDg3MDQ3NDgzYX0nLCAjIDIuNC4wCi0gICAgJzIuNC4xMTIxJzone2JlMDI3NDExLThlNmItNDQ0MC1hMjliLWIwN2RmMDY5MDIzMH0nLCAjIDIuNC4xYzEKLSAgICAnMi40LjExMjInOid7MDI4MTg3NTItNDhiZi00MDc0LWEyODEtN2E0MTE0YzRmMWIxfScsICMgMi40LjFjMgotICAgICcyLjQuMTE1MCc6J3s0ZDRmNTM0Ni03ZTRhLTQwYjUtOTM4Ny1mZGI2MTgxMzU3ZmN9JywgIyAyLjQuMQotICAgICcyLjQuMjEyMSc6J3s1ZWY5ZDZiNi1kZjc4LTQ1ZDItYWIwOS0xNDc4NmEzYzVhOTl9JywgIyAyLjQuMmMxCi0gICAgJzIuNC4yMTUwJzone2IxOTFlNDljLWVhMjMtNDNiMi1iMjhhLTE0ZTA3ODQwNjliOH0nLCAjIDIuNC4yCi19Ci0KIGlmIHNuYXBzaG90OgogICAgIGN1cnJlbnRfdmVyc2lvbiA9ICIlcy4lcy4lcyIgJSAobWFqb3IsIG1pbm9yLCBpbnQodGltZS50aW1lKCkvMzYwMC8yNCkpCiAgICAgcHJvZHVjdF9jb2RlID0gbXNpbGliLmdlbl91dWlkKCkKQEAgLTEwOSwxNCArODgsMTAgQEAKICAgICAnX3RraW50ZXIucHlkJywKICAgICAnX21zaS5weWQnLAogICAgICdfY3R5cGVzLnB5ZCcsCi0gICAgJ19jdHlwZXNfdGVzdC5weWQnCisgICAgJ19jdHlwZXNfdGVzdC5weWQnLAorICAgICdfc3FsaXRlMy5weWQnCiBdCiAKLWlmIG1ham9yK21pbm9yIDw9ICIyNCI6Ci0gICAgZXh0ZW5zaW9ucy5leHRlbmQoWwotICAgICd6bGliLnB5ZCcsCi0gICAgXSkKLQogIyBXZWxsLWtub3duIGNvbXBvbmVudCBVVUlEcwogIyBUaGVzZSBhcmUgbmVlZGVkIGZvciBTaGFyZWRETExzIHJlZmVyZW5jZSBjb3VudGVyOyBpZgogIyBhIGRpZmZlcmVudCBVVUlEIHdhcyB1c2VkIGZvciBlYWNoIGluY2FybmF0aW9uIG9mLCBzYXksCkBAIC0zOTIsNyArMzY3LDcgQEAKICAgICAgICAgICAgICAgKCJWZXJkYW5hUmVkOSIsICJWZXJkYW5hIiwgOSwgMjU1LCAwKSwKICAgICAgICAgICAgICBdKQogCi0gICAgY29tcGlsZWFyZ3MgPSByIi1XaSBbVEFSR0VURElSXUxpYlxjb21waWxlYWxsLnB5IC1mIC14IGJhZHN5bnRheCBbVEFSR0VURElSXUxpYiIKKyAgICBjb21waWxlYXJncyA9IHIiLVdpIFtUQVJHRVRESVJdTGliXGNvbXBpbGVhbGwucHkgLWYgLXggYmFkX2NvZGluZ3xiYWRzeW50YXh8c2l0ZS1wYWNrYWdlcyBbVEFSR0VURElSXUxpYiIKICAgICAjIFNlZSAiQ3VzdG9tQWN0aW9uIFRhYmxlIgogICAgIGFkZF9kYXRhKGRiLCAiQ3VzdG9tQWN0aW9uIiwgWwogICAgICAgICAjIG1zaWRiQ3VzdG9tQWN0aW9uVHlwZUZpcnN0U2VxdWVuY2UgKyBtc2lkYkN1c3RvbUFjdGlvblR5cGVUZXh0RGF0YSArIG1zaWRiQ3VzdG9tQWN0aW9uVHlwZVByb3BlcnR5CkBAIC00OTEsNyArNDY2LDcgQEAKICAgICBjID0gZXhpdF9kaWFsb2cudGV4dCgid2FybmluZyIsIDEzNSwgMjAwLCAyMjAsIDQwLCAweDMwMDAzLAogICAgICAgICAgICAgIntcXFZlcmRhbmFSZWQ5fVdhcm5pbmc6IFB5dGhvbiAyLjUueCBpcyB0aGUgbGFzdCAiCiAgICAgICAgICAgICAiUHl0aG9uIHJlbGVhc2UgZm9yIFdpbmRvd3MgOXguIikKLSAgICBjLmNvbmRpdGlvbigiSGlkZSIsICJOT1QgVmVyc2lvbjl4IikKKyAgICBjLmNvbmRpdGlvbigiSGlkZSIsICJOT1QgVmVyc2lvbjlYIikKIAogICAgIGV4aXRfZGlhbG9nLnRleHQoIkRlc2NyaXB0aW9uIiwgMTM1LCAyMzUsIDIyMCwgMjAsIDB4MzAwMDMsCiAgICAgICAgICAgICAgICAiQ2xpY2sgdGhlIEZpbmlzaCBidXR0b24gdG8gZXhpdCB0aGUgSW5zdGFsbGVyLiIpCkBAIC05MTQsNyArODg5LDcgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgdGNsdGsuc2V0X2N1cnJlbnQoKQogICAgICAgICBlbGlmIGRpciBpbiBbJ3Rlc3QnLCAndGVzdHMnLCAnZGF0YScsICdvdXRwdXQnXToKLSAgICAgICAgICAgICMgdGVzdDogTGliLCBMaWIvZW1haWwsIExpYi9ic2RkYgorICAgICAgICAgICAgIyB0ZXN0OiBMaWIsIExpYi9lbWFpbCwgTGliL2JzZGRiLCBMaWIvY3R5cGVzLCBMaWIvc3FsaXRlMwogICAgICAgICAgICAgIyB0ZXN0czogTGliL2Rpc3R1dGlscwogICAgICAgICAgICAgIyBkYXRhOiBMaWIvZW1haWwvdGVzdAogICAgICAgICAgICAgIyBvdXRwdXQ6IExpYi90ZXN0CkBAIC05NDEsNiArOTE2LDggQEAKICAgICAgICAgICAgIGxpYi5hZGRfZmlsZSgidGVzdC54bWwub3V0IikKICAgICAgICAgICAgIGxpYi5hZGRfZmlsZSgidGVzdHRhci50YXIiKQogICAgICAgICAgICAgbGliLmFkZF9maWxlKCJ0ZXN0X2RpZmZsaWJfZXhwZWN0Lmh0bWwiKQorICAgICAgICAgICAgbGliLmFkZF9maWxlKCJjaGVja19zb3VuZGNhcmQudmJzIikKKyAgICAgICAgICAgIGxpYi5hZGRfZmlsZSgiZW1wdHkudmJzIikKICAgICAgICAgICAgIGxpYi5nbG9iKCIqLnV1ZSIpCiAgICAgICAgICAgICBsaWIuYWRkX2ZpbGUoInJlYWRtZS50eHQiLCBzcmM9IlJFQURNRSIpCiAgICAgICAgIGlmIGRpcj09J2RlY2ltYWx0ZXN0ZGF0YSc6CkBAIC05OTAsNiArOTY3LDE0IEBACiAgICAgICAgICAgICB0Y2xkaXIgPSBvcy5wYXRoLm5vcm1wYXRoKHNyY2RpcisiLy4uL3RjbHRrL2JpbiIpCiAgICAgICAgICAgICBmb3IgZiBpbiBnbG9iLmdsb2IxKHRjbGRpciwgIiouZGxsIik6CiAgICAgICAgICAgICAgICAgbGliLmFkZF9maWxlKGYsIHNyYz1vcy5wYXRoLmpvaW4odGNsZGlyLCBmKSkKKyAgICAjIEFkZCBzcWxpdGUKKyAgICBpZiBtc2lsaWIubXNpX3R5cGU9PSJJbnRlbDY0OzEwMzMiOgorICAgICAgICBzcWxpdGVfYXJjaCA9ICIvaWE2NCIKKyAgICBlbGlmIG1zaWxpYi5tc2lfdHlwZT09Ing2NDsxMDMzIjoKKyAgICAgICAgc3FsaXRlX2FyY2ggPSAiL2FtZDY0IgorICAgIGVsc2U6CisgICAgICAgIHNxbGl0ZV9hcmNoID0gIiIKKyAgICBsaWIuYWRkX2ZpbGUoc3JjZGlyKyIvIitzcWxpdGVfZGlyK3NxbGl0ZV9hcmNoKyIvc3FsaXRlMy5kbGwiKQogICAgICMgY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHVua25vd24gZXh0ZW5zaW9ucwogICAgIGZvciBmIGluIGdsb2IuZ2xvYjEoc3JjZGlyKyIvUENCdWlsZCIsICIqLnB5ZCIpOgogICAgICAgICBpZiBmLmVuZHN3aXRoKCJfZC5weWQiKTogY29udGludWUgIyBkZWJ1ZyB2ZXJzaW9uCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvdXVpZHMucHkgYi9Ub29scy9tc2kvdXVpZHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3ZTYwNAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL21zaS91dWlkcy5weQpAQCAtMCwwICsxLDMzIEBACisjIFRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBlYWNoIFB5dGhvbiByZWxlYXNlLgorIyBUaGUgcHJvZHVjdCBjb2RlIG11c3QgY2hhbmdlIHdoZW5ldmVyIHRoZSBuYW1lIG9mIHRoZSBNU0kgZmlsZQorIyBjaGFuZ2VzLCBhbmQgd2hlbiBuZXcgY29tcG9uZW50IGNvZGVzIGFyZSBpc3N1ZWQgZm9yIGV4aXN0aW5nCisjIGNvbXBvbmVudHMuIFNlZSAiQ2hhbmdpbmcgdGhlIFByb2R1Y3QgQ29kZSIuIEFzIHdlIGNoYW5nZSB0aGUKKyMgY29tcG9uZW50IGNvZGVzIHdpdGggZXZlcnkgYnVpbGQsIHdlIG5lZWQgYSBuZXcgcHJvZHVjdCBjb2RlCisjIGVhY2ggdGltZS4gRm9yIGludGVybWVkaWF0ZSAoc25hcHNob3QpIHJlbGVhc2VzLCB0aGV5IGFyZSBhdXRvbWF0aWNhbGx5CisjIGdlbmVyYXRlZC4gRm9yIG9mZmljaWFsIHJlbGVhc2VzLCB3ZSByZWNvcmQgdGhlIHByb2R1Y3QgY29kZXMsCisjIHNvIHBlb3BsZSBjYW4gcmVmZXIgdG8gdGhlbS4KK3Byb2R1Y3RfY29kZXMgPSB7CisgICAgJzIuNC4xMDEnOiAnezBlOWI0ZDhlLTZjZGEtNDQ2ZS1hMjA4LTdiOTJmM2RkZmZhMH0nLCAjIDIuNGExLCByZWxlYXNlZCBhcyBhIHNuYXBzaG90CisgICAgJzIuNC4xMDInOiAnezFiOTk4NzQ1LTQ5MDEtNGVkYi1iYzUyLTIxMzY4OWUxYjkyMn0nLCAjIDIuNGEyCisgICAgJzIuNC4xMDMnOiAnezMzZmM4YmQyLTFlOGYtNGFkZC1hNDBhLWFkZTI3MjhkNTk0Mn0nLCAjIDIuNGEzCisgICAgJzIuNC4xMTEnOiAnezUxYTdlMmE4LTIwMjUtNGVmMC04NmZmLWU2YWFiNzQyZDFmYX0nLCAjIDIuNGIxCisgICAgJzIuNC4xMTInOiAnezRhNWU3YzFkLWM2NTktNGZlMy1iOGM5LTdjNjViZDljOTVhNX0nLCAjIDIuNGIyCisgICAgJzIuNC4xMjEnOiAnezc1NTA4ODIxLWE4ZTktNDBhOC05NWJkLWRiZTYwMzNkZGJlYX0nLCAjIDIuNGMxCisgICAgJzIuNC4xMjInOiAnezgzYTkxMThiLTRiZGQtNDczYi1hZmMzLWJjYjE0MmZlY2E5ZX0nLCAjIDIuNGMyCisgICAgJzIuNC4xNTAnOiAnezgyZDkzMDJlLWYyMDktNDgwNS1iNTQ4LTUyMDg3MDQ3NDgzYX0nLCAjIDIuNC4wCisgICAgJzIuNC4xMTIxJzone2JlMDI3NDExLThlNmItNDQ0MC1hMjliLWIwN2RmMDY5MDIzMH0nLCAjIDIuNC4xYzEKKyAgICAnMi40LjExMjInOid7MDI4MTg3NTItNDhiZi00MDc0LWEyODEtN2E0MTE0YzRmMWIxfScsICMgMi40LjFjMgorICAgICcyLjQuMTE1MCc6J3s0ZDRmNTM0Ni03ZTRhLTQwYjUtOTM4Ny1mZGI2MTgxMzU3ZmN9JywgIyAyLjQuMQorICAgICcyLjQuMjEyMSc6J3s1ZWY5ZDZiNi1kZjc4LTQ1ZDItYWIwOS0xNDc4NmEzYzVhOTl9JywgIyAyLjQuMmMxCisgICAgJzIuNC4yMTUwJzone2IxOTFlNDljLWVhMjMtNDNiMi1iMjhhLTE0ZTA3ODQwNjliOH0nLCAjIDIuNC4yCisgICAgJzIuNC4zMTIxJzone2Y2NjllZDRkLTFkY2UtNDFjNC05NjE3LWQ5ODUzOTcxODdhMX0nLCAjIDIuNC4zYzEKKyAgICAnMi40LjMxNTAnOid7NzVlNzFhZGQtMDQyYy00ZjMwLWJmYWMtYTllYzQyMzUxMzEzfScsICMgMi40LjMKKyAgICAnMi41LjEwMSc6ICd7YmMxNGNlM2UtNWU3Mi00YTY0LWFjMWYtYmY1OWE1NzE4OThjfScsICMgMi41YTEKKyAgICAnMi41LjEwMic6ICd7NWVlZDUxYzEtOGU5ZC00MDcxLTk0YzUtYjQwZGU1ZDQ5YmE1fScsICMgMi41YTIKKyAgICAnMi41LjEwMyc6ICd7NzNkY2Q5NjYtZmZlYy00MTVmLWJiMzktODM0MmMxZjQ3MDE3fScsICMgMi41YTMKKyAgICAnMi41LjExMSc6ICd7Yzc5N2VjZjgtYThlNi00ZmVjLWJiOTktNTI2YjY1ZjI4NjI2fScsICMgMi41YjEKKyAgICAnMi41LjExMic6ICd7MzJiZWI3NzQtZjYyNS00MzlkLWI1ODctNzE4NzQ4N2JhZjE1fScsICMgMi41YjIKKyAgICAnMi41LjEyMSc6ICd7OGU5MzIxYmMtNmIyNC00OGEzLThmZDQtYzk1ZjhlNTMxZTVmfScsICMgMi41YzEKKyAgICAnMi41LjEyMic6ICd7YTZjZDUwOGQtOTU5OS00NWRhLWE0NDEtY2JmZmE5ZjdlMDcwfScsICMgMi41YzIKKyAgICAnMi41LjE1MCc6ICd7MGEyYzU4NTQtNTU3ZS00OGM4LTgzNWEtM2I5ZjA3NGJkY2FhfScsICMgMi41LjAKK30KZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvQXJpdGhtZXRpYy5weSBiL1Rvb2xzL3B5YmVuY2gvQXJpdGhtZXRpYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTVjMzBhCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcHliZW5jaC9Bcml0aG1ldGljLnB5CkBAIC0wLDAgKzEsNzc4IEBACitmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKKworY2xhc3MgU2ltcGxlSW50ZWdlckFyaXRobWV0aWMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQorICAgIHJvdW5kcyA9IDEyMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgYSA9IDIKKyAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICBjID0gMworCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgYiA9IDMKKyAgICAgICAgICAgIGMgPSAzCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGEgPSAyCisgICAgICAgICAgICBiID0gMworICAgICAgICAgICAgYyA9IDMKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYSA9IDIKKyAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICBjID0gMworCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgYiA9IDMKKyAgICAgICAgICAgIGMgPSAzCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIFNpbXBsZUZsb2F0QXJpdGhtZXRpYyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gNSAqICgzICsgNSArIDUgKyAzICsgMyArIDMpCisgICAgcm91bmRzID0gMTAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBhID0gMi4xCisgICAgICAgICAgICBiID0gMy4zMzMyCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMi4xCisgICAgICAgICAgICBiID0gMy4zMzMyCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMi4xCisgICAgICAgICAgICBiID0gMy4zMzMyCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMi4xCisgICAgICAgICAgICBiID0gMy4zMzMyCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMi4xCisgICAgICAgICAgICBiID0gMy4zMzMyCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBTaW1wbGVJbnRGbG9hdEFyaXRobWV0aWMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQorICAgIHJvdW5kcyA9IDEyMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgYSA9IDIKKyAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgYiA9IDMKKyAgICAgICAgICAgIGMgPSAzLjE0MTU5CisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGEgPSAyCisgICAgICAgICAgICBiID0gMworICAgICAgICAgICAgYyA9IDMuMTQxNTkKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYSA9IDIKKyAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgYiA9IDMKKyAgICAgICAgICAgIGMgPSAzLjE0MTU5CisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKKworY2xhc3MgU2ltcGxlTG9uZ0FyaXRobWV0aWMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQorICAgIHJvdW5kcyA9IDMwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBhID0gMjIyMDAwMUwKKyAgICAgICAgICAgIGIgPSAxMDAwMDFMCisgICAgICAgICAgICBjID0gMzAwMDVMCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGEgPSAyMjIwMDAxTAorICAgICAgICAgICAgYiA9IDEwMDAwMUwKKyAgICAgICAgICAgIGMgPSAzMDAwNUwKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYSA9IDIyMjAwMDFMCisgICAgICAgICAgICBiID0gMTAwMDAxTAorICAgICAgICAgICAgYyA9IDMwMDA1TAorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMjIyMDAwMUwKKyAgICAgICAgICAgIGIgPSAxMDAwMDFMCisgICAgICAgICAgICBjID0gMzAwMDVMCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGEgPSAyMjIwMDAxTAorICAgICAgICAgICAgYiA9IDEwMDAwMUwKKyAgICAgICAgICAgIGMgPSAzMDAwNUwKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgU2ltcGxlQ29tcGxleEFyaXRobWV0aWMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQorICAgIHJvdW5kcyA9IDQwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBhID0gMiArIDNqCisgICAgICAgICAgICBiID0gMi41ICsgNC41agorICAgICAgICAgICAgYyA9IDEuMiArIDYuMmoKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYSA9IDIgKyAzagorICAgICAgICAgICAgYiA9IDIuNSArIDQuNWoKKyAgICAgICAgICAgIGMgPSAxLjIgKyA2LjJqCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGEgPSAyICsgM2oKKyAgICAgICAgICAgIGIgPSAyLjUgKyA0LjVqCisgICAgICAgICAgICBjID0gMS4yICsgNi4yagorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMiArIDNqCisgICAgICAgICAgICBiID0gMi41ICsgNC41agorICAgICAgICAgICAgYyA9IDEuMiArIDYuMmoKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYSA9IDIgKyAzagorICAgICAgICAgICAgYiA9IDIuNSArIDQuNWoKKyAgICAgICAgICAgIGMgPSAxLjIgKyA2LjJqCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvQ2FsbHMucHkgYi9Ub29scy9weWJlbmNoL0NhbGxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTdhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL0NhbGxzLnB5CkBAIC0wLDAgKzEsNDEwIEBACitmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKKworY2xhc3MgUHl0aG9uRnVuY3Rpb25DYWxscyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gNSooMSs0KzQrMikKKyAgICByb3VuZHMgPSA2MDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZ2xvYmFsIGYsZjEsZyxoCisKKyAgICAgICAgIyBkZWZpbmUgZnVuY3Rpb25zCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIGYxKHgpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBnKGEsYixjKToKKyAgICAgICAgICAgIHJldHVybiBhLGIsYworCisgICAgICAgIGRlZiBoKGEsYixjLGQ9MSxlPTIsZj0zKToKKyAgICAgICAgICAgIHJldHVybiBkLGUsZgorCisgICAgICAgICMgZG8gY2FsbHMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGcoaSxpLGkpCisgICAgICAgICAgICBnKGksaSxpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGgoaSxpLDMsaSxpKQorICAgICAgICAgICAgaChpLGksaSwyLGksMykKKworICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGcoaSxpLGkpCisgICAgICAgICAgICBnKGksaSxpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGgoaSxpLDMsaSxpKQorICAgICAgICAgICAgaChpLGksaSwyLGksMykKKworICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGcoaSxpLGkpCisgICAgICAgICAgICBnKGksaSxpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGgoaSxpLDMsaSxpKQorICAgICAgICAgICAgaChpLGksaSwyLGksMykKKworICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGcoaSxpLGkpCisgICAgICAgICAgICBnKGksaSxpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGgoaSxpLDMsaSxpKQorICAgICAgICAgICAgaChpLGksaSwyLGksMykKKworICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGcoaSxpLGkpCisgICAgICAgICAgICBnKGksaSxpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGgoaSxpLDMsaSxpKQorICAgICAgICAgICAgaChpLGksaSwyLGksMykKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZ2xvYmFsIGYsZjEsZyxoCisKKyAgICAgICAgIyBkZWZpbmUgZnVuY3Rpb25zCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIGYxKHgpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBnKGEsYixjKToKKyAgICAgICAgICAgIHJldHVybiBhLGIsYworCisgICAgICAgIGRlZiBoKGEsYixjLGQ9MSxlPTIsZj0zKToKKyAgICAgICAgICAgIHJldHVybiBkLGUsZgorCisgICAgICAgICMgZG8gY2FsbHMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworIyMjCisKK2NsYXNzIEJ1aWx0aW5GdW5jdGlvbkNhbGxzKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuNAorICAgIG9wZXJhdGlvbnMgPSA1KigyKzUrNSs1KQorICAgIHJvdW5kcyA9IDMwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICAjIGxvY2FsaXplIGZ1bmN0aW9ucworICAgICAgICBmMCA9IGdsb2JhbHMKKyAgICAgICAgZjEgPSBoYXNoCisgICAgICAgIGYyID0gY21wCisgICAgICAgIGYzID0gcmFuZ2UKKworICAgICAgICAjIGRvIGNhbGxzCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIGYwKCkKKyAgICAgICAgICAgIGYwKCkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKworICAgICAgICAgICAgZjAoKQorICAgICAgICAgICAgZjAoKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorCisgICAgICAgICAgICBmMCgpCisgICAgICAgICAgICBmMCgpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYyKDEsMikKKyAgICAgICAgICAgIGYyKDEsMikKKyAgICAgICAgICAgIGYyKDEsMikKKyAgICAgICAgICAgIGYyKDEsMikKKyAgICAgICAgICAgIGYyKDEsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisKKyAgICAgICAgICAgIGYwKCkKKyAgICAgICAgICAgIGYwKCkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKworICAgICAgICAgICAgZjAoKQorICAgICAgICAgICAgZjAoKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICAjIGxvY2FsaXplIGZ1bmN0aW9ucworICAgICAgICBmMCA9IGRpcgorICAgICAgICBmMSA9IGhhc2gKKyAgICAgICAgZjIgPSByYW5nZQorICAgICAgICBmMyA9IHJhbmdlCisKKyAgICAgICAgIyBkbyBjYWxscworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCisjIyMKKworY2xhc3MgUHl0aG9uTWV0aG9kQ2FsbHMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA1ICsgNCkKKyAgICByb3VuZHMgPSAyMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgY2xhc3MgYzoKKworICAgICAgICAgICAgeCA9IDIKKyAgICAgICAgICAgIHMgPSAnc3RyaW5nJworCisgICAgICAgICAgICBkZWYgZihzZWxmKToKKworICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLngKKworICAgICAgICAgICAgZGVmIGooc2VsZixhLGIpOgorCisgICAgICAgICAgICAgICAgc2VsZi55ID0gYQorICAgICAgICAgICAgICAgIHNlbGYudCA9IGIKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi55CisKKyAgICAgICAgICAgIGRlZiBrKHNlbGYsYSxiLGM9Myk6CisKKyAgICAgICAgICAgICAgICBzZWxmLnkgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5zID0gYgorICAgICAgICAgICAgICAgIHNlbGYudCA9IGMKKworICAgICAgICBvID0gYygpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5qKGksaSkKKyAgICAgICAgICAgIG8uaihpLGkpCisgICAgICAgICAgICBvLmooaSwyKQorICAgICAgICAgICAgby5qKGksMikKKyAgICAgICAgICAgIG8uaigyLDIpCisgICAgICAgICAgICBvLmsoaSxpKQorICAgICAgICAgICAgby5rKGksMikKKyAgICAgICAgICAgIG8uayhpLDIsMykKKyAgICAgICAgICAgIG8uayhpLGksYz00KQorCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmooaSxpKQorICAgICAgICAgICAgby5qKGksaSkKKyAgICAgICAgICAgIG8uaihpLDIpCisgICAgICAgICAgICBvLmooaSwyKQorICAgICAgICAgICAgby5qKDIsMikKKyAgICAgICAgICAgIG8uayhpLGkpCisgICAgICAgICAgICBvLmsoaSwyKQorICAgICAgICAgICAgby5rKGksMiwzKQorICAgICAgICAgICAgby5rKGksaSxjPTQpCisKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uaihpLGkpCisgICAgICAgICAgICBvLmooaSxpKQorICAgICAgICAgICAgby5qKGksMikKKyAgICAgICAgICAgIG8uaihpLDIpCisgICAgICAgICAgICBvLmooMiwyKQorICAgICAgICAgICAgby5rKGksaSkKKyAgICAgICAgICAgIG8uayhpLDIpCisgICAgICAgICAgICBvLmsoaSwyLDMpCisgICAgICAgICAgICBvLmsoaSxpLGM9NCkKKworICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5qKGksaSkKKyAgICAgICAgICAgIG8uaihpLGkpCisgICAgICAgICAgICBvLmooaSwyKQorICAgICAgICAgICAgby5qKGksMikKKyAgICAgICAgICAgIG8uaigyLDIpCisgICAgICAgICAgICBvLmsoaSxpKQorICAgICAgICAgICAgby5rKGksMikKKyAgICAgICAgICAgIG8uayhpLDIsMykKKyAgICAgICAgICAgIG8uayhpLGksYz00KQorCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmooaSxpKQorICAgICAgICAgICAgby5qKGksaSkKKyAgICAgICAgICAgIG8uaihpLDIpCisgICAgICAgICAgICBvLmooaSwyKQorICAgICAgICAgICAgby5qKDIsMikKKyAgICAgICAgICAgIG8uayhpLGkpCisgICAgICAgICAgICBvLmsoaSwyKQorICAgICAgICAgICAgby5rKGksMiwzKQorICAgICAgICAgICAgby5rKGksaSxjPTQpCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisKKyAgICAgICAgICAgIHggPSAyCisgICAgICAgICAgICBzID0gJ3N0cmluZycKKworICAgICAgICAgICAgZGVmIGYoc2VsZik6CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi54CisKKyAgICAgICAgICAgIGRlZiBqKHNlbGYsYSxiKToKKworICAgICAgICAgICAgICAgIHNlbGYueSA9IGEKKyAgICAgICAgICAgICAgICBzZWxmLnQgPSBiCisKKyAgICAgICAgICAgIGRlZiBrKHNlbGYsYSxiLGM9Myk6CisKKyAgICAgICAgICAgICAgICBzZWxmLnkgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5zID0gYgorICAgICAgICAgICAgICAgIHNlbGYudCA9IGMKKworICAgICAgICBvID0gYworCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKKyMjIworCitjbGFzcyBSZWN1cnNpb24oVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUKKyAgICByb3VuZHMgPSA1MDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZ2xvYmFsIGYKKworICAgICAgICBkZWYgZih4KToKKworICAgICAgICAgICAgaWYgeCA+IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIGYoeC0xKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgZigxMCkKKyAgICAgICAgICAgIGYoMTApCisgICAgICAgICAgICBmKDEwKQorICAgICAgICAgICAgZigxMCkKKyAgICAgICAgICAgIGYoMTApCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGdsb2JhbCBmCisKKyAgICAgICAgZGVmIGYoeCk6CisKKyAgICAgICAgICAgIGlmIHggPiAwOgorICAgICAgICAgICAgICAgIHJldHVybiBmKHgtMSkKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKwpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9Db21tYW5kTGluZS5weSBiL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3ZTA3YgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkKQEAgLTAsMCArMSw2MzQgQEAKKyIiIiBDb21tYW5kTGluZSAtIEdldCBhbmQgcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKKworICAgIE5PVEU6IFRoaXMgc3RpbGwgaXMgdmVyeSBtdWNoIHdvcmsgaW4gcHJvZ3Jlc3MgISEhCisKKyAgICBEaWZmZXJlbnQgdmVyc2lvbiBhcmUgbGlrZWx5IHRvIGJlIGluY29tcGF0aWJsZS4KKworICAgIFRPRE86CisKKyAgICAqIEluY29ycG9yYXRlIHRoZSBjaGFuZ2VzIG1hZGUgYnkgKHNlZSBJbmJveCkKKyAgICAqIEFkZCBudW1iZXIgcmFuZ2Ugb3B0aW9uIHVzaW5nIHNyYW5nZSgpIAorCisiIiIKKworX19jb3B5cmlnaHRfXyA9ICIiIlwKK0NvcHlyaWdodCAoYyksIDE5OTctMjAwNiwgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pCitDb3B5cmlnaHQgKGMpLCAyMDAwLTIwMDYsIGVHZW5peC5jb20gU29mdHdhcmUgR21iSCAoaW5mb0BlZ2VuaXguY29tKQorU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGNvcHlyaWdodHMsCitvciBjb250YWN0IHRoZSBhdXRob3IuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisiIiIKKworX192ZXJzaW9uX18gPSAnMS4yJworCitpbXBvcnQgc3lzLCBnZXRvcHQsIHN0cmluZywgZ2xvYiwgb3MsIHJlLCBleGNlcHRpb25zLCB0cmFjZWJhY2sKKworIyMjIEhlbHBlcnMKKworZGVmIF9nZXRvcHRfZmxhZ3Mob3B0aW9ucyk6CisKKyAgICAiIiIgQ29udmVydCB0aGUgb3B0aW9uIGxpc3QgdG8gYSBnZXRvcHQgZmxhZyBzdHJpbmcgYW5kIGxvbmcgb3B0CisgICAgICAgIGxpc3QKKworICAgICIiIgorICAgIHMgPSBbXQorICAgIGwgPSBbXQorICAgIGZvciBvIGluIG9wdGlvbnM6CisgICAgICAgIGlmIG8ucHJlZml4ID09ICctJzoKKyAgICAgICAgICAgICMgc2hvcnQgb3B0aW9uCisgICAgICAgICAgICBzLmFwcGVuZChvLm5hbWUpCisgICAgICAgICAgICBpZiBvLnRha2VzX2FyZ3VtZW50OgorICAgICAgICAgICAgICAgIHMuYXBwZW5kKCc6JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbG9uZyBvcHRpb24KKyAgICAgICAgICAgIGlmIG8udGFrZXNfYXJndW1lbnQ6CisgICAgICAgICAgICAgICAgbC5hcHBlbmQoby5uYW1lKyc9JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbC5hcHBlbmQoby5uYW1lKQorICAgIHJldHVybiBzdHJpbmcuam9pbihzLCcnKSxsCisKK2RlZiBpbnZpc2libGVfaW5wdXQocHJvbXB0PSc+Pj4gJyk6CisKKyAgICAiIiIgR2V0IHJhdyBpbnB1dCBmcm9tIGEgdGVybWluYWwgd2l0aG91dCBlY2hvaW5nIHRoZSBjaGFyYWN0ZXJzIHRvCisgICAgICAgIHRoZSB0ZXJtaW5hbCwgZS5nLiBmb3IgcGFzc3dvcmQgcXVlcmllcy4KKworICAgICIiIgorICAgIGltcG9ydCBnZXRwYXNzCisgICAgZW50cnkgPSBnZXRwYXNzLmdldHBhc3MocHJvbXB0KQorICAgIGlmIGVudHJ5IGlzIE5vbmU6CisgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgcmV0dXJuIGVudHJ5CisKK2RlZiBmaWxlb3BlbihuYW1lLCBtb2RlPSd3YicsIGVuY29kaW5nPU5vbmUpOgorCisgICAgIiIiIE9wZW4gYSBmaWxlIHVzaW5nIG1vZGUuCisKKyAgICAgICAgRGVmYXVsdCBtb2RlIGlzICd3YicgbWVhbmluZyB0byBvcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nIGluCisgICAgICAgIGJpbmFyeSBtb2RlLiBJZiBlbmNvZGluZyBpcyBnaXZlbiwgSS9PIHRvIGFuZCBmcm9tIHRoZSBmaWxlIGlzCisgICAgICAgIHRyYW5zcGFyZW50bHkgZW5jb2RlZCB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcuCisKKyAgICAgICAgRmlsZXMgb3BlbmVkIGZvciB3cml0aW5nIGFyZSBjaG1vZCgpZWQgdG8gMDYwMC4KKworICAgICIiIgorICAgIGlmIG5hbWUgPT0gJ3N0ZG91dCc6CisgICAgICAgIHJldHVybiBzeXMuc3Rkb3V0CisgICAgZWxpZiBuYW1lID09ICdzdGRlcnInOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGVycgorICAgIGVsaWYgbmFtZSA9PSAnc3RkaW4nOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGluCisgICAgZWxzZToKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgY29kZWNzCisgICAgICAgICAgICBmID0gY29kZWNzLm9wZW4obmFtZSwgbW9kZSwgZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmID0gb3BlbihuYW1lLCBtb2RlKQorICAgICAgICBpZiAndycgaW4gbW9kZToKKyAgICAgICAgICAgIG9zLmNobW9kKG5hbWUsIDA2MDApCisgICAgICAgIHJldHVybiBmCisKK2RlZiBvcHRpb25fZGljdChvcHRpb25zKToKKworICAgICIiIiBSZXR1cm4gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgb3B0aW9uIG5hbWVzIHRvIE9wdGlvbiBpbnN0YW5jZXMuCisgICAgIiIiCisgICAgZCA9IHt9CisgICAgZm9yIG9wdGlvbiBpbiBvcHRpb25zOgorICAgICAgICBkW29wdGlvbi5uYW1lXSA9IG9wdGlvbgorICAgIHJldHVybiBkCisKKyMgQWxpYXMKK2dldHBhc3N3ZCA9IGludmlzaWJsZV9pbnB1dAorCitfaW50ZWdlclJFID0gcmUuY29tcGlsZSgnXHMqKC0/XGQrKVxzKiQnKQorX2ludGVnZXJSYW5nZVJFID0gcmUuY29tcGlsZSgnXHMqKC0/XGQrKVxzKi1ccyooLT9cZCspXHMqJCcpCisKK2RlZiBzcmFuZ2UocywKKworICAgICAgICAgICBzcGxpdD1zdHJpbmcuc3BsaXQsaW50ZWdlcj1faW50ZWdlclJFLAorICAgICAgICAgICBpbnRlZ2VyUmFuZ2U9X2ludGVnZXJSYW5nZVJFKToKKworICAgICIiIiBDb252ZXJ0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgaW50ZWdlciBudW1iZXJzIGFuZCByYW5nZXMKKyAgICAgICAgdG8gYSBQeXRob24gbGlzdC4KKworICAgICAgICBTdXBwb3J0ZWQgZm9ybWF0czogMiwzLDQsMi0xMCwtMSAtIC0zLCA1IC0gLTIKKworICAgICAgICBWYWx1ZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBjcmVhdGVkIGxpc3QgaW4gdGhlIG9yZGVyIHNwZWNpZmllZAorICAgICAgICBpbiB0aGUgc3RyaW5nLgorCisgICAgIiIiCisgICAgbCA9IFtdCisgICAgYXBwZW5kID0gbC5hcHBlbmQKKyAgICBmb3IgZW50cnkgaW4gc3BsaXQocywnLCcpOgorICAgICAgICBtID0gaW50ZWdlci5tYXRjaChlbnRyeSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIGFwcGVuZChpbnQobS5ncm91cHMoKVswXSkpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBtID0gaW50ZWdlclJhbmdlLm1hdGNoKGVudHJ5KQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgc3RhcnQsZW5kID0gbWFwKGludCxtLmdyb3VwcygpKQorICAgICAgICAgICAgbFtsZW4obCk6XSA9IHJhbmdlKHN0YXJ0LGVuZCsxKQorICAgIHJldHVybiBsCisKK2RlZiBhYnNwYXRoKHBhdGgsCisKKyAgICAgICAgICAgIGV4cGFuZHZhcnM9b3MucGF0aC5leHBhbmR2YXJzLGV4cGFuZHVzZXI9b3MucGF0aC5leHBhbmR1c2VyLAorICAgICAgICAgICAgam9pbj1vcy5wYXRoLmpvaW4sZ2V0Y3dkPW9zLmdldGN3ZCk6CisKKyAgICAiIiIgUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFic29sdXRlIHBhdGggZm9yIHBhdGguCisKKyAgICAgICAgcGF0aCBpcyBleHBhbmRlZCBpbiB0aGUgdXN1YWwgc2hlbGwgd2F5cyBiZWZvcmUKKyAgICAgICAgam9pbmluZyBpdCB3aXRoIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBwYXRoID0gZXhwYW5kdmFycyhwYXRoKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIHRyeToKKyAgICAgICAgcGF0aCA9IGV4cGFuZHVzZXIocGF0aCkKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gam9pbihnZXRjd2QoKSwgcGF0aCkKKworIyMjIE9wdGlvbiBjbGFzc2VzCisKK2NsYXNzIE9wdGlvbjoKKworICAgICIiIiBPcHRpb24gYmFzZSBjbGFzcy4gVGFrZXMgbm8gYXJndW1lbnQuCisKKyAgICAiIiIKKyAgICBkZWZhdWx0ID0gTm9uZQorICAgIGhlbHB0ZXh0ID0gJycKKyAgICBwcmVmaXggPSAnLScKKyAgICB0YWtlc19hcmd1bWVudCA9IDAKKyAgICBoYXNfZGVmYXVsdCA9IDAKKyAgICB0YWIgPSAxNQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsbmFtZSxoZWxwPU5vbmUpOgorCisgICAgICAgIGlmIG5vdCBuYW1lWzoxXSA9PSAnLSc6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsJ29wdGlvbiBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggIi0iJworICAgICAgICBpZiBuYW1lWzE6Ml0gPT0gJy0nOgorICAgICAgICAgICAgc2VsZi5wcmVmaXggPSAnLS0nCisgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lWzI6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gbmFtZVsxOl0KKyAgICAgICAgaWYgaGVscDoKKyAgICAgICAgICAgIHNlbGYuaGVscCA9IGhlbHAKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorCisgICAgICAgIG8gPSBzZWxmCisgICAgICAgIG5hbWUgPSBvLnByZWZpeCArIG8ubmFtZQorICAgICAgICBpZiBvLnRha2VzX2FyZ3VtZW50OgorICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnIGFyZycKKyAgICAgICAgaWYgbGVuKG5hbWUpID4gc2VsZi50YWI6CisgICAgICAgICAgICBuYW1lID0gbmFtZSArICdcbicgKyAnICcgKiAoc2VsZi50YWIgKyAxICsgbGVuKG8ucHJlZml4KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSAnJS0qcyAnICUgKHNlbGYudGFiLCBuYW1lKQorICAgICAgICBkZXNjcmlwdGlvbiA9IG8uaGVscAorICAgICAgICBpZiBvLmhhc19kZWZhdWx0OgorICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiArICcgKCVzKScgJSBvLmRlZmF1bHQKKyAgICAgICAgcmV0dXJuICclcyAlcycgJSAobmFtZSwgZGVzY3JpcHRpb24pCisKK2NsYXNzIEFyZ3VtZW50T3B0aW9uKE9wdGlvbik6CisKKyAgICAiIiIgT3B0aW9uIHRoYXQgdGFrZXMgYW4gYXJndW1lbnQuCisKKyAgICAgICAgQW4gb3B0aW9uYWwgZGVmYXVsdCBhcmd1bWVudCBjYW4gYmUgZ2l2ZW4uCisgICAgICAgIAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLG5hbWUsaGVscD1Ob25lLGRlZmF1bHQ9Tm9uZSk6CisKKyAgICAgICAgIyBCYXNlbWV0aG9kCisgICAgICAgIE9wdGlvbi5fX2luaXRfXyhzZWxmLG5hbWUsaGVscCkKKworICAgICAgICBpZiBkZWZhdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kZWZhdWx0ID0gZGVmYXVsdAorICAgICAgICAgICAgc2VsZi5oYXNfZGVmYXVsdCA9IDEKKyAgICAgICAgc2VsZi50YWtlc19hcmd1bWVudCA9IDEKKworY2xhc3MgU3dpdGNoT3B0aW9uKE9wdGlvbik6CisKKyAgICAiIiIgT3B0aW9ucyB0aGF0IGNhbiBiZSBvbiBvciBvZmYuIEhhcyBhbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlLgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsbmFtZSxoZWxwPU5vbmUsZGVmYXVsdD1Ob25lKToKKworICAgICAgICAjIEJhc2VtZXRob2QKKyAgICAgICAgT3B0aW9uLl9faW5pdF9fKHNlbGYsbmFtZSxoZWxwKQorCisgICAgICAgIGlmIGRlZmF1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmRlZmF1bHQgPSBkZWZhdWx0CisgICAgICAgICAgICBzZWxmLmhhc19kZWZhdWx0ID0gMQorCisjIyMgQXBwbGljYXRpb24gYmFzZWNsYXNzCisKK2NsYXNzIEFwcGxpY2F0aW9uOgorCisgICAgIiIiIENvbW1hbmQgbGluZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2Ugd2l0aCBidWlsdGluIGFyZ3VtZW50CisgICAgICAgIHBhcnNpbmcuCisKKyAgICAiIiIKKyAgICAjIE9wdGlvbnMgdGhlIHByb2dyYW0gYWNjZXB0cyAoT3B0aW9uIGluc3RhbmNlcykKKyAgICBvcHRpb25zID0gW10KKworICAgICMgU3RhbmRhcmQgc2V0dGluZ3M7IHRoZXNlIGFyZSBhcHBlbmRlZCB0byBvcHRpb25zIGluIF9faW5pdF9fCisgICAgcHJlc2V0X29wdGlvbnMgPSBbU3dpdGNoT3B0aW9uKCctdicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZW5lcmF0ZSB2ZXJib3NlIG91dHB1dCcpLAorICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLWgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvdyB0aGlzIGhlbHAgdGV4dCcpLAorICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLS1oZWxwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3cgdGhpcyBoZWxwIHRleHQnKSwKKyAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy0tZGVidWcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5hYmxlIGRlYnVnZ2luZycpLAorICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLS1jb3B5cmlnaHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvdyBjb3B5cmlnaHQnKSwKKyAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy0tZXhhbXBsZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvdyBleGFtcGxlcyBvZiB1c2FnZScpXQorCisgICAgIyBUaGUgaGVscCBsYXlvdXQgbG9va3MgbGlrZSB0aGlzOgorICAgICMgW2hlYWRlcl0gICAtIGRlZmF1bHRzIHRvICcnCisgICAgIworICAgICMgW3N5bm9wc2lzXSAtIGZvcm1hdHRlZCBhcyAnPHNlbGYubmFtZT4gJXMnICUgc2VsZi5zeW5vcHNpcworICAgICMKKyAgICAjIG9wdGlvbnM6CisgICAgIyBbb3B0aW9uc10gIC0gZm9ybWF0dGVkIGZyb20gc2VsZi5vcHRpb25zCisgICAgIworICAgICMgW3ZlcnNpb25dICAtIGZvcm1hdHRlZCBhcyAnVmVyc2lvbjpcbiAlcycgJSBzZWxmLnZlcnNpb24sIGlmIGdpdmVuCisgICAgIworICAgICMgW2Fib3V0XSAgICAtIGRlZmF1bHRzIHRvICcnCisgICAgIworICAgICMgTm90ZTogYWxsIGZpZWxkcyB0aGF0IGRvIG5vdCBiZWhhdmUgYXMgdGVtcGxhdGUgYXJlIGZvcm1hdHRlZAorICAgICMgICAgICAgdXNpbmcgdGhlIGluc3RhbmNlcyBkaWN0aW9uYXJ5IGFzIHN1YnN0aXR1dGlvbiBuYW1lc3BhY2UsCisgICAgIyAgICAgICBlLmcuICUobmFtZSlzIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFwcGxpY2F0aW9ucyBuYW1lLgorICAgICMKKworICAgICMgSGVhZGVyIChkZWZhdWx0IHRvIHByb2dyYW0gbmFtZSkKKyAgICBoZWFkZXIgPSAnJworCisgICAgIyBOYW1lIChkZWZhdWx0cyB0byBwcm9ncmFtIG5hbWUpCisgICAgbmFtZSA9ICcnCisKKyAgICAjIFN5bm9wc2lzICglKG5hbWUpcyBpcyByZXBsYWNlZCBieSB0aGUgcHJvZ3JhbSBuYW1lKQorICAgIHN5bm9wc2lzID0gJyUobmFtZSlzIFtvcHRpb25dIGZpbGVzLi4uJworCisgICAgIyBWZXJzaW9uIChvcHRpb25hbCkKKyAgICB2ZXJzaW9uID0gJycKKworICAgICMgR2VuZXJhbCBpbmZvcm1hdGlvbiBwcmludGVkIGFmdGVyIHRoZSBwb3NzaWJsZSBvcHRpb25zIChvcHRpb25hbCkKKyAgICBhYm91dCA9ICcnCisKKyAgICAjIEV4YW1wbGVzIG9mIHVzYWdlIHRvIHNob3cgd2hlbiB0aGUgLS1leGFtcGxlcyBvcHRpb24gaXMgZ2l2ZW4gKG9wdGlvbmFsKQorICAgIGV4YW1wbGVzID0gJycKKworICAgICMgQ29weXJpZ2h0IHRvIHNob3cKKyAgICBjb3B5cmlnaHQgPSBfX2NvcHlyaWdodF9fCisKKyAgICAjIEFwcGx5IGZpbGUgZ2xvYmJpbmcgPworICAgIGdsb2JiaW5nID0gMQorCisgICAgIyBHZW5lcmF0ZSBkZWJ1ZyBvdXRwdXQgPworICAgIGRlYnVnID0gMAorCisgICAgIyBHZW5lcmF0ZSB2ZXJib3NlIG91dHB1dCA/CisgICAgdmVyYm9zZSA9IDAKKworICAgICMgSW50ZXJuYWwgZXJyb3JzIHRvIGNhdGNoCisgICAgSW50ZXJuYWxFcnJvciA9IGV4Y2VwdGlvbnMuRXhjZXB0aW9uCisKKyAgICAjIEluc3RhbmNlIHZhcmlhYmxlczoKKyAgICB2YWx1ZXMgPSBOb25lICAgICAgICMgRGljdGlvbmFyeSBvZiBwYXNzZWQgb3B0aW9ucyAob3IgZGVmYXVsdCB2YWx1ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4ZWQgYnkgdGhlIG9wdGlvbnMgbmFtZSwgZS5nLiAnLWgnCisgICAgZmlsZXMgPSBOb25lICAgICAgICAjIExpc3Qgb2YgcGFzc2VkIGZpbGVuYW1lcworICAgIG9wdGlvbmxpc3QgPSBOb25lCSMgTGlzdCBvZiBwYXNzZWQgb3B0aW9ucworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsYXJndj1Ob25lKToKKworICAgICAgICAjIFNldHVwIGFwcGxpY2F0aW9uIHNwZWNzCisgICAgICAgIGlmIGFyZ3YgaXMgTm9uZToKKyAgICAgICAgICAgIGFyZ3YgPSBzeXMuYXJndgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChhcmd2WzBdKVsxXQorICAgICAgICBpZiBub3Qgc2VsZi5uYW1lOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLmZpbGVuYW1lKVsxXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gc2VsZi5uYW1lCisgICAgICAgIGlmIG5vdCBzZWxmLmhlYWRlcjoKKyAgICAgICAgICAgIHNlbGYuaGVhZGVyID0gc2VsZi5uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhlYWRlciA9IHNlbGYuaGVhZGVyCisKKyAgICAgICAgIyBJbml0IC5hcmd1bWVudHMgbGlzdAorICAgICAgICBzZWxmLmFyZ3VtZW50cyA9IGFyZ3ZbMTpdCisgICAgICAgIAorICAgICAgICAjIFNldHVwIE9wdGlvbiBtYXBwaW5nCisgICAgICAgIHNlbGYub3B0aW9uX21hcCA9IG9wdGlvbl9kaWN0KHNlbGYub3B0aW9ucykKKyAgICAgICAgCisgICAgICAgICMgQXBwZW5kIHByZXNldCBvcHRpb25zCisgICAgICAgIGZvciBvcHRpb24gaW4gc2VsZi5wcmVzZXRfb3B0aW9uczoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLm9wdGlvbl9tYXAuaGFzX2tleShvcHRpb24ubmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfb3B0aW9uKG9wdGlvbikKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgIyBJbml0IC5maWxlcyBsaXN0CisgICAgICAgIHNlbGYuZmlsZXMgPSBbXQorCisgICAgICAgICMgU3RhcnQgQXBwbGljYXRpb24KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBQcm9jZXNzIHN0YXJ0dXAKKyAgICAgICAgICAgIHJjID0gc2VsZi5zdGFydHVwKCkKKyAgICAgICAgICAgIGlmIHJjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQscmMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIyBQYXJzZSBjb21tYW5kIGxpbmUKKyAgICAgICAgICAgIHJjID0gc2VsZi5wYXJzZSgpCisgICAgICAgICAgICBpZiByYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LHJjCisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgU3RhcnQgYXBwbGljYXRpb24KKyAgICAgICAgICAgIHJjID0gc2VsZi5tYWluKCkKKyAgICAgICAgICAgIGlmIHJjIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmMgPSAwCisKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQscmM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICcqIFVzZXIgQnJlYWsnCisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcmMgPSAxCisKKyAgICAgICAgZXhjZXB0IHNlbGYuSW50ZXJuYWxFcnJvcjoKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAnKiBJbnRlcm5hbCBFcnJvcicKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKDIwLCBzeXMuc3Rkb3V0KQorICAgICAgICAgICAgZWxpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJyAgJXM6ICVzJyAlIHN5cy5leGNfaW5mbygpWzoyXQorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHJjID0gMQorCisgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQscmMKKworICAgIGRlZiBhZGRfb3B0aW9uKHNlbGYsIG9wdGlvbik6CisKKyAgICAgICAgIiIiIEFkZCBhIG5ldyBPcHRpb24gaW5zdGFuY2UgdG8gdGhlIEFwcGxpY2F0aW9uIGR5bmFtaWNhbGx5LgorCisgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBoYXMgdG8gYmUgZG9uZSAqYmVmb3JlKiAucGFyc2UoKSBpcyBiZWluZworICAgICAgICAgICAgZXhlY3V0ZWQuCisgICAgICAgIAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5vcHRpb25zLmFwcGVuZChvcHRpb24pCisgICAgICAgIHNlbGYub3B0aW9uX21hcFtvcHRpb24ubmFtZV0gPSBvcHRpb24KKworICAgIGRlZiBzdGFydHVwKHNlbGYpOgorCisgICAgICAgICIiIiBTZXQgdXNlciBkZWZpbmVkIGluc3RhbmNlIHZhcmlhYmxlcy4KKworICAgICAgICAgICAgSWYgdGhpcyBtZXRob2QgcmV0dXJucyBhbnl0aGluZyBvdGhlciB0aGFuIE5vbmUsIHRoZQorICAgICAgICAgICAgcHJvY2VzcyBpcyB0ZXJtaW5hdGVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBhcyBleGl0IGNvZGUuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZXhpdChzZWxmLCByYz0wKToKKworICAgICAgICAiIiIgRXhpdCB0aGUgcHJvZ3JhbS4KKworICAgICAgICAgICAgcmMgaXMgdXNlZCBhcyBleGl0IGNvZGUgYW5kIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsaW5nCisgICAgICAgICAgICBwcm9ncmFtLiBJdCBkZWZhdWx0cyB0byAwIHdoaWNoIHVzdWFsbHkgbWVhbnM6IE9LLgorCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCByYworCisgICAgZGVmIHBhcnNlKHNlbGYpOgorCisgICAgICAgICIiIiBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIGFuZCBmaWxsIGluIHNlbGYudmFsdWVzIGFuZCBzZWxmLmZpbGVzLgorCisgICAgICAgICAgICBBZnRlciBoYXZpbmcgcGFyc2VkIHRoZSBvcHRpb25zLCB0aGUgcmVtYWluaW5nIGNvbW1hbmQgbGluZQorICAgICAgICAgICAgYXJndW1lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBmaWxlcyBhbmQgcGFzc2VkIHRvIC5oYW5kbGVfZmlsZXMoKQorICAgICAgICAgICAgZm9yIHByb2Nlc3NpbmcuCisKKyAgICAgICAgICAgIEFzIGZpbmFsIHN0ZXAgdGhlIG9wdGlvbiBoYW5kbGVycyBhcmUgY2FsbGVkIGluIHRoZSBvcmRlcgorICAgICAgICAgICAgb2YgdGhlIG9wdGlvbnMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBQYXJzZSBhcmd1bWVudHMKKyAgICAgICAgc2VsZi52YWx1ZXMgPSB2YWx1ZXMgPSB7fQorICAgICAgICBmb3IgbyBpbiBzZWxmLm9wdGlvbnM6CisgICAgICAgICAgICBpZiBvLmhhc19kZWZhdWx0OgorICAgICAgICAgICAgICAgIHZhbHVlc1tvLnByZWZpeCtvLm5hbWVdID0gby5kZWZhdWx0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlc1tvLnByZWZpeCtvLm5hbWVdID0gMAorICAgICAgICBmbGFncyxsZmxhZ3MgPSBfZ2V0b3B0X2ZsYWdzKHNlbGYub3B0aW9ucykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3B0bGlzdCxmaWxlcyA9IGdldG9wdC5nZXRvcHQoc2VsZi5hcmd1bWVudHMsZmxhZ3MsbGZsYWdzKQorICAgICAgICAgICAgaWYgc2VsZi5nbG9iYmluZzoKKyAgICAgICAgICAgICAgICBsID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZiBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgZ2YgPSBnbG9iLmdsb2IoZikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGdmOgorICAgICAgICAgICAgICAgICAgICAgICAgbC5hcHBlbmQoZikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxbbGVuKGwpOl0gPSBnZgorICAgICAgICAgICAgICAgIGZpbGVzID0gbAorICAgICAgICAgICAgc2VsZi5vcHRpb25saXN0ID0gb3B0bGlzdAorICAgICAgICAgICAgc2VsZi5maWxlcyA9IGZpbGVzICsgc2VsZi5maWxlcworICAgICAgICBleGNlcHQgZ2V0b3B0LmVycm9yLHdoeToKKyAgICAgICAgICAgIHNlbGYuaGVscCh3aHkpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgICMgQ2FsbCBmaWxlIGhhbmRsZXIKKyAgICAgICAgcmMgPSBzZWxmLmhhbmRsZV9maWxlcyhzZWxmLmZpbGVzKQorICAgICAgICBpZiByYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN5cy5leGl0KHJjKQorCisgICAgICAgICMgQ2FsbCBvcHRpb24gaGFuZGxlcnMKKyAgICAgICAgZm9yIG9wdGlvbm5hbWUsIHZhbHVlIGluIG9wdGxpc3Q6CisKKyAgICAgICAgICAgICMgVHJ5IHRvIGNvbnZlcnQgdmFsdWUgdG8gaW50ZWdlcgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gc3RyaW5nLmF0b2kodmFsdWUpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICMgRmluZCBoYW5kbGVyIGFuZCBjYWxsIGl0IChvciBjb3VudCB0aGUgbnVtYmVyIG9mIG9wdGlvbgorICAgICAgICAgICAgIyBpbnN0YW5jZXMgb24gdGhlIGNvbW1hbmQgbGluZSkKKyAgICAgICAgICAgIGhhbmRsZXJuYW1lID0gJ2hhbmRsZScgKyBzdHJpbmcucmVwbGFjZShvcHRpb25uYW1lLCAnLScsICdfJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gZ2V0YXR0cihzZWxmLCBoYW5kbGVybmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VyYW5jZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWVzLmhhc19rZXkob3B0aW9ubmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbb3B0aW9ubmFtZV0gPSB2YWx1ZXNbb3B0aW9ubmFtZV0gKyAxCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbb3B0aW9ubmFtZV0gPSAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzW29wdGlvbm5hbWVdID0gdmFsdWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmMgPSBoYW5kbGVyKHZhbHVlKQorICAgICAgICAgICAgICAgIGlmIHJjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCByYworCisgICAgICAgICMgQXBwbHkgZmluYWwgZmlsZSBjaGVjayAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpCisgICAgICAgIHJjID0gc2VsZi5jaGVja19maWxlcyhzZWxmLmZpbGVzKQorICAgICAgICBpZiByYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN5cy5leGl0KHJjKQorCisgICAgZGVmIGNoZWNrX2ZpbGVzKHNlbGYsZmlsZWxpc3QpOgorCisgICAgICAgICIiIiBBcHBseSBzb21lIHVzZXIgZGVmaW5lZCBjaGVja3Mgb24gdGhlIGZpbGVzIGdpdmVuIGluIGZpbGVsaXN0LgorCisgICAgICAgICAgICBUaGlzIG1heSBtb2RpZnkgZmlsZWxpc3QgaW4gcGxhY2UuIEEgdHlwaWNhbCBhcHBsaWNhdGlvbgorICAgICAgICAgICAgaXMgY2hlY2tpbmcgdGhhdCBhdCBsZWFzdCBuIGZpbGVzIGFyZSBnaXZlbi4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgSWYgdGhpcyBtZXRob2QgcmV0dXJucyBhbnl0aGluZyBvdGhlciB0aGFuIE5vbmUsIHRoZQorICAgICAgICAgICAgcHJvY2VzcyBpcyB0ZXJtaW5hdGVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBhcyBleGl0IGNvZGUuCisgICAgICAgICAgICAKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgaGVscChzZWxmLG5vdGU9JycpOgorCisgICAgICAgIHNlbGYucHJpbnRfaGVhZGVyKCkKKyAgICAgICAgaWYgc2VsZi5zeW5vcHNpczoKKyAgICAgICAgICAgIHByaW50ICdTeW5vcHNpczonCisgICAgICAgICAgICAjIFRvIHJlbWFpbiBiYWNrd2FyZCBjb21wYXRpYmxlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5bm9wc2lzID0gc2VsZi5zeW5vcHNpcyAlIHNlbGYubmFtZQorICAgICAgICAgICAgZXhjZXB0IChOYW1lRXJyb3IsIEtleUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgIHN5bm9wc2lzID0gc2VsZi5zeW5vcHNpcyAlIHNlbGYuX19kaWN0X18KKyAgICAgICAgICAgIHByaW50ICcgJyArIHN5bm9wc2lzCisgICAgICAgIHByaW50CisgICAgICAgIHNlbGYucHJpbnRfb3B0aW9ucygpCisgICAgICAgIGlmIHNlbGYudmVyc2lvbjoKKyAgICAgICAgICAgIHByaW50ICdWZXJzaW9uOicKKyAgICAgICAgICAgIHByaW50ICcgJXMnICUgc2VsZi52ZXJzaW9uCisgICAgICAgICAgICBwcmludAorICAgICAgICBpZiBzZWxmLmFib3V0OgorICAgICAgICAgICAgcHJpbnQgc3RyaW5nLnN0cmlwKHNlbGYuYWJvdXQgJSBzZWxmLl9fZGljdF9fKQorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgaWYgbm90ZToKKyAgICAgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICAgICAgcHJpbnQgJ05vdGU6Jyxub3RlCisgICAgICAgICAgICBwcmludAorCisgICAgZGVmIG5vdGljZShzZWxmLG5vdGUpOgorCisgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICBwcmludCAnTm90ZTonLG5vdGUKKyAgICAgICAgcHJpbnQgJy0nKjcyCisgICAgICAgIHByaW50CisKKyAgICBkZWYgcHJpbnRfaGVhZGVyKHNlbGYpOgorCisgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICBwcmludCBzZWxmLmhlYWRlciAlIHNlbGYuX19kaWN0X18KKyAgICAgICAgcHJpbnQgJy0nKjcyCisgICAgICAgIHByaW50CisKKyAgICBkZWYgcHJpbnRfb3B0aW9ucyhzZWxmKToKKworICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zCisgICAgICAgIHByaW50ICdPcHRpb25zIGFuZCBkZWZhdWx0IHNldHRpbmdzOicKKyAgICAgICAgaWYgbm90IG9wdGlvbnM6CisgICAgICAgICAgICBwcmludCAnICBOb25lJworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGxvbmcgPSBmaWx0ZXIobGFtYmRhIHg6IHgucHJlZml4ID09ICctLScsIG9wdGlvbnMpCisgICAgICAgIHNob3J0ID0gZmlsdGVyKGxhbWJkYSB4OiB4LnByZWZpeCA9PSAnLScsIG9wdGlvbnMpCisgICAgICAgIGl0ZW1zID0gc2hvcnQgKyBsb25nCisgICAgICAgIGZvciBvIGluIG9wdGlvbnM6CisgICAgICAgICAgICBwcmludCAnICcsbworICAgICAgICBwcmludAorCisgICAgIworICAgICMgRXhhbXBsZSBoYW5kbGVyczoKKyAgICAjCisgICAgIyBJZiBhIGhhbmRsZXIgcmV0dXJucyBhbnl0aGluZyBvdGhlciB0aGFuIE5vbmUsIHByb2Nlc3Npbmcgc3RvcHMKKyAgICAjIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHBhc3NlZCB0byBzeXMuZXhpdCgpIGFzIGFyZ3VtZW50LgorICAgICMKKworICAgICMgRmlsZSBoYW5kbGVyCisgICAgZGVmIGhhbmRsZV9maWxlcyhzZWxmLGZpbGVzKToKKworICAgICAgICAiIiIgVGhpcyBtYXkgcHJvY2VzcyB0aGUgZmlsZXMgbGlzdCBpbiBwbGFjZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIAorICAgICMgU2hvcnQgb3B0aW9uIGhhbmRsZXIKKyAgICBkZWYgaGFuZGxlX2goc2VsZixhcmcpOgorCisgICAgICAgIHNlbGYuaGVscCgpCisgICAgICAgIHJldHVybiAwCisgICAgCisgICAgZGVmIGhhbmRsZV92KHNlbGYsIHZhbHVlKToKKworICAgICAgICAiIiIgVHVybiBvbiB2ZXJib3NlIG91dHB1dC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudmVyYm9zZSA9IDEKKyAgICAgICAgCisgICAgIyBIYW5kbGVycyBmb3IgbG9uZyBvcHRpb25zIGhhdmUgdHdvIHVuZGVyc2NvcmVzIGluIHRoZWlyIG5hbWUKKyAgICBkZWYgaGFuZGxlX19oZWxwKHNlbGYsYXJnKToKKworICAgICAgICBzZWxmLmhlbHAoKQorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGhhbmRsZV9fZGVidWcoc2VsZixhcmcpOgorCisgICAgICAgIHNlbGYuZGVidWcgPSAxCisgICAgICAgICMgV2UgZG9uJ3Qgd2FudCB0byBjYXRjaCBpbnRlcm5hbCBlcnJvcnM6CisgICAgICAgIHNlbGYuSW50ZXJuYWxFcnJvciA9IE5vbmUKKworICAgIGRlZiBoYW5kbGVfX2NvcHlyaWdodChzZWxmLGFyZyk6CisKKyAgICAgICAgc2VsZi5wcmludF9oZWFkZXIoKQorICAgICAgICBwcmludCBzdHJpbmcuc3RyaXAoc2VsZi5jb3B5cmlnaHQgJSBzZWxmLl9fZGljdF9fKQorICAgICAgICBwcmludAorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGhhbmRsZV9fZXhhbXBsZXMoc2VsZixhcmcpOgorCisgICAgICAgIHNlbGYucHJpbnRfaGVhZGVyKCkKKyAgICAgICAgaWYgc2VsZi5leGFtcGxlczoKKyAgICAgICAgICAgIHByaW50ICdFeGFtcGxlczonCisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgc3RyaW5nLnN0cmlwKHNlbGYuZXhhbXBsZXMgJSBzZWxmLl9fZGljdF9fKQorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdObyBleGFtcGxlcyBhdmFpbGFibGUuJworICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBtYWluKHNlbGYpOgorCisgICAgICAgICIiIiBPdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBwcm9ncmFtIGVudHJ5IHBvaW50LgorCisgICAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHBhc3NlZCB0byBzeXMuZXhpdCgpIGFzIGFyZ3VtZW50LiAgSWYKKyAgICAgICAgICAgIGl0IGlzIE5vbmUsIDAgaXMgYXNzdW1lZCAobWVhbmluZyBPSykuIFVuaGFuZGxlZAorICAgICAgICAgICAgZXhjZXB0aW9ucyBhcmUgcmVwb3J0ZWQgd2l0aCBleGl0IHN0YXR1cyBjb2RlIDEgKHNlZQorICAgICAgICAgICAgX19pbml0X18gZm9yIGZ1cnRoZXIgZGV0YWlscykuCisgICAgICAgICAgICAKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKyMgQWxpYXMKK0NvbW1hbmRMaW5lID0gQXBwbGljYXRpb24KKworZGVmIF90ZXN0KCk6CisKKyAgICBjbGFzcyBNeUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uKToKKyAgICAgICAgaGVhZGVyID0gJ1Rlc3QgQXBwbGljYXRpb24nCisgICAgICAgIHZlcnNpb24gPSBfX3ZlcnNpb25fXworICAgICAgICBvcHRpb25zID0gW09wdGlvbignLXYnLCd2ZXJib3NlJyldCisgICAgICAgIAorICAgICAgICBkZWYgaGFuZGxlX3Yoc2VsZixhcmcpOgorICAgICAgICAgICAgcHJpbnQgJ1ZFUkJPU0UsIFllYWggIScKKworICAgIGNtZCA9IE15QXBwbGljYXRpb24oKQorICAgIGlmIG5vdCBjbWQudmFsdWVzWyctaCddOgorICAgICAgICBjbWQuaGVscCgpCisgICAgcHJpbnQgJ2ZpbGVzOicsY21kLmZpbGVzCisgICAgcHJpbnQgJ0J5ZS4uLicKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0NvbnN0cnVjdHMucHkgYi9Ub29scy9weWJlbmNoL0NvbnN0cnVjdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhODg4ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvQ29uc3RydWN0cy5weQpAQCAtMCwwICsxLDU2NSBAQAorZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0CisKK2NsYXNzIElmVGhlbkVsc2UoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zMQorICAgIG9wZXJhdGlvbnMgPSAzMCozICMgaGFyZCB0byBzYXkuLi4KKyAgICByb3VuZHMgPSAxNTAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGEsYixjID0gMSwyLDMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgYSxiLGMgPSAxLDIsMworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBOZXN0ZWRGb3JMb29wcyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gMTAwMCoxMCo1CisgICAgcm91bmRzID0gMTUwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBsMSA9IHJhbmdlKDEwMDApCisgICAgICAgIGwyID0gcmFuZ2UoMTApCisgICAgICAgIGwzID0gcmFuZ2UoNSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIGZvciBqIGluIGwyOgorICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBsMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgbDEgPSByYW5nZSgxMDAwKQorICAgICAgICBsMiA9IHJhbmdlKDEwKQorICAgICAgICBsMyA9IHJhbmdlKDUpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIEZvckxvb3BzKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSA1ICogNQorICAgIHJvdW5kcyA9IDgwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGwxID0gcmFuZ2UoMTAwKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGwxID0gcmFuZ2UoMTAwMCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKwpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9EaWN0LnB5IGIvVG9vbHMvcHliZW5jaC9EaWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwN2Q4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL0RpY3QucHkKQEAgLTAsMCArMSw1MDMgQEAKK2Zyb20gcHliZW5jaCBpbXBvcnQgVGVzdAorCitjbGFzcyBEaWN0Q3JlYXRpb24oVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUqKDUgKyA1KQorICAgIHJvdW5kcyA9IDYwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBkMSA9IHt9CisgICAgICAgICAgICBkMiA9IHt9CisgICAgICAgICAgICBkMyA9IHt9CisgICAgICAgICAgICBkNCA9IHt9CisgICAgICAgICAgICBkNSA9IHt9CisKKyAgICAgICAgICAgIGQxID0gezE6MiwzOjQsNTo2fQorICAgICAgICAgICAgZDIgPSB7MjozLDQ6NSw2Ojd9CisgICAgICAgICAgICBkMyA9IHszOjQsNTo2LDc6OH0KKyAgICAgICAgICAgIGQ0ID0gezQ6NSw2OjcsODo5fQorICAgICAgICAgICAgZDUgPSB7Njo3LDg6OSwxMDoxMX0KKworICAgICAgICAgICAgZDEgPSB7fQorICAgICAgICAgICAgZDIgPSB7fQorICAgICAgICAgICAgZDMgPSB7fQorICAgICAgICAgICAgZDQgPSB7fQorICAgICAgICAgICAgZDUgPSB7fQorCisgICAgICAgICAgICBkMSA9IHsxOjIsMzo0LDU6Nn0KKyAgICAgICAgICAgIGQyID0gezI6Myw0OjUsNjo3fQorICAgICAgICAgICAgZDMgPSB7Mzo0LDU6Niw3Ojh9CisgICAgICAgICAgICBkNCA9IHs0OjUsNjo3LDg6OX0KKyAgICAgICAgICAgIGQ1ID0gezY6Nyw4OjksMTA6MTF9CisKKyAgICAgICAgICAgIGQxID0ge30KKyAgICAgICAgICAgIGQyID0ge30KKyAgICAgICAgICAgIGQzID0ge30KKyAgICAgICAgICAgIGQ0ID0ge30KKyAgICAgICAgICAgIGQ1ID0ge30KKworICAgICAgICAgICAgZDEgPSB7MToyLDM6NCw1OjZ9CisgICAgICAgICAgICBkMiA9IHsyOjMsNDo1LDY6N30KKyAgICAgICAgICAgIGQzID0gezM6NCw1OjYsNzo4fQorICAgICAgICAgICAgZDQgPSB7NDo1LDY6Nyw4Ojl9CisgICAgICAgICAgICBkNSA9IHs2OjcsODo5LDEwOjExfQorCisgICAgICAgICAgICBkMSA9IHt9CisgICAgICAgICAgICBkMiA9IHt9CisgICAgICAgICAgICBkMyA9IHt9CisgICAgICAgICAgICBkNCA9IHt9CisgICAgICAgICAgICBkNSA9IHt9CisKKyAgICAgICAgICAgIGQxID0gezE6MiwzOjQsNTo2fQorICAgICAgICAgICAgZDIgPSB7MjozLDQ6NSw2Ojd9CisgICAgICAgICAgICBkMyA9IHszOjQsNTo2LDc6OH0KKyAgICAgICAgICAgIGQ0ID0gezQ6NSw2OjcsODo5fQorICAgICAgICAgICAgZDUgPSB7Njo3LDg6OSwxMDoxMX0KKworICAgICAgICAgICAgZDEgPSB7fQorICAgICAgICAgICAgZDIgPSB7fQorICAgICAgICAgICAgZDMgPSB7fQorICAgICAgICAgICAgZDQgPSB7fQorICAgICAgICAgICAgZDUgPSB7fQorCisgICAgICAgICAgICBkMSA9IHsxOjIsMzo0LDU6Nn0KKyAgICAgICAgICAgIGQyID0gezI6Myw0OjUsNjo3fQorICAgICAgICAgICAgZDMgPSB7Mzo0LDU6Niw3Ojh9CisgICAgICAgICAgICBkNCA9IHs0OjUsNjo3LDg6OX0KKyAgICAgICAgICAgIGQ1ID0gezY6Nyw4OjksMTA6MTF9CisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIERpY3RXaXRoU3RyaW5nS2V5cyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gNSooNiArIDYpCisgICAgcm91bmRzID0gMjAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBkID0ge30KKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBkWydhYmMnXSA9IDEKKyAgICAgICAgICAgIGRbJ2RlZiddID0gMgorICAgICAgICAgICAgZFsnZ2hpJ10gPSAzCisgICAgICAgICAgICBkWydqa2wnXSA9IDQKKyAgICAgICAgICAgIGRbJ21ubyddID0gNQorICAgICAgICAgICAgZFsncHFyJ10gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsnYWJjJ10KKyAgICAgICAgICAgIGRbJ2RlZiddCisgICAgICAgICAgICBkWydnaGknXQorICAgICAgICAgICAgZFsnamtsJ10KKyAgICAgICAgICAgIGRbJ21ubyddCisgICAgICAgICAgICBkWydwcXInXQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbJ2FiYyddID0gMQorICAgICAgICAgICAgZFsnZGVmJ10gPSAyCisgICAgICAgICAgICBkWydnaGknXSA9IDMKKyAgICAgICAgICAgIGRbJ2prbCddID0gNAorICAgICAgICAgICAgZFsnbW5vJ10gPSA1CisgICAgICAgICAgICBkWydwcXInXSA9IDYKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWydhYmMnXQorICAgICAgICAgICAgZFsnZGVmJ10KKyAgICAgICAgICAgIGRbJ2doaSddCisgICAgICAgICAgICBkWydqa2wnXQorICAgICAgICAgICAgZFsnbW5vJ10KKyAgICAgICAgICAgIGRbJ3BxciddCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsnYWJjJ10gPSAxCisgICAgICAgICAgICBkWydkZWYnXSA9IDIKKyAgICAgICAgICAgIGRbJ2doaSddID0gMworICAgICAgICAgICAgZFsnamtsJ10gPSA0CisgICAgICAgICAgICBkWydtbm8nXSA9IDUKKyAgICAgICAgICAgIGRbJ3BxciddID0gNgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbJ2FiYyddCisgICAgICAgICAgICBkWydkZWYnXQorICAgICAgICAgICAgZFsnZ2hpJ10KKyAgICAgICAgICAgIGRbJ2prbCddCisgICAgICAgICAgICBkWydtbm8nXQorICAgICAgICAgICAgZFsncHFyJ10KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWydhYmMnXSA9IDEKKyAgICAgICAgICAgIGRbJ2RlZiddID0gMgorICAgICAgICAgICAgZFsnZ2hpJ10gPSAzCisgICAgICAgICAgICBkWydqa2wnXSA9IDQKKyAgICAgICAgICAgIGRbJ21ubyddID0gNQorICAgICAgICAgICAgZFsncHFyJ10gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsnYWJjJ10KKyAgICAgICAgICAgIGRbJ2RlZiddCisgICAgICAgICAgICBkWydnaGknXQorICAgICAgICAgICAgZFsnamtsJ10KKyAgICAgICAgICAgIGRbJ21ubyddCisgICAgICAgICAgICBkWydwcXInXQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbJ2FiYyddID0gMQorICAgICAgICAgICAgZFsnZGVmJ10gPSAyCisgICAgICAgICAgICBkWydnaGknXSA9IDMKKyAgICAgICAgICAgIGRbJ2prbCddID0gNAorICAgICAgICAgICAgZFsnbW5vJ10gPSA1CisgICAgICAgICAgICBkWydwcXInXSA9IDYKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWydhYmMnXQorICAgICAgICAgICAgZFsnZGVmJ10KKyAgICAgICAgICAgIGRbJ2doaSddCisgICAgICAgICAgICBkWydqa2wnXQorICAgICAgICAgICAgZFsnbW5vJ10KKyAgICAgICAgICAgIGRbJ3BxciddCisgICAgICAgICAgICAgIAorICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZCA9IHt9CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgRGljdFdpdGhGbG9hdEtleXMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA2KQorICAgIHJvdW5kcyA9IDIwMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZCA9IHt9CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgZFsxLjIzNF0gPSAxCisgICAgICAgICAgICBkWzIuMzQ1XSA9IDIKKyAgICAgICAgICAgIGRbMy40NTZdID0gMworICAgICAgICAgICAgZFs0LjU2N10gPSA0CisgICAgICAgICAgICBkWzUuNjc4XSA9IDUKKyAgICAgICAgICAgIGRbNi43ODldID0gNgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMS4yMzRdCisgICAgICAgICAgICBkWzIuMzQ1XQorICAgICAgICAgICAgZFszLjQ1Nl0KKyAgICAgICAgICAgIGRbNC41NjddCisgICAgICAgICAgICBkWzUuNjc4XQorICAgICAgICAgICAgZFs2Ljc4OV0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzEuMjM0XSA9IDEKKyAgICAgICAgICAgIGRbMi4zNDVdID0gMgorICAgICAgICAgICAgZFszLjQ1Nl0gPSAzCisgICAgICAgICAgICBkWzQuNTY3XSA9IDQKKyAgICAgICAgICAgIGRbNS42NzhdID0gNQorICAgICAgICAgICAgZFs2Ljc4OV0gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxLjIzNF0KKyAgICAgICAgICAgIGRbMi4zNDVdCisgICAgICAgICAgICBkWzMuNDU2XQorICAgICAgICAgICAgZFs0LjU2N10KKyAgICAgICAgICAgIGRbNS42NzhdCisgICAgICAgICAgICBkWzYuNzg5XQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMS4yMzRdID0gMQorICAgICAgICAgICAgZFsyLjM0NV0gPSAyCisgICAgICAgICAgICBkWzMuNDU2XSA9IDMKKyAgICAgICAgICAgIGRbNC41NjddID0gNAorICAgICAgICAgICAgZFs1LjY3OF0gPSA1CisgICAgICAgICAgICBkWzYuNzg5XSA9IDYKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzEuMjM0XQorICAgICAgICAgICAgZFsyLjM0NV0KKyAgICAgICAgICAgIGRbMy40NTZdCisgICAgICAgICAgICBkWzQuNTY3XQorICAgICAgICAgICAgZFs1LjY3OF0KKyAgICAgICAgICAgIGRbNi43ODldCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxLjIzNF0gPSAxCisgICAgICAgICAgICBkWzIuMzQ1XSA9IDIKKyAgICAgICAgICAgIGRbMy40NTZdID0gMworICAgICAgICAgICAgZFs0LjU2N10gPSA0CisgICAgICAgICAgICBkWzUuNjc4XSA9IDUKKyAgICAgICAgICAgIGRbNi43ODldID0gNgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMS4yMzRdCisgICAgICAgICAgICBkWzIuMzQ1XQorICAgICAgICAgICAgZFszLjQ1Nl0KKyAgICAgICAgICAgIGRbNC41NjddCisgICAgICAgICAgICBkWzUuNjc4XQorICAgICAgICAgICAgZFs2Ljc4OV0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzEuMjM0XSA9IDEKKyAgICAgICAgICAgIGRbMi4zNDVdID0gMgorICAgICAgICAgICAgZFszLjQ1Nl0gPSAzCisgICAgICAgICAgICBkWzQuNTY3XSA9IDQKKyAgICAgICAgICAgIGRbNS42NzhdID0gNQorICAgICAgICAgICAgZFs2Ljc4OV0gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxLjIzNF0KKyAgICAgICAgICAgIGRbMi4zNDVdCisgICAgICAgICAgICBkWzMuNDU2XQorICAgICAgICAgICAgZFs0LjU2N10KKyAgICAgICAgICAgIGRbNS42NzhdCisgICAgICAgICAgICBkWzYuNzg5XQorICAgICAgICAgICAgICAKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGQgPSB7fQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIERpY3RXaXRoSW50ZWdlcktleXMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA2KQorICAgIHJvdW5kcyA9IDIwMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZCA9IHt9CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgZFsxXSA9IDEKKyAgICAgICAgICAgIGRbMl0gPSAyCisgICAgICAgICAgICBkWzNdID0gMworICAgICAgICAgICAgZFs0XSA9IDQKKyAgICAgICAgICAgIGRbNV0gPSA1CisgICAgICAgICAgICBkWzZdID0gNgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMV0KKyAgICAgICAgICAgIGRbMl0KKyAgICAgICAgICAgIGRbM10KKyAgICAgICAgICAgIGRbNF0KKyAgICAgICAgICAgIGRbNV0KKyAgICAgICAgICAgIGRbNl0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzFdID0gMQorICAgICAgICAgICAgZFsyXSA9IDIKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIGRbNl0gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxXQorICAgICAgICAgICAgZFsyXQorICAgICAgICAgICAgZFszXQorICAgICAgICAgICAgZFs0XQorICAgICAgICAgICAgZFs1XQorICAgICAgICAgICAgZFs2XQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMV0gPSAxCisgICAgICAgICAgICBkWzJdID0gMgorICAgICAgICAgICAgZFszXSA9IDMKKyAgICAgICAgICAgIGRbNF0gPSA0CisgICAgICAgICAgICBkWzVdID0gNQorICAgICAgICAgICAgZFs2XSA9IDYKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzFdCisgICAgICAgICAgICBkWzJdCisgICAgICAgICAgICBkWzNdCisgICAgICAgICAgICBkWzRdCisgICAgICAgICAgICBkWzVdCisgICAgICAgICAgICBkWzZdCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxXSA9IDEKKyAgICAgICAgICAgIGRbMl0gPSAyCisgICAgICAgICAgICBkWzNdID0gMworICAgICAgICAgICAgZFs0XSA9IDQKKyAgICAgICAgICAgIGRbNV0gPSA1CisgICAgICAgICAgICBkWzZdID0gNgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMV0KKyAgICAgICAgICAgIGRbMl0KKyAgICAgICAgICAgIGRbM10KKyAgICAgICAgICAgIGRbNF0KKyAgICAgICAgICAgIGRbNV0KKyAgICAgICAgICAgIGRbNl0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzFdID0gMQorICAgICAgICAgICAgZFsyXSA9IDIKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIGRbNl0gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxXQorICAgICAgICAgICAgZFsyXQorICAgICAgICAgICAgZFszXQorICAgICAgICAgICAgZFs0XQorICAgICAgICAgICAgZFs1XQorICAgICAgICAgICAgZFs2XQorICAgICAgICAgICAgICAKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGQgPSB7fQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIFNpbXBsZURpY3RNYW5pcHVsYXRpb24oVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA2ICsgNiArIDYpCisgICAgcm91bmRzID0gNTAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGQgPSB7fQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIGRbMF0gPSAzCisgICAgICAgICAgICBkWzFdID0gNAorICAgICAgICAgICAgZFsyXSA9IDUKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGRbMF0KKyAgICAgICAgICAgIHggPSBkWzFdCisgICAgICAgICAgICB4ID0gZFsyXQorICAgICAgICAgICAgeCA9IGRbM10KKyAgICAgICAgICAgIHggPSBkWzRdCisgICAgICAgICAgICB4ID0gZFs1XQorCisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgICAgIGQuaGFzX2tleSgyKQorICAgICAgICAgICAgZC5oYXNfa2V5KDQpCisgICAgICAgICAgICBkLmhhc19rZXkoNikKKyAgICAgICAgICAgIGQuaGFzX2tleSg4KQorICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorCisgICAgICAgICAgICBkZWwgZFswXQorICAgICAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgICAgIGRlbCBkWzJdCisgICAgICAgICAgICBkZWwgZFszXQorICAgICAgICAgICAgZGVsIGRbNF0KKyAgICAgICAgICAgIGRlbCBkWzVdCisKKyAgICAgICAgICAgIGRbMF0gPSAzCisgICAgICAgICAgICBkWzFdID0gNAorICAgICAgICAgICAgZFsyXSA9IDUKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGRbMF0KKyAgICAgICAgICAgIHggPSBkWzFdCisgICAgICAgICAgICB4ID0gZFsyXQorICAgICAgICAgICAgeCA9IGRbM10KKyAgICAgICAgICAgIHggPSBkWzRdCisgICAgICAgICAgICB4ID0gZFs1XQorCisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgICAgIGQuaGFzX2tleSgyKQorICAgICAgICAgICAgZC5oYXNfa2V5KDQpCisgICAgICAgICAgICBkLmhhc19rZXkoNikKKyAgICAgICAgICAgIGQuaGFzX2tleSg4KQorICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorCisgICAgICAgICAgICBkZWwgZFswXQorICAgICAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgICAgIGRlbCBkWzJdCisgICAgICAgICAgICBkZWwgZFszXQorICAgICAgICAgICAgZGVsIGRbNF0KKyAgICAgICAgICAgIGRlbCBkWzVdCisKKyAgICAgICAgICAgIGRbMF0gPSAzCisgICAgICAgICAgICBkWzFdID0gNAorICAgICAgICAgICAgZFsyXSA9IDUKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGRbMF0KKyAgICAgICAgICAgIHggPSBkWzFdCisgICAgICAgICAgICB4ID0gZFsyXQorICAgICAgICAgICAgeCA9IGRbM10KKyAgICAgICAgICAgIHggPSBkWzRdCisgICAgICAgICAgICB4ID0gZFs1XQorCisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgICAgIGQuaGFzX2tleSgyKQorICAgICAgICAgICAgZC5oYXNfa2V5KDQpCisgICAgICAgICAgICBkLmhhc19rZXkoNikKKyAgICAgICAgICAgIGQuaGFzX2tleSg4KQorICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorCisgICAgICAgICAgICBkZWwgZFswXQorICAgICAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgICAgIGRlbCBkWzJdCisgICAgICAgICAgICBkZWwgZFszXQorICAgICAgICAgICAgZGVsIGRbNF0KKyAgICAgICAgICAgIGRlbCBkWzVdCisKKyAgICAgICAgICAgIGRbMF0gPSAzCisgICAgICAgICAgICBkWzFdID0gNAorICAgICAgICAgICAgZFsyXSA9IDUKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGRbMF0KKyAgICAgICAgICAgIHggPSBkWzFdCisgICAgICAgICAgICB4ID0gZFsyXQorICAgICAgICAgICAgeCA9IGRbM10KKyAgICAgICAgICAgIHggPSBkWzRdCisgICAgICAgICAgICB4ID0gZFs1XQorCisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgICAgIGQuaGFzX2tleSgyKQorICAgICAgICAgICAgZC5oYXNfa2V5KDQpCisgICAgICAgICAgICBkLmhhc19rZXkoNikKKyAgICAgICAgICAgIGQuaGFzX2tleSg4KQorICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorCisgICAgICAgICAgICBkZWwgZFswXQorICAgICAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgICAgIGRlbCBkWzJdCisgICAgICAgICAgICBkZWwgZFszXQorICAgICAgICAgICAgZGVsIGRbNF0KKyAgICAgICAgICAgIGRlbCBkWzVdCisKKyAgICAgICAgICAgIGRbMF0gPSAzCisgICAgICAgICAgICBkWzFdID0gNAorICAgICAgICAgICAgZFsyXSA9IDUKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGRbMF0KKyAgICAgICAgICAgIHggPSBkWzFdCisgICAgICAgICAgICB4ID0gZFsyXQorICAgICAgICAgICAgeCA9IGRbM10KKyAgICAgICAgICAgIHggPSBkWzRdCisgICAgICAgICAgICB4ID0gZFs1XQorCisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgICAgIGQuaGFzX2tleSgyKQorICAgICAgICAgICAgZC5oYXNfa2V5KDQpCisgICAgICAgICAgICBkLmhhc19rZXkoNikKKyAgICAgICAgICAgIGQuaGFzX2tleSg4KQorICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorCisgICAgICAgICAgICBkZWwgZFswXQorICAgICAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgICAgIGRlbCBkWzJdCisgICAgICAgICAgICBkZWwgZFszXQorICAgICAgICAgICAgZGVsIGRbNF0KKyAgICAgICAgICAgIGRlbCBkWzVdCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGQgPSB7fQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvRXhjZXB0aW9ucy5weSBiL1Rvb2xzL3B5YmVuY2gvRXhjZXB0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVjODNhCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcHliZW5jaC9FeGNlcHRpb25zLnB5CkBAIC0wLDAgKzEsNjgxIEBACitmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKKworY2xhc3MgVHJ5UmFpc2VFeGNlcHQoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDIgKyAzCisgICAgcm91bmRzID0gNjAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGVycm9yID0gVmFsdWVFcnJvcgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsInNvbWV0aGluZyIKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsInNvbWV0aGluZyIKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsInNvbWV0aGluZyIKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGVycm9yID0gVmFsdWVFcnJvcgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAKKworY2xhc3MgVHJ5RXhjZXB0KFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSAxNSAqIDEwCisgICAgcm91bmRzID0gMjAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIAorCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0ltcG9ydHMucHkgYi9Ub29scy9weWJlbmNoL0ltcG9ydHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0NThiNAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvSW1wb3J0cy5weQpAQCAtMCwwICsxLDEzOSBAQAorZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0CisKKyMgRmlyc3QgaW1wb3J0czoKK2ltcG9ydCBvcworaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisKK2NsYXNzIFNlY29uZEltcG9ydChUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gNSAqIDUKKyAgICByb3VuZHMgPSAyMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAKKworY2xhc3MgU2Vjb25kUGFja2FnZUltcG9ydChUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gNSAqIDUKKyAgICByb3VuZHMgPSAyMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKworICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIAorY2xhc3MgU2Vjb25kU3VibW9kdWxlSW1wb3J0KFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSA1ICogNQorICAgIHJvdW5kcyA9IDIwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlLnN1Ym1vZHVsZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKworICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlLnN1Ym1vZHVsZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKworICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlLnN1Ym1vZHVsZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKworICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlLnN1Ym1vZHVsZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKworICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlLnN1Ym1vZHVsZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9JbnN0YW5jZXMucHkgYi9Ub29scy9weWJlbmNoL0luc3RhbmNlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjYzZTIzCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcHliZW5jaC9JbnN0YW5jZXMucHkKQEAgLTAsMCArMSw2OCBAQAorZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0CisKK2NsYXNzIENyZWF0ZUluc3RhbmNlcyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjIKKyAgICBvcGVyYXRpb25zID0gMyArIDcgKyA0CisgICAgcm91bmRzID0gNjAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgZDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLGEsYixjKToKKyAgICAgICAgICAgICAgICBzZWxmLmEgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5iID0gYgorICAgICAgICAgICAgICAgIHNlbGYuYyA9IGMKKworICAgICAgICBjbGFzcyBlOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsYSxiLGM9NCk6CisgICAgICAgICAgICAgICAgc2VsZi5hID0gYQorICAgICAgICAgICAgICAgIHNlbGYuYiA9IGIKKyAgICAgICAgICAgICAgICBzZWxmLmMgPSBjCisgICAgICAgICAgICAgICAgc2VsZi5kID0gYQorICAgICAgICAgICAgICAgIHNlbGYuZSA9IGIKKyAgICAgICAgICAgICAgICBzZWxmLmYgPSBjCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIG8gPSBjKCkKKyAgICAgICAgICAgIG8xID0gYygpCisgICAgICAgICAgICBvMiA9IGMoKQorICAgICAgICAgICAgcCA9IGQoaSxpLDMpCisgICAgICAgICAgICBwMSA9IGQoaSxpLDMpCisgICAgICAgICAgICBwMiA9IGQoaSwzLDMpCisgICAgICAgICAgICBwMyA9IGQoMyxpLDMpCisgICAgICAgICAgICBwNCA9IGQoaSxpLGkpCisgICAgICAgICAgICBwNSA9IGQoMyxpLDMpCisgICAgICAgICAgICBwNiA9IGQoaSxpLGkpCisgICAgICAgICAgICBxID0gZShpLGksMykKKyAgICAgICAgICAgIHExID0gZShpLGksMykKKyAgICAgICAgICAgIHEyID0gZShpLGksMykKKyAgICAgICAgICAgIHEzID0gZShpLGkpCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgZDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLGEsYixjKToKKyAgICAgICAgICAgICAgICBzZWxmLmEgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5iID0gYgorICAgICAgICAgICAgICAgIHNlbGYuYyA9IGMKKworICAgICAgICBjbGFzcyBlOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsYSxiLGM9NCk6CisgICAgICAgICAgICAgICAgc2VsZi5hID0gYQorICAgICAgICAgICAgICAgIHNlbGYuYiA9IGIKKyAgICAgICAgICAgICAgICBzZWxmLmMgPSBjCisgICAgICAgICAgICAgICAgc2VsZi5kID0gYQorICAgICAgICAgICAgICAgIHNlbGYuZSA9IGIKKyAgICAgICAgICAgICAgICBzZWxmLmYgPSBjCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0xJQ0VOU0UgYi9Ub29scy9weWJlbmNoL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdjNmE2YgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvTElDRU5TRQpAQCAtMCwwICsxLDI1IEBACitweWJlbmNoIExpY2Vuc2UKKy0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGNvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UgYXBwbGllcyB0byBhbGwgZmlsZXMgaW4gdGhlIHB5YmVuY2gKK2RpcmVjdG9yeSBvZiB0aGUgcHliZW5jaCBkaXN0cmlidXRpb24uCisKK0NvcHlyaWdodCAoYyksIDE5OTctMjAwNiwgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pCitDb3B5cmlnaHQgKGMpLCAyMDAwLTIwMDYsIGVHZW5peC5jb20gU29mdHdhcmUgR21iSCAoaW5mb0BlZ2VuaXguY29tKQorCisgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgb3Igcm95YWx0eSBpcyBoZXJlYnkKK2dyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMKK2FuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgoraW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZworbW9kaWZpY2F0aW9ucywgdGhhdCB5b3UgbWFrZS4KKworVEhFIEFVVEhPUiBNQVJDLUFORFJFIExFTUJVUkcgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCitUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECitGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsCitJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcKK0ZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUgIQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9MaXN0cy5weSBiL1Rvb2xzL3B5YmVuY2gvTGlzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2YjQ0YwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvTGlzdHMucHkKQEAgLTAsMCArMSwyOTIgQEAKK2Zyb20gcHliZW5jaCBpbXBvcnQgVGVzdAorCitjbGFzcyBTaW1wbGVMaXN0TWFuaXB1bGF0aW9uKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMworICAgIG9wZXJhdGlvbnMgPSA1KiAoNiArIDYgKyA2KQorICAgIHJvdW5kcyA9IDYwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBsID0gW10KKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGxbMF0KKyAgICAgICAgICAgIHggPSBsWzFdCisgICAgICAgICAgICB4ID0gbFsyXQorICAgICAgICAgICAgeCA9IGxbM10KKyAgICAgICAgICAgIHggPSBsWzRdCisgICAgICAgICAgICB4ID0gbFs1XQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGxbMF0KKyAgICAgICAgICAgIHggPSBsWzFdCisgICAgICAgICAgICB4ID0gbFsyXQorICAgICAgICAgICAgeCA9IGxbM10KKyAgICAgICAgICAgIHggPSBsWzRdCisgICAgICAgICAgICB4ID0gbFs1XQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGxbMF0KKyAgICAgICAgICAgIHggPSBsWzFdCisgICAgICAgICAgICB4ID0gbFsyXQorICAgICAgICAgICAgeCA9IGxbM10KKyAgICAgICAgICAgIHggPSBsWzRdCisgICAgICAgICAgICB4ID0gbFs1XQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGxbMF0KKyAgICAgICAgICAgIHggPSBsWzFdCisgICAgICAgICAgICB4ID0gbFsyXQorICAgICAgICAgICAgeCA9IGxbM10KKyAgICAgICAgICAgIHggPSBsWzRdCisgICAgICAgICAgICB4ID0gbFs1XQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGxbMF0KKyAgICAgICAgICAgIHggPSBsWzFdCisgICAgICAgICAgICB4ID0gbFsyXQorICAgICAgICAgICAgeCA9IGxbM10KKyAgICAgICAgICAgIHggPSBsWzRdCisgICAgICAgICAgICB4ID0gbFs1XQorCisgICAgICAgICAgICBpZiBsZW4obCkgPiAxMDAwMDoKKyAgICAgICAgICAgICAgICAjIGN1dCBkb3duIHRoZSBzaXplCisgICAgICAgICAgICAgICAgZGVsIGxbOl0KKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgbCA9IFtdCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgTGlzdFNsaWNpbmcoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC40CisgICAgb3BlcmF0aW9ucyA9IDI1KigzKzErMisxKQorICAgIHJvdW5kcyA9IDQwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgbiA9IHJhbmdlKDEwMCkKKyAgICAgICAgciA9IHJhbmdlKDI1KQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIGwgPSByYW5nZSgxMDApCisKKyAgICAgICAgICAgIGZvciBqIGluIHI6CisKKyAgICAgICAgICAgICAgICBtID0gbFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IGxbOjI1XQorICAgICAgICAgICAgICAgIG0gPSBsWzUwOjU1XQorICAgICAgICAgICAgICAgIGxbOjNdID0gbgorICAgICAgICAgICAgICAgIG0gPSBsWzotMV0KKyAgICAgICAgICAgICAgICBtID0gbFsxOl0KKyAgICAgICAgICAgICAgICBsWy0xOl0gPSBuCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIG4gPSByYW5nZSgxMDApCisgICAgICAgIHIgPSByYW5nZSgyNSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBsID0gcmFuZ2UoMTAwKQorCisgICAgICAgICAgICBmb3IgaiBpbiByOgorICAgICAgICAgICAgICAgIHBhc3MKKworY2xhc3MgU21hbGxMaXN0cyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gNSooMSsgNiArIDYgKyAzICsgMSkKKyAgICByb3VuZHMgPSA2MDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgbCA9IFtdCisKKyAgICAgICAgICAgIGwuYXBwZW5kKDIpCisgICAgICAgICAgICBsLmFwcGVuZCgzKQorICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGwuYXBwZW5kKDIpCisgICAgICAgICAgICBsLmFwcGVuZCgzKQorICAgICAgICAgICAgbC5hcHBlbmQoNCkKKworICAgICAgICAgICAgbFswXSA9IDMKKyAgICAgICAgICAgIGxbMV0gPSA0CisgICAgICAgICAgICBsWzJdID0gNQorICAgICAgICAgICAgbFszXSA9IDMKKyAgICAgICAgICAgIGxbNF0gPSA0CisgICAgICAgICAgICBsWzVdID0gNQorICAgICAgICAgICAgCisgICAgICAgICAgICBsWzozXSA9IFsxLDIsM10KKyAgICAgICAgICAgIG0gPSBsWzotMV0KKyAgICAgICAgICAgIG0gPSBsWzE6XQorICAgICAgICAgICAgCisgICAgICAgICAgICBsWy0xOl0gPSBbNCw1LDZdCisKKyAgICAgICAgICAgIGwgPSBbXQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbFs6M10gPSBbMSwyLDNdCisgICAgICAgICAgICBtID0gbFs6LTFdCisgICAgICAgICAgICBtID0gbFsxOl0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbFstMTpdID0gWzQsNSw2XQorCisgICAgICAgICAgICBsID0gW10KKworICAgICAgICAgICAgbC5hcHBlbmQoMikKKyAgICAgICAgICAgIGwuYXBwZW5kKDMpCisgICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgbC5hcHBlbmQoMikKKyAgICAgICAgICAgIGwuYXBwZW5kKDMpCisgICAgICAgICAgICBsLmFwcGVuZCg0KQorCisgICAgICAgICAgICBsWzBdID0gMworICAgICAgICAgICAgbFsxXSA9IDQKKyAgICAgICAgICAgIGxbMl0gPSA1CisgICAgICAgICAgICBsWzNdID0gMworICAgICAgICAgICAgbFs0XSA9IDQKKyAgICAgICAgICAgIGxbNV0gPSA1CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxbOjNdID0gWzEsMiwzXQorICAgICAgICAgICAgbSA9IGxbOi0xXQorICAgICAgICAgICAgbSA9IGxbMTpdCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxbLTE6XSA9IFs0LDUsNl0KKworICAgICAgICAgICAgbCA9IFtdCisKKyAgICAgICAgICAgIGwuYXBwZW5kKDIpCisgICAgICAgICAgICBsLmFwcGVuZCgzKQorICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGwuYXBwZW5kKDIpCisgICAgICAgICAgICBsLmFwcGVuZCgzKQorICAgICAgICAgICAgbC5hcHBlbmQoNCkKKworICAgICAgICAgICAgbFswXSA9IDMKKyAgICAgICAgICAgIGxbMV0gPSA0CisgICAgICAgICAgICBsWzJdID0gNQorICAgICAgICAgICAgbFszXSA9IDMKKyAgICAgICAgICAgIGxbNF0gPSA0CisgICAgICAgICAgICBsWzVdID0gNQorICAgICAgICAgICAgCisgICAgICAgICAgICBsWzozXSA9IFsxLDIsM10KKyAgICAgICAgICAgIG0gPSBsWzotMV0KKyAgICAgICAgICAgIG0gPSBsWzE6XQorICAgICAgICAgICAgCisgICAgICAgICAgICBsWy0xOl0gPSBbNCw1LDZdCisKKyAgICAgICAgICAgIGwgPSBbXQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbFs6M10gPSBbMSwyLDNdCisgICAgICAgICAgICBtID0gbFs6LTFdCisgICAgICAgICAgICBtID0gbFsxOl0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbFstMTpdID0gWzQsNSw2XQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgbCA9IFtdCisKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvTG9va3Vwcy5weSBiL1Rvb2xzL3B5YmVuY2gvTG9va3Vwcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmJjMGVkCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcHliZW5jaC9Mb29rdXBzLnB5CkBAIC0wLDAgKzEsOTQ2IEBACitmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKKworY2xhc3MgU3BlY2lhbENsYXNzQXR0cmlidXRlKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMworICAgIG9wZXJhdGlvbnMgPSA1KigxMiArIDEyKQorICAgIHJvdW5kcyA9IDEwMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgY2xhc3MgYzoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgTm9ybWFsQ2xhc3NBdHRyaWJ1dGUoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUqKDEyICsgMTIpCisgICAgcm91bmRzID0gMTAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBjbGFzcyBjOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworICAgICAgICAgICAgYy5hID0gMgorICAgICAgICAgICAgYy5iID0gMworICAgICAgICAgICAgYy5jID0gNAorCisgICAgICAgICAgICBjLmEgPSAyCisgICAgICAgICAgICBjLmIgPSAzCisgICAgICAgICAgICBjLmMgPSA0CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIHggPSBjLmEKKyAgICAgICAgICAgIHggPSBjLmIKKyAgICAgICAgICAgIHggPSBjLmMKKworICAgICAgICAgICAgeCA9IGMuYQorICAgICAgICAgICAgeCA9IGMuYgorICAgICAgICAgICAgeCA9IGMuYworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworICAgICAgICAgICAgYy5hID0gMgorICAgICAgICAgICAgYy5iID0gMworICAgICAgICAgICAgYy5jID0gNAorCisgICAgICAgICAgICBjLmEgPSAyCisgICAgICAgICAgICBjLmIgPSAzCisgICAgICAgICAgICBjLmMgPSA0CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIHggPSBjLmEKKyAgICAgICAgICAgIHggPSBjLmIKKyAgICAgICAgICAgIHggPSBjLmMKKworICAgICAgICAgICAgeCA9IGMuYQorICAgICAgICAgICAgeCA9IGMuYgorICAgICAgICAgICAgeCA9IGMuYworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworICAgICAgICAgICAgYy5hID0gMgorICAgICAgICAgICAgYy5iID0gMworICAgICAgICAgICAgYy5jID0gNAorCisgICAgICAgICAgICBjLmEgPSAyCisgICAgICAgICAgICBjLmIgPSAzCisgICAgICAgICAgICBjLmMgPSA0CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIHggPSBjLmEKKyAgICAgICAgICAgIHggPSBjLmIKKyAgICAgICAgICAgIHggPSBjLmMKKworICAgICAgICAgICAgeCA9IGMuYQorICAgICAgICAgICAgeCA9IGMuYgorICAgICAgICAgICAgeCA9IGMuYworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworICAgICAgICAgICAgYy5hID0gMgorICAgICAgICAgICAgYy5iID0gMworICAgICAgICAgICAgYy5jID0gNAorCisgICAgICAgICAgICBjLmEgPSAyCisgICAgICAgICAgICBjLmIgPSAzCisgICAgICAgICAgICBjLmMgPSA0CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIHggPSBjLmEKKyAgICAgICAgICAgIHggPSBjLmIKKyAgICAgICAgICAgIHggPSBjLmMKKworICAgICAgICAgICAgeCA9IGMuYQorICAgICAgICAgICAgeCA9IGMuYgorICAgICAgICAgICAgeCA9IGMuYworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworICAgICAgICAgICAgYy5hID0gMgorICAgICAgICAgICAgYy5iID0gMworICAgICAgICAgICAgYy5jID0gNAorCisgICAgICAgICAgICBjLmEgPSAyCisgICAgICAgICAgICBjLmIgPSAzCisgICAgICAgICAgICBjLmMgPSA0CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIHggPSBjLmEKKyAgICAgICAgICAgIHggPSBjLmIKKyAgICAgICAgICAgIHggPSBjLmMKKworICAgICAgICAgICAgeCA9IGMuYQorICAgICAgICAgICAgeCA9IGMuYgorICAgICAgICAgICAgeCA9IGMuYworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgU3BlY2lhbEluc3RhbmNlQXR0cmlidXRlKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMworICAgIG9wZXJhdGlvbnMgPSA1KigxMiArIDEyKQorICAgIHJvdW5kcyA9IDEwMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgY2xhc3MgYzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbyA9IGMoKQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworICAgICAgICAgICAgby5fX2FfXyA9IDIKKyAgICAgICAgICAgIG8uX19iX18gPSAzCisgICAgICAgICAgICBvLl9fY19fID0gNAorCisgICAgICAgICAgICBvLl9fYV9fID0gMgorICAgICAgICAgICAgby5fX2JfXyA9IDMKKyAgICAgICAgICAgIG8uX19jX18gPSA0CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIHggPSBvLl9fYV9fCisgICAgICAgICAgICB4ID0gby5fX2JfXworICAgICAgICAgICAgeCA9IG8uX19jX18KKworICAgICAgICAgICAgeCA9IG8uX19hX18KKyAgICAgICAgICAgIHggPSBvLl9fYl9fCisgICAgICAgICAgICB4ID0gby5fX2NfXworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworICAgICAgICAgICAgby5fX2FfXyA9IDIKKyAgICAgICAgICAgIG8uX19iX18gPSAzCisgICAgICAgICAgICBvLl9fY19fID0gNAorCisgICAgICAgICAgICBvLl9fYV9fID0gMgorICAgICAgICAgICAgby5fX2JfXyA9IDMKKyAgICAgICAgICAgIG8uX19jX18gPSA0CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIHggPSBvLl9fYV9fCisgICAgICAgICAgICB4ID0gby5fX2JfXworICAgICAgICAgICAgeCA9IG8uX19jX18KKworICAgICAgICAgICAgeCA9IG8uX19hX18KKyAgICAgICAgICAgIHggPSBvLl9fYl9fCisgICAgICAgICAgICB4ID0gby5fX2NfXworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworICAgICAgICAgICAgby5fX2FfXyA9IDIKKyAgICAgICAgICAgIG8uX19iX18gPSAzCisgICAgICAgICAgICBvLl9fY19fID0gNAorCisgICAgICAgICAgICBvLl9fYV9fID0gMgorICAgICAgICAgICAgby5fX2JfXyA9IDMKKyAgICAgICAgICAgIG8uX19jX18gPSA0CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIHggPSBvLl9fYV9fCisgICAgICAgICAgICB4ID0gby5fX2JfXworICAgICAgICAgICAgeCA9IG8uX19jX18KKworICAgICAgICAgICAgeCA9IG8uX19hX18KKyAgICAgICAgICAgIHggPSBvLl9fYl9fCisgICAgICAgICAgICB4ID0gby5fX2NfXworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworICAgICAgICAgICAgby5fX2FfXyA9IDIKKyAgICAgICAgICAgIG8uX19iX18gPSAzCisgICAgICAgICAgICBvLl9fY19fID0gNAorCisgICAgICAgICAgICBvLl9fYV9fID0gMgorICAgICAgICAgICAgby5fX2JfXyA9IDMKKyAgICAgICAgICAgIG8uX19jX18gPSA0CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIHggPSBvLl9fYV9fCisgICAgICAgICAgICB4ID0gby5fX2JfXworICAgICAgICAgICAgeCA9IG8uX19jX18KKworICAgICAgICAgICAgeCA9IG8uX19hX18KKyAgICAgICAgICAgIHggPSBvLl9fYl9fCisgICAgICAgICAgICB4ID0gby5fX2NfXworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworICAgICAgICAgICAgby5fX2FfXyA9IDIKKyAgICAgICAgICAgIG8uX19iX18gPSAzCisgICAgICAgICAgICBvLl9fY19fID0gNAorCisgICAgICAgICAgICBvLl9fYV9fID0gMgorICAgICAgICAgICAgby5fX2JfXyA9IDMKKyAgICAgICAgICAgIG8uX19jX18gPSA0CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIHggPSBvLl9fYV9fCisgICAgICAgICAgICB4ID0gby5fX2JfXworICAgICAgICAgICAgeCA9IG8uX19jX18KKworICAgICAgICAgICAgeCA9IG8uX19hX18KKyAgICAgICAgICAgIHggPSBvLl9fYl9fCisgICAgICAgICAgICB4ID0gby5fX2NfXworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG8gPSBjKCkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZShUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gNSooMTIgKyAxMikKKyAgICByb3VuZHMgPSAxMDAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG8gPSBjKCkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKyAgICAgICAgICAgIG8uYSA9IDIKKyAgICAgICAgICAgIG8uYiA9IDMKKyAgICAgICAgICAgIG8uYyA9IDQKKworICAgICAgICAgICAgby5hID0gMgorICAgICAgICAgICAgby5iID0gMworICAgICAgICAgICAgby5jID0gNAorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICB4ID0gby5hCisgICAgICAgICAgICB4ID0gby5iCisgICAgICAgICAgICB4ID0gby5jCisKKyAgICAgICAgICAgIHggPSBvLmEKKyAgICAgICAgICAgIHggPSBvLmIKKyAgICAgICAgICAgIHggPSBvLmMKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKyAgICAgICAgICAgIG8uYSA9IDIKKyAgICAgICAgICAgIG8uYiA9IDMKKyAgICAgICAgICAgIG8uYyA9IDQKKworICAgICAgICAgICAgby5hID0gMgorICAgICAgICAgICAgby5iID0gMworICAgICAgICAgICAgby5jID0gNAorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICB4ID0gby5hCisgICAgICAgICAgICB4ID0gby5iCisgICAgICAgICAgICB4ID0gby5jCisKKyAgICAgICAgICAgIHggPSBvLmEKKyAgICAgICAgICAgIHggPSBvLmIKKyAgICAgICAgICAgIHggPSBvLmMKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKyAgICAgICAgICAgIG8uYSA9IDIKKyAgICAgICAgICAgIG8uYiA9IDMKKyAgICAgICAgICAgIG8uYyA9IDQKKworICAgICAgICAgICAgby5hID0gMgorICAgICAgICAgICAgby5iID0gMworICAgICAgICAgICAgby5jID0gNAorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICB4ID0gby5hCisgICAgICAgICAgICB4ID0gby5iCisgICAgICAgICAgICB4ID0gby5jCisKKyAgICAgICAgICAgIHggPSBvLmEKKyAgICAgICAgICAgIHggPSBvLmIKKyAgICAgICAgICAgIHggPSBvLmMKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKyAgICAgICAgICAgIG8uYSA9IDIKKyAgICAgICAgICAgIG8uYiA9IDMKKyAgICAgICAgICAgIG8uYyA9IDQKKworICAgICAgICAgICAgby5hID0gMgorICAgICAgICAgICAgby5iID0gMworICAgICAgICAgICAgby5jID0gNAorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICB4ID0gby5hCisgICAgICAgICAgICB4ID0gby5iCisgICAgICAgICAgICB4ID0gby5jCisKKyAgICAgICAgICAgIHggPSBvLmEKKyAgICAgICAgICAgIHggPSBvLmIKKyAgICAgICAgICAgIHggPSBvLmMKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKyAgICAgICAgICAgIG8uYSA9IDIKKyAgICAgICAgICAgIG8uYiA9IDMKKyAgICAgICAgICAgIG8uYyA9IDQKKworICAgICAgICAgICAgby5hID0gMgorICAgICAgICAgICAgby5iID0gMworICAgICAgICAgICAgby5jID0gNAorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICB4ID0gby5hCisgICAgICAgICAgICB4ID0gby5iCisgICAgICAgICAgICB4ID0gby5jCisKKyAgICAgICAgICAgIHggPSBvLmEKKyAgICAgICAgICAgIHggPSBvLmIKKyAgICAgICAgICAgIHggPSBvLmMKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBjbGFzcyBjOgorICAgICAgICAgICAgcGFzcworICAgICAgICBvID0gYygpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgQnVpbHRpbk1ldGhvZExvb2t1cChUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gNSooMyo1ICsgMyo1KQorICAgIHJvdW5kcyA9IDcwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBsID0gW10KKyAgICAgICAgZCA9IHt9CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorCisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorCisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKworICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKworICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorCisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKworICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKworICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKworICAgICAgICAgICAgZC5pdGVtcworICAgICAgICAgICAgZC5pdGVtcworICAgICAgICAgICAgZC5pdGVtcworICAgICAgICAgICAgZC5pdGVtcworICAgICAgICAgICAgZC5pdGVtcworCisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKworICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorCisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorCisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKworICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKworICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGwgPSBbXQorICAgICAgICBkID0ge30KKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL051bWJlcnMucHkgYi9Ub29scy9weWJlbmNoL051bWJlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjZjJlZAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvTnVtYmVycy5weQpAQCAtMCwwICsxLDc4NCBAQAorZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0CisKK2NsYXNzIENvbXBhcmVJbnRlZ2VycyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gMzAgKiA1CisgICAgcm91bmRzID0gMTIwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCisKK2NsYXNzIENvbXBhcmVGbG9hdHMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDMwICogNQorICAgIHJvdW5kcyA9IDYwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCisKK2NsYXNzIENvbXBhcmVGbG9hdHNJbnRlZ2VycyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gMzAgKiA1CisgICAgcm91bmRzID0gNjAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKKworY2xhc3MgQ29tcGFyZUxvbmdzKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSAzMCAqIDUKKyAgICByb3VuZHMgPSA2MDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKworICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKworICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvUkVBRE1FIGIvVG9vbHMvcHliZW5jaC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0ZTQxYgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvUkVBRE1FCkBAIC0wLDAgKzEsMzcyIEBACitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworUFlCRU5DSCAtIEEgUHl0aG9uIEJlbmNobWFyayBTdWl0ZQorX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAgRXh0ZW5kYWJsZSBzdWl0ZSBvZiBvZiBsb3ctbGV2ZWwgYmVuY2htYXJrcyBmb3IgbWVhc3VyaW5nCisgICAgICAgICAgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gCisgICAgICAgICAgICAgICAgIChpbnRlcnByZXRlciwgY29tcGlsZXIgb3IgVk0pLgorCitweWJlbmNoIGlzIGEgY29sbGVjdGlvbiBvZiB0ZXN0cyB0aGF0IHByb3ZpZGVzIGEgc3RhbmRhcmRpemVkIHdheSB0bworbWVhc3VyZSB0aGUgcGVyZm9ybWFuY2Ugb2YgUHl0aG9uIGltcGxlbWVudGF0aW9ucy4gSXQgdGFrZXMgYSB2ZXJ5CitjbG9zZSBsb29rIGF0IGRpZmZlcmVudCBhc3BlY3RzIG9mIFB5dGhvbiBwcm9ncmFtcyBhbmQgbGV0J3MgeW91CitkZWNpZGUgd2hpY2ggZmFjdG9ycyBhcmUgbW9yZSBpbXBvcnRhbnQgdG8geW91IHRoYW4gb3RoZXJzLCByYXRoZXIKK3RoYW4gd3JhcHBpbmcgZXZlcnl0aGluZyB1cCBpbiBvbmUgbnVtYmVyLCBsaWtlIHRoZSBvdGhlciBwZXJmb3JtYW5jZQordGVzdHMgZG8gKGUuZy4gcHlzdG9uZSB3aGljaCBpcyBpbmNsdWRlZCBpbiB0aGUgUHl0aG9uIFN0YW5kYXJkCitMaWJyYXJ5KS4KKworcHliZW5jaCBoYXMgYmVlbiB1c2VkIGluIHRoZSBwYXN0IGJ5IHNldmVyYWwgUHl0aG9uIGRldmVsb3BlcnMgdG8KK3RyYWNrIGRvd24gcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3IgdG8gZGVtb25zdHJhdGUgdGhlIGltcGFjdCBvZgorb3B0aW1pemF0aW9ucyBhbmQgbmV3IGZlYXR1cmVzIGluIFB5dGhvbi4KKworVGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgZm9yIHB5YmVuY2ggaXMgdGhlIGZpbGUgcHliZW5jaC5weS4gUnVuCit0aGlzIHNjcmlwdCB3aXRoIG9wdGlvbiAnLS1oZWxwJyB0byBnZXQgYSBsaXN0aW5nIG9mIHRoZSBwb3NzaWJsZQorb3B0aW9ucy4gV2l0aG91dCBvcHRpb25zLCBweWJlbmNoIHdpbGwgc2ltcGx5IGV4ZWN1dGUgdGhlIGJlbmNobWFyaworYW5kIHRoZW4gcHJpbnQgb3V0IGEgcmVwb3J0IHRvIHN0ZG91dC4KKworCitNaWNyby1NYW51YWwKKy0tLS0tLS0tLS0tLQorCitSdW4gJ3B5YmVuY2gucHkgLWgnIHRvIHNlZSB0aGUgaGVscCBzY3JlZW4uCitSdW4gJ3B5YmVuY2gucHknIHRvIGp1c3QgbGV0IHRoZSBiZW5jaG1hcmsgc3VpdGUgZG8gaXQncyB0aGluZyBhbmQKKydweWJlbmNoLnB5IC1mIDxmaWxlPicgdG8gaGF2ZSBpdCBzdG9yZSB0aGUgcmVzdWx0cyBpbiBhIGZpbGUgdG9vLgorCitUaGlzIGlzIHRoZSBjdXJyZW50IG91dHB1dCBvZiBweWJlbmNoLnB5IC0taGVscDoKKworU3lub3BzaXM6CisgcHliZW5jaC5weSBbb3B0aW9uXSBmaWxlcy4uLgorCitPcHRpb25zIGFuZCBkZWZhdWx0IHNldHRpbmdzOgorICAtbiBhcmcgICAgICAgICAgIG51bWJlciBvZiByb3VuZHMgKDEwKQorICAtZiBhcmcgICAgICAgICAgIHNhdmUgYmVuY2htYXJrIHRvIGZpbGUgYXJnICgpCisgIC1jIGFyZyAgICAgICAgICAgY29tcGFyZSBiZW5jaG1hcmsgd2l0aCB0aGUgb25lIGluIGZpbGUgYXJnICgpCisgIC1zIGFyZyAgICAgICAgICAgc2hvdyBiZW5jaG1hcmsgaW4gZmlsZSBhcmcsIHRoZW4gZXhpdCAoKQorICAtUyAgICAgICAgICAgICAgIHNob3cgc3RhdGlzdGljcyBvZiBiZW5jaG1hcmtzICgwKQorICAtdyBhcmcgICAgICAgICAgIHNldCB3YXJwIGZhY3RvciB0byBhcmcgKDIwKQorICAtZCAgICAgICAgICAgICAgIGhpZGUgbm9pc2UgaW4gY29tcGFyZXMgKDApCisgIC0tbm8tZ2MgICAgICAgICAgZGlzYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24gKDApCisgIC12ICAgICAgICAgICAgICAgZ2VuZXJhdGUgdmVyYm9zZSBvdXRwdXQKKyAgLWggICAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCB0ZXh0CisgIC0taGVscCAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgdGV4dAorICAtLWRlYnVnICAgICAgICAgIGVuYWJsZSBkZWJ1Z2dpbmcKKyAgLS1jb3B5cmlnaHQgICAgICBzaG93IGNvcHlyaWdodAorICAtLWV4YW1wbGVzICAgICAgIHNob3cgZXhhbXBsZXMgb2YgdXNhZ2UKKworVmVyc2lvbjoKKyAxLjMKKworVGhlIG5vcm1hbCBvcGVyYXRpb24gaXMgdG8gcnVuIHRoZSBzdWl0ZSBhbmQgZGlzcGxheSB0aGUKK3Jlc3VsdHMuIFVzZSAtZiB0byBzYXZlIHRoZW0gZm9yIGxhdGVyIHJldXNlIG9yIGNvbXBhcmlzbXMuCisKK0V4YW1wbGVzOgorCitweXRob24xLjUgcHliZW5jaC5weSAtdyAxMDAgLWYgcDE1CitweXRob24xLjQgcHliZW5jaC5weSAtdyAxMDAgLWYgcDE0CitweXRob24gcHliZW5jaC5weSAtcyBwMTUgLWMgcDE0CisKKworTGljZW5zZQorLS0tLS0tLQorCitTZWUgTElDRU5TRSBmaWxlLgorCisKK1NhbXBsZSBvdXRwdXQKKy0tLS0tLS0tLS0tLS0KKworUFlCRU5DSCAxLjMKKworTWFjaGluZSBEZXRhaWxzOgorICAgUGxhdGZvcm0gSUQ6ICBMaW51eC0yLjYuOC0yNC4xOS1kZWZhdWx0LXg4Nl82NC13aXRoLVN1U0UtOS4yLXg4Ni02NAorICAgRXhlY3V0YWJsZTogICAvaG9tZS9sZW1idXJnL3Byb2plY3RzL1B5dGhvbi9JbnN0YWxsYXRpb24vYmluL3B5dGhvbgorICAgUHl0aG9uOiAgICAgICAyLjVhMS4wCisgICBDb21waWxlcjogICAgIEdDQyAzLjMuNCAocHJlIDMuMy41IDIwMDQwODA5KQorICAgQnVpbGQ6ICAgICAgICBBcHIgIDkgMjAwNiAwMTo1MDo1NyAoI3RydW5rKQorCitTZWFyY2hpbmcgZm9yIHRlc3RzLi4uCisgICBCdWlsdGluRnVuY3Rpb25DYWxscworICAgQnVpbHRpbk1ldGhvZExvb2t1cAorICAgQ29tcGFyZUZsb2F0cworICAgQ29tcGFyZUZsb2F0c0ludGVnZXJzCisgICBDb21wYXJlSW50ZWdlcnMKKyAgIENvbXBhcmVJbnRlcm5lZFN0cmluZ3MKKyAgIENvbXBhcmVMb25ncworICAgQ29tcGFyZVN0cmluZ3MKKyAgIENvbXBhcmVVbmljb2RlCisgICBDb25jYXRTdHJpbmdzCisgICBDb25jYXRVbmljb2RlCisgICBDcmVhdGVJbnN0YW5jZXMKKyAgIENyZWF0ZVN0cmluZ3NXaXRoQ29uY2F0CisgICBDcmVhdGVVbmljb2RlV2l0aENvbmNhdAorICAgRGljdENyZWF0aW9uCisgICBEaWN0V2l0aEZsb2F0S2V5cworICAgRGljdFdpdGhJbnRlZ2VyS2V5cworICAgRGljdFdpdGhTdHJpbmdLZXlzCisgICBGb3JMb29wcworICAgSWZUaGVuRWxzZQorICAgTGlzdFNsaWNpbmcKKyAgIE5lc3RlZEZvckxvb3BzCisgICBOb3JtYWxDbGFzc0F0dHJpYnV0ZQorICAgTm9ybWFsSW5zdGFuY2VBdHRyaWJ1dGUKKyAgIFB5dGhvbkZ1bmN0aW9uQ2FsbHMKKyAgIFB5dGhvbk1ldGhvZENhbGxzCisgICBSZWN1cnNpb24KKyAgIFNlY29uZEltcG9ydAorICAgU2Vjb25kUGFja2FnZUltcG9ydAorICAgU2Vjb25kU3VibW9kdWxlSW1wb3J0CisgICBTaW1wbGVDb21wbGV4QXJpdGhtZXRpYworICAgU2ltcGxlRGljdE1hbmlwdWxhdGlvbgorICAgU2ltcGxlRmxvYXRBcml0aG1ldGljCisgICBTaW1wbGVJbnRGbG9hdEFyaXRobWV0aWMKKyAgIFNpbXBsZUludGVnZXJBcml0aG1ldGljCisgICBTaW1wbGVMaXN0TWFuaXB1bGF0aW9uCisgICBTaW1wbGVMb25nQXJpdGhtZXRpYworICAgU21hbGxMaXN0cworICAgU21hbGxUdXBsZXMKKyAgIFNwZWNpYWxDbGFzc0F0dHJpYnV0ZQorICAgU3BlY2lhbEluc3RhbmNlQXR0cmlidXRlCisgICBTdHJpbmdNYXBwaW5ncworICAgU3RyaW5nUHJlZGljYXRlcworICAgU3RyaW5nU2xpY2luZworICAgVHJ5RXhjZXB0CisgICBUcnlSYWlzZUV4Y2VwdAorICAgVHVwbGVTbGljaW5nCisgICBVbmljb2RlTWFwcGluZ3MKKyAgIFVuaWNvZGVQcmVkaWNhdGVzCisgICBVbmljb2RlUHJvcGVydGllcworICAgVW5pY29kZVNsaWNpbmcKKworUnVubmluZyAxMCByb3VuZChzKSBvZiB0aGUgc3VpdGU6CisKKy4uLgorCisgUm91bmQgMTAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCAgIGFicyAgICBvdmVyaGVhZAorICAgICAgICAgIEJ1aWx0aW5GdW5jdGlvbkNhbGxzOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCisgICAgICAgICAgIEJ1aWx0aW5NZXRob2RMb29rdXA6ICAgMC4wNTlyIDAuMDYwYSAwLjAwMW8KKyAgICAgICAgICAgICAgICAgQ29tcGFyZUZsb2F0czogICAwLjA1MHIgMC4wNTBhIDAuMDAwbworICAgICAgICAgQ29tcGFyZUZsb2F0c0ludGVnZXJzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCisgICAgICAgICAgICAgICBDb21wYXJlSW50ZWdlcnM6ICAgMC4wNzByIDAuMDcwYSAwLjAwMG8KKyAgICAgICAgQ29tcGFyZUludGVybmVkU3RyaW5nczogICAwLjAzOXIgMC4wNDBhIDAuMDAxbworICAgICAgICAgICAgICAgICAgQ29tcGFyZUxvbmdzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCisgICAgICAgICAgICAgICAgQ29tcGFyZVN0cmluZ3M6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICBDb21wYXJlVW5pY29kZTogICAwLjA2MHIgMC4wNjBhIDAuMDAwbworICAgICAgICAgICAgICAgICBDb25jYXRTdHJpbmdzOiAgIDAuMDQwciAwLjA0MGEgMC4wMDBvCisgICAgICAgICAgICAgICAgIENvbmNhdFVuaWNvZGU6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KKyAgICAgICAgICAgICAgIENyZWF0ZUluc3RhbmNlczogICAwLjA1MHIgMC4wNTBhIDAuMDAwbworICAgICAgIENyZWF0ZVN0cmluZ3NXaXRoQ29uY2F0OiAgIDAuMDI5ciAwLjAzMGEgMC4wMDFvCisgICAgICAgQ3JlYXRlVW5pY29kZVdpdGhDb25jYXQ6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICAgIERpY3RDcmVhdGlvbjogICAwLjA0MHIgMC4wNDBhIDAuMDAwbworICAgICAgICAgICAgIERpY3RXaXRoRmxvYXRLZXlzOiAgIDAuMDg5ciAwLjA5MGEgMC4wMDBvCisgICAgICAgICAgIERpY3RXaXRoSW50ZWdlcktleXM6ICAgMC4wNTlyIDAuMDYwYSAwLjAwMW8KKyAgICAgICAgICAgIERpY3RXaXRoU3RyaW5nS2V5czogICAwLjA3MHIgMC4wNzBhIDAuMDAxbworICAgICAgICAgICAgICAgICAgICAgIEZvckxvb3BzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCisgICAgICAgICAgICAgICAgICAgIElmVGhlbkVsc2U6ICAgMC4wNzByIDAuMDcwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICAgICBMaXN0U2xpY2luZzogICAwLjAzMHIgMC4wMzBhIDAuMDAwbworICAgICAgICAgICAgICAgIE5lc3RlZEZvckxvb3BzOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCisgICAgICAgICAgTm9ybWFsQ2xhc3NBdHRyaWJ1dGU6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KKyAgICAgICBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAwLjA2MHIgMC4wNjBhIDAuMDAwbworICAgICAgICAgICBQeXRob25GdW5jdGlvbkNhbGxzOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCisgICAgICAgICAgICAgUHl0aG9uTWV0aG9kQ2FsbHM6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICAgICAgIFJlY3Vyc2lvbjogICAwLjA1MHIgMC4wNTBhIDAuMDAwbworICAgICAgICAgICAgICAgICAgU2Vjb25kSW1wb3J0OiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCisgICAgICAgICAgIFNlY29uZFBhY2thZ2VJbXBvcnQ6ICAgMC4wMzByIDAuMDMwYSAwLjAwMG8KKyAgICAgICAgIFNlY29uZFN1Ym1vZHVsZUltcG9ydDogICAwLjA0MHIgMC4wNDBhIDAuMDAwbworICAgICAgIFNpbXBsZUNvbXBsZXhBcml0aG1ldGljOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCisgICAgICAgIFNpbXBsZURpY3RNYW5pcHVsYXRpb246ICAgMC4wNDByIDAuMDQwYSAwLjAwMG8KKyAgICAgICAgIFNpbXBsZUZsb2F0QXJpdGhtZXRpYzogICAwLjA1MHIgMC4wNTBhIDAuMDAxbworICAgICAgU2ltcGxlSW50RmxvYXRBcml0aG1ldGljOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCisgICAgICAgU2ltcGxlSW50ZWdlckFyaXRobWV0aWM6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KKyAgICAgICAgU2ltcGxlTGlzdE1hbmlwdWxhdGlvbjogICAwLjAzMHIgMC4wMzBhIDAuMDAwbworICAgICAgICAgIFNpbXBsZUxvbmdBcml0aG1ldGljOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCisgICAgICAgICAgICAgICAgICAgIFNtYWxsTGlzdHM6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICAgICBTbWFsbFR1cGxlczogICAwLjA1MHIgMC4wNTBhIDAuMDAwbworICAgICAgICAgU3BlY2lhbENsYXNzQXR0cmlidXRlOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCisgICAgICBTcGVjaWFsSW5zdGFuY2VBdHRyaWJ1dGU6ICAgMC4wNzlyIDAuMDgwYSAwLjAwMW8KKyAgICAgICAgICAgICAgICBTdHJpbmdNYXBwaW5nczogICAwLjA2MHIgMC4wNjBhIDAuMDAwbworICAgICAgICAgICAgICBTdHJpbmdQcmVkaWNhdGVzOiAgIDAuMDQ5ciAwLjA1MGEgMC4wMDFvCisgICAgICAgICAgICAgICAgIFN0cmluZ1NsaWNpbmc6ICAgMC4wMzlyIDAuMDQwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICAgICAgIFRyeUV4Y2VwdDogICAwLjA3OXIgMC4wODBhIDAuMDAxbworICAgICAgICAgICAgICAgIFRyeVJhaXNlRXhjZXB0OiAgIDAuMDU5ciAwLjA2MGEgMC4wMDFvCisgICAgICAgICAgICAgICAgICBUdXBsZVNsaWNpbmc6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KKyAgICAgICAgICAgICAgIFVuaWNvZGVNYXBwaW5nczogICAwLjA3MHIgMC4wNzBhIDAuMDAxbworICAgICAgICAgICAgIFVuaWNvZGVQcmVkaWNhdGVzOiAgIDAuMDU5ciAwLjA2MGEgMC4wMDFvCisgICAgICAgICAgICAgVW5pY29kZVByb3BlcnRpZXM6ICAgMC4wNTlyIDAuMDYwYSAwLjAwMW8KKyAgICAgICAgICAgICAgICBVbmljb2RlU2xpY2luZzogICAwLjA1MHIgMC4wNTBhIDAuMDAwbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQXZlcmFnZSByb3VuZCB0aW1lOiAgICAgIDIuOTM3IHNlY29uZHMKKworCitUZXN0czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXIgcnVuICAgIHBlciBvcGVyLiAgIG92ZXJoZWFkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBCdWlsdGluRnVuY3Rpb25DYWxsczogICAgICAyOS44NSBtcyAgICAwLjIzIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgQnVpbHRpbk1ldGhvZExvb2t1cDogICAgICA2Ni44NSBtcyAgICAwLjEzIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgQ29tcGFyZUZsb2F0czogICAgICA0My4wMCBtcyAgICAwLjEwIHVzICAgIDAuMDAgbXMKKyAgICAgICAgIENvbXBhcmVGbG9hdHNJbnRlZ2VyczogICAgICA1MS44MCBtcyAgICAwLjEyIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgIENvbXBhcmVJbnRlZ2VyczogICAgICA3MC43MCBtcyAgICAwLjA4IHVzICAgIDAuNTAgbXMKKyAgICAgICAgQ29tcGFyZUludGVybmVkU3RyaW5nczogICAgICA0MS40MCBtcyAgICAwLjA4IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgIENvbXBhcmVMb25nczogICAgICA0Ny45MCBtcyAgICAwLjExIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICBDb21wYXJlU3RyaW5nczogICAgICA1OC41MCBtcyAgICAwLjEyIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICBDb21wYXJlVW5pY29kZTogICAgICA1Ni41NSBtcyAgICAwLjE1IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgQ29uY2F0U3RyaW5nczogICAgICA0NC43NSBtcyAgICAwLjMwIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgQ29uY2F0VW5pY29kZTogICAgICA1NC41NSBtcyAgICAwLjM2IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgIENyZWF0ZUluc3RhbmNlczogICAgICA1MC45NSBtcyAgICAxLjIxIHVzICAgIDAuMDAgbXMKKyAgICAgICBDcmVhdGVTdHJpbmdzV2l0aENvbmNhdDogICAgICAyOC44NSBtcyAgICAwLjE0IHVzICAgIDAuNTAgbXMKKyAgICAgICBDcmVhdGVVbmljb2RlV2l0aENvbmNhdDogICAgICA1My43NSBtcyAgICAwLjI3IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgIERpY3RDcmVhdGlvbjogICAgICA0MS45MCBtcyAgICAwLjI4IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICBEaWN0V2l0aEZsb2F0S2V5czogICAgICA4OC41MCBtcyAgICAwLjE1IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgRGljdFdpdGhJbnRlZ2VyS2V5czogICAgICA2Mi41NSBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgIERpY3RXaXRoU3RyaW5nS2V5czogICAgICA2MC41MCBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgICAgICBGb3JMb29wczogICAgICA0Ni45MCBtcyAgICA0LjY5IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgICAgSWZUaGVuRWxzZTogICAgICA2MC41NSBtcyAgICAwLjA5IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgICBMaXN0U2xpY2luZzogICAgICAyOS45MCBtcyAgICA4LjU0IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICBOZXN0ZWRGb3JMb29wczogICAgICAzMy45NSBtcyAgICAwLjEwIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICBOb3JtYWxDbGFzc0F0dHJpYnV0ZTogICAgICA2Mi43NSBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKKyAgICAgICBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAgICA2MS44MCBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgUHl0aG9uRnVuY3Rpb25DYWxsczogICAgICA2MC4wMCBtcyAgICAwLjM2IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICBQeXRob25NZXRob2RDYWxsczogICAgICA1MC4wMCBtcyAgICAwLjY3IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgICAgIFJlY3Vyc2lvbjogICAgICA0Ni44NSBtcyAgICAzLjc1IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgIFNlY29uZEltcG9ydDogICAgICAzNS4wMCBtcyAgICAxLjQwIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgU2Vjb25kUGFja2FnZUltcG9ydDogICAgICAzMi4wMCBtcyAgICAxLjI4IHVzICAgIDAuMDAgbXMKKyAgICAgICAgIFNlY29uZFN1Ym1vZHVsZUltcG9ydDogICAgICAzOC4wMCBtcyAgICAxLjUyIHVzICAgIDAuMDAgbXMKKyAgICAgICBTaW1wbGVDb21wbGV4QXJpdGhtZXRpYzogICAgICAyNi44NSBtcyAgICAwLjEyIHVzICAgIDAuMDAgbXMKKyAgICAgICAgU2ltcGxlRGljdE1hbmlwdWxhdGlvbjogICAgICA0MC44NSBtcyAgICAwLjE0IHVzICAgIDAuMDAgbXMKKyAgICAgICAgIFNpbXBsZUZsb2F0QXJpdGhtZXRpYzogICAgICA0OC43MCBtcyAgICAwLjA5IHVzICAgIDAuNTAgbXMKKyAgICAgIFNpbXBsZUludEZsb2F0QXJpdGhtZXRpYzogICAgICA1Ny43MCBtcyAgICAwLjA5IHVzICAgIDAuMDAgbXMKKyAgICAgICBTaW1wbGVJbnRlZ2VyQXJpdGhtZXRpYzogICAgICA1OC43NSBtcyAgICAwLjA5IHVzICAgIDAuNTAgbXMKKyAgICAgICAgU2ltcGxlTGlzdE1hbmlwdWxhdGlvbjogICAgICAzNC44MCBtcyAgICAwLjEzIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICBTaW1wbGVMb25nQXJpdGhtZXRpYzogICAgICAzMC45NSBtcyAgICAwLjE5IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgICAgU21hbGxMaXN0czogICAgICA0Ny42MCBtcyAgICAwLjE5IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgICBTbWFsbFR1cGxlczogICAgICA0OC44MCBtcyAgICAwLjIwIHVzICAgIDAuNTAgbXMKKyAgICAgICAgIFNwZWNpYWxDbGFzc0F0dHJpYnV0ZTogICAgICA2MS43MCBtcyAgICAwLjEwIHVzICAgIDAuMDAgbXMKKyAgICAgIFNwZWNpYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAgICA3Ni43MCBtcyAgICAwLjEzIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICBTdHJpbmdNYXBwaW5nczogICAgICA1OC43MCBtcyAgICAwLjQ3IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgU3RyaW5nUHJlZGljYXRlczogICAgICA1MC4wMCBtcyAgICAwLjE4IHVzICAgIDEuMDAgbXMKKyAgICAgICAgICAgICAgICAgU3RyaW5nU2xpY2luZzogICAgICAzOS42NSBtcyAgICAwLjIzIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgICAgIFRyeUV4Y2VwdDogICAgICA4NC40NSBtcyAgICAwLjA2IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICBUcnlSYWlzZUV4Y2VwdDogICAgICA2MS43NSBtcyAgICA0LjEyIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgIFR1cGxlU2xpY2luZzogICAgICA0OC45NSBtcyAgICAwLjQ3IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgIFVuaWNvZGVNYXBwaW5nczogICAgICA3MS41MCBtcyAgICAzLjk3IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICBVbmljb2RlUHJlZGljYXRlczogICAgICA1Mi43NSBtcyAgICAwLjIzIHVzICAgIDEuMDAgbXMKKyAgICAgICAgICAgICBVbmljb2RlUHJvcGVydGllczogICAgICA2MS45MCBtcyAgICAwLjMxIHVzICAgIDEuMDAgbXMKKyAgICAgICAgICAgICAgICBVbmljb2RlU2xpY2luZzogICAgICA1My43NSBtcyAgICAwLjMxIHVzICAgIDAuNTAgbXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQXZlcmFnZSByb3VuZCB0aW1lOiAgICAyOTM3LjAwIG1zCisKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCitXcml0aW5nIE5ldyBUZXN0cworX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK3B5YmVuY2ggdGVzdHMgYXJlIHNpbXBsZSBtb2R1bGVzIGRlZmluaW5nIG9uZSBvciBtb3JlIHB5YmVuY2guVGVzdAorc3ViY2xhc3Nlcy4KKworV3JpdGluZyBhIHRlc3QgZXNzZW50aWFsbHkgYm9pbHMgZG93biB0byBwcm92aWRpbmcgdHdvIG1ldGhvZHM6CisudGVzdCgpIHdoaWNoIHJ1bnMgLnJvdW5kcyBudW1iZXIgb2YgLm9wZXJhdGlvbnMgdGVzdCBvcGVyYXRpb25zIGVhY2gKK2FuZCAuY2FsaWJyYXRlKCkgd2hpY2ggZG9lcyB0aGUgc2FtZSBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGFjdHVhbGx5CitleGVjdXRlIHRoZSBvcGVyYXRpb25zLgorCisKK0hlcmUncyBhbiBleGFtcGxlOgorLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Zyb20gcHliZW5jaCBpbXBvcnQgVGVzdAorCitjbGFzcyBJbnRlZ2VyQ291bnRpbmcoVGVzdCk6CisKKyAgICAjIFZlcnNpb24gbnVtYmVyIG9mIHRoZSB0ZXN0IGFzIGZsb2F0ICh4Lnl5KTsgdGhpcyBpcyBpbXBvcnRhbnQKKyAgICAjIGZvciBjb21wYXJpc29ucyBvZiBiZW5jaG1hcmsgcnVucyAtIHRlc3RzIHdpdGggdW5lcXVhbCB2ZXJzaW9uCisgICAgIyBudW1iZXIgd2lsbCBub3QgZ2V0IGNvbXBhcmVkLgorICAgIHZlcnNpb24gPSAxLjAKKyAgICAKKyAgICAjIFRoZSBudW1iZXIgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBkb25lIGluIGVhY2ggcm91bmQgb2YgdGhlCisgICAgIyB0ZXN0LiBBbiBvcGVyYXRpb24gaXMgdGhlIGJhc2ljIHVuaXQgb2Ygd2hhdCB5b3Ugd2FudCB0bworICAgICMgbWVhc3VyZS4gVGhlIGJlbmNobWFyayB3aWxsIG91dHB1dCB0aGUgYW1vdW50IG9mIHJ1bi10aW1lIHBlcgorICAgICMgb3BlcmF0aW9uLiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gcmFpc2UgdGhlIG1lYXN1cmVkIHRpbWluZ3MKKyAgICAjIHNpZ25pZmljYW50bHkgYWJvdmUgbm9pc2UgbGV2ZWwsIGl0IGlzIG9mdGVuIHJlcXVpcmVkIHRvIHJlcGVhdAorICAgICMgc2V0cyBvZiBvcGVyYXRpb25zIG1vcmUgdGhhbiBvbmNlIHBlciB0ZXN0IHJvdW5kLiBUaGUgbWVhc3VyZWQKKyAgICAjIG92ZXJoZWFkIHBlciB0ZXN0IHJvdW5kIHNob3VsZCBiZSBsZXNzIHRoYW4gMSBzZWNvbmQuCisgICAgb3BlcmF0aW9ucyA9IDIwCisKKyAgICAjIE51bWJlciBvZiByb3VuZHMgdG8gZXhlY3V0ZSBwZXIgdGVzdCBydW4uIFRoaXMgc2hvdWxkIGJlCisgICAgIyBhZGp1c3RlZCB0byBhIGZpZ3VyZSB0aGF0IHJlc3VsdHMgaW4gYSB0ZXN0IHJ1bi10aW1lIG9mIGJldHdlZW4KKyAgICAjIDIwLTUwIHNlY29uZHMuCisgICAgcm91bmRzID0gMTAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworCSIiIiBSdW4gdGhlIHRlc3QuCisKKwkgICAgVGhlIHRlc3QgbmVlZHMgdG8gcnVuIHNlbGYucm91bmRzIGV4ZWN1dGluZworCSAgICBzZWxmLm9wZXJhdGlvbnMgbnVtYmVyIG9mIG9wZXJhdGlvbnMgZWFjaC4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBJbml0IHRoZSB0ZXN0CisgICAgICAgIGEgPSAxCisKKyAgICAgICAgIyBSdW4gdGVzdCByb3VuZHMKKwkjCisgICAgICAgICMgTk9URTogVXNlIHhyYW5nZSgpIGZvciBhbGwgdGVzdCBsb29wcyB1bmxlc3MgeW91IHdhbnQgdG8gZmFjZQorCSMgYSAyME1CIHByb2Nlc3MgIQorCSMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgIyBSZXBlYXQgdGhlIG9wZXJhdGlvbnMgcGVyIHJvdW5kIHRvIHJhaXNlIHRoZSBydW4tdGltZQorICAgICAgICAgICAgIyBwZXIgb3BlcmF0aW9uIHNpZ25pZmljYW50bHkgYWJvdmUgdGhlIG5vaXNlIGxldmVsIG9mIHRoZQorICAgICAgICAgICAgIyBmb3ItbG9vcCBvdmVyaGVhZC4gCisKKwkgICAgIyBFeGVjdXRlIDIwIG9wZXJhdGlvbnMgKGEgKz0gMSk6CisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworCSIiIiBDYWxpYnJhdGUgdGhlIHRlc3QuCisKKwkgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGV4ZWN1dGUgZXZlcnl0aGluZyB0aGF0IGlzIG5lZWRlZCB0bworCSAgICBzZXR1cCBhbmQgcnVuIHRoZSB0ZXN0IC0gZXhjZXB0IGZvciB0aGUgYWN0dWFsIG9wZXJhdGlvbnMKKwkgICAgdGhhdCB5b3UgaW50ZW5kIHRvIG1lYXN1cmUuIHB5YmVuY2ggdXNlcyB0aGlzIG1ldGhvZCB0bworICAgICAgICAgICAgbWVhc3VyZSB0aGUgdGVzdCBpbXBsZW1lbnRhdGlvbiBvdmVyaGVhZC4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBJbml0IHRoZSB0ZXN0CisgICAgICAgIGEgPSAxCisKKyAgICAgICAgIyBSdW4gdGVzdCByb3VuZHMgKHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgYW55IG9wZXJhdGlvbikKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworCSAgICAjIFNraXAgdGhlIGFjdHVhbCBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbnMsIHNpbmNlIHdlCisJICAgICMgb25seSB3YW50IHRvIG1lYXN1cmUgdGhlIHRlc3QncyBhZG1pbmlzdHJhdGlvbiBvdmVyaGVhZC4KKyAgICAgICAgICAgIHBhc3MKKworUmVnaXN0ZXJpbmcgYSBuZXcgdGVzdCBtb2R1bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJlZ2lzdGVyIGEgdGVzdCBtb2R1bGUgd2l0aCBweWJlbmNoLCB0aGUgY2xhc3NlcyBuZWVkIHRvIGJlCitpbXBvcnRlZCBpbnRvIHRoZSBweWJlbmNoLlNldHVwIG1vZHVsZS4gcHliZW5jaCB3aWxsIHRoZW4gc2NhbiBhbGwgdGhlCitzeW1ib2xzIGRlZmluZWQgaW4gdGhhdCBtb2R1bGUgZm9yIHN1YmNsYXNzZXMgb2YgcHliZW5jaC5UZXN0IGFuZAorYXV0b21hdGljYWxseSBhZGQgdGhlbSB0byB0aGUgYmVuY2htYXJrIHN1aXRlLgorCisKK0hhdmUgZnVuLAorLS0KK01hcmMtQW5kcmUgTGVtYnVyZworbWFsQGxlbWJ1cmcuY29tCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL1NldHVwLnB5IGIvVG9vbHMvcHliZW5jaC9TZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDZhMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcHliZW5jaC9TZXR1cC5weQpAQCAtMCwwICsxLDM1IEBACisjIXB5dGhvbgorCisjIFNldHVwIGZpbGUgZm9yIHB5YmVuY2gKKyMKKyMgVGhpcyBmaWxlIGhhcyB0byBpbXBvcnQgYWxsIHRlc3RzIHRvIGJlIHJ1bjsgaXQgaXMgZXhlY3V0ZWQgYXMKKyMgUHl0aG9uIHNvdXJjZSBmaWxlLCBzbyB5b3UgY2FuIGRvIGFsbCBraW5kcyBvZiBtYW5pcHVsYXRpb25zIGhlcmUKKyMgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGVkaXQgdGhlIHRlc3RzIHRoZW1zZWx2ZXMuCisjCisjIE5vdGU6IFBsZWFzZSBrZWVwIHRoaXMgbW9kdWxlIGNvbXBhdGlibGUgdG8gUHl0aG9uIDEuNS4yLgorIworIyBUZXN0cyBtYXkgaW5jbHVkZSBmZWF0dXJlcyBpbiBsYXRlciBQeXRob24gdmVyc2lvbnMsIGJ1dCB0aGVzZQorIyBzaG91bGQgdGhlbiBiZSBlbWJlZGRlZCBpbiB0cnktZXhjZXB0IGNsYXVzZXMgaW4gdGhpcyBjb25maWd1cmF0aW9uCisjIG1vZHVsZS4KKworIyBEZWZhdWx0cworTnVtYmVyX29mX3JvdW5kcyA9IDEwCitXYXJwX2ZhY3RvciA9IDIwCisKKyMgSW1wb3J0IHRlc3RzCitmcm9tIEFyaXRobWV0aWMgaW1wb3J0ICoKK2Zyb20gQ2FsbHMgaW1wb3J0ICoKK2Zyb20gQ29uc3RydWN0cyBpbXBvcnQgKgorZnJvbSBMb29rdXBzIGltcG9ydCAqCitmcm9tIEluc3RhbmNlcyBpbXBvcnQgKgorZnJvbSBMaXN0cyBpbXBvcnQgKgorZnJvbSBUdXBsZXMgaW1wb3J0ICoKK2Zyb20gRGljdCBpbXBvcnQgKgorZnJvbSBFeGNlcHRpb25zIGltcG9ydCAqCitmcm9tIEltcG9ydHMgaW1wb3J0ICoKK2Zyb20gU3RyaW5ncyBpbXBvcnQgKgorZnJvbSBOdW1iZXJzIGltcG9ydCAqCit0cnk6CisgICAgZnJvbSBVbmljb2RlIGltcG9ydCAqCitleGNlcHQgKEltcG9ydEVycm9yLCBTeW50YXhFcnJvcik6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9TdHJpbmdzLnB5IGIvVG9vbHMvcHliZW5jaC9TdHJpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjQ1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL1N0cmluZ3MucHkKQEAgLTAsMCArMSw1NjQgQEAKK2Zyb20gcHliZW5jaCBpbXBvcnQgVGVzdAorZnJvbSBzdHJpbmcgaW1wb3J0IGpvaW4KKworY2xhc3MgQ29uY2F0U3RyaW5ncyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gMTAgKiA1CisgICAgcm91bmRzID0gNjAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdHJpbmdzIGFyZSAqbm90KiBpbnRlcm5lZAorICAgICAgICBzID0gam9pbihtYXAoc3RyLHJhbmdlKDEwMCkpKQorICAgICAgICB0ID0gam9pbihtYXAoc3RyLHJhbmdlKDEsMTAxKSkpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBzID0gam9pbihtYXAoc3RyLHJhbmdlKDEwMCkpKQorICAgICAgICB0ID0gam9pbihtYXAoc3RyLHJhbmdlKDEsMTAxKSkpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIAorCitjbGFzcyBDb21wYXJlU3RyaW5ncyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjIKKyAgICBvcGVyYXRpb25zID0gMTAgKiA1CisgICAgcm91bmRzID0gMjAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc3RyaW5ncyBhcmUgKm5vdCogaW50ZXJuZWQKKyAgICAgICAgcyA9IGpvaW4obWFwKHN0cixyYW5nZSgxMCkpKQorICAgICAgICB0ID0gam9pbihtYXAoc3RyLHJhbmdlKDEwKSkpICsgImFiYyIKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBzID0gam9pbihtYXAoc3RyLHJhbmdlKDEwKSkpCisgICAgICAgIHQgPSBqb2luKG1hcChzdHIscmFuZ2UoMTApKSkgKyAiYWJjIgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAKKworY2xhc3MgQ29tcGFyZUludGVybmVkU3RyaW5ncyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gMTAgKiA1CisgICAgcm91bmRzID0gMjAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc3RyaW5ncyAqYXJlKiBpbnRlcm5lZAorICAgICAgICBzID0gaW50ZXJuKGpvaW4obWFwKHN0cixyYW5nZSgxMCkpKSkKKyAgICAgICAgdCA9IHMKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPj0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID49IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPj0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID49IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPj0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID49IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPj0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIHMgPSBpbnRlcm4oam9pbihtYXAoc3RyLHJhbmdlKDEwKSkpKQorICAgICAgICB0ID0gcworCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAKKworY2xhc3MgQ3JlYXRlU3RyaW5nc1dpdGhDb25jYXQoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDEwICogNQorICAgIHJvdW5kcyA9IDgwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcyA9ICdvbScKKyAgICAgICAgICAgIHMgPSBzICsgJ3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyAneGF4JworICAgICAgICAgICAgcyA9IHMgKyAneGJ4JworICAgICAgICAgICAgcyA9IHMgKyAneGN4JworICAgICAgICAgICAgcyA9IHMgKyAneGR4JworICAgICAgICAgICAgcyA9IHMgKyAneGV4JworCisgICAgICAgICAgICBzID0gcyArICd4YXgnCisgICAgICAgICAgICBzID0gcyArICd4YngnCisgICAgICAgICAgICBzID0gcyArICd4Y3gnCisgICAgICAgICAgICBzID0gcyArICd4ZHgnCisgICAgICAgICAgICBzID0gcyArICd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgJ3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyAneGF4JworICAgICAgICAgICAgcyA9IHMgKyAneGJ4JworICAgICAgICAgICAgcyA9IHMgKyAneGN4JworICAgICAgICAgICAgcyA9IHMgKyAneGR4JworICAgICAgICAgICAgcyA9IHMgKyAneGV4JworCisgICAgICAgICAgICBzID0gcyArICd4YXgnCisgICAgICAgICAgICBzID0gcyArICd4YngnCisgICAgICAgICAgICBzID0gcyArICd4Y3gnCisgICAgICAgICAgICBzID0gcyArICd4ZHgnCisgICAgICAgICAgICBzID0gcyArICd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgJ3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyAneGF4JworICAgICAgICAgICAgcyA9IHMgKyAneGJ4JworICAgICAgICAgICAgcyA9IHMgKyAneGN4JworICAgICAgICAgICAgcyA9IHMgKyAneGR4JworICAgICAgICAgICAgcyA9IHMgKyAneGV4JworCisgICAgICAgICAgICBzID0gcyArICd4YXgnCisgICAgICAgICAgICBzID0gcyArICd4YngnCisgICAgICAgICAgICBzID0gcyArICd4Y3gnCisgICAgICAgICAgICBzID0gcyArICd4ZHgnCisgICAgICAgICAgICBzID0gcyArICd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgJ3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hleCcKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIAorCitjbGFzcyBTdHJpbmdTbGljaW5nKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSA1ICogNworICAgIHJvdW5kcyA9IDEwMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgcyA9IGpvaW4obWFwKHN0cixyYW5nZSgxMDApKSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAgICAgc1s1MDpdCisgICAgICAgICAgICAgICAgc1s6MjVdCisgICAgICAgICAgICAgICAgc1s1MDo1NV0KKyAgICAgICAgICAgICAgICBzWy0xOl0KKyAgICAgICAgICAgICAgICBzWzoxXQorICAgICAgICAgICAgICAgIHNbMjpdCisgICAgICAgICAgICAgICAgc1sxMTotMTFdCisKKyAgICAgICAgICAgICAgICBzWzUwOl0KKyAgICAgICAgICAgICAgICBzWzoyNV0KKyAgICAgICAgICAgICAgICBzWzUwOjU1XQorICAgICAgICAgICAgICAgIHNbLTE6XQorICAgICAgICAgICAgICAgIHNbOjFdCisgICAgICAgICAgICAgICAgc1syOl0KKyAgICAgICAgICAgICAgICBzWzExOi0xMV0KKworICAgICAgICAgICAgICAgIHNbNTA6XQorICAgICAgICAgICAgICAgIHNbOjI1XQorICAgICAgICAgICAgICAgIHNbNTA6NTVdCisgICAgICAgICAgICAgICAgc1stMTpdCisgICAgICAgICAgICAgICAgc1s6MV0KKyAgICAgICAgICAgICAgICBzWzI6XQorICAgICAgICAgICAgICAgIHNbMTE6LTExXQorCisgICAgICAgICAgICAgICAgc1s1MDpdCisgICAgICAgICAgICAgICAgc1s6MjVdCisgICAgICAgICAgICAgICAgc1s1MDo1NV0KKyAgICAgICAgICAgICAgICBzWy0xOl0KKyAgICAgICAgICAgICAgICBzWzoxXQorICAgICAgICAgICAgICAgIHNbMjpdCisgICAgICAgICAgICAgICAgc1sxMTotMTFdCisKKyAgICAgICAgICAgICAgICBzWzUwOl0KKyAgICAgICAgICAgICAgICBzWzoyNV0KKyAgICAgICAgICAgICAgICBzWzUwOjU1XQorICAgICAgICAgICAgICAgIHNbLTE6XQorICAgICAgICAgICAgICAgIHNbOjFdCisgICAgICAgICAgICAgICAgc1syOl0KKyAgICAgICAgICAgICAgICBzWzExOi0xMV0KKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgcyA9IGpvaW4obWFwKHN0cixyYW5nZSgxMDApKSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCisjIyMgU3RyaW5nIG1ldGhvZHMKKworaWYgaGFzYXR0cignJywgJ2xvd2VyJyk6CisKKyAgICBjbGFzcyBTdHJpbmdNYXBwaW5ncyhUZXN0KToKKworICAgICAgICB2ZXJzaW9uID0gMC4xCisgICAgICAgIG9wZXJhdGlvbnMgPSAzICogKDUgKyA0ICsgMiArIDEpCisgICAgICAgIHJvdW5kcyA9IDcwMDAwCisKKyAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgICAgIHMgPSBqb2luKG1hcChjaHIscmFuZ2UoMjApKSwnJykKKyAgICAgICAgICAgIHQgPSBqb2luKG1hcChjaHIscmFuZ2UoNTApKSwnJykKKyAgICAgICAgICAgIHUgPSBqb2luKG1hcChjaHIscmFuZ2UoMTAwKSksJycpCisgICAgICAgICAgICB2ID0gam9pbihtYXAoY2hyLHJhbmdlKDI1NikpLCcnKQorCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAgICAgcy5sb3dlcigpCisgICAgICAgICAgICAgICAgcy5sb3dlcigpCisgICAgICAgICAgICAgICAgcy5sb3dlcigpCisgICAgICAgICAgICAgICAgcy5sb3dlcigpCisgICAgICAgICAgICAgICAgcy5sb3dlcigpCisKKyAgICAgICAgICAgICAgICBzLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBzLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBzLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBzLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBzLnVwcGVyKCkKKworICAgICAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgICAgIHMudGl0bGUoKQorCisgICAgICAgICAgICAgICAgdC5sb3dlcigpCisgICAgICAgICAgICAgICAgdC5sb3dlcigpCisgICAgICAgICAgICAgICAgdC5sb3dlcigpCisgICAgICAgICAgICAgICAgdC5sb3dlcigpCisKKyAgICAgICAgICAgICAgICB0LnVwcGVyKCkKKyAgICAgICAgICAgICAgICB0LnVwcGVyKCkKKyAgICAgICAgICAgICAgICB0LnVwcGVyKCkKKyAgICAgICAgICAgICAgICB0LnVwcGVyKCkKKworICAgICAgICAgICAgICAgIHQudGl0bGUoKQorICAgICAgICAgICAgICAgIHQudGl0bGUoKQorICAgICAgICAgICAgICAgIHQudGl0bGUoKQorICAgICAgICAgICAgICAgIHQudGl0bGUoKQorCisgICAgICAgICAgICAgICAgdS5sb3dlcigpCisgICAgICAgICAgICAgICAgdS5sb3dlcigpCisKKyAgICAgICAgICAgICAgICB1LnVwcGVyKCkKKyAgICAgICAgICAgICAgICB1LnVwcGVyKCkKKworICAgICAgICAgICAgICAgIHUudGl0bGUoKQorICAgICAgICAgICAgICAgIHUudGl0bGUoKQorCisgICAgICAgICAgICAgICAgdi5sb3dlcigpCisKKyAgICAgICAgICAgICAgICB2LnVwcGVyKCkKKworICAgICAgICAgICAgICAgIHYudGl0bGUoKQorCisgICAgICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgICAgIHMgPSBqb2luKG1hcChjaHIscmFuZ2UoMjApKSwnJykKKyAgICAgICAgICAgIHQgPSBqb2luKG1hcChjaHIscmFuZ2UoNTApKSwnJykKKyAgICAgICAgICAgIHUgPSBqb2luKG1hcChjaHIscmFuZ2UoMTAwKSksJycpCisgICAgICAgICAgICB2ID0gam9pbihtYXAoY2hyLHJhbmdlKDI1NikpLCcnKQorCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGNsYXNzIFN0cmluZ1ByZWRpY2F0ZXMoVGVzdCk6CisKKyAgICAgICAgdmVyc2lvbiA9IDAuMQorICAgICAgICBvcGVyYXRpb25zID0gMTAgKiA3CisgICAgICAgIHJvdW5kcyA9IDgwMDAwCisKKyAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgICAgIGRhdGEgPSAoJ2FiYycsICcxMjMnLCAnICAgJywgJ1x4ZTRceGY2XHhmYycsICdceGRmJyoxMCkKKyAgICAgICAgICAgIGxlbl9kYXRhID0gbGVuKGRhdGEpCisKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICAgICAgcyA9IGRhdGFbaSAlIGxlbl9kYXRhXQorCisgICAgICAgICAgICAgICAgcy5pc2FsbnVtKCkKKyAgICAgICAgICAgICAgICBzLmlzYWxwaGEoKQorICAgICAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICAgICAgcy5pc2xvd2VyKCkKKyAgICAgICAgICAgICAgICBzLmlzc3BhY2UoKQorICAgICAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICAgICAgcy5pc3VwcGVyKCkKKworICAgICAgICAgICAgICAgIHMuaXNhbG51bSgpCisgICAgICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgICAgICBzLmlzZGlnaXQoKQorICAgICAgICAgICAgICAgIHMuaXNsb3dlcigpCisgICAgICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgICAgICBzLmlzdGl0bGUoKQorICAgICAgICAgICAgICAgIHMuaXN1cHBlcigpCisKKyAgICAgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgICAgIHMuaXNhbHBoYSgpCisgICAgICAgICAgICAgICAgcy5pc2RpZ2l0KCkKKyAgICAgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgICAgIHMuaXNzcGFjZSgpCisgICAgICAgICAgICAgICAgcy5pc3RpdGxlKCkKKyAgICAgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICAgICAgcy5pc2FsbnVtKCkKKyAgICAgICAgICAgICAgICBzLmlzYWxwaGEoKQorICAgICAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICAgICAgcy5pc2xvd2VyKCkKKyAgICAgICAgICAgICAgICBzLmlzc3BhY2UoKQorICAgICAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICAgICAgcy5pc3VwcGVyKCkKKworICAgICAgICAgICAgICAgIHMuaXNhbG51bSgpCisgICAgICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgICAgICBzLmlzZGlnaXQoKQorICAgICAgICAgICAgICAgIHMuaXNsb3dlcigpCisgICAgICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgICAgICBzLmlzdGl0bGUoKQorICAgICAgICAgICAgICAgIHMuaXN1cHBlcigpCisKKyAgICAgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgICAgIHMuaXNhbHBoYSgpCisgICAgICAgICAgICAgICAgcy5pc2RpZ2l0KCkKKyAgICAgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgICAgIHMuaXNzcGFjZSgpCisgICAgICAgICAgICAgICAgcy5pc3RpdGxlKCkKKyAgICAgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICAgICAgcy5pc2FsbnVtKCkKKyAgICAgICAgICAgICAgICBzLmlzYWxwaGEoKQorICAgICAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICAgICAgcy5pc2xvd2VyKCkKKyAgICAgICAgICAgICAgICBzLmlzc3BhY2UoKQorICAgICAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICAgICAgcy5pc3VwcGVyKCkKKworICAgICAgICAgICAgICAgIHMuaXNhbG51bSgpCisgICAgICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgICAgICBzLmlzZGlnaXQoKQorICAgICAgICAgICAgICAgIHMuaXNsb3dlcigpCisgICAgICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgICAgICBzLmlzdGl0bGUoKQorICAgICAgICAgICAgICAgIHMuaXN1cHBlcigpCisKKyAgICAgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgICAgIHMuaXNhbHBoYSgpCisgICAgICAgICAgICAgICAgcy5pc2RpZ2l0KCkKKyAgICAgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgICAgIHMuaXNzcGFjZSgpCisgICAgICAgICAgICAgICAgcy5pc3RpdGxlKCkKKyAgICAgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICAgICAgcy5pc2FsbnVtKCkKKyAgICAgICAgICAgICAgICBzLmlzYWxwaGEoKQorICAgICAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICAgICAgcy5pc2xvd2VyKCkKKyAgICAgICAgICAgICAgICBzLmlzc3BhY2UoKQorICAgICAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICAgICAgcy5pc3VwcGVyKCkKKworICAgICAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgICAgICBkYXRhID0gKCdhYmMnLCAnMTIzJywgJyAgICcsICdcdTEyMzRcdTIzNDVcdTM0NTYnLCAnXHVGRkZGJyoxMCkKKyAgICAgICAgICAgIGRhdGEgPSAoJ2FiYycsICcxMjMnLCAnICAgJywgJ1x4ZTRceGY2XHhmYycsICdceGRmJyoxMCkKKyAgICAgICAgICAgIGxlbl9kYXRhID0gbGVuKGRhdGEpCisKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICAgICAgcyA9IGRhdGFbaSAlIGxlbl9kYXRhXQorCisKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvVHVwbGVzLnB5IGIvVG9vbHMvcHliZW5jaC9UdXBsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1NGRlZgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvVHVwbGVzLnB5CkBAIC0wLDAgKzEsMzY1IEBACitmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKKworY2xhc3MgVHVwbGVTbGljaW5nKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMzEKKyAgICBvcGVyYXRpb25zID0gMyAqIDI1ICogMTAgKiA3CisgICAgcm91bmRzID0gNDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICByID0gcmFuZ2UoMjUpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgdCA9IHR1cGxlKHJhbmdlKDEwMCkpCisKKyAgICAgICAgICAgIGZvciBqIGluIHI6CisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIHIgPSByYW5nZSgyNSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICB0ID0gdHVwbGUocmFuZ2UoMTAwKSkKKworICAgICAgICAgICAgZm9yIGogaW4gcjoKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwYXNzCisKK2NsYXNzIFNtYWxsVHVwbGVzKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMworICAgIG9wZXJhdGlvbnMgPSA1KigxICsgMyArIDYgKyAyKQorICAgIHJvdW5kcyA9IDgwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICB0ID0gKDEsMiwzLDQsNSw2KQorCisgICAgICAgICAgICBhLGIsYyxkLGUsZiA9IHQKKyAgICAgICAgICAgIGEsYixjLGQsZSxmID0gdAorICAgICAgICAgICAgYSxiLGMsZCxlLGYgPSB0CisKKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKworICAgICAgICAgICAgbCA9IGxpc3QodCkKKyAgICAgICAgICAgIHQgPSB0dXBsZShsKQorCisgICAgICAgICAgICB0ID0gKDEsMiwzLDQsNSw2KQorCisgICAgICAgICAgICBhLGIsYyxkLGUsZiA9IHQKKyAgICAgICAgICAgIGEsYixjLGQsZSxmID0gdAorICAgICAgICAgICAgYSxiLGMsZCxlLGYgPSB0CisKKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKworICAgICAgICAgICAgbCA9IGxpc3QodCkKKyAgICAgICAgICAgIHQgPSB0dXBsZShsKQorCisgICAgICAgICAgICB0ID0gKDEsMiwzLDQsNSw2KQorCisgICAgICAgICAgICBhLGIsYyxkLGUsZiA9IHQKKyAgICAgICAgICAgIGEsYixjLGQsZSxmID0gdAorICAgICAgICAgICAgYSxiLGMsZCxlLGYgPSB0CisKKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKworICAgICAgICAgICAgbCA9IGxpc3QodCkKKyAgICAgICAgICAgIHQgPSB0dXBsZShsKQorCisgICAgICAgICAgICB0ID0gKDEsMiwzLDQsNSw2KQorCisgICAgICAgICAgICBhLGIsYyxkLGUsZiA9IHQKKyAgICAgICAgICAgIGEsYixjLGQsZSxmID0gdAorICAgICAgICAgICAgYSxiLGMsZCxlLGYgPSB0CisKKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKworICAgICAgICAgICAgbCA9IGxpc3QodCkKKyAgICAgICAgICAgIHQgPSB0dXBsZShsKQorCisgICAgICAgICAgICB0ID0gKDEsMiwzLDQsNSw2KQorCisgICAgICAgICAgICBhLGIsYyxkLGUsZiA9IHQKKyAgICAgICAgICAgIGEsYixjLGQsZSxmID0gdAorICAgICAgICAgICAgYSxiLGMsZCxlLGYgPSB0CisKKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKworICAgICAgICAgICAgbCA9IGxpc3QodCkKKyAgICAgICAgICAgIHQgPSB0dXBsZShsKQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL1VuaWNvZGUucHkgYi9Ub29scy9weWJlbmNoL1VuaWNvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1ZmNmMgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvVW5pY29kZS5weQpAQCAtMCwwICsxLDU0MiBAQAordHJ5OgorICAgIHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcmFpc2UgSW1wb3J0RXJyb3IKKworZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0Citmcm9tIHN0cmluZyBpbXBvcnQgam9pbgorCitjbGFzcyBDb25jYXRVbmljb2RlKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSAxMCAqIDUKKyAgICByb3VuZHMgPSA2MDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHN0cmluZ3MgYXJlICpub3QqIGludGVybmVkCisgICAgICAgIHMgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxMDApKSkpCisgICAgICAgIHQgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxLDEwMSkpKSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIHMgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxMDApKSkpCisgICAgICAgIHQgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxLDEwMSkpKSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgCisKK2NsYXNzIENvbXBhcmVVbmljb2RlKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSAxMCAqIDUKKyAgICByb3VuZHMgPSAxNTAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdHJpbmdzIGFyZSAqbm90KiBpbnRlcm5lZAorICAgICAgICBzID0gdW5pY29kZShqb2luKG1hcChzdHIscmFuZ2UoMTApKSkpCisgICAgICAgIHQgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxMCkpKSArICJhYmMiKQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIHMgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxMCkpKSkKKyAgICAgICAgdCA9IHVuaWNvZGUoam9pbihtYXAoc3RyLHJhbmdlKDEwKSkpICsgImFiYyIpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIAorCitjbGFzcyBDcmVhdGVVbmljb2RlV2l0aENvbmNhdChUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gMTAgKiA1CisgICAgcm91bmRzID0gODAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBzID0gdSdvbScKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YngnCisgICAgICAgICAgICBzID0gcyArIHUneGN4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YXgnCisgICAgICAgICAgICBzID0gcyArIHUneGJ4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZHgnCisgICAgICAgICAgICBzID0gcyArIHUneGV4JworCisgICAgICAgICAgICBzID0gcyArIHUneGF4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4Y3gnCisgICAgICAgICAgICBzID0gcyArIHUneGR4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyB1J3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YngnCisgICAgICAgICAgICBzID0gcyArIHUneGN4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YXgnCisgICAgICAgICAgICBzID0gcyArIHUneGJ4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZHgnCisgICAgICAgICAgICBzID0gcyArIHUneGV4JworCisgICAgICAgICAgICBzID0gcyArIHUneGF4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4Y3gnCisgICAgICAgICAgICBzID0gcyArIHUneGR4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyB1J3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YngnCisgICAgICAgICAgICBzID0gcyArIHUneGN4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YXgnCisgICAgICAgICAgICBzID0gcyArIHUneGJ4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZHgnCisgICAgICAgICAgICBzID0gcyArIHUneGV4JworCisgICAgICAgICAgICBzID0gcyArIHUneGF4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4Y3gnCisgICAgICAgICAgICBzID0gcyArIHUneGR4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyB1J3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YngnCisgICAgICAgICAgICBzID0gcyArIHUneGN4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZXgnCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAKKworY2xhc3MgVW5pY29kZVNsaWNpbmcoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDUgKiA3CisgICAgcm91bmRzID0gMTAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBzID0gdW5pY29kZShqb2luKG1hcChzdHIscmFuZ2UoMTAwKSkpKQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIHNbNTA6XQorICAgICAgICAgICAgc1s6MjVdCisgICAgICAgICAgICBzWzUwOjU1XQorICAgICAgICAgICAgc1stMTpdCisgICAgICAgICAgICBzWzoxXQorICAgICAgICAgICAgc1syOl0KKyAgICAgICAgICAgIHNbMTE6LTExXQorCisgICAgICAgICAgICBzWzUwOl0KKyAgICAgICAgICAgIHNbOjI1XQorICAgICAgICAgICAgc1s1MDo1NV0KKyAgICAgICAgICAgIHNbLTE6XQorICAgICAgICAgICAgc1s6MV0KKyAgICAgICAgICAgIHNbMjpdCisgICAgICAgICAgICBzWzExOi0xMV0KKworICAgICAgICAgICAgc1s1MDpdCisgICAgICAgICAgICBzWzoyNV0KKyAgICAgICAgICAgIHNbNTA6NTVdCisgICAgICAgICAgICBzWy0xOl0KKyAgICAgICAgICAgIHNbOjFdCisgICAgICAgICAgICBzWzI6XQorICAgICAgICAgICAgc1sxMTotMTFdCisKKyAgICAgICAgICAgIHNbNTA6XQorICAgICAgICAgICAgc1s6MjVdCisgICAgICAgICAgICBzWzUwOjU1XQorICAgICAgICAgICAgc1stMTpdCisgICAgICAgICAgICBzWzoxXQorICAgICAgICAgICAgc1syOl0KKyAgICAgICAgICAgIHNbMTE6LTExXQorCisgICAgICAgICAgICBzWzUwOl0KKyAgICAgICAgICAgIHNbOjI1XQorICAgICAgICAgICAgc1s1MDo1NV0KKyAgICAgICAgICAgIHNbLTE6XQorICAgICAgICAgICAgc1s6MV0KKyAgICAgICAgICAgIHNbMjpdCisgICAgICAgICAgICBzWzExOi0xMV0KKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgcyA9IHVuaWNvZGUoam9pbihtYXAoc3RyLHJhbmdlKDEwMCkpKSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAKKyMjIyBTdHJpbmcgbWV0aG9kcworCitjbGFzcyBVbmljb2RlTWFwcGluZ3MoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDMgKiAoNSArIDQgKyAyICsgMSkKKyAgICByb3VuZHMgPSAxMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgcyA9IGpvaW4obWFwKHVuaWNocixyYW5nZSgyMCkpLCcnKQorICAgICAgICB0ID0gam9pbihtYXAodW5pY2hyLHJhbmdlKDEwMCkpLCcnKQorICAgICAgICB1ID0gam9pbihtYXAodW5pY2hyLHJhbmdlKDUwMCkpLCcnKQorICAgICAgICB2ID0gam9pbihtYXAodW5pY2hyLHJhbmdlKDEwMDApKSwnJykKKyAgICAgICAgCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIHMubG93ZXIoKQorICAgICAgICAgICAgcy5sb3dlcigpCisgICAgICAgICAgICBzLmxvd2VyKCkKKyAgICAgICAgICAgIHMubG93ZXIoKQorICAgICAgICAgICAgcy5sb3dlcigpCisKKyAgICAgICAgICAgIHMudXBwZXIoKQorICAgICAgICAgICAgcy51cHBlcigpCisgICAgICAgICAgICBzLnVwcGVyKCkKKyAgICAgICAgICAgIHMudXBwZXIoKQorICAgICAgICAgICAgcy51cHBlcigpCisKKyAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgcy50aXRsZSgpCisgICAgICAgICAgICBzLnRpdGxlKCkKKyAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgcy50aXRsZSgpCisKKyAgICAgICAgICAgIHQubG93ZXIoKQorICAgICAgICAgICAgdC5sb3dlcigpCisgICAgICAgICAgICB0Lmxvd2VyKCkKKyAgICAgICAgICAgIHQubG93ZXIoKQorCisgICAgICAgICAgICB0LnVwcGVyKCkKKyAgICAgICAgICAgIHQudXBwZXIoKQorICAgICAgICAgICAgdC51cHBlcigpCisgICAgICAgICAgICB0LnVwcGVyKCkKKworICAgICAgICAgICAgdC50aXRsZSgpCisgICAgICAgICAgICB0LnRpdGxlKCkKKyAgICAgICAgICAgIHQudGl0bGUoKQorICAgICAgICAgICAgdC50aXRsZSgpCisKKyAgICAgICAgICAgIHUubG93ZXIoKQorICAgICAgICAgICAgdS5sb3dlcigpCisKKyAgICAgICAgICAgIHUudXBwZXIoKQorICAgICAgICAgICAgdS51cHBlcigpCisKKyAgICAgICAgICAgIHUudGl0bGUoKQorICAgICAgICAgICAgdS50aXRsZSgpCisKKyAgICAgICAgICAgIHYubG93ZXIoKQorCisgICAgICAgICAgICB2LnVwcGVyKCkKKworICAgICAgICAgICAgdi50aXRsZSgpCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIHMgPSBqb2luKG1hcCh1bmljaHIscmFuZ2UoMjApKSwnJykKKyAgICAgICAgdCA9IGpvaW4obWFwKHVuaWNocixyYW5nZSgxMDApKSwnJykKKyAgICAgICAgdSA9IGpvaW4obWFwKHVuaWNocixyYW5nZSg1MDApKSwnJykKKyAgICAgICAgdiA9IGpvaW4obWFwKHVuaWNocixyYW5nZSgxMDAwKSksJycpCisgICAgICAgIAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBVbmljb2RlUHJlZGljYXRlcyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gNSAqIDkKKyAgICByb3VuZHMgPSAxMDAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGRhdGEgPSAodSdhYmMnLCB1JzEyMycsIHUnICAgJywgdSdcdTEyMzRcdTIzNDVcdTM0NTYnLCB1J1x1RkZGRicqMTApCisgICAgICAgIGxlbl9kYXRhID0gbGVuKGRhdGEpCisgICAgICAgIAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcyA9IGRhdGFbaSAlIGxlbl9kYXRhXQorCisgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgIHMuaXNkZWNpbWFsKCkKKyAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgcy5pc251bWVyaWMoKQorICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgIHMuaXNkZWNpbWFsKCkKKyAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgcy5pc251bWVyaWMoKQorICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgIHMuaXNkZWNpbWFsKCkKKyAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgcy5pc251bWVyaWMoKQorICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgIHMuaXNkZWNpbWFsKCkKKyAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgcy5pc251bWVyaWMoKQorICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgIHMuaXNkZWNpbWFsKCkKKyAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgcy5pc251bWVyaWMoKQorICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBkYXRhID0gKHUnYWJjJywgdScxMjMnLCB1JyAgICcsIHUnXHUxMjM0XHUyMzQ1XHUzNDU2JywgdSdcdUZGRkYnKjEwKQorICAgICAgICBsZW5fZGF0YSA9IGxlbihkYXRhKQorICAgICAgICAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHMgPSBkYXRhW2kgJSBsZW5fZGF0YV0KKwordHJ5OgorICAgIGltcG9ydCB1bmljb2RlZGF0YQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgVW5pY29kZVByb3BlcnRpZXMoVGVzdCk6CisKKyAgICAgICAgdmVyc2lvbiA9IDAuMQorICAgICAgICBvcGVyYXRpb25zID0gNSAqIDgKKyAgICAgICAgcm91bmRzID0gMTAwMDAwCisKKyAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgICAgIGRhdGEgPSAodSdhJywgdScxJywgdScgJywgdSdcdTEyMzQnLCB1J1x1RkZGRicpCisgICAgICAgICAgICBsZW5fZGF0YSA9IGxlbihkYXRhKQorICAgICAgICAgICAgZGlnaXQgPSB1bmljb2RlZGF0YS5kaWdpdAorICAgICAgICAgICAgbnVtZXJpYyA9IHVuaWNvZGVkYXRhLm51bWVyaWMKKyAgICAgICAgICAgIGRlY2ltYWwgPSB1bmljb2RlZGF0YS5kZWNpbWFsCisgICAgICAgICAgICBjYXRlZ29yeSA9IHVuaWNvZGVkYXRhLmNhdGVnb3J5CisgICAgICAgICAgICBiaWRpcmVjdGlvbmFsID0gdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbAorICAgICAgICAgICAgZGVjb21wb3NpdGlvbiA9IHVuaWNvZGVkYXRhLmRlY29tcG9zaXRpb24KKyAgICAgICAgICAgIG1pcnJvcmVkID0gdW5pY29kZWRhdGEubWlycm9yZWQKKyAgICAgICAgICAgIGNvbWJpbmluZyA9IHVuaWNvZGVkYXRhLmNvbWJpbmluZworCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAgICAgYyA9IGRhdGFbaSAlIGxlbl9kYXRhXQorCisgICAgICAgICAgICAgICAgZGlnaXQoYywgTm9uZSkKKyAgICAgICAgICAgICAgICBudW1lcmljKGMsIE5vbmUpCisgICAgICAgICAgICAgICAgZGVjaW1hbChjLCBOb25lKQorICAgICAgICAgICAgICAgIGNhdGVnb3J5KGMpCisgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbChjKQorICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24oYykKKyAgICAgICAgICAgICAgICBtaXJyb3JlZChjKQorICAgICAgICAgICAgICAgIGNvbWJpbmluZyhjKQorCisgICAgICAgICAgICAgICAgZGlnaXQoYywgTm9uZSkKKyAgICAgICAgICAgICAgICBudW1lcmljKGMsIE5vbmUpCisgICAgICAgICAgICAgICAgZGVjaW1hbChjLCBOb25lKQorICAgICAgICAgICAgICAgIGNhdGVnb3J5KGMpCisgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbChjKQorICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24oYykKKyAgICAgICAgICAgICAgICBtaXJyb3JlZChjKQorICAgICAgICAgICAgICAgIGNvbWJpbmluZyhjKQorCisgICAgICAgICAgICAgICAgZGlnaXQoYywgTm9uZSkKKyAgICAgICAgICAgICAgICBudW1lcmljKGMsIE5vbmUpCisgICAgICAgICAgICAgICAgZGVjaW1hbChjLCBOb25lKQorICAgICAgICAgICAgICAgIGNhdGVnb3J5KGMpCisgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbChjKQorICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24oYykKKyAgICAgICAgICAgICAgICBtaXJyb3JlZChjKQorICAgICAgICAgICAgICAgIGNvbWJpbmluZyhjKQorCisgICAgICAgICAgICAgICAgZGlnaXQoYywgTm9uZSkKKyAgICAgICAgICAgICAgICBudW1lcmljKGMsIE5vbmUpCisgICAgICAgICAgICAgICAgZGVjaW1hbChjLCBOb25lKQorICAgICAgICAgICAgICAgIGNhdGVnb3J5KGMpCisgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbChjKQorICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24oYykKKyAgICAgICAgICAgICAgICBtaXJyb3JlZChjKQorICAgICAgICAgICAgICAgIGNvbWJpbmluZyhjKQorCisgICAgICAgICAgICAgICAgZGlnaXQoYywgTm9uZSkKKyAgICAgICAgICAgICAgICBudW1lcmljKGMsIE5vbmUpCisgICAgICAgICAgICAgICAgZGVjaW1hbChjLCBOb25lKQorICAgICAgICAgICAgICAgIGNhdGVnb3J5KGMpCisgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbChjKQorICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24oYykKKyAgICAgICAgICAgICAgICBtaXJyb3JlZChjKQorICAgICAgICAgICAgICAgIGNvbWJpbmluZyhjKQorCisgICAgICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgICAgIGRhdGEgPSAodSdhJywgdScxJywgdScgJywgdSdcdTEyMzQnLCB1J1x1RkZGRicpCisgICAgICAgICAgICBsZW5fZGF0YSA9IGxlbihkYXRhKQorICAgICAgICAgICAgZGlnaXQgPSB1bmljb2RlZGF0YS5kaWdpdAorICAgICAgICAgICAgbnVtZXJpYyA9IHVuaWNvZGVkYXRhLm51bWVyaWMKKyAgICAgICAgICAgIGRlY2ltYWwgPSB1bmljb2RlZGF0YS5kZWNpbWFsCisgICAgICAgICAgICBjYXRlZ29yeSA9IHVuaWNvZGVkYXRhLmNhdGVnb3J5CisgICAgICAgICAgICBiaWRpcmVjdGlvbmFsID0gdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbAorICAgICAgICAgICAgZGVjb21wb3NpdGlvbiA9IHVuaWNvZGVkYXRhLmRlY29tcG9zaXRpb24KKyAgICAgICAgICAgIG1pcnJvcmVkID0gdW5pY29kZWRhdGEubWlycm9yZWQKKyAgICAgICAgICAgIGNvbWJpbmluZyA9IHVuaWNvZGVkYXRhLmNvbWJpbmluZworCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAgICAgYyA9IGRhdGFbaSAlIGxlbl9kYXRhXQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9wYWNrYWdlL19faW5pdF9fLnB5IGIvVG9vbHMvcHliZW5jaC9wYWNrYWdlL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL3BhY2thZ2UvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvcGFja2FnZS9zdWJtb2R1bGUucHkgYi9Ub29scy9weWJlbmNoL3BhY2thZ2Uvc3VibW9kdWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL3BhY2thZ2Uvc3VibW9kdWxlLnB5CmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL3B5YmVuY2gucHkgYi9Ub29scy9weWJlbmNoL3B5YmVuY2gucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmYxMGJkMQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weQpAQCAtMCwwICsxLDQ2MSBAQAorIyEvdXNyL2xvY2FsL2Jpbi9weXRob24gLU8KKworIiIiIEEgUHl0aG9uIEJlbmNobWFyayBTdWl0ZQorCisiIiIKKyMKKyMgTm90ZTogUGxlYXNlIGtlZXAgdGhpcyBtb2R1bGUgY29tcGF0aWJsZSB0byBQeXRob24gMS41LjIuCisjCisjIFRlc3RzIG1heSBpbmNsdWRlIGZlYXR1cmVzIGluIGxhdGVyIFB5dGhvbiB2ZXJzaW9ucywgYnV0IHRoZXNlCisjIHNob3VsZCB0aGVuIGJlIGVtYmVkZGVkIGluIHRyeS1leGNlcHQgY2xhdXNlcyBpbiB0aGUgY29uZmlndXJhdGlvbgorIyBtb2R1bGUgU2V0dXAucHkuCisjCisKKyMgcHliZW5jaCBDb3B5cmlnaHQKK19fY29weXJpZ2h0X18gPSAiIiJcCitDb3B5cmlnaHQgKGMpLCAxOTk3LTIwMDYsIE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKQorQ29weXJpZ2h0IChjKSwgMjAwMC0yMDA2LCBlR2VuaXguY29tIFNvZnR3YXJlIEdtYkggKGluZm9AZWdlbml4LmNvbSkKKworICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5CitncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCithbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKK2luIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcKK21vZGlmaWNhdGlvbnMsIHRoYXQgeW91IG1ha2UuCisKK1RIRSBBVVRIT1IgTUFSQy1BTkRSRSBMRU1CVVJHIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTworVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLAorSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HCitGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFICEKKyIiIgorCisjIFZlcnNpb24gbnVtYmVyCitfX3ZlcnNpb25fXyA9ICcxLjMnCisKKyMKKyMgTk9URTogVXNlIHhyYW5nZSBmb3IgYWxsIHRlc3QgbG9vcHMgdW5sZXNzIHlvdSB3YW50IHRvIGZhY2UgCisjICAgICAgIGEgMjBNQiBwcm9jZXNzICEKKyMKKyMgQWxsIHRlc3RzIHNob3VsZCBoYXZlIHJvdW5kcyBzZXQgdG8gdmFsdWVzIHNvIHRoYXQgYSBydW4oKQorIyB0YWtlcyBiZXR3ZWVuIDIwLTUwIHNlY29uZHMuIFRoaXMgaXMgdG8gZ2V0IGZhaXJseSBnb29kCisjIGNsb2NrKCkgdmFsdWVzLiBZb3UgY2FuIHVzZSBvcHRpb24gLXcgdG8gc3BlZWR1cCB0aGUgdGVzdHMKKyMgYnkgYSBmaXhlZCBpbnRlZ2VyIGZhY3RvciAodGhlICJ3YXJwIGZhY3RvciIpLgorIworCitpbXBvcnQgc3lzLHRpbWUsb3BlcmF0b3IKK2Zyb20gQ29tbWFuZExpbmUgaW1wb3J0ICoKKwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlCisgICAgcGlja2xlID0gY1BpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKKworIyMjIFRlc3QgYmFzZWNsYXNzCisKK2NsYXNzIFRlc3Q6CisKKyAgICAiIiIgQWxsIHRlc3QgbXVzdCBoYXZlIHRoaXMgY2xhc3MgYXMgYmFzZWNsYXNzLiBJdCBwcm92aWRlcworICAgICAgICB0aGUgbmVjZXNzYXJ5IGludGVyZmFjZSB0byB0aGUgYmVuY2htYXJrIG1hY2hpbmVyeS4KKworICAgICAgICBUaGUgdGVzdHMgbXVzdCBzZXQgLnJvdW5kcyB0byBhIHZhbHVlIGhpZ2ggZW5vdWdoIHRvIGxldCB0aGUKKyAgICAgICAgdGVzdCBydW4gYmV0d2VlbiAyMC01MCBzZWNvbmRzLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlCisgICAgICAgIGNsb2NrKCktdGltaW5nIG9ubHkgZ2l2ZXMgcmF0aGVyIGluYWNjdXJhdGUgdmFsdWVzIChvbiBMaW51eCwKKyAgICAgICAgZm9yIGV4YW1wbGUsIGl0IGlzIGFjY3VyYXRlIHRvIGEgZmV3IGh1bmRyZXRocyBvZiBhCisgICAgICAgIHNlY29uZCkuIElmIHlvdSBkb24ndCB3YW50IHRvIHdhaXQgdGhhdCBsb25nLCB1c2UgYSB3YXJwCisgICAgICAgIGZhY3RvciBsYXJnZXIgdGhhbiAxLgorCisgICAgICAgIEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIHNldCB0aGUgLm9wZXJhdGlvbnMgdmFyaWFibGUgdG8gYQorICAgICAgICB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiAidmlydHVhbCBvcGVyYXRpb25zIiBkb25lIHBlcgorICAgICAgICBjYWxsIG9mIC5ydW4oKS4KKworICAgICAgICBJZiB5b3UgY2hhbmdlIGEgdGVzdCBpbiBzb21lIHdheSwgZG9uJ3QgZm9yZ2V0IHRvIGluY3JlYXNlCisgICAgICAgIGl0J3MgdmVyc2lvbiBudW1iZXIuCisKKyAgICAiIiIKKworICAgICMjIyBJbnN0YW5jZSB2YXJpYWJsZXMgdGhhdCBlYWNoIHRlc3Qgc2hvdWxkIG92ZXJyaWRlCisKKyAgICAjIFZlcnNpb24gbnVtYmVyIG9mIHRoZSB0ZXN0IGFzIGZsb2F0ICh4Lnl5KTsgdGhpcyBpcyBpbXBvcnRhbnQKKyAgICAjIGZvciBjb21wYXJpc29ucyBvZiBiZW5jaG1hcmsgcnVucyAtIHRlc3RzIHdpdGggdW5lcXVhbCB2ZXJzaW9uCisgICAgIyBudW1iZXIgd2lsbCBub3QgZ2V0IGNvbXBhcmVkLgorICAgIHZlcnNpb24gPSAxLjAKKyAgICAKKyAgICAjIFRoZSBudW1iZXIgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBkb25lIGluIGVhY2ggcm91bmQgb2YgdGhlCisgICAgIyB0ZXN0LiBBbiBvcGVyYXRpb24gaXMgdGhlIGJhc2ljIHVuaXQgb2Ygd2hhdCB5b3Ugd2FudCB0bworICAgICMgbWVhc3VyZS4gVGhlIGJlbmNobWFyayB3aWxsIG91dHB1dCB0aGUgYW1vdW50IG9mIHJ1bi10aW1lIHBlcgorICAgICMgb3BlcmF0aW9uLiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gcmFpc2UgdGhlIG1lYXN1cmVkIHRpbWluZ3MKKyAgICAjIHNpZ25pZmljYW50bHkgYWJvdmUgbm9pc2UgbGV2ZWwsIGl0IGlzIG9mdGVuIHJlcXVpcmVkIHRvIHJlcGVhdAorICAgICMgc2V0cyBvZiBvcGVyYXRpb25zIG1vcmUgdGhhbiBvbmNlIHBlciB0ZXN0IHJvdW5kLiBUaGUgbWVhc3VyZWQKKyAgICAjIG92ZXJoZWFkIHBlciB0ZXN0IHJvdW5kIHNob3VsZCBiZSBsZXNzIHRoYW4gMSBzZWNvbmQuCisgICAgb3BlcmF0aW9ucyA9IDEKKworICAgICMgTnVtYmVyIG9mIHJvdW5kcyB0byBleGVjdXRlIHBlciB0ZXN0IHJ1bi4gVGhpcyBzaG91bGQgYmUKKyAgICAjIGFkanVzdGVkIHRvIGEgZmlndXJlIHRoYXQgcmVzdWx0cyBpbiBhIHRlc3QgcnVuLXRpbWUgb2YgYmV0d2VlbgorICAgICMgMjAtNTAgc2Vjb25kcy4KKyAgICByb3VuZHMgPSAxMDAwMDAKKworICAgICMjIyBJbnRlcm5hbCB2YXJpYWJsZXMKKworICAgICMgTWFyayB0aGlzIGNsYXNzIGFzIGltcGxlbWVudGluZyBhIHRlc3QKKyAgICBpc19hX3Rlc3QgPSAxCisKKyAgICAjIE1pc2MuIGludGVybmFsIHZhcmlhYmxlcworICAgIGxhc3RfdGltaW5nID0gKDAsMCwwKSAjIGxhc3QgdGltaW5nIChyZWFsLHJ1bixjYWxpYnJhdGlvbikKKyAgICB3YXJwID0gMSAgICAgICAgICAgICMgd2FycCBmYWN0b3IgdGhpcyB0ZXN0IHVzZXMKKyAgICBjcnVucyA9IDIwICAgICAgICAgICMgbnVtYmVyIG9mIGNhbGlicmF0aW9uIHJ1bnMKKyAgICBvdmVyaGVhZCA9IE5vbmUgICAgICMgbGlzdCBvZiBjYWxpYnJhdGlvbiB0aW1pbmdzCisKKyAgICBkZWYgX19pbml0X18oc2VsZix3YXJwPTEpOgorCisgICAgICAgIGlmIHdhcnAgPiAxOgorICAgICAgICAgICAgc2VsZi5yb3VuZHMgPSBzZWxmLnJvdW5kcyAvIHdhcnAKKyAgICAgICAgICAgIHNlbGYud2FycCA9IHdhcnAKKyAgICAgICAgc2VsZi50aW1lcyA9IFtdCisgICAgICAgIHNlbGYub3ZlcmhlYWQgPSBbXQorICAgICAgICAjIFdlIHdhbnQgdGhlc2UgdG8gYmUgaW4gdGhlIGluc3RhbmNlIGRpY3QsIHNvIHRoYXQgcGlja2xlCisgICAgICAgICMgc2F2ZXMgdGhlbQorICAgICAgICBzZWxmLnZlcnNpb24gPSBzZWxmLnZlcnNpb24KKyAgICAgICAgc2VsZi5vcGVyYXRpb25zID0gc2VsZi5vcGVyYXRpb25zCisgICAgICAgIHNlbGYucm91bmRzID0gc2VsZi5yb3VuZHMKKworICAgIGRlZiBydW4oc2VsZik6CisKKyAgICAgICAgIiIiIFJ1biB0aGUgdGVzdCBpbiB0d28gcGhhc2VzOiBmaXJzdCBjYWxpYnJhdGUsIHRoZW4KKyAgICAgICAgICAgIGRvIHRoZSBhY3R1YWwgdGVzdC4gQmUgY2FyZWZ1bCB0byBrZWVwIHRoZSBjYWxpYnJhdGlvbgorICAgICAgICAgICAgdGltaW5nIGxvdyB3L3IgdG8gdGhlIHRlc3QgdGltaW5nLgorICAgICAgICAgICAgCisgICAgICAgICIiIgorICAgICAgICB0ZXN0ID0gc2VsZi50ZXN0CisgICAgICAgIGNhbGlicmF0ZSA9IHNlbGYuY2FsaWJyYXRlCisgICAgICAgIGNsb2NrID0gdGltZS5jbG9jaworICAgICAgICBjcnVucyA9IHNlbGYuY3J1bnMKKyAgICAgICAgIyBmaXJzdCBjYWxpYnJhdGUKKyAgICAgICAgb2Zmc2V0ID0gMC4wCisgICAgICAgIGZvciBpIGluIHJhbmdlKGNydW5zKToKKyAgICAgICAgICAgIHQgPSBjbG9jaygpCisgICAgICAgICAgICBjYWxpYnJhdGUoKQorICAgICAgICAgICAgdCA9IGNsb2NrKCkgLSB0CisgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyB0CisgICAgICAgIG9mZnNldCA9IG9mZnNldCAvIGNydW5zCisgICAgICAgICMgbm93IHRoZSByZWFsIHRoaW5nCisgICAgICAgIHQgPSBjbG9jaygpIAorICAgICAgICB0ZXN0KCkKKyAgICAgICAgdCA9IGNsb2NrKCkgLSB0CisgICAgICAgIHNlbGYubGFzdF90aW1pbmcgPSAodC1vZmZzZXQsdCxvZmZzZXQpCisgICAgICAgIHNlbGYudGltZXMuYXBwZW5kKHQtb2Zmc2V0KQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworCSIiIiBDYWxpYnJhdGUgdGhlIHRlc3QuCisKKwkgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGV4ZWN1dGUgZXZlcnl0aGluZyB0aGF0IGlzIG5lZWRlZCB0bworCSAgICBzZXR1cCBhbmQgcnVuIHRoZSB0ZXN0IC0gZXhjZXB0IGZvciB0aGUgYWN0dWFsIG9wZXJhdGlvbnMKKwkgICAgdGhhdCB5b3UgaW50ZW5kIHRvIG1lYXN1cmUuIHB5YmVuY2ggdXNlcyB0aGlzIG1ldGhvZCB0bworCSAgICBtZWFzdXJlIHRoZSB0ZXN0IGltcGxlbWVudGF0aW9uIG92ZXJoZWFkLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4KKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisJIiIiIFJ1biB0aGUgdGVzdC4KKworCSAgICBUaGUgdGVzdCBuZWVkcyB0byBydW4gc2VsZi5yb3VuZHMgZXhlY3V0aW5nCisJICAgIHNlbGYub3BlcmF0aW9ucyBudW1iZXIgb2Ygb3BlcmF0aW9ucyBlYWNoLgorCisgICAgICAgICIiIgorICAgICAgICAjIGRvIHNvbWUgdGVzdHMKKyAgICAgICAgcmV0dXJuCisgICAgCisgICAgZGVmIHN0YXQoc2VsZik6CisKKyAgICAgICAgIiIiIFJldHVybnMgdHdvIHZhbHVlOiBhdmVyYWdlIHRpbWUgcGVyIHJ1biBhbmQgYXZlcmFnZSBwZXIKKyAgICAgICAgICAgIG9wZXJhdGlvbi4KKyAgICAgICAgICAgIAorICAgICAgICAiIiIKKyAgICAgICAgcnVucyA9IGxlbihzZWxmLnRpbWVzKQorICAgICAgICBpZiBydW5zID09IDA6CisgICAgICAgICAgICByZXR1cm4gMCwwCisgICAgICAgIHRvdGFsdGltZSA9IHJlZHVjZShvcGVyYXRvci5hZGQsc2VsZi50aW1lcywwLjApCisgICAgICAgIGF2ZyA9IHRvdGFsdGltZSAvIGZsb2F0KHJ1bnMpCisgICAgICAgIG9wX2F2ZyA9IHRvdGFsdGltZSAvIGZsb2F0KHJ1bnMgKiBzZWxmLnJvdW5kcyAqIHNlbGYub3BlcmF0aW9ucykKKyAgICAgICAgaWYgc2VsZi5vdmVyaGVhZDoKKyAgICAgICAgICAgIHRvdGFsb3ZlcmhlYWQgPSByZWR1Y2Uob3BlcmF0b3IuYWRkLHNlbGYub3ZlcmhlYWQsMC4wKQorICAgICAgICAgICAgb3ZfYXZnID0gdG90YWxvdmVyaGVhZCAvIGZsb2F0KHJ1bnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHVzZSBzZWxmLmxhc3RfdGltaW5nIC0gbm90IHRvbyBhY2N1cmF0ZQorICAgICAgICAgICAgb3ZfYXZnID0gc2VsZi5sYXN0X3RpbWluZ1syXQorICAgICAgICByZXR1cm4gYXZnLG9wX2F2Zyxvdl9hdmcKKworIyMjIExvYWQgU2V0dXAKKworIyBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBUZXN0IGNsYXNzLCBzaW5jZQorIyB0aGUgU2V0dXAgbW9kdWxlIHdpbGwgaW1wb3J0IHN1YmNsYXNzZXMgdXNpbmcgdGhpcyBjbGFzcy4KKworaW1wb3J0IFNldHVwCisKKyMjIyBCZW5jaG1hcmsgYmFzZSBjbGFzcworCitjbGFzcyBCZW5jaG1hcms6CisKKyAgICBuYW1lID0gJz8nICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBiZW5jaG1hcmsKKyAgICByb3VuZHMgPSAxICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2Ygcm91bmRzIHRvIHJ1bgorICAgIHdhcnAgPSAxICAgICAgICAgICAgICAgICAgICAjIFdhcnAgZmFjdG9yCisgICAgcm91bmR0aW1lID0gMCAgICAgICAgICAgICAgICMgQXZlcmFnZSByb3VuZCB0aW1lCisgICAgdmVyc2lvbiA9IE5vbmUgICAgICAgICAgICAgICMgQmVuY2htYXJrIHZlcnNpb24gbnVtYmVyIChzZWUgX19pbml0X18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgZmxvYXQgeC55eQorICAgIHN0YXJ0dGltZSA9IE5vbmUJCSMgQmVuY2htYXJrIHN0YXJ0IHRpbWUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKworICAgICAgICBzZWxmLnRlc3RzID0ge30KKyAgICAgICAgc2VsZi52ZXJzaW9uID0gMC4zMQorCisgICAgZGVmIGxvYWRfdGVzdHMoc2VsZixzZXR1cG1vZCx3YXJwPTEpOgorCisgICAgICAgIHNlbGYud2FycCA9IHdhcnAKKyAgICAgICAgdGVzdHMgPSBzZWxmLnRlc3RzCisgICAgICAgIHByaW50ICdTZWFyY2hpbmcgZm9yIHRlc3RzLi4uJworICAgICAgICBzZXR1cG1vZC5fX2RpY3RfXy52YWx1ZXMoKQorICAgICAgICBmb3IgYyBpbiBzZXR1cG1vZC5fX2RpY3RfXy52YWx1ZXMoKToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoYywnaXNfYV90ZXN0JykgYW5kIGMuX19uYW1lX18gIT0gJ1Rlc3QnOgorICAgICAgICAgICAgICAgIHRlc3RzW2MuX19uYW1lX19dID0gYyh3YXJwKQorICAgICAgICBsID0gdGVzdHMua2V5cygpCisgICAgICAgIGwuc29ydCgpCisgICAgICAgIGZvciB0IGluIGw6CisgICAgICAgICAgICBwcmludCAnICAnLHQKKyAgICAgICAgcHJpbnQKKworICAgIGRlZiBydW4oc2VsZik6CisKKyAgICAgICAgdGVzdHMgPSBzZWxmLnRlc3RzLml0ZW1zKCkKKyAgICAgICAgdGVzdHMuc29ydCgpCisgICAgICAgIGNsb2NrID0gdGltZS5jbG9jaworICAgICAgICBwcmludCAnUnVubmluZyAlaSByb3VuZChzKSBvZiB0aGUgc3VpdGU6ICcgJSBzZWxmLnJvdW5kcworICAgICAgICBwcmludAorICAgICAgICBzZWxmLnN0YXJ0dGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHJvdW5kdGltZSA9IGNsb2NrKCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcHJpbnQgJyBSb3VuZCAlLTI1aSAgcmVhbCAgIGFicyAgICBvdmVyaGVhZCcgJSAoaSsxKQorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKHRlc3RzKSk6CisgICAgICAgICAgICAgICAgbmFtZSx0ID0gdGVzdHNbal0KKyAgICAgICAgICAgICAgICBwcmludCAnJTMwczonICUgbmFtZSwKKyAgICAgICAgICAgICAgICB0LnJ1bigpCisgICAgICAgICAgICAgICAgcHJpbnQgJyAgJS4zZnIgJS4zZmEgJS4zZm8nICUgdC5sYXN0X3RpbWluZworICAgICAgICAgICAgcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgICAgICAgICAgICBwcmludCAnICAgICAgICAgICAgQXZlcmFnZSByb3VuZCB0aW1lOiAgICAgICUuM2Ygc2Vjb25kcycgJSBcCisgICAgICAgICAgICAgICAgICAoKGNsb2NrKCkgLSByb3VuZHRpbWUpLyhpKzEpKQorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgc2VsZi5yb3VuZHRpbWUgPSAoY2xvY2soKSAtIHJvdW5kdGltZSkgLyBzZWxmLnJvdW5kcworICAgICAgICBwcmludAorICAgIAorICAgIGRlZiBwcmludF9zdGF0KHNlbGYsIGNvbXBhcmVfdG89Tm9uZSwgaGlkZW5vaXNlPTApOgorCisgICAgICAgIGlmIG5vdCBjb21wYXJlX3RvOgorICAgICAgICAgICAgcHJpbnQgJyUtMzBzICAgICAgcGVyIHJ1biAgICBwZXIgb3Blci4gICBvdmVyaGVhZCcgJSAnVGVzdHM6JworICAgICAgICAgICAgcHJpbnQgJy0nKjcyCisgICAgICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdHMuaXRlbXMoKQorICAgICAgICAgICAgdGVzdHMuc29ydCgpCisgICAgICAgICAgICBmb3IgbmFtZSx0IGluIHRlc3RzOgorICAgICAgICAgICAgICAgIGF2ZyxvcF9hdmcsb3ZfYXZnID0gdC5zdGF0KCkKKyAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTEwLjJmIG1zICU3LjJmIHVzICU3LjJmIG1zJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAobmFtZSxhdmcqMTAwMC4wLG9wX2F2ZyoxMDAwMDAwLjAsb3ZfYXZnKjEwMDAuMCkKKyAgICAgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICUxMC4yZiBtcycgJSBcCisgICAgICAgICAgICAgICAgICAoJ0F2ZXJhZ2Ugcm91bmQgdGltZScsc2VsZi5yb3VuZHRpbWUgKiAxMDAwLjApCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICclLTMwcyAgICAgIHBlciBydW4gICAgcGVyIG9wZXIuICAgIGRpZmYgKiknICUgXAorICAgICAgICAgICAgICAgICAgJ1Rlc3RzOicKKyAgICAgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICAgICAgdGVzdHMgPSBzZWxmLnRlc3RzLml0ZW1zKCkKKyAgICAgICAgICAgIHRlc3RzLnNvcnQoKQorICAgICAgICAgICAgY29tcGF0aWJsZSA9IDEKKyAgICAgICAgICAgIGZvciBuYW1lLHQgaW4gdGVzdHM6CisgICAgICAgICAgICAgICAgYXZnLG9wX2F2Zyxvdl9hdmcgPSB0LnN0YXQoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBjb21wYXJlX3RvLnRlc3RzW25hbWVdCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICBvdGhlciA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBvdGhlciBhbmQgb3RoZXIudmVyc2lvbiA9PSB0LnZlcnNpb24gYW5kIFwKKyAgICAgICAgICAgICAgICAgICBvdGhlci5vcGVyYXRpb25zID09IHQub3BlcmF0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgYXZnMSxvcF9hdmcxLG92X2F2ZzEgPSBvdGhlci5zdGF0KCkKKyAgICAgICAgICAgICAgICAgICAgcW9wX2F2ZyA9IChvcF9hdmcvb3BfYXZnMS0xLjApKjEwMC4wCisgICAgICAgICAgICAgICAgICAgIGlmIGhpZGVub2lzZSBhbmQgYWJzKHFvcF9hdmcpIDwgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBxb3BfYXZnID0gJycKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHFvcF9hdmcgPSAnJSs3LjJmJSUnICUgcW9wX2F2ZworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHFhdmcscW9wX2F2ZyA9ICduL2EnLCAnbi9hJworICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gMAorICAgICAgICAgICAgICAgIHByaW50ICclMzBzOiAlMTAuMmYgbXMgJTcuMmYgdXMgICU4cycgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsYXZnKjEwMDAuMCxvcF9hdmcqMTAwMDAwMC4wLHFvcF9hdmcpCisgICAgICAgICAgICBwcmludCAnLScqNzIKKyAgICAgICAgICAgIGlmIGNvbXBhdGlibGUgYW5kIGNvbXBhcmVfdG8ucm91bmR0aW1lID4gMCBhbmQgXAorICAgICAgICAgICAgICAgY29tcGFyZV90by52ZXJzaW9uID09IHNlbGYudmVyc2lvbjoKKyAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTEwLjJmIG1zICAgICAgICAgICAgICUrNy4yZiUlJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoJ0F2ZXJhZ2Ugcm91bmQgdGltZScsc2VsZi5yb3VuZHRpbWUgKiAxMDAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgICgoc2VsZi5yb3VuZHRpbWUqc2VsZi53YXJwKS8KKyAgICAgICAgICAgICAgICAgICAgICAgIChjb21wYXJlX3RvLnJvdW5kdGltZSpjb21wYXJlX3RvLndhcnApLTEuMCkqMTAwLjApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICclMzBzOiAlMTAuMmYgbXMgICAgICAgICAgICAgICAgICBuL2EnICUgXAorICAgICAgICAgICAgICAgICAgICAgICgnQXZlcmFnZSByb3VuZCB0aW1lJyxzZWxmLnJvdW5kdGltZSAqIDEwMDAuMCkKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAnKikgbWVhc3VyZWQgYWdhaW5zdDogJXMgKHJvdW5kcz0laSwgd2FycD0laSknICUgXAorICAgICAgICAgICAgICAgICAgKGNvbXBhcmVfdG8ubmFtZSxjb21wYXJlX3RvLnJvdW5kcyxjb21wYXJlX3RvLndhcnApCisgICAgICAgIHByaW50CisKK2RlZiBwcmludF9tYWNoaW5lKCk6CisKKyAgICBpbXBvcnQgcGxhdGZvcm0KKyAgICBwcmludCAnTWFjaGluZSBEZXRhaWxzOicKKyAgICBwcmludCAnICAgUGxhdGZvcm0gSUQ6ICAlcycgJSBwbGF0Zm9ybS5wbGF0Zm9ybSgpCisgICAgcHJpbnQgJyAgIEV4ZWN1dGFibGU6ICAgJXMnICUgc3lzLmV4ZWN1dGFibGUKKyAgICAjIFRoZXJlJ3MgYSBidWcgaW4gUHl0aG9uIDIuMmIxKy4uLgorICAgIGlmIHN5cy52ZXJzaW9uWzo2XSA9PSAnMi4yYjErJzoKKyAgICAgICAgcmV0dXJuCisgICAgcHJpbnQgJyAgIFB5dGhvbjogICAgICAgJXMnICUgcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQorICAgIHByaW50ICcgICBDb21waWxlcjogICAgICVzJyAlIHBsYXRmb3JtLnB5dGhvbl9jb21waWxlcigpCisgICAgYnVpbGRubywgYnVpbGRkYXRlID0gcGxhdGZvcm0ucHl0aG9uX2J1aWxkKCkKKyAgICBwcmludCAnICAgQnVpbGQ6ICAgICAgICAlcyAoIyVzKScgJSAoYnVpbGRkYXRlLCBidWlsZG5vKQorCitjbGFzcyBQeUJlbmNoQ21kbGluZShBcHBsaWNhdGlvbik6CisKKyAgICBoZWFkZXIgPSAoIlBZQkVOQ0ggLSBhIGJlbmNobWFyayB0ZXN0IHN1aXRlIGZvciBQeXRob24gIgorICAgICAgICAgICAgICAiaW50ZXJwcmV0ZXJzL2NvbXBpbGVycy4iKQorCisgICAgdmVyc2lvbiA9IF9fdmVyc2lvbl9fCisKKyAgICBvcHRpb25zID0gW0FyZ3VtZW50T3B0aW9uKCctbicsJ251bWJlciBvZiByb3VuZHMnLFNldHVwLk51bWJlcl9vZl9yb3VuZHMpLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1mJywnc2F2ZSBiZW5jaG1hcmsgdG8gZmlsZSBhcmcnLCcnKSwKKyAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctYycsJ2NvbXBhcmUgYmVuY2htYXJrIHdpdGggdGhlIG9uZSBpbiBmaWxlIGFyZycsJycpLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1zJywnc2hvdyBiZW5jaG1hcmsgaW4gZmlsZSBhcmcsIHRoZW4gZXhpdCcsJycpLAorICAgICAgICAgICAgICAgU3dpdGNoT3B0aW9uKCctUycsJ3Nob3cgc3RhdGlzdGljcyBvZiBiZW5jaG1hcmtzJywwKSwKKyAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctdycsJ3NldCB3YXJwIGZhY3RvciB0byBhcmcnLFNldHVwLldhcnBfZmFjdG9yKSwKKyAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLWQnLCdoaWRlIG5vaXNlIGluIGNvbXBhcmVzJywgMCksCisgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy0tbm8tZ2MnLCdkaXNhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbicsIDApLAorICAgICAgICAgICAgICAgXQorCisgICAgYWJvdXQgPSAiIiJcCitUaGUgbm9ybWFsIG9wZXJhdGlvbiBpcyB0byBydW4gdGhlIHN1aXRlIGFuZCBkaXNwbGF5IHRoZQorcmVzdWx0cy4gVXNlIC1mIHRvIHNhdmUgdGhlbSBmb3IgbGF0ZXIgcmV1c2Ugb3IgY29tcGFyaXNtcy4KKworRXhhbXBsZXM6CisKK3B5dGhvbjEuNSBweWJlbmNoLnB5IC13IDEwMCAtZiBwMTUKK3B5dGhvbjEuNCBweWJlbmNoLnB5IC13IDEwMCAtZiBwMTQKK3B5dGhvbiBweWJlbmNoLnB5IC1zIHAxNSAtYyBwMTQKKyIiIgorICAgIGNvcHlyaWdodCA9IF9fY29weXJpZ2h0X18KKworICAgIGRlZiBoYW5kbGVfUyhzZWxmLCB2YWx1ZSk6CisKKyAgICAgICAgIiIiIERpc3BsYXkgb25lIGxpbmUgc3RhdHMgZm9yIGVhY2ggYmVuY2htYXJrIGZpbGUgZ2l2ZW4gb24gdGhlCisgICAgICAgICAgICBjb21tYW5kIGxpbmUuCisKKyAgICAgICAgIiIiCisgICAgICAgIGZvciBiZW5jaG1hcmsgaW4gc2VsZi5maWxlczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gb3BlbihiZW5jaG1hcmssICdyYicpCisgICAgICAgICAgICAgICAgYmVuY2ggPSBwaWNrbGUubG9hZChmKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgJyogRXJyb3Igb3BlbmluZy9yZWFkaW5nIGZpbGUgJXMnICUgcmVwcihiZW5jaG1hcmspCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICclcywlLS4yZixtcycgJSAoYmVuY2htYXJrLCBiZW5jaC5yb3VuZHRpbWUqMTAwMC4wKQorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIG1haW4oc2VsZik6CisKKyAgICAgICAgcm91bmRzID0gc2VsZi52YWx1ZXNbJy1uJ10KKyAgICAgICAgcmVwb3J0ZmlsZSA9IHNlbGYudmFsdWVzWyctZiddCisgICAgICAgIHNob3dfYmVuY2ggPSBzZWxmLnZhbHVlc1snLXMnXQorICAgICAgICBjb21wYXJlX3RvID0gc2VsZi52YWx1ZXNbJy1jJ10KKyAgICAgICAgaGlkZW5vaXNlID0gc2VsZi52YWx1ZXNbJy1kJ10KKyAgICAgICAgd2FycCA9IHNlbGYudmFsdWVzWyctdyddCisgICAgICAgIG5vZ2MgPSBzZWxmLnZhbHVlc1snLS1uby1nYyddCisgICAgICAgIAorICAgICAgICAjIFN3aXRjaCBvZmYgR0MKKyAgICAgICAgaWYgbm9nYzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBub2djID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnZhbHVlc1snLS1uby1nYyddOgorICAgICAgICAgICAgICAgICAgICBnYy5kaXNhYmxlKCkKKworICAgICAgICBwcmludCAnUFlCRU5DSCcsX192ZXJzaW9uX18KKyAgICAgICAgcHJpbnQKKworICAgICAgICBpZiBub3QgY29tcGFyZV90bzoKKyAgICAgICAgICAgIHByaW50X21hY2hpbmUoKQorICAgICAgICAgICAgcHJpbnQKKworICAgICAgICBpZiBjb21wYXJlX3RvOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKGNvbXBhcmVfdG8sJ3JiJykKKyAgICAgICAgICAgICAgICBiZW5jaCA9IHBpY2tsZS5sb2FkKGYpCisgICAgICAgICAgICAgICAgYmVuY2gubmFtZSA9IGNvbXBhcmVfdG8KKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBjb21wYXJlX3RvID0gYmVuY2gKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHByaW50ICcqIEVycm9yIG9wZW5pbmcvcmVhZGluZyBmaWxlJyxjb21wYXJlX3RvCisgICAgICAgICAgICAgICAgY29tcGFyZV90byA9IE5vbmUgICAgCisKKyAgICAgICAgaWYgc2hvd19iZW5jaDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gb3BlbihzaG93X2JlbmNoLCdyYicpCisgICAgICAgICAgICAgICAgYmVuY2ggPSBwaWNrbGUubG9hZChmKQorICAgICAgICAgICAgICAgIGJlbmNoLm5hbWUgPSBzaG93X2JlbmNoCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcHJpbnQgJ0JlbmNobWFyazogJXMgKHJvdW5kcz0laSwgd2FycD0laSknICUgXAorICAgICAgICAgICAgICAgICAgICAgIChiZW5jaC5uYW1lLGJlbmNoLnJvdW5kcyxiZW5jaC53YXJwKQorICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICAgICAgYmVuY2gucHJpbnRfc3RhdChjb21wYXJlX3RvLCBoaWRlbm9pc2UpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCAnKiBFcnJvciBvcGVuaW5nL3JlYWRpbmcgZmlsZScsc2hvd19iZW5jaAorICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiByZXBvcnRmaWxlOgorICAgICAgICAgICAgaWYgbm9nYzoKKyAgICAgICAgICAgICAgICBwcmludCAnQmVuY2htYXJrOiAlcyAocm91bmRzPSVpLCB3YXJwPSVpLCBubyBHQyknICUgXAorICAgICAgICAgICAgICAgICAgICAgIChyZXBvcnRmaWxlLHJvdW5kcyx3YXJwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnQmVuY2htYXJrOiAlcyAocm91bmRzPSVpLCB3YXJwPSVpKScgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKHJlcG9ydGZpbGUscm91bmRzLHdhcnApCisgICAgICAgICAgICBwcmludAorCisgICAgICAgICMgQ3JlYXRlIGJlbmNobWFyayBvYmplY3QKKyAgICAgICAgYmVuY2ggPSBCZW5jaG1hcmsoKQorICAgICAgICBiZW5jaC5yb3VuZHMgPSByb3VuZHMKKyAgICAgICAgYmVuY2gubG9hZF90ZXN0cyhTZXR1cCx3YXJwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBiZW5jaC5ydW4oKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgJyoqKiBLZXlib2FyZEludGVycnVwdCAtLSBBYm9ydGluZycKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYmVuY2gucHJpbnRfc3RhdChjb21wYXJlX3RvKQorICAgICAgICAjIHJpbmcgYmVsbAorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdcMDA3JykKKworICAgICAgICBpZiByZXBvcnRmaWxlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKHJlcG9ydGZpbGUsJ3diJykKKyAgICAgICAgICAgICAgICBiZW5jaC5uYW1lID0gcmVwb3J0ZmlsZQorICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKGJlbmNoLGYpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCAnKiBFcnJvciBvcGVuaW5nL3dyaXRpbmcgcmVwb3J0ZmlsZScKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBQeUJlbmNoQ21kbGluZSgpCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2J5ZXh0LnB5IGIvVG9vbHMvc2NyaXB0cy9ieWV4dC5weQppbmRleCA5Mzc1OWJjLi4wOTYxMGIwIDEwMDY0NAotLS0gYS9Ub29scy9zY3JpcHRzL2J5ZXh0LnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvYnlleHQucHkKQEAgLTE3LDcgKzE3LDcgQEAKICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUoYXJnKToKICAgICAgICAgICAgICAgICBzZWxmLnN0YXRmaWxlKGFyZykKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3QgZmluZCAlc1xuIiAlIGZpbGUpCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3QgZmluZCAlc1xuIiAlIGFyZykKICAgICAgICAgICAgICAgICBzZWxmLmFkZHN0YXRzKCI8Pz8/PiIsICJ1bmtub3duIiwgMSkKIAogICAgIGRlZiBzdGF0ZGlyKHNlbGYsIGRpcik6CkBAIC0yNSw4ICsyNSw4IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXIpCiAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgZXJyOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3QgbGlzdCAlczogJXNcbiIgJSAoZmlsZSwgZXJyKSkKLSAgICAgICAgICAgIHNlbGYuYWRkc3RhdHMoZXh0LCAidW5saXN0YWJsZSIsIDEpCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJDYW4ndCBsaXN0ICVzOiAlc1xuIiAlIChkaXIsIGVycikpCisgICAgICAgICAgICBzZWxmLmFkZHN0YXRzKCI8ZGlyPiIsICJ1bmxpc3RhYmxlIiwgMSkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBuYW1lcy5zb3J0KCkKICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CkBAIC00Miw5ICs0Miw5IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdGZpbGUoZnVsbCkKIAotICAgIGRlZiBzdGF0ZmlsZShzZWxmLCBmaWxlKToKLSAgICAgICAgaGVhZCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlKQotICAgICAgICBoZWFkLCBiYXNlID0gb3MucGF0aC5zcGxpdChmaWxlKQorICAgIGRlZiBzdGF0ZmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGhlYWQsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgIGhlYWQsIGJhc2UgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQogICAgICAgICBpZiBleHQgPT0gYmFzZToKICAgICAgICAgICAgIGV4dCA9ICIiICMgRS5nLiAuY3ZzaWdub3JlIGlzIGRlZW1lZCBub3QgdG8gaGF2ZSBhbiBleHRlbnNpb24KICAgICAgICAgZXh0ID0gb3MucGF0aC5ub3JtY2FzZShleHQpCkBAIC01Miw5ICs1Miw5IEBACiAgICAgICAgICAgICBleHQgPSAiPG5vbmU+IgogICAgICAgICBzZWxmLmFkZHN0YXRzKGV4dCwgImZpbGVzIiwgMSkKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgZiA9IG9wZW4oZmlsZSwgInJiIikKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAicmIiKQogICAgICAgICBleGNlcHQgSU9FcnJvciwgZXJyOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3Qgb3BlbiAlczogJXNcbiIgJSAoZmlsZSwgZXJyKSkKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkNhbid0IG9wZW4gJXM6ICVzXG4iICUgKGZpbGVuYW1lLCBlcnIpKQogICAgICAgICAgICAgc2VsZi5hZGRzdGF0cyhleHQsICJ1bm9wZW5hYmxlIiwgMSkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBkYXRhID0gZi5yZWFkKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvY2xhc3NmaXgucHkgYi9Ub29scy9zY3JpcHRzL2NsYXNzZml4LnB5CmluZGV4IGNkZjAwNmEuLmQzMDcwMGYgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvY2xhc3NmaXgucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9jbGFzc2ZpeC5weQpAQCAtMzAsNyArMzAsNyBAQAogIyBpbnRvIGEgcHJvZ3JhbSBmb3IgYSBkaWZmZXJlbnQgY2hhbmdlIHRvIFB5dGhvbiBwcm9ncmFtcy4uLgogCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IG9zCiBmcm9tIHN0YXQgaW1wb3J0ICoKIApAQCAtNTMsNyArNTMsNyBAQAogICAgICAgICAgICAgaWYgZml4KGFyZyk6IGJhZCA9IDEKICAgICBzeXMuZXhpdChiYWQpCiAKLWlzcHl0aG9ucHJvZyA9IHJlZ2V4LmNvbXBpbGUoJ15bYS16QS1aMC05X10rXC5weSQnKQoraXNweXRob25wcm9nID0gcmUuY29tcGlsZSgnXlthLXpBLVowLTlfXStcLnB5JCcpCiBkZWYgaXNweXRob24obmFtZSk6CiAgICAgcmV0dXJuIGlzcHl0aG9ucHJvZy5tYXRjaChuYW1lKSA+PSAwCiAKQEAgLTE0OCwxMiArMTQ4LDEyIEBACiAKICMgVGhpcyBleHByZXNzaW9uIGRvZXNuJ3QgY2F0Y2ggKmFsbCogY2xhc3MgZGVmaW5pdGlvbiBoZWFkZXJzLAogIyBidXQgaXQncyBwcmV0dHkgZGFybiBjbG9zZS4KLWNsYXNzZXhwciA9ICdeXChbIFx0XSpjbGFzcyArW2EtekEtWjAtOV9dK1wpICooICopICpcKFwoPS4qXCk/XCk6JwotY2xhc3Nwcm9nID0gcmVnZXguY29tcGlsZShjbGFzc2V4cHIpCitjbGFzc2V4cHIgPSAnXihbIFx0XSpjbGFzcyArW2EtekEtWjAtOV9dKykgKiggKikgKigoPS4qKT8pOicKK2NsYXNzcHJvZyA9IHJlLmNvbXBpbGUoY2xhc3NleHByKQogCiAjIEV4cHJlc3Npb25zIGZvciBmaW5kaW5nIGJhc2UgY2xhc3MgZXhwcmVzc2lvbnMuCi1iYXNlZXhwciA9ICdeICpcKC4qXCkgKiggKikgKiQnCi1iYXNlcHJvZyA9IHJlZ2V4LmNvbXBpbGUoYmFzZWV4cHIpCitiYXNlZXhwciA9ICdeICooLiopICooICopICokJworYmFzZXByb2cgPSByZS5jb21waWxlKGJhc2VleHByKQogCiBkZWYgZml4bGluZShsaW5lKToKICAgICBpZiBjbGFzc3Byb2cubWF0Y2gobGluZSkgPCAwOiAjIE5vICdjbGFzcycga2V5d29yZCAtLSBubyBjaGFuZ2UKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvZml4Y2lkLnB5IGIvVG9vbHMvc2NyaXB0cy9maXhjaWQucHkKaW5kZXggNDJhYTgzNS4uNDMzYTQyNSAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9maXhjaWQucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9maXhjaWQucHkKQEAgLTM1LDcgKzM1LDcgQEAKICMgZmlsZXMuCiAKIGltcG9ydCBzeXMKLWltcG9ydCByZWdleAoraW1wb3J0IHJlCiBpbXBvcnQgb3MKIGZyb20gc3RhdCBpbXBvcnQgKgogaW1wb3J0IGdldG9wdApAQCAtOTAsNyArOTAsNyBAQAogIyBDaGFuZ2UgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VsZWN0IGEgZGlmZmVyZW50IHNldCBvZiBmaWxlcwogV2FudGVkID0gJ15bYS16QS1aMC05X10rXC5bY2hdJCcKIGRlZiB3YW50ZWQobmFtZSk6Ci0gICAgcmV0dXJuIHJlZ2V4Lm1hdGNoKFdhbnRlZCwgbmFtZSkgPj0gMAorICAgIHJldHVybiByZS5tYXRjaChXYW50ZWQsIG5hbWUpID49IDAKIAogZGVmIHJlY3Vyc2Vkb3duKGRpcm5hbWUpOgogICAgIGRiZygncmVjdXJzZWRvd24oJXIpXG4nICUgKGRpcm5hbWUsKSkKQEAgLTIxMiwxMiArMjEyLDEyIEBACiAjIEFueXRoaW5nIGVsc2UgaXMgYW4gb3BlcmF0b3IgLS0gZG9uJ3QgbGlzdCB0aGlzIGV4cGxpY2l0bHkgYmVjYXVzZSBvZiAnLyonCiAKIE91dHNpZGVDb21tZW50ID0gKElkZW50aWZpZXIsIE51bWJlciwgU3RyaW5nLCBDaGFyLCBDb21tZW50U3RhcnQpCi1PdXRzaWRlQ29tbWVudFBhdHRlcm4gPSAnXCgnICsgJ1x8Jy5qb2luKE91dHNpZGVDb21tZW50KSArICdcKScKLU91dHNpZGVDb21tZW50UHJvZ3JhbSA9IHJlZ2V4LmNvbXBpbGUoT3V0c2lkZUNvbW1lbnRQYXR0ZXJuKQorT3V0c2lkZUNvbW1lbnRQYXR0ZXJuID0gJygnICsgJ3wnLmpvaW4oT3V0c2lkZUNvbW1lbnQpICsgJyknCitPdXRzaWRlQ29tbWVudFByb2dyYW0gPSByZS5jb21waWxlKE91dHNpZGVDb21tZW50UGF0dGVybikKIAogSW5zaWRlQ29tbWVudCA9IChJZGVudGlmaWVyLCBOdW1iZXIsIENvbW1lbnRFbmQpCi1JbnNpZGVDb21tZW50UGF0dGVybiA9ICdcKCcgKyAnXHwnLmpvaW4oSW5zaWRlQ29tbWVudCkgKyAnXCknCi1JbnNpZGVDb21tZW50UHJvZ3JhbSA9IHJlZ2V4LmNvbXBpbGUoSW5zaWRlQ29tbWVudFBhdHRlcm4pCitJbnNpZGVDb21tZW50UGF0dGVybiA9ICcoJyArICd8Jy5qb2luKEluc2lkZUNvbW1lbnQpICsgJyknCitJbnNpZGVDb21tZW50UHJvZ3JhbSA9IHJlLmNvbXBpbGUoSW5zaWRlQ29tbWVudFBhdHRlcm4pCiAKIGRlZiBpbml0Zml4bGluZSgpOgogICAgIGdsb2JhbCBQcm9ncmFtCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2lmZGVmLnB5IGIvVG9vbHMvc2NyaXB0cy9pZmRlZi5weQppbmRleCA3ZTdiNWNjLi4yZWQ3YTY2IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL2lmZGVmLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvaWZkZWYucHkKQEAgLTI3LDcgKzI3LDYgQEAKICMgcHJlcHJvY2Vzc29yIGNvbW1hbmRzLgogCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKIGltcG9ydCBnZXRvcHQKIAogZGVmcyA9IFtdCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL21ldGhmaXgucHkgYi9Ub29scy9zY3JpcHRzL21ldGhmaXgucHkKaW5kZXggYTg3MmFiNy4uYjgxODcxZiAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9tZXRoZml4LnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvbWV0aGZpeC5weQpAQCAtMjcsNyArMjcsNyBAQAogIyBpbnRvIGEgcHJvZ3JhbSBmb3IgYSBkaWZmZXJlbnQgY2hhbmdlIHRvIFB5dGhvbiBwcm9ncmFtcy4uLgogCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IG9zCiBmcm9tIHN0YXQgaW1wb3J0ICoKIApAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICAgICAgaWYgZml4KGFyZyk6IGJhZCA9IDEKICAgICBzeXMuZXhpdChiYWQpCiAKLWlzcHl0aG9ucHJvZyA9IHJlZ2V4LmNvbXBpbGUoJ15bYS16QS1aMC05X10rXC5weSQnKQoraXNweXRob25wcm9nID0gcmUuY29tcGlsZSgnXlthLXpBLVowLTlfXStcLnB5JCcpCiBkZWYgaXNweXRob24obmFtZSk6CiAgICAgcmV0dXJuIGlzcHl0aG9ucHJvZy5tYXRjaChuYW1lKSA+PSAwCiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICBpZiBsaW5lbm8gPT0gMSBhbmQgZyBpcyBOb25lIGFuZCBsaW5lWzoyXSA9PSAnIyEnOgogICAgICAgICAgICAgIyBDaGVjayBmb3Igbm9uLVB5dGhvbiBzY3JpcHRzCiAgICAgICAgICAgICB3b3JkcyA9IGxpbmVbMjpdLnNwbGl0KCkKLSAgICAgICAgICAgIGlmIHdvcmRzIGFuZCByZWdleC5zZWFyY2goJ1twUF15dGhvbicsIHdvcmRzWzBdKSA8IDA6CisgICAgICAgICAgICBpZiB3b3JkcyBhbmQgcmUuc2VhcmNoKCdbcFBdeXRob24nLCB3b3Jkc1swXSkgPCAwOgogICAgICAgICAgICAgICAgIG1zZyA9IGZpbGVuYW1lICsgJzogJyArIHdvcmRzWzBdCiAgICAgICAgICAgICAgICAgbXNnID0gbXNnICsgJyBzY3JpcHQ7IG5vdCBmaXhlZFxuJwogICAgICAgICAgICAgICAgIGVycihtc2cpCkBAIC0xNTgsOCArMTU4LDggQEAKICAgICByZXR1cm4gMAogCiAKLWZpeHBhdCA9ICdeWyBcdF0rZGVmICtbYS16QS1aMC05X10rICooICpzZWxmICosICpcKCggKlwoLipcKSAqKVwpICopICo6JwotZml4cHJvZyA9IHJlZ2V4LmNvbXBpbGUoZml4cGF0KQorZml4cGF0ID0gJ15bIFx0XStkZWYgK1thLXpBLVowLTlfXSsgKiggKnNlbGYgKiwgKigoICooLiopICopKSAqKSAqOicKK2ZpeHByb2cgPSByZS5jb21waWxlKGZpeHBhdCkKIAogZGVmIGZpeGxpbmUobGluZSk6CiAgICAgaWYgZml4cHJvZy5tYXRjaChsaW5lKSA+PSAwOgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9vYmpncmFwaC5weSBiL1Rvb2xzL3NjcmlwdHMvb2JqZ3JhcGgucHkKaW5kZXggMDEwNjBmOS4uZjc0YzJiNiAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9vYmpncmFwaC5weQorKysgYi9Ub29scy9zY3JpcHRzL29iamdyYXBoLnB5CkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCBnZXRvcHQKLWltcG9ydCByZWdleAoraW1wb3J0IHJlCiAKICMgVHlwZXMgb2Ygc3ltYm9scy4KICMKQEAgLTMyLDcgKzMyLDcgQEAKIAogIyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gcGFyc2UgIm5tIC1vIiBvdXRwdXQuCiAjCi1tYXRjaGVyID0gcmVnZXguY29tcGlsZSgnXCguKlwpOlx0Py4uLi4uLi4uIFwoLlwpIFwoLipcKSQnKQorbWF0Y2hlciA9IHJlLmNvbXBpbGUoJyguKik6XHQ/Li4uLi4uLi4gKC4pICguKikkJykKIAogIyBTdG9yZSAiaXRlbSIgaW4gImRpY3QiIHVuZGVyICJrZXkiLgogIyBUaGUgZGljdGlvbmFyeSBtYXBzIGtleXMgdG8gbGlzdHMgb2YgaXRlbXMuCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL3BhdGhmaXgucHkgYi9Ub29scy9zY3JpcHRzL3BhdGhmaXgucHkKaW5kZXggNWNiNWFkZC4uN2Y2ZjE5MSAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9wYXRoZml4LnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvcGF0aGZpeC5weQpAQCAtMjAsNyArMjAsNyBAQAogIyBpbnRvIGEgcHJvZ3JhbSBmb3IgYSBkaWZmZXJlbnQgY2hhbmdlIHRvIFB5dGhvbiBwcm9ncmFtcy4uLgogCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IG9zCiBmcm9tIHN0YXQgaW1wb3J0ICoKIGltcG9ydCBnZXRvcHQKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgICAgIGlmIGZpeChhcmcpOiBiYWQgPSAxCiAgICAgc3lzLmV4aXQoYmFkKQogCi1pc3B5dGhvbnByb2cgPSByZWdleC5jb21waWxlKCdeW2EtekEtWjAtOV9dK1wucHkkJykKK2lzcHl0aG9ucHJvZyA9IHJlLmNvbXBpbGUoJ15bYS16QS1aMC05X10rXC5weSQnKQogZGVmIGlzcHl0aG9uKG5hbWUpOgogICAgIHJldHVybiBpc3B5dGhvbnByb2cubWF0Y2gobmFtZSkgPj0gMAogCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL3BkZXBzLnB5IGIvVG9vbHMvc2NyaXB0cy9wZGVwcy5weQppbmRleCBlODM1Zjg0Li5kYTYzZTM1IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL3BkZXBzLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvcGRlcHMucHkKQEAgLTIxLDcgKzIxLDcgQEAKIAogCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IG9zCiAKIApAQCAtNTcsOCArNTcsOCBAQAogCiAjIENvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gc2VhcmNoIGZvciBpbXBvcnQgc3RhdGVtZW50cwogIwotbV9pbXBvcnQgPSByZWdleC5jb21waWxlKCdeWyBcdF0qZnJvbVsgXHRdK1woW14gXHRdK1wpWyBcdF0rJykKLW1fZnJvbSA9IHJlZ2V4LmNvbXBpbGUoJ15bIFx0XSppbXBvcnRbIFx0XStcKFteI10rXCknKQorbV9pbXBvcnQgPSByZS5jb21waWxlKCdeWyBcdF0qZnJvbVsgXHRdKyhbXiBcdF0rKVsgXHRdKycpCittX2Zyb20gPSByZS5jb21waWxlKCdeWyBcdF0qaW1wb3J0WyBcdF0rKFteI10rKScpCiAKIAogIyBDb2xsZWN0IGRhdGEgZnJvbSBvbmUgZmlsZQpkaWZmIC0tZ2l0IGEvVG9vbHMvdW5pY29kZS9NYWtlZmlsZSBiL1Rvb2xzL3VuaWNvZGUvTWFrZWZpbGUKaW5kZXggZjI2NmQ0ZC4uZmJkMzU1NyAxMDA2NDQKLS0tIGEvVG9vbHMvdW5pY29kZS9NYWtlZmlsZQorKysgYi9Ub29scy91bmljb2RlL01ha2VmaWxlCkBAIC0xNSw3ICsxNSw3IEBACiAKIGFsbDoJZGlzdGNsZWFuIG1hcHBpbmdzIGNvZGVjcwogCi1jb2RlY3M6CW1pc2Mgd2luZG93cyBpc28gYXBwbGUgZWJjZGljIGN1c3RvbS1tYXBwaW5ncworY29kZWNzOgltaXNjIHdpbmRvd3MgaXNvIGFwcGxlIGViY2RpYyBjdXN0b20tbWFwcGluZ3MgY2prCiAKICMjIyBNYXBwaW5ncwogCkBAIC03Miw2ICs3Miw5IEBACiAJJChQWVRIT04pIGdlbmNvZGVjLnB5IE1BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL0VCQ0RJQy8gYnVpbGQvCiAJJChSTSkgLWYgYnVpbGQvcmVhZG1lLioKIAorY2prOglidWlsZC8KKwkkKFBZVEhPTikgZ2VuY2prY29kZWNzLnB5IGJ1aWxkLworCiAjIyMgQ2xlYW51cAogCiBjbGVhbjoKZGlmZiAtLWdpdCBhL1Rvb2xzL3VuaWNvZGUvZ2VuY2prY29kZWNzLnB5IGIvVG9vbHMvdW5pY29kZS9nZW5jamtjb2RlY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1YzE5YwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3VuaWNvZGUvZ2VuY2prY29kZWNzLnB5CkBAIC0wLDAgKzEsNjggQEAKK2ltcG9ydCBvcywgc3RyaW5nCisKK2NvZGVjcyA9IHsKKyAgICAnY24nOiAoJ2diMjMxMicsICdnYmsnLCAnZ2IxODAzMCcsICdoeicpLAorICAgICd0dyc6ICgnYmlnNScsICdjcDk1MCcpLAorICAgICdoayc6ICgnYmlnNWhrc2NzJywpLAorICAgICdqcCc6ICgnY3A5MzInLCAnc2hpZnRfamlzJywgJ2V1Y19qcCcsICdldWNfamlzeDAyMTMnLCAnc2hpZnRfamlzeDAyMTMnLAorICAgICAgICAgICAnZXVjX2ppc18yMDA0JywgJ3NoaWZ0X2ppc18yMDA0JyksCisgICAgJ2tyJzogKCdjcDk0OScsICdldWNfa3InLCAnam9oYWInKSwKKyAgICAnaXNvMjAyMic6ICgnaXNvMjAyMl9qcCcsICdpc28yMDIyX2pwXzEnLCAnaXNvMjAyMl9qcF8yJywKKyAgICAgICAgICAgICAgICAnaXNvMjAyMl9qcF8yMDA0JywgJ2lzbzIwMjJfanBfMycsICdpc28yMDIyX2pwX2V4dCcsCisgICAgICAgICAgICAgICAgJ2lzbzIwMjJfa3InKSwKK30KKworVEVNUExBVEUgPSBzdHJpbmcuVGVtcGxhdGUoIiIiXAorIworIyAkZW5jb2RpbmcucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciAkRU5DT0RJTkcKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzXyRvd25lciwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfJG93bmVyLmdldGNvZGVjKCckZW5jb2RpbmcnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nJGVuY29kaW5nJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorIiIiKQorCitkZWYgZ2VuY29kZWNzKHByZWZpeCk6CisgICAgZm9yIGxvYywgZW5jb2RpbmdzIGluIGNvZGVjcy5pdGVyaXRlbXMoKToKKyAgICAgICAgZm9yIGVuYyBpbiBlbmNvZGluZ3M6CisgICAgICAgICAgICBjb2RlID0gVEVNUExBVEUuc3Vic3RpdHV0ZShFTkNPRElORz1lbmMudXBwZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPWVuYy5sb3dlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXI9bG9jKQorICAgICAgICAgICAgY29kZWNwYXRoID0gb3MucGF0aC5qb2luKHByZWZpeCwgZW5jICsgJy5weScpCisgICAgICAgICAgICBvcGVuKGNvZGVjcGF0aCwgJ3cnKS53cml0ZShjb2RlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBzeXMKKyAgICBnZW5jb2RlY3Moc3lzLmFyZ3ZbMV0pCmRpZmYgLS1naXQgYS9Ub29scy91bmljb2RlL2dlbmNvZGVjLnB5IGIvVG9vbHMvdW5pY29kZS9nZW5jb2RlYy5weQppbmRleCBiYjFjOWRhLi4zY2ZlZjIwIDEwMDY0NAotLS0gYS9Ub29scy91bmljb2RlL2dlbmNvZGVjLnB5CisrKyBiL1Rvb2xzL3VuaWNvZGUvZ2VuY29kZWMucHkKQEAgLTM0OCw3ICszNDgsNyBAQAogICAgIGwuZXh0ZW5kKGVuY29kaW5nX21hcF9jb2RlKQogCiAgICAgIyBGaW5hbCBuZXctbGluZQotICAgIGwuYXBwZW5kKCdcbicpCisgICAgbC5hcHBlbmQoJycpCiAKICAgICByZXR1cm4gJ1xuJy5qb2luKGwpLmV4cGFuZHRhYnMoKQogCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggM2UzMjJlNi4uMDI1MGQ5ZSAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMSw1ICsxLDUgQEAKICMhIC9iaW4vc2gKLSMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDQyNTYzIC4KKyMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDQzNDU5IC4KICMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KICMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5IGZvciBweXRob24gMy4wLgogIwpAQCAtMzEyLDcgKzMxMiw3IEBACiAjIGluY2x1ZGUgPHVuaXN0ZC5oPgogI2VuZGlmIgogCi1hY19zdWJzdF92YXJzPSdTSEVMTCBQQVRIX1NFUEFSQVRPUiBQQUNLQUdFX05BTUUgUEFDS0FHRV9UQVJOQU1FIFBBQ0tBR0VfVkVSU0lPTiBQQUNLQUdFX1NUUklORyBQQUNLQUdFX0JVR1JFUE9SVCBleGVjX3ByZWZpeCBwcmVmaXggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGxpYmRpciBpbmNsdWRlZGlyIG9sZGluY2x1ZGVkaXIgaW5mb2RpciBtYW5kaXIgYnVpbGRfYWxpYXMgaG9zdF9hbGlhcyB0YXJnZXRfYWxpYXMgREVGUyBFQ0hPX0MgRUNIT19OIEVDSE9fVCBMSUJTIFZFUlNJT04gU09WRVJTSU9OIENPTkZJR19BUkdTIFBZVEhPTkZSQU1FV09SSyBQWVRIT05GUkFNRVdPUktESVIgUFlUSE9ORlJBTUVXT1JLUFJFRklYIFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIgTUFDSERFUCBTR0lfQUJJIEVYVFJBUExBVERJUiBFWFRSQU1BQ0hERVBQQVRIIENPTkZJR1VSRV9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgQ1hYIE1BSU5PQkogRVhFRVhUIENDIENGTEFHUyBMREZMQUdTIENQUEZMQUdTIGFjX2N0X0NDIE9CSkVYVCBDUFAgRUdSRVAgQlVJTERFWEVFWFQgTElCUkFSWSBMRExJQlJBUlkgRExMTElCUkFSWSBCTERMSUJSQVJZIExETElCUkFSWURJUiBJTlNUU09OQU1FIFJVTlNIQVJFRCBMSU5LQ0MgUkFOTElCIGFjX2N0X1JBTkxJQiBBUiBTVk5WRVJTSU9OIElOU1RBTExfUFJPR1JBTSBJTlNUQUxMX1NDUklQVCBJTlNUQUxMX0RBVEEgTE4gT1BUIEJBU0VDRkxBR1MgT1RIRVJfTElCVE9PTF9PUFQgTElCVE9PTF9DUlVGVCBTTyBMRFNIQVJFRCBCTERTSEFSRUQgQ0NTSEFSRUQgTElOS0ZPUlNIQVJFRCBDRkxBR1NGT1JTSEFSRUQgU0hMSUJTIFVTRV9TSUdOQUxfTU9EVUxFIFNJR05BTF9PQkpTIFVTRV9USFJFQURfTU9EVUxFIExETEFTVCBUSFJFQURPQkogRExJTkNMRElSIERZTkxPQURGSUxFIE1BQ0hERVBfT0JKUyBUUlVFIExJQk9CSlMgSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkcgSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9BUkcgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcgSEFWRV9HRVRIT1NUQllOQU1FX1IgSEFWRV9HRVRIT1NUQllOQU1FIExJQk0gTElCQyBVTklDT0RFX09CSlMgVEhSRUFESEVBREVSUyBTUkNESVJTIExUTElCT0JKUycKK2FjX3N1YnN0X3ZhcnM9J1NIRUxMIFBBVEhfU0VQQVJBVE9SIFBBQ0tBR0VfTkFNRSBQQUNLQUdFX1RBUk5BTUUgUEFDS0FHRV9WRVJTSU9OIFBBQ0tBR0VfU1RSSU5HIFBBQ0tBR0VfQlVHUkVQT1JUIGV4ZWNfcHJlZml4IHByZWZpeCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpciBidWlsZF9hbGlhcyBob3N0X2FsaWFzIHRhcmdldF9hbGlhcyBERUZTIEVDSE9fQyBFQ0hPX04gRUNIT19UIExJQlMgVkVSU0lPTiBTT1ZFUlNJT04gQ09ORklHX0FSR1MgUFlUSE9ORlJBTUVXT1JLIFBZVEhPTkZSQU1FV09SS0RJUiBQWVRIT05GUkFNRVdPUktQUkVGSVggUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUiBNQUNIREVQIFNHSV9BQkkgRVhUUkFQTEFURElSIEVYVFJBTUFDSERFUFBBVEggQ09ORklHVVJFX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBDQyBDRkxBR1MgTERGTEFHUyBDUFBGTEFHUyBhY19jdF9DQyBFWEVFWFQgT0JKRVhUIENYWCBNQUlOQ0MgQ1BQIEVHUkVQIEJVSUxERVhFRVhUIExJQlJBUlkgTERMSUJSQVJZIERMTExJQlJBUlkgQkxETElCUkFSWSBMRExJQlJBUllESVIgSU5TVFNPTkFNRSBSVU5TSEFSRUQgTElOS0NDIFJBTkxJQiBhY19jdF9SQU5MSUIgQVIgU1ZOVkVSU0lPTiBJTlNUQUxMX1BST0dSQU0gSU5TVEFMTF9TQ1JJUFQgSU5TVEFMTF9EQVRBIExOIE9QVCBCQVNFQ0ZMQUdTIE9USEVSX0xJQlRPT0xfT1BUIExJQlRPT0xfQ1JVRlQgU08gTERTSEFSRUQgQkxEU0hBUkVEIENDU0hBUkVEIExJTktGT1JTSEFSRUQgQ0ZMQUdTRk9SU0hBUkVEIFNITElCUyBVU0VfU0lHTkFMX01PRFVMRSBTSUdOQUxfT0JKUyBVU0VfVEhSRUFEX01PRFVMRSBMRExBU1QgVEhSRUFET0JKIERMSU5DTERJUiBEWU5MT0FERklMRSBNQUNIREVQX09CSlMgVFJVRSBMSUJPQkpTIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHIEhBVkVfR0VUSE9TVEJZTkFNRV9SIEhBVkVfR0VUSE9TVEJZTkFNRSBMSUJNIExJQkMgVU5JQ09ERV9PQkpTIFRIUkVBREhFQURFUlMgU1JDRElSUyBMVExJQk9CSlMnCiBhY19zdWJzdF9maWxlcz0nJwogCiAjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCkBAIC04NTksMTAgKzg1OSwxMyBAQAogICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KICAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQogICAtLXdpdGhvdXQtZ2NjICAgICAgICAgICBuZXZlciB1c2UgZ2NjCi0gIC0td2l0aC1jeHg9PGNvbXBpbGVyPiAgIGVuYWJsZSBDKysgc3VwcG9ydAorICAtLXdpdGgtY3h4LW1haW49PGNvbXBpbGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlIG1haW4oKSBhbmQgbGluayBweXRob24gZXhlY3V0YWJsZSB3aXRoIEMrKworICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcgogICAtLXdpdGgtc3VmZml4PS5leGUgICAgICBzZXQgZXhlY3V0YWJsZSBzdWZmaXgKICAgLS13aXRoLXB5ZGVidWcgICAgICAgICAgYnVpbGQgd2l0aCBQeV9ERUJVRyBkZWZpbmVkCiAgIC0td2l0aC1saWJzPSdsaWIxIC4uLicgIGxpbmsgYWdhaW5zdCBhZGRpdGlvbmFsIGxpYnMKKyAgLS13aXRoLXN5c3RlbS1mZmkgICAgICAgYnVpbGQgX2N0eXBlcyBtb2R1bGUgdXNpbmcgYW4gaW5zdGFsbGVkIGZmaSBsaWJyYXJ5CiAgIC0td2l0aC1zaWduYWwtbW9kdWxlICAgIGRpc2FibGUvZW5hYmxlIHNpZ25hbCBtb2R1bGUKICAgLS13aXRoLWRlYy10aHJlYWRzICAgICAgdXNlIERFQyBBbHBoYS9PU0YxIHRocmVhZC1zYWZlIGxpYnJhcmllcwogICAtLXdpdGgob3V0KS10aHJlYWRzWz1ESVJFQ1RPUlldCkBAIC05NzksNyArOTgyLDcgQEAKICAgICBlbHNlCiAgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCiAgICAgZmkKLSAgICBjZCAkYWNfcG9wZGlyCisgICAgY2QgIiRhY19wb3BkaXIiCiAgIGRvbmUKIGZpCiAKQEAgLTE1MTMsNyArMTUxNiw5IEBACiAgICAgOzsKICAgIyBPbiBNYWMgT1MgWCAxMC40LCBkZWZpbmluZyBfUE9TSVhfQ19TT1VSQ0Ugb3IgX1hPUEVOX1NPVVJDRQogICAjIGRpc2FibGVzIHBsYXRmb3JtIHNwZWNpZmljIGZlYXR1cmVzIGJleW9uZCByZXBhaXIuCi0gIERhcndpbi84LiopCisgICMgT24gTWFjIE9TIFggMTAuMywgZGVmaW5pbmcgX1BPU0lYX0NfU09VUkNFIG9yIF9YT1BFTl9TT1VSQ0UKKyAgIyBoYXMgbm8gZWZmZWN0LCBkb24ndCBib3RoZXIgZGVmaW5laW5nIHRoZW0KKyAgRGFyd2luL1s3OF0uKikKICAgICBkZWZpbmVfeG9wZW5fc291cmNlPW5vCiAgICAgOzsKIApAQCAtMTY3NiwyNTggKzE2ODEsNiBAQAogZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdpdGhvdXRfZ2NjIiA+JjUKIGVjaG8gIiR7RUNIT19UfSR3aXRob3V0X2djYyIgPiY2CiAKLQotCi1NQUlOT0JKPXB5dGhvbi5vCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aC1jeHg9PGNvbXBpbGVyPiIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtY3h4PTxjb21waWxlcj4uLi4gJEVDSE9fQyIgPiY2Ci0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY3h4IG9yIC0td2l0aG91dC1jeHggd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2N4eCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9jeHgiCi0KLQljaGVja19jeHg9bm8KLQljYXNlICR3aXRodmFsIGluCi0Jbm8pCUNYWD0KLQkJd2l0aF9jeHg9bm87OwotCSopCUNYWD0kd2l0aHZhbAotCQlNQUlOT0JKPWNjcHl0aG9uLm8KLQkJd2l0aF9jeHg9JHdpdGh2YWw7OwotCWVzYWMKLWVsc2UKLQotCXdpdGhfY3h4PW5vCi0JY2hlY2tfY3h4PXllcwotCi1maTsKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3aXRoX2N4eCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kd2l0aF9jeHgiID4mNgotCi1pZiB0ZXN0ICIkd2l0aF9jeHgiID0gInllcyIKLXRoZW4KLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBtdXN0IHN1cHBseSBhIGNvbXBpbGVyIHdoZW4gdXNpbmcgLS13aXRoLWN4eCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBtdXN0IHN1cHBseSBhIGNvbXBpbGVyIHdoZW4gdXNpbmcgLS13aXRoLWN4eCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotCi0KLQotaWYgdGVzdCAiJGNoZWNrX2N4eCIgPSAieWVzIgotdGhlbgotCWZvciBhY19wcm9nIGluICRDQ0MgYysrIGcrKyBnY2MgQ0MgY3h4IGNjKysgY2wKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NYWCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgotICBhY19jdl9wcm9nX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfcHJvZyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotCi1maQotZmkKLUNYWD0kYWNfY3ZfcHJvZ19DWFgKLWlmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDWFgiID4mNQotZWNobyAiJHtFQ0hPX1R9JENYWCIgPiY2Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLWZpCi0KLSAgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRDWFgiIHx8IENYWD0ibm90Zm91bmQiCi0KLQlpZiB0ZXN0ICIkQ1hYIiA9ICJub3Rmb3VuZCIKLQl0aGVuCi0JCUNYWD0KLQllbHNlCi0JCWFjX2V4dD1jYwotYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKLSAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCi0jIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCi0jIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCi0jIG9mIGV4ZWV4dC4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQysrIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDKysgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICRFQ0hPX0MiID4mNgotYWNfbGlua19kZWZhdWx0PWBlY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFteIF0qLy8nYAotaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua19kZWZhdWx0XCIiKSA+JjUKLSAgKGV2YWwgJGFjX2xpbmtfZGVmYXVsdCkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAjIEZpbmQgdGhlIG91dHB1dCwgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCBsaWtlbHkuICBUaGlzIHNjaGVtZSBpcwotIyBub3Qgcm9idXN0IHRvIGp1bmsgaW4gYC4nLCBoZW5jZSBnbyB0byB3aWxkY2FyZHMgKGEuKikgb25seSBhcyBhIGxhc3QKLSMgcmVzb3J0LgotCi0jIEJlIGNhcmVmdWwgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhcmlhYmxlLCBzaW5jZSBpdCB1c2VkIHRvIGJlIGNhY2hlZC4KLSMgT3RoZXJ3aXNlIGFuIG9sZCBjYWNoZSB2YWx1ZSBvZiBgbm8nIGxlZCB0byBgRVhFRVhUID0gbm8nIGluIGEgTWFrZWZpbGUuCi1hY19jdl9leGVleHQ9Ci0jIGIub3V0IGlzIGNyZWF0ZWQgYnkgaTk2MCBjb21waWxlcnMuCi1mb3IgYWNfZmlsZSBpbiBhX291dC5leGUgYS5leGUgY29uZnRlc3QuZXhlIGEub3V0IGNvbmZ0ZXN0IGEuKiBjb25mdGVzdC4qIGIub3V0Ci1kbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5vIHwgKi5vYmogKQotCTs7Ci0gICAgY29uZnRlc3QuJGFjX2V4dCApCi0JIyBUaGlzIGlzIHRoZSBzb3VyY2UgZmlsZS4KLQk7OwotICAgIFthYl0ub3V0ICkKLQkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAotCSMgY2VydGFpbmx5IHJpZ2h0LgotCWJyZWFrOzsKLSAgICAqLiogKQotCWFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCSMgRklYTUU6IEkgYmVsaWV2ZSB3ZSBleHBvcnQgYWNfY3ZfZXhlZXh0IGZvciBMaWJ0b29sLAotCSMgYnV0IGl0IHdvdWxkIGJlIGNvb2wgdG8gZmluZCBvdXQgaWYgaXQncyB0cnVlLiAgRG9lcyBhbnlib2R5Ci0JIyBtYWludGFpbiBMaWJ0b29sPyAtLWFraW0uCi0JZXhwb3J0IGFjX2N2X2V4ZWV4dAotCWJyZWFrOzsKLSAgICAqICkKLQlicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQysrIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEMrKyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci1maQotCi1hY19leGVleHQ9JGFjX2N2X2V4ZWV4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2ZpbGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2ZpbGUiID4mNgotCi0jIENoZWNrIHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgd29ya3MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgd29ya3MuLi4gJEVDSE9fQyIgPiY2Ci0jIEZJWE1FOiBUaGVzZSBjcm9zcyBjb21waWxlciBoYWNrcyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgQXV0b2NvbmYgMy4wCi0jIElmIG5vdCBjcm9zcyBjb21waWxpbmcsIGNoZWNrIHRoYXQgd2UgY2FuIHJ1biBhIHNpbXBsZSBwcm9ncmFtLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCi0gIGlmIHsgYWNfdHJ5PScuLyRhY19maWxlJwotICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW5vCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCi0JY3Jvc3NfY29tcGlsaW5nPXllcwotICAgIGVsc2UKLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMrKyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biBDKysgY29tcGlsZWQgcHJvZ3JhbXMuCi1JZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgZmkKLSAgZmkKLWZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKLQotcm0gLWYgYS5vdXQgYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotIyBDaGVjayB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICRFQ0hPX0MiID4mNgotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kY3Jvc3NfY29tcGlsaW5nIiA+JjYKLQotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICRFQ0hPX0MiID4mNgotaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gIChldmFsICRhY19saW5rKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQotIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCi0jIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAotIyBgcm0nLgotZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JICBleHBvcnQgYWNfY3ZfZXhlZXh0Ci0JICBicmVhazs7Ci0gICAgKiApIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotZWxzZQotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotcm0gLWYgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNgotCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1FWEVFWFQ9JGFjX2N2X2V4ZWV4dAotYWNfZXhlZXh0PSRFWEVFWFQKLQotICAgICAgIGFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi0KLQlmaQotZmkKLQogIyBJZiB0aGUgdXNlciBzd2l0Y2hlcyBjb21waWxlcnMsIHdlIGNhbid0IGJlbGlldmUgdGhlIGNhY2hlCiBpZiB0ZXN0ICEgLXogIiRhY19jdl9wcm9nX0NDIiAtYSAhIC16ICIkQ0MiIC1hICIkQ0MiICE9ICIkYWNfY3ZfcHJvZ19DQyIKIHRoZW4KQEAgLTI1MDYsOCArMjI1OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI1NjUsOCArMjMxNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI2ODIsOCArMjQzMyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI3MzcsOCArMjQ4Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI3ODMsOCArMjUzMiw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI4MjgsOCArMjU3Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI4NjksNiArMjYxNiwxOTAgQEAKIGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKIAogCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtY3h4LW1haW49PGNvbXBpbGVyPiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtY3h4LW1haW49PGNvbXBpbGVyPi4uLiAkRUNIT19DIiA+JjYKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jeHhfbWFpbiBvciAtLXdpdGhvdXQtY3h4X21haW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2N4eF9tYWluK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2N4eF9tYWluIgorCisKKwljYXNlICR3aXRodmFsIGluCisJbm8pCXdpdGhfY3h4X21haW49bm8KKwkJTUFJTkNDPSckKENDKSc7OworCXllcykJd2l0aF9jeHhfbWFpbj15ZXMKKwkJTUFJTkNDPSckKENYWCknOzsKKwkqKQl3aXRoX2N4eF9tYWluPXllcworCQlNQUlOQ0M9JHdpdGh2YWwKKwkJaWYgdGVzdCAteiAiJENYWCIKKwkJdGhlbgorCQkJQ1hYPSR3aXRodmFsCisJCWZpOzsKKwllc2FjCitlbHNlCisKKwl3aXRoX2N4eF9tYWluPW5vCisJTUFJTkNDPSckKENDKScKKworZmk7CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aF9jeHhfbWFpbiIgPiY1CitlY2hvICIke0VDSE9fVH0kd2l0aF9jeHhfbWFpbiIgPiY2CisKK3ByZXNldF9jeHg9IiRDWFgiCitpZiB0ZXN0IC16ICIkQ1hYIgordGhlbgorICAgICAgICBjYXNlICIkQ0MiIGluCisgICAgICAgIGdjYykgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnKysiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGcrKzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2FzZSAkQ1hYIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gbm90Zm91bmQKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DWFg9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DWFgiICYmIGFjX2N2X3BhdGhfQ1hYPSJnKysiCisgIDs7Citlc2FjCitmaQorQ1hYPSRhY19jdl9wYXRoX0NYWAorCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorIDs7CisgICAgICAgIGNjKSAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjKysiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGMrKzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2FzZSAkQ1hYIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gbm90Zm91bmQKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DWFg9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DWFgiICYmIGFjX2N2X3BhdGhfQ1hYPSJjKysiCisgIDs7Citlc2FjCitmaQorQ1hYPSRhY19jdl9wYXRoX0NYWAorCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorIDs7CisgICAgICAgIGVzYWMKKwlpZiB0ZXN0ICIkQ1hYIiA9ICJub3Rmb3VuZCIKKwl0aGVuCisJCUNYWD0iIgorCWZpCitmaQoraWYgdGVzdCAteiAiJENYWCIKK3RoZW4KKwlmb3IgYWNfcHJvZyBpbiAkQ0NDIGMrKyBnKysgZ2NjIENDIGN4eCBjYysrIGNsCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DWFg9IiRDWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NYWD0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitDWFg9JGFjX2N2X3Byb2dfQ1hYCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCitkb25lCit0ZXN0IC1uICIkQ1hYIiB8fCBDWFg9Im5vdGZvdW5kIgorCisJaWYgdGVzdCAiJENYWCIgPSAibm90Zm91bmQiCisJdGhlbgorCQlDWFg9IiIKKwlmaQorZmkKK2lmIHRlc3QgIiRwcmVzZXRfY3h4IiAhPSAiJENYWCIKK3RoZW4KKyAgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzoKKworICBCeSBkZWZhdWx0LCBkaXN0dXRpbHMgd2lsbCBidWlsZCBDKysgZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBcIiRDWFhcIi4KKyAgSWYgdGhpcyBpcyBub3QgaW50ZW5kZWQsIHRoZW4gc2V0IENYWCBvbiB0aGUgY29uZmlndXJlIGNvbW1hbmQgbGluZS4KKyAgIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzoKKworICBCeSBkZWZhdWx0LCBkaXN0dXRpbHMgd2lsbCBidWlsZCBDKysgZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBcIiRDWFhcIi4KKyAgSWYgdGhpcyBpcyBub3QgaW50ZW5kZWQsIHRoZW4gc2V0IENYWCBvbiB0aGUgY29uZmlndXJlIGNvbW1hbmQgbGluZS4KKyAgIiA+JjI7fQorZmkKKworCiAjIGNoZWNrcyBmb3IgVU5JWCB2YXJpYW50cyB0aGF0IHNldCBDIHByZXByb2Nlc3NvciB2YXJpYWJsZXMKIAogYWNfZXh0PWMKQEAgLTMyNzEsMjIgKzMyMDIsNyBAQAogZWNobyAkRUNIT19OICJjaGVja2luZyBMSU5LQ0MuLi4gJEVDSE9fQyIgPiY2CiBpZiB0ZXN0IC16ICIkTElOS0NDIgogdGhlbgotICAgICAgICBpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgotICAgICAgICAgICAgICBMSU5LQ0M9IlwkKFBVUklGWSkgXCQoQ0MpIgotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGVjaG8gJ2V4dGVybiAiQyIgdm9pZCBmb28oKTtpbnQgbWFpbigpe2ZvbygpO30nID4gY29uZnRlc3RfYS5jYwotICAgICAgICAgICAgICAkQ1hYIC1jIGNvbmZ0ZXN0X2EuY2MgIyAyPiY1Ci0gICAgICAgICAgICAgIGVjaG8gJ3ZvaWQgZm9vKCl7fScgPiBjb25mdGVzdF9iLiRhY19leHQKLSAgICAgICAgICAgICAgJENDIC1jIGNvbmZ0ZXN0X2IuJGFjX2V4dCAjIDI+JjUKLSAgICAgICAgICAgICAgaWYgJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdF9hLiRhY19vYmpleHQgY29uZnRlc3RfYi4kYWNfb2JqZXh0IDI+JjUgXAotICAgICAgICAgICAgICAgICAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiAuL2NvbmZ0ZXN0JGFjX2V4ZWV4dAotICAgICAgICAgICAgICB0aGVuCi0gICAgICAgICAgICAgICAgIExJTktDQz0iXCQoUFVSSUZZKSBcJChDQykiCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgTElOS0NDPSJcJChQVVJJRlkpIFwkKENYWCkiCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgIHJtIC1mciBjb25mdGVzdCoKLSAgICAgICAgZmkKKwlMSU5LQ0M9JyQoUFVSSUZZKSAkKE1BSU5DQyknCiAJY2FzZSAkYWNfc3lzX3N5c3RlbSBpbgogCUFJWCopCiAJICAgZXhwX2V4dHJhPSJcIlwiIgpAQCAtMzYwMCw2ICszNTE2LDcgQEAKIGRvbmUKIGRvbmUKIAorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVk5WRVJTSU9OIiAmJiBhY19jdl9wcm9nX1NWTlZFUlNJT049Im5vdC1mb3VuZCIKIGZpCiBmaQogU1ZOVkVSU0lPTj0kYWNfY3ZfcHJvZ19TVk5WRVJTSU9OCkBAIC0zNzg4LDE4ICszNzA1LDIxIEBACiB0aGVuCiAgICAgY2FzZSAkR0NDIGluCiAgICAgeWVzKQorICAgICAgICBpZiB0ZXN0ICIkQ0MiICE9ICdnKysnIDsgdGhlbgorCSAgICBTVFJJQ1RfUFJPVE89Ii1Xc3RyaWN0LXByb3RvdHlwZXMiCisJZmkKIAljYXNlICRhY19jdl9wcm9nX2NjX2cgaW4KIAl5ZXMpCiAJICAgIGlmIHRlc3QgIiRQeV9ERUJVRyIgPSAndHJ1ZScgOyB0aGVuCiAJCSMgT3B0aW1pemF0aW9uIG1lc3NlcyB1cCBkZWJ1Z2dlcnMsIHNvIHR1cm4gaXQgb2ZmIGZvcgogCQkjIGRlYnVnIGJ1aWxkcy4KLQkJT1BUPSItZyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIgorCQlPUFQ9Ii1nIC1XYWxsICRTVFJJQ1RfUFJPVE8iCiAJICAgIGVsc2UKLQkJT1BUPSItZyAtTzMgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyIKKwkJT1BUPSItZyAtTzMgLVdhbGwgJFNUUklDVF9QUk9UTyIKIAkgICAgZmkKIAkgICAgOzsKIAkqKQotCSAgICBPUFQ9Ii1PMyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIgorCSAgICBPUFQ9Ii1PMyAtV2FsbCAkU1RSSUNUX1BST1RPIgogCSAgICA7OwogCWVzYWMKIAljYXNlICRhY19zeXNfc3lzdGVtIGluCkBAIC0zODgyLDYgKzM4MDIsOSBAQAogCURhcndpbiopCiAJICAgIEJBU0VDRkxBR1M9IiRCQVNFQ0ZMQUdTIC1Xbm8tbG9uZy1kb3VibGUgLW5vLWNwcC1wcmVjb21wIC1tbm8tZnVzZWQtbWFkZCIKIAkgICAgOzsKKwlPU0YqKQorCSAgICBCQVNFQ0ZMQUdTPSIkQkFTRUNGTEFHUyAtbWllZWUiCisJICAgIDs7CiAgICAgZXNhYwogICAgIDs7CiAKQEAgLTQzNjYsOCArNDI4OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ1MzcsOCArNDQ1OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ2NTIsOCArNDU3Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ4MDgsOCArNDcyOCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ4ODEsOCArNDgwMCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ5MzYsOCArNDg1NCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUwMDgsOCArNDkyNSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUwNjMsOCArNDk3OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUxMjcsOCArNTA0Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUxODUsOCArNTA5OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUzMzMsOCArNTI0Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU0ODYsOCArNTM5OCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU1NTYsOCArNTQ2Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU2NDcsOCArNTU1Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU2OTgsOCArNTYwNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU3NzYsOCArNTY4NCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU4NTgsOCArNTc2NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU5MjQsOCArNTgzMCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU5OTAsOCArNTg5NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYwNjMsOCArNTk2Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYxMjUsOCArNjAyOCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYyMjksOCArNjEzMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYyOTYsOCArNjE5Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYzNTksOCArNjI1OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTY0MDAsOCArNjI5OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTY0NTcsOCArNjM1NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTY0OTgsOCArNjM5NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTY1NjMsOCArNjQ1OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTY1OTUsMTAgKzY0OTAsOCBAQAogZXNhYwogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjI7fQogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtNjcxMCw4ICs2NjAzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjc3Myw4ICs2NjY1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjgxNCw4ICs2NzA1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjg3MSw4ICs2NzYxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjkxMiw4ICs2ODAxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjk3Nyw4ICs2ODY1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNzAwOSwxMCArNjg5Niw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC03MTI0LDggKzcwMDksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03MTg3LDggKzcwNzEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03MjI4LDggKzcxMTEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03Mjg1LDggKzcxNjcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03MzI2LDggKzcyMDcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03MzkxLDggKzcyNzEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03NDIzLDEwICs3MzAyLDggQEAKIGVzYWMKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTc1MzgsOCArNzQxNSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc2MDEsOCArNzQ3Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc2NDIsOCArNzUxNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc2OTksOCArNzU3Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc3NDAsOCArNzYxMyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc4MDUsOCArNzY3Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc4MzcsMTAgKzc3MDgsOCBAQAogZXNhYwogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjI7fQogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtNzk1Miw4ICs3ODIxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODAxNSw4ICs3ODgzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODA1Niw4ICs3OTIzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODExMyw4ICs3OTc5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODE1NCw4ICs4MDE5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODIxOSw4ICs4MDgzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODI1MSwxMCArODExNCw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC04MzY2LDggKzgyMjcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NDI5LDggKzgyODksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NDcwLDggKzgzMjksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NTI3LDggKzgzODUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NTY4LDggKzg0MjUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NjMzLDggKzg0ODksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NjY1LDEwICs4NTIwLDggQEAKIGVzYWMKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTg3ODAsOCArODYzMyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTg4NDMsOCArODY5NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTg4ODQsOCArODczNSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTg5NDEsOCArODc5MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTg5ODIsOCArODgzMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTkwNDcsOCArODg5NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTkwNzksMTAgKzg5MjYsOCBAQAogZXNhYwogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjI7fQogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtOTE5NCw4ICs5MDM5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTI1Nyw4ICs5MTAxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTI5OCw4ICs5MTQxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTM1NSw4ICs5MTk3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTM5Niw4ICs5MjM3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTQ2MSw4ICs5MzAxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTQ5MywxMCArOTMzMiw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC05NjA0LDggKzk0NDEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05NjY2LDggKzk1MDIsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05NzI5LDggKzk1NjQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05NzcwLDggKzk2MDQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05ODI3LDggKzk2NjAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05ODY4LDggKzk3MDAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05OTMzLDggKzk3NjQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05OTY1LDEwICs5Nzk1LDggQEAKIGVzYWMKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTEwMDc3LDggKzk5MDUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMDEzOSw4ICs5OTY2LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTAyMDIsOCArMTAwMjgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMDI0Myw4ICsxMDA2OCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEwMzAwLDggKzEwMTI0LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTAzNDEsOCArMTAxNjQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMDQwNiw4ICsxMDIyOCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEwNDM4LDEwICsxMDI1OSw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xMDY5Myw4ICsxMDUxMiw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEwODEzLDcgKzEwNjMxLDcgQEAKIAogCiBjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgotICBEYXJ3aW4vWzAxMjM0NTY3XS4qKQorICBEYXJ3aW4vWzAxNTY3XVwuLiopCiAgICAgT1RIRVJfTElCVE9PTF9PUFQ9Ii1wcmViaW5kIC1zZWcxYWRkciAweDEwMDAwMDAwIgogICAgIDs7CiAgIERhcndpbi8qKQpAQCAtMTA4MjMsNyArMTA2NDEsNyBAQAogCiAKIGNhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCi0gIERhcndpbi9bMDEyMzQ1NjddLiopCisgIERhcndpbi9bMDE1NjddXC4uKikKICAgICBMSUJUT09MX0NSVUZUPSItZnJhbWV3b3JrIFN5c3RlbSAtbGNjX2R5bmFtaWMgLWFyY2hfb25seSBgYXJjaGAiCiAgICAgTElCVE9PTF9DUlVGVD0kTElCVE9PTF9DUlVGVCcgLWluc3RhbGxfbmFtZSAkKFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIpL1ZlcnNpb25zLyQoVkVSU0lPTikvJChQWVRIT05GUkFNRVdPUkspJwogICAgIExJQlRPT0xfQ1JVRlQ9JExJQlRPT0xfQ1JVRlQnIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJChWRVJTSU9OKSAtY3VycmVudF92ZXJzaW9uICQoVkVSU0lPTiknOzsKQEAgLTExMTcwLDggKzEwOTg4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTEyNDQsOCArMTEwNjEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMTMyMCw4ICsxMTEzNiw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTExMzc1LDggKzExMTkwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTE0NTEsOCArMTEyNjUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMTUxNCw4ICsxMTMyNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTExNTg2LDggKzExMzk4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTE2NTQsOCArMTE0NjUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMTcyNSw4ICsxMTUzNSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTExNzc0LDYgKzExNTgzLDIyIEBACiBlY2hvICIke0VDSE9fVH1ubyIgPiY2CiBmaTsKIAorIyBDaGVjayBmb3IgdXNlIG9mIHRoZSBzeXN0ZW0gbGliZmZpIGxpYnJhcnkKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLXN5c3RlbS1mZmkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRoLXN5c3RlbS1mZmkuLi4gJEVDSE9fQyIgPiY2CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3lzdGVtX2ZmaSBvciAtLXdpdGhvdXQtc3lzdGVtX2ZmaSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc3lzdGVtX2ZmaStzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9zeXN0ZW1fZmZpIgorCitmaTsKKworaWYgdGVzdCAteiAiJHdpdGhfc3lzdGVtX2ZmaSIKK3RoZW4gd2l0aF9zeXN0ZW1fZmZpPSJubyIKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aF9zeXN0ZW1fZmZpIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR3aXRoX3N5c3RlbV9mZmkiID4mNgorCiAjIERldGVybWluZSBpZiBzaWduYWxtb2R1bGUgc2hvdWxkIGJlIHVzZWQuCiAKIApAQCAtMTE5NzksOCArMTE4MDQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMjEzNCw4ICsxMTk1OCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEyMzE1LDggKzEyMTM4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTI0MDgsOCArMTIyMzAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMjQ3Miw4ICsxMjI5Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEyNjIyLDggKzEyNDQyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTI3ODAsOCArMTI1OTksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMjg1NCw4ICsxMjY3Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEyOTI4LDggKzEyNzQ1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTMwMDIsOCArMTI4MTgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMzEwNSw4ICsxMjkyMCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEzMTgxLDggKzEyOTk1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTMzODQsOCArMTMxOTcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMzUzMyw4ICsxMzM0NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEzOTI0LDggKzEzNzM1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTM5NzQsNyArMTM3ODQsOCBAQAogCTs7CiAJQmVPUyopIERZTkxPQURGSUxFPSJkeW5sb2FkX2Jlb3MubyI7OwogCWhwKnxIUCopIERZTkxPQURGSUxFPSJkeW5sb2FkX2hwdXgubyI7OwotCURhcndpbi8qKSBEWU5MT0FERklMRT0iZHlubG9hZF9uZXh0Lm8iOzsKKwkjIFVzZSBkeW5sb2FkX25leHQuYyBvbmx5IG9uIDEwLjIgYW5kIGJlbG93LCB3aGljaCBkb24ndCBoYXZlIG5hdGl2ZSBkbG9wZW4oKQorCURhcndpbi9bMDE1Nl1cLi4qKSBEWU5MT0FERklMRT0iZHlubG9hZF9uZXh0Lm8iOzsKIAlhdGhlb3MqKSBEWU5MT0FERklMRT0iZHlubG9hZF9hdGhlb3MubyI7OwogCSopCiAJIyB1c2UgZHlubG9hZF9zaGxpYi5jIGFuZCBkbG9wZW4oKSBpZiB3ZSBoYXZlIGl0OyBvdGhlcndpc2Ugc3R1YgpAQCAtMTQwODYsNiArMTM4OTcsOCBAQAogCiAKIAorCisKIGZvciBhY19mdW5jIGluIGFsYXJtIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IGNob3duIGNsb2NrIGNvbmZzdHIgY3Rlcm1pZCBcCiAgZXhlY3YgZm9yayBmcGF0aGNvbmYgZnRpbWUgZnRydW5jYXRlIFwKICBnYWlfc3RyZXJyb3IgZ2V0Z3JvdXBzIGdldGxvZ2luIGdldGxvYWRhdmcgZ2V0cGVlcm5hbWUgZ2V0cGdpZCBnZXRwaWQgXApAQCAtMTQwOTcsNyArMTM5MTAsNyBAQAogIHNldGxvY2FsZSBzZXRyZWdpZCBzZXRyZXVpZCBzZXRzaWQgc2V0cGdpZCBzZXRwZ3JwIHNldHVpZCBzZXR2YnVmIHNucHJpbnRmIFwKICBzaWdhY3Rpb24gc2lnaW50ZXJydXB0IHNpZ3JlbHNlIHN0cmZ0aW1lIFwKICBzeXNjb25mIHRjZ2V0cGdycCB0Y3NldHBncnAgdGVtcG5hbSB0aW1lZ20gdGltZXMgdG1wZmlsZSB0bXBuYW0gdG1wbmFtX3IgXAotIHRydW5jYXRlIHVuYW1lIHVuc2V0ZW52IHV0aW1lcyB3YWl0cGlkIHdjc2NvbGwgX2dldHB0eQorIHRydW5jYXRlIHVuYW1lIHVuc2V0ZW52IHV0aW1lcyB3YWl0cGlkIHdhaXQzIHdhaXQ0IHdjc2NvbGwgX2dldHB0eQogZG8KIGFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCiBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKQEAgLTE0MTY1LDggKzEzOTc4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTQyMjcsOCArMTQwMzksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNDI4Miw4ICsxNDA5Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE0MzM3LDggKzE0MTQ3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTQzOTIsOCArMTQyMDEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNDQ0Nyw4ICsxNDI1NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE0NTAyLDggKzE0MzA5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTQ1NjcsOCArMTQzNzMsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNDYyNiw4ICsxNDQzMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE0Njg1LDggKzE0NDg5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTQ3OTUsOCArMTQ1OTgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNDg2Myw4ICsxNDY2NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE0OTMxLDggKzE0NzMyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTQ5OTQsOCArMTQ3OTQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNTA1Nyw4ICsxNDg1Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE1MTIwLDggKzE0OTE4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTUyMjEsOCArMTUwMTgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNTI5MCw4ICsxNTA4Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE1MzYwLDggKzE1MTU1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTU0NjksOCArMTUyNjMsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNTUzOCw4ICsxNTMzMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE1NjA4LDggKzE1NDAwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTU3MjQsOCArMTU1MTUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNTgzMSw4ICsxNTYyMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE1OTQzLDggKzE1NzMyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTU5OTYsOCArMTU3ODQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNjA5NCw4ICsxNTg4MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE2MTQ3LDggKzE1OTMzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTYyNDUsOCArMTYwMzAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNjI5OCw4ICsxNjA4Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE2MzY1LDggKzE2MTQ4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTY0MzQsOCArMTYyMTYsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNjY3Miw4ICsxNjQ1Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE2NzQwLDggKzE2NTIwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTY4MDMsOCArMTY1ODIsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNjg2OSw4ICsxNjY0Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE2OTE2LDggKzE2NjkzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTY5OTEsOCArMTY3NjcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzA1Niw4ICsxNjgzMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3MTAwLDggKzE2ODc0LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTcxNjYsOCArMTY5MzksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzIxMCw4ICsxNjk4Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3Mjc2LDggKzE3MDQ3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTczMjAsOCArMTcwOTAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzM4Niw4ICsxNzE1NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3NDMwLDggKzE3MTk4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTc0OTYsOCArMTcyNjMsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzU0MCw4ICsxNzMwNiw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3NjA2LDggKzE3MzcxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTc2NTAsOCArMTc0MTQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzcyOSw4ICsxNzQ5Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3NzkzLDggKzE3NTU1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTc4NTMsOCArMTc2MTQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzkxNyw4ICsxNzY3Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3OTg0LDggKzE3NzQzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTgwOTAsOCArMTc4NDgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xODE1MCw4ICsxNzkwNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE4MjA2LDggKzE3OTYyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTgyNjIsOCArMTgwMTcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xODMyOSw4ICsxODA4Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE4Mzg5LDggKzE4MTQyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTg0NDgsOCArMTgyMDAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xODUxMCw4ICsxODI2MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE4NjEwLDggKzE4MzYwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTg2NzksOCArMTg0MjgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xODc0OCw4ICsxODQ5Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE4ODE1LDggKzE4NTYyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTg5MzAsOCArMTg2NzYsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xOTA0MSw4ICsxODc4Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE5MTA4LDggKzE4ODUyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTkzMDEsOCArMTkwNDQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xOTM3Nyw4ICsxOTExOSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE5NTM2LDggKzE5Mjc3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTk2MDAsOCArMTkzNDAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xOTY0Miw4ICsxOTM4MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE5NzAwLDggKzE5NDM4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTk3NDIsOCArMTk0NzksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xOTgwOCw4ICsxOTU0NCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE5ODQwLDEwICsxOTU3NSw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xOTk1Nyw4ICsxOTY5MCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIwMDEwLDcgKzE5NzQyLDggQEAKICAgI2luY2x1ZGUgPHdjaGFyLmg+CiAgIGludCBtYWluKCkKICAgewotICAgICAgICBleGl0KCgoKHdjaGFyX3QpIC0xKSA8ICgod2NoYXJfdCkgMCkpID8gMSA6IDApOworCS8qIFN1Y2Nlc3M6IGV4aXQgY29kZSAwICovCisgICAgICAgIGV4aXQoKCgod2NoYXJfdCkgLTEpIDwgKCh3Y2hhcl90KSAwKSkgPyAwIDogMSk7CiAgIH0KIAogX0FDRU9GCkBAIC0yMDE2OCw4ICsxOTkwMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIwMjExLDggKzE5OTQzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjAyNjksOCArMjAwMDAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMDQ1OSw4ICsyMDE4OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIwNTM2LDggKzIwMjY1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjA2MTIsOCArMjAzNDAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMDY4OCw4ICsyMDQxNSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIwODIwLDggKzIwNTQ2LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjA4OTQsOCArMjA2MTksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMTE1Nyw4ICsyMDg4MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIxMjA0LDggKzIwOTI3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjEyNzksOCArMjEwMDEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMTQ2Myw4ICsyMTE4NCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIxNTMwLDggKzIxMjUwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjE1OTcsOCArMjEzMTYsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMTY2NCw4ICsyMTM4Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIxNzc0LDggKzIxNDkxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjI0NTUsMTUgKzIyMTcxLDE1IEBACiBzLEBFWFRSQVBMQVRESVJALCRFWFRSQVBMQVRESVIsO3QgdAogcyxARVhUUkFNQUNIREVQUEFUSEAsJEVYVFJBTUFDSERFUFBBVEgsO3QgdAogcyxAQ09ORklHVVJFX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVEAsJENPTkZJR1VSRV9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQsO3QgdAotcyxAQ1hYQCwkQ1hYLDt0IHQKLXMsQE1BSU5PQkpALCRNQUlOT0JKLDt0IHQKLXMsQEVYRUVYVEAsJEVYRUVYVCw7dCB0CiBzLEBDQ0AsJENDLDt0IHQKIHMsQENGTEFHU0AsJENGTEFHUyw7dCB0CiBzLEBMREZMQUdTQCwkTERGTEFHUyw7dCB0CiBzLEBDUFBGTEFHU0AsJENQUEZMQUdTLDt0IHQKIHMsQGFjX2N0X0NDQCwkYWNfY3RfQ0MsO3QgdAorcyxARVhFRVhUQCwkRVhFRVhULDt0IHQKIHMsQE9CSkVYVEAsJE9CSkVYVCw7dCB0CitzLEBDWFhALCRDWFgsO3QgdAorcyxATUFJTkNDQCwkTUFJTkNDLDt0IHQKIHMsQENQUEAsJENQUCw7dCB0CiBzLEBFR1JFUEAsJEVHUkVQLDt0IHQKIHMsQEJVSUxERVhFRVhUQCwkQlVJTERFWEVFWFQsO3QgdApAQCAtMjI2ODEsMTEgKzIyMzk3LDYgQEAKICAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkZGlyJElOU1RBTEwgOzsKICAgZXNhYwogCi0gIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQotICAgIHJtIC1mICIkYWNfZmlsZSIKLSAgZmkKICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgogICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwpAQCAtMjI3MjQsNiArMjI0MzUsMTIgQEAKIAkgZmk7OwogICAgICAgZXNhYwogICAgIGRvbmVgIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgZmkKIF9BQ0VPRgogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKICAgc2VkICIkYWNfdnBzdWIKQEAgLTIzMDA3LDEzICsyMjcyNCwxMyBAQAogZmkKIAogCi1lY2hvICJjcmVhdGluZyBTZXR1cCIKK2VjaG8gImNyZWF0aW5nIE1vZHVsZXMvU2V0dXAiCiBpZiB0ZXN0ICEgLWYgTW9kdWxlcy9TZXR1cAogdGhlbgogCWNwICRzcmNkaXIvTW9kdWxlcy9TZXR1cC5kaXN0IE1vZHVsZXMvU2V0dXAKIGZpCiAKLWVjaG8gImNyZWF0aW5nIFNldHVwLmxvY2FsIgorZWNobyAiY3JlYXRpbmcgTW9kdWxlcy9TZXR1cC5sb2NhbCIKIGlmIHRlc3QgISAtZiBNb2R1bGVzL1NldHVwLmxvY2FsCiB0aGVuCiAJZWNobyAiIyBFZGl0IHRoaXMgZmlsZSBmb3IgbG9jYWwgc2V0dXAgY2hhbmdlcyIgPk1vZHVsZXMvU2V0dXAubG9jYWwKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCBmMzUyNWIxLi43YTNhMzdmIDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC0xNzMsNyArMTczLDkgQEAKICAgICA7OwogICAjIE9uIE1hYyBPUyBYIDEwLjQsIGRlZmluaW5nIF9QT1NJWF9DX1NPVVJDRSBvciBfWE9QRU5fU09VUkNFCiAgICMgZGlzYWJsZXMgcGxhdGZvcm0gc3BlY2lmaWMgZmVhdHVyZXMgYmV5b25kIHJlcGFpci4KLSAgRGFyd2luLzguKikKKyAgIyBPbiBNYWMgT1MgWCAxMC4zLCBkZWZpbmluZyBfUE9TSVhfQ19TT1VSQ0Ugb3IgX1hPUEVOX1NPVVJDRSAKKyAgIyBoYXMgbm8gZWZmZWN0LCBkb24ndCBib3RoZXIgZGVmaW5laW5nIHRoZW0KKyAgRGFyd2luL0A8OkA3OEA6PkAuKikKICAgICBkZWZpbmVfeG9wZW5fc291cmNlPW5vCiAgICAgOzsKIApAQCAtMzExLDU2ICszMTMsNiBAQAogCWVzYWNdKQogQUNfTVNHX1JFU1VMVCgkd2l0aG91dF9nY2MpCiAKLUFDX1NVQlNUKENYWCkKLUFDX1NVQlNUKE1BSU5PQkopCi1NQUlOT0JKPXB5dGhvbi5vCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIC0td2l0aC1jeHg9PGNvbXBpbGVyPikKLUFDX0FSR19XSVRIKGN4eCwKLSAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKC0td2l0aC1jeHg9PGNvbXBpbGVyPiwgZW5hYmxlIEMrKyBzdXBwb3J0KSwKLVsKLQljaGVja19jeHg9bm8KLQljYXNlICR3aXRodmFsIGluCi0Jbm8pCUNYWD0KLQkJd2l0aF9jeHg9bm87OwotCSopCUNYWD0kd2l0aHZhbAotCQlNQUlOT0JKPWNjcHl0aG9uLm8KLQkJd2l0aF9jeHg9JHdpdGh2YWw7OwotCWVzYWNdLCBbCi0Jd2l0aF9jeHg9bm8KLQljaGVja19jeHg9eWVzCi1dKQotQUNfTVNHX1JFU1VMVCgkd2l0aF9jeHgpCi0KLWlmIHRlc3QgIiR3aXRoX2N4eCIgPSAieWVzIgotdGhlbgotCUFDX01TR19FUlJPUihbbXVzdCBzdXBwbHkgYSBjb21waWxlciB3aGVuIHVzaW5nIC0td2l0aC1jeHhdKQotZmkKLQotZG5sIFRoZSBmb2xsb3dpbmcgZnJhZ21lbnQgd29ya3Mgc2ltaWxhciB0byBBQ19QUk9HX0NYWC4KLWRubCBJdCBkb2VzIG5vdCBmYWlsIGlmIENYWCBpcyBub3QgZm91bmQsIGFuZCBpdCBpcyBub3QgZXhlY3V0ZWQgaWYgCi1kbmwgLS13aXRob3V0LWN4eCB3YXMgZ2l2ZW4uCi1kbmwgRmluYWxseSwgaXQgZG9lcyBub3QgdGVzdCB3aGV0aGVyIENYWCBpcyBnKysuCi0KLWRubCBBdXRvY29uZiAyLjV4IGRvZXMgbm90IGhhdmUgQUNfUFJPR19DWFhfV09SS1MgYW55bW9yZQotaWZkZWYoW0FDX1BST0dfQ1hYX1dPUktTXSxbXSwKLSAgICAgIFtBQ19ERUZVTihbQUNfUFJPR19DWFhfV09SS1NdLAotICAgICAgW0FDX0xBTkdfUFVTSChDKyspZG5sCi0gICAgICAgX0FDX0NPTVBJTEVSX0VYRUVYVAotICAgICAgIEFDX0xBTkdfUE9QKCkKLSAgICAgIF0KLSldKQotCi1pZiB0ZXN0ICIkY2hlY2tfY3h4IiA9ICJ5ZXMiIAotdGhlbgotCUFDX0NIRUNLX1BST0dTKENYWCwgJENDQyBjKysgZysrIGdjYyBDQyBjeHggY2MrKyBjbCwgbm90Zm91bmQpCi0JaWYgdGVzdCAiJENYWCIgPSAibm90Zm91bmQiCi0JdGhlbgotCQlDWFg9Ci0JZWxzZQotCQlBQ19QUk9HX0NYWF9XT1JLUwotCWZpCi1maQotCiAjIElmIHRoZSB1c2VyIHN3aXRjaGVzIGNvbXBpbGVycywgd2UgY2FuJ3QgYmVsaWV2ZSB0aGUgY2FjaGUKIGlmIHRlc3QgISAteiAiJGFjX2N2X3Byb2dfQ0MiIC1hICEgLXogIiRDQyIgLWEgIiRDQyIgIT0gIiRhY19jdl9wcm9nX0NDIgogdGhlbgpAQCAtMzcwLDYgKzMyMiw2MSBAQAogCiBBQ19QUk9HX0NDCiAKK0FDX1NVQlNUKENYWCkKK0FDX1NVQlNUKE1BSU5DQykKK0FDX01TR19DSEVDS0lORyhmb3IgLS13aXRoLWN4eC1tYWluPTxjb21waWxlcj4pCitBQ19BUkdfV0lUSChjeHhfbWFpbiwKKyAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtY3h4LW1haW49PGNvbXBpbGVyPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcGlsZSBtYWluKCkgYW5kIGxpbmsgcHl0aG9uIGV4ZWN1dGFibGUgd2l0aCBDKysgY29tcGlsZXJdKSwKK1sKKwkKKwljYXNlICR3aXRodmFsIGluCisJbm8pCXdpdGhfY3h4X21haW49bm8KKwkJTUFJTkNDPSckKENDKSc7OworCXllcykJd2l0aF9jeHhfbWFpbj15ZXMKKwkJTUFJTkNDPSckKENYWCknOzsKKwkqKQl3aXRoX2N4eF9tYWluPXllcworCQlNQUlOQ0M9JHdpdGh2YWwKKwkJaWYgdGVzdCAteiAiJENYWCIKKwkJdGhlbgorCQkJQ1hYPSR3aXRodmFsCisJCWZpOzsKKwllc2FjXSwgWworCXdpdGhfY3h4X21haW49bm8KKwlNQUlOQ0M9JyQoQ0MpJworXSkKK0FDX01TR19SRVNVTFQoJHdpdGhfY3h4X21haW4pCisKK3ByZXNldF9jeHg9IiRDWFgiCitpZiB0ZXN0IC16ICIkQ1hYIgordGhlbgorICAgICAgICBjYXNlICIkQ0MiIGluCisgICAgICAgIGdjYykgICAgQUNfUEFUSF9QUk9HKENYWCwgW2crK10sIFtnKytdLCBbbm90Zm91bmRdKSA7OworICAgICAgICBjYykgICAgIEFDX1BBVEhfUFJPRyhDWFgsIFtjKytdLCBbYysrXSwgW25vdGZvdW5kXSkgOzsKKyAgICAgICAgZXNhYworCWlmIHRlc3QgIiRDWFgiID0gIm5vdGZvdW5kIgorCXRoZW4KKwkJQ1hYPSIiCisJZmkKK2ZpCitpZiB0ZXN0IC16ICIkQ1hYIgordGhlbgorCUFDX0NIRUNLX1BST0dTKENYWCwgJENDQyBjKysgZysrIGdjYyBDQyBjeHggY2MrKyBjbCwgbm90Zm91bmQpCisJaWYgdGVzdCAiJENYWCIgPSAibm90Zm91bmQiCisJdGhlbgorCQlDWFg9IiIKKwlmaQorZmkKK2lmIHRlc3QgIiRwcmVzZXRfY3h4IiAhPSAiJENYWCIKK3RoZW4KKyAgICAgICAgQUNfTVNHX1dBUk4oWworCisgIEJ5IGRlZmF1bHQsIGRpc3R1dGlscyB3aWxsIGJ1aWxkIEMrKyBleHRlbnNpb24gbW9kdWxlcyB3aXRoICIkQ1hYIi4KKyAgSWYgdGhpcyBpcyBub3QgaW50ZW5kZWQsIHRoZW4gc2V0IENYWCBvbiB0aGUgY29uZmlndXJlIGNvbW1hbmQgbGluZS4KKyAgXSkKK2ZpCisKKwogIyBjaGVja3MgZm9yIFVOSVggdmFyaWFudHMgdGhhdCBzZXQgQyBwcmVwcm9jZXNzb3IgdmFyaWFibGVzCiBBQ19BSVgKIApAQCAtNDc4LDIyICs0ODUsNyBAQAogQUNfTVNHX0NIRUNLSU5HKExJTktDQykKIGlmIHRlc3QgLXogIiRMSU5LQ0MiCiB0aGVuCi0gICAgICAgIGlmIHRlc3QgLXogIiRDWFgiOyB0aGVuCi0gICAgICAgICAgICAgIExJTktDQz0iXCQoUFVSSUZZKSBcJChDQykiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZWNobyAnZXh0ZXJuICJDIiB2b2lkIGZvbygpO2ludCBtYWluKCl7Zm9vKCk7fScgPiBjb25mdGVzdF9hLmNjCi0gICAgICAgICAgICAgICRDWFggLWMgY29uZnRlc3RfYS5jYyAjIDI+JjUKLSAgICAgICAgICAgICAgZWNobyAndm9pZCBmb28oKXt9JyA+IGNvbmZ0ZXN0X2IuJGFjX2V4dAotICAgICAgICAgICAgICAkQ0MgLWMgY29uZnRlc3RfYi4kYWNfZXh0ICMgMj4mNQotICAgICAgICAgICAgICBpZiAkQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0X2EuJGFjX29iamV4dCBjb25mdGVzdF9iLiRhY19vYmpleHQgMj4mNSBcCi0gICAgICAgICAgICAgICAgICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIC4vY29uZnRlc3QkYWNfZXhlZXh0Ci0gICAgICAgICAgICAgIHRoZW4KLSAgICAgICAgICAgICAgICAgTElOS0NDPSJcJChQVVJJRlkpIFwkKENDKSIKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICBMSU5LQ0M9IlwkKFBVUklGWSkgXCQoQ1hYKSIKLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgcm0gLWZyIGNvbmZ0ZXN0KgotICAgICAgICBmaQorCUxJTktDQz0nJChQVVJJRlkpICQoTUFJTkNDKScKIAljYXNlICRhY19zeXNfc3lzdGVtIGluCiAJQUlYKikKIAkgICBleHBfZXh0cmE9IlwiXCIiCkBAIC02MTksNyArNjExLDcgQEAKIEFDX0NIRUNLX1BST0dTKEFSLCBhciBhYWwsIGFyKQogCiBBQ19TVUJTVChTVk5WRVJTSU9OKQotQUNfQ0hFQ0tfUFJPRyhTVk5WRVJTSU9OLCBzdm52ZXJzaW9uLCBmb3VuZCkKK0FDX0NIRUNLX1BST0coU1ZOVkVSU0lPTiwgc3ZudmVyc2lvbiwgZm91bmQsIG5vdC1mb3VuZCkKIGlmIHRlc3QgJFNWTlZFUlNJT04gPSBmb3VuZAogdGhlbgogCVNWTlZFUlNJT049InN2bnZlcnNpb24gXCQoc3JjZGlyKSIKQEAgLTY4MywxOCArNjc1LDIxIEBACiB0aGVuCiAgICAgY2FzZSAkR0NDIGluCiAgICAgeWVzKQorICAgICAgICBpZiB0ZXN0ICIkQ0MiICE9ICdnKysnIDsgdGhlbgorCSAgICBTVFJJQ1RfUFJPVE89Ii1Xc3RyaWN0LXByb3RvdHlwZXMiCisJZmkKIAljYXNlICRhY19jdl9wcm9nX2NjX2cgaW4KIAl5ZXMpCiAJICAgIGlmIHRlc3QgIiRQeV9ERUJVRyIgPSAndHJ1ZScgOyB0aGVuCiAJCSMgT3B0aW1pemF0aW9uIG1lc3NlcyB1cCBkZWJ1Z2dlcnMsIHNvIHR1cm4gaXQgb2ZmIGZvcgogCQkjIGRlYnVnIGJ1aWxkcy4KLQkJT1BUPSItZyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIgorCQlPUFQ9Ii1nIC1XYWxsICRTVFJJQ1RfUFJPVE8iCiAJICAgIGVsc2UKLQkJT1BUPSItZyAtTzMgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyIKKwkJT1BUPSItZyAtTzMgLVdhbGwgJFNUUklDVF9QUk9UTyIKIAkgICAgZmkKIAkgICAgOzsKIAkqKQotCSAgICBPUFQ9Ii1PMyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIgorCSAgICBPUFQ9Ii1PMyAtV2FsbCAkU1RSSUNUX1BST1RPIgogCSAgICA7OwogCWVzYWMKIAljYXNlICRhY19zeXNfc3lzdGVtIGluCkBAIC03NDYsNiArNzQxLDkgQEAKIAlEYXJ3aW4qKQogCSAgICBCQVNFQ0ZMQUdTPSIkQkFTRUNGTEFHUyAtV25vLWxvbmctZG91YmxlIC1uby1jcHAtcHJlY29tcCAtbW5vLWZ1c2VkLW1hZGQiCiAJICAgIDs7CisJT1NGKikKKwkgICAgQkFTRUNGTEFHUz0iJEJBU0VDRkxBR1MgLW1pZWVlIgorCSAgICA7OwogICAgIGVzYWMKICAgICA7OwogCkBAIC0xMjU0LDcgKzEyNTIsNyBAQAogCiBBQ19TVUJTVChPVEhFUl9MSUJUT09MX09QVCkKIGNhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCi0gIERhcndpbi9APDpAMDEyMzQ1NjdAOj5ALiopIAorICBEYXJ3aW4vQDw6QDAxNTY3QDo+QFwuLiopIAogICAgIE9USEVSX0xJQlRPT0xfT1BUPSItcHJlYmluZCAtc2VnMWFkZHIgMHgxMDAwMDAwMCIKICAgICA7OwogICBEYXJ3aW4vKikKQEAgLTEyNjQsNyArMTI2Miw3IEBACiAKIEFDX1NVQlNUKExJQlRPT0xfQ1JVRlQpCiBjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgotICBEYXJ3aW4vQDw6QDAxMjM0NTY3QDo+QC4qKSAKKyAgRGFyd2luL0A8OkAwMTU2N0A6PkBcLi4qKSAKICAgICBMSUJUT09MX0NSVUZUPSItZnJhbWV3b3JrIFN5c3RlbSAtbGNjX2R5bmFtaWMgLWFyY2hfb25seSBgYXJjaGAiCiAgICAgTElCVE9PTF9DUlVGVD0kTElCVE9PTF9DUlVGVCcgLWluc3RhbGxfbmFtZSAkKFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIpL1ZlcnNpb25zLyQoVkVSU0lPTikvJChQWVRIT05GUkFNRVdPUkspJwogICAgIExJQlRPT0xfQ1JVRlQ9JExJQlRPT0xfQ1JVRlQnIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJChWRVJTSU9OKSAtY3VycmVudF92ZXJzaW9uICQoVkVSU0lPTiknOzsKQEAgLTE1OTksNiArMTU5NywxNiBAQAogXSwKIFtBQ19NU0dfUkVTVUxUKG5vKV0pCiAKKyMgQ2hlY2sgZm9yIHVzZSBvZiB0aGUgc3lzdGVtIGxpYmZmaSBsaWJyYXJ5CitBQ19NU0dfQ0hFQ0tJTkcoZm9yIC0td2l0aC1zeXN0ZW0tZmZpKQorQUNfQVJHX1dJVEgoc3lzdGVtX2ZmaSwKKyAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKC0td2l0aC1zeXN0ZW0tZmZpLCBidWlsZCBfY3R5cGVzIG1vZHVsZSB1c2luZyBhbiBpbnN0YWxsZWQgZmZpIGxpYnJhcnkpKQorCitpZiB0ZXN0IC16ICIkd2l0aF9zeXN0ZW1fZmZpIgordGhlbiB3aXRoX3N5c3RlbV9mZmk9Im5vIgorZmkKK0FDX01TR19SRVNVTFQoJHdpdGhfc3lzdGVtX2ZmaSkKKwogIyBEZXRlcm1pbmUgaWYgc2lnbmFsbW9kdWxlIHNob3VsZCBiZSB1c2VkLgogQUNfU1VCU1QoVVNFX1NJR05BTF9NT0RVTEUpCiBBQ19TVUJTVChTSUdOQUxfT0JKUykKQEAgLTIxMDUsNyArMjExMyw4IEBACiAJOzsKIAlCZU9TKikgRFlOTE9BREZJTEU9ImR5bmxvYWRfYmVvcy5vIjs7CiAJaHAqfEhQKikgRFlOTE9BREZJTEU9ImR5bmxvYWRfaHB1eC5vIjs7Ci0JRGFyd2luLyopIERZTkxPQURGSUxFPSJkeW5sb2FkX25leHQubyI7OworCSMgVXNlIGR5bmxvYWRfbmV4dC5jIG9ubHkgb24gMTAuMiBhbmQgYmVsb3csIHdoaWNoIGRvbid0IGhhdmUgbmF0aXZlIGRsb3BlbigpCisJRGFyd2luL0A8OkAwMTU2QDo+QFwuLiopIERZTkxPQURGSUxFPSJkeW5sb2FkX25leHQubyI7OwogCWF0aGVvcyopIERZTkxPQURGSUxFPSJkeW5sb2FkX2F0aGVvcy5vIjs7CiAJKikKIAkjIHVzZSBkeW5sb2FkX3NobGliLmMgYW5kIGRsb3BlbigpIGlmIHdlIGhhdmUgaXQ7IG90aGVyd2lzZSBzdHViCkBAIC0yMTQ4LDcgKzIxNTcsNyBAQAogIHNldGxvY2FsZSBzZXRyZWdpZCBzZXRyZXVpZCBzZXRzaWQgc2V0cGdpZCBzZXRwZ3JwIHNldHVpZCBzZXR2YnVmIHNucHJpbnRmIFwKICBzaWdhY3Rpb24gc2lnaW50ZXJydXB0IHNpZ3JlbHNlIHN0cmZ0aW1lIFwKICBzeXNjb25mIHRjZ2V0cGdycCB0Y3NldHBncnAgdGVtcG5hbSB0aW1lZ20gdGltZXMgdG1wZmlsZSB0bXBuYW0gdG1wbmFtX3IgXAotIHRydW5jYXRlIHVuYW1lIHVuc2V0ZW52IHV0aW1lcyB3YWl0cGlkIHdjc2NvbGwgX2dldHB0eSkKKyB0cnVuY2F0ZSB1bmFtZSB1bnNldGVudiB1dGltZXMgd2FpdHBpZCB3YWl0MyB3YWl0NCB3Y3Njb2xsIF9nZXRwdHkpCiAKICMgRm9yIHNvbWUgZnVuY3Rpb25zLCBoYXZpbmcgYSBkZWZpbml0aW9uIGlzIG5vdCBzdWZmaWNpZW50LCBzaW5jZQogIyB3ZSB3YW50IHRvIHRha2UgdGhlaXIgYWRkcmVzcy4KQEAgLTI3ODYsNyArMjc5NSw4IEBACiAgICNpbmNsdWRlIDx3Y2hhci5oPgogICBpbnQgbWFpbigpCiAgIHsKLSAgICAgICAgZXhpdCgoKCh3Y2hhcl90KSAtMSkgPCAoKHdjaGFyX3QpIDApKSA/IDEgOiAwKTsKKwkvKiBTdWNjZXNzOiBleGl0IGNvZGUgMCAqLworICAgICAgICBleGl0KCgoKHdjaGFyX3QpIC0xKSA8ICgod2NoYXJfdCkgMCkpID8gMCA6IDEpOwogICB9CiAgIF0sCiAgIGFjX2N2X3djaGFyX3Rfc2lnbmVkPXllcywKQEAgLTMyMTEsMTMgKzMyMjEsMTMgQEAKIEFDX0NPTkZJR19GSUxFUyhNYWtlZmlsZS5wcmUgTW9kdWxlcy9TZXR1cC5jb25maWcpCiBBQ19PVVRQVVQKIAotZWNobyAiY3JlYXRpbmcgU2V0dXAiCitlY2hvICJjcmVhdGluZyBNb2R1bGVzL1NldHVwIgogaWYgdGVzdCAhIC1mIE1vZHVsZXMvU2V0dXAKIHRoZW4KIAljcCAkc3JjZGlyL01vZHVsZXMvU2V0dXAuZGlzdCBNb2R1bGVzL1NldHVwCiBmaQogCi1lY2hvICJjcmVhdGluZyBTZXR1cC5sb2NhbCIKK2VjaG8gImNyZWF0aW5nIE1vZHVsZXMvU2V0dXAubG9jYWwiCiBpZiB0ZXN0ICEgLWYgTW9kdWxlcy9TZXR1cC5sb2NhbAogdGhlbgogCWVjaG8gIiMgRWRpdCB0aGlzIGZpbGUgZm9yIGxvY2FsIHNldHVwIGNoYW5nZXMiID5Nb2R1bGVzL1NldHVwLmxvY2FsCmRpZmYgLS1naXQgYS9weWNvbmZpZy5oLmluIGIvcHljb25maWcuaC5pbgppbmRleCA5YzNjYTUzLi44ZGY3ZjliIDEwMDY0NAotLS0gYS9weWNvbmZpZy5oLmluCisrKyBiL3B5Y29uZmlnLmguaW4KQEAgLTY3MCw2ICs2NzAsMTIgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dXRpbWUuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9VVElNRV9ICiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd2FpdDMnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfV0FJVDMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3YWl0NCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9XQUlUNAorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHdhaXRwaWQnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfV0FJVFBJRAogCmRpZmYgLS1naXQgYS9zZXR1cC5weSBiL3NldHVwLnB5CmluZGV4IDA5Yjc5ZmQuLjYxYzFmZWMgMTAwNjQ0Ci0tLSBhL3NldHVwLnB5CisrKyBiL3NldHVwLnB5CkBAIC0xODAsNiArMTgwLDEwIEBACiAKICAgICBkZWYgYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCk6CiAKKyAgICAgICAgaWYgZXh0Lm5hbWUgPT0gJ19jdHlwZXMnOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29uZmlndXJlX2N0eXBlcyhleHQpOgorICAgICAgICAgICAgICAgIHJldHVybgorCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGJ1aWxkX2V4dC5idWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KQogICAgICAgICBleGNlcHQgKENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFcnJvciksIHdoeToKQEAgLTMyNiw4ICszMzAsNiBAQAogICAgICAgICAjCiAKICAgICAgICAgIyBTb21lIG1vZHVsZXMgdGhhdCBhcmUgbm9ybWFsbHkgYWx3YXlzIG9uOgotICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdyZWdleCcsIFsncmVnZXhtb2R1bGUuYycsICdyZWdleHByLmMnXSkgKQotCiAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ193ZWFrcmVmJywgWydfd2Vha3JlZi5jJ10pICkKIAogICAgICAgICAjIGFycmF5IG9iamVjdHMKQEAgLTU1MSw4ICs1NTMsOCBAQAogICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX3NoYScsIFsnc2hhbW9kdWxlLmMnXSkgKQogICAgICAgICAgICAgIyBUaGUgX21kNSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1CiAgICAgICAgICAgICAjIE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSwgZGVzY3JpYmVkIGluIFJGQyAxMzIxLiAgVGhlCi0gICAgICAgICAgICAjIG5lY2Vzc2FyeSBmaWxlcyBtZDVjLmMgYW5kIG1kNS5oIGFyZSBpbmNsdWRlZCBoZXJlLgotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX21kNScsIFsnbWQ1bW9kdWxlLmMnLCAnbWQ1Yy5jJ10pICkKKyAgICAgICAgICAgICMgbmVjZXNzYXJ5IGZpbGVzIG1kNS5jIGFuZCBtZDUuaCBhcmUgaW5jbHVkZWQgaGVyZS4KKyAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19tZDUnLCBbJ21kNW1vZHVsZS5jJywgJ21kNS5jJ10pICkKIAogICAgICAgICBpZiAob3BlbnNzbF92ZXIgPCAweDAwOTA4MDAwKToKICAgICAgICAgICAgICMgT3BlblNTTCBkb2Vzbid0IGRvIHRoZXNlIHVudGlsIDAuOS44IHNvIHdlJ2xsIGJyaW5nIG91ciBvd24gaGFzaApAQCAtNTY5LDE0ICs1NzEsMTMgQEAKIAogICAgICAgICAjIFNsZWVweWNhdCBCZXJrZWxleSBEQiBpbnRlcmZhY2UuICBodHRwOi8vd3d3LnNsZWVweWNhdC5jb20KICAgICAgICAgIwotICAgICAgICAjIFRoaXMgcmVxdWlyZXMgdGhlIFNsZWVweWNhdCBEQiBjb2RlLiBUaGUgZWFybGllc3Qgc3VwcG9ydGVkIHZlcnNpb24KLSAgICAgICAgIyBvZiB0aGF0IGxpYnJhcnkgaXMgMy4yLCB0aGUgbGF0ZXN0IHN1cHBvcnRlZCB2ZXJzaW9uIGlzIDQuNC4gIEEgbGlzdAotICAgICAgICAjIG9mIGF2YWlsYWJsZSByZWxlYXNlcyBjYW4gYmUgZm91bmQgYXQKLSAgICAgICAgIwotICAgICAgICAjIGh0dHA6Ly93d3cuc2xlZXB5Y2F0LmNvbS91cGRhdGUvaW5kZXguaHRtbAorICAgICAgICAjIFRoaXMgcmVxdWlyZXMgdGhlIFNsZWVweWNhdCBEQiBjb2RlLiBUaGUgc3VwcG9ydGVkIHZlcnNpb25zCisgICAgICAgICMgYXJlIHNldCBiZWxvdy4gIFZpc2l0IGh0dHA6Ly93d3cuc2xlZXB5Y2F0LmNvbS8gdG8gZG93bmxvYWQKKyAgICAgICAgIyBhIHJlbGVhc2UuICBNb3N0IG9wZW4gc291cmNlIE9TZXMgY29tZSB3aXRoIG9uZSBvciBtb3JlCisgICAgICAgICMgdmVyc2lvbnMgb2YgQmVya2VsZXlEQiBhbHJlYWR5IGluc3RhbGxlZC4KIAogICAgICAgICBtYXhfZGJfdmVyID0gKDQsIDQpCi0gICAgICAgIG1pbl9kYl92ZXIgPSAoMywgMikKKyAgICAgICAgbWluX2RiX3ZlciA9ICgzLCAzKQogICAgICAgICBkYl9zZXR1cF9kZWJ1ZyA9IEZhbHNlICAgIyB2ZXJib3NlIGRlYnVnIHByaW50cyBmcm9tIHRoaXMgc2NyaXB0PwogCiAgICAgICAgICMgY29uc3RydWN0IGEgbGlzdCBvZiBwYXRocyB0byBsb29rIGZvciB0aGUgaGVhZGVyIGZpbGUgaW4gb24KQEAgLTY5MSw2ICs2OTIsODggQEAKICAgICAgICAgICAgIGRibGlicyA9IFtdCiAgICAgICAgICAgICBkYmxpYl9kaXIgPSBOb25lCiAKKyAgICAgICAgIyBUaGUgc3FsaXRlIGludGVyZmFjZQorICAgICAgICBzcWxpdGVfc2V0dXBfZGVidWcgPSBUcnVlICAgIyB2ZXJib3NlIGRlYnVnIHByaW50cyBmcm9tIHRoaXMgc2NyaXB0PworCisgICAgICAgICMgV2UgaHVudCBmb3IgI2RlZmluZSBTUUxJVEVfVkVSU0lPTiAibi5uLm4iCisgICAgICAgICMgV2UgbmVlZCB0byBmaW5kID49IHNxbGl0ZSB2ZXJzaW9uIDMuMC44CisgICAgICAgIHNxbGl0ZV9pbmNkaXIgPSBzcWxpdGVfbGliZGlyID0gTm9uZQorICAgICAgICBzcWxpdGVfaW5jX3BhdGhzID0gWyAnL3Vzci9pbmNsdWRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy91c3IvaW5jbHVkZS9zcWxpdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9pbmNsdWRlL3NxbGl0ZTMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9sb2NhbC9pbmNsdWRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy91c3IvbG9jYWwvaW5jbHVkZS9zcWxpdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9sb2NhbC9pbmNsdWRlL3NxbGl0ZTMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBNSU5fU1FMSVRFX1ZFUlNJT05fTlVNQkVSID0gKDMsIDAsIDgpCisgICAgICAgIE1JTl9TUUxJVEVfVkVSU0lPTiA9ICIuIi5qb2luKFtzdHIoeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIE1JTl9TUUxJVEVfVkVSU0lPTl9OVU1CRVJdKQorICAgICAgICBmb3IgZCBpbiBzcWxpdGVfaW5jX3BhdGhzICsgaW5jX2RpcnM6CisgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGQsICJzcWxpdGUzLmgiKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZik6CisgICAgICAgICAgICAgICAgaWYgc3FsaXRlX3NldHVwX2RlYnVnOiBwcmludCAic3FsaXRlOiBmb3VuZCAlcyIlZgorICAgICAgICAgICAgICAgIGluY2YgPSBvcGVuKGYpLnJlYWQoKQorICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2goCisgICAgICAgICAgICAgICAgICAgIHInXHMqLiojXHMqLipkZWZpbmVccy4qU1FMSVRFX1ZFUlNJT05cVyoiKC4qKSInLCBpbmNmKQorICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgIHNxbGl0ZV92ZXJzaW9uID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgICAgICBzcWxpdGVfdmVyc2lvbl90dXBsZSA9IHR1cGxlKFtpbnQoeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiBzcWxpdGVfdmVyc2lvbi5zcGxpdCgiLiIpXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgc3FsaXRlX3ZlcnNpb25fdHVwbGUgPj0gTUlOX1NRTElURV9WRVJTSU9OX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2Ugd2luIQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzL3NxbGl0ZTMuaDogdmVyc2lvbiAlcyIlKGQsIHNxbGl0ZV92ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlX2luY2RpciA9IGQKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzcWxpdGVfc2V0dXBfZGVidWc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiB2ZXJzaW9uICVkIGlzIHRvbyBvbGQsIG5lZWQgPj0gJXMiJShkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZV92ZXJzaW9uLCBNSU5fU1FMSVRFX1ZFUlNJT04pCisgICAgICAgICAgICAgICAgZWxpZiBzcWxpdGVfc2V0dXBfZGVidWc6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJzcWxpdGU6ICVzIGhhZCBubyBTUUxJVEVfVkVSU0lPTiIlKGYsKQorCisgICAgICAgIGlmIHNxbGl0ZV9pbmNkaXI6CisgICAgICAgICAgICBzcWxpdGVfZGlyc190b19jaGVjayA9IFsKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3FsaXRlX2luY2RpciwgJy4uJywgJ2xpYjY0JyksCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNxbGl0ZV9pbmNkaXIsICcuLicsICdsaWInKSwKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3FsaXRlX2luY2RpciwgJy4uJywgJy4uJywgJ2xpYjY0JyksCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNxbGl0ZV9pbmNkaXIsICcuLicsICcuLicsICdsaWInKSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgIHNxbGl0ZV9saWJmaWxlID0gc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlX2RpcnNfdG9fY2hlY2sgKyBsaWJfZGlycywgJ3NxbGl0ZTMnKQorICAgICAgICAgICAgc3FsaXRlX2xpYmRpciA9IFtvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKHNxbGl0ZV9saWJmaWxlKSldCisKKyAgICAgICAgaWYgc3FsaXRlX2luY2RpciBhbmQgc3FsaXRlX2xpYmRpcjoKKyAgICAgICAgICAgIHNxbGl0ZV9zcmNzID0gWydfc3FsaXRlL2FkYXB0ZXJzLmMnLAorICAgICAgICAgICAgICAgICdfc3FsaXRlL2NhY2hlLmMnLAorICAgICAgICAgICAgICAgICdfc3FsaXRlL2Nvbm5lY3Rpb24uYycsCisgICAgICAgICAgICAgICAgJ19zcWxpdGUvY29udmVydGVycy5jJywKKyAgICAgICAgICAgICAgICAnX3NxbGl0ZS9jdXJzb3IuYycsCisgICAgICAgICAgICAgICAgJ19zcWxpdGUvbWljcm9wcm90b2NvbHMuYycsCisgICAgICAgICAgICAgICAgJ19zcWxpdGUvbW9kdWxlLmMnLAorICAgICAgICAgICAgICAgICdfc3FsaXRlL3ByZXBhcmVfcHJvdG9jb2wuYycsCisgICAgICAgICAgICAgICAgJ19zcWxpdGUvcm93LmMnLAorICAgICAgICAgICAgICAgICdfc3FsaXRlL3N0YXRlbWVudC5jJywKKyAgICAgICAgICAgICAgICAnX3NxbGl0ZS91dGlsLmMnLCBdCisKKyAgICAgICAgICAgIFBZU1FMSVRFX1ZFUlNJT04gPSAiMi4yLjAiCisgICAgICAgICAgICBzcWxpdGVfZGVmaW5lcyA9IFtdCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gIndpbjMyIjoKKyAgICAgICAgICAgICAgICBzcWxpdGVfZGVmaW5lcy5hcHBlbmQoKCdNT0RVTEVfTkFNRScsICcic3FsaXRlMyInKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3FsaXRlX2RlZmluZXMuYXBwZW5kKCgnTU9EVUxFX05BTUUnLCAnXFwic3FsaXRlM1xcIicpKQorCisgICAgICAgICAgICBzcWxpdGVfZGVmaW5lcy5hcHBlbmQoKCdQWV9NQUpPUl9WRVJTSU9OJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoc3lzLnZlcnNpb25faW5mb1swXSkpKQorICAgICAgICAgICAgc3FsaXRlX2RlZmluZXMuYXBwZW5kKCgnUFlfTUlOT1JfVkVSU0lPTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKHN5cy52ZXJzaW9uX2luZm9bMV0pKSkKKworICAgICAgICAgICAgZXh0cy5hcHBlbmQoRXh0ZW5zaW9uKCdfc3FsaXRlMycsIHNxbGl0ZV9zcmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZV9tYWNyb3M9c3FsaXRlX2RlZmluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPVsiTW9kdWxlcy9fc3FsaXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZV9pbmNkaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlfZGlycz1zcWxpdGVfbGliZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzPXNxbGl0ZV9saWJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPVsic3FsaXRlMyIsXSkpCiAKICAgICAgICAgIyBMb29rIGZvciBCZXJrZWxleSBkYiAxLjg1LiAgIE5vdGUgdGhhdCBpdCBpcyBidWlsdCBhcyBhIGRpZmZlcmVudAogICAgICAgICAjIG1vZHVsZSBuYW1lIHNvIGl0IGNhbiBiZSBpbmNsdWRlZCBldmVuIHdoZW4gbGF0ZXIgdmVyc2lvbnMgYXJlCkBAIC04NjUsNyArOTQ4LDcgQEAKICAgICAgICAgIyBGcmVkcmlrIEx1bmRoJ3MgY0VsZW1lbnRUcmVlIG1vZHVsZS4gIE5vdGUgdGhhdCB0aGlzIGFsc28KICAgICAgICAgIyB1c2VzIGV4cGF0ICh2aWEgdGhlIENBUEkgaG9vayBpbiBweWV4cGF0KS4KIAotICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSgnTW9kdWxlcy9fZWxlbWVudHRyZWUuYycpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oc3JjZGlyLCAnTW9kdWxlcycsICdfZWxlbWVudHRyZWUuYycpKToKICAgICAgICAgICAgIGRlZmluZV9tYWNyb3MuYXBwZW5kKCgnVVNFX1BZRVhQQVRfQ0FQSScsIE5vbmUpKQogICAgICAgICAgICAgZXh0cy5hcHBlbmQoRXh0ZW5zaW9uKCdfZWxlbWVudHRyZWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZV9tYWNyb3MgPSBkZWZpbmVfbWFjcm9zLApAQCAtODg1LDExICs5NjgsMTEgQEAKICAgICAgICAgaWYgc3lzLm1heGludCA9PSAweDdmZmZmZmZmOgogICAgICAgICAgICAgIyBUaGlzIHJlcXVpcmVzIHNpemVvZihpbnQpID09IHNpemVvZihsb25nKSA9PSBzaXplb2YoY2hhciopCiAgICAgICAgICAgICBkbF9pbmMgPSBmaW5kX2ZpbGUoJ2RsZmNuLmgnLCBbXSwgaW5jX2RpcnMpCi0gICAgICAgICAgICBpZiAoZGxfaW5jIGlzIG5vdCBOb25lKSBhbmQgKHBsYXRmb3JtIG5vdCBpbiBbJ2F0aGVvcycsICdkYXJ3aW4nXSk6CisgICAgICAgICAgICBpZiAoZGxfaW5jIGlzIG5vdCBOb25lKSBhbmQgKHBsYXRmb3JtIG5vdCBpbiBbJ2F0aGVvcyddKToKICAgICAgICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdkbCcsIFsnZGxtb2R1bGUuYyddKSApCiAKICAgICAgICAgIyBUaG9tYXMgSGVsbGVyJ3MgX2N0eXBlcyBtb2R1bGUKLSAgICAgICAgc2VsZi5kZXRlY3RfY3R5cGVzKCkKKyAgICAgICAgc2VsZi5kZXRlY3RfY3R5cGVzKGluY19kaXJzLCBsaWJfZGlycykKIAogICAgICAgICAjIFBsYXRmb3JtLXNwZWNpZmljIGxpYnJhcmllcwogICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnbGludXgyJzoKQEAgLTkwNSw4MiArOTg4LDg2IEBACiAgICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdzdW5hdWRpb2RldicsIFsnc3VuYXVkaW9kZXYuYyddKSApCiAKICAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICgiLS1kaXNhYmxlLXRvb2xib3gtZ2x1ZSIgbm90IGluCi0gICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIkNPTkZJR19BUkdTIikpOgotICAgICAgICAgICAgIyBNYWMgT1MgWCBzcGVjaWZpYyBtb2R1bGVzLgotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0NGJywgWydjZi9fQ0Ztb2R1bGUuYycsICdjZi9weWNmYnJpZGdlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ29yZUZvdW5kYXRpb24nXSkgKQorICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiQ09ORklHX0FSR1MiKSk6CiAKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ0NvbG9yUGlja2VyJywgWydDb2xvclBpY2tlcm1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdhdXRvR0lMJywgWydhdXRvR0lMLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ29yZUZvdW5kYXRpb24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignZ2VzdGFsdCcsIFsnZ2VzdGFsdG1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdNYWNPUycsIFsnbWFjb3Ntb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignT1NBVGVybWlub2xvZ3knLCBbJ09TQVRlcm1pbm9sb2d5LmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ2ljZ2x1ZScsIFsnaWNnbHVlbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19SZXMnLCBbJ3Jlcy9fUmVzbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19TbmQnLCBbJ3NuZC9fU25kbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ05hdicsIFsnTmF2LmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0FFJywgWydhZS9fQUVtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfQUgnLCBbJ2FoL19BSG1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19BcHAnLCBbJ2FwcC9fQXBwbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0NhcmJvbkV2dCcsIFsnY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfQ0cnLCBbJ2NnL19DR21vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQXBwbGljYXRpb25TZXJ2aWNlcyddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfQ20nLCBbJ2NtL19DbW1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19DdGwnLCBbJ2N0bC9fQ3RsbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0RsZycsIFsnZGxnL19EbGdtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfRHJhZycsIFsnZHJhZy9fRHJhZ21vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19FdnQnLCBbJ2V2dC9fRXZ0bW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0ZpbGUnLCBbJ2ZpbGUvX0ZpbGVtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfRm9sZGVyJywgWydmb2xkZXIvX0ZvbGRlcm1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19GbScsIFsnZm0vX0ZtbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0hlbHAnLCBbJ2hlbHAvX0hlbHBtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfSWNuJywgWydpY24vX0ljbm1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19JQkNhcmJvbicsIFsnaWJjYXJib24vX0lCQ2FyYm9uLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0xhdW5jaCcsIFsnbGF1bmNoL19MYXVuY2htb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0FwcGxpY2F0aW9uU2VydmljZXMnXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0xpc3QnLCBbJ2xpc3QvX0xpc3Rtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfTWVudScsIFsnbWVudS9fTWVudW1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19NbHRlJywgWydtbHRlL19NbHRlbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX09TQScsIFsnb3NhL19PU0Ftb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfUWQnLCBbJ3FkL19RZG1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19RZG9mZnMnLCBbJ3Fkb2Zmcy9fUWRvZmZzbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQorICAgICAgICAgICAgaWYgb3MudW5hbWUoKVsyXSA+ICc4Lic6CisgICAgICAgICAgICAgICAgIyBXZSdyZSBvbiBNYWMgT1MgWCAxMC40IG9yIGxhdGVyLCB0aGUgY29tcGlsZXIgc2hvdWxkCisgICAgICAgICAgICAgICAgIyBzdXBwb3J0ICctV25vLWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zJy4gVGhpcyB3aWxsCisgICAgICAgICAgICAgICAgIyBzdXJwcmVzcyBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgdGhlIENhcmJvbiBleHRlbnNpb25zLAorICAgICAgICAgICAgICAgICMgdGhlc2UgZXh0ZW5zaW9ucyB3cmFwIHRoZSBDYXJib24gQVBJcyBhbmQgZXZlbiB0aG9zZQorICAgICAgICAgICAgICAgICMgcGFydHMgdGhhdCBhcmUgZGVwcmVjYXRlZC4KKyAgICAgICAgICAgICAgICBjYXJib25fZXh0cmFfY29tcGlsZV9hcmdzID0gWyctV25vLWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zJ10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY2FyYm9uX2V4dHJhX2NvbXBpbGVfYXJncyA9IFtdCisKKyAgICAgICAgICAgICMgTWFjIE9TIFggc3BlY2lmaWMgbW9kdWxlcy4KKyAgICAgICAgICAgIGRlZiBtYWNTcmNFeGlzdHMobmFtZTEsIG5hbWUyPScnKToKKyAgICAgICAgICAgICAgICBpZiBub3QgbmFtZTE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgbmFtZXMgPSAobmFtZTEsKQorICAgICAgICAgICAgICAgIGlmIG5hbWUyOgorICAgICAgICAgICAgICAgICAgICBuYW1lcyA9IChuYW1lMSwgbmFtZTIpCisgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzcmNkaXIsICdNYWMnLCAnTW9kdWxlcycsICpuYW1lcykKKyAgICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKKworICAgICAgICAgICAgZGVmIGFkZE1hY0V4dGVuc2lvbihuYW1lLCBrd2RzLCBleHRyYV9zcmNzPVtdKToKKyAgICAgICAgICAgICAgICBkaXJuYW1lID0gJycKKyAgICAgICAgICAgICAgICBpZiBuYW1lWzBdID09ICdfJzoKKyAgICAgICAgICAgICAgICAgICAgZGlybmFtZSA9IG5hbWVbMTpdLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBjbmFtZSA9IG5hbWUgKyAnLmMnCisgICAgICAgICAgICAgICAgY21vZHVsZW5hbWUgPSBuYW1lICsgJ21vZHVsZS5jJworICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIE5OTi5jLCBOTk5tb2R1bGUuYywgX25ubi9OTk4uYywgX25ubi9OTk5tb2R1bGUuYworICAgICAgICAgICAgICAgIGlmIG1hY1NyY0V4aXN0cyhjbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHNyY3MgPSBbY25hbWVdCisgICAgICAgICAgICAgICAgZWxpZiBtYWNTcmNFeGlzdHMoY21vZHVsZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICBzcmNzID0gW2Ntb2R1bGVuYW1lXQorICAgICAgICAgICAgICAgIGVsaWYgbWFjU3JjRXhpc3RzKGRpcm5hbWUsIGNuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgIyBYWFgobm5vcndpdHopOiBJZiBhbGwgdGhlIG5hbWVzIGVuZGVkIHdpdGggbW9kdWxlLCB3ZQorICAgICAgICAgICAgICAgICAgICAjIHdvdWxkbid0IG5lZWQgdGhpcyBjb25kaXRpb24uICBpYmNhcmJvbiBpcyB0aGUgb25seSBvbmUuCisgICAgICAgICAgICAgICAgICAgIHNyY3MgPSBbb3MucGF0aC5qb2luKGRpcm5hbWUsIGNuYW1lKV0KKyAgICAgICAgICAgICAgICBlbGlmIG1hY1NyY0V4aXN0cyhkaXJuYW1lLCBjbW9kdWxlbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHNyY3MgPSBbb3MucGF0aC5qb2luKGRpcm5hbWUsIGNtb2R1bGVuYW1lKV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIiVzIG5vdCBmb3VuZCIgJSBuYW1lKQorCisgICAgICAgICAgICAgICAgIyBIZXJlJ3MgdGhlIHdob2xlIHBvaW50OiAgYWRkIHRoZSBleHRlbnNpb24gd2l0aCBzb3VyY2VzCisgICAgICAgICAgICAgICAgZXh0cy5hcHBlbmQoRXh0ZW5zaW9uKG5hbWUsIHNyY3MgKyBleHRyYV9zcmNzLCAqKmt3ZHMpKQorCisgICAgICAgICAgICAjIENvcmUgRm91bmRhdGlvbgorICAgICAgICAgICAgY29yZV9rd2RzID0geydleHRyYV9jb21waWxlX2FyZ3MnOiBjYXJib25fZXh0cmFfY29tcGlsZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICdleHRyYV9saW5rX2FyZ3MnOiBbJy1mcmFtZXdvcmsnLCAnQ29yZUZvdW5kYXRpb24nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZE1hY0V4dGVuc2lvbignX0NGJywgY29yZV9rd2RzLCBbJ2NmL3B5Y2ZicmlkZ2UuYyddKQorICAgICAgICAgICAgYWRkTWFjRXh0ZW5zaW9uKCdhdXRvR0lMJywgY29yZV9rd2RzKQorCisgICAgICAgICAgICAjIENhcmJvbgorICAgICAgICAgICAgY2FyYm9uX2t3ZHMgPSB7J2V4dHJhX2NvbXBpbGVfYXJncyc6IGNhcmJvbl9leHRyYV9jb21waWxlX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXh0cmFfbGlua19hcmdzJzogWyctZnJhbWV3b3JrJywgJ0NhcmJvbiddLAorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBDQVJCT05fRVhUUyA9IFsnQ29sb3JQaWNrZXInLCAnZ2VzdGFsdCcsICdNYWNPUycsICdOYXYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09TQVRlcm1pbm9sb2d5JywgJ2ljZ2x1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFsbCB0aGVzZSBhcmUgaW4gc3ViZGlycworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19BRScsICdfQUgnLCAnX0FwcCcsICdfQ2FyYm9uRXZ0JywgJ19DbScsICdfQ3RsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdfRGxnJywgJ19EcmFnJywgJ19FdnQnLCAnX0ZpbGUnLCAnX0ZvbGRlcicsICdfRm0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19IZWxwJywgJ19JY24nLCAnX0lCQ2FyYm9uJywgJ19MaXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdfTWVudScsICdfTWx0ZScsICdfT1NBJywgJ19SZXMnLCAnX1FkJywgJ19RZG9mZnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19TY3JhcCcsICdfU25kJywgJ19URScsICdfV2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gQ0FSQk9OX0VYVFM6CisgICAgICAgICAgICAgICAgYWRkTWFjRXh0ZW5zaW9uKG5hbWUsIGNhcmJvbl9rd2RzKQorCisgICAgICAgICAgICAjIEFwcGxpY2F0aW9uIFNlcnZpY2VzICYgUXVpY2tUaW1lCisgICAgICAgICAgICBhcHBfa3dkcyA9IHsnZXh0cmFfY29tcGlsZV9hcmdzJzogY2FyYm9uX2V4dHJhX2NvbXBpbGVfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICdleHRyYV9saW5rX2FyZ3MnOiBbJy1mcmFtZXdvcmsnLCdBcHBsaWNhdGlvblNlcnZpY2VzJ10sCisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZE1hY0V4dGVuc2lvbignX0xhdW5jaCcsIGFwcF9rd2RzKQorICAgICAgICAgICAgYWRkTWFjRXh0ZW5zaW9uKCdfQ0cnLCBhcHBfa3dkcykKKwogICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX1F0JywgWydxdC9fUXRtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ1F1aWNrVGltZScsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9jb21waWxlX2FyZ3M9Y2FyYm9uX2V4dHJhX2NvbXBpbGVfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnUXVpY2tUaW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX1NjcmFwJywgWydzY3JhcC9fU2NyYXBtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfVEUnLCBbJ3RlL19URW1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKKwogICAgICAgICAgICAgIyBBcyB0aGVyZSBpcyBubyBzdGFuZGFyZGl6ZWQgcGxhY2UgKHlldCkgdG8gcHV0CiAgICAgICAgICAgICAjIHVzZXItaW5zdGFsbGVkIE1hYyBsaWJyYXJpZXMgb24gT1NYLCB3ZSBzZWFyY2ggZm9yICJ3YXN0ZSIKICAgICAgICAgICAgICMgaW4gcGFyZW50IGRpcmVjdG9yaWVzIG9mIHRoZSBQeXRob24gc291cmNlIHRyZWUuIFlvdQpAQCAtOTkyLDcgKzEwNzksNiBAQAogICAgICAgICAgICAgd2FzdGVfbGlicyA9IGZpbmRfbGlicmFyeV9maWxlKHNlbGYuY29tcGlsZXIsICJXQVNURSIsIFtdLAogICAgICAgICAgICAgICAgICAgICBbIi4uLyIqbiArICJ3YXN0ZS9TdGF0aWMgTGlicmFyaWVzIiBmb3IgbiBpbiAoMCwxLDIsMyw0KV0pCiAgICAgICAgICAgICBpZiB3YXN0ZV9pbmNzICE9IE5vbmUgYW5kIHdhc3RlX2xpYnMgIT0gTm9uZToKLSAgICAgICAgICAgICAgICAoc3JjZGlyLCkgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKCdzcmNkaXInKQogICAgICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ3dhc3RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3dhc3RlL3dhc3RlbW9kdWxlLmMnXSArIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNyY2RpciwgZCkgZm9yIGQgaW4KQEAgLTEwMDUsOCArMTA5MSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzID0gWydXQVNURSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncyA9IFsnLWZyYW1ld29yaycsICdDYXJib24nXSwKICAgICAgICAgICAgICAgICApICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19XaW4nLCBbJ3dpbi9fV2lubW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQogCiAgICAgICAgIHNlbGYuZXh0ZW5zaW9ucy5leHRlbmQoZXh0cykKIApAQCAtMTE4Myw0NCArMTI2Nyw1NSBAQAogICAgICAgICAjICoqKiBVbmNvbW1lbnQgdGhlc2UgZm9yIFRPR0wgZXh0ZW5zaW9uIG9ubHk6CiAgICAgICAgICMgICAgICAgLWxHTCAtbEdMVSAtbFhleHQgLWxYbXUgXAogCi0gICAgZGVmIGRldGVjdF9jdHlwZXMoc2VsZik6Ci0gICAgICAgIChzcmNkaXIsKSA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoJ3NyY2RpcicpCi0gICAgICAgIGZmaV9idWlsZGRpciA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX3RlbXAsICdsaWJmZmknKQotICAgICAgICBmZmlfc3JjZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihzcmNkaXIsICdNb2R1bGVzJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2N0eXBlcycsICdsaWJmZmknKSkKLSAgICAgICAgZmZpX2NvbmZpZ2ZpbGUgPSBvcy5wYXRoLmpvaW4oZmZpX2J1aWxkZGlyLCAnZmZpY29uZmlnLnB5JykKKyAgICBkZWYgY29uZmlndXJlX2N0eXBlcyhzZWxmLCBleHQpOgorICAgICAgICBpZiBub3Qgc2VsZi51c2Vfc3lzdGVtX2xpYmZmaToKKyAgICAgICAgICAgIChzcmNkaXIsKSA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoJ3NyY2RpcicpCisgICAgICAgICAgICBmZmlfYnVpbGRkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF90ZW1wLCAnbGliZmZpJykKKyAgICAgICAgICAgIGZmaV9zcmNkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHNyY2RpciwgJ01vZHVsZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2N0eXBlcycsICdsaWJmZmknKSkKKyAgICAgICAgICAgIGZmaV9jb25maWdmaWxlID0gb3MucGF0aC5qb2luKGZmaV9idWlsZGRpciwgJ2ZmaWNvbmZpZy5weScpCiAKLSAgICAgICAgaWYgc2VsZi5mb3JjZSBvciBub3Qgb3MucGF0aC5leGlzdHMoZmZpX2NvbmZpZ2ZpbGUpOgotICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IG1rcGF0aAotICAgICAgICAgICAgbWtwYXRoKGZmaV9idWlsZGRpcikKLSAgICAgICAgICAgIGNvbmZpZ19hcmdzID0gW10KKyAgICAgICAgICAgIGlmIHNlbGYuZm9yY2Ugb3Igbm90IG9zLnBhdGguZXhpc3RzKGZmaV9jb25maWdmaWxlKToKKyAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgbWtwYXRoCisgICAgICAgICAgICAgICAgbWtwYXRoKGZmaV9idWlsZGRpcikKKyAgICAgICAgICAgICAgICBjb25maWdfYXJncyA9IFtdCiAKLSAgICAgICAgICAgICMgUGFzcyBlbXB0eSBDRkxBR1MgYmVjYXVzZSB3ZSdsbCBqdXN0IGFwcGVuZCB0aGUgcmVzdWx0aW5nIENGTEFHUwotICAgICAgICAgICAgIyB0byBQeXRob24nczsgLWcgb3IgLU8yIGlzIHRvIGJlIGF2b2lkZWQuCi0gICAgICAgICAgICBjbWQgPSAiY2QgJXMgJiYgZW52IENGTEFHUz0nJyAnJXMvY29uZmlndXJlJyAlcyIgXAotICAgICAgICAgICAgICAgICAgJSAoZmZpX2J1aWxkZGlyLCBmZmlfc3JjZGlyLCAiICIuam9pbihjb25maWdfYXJncykpCisgICAgICAgICAgICAgICAgIyBQYXNzIGVtcHR5IENGTEFHUyBiZWNhdXNlIHdlJ2xsIGp1c3QgYXBwZW5kIHRoZSByZXN1bHRpbmcKKyAgICAgICAgICAgICAgICAjIENGTEFHUyB0byBQeXRob24nczsgLWcgb3IgLU8yIGlzIHRvIGJlIGF2b2lkZWQuCisgICAgICAgICAgICAgICAgY21kID0gImNkICVzICYmIGVudiBDRkxBR1M9JycgJyVzL2NvbmZpZ3VyZScgJXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAlIChmZmlfYnVpbGRkaXIsIGZmaV9zcmNkaXIsICIgIi5qb2luKGNvbmZpZ19hcmdzKSkKIAotICAgICAgICAgICAgcmVzID0gb3Muc3lzdGVtKGNtZCkKLSAgICAgICAgICAgIGlmIHJlcyBvciBub3Qgb3MucGF0aC5leGlzdHMoZmZpX2NvbmZpZ2ZpbGUpOgotICAgICAgICAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gY29uZmlndXJlIF9jdHlwZXMgbW9kdWxlIgotICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHJlcyA9IG9zLnN5c3RlbShjbWQpCisgICAgICAgICAgICAgICAgaWYgcmVzIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyhmZmlfY29uZmlnZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gY29uZmlndXJlIF9jdHlwZXMgbW9kdWxlIgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKIAotICAgICAgICBmZmljb25maWcgPSB7fQotICAgICAgICBleGVjZmlsZShmZmlfY29uZmlnZmlsZSwgZ2xvYmFscygpLCBmZmljb25maWcpCi0gICAgICAgIGZmaV9zcmNkaXIgPSBvcy5wYXRoLmpvaW4oZmZpY29uZmlnWydmZmlfc3JjZGlyJ10sICdzcmMnKQorICAgICAgICAgICAgZmZpY29uZmlnID0ge30KKyAgICAgICAgICAgIGV4ZWNmaWxlKGZmaV9jb25maWdmaWxlLCBnbG9iYWxzKCksIGZmaWNvbmZpZykKKyAgICAgICAgICAgIGZmaV9zcmNkaXIgPSBvcy5wYXRoLmpvaW4oZmZpY29uZmlnWydmZmlfc3JjZGlyJ10sICdzcmMnKQogCi0gICAgICAgICMgQWRkIC5TIChwcmVwcm9jZXNzZWQgYXNzZW1ibHkpIHRvIEMgY29tcGlsZXIgc291cmNlIGV4dGVuc2lvbnMuCi0gICAgICAgIHNlbGYuY29tcGlsZXIuc3JjX2V4dGVuc2lvbnMuYXBwZW5kKCcuUycpCisgICAgICAgICAgICAjIEFkZCAuUyAocHJlcHJvY2Vzc2VkIGFzc2VtYmx5KSB0byBDIGNvbXBpbGVyIHNvdXJjZSBleHRlbnNpb25zLgorICAgICAgICAgICAgc2VsZi5jb21waWxlci5zcmNfZXh0ZW5zaW9ucy5hcHBlbmQoJy5TJykKIAotICAgICAgICBpbmNsdWRlX2RpcnMgPSBbb3MucGF0aC5qb2luKGZmaV9idWlsZGRpciwgJ2luY2x1ZGUnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZmaV9idWlsZGRpciwgZmZpX3NyY2Rpcl0KLSAgICAgICAgZXh0cmFfY29tcGlsZV9hcmdzID0gZmZpY29uZmlnWydmZmlfY2ZsYWdzJ10uc3BsaXQoKQorICAgICAgICAgICAgaW5jbHVkZV9kaXJzID0gW29zLnBhdGguam9pbihmZmlfYnVpbGRkaXIsICdpbmNsdWRlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX2J1aWxkZGlyLCBmZmlfc3JjZGlyXQorICAgICAgICAgICAgZXh0cmFfY29tcGlsZV9hcmdzID0gZmZpY29uZmlnWydmZmlfY2ZsYWdzJ10uc3BsaXQoKQorCisgICAgICAgICAgICBleHQuc291cmNlcy5leHRlbmQoZmZpY29uZmlnWydmZmlfc291cmNlcyddKQorICAgICAgICAgICAgZXh0LmluY2x1ZGVfZGlycy5leHRlbmQoaW5jbHVkZV9kaXJzKQorICAgICAgICAgICAgZXh0LmV4dHJhX2NvbXBpbGVfYXJncy5leHRlbmQoZXh0cmFfY29tcGlsZV9hcmdzKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRldGVjdF9jdHlwZXMoc2VsZiwgaW5jX2RpcnMsIGxpYl9kaXJzKToKKyAgICAgICAgc2VsZi51c2Vfc3lzdGVtX2xpYmZmaSA9IEZhbHNlCisgICAgICAgIGluY2x1ZGVfZGlycyA9IFtdCisgICAgICAgIGV4dHJhX2NvbXBpbGVfYXJncyA9IFtdCiAgICAgICAgIHNvdXJjZXMgPSBbJ19jdHlwZXMvX2N0eXBlcy5jJywKICAgICAgICAgICAgICAgICAgICAnX2N0eXBlcy9jYWxsYmFja3MuYycsCiAgICAgICAgICAgICAgICAgICAgJ19jdHlwZXMvY2FsbHByb2MuYycsCiAgICAgICAgICAgICAgICAgICAgJ19jdHlwZXMvc3RnZGljdC5jJywKICAgICAgICAgICAgICAgICAgICAnX2N0eXBlcy9jZmllbGQuYycsCi0gICAgICAgICAgICAgICAgICAgJ19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYyddICsgZmZpY29uZmlnWydmZmlfc291cmNlcyddCisgICAgICAgICAgICAgICAgICAgJ19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYyddCiAgICAgICAgIGRlcGVuZHMgPSBbJ19jdHlwZXMvY3R5cGVzLmgnXQogCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKQEAgLTEyMzIsMTIgKzEzMjcsNDAgQEAKICAgICAgICAgZXh0ID0gRXh0ZW5zaW9uKCdfY3R5cGVzJywKICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9jb21waWxlX2FyZ3M9ZXh0cmFfY29tcGlsZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPVtdLAogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz1zb3VyY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcz1kZXBlbmRzKQogICAgICAgICBleHRfdGVzdCA9IEV4dGVuc2lvbignX2N0eXBlc190ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz1bJ19jdHlwZXMvX2N0eXBlc190ZXN0LmMnXSkKICAgICAgICAgc2VsZi5leHRlbnNpb25zLmV4dGVuZChbZXh0LCBleHRfdGVzdF0pCiAKKyAgICAgICAgaWYgbm90ICctLXdpdGgtc3lzdGVtLWZmaScgaW4gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJDT05GSUdfQVJHUyIpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZmZpX2luYyA9IGZpbmRfZmlsZSgnZmZpLmgnLCBbXSwgaW5jX2RpcnMpCisgICAgICAgIGlmIGZmaV9pbmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmZmlfaCA9IGZmaV9pbmNbMF0gKyAnL2ZmaS5oJworICAgICAgICAgICAgZnAgPSBvcGVuKGZmaV9oKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICBmZmlfaW5jID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnI2RlZmluZSBMSUJGRklfSCcpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBmZmlfbGliID0gTm9uZQorICAgICAgICBpZiBmZmlfaW5jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIGxpYl9uYW1lIGluICgnZmZpX2NvbnZlbmllbmNlJywgJ2ZmaV9waWMnLCAnZmZpJyk6CisgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsIGxpYl9uYW1lKSk6CisgICAgICAgICAgICAgICAgICAgIGZmaV9saWIgPSBsaWJfbmFtZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIGlmIGZmaV9pbmMgYW5kIGZmaV9saWI6CisgICAgICAgICAgICBleHQuaW5jbHVkZV9kaXJzLmV4dGVuZChmZmlfaW5jKQorICAgICAgICAgICAgZXh0LmxpYnJhcmllcy5hcHBlbmQoZmZpX2xpYikKKyAgICAgICAgICAgIHNlbGYudXNlX3N5c3RlbV9saWJmZmkgPSBUcnVlCisKKwogY2xhc3MgUHlCdWlsZEluc3RhbGwoaW5zdGFsbCk6CiAgICAgIyBTdXBwcmVzcyB0aGUgd2FybmluZyBhYm91dCBpbnN0YWxsYXRpb24gaW50byB0aGUgbGliX2R5bmxvYWQKICAgICAjIGRpcmVjdG9yeSwgd2hpY2ggaXMgbm90IGluIHN5cy5wYXRoIHdoZW4gcnVubmluZyBQeXRob24gZHVyaW5nCg==