local p = {}
flag_table = {}
local loadI10n = require('Module:Cycling race/L10n')
wiki = string.match(mw.site.server, "%a+")
if wiki == "www" then available, translations = pcall( require, "Module:Cycling race-WD" ) 
else available, translations = pcall( require, "Module:Cycling race/lang" ) 
end 
if available == true and type( translations.list ) == "function" then available_list = true else available_list = false end 
if available == true and type( translations.lang_priority ) == "table" then available_lang_priority = true else available_lang_priority = false end 
function victories_translate(wiki,x) -- En-têtes des tableaux générant les classements
	local l10n = loadI10n.victories_translate[wiki]
	if not l10n then l10n = loadI10n.victories_translate["fr"] end  -- default
	return l10n[x]	
end

function stageinfobox_translate(wiki,x) 
	-- This function permits to translate fields of the infobox for stages. Take the line below, give a Wikipedia (ex : mk), and translate all fields. By default, English values are taken.
 	local l10n = loadI10n.stageinfobox_translate[wiki]
	if not l10n then l10n = loadI10n.stageinfobox_translate["fr"] end  -- default
	return l10n[x]	
end 

function jersey(wiki, winner_classification, item, timeofrace)
	local jersey, jersey_name = '', ''
	local jerseyWPID = ''
	local starttime, endtime = '', '+2500'
	local a1, b1
	if wiki == 'www' then wiki = 'fr' end

	-- 1. Item of race, e.g. Tour de France = 'Q33881'
	-- 2. type of winner, names are the ones in variable t_s
	-- 3. and 4. start and end time. '+2500' means year 2500. Always beginning with a '+'
	-- 5. item of the jersey
	-- 6. item of the Wikipedia article of that jersey
	
	local data={{'Q33881', 'montagne', '+1975', '+2500', 'Q25265958', 'Q927157'}, -- Tour de France
				{'Q33881', 'leader', '+1919', '+2500', 'Q24257871', 'Q738903'}, 
				{'Q33881', 'points', '+1953', '+1967', 'Q24645209', 'Q175399'}, -- Jersey green.svg
				{'Q33881', 'points', '+1968', '+1968', 'Q26919974', 'Q175399'},	-- 	Jersey red.svg	
				{'Q33881', 'points', '+1969', '+2500', 'Q24645209', 'Q175399'}, -- Jersey green.svg
				{'Q33881', 'jeune', '+1975', '+2500', 'Q24645383', 'Q2254180'}, -- Jersey white.svg
				{'Q33881', 'winner_fighting', '+2003', '+2500', 'Q27644113', 'Q2094179'}, -- Jersey red number.svg
				{'Q33881', 'winner_fighting2', '+2003', '+2500', 'Q27644113', 'Q2094179'}, -- Jersey red number.svg				
				{'Q33881', 'equipe', '+2006', '+2500', 'Q27644112', 'Q1436680'},	-- Jersey yellow number.svg
				
				{'Q33861', 'leader', '+1931', '+2500', 'Q24257763', 'Q1164275'}, -- Giro d'Italia, Jersey pink.svg
				{'Q33861', 'points', '+1967', '+1968', 'Q26919974', 'Q641083'}, -- Jersey red.svg
				{'Q33861', 'points', '+1969', '+2009', 'Q26945272', 'Q641083'}, -- Jersey violet.svg
				{'Q33861', 'points', '+2010', '+2500', 'Q26919974', 'Q641083'}, -- Jersey red.svg				
				{'Q33861', 'montagne', '+1974', '+2011', 'Q24645209', 'Q641060'}, -- Jersey green.svg
				{'Q33861', 'montagne', '+2012', '+2500', 'Q24687409', 'Q641060'}, -- Jersey blue.svg
				{'Q33861', 'jeune', '+1976', '+2500', 'Q24645383', 'Q641662'}, -- Jersey white.svg
				
				{'Q33937', 'leader', '+1935', '+1936', 'Q24258056', 'Q3278226'}, -- Vuelta a España, Jersey orange.svg
				{'Q33937', 'leader', '+1941', '+1941', 'Q26696171', 'Q640430'}, -- Jersey white.svg
				{'Q33937', 'leader', '+1942', '+1942', 'Q24258056', 'Q3278226'}, -- Jersey orange.svg
				{'Q33937', 'leader', '+1945', '+1945', 'Q24257872', 'Q2534046'}, -- Jersey red.svg
				{'Q33937', 'leader', '+1946', '+1950', 'Q26696171', 'Q640430'}, -- Jersey white.svg
				{'Q33937', 'leader', '+1955', '+1976', 'Q24257871', 'Q738903'}, -- Jersey yellow.svg
				{'Q33937', 'leader', '+1977', '+1977', 'Q24258056', 'Q3278226'}, -- Jersey orange.svg
				{'Q33937', 'leader', '+1978', '+1998', 'Q24257871', 'Q738903'}, -- Jersey yellow.svg
				{'Q33937', 'leader', '+1999', '+2009', 'Q24257991', 'Q27665179'}, -- Jersey gold.svg
				{'Q33937', 'leader', '+2010', '+2500', 'Q24257872', 'Q2534046'}, -- Jersey red.svg
				{'Q33937', 'points', '+1945', '+1986', 'Q24687409', 'Q2746711'}, -- Jersey blue.svg
				{'Q33937', 'points', '+1987', '+1989', 'Q24645209', 'Q11638007'}, -- Jersey green.svg
				{'Q33937', 'points', '+1990', '+2009', 'Q24687409', 'Q2746711'}, -- Jersey blue.svg
				{'Q33937', 'points', '+2010', '+2500', 'Q24645209', 'Q11638007'}, -- Jersey green.svg
				{'Q33937', 'montagne', '+1935', '+1985', 'Q27670182', 'Q11638007'}, -- Jersey green.svg
				{'Q33937', 'montagne', '+1986', '+1986', 'Q27670174', 'Q3278226'}, -- Jersey orange.svg
				{'Q33937', 'montagne', '+1987', '+1987', 'Q27670178', 'Q2534046'}, -- Jersey red.svg
				{'Q33937', 'montagne', '+1988', '+1989', 'Q27670105', 'Q27670115'}, -- Jersey blackdots.png
				{'Q33937', 'montagne', '+1990', '+2005', 'Q27670182', 'Q11638007'}, -- Jersey green.svg
				{'Q33937', 'montagne', '+2006', '+2008', 'Q27670174', 'Q3278226'}, -- Jersey orange.svg
				{'Q33937', 'montagne', '+2009', '+2009', 'Q27670126', 'Q27670163'}, -- Jersey granate.svg
				{'Q33937', 'montagne', '+2010', '+2500', 'Q25265959', 'Q27670167'}} -- Jersey bluedots.svg
			
	--timeofrace = '+1968-07-01T00:00:00Z'
	timeofrace = string.sub(timeofrace, string.find(timeofrace,  "+%d%d%d%d"))
	for k, v in pairs(item) do	
		for key, value in pairs(data) do
			if v == value[1] then
				if winner_classification == value[2] then
					if (timeofrace >= value[3]) and (timeofrace <= value[4]) then
						jersey = value[5]
						jerseyWPID = value[6]
					end
				end
			end
		end
	end

	if jersey~='' then --and (timeofrace > starttime) and (timeofrace < endtime) then 
		local entity_jersey = mw.wikibase.getEntity(jersey)
			jersey = entity_jersey.claims['P18'][1].mainsnak.datavalue.value
			jersey_name = entity_jersey:getLabel(wiki) or entity_jersey:getLabel('en') or ''
		if jerseyWPID~= '' then 
			local entity = mw.wikibase.getEntity( jerseyWPID )
			local Sitelink = entity:getSitelink(wiki..'wiki') -- link to WParticle
			if Sitelink~= nil then jerseyWPID = wiki..':'..Sitelink else jerseyWPID = '' end
		end
		return jersey, jersey_name, jerseyWPID
	else return '', '', ''
	end
end

function p.stageinfobox(frame)
	local vvv= ''
	local tab
	local wiki = string.match(mw.site.server, "%a+")
	local entityId = frame.args[1]
	local lang = mw.language.getContentLanguage()
	local timeofrace
	local a1, b1, c1, a2, b2, a3, b3
	local jerseyWPID, jersey_name
	local t_g = {show=true, name='', icon='', picture='', caption='', course= '', race={}, is_a='', startplace='', endplace='', time='', 
		length='', length_unit='', speed='', speed_unit='', nr_participants_start="", nr_participants_end='', country={}, 
		series_ordinal_previous="", series_ordinal_next="", map='', sectional_view='',previous="", next=""}
	local t_s = {order={'results', 'classement_gen', 'classement_annex'},
		results={show=false, header=15, order = {'first','second','third','winner_fighting','winner_fighting2','cima_coppi','cima_pantani'},
			-- name rider, stageinfobox_translate number, gender, jersey, team name, time, time gap, points, speed, rank
			first={"", 16, "", '', "", "", '', '', '', ''},
			second={"", 17, "", '', '', "", '', '', '', ''},
			third={"", 18, "", '', '', "", '', '', '', ''},
			winner_fighting={"", 19, "", '', '', '', '', '', '', ''},
			winner_fighting2={"", 19, "", '', '', '', '', '', '', ''}, -- two winner_fighting possible
			cima_coppi={"", 40, "", '', '', '', '', '', '', ''},
			cima_pantani={"", 41, "", '', '', '', '', '', '', ''}},
		
		classement_gen={show=false, header=20, order = {"leader", "deuxieme", "troisieme"},
			-- name rider, stageinfobox_translate number, gender, jersey, team name, time, time gap, points, speed, rank
			leader={"", 21, "", '', "", "", '', '', '', ''},
			deuxieme={"", 22, "", '', '', "", '', '', '', ''},
			troisieme={"", 23, "", '', '', "", '', '', '', ''}},

		classement_annex={show=false, header=24, order={"points","montagne","sprints","jeune","super_combatif","combine",
			"stage_volantes","regularite","azzurri_ditalia","fuga_pinarello","equipe","equipe_points"},
			-- name rider, stageinfobox_translate number, gender, jersey, team name, time, time gap, points, speed, rank
			points={"", 25, "", '', "", '', "", '', '', ''},
			montagne={"", 26, "", '', '', '', "", '', '', ''},
			sprints={"", 27, "", '', '', '', "", '', '', ''},
			jeune={"", 28, "", '', '', '', '', '', '', ''},
			super_combatif={"", 29, "", '', "", "", '', '', '', ''},
			combine={"", 30, "", '', '', "", '', '', '', ''},
			stage_volantes={"",31,'','','','','','', '', ''},
			regularite={"",32,'','','','','','', '', ''},
			azzurri_ditalia={"",42,'','','','','','', '', ''},
			fuga_pinarello={"",43,'','','','','','', '', ''},
			equipe={"", 33, "", '', '', "", '', '', '', ''},
			equipe_points={"", 34, "", '', '', '', '', '', '', ''}}
		}

	if type( entityId ) ~= 'string' then error( 'parameter must be a string') end
	if not entityId:match( 'Q%d+' ) then error ( 'parameter must be a valid Wikidata item (ex: Q42)' ) end
	local entity = mw.wikibase.getEntity( entityId )

	if entity:getLabel() ~= nil then t_g.name = entity:getLabel()
	else t_g.name = entity:getLabel() or entity:getLabel('en') or '' end
	if wiki == 'fr' and t_g.name ~= '' then t_g.name= mw.ustring.gsub(t_g.name, "^(%d+)([re]+)", "%1<sup>%2</sup> ") end
	t_g.name= mw.ustring.gsub(t_g.name, "^(%a)",function (x) return mw.ustring.upper(x) end) 
	
	a1, b1 = pcall(fooA, 'numeric-id', entity, 'P31', 1) -- If stage is a "stage" or a timetrial stage
	if a1 == true and b1~=18131152 then t_g.is_a = 'Q'.. b1 end

	if t_g.is_a=='Q2266066' or t_g.is_a=='Q2348250' or t_g.is_a=='Q485321' then t_g.icon = " [[File:Cycling (track) pictogram.svg|35px]]" 
	else t_g.icon = " [[File:Cycling (road) pictogram.svg|35px]]" end 

	a1, b1 = pcall(fooA, 'value', entity, 'P18', 1) -- picture, legende
	if a1 == true and t_g.picture == "" then 
		local v
		t_g.picture = b1
		if pcall(foo3, entity, "P18", 1, "P2096", 1) then
			for _, v in pairs(entity.claims["P18"]) do
				pcall(function()
					for num=1,#v.qualifiers["P2096"] do	-- find right language
						if v.qualifiers["P2096"][num].datavalue.value.language == lang:getCode() then
							t_g.caption = v.qualifiers["P2096"][num].datavalue.value.text end
					end
				end) 
			end
		end
	end

	-- Function that give the starting place of a race 
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', 1) 
	if a1 == true and t_g.startplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', i) 
		end   
		t_g.startplace = "Q" .. b1 
	end	
	-- Function that give the finishing place of a race
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', 1) 
	if a1 == true and t_g.endplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', i) 
		end   
		t_g.endplace = "Q" .. b1 
	end	

-- This function give a format to dates when P585 (date) is used in a single day race
	a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', 1) 
	if a1 == true and t_g.time == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', i) 
		end  		
		t_g.time = func_date (b1, wiki, 'long') 
		timeofrace = b1
	end

	-- Function that give the number of cyclists at the beginning and at the finishing of a race
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', 1) 
	if a1 == true and t_g.nr_participants_start == "" and t_g.nr_participants_end == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', i) 
		end 
		local v
		for _, v in pairs(entity.claims["P1132"]) do
			if pcall(function()
		   		if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 529711 then
				t_g.nr_participants_start = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
				end
			) then else t_g.nr_participants_start = "" end
			if pcall(function()
				if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 12769393 then
				t_g.nr_participants_end = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
			end
			) then else t_g.nr_participants_end = "" end
		end	
	end 

