parenting advice from Care and Feeding.

A man slouches and frowns as he sits on a couch.
Photo illustration by Slate. Photo by Getty Images Plus.

Care and Feeding is Slate’s parenting advice column. Have a question for Care and Feeding? Submit it here or post it in the Slate Parenting Facebook group.

Dear Care and Feeding,

I’m 30 years old and very much feel physically, emotionally, and financially ready to start trying to have a baby—understanding that it could take several years to happen. My husband says he’s about 70 percent on board. His hesitation is about the way our lifestyle will change with children. He is a good person at a heart, super kind, and wonderful with children. Up until recently I thought having kids with him would be amazing. But the more I’ve examined our lives and started planning for the realities of having a baby together—the more I realize that my husband is truly incompetent and unfit to be a parent.

The bulk of our household management falls to me: grocery shopping, caring for our dog, cooking, planning trips, dealing with our apartment management, and all our bills and finances. He simply cannot do these things. When I ask him to make dinner, he makes mushy pasta with no vegetables. When I ask him to go to the grocery store, he gets overwhelmed and leaves the store with half the list. When I ask him to plan our wake up and leave time for a trip, we invariably miss our flight. And when I have an early meeting, I’ll come home midafternoon to find that the dog hasn’t been out at all yet.

All of that would be … sort of fine (at least commonplace in the culture we live in). But he’s also very sensitive to even very gentle criticism and he is easily stressed. Looking for parking sets him on edge. A website that doesn’t load results in cursing and aggressive sighing. He’s never cruel to me, but when I push back against his behavior and ask him to be more mindful of his temperament, he shuts down for days at a time. I don’t know what to do. I really do love him and the life we have together, but I know it only works if I’m willing to give at least 70 percent at all times, because he’s bringing no more than 30 percent to the table. I’m not a perfectionist, and I’m fine with some things falling through the cracks. But I can’t help thinking that bringing a child into our home would be overwhelming and frustrating for him. Can you help me figure out where to begin dealing with this?

—Husband Is a Good Person but Likely Terrible Co-Parent


I think this is a more complicated question than it appears to be, honestly. The obvious answer is don’t have a child with this man. And it may also seem obvious (to someone who isn’t you) that this is not a healthy, sustainable marriage—that the answer I should be giving you is get out while the getting’s good. But you say you “really do love him and the life [you] have together” … and you also don’t say that you very much want to have a child (only that you feel “ready”) or that the dynamic between the two of you, as it stands currently, actually bothers you very much.

I’ll be honest with you: This dynamic sounds pretty bad, child or no child. And your instinct that things are going to get worse, that he would not only be a terrible parent but that this balance (of no balance at all) between the two of you is going to tip deeply toward resentment on your part if you bring a child into the equation is quite right. So I feel my only fair response is to answer your question with some questions of my own.

What is it that’s keeping you in this marriage? What does it mean when you say you “really love him,” and what is it about the life you have together that you love? To this casual observer, it sounds like a really difficult life, day to day—and he sounds like a hard person to love. But obviously I am not you, which is why I’m asking. If the answers to these questions are clear to you (and I would gently suggest therapy to help you answer them), and letting go of the idea of having a child doesn’t fill you with despair, then I would suggest keeping the husband and giving up the (potential future) children. I will tell you this for sure: If you push ahead and have a child with your husband, the behavior you describe him as exhibiting will harm the child; your own co-dependence will set an example I know you don’t want to set for your (as of now imaginary) children; and you will either end up leaving your husband or suffering through many years of pain. I guess the bottom line is: What do you want more? The man you’re married to or a different—happier and healthier—sort of life? Since it doesn’t sound like you’re considering leaving him, I suspect that (for whatever reason) it’s the former you want more. If so, I would be very, very careful not to get pregnant.

Help! How can I support Slate so I can keep reading all the advice from Dear Prudence, Care and Feeding, Ask a Teacher, and How to Do It? Answer: Join Slate Plus.

Dear Care and Feeding,

About a week ago my mother and I learned that my father was accused of sexual assault several months ago; he has a court date in a few weeks. Out of morbid curiosity, I took a look at the court briefing and read the accuser’s statement. I have felt nauseated ever since. It goes into specific detail. The woman describes feeling uncomfortable and disgusted; she says that afterward she couldn’t stop crying. The actual things that he did aren’t horrifying but are very creepy and boundary-crossing and involve a woman young enough to be his granddaughter.

My father has a history of being misogynistic, overly familiar with women, and gleefully disregarding the repeated and frustrated attempts by the rest of his family to teach him that he needs to keep his hands and comments to himself. He has also been to court for this sort of thing in the past, before my brother was born, and when I was so young I have no memory it. My father is not an easy person to have as a parent, but this latest thing has me boiling with rage. Is this something we can ever come back from? He still feels that he has done nothing wrong. Will there ever be a way I can make him have empathy for the women he’s inflicted himself on, or better yet get him to stop doing these things? I feel embarrassed to be related to him and will eventually go no-contact if he can’t change.

—Appalled in Australia

Dear Appalled,

There is no way you can “make” your father have empathy; there is no way you can get him to stop the behavior he’s exhibited for years. I almost never suggest going “no-contact” with a parent, but I think in this situation you may have no real choice. Your father believes he has done nothing wrong; you are not going to be able to convince him otherwise. I suppose there is a (very slim) possibility that the shock of your cutting him out of your life might help him take the steps needed to get help and possibly to change—but this would be a side effect, not a goal, of your extricating yourself from this relationship. I’m really sorry to be saying this. But your father sounds like a menace. For your own sake, I would put as much distance as possible between yourself and him.

• If you missed the latest Care and Feeding column, read it here.

• Discuss this column in the Slate Parenting Facebook group!

Dear Care and Feeding,

My family is very close and my 2-year-old spends a lot of time with his cousin, who is 6 months older (closer to 3). His cousin is also big for his age, and my son is on the small side, so their size difference is significant. When the boys play together, the cousin can also be a bit mean- spirited. Recently he has sprayed a garden hose in my son’s face, pushed his head into the wall, and trapped my son in the dog kennel. We don’t give them more than five minutes of unsupervised time, but the cousin can be quite brazen with his bully-type behavior. My son is quieter and pretty meek and is usually too shocked to respond in the moment. We are working on encouraging him to use his voice and say, “Please stop” firmly (which he says he tried when he was trapped in the dog kennel). My nephew’s parents have responded quickly to each situation and talked to their son firmly and coached him to apologize. I don’t blame their parenting—it’s more their son’s personality. It just breaks my heart to see my son treated this way, though, especially since he kind of looks up to his big cousin and can’t wait to play with him. How do we still spend time together as a family without my son taking the brunt of it?

—Cousin Conundrum

Dear CC,

When I was a child, my family drove from Brooklyn to New Jersey almost every weekend so that my mother could spend time with her beloved youngest brother, and my little brother and I could play with our three cousins—the devil spawn, as I thought of them, of the uncle my mother was so inexplicably attached to. I was expected to enjoy this time with Uncle Davey’s kids—it was clear to me that the cousins were expected to be close and happy to be together—and my mother seemed to so look forward to this family togetherness. Because of this, I never told my parents what happened when they weren’t watching, but those three cousins terrorized my brother and me every single minute that we were together: pinching and pummeling, sometimes actually beating up and psychologically tormenting us. This went on for years and it still enrages and frightens me when I think about it (which I try not to). I was over 50 and my uncle was dead before I told my mother.

I have no idea if your son actually “kind of looks up to” his big cousin and “can’t wait to play with him,” or if you are imagining this because you want the children to be close, because you enjoy the time you spend with his parents, and/or because of ideas you have about family togetherness, but the behavior you describe is not bully-type behavior, it is bullying, even if he’s only 2. I’m glad to hear that your nephew’s parents handle it well, but that’s beside the point right now. Unlike my parents in the 1960s, you are aware of what your nephew is doing to your son. If your nephew manages this much terrorizing behavior in what you say are only five-minute intervals, I shudder to think of what he will be able to pull off as the children get older and you allow them longer periods of “unsupervised play.” Is my concern colored by my own childhood experience? Absolutely. But because I still find it hard to believe, looking back, that no adults intervened to rescue me, it’s impossible for me not to give you this advice: Do not force your child into the company of your nephew. See the parents on adults-only outings, when both kids are left with sitters, if you want to maintain your relationship with them. If their feelings are hurt when you tell them you don’t want to get together as families anymore, so be it. Protecting your son takes precedence over their possible hurt feelings.

You can always try to put the kids together again when they’re a little older and see what happens; maybe your nephew, with his kind parents, will outgrow this alarming behavior (although I would keep my eyes on them at all times). I guarantee that even if your 2-year-old misses his cousin—or imagines he does—he’ll get over it. He’s 2. He doesn’t know how to protect himself from abuse. That’s your job.

Dear Care and Feeding,

My wife and I have two smart, beautiful daughters, the youngest of whom is 2½. We’re having trouble with potty-training and getting rid of the pacifier. Our oldest, who is 6, gave up the pacifier overnight when we pressed the issue, and she took to the potty-training within a weekend when she was a little younger than her sister is now. I feel like 2½ is the point at which we need to buckle down with both of these issues, while my wife is taking a more laid-back approach. Should I relax about this until our youngest shows more signs of being ready? Is there one issue I should prioritize over the other? This is stressing me out more than it probably should, so I’d love an outside perspective. Also, if this makes a difference in your answer, my daughter is hitting all of her developmental milestones early, speaking clearly in full sentences, doing puzzles, etc.

—Toddler Trouble

Dear TT,

Surely I shouldn’t have to tell you not to compare your children? That every child is a unique human being, with their own timetable and their own personality and own self? What difference does it make that your older daughter gave up her pacifier overnight or was potty-trained over a weekend? Now would be an excellent time for you to get used to the idea that your two children are not the same person, so that your younger one isn’t plagued throughout her (older) childhood with “Why can’t you be more like your sister?”—a question that has ruined sibling relationships from time immemorial. Your wife seems to have an understanding of this, as well as a (reasonably) laid-back approach to matters that resolve themselves with just a little intervention from parents (that is, without a full-out, ferocious campaign). Children give up their pacifiers and learn to use the toilet when the time is right for them. What, I always wonder, is the big rush? Yes, of course you should relax about this until your child shows signs of readiness. Don’t worry about prioritizing one over the other. She will let you know which one she’s ready for first, I promise. Most important: Follow your wife’s lead in this. She may not always turn out to be right, but she is most certainly right this time.


More Advice From Slate

I’m a new mom, and breastfeeding is not going well. I’ve been putting the baby to the breast constantly, and I’ve been pumping, but I have to heavily supplement with formula. Balancing the two feeding methods has me so stressed. Can I give up on breastfeeding?

nnx3c!-- Rubicon Project Ad Tag --x3en


nn")), n = v(f[r.size_id].split("x").map(function (e)
return Number(e);
), 2), i.width = n[0], i.height = n[1]), i.rubiconTargeting = (Array.isArray(r.targeting) ? r.targeting : []).reduce(function (e, r)
return e[r.key] = r.values[0], e;
rpfl_elemid: s.adUnitCode
), e.push(i)) : g.logError("Rubicon: bidRequest undefined at index position:".concat(t), c, d), e;
, []).sort(function (e, r) );
getUserSyncs: function getUserSyncs(e, r, t, i)
if (!R && e.iframeEnabled)
var n = "";
return t && "string" == typeof t.consentString && ("boolean" == typeof t.gdprApplies ? n += "?gdpr=".concat(Number(t.gdprApplies), "&gdpr_consent=").concat(t.consentString) : n += "?gdpr_consent=".concat(t.consentString)), i && (n += "".concat(n ? "&" : "?","us_privacy=").concat(encodeURIComponent(i))), R = !0,
type: "iframe",
url: a + n

transformBidParams: function transformBidParams(e)
return g.convertTypes(
accountId: "number",
siteId: "number",
zoneId: "number"
, e);


function _(e, r) !d[n]) return null;
var o = d[n];

var a = function ()
var e = g.deepAccess(i, "");
if (e) return e;
var r = window.DigiTrust && (b.b.getConfig("digiTrustId") ();

if (!a

function I(e, r) r.refererInfo.referer;
return ? t.replace(/^http:/i, "https:") : t;

function A(e, r)
var t = e.params;

if ("video" === r)
var i = [];
return && && ? i = [,] : Array.isArray(g.deepAccess(e, "")) && 1 === ? i =[0] : Array.isArray(e.sizes) && 0 < e.sizes.length && Array.isArray(e.sizes[0]) && 1 < e.sizes[0].length && (i = e.sizes[0]), i; var n = []; return Array.isArray(t.sizes) ? n = t.sizes : void 0 !== g.deepAccess(e, "mediaTypes.banner.sizes") ? n = s(e.mediaTypes.banner.sizes) : Array.isArray(e.sizes) && 0 < e.sizes.length ? n = s(e.sizes) : g.logWarn("Rubicon: no sizes are setup or found"), S(n); function s(e) return g.parseSizesInput(e).reduce(function (e, r) var t = parseInt(f[r], 10); return t && e.push(t), e; , []); function c(e) return "object" === x(g.deepAccess(e, "")) && void 0 !== g.deepAccess(e, "mediaTypes.".concat(u.d)); function m(e, r) var t = 1 < arguments.length && void 0 !== r && r; return c(e) ? -1 === ["outstream","instream"].indexOf(g.deepAccess(e, "mediaTypes.".concat(u.d, ".context"))) ? void (t && g.logError("Rubicon: must be outstream or instream")) : A(e, "video").length < 2 ? void (t && g.logError("Rubicon: could not determine the playerSize of the video")) : (t && g.logMessage("Rubicon: making video request for adUnit", e.adUnitCode), "video") : 0 === A(e, "banner").length ? void (t && g.logError("Rubicon: could not determine the sizes for banner request")) : (t && g.logMessage("Rubicon: making banner request for adUnit", e.adUnitCode), "banner"); function S(e) var n = [15, 2, 9]; return e.sort(function (e, r) -1 < i ? -1 === t ? 1 : -1 === i ? -1 : t - i : e - r; ); function C(e) var r = parseInt(g.deepAccess(e, "")); return isNaN(r) ? "outstream" === g.deepAccess(e, "mediaTypes.".concat(u.d, ".context")) ? 203 : 201 : r; function j(e) return ranges: low: [ max: 5, increment: .5 ], medium: [ max: 20, increment: .1 ], high: [ max: 20, increment: .01 ], auto: [ max: 5, increment: .05 , min: 5, max: 10, increment: .1 , min: 10, max: 20, increment: .5 ], dense: [ max: 3, increment: .01 , min: 3, max: 8, increment: .05 , min: 8, max: 20, increment: .5 ], custom: e.getConfig("customPriceBucket") && e.getConfig("customPriceBucket").buckets [e.getConfig("priceGranularity")] ; function k(r) var t = !0, e =[]), i =, n = mimes: e, protocols: e, maxduration: i, linearity: i, api: e ; return Object.keys(n).forEach(function (e), "" + e)) !== n[e] && (t = !1, g.logError("Rubicon:" + e + " is required and must be of type: " + n[e])); ), t; function T(e) var r = !1, t = ["asi","sid","hp"]; return e.nodes && ((r = e.nodes.reduce(function (e, r) return e ? t.every(function (e) return r[e]; ) : e; , !0)) function w(e, r) return "rp_schain" === e ? "rp_schain=".concat(r) : "".concat(e, "=").concat(encodeURIComponent(r)); var R = !1; Object(i.registerBidder)(h); } }, [677]); pbjsChunk([93], { 719: function _(e, t, r) e.exports = r(720); , 720: function _(e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", value: !0 ), r.d(t, "spec", function () return o; ), r.d(t, "_isInbounds", function () return a; ), t._getPlatform = v; var n = r(1), y = r(0), i = r(2), c = r(3), g = r(10), d = r(44); function h(e, t) function () throw new TypeError("Invalid attempt to destructure non-iterable instance.nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); (); function s(e, t) function u() function p(e, t, r) return t in e ? Object.defineProperty(e, t, value: r, enumerable: !0, configurable: !0, writable: !0 ) : e[t] = r, e; var b = "sonobi", l = Object(y.generateUUID)(), o = { code: b, supportedMediaTypes: [i.b, i.d], isBidRequestValid: function isBidRequestValid(e) if (!e.params) return !1; if (!e.params.ad_unit && !e.params.placement_id) return !1; if (!Object(y.deepAccess)(e, "mediaTypes.banner") && !Object(y.deepAccess)(e, "")) return !1; if (Object(y.deepAccess)(e, "mediaTypes.banner")) if (!Object(y.deepAccess)(e, "mediaTypes.banner.sizes") && !e.params.sizes) return !1; else if (Object(y.deepAccess)(e, "")) if ("outstream" === Object(y.deepAccess)(e, "") && !e.params.sizes) return !1; if ("instream" === Object(y.deepAccess)(e, "") && !Object(y.deepAccess)(e, "")) return !1; return !0; , buildRequests: function buildRequests(e, t) var r = (e) ").concat(e.bidId), "".concat(f(e)).concat(m(e)))) : /^[0-9a-fA-F]20$/.test(t) && 20 === t.length ? p(, e.bidId, "".concat(t, "), n = ; r.forEach(function (e) u(n, e); ); var i = key_maker: JSON.stringify(n), ref: t.refererInfo.referer, s: Object(y.generateUUID)(), pv: l, vp: v(), lib_name: "prebid", lib_v: "3.23.0", us: 0 ; c.b.getConfig("userSync") && c.b.getConfig("userSync").syncsPerBidder && ( = c.b.getConfig("userSync").syncsPerBidder), d.a.canBidderRegisterSync("iframe", b) ? i.ius = 1 : i.ius = 0, Object(y.deepAccess)(e[0], "params.hfa") && (i.hfa = Object(y.deepAccess)(e[0], "params.hfa")), e[0].params.referrer && (i.ref = e[0].params.referrer), t && t.gdprConsent && (i.gdpr = t.gdprConsent.gdprApplies ? "true" : "false", t.gdprConsent.consentString && (i.consent_string = t.gdprConsent.consentString)); var s = function (t) ("fhnS5drwmH"); s && (i.digid =, i.digkeyv = s.keyv), e[0].schain && (i.schain = JSON.stringify(e[0].schain)), Object(y.deepAccess)(e[0], "userId") && 0 < Object.keys(e[0].userId).length && (i.userid = JSON.stringify(e[0].userId)); var o = e[0].params.keywords; if (o && ( = o), t && t.uspConsent && (i.us_privacy = t.uspConsent), Object(y.isEmpty)(n)) return null; var a = ""; return Object(y.deepAccess)(e[0], "params.bid_request_url") && (a = Object(y.deepAccess)(e[0], "params.bid_request_url")), method: "GET", url: a, withCredentials: !0, data: i, bidderRequests: e ; , interpretResponse: function interpretResponse(e, l) { var f = e.body, m = [], v =; return 0 === Object.keys(f.slots).length || Object.keys(f.slots).forEach(function (e) ").slice(-1)[0], n = function (e, t) for (var r = 0; r < e.length; r++) if (e[r].bidId === t) return e[r]; (l.bidderRequests, r), i = null; "video" === t.sbi_ct && (i = "video","outstream" === Object(y.deepAccess)(n, "") && (i = "outstream")); var s, o, a, c, d, u, p, b = j(i, v); t.sbi_aid && t.sbi_mouse && t.sbi_size && (a = void 0 === (o = (s = h(t.sbi_size.split("x"), 2))[0]) ? 1 : o, d = void 0 === (c = s[1]) ? 1 : c, u = , t.sbi_dozer && (u.dealId = t.sbi_dozer), "video" === i ? (u.mediaType = "video", u.vastUrl = b(f.sbi_dc, t.sbi_aid), delete, delete u.width, delete u.height) : "outstream" === i && n && (u.mediaType = "video", u.vastUrl = b(f.sbi_dc, t.sbi_aid), u.renderer = function (e, t) var r = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : , n = g.a.install( id: t.aid, url: "", config: r, loaded: !1, adUnitCode: e ); try n.setRender(O); catch (e) Object(y.logWarn)("Prebid Error calling setRender on renderer", e); return n.setEventHandlers( impression: function impression() return Object(y.logMessage)("Sonobi outstream video impression event"); , loaded: function loaded() return Object(y.logMessage)("Sonobi outstream video loaded event"); , ended: function ended() Object(y.logMessage)("Sonobi outstream renderer video event"); ), n; (n.adUnitCode, u, Object(y.deepAccess)(n, "renderer.options")), p = Object(y.deepAccess)(n, "params.sizes"), Array.isArray(p) && Array.isArray(p[0]) && (p = p[0]), p && (u.width = p[0], u.height = p[1])), m.push(u)); ), m; }, getUserSyncs: function getUserSyncs(e, t) var r = []; try e.pixelEnabled && t[0].body.sbi_px.forEach(function (e) r.push( type: e.type, url: e.url ); ); catch (e) return r; }; function f(e) return Object(y.deepAccess)(e, "") ? "" : e.params.sizes ? Object(y.parseSizesInput)(e.params.sizes).join(",") : Object(y.deepAccess)(e, "mediaTypes.banner.sizes") ? Object(y.parseSizesInput)(Object(y.deepAccess)(e, "mediaTypes.banner.sizes")).join(",") : e.sizes ? Object(y.parseSizesInput)(e.sizes).join(",") : void 0; function m(e) f=".concat(e.params.floor) : ""; var j = function j(i, s) return function (e, t) "outstream" === i ? (r = t, n = s, "https://".concat(e, "").concat(r, "&ref=").concat(encodeURIComponent(n))) : '‘;
var r, n;

var a = function a(e)
var r = 0 < arguments.length && void 0 !== e ? e : window; return function () var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : 0, t = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : Number.MAX_SAFE_INTEGER; return r.innerWidth >= e && r.innerWidth < t; ; ; function v() var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : window, t = a(e), r = 992, n = 768; return t(0, 768) ? "mobile" : t(n, r) ? "tablet" : "desktop"; function O(i) i.renderer.push(function () var e = h(i.getSize().split("x"), 2), t = e[0], r = e[1], n = new window.SbiOutstreamRenderer(); n.init( vastUrl: i.vastUrl, height: r, width: t ), n.setRootElement(i.adUnitCode); ); Object(n.registerBidder)(o); } }, [719]); pbjsChunk([85], { 741: function _(e, r, t) e.exports = t(742); , 742: function _(e, r, t) { "use strict"; Object.defineProperty(r, "__esModule", value: !0 ), t.d(r, "spec", function () return n; ); var a = t(1), d = t(0), p = 12, o = 11, c = 0, u = 22, n = code: "teads", supportedMediaTypes: ["video","banner"], isBidRequestValid: function isBidRequestValid(e) , buildRequests: function buildRequests(e, r) var t =, a = referrer: function (e) var r = ""; e && e.refererInfo && e.refererInfo.referer && (r = e.refererInfo.referer); return r; (r), data: t, deviceWidth: screen.width, hb_version: "3.23.0" ; e[0].schain && (a.schain = e[0].schain); var n, d, i, s = r.gdprConsent; return r && s && (n = "boolean" == typeof s.gdprApplies, d = "string" == typeof s.consentString, i = n ? function (e, r, t) var a = p; e ? function (e, r) (r, t) && (a = o) : a = c; return a; (s.gdprApplies, s.vendorData, s.apiVersion) : u, a.gdpr_iab = consent: d ? s.consentString : "", status: i, apiVersion: s.apiVersion ), r && r.uspConsent && (a.us_privacy = r.uspConsent), method: "POST", url: "", data: JSON.stringify(a) ; , interpretResponse: function interpretResponse(e) var t = []; return (e = e.body).responses && e.responses.forEach(function (e) var r = cpm: e.cpm, width: e.width, height: e.height, currency: e.currency, netRevenue: !0, ttl: e.ttl, ad:, requestId: e.bidId, creativeId: e.creativeId, placementId: e.placementId ; e.dealId && (r.dealId = e.dealId), t.push(r); ), t; ; function I(e) var r, t = , a = d.getValue(e.params, "placementId"), n = d.getValue(e.params, "pageId"); return t.sizes = (r = e, d.parseSizesInput(function (e) (r))), t.bidId = d.getBidIdParameter("bidId", e), t.bidderRequestId = d.getBidIdParameter("bidderRequestId", e), t.placementId = parseInt(a, 10), t.pageId = parseInt(n, 10), t.adUnitCode = d.getBidIdParameter("adUnitCode", e), t.auctionId = d.getBidIdParameter("auctionId", e), t.transactionId = d.getBidIdParameter("transactionId", e), t; function i(e) return 0 < parseInt(e); Object(a.registerBidder)(n); } }, [741]); pbjsChunk([76], { 761: function _(r, e, t) r.exports = t(762); , 762: function _(r, e, t) { "use strict"; Object.defineProperty(e, "__esModule", value: !0 ), t.d(e, "tripleliftAdapterSpec", function () return s; ); var n = t(2), i = t(1), o = t(0), u = t(3); function p(r) return function (r) if (Array.isArray(r)) return d(r); (r) function d(r, e) var a = !0, c = null, s = { code: "triplelift", supportedMediaTypes: [n.b], isBidRequestValid: function isBidRequestValid(r) return void 0 !== r.params.inventoryCode; , buildRequests: function buildRequests(r, e) { var t, n = "", i = function (r) { var e = , t = r[0].schain; e.imp = (r, e) { return id: e, tagid: r.params.inventoryCode, floor: r.params.floor, banner: format: r.sizes.filter(l).map(function (r) return w: r[0], h: r[1] ; ) ; }); var n = [].concat(p(function (r) return f(r, "tdid","","TDID"); (r)), p(function (r) return f(r, "idl_env","","idl"); (r)), p(function (r) return f(r, "criteoId","","criteoId"); (r))); 0 < n.length && (e.user = ext: eids: n ); t && (e.ext = schain: t ); return e; }(r); return n = o.tryAppendQueryString(n, "lib","prebid"), n = o.tryAppendQueryString(n, "v","3.23.0"), e && e.refererInfo && (t = e.refererInfo.referer, n = o.tryAppendQueryString(n, "referrer", t)), e && e.timeout && (n = o.tryAppendQueryString(n, "tmax", e.timeout)), e && e.gdprConsent && (void 0 !== e.gdprConsent.gdprApplies && (a = e.gdprConsent.gdprApplies, n = o.tryAppendQueryString(n, "gdpr", a.toString())), void 0 !== e.gdprConsent.consentString && (c = e.gdprConsent.consentString, n = o.tryAppendQueryString(n, "cmp_cs", c))), e && e.uspConsent && (n = o.tryAppendQueryString(n, "us_privacy", e.uspConsent)), !0 === u.b.getConfig("coppa") && (n = o.tryAppendQueryString(n, "coppa", !0)), n.lastIndexOf("&") === n.length - 1 && (n = n.substring(0, n.length - 1)), o.logMessage("tlCall request built: " + n), method: "POST", url: n, data: i, bidderRequest: e ; }, interpretResponse: function interpretResponse(r, e) var t = e.bidderRequest; return (r.body.bids , getUserSyncs: function getUserSyncs(r, e, t, n) var i = function (r) if (!r) return; if (r.iframeEnabled) return "iframe"; if (r.pixelEnabled) return "image"; (r); if (i) var u = ""; return "image" === i && (u = o.tryAppendQueryString(u, "px", 1), u = o.tryAppendQueryString(u, "src","prebid")), null !== c && (u = o.tryAppendQueryString(u, "gdpr", a), u = o.tryAppendQueryString(u, "cmp_cs", c)), n && (u = o.tryAppendQueryString(u, "us_privacy", n)), [ type: i, url: u ]; }; function f(r, e, t, n) { return = e, function (r) return r && r.userId && r.userId[o]; )).filter(function (r) return !!r; ).map((i = t, u = n, function (r) return source: i, uids: [ id: r, ext: rtiPartner: u ] ; )); var i, u, o; } function l(r) return 2 === r.length && "number" == typeof r[0] && "number" == typeof r[1]; Object(i.registerBidder)(s); } }, [761]); pbjsChunk([75], { 763: function _(e, r, t) e.exports = t(764); , 764: function _(e, r, t) { "use strict"; Object.defineProperty(r, "__esModule", value: !0 ), t.d(r, "spec", function () return v; ); var m = t(0), s = t(1), o = t(10), c = t(2), f = "Bid from response has no auid parameter - ", l = "Bid from response has no adm parameter - ", p = "Array of bid objects is empty", g = "Can't find in requested bids the bid with auid - ", u = "Seatbid array from response has empty item", y = "Response is empty", b = "Response has empty seatbid array", h = "Seatbid from response has no array of bid objects - ", v = { code: "trustx", supportedMediaTypes: [c.b, c.d], isBidRequestValid: function isBidRequestValid(e) return !!e.params.uid; , buildRequests: function buildRequests(e, r) []).forEach(function (e) "gross" === e.params.priceType && (l = "gross"), o = e.bidderRequestId; var r = e.params.uid, t = e.adUnitCode; p.push(r); var s, n = m.parseSizesInput(e.sizes); a ); var t = pt: l, auids: p.join(","), sizes: m.getKeys(f).join(","), r: o, wrapperType: "Prebid_js", wrapperVersion: "3.23.0" ; return a && (t.keywords = JSON.stringify(a)), r && (r.refererInfo && r.refererInfo.referer && (t.u = r.refererInfo.referer), r.timeout && (t.wtimeout = r.timeout), r.gdprConsent && (r.gdprConsent.consentString && (t.gdpr_consent = r.gdprConsent.consentString), t.gdpr_applies = "boolean" == typeof r.gdprConsent.gdprApplies ? Number(r.gdprConsent.gdprApplies) : 1), r.uspConsent && (t.us_privacy = r.uspConsent)), method: "GET", url: "", data: m.parseQueryStringParameters(t).replace(/&$/, ""), bidsMap: u ; , interpretResponse: function interpretResponse(e, r, t) { var s = 2 < arguments.length && void 0 !== t ? t : o.a; e = e && e.body; var n, d = [], i = r.bidsMap, a =; return e ? e.seatbid && !e.seatbid.length && (n = b) : n = y, !n && e.seatbid && e.seatbid.forEach(function (e) { !function (e, d, r, t, s) (n = f + JSON.stringify(e)); (u.renderer = function (e, r) var t = r.install( id:, url: e.url, loaded: !1 ); try t.setRender(w); catch (e) m.logWarn("Prebid Error calling setRender on renderer", e); return t; ( id: p.bidId, url: "" , s))) : ( = e.adm, u.mediaType = c.b), t.push(u), o.bids.length n && m.logError(n); (function (e) m.logError(p) : m.logError(h + JSON.stringify(e)) : m.logError(u); return e && &&[0]; (e), i, a, d, s); }), n && m.logError(n), d; }, getUserSyncs: function getUserSyncs(e) if (e.pixelEnabled) return [ type: "image", url: "" ]; }; function E(e) var r; r = e.value, m.isArray(r) && 0 < r.length && "" === e.value[0] && delete e.value; function w(e) e.renderer.push(function () window.ANOutstreamVideo.renderAd( targetId: e.adUnitCode, adResponse: e.adResponse ); ); Object(s.registerBidder)(v); } }, [763]); pbjs.processQueue(); }, ]; window.modules["via.legacy"] = [function(require,module,exports){"use strict"; DS.service("via", function () { "use strict"; // remove `via` from url, to be used after amplitude logs it to prevent users from sharing such urls function removeFromLocation() var url = new URL(location.href); url.searchParams.delete("via"); history.replaceState(null, "", url.toString()); // and add `via` param to any outbound links function addViaToUrl(href, via) if (!href // keys correspond to "page_types" in editable_components.yml var PREFIXES = article: "article", homepage: "homepage", "vertical front": "section", "rubric front": "rubric" ; var pageType; function setPageType(amplitudePageType) pageType = PREFIXES[amplitudePageType]; var DELIMITER = "_"; function concatVia(node, via) var tag = node.dataset && node.dataset.via; if (tag) via = (via.length ? tag + DELIMITER : tag) + via; return via; function addToClickedLinks() document.documentElement.addEventListener("click", function (e) var a; var via = ""; // detect link nodes and collect via directives to append to the href var node =; // the element where this event originated may have been removed from the dom, e.g. in the case of the OIL CMP which disappears after you interact with it while (node && node !== e.currentTarget) if (node.tagName === "A") a = node; via = concatVia(node, via); node = node.parentNode; if (a && via) if (pageType) via = pageType + DELIMITER + via; a.href = addViaToUrl(a.href, via); ); function addToSubmittedForms() document.documentElement.addEventListener("submit", function (e) var form =; // collect via directives var via = ""; var node =; while (node !== e.currentTarget) via = concatVia(node, via); node = node.parentNode; if (via) if (pageType) via = pageType + DELIMITER + via; // dynamically create a hidden input for the form url var input = document.createElement("input"); input.type = "hidden"; = "via"; input.value = via; form.appendChild(input); ); // start listening only once, when first injected addToClickedLinks(); addToSubmittedForms(); return setPageType: setPageType, removeFromLocation: removeFromLocation ; }); }, ]; window.modules["visibility.legacy"] = [function(require,module,exports){"use strict"; DS.service("$visibility", ["$document","$window","_throttle","Eventify", function ($document, $window, _throttle, Eventify) var list = [], Visible, VisibleEvent; /** * @param number a * @param number b * @returns * * @see */ function min(a, b) return a < b ? a : b; /** * @param number a * @param number b * @returns * * @see */ function max(a, b) return a > b ? a : b;

* Fast loop through watched elements

function onScroll()

* updates seen property
* @param Visble item
* @param evt
* @fires Visible#shown
* @fires Visible#hidden

function updateSeen(item, evt) percent < item.hiddenThreshold) && item.seen) item.seen = false; setTimeout(function () item.trigger("hidden", new VisibleEvent("hidden", evt)); , 15); /** * sets preload property * @param Visible item * @param evt * @param Number innerHeight * @fires Visible#preload */ function updatePreload(item, evt, innerHeight) if (!item.preload && item.preloadThreshhold && shouldBePreloaded(, evt.rect, item.preloadThreshhold, innerHeight)) item.preload = true; setTimeout(function () item.trigger("preload", new VisibleEvent("preload", evt)); , 15); /** * Trigger events * @param Visible item */ function updateVisibility(item) /** * Return normalized viewport height * @return number */ function getViewportHeight() $document.documentElement.clientHeight /** * Return normalized viewport width * @return number */ function getViewportWidth() $document.documentElement.clientWidth /** * make sure an element isn't hidden by styles or etc * @param Element el * @return Boolean */ function isElementNotHidden(el) return el && el.offsetParent !== null && !el.getAttribute("hidden") && getComputedStyle(el).display !== "none" && getComputedStyle(el).visibility !== "hidden"; /** * Apparently the fastest way... * @param Element el * @returns boolean * @example if (!$visibility.isElementInViewport(el)) ... */ function isElementInViewport(el) /** * @param Element el * @param ClientRect rect * @param Number preloadThreshhold * @param Number innerHeight * @return Boolean */ function shouldBePreloaded(el, rect, preloadThreshhold, innerHeight) return <= innerHeight + preloadThreshhold && isElementNotHidden(el); /** * Create a one-dimensional spacial hash of x * @param number x * @param number stepSize * @param number optimalK * @param number base * @return number */ function getLinearSpacialHash(x, stepSize, optimalK, base) var index = Math.floor(x / (stepSize /** * @param ClientRect rect * @param number innerHeight * @returns number */ function getVerticallyVisiblePixels(rect, innerHeight) return min(innerHeight, max(rect.bottom, 0)) - min(max(, 0), innerHeight); /** * Get offset of element relative to entire page * * @param Element el * @returns left: number, top: number * @see */ function getPageOffset(el) var offsetLeft = el.offsetLeft, offsetTop = el.offsetTop; while (el = el.offsetParent) offsetLeft += el.offsetLeft; offsetTop += el.offsetTop; return left: offsetLeft, top: offsetTop ; /** * Create a new Visible class to observe when elements enter and leave the viewport * * Call destroy function to stop listening (this is until we have better support for watching for Node Removal) * @param Element el * @param shownThreshold: number, hiddenThreshold: number [options] * @class * @example this.visible = new $visibility.Visible(el); */ Visible = function Visible(el, options) ; this.el = el; this.seen = false; this.preload = false; this.preloadThreshhold = options && options.preloadThreshhold ; Visible.prototype = /** * Stop triggering. */ destroy: function destroy() // remove from list list.splice(list.indexOf(this), 1); /** * @name Visible#on * @function * @param 'hidden' e EventName * @param function cb Callback */ /** * @name Visible#trigger * @function * @param 'shown' e * @param */ ; Eventify.enable(Visible.prototype); VisibleEvent = function VisibleEvent(type, options) var _this = this; this.type = type; Object.keys(options).forEach(function (key) _this[key] = options[key]; ); ; // listen for scroll events (throttled) $document.addEventListener("scroll", _throttle(onScroll, 200)); // public this.getPageOffset = getPageOffset; this.getLinearSpacialHash = getLinearSpacialHash; this.getVerticallyVisiblePixels = getVerticallyVisiblePixels; this.getViewportHeight = getViewportHeight; this.getViewportWidth = getViewportWidth; this.isElementNotHidden = isElementNotHidden; this.isElementInViewport = isElementInViewport; this.Visible = Visible; ]); }, ]; 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",fvar 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