IyAtKi0gY29kaW5nOiBpc28tODg1OS0xNSAtKi0NCg0KaW1wb3J0IHN5cw0KaW1wb3J0IG9zDQppbXBvcnQgc2h1dGlsDQppbXBvcnQgU3RyaW5nSU8NCmZyb20gaGFzaGxpYiBpbXBvcnQgbWQ1DQppbXBvcnQgZXJybm8NCg0KaW1wb3J0IHVuaXR0ZXN0DQppbXBvcnQgdGFyZmlsZQ0KDQpmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydA0KDQojIENoZWNrIGZvciBvdXIgY29tcHJlc3Npb24gbW9kdWxlcy4NCnRyeToNCiAgICBpbXBvcnQgZ3ppcA0KICAgIGd6aXAuR3ppcEZpbGUNCmV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToNCiAgICBnemlwID0gTm9uZQ0KdHJ5Og0KICAgIGltcG9ydCBiejINCmV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICBiejIgPSBOb25lDQoNCmRlZiBtZDVzdW0oZGF0YSk6DQogICAgcmV0dXJuIG1kNShkYXRhKS5oZXhkaWdlc3QoKQ0KDQpURU1QRElSID0gb3MucGF0aC5hYnNwYXRoKHRlc3Rfc3VwcG9ydC5URVNURk4pDQp0YXJuYW1lID0gdGVzdF9zdXBwb3J0LmZpbmRmaWxlKCJ0ZXN0dGFyLnRhciIpDQpnemlwbmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHRhci50YXIuZ3oiKQ0KYnoybmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHRhci50YXIuYnoyIikNCnRtcG5hbWUgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRtcC50YXIiKQ0KDQptZDVfcmVndHlwZSA9ICI2NWY0NzdjODE4YWQ5ZTE1ZjdmZWFiMGM2ZDM3NzQyZiINCm1kNV9zcGFyc2UgPSAiYTU0ZmJjNGNhNGY0Mzk5YTkwZTFiMjcxNjQwMTJmYzYiDQoNCg0KY2xhc3MgUmVhZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOg0KDQogICAgdGFybmFtZSA9IHRhcm5hbWUNCiAgICBtb2RlID0gInI6Ig0KDQogICAgZGVmIHNldFVwKHNlbGYpOg0KICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIG1vZGU9c2VsZi5tb2RlLCBlbmNvZGluZz0iaXNvODg1OS0xIikNCg0KICAgIGRlZiB0ZWFyRG93bihzZWxmKToNCiAgICAgICAgc2VsZi50YXIuY2xvc2UoKQ0KDQoNCmNsYXNzIFVzdGFyUmVhZFRlc3QoUmVhZFRlc3QpOg0KDQogICAgZGVmIHRlc3RfZmlsZW9ial9yZWd1bGFyX2ZpbGUoc2VsZik6DQogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3JlZ3R5cGUiKQ0KICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykNCiAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpDQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgobGVuKGRhdGEpLCBtZDVzdW0oZGF0YSkpID09ICh0YXJpbmZvLnNpemUsIG1kNV9yZWd0eXBlKSwNCiAgICAgICAgICAgICAgICAicmVndWxhciBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikNCg0KICAgIGRlZiB0ZXN0X2ZpbGVvYmpfcmVhZGxpbmVzKHNlbGYpOg0KICAgICAgICBzZWxmLnRhci5leHRyYWN0KCJ1c3Rhci9yZWd0eXBlIiwgVEVNUERJUikNCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpDQogICAgICAgIGZvYmoxID0gb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3JlZ3R5cGUiKSwgInJVIikNCiAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQ0KDQogICAgICAgIGxpbmVzMSA9IGZvYmoxLnJlYWRsaW5lcygpDQogICAgICAgIGxpbmVzMiA9IGZvYmoyLnJlYWRsaW5lcygpDQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lczEgPT0gbGluZXMyLA0KICAgICAgICAgICAgICAgICJmaWxlb2JqLnJlYWRsaW5lcygpIGZhaWxlZCIpDQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obGluZXMyKSA9PSAxMTQsDQogICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzMls4M10gPT0NCiAgICAgICAgICAgICAgICAiSSB3aWxsIGdsYWRseSBhZG1pdCB0aGF0IFB5dGhvbiBpcyBub3QgdGhlIGZhc3Rlc3QgcnVubmluZyBzY3JpcHRpbmcgbGFuZ3VhZ2UuXG4iLA0KICAgICAgICAgICAgICAgICJmaWxlb2JqLnJlYWRsaW5lcygpIGZhaWxlZCIpDQoNCiAgICBkZWYgdGVzdF9maWxlb2JqX2l0ZXIoc2VsZik6DQogICAgICAgIHNlbGYudGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQ0KICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikNCiAgICAgICAgZm9iajEgPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvcmVndHlwZSIpLCAiclUiKQ0KICAgICAgICBmb2JqMiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pDQogICAgICAgIGxpbmVzMSA9IGZvYmoxLnJlYWRsaW5lcygpDQogICAgICAgIGxpbmVzMiA9IFtsaW5lIGZvciBsaW5lIGluIGZvYmoyXQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUobGluZXMxID09IGxpbmVzMiwNCiAgICAgICAgICAgICAgICAgICAgICJmaWxlb2JqLl9faXRlcl9fKCkgZmFpbGVkIikNCg0KICAgIGRlZiB0ZXN0X2ZpbGVvYmpfc2VlayhzZWxmKToNCiAgICAgICAgc2VsZi50YXIuZXh0cmFjdCgidXN0YXIvcmVndHlwZSIsIFRFTVBESVIpDQogICAgICAgIGZvYmogPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvcmVndHlwZSIpLCAicmIiKQ0KICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkNCiAgICAgICAgZm9iai5jbG9zZSgpDQoNCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpDQogICAgICAgIGZvYmogPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQ0KDQogICAgICAgIHRleHQgPSBmb2JqLnJlYWQoKQ0KICAgICAgICBmb2JqLnNlZWsoMCkNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPT0gZm9iai50ZWxsKCksDQogICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBzdGFydCBmYWlsZWQiKQ0KICAgICAgICBmb2JqLnNlZWsoMjA0OCwgMCkNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIwNDggPT0gZm9iai50ZWxsKCksDQogICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGFic29sdXRlIHBvc2l0aW9uIGZhaWxlZCIpDQogICAgICAgIGZvYmouc2VlaygtMTAyNCwgMSkNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEwMjQgPT0gZm9iai50ZWxsKCksDQogICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIG5lZ2F0aXZlIHJlbGF0aXZlIHBvc2l0aW9uIGZhaWxlZCIpDQogICAgICAgIGZvYmouc2VlaygxMDI0LCAxKQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUoMjA0OCA9PSBmb2JqLnRlbGwoKSwNCiAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gcG9zaXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikNCiAgICAgICAgcyA9IGZvYmoucmVhZCgxMCkNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gZGF0YVsyMDQ4OjIwNThdLA0KICAgICAgICAgICAgICAgICAgICAgInJlYWQoKSBhZnRlciBzZWVrIGZhaWxlZCIpDQogICAgICAgIGZvYmouc2VlaygwLCAyKQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby5zaXplID09IGZvYmoudGVsbCgpLA0KICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBmaWxlJ3MgZW5kIGZhaWxlZCIpDQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb2JqLnJlYWQoKSA9PSAiIiwNCiAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYXQgZmlsZSdzIGVuZCBkaWQgbm90IHJldHVybiBlbXB0eSBzdHJpbmciKQ0KICAgICAgICBmb2JqLnNlZWsoLXRhcmluZm8uc2l6ZSwgMikNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPT0gZm9iai50ZWxsKCksDQogICAgICAgICAgICAgICAgICAgICAicmVsYXRpdmUgc2VlaygpIHRvIGZpbGUncyBzdGFydCBmYWlsZWQiKQ0KICAgICAgICBmb2JqLnNlZWsoNTEyKQ0KICAgICAgICBzMSA9IGZvYmoucmVhZGxpbmVzKCkNCiAgICAgICAgZm9iai5zZWVrKDUxMikNCiAgICAgICAgczIgPSBmb2JqLnJlYWRsaW5lcygpDQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSA9PSBzMiwNCiAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZXMoKSBhZnRlciBzZWVrIGZhaWxlZCIpDQogICAgICAgIGZvYmouc2VlaygwKQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGZvYmoucmVhZGxpbmUoKSkgPT0gZm9iai50ZWxsKCksDQogICAgICAgICAgICAgICAgICAgICAidGVsbCgpIGFmdGVyIHJlYWRsaW5lKCkgZmFpbGVkIikNCiAgICAgICAgZm9iai5zZWVrKDUxMikNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihmb2JqLnJlYWRsaW5lKCkpICsgNTEyID09IGZvYmoudGVsbCgpLA0KICAgICAgICAgICAgICAgICAgICAgInRlbGwoKSBhZnRlciBzZWVrKCkgYW5kIHJlYWRsaW5lKCkgZmFpbGVkIikNCiAgICAgICAgZm9iai5zZWVrKDApDQogICAgICAgIGxpbmUgPSBmb2JqLnJlYWRsaW5lKCkNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmoucmVhZCgpID09IGRhdGFbbGVuKGxpbmUpOl0sDQogICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHJlYWRsaW5lKCkgZmFpbGVkIikNCiAgICAgICAgZm9iai5jbG9zZSgpDQoNCiAgICAjIFRlc3QgaWYgc3ltYm9saWMgYW5kIGhhcmQgbGlua3MgYXJlIHJlc29sdmVkIGJ5IGV4dHJhY3RmaWxlKCkuICBUaGUNCiAgICAjIHRlc3QgbGluayBtZW1iZXJzIGVhY2ggcG9pbnQgdG8gYSByZWd1bGFyIG1lbWJlciB3aG9zZSBkYXRhIGlzDQogICAgIyBzdXBwb3NlZCB0byBiZSBleHBvcnRlZC4NCiAgICBkZWYgX3Rlc3RfZmlsZW9ial9saW5rKHNlbGYsIGxua3R5cGUsIHJlZ3R5cGUpOg0KICAgICAgICBhID0gc2VsZi50YXIuZXh0cmFjdGZpbGUobG5rdHlwZSkNCiAgICAgICAgYiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHJlZ3R5cGUpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5uYW1lLCBiLm5hbWUpDQoNCiAgICBkZWYgdGVzdF9maWxlb2JqX2xpbmsxKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X2ZpbGVvYmpfbGluaygidXN0YXIvbG5rdHlwZSIsICJ1c3Rhci9yZWd0eXBlIikNCg0KICAgIGRlZiB0ZXN0X2ZpbGVvYmpfbGluazIoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3RfZmlsZW9ial9saW5rKCIuL3VzdGFyL2xpbmt0ZXN0Mi9sbmt0eXBlIiwgInVzdGFyL2xpbmt0ZXN0MS9yZWd0eXBlIikNCg0KICAgIGRlZiB0ZXN0X2ZpbGVvYmpfc3ltbGluazEoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3RfZmlsZW9ial9saW5rKCJ1c3Rhci9zeW10eXBlIiwgInVzdGFyL3JlZ3R5cGUiKQ0KDQogICAgZGVmIHRlc3RfZmlsZW9ial9zeW1saW5rMihzZWxmKToNCiAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoIi4vdXN0YXIvbGlua3Rlc3QyL3N5bXR5cGUiLCAidXN0YXIvbGlua3Rlc3QxL3JlZ3R5cGUiKQ0KDQoNCmNsYXNzIENvbW1vblJlYWRUZXN0KFJlYWRUZXN0KToNCg0KICAgIGRlZiB0ZXN0X2VtcHR5X3RhcmZpbGUoc2VsZik6DQogICAgICAgICMgVGVzdCBmb3IgaXNzdWU2MTIzOiBBbGxvdyBvcGVuaW5nIGVtcHR5IGFyY2hpdmVzLg0KICAgICAgICAjIFRoaXMgdGVzdCBjaGVja3MgaWYgdGFyZmlsZS5vcGVuKCkgaXMgYWJsZSB0byBvcGVuIGFuIGVtcHR5IHRhcg0KICAgICAgICAjIGFyY2hpdmUgc3VjY2Vzc2Z1bGx5LiBOb3RlIHRoYXQgYW4gZW1wdHkgdGFyIGFyY2hpdmUgaXMgbm90IHRoZQ0KICAgICAgICAjIHNhbWUgYXMgYW4gZW1wdHkgZmlsZSENCiAgICAgICAgdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZS5yZXBsYWNlKCJyIiwgInciKSkuY2xvc2UoKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQ0KICAgICAgICAgICAgdGFyLmdldG5hbWVzKCkNCiAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOg0KICAgICAgICAgICAgc2VsZi5mYWlsKCJ0YXJmaWxlLm9wZW4oKSBmYWlsZWQgb24gZW1wdHkgYXJjaGl2ZSIpDQogICAgICAgIHNlbGYuYXNzZXJ0TGlzdEVxdWFsKHRhci5nZXRtZW1iZXJzKCksIFtdKQ0KDQogICAgZGVmIHRlc3RfbnVsbF90YXJmaWxlKHNlbGYpOg0KICAgICAgICAjIFRlc3QgZm9yIGlzc3VlNjEyMzogQWxsb3cgb3BlbmluZyBlbXB0eSBhcmNoaXZlcy4NCiAgICAgICAgIyBUaGlzIHRlc3QgZ3VhcmFudGVlcyB0aGF0IHRhcmZpbGUub3BlbigpIGRvZXMgbm90IHRyZWF0IGFuIGVtcHR5DQogICAgICAgICMgZmlsZSBhcyBhbiBlbXB0eSB0YXIgYXJjaGl2ZS4NCiAgICAgICAgb3Blbih0bXBuYW1lLCAid2IiKS5jbG9zZSgpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsIHNlbGYubW9kZSkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSkNCg0KICAgIGRlZiB0ZXN0X2lnbm9yZV96ZXJvcyhzZWxmKToNCiAgICAgICAgIyBUZXN0IFRhckZpbGUncyBpZ25vcmVfemVyb3Mgb3B0aW9uLg0KICAgICAgICBpZiBzZWxmLm1vZGUuZW5kc3dpdGgoIjpneiIpOg0KICAgICAgICAgICAgX29wZW4gPSBnemlwLkd6aXBGaWxlDQogICAgICAgIGVsaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCI6YnoyIik6DQogICAgICAgICAgICBfb3BlbiA9IGJ6Mi5CWjJGaWxlDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBfb3BlbiA9IG9wZW4NCg0KICAgICAgICBmb3IgY2hhciBpbiAoJ1wwJywgJ2EnKToNCiAgICAgICAgICAgICMgVGVzdCBpZiBFT0ZIZWFkZXJFcnJvciAoJ1wwJykgYW5kIEludmFsaWRIZWFkZXJFcnJvciAoJ2EnKQ0KICAgICAgICAgICAgIyBhcmUgaWdub3JlZCBjb3JyZWN0bHkuDQogICAgICAgICAgICBmb2JqID0gX29wZW4odG1wbmFtZSwgIndiIikNCiAgICAgICAgICAgIGZvYmoud3JpdGUoY2hhciAqIDEwMjQpDQogICAgICAgICAgICBmb2JqLndyaXRlKHRhcmZpbGUuVGFySW5mbygiZm9vIikudG9idWYoKSkNCiAgICAgICAgICAgIGZvYmouY2xvc2UoKQ0KDQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgbW9kZT0iciIsIGlnbm9yZV96ZXJvcz1UcnVlKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwodGFyLmdldG5hbWVzKCksIFsiZm9vIl0sDQogICAgICAgICAgICAgICAgICAgICJpZ25vcmVfemVyb3M9VHJ1ZSBzaG91bGQgaGF2ZSBza2lwcGVkIHRoZSAlci1ibG9ja3MiICUgY2hhcikNCiAgICAgICAgICAgIHRhci5jbG9zZSgpDQoNCg0KY2xhc3MgTWlzY1JlYWRUZXN0KENvbW1vblJlYWRUZXN0KToNCg0KICAgIGRlZiB0ZXN0X25vX25hbWVfYXJndW1lbnQoc2VsZik6DQogICAgICAgIGZvYmogPSBvcGVuKHNlbGYudGFybmFtZSwgInJiIikNCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVvYmo9Zm9iaiwgbW9kZT1zZWxmLm1vZGUpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLm5hbWUsIG9zLnBhdGguYWJzcGF0aChmb2JqLm5hbWUpKQ0KDQogICAgZGVmIHRlc3Rfbm9fbmFtZV9hdHRyaWJ1dGUoc2VsZik6DQogICAgICAgIGRhdGEgPSBvcGVuKHNlbGYudGFybmFtZSwgInJiIikucmVhZCgpDQogICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgZm9iaiwgIm5hbWUiKQ0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIubmFtZSwgTm9uZSkNCg0KICAgIGRlZiB0ZXN0X2VtcHR5X25hbWVfYXR0cmlidXRlKHNlbGYpOg0KICAgICAgICBkYXRhID0gb3BlbihzZWxmLnRhcm5hbWUsICJyYiIpLnJlYWQoKQ0KICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkNCiAgICAgICAgZm9iai5uYW1lID0gIiINCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVvYmo9Zm9iaiwgbW9kZT1zZWxmLm1vZGUpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLm5hbWUsIE5vbmUpDQoNCiAgICBkZWYgdGVzdF9maWxlb2JqX3dpdGhfb2Zmc2V0KHNlbGYpOg0KICAgICAgICAjIFNraXAgdGhlIGZpcnN0IG1lbWJlciBhbmQgc3RvcmUgdmFsdWVzIGZyb20gdGhlIHNlY29uZCBtZW1iZXINCiAgICAgICAgIyBvZiB0aGUgdGVzdHRhci4NCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT1zZWxmLm1vZGUpDQogICAgICAgIHRhci5uZXh0KCkNCiAgICAgICAgdCA9IHRhci5uZXh0KCkNCiAgICAgICAgbmFtZSA9IHQubmFtZQ0KICAgICAgICBvZmZzZXQgPSB0Lm9mZnNldA0KICAgICAgICBkYXRhID0gdGFyLmV4dHJhY3RmaWxlKHQpLnJlYWQoKQ0KICAgICAgICB0YXIuY2xvc2UoKQ0KDQogICAgICAgICMgT3BlbiB0aGUgdGVzdHRhciBhbmQgc2VlayB0byB0aGUgb2Zmc2V0IG9mIHRoZSBzZWNvbmQgbWVtYmVyLg0KICAgICAgICBpZiBzZWxmLm1vZGUuZW5kc3dpdGgoIjpneiIpOg0KICAgICAgICAgICAgX29wZW4gPSBnemlwLkd6aXBGaWxlDQogICAgICAgIGVsaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCI6YnoyIik6DQogICAgICAgICAgICBfb3BlbiA9IGJ6Mi5CWjJGaWxlDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBfb3BlbiA9IG9wZW4NCiAgICAgICAgZm9iaiA9IF9vcGVuKHNlbGYudGFybmFtZSwgInJiIikNCiAgICAgICAgZm9iai5zZWVrKG9mZnNldCkNCg0KICAgICAgICAjIFRlc3QgaWYgdGhlIHRhcmZpbGUgc3RhcnRzIHdpdGggdGhlIHNlY29uZCBtZW1iZXIuDQogICAgICAgIHRhciA9IHRhci5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT0icjoiLCBmaWxlb2JqPWZvYmopDQogICAgICAgIHQgPSB0YXIubmV4dCgpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5uYW1lLCBuYW1lKQ0KICAgICAgICAjIFJlYWQgdG8gdGhlIGVuZCBvZiBmaWxlb2JqIGFuZCB0ZXN0IGlmIHNlZWtpbmcgYmFjayB0byB0aGUNCiAgICAgICAgIyBiZWdpbm5pbmcgd29ya3MuDQogICAgICAgIHRhci5nZXRtZW1iZXJzKCkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZXh0cmFjdGZpbGUodCkucmVhZCgpLCBkYXRhLA0KICAgICAgICAgICAgICAgICJzZWVrIGJhY2sgZGlkIG5vdCB3b3JrIikNCiAgICAgICAgdGFyLmNsb3NlKCkNCg0KICAgIGRlZiB0ZXN0X2ZhaWxfY29tcChzZWxmKToNCiAgICAgICAgIyBGb3IgR3ppcCBhbmQgQnoyIFRlc3RzOiBmYWlsIHdpdGggYSBSZWFkRXJyb3Igb24gYW4gdW5jb21wcmVzc2VkIGZpbGUuDQogICAgICAgIGlmIHNlbGYubW9kZSA9PSAicjoiOg0KICAgICAgICAgICAgcmV0dXJuDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIHNlbGYubW9kZSkNCiAgICAgICAgZm9iaiA9IG9wZW4odGFybmFtZSwgInJiIikNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkNCg0KICAgIGRlZiB0ZXN0X3Y3X2RpcnR5cGUoc2VsZik6DQogICAgICAgICMgVGVzdCBvbGQgc3R5bGUgZGlydHlwZSBtZW1iZXIgKGJ1ZyAjMTMzNjYyMyk6DQogICAgICAgICMgT2xkIFY3IHRhcnMgY3JlYXRlIGRpcmVjdG9yeSBtZW1iZXJzIHVzaW5nIGFuIEFSRUdUWVBFDQogICAgICAgICMgaGVhZGVyIHdpdGggYSAiLyIgYXBwZW5kZWQgdG8gdGhlIGZpbGVuYW1lIGZpZWxkLg0KICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJtaXNjL2RpcnR5cGUtb2xkLXY3IikNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLkRJUlRZUEUsDQogICAgICAgICAgICAgICAgInY3IGRpcnR5cGUgZmFpbGVkIikNCg0KICAgIGRlZiB0ZXN0X3hzdGFyX3R5cGUoc2VsZik6DQogICAgICAgICMgVGhlIHhzdGFyIGZvcm1hdCBzdG9yZXMgZXh0cmEgYXRpbWUgYW5kIGN0aW1lIGZpZWxkcyBpbnNpZGUgdGhlDQogICAgICAgICMgc3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSBwcmVmaXggZmllbGQuIFRoZSBwcmVmaXggZmllbGQgbXVzdCBiZQ0KICAgICAgICAjIGlnbm9yZWQgaW4gdGhpcyBjYXNlLCBvdGhlcndpc2UgaXQgd2lsbCBtZXNzIHVwIHRoZSBuYW1lLg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvcmVndHlwZS14c3RhciIpDQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoNCiAgICAgICAgICAgIHNlbGYuZmFpbCgiZmFpbGVkIHRvIGZpbmQgbWlzYy9yZWd0eXBlLXhzdGFyIChtYW5nbGVkIHByZWZpeD8pIikNCg0KICAgIGRlZiB0ZXN0X2NoZWNrX21lbWJlcnMoc2VsZik6DQogICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGYudGFyOg0KICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludCh0YXJpbmZvLm10aW1lKSA9PSAwNzYwNjEzNjYxNywNCiAgICAgICAgICAgICAgICAgICAgIndyb25nIG10aW1lIGZvciAlcyIgJSB0YXJpbmZvLm5hbWUpDQogICAgICAgICAgICBpZiBub3QgdGFyaW5mby5uYW1lLnN0YXJ0c3dpdGgoInVzdGFyLyIpOg0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby51bmFtZSA9PSAidGFyZmlsZSIsDQogICAgICAgICAgICAgICAgICAgICJ3cm9uZyB1bmFtZSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQ0KDQogICAgZGVmIHRlc3RfZmluZF9tZW1iZXJzKHNlbGYpOg0KICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50YXIuZ2V0bWVtYmVycygpWy0xXS5uYW1lID09ICJtaXNjL2VvZiIsDQogICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIGFsbCBtZW1iZXJzIikNCg0KICAgIGRlZiB0ZXN0X2V4dHJhY3RfaGFyZGxpbmsoc2VsZik6DQogICAgICAgICMgVGVzdCBoYXJkbGluayBleHRyYWN0aW9uIChlLmcuIGJ1ZyAjODU3Mjk3KS4NCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVycm9ybGV2ZWw9MSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpDQoNCiAgICAgICAgdGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICB0YXIuZXh0cmFjdCgidXN0YXIvbG5rdHlwZSIsIFRFTVBESVIpDQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOg0KICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6DQogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJoYXJkbGluayBub3QgZXh0cmFjdGVkIHByb3Blcmx5IikNCg0KICAgICAgICBkYXRhID0gb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL2xua3R5cGUiKSwgInJiIikucmVhZCgpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWQ1c3VtKGRhdGEpLCBtZDVfcmVndHlwZSkNCg0KICAgICAgICB0cnk6DQogICAgICAgICAgICB0YXIuZXh0cmFjdCgidXN0YXIvc3ltdHlwZSIsIFRFTVBESVIpDQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOg0KICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6DQogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzeW1saW5rIG5vdCBleHRyYWN0ZWQgcHJvcGVybHkiKQ0KDQogICAgICAgIGRhdGEgPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvc3ltdHlwZSIpLCAicmIiKS5yZWFkKCkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZDVzdW0oZGF0YSksIG1kNV9yZWd0eXBlKQ0KDQogICAgZGVmIHRlc3RfZXh0cmFjdGFsbChzZWxmKToNCiAgICAgICAgIyBUZXN0IGlmIGV4dHJhY3RhbGwoKSBjb3JyZWN0bHkgcmVzdG9yZXMgZGlyZWN0b3J5IHBlcm1pc3Npb25zDQogICAgICAgICMgYW5kIHRpbWVzIChzZWUgaXNzdWUxNzM1KS4NCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQ0KICAgICAgICBkaXJlY3RvcmllcyA9IFt0IGZvciB0IGluIHRhciBpZiB0LmlzZGlyKCldDQogICAgICAgIHRhci5leHRyYWN0YWxsKFRFTVBESVIsIGRpcmVjdG9yaWVzKQ0KICAgICAgICBmb3IgdGFyaW5mbyBpbiBkaXJlY3RvcmllczoNCiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgdGFyaW5mby5uYW1lKQ0KICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJ3aW4zMiI6DQogICAgICAgICAgICAgICAgIyBXaW4zMiBoYXMgbm8gc3VwcG9ydCBmb3IgZmluZSBncmFpbmVkIHBlcm1pc3Npb25zLg0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5tb2RlICYgMDc3Nywgb3Muc3RhdChwYXRoKS5zdF9tb2RlICYgMDc3NykNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5tdGltZSwgb3MucGF0aC5nZXRtdGltZShwYXRoKSkNCiAgICAgICAgdGFyLmNsb3NlKCkNCg0KICAgIGRlZiB0ZXN0X2luaXRfY2xvc2VfZm9iaihzZWxmKToNCiAgICAgICAgIyBJc3N1ZSAjNzM0MTogQ2xvc2UgdGhlIGludGVybmFsIGZpbGUgb2JqZWN0IGluIHRoZSBUYXJGaWxlDQogICAgICAgICMgY29uc3RydWN0b3IgaW4gY2FzZSBvZiBhbiBlcnJvci4gRm9yIHRoZSB0ZXN0IHdlIHJlbHkgb24NCiAgICAgICAgIyB0aGUgZmFjdCB0aGF0IG9wZW5pbmcgYW4gZW1wdHkgZmlsZSByYWlzZXMgYSBSZWFkRXJyb3IuDQogICAgICAgIGVtcHR5ID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJlbXB0eSIpDQogICAgICAgIG9wZW4oZW1wdHksICJ3YiIpLndyaXRlKCIiKQ0KDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHRhciA9IG9iamVjdC5fX25ld19fKHRhcmZpbGUuVGFyRmlsZSkNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICB0YXIuX19pbml0X18oZW1wdHkpDQogICAgICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6DQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5maWxlb2JqLmNsb3NlZCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJSZWFkRXJyb3Igbm90IHJhaXNlZCIpDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBvcy5yZW1vdmUoZW1wdHkpDQoNCg0KY2xhc3MgU3RyZWFtUmVhZFRlc3QoQ29tbW9uUmVhZFRlc3QpOg0KDQogICAgbW9kZT0icnwiDQoNCiAgICBkZWYgdGVzdF9maWxlb2JqX3JlZ3VsYXJfZmlsZShzZWxmKToNCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLm5leHQoKSAjIGdldCAicmVndHlwZSIgKGNhbid0IHVzZSBnZXRtZW1iZXIpDQogICAgICAgIGZvYmogPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQ0KICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChsZW4oZGF0YSksIG1kNXN1bShkYXRhKSkgPT0gKHRhcmluZm8uc2l6ZSwgbWQ1X3JlZ3R5cGUpLA0KICAgICAgICAgICAgICAgICJyZWd1bGFyIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQ0KDQogICAgZGVmIHRlc3RfcHJvdm9rZV9zdHJlYW1fZXJyb3Ioc2VsZik6DQogICAgICAgIHRhcmluZm9zID0gc2VsZi50YXIuZ2V0bWVtYmVycygpDQogICAgICAgIGYgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvc1swXSkgIyByZWFkIHRoZSBmaXJzdCBtZW1iZXINCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5TdHJlYW1FcnJvciwgZi5yZWFkKQ0KDQogICAgZGVmIHRlc3RfY29tcGFyZV9tZW1iZXJzKHNlbGYpOg0KICAgICAgICB0YXIxID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQ0KICAgICAgICB0YXIyID0gc2VsZi50YXINCg0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdDEgPSB0YXIxLm5leHQoKQ0KICAgICAgICAgICAgdDIgPSB0YXIyLm5leHQoKQ0KICAgICAgICAgICAgaWYgdDEgaXMgTm9uZToNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyIGlzIG5vdCBOb25lLCAic3RyZWFtLm5leHQoKSBmYWlsZWQuIikNCg0KICAgICAgICAgICAgaWYgdDIuaXNsbmsoKSBvciB0Mi5pc3N5bSgpOg0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuU3RyZWFtRXJyb3IsIHRhcjIuZXh0cmFjdGZpbGUsIHQyKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQoNCiAgICAgICAgICAgIHYxID0gdGFyMS5leHRyYWN0ZmlsZSh0MSkNCiAgICAgICAgICAgIHYyID0gdGFyMi5leHRyYWN0ZmlsZSh0MikNCiAgICAgICAgICAgIGlmIHYxIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2MiBpcyBub3QgTm9uZSwgInN0cmVhbS5leHRyYWN0ZmlsZSgpIGZhaWxlZCIpDQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodjEucmVhZCgpID09IHYyLnJlYWQoKSwgInN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCIpDQoNCiAgICAgICAgdGFyMS5jbG9zZSgpDQoNCg0KY2xhc3MgRGV0ZWN0UmVhZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOg0KDQogICAgZGVmIF90ZXN0ZnVuY19maWxlKHNlbGYsIG5hbWUsIG1vZGUpOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICB0YXJmaWxlLm9wZW4obmFtZSwgbW9kZSkNCiAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOg0KICAgICAgICAgICAgc2VsZi5mYWlsKCkNCg0KICAgIGRlZiBfdGVzdGZ1bmNfZmlsZW9iaihzZWxmLCBuYW1lLCBtb2RlKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgdGFyZmlsZS5vcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmo9b3BlbihuYW1lLCAicmIiKSkNCiAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOg0KICAgICAgICAgICAgc2VsZi5mYWlsKCkNCg0KICAgIGRlZiBfdGVzdF9tb2RlcyhzZWxmLCB0ZXN0ZnVuYyk6DQogICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyIikNCiAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInI6IikNCiAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInI6KiIpDQogICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyfCIpDQogICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyfCoiKQ0KDQogICAgICAgIGlmIGd6aXA6DQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyOmd6IikNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIG1vZGU9InJ8Z3oiKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgZ3ppcG5hbWUsIG1vZGU9InI6IikNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIGd6aXBuYW1lLCBtb2RlPSJyfCIpDQoNCiAgICAgICAgICAgIHRlc3RmdW5jKGd6aXBuYW1lLCAiciIpDQogICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInI6KiIpDQogICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInI6Z3oiKQ0KICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyfCoiKQ0KICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyfGd6IikNCg0KICAgICAgICBpZiBiejI6DQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyOmJ6MiIpDQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyfGJ6MiIpDQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBiejJuYW1lLCBtb2RlPSJyOiIpDQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBiejJuYW1lLCBtb2RlPSJyfCIpDQoNCiAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyIikNCiAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyOioiKQ0KICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInI6YnoyIikNCiAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyfCoiKQ0KICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInJ8YnoyIikNCg0KICAgIGRlZiB0ZXN0X2RldGVjdF9maWxlKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X21vZGVzKHNlbGYuX3Rlc3RmdW5jX2ZpbGUpDQoNCiAgICBkZWYgdGVzdF9kZXRlY3RfZmlsZW9iaihzZWxmKToNCiAgICAgICAgc2VsZi5fdGVzdF9tb2RlcyhzZWxmLl90ZXN0ZnVuY19maWxlb2JqKQ0KDQoNCmNsYXNzIE1lbWJlclJlYWRUZXN0KFJlYWRUZXN0KToNCg0KICAgIGRlZiBfdGVzdF9tZW1iZXIoc2VsZiwgdGFyaW5mbywgY2hrc3VtPU5vbmUsICoqa3dhcmdzKToNCiAgICAgICAgaWYgY2hrc3VtIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1kNXN1bShzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKS5yZWFkKCkpID09IGNoa3N1bSwNCiAgICAgICAgICAgICAgICAgICAgIndyb25nIG1kNXN1bSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQ0KDQogICAgICAgIGt3YXJnc1sibXRpbWUiXSA9IDA3NjA2MTM2NjE3DQogICAgICAgIGt3YXJnc1sidWlkIl0gPSAxMDAwDQogICAgICAgIGt3YXJnc1siZ2lkIl0gPSAxMDANCiAgICAgICAgaWYgIm9sZC12NyIgbm90IGluIHRhcmluZm8ubmFtZToNCiAgICAgICAgICAgICMgVjcgdGFyIGNhbid0IGhhbmRsZSBhbHBoYWJldGljIG93bmVycy4NCiAgICAgICAgICAgIGt3YXJnc1sidW5hbWUiXSA9ICJ0YXJmaWxlIg0KICAgICAgICAgICAga3dhcmdzWyJnbmFtZSJdID0gInRhcmZpbGUiDQogICAgICAgIGZvciBrLCB2IGluIGt3YXJncy5pdGVyaXRlbXMoKToNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnZXRhdHRyKHRhcmluZm8sIGspID09IHYsDQogICAgICAgICAgICAgICAgICAgICJ3cm9uZyB2YWx1ZSBpbiAlcyBmaWVsZCBvZiAlcyIgJSAoaywgdGFyaW5mby5uYW1lKSkNCg0KICAgIGRlZiB0ZXN0X2ZpbmRfcmVndHlwZShzZWxmKToNCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpDQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQ0KDQogICAgZGVmIHRlc3RfZmluZF9jb250dHlwZShzZWxmKToNCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvY29udHR5cGUiKQ0KICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTcwMTEsIGNoa3N1bT1tZDVfcmVndHlwZSkNCg0KICAgIGRlZiB0ZXN0X2ZpbmRfZGlydHlwZShzZWxmKToNCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvZGlydHlwZSIpDQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCkNCg0KICAgIGRlZiB0ZXN0X2ZpbmRfZGlydHlwZV93aXRoX3NpemUoc2VsZik6DQogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2RpcnR5cGUtd2l0aC1zaXplIikNCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0yNTUpDQoNCiAgICBkZWYgdGVzdF9maW5kX2xua3R5cGUoc2VsZik6DQogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2xua3R5cGUiKQ0KICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTAsIGxpbmtuYW1lPSJ1c3Rhci9yZWd0eXBlIikNCg0KICAgIGRlZiB0ZXN0X2ZpbmRfc3ltdHlwZShzZWxmKToNCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvc3ltdHlwZSIpDQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCwgbGlua25hbWU9InJlZ3R5cGUiKQ0KDQogICAgZGVmIHRlc3RfZmluZF9ibGt0eXBlKHNlbGYpOg0KICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9ibGt0eXBlIikNCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wLCBkZXZtYWpvcj0zLCBkZXZtaW5vcj0wKQ0KDQogICAgZGVmIHRlc3RfZmluZF9jaHJ0eXBlKHNlbGYpOg0KICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9jaHJ0eXBlIikNCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wLCBkZXZtYWpvcj0xLCBkZXZtaW5vcj0zKQ0KDQogICAgZGVmIHRlc3RfZmluZF9maWZvdHlwZShzZWxmKToNCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvZmlmb3R5cGUiKQ0KICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTApDQoNCiAgICBkZWYgdGVzdF9maW5kX3NwYXJzZShzZWxmKToNCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvc3BhcnNlIikNCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT04NjAxNiwgY2hrc3VtPW1kNV9zcGFyc2UpDQoNCiAgICBkZWYgdGVzdF9maW5kX3VtbGF1dHMoc2VsZik6DQogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3VtbGF1dHMtxNbc5Pb83yIpDQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQ0KDQogICAgZGVmIHRlc3RfZmluZF91c3Rhcl9sb25nbmFtZShzZWxmKToNCiAgICAgICAgbmFtZSA9ICJ1c3Rhci8iICsgIjEyMzQ1LyIgKiAzOSArICIxMjM0NTY3L2xvbmduYW1lIg0KICAgICAgICBzZWxmLmFzc2VydEluKG5hbWUsIHNlbGYudGFyLmdldG5hbWVzKCkpDQoNCiAgICBkZWYgdGVzdF9maW5kX3JlZ3R5cGVfb2xkdjcoc2VsZik6DQogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvcmVndHlwZS1vbGQtdjciKQ0KICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTcwMTEsIGNoa3N1bT1tZDVfcmVndHlwZSkNCg0KICAgIGRlZiB0ZXN0X2ZpbmRfcGF4X3VtbGF1dHMoc2VsZik6DQogICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT1zZWxmLm1vZGUsIGVuY29kaW5nPSJpc284ODU5LTEiKQ0KICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJwYXgvdW1sYXV0cy3E1tzk9vzfIikNCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpDQoNCg0KY2xhc3MgTG9uZ25hbWVUZXN0KFJlYWRUZXN0KToNCg0KICAgIGRlZiB0ZXN0X3JlYWRfbG9uZ25hbWUoc2VsZik6DQogICAgICAgICMgVGVzdCByZWFkaW5nIG9mIGxvbmduYW1lIChidWcgIzE0NzE0MjcpLg0KICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmduYW1lKQ0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6DQogICAgICAgICAgICBzZWxmLmZhaWwoImxvbmduYW1lIG5vdCBmb3VuZCIpDQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgIT0gdGFyZmlsZS5ESVJUWVBFLCAicmVhZCBsb25nbmFtZSBhcyBkaXJ0eXBlIikNCg0KICAgIGRlZiB0ZXN0X3JlYWRfbG9uZ2xpbmsoc2VsZik6DQogICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiDQogICAgICAgIGxvbmdsaW5rID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ2xpbmsiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ2xpbmspDQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoNCiAgICAgICAgICAgIHNlbGYuZmFpbCgibG9uZ2xpbmsgbm90IGZvdW5kIikNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8ubGlua25hbWUgPT0gbG9uZ25hbWUsICJsaW5rbmFtZSB3cm9uZyIpDQoNCiAgICBkZWYgdGVzdF90cnVuY2F0ZWRfbG9uZ25hbWUoc2VsZik6DQogICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiDQogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ25hbWUpDQogICAgICAgIG9mZnNldCA9IHRhcmluZm8ub2Zmc2V0DQogICAgICAgIHNlbGYudGFyLmZpbGVvYmouc2VlayhvZmZzZXQpDQogICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLnRhci5maWxlb2JqLnJlYWQoMyAqIDUxMikpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIG5hbWU9ImZvby50YXIiLCBmaWxlb2JqPWZvYmopDQoNCiAgICBkZWYgdGVzdF9oZWFkZXJfb2Zmc2V0KHNlbGYpOg0KICAgICAgICAjIFRlc3QgaWYgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgVGFySW5mbyBvYmplY3QgaW5jbHVkZXMNCiAgICAgICAgIyB0aGUgcHJlY2VkaW5nIGV4dGVuZGVkIGhlYWRlci4NCiAgICAgICAgbG9uZ25hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSINCiAgICAgICAgb2Zmc2V0ID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmduYW1lKS5vZmZzZXQNCiAgICAgICAgZm9iaiA9IG9wZW4odGFybmFtZSkNCiAgICAgICAgZm9iai5zZWVrKG9mZnNldCkNCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mby5mcm9tYnVmKGZvYmoucmVhZCg1MTIpKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udHlwZSwgc2VsZi5sb25nbmFtZXR5cGUpDQoNCg0KY2xhc3MgR05VUmVhZFRlc3QoTG9uZ25hbWVUZXN0KToNCg0KICAgIHN1YmRpciA9ICJnbnUiDQogICAgbG9uZ25hbWV0eXBlID0gdGFyZmlsZS5HTlVUWVBFX0xPTkdOQU1FDQoNCiAgICBkZWYgdGVzdF9zcGFyc2VfZmlsZShzZWxmKToNCiAgICAgICAgdGFyaW5mbzEgPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3NwYXJzZSIpDQogICAgICAgIGZvYmoxID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbzEpDQogICAgICAgIHRhcmluZm8yID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJnbnUvc3BhcnNlIikNCiAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvMikNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmoxLnJlYWQoKSA9PSBmb2JqMi5yZWFkKCksDQogICAgICAgICAgICAgICAgInNwYXJzZSBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikNCg0KDQpjbGFzcyBQYXhSZWFkVGVzdChMb25nbmFtZVRlc3QpOg0KDQogICAgc3ViZGlyID0gInBheCINCiAgICBsb25nbmFtZXR5cGUgPSB0YXJmaWxlLlhIRFRZUEUNCg0KICAgIGRlZiB0ZXN0X3BheF9nbG9iYWxfaGVhZGVycyhzZWxmKToNCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQ0KDQogICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTEiKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJmb28iKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ25hbWUsICJiYXIiKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCB1IsTW3OT2/N8iKQ0KDQogICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTIiKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICIiKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ25hbWUsICJiYXIiKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCB1IsTW3OT2/N8iKQ0KDQogICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTMiKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJ0YXJmaWxlIikNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmduYW1lLCAidGFyZmlsZSIpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksIHUixNbc5Pb83yIpDQoNCiAgICBkZWYgdGVzdF9wYXhfbnVtYmVyX2ZpZWxkcyhzZWxmKToNCiAgICAgICAgIyBBbGwgZm9sbG93aW5nIG51bWJlciBmaWVsZHMgYXJlIHJlYWQgZnJvbSB0aGUgcGF4IGhlYWRlci4NCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQ0KICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcigicGF4L3JlZ3R5cGU0IikNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDcwMTEpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51aWQsIDEyMykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmdpZCwgMTIzKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ubXRpbWUsIDEwNDE4MDg3ODMuMCkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHRhcmluZm8ubXRpbWUpLCBmbG9hdCkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCh0YXJpbmZvLnBheF9oZWFkZXJzWyJhdGltZSJdKSwgMTA0MTgwODc4My4wKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KHRhcmluZm8ucGF4X2hlYWRlcnNbImN0aW1lIl0pLCAxMDQxODA4NzgzLjApDQoNCg0KY2xhc3MgV3JpdGVUZXN0QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6DQogICAgIyBQdXQgYWxsIHdyaXRlIHRlc3RzIGluIGhlcmUgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgdGVzdGVkDQogICAgIyBpbiBhbGwgcG9zc2libGUgbW9kZSBjb21iaW5hdGlvbnMuDQoNCiAgICBkZWYgdGVzdF9maWxlb2JqX25vX2Nsb3NlKHNlbGYpOg0KICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oKQ0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkNCiAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKCJmb28iKSkNCiAgICAgICAgdGFyLmNsb3NlKCkNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmouY2xvc2VkIGlzIEZhbHNlLCAiZXh0ZXJuYWwgZmlsZW9ianMgbXVzdCBuZXZlciBjbG9zZWQiKQ0KDQoNCmNsYXNzIFdyaXRlVGVzdChXcml0ZVRlc3RCYXNlKToNCg0KICAgIG1vZGUgPSAidzoiDQoNCiAgICBkZWYgdGVzdF8xMDBfY2hhcl9uYW1lKHNlbGYpOg0KICAgICAgICAjIFRoZSBuYW1lIGZpZWxkIGluIGEgdGFyIGhlYWRlciBzdG9yZXMgc3RyaW5ncyBvZiBhdCBtb3N0IDEwMCBjaGFycy4NCiAgICAgICAgIyBJZiBhIHN0cmluZyBpcyBzaG9ydGVyIHRoYW4gMTAwIGNoYXJzIGl0IGhhcyB0byBiZSBwYWRkZWQgd2l0aCAnXDAnLA0KICAgICAgICAjIHdoaWNoIGltcGxpZXMgdGhhdCBhIHN0cmluZyBvZiBleGFjdGx5IDEwMCBjaGFycyBpcyBzdG9yZWQgd2l0aG91dA0KICAgICAgICAjIGEgdHJhaWxpbmcgJ1wwJy4NCiAgICAgICAgbmFtZSA9ICIwMTIzNDU2Nzg5IiAqIDEwDQogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpDQogICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8obmFtZSkNCiAgICAgICAgdGFyLmFkZGZpbGUodCkNCiAgICAgICAgdGFyLmNsb3NlKCkNCg0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSkNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5nZXRuYW1lcygpWzBdID09IG5hbWUsDQogICAgICAgICAgICAgICAgImZhaWxlZCB0byBzdG9yZSAxMDAgY2hhciBmaWxlbmFtZSIpDQogICAgICAgIHRhci5jbG9zZSgpDQoNCiAgICBkZWYgdGVzdF90YXJfc2l6ZShzZWxmKToNCiAgICAgICAgIyBUZXN0IGZvciBidWcgIzEwMTM4ODIuDQogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpDQogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZpbGUiKQ0KICAgICAgICBmb2JqID0gb3BlbihwYXRoLCAid2IiKQ0KICAgICAgICBmb2JqLndyaXRlKCJhYWEiKQ0KICAgICAgICBmb2JqLmNsb3NlKCkNCiAgICAgICAgdGFyLmFkZChwYXRoKQ0KICAgICAgICB0YXIuY2xvc2UoKQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5nZXRzaXplKHRtcG5hbWUpID4gMCwNCiAgICAgICAgICAgICAgICAidGFyZmlsZSBpcyBlbXB0eSIpDQoNCiAgICAjIFRoZSB0ZXN0Xypfc2l6ZSB0ZXN0cyB0ZXN0IGZvciBidWcgIzExNjcxMjguDQogICAgZGVmIHRlc3RfZmlsZV9zaXplKHNlbGYpOg0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQ0KDQogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZpbGUiKQ0KICAgICAgICBmb2JqID0gb3BlbihwYXRoLCAid2IiKQ0KICAgICAgICBmb2JqLmNsb3NlKCkNCiAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQ0KDQogICAgICAgIGZvYmogPSBvcGVuKHBhdGgsICJ3YiIpDQogICAgICAgIGZvYmoud3JpdGUoImFhYSIpDQogICAgICAgIGZvYmouY2xvc2UoKQ0KICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8ocGF0aCkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDMpDQoNCiAgICAgICAgdGFyLmNsb3NlKCkNCg0KICAgIGRlZiB0ZXN0X2RpcmVjdG9yeV9zaXplKHNlbGYpOg0KICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJkaXJlY3RvcnkiKQ0KICAgICAgICBvcy5ta2RpcihwYXRoKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQ0KICAgICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIG9zLnJtZGlyKHBhdGgpDQoNCiAgICBkZWYgdGVzdF9saW5rX3NpemUoc2VsZik6DQogICAgICAgIGlmIGhhc2F0dHIob3MsICJsaW5rIik6DQogICAgICAgICAgICBsaW5rID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJsaW5rIikNCiAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihURU1QRElSLCAibGlua190YXJnZXQiKQ0KICAgICAgICAgICAgZm9iaiA9IG9wZW4odGFyZ2V0LCAid2IiKQ0KICAgICAgICAgICAgZm9iai53cml0ZSgiYWFhIikNCiAgICAgICAgICAgIGZvYmouY2xvc2UoKQ0KICAgICAgICAgICAgb3MubGluayh0YXJnZXQsIGxpbmspDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkNCiAgICAgICAgICAgICAgICAjIFJlY29yZCB0aGUgbGluayB0YXJnZXQgaW4gdGhlIGlub2RlcyBsaXN0Lg0KICAgICAgICAgICAgICAgIHRhci5nZXR0YXJpbmZvKHRhcmdldCkNCiAgICAgICAgICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8obGluaykNCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkNCiAgICAgICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRhcmdldCkNCiAgICAgICAgICAgICAgICBvcy5yZW1vdmUobGluaykNCg0KICAgIGRlZiB0ZXN0X3N5bWxpbmtfc2l6ZShzZWxmKToNCiAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToNCiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInN5bWxpbmsiKQ0KICAgICAgICAgICAgb3Muc3ltbGluaygibGlua190YXJnZXQiLCBwYXRoKQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpDQogICAgICAgICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpDQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDApDQogICAgICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQ0KDQogICAgZGVmIHRlc3RfYWRkX3NlbGYoc2VsZik6DQogICAgICAgICMgVGVzdCBmb3IgIzEyNTcyNTUuDQogICAgICAgIGRzdG5hbWUgPSBvcy5wYXRoLmFic3BhdGgodG1wbmFtZSkNCg0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLm5hbWUgPT0gZHN0bmFtZSwgImFyY2hpdmUgbmFtZSBtdXN0IGJlIGFic29sdXRlIikNCg0KICAgICAgICB0YXIuYWRkKGRzdG5hbWUpDQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpDQoNCiAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkNCiAgICAgICAgb3MuY2hkaXIoVEVNUERJUikNCiAgICAgICAgdGFyLmFkZChkc3RuYW1lKQ0KICAgICAgICBvcy5jaGRpcihjd2QpDQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpDQoNCiAgICBkZWYgdGVzdF9leGNsdWRlKHNlbGYpOg0KICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJleGNsdWRlIikNCiAgICAgICAgb3MubWtkaXIodGVtcGRpcikNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCJmb28iLCAiYmFyIiwgImJheiIpOg0KICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgbmFtZSkNCiAgICAgICAgICAgICAgICBvcGVuKG5hbWUsICJ3YiIpLmNsb3NlKCkNCg0KICAgICAgICAgICAgZXhjbHVkZSA9IG9zLnBhdGguaXNmaWxlDQoNCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUsIGVuY29kaW5nPSJpc284ODU5LTEiKQ0KICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCJ1c2UgdGhlIGZpbHRlciBhcmd1bWVudCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6DQogICAgICAgICAgICAgICAgdGFyLmFkZCh0ZW1wZGlyLCBhcmNuYW1lPSJlbXB0eV9kaXIiLCBleGNsdWRlPWV4Y2x1ZGUpDQogICAgICAgICAgICB0YXIuY2xvc2UoKQ0KDQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInIiKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGFyLmdldG1lbWJlcnMoKSksIDEpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRuYW1lcygpWzBdLCAiZW1wdHlfZGlyIikNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikNCg0KICAgIGRlZiB0ZXN0X2ZpbHRlcihzZWxmKToNCiAgICAgICAgdGVtcGRpciA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZmlsdGVyIikNCiAgICAgICAgb3MubWtkaXIodGVtcGRpcikNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCJmb28iLCAiYmFyIiwgImJheiIpOg0KICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgbmFtZSkNCiAgICAgICAgICAgICAgICBvcGVuKG5hbWUsICJ3YiIpLmNsb3NlKCkNCg0KICAgICAgICAgICAgZGVmIGZpbHRlcih0YXJpbmZvKToNCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmJhc2VuYW1lKHRhcmluZm8ubmFtZSkgPT0gImJhciI6DQogICAgICAgICAgICAgICAgICAgIHJldHVybg0KICAgICAgICAgICAgICAgIHRhcmluZm8udWlkID0gMTIzDQogICAgICAgICAgICAgICAgdGFyaW5mby51bmFtZSA9ICJmb28iDQogICAgICAgICAgICAgICAgcmV0dXJuIHRhcmluZm8NCg0KICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpDQogICAgICAgICAgICB0YXIuYWRkKHRlbXBkaXIsIGFyY25hbWU9ImVtcHR5X2RpciIsIGZpbHRlcj1maWx0ZXIpDQogICAgICAgICAgICB0YXIuY2xvc2UoKQ0KDQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInIiKQ0KICAgICAgICAgICAgZm9yIHRhcmluZm8gaW4gdGFyOg0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51aWQsIDEyMykNCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJmb28iKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGFyLmdldG1lbWJlcnMoKSksIDMpDQogICAgICAgICAgICB0YXIuY2xvc2UoKQ0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQ0KDQogICAgIyBHdWFyYW50ZWUgdGhhdCBzdG9yZWQgcGF0aG5hbWVzIGFyZSBub3QgbW9kaWZpZWQuIERvbid0DQogICAgIyByZW1vdmUgLi8gb3IgLi4vIG9yIGRvdWJsZSBzbGFzaGVzLiBTdGlsbCBtYWtlIGFic29sdXRlDQogICAgIyBwYXRobmFtZXMgcmVsYXRpdmUuDQogICAgIyBGb3IgZGV0YWlscyBzZWUgYnVnICM2MDU0Lg0KICAgIGRlZiBfdGVzdF9wYXRobmFtZShzZWxmLCBwYXRoLCBjbXBfcGF0aD1Ob25lLCBkaXI9RmFsc2UpOg0KICAgICAgICAjIENyZWF0ZSBhIHRhcmZpbGUgd2l0aCBhbiBlbXB0eSBtZW1iZXIgbmFtZWQgcGF0aA0KICAgICAgICAjIGFuZCBjb21wYXJlIHRoZSBzdG9yZWQgbmFtZSB3aXRoIHRoZSBvcmlnaW5hbC4NCiAgICAgICAgZm9vID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJmb28iKQ0KICAgICAgICBpZiBub3QgZGlyOg0KICAgICAgICAgICAgb3Blbihmb28sICJ3IikuY2xvc2UoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgb3MubWtkaXIoZm9vKQ0KDQogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpDQogICAgICAgIHRhci5hZGQoZm9vLCBhcmNuYW1lPXBhdGgpDQogICAgICAgIHRhci5jbG9zZSgpDQoNCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJyIikNCiAgICAgICAgdCA9IHRhci5uZXh0KCkNCiAgICAgICAgdGFyLmNsb3NlKCkNCg0KICAgICAgICBpZiBub3QgZGlyOg0KICAgICAgICAgICAgb3MucmVtb3ZlKGZvbykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIG9zLnJtZGlyKGZvbykNCg0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubmFtZSwgY21wX3BhdGggb3IgcGF0aC5yZXBsYWNlKG9zLnNlcCwgIi8iKSkNCg0KICAgIGRlZiB0ZXN0X3BhdGhuYW1lcyhzZWxmKToNCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZSgiZm9vIikNCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oImZvbyIsICIuIiwgImJhciIpKQ0KICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiZm9vIiwgIi4uIiwgImJhciIpKQ0KICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLiIsICJmb28iKSkNCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4iLCAiZm9vIiwgIi4iKSkNCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4iLCAiZm9vIiwgIi4iLCAiYmFyIikpDQogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuIiwgImZvbyIsICIuLiIsICJiYXIiKSkNCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4iLCAiZm9vIiwgIi4uIiwgImJhciIpKQ0KICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLi4iLCAiZm9vIikpDQogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuLiIsICJmb28iLCAiLi4iKSkNCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4uIiwgImZvbyIsICIuIiwgImJhciIpKQ0KICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLi4iLCAiZm9vIiwgIi4uIiwgImJhciIpKQ0KDQogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUoImZvbyIgKyBvcy5zZXAgKyBvcy5zZXAgKyAiYmFyIikNCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZSgiZm9vIiArIG9zLnNlcCArIG9zLnNlcCwgImZvbyIsIGRpcj1UcnVlKQ0KDQogICAgZGVmIHRlc3RfYWJzX3BhdGhuYW1lcyhzZWxmKToNCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6DQogICAgICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCJDOlxcZm9vIiwgImZvbyIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCIvZm9vIiwgImZvbyIpDQogICAgICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCIvLy9mb28iLCAiZm9vIikNCg0KICAgIGRlZiB0ZXN0X2N3ZChzZWxmKToNCiAgICAgICAgIyBUZXN0IGFkZGluZyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4NCiAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkNCiAgICAgICAgb3MuY2hkaXIoVEVNUERJUikNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgb3BlbigiZm9vIiwgInciKS5jbG9zZSgpDQoNCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpDQogICAgICAgICAgICB0YXIuYWRkKCIuIikNCiAgICAgICAgICAgIHRhci5jbG9zZSgpDQoNCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAiciIpDQogICAgICAgICAgICBmb3IgdCBpbiB0YXI6DQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHQubmFtZSA9PSAiLiIgb3IgdC5uYW1lLnN0YXJ0c3dpdGgoIi4vIikpDQogICAgICAgICAgICB0YXIuY2xvc2UoKQ0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgb3MuY2hkaXIoY3dkKQ0KDQogICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3N5bWxpbmsnKSwgIm5lZWRzIG9zLnN5bWxpbmsiKQ0KICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGxfc3ltbGlua3Moc2VsZik6DQogICAgICAgICMgVGVzdCBpZiBleHRyYWN0YWxsIHdvcmtzIHByb3Blcmx5IHdoZW4gdGFyZmlsZSBjb250YWlucyBzeW1saW5rcw0KICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0c3ltbGlua3MiKQ0KICAgICAgICB0ZW1wYXJjaGl2ZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHN5bWxpbmtzLnRhciIpDQogICAgICAgIG9zLm1rZGlyKHRlbXBkaXIpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNvdXJjZV9maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsJ3NvdXJjZScpDQogICAgICAgICAgICB0YXJnZXRfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCdzeW1saW5rJykNCiAgICAgICAgICAgIHdpdGggb3Blbihzb3VyY2VfZmlsZSwndycpIGFzIGY6DQogICAgICAgICAgICAgICAgZi53cml0ZSgnc29tZXRoaW5nXG4nKQ0KICAgICAgICAgICAgb3Muc3ltbGluayhzb3VyY2VfZmlsZSwgdGFyZ2V0X2ZpbGUpDQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGVtcGFyY2hpdmUsJ3cnKQ0KICAgICAgICAgICAgdGFyLmFkZChzb3VyY2VfZmlsZSwgYXJjbmFtZT1vcy5wYXRoLmJhc2VuYW1lKHNvdXJjZV9maWxlKSkNCiAgICAgICAgICAgIHRhci5hZGQodGFyZ2V0X2ZpbGUsIGFyY25hbWU9b3MucGF0aC5iYXNlbmFtZSh0YXJnZXRfZmlsZSkpDQogICAgICAgICAgICB0YXIuY2xvc2UoKQ0KICAgICAgICAgICAgIyBMZXQncyBleHRyYWN0IGl0IHRvIHRoZSBsb2NhdGlvbiB3aGljaCBjb250YWlucyB0aGUgc3ltbGluaw0KICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCdyJykNCiAgICAgICAgICAgICMgdGhpcyBzaG91bGQgbm90IHJhaXNlIE9TRXJyb3I6IFtFcnJubyAxN10gRmlsZSBleGlzdHMNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICB0YXIuZXh0cmFjdGFsbChwYXRoPXRlbXBkaXIpDQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoNCiAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4dHJhY3RhbGwgZmFpbGVkIHdpdGggc3ltbGlua2VkIGZpbGVzIikNCiAgICAgICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICAgICAgdGFyLmNsb3NlKCkNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIG9zLnVubGluayh0ZW1wYXJjaGl2ZSkNCiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikNCg0KICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzeW1saW5rJyksICJuZWVkcyBvcy5zeW1saW5rIikNCiAgICBkZWYgdGVzdF9leHRyYWN0YWxsX2Jyb2tlbl9zeW1saW5rcyhzZWxmKToNCiAgICAgICAgIyBUZXN0IGlmIGV4dHJhY3RhbGwgd29ya3MgcHJvcGVybHkgd2hlbiB0YXJmaWxlIGNvbnRhaW5zIGJyb2tlbg0KICAgICAgICAjIHN5bWxpbmtzDQogICAgICAgIHRlbXBkaXIgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRlc3RzeW1saW5rcyIpDQogICAgICAgIHRlbXBhcmNoaXZlID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0c3ltbGlua3MudGFyIikNCiAgICAgICAgb3MubWtkaXIodGVtcGRpcikNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc291cmNlX2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwnc291cmNlJykNCiAgICAgICAgICAgIHRhcmdldF9maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsJ3N5bWxpbmsnKQ0KICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9maWxlLCd3JykgYXMgZjoNCiAgICAgICAgICAgICAgICBmLndyaXRlKCdzb21ldGhpbmdcbicpDQogICAgICAgICAgICBvcy5zeW1saW5rKHNvdXJjZV9maWxlLCB0YXJnZXRfZmlsZSkNCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0ZW1wYXJjaGl2ZSwndycpDQogICAgICAgICAgICB0YXIuYWRkKHRhcmdldF9maWxlLCBhcmNuYW1lPW9zLnBhdGguYmFzZW5hbWUodGFyZ2V0X2ZpbGUpKQ0KICAgICAgICAgICAgdGFyLmNsb3NlKCkNCiAgICAgICAgICAgICMgcmVtb3ZlIHRoZSByZWFsIGZpbGUNCiAgICAgICAgICAgIG9zLnVubGluayhzb3VyY2VfZmlsZSkNCiAgICAgICAgICAgICMgTGV0J3MgZXh0cmFjdCBpdCB0byB0aGUgbG9jYXRpb24gd2hpY2ggY29udGFpbnMgdGhlIHN5bWxpbmsNCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0ZW1wYXJjaGl2ZSwncicpDQogICAgICAgICAgICAjIHRoaXMgc2hvdWxkIG5vdCByYWlzZSBPU0Vycm9yOiBbRXJybm8gMTddIEZpbGUgZXhpc3RzDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgdGFyLmV4dHJhY3RhbGwocGF0aD10ZW1wZGlyKQ0KICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6DQogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHRyYWN0YWxsIGZhaWxlZCB3aXRoIGJyb2tlbiBzeW1saW5rZWQgZmlsZXMiKQ0KICAgICAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgICAgICB0YXIuY2xvc2UoKQ0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgb3MudW5saW5rKHRlbXBhcmNoaXZlKQ0KICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQ0KDQogICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2xpbmsnKSwgIm5lZWRzIG9zLmxpbmsiKQ0KICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGxfaGFyZGxpbmtzKHNlbGYpOg0KICAgICAgICAjIFRlc3QgaWYgZXh0cmFjdGFsbCB3b3JrcyBwcm9wZXJseSB3aGVuIHRhcmZpbGUgY29udGFpbnMgc3ltbGlua3MNCiAgICAgICAgdGVtcGRpciA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHN5bWxpbmtzIikNCiAgICAgICAgdGVtcGFyY2hpdmUgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRlc3RzeW1saW5rcy50YXIiKQ0KICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzb3VyY2VfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCdzb3VyY2UnKQ0KICAgICAgICAgICAgdGFyZ2V0X2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwnc3ltbGluaycpDQogICAgICAgICAgICB3aXRoIG9wZW4oc291cmNlX2ZpbGUsJ3cnKSBhcyBmOg0KICAgICAgICAgICAgICAgIGYud3JpdGUoJ3NvbWV0aGluZ1xuJykNCiAgICAgICAgICAgIG9zLmxpbmsoc291cmNlX2ZpbGUsIHRhcmdldF9maWxlKQ0KICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCd3JykNCiAgICAgICAgICAgIHRhci5hZGQoc291cmNlX2ZpbGUsIGFyY25hbWU9b3MucGF0aC5iYXNlbmFtZShzb3VyY2VfZmlsZSkpDQogICAgICAgICAgICB0YXIuYWRkKHRhcmdldF9maWxlLCBhcmNuYW1lPW9zLnBhdGguYmFzZW5hbWUodGFyZ2V0X2ZpbGUpKQ0KICAgICAgICAgICAgdGFyLmNsb3NlKCkNCiAgICAgICAgICAgICMgTGV0J3MgZXh0cmFjdCBpdCB0byB0aGUgbG9jYXRpb24gd2hpY2ggY29udGFpbnMgdGhlIHN5bWxpbmsNCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0ZW1wYXJjaGl2ZSwncicpDQogICAgICAgICAgICAjIHRoaXMgc2hvdWxkIG5vdCByYWlzZSBPU0Vycm9yOiBbRXJybm8gMTddIEZpbGUgZXhpc3RzDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgdGFyLmV4dHJhY3RhbGwocGF0aD10ZW1wZGlyKQ0KICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6DQogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHRyYWN0YWxsIGZhaWxlZCB3aXRoIGxpbmtlZCBmaWxlcyIpDQogICAgICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgICAgIHRhci5jbG9zZSgpDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBvcy51bmxpbmsodGVtcGFyY2hpdmUpDQogICAgICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpDQoNCmNsYXNzIFN0cmVhbVdyaXRlVGVzdChXcml0ZVRlc3RCYXNlKToNCg0KICAgIG1vZGUgPSAid3wiDQoNCiAgICBkZWYgdGVzdF9zdHJlYW1fcGFkZGluZyhzZWxmKToNCiAgICAgICAgIyBUZXN0IGZvciBidWcgIzE1NDMzMDMuDQogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpDQogICAgICAgIHRhci5jbG9zZSgpDQoNCiAgICAgICAgaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCJneiIpOg0KICAgICAgICAgICAgZm9iaiA9IGd6aXAuR3ppcEZpbGUodG1wbmFtZSkNCiAgICAgICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQ0KICAgICAgICAgICAgZm9iai5jbG9zZSgpDQogICAgICAgIGVsaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCJiejIiKToNCiAgICAgICAgICAgIGRlYyA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQ0KICAgICAgICAgICAgZGF0YSA9IG9wZW4odG1wbmFtZSwgInJiIikucmVhZCgpDQogICAgICAgICAgICBkYXRhID0gZGVjLmRlY29tcHJlc3MoZGF0YSkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGVjLnVudXNlZF9kYXRhKSA9PSAwLA0KICAgICAgICAgICAgICAgICAgICAiZm91bmQgdHJhaWxpbmcgZGF0YSIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBmb2JqID0gb3Blbih0bXBuYW1lLCAicmIiKQ0KICAgICAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpDQogICAgICAgICAgICBmb2JqLmNsb3NlKCkNCg0KICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YS5jb3VudCgiXDAiKSA9PSB0YXJmaWxlLlJFQ09SRFNJWkUsDQogICAgICAgICAgICAgICAgICAgICAgICAgImluY29ycmVjdCB6ZXJvIHBhZGRpbmciKQ0KDQogICAgZGVmIHRlc3RfZmlsZV9tb2RlKHNlbGYpOg0KICAgICAgICAjIFRlc3QgZm9yIGlzc3VlICM4NDY0OiBDcmVhdGUgZmlsZXMgd2l0aCBjb3JyZWN0DQogICAgICAgICMgcGVybWlzc2lvbnMuDQogICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIG9yIG5vdCBoYXNhdHRyKG9zLCAidW1hc2siKToNCiAgICAgICAgICAgIHJldHVybg0KDQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRtcG5hbWUpOg0KICAgICAgICAgICAgb3MucmVtb3ZlKHRtcG5hbWUpDQoNCiAgICAgICAgb3JpZ2luYWxfdW1hc2sgPSBvcy51bWFzaygwMDIyKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQ0KICAgICAgICAgICAgdGFyLmNsb3NlKCkNCiAgICAgICAgICAgIG1vZGUgPSBvcy5zdGF0KHRtcG5hbWUpLnN0X21vZGUgJiAwNzc3DQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZGUsIDA2NDQsICJ3cm9uZyBmaWxlIHBlcm1pc3Npb25zIikNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIG9zLnVtYXNrKG9yaWdpbmFsX3VtYXNrKQ0KDQoNCmNsYXNzIEdOVVdyaXRlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6DQogICAgIyBUaGlzIHRlc3RjYXNlIGNoZWNrcyBmb3IgY29ycmVjdCBjcmVhdGlvbiBvZiBHTlUgTG9uZ25hbWUNCiAgICAjIGFuZCBMb25nbGluayBleHRlbmRlZCBoZWFkZXJzIChjcC4gYnVnICM4MTIzMjUpLg0KDQogICAgZGVmIF9sZW5ndGgoc2VsZiwgcyk6DQogICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbihzKSArIDEsIDUxMikNCiAgICAgICAgaWYgcmVtYWluZGVyOg0KICAgICAgICAgICAgYmxvY2tzICs9IDENCiAgICAgICAgcmV0dXJuIGJsb2NrcyAqIDUxMg0KDQogICAgZGVmIF9jYWxjX3NpemUoc2VsZiwgbmFtZSwgbGluaz1Ob25lKToNCiAgICAgICAgIyBJbml0aWFsIHRhciBoZWFkZXINCiAgICAgICAgY291bnQgPSA1MTINCg0KICAgICAgICBpZiBsZW4obmFtZSkgPiB0YXJmaWxlLkxFTkdUSF9OQU1FOg0KICAgICAgICAgICAgIyBHTlUgbG9uZ25hbWUgZXh0ZW5kZWQgaGVhZGVyICsgbG9uZ25hbWUNCiAgICAgICAgICAgIGNvdW50ICs9IDUxMg0KICAgICAgICAgICAgY291bnQgKz0gc2VsZi5fbGVuZ3RoKG5hbWUpDQogICAgICAgIGlmIGxpbmsgaXMgbm90IE5vbmUgYW5kIGxlbihsaW5rKSA+IHRhcmZpbGUuTEVOR1RIX0xJTks6DQogICAgICAgICAgICAjIEdOVSBsb25nbGluayBleHRlbmRlZCBoZWFkZXIgKyBsb25nbGluaw0KICAgICAgICAgICAgY291bnQgKz0gNTEyDQogICAgICAgICAgICBjb3VudCArPSBzZWxmLl9sZW5ndGgobGluaykNCiAgICAgICAgcmV0dXJuIGNvdW50DQoNCiAgICBkZWYgX3Rlc3Qoc2VsZiwgbmFtZSwgbGluaz1Ob25lKToNCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbyhuYW1lKQ0KICAgICAgICBpZiBsaW5rOg0KICAgICAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IGxpbmsNCiAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IHRhcmZpbGUuTE5LVFlQRQ0KDQogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIpDQogICAgICAgIHRhci5mb3JtYXQgPSB0YXJmaWxlLkdOVV9GT1JNQVQNCiAgICAgICAgdGFyLmFkZGZpbGUodGFyaW5mbykNCg0KICAgICAgICB2MSA9IHNlbGYuX2NhbGNfc2l6ZShuYW1lLCBsaW5rKQ0KICAgICAgICB2MiA9IHRhci5vZmZzZXQNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYxID09IHYyLCAiR05VIGxvbmduYW1lL2xvbmdsaW5rIGNyZWF0aW9uIGZhaWxlZCIpDQoNCiAgICAgICAgdGFyLmNsb3NlKCkNCg0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSkNCiAgICAgICAgbWVtYmVyID0gdGFyLm5leHQoKQ0KICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShtZW1iZXIsDQogICAgICAgICAgICAgICAgInVuYWJsZSB0byByZWFkIGxvbmduYW1lIG1lbWJlciIpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5uYW1lLCBtZW1iZXIubmFtZSwNCiAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHJlYWQgbG9uZ25hbWUgbWVtYmVyIikNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmxpbmtuYW1lLCBtZW1iZXIubGlua25hbWUsDQogICAgICAgICAgICAgICAgInVuYWJsZSB0byByZWFkIGxvbmduYW1lIG1lbWJlciIpDQoNCiAgICBkZWYgdGVzdF9sb25nbmFtZV8xMDIzKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtIikNCg0KICAgIGRlZiB0ZXN0X2xvbmduYW1lXzEwMjQoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW1lIikNCg0KICAgIGRlZiB0ZXN0X2xvbmduYW1lXzEwMjUoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW1lXyIpDQoNCiAgICBkZWYgdGVzdF9sb25nbGlua18xMDIzKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0KCJuYW1lIiwgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsbmsiKQ0KDQogICAgZGVmIHRlc3RfbG9uZ2xpbmtfMTAyNChzZWxmKToNCiAgICAgICAgc2VsZi5fdGVzdCgibmFtZSIsICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbGluayIpDQoNCiAgICBkZWYgdGVzdF9sb25nbGlua18xMDI1KHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0KCJuYW1lIiwgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsaW5rXyIpDQoNCiAgICBkZWYgdGVzdF9sb25nbmFtZWxpbmtfMTAyMyhzZWxmKToNCiAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbSIsDQogICAgICAgICAgICAgICAgICAgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsbmsiKQ0KDQogICAgZGVmIHRlc3RfbG9uZ25hbWVsaW5rXzEwMjQoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW1lIiwNCiAgICAgICAgICAgICAgICAgICAoImxvbmdsbmsvIiAqIDEyNykgKyAibG9uZ2xpbmsiKQ0KDQogICAgZGVmIHRlc3RfbG9uZ25hbWVsaW5rXzEwMjUoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW1lXyIsDQogICAgICAgICAgICAgICAgICAgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsaW5rXyIpDQoNCg0KY2xhc3MgSGFyZGxpbmtUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToNCiAgICAjIFRlc3QgdGhlIGNyZWF0aW9uIG9mIExOS1RZUEUgKGhhcmRsaW5rKSBtZW1iZXJzIGluIGFuIGFyY2hpdmUuDQoNCiAgICBkZWYgc2V0VXAoc2VsZik6DQogICAgICAgIHNlbGYuZm9vID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJmb28iKQ0KICAgICAgICBzZWxmLmJhciA9IG9zLnBhdGguam9pbihURU1QRElSLCAiYmFyIikNCg0KICAgICAgICBmb2JqID0gb3BlbihzZWxmLmZvbywgIndiIikNCiAgICAgICAgZm9iai53cml0ZSgiZm9vIikNCiAgICAgICAgZm9iai5jbG9zZSgpDQoNCiAgICAgICAgb3MubGluayhzZWxmLmZvbywgc2VsZi5iYXIpDQoNCiAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciKQ0KICAgICAgICBzZWxmLnRhci5hZGQoc2VsZi5mb28pDQoNCiAgICBkZWYgdGVhckRvd24oc2VsZik6DQogICAgICAgIHNlbGYudGFyLmNsb3NlKCkNCiAgICAgICAgb3MucmVtb3ZlKHNlbGYuZm9vKQ0KICAgICAgICBvcy5yZW1vdmUoc2VsZi5iYXIpDQoNCiAgICBkZWYgdGVzdF9hZGRfdHdpY2Uoc2VsZik6DQogICAgICAgICMgVGhlIHNhbWUgbmFtZSB3aWxsIGJlIGFkZGVkIGFzIGEgUkVHVFlQRSBldmVyeQ0KICAgICAgICAjIHRpbWUgcmVnYXJkbGVzcyBvZiBzdF9ubGluay4NCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldHRhcmluZm8oc2VsZi5mb28pDQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5SRUdUWVBFLA0KICAgICAgICAgICAgICAgICJhZGQgZmlsZSBhcyByZWd1bGFyIGZhaWxlZCIpDQoNCiAgICBkZWYgdGVzdF9hZGRfaGFyZGxpbmsoc2VsZik6DQogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXR0YXJpbmZvKHNlbGYuYmFyKQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby50eXBlID09IHRhcmZpbGUuTE5LVFlQRSwNCiAgICAgICAgICAgICAgICAiYWRkIGZpbGUgYXMgaGFyZGxpbmsgZmFpbGVkIikNCg0KICAgIGRlZiB0ZXN0X2RlcmVmZXJlbmNlX2hhcmRsaW5rKHNlbGYpOg0KICAgICAgICBzZWxmLnRhci5kZXJlZmVyZW5jZSA9IFRydWUNCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldHRhcmluZm8oc2VsZi5iYXIpDQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5SRUdUWVBFLA0KICAgICAgICAgICAgICAgICJkZXJlZmVyZW5jaW5nIGhhcmRsaW5rIGZhaWxlZCIpDQoNCg0KY2xhc3MgUGF4V3JpdGVUZXN0KEdOVVdyaXRlVGVzdCk6DQoNCiAgICBkZWYgX3Rlc3Qoc2VsZiwgbmFtZSwgbGluaz1Ob25lKToNCiAgICAgICAgIyBTZWUgR05VV3JpdGVUZXN0Lg0KICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKG5hbWUpDQogICAgICAgIGlmIGxpbms6DQogICAgICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbGluaw0KICAgICAgICAgICAgdGFyaW5mby50eXBlID0gdGFyZmlsZS5MTktUWVBFDQoNCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCkNCiAgICAgICAgdGFyLmFkZGZpbGUodGFyaW5mbykNCiAgICAgICAgdGFyLmNsb3NlKCkNCg0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSkNCiAgICAgICAgaWYgbGluazoNCiAgICAgICAgICAgIGwgPSB0YXIuZ2V0bWVtYmVycygpWzBdLmxpbmtuYW1lDQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGluayA9PSBsLCAiUEFYIGxvbmdsaW5rIGNyZWF0aW9uIGZhaWxlZCIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBuID0gdGFyLmdldG1lbWJlcnMoKVswXS5uYW1lDQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobmFtZSA9PSBuLCAiUEFYIGxvbmduYW1lIGNyZWF0aW9uIGZhaWxlZCIpDQoNCiAgICBkZWYgdGVzdF9wYXhfZ2xvYmFsX2hlYWRlcihzZWxmKToNCiAgICAgICAgcGF4X2hlYWRlcnMgPSB7DQogICAgICAgICAgICAgICAgdSJmb28iOiB1ImJhciIsDQogICAgICAgICAgICAgICAgdSJ1aWQiOiB1IjAiLA0KICAgICAgICAgICAgICAgIHUibXRpbWUiOiB1IjEuMjMiLA0KICAgICAgICAgICAgICAgIHUidGVzdCI6IHUi5Pb8IiwNCiAgICAgICAgICAgICAgICB1IuT2/CI6IHUidGVzdCJ9DQoNCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwNCiAgICAgICAgICAgICAgICBwYXhfaGVhZGVycz1wYXhfaGVhZGVycykNCiAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKCJ0ZXN0IikpDQogICAgICAgIHRhci5jbG9zZSgpDQoNCiAgICAgICAgIyBUZXN0IGlmIHRoZSBnbG9iYWwgaGVhZGVyIHdhcyB3cml0dGVuIGNvcnJlY3RseS4NCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5wYXhfaGVhZGVycywgcGF4X2hlYWRlcnMpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG1lbWJlcnMoKVswXS5wYXhfaGVhZGVycywgcGF4X2hlYWRlcnMpDQoNCiAgICAgICAgIyBUZXN0IGlmIGFsbCB0aGUgZmllbGRzIGFyZSB1bmljb2RlLg0KICAgICAgICBmb3Iga2V5LCB2YWwgaW4gdGFyLnBheF9oZWFkZXJzLml0ZXJpdGVtcygpOg0KICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoa2V5KSBpcyB1bmljb2RlKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodmFsKSBpcyB1bmljb2RlKQ0KICAgICAgICAgICAgaWYga2V5IGluIHRhcmZpbGUuUEFYX05VTUJFUl9GSUVMRFM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB0YXJmaWxlLlBBWF9OVU1CRVJfRklFTERTW2tleV0odmFsKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmFibGUgdG8gY29udmVydCBwYXggaGVhZGVyIGZpZWxkIikNCg0KICAgIGRlZiB0ZXN0X3BheF9leHRlbmRlZF9oZWFkZXIoc2VsZik6DQogICAgICAgICMgVGhlIGZpZWxkcyBmcm9tIHRoZSBwYXggaGVhZGVyIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGUNCiAgICAgICAgIyBUYXJJbmZvLg0KICAgICAgICBwYXhfaGVhZGVycyA9IHt1InBhdGgiOiB1ImZvbyIsIHUidWlkIjogdSIxMjMifQ0KDQogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD10YXJmaWxlLlBBWF9GT1JNQVQsIGVuY29kaW5nPSJpc284ODU5LTEiKQ0KICAgICAgICB0ID0gdGFyZmlsZS5UYXJJbmZvKCkNCiAgICAgICAgdC5uYW1lID0gdSLk9vwiICAgICAjIG5vbi1BU0NJSQ0KICAgICAgICB0LnVpZCA9IDgqKjggICAgICAgICMgdG9vIGxhcmdlDQogICAgICAgIHQucGF4X2hlYWRlcnMgPSBwYXhfaGVhZGVycw0KICAgICAgICB0YXIuYWRkZmlsZSh0KQ0KICAgICAgICB0YXIuY2xvc2UoKQ0KDQogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikNCiAgICAgICAgdCA9IHRhci5nZXRtZW1iZXJzKClbMF0NCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnBheF9oZWFkZXJzLCBwYXhfaGVhZGVycykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm5hbWUsICJmb28iKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudWlkLCAxMjMpDQoNCg0KY2xhc3MgVXN0YXJVbmljb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6DQogICAgIyBBbGwgKlVuaWNvZGVUZXN0cyBGSVhNRQ0KDQogICAgZm9ybWF0ID0gdGFyZmlsZS5VU1RBUl9GT1JNQVQNCg0KICAgIGRlZiB0ZXN0X2lzbzg4NTlfMV9maWxlbmFtZShzZWxmKToNCiAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJpc284ODU5LTEiKQ0KDQogICAgZGVmIHRlc3RfdXRmN19maWxlbmFtZShzZWxmKToNCiAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJ1dGY3IikNCg0KICAgIGRlZiB0ZXN0X3V0ZjhfZmlsZW5hbWUoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3RfdW5pY29kZV9maWxlbmFtZSgidXRmOCIpDQoNCiAgICBkZWYgX3Rlc3RfdW5pY29kZV9maWxlbmFtZShzZWxmLCBlbmNvZGluZyk6DQogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGVycm9ycz0ic3RyaWN0IikNCiAgICAgICAgbmFtZSA9IHUi5Pb8Ig0KICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8obmFtZSkpDQogICAgICAgIHRhci5jbG9zZSgpDQoNCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPWVuY29kaW5nKQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0YXIuZ2V0bmFtZXMoKVswXSkgaXMgbm90IHVuaWNvZGUpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG1lbWJlcnMoKVswXS5uYW1lLCBuYW1lLmVuY29kZShlbmNvZGluZykpDQogICAgICAgIHRhci5jbG9zZSgpDQoNCiAgICBkZWYgdGVzdF91bmljb2RlX2ZpbGVuYW1lX2Vycm9yKHNlbGYpOg0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9c2VsZi5mb3JtYXQsIGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0ic3RyaWN0IikNCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygpDQoNCiAgICAgICAgdGFyaW5mby5uYW1lID0gIuT2/CINCiAgICAgICAgaWYgc2VsZi5mb3JtYXQgPT0gdGFyZmlsZS5QQVhfRk9STUFUOg0KICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXIuYWRkZmlsZSwgdGFyaW5mbykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHRhci5hZGRmaWxlKHRhcmluZm8pDQoNCiAgICAgICAgdGFyaW5mby5uYW1lID0gdSLk9vwiDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyLmFkZGZpbGUsIHRhcmluZm8pDQoNCiAgICAgICAgdGFyaW5mby5uYW1lID0gImZvbyINCiAgICAgICAgdGFyaW5mby51bmFtZSA9IHUi5Pb8Ig0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHRhci5hZGRmaWxlLCB0YXJpbmZvKQ0KDQogICAgZGVmIHRlc3RfdW5pY29kZV9hcmd1bWVudChzZWxmKToNCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsICJyIiwgZW5jb2Rpbmc9Imlzbzg4NTktMSIsIGVycm9ycz0ic3RyaWN0IikNCiAgICAgICAgZm9yIHQgaW4gdGFyOg0KICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC5uYW1lKSBpcyBzdHIpDQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0LmxpbmtuYW1lKSBpcyBzdHIpDQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0LnVuYW1lKSBpcyBzdHIpDQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0LmduYW1lKSBpcyBzdHIpDQogICAgICAgIHRhci5jbG9zZSgpDQoNCiAgICBkZWYgdGVzdF91bmFtZV91bmljb2RlKHNlbGYpOg0KICAgICAgICBmb3IgbmFtZSBpbiAodSLk9vwiLCAi5Pb8Iik6DQogICAgICAgICAgICB0ID0gdGFyZmlsZS5UYXJJbmZvKCJmb28iKQ0KICAgICAgICAgICAgdC51bmFtZSA9IG5hbWUNCiAgICAgICAgICAgIHQuZ25hbWUgPSBuYW1lDQoNCiAgICAgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygpDQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oImZvby50YXIiLCBtb2RlPSJ3IiwgZmlsZW9iaj1mb2JqLCBmb3JtYXQ9c2VsZi5mb3JtYXQsIGVuY29kaW5nPSJpc284ODU5LTEiKQ0KICAgICAgICAgICAgdGFyLmFkZGZpbGUodCkNCiAgICAgICAgICAgIHRhci5jbG9zZSgpDQogICAgICAgICAgICBmb2JqLnNlZWsoMCkNCg0KICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKCJmb28udGFyIiwgZmlsZW9iaj1mb2JqLCBlbmNvZGluZz0iaXNvODg1OS0xIikNCiAgICAgICAgICAgIHQgPSB0YXIuZ2V0bWVtYmVyKCJmb28iKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnVuYW1lLCAi5Pb8IikNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5nbmFtZSwgIuT2/CIpDQoNCg0KY2xhc3MgR05VVW5pY29kZVRlc3QoVXN0YXJVbmljb2RlVGVzdCk6DQoNCiAgICBmb3JtYXQgPSB0YXJmaWxlLkdOVV9GT1JNQVQNCg0KDQpjbGFzcyBQYXhVbmljb2RlVGVzdChVc3RhclVuaWNvZGVUZXN0KToNCg0KICAgIGZvcm1hdCA9IHRhcmZpbGUuUEFYX0ZPUk1BVA0KDQogICAgZGVmIF9jcmVhdGVfdW5pY29kZV9uYW1lKHNlbGYsIG5hbWUpOg0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9c2VsZi5mb3JtYXQpDQogICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8oKQ0KICAgICAgICB0LnBheF9oZWFkZXJzWyJwYXRoIl0gPSBuYW1lDQogICAgICAgIHRhci5hZGRmaWxlKHQpDQogICAgICAgIHRhci5jbG9zZSgpDQoNCiAgICBkZWYgdGVzdF9lcnJvcl9oYW5kbGVycyhzZWxmKToNCiAgICAgICAgIyBUZXN0IGlmIHRoZSB1bmljb2RlIGVycm9yIGhhbmRsZXJzIHdvcmsgY29ycmVjdGx5IGZvciBjaGFyYWN0ZXJzDQogICAgICAgICMgdGhhdCBjYW5ub3QgYmUgZXhwcmVzc2VkIGluIGEgZ2l2ZW4gZW5jb2RpbmcuDQogICAgICAgIHNlbGYuX2NyZWF0ZV91bmljb2RlX25hbWUodSLk9vwiKQ0KDQogICAgICAgIGZvciBoYW5kbGVyLCBuYW1lIGluICgoInV0Zi04IiwgdSLk9vwiLmVuY29kZSgidXRmOCIpKSwNCiAgICAgICAgICAgICAgICAgICAgKCJyZXBsYWNlIiwgIj8/PyIpLCAoImlnbm9yZSIsICIiKSk6DQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iYXNjaWkiLA0KICAgICAgICAgICAgICAgICAgICBlcnJvcnM9aGFuZGxlcikNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG5hbWVzKClbMF0sIG5hbWUpDQoNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsDQogICAgICAgICAgICAgICAgZW5jb2Rpbmc9ImFzY2lpIiwgZXJyb3JzPSJzdHJpY3QiKQ0KDQogICAgZGVmIHRlc3RfZXJyb3JfaGFuZGxlcl91dGY4KHNlbGYpOg0KICAgICAgICAjIENyZWF0ZSBhIHBhdGhuYW1lIHRoYXQgaGFzIG9uZSBjb21wb25lbnQgcmVwcmVzZW50YWJsZSB1c2luZw0KICAgICAgICAjIGlzbzg4NTktMSBhbmQgdGhlIG90aGVyIG9ubHkgaW4gaXNvODg1OS0xNS4NCiAgICAgICAgc2VsZi5fY3JlYXRlX3VuaWNvZGVfbmFtZSh1IuT2/C+kIikNCg0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iaXNvODg1OS0xIiwNCiAgICAgICAgICAgICAgICBlcnJvcnM9InV0Zi04IikNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bmFtZXMoKVswXSwgIuT2/C8iICsgdSKkIi5lbmNvZGUoInV0ZjgiKSkNCg0KDQpjbGFzcyBBcHBlbmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToNCiAgICAjIFRlc3QgYXBwZW5kIG1vZGUgKGNwLiBwYXRjaCAjMTY1MjY4MSkuDQoNCiAgICBkZWYgc2V0VXAoc2VsZik6DQogICAgICAgIHNlbGYudGFybmFtZSA9IHRtcG5hbWUNCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi50YXJuYW1lKToNCiAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLnRhcm5hbWUpDQoNCiAgICBkZWYgX2FkZF90ZXN0ZmlsZShzZWxmLCBmaWxlb2JqPU5vbmUpOg0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCAiYSIsIGZpbGVvYmo9ZmlsZW9iaikNCiAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKCJiYXIiKSkNCiAgICAgICAgdGFyLmNsb3NlKCkNCg0KICAgIGRlZiBfY3JlYXRlX3Rlc3R0YXIoc2VsZiwgbW9kZT0idzoiKToNCiAgICAgICAgc3JjID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQ0KICAgICAgICB0ID0gc3JjLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpDQogICAgICAgIHQubmFtZSA9ICJmb28iDQogICAgICAgIGYgPSBzcmMuZXh0cmFjdGZpbGUodCkNCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgbW9kZSkNCiAgICAgICAgdGFyLmFkZGZpbGUodCwgZikNCiAgICAgICAgdGFyLmNsb3NlKCkNCg0KICAgIGRlZiBfdGVzdChzZWxmLCBuYW1lcz1bImJhciJdLCBmaWxlb2JqPU5vbmUpOg0KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBmaWxlb2JqPWZpbGVvYmopDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG5hbWVzKCksIG5hbWVzKQ0KDQogICAgZGVmIHRlc3Rfbm9uX2V4aXN0aW5nKHNlbGYpOg0KICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoKQ0KICAgICAgICBzZWxmLl90ZXN0KCkNCg0KICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOg0KICAgICAgICB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCAidzoiKS5jbG9zZSgpDQogICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZSgpDQogICAgICAgIHNlbGYuX3Rlc3QoKQ0KDQogICAgZGVmIHRlc3RfZW1wdHlfZmlsZW9iaihzZWxmKToNCiAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKCJcMCIgKiAxMDI0KQ0KICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoZm9iaikNCiAgICAgICAgZm9iai5zZWVrKDApDQogICAgICAgIHNlbGYuX3Rlc3QoZmlsZW9iaj1mb2JqKQ0KDQogICAgZGVmIHRlc3RfZmlsZW9iaihzZWxmKToNCiAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoKQ0KICAgICAgICBkYXRhID0gb3BlbihzZWxmLnRhcm5hbWUpLnJlYWQoKQ0KICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkNCiAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKGZvYmopDQogICAgICAgIGZvYmouc2VlaygwKQ0KICAgICAgICBzZWxmLl90ZXN0KG5hbWVzPVsiZm9vIiwgImJhciJdLCBmaWxlb2JqPWZvYmopDQoNCiAgICBkZWYgdGVzdF9leGlzdGluZyhzZWxmKToNCiAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoKQ0KICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoKQ0KICAgICAgICBzZWxmLl90ZXN0KG5hbWVzPVsiZm9vIiwgImJhciJdKQ0KDQogICAgZGVmIHRlc3RfYXBwZW5kX2d6KHNlbGYpOg0KICAgICAgICBpZiBnemlwIGlzIE5vbmU6DQogICAgICAgICAgICByZXR1cm4NCiAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoInc6Z3oiKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lLCAiYSIpDQoNCiAgICBkZWYgdGVzdF9hcHBlbmRfYnoyKHNlbGYpOg0KICAgICAgICBpZiBiejIgaXMgTm9uZToNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigidzpiejIiKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lLCAiYSIpDQoNCiAgICAjIEFwcGVuZCBtb2RlIGlzIHN1cHBvc2VkIHRvIGZhaWwgaWYgdGhlIHRhcmZpbGUgdG8gYXBwZW5kIHRvDQogICAgIyBkb2VzIG5vdCBlbmQgd2l0aCBhIHplcm8gYmxvY2suDQogICAgZGVmIF90ZXN0X2Vycm9yKHNlbGYsIGRhdGEpOg0KICAgICAgICBvcGVuKHNlbGYudGFybmFtZSwgIndiIikud3JpdGUoZGF0YSkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHNlbGYuX2FkZF90ZXN0ZmlsZSkNCg0KICAgIGRlZiB0ZXN0X251bGwoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3RfZXJyb3IoIiIpDQoNCiAgICBkZWYgdGVzdF9pbmNvbXBsZXRlKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X2Vycm9yKCJcMCIgKiAxMykNCg0KICAgIGRlZiB0ZXN0X3ByZW1hdHVyZV9lb2Yoc2VsZik6DQogICAgICAgIGRhdGEgPSB0YXJmaWxlLlRhckluZm8oImZvbyIpLnRvYnVmKCkNCiAgICAgICAgc2VsZi5fdGVzdF9lcnJvcihkYXRhKQ0KDQogICAgZGVmIHRlc3RfdHJhaWxpbmdfZ2FyYmFnZShzZWxmKToNCiAgICAgICAgZGF0YSA9IHRhcmZpbGUuVGFySW5mbygiZm9vIikudG9idWYoKQ0KICAgICAgICBzZWxmLl90ZXN0X2Vycm9yKGRhdGEgKyAiXDAiICogMTMpDQoNCiAgICBkZWYgdGVzdF9pbnZhbGlkKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X2Vycm9yKCJhIiAqIDUxMikNCg0KDQpjbGFzcyBMaW1pdHNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToNCg0KICAgIGRlZiB0ZXN0X3VzdGFyX2xpbWl0cyhzZWxmKToNCiAgICAgICAgIyAxMDAgY2hhciBuYW1lDQogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjAxMjM0NTY3ODkiICogMTApDQogICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5VU1RBUl9GT1JNQVQpDQoNCiAgICAgICAgIyAxMDEgY2hhciBuYW1lIHRoYXQgY2Fubm90IGJlIHN0b3JlZA0KICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIwMTIzNDU2Nzg5IiAqIDEwICsgIjAiKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkNCg0KICAgICAgICAjIDI1NiBjaGFyIG5hbWUgd2l0aCBhIHNsYXNoIGF0IHBvcyAxNTYNCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiA2MiArICJsb25nbmFtZSIpDQogICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5VU1RBUl9GT1JNQVQpDQoNCiAgICAgICAgIyAyNTYgY2hhciBuYW1lIHRoYXQgY2Fubm90IGJlIHN0b3JlZA0KICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjM0NTY3LyIgKiAzMSArICJsb25nbmFtZSIpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQ0KDQogICAgICAgICMgNTEyIGNoYXIgbmFtZQ0KICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQ0KDQogICAgICAgICMgNTEyIGNoYXIgbGlua25hbWUNCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibG9uZ2xpbmsiKQ0KICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIg0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkNCg0KICAgICAgICAjIHVpZCA+IDggZGlnaXRzDQogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIm5hbWUiKQ0KICAgICAgICB0YXJpbmZvLnVpZCA9IDAxMDAwMDAwMA0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkNCg0KICAgIGRlZiB0ZXN0X2dudV9saW1pdHMoc2VsZik6DQogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogMTI2ICsgImxvbmduYW1lIikNCiAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLkdOVV9GT1JNQVQpDQoNCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibG9uZ2xpbmsiKQ0KICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIg0KICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuR05VX0ZPUk1BVCkNCg0KICAgICAgICAjIHVpZCA+PSAyNTYgKiogNw0KICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJuYW1lIikNCiAgICAgICAgdGFyaW5mby51aWQgPSAwNDAwMDAwMDAwMDAwMDAwMDAwMEwNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5HTlVfRk9STUFUKQ0KDQogICAgZGVmIHRlc3RfcGF4X2xpbWl0cyhzZWxmKToNCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiKQ0KICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuUEFYX0ZPUk1BVCkNCg0KICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJsb25nbGluayIpDQogICAgICAgIHRhcmluZm8ubGlua25hbWUgPSAiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiDQogICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5QQVhfRk9STUFUKQ0KDQogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIm5hbWUiKQ0KICAgICAgICB0YXJpbmZvLnVpZCA9IDA0MDAwMDAwMDAwMDAwMDAwMDAwTA0KICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuUEFYX0ZPUk1BVCkNCg0KDQpjbGFzcyBDb250ZXh0TWFuYWdlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOg0KDQogICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6DQogICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHRhcm5hbWUpIGFzIHRhcjoNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGFyLmNsb3NlZCwgImNsb3NlZCBpbnNpZGUgcnVudGltZSBjb250ZXh0IikNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5jbG9zZWQsICJjb250ZXh0IG1hbmFnZXIgZmFpbGVkIikNCg0KICAgIGRlZiB0ZXN0X2Nsb3NlZChzZWxmKToNCiAgICAgICAgIyBUaGUgX19lbnRlcl9fKCkgbWV0aG9kIGlzIHN1cHBvc2VkIHRvIHJhaXNlIElPRXJyb3INCiAgICAgICAgIyBpZiB0aGUgVGFyRmlsZSBvYmplY3QgaXMgYWxyZWFkeSBjbG9zZWQuDQogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lKQ0KICAgICAgICB0YXIuY2xvc2UoKQ0KICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IpOg0KICAgICAgICAgICAgd2l0aCB0YXI6DQogICAgICAgICAgICAgICAgcGFzcw0KDQogICAgZGVmIHRlc3RfZXhjZXB0aW9uKHNlbGYpOg0KICAgICAgICAjIFRlc3QgaWYgdGhlIElPRXJyb3IgZXhjZXB0aW9uIGlzIHBhc3NlZCB0aHJvdWdoIHByb3Blcmx5Lg0KICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbikgYXMgZXhjOg0KICAgICAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4odGFybmFtZSkgYXMgdGFyOg0KICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3INCiAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGV4Yy5leGNlcHRpb24sIElPRXJyb3IsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgZXhjZXB0aW9uIHJhaXNlZCBpbiBjb250ZXh0IG1hbmFnZXIiKQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmNsb3NlZCwgImNvbnRleHQgbWFuYWdlciBmYWlsZWQiKQ0KDQogICAgZGVmIHRlc3Rfbm9fZW9mKHNlbGYpOg0KICAgICAgICAjIF9fZXhpdF9fKCkgbXVzdCBub3Qgd3JpdGUgZW5kLW9mLWFyY2hpdmUgYmxvY2tzIGlmIGFuDQogICAgICAgICMgZXhjZXB0aW9uIHdhcyByYWlzZWQuDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IikgYXMgdGFyOg0KICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbg0KICAgICAgICBleGNlcHQ6DQogICAgICAgICAgICBwYXNzDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5nZXRzaXplKHRtcG5hbWUpLCAwLA0KICAgICAgICAgICAgICAgICJjb250ZXh0IG1hbmFnZXIgd3JvdGUgYW4gZW5kLW9mLWFyY2hpdmUgYmxvY2siKQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmNsb3NlZCwgImNvbnRleHQgbWFuYWdlciBmYWlsZWQiKQ0KDQogICAgZGVmIHRlc3RfZW9mKHNlbGYpOg0KICAgICAgICAjIF9fZXhpdF9fKCkgbXVzdCB3cml0ZSBlbmQtb2YtYXJjaGl2ZSBibG9ja3MsIGkuZS4gY2FsbA0KICAgICAgICAjIFRhckZpbGUuY2xvc2UoKSBpZiB0aGVyZSB3YXMgbm8gZXJyb3IuDQogICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3Iik6DQogICAgICAgICAgICBwYXNzDQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob3MucGF0aC5nZXRzaXplKHRtcG5hbWUpLCAwLA0KICAgICAgICAgICAgICAgICJjb250ZXh0IG1hbmFnZXIgd3JvdGUgbm8gZW5kLW9mLWFyY2hpdmUgYmxvY2siKQ0KDQogICAgZGVmIHRlc3RfZmlsZW9iaihzZWxmKToNCiAgICAgICAgIyBUZXN0IHRoYXQgX19leGl0X18oKSBkaWQgbm90IGNsb3NlIHRoZSBleHRlcm5hbCBmaWxlDQogICAgICAgICMgb2JqZWN0Lg0KICAgICAgICBmb2JqID0gb3Blbih0bXBuYW1lLCAid2IiKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICB3aXRoIHRhcmZpbGUub3BlbihmaWxlb2JqPWZvYmosIG1vZGU9InciKSBhcyB0YXI6DQogICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uDQogICAgICAgIGV4Y2VwdDoNCiAgICAgICAgICAgIHBhc3MNCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmb2JqLmNsb3NlZCwgImV4dGVybmFsIGZpbGUgb2JqZWN0IHdhcyBjbG9zZWQiKQ0KICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmNsb3NlZCwgImNvbnRleHQgbWFuYWdlciBmYWlsZWQiKQ0KICAgICAgICBmb2JqLmNsb3NlKCkNCg0KDQpjbGFzcyBMaW5rRW11bGF0aW9uVGVzdChSZWFkVGVzdCk6DQoNCiAgICAjIFRlc3QgZm9yIGlzc3VlICM4NzQxIHJlZ3Jlc3Npb24uIE9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0DQogICAgIyBzeW1ib2xpYyBvciBoYXJkIGxpbmtzIHRhcmZpbGUgdHJpZXMgdG8gZXh0cmFjdCB0aGVzZSB0eXBlcyBvZiBtZW1iZXJzIGFzDQogICAgIyB0aGUgcmVndWxhciBmaWxlcyB0aGV5IHBvaW50IHRvLg0KICAgIGRlZiBfdGVzdF9saW5rX2V4dHJhY3Rpb24oc2VsZiwgbmFtZSk6DQogICAgICAgIHNlbGYudGFyLmV4dHJhY3QobmFtZSwgVEVNUERJUikNCiAgICAgICAgZGF0YSA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsIG5hbWUpLCAicmIiKS5yZWFkKCkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZDVzdW0oZGF0YSksIG1kNV9yZWd0eXBlKQ0KDQogICAgZGVmIHRlc3RfaGFyZGxpbmtfZXh0cmFjdGlvbjEoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3RfbGlua19leHRyYWN0aW9uKCJ1c3Rhci9sbmt0eXBlIikNCg0KICAgIGRlZiB0ZXN0X2hhcmRsaW5rX2V4dHJhY3Rpb24yKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X2xpbmtfZXh0cmFjdGlvbigiLi91c3Rhci9saW5rdGVzdDIvbG5rdHlwZSIpDQoNCiAgICBkZWYgdGVzdF9zeW1saW5rX2V4dHJhY3Rpb24xKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X2xpbmtfZXh0cmFjdGlvbigidXN0YXIvc3ltdHlwZSIpDQoNCiAgICBkZWYgdGVzdF9zeW1saW5rX2V4dHJhY3Rpb24yKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X2xpbmtfZXh0cmFjdGlvbigiLi91c3Rhci9saW5rdGVzdDIvc3ltdHlwZSIpDQoNCg0KY2xhc3MgR3ppcE1pc2NSZWFkVGVzdChNaXNjUmVhZFRlc3QpOg0KICAgIHRhcm5hbWUgPSBnemlwbmFtZQ0KICAgIG1vZGUgPSAicjpneiINCmNsYXNzIEd6aXBVc3RhclJlYWRUZXN0KFVzdGFyUmVhZFRlc3QpOg0KICAgIHRhcm5hbWUgPSBnemlwbmFtZQ0KICAgIG1vZGUgPSAicjpneiINCmNsYXNzIEd6aXBTdHJlYW1SZWFkVGVzdChTdHJlYW1SZWFkVGVzdCk6DQogICAgdGFybmFtZSA9IGd6aXBuYW1lDQogICAgbW9kZSA9ICJyfGd6Ig0KY2xhc3MgR3ppcFdyaXRlVGVzdChXcml0ZVRlc3QpOg0KICAgIG1vZGUgPSAidzpneiINCmNsYXNzIEd6aXBTdHJlYW1Xcml0ZVRlc3QoU3RyZWFtV3JpdGVUZXN0KToNCiAgICBtb2RlID0gInd8Z3oiDQoNCg0KY2xhc3MgQnoyTWlzY1JlYWRUZXN0KE1pc2NSZWFkVGVzdCk6DQogICAgdGFybmFtZSA9IGJ6Mm5hbWUNCiAgICBtb2RlID0gInI6YnoyIg0KY2xhc3MgQnoyVXN0YXJSZWFkVGVzdChVc3RhclJlYWRUZXN0KToNCiAgICB0YXJuYW1lID0gYnoybmFtZQ0KICAgIG1vZGUgPSAicjpiejIiDQpjbGFzcyBCejJTdHJlYW1SZWFkVGVzdChTdHJlYW1SZWFkVGVzdCk6DQogICAgdGFybmFtZSA9IGJ6Mm5hbWUNCiAgICBtb2RlID0gInJ8YnoyIg0KY2xhc3MgQnoyV3JpdGVUZXN0KFdyaXRlVGVzdCk6DQogICAgbW9kZSA9ICJ3OmJ6MiINCmNsYXNzIEJ6MlN0cmVhbVdyaXRlVGVzdChTdHJlYW1Xcml0ZVRlc3QpOg0KICAgIG1vZGUgPSAid3xiejIiDQoNCmNsYXNzIEJ6MlBhcnRpYWxSZWFkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6DQogICAgIyBJc3N1ZTUwNjg6IFRoZSBfQloyUHJveHkucmVhZCgpIG1ldGhvZCBsb29wcyBmb3JldmVyDQogICAgIyBvbiBhbiBlbXB0eSBvciBwYXJ0aWFsIGJ6aXBwZWQgZmlsZS4NCg0KICAgIGRlZiBfdGVzdF9wYXJ0aWFsX2lucHV0KHNlbGYsIG1vZGUpOg0KICAgICAgICBjbGFzcyBNeVN0cmluZ0lPKFN0cmluZ0lPLlN0cmluZ0lPKToNCiAgICAgICAgICAgIGhpdF9lb2YgPSBGYWxzZQ0KICAgICAgICAgICAgZGVmIHJlYWQoc2VsZiwgbik6DQogICAgICAgICAgICAgICAgaWYgc2VsZi5oaXRfZW9mOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiaW5maW5pdGUgbG9vcCBkZXRlY3RlZCBpbiB0YXJmaWxlLm9wZW4oKSIpDQogICAgICAgICAgICAgICAgc2VsZi5oaXRfZW9mID0gc2VsZi5wb3MgPT0gc2VsZi5sZW4NCiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nSU8uU3RyaW5nSU8ucmVhZChzZWxmLCBuKQ0KICAgICAgICAgICAgZGVmIHNlZWsoc2VsZiwgKmFyZ3MpOg0KICAgICAgICAgICAgICAgIHNlbGYuaGl0X2VvZiA9IEZhbHNlDQogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPLnNlZWsoc2VsZiwgKmFyZ3MpDQoNCiAgICAgICAgZGF0YSA9IGJ6Mi5jb21wcmVzcyh0YXJmaWxlLlRhckluZm8oImZvbyIpLnRvYnVmKCkpDQogICAgICAgIGZvciB4IGluIHJhbmdlKGxlbihkYXRhKSArIDEpOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHRhcmZpbGUub3BlbihmaWxlb2JqPU15U3RyaW5nSU8oZGF0YVs6eF0pLCBtb2RlPW1vZGUpDQogICAgICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6DQogICAgICAgICAgICAgICAgcGFzcyAjIHdlIGhhdmUgbm8gaW50ZXJlc3QgaW4gUmVhZEVycm9ycw0KDQogICAgZGVmIHRlc3RfcGFydGlhbF9pbnB1dChzZWxmKToNCiAgICAgICAgc2VsZi5fdGVzdF9wYXJ0aWFsX2lucHV0KCJyIikNCg0KICAgIGRlZiB0ZXN0X3BhcnRpYWxfaW5wdXRfYnoyKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X3BhcnRpYWxfaW5wdXQoInI6YnoyIikNCg0KDQpkZWYgdGVzdF9tYWluKCk6DQogICAgb3MubWFrZWRpcnMoVEVNUERJUikNCg0KICAgIHRlc3RzID0gWw0KICAgICAgICBVc3RhclJlYWRUZXN0LA0KICAgICAgICBNaXNjUmVhZFRlc3QsDQogICAgICAgIFN0cmVhbVJlYWRUZXN0LA0KICAgICAgICBEZXRlY3RSZWFkVGVzdCwNCiAgICAgICAgTWVtYmVyUmVhZFRlc3QsDQogICAgICAgIEdOVVJlYWRUZXN0LA0KICAgICAgICBQYXhSZWFkVGVzdCwNCiAgICAgICAgV3JpdGVUZXN0LA0KICAgICAgICBTdHJlYW1Xcml0ZVRlc3QsDQogICAgICAgIEdOVVdyaXRlVGVzdCwNCiAgICAgICAgUGF4V3JpdGVUZXN0LA0KICAgICAgICBVc3RhclVuaWNvZGVUZXN0LA0KICAgICAgICBHTlVVbmljb2RlVGVzdCwNCiAgICAgICAgUGF4VW5pY29kZVRlc3QsDQogICAgICAgIEFwcGVuZFRlc3QsDQogICAgICAgIExpbWl0c1Rlc3QsDQogICAgICAgIENvbnRleHRNYW5hZ2VyVGVzdCwNCiAgICBdDQoNCiAgICBpZiBoYXNhdHRyKG9zLCAibGluayIpOg0KICAgICAgICB0ZXN0cy5hcHBlbmQoSGFyZGxpbmtUZXN0KQ0KICAgIGVsc2U6DQogICAgICAgIHRlc3RzLmFwcGVuZChMaW5rRW11bGF0aW9uVGVzdCkNCg0KICAgIGZvYmogPSBvcGVuKHRhcm5hbWUsICJyYiIpDQogICAgZGF0YSA9IGZvYmoucmVhZCgpDQogICAgZm9iai5jbG9zZSgpDQoNCiAgICBpZiBnemlwOg0KICAgICAgICAjIENyZWF0ZSB0ZXN0dGFyLnRhci5neiBhbmQgYWRkIGd6aXAtc3BlY2lmaWMgdGVzdHMuDQogICAgICAgIHRhciA9IGd6aXAub3BlbihnemlwbmFtZSwgIndiIikNCiAgICAgICAgdGFyLndyaXRlKGRhdGEpDQogICAgICAgIHRhci5jbG9zZSgpDQoNCiAgICAgICAgdGVzdHMgKz0gWw0KICAgICAgICAgICAgR3ppcE1pc2NSZWFkVGVzdCwNCiAgICAgICAgICAgIEd6aXBVc3RhclJlYWRUZXN0LA0KICAgICAgICAgICAgR3ppcFN0cmVhbVJlYWRUZXN0LA0KICAgICAgICAgICAgR3ppcFdyaXRlVGVzdCwNCiAgICAgICAgICAgIEd6aXBTdHJlYW1Xcml0ZVRlc3QsDQogICAgICAgIF0NCg0KICAgIGlmIGJ6MjoNCiAgICAgICAgIyBDcmVhdGUgdGVzdHRhci50YXIuYnoyIGFuZCBhZGQgYnoyLXNwZWNpZmljIHRlc3RzLg0KICAgICAgICB0YXIgPSBiejIuQloyRmlsZShiejJuYW1lLCAid2IiKQ0KICAgICAgICB0YXIud3JpdGUoZGF0YSkNCiAgICAgICAgdGFyLmNsb3NlKCkNCg0KICAgICAgICB0ZXN0cyArPSBbDQogICAgICAgICAgICBCejJNaXNjUmVhZFRlc3QsDQogICAgICAgICAgICBCejJVc3RhclJlYWRUZXN0LA0KICAgICAgICAgICAgQnoyU3RyZWFtUmVhZFRlc3QsDQogICAgICAgICAgICBCejJXcml0ZVRlc3QsDQogICAgICAgICAgICBCejJTdHJlYW1Xcml0ZVRlc3QsDQogICAgICAgICAgICBCejJQYXJ0aWFsUmVhZFRlc3QsDQogICAgICAgIF0NCg0KICAgIHRyeToNCiAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpDQogICAgZmluYWxseToNCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoVEVNUERJUik6DQogICAgICAgICAgICBzaHV0aWwucm10cmVlKFRFTVBESVIpDQoNCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6DQogICAgdGVzdF9tYWluKCkNCg==