Photo-Illustration: Vulture; Photos: Omnes Films, Shellac Films, Shanna Besson, Condor
This year’s Cannes Film Festival started off with a lot of pundits and critics speculating that it was an off year for the competition. Yes, there were some weighty titles from famous names but few that seemed like genuine Palme d’Or contenders. That all changed, somewhat shockingly, in the last few days of the festival, as banger after banger suddenly premiered and the race heated up. In the end, it was one of the more interesting Cannes lineups in recent years, for both the competition and the festival’s many sidebars. Here are the 12 best films we saw at Cannes this year.
The second feature from Zambian Welsh filmmaker Rungano Nyoni, On Becoming a Guinea Fowl is completely singular, a surrealistic, pitch-dark comedy about family secrets and the way people close ranks and cover things up to protect one another but ultimately perpetuate serious harm. We see all of this through the eyes of Shula (Susan Chardy) who, dressed inexplicably in Missy Elliot’s “The Rain” costume, drives past her uncle’s dead body on the side of the road. She calls her father to let him know, completely deadpan and unmoved by the whole thing. In the funeral procession following, we learn what kind of man Shula’s uncle really was — all the women in the family he abused and the men and women alike who turned their head and protected him from consequences. It’s a disturbing film but one shot through with absurdist humor and a distinct visual style that announces Nyoni as a real talent.
Jury Prize winnerEmilia Pérez is an unbelievably audacious film that feels as if Pedro Almodóvar remade Mrs. Doubtfire as a searing musical crime drama. There’s so much going on in this movie — narratively, structurally, musically, theatrically, politically — that it almost shouldn’t work, making its quality all the more impressive. The story, which Jacques Audiard loosely adapted from Boris Razon’s novel Écoute, begins with Zoe Saldaña as Rita, a talented criminal-defense attorney who’s overwhelmed, underpaid, and spiritually lost. One day, she gets a phone call from a powerful stranger who turns out to be a cartel kingpin named Manitas (Karla Sofia Gascón). Manitas has a secret, extremely lucrative request for Rita: to help him disappear from his life — including his children and his wife, Jessi (Selena Gomez) — and seek gender-confirmation surgery to live as a woman. What follows is operatic in every sense, at turns melodramatic, heart-wrenching, and endlessly mutative. Saldaña and Gomez do some of their best work, and Gascón, a newcomer to the film industry who had previously done telenovelas in her native Spain, is a total revelation.
Mikey Madison stole my heart on Pamela Adlon’s Better Things as her pissed-off, pouty teenage daughter Max. She’s somehow even better in Anora, Sean Baker’s latest, Palm d’Or–winning entry in his sex-worker dramedy canon (Starlet, Tangerine, Red Rocket). Madison plays the title role, a Brighton Beach stripper with a Brooklyn chip on her shoulder, a great sense of humor, and a secret hope for some starry-eyed romance. She is hired as “my horny girlfriend for the week” by Vanya (Mark Eydelshteyn), a Russian oligarch’s failson, and soon the two are head over heels for each other and heading to Vegas for a ketamine-fueled elopement. This isn’t a fairy tale, though; once Vanya’s billionaire parents get wind of what has happened, they send their goons after Anora and Vanya, who runs off at the first sign of conflict. The movie kicks into frenetic, After Hours gear from there with Anora and the Russians chasing Vanya all over Coney Island, including back to her strip club (populated by several incredible real-life strippers). The ending features a surprising emotional gut punch from Madison, who was among the favorites to win Best Actress at the festival.
Christmas Eve at Miller’s Point
Photo: Omnes Films
It’s difficult to make a great Christmas movie, much less one that premieres in May in the middle of a famously pretentious film festival, but this one stole my heart with its unfettered nostalgia, humor, and genuine warmth. Tyler Taormina’s Christmas Eve at Miller’s Point follows a Long Island family during what may be the last Christmas Eve party at their beloved matriarch’s home, weaving in and out of conversations, quiet moments, romances, arguments, and strange little side quests. Not much “happens,” but the vibes are incredible, Fanny and Alexander meets indie Love Actually without all the endemic sexism. The casting is full of subtle surprises: Michael Cera pops up as a silent, lusty cop; Francesca Scorsese plays a suburban cousin.
French writer-director Coralie Fargeat’s second film after the 2017 thriller Revenge, this body-horror fable follows Demi Moore as a Jane Fonda–esque star named Elisabeth Sparkle who is being unceremoniously fired from her decadeslong position as the host of a successful daytime exercise show. Rather than fade into the obscurity to which she has been doomed, Elisabeth takes a gamble on a black-market drug called the Substance, which causes Margaret Qualley to wrench forth from her back. The rest of the film wrenches forth just as bloodily and wildly, an enraged scream in cinematic form. Reviews of The Substance have been mixed with critics disagreeing over whether the movie is an explicitly feminist work or is as objectifying as the industry it critiques, and even I’m still wrestling with that question. But I can’t stop thinking about it.
Caught by the Tides
Photo: X Stream Pictures
Chinese director Jia Zhangke has been working on this film for the past 20-plus years, though he wasn’t originally sure what it was going to look like. Shot in 2001, 2007, 2017, and 2022, the film chronicles the lives of two lovers (Zhao Tao and Li Zhubin) from the northeastern city of Datong as they grow geographically and emotionally apart during a seismic period in modern Chinese history. Against the film’s mesmerizingly understated drama — Zhao’s wordless performance is one of the more moving turns I’ve seen in recent years — Jia shows, through period documentary footage shot by his crews over this time, the way the country’s relationship to the West has changed. Think of it as his Boyhood, but he’s chronicling not just one person changing but an entire nation and culture. This is a masterpiece from one of the world’s great directors.
Grand Tour
Photo: Shellac Films
Winner of the Best Director prize, Portuguese filmmaker Miguel Gomes’s Grand Tour was one of a number of entries this year to use reams of documentary footage in interesting ways. A British couple due to be engaged are separated when the man leaves his post as a British administrator in Burma and begins a wayward, drifting journey across East Asia, pulled this way and that by fortune and a gnawing desire to get away from his impending marriage. The woman is comically determined and incapable of taking no for an answer; she follows his path with fierce purpose. The film is set in 1918, but at each step of the way, Gomes uses contemporary documentary footage to place us in a broader, dreamlike context in which past and present blur together. Narrators speaking in the language of each country take up the story as it crosses borders, incorporating local myths and rituals to create something akin to a postmodern fable — one about how two souls with completely different attitudes toward life ultimately wind up on the same journey. Achingly beautiful and mysterious, like all of Gomes’s films.
All We Imagine As Light
Photo: Condor
Payal Kapadia’s Grand Jury prizewinner looks at the lives of two nurses living together in a cramped flat in Mumbai, each trying to navigate uncertain relationships: One is in love with a young Muslim man from a devout family; the other hasn’t heard from her migrant-worker husband in years. At least they have a place to stay, unlike an older friend who also works at the hospital and is in danger of losing her home. The crowded, sleepless city pushes in all around them, filmed by Kapadia in captivating documentary passages (a common stylistic motif at Cannes this year, in case you haven’t noticed). Eventually, their worlds shift in unexpected, unreal ways that take this haunting, compassionate film into the realm of magical realism.
On the surface, Matthew Rankin’s film seems like something best appreciated by film geeks, but I suspect it will resonate well beyond the ranks of the pale and pointy. In Universal Language’s slightly tilted version of the world, Winnipeg and Iran have melded. Everybody speaks Farsi. They sing Persian songs. They drink their tea by putting a sugar cube in their mouth first. Rankin’s film unspools with a delightfully disorienting mix of poetic realism (one that naturally recalls the Iranian New Wave), flights of surreal comedy, and wry, deadpan bleakness. It’s a magnificent film, one that feels warm and familiar even as we realize just how startlingly original it is.
With Rumours, the legendary Canadian director Guy Maddin, working with his regular collaborators, Evan and Galen Johnson, has made what may be his funniest film to date. But as always with Maddin, the humor is somewhat rarefied. Rumours follows the leaders of the G7 as they get lost in a German forest and are beset by mysterious ancient figures while being consumed by their own strange passions. Thankfully, Maddin and the Johnsons effectively develop their story — goofy and absurd though it may be — so that these constant digs at our ineffectual leaders do coalesce into something meaningful and alarming. Rumours starts off focusing on how the cocoon of leadership is both a privilege and a curse for these people. By the end, we understand that the ones who are truly doomed are the rest of us. But just because we’re choking on our laughter doesn’t mean we’re not still laughing.
Paolo Sorrentino has seen all your takes about the male gaze and decided to counter them with a movie about the life of a transcendently gorgeous woman. That’s the provocative logline, I suppose. But in truth, Parthenope is less about one beautiful person than about our idea of beauty itself as it’s reflected and projected, embodied and perceived. In this episodic film, Parthenope (played for most of it by Celeste Dalla Porta) comes into contact with a number of figures: young lovers, an aging actress, a gangster, a sleazy priest, and (in one odd and charming interlude) a very drunk John Cheever played by Gary Oldman. A few will covet her, a couple won’t dare to, but all will adore her on some level. And none will be entirely straight or honest with her because there is something fundamentally withering and alienating about being in her presence — it’s an emotional curtain that, throughout her life, Parthenope struggles to part. She comes to feel like an avatar of the very ideas of youth and possibility, which also makes her an avatar of the opposite of those things: the idea that life eventually passes us all by. In creating a film about one beautiful person, Sorrentino reminds us that, in our memories, we were all beautiful once.
George Miller’s Furiosa feels like a personal, perhaps necessary counterpoint to the exhilarations of his previous film in the Mad Max saga, Fury Road. That 2015 masterpiece was so rousing that it was easy to lose sight of the bigger, sadder picture. Furiosa — somber, steady, and supremely twisted — is a reminder that none of this stuff is really supposed to be cool. “We are the already dead, Little D, you and me,” Chris Hemsworth’s sadistic warlord Dementus says to Anya Taylor-Joy’s vengeful Furiosa at one point late in the film, using the nickname he gave her as a child. These are the End Times, and they are the End People. This series was born under the sign of grief and continues to live there.
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(4),auth=require(12),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(1),appendLandingPageParams=require(135),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"1":1,"4":4,"12":12,"124":124,"135":135}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(406),Fingerprint2=require(408),DS=require(407),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(406),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"406":406,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]