IyAtKi0gY29kaW5nOiBrb2k4LXIgLSotCgppbXBvcnQgdW5pdHRlc3QKZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgdW5saW5rLCB1bmxvYWQsIHJtdHJlZSwgc2NyaXB0X2hlbHBlciwgY2FwdHVyZWRfc3Rkb3V0CmltcG9ydCBpbXBvcnRsaWIKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHRlbXBmaWxlCgpjbGFzcyBNaXNjU291cmNlRW5jb2RpbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKCiAgICBkZWYgdGVzdF9wZXAyNjMoc2VsZik6CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIvDJ1M/OIi5lbmNvZGUoInV0Zi04IiksCiAgICAgICAgICAgIGInXHhkMFx4OWZceGQwXHhiOFx4ZDFceDgyXHhkMFx4YmVceGQwXHhiZCcKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIlzwIi5lbmNvZGUoInV0Zi04IiksCiAgICAgICAgICAgIGInXFxceGQwXHg5ZicKICAgICAgICApCgogICAgZGVmIHRlc3RfY29tcGlsZXN0cmluZyhzZWxmKToKICAgICAgICAjIHNlZSAjMTg4MgogICAgICAgIGMgPSBjb21waWxlKGIiXG4jIGNvZGluZzogdXRmLThcbnUgPSAnXHhjM1x4YjMnXG4iLCAiZHVtbXkiLCAiZXhlYyIpCiAgICAgICAgZCA9IHt9CiAgICAgICAgZXhlYyhjLCBkKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsndSddLCAnXHhmMycpCgogICAgZGVmIHRlc3RfaXNzdWUyMzAxKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgY29tcGlsZShiIiMgY29kaW5nOiBjcDkzMlxucHJpbnQgJ1x4OTRceDRlJyIsICJkdW1teSIsICJleGVjIikKICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgdjoKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnRleHQucnN0cmlwKCdcbicpLCAicHJpbnQgJ1x1NWU3NCciKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZmFpbCgpCgogICAgZGVmIHRlc3RfaXNzdWU0NjI2KHNlbGYpOgogICAgICAgIGMgPSBjb21waWxlKCIjIGNvZGluZz1sYXRpbi0xXG5cdTAwYzYgPSAnXHUwMGM2JyIsICJkdW1teSIsICJleGVjIikKICAgICAgICBkID0ge30KICAgICAgICBleGVjKGMsIGQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydceGM2J10sICdceGM2JykKCiAgICBkZWYgdGVzdF9pc3N1ZTMyOTcoc2VsZik6CiAgICAgICAgYyA9IGNvbXBpbGUoImEsIGIgPSAnXFUwMDAxMDEwRicsICdcXFUwMDAxMDEwRiciLCAiZHVtbXkiLCAiZXhlYyIpCiAgICAgICAgZCA9IHt9CiAgICAgICAgZXhlYyhjLCBkKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYSddLCBkWydiJ10pCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZFsnYSddKSwgbGVuKGRbJ2InXSkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc2NpaShkWydhJ10pLCBhc2NpaShkWydiJ10pKQoKICAgIGRlZiB0ZXN0X2lzc3VlNzgyMChzZWxmKToKICAgICAgICAjIEVuc3VyZSB0aGF0IGNoZWNrX2JvbSgpIHJlc3RvcmVzIGFsbCBieXRlcyBpbiB0aGUgcmlnaHQgb3JkZXIgaWYKICAgICAgICAjIGNoZWNrX2JvbSgpIGZhaWxzIGluIHB5ZGVidWcgbW9kZTogYSBidWZmZXIgc3RhcnRzIHdpdGggdGhlIGZpcnN0CiAgICAgICAgIyBieXRlIG9mIGEgdmFsaWQgQk9NLCBidXQgbmV4dCBieXRlcyBhcmUgZGlmZmVyZW50CgogICAgICAgICMgb25lIGJ5dGUgaW4gY29tbW9uIHdpdGggdGhlIFVURi0xNi1MRSBCT00KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgYidceGZmXHgyMCcpCgogICAgICAgICMgdHdvIGJ5dGVzIGluIGNvbW1vbiB3aXRoIHRoZSBVVEYtOCBCT00KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgYidceGVmXHhiYlx4MjAnKQoKICAgIGRlZiB0ZXN0XzIwNzMxKHNlbGYpOgogICAgICAgIHN1YiA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2RpbmcyMDczMS5weScpXSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKICAgICAgICBlcnIgPSBzdWIuY29tbXVuaWNhdGUoKVsxXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3ViLnJldHVybmNvZGUsIDApCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbihiJ1N5bnRheEVycm9yJywgZXJyKQoKICAgIGRlZiB0ZXN0X2Vycm9yX21lc3NhZ2Uoc2VsZik6CiAgICAgICAgY29tcGlsZShiJyMgLSotIGNvZGluZzogaXNvLTg4NTktMTUgLSotXG4nLCAnZHVtbXknLCAnZXhlYycpCiAgICAgICAgY29tcGlsZShiJ1x4ZWZceGJiXHhiZlxuJywgJ2R1bW15JywgJ2V4ZWMnKQogICAgICAgIGNvbXBpbGUoYidceGVmXHhiYlx4YmYjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLVxuJywgJ2R1bW15JywgJ2V4ZWMnKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeW50YXhFcnJvciwgJ2Zha2UnKToKICAgICAgICAgICAgY29tcGlsZShiJyMgLSotIGNvZGluZzogZmFrZSAtKi1cbicsICdkdW1teScsICdleGVjJykKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3ludGF4RXJyb3IsICdpc28tODg1OS0xNScpOgogICAgICAgICAgICBjb21waWxlKGInXHhlZlx4YmJceGJmIyAtKi0gY29kaW5nOiBpc28tODg1OS0xNSAtKi1cbicsCiAgICAgICAgICAgICAgICAgICAgJ2R1bW15JywgJ2V4ZWMnKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeW50YXhFcnJvciwgJ0JPTScpOgogICAgICAgICAgICBjb21waWxlKGInXHhlZlx4YmJceGJmIyAtKi0gY29kaW5nOiBpc28tODg1OS0xNSAtKi1cbicsCiAgICAgICAgICAgICAgICAgICAgJ2R1bW15JywgJ2V4ZWMnKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeW50YXhFcnJvciwgJ2Zha2UnKToKICAgICAgICAgICAgY29tcGlsZShiJ1x4ZWZceGJiXHhiZiMgLSotIGNvZGluZzogZmFrZSAtKi1cbicsICdkdW1teScsICdleGVjJykKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3ludGF4RXJyb3IsICdCT00nKToKICAgICAgICAgICAgY29tcGlsZShiJ1x4ZWZceGJiXHhiZiMgLSotIGNvZGluZzogZmFrZSAtKi1cbicsICdkdW1teScsICdleGVjJykKCiAgICBkZWYgdGVzdF9iYWRfY29kaW5nKHNlbGYpOgogICAgICAgIG1vZHVsZV9uYW1lID0gJ2JhZF9jb2RpbmcnCiAgICAgICAgc2VsZi52ZXJpZnlfYmFkX21vZHVsZShtb2R1bGVfbmFtZSkKCiAgICBkZWYgdGVzdF9iYWRfY29kaW5nMihzZWxmKToKICAgICAgICBtb2R1bGVfbmFtZSA9ICdiYWRfY29kaW5nMicKICAgICAgICBzZWxmLnZlcmlmeV9iYWRfbW9kdWxlKG1vZHVsZV9uYW1lKQoKICAgIGRlZiB2ZXJpZnlfYmFkX21vZHVsZShzZWxmLCBtb2R1bGVfbmFtZSk6CiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIF9faW1wb3J0X18sICd0ZXN0LicgKyBtb2R1bGVfbmFtZSkKCiAgICAgICAgcGF0aCA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihwYXRoLCBtb2R1bGVfbmFtZSArICcucHknKQogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInJiIikgYXMgZnA6CiAgICAgICAgICAgIGJ5dGVzID0gZnAucmVhZCgpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsIGJ5dGVzLCBmaWxlbmFtZSwgJ2V4ZWMnKQoKICAgIGRlZiB0ZXN0X2V4ZWNfdmFsaWRfY29kaW5nKHNlbGYpOgogICAgICAgIGQgPSB7fQogICAgICAgIGV4ZWMoYicjIGNvZGluZzogY3A5NDlcbmEgPSAiXHhhYVx4YTciXG4nLCBkKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYSddLCAnXHUzMDQ3JykKCiAgICBkZWYgdGVzdF9maWxlX3BhcnNlKHNlbGYpOgogICAgICAgICMgaXNzdWUxMTM0OiBhbGwgZW5jb2RpbmdzIG91dHNpZGUgbGF0aW4tMSBhbmQgdXRmLTggZmFpbCBvbgogICAgICAgICMgbXVsdGlsaW5lIHN0cmluZ3MgYW5kIGxvbmcgbGluZXMgKD41MTIgY29sdW1ucykKICAgICAgICB1bmxvYWQoVEVTVEZOKQogICAgICAgIGZpbGVuYW1lID0gVEVTVEZOICsgIi5weSIKICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgInciLCBlbmNvZGluZz0iY3AxMjUyIikKICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBmOgogICAgICAgICAgICAgICAgZi53cml0ZSgiIyAtKi0gY29kaW5nOiBjcDEyNTIgLSotXG4iKQogICAgICAgICAgICAgICAgZi53cml0ZSgiJycnQSBzaG9ydCBzdHJpbmdcbiIpCiAgICAgICAgICAgICAgICBmLndyaXRlKCInJydcbiIpCiAgICAgICAgICAgICAgICBmLndyaXRlKCInQSB2ZXJ5IGxvbmcgc3RyaW5nICVzJ1xuIiAlICgiWCIgKiAxMDAwKSkKCiAgICAgICAgICAgIGltcG9ydGxpYi5pbnZhbGlkYXRlX2NhY2hlcygpCiAgICAgICAgICAgIF9faW1wb3J0X18oVEVTVEZOKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGRlbCBzeXMucGF0aFswXQogICAgICAgICAgICB1bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgICAgIHVubGluayhmaWxlbmFtZSArICJjIikKICAgICAgICAgICAgdW5saW5rKGZpbGVuYW1lICsgIm8iKQogICAgICAgICAgICB1bmxvYWQoVEVTVEZOKQogICAgICAgICAgICBybXRyZWUoJ19fcHljYWNoZV9fJykKCiAgICBkZWYgdGVzdF9lcnJvcl9mcm9tX3N0cmluZyhzZWxmKToKICAgICAgICAjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNjI4OQogICAgICAgIGlucHV0ID0gIiMgY29kaW5nOiBhc2NpaVxuXE57U05PV01BTn0iLmVuY29kZSgndXRmLTgnKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IpIGFzIGM6CiAgICAgICAgICAgIGNvbXBpbGUoaW5wdXQsICI8c3RyaW5nPiIsICJleGVjIikKICAgICAgICBleHBlY3RlZCA9ICInYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4ZTIgaW4gcG9zaXRpb24gMTY6ICIgXAogICAgICAgICAgICAgICAgICAgIm9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkiCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMuZXhjZXB0aW9uLmFyZ3NbMF0uc3RhcnRzd2l0aChleHBlY3RlZCksCiAgICAgICAgICAgICAgICAgICAgICAgIG1zZz1jLmV4Y2VwdGlvbi5hcmdzWzBdKQoKCmNsYXNzIEFic3RyYWN0U291cmNlRW5jb2RpbmdUZXN0OgoKICAgIGRlZiB0ZXN0X2RlZmF1bHRfY29kaW5nKHNlbGYpOgogICAgICAgIHNyYyA9IChiJ3ByaW50KGFzY2lpKCJceGMzXHhhNCIpKVxuJykKICAgICAgICBzZWxmLmNoZWNrX3NjcmlwdF9vdXRwdXQoc3JjLCBiciInXHhlNCciKQoKICAgIGRlZiB0ZXN0X2ZpcnN0X2NvZGluZ19saW5lKHNlbGYpOgogICAgICAgIHNyYyA9IChiJyNjb2Rpbmc6aXNvODg1OS0xNVxuJwogICAgICAgICAgICAgICBiJ3ByaW50KGFzY2lpKCJceGMzXHhhNCIpKVxuJykKICAgICAgICBzZWxmLmNoZWNrX3NjcmlwdF9vdXRwdXQoc3JjLCBiciInXHhjM1x1MjBhYyciKQoKICAgIGRlZiB0ZXN0X3NlY29uZF9jb2RpbmdfbGluZShzZWxmKToKICAgICAgICBzcmMgPSAoYicjXG4nCiAgICAgICAgICAgICAgIGInI2NvZGluZzppc284ODU5LTE1XG4nCiAgICAgICAgICAgICAgIGIncHJpbnQoYXNjaWkoIlx4YzNceGE0IikpXG4nKQogICAgICAgIHNlbGYuY2hlY2tfc2NyaXB0X291dHB1dChzcmMsIGJyIidceGMzXHUyMGFjJyIpCgogICAgZGVmIHRlc3RfdGhpcmRfY29kaW5nX2xpbmUoc2VsZik6CiAgICAgICAgIyBPbmx5IGZpcnN0IHR3byBsaW5lcyBhcmUgdGVzdGVkIGZvciBhIG1hZ2ljIGNvbW1lbnQuCiAgICAgICAgc3JjID0gKGInI1xuJwogICAgICAgICAgICAgICBiJyNcbicKICAgICAgICAgICAgICAgYicjY29kaW5nOmlzbzg4NTktMTVcbicKICAgICAgICAgICAgICAgYidwcmludChhc2NpaSgiXHhjM1x4YTQiKSlcbicpCiAgICAgICAgc2VsZi5jaGVja19zY3JpcHRfb3V0cHV0KHNyYywgYnIiJ1x4ZTQnIikKCiAgICBkZWYgdGVzdF9kb3VibGVfY29kaW5nX2xpbmUoc2VsZik6CiAgICAgICAgIyBJZiB0aGUgZmlyc3QgbGluZSBtYXRjaGVzIHRoZSBzZWNvbmQgbGluZSBpcyBpZ25vcmVkLgogICAgICAgIHNyYyA9IChiJyNjb2Rpbmc6aXNvODg1OS0xNVxuJwogICAgICAgICAgICAgICBiJyNjb2Rpbmc6bGF0aW4xXG4nCiAgICAgICAgICAgICAgIGIncHJpbnQoYXNjaWkoIlx4YzNceGE0IikpXG4nKQogICAgICAgIHNlbGYuY2hlY2tfc2NyaXB0X291dHB1dChzcmMsIGJyIidceGMzXHUyMGFjJyIpCgogICAgZGVmIHRlc3RfZG91YmxlX2NvZGluZ19zYW1lX2xpbmUoc2VsZik6CiAgICAgICAgc3JjID0gKGInI2NvZGluZzppc284ODU5LTE1IGNvZGluZzpsYXRpbjFcbicKICAgICAgICAgICAgICAgYidwcmludChhc2NpaSgiXHhjM1x4YTQiKSlcbicpCiAgICAgICAgc2VsZi5jaGVja19zY3JpcHRfb3V0cHV0KHNyYywgYnIiJ1x4YzNcdTIwYWMnIikKCiAgICBkZWYgdGVzdF9maXJzdF9ub25fdXRmOF9jb2RpbmdfbGluZShzZWxmKToKICAgICAgICBzcmMgPSAoYicjY29kaW5nOmlzby04ODU5LTE1IFx4YTRcbicKICAgICAgICAgICAgICAgYidwcmludChhc2NpaSgiXHhjM1x4YTQiKSlcbicpCiAgICAgICAgc2VsZi5jaGVja19zY3JpcHRfb3V0cHV0KHNyYywgYnIiJ1x4YzNcdTIwYWMnIikKCiAgICBkZWYgdGVzdF9zZWNvbmRfbm9uX3V0ZjhfY29kaW5nX2xpbmUoc2VsZik6CiAgICAgICAgc3JjID0gKGInXG4nCiAgICAgICAgICAgICAgIGInI2NvZGluZzppc28tODg1OS0xNSBceGE0XG4nCiAgICAgICAgICAgICAgIGIncHJpbnQoYXNjaWkoIlx4YzNceGE0IikpXG4nKQogICAgICAgIHNlbGYuY2hlY2tfc2NyaXB0X291dHB1dChzcmMsIGJyIidceGMzXHUyMGFjJyIpCgogICAgZGVmIHRlc3RfdXRmOF9ib20oc2VsZik6CiAgICAgICAgc3JjID0gKGInXHhlZlx4YmJceGJmcHJpbnQoYXNjaWkoIlx4YzNceGE0IikpXG4nKQogICAgICAgIHNlbGYuY2hlY2tfc2NyaXB0X291dHB1dChzcmMsIGJyIidceGU0JyIpCgogICAgZGVmIHRlc3RfdXRmOF9ib21fYW5kX3V0ZjhfY29kaW5nX2xpbmUoc2VsZik6CiAgICAgICAgc3JjID0gKGInXHhlZlx4YmJceGJmI2NvZGluZzp1dGYtOFxuJwogICAgICAgICAgICAgICBiJ3ByaW50KGFzY2lpKCJceGMzXHhhNCIpKVxuJykKICAgICAgICBzZWxmLmNoZWNrX3NjcmlwdF9vdXRwdXQoc3JjLCBiciInXHhlNCciKQoKCmNsYXNzIEJ5dGVzU291cmNlRW5jb2RpbmdUZXN0KEFic3RyYWN0U291cmNlRW5jb2RpbmdUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CgogICAgZGVmIGNoZWNrX3NjcmlwdF9vdXRwdXQoc2VsZiwgc3JjLCBleHBlY3RlZCk6CiAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CiAgICAgICAgICAgIGV4ZWMoc3JjKQogICAgICAgIG91dCA9IHN0ZG91dC5nZXR2YWx1ZSgpLmVuY29kZSgnbGF0aW4xJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5yc3RyaXAoKSwgZXhwZWN0ZWQpCgoKY2xhc3MgRmlsZVNvdXJjZUVuY29kaW5nVGVzdChBYnN0cmFjdFNvdXJjZUVuY29kaW5nVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgoKICAgIGRlZiBjaGVja19zY3JpcHRfb3V0cHV0KHNlbGYsIHNyYywgZXhwZWN0ZWQpOgogICAgICAgIHdpdGggdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KCkgYXMgdG1wZDoKICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4odG1wZCwgJ3Rlc3QucHknKQogICAgICAgICAgICB3aXRoIG9wZW4oZm4sICd3YicpIGFzIGZwOgogICAgICAgICAgICAgICAgZnAud3JpdGUoc3JjKQogICAgICAgICAgICByZXMgPSBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2soZm4pCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMub3V0LnJzdHJpcCgpLCBleHBlY3RlZCkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdW5pdHRlc3QubWFpbigpCg==