-- This function permits to display an unity (the kilometer) for a distance, with exceptions for macedionan, russian and japanese 
	-- that have other symbols 
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P3157', 1) 
	if a1 == true and t_g.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P3157', i) 
		end   
		t_g.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P3157', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t_g.length_unit = 'km'
			if  wiki == "ar" then t_g.length_unit = 'كم' end
			if  wiki == "mk" then t_g.length_unit = 'км' end
			if  wiki == "ru" then t_g.length_unit = 'км' end
			if  wiki == "ja" then t_g.length_unit = 'キロメートル' end
		end
	end

	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', 1) 
	if a1 == true and t_g.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', i) 
		end   
		t_g.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P2043', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t_g.length_unit = 'km'
			if  wiki == "ar" then t_g.length_unit = 'كم' end
			if  wiki == "mk" then t_g.length_unit = 'км' end
			if  wiki == "ru" then t_g.length_unit = 'км' end
			if  wiki == "ja" then t_g.length_unit = 'キロメートル' end
		end
	end
	-- This function permits to display an unity (the kilometer per hour) for an average speed, with exceptions for macedionan, russian and japanese 
	-- that have other symbols
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', 1) 
	if a1 == true and t_g.speed == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', i) 
		end 
		t_g.speed = b1
		a1, b1 = pcall(fooA, 'unit', entity, 'P2052', 1)
		if b1 == "http://www.wikidata.org/entity/Q180154" then
			t_g.speed_unit = 'km/h'
			if  wiki == "da" then t_g.speed_unit = 'km/t' end
			if  wiki == "fo" then t_g.speed_unit = 'km/t' end
			if  wiki == "nl" then t_g.speed_unit = 'km/u' end
			if  wiki == "no" then t_g.speed_unit = 'km/t' end
			if  wiki == "ar" then t_g.speed_unit = 'كم/س' end
			if  wiki == "mk" then t_g.speed_unit = 'км/ч' end
			if  wiki == "ru" then t_g.speed_unit = 'км/ч' end
			if  wiki == "ja" then t_g.speed_unit = 'キロメートル毎時' end			
		end
	end	-- if a1

	a1, b1 = pcall(fooA, 'numeric-id', entity, 'P17', 1) -- This function gives countries where the race take place
	if a1 == true then
		for i, v in pairs(entity.claims["P17"]) do
   			t_g.country[i] = "Q" .. v.mainsnak.datavalue.value["numeric-id"]
   		end
 	end

	a1, b1 = pcall(fooA, 'value', entity, 'P242', 1) -- locator map image
	if a1 == true and t_g.map == "" then t_g.map = b1 end
	a1, b1 = pcall(fooA, 'value', entity, 'P2713', 1) -- sectional view
	if a1 == true and t_g.sectional_view == "" then t_g.sectional_view = b1 end	

	a1, b1 = pcall(fooA, 'numeric-id', entity, 'P155', 1) 
	if a1 == true and t_g.previous == "" then 
		t_g.previous = "Q"..b1 
		a2, b2 = pcall(fooA, 'value', mw.wikibase.getEntity( t_g.previous ), 'P1545', 1)
		if a2 == true then t_g.series_ordinal_previous = b2 end		
	end	
	a1, b1 = pcall(fooA, 'numeric-id', entity, 'P156', 1) 
	if a1 == true and t_g.next == "" then 
		t_g.next = "Q"..b1 
		a2, b2 = pcall(fooA, 'value', mw.wikibase.getEntity( t_g.next ), 'P1545', 1)
		if a2 == true then t_g.series_ordinal_next = b2 end		
	end

	local t_P642 = {[20882747]={'results', 'first'}, [20882748]={'results', 'second'}, [20882749]={'results', 'third'}, [21686770]={'results', 'winner_fighting'},
			[2250962]={'results', 'cima_coppi'}, [10452933]={'results', 'cima_pantani'},
			[20882763]={'classement_gen', 'leader'}, [20882764]={'classement_gen', 'deuxieme'}, [20882765]={'classement_gen', 'troisieme'},
			[20883213]={'classement_annex', 'montagne'}, [20883140]={'classement_annex', 'jeune'}, [20883008]={'classement_annex', 'points'}, 
			[20883329]={'classement_annex', 'sprints'}, [20893984]={'classement_annex', 'super_combatif'}, [20965880]={'classement_annex', 'combine'}, 
			[27104688]={'classement_annex', 'stage_volantes'}, [27104684]={'classement_annex', 'regularite'}, [20882922]={'classement_annex', 'equipe'}, 
			[27104271]={'classement_annex', 'equipe_points'},
			[20882667]={'classement_gen', 'leader'}, [20882668]={'classement_gen', 'deuxieme'}, [20882669]={'classement_gen', 'troisieme'},
			[20883212]={'classement_annex', 'montagne'}, [20883139]={'classement_annex', 'jeune'}, [20883007]={'classement_annex', 'points'}, 
			[20883328]={'classement_annex', 'sprints'}, [20893983]={'classement_annex', 'super_combatif'}, [20893979]={'classement_annex', 'combine'}, 
			[27067359]={'classement_annex', 'stage_volantes'}, [27067170]={'classement_annex', 'regularite'}, 
			[27907747]={'classement_annex', 'azzurri_ditalia'}, [27907748]={'classement_annex', 'azzurri_ditalia'}, 			
			[27907714]={'classement_annex', 'fuga_pinarello'}, [27907715]={'classement_annex', 'fuga_pinarello'}, 
			[20882921]={'classement_annex', 'equipe'}, [27104269]={'classement_annex', 'equipe_points'}
			}

	a1, b1 = pcall(fooA, 'numeric-id', entity, "P1346", 1)
	if a1 == true then
		local deprecated, qual, id, id_team, id_time, id_time_gap, id_speed, id_points_a, id_points_b
		for k, v in pairs(entity.claims["P1346"]) do
			id_team, id_speed, id_time, id_time_gap, id_points_a, id_points_b = '', '', '', '', '', ''
			a, b = pcall(fooC, 'numeric-id', entity, 'P1346', k, 'P54', 1)
			if a == true then id_team = 'Q'..b  end

			if pcall(function() 
				id=v.mainsnak.datavalue.value['numeric-id'] -- id = rider id
				deprecated = entity.claims["P1346"][k].rank
				end) then
			else id=nil end
			if id ~= nil then
				--timeofrace = "+2016-03-00T00:00:00Z"
				-- function timeStartEnd finds the team of the rider at the time (timeofrace) of the race
				if id_team == '' and timeofrace ~= nil and timeofrace ~= '' then
					a, b = timeStartEnd('Q'..id, 'P54', 'numeric-id', timeofrace)
					if a == true and b ~= nil then id_team = 'Q' .. b end
				end

				-- looks into race item if the winner has a P54 statement for beeng a member of a national team
				pcall(function()
					for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P54']) do
						id_team = national_team(wiki, 'Q'..id, timeofrace, entity, 'P1346', k) -- timeofrace -> startOfSeason ?????
						if id_team == nil then id_team = '' end
					end
				end)

		   		pcall(function() -- for property 'race time'
					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P2781']) do
			   			id_time = tonumber(v.datavalue.value.amount)
					end
				end)

	   			pcall(function() -- for property 'time gap'
					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P2911']) do
	   					id_time_gap = tonumber(v.datavalue.value.amount)
					end
				end)

		   		pcall(function() -- for property 'speed'
					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P2052']) do
			   			id_speed = tonumber(v.datavalue.value.amount)
					end
				end)

				pcall(function() -- for property 'points for'
					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P1358']) do
		   				id_points_a = tonumber(v.datavalue.value.amount)
					end
				end)

				pcall(function() -- for property 'number of points/goals/set scored'
					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P1351']) do
		   				id_points_b = tonumber(v.datavalue.value.amount)
					end
				end)

				-- looks into race item if the winner has a P642 statement for showing the type of winner (points, mountain, ..)
				pcall(function()
					for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P642']) do
						qual=vv.datavalue.value['numeric-id']

						if id~=nil and qual~=nil and v.rank~='deprecated' then
							if qual==21686770 and t_s['results']['winner_fighting'][1] ~= '' then t_P642[qual][2] = 'winner_fighting2' end
							pcall(function() -- inserts WD data into table t_s
								t_s[t_P642[qual][1]][t_P642[qual][2]][1]='Q'..id
								t_s[t_P642[qual][1]][t_P642[qual][2]][5]=id_team
								t_s[t_P642[qual][1]][t_P642[qual][2]][10]=deprecated
								if id_time~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][6]=id_time end
								if id_time_gap~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][7]=id_time_gap end
								if id_points_a~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][8]=id_points_a end
								if id_points_b~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][8]=id_points_b end
								if id_speed~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][9]=id_speed end
							end)
							if qual==27104271 and t_s.classement_annex.equipe_points[1]=='' then t_s.classement_annex.equipe_points[1]='Q'..id end
							if qual==20882922 and t_s.classement_annex.equipe[1]=='' then t_s.classement_annex.equipe[1]='Q'..id end

							a1, b1 = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject('Q'..id), 'P21', 1)  -- detect gender
							if a1 == true then
								if b1 == 6581097 then t_s[t_P642[qual][1]][t_P642[qual][2]][3] = 'm' -- men
								elseif b1 == 6581072 then t_s[t_P642[qual][1]][t_P642[qual][2]][3] = 'f' -- female
								end
							else t_s[t_P642[qual][1]][t_P642[qual][2]][3] = 'f' -- female
							end
	 					end
					end
				end)
			end
		end
	end
	local rank, deprecated
	local order = {'first', 'second', 'third'}
	local property = 'P2417'
	a1, b1 = pcall(fooA, 'numeric-id', entity, property, 1)
	if a1 == true then
	for k, _ in pairs(entity.claims[property]) do -- look into P2417, stage classification
		for _, v in pairs(entity.claims[property][k].qualifiers['P1352']) do -- for property 'rank'
			rank = tonumber(v.datavalue.value.amount)
			deprecated = entity.claims[property][k].rank
		end
		if rank == 1 or rank == 2 or rank == 3 then
			t_s.results[order[rank]][10] = deprecated
			if t_s.results[order[rank]][1] == '' or t_s.results[order[rank]][10] == 'normal'  then -- name or rider / team		
				t_s.results[order[rank]][1] = 'Q' .. entity.claims[property][k].mainsnak.datavalue.value['numeric-id']
				if t_s.results[order[rank]][7] == '' and t_s.results[order[rank]][6] == '' then
		   			pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2911']) do -- for property 'time gap'
		   					t_s.results[order[rank]][7] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				if t_s.results[order[rank]][7] == '' and t_s.results[order[rank]][6] == '' then
		   			pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2781']) do -- for property 'race time'
		   					t_s.results[order[rank]][6] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				if t_s.results[order[rank]][9] == '' then
	   				pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2052']) do -- for property 'speed'
		   					t_s.results[order[rank]][9] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				a1, b1 = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject(t_s.results[order[rank]][1]), 'P21', 1)  -- detect gender
				if a1 == true then
					if b1 == 6581097 then t_s.results[order[rank]][3] = 'm' -- men
					elseif b1 == 6581072 then t_s.results[order[rank]][3] = 'f' -- female
					end
				else t_s.results[order[rank]][3] = 'f' -- female
				end
			end
		end
	end
	end
	order = {'leader', 'deuxieme', 'troisieme'}
	property = 'P2321'
	a1, b1 = pcall(fooA, 'numeric-id', entity, property, 1)
	if a1 == true then
	for k, _ in pairs(entity.claims[property]) do -- look into P2321, stage classification
		for _, v in pairs(entity.claims[property][k].qualifiers['P1352']) do -- for property 'rank'
			rank = tonumber(v.datavalue.value.amount)
			deprecated = entity.claims[property][k].rank
		end
		if rank == 1 or rank == 2 or rank == 3 then
			t_s.classement_gen[order[rank]][10] = deprecated
			if t_s.classement_gen[order[rank]][1] == '' or t_s.classement_gen[order[rank]][10] == 'normal'  then -- name or rider / team
				t_s.classement_gen[order[rank]][1] = 'Q' .. entity.claims[property][k].mainsnak.datavalue.value['numeric-id']
				if t_s.classement_gen[order[rank]][7] == '' and t_s.classement_gen[order[rank]][6] == '' then
	   				pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2911']) do -- for property 'time gap'
		   					t_s.classement_gen[order[rank]][7] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				if t_s.classement_gen[order[rank]][7] == '' and t_s.classement_gen[order[rank]][6] == '' then
	   				pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2781']) do -- for property 'race time'
		   					t_s.classement_gen[order[rank]][6] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				if t_s.classement_gen[order[rank]][9] == '' then
	   				pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2052']) do -- for property 'speed'
		   					t_s.classement_gen[order[rank]][9] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				a1, b1 = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject(t_s.classement_gen[order[rank]][1]), 'P21', 1)  -- detect gender
				if a1 == true then
					if b1 == 6581097 then t_s.classement_gen[order[rank]][3] = 'm' -- men
					elseif b1 == 6581072 then t_s.classement_gen[order[rank]][3] = 'f' -- female
					end
				else t_s.classement_gen[order[rank]][3] = 'f' -- female
				end
			end
		end
	end
	end

    if t_g.length ~= "" then
    	t_g.length, _ = string.gsub(t_g.length, "[+]", "") -- delets "+" sign
    	t_g.length = lang:formatNum(tonumber(t_g.length)) -- formats t_g.length in the way it is done in the local Wiki
    	if wiki == 'fo' then t_g.length = string.gsub(t_g.length, "%.", ",") end
    end
    if t_g.speed ~= "" then
    	t_g.speed, _ = string.gsub(t_g.speed, "[+]", "")
    	t_g.speed = lang:formatNum(tonumber(t_g.speed))
    	if wiki == 'fo' then t_g.speed = string.gsub(t_g.speed, "%.", ",") end
    end

	local a, b
   	local span1, span2 = "<span style='color:#3366CC'>&#x25C0; </span>", "<span style='color:#3366CC'> &#x25B6;</span>"

	if t_g.series_ordinal_previous ~= '' then
		a, _ = string.gsub(t_g.series_ordinal_previous, "%a", "") -- 20, not 20a
		if string.find(t_g.series_ordinal_previous, "%a") then b = string.sub(t_g.series_ordinal_previous, string.find(t_g.series_ordinal_previous, "%a"))
		else b = "" end
		local label_previous = stageLink(t_g.series_ordinal_previous, a, b)
		if t_g.series_ordinal_previous == "0" then label_previous = func_prologue() end
		if mw.wikibase.sitelink( t_g.previous ) ~= nil then
   			local k = transform(t_g.previous,'Q', timeofrace)
			local i, _ = string.find(k, "|")
			local j, _ = string.find(k, "]")
			if i ~= nil and j ~= nil then
				t_g.previous = string.sub(k, 1, i) .. span1 .. label_previous .. string.sub(k, j)
			else t_g.previous = span1 .. label_previous end
		else t_g.previous = span1 .. label_previous end
    	if wiki == 'www' then t_g.previous = span1 .. label_previous end
    else t_g.previous = ''
	end

	if t_g.series_ordinal_next~= '' then
		a, _ = string.gsub(t_g.series_ordinal_next, "%a", "") -- 20, not 20a
		if string.find(t_g.series_ordinal_next, "%a") then b = string.sub(t_g.series_ordinal_next, string.find(t_g.series_ordinal_next, "%a"))
		else b = "" end
		local label_next = stageLink(t_g.series_ordinal_next, a, b)
		if t_g.series_ordinal_next == "0" then label_next = func_prologue() end
		if mw.wikibase.sitelink( t_g.next ) ~= nil then
   			local k = transform(t_g.next,'Q', timeofrace)
			local i, _ = string.find(k, "|")
			local j, _ = string.find(k, "]")
			if i ~= nil and j ~= nil then
				t_g.next = string.sub(k, 1, i) .. label_next.. span2 .. string.sub(k, j)
			else t_g.next = label_next.. span2 end
		else t_g.next = label_next.. span2 end
    	if wiki == 'www' then t_g.next = label_next .. span2 end
    else t_g.next = ''
	end

	if t_g.course== '' then
		a1, b1 = pcall(fooA, 'value', entity, 'P1545', 1)
		if a1 == true then
			a, _ = string.gsub(b1, "%a", "") -- 20, not 20a
			if string.find(b1, "%a") then b = string.sub(b1, string.find(b1, "%a")) else b = "" end
			local label = stageLink(b1, a, b)
			if b1 == "0" then label = func_prologue() end
    		t_g.course = label
			a2, b2 = pcall(fooA, 'numeric-id', entity, 'P361', 1)
			if a2 == true then
				t_g.course = t_g.course .. ', '.. WPlink('Q'..b2,'pure')
				--t_g.race = 'Q'..b2
				
				local entity_race = mw.wikibase.getEntity('Q'..b2) 
				a3, b3 = pcall(fooA, 'numeric-id', entity_race, 'P31', 1) 
 				if a3 == true then 
					for k, v in pairs(entity_race.claims["P31"]) do	
						t_g.race[k] = 'Q'..v.mainsnak.datavalue.value["numeric-id"] 
					end
				end
			end
    	end
	end

	if t_s.results.first[1]~='' or t_s.results.second[1]~='' or t_s.results.third[1]~='' or t_s.results.winner_fighting[1]
		then t_s.results.show = true end
	if t_s.classement_gen.leader[1]~='' or t_s.classement_gen.deuxieme[1]~='' or t_s.classement_gen.troisieme[1]~='' 
		then t_s.classement_gen.show = true end
	if t_s.classement_annex.points[1]~='' or t_s.classement_annex.montagne[1]~='' or t_s.classement_annex.sprints[1]~='' or t_s.classement_annex.jeune[1]~='' or 
		t_s.classement_annex.super_combatif[1]~='' or t_s.classement_annex.combine[1]~='' or t_s.classement_annex.stage_volantes[1]~='' or 
		t_s.classement_annex.regularite[1]~='' or t_s.classement_annex.azzurri_ditalia[1]~='' or t_s.classement_annex.fuga_pinarello[1]~='' or 
		t_s.classement_annex.equipe[1]~='' or t_s.classement_annex.equipe_points[1]~='' then t_s.classement_annex.show = true end		

	function stage_icon(x)
 		if x=='Q20646667' then return "[[File:Plainstage.svg|20px]] " end
 		if x=='Q20646670' then return "[[File:Hillystage.svg|20px]] " end
  		if x=='Q20680270' then return "[[File:Mediummountainstage.svg|20px]] " end
  		if x=='Q20646668' then return "[[File:Mountainstage.svg|20px]] " end
  		if x=='Q20679712' then return "[[File:Mountain Time Trial Stage.svg|20px]] " end
		if x=='Q2348250' then return "[[File:Team Time Trial Stage.svg|20px]] " end
   		if x=='Q2266066' then return "[[File:Time Trial.svg|20px]] " end
   		if x=='Q485321'  then return "[[File:Time Trial.svg|20px]] " end
   		return ''
	end

	local width= '320px' -- size standard 320px, special 340px
	if t_s.classement_annex.show == true and (wiki == 'no' or wiki == '..') then width= '340px' end
	
 	tab = "<table border='0' cellpadding='4' cellspacing='0' style='float:left; max-width:"..width.."; border:1px solid rgb(200,200,200);"
    tab = tab .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px; clear:left; "
    tab = tab .. "text-align:right; font-size:85%; line-height:1.6em;'>"
	tab = tab .. "<tr><td colspan='2' style='border-bottom:5px solid white; font-size:175%; background:#FFE7A0; text-align:center'>"
	tab = tab .. "<table style='width:100%'><tr><td>" .. t_g.name .."</td><td>" .. t_g.icon .. "</td></tr></table></td></tr>"

	if t_g.picture ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. t_g.picture .."|center|300px]]</td></tr>" end
	if t_g.picture ~= "" and t_g.caption ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center; font-size:80%'>"..t_g.caption.."</td></tr>" end
	if t_g.course~="" or t_g.is_a~="" or t_g.time~="" or t_g.length~="" or t_g.startplace~="" or t_g.endplace~="" then 
		tab=tab.."<tr><td colspan='2' style='background-color:#FFE7A0; text-align:center'>'''"..stageinfobox_translate(wiki,1).."'''</td></tr>" end
	if t_g.course ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(wiki,2).."'''</td><td>" .. t_g.course .. "</td></tr>" end	
	if t_g.is_a ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(wiki,3).."'''</td><td>" ..stage_icon(t_g.is_a).. WPlink(t_g.is_a,'pure').. "</td></tr>" end	
	if t_g.time~="" then tab = tab.."<tr><td>'''"..stageinfobox_translate(wiki,4).."'''</td><td>" .. t_g.time.."</td></tr>" end	
	if t_g.length ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(wiki,6).."'''</td><td>" .. t_g.length.." "..t_g.length_unit.."</td></tr>" end	
	if t_g.startplace ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(wiki,9).."'''</td><td>" .. WPlink(t_g.startplace,'pure').. "</td></tr>" end	
	if t_g.endplace ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(wiki,10).."'''</td><td>" .. WPlink(t_g.endplace,'pure').. "</td></tr>" end
	if t_g.country ~= nil then for i=1,#t_g.country do t_g.country[i] = flag(t_g.country[i], timeofrace).." ".. WPlink( t_g.country[i],'pure') end end
	if t_g.country[1] ~= nil then tab = tab.."<tr><td style= 'vertical-align:top'>'''"
		if #t_g.country == 1 then tab = tab..stageinfobox_translate(wiki,7).."'''</td><td>" else tab = tab..stageinfobox_translate(wiki,8).."'''</td><td>" end
		for i=1,#t_g.country-1 do tab = tab .. t_g.country[i].."<br>" end tab = tab .. t_g.country[#t_g.country].."</td></tr>" end	
	if t_g.nr_participants_start ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(wiki,11).."'''</td><td>" .. t_g.nr_participants_start .. "</td></tr>" end
	if t_g.nr_participants_end ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(wiki,12).."'''</td><td>" .. t_g.nr_participants_end .. "</td></tr>" end	
	if t_g.speed ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(wiki,13).."'''</td><td>" .. t_g.speed .. " "..t_g.speed_unit.."</td></tr>" end		

	for _, value_order in ipairs(t_s.order) do 
		if t_s[value_order].show == true then -- if a section of the stageinfobox should be shown
			tab=tab.."<tr><td colspan='2'>"
			tab=tab.."<table border='0' cellpadding='0' cellspacing='0' style='width:100%'>"
			tab=tab.."<tr><td colspan='3' style='border-bottom:5px solid #fff2cc; background-color:#FFE7A0; text-align:center'>'''"..
				stageinfobox_translate(wiki,t_s[value_order].header).."'''</td></tr>"

			for key, value in ipairs(t_s[value_order].order) do
				if t_s[value_order][value][1]~="" then
					a1, jersey_name, jerseyWPID  = jersey(wiki, value, t_g.race, timeofrace)
					if a1~='' then t_s[value_order][value][4] = a1 end
					if t_s[value_order][value][9] ~= '' then 
						t_s[value_order][value][9] = '('.. lang:formatNum(t_s[value_order][value][9])..unit(wiki,5)..')'
						if wiki == 'fo' then t_s[value_order][value][9] = string.gsub(t_s[value_order][value][9], "%.", ",") end
					end
					if t_s[value_order][value][8] ~= '' then
						if t_s[value_order][value][8] > 1 then t_s[value_order][value][8] = t_s[value_order][value][8]..unit(wiki,7)
						else t_s[value_order][value][8] = t_s[value_order][value][8]..unit(wiki,6) end end
					local title, k =mw.ustring.gsub(stageinfobox_translate(wiki,t_s[value_order][value][2]), " ", "&nbsp;") 
					if k > 0 then title=mw.ustring.gsub(title, "&nbsp;", "<br>", 1) end --&#32;
					if t_s[value_order][value][5]=="" and t_s[value_order][value][9] =="" then
						tab=tab.."<tr style='vertical-align:top;'><td nowrap style='width:1%;background-color:#fff2cc;text-align:right;padding:0 2px 0 2px'>'''"
					else tab=tab.."<tr style='vertical-align:top;'><td nowrap rowspan='2' style='width:1%;background-color:#fff2cc;text-align:right;padding:0 2px 0 2px'>'''"
					end
					if value_order~='classement_annex' and t_s[value_order][value][2]~=40 and t_s[value_order][value][2]~=41 then -- Cima Coppi, Cima Pantani with a line break
						if t_s[value_order][value][4] == "" then 
							if (value_order=='results') and (value=='winner_fighting' or value=='winner_fighting2' or value=='cima_coppi' or value=='cima_pantanii') then 
								tab=tab..stageinfobox_translate(wiki,t_s[value_order][value][2])
							else tab=tab..number(t_s[value_order][value][3], key, wiki) end
						else 
							if jerseyWPID=='' then tab=tab.."[[File:"..t_s[value_order][value][4].."|20px|"..title.."]]"
							else tab=tab.."[[File:"..t_s[value_order][value][4].."|20px|"..title.."|link="..jerseyWPID.."]]" end
						end
					else 
						if t_s[value_order][value][4] == "" then tab=tab..title
						else 
							if jerseyWPID=='' then 
								if jersey_name ~= '' then tab=tab.."[[File:"..t_s[value_order][value][4].."|20px|"..jersey_name.."]]" .. title
								else tab=tab.."[[File:"..t_s[value_order][value][4].."|20px]]" .. title end
							else tab=tab.."[[File:"..t_s[value_order][value][4].."|20px|link="..jerseyWPID.."]]" .. title end end
					end  
					if t_s[value_order][value][10] == 'deprecated' then 
						tab=tab.."</span>".. "'''</td><td style='padding:0 0.5em 0 0.5em'>".. '<s>' .. transform(t_s[value_order][value][1],'f', timeofrace) .. '</s>'
					else tab=tab.."</span>".. "'''</td><td style='padding:0 0.5em 0 0.5em'>".. transform(t_s[value_order][value][1],'f', timeofrace) end
					tab=tab.."</td><td nowrap style='text-align:right;font-size:85%;'>" 
					if t_s[value_order][value][6]~='' then tab=tab.. calculate_time(wiki,t_s[value_order][value][6]) end
					if t_s[value_order][value][7]~='' then tab=tab..'+ '.. calculate_time(wiki,t_s[value_order][value][7]) end
					tab= tab.. t_s[value_order][value][8]..  "</td></tr>"
				end

				if t_s[value_order][value][5]~="" and t_s[value_order][value][9] ~="" then -- team row
					tab=tab.."<tr><td colspan='2'>"
					tab = tab.. "<table border='0' cellpadding='0' cellspacing='0' style='width:100%'>"
					tab = tab.. "<tr><td style='width:100%;text-align:right;padding-left:2px'>("..transform(t_s[value_order][value][5],'t', timeofrace)..
						")</td><td nowrap style='font-size:85%;vertical-align:top'>"..t_s[value_order][value][9] .. "</td></tr></table>"
				else
					if t_s[value_order][value][5]~="" or t_s[value_order][value][9] ~="" then -- team row
						tab=tab.."<tr><td colspan='2' style='text-align:right;padding-left:2px'>"
						if t_s[value_order][value][5] ~= '' then tab=tab..'('..transform(t_s[value_order][value][5],'t', timeofrace)..')' end
						tab = tab..  '<span style="float:right;font-size:85%;">'.. t_s[value_order][value][9].."</span></td></tr>"
					end					
				end
			end
			tab=tab.. "</table></td></tr>"
		end
	end 

	if t_g.map ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. t_g.map .."|center|300px]]".."</td></tr>" end
	if t_g.sectional_view ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. t_g.sectional_view .."|center|300px]]".."</td></tr>" end	
	tab = tab.."<tr><td>"..t_g.previous.."</td><td style='text-align:right'>" .. t_g.next .. "</td></tr>"
	local s = "d:Wikidata:WikiProject Cycling/Documentation/stageinfobox"
	tab = tab .. "<tr><td colspan='2' style='text-align:right; border-top:3px solid #FFDF80; font-size:75%'>".. --infobox_bottom(1) 
		"[[" .. s .. "|" .. stageinfobox_translate(wiki,39).. "]] [[File:Wikidata-logo S.svg|12px|link=d:".. frame.args[1]  .. "]]" 
	tab = tab .. "</span></td></tr>"
	tab= tab.."</table>"
	return tab
end

function transform(q_number, command, timeofrace) 
	-- transforms Q/q-number into flag / WPlink / WDlink
	local wd = " [[File:Wikidata-logo S.svg|12px|link=d:"
	if not string.find(q_number, "^Q%d+") then return q_number end -- test if q_number is an item
	if command == "Q" then return WPlink( q_number ) end -- find variables with an item as value
	if command == 'q' then -- with WDitem icon
		--look into P27 (country of citizenship) to get the Qnumber of that country
		a, b = timeStartEnd(q_number, "P27", 'numeric-id', timeofrace)
		if a == true then return flag('Q'..b, timeofrace).." "..WPlink( q_number )..wd..q_number.."]]"
		else
			--look into P17 (country) to get the Qnumber of that country
			a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( q_number ), 'P17', 1)
			if a == true then return flag("Q"..b, timeofrace).." "..WPlink( q_number )..wd..q_number.."]]" 
			else return WPlink( q_number )..wd..q_number.."]]" end
		end
	end
	if command == "f" then -- no WDitem icon
		--look into P27 (country of citizenship) to get the Qnumber of that country
		a, b = timeStartEnd(q_number, "P27", 'numeric-id', timeofrace)
		if a == true then return flag('Q'..b, timeofrace).." "..WPlink( q_number )
		else	
			--look into P17 (country) to get the Qnumber of that country
			a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( q_number ), 'P17', 1)
			if a == true then return flag("Q"..b, timeofrace).." "..WPlink( q_number, 'team', timeofrace ) 
			else return WPlink( q_number, 'team', timeofrace ) end
		end
	end	
	if command == "c" then return WPlink( q_number, "Q22348500" ) end -- find "class"-items
	if command == "t" then return WPlink( q_number, 'team', timeofrace ) end
	if command =="2t" then return q_number end		
	return q_number
end

function p.listofteams(frame)
	--frame.args[1] = 'Q19753550'
local entity = mw.wikibase.getEntityObject( frame.args[1] )
local mt = {}
local tempID, k, u, v, v1, w, new, teamcategory, entity2, len, len2
local wiki = string.match(mw.site.server, "%a+")

local startOfSeason = '' --'+2016-01-01T00:00:00Z'
pcall(function() startOfSeason = entity.claims["P580"][1].mainsnak.datavalue.value.time end)
if startOfSeason == '' then
	if pcall(function() startOfSeason = entity.claims["P585"][1].mainsnak.datavalue.value.time end) then
	else
		local Sitelink = entity:getSitelink('arwiki') or entity:getSitelink('enwiki') or entity:getSitelink('frwiki') or entity:getSitelink('dewiki') or ''
		if Sitelink == '' then return '> Wikidata is missing data about the start time (P580) and end time (P582) of the season'
		else startOfSeason = '+'..string.match(Sitelink, '%d%d%d%d' ) ..'-01-01T00:00:00Z'
		end
	end
end

v = ''
mt[1] = {}
mt[1][1], mt[1][2], mt[1][3] = '', 0, ''
local mu = {}
local a, b

if pcall(fooA, 'numeric-id', entity, 'P1923', 1) == true then
	for k, v1 in pairs(entity.claims['P1923']) do
		new = true
		teamcategory, tempID, len = '', '', 0
		tempID = 'Q'.. v1.mainsnak.datavalue.value['numeric-id']
		entity2 = mw.wikibase.getEntityObject( tempID )

		a, b =  timeStartEnd(tempID, "P31", 'numeric-id', startOfSeason)
		if a == true then teamcategory = 'Q'..b	else new = false end

		for w in pairs(mt) do
			len = table.getn(mt[w])
			if mt[w][1] == teamcategory then new=false mt[w][2]=mt[w][2]+1 len=len+1 mt[w][len]=tempID len2=len-2 end
		end
		if new == true then
			local size = table.getn(mt)
			mt[size+1] = {}
			mt[size+1][1] = teamcategory
			mt[size+1][2] = 1
			mt[size+1][3] = tempID
		end
	end
