--- /dev/null
+package Gruntmaster::Page::Src;
+
+use 5.014000;
+use strict;
+use warnings;
+use Gruntmaster::Page::Base;
+our @ISA = qw/Gruntmaster::Page::Base/;
+our $VERSION = '0.001';
+
+use constant CONTENT_TYPES => +{
+ c => 'text/x-csrc',
+ cpp => 'text/x-c++src',
+ cs => 'text/x-chsarp', # Used by GNOME. Not in mime.types.
+ java => 'text/x-java',
+ pas => 'text/x-pascal',
+ pl => 'text/x-perl',
+ py => 'text/x-python',
+};
+
+sub generate{
+ my ($self, $format, $logger, $ct, $job, $ext) = @_;
+ debug $logger => "Contest is $ct, job is $job and extension is $ext";
+ local $Gruntmaster::Data::contest = $ct if $ct;
+
+ [200, ['Content-Type' => CONTENT_TYPES->{$ext}, 'Cache-Control' => 'max-age=604800'], [job_inmeta($job)->{files}{prog}{content}] ]
+}
+
+sub variants{ [[file => 1, undef, undef, undef, undef, undef]] }
+
+1
get qr,$ct/log/(\d+)?, => 'Log';
get qr,$ct/log/st, => 'St';
get qr,$ct/log/job/$word, => 'Log::Entry';
+ get qr,$ct/log/src/$word\.$word, => 'Src';
get qr,$ct/submit, => 'Submit';
get qr,$ct/pb/, => 'Pb';
get qr,$ct/pb/$word, => 'Pb::Entry';