IyBjb2Rpbmc6IGxhdGluLTEKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBjdHlwZXMKCnRyeToKICAgIGN0eXBlcy5jX3djaGFyCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgIHBhc3MKZWxzZToKICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKICAgIGRsbCA9IGN0eXBlcy5DRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKICAgIHdjc2xlbiA9IGRsbC5teV93Y3NsZW4KICAgIHdjc2xlbi5hcmd0eXBlcyA9IFtjdHlwZXMuY193Y2hhcl9wXQoKCiAgICBjbGFzcyBVbmljb2RlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgICAgc2VsZi5wcmV2X2NvbnZfbW9kZSA9IGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQoKICAgICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCpzZWxmLnByZXZfY29udl9tb2RlKQoKICAgICAgICBkZWYgdGVzdF9hc2NpaV9zdHJpY3Qoc2VsZik6CiAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQogICAgICAgICAgICAjIG5vIGNvbnZlcnNpb25zIHRha2UgcGxhY2Ugd2l0aCB1bmljb2RlIGFyZ3VtZW50cwogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCiAgICAgICAgICAgICMgc3RyaW5nIGFyZ3MgYXJlIGNvbnZlcnRlZAogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGN0eXBlcy5Bcmd1bWVudEVycm9yLCB3Y3NsZW4sICJhYuQiKQoKICAgICAgICBkZWYgdGVzdF9hc2NpaV9yZXBsYWNlKHNlbGYpOgogICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWLkIiksIDMpCgogICAgICAgIGRlZiB0ZXN0X2FzY2lpX2lnbm9yZShzZWxmKToKICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKICAgICAgICAgICAgIyBpZ25vcmUgZXJyb3IgbW9kZSBza2lwcyBub24tYXNjaWkgY2hhcmFjdGVycwogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCLk9vzfIiksIDApCgogICAgICAgIGRlZiB0ZXN0X2xhdGluMV9zdHJpY3Qoc2VsZik6CiAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJsYXRpbi0xIiwgInN0cmljdCIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigi5Pb83yIpLCA0KQoKICAgICAgICBkZWYgdGVzdF9idWZmZXJzKHNlbGYpOgogICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWJjIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVmKSwgMysxKQoKICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInJlcGxhY2UiKQogICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYuT2/CIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCB1ImFiXHVGRkZEXHVGRkZEXHVGRkZEXDAiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sIHUiYWJcdUZGRkRcdUZGRkRcdUZGRkRcMCIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCB1IlwwXHVGRkZEXHVGRkZEXHVGRkZEYmEiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6OjJdLCB1ImFcdUZGRkRcdUZGRkQiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls2OjU6LTFdLCB1IiIpCgogICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWLk9vwiKQogICAgICAgICAgICAjIGlzIHRoYXQgY29ycmVjdD8gbm90IHN1cmUuICBCdXQgd2l0aCAnaWdub3JlJywgeW91IGdldCB3aGF0IHlvdSBwYXkgZm9yLi4KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sIHUiYWJcMFwwXDBcMCIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgdSJhYlwwXDBcMFwwIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sIHUiXDBcMFwwXDBiYSIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sIHUiYVwwXDAiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls2OjU6LTFdLCB1IiIpCgogICAgaW1wb3J0IF9jdHlwZXNfdGVzdAogICAgZnVuYyA9IGN0eXBlcy5DRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykuX3Rlc3RmdW5jX3BfcAoKICAgIGNsYXNzIFN0cmluZ1Rlc3RDYXNlKFVuaWNvZGVUZXN0Q2FzZSk6CiAgICAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICAgICBzZWxmLnByZXZfY29udl9tb2RlID0gY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCiAgICAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBbY3R5cGVzLmNfY2hhcl9wXQogICAgICAgICAgICBmdW5jLnJlc3R5cGUgPSBjdHlwZXMuY19jaGFyX3AKCiAgICAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgqc2VsZi5wcmV2X2NvbnZfbW9kZSkKICAgICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IE5vbmUKICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY3R5cGVzLmNfaW50CgogICAgICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6CiAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjdHlwZXMuQXJndW1lbnRFcnJvciwgZnVuYywgdSJhYuQiKQoKICAgICAgICBkZWYgdGVzdF9hc2NpaV9pZ25vcmUoc2VsZik6CiAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSLk9vzfIiksICIiKQoKICAgICAgICBkZWYgdGVzdF9hc2NpaV9yZXBsYWNlKHNlbGYpOgogICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYygiYWJjIiksICJhYmMiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1IuT2/N8iKSwgIj8/Pz8iKQoKICAgICAgICBkZWYgdGVzdF9idWZmZXJzKHNlbGYpOgogICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKHUiYWJjIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVmKSwgMysxKQoKICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInJlcGxhY2UiKQogICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCAiYWI/Pz9cMCIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgImFiPz8/XDAiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Oi0xXSwgIlwwPz8/YmEiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6OjJdLCAiYT8/IikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgIiIpCgogICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKHUiYWLk9vwiKQogICAgICAgICAgICAjIGlzIHRoYXQgY29ycmVjdD8gbm90IHN1cmUuICBCdXQgd2l0aCAnaWdub3JlJywgeW91IGdldCB3aGF0IHlvdSBwYXkgZm9yLi4KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sICJhYlwwXDBcMFwwIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjpdLCAiYWJcMFwwXDBcMCIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCAiXDBcMFwwXDBiYSIpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgdW5pdHRlc3QubWFpbigpCg==