end -- if pcall(fooA

local list = { -- c:d:e  c = singular team type, d = plural team type, e = print order of the team types
	["Q6154783"] = "4:5:1", -- WorldTeam
	["Q20638319"] = "6:7:2", -- ProTeam
	["Q382927"] = "8:9:3", -- UCI Professional Continental Team
	["Q1756006"] = "10:11:4", -- UCI Continental Team
	["Q23726798"] = "12:13:6", -- national cycling team
	["Q20738667"] = "12:13:6", -- national cycling team U23
	["Q20639848"] = "14:15:7", -- club cycling team
	["Q20639847"] = "16:17:8", -- professional cycling team
	["Q20652655"] = "18:19:9", -- amateur cycling team
	["Q20653563"] = "20:21:10", -- Groupe Sportif I
	["Q20653564"] = "22:23:11", -- Groupe Sportif II
	["Q20653566"] = "24:25:12", -- Groupe Sportif III
	["Q2466826"] = "28:29:5" -- UCI Women’s Team
	}
local a, b, c, d, e, ii, jj
for i=1, table.getn(mt) do
	mu[i] = {}
	mu[i]['index']= 100 mu[i]['val'] = ''
	if mt[i][1] ~= '' then
		if list[mt[i][1]] ~= nil then
			_, _, c, d, e = string.find(list[mt[i][1]], "(%d+):(%d+):(%d+)")
			mu[i]['index'] = tonumber( e )
			if mt[i][2] == 1 then mu[i]['val'] = mu[i]['val'] .. '<span style="font-size:1.2em;font-weight:bold">'..headoftableIII(wiki,tonumber( c ))..'</span>'
			else mu[i]['val'] = mu[i]['val'] .. '<span style="font-size:1.2em;font-weight:bold">'..headoftableIII(wiki,tonumber( d )).. '</span>'
			end
		else -- fall back headings (ProTeam, ...) in case no value in function headoftableIII
			mu[i]['val'] = mu[i]['val'] .. '<span style="font-size:1.2em;font-weight:bold;text-transform: capitalize;">' .. WPlink(mt[i][1])..'</span>'
		end
		if mt[i][2] > 3 then mu[i]['val'] = mu[i]['val'] .. ' <small>('..mt[i][2]..')</small>' end

		mu[i]['val'] = mu[i]['val'].. '<ol>'
		for w in pairs(mt[i]) do
			if w > 2 then
				mu[i]['val'] = mu[i]['val'] .. '<li style="text-indent:-1.5em;width:20em;display:inline-block;">'
				a, b = timeStartEnd(mt[i][w], "P17", 'numeric-id', startOfSeason)
				if a == true then mu[i]['val'] = mu[i]['val'].. flag('Q'..b, startOfSeason).. ' ' end
				if mt[i][1] ~= 'Q23726798' and mt[i][1] ~= 'Q20738667' then mu[i]['val'] = mu[i]['val'].. WPlink(mt[i][w],'team', startOfSeason).. '</li>'
				else
					national_team = mw.wikibase.getEntity( mt[i][w] )
					-- calculate s for national team item
					a, b = pcall(fooA, 'numeric-id', national_team, 'P31', 1) -- test if country
					if a == true and b == 20738667 then -- Q20738667 = national cycling team U23
						if wiki == 'fr' or wiki == 'www' then s =  ' espoirs' else s = ' U23' end 
						if wiki == 'mk' then s = ' под 23 години' end
					elseif a == true and b == 23726798 then s = '' end -- Q23726798 = national cycling team

					a, b = pcall(fooA, 'numeric-id', national_team, 'P17', 1) -- test if country
					if a == true then
						local nation = mw.wikibase.getEntityObject( 'Q'..b )
						nationality = nation:getLabel() or nation:getLabel('en') or nation:getLabel('fr') or nation:getLabel('de')
					end

					if national_team:getSitelink() == nil then
						team = nationality.. s
					else
						team = WPlink(mt[i][w], 'team', startOfSeason)
						ii, jj = mw.ustring.find(team, "|")
						if ii ~= nil and jj ~= nil then
		 					jj=jj+1
  							team = mw.ustring.sub(team,1,ii).. nationality..s.. ']]'
						end
					end
					mu[i]['val'] = mu[i]['val'] ..  team ..'</li>'
				end
			end
		end
		mu[i]['val'] = mu[i]['val'] .. '</ol>'
	end --if mt[i][1] ~= ''
end

table.sort(mu, function(a,b) return a.index<b.index end)

for i=1, table.getn(mu) do
	if mu[i].val ~= nil then v = v .. mu[i].val end
end

v = v .. '<table border="0" cellspacing="0" cellpadding="0" style="line-height:0em;width:20em;margin:0.5em 0em;border-top:2px solid #FFDF80;"><th>'..
'<span style="float:right">[[File:Wikidata-logo S.svg|12px|link=d:'.. frame.args[1].. '#P1923]]</span></th></table>'

return '<table style="max-width:95%; padding:0.5em; margin-right:1em; border:1px solid rgb(200,200,200)"><tr><td>'..
v.. '</td></tr></table>'
end
function getSquadTableColumn(x)

	local wiki,l10n=mw.site.server 
	if wiki=='//www.wikidata.org' then l10n=loadI10n.getSquadTableColumn["fr"]
	else l10n=loadI10n.getSquadTableColumn[string.sub(wiki,string.find(wiki,"%a+"))] end
	return l10n[x]
end

function infobox_translate(x)
	local l10n = loadI10n.infobox_translate[mw.site.server]
	if not l10n then l10n = loadI10n.infobox_translate["//en.wikipedia.org"] end  -- default
	return l10n[x]
end 
function unit_of_time(x)
	local l10n = loadI10n.unit_of_time[mw.site.server]
	if not l10n then l10n = loadI10n.unit_of_time["//www.wikidata.org"] end  -- default for lv,cs,en,ca,hu,ro,pt,pl,sv
	return l10n[x]
end

function unit(wiki,x)

	local l10n = loadI10n.unit[wiki]
	if not l10n then l10n = loadI10n.unit["www"] end  -- default for lv,cs,en,ca,ro,pt,pl,sv
	return l10n[x]
end

function number(gender, b, wiki)
local str
if b=="" then return "" end
str = b .. ". "
if wiki == "ca" then 
	if b==1 then str = b.."r" end
	if b==2 then str = b.."n" end
	if b==3 then str = b.."r" end
	if b==4 then str = b.."t" end	
	if b>4  then str = b.."è" end
end
if wiki=="es" then str = b..".º" end
if wiki=="fr" or wiki=="www" then 
	if b==1  then
		if gender == 'm' then str="1<sup>er</sup>"
		elseif gender == 'f' then str="1<sup>re</sup>"
		else str="1<sup>e</sup>" end
	else str=b.."<sup>e</sup>" end
end
if wiki=="nl" then str=b.."e" end
if wiki=="ru" then str=b.."-й" end
if wiki=="eo" then str=b.."-a" end
return str
end

function calculate_time(wiki, t)
local time = tonumber(t)
local h, m, s = 0, 0, 0
local str=''

if time == nil then return '' end
if time < 60 then s = time 
elseif time < 3600 then m = math.modf(time/60) s = time - m*60
else h = math.modf(time/3600) m = math.modf((time - h*3600)/60)  s = time - h*3600 - m*60
end

if h>0 then str = str..mw.ustring.format ('%i'..unit(wiki,2), h) end
if m>0 and h>0 then str = str.. mw.ustring.format('%02i'..unit(wiki,3), m) end
if m>0 and h==0 then str = str.. mw.ustring.format('%i'..unit(wiki,3), m) end
if s>=0 and (h>0 or m>0) then str = str.. mw.ustring.format('%02i'..unit(wiki,4), s) end
if s>=0 and h==0 and m==0 then str = str.. mw.ustring.format('%i'..unit(wiki,4), s) end
return str --time..': '..h..' '..m..' '..s
end

function p.pointsclassification(frame)
local s = {
	header_function = headoftableII, -- translations are in function headoftaböleII
	header_1 = 10, -- translation 10 in function headoftableII is printed in the upper part of the table header
	header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header
	item = string.gsub(frame.args[1], "%c", ""),
	property = 'P3494', -- property to use for this table
	team_classification = false, -- it is not a team classification table, its a rider classification table
	background = true -- there is a background color for the first row
	}
return new_classification(frame, s)
end

function p.teamsclassificationbytime(frame)
local s = {
	header_function = headoftableII, -- translations are in function headoftaböleII
	header_1 = 14, -- translation 10 in function headoftableII is printed in the upper part of the table header
	header_2 = {3, 2, 4}, -- translations 3, 2, 4 in function headoftableII are printed in this order in the lower part of the table header
	item = frame.args[1],
	property = 'P3497', -- property to use for this table
	team_classification = true, -- it is a team classification table, its not a rider classification table
	background = false -- there is no background color for the first row
	}
return new_classification(frame, s)
end

function p.teamsclassificationbypoints(frame)
local s = {
	header_function = headoftableII, -- translations are in function headoftaböleII
	header_1 = 15, -- translation 10 in function headoftableII is printed in the upper part of the table header
	header_2 = {3, 2, 7}, -- translations 3, 2, 7 in function headoftableII are printed in this order in the lower part of the table header
	item = frame.args[1],
	property = 'P3496', -- property to use for this table
	team_classification = true, -- it is a team classification table, its not a rider classification table
	background = false -- there is no background color for the first row
	}
return new_classification(frame, s)
end

function p.stageclassification(frame)
local s = {
	header_function = headoftableII, -- translations are in function headoftaböleII
	header_1 = 8, -- translation 10 in function headoftableII is printed in the upper part of the table header
	header_2 = {1, 2, 3, 4}, -- translations 1, 2, 3, 4 in function headoftableII are printed in this order in the lower part of the table header
	item = frame.args[1],
	property = 'P2417', -- property to use for this table
	team_classification = false, -- it is not a team classification table, its a rider classification table
	background = false -- there is no background color for the first row
	}
return new_classification(frame, s)
end

function p.generalclassification(frame)
local s = {
	header_function = headoftableII, -- translations are in function headoftaböleII
	header_1 = 9, -- translation 10 in function headoftableII is printed in the upper part of the table header
	header_2 = {1, 2, 3, 4}, -- translations 1, 2, 3, 4 in function headoftableII are printed in this order in the lower part of the table header
	item = frame.args[1],
	property = 'P2321', -- property to use for this table
	team_classification = false, -- it is not a team classification table, its a rider classification table
	background = true -- there is a background color for the first row
	}
return new_classification(frame, s)
end

function p.teamtimetrialclassification(frame)
local s = {
	header_function = headoftableII, -- translations are in function headoftaböleII
	header_1 = 8, -- translation 10 in function headoftableII is printed in the upper part of the table header
	header_2 = {3, 2, 4, 5, 6}, -- translations 3, 2, 4, 5, 6 in function headoftableII are printed in this order in the lower part of the table header
	item = frame.args[1],
	property = 'P2417', -- property to use for this table
	team_classification = true, -- it is a team classification table, its not a rider classification table
	background = false -- there is no background color for the first row
	}
return new_classification(frame, s)
end

function new_classification(frame, s)
local wiki = wiki
local country = true

if wiki == 'da' then country = false end -- those wikis do not want to show the country clumn as standard
local s = s
local h = {
	rider={1, "", "", "", '', ""}, -- rank, rider ID, riderGender, nationality ID, flag ID, team ID
	jersey={""}, -- lots of jerseyID
	value={'', '', '', ''} -- points, time, time_gap, speed
	}
local available_list = available_list
local entity = mw.wikibase.getEntityObject( s.item )

--[=[ It is possible to give the classification tables in the article commands to change the standard behaviour. They could look like this:
{{Cycling race/teamsclassificationbytime|Q18574623|newline=false|country=true}}
{{Cycling race/teamsclassificationbytime|Q18574623|country= false|newline=false}}
{{Cycling race/teamsclassificationbypoints|Q18574623|newline =true|country=true}}
{{Cycling race/teamsclassificationbypoints|Q18574623|newline= true}}
{{Cycling race/teamsclassificationbypoints|Q18574623|newline = false|country=false}}
{{Cycling race/teamsclassificationbytime|Q18574623|newline=true|country=true}}

One additional parameter is "newline" with the values "true" or "false". "newline" says, if there is a line brake after the table. Standard is 
no line break after the tables stageclassification and teamtimetrialclassification. 
The second parameter is "country" with the values "true" or "false". "country" tells the module to print the country column or not. 
Most wikis have as standard to print the country columns, some wikis prefer as standard not to show the country column. A few lines above, 
the command "if wiki == 'da' then country = false end" tells that daWiki do not want to see the country colums as standard. You can add your wiki
here in, if you do not want to see them as standard. With the new parameter editors are able to tell the module in the article what to do.  
]=]

local function jersey(h)
local jersey
local jersey_name
local jersey_string = ' '

if type(h) == 'table' and h[1] ~= '' then
	for i,k in ipairs(h) do
		local entity_jersey = mw.wikibase.getEntity(h[i])
		pcall(function()
			jersey = 'File:'.. entity_jersey.claims['P18'][1].mainsnak.datavalue.value
			jersey_name = entity_jersey:getLabel() or entity_jersey:getLabel( 'en' ) or entity_jersey:getLabel( 'fr' ) or ''
			if jersey_name~='' then jersey_string = jersey_string .. '[['..jersey..'|20px|'..jersey_name..']]'
			else jersey_string = jersey_string .. '[['..jersey..'|20px]]'
			end
		end)
	end
	return jersey_string
else return ''
end
end -- function end

local startOfSeason = '' --'+2016-01-01T00:00:00Z'
pcall(function() startOfSeason = entity.claims["P580"][1].mainsnak.datavalue.value.time end)
if startOfSeason == '' then
	if pcall(function() startOfSeason = entity.claims["P585"][1].mainsnak.datavalue.value.time end) then
	else
		local Sitelink = entity:getSitelink('arwiki') or  entity:getSitelink('enwiki') or entity:getSitelink('frwiki') or entity:getSitelink('dewiki') or ''
		if Sitelink == '' then return '> Wikidata is missing data about the start time (P580) and end time (P582) of the season'
		else startOfSeason = '+'..string.match(Sitelink, '%d%d%d%d' ) ..'-01-01T00:00:00Z' 
		end
	end
end

local v = ''
local plus = ''
local localFrame
if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name
then localFrame = frame:getParent() else localFrame = frame end
if localFrame.args[1] ~= nil then localFrame.args[1] = string.gsub(localFrame.args[1], "%c", "") end

if localFrame.args.country ~= nil then -- switch country column on or off in the article
	if localFrame.args.country == 'true' then country = true end
	if localFrame.args.country == 'false' then country = false end
end

local tableHeader2_size = table.getn(s.header_2)

local tableStart = '<table border="0" cellspacing="0" cellpadding="0"><th colspan="'.. tostring(tableHeader2_size + 1) .. '"'..
	' style="padding:2px 2px; text-align:center; background-color:#FFDF80">'

local tableHeader1 = '<span style="float:right">[[File:Wikidata-logo S.svg|12px|link=d:'..
	s.item.. '#'.. s.property..']]</span>'.. s.header_function (wiki, s.header_1)

local tableHeader2 = '<tr>'
for i,k in ipairs(s.header_2) do
	if i==2 and available_list==true and country == true then tableHeader2 = tableHeader2.. '<th nowrap style="text-align:center;padding:2px 2px">'.. s.header_function (wiki, k) end
	if i==2 and available_list==true  then tableHeader2 = tableHeader2.. '<th nowrap style="text-align:center;padding:2px 2px">'.. s.header_function (wiki, k) end
	if i>=3 then
		if i ~= tableHeader2_size then tableHeader2 = tableHeader2.. '<th nowrap style="text-align:center;padding:2px 2px">'.. s.header_function (wiki, k).. '</th>'
		else tableHeader2 = tableHeader2..'<th nowrap style="text-align:center;padding:2px 2px">'.. s.header_function (wiki, k) .. '</th>'
		end
	end
end
tableHeader2 = tableHeader2.. '</th></tr>'

local tableBody = ''
pcall(function()
	local t_Body = {}
	local bg_color=""
	local nr_jersey
	for l, m in pairs(entity.claims[s.property]) do -- look into all statements
		h.rider[1]=''
		local rank
		pcall(function()
			for _, v in pairs(m.qualifiers['P1352']) do -- for property 'rank'
				rank = tonumber(v.datavalue.value.amount) break
			end
			h.rider[1] = rank
			end)
		local riderID = 'Q'.. m.mainsnak.datavalue.value['numeric-id']
		if s.team_classification == false then
			h.rider[2] = WPlink(riderID, 'pure')
			h.rider[6] = national_team(wiki, riderID, startOfSeason, entity, s.property, l)
		end

		a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject( riderID ), 'P21', 1)
		if a == true then 
			if b == 6581097 then h.rider[3] = 'm' end -- men
			if b == 6581072 then h.rider[3] = 'f' end -- female
		end

	   	pcall(function() -- for property 'points' P1358
			for _, v in pairs(m.qualifiers['P1358']) do h.value[1] = tonumber(v.datavalue.value.amount)	end
		end)

	   	pcall(function() -- for property 'race time' P2781
			for _, v in pairs(m.qualifiers['P2781']) do	h.value[2] = tonumber(v.datavalue.value.amount)	end
		end)

	   	pcall(function() -- for property 'time gap' P2911
			for _, v in pairs(m.qualifiers['P2911']) do	h.value[3] = tonumber(v.datavalue.value.amount)	end
			plus = '+ '
		end) 

	   	pcall(function() -- for property 'speed' P2052
			for _, v in pairs(m.qualifiers['P2052']) do h.value[4] = tonumber(v.datavalue.value.amount) end
		end)

		pcall(function() -- for property 'distinctive jersey'
			h.jersey= {''}
			nr_jersey = 1
			for _, v in pairs(m.qualifiers['P2912']) do
				h.jersey[nr_jersey] = 'Q'..v.datavalue.value['numeric-id']
				nr_jersey = nr_jersey + 1
			end
		end)

		if s.team_classification == true then
			h.rider[6] = transform(riderID, 't', startOfSeason)
		end

		if s.team_classification == false then
			local a, b = timeStartEnd(riderID, "P27", 'numeric-id', startOfSeason)
	   		if a == true then
	   			h.rider[5] = flag('Q'..b, startOfSeason)
				if available_list == true and country == true then
	   				if type( translations.list ) == "function" then h.rider[4] = translations.list('Q'..b) end
	   				if h.rider[4] == '' then
	   					local country = mw.wikibase.getEntityObject( 'Q'..b )
	   					h.rider[4] = country:getLabel('ar') or country:getLabel('en') .. ' (en)'
	   				end
				end
   			end
		end
   		if s.team_classification == true then
			local a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject( riderID ), 'P17', 1)
			if a == true then
				a, b = timeStartEnd(riderID, "P17", 'numeric-id', startOfSeason)
  				if a == true then
	   				h.rider[5] = flag('Q'..b, startOfSeason)
					if available_list == true and country == true then
	   					if type( translations.list ) == "function" then h.rider[4] = translations.list('Q'..b) end
	   					if h.rider[4] == '' then
	   						local country = mw.wikibase.getEntityObject( 'Q'..b )
	   						h.rider[4] = country:getLabel('ar') or country:getLabel('en') .. ' (en)'
	   					end
					end
				end
			end
 		end

		local tBody = '<tr'
		-- find the right background color if a rider has more then one jersey
		-- see Wikidata:WikiProject Cycling/Kit to translate/Jerseys
		if h.jersey[1] ~= '' then
			local num = 1 -- loop for more then one jersey per rider
			while h.jersey[num] ~= nil and h.jersey[num] ~= '' do
				if h.jersey[num] == "Q24257872" then bg_color="#FF8666" break end -- Jersey red.svg
				if h.jersey[num] == "Q24257763" then bg_color="pink" -- Jersey pink.svg
					if wiki == "ca" then bg_color="lightpink" end
				break end
				if h.jersey[num] == "Q24257871" then bg_color="#FFFF99" break end -- Jersey yellow.svg
				if h.jersey[num] == "Q26696171" then bg_color="#FFFFFF" break end -- Jersey white.svg
				if h.jersey[num] == "Q24687408" then bg_color="#99CBFF" break end -- Jersey blue.svg
				if h.jersey[num] == "Q26945272" then bg_color="#BF80FF" break end -- Jersey violet.svg
				if h.jersey[num] == "Q24257991" then bg_color="#FFD700" break end -- Jersey gold.svg		
				if h.jersey[num] == "Q24258056" then bg_color="#FFD030" break end -- Jersey orange.svg		
				if h.jersey[num] == "Q24258125" then bg_color="#BFFF80" break end -- Jersey green 2.svg
				if h.jersey[num] == "Q24645209" then bg_color="#90EE90" break end -- Jersey green.svg	
				if h.jersey[num] == "Q27114205" then bg_color="#808080" break end -- Jersey black.svg
				if h.jersey[num] == "Q25831179" then bg_color="#FFFFFF" break end -- Jersey white.svg
				if h.jersey[num] == "Q26919974" then bg_color="#FF8666" break end -- Jersey red.svg
				if h.jersey[num] == "Q24687409" then bg_color="#99CBFF" break end -- Jersey blue.svg
				if h.jersey[num] == "Q25265938" then bg_color="#BF80FF" break end -- Jersey violet.svg			
				num = num + 1
			end
		end

		if l == 1 and s.background == true then
			tBody = tBody ..' style="font-weight:bold;' -- winner is formated bold
			if h.jersey[1] ~= '' and bg_color ~= nil then -- background color of winner depending on jersey
				tBody = tBody ..'background-color:'..bg_color..'"'
			else tBody = tBody ..'"' end
		end

		tBody =  tBody .. '><td nowrap style="text-align:center;padding:2px 0.5em 2px 0.5em">'.. number(h.rider[3], h.rider[1], wiki).. '</td><td style="text-align:right;padding:0 0.2em 0 0.2em">'
		if s.team_classification == false then
			if h.rider[6]==nil then h.rider[6]='' end
			if available_list==false then tBody = tBody..h.rider[5].. ' '.. h.rider[2].. jersey(h.jersey)..'</td><td>'.. h.rider[6]
			else
				if country == true then tBody = tBody.. h.rider[2].. jersey(h.jersey)..'</td><td>'.. h.rider[5]..' '.. h.rider[4].. '</td><td style="text-align:right;padding:0 0.2em 0 0.2em">'.. h.rider[6]
				else tBody = tBody.. h.rider[5].. ' '.. h.rider[2].. jersey(h.jersey)..'</td><td style="text-align:right;padding:0 0.2em 0 0.2em">'.. h.rider[6] end
			end
		else
			if available_list==false then tBody = tBody.. h.rider[5].. ' '.. WPlink(riderID, 'team', startOfSeason)
			else
				if country == true then tBody = tBody.. WPlink(riderID, 'team', startOfSeason).. '</td><td>'.. h.rider[5].. ' '.. h.rider[4]
				else tBody = tBody.. h.rider[5].. ' '.. WPlink(riderID, 'team', startOfSeason) end
			end
		end
		tBody = tBody.. '</td>'

		if s.header_2[4]==4 then -- for table stageclassification, generalclassification, adds time and time gap
			if l == 1 then tBody = tBody.. '<td style="text-align:right;padding:0 0.2em 0 0.2em">'.. calculate_time(wiki, h.value[2]).. '</td>'
			else tBody = tBody.. '<td style="text-align:right;padding:0 0.2em 0 0.2em">'.. plus.. calculate_time(wiki, h.value[3]).. '</td>' 
			end
		end

		if s.header_2[4] == 7 then -- for table pointsclassification, adds points
			tBody = tBody.. '<td style="text-align:right;padding:0 0.2em 0 0.2em">'.. h.value[1].. '<span style="font-size:80%">'
			if type(h.value[1]) == "number" then if h.value[1] > 1 then tBody = tBody..unit(wiki,7) else tBody = tBody..unit(wiki,6) end end 
			tBody = tBody.. '</span>' .. '</td>' 
		end

		if s.header_2[3] == 4 then
			if s.property == 'P2417' then -- for table teamtimetrialclassification, adds time
				tBody = tBody.. '<td style="text-align:right;padding:0 0.2em 0 0.2em">'.. calculate_time(wiki, h.value[2]) .. '</td>' 
			end
		end
	
		if s.property == 'P3497' then -- for table teambytimeclassification, adds time and time gap
			if l == 1 then tBody = tBody.. '<td style="text-align:right;padding:0 0.2em 0 0.2em">'.. calculate_time(wiki, h.value[2]) .. '</td>'
			else tBody = tBody.. '<td style="text-align:right;padding:0 0.2em 0 0.2em">'.. plus.. calculate_time(wiki, h.value[3]) .. '</td>'
			end				
		end

		if s.property == 'P3496' then -- for table teambypointsclassification, adds points
			tBody = tBody.. '<td style="text-align:right;padding:0 0.2em 0 0.2em">'.. h.value[1].. '<span style="font-size:80%">'
			if type(h.value[1]) == "number" then if h.value[1] > 1 then tBody = tBody..unit(wiki,7) else tBody = tBody..unit(wiki,6) end end 
			tBody = tBody.. '</span>' .. '</td>' 				
		end

		if s.header_2[4] == 5 then -- for table teamtimetrialclassification, adds time gap
			tBody = tBody.. '<td style="text-align:right;padding:0 0.2em 0 0.2em">'
			if l > 1 then tBody = tBody.. plus end
			tBody = tBody.. calculate_time(wiki, h.value[3]) .. '</td>'
		end
		
		if s.header_2[5] == 6 then -- for table teamtimetrialclassification, adds speed
			tBody = tBody.. '<td style="text-align:right;padding:0 0.2em 0 0.2em">'
			if type(h.value[4]) == "number" then tBody = tBody.. mw.ustring.format('%.3f', h.value[4]).. 
				'<span style="font-size:80%">'..  unit(wiki, 5).. '</span>'.. '</td></tr>'	
			end
		end	

		if rank ~= nil then	t_Body[rank] = tBody.. '</tr>' end -- sort table row into the right row
	end
	for _, m in pairs(t_Body) do tableBody = tableBody..m end
end)

local tableEnd = '</th></table>'

local tableStyle, tableNewline
if localFrame.args.newline == 'false' then -- parameter newline in WP article is 'false'
	tableStyle = "float:right; margin-right:0.5em; border:1px solid rgb(200,200,200)"
	tableNewline = ''
end
if localFrame.args.newline == 'true' then -- parameter newline in WP article is 'true'
	tableStyle = "border:1px solid rgb(200,200,200)" 
	tableNewline = '<br>' -- '<br style="clear:right;">'
end
if localFrame.args.newline == nil then -- no second parameter, compatible to the old code
	if s.property == 'P2417' then --stageclassification
		tableStyle = "float:right; margin-right:0.5em; border:1px solid rgb(200,200,200)"
		tableNewline = ''
	else
		tableStyle = "border:1px solid rgb(200,200,200)" 
		tableNewline = '<br>' -- '<br style="clear:right;">' -- everything else
	end
end

return '<table style="'.. tableStyle.. '"><tr><td>'..
	tableStart.. tableHeader1.. tableHeader2.. tableBody.. tableEnd.. '</td></tr></table>'.. tableNewline
end

