+package Y::AoC::Task;
+
+use v5.36;
+
+use Exporter ('import');
+our @EXPORT = qw(t asay bsay);
+use Y::AoC qw(red white grey yellow day year);
+
+our $printed_err;
+$SIG{__DIE__} = sub($msg) {
+ $msg =~ s/\A(.*?)( at \S+ )(line \d+)/red($1).$2.white($3)/e
+ if -t STDERR && !$printed_err++;
+ say STDERR $msg;
+ die "\n";
+};
+
+$SIG{__WARN__} = sub($msg) {
+ $msg =~ s/\A(.*?)( at \S+ )(line \d+)/red($1).$2.white($3)/e
+ if -t STDERR && !$printed_err++;
+ say STDERR $msg;
+};
+
+our $in_test;
+sub t($subtest = ()) {
+ $subtest //= '';
+ $ARGV[0] =~ s/in\.txt/test$subtest.txt/;
+ $in_test = 1;
+}
+
+sub asay(@msg) {
+ try_submit(1, @msg);
+}
+
+sub bsay(@msg) {
+ try_submit(2, @msg);
+}
+
+sub try_submit($part, @msg) {
+ my $msg = join($, // '', @msg);
+ my $ans;
+ $msg =~ s/(\w+)\z/white($ans = $1)/e;
+
+ say $msg;
+
+ return if $in_test;
+
+ my $day = day;
+ my $year = year;
+
+ my $url = "https://adventofcode.com/$year/day/$day/answer";
+ my $cachefile = "ans-$year-$day-$part-$ans.html";
+ local $| = 1;
+ print "\nSubmit $url\nlevel=", white($part), ' answer=',
+ white($ans), ' ? [Enter]/[Ctrl-C]: ';
+
+ scalar <STDIN>;
+ eval '{
+ local $SIG{__DIE__};
+ require Y::AoC::UA;
+ }';
+ my $res = Y::AoC::UA::request($url, {
+ form => {
+ answer => $ans,
+ level => $part,
+ },
+ cache_to => $cachefile,
+ });
+
+ my $art = $res->find('main > article > p')->join("\n");
+ if (!$art) {
+ say $res->to_string;
+ return;
+ }
+
+ $art =~ s/'/'/g;
+ $art =~ s/(?<=That's )not(?= the right answer)/red($&)/e;
+ my $ok = $art =~ s/(?<=That's the )(right answer)/yellow($&)/e;
+ $art =~ s/(gold stars?)/yellow($&)/e;
+ $art =~ s/(silver star)/grey($&)/e;
+ Y::AoC::UA::cache_del($cachefile)
+ if $msg =~ s/(?<=Please wait ).*?(?= before trying again)/white($&)/e;
+ $art =~ s/(?<=your answer is )([^\.;]+)/red($&)/e;
+ $art =~ s/<code>([^<]+)<\/code>/white($1)/e;
+ $art =~ s/<[^>]+>//g;
+
+ if ($ok) {
+ system "cp $0 backup/$0-ok-$ans-$part";
+ }
+
+ say $art;
+}
+
+1;
+__END__
+package Y::AoC::UA;
+
+sub new($class, $year, $day) {
+ eval 'require
+}
+
+sub get($ua) {
+1;