IyBjb2Rpbmc6IGxhdGluLTEKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBjdHlwZXMKZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKaW1wb3J0IF9jdHlwZXNfdGVzdAoKQG5lZWRfc3ltYm9sKCdjX3djaGFyJykKY2xhc3MgVW5pY29kZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICBkbGwgPSBjdHlwZXMuQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgICAgY2xzLndjc2xlbiA9IGRsbC5teV93Y3NsZW4KICAgICAgICBjbHMud2NzbGVuLmFyZ3R5cGVzID0gW2N0eXBlcy5jX3djaGFyX3BdCiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5wcmV2X2NvbnZfbW9kZSA9IGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgqc2VsZi5wcmV2X2NvbnZfbW9kZSkKCiAgICBkZWYgdGVzdF9hc2NpaV9zdHJpY3Qoc2VsZik6CiAgICAgICAgd2NzbGVuID0gc2VsZi53Y3NsZW4KICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKICAgICAgICAjIG5vIGNvbnZlcnNpb25zIHRha2UgcGxhY2Ugd2l0aCB1bmljb2RlIGFyZ3VtZW50cwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQogICAgICAgICMgc3RyaW5nIGFyZ3MgYXJlIGNvbnZlcnRlZAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjdHlwZXMuQXJndW1lbnRFcnJvciwgd2NzbGVuLCAiYWLkIikKCiAgICBkZWYgdGVzdF9hc2NpaV9yZXBsYWNlKHNlbGYpOgogICAgICAgIHdjc2xlbiA9IHNlbGYud2NzbGVuCiAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInJlcGxhY2UiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWLkIiksIDMpCgogICAgZGVmIHRlc3RfYXNjaWlfaWdub3JlKHNlbGYpOgogICAgICAgIHdjc2xlbiA9IHNlbGYud2NzbGVuCiAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCiAgICAgICAgIyBpZ25vcmUgZXJyb3IgbW9kZSBza2lwcyBub24tYXNjaWkgY2hhcmFjdGVycwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigi5Pb83yIpLCAwKQoKICAgIGRlZiB0ZXN0X2xhdGluMV9zdHJpY3Qoc2VsZik6CiAgICAgICAgd2NzbGVuID0gc2VsZi53Y3NsZW4KICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgibGF0aW4tMSIsICJzdHJpY3QiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigi5Pb83yIpLCA0KQoKICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CiAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCiAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWJjIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCAzKzEpCgogICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYuT2/CIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sIHUiYWJcdUZGRkRcdUZGRkRcdUZGRkRcMCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjpdLCB1ImFiXHVGRkZEXHVGRkZEXHVGRkZEXDAiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCB1IlwwXHVGRkZEXHVGRkZEXHVGRkZEYmEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sIHUiYVx1RkZGRFx1RkZGRCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgdSIiKQoKICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYuT2/CIpCiAgICAgICAgIyBpcyB0aGF0IGNvcnJlY3Q/IG5vdCBzdXJlLiAgQnV0IHdpdGggJ2lnbm9yZScsIHlvdSBnZXQgd2hhdCB5b3UgcGF5IGZvci4uCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sIHUiYWJcMFwwXDBcMCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjpdLCB1ImFiXDBcMFwwXDAiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCB1IlwwXDBcMFwwYmEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sIHUiYVwwXDAiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sIHUiIikKCkBuZWVkX3N5bWJvbCgnY193Y2hhcicpCmNsYXNzIFN0cmluZ1Rlc3RDYXNlKFVuaWNvZGVUZXN0Q2FzZSk6CiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CiAgICAgICAgc3VwZXIoU3RyaW5nVGVzdENhc2UsIGNscykuc2V0VXBDbGFzcygpCiAgICAgICAgY2xzLmZ1bmMgPSBjdHlwZXMuQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pLl90ZXN0ZnVuY19wX3AKCiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgZnVuYyA9IHNlbGYuZnVuYwogICAgICAgIHNlbGYucHJldl9jb252X21vZGUgPSBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKICAgICAgICBmdW5jLmFyZ3R5cGVzID0gW2N0eXBlcy5jX2NoYXJfcF0KICAgICAgICBmdW5jLnJlc3R5cGUgPSBjdHlwZXMuY19jaGFyX3AKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgZnVuYyA9IHNlbGYuZnVuYwogICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCpzZWxmLnByZXZfY29udl9tb2RlKQogICAgICAgIGZ1bmMuYXJndHlwZXMgPSBOb25lCiAgICAgICAgZnVuYy5yZXN0eXBlID0gY3R5cGVzLmNfaW50CgogICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKICAgICAgICBmdW5jID0gc2VsZi5mdW5jCiAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGN0eXBlcy5Bcmd1bWVudEVycm9yLCBmdW5jLCB1ImFi5CIpCgogICAgZGVmIHRlc3RfYXNjaWlfaWdub3JlKHNlbGYpOgogICAgICAgIGZ1bmMgPSBzZWxmLmZ1bmMKICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUi5Pb83yIpLCAiIikKCiAgICBkZWYgdGVzdF9hc2NpaV9yZXBsYWNlKHNlbGYpOgogICAgICAgIGZ1bmMgPSBzZWxmLmZ1bmMKICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1IuT2/N8iKSwgIj8/Pz8iKQoKICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CiAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCiAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKHUiYWJjIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCAzKzEpCgogICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sICJhYj8/P1wwIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sICJhYj8/P1wwIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Oi0xXSwgIlwwPz8/YmEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sICJhPz8iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sICIiKQoKICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCiAgICAgICAgIyBpcyB0aGF0IGNvcnJlY3Q/IG5vdCBzdXJlLiAgQnV0IHdpdGggJ2lnbm9yZScsIHlvdSBnZXQgd2hhdCB5b3UgcGF5IGZvci4uCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sICJhYlwwXDBcMFwwIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sICJhYlwwXDBcMFwwIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Oi0xXSwgIlwwXDBcMFwwYmEiKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHVuaXR0ZXN0Lm1haW4oKQo=