function references(entity, property, var1)
	local wiki = string.match(mw.site.server, "%a+")
	local ref1, ref2, ref2b, ref3, ref4 = "", " ", "", "", ""
	local url, ref
	local lang = mw.language.getContentLanguage()
	local a, b

	if wiki == 'www' then wiki = 'fr' lang = mw.getLanguage('fr') end

	a, b = pcall(fooB, 'value', entity, property, var1, 1, 'P854', 1) -- url
	if a == true then ref1 = b end
	a, b = pcall(fooB, 'text', entity, property, var1, 1, 'P1476', 1) -- Originaltitel der webpage, "language": "fr"
	if a == true then 
		ref2 = b 
		ref2b= entity.claims[property][var1].references[1].snaks['P1476'][1].datavalue.value.language or ''
		if ref2b == wiki then ref2b = '' else ref2b = '(' .. ref2b .. ') ' end
	end
	a, b = pcall(fooB, 'time', entity, property, var1, 1, 'P577', 1) -- publication date
	if a == true then
		local _, _, year, m, d = string.find(b,"(%d+)-(%d+)-(%d+)")
		if d ~= '00' and m ~= '00' then
			if wiki == "de" then ref3 = ', ' .. lang:formatDate( "j. F Y", b) 
			elseif wiki == "ar" then ref3 = ', ' .. lang:formatDate( "j F Y", b) .. '.' 
			elseif wiki == "en" then ref3 = ', ' .. lang:formatDate( "Y F, j", b) .. '.' 
			elseif wiki == "fr" then ref3 = ', ' .. lang:formatDate( "j F Y", b)
			else ref3 = ', ' .. func_date (b, wiki, 'long') .. '.'  --lang:formatDate( "j n Y", b) .. '.' 
			end
		elseif d == '00' and m ~= '00' then
			d = '01'
			if wiki == "de" then ref3 = ', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d ) 
			elseif wiki == "ar" then ref3 =', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d )..'.'
			elseif wiki == "en" then ref3 =', ' .. lang:formatDate( "Y F", year..'-'..m..'-'..d )..'.'
			elseif wiki == "fr" then ref3 =', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d )				
			else ref3 = ', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d )..'.'
			end
		else ref3 = year 
		end
	end
	a, b = pcall(fooB, 'time', entity, property, var1, 1, 'P813', 1) -- Retrieved
	if a == true then 
		if wiki == "de" then ref4 = ", (abgerufen am " .. lang:formatDate( "j. F Y", b).. ')'
		elseif wiki == "ar" then ref4 = " Retrieved " .. lang:formatDate( "j F Y", b) .. '.'
		elseif wiki == "en" then ref4 = " Retrieved " .. lang:formatDate( "Y F, j", b) .. '.'
		elseif wiki == "fr" then ref4 = " (consulté le " .. lang:formatDate( "j F Y", b) .. ')'
		else ref4 = " Retrieved " .. func_date (b, wiki, 'long').. '.' --lang:formatDate( "j n Y", b) .. '.'
		end
	end

	if ref1~='' then --and ref2~='' then
		local _, start = string.find( ref1, '//' ) 
		local ende, _ = string.find( ref1, '/', start + 1 )
		local s = string.sub(ref1, start + 1, ende - 1) 
		local s2 = string.gsub(s, "www.", "")
		if wiki == "fr" then 
		-- fr: "(en) « Lloyd Mondory ... EPO », sur velonews.competitor.com (consulté le 30 april 2016), 30 octobre 2015." 
			if ref2~=' ' then url= ', sur <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end
			ref = ref2b .. '« ['.. ref1.. ' '.. ref2.. '] »' .. url .. ref4 .. ref3 ..'.'
		elseif wiki == "en" then 
		-- en: "Inflation ... recession", Pittsburgh Post-Gazette, October 16, 2009. Retrieved 2010-01-21.
			if ref2~=' ' then url= ', <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end
			ref = '"['.. ref1.. ' '.. ref2.. '"]'.. ref2b .. url .. ref3 .. ref4			
		elseif wiki == "de" then 
			if ref2~=' ' then url= ' In: <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end			
			ref = '<span style="font-style:italic;">['.. ref1.. ' '.. ref2.. '.]</span> '.. url.. ref3 .. ref4 ..'.'
		else 
			if ref2~=' ' then url= ' <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end			
			ref = ref2b .. '['.. ref1.. ' '.. ref2.. '] ' .. url.. ref3 .. ref4 
		end
--	end-- end if wiki == 'www'	
return ref or ''
else return ''
end 
end


function p.infobox(frame)
	local t = {is_a="", class="", stage="", starttime="", endtime="", time="", date="", dates="", length="", length_unit="", 
	startplace="", endplace="", nr_teams="", nr_participants_start="", nr_participants_end="", speed="", speed_unit="", cost="", cost_unit="", 
	first="", first_team="", second="", second_team="", third="", third_team="", winner_point="", winner_point_team="", winner_mountain="", winner_mountain_team="", 
	winner_sprint="", winner_sprint_team="", winner_young="", winner_young_team="", winner_fighting="", winner_fighting_team="", winner_combination="", 
	winner_combination_team="", winner_metas_volantes="", winner_metas_volantes_team="", winner_regularity="", winner_regularity_team="", 
	winner_fuga_pinarello="", winner_fuga_pinarello_team="", winner_azzurri_ditalia="", winner_azzurri_ditalia_team="", winner_team="", 
	winner_team_points="", previous="", next=""}
	local ref = {stage="", starttime="", endtime="", time="", date="", dates="", length="", nr_participants_start="", nr_participants_end="", 
	speed="", speed_unit="", cost="", first="", second="", third="", winner_point="", winner_mountain="", winner_sprint="", winner_young="", 
	winner_fighting="", winner_metas_volantes="", winner_regularity="", winner_combination="", winner_fuga_pinarello="", winner_azzurri_ditalia="", 
	winner_team="", winner_team_points=""}
	local tt = {icon="", picture="", caption="", name="", nr="", map="" }
	local ttt = {tour={}, country={}}
	local tttt = {special_1a="", special_1b="", special_2a="", special_2b=""}
	
	local entity = ""
	local y, m, d = "", "", ""
	local y2, m2, d2 = "", "", ""
	local a, b, c, k, num, i
	local entityId = frame.args[1]
	local lang = mw.language.getContentLanguage()
	local wiki = string.match(mw.site.server, "%a+")
	local results = false
	local a1, b1, c1, a2, b2, c2
	local timeofrace

	if type( entityId ) ~= 'string' then error( 'parameter must be a string') end
	if not entityId:match( 'Q%d+' ) then error ( 'parameter must be a valid Wikidata item (ex: Q42)' ) end
	local entity = mw.wikibase.getEntity( entityId )

	local localFrame 
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name 
	then localFrame = frame:getParent() else localFrame = frame end

	if localFrame.args[infobox_translate(29)] then tt.picture = localFrame.args[infobox_translate(29)] end 
	if localFrame.args[infobox_translate(30)] then tt.caption = localFrame.args[infobox_translate(30)] end 
	if localFrame.args[infobox_translate(31)] then tt.map = localFrame.args[infobox_translate(31)] end 

	if  entity:getLabel() ~= nil then tt.name = entity:getLabel()
	else
		if entity:getLabel( 'fr' ) ~= nil then tt.name = entity:getLabel( 'fr' ).. " (fr)"
		else tt.name = "Wikidata doesn´t know" end 
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P641', 1) 
	if a == true then -- icon for road bicycle racing, Q3609 (road bicycle racing)
		if b == 3609 then tt.icon = " [[File:Cycling (road) pictogram.svg|35px]]" end 
	end
	a, b = pcall(fooA, 'value', entity, 'P18', 1) 
	if a == true and tt.picture == "" then 
		local v
		tt.picture = b
		if pcall(foo3, entity, "P18", 1, "P2096", 1) then
			for _, v in pairs(entity.claims["P18"]) do
				for num=1,#v.qualifiers["P2096"] do
					if v.qualifiers["P2096"][num].datavalue.value.language == lang:getCode() then
					tt.caption = v.qualifiers["P2096"][num].datavalue.value.text end
				end
			end
		end
	end
	
	-- For FR Wiki and Wikidata, exception that permit to display 1er, 2e... for the edition number ; 
	-- for RU Wiki, -й is written after the value of P393
	a, b = pcall(fooA, 'value', entity, 'P393', 1)
	if a == true and tt.nr == "" then
		tt.nr = b .. ". "
		if wiki == "fr" or wiki == "www" then
			if b == 1  then tt.nr = "1<sup>re</sup> " else tt.nr = b .."<sup>e</sup> " end end
		if wiki == "nl" then tt.nr = b .."e " end
		if wiki == "ru" then tt.nr = b .."-й " end
		if wiki == "eo" then tt.nr = b .."-a " end
		if wiki == "cs" then tt.nr = b ..". " end
		if wiki == "hu" then tt.nr = b .."-ik " end
	end
	-- Class of a cycling race. Class is: 1.UWT, 2.UWT, 1.HC, ... add new classes, no problem
	local class = { "Q22231106", "Q22231107", "Q22231108", "Q22231109", "Q22231110", "Q22231111", "Q22231112",
		"Q22231113", "Q22231114", "Q22231115", "Q22231116", "Q22231117", "Q22231118", "Q22231119", "Q23015458", "Q23005601", "Q23005603" } 
	a, b = pcall(fooA, 'numeric-id', entity, 'P31', 1) -- first value for P31
	c, d = pcall(fooA, 'numeric-id', entity, 'P31', 2) -- second value for P31
	if a == true and c == true then -- for two values
		for i=1,#class do -- #class = number of elements in class
   			if "Q"..b == class[i] then t.class = "c"..b t.is_a = "Q"..d break end
   			if "Q"..d == class[i] then t.class = "c"..d t.is_a = "Q"..b break end  		
   		end
 	else -- if there is only one value, assume it is not a class
		if a == true or c == true then t.is_a = "Q"..b end
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P361', 1) -- Competition of the cycling race : UCI World Tour 2016, UCI Europe Tour 2016...
	if a == true then --ttt.tour = "Q" .. b end
		local i, v
		for i, v in pairs(entity.claims["P361"]) do
			ttt.tour[i] = "T" .. v.mainsnak.datavalue.value["numeric-id"]
		end
	end

	if t.stage == "" then
		if pcall(function() -- This function count the number of value for P527 to determine the number of stages
			t.stage = table.getn(entity.claims["P527"])
		end
		) then else t.stage = "" end
	end

	a1, b1, c1 = pcall(fooA, 'time', entity, 'P580', 1) 
	if a1 == true and t.starttime == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'time', entity, 'P580', i) 
		end  
		--b1 = "+2015-07-04T00:00:00Z"
		_, _, y, m, d = string.find(b1, "(%d+)-(%d+)-(%d+)")  
	end
	a2, b2, c2 = pcall(fooA, 'time', entity, 'P582', 1) 
	if a2 == true and t.endtime == "" then i = 1
		while a2 == true and c2 == 'deprecated' do 
			i = i + 1 
			a2, b2, c2 = pcall(fooA, 'time', entity, 'P582', i) 
		end  
		--b2 = "+2015-07-05T00:00:00Z"
		_, _, y2, m2, d2 = string.find(b2, "(%d+)-(%d+)-(%d+)")
	end
	if a1 == true and t.starttime == "" then 
		if y ~= y2 then t.starttime = lang:formatDate( "j F Y", b1 ) 
		elseif m ~= m2 then t.starttime = lang:formatDate( "j F", b1 )
		else t.starttime = lang:formatDate( "j", b1 )
		end
		if wiki == "ar" then 
			if y ~= y2 then t.starttime = lang:formatDate( "d F Y", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "d F", b1 )	
			else t.starttime = lang:formatDate( "d F", b1 )
			end	end	
		if wiki == "br" then 
			if y ~= y2 then t.starttime = lang:formatDate( "j", b1 ) .." a viz ".. lang:formatDate( "F Y", b1 )		
			elseif m ~= m2 then t.starttime = lang:formatDate( "j", b1 ) .." a viz ".. lang:formatDate( "F", b1 )		
			else t.starttime = lang:formatDate( "j", b1 ) .." "	
			end	end	
		if wiki == "ca" or wiki == "es" then 
			if y ~= y2 then t.starttime = lang:formatDate( "j", b1 ) .." de ".. lang:formatDate( "F", b1 ) .." de ".. lang:formatDate( "Y", b1 )
			elseif m ~= m2 then t.starttime = lang:formatDate( "j", b1 ) .." de ".. lang:formatDate( "F", b1 )		
			else t.starttime = lang:formatDate( "j", b1 ) .." "	
			end	end	
		if wiki == "cs" then 
			if y ~= y2 then t.starttime = lang:formatDate( "j. xg Y", b1 )
			elseif m ~= m2 then t.starttime = lang:formatDate( "j. xg", b1 )
			else t.starttime = lang:formatDate( "j", b1 )
			end	end	
		if wiki == "de" or wiki == "da" or wiki == "fi" or wiki == "fo" or wiki == "no" then  
			if y ~= y2 then t.starttime = lang:formatDate( "j. F Y", b1 ) 
			elseif m ~= m2 then t.starttime = lang:formatDate( "j. F", b1 )
			else t.starttime = lang:formatDate( "j.", b1 )
			end	end			
		if wiki == "en" then 
			if y ~= y2 then t.starttime = lang:formatDate( "F d, Y", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "F d", b1 )	
			else t.starttime = lang:formatDate( "F d", b1 )
			end	end						
		if wiki == "eo" then 
			if y ~= y2 then t.starttime = lang:formatDate( "j", b1 ) .."-a de ".. lang:formatDate( "F Y", b1 )		
			elseif m ~= m2 then t.starttime = lang:formatDate( "j", b1 ) .."-a de ".. lang:formatDate( "F", b1 )		
			else t.starttime = lang:formatDate( "j", b1 ) .."-a "	
			end	end	
		if wiki == "eu" then 
			if y ~= y2 then t.starttime = lang:formatDate( "Y", b1 ) ..".eko ".. lang:formatDate( "F", b1 ) .."k ".. lang:formatDate( "j", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "F", b1 ) .."k ".. lang:formatDate( "j", b1 ) 		
			else t.starttime = lang:formatDate( "F", b1 ) .."k ".. lang:formatDate( "j", b1 )
			end	end	
		if wiki == "hu" then 
			if y ~= y2 then t.starttime = lang:formatDate( "Y", b1 ) ..". ".. lang:formatDate( "F j", b1 ) .."." 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "F j", b1 ) .."."
			else t.starttime = lang:formatDate( "F j", b1 ) .."."
			end	end	
		if wiki == "ja" then 
			if y ~= y2 then t.starttime = lang:formatDate( "Y年m月d日", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "Y年m月d日", b1 )	
			else t.starttime = lang:formatDate( "Y年m月d日", b1 )
			end	end			
		if wiki == "lv" then 
			if y ~= y2 then t.starttime = lang:formatDate( "Y. \\g\\a\\d\\a j. F", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "Y. \\g\\a\\d\\a j. F", b1 )	
			else t.starttime = lang:formatDate( "Y. \\g\\a\\d\\a j.", b1 )
			end	end
		if wiki == "pl" then 
			local date_pl = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"}
			if y ~= y2 then t.starttime = lang:formatDate( "j ", b1 ) .. date_pl[tonumber(lang:formatDate( "n", b1 ))] .. lang:formatDate( " Y", b1 ) 
			elseif m ~= m2 then t.starttime = lang:formatDate( "j ", b1 ) .. date_pl[tonumber(lang:formatDate( "n", b1 ))]
			else t.starttime = lang:formatDate( "j", b1 )
			end	end				
	end -- if a1
	if a2 == true and t.endtime == "" then 
		t.endtime = lang:formatDate( "j F Y", b2 ) 
		timeofrace = b2
		if wiki == "br" then t.endtime = lang:formatDate( "j", b2 ) .." a viz ".. lang:formatDate( "F Y", b2 ) end
		if wiki == "ca" or wiki == "es" then t.endtime = lang:formatDate( "j", b2 ) .." de ".. lang:formatDate( "F", b2 ) .." de ".. lang:formatDate( "Y", b2 ) end
		if wiki == "cs" then t.endtime = lang:formatDate( "j. xg Y", b2 ) end
		if wiki == "de" or wiki == "da" or wiki == "fi" or wiki == "fo" or wiki == "no" then t.endtime = lang:formatDate( "j. F Y", b2 ) end
		if wiki == "en" then
			if y ~= y2 then t.endtime = lang:formatDate( "F d, Y", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "F d, Y", b2 )	
			else t.endtime = lang:formatDate( "d, Y", b2 )	
			end	end		
		if wiki == "ar" then
			if y ~= y2 then t.endtime = lang:formatDate( "d F Y", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "d F Y", b2 )	
			else t.endtime = lang:formatDate( "d، Y", b2 )	
			end	end					
		if wiki == "eo" then t.endtime = lang:formatDate( "j", b2 ) .."-a de ".. lang:formatDate( "F Y", b2 ) end		
		if wiki == "eu" then t.endtime = lang:formatDate( "Y", b2 ) ..".eko ".. lang:formatDate( "F", b2 ) .."k ".. lang:formatDate( "j", b2 ) end
		if wiki == "hu" then t.endtime = lang:formatDate( "Y", b2 ) ..". ".. lang:formatDate( "F j", b2 ) .."." end
		if wiki == "ja" then 
			if y ~= y2 then t.endtime = lang:formatDate( "Y年m月d日", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "m月d日", b2 )	
			else t.endtime = lang:formatDate( "d日", b2 )	
			end	end	
		if wiki == "lv" then 
			if y ~= y2 then t.endtime = lang:formatDate( "Y. \\g\\a\\d\\a j. F", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "j. F", b2 )	
			else t.endtime = lang:formatDate( "j. F", b2 )	
			end	end
		if wiki == "pl" then 
			local date_pl = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"}
			t.endtime = lang:formatDate( "j ", b2 ) .. date_pl[tonumber(lang:formatDate( "n", b2 ))] .. lang:formatDate( " Y", b2 ) end				
	end -- if a2

-- This function give a format to dates when P585 (date) is used in a single day race
	a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', 1) 
	if a1 == true and t.time == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', i) 
		end  		
		t.time = func_date (b1, wiki, 'long') 
		timeofrace = b1
	end

	-- This function permits to display an unity (the kilometer) for a distance, with exceptions for macedionan, russian and japanese 
	-- that have other symbols 
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P3157', 1) 
	if a1 == true and t.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P3157', i) 
		end   
		t.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P3157', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t.length_unit = 'km'
			if  wiki == "mk" then t.length_unit = 'км' end
			if  wiki == "ar" then t.length_unit = 'كم' end
			if  wiki == "ru" then t.length_unit = 'км' end
			if  wiki == "ja" then t.length_unit = 'キロメートル' end
		end
	end

	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', 1) 
	if a1 == true and t.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', i) 
		end   
		t.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P2043', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t.length_unit = 'km'
			if  wiki == "mk" then t.length_unit = 'км' end
			if  wiki == "ar" then t.length_unit = 'كم' end
			if  wiki == "ru" then t.length_unit = 'км' end
			if  wiki == "ja" then t.length_unit = 'キロメートル' end
		end
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P17', 1) -- This function gives countries where the race take place
	if a == true then --and ttt.country == "" then ttt.country = "Q" .. b end
		local i, v
		for i, v in pairs(entity.claims["P17"]) do
   			ttt.country[i] = "C" .. v.mainsnak.datavalue.value["numeric-id"]
   		end
 	end			
	-- Function that give the starting place of a race 
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', 1) 
	if a1 == true and t.startplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', i) 
		end   
		t.startplace = "Q" .. b1 
	end	
	-- Function that give the finishing place of a race
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', 1) 
	if a1 == true and t.endplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', i) 
		end   
		t.endplace = "Q" .. b1 
	end	
	-- This function counts the number of value for P1923 (participating teams) and give the number of team that participate at the race
    if pcall(function() 
         t.nr_teams = table.getn(entity.claims["P1923"])
         end        	
      ) then else t.nr_teams = "" end   

	-- Function that give the number of cyclists at the beginning and at the finishing of a race
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', 1) 
	if a1 == true and t.nr_participants_start == "" and t.nr_participants_end == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', i) 
		end 
		local v
		for _, v in pairs(entity.claims["P1132"]) do
			if pcall(function()
		   		if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 529711 then
				t.nr_participants_start = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
				end
			) then else t.nr_participants_start = "" end
			if pcall(function()
				if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 12769393 then
				t.nr_participants_end = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
			end
			) then else t.nr_participants_end = "" end
		end	-- for 	
	end -- if a1

	-- This function permits to display an unity (the kilometer per hour) for an average speed, with exceptions for macedionan, russian and japanese 
	-- that have other symbols
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', 1) 
	if a1 == true and t.speed == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', i) 
		end 
		t.speed = b1
		a1, b1 = pcall(fooA, 'unit', entity, 'P2052', 1)
		if b1 == "http://www.wikidata.org/entity/Q180154" then
			t.speed_unit = 'km/h'
			if  wiki == "da" or wiki == 'fo' or wiki == 'no' then t.speed_unit = 'km/t' end
			if  wiki == "nl" then t.speed_unit = 'km/u' end
			if  wiki == "mk" then t.speed_unit = 'км/ч' end
			if  wiki == "ar" then t.speed_unit = 'كم/س' end
			if  wiki == "ru" then t.speed_unit = 'км/ч' end
			if  wiki == "ja" then t.speed_unit = 'キロメートル毎時' end			
		end
	end	-- if a1
 	-- This function permits to display an unity for the cost of a cycling race
	a, b = pcall(fooA, 'amount', entity, 'P2130', 1)
	if a == true and t.cost == "" then 
		t.cost = b 
		a, b = pcall(fooA, 'unit', entity, 'P2130', 1)
		if b == "http://www.wikidata.org/entity/Q4916" then t.cost_unit = '€' end	
		if b == "http://www.wikidata.org/entity/Q4917" then t.cost_unit = '$' end	
	end

	a, b = pcall(fooA, 'value', entity, 'P242', 1) -- locator map image
	if a == true and tt.map == "" then tt.map = b end
	a, b = pcall(fooA, 'numeric-id', entity, 'P155', 1) 
	if a == true and t.previous == "" then t.previous = "Q"..b end	
	a, b = pcall(fooA, 'numeric-id', entity, 'P156', 1) 
	if a == true and t.next == "" then t.next = "Q"..b end
	
	local note, qual, id, id_team
	-- By entering a value just below, the Wikipedia added will have Wikidata logos associated with cyclists in the infobox	
	if wiki == "www" or wiki == "mk" or wiki == "ja" or wiki == "ru" then note = 'q' 
	elseif wiki == "www" then note = 'م' 
	else note = 'f' end 
	note = 'f'
	-- By entering a value just below, the Wikipedia added will show the team of the winner
	if pcall(foo3, entity, "P1346", 1, "P642", 1) then
		local k, v, vv
		for k, v in pairs(entity.claims["P1346"]) do
			id_team = '' 
			--id_team = 't26973671'
			a, b = pcall(fooC, 'numeric-id', entity, 'P1346', k, 'P54', 1)
			if a == true then id_team = 't'..b end
		
			if pcall(function() id=v.mainsnak.datavalue.value['numeric-id'] end) then else id=nil end -- id = rider id
			if id ~= nil then
				--timeofrace = "+2016-03-00T00:00:00Z" 
				-- function timeStartEnd finds the team of the rider at the time (timeofrace) of the race
				if id_team == '' and timeofrace ~= nil and timeofrace ~= '' then 
					a, b = timeStartEnd('Q'..id, 'P54', 'numeric-id', timeofrace) 
					if a == true and b ~= nil then id_team = 't' .. b end
				end
			end
