Iy0qLSBjb2Rpbmc6IFVURi04IC0qLQppbXBvcnQgdHVydGxlIGFzIHQKIAojIOiuvue9ruiDjOaZr+minOiJsu+8jOeql+WPo+S9jee9ruS7peWPiuWkp+Wwjwp0LmNvbG9ybW9kZSgyNTUpIyDpopzoibLmqKHlvI/vvIhSR0IgMC0yNTXvvIkKdC5zcGVlZCgwKSMg57uY5Zu+6YCf5bqm77yaMOS4uuacgOW/q++8iOaXoOW7tui/n++8iQp0LnNjcmVlbnNpemUoODUwLDc2MCwmcXVvdDt3aGl0ZSZxdW90OykjIOeUu+W4g+Wkp+Wwj++8iOWuvSZ0aW1lczvpq5jvvInlj4rog4zmma/oibIKdC5zZXR1cCh3aWR0aD04NTAsIGhlaWdodD03NjAsc3RhcnR4PTI2MCwgc3RhcnR5PTApICMg57uY5Zu+56qX5Y+j5aSn5bCP5LiO6LW35aeL5Z2Q5qCHCnQudGl0bGUoJnF1b3Q76L+Z5Liq5piv5YiY54+I5a6P6YCB57uZ5L2g55qE6I2J6I6T54aK77yBJnF1b3Q7KSMg56qX5Y+j5qCH6aKYCnQucmVzaXplbW9kZSgnbm9yZXNpemUnKSAgIyDnpoHmraLosIPmlbTnqpflj6PlpKflsI/vvIjpgb/lhY3lm77lvaLplJnkvY3vvIkKdC50cmFjZXIoMSkgICAjIOWunuaXtuaYvuekuue7mOWItui/h+eoiwogCiMg6aKc6Imy6YWN572u77ya6aOO6L2m5Y+254mH5rex6Imy5LiO5rWF6Imy5YiX6KGoCnNjb2xvcj1bJnF1b3Q7I0U2MDA1QyZxdW90OywmcXVvdDsjMDBCRkZGJnF1b3Q7LCZxdW90OyM1MzhhMzAmcXVvdDssJnF1b3Q7I0YyODUwMCZxdW90O10gICAjIOa3seiJsuWIl+ihqApxY29sb3I9WyZxdW90OyNGRjAwN0YmcXVvdDssJnF1b3Q7Izg3Q0VGQSZxdW90OywmcXVvdDsjN2ZiYzJiJnF1b3Q7LCZxdW90OyNGRkE1MDAmcXVvdDtdICAjIOa1heiJsuWIl+ihqAojIOmjjui9puWwuuWvuOiuoeeul++8muWfuuS6juaWnOi+uWJsc2l6ZeaOqOWvvOebtOinkui+uemVv+W6pgpibHNpemU9ODAgICAgICAgICAgICAgICAgICAgICAjIOWkp+etieiFsOebtOinkuS4ieinkuW9ouaWnOi+ue+8iOmjjui9puWPtueJh+WfuuehgOWwuuWvuO+8iQpicz0yKiowLjUvMipibHNpemUgICAgICAgICAgICAgIyDlpKfkuInop5LlvaLnm7Top5LovrnvvIjmoLnlj7cyLzIgJnRpbWVzOyDmlpzovrnvvIkKempiPWJsc2l6ZS8yICMg5bCP562J6IWw55u06KeS5LiJ6KeS5b2i55u06KeS6L65Cnpqc2p4eGI9MioqMC41ICp6amIgICMg5bCP5LiJ6KeS5b2i5pac6L6577yI5qC55Y+3MiAmdGltZXM7IOebtOinkui+ue+8iQpsZW5ndGg9MS43KmJsc2l6ZSAjIOmjjui9puadhumVv+W6pgp3aWR0aD0yLzE1KmJsc2l6ZSAjIOmjjui9puadhuWuveW6pgoKIyDlrprkuYnpo47ovabnu5jliLblh73mlbAKZGVmIGZvbmdjaGUoKToKICAgIHQucGVudXAoKQogICAgdC5nb3RvKC0yMDUsLTQyKSMg56e75Yqo5Yiw6aOO6L2m5Lit5b+D5L2N572uCiAgICB0LmJlZ2luX2ZpbGwoKQogICAgdC5wZW5zaXplKDQpCiAgICB0LnBlbmNvbG9yKCZxdW90OyMzMjEzMjAmcXVvdDspIyDovrnmoYboibLvvIjmt7Hmo5XoibLvvIkKICAgIHQuZmlsbGNvbG9yKCZxdW90OyNEMkI0OEMmcXVvdDspIyDloavlhYXoibLvvIjmtYXmo5XoibLvvIzpo47ovabkuK3lv4PvvIkKICAgIHQuY2lyY2xlKDE1KSMg57uY5Yi26aOO6L2m5Lit5b+D5ZyGCiAgICB0LmVuZF9maWxsKCkKICAgIAogICAgIyDnu5jliLbpo47ovabmnYYKICAgIHQucGVudXAoKQogICAgdC5nb3RvKC0yMjAsODApCiAgICB0LnBlbmRvd24oKQogICAgdC5zZXRoZWFkaW5nKC05MCkjIOeUu+eslOaWueWQkeWQkeS4iwogICAgdC5wZW5zaXplKHdpZHRoKQogICAgdC5wZW5jb2xvcigmcXVvdDsjNWY0YTFkJnF1b3Q7KSMg6aOO6L2m5p2G6aKc6Imy77yI5rex5qOV6Imy77yJCiAgICB0LmZvcndhcmQobGVuZ3RoKQogICAgdC5wZW5zaXplKDIpCiAgICB0LmJhY2t3YXJkKGxlbmd0aCkjIOWbnumAgOWIsOmjjui9puS4reW/g++8jOWHhuWkh+eUu+mjjui9puWPtueJhwogICAgdC5zZXRoZWFkaW5nKDkwKSMg55S756yU5pa55ZCR5ZCR5LiKCiAgICAKICAgICMg5b6q546v57uY5Yi2NOe7hOmjjui9puWPtueJh++8iOavj+e7hOWQqzHkuKrlsI/kuInop5LlvaIrMeS4quWkp+S4ieinkuW9ou+8iQogICAgZm9yIGkgaW4gcmFuZ2UoNCk6CiAgICAgICAgIyDnu5jliLblsI/nrYnohbDnm7Top5LkuInop5LlvaLvvIjmt7HoibLlj7bniYfvvIkKICAgICAgICB0LmNvbG9yKHNjb2xvcltpXSkgICMg6YGN5Y6G5rex6Imy5YiX6KGo6K6+572u6aKc6ImyCiAgICAgICAgdC5iZWdpbl9maWxsKCkKICAgICAgICB0LmZvcndhcmQoempiKQogICAgICAgIHQubGVmdCg5MCkKICAgICAgICB0LmZvcndhcmQoempiKQogICAgICAgIHQubGVmdCgxMzUpCiAgICAgICAgdC5mb3J3YXJkKHpqc2p4eGIpCiAgICAgICAgdC5lbmRfZmlsbCgpCiAKICAgICAgICAjIOe7mOWItuWkp+etieiFsOebtOinkuS4ieinkuW9ou+8iOa1heiJsuWPtueJh++8iQogICAgICAgIHQuY29sb3IocWNvbG9yW2ldKSAgIyDpgY3ljobmtYXoibLliJfooajorr7nva7popzoibIKICAgICAgICB0LmJlZ2luX2ZpbGwoKQogICAgICAgIHQuYmFja3dhcmQoempzanh4YikKICAgICAgICB0LnJpZ2h0KDkwKQogICAgICAgIHQuZm9yd2FyZChicykKICAgICAgICB0LmxlZnQoMTM1KQogICAgICAgIHQuZm9yd2FyZChibHNpemUpCiAgICAgICAgdC5lbmRfZmlsbCgpCiAKICAgICAgICAjIOaXi+i9rDE4MOW6pu+8jOWHhuWkh+e7mOWItuS4i+S4gOe7hOWPtueJhwogICAgICAgIHQucmlnaHQoMTgwKQogICAgICAgIHQucGVudXAoKQogCiMg5a6a5LmJ55y855CD57uY5Yi25omA6ZyA55qE5ZyG5byn5Y+C5pWw77yI6L+t5Luj5Zmo77ya5Y2K5b6E77yM5byn6KeS5bqm5pWw77yJCm1saW5nX2NpcmNsZV9saXN0ID0gaXRlcihbCiAgICAoMTgsIDM2MCksICgxNCwgMzYwKSwgKDEwLCAzNjApLCAoNiwgMzYwKSwKICAgICgxOCwgMzYwKSwgKDE0LCAzNjApLCAoMTAsIDM2MCksICg2LCAzNjApLApdKQogCiMg5a6a5LmJ55y855CD57uY5Yi25Ye95pWw77yINOWxguWPoOWKoO+8muecvOeZvSZyYXJyO+iZueiGnCZyYXJyO+ees+WtlCZyYXJyO+mrmOWFie+8iQpkZWYgbWxpbmdfZHJhd19leWViYWxsKHpiMSx6YjIsemIzLHpiNCk6ICAKICAgIGZvciB6YiwgY29sb3JfIGluIHppcChbemIxLHpiMix6YjMsemI0XSwgWycjZmZmZmZmJywgJyM0ODJkMDgnLCAnIzAwMDAwMCcsICcjZmZmZmZmJ10pOgogICAgICAgIHQucGVudXAoKQogICAgICAgIHQuZ290bygqemIpIyDop6PljIXlnZDmoIflhYPnu4TvvIh4LHnvvIkKICAgICAgICB0LnBlbmRvd24oKQogICAgICAgIHQuYmVnaW5fZmlsbCgpCiAgICAgICAgdC5zZXRoZWFkaW5nKDApIyDnlLvnrJTmlrnlkJHlvZLpm7YKICAgICAgICB0LmNvbG9yKGNvbG9yXykjIOiuvue9ruWhq+WFheiJsgogICAgICAgIHQucGVuY29sb3IoJyMwMDAwMDAnKSMg55y855CD6L655qGG6Imy77yI6buR6Imy77yJCiAgICAgICAgdC5wZW5zaXplKDIpCiAgICAgICAgdC5jaXJjbGUoKm5leHQobWxpbmdfY2lyY2xlX2xpc3QpKSMg5LuO6L+t5Luj5Zmo5Y+W5Y+C5pWw57uY5Yi25ZyGCiAgICAgICAgdC5lbmRfZmlsbCgpCiAKIyDnu5jliLbojYnojpPnhorouqvkvZPova7lu5PvvIjnsonoibLkuLvkvZPvvIkKdC5wZW51cCgpCnAgPSB0LmhvbWUoKSMg5Zue5Yiw5Z2Q5qCH5Y6f54K5CnQucGVuY29sb3IoJnF1b3Q7IzMyMTMyMCZxdW90OykjIOi9ruW7k+iJsu+8iOa3seajleiJsu+8iQp0LmZpbGxjb2xvcigmcXVvdDsjY2IzMjYzJnF1b3Q7KSMg6Lqr5L2T5aGr5YWF6Imy77yI5rex57KJ6Imy77yJCnQucGVuc2l6ZSg0KQp0LmdvdG8oMTIwLDExMCkjIOi1t+Wni+WdkOaghwp0LnBlbmRvd24oKQp0LmJlZ2luX2ZpbGwoKQojIOi6q+S9k+WPs+S+p+i9ruW7kwp0LmdvdG8oMjAwLDApCnQubGVmdCgtNDApCnQuY2lyY2xlKC0xMTAsMTA1KSMg57uY5Yi25aS06YOo5Y+z5L6n5ZyG5bynCnQubGVmdCg3NSkKdC5nb3RvKDE3MCwtMTEwKQp0LmxlZnQoLTgwKQp0LmNpcmNsZSgzMCw0MCkKdC5sZWZ0KDYwKQp0LmNpcmNsZSgtODAsNzApCnQubGVmdCg4MykKdC5jaXJjbGUoLTM1LDk1KQp0LmdvdG8oNjAsLTI3MCkKIyDouqvkvZPlt6bkvqfova7lu5MKdC5sZWZ0KC04MCkKdC5jaXJjbGUoLTY1LDcwKQp0LmxlZnQoNjMpCnQuY2lyY2xlKDM1LDMwKQp0LmxlZnQoMTMwKQp0LmNpcmNsZSgtNjUsNzApCnQuZ290bygtMTIwLC0yNzApCnQubGVmdCgtMTEwKQp0LmNpcmNsZSgtMzUsODApCnQubGVmdCg4MykKdC5jaXJjbGUoLTgwLDUwKQp0LmxlZnQoNjApCnQuY2lyY2xlKC04MCw2MCkKdC5sZWZ0KDYwKQp0LmNpcmNsZSgzMCwzMCkKdC5sZWZ0KDIwKQp0LmNpcmNsZSg4MCw4MCkKdC5sZWZ0KC0xMDUpCnQuY2lyY2xlKC03MCwxNTApCnQubGVmdCg1MCkKdC5jaXJjbGUoLTE3MCw1MCkKdC5nb3RvKDEyMCwxMTApIyDlm57liLDotbfngrnpl63lkIjlm77lvaIKdC5lbmRfZmlsbCgpIyDnu5PmnZ/ouqvkvZPloavlhYUKCiMg57uY5Yi26I2J6I6T54aK6Z2i6YOo55m96Imy5Yy65Z+f77yI6Z2i6YOo5bqV6Imy77yJCnQucGVudXAoKQpwID0gdC5ob21lKCkKdC5wZW5jb2xvcigmcXVvdDsjMzIxMzIwJnF1b3Q7KQp0LmZpbGxjb2xvcigmcXVvdDsjZmZmZmZmJnF1b3Q7KSMg55m96Imy5aGr5YWFCnQucGVuc2l6ZSg0KQp0LmdvdG8oOTAsNjApCnQucGVuZG93bigpCnQuYmVnaW5fZmlsbCgpCnQucmlnaHQoMzApCnQuY2lyY2xlKC0xMzAsMzYwKSMg57uY5Yi25ZyG5b2i6Z2i6YOo5bqV6ImyCnQuZW5kX2ZpbGwoKQoKIyDnu5jliLbojYnojpPnhorlt6bkvqfogLPmnLXvvIjmtYXogqToibLvvIkKdC5wZW51cCgpCnAgPSB0LmhvbWUoKQp0LnBlbmNvbG9yKCZxdW90OyMzMjEzMjAmcXVvdDspCnQuZmlsbGNvbG9yKCZxdW90OyNmM2QyYWQmcXVvdDspIyDogLPmnLXloavlhYXoibLvvIjmtYXogqToibLvvIkKdC5wZW5zaXplKDQpCnQuZ290bygtMjUwLC01NSkKdC5zZXRoKDApIyDnlLvnrJTmlrnlkJHlvZLpm7YKdC5wZW5kb3duKCkKdC5iZWdpbl9maWxsKCkKdC5yaWdodCgtNTUpCnQuY2lyY2xlKC00NSwyNzApIyDnu5jliLbogLPmnLXlnIblvKcKdC5nb3RvKC0yMjAsLTc1KQp0LmdvdG8oLTI1MCwtNTUpIyDpl63lkIjogLPmnLXlm77lvaIKdC5lbmRfZmlsbCgpCiAKIyDosIPnlKjpo47ovabnu5jliLblh73mlbDvvIjmt7vliqDpo47ovaboo4XppbDvvIkKZm9uZ2NoZSgpCiAKIyDnu5jliLbojYnojpPnhorlj7PkvqfogLPmnLXvvIjmtYXogqToibLvvIkKdC5wZW51cCgpCnAgPSB0LmhvbWUoKQp0LnBlbmNvbG9yKCZxdW90OyMzMjEzMjAmcXVvdDspCnQuZmlsbGNvbG9yKCZxdW90OyNmM2QyYWQmcXVvdDspCnQucGVuc2l6ZSg0KQp0LmdvdG8oMTg1LC05MCkKdC5wZW5kb3duKCkKdC5iZWdpbl9maWxsKCkKdC5yaWdodCgxNDApCnQuY2lyY2xlKDQzLDk1KSMg57uY5Yi26ICz5py15ZyG5bynCnQuZ290bygxODUsLTkwKSMg6Zet5ZCI6ICz5py15Zu+5b2iCnQuZW5kX2ZpbGwoKQoKIyDnu5jliLbojYnojpPnhorpvLvlrZDvvIjmt7HnsonoibLvvIkKdC5wZW51cCgpCnQuc2V0aCgwKQp0LnBlbmNvbG9yKCcjMzIxMzIwJykKdC5maWxsY29sb3IoJyNjYjMyNjMnKSMg6by75a2Q5aGr5YWF6Imy77yI5rex57KJ6Imy77yJCnQucGVuc2l6ZSg0KQp0LmJlZ2luX2ZpbGwoKQp0LmdvdG8oMjEsMCkKdC5wZW5kb3duKCkKdC5jaXJjbGUoMTIzLDEzNCkKdC5sZWZ0KC05MCkKdC5jaXJjbGUoNDAsMTg1KQp0LmxlZnQoLTYwKQp0LmNpcmNsZSgxMjAsNjApCnQubGVmdCgtOTApCnQuY2lyY2xlKDUwLDIwMCkKdC5sZWZ0KC05MCkKdC5jaXJjbGUoMTAwLDEwMCkKdC5sZWZ0KC0xMikKdC5jaXJjbGUoMTAwLDQwKQp0LmdvdG8oMjEsMCkjIOmXreWQiOm8u+WtkOWbvuW9ogp0LnBlbnVwKCkKdC5lbmRfZmlsbCgpCgojIOe7mOWItuiNieiOk+eGiuW3puS+p+mdoumDqOeZveiJsuijhemlsAp0LnBlbnVwKCkKdC5nb3RvKDAsIDApCnQuc2V0aCgwKQp0LnBlbmNvbG9yKCcjMzIxMzIwJykKdC5maWxsY29sb3IoJyNmZmZmZmYnKQp0LnBlbnNpemUoNCkKdC5iZWdpbl9maWxsKCkKdC5nb3RvKC03MCwyMTApCnQubGVmdCgxNDApCnQucGVuZG93bigpCnQuY2lyY2xlKDMwLDIwMCkjIOe7mOWItueZveiJsuijhemlsOWchuW8pwp0LmdvdG8oLTcwLDIxMCkjIOmXreWQiOWbvuW9ogp0LnBlbnVwKCkKdC5lbmRfZmlsbCgpCgojIOe7mOWItuiNieiOk+eGiuWPs+S+p+mdoumDqOeZveiJsuijhemlsAp0LnBlbnVwKCkKdC5nb3RvKDAsIDApCnQuc2V0aCgwKQp0LnBlbmNvbG9yKCcjMzIxMzIwJykKdC5maWxsY29sb3IoJyNmZmZmZmYnKQp0LnBlbnNpemUoNCkKdC5iZWdpbl9maWxsKCkKdC5nb3RvKDkwLDIyMCkKdC5sZWZ0KDQ1KQp0LnBlbmRvd24oKQp0LmNpcmNsZSgyMiwyMDApIyDnu5jliLbnmb3oibLoo4XppbDlnIblvKcKdC5nb3RvKDkwLDIyMCkjIOmXreWQiOWbvuW9ogp0LnBlbnVwKCkKdC5lbmRfZmlsbCgpCgojIOe7mOWItuiNieiOk+eGiumdoumDqOS4i+aWueeZveiJsuWMuuWfnwp0LnBlbnVwKCkKdC5nb3RvKDAsIDApCnQuc2V0aCgwKQp0LnBlbmNvbG9yKCcjMzIxMzIwJykKdC5maWxsY29sb3IoJyNmZmZmZmYnKQp0LnBlbnNpemUoNCkKdC5iZWdpbl9maWxsKCkKdC5sZWZ0KC05OCkKdC5sZWZ0KDkwKQp0LmdvdG8oMTgsMTApCnQucGVuZG93bigpCnQuY2lyY2xlKDEwMCwxMzQpCnQubGVmdCgxMCkKdC5jaXJjbGUoMTEwLDMwKQp0LmxlZnQoMTApCnQuY2lyY2xlKDE2MCw0MCkKdC5jaXJjbGUoODUsNDApCnQubGVmdCgyKQp0LmNpcmNsZSg5NSw0MCkKdC5sZWZ0KDUpCnQuY2lyY2xlKDk1LDYwKQp0LmdvdG8oMTgsMTApIyDpl63lkIjlm77lvaIKdC5wZW51cCgpCnQuZW5kX2ZpbGwoKQoKIyDnu5jliLbojYnojpPnhorlj7PkvqfnnInmr5vvvIjmt7HnsonoibLvvIkKdC5wZW51cCgpCnAgPSB0LmhvbWUoKQp0LnBlbmNvbG9yKCZxdW90OyMzMjEzMjAmcXVvdDspCnQuZmlsbGNvbG9yKCZxdW90OyM4ZjNhNTImcXVvdDspIyDnnInmr5vloavlhYXoibLvvIjmt7HnsonoibLvvIkKdC5wZW5zaXplKDIpCnQuZ290bygyNSwyNDApCnQucGVuZG93bigpCnQuYmVnaW5fZmlsbCgpCnQuZ290byg2MCwyMzUpCnQubGVmdCgzMCkKdC5mZCg4KQp0LmxlZnQoOTApCnQuZmQoMjIpCnQuY2lyY2xlKDkwLCA4KQp0LmxlZnQoMjApCnQuY2lyY2xlKDkwLCA4KQp0LmxlZnQoMjApCnQuY2lyY2xlKDkwLCAyMCkKdC5sZWZ0KDQwKQp0LmNpcmNsZSg1MCwgMjApCnQuZW5kX2ZpbGwoKQoKIyDnu5jliLbojYnojpPnhorlj7PkvqfnnInmr5vmt7HoibLnur/mnaEKdC5wZW51cCgpCnQucGVuc2l6ZSgxMikKdC5nb3RvKC0yLDI1MCkKdC5wZW5jb2xvcigmcXVvdDsjNEQxRjAwJnF1b3Q7KSMg57q/5p2h6Imy77yI5rex5qOV6Imy77yJCnQuZmlsbGNvbG9yKCZxdW90OyM0RDFGMDAmcXVvdDspCnQucGVuZG93bigpCnQuZ290byg2MCwyNDApCnQuZW5kX2ZpbGwoKQoKIyDnu5jliLbojYnojpPnhorlt6bkvqfnnInmr5vvvIjmt7HnsonoibLvvIkKdC5wZW51cCgpCnAgPSB0LmhvbWUoKQp0LnBlbmNvbG9yKCZxdW90OyMzMjEzMjAmcXVvdDspCnQuZmlsbGNvbG9yKCZxdW90OyM4ZjNhNTImcXVvdDspCnQucGVuc2l6ZSgyKQp0LmdvdG8oLTU1LDE5MykKdC5wZW5kb3duKCkKdC5iZWdpbl9maWxsKCkKdC5sZWZ0KDY1KQp0LmNpcmNsZSgtOTAsIDI1KQp0LmdvdG8oLTEwLDIzMCkKdC5sZWZ0KDMwKQp0LmZkKDgpCnQubGVmdCg5MCkKdC5mZCgxOCkKdC5jaXJjbGUoOTAsIDgpCnQubGVmdCgyMCkKdC5jaXJjbGUoOTAsIDEwKQp0LmxlZnQoNDApCnQuY2lyY2xlKDkwLCAzMCkKdC5sZWZ0KDMwKQp0LmNpcmNsZSg0MCwgMjApCnQucGVudXAoKQp0LmVuZF9maWxsKCkKCiMg57uY5Yi26I2J6I6T54aK5bem5L6n55yJ5q+b5rex6Imy57q/5p2hCnQucGVuc2l6ZSgxMikKdC5nb3RvKC02MywxOTUpCnQucGVuY29sb3IoJnF1b3Q7IzREMUYwMCZxdW90OykKdC5maWxsY29sb3IoJnF1b3Q7IzREMUYwMCZxdW90OykKdC5wZW5kb3duKCkKdC5sZWZ0KDEwMCkKdC5jaXJjbGUoLTg1LDQ1KQp0LmVuZF9maWxsKCkKIAojIOiwg+eUqOecvOeQg+e7mOWItuWHveaVsO+8iOe7mOWItuW3puWPs+ecvO+8iQptbGluZ19kcmF3X2V5ZWJhbGwoKC0yMCwxODApLCAoLTIzLDE4NSksICgtMjUsMTg4KSwgKC0zMCwyMDApKSAjIOW3puecvAptbGluZ19kcmF3X2V5ZWJhbGwoKDMwLCAxOTMpLCAoMjcsIDIwMCksICgyNSwyMDMpLCAoMjAsMjEzKSkgICAjIOWPs+ecvAogCiMg57uY5Yi26I2J6I6T54aK5Zi05be05Yy65Z+f77yI5rex57KJ6Imy77yJCnQucGVudXAoKQpwID0gdC5ob21lKCkKdC5wZW5jb2xvcigmcXVvdDsjMzIxMzIwJnF1b3Q7KQp0LmZpbGxjb2xvcigmcXVvdDsjOGYzYTUyJnF1b3Q7KQp0LnBlbnNpemUoMykKdC5nb3RvKDI1LDEwNSkKcCA9IHQucG9zKCkKdC5wZW5kb3duKCkKdC5iZWdpbl9maWxsKCkKdC5jaXJjbGUoODUsIDY1KQp0LmxlZnQoMTYpCnQuY2lyY2xlKDMwLCA1NSkKdC5sZWZ0KDIwKQp0LmNpcmNsZSgxNDUsIDU4KQp0LmxlZnQoOCkKdC5jaXJjbGUoMjAsIDU1KQp0LmxlZnQoOCkKdC5jaXJjbGUoNTAsIDY1KQp0LmxlZnQoLTUpCnQuY2lyY2xlKDMxMCwgOCkKdC5lbmRfZmlsbCgpCgojIOe7mOWItuiNieiOk+eGiuWYtOWUh++8iOa3seeyieiJsu+8iQp0LnBlbnVwKCkKdC5nb3RvKDAsIDApCnQuc2V0aCgwKQp0LnBlbmNvbG9yKCcjMzIxMzIwJykKdC5maWxsY29sb3IoJyNhOTNlNTQnKSMg5Zi05ZSH5aGr5YWF6Imy77yI5rex57KJ6Imy77yJCnQucGVuc2l6ZSgzKQp0LmJlZ2luX2ZpbGwoKQp0LmxlZnQoLTIwKQp0LmdvdG8oOSw2NikKdC5wZW5kb3duKCkKdC5jaXJjbGUoNjgsNDApCnQubGVmdCgxMCkKdC5jaXJjbGUoNjUsNDApCnQubGVmdCgxNjApCnQuY2lyY2xlKC03NSw4NSkKdC5sZWZ0KDE1OCkKdC5jaXJjbGUoNDgsMzcpCnQuZ290byg5LDY2KSMg6Zet5ZCI5Zi05ZSH5Zu+5b2iCnQucGVudXAoKQp0LmVuZF9maWxsKCkKCiMg57uY5Yi25paH5a2X56Wd56aP77yI5p2O6ZW/5qKF56Wd5L2g5rC46L+c5byA5b+D77yJCnQuY29sb3IoJyMzMjEzMjAnKQp0LnBlbnVwKCkKdC5nb3RvKDM4MCw2MCkKdC5wZW5kb3duKCkKdC53cml0ZSgmcXVvdDsgJnF1b3Q7CiAgICAgICAgJnF1b3Q7XG7mnY5cbumVv1xu5qKFXG7npZ1cbuS9oFxu5rC4XG7ov5xcbuW8gFxu5b+DJnF1b3Q7LGFsaWduPSZxdW90O2NlbnRlciZxdW90Oyxmb250PSgmcXVvdDvpu5HkvZMmcXVvdDssMjAsJnF1b3Q7bm9ybWFsJnF1b3Q7KSkKCiMg6ZqQ6JeP55S756yU77yI6YG/5YWN5b2x5ZON55S76Z2i576O6KeC77yJCnQucGVudXAoKQp0LmdvdG8oMjkwLDE4MykKdC5wZW5kb3duKCkKdC5oaWRldHVydGxlKCkKCiMg57uY5Yi254ix5b+D6Iqx5py16KOF6aWw77yI57qi6Imy6Iqx55Oj77yJCnQuZmlsbGNvbG9yKCZxdW90O3JlZCZxdW90OykKdC5iZWdpbl9maWxsKCkKdC5jaXJjbGUoMTAsIDE4MCkKdC5jaXJjbGUoMjUsIDExMCkKdC5sZWZ0KDUwKQp0LmNpcmNsZSg2MCwgNDUpCnQuY2lyY2xlKDIwLCAxNzApCnQucmlnaHQoMjQpCnQuZmQoMzApCnQubGVmdCgtOCkjIOWOn+inkuW6puS4ujEw77yM5q2k5aSE6LCD5pW05Li6LTjkvJjljJboirHnk6PlvaLnirYKdC5jaXJjbGUoMzAsIDExMCkKdC5mZCgyMCkKdC5sZWZ0KDQwKQp0LmNpcmNsZSg5MCwgNzApCnQuY2lyY2xlKDMwLCAxNTApCnQucmlnaHQoMzApCnQuZmQoMTUpCnQuY2lyY2xlKDgwLCA5MCkKdC5sZWZ0KDE1KQp0LmZkKDQ1KQp0LnJpZ2h0KDE2NSkKdC5mZCgyMCkKdC5sZWZ0KDE1NSkKdC5jaXJjbGUoMTUwLCA4MCkKdC5sZWZ0KDUwKQp0LmNpcmNsZSgxNTAsIDkwKQp0LmVuZF9maWxsKCkKCiMg57uY5Yi26Iqx55OjMQp0LmxlZnQoMTUwKQp0LmNpcmNsZSgtOTAsIDcwKQp0LmxlZnQoMjApCnQuY2lyY2xlKDc1LCAxMDUpCnQuc2V0aGVhZGluZyg2MCkKdC5jaXJjbGUoODAsIDk4KQp0LmNpcmNsZSgtOTAsIDQwKQoKIyDnu5jliLboirHnk6MyCnQubGVmdCgxODApCnQuY2lyY2xlKDkwLCA0MCkKdC5jaXJjbGUoLTgwLCA5OCkKdC5zZXRoZWFkaW5nKC04MykKCiMg57uY5Yi25Y+25a2QMe+8iOe7v+iJsu+8iQp0LmZkKDMwKQp0LmxlZnQoOTApCnQuZmQoMjUpCnQubGVmdCg0NSkKdC5maWxsY29sb3IoJnF1b3Q7Z3JlZW4mcXVvdDspCnQuYmVnaW5fZmlsbCgpCnQuY2lyY2xlKC04MCwgOTApCnQucmlnaHQoOTApCnQuY2lyY2xlKC04MCwgOTApCnQuZW5kX2ZpbGwoKQp0LnJpZ2h0KDEzNSkKdC5mZCg2MCkKdC5sZWZ0KDE4MCkKdC5mZCg4NSkKdC5sZWZ0KDkwKQp0LmZkKDgwKQoKIyDnu5jliLblj7blrZAy77yI57u/6Imy77yJCnQucmlnaHQoOTApCnQucmlnaHQoNDUpCnQuZmlsbGNvbG9yKCZxdW90O2dyZWVuJnF1b3Q7KQp0LmJlZ2luX2ZpbGwoKQp0LmNpcmNsZSg4MCwgOTApCnQubGVmdCg5MCkKdC5jaXJjbGUoODAsIDkwKQp0LmVuZF9maWxsKCkKdC5sZWZ0KDEzNSkKdC5mZCg2MCkKdC5sZWZ0KDE4MCkKdC5mZCg2MCkKdC5yaWdodCg5MCkKdC5jaXJjbGUoMjAwLCA2MCkKCiMg5L+d5oyB56qX5Y+j5pi+56S677yI57uY5Yi25a6M5oiQ5ZCO5LiN6Ieq5Yqo5YWz6Zet77yJCnQuZG9uZSgpCg==
#-*- coding: UTF-8 -*-
import turtle as t
# 设置背景颜色,窗口位置以及大小
t.colormode(255)# 颜色模式(RGB 0-255)
t.speed(0)# 绘图速度:0为最快(无延迟)
t.screensize(850,760,"white")# 画布大小(宽×高)及背景色
t.setup(width=850, height=760,startx=260, starty=0) # 绘图窗口大小与起始坐标
t.title("这个是刘珈宏送给你的草莓熊!")# 窗口标题
t.resizemode('noresize') # 禁止调整窗口大小(避免图形错位)
t.tracer(1) # 实时显示绘制过程
# 颜色配置:风车叶片深色与浅色列表
scolor=["#E6005C","#00BFFF","#538a30","#F28500"] # 深色列表
qcolor=["#FF007F","#87CEFA","#7fbc2b","#FFA500"] # 浅色列表
# 风车尺寸计算:基于斜边blsize推导直角边长度
blsize=80 # 大等腰直角三角形斜边(风车叶片基础尺寸)
bs=2**0.5/2*blsize # 大三角形直角边(根号2/2 × 斜边)
zjb=blsize/2 # 小等腰直角三角形直角边
zjsjxxb=2**0.5 *zjb # 小三角形斜边(根号2 × 直角边)
length=1.7*blsize # 风车杆长度
width=2/15*blsize # 风车杆宽度
# 定义风车绘制函数
def fongche():
t.penup()
t.goto(-205,-42)# 移动到风车中心位置
t.begin_fill()
t.pensize(4)
t.pencolor("#321320")# 边框色(深棕色)
t.fillcolor("#D2B48C")# 填充色(浅棕色,风车中心)
t.circle(15)# 绘制风车中心圆
t.end_fill()
# 绘制风车杆
t.penup()
t.goto(-220,80)
t.pendown()
t.setheading(-90)# 画笔方向向下
t.pensize(width)
t.pencolor("#5f4a1d")# 风车杆颜色(深棕色)
t.forward(length)
t.pensize(2)
t.backward(length)# 回退到风车中心,准备画风车叶片
t.setheading(90)# 画笔方向向上
# 循环绘制4组风车叶片(每组含1个小三角形+1个大三角形)
for i in range(4):
# 绘制小等腰直角三角形(深色叶片)
t.color(scolor[i]) # 遍历深色列表设置颜色
t.begin_fill()
t.forward(zjb)
t.left(90)
t.forward(zjb)
t.left(135)
t.forward(zjsjxxb)
t.end_fill()
# 绘制大等腰直角三角形(浅色叶片)
t.color(qcolor[i]) # 遍历浅色列表设置颜色
t.begin_fill()
t.backward(zjsjxxb)
t.right(90)
t.forward(bs)
t.left(135)
t.forward(blsize)
t.end_fill()
# 旋转180度,准备绘制下一组叶片
t.right(180)
t.penup()
# 定义眼球绘制所需的圆弧参数(迭代器:半径,弧角度数)
mling_circle_list = iter([
(18, 360), (14, 360), (10, 360), (6, 360),
(18, 360), (14, 360), (10, 360), (6, 360),
])
# 定义眼球绘制函数(4层叠加:眼白→虹膜→瞳孔→高光)
def mling_draw_eyeball(zb1,zb2,zb3,zb4):
for zb, color_ in zip([zb1,zb2,zb3,zb4], ['#ffffff', '#482d08', '#000000', '#ffffff']):
t.penup()
t.goto(*zb)# 解包坐标元组(x,y)
t.pendown()
t.begin_fill()
t.setheading(0)# 画笔方向归零
t.color(color_)# 设置填充色
t.pencolor('#000000')# 眼球边框色(黑色)
t.pensize(2)
t.circle(*next(mling_circle_list))# 从迭代器取参数绘制圆
t.end_fill()
# 绘制草莓熊身体轮廓(粉色主体)
t.penup()
p = t.home()# 回到坐标原点
t.pencolor("#321320")# 轮廓色(深棕色)
t.fillcolor("#cb3263")# 身体填充色(深粉色)
t.pensize(4)
t.goto(120,110)# 起始坐标
t.pendown()
t.begin_fill()
# 身体右侧轮廓
t.goto(200,0)
t.left(-40)
t.circle(-110,105)# 绘制头部右侧圆弧
t.left(75)
t.goto(170,-110)
t.left(-80)
t.circle(30,40)
t.left(60)
t.circle(-80,70)
t.left(83)
t.circle(-35,95)
t.goto(60,-270)
# 身体左侧轮廓
t.left(-80)
t.circle(-65,70)
t.left(63)
t.circle(35,30)
t.left(130)
t.circle(-65,70)
t.goto(-120,-270)
t.left(-110)
t.circle(-35,80)
t.left(83)
t.circle(-80,50)
t.left(60)
t.circle(-80,60)
t.left(60)
t.circle(30,30)
t.left(20)
t.circle(80,80)
t.left(-105)
t.circle(-70,150)
t.left(50)
t.circle(-170,50)
t.goto(120,110)# 回到起点闭合图形
t.end_fill()# 结束身体填充
# 绘制草莓熊面部白色区域(面部底色)
t.penup()
p = t.home()
t.pencolor("#321320")
t.fillcolor("#ffffff")# 白色填充
t.pensize(4)
t.goto(90,60)
t.pendown()
t.begin_fill()
t.right(30)
t.circle(-130,360)# 绘制圆形面部底色
t.end_fill()
# 绘制草莓熊左侧耳朵(浅肤色)
t.penup()
p = t.home()
t.pencolor("#321320")
t.fillcolor("#f3d2ad")# 耳朵填充色(浅肤色)
t.pensize(4)
t.goto(-250,-55)
t.seth(0)# 画笔方向归零
t.pendown()
t.begin_fill()
t.right(-55)
t.circle(-45,270)# 绘制耳朵圆弧
t.goto(-220,-75)
t.goto(-250,-55)# 闭合耳朵图形
t.end_fill()
# 调用风车绘制函数(添加风车装饰)
fongche()
# 绘制草莓熊右侧耳朵(浅肤色)
t.penup()
p = t.home()
t.pencolor("#321320")
t.fillcolor("#f3d2ad")
t.pensize(4)
t.goto(185,-90)
t.pendown()
t.begin_fill()
t.right(140)
t.circle(43,95)# 绘制耳朵圆弧
t.goto(185,-90)# 闭合耳朵图形
t.end_fill()
# 绘制草莓熊鼻子(深粉色)
t.penup()
t.seth(0)
t.pencolor('#321320')
t.fillcolor('#cb3263')# 鼻子填充色(深粉色)
t.pensize(4)
t.begin_fill()
t.goto(21,0)
t.pendown()
t.circle(123,134)
t.left(-90)
t.circle(40,185)
t.left(-60)
t.circle(120,60)
t.left(-90)
t.circle(50,200)
t.left(-90)
t.circle(100,100)
t.left(-12)
t.circle(100,40)
t.goto(21,0)# 闭合鼻子图形
t.penup()
t.end_fill()
# 绘制草莓熊左侧面部白色装饰
t.penup()
t.goto(0, 0)
t.seth(0)
t.pencolor('#321320')
t.fillcolor('#ffffff')
t.pensize(4)
t.begin_fill()
t.goto(-70,210)
t.left(140)
t.pendown()
t.circle(30,200)# 绘制白色装饰圆弧
t.goto(-70,210)# 闭合图形
t.penup()
t.end_fill()
# 绘制草莓熊右侧面部白色装饰
t.penup()
t.goto(0, 0)
t.seth(0)
t.pencolor('#321320')
t.fillcolor('#ffffff')
t.pensize(4)
t.begin_fill()
t.goto(90,220)
t.left(45)
t.pendown()
t.circle(22,200)# 绘制白色装饰圆弧
t.goto(90,220)# 闭合图形
t.penup()
t.end_fill()
# 绘制草莓熊面部下方白色区域
t.penup()
t.goto(0, 0)
t.seth(0)
t.pencolor('#321320')
t.fillcolor('#ffffff')
t.pensize(4)
t.begin_fill()
t.left(-98)
t.left(90)
t.goto(18,10)
t.pendown()
t.circle(100,134)
t.left(10)
t.circle(110,30)
t.left(10)
t.circle(160,40)
t.circle(85,40)
t.left(2)
t.circle(95,40)
t.left(5)
t.circle(95,60)
t.goto(18,10)# 闭合图形
t.penup()
t.end_fill()
# 绘制草莓熊右侧眉毛(深粉色)
t.penup()
p = t.home()
t.pencolor("#321320")
t.fillcolor("#8f3a52")# 眉毛填充色(深粉色)
t.pensize(2)
t.goto(25,240)
t.pendown()
t.begin_fill()
t.goto(60,235)
t.left(30)
t.fd(8)
t.left(90)
t.fd(22)
t.circle(90, 8)
t.left(20)
t.circle(90, 8)
t.left(20)
t.circle(90, 20)
t.left(40)
t.circle(50, 20)
t.end_fill()
# 绘制草莓熊右侧眉毛深色线条
t.penup()
t.pensize(12)
t.goto(-2,250)
t.pencolor("#4D1F00")# 线条色(深棕色)
t.fillcolor("#4D1F00")
t.pendown()
t.goto(60,240)
t.end_fill()
# 绘制草莓熊左侧眉毛(深粉色)
t.penup()
p = t.home()
t.pencolor("#321320")
t.fillcolor("#8f3a52")
t.pensize(2)
t.goto(-55,193)
t.pendown()
t.begin_fill()
t.left(65)
t.circle(-90, 25)
t.goto(-10,230)
t.left(30)
t.fd(8)
t.left(90)
t.fd(18)
t.circle(90, 8)
t.left(20)
t.circle(90, 10)
t.left(40)
t.circle(90, 30)
t.left(30)
t.circle(40, 20)
t.penup()
t.end_fill()
# 绘制草莓熊左侧眉毛深色线条
t.pensize(12)
t.goto(-63,195)
t.pencolor("#4D1F00")
t.fillcolor("#4D1F00")
t.pendown()
t.left(100)
t.circle(-85,45)
t.end_fill()
# 调用眼球绘制函数(绘制左右眼)
mling_draw_eyeball((-20,180), (-23,185), (-25,188), (-30,200)) # 左眼
mling_draw_eyeball((30, 193), (27, 200), (25,203), (20,213)) # 右眼
# 绘制草莓熊嘴巴区域(深粉色)
t.penup()
p = t.home()
t.pencolor("#321320")
t.fillcolor("#8f3a52")
t.pensize(3)
t.goto(25,105)
p = t.pos()
t.pendown()
t.begin_fill()
t.circle(85, 65)
t.left(16)
t.circle(30, 55)
t.left(20)
t.circle(145, 58)
t.left(8)
t.circle(20, 55)
t.left(8)
t.circle(50, 65)
t.left(-5)
t.circle(310, 8)
t.end_fill()
# 绘制草莓熊嘴唇(深粉色)
t.penup()
t.goto(0, 0)
t.seth(0)
t.pencolor('#321320')
t.fillcolor('#a93e54')# 嘴唇填充色(深粉色)
t.pensize(3)
t.begin_fill()
t.left(-20)
t.goto(9,66)
t.pendown()
t.circle(68,40)
t.left(10)
t.circle(65,40)
t.left(160)
t.circle(-75,85)
t.left(158)
t.circle(48,37)
t.goto(9,66)# 闭合嘴唇图形
t.penup()
t.end_fill()
# 绘制文字祝福(李长梅祝你永远开心)
t.color('#321320')
t.penup()
t.goto(380,60)
t.pendown()
t.write(" "
"\n李\n长\n梅\n祝\n你\n永\n远\n开\n心",align="center",font=("黑体",20,"normal"))
# 隐藏画笔(避免影响画面美观)
t.penup()
t.goto(290,183)
t.pendown()
t.hideturtle()
# 绘制爱心花朵装饰(红色花瓣)
t.fillcolor("red")
t.begin_fill()
t.circle(10, 180)
t.circle(25, 110)
t.left(50)
t.circle(60, 45)
t.circle(20, 170)
t.right(24)
t.fd(30)
t.left(-8)# 原角度为10,此处调整为-8优化花瓣形状
t.circle(30, 110)
t.fd(20)
t.left(40)
t.circle(90, 70)
t.circle(30, 150)
t.right(30)
t.fd(15)
t.circle(80, 90)
t.left(15)
t.fd(45)
t.right(165)
t.fd(20)
t.left(155)
t.circle(150, 80)
t.left(50)
t.circle(150, 90)
t.end_fill()
# 绘制花瓣1
t.left(150)
t.circle(-90, 70)
t.left(20)
t.circle(75, 105)
t.setheading(60)
t.circle(80, 98)
t.circle(-90, 40)
# 绘制花瓣2
t.left(180)
t.circle(90, 40)
t.circle(-80, 98)
t.setheading(-83)
# 绘制叶子1(绿色)
t.fd(30)
t.left(90)
t.fd(25)
t.left(45)
t.fillcolor("green")
t.begin_fill()
t.circle(-80, 90)
t.right(90)
t.circle(-80, 90)
t.end_fill()
t.right(135)
t.fd(60)
t.left(180)
t.fd(85)
t.left(90)
t.fd(80)
# 绘制叶子2(绿色)
t.right(90)
t.right(45)
t.fillcolor("green")
t.begin_fill()
t.circle(80, 90)
t.left(90)
t.circle(80, 90)
t.end_fill()
t.left(135)
t.fd(60)
t.left(180)
t.fd(60)
t.right(90)
t.circle(200, 60)
# 保持窗口显示(绘制完成后不自动关闭)
t.done()