CM – Here is the full list of your 2021 ACM Award winners

0
28

The awards season continues briskly tonight. Keith Urban and Mickey Guyton co-host the 2021 Academy of Country Music Awards. The ACM celebrated success in the country music industry, naming winners in 30 categories this year. As with their 2020 show, the 56th annual ceremony will include live performances from three iconic Nashville venues: Grand Ole Opry House, Ryman Auditorium, and The Bluebird Café.

Artists Maren Morris and Chris Stapleton featured nominations six nods to each, among other things for her work as a songwriter. Miranda Lambert follows with five nominations this year, followed by a total of 68 lifelong nods (the academy record for an artist). John Legend and Gwen Stefani are available for awards for the first time, while Morgan Wallen (who was previously expected to be a major competitor) was deemed ineligible by the ACM after saying the N word on video.

Some Awards, including the radio categories and awards for new male artists and new female artists, were announced ahead of the ceremony on Sunday. Jimmie Allen became the first black artist to ever win a new artist award and take home the new male artist of the year, and Kane Brown was the first black solo artist to win Video of the Year for Worldwide Beautiful. Both wins come after the ACM has (really) nominated four black musicians, including Mickey Guyton (New Artist of the Year) and John Legend (Video of the Year); Brown is also ready for Mixtape Vol. 2 album of the year. 1. Check out the full list of 2021 ACM Award winners below.

Single of the Year Miranda Lambert, « Bluebird » Gabby Barrett, « I Hope » Carly Pearce & Lee Brice, « I Hope You Are Happy Now « Ingrid Andress, » More Hearts Than Mine « Maren Morris, » The Bones « 

Song of the YearMiranda Lambert, » Bluebird « Ashley McBryde, » One Night Standards, « Old Dominion, » Some People Do, « Chris Stapleton, » New « Maren Morris, » The Bones « 

Video of the Year » Better Than We Found It « , Maren Morris » Bluebird « , Miranda Lambert » Gone « , Dierks Bentley » Hallelujah « , Carrie Underwood and John Legend » Worldwide Beautiful « , Kane Brown

Music Event of the Year » Be A Light « , Thomas Rhett with Reba McEntire, Hillary Scott, Chris Tomlin and Keith Urban » Does To Me « , Luke Combs feat. Eric Church « I Hope You Are Happy Now », Carly Pearce & Lee Brice « Nobody But You », Blake Shelton Ft. Gwen Stefani « A Beer », HARDY Ft. Lauren Alaina & Devin Dawson « One To Many », Keith Urban , P! Nk

National On Air Personality of the Year Big D, Bubba, Patrick Thomas, Carsen, The Big D and Bubba show Cody Alan, CMT after MidNite Kix Brooks, Countdown for the American Country with Kix BrooksLorianne Crook and Charlie Chase , The Crook & Chase Countdown Paul Koffy, Jasmin Sadry, Josh Jensen, Morgen Koffy

On-Air Personality of the Year – Major MarketBroadway, WDRQ-FM – Detroit, MIChris Carr & Company – Chris Carr, Kia Becht, McKaila Poppen, KEEY-FM – Minneapolis, MN Double-L – Lois Lewis, KNIX-FM – Phoenix, AZTanner in the Morning – Rob Tanner, Catherine Lane, Chris Allen, Captain Jim, WSOC-FM – Charlotte, NC The Morning Bull – George, Mon, Cowboy Dave – KILT-FM – Houston, TX

On Air Personality of the Year – Big Market Dave & Deb – Dave Gunderson, Deb Turpin, KSOP-FM – Salt Lake City, UT Lexi & Banks – Lexi Papadopoulos, Jared Banks – KUBL-FM – Salt Lake City, UTMad Dawg, WQDR-FM – Raleigh, Sergeant & Ashley – Obie Diaz, Ashley Morrison, WWKA-FM – Orlando, FL The Wake Up Call – Kelli Green, David Bugenske. KFRG-FM – Riverside / San Bernardino, CA.

On-Air Personality of the Year – Mid MarketBuzz Jackson – KIIM-FM – Tucson, AZ Geoff Emery, KUZZ AM / FM – Bakersfield, CAMo & Styckman, WUSY-FM – Chattanooga, TNScott & Sarah in the morning, Scott Wynn, Sarah Kay – WQMX-FM – Akron, OHSteve Lundy and Gina Melton, KXKT-FM – Omaha, NE