--			pcall(function() id=v.mainsnak.datavalue.value['numeric-id'] end) -- rider ID
			
			-- looks into race item if the winner has a P54 statement for beeng a member of a national team 
			pcall(function() 			
				for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P54']) do 
					id_team = '2t'.. ' ('.. national_team(wiki, 'Q'..id, timeofrace, entity, 'P1346', k).. ')' 
				end
			end)

			-- looks into race item if the winner has a P642 statement for showing the type of winner (points, mountain, ..)
			pcall(function() 			
				for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P642']) do 
					qual=vv.datavalue.value['numeric-id']

		if id~=nil and qual~=nil and v.rank~='deprecated' then 
			if qual == 20882667 and t.first=="" then t.first=note..id t.first_team=id_team ref.first=references(entity,"P1346",k) results=true end
			if qual == 20882668 and t.second=="" then t.second=note..id t.second_team=id_team ref.second=references(entity,"P1346",k) results=true end
			if qual == 20882669 and t.third=="" then t.third=note..id t.third_team=id_team ref.third=references(entity,"P1346",k) results=true end
			if qual == 20883007 and t.winner_point=="" then t.winner_point=note..id t.winner_point_team=id_team ref.winner_point=references(entity,"P1346",k) results=true end
			if qual == 20883212 and t.winner_mountain=="" then t.winner_mountain=note..id t.winner_mountain_team=id_team ref.winner_mountain=references(entity,"P1346",k) results=true end   			
  			if qual == 20883328 and t.winner_sprint=="" then t.winner_sprint=note..id t.winner_sprint_team=id_team ref.winner_sprint=references(entity,"P1346",k) results=true end
			if qual == 20883139 and t.winner_young=="" then t.winner_young=note..id t.winner_young_team=id_team ref.winner_young=references(entity,"P1346",k) results=true end  
			if qual == 20893983 and t.winner_fighting=="" then t.winner_fighting=note..id t.winner_fighting_team=id_team ref.winner_fighting=references(entity,"P1346",k) results=true end
			if qual == 27067359 and t.winner_metas_volantes=="" then t.winner_metas_volantes=note..id t.winner_metas_volantes_team=id_team ref.winner_metas_volantes=references(entity,"P1346",k) results=true end
			if qual == 27067170 and t.winner_regularity=="" then t.winner_regularity=note..id t.winner_regularity_team=id_team ref.winner_regularity=references(entity,"P1346",k) results=true end
			if qual == 20893979 and t.winner_combination=="" then t.winner_combination=note..id t.winner_combination_team=id_team ref.winner_combination=references(entity,"P1346",k) results=true end
			if qual == 27907715 and t.winner_fuga_pinarello=="" then t.winner_fuga_pinarello=note..id t.winner_fuga_pinarello_team=id_team ref.winner_fuga_pinarello=references(entity,"P1346",k) results=true end
			if qual == 27907747 and t.winner_azzurri_ditalia=="" then t.winner_azzurri_ditalia=note..id t.winner_azzurri_ditalia_team=id_team ref.winner_azzurri_ditalia=references(entity,"P1346",k) results=true end
			if qual == 20882921 and t.winner_team == "" then
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( 'Q'..id ), 'P31', 1)
				if a == true and (b == 20738667 or b == 23726798) then -- test if 'national cycling team U23' or 'national cycling team'
					t.winner_team = '2t' .." "..national_team(wiki, 'Q'..id, timeofrace, entity, 'P1346', k)
				else
					t.winner_team = note .. id ref.winner_team=references(entity,"P1346",k) results = true
				end
			end
			if qual == 27104269 and t.winner_team_points == "" then t.winner_team_points = note .. id ref.winner_team_points=references(entity,"P1346",k) results = true end
 		end
				end
			end) 
		end	-- for
	end  -- end if pcall

	-- code for references
	local list = {} -- list[1][1] = value from ref.first, list [1][2] = 'first'
	local k
	for k in pairs(ref) do 
		if ref[k]~='' then table.insert(list, {ref[k], k}) end 
	end
	local w, ww 	
	num = #list
	for w=num,1,-1 do
		for ww=1,w do
			if w ~= ww then 
				if list[w][1] == list[ww][1] then list[w][1] = frame:extensionTag{name='ref', args={name=entityId..ww}} break end	
			else list[w][1] = frame:extensionTag{name='ref', content=list[w][1], args={name=entityId..ww}} end 
		end
	end
	for i=1,num do 
		ref[ list[i][2] ] = list[i][1] --list[num+1-i][1] 
	end

	-- transform Q/q-number into flag / WPlink / WDlink
	local k
	local team = true
	local wd = " [[File:Wikidata-logo S.svg|12px|link=d:"	

	for k in pairs(ttt) do -- "^C" ttt.country, "^T" ttt.tour
		if ttt[k][1]~=nil and string.find(ttt[k][1], "^C") then for i=1,#ttt[k] do ttt[k][i] = string.gsub(ttt[k][i], "C", "Q") ttt[k][i] = flag(ttt[k][i], timeofrace).." ".. WPlink( ttt[k][i] ) end end
		if ttt[k][1]~=nil and string.find(ttt[k][1], "^T") then for i=1,#ttt[k] do ttt[k][i] = string.gsub(ttt[k][i], "T", "Q") ttt[k][i] = WPlink( ttt[k][i], 'race') end end
	end	
	for k in pairs(t) do 
		if string.find(t[k], "^Q") then --t[k], k = startplace, endplace, ... find variables with an item as value
			if pcall(foo1, t[k]) then t[k] = WPlink( t[k] )	end
		end
		if string.find(t[k], "^q") then -- find variables with an item as value (in section Résultats)
			t[k] = mw.ustring.upper( t[k] )
			--look into P27 (country of citizenship) to get the Qnumber of that country
			a, b = timeStartEnd(t[k], "P27", 'numeric-id', timeofrace)
			if a == true and pcall(foo1, t[k]) then t[k] = flag('Q'..b, timeofrace).." "..WPlink( t[k] )..ref[k]..wd..t[k].."]]"
			else
				--look into P17 (country) to get the Qnumber of that country
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( t[k] ), 'P17', 1)
				if a == true and pcall(foo1, t[k]) then t[k] = flag("Q"..b, timeofrace).." "..WPlink( t[k] )..ref[k]..wd..t[k].."]]" end
			end
		end
		if string.find(t[k], "^f") then -- no WDitem, frWP
			t[k] = string.gsub(t[k], "f", "Q")
			--look into P27 (country of citizenship) to get the Qnumber of that country
			a, b = timeStartEnd(t[k], "P27", 'numeric-id', timeofrace)
			if a == true and pcall(foo1, t[k]) then t[k] = flag('Q'..b, timeofrace).." "..WPlink( t[k] )..ref[k]
			else	
				--look into P17 (country) to get the Qnumber of that country
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( t[k] ), 'P17', 1)
				if a == true and pcall(foo1, t[k]) then t[k] = flag("Q"..b, timeofrace).." "..WPlink( t[k], 'team', timeofrace )..ref[k] else t[k] = WPlink( t[k], 'team', timeofrace )..ref[k] end
			end
		end	
		if string.find(t[k], "^c") then -- find "class"-items, first asci = "c"
			t[k] = string.gsub(t[k], "c", "Q")
			if pcall(foo1, t[k]) then t[k] = WPlink( t[k], "Q22348500" ) end
		end
		if string.find(t[k], "^t") then 
			t[k] = string.gsub(t[k], "t", "Q")
			--timeofrace = "+2008-04-09T00:00:00Z"
			if pcall(foo1, t[k]) then t[k] = " (" .. WPlink( t[k], 'team', timeofrace ) .. ")" end
		end
		if string.find(t[k], "^2t") then t[k] = string.gsub(t[k], "2t", "") end		
	end

    --local nl ="&#10;"
    -- local tooltip = infobox_bottom(2) .. nl .. mw.text.encode( property(1) .. ' (P393)' ) .. nl .. mw.text.encode( property(2) ..' (P17)')
    
    if t.length ~= "" then 
    	t.length, _ = string.gsub(t.length, "[+]", "") -- delets "+" sign from t.length 
    	t.length = lang:formatNum(tonumber(t.length)) -- formats t.length in the way it is done in the local Wiki
    	if wiki == 'fo' then t.length = string.gsub(t.length, "%.", ",") end
    end    
    if t.speed ~= "" then 
    	t.speed, _ = string.gsub(t.speed, "[+]", "")
    	t.speed = lang:formatNum(tonumber(t.speed))
    	if wiki == 'fo' then t.speed = string.gsub(t.speed, "%.", ",") end
    end
    if t.cost ~= "" then 
    	t.cost, _ = string.gsub(t.cost, "[+]", "")
    	t.cost = lang:formatNum(tonumber(t.cost))
    	if wiki == 'fo' then t.cost = string.gsub(t.cost, "%.", ",") end
    end
    
   	local span1, span2 = "<span style='color:#3366CC'>&#x25C0; </span>", "<span style='color:#3366CC'> &#x25B6;</span>"
    local k = t.previous
	local i, _ = string.find(k, "|")
	local j, _ = string.find(k, "]")
	if i ~= nil and j ~= nil then 
		t.previous = string.sub(k, 1, i) .. span1 .. string.match(string.sub(k, i+1, j-1), "%d%d%d%d") .. string.sub(k, j) 
	else 
		if string.find(k, "%d%d%d%d") == nil then t.previous = '' else t.previous = string.sub(k, string.find(k, "%d%d%d%d")) end
		if t.previous ~= "" then t.previous = span1 .. t.previous end 
	end

	k = t.next
	i, _ = string.find(k, "|")
	j, _ = string.find(k, "]")
	if i ~= nil and j ~= nil then 
		t.next = string.sub(k, 1, i) .. string.match(string.sub(k, i+1, j-1), "%d%d%d%d") .. span2 .. string.sub(k,j) 
	else 
		if string.find(k, "%d%d%d%d") == nil then t.next = "" else t.next = string.sub(k, string.find(k, "%d%d%d%d")) end
		if t.next ~= "" then t.next = t.next .. span2 end 
	end

	tt.caption = string.gsub(tt.caption, "{{(%w+)}}", function (n) return frame:expandTemplate{ title = n }  end)
	-- for overwriting Wikidata content with data in Wikipedia articles. numbers are from function infobox_translate
	local z = {stage=5, date=6, dates=7, length=8, startplace=11, endplace=12, nr_teams=13, nr_participants_start=14, nr_participants_end=15, 
	speed=16, cost=17, first=19, second=20, third=21, winner_point=22, winner_mountain=23, winner_sprint=24, winner_young=25, winner_fighting=26, 
	winner_combination=27, winner_team=28, winner_team_points=37, winner_metas_volantes=35, winner_regularity=36, winner_fuga_pinarello=38,
	winner_azzurri_ditalia=39}
	
	local i, k, s
	for i,k in pairs(z) do
		ee = infobox_translate(k)
		if ee and ee ~='' then
		s = localFrame.args[mw.ustring.gsub(infobox_translate(k), "&#173;", "")] -- filter soft hyphen out
		if s~="" and s~=nil then
			t[i] = s
			if i=="length" then t.length_unit="" end
			if i=="speed" then t.speed_unit="" end
			if i=="cost" then t.cost_unit="" end
		else
			if k>=19 and k<=27 then t[i] = t[i].. t[i..'_team'] end
			if k>=35 and k<=36 then t[i] = t[i].. t[i..'_team'] end
			if k>=38 and k<=39 then t[i] = t[i].. t[i..'_team'] end
		end
	end
end

	if localFrame.args[infobox_translate(32)]~="" and localFrame.args[infobox_translate(32)]~=nil then
	i, k = string.find(localFrame.args[infobox_translate(32)] , ":")
		tttt.special_1a = string.sub(localFrame.args[infobox_translate(32)], 1, i-1)
		tttt.special_1b = string.sub(localFrame.args[infobox_translate(32)], k+1)
	end
	if localFrame.args[infobox_translate(33)]~="" and localFrame.args[infobox_translate(33)]~=nil then
	i, k = string.find(localFrame.args[infobox_translate(33)] , ":")
		tttt.special_2a = string.sub(localFrame.args[infobox_translate(33)], 1, i-1)
		tttt.special_2b = string.sub(localFrame.args[infobox_translate(33)], k+1)
	end

	if wiki == "fi" then
		if t.starttime ~= "" then t.starttime = mw.ustring.gsub(t.starttime, "%a+", "%0ta") end
		if t.endtime ~= "" then t.endtime = mw.ustring.gsub(t.endtime, "%a+", "%0ta") end
		if t.time ~= "" then t.time = mw.ustring.gsub(t.time, "%a+", "%0ta") end
	end

 	tab = "<table cellpadding='4' cellspacing='0' style='float:left; width:300px; border:1px solid rgb(200,200,200);"
    tab = tab .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px; clear:left; "
    tab = tab .. "text-align:right; font-size:85%; line-height:1.6em;'>"
	if wiki == "eo" then tab = "<table style='width:23em; border:1px solid rgb(200,200,200);"
    	tab = tab .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px;"
    	tab = tab .. "text-align:right; font-size:85%; line-height:1.6em;' class='infobox' >"
    end
	tab = tab .. "<tr><td colspan='2' style='border-bottom:5px solid white; font-size:175%; background:#FFDF80; text-align:center'>"
	tab = tab .. "<table style='width:100%'><tr><td>" .. tt.name .."</td><td>" .. tt.icon .. "</td></tr></table></td></tr>"
	if tt.picture ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. tt.picture .."|center|300px]]</td></tr>" end
	if tt.picture ~= "" and tt.caption ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center; font-size:80%'>"..tt.caption.."</td></tr>" end
	tab = tab .. "<tr><td colspan='2' style='background-color:#FFDF80; text-align:center'>'''"..infobox_translate(1).."'''</td></tr>"
	if tt.nr ~= "" and t.is_a ~= "" then tab = tab.."<tr><td style='width:40%'>'''"..infobox_translate(2).."'''</td><td>" .. tt.nr .. " " .. t.is_a .. "</td></tr>" end
	if ttt.tour[1] ~= nil then tab = tab.."<tr><td style= 'vertical-align:top'>'''"
		if #ttt.tour == 1 then tab = tab..infobox_translate(3).."'''</td><td>" else tab = tab..infobox_translate(4).."'''</td><td>" end	
		for i=1,#ttt.tour do tab = tab .. ttt.tour[i] if i == 1 then tab = tab .. " " ..t.class end tab = tab .. "<br>" end
		tab = tab.."</td></tr>" end		
	if t.stage ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(5).."'''</td><td>" .. t.stage.."</td></tr>" end	
	if (t.starttime~="" or t.endtime~="") and t.date=="" and t.dates=="" then tab = tab.."<tr><td>'''"..infobox_translate(7).."'''</td><td>" .. t.starttime.." – " ..t.endtime .."</td></tr>" end
	--if t.endtime ~= "" then tab = tab.."<tr><td>".."Date de fin".."</td><td>" .. t.endtime .. "</td></tr>" end	
	if t.time~="" and t.date=="" and t.dates=="" then tab = tab.."<tr><td>'''"..infobox_translate(6).."'''</td><td>" .. t.time.."</td></tr>" end	
	if t.date~="" then tab = tab.."<tr><td>'''"..infobox_translate(6).."'''</td><td>" .. t.date.."</td></tr>" end
	if t.dates~="" then tab = tab.."<tr><td>'''"..infobox_translate(7).."'''</td><td>" .. t.dates.."</td></tr>" end	
	if t.length ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(8).."'''</td><td>" .. t.length.." "..t.length_unit.."</td></tr>" end	
	if ttt.country[1] ~= nil then tab = tab.."<tr><td style= 'vertical-align:top'>'''"
		if #ttt.country == 1 then tab = tab..infobox_translate(9).."'''</td><td>" else tab = tab..infobox_translate(10).."'''</td><td>" end
		for i=1,#ttt.country-1 do tab = tab .. ttt.country[i].."<br>" end tab = tab .. ttt.country[#ttt.country].."</td></tr>" end	
	if t.startplace ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(11).."'''</td><td>" .. t.startplace .. "</td></tr>" end	
	if t.endplace ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(12).."'''</td><td>" .. t.endplace .. "</td></tr>" end
	if t.nr_teams ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(13).."'''</td><td>" .. t.nr_teams .. "</td></tr>" end
	if t.nr_participants_start ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(14).."'''</td><td>" .. t.nr_participants_start .. "</td></tr>" end
	if t.nr_participants_end ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(15).."'''</td><td>" .. t.nr_participants_end .. "</td></tr>" end	
	if t.speed ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(16).."'''</td><td>" .. t.speed .. " "..t.speed_unit.."</td></tr>" end		
	if t.cost ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(17).."'''</td><td>" .. t.cost .. " "..t.cost_unit.. "</td></tr>" end	
	if tttt.special_1a ~= "" then tab = tab.."<tr><td>'''"..tttt.special_1a.."'''</td><td>" .. tttt.special_1b.. "</td></tr>" end	
	if tttt.special_2a ~= "" then tab = tab.."<tr><td>'''"..tttt.special_2a.."'''</td><td>" .. tttt.special_2b.. "</td></tr>" end
	
	if results then tab = tab.."<tr><td colspan='2' style='border-bottom:5px solid white; background-color:#FFDF80; text-align:center'>'''"..infobox_translate(18).."'''</td></tr>" end
	if t.first ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(19).."'''</td><td>" .. t.first .. "</td></tr>" end
	if t.second ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(20).."'''</td><td>" .. t.second .. "</td></tr>" end
	if t.third ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(21).."'''</td><td>" .. t.third .. "</td></tr>" end
	if t.winner_point ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(22).."'''</td><td>" .. t.winner_point .. "</td></tr>" end
	if t.winner_mountain ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(23).."'''</td><td>" .. t.winner_mountain .. "</td></tr>" end
	if t.winner_sprint ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(24).."'''</td><td>" .. t.winner_sprint .. "</td></tr>" end
	if t.winner_young ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(25).."'''</td><td>" .. t.winner_young .. "</td></tr>" end
	if t.winner_fighting ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(26).."'''</td><td>" .. t.winner_fighting .. "</td></tr>" end
	if t.winner_metas_volantes ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(35).."'''</td><td>" .. t.winner_metas_volantes .. "</td></tr>" end
	if t.winner_regularity ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(36).."'''</td><td>" .. t.winner_regularity .. "</td></tr>" end
	if t.winner_fuga_pinarello ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(38).."'''</td><td>" .. t.winner_fuga_pinarello .. "</td></tr>" end
	if t.winner_azzurri_ditalia ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(39).."'''</td><td>" .. t.winner_azzurri_ditalia .. "</td></tr>" end
	if t.winner_combination ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(27).."'''</td><td>" .. t.winner_combination .. "</td></tr>" end
	if t.winner_team ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(28).."'''</td><td>" .. t.winner_team .. "</td></tr>" end
	if t.winner_team_points ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(37).."'''</td><td>" .. t.winner_team_points .. "</td></tr>" end
	if tt.map ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. tt.map .."|center|300px]]".."</td></tr>" end

	tab = tab.."<tr><td style='text-align:right'>"..t.previous.."</td><td style='text-align:left'>" .. t.next .. "</td></tr>"
	local s = "d:Wikidata:WikiProject Cycling/Documentation/infobox"
	tab = tab .. "<tr><td colspan='2' style='text-align:left; border-top:3px solid #FFDF80; font-size:75%'>" .. "[[" .. s .. "|" .. infobox_translate(34) .. "]] [[File:Wikidata-logo S.svg|12px|link=d:".. frame.args[1]  .. "]]" --infobox_bottom(1) 
	--tab = tab .. "<span style='float:right' title='".. tooltip .. "'>[[File:High-contrast-help-browser.svg|10px|right|link=]]"	
	tab = tab .. "</span></td></tr>"
	tab= tab.."</table>"
	return tab
end

function national_team(wiki, riderID, startOfSeason, entity, property, k)
-- property: statement where the rider is the value
-- k: loop
local national_team, team, nationality, teamID
-- national team for U23 or older riders
if pcall(function()
	local i,j, s 
	for _, v in pairs(entity.claims[property][k].qualifiers['P54']) do -- for property 'member of sports team'
		teamID = 'Q'.. v.datavalue.value['numeric-id'] break
	end

	national_team = mw.wikibase.getEntity( teamID )
	-- calculate s for national team item
	a, b = pcall(fooA, 'numeric-id', national_team, 'P31', 1) -- test if country
	if a == true and b == 20738667 then -- Q20738667 = national cycling team U23
		if wiki == 'fr' or wiki == 'www' then s =  ' espoirs' else s = ' U23' end
		if wiki == 'mk' then s = ' под 23 години' end
		if wiki == 'ar' then s = 'U23' end
	elseif a == true and (b == 1194951 or b == 23726798) then s = '' end 
		-- Q1194951 = national sports team, Q23726798 = national cycling team

	a, b = timeStartEnd(riderID, "P27", 'numeric-id', startOfSeason)
	if a == true then
		local nation = mw.wikibase.getEntityObject( 'Q'..b )
		nationality = nation:getLabel() or nation:getLabel('en') .. ' (en)'
		if national_team:getSitelink() == nil then
			team = nationality.. s
		else
			team = "[[".. national_team:getSitelink().. "|".. nationality.. s.. ']]'
		end
	end

	a, b = timeStartEnd(riderID, "P17", 'numeric-id', startOfSeason)
	if a == true then --team = 'abc'.. b --riderID
		local nation = mw.wikibase.getEntityObject( 'Q'..b )
		nationality = nation:getLabel() or nation:getLabel('en') .. ' (en)'
		if national_team:getSitelink() == nil then
			team = nationality.. s
		else
			team = "[[".. national_team:getSitelink().. "|".. nationality.. s.. ']]'
		end	
	end
end) then 
else 
	--standard team
	pcall(function()
	a, b = timeStartEnd(riderID, 'P54', 'numeric-id', startOfSeason)
	if a == true then
		national_team = mw.wikibase.getEntity( 'Q'..b )
--		g.team[rank] = national_team:getLabel() or g.country[rank].. s
		team = WPlink('Q'..b, 'team', startOfSeason)
	end
	-- guest team
	if teamID ~= nil then team = WPlink(teamID, 'team') end
	end)
end

return team
end

