IiBUZXN0IGZvciA6bWtzZXNzaW9uLCA6bWt2aWV3IGFuZCA6bG9hZHZpZXcgaW4gbGF0aW4xIGVuY29kaW5nCgpzZXQgZW5jb2Rpbmc9bGF0aW4xCnNjcmlwdGVuY29kaW5nIGxhdGluMQoKc291cmNlIGNoZWNrLnZpbQpDaGVja0ZlYXR1cmUgbWtzZXNzaW9uCgpzb3VyY2Ugc2hhcmVkLnZpbQpzb3VyY2UgdGVybV91dGlsLnZpbQoKZnVuYyBUZXN0X21rc2Vzc2lvbigpCiAgdGFibmV3CiAgbGV0IHdyYXBfc2F2ZSA9ICZ3cmFwCiAgc2V0IHNlc3Npb25vcHRpb25zPWJ1ZmZlcnMgc3BsaXRiZWxvdyBmaWxlZW5jb2Rpbmc9bGF0aW4xCiAgY2FsbCBzZXRsaW5lKDEsIFsKICAgIFwgICAnc3RhcnQ6JywKICAgIFwgICAnbm8gbXVsdGlieXRlIGNoQXJhY3RlcicsCiAgICBcICAgJwlvbmUgbGVhRGluZyB0YWInLAogICAgXCAgICcgICAgZm91ciBsZWFkaW5HIHNwYWNlcycsCiAgICBcICAgJ3R3bwkJY29uc2VjdXRpdmUgdGFicycsCiAgICBcICAgJ3R3bwl0YWJzCWluIG9uZSBsaW5lJywKICAgIFwgICAnb25lIOQgbXVsdGlieXRlQ2hhcmFjdGVyJywKICAgIFwgICAnYeQgxCAgdHdvIG11bHRpQnl0ZSBjaGFyYWN0ZXJzJywKICAgIFwgICAnQeT2/CAgdGhyZWUgbXVsVGlieXRlIGNoYXJhY3RlcnMnLAogICAgXCAgICdzaG9ydCBsaW5lJywKICAgIFwgXSkKICBsZXQgdG1wZmlsZSA9ICdYdGVtcCcKICBleGVjICd3ISAnIC4gdG1wZmlsZQogIC9ec3RhcnQ6CiAgc2V0IHdyYXAKICB2c3BsaXQKICBub3JtISBqMTZ8CiAgc3BsaXQKICBub3JtISBqMTZ8CiAgc3BsaXQKICBub3JtISBqMTZ8CiAgc3BsaXQKICBub3JtISBqOHwKICBzcGxpdAogIG5vcm0hIGo4fAogIHNwbGl0CiAgbm9ybSEgajE2fAogIHNwbGl0CiAgbm9ybSEgajE2fAogIHNwbGl0CiAgbm9ybSEgajE2fAogIHNwbGl0CiAgbm9ybSEgaiQKICB3aW5jbWQgbAoKICBzZXQgbm93cmFwCiAgL15zdGFydDoKICBub3JtISBqMTZ8M3psCiAgc3BsaXQKICBub3JtISBqMDE2fDN6bAogIHNwbGl0CiAgbm9ybSEgajAxNnwzemwKICBzcGxpdAogIG5vcm0hIGowOHwzemwKICBzcGxpdAogIG5vcm0hIGowOHwzemwKICBzcGxpdAogIG5vcm0hIGowMTZ8M3psCiAgc3BsaXQKICBub3JtISBqMDE2fDN6bAogIHNwbGl0CiAgbm9ybSEgajAxNnwzemwKICBzcGxpdAogIGNhbGwgd2luY29sKCkKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBsZXQgbGkgPSBmaWx0ZXIocmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKSwgJ3Y6dmFsID1+IyAiXFwoXiAqbm9ybWFsISBbMCRdXFx8XiAqZXhlICcnbm9ybWFsIVxcKSInKQogIGxldCBleHBlY3RlZCA9IFsKICAgIFwgICAnbm9ybWFsISAwMTZ8JywKICAgIFwgICAnbm9ybWFsISAwMTZ8JywKICAgIFwgICAnbm9ybWFsISAwMTZ8JywKICAgIFwgICAnbm9ybWFsISAwOHwnLAogICAgXCAgICdub3JtYWwhIDA4fCcsCiAgICBcICAgJ25vcm1hbCEgMDE2fCcsCiAgICBcICAgJ25vcm1hbCEgMDE2fCcsCiAgICBcICAgJ25vcm1hbCEgMDE2fCcsCiAgICBcICAgJ25vcm1hbCEgJCcsCiAgICBcICAgIiAgZXhlICdub3JtYWwhICcgLiBzOmMgLiAnfHpzJyAuIDE2IC4gJ3wnIiwKICAgIFwgICAiICBub3JtYWwhIDAxNnwiLAogICAgXCAgICIgIGV4ZSAnbm9ybWFsISAnIC4gczpjIC4gJ3x6cycgLiAxNiAuICd8JyIsCiAgICBcICAgIiAgbm9ybWFsISAwMTZ8IiwKICAgIFwgICAiICBleGUgJ25vcm1hbCEgJyAuIHM6YyAuICd8enMnIC4gMTYgLiAnfCciLAogICAgXCAgICIgIG5vcm1hbCEgMDE2fCIsCiAgICBcICAgIiAgZXhlICdub3JtYWwhICcgLiBzOmMgLiAnfHpzJyAuIDggLiAnfCciLAogICAgXCAgICIgIG5vcm1hbCEgMDh8IiwKICAgIFwgICAiICBleGUgJ25vcm1hbCEgJyAuIHM6YyAuICd8enMnIC4gOCAuICd8JyIsCiAgICBcICAgIiAgbm9ybWFsISAwOHwiLAogICAgXCAgICIgIGV4ZSAnbm9ybWFsISAnIC4gczpjIC4gJ3x6cycgLiAxNiAuICd8JyIsCiAgICBcICAgIiAgbm9ybWFsISAwMTZ8IiwKICAgIFwgICAiICBleGUgJ25vcm1hbCEgJyAuIHM6YyAuICd8enMnIC4gMTYgLiAnfCciLAogICAgXCAgICIgIG5vcm1hbCEgMDE2fCIsCiAgICBcICAgIiAgZXhlICdub3JtYWwhICcgLiBzOmMgLiAnfHpzJyAuIDE2IC4gJ3wnIiwKICAgIFwgICAiICBub3JtYWwhIDAxNnwiLAogICAgXCAgICIgIGV4ZSAnbm9ybWFsISAnIC4gczpjIC4gJ3x6cycgLiAxNiAuICd8JyIsCiAgICBcICAgIiAgbm9ybWFsISAwMTZ8IgogICAgXCBdCiAgY2FsbCBhc3NlcnRfZXF1YWwoZXhwZWN0ZWQsIGxpKQogIHRhYmNsb3NlIQoKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCiAgY2FsbCBkZWxldGUodG1wZmlsZSkKICBsZXQgJndyYXAgPSB3cmFwX3NhdmUKICBzZXQgc2Vzc2lvbm9wdGlvbnMmCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fd2luaGVpZ2h0KCkKICBuZXcKICBzZXQgd2luaGVpZ2h0PTEwCiAgc2V0IHdpbm1pbmhlaWdodD0yCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgc291cmNlIFh0ZXN0X21rcy5vdXQKCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX2xhcmdlX3dpbmhlaWdodCgpCiAgc2V0IHdpbmhlaWdodD05OTkKICBta3Nlc3Npb24hIFh0ZXN0X21rc193aW5oZWlnaHQub3V0CiAgc2V0IHdpbmhlaWdodCYKICBzb3VyY2UgWHRlc3RfbWtzX3dpbmhlaWdodC5vdXQKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzX3dpbmhlaWdodC5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3J0cCgpCiAgaWYgaGFzKCd3aW4zMicpCiAgICAiIFRPRE86IGZpeCBwcm9ibGVtIHdpdGggYmFja3NsYXNoZXMKICAgIHJldHVybgogIGVuZGlmCiAgbmV3CiAgbGV0IF9ydHA9JnJ0cAogICIgTWFrZSBhIHJlYWwgbG9uZyAoaW52YWxpZCkgcnVudGltZXBhdGggdmFsdWUsCiAgIiB0aGF0IHNob3VsZCBleGNlZWQgUEFUSF9NQVggKGhvcGVmdWxseSkKICBsZXQgbmV3cnRwPSZydHAuJyx+Jy5yZXBlYXQoJy9mb29iYXInLCAxMDAwKQogIGxldCBuZXdydHAuPSIsIi5leHBhbmQoIiRIT01FIikuIi8udmltIgogIGxldCAmcnRwPW5ld3J0cAoKICAiIGRldGVybWluZSBleHBlY3RlZCB2YWx1ZQogIGxldCBleHBlY3RlZD1zcGxpdCgmcnRwLCAnLCcpCiAgbGV0IGV4cGVjdGVkID0gbWFwKGV4cGVjdGVkLCAnInNldCBydW50aW1lcGF0aCs9Ii52OnZhbCcpCiAgbGV0IGV4cGVjdGVkID0gWydzZXQgcnVudGltZXBhdGg9J10gKyBleHBlY3RlZAogIGxldCBleHBlY3RlZCA9IG1hcChleHBlY3RlZCwge3YsdyAtPiBzdWJzdGl0dXRlKHcsICRIT01FLCAifiIsICJnIil9KQoKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBsZXQgJnJ0cD1fcnRwCiAgbGV0IGxpID0gZmlsdGVyKHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JyksICd2OnZhbCA9fiMgInJ1bnRpbWVwYXRoIicpCiAgY2FsbCBhc3NlcnRfZXF1YWwoZXhwZWN0ZWQsIGxpKQoKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fYXJnbGlzdCgpCiAgYXJnZGVsICoKICBuZXh0IGZpbGUxIGZpbGUyIGZpbGUzIGZpbGU0CiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbChbJ2ZpbGUxJywgJ2ZpbGUyJywgJ2ZpbGUzJywgJ2ZpbGU0J10sIGFyZ3YoKSkKCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQogIGFyZ2RlbCAqCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fb25lX2J1ZmZlcl90d29fd2luZG93cygpCiAgZWRpdCBYdGVzdDEKICBuZXcgWHRlc3QyCiAgc3BsaXQKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzLm91dCcpCiAgbGV0IGNvdW50MSA9IDAKICBsZXQgY291bnQyID0gMAogIGxldCBjb3VudDJidWYgPSAwCiAgZm9yIGxpbmUgaW4gbGluZXMKICAgIGlmIGxpbmUgPX4gJ2VkaXQgXGYqWHRlc3QxJCcKICAgICAgbGV0IGNvdW50MSArPSAxCiAgICBlbmRpZgogICAgaWYgbGluZSA9fiAnZWRpdCBcZlx7LX1YdGVzdDInCiAgICAgIGxldCBjb3VudDIgKz0gMQogICAgZW5kaWYKICAgIGlmIGxpbmUgPX4gJ2J1ZmZlciBcZlx7LX1YdGVzdDInCiAgICAgIGxldCBjb3VudDJidWYgKz0gMQogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF9lcXVhbCgxLCBjb3VudDEsICdYdGVzdDEgY291bnQnKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDIsIGNvdW50MiwgJ1h0ZXN0MiBjb3VudCcpCiAgY2FsbCBhc3NlcnRfZXF1YWwoMiwgY291bnQyYnVmLCAnWHRlc3QyIGJ1ZmZlciBjb3VudCcpCgogIGNsb3NlCiAgYndpcGUhCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX2xjZF9tdWx0aXBsZV90YWJzKCkKICB0YWJuZXcKICB0YWJuZXcKICBsY2QgLgogIHRhYmZpcnN0CiAgbGNkIC4KICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICB0YWJvbmx5CiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF90cnVlKGhhc2xvY2FsZGlyKCksICdUYWIgMSBsb2NhbGRpcicpCiAgdGFibmV4dCAyCiAgY2FsbCBhc3NlcnRfdHJ1ZSghaGFzbG9jYWxkaXIoKSwgJ1RhYiAyIGxvY2FsZGlyJykKICB0YWJuZXh0IDMKICBjYWxsIGFzc2VydF90cnVlKGhhc2xvY2FsZGlyKCksICdUYWIgMyBsb2NhbGRpcicpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgoiIFRlc3QgZm9yIHRhYnBhZ2UtbG9jYWwgZGlyZWN0b3J5CmZ1bmMgVGVzdF9ta3Nlc3Npb25fdGNkX211bHRpcGxlX3RhYnMoKQogIGxldCBzYXZlX2N3ZCA9IGdldGN3ZCgpCiAgY2FsbCBta2RpcignWHRvcGRpcicpCiAgY2QgWHRvcGRpcgogIGNhbGwgbWtkaXIoJ1h0YWJkaXIxJykKICBjYWxsIG1rZGlyKCdYdGFiZGlyMicpCiAgY2FsbCBta2RpcignWHRhYmRpcjMnKQogIGNhbGwgbWtkaXIoJ1h3aW5kaXIxJykKICBjYWxsIG1rZGlyKCdYd2luZGlyMicpCiAgY2FsbCBta2RpcignWHdpbmRpcjMnKQogIHRjZCBYdGFiZGlyMQogIGJvdHJpZ2h0IG5ldwogIHdpbmNtZCB0CiAgbGNkIC4uL1h3aW5kaXIxCiAgdGFibmV3CiAgdGNkIC4uL1h0YWJkaXIyCiAgYm90cmlnaHQgbmV3CiAgbGNkIC4uL1h3aW5kaXIyCiAgdGFibmV3CiAgdGNkIC4uL1h0YWJkaXIzCiAgYm90cmlnaHQgbmV3CiAgbGNkIC4uL1h3aW5kaXIzCiAgdGFiZmlyc3QKICAxd2luY21kIHcKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBvbmx5IHwgdGFib25seQogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1h0YWJkaXIxJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKC0xLCAxKSwgJzp0JykpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1h3aW5kaXIxJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKDEsIDEpLCAnOnQnKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHRhYmRpcjEnLCBmbmFtZW1vZGlmeShnZXRjd2QoMiwgMSksICc6dCcpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYdGFiZGlyMicsIGZuYW1lbW9kaWZ5KGdldGN3ZCgtMSwgMiksICc6dCcpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYdGFiZGlyMicsIGZuYW1lbW9kaWZ5KGdldGN3ZCgxLCAyKSwgJzp0JykpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1h3aW5kaXIyJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKDIsIDIpLCAnOnQnKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHRhYmRpcjMnLCBmbmFtZW1vZGlmeShnZXRjd2QoLTEsIDMpLCAnOnQnKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHRhYmRpcjMnLCBmbmFtZW1vZGlmeShnZXRjd2QoMSwgMyksICc6dCcpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYd2luZGlyMycsIGZuYW1lbW9kaWZ5KGdldGN3ZCgyLCAzKSwgJzp0JykpCiAgb25seSB8IHRhYm9ubHkKICBleGUgJ2NkICcgLiBzYXZlX2N3ZAogIGNhbGwgZGVsZXRlKCJYdG9wZGlyIiwgInJmIikKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl9ibGFua190YWJzKCkKICB0YWJuZXcKICB0YWJuZXcKICB0YWJuZXcKICB0YWJuZXh0IDMKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICB0YWJuZXcKICB0YWJuZXcKICB0YWJuZXh0IDIKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKDQsIHRhYnBhZ2VucignJCcpLCAnc2Vzc2lvbiByZXN0b3JlIHNob3VsZCByZXN0b3JlIG51bWJlciBvZiB0YWJzJykKICBjYWxsIGFzc2VydF9lcXVhbCgzLCB0YWJwYWdlbnIoKSwgJ3Nlc3Npb24gcmVzdG9yZSBzaG91bGQgcmVzdG9yZSB0aGUgYWN0aXZlIHRhYicpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX2J1ZmZlcl9jb3VudCgpCiAgc2V0IGhpZGRlbgoKICAiIEVkaXQgZXhhY3RseSB0aHJlZSBmaWxlcyBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgogICVid2lwZSEKICBlIFhmb28gfCB0YWJlIFhiYXIgfCB0YWJlIFhiYXoKICB0YWJkbyB3cml0ZQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAoKICAiIFZlcmlmeSB0aGF0IGxvYWRpbmcgdGhlIHNlc3Npb24gZG9lcyBub3QgY3JlYXRlIGFkZGl0aW9uYWwgYnVmZmVycy4KICAlYndpcGUhCiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbCgzLCBsZW4oZ2V0YnVmaW5mbygpKSkKCiAgIiBDbGVhbiB1cC4KICBjYWxsIGRlbGV0ZSgnWGZvbycpCiAgY2FsbCBkZWxldGUoJ1hiYXInKQogIGNhbGwgZGVsZXRlKCdYYmF6JykKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCiAgJWJ3aXBlIQogIHNldCBoaWRkZW4mCmVuZGZ1bmMKCmlmIGhhcygnZXh0cmFfc2VhcmNoJykKCmZ1bmMgVGVzdF9ta3Nlc3Npb25faGxzZWFyY2goKQogIHNldCBobHNlYXJjaAogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIG5vaGxzZWFyY2gKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKDEsIHY6aGxzZWFyY2gsICdzZXNzaW9uIHNob3VsZCByZXN0b3JlIHNlYXJjaCBoaWdobGlnaHRpbmcgc3RhdGUnKQogIG5vaGxzZWFyY2gKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKDAsIHY6aGxzZWFyY2gsICdzZXNzaW9uIHNob3VsZCByZXN0b3JlIHNlYXJjaCBoaWdobGlnaHRpbmcgc3RhdGUnKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZW5kaWYKCgpmdW5jIFRlc3RfbWtzZXNzaW9uX2JsYW5rX3dpbmRvd3MoKQogIHNwbGl0CiAgc3BsaXQKICBzcGxpdAogIDMgd2luY21kIHcKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBzcGxpdAogIHNwbGl0CiAgMiB3aW5jbWQgdwogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoNCwgd2lubnIoJyQnKSwgJ3Nlc3Npb24gcmVzdG9yZSBzaG91bGQgcmVzdG9yZSBudW1iZXIgb2Ygd2luZG93cycpCiAgY2FsbCBhc3NlcnRfZXF1YWwoMywgd2lubnIoKSwgJ3Nlc3Npb24gcmVzdG9yZSBzaG91bGQgcmVzdG9yZSB0aGUgYWN0aXZlIHdpbmRvdycpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgppZiBoYXMoJ3Rlcm1pbmFsJykKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fdGVybWluYWxfc2hlbGwoKQogIHRlcm1pbmFsCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKQogIGxldCB0ZXJtX2NtZCA9ICcnCiAgZm9yIGxpbmUgaW4gbGluZXMKICAgIGlmIGxpbmUgPX4gJ150ZXJtaW5hbCcKICAgICAgbGV0IHRlcm1fY21kID0gbGluZQogICAgZWxzZWlmIGxpbmUgPX4gJ2JhZGQuKicgLiAmc2hlbGwKICAgICAgY2FsbCBhc3NlcnRfcmVwb3J0KCd1bmV4cGVjdGVkIHNoZWxsIGxpbmU6ICcgLiBsaW5lKQogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF9tYXRjaCgndGVybWluYWwgKytjdXJ3aW4gKytjb2xzPVxkXCsgKytyb3dzPVxkXCtccyouKiQnLCB0ZXJtX2NtZCkKCiAgY2FsbCBTdG9wU2hlbGxJblRlcm1pbmFsKGJ1Zm5yKCclJykpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3Rlcm1pbmFsX25vX3Jlc3RvcmVfY21kYXJnKCkKICB0ZXJtaW5hbCArK25vcmVzdG9yZQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBsZXQgdGVybV9jbWQgPSAnJwogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdedGVybWluYWwnCiAgICAgIGNhbGwgYXNzZXJ0X3JlcG9ydCgnc2Vzc2lvbiBtdXN0IG5vdCByZXN0b3JlIHRlbWluYWwnKQogICAgZW5kaWYKICBlbmRmb3IKCiAgY2FsbCBTdG9wU2hlbGxJblRlcm1pbmFsKGJ1Zm5yKCclJykpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3Rlcm1pbmFsX25vX3Jlc3RvcmVfZnVuY2FyZygpCiAgY2FsbCB0ZXJtX3N0YXJ0KCZzaGVsbCwgeydub3Jlc3RvcmUnOiAxfSkKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzLm91dCcpCiAgbGV0IHRlcm1fY21kID0gJycKICBmb3IgbGluZSBpbiBsaW5lcwogICAgaWYgbGluZSA9fiAnXnRlcm1pbmFsJwogICAgICBjYWxsIGFzc2VydF9yZXBvcnQoJ3Nlc3Npb24gbXVzdCBub3QgcmVzdG9yZSB0ZW1pbmFsJykKICAgIGVuZGlmCiAgZW5kZm9yCgogIGNhbGwgU3RvcFNoZWxsSW5UZXJtaW5hbChidWZucignJScpKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl90ZXJtaW5hbF9ub19yZXN0b3JlX2Z1bmMoKQogIHRlcm1pbmFsCiAgY2FsbCB0ZXJtX3NldHJlc3RvcmUoYnVmbnIoJyUnKSwgJ05PTkUnKQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBsZXQgdGVybV9jbWQgPSAnJwogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdedGVybWluYWwnCiAgICAgIGNhbGwgYXNzZXJ0X3JlcG9ydCgnc2Vzc2lvbiBtdXN0IG5vdCByZXN0b3JlIHRlbWluYWwnKQogICAgZW5kaWYKICBlbmRmb3IKCiAgY2FsbCBTdG9wU2hlbGxJblRlcm1pbmFsKGJ1Zm5yKCclJykpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3Rlcm1pbmFsX25vX3Nzb3AoKQogIHRlcm1pbmFsCiAgc2V0IHNlc3Npb25vcHRpb25zLT10ZXJtaW5hbAogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBsZXQgdGVybV9jbWQgPSAnJwogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdedGVybWluYWwnCiAgICAgIGNhbGwgYXNzZXJ0X3JlcG9ydCgnc2Vzc2lvbiBtdXN0IG5vdCByZXN0b3JlIHRlbWluYWwnKQogICAgZW5kaWYKICBlbmRmb3IKCiAgY2FsbCBTdG9wU2hlbGxJblRlcm1pbmFsKGJ1Zm5yKCclJykpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQogIHNldCBzZXNzaW9ub3B0aW9ucyYKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl90ZXJtaW5hbF9yZXN0b3JlX290aGVyKCkKICB0ZXJtaW5hbAogIGNhbGwgdGVybV9zZXRyZXN0b3JlKGJ1Zm5yKCclJyksICdvdGhlcicpCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKQogIGxldCB0ZXJtX2NtZCA9ICcnCiAgZm9yIGxpbmUgaW4gbGluZXMKICAgIGlmIGxpbmUgPX4gJ150ZXJtaW5hbCcKICAgICAgbGV0IHRlcm1fY21kID0gbGluZQogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF9tYXRjaCgndGVybWluYWwgKytjdXJ3aW4gKytjb2xzPVxkXCsgKytyb3dzPVxkXCsuKm90aGVyJywgdGVybV9jbWQpCgogIGNhbGwgU3RvcFNoZWxsSW5UZXJtaW5hbChidWZucignJScpKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZW5kaWYgIiBoYXMoJ3Rlcm1pbmFsJykKCiIgVGVzdCA6bWt2aWV3IHdpdGggYSBmaWxlIGFyZ3VtZW50LgpmdW5jIFRlc3RfbWt2aWV3X2ZpbGUoKQogICIgQ3JlYXRlIGEgdmlldyB3aXRoIGxpbmUgbnVtYmVyIGFuZCBhIGZvbGQuCiAgaGVscCA6bWt2aWV3CiAgc2V0IG51bWJlcgogIG5vcm0hIFZ9emYwCiAgbGV0IHBvcyA9IGdldHBvcygnLicpCiAgbGV0IGxpbmVmb2xkY2xvc2VkMSA9IGZvbGRjbG9zZWQoJy4nKQogIG1rdmlldyEgWHZpZXcKICBzZXQgbm9udW1iZXIKICBub3JtISB6cmoKICAiIFdlIGNhbiBjbG9zZSB0aGUgaGVscCB3aW5kb3csIGFzIG1rdmlldyB3aXRoIGEgZmlsZSBuYW1lIHNob3VsZAogICIgZ2VuZXJhdGUgYSBjb21tYW5kIHRvIGVkaXQgdGhlIGZpbGUuCiAgaGVscGNsb3NlCgogIHNvdXJjZSBYdmlldwogIGNhbGwgYXNzZXJ0X2VxdWFsKDEsICZudW1iZXIpCiAgY2FsbCBhc3NlcnRfbWF0Y2goJ1wqOm1rdmlld1wqJCcsIGdldGxpbmUoJy4nKSkKICBjYWxsIGFzc2VydF9lcXVhbChwb3MsIGdldHBvcygnLicpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKGxpbmVmb2xkY2xvc2VkMSwgZm9sZGNsb3NlZCgnLicpKQoKICAiIENyZWF0aW5nIGEgdmlldyBhZ2FpbiB3aXRoIHRoZSBzYW1lIGZpbGUgbmFtZSBzaG91bGQgZmFpbCAoZmlsZQogICIgYWxyZWFkeSBleGlzdHMpLiBCdXQgd2l0aCBhICEsIHRoZSBwcmV2aW91cyB2aWV3IHNob3VsZCBiZQogICIgb3ZlcndyaXR0ZW4gd2l0aG91dCBlcnJvci4KICBoZWxwIDpsb2FkdmlldwogIGNhbGwgYXNzZXJ0X2ZhaWxzKCdta3ZpZXcgWHZpZXcnLCAnRTE4OTonKQogIGNhbGwgYXNzZXJ0X21hdGNoKCdcKjpsb2Fkdmlld1wqJCcsIGdldGxpbmUoJy4nKSkKICBta3ZpZXchIFh2aWV3CiAgY2FsbCBhc3NlcnRfbWF0Y2goJ1wqOmxvYWR2aWV3XCokJywgZ2V0bGluZSgnLicpKQoKICBjYWxsIGRlbGV0ZSgnWHZpZXcnKQogIGJ3aXBlCmVuZGZ1bmMKCiIgVGVzdCA6bWt2aWV3IGFuZCA6bG9hZHZpZXcgd2l0aCBhIGN1c3RvbSAndmlld2RpcicuCmZ1bmMgVGVzdF9ta3ZpZXdfbG9hZHZpZXdfd2l0aF92aWV3ZGlyKCkKICBzZXQgdmlld2Rpcj1Ydmlld2RpcgoKICBoZWxwIDpta3ZpZXcKICBzZXQgbnVtYmVyCiAgbm9ybSEgVn16ZgogIGxldCBwb3MgPSBnZXRwb3MoJy4nKQogIGxldCBsaW5lZm9sZGNsb3NlZDEgPSBmb2xkY2xvc2VkKCcuJykKICBta3ZpZXcgMQogIHNldCBub251bWJlcgogIG5vcm0hIHpyagoKICBsb2FkdmlldyAxCgogICIgVGhlIGRpcmVjdG9yeSBYdmlld2Rpci8gc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIGFuZCB0aGUgdmlldwogICIgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGF0IGRpcmVjdG9yeS4KICBjYWxsIGFzc2VydF9lcXVhbCgnWHZpZXdkaXIvJyAuCiAgICAgICAgXCAgICAgICAgICAgc3Vic3RpdHV0ZSgKICAgICAgICBcICAgICAgICAgICAgIHN1YnN0aXR1dGUoCiAgICAgICAgXCAgICAgICAgICAgICAgIGV4cGFuZCgnJTpwJyksICcvJywgJz0rJywgJ2cnKSwgJzonLCAnPS0nLCAnZycpIC4gJz0xLnZpbScsCiAgICAgICAgXCAgICAgICAgICAgZ2xvYignWHZpZXdkaXIvKicpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDEsICZudW1iZXIpCiAgY2FsbCBhc3NlcnRfbWF0Y2goJ1wqOm1rdmlld1wqJCcsIGdldGxpbmUoJy4nKSkKICBjYWxsIGFzc2VydF9lcXVhbChwb3MsIGdldHBvcygnLicpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKGxpbmVmb2xkY2xvc2VkMSwgZm9sZGNsb3NlZCgnLicpKQoKICBjYWxsIGRlbGV0ZSgnWHZpZXdkaXInLCAncmYnKQogIHNldCB2aWV3ZGlyJgogIGhlbHBjbG9zZQplbmRmdW5jCgpmdW5jIFRlc3RfbWt2aWV3X25vX2ZpbGVfbmFtZSgpCiAgbmV3CiAgIiA6bWt2aWV3IG9yIDpta3ZpZXcge25yfSBzaG91bGQgZmFpbCBpbiBhIHVubmFtZWQgYnVmZmVyLgogIGNhbGwgYXNzZXJ0X2ZhaWxzKCdta3ZpZXcnLCAnRTMyOicpCiAgY2FsbCBhc3NlcnRfZmFpbHMoJ21rdmlldyAxJywgJ0UzMjonKQoKICAiIDpta3ZpZXcge2ZpbGV9IHNob3VsZCBzdWNjZWVkIGluIGEgdW5uYW1lZCBidWZmZXIuCiAgbWt2aWV3IFh2aWV3CiAgaGVscAogIHNvdXJjZSBYdmlldwogIGNhbGwgYXNzZXJ0X2VxdWFsKCcnLCBidWZuYW1lKCclJykpCgogIGNhbGwgZGVsZXRlKCdYdmlldycpCiAgJWJ3aXBlCmVuZGZ1bmMKCiIgQSBjbGVhbiBzZXNzaW9uIChvbmUgZW1wdHkgYnVmZmVyLCBvbmUgd2luZG93LCBhbmQgb25lIHRhYikgc2hvdWxkIG5vdAoiIHNldCBhbnkgZXJyb3IgbWVzc2FnZXMgd2hlbiBzb3VyY2VkIGJlY2F1c2Ugbm8gY29tbWFuZHMgc2hvdWxkIGZhaWwuCmZ1bmMgVGVzdF9ta3Nlc3Npb25fbm9fZXJybXNnKCkKICBsZXQgdjplcnJtc2cgPSAnJwogICVid2lwZSEKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKCcnLCB2OmVycm1zZykKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fcXVvdGVfaW5fZmlsZW5hbWUoKQogIGlmICFoYXMoJ3VuaXgnKQogICAgIiBvbmx5IFVuaXggY2FuIGhhbmRsZSB0aGlzIHdlaXJkIGZpbGVuYW1lCiAgICByZXR1cm4KICBlbmRpZgogIGxldCB2OmVycm1zZyA9ICcnCiAgJWJ3aXBlIQogIHNwbGl0IGFub3RoZXIKICBzcGxpdCB4J3lcInoKICBta3Nlc3Npb24hIFh0ZXN0X21rc19xdW90ZWQub3V0CiAgJWJ3aXBlIQogIHNvdXJjZSBYdGVzdF9ta3NfcXVvdGVkLm91dAogIGNhbGwgYXNzZXJ0X3RydWUoYnVmZXhpc3RzKCJ4J3lcInoiKSkKCiAgJWJ3aXBlIQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3NfcXVvdGVkLm91dCcpCmVuZGZ1bmMKCmZ1bmMgczpDbGVhck1hcHBpbmdzKCkKICBtYXBjbGVhcgogIG9tYXBjbGVhcgogIG1hcGNsZWFyIQogIGxtYXBjbGVhcgogIHRtYXBjbGVhcgplbmRmdW5jCgpmdW5jIFRlc3RfbWt2aW1yYygpCiAgbGV0IGVudHJpZXMgPSBbCiAgICAgICAgXCBbJycsICdub3RoaW5nJywgJzxOb3A+J10sCiAgICAgICAgXCBbJ24nLCAnbm9ybWFsJywgJ05PUk1BTCddLAogICAgICAgIFwgWyd2JywgJ3Zpc3VhbCcsICdWSVNVQUwnXSwKICAgICAgICBcIFsncycsICdzZWxlY3QnLCAnU0VMRUNUJ10sCiAgICAgICAgXCBbJ3gnLCAndmlzdWFsb25seScsICdWSVNVQUxPTkxZJ10sCiAgICAgICAgXCBbJ28nLCAnb3BlcmF0b3InLCAnT1BFUkFUT1InXSwKICAgICAgICBcIFsnaScsICdpbnNlcnQnLCAnSU5TRVJUJ10sCiAgICAgICAgXCBbJ2wnLCAnbGFuZycsICdMQU5HJ10sCiAgICAgICAgXCBbJ2MnLCAnY29tbWFuZCcsICdDT01NQU5EJ10sCiAgICAgICAgXCBbJ3QnLCAndGVybWluYWwnLCAnVEVSTUlOQUwnXSwKICAgICAgICBcIF0KICBmb3IgZW50cnkgaW4gZW50cmllcwogICAgZXhlIGVudHJ5WzBdIC4uICdtYXAgJyAuLiBlbnRyeVsxXSAuLiAnICcgLi4gZW50cnlbMl0KICBlbmRmb3IKCiAgbWt2aW1yYyBYdGVzdHZpbXJjCgogIGNhbGwgczpDbGVhck1hcHBpbmdzKCkKICBmb3IgZW50cnkgaW4gZW50cmllcwogICAgY2FsbCBhc3NlcnRfZXF1YWwoJycsIG1hcGFyZyhlbnRyeVsxXSwgZW50cnlbMF0pKQogIGVuZGZvcgoKICBzb3VyY2UgWHRlc3R2aW1yYwoKICBmb3IgZW50cnkgaW4gZW50cmllcwogICAgY2FsbCBhc3NlcnRfZXF1YWwoZW50cnlbMl0sIG1hcGFyZyhlbnRyeVsxXSwgZW50cnlbMF0pKQogIGVuZGZvcgoKICBjYWxsIHM6Q2xlYXJNYXBwaW5ncygpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0dmltcmMnKQplbmRmdW5jCgoKIiB2aW06IHNoaWZ0d2lkdGg9MiBzdHM9MiBleHBhbmR0YWIK