Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Sandbox/TheCOSMICbistro

From Wikipedia, the free encyclopedia
local p = {}

function p.standings(frame)
	local getArgs = require('Module:Arguments').getArgs
	local args = getArgs(frame, {parentFirst = true})
    --[[ to do list
    0. add championships
    0. clean up functions
    1. documentation
    2. simplify how drivers, teams, and manufacturers are added (USE SEPARATORS!)
    3. allow classify to not classify drivers
    4. add year functionality
    5. remove dependence on championship
    6. standardize results using upper and lower
    7. changing column name functionality
    8. streamline subraces
    9. make cancellation a race attribute and not a driver result attribute
    10. build collage to create points/color/display systems
    ]]
    -- colors
    local colors = {gold='#FFFFBF', silver='#DFDFDF', bronze='#FFDF9F', green='#DFFFDF', light_blue='#CFEAFF', dark_blue='#CFCFFF', purple='#EFCFFF', red='#FFCFCF', brown='#DFC484', black='#000000; color: white', white='#FFFFFF', blank='#; color: white', empty='#'}
    -- example points system
    -- {['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9'], ['10'], ['11'], ['12'], ['13'], ['14'], ['15'], ['16'], ['17'], ['18'], ['19'], ['20'], ['21'], ['22'], ['23'], ['24'], ['25'], ['26'], ['27'], ['28'], ['29'], ['30'], ['31'], ['32'], ['33'], ['34'], ['35'], ['36'], ['37'], ['38'], ['39'], ['40'], ['41'], ['42'], ['43'], ['44'], ['45'], ['46'], ['47'], ['48'], ['49'], ['50'], ['51'], ['52'], ['53'], ['54'], ['55'], ['56'], ['57'], ['58'], ['59'], ['60'], ['61'], ['62'], ['63'], ['64'], ['65'], ['66'], ['67'], ['68'], ['69'], ['70'], ['71'], ['72'], ['73'], ['74'], ['75'], ['76'], ['77'], ['78'], ['79'], ['80'], ['81'], ['82'], ['83'], ['84'], ['85'], ['86'], ['87'], ['88'], ['89'], ['90'], ['91'], ['92'], ['93'], ['94'], ['95'], ['96'], ['97'], ['98'], ['99'], ['100']}
    local ex_main_points_system = {['1']=100, ['2']=90, ['3']=80, ['4']=70, ['5']=60, ['6']=50, ['7']=40, ['8']=30, ['9']=20, ['10']=10, ['11']=0, ['12']=0, ['13']=0, ['14']=0, ['15']=0, ['16']=0, ['17']=0, ['18']=0, ['19']=0, ['20']=0, ['21']=0, ['22']=0, ['23']=0, ['24']=0, ['25']=0, NC=0, Ret=0, DNQ=0, EX=0, DSQ=0, DNS=0, WD=0, DNA=0, C=0, [' ']=0}
    local ex_side_points_system = {['1']=20, ['2']=18, ['3']=16, ['4']=14, ['5']=12, ['6']=10, ['7']=8, ['8']=6, ['9']=4, ['10']=2, P=10, F=4, L=2, M=6}
    local ex_color_system = {['1']=colors['gold'], ['2']=colors['silver'], ['3']=colors['bronze'], ['4']=colors['green'], ['5']=colors['green'], ['6']=colors['green'], ['7']=colors['green'], ['8']=colors['green'], ['9']=colors['green'], ['10']=colors['green'], ['11']=colors['dark_blue'], ['12']=colors['dark_blue'], ['13']=colors['dark_blue'], ['14']=colors['dark_blue'], ['15']=colors['dark_blue'], ['16']=colors['dark_blue'], ['17']=colors['dark_blue'], ['18']=colors['dark_blue'], ['19']=colors['dark_blue'], ['20']=colors['dark_blue'], ['21']=colors['dark_blue'], ['22']=colors['dark_blue'], ['23']=colors['dark_blue'], ['24']=colors['dark_blue'], ['25']=colors['dark_blue'], NC=colors['dark_blue'], Ret=colors['purple'], DNQ=colors['red'], EX=colors['black'], DSQ=colors['black'], DNS=colors['white'], WD=colors['white'], DNA=colors['white'], C=colors['white'], [' ']=colors['empty']}
    local ex_display_system = {['1']='1', ['2']='2', ['3']='3', ['4']='4', ['5']='5', ['6']='6', ['7']='7', ['8']='8', ['9']='9', ['10']='10', ['11']='11', ['12']='12', ['13']='13', ['14']='14', ['15']='15', ['16']='16', ['17']='17', ['18']='18', ['19']='19', ['20']='20', ['21']='21', ['22']='22', ['23']='23', ['24']='24', ['25']='25', NC='NC', Ret='Ret', DNQ='DNQ', EX='EX', DSQ='DSQ', DNS='DNS', WD='WD', DNA='DNA', C='C', [' ']=''}
    local ex_classification = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', 'NC', 'Ret', 'DNQ', 'EX', 'DSQ', 'DNS', 'WD', 'DNA', 'C', ' '}
    -- functions
    ---- padding function
    local function pad(num) return string.format('%06d', tonumber(num)) end
    ---- ascending alphanumeric and descending alphanumeric sorting functions
    local function alphanum_asc(x, y)
        return x:gsub('(%d+)', pad) < y:gsub('(%d+)', pad)
    end
    local function alphanum_desc(x, y)
        return x:gsub('(%d+)', pad) > y:gsub('(%d+)', pad)
    end
    ---- identical function
    local function identical(table1, table2)
        local function identical_helper(table1, table2, truth)
            for i=1, math.min(#table1, #table2) do
                if type(table1[i]) == 'table' and type(table2[i]) == 'table' then
                    identical_helper(table1[i], table2[i], truth)
                elseif table1[i] ~= table2[i] then
                    truth = truth + 1
                end
            end
            return truth == 0
        end
        return identical_helper(table1, table2, 0)
    end
    ---- includes function
    local function includes(array, value)
        for i, v in ipairs(array) do
            if type(v) == 'table' and type(value) == 'table' then
                return identical(v, value)
            elseif type(v) == 'table' then
                return includes(v, value)
            elseif v == value then
                return true
            end
        end
        return false
    end
	---- index function
    local function index(array, value)
        for i, v in ipairs(array) do
            if type(v) == 'table' and type(value) == 'table' and identical(v, value) then
                return i
            elseif type(v) == 'table' and includes(v, value) then
                return i
            elseif v == value then
                return i
            end
        end
        return nil
    end
    ---- systems creating function

    ---- points calculating function
    local function calculate(championship, rlengths, results, pps, sps)
        local points = {}
        for id, result in ipairs(results) do
            local pts = 0
            for i, r in ipairs(result) do
                local sub = {}
                if type(r) == 'table' then
                    for s=2, #r do
                        table.insert(sub, r[s])
                    end
                    r = r[1]
                end
                if r:find('=') then
                    local _, eqe = r:find('=')
                    pts = pts + pps[r:sub(eqe+1)]
                elseif r:match('^R%d+$') or r:match('^D%d+$') then
                    pts = pts + pps[r:sub(2)]
                elseif championship == 'WEC' or championship == 'GTWCE' then
                    pts = pts + pps[r][rlengths[i]]
                elseif r:match('^N%d+$') then
                else
                    pts = pts + pps[r]
                end
                for _, s in ipairs(sub) do
                    pts = pts + sps[s]
                end
            end
            points[id] = pts
        end
        return points
    end
    ---- points sorting function
    local function classify(championship, results, points, scheme)
        local format, finishes, empty = {}, {}, {}
        for id, pts in ipairs(points) do
            format[id] = {id, pts}
        end
        for id, result in ipairs(results) do
            finishes[id] = {}
            table.insert(empty, ' ')
            for _, r in ipairs(result) do
                local i
                if type(r) == 'table' then
                    r = r[1]
                end
                if r:find('=') then
                    local _, eqe = r:find('=')
                    r = r:sub(eqe+1)
                end
                if r:match('^R%d+') then
                    i = index(scheme, 'Ret')
                elseif r:match('^N%d+') then
                    i = index(scheme, 'NC')
                elseif r:match('^D%d+') then
                    i = index(scheme, 'DSQ')
                else
                    i = index(scheme, r)
                end
                if finishes[id][i] then
                    finishes[id][i] = finishes[id][i] + 1
                else
                    finishes[id][i] = 1
                end
            end
            for c=1, #scheme do
                if not finishes[id][c] then
                    finishes[id][c] = 0
                end
            end
        end
        local swapped
        local b = #format
        repeat
            swapped = false
            for i=1, b-1 do
                local separate = false
                if format[i][2] < format[i+1][2] then
                    format[i], format[i+1] = format[i+1], format[i]
                    swapped, separate = true, true
                elseif format[i][2] > format[i+1][2] then
                    separate = true
                end
                if not separate then
                    for f=1, #scheme do
                        if finishes[format[i][1]][f] < finishes[format[i+1][1]][f] then
                            format[i], format[i+1] = format[i+1], format[i]
                            swapped = true
                            break
                        elseif finishes[format[i][1]][f] > finishes[format[i+1][1]][f] then
                            break
                        end
                    end
                end
            end
            b = b - 1
        until not swapped
        local step = 1
        if #format < 2 then
            return {}
        end
        repeat
            if format[step][2] == format[step+1][2] then
                if identical(results[format[step][1]], empty) and identical(results[format[step+1][1]], empty) then
                    format[step][3], format[step+1][3] = 0, 0
                elseif identical(results[format[step][1]], results[format[step+1][1]]) then
                    if format[step][3] then
                        format[step+1][3] = format[step][3]
                    else
                       format[step][3], format[step+1][3] = 1, 1
                    end
                elseif identical(finishes[format[step][1]], finishes[format[step+1][1]]) then
                    if format[step][3] then
                        format[step+1][3] = format[step][3] + 1
                    else
                        format[step][3], format[step+1][3] = 1, 2
                    end
                end
            end
            step = step + 1
        until step >= #format
        local comp = 1
        local positions, pos = {}, 1
        repeat
            if format[comp][2] == format[comp+1][2] then
                if not positions[pos] then
                    positions[pos] = {format[comp][1]}
                end
                if format[comp][3] == 0 and format[comp+1][3] == 0 then
                    positions[pos][#positions[pos]], positions[pos][#positions[pos]+1] = format[comp][1], format[comp+1][1]
                elseif format[comp][3] and format[comp+1][3] and format[comp][3] == format[comp+1][3] then
                    if type(positions[pos][format[comp][3]]) ~= 'table' then
                        positions[pos][format[comp][3]] = {format[comp][1], format[comp+1][1]}
                    else
                        table.insert(positions[pos][format[comp][3]], format[comp+1][1])
                    end
                elseif format[comp][3] and format[comp+1][3] then
                    positions[pos][format[comp+1][3]] = {format[comp+1][1]}
                else
                    positions[pos], positions[pos+1] = {format[comp][1]}, {format[comp+1][1]}
                    pos = pos + 1
                end
            else
                if not positions[pos] then
                    positions[pos] = {format[comp][1]}
                end
                positions[pos+1] = {format[comp+1][1]}
                pos = pos + 1
            end
            comp = comp + 1
        until comp >= #format
        return positions
    end
    ---- championship clinched function
    local function clinched(championship, id, drivers, results, points, max, min)
        local specific = {}
        for d, _ in pairs(drivers) do
            table.insert(specific, {d, points[d]})
        end
        table.sort(specific, function(x, y) return x[2] > y[2] end)
        if #specific == 0 then
            return false
        end
        local delta = max - min
        local remaining, left = 0
        for i=1, #specific do
            for r=1, #results[specific[i][1]] do
                if results[specific[i][1]][r] ~= '' and remaining < r then
                    remaining = r
                end
            end
            left = #results[specific[i][1]] - remaining
        end
        if specific[1][1] == id[1] then
            local against
            if #specific == 1 then
                against = 0
            else
                against = points[specific[2][1]]
            end
            if points[id[1]] > against + (delta*left) then
                return true
            end
        end
        return false
    end
    ---- wikitable row function
    local function combine(championship, id, drivers, rookies, teams, stints, manufacturers, result, point, auxpoint, position, auxposition, clinch, pps, sps, cs, ds)
        local row_def, row_results, row_fin = '', {}, ''
        local cell = '| style="background:'
        local num_teams, num_manufacturers = 0, 0
        if teams[id[1]] then
            num_teams = #teams[id[1]]
        end
        if manufacturers[id[1]] then
            num_manufacturers = #manufacturers[id[1]]
        end
        local R = ''
        if rookies[id[1]] then
            if championship == 'INDYCAR' then
                if clinch then
                    R = ' <span style="border: 1px solid silver; padding: 1px 4px; color: black; background-color: yellow;">' .. "'''RY'''" .. '</span>'
                else
                    R = ' <span style="border: 1px solid silver; padding: 1px 3px; color: black; background-color: orange;">' .. "'''R'''" .. '</span>'
                end
            elseif championship == 'MOTOGP' then
                R = ' style="background:#ADD8E6;"'
            end
        end
        if num_teams > 1 then
            row_def = row_def .. '! rowspan="' .. num_teams .. '" | ' .. position .. '\n| style="position: sticky; left: 0; background-clip: padding-box; color: inherit;" align="left" rowspan="' .. num_teams .. '"'
        else
            row_def = row_def .. '! ' .. position .. '\n| style="position: sticky; left: 0; background-clip: padding-box; color: inherit;" align="left"'
        end
        if championship == 'MOTOGP' then
            row_def = row_def .. R
        end
        row_def = row_def .. ' | '
        for _, d in ipairs(id) do
            row_def = row_def .. drivers[d] .. '<br>'
        end
        id = id[1]
        row_def = row_def:sub(1, #row_def-4)
        if championship == 'INDYCAR' then
            row_def = row_def .. R
        end
        row_def = row_def .. '\n'
        local first, last, stint = 1, #result, 1
        if num_teams > 1 then
            first, last = tonumber(stints[id][1][stint]), tonumber(stints[id][1][stint+1])
        end
        local t = 1
        repeat
            local row_races = ''
            if num_teams > 0 then
                if championship == 'MOTOGP' then
                    row_races = row_races .. '| ' .. teams[id][t] .. '\n'
                else
                    row_races = row_races .. '| align="left" | ' .. teams[id][t] .. '\n'
                end
            end
            if num_teams > 1 then
                first = tonumber(stints[id][t][stint]) or first
                last = tonumber(stints[id][t][stint+1]) or last
            end
            if num_manufacturers > 0 then
                if championship == 'MOTOGP' then
                    row_races = row_races .. '| ' .. manufacturers[id][t] .. '\n'
                else
                    row_races = row_races .. '| align="left" | ' .. manufacturers[id][t] .. '\n'
                end
            end
            for i, r in ipairs(result) do
                local bg
                local face, sup = {}, {}
                if type(r) == 'table' then
                    for s=2, #r do
                        if ds[r[s]]:find("'") then
                            table.insert(face, r[s])
                        else
                            table.insert(sup, r[s])
                        end
                    end
                    r = r[1]
                end
                if r:match('%w+=%w+') then
                    local eqs, eqe = r:find('=')
                    bg = cs[r:sub(eqe+1)]
                    r = ds[r:sub(1, eqs-1)]
                elseif r:match('^R%d+$') then
                    bg = cs['Ret']
                    r = ds[r:sub(2)]
                elseif r:match('^N%d+') then
                    bg = cs['NC']
                    r = ds[r:sub(2)] .. '&dagger;'
                elseif r:match('^D%d+') then
                    bg = cs['DSQ']
                    r = ds[r:sub(2)]
                elseif championship == 'WRC' then
                    bg = cs[r] .. '; padding: 1em'
                    r = ds[r]
                else
                    bg = cs[r]
                    r = ds[r]
                end
                for _, tf in ipairs(face) do
                    r = ds[tf] .. r .. ds[tf]
                end
                if i < first or i > last then
                    bg, r = colors['empty'], ' '
                end
                row_races = row_races .. cell .. bg .. ';" | '
                if championship == 'WRC' and r ~= '' then
                    row_races = row_races .. '<div class="sfrac nowrap;">'
                end
                row_races = row_races .. r
                if championship == 'WRC' and r ~= '' then
                    row_races = row_races .. '</div><div style="line-height: 1em; font-size: 85%; padding: 0 0;"><small>' .. pps[r]
                    for _, s in ipairs(sup) do
                        row_races = row_races .. '+' .. sps[s]
                    end
                    row_races = row_races .. '</small></div>'
                    sup = {}
                elseif championship == 'WRC' or championship == 'IMSA' then
                    sup = {}
                end
                for _, s in ipairs(sup) do
                    row_races = row_races .. "<sup>'''" .. ds[s] .. "'''</sup>"
                end
                row_races = row_races .. '\n'
                if i == last then
                    stint = stint + 2
                    if num_teams > 1 then
                        first = tonumber(stints[id][t][stint]) or first
                        last = tonumber(stints[id][t][stint+1]) or last
                    end
                end
            end
            table.insert(row_results, row_races)
            stint = 1
            t = t + 1
        until t > num_teams
        if num_teams > 1 then
            row_fin = row_fin .. '! style="position: sticky; right: 0; background-clip: padding-box; color: inherit;" rowspan="' .. num_teams .. '" | ' .. point .. '\n'
        else
            row_fin = row_fin .. '! style="position: sticky; right: 0; background-clip: padding-box; color: inherit;" | ' .. point .. '\n'
        end
        if auxposition then
            if num_teams > 1 then
                row_fin = row_fin .. '! rowspan="' .. num_teams .. '" '
            else
                row_fin = row_fin .. '! '
            end
            if auxposition <= 3 then
                row_fin = row_fin .. 'style="background:' .. cs[tostring(auxposition)]
            end
        end
        if auxpoint then
            if num_teams > 1 or auxposition <= 3 then
                row_fin = row_fin .. ' | '
            else
                row_fin = row_fin .. '! '
            end
            row_fin = row_fin .. auxpoint .. '\n'
        end
        row_fin = row_fin .. '|-\n'
        local row = row_def .. row_results[1] .. row_fin
        for t=2, #row_results do
            row = row .. row_results[t] .. '|-\n'
        end
        return row
    end
    ---- wikitable creating function
    local function convey(championship, races, subraces, drivers, rookies, teams, stints, manufacturers, results, points, auxillary_points, positions, auxillary_positions, pps, sps, cs, ds, sources)
        local pos_column, comp_column, team_column, man_column, points_column, aux_column = args['position'] or 'Pos', args['competitor'] or 'Driver', args['team'] or 'Team', args['manufacturer'] or 'Manufacturer', args['point'] or 'Points', args['auxchampionship'] or ''
        local def = '<div style="overflow-x: auto;">\n{| class="wikitable" style="font-size: 85%; white-space: nowrap; text-align: center; border: 1px solid #A2A9B1;"\n|-\n'
        local header = '! ' .. pos_column .. '\n! style="border: 1px solid #A2A9B1; position: sticky; left: 0; background-clip: padding-box; color: inherit;" | ' .. comp_column .. '\n'
        local data = ''
        local rows = {}
        local rowbreak = '|-\n'
        local fin = '|}\n</div>'
        local num_sraces = 0
        local num_columns = 0
        for _, s in pairs(subraces) do
            num_sraces = num_sraces + #s
        end
        if num_sraces > 0 then
            header = '! rowspan="2" | ' .. pos_column .. '\n! style="border: 1px solid #A2A9B1; position: sticky; left: 0; background-clip: padding-box; color: inherit;" rowspan="2" | ' .. comp_column .. '\n'
        end
        if #teams > 0 then
            if num_sraces > 0 then
                header = header .. '! rowspan="2" | ' .. team_column .. '\n'
            else
                header = header .. '! ' .. team_column .. '\n'
            end
        end
        if #manufacturers > 0 then
            header = header .. '! ' .. man_column .. '\n'
        end
        for r=1, #races do
            if subraces[r] then
                header = header .. '! colspan="' .. #subraces[r] .. '" | ' .. races[r] .. '\n'
            elseif num_sraces > 0 then
                header = header .. '! rowspan="2" | ' .. races[r] .. '\n'
            else
                header = header .. '! ' .. races[r] .. '\n'
            end
        end
        if num_sraces > 0 then
            header = header .. '! style="border: 1px solid #A2A9B1; position: sticky; right: 0; background-clip: padding-box; color: inherit;" rowspan="2" | ' .. points_column .. '\n'
        else
            header = header .. '! style="border: 1px solid #A2A9B1; position: sticky; right: 0; background-clip: padding-box; color: inherit;" | ' .. points_column .. '\n'
        end
        if #auxillary_positions > 0 then
            if num_sraces > 0 then
                header = header .. '! rowspan="2" | ' .. aux_column .. '\n'
            else
                header = header .. '! ' .. aux_column .. '\n'
            end
        end
        header = header .. rowbreak
        for r=1, #races do
            if subraces[r] then
                for _, sr in ipairs(subraces[r]) do
                    header = header .. '! ' .. sr .. '\n'
                end
            end
        end
        if num_sraces > 0 then
            header = header .. rowbreak
        end
        for pos, ids in ipairs(positions) do
            local row, extract
            for _, i in ipairs(ids) do
                local id
                if type(i) == 'table' then
                    extract = i[1]
                    id = i
                else
                    extract = i
                    id = {i}
                end
                if championship == 'F1' or championship == 'WRC' then
                    row = combine(championship, id, drivers, {}, {}, {}, {}, results[extract], points[extract], nil, pos, nil, nil, pps, sps, cs, ds)
                elseif championship == 'INDYCAR' then
                    local clinch = clinched(championship, id, rookies, results, points, 54, 0)
                    row = combine(championship, id, drivers, rookies, {}, {}, {}, results[extract], points[extract], nil, pos, nil, clinch, pps, sps, cs, ds)
                elseif championship == 'WEC' or championship == 'GTWCE' then
                    row = combine(championship, id, drivers, {}, teams, stints, {}, results[extract], points[extract], nil, pos, nil, nil, pps, sps, cs, ds)
                elseif championship == 'IMSA' then
                    row = combine(championship, id, drivers, {}, {}, {}, {}, results[extract], points[extract], auxillary_points[extract], pos, index(auxillary_positions, extract), nil, pps, sps, cs, ds)
                elseif championship == 'MOTOGP' then
                    row = combine(championship, id, drivers, rookies, teams, stints, manufacturers, results[extract], points[extract], nil, pos, nil, nil, pps, sps, cs, ds)
                elseif championship == 'FE' then
                    row = combine(championship, id, drivers, {}, {}, {}, {}, results[extract], points[extract], nil, pos, nil, nil, pps, sps, cs, ds)
                else
                    row = combine(nil, id, drivers, rookies, teams, stints, manufacturers, results[extract], points[extract], nil, pos, nil, nil, pps, sps, cs, ds)
                end
                table.insert(rows, row)
            end
        end
        for _, row in ipairs(rows) do
            data = data .. row
        end
        for _ in header:gmatch('!') do
            num_columns = num_columns + 1
        end
        if sources then
            fin = '! colspan="' .. num_columns .. '" | Sources:' .. sources .. '\n' .. rowbreak .. fin
        end
        local wikitable = ''
        wikitable = wikitable .. def .. header .. data .. header .. fin
        return wikitable
    end
    -- sorting keys
    local keys = {}
    for key, _ in pairs(args) do
        table.insert(keys, key)
    end
    table.sort(keys, alphanum_asc)
    -- variables
    local championship = string.upper(args['championship'])
    local separator = args['separator'] or ','
    local auxseparator = args['auxseparator'] or '/'
    local teamseparator = args['teamseparator'] or ':'
    local sources = args['sources']
    local races, rlengths = {}, {}
    local subraces = {}
    local num_races, curr_race = 0, 1
    local drivers = {}
    local rookies = {}
    local teams = {}
    local stints = {}
    local manufacturers = {}
    local id = 0
    local results, auxresults = {}, {}
    -- THE FOR LOOP
    for _, key in ipairs(keys) do
        if key:match('^d%d+$') then
            id = tonumber(key:sub(2))
            drivers[id] = args[key]
            teams[id] = {''}
            stints[id] = {}
            manufacturers[id] = {''}
            results[id] = {}
            auxresults[id] = {}
            curr_race = 1
        end
        if key:match('^d' .. id .. 'r%d+$') then
            if not key:match('^d' .. id .. 'r' .. curr_race) then
                curr_race = tonumber(key:sub(3+#tostring(id)))
            end
            local result, auxresult = args[key]
            if result:find(auxseparator) then
                local stind, endig = result:find(auxseparator)
                auxresult = result:sub(endig+1)
                result = result:sub(1, stind-1)
            end
            if result:find(separator) then
                results[id][curr_race] = {}
                for r in result:gmatch('%P+') do
                    table.insert(results[id][curr_race], r)
                end
            else
                results[id][curr_race] = result
            end
            if auxresult then
                for a in auxresult:gmatch('%P+') do
                    table.insert(auxresults[id], a)
                end
            end
            curr_race = curr_race + 1
        end
        if key:match('^d' .. id .. 'R$') then
            rookies[id] = id
        end
        if key:match('^d' .. id .. 'm%d+$') then
            local mid = tonumber(key:sub(3+#tostring(id)))
            manufacturers[id][mid] = args[key]
        end
        if key:match('^d' .. id .. 't%d+$') then
            local tid = tonumber(key:sub(3+#tostring(id)))
            local team, stint = args[key]
            if team:find(teamseparator) then
                local scs, sce = team:find(teamseparator)
                stint = team:sub(sce+1)
                team = team:sub(1, scs-1)
            end
            teams[id][tid] = team
            if stint then
                stints[id][tid] = {}
                for r in stint:gmatch('%d+') do
                    table.insert(stints[id][tid], r)
                end
            end
        end
        if key:match('^r%d+$') then
            num_races = num_races + 1
            races[num_races] = args[key]
        end
        if key:match('^r' .. num_races .. 's%d+$') then
            if not subraces[num_races] then
                subraces[num_races] = {}
            end
            table.insert(subraces[num_races], args[key])
        end
        if key:match('^rl%d+$') then
            local rlid = tonumber(key:sub(3))
            rlengths[rlid] = args[key]
        end
    end
    -- unentered races
    for d=1, #drivers do
        for u=1, num_races do
            if not results[d][u] then
                results[d][u] = ' '
            end
        end
    end
    -- championships
    ---- F1
    local function F1(championship, races, drivers, results, sources)
        -- points systems
        ---- current points system
        local F1_points_system = {['1']=25, ['2']=18, ['3']=15, ['4']=12, ['5']=10, ['6']=8, ['7']=6, ['8']=4, ['9']=2, ['10']=1, ['11']=0, ['12']=0, ['13']=0, ['14']=0, ['15']=0, ['16']=0, ['17']=0, ['18']=0, ['19']=0, ['20']=0, ['21']=0, ['22']=0, ['23']=0, ['24']=0, ['25']=0, ['26']=0, NC=0, Ret=0, DNQ=0, DSQ=0, DNS=0, C=0, DNP=0, EX=0, DNA=0, WD=0, [' ']=0}
        local F1_sprint_points_system = {['1']=8, ['2']=7, ['3']=6, ['4']=5, ['5']=4, ['6']=3, ['7']=2, ['8']=1, P=0, F=0}
        local F1_color_system = {['1']=colors['gold'], ['2']=colors['silver'], ['3']=colors['bronze'], ['4']=colors['green'], ['5']=colors['green'], ['6']=colors['green'], ['7']=colors['green'], ['8']=colors['green'], ['9']=colors['green'], ['10']=colors['green'], ['11']=colors['dark_blue'], ['12']=colors['dark_blue'], ['13']=colors['dark_blue'], ['14']=colors['dark_blue'], ['15']=colors['dark_blue'], ['16']=colors['dark_blue'], ['17']=colors['dark_blue'], ['18']=colors['dark_blue'], ['19']=colors['dark_blue'], ['20']=colors['dark_blue'], ['21']=colors['dark_blue'], ['22']=colors['dark_blue'], ['23']=colors['dark_blue'], ['24']=colors['dark_blue'], ['25']=colors['dark_blue'], ['26']=colors['dark_blue'], NC=colors['dark_blue'], Ret=colors['purple'], DNQ=colors['red'], DSQ=colors['black'], DNS=colors['white'], C=colors['white'], DNP=colors['blank'], EX=colors['blank'], DNA=colors['blank'], WD=colors['blank'], [' ']=colors['empty']}
        local F1_display_system = {['1']='1', ['2']='2', ['3']='3', ['4']='4', ['5']='5', ['6']='6', ['7']='7', ['8']='8', ['9']='9', ['10']='10', ['11']='11', ['12']='12', ['13']='13', ['14']='14', ['15']='15', ['16']='16', ['17']='17', ['18']='18', ['19']='19', ['20']='20', ['21']='21', ['22']='22', ['23']='23', ['24']='24', ['25']='25', ['26']='26', NC='NC', Ret='Ret', DNQ='DNQ', DSQ='DSQ', DNS='DNS', C='C', DNP='DNP', EX='EX', DNA='DNA', WD='WD', [' ']='', P='P', F='F'}
        local F1_classification = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', 'NC', 'Ret', 'DNQ', 'DSQ', 'DNS', 'C', 'DNP', 'EX', 'DNA', 'WD', ' '}
        -- points
        local points = calculate(championship, {}, results, F1_points_system, F1_sprint_points_system)
        -- positions
        local positions = classify(championship, results, points, F1_classification)
        -- table
        local wikitable = convey(championship, races, {}, drivers, {}, {}, {}, {}, results, points, {}, positions, {}, F1_points_system, F1_sprint_points_system, F1_color_system, F1_display_system, sources)
        return wikitable
    end
    ---- INDYCAR
    local function INDYCAR(championship, races, drivers, rookies, results, sources)
        -- points system
        ---- current points system
        local IC_points_system = {['1']=50, ['2']=40, ['3']=35, ['4']=32, ['5']=30, ['6']=28, ['7']=26, ['8']=24, ['9']=22, ['10']=20, ['11']=19, ['12']=18, ['13']=17, ['14']=16, ['15']=15, ['16']=14, ['17']=13, ['18']=12, ['19']=11, ['20']=10, ['21']=9, ['22']=8, ['23']=7, ['24']=6, ['25']=5, ['26']=5, ['27']=5, ['28']=5, ['29']=5, ['30']=5, ['31']=5, ['32']=5, ['33']=5, Ret=0, DNQ=0, Wth=0, DSQ=0, DNS=0, C=0, [' ']=0}
        local IC_inline_points_system = {['1']=12, ['2']=11, ['3']=10, ['4']=9, ['5']=8, ['6']=7, ['7']=6, ['8']=5, ['9']=4, ['10']=3, ['11']=2, ['12']=1, P=1, F=0, L=1, M=2, C=0}
        local IC_color_system = {['1']=colors['gold'], ['2']=colors['silver'], ['3']=colors['bronze'], ['4']=colors['green'], ['5']=colors['green'], ['6']=colors['light_blue'], ['7']=colors['light_blue'], ['8']=colors['light_blue'], ['9']=colors['light_blue'], ['10']=colors['light_blue'], ['11']=colors['dark_blue'], ['12']=colors['dark_blue'], ['13']=colors['dark_blue'], ['14']=colors['dark_blue'], ['15']=colors['dark_blue'], ['16']=colors['dark_blue'], ['17']=colors['dark_blue'], ['18']=colors['dark_blue'], ['19']=colors['dark_blue'], ['20']=colors['dark_blue'], ['21']=colors['dark_blue'], ['22']=colors['dark_blue'], ['23']=colors['dark_blue'], ['24']=colors['dark_blue'], ['25']=colors['dark_blue'], ['26']=colors['dark_blue'], ['27']=colors['dark_blue'], ['28']=colors['dark_blue'], ['29']=colors['dark_blue'], ['30']=colors['dark_blue'], ['31']=colors['dark_blue'], ['32']=colors['dark_blue'], ['33']=colors['dark_blue'], Ret=colors['purple'], DNQ=colors['red'], Wth=colors['brown'], DSQ=colors['black'], DNS=colors['white'], C=colors['white'], [' ']=colors['empty']}
        local IC_display_system = {['1']='1', ['2']='2', ['3']='3', ['4']='4', ['5']='5', ['6']='6', ['7']='7', ['8']='8', ['9']='9', ['10']='10', ['11']='11', ['12']='12', ['13']='13', ['14']='14', ['15']='15', ['16']='16', ['17']='17', ['18']='18', ['19']='19', ['20']='20', ['21']='21', ['22']='22', ['23']='23', ['24']='24', ['25']='25', ['26']='26', ['27']='27', ['28']='28', ['29']='29', ['30']='30', ['31']='31', ['32']='32', ['33']='33', Ret='Ret', DNQ='DNQ', Wth='Wth', DSQ='DSQ', DNS='DNS', C='C', [' ']='', P="'''", F="''", L='L', M='*', c='c'}
        local IC_classification = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', 'Ret', 'DNQ', 'Wth', 'DSQ', 'DNS', 'C', ' '}
        -- points
        local points = calculate(championship, {}, results, IC_points_system, IC_inline_points_system)
        -- positions
        local positions = classify(championship, results, points, IC_classification)
        -- table
        local wikitable = convey(championship, races, {}, drivers, rookies, {}, {}, {}, results, points, {}, positions, {}, IC_points_system, IC_inline_points_system, IC_color_system, IC_display_system, sources)
        return wikitable
    end
    ---- WRC
    local function WRC(championship, races, drivers, results, sources)
        -- points system
        ---- current points system
        local WRC_points_system = {['1']=25, ['2']=17, ['3']=15, ['4']=12, ['5']=10, ['6']=8, ['7']=6, ['8']=4, ['9']=2, ['10']=1, ['11']=0, ['12']=0, ['13']=0, ['14']=0, ['15']=0, ['16']=0, ['17']=0, ['18']=0, ['19']=0, ['20']=0, ['21']=0, ['22']=0, ['23']=0, ['24']=0, ['25']=0, ['26']=0, ['27']=0, ['28']=0, ['29']=0, ['30']=0, ['31']=0, ['32']=0, ['33']=0, ['34']=0, ['35']=0, ['36']=0, ['37']=0, ['38']=0, ['39']=0, ['40']=0, ['41']=0, ['42']=0, ['43']=0, ['44']=0, ['45']=0, ['46']=0, ['47']=0, ['48']=0, ['49']=0, ['50']=0, ['51']=0, ['52']=0, ['53']=0, ['54']=0, ['55']=0, ['56']=0, ['57']=0, ['58']=0, ['59']=0, ['60']=0, ['61']=0, ['62']=0, ['63']=0, ['64']=0, ['65']=0, ['66']=0, ['67']=0, ['68']=0, ['69']=0, ['70']=0, ['71']=0, ['72']=0, ['73']=0, ['74']=0, ['75']=0, ['76']=0, ['77']=0, ['78']=0, ['79']=0, ['80']=0, ['81']=0, ['82']=0, ['83']=0, ['84']=0, ['85']=0, ['86']=0, ['87']=0, ['88']=0, ['89']=0, ['90']=0, ['91']=0, ['92']=0, ['93']=0, ['94']=0, ['95']=0, ['96']=0, ['97']=0, ['98']=0, ['99']=0, ['100']=0, NC=0, Ret=0, EX=0, DSQ=0, DNS=0, C=0, WD=0, [' ']=0}
        local WRC_sunday_points_system = {['1']=5, ['2']=4, ['3']=3, ['4']=2, ['5']=1, ['6']=0, ['7']=0, ['8']=0, ['9']=0, ['10']=0, ['11']=0, ['12']=0, ['13']=0, ['14']=0, ['15']=0, ['16']=0, ['17']=0, ['18']=0, ['19']=0, ['20']=0, ['21']=0, ['22']=0, ['23']=0, ['24']=0, ['25']=0, ['26']=0, ['27']=0, ['28']=0, ['29']=0, ['30']=0, ['31']=0, ['32']=0, ['33']=0, ['34']=0, ['35']=0, ['36']=0, ['37']=0, ['38']=0, ['39']=0, ['40']=0, ['41']=0, ['42']=0, ['43']=0, ['44']=0, ['45']=0, ['46']=0, ['47']=0, ['48']=0, ['49']=0, ['50']=0, ['51']=0, ['52']=0, ['53']=0, ['54']=0, ['55']=0, ['56']=0, ['57']=0, ['58']=0, ['59']=0, ['60']=0, ['61']=0, ['62']=0, ['63']=0, ['64']=0, ['65']=0, ['66']=0, ['67']=0, ['68']=0, ['69']=0, ['70']=0, ['71']=0, ['72']=0, ['73']=0, ['74']=0, ['75']=0, ['76']=0, ['77']=0, ['78']=0, ['79']=0, ['80']=0, ['81']=0, ['82']=0, ['83']=0, ['84']=0, ['85']=0, ['86']=0, ['87']=0, ['88']=0, ['89']=0, ['90']=0, ['91']=0, ['92']=0, ['93']=0, ['94']=0, ['95']=0, ['96']=0, ['97']=0, ['98']=0, ['99']=0, ['100']=0}
        local WRC_color_system = {['1']=colors['gold'], ['2']=colors['silver'], ['3']=colors['bronze'], ['4']=colors['green'], ['5']=colors['green'], ['6']=colors['green'], ['7']=colors['green'], ['8']=colors['green'], ['9']=colors['green'], ['10']=colors['green'], ['11']=colors['dark_blue'], ['12']=colors['dark_blue'], ['13']=colors['dark_blue'], ['14']=colors['dark_blue'], ['15']=colors['dark_blue'], ['16']=colors['dark_blue'], ['17']=colors['dark_blue'], ['18']=colors['dark_blue'], ['19']=colors['dark_blue'], ['20']=colors['dark_blue'], ['21']=colors['dark_blue'], ['22']=colors['dark_blue'], ['23']=colors['dark_blue'], ['24']=colors['dark_blue'], ['25']=colors['dark_blue'], ['26']=colors['dark_blue'], ['27']=colors['dark_blue'], ['28']=colors['dark_blue'], ['29']=colors['dark_blue'], ['30']=colors['dark_blue'], ['31']=colors['dark_blue'], ['32']=colors['dark_blue'], ['33']=colors['dark_blue'], ['34']=colors['dark_blue'], ['35']=colors['dark_blue'], ['36']=colors['dark_blue'], ['37']=colors['dark_blue'], ['38']=colors['dark_blue'], ['39']=colors['dark_blue'], ['40']=colors['dark_blue'], ['41']=colors['dark_blue'], ['42']=colors['dark_blue'], ['43']=colors['dark_blue'], ['44']=colors['dark_blue'], ['45']=colors['dark_blue'], ['46']=colors['dark_blue'], ['47']=colors['dark_blue'], ['48']=colors['dark_blue'], ['49']=colors['dark_blue'], ['50']=colors['dark_blue'], ['51']=colors['dark_blue'], ['52']=colors['dark_blue'], ['53']=colors['dark_blue'], ['54']=colors['dark_blue'], ['55']=colors['dark_blue'], ['56']=colors['dark_blue'], ['57']=colors['dark_blue'], ['58']=colors['dark_blue'], ['59']=colors['dark_blue'], ['60']=colors['dark_blue'], ['61']=colors['dark_blue'], ['62']=colors['dark_blue'], ['63']=colors['dark_blue'], ['64']=colors['dark_blue'], ['65']=colors['dark_blue'], ['66']=colors['dark_blue'], ['67']=colors['dark_blue'], ['68']=colors['dark_blue'], ['69']=colors['dark_blue'], ['70']=colors['dark_blue'], ['71']=colors['dark_blue'], ['72']=colors['dark_blue'], ['73']=colors['dark_blue'], ['74']=colors['dark_blue'], ['75']=colors['dark_blue'], ['76']=colors['dark_blue'], ['77']=colors['dark_blue'], ['78']=colors['dark_blue'], ['79']=colors['dark_blue'], ['80']=colors['dark_blue'], ['81']=colors['dark_blue'], ['82']=colors['dark_blue'], ['83']=colors['dark_blue'], ['84']=colors['dark_blue'], ['85']=colors['dark_blue'], ['86']=colors['dark_blue'], ['87']=colors['dark_blue'], ['88']=colors['dark_blue'], ['89']=colors['dark_blue'], ['90']=colors['dark_blue'], ['91']=colors['dark_blue'], ['92']=colors['dark_blue'], ['93']=colors['dark_blue'], ['94']=colors['dark_blue'], ['95']=colors['dark_blue'], ['96']=colors['dark_blue'], ['97']=colors['dark_blue'], ['98']=colors['dark_blue'], ['99']=colors['dark_blue'], ['100']=colors['dark_blue'], NC=colors['dark_blue'], Ret=colors['purple'], EX=colors['black'], DSQ=colors['black'], DNS=colors['white'], C=colors['white'], WD=colors['blank'], [' ']=colors['empty']}
        local WRC_display_system = {['1']='1', ['2']='2', ['3']='3', ['4']='4', ['5']='5', ['6']='6', ['7']='7', ['8']='8', ['9']='9', ['10']='10', ['11']='11', ['12']='12', ['13']='13', ['14']='14', ['15']='15', ['16']='16', ['17']='17', ['18']='18', ['19']='19', ['20']='20', ['21']='21', ['22']='22', ['23']='23', ['24']='24', ['25']='25', ['26']='26', ['27']='27', ['28']='28', ['29']='29', ['30']='30', ['31']='31', ['32']='32', ['33']='33', ['34']='34', ['35']='35', ['36']='36', ['37']='37', ['38']='38', ['39']='39', ['40']='40', ['41']='41', ['42']='42', ['43']='43', ['44']='44', ['45']='45', ['46']='46', ['47']='47', ['48']='48', ['49']='49', ['50']='50', ['51']='51', ['52']='52', ['53']='53', ['54']='54', ['55']='55', ['56']='56', ['57']='57', ['58']='58', ['59']='59', ['60']='60', ['61']='61', ['62']='62', ['63']='63', ['64']='64', ['65']='65', ['66']='66', ['67']='67', ['68']='68', ['69']='69', ['70']='70', ['71']='71', ['72']='72', ['73']='73', ['74']='74', ['75']='75', ['76']='76', ['77']='77', ['78']='78', ['79']='79', ['80']='80', ['81']='81', ['82']='82', ['83']='83', ['84']='84', ['85']='85', ['86']='86', ['87']='87', ['88']='88', ['89']='89', ['90']='90', ['91']='91', ['92']='92', ['93']='93', ['94']='94', ['95']='95', ['96']='96', ['97']='97', ['98']='98', ['99']='99', ['100']='100', NC='NC', Ret='Ret', EX='EX', DSQ='DSQ', DNS='DNS', C='C', WD='WD', [' ']=''}
        local WRC_classification = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', 'NC', 'Ret', 'EX', 'DSQ', 'DNS', 'C', 'WD', ' '}
        -- points
        local points = calculate(championship, {}, results, WRC_points_system, WRC_sunday_points_system)
        -- positions
        local positions = classify(championship, results, points, WRC_classification)
        -- table
        local wikitable = convey(championship, races, {}, drivers, {}, {}, {}, {}, results, points, {}, positions, {}, WRC_points_system, WRC_sunday_points_system, WRC_color_system, WRC_display_system, sources)
        return wikitable
    end
    ---- WEC
    local function WEC(championship, races, rlengths, drivers, teams, stints, results, sources)
        -- points system
        ---- current points system
        local WEC_points_system = {['1']={['6']=25, ['8']=38, ['10']=38, ['24']=50}, ['2']={['6']=18, ['8']=27, ['10']=27, ['24']=36}, ['3']={['6']=15, ['8']=23, ['10']=23, ['24']=30}, ['4']={['6']=12, ['8']=18, ['10']=18, ['24']=24}, ['5']={['6']=10, ['8']=15, ['10']=15, ['24']=20}, ['6']={['6']=8, ['8']=12, ['10']=12, ['24']=16}, ['7']={['6']=6, ['8']=9, ['10']=9, ['24']=12}, ['8']={['6']=4, ['8']=6, ['10']=6, ['24']=8}, ['9']={['6']=2, ['8']=3, ['10']=3, ['24']=4}, ['10']={['6']=1, ['8']=2, ['10']=2, ['24']=1}, ['11']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['12']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['13']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['14']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['15']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['16']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['17']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['18']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['19']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['20']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['21']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['22']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['23']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['24']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['25']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['26']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['27']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['28']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['29']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['30']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['31']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['32']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['33']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['34']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['35']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['36']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['37']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['38']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['39']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, ['40']={['6']=0, ['8']=0, ['10']=0, ['24']=0}, NC={['6']=0, ['8']=0, ['10']=0, ['24']=0}, Ret={['6']=0, ['8']=0, ['10']=0, ['24']=0}, DNQ={['6']=0, ['8']=0, ['10']=0, ['24']=0}, DNPQ={['6']=0, ['8']=0, ['10']=0, ['24']=0}, DSQ={['6']=0, ['8']=0, ['10']=0, ['24']=0}, DNS={['6']=0, ['8']=0, ['10']=0, ['24']=0}, WD={['6']=0, ['8']=0, ['10']=0, ['24']=0}, C={['6']=0, ['8']=0, ['10']=0, ['24']=0}, DNP={['6']=0, ['8']=0, ['10']=0, ['24']=0}, DNA={['6']=0, ['8']=0, ['10']=0, ['24']=0}, EX={['6']=0, ['8']=0, ['10']=0, ['24']=0}, [' ']={['6']=0, ['8']=0, ['10']=0, ['24']=0}}
        local WEC_extra_points_system = {P=1, F=0}
        local WEC_color_system = {['1']=colors['gold'], ['2']=colors['silver'], ['3']=colors['bronze'], ['4']=colors['green'], ['5']=colors['green'], ['6']=colors['green'], ['7']=colors['green'], ['8']=colors['green'], ['9']=colors['green'], ['10']=colors['green'], ['11']=colors['dark_blue'], ['12']=colors['dark_blue'], ['13']=colors['dark_blue'], ['14']=colors['dark_blue'], ['15']=colors['dark_blue'], ['16']=colors['dark_blue'], ['17']=colors['dark_blue'], ['18']=colors['dark_blue'], ['19']=colors['dark_blue'], ['20']=colors['dark_blue'], ['21']=colors['dark_blue'], ['22']=colors['dark_blue'], ['23']=colors['dark_blue'], ['24']=colors['dark_blue'], ['25']=colors['dark_blue'], ['26']=colors['dark_blue'], ['27']=colors['dark_blue'], ['28']=colors['dark_blue'], ['29']=colors['dark_blue'], ['30']=colors['dark_blue'], ['31']=colors['dark_blue'], ['32']=colors['dark_blue'], ['33']=colors['dark_blue'], ['34']=colors['dark_blue'], ['35']=colors['dark_blue'], ['36']=colors['dark_blue'], ['37']=colors['dark_blue'], ['38']=colors['dark_blue'], ['39']=colors['dark_blue'], ['40']=colors['dark_blue'], NC=colors['dark_blue'], Ret=colors['purple'], DNQ=colors['red'], DNPQ=colors['red'], DSQ=colors['black'], DNS=colors['white'], WD=colors['white'], C=colors['white'], DNP=colors['blank'], DNA=colors['blank'], EX=colors['blank'], [' ']=colors['empty']}
        local WEC_display_system = {['1']='1', ['2']='2', ['3']='3', ['4']='4', ['5']='5', ['6']='6', ['7']='7', ['8']='8', ['9']='9', ['10']='10', ['11']='11', ['12']='12', ['13']='13', ['14']='14', ['15']='15', ['16']='16', ['17']='17', ['18']='18', ['19']='19', ['20']='20', ['21']='21', ['22']='22', ['23']='23', ['24']='24', ['25']='25', ['26']='26', ['27']='27', ['28']='28', ['29']='29', ['30']='30', ['31']='31', ['32']='32', ['33']='33', ['34']='34', ['35']='35', ['36']='36', ['37']='37', ['38']='38', ['39']='39', ['40']='40', NC='NC', Ret='Ret', DNQ='DNQ', DNPQ='DNPQ', DSQ='DSQ', DNS='DNS', WD='WD', C='C', DNP='DNP', DNA='DNA', EX='EX', [' ']='', P="'''", F="''"}
        local WEC_classification = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', 'NC', 'Ret', 'DNQ', 'DNPQ', 'DSQ', 'DNS', 'WD', 'C', 'DNP', 'DNA', 'EX', ' '}
        -- points
        local points = calculate(championship, rlengths, results, WEC_points_system, WEC_extra_points_system)
        -- positions
        local positions = classify(championship, results, points, WEC_classification)
        -- table
        local wikitable = convey(championship, races, {}, drivers, {}, teams, stints, {}, results, points, {}, positions, {}, WEC_points_system, WEC_extra_points_system, WEC_color_system, WEC_display_system, sources)
        return wikitable
    end
    ---- IMSA
    local function IMSA(championship, races, drivers, results, auxresults, sources)
        -- points system
        ---- current points system
        local IMSA_points_system = {['1']=350, ['2']=320, ['3']=300, ['4']=280, ['5']=260, ['6']=250, ['7']=240, ['8']=230, ['9']=220, ['10']=210, ['11']=200, ['12']=190, ['13']=180, ['14']=170, ['15']=160, ['16']=150, ['17']=140, ['18']=130, ['19']=120, ['20']=110, ['21']=100, ['22']=90, ['23']=80, ['24']=70, ['25']=60, ['26']=50, ['27']=40, ['28']=30, ['29']=20, ['30']=10, ['31']=10, ['32']=10, ['33']=10, ['34']=10, ['35']=10, ['36']=10, ['37']=10, ['38']=10, ['39']=10, ['40']=10, ['41']=10, ['42']=10, ['43']=10, ['44']=10, ['45']=10, ['46']=10, ['47']=10, ['48']=10, ['49']=10, ['50']=10, ['51']=10, ['52']=10, ['53']=10, ['54']=10, ['55']=10, ['56']=10, ['57']=10, ['58']=10, ['59']=10, ['60']=10, ['61']=10, NC=0, Ret=0, DNQ=0, DNPQ=0, DSQ=0, DNS=0, WD=0, C=0, DNP=0, DNA=0, EX=0, [' ']=0}
        local IMSA_qualifying_points_system = {P=35, ['2']=32, ['3']=30, ['4']=28, ['5']=26, ['6']=25, ['7']=24, ['8']=23, ['9']=22, ['10']=21, ['11']=20, ['12']=19, ['13']=18, ['14']=17, ['15']=16, ['16']=15, ['17']=14, ['18']=13, ['19']=12, ['20']=11, ['21']=10, ['22']=9, ['23']=8, ['24']=7, ['25']=6, ['26']=5, ['27']=4, ['28']=3, ['29']=2, ['30']=1, ['31']=1, ['32']=1, ['33']=1, ['34']=1, ['35']=1, ['36']=1, ['37']=1, ['38']=1, ['39']=1, ['40']=1, ['41']=1, ['42']=1, ['43']=1, ['44']=1, ['45']=1, ['46']=1, ['47']=1, ['48']=1, ['49']=1, ['50']=1, ['51']=1, ['52']=1, ['53']=1, ['54']=1, ['55']=1, ['56']=1, ['57']=1, ['58']=1, ['59']=1, ['60']=1, ['61']=1, F=0, NC=0, Ret=0, DNQ=0, DNPQ=0, DSQ=0, DNS=0, WD=0, C=0, DNP=0, DNA=0, EX=0, [' ']=0}
        local IMSA_MEC_points_system = {['1']=5, ['2']=4, ['3']=3, ['4']=2, ['5']=2, ['6']=2, ['7']=2, ['8']=2, ['9']=2, ['10']=2, ['11']=2, ['12']=2, ['13']=2, ['14']=2, ['15']=2, ['16']=2, ['17']=2, ['18']=2, ['19']=2, ['20']=2, ['21']=2, ['22']=2, ['23']=2, ['24']=2, ['25']=2, ['26']=2, ['27']=2, ['28']=2, ['29']=2, ['30']=2, ['31']=2, ['32']=2, ['33']=2, ['34']=2, ['35']=2, ['36']=2, ['37']=2, ['38']=2, ['39']=2, ['40']=2, ['41']=2, ['42']=2, ['43']=2, ['44']=2, ['45']=2, ['46']=2, ['47']=2, ['48']=2, ['49']=2, ['50']=2, ['51']=2, ['52']=2, ['53']=2, ['54']=2, ['55']=2, ['56']=2, ['57']=2, ['58']=2, ['59']=2, ['60']=2, ['61']=2, NC=0, Ret=0, DNQ=0, DNPQ=0, DSQ=0, DNS=0, WD=0, C=0, DNP=0, DNA=0, EX=0, [' ']=0}
        local IMSA_color_system = {['1']=colors['gold'], ['2']=colors['silver'], ['3']=colors['bronze'], ['4']=colors['green'], ['5']=colors['green'], ['6']=colors['green'], ['7']=colors['green'], ['8']=colors['green'], ['9']=colors['green'], ['10']=colors['green'], ['11']=colors['green'], ['12']=colors['green'], ['13']=colors['green'], ['14']=colors['green'], ['15']=colors['green'], ['16']=colors['green'], ['17']=colors['green'], ['18']=colors['green'], ['19']=colors['green'], ['20']=colors['green'], ['21']=colors['green'], ['22']=colors['green'], ['23']=colors['green'], ['24']=colors['green'], ['25']=colors['green'], ['26']=colors['green'], ['27']=colors['green'], ['28']=colors['green'], ['29']=colors['green'], ['30']=colors['green'], ['31']=colors['green'], ['32']=colors['green'], ['33']=colors['green'], ['34']=colors['green'], ['35']=colors['green'], ['36']=colors['green'], ['37']=colors['green'], ['38']=colors['green'], ['39']=colors['green'], ['40']=colors['green'], ['41']=colors['green'], ['42']=colors['green'], ['43']=colors['green'], ['44']=colors['green'], ['45']=colors['green'], ['46']=colors['green'], ['47']=colors['green'], ['48']=colors['green'], ['49']=colors['green'], ['50']=colors['green'], ['51']=colors['green'], ['52']=colors['green'], ['53']=colors['green'], ['54']=colors['green'], ['55']=colors['green'], ['56']=colors['green'], ['57']=colors['green'], ['58']=colors['green'], ['59']=colors['green'], ['60']=colors['green'], ['61']=colors['green'], NC=colors['dark_blue'], Ret=colors['purple'], DNQ=colors['red'], DNPQ=colors['red'], DSQ=colors['black'], DNS=colors['white'], WD=colors['white'], C=colors['white'], DNP=colors['blank'], DNA=colors['blank'], EX=colors['blank'], [' ']=colors['empty']}
        local IMSA_display_system = {['1']='1', ['2']='2', ['3']='3', ['4']='4', ['5']='5', ['6']='6', ['7']='7', ['8']='8', ['9']='9', ['10']='10', ['11']='11', ['12']='12', ['13']='13', ['14']='14', ['15']='15', ['16']='16', ['17']='17', ['18']='18', ['19']='19', ['20']='20', ['21']='21', ['22']='22', ['23']='23', ['24']='24', ['25']='25', ['26']='26', ['27']='27', ['28']='28', ['29']='29', ['30']='30', ['31']='31', ['32']='32', ['33']='33', ['34']='34', ['35']='35', ['36']='36', ['37']='37', ['38']='38', ['39']='39', ['40']='40', ['41']='41', ['42']='42', ['43']='43', ['44']='44', ['45']='45', ['46']='46', ['47']='47', ['48']='48', ['49']='49', ['50']='50', ['51']='51', ['52']='52', ['53']='53', ['54']='54', ['55']='55', ['56']='56', ['57']='57', ['58']='58', ['59']='59', ['60']='60', ['61']='61', NC='NC', Ret='Ret', DNQ='DNQ', DNPQ='DNPQ', DSQ='DSQ', DNS='DNS', WD='WD', C='C', DNP='DNP', DNA='DNA', EX='EX', [' ']='', P="'''", F="''"}
        local IMSA_classification = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', 'NC', 'Ret', 'DNQ', 'DNPQ', 'DSQ', 'DNS', 'WD', 'C', 'DNP', 'DNA', 'EX', ' '}
        -- points
        local points = calculate(championship, {}, results, IMSA_points_system, IMSA_qualifying_points_system)
        local MEC_points = calculate('MEC', {}, auxresults, IMSA_MEC_points_system, IMSA_MEC_points_system)
        -- positions
        local positions = classify(championship, results, points, IMSA_classification)
        local MEC_positions = classify('MEC', auxresults, MEC_points, IMSA_classification)
        -- table
        local wikitable = convey(championship, races, subraces, drivers, {}, {}, {}, {}, results, points, MEC_points, positions, MEC_positions, IMSA_points_system, IMSA_qualifying_points_system, IMSA_color_system, IMSA_display_system, sources)
        return wikitable
    end
    ---- GTWC
    local function GTWCE(championship, races, rlengths, subraces, drivers, teams, stints, results, sources)
        -- points system
        ---- current points system
        local GTWCE_points_system = {['1']={['1']=16.5, ['3']=25, ['6']=33, ['12']=12, ['24']=25}, ['2']={['1']=12, ['3']=18, ['6']=24, ['12']=9, ['24']=18}, ['3']={['1']=9.5, ['3']=15, ['6']=19, ['12']=7, ['24']=15}, ['4']={['1']=7.5, ['3']=12, ['6']=15, ['12']=6, ['24']=12}, ['5']={['1']=6, ['3']=10, ['6']=12, ['12']=5, ['24']=10}, ['6']={['1']=4.5, ['3']=8, ['6']=9, ['12']=4, ['24']=8}, ['7']={['1']=3, ['3']=6, ['6']=6, ['12']=3, ['24']=6}, ['8']={['1']=2, ['3']=4, ['6']=4, ['12']=2, ['24']=4}, ['9']={['1']=1, ['3']=2, ['6']=2, ['12']=1, ['24']=2}, ['10']={['1']=0.5, ['3']=1, ['6']=1, ['12']=0, ['24']=1}, ['11']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['12']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['13']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['14']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['15']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['16']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['17']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['18']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['19']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['20']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['21']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['22']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['23']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['24']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['25']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['26']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['27']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['28']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['29']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['30']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['31']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['32']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['33']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['34']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['35']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['36']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['37']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['38']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['39']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['40']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['41']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['42']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['43']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['44']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['45']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['46']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['47']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['48']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['49']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['50']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['51']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['52']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['53']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['54']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['55']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['56']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['57']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['58']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['59']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['60']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['61']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['62']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['63']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['64']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['65']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['66']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['67']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['68']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['69']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['70']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['71']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['72']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['73']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['74']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['75']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, ['76']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, NC={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, Ret={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, DSQ={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, EX={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, DNS={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, C={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, WD={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}, [' ']={['1']=0, ['3']=0, ['6']=0, ['12']=0, ['24']=0}}
        local GTWCE_extra_points_system = {P=1, F=0}
        local GTWCE_color_system = {['1']=colors['gold'], ['2']=colors['silver'], ['3']=colors['bronze'], ['4']=colors['green'], ['5']=colors['green'], ['6']=colors['green'], ['7']=colors['green'], ['8']=colors['green'], ['9']=colors['green'], ['10']=colors['green'], ['11']=colors['dark_blue'], ['12']=colors['dark_blue'], ['13']=colors['dark_blue'], ['14']=colors['dark_blue'], ['15']=colors['dark_blue'], ['16']=colors['dark_blue'], ['17']=colors['dark_blue'], ['18']=colors['dark_blue'], ['19']=colors['dark_blue'], ['20']=colors['dark_blue'], ['21']=colors['dark_blue'], ['22']=colors['dark_blue'], ['23']=colors['dark_blue'], ['24']=colors['dark_blue'], ['25']=colors['dark_blue'], ['26']=colors['dark_blue'], ['27']=colors['dark_blue'], ['28']=colors['dark_blue'], ['29']=colors['dark_blue'], ['30']=colors['dark_blue'], ['31']=colors['dark_blue'], ['32']=colors['dark_blue'], ['33']=colors['dark_blue'], ['34']=colors['dark_blue'], ['35']=colors['dark_blue'], ['36']=colors['dark_blue'], ['37']=colors['dark_blue'], ['38']=colors['dark_blue'], ['39']=colors['dark_blue'], ['40']=colors['dark_blue'], ['41']=colors['dark_blue'], ['42']=colors['dark_blue'], ['43']=colors['dark_blue'], ['44']=colors['dark_blue'], ['45']=colors['dark_blue'], ['46']=colors['dark_blue'], ['47']=colors['dark_blue'], ['48']=colors['dark_blue'], ['49']=colors['dark_blue'], ['50']=colors['dark_blue'], ['51']=colors['dark_blue'], ['52']=colors['dark_blue'], ['53']=colors['dark_blue'], ['54']=colors['dark_blue'], ['55']=colors['dark_blue'], ['56']=colors['dark_blue'], ['57']=colors['dark_blue'], ['58']=colors['dark_blue'], ['59']=colors['dark_blue'], ['60']=colors['dark_blue'], ['61']=colors['dark_blue'], ['62']=colors['dark_blue'], ['63']=colors['dark_blue'], ['64']=colors['dark_blue'], ['65']=colors['dark_blue'], ['66']=colors['dark_blue'], ['67']=colors['dark_blue'], ['68']=colors['dark_blue'], ['69']=colors['dark_blue'], ['70']=colors['dark_blue'], ['71']=colors['dark_blue'], ['72']=colors['dark_blue'], ['73']=colors['dark_blue'], ['74']=colors['dark_blue'], ['75']=colors['dark_blue'], ['76']=colors['dark_blue'], NC=colors['dark_blue'], Ret=colors['purple'], DSQ=colors['black'], EX=colors['black'], DNS=colors['white'], C=colors['white'], WD=colors['white'], [' ']=colors['empty']}
        local GTWCE_display_system = {['1']='1', ['2']='2', ['3']='3', ['4']='4', ['5']='5', ['6']='6', ['7']='7', ['8']='8', ['9']='9', ['10']='10', ['11']='11', ['12']='12', ['13']='13', ['14']='14', ['15']='15', ['16']='16', ['17']='17', ['18']='18', ['19']='19', ['20']='20', ['21']='21', ['22']='22', ['23']='23', ['24']='24', ['25']='25', ['26']='26', ['27']='27', ['28']='28', ['29']='29', ['30']='30', ['31']='31', ['32']='32', ['33']='33', ['34']='34', ['35']='35', ['36']='36', ['37']='37', ['38']='38', ['39']='39', ['40']='40', ['41']='41', ['42']='42', ['43']='43', ['44']='44', ['45']='45', ['46']='46', ['47']='47', ['48']='48', ['49']='49', ['50']='50', ['51']='51', ['52']='52', ['53']='53', ['54']='54', ['55']='55', ['56']='56', ['57']='57', ['58']='58', ['59']='59', ['60']='60', ['61']='61', ['62']='62', ['63']='63', ['64']='64', ['65']='65', ['66']='66', ['67']='67', ['68']='68', ['69']='69', ['70']='70', ['71']='71', ['72']='72', ['73']='73', ['74']='74', ['75']='75', ['76']='76', NC='NC', Ret='Ret', DSQ='DSQ', EX='EX', DNS='DNS', C='C', WD='WD', [' ']='', P='P', F='F'}
        local GTWCE_classification = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', 'NC', 'Ret', 'DSQ', 'EX', 'DNS', 'C', 'WD', ' '}
        -- points
        local points = calculate(championship, rlengths, results, GTWCE_points_system, GTWCE_extra_points_system)
        -- positions
        local positions = classify(championship, results, points, GTWCE_classification)
        -- table
        local wikitable = convey(championship, races, subraces, drivers, {}, teams, stints, {}, results, points, {}, positions, {}, GTWCE_points_system, GTWCE_extra_points_system, GTWCE_color_system, GTWCE_display_system, sources)
        return wikitable
    end        
    ---- MotoGP
    local function MOTOGP(championship, races, drivers, teams, stints, manufacturers, results, sources)
        -- points system
        ---- current points system
        local MOTOGP_points_system = {['1']=25, ['2']=20, ['3']=16, ['4']=13, ['5']=11, ['6']=10, ['7']=9, ['8']=8, ['9']=7, ['10']=6, ['11']=5, ['12']=4, ['13']=3, ['14']=2, ['15']=1, ['16']=0, ['17']=0, ['18']=0, ['19']=0, ['20']=0, ['21']=0, ['22']=0, ['23']=0, ['24']=0, ['25']=0, ['26']=0, ['27']=0, ['28']=0, ['29']=0, ['30']=0, NC=0, Ret=0, DNQ=0, DNPQ=0, DSQ=0, DNS=0, WD=0, DNP=0, DNA=0, EX=0, [' ']=0}
        local MOTOGP_sprint_points_system = {['1']=12, ['2']=9, ['3']=7, ['4']=6, ['5']=5, ['6']=4, ['7']=3, ['8']=2, ['9']=1, P=0, F=0}
        local MOTOGP_color_system = {['1']=colors['gold'], ['2']=colors['silver'], ['3']=colors['bronze'], ['4']=colors['green'], ['5']=colors['green'], ['6']=colors['green'], ['7']=colors['green'], ['8']=colors['green'], ['9']=colors['green'], ['10']=colors['green'], ['11']=colors['green'], ['12']=colors['green'], ['13']=colors['green'], ['14']=colors['green'], ['15']=colors['green'], ['16']=colors['dark_blue'], ['17']=colors['dark_blue'], ['18']=colors['dark_blue'], ['19']=colors['dark_blue'], ['20']=colors['dark_blue'], ['21']=colors['dark_blue'], ['22']=colors['dark_blue'], ['23']=colors['dark_blue'], ['24']=colors['dark_blue'], ['25']=colors['dark_blue'], ['26']=colors['dark_blue'], ['27']=colors['dark_blue'], ['28']=colors['dark_blue'], ['29']=colors['dark_blue'], ['30']=colors['dark_blue'], NC=colors['dark_blue'], Ret=colors['purple'], DNQ=colors['red'], DNPQ=colors['red'], DSQ=colors['black'], DNS=colors['white'], WD=colors['white'], C=colors['white'], DNP=colors['blank'], DNA=colors['blank'], EX=colors['blank'], [' ']=colors['empty']}
        local MOTOGP_display_system = {['1']='1', ['2']='2', ['3']='3', ['4']='4', ['5']='5', ['6']='6', ['7']='7', ['8']='8', ['9']='9', ['10']='10', ['11']='11', ['12']='12', ['13']='13', ['14']='14', ['15']='15', ['16']='16', ['17']='17', ['18']='18', ['19']='19', ['20']='20', ['21']='21', ['22']='22', ['23']='23', ['24']='24', ['25']='25', ['26']='26', ['27']='27', ['28']='28', ['29']='29', ['30']='30', NC='NC', Ret='Ret', DNQ='DNQ', DNPQ='DNPQ', DSQ='DSQ', DNS='DNS', WD='WD', C='C', DNP='DNP', DNA='DNA', EX='EX', [' ']=''}
        local MOTOGP_classification = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', 'NC', 'Ret', 'DNQ', 'DNPQ', 'DSQ', 'DNS', 'WD', 'C', 'DNP', 'DNA', 'EX', ' '}
        -- points
        local points = calculate(championship, {}, results, MOTOGP_points_system, MOTOGP_sprint_points_system)
        -- positions
        local positions = classify(championship, results, points, MOTOGP_classification)
        -- table
        local wikitable = convey(championship, races, {}, drivers, rookies, teams, stints, manufacturers, results, points, {}, positions, {}, MOTOGP_points_system, MOTOGP_sprint_points_system, MOTOGP_color_system, MOTOGP_display_system, sources)
        return wikitable
    end
    ---- FE
    local function FE(championship, races, subraces, drivers, results, sources)
        local FE_points_system = {['1']=25, ['2']=18, ['3']=15, ['4']=12, ['5']=10, ['6']=8, ['7']=6, ['8']=4, ['9']=2, ['10']=1, ['11']=0, ['12']=0, ['13']=0, ['14']=0, ['15']=0, ['16']=0, ['17']=0, ['18']=0, ['19']=0, ['20']=0, ['21']=0, ['22']=0, ['23']=0, ['24']=0, NC=0, Ret=0, DNQ=0, DNPQ=0, DSQ=0, DNS=0, WD=0, C=0, DNP=0, DNA=0, EX=0, [' ']=0}
        local FE_extra_points_system = {P=3, F=1}
        local FE_color_system = {['1']=colors['gold'], ['2']=colors['silver'], ['3']=colors['bronze'], ['4']=colors['green'], ['5']=colors['green'], ['6']=colors['green'], ['7']=colors['green'], ['8']=colors['green'], ['9']=colors['green'], ['10']=colors['green'], ['11']=colors['dark_blue'], ['12']=colors['dark_blue'], ['13']=colors['dark_blue'], ['14']=colors['dark_blue'], ['15']=colors['dark_blue'], ['16']=colors['dark_blue'], ['17']=colors['dark_blue'], ['18']=colors['dark_blue'], ['19']=colors['dark_blue'], ['20']=colors['dark_blue'], ['21']=colors['dark_blue'], ['22']=colors['dark_blue'], ['23']=colors['dark_blue'], ['24']=colors['dark_blue'], NC=colors['dark_blue'], Ret=colors['purple'], DNQ=colors['red'], DNPQ=colors['red'], DSQ=colors['black'], DNS=colors['white'], WD=colors['white'], C=colors['white'], DNP=colors['blank'], DNA=colors['blank'], EX=colors['blank'], [' ']=colors['empty']}
        local FE_display_system = {['1']='1', ['2']='2', ['3']='3', ['4']='4', ['5']='5', ['6']='6', ['7']='7', ['8']='8', ['9']='9', ['10']='10', ['11']='11', ['12']='12', ['13']='13', ['14']='14', ['15']='15', ['16']='16', ['17']='17', ['18']='18', ['19']='19', ['20']='20', ['21']='21', ['22']='22', ['23']='23', ['24']='24', NC='NC', Ret='Ret', DNQ='DNQ', DNPQ='DNPQ', DSQ='DSQ', DNS='DNS', WD='WD', C='C', DNP='DNP', DNA='DNA', EX='EX', [' ']='', P="'''", F="''"}
        local FE_classification = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', 'NC', 'Ret', 'DNQ', 'DNPQ', 'DSQ', 'DNS', 'WD', 'C', 'DNP', 'DNA', 'EX', ' '}
        -- points
        local points = calculate(championship, {}, results, FE_points_system, FE_extra_points_system)
        -- positions
        local positions = classify(championship, results, points, FE_classification)
        -- table
        local wikitable = convey(championship, races, subraces, drivers, {}, {}, {}, {}, results, points, {}, positions, {}, FE_points_system, FE_extra_points_system, FE_color_system, FE_display_system, sources)
        return wikitable
    end
    ---- WSBK
    ---- NASCAR
    ---- championship table
    local championships = {F1=F1, INDYCAR=INDYCAR, WRC=WRC, WEC=WEC, IMSA=IMSA, GTWCE=GTWCE, MOTOGP=MOTOGP, FE=FE}
    -- display
    if championship == 'F1' or championship == 'WRC' then
        return championships[championship](championship, races, drivers, results, sources)
    elseif championship == 'INDYCAR' then
        return championships[championship](championship, races, drivers, rookies, results, sources)
    elseif championship == 'WEC' then
        return championships[championship](championship, races, rlengths, drivers, teams, stints, results, sources)
    elseif championship == 'IMSA' then
        return championships[championship](championship, races, drivers, results, auxresults, sources)
    elseif championship == 'GTWCE' then
        return championships[championship](championship, races, rlengths, subraces, drivers, teams, stints, results, sources)
    elseif championship == 'MOTOGP' then
        return championships[championship](championship, races, drivers, teams, stints, manufacturers, results, sources)
    elseif championship == 'FE' then
        return championships[championship](championship, races, subraces, drivers, results, sources)
    else
        local points = calculate(nil, rlengths, results, ex_main_points_system, ex_side_points_system)
        local positions = classify(nil, results, points, ex_classification)
        local wikitable = convey(nil, races, subraces, drivers, rookies, teams, stints, manufacturers, results, points, {}, positions, {}, ex_main_points_system, ex_side_points_system, ex_color_system, ex_display_system)
        return wikitable
    end
end

return p