CM – Grey’s Anatomy Recap: Endgame

0

It feels like we’ve dutifully trudged across this death beach episode after episode, and it’s finally time to reap our reward for being very good boys and girls: Japril. Is. Endgame. Your. YOU. Can you even believe it After everything they’ve been through, Jackson Avery and April Kepner are set to head off into the sunset – um, move to Boston together. Oh buddy, this one is for the Japril fans who were hoping for the day (for everyone else, please don’t rain on this long-awaited, ill-managed parade, okay?). It is here! It’s just happening!

If you stumbled upon this round-up without seeing « Look Up Child » or catching up on the entertainment news, you may be a little confused. There are a few things to explain. Initially, Deadline announced that Jesse Williams was leaving Grey’s Anatomy after 12 seasons. The next episode, which airs on May 20th, will be his big farewell, which means that this episode was all about speeding up his departure (in fact, his final episodes were about speeding up that departure, and obviously the circumstances are different, but Alex Karev deserves it). The reason Jackson Avery is leaving Seattle feels deserved. It feels like graduation.

The last time we saw Jackson, he had an explosion with his mother over the fact that the Fox Foundation was so bureaucratic that it couldn’t do anything of value. The pandemic had made racial inequality in medicine even more apparent, and both the Foundation and the Averys have the money and resources to do something that could make a difference and yet they did nothing. During this argument, Catherine tells Jackson that he sounds like his father and Jackson eventually runs to his car and drives into the night.

Here we discover that he drove to his father in Montana. The last time we (and Jackson) saw Jackson’s father was when we first met him in season 13. Suffice it to say, after days of camping and being one with nature, he arrives at Roberts Bar and doesn’t return his mother’s calls. it’s awkward. Jackson wants answers. The last time he was too scared to ask his father why he’d walked away from everything – his inheritance, his job, his son. So, on putting together packed lunches for the needy in town – Jackson Avery is working on a meat cutter while talking about his feelings? OK! – The Avery men have a long time coming confrontation.

Yes, Robert also hated the Foundation’s bureaucracy. And it was an immense responsibility to have all of the money and people who are looking to you to solve all of their problems and not be able to do anything about it. Robert says he didn’t want to be the guy who was right for the role and he’s strayed from it all. And there’s nothing wrong with a smaller, simpler life. When Jackson asks if he ever thought about what would have happened if he had stayed, Robert says he can’t look back. This is what really sets Jackson off and he ends up saying the things that have bothered him for so long: his dad, who left him, messed him up. When things get difficult, he runs. He constantly feels like he’s trying to fight the parts of him that are like his father. Frankly, Jackson’s character never made more sense than it did at that moment. It’s been daddy problems all along!

Robert tells his son that he regrets leaving him every day and it’s a pain he’ll have to live with for the rest of his life. At this point, Jackson yells. Robert tells him that of course he has nothing to do with him. If Jackson were a runner like Robert, he would be « long gone ». Every time Jackson runs he comes back. He is committed to his family and his work. When the Harper-Avery scandal broke out, it was easy to walk away from the Avery legacy, but Robert reminds him that instead, Jackson not only struggled to fix the problem, but also made the foundation better.

This is exactly what Jackson needs to hear. Next, he drives straight to his mother’s house to tell her he’s finally ready to take over the Boston foundation – to take on the birthright he avoided all his life. And he’s doing it because he wants to fix or tear the system down or whatever he needs to do to help those who are normally deleted or ignored by the health system. He will reallocate all of the foundation’s resources to tackle inequality in medicine. « I know where I belong, » he says to his mother, who is overwhelmed by emotions. She later tells Richard tearfully that she has never been so proud in her entire life.

All that remains is to ask the mother of his child one big question. He’ll see April.

The episode actually starts here, with Jackson driving in the middle of a storm at night and arriving in April muttering to himself how he knows this sounds impulsive, but he swears that it isn’t, and the episode cuts back and forth between his time with his father and his night when he declared April himself the drama of it all. And, of course, Jackson has a right to worry that all of this will turn out to be impulsive, as he, as you know, has a track record of making impulsive decisions so we don’t forget his big « say it out loud and go from there » moment Mid-April and Matthew’s (first) wedding. At least he’s aware of himself?

So he knocks on April’s door. Although we haven’t seen April since she left for season 14, we know that she and Jackson raise little Harriet on a very friendly basis and have lived with Matthew in Seattle since she, after reviving their romance, when Matthew’s wife died in childbirth , got into trouble. If this phrase sounds crazy to you, it’s because it is! What a terrible idea! All of this means the two have remained best friends so this isn’t a visit out of nowhere. But it’s certainly not Jackson’s night to have Harriet, which confuses April.

She’s also a bit relieved because Harriet has a high fever (it’s not COVID as she tested) and the power keeps coming back in and out go out. Oh, and Matthew and his daughter are out on the east coast with his sick sister. Within seconds of Jesse Williams and Sarah Drew being back on screen together, their sizzling chemistry is on-screen. It all feels very much lived. There are jokes and teasing and knowing looks. It feels like we never left these two! Can you believe the show separated them for so long ?!

And then Jackson puts it on her: He’s going to take over the foundation, which means he’s moving to Boston and he needs Harriet to be with him . He wants them all to move there. He will help April and Matthew find work. The foundation gives April all the resources she needs to keep her rural medicine program going. It’s all insanely presumptive and April is right to push back: He has always done everything possible to avoid taking over the foundation, and now he wants her to turn her life upside down for it? Jackson apologizes if figuring out who he wants to be is an « inconvenience » to her « perfect little life ».

It’s obviously more than that, and they both know it. They reiterate some of their old arguments about who ran to Jordan, when and in April, to recover from the loss of Samuel, noting that she and Jackson have to stand there and watch her marry Matthew (the second time ). He would never stand in the way of her happiness and he asks her to do the same. He gives a very passionate speech about how he knows he can do this – run the foundation, make important, lasting changes and still be a good father to Harriet. He can be the man his own father couldn’t be. He asks April to give him this chance.

The next morning, Harriet is better and there’s a cute little family breakfast scene that would really upset me if I didn’t know how this episode ended because it’s all very « What could have been! » But then April apologizes that Jackson is not the right man to take on this endeavor, and they talk wistfully about the fact that they always have such bad timing. It’s their thing, they say (well, that, yelling at each other until they hobble somewhere) without figuring out « how to want the same thing at the same time ». Jackson withdraws from his request; You will find out something else. And April stops him: « Don’t do all the talking and convincing and the thing that makes your face light up just to take it all back. » You will go to Boston with him. He deserved a shot to make this possible for himself.

Jackson is surprised, mostly because he thought she had to discuss such a big decision with her husband. As he babbles about ways to introduce the idea to Matthew, April comes out that she and Matthew have split up. Do you remember all of the reasons April and Matthew got married, after they had already left him at the altar once and then his new wife died under their supervision, felt like a terrible idea? Yes, they broke up because of that. Matthew went to his sister and he doesn’t come back. It always had to be Matthew who left, otherwise April would be a monster; that’s a lot easier to buy. Hey, check out Grey’s Anatomy correcting a huge mistake!

When Jackson asks April if she’s okay, he grabs his hand because we were blessed tonight. It is not yet. « Cross your fingers for new horizons, » she says, cementing her decision to leave everything behind for Boston. He repeats the feeling and they hug before making plans to move and bringing April back to end Jackson’s story is all very Doug Ross and Carol Hathaway and I can hardly stand it (in the best way). This will be the sweetest farewell.

Already a subscriber?
Sign up or link your magazine subscription

Already a subscriber?
Sign up or link your magazine subscription

Already a subscriber?
Sign up or link your magazine subscription

Already a subscriber?
Sign up or link your magazine subscription

