Britain’s Geraint Thomas retained his overall lead in the Tour de France as Arnaud Demare won a sprint finish in Pau to take the 18th stage.
Team Sky’s Thomas finished safely in the peloton to maintain his lead of one minute 59 seconds over Tom Dumoulin.
Defending champion Chris Froome remains third, a further 32 seconds back, with only a mountain stage, a time trial and Sunday’s finale in Paris to come.
Demare held off fellow Frenchman Christophe Laporte to win.
Peter Sagan, who is assured of the green jersey in the points classification, provided he makes it to Paris, briefly looked set to contest the finish.
The Slovak’s Bora-Hansgrohe team-mates set the pace into the final kilometre but Sagan, who suffered cuts in a crash yesterday, opted to stay out of the fray.
Thomas saves energy for another day
Thomas and the rest of his general classification rivals were virtually invisible during the stage, tucked away in the peloton to conserve energy for the final two competitive stages of the race.
Friday’s mountainous stage takes in the famed Col du Tourmalet, but another 92km follows with the finish at the top of less steep Col d’Aubisque.
Saturday’s 31km individual time trial will provide the final challenge.
“We are in a great position,” Thomas told BBC Sport. “We’re expecting attacks on Friday so we’ll try be ready for that.
“I think Froome will help me if he has to but hopefully we’ll have enough strength that he doesn’t have to do too much and can save himself for Saturday’s time trial.”
Dutchman Dumoulin is the world time trial champion and won the 2017 Giro d’Italia when that race’s final stage was played out over the format.
Four-time Tour winner Froome has won four individual time trials in Grand Tours – including during his 2013 and 2016 Tour victories – and has picked up two Olympic bronze medals in the discipline.
However, Thomas’ own form – he won the British Championships time trial by more than half a minute in June – means Froome and Dumoulin may struggle to reel in the Welshman.
Sunday’s final stage is the ceremonial procession to Paris, when tradition dictates there is a truce in the general classification.
Social media slight powers FDJ
Demare’s win is the third stage success by a Frenchman in this year’s race, but it came with a significant, if unwitting, assist from a German rival.
Lotto Soudal’s Andre Greipel, who withdrew from the race on stage 12, suggested on social media on Wednesday that Demare received illegal help from the team car to stay within the time limit on Wednesday’s climb up the Col du Portet.
Greipel swiftly withdrew the insinuation and apologised after Demare offered to share the data from his ride on Wednesday, but the incident fuelled the whole of the FDJ team.
“For sure that gave as an extra boost, so thank you Andre,” said Demare’s team-mate Jacopo Guarnieri.
“The first time I meet him it will be a chance to clarify.”
Mark Cavendish’s verdict from BBC Sport’s stage-by-stage guide: “The last big showdown in the mountains for the climbers. It’s going to be a long old day in the saddle and it’s going to be everyone leaving everything they have on the road.”
Stage 18 result:
1. Arnaud Demare (Fra/Groupama-FDJ) 3hrs 46mins 40secs
2. Christophe Laporte (Fra/Cofidis) Same time
3. Alexander Kristoff (Nor/UAE Team Emirates)
4. Edvald Boasson Hagen (Nor/Dimension Data)
5. Sonny Colbrelli (Ita/Bahrain-Merida)
6. Mximiliano Richeze (Arg/Quick-Step Floors)
7. John Degenkolb (Ger/Trek-Segafredo)
8. Peter Sagan (Svk/Bora-Hansgrohe)
9. Taylor Phinney (US/Team EF Education First-Drapac P/B Cannondale)
10. Timothy Dupont (Bel/Wanty-Groupe Gobert)
General classification after stage 18:
1. Geraint Thomas (GB/Team Sky) 74hrs 21mins 1sec
2. Tom Dumoulin (Ned/Team Sunweb) +1min 59secs
3. Chris Froome (GB/Team Sky) +2mins 31secs
4. Primoz Roglic (Slo/Team LottoNL-Jumbo) +2mins 47secs
5. Nairo Quintana (Col/Movistar Team) +3mins 30secs
6. Steven Kruijswijk (Ned/Lotto NL-Jumbo) +4mins 19secs
7. Mikel Landa (Spa/Movistar) +4mins 34secs
8. Romain Bardet (Fra/AG2R La Mondiale) +5mins 13secs
9. Daniel Martin (Ire/UAE Team Emirates) +6mins 33secs
10. Jakob Fuglsang (Den/Astana) +9mins 31secs