function func_date (date, wiki, mode)
--	local wiki = 'cs'
--	local mode = 'small'
--	local date = '+2016-05-20'
	local function standard(datum) 
		if mode=='long' then return mw.language.getContentLanguage():formatDate("j F Y", datum) end 
		if mode=='small' then return mw.language.getContentLanguage():formatDate("j M", datum) end 		
	end
	local function br(datum) 
		local lang = mw.getLanguage('br') 
		if mode=='long' then return lang:formatDate("j", datum ) .." a viz ".. lang:formatDate("F Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum ) .." a viz ".. lang:formatDate("M", datum) end 		
	end	
	local function ca(datum, language) 
		local lang = mw.getLanguage(language) 
		if mode=='long' then return lang:formatDate("j", datum) .." de ".. lang:formatDate("F", datum) .." de ".. lang:formatDate("Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum) .." de ".. lang:formatDate("M", datum) end 		
	end
	local function ar(datum) 
		local lang = mw.getLanguage('ar') 
		if mode=='long' then return mw.getLanguage('ar'):formatDate("d F Y", datum) end 
		if mode=='small' then return mw.getLanguage('ar'):formatDate("d F", datum) end 	
		end
	local function cs(datum)
		local lang = mw.getLanguage('cs') 		
		if mode=='long' then return lang:formatDate("j. xg Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum)  ..". xg ".. lang:formatDate("M", datum) end 		
	end
	local function de(datum, language) 
		if mode=='long' then return mw.getLanguage(language):formatDate("j. F Y", datum) end 
		if mode=='small' then return mw.getLanguage(language):formatDate("j. M", datum) end 	
	end		
	local function eo(datum) 
		local lang = mw.getLanguage('eo') 
		if mode=='long' then return lang:formatDate("j", datum) .."-a de ".. lang:formatDate("F Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum) .."-a de ".. lang:formatDate("M", datum) end 		
	end	
	local function en(datum) 
		if mode=='long' then return mw.getLanguage('en'):formatDate("F d, Y", datum) end 
		if mode=='small' then return mw.getLanguage('en'):formatDate("M d", datum) end 	
		end
	local function eu(datum) 
		local lang = mw.getLanguage('eu') 
		if mode=='long' then return lang:formatDate( "Y", datum) ..".eko ".. lang:formatDate("F", datum) .."k ".. lang:formatDate("j", datum) end 
		if mode=='small' then return lang:formatDate( "M", datum) .."k ".. lang:formatDate("j", datum) end 		
	end
	local function fi(datum) -- may be different
		if mode=='long' then return mw.ustring.gsub(mw.getLanguage('fi'):formatDate("j. F Y", date), "%a+", "%0ta") end 
		if mode=='small' then return mw.getLanguage('fi'):formatDate("j. M", date) end 		
	end 
	local function hu(datum) 
		local lang = mw.getLanguage('hu') 
		if mode=='long' then return lang:formatDate( "Y", datum) ..". ".. lang:formatDate("F", datum) .." ".. lang:formatDate("j", datum)..". " end
		if mode=='small' then return lang:formatDate( "M", datum) ..". ".. lang:formatDate("j", datum) end 		
	end
	local function ja(datum) 
		if mode=='long' then return mw.getLanguage('ja'):formatDate("Y年m月d日", datum) end 
		if mode=='small' then return mw.getLanguage('ja'):formatDate("m月d日", datum) end	
	end	
	local function lv(datum)
		local lang = mw.getLanguage('lv') 
		if mode=='long' then return lang:formatDate("Y.", datum)  .." gada ".. lang:formatDate("j. F", datum) end 
		if mode=='small' then return lang:formatDate("Y. M", datum) end 		
	end 	
	local function pl(datum) 
		local lang = mw.getLanguage('pl') 
		local date_pl = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"}
		if mode=='long' then return lang:formatDate("j ", datum) .. date_pl[tonumber(lang:formatDate("n", datum))] .. lang:formatDate(" Y", datum) end 
		if mode=='small' then return lang:formatDate("j M", datum) end 		
	end		

	local x = {['']=standard(date), ['br']=br(date), ['ca']=ca(date,'ca'), ['cs']=cs(date), ['da']=de(date,'da'), ['de']=de(date,'de'), ['en']=en(date), ['eo']=eo(date), 
		['es']=ca(date,'es'), ['eu']=eu(date), ['fi']=fi(date), ['fo']=de(date,'fo'), ['hu']=hu(date), ['ja']=ja(date), ['lv']=lv(date), ['no']=de(date,'no'), ['pl']=pl(date)}

	return x[wiki] or x['']
end

function p.teamroster(frame)
if frame.args[1] ~= nil then frame.args[1] =	string.gsub(frame.args[1], "%c", "") end	
local squadSeason = mw.wikibase.getEntityObject( frame.args[1] )
local flags, pays = {}, {}
local riderIds, riderNames, riderBirthdays, givenname, familyname, riderTeam, time = {}, {}, {}, {}, {}, {}, {}
local riderStart, riderEnd, riderPosition, riderReason, riderRef = {}, {}, {}, {}, {}
local index, riderNames_transl, riderNames_notransl = {}, {}, {}
local labelMissing = false
local wiki = string.match(mw.site.server, "%a+")	
local lang = mw.language.getContentLanguage()
local WDlink_on
local team, rider, startOfSeason
local v = ''

local function trans(date, month, day)
	if date ~= '' then 
		local _, _, y, m, d = string.find(date, "(%d+)-(%d+)-(%d+)") 
		if m == '00' then m = month end
		if d == '00' then d = day end
		date = '+'..y..'-'..m..'-'..d..'T00:00:00Z'		
		return date 
	else return '' end
end
local function name(i, wiki, transl, names, givenname, familyname)
	-- transform name "A B ..." into "B ... A"
	local _, count = mw.ustring.gsub(names, " ", " ")
	local a,b,c,d = '', '', '', ''
	local done = false
	if count ~= nil then count = count + 1 else count = 1 end

	if count > 1 then
		if count == 2 then
			if names~='' then _, _, a, b =  mw.ustring.find(names, "(%S+)%s+(%S+)") names=b..' '..a..":"..i end
		else
			local name_parts_lv = {'da', 'de', 'di', 'De', 'la', 'Le', 'ten', 'van', 'Van'}
			local name_parts_mk = {'да', 'ди', 'де', 'Де', 'ла', 'Ле', 'тен', 'ван', 'Ван'}
			local name_parts_ru = {'да', 'ди', 'де', 'Де', 'ла', 'Ле', 'тен', 'ван', 'Ван'}	
			local name_parts    = {'da', 'de', 'di', 'De', 'la', 'Le', 'ten', 'van', 'Van'}
			local v
			if count == 3 and names~='' then
				_, _, a, b, c =  mw.ustring.find(names, "(%S+)%s+(%S+)%s+(%S+)")
				if wiki == 'mk' then
					for _,v in ipairs(name_parts_mk) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end
				end
				if wiki == 'lv' then
					for _,v in ipairs(name_parts_lv) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end
				end
				if wiki == 'ru' then
					for _,v in ipairs(name_parts_ru) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end
				end
				if wiki ~= 'lv' and wiki ~= 'mk' and wiki ~= 'ru' then
					for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end
				end				
				if transl == 'notransl' then --or (wiki~='lv' and wiki~='mk' and wiki~='ru' and wiki~='ja') then
					for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end
				end
				if not done and familyname==2 then names = b..' '..c..' '..a..":"..i done = true end
				if not done and familyname==1 then names = c..' '..a..' '..b..":"..i done = true end
				if not done and familyname==0 then names = c..' '..a..' '..b..":"..i done = true end
			end
			if count > 3 and names~='' then
				_, _, a, b, c, d =  mw.ustring.find(names, "(%S+)%s+(%S+)%s+(%S+)%s+(%S+)")
				if wiki == 'mk' then
					for _,v in ipairs(name_parts_mk) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end
					for _,v in ipairs(name_parts_mk) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end
				end
				if wiki == 'lv' then
					for _,v in ipairs(name_parts_lv) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end
					for _,v in ipairs(name_parts_lv) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end
				end
				if wiki == 'ru' then
					for _,v in ipairs(name_parts_ru) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end	
					for _,v in ipairs(name_parts_ru) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end
				end
				if wiki ~= 'lv' and wiki ~= 'mk' and wiki ~= 'ru' then
					for _,v in ipairs(name_parts) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end
					for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end
				end
				if transl == 'notransl' then --or (wiki~='lv' and wiki~='mk' and wiki~='ru' and wiki~='ja') then
					for _,v in ipairs(name_parts) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end
					for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end
				end
				if not done then names = b..' '..c..' '..d..' '..a..":"..i end
			end
		end
	end
	return names
end

local localFrame
local sort
--[[
 The word 'sort' is used to sort the riders after the surname. It could look like this in the Wikipedia article
{{Cycling race/teamroster|Q21769847
| sort
}}
A rider called 'Laurens De Vreese' is sorted after 'De Vreese Laurens'. If you want to sort after 'Vreese Laurens De' 
change that in the code. In lvWiki, mkWiki and ruWiki sorting is standard, there is no need to switch sorting on in the article
]]
if frame.args[2] ~= nil then 
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name 
	then localFrame = frame:getParent() else localFrame = frame end
	if mw.ustring.find(mw.ustring.lower(frame.args[2]), "sort") then sort = true else sort = false end
else sort = false 
end
if wiki == "lv" or wiki == "mk" or wiki == "ru" then sort = true end

pcall(function() team = squadSeason.claims["P361"][1].mainsnak.datavalue.value['numeric-id'] end)

-- WDlink_on is used to decide if a Wikidata flag will be shown
if wiki == "mk" or wiki == "ja" or wiki == "ru" then WDlink_on = true else WDlink_on = false end

if pcall(function() startOfSeason = squadSeason.claims["P580"][1].mainsnak.datavalue.value.time end) then 
else 
	local Sitelink = squadSeason:getSitelink('arwiki') or squadSeason:getSitelink('enwiki') or squadSeason:getSitelink('frwiki') or squadSeason:getSitelink('dewiki') or ''
	if Sitelink == '' then return '> Wikidata is missing data about the start time (P580) and end time (P582) of the season'
	else startOfSeason = '+'..string.match(Sitelink, '%d%d%d%d' ) ..'-01-01T00:00:00Z' 
	end 
end	

local i = 1
pcall(function()
while squadSeason.claims["P527"][i]  do
	riderIds[i] = 'Q' .. squadSeason.claims["P527"][i].mainsnak.datavalue.value['numeric-id']
	riderNames[i] = WPlink(riderIds[i])

	rider = mw.wikibase.getEntityObject(riderIds[i])
	if pcall(function() riderBirthdays[i] = rider.claims["P569"][1].mainsnak.datavalue.value.time end
   	) then else riderBirthdays[i] = '' end
 	if pcall(function() local k	for k, _ in pairs(rider.claims["P735"]) do givenname[i] = k end end
   	) then else givenname[i] = 0 end
 	if pcall(function() local k for k, _ in pairs(rider.claims["P734"]) do familyname[i] = k end end
   	) then else familyname[i] = 0 end

	pcall(function()
		local language
		if wiki == "www" then language = 'en' else language = wiki end
		local entity=mw.wikibase.getEntity(riderIds[i])
		if wiki == 'mk' or wiki == 'ru' then
			if entity:getLabel(language) ~= nil and (mw.ustring.byte(entity:getLabel(language), 1, 1) > 127 and mw.ustring.byte(entity:getLabel(language), 3, 3) > 127)
			then riderNames_transl[i] = entity.labels[language].value riderNames_notransl[i] = ''
			else riderNames_notransl[i] = entity.labels['en'].value or entity.labels['fr'].value or entity.labels['de'].value riderNames_transl[i] = '' 
			end
		end
		if wiki ~= 'mk' and wiki ~= 'ru' then
			if entity:getLabel(language) ~= nil then riderNames_transl[i] = entity.labels[language].value riderNames_notransl[i] = '' 
			else riderNames_notransl[i] = entity.labels['en'].value or entity.labels['fr'].value or entity.labels['de'].value riderNames_transl[i] = '' 
			end
		end
	end)

	if sort == true then
	riderNames_transl[i] = name(i, wiki, 'transl', riderNames_transl[i], givenname[i], familyname[i])		
	riderNames_notransl[i] = name(i, wiki, 'notransl', riderNames_notransl[i], givenname[i], familyname[i])
	else index[i] = i
	end

	if pcall(function()
		local date = squadSeason.claims["P527"][i].qualifiers["P580"][1].datavalue.value.time or ''
		riderStart[i] = func_date(trans(date,'01', '01'), wiki, 'small') 
	end
	) then else riderStart[i] = '' end 	

	if pcall(function()
		local date = squadSeason.claims["P527"][i].qualifiers["P582"][1].datavalue.value.time
		riderEnd[i] = func_date(trans(date,'12', '31'), wiki, 'small') 
	end
	) then else riderEnd[i] = '' end

	if pcall(function()	
	riderPosition[i] =  'Q' .. squadSeason.claims["P527"][i].qualifiers["P39"][1].datavalue.value['numeric-id'] 
	local entity = mw.wikibase.getEntity( riderPosition[i] )
	local label = string.gsub(entity:getLabel(), "%b()", "") or entity:getLabel( 'en' ) 
	--if label == null then label = entity:getLabel( 'en' ) end
	riderPosition[i] = ', ' .. label end
	) then else riderPosition[i] = '' end		

	riderReason[i] = ''
	pcall(function() riderReason[i] = 'Q'.. squadSeason.claims["P527"][i].qualifiers["P1643"][1].datavalue.value['numeric-id'] end)
	if riderReason[i] == '' then pcall(function() riderReason[i] = 'Q'.. squadSeason.claims["P527"][i].qualifiers["P1642"][1].datavalue.value['numeric-id'] end) end
	if riderReason[i] == '' then pcall(function() riderReason[i] = 'Q'.. squadSeason.claims["P527"][i].qualifiers["P1534"][1].datavalue.value['numeric-id'] end) end
	if riderReason[i] ~= '' then
		local entity = mw.wikibase.getEntity( riderReason[i] )
		local label = string.gsub(entity:getLabel(), "%b()", "") or entity:getLabel('en')
		--if label == null then label = entity:getLabel( 'en' ) end
		riderRef[i] = references(squadSeason, 'P527', i)
		riderReason[i] = ', ' .. label
	 end

	local a, b
	local timeofrace
	local changedTime = '+0000-00-00'
	local changedTeam = ''
	local entity, label
	local stagiaire	
	time[i]='' riderTeam[i] = ''
	if pcall(function() timeofrace = squadSeason.claims["P527"][i].qualifiers["P580"][1].datavalue.value.time end) 
	then else timeofrace = startOfSeason end
	if team ~= nil then a = true b = team -- if team known, don´t search for team
		else a, b = timeStartEnd(riderIds[i], 'P54', 'numeric-id', timeofrace) team = b
	end 
	if a == true and b ~= nil then 
		pcall(function()
			local v
			for _, v in pairs(rider.claims["P54"]) do -- look into all P54 teams
				pcall(function() -- get trainee data from rider item
					if v.mainsnak.datavalue.value['numeric-id'] == b  then -- print riderStart[i], riderEnd[i], riderPosition[i], riderReason[i]
						if riderReason[i] == '' then pcall(function() riderReason[i] = 'Q'.. v.qualifiers["P1643"][1].datavalue.value['numeric-id'] end) end
						if riderReason[i] == '' then pcall(function() riderReason[i] = 'Q'.. v.qualifiers["P1642"][1].datavalue.value['numeric-id'] end) end
						if riderReason[i] == '' then pcall(function() riderReason[i] = 'Q'.. v.qualifiers["P1534"][1].datavalue.value['numeric-id'] end) end
						if string.sub(riderReason[i],1,1)=='Q' then -- only for these pcall-functions, not for those at line 970
							local entity = mw.wikibase.getEntity( riderReason[i] )
							local label = string.gsub(entity:getLabel(), "%b()", "") or entity:getLabel('en')
							if pcall(function()	riderRef[i] = references(squadSeason, 'P527', i) end) then else riderRef[i]='' end
							--		riderRef[i] = references(squadSeason, 'P527', i)
							riderReason[i] = ', ' .. label
						end					

						local date1 = v.qualifiers["P580"][1].datavalue.value.time
						date1 = trans(date1,'01','01')
						local _, _, y1, m1, d1 = string.find(date1, "(%d+)-(%d+)-(%d+)")
						local date2
						if pcall(function() date2 = v.qualifiers["P582"][1].datavalue.value.time end) then else date2='+'..y1..'-12-31T00:00:00Z' end 
						date2 = trans(date2,'12','31')						
						local _, _, y2, m2, d2 = string.find(date2, "(%d+)-(%d+)-(%d+)")
						local _, _, y3, m3, d3 = string.find(startOfSeason, "(%d+)-(%d+)-(%d+)")

						if  (y1 == y3 or y2 == y3) and ((y1 == y3 and (m1 ~= '01' or d1 ~= '01')) or (y2 == y3 and (m2 ~= '12' or d2 ~= '31'))) then 
							-- riders who start after 1 January or end earlier then 31 December in the season 
							riderStart[i] = func_date(date1, wiki,'small') 
							if pcall(function() 
								local date = v.qualifiers["P582"][1].datavalue.value.time
								riderEnd[i] = func_date(date2, wiki,'small') 
								end 
							) then else riderEnd[i] = func_date('+'..y1..'-12-31T00:00:00Z', wiki,'small') end

							if riderPosition[i] == '' then -- find the 'position' (P39) of a rider
								pcall(function() riderPosition[i] ='Q' ..v.qualifiers["P39"][1].datavalue.value['numeric-id']
									local entity = mw.wikibase.getEntity( riderPosition[i] )
									local label = string.gsub(entity:getLabel(), "%b()", "") or entity:getLabel( 'en' ) 	
									riderPosition[i] = ', ' .. label
								end)
							end	
						end						
					end
				end)
			
				stagiaire = ''
				pcall(function() stagiaire = v.qualifiers["P39"][1].datavalue.value['numeric-id'] end)
				if v.mainsnak.datavalue.value['numeric-id'] ~= b and stagiaire == '' then -- find previous team and end time for the rider at that team
					local date1 = v.qualifiers["P580"][1].datavalue.value.time
					date1 = trans(date1,'01','01')
					local _, _, y1, m1, d1 = string.find(date1, "(%d+)-(%d+)-(%d+)")
					local date2
					if pcall(function() date2 = v.qualifiers["P582"][1].datavalue.value.time end) then else date2='+'..y1..'-12-31T00:00:00Z' end 
					date2 = trans(date2,'12','31')						
					local _, _, y2, m2, d2 = string.find(date2, "(%d+)-(%d+)-(%d+)")
					local _, _, y3, m3, d3 = string.find(startOfSeason, "(%d+)-(%d+)-(%d+)")
					if y1 <= y3 then -- start time < season time
						pcall(function()
							local timeP582 = v.qualifiers["P582"][1].datavalue.value.time
							timeP582 = trans(timeP582,'12', '31')
							if timeP582 >= changedTime then -- find maximum end time
								-- Case Pierre-Roger Latour: Chambéry CF (2012 - 2014), time season at 2013
								-- Task: changedTime should be after start time, but before startOfSeason
								local _, _, y4, m4, d4 = string.find(timeP582, "(%d+)-(%d+)-(%d+)")
								if y4 > y3 then changedTime = '+'..y3..'-12-31T00:00:00Z' else changedTime = timeP582 end
								changedTeam = v.mainsnak.datavalue.value['numeric-id']
 							end -- end if							
						end) -- end function
						-- print riderTeam[i], time[i]
						if changedTime ~= '+0000-00-00' then						
							pcall(function() riderTeam[i] = WPlink( 'Q'..changedTeam , 'team', changedTime ) end) 
							local _, _, y1, _, _ = string.find(changedTime, "(%d+)-(%d+)-(%d+)") 
							time[i] = ' ('..y1..')'					
						end
					end
				end -- end if			
			end -- end for
		end) -- end function
	end -- end if

	if pcall(function()
		local a, b = timeStartEnd(riderIds[i], "P27", 'numeric-id', startOfSeason)
		flags[i] = flag('Q'..b, startOfSeason)
		if available_list==true and type( translations.list ) == "function" then 
			pays[i] = translations.list('Q'..b) 
	   		if pays[i] == '' then
	   			local country = mw.wikibase.getEntityObject( 'Q'..b )
	   			pays[i] = country:getLabel() or country:getLabel('en') .. ' (en)'
	   		end		
		end
		
		end
	) then else flags[i] = '' end

    i = i + 1 
end
end)

-- sorting names after surname
if sort == true then
	if language~='ja' then 
		table.sort(riderNames_transl, function(a,b) return a<b end) 
		table.sort(riderNames_notransl, function(a,b) return a<b end) 
	end
	local ii, v1, v2, name1, name2, number
	i = 1
	-- sorting riders with a translation
	for ii,name1 in ipairs(riderNames_transl) do
		if name1 ~= '' then 
			v1, v2 = mw.ustring.find(name1, ":") 
			number = mw.ustring.sub(name1, v2+1) 
			name2, _ = mw.ustring.gsub(name1, ":%d+", "")
			index[i] = tonumber(number) 
			i = i + 1
		end
	end
	-- sorting riders without a translation
	for ii,name1 in ipairs(riderNames_notransl) do
		if name1 ~= '' then 
			v1, v2 = mw.ustring.find(name1, ":") 
			number = mw.ustring.sub(name1, v2+1) 
			name2, _ = mw.ustring.gsub(name1, ":%d+", "")
			index[i] = tonumber(number)
			i = i + 1
		end		
	end	
end

local tableBody= ''
local tableHeader = '<table border="0" cellspacing="0" cellpadding="2">'
   	.. '<tr style="background-color:#FFDF80;line-height:1.8em;"><th nowrap style="text-align:right;">' 
if WDlink_on == false then tableHeader = tableHeader .. '[[File:Wikidata-logo S.svg|12px|link=d:'.. frame.args[1].. '#P527]]&nbsp;&nbsp;&nbsp;' end
tableHeader = tableHeader..getSquadTableColumn(1)..'</th><th nowrap style="text-align:right">'..getSquadTableColumn(2) 
if available_list==true then tableHeader = tableHeader.. '</th><th nowrap style="text-align:right;padding:0 0.5em">'..getSquadTableColumn(6) .. '&nbsp;' end 
tableHeader = tableHeader..	'&nbsp;</th><th nowrap style="text-align:right;padding:0 0.5em">'..getSquadTableColumn(3) .. '&nbsp;</th></tr>'
local tableFoot = '</table>'
local tableEndText = ''
local tableSize = table.getn(riderNames)
local iii = 1
i = 1
while index[i] do
	tableBody = tableBody.. '<tr style="line-height:1.8em"><td nowrap style="padding:0 1em 0 0">'
	if available_list==false then tableBody=tableBody.. flags[index[i]]..' '..riderNames[index[i]] else tableBody = tableBody.. riderNames[index[i]] end 
  	if WDlink_on == true then tableBody = tableBody.. ' '.. wdLink(riderIds[index[i]]) end
   	if riderStart[index[i]]~='' or riderEnd[index[i]]~='' then
   		tableBody=tableBody..'<span style="font-size:80%; color:#686868"> ('..riderStart[index[i]]..'–'..riderEnd[index[i]].. riderPosition[index[i]]
   		if riderReason[index[i]] ~= '' then tableBody=tableBody.. ', [[#tr_'..i..frame.args[1]..'|'..getSquadTableColumn(4)..']]' end
   		tableBody=tableBody .. ')</span>'
   	elseif riderReason[index[i]]~='' then
   		tableBody=tableBody.. '<span style="font-size:80%; color:#686868"> ([[#tr_'..i..frame.args[1]..'|'..getSquadTableColumn(4)..']]'.. ')</span>'
   	end
   	tableBody = tableBody.. '</td><td nowrap style="text-align:right">'
	if wiki == 'lv' then
		local _, _, y1, m1, d1 = string.find(startOfSeason,"(%d+)-(%d+)-0*(%d+)")
		local _, _, y2, m2, d2 = string.find(riderBirthdays[index[i]],"(%d+)-(%d+)-0*(%d+)")
		tableBody = tableBody.. frame:expandTemplate{ title = 'Template:Birth date and age2', args = { y1, m1, d1, y2, m2, d2 } }.. '</td>'
	else 
		tableBody = tableBody.. func_date (riderBirthdays[index[i]], wiki, 'long')
		if available_list==false then tableBody=tableBody..'</td>' else tableBody=tableBody..'</td><td>'.. flags[index[i]].. ' '..pays[i].. '</td>' end
	end
	tableBody = tableBody.. '<td style="padding:0 0.5em; text-align:left"><div dir="ltr">'
	if riderTeam[index[i]] ~= nil then tableBody = tableBody.. riderTeam[index[i]].. time[index[i]] end 
	tableBody = tableBody..'</div></td></tr>'
	
	if riderReason[index[i]] ~= '' then
		if iii == 1 then tableEndText = tableEndText.. getSquadTableColumn(5)..': '.. riderNames[index[i]].. riderReason[index[i]] 
		else tableEndText = tableEndText.. '<span style="color:white">'.. getSquadTableColumn(5)..': </span>'.. riderNames[index[i]].. riderReason[index[i]] end
		iii = iii + 1
		if riderRef[index[i]] ~= '' then tableEndText = tableEndText.. 
			frame:extensionTag{name='ref', content=riderRef[index[i]], args = {name='tr_'..i..frame.args[1]}} end
		tableEndText = tableEndText.. '<br>'
	end
	i = i + 1
end

--if tableEndText ~= '' then tableEndText = getSquadTableColumn(5)..': <span style="font-size:80%; color:#686868">'.. tableEndText .. '</span>' end    

local borderStyle = 'border:1px solid rgb(200,200,200); padding: 4px'
if wiki == 'lv' then
	borderStyle = 'border:0'
end
local tableStart = '<table style="'.. borderStyle.. '"><tr><td style="vertical-align:top;">'
local tableEnd = '</td></tr></table>'

if labelMissing then tableEnd = tableEnd .. getMissingLabelTrackingCategory() end

return tableStart.. tableHeader.. tableBody.. tableFoot.. tableEnd.. tableEndText 
end

function timeStartEnd(Qid, property, mode, timeofrace)
-- mode = 'numeric-id', property = 'P54', Qid = 'Q123'
local entity = 	mw.wikibase.getEntity(Qid)
local a, b = pcall(fooA, mode, entity, property, 1)
local starttime, endtime
local available_lang_priority = available_lang_priority

if a == true then
	local timeStartEnd = {}
	local num = 1
	local v
	for _, v in pairs(entity.claims[property]) do
		if pcall(function () local test = v.mainsnak.datavalue.value[mode] end) then -- test if not 'unnown value' 
			if pcall(function () starttime = v.qualifiers["P580"][1].datavalue.value.time end) then
   				starttime = v.qualifiers["P580"][1].datavalue.value.time
				local _,_,year,m,d = string.find(starttime,"(%d+)-(%d+)-(%d+)")
				if m == '00' and d == '00' then starttime = '+'..year..'-01-01T00:00:00Z' end
			end
			if pcall(function () endtime = v.qualifiers["P582"][1].datavalue.value.time end) then
				endtime = v.qualifiers["P582"][1].datavalue.value.time
				local _,_,year,m,d = string.find(endtime,"(%d+)-(%d+)-(%d+)")
				if m == '00' and d == '00' then endtime = '+'..year..'-12-31T00:00:00Z' end
				if m == '01' and d == '01' then endtime = '+'..year..'-12-31T00:00:00Z' end
			end
  			if v.qualifiers then
 				if (not v.qualifiers["P580"] or starttime <= timeofrace)
 					and
 					(not v.qualifiers["P582"] or endtime >= timeofrace)
 				then
 					if available_lang_priority == true and property == "P1448" then
 						local test = false
						pcall(function () if type( v.qualifiers["P1448"])=='table' then test=true end end)
						if test == false then
							timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
						else
							local lang_module, lang_WD
							local language= ''
							local zaehler
							for i,j in ipairs(translations.lang_priority) do
									lang_module = j
									for number in pairs(v.qualifiers["P1448"]) do
										lang_WD = v.qualifiers["P1448"][number].datavalue.value.language
										if lang_WD == lang_module then zaehler = number break end
									end -- for number in pairs
								if lang_WD == lang_module then language = lang_WD   break end
								end -- for i,j
							if language~='' then -- a WD translation matching translations.lang_priority exist
									local t = v.qualifiers["P1448"][zaehler].datavalue.value.text
									timeStartEnd[num] = t
	 							else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]--  no matching between lang module and "official name" qualifier
								end -- if language~=''
						end --  test if official name qualifier exist
 					else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
					end -- if property == "P1448"
  					num = num + 1
 				end
 			else
 				timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
 				num = num + 1
 			end
		end
 	end
	return a, timeStartEnd[1]
else return false, '' end
end

function black_list(wiki, Label)
-- List of Wikipedia articles with the same lemma as the non existing rider article. Those lemmas are printed as text "black" in the tables, 
-- not "blue" or "red". This way there will be no false wikilinks at the WhatLinksHere entry. List should be updated maybe once a year. 
local black_list = {}
if wiki=='de' then black_list={ ["Ryan Anderson"]=true, ["Chris Butler"]=true, ["Josef Černý"]=true, ["Brad Evans"]=true, ["Robert Fontaine"]=true, 
	["Carlos Giménez"]=true, ["George Harper"]=true, ["Mathias Jørgensen"]=true, ["Luis Lemus"]=true, ["David Lozano"]=true, ["Jan Maas"]=true, 
	["James McLaughlin"]=true, ["Nikolaj Michajlow"]=true, ["Antonio Molina"]=true, ["Ben O'Connor"]=true, ["Andrea Peron"]=true, ["Cristian Rodríguez"]=true, 
	["Nick Schultz"]=true, ["Adam Stachowiak"]=true, ["Michel Vermote"]=true, ["Johannes Weber"]=true, ["Martin Weiss"]=true, ["Christopher Williams"]=true, 
	["Samuel Williams"]=true, ["Peter Williams"]=true, ['Stephen Williams']=true, ["Michael Woods"]=true, ["Michael Wright"] = true, ["Edoardo Zardini"]=true, 
	["Georg Zimmermann"]=true } end
if wiki=='en' then black_list={ ["Tiago da Silva"]=true, ["Jan Maas"]=true, ["Alexander Meier"]=true, ["James McLaughlin"]=true, ["Andrea Nencini"]=true, 
	["Johannes Weber"]=true } end
if wiki=='fr' then black_list={['Pierre Barbier']=true, ['Jessica Cutler']=true, ['Fernanda da Silva']=true, ['Guillaume Delvaux']=true, ['Willy De Waele']=true, 
	['Jules Dubois']=true, ['Jean Dupont']=true, ['Robert Fontaine']=true, ['René Fournier']=true, ['Pierre Gauthier']=true, ['Marc Goossens']=true, 
	['Claude Guyot']=true, ['Amy Hill']=true, ['Liang Hongyu']=true, ['Marcus Johansson']=true, ['Mathias Jørgensen']=true, ['José Mendoza']=true, 
	['Daniel Müller']=true, ['Henri Parmentier']=true, ['Jean Raynal']=true, ['Pascal Robert']=true, ['Jean-Yves Roy']=true, ['Michael Shermer']=true, 
	['Juris Silovs']=true, ['Jacques Simon']=true, ['Guy Thomas']=true, ['Ryan Thomas']=true, ['Hans Vonk']=true, ['Jan Wijnants']=true } end
return black_list[Label]
end

function WPlink(Qnumber, ...) 
local link=''
local entity = mw.wikibase.getEntity( Qnumber )
local Sitelink = entity:getSitelink() -- link to WParticle
local Sitelink2 = Sitelink
local Label = entity:getLabel() or ''
local Label_fr = entity:getLabel( 'fr' ) or ''
local a, b
local official_name = ""
local wiki = string.match(mw.site.server, "%a+")

if arg[1] == nil then 	
	if pcall(foo1, Qnumber) then 
		if Sitelink ~= nil then 
			if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia"
				if Sitelink~=nil then
					local i, _ = mw.ustring.find(Sitelink, ",")
					if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink, 1, i-1) end
				end
			end
			link = "[[" .. Sitelink .. "|" .. mw.text.trim(mw.ustring.gsub(Sitelink2, "%b()", "")..' ') .. "]]"	
			if wiki == "de" then -- ru riders get label as alias, to shorten the name
				local a, b = pcall(fooA, 'numeric-id', entity, 'P27', 1) 
				if a == true and (b==159 or b==184 or b==212 or b==232) then link = "[[" .. Sitelink .. "|" .. Label .. "]]" end
			end
		elseif Label ~= '' then 
			if wiki ~= 'www' then
				if black_list(wiki, Label) == true then 
					link = Label -- function black_list: articles that are printed as text, not wikilinks
				else -- detect if there is a different local article with the same name
					local title = mw.title.new(Label)
					if title.exists then link = Label else link = "[[" .. Label.. "]]" end
				end
			else link = Label end
		else link = Label end 
	else return "unknown ID in function WPlink" end
	if link == '' then 
		link = entity:getLabel('fr') or entity:getLabel('en') or entity:getLabel('de') or ''
		if link ~= '' then link = mw.ustring.gsub(link, "%b()", "")
		else link =  "(label missing)" end  
	end
end -- if arg[1] == nil
if arg[1] == 'team' then -- add '(team of the winner)'
	a, b = timeStartEnd(Qnumber, 'P1448', 'text', arg[2]) --officialName(entity) 
	local a1, b1 = pcall(fooA, 'numeric-id', entity, 'P361', 1)
	if a1== true then 
		local a2, b2 = timeStartEnd('Q'..b1, 'P1448', 'text', arg[2]) 
		if a2== true then a = a2 b = b2	end
		entity = mw.wikibase.getEntity( 'Q'..b1 ) 
		Sitelink2 = entity:getSitelink() -- link to WParticle		
	end
	if a == true then official_name = b end
	
	if available_lang_priority == false then
		a, b = pcall(fooA, 'text', entity, 'P1448', 2) -- test if more then two official names
		if a == true then
			a, b = timeStartEnd(Qnumber, 'P1448', 'text', arg[2]) --officialName(entity) 
			if a == true then official_name = b end
		else
			a, b = pcall(fooA, 'text', entity, 'P1448', 1) 
			if a == true then official_name = b end	
		end
	end
			
	if Sitelink ~= nil then 
		if official_name == nil then 
			link = "[[".. Sitelink.. "|".. mw.text.trim(mw.ustring.gsub(Sitelink,"%b()","").. ' ').. "]]" 
		else
			if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia"
				local i, _ = mw.ustring.find(Sitelink, ",")
				if i ~= nil then Sitelink = mw.ustring.sub(Sitelink, 1, i-1) end
			end
			link = link .. '[['.. Sitelink.. "|".. official_name.. ']]'
		end
	end
	if link == '' and Sitelink2 ~= nil then -- code goes from season item to team item
		if official_name == nil or official_name == '' then
			link = "[[".. Sitelink2.. "|".. mw.text.trim(mw.ustring.gsub(Sitelink2,"%b()","").. ' ').. "]]" 	
		else
			if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia"
				local i, _ = mw.ustring.find(Sitelink2, ",")
				if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink2, 1, i-1) end
			end		
			link = link .. '[['.. Sitelink2.."|".. official_name.. ']]' 
		end		
	end

	if Sitelink == nil and Sitelink2 == nil then 
		if official_name ~='' then link = official_name else link = entity:getLabel() end
		if link == nil then link = "(label missing)" end
	end	


-- mw.log('Sitelink=', Sitelink, 'Sitelink2=', Sitelink2, 'official_name=',  official_name) 
end -- end arg[1]
if arg[1] == 'pure' then
	if pcall(foo1, Qnumber) then
		if wiki=="en" or wiki=="www" then --delete string ", ..." from e.g. "Unley, South Australia"
			if Sitelink~=nil then
				local i, _ = mw.ustring.find(Sitelink, ",")
				if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink, 1, i-1) end
			end
		end		
		if Sitelink ~= nil then link = "[[" .. Sitelink .. "|" .. mw.text.trim(mw.ustring.gsub(Sitelink2, "%b()", "")..' ') .. "]]"	
		else link = mw.ustring.gsub(Label, "^(%a)", function (x) return mw.ustring.upper(x) end)
		end 
	end