= 0 (u = f (str, 0, v), c = f (str 1)): (u = f, c = «  »), i = decodeURIComponent (u), l = decodeURIComponent (c ), hasOwnProperty (o, i)? isArray (o [i])? o [i] .push (l): o [i] = [o [i], l]: o [i] = l} return o}; var isArray = Array.isArray || function (r) {return « [object Array] » === Object.prototype.toString.call (r)};
}, {}];
window.modules [« 1180 »] = [function (required, module, export) {« use strict »; var stringifyPrimitive = function (r) {switch (typeof r) {case « string »: return r; case « boolean »: return r? « true »: « false »; case « number »: return isFinite (r)? r: «  »; default: return «  »}}; module.exports = function (r, e, t, n) {return e = e || « & », t = t || « = », null === r&& (r = void 0), « object » == typeof r? map (objectKeys (r), function (n) {var i = encodeURIComponent (stringifyPrimitive (n)) t; return isArray (r [n])? map (r [n], function (r) {return i encodeURIComponent (stringifyPrimitive (r))}). join (e): i encodeURIComponent (stringifyPrimitive (r [n]))}). join (e): n? encodeURIComponent (stringifyPrimitive (n)) t encodeURIComponent (stringifyPrimitive (r)): «  »}; var isArray = Array.isArray | | function (r) {return « [object Array] » === Object.prototype.toString.call (r)}; Function assignment (r, e) {if (r.map) return r.map (e); for (var t = [], n = 0; n0&&a [a.length-1]) && (6 === i [0] || 2 === i [0])) {o = 0; continue} if (3 === i [0] && (! a || i [1]> a [0] &&i [1] « : » akbar-men « , » ∑ « : » majmou « , » ¤  » : « omla »}, az: {}, ca: {« ∆ »: « delta », « ∞ »: « infinite », « ♥ »: « amor », « & »: « i », « | »: « o », «  »: « mes que », « ∑ »: « suma dels », « ¤ »: « moneda »}, cz: {« ∆ »: « delta », « ∞ »: « nekonecno »,  » ♥ « : » laska « , » & « : » a « , » | « : » nebo « , » « : » vice jako « , » ∑ « : » soucet « , » ¤ « : » mena « }, de: {« ∆ »: « delta », « ∞ »: « infinite », « ♥ »: « love », « & »: « and », « | »: « or », «  »: « greater than »,  » ∑ « : » Sum of « , » ¤ « : » Currency « }, dv: { » ∆ « : » delta « , » ∞ « : » kolunulaa « , » ♥ « : » loabi « , » & « : » aai « , » | « : » noonee « , » « : » ah vure bodu « , » ∑ « : » jumula « , » ¤ « : » faisaa « }, en: { » ∆ « : » delta « , » ∞  » : « infinite », « ♥ »: « love », « & »: « and », « | »: « or », «  »: « greater than », « ∑ »: « sum », « ¤ »:  » Currency « }, es: { » ∆ « : » Delta « , » ∞ « : » infinito « , » ♥ « : » amor « , » & « : » y « , » | « : » u « , » « : « mas que », « ∑ »: « suma de los », « ¤ »: « moneda »}, fr: {« ∆ »: « Delta », « ∞ »: « Infiniment », « ♥ »: « Amour », « & »: « et », « | »: « ou « , » « : » superieure a « , » ∑ « : » somme des « , » ¤ « : » monnaie « }, gr: {}, hu: { » ∆ « : » delta « , » ∞ « : » vegtelen « , » ♥ « : » szerelem « , » & « : » es « , » | « : » vagy « , » « : » nagyobb mint « , » ∑ « : » szu mma « , » ¤ « : » penznem « }, it: { » ∆ « : » delta « , » ∞ « : » infinito  » , « ♥ »: « amore », « & »: « e », « | « : » o « , » « : » maggiore di « , » ∑ « : » somma « , » ¤ « : » moneta « }, lt: {}, lv: { » ∆ « : » delta « , » ∞  » : « bezgaliba », « ♥ »: « milestiba », « & »: « un », « | »: « vai », «  »: « lielaks neka », « ∑ »: « summa », « ¤ »:  » valuta « }, my: { » ∆ « : » kwahkhyaet « , » ∞ « : » asaonasme « , » ♥ « : » akhyait « , » & « : » nhin « , » | « : » tho « , »: « kyithaw », « ∑ »: « paungld », « ¤ »: « ngwekye »}, mk: {}, nl: {« ∆ »: « delta », « ∞ »:  » oneindig « , » ♥ « : » leads « , » & « : » en « , » | « : » of « , » « : » groter dan « , » ∑ « : » som « , » ¤ « : » valuta  » }, pl: {« ∆ »: « Delta », « ∞ »: « nieskonczonosc », « ♥ »: « milosc », « & »: « i », « | »: « lub », «  »: « wieksze niz « , » ∑ « : » suma « , » ¤ « : » waluta « }, pt: { » ∆ « : » delta « , » ∞ « : » infinito « , » ♥ « : » amor « , » &  » : « e », « | »: « ou », «  »: « maior que », « ∑ »: « soma », « ¤ »: « moeda »}, ro: {« ∆ »: « delta »,  » ∞ « : » infinit « , » ♥ « : » dragoste « , » & « : » si « , » | « : » sau « , » « : » mai mare ca « , » ∑ « : » suma « , » ¤ « : » valuta « }, ru: { » ∆ « : » delta « , » ∞ « : » beskonechno « , » ♥ « : » lubov « , » & « : » i « , » | « : » ili « , «  »: « bolshe », « ∑ »: « summa », « ¤ »: « valjuta »}, sk: {« ∆ »: « delta », « ∞ »: « nekonecno », « ♥ »: « laska » , « & »: « a », « | »: « alebo », «  »: « viac ako », « ∑ »: « sucet », « ¤ »: « mena »}, sr: {}, tr: { « ∆ »: « Delta », « ∞ »: « Sonsuzluk », « ♥ »: « ask », « & »: « ve », « | » : « veya », «  »: « buyuktur », « ∑ »: « toplam », « ¤ »: « para birimi »}, uk: {« ∆ »: « delta », « ∞ »: « bezkinechnist »,  » ♥ « : » lubov « , » & « : » i « , » | « : » abo « , » « : » bilshe « , » ∑ « : » suma « , » ¤ « : » valjuta « }, vn: { « ∆ »: « delta », « ∞ »: « vo cuc », « ♥ »: « yeu », « & »: « va », « | « : » hoac « , » « : » lon hon « , » ∑ « : » tong « , » ¤ « : » tien te « }}; if ( » string « ! = typeof e) return » « ; if ( » string « == typeof a&& (A = a), m = I.en, c = C.en, » object « == type of a) for (g in n = a.maintainCase ||! 1, O = a .custom&& « object » == type of a.custom? a.custom: O, u = a.truncate> 1&&a.truncate ||! 1, l = a.uric ||! 1, s = a.uricNoSlash || ! 1, r = a.mark ||! 1, S =! 1! == a.symbols&&! 1! == a.lang, A = a.separator || A, l&& (p = b.join ( » « )), s&& (p = z.join ( » « )), r&& (p = [« . « , »! « , » ~ « , » * « , » ‘ », » (« , ») « ] . join («  »)), m = a.lang&&I [a.lang] && S? I [a.lang]: S? I.en: {}, c = a.lang&&C [a.lang]? C [ a.lang] :! 1 === a.lang ||! 0 == = a.lang? {}: C.en, a.titleCase&& « number » == typeof a.titleCase.length&&Array.prototype.toString. call ( a.titleCase)? (a.titleCase.forEach (function (e) {O [e «  »] = e «  »}), t =! 0): t = !! a.titleCase, a.custom&& « number » == typeof a.custom.length&&Array.prototype.toString.call (a. custom) &&a.custom.forEach (function (s) {O « e » «  » }), Object.keys (O) .forEach (function (a) {var n; n = a.length> 1 new RegExp (« \ b » o (a) « \ b », « gi »): new RegExp (o (a), « gi »), e = e.replace (n, O [a])}), O) p = g; for (p = o (p = A), f =! 1, y =! 1, d = 0, k = (e = e.replace (/ (^ s | ) s $) / g, «  » )). Length; d = 0? (j = g, g = «  ») :! 0 === y? (g = U [j] v [g], j = « ): g = f&&v [g] .match (/ [A-Za-z0-9] /)? v [g]: v [g], f =! 1, y =! 1): g in U? (J = g, g = «  », d === k-1&& (g = U [j]), y =! 0) :! M [g ] || l&&-1! == b.join («  ») .indexOf (g) || s&&-1! == z.join («  »). indexOf (g)? (! 0 === y? (g = U [j] g, j = «  », y =! 1): f&& (/ [A-Za-z0-9] /. Test (g) || E. substr (-1). match ( / A-Za-z0-9] /)) && (g = «  » g), f =! 1) 🙁 g = f || E.substr (-1) .match (/ [A-Za -z0 -9] /)? A m [g]: m [g], g = void 0! == e [d 1] &&e [d 1] .match (/ [A-Za-z0-9] /)? A: «  », f =! 0), E = g.replace (new RegExp (« [^ \ w \ s » p « _-] », « g »), A); return t&& (E = E.replace (/ ( w) ( S *) / g, function (e, a, n) {var t = a.toUpperCase () (null! == n? N: «  »); return Object. keys (O) .indexOf (t.toLowerCase ()) u&& (h = E.charAt (u) === A, E = E.slice (0, u), h || (E = E.slice (0, E.lastIndexOf (A)))), n || t || (E = E.toLowerCase ()), E}, t = function (s) {return function (a) {return n (a, e)}}, o = function (s) {return e.replace (/ [- \ ^ $ *?. () | [] {} /] / g, « \ $ & »)}, i = function (e, a) {for (var n in a) if (a [ n] === e) return! 0}; if (« undefined »! = type of module &&module.exports) module.exports = n, module.exports.createSlug = t; else if (« undefined »! = typeof define&&define.amd) define ([], function () {return n}); else try {if (e.getSlug || e.createSlug) throw « Speakingurl: Globals exists /(getSlug|createSlug)/ »;e.getSlug=n,e.createSlug=t Genealogiecatch(e)} Genealogie(this );
}, {}];
window.modules [« 1210 »] = [function (required, module, export) {var namespace = « expire_mixin »; Function expirePlugin () {var e = this.createStore (this.storage, null, this._namespacePrefix namespace); return {set: function (t, n, a, r) ​​{this.hasNamespace (Namespace) || e.set (n, r); return t ()}, get: function (e, n) {this.hasNamespace (Namespace) || t.call (this, n); return e ()}, remove: function (t, n) {this.hasNamespace (Namespace) || e.remove (n); return t ()}, getExpiration: function (t, n) {return e.get (n)}, removeExpiredKeys: function (s) {var n = []; this.each (function (e, t) {n.push (t)}); for (var a = 0; a = 0; r -) {var l = localStorage (). key (r); e (read (l), l)}} function remove (e) {return localStorage () .removeItem (e)} function clearAll () {return localStorage (). clear ()} module.exports = {Name: « localStorage », Read: Read, Write: Write, each: Remove: Remove, DeleteAll: DeleteAll};
}, {« 1212 »: 1212}];
window.modules [« 1214 »] = [Function (required, module, export) {module.exports = {Name: « memoryStorage », read: read, write: write, each: remove: remove, deleteAll: deleteAll}; var memoryStorage = {}; Function read (e) {return memoryStorage [e]} Function write (e, r) {memoryStorage [e] = r} Function each (e) {for (var r in memoryStorage) memoryStorage.hasOwnProperty (r) &&e (memoryStorage [ r], r)} function remove (e) {delete memoryStorage [e]} function clearAll (e) {memoryStorage = {}}
}, {}];
window.modules [« 1235 »] = [function (required, module, export) {! Function (s) {var t = function (s) {return new y (e)}; t.version = « 0.6.8 », « undefined »! = typeof module&&module.exports? module.exports = t: « function » == typeof define&&define.amd? define (function () {return t}): e.typogr = t; var n = function (e, t) {return new RegExp (e, t)}, s = /] *> / i, r = t.amp = function (e) {var t = / ( s |) ( & | & | & # 38;) ( s |) / g; if (e || « string » == typeof e) e.replace (/ ()? ([^)? / G, function (e, n, r, a) {return a = a || «  », ( n = n || «  »). match (s)? nra: n (r = r.replace (t, ‘$ 1& $ 3’)) a})}, a = t.ord = function (e) { if (e || « string » == typeof e) {var t, n = f (e), r = [], a =! 1, p = / ( d) (st | nd | rd | th) / g; return n.forEach (function (e) {« tag » === e.type? (r.push (e.txt), t = s.exec (e.txt), a =! (! t || void 0! == t [1])): a? R.push (e.txt): r.push (e.txt.replace (p, ‘$ 1 $ 2’))}), r.join ( » « )}}, p = t.initQuotes = function (s) {var t = n ( » (?: (?:] *> | ^) \ s * (?:] *> \ s *) * ) (?: (« | » | « ) | (‘|’ | ‘)) », « i »); if (e || « string » = = typeof e) return e.replace (t, function (e , t, n) {var s = t? « dquo »: « quo », r = t || n; return [e.slice (0, e.lastIndexOf (r)),  », r, «  »] . join («  »)})}, c = t.widont = function (s) {var t = « (?:] *?>) *? [^ \ s] (? 🙁 ?: a | em | span | strong | i | b) [^>] *?>) *? « , s = n ( » (\ s « t » \ s « t ») (?: \ s) ([^ \ s] (?: \ s * (?: a | em | span | strong | i | b) [^>] *?> \ s * \. *) *? (?: \ s *? (?: p | h [1-6] | li | dt | dd )> | $)) « , » gi « ); return e.replace (s, ‘$ 1 $ 2’)}, i = t.caps = function (e) {var t, r = f (e), a = [], p =! 1, c = n (« ((\ b [AZ \ d] * [AZ] \ d * [AZ] [) AZ \ d ‘] * \ b) | (\ b [AZ] \. \ s? (?: [AZ] \. \ s?)) (?: \ s | \ b | $)) « , » g « ) ; return r.forEach (function (e) {« tag » === e.type? (a.push (e.txt), t = s.exec (e.txt), p =! (! t || void 0! == t [1])): p? a.push (e.txt): a.push (e.txt.replace (c, function (e, t, n, s) {var r, a ; return n? ‘% s’.replace (« % s », n) 🙁 «  » === s.slice (-1)? (r = s.slice (0, -1), a = «  » ) 🙁 r = s, a = «  »), ‘% s1% s2’.replace (« % s1 », r) .replace (« % s2 », a))}))}), a.join ( «  »)}; t.typogrify = function (e) {var t = e; return e.jquery&&e.html&& (t = e.html ()), t = r (t), t = c (t), t = u (t), t = i (t), t = p (t), t = a (t)}; va r l, o, u = t function (e) {var t, n, r = f (e), a = [], p = [], c = «  », i = «  », l =! 1, o = «  »; return r.forEach (function (s) {if (« tag » === e.type) a.push (e.txt), null! == (i = s.exec (e.txt)) && (c = i [2] .toLowerCase (), i [1]? (p.length> 0&&c === p [p.length-1] &&p.pop (), 0 === p.length&& (l =! 1 )) 🙁 p.push (c), l =! 0)); else {if (n = (n = e.txt) .replace (/ (rock) ‘n’ (roll) / gi, « $ 1 ‘n’ $ 2 « ), t = n.Slice (-1),! l) switch (n = g (n)), n = h (n), n = d (n), n = x (n )) {case « ‘ »: n = / S / .test (o)? « ‘ »: « ‘ »; break; case ‘ »‘: n = / S / .test (o)? » « : » « ; break; default: n = m (n)} o = t, a.push (n)}}), a.join ( » « )}, f = t.tokenize = function (s) { for (var t, n = [], s = 0, r = / ([^] *>) / gi; null! == (t = r.exec (e));) {var a = t [1 ], p = t [2]; a&&n.push ({type: « text », txt: a}), n.push ({type: « Tag », txt: p}), s = r.lastIndex} return r.lastIndex) / g, « $ 1 -« )}, d = t.smartEllipses = function (s) {return e.replace (/…/ g, « … »). Replace (/ . . ./ g, « … »)}, x = t.smartBackticks = function (s) {return e.replace (/ «  / g, «  » « ). replace (/  » / g, «  » « )}, m = t.smartQuotes = function (s) {var t = » (? =% s \ B) « . Replace (« % s « , » [! « # \ $ \% \ ‘() *, -. \ /:;? \ @ \ [\\] \ ^ _` {|} ~] « ), s = « [^ \ \ t \ r n \ [\ {\ (\ -] », r = n (« (\ s | | – | & [mn] dash; | – | – | ȁ [34];) ‘(? = \ w) « , » g « ), a = n ( » (« s »)’ (?! \ s | s \ b | \ d ) « , » g « ), p = n ( » (« s ») ‘(?! \ s | s \ b) « , » g « ), c = n (‘ (\ s | | – | & [mn] dash; | – | – | ȁ [34];) « (? = \ w) ‘, » g « ), i = n (‘ » (? = \ s) ‘, « g « ), l = n ( » (« ) s’) » ‘, « g »); return e.replace (n (« ^’% s » .replace (« % s », t), « g ») , « ‘ »). replace (n (‘ ^ « % s’.replace (« % s « , t), » g « ), » « ). replace (/ « ‘(? = w) / g, » « ‘ »). replace (/ ‘ »(? = w) / g, »‘ «  »). Replace (/ b ‘(? = D {2} s) / g, « ‘ »). Replace (r, « $ 1 ‘ »). replace (a, « $ 1 ‘ »). replace (p, « $ 1 ‘$ 2 »). replace (« ‘ », « ‘ »). replace (c, « $ 1 » « ). replace (i, » «  ») .replace (l, « $ 1 » « ). replace (‘ »‘, «  » « )}, y = function (s) { this._wrapped = e}, v = function (e, n) {y.prototype [e] = function () {return e = n.call (t, this._wrapped), this._chain? t (e). chain (): e; var e}}; for (l in t) t.hasOwnProperty (l) && ((o = t [l]) &CS SEANDCHARo.constructor&&o.call&&o.apply) ); y.prototype.chain = function () {return this._chain =! 0, this}, y.prototype.value = function) this._wrapped}} (this);
}, {}];
window.modules [« 1331 »] = [function (required, module, export) {« use strict »; const universalAgora = required (1333), universalRest = required (31), universalQuery = required (1332), _ get = required (9); Function searchByQueryWithRawResults (e, r) {const t = `// $ {r.site.host} $ {80! == r.site.port? `: $ {R.site.port}`: «  »} $ {r.site.path} / _ agora / _search`; return universalRest.post (t, e,! 0)} function getProducts (e, r, t) {return searchByQueryWithRawResults (universalAgora.buildProductsQuery (e), r) .then (e => {const r = universalQuery.formatSearchResult (e ); return {total: e.hits.total, products: t? universalAgora.filterByLocale (r): r}})} function getMerchantsList (e) {return searchByQueryWithRawResults (universalAgora.buildMerchantsAggregation (1e6, _get (e, « site. agoraLocale « )), e) .then (universalQuery.formatAggregationResults ({aggregation name: » dealer « , field: » key « , subfield: » name « ))} module.exports.getProduct = universalAgora.getProduct, module.exports.getProducts = getProducts, module.exports.getMerchantsList = getMerchantsList, module.exports.searchByQueryWithR awResults = searchByQueryWithRawResults, module.exports.buildMerchantsByUrlQuery = universalAgora.buildMerchantsByUrlQuery;
}, {9: 9, 31: 31, 1332: 1332, 1333: 1333}];
window.modules [« 1332 »] = [function (required, module, export) {« use strict »; const _map = require (63), _ get = require (9), _ isArray = require (162), _ set = require (120), _ isObject = require (99), _ cloneDeep = require (81), _ uniq = require (104); function formatSearchResult (e) {return _map (e.hits.hits, « _ source »)} function newQuery (e) {if (! e) throw new Error (« An » index « is required to create a query »); return {index: e, type: « _ doc », body: {query: {}}}} function addShould (e, o) {var t = _get (e, « body.query.bool.should », void 0 ), r = _isArray (o); return t? r? _set (e, « body.query.bool.should », t.concat (o)) 🙁 t.push (o), _ set (e, « body.query.bool.should », t)): _ set (e, « body.query.bool.should », r? o: [o]), e} function addMust (e, o) {var t = _get (e, « body.query.bool.must », void 0), r = _isArray (o); return t? r? _set (e, « body.query.bool.must », t.concat (o)) 🙁 t.push (o), _ set (e, « body.query.bool.must », t)): _ set (e, « body.query.bool.must », r? o: [o]), e} Function addMustNot (e, o) {var t = _get (e, « body.query.bool.must_not », void 0), r = _isArray (o); return t? r? _set (e, « body.query.bool.must_not », tc oncat (o)) 🙁 t.push (o), _ set (e, « body.query.bool.must_not », t)): _ set (e, « body.query.bool.must_not », r? o: [o]), e} function addFilter (e, o) {var t = _get (e, « body.query.bool.filter », void 0); if (! _ isObject (o)) throws a new error (« filter ») query required to be an object « ); returns t? _isArray (t)? (t.push (o), _ set (e, « body.query.bool.filter », t)): _ set (e, « body. query.bool.filter », [_ cloneDeep (t), o]): _ set (e, « body.query. bool.filter « , o), e} Function addMinimumShould (e, o) {if ( » number « ! = typeof o) throw new Error ( » A number is required as the second argument « ); return _set (e, » body .query.bool.minimum_should_match « , o), e} Function addSort (e, o) {var t = _get (e, » body.sort « ); return _isArray (t) || _set (e, » body.sort « , t = []), t.push (o), e} function addSize (e, o) {if (! o&&0! == o) return e; if (o = parseInt (o), isNaN (o) ) throws a new error (`the second argument must be a number: $ {o}`); return _set (e, « body.size », o)} function addFrom (e, o) {if (! o&&0! == o) returns e; if (o = parseInt (o), isNaN (o)) throws a new error (`The second argument must be a Be a number: $ {o} `); return _set (e, « body.from », o)} function onlyWithTheseFields (e, o) {if (! _ isArray (o)) throws a new error (« The second argument must be an array »); return _set (e, « body._source.include », _ uniq (o)), e} function onlyWithinThisSite (e, o) {return o.subsiteSlug? addFilter (e, {term: {subsite: o.subsiteSlug}}) 🙁 addFilter (e, {term: {site: o.slug}}), addMustNot (e, {exists: {field: « subsite »}} )), e} function onlyWithinThisDomain (e, o) {return addFilter (e, {Prefix: {canonicalUrl: `http: // $ {o.host}`}}), e} Function within this SiteAndCrossposts (e, o ) {var t = {term: {}}, r = {bool: {should: [], minimum_should_match: 1}}; return t.term [« crosspost ». (o.subsiteSlug || o.slug)] =! 0, r.bool.should.push (t), o.subsiteSlug? r.bool.should.push ({term: {subsite: o.subsiteSlug}}): (r.bool.should.push ({term: {site: o.slug}}), addMustNot (e, {exists: {field: « subsite »}})), addFilter (e, r), e} Function within thisDomainOrCrossposts (e, o) {return addShould (e, {term: {[`crosspost. $ {o.subsiteSlug || o .slug} `] :! 0}}), addShould (e, {Prefix: {canonicalUrl:` http: // $ {o.host} `}}), addMinimumShould (e, 1), e} Function moreLikeThis ( e, o, t) {let r = {fields: [« tags »], like: {_index: e.index, _type: « _ doc », _ id: o}, include:! 1, min_term_freq: 1, max_query_terms: 12, min_doc_freq: 1}; return {more_like_this: Object.assign (r, t)}} Funktion addAggregation (e = {}, o) {const {body: t = {}} = e; return o? (t.aggs? _set (e, « body.aggs », Object.assign (t.aggs, o )): _ set (e, « body.aggs », o), e): e} FunktionsformatAggregationResults ({aggregationName: e = «  », Feld: o = «  », Unterfeld: t = «  », skipEmpty: r = ! 0}) {Rückgabefunktion (s = {}) {let u = _get (s, `Aggregationen. $ {E} $ {t? ». « T ». « : ». « } Buckets`, []) ; return r&& (u = u.filter (e => 0! == _ get (e, « doc_count », 0))) , u.map (e => e [o] || «  »)}} Funktion addGeo (e, o) {if (! _ isArray (o)) löst einen neuen Fehler aus (« Das zweite Argument muss ein Array sein ») ; if (2! == o.length) throw new Error (« Array muss Länge 2 sein »); if (o.some (isNaN)) throw new Error (« Array darf nur Zahlen enthalten »); return _set (e , « body.query.geo_shape.location.shape.type », « point »), _ set (e, « body.query.geo_shape.location.shape.coordinates », o), e} Funktion combinFunctionScoreQueries (e, o) {let t = _cloneDeep (_get (e, « body.query », {})), r = _cloneDeep (_get (o, « body.query », {})), s = _get (e, « body.sort « ); return _set (e, » body.query « , {}), _ set (e, » body.query.function_score.functions « , []), e.body.query.function_score.functions.push ({filter : t, weight: 20}), e.body.query.function_score.functions.push ({filter: r, weight: 10}), e.body.query.function_score.score_mode = « max », e.body. query.function_score.min_score = 10, _isArray (s) || _set (e, « body.sort », s = []), s.unshift ({_ score: « desc »}), e} Funktion addNestedObjQuery (e, o, t) {if (! e) löst einen neuen Fehler aus (« Es gibt keine Basisabfrage zum Ausführen des Operats addNestedObjQuery ion « ); if (! o) löst einen neuen Fehler aus ( » Es gibt keinen verschachtelten Objektpfad zum Ausführen der verschachtelten Abfrage « ); if (! t) wirft einen neuen Fehler aus ( » Es gibt keinen verschachtelten Abfragepfad zum Ausführen der verschachtelten Abfrage gegen « ); return _set (e, » verschachtelt « , {Pfad: o, Abfrage: t}), e} Funktion addMatchAll (e) {return _set (e, » body.query « , {match_all: {}}) , e} Funktion addMultiMatch (e, o) {const t = _get (e, « body.query.bool.must », void 0), {Felder: r, Typ: s, Zeichenfolge: u} = o, i = {multi_match: {query: u, fields: r, type: s}}; return t? (t.push (i), _ set (e, « body.query.bool.must », t)): _ set (e , « body.query.bool.must », [i]), e} module.exports = newQuery, module.exports.addGeo = addGeo, module.exports.addAggregation = addAggregation, module.exports.addShould = addShould, module. exports.addFilter = addFilter, module.exports.addMust = addMust, module.exports.addMustNot = addMustNot, module.exports.addMinimumShould = addMinimumShould, module.exports.addSort = addSort, module.exports.addSize = addSize, module.exports. addFrom = addFrom, module.exports.onlyWithTheseFields = onlyWithTheseFields, module.exports.onlyWithinThisS ITE = onlyWithinThisSite, module.exports.onlyWithinThisDomain = onlyWithinThisDomain, module.exports.withinThisSiteAndCrossposts = withinThisSiteAndCrossposts, module.exports.withinThisDomainOrCrossposts = withinThisDomainOrCrossposts, module.exports.formatAggregationResults = formatAggregationResults, module.exports.formatSearchResult = formatSearchResult, module.exports.moreLikeThis = moreLikeThis, module.exports.combineFunctionScoreQueries = combinFunctionScoreQueries, module.exports.addNestedObjQuery = addNestedObjQuery, module.exports.addMatchAll = addMatchAll, module.exports.addMultiMatch = addMultiMatch;
}, {9: 9, 63: 63, 81: 81, 99: 99, 104: 104, 120: 120, 162: 162}];
window.modules [« 1333 »] = [Funktion (erforderlich, Modul, Export) {(Funktion (Prozess, __ Dateiname) {(Funktion () {
« use strict »; const _forEach = require (53), _ get = require (9), _ filter = require (146), _ map = require (63), _ isEmpty = require (100), urlParse = require (64), log = require (19) .setup ({file: __ filename}), queryService = require (1332), universalRest = require (31), AGORA_HOST = window.process.env.AGORA_HOST, AGORA_ELASTIC_PREFIX = window.process.env.AGORA_ELASTIC_PREFDP_ AGORA_HOST? `$ {AGORA_HOST} / api / v1`: null, requestHeader = { » Inhaltstyp « : » application / json « }, PRODUCTS_INDEX = » Agora-Produkte « , AFFILIATES_INDEX = » Partner « , RETAILERS_INDEX = » Einzelhändler  » , FILTER_KEY = {Händler: « Name », Partner: « Partner »}, URL_RE = / ^ https ?: / /.*$/; Funktion getProducts (e, t) {const {limit: r = 100, start : a = 0, search: s = «  », sortDate: i = « desc »} = e, n = `$ {AGORA_ENDPOINT} / products? limit = $ {r} &start = $ {a} &search = $ {encodeURIComponent (s)} &sortDate = $ {i} `; return fetch (n) .then (handleResponse) .then (e => t? filterByLocale (e, t): e) .then (e => ({total: e .Länge, Produkte: e})). catch (handleError (n))} Funktion getProduct (e, t) {const r = `$ {AGORA_ENDPOI NT} / products / $ {e} `; if (! AGORA_ENDPOINT) löst einen neuen Fehler aus ( » Es wurde kein Agora-Endpunkt festgelegt « ); if ( » string « ! = Typeof e) löst einen neuen Fehler aus ( » Anforderung muss ein Produkt bereitstellen id « ); return fetch (r) .then (handleResponse) .then (e => t? filterByLocale (e, t): e) .catch (handleError (r))} Funktion postProduct (e) {const t =` $ {AGORA_ENDPOINT} / products`, r = {Methode: « POST », Header: requestHeader, Body: JSON.stringify (e)}; Rückgabewert (t, r) .then (handleResponse) .catch (handleError (t) )} Funktion putProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {Methode: « PUT », Header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} Funktion patchProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {Methode : « PATCH », Header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} Funktion deleteProduct (e) {const t = ` $ {AGORA_ENDPOINT} / products / $ {e} `; return fetch (t, {Methode: » DELETE « , Header: requestHeader}). Then (handleResponse) .catch (handleError (t))} Funktion getMerchantList (e) {const {limit: t = 100, fields: r = «  »} = e; return Promise.resolve ([{name: « Amazon »}]). catch (handleError («  »))} Funktion getMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`; if (« string »! = typeof e) wirft einen neuen Fehler (« Anfrage muss eine Händler-ID angeben »); return fetch (t) .then (handleResponse) .catch (handleError (t))} Funktion patchMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`, a = {Methode: « PATCH », Header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} Funktion postMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants` , r = {Methode: « POST », Header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} Funktion putMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`, a = {Methode: « PUT », Header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} Funktion deleteMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`; return fetch (t, {Methode: « DELETE », head ers: requestHeader}). then (handleResponse) .catch (handleError (t))} Funktion migrateMerchants (e) {const t = `$ {AGORA_ENDPOINT} / Händler / migrate-Affiliate`, r = {Methode: » POST « , Header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} Funktion getRetailers (e) {const {limit: t = 100, start : r = 0} = e, a = `$ {AGORA_ENDPOINT} / Einzelhändler? limit = $ {t} &start = $ {r}`; return fetch (a) .then (handleResponse) .then (e => ({ gesamt: e.Länge, Einzelhändler: e})). catch (handleError (a))} Funktion getRetailer (e) {const t = `$ {AGORA_ENDPOINT} / Einzelhändler / $ {e}`; return fetch (t). dann (handleResponse) .catch (handleError (t))} Funktion postRetailer (e) {const t = `$ {AGORA_ENDPOINT} / Einzelhändler`, r = {Methode: » POST « , Header: requestHeader, body: JSON.stringify ( e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} Funktion putRetailer (e, t) {const r = `$ {AGORA_ENDPOINT} / einzelhändler / $ {e}`, a = {method: « PUT », headers: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} func tion deleteRetailer (e) {const t = `$ {AGORA_ENDPOINT} / einzelhändler / $ {e}`; return fetch (t, {Methode: « DELETE », Header: requestHeader}). then (handleResponse) .catch (handleError ( t))} Funktion getAffiliates (e) {const {limit: t = 100, start: r = 0} = e, a = `$ {AGORA_ENDPOINT} / affiliates? limit = $ {t} &start = $ {r}` ; return fetch (a) .then (handleResponse) .then (e => ({total: e.length, Affiliates: e})). catch (handleError (a))} Funktion getAffiliateRetailers (e) {const t = ` $ {AGORA_ENDPOINT} / einzelhändler / $ {e} / affiliates`; return fetch (t) .then (handleResponse) .catch (handleError (t))} Funktion getAffiliateRetailer (e, t) {const r = `$ {AGORA_ENDPOINT} / Retailer / $ {e} / Affiliates / $ {t} `; return fetch (r) .then (handleResponse) .catch (handleError (r))} Funktion postAffiliateRetailer (e, t) {const r =` $ {AGORA_ENDPOINT } / Retailer / $ {e} / Affiliates`, a = {Methode: « POST », Header: requestHeader, Body: JSON.stringify (t)}; Rückgabewert (r, a) .then (handleResponse) .catch ( handleError (r))} Funktion putAffiliateRetailer (e, t, r) {const a = `$ {AGORA_ENDPOINT} / Einzelhändler / $ {e} / Affiliates / $ {t}`, s = { Methode: « PUT », Header: requestHeader, body: JSON.stringify (r)}; return fetch (a, s) .then (handleResponse) .catch (handleError (a))} Funktion deleteAffiliateRetailer (e, t) {const r = `$ {AGORA_ENDPOINT} / Retailer / $ {e} / Affiliates / $ {t}`; return fetch (r, {Methode: « DELETE », Header: requestHeader}). catch (handleError (r))} Funktion postLocale (e) {const t = `$ {AGORA_ENDPOINT} / locales /`, r = {Methode: « POST », Header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} Funktion patchLocale (e, t) {const r = `$ {AGORA_ENDPOINT} / locales / $ {e}`, a = {Methode: « PATCH », Header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function handleResponse (e) {try {return e.json (). then (t = > {if (e.status> = 400) {const e = _get (t, « message.details [0] .message »); wirf einen neuen Fehler (e)} return t})} catch (e) {throw new Fehler (e.message)}} Funktion handleError (e) {return t => {Wurfprotokoll (« warn », `Fehlgeschlagene Anforderung an $ {e}`, t), neuer Fehler (`Anforderung an $ {e} fehlgeschlagen `)}} Funktion buildProductsQuer y ({search: e = «  », limit: t = 100, start: r = 0, sortDate: a = «  », filter: s, locale: i}) {const n = queryService (PRODUCTS_INDEX), c = s&&Object .keys (s) .length? Object.keys (s) .filter (e => Array.isArray (s [e]) &&s [e] .length): [], o = {}, l = {}; if (prependElasticPrefix (n), e || c.length || i || queryService.addMatchAll (n), i&& (queryService.addMust (o, {match: {« locales.locale »: i}}), queryService. addMust (l, {match: {« Merchants.locale »: i}})), e) if (isURL (e)) queryService.addMust (n, [queryService.addNestedObjQuery ({}, « Merchants », {match: {« Merchants.buyUrl »: e}})]); else {const t = {}; queryService.addShould (t, [{match: {« locales.productId »: e}}, {match: {« locales. name « : {query: e, boost: 2}}}]), queryService.addMinimumShould (t, 1), queryService.addMust (o, _get (t, » body.query « ))} if (c.length) {const e = {}; c.forEach (t => {const r = s [t], a = FILTER_KEY [t], i = {}; a&& (i [`Händler. $ {a}`] = r , queryService.addShould (e, {Terms: i}))}), queryService.addMinimumShould (e, 1), queryService.addMust (l, _get (e, « body.que ») ry « ))} return _isEmpty (o) || queryService.addMust (n, [queryService.addNestedObjQuery ({}, » locales « , _ get (o, » body.query « ))]), _ isEmpty (l) || queryService.addMust (n, [queryService.addNestedObjQuery ({}, « Händler », _ get (l, « body.query »))]), queryService.addSize (n, t), r> = 0&&queryService.addFrom (n, r), « desc » === a || « asc » === a? queryService.addSort (n, {updatedAt: {order: a}}): e&&queryService.addSort (n, {_ score: {order:  » desc « }}), n} Funktion prependElasticPrefix (e) {return e.index = AGORA_ELASTIC_PREFIX?` $ {AGORA_ELASTIC_PREFIX} _ $ {e.index} `: e.index, e} Funktion buildMerchantsAggregation (e = 1e6, t) {const r = queryService (PRODUCTS_INDEX); return prependElasticPrefix (r), queryService.addMust (r, {match: {active :! 0}}), t&&queryService.addMust (r, queryService.addNestedObjQuery ({}, « Händler ») _get (queryService.addMust ({}, {match: {« Merchants.locale »: t}}), « body.query »))), queryService.addAggregation (r, {Händler: {verschachtelt: {Pfad: « Händler « }, aggs: {name: {Terms: {field: » Merchants.name « , Größe: e}}}}}), queryService.addSize (r, 0), r} Funktion isURL (e) {URL_RE.test (e) zurückgeben} Funktion filterByLocale (e, t, r = {Gebietsschemas: « US »}) {const a = Array.isArray (e); wenn (_isEmpty (e)) ein? [] zurückgibt: {}; const s = [« Gebietsschemas », « Händler »], i = a? e: [e], n = Object.keys (r), c = _map (i, e => {const a = Object.assign ({}, e); return _forEach (s, s => {if (Object.keys (a)). enthält (s)) {const i = t? _filter (e [s], [« locale », t]): e [s]; a [s] = i ,! i.length&&n.includes (s) && ( a [s] = (_ filter (e [s], [« locale », r [s]]) || []). map (e => (e.id = null, e.locale = t, e) ))}}), a.name = _get (a, « locales [0] .name », «  »), a}); return a&&c.length? c: _get (c, « [0] », {} )} Funktion searchByQueryWithRawResults (e, t) {const r = `// $ {t.site.host} $ {80! == t.site.port?`: $ {t.site.port} `: »  » } $ {t.site.path} / _ agora / _search`; return universalRest.post (r, e ,! 0)} Funktion buildMerchantsByUrlQuery (e) {const t = queryService (PRODUCTS_INDEX); return prependElasticPrefix (t), queryService. addNestedObjQuery (t.body.query, « Händler », {match: {« Merchants.buyUrl »: e}}), t} Funktion ge tAffiliatesByLocale (e, t) {const r = queryService (AFFILIATES_INDEX); return prependElasticPrefix (r), queryService.addMust (r, {match: {locale: e}}), queryService.addSize (r, 1e3), queryService.addSort (r, {name: « asc »}), searchByQueryWithRawResults (r, t) .then (e => _ get (e, « Hits.hits », []). map (e => _ get (e, « _ source ») , {})))} function buildRetailersQuery ({search: e = «  », limit: t = 50, start: r = 0, direction: a = « asc », locale: s = « US »}) {const i = queryService (RETAILERS_INDEX); return prependElasticPrefix (i), queryService.addMust (i, {Übereinstimmung: {Gebietsschema: s}}), e? queryService.addMultiMatch (i, {Felder: [« Name ^ 2 », « Domänen » ], Zeichenfolge: e, Typ: « phrasenpräfix »}) 🙁 queryService.addSort (i, {« name.keyword »: a}), queryService.addSize (i, t), r> = 0&&queryService.addFrom (i, r)), i} Funktion getRetailersList (e, t) {return searchByQueryWithRawResults (buildRetailersQuery (e), t) .then (e => ({total: _get (e, « Hits.total », 0), Einzelhändler: _get (e, « Hits.hits », []). map (e => _ get (e, « _ source », {}))})} Funktion getRetailersByAffiliateId (e, t, r) {const a = queryService (RETAILERS_INDEX ); r (e) .affiliateId « : e}})]), queryService.addSize (a, 1e4), queryService.addSort (a, { » name.keyword « : » asc « }), searchByQueryWithRawResults (a, t) .then (e = > _get (e, « Hits.hits », []). map (e => _ get (e, « _ source », {}))): Promise.reject ()} Funktion getMerchantsList (e) {return searchByQueryWithRawResults ( buildMerchantsAggregation (1e6, _get (e, « site.agoraLocale »)), e) .then (queryService.formatAggregationResults ({aggregationName: « Merchants », Feld: « key », Unterfeld: « name »}))} function queryRetailersByUrl ( e, t, r) {const a = urlParse (e) .host.split (« www. »). join («  »), s = queryService (RETAILERS_INDEX); return queryService.addMust (s, {match: {locale : r}}), queryService.addMust (s, {match: {Domains: a}}), prependElasticPrefix (s), queryService.addSize (s, 10), searchByQueryWithRawResults (s, t) .then (e => _ get (e, « hit.hits », []). map (e => _ get (e, « _ source », {}))} function queryRetailersByNa me (e, t, r) {const a = queryService (RETAILERS_INDEX); return queryService.addMust (a, {match: {locale: r}}), queryService.addMust (a, {match: {« name.keyword » :e}}),prependElasticPrefix(a),queryService.addSize(a,10),searchByQueryWithRawResults(a,t).then(e=>_get(e, »hits.hits »,[]).map(e= >_get(e, »_source »,{})))}require(220),module.exports={buildProductsQuery:buildProductsQuery,buildMerchantsAggregation:buildMerchantsAggregation,getProducts:getProducts,getProduct:getProduct,postProduct:postProduct,putProduct:putProduct,patchProduct :patchProduct,deleteProduct:deleteProduct,getMerchantList:getMerchantList,getMerchant:getMerchant,postMerchant:postMerchant,patchMerchant:patchMerchant,putMerchant:putMerchant,deleteMerchant:deleteMerchant,migrateMerchants:migrateMerchants,getRetailers:getRetailers,getRetailersList:getRetailersList,getRetailer:getRetailer,postRetailer:postRetailer ,putRetailer:putRetailer,deleteRetailer:deleteRetailer,getRetailersByAffiliateId:getRetailersByAffiliateId,getAffiliates:getAffiliates ,getAffiliateRetailers:getAffiliateRetailers,getAffiliateRetailer:getAffiliateRetailer,postAffiliateRetailer:postAffiliateRetailer,putAffiliateRetailer:putAffiliateRetailer,deleteAffiliateRetailer:deleteAffiliateRetailer,isURL:isURL,filterByLocale:filterByLocale,patchLocale:patchLocale,postLocale:postLocale,buildMerchantsByUrlQuery:buildMerchantsByUrlQuery,getAffiliatesByLocale:getAffiliatesByLocale,searchByQueryWithRawResults:searchByQueryWithRawResults,getMerchantsList:getMerchantsList,queryRetailersByUrl:queryRetailersByUrl,queryRetailersByName:queryRetailersByName};

}). call (this)}). call (this, require (17), « / services / universal / agora.js »)}, {« 9 »: 9, « 17 »: 17, « 19 »: 19 , « 31 »: 31, « 53 »: 53, « 63 »: 63, « 64 »: 64, « 100 »: 100, « 146 »: 146, « 220 »: 220, « 1332 »: 1332}] ;
window.modules [« 1334 »] = [function (require, module, exports) {« use strict »; const _map = require (63), _ mapValues ​​= require (215), _ reduce = require (103), _ assign = require ( 150), _ get = require (9), _ pickBy = require (151), _ find = require (56), affiliateFields = [« siteShortKey », « pageUri », « productId », « utmMedium », « utmSource », « sessionCount » , « format », « utmCampaign », « referrer », « deviceAbbreviation », « zone »], affiliateSettings = {amazon: {domains: [« amazon.com », « amazon.co.uk »], subtagKey: « ascsubtag « , maxLength: 99, delimiter: » standard « , encode:! 1}, narrative: {domains: [ » shop-links.co/ » ],subtagKey: »u1″,maxLength:99,delimiter: »standard « , encode:! 0}, rakuten: {domains: [« click.linksynergy.com/deeplink », »linksynergy.walmart.com/deeplink » ],subtagKey: »u1″,maxLength:72,delimiter: »standard »,encode :! 1}, shareasale: {domains: [« shareasale.com »], subtagKey: « afftrack », maxLength: 99, delimiter: « standard », encode:! 1}, skimlinks: {domains: [« go.redirectingat .com « ], subtagKey: » xcust « , maxLength: 50, delimiter: » alt « , encode:! 1}, impact: {domains: [], subtagKey: » subId2 « , maxLeng th: 99, delimiter: « standard », encode:! 1}, avantlink: {domains: [« avantlink.com »], subtagKey: « ctc », maxLength: 64, delimiter: « alt », encode:! 1} , cj: {domains: [« tkqlhce.com », « jdoqocy.com », « dpbolvw.net », « anrdoezrs.net », « kqzyfj.com »], subtagKey: « sid », maxLength: 64, delimiter: « alt », encode:! 1, joinBy: « / », assignBy: « / », positioned:! 0, position: « after », positionKey: « type / dlg / »}, partnerize: {domains: [« prf .hn « ], subtagKey: » pubref « , maxLength: 100, delimiter: » alt « , encode:! 1, joinBy: » / « , assignBy: »: « , positioned:! 0, position: » before « , positionKey : « destination »}, pepperjam: {domains: [« gopjn.com », « pntrac.com », « pjtra.com », « pjatr.com », « pntrs.com », « pntra.com »], subtagKey : « sid », maxLength: 100, delimiter: « alt », encode:! 1}, awin: {domains: [« awin1.com »], subtagKey: « pref1 », maxLength: 100, delimiter: « alt », encode:! 1, positioned:! 0, position: « before », positionKey: « ued »}}, subtagDictionary = {siteShortKey: «  », pageUri: « p », productId: « i », zone: « z », deviceAbbreviation: « d », utmSource: « s », utmMedium: « m », utmCampaign: « c », sessionCount: « u », referrer: « r », format: « t »}, delimiter s = {standard: [« [« , « ] »], old: [« __ », « _ »]}; function parseValueFromSubtag (e, t, i) {const a = t [0] et [1], s = i.split (a) [1] || «  »; return s? s.split (t [0]) [0]: null} function parseSubtag (e, t = delimiters.standard) {return _pickBy (_mapValues (subtagDictionary, i => parseValueFromSubtag (i, t, e)))} function generateSubtag (e, t, i = delimiters.standard, a =! 1) {const s = (e => t => `$ {e [0]} $ {t} $ {e [1]} `) (i); let n = _reduce (affiliateFields, (t, i) => {const a = s (subtagDictionary [i]), n = e [i]; return t (n? an: «  »)}, «  »); return a&& (n = encodeURIComponent (n)), n} function applySubtagMaxlength (e, t) {var i = t-3 * (e .split (« , »). length-1 e.split (« | »). length-1); return e.substr (0, i)} function getSubtagData ({getters: e, fields: t = [], visitState: i, locals: a, productLink: s}) {let n = {}; return t.forEach (t => {n [t] = e [t] &&e [t] ({visitState: i, locals: a, productLink: s})}), n} function parseQuery (e = «  ») {return e.split (« & »). reduce ((e, t) => {const i = t.split (« = « ) [0], a = t.split ( » = « ) [1]; return void 0! == a&& (e [i] = a), e}, {})} func tion processSubtagPosition ({url: e, positionKey: t, subtagKey: i, position: a = « after », subtagString: s, joinBy: n, assignBy: o} = {}) {const [r, l] = e. split (t), u = `$ {i} $ {o} $ {s}`, g = []; if (« after » === a) {if (! l) return e; const [a, s = «  »] = l.split (`$ {i} $ {o}`), d = s.split (n) .slice (1) .join (n); g.push (`$ {r} $ {t} `, u), a&&g.push (a), d&&g.push (d)} if ( » before « === a) {const [e, a = » « ] = r.split (` $ {i} $ {o} `), s = a.split (n) .slice (1) .join (n); g.push (e), s&&g.push (s), g.push (u,` $ {t} $ {l} `)} return g.reduce ((e, t) => {return e.slice (-1) === n&& (e = e.slice (0, -1)), e.length? [e, t] .join (n): t}, «  »)} function processSubtag ({getters: e, affiliate: t, url: i, visitState: a = {}, locals: s}) {const n = affiliateFields, o = _get (affiliateSettings [t], « subtagKey »), r = _get (affiliateSettings [t], « maxLength »), l = _get (affiliateSettings [t], « encode »), u = _get (affiliateSettings [t], « delimiter »), g = _get (affiliateSettings [t], « positioned »,! 1), d = _get (affiliateSettings [t], « position »), c = _get (affiliateSettings [t ], « positionKey »), p = _get (affiliateSettings [t], « assignBy », « = »), m = _get (affiliateSettings [t], « joinBy », « & »), f = delimiters [u]; let b, y, S = i. indexOf (« ? »)> = 0? i.split (« ? »). pop (): «  », h = parseQuery (S), _ = getSubtagData ({getters: e, fields: n, visitState: a, locals: s, productLink: i}); return o&& (y = h [o] || «  », y = applySubtagMaxlength (b = generateSubtag (_ = _ assign (parseSubtag (y, f), _ pickBy (_)), t , f, l), r), h [o] = y, S = _map (h, (e, t) => `$ {t} = $ {e}`) .join (« & »), i = g? processSubtagPosition ({url: i, positionKey: c, subtagKey: o, position: d, subtagString: y, joinBy: m, assignBy: p}): i.split (« ? ») [0] `? $ {S} `), i} function getAffiliate (e) {const t = Object.keys (affiliateSettings); return _find (t, t => _ find (affiliateSettings [t] .domains, t => e.includes (t. toLowerCase ()))) || «  »} function createSubtagProcessor (e) {return ({url: t, visitState: i, locals: a, affiliate: s}) => (s = getAffiliate (t) || s) ? processSubtag ({getters: e, url: t, affiliate: s, visitState: i, locals: a}): «  »} module.exports.generateSubtag = generateSubtag, module.exports.getAffiliate = getAffiliate, module.expo rts.createSubtagProcessor = createSubtagProcessor, module.exports.processSubtag = processSubtag;
}, {« 9 »: 9, « 56 »: 56, « 63 »: 63, « 103 »: 103, « 150 »: 150, « 151 »: 151, « 215 »: 215}];
window.modules [« article-nav.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), _ throttle = require (50), $ visibility = require (5) , $ popup = require (65), $ gtm = require (3), {reportSocial: reportSocial} = require (66), auth0 = require (7); module.exports = (t => {let e = dom.find (« .page-header »), i = dom.find (« . article-content »), r = dom.find (t, « . deepscroll-headline »), o = dom.find (t, « . deepscroll -rubric « ), s = dom.find (t, ». deepscroll-rubric-sponsored « ), l = dom.find (« . article .article-header .rubric « ), n = dom.find ( » # deepscroll_center_divider « ), a = dom.find (« . clay-paragraph « ), d = dom.find (t, ». logo « ), c = dom.find (t, ». dyn-cut-logo « ), p = dom.find (t, « . article-nav-top »), u = dom.find (t, « . article-nav-deepscroll »), m = dom.find (‘link [rel = « canonical »] ‘), f = m&&m.getAttribute (« href »), g = dom.find (‘ meta [property = « og: image »] ‘)? dom.find (‘ meta [property = « og: image »] ‘ ) .getAttribute (« content »): «  », h = dom.find (‘meta [property = « og: title »]’)? dom.find (‘meta [property = « og: title »]’). getAttribute (« content »): «  », y = dom.find (t, « . share -link.facebook « ), w = dom.find (t, ». share-link.twitter « ), v = dom.find (t, ». share-link.pinterest « ), b = t.classList.contains (« header-simple »), x = window.getComputedStyle (d, null) .getPropertyValue (« – targetFlexBasis »), L = window.getComputedStyle (d, null) .getPropertyValue (« – verticalStart ») || 0 , C = window.getComputedStyle (d, null) .getPropertyValue (« – verticalEnd ») || 0, $ =! 1, _ = 55; function k () {_ = parseInt (window.getComputedStyle (d, null) .getPropertyValue (« – stickyTop »)) || _, C = $ visibility.getViewportWidth ()> = 1180? window.getComputedStyle (d, null) .getPropertyValue (« – verticalEndDesktop ») || C: window.getComputedStyle (d, null) .getPropertyValue (« – verticalEnd ») || C} function S () {$ =! 1, P ()} function P () {let {top: r} = t.getBoundingClientRect (), o = window.getComputedStyle (d, null) .getPropertyValue (« – baseFlexBasis »), s = ox, l = (_- e.getBoundingClientRect (). top) / _, n = Math.max (0, Math. min (1, l)), m = LC-2, f = Math.round (L- (m * n 2)), g = Math.ceil (os * n); if (lt? e.classList.add (« header-after-scroll »): e.classList.remove (« header-after-scroll »), p.style.transfo rm = `translateY ($ {C} px)`, u.style.transform = `translateY ($ {C} px)`, void (d.style.flexBasis = x « px »)} window.scrollY> r? t.classList.add (« after-scroll »): t.classList.remove (« after-scroll »), window.scrollY> r? e.classList.add (« header-after-scroll »): e.classList .remove (« header-after-scroll »), p.style.transform = `translateY ($ {f} px)`, u.style.transform = `translateY ($ {f} px)`, d.style. flexBasis = g « px », c&& (c.style.flexBasis = g « px »), $ visibility.getViewportWidth ()> = 1180&&i&&function () {const t = a? $ visibility.getPageOffset (). 0, e = $ visibility.getPageOffset (i) .top, r = Math.max (e, t); return Math.max (window.scrollY, document.body.scrollTop)> = r} ()? T.classList .add (« deep-scroll »): t.classList.remove (« deep-scroll »)} function V (t) {var e = t.currentTarget, i = e.getAttribute (« href »), r = e .getAttribute (« data-handle »), o = $ popup.getPopupClass (e.classList), s = $ visibility.isBelowPrimaryContent (e)? « bottom »: « top »; $ gtm.reportNow ({event: « social -share-widget « , clickLocation: s, socialNetw ork: o}), reportSocial (o), $ visibility.getViewportWidth ()> = 768&&o&& (t.preventDefault (), $ popup.popWindow (o, r, i))}! function () {const e = _throttle ( P, 30); if (k (), dom.findAll (t, « . Share-link »). ForEach (t => t.addEventListener (« click », V)), y&& (y.href = « http : //www.facebook.com/sharer/sharer.php? u = « f »? utm_source = fb&utm_medium = s3&utm_campaign = sharebutton-t « ), w&& (w.href = » https://twitter.com/share? text = « encodeURIComponent (h) » &url = « f »? utm_source = tw&utm_medium = s3&utm_campaign = sharebutton-t&via = « w.getAttribute ( » data-handle « )), v&C: // pinterest. com / pin / create / button /? url = « f »? utm_source = pin&utm_medium = s3&utm_campaign = sharebutton-t&description = « encodeURIComponent (h) » &media = « g) », b) return; auth0.on (« init0.on ( » init ) => {auth0.isSubscriber () &&t.classList.add (« subscribed »)}), window.addEventL istener (« scroll », e), window.addEventListener (« resize », S), window.addEventListener (« resize », k), l? l.classList.contains (« rubric-sponsor-story ») &&s? ( o.classList.remove (« visible »), s.classList.add (« visible »), s.textContent = l.text || l.textContent) 🙁 o.textContent = l.text || l.textContent, o.href = l.href || « # ») 🙁 n.style.display = « none », o.style.display = « none »); S (), r.textContent = h} ()}) ;
}, {« 3 »: 3, « 4 »: 4, « 5 »: 5, « 7 »: 7, « 50 »: 50, « 65 »: 65, « 66 »: 66}];
window.modules [« nav-search-button.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), $ gtm = require (3), {reportSearch: reportSearch } = require (66), openClass = « open », closeClass = « closed »; module.exports = (e => {const s = e, t = dom.find (e, « . nav-search-button-trigger « ), n = dom.find (e, ». nav-search-form « ), o = dom.find (e, ». search-input « ); function i () {const e = dom.find ( » body « ); s.classList.toggle (closeClass), s.classList.toggle (openClass), e.classList.toggle ( » disabled « ), e.classList.toggle ( » search-active « )} function c () {i (), s.classList.contains (openClass) &&o.focus ()} function a (e) {! s.contains (e.target) &&s.classList.contains (openClass) &&i ()} function r (e ) {27 === e.keyCode&&s.classList.contains (openClass) &&i ()} function d (e) {e.preventDefault (), $ gtm.reportCustomEvent ({category: « search », label: « on = » window.location.href, action: o.value}), reportSearch ((o.value || «  »). split («  »), () => n.submit ())}! function (e, s, t) {s&&s.addEventListener (« click », c); t&&t.addEventListener (« submit », d); e.addEventListener (« click », a), document.addEventListener (« keydown », r), e .addEventListener (« touchend », a), n.addEventListener (« submit », d)} (dom.find (« body »), t, dom.find (e, « . nav-search-form submit »)) });
}, {« 3 »: 3, « 4 »: 4, « 66 »: 66}];
window.modules [« nav-dropdown-button.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), visibility = require (5), {reportSearch: reportSearch} = require (66); function getNextSiblings (e) {const t = []; let i = e; for (; i = i.nextElementSibling;) t.push (i); return t} function getMainChildren (e, t) {let i = [], n = e.firstChild; for (; n = n.nextElementSibling;) n.contains (t)? n.isSameNode (t) || (i = i.concat (getMainChildren (n, t ))): i.push (n); return i} function isMobile () {return visibility.getViewportWidth () {let t; const i = e.querySelector (« . nav-dropdown-button-trigger »), n = dom.find (« body »), o = dom.find (« . top »), l = dom.find (« . confetti-list »), s = dom.find (« . nav-dropdown-button_nymag-homepage « ), r = dom.find ( » header.page-header « ) || o, c = dom.find (‘[data-editable = » main « ]’), a = dom.closest (e, ». page-header « ), d = a? a.querySelectorAll (« . confetti-image.blue « ): » « , g = a? a.querySelectorAll (« . confetti-image.green « ): » « , u = a? a.querySelectorAll (« . confetti-image.orange »): «  », f = a? a.querySelectorAll (« . confetti-image.orange2 »): «  », m = a? a.querySe lectorAll (« . confetti-image.pink »): «  », p = a? a.querySelectorAll (« . confetti-image.purple »): «  », h = a? a.querySelectorAll (« . confetti-image. yellow « ): » « , y = e.querySelectorAll (« . dropdown-nav-search-form « ); function b (e) {let t = e.currentTarget, i = t.querySelector (« . nav-search- input « ), n = i? i.value.split ( » « ): []; e.preventDefault (), reportSearch (n, () => t.submit ())} i.addEventListener ( » click « , () => {initializeHeight (e), v ()}); for (let e = 0, t = y.length; e (function (e) {e.classList.remove (« c-right », « c -rightdown « , » c-left « , » c-leftdown « )}) (e))}, 500)} ()) 🙁 i.setAttribute ( » aria-expanded « , » true « ), t = window .scrollY), e.classList.toggle (« closed »), e.classList.toggle (« open »), n.classList.toggle (« disabled »), a&&e.isSameNode (s)? function () {if ( o.contains (e)) {const e = getMainChildren (o, s); S (e), w (o)} if (c.contains (e)) {const e = getMainChildren (c, s); o. classList.toggle (« hidden-component »), w (c), S (e)} e.classList.toggle (« open-mobile »)} (): a&&! y&&r&& (w (r), function () { const i = e .classList.contains (« open »)? 0: t; window.scrollTo ({top: i})} ())} function w (e) {S (getNextSiblings (e))} function S (e) {e .forEach (e => {e.classList.toggle (« hidden-component »)})} n.addEventListener (« click », t => {! e.contains (t.target) &&e.classList.contains ( » open « ) &&v ()}), document.addEventListener ( » keydown « , t => {27 === t.keyCode&&e.classList.contains ( » open « ) &&v ()})});
}, {« 4 »: 4, « 5 »: 5, « 66 »: 66}];
window.modules [« follow.client »] = [function (require, module, exports) {« use strict »; const _find = require (56), $ popup = require (65); DS.controller (« follow », [function () {function e (e) {this.el = e, this.handle = e.getAttribute (« data-handle »)} return e.prototype = {events: {click: « openFollow »}, openFollow: function (e) {var t, n, a = $ popup.position, o = $ popup.params, l = {}, r = {w: 780, h: 500}, s = new a (rw, rh) , c = this.el.classList; l.handle = this.handle, r.left = s.left, r.top = s.top, n = _find ([{className: « facebook », url: « https: //facebook.com/{handle} »,network: »Facebook »},{className: »pinterest »,url: »http://www.pinterest.com/ registers »,network: »Pinterest « }, {className: « instagram », url: « https://www.instagram.com/ Zonenhandle} », network: « Instagram »}, {className: « rss », url: « http: //feeds.feedburner. com / {handle} « , network: » RSS « }, {className: » twitter « , url: » https://twitter.com/intent/follow?screen_name=phiahandle Genealogie&tw_p=followbutton&variant=2.0 « , network: « Twitter »}, {className: « snapchat », url: « https://www.snapchat.com/discover/ Genealogiehandle} », netw ork: « Snapchat »}], function (e) {return c.contains (e.className)}), l.url = n.url.replace (« {handle} », l.handle), l.network = n.network, l.name = « Follow » l.handle « on » l.network, t = new o (l, r), window.open (t.address, t.name, t.features), e. preventDefault ()}}, e}]);
}, {« 56 »: 56, « 65 »: 65}];
window.modules [« comments-link.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), _ get = require (9), _ isFinite = require (122), ajax = require (121); DS.controller (« comments-link », [function () {var t, e = « http: // » document.documentElement.getAttribute (« data-uri ») « .html »; function n (n) {var o; (this.el = n, this.coral_talk_root = n.getAttribute (« data-coral-talk »), this.commentsCount = dom.find (n, « . comments-link-count « ), this.commentsText = dom.find (n, ». comments-link-text « ), this.isNavVariation = n.classList.contains ( » comments-link_article-nav « ), this.cutoffCnt = n.getAttribute ( « data-cutoffCnt ») || 1e3, t = `$ {this.coral_talk_root} /api/v1/graph/ql`,this.shouldRenderCommentStream ()) && (o = this.onCommentCountFetched.bind (this), ajax. sendReceiveJson ({method: « GET », url: t ‘? query = {asset (url: « ‘ e ‘ ») {totalCommentCount}}’, dataType: « json »}, function (t, e) {var n = _get (e, « data.asset.totalCommentCount », 0); return t? o (t): _ isFinite (n)? void o (null, n): o (« Unexpected Coral-Talk response »)}))} return n.pro totype.onCommentCountFetched = function (t, e) {if (t) return console.warn (t); e> 0&& (this.isNavVariation&&e1? « s »: «  »), this.el.classList.remove (« no- comments « ))}, n.prototype.shouldRenderCommentStream = function () {return-1! == e.indexOf ( » @ published « )}, n}]);
}, {« 4 »: 4, « 9 »: 9, « 121 »: 121, « 122 »: 122}];
window.modules [« head-gtm.client »] = [function (require, module, exports) {« use strict »; const {getCLS: getCLS, getFID: getFID, getLCP: getLCP} = require (154), isProduction = require (8) (); function reportWebVitals (e) {isProduction || console.log (« reportWebVitals:% O », e); const t = « string » == typeof e.name?e.name.toUpperCase () : e.name; window.dataLayer = window.dataLayer || [], window.dataLayer.push ({event: « analyticsEvent », event_action: t, event_category: « Web Vitals », event_label: e.id, event_value: e .delta, eventAction: t, eventCategory: « Web Vitals », eventLabel: e.id, eventNonInt:! 0, eventValue: e.delta, nonInteraction:! 0, transport: « beacon »})} getCLS (e => { e.delta = Math.round (1e3 * e.delta), reportWebVitals (e)}), getFID (e => {e.delta = Math.round (e.delta), reportWebVitals (e)}), getLCP ( e => {e.delta = Math.round (e.delta), reportWebVitals (e)});
}, {« 8 »: 8, « 154 »: 154}];
window.modules [« concert-ads.client »] = [function (require, module, exports) {« use strict »; const customMappings = {« crime-assault »: « Power », « career money productivity »: « Power « , » feminism-politics-identity « : » Power « , » culture-media « : » Culture « , celebrity: » Culture « , living: » Style « , fashion: » Style « , shopping: » Style « , weddings: « Style », beauty: « Style », animals: « Self », « learning creativity »: « Self », « relationships-friends family »: « Self », « mental health personality social behavior »: « Self », « learning creativity « : » Self « , » health-wellness « : » Self « , parenting: » Self « , » relationships-sex dating marriage « : » Self « }, striptags = require (67); function installConcertAds () {const e = new URLSearchParams (window.location.search) .get (« concert_config_url »), t = e || window.concertConfigUrl; window._nymPermutive || console.warn (« ConcertAds initializing without Permutive »), window.concertAds = createConcertAds ( ), window.concertAds.loadRemoteConfig (t) .then (function () {window.concertAds.install ()})} function createConcertAds () {const e = getAuthStatus (); let t = getD ata (« title »), n = window.location.href, i = getData (« section »), o = «  », a = getData (« type »), r = getData (« vertical »); t&& (t = striptags (htmlDecode (t)). split («  »)), n = n.slice (n.lastIndexOf (« / ») 1); const l = {kw: getKeywords (), network: r, page_type: a , entry_group: i, keywords: t, pn: n}; return « Homepage » === a? o = « homepage »: « Section Page » === a&& (o = (o = window.location.pathname). replace (/ // g, «  »)), i&&-1 === i.indexOf («  ») && (o = i), customMappings [i] && (o = customMappings [i]), window.location .hostname.match (/ . aws ./ i) ​​&& (l.clay_sandbox_env = r), new window.ConcertAds ({cmd: [], slots: [], dfpVariables: l, slugPath: « / » o. replace (/ – | – / g, « -« ), loggedIn: « unauthenticated »! == e, paywallActive: getPaywallStatus (e)})} function getKeywords () {try {const e = window._nymPermutive.article.keywords ; return e&&e.length> 0&&e.some (Boolean)? e: (document.querySelector (‘meta [name = « keywords »]’) || document.querySelector (‘meta [property = « article: tag »]’)). getAttribute (« content »). split (« , »). map (function (e) {return e.trim ()})} catch (e) {return}} function getData (e) {if (window._nymPermutive) {if (e in window._nymPermutive) return window._nymPermutive [e]; if (window._nymPermutive.article&&e in window._nymPermutive.article) return window. _nymPermutive.article [e]; if (window._nymPermutive.user&&e in window._nymPermutive.user) return window._nymPermutive.user [e]}} function htmlDecode (e) {var t = document.createElement (« div »); return t.innerHTML = e, 0 === t.childNodes.length? «  »: t.childNodes [0] .nodeValue} function getAuthStatus () {const e = JSON.parse (localStorage.getItem (« auth0: profile » )), t = e? e [« http://nymag.com/app_metadata »]: null; return t? t.has_subscription? « entitled »: « unentitled »: « unauthenticated »} function getPaywallStatus (e) {const t = getData (« totalCount ») || 0; return Boolean (t> = 3&& « entitled »! == e)} window.ConcertAds? installConcertAds (): window.addEventListener (« concertAdsReady », in stallConcertAds);
}, {« 67 »: 67}];
window.modules [« latest-news.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), lazyLoad = require (108); function lazyLoadImage (a) {const o = dom.find (a, « img [data-src] »), d = dom.findAll (a, « source [data-srcset] »), e = dom.closest (a, « . result »); if (o&&e) {new lazyLoad.LazyLoader (e, o, d) .init ()}} function handleLazyLoad (a) {(dom.findAll (a, « . result ») || []). forEach (lazyLoadImage) } module.exports = (a => {handleLazyLoad (a)});
}, {« 4 »: 4, « 108 »: 108}];
window.modules [« coral-talk.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), store = require (128), visibility = require (5), auth0 = require (7), TALK_AUTH = « talk: auth_token »; let coralEmbed, hasEmbedScriptLoaded =! 1, hasCoralTalkRendered =! 1; function renderComments (e) {if (hasEmbedScriptLoaded&&! e.CORAL_TALK_HOST} `, auth_token: getAuthToken (), asset_url: e.TALK_ASSET_URL}; hasCoralTalkRendered =! 0, coralEmbed = window.Coral.Talk.render (e.commentStreamContainer, t)}} function getAuthToken (e) {var = e&&e [« http://nymag.com/coral_talk »] || auth0.getTalkJwt (), i = store.get (TALK_AUTH); return t? i&&t == i? i: (store.set (TALK_AUTH, t ), t) 🙁 i&&store.remove (TALK_AUTH), null)} function coralLogin () {coralEmbed.login (getAuthToken ())} function embedScript (e, t) {let i = document.createElement (« script »); i.type = « text / javascript », i.async =! 0, i.src = e, i.addEventListener (« load », () => {hasEmbedScriptLoaded =! 0, r enderComments (t)}), document.getElementsByTagName (« head ») [0] .appendChild (i)} function initVerificationMessage () {auth0.isAuthenticated () &&auth0.refresh (); let e = document.querySelector (« . coral -talk-container « ); auth0.isAuthenticated () &&! auth0.isEmailVerified () && (e.insertAdjacentHTML ( » beforebegin « , ‘ n n Please verify your account to enable commenting. Didn ‘t receive a verification email? Re-send email now. N ‘), document.querySelector (« . Activation-link »). AddEventListener (« click », sendVerificationEmail))} function sendVerificationEmail () {let e = document.querySelector (« . Coral-talk -verify-address « ); return fetch (` https: // $ {window.location.host} / _user / verification-email? user_id = $ {auth0.getUserID ()} `, {method: » GET « , headers : {« Content-Type »: « application / json »}}). Then (e => e) .then (t => {t&&200 == t.status? E.innerHTML = « Verification email was sent successfully »: e.innerHTML = `$ {t.statusText}`}). catch (e => console.log (e))} function attemptScriptEmbedding (e, t) {initVerificationMessage (), hasEmbedScriptLoaded? renderComments (t): embedScript (t .EMBED_URL, t)} function addVisibilityListener (e, t) {new visibility.Visible (e, {preloadThreshold: 750}). On (« preload », () => attemptScriptEmbedding (e, t))} function removeSignInButton (e ) {e&&e.parentNode&&dom.removeElement (e)} function init (e) {const t = e.getAttribute (« data-coral-talk-host »), i = `$ {t} / static / embed.js` , n = `http: // $ {document.documentElement.getAttribute ( » data-uri « )}. html`, a = » true « === e.getAttribute ( » data-maintenance « ), o = -1 ! == n.indexOf (« @ published »), r = e.querySelector (« . coral-talk-container »), s = e.querySelector (« . coral-talk-btn-signin »), c = { CORAL_TALK_HOST: t, EMBED_URL: i, commentStreamContainer: r, signInButton: s, TALK_ASSET_URL: n}; « , () => auth0.showLogin ()), auth0.isAuthenticated () &&removeSignInButton (s)}), auth0.on ( » login « , t => {removeSignInButton (s), getAuthToken (t), visibility.isElementInViewport (e) &&attemptScriptEmbedding (c), hasCoralTalkRendered&&coralLogin ()}), auth0.on (« logout », () => {store.remove (TALK_AUTH)}))} module.exports = init;
}, {« 4 »: 4, « 5 »: 5, « 7 »: 7, « 128 »: 128}];
window.modules [« choreographer.client »] = [function (require, module, exports) {« use strict »; const cookie = require (54), _ get = require (9), _ omit = require (86), {insertSpeedBumpComponents : insertSpeedBumpComponents} = require (90), {insertNewsletterSpeedBumpComponents: insertNewsletterSpeedBumpComponents} = require (91), {generateGrowl: generateGrowl} = require (89), gtm = require (3), {getLocalStorage: getLocalStorage:} = require 33), {reportPaywall: reportPaywall} = require (66), moment = require (38), {getClientHistory: getClientHistory, updateClientHistoryWithPageData: updateClientHistoryWithPageData} = require (92), auth0 = require (7), {Scenario: Scenario} = require (87), cidReadyEvent = « nymcid-set », cidKey = « nymcid », isProduction = require (8) (), logger = require (85) .Logger (() => getLocalStorage (« show_choreographer_logs »)), {Verdon : Verdon} = require (88), TEST_COHORT_FLAG = « optimizeCohort »; function displayDebug (e = «  ») {if (« entitlement »! == e.split (« # »). Pop ()) return; const t = _get (window, « dataLayer [0] .userDetails », {}), o = _get (window,  » dataLayer [0] .pageDetails.featureTypes « , » « ), n = o.includes ( » magazine « )? » magazine « : » « , r = o.includes ( » feature « )? » featured « : » « , i = « Value of Article: » (n || r || « article »), a = _get (JSON.parse (localStorage.getItem (« auth0: profile »)), « http://nymag.com/app_metadata « ), l = » Authentication Status: « (a? » authenticated « : » unauthenticated « ), s = » Entitlement Status: « (!! a&&a.has_subscription? » entitled « : » unentitled « ), c = Object.keys (_omit (t, « newYorkMediaUserID »)). map (e => `$ {e}: $ {t [e]}`), d = document.body, g = document.createElement (« div »), u = document.createElement (« ul »); [i, l, s, … c] .map (e => {const t = document.createElement (« li »); return t.classList.add (« debug -item « ), t.appendChild (document.createTextNode (e)), t}). forEach (e => {u.appendChild (e)}), u.classList.add ( » data-bullets « ), g .classList.add (« debug-choreographer »), g.classList.add (« display-debug-data »), g.appendChild (u), d.appendChild (g)} function initializeChoreographer (e) {const t = e.getAttribute (« data-site-slug »), o = pageShouldCountAsView (t), n = auth0.isSubscriber ( ); return t? getClientId (cidKey, 8e3) .then (e => (logger.h1 (« Choreographer initialized »), logger.log (`clientId: $ {e}`), logger.log (`page counts as a view: $ {o} `), window.nymViewsResponse || (o? updateClientHistoryWithPageData (e, t): getClientHistory (e)))). then (r => {if (logger.group (), logger.h2 (« Client history »), logger.table (r), logger.groupEnd (), isNCR ()) return; const {scenarios: i, touts: a, testCohort: l = «  »} = readJSONFromScript (e.querySelector ( « script »)); if (! (l === (document.body.dataset [TEST_COHORT_FLAG] || «  »))) return; const s = i.map (e => Scenario (Object.assign ({} , e, {history: r, siteSlug: t, isSubscriber: n}))). filter (e => (logger.group (), logger.h2 (« Evaluating scenarios »), logger.log (e), logger .groupEnd (), e.shouldShow)). reduce ((e, {action: t, min: o, count: n}) => {const r = a.find (({value: e}) => e === t); return r? (e [r.type] = r, e [r.type] .viewCount = no, e): e}, {}); logger.group (), logger.h2 ( « Active Touts »), logger.log (s), logger.groupEnd (), executeTouts (e, o, s, r)}). Catch (console.error): console.error (« siteSlug not found. ») } function documentIncludes Component (e) {return document.querySelector (`[data-uri * = » / $ {e} / « ]`)} function pageShouldCountAsView (e) {const t = « strategist » === e, o = [ » product « , » product-grid « ]. find (e => documentIncludesComponent (e)); return t ||! o} function executeTouts (e, t, o = {}, n) {const {global: r} = n, i = {featureArticleCount: r.Feature || 0, magazineArticleCount: r.Magazine || 0, standardArticleCount: r.Article || 0, totalArticleCount: r.total || 0}, a = window.concertAds, l = window.ConcertAds; if (o [« speed-bump »] && (_get (a, « adsBlocked »,! 0)? insertSpeedBumpComponents (findTemplate (e, « speed-bump »), o [« speed-bump »], i): a.lifecycle.listenAndPlayback (l.events.slotsInserted, () => {insertSpeedBumpComponents (findTemplate (e, « speed-bump »), o [« speed-bump »], i)})), o [ « newsletter-speed-bump »] && (_get (a, « adsBlocked »,! 0)? insertNewsletterSpeedBumpComponents (findTemplate (e, « newsletter-speed-bump »), o [« newsletter-speed-bump »], i) : a.lifecycle.listenAndPlayback (l.events.slotsInserted, () => {insertNewsletterSpeedBumpComponents (findTemplate (e, « news letter-speed-bump « ), o [ » newsletter-speed-bump « ], i)})), o [ » branded-growl « ] &&brandedTakeoverTime (o [ » branded-growl « ]) &&t) return logger.log (« should show branded growl »), void growlManager (findTemplate (e, « branded-growl »), {baseTrackingData: i, body: o [« branded-growl »]. brandedGrowlBody, contentClass: « branded-content », cta : o [« branded-growl »]. brandedGrowlCTA, imageUrl: o [« branded-growl »]. imageUrl, link: o [« branded-growl »]. brandedGrowlLink, name: o [« branded-growl »]. name , scrollDepth: o [« branded-growl »]. brandedGrowlScrollDepth, title: o [« branded-growl »]. brandedGrowlTitle, toutType: « branded growl »}, « # branded-growl »); if (t&&o [« content- cliff « ]) contentCliff (findTemplate (e, » content-cliff « ), o [ » content-cliff « ], o [ » content-cliff « ]. viewsLeft, n); else {if (t&&o [ » cliff-takeover « ]) return / coronavirus news | pivot | paywall exclude / i.test (window._nymGtmPage.tags)? void (isProduction&&logger.log ( » Content cliff no-op due to excluded tag match: « , window._nymGtmPage.tags)): void cliffTakeover (findTemplate (e, » paywall-reader-interface « ), i, o [ » cliff-takeover « ]); if (o [ » growl-newletter « ] || ! o [« promo-growl »]) if (o [« baby-growl »]) babyGrowl (findTemplate (e, « paywall-reader-interface »), i, o [« baby-growl »]); else { if (! o [« warning-growl-2 »]) return o [« warning-growl »] &&shouldWarn ()? (setContentCliffWarningDisplayed (), logger.log (« should show warning »), void growlManager (findTemplate (e, « warning-growl »), {contentClass: « warning-content », title: o [« warning-growl »]. warningGrowlTitle, name: o [« warning-growl »]. name, scrollDepth: o [« warning-growl « ] .warningGrowlScrollDepth, cta: o [ » warning-growl « ]. warningGrowlCTA, body: o [ » warning-growl « ]. warningGrowlBody, link: o [ » warning-growl « ]. warningGrowlLink, baseTrackingData: i, toutType: « warning growl »}, « # warning-growl »)): void 0; warningGrowl (findTemplate (e, « paywall-reader-interface »), i, o [« warning-growl-2 »])} else growlManager ( findTemplate (e, « growl-message »), {contentClass: « promo-content », title: void 0, name: o [« promo-growl « ] .name, scrollDepth: o [ » promo-growl « ]. promoGrowlScrollDepth, cta: o [ » promo-growl « ]. promoGrowlCTA, body: o [ » promo-growl « ]. promoGrowlMessage, link: o [ » promo -growl « ]. promoGrowlLink, baseTrackingData: i, toutType: » promo growl « }, » # growl-message « )}} function shouldWarn () {return! contentCliffWarningDisplayed ()} function getContentCliffWarningDisplayedKey () {const e = new date, t = e.getMonth (); return`content-cliff-warning-displayed – $ {e.getFullYear ()} – $ {t} `} function contentCliffWarningDisplayed () {const e = getContentCliffWarningDisplayedKey (); return » true « = == getLocalStorage (e)} function setContentCliffWarningDisplayed () {const e = getContentCliffWarningDisplayedKey (); return setLocalStorage (e, « true »)} function growlManager (e, {contentClass: t, scrollDepth: o, name: n, title: r , body: i, cta: a, link: l, baseTrackingData: s, toutType: c, imageUrl: d = null}, g = «  ») {const u = function () {const e = ` n n n n ${r}n ${d? »: » »}n ${i}n ${d?« : » »}n ${a}n n n n `;return document.createRange().createContextualFragment(e)}(),p={creative:i,id:c,name:n,position: »growl »};u.querySelector(« a »).addEventListener(« click »,()=>promotionReport(« Click »,s,p)),generateGrowl(e,g,{content:u,scrollDepth:o,onShow:()=>promotionReport(« View »,s,p)})}function contentCliff(e,t,o,n){const{first_visit:r,global:i}=n,a={totalArticleCount:i.total||0,standardArticleCount:i.Article||0,featureArticleCount:i.Feature||0,magazineArticleCount:i.Magazine||0},{contentCliffBody:l}=t,s=document.importNode(e,!0).querySelector(« .content-cliff »),c=document.querySelector(« .article-content > .clay-paragraph »),d={creative:l,id: »content cliff »,name: »Content Cliff »,position: »in-article »};s&&(c.insertAdjacentHTML(« afterend »,s.outerHTML),require(« content-cliff.client »)(document.querySelector(« .content-cliff »),{contentCliffOptions:t,viewsLeft:o,firstVisit:Number(r),onShow:()=>promotionReport(« View »,a,d),onClickCliff:()=>promotionReport(« Click »,a,d)}))}functio n verdonFosseToutSetter(e,t,o,n,r){const i=new Verdon({container: ».paywall-reader-interface »,url: »https://fosse.nymag.com/fosse/v1.6.1/index.html »}),a=e.type,l={email:auth0.getEmail(),isAuthenticated:auth0.isAuthenticated(),isSubscriber:auth0.isSubscriber()};n.classList.add(a),i.once(« frame:ready »,()=>{i.sendMessage(« tout:show »,{readerState:l,toutType:a,toutData:e}),r&&i.sendMessage(« frame:height »)}),i.on(« tout:visible »,()=>{promotionReport(« View »,t,o)}),i.on(« tout:sign-in »,()=>{auth0.showLogin(window.location.href)}),i.on(« tout:log-out »,()=>{auth0.logout()}),i.on(« tout:dismiss »,()=>{n.classList.add(« dismiss »),i.sendMessage(« tout:hide »,{toutType:a,toutData:e})}),i.on(« tout:subscribe »,()=>{e.ctaLink=replaceQueryParams(e.ctaLink),promotionReport(« Click »,t,o),window.open(e.ctaLink, »_blank »)}),i.on(« frame:height »,e=>{n.style.height=`${e.payload.currentHeight 10}px`}),i.on(« tout:view-account »,()=>{window.location.href= »https://subs.nymag.com/account »})}function promotion Report(e,t,o){const{creative:n,id:r,name:i,position:a}=o;t.event=`eec.promotion${e}`,t.ecommerce={promoView:{promotions:[{creative:n.trim(),id:r,name:i,position:a}]}},gtm.reportNow(t),reportPaywall({creative:n.trim(),eventType:e,id:r,name:i,position:a})}function babyGrowl(e,t,o){const n=document.importNode(e,!0).querySelector(« .paywall-reader-interface »),r={creative:o.babygrowlDescription,id: »baby growl »,name: »baby growl »,position: »growl »};document.body.appendChild(n),o.ctaLink=o.babygrowlCtaLink,o.ctaText=o.babygrowlMessage,o.headline=o.babygrowlDescription,verdonFosseToutSetter(o,t,r,n)}function cliffTakeover(e,t,o){const{cliffTakeoverCTA:n,cliffTakeoverCtaLink:r,cliffTakeoverDescription:i,cliffTakeoverImage:a,cliffTakeoverPromo:l,cliffTakeoverStatus:s,type:c}=o,d=document.importNode(e,!0).querySelector(« .paywall-reader-interface »),g=document.querySelectorAll(« .clay-paragraph »),u={creative:l,id: »content cliff »,name: »Content Cliff »,position: »growl »},p={cta:n,ctaLink:r,description:i,im age:a,promo:l,status:s,type:c};document.body.appendChild(d),g.forEach((e,t)=>{0!==t&&e.remove()}),verdonFosseToutSetter(p,t,u,d,!0),document.querySelector(« html »).style.overflowY= »hidden »,document.body.style.position= »fixed »}function warningGrowl(e,t,o){const{type:n,warningGrowl2CTA:r,warningGrowl2CtaLink:i,warningGrowl2Description:a,warningGrowl2Image:l,warningGrowl2Promo:s,warningGrowl2Status:c}=o,d=document.importNode(e,!0).querySelector(« .paywall-reader-interface »),g={creative:s,id: »warning growl »,name: »Warning Growl »,position: »growl »},u={cta:r,ctaLink:i,description:a,image:l,promo:s,status:c,type:n};document.body.appendChild(d),verdonFosseToutSetter(u,t,g,d,!0)}function getClientId(e= » »,t=8e3){let o=cookie.get(e);return o?Promise.resolve(o):new Promise((o,n)=>{const r=setTimeout(()=>{n(`could not find key: ${e} on cookie after ${t}ms`)},t);window.addEventListener(cidReadyEvent,()=>{clearTimeout(r),o(cookie.get(e))})})}function readJSONFromScript(e){try{return J SON.parse(e.innerHTML)}catch(e){return{touts:[],scenarios:[]}}}function findTemplate(e,t= » »){const o=e&&e.querySelector(`[data-template-id= »${t} »]`);return o&&o.content}function isNCR(){return/[?&]source=ncr/.test(location.search)}function brandedTakeoverTime(e){const{startTime:t,endTime:o,startDate:n,endDate:r}=e,i=n.concat( » « ,t),a=r.concat( » « ,o),l=moment(i),s=moment(a);return moment().isBetween(l,s)}function optimizeDebugger(){return new Promise(e=>{const t=window.location.search|| » »;if(t){const o=new URLSearchParams(t),n=o.get(« optimize-attribute-name »)|| » »,r=o.get(« optimize-attribute-value »)|| » »,i=o.get(« optimize-delay »)||0,a=o.get(« optimize-cookie »)||!1;setTimeout(()=>{a&&(document.cookie=randomNymcid()),document.body.setAttribute(`data-${n}`,r),e()},i)}else e()})}function randomNymcid(){return`nymcid=${(()=>([1e7] -1e3 -4e3 -8e3 -1e11).replace(/[018]/g,e=>(e^16*crypto.getRandomValues(new Uint8Array(1))[0]>>e/ 4).toString(16)[0]))()}`}function replaceQueryParams(e){const t=window.location.search|| » »;if(t){const o=new URLSearchParams(t);if(e.includes(« ? »)){const t=e.split(« ? »),n=new URLSearchParams(t[1]);for(let e of o.entries())n.set(e[0],e[1]);e=`${t[0]}?${n.toString()}`}else e=`${e}?${o.toString()}`}return e}module.exports=(e=>new Promise(e=>{auth0.on(« init »,()=>{e()})}).then(()=>optimizeDebugger()).then(()=>{displayDebug(window.location.href),initializeChoreographer(e)}));
}, {« 3″:3, »7″:7, »8″:8, »9″:9, »33″:33, »38″:38, »54″:54, »66″:66, »85″:85, »86″:86, »87″:87, »88″:88, »89″:89, »90″:90, »91″:91, »92″:92, »content-cliff.client »: »content-cliff.client »}];
window.modules[« growl.client »] = [function(require,module,exports){« use strict »;require(152);const _some=require(75),dom=require(4),localStorageKeyRoot= »slideout-« ,{getLocalStorage:getLocalStorage,setLocalStorage:setLocalStorage}=require(33);module.exports=((e,t)=>{const{content:o,onShow:s,scrollDepth:r=50,dismissable:i=!1}=t,n=Number(r||e.getAttribute(« data-display-at-page-scroll-percentage »)),a=dom.find(e, ».modal »),l= »slideout- » (t.id||e.getAttribute(« id »)),c=getLocalStorage(l);function d(){a.classList.add(« hidden »)}function g(){setLocalStorage(l,!0),d()}i&&c?e.remove():(o&&e.querySelector(« [data-content] »).appendChild(o),n&&function(e=50){const t=new IntersectionObserver(e=>{_some(e, »isIntersecting »)&&(a.style.top= »inherit »,a.classList.remove(« hidden », »initial »), »function »==typeof s&&s(),t.unobserve(a))});a.style.top=`${document.querySelector(« body »).scrollHeight/(100/e)}px`,t.observe(a)}(n),e.querySelector(« .dismiss-modal »).addEventListener(« click »,()=>i?g():d()),e.addEventListener(« growl:hide »,d),e.addEventListener(« growl:dismiss »,g))});
}, {« 4″:4, »33″:33, »75″:75, »152 »:152}];
window.modules[« speed-bump.client »] = [function(require,module,exports){« use strict »;const gtm=require(3),visibility=require(5);module.exports=((e,i)=>{if(!i||!e)return;const{name:o,speedbumpDescription:r,speedbumpMessage:t,speedbumpLink:n,baseTrackingData:s}=i,c=new visibility.Visible(e,{shownThreshold:.5});e.querySelector(« .description »).innerHTML=r,e.querySelector(« .promo-link »).innerHTML=t,e.querySelector(« .promo-link »).href=n,e.classList.remove(« collapsed »),c.on(« shown »,function(){if(visibility.isElementNotHidden(e)){let e=s;e.event= »eec.promotionView »,e.ecommerce={promoView:{promotions:[{name:o,creative:r,id: »speed bump »,position: »in-article »}]}},gtm.reportNow(e),c.destroy()}}),e.querySelector(« .promo-link »).addEventListener(« click »,function(){let e=s;e.event= »eec.promotionClick »,e.ecommerce={promoClick:{promotions:[{name:o,creative:r,id: »speed bump »,position: »in-article »}]}},gtm.reportNow(e)})});
}, {« 3″:3, »5 »:5}];
window.modules[« newsletter-speed-bump.client »] = [function(require,module,exports){« use strict »;const{loadRecaptcha:loadRecaptcha}=require(119),_isEmpty=require(100),_set=require(120),_kebabCase=require(93),gtm=require(3),auth0=require(7),visibility=require(5),COMPONENT_NAME= »newsletter-speed-bump »,EMAIL_VALID_REGEX=/^(?:(?:[^()[]\.,;:[email protected] »] (?:.[^()[]\.,;:[email protected] »] )*)|(« . « ))@(?:(?:[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(?:(?:[a-zA-Z-0-9] .) [a-zA-Z]{2,}))$/,LOCAL_STORAGE_KEY_NAME= »newsletterSpeedBumpSignUpStatus_ »,MAX_EMAIL_LENGTH=50;function setClass(e,t){e.classList.add(t)}function getRequestUrl(e){return e.getAttribute(« action »)}function getPageType(e){const t=e?e.getAttribute(« content »): » »;return _kebabCase(t)}function getPayloadObject(e,t,r,s){const n={};return _set(n,`vars.source_${t}`,`${COMPONENT_NAME}_${s}`),n.email=r,n.lists={},n.lists[t]=!0,n.recaptcha=e,n.signuppage=`${document.location.href}_${t}`,n[`source_${t}`]= »newsleter_speedbump »,n}module.exports=((e,t)=>{if(!t||!e)return;if(« success »===window.localStorage.getItem(`${LOCAL_STORAGE_KEY_NAME}${t.newsletterSpeedBumpNewsletterId}`))return void e.remove();const{baseTrackingData:r,name:s,newsletterSpeedBumpCtaCopy:n,newsletterSpeedBumpDescription:i,newsletterSpeedBumpHeadline:a,newsletterSpeedBumpNewsletterId:o,newsletterSpeedBumpThankYouMessage:c,RECAPTCHA_PUBLIC_KEY:l}=t,u=auth0.getEmail(),d=e.querySelector(« .description »),p=e.querySelector(« .input.email »),m=e.querySelector(« .error-message »),h=e.querySelector(« .form »),E=e.querySelector(« .form-container »),y=e.querySelector(« .form-recaptcha-container »),g=e.querySelector(« .headline »),v=e.querySelector(« .container »),S=e.querySelector(« .input.newsletterId »),_=e.querySelector(« .recaptcha-wrapper »),L=e.querySelector(« .input.submit »),w=e.querySelector(« .text-container »),q=new visibility.Visible(e,{shownThreshold:.5});u&&(p.removeAttribute(« required »),e.classList.add(« signed-in »)),d.innerHTML=i,g.innerHTML=a,S.value=o,L.value=n,q.on(« shown »,function(){if(visibility.isElementNotHidden(e)){const e=r;e.event= »eec.promotionView »,e.ecommerce={promoView:{promotions:[{creative:`${a} | ${i}`,id: »newsletter speed bump »,name:s,position: »in-article »}]}},gtm.reportNow(e),q.destroy()}}),p.addEventListener(« focus »,()=>{_.classList.remove(« hidden »)}),h.addEventListener(« submit »,t=>{t.preventDefault();const s=new XMLHttpRequest,n=u||e.querySelector(« .input.email »).value,i=getPageType(document.querySelector(‘meta[name= »type »]’));u||!(n.length>=50)&&EMAIL_VALID_REGEX.test(n)?loadRecaptcha(l, »newsletterSubmit »,!0).then(a=>{s.open(« POST »,getRequestUrl(h),!0),s.setRequestHeader(« Content-Type », »application/json;charset=UTF-8″),s.addEventListener(« load »,s=>{const a=s.currentTarget||s.target;if(a.status>=200&&a.statussetClass(e, »success »)),[d,E,m,_].forEach(e=>setClass(e, »hidden »)),g.innerHTML=c.replace(« {{email}} »,n),m.innerHTML= » »;const s=JSON.parse(a.response),l=_isEmpty(s.sailthruIds)? » »:Object.values(s.sailthruIds)[0],u=r;u.event= »eec.purchase »,u.ecommerce={purchase:{actionField:{id:l,revenue: »0.00″},products:[{category: »newsletter signup »,name:S.value,quantity:1,variant:`${COMPONENT_NAME} – ${i}`}]}},gtm.reportNow(u),setTimeout(()=>{e.classList.add(« hidden »)},5e3),t.preventDefault()}else m.innerHTML= »*An error has occurred. Please try again. »}),s.addEventListener(« error »,()=>{m.classList.remove(« hidden »),m.innerHTML= »*An error has occurred. Please try again. »}),s.send(JSON.stringify(getPayloadObject(a,o,n,i))),t.preventDefault()}):m.innerHTML= »*Please enter a valid email »})});
}, {« 3″:3, »5″:5, »7″:7, »93″:93, »100″:100, »119″:119, »120 »:120}];
window.modules[« content-cliff.client »] = [function(require,module,exports){« use strict »;const auth0=require(7),isProduction=require(8)(),logger=require(85).Logger(()=>!isProduction);module.exports=((t,e)=>{if(!e)return;logger.group(),logger.h2(« Content Cliff »);const{contentCliffOptions:o,firstVisit:n,onShow:r,onClickCliff:i}=e,c=300,l=Number(document.querySelector(« [data-components-count] »).getAttribute(« data-components-count »)),u=3,s=[« taboola »],a= »#content-cliff »,f=t,d=function(){let t=0;return document.querySelectorAll(« [data-word-count] »).forEach(function(e){t =Number(e.getAttribute(« data-word-count »)||0,10)||0}),t}(),g=function(t,e){function o(t){return Math.round(t.getTime()/1e3/60)}const n=o(t),r=o(e);return n-r}(new Date,new Date(n)){},show:()=>{r(),function(){(p=function(t= » »){return document.querySelectorAll(`${t} ~ *`)}(a)).forEach(t=>t.remove()),function(){const{contentCliffStatus:e,contentCliffPromo:n,contentCliffCTA:r,contentCliffURL:c}=o,l=t.querySelector(« [data-content-cliff-status] »),u=t.querySelector(« [data-content-cliff-promo] »),s=t.querySelector(« [data-content-cliff-cta] »);s&&s.setAttribute(« href »,c),s&&s.insertAdjacentHTML(« afterbegin »,r),l&&l.insertAdjacentHTML(« afterbegin »,e),u&&u.insertAdjacentHTML(« afterbegin »,n),s&&s.addEventListener(« click »,i)}(),f.classList.remove(« collapsed »),e=s,e.forEach(t=>{const e=document.querySelector(`[data-uri*= »/${t}/ »]`);e&&e.remove()}),m.addEventListener(« click »,()=>auth0.showLogin());var e}()}}[function(){if(dl)return logger.log(`article word count ${d} was too short for the cliff`),logger.log(`article components count is smaller than ${u} and not eligible for the cliff`), »noop »;if(g&&isProduction)return »noop »;g&&logger.log(`First session check was ${g}! Showing the cliff anyway: isProduction => ${isProduction}`);if(/coronavirus news|pivot|paywall exclude/i.test(window._nymGtmPage.tags))return isProduction&&logger.log(« Content cliff no-op due to excluded tag match: « ,window._nymGtmPage.tags), »noop »;return »show »}()],m=t.querySelector(« .content-cliff-login »);let p=[];return logger.log(`should noop in production due to 30-minute first-session window: ${g}`),logger.groupEnd(),auth0.on(« login »,()=>{f.classList.add(« collapsed »),(p=Array.prototype.slice.call(p,0).reverse()).forEach(t=>f.insertAdjacentElement(« afterend »,t)),p=[]}), »function »==typeof h?h():void 0});
}, {« 7″:7, »8″:8, »85 »:85}];
window.modules[« ad.client »] = [function(require,module,exports){« use strict »;const _forEach=require(53),_max=require(55),_find=require(56),_includes=require(57),$visibility=require(5),dom=require(4),MAX_MOBILE_RE=/[[0-9]{1,3}-(768|600)/,MAX_TABLET_RE=/[0-9]{3}-(1024|1180)/,DESKTOP_RE=/(1024|1180)-plus/,AD_NAME_SELECTOR='[data-name^= »/4088/ »], [data-name^= »/172968584/ »]’;var flaggedComponentsOnPage=function(){var e,t=document.querySelector(« .article-content »),n=[];return t&&_forEach([‘.article-sidebar[data-width= »large »]’],function(a){e=t.querySelectorAll(a),_forEach(e,function(e){n.push(e)})}),n}();function getElementsVerticalOverlap(e,t){var n=e.getBoundingClientRect(),a=t.getBoundingClientRect();return!(n.top>a.bottom||n.righta.right)?a.bottom-n.top:0}function getElementsOverlapAmount(e,t){var n,a=[];return _forEach(t,function(t){n=getElementsVerticalOverlap(e,t),a.push(n)}),_max(a)}function getNYMagAdChannel(e){var t= » »;switch(e){case »company information »:t= »company »;break;case »new york guides & things to do »:t= »to-do »;break;case »other »:t=e;break;case »sponsored guides »:t= »s-guides »;break;case »urbanist »:t= »urbanist »;break;default:t= » »}return t}function appendSectionToDfpAds(){var e,t,n,a=document.querySelector(« meta[property=’og:site_name’] »),o=document.querySelector(« article[data-content-channel] »),i=document.querySelectorAll(AD_NAME_SELECTOR);a&&(e=a.content),o&&(t=o.getAttribute(« data-content-channel »).toLowerCase()),t&& »New York Magazine »===e&&(n=getNYMagAdChannel(t)),n&&appendToAdd(i,n)}function appendPageTypeToDfpAds(){let e=document.querySelector(« .body > div »)||{},t=document.querySelector(« body »)||{},n=e&&e.classList,a=n&&n.length?[…n]:[],o=_find(a,e=>e.includes(« feature »)),i=document.querySelectorAll(AD_NAME_SELECTOR);n&&(o?appendPageNumberPositionToDfpAds(i, »Feature »):n.contains(« lede-gallery-content »)?appendPageNumberPositionToDfpAds(i, »Image_Gallery »):t.classList.contains(« one-column-layout »)?appendPageNumberPositionToDfpAds(i, »One_Column_Article »):n.contains(« article-content »)&&appendPageNumberPositionToDfpAds(i, »Standard_Article »))}function appendPageNumberPositionToDfpAds(e,t){const n=[« 528×379″, »1100×200″, »1×1 »];let a=e||[],o=dom.find(« .ad-splash »),i=dom.find(« section.wrapper »),r=dom.find(« .secondary »),d=dom.find(« .bottom »),s=dom.find(« .primary »),c={IA:{xsMobile:{normal:1,grid:1},mobile:{normal:1,grid:1},tablet:{normal:1,grid:1},desktop:{normal:1,grid:1}},BA:{xsMobile:{normal:1,grid:1},mobile:{normal:1,grid:1},tablet:{normal:1,grid:1},desktop:{normal:1,grid:1}}};a.forEach(e=>{let a,l= » »,u=e.dataset.sizes,m=e.classList.value,p=_find(n,e=>u.includes(e)),g=e.parentElement.classList.contains(« image-gallery-mobile-grid-ad »);if(u&&!p||e.setAttribute(« data-name »,e.getAttribute(« data-name ») « / » t),i&&u&&!p){let n,u;if(o&&o.contains(e)?l= »LB »:i&&i.contains(e)?l= »IA »:(r&&r.contains(e)||d&&d.contains(e)||s&&s.contains(e))&&(l= »BA »),c[l]){if(!(u=checkForAdViewport(m)))return;g?(n=c[l][u].grid,c[l][u].grid ):(n=c[l][u].normal,c[l][u].normal ),a=n{e.setAttribute(« data-name »,e.getAttribute(« data-name ») « / » t)})}function injectGoogleScripts(){var e=document.createElement(« script »),t=document.createElement(« script »),n=document.createDocumentFragment();e.src= »//www.googletagservices.com/tag/js/gpt.js »,e.async= »async »,t.src= »//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js »,t.async= »async »,n.appendChild(e),n.appendChild(t),document.getElementsByTagName(« body »)[0].appendChild(n)}appendSectionToDfpAds(),appendPageTypeToDfpAds(),injectGoogleScripts(),DS.controller(« ad »,[« adService »,function(e){return function(t){var n,a,o,i=t.getAttribute(« data-offload »),r=new $visibility.Visible(t,{preloadThreshold:i?window.innerHeight/4:200}),d=!1;function s(){window.innerWidth>=1180&&t.parentElement.classList.contains(« ad-repeat »)&&flaggedComponentsOnPage.length&&(a=getElementsOverlapAmount(t,flaggedComponentsOnPage),o=parseInt(t.parentElement.getAttribute(« data-gap »),10),t.style.marginTop=o 30 a « px »)}function c(){s(),e.refresh(n)}function l(){e.remove(n),d||(d=!0,r.on(« shown »,c))}document.querySelector(‘script[data-name= »concert-ads »]’)||(n=e.create(t),r.preload&&$visibility.isElementNotHidden(t)?(e.addToPageLoadQueue(n),i&&r.on(« hidden »,l)):(r.on(« preload »,function(){!n.slot&&$visibility.isElementNotHidden(t)&&(s(),e.load(n))}),i&&r.on(« hidden »,l)),this.adData=n)}}]);
}, {« 4″:4, »5″:5, »53″:53, »55″:55, »56″:56, »57 »:57}];
window.modules[« sticky-list.client »] = [function(require,module,exports){« use strict »;const dom=require(4),$gtm=require(3),_get=require(9),stickyContainer=require(« sticky-container.client »);DS.controller(« sticky-list »,[« $window »,function(t){var e=require(230),i=40;function s(s){let n,r=function(t){let s=t[0],n=0,r=e.height(this.contentArea),h=this.contentArea.offsetHeight;if(this.containers&&this.containers.length){if(s.target.offsetHeight){let t=this.breakouts.findIndex(t=>(function(t,e){return t!==document.body&&t.contains(e)})(t,s.target.parentElement));if(t>-1&&this.breakouts[t]){let e=this.breakouts[t].offsetHeight i;this.containers[t].style.marginBottom=`${e}px`}}if(h!==this.currentHeigh){const t=e.rect(this.rightRail,this.contentArea);this.currentHeight=h,this.rightRail.style.height=r-t.top-a(this.rightRail) « px »,this.breakouts.forEach((s,r)=>{let a=e.rect(s,this.contentArea),h=e.intersection(a,t);if(h){let e,s=h.top-t.top-n;n =s h.height i,this.containers[r].style.height=`${s}px`,this.containers[r].style.minHeight=`${s}px`,e=this.breakouts[r].offsetHeight i,this.containers[r].style.marginBottom=`${e}px`}})}}}.bind(this);t.innerWidth{let n=_get(e, »dataset.name », » »),r=n.slice(-1)|| »1″,a=[« Image_Gallery », »Standard_Article », »Feature », »One_Column_Article »].find(t=>n.includes(t))|| » »;this.rightRail.parentElement.classList.contains(« tertiary »)&&a&&(e.dataset.name=parseInt(i,10) se===t)||0;return i.slice(s 1).reduce((t,e)=>t (e.offsetHeight||0),0)||0}return s.prototype={setPins:function(){const t=e.rect(this.rightRail,this.contentArea),i=e.height(this.contentArea),s=i-t.top-a(this.rightRail);let n,h,o,l;if(this.populatePinsList(),s1&&t.classList.add(« multi-children »),l=0;l{const t=Array.from(e.children);let o,a,i=0;for(;i{handleLazyLoad(a)});
}, {« 4″:4, »108 »:108}];
window.modules[« article.client »] = [function(require,module,exports){« use strict »;const $visibility=require(5),$gtm=require(3),ImageZoom=require(69),$sentry=require(70);DS.controller(« article »,[function(){var e=40;function t(t){const i=document.querySelector(« .wrapper > .tertiary »),n=t.querySelector(« .lede-image-wrapper.full-bleed »),r=t.querySelector(« .attribution.full-bleed »),o=t.querySelector(« .article-header »),l=o?o.querySelector(« img »):null,c=function(){let t=o.getBoundingClientRect().height;n&&(t=n.getBoundingClientRect().height 25,r&&(t =r.getBoundingClientRect().height)),i.style.paddingTop=t e « px »};i&&o&&(window.innerWidtht(e)),$sentry.initializeIDListeners()}}]);
}, {« 3″:3, »5″:5, »69″:69, »70 »:70}];
window.modules[« tags.client »] = [function(require,module,exports){« use strict »;const _forEach=require(53);DS.controller(« tags »,[function(){function e(e){this.el=e}return e.prototype={events:{« a.more click »: »showAll »},showAll:function(e){var t=e.target,o=this.el.querySelectorAll(« li.hidden »);_forEach(o,function(e){e.classList.remove(« hidden »)}),t.parentNode.removeChild(t),e.preventDefault()}},e}]);
}, {« 53 »:53}];
window.modules[« newsletter-flex-text.client »] = [function(require,module,exports){« use strict »;const dom=require(4),_kebabCase=require(93),_isEmpty=require(100),_set=require(120),permutive=require(66),cmptName= »newsletter-flex-text »,{loadRecaptcha:loadRecaptcha}=require(119),gtm=require(3),EMAIL_VALID_REGEX=/^(?:(?:[^()[]\.,;:[email protected] »] (?:.[^()[]\.,;:[email protected] »] )*)|(« . « ))@(?:(?:[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(?:(?:[a-zA-Z-0-9] .) [a-zA-Z]{2,}))$/,MAX_EMAIL_LENGTH=50;DS.controller(cmptName,[« $window »,function(e){function t(t){this.el=t,this.email=dom.find(t, ».email »),this.title=dom.find(t, ».title »),this.description=dom.find(t, ».description »),this.source=dom.find(t, ».source »),this.form=dom.find(t, ».form »),this.returnMsg=dom.find(t, ».return-message »),this.newsletterId=dom.find(t, ».newsletterId »).value,this.expandedTerms=dom.find(t, ».expanded-terms »),this.recaptchaKey=this.form.dataset.recaptchaPublicKey,this.local=e.localStorage,this.session=e.sessionStorage,this.apiEndpoint=this.form.dataset.post,this.displayComponent()}return t.prototype={getPageType:function(){var e=dom.find(‘meta[name= »type »]’),t=e?e.getAttribute(« content »): » »;return _kebabCase(t)},getPayloadObject:function(e){var t={};return t.email=this.email.value,t.recaptcha=e,_set(t,`vars.source_${this.newsletterId}`,`${cmptName}_${this.getPageType()}`),t.lists={},t.lists[this.newsletterId]=!0,t},displayComponent:function(){var t=this,s= »success »===this.local[« signUpColumnStatus » this.newsletterId.toString()],i= »true »===this.form.getAttribute(« data-display-after-sign-up »);if(!s||i){if(this.el.classList.remove(« initially-hidden »),this.form.classList.remove(« initially-hidden »),setTimeout(function(){t.el.classList.remove(« opacity-zero »)},100),this.session)try{this.session.setItem(« signUpColumn », »displayed »)}catch(e){}}else t.el.parentElement.classList.add(« newsletter-collapsed »);e.addEventListener(« unload »,function(){t.session.removeItem(« signUpColumn »)})},events:{« .form submit »: »submitForm », ».email keypress »: »clearMsg », ».terms-button click »: »showTerms »},clearMsg:function(){this.returnMsg.innerHTML= » »},showTerms:function(){this.expandedTerms.classList.add(« active »),this.expandedTerms.setAttribute(« aria-hidden », »false »)},submitForm:function(e){let t=this.form.getAttribute(« data-error-msg »);e.preventDefault(),this.email.value.length>=50||!EMAIL_VALID_REGEX.test(this.email.value)?(t&& » »!==t||(t= »*Please enter a valid email »),this.returnMsg.innerHTML=t,this.returnMsg.focus()):loadRecaptcha(this.recaptchaKey, »newsletterSubmit »,!0).then(e=>fetch(this.apiEndpoint,{method: »POST »,headers:{« Content-Type »: »application/json »},body:JSON.stringify(this.getPayloadObject(e))}).then(e=>e.json()).then(e=>{e&&e.ok?this.successHandle(e):this.errorHandle()}).catch(e=>this.errorHandle(e)))},reportGTM:function(e){const t=_isEmpty(e.sailthruIds)? » »:Object.values(e.sailthruIds)[0];let s={event: »eec.purchase »};s.ecommerce={purchase:{actionField:{id:t,revenue: »0.00″},products:[{category: »newsletter signup »,quantity:1,name:this.newsletterId.toString(),variant:`${cmptName} – ${this.getPageType()}`}]}},gtm.reportNow(s)},errorHandle:function(e){this.returnMsg.classList.add(« error »),this.returnMsg.innerHTML=e|| »An error occurred. Please try again. »,this.returnMsg.focus()},successHandle:function(e){let t=this,s=this.form.getAttribute(« data-success-title-msg »),i=this.form.getAttribute(« data-success-description-msg »);if(s&& » »!==s||(s= »Thanks, you’re all set! »),i&& » »!==i||(i= »You’ll receive the next newsletter in your inbox. »),window.fbq&&window.fbq(« track », »Lead »),permutive.reportNewsletterSubscribe([this.newsletterId]),this.reportGTM(e),this.title.innerHTML=s,this.description.innerHTML=i,this.returnMsg.focus(),this.el.classList.add(« success »),setTimeout(function(){t.el.classList.add(« opacity-zero »),setTimeout(function(){t.el.classList.add(« initially-hidden »),t.el.parentElement.classList.add(« newsletter-collapsed »)},1e3)},5e3),this.local)try{this.local.setItem(« signUpColumnStatus » this.newsletterId.toString(), »success »)}catch(e){}}},t}]);
}, {« 3″:3, »4″:4, »66″:66, »93″:93, »100″:100, »119″:119, »120 »:120}];
window.modules[« memo-pixel.client »] = [function(require,module,exports){« use strict »;(()=>{var e=document.createElement(« script »);e.async=!0,e.type= »text/javascript »,e.src=document.location.protocol « //d16xpr36wrmcmk.cloudfront.net/js/memo.js »,(document.getElementsByTagName(« head »)[0]||document.getElementsByTagName(« body »)[0]).appendChild(e)})(),module.exports=(()=>{});
}, {}];
window.modules[« affiliate-links.client »] = [function(require,module,exports){« use strict »;const dom=require(4),_includes=require(57),_startsWith=require(61),globalClick=require(60),visit=require(59),productSubtags=require(62);var excludedHostnames,skimlinksBaseUrl,skimlinksId,visitState,productUrl,ignoreDataAttribute= »data-affiliate-links-ignore »,article=window.document.querySelector(« article »),isSponsored=article&& »Sponsor Story »===article.getAttribute(« data-type »);function setExcludedHostnames(t){excludedHostnames=(t.getAttribute(« data-excluded-hostnames »)|| » »).toLowerCase().split(« , »)}function isSkimLink(t){return!!(skimlinksId=t.getAttribute(« data-skimlinks »))}function isExcluded(t){return _includes(excludedHostnames,t)||_startsWith(t, »www. »)&&_includes(excludedHostnames,t.slice(4))||isSponsored}function isUrlProtocol(t){return 0!==t.indexOf(« mailto: »)&&0!==t.indexOf(« javascript: »)}function getTargetHostname(t){return(t.hostname||t.host||t.href|| » »).toLowerCase()}function convertSkimlinkUrl(t){return(skimlinksBaseUrl=skimlinksBaseUrl||skimlinksId? »//go.redirectingat.com/?xs=1&id= » skimlinksId « &sref= » encodeURIComponent(window.location.href) « &url= »:void 0)&&skimlinksBaseUrl encodeURIComponent(t)}function hasIgnoreAttribute(t){return »true »===t.getAttribute(ignoreDataAttribute)}function convertSkimlink(t){var e,i,r,s=dom.closest(t.target, »a »),n=s&&s.href;n&&n.length&&!t.defaultPrevented&&(i=getTargetHostname(s),!isUrlProtocol(n)||isExcluded(i)||hasIgnoreAttribute(s)||productSubtags.getAffiliate(n)||(e=convertSkimlinkUrl(n))&&(productUrl=n,r=s&&s.getAttribute(« data-track-id »),s.href=productSubtags.ensureSubtag({url:e,productId:r,visitState:visitState,anchorEl:s})))}function revertSkimLink(t){var e=dom.closest(t.target, »a »),i=e&&e.href|| » »;i.includes(skimlinksBaseUrl)&&i&&i.length&&productUrl&&(e.href=productUrl)}module.exports=(t=>{const e=isSkimLink(t);visit.onceReady(function(t){visitState=t}),e&&(setExcludedHostnames(t),globalClick.addHandler(convertSkimlink,revertSkimLink))});
}, {« 4″:4, »57″:57, »59″:59, »60″:60, »61″:61, »62 »:62}];
window.modules[« gtm.client »] = [function(require,module,exports){« use strict »;const $gtm=require(3);DS.controller(« gtm »,[function(){return function(t){$gtm.init(t.getAttribute(« data-container-id »),t.getAttribute(« data-site-slug »))}}]);
}, {« 3 »:3}];
window.modules[« banner-callout.client »] = [function(require,module,exports){« use strict »;const visit=require(59),_get=require(9);module.exports=(t=>{let e;const s=t.querySelector(« .banner-trigger »),i=window.localStorage,a=`banner-callout-${_get(window.kiln, »preloadSite.slug », »nymag »)}`;visit.onceReady(function(){!function(){try{e=JSON.parse(i.getItem(a))||{}}catch(t){e={}}}(),e.dismissed||t.classList.add(« show »)}),t.addEventListener(« click »,n=>{(n.target.matches(« a »)||n.target.matches(« span.banner-link »)||n.target.matches(« .banner-trigger »))&&(e.dismissed=Date.now().toString(),function(){try{i.setItem(a,JSON.stringify(e))}catch(t){}}(),function(){t.classList.contains(« show »)?s.setAttribute(« aria-expanded », »false »):s.setAttribute(« aria-expanded », »true »);t.classList.remove(« show »)}())})});
}, {« 9″:9, »59 »:59}];
window.modules[« global-nav.client »] = [function(require,module,exports){« use strict »;const dom=require(4),auth0=require(7),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(3),pageUri=require(148).getPageUri();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 init(e){auth0.on(« init »,()=>{signInButton.addEventListener(« click »,function(e){e.preventDefault(),auth0.showLogin()}),signOutButton.addEventListener(« click »,function(e){e.preventDefault(),auth0.logout(),gtmSendReport(« Sign Out »,e.target, »user-info-link »)}),auth0.isAuthenticated()&&e.classList.add(« signed-in »),auth0.isSubscriber()&&e.classList.add(« subscribed »),e.querySelectorAll(« .user-link »).forEach(e=>{e.classList.add(« active »)})}),auth0.on(« login »,()=>{e.classList.add(« signed-in »),auth0.isSubscriber()&&e.classList.add(« subscribed »)}),auth0.on(« logout »,()=>{e.classList.remove(« signed-in »),e.classList.remove(« subscribed »)})}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 »)&&gtmSendReport(n.text,n, »global-nav-link »)}),module.exports=init;
}, {« 3″:3, »4″:4, »7″:7, »148 »:148}];
window.modules[« aaa-module-mounting.legacy »] = [function(require,module,exports){« use strict »;const eventify=require(176),_pickBy=require(151),_each=require(312),fingerprintjs2=require(311),DS=require(310);function registerGlobals(){window.DS=DS,window.Eventify=eventify,window.Fingerprint2=fingerprintjs2,DS.value(« Eventify »,eventify),DS.value(« Fingerprint2 »,fingerprintjs2),DS.value(« $document »,window.document),DS.value(« $window »,window)}function mountDollarSliceComponents(){DS.service(« components »,[« $document », »$module »,function(e,n){var r=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),o=Object.keys(r);function t(e){return r=>{try{n.get(e,r)}catch(e){logMountError(r,e)}}}_each(o,n=>{var r=e.querySelectorAll(‘[data-uri*= »/_components/’ n ‘/ »]’),o=e.querySelectorAll(‘[data-uri$= »/_components/’ n ‘ »]’);_each(r,t(n)),_each(o,t(n))}),this.components=o}]),DS.get(« components »)}function logMountError(e,n){const r=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error(« Error attaching controller to  » r,n)}registerGlobals(),document.addEventListener(« DOMContentLoaded »,()=>{mountDollarSliceComponents()});
}, {« 151″:151, »176″:176, »310″:310, »311″:311, »312 »:312}];
window.modules[« ads.legacy »] = [function(require,module,exports){« use strict »;const _map=require(63),_forEach=require(53),_isString=require(195),_intersectionWith=require(313),_isEqual=require(201),_each=require(312),_debounce=require(111),_sortBy=require(134),page=require(148),visit=require(59);DS.service(« adService »,[« Eventify », »$cid », »$document », »$window »,function(e,t,a,i){var o,n,s,r,d,c,l,u,g,p,m={},h=this,f=[],b=visit.getQueryParamsObject([« utm_campaign »]),w=document.querySelector(‘script[data-type= »ad-a9″]’);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||[],c=i.googletag,w&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()}),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)),u=document.createElement(« script »),g=document.createDocumentFragment(),p=document.getElementsByTagName(« head »)[0],u.src= »https://z.moatads.com/voxprebidheader841653991752/moatheader.js »,g.appendChild(u),p.insertBefore(g,p.firstChild),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?c.defineSlot(o.name,o.sizes,o.id).addService(c.pubads()):c.defineOutOfPageSlot(o.name,o.id).addService(c.pubads())).setTargeting(« adid »,o.id),b.hasOwnProperty(« utm_campaign »)&&t.setTargeting(« utmcamp »,b.utm_campaign),a=h.getAdCount(o.label),t.setTargeting(« label »,o.label « _ » o.site « – » a),c.display(o.id),c.pubads().addEventListener(« slotOnload »,function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),(n=v(o))?window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){c.cmd.push(function(){window.apstag.setDisplayBids(),c.pubads().refresh([t],{changeCorrelator:!1})})}):c.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},m[n]=this},r=function(e){c.cmd.push(function(){var t=o(e);m[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=v(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){c.cmd.push(function(){window.apstag.setDisplayBids(),c.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},c.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)})}),c.pubads().setTargeting(« kw »,o),c.pubads().setTargeting(« entry_group »,o),r=r.slice(r.lastIndexOf(« / ») 1),c.pubads().setTargeting(« pn »,r),c.companionAds().setRefreshUnfilledSlots(!0),c.pubads().enableAsyncRendering(),c.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(m);return _each(i,function(i){(t=m[i]).data.loaded&&t.data.label===e&&a }),a},this.getById=function(e){return m[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99, »homepageTakeover/TopLeaderboard »:1},t=_sortBy(f,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),f=[]},10),this.addToPageLoadQueue=function(e){f.push(e),d()});function v(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}}]);
}, {« 53″:53, »59″:59, »63″:63, »111″:111, »134″:134, »148″:148, »195″:195, »201″:201, »312″:312, »313 »:313}];
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[« 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) {
To attempt {
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 ();
//]]

Ref: https://www.vulture.com

Donnez votre avis et abonnez-vous pour plus d’infos

[gs-fb-comments]

Vidéo du jour: