What is it about the number six that suddenly made me realize, Wow, we’re really close to the end of this season of Top Chef? It didn’t feel that way last week, when Soo was still among the cheftestants, because we knew the winner of Last Chance Kitchen was coming. But now we have six competitors with no further intrusions, and things are beginning to feel really real! And that sense of drama felt further amplified because Laura rode in on a high from Last Chance Kitchen and knocked frontrunners Dan and Danny down a peg. Their miffed faces when the judges named her ice cream and baklava tablescape the winner? As delicious as that dessert looked.
I have railed against Top Chef’s increasing reliance on artistic challenges before, but I’m going to break my own trend with “Lay It All on the Table.” I do think the overly vague “interpret this abstract concept” challenges are goofy. But this week’s tablescape-focused Elimination felt to me like a good flip of last week’s fish boil. In that episode, everyone had to use the same baseline technique for cooking their fish; in this episode, everyone had to use the same table for plating their dish. Obviously one of these is more conceptual than the other. But I appreciated that judging this week wasn’t driven by the judges having one understanding of the challenge and the cheftestants having another. Everyone got the same table, everyone got the same brief about using the table, and everyone competing on Top Chef should be aware that at some point, the judges will ask them to do something interactive with their food. You don’t have to be a thorough scholar of the game like Buddha was to anticipate that demand.
Let’s start with the Quickfire, which felt like a mashup of other challenges Top Chef has had in the past with its “recreate this mystery dish” concept. The episode opens with Tom preparing a cooked lobster salad that Kristen and Gail dig into (Kristen says this is the first thing Tom has ever cooked for her on the show, which reminds me that I really like when the judges cook for the finalists and it is a bummer that Kristen missed out on that because of her return to the show through Last Chance Kitchen). The chefs only have the empty plate, scattered just with some herbs and onion strands, to look at and smell (no tasting!) when recreating Tom’s dish, and they’ll each get the ability to ask four yes-or-no questions about the dish itself for Tom to answer. They have 30 minutes to do their best; the winner, per usual now, gets $10,000.
There are elements of strategy here — you don’t want to ask questions that are too similar, you want to try and study the plate for clues — but I do think it’s a little overly complicated, with the chefs each only able to ask one question before the 30 minutes of cooking time begins. It would have been more friendly to the chefs if the judges prompted them all to check out the plate and then ask questions, but that’s not what goes down. Shockingly, only Michelle and Manny immediately go to the plate when they’re able to. Savannah, Laura, Dan, and Danny all start gathering ingredients, which is wild to me when all they know so far based on four questions is that Tom’s dish isn’t soup, isn’t pasta, has a fruit in it, and has a seafood protein in it.
Eventually, through their questions, the chefs work out that the dish is Asian, has fish sauce, lobster, spice, bok choy, and red pepper and is a salad. Savannah is the only person to grab a wok to cook with after she notices it for the first time in the kitchen and correctly assumes it’s there because Tom used it, but when it’s time to present, Michelle is the only person who correctly serves the dish without a sauce. Otherwise, it’s a lot of curries presented as salads, and no one gets everything that Tom had his in a stir fry of lobster, ginger, bok choy, red onion, fennel, candied ginger, fish sauce, lime juice, Thai basil, basil, parsley, cilantro, and curry leaves. To be fair, it feels absolutely insane to put this many things in your dish and then be like, “It came together in eight minutes.” Yeah, dude, because you came up with it! I nodded so hard along with Michelle’s quippy “For you” after Tom says cooking this dish “was fun.” Savannah serves the dish closest to Tom’s, and she gets the win over Dan (who had the most similar ingredients to Tom’s) and Michelle (whose dish looked most like Tom’s). This is now two Quickfires in a row for Savannah, who gets some confidence back after slicing open her hand during the fish boil challenge. Meanwhile, Manny, Laura, and Danny end up in the bottom, for their dishes having too much lime, too much salt, and too much difference from Tom’s plate, respectively.
Top Chef keeps the “damn, this seems hard” energy going with the Elimination, in which the chefs are tasked with serving their dishes directly on a tabletop. (Is this actually a fine-dining trend, as the show suggests? Someone please research and report back, I am slightly skeptical.) The goal isn’t one great meal but “one great table of food,” as Gail says, which can be sweet or savory, as long as it fits on the tabletop served to Kristen, Tom, Gail, and guest judge Curtis Duffy. So, the table presentation needs to be artistic in some way, and it can also be interactive because the chefs can serve elements of their meal at the tableside.
A few chefs quickly grasp the design aspect of the challenge; Laura excitedly describes the table as “a blank canvas, and a really big one,” while Savannah starts envisioning a multi-course Japanese meal, or zensai, of little dishes. More worrisome are Manny and Michelle, who make choices that make me yell things like “WHY” and “SERIOUSLY, WHY.” Manny says he wants to do risotto, ignoring that his Power Bottom buddy Kévin justrecently got eliminated for risotto. Manny spins this as him meeting Tom’s challenge from last week of pushing his boundaries, but that’s not really the case if you’re also claiming you make risotto all the time, as Manny does. And Michelle, who has a background in barbecue, crawfish boils, and other classic Americana meals that are bountiful feasts on paper-covered tables, decides to make beets? For brunch? I don’t even understand. I don’t even understand! Michelle struggles because she doesn’t have an artistic background, but she also rejects doing a meal option that doesn’t exactly require beautiful plating to make an impact. It doesn’t help that Dan is making beets, too, so Michelle really needs her beets to succeed to solidly stand against his, and, well, they don’t.
Everyone but Laura struggles a bit while cooking. Danny burns his rice, so he loses a ton of it on the bottom of his pans. Savannah cooks her octopus incorrectly. Manny loses a shrimp, and his risotto seizes up. (He only gives himself 30 minutes to cook it, which, insane.) Dan runs out of time and has to fry his pita bread on the flat top instead of baking it, which gives them an English muffin shape. Michelle slices her potato chips too thin. But beautiful plating elevates a lot of these dishes. There’s going to be a lot of talk of “negative space,” “artfulness,” and “intentionality” throughout this judging, so get ready! Three chefs clearly do great. Danny takes inspiration from the iconic Jean-Michel Basquiat and creates a beautiful colorful border of sauce around his rectangle of paella with black rice, black garlic, and seafood, and the judges praise how creative the idea is and how perfectly cooked his seafood is. Dan brings up Jackson Pollock, and his table is littered with blobs and splashes in an evocation of the artist’s style; Gail quickly gets the reference. Everyone likes his vegetable offering of beet tartare, fried kale salad, beet puree, labne, and harissa oil, and they go gaga over his “puffins,” or “pita muffins.” Laura’s dessert, though, brings the house down. Her pistachio, rose, sour cherry, and clotted cream sauces are poured in a paisley-like pattern (which originated in Persia, let me be nationalist for a second) of huge streaks of color, and she serves her Turkish Maraş ice cream tableside with liquid nitrogen and huge open circles of phyllo dough. The judges crack the phyllo into pieces and then smear it through the sauces to achieve the flavor of baklava, and Tom can’t stop praising everything about it — the slightly chewy texture of the ice cream, how imaginative it is. Gail calls it a “great way to end” the meal, and when Laura gets the win, Gail adds she “knocked it out of the park.” Can you imagine how nice it must feel for Gail to be proud of you? And the triumph of beating frontrunners Danny and Dan? What a time to be alive!
Savannah’s meal lands her in the middle: Her table design was very minimalist and dramatic, with a pile of seaweed and shucked oysters in the middle, but her octopus was simultaneously mushy and over-charred and her tempura greasy. Still, she does better than both Manny and Michelle. Manny’s flavors all sound great — pesto, sun-dried tomatoes, Calabrian chilis, squid ink — and Gail loves how his risotto tastes, although the texture is wrong and all of his seafood is overcooked. At least Manny’s dish made sense, though, and the black risotto and the earthy colors of his sauces had good contrast. Nothing about Michelle’s table works. She plates her beet biscuits, potato chips, cured salmon, and salmon mousse in a very skinny T-shape in the middle of her table, so the whole table looks imbalanced and none of her elements have space to breathe. The flavors clash, her biscuits are undercooked, and nobody can identify something on her table that they like. Michelle missing the mark on nearly all aspects of the challenge ends up sending her home, and her moderate success in the Quickfire isn’t enough to save her. Now we’re down to five, and I worry that Manny’s multiple appearances at the bottom means that we already pretty much know who our final four are going to be. Light a candle to save our elder emo, please!
Assorted amuse-bouche
• Tom hat watch: I am still riding the high of that straw fedora from the fish boil. I do think Tom could have recycled this hipster-adjacent look for this week’s judging-art challenge — you know, to really emphasize the “Is this a cut scene from Velvet Buzzsaw?” vibe — but I will graciously accept these meager offerings.
• The dishes I most wanted to eat in this episode: I am not a lobster fan, so I am going to pass on the Quickfire this week. Bravo, you do not need to send me my portion in the mail! Therefore, in this theoretical scenario, I would like to eat both Dan and Laura’s Elimination tables; I love paella and I’ve never tried Maraş. The ice cream’s firm texture is traditionally thanks to … orchid tubers? I am fascinated!
• Perhaps I am being a nag, but did anyone else think that the tabletop serving model created more food waste than normal, or was that just a trick of the size of the table? I would love to know if the serving sizes of four individual plates were analogous to what was served on the table or if the amount of food served was actually more.
• Danny, Dan, and Laura all doing Middle Eastern flavors this year makes me desperately miss Charbel and Ali from Top Chef: World All-Stars. That sumac tuile Charbel made lives in my mind rent-free.
• Dan being so dismissive of “seafood porridge” felt weird to me when congee is very much a thing? I also would put kedgeree in this category, too.
• But maybe I am defensive of Manny because he was seemingly made in a lab for elder millennials like myself? The fact that he used to play bass in an emo band and released three albums is hilarious; I need him and former ska musician Oscar Isaac in conversation immediately.
• I know some commenters have thought I’ve been too harsh on Kristen, and I hear you; you are heard. But can I at least say that I think, if Danny ends up in the finale, Kristen will be in his corner, no matter what? Think of the Quickfire — his dish was nothing like Tom’s, but Kristen had to point out how delicious it was; she effusively praised his Elimination paella; she most often has exuberant reactions to his food. He’s such a favorite that I’m having a hard time imagining him losing if he makes it to the end.
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(3),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(136),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,"3":3,"12":12,"124":124,"136":136}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(408),Fingerprint2=require(407),DS=require(406),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(408),_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,"408":408,"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","aaa-module-mounting.legacy":"aaa-module-mounting.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.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();
// ]]