1092 lines
181 KiB
HTML
1092 lines
181 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US" class="no-js">
|
||
<head>
|
||
<meta name="turbo-visit-control" content="reload">
|
||
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<meta name="theme-color" content="#d8352a">
|
||
<meta name="msapplication-navbutton-color" content="#d8352a">
|
||
<meta charset="utf-8">
|
||
<meta property="fb:app_id" content="127105130696839">
|
||
<meta name="current-region" content="us">
|
||
<meta http-equiv="Content-Language" content="en-US">
|
||
<meta name="description" content="Background On the morning of Tuesday, May 23 there was a mood of excitement within the Australian team of The Conversation as donations from generous supporters began to roll in. The annual appeal for…" />
|
||
<meta name="pubdate" content="20170822" />
|
||
<meta name="commissioning-region" content="au" />
|
||
<meta name="searchtype" content="post" />
|
||
<meta name="original-source" content="https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994" />
|
||
|
||
|
||
<meta name="author" content="Ben MacLeod" />
|
||
<meta name="author" content="Keith Pitty" />
|
||
|
||
|
||
<meta property="og:site_name" content="The Conversation" />
|
||
<meta property="og:title" content="Mea culpa: Lessons learned from firefighting" />
|
||
<meta property="og:description" content="Background On the morning of Tuesday, May 23 there was a mood of excitement within the Australian team of The Conversation as donations from generous supporters began to roll in. The annual appeal for…" />
|
||
<meta property="og:type" content="article" />
|
||
<meta property="og:image" content="https://images.theconversation.com/files/182694/original/file-20170821-7959-pv49dr.jpg?ixlib=rb-4.1.1&rect=0%2C213%2C4912%2C2382&q=45&auto=format&w=1356&h=668&fit=crop" />
|
||
<meta property="og:updated_time" content="2021-10-26T04:12:34Z" />
|
||
<meta property="og:url" content="https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994" />
|
||
<meta property="article:publisher" content="https://facebook.com/ConversationEDU" />
|
||
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
<meta name="twitter:site" content="@ConversationEDU" />
|
||
|
||
|
||
|
||
|
||
<link rel="canonical" href="https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994" />
|
||
|
||
<meta property="fb:pages" content="176084152419221">
|
||
|
||
<meta name="fediverse:creator" content="@theconversationau@mastodon.social" />
|
||
|
||
<meta name="citation_doi" content="10.64628/AA.4jke6sxmg" />
|
||
<meta name="DC.Identifier" content="doi:10.64628/AA.4jke6sxmg" />
|
||
<script type="application/javascript">
|
||
window.PAGE_CONFIG = {
|
||
content_id: 79994,
|
||
content_title: "Mea culpa: Lessons learned from firefighting",
|
||
meta_pixel_id: 1392960898182692,
|
||
content_slug: 'mea-culpa-lessons-learned-from-firefighting-79994',
|
||
comments_closed_at: '2019-09-17T23:59:00Z',
|
||
subscriptionOptions: {},
|
||
topics: [],
|
||
sections: [],
|
||
promos_context: {
|
||
topic_ids: [],
|
||
section_ids: [1],
|
||
section_slugs: [],
|
||
collaborator_ids: [175640, 306810],
|
||
content_language: 'en',
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<script>
|
||
window.GTM = window.GTM || {}
|
||
window.GTM.pageType = "article"
|
||
window.GTM.ArticleData = {"article_id":"79994","article_tags":"","article_type":"free","author_id":"","author_name":"","content_category":"Home","feature_type":"post","headline":"mea culpa lessons learned from firefighting","publish_date":"2017-08-22","publish_time":"06:23"}
|
||
</script>
|
||
|
||
<script>
|
||
//<![CDATA[
|
||
|
||
window.public_path = "https://cdn.theconversation.com/static/tc/";
|
||
|
||
window.TC = {};
|
||
window.TC.Config = {"cookie_domain":".theconversation.com","image_cdn_domain":"images.theconversation.com","analytics_url":"https://analytics.theconversation.com?utm_source=theconversation.com\u0026utm_medium=website\u0026utm_campaign=content","sharejs_init_delay_ms":0,"recaptcha":{"enabled":true,"siteKey":"6Lf3Oc0UAAAAAIbME3Lv7iS7EVeuQzpru1Jbij5N"},"user_event_collector_url":"https://collector.theconversation.com","user_event_collector_enabled":true,"braze_sdk_endpoint":"sdk.iad-07.braze.com","braze_web_api_key":"4167e2dc-4292-41b6-b088-ec2fb8fca095","braze_web_sdk_enabled":false};
|
||
|
||
//]]>
|
||
</script>
|
||
<!-- refspec 78a3363df040167ede0256225190e56041faeb05 -->
|
||
<title>Mea culpa: Lessons learned from firefighting</title>
|
||
<style media="screen">
|
||
@keyframes (progress){to{background-position:-60px 0}}abbr,address,article,aside,audio,b,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,p,pre,q,samp,section,small,span,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,ul,var,video{background:transparent;border:0;font-size:100%;margin:0;outline:0;padding:0;vertical-align:baseline}body,html{height:100%;-webkit-overflow-scrolling:touch}table{border-collapse:separate;border-spacing:0}caption,td,th{font-weight:400;text-align:left}table,td,th{vertical-align:middle}blockquote:after,blockquote:before,q:after,q:before{content:""}blockquote,q{quotes:"" ""}img{-ms-interpolation-mode:bicubic}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}nav ol,nav ul{list-style:none}del{text-decoration:line-through}sup{vertical-align:super}sub,sup{font-size:smaller}sub{vertical-align:sub}abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help}input,select{vertical-align:middle}[class*=" icon-"],[class^=icon-],h1{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}@font-face{font-family:TCFont-Regular;font-style:normal;font-weight:400;src:url(https://cdn.theconversation.com/static/tc/stylesheets/carlton/fonts/tcfont-regular-240ec3466165a9dca0e2e03a86826a8f.eot);src:url(https://cdn.theconversation.com/static/tc/stylesheets/carlton/fonts/tcfont-regular-240ec3466165a9dca0e2e03a86826a8f.eot?#iefix) format("embedded-opentype"),url(https://cdn.theconversation.com/static/tc/stylesheets/carlton/fonts/tcfont-regular-532d4157b9218acfe24f3cbf53e9ff1d.woff) format("woff"),url(https://cdn.theconversation.com/static/tc/stylesheets/carlton/fonts/tcfont-regular-09ada1f4a901e5d04b72211da382781d.ttf) format("truetype")}[class*=" icon-"],[class^=icon-]{display:inline-block;font-family:TCFont-Regular;font-size:1.231em;font-style:normal!important;font-weight:400!important;position:relative;top:-.1em;vertical-align:middle;width:1.231em}[class*=" icon-"].icon-comments:before,[class^=icon-].icon-comments:before{content:""}[class*=" icon-"].icon-twitter:before,[class^=icon-].icon-twitter:before{color:#000;content:""}[class*=" icon-"].icon-email:before,[class^=icon-].icon-email:before{content:""}[class*=" icon-"].icon-facebook:before,[class^=icon-].icon-facebook:before{color:#3a5a93;content:""}[class*=" icon-"].icon-maximise:before,[class^=icon-].icon-maximise:before{content:""}[class*=" icon-"].icon-republish:before,[class^=icon-].icon-republish:before{content:""}[class*=" icon-"].icon-globe:before,[class^=icon-].icon-globe:before{content:""}[class*=" icon-"].icon-delete:before,[class^=icon-].icon-delete:before{content:""}[class*=" icon-"].icon-add:before,[class^=icon-].icon-add:before{content:""}[class*=" icon-"].icon-layout:before,[class^=icon-].icon-layout:before{content:""}[class*=" icon-"].icon-article-published:before,[class*=" icon-"].icon-article:before,[class*=" icon-"].icon-articles:before,[class^=icon-].icon-article-published:before,[class^=icon-].icon-article:before,[class^=icon-].icon-articles:before{content:""}[class*=" icon-"].icon-article-check:before,[class^=icon-].icon-article-check:before{content:""}[class*=" icon-"].icon-chart:before,[class^=icon-].icon-chart:before{content:""}[class*=" icon-"].icon-reader:before,[class^=icon-].icon-reader:before{content:""}[class*=" icon-"].icon-readers:before,[class^=icon-].icon-readers:before{content:""}[class*=" icon-"].icon-subtract:before,[class^=icon-].icon-subtract:before{content:""}[class*=" icon-"].icon-comment:before,[class^=icon-].icon-comment:before{content:""}[class*=" icon-"].icon-search:before,[class^=icon-].icon-search:before{content:""}[class*=" icon-"].icon-help:before,[class^=icon-].icon-help:before{content:""}[class*=" icon-"].icon-rss:before,[class^=icon-].icon-rss:before{color:#eb7f3e;content:""}[class*=" icon-"].icon-rss-non-coloured:before,[class^=icon-].icon-rss-non-coloured:before{content:""}[class*=" icon-"].icon-favourite:before,[class^=icon-].icon-favourite:before{content:""}[class*=" icon-"].icon-location:before,[class^=icon-].icon-location:before{content:""}[class*=" icon-"].icon-time:before,[class^=icon-].icon-time:before{content:""}[class*=" icon-"].icon-friend-of-tc:before,[class^=icon-].icon-friend-of-tc:before{content:""}[class*=" icon-"].icon-friend-of-tc-outer:before,[class^=icon-].icon-friend-of-tc-outer:before{content:""}[class*=" icon-"].icon-friend-of-tc-heart:before,[class^=icon-].icon-friend-of-tc-heart:before{content:""}[class*=" icon-"].icon-check:before,[class^=icon-].icon-check:before{content:""}[class*=" icon-"].icon-favourite-add:before,[class^=icon-].icon-favourite-add:before{content:""}[class*=" icon-"].icon-followed:before,[class*=" icon-"].icon-follows:before,[class^=icon-].icon-followed:before,[class^=icon-].icon-follows:before{content:""}[class*=" icon-"].icon-skype:before,[class^=icon-].icon-skype:before{content:""}[class*=" icon-"].icon-media-enquiries:before,[class*=" icon-"].icon-phone:before,[class*=" icon-"].icon-work-phone:before,[class^=icon-].icon-media-enquiries:before,[class^=icon-].icon-phone:before,[class^=icon-].icon-work-phone:before{content:""}[class*=" icon-"].icon-mobile:before,[class^=icon-].icon-mobile:before{content:""}[class*=" icon-"].icon-private:before,[class^=icon-].icon-private:before{content:""}[class*=" icon-"].icon-public:before,[class^=icon-].icon-public:before{content:""}[class*=" icon-"].icon-topics:before,[class^=icon-].icon-topics:before{content:""}[class*=" icon-"].icon-menu:before,[class^=icon-].icon-menu:before{content:""}[class*=" icon-"].icon-external-link:before,[class^=icon-].icon-external-link:before{content:""}[class*=" icon-"].icon-trash:before,[class^=icon-].icon-trash:before{content:""}[class*=" icon-"].icon-image:before,[class*=" icon-"].icon-picture:before,[class^=icon-].icon-image:before,[class^=icon-].icon-picture:before{content:""}[class*=" icon-"].icon-edit:before,[class^=icon-].icon-edit:before{content:""}[class*=" icon-"].icon-heading:before,[class^=icon-].icon-heading:before{content:""}[class*=" icon-"].icon-bold:before,[class^=icon-].icon-bold:before{content:""}[class*=" icon-"].icon-italic:before,[class^=icon-].icon-italic:before{content:""}[class*=" icon-"].icon-link:before,[class^=icon-].icon-link:before{content:""}[class*=" icon-"].icon-video:before,[class^=icon-].icon-video:before{content:""}[class*=" icon-"].icon-fullscreen:before,[class^=icon-].icon-fullscreen:before{content:""}[class*=" icon-"].icon-close-fullscreen:before,[class^=icon-].icon-close-fullscreen:before{content:""}[class*=" icon-"].icon-favourite-minus:before,[class^=icon-].icon-favourite-minus:before{content:""}[class*=" icon-"].icon-envelope:before,[class^=icon-].icon-envelope:before{content:""}[class*=" icon-"].icon-simple-check:before,[class^=icon-].icon-simple-check:before{content:""}[class*=" icon-"].icon-calendar:before,[class^=icon-].icon-calendar:before{content:""}[class*=" icon-"].icon-the-conversation:before,[class^=icon-].icon-the-conversation:before{content:""}[class*=" icon-"].icon-lock:before,[class^=icon-].icon-lock:before{content:""}[class*=" icon-"].icon-unlock:before,[class^=icon-].icon-unlock:before{content:""}[class*=" icon-"].icon-audio:before,[class^=icon-].icon-audio:before{content:""}[class*=" icon-"].icon-chevron-right:before,[class^=icon-].icon-chevron-right:before{content:""}[class*=" icon-"].icon-caret-down:before,[class^=icon-].icon-caret-down:before{content:""}[class*=" icon-"].icon-caret-left:before,[class^=icon-].icon-caret-left:before{content:""}[class*=" icon-"].icon-caret-right:before,[class^=icon-].icon-caret-right:before{content:""}[class*=" icon-"].icon-caret-up:before,[class^=icon-].icon-caret-up:before{content:""}[class*=" icon-"].icon-pastespecial:before,[class^=icon-].icon-pastespecial:before{content:""}[class*=" icon-"].icon-linkedin:before,[class^=icon-].icon-linkedin:before{color:#0181b2;content:""}[class*=" icon-"].icon-pause:before,[class^=icon-].icon-pause:before{content:""}[class*=" icon-"].icon-cog:before,[class^=icon-].icon-cog:before{content:""}[class*=" icon-"].icon-orcid:before,[class^=icon-].icon-orcid:before{color:#a6ce39;content:""}[class*=" icon-"].icon-music:before,[class^=icon-].icon-music:before{content:""}[class*=" icon-"].icon-print:before,[class^=icon-].icon-print:before{content:""}[class*=" icon-"].icon-google-plus:before,[class^=icon-].icon-google-plus:before{color:#de4931;content:""}[class*=" icon-"].icon-home:before,[class^=icon-].icon-home:before{content:""}[class*=" icon-"].icon-facebook-simple:before,[class^=icon-].icon-facebook-simple:before{color:#3a5a93;content:""}[class*=" icon-"].icon-tag:before,[class^=icon-].icon-tag:before{content:""}[class*=" icon-"].icon-left-guillemet:before,[class^=icon-].icon-left-guillemet:before{content:""}[class*=" icon-"].icon-input:before,[class^=icon-].icon-input:before{content:""}[class*=" icon-"].icon-whatsapp:before,[class^=icon-].icon-whatsapp:before{color:#25d466;content:""}[class*=" icon-"].icon-fb-messenger:before,[class^=icon-].icon-fb-messenger:before{color:#0084ff;content:""}[class*=" icon-"].icon-youtube:before,[class^=icon-].icon-youtube:before{color:red;content:""}[class*=" icon-"].icon-bluesky:before,[class^=icon-].icon-bluesky:before{color:#007aff;content:""}[class*=" icon-"].icon-instagram,[class^=icon-].icon-instagram{background:url(https://cdn.theconversation.com/static/tc/icons/instagram-61da2587d132b07e497473c38659d7b6.svg) no-repeat 50%}[class*=" icon-"].icon-instagram:before,[class^=icon-].icon-instagram:before{content:""}[class*=" icon-"].icon-mastodon,[class^=icon-].icon-mastodon{background:url(https://cdn.theconversation.com/static/tc/icons/mastodon-a163e886897f4408a0716f58c6c0cf93.svg) no-repeat 50%}[class*=" icon-"].icon-mastodon:before,[class^=icon-].icon-mastodon:before{content:""}[class*=" icon-"].icon-auth-facebook:before,[class^=icon-].icon-auth-facebook:before{color:#3a5a93;content:""}[class*=" icon-"].icon-auth-twitter:before,[class^=icon-].icon-auth-twitter:before{color:#000;content:""}[class*=" icon-"].icon-auth-linkedin:before,[class^=icon-].icon-auth-linkedin:before{color:#0181b2;content:""}[class*=" icon-"].icon-auth-google:before,[class^=icon-].icon-auth-google:before{color:#de4931;content:""}[class*=" icon-"].icon-auth-orcid:before,[class^=icon-].icon-auth-orcid:before{color:#a6ce39;content:""}.icon-combine .icon-friend-of-tc-heart{margin-top:.045em;position:absolute}span.icon-combine-heart{display:inline-block;font-size:inherit;height:inherit;padding-left:10px;position:relative}span.icon-combine-heart i{left:0;position:absolute;text-align:center;top:0}i.icon-conversation-red{color:#d8372c}.vivus-icon-examples li{float:left;height:25px;list-style:none;padding:10px 0;width:25%}@font-face{font-display:swap;font-family:Libre Baskerville;font-style:italic;font-weight:400;src:url(https://cdn.theconversation.com/static/tc/fonts/libre-baskerville-style-italic-weight-400-latin-ext-6a6b41d21e129354f33417064b8d4a1d.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Libre Baskerville;font-style:italic;font-weight:400;src:url(https://cdn.theconversation.com/static/tc/fonts/libre-baskerville-style-italic-weight-400-latin-c917d35400a593b8e74c0f6a1c24e003.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Libre Baskerville;font-style:normal;font-weight:400;src:url(https://cdn.theconversation.com/static/tc/fonts/libre-baskerville-style-normal-weight-400-latin-ext-a5932c7f332e83f51c689dfb2325c569.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Libre Baskerville;font-style:normal;font-weight:400;src:url(https://cdn.theconversation.com/static/tc/fonts/libre-baskerville-style-normal-weight-400-latin-501a90b418c10528cd4e9fc45b55caf4.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Libre Baskerville;font-style:normal;font-weight:700;src:url(https://cdn.theconversation.com/static/tc/fonts/libre-baskerville-style-normal-weight-700-latin-ext-0a7f182f58ebb982fecb2206ef5a689f.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Libre Baskerville;font-style:normal;font-weight:700;src:url(https://cdn.theconversation.com/static/tc/fonts/libre-baskerville-style-normal-weight-700-latin-d3368a18324d23d8bbce28b409aa3c1c.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:500;src:url(https://cdn.theconversation.com/static/tc/fonts/montserrat-style-normal-weight-500-latin-ext-f56a9178178fd708c83969c9acfae31d.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:500;src:url(https://cdn.theconversation.com/static/tc/fonts/montserrat-style-normal-weight-500-latin-45213f4b4267ee9022b826c40fd624b7.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:700;src:url(https://cdn.theconversation.com/static/tc/fonts/montserrat-style-normal-weight-700-latin-ext-0690570fff9ae7b3947bc4a16c41f163.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:700;src:url(https://cdn.theconversation.com/static/tc/fonts/montserrat-style-normal-weight-700-latin-7443ac01b9b96035d96cb9d3686e9346.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Noto Sans;font-style:italic;font-weight:400;src:url(https://cdn.theconversation.com/static/tc/fonts/noto-sans-style-italic-weight-400-latin-f0bef789f04913486f4b9e75b1611cf0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Noto Sans;font-style:normal;font-weight:400;src:url(https://cdn.theconversation.com/static/tc/fonts/noto-sans-style-normal-weight-400-latin-0f21a2f5d44e3ad76acb34710d7bc342.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Noto Sans;font-style:italic;font-weight:700;src:url(https://cdn.theconversation.com/static/tc/fonts/noto-sans-style-italic-weight-700-latin-28f68a5080307e934b594ff5a321d842.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Noto Sans;font-style:normal;font-weight:700;src:url(https://cdn.theconversation.com/static/tc/fonts/noto-sans-style-normal-weight-700-latin-cd29cc5db1bb68f9dd62bb6f2b250181.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Libre-Baskerville-fallback;font-style:normal;font-weight:400;size-adjust:115%;src:local("Georgia")}@font-face{font-family:Libre-Baskerville-fallback;font-style:italic;font-weight:400;size-adjust:105%;src:local("Georgia Italic")}@font-face{font-family:Libre-Baskerville-fallback;font-style:normal;font-weight:700;size-adjust:115%;src:local("Georgia")}@font-face{font-family:Montserrat-fallback;font-style:normal;font-weight:700;size-adjust:95%;src:local("Verdana Bold")}@font-face{font-family:Montserrat-fallback;font-style:normal;font-weight:500;size-adjust:105%;src:local("Verdana")}@media only screen and (max-width:599px){body{font-size:16px;height:100%;line-height:22px;width:100%}body #page-wrapper.overlay-visible{height:100%;overflow:hidden}body .handheld{display:block}body p{padding:0}body.pages-show .highlight-panel{display:none}body.pages-show .page-layout.section .handheld-analysis,body.pages-show .page-layout.section .series{display:block}body.pages-show .page-layout.section .handheld-ad,body.pages-show .page-layout.section .handheld-briefs{display:none}body.pages-show .page-layout.section.handheld-display-research .handheld-briefs,body.pages-show .page-layout.section.handheld-display-research .handheld-research{display:block}body.pages-show .page-layout.section.handheld-display-research #special_section,body.pages-show .page-layout.section.handheld-display-research .handheld-ad,body.pages-show .page-layout.section.handheld-display-research .series,body.pages-show .page-layout.section.handheld-display-research section#research-news .bordered{display:none}body.pages-show .page-layout.section.handheld-display-columns .handheld-ad,body.pages-show .page-layout.section.handheld-display-columns .handheld-columnists{display:block}body #analysis-and-comment .bordered,body #columnists .bordered,body #eb,body #editors-picks,body #members-footer,body #misc-sidebar,body #partners-footer,body #research-news .bordered,body .masthead-search,body.pages-show .page-layout.section.handheld-display-columns #special_section,body.pages-show .page-layout.section.handheld-display-columns .handheld-briefs,body.pages-show .page-layout.section.handheld-display-columns .series{display:none}body .wrapper{margin:0;padding-left:10px;padding-right:10px;width:auto}body.search-index #search_form #search-header{background:none;padding:0}body.search-index #search_form #search-header .search-form{padding-bottom:0}body.search-index #search_form #search-header .search-form label{box-sizing:border-box;padding:6px 0 0 8px}body.search-index #search_form #search-header .search-form input{-webkit-appearance:none;box-sizing:border-box;font-size:20px;min-width:100%;padding:4px 8px 4px 35px;width:100%}body.search-index #search_form #search-header .search-form input[type=submit]{left:-110%;position:absolute}body.search-index #search_form #search-header .search-form nav,body.search-index #search_form aside#search-sidebar{display:none}body.search-index #search_form section#search-results{margin-top:12px}body.search-index #search_form section#search-results h1{font-size:20px;text-align:left}body footer#footer{padding:5px 0}body footer#footer a{letter-spacing:normal;margin-right:10px}body footer#footer p.copyright{clear:both;float:none;font-size:12px;letter-spacing:normal;margin-bottom:0;padding:5px 0;text-align:center}body footer#footer p.copyright span{display:block}body footer#footer p.copyright span+span{margin-top:3px}body footer#footer p.copyright a{display:inline}body footer#footer p.copyright .comma{display:none}body #outer{padding-top:12px}body #outer>.wrapper{padding-bottom:0}body #outer .sidebar-link-list{display:none}body.pages .page-layout.section nav#tabbed-navigation{display:table}body h1.page-header{font-size:20px!important;line-height:1.3!important;width:100%}body h2{font-size:18px;line-height:1.3}body.partners.partners-index .partner article:after,body.partners.partners-index .partner:after{clear:both;content:".";display:block;font-size:0;height:0;visibility:hidden}body.info.info-contact_us #email tr th{border:0!important;display:block;padding-bottom:10px!important}body.info.info-contact_us #email tr td{border-bottom:1px solid #d7d7db;border-top:0!important;display:block;margin:0!important;padding-top:0!important}body article aside.share{clear:both}body article aside.share li{float:left;margin-right:5px}body article aside.share li .button{font-size:10px;margin-bottom:0;padding-right:8px}body .content-list figure{display:none}body.columns-show article{margin-bottom:1em}body.columns-show .pagination{font-size:.9em;margin-bottom:1em}}@media only screen and (min-width:1466px){html body .article-section article h2{font-size:20px}html body .article-section .lead-story h2{font-size:30px}html body .article-section .c-format h2{font-size:12px}html body.profiles-dashboards-show .metrics-wrapper .metrics-column{width:50%}html body .donations-video iframe{height:279px}}.vivus-grid-example{background-color:#212121;color:#fff;display:block;margin-bottom:20px;padding:20px;text-align:center}body{min-width:992px}.wrapper{margin:0 auto;position:relative;width:972px}.wrapper:after{clear:both;content:".";display:block;font-size:0;height:0;visibility:hidden}.wrapper [class*=" grid-"],.wrapper [class^=grid-]{float:left;margin-right:20px}.wrapper .grid-one{width:42px}.wrapper .grid-two{width:104px}.wrapper .grid-three{width:166px}.wrapper .grid-four{width:228px}.wrapper .grid-five{width:290px}.wrapper .grid-six{width:352px}.wrapper .grid-seven{width:414px}.wrapper .grid-eight{width:476px}.wrapper .grid-nine{width:538px}.wrapper .grid-ten{width:600px}.wrapper .grid-eleven{width:662px}.wrapper .grid-twelve{width:724px}.wrapper .grid-thirteen{width:786px}.wrapper .grid-fourteen{width:848px}.wrapper .grid-fifteen{width:910px}.wrapper .grid-sixteen{width:972px}.wrapper .grid-prepend-one{margin-left:62px}.wrapper .grid-prepend-two{margin-left:124px}.wrapper .grid-prepend-three{margin-left:186px}.wrapper .grid-prepend-four{margin-left:248px}.wrapper .grid-prepend-five{margin-left:310px}.wrapper .grid-prepend-six{margin-left:372px}.wrapper .grid-prepend-seven{margin-left:434px}.wrapper .grid-prepend-eight{margin-left:496px}.wrapper .grid-prepend-nine{margin-left:558px}.wrapper .grid-prepend-ten{margin-left:620px}.wrapper .grid-prepend-eleven{margin-left:682px}.wrapper .grid-prepend-twelve{margin-left:744px}.wrapper .grid-prepend-thirteen{margin-left:806px}.wrapper .grid-prepend-fourteen{margin-left:868px}.wrapper .grid-prepend-fifteen{margin-left:930px}.wrapper .grid-prepend-sixteen{margin-left:992px}.wrapper .grid-append-one{margin-right:62px}.wrapper .grid-append-two{margin-right:124px}.wrapper .grid-append-three{margin-right:186px}.wrapper .grid-append-four{margin-right:248px}.wrapper .grid-append-five{margin-right:310px}.wrapper .grid-append-six{margin-right:372px}.wrapper .grid-append-seven{margin-right:434px}.wrapper .grid-append-eight{margin-right:496px}.wrapper .grid-append-nine{margin-right:558px}.wrapper .grid-append-ten{margin-right:620px}.wrapper .grid-append-eleven{margin-right:682px}.wrapper .grid-append-twelve{margin-right:744px}.wrapper .grid-append-thirteen{margin-right:806px}.wrapper .grid-append-fourteen{margin-right:868px}.wrapper .grid-append-fifteen{margin-right:930px}.wrapper .grid-append-sixteen{margin-right:992px}.wrapper .grid-last{margin-right:0}.wrapper .grid-left{float:left}.wrapper .grid-right{float:right}@media only screen and (max-width:599px){body{min-width:100%}.wrapper,.wrapper .grid-eight,.wrapper .grid-eleven,.wrapper .grid-fifteen,.wrapper .grid-five,.wrapper .grid-four,.wrapper .grid-fourteen,.wrapper .grid-nine,.wrapper .grid-one,.wrapper .grid-seven,.wrapper .grid-six,.wrapper .grid-sixteen,.wrapper .grid-ten,.wrapper .grid-thirteen,.wrapper .grid-three,.wrapper .grid-twelve,.wrapper .grid-two{width:100%}.wrapper .grid-prepend-eight,.wrapper .grid-prepend-eleven,.wrapper .grid-prepend-fifteen,.wrapper .grid-prepend-five,.wrapper .grid-prepend-four,.wrapper .grid-prepend-fourteen,.wrapper .grid-prepend-nine,.wrapper .grid-prepend-one,.wrapper .grid-prepend-seven,.wrapper .grid-prepend-six,.wrapper .grid-prepend-sixteen,.wrapper .grid-prepend-ten,.wrapper .grid-prepend-thirteen,.wrapper .grid-prepend-three,.wrapper .grid-prepend-twelve,.wrapper .grid-prepend-two{margin-left:0}.wrapper .grid-append-eight,.wrapper .grid-append-eleven,.wrapper .grid-append-fifteen,.wrapper .grid-append-five,.wrapper .grid-append-four,.wrapper .grid-append-fourteen,.wrapper .grid-append-nine,.wrapper .grid-append-one,.wrapper .grid-append-seven,.wrapper .grid-append-six,.wrapper .grid-append-sixteen,.wrapper .grid-append-ten,.wrapper .grid-append-thirteen,.wrapper .grid-append-three,.wrapper .grid-append-twelve,.wrapper .grid-append-two{margin-right:0}}@media only screen and (min-width:1466px){body{min-width:1376px}.wrapper{width:1356px}.wrapper .grid-one{width:66px}.wrapper .grid-two{width:152px}.wrapper .grid-three{width:238px}.wrapper .grid-four{width:324px}.wrapper .grid-five{width:410px}.wrapper .grid-six{width:496px}.wrapper .grid-seven{width:582px}.wrapper .grid-eight{width:668px}.wrapper .grid-nine{width:754px}.wrapper .grid-ten{width:840px}.wrapper .grid-eleven{width:926px}.wrapper .grid-twelve{width:1012px}.wrapper .grid-thirteen{width:1098px}.wrapper .grid-fourteen{width:1184px}.wrapper .grid-fifteen{width:1270px}.wrapper .grid-sixteen{width:1356px}.wrapper .grid-prepend-one{margin-left:86px}.wrapper .grid-prepend-two{margin-left:172px}.wrapper .grid-prepend-three{margin-left:258px}.wrapper .grid-prepend-four{margin-left:344px}.wrapper .grid-prepend-five{margin-left:430px}.wrapper .grid-prepend-six{margin-left:516px}.wrapper .grid-prepend-seven{margin-left:602px}.wrapper .grid-prepend-eight{margin-left:688px}.wrapper .grid-prepend-nine{margin-left:774px}.wrapper .grid-prepend-ten{margin-left:860px}.wrapper .grid-prepend-eleven{margin-left:946px}.wrapper .grid-prepend-twelve{margin-left:1032px}.wrapper .grid-prepend-thirteen{margin-left:1118px}.wrapper .grid-prepend-fourteen{margin-left:1204px}.wrapper .grid-prepend-fifteen{margin-left:1290px}.wrapper .grid-prepend-sixteen{margin-left:1376px}.wrapper .grid-append-one{margin-right:86px}.wrapper .grid-append-two{margin-right:172px}.wrapper .grid-append-three{margin-right:258px}.wrapper .grid-append-four{margin-right:344px}.wrapper .grid-append-five{margin-right:430px}.wrapper .grid-append-six{margin-right:516px}.wrapper .grid-append-seven{margin-right:602px}.wrapper .grid-append-eight{margin-right:688px}.wrapper .grid-append-nine{margin-right:774px}.wrapper .grid-append-ten{margin-right:860px}.wrapper .grid-append-eleven{margin-right:946px}.wrapper .grid-append-twelve{margin-right:1032px}.wrapper .grid-append-thirteen{margin-right:1118px}.wrapper .grid-append-fourteen{margin-right:1204px}.wrapper .grid-append-fifteen{margin-right:1290px}.wrapper .grid-append-sixteen{margin-right:1376px}.wrapper .large-grid-one{width:66px}.wrapper .large-grid-two{width:152px}.wrapper .large-grid-three{width:238px}.wrapper .large-grid-four{width:324px}.wrapper .large-grid-five{width:410px}.wrapper .large-grid-six{width:496px}.wrapper .large-grid-seven{width:582px}.wrapper .large-grid-eight{width:668px}.wrapper .large-grid-nine{width:754px}.wrapper .large-grid-ten{width:840px}.wrapper .large-grid-eleven{width:926px}.wrapper .large-grid-twelve{width:1012px}.wrapper .large-grid-thirteen{width:1098px}.wrapper .large-grid-fourteen{width:1184px}.wrapper .large-grid-fifteen{width:1270px}.wrapper .large-grid-sixteen{width:1356px}.wrapper .large-grid-prepend-one{margin-left:86px}.wrapper .large-grid-prepend-two{margin-left:172px}.wrapper .large-grid-prepend-three{margin-left:258px}.wrapper .large-grid-prepend-four{margin-left:344px}.wrapper .large-grid-prepend-five{margin-left:430px}.wrapper .large-grid-prepend-six{margin-left:516px}.wrapper .large-grid-prepend-seven{margin-left:602px}.wrapper .large-grid-prepend-eight{margin-left:688px}.wrapper .large-grid-prepend-nine{margin-left:774px}.wrapper .large-grid-prepend-ten{margin-left:860px}.wrapper .large-grid-prepend-eleven{margin-left:946px}.wrapper .large-grid-prepend-twelve{margin-left:1032px}.wrapper .large-grid-prepend-thirteen{margin-left:1118px}.wrapper .large-grid-prepend-fourteen{margin-left:1204px}.wrapper .large-grid-prepend-fifteen{margin-left:1290px}.wrapper .large-grid-prepend-sixteen{margin-left:1376px}.wrapper .large-grid-append-one{margin-right:86px}.wrapper .large-grid-append-two{margin-right:172px}.wrapper .large-grid-append-three{margin-right:258px}.wrapper .large-grid-append-four{margin-right:344px}.wrapper .large-grid-append-five{margin-right:430px}.wrapper .large-grid-append-six{margin-right:516px}.wrapper .large-grid-append-seven{margin-right:602px}.wrapper .large-grid-append-eight{margin-right:688px}.wrapper .large-grid-append-nine{margin-right:774px}.wrapper .large-grid-append-ten{margin-right:860px}.wrapper .large-grid-append-eleven{margin-right:946px}.wrapper .large-grid-append-twelve{margin-right:1032px}.wrapper .large-grid-append-thirteen{margin-right:1118px}.wrapper .large-grid-append-fourteen{margin-right:1204px}.wrapper .large-grid-append-fifteen{margin-right:1290px}.wrapper .large-grid-append-sixteen{margin-right:1376px}}#page-wrapper,body,html{height:100%}body{background-color:#fff;line-height:18px}body:has(dialog:modal#shared-dialog){overflow:hidden}#page-wrapper{display:flex;flex-direction:column}#outer{flex:1;padding-top:48px}#outer>.wrapper{padding-bottom:48px}#footers{flex-shrink:0}.handheld{display:none}h1 a:hover{text-decoration:none}div.crop{overflow:hidden}table.grid td,table.grid tr{border-bottom:1px solid #000}:not(.tailwind) input::placeholder{color:#62626a}:not(.tailwind) input.placeholder{color:#62626a}:not(.tailwind) input:focus::placeholder{color:#d7d7db}:not(.tailwind) input:focus.placeholder{color:#d7d7db}.fluid-width-video-wrapper{margin-bottom:18px}audio{display:none;height:0;visibility:hidden;width:0}.placeholder-container{background-color:var(--background-color);position:relative}.placeholder-container:before{content:"";float:left;height:0;margin-left:-1px;padding-top:var(--aspect-ratio-percent);width:1px}.placeholder-container:after{clear:both;content:"";display:table}.placeholder-container iframe,.placeholder-container img{bottom:0;height:100%;left:0;object-fit:cover;opacity:.1;position:absolute!important;right:0;top:0;transition:opacity .5s;width:100%}.placeholder-container iframe.lazyloaded,.placeholder-container img.lazyloaded{filter:blur(0);opacity:1}.placeholder-container iframe.native-lazy,.placeholder-container img.native-lazy{background:none;opacity:1}.placeholder-container img{background-color:#fff}.grecaptcha-badge{visibility:hidden}html{-webkit-text-size-adjust:100%}body,input,select,textarea{color:#000;font-family:Helvetica Neue,sans-serif;font-size:13px}span.nobr{white-space:nowrap}p{margin-bottom:18px}p.fine-print{font-size:11px!important}strong{font-weight:700}blockquote,em{font-style:italic}blockquote{clear:both;color:#4b4b4e;margin-bottom:18px;padding:9px 18px 12px;text-align:center}blockquote p:last-child,blockquote>blockquote:last-child{margin-bottom:0}blockquote,blockquote.left{border-left:4px solid #d7d7db;text-align:left}blockquote.right{border-right:4px solid #d7d7db;text-align:right}blockquote.feature{border-bottom:4px solid #f2f2f3;border-left:none;border-top:4px solid #f2f2f3;color:#000;font-family:LeagueGothicRegular,League Gothic,Impact,sans-serif;font-size:32px;font-style:normal;font-weight:700;margin:18px 0 36px;padding:30px 0 24px;position:relative;text-align:left;text-transform:uppercase}blockquote.feature p:first-child{text-indent:50px}blockquote.feature:before{color:#d7d7db;content:"“";font-size:125px;left:0;position:absolute;top:62px}blockquote.feature,blockquote.feature p{line-height:36px}blockquote.feature cite{font-size:24px}blockquote.feature cite:before{content:"— "}blockquote cite{color:#4b4b4e;font-style:normal}blockquote,h1,h2,h3,h4,h5,h6{-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;-ms-text-rendering:optimizeLegibility;-o-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}h1.legacy.slammed,h2.slammed,h3.slammed,h4.legacy.slammed,h5.slammed,h6.slammed{margin-bottom:0}h1.legacy.border,h2.border,h3.border,h4.legacy.border,h5.border,h6.border{border:0;border-bottom:1px solid #d7d7db;padding-bottom:.33em}h1.legacy{font-size:28px;font-weight:700;line-height:36px;margin-bottom:18px}h1.legacy.page-header{border-bottom:1px solid #d7d7db;margin-bottom:36px;padding-bottom:9px}h1.legacy.page-header span{color:#d7d7db}h2{font-size:23px}h2,h3{font-weight:700;margin-bottom:12px}h3{color:#000;font-size:15px;line-height:18px}h4.legacy{color:#000;font-size:10px;letter-spacing:.12em;margin-bottom:10px;text-transform:uppercase}h6{color:#d7d7db}hr{border:none;border-top:1px solid #d7d7db;clear:both;margin-bottom:18px}.link,a{color:#085d91;outline:none;text-decoration:none}.link:hover,a:hover{color:#003461;text-decoration:none}.link:focus,a:focus{outline:none}.link:focus-visible,a:focus-visible{outline:auto;outline-offset:.125rem}.link:visited,a:visited{color:#4b4b4e}.link:visited:hover,a:visited:hover{color:#085d91}nav ol li,nav ul li{list-style:none;margin-left:0}ul li{margin-left:0}ul.fine-print li{font-size:11px}ul.semantic li{list-style-type:none;margin-left:0}ol li{margin-left:0}ol.fine-print li{font-size:11px}ol.semantic li{list-style-type:none;margin-left:0}dl dt{clear:left;float:left;font-weight:700}dl dd{float:left;margin-left:1em;text-align:left}.league-gothic{font-family:LeagueGothicRegular,League Gothic,Impact,sans-serif;font-size:30px;font-size-adjust:.455;font-weight:400;line-height:40px;text-rendering:optimizeLegibility}.meslo{font-family:MesloLGMDZ,Monaco,monospace}.figure,figure{display:block;position:relative}.figure:after,figure:after{clear:both;content:".";display:block;font-size:0;height:0;visibility:hidden}.figure iframe,figure iframe{display:block}.figure .figcaption,.figure figcaption,figure .figcaption,figure figcaption{color:#212121;display:block;font-size:13px;line-height:18px;padding-top:6px}.figure .figcaption a,.figure figcaption a,figure .figcaption a,figure figcaption a{font-weight:400!important}.figure .figcaption .attribution,.figure .figcaption .attribution a,.figure figcaption .attribution,.figure figcaption .attribution a,figure .figcaption .attribution,figure .figcaption .attribution a,figure figcaption .attribution,figure figcaption .attribution a{color:#212121}.figure .figcaption .attribution a:focus,.figure .figcaption .attribution a:hover,.figure figcaption .attribution a:focus,.figure figcaption .attribution a:hover,figure .figcaption .attribution a:focus,figure .figcaption .attribution a:hover,figure figcaption .attribution a:focus,figure figcaption .attribution a:hover{color:#085d91}article header p.byline{color:#4b4b4e;font-size:11px;line-height:18px;margin-bottom:0;padding:2px 0}article header p.byline a:hover{text-decoration:underline}.callout{background:#f2f2f3;border-top:4px solid #d7d7db;color:#000;display:block;margin:1em 0;padding:.5em 1em}.right{float:right}.left{float:left}.clear{clear:both}.clear-left{clear:left}.clear-right{clear:right}.clearfix:after,.clearfix:before{content:" ";display:block;height:0;visibility:hidden}.clearfix:after{clear:both}.clearfix{zoom:1}@keyframes tc-flash-pulse{40%{transform:scale(1)}47%{transform:scale(1.03)}55%{transform:scale(1)}to{transform:scale(1)}}.information{background:#f2f2f3 url(https://cdn.theconversation.com/static/tc/icons/alert-instructions-76f48e944055d94f9ad902aca4ffe1f1.png) no-repeat 15px 13px;border-radius:2px;color:#4b4b4e;padding:12px 12px 12px 42px}.information a{color:inherit;font-weight:700}.information p{margin-bottom:0}.information p+p{margin-top:1em}.information .button{margin:-3px 6px}.information ul{list-style-position:inside}.information.prominent{background-color:#f2f2f3;border:1px solid #d7d7db}.information.success{background-color:#29a37a;background-image:url(https://cdn.theconversation.com/static/tc/icons/alert-success-cefcd0dc236e8d3c0a77863b29040399.png);color:#fff}.information.error{background-color:#d8372c;background-image:url(https://cdn.theconversation.com/static/tc/icons/alert-error-f95893328ecf3dd6c51eba085c089084.png);color:#fff}.information.warning{background-color:#ffda75;background-image:url(https://cdn.theconversation.com/static/tc/icons/alert-information-30e614f3f403049753170ccd98ce7053.png);color:#000}.formtastic .information{padding:12px 12px 12px 42px}p.flash{animation-duration:5s;animation-iteration-count:infinite;animation-name:tc-flash-pulse;animation-timing-function:ease-in-out;backface-visibility:hidden;background-color:#f2f2f3;border:1px solid #d7d7db;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:none;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);color:#000;filter:url(https://cdn.theconversation.com/static/tc/"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='grayscale'><feColorMatrix type='matrix' values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0'/></filter></svg>#grayscale");font-size:13px;left:50%;margin-left:-240px;padding:10px 20px;position:fixed;text-align:center;top:0;transform-style:preserve-3d;width:440px;z-index:30000}@media only screen and (max-width:599px){p.flash{margin-left:-37%;padding:10px 2%;width:70%}}p.flash.fold-to-top{top:-200px;transition:top .5s}p.flash.show{top:0;transition:top .5s}p.flash.notice{background-color:#29a37a;border-color:#29a37a;color:#fff;font-weight:700}p.flash.warning{background-color:#ffda75;border-color:#ffda75}p.flash.alert{background-color:#d8372c;border-color:#d8372c;color:#fff;font-weight:700}.region-select{background:#fff;border:1px solid #d7d7db;border-radius:.25rem;float:left;height:28px;margin:10px 10px 0 0;overflow:hidden;position:relative;width:140px}.region-select:has(select:focus-visible){outline:2px solid #000;outline-offset:4px}.region-select:after{bottom:0;color:#d7d7db;content:"";font-family:TCFont-Regular;line-height:2;position:absolute;right:10px;top:0}.region-select select{appearance:none;-moz-outline:none;-moz-user-focus:none;background:transparent;border:none;box-shadow:none;color:#383838;display:block;font-size:inherit;height:28px;outline:none;padding:5px 7px;position:absolute;text-indent:.01px;text-overflow:"";width:120%;z-index:1}.region-select select:-moz-focusring{color:transparent}.region-select select:-moz-focusring:focus-visible{color:#383838}.region-select select::-ms-expand{display:none}.search-form legend{display:none}.search-form .input-wrapper{position:relative}.search-form .input-wrapper input[type=search],.search-form .input-wrapper input[type=text],.search-form .input-wrapper label{display:block;font-size:12px;line-height:16px}.search-form .input-wrapper label{color:#4b4b4e;padding:8px 0 0 12px;position:absolute;z-index:3}.search-form .input-wrapper label i:before{color:#4b4b4e;font-size:14px;left:-4px;position:relative;top:0}.search-form .input-wrapper input[type=search],.search-form .input-wrapper input[type=text]{background-color:#fff;border:1px solid #d7d7db;border-radius:2px;min-width:280px;padding:7px 6px 6px 26px;position:relative}.search-form .input-wrapper input[type=search]:focus,.search-form .input-wrapper input[type=text]:focus{border-color:#293299;outline:none}#small-sidebar{background:#fff;background-clip:padding-box;border-top:46px solid transparent;box-sizing:border-box;display:none;font-family:Noto Sans,sans-serif;height:0;overflow-y:auto;position:absolute;top:0;transition:height .55s cubic-bezier(.32,.08,.24,1);width:100%;z-index:11;-webkit-overflow-scrolling:touch}#small-sidebar.visible{height:100%}#small-sidebar.visible .small-sidebar-group{opacity:1;top:0}#small-sidebar-close-button,#small-sidebar-open-button{color:#383838;display:none;font-family:Noto Sans,sans-serif;font-size:14px;font-weight:700;line-height:46px;padding:0 12px;position:absolute;top:auto;transition:opacity .275s}#small-sidebar-close-button.v2,#small-sidebar-open-button.v2{background-color:#fff;border:none;display:initial;line-height:0;padding:8px;top:auto}#small-sidebar-open-button{opacity:1;z-index:41}#small-sidebar-close-button,#small-sidebar-open-button.visible{opacity:0;z-index:40}#small-sidebar-close-button.visible{opacity:1;z-index:41}.small-sidebar-editions .region-select{border:none;box-sizing:border-box;height:33px;margin:0;width:100%}.small-sidebar-editions .region-select:after{color:#727272;line-height:1em;padding:10px;pointer-events:none;right:0;top:0}.small-sidebar-editions select{font-size:15px;height:33px;padding:0 4px}#small-sidebar-search form{position:relative}#small-sidebar-search input{border:none;border-radius:.25rem;box-sizing:border-box;font-size:15px;height:33px;width:100%}#small-sidebar-search button{background:none;border:none;border-radius:2px;color:#fff;cursor:pointer;height:29px;padding:7px 0;position:absolute;right:2px;top:2px;transition:background .3s;width:33px}#small-sidebar-search button .icon-search{color:#727272;font-size:22px}#small-sidebar-search input,.small-sidebar-editions .region-select{border:1px solid #d7d7db;border-radius:.25rem;float:none;height:auto;width:100%}#small-region-select-dropdown,#small-sidebar-search input{font-family:Noto Sans,sans-serif;font-size:14px;height:auto;padding:10px 12px;position:static;width:100%}#small-region-select-dropdown:focus-visible,#small-sidebar-search input:focus-visible{outline:auto}.small-sidebar-group,.small-sidebar-transition-group{opacity:0;padding:12px;position:relative;top:-50px;transition:opacity 1.1s cubic-bezier(.32,.08,.24,1) .198s,top .55s cubic-bezier(.32,.08,.24,1)}.small-sidebar-group:after,.small-sidebar-transition-group:after{clear:both;content:".";display:block;font-size:0;height:0;visibility:hidden}.small-sidebar-group+.small-sidebar-group{margin-top:0}.small-sidebar-group h3{color:#383838;font-size:14px;font-weight:700;line-height:1;margin:0 0 8px;padding:0}.small-sidebar-group h3:after{clear:both;content:".";display:block;font-size:0;height:0;visibility:hidden}.small-sidebar-group ul{list-style:none}.small-sidebar-group li{margin:5px 0 0}.small-sidebar-group a{color:#383838;display:block;font-size:20px;font-weight:700;line-height:1;margin:0 0 .8em;padding:.2em 0;position:relative}.small-sidebar-group a.active{border-left:6px solid #d7d7db;margin-left:-12px;padding-left:6px}.small-sidebar-group .icon-chevron-right{font-size:14px;line-height:1;position:absolute;right:2px;top:10px}.sections-sidebar-group a{font-family:Montserrat,sans-serif}@media only screen and (max-width:599px){#small-sidebar,#small-sidebar-close-button,#small-sidebar-open-button{display:block}}.content-authors{font-size:12px}.content-authors h3{font-size:11px}.content-authors a{font-weight:700}.content-authors .institution_name{color:#4b4b4e;font-weight:400}.content-authors-synopsis{display:none}.content-authors-synopsis i{border:1px solid #d7d7db;border-radius:50%;color:#4b4b4e;height:16px;line-height:16px;margin-right:6px;text-align:center;width:16px}.content-authors-synopsis .icon-caret-up{display:none}.content-authors-group{margin-bottom:36px}.content-authors-group ol{list-style:none;padding-top:6px}.content-authors-group li{clear:left}.content-authors-group li+li{margin-top:24px}.content-authors-group img{border-radius:50%;display:block;float:left;margin:0 12px 18px 0;width:48px}.content-post .team-blog .content-authors-group img{display:block}.content-post .content-authors-group img{display:none}.content-post .content-authors-group .role{margin-left:0}.content-authors-group .role{color:#4b4b4e;font-size:11px;line-height:1.4;margin-left:60px}@media only screen and (max-width:599px){.content-authors h3{margin-left:0}.content-authors-synopsis{display:block;margin-bottom:12px}.content-authors-group{display:none}.content-authors-group img{margin-left:0}.open .icon-caret-down{display:none}.open .icon-caret-up{display:inline-block}.open .content-authors-group{display:block}}@media only screen and (min-width:1466px){.content-authors-group .role{line-height:1.4}}.content-body{font-family:Libre Baskerville,serif;font-size:18px;line-height:1.6;padding-bottom:12px}.content-body .figcaption a,.content-body a,.content-body figcaption a{color:#4b4b4e;overflow-wrap:break-word;text-decoration:underline;white-space:pre-wrap}.content-body .figcaption a:hover,.content-body a:hover,.content-body figcaption a:hover{color:#293299}.content-body .figcaption a:visited,.content-body a:visited,.content-body figcaption a:visited{color:#4b4b4e}.content-body .figcaption a:visited:hover,.content-body a:visited:hover,.content-body figcaption a:visited:hover{color:#293299}.content-body blockquote{border-left:8px solid #d7d7db}.content-body ol,.content-body ul{margin-bottom:18px;padding-left:2em}.content-body table{border:1px solid #d7d7db;border-collapse:collapse;border-spacing:0;empty-cells:show;font-family:Helvetica Neue,sans-serif;font-size:13px;margin-bottom:18px;width:100%}.content-body table thead th{font-weight:700;vertical-align:top}.content-body table tbody td,.content-body table thead th{border:1px solid #d7d7db;padding:.5em 1em}.content-body figure{margin-bottom:18px}.content-body figure table{margin-bottom:0}.content-body figure.align-right{clear:right;float:right;margin-left:20px;width:237px}.content-body figure.align-left{clear:left;float:left;margin-right:20px;width:237px}.content-body figure.align-center img{width:100%}.content-body figure a,.content-body figure img{display:block;max-width:100%;text-decoration:none}.content-body figure figcaption{color:#4b4b4e;cursor:default;font-family:Helvetica Neue,sans-serif}.content-body figure figcaption a{display:inline}.content-topics{margin-bottom:12px}.content-topics ul{margin-left:25px}@media only screen and (max-width:599px){.content-body{font-size:16px;line-height:1.6}.content-body blockquote{margin-left:-10px}.content-body figure.align-left,.content-body figure.align-right{margin-bottom:12px;width:100%}.content-body figure.align-left img,.content-body figure.align-right img{width:100%}}.content-column-header{margin-top:1px;position:relative}.content-column-header .column-header{background-color:#f2f2f3;border-bottom:1px solid #e5e5e6;color:#383838;display:block;height:118px}.content-column-header .column-header:after{clear:both;content:".";display:block;font-size:0;height:0;visibility:hidden}.content-column-header .column-header:hover h3{text-decoration:underline}.content-column-header .content-column-feed{cursor:pointer;display:block;padding-top:5px;position:absolute;right:0;text-align:center;top:18px;z-index:7}.content-column-header .content-column-feed-itunes{top:54px}.content-column-header img{border:1px solid #fff;border-radius:50%;float:left;margin-top:15px;width:90px}.content-column-header h3{font-size:27px;padding-top:40px}@media only screen and (max-width:599px){.content-column-header .column-header{height:auto}.content-column-header .content-column-feed{right:10px}.content-column-header .content-column-feed span{display:none}.content-column-header .content-column-image{position:absolute}.content-column-header .content-column-image img{width:60px}.content-column-header .content-column-title{float:none;margin-left:80px;margin-right:45px;width:auto}.content-column-header h3{font-size:22px;line-height:1.2;margin-bottom:6px;padding-top:20px}.content-column-header .byline{font-size:12px;line-height:1.4;margin-bottom:20px}}.content-column-podcast-header{border-bottom:1px solid #d7d7db;color:#4b4b4e;font-size:18px;font-weight:700;padding:20px 0}.content-column-podcast-header a{color:inherit}.content-column-podcast-header a:hover{color:#212121;text-decoration:underline}.content-column-podcast-header .podcast-link-title{display:block;font-size:28px;line-height:28px;margin-top:18px}@media only screen and (max-width:599px){.podcast-info .image{display:none}}.content-disclosure-statement{margin-bottom:36px}.content-disclosure-statement h3{font-size:11px}.content-disclosure-statement p{margin-bottom:0}.content-disclosure-statement p+p{margin-top:18px}@media only screen and (max-width:599px){.content-disclosure-statement{display:none;line-height:1.4;margin-left:0}.open .content-disclosure-statement{display:block}}.content-header{padding-bottom:36px;padding-top:36px}.content-header-container h1{color:#383838;font-family:Montserrat,sans-serif;font-size:38px;line-height:normal;margin:0 0 12px}.content-header-container time{color:#4b4b4e;font-size:13px}.content-header-container .time-separator{color:#4b4b4e;font-size:11px;padding-left:2px;padding-right:4px}@media only screen and (max-width:599px){.content-header{padding-bottom:0;padding-top:12px}.content-header-container h1{font-size:28px;line-height:1.4;margin-bottom:0}.content-header-container .time-separator{display:none}.content-header-container .timestamps{padding:12px 0}.content-header-container time{display:block}}.content-lead-image{padding-bottom:36px}.content-lead-image img{display:block;width:100%}@media only screen and (max-width:599px){.content-lead-image{padding-bottom:0}}.content-partners{margin-bottom:36px}.content-partners a:hover{text-decoration:underline}.content-partners h3{font-size:11px}.content-partners .disclosure-logo{display:table;text-align:center;width:100%}.content-partners .logo{display:table-cell;vertical-align:middle;width:120px}.content-partners .funding-statement,.content-partners .partners-jobs-links{border-bottom:1px solid #f2f2f3;margin-bottom:12px;padding-bottom:12px}.content-partners img{margin:0 auto;max-width:120px;width:100%}.conversation-partners{margin-bottom:36px}.conversation-partners h3{font-size:11px}@media only screen and (max-width:599px){.content-partners{display:none;line-height:1.4;margin-left:0}.content-partners .disclosure-logo{display:none}.open .content-partners{display:block}.conversation-partners{display:none}.open .conversation-partners{display:block}}#article .content-sidebar{float:right;position:relative}.content-sidebar{font-size:11px;margin-bottom:60px}.content-sidebar section.column-authors,.content-sidebar section.column-banner{margin-left:0}.content-sidebar .related-topics a{font-weight:700}.content-sidebar .byline{color:#4b4b4e;font-size:13px;margin-bottom:12px;margin-top:12px}.column-banner{margin-bottom:36px}.column-banner .byline{color:#4b4b4e;font-size:11px;font-style:italic;margin-bottom:12px;margin-top:12px}.column-title{border-bottom:1px solid #f2f2f3;display:block;height:108px;margin-bottom:12px;margin-top:28px;position:relative}.column-title:after{border-bottom:1px solid #f2f2f3;bottom:-3px;content:"";position:absolute;width:100%}.column-title h3{bottom:1px;font-size:15px;margin:0;padding-bottom:12px;padding-right:80px;position:absolute}.column-title img{bottom:0;position:absolute;right:0}.content-doi h3{font-size:11px}@media only screen and (max-width:599px){.content-sidebar{margin-bottom:0;margin-left:0}.content-sidebar section{margin-left:0}.content-authors:has(~.content-translations){margin-right:60px}.content-doi{display:none}.open .content-doi{display:block}}.content-translations{margin-bottom:36px}.content-translations ul{list-style:none}.content-translations-toggle{display:none}@media only screen and (max-width:599px){.content-translations{position:absolute;right:0;top:0}.content-translations h3,.content-translations ul{display:none}.content-translations.open{background:#fff;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);min-width:50%;padding:10px;position:absolute;right:0;top:-10px;z-index:100}.content-translations.open h3,.content-translations.open ul{display:block}.content-translations.open .content-translations-toggle{top:0}.content-translations.open .content-translations-toggle .icon-caret-up{display:inline-block}.content-translations.open .content-translations-toggle .icon-caret-down{display:none}.content-translations-toggle{display:block;font-size:20px;height:40px;line-height:40px;position:absolute;right:0;text-align:center;top:-10px;width:60px}.content-translations-toggle img{vertical-align:middle;width:26px}.content-translations-toggle i{border:1px solid #b0b3ba;border-radius:50%;color:#b0b3ba;font-size:15px;height:16px;line-height:16px;text-align:center;width:16px}.content-translations-toggle .icon-caret-down{display:inline-block}.content-translations-toggle .icon-caret-up{display:none}}body.refresh-article #outer{padding:0}body.refresh-article .audio-player{margin-bottom:36px}body.refresh-article .has-desktop-magazine .content-header,body.refresh-article .has-desktop-magazine .content-lead-image{display:none}@media only screen and (max-width:599px){body.refresh-article .has-desktop-magazine .content-header,body.refresh-article .has-desktop-magazine .content-lead-image,body.refresh-article .normal .content-header,body.refresh-article .normal .content-lead-image{display:block}}.magazine{display:none;padding-bottom:24px}.has-desktop-magazine .magazine{display:flex;flex-direction:column}.magazine .image{height:600px}.magazine .wrapper{height:100%}.magazine .caption-wrapper{order:2}.magazine-title{width:100%}.magazine-title header{bottom:10px;position:absolute}.magazine-title .content-header-block{border-left:24px solid #fff;display:inline-block;left:-12px;line-height:normal;padding:4px 0 0;position:relative}.magazine-title h1{background-color:#fff;color:#383838;display:inline;left:-1px;line-height:normal;margin:0;padding:4px 0 6px;position:relative}.magazine-title strong{left:-12px;position:relative;z-index:10}.magazine-title time{background-color:#fff;color:#4b4b4e;display:inline-block;font-size:13px;margin:-1px 0 0 -12px;padding:6px 12px}.magazine-title .time-separator{display:none}@media only screen and (max-width:599px){.magazine{padding-bottom:0}.has-desktop-magazine .magazine{display:none}.has-mobile-magazine .magazine{display:block}.magazine .image{aspect-ratio:3/2;display:block;height:auto;width:100%}.magazine-header{height:auto}.magazine-title{position:relative}.magazine-title header{bottom:auto;position:relative}.magazine-title .content-header-block{border-left:none;display:block;left:auto}.magazine-title h1{background:transparent;display:block;padding-bottom:0}.magazine-title h1 strong{left:0}.magazine-title .timestamps{padding:12px 0}.magazine-title time{display:block;margin:0;padding:0}}.ultra-wide-lead-image{container-type:inline-size;position:relative}.ultra-wide-lead-image .dev-warning{display:none}@media only screen and (min-width:1801px){.ultra-wide-lead-image img.no-cdn{object-fit:cover}.ultra-wide-lead-image .dev-warning{display:inline-block}}.ultra-wide-lead-image img{aspect-ratio:3/2;background-color:#fafafb;height:auto;max-height:600px;object-fit:cover;width:100%}@media only screen and (max-width:1920px)and (min-width:1180px){.ultra-wide-lead-image img{aspect-ratio:3/1;height:33.33cqw}}@media only screen and (max-width:1179px)and (min-width:600px){.ultra-wide-lead-image img{aspect-ratio:2/1;height:50cqw}}@media only screen and (min-width:1801px){.ultra-wide-lead-image img{aspect-ratio:3/1;object-fit:contain;object-position:center}}.content-gallery-item{background:#f2f2f3;clear:both;margin:0 0 40px;padding:10px 10px 0}.content-gallery-item img{display:block;max-height:90%;max-width:100%}.content-gallery-item figcaption{color:#4b4b4e;font-size:15px;font-weight:700;line-height:1.4;padding:20px 20px 20px 50px;position:relative}.content-gallery-item figcaption .count{color:#4b4b4e;left:5px;position:absolute;text-align:right;width:35px}.content-gallery-item figcaption .source{color:#62626a;font-weight:700;padding-left:.75em}.content-gallery-item:last-child{cursor:n-resize}.content-gallery-cover.loading{background-color:rgba(0,0,0,.9)}.gallery-cover{background:rgba(0,0,0,.9);height:150%;left:0;transition:opacity .35s ease-out;z-index:1000}.gallery-content,.gallery-cover{bottom:0;opacity:1;position:fixed;top:0;width:100%}.gallery-content{overflow:scroll;padding-top:38px;transition:opacity .75s ease-in .3s;z-index:1001}.gallery-content .close-gallery{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);position:fixed;right:26px;top:10px}.gallery-content.hidden,.gallery-cover.hidden{opacity:0}.gallery-content-inner{color:#fff;margin:0 auto;width:75%}.gallery-content-inner header h1{color:#fff}.gallery-content-inner header time{color:#62626a}.gallery-content-inner .content-gallery-item{background:transparent;cursor:default}.gallery-content-inner .content-gallery-item img{background:#fff;margin:0;padding:5px}.gallery-content-inner .content-gallery-item:last-child{cursor:default}.gallery-content-inner .content-gallery-item:last-child img{cursor:n-resize}.gallery-content-inner .content-gallery-item figcaption{color:#fff}.gallery-content-inner .content-gallery-item figcaption .count,.gallery-content-inner .content-gallery-item figcaption .source{color:hsla(0,0%,100%,.6)}#article .post-navigation{clear:both;margin-bottom:20px}#article .post-navigation ol{display:flex;flex-wrap:wrap}#article .post-navigation li{display:flex;float:left;width:50%}#article .post-navigation li:first-child .post-navigation-option{margin-right:10px}#article .post-navigation li:first-child .post-navigation-option:before{content:"";left:-20px;padding-left:10px;text-align:left}#article .post-navigation li:last-child .post-navigation-option{margin-left:10px}#article .post-navigation li:last-child .post-navigation-option:before{content:"";padding-right:10px;right:-20px;text-align:right}#article .post-navigation .post-navigation-option{background:#fff;border:1px solid #d7d7db;position:relative;transform-style:preserve-3d;width:100%}#article .post-navigation .post-navigation-option:before{background:inherit;border:1px solid #d7d7db;border-radius:50%;font-family:TCFont-Regular;height:40px;line-height:40px;position:absolute;top:50%;transform:translateY(-50%);width:30px;z-index:1}#article .post-navigation .post-navigation-option .article{background:inherit;display:block;min-height:65px;padding:20px;position:relative;z-index:2}#article .post-navigation .empty{opacity:0}#article .post-navigation h4{letter-spacing:normal}#article .post-navigation time{color:#4b4b4e;display:block;font-size:11px}#article .content-sidebar.column-sidebar .content-authors{margin-top:60px}@media only screen and (max-width:599px){#article .content-sidebar.column-sidebar .content-authors{margin-top:12px}}
|
||
/*# sourceMappingURL=webpacked-critical-7014cd3ac90be967.css.map*/
|
||
</style>
|
||
|
||
<link rel="stylesheet" href="https://cdn.theconversation.com/static/tc/webpacked-tailwind-2b613ce7adfee84d.css" media="screen" />
|
||
<link rel="preload" href="https://cdn.theconversation.com/static/tc/webpacked-core-b750a13108b3ee2a.css" as="style" type="text/css" media="screen" onload="this.onload=null;this.rel='stylesheet'">
|
||
|
||
|
||
|
||
|
||
<link rel="stylesheet" href="https://cdn.theconversation.com/static/tc/webpacked-print-60cab83d7d983e7d.css" media="print" />
|
||
|
||
|
||
|
||
<link rel="icon" sizes="192x192" href="https://cdn.theconversation.com/static/tc/logos/web-app-logo-192x192-2d05bdd6de6328146de80245d4685946.png">
|
||
<link rel="shortcut icon" href="https://cdn.theconversation.com/static/tc/logos/favicon-cdcdc0dd51ffe5238483c3f27fd2eb57.ico">
|
||
<link rel="apple-touch-icon" href="https://images.theconversation.com/files/581997/original/9275d5c0-7dd5-4ddf-b50b-98d537e016f4.png">
|
||
|
||
|
||
<script type="didomi/javascript" data-vendor="googleana-4TXnJigR">
|
||
(function (w, d, s, l, i) {
|
||
w[l] = w[l] || [];
|
||
w[l].push({
|
||
'gtm.start':
|
||
new Date().getTime(), event: 'gtm.js'
|
||
});
|
||
var f = d.getElementsByTagName(s)[0],
|
||
j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : '';
|
||
j.async = true;
|
||
j.src =
|
||
'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
|
||
f.parentNode.insertBefore(j, f);
|
||
})(window, document, 'script', 'dataLayer', 'GTM-WX8PHK9');
|
||
</script>
|
||
|
||
<script>
|
||
window.GTM = window.GTM || {}
|
||
window.GTM.CustomDimensions = {"UserType":"Reader","RegionCode":"us","CommissioningRegion":"au","ContentType":"post"}
|
||
</script>
|
||
|
||
|
||
<script type="text/javascript" charset="utf-8">
|
||
window.didomiOnReady = window.didomiOnReady || [];
|
||
|
||
window.DIDOMI = {
|
||
ENABLED: true,
|
||
}
|
||
</script>
|
||
|
||
<script type="text/javascript">window.gdprAppliesGlobally=false;(function(){function a(e){if(!window.frames[e]){if(document.body&&document.body.firstChild){var t=document.body;var n=document.createElement("iframe");n.style.display="none";n.name=e;n.title=e;t.insertBefore(n,t.firstChild)}
|
||
else{setTimeout(function(){a(e)},5)}}}function e(n,r,o,c,s){function e(e,t,n,a){if(typeof n!=="function"){return}if(!window[r]){window[r]=[]}var i=false;if(s){i=s(e,t,n)}if(!i){window[r].push({command:e,parameter:t,callback:n,version:a})}}e.stub=true;function t(a){if(!window[n]||window[n].stub!==true){return}if(!a.data){return}
|
||
var i=typeof a.data==="string";var e;try{e=i?JSON.parse(a.data):a.data}catch(t){return}if(e[o]){var r=e[o];window[n](r.command,r.parameter,function(e,t){var n={};n[c]={returnValue:e,success:t,callId:r.callId};a.source.postMessage(i?JSON.stringify(n):n,"*")},r.version)}}
|
||
if(typeof window[n]!=="function"){window[n]=e;if(window.addEventListener){window.addEventListener("message",t,false)}else{window.attachEvent("onmessage",t)}}}e("__tcfapi","__tcfapiBuffer","__tcfapiCall","__tcfapiReturn");a("__tcfapiLocator");(function(e){
|
||
var t=document.createElement("script");t.id="spcloader";t.type="text/javascript";t.async=true;t.src="https://sdk.privacy-center.org/"+e+"/loader.js?target="+document.location.hostname;t.charset="utf-8";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(t,n)})("a1179046-1792-42d9-812f-3daba6c97289")})();</script>
|
||
|
||
|
||
<meta name="apple-mobile-web-app-title" content="The Conversation">
|
||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
||
<link rel="manifest" href="/manifest.json">
|
||
|
||
</head>
|
||
<body class="region_us content content-show refresh-article max-lg:relative">
|
||
<div id="small-sidebar" class="border-t-41! md:block! lg:hidden!" role="region" aria-label="Menu" aria-hidden="true">
|
||
<nav id="small-sidebar-search-v2" class="small-sidebar-transition-group md:max-w-screen">
|
||
<form action="/search" role="search" class="relative lg:my-4 flex basis-1/3 flex-row content-around">
|
||
<label for="site-search-small-layout" class="sr-only">Search analysis, research, academics…</label>
|
||
<input id="site-search-small-layout" type="search" name="q" class="tailwind font-sans w-full rounded-full border border-solid border-gray-300 box-border py-3 pl-5 pr-10 text-base text-black placeholder:text-gray-600/100!" placeholder="Search analysis, research, academics…">
|
||
|
||
<div class="absolute inset-y-0 right-3 flex items-center">
|
||
<button type="submit" aria-label="Search" class="mt-px cursor-pointer border-none bg-transparent flex items-center justify-center text-gray-800">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-6">
|
||
<path d="m21 21-4.34-4.34"></path>
|
||
<circle cx="11" cy="11" r="8"></circle>
|
||
</svg>
|
||
</button>
|
||
</div>
|
||
</form>
|
||
</nav>
|
||
|
||
<nav class="small-sidebar-transition-group small-sidebar-group sections-sidebar-group">
|
||
<ul>
|
||
<li class="home-page ">
|
||
<a class="active" href="/us">Home</a>
|
||
</li>
|
||
<li class="arts ">
|
||
<a class="" href="/us/arts">Arts <span><span title="and">+</span> Culture</span></a>
|
||
</li>
|
||
<li class="business ">
|
||
<a class="" href="/us/business">Economy</a>
|
||
</li>
|
||
<li class="education ">
|
||
<a class="" href="/us/education">Education</a>
|
||
</li>
|
||
<li class="environment ">
|
||
<a class="" href="/us/environment">Environment <span><span title="and">+</span> Energy</span></a>
|
||
</li>
|
||
<li class="ethics ">
|
||
<a class="" href="/us/ethics">Ethics <span><span title="and">+</span> Religion</span></a>
|
||
</li>
|
||
<li class="health ">
|
||
<a class="" href="/us/health">Health</a>
|
||
</li>
|
||
<li class="politics ">
|
||
<a class="" href="/us/politics">Politics <span><span title="and">+</span> Society</span></a>
|
||
</li>
|
||
<li class="technology ">
|
||
<a class="" href="/us/technology">Science <span><span title="and">+</span> Tech</span></a>
|
||
</li>
|
||
<li class="world ">
|
||
<a class="" href="/us/world">World</a>
|
||
</li>
|
||
<li class="podcasts ">
|
||
<a class="" href="/us/podcasts">Podcasts</a>
|
||
</li>
|
||
<li class="local last">
|
||
<a class="" href="/us/local">Local</a>
|
||
</li>
|
||
|
||
|
||
<li><a href="/us/espanol">En Español</a></li>
|
||
</ul>
|
||
</nav>
|
||
|
||
<nav class="small-sidebar-transition-group small-sidebar-group small-sidebar-editions md:max-w-screen" aria-label="Edition">
|
||
<h3>Edition</h3>
|
||
<fieldset class="region-select">
|
||
<select id="small-region-select-dropdown">
|
||
<option data-code="AFRICA" value="/africa">
|
||
Africa
|
||
</option>
|
||
<option data-code="AU" value="/au">
|
||
Australia
|
||
</option>
|
||
<option data-code="BR" value="/br">
|
||
Brasil
|
||
</option>
|
||
<option data-code="CA" value="/ca">
|
||
Canada
|
||
</option>
|
||
<option data-code="CA-FR" value="/ca-fr">
|
||
Canada (français)
|
||
</option>
|
||
<option data-code="CATALAN" value="/catalan">
|
||
Català
|
||
</option>
|
||
<option data-code="ES" value="/es">
|
||
España
|
||
</option>
|
||
<option data-code="EUROPE" value="/europe">
|
||
Europe
|
||
</option>
|
||
<option data-code="FR" value="/fr">
|
||
France
|
||
</option>
|
||
<option data-code="GLOBAL" value="/global">
|
||
Global
|
||
</option>
|
||
<option data-code="ID" value="/id">
|
||
Indonesia
|
||
</option>
|
||
<option data-code="NZ" value="/nz">
|
||
New Zealand
|
||
</option>
|
||
<option data-code="UK" value="/uk">
|
||
United Kingdom
|
||
</option>
|
||
<option data-code="US" value="/us" selected="selected">
|
||
United States
|
||
</option>
|
||
</select>
|
||
</fieldset>
|
||
</nav>
|
||
|
||
<nav class="small-sidebar-transition-group flex">
|
||
<a class="min-hitbox-44 max-w-40
|
||
inline-block box-border sm:hidden rounded-full
|
||
font-bold text-white text-xs hover:text-white visited:text-white items-center text-center
|
||
px-2 grow py-2 lg:px-5 lg:py-2
|
||
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-black bg-red-600 hover:bg-red-500" href="https://donate.theconversation.com/us?utm_source=theconversation.com&utm_medium=website&utm_campaign=mobile-menu">Donate</a>
|
||
|
||
</nav>
|
||
</div>
|
||
|
||
|
||
<div id="page-wrapper">
|
||
<section id="topbar" class="relative bg-white border-solid border-b border-gray-200 z-20">
|
||
<a class="sr-only focus:not-sr-only focus:absolute focus:top-2 focus:left-2 focus:z-50 focus:bg-white focus:py-2 focus:px-4 focus:text-black focus:border-2 focus:border-black focus:font-bold focus:shadow-lg text-base focus:outline-none" href="#main-content">Skip to content</a>
|
||
|
||
<button type="button" id="small-sidebar-open-button" class="v2 lg:hidden!" aria-label="Menu" aria-expanded="false" aria-controls="small-sidebar">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-6">
|
||
<path d="M4 5h16"></path>
|
||
<path d="M4 12h16"></path>
|
||
<path d="M4 19h16"></path>
|
||
</svg>
|
||
</button>
|
||
|
||
<button type="button" id="small-sidebar-close-button" class="v2 lg:hidden!" aria-label="Close" aria-expanded="false" aria-controls="small-sidebar">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-6">
|
||
<path d="M18 6 6 18"></path>
|
||
<path d="m6 6 12 12"></path>
|
||
</svg>
|
||
</button>
|
||
|
||
<nav class="mx-auto flex justify-between tc-container text-black relative h-10 lg:h-12 p-0!">
|
||
|
||
<div class="flex items-center grow flex-row flex-wrap max-lg:overflow-hidden">
|
||
<a id="topbar-home" aria-label="Go to homepage" class="text-gray-700 hover:text-gray-700! hover:bg-gray-50 flex h-full max-md:grow lg:-ml-3" href="/us">
|
||
<span class="hidden lg:block p-3">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-6">
|
||
<path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"></path>
|
||
<path d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path>
|
||
</svg>
|
||
</span>
|
||
|
||
<span class="h-full items-center flex grow">
|
||
<img class="grow max-h-5 min-w-32 w-auto md:h-5 ml-10 mr-1 lg:hidden" alt="The Conversation" src="https://cdn.theconversation.com/static/tc/logos/logo-en-deecd7f6345376bc1471b3c9cd047e76.svg" />
|
||
</span>
|
||
</a>
|
||
<div class="hidden lg:block h-full">
|
||
<div class="topbar-edition-v2 relative h-full border-solid border-r border-l border-gray-200">
|
||
<div class="flex h-full items-center">
|
||
<span class="ml-3 font-sans text-xs">Edition:</span>
|
||
|
||
<div class="inline-block h-full">
|
||
<button class="menu-button-open h-full flex items-center py-3.5 px-2.5 border-none bg-transparent cursor-pointer hover:bg-gray-50">
|
||
<span class="text-xs text-red-600 font-bold pr-2">United States</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="menu-caret-down size-4">
|
||
<path d="m6 9 6 6 6-6"></path>
|
||
</svg>
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="menu-caret-up size-4 hidden">
|
||
<path d="m18 15-6-6-6 6"></path>
|
||
</svg>
|
||
</button>
|
||
|
||
<div class="menu hidden relative">
|
||
<div class="absolute z-10 border-t border-solid border-white left-px right-0 -top-px"></div>
|
||
<ul class="absolute flex w-36 min-w-max flex-col border border-gray-200 border-solid bg-white w-36 shadow-lg -top-px">
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="Africa edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/africa">Africa</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="Australia edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/au">Australia</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="Brasil edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/br">Brasil</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="Canada edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/ca">Canada</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="Canada (français) edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/ca-fr">Canada (français)</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="Català edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/catalan">Català</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="España edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/es">España</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="Europe edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/europe">Europe</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="France edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/fr">France</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="Global edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/global">Global</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="Indonesia edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/id">Indonesia</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="New Zealand edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/nz">New Zealand</a>
|
||
</li>
|
||
<li class="inline-flex items-center text-xs transition text-gray-700 hover:bg-gray-50">
|
||
<a title="United Kingdom edition" class="text-black! w-full h-full py-3.5 px-2.5" href="/uk">United Kingdom</a>
|
||
</li>
|
||
</ul>s
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
<div class="my-1 md:mx-2 flex flex-row-reverse sm:flex-row">
|
||
<a class="min-hitbox-44 font-sans rounded-full m-1 bg-red-600 font-bold text-white hover:text-white hover:bg-red-500 visited:text-white hover:visited:text-white items-center px-3 py-1 lg:px-5 lg:py-2 focus:outline-none focus:ring-2 focus:ring-red-600 focus:ring-offset-2 hidden md:block" href="https://donate.theconversation.com/us?utm_source=theconversation.com&utm_medium=website&utm_campaign=topbar">Donate</a>
|
||
|
||
<a title="Sign up to receive our daily email newsletter" class="min-hitbox-44 font-sans rounded-full m-1 bg-black font-bold text-white hover:text-white hover:bg-gray-700 visited:text-white hover:text-white! hover:visited:text-white px-3 py-1 lg:px-5 lg:py-2 self-end focus:outline-none focus:ring-2 focus:ring-black focus:ring-offset-2" href="/us/newsletters?utm_campaign=System&utm_content=newsletter&utm_medium=TopBar&utm_source=theconversation.com">
|
||
Newsletters
|
||
</a></div>
|
||
|
||
</div>
|
||
|
||
<div id="topbar-dynamic-content-v2" class="items-center w-auto flex max-md:min-w-10">
|
||
</div>
|
||
</nav>
|
||
|
||
</section>
|
||
|
||
<div class="slot" data-id="14"></div>
|
||
<section class="text-center border-solid border-b border-gray-200 hidden lg:block">
|
||
<div class="hidden lg:block font-sans">
|
||
<section class="bg-masthead pt-5">
|
||
<div class="tc-container container mx-auto">
|
||
<header id="masthead-header" class="flex justify-between mx-auto">
|
||
<div class="flex flex-col items-start">
|
||
<a href="/us">
|
||
<img width="350" height="50" class="block h-auto max-w-full" alt="The Conversation" src="https://cdn.theconversation.com/static/tc/logos/logo-en-deecd7f6345376bc1471b3c9cd047e76.svg" />
|
||
</a> <div id="masthead-tagline" class="font-bold mt-1 text-2xs text-gray-700">Academic rigor, journalistic flair</div>
|
||
</div>
|
||
<form class="relative flex flex-row basis-1/3 content-around my-4 mx-2" role="search" action="/us/search" accept-charset="UTF-8" method="get">
|
||
<input type="search" name="q" id="q" value="" class="font-sans text-xs tailwind border-box border-gray-300 border border-solid rounded-full pl-5 pr-10 py-3 text-black placeholder-gray-600 focus:placeholder-gray-200 w-full" placeholder="Search analysis, research, academics…" />
|
||
<button type="submit" aria-label="Search" class="absolute m-2 right-0 border-none bg-transparent cursor-pointer text-gray-800">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-6" aria-hidden="true">
|
||
<path d="m21 21-4.34-4.34"></path>
|
||
<circle cx="11" cy="11" r="8"></circle>
|
||
</svg>
|
||
</button>
|
||
<button type="submit" class="hidden" value="Search"></button>
|
||
</form> </header>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<nav id="nav-v2" class="bg-masthead hidden text-3xs font-bold text-gray-700 lg:flex lg:text-2xs 2xl:text-sm">
|
||
<div class="border-box tc-container container mx-auto flex justify-start gap-2.5 2xl:gap-4">
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="Arts + Culture" href="/us/arts">Arts <span><span title="and">+</span> Culture</span></a>
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="Economy" href="/us/business">Economy</a>
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="Education" href="/us/education">Education</a>
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="Environment + Energy" href="/us/environment">Environment <span><span title="and">+</span> Energy</span></a>
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="Ethics + Religion" href="/us/ethics">Ethics <span><span title="and">+</span> Religion</span></a>
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="Health" href="/us/health">Health</a>
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="Politics + Society" href="/us/politics">Politics <span><span title="and">+</span> Society</span></a>
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="Science + Tech" href="/us/technology">Science <span><span title="and">+</span> Tech</span></a>
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="World" href="/us/world">World</a>
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="Podcasts" href="/us/podcasts">Podcasts</a>
|
||
<a class="font-sans border-b-4 pt-3 pb-2 text-black! hover:text-black! visited:text-black! border-solid border-transparent border-0 border-b-5 hover:border-red-600!" title="Local" href="/us/local">Local</a>
|
||
</div>
|
||
</nav>
|
||
|
||
</section>
|
||
|
||
|
||
<div id="outer" role="main">
|
||
<div id="main-content" tabindex="-1"></div>
|
||
<div id="flash">
|
||
<!-- Persistent live region for screen reader announcements -->
|
||
<span id="flash-announcer" role="alert" aria-live="assertive" aria-atomic="true" class="sr-only"></span>
|
||
|
||
|
||
</div>
|
||
|
||
<article id="article" class="content-post clearfix" data-id="79994" itemscope itemtype="http://schema.org/Article">
|
||
<section class="content-column-header">
|
||
<div class="wrapper">
|
||
<a class="button content-column-feed" href="https://theconversation.com/columns/building-the-conversation-534.atom">
|
||
<i class="icon-rss"></i>
|
||
<span>Subscribe</span>
|
||
</a> </div>
|
||
|
||
<a class="column-header" href="/columns/building-the-conversation-534">
|
||
<div class="wrapper">
|
||
<div class="content-column-image grid-two">
|
||
</div>
|
||
|
||
<div class="content-column-title grid-fourteen grid-last">
|
||
<h3><span>Building The Conversation</span></h3>
|
||
<p class="byline">From the developers who enable The Conversation</p>
|
||
</div>
|
||
</div>
|
||
</a></section>
|
||
|
||
<div class="wrapper" aria-owns="article-content article-sidebar">
|
||
<div class="content-header grid-twelve">
|
||
|
||
<header class="content-header-container grid-twelve large-grid-eleven">
|
||
<div>
|
||
<div class="content-header-block">
|
||
<h1 class="legacy entry-title instapaper_title" itemprop="headline">
|
||
<strong>
|
||
Mea culpa: Lessons learned from firefighting
|
||
</strong>
|
||
</h1>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="timestamps">
|
||
<time datetime="2017-08-22T06:23:26Z" itemprop="datePublished" content="2017-08-22T06:23:26Z">Published: August 22, 2017 2:23am EDT</time>
|
||
</div>
|
||
</header>
|
||
|
||
</div>
|
||
<aside id="article-sidebar" class="content-sidebar column-sidebar grid-four large-grid-four grid-last team-blog" aria-label="Article information">
|
||
|
||
<section class="content-authors">
|
||
<div class="content-authors-synopsis">
|
||
<a href="#" class="content-authors-toggle">
|
||
<i class="icon-caret-down"></i>
|
||
<i class="icon-caret-up"></i>
|
||
<span class="nobr">Ben MacLeod</span>, <em class="institution_name">The Conversation</em>, <span class="nobr">Keith Pitty</span>, <em class="institution_name">The Conversation</em>
|
||
</a>
|
||
</div>
|
||
|
||
<div class="content-authors-group">
|
||
<h3 aria-level="2" class="border">Authors</h3>
|
||
<ol>
|
||
<li class="vcard" id="author-177519" itemprop="author" itemscope="" itemtype="http://schema.org/Person">
|
||
<a rel="author" itemprop="url" class="hover:underline" href="/global/team#ben-macleod">
|
||
<img alt="" class="lazyload" data-src="https://storage.theconversation.com/e0ngixwyzhz7fq45guqr95e6mrji" src="https://cdn.theconversation.com/static/tc/author/width170_default-bea415b3a0223821a698f6e3f6d5ab99.jpg" itemprop="image">
|
||
<span class="fn author-name" itemprop="name">
|
||
Ben MacLeod
|
||
</span>
|
||
</a>
|
||
|
||
|
||
<p class="role">
|
||
Senior Developer
|
||
</p>
|
||
|
||
</li>
|
||
<li class="vcard" id="author-177507" itemprop="author" itemscope="" itemtype="http://schema.org/Person">
|
||
<img itemprop="image" alt="" src="https://storage.theconversation.com/575mma9yxxq4luzjf8t6wdc89juh" />
|
||
<span class="fn author-name" itemprop="name">Keith Pitty</span>
|
||
<p class="role">
|
||
Developer, The Conversation
|
||
</p>
|
||
</li>
|
||
|
||
</ol>
|
||
</div>
|
||
|
||
</section>
|
||
|
||
|
||
|
||
|
||
|
||
<section class="content-partners">
|
||
<h3 aria-level="2" class="border">Partners</h3>
|
||
|
||
|
||
|
||
|
||
|
||
<p><a href="/us/partners">View all partners</a></p>
|
||
</section>
|
||
|
||
<section class="content-doi">
|
||
<h3 aria-level="2" class="border">DOI</h3>
|
||
<p><a aria-label="Permanent DOI link for article, Mea culpa: Lessons learned from firefighting: 10.64628/AA.4jke6sxmg" href="https://doi.org/10.64628/AA.4jke6sxmg" class="hover:underline">https://doi.org/10.64628/AA.4jke6sxmg</a></p>
|
||
</section>
|
||
|
||
<section class="slot" data-id="16"></section>
|
||
</aside>
|
||
<div id="article-content" class="grid-twelve large-grid-eleven">
|
||
<figure class="content-lead-image grid-twelve large-grid-eleven">
|
||
<picture><img srcset="https://images.theconversation.com/files/182694/original/file-20170821-7959-pv49dr.jpg?ixlib=rb-4.1.1&q=75&auto=format&w=768&h=512&fit=crop&dpr=1, https://images.theconversation.com/files/182694/original/file-20170821-7959-pv49dr.jpg?ixlib=rb-4.1.1&q=50&auto=format&w=768&h=512&fit=crop&dpr=2 2x" data-id="182694" itemprop="image"></picture>
|
||
<figcaption>
|
||
|
||
<span class="attribution"><span class="source">Shutterstock</span></span>
|
||
</figcaption>
|
||
</figure>
|
||
|
||
<div class="top">
|
||
<aside class="grid-two w-full">
|
||
<div id="share-article-url" class="hidden">
|
||
https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994
|
||
</div>
|
||
<div id="native-share" class="clear-both flex-row sm:flex-col flex items-start gap-0 sm:gap-2 sm:items-left h-10 mb-2 w-full">
|
||
<div class="flex grow relative mr-2 h-10 bg-gray-50 border-none rounded-full pr-11 max-[300px]:hidden sm:hidden">
|
||
<div aria-hidden="true" id="share-article-url-display-mobile" class="bg-transparent border border-solid border-transparent! cursor-text rounded-l-full! w-0 grow text-xs overflow-hidden! truncate focus:text-clip text-black py-2.5 pl-3! pr-0! z-0">
|
||
https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994
|
||
</div>
|
||
<button aria-label="Copy article link" id="share-article-copy-url-mobile" class="bg-black border-none cursor-pointer rounded-full text-white absolute right-0 top-0 w-10 h-10 p-3 z-10 opacity-100 ease-in-out">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 ">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-4">
|
||
<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path>
|
||
<path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
|
||
</svg>
|
||
</button>
|
||
<div id="share-article-message-mobile" class="absolute top-0 bottom-0 right-0 bg-green-600 rounded-full flex! flex-row items-center text-center text-transparent py-2 leading-none w-10 text-xs opacity-0 transition-all duration-300 ease-in-out">
|
||
<span class="grow"></span>
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-4 mr-1">
|
||
<path d="M20 6 9 17l-5-5"></path>
|
||
</svg>
|
||
<span aria-hidden="true" class="leading-none text-xs text-left grow">
|
||
Link copied
|
||
</span>
|
||
</div>
|
||
</div>
|
||
<div class="sm:hidden">
|
||
<button id="share-article-native-mobile" class="bg-black border-none cursor-pointer text-white flex! flex-row shrink-0 items-center rounded-full text-center py-3 px-3 max-[300px]:grow relative">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 w-full">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="flex-none size-4 mr-1">
|
||
<circle cx="18" cy="5" r="3"></circle>
|
||
<circle cx="6" cy="12" r="3"></circle>
|
||
<circle cx="18" cy="19" r="3"></circle>
|
||
<line x1="8.59" x2="15.42" y1="13.51" y2="17.49"></line>
|
||
<line x1="15.41" x2="8.59" y1="6.51" y2="10.49"></line>
|
||
</svg>
|
||
<span class="leading-none text-xs font-bold mx-1 grow text-left">
|
||
Share article
|
||
</span>
|
||
</button>
|
||
</div>
|
||
<div class="hidden sm:flex sm:flex-col gap-2 items-end w-full ml-auto">
|
||
<div class="relative me-2">
|
||
<div>
|
||
<button id="share-article-dropdown-trigger-desktop" aria-label="Share article" class="bg-black border-none cursor-pointer text-white flex items-center rounded-full justify-center w-10 h-10 hover:bg-gray-800 hidden relative focus-visible:outline-offset-2">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 ">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="flex-none size-5">
|
||
<circle cx="18" cy="5" r="3"></circle>
|
||
<circle cx="6" cy="12" r="3"></circle>
|
||
<circle cx="18" cy="19" r="3"></circle>
|
||
<line x1="8.59" x2="15.42" y1="13.51" y2="17.49"></line>
|
||
<line x1="15.41" x2="8.59" y1="6.51" y2="10.49"></line>
|
||
</svg>
|
||
</button>
|
||
<div aria-hidden="true" class="hover tooltip left-full top-1/2 -translate-y-1/2 ms-1! m-0! px-2! py-1! bg-black! w-auto! rounded-lg! whitespace-nowrap opacity-0">
|
||
<p class="text-white text-xs" >Share article</p>
|
||
</div>
|
||
</div>
|
||
<div id="share-dropdown-desktop" class="absolute top-full left-0 mt-2 bg-white border border-solid border-gray-100 rounded-lg shadow-lg z-50 hidden min-w-[200px] flex flex-col gap-1 p-2">
|
||
<button id="share-dropdown-copy-link" class="flex items-center gap-2 p-2 bg-transparent hover:bg-gray-50 cursor-pointer text-sm rounded-md text-black border-none relative mb-1">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 w-full">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-5">
|
||
<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path>
|
||
<path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
|
||
</svg>
|
||
<span>Copy link</span>
|
||
</button>
|
||
<a class="email-button flex items-center gap-2 p-2 hover:bg-gray-50 cursor-pointer text-sm rounded-md text-black! relative mb-1" data-id="79994" target="_blank" rel="noopener" href="mailto:?subject=Mea%20culpa%3A%20Lessons%20learned%20from%20firefighting%20%E2%80%94%20The%20Conversation&body=Hi.%20I%20found%20an%20article%20that%20you%20might%20like%3A%20%22Mea%20culpa%3A%20Lessons%20learned%20from%20firefighting%22%20%E2%80%94%20https%3A%2F%2Ftheconversation.com%2Fmea-culpa-lessons-learned-from-firefighting-79994">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 w-full">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-5">
|
||
<path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z"></path>
|
||
<path d="m21.854 2.147-10.94 10.939"></path>
|
||
</svg>
|
||
<span>Email</span></a> <div class="border-t border-solid border-gray-100 -mx-2 my-1"></div>
|
||
<a class="bluesky-button flex items-center gap-2 p-2 hover:bg-gray-50 cursor-pointer text-sm rounded-md text-black! relative mb-1" data-url="https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994" data-id="79994" target="_blank" rel="noopener" href="https://bsky.app/intent/compose?text=Mea+culpa%3A+Lessons+learned+from+firefighting%0Ahttps%3A%2F%2Ftheconversation.com%2Fmea-culpa-lessons-learned-from-firefighting-79994%3Futm_source%3Dbluesky%26utm_medium%3Dbylineblueskybutton">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 w-full">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="19" fill="none" viewBox="0 0 20 19">
|
||
<path fill="currentColor" d="M4.335 2.06C6.628 3.82 9.095 7.387 10 9.302c.906-1.914 3.372-5.482 5.665-7.242C17.319.79 20-.192 20 2.934c0 .624-.35 5.245-.556 5.995-.713 2.607-3.315 3.272-5.629 2.87 4.045.704 5.074 3.034 2.852 5.365-4.22 4.427-6.066-1.11-6.54-2.53-.086-.26-.126-.381-.127-.278 0-.103-.041.019-.128.279-.473 1.419-2.318 6.956-6.539 2.53-2.222-2.332-1.193-4.662 2.852-5.366-2.314.402-4.916-.263-5.63-2.87C.35 8.179 0 3.559 0 2.934 0-.192 2.68.791 4.335 2.06"/></svg>
|
||
<span>Bluesky</span></a> <a class="facebook-button flex items-center gap-2 p-2 hover:bg-gray-50 cursor-pointer text-sm rounded-md text-black! relative mb-1" data-url="https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994" data-id="79994" target="_blank" rel="noopener" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Ftheconversation.com%2Fmea-culpa-lessons-learned-from-firefighting-79994%3Futm_source%3Dfacebook%26utm_medium%3Dbylinefacebookbutton">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 w-full">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 20 20">
|
||
<path fill="currentColor" d="M20 10.037C20 4.494 15.523 0 10 0S0 4.494 0 10.037c0 4.707 3.229 8.656 7.584 9.74v-6.673H5.522v-3.067h2.062V8.715c0-3.416 1.54-5 4.882-5 .634 0 1.727.125 2.174.25v2.78a13 13 0 0 0-1.155-.037c-1.64 0-2.274.623-2.274 2.244v1.085h3.267l-.561 3.067H11.21V20C16.164 19.4 20 15.168 20 10.037"/></svg>
|
||
<span>Facebook</span></a> <a class="whatsapp-button flex items-center gap-2 p-2 hover:bg-gray-50 cursor-pointer text-sm rounded-md text-black! relative mb-1" data-href="https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994" data-action="share/whatsapp/share" data-id="79994" target="_blank" rel="noopener" href="https://api.whatsapp.com/send?text=Mea+culpa%3A+Lessons+learned+from+firefighting+https%3A%2F%2Ftheconversation.com%2Fmea-culpa-lessons-learned-from-firefighting-79994%3Futm_source%3Dwhatsapp%26utm_medium%3Dbylinewhatsappbutton">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 w-full">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 20 20">
|
||
<path fill="currentColor" fill-rule="evenodd" d="M17.086 2.906A9.92 9.92 0 0 0 10.042 0C4.552 0 .085 4.445.084 9.91a9.85 9.85 0 0 0 1.329 4.954L0 20l5.28-1.378a10 10 0 0 0 4.758 1.206h.004c5.488 0 9.956-4.446 9.958-9.91a9.83 9.83 0 0 0-2.914-7.011m-7.044 15.248h-.003a8.3 8.3 0 0 1-4.213-1.148l-.302-.178-3.133.817.836-3.04-.197-.311A8.2 8.2 0 0 1 1.765 9.91c.002-4.541 3.715-8.236 8.28-8.236a8.24 8.24 0 0 1 5.852 2.416 8.17 8.17 0 0 1 2.422 5.827c-.002 4.542-3.715 8.237-8.277 8.237m4.54-6.169c-.249-.124-1.472-.722-1.7-.805-.229-.083-.394-.124-.56.124s-.643.806-.788.97c-.145.166-.29.187-.539.063s-1.05-.386-2.001-1.23c-.74-.656-1.24-1.467-1.384-1.715-.145-.248-.016-.382.109-.505.111-.111.248-.29.373-.434s.166-.248.249-.413.041-.31-.02-.434c-.063-.124-.56-1.342-.768-1.838-.202-.483-.407-.417-.56-.425a10 10 0 0 0-.477-.009.92.92 0 0 0-.663.31c-.229.248-.871.847-.871 2.066s.891 2.396 1.016 2.561c.124.166 1.754 2.667 4.25 3.74.594.255 1.057.407 1.419.521.596.19 1.138.162 1.567.099.478-.072 1.472-.6 1.68-1.178s.207-1.074.145-1.177c-.063-.103-.229-.166-.477-.29" clip-rule="evenodd"/></svg>
|
||
<span>WhatsApp</span></a> <a class="fb-messenger-button flex items-center gap-2 p-2 hover:bg-gray-50 cursor-pointer text-sm rounded-md text-black! relative mb-1" data-href="https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994" data-action="share/fb-messenger/share" data-id="79994" target="_blank" rel="noopener" href="https://www.facebook.com/dialog/send?app_id=127105130696839&link=https%3A%2F%2Ftheconversation.com%2Fmea-culpa-lessons-learned-from-firefighting-79994%3Futm_source%3Dfb_messenger%26utm_medium%3Dbylinefb_messenger_button&redirect_uri=https%3A%2F%2Ftheconversation.com%2Fmea-culpa-lessons-learned-from-firefighting-79994">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 w-full">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 20 20">
|
||
<path fill="currentColor" d="M10 0C4.367 0 0 4.126 0 9.7c0 2.916 1.195 5.434 3.14 7.175a.8.8 0 0 1 .27.57l.054 1.779a.8.8 0 0 0 1.122.707l1.985-.876a.8.8 0 0 1 .534-.04c.912.252 1.883.385 2.895.385 5.633 0 10-4.126 10-9.7S15.634 0 10 0m6.197 7.112-3.481 5.38a.59.59 0 0 1-.815.175L8.676 10.58a.37.37 0 0 0-.409.006l-3.635 2.507c-.53.366-1.18-.264-.83-.804l3.483-5.381a.59.59 0 0 1 .814-.174l3.226 2.087c.125.08.286.078.409-.006l3.634-2.507c.53-.366 1.18.264.83.804"/></svg>
|
||
<span>Messenger</span></a> <a class="linkedin-button flex items-center gap-2 p-2 hover:bg-gray-50 cursor-pointer text-sm rounded-md text-black! relative mb-1" data-url="https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994" data-id="79994" target="_blank" rel="noopener" href="http://www.linkedin.com/shareArticle?mini=true&source=The+Conversation&title=Mea+culpa%3A+Lessons+learned+from+firefighting&url=https%3A%2F%2Ftheconversation.com%2Fmea-culpa-lessons-learned-from-firefighting-79994%3Futm_source%3Dlinkedin%26utm_medium%3Dbylinelinkedinbutton">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 w-full">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 20 20">
|
||
<path fill="currentColor" fill-rule="evenodd" d="M17.777 0C19.005 0 20 .995 20 2.223v15.554A2.223 2.223 0 0 1 17.777 20H2.223A2.223 2.223 0 0 1 0 17.777V2.223C0 .995.995 0 2.223 0zM3.064 17.223h2.983v-9.63H3.064zm10.654-9.924c-2.044 0-2.905 1.59-2.905 1.59V7.594H7.954v9.63h2.86v-5.056c0-1.354.624-2.16 1.817-2.16 1.097 0 1.623.774 1.623 2.16v5.056h2.969v-6.098c0-2.58-1.463-3.826-3.505-3.826M4.54 2.777c-.974 0-1.764.797-1.764 1.778 0 .98.79 1.777 1.764 1.777a1.77 1.77 0 0 0 1.764-1.777A1.77 1.77 0 0 0 4.54 2.777" clip-rule="evenodd"/></svg>
|
||
<span>LinkedIn</span></a> <a class="twitter-button flex items-center gap-2 p-2 hover:bg-gray-50 cursor-pointer text-sm rounded-md text-black! relative mb-1" data-url="https://theconversation.com/mea-culpa-lessons-learned-from-firefighting-79994" data-id="79994" target="_blank" rel="noopener" href="http://twitter.com/intent/tweet?text=Mea+culpa%3A+Lessons+learned+from+firefighting&url=https%3A%2F%2Ftheconversation.com%2Fmea-culpa-lessons-learned-from-firefighting-79994%3Futm_source%3Dtwitter%26utm_medium%3Dbylinetwitterbutton&utm_campaign=none&via=ConversationEDU">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 w-full">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 20 20">
|
||
<path fill="currentColor" d="M14.672 15.256H13.18L6.32 4.78h1.49z"/><path fill="currentColor" fill-rule="evenodd" d="M10 0c5.523 0 10 4.477 10 10s-4.477 10-10 10S0 15.523 0 10 4.477 0 10 0m-.705 10.672L5 16h.97l3.756-4.66L12.725 16H16l-4.454-6.919L15.642 4h-.971l-3.556 4.412L8.275 4H5z" clip-rule="evenodd"/></svg>
|
||
<span>X (Twitter)</span></a> </div>
|
||
</div>
|
||
<div class="relative me-2">
|
||
<button aria-label="Print article" id="share-article-print-desktop" class="bg-gray-50 hover:bg-gray-100 border-none cursor-pointer rounded-full text-black w-10 h-10 flex items-center justify-center transition-colors duration-200 font-bold hidden relative focus-visible:outline-offset-2" type="button">
|
||
<span class="size-12 absolute left-1/2 top-1/2 transform -translate-1/2 ">
|
||
</span>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-5">
|
||
<path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"></path>
|
||
<path d="M6 9V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v6"></path>
|
||
<rect x="6" y="14" width="12" height="8" rx="1"></rect>
|
||
</svg>
|
||
</button>
|
||
<div aria-hidden="true" class="hover tooltip left-full top-1/2 -translate-y-1/2 m-0! ms-1! px-2! py-1! bg-black! w-auto! rounded-lg! whitespace-nowrap opacity-0">
|
||
<p class="text-white text-xs">Print article</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</aside>
|
||
|
||
</div>
|
||
|
||
<div class="grid-ten large-grid-nine grid-last content-body content entry-content instapaper_body inline-promos" itemprop="articleBody">
|
||
<h2>Background</h2>
|
||
|
||
<p>On the morning of Tuesday, May 23 there was a mood of excitement within the Australian team of The Conversation as donations from generous supporters began to roll in. The annual appeal for financial support from our readers had swung into action.</p>
|
||
|
||
<p>Little did the development team anticipate how exciting the day would become.</p>
|
||
|
||
<p>When we received reports that some donors were receiving multiple receipts we initially suspected a bug in the emailing code. Unfortunately it transpired that this was not the case. Nor was it the only bug in our donations code-base that was affecting donors.</p>
|
||
|
||
<h2>Our response</h2>
|
||
|
||
<p>While most of the donations were processed without any problems, before long we received reports that led us to identify three bugs affecting donors:</p>
|
||
|
||
<ol>
|
||
<li>a very small percentage of donors were being charged multiple times</li>
|
||
<li>incompatibilities with Internet Explorer 11 were preventing any donations from people using that browser</li>
|
||
<li>some users who entered invalid credit card details were unable to correct their details and donate.</li>
|
||
</ol>
|
||
|
||
<p>Several members of our development team collaborated as we received reports that all was not well with our Donations platform. Fortunately, early in our troubleshooting we identified that the “multiple-charging” problem was only affecting a very small number of users, less than 20 in all. Consequently we were able to continue to receive donations while we divided the tasks of monitoring errors and fixing bugs amongst our team.</p>
|
||
|
||
<p>We also liaised with other key staff so that they could contact affected users.</p><div class="slot clear" data-id="17">
|
||
<div class="inline-promos-skeleton">
|
||
<h5></h5>
|
||
<button></button>
|
||
</div>
|
||
</div>
|
||
|
||
<p>Once we attended to the urgent tasks associated with deploying fixes to the bugs that had been identified, our thoughts turned to reflection. What had led to these problems that affected our generous readers? We resolved to ensure that we would not only learn lessons from the experience but take appropriate steps to fundamentally improve the code-base.</p>
|
||
|
||
<h2>Postmortem</h2>
|
||
|
||
<p>A couple of days after our firefighting effort, we converged as a team to review what had led to this embarrassing scenario. A key aspect of our postmortem was that it was framed as a blameless exercise. Our aim was to review what happened, what should have happened and what we resolved to do about it, both in terms of code quality and process actions.</p>
|
||
|
||
<p>Our postmortem also resulted in a list of things about the Donations code-base that we were unhappy with. The title of this list may or may not have been a four letter word analogous to excrement but with two fewer syllables.</p>
|
||
|
||
<h3>Code quality actions</h3>
|
||
|
||
<p>A key outcome of our postmortem was the resolution that we needed comprehensive acceptance tests. Given that financial transactions were involved, “<a href="https://en.wikipedia.org/wiki/Happy_path">happy path</a>” acceptance were insufficient. For example, we needed automated testing of validation errors and correction of errors.</p>
|
||
|
||
<p>We also painfully acknowledged that our JavaScript had been written in a way that had made unit testing far too difficult. This had to change.</p>
|
||
|
||
<p>More generally we resolved to refactor based on the “smelly” list referred to above.</p>
|
||
|
||
<h3>Process actions</h3>
|
||
|
||
<p>We resolved to strive harder to unit test more Ruby <em>and</em> JS code. When reviewing, we felt that we should feel confident about pointing out missing specs. We felt it important to discuss with the author why they’re missing. Part of that discussion should cover what the trade-offs are with respect to adding unit tests, compared with accepting the risk of not having those tests.</p>
|
||
|
||
<p>We noted that it was important:</p>
|
||
|
||
<ol>
|
||
<li>to ask questions to ensure that both the reviewer and the developer understand the code</li>
|
||
<li>to confirm that both the JS <em>and</em> Ruby code is tested</li>
|
||
<li>to use judgement to write tests to inform our code design as well as to reject valid scenarios where effort to test outweighs benefit</li>
|
||
<li>to not aim for 100% coverage</li>
|
||
<li>that the reviewer should describe what they’ve done to review.</li>
|
||
</ol>
|
||
|
||
<p>Another key insight was the importance of considering a feature freeze. The week before future donation campaigns should be reserved for manual testing in a staging environment.</p>
|
||
|
||
<h2>Resulting improvements</h2>
|
||
|
||
<h3>Acceptance tests</h3>
|
||
|
||
<p>The first step we took was to set out a safety net by ensuring that we had satisfactory acceptance spec coverage.</p>
|
||
|
||
<p>We decided that it was no longer sufficient to cover only the “<a href="https://en.wikipedia.org/wiki/Happy_path">happy path</a>” cases. This was because most of the new bugs we saw arose from sad path interactions. For instance, there was a bug that only arose after the user had attempted a donation with an incorrect email address. We were mindful that happy and sad paths involved potentially taking money from our supporters. A (much) longer-running test suite was a fair trade-off for the sense of security we’d get from covering all eventualities.</p>
|
||
|
||
<p>The specs actually interact with the test sandbox servers at our payment providers, which is uncommon. Stubbing all our interactions with our providers would have been quite complicated. Also, it has lead to some false negatives in the past. Again, we decided to accept the extra running time, and the occasional flakiness that comes from relying on external services.</p>
|
||
|
||
<p>Finally, we incorporated <a href="https://www.browserstack.com/">BrowserStack</a> into our test suite. One of the bugs we found arose only in IE11. BrowserStack’s ability to run our tests against IE11 and a host of other browsers automatically will hopefully save us from such problems in future. With our acceptance specs in place, we felt confident to proceed to proceed with the improvements on our list.</p>
|
||
|
||
<h3>Front end</h3>
|
||
|
||
<p>We had tended to return to our Donations code-base once a year around campaign time. The effort required to understand existing features in that limited time window meant that we ended up working around them rather than with them. As a consequence they tended to become more complex over time. They began to stray from their initial intent.</p>
|
||
|
||
<p>Our code ended up suffering from “<a href="https://en.wikipedia.org/wiki/Palimpsest">palimpsest</a>” development. Recent additions to the team understood their predecessors’ code incompletely, and had to use it in ways the original developers did not necessarily intend. This became telling in our front end code when we ended up calling a complicated method with an innocuous name multiple times during our validation process. It turned out that the method would raise a credit card charge when successful.</p>
|
||
|
||
<p>We determined that we needed to be able to implement our validation code in a way that was more easy to understand, and was testable. We would like to have been able to understand the existing code, aided by existing tests. Additionally, new tests would help us implement new behaviour.</p>
|
||
|
||
<p>However, the structure of the existing code was too tangled to work like this. We needed to cut the <a href="https://en.wikipedia.org/wiki/Gordian_Knot">Gordian Knot</a> of this complexity.</p>
|
||
|
||
<p>With the acceptance test safety net under us, we proceeded to replace existing components of our UI, piece by piece, with <a href="https://facebook.github.io/react/">React</a> components. Those of us who were directly involved with this “React-ification” came to love it, as it enabled exactly isolating the behaviour of specific parts of the UI in a way that makes unit testing possible, even easy.</p>
|
||
|
||
<p>A React component’s “shape” (how it is rendered) at any given moment is always determined by a set of knowable inputs:</p>
|
||
|
||
<ul>
|
||
<li>state (attributes which it manages);</li>
|
||
<li>props (attributes managed by its parents) and</li>
|
||
<li>the events triggered on it (e.g. changes in its input boxes, etc).</li>
|
||
</ul>
|
||
|
||
<p>Thus it is always possible to construct tests in terms of inputs and expected outputs. This makes testing much easier than it usually is in vanilla Javascript, with all its asynchronous behaviour and action at a distance.</p>
|
||
|
||
<p>Naturally, this isolation also makes it much easier to understand the elements on the page. It makes their borders and interactions very clear. </p>
|
||
|
||
<p>It also makes it relatively simple to know where to look for the code for a given component. Wherever it may sit overall according to your local conventions, a component’s code can sit in a directory with its specs along with any styles which belong to it specifically. We recommend this approach.</p>
|
||
|
||
<h3>Back end</h3>
|
||
|
||
<p>Our back end code had ended up in a similar state of complexity to our front end code.</p>
|
||
|
||
<h4>Premature generalization</h4>
|
||
|
||
<p>Developers this year were having trouble divining and using the structures laid down by our predecessors. A fair amount of this was down to finding ourselves with what you could call <a href="http://wiki.c2.com/?PrematureGeneralization">premature, or speculative, generalizations</a>.</p>
|
||
|
||
<p>There was, for instance, an inheritance hierarchy in our payment processing code. This code was effectively only serving one of our payment providers at the time. </p>
|
||
|
||
<p>Consequently, the classes at different levels of the hierarchy had logic which specifically catered to one provider only. This would have to be unpicked when we added another provider.</p>
|
||
|
||
<p>We were attempting to rewrite our code to serve both of our payment providers: Stripe and PayPal. We also needed to support both of our payment options: once-off donations and regular monthly “subscriptions”.</p>
|
||
|
||
<figure class="align-center ">
|
||
<div class="placeholder-container" style="--aspect-ratio-percent:25.066312997347477%;--background-color:#7e7e7e"><img alt="" src="https://images.theconversation.com/files/182708/original/file-20170821-17166-xk9amz.png?ixlib=rb-4.1.1&q=45&auto=format&w=754&fit=clip" class="native-lazy" loading="lazy" srcset="https://images.theconversation.com/files/182708/original/file-20170821-17166-xk9amz.png?ixlib=rb-4.1.1&q=45&auto=format&w=600&h=150&fit=crop&dpr=1 600w, https://images.theconversation.com/files/182708/original/file-20170821-17166-xk9amz.png?ixlib=rb-4.1.1&q=30&auto=format&w=600&h=150&fit=crop&dpr=2 1200w, https://images.theconversation.com/files/182708/original/file-20170821-17166-xk9amz.png?ixlib=rb-4.1.1&q=15&auto=format&w=600&h=150&fit=crop&dpr=3 1800w, https://images.theconversation.com/files/182708/original/file-20170821-17166-xk9amz.png?ixlib=rb-4.1.1&q=45&auto=format&w=754&h=189&fit=crop&dpr=1 754w, https://images.theconversation.com/files/182708/original/file-20170821-17166-xk9amz.png?ixlib=rb-4.1.1&q=30&auto=format&w=754&h=189&fit=crop&dpr=2 1508w, https://images.theconversation.com/files/182708/original/file-20170821-17166-xk9amz.png?ixlib=rb-4.1.1&q=15&auto=format&w=754&h=189&fit=crop&dpr=3 2262w" sizes="(min-width: 1466px) 754px, (max-width: 599px) 100vw, (min-width: 600px) 600px, 237px"></div>
|
||
<figcaption>
|
||
<span class="caption">Two providers, two payment options, one base class – but which functionality belongs to the base class?</span>
|
||
<span class="attribution"><span class="license">Author provided</span></span>
|
||
</figcaption>
|
||
</figure>
|
||
|
||
<p>For each piece of new functionality, we needed not just to understand it in itself, but to understand which level of the hierarchy implemented it. Also, we had to understand <em>how it differed from</em> the existing functionality. So, rather than conferring a benefit from sharing code, inheritance left us with an extra cognitive burden.</p>
|
||
|
||
<p>The inheritance hierarchy was getting in the way. In the end, there was not enough shared code between all cases to justify them sharing a common ancestor.</p>
|
||
|
||
<p>As soon as you find yourself with a hierarchy which shares behaviour <em>conditionally</em>, you have what Sandi Metz would label <a href="https://www.sandimetz.com/blog/2016/1/20/the-wrong-abstraction">the wrong abstraction</a>. In such cases, coding for specific classes involves not just figuring out the correct behaviour in the case you were working on. It also necessitates understanding how that differs from the other cases covered by the hierarchy. We haven’t totally fixed this problem. However, we’ve made some progress in refactoring away the hierarchy, backed up, as ever, by our acceptance tests. </p>
|
||
|
||
<h4>Unclear abstractions</h4>
|
||
|
||
<p>Another cause of complexity was in the unclear division between two important classes: <em>Donation</em> and <em>Subscription</em>.</p>
|
||
|
||
<ul>
|
||
<li>A <em>Donation</em> represented a person making a one off donation.</li>
|
||
<li>A <em>Subscription</em> represented a person signing up to give us a monthly donation.</li>
|
||
</ul>
|
||
|
||
<p>It sounds like a fair enough division, given that some slightly different logic applies in each of the two cases. Our payment providers offer different mechanisms for collecting once-off and regular payments.</p>
|
||
|
||
<p>But matters were confused here. For each once-off donation, we will send a thank you email and a tax receipt email. For a monthly donation, we will only send a thank you email once, but will send a tax receipt email every month.</p>
|
||
|
||
<p>To help support this behaviour, our code would create a <em>Donation</em> every time a monthly donation was received, as well as for every once-off donation. Because each class could be our only source of information about a donor, both classes had user contact information.</p>
|
||
|
||
<p>Instances of each of the two classes would have payment logic and also contact information. Consequently, they may find themselves passed into a lot of the same places as each other, with the receiving code taking responsibility for figuring out whether they were a <em>Subscription</em> or a <em>Donation</em>. This uncertainty was usually reflected in the name of the parameter/variable which received the object, which was the vague and ambiguous word “source”.</p>
|
||
|
||
<p>We eventually figured out that we could shift the dividing line between the classes a little and remove a lot of the confusion.</p>
|
||
|
||
<p>We did this by making the classes reflect more closely the natural categories of things as we perceive them. Instead of the major divide being between a once-off and a monthly donation, we drew it between the donation and the person making the donation. The person is responsible for having contact information and knowing when the donations are supposed to happen, and the donation is responsible for tracking the actual transaction.</p>
|
||
|
||
<p>Naturally, in this scheme, a person has zero to many donations. When we followed through this logic, it became abundantly clear in each case which type of object should be passed to which job. The job for sending a thank you email should always expect a person, given that it happens once when a person signs up to make donations. The job to send tax receipts, on the other hand, should always expect a donation, as it will happen once for each financial transaction which occurs. </p>
|
||
|
||
<p>By performing this refactoring, we have been able to remove a lot of conditional logic. Also, perhaps as important, we have been able to name the relevant methods and variables unambiguously according to whether they are (or are expecting) a person or a donation. This will almost certainly have made our code a lot clearer and more maintainable for the next developers to work on it (i.e. most likely us in a few months).</p>
|
||
|
||
<h2>Summary</h2>
|
||
|
||
<p>What were the key insights that we gained from this exercise?</p>
|
||
|
||
<p>To begin with, always consider happy path acceptance tests as a bedrock indication that your code will do as intended. Where your code handles money, especially where it can handle a lot at once, consider expanding your suite of acceptance tests to the sad paths. Consider incorporating your payment provider’s test tools/sandbox environments. Also, try to make automated cross-browser testing part of the mix.</p>
|
||
|
||
<p>Secondly, try to give yourself a enough of a run-up to to your deadline give yourself room to manoeuvre. No matter how simple you think your application is, or how undramatic you think your change is, allow a buffer. It will take a while for <a href="https://www.youtube.com/watch?v=JbR999N5MiA">future you</a> to understand past you’s intentions.</p>
|
||
|
||
<p>Next, take the time to make it easier for future you by paying attention to the code smells of speculative generalisation and classes or variables with vague or ambiguous names. Classes with vague or ambiguous purposes are a likely indicator that they should be divided differently.</p>
|
||
|
||
<p>Also, use React to structure your front end code. As described above, this approach is already paying dividends for us.</p>
|
||
|
||
<p>Whilst there was some pain involved in fighting the fires that our sub-optimally maintained Donations platform resulted in, we’re pleased with our response. Our subsequent improvements have left us feeling confident that future donation campaigns will run smoothly.</p>
|
||
</div>
|
||
|
||
|
||
|
||
<nav class="post-navigation grid-ten large-grid-nine grid-prepend-two">
|
||
<ol>
|
||
<li>
|
||
<div class="post-navigation-option ">
|
||
<a class="article" href="/monitoring-build-times-maintaining-our-fast-feedback-loop-75548">
|
||
<h4 class="legacy direction">
|
||
Previous post
|
||
</h4>
|
||
<time datetime="2017-06-19T05:07:50Z" itemprop="datePublished" content="2017-06-19T05:07:50Z">Published: June 19, 2017</time>
|
||
Monitoring Build Times: Maintaining our Fast feedback Loop
|
||
<span class="navigation-option-author">
|
||
James Healy
|
||
</span>
|
||
</a> </div>
|
||
</li>
|
||
|
||
<li>
|
||
<div class="post-navigation-option ">
|
||
<a class="article" href="/a-tale-of-performance-testing-83158">
|
||
<h4 class="legacy direction">
|
||
Next post
|
||
</h4>
|
||
<time datetime="2017-10-30T23:08:07Z" itemprop="datePublished" content="2017-10-30T23:08:07Z">Published: October 30, 2017</time>
|
||
A Tale of Performance Testing
|
||
<span class="navigation-option-author">
|
||
Josh Bassett
|
||
</span>
|
||
</a> </div>
|
||
</li>
|
||
|
||
</ol>
|
||
</nav>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="wrapper">
|
||
<div class="react-content-related-container" data-article-id="79994"></div>
|
||
</div>
|
||
</article>
|
||
|
||
|
||
<div id="comments-container"></div>
|
||
|
||
|
||
<div class="page-addendum">
|
||
<div class="wrapper">
|
||
<div class="grid-sixteen grid-last">
|
||
|
||
<div id="addendum-write" class="addendum-block want-to-write">
|
||
<h3 class="border">Want to write?</h3>
|
||
<p>
|
||
Write an article and join a growing community of more than 232,800 academics and researchers from 5,612 institutions.
|
||
</p>
|
||
<p class="more">
|
||
<a class="button" href="/become-an-author">Register now</a>
|
||
</p>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
<script src="https://theconversation.com/javascripts/lib/content_tracker_hook.js" id="theconversation_tracker_hook" data-counter="https://counter.theconversation.com/content/79994/count" async="async"></script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
<div id="footers">
|
||
<section class="footer-primary">
|
||
<div class="wrapper nocontent">
|
||
<section class="community footer-link-list grid-five large-grid-four">
|
||
<nav>
|
||
<ul>
|
||
<li>
|
||
<a href="https://drive.google.com/file/d/1DUkhOcnF1Ef1MpuKtGr7rbBAawO4XV48">Editorial Policies</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/community-standards">Community standards</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/republishing-guidelines">Republishing guidelines</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/friends">Friends of The Conversation</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://analytics.theconversation.com/us?utm_source=theconversation.com&utm_medium=website&utm_campaign=footer">Analytics</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/feeds">Our feeds</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://donate.theconversation.com/us?utm_source=theconversation.com&utm_medium=website&utm_campaign=footer">Donate</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/newsletters?utm_campaign=System&utm_content=newsletter&utm_medium=Footer&utm_source=theconversation.com">Get newsletter</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</section>
|
||
|
||
<section class="company footer-link-list grid-five large-grid-seven">
|
||
<nav>
|
||
<ul>
|
||
<li>
|
||
<a href="/us/who-we-are">Who we are</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/charter">Our charter</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/team">Our team</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/partners">Partners and funders</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/resources-for-media">Resource for media</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/jobs">Work for us</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/espanol">En Español</a>
|
||
</li>
|
||
<li>
|
||
<a href="/us/contact-us">Contact us</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</section>
|
||
|
||
<section class="grid-six large-grid-five grid-last">
|
||
<div class="sitewide-social-media">
|
||
<ul>
|
||
<li class="facebook">
|
||
<a title="The Conversation on Facebook" rel="me" href="https://facebook.com/theConversationUS">​</a>
|
||
</li>
|
||
<li class="twitter">
|
||
<a title="The Conversation on X (formerly Twitter)" rel="me" href="https://twitter.com/ConversationUS">​</a>
|
||
</li>
|
||
<li class="instagram">
|
||
<a title="The Conversation on Instagram" rel="me" href="https://instagram.com/theconversation.us">​</a>
|
||
</li>
|
||
<li class="linkedin">
|
||
<a title="The Conversation on LinkedIn" rel="me" href="https://www.linkedin.com/company/conversationus">​</a>
|
||
</li>
|
||
<li class="youtube">
|
||
<a title="The Conversation on YouTube" rel="me" href="https://www.youtube.com/@TheConversationUS">​</a>
|
||
</li>
|
||
<li class="tiktok">
|
||
<a title="The Conversation on TikTok" rel="me" href="https://www.tiktok.com/@theconversation">​</a>
|
||
</li>
|
||
<li class="mastodon">
|
||
<a title="The Conversation on Mastodon" rel="me" href="https://newsie.social/@TheConversationUS">​</a>
|
||
</li>
|
||
<li class="bluesky">
|
||
<a title="The Conversation on BlueSky" rel="me" href="https://bsky.app/profile/us.theconversation.com">​</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
|
||
<footer id="footer">
|
||
<div class="wrapper flex flex-col mx-auto pt-4 text-2xs md:flex-row 2xl:text-xs">
|
||
<nav class="flex flex-col gap-4 text-center md:flex-row">
|
||
<a class="mb-2" href="/us/privacy-policy">Privacy policy</a>
|
||
<a class="mb-2 hidden" data-controller="didomi-preferences" data-action="click->didomi-preferences#show" href="#">Consent preferences</a>
|
||
<a class="mb-2" href="/us/terms-and-conditions">Terms and conditions</a>
|
||
<a class="mb-2" href="/us/corrections">Corrections</a>
|
||
</nav>
|
||
<p class="copyright mx-auto mt-4 md:mt-0 lg:mr-0 lg:ml-auto">
|
||
Copyright © 2010–2026, <a href="https://theconversation.com/us/who-we-are">The Conversation US, Inc.</a>
|
||
</p>
|
||
</div>
|
||
</footer>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="slot" data-id="13"></div>
|
||
|
||
<script src="https://cdn.theconversation.com/static/tc/content-99e2a170c4af11cf67be.js"></script>
|
||
|
||
<script src="https://cdn.theconversation.com/static/tc/gtm_data_layer-4e0af6c3ae730bfbdc50.js"></script>
|
||
<script>
|
||
//<![CDATA[
|
||
|
||
TC.locale = "en-US";
|
||
TC.env = "production";
|
||
TC.pageType = "content#show";
|
||
TC.localePath = "https://cdn.theconversation.com/static/tc/en-US-9827722d766a3d889262edb4d25eeb89.json";
|
||
TC.bugsnagConfig = {"apiKey":"e6966b978008ed1612ea7793efb88e93","appVersion":"78a3363df040167ede0256225190e56041faeb05","collectUserIp":false,"releaseStage":"production","notifyReleaseStages":["development","staging","production"]};
|
||
TC.init = function() {
|
||
if (document.readyState === "loading") {
|
||
document.addEventListener("DOMContentLoaded", TC.EntrypointInitializer);
|
||
} else {
|
||
TC.EntrypointInitializer();
|
||
}
|
||
|
||
}
|
||
|
||
//]]>
|
||
</script>
|
||
<script>
|
||
//<![CDATA[
|
||
"use strict";(self.webpackChunkrails=self.webpackChunkrails||[]).push([[952],{81734:function(e,t,s){var i=s(31512);TC.initialized=!1,i.A.init(TC.localePath,TC.locale,!1,(()=>{TC.init(),TC.initialized=!0,document.dispatchEvent(new Event("tc:initialized"))}))},31512:function(e,t,s){s.d(t,{A:function(){return ge}});var i=s(92099),n=s(48183),o=[],r=o.forEach,a=o.slice,l=["__proto__","constructor","prototype"];function c(e,t,s,i){var n=e.read.bind(e);if(2!==n.length)n(t,s,i);else try{var o=n(t,s);o&&"function"==typeof o.then?o.then((function(e){return i(null,e)})).catch(i):i(null,o)}catch(e){i(e)}}var u=function(){return(0,n.A)((function e(t){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};(0,i.A)(this,e),this.backends=[],this.type="backend",this.allOptions=n,this.init(t,s)}),[{key:"init",value:function(e){var t=this,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.services=e,this.options=function(e){return r.call(a.call(arguments,1),(function(t){if(t)for(var s=0,i=Object.keys(t);s<i.length;s++){var n=i[s];l.indexOf(n)>-1||void 0===e[n]&&(e[n]=t[n])}})),e}(s,this.options||{},{handleEmptyResourcesAsFailed:!0,cacheHitMode:"none",retryOnFailure:!1}),this.allOptions=i,this.options.backends&&this.options.backends.length>1&&(this.allOptions.saveMissing||this.allOptions.updateMissing)&&this.services&&this.services.logger&&this.services.logger.warn("i18next-chained-backend: Using multiple backends in combination with saveMissing/updateMissing is not recommended, as it may trigger based on stale data."),this.options.backends&&this.options.backends.forEach((function(s,n){var o;t.backends[n]=t.backends[n]||((o=s)?"function"==typeof o?new o:o:null),t.backends[n].init(e,t.options.backendOptions&&t.options.backendOptions[n]||{},i)})),this.services&&this.options.reloadInterval&&setInterval((function(){return t.reload()}),this.options.reloadInterval)}},{key:"read",value:function(e,t,s){var i=this,n=this.backends.length,o=function(a){if(a>=n)return s(new Error("non of the backend loaded data"),i.options.retryOnFailure);var l=a===n-1,u=i.options.handleEmptyResourcesAsFailed&&!l?0:-1,h=i.backends[a];h.read?c(h,e,t,(function(n,l,p){if(!n&&l&&Object.keys(l).length>u){if(s(null,l,a),r(a-1,l),h.save&&i.options.cacheHitMode&&["refresh","refreshAndUpdateStore"].indexOf(i.options.cacheHitMode)>-1){if(p&&i.options.refreshExpirationTime&&p+i.options.refreshExpirationTime>Date.now())return;var d=i.backends[a+1];d&&d.read&&c(d,e,t,(function(s,n){s||n&&(Object.keys(n).length<=u||(r(a,n),"refreshAndUpdateStore"===i.options.cacheHitMode&&i.services&&i.services.resourceStore&&i.services.resourceStore.addResourceBundle(e,t,n)))}))}}else o(a+1)})):o(a+1)},r=function(s,n){if(!(s<0)){var o=i.backends[s];o.save?(o.save(e,t,n),r(s-1,n)):r(s-1,n)}};o(0)}},{key:"create",value:function(e,t,s,i){var n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:function(){},o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};this.backends.forEach((function(r){if(r.create){var a=r.create.bind(r);if(a.length<6)try{var l;(l=5===a.length?a(e,t,s,i,o):a(e,t,s,i))&&"function"==typeof l.then?l.then((function(e){return n(null,e)})).catch(n):n(null,l)}catch(e){n(e)}else a(e,t,s,i,n,o)}}))}},{key:"reload",value:function(){var e=this,t=this.services,s=t.backendConnector,i=t.languageUtils,n=t.logger,o=s.language;if(!o||"cimode"!==o.toLowerCase()){var r=[],a=function(e){i.toResolveHierarchy(e).forEach((function(e){r.indexOf(e)<0&&r.push(e)}))};a(o),this.allOptions.preload&&this.allOptions.preload.forEach((function(e){return a(e)})),r.forEach((function(t){e.allOptions.ns.forEach((function(e){s.read(t,e,"read",null,null,(function(i,o){i&&n.warn("loading namespace ".concat(e," for language ").concat(t," failed"),i),!i&&o&&n.log("loaded namespace ".concat(e," for language ").concat(t),o),s.loaded("".concat(t,"|").concat(e),i,o)}))}))}))}}}])}();u.type="backend";const h=e=>"string"==typeof e,p=()=>{let e,t;const s=new Promise(((s,i)=>{e=s,t=i}));return s.resolve=e,s.reject=t,s},d=e=>null==e?"":String(e),g=/###/g,f=e=>e&&e.includes("###")?e.replace(g,"."):e,y=e=>!e||h(e),m=(e,t,s)=>{const i=h(t)?t.split("."):t;let n=0;for(;n<i.length-1;){if(y(e))return{};const t=f(i[n]);!e[t]&&s&&(e[t]=new s),e=Object.prototype.hasOwnProperty.call(e,t)?e[t]:{},++n}return y(e)?{}:{obj:e,k:f(i[n])}},v=(e,t,s)=>{const{obj:i,k:n}=m(e,t,Object);if(void 0!==i||1===t.length)return void(i[n]=s);let o=t[t.length-1],r=t.slice(0,t.length-1),a=m(e,r,Object);for(;void 0===a.obj&&r.length;)o=`${r[r.length-1]}.${o}`,r=r.slice(0,r.length-1),a=m(e,r,Object),a?.obj&&void 0!==a.obj[`${a.k}.${o}`]&&(a.obj=void 0);a.obj[`${a.k}.${o}`]=s},b=(e,t)=>{const{obj:s,k:i}=m(e,t);if(s&&Object.prototype.hasOwnProperty.call(s,i))return s[i]},k=(e,t,s)=>{for(const i in t)"__proto__"!==i&&"constructor"!==i&&(Object.prototype.hasOwnProperty.call(e,i)?h(e[i])||e[i]instanceof String||h(t[i])||t[i]instanceof String?s&&(e[i]=t[i]):k(e[i],t[i],s):e[i]=t[i]);return e},x=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),S={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},w=e=>h(e)?e.replace(/[&<>"'\/]/g,(e=>S[e])):e;const L=[" ",",","?","!",";"],O=new class{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const t=this.regExpMap.get(e);if(void 0!==t)return t;const s=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,s),this.regExpQueue.push(e),s}}(20),j=(e,t,s=".")=>{if(!e)return;if(e[t]){if(!Object.prototype.hasOwnProperty.call(e,t))return;return e[t]}const i=t.split(s);let n=e;for(let e=0;e<i.length;){if(!n||"object"!=typeof n)return;let t,o="";for(let r=e;r<i.length;++r)if(r!==e&&(o+=s),o+=i[r],t=n[o],void 0!==t){if(["string","number","boolean"].includes(typeof t)&&r<i.length-1)continue;e+=r-e+1;break}n=t}return n},P=e=>e?.replace(/_/g,"-"),$={type:"logger",log(e){this.output("log",e)},warn(e){this.output("warn",e)},error(e){this.output("error",e)},output(e,t){console?.[e]?.apply?.(console,t)}};class R{constructor(e,t={}){this.init(e,t)}init(e,t={}){this.prefix=t.prefix||"i18next:",this.logger=e||$,this.options=t,this.debug=t.debug}log(...e){return this.forward(e,"log","",!0)}warn(...e){return this.forward(e,"warn","",!0)}error(...e){return this.forward(e,"error","")}deprecate(...e){return this.forward(e,"warn","WARNING DEPRECATED: ",!0)}forward(e,t,s,i){return i&&!this.debug?null:(e=e.map((e=>h(e)?e.replace(/[\r\n\x00-\x1F\x7F]/g," "):e)),h(e[0])&&(e[0]=`${s}${this.prefix} ${e[0]}`),this.logger[t](e))}create(e){return new R(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return(e=e||this.options).prefix=e.prefix||this.prefix,new R(this.logger,e)}}var C=new R;class N{constructor(){this.observers={}}on(e,t){return e.split(" ").forEach((e=>{this.observers[e]||(this.observers[e]=new Map);const s=this.observers[e].get(t)||0;this.observers[e].set(t,s+1)})),this}off(e,t){this.observers[e]&&(t?this.observers[e].delete(t):delete this.observers[e])}once(e,t){const s=(...i)=>{t(...i),this.off(e,s)};return this.on(e,s),this}emit(e,...t){if(this.observers[e]){Array.from(this.observers[e].entries()).forEach((([e,s])=>{for(let i=0;i<s;i++)e(...t)}))}if(this.observers["*"]){Array.from(this.observers["*"].entries()).forEach((([s,i])=>{for(let n=0;n<i;n++)s(e,...t)}))}}}class E extends N{constructor(e,t={ns:["translation"],defaultNS:"translation"}){super(),this.data=e||{},this.options=t,void 0===this.options.keySeparator&&(this.options.keySeparator="."),void 0===this.options.ignoreJSONStructure&&(this.options.ignoreJSONStructure=!0)}addNamespaces(e){this.options.ns.includes(e)||this.options.ns.push(e)}removeNamespaces(e){const t=this.options.ns.indexOf(e);t>-1&&this.options.ns.splice(t,1)}getResource(e,t,s,i={}){const n=void 0!==i.keySeparator?i.keySeparator:this.options.keySeparator,o=void 0!==i.ignoreJSONStructure?i.ignoreJSONStructure:this.options.ignoreJSONStructure;let r;e.includes(".")?r=e.split("."):(r=[e,t],s&&(Array.isArray(s)?r.push(...s):h(s)&&n?r.push(...s.split(n)):r.push(s)));const a=b(this.data,r);return a||t||s||!e.includes(".")||(e=r[0],t=r[1],s=r.slice(2).join(".")),!a&&o&&h(s)?j(this.data?.[e]?.[t],s,n):a}addResource(e,t,s,i,n={silent:!1}){const o=void 0!==n.keySeparator?n.keySeparator:this.options.keySeparator;let r=[e,t];s&&(r=r.concat(o?s.split(o):s)),e.includes(".")&&(r=e.split("."),i=t,t=r[1]),this.addNamespaces(t),v(this.data,r,i),n.silent||this.emit("added",e,t,s,i)}addResources(e,t,s,i={silent:!1}){for(const i in s)(h(s[i])||Array.isArray(s[i]))&&this.addResource(e,t,i,s[i],{silent:!0});i.silent||this.emit("added",e,t,s)}addResourceBundle(e,t,s,i,n,o={silent:!1,skipCopy:!1}){let r=[e,t];e.includes(".")&&(r=e.split("."),i=s,s=t,t=r[1]),this.addNamespaces(t);let a=b(this.data,r)||{};o.skipCopy||(s=JSON.parse(JSON.stringify(s))),i?k(a,s,n):a={...a,...s},v(this.data,r,a),o.silent||this.emit("added",e,t,s)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit("removed",e,t)}hasResourceBundle(e,t){return void 0!==this.getResource(e,t)}getResourceBundle(e,t){return t||(t=this.options.defaultNS),this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find((e=>t[e]&&Object.keys(t[e]).length>0))}toJSON(){return this.data}}var A={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,s,i,n){return e.forEach((e=>{t=this.processors[e]?.process(t,s,i,n)??t})),t}};const T=Symbol("i18next/PATH_KEY");function F(e,t){const{[T]:s}=e(function(){const e=[],t=Object.create(null);let s;return t.get=(i,n)=>(s?.revoke?.(),n===T?e:(e.push(n),s=Proxy.revocable(i,t),s.proxy)),Proxy.revocable(Object.create(null),t).proxy}()),i=t?.keySeparator??".",n=t?.nsSeparator??":",o="strict"===t?.enableSelector;if(s.length>1&&n){const e=t?.ns,r=o?Array.isArray(e)?e:e?[e]:null:Array.isArray(e)?e:null;if(r){if((o?r:r.length>1?r.slice(1):[]).includes(s[0]))return`${s[0]}${n}${s.slice(1).join(i)}`}}return s.join(i)}const V=e=>!h(e)&&"boolean"!=typeof e&&"number"!=typeof e;class I extends N{constructor(e,t={}){super(),((e,t,s)=>{e.forEach((e=>{t[e]&&(s[e]=t[e])}))})(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=t,void 0===this.options.keySeparator&&(this.options.keySeparator="."),this.logger=C.create("translator"),this.checkedLoadedFor={}}changeLanguage(e){e&&(this.language=e)}exists(e,t={interpolation:{}}){const s={...t};if(null==e)return!1;const i=this.resolve(e,s);if(void 0===i?.res)return!1;const n=V(i.res);return!1!==s.returnObjects||!n}extractFromKey(e,t){let s=void 0!==t.nsSeparator?t.nsSeparator:this.options.nsSeparator;void 0===s&&(s=":");const i=void 0!==t.keySeparator?t.keySeparator:this.options.keySeparator;let n=t.ns||this.options.defaultNS||[];const o=s&&e.includes(s),r=!(this.options.userDefinedKeySeparator||t.keySeparator||this.options.userDefinedNsSeparator||t.nsSeparator||((e,t,s)=>{t=t||"",s=s||"";const i=L.filter((e=>!t.includes(e)&&!s.includes(e)));if(0===i.length)return!0;const n=O.getRegExp(`(${i.map((e=>"?"===e?"\\?":e)).join("|")})`);let o=!n.test(e);if(!o){const t=e.indexOf(s);t>0&&!n.test(e.substring(0,t))&&(o=!0)}return o})(e,s,i));if(o&&!r){const t=e.match(this.interpolator.nestingRegexp);if(t&&t.length>0)return{key:e,namespaces:h(n)?[n]:n};const o=e.split(s);(s!==i||s===i&&this.options.ns.includes(o[0]))&&(n=o.shift()),e=o.join(i)}return{key:e,namespaces:h(n)?[n]:n}}translate(e,t,s){let i="object"==typeof t?{...t}:t;if("object"!=typeof i&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),"object"==typeof i&&(i={...i}),i||(i={}),null==e)return"";"function"==typeof e&&(e=F(e,{...this.options,...i})),Array.isArray(e)||(e=[String(e)]),e=e.map((e=>"function"==typeof e?F(e,{...this.options,...i}):String(e)));const n=void 0!==i.returnDetails?i.returnDetails:this.options.returnDetails,o=void 0!==i.keySeparator?i.keySeparator:this.options.keySeparator,{key:r,namespaces:a}=this.extractFromKey(e[e.length-1],i),l=a[a.length-1];let c=void 0!==i.nsSeparator?i.nsSeparator:this.options.nsSeparator;void 0===c&&(c=":");const u=i.lng||this.language,p=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if("cimode"===u?.toLowerCase())return p?n?{res:`${l}${c}${r}`,usedKey:r,exactUsedKey:r,usedLng:u,usedNS:l,usedParams:this.getUsedParamsDetails(i)}:`${l}${c}${r}`:n?{res:r,usedKey:r,exactUsedKey:r,usedLng:u,usedNS:l,usedParams:this.getUsedParamsDetails(i)}:r;const d=this.resolve(e,i);let g=d?.res;const f=d?.usedKey||r,y=d?.exactUsedKey||r,m=void 0!==i.joinArrays?i.joinArrays:this.options.joinArrays,v=!this.i18nFormat||this.i18nFormat.handleAsObject,b=void 0!==i.count&&!h(i.count),k=I.hasDefaultValue(i),x=b?this.pluralResolver.getSuffix(u,i.count,i):"",S=i.ordinal&&b?this.pluralResolver.getSuffix(u,i.count,{ordinal:!1}):"",w=b&&!i.ordinal&&0===i.count,L=w&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${x}`]||i[`defaultValue${S}`]||i.defaultValue;let O=g;v&&!g&&k&&(O=L);const j=V(O),P=Object.prototype.toString.apply(O);if(!(v&&O&&j)||["[object Number]","[object Function]","[object RegExp]"].includes(P)||h(m)&&Array.isArray(O))if(v&&h(m)&&Array.isArray(g))g=g.join(m),g&&(g=this.extendTranslation(g,e,i,s));else{let t=!1,n=!1;!this.isValidLookup(g)&&k&&(t=!0,g=L),this.isValidLookup(g)||(n=!0,g=r);const a=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&n?void 0:g,h=k&&L!==g&&this.options.updateMissing;if(n||t||h){if(this.logger.log(h?"updateKey":"missingKey",u,l,b&&!h?`${r}${this.pluralResolver.getSuffix(u,i.count,i)}`:r,h?L:g),o){const e=this.resolve(r,{...i,keySeparator:!1});e&&e.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let e=[];const t=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if("fallback"===this.options.saveMissingTo&&t&&t[0])for(let s=0;s<t.length;s++)e.push(t[s]);else"all"===this.options.saveMissingTo?e=this.languageUtils.toResolveHierarchy(i.lng||this.language):e.push(i.lng||this.language);const s=(e,t,s)=>{const n=k&&s!==g?s:a;this.options.missingKeyHandler?this.options.missingKeyHandler(e,l,t,n,h,i):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(e,l,t,n,h,i),this.emit("missingKey",e,l,t,g)};this.options.saveMissing&&(this.options.saveMissingPlurals&&b?e.forEach((e=>{const t=this.pluralResolver.getSuffixes(e,i);w&&i[`defaultValue${this.options.pluralSeparator}zero`]&&!t.includes(`${this.options.pluralSeparator}zero`)&&t.push(`${this.options.pluralSeparator}zero`),t.forEach((t=>{s([e],r+t,i[`defaultValue${t}`]||L)}))})):s(e,r,L))}g=this.extendTranslation(g,e,i,d,s),n&&g===r&&this.options.appendNamespaceToMissingKey&&(g=`${l}${c}${r}`),(n||t)&&this.options.parseMissingKeyHandler&&(g=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${l}${c}${r}`:r,t?g:void 0,i))}else{if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const e=this.options.returnedObjectHandler?this.options.returnedObjectHandler(f,O,{...i,ns:a}):`key '${r} (${this.language})' returned an object instead of string.`;return n?(d.res=e,d.usedParams=this.getUsedParamsDetails(i),d):e}if(o){const e=Array.isArray(O),t=e?[]:{},s=e?y:f;for(const e in O)if(Object.prototype.hasOwnProperty.call(O,e)){const n=`${s}${o}${e}`;t[e]=k&&!g?this.translate(n,{...i,defaultValue:V(L)?L[e]:void 0,joinArrays:!1,ns:a}):this.translate(n,{...i,joinArrays:!1,ns:a}),t[e]===n&&(t[e]=O[e])}g=t}}return n?(d.res=g,d.usedParams=this.getUsedParamsDetails(i),d):g}extendTranslation(e,t,s,i,n){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...s},s.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!s.skipInterpolation){s.interpolation&&this.interpolator.init({...s,interpolation:{...this.options.interpolation,...s.interpolation}});const o=h(e)&&(void 0!==s?.interpolation?.skipOnVariables?s.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let r;if(o){const t=e.match(this.interpolator.nestingRegexp);r=t&&t.length}let a=s.replace&&!h(s.replace)?s.replace:s;if(this.options.interpolation.defaultVariables&&(a={...this.options.interpolation.defaultVariables,...a}),e=this.interpolator.interpolate(e,a,s.lng||this.language||i.usedLng,s),o){const t=e.match(this.interpolator.nestingRegexp);r<(t&&t.length)&&(s.nest=!1)}!s.lng&&i&&i.res&&(s.lng=this.language||i.usedLng),!1!==s.nest&&(e=this.interpolator.nest(e,((...e)=>n?.[0]!==e[0]||s.context?this.translate(...e,t):(this.logger.warn(`It seems you are nesting recursively key: ${e[0]} in key: ${t[0]}`),null)),s)),s.interpolation&&this.interpolator.reset()}const o=s.postProcess||this.options.postProcess,r=h(o)?[o]:o;return null!=e&&r?.length&&!1!==s.applyPostProcessor&&(e=A.handle(r,e,t,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...i,usedParams:this.getUsedParamsDetails(s)},...s}:s,this)),e}resolve(e,t={}){let s,i,n,o,r;return h(e)&&(e=[e]),Array.isArray(e)&&(e=e.map((e=>"function"==typeof e?F(e,{...this.options,...t}):e))),e.forEach((e=>{if(this.isValidLookup(s))return;const a=this.extractFromKey(e,t),l=a.key;i=l;let c=a.namespaces;this.options.fallbackNS&&(c=c.concat(this.options.fallbackNS));const u=void 0!==t.count&&!h(t.count),p=u&&!t.ordinal&&0===t.count,d=void 0!==t.context&&(h(t.context)||"number"==typeof t.context)&&""!==t.context,g=t.lngs?t.lngs:this.languageUtils.toResolveHierarchy(t.lng||this.language,t.fallbackLng);c.forEach((e=>{this.isValidLookup(s)||(r=e,this.checkedLoadedFor[`${g[0]}-${e}`]||!this.utils?.hasLoadedNamespace||this.utils?.hasLoadedNamespace(r)||(this.checkedLoadedFor[`${g[0]}-${e}`]=!0,this.logger.warn(`key "${i}" for languages "${g.join(", ")}" won't get resolved as namespace "${r}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),g.forEach((i=>{if(this.isValidLookup(s))return;o=i;const r=[l];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(r,l,i,e,t);else{let e;u&&(e=this.pluralResolver.getSuffix(i,t.count,t));const s=`${this.options.pluralSeparator}zero`,n=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(u&&(t.ordinal&&e.startsWith(n)&&r.push(l+e.replace(n,this.options.pluralSeparator)),r.push(l+e),p&&r.push(l+s)),d){const i=`${l}${this.options.contextSeparator||"_"}${t.context}`;r.push(i),u&&(t.ordinal&&e.startsWith(n)&&r.push(i+e.replace(n,this.options.pluralSeparator)),r.push(i+e),p&&r.push(i+s))}}let a;for(;a=r.pop();)this.isValidLookup(s)||(n=a,s=this.getResource(i,e,a,t))})))}))})),{res:s,usedKey:i,exactUsedKey:n,usedLng:o,usedNS:r}}isValidLookup(e){return!(void 0===e||!this.options.returnNull&&null===e||!this.options.returnEmptyString&&""===e)}getResource(e,t,s,i={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,t,s,i):this.resourceStore.getResource(e,t,s,i)}getUsedParamsDetails(e={}){const t=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],s=e.replace&&!h(e.replace);let i=s?e.replace:e;if(s&&void 0!==e.count&&(i={...i,count:e.count}),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!s){i={...i};for(const e of t)delete i[e]}return i}static hasDefaultValue(e){for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t)&&t.startsWith("defaultValue")&&void 0!==e[t])return!0;return!1}}class D{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=C.create("languageUtils"),this.resolveHierarchyCache={}}clearCache(){this.resolveHierarchyCache={}}getScriptPartFromCode(e){if(!(e=P(e))||!e.includes("-"))return null;const t=e.split("-");return 2===t.length?null:(t.pop(),"x"===t[t.length-1].toLowerCase()?null:this.formatLanguageCode(t.join("-")))}getLanguagePartFromCode(e){if(!(e=P(e))||!e.includes("-"))return e;const t=e.split("-");return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(h(e)&&e.includes("-")){let t;try{t=Intl.getCanonicalLocales(e)[0]}catch(e){}return t&&this.options.lowerCaseLng&&(t=t.toLowerCase()),t||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return("languageOnly"===this.options.load||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.includes(e)}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach((e=>{if(t)return;const s=this.formatLanguageCode(e);this.options.supportedLngs&&!this.isSupportedCode(s)||(t=s)})),!t&&this.options.supportedLngs&&e.forEach((e=>{if(t)return;const s=this.getScriptPartFromCode(e);if(this.isSupportedCode(s))return t=s;const i=this.getLanguagePartFromCode(e);if(this.isSupportedCode(i))return t=i;t=this.options.supportedLngs.find((e=>e===i||!(!e.includes("-")&&!i.includes("-"))&&(!(!e.includes("-")||i.includes("-")||e.slice(0,e.indexOf("-"))!==i)||!!(e.startsWith(i)&&i.length>1))))})),t||(t=this.getFallbackCodes(this.options.fallbackLng)[0]),t}getFallbackCodes(e,t){if(!e)return[];if("function"==typeof e&&(e=e(t)),h(e)&&(e=[e]),Array.isArray(e))return e;if(!t)return e.default||[];let s=e[t];return s||(s=e[this.getScriptPartFromCode(t)]),s||(s=e[this.formatLanguageCode(t)]),s||(s=e[this.getLanguagePartFromCode(t)]),s||(s=e.default),s||[]}toResolveHierarchy(e,t){const s=this.options.fallbackLng,i=Array.isArray(s)?s.join("|"):s;i!==this._cachedFallbackLng&&(this.resolveHierarchyCache={},this._cachedFallbackLng=i);const n=void 0===t||!1===t||h(t),o=void 0===t&&"function"==typeof this.options.fallbackLng;let r=null;if(h(e)&&n&&!o){let s;s=void 0===t?"undefined":!1===t?"boolean:false":`string:${t}`,r=`${e.length}:${e}|${s}`}if(null!==r){const e=this.resolveHierarchyCache[r];if(void 0!==e)return e.slice()}const a=this.getFallbackCodes((!1===t?[]:t)||this.options.fallbackLng||[],e),l=[],c=e=>{e&&(this.isSupportedCode(e)?l.push(e):this.logger.warn(`rejecting language code not found in supportedLngs: ${e}`))};return h(e)&&(e.includes("-")||e.includes("_"))?("languageOnly"!==this.options.load&&c(this.formatLanguageCode(e)),"languageOnly"!==this.options.load&&"currentOnly"!==this.options.load&&c(this.getScriptPartFromCode(e)),"currentOnly"!==this.options.load&&c(this.getLanguagePartFromCode(e))):h(e)&&c(this.formatLanguageCode(e)),a.forEach((e=>{l.includes(e)||c(this.formatLanguageCode(e))})),null!==r?(this.resolveHierarchyCache[r]=l,l.slice()):l}}const M={zero:0,one:1,two:2,few:3,many:4,other:5},H={select:e=>1===e?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class U{constructor(e,t={}){this.languageUtils=e,this.options=t,this.logger=C.create("pluralResolver"),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(e,t={}){const s=P("dev"===e?"en":e),i=t.ordinal?"ordinal":"cardinal",n=JSON.stringify({cleanedCode:s,type:i});if(n in this.pluralRulesCache)return this.pluralRulesCache[n];let o;try{o=new Intl.PluralRules(s,{type:i})}catch(s){if("undefined"==typeof Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),H;if(!e.match(/-|_/))return H;const i=this.languageUtils.getLanguagePartFromCode(e);o=this.getRule(i,t)}return this.pluralRulesCache[n]=o,o}needsPlural(e,t={}){let s=this.getRule(e,t);return s||(s=this.getRule("dev",t)),s?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,t,s={}){return this.getSuffixes(e,s).map((e=>`${t}${e}`))}getSuffixes(e,t={}){let s=this.getRule(e,t);return s||(s=this.getRule("dev",t)),s?s.resolvedOptions().pluralCategories.sort(((e,t)=>M[e]-M[t])).map((e=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:""}${e}`)):[]}getSuffix(e,t,s={}){const i=this.getRule(e,s);return i?`${this.options.prepend}${s.ordinal?`ordinal${this.options.prepend}`:""}${i.select(t)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix("dev",t,s))}}const K=(e,t,s,i=".",n=!0)=>{let o=((e,t,s)=>{const i=b(e,s);return void 0!==i?i:b(t,s)})(e,t,s);return!o&&n&&h(s)&&(o=j(e,s,i),void 0===o&&(o=j(t,s,i))),o};class z{constructor(e={}){this.logger=C.create("interpolator"),this.options=e,this.format=e?.interpolation?.format||(e=>e),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});const{escape:t,escapeValue:s,useRawValueToEscape:i,prefix:n,prefixEscaped:o,suffix:r,suffixEscaped:a,formatSeparator:l,unescapeSuffix:c,unescapePrefix:u,nestingPrefix:h,nestingPrefixEscaped:p,nestingSuffix:d,nestingSuffixEscaped:g,nestingOptionsSeparator:f,maxReplaces:y,alwaysFormat:m}=e.interpolation;this.escape=void 0!==t?t:w,this.escapeValue=void 0===s||s,this.useRawValueToEscape=void 0!==i&&i,this.prefix=n?x(n):o||"{{",this.suffix=r?x(r):a||"}}",this.formatSeparator=l||",",this.unescapePrefix=c?"":u?x(u):"-",this.unescapeSuffix=this.unescapePrefix?"":c?x(c):"",this.nestingPrefix=h?x(h):p||x("$t("),this.nestingSuffix=d?x(d):g||x(")"),this.nestingOptionsSeparator=f||",",this.maxReplaces=y||1e3,this.alwaysFormat=void 0!==m&&m,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(e,t)=>e?.source===t?(e.lastIndex=0,e):new RegExp(t,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,t,s,i){let n,o,r;const a=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},l=e=>{if(!e.includes(this.formatSeparator)){const n=K(t,a,e,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(n,void 0,s,{...i,...t,interpolationkey:e}):n}const n=e.split(this.formatSeparator),o=n.shift().trim(),r=n.join(this.formatSeparator).trim();return this.format(K(t,a,o,this.options.keySeparator,this.options.ignoreJSONStructure),r,s,{...i,...t,interpolationkey:o})};this.resetRegExp(),!this.escapeValue&&"string"==typeof e&&/\$t\([^)]*\{[^}]*\{\{/.test(e)&&this.logger.warn("nesting options string contains interpolated variables with escapeValue: false — if any of those values are attacker-controlled they can inject additional nesting options (e.g. redirect lng/ns). Sanitise untrusted input before passing it to t(), or keep escapeValue: true.");const c=i?.missingInterpolationHandler||this.options.missingInterpolationHandler,u=void 0!==i?.interpolation?.skipOnVariables?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:e=>e},{regex:this.regexp,safeValue:e=>this.escapeValue?this.escape(e):e}].forEach((t=>{for(r=0;n=t.regex.exec(e);){const s=n[1].trim();if(o=l(s),void 0===o)if("function"==typeof c){const t=c(e,n,i);o=h(t)?t:""}else if(i&&Object.prototype.hasOwnProperty.call(i,s))o="";else{if(u){o=n[0];continue}this.logger.warn(`missed to pass in variable ${s} for interpolating ${e}`),o=""}else h(o)||this.useRawValueToEscape||(o=d(o));const a=t.safeValue(o);if(e=e.replace(n[0],a.replace(/\$/g,"$$$$")),u?(t.regex.lastIndex+=a.length,t.regex.lastIndex-=n[0].length):t.regex.lastIndex=0,r++,r>=this.maxReplaces)break}})),e}nest(e,t,s={}){let i,n,o;const r=(e,t)=>{const s=this.nestingOptionsSeparator;if(!e.includes(s))return e;const i=e.split(new RegExp(`${x(s)}[ ]*{`));let n=`{${i[1]}`;e=i[0],n=this.interpolate(n,o);const r=n.match(/'/g),a=n.match(/"/g);((r?.length??0)%2==0&&!a||(a?.length??0)%2!=0)&&(n=n.replace(/'/g,'"'));try{o=JSON.parse(n),t&&(o={...t,...o})}catch(t){return this.logger.warn(`failed parsing options string in nesting for key ${e}`,t),`${e}${s}${n}`}return o.defaultValue&&o.defaultValue.includes(this.prefix)&&delete o.defaultValue,e};for(;i=this.nestingRegexp.exec(e);){let a=[];o={...s},o=o.replace&&!h(o.replace)?o.replace:o,o.applyPostProcessor=!1,delete o.defaultValue;const l=/{.*}/s.test(i[1])?i[1].lastIndexOf("}")+1:i[1].indexOf(this.formatSeparator);if(-1!==l&&(a=i[1].slice(l).split(this.formatSeparator).map((e=>e.trim())).filter(Boolean),i[1]=i[1].slice(0,l)),n=t(r.call(this,i[1].trim(),o),o),n&&i[0]===e&&!h(n))return n;h(n)||(n=d(n)),n||(this.logger.warn(`missed to resolve ${i[1]} for nesting ${e}`),n=""),a.length&&(n=a.reduce(((e,t)=>this.format(e,t,s.lng,{...s,interpolationkey:i[1].trim()})),n.trim())),e=e.replace(i[0],n),this.regexp.lastIndex=0}return e}}const B=e=>{const t={};return(s,i,n)=>{let o=n;n&&n.interpolationkey&&n.formatParams&&n.formatParams[n.interpolationkey]&&n[n.interpolationkey]&&(o={...o,[n.interpolationkey]:void 0});const r=i+JSON.stringify(o);let a=t[r];return a||(a=e(P(i),n),t[r]=a),a(s)}},_=e=>(t,s,i)=>e(P(s),i)(t);class q{constructor(e={}){this.logger=C.create("formatter"),this.options=e,this.init(e)}init(e,t={interpolation:{}}){this.formatSeparator=t.interpolation.formatSeparator||",";const s=t.cacheInBuiltFormats?B:_;this.formats={number:s(((e,t)=>{const s=new Intl.NumberFormat(e,{...t});return e=>s.format(e)})),currency:s(((e,t)=>{const s=new Intl.NumberFormat(e,{...t,style:"currency"});return e=>s.format(e)})),datetime:s(((e,t)=>{const s=new Intl.DateTimeFormat(e,{...t});return e=>s.format(e)})),relativetime:s(((e,t)=>{const s=new Intl.RelativeTimeFormat(e,{...t});return e=>s.format(e,t.range||"day")})),list:s(((e,t)=>{const s=new Intl.ListFormat(e,{...t});return e=>s.format(e)}))}}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=B(t)}format(e,t,s,i={}){if(!t)return e;if(null==e)return e;const n=t.split(this.formatSeparator),o=[];for(let e=0;e<n.length;e++){let t=n[e];for(;t.indexOf("(")>-1&&!t.includes(")")&&e+1<n.length;)t=`${t}${this.formatSeparator}${n[++e]}`;o.push(t)}return o.reduce(((e,t)=>{const{formatName:n,formatOptions:o}=(e=>{let t=e.toLowerCase().trim();const s={};if(e.includes("(")){const i=e.split("(");t=i[0].toLowerCase().trim();const n=i[1].slice(0,-1);"currency"!==t||n.includes(":")?"relativetime"!==t||n.includes(":")?n.split(";").forEach((e=>{if(e){const[t,...i]=e.split(":"),n=i.join(":").trim().replace(/^'+|'+$/g,""),o=t.trim();s[o]||(s[o]=n),"false"===n&&(s[o]=!1),"true"===n&&(s[o]=!0),isNaN(n)||(s[o]=parseInt(n,10))}})):s.range||(s.range=n.trim()):s.currency||(s.currency=n.trim())}return{formatName:t,formatOptions:s}})(t);if(this.formats[n]){let t=e;try{const r=i?.formatParams?.[i.interpolationkey]||{},a=r.locale||r.lng||i.locale||i.lng||s;t=this.formats[n](e,a,{...o,...i,...r})}catch(e){this.logger.warn(e)}return t}return this.logger.warn(`there was no format function for ${n}`),e}),e)}}class J extends N{constructor(e,t,s,i={}){super(),this.backend=e,this.store=t,this.services=s,this.languageUtils=s.languageUtils,this.options=i,this.logger=C.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=i.maxParallelReads||10,this.readingCalls=0,this.maxRetries=i.maxRetries>=0?i.maxRetries:5,this.retryTimeout=i.retryTimeout>=1?i.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(s,i.backend,i)}queueLoad(e,t,s,i){const n={},o={},r={},a={};return e.forEach((e=>{let i=!0;t.forEach((t=>{const r=`${e}|${t}`;!s.reload&&this.store.hasResourceBundle(e,t)?this.state[r]=2:this.state[r]<0||(1===this.state[r]?void 0===o[r]&&(o[r]=!0):(this.state[r]=1,i=!1,void 0===o[r]&&(o[r]=!0),void 0===n[r]&&(n[r]=!0),void 0===a[t]&&(a[t]=!0)))})),i||(r[e]=!0)})),(Object.keys(n).length||Object.keys(o).length)&&this.queue.push({pending:o,pendingCount:Object.keys(o).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(n),pending:Object.keys(o),toLoadLanguages:Object.keys(r),toLoadNamespaces:Object.keys(a)}}loaded(e,t,s){const i=e.split("|"),n=i[0],o=i[1];t&&this.emit("failedLoading",n,o,t),!t&&s&&this.store.addResourceBundle(n,o,s,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&s&&(this.state[e]=0);const r={};this.queue.forEach((s=>{((e,t,s)=>{const{obj:i,k:n}=m(e,t,Object);i[n]=i[n]||[],i[n].push(s)})(s.loaded,[n],o),((e,t)=>{void 0!==e.pending[t]&&(delete e.pending[t],e.pendingCount--)})(s,e),t&&s.errors.push(t),0!==s.pendingCount||s.done||(Object.keys(s.loaded).forEach((e=>{r[e]||(r[e]={});const t=s.loaded[e];t.length&&t.forEach((t=>{void 0===r[e][t]&&(r[e][t]=!0)}))})),s.done=!0,s.errors.length?s.callback(s.errors):s.callback())})),this.emit("loaded",r),this.queue=this.queue.filter((e=>!e.done))}read(e,t,s,i=0,n=this.retryTimeout,o){if(!e.length)return o(null,{});if(this.readingCalls>=this.maxParallelReads)return void this.waitingReads.push({lng:e,ns:t,fcName:s,tried:i,wait:n,callback:o});this.readingCalls++;const r=(r,a)=>{if(this.readingCalls--,this.waitingReads.length>0){const e=this.waitingReads.shift();this.read(e.lng,e.ns,e.fcName,e.tried,e.wait,e.callback)}r&&a&&i<this.maxRetries?setTimeout((()=>{this.read(e,t,s,i+1,2*n,o)}),n):o(r,a)},a=this.backend[s].bind(this.backend);if(2!==a.length)return a(e,t,r);try{const s=a(e,t);s&&"function"==typeof s.then?s.then((e=>r(null,e))).catch(r):r(null,s)}catch(e){r(e)}}prepareLoading(e,t,s={},i){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),i&&i();h(e)&&(e=this.languageUtils.toResolveHierarchy(e)),h(t)&&(t=[t]);const n=this.queueLoad(e,t,s,i);if(!n.toLoad.length)return n.pending.length||i(),null;n.toLoad.forEach((e=>{this.loadOne(e)}))}load(e,t,s){this.prepareLoading(e,t,{},s)}reload(e,t,s){this.prepareLoading(e,t,{reload:!0},s)}loadOne(e,t=""){const s=e.split("|"),i=s[0],n=s[1];this.read(i,n,"read",void 0,void 0,((s,o)=>{s&&this.logger.warn(`${t}loading namespace ${n} for language ${i} failed`,s),!s&&o&&this.logger.log(`${t}loaded namespace ${n} for language ${i}`,o),this.loaded(e,s,o)}))}saveMissing(e,t,s,i,n,o={},r=()=>{}){if(!this.services?.utils?.hasLoadedNamespace||this.services?.utils?.hasLoadedNamespace(t)){if(null!=s&&""!==s){if(this.backend?.create){const a={...o,isUpdate:n},l=this.backend.create.bind(this.backend);if(l.length<6)try{let n;n=5===l.length?l(e,t,s,i,a):l(e,t,s,i),n&&"function"==typeof n.then?n.then((e=>r(null,e))).catch(r):r(null,n)}catch(e){r(e)}else l(e,t,s,i,r,a)}e&&e[0]&&this.store.addResource(e[0],t,s,i)}}else this.logger.warn(`did not save key "${s}" as the namespace "${t}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")}}const X=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",enableSelector:!1,partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let t={};if("object"==typeof e[1]&&(t=e[1]),h(e[1])&&(t.defaultValue=e[1]),h(e[2])&&(t.tDescription=e[2]),"object"==typeof e[2]||"object"==typeof e[3]){const s=e[3]||e[2];Object.keys(s).forEach((e=>{t[e]=s[e]}))}return t},interpolation:{escapeValue:!0,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),W=e=>(h(e.ns)&&(e.ns=[e.ns]),h(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),h(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&!e.supportedLngs.includes("cimode")&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e),Y=()=>{};class G extends N{constructor(e={},t){var s;if(super(),this.options=W(e),this.services={},this.logger=C,this.modules={external:[]},s=this,Object.getOwnPropertyNames(Object.getPrototypeOf(s)).forEach((e=>{"function"==typeof s[e]&&(s[e]=s[e].bind(s))})),t&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,t),this;setTimeout((()=>{this.init(e,t)}),0)}}init(e={},t){this.isInitializing=!0,"function"==typeof e&&(t=e,e={}),null==e.defaultNS&&e.ns&&(h(e.ns)?e.defaultNS=e.ns:e.ns.includes("translation")||(e.defaultNS=e.ns[0]));const s=X();this.options={...s,...this.options,...W(e)},this.options.interpolation={...s.interpolation,...this.options.interpolation},void 0!==e.keySeparator&&(this.options.userDefinedKeySeparator=e.keySeparator),void 0!==e.nsSeparator&&(this.options.userDefinedNsSeparator=e.nsSeparator),"function"!=typeof this.options.overloadTranslationOptionHandler&&(this.options.overloadTranslationOptionHandler=s.overloadTranslationOptionHandler);const i=e=>e?"function"==typeof e?new e:e:null;if(!this.options.isClone){let e;this.modules.logger?C.init(i(this.modules.logger),this.options):C.init(null,this.options),e=this.modules.formatter?this.modules.formatter:q;const t=new D(this.options);this.store=new E(this.options.resources,this.options);const s=this.services;s.logger=C,s.resourceStore=this.store,s.languageUtils=t,s.pluralResolver=new U(t,{prepend:this.options.pluralSeparator}),e&&(s.formatter=i(e),s.formatter.init&&s.formatter.init(s,this.options),this.options.interpolation.format=s.formatter.format.bind(s.formatter)),s.interpolator=new z(this.options),s.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},s.backendConnector=new J(i(this.modules.backend),s.resourceStore,s,this.options),s.backendConnector.on("*",((e,...t)=>{this.emit(e,...t)})),this.modules.languageDetector&&(s.languageDetector=i(this.modules.languageDetector),s.languageDetector.init&&s.languageDetector.init(s,this.options.detection,this.options)),this.modules.i18nFormat&&(s.i18nFormat=i(this.modules.i18nFormat),s.i18nFormat.init&&s.i18nFormat.init(this)),this.translator=new I(this.services,this.options),this.translator.on("*",((e,...t)=>{this.emit(e,...t)})),this.modules.external.forEach((e=>{e.init&&e.init(this)}))}if(this.format=this.options.interpolation.format,t||(t=Y),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const e=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);e.length>0&&"dev"!==e[0]&&(this.options.lng=e[0])}this.services.languageDetector||this.options.lng||this.logger.warn("init: no languageDetector is used and no lng is defined");["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach((e=>{this[e]=(...t)=>this.store[e](...t)}));["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach((e=>{this[e]=(...t)=>(this.store[e](...t),this)}));const n=p(),o=()=>{const e=(e,s)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),n.resolve(s),t(e,s)};if((this.languages||this.isLanguageChangingTo)&&!this.isInitialized)return e(null,this.t.bind(this));this.changeLanguage(this.options.lng,e)};return this.options.resources||!this.options.initAsync?o():setTimeout(o,0),n}loadResources(e,t=Y){let s=t;const i=h(e)?e:this.language;if("function"==typeof e&&(s=e),!this.options.resources||this.options.partialBundledLanguages){if("cimode"===i?.toLowerCase()&&(!this.options.preload||0===this.options.preload.length))return s();const e=[],t=t=>{if(!t)return;if("cimode"===t)return;this.services.languageUtils.toResolveHierarchy(t).forEach((t=>{"cimode"!==t&&(e.includes(t)||e.push(t))}))};if(i)t(i);else{this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach((e=>t(e)))}this.options.preload?.forEach?.((e=>t(e))),this.services.backendConnector.load(e,this.options.ns,(e=>{e||this.resolvedLanguage||!this.language||this.setResolvedLanguage(this.language),s(e)}))}else s(null)}reloadResources(e,t,s){const i=p();return"function"==typeof e&&(s=e,e=void 0),"function"==typeof t&&(s=t,t=void 0),e||(e=this.languages),t||(t=this.options.ns),s||(s=Y),this.services.backendConnector.reload(e,t,(e=>{i.resolve(),s(e)})),i}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return"backend"===e.type&&(this.modules.backend=e),("logger"===e.type||e.log&&e.warn&&e.error)&&(this.modules.logger=e),"languageDetector"===e.type&&(this.modules.languageDetector=e),"i18nFormat"===e.type&&(this.modules.i18nFormat=e),"postProcessor"===e.type&&A.addPostProcessor(e),"formatter"===e.type&&(this.modules.formatter=e),"3rdParty"===e.type&&this.modules.external.push(e),this}setResolvedLanguage(e){if(e&&this.languages&&!["cimode","dev"].includes(e)){for(let e=0;e<this.languages.length;e++){const t=this.languages[e];if(!["cimode","dev"].includes(t)&&this.store.hasLanguageSomeTranslations(t)){this.resolvedLanguage=t;break}}this.resolvedLanguage||this.languages.includes(e)||!this.store.hasLanguageSomeTranslations(e)||(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,t){this.isLanguageChangingTo=e;const s=p();this.emit("languageChanging",e);const i=e=>{this.language=e,this.languages=this.services.languageUtils.toResolveHierarchy(e),this.resolvedLanguage=void 0,this.setResolvedLanguage(e)},n=(n,o)=>{o?this.isLanguageChangingTo===e&&(i(o),this.translator.changeLanguage(o),this.isLanguageChangingTo=void 0,this.emit("languageChanged",o),this.logger.log("languageChanged",o)):this.isLanguageChangingTo=void 0,s.resolve(((...e)=>this.t(...e))),t&&t(n,((...e)=>this.t(...e)))},o=t=>{e||t||!this.services.languageDetector||(t=[]);const s=h(t)?t:t&&t[0],o=this.store.hasLanguageSomeTranslations(s)?s:this.services.languageUtils.getBestMatchFromCodes(h(t)?[t]:t);o&&(this.language||i(o),this.translator.language||this.translator.changeLanguage(o),this.services.languageDetector?.cacheUserLanguage?.(o)),this.loadResources(o,(e=>{n(e,o)}))};return e||!this.services.languageDetector||this.services.languageDetector.async?!e&&this.services.languageDetector&&this.services.languageDetector.async?0===this.services.languageDetector.detect.length?this.services.languageDetector.detect().then(o):this.services.languageDetector.detect(o):o(e):o(this.services.languageDetector.detect()),s}getFixedT(e,t,s,i){const n=i?.scopeNs,o=(e,t,...i)=>{let r;r="object"!=typeof t?this.options.overloadTranslationOptionHandler([e,t].concat(i)):{...t},r.lng=r.lng||o.lng,r.lngs=r.lngs||o.lngs;const a=void 0!==r.ns&&null!==r.ns;r.ns=r.ns||o.ns,""!==r.keyPrefix&&(r.keyPrefix=r.keyPrefix||s||o.keyPrefix);const l={...this.options,...r};Array.isArray(n)&&!a&&(l.ns=n),"function"==typeof r.keyPrefix&&(r.keyPrefix=F(r.keyPrefix,l));const c=this.options.keySeparator||".";let u;return r.keyPrefix&&Array.isArray(e)?u=e.map((e=>("function"==typeof e&&(e=F(e,l)),`${r.keyPrefix}${c}${e}`))):("function"==typeof e&&(e=F(e,l)),u=r.keyPrefix?`${r.keyPrefix}${c}${e}`:e),this.t(u,r)};return h(e)?o.lng=e:o.lngs=e,o.ns=t,o.keyPrefix=s,o}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,t={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const s=t.lng||this.resolvedLanguage||this.languages[0],i=!!this.options&&this.options.fallbackLng,n=this.languages[this.languages.length-1];if("cimode"===s.toLowerCase())return!0;const o=(e,t)=>{const s=this.services.backendConnector.state[`${e}|${t}`];return-1===s||0===s||2===s};if(t.precheck){const e=t.precheck(this,o);if(void 0!==e)return e}return!!this.hasResourceBundle(s,e)||(!(this.services.backendConnector.backend&&(!this.options.resources||this.options.partialBundledLanguages))||!(!o(s,e)||i&&!o(n,e)))}loadNamespaces(e,t){const s=p();return this.options.ns?(h(e)&&(e=[e]),e.forEach((e=>{this.options.ns.includes(e)||this.options.ns.push(e)})),this.loadResources((e=>{s.resolve(),t&&t(e)})),s):(t&&t(),Promise.resolve())}loadLanguages(e,t){const s=p();h(e)&&(e=[e]);const i=this.options.preload||[],n=e.filter((e=>!i.includes(e)&&this.services.languageUtils.isSupportedCode(e)));return n.length?(this.options.preload=i.concat(n),this.loadResources((e=>{s.resolve(),t&&t(e)})),s):(t&&t(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!e)return"rtl";try{const t=new Intl.Locale(e);if(t&&t.getTextInfo){const e=t.getTextInfo();if(e&&e.direction)return e.direction}}catch(e){}const t=this.services?.languageUtils||new D(X());return e.toLowerCase().indexOf("-latn")>1?"ltr":["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"].includes(t.getLanguagePartFromCode(e))||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(e={},t){const s=new G(e,t);return s.createInstance=G.createInstance,s}cloneInstance(e={},t=Y){const s=e.forkResourceStore;s&&delete e.forkResourceStore;const i={...this.options,...e,isClone:!0},n=new G(i);void 0===e.debug&&void 0===e.prefix||(n.logger=n.logger.clone(e));if(["store","services","language"].forEach((e=>{n[e]=this[e]})),n.services={...this.services},n.services.utils={hasLoadedNamespace:n.hasLoadedNamespace.bind(n)},s){const e=Object.keys(this.store.data).reduce(((e,t)=>(e[t]={...this.store.data[t]},e[t]=Object.keys(e[t]).reduce(((s,i)=>(s[i]={...e[t][i]},s)),e[t]),e)),{});n.store=new E(e,i),n.services.resourceStore=n.store}if(e.interpolation){const t={...X().interpolation,...this.options.interpolation,...e.interpolation},s={...i,interpolation:t};n.services.interpolator=new z(s)}return n.translator=new I(n.services,i),n.translator.on("*",((e,...t)=>{n.emit(e,...t)})),n.init(i,t),n.translator.options=i,n.translator.backendConnector.services.utils={hasLoadedNamespace:n.hasLoadedNamespace.bind(n)},n}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const Q=G.createInstance();Q.createInstance,Q.dir,Q.init,Q.loadResources,Q.reloadResources,Q.use,Q.changeLanguage,Q.getFixedT,Q.t,Q.exists,Q.setDefaultNamespace,Q.hasLoadedNamespace,Q.loadNamespaces,Q.loadLanguages;var Z=s(40694),ee=s(41705);function te(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,i)}return s}function se(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?te(Object(s),!0).forEach((function(t){(0,ee.A)(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):te(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}var ie=function(){return(0,n.A)((function e(t){(0,i.A)(this,e),this.store=t.store}),[{key:"setItem",value:function(e,t){if(this.store)try{this.store.setItem(e,t)}catch(e){}}},{key:"getItem",value:function(e,t){if(this.store)try{return this.store.getItem(e,t)}catch(e){}}}])}();var ne=function(){return(0,n.A)((function e(t){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};(0,i.A)(this,e),this.init(t,s),this.type="backend"}),[{key:"init",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.services=e,this.options=se(se(se({},function(){var e=null;try{e=window.localStorage}catch(e){"undefined"!=typeof window&&console.log("Failed to load local storage.",e)}return{prefix:"i18next_res_",expirationTime:6048e5,defaultVersion:void 0,getVersion:void 0,versions:{},store:e}}()),this.options),t),this.storage=new ie(this.options)}},{key:"read",value:function(e,t,s){var i=Date.now();if(!this.storage.store)return s(null,null);var n=this.storage.getItem("".concat(this.options.prefix).concat(e,"-").concat(t));if(n)try{n=JSON.parse(n)}catch(e){n=null}if(n&&"object"===(0,Z.A)(n)){var o=this.getVersion(e,t);if(n.i18nStamp&&n.i18nStamp+this.options.expirationTime>i&&o===n.i18nVersion){var r=n.i18nStamp;return delete n.i18nVersion,delete n.i18nStamp,s(null,n,r)}}return s(null,null)}},{key:"save",value:function(e,t,s){if(this.storage.store){var i=se(se({},s),{},{i18nStamp:Date.now()}),n=this.getVersion(e,t);n&&(i.i18nVersion=n),this.storage.setItem("".concat(this.options.prefix).concat(e,"-").concat(t),JSON.stringify(i))}}},{key:"getVersion",value:function(e,t){var s,i=this.options,n=i.getVersion,o=i.versions,r=i.defaultVersion,a=Object.prototype.hasOwnProperty.call(o,e)?o[e]:void 0;return(null===(s=n)||void 0===s?void 0:s(e,t))||a||r}}])}();ne.type="backend";var oe=s(62242),re=s(13738),ae=[],le=ae.forEach,ce=ae.slice;function ue(e,t){if(t&&"object"===(0,Z.A)(t)){var s="",i=encodeURIComponent;for(var n in t)s+="&"+i(n)+"="+i(t[n]);if(!s)return e;e=e+(-1!==e.indexOf("?")?"&":"?")+s.slice(1)}return e}function he(e,t,s,i,n){i&&"object"===(0,Z.A)(i)&&(n||(i._t=new Date),i=ue("",i).slice(1)),t.queryStringParams&&(e=ue(e,t.queryStringParams));try{var o;(o=XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("MSXML2.XMLHTTP.3.0")).open(i?"POST":"GET",e,1),t.crossDomain||o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.withCredentials=!!t.withCredentials,i&&o.setRequestHeader("Content-type","application/x-www-form-urlencoded"),o.overrideMimeType&&o.overrideMimeType("application/json");var r=t.customHeaders;if(r="function"==typeof r?r():r)for(var a in r)o.setRequestHeader(a,r[a]);o.onreadystatechange=function(){o.readyState>3&&s&&s(o.responseText,o)},o.send(i)}catch(e){console&&console.log(e)}}var pe=function(){function e(t){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};(0,i.A)(this,e),this.init(t,s),this.type="backend"}return(0,n.A)(e,[{key:"init",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.services=e,this.options=function(e){return le.call(ce.call(arguments,1),(function(t){if(t)for(var s in t)void 0===e[s]&&(e[s]=t[s])})),e}(t,this.options||{},{loadPath:"/locales/{{lng}}/{{ns}}.json",addPath:"/locales/add/{{lng}}/{{ns}}",allowMultiLoading:!1,parse:JSON.parse,parsePayload:function(e,t,s){return(0,ee.A)({},t,s||"")},crossDomain:!1,ajax:he})}},{key:"readMulti",value:function(e,t,s){var i=this.options.loadPath;"function"==typeof this.options.loadPath&&(i=this.options.loadPath(e,t));var n=this.services.interpolator.interpolate(i,{lng:e.join("+"),ns:t.join("+")});this.loadUrl(n,s)}},{key:"read",value:function(e,t,s){var i=this.options.loadPath;"function"==typeof this.options.loadPath&&(i=this.options.loadPath([e],[t]));var n=this.services.interpolator.interpolate(i,{lng:e,ns:t});this.loadUrl(n,s)}},{key:"loadUrl",value:function(e,t){var s=this;this.options.ajax(e,this.options,(function(i,n){if(n.status>=500&&n.status<600)return t("failed loading "+e,!0);if(n.status>=400&&n.status<500)return t("failed loading "+e,!1);var o,r;try{o=s.options.parse(i,e)}catch(t){r="failed parsing "+e+" to json"}if(r)return t(r,!1);t(null,o)}))}},{key:"create",value:function(e,t,s,i){var n=this;"string"==typeof e&&(e=[e]);var o=this.options.parsePayload(t,s,i);e.forEach((function(e){var s=n.services.interpolator.interpolate(n.options.addPath,{lng:e,ns:t});n.options.ajax(s,n.options,(function(e,t){}),o)}))}}]),e}();pe.type="backend";var de=pe;class ge{static init(e,t,s,i){const n=[];(0,oe.A)()&&n.push(ne),n.push(de),Q.use(u).init({backend:{backends:n,backendOptions:[{versions:{[t]:e}},{crossDomain:s,loadPath:e}]},lng:t},(e=>{e&&e.length&&(0,re.A)(`/no_js_locale?message=${e[0]}`);try{i()}catch(e){throw(0,re.A)(`/js_init_failure?message=${e}`),e}}))}static t(...e){return Q.t(...e)||e[0]}}},62242:function(e,t,s){function i(){const e="local-storage-availability-test";try{return window.localStorage.setItem(e,e),window.localStorage.getItem(e),window.localStorage.removeItem(e),!0}catch{return!1}}s.d(t,{A:function(){return i}})},13738:function(e,t){t.A=e=>{let t=!1;window.XMLHttpRequest?t=new XMLHttpRequest:window.ActiveXObject&&(t=new ActiveXObject("Microsoft.XMLHTTP")),!1!==t&&(t.open("GET",e,!0),t.send())}},92099:function(e,t,s){function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}s.d(t,{A:function(){return i}})},48183:function(e,t,s){s.d(t,{A:function(){return o}});var i=s(92162);function n(e,t){for(var s=0;s<t.length;s++){var n=t[s];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,(0,i.A)(n.key),n)}}function o(e,t,s){return t&&n(e.prototype,t),s&&n(e,s),Object.defineProperty(e,"prototype",{writable:!1}),e}},41705:function(e,t,s){s.d(t,{A:function(){return n}});var i=s(92162);function n(e,t,s){return(t=(0,i.A)(t))in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}},92162:function(e,t,s){s.d(t,{A:function(){return n}});var i=s(40694);function n(e){var t=function(e,t){if("object"!=(0,i.A)(e)||!e)return e;var s=e[Symbol.toPrimitive];if(void 0!==s){var n=s.call(e,t||"default");if("object"!=(0,i.A)(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==(0,i.A)(t)?t:t+""}},40694:function(e,t,s){function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}s.d(t,{A:function(){return i}})}},function(e){e(81734)}]);
|
||
//# sourceMappingURL=i18n_init-1e288edcb34f9849a92e.js.map
|
||
//]]>
|
||
</script>
|
||
<script src="https://cdn.theconversation.com/static/tc/runtime-7f6276551e9e9922f5b3.js"></script>
|
||
|
||
|
||
</body>
|
||
</html>
|
||
|