From 2c19af2e8dc61e02a91b545657629e896779d3b2 Mon Sep 17 00:00:00 2001 From: Benjamin Cable Date: Tue, 13 Mar 2018 14:36:46 +0000 Subject: [PATCH] regenerate packr file --- main-packr.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main-packr.go b/main-packr.go index fb90d08..771f349 100644 --- a/main-packr.go +++ b/main-packr.go @@ -12,6 +12,6 @@ func init() { packr.PackJSONBytes("./tmpl", "model.html", "\"e3tkZWZpbmUgIm1vZGVsIn19CnBhY2thZ2Uge3sgLlBhY2thZ2VOYW1lIH19CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBDb2RlIGdlbmVyYXRlZCBieSBtb2RlbGdlbiB8CnwgICAgICAgIERPIE5PVCBFRElULiAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8vIElmIHlvdSB3YW50IHRvIGV4dGVuZCBiZWhhdmlvdXI6Ci8vIFBsZWFzZSBjcmVhdGUgYSBjdXN0b20gZmlsZSBpbiB0aGlzIGRpcmVjdG9yeQovLyBhbmQgY3JlYXRlIHRoZSBtZXRob2RzIHRoZXJlIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHlvdXIgY29kZSB3aXRoIHRoZSBnZW5lcmF0ZWQgb25lLgoKaW1wb3J0ICgKImZtdCIKImRhdGFiYXNlL3NxbCIKICAgIHt7IHJhbmdlICRrLCAkdjo9IC5Nb2RlbC5JbXBvcnRzIH19CiAgICAie3ska319IgogICAge3stIGVuZCB9fQopCgovLyB7ey5Nb2RlbC5OYW1lfX0gcmVwcmVzZW50cyBhIHJvdyBpbiB0aGUge3suTW9kZWwuVGFibGVOYW1lfX0gdGFibGUKdHlwZSB7ey5Nb2RlbC5OYW1lfX0gc3RydWN0IHsKICAgIHt7IHJhbmdlICRrLCAkdjo9IC5Nb2RlbC5GaWVsZHMgfX0KICAgICAgICB7eyAkdi5OYW1lIH19IHt7ICR2LlR5cGUgfX0gYGpzb246Int7JHYuQ29sdW1uTmFtZX19ImAKICAgIHt7LSBlbmQgfX0Kb2Zmc2V0IGludApsaW1pdCBpbnQKfQoKLy8gSW5zZXJ0IGEgbmV3IHt7Lk1vZGVsLk5hbWV9fSByb3cgaW4gdGhlIHt7Lk1vZGVsLlRhYmxlTmFtZX19IHRhYmxlCmZ1bmMgKHt7LlJlY2VpdmVyfX0gKnt7Lk1vZGVsLk5hbWV9fSkgSW5zZXJ0KGRiICpzcWwuREIpIChsYXN0SW5zZXJ0SUQgaW50NjQsIGVyciBlcnJvcikgewogICAgY29uc3Qgc3RtdCA9ICJJTlNFUlQgSU5UTyB7ey5Nb2RlbC5UYWJsZU5hbWV9fSAoe3suTW9kZWwuRmllbGRzIHwgaW5zZXJ0X2ZpZWxkc319KSBWQUxVRVMgKHt7Lk1vZGVsLkZpZWxkcyB8IGluc2VydF92YWx1ZXN9fSkiCiAgICByZXMsIGVyciA6PSBkYi5FeGVjKHN0bXQsIHt7IC4gfCBpbnNlcnRfYXJncyB9fSkKICAgIGlmIGVyciAhPSBuaWwgewogICAgICAgIHJldHVybiAwLCBlcnIKICAgIH0KICAgIHJldHVybiByZXMuTGFzdEluc2VydElkKCkKfQoKLy8gVXBkYXRlIGFuIGV4aXN0aW5nIHt7Lk1vZGVsLk5hbWV9fSByb3cgaW4gdGhlIHt7Lk1vZGVsLlRhYmxlTmFtZX19IHRhYmxlLgpmdW5jICh7ey5SZWNlaXZlcn19ICp7ey5Nb2RlbC5OYW1lfX0pIFVwZGF0ZShkYiAqc3FsLkRCLCBpZCBpbnQ2NCkgKGludDY0LCBlcnJvcikgewogICAgY29uc3Qgc3RtdCA9ICJVUERBVEUge3suTW9kZWwuVGFibGVOYW1lfX0gU0VUIHt7IC4gfCB1cGRhdGVfdmFsdWVzIH19IFdIRVJFIGlkID0gPyIKICAgIHJlc3VsdCwgZXJyIDo9IGRiLkV4ZWMoc3RtdCwge3sgLiB8IHVwZGF0ZV9hcmdzIH19ICwgaWQpCiAgICBpZiBlcnIgIT0gbmlsIHsKICAgICAgICByZXR1cm4gMCwgZXJyCiAgICB9CiAgICByZXR1cm4gcmVzdWx0LlJvd3NBZmZlY3RlZCgpCn0KCi8vIFVwc2VydCBpbnNlcnRzIGEgbmV3IHt7Lk1vZGVsLk5hbWV9fSByb3cgaW4gdGhlIHt7Lk1vZGVsLlRhYmxlTmFtZX19IHRhYmxlCi8vIGlmIHRoZSB1bmlxdWUgY29uc3RyYWludHMgYXJlIG5vdCBmb3VuZCwgb3RoZXJ3aXNlIGl0IHVwZGF0ZXMgaXQuCmZ1bmMgKHt7LlJlY2VpdmVyfX0gKnt7Lk1vZGVsLk5hbWV9fSkgVXBzZXJ0KGRiICpzcWwuREIpIChsYXN0SW5zZXJ0SUQgaW50NjQsIGVyciBlcnJvcikgewogICAgY29uc3Qgc3RtdCA9ICJJTlNFUlQgSU5UTyB7ey5Nb2RlbC5UYWJsZU5hbWV9fSAoe3suTW9kZWwuRmllbGRzIHwgdXBzZXJ0X2ZpZWxkc319KSBWQUxVRVMgKHt7Lk1vZGVsLkZpZWxkcyB8IHVwc2VydF92YWx1ZXN9fSkgT04gRFVQTElDQVRFIEtFWSBVUERBVEUge3sgLiB8IHVwc2VydF9vbl9kdXBsaWNhdGUgfX0iCiAgICByZXMsIGVyciA6PSBkYi5FeGVjKHN0bXQsIHt7IC4gfCB1cHNlcnRfYXJncyB9fSkKICAgIGlmIGVyciAhPSBuaWwgewogICAgICAgIHJldHVybiAwLCBlcnIKICAgIH0KICAgIHJldHVybiByZXMuTGFzdEluc2VydElkKCkKfQoKLy8gRmluZCBhbiBleGlzdGluZyB7ey5Nb2RlbC5OYW1lfX0gcm93IGluIHRoZSB7ey5Nb2RlbC5UYWJsZU5hbWV9fSB0YWJsZQpmdW5jICh7ey5SZWNlaXZlcn19ICp7ey5Nb2RlbC5OYW1lfX0pIEZpbmQoZGIgKnNxbC5EQiwgaWQgaW50NjQpIGVycm9yIHsKICAgIGNvbnN0IHN0bXQgPSAiU0VMRUNUICogRlJPTSB7ey5Nb2RlbC5UYWJsZU5hbWV9fSBXSEVSRSBpZCA9ID8iCiAgICByb3cgOj0gZGIuUXVlcnlSb3coc3RtdCwgaWQpCiAgICByZXR1cm4gcm93LlNjYW4oe3sgLiB8IHNjYW5fZmllbGRzfX0pCn0KCi8vIExvYWQgYWxsLCBvciBhIHN1YnNldCBvZiB7ey5Nb2RlbC5OYW1lfX0gcm93cyBmcm9tIHRoZSB7ey5Nb2RlbC5UYWJsZU5hbWV9fSB0YWJsZQpmdW5jICh7ey5SZWNlaXZlcn19ICp7ey5Nb2RlbC5OYW1lfX0pIExvYWQoZGIgKnNxbC5EQikgKHNldCBbXXt7Lk1vZGVsLk5hbWV9fSwgZXJyIGVycm9yKSB7CiAgICBzdG10IDo9ICJTRUxFQ1QgKiBGUk9NIHt7Lk1vZGVsLlRhYmxlTmFtZX19IgoKICAgIGlmIHt7LlJlY2VpdmVyfX0ubGltaXQgPT0gMCAmJiB7ey5SZWNlaXZlcn19Lm9mZnNldCA+IDAgewogICAgICAgIHJldHVybiBzZXQsIGZtdC5FcnJvcmYoImNhbm5vdCBxdWVyeSB3aXRoIG9mZnNldCBidXQgbm8gbGltaXQiKQogICAgfQoKICAgIGlmIHt7LlJlY2VpdmVyfX0ubGltaXQgPiAwIHsKICAgICAgICBzdG10ICs9IGZtdC5TcHJpbnRmKCIgTElNSVQgJWQiLCB7ey5SZWNlaXZlcn19LmxpbWl0KQogICAgfQogICAgaWYge3suUmVjZWl2ZXJ9fS5vZmZzZXQgPiAwIHsKICAgICAgICBzdG10ICs9IGZtdC5TcHJpbnRmKCIgT0ZGU0VUICVkIiwge3suUmVjZWl2ZXJ9fS5vZmZzZXQpCiAgICB9CiAgICBkZWZlciBmdW5jKCkgewogICAgICAgIHt7LlJlY2VpdmVyfX0ubGltaXQgPSAwCiAgICAgICAge3suUmVjZWl2ZXJ9fS5vZmZzZXQgPSAwCiAgICB9KCkKICAgIHJvd3MsIGVyciA6PSBkYi5RdWVyeShzdG10KQogICAgaWYgZXJyICE9IG5pbCB7CiAgICAgICAgcmV0dXJuCiAgICB9CiAgICBkZWZlciByb3dzLkNsb3NlKCkKICAgICAgICBmb3Igcm93cy5OZXh0KCkgewogICAgICAgICAgICBpZiBlcnIgPSByb3dzLlNjYW4oe3suIHwgc2Nhbl9maWVsZHN9fSk7IGVyciAhPSBuaWwgewogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgc2V0ID0gYXBwZW5kKHNldCwgKnt7LlJlY2VpdmVyfX0pCiAgICB9CgogICAgcmV0dXJuCn0KCi8vIERlbGV0ZSBhbiBleGlzdGluZyB7ey5Nb2RlbC5OYW1lfX0gcm93IGZyb20gdGhlIHt7Lk1vZGVsLlRhYmxlTmFtZX19IHRhYmxlCmZ1bmMgKHt7LlJlY2VpdmVyfX0gKnt7Lk1vZGVsLk5hbWV9fSkgRGVsZXRlKGRiICpzcWwuREIsIGlkIGludDY0KSAocm93c0FmZmVjdGVkIGludDY0LCBlcnIgZXJyb3IpIHsKICAgIGNvbnN0IHN0bXQgPSAiREVMRVRFIEZST00ge3suTW9kZWwuVGFibGVOYW1lfX0gV0hFUkUgaWQgPSA/IgogICAgcmVzdWx0LCBlcnIgOj0gZGIuRXhlYyhzdG10LCBpZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybgoJfQoKCXJldHVybiByZXN1bHQuUm93c0FmZmVjdGVkKCkKfQoKLy8gQ291bnQgdGhlIG51bWJlciBvZiByb3dzIGZyb20gdGhlIHt7Lk1vZGVsLlRhYmxlTmFtZX19IHRhYmxlCmZ1bmMoe3suUmVjZWl2ZXJ9fSAqe3suTW9kZWwuTmFtZX19KSBDb3VudChkYiAqc3FsLkRCKSAoY291bnQgaW50NjQsIGVyciBlcnJvcikgewogICAgY29uc3Qgc3RtdCA9ICJTRUxFQ1QgQ09VTlQoKikgRlJPTSB7ey5Nb2RlbC5UYWJsZU5hbWV9fSIKICAgIHJvdyA6PSBkYi5RdWVyeVJvdyhzdG10KQogICAgaWYgZXJyID0gcm93LlNjYW4oJmNvdW50KTsgZXJyICE9IG5pbCB7CiAgICAgICAgcmV0dXJuCiAgICB9CiAgICByZXR1cm4KfQoKLy8gRXhpc3RzIGNoZWNrcyBmb3IgdGhlIGl0ZW1zIGV4aXN0ZW5jZSBpbiB0aGUgZGF0YWJhc2UsIGJhc2VkIG9uIGl0J3MgaWQuCi8vIEFuIGVycm9yIHdpbGwgb25seSBiZSByZXR1cm5lZCBpZiBhIFNRTCByZWxhdGVkIGZhaWx1cmUgaGFwcGVucy4KLy8gSW4gYWxsIG90aGVyIGNhc2VzLCBhIGJvb2wgYW5kIG5pbCB3aWxsIHJldHVybi4KZnVuYyh7ey5SZWNlaXZlcn19ICp7ey5Nb2RlbC5OYW1lfX0pIEV4aXN0cyhkYiAqc3FsLkRCLCBpZCBpbnQ2NCkgKGV4aXN0cyBib29sLCBlcnIgZXJyb3IpIHsKICAgIGNvbnN0IHN0bXQgPSAiU0VMRUNUIEVYSVNUUyhTRUxFQ1QgMSBGUk9NIHt7Lk1vZGVsLlRhYmxlTmFtZX19IFdIRVJFIGlkID0gPyBMSU1JVCAxKSBBUyBgZXhpc3RzYCIKICAgIHZhciBjb3VudCBpbnQKICAgIHJvdyA6PSBkYi5RdWVyeVJvdyhzdG10LCBpZCkKICAgIGlmIGVyciA9IHJvdy5TY2FuKCZjb3VudCk7IGVyciAhPSBuaWwgewogICAgICAgIHJldHVybgogICAgfQogICAgcmV0dXJuIGNvdW50ID4gMCwgbmlsCn0KCi8vIFRhYmxlTmFtZSByZXR1cm5zIHRoZSB0YWJsZSBuYW1lCmZ1bmMgKHt7LlJlY2VpdmVyfX0gKnt7Lk1vZGVsLk5hbWV9fSkgVGFibGVOYW1lKCkgc3RyaW5nIHsKcmV0dXJuICJ7ey5Nb2RlbC5UYWJsZU5hbWV9fSIKfQoKLy8gU2V0TGltaXQgc2V0cyB0aGUgcXVlcnkgbGltaXQKZnVuYyAoe3suUmVjZWl2ZXJ9fSAqe3suTW9kZWwuTmFtZX19KSBTZXRMaW1pdChsaW1pdCBpbnQpICp7ey5Nb2RlbC5OYW1lfX0gewp7ey5SZWNlaXZlcn19LmxpbWl0ID0gbGltaXQKcmV0dXJuIHt7LlJlY2VpdmVyfX0KfQoKLy8gU2V0T2Zmc2V0IHNldHMgdGhlIHF1ZXJ5IG9mZnNldApmdW5jICh7ey5SZWNlaXZlcn19ICp7ey5Nb2RlbC5OYW1lfX0pIFNldE9mZnNldChvZmZzZXQgaW50KSAqe3suTW9kZWwuTmFtZX19IHsKe3suUmVjZWl2ZXJ9fS5vZmZzZXQgPSBvZmZzZXQKcmV0dXJuIHt7LlJlY2VpdmVyfX0KfQp7e2VuZH19Cgo=\"") packr.PackJSONBytes("./tmpl", "tmpl.go", "\"cGFja2FnZSB0bXBsCgppbXBvcnQgKAoJImZtdCIKCSJodG1sL3RlbXBsYXRlIgoJInN0cmluZ3MiCikKCnZhciBGdW5jTWFwID0gdGVtcGxhdGUuRnVuY01hcHsKCSJpbnNlcnRfZmllbGRzIjogR2V0SW5zZXJ0RmllbGRzLAoJImluc2VydF92YWx1ZXMiOiBHZXRJbnNlcnRWYWx1ZXMsCgkiaW5zZXJ0X2FyZ3MiOiAgIEdldEluc2VydEFyZ3MsCgkic2Nhbl9maWVsZHMiOiAgIEdldFNjYW5GaWVsZHMsCgkidXBkYXRlX2FyZ3MiOiAgIEdldFVwZGF0ZUFyZ3MsCgkidXBkYXRlX3ZhbHVlcyI6IEdldFVwZGF0ZVZhbHVlcywKCSJ1cHNlcnRfZmllbGRzIjogR2V0VXBzZXJ0RmllbGRzLAoJInVwc2VydF92YWx1ZXMiOiBHZXRVcHNlcnRWYWx1ZXMsCgkidXBzZXJ0X29uX2R1cGxpY2F0ZSI6IEdldFVwc2VydE9uRHVwbGljYXRlLAoJInVwc2VydF9hcmdzIjogR2V0VXBzZXJ0QXJncywKfQoKZnVuYyBHZXRJbnNlcnRGaWVsZHMoZmllbGRzIFtdVG1wbEZpZWxkKSBzdHJpbmcgewoJdmFyIHBhcnRzIFtdc3RyaW5nCglmb3IgXywgZmwgOj0gcmFuZ2UgZmllbGRzIHsKCQlpZiBmbC5Db2x1bW5OYW1lID09ICJpZCIgewoJCQljb250aW51ZQoJCX0KCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgImAiK2ZsLkNvbHVtbk5hbWUrImAiKQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihwYXJ0cywgIiwgIikKfQoKZnVuYyBHZXRJbnNlcnRWYWx1ZXMoZmllbGRzIFtdVG1wbEZpZWxkKSBzdHJpbmcgewoJdmFyIHBhcnRzIFtdc3RyaW5nCglmb3IgXywgZmwgOj0gcmFuZ2UgZmllbGRzIHsKCQlzd2l0Y2ggZmwuQ29sdW1uTmFtZSB7CgkJY2FzZSAiaWQiOgoJCQljb250aW51ZQoJCWNhc2UgImNyZWF0ZWRfYXQiOgoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgIk5PVygpIikKCQkJY29udGludWUKCQlkZWZhdWx0OgoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgIj8iKQoJCX0KCX0KCXJldHVybiBzdHJpbmdzLkpvaW4ocGFydHMsICIsICIpCn0KCmZ1bmMgR2V0SW5zZXJ0QXJncyhtIFN0cnVjdFRtcGxEYXRhKSBzdHJpbmcgewoJdmFyIHBhcnRzIFtdc3RyaW5nCglmb3IgXywgZmwgOj0gcmFuZ2UgbS5Nb2RlbC5GaWVsZHMgewoJCXN3aXRjaCBmbC5OYW1lIHsKCQljYXNlICJJRCIsICJDcmVhdGVkQXQiOgoJCQljb250aW51ZQoJCX0KCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgZm10LlNwcmludGYoIiVzLiVzIiwgbS5SZWNlaXZlciwgZmwuTmFtZSkpCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKHBhcnRzLCAiLCAiKQp9CgpmdW5jIEdldFNjYW5GaWVsZHMobSBTdHJ1Y3RUbXBsRGF0YSkgdGVtcGxhdGUuSFRNTCB7Cgl2YXIgcGFydHMgW11zdHJpbmcKCWZvciBfLCBmbCA6PSByYW5nZSBtLk1vZGVsLkZpZWxkcyB7CgkJcGFydHMgPSBhcHBlbmQocGFydHMsIGZtdC5TcHJpbnRmKCImJXMuJXMiLCBtLlJlY2VpdmVyLCBmbC5OYW1lKSkKCX0KCXJldHVybiB0ZW1wbGF0ZS5IVE1MKHN0cmluZ3MuSm9pbihwYXJ0cywgIiwgIikpCn0KCmZ1bmMgR2V0VXBkYXRlQXJncyhtIFN0cnVjdFRtcGxEYXRhKSB0ZW1wbGF0ZS5IVE1MIHsKCXZhciBwYXJ0cyBbXXN0cmluZwoJZm9yIF8sIGZsIDo9IHJhbmdlIG0uTW9kZWwuRmllbGRzIHsKCQlzd2l0Y2ggZmwuTmFtZSB7CgkJY2FzZSAiSUQiLCAiQ3JlYXRlZEF0IiwgIlVwZGF0ZWRBdCI6CgkJCWNvbnRpbnVlCgkJfQoJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCBmbXQuU3ByaW50ZigiJXMuJXMiLCBtLlJlY2VpdmVyLCBmbC5OYW1lKSkKCX0KCXJldHVybiB0ZW1wbGF0ZS5IVE1MKHN0cmluZ3MuSm9pbihwYXJ0cywgIiwgIikpCn0KCmZ1bmMgR2V0VXBkYXRlVmFsdWVzKG0gU3RydWN0VG1wbERhdGEpIHN0cmluZyB7Cgl2YXIgcGFydHMgW11zdHJpbmcKCWZvciBfLCBmbCA6PSByYW5nZSBtLk1vZGVsLkZpZWxkcyB7CgkJc3dpdGNoIGZsLk5hbWUgewoJCWNhc2UgIklEIiwgIkNyZWF0ZWRBdCI6CgkJCWNvbnRpbnVlCgkJY2FzZSAiVXBkYXRlZEF0IjoKCQkJcGFydHMgPSBhcHBlbmQocGFydHMsIGZtdC5TcHJpbnRmKCJgJXNgPVVUQ19USU1FU1RBTVAoKSIsIGZsLkNvbHVtbk5hbWUpKQoJCWRlZmF1bHQ6CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCBmbXQuU3ByaW50ZigiYCVzYD0/IiwgZmwuQ29sdW1uTmFtZSkpCgkJfQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihwYXJ0cywgIiwgIikKfQoKZnVuYyBHZXRVcHNlcnRGaWVsZHMoZmllbGRzIFtdVG1wbEZpZWxkKSBzdHJpbmcgewoJdmFyIHBhcnRzIFtdc3RyaW5nCglmb3IgXywgZmwgOj0gcmFuZ2UgZmllbGRzIHsKCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgImAiK2ZsLkNvbHVtbk5hbWUrImAiKQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihwYXJ0cywgIiwgIikKfQoKZnVuYyBHZXRVcHNlcnRWYWx1ZXMoZmllbGRzIFtdVG1wbEZpZWxkKSBzdHJpbmcgewoJdmFyIHBhcnRzIFtdc3RyaW5nCglmb3IgXywgZmwgOj0gcmFuZ2UgZmllbGRzIHsKCQlzd2l0Y2ggZmwuQ29sdW1uTmFtZSB7CgkJY2FzZSAiY3JlYXRlZF9hdCI6CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCAiTk9XKCkiKQoJCQljb250aW51ZQoJCWRlZmF1bHQ6CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCAiPyIpCgkJfQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihwYXJ0cywgIiwgIikKfQoKZnVuYyBHZXRVcHNlcnRPbkR1cGxpY2F0ZShtIFN0cnVjdFRtcGxEYXRhKSBzdHJpbmcgewoJdmFyIHBhcnRzIFtdc3RyaW5nCglmb3IgXywgZmwgOj0gcmFuZ2UgbS5Nb2RlbC5GaWVsZHMgewoJCXN3aXRjaCBmbC5OYW1lIHsKCQljYXNlICJDcmVhdGVkQXQiOgoJCQljb250aW51ZQoJCWNhc2UgIklEIjoKCQkJcGFydHMgPSBhcHBlbmQocGFydHMsIGZtdC5TcHJpbnRmKCJgJXNgPUxBU1RfSU5TRVJUX0lEKGAlc2ApIiwgZmwuQ29sdW1uTmFtZSwgZmwuQ29sdW1uTmFtZSkpCgkJY2FzZSAiVXBkYXRlZEF0IjoKCQkJcGFydHMgPSBhcHBlbmQocGFydHMsIGZtdC5TcHJpbnRmKCJgJXNgPVVUQ19USU1FU1RBTVAoKSIsIGZsLkNvbHVtbk5hbWUpKQoJCWRlZmF1bHQ6CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCBmbXQuU3ByaW50ZigiYCVzYD1WQUxVRVMoYCVzYCkiLCBmbC5Db2x1bW5OYW1lLCBmbC5Db2x1bW5OYW1lKSkKCQl9Cgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKHBhcnRzLCAiLCAiKQp9CgpmdW5jIEdldFVwc2VydEFyZ3MobSBTdHJ1Y3RUbXBsRGF0YSkgc3RyaW5nIHsKCXZhciBwYXJ0cyBbXXN0cmluZwoJZm9yIF8sIGZsIDo9IHJhbmdlIG0uTW9kZWwuRmllbGRzIHsKCQlzd2l0Y2ggZmwuTmFtZSB7CgkJY2FzZSAiQ3JlYXRlZEF0IjoKCQkJY29udGludWUKCQl9CgkJcGFydHMgPSBhcHBlbmQocGFydHMsIGZtdC5TcHJpbnRmKCIlcy4lcyIsIG0uUmVjZWl2ZXIsIGZsLk5hbWUpKQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihwYXJ0cywgIiwgIikKfQ==\"") packr.PackJSONBytes("./tmpl", "types.go", "\"cGFja2FnZSB0bXBsCgovLyBUbXBsU3RydWN0cyBpcyBhIGNvbGxlY3Rpb24gb24gVG1wbFN0cnVjdAp0eXBlIFRtcGxTdHJ1Y3RzIFtdVG1wbFN0cnVjdAoKLy8gVG1wbFN0cnVjdCBkZWZpbmVzIHRoZSB0YWJsZSBkYXRhIHRvIHBhc3MgdG8gdGhlIG1vZGVscwp0eXBlIFRtcGxTdHJ1Y3Qgc3RydWN0IHsKCU5hbWUgICAgICBzdHJpbmcKCVRhYmxlTmFtZSBzdHJpbmcKCUZpZWxkcyAgICBbXVRtcGxGaWVsZAoJSW1wb3J0cyAgIG1hcFtzdHJpbmddc3RydWN0e30KfQoKLy8gVG1wbEZpZWxkIGRlZmluZXMgYSB0YWJsZSBmaWVsZCB0ZW1wbGF0ZQp0eXBlIFRtcGxGaWVsZCBzdHJ1Y3QgewoJTmFtZSAgICAgICBzdHJpbmcKCVR5cGUgICAgICAgc3RyaW5nCglDb2x1bW5OYW1lIHN0cmluZwoJTnVsbGFibGUgICBib29sCn0KCi8vIFN0cnVjdFRtcGxEYXRhIGRlZmluZXMgdGhlIHRvcCBsZXZlbCBzdHJ1Y3QgZGF0YSB0byBwYXNzIHRvIHRoZSBtb2RlbHMKdHlwZSBTdHJ1Y3RUbXBsRGF0YSBzdHJ1Y3QgewoJTW9kZWwgICAgICAgVG1wbFN0cnVjdAoJUmVjZWl2ZXIgICAgc3RyaW5nCglQYWNrYWdlTmFtZSBzdHJpbmcKfQo=\"") - packr.PackJSONBytes("./tmpl", "x_helpers.html", "\"e3tkZWZpbmUgImhlbHBlcnMifX0KLy8rYnVpbGQgIWhlbHBlcnMKCnBhY2thZ2Uge3sgLlBhY2thZ2VOYW1lIH19CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBDb2RlIGdlbmVyYXRlZCBieSBtb2RlbGdlbiB8CnwgICAgICAgIERPIE5PVCBFRElULiAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCmltcG9ydCAoCiJkYXRhYmFzZS9zcWwiCiJkYXRhYmFzZS9zcWwvZHJpdmVyIgoiZW5jb2RpbmcvanNvbiIKInJlZmxlY3QiCiJzdHJpbmdzIgoidGltZSIKCiJnaXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiCikKCi8vIFN0ZFRpbWUgcHJvdmlkZXMgZGVmYXVsdCBTUUwgVElNRSBmb3JtYXQKY29uc3QgU3RkVGltZSA9ICIxNTowNDowNSIKCi8vIGVtcHR5VGltZSBhbGxvd3MgZGVmYXVsdCB0aW1lcyB0byBiZSBjb25zaWRlcmVkCi8vIG51bGwgZm9yIGluc2VydGlvbiBpbnRvIHRoZSBkYXRhYmFzZS4KdmFyIGVtcHR5VGltZSA9IHRpbWUuVGltZXt9CgovKi0tLS0tLS0tLS0tLS0rCnwgVHlwZSBhbGlhc2VzIHwKKy0tLS0tLS0tLS0tLS0qLwoKLy8gTnVsbEZsb2F0NjQgYWxpYXNlcyBzcWwuTnVsbEZsb2F0NjQKdHlwZSBOdWxsRmxvYXQ2NCBzcWwuTnVsbEZsb2F0NjQKCi8vIE51bGxTdHJpbmcgYWxpYXNlcyBzcWwuTnVsbFN0cmluZwp0eXBlIE51bGxTdHJpbmcgc3FsLk51bGxTdHJpbmcKCi8vIE51bGxCb29sIGFsaWFzZXMgc3FsLk51bGxCb29sCnR5cGUgTnVsbEJvb2wgc3FsLk51bGxCb29sCgovLyBOdWxsSW50NjQgYWxpYXNlcyBzcWwuTnVsbEludDY0CnR5cGUgTnVsbEludDY0IHNxbC5OdWxsSW50NjQKCi8vIE51bGxUaW1lIGFsaWFzZXMgc3FsLk51bGxUaW1lCnR5cGUgTnVsbFRpbWUgbXlzcWwuTnVsbFRpbWUKCi8vIFJhd0pTT04gYWxpYXNlcyBqc29uLlJhd01lc3NhZ2UKdHlwZSBSYXdKU09OIGpzb24uUmF3TWVzc2FnZQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgTnVsbFN0cmluZyBpbXBsZW1lbnRhdGlvbnMgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8vIE1hcnNoYWxKU09OIGZvciBOdWxsU3RyaW5nCmZ1bmMgKG4gTnVsbFN0cmluZykgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewp2YXIgYSAqc3RyaW5nCmlmIG4uVmFsaWQgewphID0gJm4uU3RyaW5nCn0KcmV0dXJuIGpzb24uTWFyc2hhbChhKQp9CgovLyBVbm1hcnNoYWxKU09OIGZvciBOdWxsU3RyaW5nCmZ1bmMgKG4gKk51bGxTdHJpbmcpIFVubWFyc2hhbEpTT04oYiBbXWJ5dGUpIGVycm9yIHsKZXJyIDo9IGpzb24uVW5tYXJzaGFsKGIsICZuLlN0cmluZykKbi5WYWxpZCA9IGVyciA9PSBuaWwKcmV0dXJuIGVycgp9CgovLyBWYWx1ZSBmb3IgTnVsbFN0cmluZwpmdW5jIChuIE51bGxTdHJpbmcpIFZhbHVlKCkgKGRyaXZlci5WYWx1ZSwgZXJyb3IpIHsKaWYgIW4uVmFsaWQgewpyZXR1cm4gbmlsLCBuaWwKfQpyZXR1cm4gbi5TdHJpbmcsIG5pbAp9CgovLyBTY2FuIGZvciBOdWxsU3RyaW5nCmZ1bmMgKG4gKk51bGxTdHJpbmcpIFNjYW4oc3JjIGludGVyZmFjZXt9KSBlcnJvciB7CnZhciBhIHNxbC5OdWxsU3RyaW5nCmlmIGVyciA6PSBhLlNjYW4oc3JjKTsgZXJyICE9IG5pbCB7CnJldHVybiBlcnIKfQpuLlN0cmluZyA9IGEuU3RyaW5nCmlmIHJlZmxlY3QuVHlwZU9mKHNyYykgIT0gbmlsIHsKbi5WYWxpZCA9IHRydWUKfQpyZXR1cm4gbmlsCn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBOdWxsRmxvYXQ2NCBpbXBsZW1lbnRhdGlvbnMgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovLyBNYXJzaGFsSlNPTiBmb3IgTnVsbEZsb2F0NjQKZnVuYyAobiBOdWxsRmxvYXQ2NCkgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewp2YXIgYSAqZmxvYXQ2NAppZiBuLlZhbGlkIHsKYSA9ICZuLkZsb2F0NjQKfQpyZXR1cm4ganNvbi5NYXJzaGFsKGEpCn0KCi8vIFZhbHVlIGZvciBOdWxsRmxvYXQ2NApmdW5jIChuIE51bGxGbG9hdDY0KSBWYWx1ZSgpIChkcml2ZXIuVmFsdWUsIGVycm9yKSB7CmlmICFuLlZhbGlkIHsKcmV0dXJuIG5pbCwgbmlsCn0KcmV0dXJuIG4uRmxvYXQ2NCwgbmlsCn0KCi8vIFVubWFyc2hhbEpTT04gZm9yIE51bGxGbG9hdDY0CmZ1bmMgKG4gKk51bGxGbG9hdDY0KSBVbm1hcnNoYWxKU09OKGIgW11ieXRlKSBlcnJvciB7CmVyciA6PSBqc29uLlVubWFyc2hhbChiLCAmbi5GbG9hdDY0KQpuLlZhbGlkID0gZXJyID09IG5pbApyZXR1cm4gZXJyCn0KCi8vIFNjYW4gZm9yIE51bGxGbG9hdDY0CmZ1bmMgKG4gKk51bGxGbG9hdDY0KSBTY2FuKHNyYyBpbnRlcmZhY2V7fSkgZXJyb3Igewp2YXIgYSBzcWwuTnVsbEZsb2F0NjQKaWYgZXJyIDo9IGEuU2NhbihzcmMpOyBlcnIgIT0gbmlsIHsKcmV0dXJuIGVycgp9Cm4uRmxvYXQ2NCA9IGEuRmxvYXQ2NAppZiByZWZsZWN0LlR5cGVPZihzcmMpICE9IG5pbCB7Cm4uVmFsaWQgPSB0cnVlCn0KcmV0dXJuIG5pbAp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IE51bGxJbnQ2NCBpbXBsZW1lbnRhdGlvbnMgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLy8gTWFyc2hhbEpTT04gZm9yIE51bGxJbnQ2NApmdW5jIChuIE51bGxJbnQ2NCkgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewp2YXIgYSAqaW50NjQKaWYgbi5WYWxpZCB7CmEgPSAmbi5JbnQ2NAp9CnJldHVybiBqc29uLk1hcnNoYWwoYSkKfQoKLy8gVmFsdWUgZm9yIE51bGxJbnQ2NApmdW5jIChuIE51bGxJbnQ2NCkgVmFsdWUoKSAoZHJpdmVyLlZhbHVlLCBlcnJvcikgewppZiAhbi5WYWxpZCB7CnJldHVybiBuaWwsIG5pbAp9CnJldHVybiBuLkludDY0LCBuaWwKfQoKLy8gVW5tYXJzaGFsSlNPTiBmb3IgTnVsbEludDY0CmZ1bmMgKG4gKk51bGxJbnQ2NCkgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgewplcnIgOj0ganNvbi5Vbm1hcnNoYWwoYiwgJm4uSW50NjQpCm4uVmFsaWQgPSBlcnIgPT0gbmlsCnJldHVybiBlcnIKfQoKLy8gU2NhbiBmb3IgTnVsbEludDY0CmZ1bmMgKG4gKk51bGxJbnQ2NCkgU2NhbihzcmMgaW50ZXJmYWNle30pIGVycm9yIHsKdmFyIGEgc3FsLk51bGxJbnQ2NAppZiBlcnIgOj0gYS5TY2FuKHNyYyk7IGVyciAhPSBuaWwgewpyZXR1cm4gZXJyCn0Kbi5JbnQ2NCA9IGEuSW50NjQKaWYgcmVmbGVjdC5UeXBlT2Yoc3JjKSAhPSBuaWwgewpuLlZhbGlkID0gdHJ1ZQp9CnJldHVybiBuaWwKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IE51bGxCb29sIGltcGxlbWVudGF0aW9ucyB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8vIE1hcnNoYWxKU09OIGZvciBOdWxsQm9vbApmdW5jIChuIE51bGxCb29sKSBNYXJzaGFsSlNPTigpIChbXWJ5dGUsIGVycm9yKSB7CnZhciBhICpib29sCmlmIG4uVmFsaWQgewphID0gJm4uQm9vbAp9CnJldHVybiBqc29uLk1hcnNoYWwoYSkKfQoKLy8gVmFsdWUgZm9yIE51bGxCb29sCmZ1bmMgKG4gTnVsbEJvb2wpIFZhbHVlKCkgKGRyaXZlci5WYWx1ZSwgZXJyb3IpIHsKaWYgIW4uVmFsaWQgewpyZXR1cm4gbmlsLCBuaWwKfQpyZXR1cm4gbi5Cb29sLCBuaWwKfQoKLy8gVW5tYXJzaGFsSlNPTiBmb3IgTnVsbEJvb2wKZnVuYyAobiAqTnVsbEJvb2wpIFVubWFyc2hhbEpTT04oYiBbXWJ5dGUpIGVycm9yIHsKdmFyIGZpZWxkICpib29sCmVyciA6PSBqc29uLlVubWFyc2hhbChiLCAmZmllbGQpCmlmIGZpZWxkICE9IG5pbCB7Cm4uVmFsaWQgPSB0cnVlCm4uQm9vbCA9ICpmaWVsZAp9CnJldHVybiBlcnIKfQoKCi8vIFNjYW4gZm9yIE51bGxCb29sCmZ1bmMgKG4gKk51bGxCb29sKSBTY2FuKHNyYyBpbnRlcmZhY2V7fSkgZXJyb3Igewp2YXIgYSBzcWwuTnVsbEJvb2wKaWYgZXJyIDo9IGEuU2NhbihzcmMpOyBlcnIgIT0gbmlsIHsKcmV0dXJuIGVycgp9Cm4uQm9vbCA9IGEuQm9vbAppZiByZWZsZWN0LlR5cGVPZihzcmMpICE9IG5pbCB7Cm4uVmFsaWQgPSB0cnVlCn0KcmV0dXJuIG5pbAp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgTnVsbFRpbWUgaW1wbGVtZW50YXRpb25zIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLy8gTWFyc2hhbEpTT04gZm9yIE51bGxUaW1lCmZ1bmMgKG4gTnVsbFRpbWUpIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKdmFyIGEgKnRpbWUuVGltZQppZiBuLlZhbGlkIHsKYSA9ICZuLlRpbWUKfQpyZXR1cm4ganNvbi5NYXJzaGFsKGEpCn0KCi8vIFZhbHVlIGZvciBOdWxsVGltZQpmdW5jIChuIE51bGxUaW1lKSBWYWx1ZSgpIChkcml2ZXIuVmFsdWUsIGVycm9yKSB7CmlmICFuLlZhbGlkIHsKcmV0dXJuIG5pbCwgbmlsCn0KcmV0dXJuIG4uVGltZSwgbmlsCn0KCi8vIFVubWFyc2hhbEpTT04gZm9yIE51bGxUaW1lCmZ1bmMgKG4gKk51bGxUaW1lKSBVbm1hcnNoYWxKU09OKGIgW11ieXRlKSBlcnJvciB7CnMgOj0gc3RyaW5nKGIpCnMgPSBzdHJpbmdzLlRyaW0ocywgYCJgKQp0aW0sIGVyciA6PSB0aW1lLlBhcnNlKHRpbWUuUkZDMzMzOSwgcykKaWYgZXJyICE9IG5pbCB7Cm4uVmFsaWQgPSBmYWxzZQpyZXR1cm4gZXJyCn0KCm4uVGltZSA9IHRpbQpuLlZhbGlkID0gdHJ1ZQpyZXR1cm4gbmlsCn0KCi8vIFNjYW4gZm9yIE51bGxUaW1lCmZ1bmMgKG4gKk51bGxUaW1lKSBTY2FuKHNyYyBpbnRlcmZhY2V7fSkgZXJyb3IgewovLyBTZXQgaW5pdGlhbCBzdGF0ZSBmb3Igc3Vic2VxdWVudCBzY2Fucy4Kbi5WYWxpZCA9IGZhbHNlCgp2YXIgYSBteXNxbC5OdWxsVGltZQppZiBlcnIgOj0gYS5TY2FuKHNyYyk7IGVyciAhPSBuaWwgewpyZXR1cm4gZXJyCn0Kbi5UaW1lID0gYS5UaW1lCmlmIHJlZmxlY3QuVHlwZU9mKHNyYykgIT0gbmlsIHsKbi5WYWxpZCA9IHRydWUKfQpyZXR1cm4gbmlsCn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFJhd0pTT04gaW1wbGVtZW50YXRpb25zIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovLyBNYXJzaGFsSlNPTiBmb3IgTnVsbFN0cmluZwpmdW5jIChuIFJhd0pTT04pIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKYSA6PSBqc29uLlJhd01lc3NhZ2UobikKcmV0dXJuIGEuTWFyc2hhbEpTT04oKQp9CgovLyBWYWx1ZSBmb3IgTnVsbFN0cmluZwpmdW5jIChuIFJhd0pTT04pIFZhbHVlKCkgKGRyaXZlci5WYWx1ZSwgZXJyb3IpIHsKcmV0dXJuIHN0cmluZyhuKSwgbmlsCn0KCi8vIFVubWFyc2hhbEpTT04gZm9yIE51bGxTdHJpbmcKZnVuYyAobiAqUmF3SlNPTikgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3Igewp2YXIgYSBqc29uLlJhd01lc3NhZ2UKanNvbi5Vbm1hcnNoYWwoYiwgJmEpCmMgOj0gUmF3SlNPTihhKQoqbiA9IGMKcmV0dXJuIG5pbAp9CgovLyBTY2FuIGZvciBOdWxsU3RyaW5nCmZ1bmMgKG4gKlJhd0pTT04pIFNjYW4oc3JjIGludGVyZmFjZXt9KSBlcnJvciB7CnZhciBhIHNxbC5OdWxsU3RyaW5nCmlmIGVyciA6PSBhLlNjYW4oc3JjKTsgZXJyICE9IG5pbCB7CnJldHVybiBlcnIKfQpqc24gOj0gUmF3SlNPTihbXWJ5dGUoYS5TdHJpbmcpKQoqbiA9IGpzbgpyZXR1cm4gbmlsCn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0rCnwgSGVscGVyIGZ1bmN0aW9ucyB8CistLS0tLS0tLS0tLS0tLS0tLSovCgovLyBUb051bGxTdHJpbmcgcmV0dXJucyBhIG5ldyBOdWxsU3RyaW5nCmZ1bmMgVG9OdWxsU3RyaW5nKHMgKnN0cmluZykgTnVsbFN0cmluZyB7CmlmIHMgPT0gbmlsIHsKcmV0dXJuIE51bGxTdHJpbmcoc3FsLk51bGxTdHJpbmd7VmFsaWQ6IGZhbHNlfSkKfQpyZXR1cm4gTnVsbFN0cmluZyhzcWwuTnVsbFN0cmluZ3tTdHJpbmc6ICpzLCBWYWxpZDogdHJ1ZX0pCn0KCi8vIFRvTnVsbEludDY0IHJldHVybnMgYSBuZXcgTnVsbEludDY0CmZ1bmMgVG9OdWxsSW50NjQoaSAqaW50NjQpIE51bGxJbnQ2NCB7CmlmIGkgPT0gbmlsIHsKcmV0dXJuIE51bGxJbnQ2NChzcWwuTnVsbEludDY0e1ZhbGlkOiBmYWxzZX0pCn0KcmV0dXJuIE51bGxJbnQ2NChzcWwuTnVsbEludDY0e0ludDY0OiAqaSwgVmFsaWQ6IHRydWV9KQp9CgovLyBUb051bGxGbG9hdDY0IHJldHVybnMgYSBuZXcgTnVsbEZsb2F0NjQKZnVuYyBUb051bGxGbG9hdDY0KGkgKmZsb2F0NjQpIE51bGxGbG9hdDY0IHsKaWYgaSA9PSBuaWwgewpyZXR1cm4gTnVsbEZsb2F0NjQoc3FsLk51bGxGbG9hdDY0e1ZhbGlkOiBmYWxzZX0pCn0KcmV0dXJuIE51bGxGbG9hdDY0KHNxbC5OdWxsRmxvYXQ2NHtGbG9hdDY0OiAqaSwgVmFsaWQ6IHRydWV9KQp9CgovLyBUb051bGxCb29sIGNyZWF0ZXMgYSBuZXcgTnVsbEJvb2wKZnVuYyBUb051bGxCb29sKGIgKmJvb2wpIE51bGxCb29sIHsKaWYgYiA9PSBuaWwgewpyZXR1cm4gTnVsbEJvb2woc3FsLk51bGxCb29se1ZhbGlkOiBmYWxzZX0pCn0KcmV0dXJuIE51bGxCb29sKHNxbC5OdWxsQm9vbHtCb29sOiAqYiwgVmFsaWQ6IHRydWV9KQp9CgovLyBUb051bGxUaW1lIGNyZWF0ZXMgYSBuZXcgTnVsbFRpbWUKZnVuYyBUb051bGxUaW1lKHQgdGltZS5UaW1lKSBOdWxsVGltZSB7CmlmIHQgPT0gZW1wdHlUaW1lIHsKcmV0dXJuIE51bGxUaW1lKG15c3FsLk51bGxUaW1le1ZhbGlkOiBmYWxzZX0pCn0KcmV0dXJuIE51bGxUaW1lKG15c3FsLk51bGxUaW1le1RpbWU6IHQsIFZhbGlkOiB0cnVlfSkKfQp7e2VuZH19Cg==\"") - packr.PackJSONBytes("./tmpl", "x_helpers_test.html", "\"e3tkZWZpbmUgImhlbHBlcnN0ZXN0In19CnBhY2thZ2Uge3sgLlBhY2thZ2VOYW1lIH19Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IENvZGUgZ2VuZXJhdGVkIGJ5IG1vZGVsZ2VuIHwKfCAgICAgICAgRE8gTk9UIEVESVQuICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKaW1wb3J0ICgKImRhdGFiYXNlL3NxbC9kcml2ZXIiCiJlbmNvZGluZy9qc29uIgoicmVmbGVjdCIKInRlc3RpbmciCiJ0aW1lIgopCgpmdW5jIFRlc3RTdHJ1Y3RFbWJlZGRpbmcodCAqdGVzdGluZy5UKSB7CnRpbSA6PSB0aW1lLkRhdGUoMjAxNywgMSwgMSwgMCwgMCwgMCwgMCwgdGltZS5VVEMpCmV4cGVjdGVkIDo9IFtdYnl0ZShgeyJhIjoxMjMsImIiOnRydWUsImMiOjEyMy4xMjMsImQiOiJzdHJpbmciLCJlIjoiMjAxNy0wMS0wMVQwMDowMDowMFoiLCJmIjpbMSwyLDNdfWApCnR5cGUgZW1iZWQgc3RydWN0IHsKQSBOdWxsSW50NjQgICBganNvbjoiYSxvbWl0ZW1wdHkiYApCIE51bGxCb29sICAgIGBqc29uOiJiLG9taXRlbXB0eSJgCkMgTnVsbEZsb2F0NjQgYGpzb246ImMsb21pdGVtcHR5ImAKRCBOdWxsU3RyaW5nICBganNvbjoiZCxvbWl0ZW1wdHkiYApFIE51bGxUaW1lICAgIGBqc29uOiJlLG9taXRlbXB0eSJgCkYgUmF3SlNPTiAgICAgYGpzb246ImYsb21pdGVtcHR5ImAKfQplbSA6PSBlbWJlZHsKQTogTnVsbEludDY0e1ZhbGlkOiB0cnVlLCBJbnQ2NDogMTIzfSwKQjogTnVsbEJvb2x7VmFsaWQ6IHRydWUsIEJvb2w6IHRydWV9LApDOiBOdWxsRmxvYXQ2NHtWYWxpZDogdHJ1ZSwgRmxvYXQ2NDogMTIzLjEyM30sCkQ6IE51bGxTdHJpbmd7VmFsaWQ6IHRydWUsIFN0cmluZzogInN0cmluZyJ9LApFOiBOdWxsVGltZXtWYWxpZDogdHJ1ZSwgVGltZTogdGltfSwKRjogUmF3SlNPTihgWzEsMiwzXWApLAp9CmIsIGVyciA6PSBqc29uLk1hcnNoYWwoZW0pCmlmIGVyciAhPSBuaWwgewp0LkZhdGFsKGVycikKfQppZiAhcmVmbGVjdC5EZWVwRXF1YWwoZXhwZWN0ZWQsIGIpIHsKdC5GYXRhbCgibm90IHRoZSBzYW1lIEpTT04hIikKfQppZiAhKHN0cmluZyhiKSA9PSBzdHJpbmcoZXhwZWN0ZWQpKSB7CnQuRmF0YWwoIm5vdCB0aGUgc2FtZSEiKQp9Cgp2YXIgZW0yIGVtYmVkCmlmIGVyciA6PSBqc29uLlVubWFyc2hhbChleHBlY3RlZCwgJmVtMik7IGVyciAhPSBuaWwgewp0LkZhdGFsKGVycikKfQppZiAhcmVmbGVjdC5EZWVwRXF1YWwoZW0yLCBlbSkgewp0LkZhdGFsKCJub3QgY29ycmVjdCIpCn0KfQoKZnVuYyBUZXN0TnVsbFN0cmluZ19Vbm1hcnNoYWxKU09OKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgTnVsbFN0cmluZwpzb3VyY2UgIFtdYnl0ZQp3YW50RXJyIGJvb2wKfXsKewpuYW1lOiAgICAidmFsaWQiLApzb3VyY2U6ICBbXWJ5dGUoYCJoZWxsbyJgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogICAgImludmFsaWQiLApzb3VyY2U6ICBbXWJ5dGUoYHsia2V5IjoidmFsdWUifWApLAp3YW50RXJyOiB0cnVlLAp9LAp7Cm5hbWU6ICAgICJlbXB0eSIsCnNvdXJjZTogIFtdYnl0ZXt9LAp3YW50RXJyOiB0cnVlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmlmIGVyciA6PSB0dC5uLlVubWFyc2hhbEpTT04odHQuc291cmNlKTsgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbFN0cmluZy5Vbm1hcnNoYWxKU09OKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxTdHJpbmdfVmFsdWUodCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICBOdWxsU3RyaW5nCndhbnQgICAgZHJpdmVyLlZhbHVlCndhbnRFcnIgYm9vbAp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46IE51bGxTdHJpbmd7ClZhbGlkOiAgdHJ1ZSwKU3RyaW5nOiAiaGVsbG8iLAp9LAp3YW50OiAgICBkcml2ZXIuVmFsdWUoImhlbGxvIiksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJpbnZhbGlkIiwKbjogTnVsbFN0cmluZ3sKVmFsaWQ6IGZhbHNlLAp9LAp3YW50OiAgICBuaWwsCndhbnRFcnI6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmdvdCwgZXJyIDo9IHR0Lm4uVmFsdWUoKQppZiAoZXJyICE9IG5pbCkgIT0gdHQud2FudEVyciB7CnQuRXJyb3JmKCJOdWxsU3RyaW5nLlZhbHVlKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKcmV0dXJuCn0KaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGdvdCwgdHQud2FudCkgewp0LkVycm9yZigiTnVsbFN0cmluZy5WYWx1ZSgpID0gJXYsIHdhbnQgJXYiLCBnb3QsIHR0LndhbnQpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsU3RyaW5nX1NjYW4odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICAqTnVsbFN0cmluZwp3YW50RXJyIGJvb2wKc3JjICAgICBpbnRlcmZhY2V7fQp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46ICZOdWxsU3RyaW5newpTdHJpbmc6ICJoZWxsbyIsClZhbGlkOiAgdHJ1ZSwKfSwKc3JjOiAgICAgIiIsCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJuaWwgdmFsdWUiLApuOiAmTnVsbFN0cmluZ3sKU3RyaW5nOiAiaGVsbG8iLApWYWxpZDogIGZhbHNlLAp9LApzcmM6ICAgICBuaWwsCndhbnRFcnI6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmlmIGVyciA6PSB0dC5uLlNjYW4odHQuc3JjKTsgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbFN0cmluZy5TY2FuKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKfQppZiB0dC5uLlZhbGlkID09IGZhbHNlICYmIHR0LnNyYyAhPSBuaWwgewp0LkVycm9yZigic2hvdWxkIHJldHVybiBudWxsIikKfQppZiB0dC5uLlZhbGlkICYmIHR0LnNyYyAhPSB0dC5uLlN0cmluZyB7CnQuRXJyb3JmKCJpbnZhbGlkIHZhbHVlIikKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxTdHJpbmdfTWFyc2hhbEpTT04odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICAqTnVsbFN0cmluZwp3YW50ICAgIFtdYnl0ZQp3YW50RXJyIGJvb2wKfXsKewpuYW1lOiAidmFsaWQiLApuOiAmTnVsbFN0cmluZ3sKU3RyaW5nOiAiaGVsbG8iLApWYWxpZDogIHRydWUsCn0sCndhbnQ6ICAgIFtdYnl0ZShgImhlbGxvImApLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAidmFsaWQgbnVsbCIsCm46ICZOdWxsU3RyaW5newpTdHJpbmc6ICIiLApWYWxpZDogIGZhbHNlLAp9LAp3YW50OiAgICBbXWJ5dGUoYG51bGxgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogImludmFsaWQiLApuOiAmTnVsbFN0cmluZ3sKVmFsaWQ6IHRydWUsCn0sCndhbnQ6ICAgIFtdYnl0ZShgIiJgKSwKd2FudEVycjogZmFsc2UsCn0sCn0KZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKdC5SdW4odHQubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKZ290LCBlcnIgOj0gdHQubi5NYXJzaGFsSlNPTigpCmlmIChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxTdHJpbmcuTWFyc2hhbEpTT04oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQpyZXR1cm4KfQppZiAhcmVmbGVjdC5EZWVwRXF1YWwoZ290LCB0dC53YW50KSB7CnQuRXJyb3JmKCJOdWxsU3RyaW5nLk1hcnNoYWxKU09OKCkgPSAldiwgd2FudCAldiIsIGdvdCwgdHQud2FudCkKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxCb29sX1VubWFyc2hhbEpTT04odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICAgICAgIHN0cmluZwpuICAgICAgICAgICAgTnVsbEJvb2wKc291cmNlICAgICAgIFtdYnl0ZQp3YW50RXJyICAgICAgYm9vbAp3YW50VmFsaWRpdHkgYm9vbAp9ewp7Cm5hbWU6ICAgICAgICAgInZhbGlkIiwKc291cmNlOiAgICAgICBbXWJ5dGUoYGZhbHNlYCksCndhbnRFcnI6ICAgICAgZmFsc2UsCndhbnRWYWxpZGl0eTogdHJ1ZSwKfSwKewpuYW1lOiAgICAgICAgICJpbnZhbGlkIiwKc291cmNlOiAgICAgICBbXWJ5dGUoYHsia2V5IjoidmFsdWUifWApLAp3YW50RXJyOiAgICAgIHRydWUsCndhbnRWYWxpZGl0eTogZmFsc2UsCn0sCnsKbmFtZTogICAgICAgICAiZW1wdHkiLApzb3VyY2U6ICAgICAgIFtdYnl0ZXt9LAp3YW50RXJyOiAgICAgIHRydWUsCndhbnRWYWxpZGl0eTogZmFsc2UsCn0sCnsKbmFtZTogICAgICAgICAiZXhwbGljaXQgbnVsbCIsCnNvdXJjZTogICAgICAgW11ieXRlKCJudWxsIiksCndhbnRFcnI6ICAgICAgZmFsc2UsCndhbnRWYWxpZGl0eTogZmFsc2UsCn0sCn0KZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKdC5SdW4odHQubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKaWYgZXJyIDo9IHR0Lm4uVW5tYXJzaGFsSlNPTih0dC5zb3VyY2UpOyAoZXJyICE9IG5pbCkgIT0gdHQud2FudEVyciAmJiB0dC5uLlZhbGlkID09IHR0LndhbnRWYWxpZGl0eSB7CiAgICB0LkVycm9yZigiTnVsbEJvb2wuVW5tYXJzaGFsSlNPTigpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsQm9vbF9WYWx1ZSh0ICp0ZXN0aW5nLlQpIHsKdGVzdHMgOj0gW11zdHJ1Y3QgewpuYW1lICAgIHN0cmluZwpuICAgICAgIE51bGxCb29sCndhbnQgICAgZHJpdmVyLlZhbHVlCndhbnRFcnIgYm9vbAp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46IE51bGxCb29sewpWYWxpZDogdHJ1ZSwKQm9vbDogIHRydWUsCn0sCndhbnQ6ICAgIGRyaXZlci5WYWx1ZSh0cnVlKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogImludmFsaWQiLApuOiBOdWxsQm9vbHsKVmFsaWQ6IGZhbHNlLAp9LAp3YW50OiAgICBuaWwsCndhbnRFcnI6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmdvdCwgZXJyIDo9IHR0Lm4uVmFsdWUoKQppZiAoZXJyICE9IG5pbCkgIT0gdHQud2FudEVyciB7CnQuRXJyb3JmKCJOdWxsQm9vbC5WYWx1ZSgpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCnJldHVybgp9CmlmICFyZWZsZWN0LkRlZXBFcXVhbChnb3QsIHR0LndhbnQpIHsKdC5FcnJvcmYoIk51bGxCb29sLlZhbHVlKCkgPSAldiwgd2FudCAldiIsIGdvdCwgdHQud2FudCkKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxCb29sX1NjYW4odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICAqTnVsbEJvb2wKd2FudEVyciBib29sCnNyYyAgICAgaW50ZXJmYWNle30KfXsKewpuYW1lOiAidmFsaWQiLApuOiAmTnVsbEJvb2x7CkJvb2w6ICB0cnVlLApWYWxpZDogdHJ1ZSwKfSwKc3JjOiAgICAgdHJ1ZSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogIm5pbCB2YWx1ZSIsCm46ICZOdWxsQm9vbHsKQm9vbDogIHRydWUsClZhbGlkOiBmYWxzZSwKfSwKc3JjOiAgICAgZmFsc2UsCndhbnRFcnI6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmlmIGVyciA6PSB0dC5uLlNjYW4odHQuc3JjKTsgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEJvb2wuU2NhbigpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCn0KaWYgdHQubi5WYWxpZCA9PSBmYWxzZSAmJiB0dC5zcmMgIT0gbmlsIHsKdC5FcnJvcmYoInNob3VsZCByZXR1cm4gbnVsbCIpCn0KaWYgdHQubi5WYWxpZCAmJiB0dC5zcmMgIT0gdHQubi5Cb29sIHsKdC5FcnJvcmYoImludmFsaWQgdmFsdWUiKQp9Cn0pCn0KfQoKZnVuYyBUZXN0TnVsbEJvb2xfTWFyc2hhbEpTT04odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICAqTnVsbEJvb2wKd2FudCAgICBbXWJ5dGUKd2FudEVyciBib29sCn17CnsKbmFtZTogInZhbGlkIiwKbjogJk51bGxCb29sewpWYWxpZDogdHJ1ZSwKfSwKd2FudDogICAgW11ieXRlKGBmYWxzZWApLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAidmFsaWQgbnVsbCIsCm46ICZOdWxsQm9vbHsKVmFsaWQ6IGZhbHNlLAp9LAp3YW50OiAgICBbXWJ5dGUoYG51bGxgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogImludmFsaWQiLApuOiAmTnVsbEJvb2x7ClZhbGlkOiB0cnVlLAp9LAp3YW50OiAgICBbXWJ5dGUoYGZhbHNlYCksCndhbnRFcnI6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmdvdCwgZXJyIDo9IHR0Lm4uTWFyc2hhbEpTT04oKQppZiAoZXJyICE9IG5pbCkgIT0gdHQud2FudEVyciB7CnQuRXJyb3JmKCJOdWxsQm9vbC5NYXJzaGFsSlNPTigpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCnJldHVybgp9CmlmICFyZWZsZWN0LkRlZXBFcXVhbChnb3QsIHR0LndhbnQpIHsKdC5FcnJvcmYoIk51bGxCb29sLk1hcnNoYWxKU09OKCkgPSAldiwgd2FudCAldiIsIGdvdCwgdHQud2FudCkKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxUaW1lX1VubWFyc2hhbEpTT04odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICBOdWxsVGltZQpzb3VyY2UgIFtdYnl0ZQp3YW50RXJyIGJvb2wKfXsKewpuYW1lOiAgICAidmFsaWQiLApzb3VyY2U6ICBbXWJ5dGUoYCIyMDE3LTExLTI0VDAwOjAwOjAwWiJgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogICAgImludmFsaWQiLApzb3VyY2U6ICBbXWJ5dGUoYHsia2V5IjoidmFsdWUifWApLAp3YW50RXJyOiB0cnVlLAp9LAp7Cm5hbWU6ICAgICJlbXB0eSIsCnNvdXJjZTogIFtdYnl0ZXt9LAp3YW50RXJyOiB0cnVlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmlmIGVyciA6PSB0dC5uLlVubWFyc2hhbEpTT04odHQuc291cmNlKTsgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEJvb2wuVW5tYXJzaGFsSlNPTigpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsVGltZV9WYWx1ZSh0ICp0ZXN0aW5nLlQpIHsKdGltIDo9IHRpbWUuTm93KCkKdGVzdHMgOj0gW11zdHJ1Y3QgewpuYW1lICAgIHN0cmluZwpuICAgICAgIE51bGxUaW1lCndhbnQgICAgZHJpdmVyLlZhbHVlCndhbnRFcnIgYm9vbAp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46IE51bGxUaW1lewpWYWxpZDogdHJ1ZSwKVGltZTogIHRpbSwKfSwKd2FudDogICAgZHJpdmVyLlZhbHVlKHRpbSksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJpbnZhbGlkIiwKbjogTnVsbFRpbWV7ClZhbGlkOiBmYWxzZSwKfSwKd2FudDogICAgbmlsLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewpnb3QsIGVyciA6PSB0dC5uLlZhbHVlKCkKaWYgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbFRpbWUuVmFsdWUoKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQpyZXR1cm4KfQppZiAhcmVmbGVjdC5EZWVwRXF1YWwoZ290LCB0dC53YW50KSB7CnQuRXJyb3JmKCJOdWxsVGltZS5WYWx1ZSgpID0gJXYsIHdhbnQgJXYiLCBnb3QsIHR0LndhbnQpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsVGltZV9TY2FuKHQgKnRlc3RpbmcuVCkgewp0aW0gOj0gdGltZS5Ob3coKQp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgKk51bGxUaW1lCndhbnRFcnIgYm9vbApzcmMgICAgIGludGVyZmFjZXt9Cn17CnsKbmFtZTogInZhbGlkIiwKbjogJk51bGxUaW1lewpUaW1lOiAgdGltLApWYWxpZDogdHJ1ZSwKfSwKc3JjOiAgICAgdGltLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAibmlsIHZhbHVlIiwKbjogJk51bGxUaW1lewpUaW1lOiAgdGltLApWYWxpZDogZmFsc2UsCn0sCnNyYzogICAgIHRpbWUuTm93KCksCndhbnRFcnI6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmlmIGVyciA6PSB0dC5uLlNjYW4odHQuc3JjKTsgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbFRpbWUuU2NhbigpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCn0KaWYgdHQubi5WYWxpZCA9PSBmYWxzZSAmJiB0dC5zcmMgIT0gbmlsIHsKdC5FcnJvcmYoInNob3VsZCByZXR1cm4gbnVsbCIpCn0KaWYgdHQubi5WYWxpZCAmJiB0dC5zcmMgIT0gdHQubi5UaW1lIHsKdC5FcnJvcmYoImludmFsaWQgdmFsdWUiKQp9Cn0pCn0KfQoKZnVuYyBUZXN0TnVsbFRpbWVfTWFyc2hhbEpTT04odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICAqTnVsbFRpbWUKd2FudCAgICBbXWJ5dGUKd2FudEVyciBib29sCn17CnsKbmFtZTogInZhbGlkIiwKbjogJk51bGxUaW1lewpUaW1lOiAgdGltZS5EYXRlKDIwMTcsIDExLCAyNCwgMCwgMCwgMCwgMCwgdGltZS5VVEMpLApWYWxpZDogdHJ1ZSwKfSwKd2FudDogICAgW11ieXRlKGAiMjAxNy0xMS0yNFQwMDowMDowMFoiYCksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJ2YWxpZCBudWxsIiwKbjogJk51bGxUaW1lewpWYWxpZDogZmFsc2UsCn0sCndhbnQ6ICAgIFtdYnl0ZShgbnVsbGApLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAiaW52YWxpZCIsCm46ICZOdWxsVGltZXsKVmFsaWQ6IHRydWUsCn0sCndhbnQ6ICAgIFtdYnl0ZShgIjAwMDEtMDEtMDFUMDA6MDA6MDBaImApLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewpnb3QsIGVyciA6PSB0dC5uLk1hcnNoYWxKU09OKCkKaWYgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbFRpbWUuTWFyc2hhbEpTT04oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQpyZXR1cm4KfQppZiAhcmVmbGVjdC5EZWVwRXF1YWwoZ290LCB0dC53YW50KSB7CnQuRXJyb3JmKCJOdWxsVGltZS5NYXJzaGFsSlNPTigpID0gJXYsIHdhbnQgJXYiLCBnb3QsIHR0LndhbnQpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsSW50NjRfVW5tYXJzaGFsSlNPTih0ICp0ZXN0aW5nLlQpIHsKdGVzdHMgOj0gW11zdHJ1Y3QgewpuYW1lICAgIHN0cmluZwpuICAgICAgIE51bGxJbnQ2NApzb3VyY2UgIFtdYnl0ZQp3YW50RXJyIGJvb2wKfXsKewpuYW1lOiAgICAidmFsaWQiLApzb3VyY2U6ICBbXWJ5dGUoYDEyM2ApLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAgICAiaW52YWxpZCIsCnNvdXJjZTogIFtdYnl0ZShgeyJrZXkiOiJ2YWx1ZSJ9YCksCndhbnRFcnI6IHRydWUsCn0sCnsKbmFtZTogICAgImVtcHR5IiwKc291cmNlOiAgW11ieXRle30sCndhbnRFcnI6IHRydWUsCn0sCn0KZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKdC5SdW4odHQubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKaWYgZXJyIDo9IHR0Lm4uVW5tYXJzaGFsSlNPTih0dC5zb3VyY2UpOyAoZXJyICE9IG5pbCkgIT0gdHQud2FudEVyciB7CnQuRXJyb3JmKCJOdWxsSW50NjQuVW5tYXJzaGFsSlNPTigpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsSW50NjRfVmFsdWUodCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICBOdWxsSW50NjQKd2FudCAgICBkcml2ZXIuVmFsdWUKd2FudEVyciBib29sCn17CnsKbmFtZTogInZhbGlkIiwKbjogTnVsbEludDY0ewpWYWxpZDogdHJ1ZSwKSW50NjQ6IDEyMywKfSwKd2FudDogICAgZHJpdmVyLlZhbHVlKGludDY0KDEyMykpLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAiaW52YWxpZCIsCm46IE51bGxJbnQ2NHsKVmFsaWQ6IGZhbHNlLAp9LAp3YW50OiAgICBuaWwsCndhbnRFcnI6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmdvdCwgZXJyIDo9IHR0Lm4uVmFsdWUoKQppZiAoZXJyICE9IG5pbCkgIT0gdHQud2FudEVyciB7CnQuRXJyb3JmKCJOdWxsSW50NjQuVmFsdWUoKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQpyZXR1cm4KfQppZiAhcmVmbGVjdC5EZWVwRXF1YWwoZ290LCB0dC53YW50KSB7CnQuRXJyb3JmKCJOdWxsSW50NjQuVmFsdWUoKSA9ICV2LCB3YW50ICV2IiwgZ290LCB0dC53YW50KQp9Cn0pCn0KfQoKZnVuYyBUZXN0TnVsbEludDY0X1NjYW4odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICAqTnVsbEludDY0CndhbnRFcnIgYm9vbApzcmMgICAgIGludGVyZmFjZXt9Cn17CnsKbmFtZTogInZhbGlkIiwKbjogJk51bGxJbnQ2NHsKSW50NjQ6IDEyMywKVmFsaWQ6IHRydWUsCn0sCnNyYzogICAgIGludDY0KDEyMyksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJuaWwgdmFsdWUiLApuOiAmTnVsbEludDY0ewpWYWxpZDogZmFsc2UsCn0sCnNyYzogICAgIGludDY0KDEyMyksCndhbnRFcnI6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmlmIGVyciA6PSB0dC5uLlNjYW4odHQuc3JjKTsgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEludDY0LlNjYW4oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQp9CmlmIHR0Lm4uVmFsaWQgPT0gZmFsc2UgJiYgdHQuc3JjICE9IG5pbCB7CnQuRXJyb3JmKCJzaG91bGQgcmV0dXJuIG51bGwiKQp9CmlmIHR0Lm4uVmFsaWQgJiYgdHQuc3JjICE9IHR0Lm4uSW50NjQgewp0LkVycm9yZigiaW52YWxpZCB2YWx1ZSIpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsSW50NjRfTWFyc2hhbEpTT04odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICAqTnVsbEludDY0CndhbnQgICAgW11ieXRlCndhbnRFcnIgYm9vbAp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46ICZOdWxsSW50NjR7CkludDY0OiAxMjMsClZhbGlkOiB0cnVlLAp9LAp3YW50OiAgICBbXWJ5dGUoYDEyM2ApLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAidmFsaWQgbnVsbCIsCm46ICZOdWxsSW50NjR7ClZhbGlkOiBmYWxzZSwKfSwKd2FudDogICAgW11ieXRlKGBudWxsYCksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJpbnZhbGlkIiwKbjogJk51bGxJbnQ2NHsKVmFsaWQ6IHRydWUsCn0sCndhbnQ6ICAgIFtdYnl0ZShgMGApLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewpnb3QsIGVyciA6PSB0dC5uLk1hcnNoYWxKU09OKCkKaWYgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEludDY0Lk1hcnNoYWxKU09OKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKcmV0dXJuCn0KaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGdvdCwgdHQud2FudCkgewp0LkVycm9yZigiTnVsbEludDY0Lk1hcnNoYWxKU09OKCkgPSAldiwgd2FudCAldiIsIGdvdCwgdHQud2FudCkKfQp9KQp9Cn0KZnVuYyBUZXN0TnVsbEZsb2F0NjRfVW5tYXJzaGFsSlNPTih0ICp0ZXN0aW5nLlQpIHsKdGVzdHMgOj0gW11zdHJ1Y3QgewpuYW1lICAgIHN0cmluZwpuICAgICAgIE51bGxGbG9hdDY0CnNvdXJjZSAgW11ieXRlCndhbnRFcnIgYm9vbAp9ewp7Cm5hbWU6ICAgICJ2YWxpZCIsCnNvdXJjZTogIFtdYnl0ZShgMTIzLjEyM2ApLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAgICAiaW52YWxpZCIsCnNvdXJjZTogIFtdYnl0ZShgeyJrZXkiOiJ2YWx1ZSJ9YCksCndhbnRFcnI6IHRydWUsCn0sCnsKbmFtZTogICAgImVtcHR5IiwKc291cmNlOiAgW11ieXRle30sCndhbnRFcnI6IHRydWUsCn0sCn0KZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKdC5SdW4odHQubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKaWYgZXJyIDo9IHR0Lm4uVW5tYXJzaGFsSlNPTih0dC5zb3VyY2UpOyAoZXJyICE9IG5pbCkgIT0gdHQud2FudEVyciB7CnQuRXJyb3JmKCJOdWxsRmxvYXQ2NC5Vbm1hcnNoYWxKU09OKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxGbG9hdDY0X1ZhbHVlKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgTnVsbEZsb2F0NjQKd2FudCAgICBkcml2ZXIuVmFsdWUKd2FudEVyciBib29sCn17CnsKbmFtZTogInZhbGlkIiwKbjogTnVsbEZsb2F0NjR7ClZhbGlkOiAgIHRydWUsCkZsb2F0NjQ6IDEyMy4xMjMsCn0sCndhbnQ6ICAgIGRyaXZlci5WYWx1ZShmbG9hdDY0KDEyMy4xMjMpKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogImludmFsaWQiLApuOiBOdWxsRmxvYXQ2NHsKVmFsaWQ6IGZhbHNlLAp9LAp3YW50OiAgICBuaWwsCndhbnRFcnI6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmdvdCwgZXJyIDo9IHR0Lm4uVmFsdWUoKQppZiAoZXJyICE9IG5pbCkgIT0gdHQud2FudEVyciB7CnQuRXJyb3JmKCJOdWxsRmxvYXQ2NC5WYWx1ZSgpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCnJldHVybgp9CmlmICFyZWZsZWN0LkRlZXBFcXVhbChnb3QsIHR0LndhbnQpIHsKdC5FcnJvcmYoIk51bGxGbG9hdDY0LlZhbHVlKCkgPSAldiwgd2FudCAldiIsIGdvdCwgdHQud2FudCkKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxGbG9hdDY0X1NjYW4odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICAqTnVsbEZsb2F0NjQKd2FudEVyciBib29sCnNyYyAgICAgaW50ZXJmYWNle30KfXsKewpuYW1lOiAidmFsaWQiLApuOiAmTnVsbEZsb2F0NjR7CkZsb2F0NjQ6IDEyMy4xMjMsClZhbGlkOiAgIHRydWUsCn0sCnNyYzogICAgIGZsb2F0NjQoMTIzKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogIm5pbCB2YWx1ZSIsCm46ICZOdWxsRmxvYXQ2NHsKVmFsaWQ6IGZhbHNlLAp9LApzcmM6ICAgICBmbG9hdDY0KDEyMy4xMjMpLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewppZiBlcnIgOj0gdHQubi5TY2FuKHR0LnNyYyk7IChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxGbG9hdDY0LlNjYW4oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQp9CmlmIHR0Lm4uVmFsaWQgPT0gZmFsc2UgJiYgdHQuc3JjICE9IG5pbCB7CnQuRXJyb3JmKCJzaG91bGQgcmV0dXJuIG51bGwiKQp9CmlmIHR0Lm4uVmFsaWQgJiYgdHQuc3JjICE9IHR0Lm4uRmxvYXQ2NCB7CnQuRXJyb3JmKCJpbnZhbGlkIHZhbHVlIikKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxGbG9hdDY0X01hcnNoYWxKU09OKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgKk51bGxGbG9hdDY0CndhbnQgICAgW11ieXRlCndhbnRFcnIgYm9vbAp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46ICZOdWxsRmxvYXQ2NHsKRmxvYXQ2NDogMTIzLjEyMywKVmFsaWQ6ICAgdHJ1ZSwKfSwKd2FudDogICAgW11ieXRlKGAxMjMuMTIzYCksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJ2YWxpZCBudWxsIiwKbjogJk51bGxGbG9hdDY0ewpWYWxpZDogZmFsc2UsCn0sCndhbnQ6ICAgIFtdYnl0ZShgbnVsbGApLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAiaW52YWxpZCIsCm46ICZOdWxsRmxvYXQ2NHsKVmFsaWQ6IHRydWUsCn0sCndhbnQ6ICAgIFtdYnl0ZShgMGApLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewpnb3QsIGVyciA6PSB0dC5uLk1hcnNoYWxKU09OKCkKaWYgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEZsb2F0NjQuTWFyc2hhbEpTT04oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQpyZXR1cm4KfQppZiAhcmVmbGVjdC5EZWVwRXF1YWwoZ290LCB0dC53YW50KSB7CnQuRXJyb3JmKCJOdWxsRmxvYXQ2NC5NYXJzaGFsSlNPTigpID0gJXYsIHdhbnQgJXYiLCBnb3QsIHR0LndhbnQpCn0KfSkKfQp9CgpmdW5jIFRlc3RUb051bGxCb29sKHQgKnRlc3RpbmcuVCkgewpiIDo9IHRydWUKYmIgOj0gVG9OdWxsQm9vbCgmYikKaWYgIWJiLlZhbGlkIHsKdC5FcnJvcmYoImV4cGVjdGVkIHZhbGlkLCBnb3QgJXYiLCBiYi5WYWxpZCkKfQppZiAhYmIuQm9vbCB7CnQuRXJyb3JmKCJleHBlY3RlZCB0cnVlLCBnb3QgJXYiLCBiYi5Cb29sKQp9Cgp2YXIgYjIgKmJvb2wKYmIyIDo9IFRvTnVsbEJvb2woYjIpCmlmIGJiMi5WYWxpZCB7CnQuRXJyb3JmKCJleHBlY3RlZCBub3QgdmFsaWQsIGdvdCAldiIsIGJiMi5WYWxpZCkKfQppZiBiYjIuQm9vbCB7CnQuRXJyb3JmKCJleHBlY3RlZCBmYWxzZSwgZ290ICV2IiwgYmIyLkJvb2wpCn0KfQpmdW5jIFRlc3RUb051bGxJbnQ2NCh0ICp0ZXN0aW5nLlQpIHsKYiA6PSBpbnQ2NCgxMjMpCmJiIDo9IFRvTnVsbEludDY0KCZiKQppZiAhYmIuVmFsaWQgewp0LkVycm9yZigiZXhwZWN0ZWQgdmFsaWQsIGdvdCAldiIsIGJiLlZhbGlkKQp9CmlmIGJiLkludDY0ICE9IDEyMyB7CnQuRXJyb3JmKCJleHBlY3RlZCAxMjMsIGdvdCAldiIsIGJiLkludDY0KQp9Cgp2YXIgYjIgKmludDY0CmJiMiA6PSBUb051bGxJbnQ2NChiMikKaWYgYmIyLlZhbGlkIHsKdC5FcnJvcmYoImV4cGVjdGVkIG5vdCB2YWxpZCwgZ290ICV2IiwgYmIyLlZhbGlkKQp9CmlmIGJiMi5JbnQ2NCAhPSAwIHsKdC5FcnJvcmYoImV4cGVjdGVkIDAsIGdvdCAldiIsIGJiMi5JbnQ2NCkKfQp9CgpmdW5jIFRlc3RUb051bGxGbG9hdDY0KHQgKnRlc3RpbmcuVCkgewpiIDo9IGZsb2F0NjQoMTIzLjEyMykKYmIgOj0gVG9OdWxsRmxvYXQ2NCgmYikKaWYgIWJiLlZhbGlkIHsKdC5FcnJvcmYoImV4cGVjdGVkIHZhbGlkLCBnb3QgJXYiLCBiYi5WYWxpZCkKfQppZiBiYi5GbG9hdDY0ICE9IDEyMy4xMjMgewp0LkVycm9yZigiZXhwZWN0ZWQgMTIzLjEyMywgZ290ICV2IiwgYmIuRmxvYXQ2NCkKfQoKdmFyIGIyICpmbG9hdDY0CmJiMiA6PSBUb051bGxGbG9hdDY0KGIyKQppZiBiYjIuVmFsaWQgewp0LkVycm9yZigiZXhwZWN0ZWQgbm90IHZhbGlkLCBnb3QgJXYiLCBiYjIuVmFsaWQpCn0KaWYgYmIyLkZsb2F0NjQgIT0gMCB7CnQuRXJyb3JmKCJleHBlY3RlZCAwLCBnb3QgJXYiLCBiYjIuRmxvYXQ2NCkKfQp9CmZ1bmMgVGVzdFRvTnVsbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKYiA6PSAicXdlIgpiYiA6PSBUb051bGxTdHJpbmcoJmIpCmlmICFiYi5WYWxpZCB7CnQuRXJyb3JmKCJleHBlY3RlZCB2YWxpZCwgZ290ICV2IiwgYmIuVmFsaWQpCn0KaWYgYmIuU3RyaW5nICE9ICJxd2UiIHsKdC5FcnJvcmYoImV4cGVjdGVkIHF3ZSwgZ290ICV2IiwgYmIuU3RyaW5nKQp9Cgp2YXIgYjIgKnN0cmluZwpiYjIgOj0gVG9OdWxsU3RyaW5nKGIyKQppZiBiYjIuVmFsaWQgewp0LkVycm9yZigiZXhwZWN0ZWQgbm90IHZhbGlkLCBnb3QgJXYiLCBiYjIuVmFsaWQpCn0KaWYgYmIyLlN0cmluZyAhPSAiIiB7CnQuRXJyb3JmKCJleHBlY3RlZCA8ZW1wdHkgc3RyaW5nPiwgZ290ICV2IiwgYmIyLlN0cmluZykKICAgIH0KICAgIH0KICAgIGZ1bmMgVGVzdFRvTnVsbFRpbWUodCAqdGVzdGluZy5UKSB7CiAgICB0aW0gOj0gdGltZS5Ob3coKQogICAgYmIgOj0gVG9OdWxsVGltZSh0aW0pCiAgICBpZiAhYmIuVmFsaWQgewogICAgdC5FcnJvcmYoImV4cGVjdGVkIHZhbGlkLCBnb3QgJXYiLCBiYi5WYWxpZCkKICAgIH0KICAgIGlmIGJiLlRpbWUgIT0gdGltIHsKICAgIHQuRXJyb3JmKCJleHBlY3RlZCAldiwgZ290ICV2IiwgdGltLCBiYi5UaW1lKQogICAgfQoKICAgIHRpbSA9IHRpbWUuVGltZXt9CiAgICBiYiA9IFRvTnVsbFRpbWUodGltKQogICAgaWYgYmIuVmFsaWQgewogICAgdC5FcnJvcmYoImV4cGVjdGVkIGludmFsaWQsIGdvdCAldiIsIGJiLlZhbGlkKQogICAgfQogICAgaWYgYmIuVGltZSAhPSB0aW0gewogICAgdC5FcnJvcmYoImV4cGVjdGVkICV2LCBnb3QgJXYiLCB0aW0sIGJiLlRpbWUpCiAgICB9CiAgICB9Cnt7ZW5kfX0K\"") + packr.PackJSONBytes("./tmpl", "x_helpers.html", "\"e3tkZWZpbmUgImhlbHBlcnMifX0KCnBhY2thZ2Uge3sgLlBhY2thZ2VOYW1lIH19CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBDb2RlIGdlbmVyYXRlZCBieSBtb2RlbGdlbiB8CnwgICAgICAgIERPIE5PVCBFRElULiAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCmltcG9ydCAoCiJkYXRhYmFzZS9zcWwiCiJkYXRhYmFzZS9zcWwvZHJpdmVyIgoiZW5jb2RpbmcvanNvbiIKInJlZmxlY3QiCiJzdHJpbmdzIgoidGltZSIKCiJnaXRodWIuY29tL2dvLXNxbC1kcml2ZXIvbXlzcWwiCikKCi8vIFN0ZFRpbWUgcHJvdmlkZXMgZGVmYXVsdCBTUUwgVElNRSBmb3JtYXQKY29uc3QgU3RkVGltZSA9ICIxNTowNDowNSIKCi8vIGVtcHR5VGltZSBhbGxvd3MgZGVmYXVsdCB0aW1lcyB0byBiZSBjb25zaWRlcmVkCi8vIG51bGwgZm9yIGluc2VydGlvbiBpbnRvIHRoZSBkYXRhYmFzZS4KdmFyIGVtcHR5VGltZSA9IHRpbWUuVGltZXt9CgovKi0tLS0tLS0tLS0tLS0rCnwgVHlwZSBhbGlhc2VzIHwKKy0tLS0tLS0tLS0tLS0qLwoKLy8gTnVsbEZsb2F0NjQgYWxpYXNlcyBzcWwuTnVsbEZsb2F0NjQKdHlwZSBOdWxsRmxvYXQ2NCBzcWwuTnVsbEZsb2F0NjQKCi8vIE51bGxTdHJpbmcgYWxpYXNlcyBzcWwuTnVsbFN0cmluZwp0eXBlIE51bGxTdHJpbmcgc3FsLk51bGxTdHJpbmcKCi8vIE51bGxCb29sIGFsaWFzZXMgc3FsLk51bGxCb29sCnR5cGUgTnVsbEJvb2wgc3FsLk51bGxCb29sCgovLyBOdWxsSW50NjQgYWxpYXNlcyBzcWwuTnVsbEludDY0CnR5cGUgTnVsbEludDY0IHNxbC5OdWxsSW50NjQKCi8vIE51bGxUaW1lIGFsaWFzZXMgc3FsLk51bGxUaW1lCnR5cGUgTnVsbFRpbWUgbXlzcWwuTnVsbFRpbWUKCi8vIFJhd0pTT04gYWxpYXNlcyBqc29uLlJhd01lc3NhZ2UKdHlwZSBSYXdKU09OIGpzb24uUmF3TWVzc2FnZQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgTnVsbFN0cmluZyBpbXBsZW1lbnRhdGlvbnMgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8vIE1hcnNoYWxKU09OIGZvciBOdWxsU3RyaW5nCmZ1bmMgKG4gTnVsbFN0cmluZykgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewp2YXIgYSAqc3RyaW5nCmlmIG4uVmFsaWQgewphID0gJm4uU3RyaW5nCn0KcmV0dXJuIGpzb24uTWFyc2hhbChhKQp9CgovLyBVbm1hcnNoYWxKU09OIGZvciBOdWxsU3RyaW5nCmZ1bmMgKG4gKk51bGxTdHJpbmcpIFVubWFyc2hhbEpTT04oYiBbXWJ5dGUpIGVycm9yIHsKZXJyIDo9IGpzb24uVW5tYXJzaGFsKGIsICZuLlN0cmluZykKbi5WYWxpZCA9IGVyciA9PSBuaWwKcmV0dXJuIGVycgp9CgovLyBWYWx1ZSBmb3IgTnVsbFN0cmluZwpmdW5jIChuIE51bGxTdHJpbmcpIFZhbHVlKCkgKGRyaXZlci5WYWx1ZSwgZXJyb3IpIHsKaWYgIW4uVmFsaWQgewpyZXR1cm4gbmlsLCBuaWwKfQpyZXR1cm4gbi5TdHJpbmcsIG5pbAp9CgovLyBTY2FuIGZvciBOdWxsU3RyaW5nCmZ1bmMgKG4gKk51bGxTdHJpbmcpIFNjYW4oc3JjIGludGVyZmFjZXt9KSBlcnJvciB7CnZhciBhIHNxbC5OdWxsU3RyaW5nCmlmIGVyciA6PSBhLlNjYW4oc3JjKTsgZXJyICE9IG5pbCB7CnJldHVybiBlcnIKfQpuLlN0cmluZyA9IGEuU3RyaW5nCmlmIHJlZmxlY3QuVHlwZU9mKHNyYykgIT0gbmlsIHsKbi5WYWxpZCA9IHRydWUKfQpyZXR1cm4gbmlsCn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBOdWxsRmxvYXQ2NCBpbXBsZW1lbnRhdGlvbnMgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovLyBNYXJzaGFsSlNPTiBmb3IgTnVsbEZsb2F0NjQKZnVuYyAobiBOdWxsRmxvYXQ2NCkgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewp2YXIgYSAqZmxvYXQ2NAppZiBuLlZhbGlkIHsKYSA9ICZuLkZsb2F0NjQKfQpyZXR1cm4ganNvbi5NYXJzaGFsKGEpCn0KCi8vIFZhbHVlIGZvciBOdWxsRmxvYXQ2NApmdW5jIChuIE51bGxGbG9hdDY0KSBWYWx1ZSgpIChkcml2ZXIuVmFsdWUsIGVycm9yKSB7CmlmICFuLlZhbGlkIHsKcmV0dXJuIG5pbCwgbmlsCn0KcmV0dXJuIG4uRmxvYXQ2NCwgbmlsCn0KCi8vIFVubWFyc2hhbEpTT04gZm9yIE51bGxGbG9hdDY0CmZ1bmMgKG4gKk51bGxGbG9hdDY0KSBVbm1hcnNoYWxKU09OKGIgW11ieXRlKSBlcnJvciB7CmVyciA6PSBqc29uLlVubWFyc2hhbChiLCAmbi5GbG9hdDY0KQpuLlZhbGlkID0gZXJyID09IG5pbApyZXR1cm4gZXJyCn0KCi8vIFNjYW4gZm9yIE51bGxGbG9hdDY0CmZ1bmMgKG4gKk51bGxGbG9hdDY0KSBTY2FuKHNyYyBpbnRlcmZhY2V7fSkgZXJyb3Igewp2YXIgYSBzcWwuTnVsbEZsb2F0NjQKaWYgZXJyIDo9IGEuU2NhbihzcmMpOyBlcnIgIT0gbmlsIHsKcmV0dXJuIGVycgp9Cm4uRmxvYXQ2NCA9IGEuRmxvYXQ2NAppZiByZWZsZWN0LlR5cGVPZihzcmMpICE9IG5pbCB7Cm4uVmFsaWQgPSB0cnVlCn0KcmV0dXJuIG5pbAp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IE51bGxJbnQ2NCBpbXBsZW1lbnRhdGlvbnMgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLy8gTWFyc2hhbEpTT04gZm9yIE51bGxJbnQ2NApmdW5jIChuIE51bGxJbnQ2NCkgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewp2YXIgYSAqaW50NjQKaWYgbi5WYWxpZCB7CmEgPSAmbi5JbnQ2NAp9CnJldHVybiBqc29uLk1hcnNoYWwoYSkKfQoKLy8gVmFsdWUgZm9yIE51bGxJbnQ2NApmdW5jIChuIE51bGxJbnQ2NCkgVmFsdWUoKSAoZHJpdmVyLlZhbHVlLCBlcnJvcikgewppZiAhbi5WYWxpZCB7CnJldHVybiBuaWwsIG5pbAp9CnJldHVybiBuLkludDY0LCBuaWwKfQoKLy8gVW5tYXJzaGFsSlNPTiBmb3IgTnVsbEludDY0CmZ1bmMgKG4gKk51bGxJbnQ2NCkgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgewplcnIgOj0ganNvbi5Vbm1hcnNoYWwoYiwgJm4uSW50NjQpCm4uVmFsaWQgPSBlcnIgPT0gbmlsCnJldHVybiBlcnIKfQoKLy8gU2NhbiBmb3IgTnVsbEludDY0CmZ1bmMgKG4gKk51bGxJbnQ2NCkgU2NhbihzcmMgaW50ZXJmYWNle30pIGVycm9yIHsKdmFyIGEgc3FsLk51bGxJbnQ2NAppZiBlcnIgOj0gYS5TY2FuKHNyYyk7IGVyciAhPSBuaWwgewpyZXR1cm4gZXJyCn0Kbi5JbnQ2NCA9IGEuSW50NjQKaWYgcmVmbGVjdC5UeXBlT2Yoc3JjKSAhPSBuaWwgewpuLlZhbGlkID0gdHJ1ZQp9CnJldHVybiBuaWwKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IE51bGxCb29sIGltcGxlbWVudGF0aW9ucyB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8vIE1hcnNoYWxKU09OIGZvciBOdWxsQm9vbApmdW5jIChuIE51bGxCb29sKSBNYXJzaGFsSlNPTigpIChbXWJ5dGUsIGVycm9yKSB7CnZhciBhICpib29sCmlmIG4uVmFsaWQgewphID0gJm4uQm9vbAp9CnJldHVybiBqc29uLk1hcnNoYWwoYSkKfQoKLy8gVmFsdWUgZm9yIE51bGxCb29sCmZ1bmMgKG4gTnVsbEJvb2wpIFZhbHVlKCkgKGRyaXZlci5WYWx1ZSwgZXJyb3IpIHsKaWYgIW4uVmFsaWQgewpyZXR1cm4gbmlsLCBuaWwKfQpyZXR1cm4gbi5Cb29sLCBuaWwKfQoKLy8gVW5tYXJzaGFsSlNPTiBmb3IgTnVsbEJvb2wKZnVuYyAobiAqTnVsbEJvb2wpIFVubWFyc2hhbEpTT04oYiBbXWJ5dGUpIGVycm9yIHsKdmFyIGZpZWxkICpib29sCmVyciA6PSBqc29uLlVubWFyc2hhbChiLCAmZmllbGQpCmlmIGZpZWxkICE9IG5pbCB7Cm4uVmFsaWQgPSB0cnVlCm4uQm9vbCA9ICpmaWVsZAp9CnJldHVybiBlcnIKfQoKCi8vIFNjYW4gZm9yIE51bGxCb29sCmZ1bmMgKG4gKk51bGxCb29sKSBTY2FuKHNyYyBpbnRlcmZhY2V7fSkgZXJyb3Igewp2YXIgYSBzcWwuTnVsbEJvb2wKaWYgZXJyIDo9IGEuU2NhbihzcmMpOyBlcnIgIT0gbmlsIHsKcmV0dXJuIGVycgp9Cm4uQm9vbCA9IGEuQm9vbAppZiByZWZsZWN0LlR5cGVPZihzcmMpICE9IG5pbCB7Cm4uVmFsaWQgPSB0cnVlCn0KcmV0dXJuIG5pbAp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgTnVsbFRpbWUgaW1wbGVtZW50YXRpb25zIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLy8gTWFyc2hhbEpTT04gZm9yIE51bGxUaW1lCmZ1bmMgKG4gTnVsbFRpbWUpIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKdmFyIGEgKnRpbWUuVGltZQppZiBuLlZhbGlkIHsKYSA9ICZuLlRpbWUKfQpyZXR1cm4ganNvbi5NYXJzaGFsKGEpCn0KCi8vIFZhbHVlIGZvciBOdWxsVGltZQpmdW5jIChuIE51bGxUaW1lKSBWYWx1ZSgpIChkcml2ZXIuVmFsdWUsIGVycm9yKSB7CmlmICFuLlZhbGlkIHsKcmV0dXJuIG5pbCwgbmlsCn0KcmV0dXJuIG4uVGltZSwgbmlsCn0KCi8vIFVubWFyc2hhbEpTT04gZm9yIE51bGxUaW1lCmZ1bmMgKG4gKk51bGxUaW1lKSBVbm1hcnNoYWxKU09OKGIgW11ieXRlKSBlcnJvciB7CnMgOj0gc3RyaW5nKGIpCnMgPSBzdHJpbmdzLlRyaW0ocywgYCJgKQp0aW0sIGVyciA6PSB0aW1lLlBhcnNlKHRpbWUuUkZDMzMzOSwgcykKaWYgZXJyICE9IG5pbCB7Cm4uVmFsaWQgPSBmYWxzZQpyZXR1cm4gZXJyCn0KCm4uVGltZSA9IHRpbQpuLlZhbGlkID0gdHJ1ZQpyZXR1cm4gbmlsCn0KCi8vIFNjYW4gZm9yIE51bGxUaW1lCmZ1bmMgKG4gKk51bGxUaW1lKSBTY2FuKHNyYyBpbnRlcmZhY2V7fSkgZXJyb3IgewovLyBTZXQgaW5pdGlhbCBzdGF0ZSBmb3Igc3Vic2VxdWVudCBzY2Fucy4Kbi5WYWxpZCA9IGZhbHNlCgp2YXIgYSBteXNxbC5OdWxsVGltZQppZiBlcnIgOj0gYS5TY2FuKHNyYyk7IGVyciAhPSBuaWwgewpyZXR1cm4gZXJyCn0Kbi5UaW1lID0gYS5UaW1lCmlmIHJlZmxlY3QuVHlwZU9mKHNyYykgIT0gbmlsIHsKbi5WYWxpZCA9IHRydWUKfQpyZXR1cm4gbmlsCn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFJhd0pTT04gaW1wbGVtZW50YXRpb25zIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovLyBNYXJzaGFsSlNPTiBmb3IgTnVsbFN0cmluZwpmdW5jIChuIFJhd0pTT04pIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKYSA6PSBqc29uLlJhd01lc3NhZ2UobikKcmV0dXJuIGEuTWFyc2hhbEpTT04oKQp9CgovLyBWYWx1ZSBmb3IgTnVsbFN0cmluZwpmdW5jIChuIFJhd0pTT04pIFZhbHVlKCkgKGRyaXZlci5WYWx1ZSwgZXJyb3IpIHsKcmV0dXJuIHN0cmluZyhuKSwgbmlsCn0KCi8vIFVubWFyc2hhbEpTT04gZm9yIE51bGxTdHJpbmcKZnVuYyAobiAqUmF3SlNPTikgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3Igewp2YXIgYSBqc29uLlJhd01lc3NhZ2UKanNvbi5Vbm1hcnNoYWwoYiwgJmEpCmMgOj0gUmF3SlNPTihhKQoqbiA9IGMKcmV0dXJuIG5pbAp9CgovLyBTY2FuIGZvciBOdWxsU3RyaW5nCmZ1bmMgKG4gKlJhd0pTT04pIFNjYW4oc3JjIGludGVyZmFjZXt9KSBlcnJvciB7CnZhciBhIHNxbC5OdWxsU3RyaW5nCmlmIGVyciA6PSBhLlNjYW4oc3JjKTsgZXJyICE9IG5pbCB7CnJldHVybiBlcnIKfQpqc24gOj0gUmF3SlNPTihbXWJ5dGUoYS5TdHJpbmcpKQoqbiA9IGpzbgpyZXR1cm4gbmlsCn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0rCnwgSGVscGVyIGZ1bmN0aW9ucyB8CistLS0tLS0tLS0tLS0tLS0tLSovCgovLyBUb051bGxTdHJpbmcgcmV0dXJucyBhIG5ldyBOdWxsU3RyaW5nCmZ1bmMgVG9OdWxsU3RyaW5nKHMgKnN0cmluZykgTnVsbFN0cmluZyB7CmlmIHMgPT0gbmlsIHsKcmV0dXJuIE51bGxTdHJpbmcoc3FsLk51bGxTdHJpbmd7VmFsaWQ6IGZhbHNlfSkKfQpyZXR1cm4gTnVsbFN0cmluZyhzcWwuTnVsbFN0cmluZ3tTdHJpbmc6ICpzLCBWYWxpZDogdHJ1ZX0pCn0KCi8vIFRvTnVsbEludDY0IHJldHVybnMgYSBuZXcgTnVsbEludDY0CmZ1bmMgVG9OdWxsSW50NjQoaSAqaW50NjQpIE51bGxJbnQ2NCB7CmlmIGkgPT0gbmlsIHsKcmV0dXJuIE51bGxJbnQ2NChzcWwuTnVsbEludDY0e1ZhbGlkOiBmYWxzZX0pCn0KcmV0dXJuIE51bGxJbnQ2NChzcWwuTnVsbEludDY0e0ludDY0OiAqaSwgVmFsaWQ6IHRydWV9KQp9CgovLyBUb051bGxGbG9hdDY0IHJldHVybnMgYSBuZXcgTnVsbEZsb2F0NjQKZnVuYyBUb051bGxGbG9hdDY0KGkgKmZsb2F0NjQpIE51bGxGbG9hdDY0IHsKaWYgaSA9PSBuaWwgewpyZXR1cm4gTnVsbEZsb2F0NjQoc3FsLk51bGxGbG9hdDY0e1ZhbGlkOiBmYWxzZX0pCn0KcmV0dXJuIE51bGxGbG9hdDY0KHNxbC5OdWxsRmxvYXQ2NHtGbG9hdDY0OiAqaSwgVmFsaWQ6IHRydWV9KQp9CgovLyBUb051bGxCb29sIGNyZWF0ZXMgYSBuZXcgTnVsbEJvb2wKZnVuYyBUb051bGxCb29sKGIgKmJvb2wpIE51bGxCb29sIHsKaWYgYiA9PSBuaWwgewpyZXR1cm4gTnVsbEJvb2woc3FsLk51bGxCb29se1ZhbGlkOiBmYWxzZX0pCn0KcmV0dXJuIE51bGxCb29sKHNxbC5OdWxsQm9vbHtCb29sOiAqYiwgVmFsaWQ6IHRydWV9KQp9CgovLyBUb051bGxUaW1lIGNyZWF0ZXMgYSBuZXcgTnVsbFRpbWUKZnVuYyBUb051bGxUaW1lKHQgdGltZS5UaW1lKSBOdWxsVGltZSB7CmlmIHQgPT0gZW1wdHlUaW1lIHsKcmV0dXJuIE51bGxUaW1lKG15c3FsLk51bGxUaW1le1ZhbGlkOiBmYWxzZX0pCn0KcmV0dXJuIE51bGxUaW1lKG15c3FsLk51bGxUaW1le1RpbWU6IHQsIFZhbGlkOiB0cnVlfSkKfQp7e2VuZH19Cg==\"") + packr.PackJSONBytes("./tmpl", "x_helpers_test.html", "\"e3tkZWZpbmUgImhlbHBlcnN0ZXN0In19Ci8vK2J1aWxkICFoZWxwZXJzCgpwYWNrYWdlIHt7IC5QYWNrYWdlTmFtZSB9fQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBDb2RlIGdlbmVyYXRlZCBieSBtb2RlbGdlbiB8CnwgICAgICAgIERPIE5PVCBFRElULiAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCmltcG9ydCAoCiJkYXRhYmFzZS9zcWwvZHJpdmVyIgoiZW5jb2RpbmcvanNvbiIKInJlZmxlY3QiCiJ0ZXN0aW5nIgoidGltZSIKKQoKZnVuYyBUZXN0U3RydWN0RW1iZWRkaW5nKHQgKnRlc3RpbmcuVCkgewp0aW0gOj0gdGltZS5EYXRlKDIwMTcsIDEsIDEsIDAsIDAsIDAsIDAsIHRpbWUuVVRDKQpleHBlY3RlZCA6PSBbXWJ5dGUoYHsiYSI6MTIzLCJiIjp0cnVlLCJjIjoxMjMuMTIzLCJkIjoic3RyaW5nIiwiZSI6IjIwMTctMDEtMDFUMDA6MDA6MDBaIiwiZiI6WzEsMiwzXX1gKQp0eXBlIGVtYmVkIHN0cnVjdCB7CkEgTnVsbEludDY0ICAgYGpzb246ImEsb21pdGVtcHR5ImAKQiBOdWxsQm9vbCAgICBganNvbjoiYixvbWl0ZW1wdHkiYApDIE51bGxGbG9hdDY0IGBqc29uOiJjLG9taXRlbXB0eSJgCkQgTnVsbFN0cmluZyAgYGpzb246ImQsb21pdGVtcHR5ImAKRSBOdWxsVGltZSAgICBganNvbjoiZSxvbWl0ZW1wdHkiYApGIFJhd0pTT04gICAgIGBqc29uOiJmLG9taXRlbXB0eSJgCn0KZW0gOj0gZW1iZWR7CkE6IE51bGxJbnQ2NHtWYWxpZDogdHJ1ZSwgSW50NjQ6IDEyM30sCkI6IE51bGxCb29se1ZhbGlkOiB0cnVlLCBCb29sOiB0cnVlfSwKQzogTnVsbEZsb2F0NjR7VmFsaWQ6IHRydWUsIEZsb2F0NjQ6IDEyMy4xMjN9LApEOiBOdWxsU3RyaW5ne1ZhbGlkOiB0cnVlLCBTdHJpbmc6ICJzdHJpbmcifSwKRTogTnVsbFRpbWV7VmFsaWQ6IHRydWUsIFRpbWU6IHRpbX0sCkY6IFJhd0pTT04oYFsxLDIsM11gKSwKfQpiLCBlcnIgOj0ganNvbi5NYXJzaGFsKGVtKQppZiBlcnIgIT0gbmlsIHsKdC5GYXRhbChlcnIpCn0KaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGV4cGVjdGVkLCBiKSB7CnQuRmF0YWwoIm5vdCB0aGUgc2FtZSBKU09OISIpCn0KaWYgIShzdHJpbmcoYikgPT0gc3RyaW5nKGV4cGVjdGVkKSkgewp0LkZhdGFsKCJub3QgdGhlIHNhbWUhIikKfQoKdmFyIGVtMiBlbWJlZAppZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoZXhwZWN0ZWQsICZlbTIpOyBlcnIgIT0gbmlsIHsKdC5GYXRhbChlcnIpCn0KaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGVtMiwgZW0pIHsKdC5GYXRhbCgibm90IGNvcnJlY3QiKQp9Cn0KCmZ1bmMgVGVzdE51bGxTdHJpbmdfVW5tYXJzaGFsSlNPTih0ICp0ZXN0aW5nLlQpIHsKdGVzdHMgOj0gW11zdHJ1Y3QgewpuYW1lICAgIHN0cmluZwpuICAgICAgIE51bGxTdHJpbmcKc291cmNlICBbXWJ5dGUKd2FudEVyciBib29sCn17CnsKbmFtZTogICAgInZhbGlkIiwKc291cmNlOiAgW11ieXRlKGAiaGVsbG8iYCksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICAgICJpbnZhbGlkIiwKc291cmNlOiAgW11ieXRlKGB7ImtleSI6InZhbHVlIn1gKSwKd2FudEVycjogdHJ1ZSwKfSwKewpuYW1lOiAgICAiZW1wdHkiLApzb3VyY2U6ICBbXWJ5dGV7fSwKd2FudEVycjogdHJ1ZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewppZiBlcnIgOj0gdHQubi5Vbm1hcnNoYWxKU09OKHR0LnNvdXJjZSk7IChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxTdHJpbmcuVW5tYXJzaGFsSlNPTigpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsU3RyaW5nX1ZhbHVlKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgTnVsbFN0cmluZwp3YW50ICAgIGRyaXZlci5WYWx1ZQp3YW50RXJyIGJvb2wKfXsKewpuYW1lOiAidmFsaWQiLApuOiBOdWxsU3RyaW5newpWYWxpZDogIHRydWUsClN0cmluZzogImhlbGxvIiwKfSwKd2FudDogICAgZHJpdmVyLlZhbHVlKCJoZWxsbyIpLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAiaW52YWxpZCIsCm46IE51bGxTdHJpbmd7ClZhbGlkOiBmYWxzZSwKfSwKd2FudDogICAgbmlsLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewpnb3QsIGVyciA6PSB0dC5uLlZhbHVlKCkKaWYgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbFN0cmluZy5WYWx1ZSgpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCnJldHVybgp9CmlmICFyZWZsZWN0LkRlZXBFcXVhbChnb3QsIHR0LndhbnQpIHsKdC5FcnJvcmYoIk51bGxTdHJpbmcuVmFsdWUoKSA9ICV2LCB3YW50ICV2IiwgZ290LCB0dC53YW50KQp9Cn0pCn0KfQoKZnVuYyBUZXN0TnVsbFN0cmluZ19TY2FuKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgKk51bGxTdHJpbmcKd2FudEVyciBib29sCnNyYyAgICAgaW50ZXJmYWNle30KfXsKewpuYW1lOiAidmFsaWQiLApuOiAmTnVsbFN0cmluZ3sKU3RyaW5nOiAiaGVsbG8iLApWYWxpZDogIHRydWUsCn0sCnNyYzogICAgICIiLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAibmlsIHZhbHVlIiwKbjogJk51bGxTdHJpbmd7ClN0cmluZzogImhlbGxvIiwKVmFsaWQ6ICBmYWxzZSwKfSwKc3JjOiAgICAgbmlsLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewppZiBlcnIgOj0gdHQubi5TY2FuKHR0LnNyYyk7IChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxTdHJpbmcuU2NhbigpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCn0KaWYgdHQubi5WYWxpZCA9PSBmYWxzZSAmJiB0dC5zcmMgIT0gbmlsIHsKdC5FcnJvcmYoInNob3VsZCByZXR1cm4gbnVsbCIpCn0KaWYgdHQubi5WYWxpZCAmJiB0dC5zcmMgIT0gdHQubi5TdHJpbmcgewp0LkVycm9yZigiaW52YWxpZCB2YWx1ZSIpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsU3RyaW5nX01hcnNoYWxKU09OKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgKk51bGxTdHJpbmcKd2FudCAgICBbXWJ5dGUKd2FudEVyciBib29sCn17CnsKbmFtZTogInZhbGlkIiwKbjogJk51bGxTdHJpbmd7ClN0cmluZzogImhlbGxvIiwKVmFsaWQ6ICB0cnVlLAp9LAp3YW50OiAgICBbXWJ5dGUoYCJoZWxsbyJgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogInZhbGlkIG51bGwiLApuOiAmTnVsbFN0cmluZ3sKU3RyaW5nOiAiIiwKVmFsaWQ6ICBmYWxzZSwKfSwKd2FudDogICAgW11ieXRlKGBudWxsYCksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJpbnZhbGlkIiwKbjogJk51bGxTdHJpbmd7ClZhbGlkOiB0cnVlLAp9LAp3YW50OiAgICBbXWJ5dGUoYCIiYCksCndhbnRFcnI6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmdvdCwgZXJyIDo9IHR0Lm4uTWFyc2hhbEpTT04oKQppZiAoZXJyICE9IG5pbCkgIT0gdHQud2FudEVyciB7CnQuRXJyb3JmKCJOdWxsU3RyaW5nLk1hcnNoYWxKU09OKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKcmV0dXJuCn0KaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGdvdCwgdHQud2FudCkgewp0LkVycm9yZigiTnVsbFN0cmluZy5NYXJzaGFsSlNPTigpID0gJXYsIHdhbnQgJXYiLCBnb3QsIHR0LndhbnQpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsQm9vbF9Vbm1hcnNoYWxKU09OKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgICAgICBzdHJpbmcKbiAgICAgICAgICAgIE51bGxCb29sCnNvdXJjZSAgICAgICBbXWJ5dGUKd2FudEVyciAgICAgIGJvb2wKd2FudFZhbGlkaXR5IGJvb2wKfXsKewpuYW1lOiAgICAgICAgICJ2YWxpZCIsCnNvdXJjZTogICAgICAgW11ieXRlKGBmYWxzZWApLAp3YW50RXJyOiAgICAgIGZhbHNlLAp3YW50VmFsaWRpdHk6IHRydWUsCn0sCnsKbmFtZTogICAgICAgICAiaW52YWxpZCIsCnNvdXJjZTogICAgICAgW11ieXRlKGB7ImtleSI6InZhbHVlIn1gKSwKd2FudEVycjogICAgICB0cnVlLAp3YW50VmFsaWRpdHk6IGZhbHNlLAp9LAp7Cm5hbWU6ICAgICAgICAgImVtcHR5IiwKc291cmNlOiAgICAgICBbXWJ5dGV7fSwKd2FudEVycjogICAgICB0cnVlLAp3YW50VmFsaWRpdHk6IGZhbHNlLAp9LAp7Cm5hbWU6ICAgICAgICAgImV4cGxpY2l0IG51bGwiLApzb3VyY2U6ICAgICAgIFtdYnl0ZSgibnVsbCIpLAp3YW50RXJyOiAgICAgIGZhbHNlLAp3YW50VmFsaWRpdHk6IGZhbHNlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmlmIGVyciA6PSB0dC5uLlVubWFyc2hhbEpTT04odHQuc291cmNlKTsgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgJiYgdHQubi5WYWxpZCA9PSB0dC53YW50VmFsaWRpdHkgewogICAgdC5FcnJvcmYoIk51bGxCb29sLlVubWFyc2hhbEpTT04oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQp9Cn0pCn0KfQoKZnVuYyBUZXN0TnVsbEJvb2xfVmFsdWUodCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICBOdWxsQm9vbAp3YW50ICAgIGRyaXZlci5WYWx1ZQp3YW50RXJyIGJvb2wKfXsKewpuYW1lOiAidmFsaWQiLApuOiBOdWxsQm9vbHsKVmFsaWQ6IHRydWUsCkJvb2w6ICB0cnVlLAp9LAp3YW50OiAgICBkcml2ZXIuVmFsdWUodHJ1ZSksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJpbnZhbGlkIiwKbjogTnVsbEJvb2x7ClZhbGlkOiBmYWxzZSwKfSwKd2FudDogICAgbmlsLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewpnb3QsIGVyciA6PSB0dC5uLlZhbHVlKCkKaWYgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEJvb2wuVmFsdWUoKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQpyZXR1cm4KfQppZiAhcmVmbGVjdC5EZWVwRXF1YWwoZ290LCB0dC53YW50KSB7CnQuRXJyb3JmKCJOdWxsQm9vbC5WYWx1ZSgpID0gJXYsIHdhbnQgJXYiLCBnb3QsIHR0LndhbnQpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsQm9vbF9TY2FuKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgKk51bGxCb29sCndhbnRFcnIgYm9vbApzcmMgICAgIGludGVyZmFjZXt9Cn17CnsKbmFtZTogInZhbGlkIiwKbjogJk51bGxCb29sewpCb29sOiAgdHJ1ZSwKVmFsaWQ6IHRydWUsCn0sCnNyYzogICAgIHRydWUsCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJuaWwgdmFsdWUiLApuOiAmTnVsbEJvb2x7CkJvb2w6ICB0cnVlLApWYWxpZDogZmFsc2UsCn0sCnNyYzogICAgIGZhbHNlLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewppZiBlcnIgOj0gdHQubi5TY2FuKHR0LnNyYyk7IChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxCb29sLlNjYW4oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQp9CmlmIHR0Lm4uVmFsaWQgPT0gZmFsc2UgJiYgdHQuc3JjICE9IG5pbCB7CnQuRXJyb3JmKCJzaG91bGQgcmV0dXJuIG51bGwiKQp9CmlmIHR0Lm4uVmFsaWQgJiYgdHQuc3JjICE9IHR0Lm4uQm9vbCB7CnQuRXJyb3JmKCJpbnZhbGlkIHZhbHVlIikKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxCb29sX01hcnNoYWxKU09OKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgKk51bGxCb29sCndhbnQgICAgW11ieXRlCndhbnRFcnIgYm9vbAp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46ICZOdWxsQm9vbHsKVmFsaWQ6IHRydWUsCn0sCndhbnQ6ICAgIFtdYnl0ZShgZmFsc2VgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogInZhbGlkIG51bGwiLApuOiAmTnVsbEJvb2x7ClZhbGlkOiBmYWxzZSwKfSwKd2FudDogICAgW11ieXRlKGBudWxsYCksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJpbnZhbGlkIiwKbjogJk51bGxCb29sewpWYWxpZDogdHJ1ZSwKfSwKd2FudDogICAgW11ieXRlKGBmYWxzZWApLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewpnb3QsIGVyciA6PSB0dC5uLk1hcnNoYWxKU09OKCkKaWYgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEJvb2wuTWFyc2hhbEpTT04oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQpyZXR1cm4KfQppZiAhcmVmbGVjdC5EZWVwRXF1YWwoZ290LCB0dC53YW50KSB7CnQuRXJyb3JmKCJOdWxsQm9vbC5NYXJzaGFsSlNPTigpID0gJXYsIHdhbnQgJXYiLCBnb3QsIHR0LndhbnQpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsVGltZV9Vbm1hcnNoYWxKU09OKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgTnVsbFRpbWUKc291cmNlICBbXWJ5dGUKd2FudEVyciBib29sCn17CnsKbmFtZTogICAgInZhbGlkIiwKc291cmNlOiAgW11ieXRlKGAiMjAxNy0xMS0yNFQwMDowMDowMFoiYCksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICAgICJpbnZhbGlkIiwKc291cmNlOiAgW11ieXRlKGB7ImtleSI6InZhbHVlIn1gKSwKd2FudEVycjogdHJ1ZSwKfSwKewpuYW1lOiAgICAiZW1wdHkiLApzb3VyY2U6ICBbXWJ5dGV7fSwKd2FudEVycjogdHJ1ZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewppZiBlcnIgOj0gdHQubi5Vbm1hcnNoYWxKU09OKHR0LnNvdXJjZSk7IChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxCb29sLlVubWFyc2hhbEpTT04oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQp9Cn0pCn0KfQoKZnVuYyBUZXN0TnVsbFRpbWVfVmFsdWUodCAqdGVzdGluZy5UKSB7CnRpbSA6PSB0aW1lLk5vdygpCnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICBOdWxsVGltZQp3YW50ICAgIGRyaXZlci5WYWx1ZQp3YW50RXJyIGJvb2wKfXsKewpuYW1lOiAidmFsaWQiLApuOiBOdWxsVGltZXsKVmFsaWQ6IHRydWUsClRpbWU6ICB0aW0sCn0sCndhbnQ6ICAgIGRyaXZlci5WYWx1ZSh0aW0pLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAiaW52YWxpZCIsCm46IE51bGxUaW1lewpWYWxpZDogZmFsc2UsCn0sCndhbnQ6ICAgIG5pbCwKd2FudEVycjogZmFsc2UsCn0sCn0KZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKdC5SdW4odHQubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKZ290LCBlcnIgOj0gdHQubi5WYWx1ZSgpCmlmIChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxUaW1lLlZhbHVlKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKcmV0dXJuCn0KaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGdvdCwgdHQud2FudCkgewp0LkVycm9yZigiTnVsbFRpbWUuVmFsdWUoKSA9ICV2LCB3YW50ICV2IiwgZ290LCB0dC53YW50KQp9Cn0pCn0KfQoKZnVuYyBUZXN0TnVsbFRpbWVfU2Nhbih0ICp0ZXN0aW5nLlQpIHsKdGltIDo9IHRpbWUuTm93KCkKdGVzdHMgOj0gW11zdHJ1Y3QgewpuYW1lICAgIHN0cmluZwpuICAgICAgICpOdWxsVGltZQp3YW50RXJyIGJvb2wKc3JjICAgICBpbnRlcmZhY2V7fQp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46ICZOdWxsVGltZXsKVGltZTogIHRpbSwKVmFsaWQ6IHRydWUsCn0sCnNyYzogICAgIHRpbSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogIm5pbCB2YWx1ZSIsCm46ICZOdWxsVGltZXsKVGltZTogIHRpbSwKVmFsaWQ6IGZhbHNlLAp9LApzcmM6ICAgICB0aW1lLk5vdygpLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewppZiBlcnIgOj0gdHQubi5TY2FuKHR0LnNyYyk7IChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxUaW1lLlNjYW4oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQp9CmlmIHR0Lm4uVmFsaWQgPT0gZmFsc2UgJiYgdHQuc3JjICE9IG5pbCB7CnQuRXJyb3JmKCJzaG91bGQgcmV0dXJuIG51bGwiKQp9CmlmIHR0Lm4uVmFsaWQgJiYgdHQuc3JjICE9IHR0Lm4uVGltZSB7CnQuRXJyb3JmKCJpbnZhbGlkIHZhbHVlIikKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxUaW1lX01hcnNoYWxKU09OKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgKk51bGxUaW1lCndhbnQgICAgW11ieXRlCndhbnRFcnIgYm9vbAp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46ICZOdWxsVGltZXsKVGltZTogIHRpbWUuRGF0ZSgyMDE3LCAxMSwgMjQsIDAsIDAsIDAsIDAsIHRpbWUuVVRDKSwKVmFsaWQ6IHRydWUsCn0sCndhbnQ6ICAgIFtdYnl0ZShgIjIwMTctMTEtMjRUMDA6MDA6MDBaImApLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAidmFsaWQgbnVsbCIsCm46ICZOdWxsVGltZXsKVmFsaWQ6IGZhbHNlLAp9LAp3YW50OiAgICBbXWJ5dGUoYG51bGxgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogImludmFsaWQiLApuOiAmTnVsbFRpbWV7ClZhbGlkOiB0cnVlLAp9LAp3YW50OiAgICBbXWJ5dGUoYCIwMDAxLTAxLTAxVDAwOjAwOjAwWiJgKSwKd2FudEVycjogZmFsc2UsCn0sCn0KZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKdC5SdW4odHQubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKZ290LCBlcnIgOj0gdHQubi5NYXJzaGFsSlNPTigpCmlmIChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxUaW1lLk1hcnNoYWxKU09OKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKcmV0dXJuCn0KaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGdvdCwgdHQud2FudCkgewp0LkVycm9yZigiTnVsbFRpbWUuTWFyc2hhbEpTT04oKSA9ICV2LCB3YW50ICV2IiwgZ290LCB0dC53YW50KQp9Cn0pCn0KfQoKZnVuYyBUZXN0TnVsbEludDY0X1VubWFyc2hhbEpTT04odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICBOdWxsSW50NjQKc291cmNlICBbXWJ5dGUKd2FudEVyciBib29sCn17CnsKbmFtZTogICAgInZhbGlkIiwKc291cmNlOiAgW11ieXRlKGAxMjNgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogICAgImludmFsaWQiLApzb3VyY2U6ICBbXWJ5dGUoYHsia2V5IjoidmFsdWUifWApLAp3YW50RXJyOiB0cnVlLAp9LAp7Cm5hbWU6ICAgICJlbXB0eSIsCnNvdXJjZTogIFtdYnl0ZXt9LAp3YW50RXJyOiB0cnVlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmlmIGVyciA6PSB0dC5uLlVubWFyc2hhbEpTT04odHQuc291cmNlKTsgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEludDY0LlVubWFyc2hhbEpTT04oKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQp9Cn0pCn0KfQoKZnVuYyBUZXN0TnVsbEludDY0X1ZhbHVlKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgTnVsbEludDY0CndhbnQgICAgZHJpdmVyLlZhbHVlCndhbnRFcnIgYm9vbAp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46IE51bGxJbnQ2NHsKVmFsaWQ6IHRydWUsCkludDY0OiAxMjMsCn0sCndhbnQ6ICAgIGRyaXZlci5WYWx1ZShpbnQ2NCgxMjMpKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogImludmFsaWQiLApuOiBOdWxsSW50NjR7ClZhbGlkOiBmYWxzZSwKfSwKd2FudDogICAgbmlsLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewpnb3QsIGVyciA6PSB0dC5uLlZhbHVlKCkKaWYgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEludDY0LlZhbHVlKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKcmV0dXJuCn0KaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGdvdCwgdHQud2FudCkgewp0LkVycm9yZigiTnVsbEludDY0LlZhbHVlKCkgPSAldiwgd2FudCAldiIsIGdvdCwgdHQud2FudCkKfQp9KQp9Cn0KCmZ1bmMgVGVzdE51bGxJbnQ2NF9TY2FuKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgKk51bGxJbnQ2NAp3YW50RXJyIGJvb2wKc3JjICAgICBpbnRlcmZhY2V7fQp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46ICZOdWxsSW50NjR7CkludDY0OiAxMjMsClZhbGlkOiB0cnVlLAp9LApzcmM6ICAgICBpbnQ2NCgxMjMpLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAibmlsIHZhbHVlIiwKbjogJk51bGxJbnQ2NHsKVmFsaWQ6IGZhbHNlLAp9LApzcmM6ICAgICBpbnQ2NCgxMjMpLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewppZiBlcnIgOj0gdHQubi5TY2FuKHR0LnNyYyk7IChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxJbnQ2NC5TY2FuKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKfQppZiB0dC5uLlZhbGlkID09IGZhbHNlICYmIHR0LnNyYyAhPSBuaWwgewp0LkVycm9yZigic2hvdWxkIHJldHVybiBudWxsIikKfQppZiB0dC5uLlZhbGlkICYmIHR0LnNyYyAhPSB0dC5uLkludDY0IHsKdC5FcnJvcmYoImludmFsaWQgdmFsdWUiKQp9Cn0pCn0KfQoKZnVuYyBUZXN0TnVsbEludDY0X01hcnNoYWxKU09OKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgKk51bGxJbnQ2NAp3YW50ICAgIFtdYnl0ZQp3YW50RXJyIGJvb2wKfXsKewpuYW1lOiAidmFsaWQiLApuOiAmTnVsbEludDY0ewpJbnQ2NDogMTIzLApWYWxpZDogdHJ1ZSwKfSwKd2FudDogICAgW11ieXRlKGAxMjNgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogInZhbGlkIG51bGwiLApuOiAmTnVsbEludDY0ewpWYWxpZDogZmFsc2UsCn0sCndhbnQ6ICAgIFtdYnl0ZShgbnVsbGApLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAiaW52YWxpZCIsCm46ICZOdWxsSW50NjR7ClZhbGlkOiB0cnVlLAp9LAp3YW50OiAgICBbXWJ5dGUoYDBgKSwKd2FudEVycjogZmFsc2UsCn0sCn0KZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKdC5SdW4odHQubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKZ290LCBlcnIgOj0gdHQubi5NYXJzaGFsSlNPTigpCmlmIChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxJbnQ2NC5NYXJzaGFsSlNPTigpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCnJldHVybgp9CmlmICFyZWZsZWN0LkRlZXBFcXVhbChnb3QsIHR0LndhbnQpIHsKdC5FcnJvcmYoIk51bGxJbnQ2NC5NYXJzaGFsSlNPTigpID0gJXYsIHdhbnQgJXYiLCBnb3QsIHR0LndhbnQpCn0KfSkKfQp9CmZ1bmMgVGVzdE51bGxGbG9hdDY0X1VubWFyc2hhbEpTT04odCAqdGVzdGluZy5UKSB7CnRlc3RzIDo9IFtdc3RydWN0IHsKbmFtZSAgICBzdHJpbmcKbiAgICAgICBOdWxsRmxvYXQ2NApzb3VyY2UgIFtdYnl0ZQp3YW50RXJyIGJvb2wKfXsKewpuYW1lOiAgICAidmFsaWQiLApzb3VyY2U6ICBbXWJ5dGUoYDEyMy4xMjNgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogICAgImludmFsaWQiLApzb3VyY2U6ICBbXWJ5dGUoYHsia2V5IjoidmFsdWUifWApLAp3YW50RXJyOiB0cnVlLAp9LAp7Cm5hbWU6ICAgICJlbXB0eSIsCnNvdXJjZTogIFtdYnl0ZXt9LAp3YW50RXJyOiB0cnVlLAp9LAp9CmZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CnQuUnVuKHR0Lm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CmlmIGVyciA6PSB0dC5uLlVubWFyc2hhbEpTT04odHQuc291cmNlKTsgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEZsb2F0NjQuVW5tYXJzaGFsSlNPTigpIGVycm9yID0gJXYsIHdhbnRFcnIgJXYiLCBlcnIsIHR0LndhbnRFcnIpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsRmxvYXQ2NF9WYWx1ZSh0ICp0ZXN0aW5nLlQpIHsKdGVzdHMgOj0gW11zdHJ1Y3QgewpuYW1lICAgIHN0cmluZwpuICAgICAgIE51bGxGbG9hdDY0CndhbnQgICAgZHJpdmVyLlZhbHVlCndhbnRFcnIgYm9vbAp9ewp7Cm5hbWU6ICJ2YWxpZCIsCm46IE51bGxGbG9hdDY0ewpWYWxpZDogICB0cnVlLApGbG9hdDY0OiAxMjMuMTIzLAp9LAp3YW50OiAgICBkcml2ZXIuVmFsdWUoZmxvYXQ2NCgxMjMuMTIzKSksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJpbnZhbGlkIiwKbjogTnVsbEZsb2F0NjR7ClZhbGlkOiBmYWxzZSwKfSwKd2FudDogICAgbmlsLAp3YW50RXJyOiBmYWxzZSwKfSwKfQpmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewp0LlJ1bih0dC5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewpnb3QsIGVyciA6PSB0dC5uLlZhbHVlKCkKaWYgKGVyciAhPSBuaWwpICE9IHR0LndhbnRFcnIgewp0LkVycm9yZigiTnVsbEZsb2F0NjQuVmFsdWUoKSBlcnJvciA9ICV2LCB3YW50RXJyICV2IiwgZXJyLCB0dC53YW50RXJyKQpyZXR1cm4KfQppZiAhcmVmbGVjdC5EZWVwRXF1YWwoZ290LCB0dC53YW50KSB7CnQuRXJyb3JmKCJOdWxsRmxvYXQ2NC5WYWx1ZSgpID0gJXYsIHdhbnQgJXYiLCBnb3QsIHR0LndhbnQpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsRmxvYXQ2NF9TY2FuKHQgKnRlc3RpbmcuVCkgewp0ZXN0cyA6PSBbXXN0cnVjdCB7Cm5hbWUgICAgc3RyaW5nCm4gICAgICAgKk51bGxGbG9hdDY0CndhbnRFcnIgYm9vbApzcmMgICAgIGludGVyZmFjZXt9Cn17CnsKbmFtZTogInZhbGlkIiwKbjogJk51bGxGbG9hdDY0ewpGbG9hdDY0OiAxMjMuMTIzLApWYWxpZDogICB0cnVlLAp9LApzcmM6ICAgICBmbG9hdDY0KDEyMyksCndhbnRFcnI6IGZhbHNlLAp9LAp7Cm5hbWU6ICJuaWwgdmFsdWUiLApuOiAmTnVsbEZsb2F0NjR7ClZhbGlkOiBmYWxzZSwKfSwKc3JjOiAgICAgZmxvYXQ2NCgxMjMuMTIzKSwKd2FudEVycjogZmFsc2UsCn0sCn0KZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKdC5SdW4odHQubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKaWYgZXJyIDo9IHR0Lm4uU2Nhbih0dC5zcmMpOyAoZXJyICE9IG5pbCkgIT0gdHQud2FudEVyciB7CnQuRXJyb3JmKCJOdWxsRmxvYXQ2NC5TY2FuKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKfQppZiB0dC5uLlZhbGlkID09IGZhbHNlICYmIHR0LnNyYyAhPSBuaWwgewp0LkVycm9yZigic2hvdWxkIHJldHVybiBudWxsIikKfQppZiB0dC5uLlZhbGlkICYmIHR0LnNyYyAhPSB0dC5uLkZsb2F0NjQgewp0LkVycm9yZigiaW52YWxpZCB2YWx1ZSIpCn0KfSkKfQp9CgpmdW5jIFRlc3ROdWxsRmxvYXQ2NF9NYXJzaGFsSlNPTih0ICp0ZXN0aW5nLlQpIHsKdGVzdHMgOj0gW11zdHJ1Y3QgewpuYW1lICAgIHN0cmluZwpuICAgICAgICpOdWxsRmxvYXQ2NAp3YW50ICAgIFtdYnl0ZQp3YW50RXJyIGJvb2wKfXsKewpuYW1lOiAidmFsaWQiLApuOiAmTnVsbEZsb2F0NjR7CkZsb2F0NjQ6IDEyMy4xMjMsClZhbGlkOiAgIHRydWUsCn0sCndhbnQ6ICAgIFtdYnl0ZShgMTIzLjEyM2ApLAp3YW50RXJyOiBmYWxzZSwKfSwKewpuYW1lOiAidmFsaWQgbnVsbCIsCm46ICZOdWxsRmxvYXQ2NHsKVmFsaWQ6IGZhbHNlLAp9LAp3YW50OiAgICBbXWJ5dGUoYG51bGxgKSwKd2FudEVycjogZmFsc2UsCn0sCnsKbmFtZTogImludmFsaWQiLApuOiAmTnVsbEZsb2F0NjR7ClZhbGlkOiB0cnVlLAp9LAp3YW50OiAgICBbXWJ5dGUoYDBgKSwKd2FudEVycjogZmFsc2UsCn0sCn0KZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKdC5SdW4odHQubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKZ290LCBlcnIgOj0gdHQubi5NYXJzaGFsSlNPTigpCmlmIChlcnIgIT0gbmlsKSAhPSB0dC53YW50RXJyIHsKdC5FcnJvcmYoIk51bGxGbG9hdDY0Lk1hcnNoYWxKU09OKCkgZXJyb3IgPSAldiwgd2FudEVyciAldiIsIGVyciwgdHQud2FudEVycikKcmV0dXJuCn0KaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGdvdCwgdHQud2FudCkgewp0LkVycm9yZigiTnVsbEZsb2F0NjQuTWFyc2hhbEpTT04oKSA9ICV2LCB3YW50ICV2IiwgZ290LCB0dC53YW50KQp9Cn0pCn0KfQoKZnVuYyBUZXN0VG9OdWxsQm9vbCh0ICp0ZXN0aW5nLlQpIHsKYiA6PSB0cnVlCmJiIDo9IFRvTnVsbEJvb2woJmIpCmlmICFiYi5WYWxpZCB7CnQuRXJyb3JmKCJleHBlY3RlZCB2YWxpZCwgZ290ICV2IiwgYmIuVmFsaWQpCn0KaWYgIWJiLkJvb2wgewp0LkVycm9yZigiZXhwZWN0ZWQgdHJ1ZSwgZ290ICV2IiwgYmIuQm9vbCkKfQoKdmFyIGIyICpib29sCmJiMiA6PSBUb051bGxCb29sKGIyKQppZiBiYjIuVmFsaWQgewp0LkVycm9yZigiZXhwZWN0ZWQgbm90IHZhbGlkLCBnb3QgJXYiLCBiYjIuVmFsaWQpCn0KaWYgYmIyLkJvb2wgewp0LkVycm9yZigiZXhwZWN0ZWQgZmFsc2UsIGdvdCAldiIsIGJiMi5Cb29sKQp9Cn0KZnVuYyBUZXN0VG9OdWxsSW50NjQodCAqdGVzdGluZy5UKSB7CmIgOj0gaW50NjQoMTIzKQpiYiA6PSBUb051bGxJbnQ2NCgmYikKaWYgIWJiLlZhbGlkIHsKdC5FcnJvcmYoImV4cGVjdGVkIHZhbGlkLCBnb3QgJXYiLCBiYi5WYWxpZCkKfQppZiBiYi5JbnQ2NCAhPSAxMjMgewp0LkVycm9yZigiZXhwZWN0ZWQgMTIzLCBnb3QgJXYiLCBiYi5JbnQ2NCkKfQoKdmFyIGIyICppbnQ2NApiYjIgOj0gVG9OdWxsSW50NjQoYjIpCmlmIGJiMi5WYWxpZCB7CnQuRXJyb3JmKCJleHBlY3RlZCBub3QgdmFsaWQsIGdvdCAldiIsIGJiMi5WYWxpZCkKfQppZiBiYjIuSW50NjQgIT0gMCB7CnQuRXJyb3JmKCJleHBlY3RlZCAwLCBnb3QgJXYiLCBiYjIuSW50NjQpCn0KfQoKZnVuYyBUZXN0VG9OdWxsRmxvYXQ2NCh0ICp0ZXN0aW5nLlQpIHsKYiA6PSBmbG9hdDY0KDEyMy4xMjMpCmJiIDo9IFRvTnVsbEZsb2F0NjQoJmIpCmlmICFiYi5WYWxpZCB7CnQuRXJyb3JmKCJleHBlY3RlZCB2YWxpZCwgZ290ICV2IiwgYmIuVmFsaWQpCn0KaWYgYmIuRmxvYXQ2NCAhPSAxMjMuMTIzIHsKdC5FcnJvcmYoImV4cGVjdGVkIDEyMy4xMjMsIGdvdCAldiIsIGJiLkZsb2F0NjQpCn0KCnZhciBiMiAqZmxvYXQ2NApiYjIgOj0gVG9OdWxsRmxvYXQ2NChiMikKaWYgYmIyLlZhbGlkIHsKdC5FcnJvcmYoImV4cGVjdGVkIG5vdCB2YWxpZCwgZ290ICV2IiwgYmIyLlZhbGlkKQp9CmlmIGJiMi5GbG9hdDY0ICE9IDAgewp0LkVycm9yZigiZXhwZWN0ZWQgMCwgZ290ICV2IiwgYmIyLkZsb2F0NjQpCn0KfQpmdW5jIFRlc3RUb051bGxTdHJpbmcodCAqdGVzdGluZy5UKSB7CmIgOj0gInF3ZSIKYmIgOj0gVG9OdWxsU3RyaW5nKCZiKQppZiAhYmIuVmFsaWQgewp0LkVycm9yZigiZXhwZWN0ZWQgdmFsaWQsIGdvdCAldiIsIGJiLlZhbGlkKQp9CmlmIGJiLlN0cmluZyAhPSAicXdlIiB7CnQuRXJyb3JmKCJleHBlY3RlZCBxd2UsIGdvdCAldiIsIGJiLlN0cmluZykKfQoKdmFyIGIyICpzdHJpbmcKYmIyIDo9IFRvTnVsbFN0cmluZyhiMikKaWYgYmIyLlZhbGlkIHsKdC5FcnJvcmYoImV4cGVjdGVkIG5vdCB2YWxpZCwgZ290ICV2IiwgYmIyLlZhbGlkKQp9CmlmIGJiMi5TdHJpbmcgIT0gIiIgewp0LkVycm9yZigiZXhwZWN0ZWQgPGVtcHR5IHN0cmluZz4sIGdvdCAldiIsIGJiMi5TdHJpbmcpCiAgICB9CiAgICB9CiAgICBmdW5jIFRlc3RUb051bGxUaW1lKHQgKnRlc3RpbmcuVCkgewogICAgdGltIDo9IHRpbWUuTm93KCkKICAgIGJiIDo9IFRvTnVsbFRpbWUodGltKQogICAgaWYgIWJiLlZhbGlkIHsKICAgIHQuRXJyb3JmKCJleHBlY3RlZCB2YWxpZCwgZ290ICV2IiwgYmIuVmFsaWQpCiAgICB9CiAgICBpZiBiYi5UaW1lICE9IHRpbSB7CiAgICB0LkVycm9yZigiZXhwZWN0ZWQgJXYsIGdvdCAldiIsIHRpbSwgYmIuVGltZSkKICAgIH0KCiAgICB0aW0gPSB0aW1lLlRpbWV7fQogICAgYmIgPSBUb051bGxUaW1lKHRpbSkKICAgIGlmIGJiLlZhbGlkIHsKICAgIHQuRXJyb3JmKCJleHBlY3RlZCBpbnZhbGlkLCBnb3QgJXYiLCBiYi5WYWxpZCkKICAgIH0KICAgIGlmIGJiLlRpbWUgIT0gdGltIHsKICAgIHQuRXJyb3JmKCJleHBlY3RlZCAldiwgZ290ICV2IiwgdGltLCBiYi5UaW1lKQogICAgfQogICAgfQp7e2VuZH19Cg==\"") }