ZGlmZiAtLWdpdCBhL0xpYi9wa2d1dGlsLnB5IGIvTGliL3BrZ3V0aWwucHkKaW5kZXggMjdkZDg4Ny4uMGVjNmVjNSAxMDA2NDQKLS0tIGEvTGliL3BrZ3V0aWwucHkKKysrIGIvTGliL3BrZ3V0aWwucHkKQEAgLTMxOCw4ICszMTgsNyBAQAogICAgIGZyb20gemlwaW1wb3J0IGltcG9ydCB6aXBpbXBvcnRlcgogCiAgICAgZGVmIGl0ZXJfemlwaW1wb3J0X21vZHVsZXMoaW1wb3J0ZXIsIHByZWZpeD0nJyk6Ci0gICAgICAgIGRpcmxpc3QgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbaW1wb3J0ZXIuYXJjaGl2ZV0ua2V5cygpCi0gICAgICAgIGRpcmxpc3Quc29ydCgpCisgICAgICAgIGRpcmxpc3QgPSBzb3J0ZWQoemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW2ltcG9ydGVyLmFyY2hpdmVdKQogICAgICAgICBfcHJlZml4ID0gaW1wb3J0ZXIucHJlZml4CiAgICAgICAgIHBsZW4gPSBsZW4oX3ByZWZpeCkKICAgICAgICAgeWllbGRlZCA9IHt9CmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQppbmRleCBkMjc2YTMzLi40Y2U4OTA2IDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKQEAgLTQ0LDM5ICs0NCwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmcgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXhjZXB0aW9uIikKIAogICAgIGRlZiBDaGVja0Vycm9yKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuRXJyb3IsIEV4Y2VwdGlvbiksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5FcnJvciwgRXhjZXB0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFeGNlcHRpb24iKQogCiAgICAgZGVmIENoZWNrSW50ZXJmYWNlRXJyb3Ioc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlcmZhY2VFcnJvciwgc3FsaXRlLkVycm9yKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkludGVyZmFjZUVycm9yLCBzcWxpdGUuRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkludGVyZmFjZUVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIEVycm9yIikKIAogICAgIGRlZiBDaGVja0RhdGFiYXNlRXJyb3Ioc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5EYXRhYmFzZUVycm9yLCBzcWxpdGUuRXJyb3IpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuRGF0YWJhc2VFcnJvciwgc3FsaXRlLkVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhYmFzZUVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIEVycm9yIikKIAogICAgIGRlZiBDaGVja0RhdGFFcnJvcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkRhdGFFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuRGF0YUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YUVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQogCiAgICAgZGVmIENoZWNrT3BlcmF0aW9uYWxFcnJvcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpb25hbEVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQogCiAgICAgZGVmIENoZWNrSW50ZWdyaXR5RXJyb3Ioc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlZ3JpdHlFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZWdyaXR5RXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlZ3JpdHlFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKIAogICAgIGRlZiBDaGVja0ludGVybmFsRXJyb3Ioc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlcm5hbEVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlcm5hbEVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYWxFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKIAogICAgIGRlZiBDaGVja1Byb2dyYW1taW5nRXJyb3Ioc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbW1pbmdFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKIAogICAgIGRlZiBDaGVja05vdFN1cHBvcnRlZEVycm9yKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuTm90U3VwcG9ydGVkRXJyb3IsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5Ob3RTdXBwb3J0ZWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgIk5vdFN1cHBvcnRlZEVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQogCkBAIC0xMjYsMTYgKzEyNiwxNiBAQAogCiAgICAgZGVmIENoZWNrRXhjZXB0aW9ucyhzZWxmKToKICAgICAgICAgIyBPcHRpb25hbCBEQi1BUEkgZXh0ZW5zaW9uLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4Lldhcm5pbmcsIHNxbGl0ZS5XYXJuaW5nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4LkVycm9yLCBzcWxpdGUuRXJyb3IpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guSW50ZXJmYWNlRXJyb3IsIHNxbGl0ZS5JbnRlcmZhY2VFcnJvcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5EYXRhYmFzZUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5EYXRhRXJyb3IsIHNxbGl0ZS5EYXRhRXJyb3IpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guSW50ZWdyaXR5RXJyb3IsIHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5JbnRlcm5hbEVycm9yLCBzcWxpdGUuSW50ZXJuYWxFcnJvcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5Ob3RTdXBwb3J0ZWRFcnJvciwgc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guV2FybmluZywgc3FsaXRlLldhcm5pbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5FcnJvciwgc3FsaXRlLkVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZXJmYWNlRXJyb3IsIHNxbGl0ZS5JbnRlcmZhY2VFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LkRhdGFiYXNlRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guRGF0YUVycm9yLCBzcWxpdGUuRGF0YUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5JbnRlZ3JpdHlFcnJvciwgc3FsaXRlLkludGVncml0eUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZXJuYWxFcnJvciwgc3FsaXRlLkludGVybmFsRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4Lk5vdFN1cHBvcnRlZEVycm9yLCBzcWxpdGUuTm90U3VwcG9ydGVkRXJyb3IpCiAKIGNsYXNzIEN1cnNvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CkBAIC0yMjcsNyArMjI3LDcgQEAKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgWyJmb28iXSkKICAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKIAogICAgIGRlZiBDaGVja0V4ZWN1dGVQYXJhbVNlcXVlbmNlKHNlbGYpOgogICAgICAgICBjbGFzcyBMKG9iamVjdCk6CkBAIC0yNDAsMTMgKzI0MCwxMyBAQAogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPT8iLCBMKCkpCiAgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCiAKICAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmcoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiLCB7Im5hbWUiOiAiZm9vIn0pCiAgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCiAKICAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdfTWFwcGluZyhzZWxmKToKICAgICAgICAgY2xhc3MgRChkaWN0KToKQEAgLTI1Niw3ICsyNTYsNyBAQAogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIiwgRCgpKQogICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQogCiAgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nVG9vTGl0dGxlQXJncyhzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKQEAgLTI5MCw3ICsyOTAsNyBAQAogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInVwZGF0ZSB0ZXN0IHNldCBuYW1lPSdiYXInIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jdS5yb3djb3VudCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAyKQogCiAgICAgZGVmIENoZWNrUm93Y291bnRTZWxlY3Qoc2VsZik6CiAgICAgICAgICIiIgpAQCAtMjk5LDEyICsyOTksMTIgQEAKICAgICAgICAgaGFzIHRodXMgdG8gYmUgLTEuCiAgICAgICAgICIiIgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1IHVuaW9uIHNlbGVjdCA2IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jdS5yb3djb3VudCwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5yb3djb3VudCwgLTEpCiAKICAgICBkZWYgQ2hlY2tSb3djb3VudEV4ZWN1dGVtYW55KHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQogICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCBbKDEsKSwgKDIsKSwgKDMsKV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3Uucm93Y291bnQsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5yb3djb3VudCwgMykKIAogICAgIGRlZiBDaGVja1RvdGFsQ2hhbmdlcyhzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKQEAgLTM3NywyNCArMzc3LDI0IEBACiAgICAgICAgIGxzdCA9IFtdCiAgICAgICAgIGZvciByb3cgaW4gc2VsZi5jdToKICAgICAgICAgICAgIGxzdC5hcHBlbmQocm93WzBdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsc3RbMF0sIDUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxzdFsxXSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3RbMF0sIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0WzFdLCA2KQogCiAgICAgZGVmIENoZWNrRmV0Y2hvbmUoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKICAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKICAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvdywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3csIE5vbmUpCiAKICAgICBkZWYgQ2hlY2tGZXRjaG9uZU5vU3RhdGVtZW50KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmN4LmN1cnNvcigpCiAgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvdywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3csIE5vbmUpCiAKICAgICBkZWYgQ2hlY2tBcnJheVNpemUoc2VsZik6CiAgICAgICAgICMgbXVzdCBkZWZhdWx0IG90IDEKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jdS5hcnJheXNpemUsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5hcnJheXNpemUsIDEpCiAKICAgICAgICAgIyBub3cgc2V0IHRvIDIKICAgICAgICAgc2VsZi5jdS5hcnJheXNpemUgPSAyCkBAIC00MDcsMjcgKzQwNywyNyBAQAogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KCkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMikKIAogICAgIGRlZiBDaGVja0ZldGNobWFueShzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueSgxMDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQogICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueSgxMDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBbXSkKIAogICAgIGRlZiBDaGVja0ZldGNobWFueUt3QXJnKHNlbGYpOgogICAgICAgICAiIiJDaGVja3MgaWYgZmV0Y2htYW55IHdvcmtzIHdpdGgga2V5d29yZCBhcmd1bWVudHMiIiIKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueShzaXplPTEwMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCiAKICAgICBkZWYgQ2hlY2tGZXRjaGFsbChzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNoYWxsKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCiAgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2hhbGwoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgW10pCiAKICAgICBkZWYgQ2hlY2tTZXRpbnB1dHNpemVzKHNlbGYpOgogICAgICAgICBzZWxmLmN1LnNldGlucHV0c2l6ZXMoWzMsIDQsIDVdKQpAQCAtNDQwLDcgKzQ0MCw3IEBACiAKICAgICBkZWYgQ2hlY2tDdXJzb3JDb25uZWN0aW9uKHNlbGYpOgogICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3UuY29ubmVjdGlvbiwgc2VsZi5jeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmNvbm5lY3Rpb24sIHNlbGYuY3gpCiAKICAgICBkZWYgQ2hlY2tXcm9uZ0N1cnNvckNhbGxhYmxlKHNlbGYpOgogICAgICAgICB0cnk6CkBAIC02NTEsNyArNjUxLDcgQEAKICAgICAgICAgICAgICIiIikKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gYSIpCiAgICAgICAgIHJlcyA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIDUpCiAKICAgICBkZWYgQ2hlY2tTY3JpcHRFcnJvckluY29tcGxldGUoc2VsZik6CiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCkBAIC02NjEsNyArNjYxLDcgQEAKICAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChzYWRmc2FkZmRzYSIpCiAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgIHJhaXNlZCA9IFRydWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCiAKICAgICBkZWYgQ2hlY2tTY3JpcHRFcnJvck5vcm1hbChzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKQEAgLTY3MSwyNiArNjcxLDI2IEBACiAgICAgICAgICAgICBjdXIuZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3Qoc2FkZnNhZGZkc2EpOyBzZWxlY3QgZm9vIGZyb20gaHVyejsiKQogICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CiAgICAgICAgICAgICByYWlzZWQgPSBUcnVlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJhaXNlZCwgVHJ1ZSwgInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhaXNlZCwgVHJ1ZSwgInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24iKQogCiAgICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGUoc2VsZik6CiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKCJzZWxlY3QgNSIpLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCA1LCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgNSwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlIikKIAogICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlbWFueShzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGZvbykiKQogICAgICAgICBjb24uZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKD8pIiwgWygzLCksICg0LCldKQogICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3Qgb3JkZXIgYnkgZm9vIikuZmV0Y2hhbGwoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHRbMF1bMF0sIDMsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZW1hbnkiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHRbMV1bMF0sIDQsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZW1hbnkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXVswXSwgMywgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlbWFueSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzFdWzBdLCA0LCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKIAogICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlc2NyaXB0KHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBjb24uZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKTsgaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoNSk7IikKICAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDUsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZXNjcmlwdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCA1LCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVzY3JpcHQiKQogCiBjbGFzcyBDbG9zZWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5CmluZGV4IDM0NWQ1YjMuLjFhZGFiMmYgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQogCiAgICAgZGVmIENoZWNrSXNJbnN0YW5jZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi5jb24sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYuY29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeUNvbm5lY3Rpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3Rpb24gaXMgbm90IGluc3RhbmNlIG9mIE15Q29ubmVjdGlvbiIpCiAKQEAgLTYwLDcgKzYwLDcgQEAKIAogICAgIGRlZiBDaGVja0lzSW5zdGFuY2Uoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcihmYWN0b3J5PU15Q3Vyc29yKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShjdXIsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGN1ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlDdXJzb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgImN1cnNvciBpcyBub3QgaW5zdGFuY2Ugb2YgTXlDdXJzb3IiKQogCkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcihmYWN0b3J5PU15Q3Vyc29yKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDQrNSBhcyBmb28iKQogICAgICAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShyb3csCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAicm93IGlzIG5vdCBpbnN0YW5jZSBvZiBkaWN0IikKICAgICAgICAgY3VyLmNsb3NlKCkKQEAgLTg3LDI4ICs4NywyOCBAQAogICAgIGRlZiBDaGVja0N1c3RvbUZhY3Rvcnkoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gbGFtYmRhIGN1ciwgcm93OiBsaXN0KHJvdykKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEsIDIiKS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHJvdywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uocm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIGxpc3QiKQogCiAgICAgZGVmIENoZWNrU3FsaXRlUm93SW5kZXgoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdwogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHJvdywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uocm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUuUm93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIHNxbGl0ZS5Sb3ciKQogCiAgICAgICAgIGNvbDEsIGNvbDIgPSByb3dbImEiXSwgcm93WyJiIl0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDEgPT0gMSwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdhJyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjb2wyID09IDIsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnYSciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMSA9PSAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDIgPT0gMiwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdhJyIpCiAKICAgICAgICAgY29sMSwgY29sMiA9IHJvd1siQSJdLCByb3dbIkIiXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMSA9PSAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0EnIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDIgPT0gMiwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdCJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2wxID09IDEsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnQSciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMiA9PSAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0InIikKIAogICAgICAgICBjb2wxLCBjb2wyID0gcm93WzBdLCByb3dbMV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDEgPT0gMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAwIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDIgPT0gMiwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDEgPT0gMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDIgPT0gMiwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAxIikKIAogICAgIGRlZiBDaGVja1NxbGl0ZVJvd0l0ZXIoc2VsZik6CiAgICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBpcyBpdGVyYWJsZSIiIgpAQCAtMTI4LDggKzEyOCw4IEBACiAgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdwogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCiAgICAgICAgIGQgPSBkaWN0KHJvdykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZFsiYSJdLCByb3dbImEiXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZFsiYiJdLCByb3dbImIiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWyJhIl0sIHJvd1siYSJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbImIiXSwgcm93WyJiIl0pCiAKICAgICBkZWYgQ2hlY2tTcWxpdGVSb3dIYXNoQ21wKHNlbGYpOgogICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgY29tcGFyZXMgYW5kIGhhc2hlcyBjb3JyZWN0bHkiIiIKQEAgLTEzOCwxOCArMTM4LDE4IEBACiAgICAgICAgIHJvd18yID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQogICAgICAgICByb3dfMyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDMgYXMgYiIpLmZldGNob25lKCkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocm93XzEgPT0gcm93XzEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyb3dfMSA9PSByb3dfMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJvd18yICE9IHJvd18zKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocm93XzEgPT0gcm93XzEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dfMSA9PSByb3dfMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJvd18yICE9IHJvd18zKQogCi0gICAgICAgIHNlbGYuZmFpbElmKHJvd18xICE9IHJvd18xKQotICAgICAgICBzZWxmLmZhaWxJZihyb3dfMSAhPSByb3dfMikKLSAgICAgICAgc2VsZi5mYWlsSWYocm93XzIgPT0gcm93XzMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocm93XzEgIT0gcm93XzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocm93XzEgIT0gcm93XzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocm93XzIgPT0gcm93XzMpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93XzEsIHJvd18yKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChoYXNoKHJvd18xKSwgaGFzaChyb3dfMikpCi0gICAgICAgIHNlbGYuZmFpbElmRXF1YWwocm93XzEsIHJvd18zKQotICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKGhhc2gocm93XzEpLCBoYXNoKHJvd18zKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dfMSwgcm93XzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChyb3dfMSksIGhhc2gocm93XzIpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJvd18xLCByb3dfMykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChoYXNoKHJvd18xKSwgaGFzaChyb3dfMykpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKQEAgLTE2MSwyMSArMTYxLDIxIEBACiAgICAgZGVmIENoZWNrVW5pY29kZShzZWxmKToKICAgICAgICAgYXVzdHJpYSA9ICLWc3RlcnJlaWNoIgogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocm93WzBdKSA9PSBzdHIsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyb3dbMF0pID09IHN0ciwgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgdW5pY29kZSIpCiAKICAgICBkZWYgQ2hlY2tTdHJpbmcoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGJ5dGVzCiAgICAgICAgIGF1c3RyaWEgPSAi1nN0ZXJyZWljaCIKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKHJvd1swXSkgPT0gYnl0ZXMsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIGJ5dGVzIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJvd1swXSA9PSBhdXN0cmlhLmVuY29kZSgidXRmLTgiKSwgImNvbHVtbiBtdXN0IGVxdWFsIG9yaWdpbmFsIGRhdGEgaW4gVVRGLTgiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyb3dbMF0pID09IGJ5dGVzLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSBieXRlcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dbMF0gPT0gYXVzdHJpYS5lbmNvZGUoInV0Zi04IiksICJjb2x1bW4gbXVzdCBlcXVhbCBvcmlnaW5hbCBkYXRhIGluIFVURi04IikKIAogICAgIGRlZiBDaGVja0N1c3RvbShzZWxmKToKICAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gbGFtYmRhIHg6IHN0cih4LCAidXRmLTgiLCAiaWdub3JlIikKICAgICAgICAgYXVzdHJpYSA9ICLWc3RlcnJlaWNoIgogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocm93WzBdKSA9PSBzdHIsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocm93WzBdLmVuZHN3aXRoKCJyZWljaCIpLCAiY29sdW1uIG11c3QgY29udGFpbiBvcmlnaW5hbCBkYXRhIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocm93WzBdKSA9PSBzdHIsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocm93WzBdLmVuZHN3aXRoKCJyZWljaCIpLCAiY29sdW1uIG11c3QgY29udGFpbiBvcmlnaW5hbCBkYXRhIikKIAogICAgIGRlZiBDaGVja09wdGltaXplZFVuaWNvZGUoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IHNxbGl0ZS5PcHRpbWl6ZWRVbmljb2RlCkBAIC0xODMsOCArMTgzLDggQEAKICAgICAgICAgZ2VybWFueSA9ICJEZXV0Y2hsYW5kIgogICAgICAgICBhX3JvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQogICAgICAgICBkX3JvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGdlcm1hbnksKSkuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShhX3Jvd1swXSkgPT0gc3RyLCAidHlwZSBvZiBub24tQVNDSUkgcm93IG11c3QgYmUgc3RyIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoZF9yb3dbMF0pID09IHN0ciwgInR5cGUgb2YgQVNDSUktb25seSByb3cgbXVzdCBiZSBzdHIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShhX3Jvd1swXSkgPT0gc3RyLCAidHlwZSBvZiBub24tQVNDSUkgcm93IG11c3QgYmUgc3RyIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoZF9yb3dbMF0pID09IHN0ciwgInR5cGUgb2YgQVNDSUktb25seSByb3cgbXVzdCBiZSBzdHIiKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQppbmRleCBjMTVjN2JlLi5hNjE2MWZhIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKQEAgLTM3LDcgKzM3LDcgQEAKICAgICAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJYIiwgNDIpCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFR5cGVFcnJvciIpCiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInBhcmFtZXRlciBtdXN0IGJlIGNhbGxhYmxlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKQogCiAgICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90QXNjaWkoc2VsZik6CiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCkBAIC03NCw3ICs3NCw3IEBACiAgICAgICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXS5sb3dlcigpLCAibm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6IG15Y29sbCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXS5sb3dlcigpLCAibm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6IG15Y29sbCIpCiAKICAgICBkZWYgQ2hlY2tDb2xsYXRpb25SZWdpc3RlclR3aWNlKHNlbGYpOgogICAgICAgICAiIiIKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICBjb24uZXhlY3V0ZSgiIiIKICAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBmb28oYSwgYikKICAgICAgICAgICAgICIiIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHByb2dyZXNzX2NhbGxzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZ3Jlc3NfY2FsbHMpCiAKIAogICAgIGRlZiBDaGVja09wY29kZUNvdW50KHNlbGYpOgpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgICAgICAgICBjcmVhdGUgdGFibGUgYmFyIChhLCBiKQogICAgICAgICAgICAgIiIiKQogICAgICAgICBzZWNvbmRfY291bnQgPSBsZW4ocHJvZ3Jlc3NfY2FsbHMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaXJzdF9jb3VudCA+IHNlY29uZF9jb3VudCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpcnN0X2NvdW50ID4gc2Vjb25kX2NvdW50KQogCiAgICAgZGVmIENoZWNrQ2FuY2VsT3BlcmF0aW9uKHNlbGYpOgogICAgICAgICAiIiIKQEAgLTE3Myw3ICsxNzMsNyBAQAogICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEpCiAgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihOb25lLCAxKQogICAgICAgICBjb24uZXhlY3V0ZSgic2VsZWN0IDEgdW5pb24gc2VsZWN0IDIgdW5pb24gc2VsZWN0IDMiKS5mZXRjaGFsbCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFjdGlvbiwgMCwgInByb2dyZXNzIGhhbmRsZXIgd2FzIG5vdCBjbGVhcmVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24sIDAsICJwcm9ncmVzcyBoYW5kbGVyIHdhcyBub3QgY2xlYXJlZCIpCiAKIGRlZiBzdWl0ZSgpOgogICAgIGNvbGxhdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb2xsYXRpb25UZXN0cywgIkNoZWNrIikKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQppbmRleCBkMDU2YWFlLi4yZTYxYWNmIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CkBAIC02NSwxMCArNjUsMTAgQEAKICAgICBkZWYgQ2hlY2tDb2x1bW5OYW1lV2l0aFNwYWNlcyhzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoJ3NlbGVjdCAxIGFzICJmb28gYmFyIFtkYXRldGltZV0iJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAiZm9vIGJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAiZm9vIGJhciIpCiAKICAgICAgICAgY3VyLmV4ZWN1dGUoJ3NlbGVjdCAxIGFzICJmb28gYmF6IicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGN1ci5kZXNjcmlwdGlvblswXVswXSwgImZvbyBiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1ci5kZXNjcmlwdGlvblswXVswXSwgImZvbyBiYXoiKQogCiAgICAgZGVmIENoZWNrU3RhdGVtZW50QXZhaWxhYmxlKHNlbGYpOgogICAgICAgICAjIHB5c3FsaXRlIHVwIHRvIDIuMy4yIGNyYXNoZWQgb24gdGhpcywgYmVjYXVzZSB0aGUgYWN0aXZlIHN0YXRlbWVudCBoYW5kbGUgd2FzIG5vdCBjaGVja2VkCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5CmluZGV4IDBiNjE5M2IuLmM5ZjYxMjUgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5CkBAIC01OCwxNCArNTgsMTQgQEAKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0MihqKSIpCiAgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKIAogICAgIGRlZiBDaGVja0luc2VydFN0YXJ0c1RyYW5zYWN0aW9uKHNlbGYpOgogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKICAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCiAgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAwKQogCiAgICAgZGVmIENoZWNrVXBkYXRlU3RhcnRzVHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCkBAIC03NCw3ICs3NCw3IEBACiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJ1cGRhdGUgdGVzdCBzZXQgaT02IikKICAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCiAgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIDUpCiAKICAgICBkZWYgQ2hlY2tEZWxldGVTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQogICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCiAKICAgICBkZWYgQ2hlY2tSZXBsYWNlU3RhcnRzVHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCkBAIC05MiwyNCArOTIsMjQgQEAKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoInJlcGxhY2UgaW50byB0ZXN0KGkpIHZhbHVlcyAoNikiKQogICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1swXVswXSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMF1bMF0sIDUpCiAKICAgICBkZWYgQ2hlY2tUb2dnbGVBdXRvQ29tbWl0KHNlbGYpOgogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKICAgICAgICAgc2VsZi5jb24xLmlzb2xhdGlvbl9sZXZlbCA9IE5vbmUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jb24xLmlzb2xhdGlvbl9sZXZlbCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsLCBOb25lKQogICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCiAKICAgICAgICAgc2VsZi5jb24xLmlzb2xhdGlvbl9sZXZlbCA9ICJERUZFUlJFRCIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jb24xLmlzb2xhdGlvbl9sZXZlbCAsICJERUZFUlJFRCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb24xLmlzb2xhdGlvbl9sZXZlbCAsICJERUZFUlJFRCIpCiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQogICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCiAKICAgICBkZWYgQ2hlY2tSYWlzZVRpbWVvdXQoc2VsZik6CiAgICAgICAgIGlmIHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDIsIDIpOgpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKaW5kZXggYmRlMTY0NS4uOGIxZDc4MCAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CkBAIC0zOSwyNyArMzksMjcgQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChzKSB2YWx1ZXMgKD8pIiwgKCLWc3RlcnJlaWNoIiwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgcyBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgItZzdGVycmVpY2giKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgItZzdGVycmVpY2giKQogCiAgICAgZGVmIENoZWNrU21hbGxJbnQoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsICg0MiwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCA0MikKIAogICAgIGRlZiBDaGVja0xhcmdlSW50KHNlbGYpOgogICAgICAgICBudW0gPSAyKio0MAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAobnVtLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCBudW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBudW0pCiAKICAgICBkZWYgQ2hlY2tGbG9hdChzZWxmKToKICAgICAgICAgdmFsID0gMy4xNAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB2YWwpCiAKICAgICBkZWYgQ2hlY2tCbG9iKHNlbGYpOgogICAgICAgICBzYW1wbGUgPSBiIkd1Z2xodXBmIgpAQCAtNjcsMTIgKzY3LDEyIEBACiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsICh2YWwsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGIgZnJvbSB0ZXN0IikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIHNhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHNhbXBsZSkKIAogICAgIGRlZiBDaGVja1VuaWNvZGVFeGVjdXRlKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgJ9ZzdGVycmVpY2gnIikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sICLWc3RlcnJlaWNoIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICLWc3RlcnJlaWNoIikKIAogY2xhc3MgRGVjbFR5cGVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGNsYXNzIEZvbzoKQEAgLTEzMywxNCArMTMzLDE0IEBACiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QocykgdmFsdWVzICg/KSIsICgiZm9vIiwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgcyBhcyAicyBbV1JPTkddIiBmcm9tIHRlc3QnKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKIAogICAgIGRlZiBDaGVja1NtYWxsSW50KHNlbGYpOgogICAgICAgICAjIGRlZmF1bHQKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIDQyKQogCiAgICAgZGVmIENoZWNrTGFyZ2VJbnQoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdApAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsIChudW0sKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIG51bSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIG51bSkKIAogICAgIGRlZiBDaGVja0Zsb2F0KHNlbGYpOgogICAgICAgICAjIGN1c3RvbQpAQCAtMTU2LDIwICsxNTYsMjAgQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZiBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgNDcuMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIDQ3LjIpCiAKICAgICBkZWYgQ2hlY2tCb29sKHNlbGYpOgogICAgICAgICAjIGN1c3RvbQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGIpIHZhbHVlcyAoPykiLCAoRmFsc2UsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGIgZnJvbSB0ZXN0IikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgRmFsc2UpCiAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsIChUcnVlLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgVHJ1ZSkKIAogICAgIGRlZiBDaGVja1VuaWNvZGUoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdApAQCAtMTc3LDE0ICsxNzcsMTQgQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh1KSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdSBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgdmFsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdmFsKQogCiAgICAgZGVmIENoZWNrRm9vKHNlbGYpOgogICAgICAgICB2YWwgPSBEZWNsVHlwZXNUZXN0cy5Gb28oImJsYSIpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZm9vIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB2YWwpCiAKICAgICBkZWYgQ2hlY2tVbnN1cHBvcnRlZFNlcShzZWxmKToKICAgICAgICAgY2xhc3MgQmFyOiBwYXNzCkBAIC0yMTUsMjAgKzIxNSwyMCBAQAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGJpbikgdmFsdWVzICg/KSIsICh2YWwsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGJpbiBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgc2FtcGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgc2FtcGxlKQogCiAgICAgZGVmIENoZWNrTnVtYmVyMShzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuMSkgdmFsdWVzICg1KSIpCiAgICAgICAgIHZhbHVlID0gc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IG4xIGZyb20gdGVzdCIpLmZldGNob25lKClbMF0KICAgICAgICAgIyBpZiB0aGUgY29udmVydGVyIGlzIG5vdCB1c2VkLCBpdCdzIGFuIGludCBpbnN0ZWFkIG9mIGEgZmxvYXQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWx1ZSksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBmbG9hdCkKIAogICAgIGRlZiBDaGVja051bWJlcjIoc2VsZik6CiAgICAgICAgICIiIkNoZWNrcyB3ZXRoZXIgY29udmVydGVyIG5hbWVzIGFyZSBjdXQgb2ZmIGF0ICcoJyBjaGFyYWN0ZXJzIiIiCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobjIpIHZhbHVlcyAoNSkiKQogICAgICAgICB2YWx1ZSA9IHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBuMiBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpWzBdCiAgICAgICAgICMgaWYgdGhlIGNvbnZlcnRlciBpcyBub3QgdXNlZCwgaXQncyBhbiBpbnQgaW5zdGVhZCBvZiBhIGZsb2F0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsdWUpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgZmxvYXQpCiAKIGNsYXNzIENvbE5hbWVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTI1NywyOCArMjU3LDI4IEBACiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsICgieHh4IiwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgeCBmcm9tIHRlc3QiKQogICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgInh4eCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAieHh4IikKIAogICAgIGRlZiBDaGVja05vbmUoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsIChOb25lLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB4IGZyb20gdGVzdCIpCiAgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgTm9uZSkKIAogICAgIGRlZiBDaGVja0NvbE5hbWUoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsICgieHh4IiwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgeCBhcyAieCBbYmFyXSIgZnJvbSB0ZXN0JykKICAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsICI8eHh4PiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiPHh4eD4iKQogCiAgICAgICAgICMgQ2hlY2sgaWYgdGhlIHN0cmlwcGluZyBvZiBjb2xuYW1lcyB3b3Jrcy4gRXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QKICAgICAgICAgIyB3aGl0ZXNwYWNlIHNob3VsZCBiZSBzdHJpcHBlZC4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jdXIuZGVzY3JpcHRpb25bMF1bMF0sICJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1ci5kZXNjcmlwdGlvblswXVswXSwgIngiKQogCiAgICAgZGVmIENoZWNrQ2FzZUluQ29udmVydGVyTmFtZShzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ICdvdGhlcicgYXMgXCJ4IFtiMWIxXVwiIikKICAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsICJNQVJLRVIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgIk1BUktFUiIpCiAKICAgICBkZWYgQ2hlY2tDdXJzb3JEZXNjcmlwdGlvbk5vUm93KHNlbGYpOgogICAgICAgICAiIiIKQEAgLTMxMCw3ICszMTAsNyBAQAogICAgIGRlZiBDaGVja0Nhc3RlcklzVXNlZChzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoNCwpKQogICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBmbG9hdCkKIAogY2xhc3MgQmluYXJ5Q29udmVydGVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBjb252ZXJ0KHMpOgpAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgZGVmIENoZWNrQmluYXJ5SW5wdXRGb3JDb252ZXJ0ZXIoc2VsZik6CiAgICAgICAgIHRlc3RkYXRhID0gYiJhYmNkZWZnIiAqIDEwCiAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uLmV4ZWN1dGUoJ3NlbGVjdCA/IGFzICJ4IFtiaW5dIicsIChtZW1vcnl2aWV3KHpsaWIuY29tcHJlc3ModGVzdGRhdGEpKSwpKS5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRlc3RkYXRhLCByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGRhdGEsIHJlc3VsdCkKIAogY2xhc3MgRGF0ZVRpbWVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMzQ0LDE0ICszNDQsMTQgQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChkKSB2YWx1ZXMgKD8pIiwgKGQsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGQgZnJvbSB0ZXN0IikKICAgICAgICAgZDIgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGQsIGQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGQyKQogCiAgICAgZGVmIENoZWNrU3FsaXRlVGltZXN0YW1wKHNlbGYpOgogICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMiwgMTQsIDcsIDE1LCAwKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKD8pIiwgKHRzLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQogICAgICAgICB0czIgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRzLCB0czIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMsIHRzMikKIAogICAgIGRlZiBDaGVja1NxbFRpbWVzdGFtcChzZWxmKToKICAgICAgICAgIyBUaGUgZGF0ZSBmdW5jdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIFNRTGl0ZSB2ZXJzaW9uIDMuMSBvciBsYXRlcgpAQCAtMzYzLDIyICszNjMsMjIgQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzIChjdXJyZW50X3RpbWVzdGFtcCkiKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdHMgZnJvbSB0ZXN0IikKICAgICAgICAgdHMgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodHMpLCBkYXRldGltZS5kYXRldGltZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHMueWVhciwgbm93LnllYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh0cyksIGRhdGV0aW1lLmRhdGV0aW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLnllYXIsIG5vdy55ZWFyKQogCiAgICAgZGVmIENoZWNrRGF0ZVRpbWVTdWJTZWNvbmRzKHNlbGYpOgogICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMiwgMTQsIDcsIDE1LCAwLCA1MDAwMDApCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoPykiLCAodHMsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCiAgICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHMsIHRzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cywgdHMyKQogCiAgICAgZGVmIENoZWNrRGF0ZVRpbWVTdWJTZWNvbmRzRmxvYXRpbmdQb2ludChzZWxmKToKICAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wKDIwMDQsIDIsIDE0LCA3LCAxNSwgMCwgNTEwMjQxKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKD8pIiwgKHRzLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQogICAgICAgICB0czIgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRzLCB0czIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMsIHRzMikKIAogZGVmIHN1aXRlKCk6CiAgICAgc3FsaXRlX3R5cGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoU3FsaXRlVHlwZVRlc3RzLCAiQ2hlY2siKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CmluZGV4IGMxNjU0MjMuLjhiZmM1OTEgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKQEAgLTE2MSwyOCArMTYxLDI4IEBACiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJudGV4dCgpIikKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBzdHIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiZm9vIikKIAogICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5Vbmljb2RlKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnVuaWNvZGUoKSIpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgc3RyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsICJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgImJhciIpCiAKICAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuSW50KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmludCgpIikKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBpbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCA0MikKIAogICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5GbG9hdChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5mbG9hdCgpIikKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQogICAgICAgICBpZiB2YWwgPCAzLjEzOSBvciB2YWwgPiAzLjE0MToKICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgdmFsdWUiKQogCkBAIC0xOTAsMTUgKzE5MCwxNSBAQAogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybm51bGwoKSIpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgdHlwZShOb25lKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgdHlwZShOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIE5vbmUpCiAKICAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuQmxvYihzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5ibG9iKCkiKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIGJ5dGVzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIGIiYmxvYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBieXRlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIGIiYmxvYiIpCiAKICAgICBkZWYgQ2hlY2tGdW5jRXhjZXB0aW9uKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQpAQCAtMjA3LDM3ICsyMDcsMzcgQEAKICAgICAgICAgICAgIGN1ci5mZXRjaG9uZSgpCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yIGFzIGU6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICd1c2VyLWRlZmluZWQgZnVuY3Rpb24gcmFpc2VkIGV4Y2VwdGlvbicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgJ3VzZXItZGVmaW5lZCBmdW5jdGlvbiByYWlzZWQgZXhjZXB0aW9uJykKIAogICAgIGRlZiBDaGVja1BhcmFtU3RyaW5nKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzc3RyaW5nKD8pIiwgKCJmb28iLCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKICAgICBkZWYgQ2hlY2tQYXJhbUludChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2ludCg/KSIsICg0MiwpKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQogCiAgICAgZGVmIENoZWNrUGFyYW1GbG9hdChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Zsb2F0KD8pIiwgKDMuMTQsKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKIAogICAgIGRlZiBDaGVja1BhcmFtTm9uZShzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc25vbmUoPykiLCAoTm9uZSwpKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQogCiAgICAgZGVmIENoZWNrUGFyYW1CbG9iKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzYmxvYig/KSIsIChtZW1vcnl2aWV3KGIiYmxvYiIpLCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKIGNsYXNzIEFnZ3JlZ2F0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CkBAIC0yODEsNyArMjgxLDcgQEAKICAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9zdGVwKHQpIGZyb20gdGVzdCIpCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBBdHRyaWJ1dGVFcnJvciIpCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciBhcyBlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAiJ0FnZ3JOb1N0ZXAnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzdGVwJyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgIidBZ2dyTm9TdGVwJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc3RlcCciKQogCiAgICAgZGVmIENoZWNrQWdnck5vRmluYWxpemUoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCkBAIC0yOTAsNyArMjkwLDcgQEAKICAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yIGFzIGU6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIpCiAKICAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5Jbml0KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQpAQCAtMjk5LDcgKzI5OSw3IEBACiAgICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciBhcyBlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdfX2luaXRfXycgbWV0aG9kIHJhaXNlZCBlcnJvciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnX19pbml0X18nIG1ldGhvZCByYWlzZWQgZXJyb3IiKQogCiAgICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluU3RlcChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKQEAgLTMwOCw3ICszMDgsNyBAQAogICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnc3RlcCcgbWV0aG9kIHJhaXNlZCBlcnJvciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnc3RlcCcgbWV0aG9kIHJhaXNlZCBlcnJvciIpCiAKICAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZShzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKQEAgLTMxNywzNyArMzE3LDM3IEBACiAgICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciBhcyBlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQogCiAgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1TdHIoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdzdHInLCA/KSIsICgiZm9vIiwpKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQogCiAgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1JbnQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdpbnQnLCA/KSIsICg0MiwpKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQogCiAgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1GbG9hdChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2Zsb2F0JywgPykiLCAoMy4xNCwpKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQogCiAgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1Ob25lKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnTm9uZScsID8pIiwgKE5vbmUsKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKIAogICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtQmxvYihzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2Jsb2InLCA/KSIsIChtZW1vcnl2aWV3KGIiYmxvYiIpLCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKICAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tBZ2dyU3VtKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQpAQCAtMzU1LDcgKzM1NSw3IEBACiAgICAgICAgIGN1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgWygxMCwpLCAoMjAsKSwgKDMwLCldKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG15c3VtKGkpIGZyb20gdGVzdCIpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgNjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCA2MCkKIAogZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CiAgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgpkaWZmIC0tZ2l0IGEvTGliL3N1YnByb2Nlc3MucHkgYi9MaWIvc3VicHJvY2Vzcy5weQppbmRleCAzNjhiYTBlLi5mNzM2MWUxIDEwMDY0NAotLS0gYS9MaWIvc3VicHJvY2Vzcy5weQorKysgYi9MaWIvc3VicHJvY2Vzcy5weQpAQCAtMzcxLDYgKzM3MSw3IEBACiAgICAgICAgICAgICBlcnJvciA9IElPRXJyb3IKIGVsc2U6CiAgICAgaW1wb3J0IHNlbGVjdAorICAgIF9oYXNfcG9sbCA9IGhhc2F0dHIoc2VsZWN0LCAncG9sbCcpCiAgICAgaW1wb3J0IGVycm5vCiAgICAgaW1wb3J0IGZjbnRsCiAgICAgaW1wb3J0IHBpY2tsZQpAQCAtMzgzLDYgKzM4NCwxMSBAQAogZXhjZXB0OgogICAgIE1BWEZEID0gMjU2CiAKKyMgV2hlbiBzZWxlY3Qgb3IgcG9sbCBoYXMgaW5kaWNhdGVkIHRoYXQgdGhlIGZpbGUgaXMgd3JpdGFibGUsCisjIHdlIGNhbiB3cml0ZSB1cCB0byBfUElQRV9CVUYgYnl0ZXMgd2l0aG91dCByaXNrIG9mIGJsb2NraW5nLgorIyBQT1NJWCBkZWZpbmVzIFBJUEVfQlVGIGFzID49IDUxMi4KK19QSVBFX0JVRiA9IGdldGF0dHIoc2VsZWN0LCAnUElQRV9CVUYnLCA1MTIpCisKIF9hY3RpdmUgPSBbXQogCiBkZWYgX2NsZWFudXAoKToKQEAgLTExNzMsMTkgKzExNzksMTAzIEBACiAKIAogICAgICAgICBkZWYgX2NvbW11bmljYXRlKHNlbGYsIGlucHV0KToKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW46CisgICAgICAgICAgICAgICAgIyBGbHVzaCBzdGRpbyBidWZmZXIuICBUaGlzIG1pZ2h0IGJsb2NrLCBpZiB0aGUgdXNlciBoYXMKKyAgICAgICAgICAgICAgICAjIGJlZW4gd3JpdGluZyB0byAuc3RkaW4gaW4gYW4gdW5jb250cm9sbGVkIGZhc2hpb24uCisgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5mbHVzaCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGlucHV0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLmNsb3NlKCkKKworICAgICAgICAgICAgaWYgX2hhc19wb2xsOgorICAgICAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gc2VsZi5fY29tbXVuaWNhdGVfd2l0aF9wb2xsKGlucHV0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHNlbGYuX2NvbW11bmljYXRlX3dpdGhfc2VsZWN0KGlucHV0KQorCisgICAgICAgICAgICAjIEFsbCBkYXRhIGV4Y2hhbmdlZC4gIFRyYW5zbGF0ZSBsaXN0cyBpbnRvIHN0cmluZ3MuCisgICAgICAgICAgICBpZiBzdGRvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3Rkb3V0ID0gYicnLmpvaW4oc3Rkb3V0KQorICAgICAgICAgICAgaWYgc3RkZXJyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN0ZGVyciA9IGInJy5qb2luKHN0ZGVycikKKworICAgICAgICAgICAgIyBUcmFuc2xhdGUgbmV3bGluZXMsIGlmIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICMgVGhpcyBhbHNvIHR1cm5zIGJ5dGVzIGludG8gc3RyaW5ncy4KKyAgICAgICAgICAgIGlmIHNlbGYudW5pdmVyc2FsX25ld2xpbmVzOgorICAgICAgICAgICAgICAgIGlmIHN0ZG91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc2VsZi5fdHJhbnNsYXRlX25ld2xpbmVzKHN0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LmVuY29kaW5nKQorICAgICAgICAgICAgICAgIGlmIHN0ZGVyciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyID0gc2VsZi5fdHJhbnNsYXRlX25ld2xpbmVzKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyLmVuY29kaW5nKQorCisgICAgICAgICAgICBzZWxmLndhaXQoKQorICAgICAgICAgICAgcmV0dXJuIChzdGRvdXQsIHN0ZGVycikKKworCisgICAgICAgIGRlZiBfY29tbXVuaWNhdGVfd2l0aF9wb2xsKHNlbGYsIGlucHV0KToKKyAgICAgICAgICAgIHN0ZG91dCA9IE5vbmUgIyBSZXR1cm4KKyAgICAgICAgICAgIHN0ZGVyciA9IE5vbmUgIyBSZXR1cm4KKyAgICAgICAgICAgIGZkMmZpbGUgPSB7fQorICAgICAgICAgICAgZmQyb3V0cHV0ID0ge30KKworICAgICAgICAgICAgcG9sbGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICAgICAgZGVmIHJlZ2lzdGVyX2FuZF9hcHBlbmQoZmlsZV9vYmosIGV2ZW50bWFzayk6CisgICAgICAgICAgICAgICAgcG9sbGVyLnJlZ2lzdGVyKGZpbGVfb2JqLmZpbGVubygpLCBldmVudG1hc2spCisgICAgICAgICAgICAgICAgZmQyZmlsZVtmaWxlX29iai5maWxlbm8oKV0gPSBmaWxlX29iagorCisgICAgICAgICAgICBkZWYgY2xvc2VfdW5yZWdpc3Rlcl9hbmRfcmVtb3ZlKGZkKToKKyAgICAgICAgICAgICAgICBwb2xsZXIudW5yZWdpc3RlcihmZCkKKyAgICAgICAgICAgICAgICBmZDJmaWxlW2ZkXS5jbG9zZSgpCisgICAgICAgICAgICAgICAgZmQyZmlsZS5wb3AoZmQpCisKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW4gYW5kIGlucHV0OgorICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2FuZF9hcHBlbmQoc2VsZi5zdGRpbiwgc2VsZWN0LlBPTExPVVQpCisKKyAgICAgICAgICAgIHNlbGVjdF9QT0xMSU5fUE9MTFBSSSA9IHNlbGVjdC5QT0xMSU4gfCBzZWxlY3QuUE9MTFBSSQorICAgICAgICAgICAgaWYgc2VsZi5zdGRvdXQ6CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJfYW5kX2FwcGVuZChzZWxmLnN0ZG91dCwgc2VsZWN0X1BPTExJTl9QT0xMUFJJKQorICAgICAgICAgICAgICAgIGZkMm91dHB1dFtzZWxmLnN0ZG91dC5maWxlbm8oKV0gPSBzdGRvdXQgPSBbXQorICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJfYW5kX2FwcGVuZChzZWxmLnN0ZGVyciwgc2VsZWN0X1BPTExJTl9QT0xMUFJJKQorICAgICAgICAgICAgICAgIGZkMm91dHB1dFtzZWxmLnN0ZGVyci5maWxlbm8oKV0gPSBzdGRlcnIgPSBbXQorCisgICAgICAgICAgICBpbnB1dF9vZmZzZXQgPSAwCisgICAgICAgICAgICB3aGlsZSBmZDJmaWxlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVhZHkgPSBwb2xsZXIucG9sbCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IHNlbGVjdC5lcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gPT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgICAgICAgICAgIyBYWFggUmV3cml0ZSB0aGVzZSB0byB1c2Ugbm9uLWJsb2NraW5nIEkvTyBvbiB0aGUKKyAgICAgICAgICAgICAgICAjIGZpbGUgb2JqZWN0czsgdGhleSBhcmUgbm8gbG9uZ2VyIHVzaW5nIEMgc3RkaW8hCisKKyAgICAgICAgICAgICAgICBmb3IgZmQsIG1vZGUgaW4gcmVhZHk6CisgICAgICAgICAgICAgICAgICAgIGlmIG1vZGUgJiBzZWxlY3QuUE9MTE9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rID0gaW5wdXRbaW5wdXRfb2Zmc2V0IDogaW5wdXRfb2Zmc2V0ICsgX1BJUEVfQlVGXQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfb2Zmc2V0ICs9IG9zLndyaXRlKGZkLCBjaHVuaykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlucHV0X29mZnNldCA+PSBsZW4oaW5wdXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX3VucmVnaXN0ZXJfYW5kX3JlbW92ZShmZCkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBtb2RlICYgc2VsZWN0X1BPTExJTl9QT0xMUFJJOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG9zLnJlYWQoZmQsIDQwOTYpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV91bnJlZ2lzdGVyX2FuZF9yZW1vdmUoZmQpCisgICAgICAgICAgICAgICAgICAgICAgICBmZDJvdXRwdXRbZmRdLmFwcGVuZChkYXRhKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBJZ25vcmUgaGFuZyB1cCBvciBlcnJvcnMuCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV91bnJlZ2lzdGVyX2FuZF9yZW1vdmUoZmQpCisKKyAgICAgICAgICAgIHJldHVybiAoc3Rkb3V0LCBzdGRlcnIpCisKKworICAgICAgICBkZWYgX2NvbW11bmljYXRlX3dpdGhfc2VsZWN0KHNlbGYsIGlucHV0KToKICAgICAgICAgICAgIHJlYWRfc2V0ID0gW10KICAgICAgICAgICAgIHdyaXRlX3NldCA9IFtdCiAgICAgICAgICAgICBzdGRvdXQgPSBOb25lICMgUmV0dXJuCiAgICAgICAgICAgICBzdGRlcnIgPSBOb25lICMgUmV0dXJuCiAKLSAgICAgICAgICAgIGlmIHNlbGYuc3RkaW46Ci0gICAgICAgICAgICAgICAgIyBGbHVzaCBzdGRpbyBidWZmZXIuICBUaGlzIG1pZ2h0IGJsb2NrLCBpZiB0aGUgdXNlciBoYXMKLSAgICAgICAgICAgICAgICAjIGJlZW4gd3JpdGluZyB0byAuc3RkaW4gaW4gYW4gdW5jb250cm9sbGVkIGZhc2hpb24uCi0gICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5mbHVzaCgpCi0gICAgICAgICAgICAgICAgaWYgaW5wdXQ6Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX3NldC5hcHBlbmQoc2VsZi5zdGRpbikKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW4gYW5kIGlucHV0OgorICAgICAgICAgICAgICAgIHdyaXRlX3NldC5hcHBlbmQoc2VsZi5zdGRpbikKICAgICAgICAgICAgIGlmIHNlbGYuc3Rkb3V0OgogICAgICAgICAgICAgICAgIHJlYWRfc2V0LmFwcGVuZChzZWxmLnN0ZG91dCkKICAgICAgICAgICAgICAgICBzdGRvdXQgPSBbXQpAQCAtMTIwNiwxMCArMTI5Niw3IEBACiAgICAgICAgICAgICAgICAgIyBmaWxlIG9iamVjdHM7IHRoZXkgYXJlIG5vIGxvbmdlciB1c2luZyBDIHN0ZGlvIQogCiAgICAgICAgICAgICAgICAgaWYgc2VsZi5zdGRpbiBpbiB3bGlzdDoKLSAgICAgICAgICAgICAgICAgICAgIyBXaGVuIHNlbGVjdCBoYXMgaW5kaWNhdGVkIHRoYXQgdGhlIGZpbGUgaXMgd3JpdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICMgd2UgY2FuIHdyaXRlIHVwIHRvIFBJUEVfQlVGIGJ5dGVzIHdpdGhvdXQgcmlzawotICAgICAgICAgICAgICAgICAgICAjIGJsb2NraW5nLiAgUE9TSVggZGVmaW5lcyBQSVBFX0JVRiA+PSA1MTIKLSAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBpbnB1dFtpbnB1dF9vZmZzZXQgOiBpbnB1dF9vZmZzZXQgKyA1MTJdCisgICAgICAgICAgICAgICAgICAgIGNodW5rID0gaW5wdXRbaW5wdXRfb2Zmc2V0IDogaW5wdXRfb2Zmc2V0ICsgX1BJUEVfQlVGXQogICAgICAgICAgICAgICAgICAgICBieXRlc193cml0dGVuID0gb3Mud3JpdGUoc2VsZi5zdGRpbi5maWxlbm8oKSwgY2h1bmspCiAgICAgICAgICAgICAgICAgICAgIGlucHV0X29mZnNldCArPSBieXRlc193cml0dGVuCiAgICAgICAgICAgICAgICAgICAgIGlmIGlucHV0X29mZnNldCA+PSBsZW4oaW5wdXQpOgpAQCAtMTIzMCwyNSArMTMxNyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3NldC5yZW1vdmUoc2VsZi5zdGRlcnIpCiAgICAgICAgICAgICAgICAgICAgIHN0ZGVyci5hcHBlbmQoZGF0YSkKIAotICAgICAgICAgICAgIyBBbGwgZGF0YSBleGNoYW5nZWQuICBUcmFuc2xhdGUgbGlzdHMgaW50byBzdHJpbmdzLgotICAgICAgICAgICAgaWYgc3Rkb3V0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHN0ZG91dCA9IGIiIi5qb2luKHN0ZG91dCkKLSAgICAgICAgICAgIGlmIHN0ZGVyciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBzdGRlcnIgPSBiIiIuam9pbihzdGRlcnIpCi0KLSAgICAgICAgICAgICMgVHJhbnNsYXRlIG5ld2xpbmVzLCBpZiByZXF1ZXN0ZWQuCi0gICAgICAgICAgICAjIFRoaXMgYWxzbyB0dXJucyBieXRlcyBpbnRvIHN0cmluZ3MuCi0gICAgICAgICAgICBpZiBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lczoKLSAgICAgICAgICAgICAgICBpZiBzdGRvdXQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHN0ZG91dCA9IHNlbGYuX3RyYW5zbGF0ZV9uZXdsaW5lcyhzdGRvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5lbmNvZGluZykKLSAgICAgICAgICAgICAgICBpZiBzdGRlcnIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHN0ZGVyciA9IHNlbGYuX3RyYW5zbGF0ZV9uZXdsaW5lcyhzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyci5lbmNvZGluZykKLQotICAgICAgICAgICAgc2VsZi53YWl0KCkKICAgICAgICAgICAgIHJldHVybiAoc3Rkb3V0LCBzdGRlcnIpCiAKKwogICAgICAgICBkZWYgc2VuZF9zaWduYWwoc2VsZiwgc2lnKToKICAgICAgICAgICAgICIiIlNlbmQgYSBzaWduYWwgdG8gdGhlIHByb2Nlc3MKICAgICAgICAgICAgICIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weSBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKaW5kZXggN2FlMzRhOS4uM2RkNGY2ZCAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CkBAIC0yNzIsNiArMjcyLDEyIEBACiAgICAgICAgICAgICBhLAogICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzo6LTFdKzIqc2VsZi5leGFtcGxlKQogICAgICAgICApCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGEgKz0gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSArIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgKQogCiAgICAgICAgIGIgPSBhcnJheS5hcnJheShzZWxmLmJhZHR5cGVjb2RlKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX2FkZF9fLCBiKQpAQCAtNjY3LDYgKzY3MywxMyBAQAogICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlK3NlbGYuZXhhbXBsZVs6Oi0xXSkKICAgICAgICAgKQogCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGEuZXh0ZW5kKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlK3NlbGYuZXhhbXBsZSkKKyAgICAgICAgKQorCiAgICAgICAgIGIgPSBhcnJheS5hcnJheShzZWxmLmJhZHR5cGVjb2RlKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5leHRlbmQsIGIpCiAKQEAgLTc0OSw5ICs3NjIsMzEgQEAKICAgICAgICAgQXJyYXlTdWJjbGFzc1dpdGhLd2FyZ3MoJ2InLCBuZXdhcmc9MSkKIAogICAgIGRlZiB0ZXN0X2NyZWF0ZV9mcm9tX2J5dGVzKHNlbGYpOgorICAgICAgICAjIFhYWCBUaGlzIHRlc3QgcHJvYmFibHkgbmVlZHMgdG8gYmUgbW92ZWQgaW4gYSBzdWJjbGFzcyBvcgorICAgICAgICAjIGdlbmVyYWxpemVkIHRvIHVzZSBzZWxmLnR5cGVjb2RlLgogICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ0gnLCBiIjEyMzQiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhKSAqIGEuaXRlbXNpemUsIDQpCiAKKyAgICBkZWYgdGVzdF9tZW1vcnl2aWV3X25vX3Jlc2l6ZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBpc3N1ZSA0NTA5LgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBtID0gbWVtb3J5dmlldyhhKQorICAgICAgICBleHBlY3RlZCA9IG0udG9ieXRlcygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJ1ZmZlckVycm9yLCBhLnBvcCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRvYnl0ZXMoKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJ1ZmZlckVycm9yLCBhLnJlbW92ZSwgYVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRvYnl0ZXMoKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJ1ZmZlckVycm9yLCBhLl9fc2V0aXRlbV9fLCBzbGljZSgwLCAwKSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRvYnl0ZXMoKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJ1ZmZlckVycm9yLCBhLl9fZGVsaXRlbV9fLCBzbGljZSgwLCBsZW4oYSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udG9ieXRlcygpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVmZmVyRXJyb3IsIGEuX19pbXVsX18sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS50b2J5dGVzKCksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCdWZmZXJFcnJvciwgYS5fX2lhZGRfXywgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRvYnl0ZXMoKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJ1ZmZlckVycm9yLCBhLmV4dGVuZCwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRvYnl0ZXMoKSwgZXhwZWN0ZWQpCisKIAogY2xhc3MgU3RyaW5nVGVzdChCYXNlVGVzdCk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGtndXRpbC5weSBiL0xpYi90ZXN0L3Rlc3RfcGtndXRpbC5weQppbmRleCAxNjllZjY2Li5mNjlhZjVhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BrZ3V0aWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wa2d1dGlsLnB5CkBAIC03NCw2ICs3NCwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlczEsIFJFU09VUkNFX0RBVEEpCiAgICAgICAgIHJlczIgPSBwa2d1dGlsLmdldF9kYXRhKHBrZywgJ3N1Yi9yZXMudHh0JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMyLCBSRVNPVVJDRV9EQVRBKQorCisgICAgICAgIG5hbWVzID0gW10KKyAgICAgICAgZm9yIGxvYWRlciwgbmFtZSwgaXNwa2cgaW4gcGtndXRpbC5pdGVyX21vZHVsZXMoW3ppcF9maWxlXSk6CisgICAgICAgICAgICBuYW1lcy5hcHBlbmQobmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lcywgWyd0ZXN0X2dldGRhdGFfemlwZmlsZSddKQorCiAgICAgICAgIGRlbCBzeXMucGF0aFswXQogCiAgICAgICAgIGRlbCBzeXMubW9kdWxlc1twa2ddCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKaW5kZXggMzI2Yzk5Ni4uZjJhMzk2YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQpAQCAtNzk4LDggKzc5OCwyNCBAQAogICAgICAgICAgICAgICAgIGlmIGRpciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlyKQogCisKK3VuaXRfdGVzdHMgPSBbUHJvY2Vzc1Rlc3RDYXNlLCBDb21tYW5kVGVzdHNdCisKK2lmIHN1YnByb2Nlc3MuX2hhc19wb2xsOgorICAgIGNsYXNzIFByb2Nlc3NUZXN0Q2FzZU5vUG9sbChQcm9jZXNzVGVzdENhc2UpOgorICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICBzdWJwcm9jZXNzLl9oYXNfcG9sbCA9IEZhbHNlCisgICAgICAgICAgICBQcm9jZXNzVGVzdENhc2Uuc2V0VXAoc2VsZikKKworICAgICAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICAgICBzdWJwcm9jZXNzLl9oYXNfcG9sbCA9IFRydWUKKyAgICAgICAgICAgIFByb2Nlc3NUZXN0Q2FzZS50ZWFyRG93bihzZWxmKQorCisgICAgdW5pdF90ZXN0cy5hcHBlbmQoUHJvY2Vzc1Rlc3RDYXNlTm9Qb2xsKQorCisKIGRlZiB0ZXN0X21haW4oKToKLSAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChQcm9jZXNzVGVzdENhc2UsIENvbW1hbmRUZXN0cykKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgqdW5pdF90ZXN0cykKICAgICBzdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTWlzYy9ORVdTIGIvTWlzYy9ORVdTCmluZGV4IGNkOWFjNjYuLjNkZTE1NTcgMTAwNjQ0Ci0tLSBhL01pc2MvTkVXUworKysgYi9NaXNjL05FV1MKQEAgLTkyLDEwICs5MiwyMyBAQAogLSBJc3N1ZSAjNjMyMzogVGhlIHBkYiBkZWJ1Z2dlciBkaWQgbm90IGV4aXQgd2hlbiBydW5uaW5nIGEgc2NyaXB0IHdpdGggYQogc3ludGF4IGVycm9yLgogCistIElzc3VlICMzMzkyOiBUaGUgc3VicHJvY2VzcyBjb21tdW5pY2F0ZSgpIG1ldGhvZCBubyBsb25nZXIgZmFpbHMgaW4gc2VsZWN0KCkKKyAgd2hlbiBmaWxlIGRlc2NyaXB0b3JzIGFyZSBsYXJnZTsgY29tbXVuaWNhdGUoKSBub3cgdXNlcyBwb2xsKCkgd2hlbiBwb3NzaWJsZS4KKwogLSBJc3N1ZSAjNjM2OTogRml4IGFuIFJMRSBkZWNvbXByZXNzaW9uIGJ1ZyBpbiB0aGUgYmluaGV4IG1vZHVsZS4KIAogLSBJc3N1ZSAjNjM0NDogRml4ZWQgYSBjcmFzaCBvZiBtbWFwLnJlYWQoKSB3aGVuIHBhc3NlZCBhIG5lZ2F0aXZlIGFyZ3VtZW50LgogCistIElzc3VlICM0MDA1OiBGaXhlZCBhIGNyYXNoIG9mIHB5ZG9jIHdoZW4gdGhlcmUgd2FzIGEgemlwIGZpbGUgcHJlc2VudCBpbgorICBzeXMucGF0aC4KKworRXh0ZW5zaW9uIE1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzQ1MDk6IGFycmF5LmFycmF5IG9iamVjdHMgYXJlIG5vIGxvbmdlciBtb2RpZmllZCBhZnRlciBhbiBvcGVyYXRpb24KKyAgZmFpbGluZyBkdWUgdG8gdGhlIHJlc2l6ZSByZXN0cmljdGlvbiBpbi1wbGFjZSB3aGVuIHRoZSBvYmplY3QgaGFzIGV4cG9ydGVkCisgIGJ1ZmZlcnMuCisKIEJ1aWxkCiAtLS0tLQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2FycmF5bW9kdWxlLmMgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKaW5kZXggNTk2NWNkZC4uYzFhMGY1MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jCisrKyBiL01vZHVsZXMvYXJyYXltb2R1bGUuYwpAQCAtNzM1LDYgKzczNSwxNCBAQAogCQlpaGlnaCA9IFB5X1NJWkUoYSk7CiAJaXRlbSA9IGEtPm9iX2l0ZW07CiAJZCA9IG4gLSAoaWhpZ2gtaWxvdyk7CisJLyogSXNzdWUgIzQ1MDk6IElmIHRoZSBhcnJheSBoYXMgZXhwb3J0ZWQgYnVmZmVycyBhbmQgdGhlIHNsaWNlCisJICAgYXNzaWdubWVudCB3b3VsZCBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGFycmF5LCBmYWlsIGVhcmx5IHRvIG1ha2UKKwkgICBzdXJlIHdlIGRvbid0IG1vZGlmeSBpdC4gKi8KKwlpZiAoZCAhPSAwICYmIGEtPm9iX2V4cG9ydHMgPiAwKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19CdWZmZXJFcnJvciwgCisJCQkiY2Fubm90IHJlc2l6ZSBhbiBhcnJheSB0aGF0IGlzIGV4cG9ydGluZyBidWZmZXJzIik7CisJCXJldHVybiAtMTsKKwl9CiAJaWYgKGQgPCAwKSB7IC8qIERlbGV0ZSAtZCBpdGVtcyAqLwogCQltZW1tb3ZlKGl0ZW0gKyAoaWhpZ2grZCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAogCQkJaXRlbSArIGloaWdoKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKQEAgLTgwMiw4ICs4MTAsOCBAQAogc3RhdGljIGludAogYXJyYXlfZG9fZXh0ZW5kKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYmIpCiB7Ci0JUHlfc3NpemVfdCBzaXplLCBvbGRzaXplOwotCisJUHlfc3NpemVfdCBzaXplLCBvbGRzaXplLCBiYnNpemU7CisJCiAJaWYgKCFhcnJheV9DaGVjayhiYikpCiAJCXJldHVybiBhcnJheV9pdGVyX2V4dGVuZChzZWxmLCBiYik7CiAjZGVmaW5lIGIgKChhcnJheW9iamVjdCAqKWJiKQpAQCAtODE4LDExICs4MjYsMTMgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAlvbGRzaXplID0gUHlfU0laRShzZWxmKTsKKwkvKiBHZXQgdGhlIHNpemUgb2YgYmIgYmVmb3JlIHJlc2l6aW5nIHRoZSBhcnJheSBzaW5jZSBiYiBjb3VsZCBiZSBzZWxmLiAqLworCWJic2l6ZSA9IFB5X1NJWkUoYmIpOwogCXNpemUgPSBvbGRzaXplICsgUHlfU0laRShiKTsKIAlpZiAoYXJyYXlfcmVzaXplKHNlbGYsIHNpemUpID09IC0xKQogCQlyZXR1cm4gLTE7CiAJbWVtY3B5KHNlbGYtPm9iX2l0ZW0gKyBvbGRzaXplICogc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplLAotCQliLT5vYl9pdGVtLCBQeV9TSVpFKGIpICogYi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKwkJYi0+b2JfaXRlbSwgYmJzaXplICogYi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKIAogCXJldHVybiAwOwogI3VuZGVmIGIK