On-Air Personality of the Year – Little MarketBarrett, Fox & Berry – Bill Barrett, Tim Fox, Tracy Berry, KKNU-FM – Eugene, ORDr. Shane and Tess in the morning – « Dr. » Shane Collins, Tess Connell, WPAP-FM – Panama City, FLErin and Matt in the Morning – Erin Hart, Matt Sharp, KATI-FM – Jefferson City, MOSteve, Ben and Nikki – Steve Stroud, Ben Walker and Nikki Thomas – WXBQ-FM – Bristol, VAThe Philip Gibbons Show – Philip Gibbons, WGSQ-FM – Cookeville, TN

Radio Station of the Year – Main Market KKBQ-FM, Houston, TXKNIX-FM, Phoenix, AZKSON-FM, San Diego, CAWKLB-FM, Boston, MAWXTU-FM, Philadelphia, PA

Radio Station of the Year – Big Market KSOP-FM, Salt Lake City, UTKNCI-FM, Sacramento, CAWDSY-FM, Pittsburgh, PAWSIX-FM, Nashville, TNWQDR-FM, Raleigh , NC

Radio Station of the Year – Middle MarketKSKS-FM, Fresno, CAKUZZ-AM / FM, Bakersfield, CAKXKT-FM, Omaha, NEWHKO-FM, Dayton, OHWIVK-FM, Knoxville, TN

Radio Station des Year – Small MarketKATI-FM, Jefferson City, MOKCLR-FM, Colombia, MOKKNU-FM, Eugene, OHWCOW-FM, Sparta, WIWXBQ-FM, Bristol, VA

Album of the year Luke Bryan, born here Live Here Die HereKane Brown, Mixtape Vol. 1A, Ashley McBryde , Never WillBrothers Osborne, SkeletonsChris Stapleton, start over

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 [« 1168 »] = [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 (e) {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 [« 1198 »] = [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};
}, {« 1200 »: 1200}];
window.modules [« 1202 »] = [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 [« 1223 »] = [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 [« 1319 »] = [function (required, module, export) {« use strict »; const universalAgora = required (1321), universalRest = required (9), universalQuery = required (1320), _ get = required (23); 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, 23: 23, 1320: 1320, 1321: 1321}];
window.modules [« 1320 »] = [function (required, module, export) {« use strict »; const _map = required (50), _ get = required (23), _ isArray = required (150), _ set = required (108), _ isObject = require (87), _ cloneDeep = require (69), _ uniq = require (92); 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) ) triggers 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)}} function 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} Function formatAggregationResults ({aggregationName : e = «  », field: o = «  », subfield: t = «  », skipEmpty: r =! 0}) {return function (s = {}) {let i = _get (s, `aggregations. $ {E } $ {t? « . » T « . »: « . »} Buckets`, []); return r&& (i = i.filter (e => 0! == _ get (e, « doc_count », 0))), i.map (e => e [o] || «  »)}} function addGeo (e, o) {if (! _ isArray (o)) throws a new error (« The second argument must be an array »); if (2! == o.length) throw new Error (« Array must be length 2 »); if (o.some (isNaN)) throw new Error (« Array may only contain numbers »); return _set (e, « body.query.geo_shape.location.shape.type », « point »), _ set (e, « body.query.geo_shape.location.shape.coordinates », o), e} function 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} Function addNestedObjQuery (e, o, t) {if (! e) solves a new one Error from (« There is no basic query to perform the addNestedObjQuery ion operation »); if (! o) throws a new error (« There is no nested object path to run the nested query »); if (! t) throws a new error (« There is no nested query path to run the nested query against »); return _set (e, « nested », {path: o, query: t}), e} function addMatchAll (e) {return _set (e, « body.query », {match_all: {}}), 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 = onlyWithThisFields,. moduleSiteSiteWithin only, .onlyWithin exports.onlyWithinThisDomain = onlyWithThisDomain, module.exports.withinThisSiteAndCrossposts = withinTheSiteAndCrossposts, module.exports.withinThisDomainOrCrossposts = TheThisDomain.OrCrossposts ts.formatAggregationResults = formatLesports.AggregationResults = module.AggregationResults = eLikeThis, module.exports.combineFunctionScoreQueries = combinFunctionScoreQueries, module.exports.addNestedObjQuery =
}, {23: 23, 50: 50, 69: 69, 87: 87, 92: 92, 108: 108, 150: 150}];
window.modules [« 1321 »] = [function (required, module, export) {(function (process, __ file name) {(function () {
« use strict »; const _forEach = require (40), _ get = require (23), _ filter = require (134), _ map = require (50), _ isEmpty = require (88), urlParse = require (51), log = require (22) .setup ({file: __ filename}), queryService = require (1320), universalRest = require (9), AGORA_HOST = window.process.env.AGORA_HOST, AGORA_ELASTIC_PREFIX = window.process.env.AGORA_ELASTIC_PREFDP_ AGORA_HOST? `$ {AGORA_HOST} / api / v1`: null, requestHeader = { » Content Type « : » application / json « }, PRODUCTS_INDEX = » Agora Products « , AFFILIATES_INDEX = » Partners « , RETAILERS_INDEX = » Retailers « , FILTER_KEY = { Dealer: « Name », Partner: « Partner »}, URL_RE = / ^ https?: / /.*$/; Function getProducts (e, t) {const {limit: r = 100, start: a = 0, search: s = «  », sortDate: c = « desc »} = e, n = `$ {AGORA_ENDPOINT} / products? limit = $ {r} &start = $ {a} &search = $ {encodeURIComponent (s)} &sortDate = $ {c} `; return fetch (n) .then (handleResponse) .then (e => t? filterByLocale (e, t): e) .then (e => ({total: e. length, products: e})). catch (handleError (n))} function getProduct (e, t) {const r = `$ {AGORA_ENDPOIN T} / products / $ {e}`; if (! AGORA_ENDPOINT) triggers a new error (« No Agora endpoint was specified »); if (« string »! = Typeof e) triggers a new error (« Request must deliver a product id »); return fetch (r) .then (handleResponse) .then (e => t? filterByLocale (e, t): e) .catch (handleError (r))} function postProduct (e) {const t = `$ {AGORA_ENDPOINT} / products`, r = {method: « POST », header: requestHeader, body: JSON.stringify (e)}; Return value (t, r) .then (handleResponse) .catch (handleError (t))} Function putProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {Method: « PUT », header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function patchProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {method : « PATCH », header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function deleteProduct (e) {const t = `$ {AGORA_ENDPOINT} / products / $ {e}`; return fetch (t, {method: « DELETE », header: requestHeader}). Then (handleResponse) .catch (handleError (t))} Function g etMerchantList (e) {const {limit: t = 100, fields: r = «  »} = e; return Promise.resolve ([{name: « Amazon »}]). catch (handleError («  »))} function getMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`; if (« string »! = typeof e) throws a new error (« Request must specify a product ID »); return fetch (t) .then (handleResponse) .catch (handleError (t))} function patchMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`, a = {method:  » PATCH « , header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function postMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants`, r = {method: » POST « , header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} function putMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`, a = {method : « PUT », header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function deleteMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`; return fetch (t, {method: « DELETE », header s: requestHeader}). then (handleResponse) .catch (handleError (t))} function postLocale (e) {const t = `$ {AGORA_ENDPOINT} / locales /`, r = {method: « POST », header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} Function patchLocale (e, t) {const r = `$ {AGORA_ENDPOINT} / locales / $ {e}`, a = {method : « PATCH », headers: 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 »); throw a new error (e)} return t})} catch ( e) {throw a new error (e.message)}} function handleError (e) {return t => {throw log (« warn », `Incorrect request to $ {e}`, t), new error (`request an $ {e} failed`)}} function buildProductsQuery ({search: e = «  », limit: t = 100, start: r = 0, sortDate: a = «  », filter: s, locale: c}) { const n = queryService (PRODUCTS_INDEX), o = s&&Object.keys (s) .length? Object.keys (s) .filter (e => Array.isArray (s) [e]) &&s [e] .length): [], i = {}, u = {}; if (prependElasticPrefix (n), e || o.length || c || queryService.addMatchAll (n), c&& (queryService.addMust (i, {match: {« locales.locale »: c}}), queryService. addMust (u, {match: {« Merchants.locale »: c}})), e) if (isURL (e)) queryService.addMust (n, [queryService.addNestedObjQuery ({}, « Merchants », {match: {« Händler.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 (i, _get (t, « body.query »))} if (o.length) {const e = {}; o.forEach (t => {const r = s [t], a = FILTER_KEY [t], c = {}; a&& (c [`Dealer. $ {a}`] = r, queryService.addShould (e, {Terms: c}))}), queryService.addMinimumShould (e, 1), queryService.addMust (u, _get (e, « body.query »))} return _isEmpty (i) || queryService.addMust (n, [queryService.addNestedObjQuery ({}, « locales », _ get (i, « body.query »))]), _ isEmpty (u) || queryService.addMust (n, [queryService.addNestedObjQuery ({}, « Dealer », _ get (u, « body.query »))]), queryServ ice.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} function prependElasticPrefix (e) {return e.index = AGORA_ELASTIC_PREFIX? `$ {AGORA_ELASTIC_PREFIX} _ $ {e}`: e.index, e} Function buildMerchantsAggregation (e = 1e6, t) {const r = queryService (PRODUCTS_INDEX); return prependElasticPrefix (r), queryService.addMust (r, {match: {active:! 0}}), t&&queryService.addMust (r, queryService.addNestedObjQuery ({}, « Dealer », _ get (queryService.addMust ({}) , {match: {« Merchants.locale »: t}}), « body.query »))), queryService.addAggregation (r, {dealer: {nested: {path: « dealer »}, aggs: {name: {Terms: {field: « Händler.name », size: e}}}}), queryService. addSize (r, 0), r} function isURL (e) {URL_RE.test (e) return} function filterByLocale (e, t, r = {locales: « US »}) {const a = Array.isArray (e) ; if (_isEmpty (e)) returns a? []: {}; const s = [« locales », « dealers »], c = a? e: [e], n = Object.keys (r), o = _map (c, e => {const a = Object.assign ({}, e); return _forEach (s, s => {if (Object .keys (a) .includes (s)) {const c = t? _filter (e [s], [« locale », t]): e [s]; a [s] = c,! c.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&&o.length? o: _get (o, « [0] », {})} function 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)} function buildMerchantsByUrlQuery (e) {const t = queryService (PRODUCTS_INDEX); Returns prependElasticPrefix (t), queryService.addNestedObjQuery (t.body.query), « Händler », {match: {« Händler.buyUrl »: e}}), t} function getAffiliatesByLocale (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 getRetailersByAffiliateId (e, t ) {const r = queryService (RETAILERS_INDEX); return e? (prependElasticPrefix (r), queryService.addMust (r, [queryService.addNestedObjQuery ({}, « AffiliateRetailers », {match: {« AffiliateRetailers.affiliateId »: e}} )),) queryService.addSize (r, 1e3), queryService.addSort (r, {name: « asc »}), searchByQueryWithRawResults (r, t) .then (e => _ get (e, « Hits.hits » , []). map (e => _ get (e, « _ source », {})))): Promise.reject ()} function getMerchantsList (e) {return searchByQueryWithRawResults (buildMerchantsAggregation (1e6, _get (e, « site.agoraLocale »)), e) .then (queryService.formatAggregationResults ({aggregation name: « dealer », field: « key », subfield: « name »}))} function queryRetai lersByUrl (e, t) {const r = urlParse (e) .host. split (« www. »). join («  »), a = queryService (RETAILERS_INDEX); return queryService.addMust (a, {match: {Domains: r}}), prependElasticPrefix (a), queryService.addSize (a, 10), searchByQueryWithRawResults (a, t) .then (e => _ get (e,  » Hits.hits « , []). Map (e => _ get (e, » _ source « , {})))} require (208), module.exports = {buildProductsQuery: buildProductsQuery, buildMerchantsAggregation: buildMerchantsAggregation, getProducts: getProducts, getProduct: getProduct, postProduct: postProduct, putProduct:: deleteProduct, getMerchantList: getMerchantList, getMerchant: getMerchant, postMerchant: postMerchant, patchMerchant: patchMerchant, putMerchanty, is patchLMerchant, putMeryLocale: filterLocale, filterLocale: deleteBerchant: delete, is: putMerchant: deleteBerchantLocale: , postLocale: postLocale, buildMerchantsByUrlQuery: buildMerchantsByUrlQuery, getAffiliatesByLocale: getAffiliatesByLocale, searchByQueryWithRawResults: searchByQueryWithRawResults, getRetailersByRawResults, getRetailersByetailResults, getRetailers: ueryRetailersByUrl};

}). call (this)}). call (this, require (11), « / services / universal / agora.js »)}, {« 9 »: 9, « 11 »: 11, « 22 »: 22 23: 23, 40: 40, 50: 50, 51: 51, 88: 88, 134: 134, 208: 208, 1320: 1320}] ;;
window.modules [« 1322 »] = [function (required, module, export) {« use strict »; const _map = require (50), _ mapValues ​​= require (203), _ reduce = require (91), _ assign = require (138), _ get = require (23), _ pickBy = require (139), _ find = require (43), AffiliateFields = [« siteShortKey », « pageUri », « productId », « utmMedium », « utmSource », « sessionCount », « format », « utmCampaign », « referrer », « deviceAbbreviation » , « zone »], AffiliateSettings = {amazon: {Domains: [« amazon.com », « amazon.co.uk »], subtagKey: « ascsubtag » « , maxLength: 99, separator: » Standard « , coding:! 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, separator: » standard « , encode:! 1}, Skimlinks: {Domains: [ » go.redirectingat .com « ], subtagKey: » xcust « , maxLength: 50, Delimiter: » old « , encode:! 1}, effect: {Domains: [], subtagKey: « subId2 », maxLeng th: 99, separator: « Standard », coding:! 1}, Avantlink: {Domains: [« avantlink.com »], SubtagKey: « ctc », maxLength: 64, separator: « old », coding:! 1}, cj: {Domains: [« tkqlhce.com », « jdoqocy.com », « dpbolvw.net », « anrdoezrs.net », « kqzyfj.com »], subtagKey: « sid », maxLength: 64, Separator: « old », code:! 1, joinBy: « / », assignBy: « / », positioned:! 0, position: « after », positionKey: « type / dlg / »}, partnerize: {Domains: [« prf .hn »], subtagKey: « pubref », maxLength: 100, separator: « old », encode:! 1, joinBy: « / », assignBy: « : », positioned:! 0, position: « before », positionKey: « target »}, Pepperjam: {Domains: [« gopjn.com », « pntrac.com », « pjtra.com », « pjatr.com », « pntrs.com » , « pntra.com »], subtagKey: « sid », maxLength: 100, separator: « old », encode:! 1}, awin: {Domains: [« awin1.com »], subtagKey: « pref1 », maxLength: 100, separator: « old », 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 »}, separator 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 = limiter.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 (« & »). redu ((e, t) => {const i = t.split (« =) ») [0], a = t.split (« = ») [1] ; return void 0! == a&CSS EANDCHAR (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 = {}, local: s}) {const n = AffiliateFields, o = _get (AffiliateSettings [t], « subtagKey »), r = _get (AffiliateSettings [t], « maxLength »), l = _get (AffiliateSettings [t], « encode »), u = _get (AffiliateSettings [t], « separator »), 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 = delimiter [u]; let b, y, S = i. indexOf (« ? »)> = 0? i.split (« ? »). pop (): «  », h = parseQuery (S), _ = getSubtagData ({getters: e, fields: n, visitState: a, local: 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;
}, {23: 23, 43: 43, 50: 50, 91: 91, 138: 138, 139: 139, 203: 203}];
window.modules [« article-nav.client »] = [function (required, module, export) {« use strict »; const dom = required (4), _ throttle = required (37), $ visibility = required (5), $ popup = require (52), $ gtm = require (3), {reportSocial: reportSocial} = require (53) , auth0 = require (12); 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 (« . tone 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, « . shar e-link.facebook »), w = dom.find ( t, « . share-link.twitter »), v = dom.find (t, « . share-link.pinterest »), b = t.cla ssList. 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.transf orm = `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? 0, e = $ Visibility.getPageOffset (i) .top, r = Math.max (e, t ); Returns 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, socialNet work: o}), reportSocial (o), $ Visibility.getViewportWidth ()> = 768&&o&& (t.preventDefault (), $ popupDefault (), 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: // titter? text = « encodeURIComponent = « f »? utm_source = tw&utm_medium = s3&utm_campaign = sharebutton-t&via = « w.getAttribute ( » data-handle « )), vCSSEANDAR. com / pin / create / button /? url = » fCH « ? utSSm_mediumamp = » fCH « ? = sharebutton-t&description = « encodeURIComponent (h) » &media = « g), b) return; auth0.on ») => {auth0.isSubscriber () &&t.classList.add (« subscribed to »)}), window.addEvent Listener (« 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, 12: 12, 37: 37, 52: 52, 53: 53}];
window.modules [« nav-search-button.client »] = [function (required, module, export) {« use strict »; const dom = required (4), $ gtm = required (3), {reportSearch: reportSearch} = require (53), 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) {27 === e.keyCode&&s.classList.contains (openClass) &i (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, « 53 »: 53}];
window.modules [« nav-dropdown-button.client »] = [function (required, module, export) {« use strict »; const dom = required (4), visibility = required (5), {reportSearch: reportSearch} = require (53); function getNextSchildren (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 (« deactivated »), 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 (getNextSchildren (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.contains (« open » list « ). ) &&v ()})});
}, {« 4 »: 4, « 5 »: 5, « 53 »: 53}];
window.modules [« follow.client »] = [function (required, module, export) {« use strict »; const _find = require (43), $ popup = require (52); DS.controller (« follow », [function () {function e (e) {this.el = e, this.handle = e.getAttribute (« data handle »)} return e.prototype = {events: {click:  » openFollow « }, openFollow: Function (s) {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/ Genealogiehandle Genealogie « ,network: »Facebook » Genealogie {{className: »pinterest »,url: »http://www.pinterest.com/ regis-handle} « ,network : « Pinterest »}, {className: « instagram », URL: « https://www.instagram.com/ Zonenhandle} », network: « Instagram »}, {className: « rss », URL: « http: //feeds.feedburner. com / {handle} « , network: » RSS « }, {class name: » 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 « }], radio tion (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}]);
}, {« 43 »: 43, « 52 »: 52}];
window.modules [« comment-link.client »] = [function (required, module, export) {« use strict »; const dom = required (4), _ get = required (23), _ isFinite = required (110), ajax = require (109); 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 number »), 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}}’, data type: « 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. prototype.onCommentCountFetched = function (t, e) {if (t) ret urn console.warn (t); e> 0&& (this.isNavVariation&&e1? « s »: «  »), this.el.classList.remove (« no-classList.remove comments »))}, n.prototype.shouldRenderCommentStream = function () {return-1! == e.indexOf (« @ shared »)}, n}]);
}, {4: 4, 23: 23, 109: 109, 110: 110}];
window.modules [« head-gtm.client »] = [function (required, module, export) {« use strict »; const {getCLS: getCLS, getFID: getFID, getLCP: getLCP} = require (142), isProduction = require (10) (); 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: « analysisEvent », 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)});
}, {« 10 »: 10, « 142 »: 142}];
window.modules [« concert-ads.client »] = [function (required, module, export) {« use strict »; const customMappings = {« Crime-Assault »: « Power », « Career-Money-Productivity »: « Power », « Feminism-Politics-Identity »: « Power », « Culture-Media »: « Culture », Celebrity: « Culture », life: « style », fashion: « style », shopping: « style », weddings: « style », beauty: « style », animals: « self », « learning creativity »: « self »,  » Relationship-friends family « : » self « , » mental health personality social behavior « : » self « , » learning « creativity »: « self », « health-wellness »: « self », parenting: « self », « relationship -Sex dating marriage « : » self « }, striptags = require (54); function installConcertAds () {const e = new URLSearchParams (window.location.search) .get ( » konzert_config_url « ), t = e || window.concertConfigUrl; window._nymPermutive || console.warn (« ConcertAds will be initialized without Permutive »), window.concertAds = createConcertAds (), window.concertAds.loadRemoteConfig (t) .then (function () {window.concertAds.install ()})} function createConcertAds () {co nst 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.index ( «  ») && (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: « / » or replace (/ – | – / g, « -« ), registered: « not authenticated »! == 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? « with the title »: « unentitled »: « not authenticated »} function getPaywallStatus (e) {const t = getData (« totalCount ») || 0; return Boolean (t> = 3&& « with the title »! == e)} window.ConcertAds? installConcertAds (): window.addEventListener (« konzertAdsReady », in StallConcertAds);
}, {« 54 »: 54}];
window.modules [« latest-news.client »] = [function (required, module, export) {« use strict »; const dom = required (4), lazyLoad = required (96); 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, « 96 »: 96}];
window.modules [« coral-talk.client »] = [function (required, module, export) {« use strict »; const dom = required (4), store = required (116), visibility = required (5), auth0 = require (12), TALK_AUTH = « talk: auth_token »; let coralEmbed, hasEmbedScriptLoaded =! 1, hasCoralTalkRendered =! 1; function renderComments (e) {if (hasEmbedScriptLoaded&&! hasCoralTalkRendered {const) 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) {e) = 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 embeddedScript (e, t) {let i = document.createElement (« script »); i.type = « text / javascript », i.async =! 0, i.src = e, i.addEventListener (« load », () => {hasEmbedScriptLoaded =! 0, renderComments (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 check your account to enable commenting. You haven’t received a confirmation email? Send the email again 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 = « Confirmation email was sent successfully »: e.innerHTML = `$ {t.statusText}`}) . catch (e => console.log (e))} Function tryScriptEmbedding (e, t) {initVerificationMessage (), hasEmbedScriptLoaded? renderComments (t): embeddedScript (t .EMBED_URL, t)} function addVisibilityListener (e, t) {new Visibility.Visible (e, {PreloadThreshold: 750}). On (« Preload », () => tryScriptEmbedding (e, t))} function removeSignInButton (e) {e&&e.parentNode&&dom.removeElement (e)} function (e) {const init Talk -Host « ), i =` $ {t} / static / embedded.js`, n = `http: // $ {document.documentElement.getAttribute ( » data-uri « )}. html`, a = « true » === e.getAttribute (« data-care »), 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, « 12 »: 12, « 116 »: 116}];
window.modules [« choreographer.client »] = [function (required, module, export) {« use strict »; const cookie = required (41), _ get = require (23), _ omit = require (74), {insertSpeedBumpComponents: insertSpeedBumpComponents} = require (78), {insertNewsletterSpeedBumpComponents: insertNewsletterSpeedBumpComponents} = requirel (79), {generateGrowl: generateGrowl } = require (77), gtm = require (3), {getLocalStorage: getLocalStorage, setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage 14), {reportPaywall moment: reportPaywall} = required (53), 24), {getClientHistory: getClientHistory, updateClientHistoryWithPageData: updateClientHistoryWithPageData} = required (80), auth0 = required (12), {scenario: scenario} = required (75), cidReadyEvent = « nymcid-set », cidKey = « nymcid », isProduction = require (10) (), logger = require (73) .Logger (() => getLocalStorage (« show_choreographer_logs »)), {Verdon: Verdon} = require (76), TEST_COHORT_FLAG = « optimizeCohort »; Function displayDebug (e = «  ») {if (« Permission »! == e.split (« # »). Pop ()) return; const t = _get (window, « dataLayer [0] .userDetails », {}), o = _get (windo w, « dataLayer [0] .pageDetails.featureTypes », «  »), n = o.includes (« magazine « )? « magazine »: «  », r = o.includes (« feature »)? « Featured »: «  », i = « Value of the article: » (n || r || « Article »), a = _get (JSON.parse (localStorage.getItem (« auth0: profile »)), « http: // nymag. com / app_metadata « ), l = » Authentication status: « (a? » authenticated « : » not authenticated « ), s = » authorization status: « (!! a&&a.has_subscription? » 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.isSubscrib er (); return t? getC lientId (cidKey, 8e3) .then (e => (logger.h1 (« Choreographer initialized »)), logger.log (`clientId: $ {e}`), logger.log (`page counts as 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 (« Evaluate scenarios »), logger.log (e), logger.groupEnd (), e.shouldShow)). redu ((e, {action: t, min: o, number: 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 documentInclu desComponent (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, « n Ewsletter-Speed-Bump »), o [« Newsletter-Speed-Bump »], i)})), o [« Branded -Growl « ] &&brandedTakeoverTime (o [ » Branded-Growl « ]) &&t) return logger.log ( » should show brand growl « ), void growlManager (findTemplate (e, » brand growl « ), {baseTrackingData: body: o [« brand growl »]. brandedGrowlBody, contentClass: « brand 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 matte ch: », 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 growls »]); else {if (! o [« Warning-Growling-2 »]) return o [« Warning-Growling »] &&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 [ » Warnung-Knurren « ]. warningGrowlLink, baseTrackingData: i, toutType: « Warnung Knurren »}, « # Warnung-Knurren »)): void 0; WarnungGrowl (findTemplate (e, « Paywall-Reader-Schnittstelle »), i, o [« Warnung-Knurren-2 »])} else growlManager (findTemplate (e, « Growl-Nachricht »), {contentClass: « promo-content », Titel: void 0, Name: o [« promo-gr Eule « ]. Name, scrollDepth: o [ » Promo-Growl « ]. PromoGrowlScrollDepth, cta: o [ » Promo-Growl « ]. PromoGrowlCTA, Körper: o [ » Promo-Growl « ]. PromoGrowlMessage, Link: o [ » promo-growl « ]. promoGrowlLink, baseTrackingData: i, toutType: » promo growl « }, » # growl-message « )}} Funktion shouldWarn () {return! contentCliffWarningDisplayed ()} Funktion getContentCliffWarningDisplayedKey () {const e = new Date , t = e.getMonth (); return`content-cliff-warning-angezeigt – $ {e.getFullYear ()} – $ {t} `} Funktion contentCliffWarningDisplayed () {const e = getContentCliffWarningDisplayedKey (); return » true  » === getLocalStorage (e)} Funktion setContentCliffWarningDisplayed () {const e = getContentCliffWarningDisplayedKey (); Rückgabe setLocalStorage (e, « true »)} Funktion growlManager (e, {contentClass: t, scrollDepth: o, Name: n, Titel: 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 (z. B. {content: u, scrollDepth: o, onShow: () => PromotionReport (« View ») , s, p)})} Funktion 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 -agraph « ), 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 : Nummer (r), onShow: () => PromotionReport (« Ansicht », a, d), onClickCliff: () => PromotionReport (« Klick », a, d)})}} func tion verdonFosseToutSetter (e, t, o, n, r) {const i = neues 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: sichtbar », () => {PromotionReport (« View », t, o)}), i.on (« tout: sign-in », () => {auth0 .showLogin (window.location.href)}), i.on (« tout: log-out », () => {auth0.logout ()}), i.on (« tout: entlassen », () = > {n.classList.add (« entlassen »), 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 »♀))Funktionsförderung ionReport (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 ,image: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={crea tive: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{retur n JSON.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 Prom ise(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, »10″:10, »12″:12, »14″:14, »23″:23, »24″:24, »41″:41, »53″:53, »73″:73, »74″:74, »75″:75, »76″:76, »77″:77, »78″:78, »79″:79, »80″:80, »content-cliff.client »: »content-cliff.client »}];
window.modules[« growl.client »] = [function(require,module,exports){« use strict »;require(140);const _some=require(62),dom=require(4),localStorageKeyRoot= »slideout-« ,{getLocalStorage:getLocalStorage,setLocalStorage:setLocalStorage}=require(14);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, »14″:14, »62″:62, »140 »:140}];
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(107),_isEmpty=require(88),_set=require(108),_kebabCase=require(81),gtm=require(3),auth0=require(12),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, »12″:12, »81″:81, »88″:88, »107″:107, »108 »:108}];
window.modules[« content-cliff.client »] = [function(require,module,exports){« use strict »;const auth0=require(12),isProduction=require(10)(),logger=require(73).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});
}, {« 10″:10, »12″:12, »73 »:73}];
window.modules[« ad.client »] = [function(require,module,exports){« use strict »;const _forEach=require(40),_max=require(42),_find=require(43),_includes=require(44),$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, »40″:40, »42″:42, »43″:43, »44 »:44}];
window.modules[« sticky-list.client »] = [function(require,module,exports){« use strict »;const dom=require(4),$gtm=require(3),_get=require(23),stickyContainer=require(« sticky-container.client »);DS.controller(« sticky-list »,[« $window »,function(t){var e=require(218),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, « 96 »: 96}];
window.modules[« article.client »] = [function(require,module,exports){« use strict »;const $visibility=require(5),$gtm=require(3),ImageZoom=require(56),$sentry=require(57);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, »56″:56, »57 »:57}];
window.modules[« tags.client »] = [function(require,module,exports){« use strict »;const _forEach=require(40);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}]);
}, {« 40 »:40}];
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(44),_startsWith=require(48),globalClick=require(47),visit=require(46),productSubtags=require(49);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, »44″:44, »46″:46, »47″:47, »48″:48, »49 »:49}];
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[« global-nav.client »] = [function(require,module,exports){« use strict »;const dom=require(4),auth0=require(12),signInButton=dom.find(« .user-signin »),signOutButton=dom.find(« .user-signout »),globalNav=dom.find(‘[class^= »global-nav »]’),body=dom.find(« body »),dropdownItems=dom.findAll(« .dropdown-wrap »),gtm=require(3),pageUri=require(136).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, »12″:12, »136 »:136}];
window.modules[« aaa-module-mounting.legacy »] = [function(require,module,exports){« use strict »;const eventify=require(164),_pickBy=require(139),_each=require(301),fingerprintjs2=require(300),DS=require(299);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()});
}, {« 139″:139, »164″:164, »299″:299, »300″:300, »301 »:301}];
window.modules[« ads.legacy »] = [function(require,module,exports){« use strict »;const _map=require(50),_forEach=require(40),_isString=require(184),_intersectionWith=require(302),_isEqual=require(190),_each=require(301),_debounce=require(99),_sortBy=require(122),page=require(136),visit=require(46);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}}]);
}, {« 40″:40, »46″:46, »50″:50, »99″:99, »122″:122, »136″:136, »184″:184, »190″:190, »301″:301, »302 »:302}];
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: