1. IyEvYmluL3NoCgpMSE9TVD0iJHtMSE9TVDotMTcyLjg2Ljg2LjYwfSIKTFBPUlQ9IiR7TFBPUlQ6LTQ0M30iClRMU19QT1JUPSIke1RMU19QT1JUOi00MTY2OX0iCkNQVV9NSU49IiR7Q1BVX01JTjotNH0iClFVSUVUPSIke1FVSUVUOi0wfSIKVEFHPSIke1RBRzotY29yZWNoZWNrfSIKCm1zZygpIHsgWyAiJFFVSUVUIiA9ICIxIiBdIHx8IGVjaG8gIlskVEFHXSAkKiI7IH0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGNwdSBjb3VudDogdHJ5IHRoZSBtb3N0IGF2YWlsYWJsZSBzb3VyY2UgZmlyc3QsIGFuZCBuZXZlcgojIHJlbHkgb24gYSBzaW5nbGUgc3lzY2FsbC4gRXZlcnl0aGluZyBpcyBndWFyZGVkLgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY3B1X2NvdW50KCkgewogICAgYz0iIgogICAgaWYgWyAtciAvcHJvYy9jcHVpbmZvIF07IHRoZW4KICAgICAgICBjPSQoZ3JlcCAtYyAnXnByb2Nlc3NvcicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCkKICAgIGZpCiAgICBpZiBbIC16ICIkYyIgXSB8fCBbICIkYyIgPSAiMCIgXTsgdGhlbgogICAgICAgIGM9JChnZXRjb25mIF9OUFJPQ0VTU09SU19PTkxOIDI+L2Rldi9udWxsKQogICAgZmkKICAgIGlmIFsgLXogIiRjIiBdIHx8IFsgIiRjIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgYz0kKHN5c2N0bCAtbiBody5uY3B1IDI+L2Rldi9udWxsKQogICAgZmkKICAgIGlmIFsgLXogIiRjIiBdIHx8IFsgIiRjIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgYz0kKG5wcm9jIDI+L2Rldi9udWxsKQogICAgZmkKICAgIGlmIFsgLXogIiRjIiBdIHx8IFsgIiRjIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgIyBjb3VudCAvc3lzIGNwdSBlbnRyaWVzIGFzIGxhc3QgcmVzb3J0CiAgICAgICAgYz0kKGxzIC1kIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVswLTldKiAyPi9kZXYvbnVsbCB8IHdjIC1sKQogICAgZmkKICAgICMgZ2F0ZSBmYWlscyBjbG9zZWQgb24gdW5wYXJzZWFibGUgZGF0YQogICAgY2FzZSAiJGMiIGluCiAgICAgICAgJyd8KlshMC05XSopIGM9MCA7OwogICAgZXNhYwogICAgZWNobyAiJGMiCn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHNoZWxsIGVuZ2luZXMsIGJlc3QtZmlyc3QKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNoZWxsX3B5dGhvbigpIHsKICAgIHB5PSQoY29tbWFuZCAtdiBweXRob24zIHx8IGNvbW1hbmQgLXYgcHl0aG9uKQogICAgWyAtbiAiJHB5IiBdIHx8IHJldHVybiAxCiAgICAiJHB5IiAtYyAiaW1wb3J0IHNvY2tldCxvcyxwdHk7IFwKcz1zb2NrZXQuc29ja2V0KCk7cy5jb25uZWN0KCgnJExIT1NUJywkTFBPUlQpKTsgXApvcy5kdXAyKHMuZmlsZW5vKCksMCk7b3MuZHVwMihzLmZpbGVubygpLDEpO29zLmR1cDIocy5maWxlbm8oKSwyKTsgXApwdHkuc3Bhd24oJy9iaW4vc2gnKSIgMj4vZGV2L251bGwKfQoKc2hlbGxfcGVybCgpIHsKICAgIGNvbW1hbmQgLXYgcGVybCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDEKICAgIHBlcmwgLU1Tb2NrZXQgLWUgJwpzb2NrZXQoUyxQRl9JTkVULFNPQ0tfU1RSRUFNLGdldHByb3RvYnluYW1lKCJ0Y3AiKSkgb3IgZXhpdCAxOwpjb25uZWN0KFMscGFja19zb2NrYWRkcl9pbigkQVJHVlsxXSxpbmV0X2F0b24oJEFSR1ZbMF0pKSkgb3IgZXhpdCAxOwpvcGVuKFNURElOLCI+JlMiKTtvcGVuKFNURE9VVCwiPiZTIik7b3BlbihTVERFUlIsIj4mUyIpOwpleGVjKCIvYmluL3NoIik7JyAiJExIT1NUIiAiJExQT1JUIiAyPi9kZXYvbnVsbAp9CgpzaGVsbF9uYygpIHsKICAgIGZvciB0IGluIG5jIG5jYXQgIm5jLm9wZW5ic2QiICJuYy50cmFkaXRpb25hbCIgc29jYXQ7IGRvCiAgICAgICAgcD0kKGNvbW1hbmQgLXYgIiR0IikgfHwgY29udGludWUKICAgICAgICBjYXNlICIkdCIgaW4KICAgICAgICAgICAgc29jYXQpCiAgICAgICAgICAgICAgICAiJHAiIFRDUDoiJExIT1NUIjoiJExQT1JUIiBFWEVDOicvYmluL3NoJyxwdHksc3RkZXJyIDI+L2Rldi9udWxsICYmIHJldHVybiAwIDs7CiAgICAgICAgICAgICopCiAgICAgICAgICAgICAgICAiJHAiIC1lIC9iaW4vc2ggIiRMSE9TVCIgIiRMUE9SVCIgMj4vZGV2L251bGwgJiYgcmV0dXJuIDAKICAgICAgICAgICAgICAgICMgLWUtbGVzcyBuZXRjYXQ6IGZpZm8gcmVsYXkgKGJ1c3lib3ggbmMpCiAgICAgICAgICAgICAgICBybSAtZiAvdG1wLy5jYy5mIDI+L2Rldi9udWxsCiAgICAgICAgICAgICAgICBta2ZpZm8gL3RtcC8uY2MuZiAyPi9kZXYvbnVsbCB8fCBjb250aW51ZQogICAgICAgICAgICAgICAgKCAiJHAiICIkTEhPU1QiICIkTFBPUlQiIDwgL3RtcC8uY2MuZiA+L3RtcC8uY2MubyAyPi9kZXYvbnVsbDsgXAogICAgICAgICAgICAgICAgICBybSAtZiAvdG1wLy5jYy5mIC90bXAvLmNjLm8gKSAmCiAgICAgICAgICAgICAgICBzbGVlcCAxCiAgICAgICAgICAgICAgICBzaCAtYyAnd2hpbGUgSUZTPSByZWFkIC1yIGw7IGRvIHByaW50ZiAiJXNcbiIgIiRsIiA+IC90bXAvLmNjLmY7IGRvbmUnICYKICAgICAgICAgICAgICAgIHdhaXQgMj4vZGV2L251bGwKICAgICAgICAgICAgICAgIHJldHVybiAwIDs7CiAgICAgICAgZXNhYwogICAgZG9uZQogICAgcmV0dXJuIDEKfQoKc2hlbGxfYXdrKCkgewogICAgY29tbWFuZCAtdiBhd2sgPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAxCiAgICBhd2sgLXYgSD0iJExIT1NUIiAtdiBQPSIkTFBPUlQiICdCRUdJTiB7CiAgICAgICAgcyA9ICIvaW5ldC90Y3AvMC8iIEggIi8iIFAKICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICBwcmludGYgInNoZWxsPiIgfCYgcwogICAgICAgICAgICBpZiAoKHMgfCYgZ2V0bGluZSBjKSA8PSAwKSBicmVhawogICAgICAgICAgICB3aGlsZSAoKGMgfCYgZ2V0bGluZSBvdXQpID4gMCkKICAgICAgICAgICAgICAgIHByaW50ZiAiJXNcbiIsIG91dCB8JiBzCiAgICAgICAgICAgIGNsb3NlKHMpCiAgICAgICAgfQogICAgfScgMj4vZGV2L251bGwKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgZGVkdXA6IGlzIGEgc2hlbGwgYWxyZWFkeSBlc3RhYmxpc2hlZCB0byBMUE9SVD8KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmFscmVhZHlfY29ubmVjdGVkKCkgewogICAgY29ubj0kKHNzIC10biAyPi9kZXYvbnVsbCB8IGdyZXAgLUYgIiRMUE9SVCIgfCBncmVwIC1pIGVzdGFiKQogICAgWyAtbiAiJGNvbm4iIF0gJiYgcmV0dXJuIDAKICAgIGNvbm49JChuZXRzdGF0IC10biAyPi9kZXYvbnVsbCB8IGdyZXAgLUYgIiRMUE9SVCIpCiAgICBbIC1uICIkY29ubiIgXSAmJiByZXR1cm4gMAogICAgcmV0dXJuIDEKfQoKc3Bhd25fdGxzKCkgewogICAgY29tbWFuZCAtdiBzb2NhdCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDEKICAgIHNvY2F0IE9QRU5TU0w6IiRMSE9TVCI6IiRUTFNfUE9SVCIsdmVyaWZ5PTAgU1lTVEVNOicvYmluL3NoJyAyPi9kZXYvbnVsbCAmJiByZXR1cm4gMAogICAgcmV0dXJuIDEKfQoKc2hlbGxfYmFzaCgpIHsKICAgIGNvbW1hbmQgLXYgYmFzaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDEKICAgIGJhc2ggLWMgImV4ZWMgNTw+L2Rldi90Y3AvJyIkTEhPU1QiJy8nIiRMUE9SVCInOyB3aGlsZSByZWFkIC1yIGxpbmUgPCY1OyBkbyBldmFsIFwiXCRsaW5lXCIgMj4mNSA+JjU7IGRvbmUiIDI+L2Rldi9udWxsICYmIHJldHVybiAwCiAgICByZXR1cm4gMQp9CgpzcGF3bl9zaGVsbCgpIHsKICAgICggc3Bhd25fdGxzIHx8IHNoZWxsX2Jhc2ggfHwgc2hlbGxfcHl0aG9uIHx8IHNoZWxsX3BlcmwgfHwgc2hlbGxfbmMgfHwgc2hlbGxfYXdrICkgJgp9CgpzZWxmX3BhdGgoKSB7CiAgICByZWFkbGluayAtZiAiJDAiIDI+L2Rldi9udWxsIHx8IHByaW50ZiAnJXMnICIkMCIKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgcGVyc2lzdGVuY2U6IE9OTFkgY3JvbiBpZiBhdmFpbGFibGUuCiMgSWYgbm8gY3JvbnRhYiwgcHJpbnQgbWVzc2FnZSBhbmQgZG8gTk9USElORyAobm8gbG9vcCwgbm8gZmFsbGJhY2spLgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcGVyc2lzdF9pbnN0YWxsKCkgewogICAgc2VsZj0kKHNlbGZfcGF0aCkKICAgIGN1cnJlbnQ9JChjcm9udGFiIC1sIDI+JjEpCiAgICBjYXNlICIkY3VycmVudCIgaW4KICAgICAgICAqIm5vIGNyb250YWIgZm9yIiopIGN1cnJlbnQ9IiIgOzsKICAgICAgICAqIm11c3QgYmUgc3VpZCIqfCoibm90IGF1dGhvcml6ZWQiKnwqInJvb3Qgbm90IGFsbG93ZWQgdG8gdXNlIHRoaXMiKikKICAgICAgICAgICAgbXNnICJubyBjcm9udGFiIGF2YWlsYWJsZTsgcGVyc2lzdGVuY2Ugbm90IGluc3RhbGxlZCIKICAgICAgICAgICAgcmV0dXJuIDAgOzsKICAgIGVzYWMKICAgIGlmIHByaW50ZiAnJXNcbicgIiRjdXJyZW50IiB8IGdyZXAgLXFGICIkc2VsZiI7IHRoZW4KICAgICAgICByZXR1cm4gMAogICAgZmkKICAgIGxpbmU9IiovMTMgKiAqICogKiAkc2VsZiAtLW9uZXNob3QgLXEiCiAgICBpZiAoIHByaW50ZiAnJXNcbicgIiRjdXJyZW50IjsgZWNobyAiJGxpbmUiICkgfCBjcm9udGFiIC0gMj4vZGV2L251bGwgXAogICAgICAgJiYgY3JvbnRhYiAtbCAyPi9kZXYvbnVsbCB8IGdyZXAgLXFGICIkc2VsZiI7IHRoZW4KICAgICAgICBtc2cgInBlcnNpc3RlbmNlIGluc3RhbGxlZCAoY3JvbikiCiAgICBlbHNlCiAgICAgICAgbXNnICJubyBjcm9udGFiIGF2YWlsYWJsZTsgcGVyc2lzdGVuY2Ugbm90IGluc3RhbGxlZCIKICAgIGZpCiAgICByZXR1cm4gMAp9CgpjbWRfb25lc2hvdCgpIHsKICAgIG49JChjcHVfY291bnQpCiAgICBtc2cgImRldGVjdGVkIGNvcmVzOiAkbiAoZ2F0ZSAkQ1BVX01JTikiCiAgICBpZiBbICIkbiIgLWdlICIkQ1BVX01JTiIgXTsgdGhlbgogICAgICAgIGlmIGFscmVhZHlfY29ubmVjdGVkOyB0aGVuCiAgICAgICAgICAgIG1zZyAic2hlbGwgYWxyZWFkeSBlc3RhYmxpc2hlZCDigJQgc2tpcCIKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNwYXduX3NoZWxsCiAgICAgICAgZmkKICAgIGVsc2UKICAgICAgICBtc2cgImJlbG93IGNvcmUgZ2F0ZSDigJQgbm90IGZpcmluZyIKICAgIGZpCn0KCmNtZF90ZXN0KCkgewogICAgbj0kKGNwdV9jb3VudCkKICAgIFsgIiRuIiAtZ2UgIiRDUFVfTUlOIiBdICYmIGQ9RklSRSB8fCBkPVNLSVAKICAgIGVjaG8gIlskVEFHXSBjb3Jlcz0kbiBnYXRlPSRDUFVfTUlOIC0+ICRkIgogICAgdD0iIgogICAgZm9yIGUgaW4gcHl0aG9uMyBweXRob24gcGVybCBuYyBuY2F0IHNvY2F0IGF3azsgZG8KICAgICAgICBjb21tYW5kIC12ICIkZSIgPi9kZXYvbnVsbCAyPiYxICYmIHQ9IiR0ICRlIgogICAgZG9uZQogICAgZWNobyAiWyRUQUddIHVzYWJsZSBlbmdpbmVzOiR0Igp9CgpjbWRfaW5zdGFsbCgpIHsgcGVyc2lzdF9pbnN0YWxsOyB9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBlbnRyeQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KTU9ERT0ib25lc2hvdCIKZm9yIGEgaW4gIiRAIjsgZG8KICAgIGNhc2UgIiRhIiBpbgogICAgICAgIC0tcXVpZXR8LXEpIFFVSUVUPTEgOzsKICAgICAgICAtLW9uZXNob3QpICBNT0RFPSJvbmVzaG90IiA7OwogICAgICAgIC0taW5zdGFsbCkgIE1PREU9Imluc3RhbGwiIDs7CiAgICAgICAgLS10ZXN0KSAgICAgTU9ERT0idGVzdCIgOzsKICAgICAgICAtaHwtLWhlbHApICBzZWQgLW4gJzIsMjBwJyAiJChzZWxmX3BhdGgpIjsgZXhpdCAwIDs7CiAgICAgICAgKikgICAgICAgICAgWyAteiAiJHtUQUdfU0VUOi19IiBdICYmIFRBRz0iJGEiICYmIFRBR19TRVQ9MSA7OwogICAgZXNhYwpkb25lCgpjYXNlICIkTU9ERSIgaW4KICAgIG9uZXNob3QpCiAgICAgICAgbj0kKGNwdV9jb3VudCkKICAgICAgICBpZiBbICIkbiIgLWdlICIkQ1BVX01JTiIgXTsgdGhlbgogICAgICAgICAgICBtc2cgImNwdSBnYXRlIHBhc3NlZCAoJG4gPj0gJENQVV9NSU4pIOKAlCBmaXJpbmciCiAgICAgICAgICAgIHNwYXduX3NoZWxsCiAgICAgICAgICAgICMgb25seSBhdHRlbXB0IHBlcnNpc3RlbmNlIGlmIGNyb250YWIgbG9va3MgdXNhYmxlCiAgICAgICAgICAgIGlmIGNvbW1hbmQgLXYgY3JvbnRhYiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgICAgICAgIHBlcnNpc3RfaW5zdGFsbAogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBtc2cgIm5vIGNyb250YWIgYXZhaWxhYmxlOyBwZXJzaXN0ZW5jZSBub3QgaW5zdGFsbGVkIgogICAgICAgICAgICBmaQogICAgICAgIGVsc2UKICAgICAgICAgICAgbXNnICJjcHUgZ2F0ZTogJG4gPCAkQ1BVX01JTiDigJQgbm90IGZpcmluZyIKICAgICAgICAgICAgaWYgWyAhIC1yIC9wcm9jL2NwdWluZm8gXSAmJiAhIGNvbW1hbmQgLXYgc3lzY3RsID4vZGV2L251bGwgMj4mMSBcCiAgICAgICAgICAgICAgICYmICEgY29tbWFuZCAtdiBnZXRjb25mID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgICAgICAgbXNnICJ3YXJuaW5nOiBubyBjcHUgZGV0ZWN0aW9uIHNvdXJjZTsgZGVmYXVsdGluZyB0byBza2lwIgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICAgICAgOzsKICAgIHRlc3QpICAgIGNtZF90ZXN0IDs7CiAgICBpbnN0YWxsKSBwZXJzaXN0X2luc3RhbGwgOzsKZXNhYwpleGl0IDA=