end
if arg[1] == 'race' then -- for infobox "Competitions"
	local a, b = pcall(fooA, 'numeric-id', entity, 'P31', 1)
	if a == true  and b == 1137352 then
		local entity_race = mw.wikibase.getEntity( 'Q'..b )
		local Label_race = entity_race:getLabel() or ''
		local Sitelink_race = entity_race:getSitelink() or ''
		if Label_race ~= '' and Sitelink ~= nil  then link = '[['..Sitelink..'|'..Label_race..']]'
		elseif Sitelink ~= nil  then link = "[[".. Sitelink.. "]]"
		else if Sitelink_race ~= '' then link = '[['..Sitelink_race.."|".. mw.text.trim(mw.ustring.gsub(Sitelink_race,"%b()","").. ' ').. "]]" 
			else link = Label_race or Label end
		end
		if wiki == 'www' then link = '[['..entity:getSitelink( 'frwiki')..'|'..entity_race:getLabel('fr')..']]' end

	else if Sitelink ~= nil then link = "[[".. Sitelink.. "]]" else link = Label end
	end
end
if arg[1] == "Q22348500" then -- add weblink from item "Q22348500" if available
	local Sitelink_claas = mw.wikibase.getEntity( 'Q22348500' ):getSitelink() 	
	if pcall(foo1, Qnumber) then --Sitelink_claas
		if Sitelink == nil then 
			if Sitelink_claas ~= nil then link = "[[" .. Sitelink_claas .. "|" .. Label .. "]]" 
			elseif entity:getLabel( 'ar' )~=nil then link = entity:getLabel( 'ar' )
			elseif entity:getLabel( 'fr' )~=nil then link = entity:getLabel( 'fr' )
			elseif entity:getLabel( 'en' )~=nil then link = entity:getLabel( 'en' )
			elseif entity:getLabel( 'de' )~=nil then link = entity:getLabel( 'de' )				
			else link = Label 
			end 
		end
	end
end
return link
end
function getMissingLabelTrackingCategory()
	local l10n = loadI10n.getMissingLabelTrackingCategory[mw.site.server]
	if not l10n then
    	l10n = ''
	end
	return l10n
end 

function changetemplate () -- for eoWiki
	local frame = mw.getCurrentFrame()
	local n = frame:expandTemplate {title="sxangxu sxablonon2", args = {["sxablono"] = "Cycling race/infobox"}}
return n			
end

function fooA (mode,entity,property,var)
local snak	
if mode=="value" then snak=entity.claims[property][var].mainsnak.datavalue.value 
else snak=entity.claims[property][var].mainsnak.datavalue.value[mode]
end
return snak, entity.claims[property][var].rank
end

function fooB (mode, entity_var, property, var1, var2, ref, var3)
local snak 
if mode == 'value' then snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value 
else snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value[mode]
end
return snak
end

function fooC (mode, entity_var, property, var1, quali, var2)
local snak
if mode == 'value' then snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value 
else snak = entity_var.claims[property][var1].qualifiers[quali][var2].datavalue.value[mode]
end
return snak
end

function foo1 (arg)
local entity = mw.wikibase.getEntity( arg ) 
end

function foo2 (entity_var, property, var)
local snak = entity_var.claims[property][var].mainsnak.datavalue.value.amount 
end

function foo3 (entity_var, property, var1, quali, var2) 
local snak = entity_var.claims[property][var1].qualifiers[quali][var2].datavalue.value.amount 
end

function winner (wiki, t, winner_id)
	local number = t.number
	local wiki = wiki
	local winner_id = winner_id
	local tt = {}
	for num=1,number do table.insert(tt, "") end
	local WDlink_on

	-- WDlink_on is used to decide if a Wikidata flag will be shown
	if wiki == "mk" or wiki == "ja" or wiki == "ru" then WDlink_on = true else WDlink_on = false end
	for num=1,number do
		local entity_race = mw.wikibase.getEntityObject(t.race[num][1])
		if pcall(fooA, 'numeric-id', entity_race, 'P1346', 1) == true then
		for k, v1 in pairs(entity_race.claims['P1346']) do
			if pcall(fooC, 'numeric-id', entity_race, 'P1346', k, 'P642', 1) == true and v1.qualifiers.P642[1].datavalue.value['numeric-id'] == winner_id then
	    		local time_var, a, b
	    		local winner = "Q"..v1.mainsnak.datavalue.value['numeric-id']

				-- get date of the race, e.g. "+2016-01-01T00:00:00Z"
				-- P585 (point in time for a single day race) or P580 (start time for a stage race)
				a, b = pcall(fooA, 'time', entity_race, 'P585', 1)
				if a == true then time_var = b
				else
					a, b = pcall(fooA, 'time', entity_race, 'P580', 1)
					if a == true then time_var = b end
				end

				-- get nationality of the winner, nationality could have changed, therefore look for qualifiers p580 and p582
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( winner ), 'P27', 1) -- standard: only one nationality
				if a == true then
					tt[num] = flag("Q"..b, time_var) .. " " .. WPlink(winner) .. " "
					if WDlink_on == true then tt[num] = tt[num].. wdLink(winner) end
				else if WDlink_on == true then tt[num] = "  " .. wdLink(winner) else tt[num] = "" end
				end

				-- if person has more than one nationality calculate tt[num] again
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( winner ), 'P27', 2)
				if a == true then
					local _, bb = timeStartEnd(winner, "P27", 'numeric-id', time_var)
					tt[num] = flag('Q'..bb, time_var) .. " " .. WPlink(winner) .. " "
					if WDlink_on == true then tt[num] = tt[num].. wdLink(winner) end
				end
			end -- if v1.
		end -- for k, v1
		end -- if
	end -- for num=
return tt
end

function p.listofwinners(frame)
	local t = {number, race={}, year={}, vainqueur, second, troisieme}
	frame.args[1] =	string.gsub(frame.args[1], "%c", "")
	local entity = mw.wikibase.getEntity( frame.args[1] )
	local WDlink_on
	local wiki = string.match(mw.site.server, "%a+")
	local WPcontent = {}
	
	local localFrame 
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name 
	then localFrame = frame:getParent() else localFrame = frame end
	if localFrame.args[1] ~= nil then localFrame.args[1] = string.gsub(localFrame.args[1], "%c", "") end 
--[=[ 
It is possible to give the table listofwinners in the article commands. It could look like this:
{{Cycling race/listofwinners|Q18574623
| above row 1: '''[[aaa bbb ccc]]''' xxx 
}}
"above row x" inserts a new row above row x into the table. Content is what is behind the ":". 
]=]
	if localFrame.args[2] ~= nil then
		for num,var in pairs(localFrame.args) do
			if num > 1 and mw.ustring.find(mw.ustring.lower(localFrame.args[num]), 'row') then
				local _, _, key1, val = mw.ustring.find(localFrame.args[num], "([^:]+)%s*:%s*(%C+)")
				local _, _, key01, key11, key12 = mw.ustring.find(key1, "(%a+)%s*(%a+)%s*(%d+)")
				key12 = tonumber(key12) key11 = mw.ustring.lower(key01..key11)
				if key11 == 'aboverow' then WPcontent[key12] = val end
			end
		end
	end

	-- WDlink_on is used to decide if a Wikidata flag will be shown
	if wiki == "aar" or wiki == "mk" or wiki == "ja" or wiki == "ru" then WDlink_on = true else WDlink_on = false end

	local num = 0
	if pcall(fooA, 'numeric-id', entity, 'P527', 1) == true then 
	for k, v1 in pairs(entity.claims['P527']) do
		local year, race, entity_race, a, b 
		race = 'Q'..v1.mainsnak.datavalue.value['numeric-id'] -- Qnumbers of the parts of a tour
		entity_race = mw.wikibase.getEntityObject(race)

		-- P585(point in time for a single day race) or P580(start time for a stage race)
		a, b = pcall(fooA, 'time', entity_race, 'P585', 1) 
		if a == true then year = b 
		else 
			a, b = pcall(fooA, 'time', entity_race, 'P580', 1)
			if a == true then year = b end
		end

		if year ~= nil then _, _, year, _, _ = string.find(year, "(%d+)-(%d+)-(%d+)") end
		table.insert(t.race, { race, year} )
	--	table.sort(t.race, function(a,b) return a[2] < b[2] end) -- t.race is sorted after year
		num = num + 1
	end
	end -- for k, v1
	t.number = num

	for num=1,t.number do -- build year column with link to wikipedia article and to wikidata item
		local sitelink = mw.wikibase.sitelink( t.race[num][1] )
		if sitelink and sitelink ~='' then sitelink = "[[" .. sitelink .. "|" .. (t.race[num][2] or sitelink).. "]]"
			else sitelink =  (t.race[num][2] or '')  end
		if WDlink_on == false then table.insert(t.year, sitelink) else table.insert(t.year, sitelink.. " " .. wdLink(t.race[num][1]) ) end
	end 

	t.vainqueur = winner(wiki, t, 20882667) -- build vainqueur column
	t.second = winner(wiki, t, 20882668) -- build second column
	t.troisieme = winner(wiki, t, 20882669) -- build troisiem column

	local table_first = "<table cellpadding='4' cellspacing='0' style='border:1px solid rgb(200,200,200); color:black;"..
		"margin:0 0 0.5em 0; background-color:rgb(255, 255, 255); padding:5px; clear:left; "..
		"text-align:right; vertical-align:top; font-size:85%; line-height:1.6em;'>"
	local table_proto = "<tr style='background:#FFDF80; text-align:center'><th>"
	if WDlink_on == false then table_proto = table_proto .. '<span style="float:left">[[File:Wikidata-logo S.svg|12px|link=d:'.. frame.args[1].. '#P527]]</span>' end    
	table_proto = table_proto.. headoftableIV(wiki,1).. "</th><th>".. headoftableIV(wiki,2).. "</th><th>".. headoftableIV(wiki,3).. "</th><th>".. headoftableIV(wiki,4).. "</th></tr>"
	local table_center, table_last = "", "</table>"

	for var=1, t.number do 
		if type(WPcontent) == 'table' and WPcontent[var] ~= nil then table_center = table_center.. 
			"<tr><td colspan='4' style='text-align:center'>".. WPcontent[var].. "</td></tr>" end		

		table_center = table_center .. "<tr><td style='text-align:center'>".. t.year[var].."</td>"
		table_center = table_center .. "<td>"..t.vainqueur[var].."</td>" 
		table_center = table_center .. "<td>"..t.second[var].."</td>" 
		table_center = table_center .. "<td>"..t.troisieme[var].."</td></tr>" 
	end
	return table_first .. table_proto .. table_center .. table_last 
end

function p.listofstages(frame)
	if frame.args[1] ~= nil then frame.args[1] = string.gsub(frame.args[1], "%c", "") end
	local i, k, v, uu, ii, nationality
	local entity, etape, stage = {}, {}, {}
	local series_ordinal, point_of_time, length = {}, {}, {}
	local sitelinks_etape, sitelinks1, sitelinks2, sitelinks3, sitelinks4 = {}, {}, {}, {}, {}
	local y, m, d = {}, {}, {}
	local flag1, flag2 = {}, {}
	local number0, number1, number2 = {}, {}, {}
	local level = false
	local a, b, num, var
	local wiki = string.match(mw.site.server, "%a+")
	local entity0 = mw.wikibase.getEntityObject( frame.args[1] )
	local WDlink_on
	local _, _, key1, key01, key11, key12, key2, key21, key22, val
	local WPcontent = {}

	local localFrame 
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name 
	then localFrame = frame:getParent() else localFrame = frame end
	if localFrame.args[1] ~= nil then localFrame.args[1] = string.gsub(localFrame.args[1], "%c", "") end 
--[=[ It is possible to give the table listofstages in the article commands which overwrites data from Wikidata. It could look like this:
{{Cycling race/listofstages|Q18574623
| RoW  1: locaTION Ab : [[1a1b]]
| after row 1 : date : 99 août 	
| after row 1 : icon : [[File:Stage rest day.svg|vbght frthzt fdgtr]]
| after row 1: text : rest day at [[aaa bbb ccc]] 
|row 4:  location A : [[4a4a]]abc
| row 3 : winner a : <sup>tzhgt<sup/>
| row 4 : winner b : kjuzhgt<br />bbjje
| row 4 : icon : [[File:Mediummountainstage.svg|xcvbbgf fgtr]] 
| row 4 : distance : <s>141.8</s> 122<ref>test</ref>
}}
The first paramer is "row x" or "after row x". "after row" adds a new row after row x into the table to print e.g. a rest day. The second parameters are 
"location [a/b/ab]", "date", "icon", "text", "winner [a/b]" and "distance". "a" and "b" means the first and the second location or winner. "ab" could be used if 
start location and end location are the same. The file data for the icon looks this way: [[File:Stage rest day.svg|any text]]  
]=]
if localFrame.args[2] ~= nil then
	--	local WProw, WPcourse, WPwinner = mw.ustring.lower(headoftable(1)), mw.ustring.lower(headoftable(3)), mw.ustring.lower(headoftable(5))
	local WProw, WPnew_row, WPcourse, WPtext, WPdate, WPwinner, WPicon, WPdistance = 'row', 'afterrow', 'location', 'text', 'date', 'winner', 'icon', 'distance'	
	for num,var in pairs(localFrame.args) do 
		if num > 1 and mw.ustring.find(mw.ustring.lower(localFrame.args[num]), WProw) then
			_, _, key1, key2, val = mw.ustring.find(localFrame.args[num], "([^:]+)%s*:?%s*([^:]*)%s*:%s*(%C+)")
			_, _, key01, key11, key12 = mw.ustring.find(key1, "(%a+)%s*(%a+)%s*(%d+)")
			key12 = tonumber(key12) key11 = mw.ustring.lower(key01..key11)
			key2 = mw.ustring.lower(mw.text.trim(key2))			
			_, _, key21, key22 = mw.ustring.find(key2, "(%a+)%s*(%a*)")
			key21 = mw.ustring.lower(key21) key22 = mw.ustring.lower(key22)

			if type(WPcontent[key12]) ~= 'table' then WPcontent[key12] = {} end
			if key11 == WProw and key21 == WPcourse then WPcontent[key12][key22] = val end
			if key11 == WPnew_row and key2 == WPdate then
				WPcontent[key12]['date'] = val
				WPcontent[key12]['text'] = WPcontent[key12]['text'] or ''
				WPcontent[key12]['icon (new row)'] = WPcontent[key12]['icon (new row)'] or ''
			end
			if key11 == WPnew_row and key2 == WPtext then
				WPcontent[key12]['text'] = 	val
				WPcontent[key12]['date'] = 	WPcontent[key12]['date'] or ''
				WPcontent[key12]['icon (new row)'] = WPcontent[key12]['icon (new row)'] or ''
			end
			if key11 == WPnew_row and key2 == WPicon then
				val = mw.ustring.gsub(val, "|", "|border|right|20px|", 1)
				WPcontent[key12]['icon (new row)'] = val
				WPcontent[key12]['date'] = 	WPcontent[key12]['date'] or ''
				WPcontent[key12]['text'] = WPcontent[key12]['text'] or ''
			end
			if key11 == WProw and key21 == WPwinner and key22 == 'a' then WPcontent[key12]['stage winner'] = val end
			if key11 == WProw and key21 == WPwinner and key22 == 'b' then WPcontent[key12]['general winner'] = val end
			if key11 == WProw and key21 == WPicon then
				val = mw.ustring.gsub(val, "|", "|border|right|20px|", 1) WPcontent[key12]['icon'] = val end
			if key11 == WProw and key21 == WPdistance then WPcontent[key12]['distance'] = val end
		end
	end
end
	-- if there is one 'P527' then level = true
	a, b = pcall(fooA, 'numeric-id', entity0, 'P527', 1)
	if a == true then level = true end

	-- read series_ordinal and the Qnumber and sort them after series_ordinal, eg: 1 2a 2b 3 4 5
	local parts = {}
	for num, v in pairs(entity0.claims["P527"]) do
		etape[num] = 'Q'..v.mainsnak.datavalue.value['numeric-id']
		entity[num] = mw.wikibase.getEntityObject( etape[num] )
		a, b = pcall(fooA, 'value', entity[num], 'P1545', 1)
		if a == true then series_ordinal[num] = b else series_ordinal[num] = " " end
		table.insert(parts, num, {nr = series_ordinal[num], Qnum = etape[num]})
	end

	-- sort parts after nr = series_ordinal[num], not Qnum
	table.sort(parts, function(a, b)
		local num1 = string.sub(a.nr, string.find(a.nr, "%d+"))
		local num2 = string.sub(b.nr, string.find(b.nr, "%d+"))
		local char1, char2
		if string.find(a.nr, "%a") then char1 = string.sub(a.nr, string.find(a.nr, "%a")) else char1 = "" end
		if string.find(b.nr, "%a") then char2 = string.sub(b.nr, string.find(b.nr, "%a")) else char2 = "" end

		local comp
		if char1 == "" and char2 == "" then comp = tonumber(num1) < tonumber(num2) end		
		if char1 ~= "" or char2 ~= "" then comp = tonumber(num1) < tonumber(num2) end
		if char1 ~= "" and char2 ~= "" then
			if num1 == num2 then comp = char1 < char2
			else comp = tonumber(num1) < tonumber(num2)
			end
		end
		return comp end)

	-- WDlink_on is used to decide if a Wikidata flag will be shown
	if wiki == "mk" or wiki == "ja" or wiki == "ru" then WDlink_on = true else WDlink_on = false end

	var = #entity0.claims["P527"]
	for num=1,var do
		-- collect data from Wikidata in tables 
		entity[num] = mw.wikibase.getEntityObject( parts[num].Qnum )
		if WDlink_on == false then number0[num]= " " else number0[num] = "&nbsp;" .. wdLink(parts[num].Qnum) end
		sitelinks_etape[num] = entity[num]:getSitelink()

		a, b = pcall(fooA, 'value', entity[num], 'P1545', 1)
		if a == true then series_ordinal[num] =  b else series_ordinal[num] = " " end
		a, b = pcall(fooA, 'time', entity[num], 'P585', 1)
		if a == true then point_of_time[num] =  b else point_of_time[num] = " " end
		a, b = pcall(fooA, 'numeric-id', entity[num], 'P1427', 1)
		if a == true then sitelinks1[num] =  WPlink( 'Q'..b, 'pure' ) else sitelinks1[num] = " " end
		a, b = pcall(fooA, 'numeric-id', entity[num], 'P1444', 1)
		if a == true then sitelinks2[num] =  WPlink( 'Q'..b, 'pure' ) else sitelinks2[num] = " " end
		a, b = pcall(fooA, 'amount', entity[num], 'P3157', 1)
		if a == true then length[num] =  b else length[num] = " " end
		a, b = pcall(fooA, 'amount', entity[num], 'P2043', 1)
		if a == true then length[num] =  b else if length[num] ~= ' ' then length[num] = " " end end

	flag1[num] = ' '
	sitelinks3[num] = ' '
	number1[num]  = ' '
	local id, qual
	-- find the vainqueur d'étape, Q20882747
	if pcall(foo3, entity[num], "P1346", 1, "P642", 1) then
		local v
		for _, v in pairs(entity[num].claims["P1346"]) do
			if pcall(function() id = v.mainsnak.datavalue.value['numeric-id'] end) then else id = nil end
			qual = v.qualifiers["P642"][1].datavalue.value["numeric-id"]
			if id ~= nil and v.rank ~= 'deprecated' then
				if qual == 20882747 then
					number1[num]  = 'Q' .. id
					a, b = timeStartEnd(number1[num], "P27", 'numeric-id', point_of_time[num])
					if a == true then
						flag1[num] = flag('Q'..b, point_of_time[num])
						sitelinks3[num] = WPlink( number1[num] )
					else
						a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject(number1[num]), 'P17', 1)
						if a == true then
							flag1[num] = flag('Q'..b, point_of_time[num])
							sitelinks3[num] = WPlink( number1[num], 'team', point_of_time[num] ) 
						end
					end
					if WDlink_on == false then number1[num]="" else number1[num] =
						"<span style='white-space:nowrap'>&nbsp;[[File:Wikidata-logo S.svg|12px|link=d:".. number1[num] .. ']]</span>' end
				end
 			end -- if id
  		end	-- for
	end  -- end if pcall

	flag2[num] = ' '
	sitelinks4[num] = ' '
	number2[num]  = ' '
	local id, qual
	-- find the leader du classement général à l'issue de l'étape, Q20882763
	if pcall(foo3, entity[num], "P1346", 1, "P642", 1) then
		local v
		for _, v in pairs(entity[num].claims["P1346"]) do
			if pcall(function() id = v.mainsnak.datavalue.value['numeric-id'] end) then else id = nil end
			qual = v.qualifiers["P642"][1].datavalue.value["numeric-id"]
			if id ~= nil and v.rank ~= 'deprecated' then
				if qual == 20882763 or qual == 20882667 then
					number2[num]  = 'Q' .. id
					a, b = timeStartEnd(number2[num], "P27", 'numeric-id', point_of_time[num])
					if a == true then
						flag2[num] = flag( 'Q'..b, point_of_time[num])
						sitelinks4[num] = WPlink( number2[num] )		
					else
						a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject(number2[num]), 'P17', 1)
						if a == true then
							flag2[num] = flag( 'Q'..b, point_of_time[num])
							sitelinks4[num] = WPlink( number2[num], 'team' )			
						end
					end
					if WDlink_on == false then number2[num]="" else number2[num] =
						"<span style='white-space:nowrap'>&nbsp;[[File:Wikidata-logo S.svg|12px|link=d:"..number2[num] .. ']]</span>' end
				end
 			end -- if id
  		end	-- for
	end  -- end if pcall
	
	if pcall(function()
		-- find the type of stages
		i = 1
		stage[num] = ""
		uu = entity[num].claims["P31"][i].mainsnak.datavalue.value['numeric-id']
		while entity[num].claims["P31"][i] do
			if uu == 20646667 then stage[num] = typeofstage('plain stage') break end
			if uu == 20646670 then stage[num] = typeofstage('hilly stage') break end
			if uu == 20680270 then stage[num] = typeofstage('intermediate stage') break end
			if uu == 20646668 then stage[num] = typeofstage('mountain stage') break end
			if uu == 485321 then stage[num] = typeofstage('time trial stage', 485321) break end -- prologue
			if uu == 2266066 then stage[num] = typeofstage('time trial stage', 2266066) break end -- individual time trial
			if uu == 2348250 then stage[num] = typeofstage('time trial stage', 2348250) break end -- team time trial
			if uu == 20679712 then stage[num] = typeofstage('uphill time trial stage') break end
			i = i + 1
		end
		end)
	then else stage[num] = " " end

     _, _, y[num], m[num], d[num] = string.find(point_of_time[num], "(%d+)-(%d+)-(%d+)") -- d = day, m = month

	end -- end for num=1,var do

	local table_first, table_proto, table_last
	table_first = "<table border='0' cellpadding='4' cellspacing='0' style='border:1px solid rgb(200,200,200); color:black; "
	table_first = table_first .. "margin:0 0 0.5em 0; background-color:rgb(255, 255, 255); padding:5px; clear:left; "
	table_first = table_first .. "text-align:right; font-size:85%; line-height:1.6em;'>"
	table_proto = "<tr style='background:#FFDF80; text-align:center;'><th nowrap>"
	if WDlink_on == false then table_proto = table_proto .. "[[File:Wikidata-logo S.svg|12px|link=d:".. localFrame.args[1].. "#P527]]" end
	table_proto = table_proto.. headoftable(1) .."</th><th>" ..	headoftable(2) .."</th><th>".. headoftable(3)..
	"</th>".. "<th style='color:#FFDF80'>type</th>" .."<th>".. headoftable(4).. "</th><th>".. headoftable(5).."</th><th>".. headoftable(6).. "</th></tr>"
	table_last = "</table>"

     -- build table for output
	local table_center = ""
	var = #entity0.claims["P527"]
	for num=1, var do
		local a, b
		a, _ = string.gsub(series_ordinal[num], "%a", "") -- 20, not 20a
		if string.find(series_ordinal[num], "%a") then b = string.sub(series_ordinal[num], string.find(series_ordinal[num], "%a"))
		else b = "" end
		local ee, er = stageLink(series_ordinal[num], a, b)
		if series_ordinal[num] == "0" then
			er = "#"..func_prologue()
			ee = func_prologue()
		end
		local stageNr -- if there is a wikipedia article of that stage show it or show the section
		if sitelinks_etape[num] == nil then stageNr = "[["..er.."|"..ee.."]]" else stageNr = "[["..sitelinks_etape[num].."|"..ee.."]]" end

		local day = tostring(tonumber(d[num]))
		if day == "1" and (wiki == "fr") then day = "1<sup>er</sup>" end
		if wiki == "lv" then stageNr = series_ordinal[num] end
		local month = func_month(m[num])
		local date = day..' ' .. month
		if wiki == "br" then date = day.. " a viz ".. month  end
		if wiki == "ca" or wiki == "es" then date = day .. " de ".. month end
		if wiki == "eo" then date = day.. "-a de ".. month end
		if wiki == "eu" then date = month.. "k ".. day end
		if wiki == "hu" then date = month.. " ".. day .."." end
		if wiki == "ja" then date = month.. day .. "日" end
		if wiki == "de" or wiki == "da" or wiki == "fi" or wiki == "fo" or wiki == "no" or wiki == "lv" then date = day.. ". ".. month end
		if wiki == "cs" then date = day.. ". xg ".. month end
		if wiki == "en" then date = month.. " ".. day end

		if pcall(function()
			length[num] = mw.language.getContentLanguage():formatNum(tonumber(length[num])) 
			end        	
		) then else length[num] = " " end

		if type(WPcontent[num]) == 'table' and WPcontent[num]['a'] ~= nil then sitelinks1[num] = WPcontent[num]['a'] end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['b'] ~= nil then sitelinks2[num] = WPcontent[num]['b'] end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['ab'] ~= nil then sitelinks1[num] = WPcontent[num]['ab'] sitelinks2[num] = '' end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['icon'] ~= nil then stage[num] = WPcontent[num]['icon'] end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['distance'] ~= nil then length[num] = WPcontent[num]['distance'] end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['stage winner'] ~= nil then
			flag1[num] = '' sitelinks3[num] = WPcontent[num]['stage winner'] number1[num]= '' end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['general winner'] ~= nil then
			flag2[num] = '' sitelinks4[num] = WPcontent[num]['general winner'] number2[num]= '' end

		table_center = table_center.. "<tr><td style='text-align:center; white-space:nowrap'>".. stageNr .. "<span style='white-space:nowrap'>&nbsp;".. number0[num].."</span>"..
		"</td><td style='white-space:nowrap; text-align:right; padding-right:0px'>"..date.. "</td><td style='padding-right:0px'>".. sitelinks1[num]
		if sitelinks2[num] ~= '' then table_center = table_center.. " – " end
		table_center = table_center.. sitelinks2[num].."</td><td style='padding-top:10px'>".. stage[num].. "</td><td style='text-align:center'>".. length[num].. "</td>"
		if type(WPcontent[num]) == 'table' and WPcontent[num]['stage winner'] ~= nil then
			table_center = table_center.. "<td style='text-align:center'>".. flag1[num].. ' '.. sitelinks3[num].. number1[num]
		else table_center = table_center.. "<td>".. flag1[num].. ' '.. sitelinks3[num].. number1[num] end
		if type(WPcontent[num]) == 'table' and WPcontent[num]['general winner'] ~= nil then
			table_center = table_center.. "<td style='text-align:center'>".. flag2[num].. ' '.. sitelinks4[num].. number2[num].. "</td></tr>"
		else table_center = table_center.. "<td>".. flag2[num].. ' '.. sitelinks4[num].. number2[num].. "</td></tr>" end

		if type(WPcontent[num]) == 'table' and (WPcontent[num]['date'] ~= nil or WPcontent[num]['text'] ~= nil or WPcontent[num]['icon (new row)'] ~= nil) 
		then table_center = table_center.. "<tr><td></td>"
			if WPcontent[num]['icon (new row)'] == '' then table_center = table_center.."<td nowrap style='text-align:right; padding:3px 0px 10px 0px'>".. WPcontent[num]['date']
			else table_center = table_center.."<td style='text-align:right; padding-right:0px'>".. WPcontent[num]['date'] end
			if WPcontent[num]['icon (new row)'] == '' then table_center = table_center.."</td><td style='text-align:right; padding:3px 4px 10px'>"..WPcontent[num]['text']
			else table_center = table_center.."</td><td style='text-align:right'>"..WPcontent[num]['text'] end
			table_center = table_center.."</td><td style='padding-top:10px'>".. WPcontent[num]['icon (new row)'].. "</td><td colspan='3' ></td></tr>"
		end
    end

    local tabl = table_first.. table_proto
    if level == true then tabl = tabl.. table_center.. table_last else tabl = tabl.. table_last end
    return tabl
end

function func_prologue() -- returns the word "Prologue"
	local wiki=wiki -- global wiki to local wiki
	if wiki=='www' then return loadI10n.func_prologue["fr"]
	else 
		if loadI10n.func_prologue[wiki] ~= nil then return loadI10n.func_prologue[wiki] else return loadI10n.func_prologue["en"] end -- if no translation, show en translation
	end
end

function func_prologue() -- returns the word "Prologue"
	local wiki,word=mw.site.server 
	if wiki=='//www.wikidata.org' then return loadI10n.func_prologue["fr"]
	else return loadI10n.func_prologue[string.sub(wiki,string.find(wiki,"%a+"))] end
end

function stageLink(x, a, b) -- x= 10a: a = 10, b = a. x = 5: a = 5, b = "" 

	local wiki=wiki -- global wiki to local wiki
	local word1, word2
	if wiki=='www' then word2=loadI10n.stageLink["fr"] else word2=loadI10n.stageLink[wiki] end
	if word2 == nil then word2=loadI10n.stageLink["en"] end -- if no translation, show en translation
	local word = word2

-- fr: {{1re}} étape, {{2e}} étape
	if wiki=="www" or wiki=="fr" or wiki=="lb" then
		if b == "" then -- series_ordinal without character
			if a == "1" then word1 = "1<sup>re</sup> "..word else word1 = a.."<sup>e</sup> "..word end -- table text = {{1re}} étape, {{2ae}} étape,
			if a == "1" then word2 = "#1re "..word else word2 = "#"..a.."e  "..word end --text of section header = #1re étape, #2e étape
			return word1, word2
		end
		if b ~= "" then -- series_ordinal with character: instead of eg "1a re" it is "1re a"
			if a == "1" then word1 = "1<sup>re</sup> "..b.." "..word else word1 = a.."<sup>e</sup> "..b.." "..word end -- table text = {{1re}} étape, {{2ae}} étape,
			if a == "1" then word2 = "#1re "..b.." "..word else word2 = "#"..a.."e"..b.." "..word end --text of section header = #1re étape, #2e étape
			return word1, word2
		end
	end
	if wiki=="de" or wiki=="da" or wiki=="fo" or wiki=="no" then return a..". "..b.." "..word, "#"..a..". "..b.." "..word end
	if wiki=="ca" then return a.."a "..b.." "..word, "#"..a..". "..b.." "..word end
	if wiki=="es" then return a.."<sup>a</sup> "..b.." "..word, "#"..a..". "..b.." "..word end

	-- default
	word1 = x                  -- table text = 1, 2a, 3
	word2 = "#"..word.." ".. x -- text of section header = #Etappe 2a, #Stage 4
	return word1, word2 
end

function func_month(x) 

	local wiki,l10n=mw.site.server 
	if wiki=='//www.wikidata.org' then return loadI10n.func_month["fr"][tonumber(x)]
	else return loadI10n.func_month[string.sub(wiki,string.find(wiki,"%a+"))][tonumber(x)] end
end

function headoftable(x) -- En-tête du tableau listant les étapes
	local wiki,l10n=mw.site.server 
	if wiki=='//www.wikidata.org' or wiki ==  '//als.wikipedia.org' then l10n=loadI10n.headoftable["fr"]  
	else l10n=loadI10n.headoftable[string.sub(wiki,string.find(wiki,"%a+"))] end

	return l10n[x]
end 

function headoftableII(wiki,x) -- En-têtes des tableaux générant les classements
	local l10n = loadI10n.headoftableII[wiki]
	if wiki=='//www.wikidata.org' then l10n=loadI10n.headoftableII["fr"] end
	if not l10n then l10n = loadI10n.headoftableII["en"] end  -- default
	return l10n[x]	
end

function headoftableIII(wiki,x) -- En-tête du tableau listant les équipes participantes (P1923)
	local l10n = loadI10n.headoftableIII[wiki]
	if wiki=='//www.wikidata.org' then l10n=loadI10n.headoftableII["fr"] end
	if not l10n then l10n = loadI10n.headoftableIII["en"] end  -- default
	return l10n[x]	
end

function headoftableIV(wiki,x) -- En-tête du tableau listant les équipes participantes (P1923)
	local l10n = loadI10n.headoftableIV[wiki]
	if not l10n then l10n = loadI10n.headoftableIV["en"] end  -- default
	return l10n[x]	
end

function typeofstage(x, typ)
	
	local wiki,l10n=mw.site.server 
	if wiki=='//www.wikidata.org' then l10n=loadI10n.typeofstage["fr"]
	else l10n=loadI10n.typeofstage[string.sub(wiki,string.find(wiki,"%a+"))] end

 	if x=='plain stage' then return "[[File:Plainstage.svg|border|right|20px|"..l10n.plain.."]]" end
 	if x=='hilly stage' then return "[[File:Hillystage.svg|border|right|20px|"..l10n.hilly.."]]" end
  	if x=='intermediate stage' then return "[[File:Mediummountainstage.svg|right|border|20px|"..l10n.inter.."]]" end
  	if x=='mountain stage' then return "[[File:Mountainstage.svg|border|right|20px|"..l10n.mount.."]]" end
  	if x=='uphill time trial stage' then return "[[File:Mountain Time Trial Stage.svg|border|right|20px|"..l10n.uphill.."]]" end
   	if x=='rest day' then return "[[File:Stage rest day.svg|border|right|20px|"..l10n.rest.."]]" end
   	if x=='time trial stage' then 
   		if typ==2348250 then return "[[File:Team Time Trial Stage.svg|right|20px|"..l10n.time_team.."]]" end
   		if typ==2266066 then return "[[File:Time Trial.svg|right|20px|"..l10n.time_indiv.."]]" end
   		if typ==485321  then return "[[File:Time Trial.svg|right|20px|"..l10n.time_prologue.."]]" end
    end	
end

function wdLink (id)
	return "[[File:Wikidata-logo S.svg|12px|link=d:" .. id .. "]]"
end

function flag (x, date)
	local year,m,d
	if date==nil then date = '+'..os.date('%Y-%m-%d') end 	
	local flag1 = { -- Q..a current flag, Q..b, Q..c older flag. date: "+2016", "+2016-01-30", ..
	Q29a={"[[File:Flag of Spain.svg|border|20px|ESP]]","+1982",""},
	Q29b={"[[File:Flag of Spain (1977 - 1981).svg|border|20px|ESP]]","+1977","+1981"},
	Q30= "[[File:Flag of the United States (Pantone).svg|border|20px|USA]]",
	Q31= "[[File:Flag of Belgium (civil).svg|border|20px|BEL]]",
	Q38a={"[[File:Flag of Italy.svg|border|20px|ITA]]","+1947",""},
	Q38b={"[[File:Flag of Italy (1861-1946) crowned.svg|border|20px|ITA]]","+1861","+1946"},
	Q39="[[File:Flag of Switzerland.svg|border|15px|SUI]]",
	Q55= "[[File:Flag of the Netherlands.svg|border|20px|NED]]",
	Q142="[[File:Flag of France.svg|border|20px|FRA]]",
	Q145="[[File:Flag of the United Kingdom.svg|border|20px|GBR]]",
	Q183a={"[[File:Flag of Germany.svg|border|20px|GER]]","+1949-05-23",""},
	Q183b={"[[File:Flag of German Reich (1935–1945).svg|border|20px|GER]]","+1935","+1945"},
	Q183c={"[[File:Flag of the NSDAP (1920–1945).svg|border|20px|GER]]","+1933","+1935"},
	Q183d={"[[File:Flag of Germany (3-2 aspect ratio).svg|border|20px|GER]]","+1919","+1933"},
	Q183e={"[[File:Flag of the German Empire.svg|border|20px|GER]]","+1866","+1918"},
	Q218a={"[[File:Flag of Romania.svg|border|20px|ROU]]","+1989-12-27",""},
	Q218b={"[[File:Flag of Romania (1965-1989).svg|border|20px|ROU]]","+1965","+1989-12-26"},
	Q218c={"[[File:Flag of Romania (1952-1965).svg|border|20px|ROU]]","+1952","+1965"},
	Q218d={"[[File:Flag of Romania (1948-1952).svg|border|20px|ROU]]","+1948","+1952"},
	Q218e={"[[File:Flag of Romania.svg|border|20px|ROU]]","+1867-07-01","+1948"},
	Q224a={"[[File:Flag of Croatia.svg|border|20px|CRO]]","+1990-12-21",""},
	Q224b={"[[File:Flag of Croatia (white chequy).svg|border|20px|CRO]]","+1990-06-27","+1990-12-21"}
	}

	if flag1[x..'a']~=nil and date>=flag1[x..'a'][2] and flag1[x..'a'][3]=='' then return flag1[x..'a'][1] end
	if flag1[x..'b']~=nil and date>=flag1[x..'b'][2] and date<=flag1[x..'b'][3] then return flag1[x..'b'][1] end
	if flag1[x..'c']~=nil and date>=flag1[x..'c'][2] and date<=flag1[x..'c'][3] then return flag1[x..'c'][1] end
	if flag1[x..'d']~=nil and date>=flag1[x..'d'][2] and date<=flag1[x..'d'][3] then return flag1[x..'d'][1] end
	if flag1[x..'e']~=nil and date>=flag1[x..'e'][2] and date<=flag1[x..'e'][3] then return flag1[x..'e'][1] end	
	if flag1[x]~=nil then return flag1[x] end	

	local flag2 = { Q16={'Q80110','CAN'}, Q17={'Q43175','JPN'}, Q20={'Q83149','NOR'}, Q27={'Q82205','IRL'}, Q32={'Q133022','LUX'}, Q33={'Q47891','FIN'},
	Q34={'Q81286','SWE'}, Q35={'Q60149','DEN'}, Q36={'Q42436','POL'}, Q37={'Q81477','LTU'}, Q39={'Q124020','SUI'}, Q77={'Q171103','URU'},  
	Q96={'Q122462','MEX'}, Q145={'Q83278','GBR'}, Q159={'Q16611','RUS'}, Q191={'Q81471','EST'}, Q211={'Q130449','LAT'}, Q212={'Q127974','UKR'}, 
	Q213={'Q127155','CZE'}, Q214={'Q160861','SVK'}, Q232={'Q131650','KAZ'}, Q262={'Q83392','DZA'}, Q408={'Q81676','AUS'}, Q414={'Q130774','ARG'}, 
	Q664={'Q160260','NZL'}, Q717={'Q165538','VEN'}, Q739={'Q160425','COL'} }  	

	local xx
	if flag_table[x] ~= nil then return flag_table[x] end

	if flag2[x]~=nil then xx = x x = flag2[x] end -- transform x to new x 
	if type(x)=='table' and pcall(foo1,x[1]) then -- for transformed x
		local entity=mw.wikibase.getEntity(x[1])
		local a,b=pcall(fooA,'value',entity,'P18',1) -- P18 (image)
		if a==true then 
			flag_table[xx] = "[[File:"..b.."|border|20px|"..x[2].."]]" 		
			return "[[File:"..b.."|border|20px|"..x[2].."]]" 
		end 
	end
	if type(x)=='string' and pcall(foo1,x) then -- reading the flag data from untransformed items, e.g. Q29 
		local entity = mw.wikibase.getEntity( x ) 
		local flags = entity.claims["P41"]
		local possible_flag = {}
		local num = 1
		if pcall(fooA, 'numeric-id', entity, 'P41', 1) then
		local v
		for _, v in pairs(flags) do
			if v.qualifiers then
				if (not v.qualifiers["P580"] or v.qualifiers["P580"][1].datavalue.value.time <= date)
					and (not v.qualifiers["P582"] or v.qualifiers["P582"][1].datavalue.value.time >= date)
				then possible_flag[num]=v.mainsnak.datavalue.value num=num+1 end
			else possible_flag[num]=v.mainsnak.datavalue.value num=num+1 end
		end	
		local file="[[File:"..possible_flag[1].."|border|20px" 
		local a2,b2=pcall(fooA,'value',entity,'P984',1) -- P984 (country code by the International Olympic Committee)				
		if a2==true then file=file.."|"..b2.."]]" else file=file.."]]" end 
		flag_table[x] = file		
		return file
		end	
	end 
	return " "
end 

return p