PageSourceSearch

https://churnsolution.com/docs/install/

html churnsolution.com collected 2026-10-03 22:03:29 UTC 393,202 bytes, 3,870 lines download raw bytes

1<!DOCTYPE html>
2<html dir="ltr" lang="en-US" prefix="og: https://ogp.me/ns#">
3<head>
4<meta charset="UTF-8">
5<meta name="viewport" content="width=device-width, initial-scale=1">
6	 <link rel="profile" href="https://gmpg.org/xfn/11"> 
7	 
8<script id="getautoseo-conversion-tracker" defer src="https://churnsolution.com/wp-content/plugins/getautoseo-ai-content-publisher/assets/js/conversion-tracker.js?ver=1.3.83" data-endpoint="https://churnsolution.com/wp-json/autoseo/v1/conversion-event" data-pageview-endpoint="https://churnsolution.com/wp-json/autoseo/v1/article-pageview" data-token="c6d45848cb11ecae53357cafd881b3d5d3121e0540f01e0b1f260881a66d2f4a" data-article-id=""></script>
8
9<title>Installing Churn Solution | Churn Solution</title>
10
11		<!-- All in One SEO 4.9.3 - aioseo.com -->
12	<meta name="description" content="How to integrate the cancellation flow with your application or service" />
13	<meta name="robots" content="max-image-preview:large" />
14	<link rel="canonical" href="https://churnsolution.com/docs/install/" />
15	<meta name="generator" content="All in One SEO (AIOSEO) 4.9.3" />
16		<meta property="og:locale" content="en_US" />
17		<meta property="og:site_name" content="Churn Solution | Churn solution that turns your customers right around." />
18		<meta property="og:type" content="article" />
19		<meta property="og:title" content="Installing Churn Solution | Churn Solution" />
20		<meta property="og:description" content="How to integrate the cancellation flow with your application or service" />
21		<meta property="og:url" content="https://churnsolution.com/docs/install/" />
22		<meta property="og:image" content="https://churnsolution.com/wp-content/uploads/2024/04/CS-logo-300X300-1.png" />
23		<meta property="og:image:secure_url" content="https://churnsolution.com/wp-content/uploads/2024/04/CS-logo-300X300-1.png" />
24		<meta property="og:image:width" content="1200" />
25		<meta property="og:image:height" content="630" />
26		<meta property="article:published_time" content="2024-03-03T18:30:08+00:00" />
27		<meta property="article:modified_time" content="2026-08-06T09:08:35+00:00" />
28		<meta name="twitter:card" content="summary_large_image" />
29		<meta name="twitter:title" content="Installing Churn Solution | Churn Solution" />
30		<meta name="twitter:description" content="How to integrate the cancellation flow with your application or service" />
31		<meta name="twitter:image" content="https://churnsolution.com/wp-content/uploads/2024/04/CS-logo-300X300-1.png" />
32		
32<script type="application/ld+json" class="aioseo-schema">
33			{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/churnsolution.com\/docs\/install\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/churnsolution.com#listItem","position":1,"name":"Home","item":"https:\/\/churnsolution.com","nextItem":{"@type":"ListItem","@id":"https:\/\/churnsolution.com\/docs\/#listItem","name":"docs"}},{"@type":"ListItem","@id":"https:\/\/churnsolution.com\/docs\/#listItem","position":2,"name":"docs","item":"https:\/\/churnsolution.com\/docs\/","nextItem":{"@type":"ListItem","@id":"https:\/\/churnsolution.com\/docs\/install\/#listItem","name":"Installing Churn Solution"},"previousItem":{"@type":"ListItem","@id":"https:\/\/churnsolution.com#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/churnsolution.com\/docs\/install\/#listItem","position":3,"name":"Installing Churn Solution","previousItem":{"@type":"ListItem","@id":"https:\/\/churnsolution.com\/docs\/#listItem","name":"docs"}}]},{"@type":"Organization","@id":"https:\/\/churnsolution.com\/#organization","name":"Churn Solution","description":"Churn solution that turns your customers right around.","url":"https:\/\/churnsolution.com\/","logo":{"@type":"ImageObject","url":"https:\/\/churnsolution.com\/wp-content\/uploads\/2023\/09\/cropped-logo-1-2.png","@id":"https:\/\/churnsolution.com\/docs\/install\/#organizationLogo","width":86,"height":105,"caption":"logo"},"image":{"@id":"https:\/\/churnsolution.com\/docs\/install\/#organizationLogo"}},{"@type":"WebPage","@id":"https:\/\/churnsolution.com\/docs\/install\/#webpage","url":"https:\/\/churnsolution.com\/docs\/install\/","name":"Installing Churn Solution | Churn Solution","description":"How to integrate the cancellation flow with your application or service","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/churnsolution.com\/#website"},"breadcrumb":{"@id":"https:\/\/churnsolution.com\/docs\/install\/#breadcrumblist"},"datePublished":"2024-03-03T18:30:08+00:00","dateModified":"2026-08-06T09:08:35+00:00"},{"@type":"WebSite","@id":"https:\/\/churnsolution.com\/#website","url":"https:\/\/churnsolution.com\/","name":"Churn Solution","description":"Churn solution that turns your customers right around.","inLanguage":"en-US","publisher":{"@id":"https:\/\/churnsolution.com\/#organization"}}]}
34		</script>
34
35		<!-- All in One SEO -->
36
37<link rel="alternate" type="application/rss+xml" title="Churn Solution &raquo; Feed" href="https://churnsolution.com/feed/" />
38<link rel="alternate" type="application/rss+xml" title="Churn Solution &raquo; Comments Feed" href="https://churnsolution.com/comments/feed/" />
39<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://churnsolution.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fchurnsolution.com%2Fdocs%2Finstall%2F" />
40<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://churnsolution.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fchurnsolution.com%2Fdocs%2Finstall%2F&#038;format=xml" />
41<style id="wp-img-auto-sizes-contain-inline-css">
42img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
43/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
44</style>
45<link rel='stylesheet' id='astra-theme-css-css' href='https://churnsolution.com/wp-content/themes/astra/assets/css/minified/main.min.css?ver=4.3.0' media='all' />
46<style id="astra-theme-css-inline-css">
47:root{--ast-container-default-xlg-padding:3em;--ast-container-default-lg-padding:3em;--ast-container-default-slg-padding:2em;--ast-container-default-md-padding:3em;--ast-container-default-sm-padding:3em;--ast-container-default-xs-padding:2.4em;--ast-container-default-xxs-padding:1.8em;--ast-code-block-background:#ECEFF3;--ast-comment-inputs-background:#F9FAFB;}html{font-size:112.5%;}a{color:var(--ast-global-color-0);}a:hover,a:focus{color:var(--ast-global-color-1);}body,button,input,select,textarea,.ast-button,.ast-custom-button{font-family:Poppins,sans-serif;font-weight:inherit;font-size:18px;font-size:1rem;}blockquote{color:var(--ast-global-color-3);}.site-title{font-size:35px;font-size:1.9444444444444rem;display:block;}header .custom-logo-link img{max-width:30px;}.astra-logo-svg{width:30px;}.site-header .site-description{font-size:15px;font-size:0.83333333333333rem;display:none;}.entry-title{font-size:30px;font-size:1.6666666666667rem;}h1,.entry-content h1{font-size:64px;font-size:3.5555555555556rem;}h2,.entry-content h2{font-size:48px;font-size:2.6666666666667rem;}h3,.entry-content h3{font-size:24px;font-size:1.3333333333333rem;}h4,.entry-content h4{font-size:20px;font-size:1.1111111111111rem;}h5,.entry-content h5{font-size:18px;font-size:1rem;}h6,.entry-content h6{font-size:15px;font-size:0.83333333333333rem;}::selection{background-color:var(--ast-global-color-0);color:#ffffff;}body,h1,.entry-title a,.entry-content h1,h2,.entry-content h2,h3,.entry-content h3,h4,.entry-content h4,h5,.entry-content h5,h6,.entry-content h6{color:var(--ast-global-color-3);}.tagcloud a:hover,.tagcloud a:focus,.tagcloud a.current-item{color:#ffffff;border-color:var(--ast-global-color-0);background-color:var(--ast-global-color-0);}input:focus,input[type="text"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="password"]:focus,input[type="reset"]:focus,input[type="search"]:focus,textarea:focus{border-color:var(--ast-global-color-0);}input[type="radio"]:checked,input[type=reset],input[type="checkbox"]:checked,input[type="checkbox"]:hover:checked,input[type="checkbox"]:focus:checked,input[type=range]::-webkit-slider-thumb{border-color:var(--ast-global-color-0);background-color:var(--ast-global-color-0);box-shadow:none;}.site-footer a:hover + .post-count,.site-footer a:focus + .post-count{background:var(--ast-global-color-0);border-color:var(--ast-global-color-0);}.single .nav-links .nav-previous,.single .nav-links .nav-next{color:var(--ast-global-color-0);}.entry-meta,.entry-meta *{line-height:1.45;color:var(--ast-global-color-0);}.entry-meta a:hover,.entry-meta a:hover *,.entry-meta a:focus,.entry-meta a:focus *,.page-links > .page-link,.page-links .page-link:hover,.post-navigation a:hover{color:var(--ast-global-color-1);}#cat option,.secondary .calendar_wrap thead a,.secondary .calendar_wrap thead a:visited{color:var(--ast-global-color-0);}.secondary .calendar_wrap #today,.ast-progress-val span{background:var(--ast-global-color-0);}.secondary a:hover + .post-count,.secondary a:focus + .post-count{background:var(--ast-global-color-0);border-color:var(--ast-global-color-0);}.calendar_wrap #today > a{color:#ffffff;}.page-links .page-link,.single .post-navigation a{color:var(--ast-global-color-0);}.ast-archive-title{color:var(--ast-global-color-2);}.widget-title,.widget .wp-block-heading{font-size:25px;font-size:1.3888888888889rem;color:var(--ast-global-color-2);}a:focus-visible,.ast-menu-toggle:focus-visible,.site .skip-link:focus-visible,.wp-block-loginout input:focus-visible,.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper,.ast-header-navigation-arrow:focus-visible,.woocommerce .wc-proceed-to-checkout > .checkout-button:focus-visible,.woocommerce .woocommerce-MyAccount-navigation ul li a:focus-visible,.ast-orders-table__row .ast-orders-table__cell:focus-visible,.woocommerce .woocommerce-order-details .order-again > .button:focus-visible,.woocommerce .woocommerce-message a.button.wc-forward:focus-visible,.woocommerce #minus_qty:focus-visible,.woocommerce #plus_qty:focus-visible,a#ast-apply-coupon:focus-visible,.woocommerce .woocommerce-info a:focus-visible,.woocommerce .astra-shop-summary-wrap a:focus-visible,.woocommerce a.wc-forward:focus-visible,#ast-apply-coupon:focus-visible,.woocommerce-js .woocommerce-mini-cart-item a.remove:focus-visible{outline-style:dotted;outline-color:inherit;outline-width:thin;border-color:transparent;}input:focus,input[type="text"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="password"]:focus,input[type="reset"]:focus,input[type="search"]:focus,input[type="number"]:focus,textarea:focus,.wp-block-search__input:focus,[data-section="section-header-mobile-trigger"] .ast-button-wrap .ast-mobile-menu-trigger-minimal:focus,.ast-mobile-popup-drawer.active .menu-toggle-close:focus,.woocommerce-ordering select.orderby:focus,#ast-scroll-top:focus,#coupon_code:focus,.woocommerce-page #comment:focus,.woocommerce #reviews #respond input#submit:focus,.woocommerce a.add_to_cart_button:focus,.woocommerce .button.single_add_to_cart_button:focus,.woocommerce .woocommerce-cart-form button:focus,.woocommerce .woocommerce-cart-form__cart-item .quantity .qty:focus,.woocommerce .woocommerce-billing-fields .woocommerce-billing-fields__field-wrapper .woocommerce-input-wrapper > .input-text:focus,.woocommerce #order_comments:focus,.woocommerce #place_order:focus,.woocommerce .woocommerce-a
47ddress-fields .woocommerce-address-fields__field-wrapper .woocommerce-input-wrapper > .input-text:focus,.woocommerce .woocommerce-MyAccount-content form button:focus,.woocommerce .woocommerce-MyAccount-content .woocommerce-EditAccountForm .woocommerce-form-row .woocommerce-Input.input-text:focus,.woocommerce .ast-woocommerce-container .woocommerce-pagination ul.page-numbers li a:focus,body #content .woocommerce form .form-row .select2-container--default .select2-selection--single:focus,#ast-coupon-code:focus,.woocommerce.woocommerce-js .quantity input[type=number]:focus,.woocommerce-js .woocommerce-mini-cart-item .quantity input[type=number]:focus,.woocommerce p#ast-coupon-trigger:focus{border-style:dotted;border-color:inherit;border-width:thin;outline-color:transparent;}.ast-logo-title-inline .site-logo-img{padding-right:1em;}.site-logo-img img{ transition:all 0.2s linear;}.ast-header-break-point #ast-desktop-header{display:none;}@media (min-width:921px){#ast-mobile-header{display:none;}}.wp-block-buttons.aligncenter{justify-content:center;}@media (max-width:921px){.ast-theme-transparent-header #primary,.ast-theme-transparent-header #secondary{padding:0;}}@media (max-width:921px){.ast-plain-container.ast-no-sidebar #primary{padding:0;}}.ast-plain-container.ast-no-sidebar #primary{margin-top:0;margin-bottom:0;}.wp-block-button.is-style-outline .wp-block-button__link{border-color:var(--ast-global-color-5);}div.wp-block-button.is-style-outline > .wp-block-button__link:not(.has-text-color),div.wp-block-button.wp-block-button__link.is-style-outline:not(.has-text-color){color:var(--ast-global-color-5);}.wp-block-button.is-style-outline .wp-block-button__link:hover,div.wp-block-button.is-style-outline .wp-block-button__link:focus,div.wp-block-button.is-style-outline > .wp-block-button__link:not(.has-text-color):hover,div.wp-block-button.wp-block-button__link.is-style-outline:not(.has-text-color):hover{color:#0f124d;background-color:var(--ast-global-color-5);border-color:var(--ast-global-color-5);}.post-page-numbers.current .page-link,.ast-pagination .page-numbers.current{color:#ffffff;border-color:var(--ast-global-color-0);background-color:var(--ast-global-color-0);border-radius:2px;}h1.widget-title{font-weight:inherit;}h2.widget-title{font-weight:inherit;}h3.widget-title{font-weight:inherit;}#page{display:flex;flex-direction:column;min-height:100vh;}.ast-404-layout-1 h1.page-title{color:var(--ast-global-color-2);}.single .post-navigation a{line-height:1em;height:inherit;}.error-404 .page-sub-title{font-size:1.5rem;font-weight:inherit;}.search .site-content .content-area .search-form{margin-bottom:0;}#page .site-content{flex-grow:1;}.widget{margin-bottom:1.25em;}#secondary li{line-height:1.5em;}#secondary .wp-block-group h2{margin-bottom:0.7em;}#secondary h2{font-size:1.7rem;}.ast-separate-container .ast-article-post,.ast-separate-container .ast-article-single,.ast-separate-container .ast-comment-list li.depth-1,.ast-separate-container .comment-respond{padding:3em;}.ast-separate-container .ast-article-single .ast-article-single{padding:0;}.ast-article-single .wp-block-post-template-is-layout-grid{padding-left:0;}.ast-separate-container .ast-comment-list li.depth-1,.hentry{margin-bottom:2em;}.ast-separate-container .ast-archive-description,.ast-separate-container .ast-author-box{border-bottom:1px solid var(--ast-border-color);}.ast-separate-container .comments-title{padding:2em 2em 0 2em;}.ast-page-builder-template .comment-form-textarea,.ast-comment-formwrap .ast-grid-common-col{padding:0;}.ast-comment-formwrap{padding:0 20px;display:inline-flex;column-gap:20px;}.archive.ast-page-builder-template .entry-header{margin-top:2em;}.ast-page-builder-template .ast-comment-formwrap{width:100%;}.entry-title{margin-bottom:0.5em;}.ast-archive-description p{font-size:inherit;font-weight:inherit;line-height:inherit;}@media (min-width:921px){.ast-left-sidebar.ast-page-builder-template #secondary,.archive.ast-right-sidebar.ast-page-builder-template .site-main{padding-left:20px;padding-right:20px;}}@media (max-width:544px){.ast-comment-formwrap.ast-row{column-gap:10px;display:inline-block;}#ast-commentform .ast-grid-common-col{position:relative;width:100%;}}@media (min-width:1201px){.ast-separate-container .ast-article-post,.ast-separate-container .ast-article-single,.ast-separate-container .ast-author-box,.ast-separate-container .ast-404-layout-1,.ast-separate-container .no-results{padding:3em;}}@media (max-width:921px){.ast-separate-container #primary,.ast-separate-container #secondary{padding:1.5em 0;}#primary,#secondary{padding:1.5em 0;margin:0;}.ast-left-sidebar #content > .ast-container{display:flex;flex-direction:column-reverse;width:100%;}}@media (min-width:922px){.ast-separate-container.ast-right-sidebar #primary,.ast-separate-container.ast-left-sidebar #primary{border:0;}.search-no-results.ast-separate-container #primary{margin-bottom:4em;}}.wp-block-button .wp-block-button__link{color:var(--ast-global-color-2);}.wp-block-button .wp-block-button__link:hover,.wp-block-button .wp-block-button__link:focus{color:#0f124d;background-color:var(--ast-global-color-5);border-color:var(--ast-global-color-5);}.wp-block-button .wp-block-button__link,.wp-block-search .wp-block-search__button,body .wp-block-file .wp-block-file__button{border-style:solid;border-top-width:0px;border-right-width:0px;border-left-width:0px;border-bottom-width:0px;border-color:var(--ast-global-color-5);background-color:var(--ast-global-color-5);color:var(--ast-global-color-2);font-family:inherit;font-weight:600;line-height:1em;font-size:20px;font-size:1.1111111111111rem;border-top-left-radius:8px;border-top-right-radius:8px;border-bottom-right-radius:8px;border-bottom-left-radius:8px;padding-top:12px;padding-right:24px;padding-bottom:12px;padding-left:24px;}@media (max-width:921px){.wp-block-button .wp-block-button__link,.wp-block-search .wp-block-search__button,body .wp-block-file .wp-block-file__button{padding-top:18px;padding-right:32px;padding-bottom:18px;padding-left:32px;}}@media (max-width:544px){.wp-block-button .wp-block-button__link,.wp-block-search .wp-block-search__button,body .wp-block-file .wp-block-file__button{padding-top:15px;padding-right:28px;padding-bottom:15px;padding-left:28px;}}.menu-toggle,button,.ast-button,.ast-custom-button,.button,input#submit,input[type="button"],input[type="submit"],input[type="reset"],#comments .submit,.search .search-submit,form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button,body .wp-block-file .wp-block-file__button,.search .search-submit,.woocommerce-js a.button,.woocommerce button.button,.woocommerce .woocommerce-message a.button,.woocommerce #respond input#submit.alt,.woocommerce input.button.alt,.woocommerce input.button,.woocommerce input.button:disabled,.woocommerce input.button:disabled[disabled],.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled]:hover,.woocommerce #respond input#submit,.woocommerce button.button.alt.disabled,.wc-block-grid__products .wc-block-grid__product .wp-block-button__link,.wc-block-grid__product-onsale,[CLASS*="wc-block"] button,.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons .button:not(.checkout):not(.ast-continue-shopping),.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons a.checkout,.woocommerce button.button.alt.disabled.wc-variation-selection-needed{border-style:solid;border-top-width:0px;border-right-width:0px;border-left-width:0px;border-bottom-width:0px;color:var(--ast-global-color-2);border-color:var(--ast-global-color-5);background-color:var(--ast-global-color-5);padding-top:12px;padding-right:24px;padding-bottom:12px;padding-left:24px;font-family:inherit;font-weight:600;font-size:20px;font-size:1.1111111111111rem;line-height:1em;border-top-left-radius:8px;border-top-right-radius:8px;border-bottom-right-radius:8px;border-bottom-left-radius:8px;}button:focus,.menu-toggle:hover,button:hover,.ast-button:hover,.ast-custom-button:hover .button:hover,.ast-custom-button:hover ,input[type=reset]:hover,input[type=reset]:focus,input#submit:hover,input#submit:focus,input[type="button"]:hover,input[type="button"]:focus,input[type="submit"]:hover,input[type="submit"]:focus,form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button:hover,form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button:focus,body .wp-block-file .wp-block-file__button:hover,body .wp-block-file .wp-block-file__button:focus,.woocommerce-js a.button:hover,.woocommerce button.button:hover,.woocommerce .woocommerce-message a.button:hover,.woocommerce #respond input#submit:hover,.woocommerce #respond input#submit.alt:hover,.woocommerce input.button.alt:hover,.woocommerce input.button:hover,.woocommerce button.button.alt.disabled:hover,.wc-block-grid__products .wc-block-grid__product .wp-block-button__link:hover,[CLASS*="wc-block"] button:hover,.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons .button:not(.checkout):not(.ast-continue-shopping):hover,.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons a.checkout:hover,.woocommerce button.button.alt.disabled.wc-variation-selection-needed:hover{color:#0f124d;background-color:var(--ast-global-color-5);border-color:var(--ast-global-color-5);}form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button.has-icon{padding-top:calc(12px - 3px);padding-right:calc(24px - 3px);padding-bottom:calc(12px - 3px);padding-left:calc(24px - 3px);}@media (max-width:921px){.menu-toggle,button,.ast-button,.ast-custom-button,.button,input#submit,input[type="button"],input[type="submit"],input[type="reset"],#comments .submit,.search .search-submit,form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button,body .wp-block-file .wp-block-file__button,.search .search-submit,.woocommerce-js a.button,.woocommerce button.button,.woocommerce .woocommerce-message a.button,.woocommerce #respond input#submit.alt,.woocommerce input.button.alt,.woocommerce input.button,.woocommerce input.button:disabled,.woocommerce input.button:disabled[disabled],.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled]:hover,.woocommerce #respond input#submit,.woocommerce button.button.alt.disabled,.wc-block-grid__products .wc-block-grid__product .wp-block-button__link,.wc-block-grid__product-onsale,[CLASS*="wc-block"] button,.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons .button:not(.checkout):not(.ast-continue-shopping),.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons a.checkout,.woocommerce button.button.alt.disabled.wc-variation-selection-needed{padding-top:18px;padding-right:32px;padding-bottom:18px;padding-left:32px;}}@media (max-width:544px){.menu-toggle,button,.ast-button,.ast-custom-button,.button,input#submit,input[type="button"],input[type="submit"],input[type="reset"],#comments .submit,.search .search-submit,form[CLASS*="wp-block-search__"].wp-block-search .wp-block-search__inside-wrapper .wp-block-search__button,body .wp-block-file .wp-block-file__button,.search .search-submit,.woocommerce-js a.button,.woocommerce button.button,.woocommerce .woocommerce-message a.button,.woocommerce #respond input#submit.alt,.woocommerce input.button.alt,.woocommerce input.button,.woocommerce input.button:disabled,.woocommerce input.button:disabled[disabled],.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled]:hover,.woocommerce #respond input#submit,.woocommerce button.button.alt.disabled,.wc-block-grid__products .wc-block-grid__product .wp-block-button__link,.wc-block-grid__product-onsale,[CLASS*="wc-block"] button,.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons .button:not(.checkout):not(.ast-continue-shopping),.woocommerce-js .astra-cart-drawer .astra-cart-drawer-content .woocommerce-mini-cart__buttons a.checkout,.woocommerce button.button.alt.disabled.wc-variation-selection-needed{padding-top:15px;padding-right:28px;padding-bottom:15px;padding-left:28px;}}@media (max-width:921px){.ast-mobile-header-stack .main-header-bar .ast-search-menu-icon{display:inline-block;}.ast-header-break-point.ast-header-custom-item-outside .ast-mobile-header-stack .main-header-bar .ast-search-icon{margin:0;}.ast-comment-avatar-wrap img{max-width:2.5em;}.ast-separate-container .ast-comment-list li.depth-1{padding:1.5em 2.14em;}.ast-separate-container .comment-respond{padding:2em 2.14em;}.ast-comment-meta{padding:0 1.8888em 1.3333em;}}@media (min-width:544px){.ast-container{max-width:100%;}}@media (max-width:544px){.ast-separate-container .ast-article-post,.ast-separate-container .ast-article-single,.ast-separate-container .comments-title,.ast-separate-container .ast-archive-description{padding:1.5em 1em;}.ast-separate-container #content .ast-container{padding-left:0.54em;padding-right:0.54em;}.ast-separate-container .ast-comment-list li.depth-1{padding:1.5em 1em;margin-bottom:1.5em;}.ast-separate-container .ast-comment-list .bypostauthor{padding:.5em;}.ast-search-menu-icon.ast-dropdown-active .search-field{width:170px;}}@media (max-width:921px){.site-title{display:block;}
47.site-header .site-description{display:none;}.entry-title{font-size:30px;}h1,.entry-content h1{font-size:30px;}h2,.entry-content h2{font-size:25px;}h3,.entry-content h3{font-size:20px;}}@media (max-width:544px){.site-title{display:none;}.site-header .site-description{display:none;}.entry-title{font-size:30px;}h1,.entry-content h1{font-size:30px;}h2,.entry-content h2{font-size:25px;}h3,.entry-content h3{font-size:20px;}}@media (max-width:921px){html{font-size:102.6%;}}@media (max-width:544px){html{font-size:102.6%;}}@media (min-width:922px){.ast-container{max-width:1240px;}}@media (min-width:922px){.site-content .ast-container{display:flex;}}@media (max-width:921px){.site-content .ast-container{flex-direction:column;}}@media (min-width:922px){.main-header-menu .sub-menu .menu-item.ast-left-align-sub-menu:hover > .sub-menu,.main-header-menu .sub-menu .menu-item.ast-left-align-sub-menu.focus > .sub-menu{margin-left:-0px;}}.entry-content li > p{margin-bottom:0;}blockquote,cite {font-style: initial;}.wp-block-file {display: flex;align-items: center;flex-wrap: wrap;justify-content: space-between;}.wp-block-pullquote {border: none;}.wp-block-pullquote blockquote::before {content: "\201D";font-family: "Helvetica",sans-serif;display: flex;transform: rotate( 180deg );font-size: 6rem;font-style: normal;line-height: 1;font-weight: bold;align-items: center;justify-content: center;}.has-text-align-right > blockquote::before {justify-content: flex-start;}.has-text-align-left > blockquote::before {justify-content: flex-end;}figure.wp-block-pullquote.is-style-solid-color blockquote {max-width: 100%;text-align: inherit;}html body {--wp--custom--ast-default-block-top-padding: 100px;--wp--custom--ast-default-block-right-padding: 80px;--wp--custom--ast-default-block-bottom-padding: 100px;--wp--custom--ast-default-block-left-padding: 80px;--wp--custom--ast-container-width: 1200px;--wp--custom--ast-content-width-size: 1200px;--wp--custom--ast-wide-width-size: calc(1200px + var(--wp--custom--ast-default-block-left-padding) + var(--wp--custom--ast-default-block-right-padding));}.ast-narrow-container {--wp--custom--ast-content-width-size: 750px;--wp--custom--ast-wide-width-size: 750px;}@media(max-width: 921px) {html body {--wp--custom--ast-default-block-top-padding: 50px;--wp--custom--ast-default-block-right-padding: 50px;--wp--custom--ast-default-block-bottom-padding: 50px;--wp--custom--ast-default-block-left-padding: 50px;}}@media(max-width: 544px) {html body {--wp--custom--ast-default-block-top-padding: 50px;--wp--custom--ast-default-block-right-padding: 30px;--wp--custom--ast-default-block-bottom-padding: 50px;--wp--custom--ast-default-block-left-padding: 30px;}}.entry-content > .wp-block-group,.entry-content > .wp-block-cover,.entry-content > .wp-block-columns {padding-top: var(--wp--custom--ast-default-block-top-padding);padding-right: var(--wp--custom--ast-default-block-right-padding);padding-bottom: var(--wp--custom--ast-default-block-bottom-padding);padding-left: var(--wp--custom--ast-default-block-left-padding);}.ast-plain-container.ast-no-sidebar .entry-content > .alignfull,.ast-page-builder-template .ast-no-sidebar .entry-content > .alignfull {margin-left: calc( -50vw + 50%);margin-right: calc( -50vw + 50%);max-width: 100vw;width: 100vw;}.ast-plain-container.ast-no-sidebar .entry-content .alignfull .alignfull,.ast-page-builder-template.ast-no-sidebar .entry-content .alignfull .alignfull,.ast-plain-container.ast-no-sidebar .entry-content .alignfull .alignwide,.ast-page-builder-template.ast-no-sidebar .entry-content .alignfull .alignwide,.ast-plain-container.ast-no-sidebar .entry-content .alignwide .alignfull,.ast-page-builder-template.ast-no-sidebar .entry-content .alignwide .alignfull,.ast-plain-container.ast-no-sidebar .entry-content .alignwide .alignwide,.ast-page-builder-template.ast-no-sidebar .entry-content .alignwide .alignwide,.ast-plain-container.ast-no-sidebar .entry-content .wp-block-column .alignfull,.ast-page-builder-template.ast-no-sidebar .entry-content .wp-block-column .alignfull,.ast-plain-container.ast-no-sidebar .entry-content .wp-block-column .alignwide,.ast-page-builder
47-template.ast-no-sidebar .entry-content .wp-block-column .alignwide {margin-left: auto;margin-right: auto;width: 100%;}[ast-blocks-layout] .wp-block-separator:not(.is-style-dots) {height: 0;}[ast-blocks-layout] .wp-block-separator {margin: 20px auto;}[ast-blocks-layout] .wp-block-separator:not(.is-style-wide):not(.is-style-dots) {max-width: 100px;}[ast-blocks-layout] .wp-block-separator.has-background {padding: 0;}.entry-content[ast-blocks-layout] > * {max-width: var(--wp--custom--ast-content-width-size);margin-left: auto;margin-right: auto;}.entry-content[ast-blocks-layout] > .alignwide {max-width: var(--wp--custom--ast-wide-width-size);}.entry-content[ast-blocks-layout] .alignfull {max-width: none;}.entry-content .wp-block-columns {margin-bottom: 0;}blockquote {margin: 1.5em;border: none;}.wp-block-quote:not(.has-text-align-right):not(.has-text-align-center) {border-left: 5px solid rgba(0,0,0,0.05);}.has-text-align-right > blockquote,blockquote.has-text-align-right {border-right: 5px solid rgba(0,0,0,0.05);}.has-text-align-left > blockquote,blockquote.has-text-align-left {border-left: 5px solid rgba(0,0,0,0.05);}.wp-block-site-tagline,.wp-block-latest-posts .read-more {margin-top: 15px;}.wp-block-loginout p label {display: block;}.wp-block-loginout p:not(.login-remember):not(.login-submit) input {width: 100%;}.wp-block-loginout input:focus {border-color: transparent;}.wp-block-loginout input:focus {outline: thin dotted;}.entry-content .wp-block-media-text .wp-block-media-text__content {padding: 0 0 0 8%;}.entry-content .wp-block-media-text.has-media-on-the-right .wp-block-media-text__content {padding: 0 8% 0 0;}.entry-content .wp-block-media-text.has-background .wp-block-media-text__content {padding: 8%;}.entry-content .wp-block-cover:not([class*="background-color"]) .wp-block-cover__inner-container,.entry-content .wp-block-cover:not([class*="background-color"]) .wp-block-cover-image-text,.entry-content .wp-block-cover:not([class*="background-color"]) .wp-block-cover-text,.entry-content .wp-block-cover-image:not([class*="background-color"]) .wp-block-cover__inner-container,.entry-content .wp-block-cover-image:not([class*="background-color"]) .wp-block-cover-image-text,.entry-content .wp-block-cover-image:not([class*="background-color"]) .wp-block-cover-text {color: var(--ast-global-color-5);}.wp-block-loginout .login-remember input {width: 1.1rem;height: 1.1rem;margin: 0 5px 4px 0;vertical-align: middle;}.wp-block-latest-posts > li > *:first-child,.wp-block-latest-posts:not(.is-grid) > li:first-child {margin-top: 0;}.wp-block-search__inside-wrapper .wp-block-search__input {padding: 0 10px;color: var(--ast-global-color-3);background: var(--ast-global-color-5);border-color: var(--ast-border-color);}.wp-block-latest-posts .read-more {margin-bottom: 1.5em;}.wp-block-search__no-button .wp-block-search__inside-wrapper .wp-block-search__input {padding-top: 5px;padding-bottom: 5px;}.wp-block-latest-posts .wp-block-latest-posts__post-date,.wp-block-latest-posts .wp-block-latest-posts__post-author {font-size: 1rem;}.wp-block-latest-posts > li > *,.wp-block-latest-posts:not(.is-grid) > li {margin-top: 12px;margin-bottom: 12px;}.ast-page-builder-template .entry-content[ast-blocks-layout] > *,.ast-page-builder-template .entry-content[ast-blocks-layout] > .alignfull > * {max-width: none;}.ast-page-builder-template .entry-content[ast-blocks-layout] > .alignwide > * {max-width: var(--wp--custom--ast-wide-width-size);}.ast-page-builder-template .entry-content[ast-blocks-layout] > .inherit-container-width > *,.ast-page-builder-template .entry-content[ast-blocks-layout] > * > *,.entry-content[ast-blocks-layout] > .wp-block-cover .wp-block-cover__inner-container {max-width: var(--wp--custom--ast-content-width-size);margin-left: auto;margin-right: auto;}.entry-content[ast-blocks-layout] .wp-block-cover:not(.alignleft):not(.alignright) {width: auto;}@media(max-width: 1200px) {.ast-separate-container .entry-content > .alignfull,.ast-separate-container .entry-content[ast-blocks-layout] > .alignwide,.ast-plain-container .entry-content[ast-blocks-layout] > .alignwide,.ast-plain-container .entry-content .alignfull {margin-left: calc(-1 * min(var(--ast-container-default-xlg-padding),20px)) ;margin-right: calc(-1 * min(var(--ast-container-default-xlg-padding),20px));}}@media(min-width: 1201px) {.ast-separate-container .entry-content > .alignfull {margin-left: calc(-1 * var(--ast-container-default-xlg-padding) );margin-right: calc(-1 * var(--ast-container-default-xlg-padding) );}.ast-separate-container .entry-content[ast-blocks-layout] > .alignwide,.ast-plain-container .entry-content[ast-blocks-layout] > .alignwide {margin-left: calc(-1 * var(--wp--custom--ast-default-block-left-padding) );margin-right: calc(-1 * var(--wp--custom--ast-default-block-right-padding) );}}@media(min-width: 921px) {.ast-separate-container .entry-content .wp-block-group.alignwide:not(.inherit-container-width) >
47 :where(:not(.alignleft):not(.alignright)),.ast-plain-container .entry-content .wp-block-group.alignwide:not(.inherit-container-width) > :where(:not(.alignleft):not(.alignright)) {max-width: calc( var(--wp--custom--ast-content-width-size) + 80px );}.ast-plain-container.ast-right-sidebar .entry-content[ast-blocks-layout] .alignfull,.ast-plain-container.ast-left-sidebar .entry-content[ast-blocks-layout] .alignfull {margin-left: -60px;margin-right: -60px;}}@media(min-width: 544px) {.entry-content > .alignleft {margin-right: 20px;}.entry-content > .alignright {margin-left: 20px;}}@media (max-width:544px){.wp-block-columns .wp-block-column:not(:last-child){margin-bottom:20px;}.wp-block-latest-posts{margin:0;}}@media( max-width: 600px ) {.entry-content .wp-block-media-text .wp-block-media-text__content,.entry-content .wp-block-media-text.has-media-on-the-right .wp-block-media-text__content {padding: 8% 0 0;}.entry-content .wp-block-media-text.has-background .wp-block-media-text__content {padding: 8%;}}.ast-narrow-container .site-content .wp-block-uagb-image--align-full .wp-block-uagb-image__figure {max-width: 100%;margin-left: auto;margin-right: auto;}.entry-content ul,.entry-content ol {padding: revert;margin: revert;}:root .has-ast-global-color-0-color{color:var(--ast-global-color-0);}:root .has-ast-global-color-0-background-color{background-color:var(--ast-global-color-0);}:root .wp-block-button .has-ast-global-color-0-color{color:var(--ast-global-color-0);}:root .wp-block-button .has-ast-global-color-0-background-color{background-color:var(--ast-global-color-0);}:root .has-ast-global-color-1-color{color:var(--ast-global-color-1);}:root .has-ast-global-color-1-background-color{background-color:var(--ast-global-color-1);}:root .wp-block-button .has-ast-global-color-1-color{color:var(--ast-global-color-1);}:root .wp-block-button .has-ast-global-color-1-background-color{background-color:var(--ast-global-color-1);}:root .has-ast-global-color-2-color{color:var(--ast-global-color-2);}:root .has-ast-global-color-2-background-color{background-color:var(--ast-global-color-2);}:root .wp-block-button .has-ast-global-color-2-color{color:var(--ast-global-color-2);}:root .wp-block-button .has-ast-global-color-2-background-color{background-color:var(--ast-global-color-2);}:root .has-ast-global-color-3-color{color:var(--ast-global-color-3);}:root .has-ast-global-color-3-background-color{background-color:var(--ast-global-color-3);}:root .wp-block-button .has-ast-global-color-3-color{color:var(--ast-global-color-3);}:root .wp-block-button .has-ast-global-color-3-background-color{background-color:var(--ast-global-color-3);}:root .has-ast-global-color-4-color{color:var(--ast-global-color-4);}:root .has-ast-global-color-4-background-color{background-color:var(--ast-global-color-4);}:root .wp-block-button .has-ast-global-color-4-color{color:var(--ast-global-color-4);}:root .wp-block-button .has-ast-global-color-4-background-color{background-color:var(--ast-global-color-4);}:root .has-ast-global-color-5-color{color:var(--ast-global-color-5);}:root .has-ast-global-color-5-background-color{background-color:var(--ast-global-color-5);}:root .wp-block-button .has-ast-global-color-5-color{color:var(--ast-global-color-5);}:root .wp-block-button .has-ast-global-color-5-background-color{background-color:var(--ast-global-color-5);}:root .has-ast-global-color-6-color{color:var(--ast-global-color-6);}:root .has-ast-global-color-6-background-color{background-color:var(--ast-global-color-6);}:root .wp-block-button .has-ast-global-color-6-color{color:var(--ast-global-color-6);}:root .wp-block-button .has-ast-global-color-6-background-color{background-color:var(--ast-global-color-6);}:root .has-ast-global-color-7-color{color:var(--ast-global-color-7);}:root .has-ast-global-color-7-background-color{background-color:var(--ast-global-color-7);}:root .wp-block-button .has-ast-global-color-7-color{color:var(--ast-global-color-7);}:root .wp-block-button .has-ast-global-color-7-background-color{background-color:var(--ast-global-color-7);}:root .has-ast-global-color-8-color{color:var(--ast-global-color-8);}:root .has-ast-global-color-8-background-color{background-color:var(--ast-global-color-8);}:root .wp-block-button .has-ast-global-color-8-color{color:var(--ast-global-color-8);}:root .wp-block-button .has-ast-global-color-8-background-color{background-color:var(--ast-global-color-8);}:root{--ast-global-color-0:#060097;--ast-global-color-1:#c10fff;--ast-global-color-2:#1e293b;--ast-global-color-3:#67768e;--ast-global-color-4:#f9f6fe;--ast-global-color-5:#FFFFFF;--ast-global-color-6:#F2F5F7;--ast-global-color-7:#ffcd57;--ast-global-color-8:#000000;}:root {--ast-border-color : var(--ast-global-color-6);}.ast-single-entry-banner {-js-display: flex;display: flex;flex-direction: column;justify-content: center;text-align: center;position: relative;background: #eeeeee;}.ast-single-entry-banner[data-banner-layout="layout-1"] {max-width: 1200px;background: inherit;padding: 20px 0;}.ast-single-entry-banner[data-banner-width-type="custom"] {margin: 0 auto;width: 100%;}.ast-single-entry-banner + .site-content .entry-header {margin-bottom: 0;}header.entry-header .entry-title{font-weight:600;font-size:32px;font-size:1.7777777777778rem;}header.entry-header > *:not(:last-child){margin-bottom:10px;}.ast-archive-entry-banner {-js-display: flex;display: flex;flex-direction: column;justify-content: center;text-align: center;position: relative;background: #eeeeee;}.ast-archive-entry-banner[data-banner-width-type="custom"] {margin: 0 auto;width: 100%;}.ast-archive-entry-banner[data-banner-layout="layout-1"] {background: inherit;padding: 20px 0;text-align: left;}body.archive .ast-archive-description{max-width:1200px;width:100%;text-align:left;padding-top:3em;padding-right:3em;padding-bottom:3em;padding-left:3em;}body.archive .ast-archive-description .ast-archive-title,body.archive .ast-archive-description .ast-archive-title *{font-weight:600;font-size:32px;font-size:1.7777777777778rem;}body.archive .ast-archive-description > *:not(:last-child){margin-bottom:10px;}@media (max-width:921px){body.archive .ast-archive-description{text-align:left;}}@media (max-width:544px){body.archive .ast-archive-description{text-align:left;}}.ast-breadcrumbs .trail-browse,.ast-breadcrumbs .trail-items,.ast-breadcrumbs .trail-items li{display:inline-block;margin:0;padding:0;border:none;background:inherit;text-indent:0;text-decoration:none;}.ast-breadcrumbs .trail-browse{font-size:inherit;font-style:inherit;font-weight:inherit;color:inherit;}.ast-breadcrumbs .trail-items{list-style:none;}.trail-items li::after{padding:0 0.3em;content:"\00bb";}.trail-items li:last-of-type::after{display:none;}
47h1,.entry-content h1,h2,.entry-content h2,h3,.entry-content h3,h4,.entry-content h4,h5,.entry-content h5,h6,.entry-content h6{color:var(--ast-global-color-2);}.entry-title a{color:var(--ast-global-color-2);}@media (max-width:921px){.ast-builder-grid-row-container.ast-builder-grid-row-tablet-3-firstrow .ast-builder-grid-row > *:first-child,.ast-builder-grid-row-container.ast-builder-grid-row-tablet-3-lastrow .ast-builder-grid-row > *:last-child{grid-column:1 / -1;}}@media (max-width:544px){.ast-builder-grid-row-container.ast-builder-grid-row-mobile-3-firstrow .ast-builder-grid-row > *:first-child,.ast-builder-grid-row-container.ast-builder-grid-row-mobile-3-lastrow .ast-builder-grid-row > *:last-child{grid-column:1 / -1;}}.footer-widget-area.widget-area.site-footer-focus-item{width:auto;}.ast-header-break-point .main-header-bar{border-bottom-width:1px;}@media (min-width:922px){.main-header-bar{border-bottom-width:1px;}}.main-header-menu .menu-item, #astra-footer-menu .menu-item, .main-header-bar .ast-masthead-custom-menu-items{-js-display:flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-moz-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-moz-box-orient:vertical;-moz-box-direction:normal;-ms-flex-direction:column;flex-direction:column;}.main-header-menu > .menu-item > .menu-link, #astra-footer-menu > .menu-item > .menu-link{height:100%;-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-js-display:flex;display:flex;}.ast-header-break-point .main-navigation ul .menu-item .menu-link .icon-arrow:first-of-type svg{top:.2em;margin-top:0px;margin-left:0px;width:.65em;transform:translate(0, -2px) rotateZ(270deg);}.ast-mobile-popup-content .ast-submenu-expanded > .ast-menu-toggle{transform:rotateX(180deg);overflow-y:auto;}.ast-separate-container .blog-layout-1, .ast-separate-container .blog-layout-2, .ast-separate-container .blog-layout-3{background-color:transparent;background-image:none;}.ast-separate-container .ast-article-post{background-color:var(--ast-global-color-5);;background-image:none;;}@media (max-width:921px){.ast-separate-container .ast-article-post{background-color:var(--ast-global-color-5);;background-image:none;;}}@media (max-width:544px){.ast-separate-container .ast-article-post{background-color:var(--ast-global-color-5);;background-image:none;;}}.ast-separate-container .ast-article-single:not(.ast-related-post), .ast-separate-container .comments-area .comment-respond,.ast-separate-container .comments-area .ast-comment-list li, .woocommerce.ast-separate-container .ast-woocommerce-container, .ast-separate-container .error-404, .ast-separate-container .no-results, .single.ast-separate-container .site-main .ast-author-meta, .ast-separate-container .related-posts-title-wrapper,.ast-separate-container .comments-count-wrapper, .ast-box-layout.ast-plain-container .site-content,.ast-padded-layout.ast-plain-container .site-content, .ast-separate-container .comments-area .comments-title, .ast-separate-container .ast-archive-description{background-color:var(--ast-global-color-5);;background-image:none;;}@media (max-width:921px){.ast-separate-container .ast-article-single:not(.ast-related-post), .ast-separate-container .comments-area .comment-respond,.ast-separate-container .comments-area .ast-comment-list li, .woocommerce.ast-separate-container .ast-woocommerce-container, .ast-separate-container .error-404, .ast-separate-container .no-results, .single.ast-separate-container .site-main .ast-author-meta, .ast-separate-container .related-posts-title-wrapper,.ast-separate-container .comments-count-wrapper, .ast-box-layout.ast-plain-container .site-content,.ast-padded-layout.ast-plain-container .site-content, .ast-separate-container .comments-area .comments-title, .ast-separate-container .ast-archive-description{background-color:var(--ast-global-color-5);;background-image:none;;}}@media (max-width:544px){.ast-separate-container .ast-article-single:not(.ast-related-post), .ast-separate-container .comments-area .comment-respond,.ast-separate-container .comments-area .ast-comment-list li, .
47woocommerce.ast-separate-container .ast-woocommerce-container, .ast-separate-container .error-404, .ast-separate-container .no-results, .single.ast-separate-container .site-main .ast-author-meta, .ast-separate-container .related-posts-title-wrapper,.ast-separate-container .comments-count-wrapper, .ast-box-layout.ast-plain-container .site-content,.ast-padded-layout.ast-plain-container .site-content, .ast-separate-container .comments-area .comments-title, .ast-separate-container .ast-archive-description{background-color:var(--ast-global-color-5);;background-image:none;;}}.ast-separate-container.ast-two-container #secondary .widget{background-color:var(--ast-global-color-5);;background-image:none;;}@media (max-width:921px){.ast-separate-container.ast-two-container #secondary .widget{background-color:var(--ast-global-color-5);;background-image:none;;}}@media (max-width:544px){.ast-separate-container.ast-two-container #secondary .widget{background-color:var(--ast-global-color-5);;background-image:none;;}}.ast-plain-container, .ast-page-builder-template{background-color:var(--ast-global-color-5);;background-image:none;;}@media (max-width:921px){.ast-plain-container, .ast-page-builder-template{background-color:var(--ast-global-color-5);;background-image:none;;}}@media (max-width:544px){.ast-plain-container, .ast-page-builder-template{background-color:var(--ast-global-color-5);;background-image:none;;}}.ast-builder-menu-mobile .main-navigation .menu-item.menu-item-has-children > .ast-menu-toggle{top:0;}.ast-builder-menu-mobile .main-navigation .menu-item-has-children > .menu-link:after{content:unset;}.ast-hfb-header .ast-builder-menu-mobile .main-navigation .main-header-menu, .ast-hfb-header .ast-builder-menu-mobile .main-navigation .main-header-menu, .ast-hfb-header .ast-mobile-header-content .ast-builder-menu-mobile .main-navigation .main-header-menu, .ast-hfb-header .ast-mobile-popup-content .ast-builder-menu-mobile .main-navigation .main-header-menu{border-top-width:1px;border-color:#eaeaea;}.ast-hfb-header .ast-builder-menu-mobile .main-navigation .menu-item .sub-menu .menu-link, .ast-hfb-header .ast-builder-menu-mobile .main-navigation .menu-item .menu-link, .ast-hfb-header .ast-builder-menu-mobile .main-navigation .menu-item .sub-menu .menu-link, .ast-hfb-header .ast-builder-menu-mobile .main-navigation .menu-item .menu-link, .ast-hfb-header .ast-mobile-header-content .ast-builder-menu-mobile .main-navigation .menu-item .sub-menu .menu-link, .ast-hfb-header .ast-mobile-header-content .ast-builder-menu-mobile .main-navigation .menu-item .menu-link, .ast-hfb-header .ast-mobile-popup-content .ast-builder-menu-mobile .main-navigation .menu-item .sub-menu .menu-link, .ast-hfb-header .ast-mobile-popup-content .ast-builder-menu-mobile .main-navigation .menu-item .menu-link{border-bottom-width:1px;border-color:#eaeaea;border-style:solid;}.ast-builder-menu-mobile .main-navigation .menu-item.menu-item-has-children > .ast-menu-toggle{top:0;}@media (max-width:921px){.ast-builder-menu-mobile .main-navigation .main-header-menu .menu-item > .menu-link{color:var(--ast-global-color-2);padding-top:10px;padding-bottom:10px;padding-left:15px;padding-right:15px;}.ast-builder-menu-mobile .main-navigation .menu-item > .ast-menu-toggle{color:var(--ast-global-color-2);}.ast-builder-menu-mobile .main-navigation .menu-item:hover > .menu-link, .ast-builder-menu-mobile .main-navigation .inline-on-mobile .menu-item:hover > .ast-menu-toggle{color:var(--ast-global-color-2);}.ast-builder-menu-mobile .main-navigation .menu-item:hover > .ast-menu-toggle{color:var(--ast-global-color-2);}.ast-builder-menu-mobile .main-navigation .menu-item.current-menu-item > .menu-link, .ast-builder-menu-mobile .main-navigation .inline-on-mobile .menu-item.current-menu-item > .ast-menu-toggle, .ast-builder-menu-mobile .main-navigation .menu-item.current-menu-ancestor > .menu-link, .ast-builder-menu-mobile .main-navigation .menu-item.current-menu-ancestor > .ast-menu-toggle{color:var(--ast-global-color-0);}.ast-builder-menu-mobile .main-navigation .menu-item.current-menu-item > .ast-menu-toggle{color:var(--ast-global-color-0);}
47.ast-builder-menu-mobile .main-navigation .menu-item.menu-item-has-children > .ast-menu-toggle{top:10px;right:calc( 15px - 0.907em );}.ast-builder-menu-mobile .main-navigation .menu-item-has-children > .menu-link:after{content:unset;}}@media (max-width:544px){.ast-builder-menu-mobile .main-navigation .menu-item.menu-item-has-children > .ast-menu-toggle{top:10px;}}.ast-builder-menu-mobile .main-navigation{display:block;}@media (max-width:921px){.ast-header-break-point .ast-builder-menu-mobile .main-navigation{display:block;}}@media (max-width:544px){.ast-header-break-point .ast-builder-menu-mobile .main-navigation{display:block;}}
48/*# sourceURL=astra-theme-css-inline-css */
49</style>
50<style id="wp-block-library-inline-css">
51:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
51--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
52
53/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */
54</style>
55<style id="wp-block-group-inline-css">
56.wp-block-group{box-sizing:border-box}:where(.wp-block-group.wp-block-group-is-layout-constrained){position:relative}
57/*# sourceURL=https://churnsolution.com/wp-includes/blocks/group/style.min.css */
58</style>
59
60
61<style id="global-styles-inline-css">
62:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--ast-global-color-0: var(--ast-global-color-0);--wp--preset--color--ast-global-color-1: var(--ast-global-color-1);--wp--preset--color--ast-global-color-2: var(--ast-global-color-2);--wp--preset--color--ast-global-color-3: var(--ast-global-color-3);--wp--preset--color--ast-global-color-4: var(--ast-global-color-4);--wp--preset--color--ast-global-color-5: var(--ast-global-color-5);--wp--preset--color--ast-global-color-6: var(--ast-global-color-6);--wp--preset--color--ast-global-color-7: var(--ast-global-color-7);--wp--preset--color--ast-global-color-8: var(--ast-global-color-8);--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,
620) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:root { --wp--style--global--content-size: var(--wp--custom--ast-content-width-size);--wp--style--global--wide-size: var(--wp--custom--ast-wide-width-size); }:where(body) { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.wp-site-blocks) > * { margin-block-start: 24px; margin-block-end: 0; }:where(.wp-site-blocks) > :first-child { margin-block-start: 0; }:where(.wp-site-blocks) > :last-child { margin-block-end: 0; }:root { --wp--style--block-gap: 24px; }:root :where(.is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.is-layout-flow) > *{margin-block-start: 24px;margin-block-end: 0;}:root :where(.is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.is-layout-constrained) > *{margin-block-start: 24px;margin-block-end: 0;}:root :where(.is-layout-flex){gap: 24px;}:root :where(.is-layout-grid){gap: 24px;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}
62a:where(:not(.wp-element-button)){text-decoration: none;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-ast-global-color-0-color{color: var(--wp--preset--color--ast-global-color-0) !important;}.has-ast-global-color-1-color{color: var(--wp--preset--color--ast-global-color-1) !important;}.has-ast-global-color-2-color{color: var(--wp--preset--color--ast-global-color-2) !important;}.has-ast-global-color-3-color{color: var(--wp--preset--color--ast-global-color-3) !important;}.has-ast-global-color-4-color{color: var(--wp--preset--color--ast-global-color-4) !important;}.has-ast-global-color-5-color{color: var(--wp--preset--color--ast-global-color-5) !important;}.has-ast-global-color-6-color{color: var(--wp--preset--color--ast-global-color-6) !important;}.has-ast-global-color-7-color{color: var(--wp--preset--color--ast-global-color-7) !important;}.has-ast-global-color-8-color{color: var(--wp--preset--color--ast-global-color-8) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-ast-global-color-0-background-color{background-color: var(--wp--preset--color--ast-global-color-0) !important;}.has-ast-global-color-1-background-color{background-color: var(--wp--preset--color--ast-global-color-1) !important;}.has-ast-global-color-2-background-color{background-color: var(--wp--preset--color--ast-global-color-2) !important;}.has-ast-global-color-3-background-color{background-color: var(--wp--preset--color--ast-global-color-3) !important;}.has-ast-global-color-4-background-color{background-color: var(--wp--preset--color--ast-global-color-4) !important;}.has-ast-global-color-5-background-color{background-color: var(--wp--preset--color--ast-global-color-5) !important;}.has-ast-global-color-6-background-color{background-color: var(--wp--preset--color--ast-global-color-6) !important;}.has-ast-global-color-7-background-color{background-color: var(--wp--preset--color--ast-global-color-7) !important;}.has-ast-global-color-8-background-color{background-color: var(--wp--preset--color--ast-global-color-8) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-ast-global-color-0-border-color{border-color: var(--wp--preset--color--ast-global-color-0) !important;}.has-ast-global-color-1-border-color{border-color: var(--wp--preset--color--ast-global-color-1) !important;}.has-ast-global-color-2-border-color{border-color: var(--wp--preset--color--ast-global-color-2) !important;}.has-ast-global-color-3-border-color{border-color: var(--wp--preset--color--ast-global-color-3) !important;}.has-ast-global-color-4-border-color{border-color: var(--wp--preset--color--ast-global-color-4) !important;}.has-ast-global-color-5-border-color{border-color: var(--wp--preset--color--ast-global-color-5) !important;}.has-ast-global-color-6-border-color{border-color: var(--wp--preset--color--ast-global-color-6) !important;}.has-ast-global-color-7-border-color{border-color: var(--wp--preset--color--ast-global-color-7) !important;}.has-ast-global-color-8-border-color{border-color: var(--wp--preset--color--ast-global-color-8) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
62.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
63/*# sourceURL=global-styles-inline-css */
64</style>
65
66<link rel='stylesheet' id='eb-reusable-block-style-1384-css' href='https://churnsolution.com/wp-content/uploads/eb-style/reusable-blocks/eb-reusable-1384.min.css?ver=17985c6653' media='all' />
67<link rel='stylesheet' id='astra-child-css' href='https://churnsolution.com/wp-content/themes/astra-child/style.css?ver=1.0.0' media='all' />
68<link rel="https://api.w.org/" href="https://churnsolution.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://churnsolution.com/wp-json/wp/v2/pages/1821" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://churnsolution.com/xmlrpc.php?rsd" />
69<meta name="generator" content="WordPress 7.1.2" />
70<link rel='shortlink' href='https://churnsolution.com/?p=1821' />
71<meta name="cdp-version" content="1.5.0" /><style id="essential-blocks-global-styles">
72            :root {
73                --eb-global-primary-color: #101828;
74--eb-global-secondary-color: #475467;
75--eb-global-tertiary-color: #98A2B3;
76--eb-global-text-color: #475467;
77--eb-global-heading-color: #1D2939;
78--eb-global-link-color: #444CE7;
79--eb-global-background-color: #F9FAFB;
80--eb-global-button-text-color: #FFFFFF;
81--eb-global-button-background-color: #101828;
82--eb-gradient-primary-color: linear-gradient(90deg, hsla(259, 84%, 78%, 1) 0%, hsla(206, 67%, 75%, 1) 100%);
83--eb-gradient-secondary-color: linear-gradient(90deg, hsla(18, 76%, 85%, 1) 0%, hsla(203, 69%, 84%, 1) 100%);
84--eb-gradient-tertiary-color: linear-gradient(90deg, hsla(248, 21%, 15%, 1) 0%, hsla(250, 14%, 61%, 1) 100%);
85--eb-gradient-background-color: linear-gradient(90deg, rgb(250, 250, 250) 0%, rgb(233, 233, 233) 49%, rgb(244, 243, 243) 100%);
86
87                --eb-tablet-breakpoint: 1024px;
88--eb-mobile-breakpoint: 767px;
89
90            }
91            
92            
93        </style>
93<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
93
94<!-- 
94<script>window.SavvyCal=window.SavvyCal||function(){(SavvyCal.q=SavvyCal.q||[]).push(arguments)};</script>
vendor: 2 bytes, line 94
94
95<script defer src="https://embed.savvycal.com/v1/embed.js"></script>
95 -->
96<!-- OpenReplay Tracking Code for ChurnSolution WordPress -->
97<script>
98  var initOpts = {
99    projectKey: "EnGYQGyTf1AcR9a0oUgT",
100    ingestPoint: "https://openreplay.quizplusdev.com/ingest",
101    defaultInputMode: 2,
102    obscureTextNumbers: false,
103    obscureTextEmails: false,
104  };
105  var startOpts = { userID: "" };
106  function getUTMParams() {
107    const params = new URLSearchParams(window.location.search);
108    const utmParams = {};
109    ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'].forEach(key => {
110      const value = params.get(key);
111      if (value) utmParams[key] = value;
112    });
113    return utmParams;
114  }
115  function onOpenReplayLoaded() {
116    console.log("OpenReplay script loaded.");
117    const utmData = getUTMParams();
118    if (window.OpenReplay) {
119      Object.entries(utmData).forEach(([key, value]) => {
120        window.OpenReplay.setMetadata(key, value);
121      });
122      window.OpenReplay.start();
123    }
124  }
125  (function(A,s,a,y,e,r){
126    r=window.OpenReplay=[e,r,y,[s-1, e]];
127    s=document.createElement('script');s.src=A;s.async=!a;
128    s.onload = onOpenReplayLoaded;
129    document.getElementsByTagName('head')[0].appendChild(s);
130    r.start=function(v){r.push([0])};
131    r.stop=function(v){r.push([1])};
132    r.setUserID=function(id){r.push([2,id])};
133    r.setUserAnonymousID=function(id){r.push([3,id])};
134    r.setMetadata=function(k,v){r.push([4,k,v])};
135    r.event=function(k,p,i){r.push([5,k,p,i])};
136    r.issue=function(k,p){r.push([6,k,p])};
137    r.isActive=function(){return false};
138    r.getSessionToken=function(){};
139  })("//static.openreplay.com/11.0.1/openreplay.js",1,0,initOpts,startOpts);
140</script>
140
141<!-- Begin Inspectlet Asynchronous Code // Commented -->
142<!-- 
142<script type="text/javascript">
143(function() {
144window.__insp = window.__insp || [];
145__insp.push(['wid', 2049275049]);
146var ldinsp = function(){
147if(typeof window.__inspld != "undefined") return; window.__inspld = 1; var insp = document.createElement('script'); insp.type = 'text/javascript'; insp.async = true; insp.id = "inspsync"; insp.src = ('https:' == document.location.protocol ? 'https' : 'http') + '://cdn.inspectlet.com/inspectlet.js?wid=2049275049&r=' + Math.floor(new Date().getTime()/3600000); var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(insp, x); };
148setTimeout(ldinsp, 0);
149})();
150</script>
150 -->
151<!-- End Inspectlet Asynchronous Code -->
152<!-- Google Tag Manager -->
153<script>
vendor: 331 bytes, lines 153-157
153(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
154new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
155j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
156'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
157})(window,document,'script','dataLayer','
157GTM-KFH8XXKN
vendor: 3 bytes, line 157
157');
157</script>
157
158<!-- End Google Tag Manager -->
159<!-- Start Send Events via OR & GTM -->
160<script>
161  window.sendEvent = function({ action, category, label, value, ...args }) {
162	const payload = {
163    event: action,
164    event_category: category,
165    event_label: label,
166    value,
167    ...args
168  };
169
170  if (window.dataLayer) {
171    window.dataLayer.push(payload);
172  } else {
173    console.warn("GTM not loaded yet");
174  }
175    
176    if (window.OpenReplay && window.OpenReplay.event) {
177      const eventParams = {
178        event_category: category,
179        event_label: label,
180        value: value,
181        ...args
182      };
183      window.OpenReplay.event(action, eventParams);
184    } else {
185      console.warn('OpenReplay is not available. Event not tracked in OpenReplay.');
186    }
187  };
188  
189  window.addInfoToDataLayer = function(dict) {
190    if (!window.dataLayer) {
191      console.warn('window.dataLayer is not defined. GTM may not be loaded yet.');
192      return;
193    }
194    window.dataLayer.push(dict);
195  };
196  
197  window.setOpenReplayMetadata = function(key, value) {
198    if (window.OpenReplay && window.OpenReplay.setMetadata) {
199      window.OpenReplay.setMetadata(key, value);
200    }
201  };
202</script>
202
203<!-- End Send Events via OR & GTM -->
204<script type="application/ld+json">
205{
206  "@context": "https://schema.org",
207  "@type": "SoftwareApplication",
208  "name": "ChurnSolution",
209  "applicationCategory": "BusinessApplication",
210  "operatingSystem": "Web",
211  "description": "ChurnSolution is a B2B SaaS platform that helps subscription-based businesses reduce customer churn and increase retention by analyzing customer behavior, usage, and payment data.",
212  "url": "https://churnsolution.com"
213}
214</script>
vendor: 2 bytes, line 214
214
215<script type="application/ld+json">
216{
217  "@context": "https://schema.org",
218  "@type": "FAQPage",
219  "mainEntity": [
220    {
221      "@type": "Question",
222      "name": "What is ChurnSolution?",
223      "acceptedAnswer": {
224        "@type": "Answer",
225        "text": "ChurnSolution is a B2B SaaS platform that helps subscription-based businesses reduce customer churn and improve retention using customer behavior and payment data."
226      }
227    },
228    {
229      "@type": "Question",
230      "name": "Is ChurnSolution for SaaS companies?",
231      "acceptedAnswer": {
232        "@type": "Answer",
233        "text": "Yes. ChurnSolution is designed for SaaS and subscription businesses with monthly recurring revenue."
234      }
235    },
236{
237      "@type": "Question",
238      "name": "Is ChurnSolution for B2C companies?",
239      "acceptedAnswer": {
240        "@type": "Answer",
241        "text": "Yes. ChurnSolution is designed for B2C and subscription businesses with monthly or yearly recurring revenue."
242      }
243    },
244    {
245      "@type": "Question",
246      "name": "What problem does ChurnSolution solve?",
247      "acceptedAnswer": {
248        "@type": "Answer",
249        "text": "ChurnSolution helps businesses identify churn risk early and take action to retain customers and protect monthly recurring revenue."
250      }
251    }
252  ]
253}
254</script>
254
255<link rel="preconnect" href="https://fonts.googleapis.com">
256<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><style>
257@font-face {
258            font-family: 'Poppins';
259            src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/regular.woff2') format('woff2');
260            font-weight: 400;
261            font-style: normal;
262            font-display: swap;
263        }
264@font-face {
265            font-family: 'Poppins';
266            src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/italic.woff2') format('woff2');
267            font-weight: 400;
268            font-style: italic;
269            font-display: swap;
270        }
271@font-face {
272            font-family: 'Poppins';
273            src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/medium.woff2') format('woff2');
274            font-weight: 500;
275            font-style: normal;
276            font-display: swap;
277        }
278@font-face {
279            font-family: 'Poppins';
280            src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/medium-italic.woff2') format('woff2');
281            font-weight: 500;
282            font-style: italic;
283            font-display: swap;
284        }
285@font-face {
286            font-family: 'Poppins';
287            src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/semi-bold.woff2') format('woff2');
288            font-weight: 600;
289            font-style: normal;
290            font-display: swap;
291        }
292@font-face {
293            font-family: 'Poppins';
294            src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/semi-bold-italic.woff2') format('woff2');
295            font-weight: 600;
296            font-style: italic;
297            font-display: swap;
298        }
299@font-face {
300            font-family: 'Poppins';
301            src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/bold.woff2') format('woff2');
302            font-weight: 700;
303            font-style: normal;
304            font-display: swap;
305        }
306@font-face {
307            font-family: 'Poppins';
308            src: url('https://churnsolution.com/wp-content/themes/astra/assets/fonts/poppins/bold-italic.woff2') format('woff2');
309            font-weight: 700;
310            font-style: italic;
311            font-display: swap;
312        }
313</style>
314<meta name="redi-version" content="1.3.0" /><link rel="preconnect" href="https://koalendar.com" />
315<link rel="preconnect" href="https://api.koalendar.com" />
316<style>
317div[id^=koa-popover-widget-]{display:none}div[id^=koa-popover-widget-].chr-chr-active{display:unset}
318</style>
319<script>
320  window.Koalendar =
321    window.Koalendar ||
322    function () {
323      (Koalendar.props = Koalendar.props || []).push(arguments);
324    };
325</script>
vendor: 2 bytes, line 325
325
326<script async src="https://koalendar.com/assets/widget.js"></script>
vendor: 2 bytes, line 326
326
327<script>
328function attachBackdropListener(){let t=document.querySelector("div[id^=koa-popover-widget-]"),e=t.querySelector("div[aria-modal=true][role=dialog]");e?.parentElement?.classList.remove("koa:md:max-h-[700px]"),e?.parentElement?.attributeStyleMap.set("max-height","750px"),t?.querySelector(".koa\\:fixed.koa\\:inset-0.koa\\:transition-opacity.koa\\:duration-500")?.addEventListener("click",setButtonStyles)}function setButtonStyles(){document.querySelectorAll("div[id^=koa-popover-widget-] > div > button").forEach(t=>{t.removeEventListener("click",setButtonStyles),t.removeEventListener("click",attachBackdropListener),t.addEventListener("click",t.hasAttribute("id")?attachBackdropListener:setButtonStyles),t.style.setProperty("justify-content","center"),t.style.setProperty("width","3.55555555556rem","important"),t.style.setProperty("height","3.55555555556rem","important"),t.style.setProperty("padding","0px","important")})}function hasKoalendarLoaded(){let t=document.querySelector("div[id^=koa-popover-widget-]");return!!t}function updateKoalendarStyles(){let t=document.querySelectorAll('input[name="2UEU8"]');t.forEach(t=>{t.style.setProperty("margin-top","4px"),t.style.setProperty("align-self","start")});let e=document.querySelector("div[id^=koa-popover-widget-]");setButtonStyles(),e?.attributeStyleMap.set("--koa-spacing","0.22222222222rem"),e?.attributeStyleMap.set("--koa-container-4xl","49.5rem"),e?.classList.add("chr-chr-active")}function updateKoalendarStyles(){let t=document.querySelector("div[id^=koa-popover-widget-]"),e=t.querySelector("div[aria-modal=true][role=dialog]");setButtonStyles(),t?.attributeStyleMap.set("--koa-spacing","0.22222222222rem"),t?.attributeStyleMap.set("--koa-container-4xl","53.5rem"),t?.classList.add("chr-chr-active"),e?.attributeStyleMap.set("padding-top","2rem"),e?.attributeStyleMap.set("padding-left","2rem"),e?.attributeStyleMap.set("padding-right","2rem"),e?.parentElement?.classList.remove("koa:md:max-h-[700px]"),e?.parentElement?.attributeStyleMap.set("max-height","750px")}function onKoalendarLoad(t,e=1e4,a=300){let r=Date.now(),o=()=>{hasKoalendarLoaded()?t():Date.now()-r<e&&setTimeout(o,a)};o()}Koalendar("init"),Koalendar("widget",{url:"https://koalendar.com/e/meet-with-churnsolution",text:"",shape:"rounded-full",backgroundColor:"#0f124d",textColor:"#ffffff",position:"bottom-right",icon:"calendar"}),onKoalendarLoad(()=>updateKoalendarStyles());
329</script>
329<style>
330.chr-chr-btn-contact-us,.chr-chr-btn-demo,.chr-chr-btn-signup,.chr-chr-nav-link{font-family:inherit;font-size:.77777777777rem!important;cursor:pointer;text-decoration:none}.chr-chr-header{--chr-active-tab-color:#0f124d;color:#0f124d;background:#fefcf4;border-bottom:1px solid #8e98a8;padding:0 32px;position:fixed;width:100%;top:0;z-index:1000}.chr-chr-logo,.chr-chr-logo>a,.chr-chr-nav{color:inherit}.chr-chr-header[data-variant=light]{background:#fff;border-bottom-color:#dbdbe4}.chr-chr-header[data-variant=dark]{--chr-active-tab-color:#eebd23;color:#fff;background:#0f124d}.chr-chr-nav{display:flex;align-items:center;justify-content:space-between;max-width:1400px;margin:0 auto;height:72px;gap:24px}.chr-chr-header[data-variant=light] .chr-chr-nav{max-width:unset}.chr-chr-logo{display:flex;align-items:center;gap:8px;font-weight:700;text-decoration:none}.chr-chr-cropped-logo-icon,.chr-chr-logo-icon,.chr-chr-logo>a{height:35px}.chr-chr-cropped-logo-icon,.chr-chr-mobile-item[data-hidden]{display:none}.chr-chr-nav-links{display:flex;align-items:center;height:100%;gap:16px;margin-left:auto}.chr-chr-nav-item{height:100%;cursor:pointer}.chr-chr-btn-contact-us,.chr-chr-btn-signup,.chr-chr-nav-link{display:flex;align-items:center;height:100%;gap:6px;color:inherit!important;font-weight:500;padding:8px;background:0 0!important;border:none}.chr-chr-nav-link.chr-chr-active{padding-bottom:6px;border-bottom:2px solid var(--chr-active-tab-color)}:is(
331.chr-chr-nav-link,.chr-chr-product-item,.chr-chr-resource-item,.chr-chr-footer-nav-link
332):is(:focus,:focus-visible){outline:0}.chr-chr-dropdown-arrow{display:flex;align-items:center;justify-content:center;width:20px;height:20px;transition:transform .2s}.chr-chr-nav-item:hover .chr-chr-dropdown-arrow{transform:rotate(180deg)}.chr-chr-nav-actions{display:flex;align-items:center;gap:16px}.chr-chr-btn-demo{color:#0f124d!important;background:#fff;border:1px solid #e0e0e0;padding:8px 16px;border-radius:6px;font-weight:500;transition:.2s}.chr-chr-btn-demo:hover{background:#e0e0e0}.chr-chr-dropdown{width:100%;margin-top:1px;position:absolute;top:100%;left:50%;transform:translateX(-50%);background:#fff;border-bottom:1px solid #8e98a8;padding:32px;box-shadow:0 4px 4px 0 #00000040;opacity:0;visibility:hidden;transition:opacity .2s,visibility .2s;cursor:default}.chr-chr-nav-item:hover .chr-chr-dropdown{opacity:1;visibility:visible}.chr-chr-dropdown-content{display:grid;grid-template-columns:minmax(420px,1fr) repeat(2,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr)) auto;gap:16px;max-width:1400px;margin:0 auto}.chr-chr-primary-product{display:flex;flex-direction:column;align-items:flex-start;gap:8px;min-width:fit-content;height:100%;border:1px solid #e0e0e0;border-radius:12px;transition:background .2s}.chr-chr-primary-product:hover{background:#f9f9fb}.chr-chr-primary-product.chr-chr-active{background:#f9f9fb;box-shadow:0 0 8px 4px #0000000f}.chr-chr-product-item,.chr-chr-resource-item{display:flex;align-items:flex-start;gap:12px;padding:12px;border-radius:8px;transition:background .2s;text-decoration:none;cursor:default;border:1px solid #e0e0e0;filter:brightness(1)!important}.chr-chr-primary-product .chr-chr-product-item{border:none}.chr-chr-primary-product .chr-chr-product-item:hover{background-color:transparent}:is(.chr-chr-product-item,.chr-chr-resource-item):not(
333.chr-chr-disabled
334):hover{cursor:pointer;background:#f9f9fb}:is(.chr-chr-product-item,.chr-chr-resource-item):not(
335.chr-chr-disabled
336).chr-chr-active{background:#f9f9fb;box-shadow:0 0 8px 4px #0000000f;border-color:#c1c1c1}.chr-chr-product-details,.chr-chr-resource-content{display:flex;flex-direction:column;gap:8px;flex:1}.chr-chr-product-icon{width:28px;aspect-ratio:1;object-fit:contain;flex-shrink:0}.chr-chr-product-name,.chr-chr-resource-title{font-family:Poppins,sans-serif;font-weight:500;color:#0f124d;font-size:.88888888888rem;line-height:1.3;margin:0}.chr-chr-product-description,.chr-chr-resource-description{font-weight:500;color:#6b7280;font-size:.66666666666rem;line-height:1.4;margin:0}.chr-chr-feature-name,.chr-chr-section-title{font-size:.77777777777rem;line-height:normal;font-weight:500;letter-spacing:0}
336.chr-chr-features-section{display:flex;flex-direction:column;gap:10px;margin:0 32px 12px 48px}.chr-chr-section-title{color:#eebd23;margin:0}.chr-chr-features-grid{display:grid;gap:12px;grid-template-columns:repeat(2,minmax(0,1fr))}.chr-chr-feature-name{color:#0f124d!important;white-space:nowrap;text-decoration:none}.chr-chr-feature-bullet{display:none;line-height:.5;font-size:16px}.chr-chr-btn-contact-us:hover,.chr-chr-btn-signup:hover,.chr-chr-feature-name.chr-chr-active,.chr-chr-feature-name:hover,.chr-chr-nav-link:hover{filter:brightness(2)}.chr-chr-header[data-variant=dark] .chr-chr-btn-contact-us:hover,.chr-chr-header[data-variant=dark] .chr-chr-btn-signup:hover,.chr-chr-header[data-variant=dark] .chr-chr-nav-link:hover{filter:brightness(.8)}.chr-chr-product-title-row{display:flex;align-items:start;justify-content:space-between;gap:16px}.chr-chr-product-title{font-family:Poppins,sans-serif;font-weight:500;color:#0f124d;font-size:.88888888888rem;letter-spacing:0;line-height:1.3;margin:0}.chr-chr-status-badge{display:inline-block;padding:6px 10px;font-size:.44444444444rem;line-height:1;font-weight:700;white-space:nowrap;color:#0f124d;background:linear-gradient(#fefcf4,#fefcf4) padding-box,linear-gradient(90deg,#efc130 0,#896f1c 100%) border-box;border:1px solid transparent;border-radius:200px}.chr-chr-resources-tab{display:grid;grid-template-columns:minmax(450px,1fr) 1px minmax(0,1.25fr);align-items:center;gap:16px;max-width:1400px;margin:0 auto}.chr-chr-resources-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.chr-chr-resource-icon-wrapper{display:flex;align-items:center;justify-content:center;width:28px;aspect-ratio:1;flex-shrink:0;overflow:hidden}.chr-chr-resource-icon{width:135.71%;aspect-ratio:1;max-width:none;object-fit:contain;mix-blend-mode:multiply}.chr-chr-divider{width:0;height:100%;border-left:1px solid #e0e0e0}.chr-chr-integration-section{display:grid;align-items:center;justify-content:center;gap:32px;grid-template-columns:minmax(200px,1fr) minmax(calc(100% - 252px - 32px),1fr)}.chr-chr-integration-image{width:100%;max-width:252px;aspect-ratio:252/236}.chr-chr-integration-content{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:24px}.chr-chr-integration-text{font-weight:500;color:#0f124d;font-size:16px;text-align:center}.chr-chr-cta-button{width:100%;max-width:238px;padding:12px 24px;font-weight:700;font-size:14px;color:#eebd23;background-color:#fff;border-radius:8px;border:1px solid #eebd23;text-align:center;text-decoration:none;transition:background-color .2s,color .2s;cursor:pointer}.chr-chr-cta-button:hover{color:#fff;background-color:#eebd23}.chr-chr-mobile-menu-btn{display:none;height:24px;padding:0;color:inherit!important;background:0 0!important;border:none;cursor:pointer}.chr-chr-mobile-link,.chr-chr-mobile-sublink{display:flex;text-decoration:none;font-weight:500}.chr-chr-mobile-menu-btn svg{pointer-events:none}.chr-chr-mobile-nav{position:fixed;top:72px;left:0;right:0;background:#fff;border-bottom:1px solid #e0e0e0;max-height:0;overflow:hidden;transition:max-height .3s;z-index:1000}.chr-chr-mobile-nav.chr-chr-active{max-height:calc(100vh - 72px);overflow-y:auto}.chr-chr-mobile-backdrop{position:fixed;top:72px;left:0;right:0;bottom:0;opacity:0;background:rgba(0,0,0,.5);z-index:999;transition:opacity .3s;pointer-events:none}.chr-chr-mobile-backdrop.chr-chr-active{opacity:1;pointer-events:all}.chr-chr-mobile-menu{padding:16px 0}.chr-chr-mobile-item{border-bottom:1px solid #f0f0f0}.chr-chr-mobile-item:has(+ .chr-chr-mobile-item[data-hidden]),.chr-chr-mobile-item:last-child{border:0}.chr-chr-mobile-link{align-items:center;justify-content:space-between;padding:16px 24px;color:#0f124d;font-size:16px!important;cursor:pointer;background:0 0;border:none;width:100%;text-align:left}.chr-chr-mobile-arrow{transition:transform .3s;color:#6b7280}.chr-chr-mobile-item.chr-chr-expanded .chr-chr-mobile-arrow{transform:rotate(90deg)}.chr-chr-mobile-submenu{max-height:0;overflow:hidden;background:#f9f9fb;transition:max-height .15s}.chr-chr-mobile-item.chr-chr-expanded .chr-chr-mobile-submenu{max-height:calc(var(--chr-links-count) * 50px + var(--chr-grid-height,0));transition:max-height .15s .15s}.chr-chr-mobile-sublink{align-items:center;gap:8px;padding:12px 24px 12px 40px;color:#0f124d;font-size:14px}.chr-chr-mobile-sublink:not(:first-child){border-top:1px solid #e0e0e0}.chr-chr-mobile-nav .chr-chr-product-icon,.chr-chr-mobile-nav .chr-chr-resource-icon-wrapper{width:20px}.chr-chr-mobile-nav .chr-chr-features-grid{padding:12px 24px 12px 72px}@media (max-width:1070px){.chr-chr-nav-links{display:none}.chr-chr-mobile-menu-btn{display:block}.chr-chr-dropdown{display:none!important}.chr-chr-features-grid{display:flex;align-items:center;flex-wrap:wrap;gap:6px}.chr-chr-feature-name{font-size:11px}.chr-chr-feature-bullet{display:inline-block}}@media (max-width:640px){.chr-chr-logo-icon{display:none}.chr-chr-cropped-logo-icon{display:block}.chr-chr-header{padding:0 16px}}@media (max-width:480px){.chr-chr-logo-icon{display:block}.chr-chr-cropped-logo-icon,.chr-chr-nav-actions{display:none}}
337</style>
338<header class="chr-chr-header">
339  <nav class="chr-chr-nav">
340    <div class="chr-chr-logo">
341      <button class="chr-chr-mobile-menu-btn" id="menuBtn">
342        <svg
343          xmlns="http://www.w3.org/2000/svg"
344          width="24"
345          height="24"
346          viewBox="0 0 24 24"
347          fill="none"
348          stroke="currentColor"
349          stroke-width="2"
350          stroke-linecap="round"
351          stroke-linejoin="round"
352        >
353          <path d="M4 5h16 M4 12h16 M4 19h16" />
354        </svg>
355      </button>
356      <a href="/">
357        <svg
358          xmlns="http://www.w3.org/2000/svg"
359          width="191"
360          height="35"
361          viewBox="0 0 191 35"
362          fill="none"
363          class="chr-chr-logo-icon"
364        >
365          <path
366            d="M27.6906 25.7173L15.049 34.1841C14.749 34.3854 14.3947 34.4918 14.0327 34.4893C13.6708 34.4868 13.318 34.3756 13.0208 34.1701L0.772539 25.7187C0.534038 25.5543 0.339161 25.3348 0.204614 25.0791C0.070067 24.8234 -0.000140343 24.5391 2.10625e-07 24.2505V4.48388C-0.000130718 4.0875 0.13228 3.70232 0.376393 3.38898C0.620507 3.07565 0.962459 2.85194 1.34843 2.75308L10.2902 0.455122C12.5769 -0.132683 14.974 -0.151396 17.2697 0.40064L27.1147 2.76845C27.5069 2.86249 27.856 3.08501 28.1056 3.40021C28.3553 3.71541 28.4911 4.10497 28.4912 4.50623V24.2338C28.4911 24.5269 28.4186 24.8155 28.28 25.0742C28.1413 25.3329 27.9409 25.5538 27.6962 25.7173"
367            fill="#EEBD23"
368          />
369          <path
370            d="M27.5474 10.6765H26.7313H26.0641V9.92776C26.0515 9.1371 26.0388 8.34643 26.022 7.55297C26.0091 7.46808 25.9792 7.38663 25.9341 7.31344C25.889 7.24025 25.8295 7.17682 25.7593 7.12691C18.9764 2.27256 9.5978 2.253 2.78401 7.06405C2.67423 7.12797 2.58397 7.22034 2.52287 7.3313C2.46176 7.44226 2.4321 7.56764 2.43707 7.69406C2.41319 10.4586 2.37105 13.2231 2.33594 15.9877C2.33594 16.1343 2.33594 16.2824 2.33594 16.4542H9.88293C9.91443 16.3982 9.9403 16.3393 9.96019 16.2782C10.1262 15.4969 10.5048 14.7759 11.0548 14.1941C11.6047 13.6122 12.3049 13.1918 13.0787 12.9787C13.8526 12.7656 14.6704 12.7681 15.443 12.9859C16.2155 13.2037 16.9131 13.6283 17.4594 14.2136C17.4774 14.233 17.4972 14.2508 17.5184 14.2666H19.9751C19.9091 14.1353 19.8571 14.0306 19.7981 13.9314C17.3077 9.6819 11.1176 9.71124 8.64828 13.9928C8.46989 14.3044 8.40809 14.4008 7.93473 14.4119C7.30547 14.4119 6.67058 14.4035 6.04552 14.4035H4.41757C4.41757 14.2164 4.41757 14.0976 4.41757 13.9775C4.44145 12.2676 4.47376 10.5578 4.47937 8.84653C4.46641 8.70508 4.49627 8.563 4.5651 8.43854C4.63392 8.31409 4.73858 8.21293 4.86564 8.14806C6.62968 7.0557 8.57865 6.29126 10.6175 5.89201C15.2092 5.01334 19.5326 5.7174 23.5597 8.11733C23.7018 8.18377 23.8203 8.29165 23.8993 8.42664C23.9783 8.56163 24.0142 8.71733 24.0021 8.87307C24.0021 9.46817 24.0059 10.0637 24.0134 10.6598H22.5568C22.4885 10.6597 22.4214 10.6775 22.3622 10.7113C22.303 10.7451 22.2537 10.7938 22.2193 10.8525C22.1849 10.9111 22.1666 10.9777 22.1662 11.0457C22.1657 11.1136 22.1832 11.1804 22.2169 11.2395L23.2001 12.9354L23.4628 13.3936L23.8659 14.092L24.7016 15.5462C24.7359 15.6051 24.7852 15.654 24.8445 15.6879C24.9038 15.7219 24.971 15.7398 25.0394 15.7398C25.1079 15.7398 25.1751 15.7219 25.2344 15.6879C25.2937 15.654 25.3429 15.6051 25.3772 15.5462L26.633 13.4019L26.9406 12.8767L27.6204 11.7172L27.8901 11.2576C27.9243 11.1988 27.9423 11.132 27.9424 11.0641C27.9425 10.9961 27.9247 10.9293 27.8907 10.8704C27.8567 10.8114 27.8078 10.7623 27.7488 10.7281C27.6898 10.6938 27.6227 10.6756 27.5544 10.6751"
371            fill="#0F124D"
372          />
373          <path
374            d="M18.489 18.2004C17.5732 21.553 13.615 22.637 11.119 20.2231C11.0451 20.1454 10.9615 20.0774 10.8704 20.0206H8.48252C8.53168 20.1323 8.55977 20.2036 8.59629 20.272C9.23858 21.4309 10.2262 22.3633 11.4233 22.941C12.6204 23.5186 13.9681 23.713 15.2809 23.4975C17.3105 23.1427 18.8303 22.0573 19.8754 20.2958C19.9624 20.1491 20.0467 19.9605 20.2897 19.9605C21.5539 19.9605 22.8279 19.9451 24.2816 19.9451C24.1412 20.3558 24.0695 20.7107 23.8883 20.9705C21.5117 24.3846 18.3513 26.8614 14.5687 28.5698C14.3494 28.6537 14.1061 28.6507 13.8889 28.5614C10.7875 27.1561 8.08783 25.2367 5.89944 22.6747L6.62001 22.2738L7.08914 22.014C7.14915 21.9806 7.19927 21.9322 7.23448 21.8734C7.26969 21.8147 7.28876 21.7478 7.28975 21.6795C7.29075 21.6111 7.27364 21.5437 7.24016 21.484C7.20667 21.4243 7.15798 21.3744 7.09898 21.3393L6.39667 20.9202L5.10583 20.1533L4.9471 20.0597L2.79383 18.7815C2.73481 18.7464 2.66756 18.7274 2.59883 18.7264C2.5301 18.7254 2.46231 18.7423 2.40226 18.7756C2.34221 18.8089 2.292 18.8573 2.25669 18.9159C2.22138 18.9746 2.2022 19.0414 2.20108 19.1098L2.17158 21.0725V21.6033L2.15895 22.4135L2.13506 24.0982C2.13394 24.1665 2.15094 24.2339 2.18437 24.2936C2.21779 24.3532 2.26645 24.4031 2.32543 24.4381C2.38441 24.4731 2.45163 24.492 2.5203 24.4929C2.58898 24.4938 2.65668 24.4767 2.71658 24.4433L4.06922 23.6931C6.72394 26.8921 10.0655 29.232 13.9858 30.8426C14.1504 30.9027 14.3311 30.9027 14.4957 30.8426C18.739 29.0951 22.318 26.4842 25.123 22.834C25.5298 22.3338 25.8497 21.7696 26.0697 21.1647V17.8833H18.5944C18.5564 17.9936 18.5171 18.0928 18.489 18.1948"
375            fill="#0F124D"
376          />
377          <path
378            d="M40.4875 18.0027C40.4875 16.6146 40.7975 15.3748 41.4174 14.2832C42.0508 13.1782 42.9065 12.3224 43.9846 11.716C45.0762 11.0961 46.2958 10.7861 47.6435 10.7861C49.2202 10.7861 50.6015 11.1904 51.7874 11.999C52.9733 12.8076 53.8021 13.9261 54.2738 15.3546H51.0193C50.6958 14.6808 50.2376 14.1754 49.6447 13.8385C49.0652 13.5016 48.3914 13.3332 47.6232 13.3332C46.8012 13.3332 46.0667 13.5286 45.4199 13.9194C44.7865 14.2967 44.2879 14.8358 43.924 
37815.5365C43.5736 16.2373 43.3984 17.0594 43.3984 18.0027C43.3984 18.9326 43.5736 19.7546 43.924 20.4689C44.2879 21.1696 44.7865 21.7154 45.4199 22.1062C46.0667 22.4836 46.8012 22.6722 47.6232 22.6722C48.3914 22.6722 49.0652 22.5038 49.6447 22.1669C50.2376 21.8165 50.6958 21.3044 51.0193 20.6306H54.2738C53.8021 22.0725 52.9733 23.1978 51.7874 24.0064C50.615 24.8015 49.2337 25.199 47.6435 25.199C46.2958 25.199 45.0762 24.8958 43.9846 24.2894C42.9065 23.6695 42.0508 22.8137 41.4174 21.7222C40.7975 20.6306 40.4875 19.3908 40.4875 18.0027Z"
379            fill="currentColor"
380          />
381          <path
382            d="M62.9979 13.7172C63.8469 13.7172 64.6016 13.9059 65.2619 14.2832C65.9223 14.6471 66.4344 15.1929 66.7982 15.9206C67.1756 16.6348 67.3642 17.4973 67.3642 18.5081V25.0778H64.5342V18.8921C64.5342 18.0027 64.3118 17.3221 63.8671 16.8505C63.4224 16.3653 62.816 16.1227 62.0478 16.1227C61.2662 16.1227 60.6463 16.3653 60.1881 16.8505C59.7434 17.3221 59.521 18.0027 59.521 18.8921V25.0778H56.691V10.1191H59.521V15.2737C59.8849 14.7886 60.37 14.4113 60.9765 14.1417C61.5829 13.8587 62.2567 13.7172 62.9979 13.7172Z"
383            fill="currentColor"
384          />
385          <path
386            d="M80.6276 13.8789V25.0778H77.7773V23.6627C77.4135 24.1479 76.9351 24.532 76.3421 24.815C75.7626 25.0845 75.1293 25.2193 74.442 25.2193C73.566 25.2193 72.7911 25.0373 72.1173 24.6735C71.4435 24.2961 70.9112 23.7503 70.5204 23.0361C70.143 22.3084 69.9544 21.4459 69.9544 20.4486V13.8789H72.7844V20.0444C72.7844 20.9338 73.0067 21.6211 73.4515 22.1062C73.8962 22.5779 74.5026 22.8137 75.2708 22.8137C76.0524 22.8137 76.6656 22.5779 77.1103 22.1062C77.555 21.6211 77.7773 20.9338 77.7773 20.0444V13.8789H80.6276Z"
387            fill="currentColor"
388          />
389          <path
390            d="M86.2499 15.6174C86.6137 15.0244 87.0854 14.5595 87.6649 14.2226C88.2579 13.8857 88.9317 13.7172 89.6863 13.7172V16.6888H88.9384C88.049 16.6888 87.3752 16.8976 86.917 17.3154C86.4722 17.7332 86.2499 18.4609 86.2499 19.4986V25.0778H83.4199V13.8789H86.2499V15.6174Z"
391            fill="currentColor"
392          />
393          <path
394            d="M97.7983 13.7172C99.1325 13.7172 100.211 14.1417 101.033 14.9907C101.855 15.8263 102.266 16.9987 102.266 18.5081V25.0778H99.4357V18.8921C99.4357 18.0027 99.2133 17.3221 98.7686 16.8505C98.3239 16.3653 97.7175 16.1227 96.9493 16.1227C96.1677 16.1227 95.5478 16.3653 95.0896 16.8505C94.6449 17.3221 94.4225 18.0027 94.4225 18.8921V25.0778H91.5925V13.8789H94.4225V15.2737C94.7999 14.7886 95.2783 14.4113 95.8577 14.1417C96.4507 13.8587 97.0976 13.7172 97.7983 13.7172Z"
395            fill="currentColor"
396          />
397          <path
398            d="M114.645 25.2193C113.662 25.2193 112.772 25.0508 111.977 24.7139C111.195 24.377 110.575 23.8918 110.117 23.2585C109.659 22.6251 109.423 21.8771 109.41 21.0147H112.442C112.482 21.5941 112.685 22.0523 113.048 22.3892C113.426 22.7261 113.938 22.8946 114.585 22.8946C115.245 22.8946 115.764 22.7396 116.141 22.4297C116.519 22.1062 116.707 21.6885 116.707 21.1764C116.707 20.7586 116.579 20.415 116.323 20.1454C116.067 19.8759 115.744 19.667 115.353 19.5188C114.975 19.3571 114.45 19.1819 113.776 18.9932C112.86 18.7237 112.112 18.4609 111.532 18.2048C110.966 17.9353 110.474 17.5378 110.057 17.0122C109.652 16.4731 109.45 15.7589 109.45 14.8695C109.45 14.0339 109.659 13.3062 110.077 12.6863C110.495 12.0664 111.081 11.5947 111.836 11.2713C112.59 10.9344 113.453 10.7659 114.423 10.7659C115.878 10.7659 117.058 11.123 117.96 11.8373C118.877 12.538 119.382 13.5218 119.477 14.7886H116.364C116.337 14.3034 116.128 13.9059 115.737 13.5959C115.36 13.2725 114.854 13.1108 114.221 13.1108C113.668 13.1108 113.224 13.2523 112.887 13.5353C112.563 13.8183 112.402 14.2293 112.402 14.7684C112.402 15.1457 112.523 15.4624 112.765 15.7185C113.021 15.961 113.331 16.1632 113.695 16.3249C114.073 16.4731 114.598 16.6483 115.272 16.8505C116.188 17.12 116.936 17.3895 117.516 17.659C118.095 17.9286 118.594 18.3329 119.012 18.8719C119.429 19.411 119.638 20.1185 119.638 20.9944C119.638 21.7491 119.443 22.4499 119.052 23.0967C118.661 23.7436 118.089 24.2624 117.334 24.6533C116.579 25.0306 115.683 25.2193 114.645 25.2193Z"
399            fill="currentColor"
400          />
401          <path
402            d="M127.065 25.2597C125.986 25.2597 125.016 25.0239 124.154 24.5522C123.291 24.067 122.611 23.3865 122.112 22.5105C121.627 21.6346 121.384 20.6238 121.384 19.4784C121.384 18.3329 121.634 17.3221 122.132 16.4462C122.644 15.5702 123.338 14.8964 124.214 14.4247C125.09 13.9396 126.067 13.697 127.145 13.697C128.224 13.697 129.201 13.9396 130.077 14.4247C130.952 14.8964 131.64 15.5702 132.138 16.4462C132.651 17.3221 132.907 18.3329 132.907 19.4784C132.907 20.6238 132.644 21.6346 132.118 22.5105C131.606 23.3865 130.905 24.067 130.016 24.5522C129.14 25.0239 128.156 25.2597 127.065 25.2597ZM127.065 22.7935C127.577 22.7935 128.055 22.6722 128.5 22.4297C128.958 22.1736 129.322 21.7963 129.591 21.2977C129.861 20.799 129.996 20.1926 129.996 19.4784C129.99
4026 18.4137 129.713 17.5984 129.147 17.0324C128.594 16.4529 127.914 16.1632 127.105 16.1632C126.296 16.1632 125.616 16.4529 125.063 17.0324C124.524 17.5984 124.255 18.4137 124.255 19.4784C124.255 20.543 124.518 21.365 125.043 21.9445C125.582 22.5105 126.256 22.7935 127.065 22.7935Z"
403            fill="currentColor"
404          />
405          <path
406            d="M137.813 10.1191V25.0778H134.982V10.1191H137.813Z"
407            fill="currentColor"
408          />
409          <path
410            d="M151.181 13.8789V25.0778H148.33V23.6627C147.967 24.1479 147.488 24.532 146.895 24.815C146.316 25.0845 145.682 25.2193 144.995 25.2193C144.119 25.2193 143.344 25.0373 142.67 24.6735C141.997 24.2961 141.464 23.7503 141.074 23.0361C140.696 22.3084 140.508 21.4459 140.508 20.4486V13.8789H143.338V20.0444C143.338 20.9338 143.56 21.6211 144.005 22.1062C144.449 22.5779 145.056 22.8137 145.824 22.8137C146.606 22.8137 147.219 22.5779 147.663 22.1062C148.108 21.6211 148.33 20.9338 148.33 20.0444V13.8789H151.181Z"
411            fill="currentColor"
412          />
413          <path
414            d="M157.268 16.2036V21.6211C157.268 21.9984 157.356 22.2747 157.531 22.4499C157.719 22.6116 158.029 22.6925 158.461 22.6925H159.775V25.0778H157.996C155.61 25.0778 154.418 23.9188 154.418 21.6009V16.2036H153.084V13.8789H154.418V11.1096H157.268V13.8789H159.775V16.2036H157.268Z"
415            fill="currentColor"
416          />
417          <path
418            d="M163.245 12.5448C162.747 12.5448 162.329 12.3898 161.992 12.0799C161.669 11.7564 161.507 11.3589 161.507 10.8872C161.507 10.4155 161.669 10.0247 161.992 9.71476C162.329 9.39133 162.747 9.22961 163.245 9.22961C163.744 9.22961 164.155 9.39133 164.478 9.71476C164.815 10.0247 164.984 10.4155 164.984 10.8872C164.984 11.3589 164.815 11.7564 164.478 12.0799C164.155 12.3898 163.744 12.5448 163.245 12.5448ZM164.64 13.8789V25.0778H161.81V13.8789H164.64Z"
419            fill="currentColor"
420          />
421          <path
422            d="M172.409 25.2597C171.331 25.2597 170.36 25.0239 169.498 24.5522C168.636 24.067 167.955 23.3865 167.456 22.5105C166.971 21.6346 166.729 20.6238 166.729 19.4784C166.729 18.3329 166.978 17.3221 167.477 16.4462C167.989 15.5702 168.683 14.8964 169.559 14.4247C170.435 13.9396 171.412 13.697 172.49 13.697C173.568 13.697 174.545 13.9396 175.421 14.4247C176.297 14.8964 176.984 15.5702 177.483 16.4462C177.995 17.3221 178.251 18.3329 178.251 19.4784C178.251 20.6238 177.988 21.6346 177.463 22.5105C176.95 23.3865 176.25 24.067 175.36 24.5522C174.484 25.0239 173.5 25.2597 172.409 25.2597ZM172.409 22.7935C172.921 22.7935 173.399 22.6722 173.844 22.4297C174.302 22.1736 174.666 21.7963 174.936 21.2977C175.205 20.799 175.34 20.1926 175.34 19.4784C175.34 18.4137 175.057 17.5984 174.491 17.0324C173.938 16.4529 173.258 16.1632 172.449 16.1632C171.641 16.1632 170.96 16.4529 170.408 17.0324C169.869 17.5984 169.599 18.4137 169.599 19.4784C169.599 20.543 169.862 21.365 170.387 21.9445C170.927 22.5105 171.6 22.7935 172.409 22.7935Z"
423            fill="currentColor"
424          />
425          <path
426            d="M186.533 13.7172C187.867 13.7172 188.945 14.1417 189.767 14.9907C190.589 15.8263 191 16.9987 191 18.5081V25.0778H188.17V18.8921C188.17 18.0027 187.948 17.3221 187.503 16.8505C187.058 16.3653 186.452 16.1227 185.684 16.1227C184.902 16.1227 184.282 16.3653 183.824 16.8505C183.379 17.3221 183.157 18.0027 183.157 18.8921V25.0778H180.327V13.8789H183.157V15.2737C183.534 14.7886 184.013 14.4113 184.592 14.1417C185.185 13.8587 185.832 13.7172 186.533 13.7172Z"
427            fill="currentColor"
428          />
429        </svg>
430        <img
431          class="chr-chr-cropped-logo-icon"
432          src="https://churnsolution.com/wp-content/uploads/2026/01/cropped-logo.svg"
433          alt="cropped-site-logo"
434        />
435      </a>
436    </div>
437    <div class="chr-chr-nav-links">
438      <div class="chr-chr-nav-item">
439        <a data-match="products" class="chr-chr-nav-link">
440          Products
441          <svg
442            xmlns="http://www.w3.org/2000/svg"
443            width="24"
444            height="24"
445            viewBox="0 0 24 24"
446            fill="none"
447            stroke="currentColor"
448            stroke-width="2"
449            stroke-linecap="round"
450            stroke-linejoin="round"
451            class="chr-chr-dropdown-arrow"
452          >
453            <path d="m6 9 6 6 6-6" />
454          </svg>
455        </a>
456        <div class="chr-chr-dropdown">
457          <main class="chr-chr-dropdown-content">
458            <section
459              class="chr-chr-primary-product"
460              data-match="cancellation-flows"
461              style="grid-row: span 2"
462            >
463              <a
464                href="/products/cancellation-flows/"
465                class="chr-chr-product-item"
466              >
467                <img
468                  class="chr-chr-product-icon"
469                  src="https://churnsolution.com/wp-content/uploads/2023/09/flows.png"
470                  alt="cancellation-flows"
471                />
472                <div class="chr-chr-product-details">
473                  <h2 class="chr-chr-product-name">Cancellation Flows</h2>
474                  <p class="chr-chr-product-description">
475                    Reduce cancellations instantly with Personalized
476                    Cancellation flows
477                  </p>
478                </div>
479              </a>
480              <aside class="chr-chr-features-section">
481                <h3 class="chr-chr-section-title">FEATURES</h3>
482                <div class="chr-chr-features-grid">
483                  <a
484                    data-match="exit-surveys"
485                    href="/products/exit-surveys/"
486                    class="chr-chr-feature-name"
487                  >
488                    Exit Survey
489                  </a>
490                  <span class="chr-chr-feature-bullet">&bullet;</span>
491                  <a
492                    data-match="ab-experiments"
493                    href="/products/ab-experiments"
494                    class="chr-chr-feature-name"
495                  >
496                    A/B Experiments
497                  </a>
498                  <span class="chr-chr-feature-bullet">&bullet;</span>
499                  <a
500                    data-match="dynamic-offers"
501                    href="/products/dynamic-offers/"
502                    class="chr-chr-feature-name"
503                  >
504                    Dynamic Offers
505                  </a>
506                  <span class="chr-chr-feature-bullet">&bullet;</span>
507                  <a
508                    data-match="customer-segmentation"
509                    href="/products/customer-segmentation/"
510                    class="chr-chr-feature-name"
511                  >
512                    Customer Segmentation
513                  </a>
514                  <span class="chr-chr-feature-bullet">&bullet;</span>
515                  <a
516                    data-match="easy-setup"
517                    href="/products/easy-setup/"
518                    class="chr-chr-feature-name"
519                  >
520                    Easy Setup
521                  </a>
522                  <span class="chr-chr-feature-bullet">&bullet;</span>
523                  <a
524                    data-match="custom-branding"
525                    href="/products/custom-branding/"
526                    class="chr-chr-feature-name"
527                  >
528                    Custom Branding
529                  </a>
530                  <span class="chr-chr-feature-bullet">&bullet;</span>
531                  <a
532                    data-match="session-recording"
533                    href="/products/session-recording/"
534                    class="chr-chr-feature-name"
535                  >
536                    Session Recording
537                  </a>
538                  <span class="chr-chr-feature-bullet">&bullet;</span>
539                  <a
540                    data-match="pause-wall"
541                    href="/products/pause-wall/"
542                    class="chr-chr-feature-name"
543                  >
544                    Pause Wall
545                  </a>
546                </div>
547              </aside>
548            </section>
549            <section
550              class="chr-chr-primary-product"
551              data-match="payment-recovery"
552              style="grid-row: span 2"
553            >
554              <a
555                href="/products/payment-recovery/"
556                class="chr-chr-product-item"
557              >
558                <img
559                  class="chr-chr-product-icon"
560                  src="https://churnsolution.com/wp-content/uploads/2025/08/payment-recovery-icon.svg"
561                  alt="payment-recovery"
562                />
563                <div class="chr-chr-product-details">
564                  <h2 class="chr-chr-product-name">Payment Recovery</h2>
565                  <p class="chr-chr-product-description">
566                    Stop involuntary churn by recovering failed payments
567                    automatically.
568                  </p>
569                </div>
570              </a>
571              <aside class="chr-chr-features-section">
572                <h3 class="chr-chr-section-title">FEATURES</h3>
573                <div
574                  class="chr-chr-features-grid"
575                  style="grid-template-columns: minmax(0, 1fr)"
576                >
577                  <a
578                    data-match="payment-recovery"
579                    href="/products/payment-recovery/"
580                    class="chr-chr-feature-name"
581                  >
582                    Dunning Emails
583                  </a>
584                  <span class="chr-chr-feature-bullet">&bullet;</span>
585                  <a
586                    data-match="smart-retries"
587                    href="/products/smart-retries/"
588                    class="chr-chr-feature-name"
589                  >
590                    Smart Retries
591                  </a>
592                  <span class="chr-chr-feature-bullet">&bullet;</span>
593                  <a
594                    data-match="payment-wall"
595                    href="/products/payment-wall/"
596                    class="chr-chr-feature-name"
597                  >
598                    Payment Wall
599                  </a>
600                </div>
601              </aside>
602            </section>
603            <a
604              data-match="reactivation"
605              href="/products/reactivation/"
606              class="chr-chr-product-item"
607            >
608              <img
609                class="chr-chr-product-icon"
610                src="https://churnsolution.com/wp-content/uploads/2025/11/reactivation-icon.svg"
611                alt="reactivation"
612              />
613              <div class="chr-chr-product-details">
614                <h2 class="chr-chr-product-name">Reactivation Campaigns</h2>
615                <p class="chr-chr-product-description">
616                  Win back cancelled users through automated reactivation emails
617                </p>
618              </div>
619            </a>
620            <a
621              data-match="feedback-analysis"
622              href="/products/feedback-analysis/"
623              class="chr-chr-product-item"
624            >
625              <img
626                class="chr-chr-product-icon"
627                src="https://churnsolution.com/wp-content/uploads/2026/01/feedback-analysis-icon-2.svg"
628                alt="feedback-analysis"
629              />
630              <div class="chr-chr-product-details">
631                <h2 class="chr-chr-product-name">AI Feedback Analysis</h2>
632                <p class="chr-chr-product-description">
633                  Understand cancellation reasons instantly using AI
634                </p>
635              </div>
636            </a>
637            <a
638              data-match="churn-metrics"
639              href="/products/churn-metrics/"
640              class="chr-chr-product-item"
641            >
642              <img
643                class="chr-chr-product-icon"
644                src="https://churnsolution.com/wp-content/uploads/2025/12/chur-metrics-icon-1.png"
645                alt="churn-metrics"
646              />
647              <div class="chr-chr-product-details">
648                <h2 class="chr-chr-product-name">Churn Metrics</h2>
649                <p class="chr-chr-product-description">
650                  Track churn trends clearly with actionable insights
651                </p>
652              </div>
653            </a>
654            <a
655              data-match="customer-portal"
656              href="/products/customer-portal/"
657              class="chr-chr-product-item"
658            >
659              <img
660                class="chr-chr-product-icon"
661                src="https://churnsolution.com/wp-content/uploads/2026/01/customer-portal-icon.svg"
662                alt="customer-portal"
663              />
664              <div class="chr-chr-product-details">
665                <h2 class="chr-chr-product-name">Customer Portal</h2>
666                <p class="chr-chr-product-description">
667                  Let customers manage billing easily for free
668                </p>
669              </div>
670            </a>
671            <a
672              data-match="mcp-server"
673              href="/products/mcp-server/"
674              class="chr-chr-product-item"
675            >
676              <img
677                class="chr-chr-product-icon"
678                src="https://churnsolution.com/wp-content/uploads/2026/07/mcp-server-icon.svg"
679                alt="mcp-server"
680              />
681              <div class="chr-chr-product-details">
682                <div class="chr-chr-product-title-row">
683                  <h2 class="chr-chr-product-name">MCP Server</h2>
684                  <span class="chr-chr-status-badge">New</span>
685                </div>
686                <p class="chr-chr-product-description">
687                  Ask your AI assistant about churn using live data
688                </p>
689              </div>
690            </a>
691          </main>
692        </div>
693      </div>
694      <div class="chr-chr-nav-item">
695        <a data-match="resources" class="chr-chr-nav-link">
696          Resources
697          <svg
698            xmlns="http://www.w3.org/2000/svg"
699            width="24"
700            height="24"
701            viewBox="0 0 24 24"
702            fill="none"
703            stroke="currentColor"
704            stroke-width="2"
705            stroke-linecap="round"
706            stroke-linejoin="round"
707            class="chr-chr-dropdown-arrow"
708          >
709            <path d="m6 9 6 6 6-6" />
710          </svg>
711        </a>
712        <div class="chr-chr-dropdown">
713          <main class="chr-chr-resources-tab">
714            <section
715              class="chr-chr-resources-grid"
716              aria-label="Resource navigation"
717            >
718              <a
719                data-match="docs"
720                href="/docs/install/"
721                class="chr-chr-resource-item"
722              >
723                <div class="chr-chr-resource-icon-wrapper">
724                  <img
725                    class="chr-chr-resource-icon"
726                    src="https://churnsolution.com/wp-content/uploads/2026/01/developer-docs-icon.png"
727                    alt="docs"
728                  />
729                </div>
730                <div class="chr-chr-resource-content">
731                  <h2 class="chr-chr-resource-title">Developer Docs</h2>
732                  <p class="chr-chr-resource-description">
733                    Guides, API references, and integration instructions.
734                  </p>
735                </div>
736              </a>
737              <a
738                href="/demo/"
739                target="_blank"
740                class="chr-chr-resource-item"
741                data-event-action="book_demo"
742                data-event-category="cta"
743                data-event-label="header_book_demo"
744                data-event-from="WP-header"
745              >
746                <div class="chr-chr-resource-icon-wrapper">
747                  <img
748                    class="chr-chr-resource-icon"
749                    src="https://churnsolution.com/wp-content/uploads/2026/01/book-demo-icon.png"
750                    alt="demo"
751                  />
752                </div>
753                <div class="chr-chr-resource-content">
754                  <h2 class="chr-chr-resource-title">Book Demo</h2>
755                  <p class="chr-chr-resource-description">
756                    Schedule a live demo with our team.
757                  </p>
758                </div>
759              </a>
760              <a
761                data-match="how-it-works"
762                href="/how-it-works/"
763                class="chr-chr-resource-item"
764              >
765                <div class="chr-chr-resource-icon-wrapper">
766                  <img
767                    class="chr-chr-resource-icon"
768                    src="https://churnsolution.com/wp-content/uploads/2026/01/how-it-works-icon.png"
769                    alt="how-it-works"
770                  />
771                </div>
772                <div class="chr-chr-resource-content">
773                  <h2 class="chr-chr-resource-title">How it works</h2>
774                  <p class="chr-chr-resource-description">
775                    Step-by-step overview of our platform.
776                  </p>
777                </div>
778              </a>
779              <a data-match="blog" href="/blog/" class="chr-chr-resource-item">
780                <div class="chr-chr-resource-icon-wrapper">
781                  <img
782                    class="chr-chr-resource-icon"
783                    src="https://churnsolution.com/wp-content/uploads/2026/01/blog-icon.png"
784                    alt="blog"
785                  />
786                </div>
787                <div class="chr-chr-resource-content">
788                  <h2 class="chr-chr-resource-title">Blog</h2>
789                  <p class="chr-chr-resource-description">
790                    Articles, tips, and case studies on retention.
791                  </p>
792                </div>
793              </a>
794              <a
795                data-match="calculator"
796                href="/calculator/"
797                class="chr-chr-resource-item"
798              >
799                <div class="chr-chr-resource-icon-wrapper">
800                  <img
801                    class="chr-chr-resource-icon"
802                    src="https://churnsolution.com/wp-content/uploads/2026/01/roi-calculator-icon.png"
803                    alt="calculator"
804                  />
805                </div>
806                <div class="chr-chr-resource-content">
807                  <h2 class="chr-chr-resource-title">ROI Calculator</h2>
808                  <p class="chr-chr-resource-description">
809                    Estimate revenue saved and potential growth.
810                  </p>
811                </div>
812              </a>
813              <a
814                data-match="case-studies"
815                href="/case-studies/"
816                class="chr-chr-resource-item"
817              >
818                <div class="chr-chr-resource-icon-wrapper">
819                  <img
820                    class="chr-chr-resource-icon"
821                    src="https://churnsolution.com/wp-content/uploads/2026/04/case-studies-icon.png"
822                    alt="case-studies"
823                  />
824                </div>
825                <div class="chr-chr-resource-content">
826                  <h2 class="chr-chr-resource-title">Case Studies</h2>
827                  <p class="chr-chr-resource-description">
828                    Explore how teams reduced churn and grew revenue.
829                  </p>
830                </div>
831              </a>
832              <a
833                data-match="integrations"
834                href="/integrations/"
835                class="chr-chr-resource-item"
836                style="grid-column: span 2"
837              >
838                <div class="chr-chr-resource-icon-wrapper">
839                  <img
840                    class="chr-chr-resource-icon"
841                    src="https://churnsolution.com/wp-content/uploads/2026/08/integrations-icon.png"
842                    alt="integrations"
843                  />
844                </div>
845                <div class="chr-chr-resource-content">
846                  <h2 class="chr-chr-resource-title">Integrations</h2>
847                  <p class="chr-chr-resource-description">
848                    Connect your gateway and tools in minutes.
849                  </p>
850                </div>
851              </a>
852            </section>
853            <div
854              class="chr-chr-divider"
855              role="separator"
856              aria-hidden="true"
857            ></div>
858            <section class="chr-chr-integration-section">
859              <img
860                class="chr-chr-integration-image"
861                src="https://churnsolution.com/wp-content/uploads/2026/01/mutiple-processors.svg"
862                alt="mutiple-processors"
863              />
864              <div class="chr-chr-integration-content">
865                <p class="chr-chr-integration-text">
866                  Connect Churn Solution with your favorite tools in minutes and
867                  start reducing cancellations instantly.
868                </p>
869                <a
870                  href="/integrations/"
871                  class="chr-chr-cta-button"
872                  data-event-action="integrations"
873                  data-event-category="navigation"
874                  data-event-label="integrations"
875                  data-event-from="WP-header"
876                >
877                  Get Started
878                </a>
879              </div>
880            </section>
881          </main>
882        </div>
883      </div>
884      <a href="/pricing/" data-match="pricing" class="chr-chr-nav-link">
885        Pricing
886      </a>
887      <a
888        href="/case-studies/"
889        data-match="case-studies"
890        class="chr-chr-nav-link"
891      >
892        Case Studies
893      </a>
894    </div>
895    <div class="chr-chr-nav-actions">
896      <a
897        href="#"
898        class="chr-chr-btn-contact-us"
899        onclick="goToPage('contact-us')"
900        data-event-action="contact-us_navigate_to_app"
901        data-event-category="navigation"
902        data-event-label="contact-us"
903        data-event-from="WP-header"
904      >
905        Contact Us
906      </a>
907      <button
908        class="chr-chr-btn-signup"
909        onclick="goToPage('signup')"
910        data-event-action="signup_navigate_to_app"
911        data-event-category="navigation"
912        data-event-label="signup"
913        data-event-from="WP-header"
914      >
915        Sign Up
916      </button>
917      <a
918        class="chr-chr-btn-demo"
919        href="/demo/"
920        target="_blank"
921        data-event-action="book_demo"
922        data-event-category="cta"
923        data-event-label="header_book_demo"
924        data-event-from="WP-header"
925      >
926        Book Demo
927      </a>
928    </div>
929  </nav>
930</header>
931<div class="chr-chr-mobile-nav" id="mobileNav">
932  <nav class="chr-chr-mobile-menu">
933    <div class="chr-chr-mobile-item" style="--chr-links-count: 7">
934      <button class="chr-chr-mobile-link" data-toggle="products">
935        Products
936        <svg
937          class="chr-chr-mobile-arrow"
938          xmlns="http://www.w3.org/2000/svg"
939          width="20"
940          height="20"
941          viewBox="0 0 24 24"
942          fill="none"
943          stroke="currentColor"
944          stroke-width="2"
945        >
946          <path d="m9 18 6-6-6-6" />
947        </svg>
948      </button>
949      <div class="chr-chr-mobile-submenu">
950        <a href="/products/cancellation-flows/" class="chr-chr-mobile-sublink">
951          <img
952            class="chr-chr-product-icon"
953            src="https://churnsolution.com/wp-content/uploads/2023/09/flows.png"
954            alt="cancellation-flows"
955          />
956          <span>Cancellation Flows</span>
957        </a>
958        <div class="chr-chr-features-grid">
959          <a href="/products/exit-surveys/" class="chr-chr-feature-name">
960            Exit Survey
961          </a>
962          <span class="chr-chr-feature-bullet">&bullet;</span>
963          <a href="/products/ab-experiments" class="chr-chr-feature-name">
964            A/B Experiments
965          </a>
966          <span class="chr-chr-feature-bullet">&bullet;</span>
967          <a
968            data-match="dynamic-offers"
969            href="/products/dynamic-offers/"
970            class="chr-chr-feature-name"
971          >
972            Dynamic Offers
973          </a>
974          <span class="chr-chr-feature-bullet">&bullet;</span>
975          <a
976            href="/products/customer-segmentation/"
977            class="chr-chr-feature-name"
978          >
979            Customer Segmentation
980          </a>
981          <span class="chr-chr-feature-bullet">&bullet;</span>
982          <a href="/products/easy-setup/" class="chr-chr-feature-name">
983            Easy Setup
984          </a>
985          <span class="chr-chr-feature-bullet">&bullet;</span>
986          <a href="/products/custom-branding/" class="chr-chr-feature-name">
987            Custom Branding
988          </a>
989          <span class="chr-chr-feature-bullet">&bullet;</span>
990          <a href="/products/session-recording/" class="chr-chr-feature-name">
991            Session Recording
992          </a>
993          <span class="chr-chr-feature-bullet">&bullet;</span>
994          <a href="/products/pause-wall/" class="chr-chr-feature-name">
995            Pause Wall
996          </a>
997        </div>
998        <a href="/products/payment-recovery/" class="chr-chr-mobile-sublink">
999          <img
1000            class="chr-chr-product-icon"
1001            src="https://churnsolution.com/wp-content/uploads/2025/08/payment-recovery-icon.svg"
1002            alt="payment-recovery"
1003          />
1004          <span>Payment Recovery</span>
1005        </a>
1006        <div class="chr-chr-features-grid">
1007          <a href="/products/payment-recovery/" class="chr-chr-feature-name">
1008            Dunning Emails
1009          </a>
1010          <span class="chr-chr-feature-bullet">&bullet;</span>
1011          <a href="/products/smart-retries" class="chr-chr-feature-name">
1012            Smart Retries
1013          </a>
1014          <span class="chr-chr-feature-bullet">&bullet;</span>
1015          <a href="/products/payment-wall/" class="chr-chr-feature-name">
1016            Payment Wall
1017          </a>
1018        </div>
1019        <a href="/products/reactivation/" class="chr-chr-mobile-sublink">
1020          <img
1021            class="chr-chr-product-icon"
1022            src="https://churnsolution.com/wp-content/uploads/2025/11/reactivation-icon.svg"
1023            alt="reactivation"
1024          />
1025          <span>Reactivation Campaigns</span>
1026        </a>
1027        <a href="/products/feedback-analysis/" class="chr-chr-mobile-sublink">
1028          <img
1029            class="chr-chr-product-icon"
1030            src="https://churnsolution.com/wp-content/uploads/2026/01/feedback-analysis-icon-2.svg"
1031            alt="feedback-analysis"
1032          />
1033          <span>AI Feedback Analysis</span>
1034        </a>
1035        <a href="/products/churn-metrics/" class="chr-chr-mobile-sublink">
1036          <img
1037            class="chr-chr-product-icon"
1038            src="https://churnsolution.com/wp-content/uploads/2025/12/chur-metrics-icon-1.png"
1039            alt="churn-metrics"
1040          />
1041          <span>Churn Metrics</span>
1042        </a>
1043        <a href="/products/customer-portal/" class="chr-chr-mobile-sublink">
1044          <img
1045            class="chr-chr-product-icon"
1046            src="https://churnsolution.com/wp-content/uploads/2026/01/customer-portal-icon.svg"
1047            alt="customer-portal"
1048          />
1049          <span>Customer Portal</span>
1050        </a>
1051        <a href="/products/mcp-server/" class="chr-chr-mobile-sublink">
1052          <img
1053            class="chr-chr-product-icon"
1054            src="https://churnsolution.com/wp-content/uploads/2026/07/mcp-server-icon.svg"
1055            alt="mcp-server"
1056          />
1057          <span>MCP Server</span>
1058        </a>
1059      </div>
1060    </div>
1061    <div class="chr-chr-mobile-item" style="--chr-links-count: 7">
1062      <button class="chr-chr-mobile-link" data-toggle="resources">
1063        Resources
1064        <svg
1065          class="chr-chr-mobile-arrow"
1066          xmlns="http://www.w3.org/2000/svg"
1067          width="20"
1068          height="20"
1069          viewBox="0 0 24 24"
1070          fill="none"
1071          stroke="currentColor"
1072          stroke-width="2"
1073        >
1074          <path d="m9 18 6-6-6-6" />
1075        </svg>
1076      </button>
1077      <div class="chr-chr-mobile-submenu">
1078        <a href="/docs/install/" class="chr-chr-mobile-sublink">
1079          <div class="chr-chr-resource-icon-wrapper">
1080            <img
1081              class="chr-chr-resource-icon"
1082              src="https://churnsolution.com/wp-content/uploads/2026/01/developer-docs-icon.png"
1083              alt="docs"
1084            />
1085          </div>
1086          <span>Developer Docs</span>
1087        </a>
1088        <a
1089          href="/demo/"
1090          target="_blank"
1091          class="chr-chr-mobile-sublink"
1092          data-event-action="book_demo"
1093          data-event-category="cta"
1094          data-event-label="header_book_demo"
1095          data-event-from="WP-header"
1096        >
1097          <div class="chr-chr-resource-icon-wrapper">
1098            <img
1099              class="chr-chr-resource-icon"
1100              src="https://churnsolution.com/wp-content/uploads/2026/01/book-demo-icon.png"
1101              alt="demo"
1102            />
1103          </div>
1104          <span>Book Demo</span>
1105        </a>
1106        <a href="/how-it-works/" class="chr-chr-mobile-sublink">
1107          <div class="chr-chr-resource-icon-wrapper">
1108            <img
1109              class="chr-chr-resource-icon"
1110              src="https://churnsolution.com/wp-content/uploads/2026/01/how-it-works-icon.png"
1111              alt="how-it-works"
1112            />
1113          </div>
1114          <span>How it works</span>
1115        </a>
1116        <a href="/blog/" class="chr-chr-mobile-sublink">
1117          <div class="chr-chr-resource-icon-wrapper">
1118            <img
1119              class="chr-chr-resource-icon"
1120              src="https://churnsolution.com/wp-content/uploads/2026/01/blog-icon.png"
1121              alt="blog"
1122            />
1123          </div>
1124          <span>Blog</span>
1125        </a>
1126        <a href="/calculator/" class="chr-chr-mobile-sublink">
1127          <div class="chr-chr-resource-icon-wrapper">
1128            <img
1129              class="chr-chr-resource-icon"
1130              src="https://churnsolution.com/wp-content/uploads/2026/01/roi-calculator-icon.png"
1131              alt="calculator"
1132            />
1133          </div>
1134          <span>ROI Calculator</span>
1135        </a>
1136        <a href="/case-studies/" class="chr-chr-mobile-sublink">
1137          <div class="chr-chr-resource-icon-wrapper">
1138            <img
1139              class="chr-chr-resource-icon"
1140              src="https://churnsolution.com/wp-content/uploads/2026/04/case-studies-icon.png"
1141              alt="case-studies"
1142            />
1143          </div>
1144          <span>Case Studies</span>
1145        </a>
1146        <a href="/integrations/" class="chr-chr-mobile-sublink">
1147          <div class="chr-chr-resource-icon-wrapper">
1148            <img
1149              class="chr-chr-resource-icon"
1150              src="https://churnsolution.com/wp-content/uploads/2026/08/integrations-icon.png"
1151              alt="integrations"
1152            />
1153          </div>
1154          <span>Integrations</span>
1155        </a>
1156      </div>
1157    </div>
1158    <div class="chr-chr-mobile-item">
1159      <a href="/pricing/" class="chr-chr-mobile-link">Pricing</a>
1160    </div>
1161    <div class="chr-chr-mobile-item">
1162      <a href="/case-studies/" class="chr-chr-mobile-link">Case Studies</a>
1163    </div>
1164    <div class="chr-chr-mobile-item" data-action>
1165      <a
1166        href="#"
1167        class="chr-chr-mobile-link"
1168        onclick="goToPage('contact-us')"
1169        data-event-action="contact-us_navigate_to_app"
1170        data-event-category="navigation"
1171        data-event-label="contact-us"
1172        data-event-from="WP-header"
1173      >
1174        Contact Us
1175      </a>
1176    </div>
1177    <div class="chr-chr-mobile-item" data-action>
1178      <a
1179        href="#"
1180        class="chr-chr-mobile-link"
1181        onclick="goToPage('signup')"
1182        data-event-action="signup_navigate_to_app"
1183        data-event-category="navigation"
1184        data-event-label="signup"
1185        data-event-from="WP-header"
1186      >
1187        Sign Up
1188      </a>
1189    </div>
1190    <div class="chr-chr-mobile-item" data-action>
1191      <a
1192        class="chr-chr-mobile-link"
1193        href="/demo/"
1194        target="_blank"
1195        data-event-action="book_demo"
1196        data-event-category="cta"
1197        data-event-label="header_book_demo"
1198        data-event-from="WP-header"
1199      >
1200        Book Demo
1201      </a>
1202    </div>
1203  </nav>
1204</div>
1205<div class="chr-chr-mobile-backdrop" id="mobileBackdrop"></div>
1206<script>
1207function goToPage(e="signup"){let t=window.location.hostname.match(/\.([a-z]{2,})$/i)?.at(1);window.open(`https://app.churnsolution.${t}/${e}`,"_blank")}function calculateMobileFeaturesHeight(){let e=document.querySelector(".chr-chr-mobile-link[data-toggle=products]"),t=e?.parentElement,a=[...t.querySelectorAll(".chr-chr-features-grid"),].reduce((e,t)=>e+t.getBoundingClientRect().height,0);t?.style.setProperty("--chr-grid-height",`${a}px`)}function overwriteMobileDocsLink(){let e=document.querySelector(".chr-chr-mobile-nav a[href^='/docs']");window.innerWidth>921?e?.setAttribute("href","/docs/install"):e?.setAttribute("href","/docs")}setTimeout(()=>{let[,e,t=""]=window.location.pathname.split("/"),a=t?`WP-${e}-${t}`:`WP-${e||"home"}`;document.addEventListener("click",function(e){let t=e.target.closest("[data-event-action]");if(!t)return;let r=t.getAttribute("data-event-action"),c=t.getAttribute("data-event-category"),l=t.getAttribute("data-event-label"),i=t.getAttribute("data-event-from")||a,n=t.getAttribute("data-event-value"),o={action:r,category:c,label:l,from:i};n&&(o.value=n),Array.from(t.attributes).forEach(e=>{if(e.name.startsWith("data-event-")&&!["data-event-action","data-event-category","data-event-label","data-event-from","data-event-value",].includes(e.name)){let t=e.name.replace("data-event-","");o[t]=e.value}}),window.sendEvent?.(o)})},500),document.addEventListener("click",e=>{let t=document.getElementById("mobileNav"),a=menuBtn.querySelector("svg");!e.target.closest(".chr-chr-header")&&t.classList.contains("chr-chr-active")&&(t.classList.remove("chr-chr-active"),a.innerHTML='<path d="M4 5h16 M4 12h16 M4 19h16" />')}),window.addEventListener("resize",()=>{let e=document.getElementById("mobileNav"),t=menuBtn.querySelector("svg"),a=document.getElementById("mobileBackdrop"),r=document.querySelectorAll("[data-toggle]"),c=document.querySelectorAll(".chr-chr-mobile-item[data-action]");window.innerWidth>1070?(e.classList.remove("chr-chr-active"),a.classList.remove("chr-chr-active"),t.innerHTML='<path d="M4 5h16 M4 12h16 M4 19h16" />',r.forEach(e=>{e.parentElement.classList.remove("chr-chr-expanded")})):calculateMobileFeaturesHeight(),window.innerWidth>480?c.forEach(e=>e.setAttribute("data-hidden","")):c.forEach(e=>e.removeAttribute("data-hidden")),overwriteMobileDocsLink()}),(()=>{let e=document.querySelector(".chr-chr-header"),t=document.getElementById("menuBtn"),a=document.getElementById("mobileNav"),r=t.querySelector("svg"),c=document.querySelectorAll("[data-toggle]"),l=d
1207ocument.getElementById("mobileBackdrop"),[,i,n=""]=window.location.pathname.split("/");if(["blog","docs"].includes(i)?e.setAttribute("data-variant","light"):["pricing","blog","calculator"].includes(i)&&e.setAttribute("data-variant","dark"),["blog","docs","calculator","how-it-works","integrations"].includes(i))document.querySelector(".chr-chr-nav-link[data-match='resources']")?.classList.add("chr-chr-active"),document.querySelector(`[data-match='${i}']`)?.classList.add("chr-chr-active");else{let o=document.querySelector(`.chr-chr-nav-link[data-match='${i}']`);o?.classList.add("chr-chr-active"),document.querySelectorAll(`[data-match='${n}'], .chr-chr-primary-product:has([data-match='${n}'])`).forEach(e=>e.classList.add("chr-chr-active"))}document.querySelector(".chr-chr-mobile-menu").addEventListener("click",e=>e.stopPropagation()),calculateMobileFeaturesHeight(),c.forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation(),e.parentElement.classList.toggle("chr-chr-expanded"),c.forEach(t=>{t.getAttribute("data-toggle")!==e.getAttribute("data-toggle")&&t.parentElement.classList.remove("chr-chr-expanded")})})});let h=()=>{let e=a.classList.toggle("chr-chr-active");l.classList.toggle("chr-chr-active"),r.innerHTML=e?'<path d="M18 6 6 18"/><path d="m6 6 12 12"/>':'<path d="M4 5h16 M4 12h16 M4 19h16" />',e||c.forEach(e=>{e.parentElement.classList.remove("chr-chr-expanded")})};t.addEventListener("click",h),l.addEventListener("click",h),overwriteMobileDocsLink()})();
1208</script>
1208<style id="uagb-style-conditional-extension">@media (min-width: 1025px){body .uag-hide-desktop.uagb-google-map__wrap,body .uag-hide-desktop{display:none !important}}@media (min-width: 768px) and (max-width: 1024px){body .uag-hide-tab.uagb-google-map__wrap,body .uag-hide-tab{display:none !important}}@media (max-width: 767px){body .uag-hide-mob.uagb-google-map__wrap,body .uag-hide-mob{display:none !important}}</style><style id="uagb-style-frontend-1821">.uag-blocks-common-selector{z-index:var(--z-index-desktop) !important}@media(max-width: 976px){.uag-blocks-common-selector{z-index:var(--z-index-tablet) !important}}@media(max-width: 767px){.uag-blocks-common-selector{z-index:var(--z-index-mobile) !important}}</style><link rel="icon" href="https://churnsolution.com/wp-content/uploads/2024/04/cropped-image-22-2-32x32.png" sizes="32x32" />
1209<link rel="icon" href="https://churnsolution.com/wp-content/uploads/2024/04/cropped-image-22-2-192x192.png" sizes="192x192" />
1210<link rel="apple-touch-icon" href="https://churnsolution.com/wp-content/uploads/2024/04/cropped-image-22-2-180x180.png" />
1211<meta name="msapplication-TileImage" content="https://churnsolution.com/wp-content/uploads/2024/04/cropped-image-22-2-270x270.png" />
1212<style id="wp-custom-css">
1213/* Center the CTA content inside the sidebar */
1214.single-post .chr-article-side-content .wp-block-essential-blocks-button {
1215    text-align: center !important;
1216}
1217
1218/* If the CTA block uses a normal link styled as a button */
1219.single-post .chr-article-side-content a.wp-element-button,
1220.single-post .chr-article-side-content .wp-element-button {
1221    margin-left: auto !important;
1222    margin-right: auto !important;
1223    display: inline-flex !important;
1224    align-items: center !important;
1225    justify-content: center !important;
1226}
1227
1228/* Related Articles - force old 3-column layout */
1229.chr-related-articles .eb-post-grid-wrapper.eb-post-grid-b0aeqrp .eb-post-grid-posts-wrapper,
1230.chr-related-articles .eb-post-grid-posts-wrapper {
1231    display: grid !important;
1232    grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
1233    gap: 32px !important;
1234    align-items: stretch !important;
1235}
1236
1237/* Card style */
1238.chr-related-articles .ebpg-grid-post-holder {
1239    height: 100% !important;
1240    border-radius: 14px !important;
1241    overflow: hidden !important;
1242}
1243
1244/* Image */
1245.chr-related-articles .ebpg-entry-thumbnail {
1246    margin: 0 0 16px 0 !important;
1247}
1248
1249.chr-related-articles .ebpg-entry-thumbnail img {
1250    width: 100% !important;
1251    height: 250px !important;
1252    object-fit: cover !important;
1253    border-radius: 12px !important;
1254    display: block !important;
1255}
1256
1257/* Title */
1258.chr-related-articles .ebpg-entry-title {
1259    margin: 0 0 8px 0 !important;
1260    font-size: 18px !important;
1261    line-height: 1.25 !important;
1262}
1263
1264.chr-related-articles .ebpg-entry-title a {
1265    font-size: 18px !important;
1266    font-weight: 700 !important;
1267    line-height: 1.25 !important;
1268    display: -webkit-box !important;
1269    -webkit-line-clamp: 1 !important;
1270    -webkit-box-orient: vertical !important;
1271    overflow: hidden !important;
1272}
1273
1274/* Excerpt */
1275.chr-related-articles .ebpg-grid-post-excerpt p {
1276    font-size: 15px !important;
1277    line-height: 1.5 !important;
1278    margin: 0 0 18px 0 !important;
1279    display: -webkit-box !important;
1280    -webkit-line-clamp: 2 !important;
1281    -webkit-box-orient: vertical !important;
1282    overflow: hidden !important;
1283}
1284
1285/* Author/date row */
1286.chr-related-articles .ebpg-header-meta,
1287.chr-related-articles .ebpg-footer-meta {
1288    display: flex !important;
1289    align-items: center !important;
1290    justify-content: flex-start !important;
1291    gap: 10px !important;
1292    margin-top: auto !important;
1293}
1294
1295.chr-related-articles .ebpg-entry-meta-items {
1296    display: flex !important;
1297    align-items: center !important;
1298    gap: 8px !important;
1299    flex-wrap: wrap !important;
1300}
1301
1302.chr-related-articles .ebpg-author-avatar img {
1303    width: 48px !important;
1304    height: 48px !important;
1305    border-radius: 50% !important;
1306    object-fit: cover !important;
1307}
1308
1309.chr-related-articles .ebpg-posted-by,
1310.chr-related-articles .ebpg-posted-by a,
1311.chr-related-articles .ebpg-posted-on {
1312    font-size: 13px !important;
1313}
1314
1315/* Tablet and mobile */
1316@media (max-width: 1024px) {
1317    .chr-related-articles .eb-post-grid-wrapper.eb-post-grid-b0aeqrp .eb-post-grid-posts-wrapper,
1318    .chr-related-articles .eb-post-grid-posts-wrapper {
1319        grid-template-columns: repeat(1, minmax(0, 1fr)) !important;
1320    }
1321}
1322</style>
1323	
1324	<!-- Google tag (gtag.js) -->
1325<!--
vendor: 64 bytes, line 1325
1325 <script async src="https://www.googletagmanager.com/gtag/js?id=
1325G-VZ7XSDM7FG
vendor: 13 bytes, lines 1325-1326
1325">
1326</script>
1327<script>
1328  
vendor: 134 bytes, lines 1328-1332
1328window.dataLayer = window.dataLayer || [];
1329  function gtag(){dataLayer.push(arguments);}
1330  gtag('js', new Date());
1331
1332  gtag('config', '
1332G-VZ7XSDM7FG
vendor: 4 bytes, line 1332
1332');
1333</script>
1333 -->
1334</head>
1335
1336<body itemtype='https://schema.org/WebPage' itemscope='itemscope' class="wp-singular page-template-default page page-id-1821 page-child parent-pageid-1803 wp-custom-logo wp-theme-astra wp-child-theme-astra-child ast-desktop ast-plain-container ast-no-sidebar astra-4.3.0 group-blog ast-single-post ast-inherit-site-logo-transparent ast-hfb-header ast-full-width-primary-header">
1337<!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 1337-1338
1337
1338<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
1338GTM-KFH8XXKN
vendor: 85 bytes, lines 1338-1339
1338"
1339height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
1340<!-- End Google Tag Manager (noscript) -->
1341<a
1342	class="skip-link screen-reader-text"
1343	href="#content"
1344	role="link"
1345	title="Skip to content">
1346		Skip to content</a>
1347
1348<div
1349class="hfeed site" id="page">
1350			<header
1351		class="site-header header-main-layout-1 ast-primary-menu-enabled ast-logo-title-inline ast-hide-custom-menu-mobile ast-builder-menu-toggle-icon ast-mobile-header-inline" id="masthead" itemtype="https://schema.org/WPHeader" itemscope="itemscope" itemid="#masthead"		>
1352			<div id="ast-desktop-header" data-toggle-type="dropdown">
1353	</div> <!-- Main Header Bar Wrap -->
1354<div id="ast-mobile-header" class="ast-mobile-header-wrap " data-type="dropdown">
1355	</div>
1356		</header><!-- #masthead -->
1357			<div id="content" class="site-content">
1358		<div class="ast-container">
1359		
1360
1361
1362	<div id="primary" class="content-area primary">
1363
1364		
1365					<main id="main" class="site-main">
1366				<article
1367class="post-1821 page type-page status-publish ast-article-single" id="post-1821" itemtype="https://schema.org/CreativeWork" itemscope="itemscope">
1368	
1369	
1370	<header class="entry-header ast-no-thumbnail ast-no-title ast-header-without-markup">
1371			</header> <!-- .entry-header -->
1372
1373
1374<div class="entry-content clear"
1375	ast-blocks-layout="true" itemprop="text">
1376
1377	
1378	
1379<div class="wp-block-group chr-docs-container alignfull is-layout-constrained wp-block-group-is-layout-constrained"><style>
1380.chr-docs-navigator-section a,.chr-docs-navigator-section-header{font-size:14px;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;text-align:left}.site-content{overflow:visible!important}.ast-above-header-wrap .ast-above-header.ast-above-header-bar,.ast-primary-header-bar.ast-primary-header{background-color:#fff!important;color:#0f124d!important;border-bottom:1px solid #dbdbe4!important}.ast-above-header.ast-above-header-bar *,.ast-primary-header-bar.ast-primary-header *{color:#0f124d!important}.ast-above-header.ast-above-header-bar .resources-menu-trigger:hover a,.ast-above-header.ast-above-header-bar a.menu-link:hover{color:#fff!important}#ast-mobile-header .mobile-free-trial,.ast-above-header.ast-above-header-bar .ast-custom-button{color:#fff!important;background-color:#0f124d!important}.ast-above-header.ast-above-header-bar .wp-block-button__link:hover{border-color:#0f124d}.chr-docs-container{display:flex;gap:0;padding:48px 0 0!important;position:relative}.chr-docs-navigator-container{background-color:#fff;max-height:calc(100vh - 72px);overflow-y:auto;position:sticky;top:72px;padding:8px 28px 24px;height:auto;border-right:1px solid #dbdbe4;width:306px;min-width:306px;margin-right:0!important;margin-left:0!important;margin-top:0!important}.chr-docs-navigator-section-container{position:sticky;top:108px}.chr-docs-navigator-section{margin-bottom:32px;display:flex;gap:0;flex-direction:column}.chr-docs-navigator-section-header{font-weight:500;color:#b5b6c8;margin-bottom:12px!important}.chr-docs-navigator-section a{text-decoration:none!important;font-weight:700;color:#0f124d;padding:12px 16px;border-radius:8px;display:flex;gap:0;align-items:center}.chr-docs-navigator-section a.chr-active-link,.chr-docs-navigator-section a:hover{background-color:#e7e7ed}.chr-docs-navigator-section a:focus{outline:0}.chr-docs-navigator-section a span{display:inline-block;margin-left:12px}@media (max-width:921px){.chr-docs-navigator-container{display:none}}@media (max-width:768px){.chr-docs-container{flex-direction:column-reverse}}
1381</style>
1382<div class="chr-docs-navigator-container alignleft">
1383    <div class="chr-docs-navigator-section-container">
1384        <div class="chr-docs-navigator-section">
1385            <p class="chr-docs-navigator-section-header">DEVELOPER GUIDE</p>
1386            <a href="/docs/install" style="margin-bottom: 8px;">
1387                <svg width="26" height="19" viewBox="0 0 26 19" fill="none" xmlns="http://www.w3.org/2000/svg">
1388                    <g clip-path="url(#rhke6pubsa)" fill="#0F124D">
1389                        <path d="M8.659 14.573 0 10.65V8.436l8.659-4.005v2.49L2.969 9.56l5.69 2.566v2.447zM10.876 18.27c-.086.23-.156.338-.312.338a.645.645 0 0 1-.224-.053l-1.215-.481c-.121-.053-.296-.144-.296-.305a.717.717 0 0 1 .089-.301L15.162.782c.103-.277.173-.374.348-.374.093.006.185.03.27.072l1.093.429c.121.053.294.125.294.321a.484.484 0 0 1-.052.213L10.876 18.27zM17.328 14.572v-2.46l5.712-2.567-5.712-2.624v-2.46l8.675 3.98v2.214l-8.675 3.917z"/>
1390                    </g>
1391                    <defs>
1392                        <clipPath id="rhke6pubsa">
1393                            <path fill="#fff" transform="translate(0 .4)" d="M0 0h2
13936v18.2H0z"/>
1394                        </clipPath>
1395                    </defs>
1396                </svg>
1397                <span>Installing Churn Solution</span>
1398            </a>
1399            <a href="/docs/subscription-walls" style="margin-bottom: 8px;">
1400                <svg width="26" height="26" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1401                    <path d="M12 9V11" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1402                    <path d="M16 3V9" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1403                    <path d="M21 9.118V5C21 4.46957 20.7893 3.96086 20.4142 3.58579C20.0391 3.21071 19.5304 3 19 3H5C4.46957 3 3.96086 3.21071 3.58579 3.58579C3.21071 3.96086 3 4.46957 3 5V19C3 19.5304 3.21071 20.0391 3.58579 20.4142C3.96086 20.7893 4.46957 21 5 21H10.75" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1404                    <path d="M3 15H10" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1405                    <path d="M3 9H16" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1406                    <path d="M8 15V21" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1407                    <path d="M8 3V9" stroke="#0F124D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1408                    <path d="M18 22C20.7614 22 23 19.7614 23 17C23 14.2386 20.7614 12 18 12C15.2386 12 13 14.2386 13 17C13 19.7614 15.2386 22 18 22Z" stroke="#0F124D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
1409                    <path d="M20 15H17C16.7348 15 16.4804 15.1054 16.2929 15.2929C16.1054 15.4804 16 15.7348 16 16C16 16.2652 16.1054 16.5196 16.2929 16.7071C16.4804 16.8946 16.7348 17 17 17H19C19.2652 17 19.5196 17.1054 19.7071 17.2929C19.8946 17.4804 20 17.7348 20 18C20 18.2652 19.8946 18.5196 19.7071 18.7071C19.5196 18.8946 19.2652 19 19 19H16" stroke="#0F124D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
1410                    <path d="M18 20V14" stroke="#0F124D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
1411                </svg>
1412                <span>Subscription Walls</span>
1413            </a>
1414            <a href="/docs/mcp-server" style="margin-bottom: 8px;">
1415                <svg width="26" height="26" xmlns="http://www.w3.org/2000/svg" fill="currentColor" fill-rule="evenodd" viewBox="0 0 24 24">
1416                    <path d="M15.688 2.343a2.588 2.588 0 00-3.61 0l-9.626 9.44a.863.863 0 01-1.203 0 .823.823 0 010-1.18l9.626-9.44a4.313 4.313 0 016.016 0 4.116 4.116 0 011.204 3.54 4.3 4.3 0 013.609 1.18l.05.05a4.115 4.115 0 010 5.9l-8.706 8.537a.274.274 0 000 .393l1.788 1.754a.823.823 0 010 1.18.863.863 0 01-1.203 0l-1.788-1.753a1.92 1.92 0 010-2.754l8.706-8.538a2.47 2.47 0 000-3.54l-.05-.049a2.588 2.588 0 00-3.607-.003l-7.172 7.034-.002.002-.098.097a.863.863 0 01-1.204 0 .823.823 0 010-1.18l7.273-7.133a2.47 2.47 0 00-.003-3.537z"/>
1417                    <path d="M14.485 4.703a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a4.115 4.115 0 000 5.9 4.314 4.314 0 006.016 0l7.12-6.982a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a2.588 2.588 0 01-3.61 0 2.47 2.47 0 010-3.54l7.12-6.982z"/>
1418                </svg>
1419                <span>MCP Server</span>
1420            </a>
1421            <a href="/docs/webhooks" style="margin-bottom: 8px;">
1422                <svg width="26" height="26" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1423                    <path fill-rule="evenodd" clip-rule="evenodd" d="M12.52 3.046a3 3 0 0 0-2.13 5.486 1 1 0 0 1 .306 1.38l-3.922 6.163a2 2 0 1 1-1.688-1.073l3.44-5.405a5 5 0 1 1 8.398-2.728 1 1 0 1 1-1.97-.348 3 3 0 0 0-2.433-3.475zM10 6a2 2 0 1 1 3.774.925l3.44 5.405a5 5 0 1 1-1.427 8.5 1 1 0 0 1 1.285-1.532 3 3 0 1 0 .317-4.83 1 1 0 0 1-1.38-.307l-3.923-6.163A2 2 0 0 1 10 6zm-5.428 6.9a1 1 0 0 1-.598 1.281A3 3 0 1 0 8.001 17a1 1 0 0 1 1-1h8.266a2 2 0 1 1 0 2H9.9a5 5 0 1 1-6.61-5.698 1 1 0 0 1 1.282.597Z" fill="currentColor"></path>
1424                </svg>
1425                <span>Webhooks</span>
1426            </a>
1427            <!-- <a href="/docs/payment-recovery" style="margin-bottom: 8px;">
1428                <svg
1429                    width="24"
1430                    height="24"
1431                    viewBox="0 0 48 48"
1432                    xmlns="http://www.w3.org/2000/svg"
1433                    fill="#0F124D"
1434                >
1435                    <path
1436                        d="M 28.5 20.25 C 28.5 18.179 26.4854 16.5 24 16.5 C 21.5146 16.5 19.5 18.179 19.5 20.25 C 19.5 22.321 21.5146 24 24 24 C 26.4854 24 28.5 25.679 28.5 27.75 C 28.5 29.821 26.4854 31.5 24 31.5 C 21.5146 31.5 19.5 29.821 19.5 27.75 M 24 31.5 V 32.25 V 33 M 24 15 V 15.75 V 16.5 M 28.5 20.25 C 28.5 18.179 26.4854 16.5 24 16.5 C 21.5146 16.5 19.5 18.179 19.5 20.25 C 19.5 22.321 21.5146 24 24 24 C 26.4854 24 28.5 25.679 28.5 27.75 C 28.5 29.821 26.4854 31.5 24 31.5 C 21.5146 31.5 19.5 29.821 19.5 27.75 M 24 31.5 V 32.25 V 33 M 24 15 V 15.75 V 16.5"
1437                        fill="none"
1438                        stroke="#0F124D"
1439                        stroke-width="3.5"
1440                        stroke-linecap="round"
1441                    ></path>
1442                    <path
1443                        d="M24,2A21.8,21.8,0,0,0,8,8.9V5A2,2,0,0,0,5.7,3,2.1,2.1,0,0,0,4,5.1V14a2,2,0,0,0,2,2h9a2,2,0,0,0,2-2.3A2.1,2.1,0,0,0,14.9,12H10.6A18,18,0,0,1,41.9,22.2a2,2,0,0,0,2,1.8h0a2,2,0,0,0,2-2.2A22,22,0,0,0,24,2Z"
1444                    ></path>
1445                    <path
1446                        d="M42,32H33a2,2,0,0,0-2,2.3A2.1,2.1,0,0,0,33.1,36h4.3A18,18,0,0,1,6.1,25.8a2,2,0,0,0-2-1.8h0a2,2,0,0,0-2,2.2A22,22,0,0,0,40,39.1V43a2,2,0,0,0,2.3,2A2.1,2.1,0,0,0,44,42.9V34A2,2,0,0,0,42,32Z"
1447                    ></path>
1448                </svg>
1449                <span>Failed Payment Recovery</span>
1450            </a> -->
1451            <a href="/docs/faqs">
1452                <svg width="26" height="21" viewBox="0 0 26 21" fill="none" xmlns="http://www.w3.org/2000/svg">
1453                    <g clip-path="url(#9njoh7gfza)" fill="#0F124D">
1454                        <path d="M25.415 9.037a7.343 7.343 0 0 0-1.657-2.394 7.462 7.462 0 0 0-2.466-1.575 7.544 7.544 0 0 0-5.762.118.73.73 0 0 0-.37.404.717.717 0 0 0 .02.545c.077.172.22.307.397.378.177.07.375.07.552-.002a6.052 6.052 0 0 1 4.24-.223 5.959 5.959 0 0 1 3.319 2.609 5.82 5.82 0 0 1 .723 4.124 5.88 5.88 0 0 1-2.238 3.557.727.727 0 0 0-.282.667l.115.911-.796-.596a.742.742 0 0 0-.687-.107 6.054 6.054 0 0 1-4.082-.053 5.95 5.95 0 0 1-3.095-2.627.745.745 0 0 0-.987-.251.717.717 0 0 0-.296.961 7.41 7.41 0 0 0 3.67 3.204c1.554.629 3.278.72 4.892.26l1.886 1.411a.743.743 0 0 0 .808.05.717.717 0 0 0 .362-.719l-.281-2.226a7.466 7.466 0 0 0 1.8-2.252 7.259 7.259 0 0 0 .214-6.165v-.009z"/>
1455                        <path d="M14.3 10.695a7.245 7.245 0 0 0-.726-7.013 7.412 7.412 0 0 0-2.78-2.392 7.53 7.53 0 0 0-7.145.24 7.391 7.391 0 0 0-2.61 2.572 7.253 7.253 0 0 0-.242 7.045 7.42 7.42 0 0 0 1.802 2.26l-.285 2.222a.717.717 0 0 0 .362.719.743.743 0 0 0 .812-.05l1.885-1.41a7.548 7.548 0 0 0 5.27-.427 7.394 7.394 0 0 0 3.657-3.766zM3.825 12.523a5.878 5.878 0 0 1-2.264-3.667 5.822 5.822 0 0 1 .861-4.208 5.97 5.97 0 0 1 3.53-2.514 6.05 6.05 0 0 1 4.322.515 5.914 5.914 0 0 1 2.82 3.272 5.814 5.814 0 0 1-.182 4.289 5.933 5.933 0 0 1-3.086 3.028 6.053 6.053 0 0 1-4.351.16.745.745 0 0 0-.687.107l-.796.596.116-.912a.716.716 0 0 0-.283-.666z"/>
1456                        <path d="M7.128 10.693c.675 0 1.331-.217 1.871-.617l.626.657a.338.338 0 0 0 .236.106.342.342 0 0 0 .243-.09.334.334 0 0 0 .016-.475l-.622-.653a3.063 3.063 0 0 0 .132-3.878 3.14 3.14 0 0 0-1.737-1.14 3.177 3.177 0 0 0-2.077.187c-.651.295-1.18.8-1.5 1.431a3.053 3.053 0 0 0-.256 2.042c.153.69.541 1.306 1.1 1.748a3.165 3.165 0 0 0 1.968.682zm0-5.37a2.32 2.32 0 0 1 1.23.348c.369.229.664.556.85.944a2.236 2.236 0 0 1-.297 2.406l-.478-.502a.33.33 0 0 0-.568.211c-.003.086.03.17.089.232l.474.5a2.317 2.317 0 0 1-2.06.284 2.303 2.303 0 0 1-.902-.565 2.235 2.235 0 0 1-.198-2.928 2.29 2.29 0 0 1 .819-.677c.323-.16.68-.242 1.041-.24v-.013zM16.58 14.62a.56.56 0 0 0 .43.012.549.549 0 0 0 .31-.289l.66-1.443h1.888l.659 1.443a.558.558 0 0 0 .511.326.556.556 0 0 0 .522-.356.546.546 0 0 0-.012-.422l-2.109-4.63a.553.553 0 0 0-.51-.325.564.564 0 0 0-.509.324l-2.108 4.631a.545.545 0 0 0-.014.423.56.56 0 0 0 .283.306zm1.758-2.52.58-1.268.58 1.268h-1.16z"/>
1457                    </g>
1458                    <defs>
1459                        <clipPath id="9njoh7gfza">
1460                            <path fill="#fff" transform="translate(0 .5)" d="M0 0h2
14606v20H0z"/>
1461                        </clipPath>
1462                    </defs>
1463                </svg>
1464                <span>FAQs</span>
1465            </a>
1466        </div>
1467        <div class="chr-docs-navigator-section">
1468            <p class="chr-docs-navigator-section-header">INTEGRATION</p>
1469            <a href="/docs/integrations/stripe/">
1470                <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
1471                    <g clip-path="url(#0hn7r8q5ua)">
1472                        <path d="M13 26c7.18 0 13-5.82 13-13S20.18 0 13 0 0 5.82 0 13s5.82 13 13 13z" fill="#635BFF"/>
1473                        <path d="M22.685 13.134c0-1.377-.667-2.464-1.942-2.464s-2.056 1.087-2.056 2.454c0 1.62.915 2.437 2.227 2.437.64 0 1.125-.143 1.49-.35v-1.077a2.86 2.86 0 0 1-1.317.296c-.52 0-.985-.183-1.044-.818h2.633c-.002-.069.009-.348.009-.478zm-2.658-.51c0-.609.372-.862.71-.862.329 0 .679.25.679.862h-1.389zM16.61 10.67c-.392-.001-.77.15-1.054.42l-.07-.332H14.3v6.272l1.345-.285.005-1.523c.195.14.479.339.953.339.963 0 1.84-.774 1.84-2.48-.004-1.56-.892-2.411-1.833-2.411zm-.323 3.707c-.317 0-.506-.113-.635-.251l-.005-1.996c.14-.156.333-.264.64-.264.49 0 .829.549.829 1.254 0 .72-.334 1.257-.829 1.257zm-3.835-4.024 1.35-.29V8.97l-1.35.285v1.098zm0 .409h1.35v4.708h-1.351l.001-4.708zm-1.447.398-.087-.398H9.755v4.708H11.1v-3.191c.318-.415.856-.34 1.022-.28v-1.237c-.171-.065-.801-.183-1.118.398zm-2.69-1.566-1.312.281-.005 4.31c0 .796.597 1.383 1.393 1.383.441 0 .764-.08.943-.178v-1.093c-.172.07-1.023.317-1.023-.479v-1.91h1.023v-1.146H8.31l.004-1.168zM4.676 12.13c0-.21.172-.29.457-.29.465.01.922.127 1.333.343v-1.265a3.544 3.544 0 0 0-1.332-.247c-1.092 0-1.82.57-1.82 1.523 0 1.485 2.045 1.248 2.045 1.888 0 .248-.216.329-.517.329-.446 0-1.017-.183-1.469-.431v1.28c.464.201.963.306 1.468.309 1.12 0 1.889-.553 1.889-1.518-.006-1.603-2.056-1.318-2.056-1.92h.002z"
1474                              fill="#fff"/>
1475                    </g>
1476                    <defs>
1477                        <clipPath id="0hn7r8q5ua">
1478                            <path fill="#fff" d="M0 0h26v26H0z"/>
1479                        </clipPath>
1480                    </defs>
1481                </svg>
1482                <span>Stripe</span>
1483            </a>
1484            <a href="/docs/integrations/braintree/" style="margin-top: 8px">
1485                <svg xmlns="http://www.w3.org/2000/svg"
1486                     width="26" height="26" viewBox="0 0 129.000000 129.000000" preserveAspectRatio="xMidYMid meet">
1487                    <g transform="translate(0.000000,129.000000) scale(0.100000,-0.100000)"
1488                       fill="#000000" stroke="none">
1489                        <path d="M510 1254 c-111 -23 -224 -86 -311 -173 -335 -336 -203 -897 248
1490-1056 59 -21 86 -25 201 -25 108 0 144 4 195 21 197 65 358 227 418 419 11 36
149123 106 26 155 24 421 -362 749 -777 659z m270 -294 c90 -33 139 -108 126 -192
1492-8 -48 -45 -103 -77 -113 -19 -6 -15 -10 27 -35 63 -36 88 -79 87 -147 0 -66
1493-30 -114 -91 -151 -47 -27 -47 -27 -274 -30 l-228 -3 0 50 0 51 40 0 40 0 0
1494239 0 240 -37 3 c-36 3 -38 5 -41 42 -6 71 -14 69 201 64 118 -3 205 -10 227
1495-18z"/>
1496                        <path d="M540 780 l0 -90 90 0 c132 0 182 34 164 112 -10 50 -54 68 -161 68
1497l-93 0 0 -90z"/>
1498                        <path d="M547 583 c-4 -3 -7 -48 -7 -100 l0 -93 100 0 c147 0 190 23 190 103
14990 40 -30 73 -81 87 -38 11 -192 14 -202 3z"/>
1500                    </g>
1501                </svg>
1502                <span>BrainTree</span>
1503            </a>
1504            <a href="/docs/integrations/recurpay" style="margin-top: 8px">
1505                <img decoding="async" src="https://churnsolution.com/wp-content/uploads/2025/04/recurpay-logo.png" alt="recurpay" width="26"
1506                     height="26" style="margin: 0; border-radius: 100%;">
1507                <span>Recurpay</span>
1508            </a>
1509            <a href="/docs/integrations/slack" style="margin-top: 8px">
1510                <img decoding="async" src="https://churnsolution.com/wp-content/uploads/2024/04/slack-logo.png" alt="slack" width="26"
1511                     height="26" style="margin: 0;">
1512                <span>Slack</span>
1513            </a>
1514            <a href="/docs/integrations/wordpress/" style="margin-top: 8px">
1515                <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="26" height="26"
1516                     xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 122.88 122.88"
1517                     style="enable-background:new 0 0 122.88 122.88" xml:space="preserve"><style type="text/css">.st0 {
1518                    fill: #32373C;
1519                }</style>
1520                    <g><path class="st0" d="M61.44,0C27.51,0,0,27.51,0,61.44c0,33.93,27.51,61.44,61.44,61.44c33.93,0,61.44-27.51,61.44-61.44 C122.88,27.51,95.37,0,61.44,0L61.44,0z M106.37,36.88c0.22,1.63,0.34,3.38,0.34,5.26c0,5.19-0.97,11.03-3.89,18.34l-15.64,45.21 c15.22-8.87,25.46-25.37,25.46-44.25C112.64,52.54,110.37,44.17,106.37,36.88L106.37,36.88z M62.34,65.92l-15.36,44.64 c4.59,1.35,9.44,2.09,14.46,2.09c5.96,0,11.68-1.03,17-2.9c-0.14-0.22-0.26-0.45-0.37-0.71L62.34,65.92L62.34,65.92z M96,58.86 c0-6.33-2.27-10.71-4.22-14.12c-2.6-4.22-5.03-7.79-5.03-12.01c0-4.71,3.57-9.09,8.6-9.09c0.23,0,0.44,0.03,0.66,0.04 c-9.11-8.35-21.25-13.44-34.57-13.44c-17.89,0-33.62,9.18-42.78,23.08c1.2,0.04,2.33,0.06,3.3,0.06c5.35,0,13.65-0.65,13.65-0.65 c2.76-0.16,3.08,3.89,0.33,4.22c0,0-2.77,0.32-5.86,0.49l18.64,55.46l11.21-33.6l-7.98-21.86c-2.76-0.16-5.37-0.49-5.37-0.49 c-2.76-0.16-2.44-4.38,0.32-4.22c0,0,8.45,0.65,13.48,0.65c5.35,0,13.65-0.65,13.65-0.65c2.76-0.16,3.08,3.89,0.33,4.22 c0,0-2.78,0.32-5.86,0.49L87,92.47l5.28-16.74C94.63,68.42,96,63.24,96,58.86L96,58.86z M10.24,61.44 c0,20.27,11.78,37.78,28.86,46.08L14.67,40.6C11.83,46.97,10.24,54.01,10.24,61.44L10.24,61.44z M61.44,3.69 c7.8,0,15.36,1.53,22.48,4.54c3.42,1.45,6.72,3.24,9.81,5.32c3.06,2.07,5.94,4.44,8.55,7.05c2.61,2.61,4.99,5.49,7.05,8.55 c2.09,3.09,3.88,6.39,5.32,9.81c3.01,7.12,4.54,14.68,4.54,22.48c0,7.8-1.53,15.36-4.54,22.48c-1.45,3.42-3.24,6.72-5.32,9.81 c-2.07,3.06-4.44,5.94-7.05,8.55c-2.61,2.61-5.49,4.99-8.55,7.05c-3.09,2.09-6.39,3.88-9.81,5.32c-7.12,3.01-14.68,4.54-22.48,4.54 c-7.8,0-15.36-1.53-22.48-4.54c-3.42-1.45-6.72-3.24-9.81-5.32c-3.06-2.07-5.94-4.44-8.55-7.05c-2.61-2.61-4.99-5.49-7.05-8.55 c-2.09-3.09-3.88-6.39-5.32-9.81C5.21,76.8,3.69,69.24,3.69,61.44c0-7.8,1.53-15.36,4.54-22.48c1.45-3.42,3.24-6.72,5.32-9.81 c2.07-3.06,4.44-5.94,7.05-8.55c2.61-2.61,5.49-4.99,8.55-7.05c3.09-2.09,6.39-3.88,9.81-5.32C46.08,5.21,53.64,3.69,61.44,3.69 L61.44,3.69z"/></g>
1521                    </svg>
1522                <span>WordPress</span>
1523            </a>
1524            <a href="/docs/integrations/wordpress/paid-memberships-pro/" style="margin-top: 8px">
1525                <img decoding="async" height="26" width="26" style="margin: 0"
1526                     src="https://churnsolution.com/wp-content/uploads/2024/06/pmpro.png"
1527                     alt="PMPRO">
1528                <span>Paid Memberships Pro</span>
1529            </a>
1530            <a href="/docs/integrations/wordpress/woocommerce/" style="margin-top: 8px">
1531                <img loading="lazy" decoding="async" height="26" width="26" style="margin: 0; border-radius: 100%;"
1532                     src="https://churnsolution.com/wp-content/uploads/2025/06/woocommerce-logo.png"
1533                     alt="WooCommerce">
1534                <span>WooCommerce</span>
1535            </a>
1536            <a href="/docs/integrations/paddle/" style="margin-top: 8px">
1537                <img loading="lazy" decoding="async" height="26" width="26" style="margin: 0; border-radius: 100%;"
1538                     src="https://churnsolution.com/wp-content/uploads/2026/09/paddle-logo.jpeg"
1539                     alt="Paddle">
1540                <span>Paddle</span>
1541            </a>
1542            <a href="/docs/integrations/hubspot/" style="margin-top: 8px">
1543                <img loading="lazy" decoding="async" height="26" width="26" style="margin: 0; object-fit: contain;"
1544                     src="https://churnsolution.com/wp-content/uploads/2026/09/hubspot-logo.png"
1545                     alt="HubSpot">
1546                <span>HubSpot</span>
1547            </a>
1548            <a href="/docs/integrations/omnisend/" style="margin-top: 8px">
1549                <img loading="lazy" decoding="async" height="26" width="26" style="margin: 0; border-radius: 100%;"
1550                     src="https://churnsolution.com/wp-content/uploads/2026/09/omnisend-logo.png"
1551                     alt="Omnisend">
1552                <span>Omnisend</span>
1553            </a>
1554            <a href="/docs/integrations/zapier/" style="margin-top: 8px">
1555                <img loading="lazy" decoding="async" height="26" width="26" style="margin: 0; object-fit: contain;"
1556                     src="https://churnsolution.com/wp-content/uploads/2026/09/zapier-logo.png"
1557                     alt="Zapier">
1558                <span>Zapier</span>
1559            </a>
1560        </div>
1561    </div>
1562</div>
1563<script>
1564$(function(){$(".chr-docs-navigator-section-container a").each(function(a,c){location.pathname.replace(/\/$/g,"")===$(c).attr("href")&&$(c).addClass("chr-active-link")})});
1565</script>
1565
1566
1567
1568<style>
1569.chr-docs-content h1,.chr-docs-content h2,.chr-docs-content h6{font-stretch:normal!important;font-style:normal!important;line-height:normal!important;letter-spacing:normal!important;text-align:left!important}.alert{padding:0;background-color:#f44336;color:#fff;opacity:0;transition:opacity .6s;margin-bottom:15px;right:16px;top:124px;position:fixed;overflow:hidden;height:0;border-radius:12px;z-index:2}.alert.show{height:auto;opacity:1;padding:12px 16px}.alert.success{background-color:#04aa6d}.chr-docs-content-container{display:flex;color:#0f124d!important;width:100%;overflow:auto}.chr-docs-content{padding:29px 32px;overflow:auto}.chr-docs-content a:focus,.chr-docs-table-of-contents .chr-docs-table-content a:focus{border:none!important;outline:0!important}.chr-docs-content h1::before,.chr-docs-content h2::before,.chr-docs-content h3::before{content:"";display:block;height:132px;margin:-132px 0 0}.chr-docs-content h1{font-size:24px!important;font-weight:600!important;color:#0f124d!important;margin-bottom:16px!important}.chr-docs-content h6{font-size:16px!important;font-weight:400!important;color:#0f124d!important;margin-bottom:24px}.chr-docs-content h2{font-size:20px!important;font-weight:700!important;color:#0f124d!important;margin-bottom:16px}.chr-docs-content .chr-info,.chr-docs-content h3{font-stretch:normal;font-style:normal;color:#0f124d}.chr-docs-content h3{font-size:16px;font-weight:700;line-height:normal;letter-spacing:normal;text-align:left}.chr-docs-content li,.chr-docs-content p{font-size:14px!important;font-weight:400!important;font-stretch:normal!important;font-style:normal!important;line-height:1.5!important;letter-spacing:normal!important;text-align:left!important;color:#0f124d!important;margin:16px auto}.chr-docs-content img{margin:0 auto 39px;display:block}.chr-docs-content .chr-info{display:flex;flex-direction:row;justify-content:flex-start;align-items:start;gap:0;padding:12px 16px;border-radius:8px;border:1px solid #e6f0f3;background-color:#f7fafb;font-size:14px;font-weight:400;line-height:1.5;letter-spacing:normal;text-align:left}.chr-docs-content .chr-code,.chr-docs-table-of-contents .chr-table-header{font-size:16px;font-weight:500;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;text-align:left}.chr-docs-content .chr-info svg{margin-right:8px;min-width:20px}.chr-docs-content .chr-info div{margin:auto 0}.chr-docs-content a{color:#d6aa20;text-decoration:none!important}.chr-docs-content a:hover{text-decoration:underline!important}.chr-docs-content .chr-code{flex-direction:column;justify-content:center;align-items:flex-end;padding:8px 8px 8px 32px;border-radius:12px;border:1px solid #e6f0f3;background-color:#f7fafb;color:#484848;position:relative}.chr-docs-content .chr-code pre{background-color:transparent!important;padding:0!important;margin:0!important}.chr-docs-content .chr-code .chr-copy-code{position:absolute;top:8px;right:20px;cursor:pointer}.chr-docs-content .chr-docs-sub-section{margin-bottom:24px}code.highlighted{background:#f7fafb;padding:1px 4px;border-radius:4px;border:1px solid #e6f0f3;color:#905}.chr-docs-content .chr-docs-table-wrapper{overflow-x:auto;margin:16px 0;border-radius:12px;border:1px solid #e6f0f3}.chr-docs-content table.chr-docs-table{width:100%;border-collapse:collapse;font-size:14px;text-align:left;color:#0f124d;margin:0}.chr-docs-content table.chr-docs-table td,.chr-docs-content table.chr-docs-table th{padding:12px 16px;border-bottom:1px solid #e6f0f3;vertical-align:top;text-align:left}.chr-docs-content table.chr-docs-table thead th{background-color:#f7fafb;font-weight:600;white-space:nowrap}.chr-docs-content table.chr-docs-table tbody tr:last-child td{border-bottom:none}.chr-docs-content table.chr-docs-table td code{font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;white-space:nowrap}.chr-docs-content table.chr-docs-table.chr-docs-table-wrap td code{white-space:normal}.chr-docs-content .chr-video-embed-wrapper{display:flex;align-items:center;justify-content:center;margin-top:16px}.chr-docs-content .chr-video-embed{width:100%;max-width:876px;aspect-ratio:16/9;border-radius:12px}.chr-docs-table-of-contents{padding-top:32px;min-width:235px;width:235px;position:relative;margin-top:0!important;margin-right:32px!important;margin-left:0!important}.chr-table-contents-container{position:sticky;top:108px;margin-bottom:64px}.chr-docs-table-of-contents .chr-table-header{color:#0f124d;margin-bottom:16px}.chr-docs-table-of-contents .chr-docs-table-content{display:flex;flex-direction:column;justify-content:start;align-items:start;padding:0 8px;border-radius:8px;border:1px solid #9d9d9d;background-color:#fff;color:#0f124d;margin-bottom:64px}.chr-docs-table-of-contents .chr-docs-table-content div{display:flex;flex-direction:column;justify-content:start;align-items:start}.chr-docs-table-of-contents .chr-docs-table-content a{color:#0f124d;margin:8px 0;font-weight:400!important;transition:none;text-decoration:none!important}.chr-docs-table-of-contents .chr-docs-table-content a:hover{font-weight:500!important}.chr-docs-table-of-contents .chr-docs-table-content a.active{font-weight:700!important;outline:0!important}.chr-docs-table-of-contents .chr-docs-table-content .chr-main-section.active{position:relative;
1569left:-8px;padding-left:8px;border-left:1px solid #0f124d!important}.chr-docs-table-of-contents .chr-docs-table-content hr{border-color:#9d9d9d;width:100%;margin:8px 0}.chr-docs-table-of-contents .chr-docs-table-content .chr-main-section{font-size:14px}.chr-docs-table-of-contents .chr-docs-table-content .chr-sub-section{font-size:12px;padding-left:8px}.chr-docs-table-of-contents .chr-docs-table-content .chr-sub-sub-section{font-size:12px;padding-left:16px}.chr-docs-back{color:#0f124d!important;display:none;margin-bottom:8px;font-size:12px}a.chr-docs-back:hover{text-decoration:none!important}@media (max-width:921px){.chr-docs-back{display:inline-block}}@media (max-width:768px){.chr-docs-content{padding:16px 32px}.chr-docs-table-of-contents{display:none;margin-right:32px!important;margin-left:32px!important}.chr-docs-table-content{margin-bottom:0!important}.chr-docs-content .chr-code{font-size:12px;padding:16px 8px 8px}.chr-docs-content .chr-info,.chr-docs-content h4,.chr-docs-content li,.chr-docs-content p,.chr-docs-content table.chr-docs-table{font-size:12px!important}.chr-docs-content table.chr-docs-table td,.chr-docs-content table.chr-docs-table th{padding:8px 12px}.chr-docs-content h1,.chr-docs-content h2{font-size:16px!important}.chr-docs-content h3{font-size:14px!important}}@media (max-width:480px){button{width:100%}}
1570</style>
1571<div id="chr_alert" class="alert success">
1572  <strong>Success!</strong> Link copied successfully
1573</div>
1574<div class="chr-docs-content-container">
1575  <div class="chr-docs-content">
1576    <a href="/docs" class="chr-docs-back">
1577      <svg
1578        style="rotate: 180deg"
1579        width="12"
1580        height="10.5"
1581        viewBox="0 0 17 15"
1582        fill="none"
1583        xmlns="http://www.w3.org/2000/svg"
1584      >
1585        <path
1586          fill-rule="evenodd"
1587          clip-rule="evenodd"
1588          d="M1.717 6.629a1 1 0 1 0 0 2h11.586L9.009 12.92a1.001 1.001 0 0 0 1.416 1.416l6-6a1 1 0 0 0 0-1.416l-6-6a1.001 1.001 0 0 0-1.416 1.416l4.294 					4.292H1.717z"
1589          fill="#0f124d"
1590        />
1591      </svg>
1592      Back
1593    </a>
1594    <h1 id="chr-3-steps">2 Simple Steps to Get Started</h1>
1595    <div class="chr-info" style="margin-bottom: 24px">
1596      <svg
1597        width="21"
1598        height="23"
1599        viewBox="0 0 21 23"
1600        fill="none"
1601        xmlns="http://www.w3.org/2000/svg"
1602      >
1603        <g clip-path="url(#ujqm33ofja)" fill="#0F124D">
1604          <path
1605            d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z"
1606          />
1607          <path
1608            d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z"
1609          />
1610        </g>
1611        <defs>
1612          <clipPath id="ujqm33ofja">
1613            <path fill="#fff" d="M0 0h21v23H0z" />
1614          </clipPath>
1615        </defs>
1616      </svg>
1617
1618      <div>
1619        How to integrate the cancellation flow with your application or service:
1620      </div>
1621    </div>
1622    <div id="chr-insert-embed" class="chr-docs-sub-section">
1623      <h2>Step 1: Place the embed code and launch snippet</h2>
1624      <p>
1625        Copy the code below. Paste it before the closing &lt;/body&gt; tag in
1626        your app code. It loads Churn Solution, makes it available in the global
1627        JS namespace as <b>window.churnSolution</b>, and launches the
1628        cancellation flow from your cancel button.
1629      </p>
1630      <div class="chr-code">
1631        <div
1632          class="chr-copy-code"
1633          onclick="copyLink('chr-code-insert-script-1')"
1634        >
1635          <img loading="lazy" decoding="async"
1636            id="chr-code-insert-script-1-img"
1637            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
1638            width="20"
1639            height="23"
1640            alt=""
1641          />
1642        </div>
1643        <pre><code class="language-javascript" id="chr-code-insert-script-1">
1644&lt;script&gt;
1645    !function(){
1646        if (!window.churnSolution || !window.churnSolution.ready) {
1647            window.churnSolution = { ready: true };
1648            const s = document.createElement('script');
1649            s.src = 'https://app.churnsolution.com/sdk/index.min.js';
1650            s.async = true;
1651            const e = document.getElementsByTagName('script')[0];
1652            e.parentNode.insertBefore(s, e);
1653        }
1654    }();
1655
1656    document.addEventListener('DOMContentLoaded', () => {
1657        document.getElementById('cancel-button').addEventListener('click', function (e) {
1658            e.preventDefault();
1659            window.churnSolution?.run({
1660                subscriptionId, // your subscription ID from your payment provider
1661                appId: 'APP_ID', // your App ID
1662            });
1663        });
1664    });
1665&lt;/script&gt;
1666            </code></pre>
1667      </div>
1668      <p>
1669        The loader on its own can also go in the &lt;head&gt; section of your
1670        HTML, as long as the launch snippet still runs after your cancel button
1671        exists:
1672      </p>
1673      <div class="chr-code">
1674        <div
1675          class="chr-copy-code"
1676          onclick="copyLink('chr-code-insert-script-2')"
1677        >
1678          <img loading="lazy" decoding="async"
1679            id="chr-code-insert-script-2-img"
1680            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
1681            width="20"
1682            height="23"
1683            alt=""
1684          />
1685        </div>
1686        <pre><code class="language-javascript" id="chr-code-insert-script-2">
1687&lt;script src="https://app.churnsolution.com/sdk/index.min.js"&gt;&lt;/script&gt;
1688            </code></pre>
1689      </div>
1690      <div class="chr-info" style="margin-top: 16px">
1691        <svg
1692          width="21"
1693          height="23"
1694          viewBox="0 0 21 23"
1695          fill="none"
1696          xmlns="http://www.w3.org/2000/svg"
1697        >
1698          <g clip-path="url(#ujqm33ofja)" fill="#0F124D">
1699            <path
1700              d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z"
1701            />
1702            <path
1703              d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z"
1704            />
1705          </g>
1706          <defs>
1707            <clipPath id="ujqm33ofja">
1708              <path fill="#fff" d="M0 0h21v23H0z" />
1709            </clipPath>
1710          </defs>
1711        </svg>
1712
1713        <div>
1714          You can find your <b>APP_ID</b> in the
1715          <a
1716            target="_blank"
1717            href="https://app.churnsolution.com/settings/network"
1718            rel="noopener"
1719            >Integration page</a
1720          >, after connecting your payment provider.
1721        </div>
1722      </div>
1723    </div>
1724    <div id="chr-generate-hash" class="chr-docs-sub-section">
1725      <h2>
1726        Step 2: Generate Security Token<span class="chr-step-optional"
1727          >Optional</span
1728        >
1729      </h2>
1730      <p>
1731        Use the code below to generate a hash on your server, so that every
1732        request sent to Churn Solution is secure. Send the generated hash to
1733        your front end and pass it as <b>authKey</b> in the launch call. Below
1734        are some examples of how this hash can be generated in different backend
1735        languages and frameworks.
1736      </p>
1737      <div class="chr-info">
1738        <svg
1739          width="21"
1740          height="23"
1741          viewBox="0 0 21 23"
1742          fill="none"
1743          xmlns="http://www.w3.org/2000/svg"
1744        >
1745          <g clip-path="url(#ujqm33ofja)" fill="#0F124D">
1746            <path
1747              d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z"
1748            />
1749            <path
1750              d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z"
1751            />
1752          </g>
1753          <defs>
1754            <clipPath id="ujqm33ofja">
1755              <path fill="#fff" d="M0 0h21v23H0z" />
1756            </clipPath>
1757          </defs>
1758        </svg>
1759
1760        <div>
1761          You can find your <b>secret key</b>
1762          <a
1763            target="_blank"
1764            href="https://app.churnsolution.com/settings"
1765            rel="noopener"
1766            >in the Account settings page</a
1767          >. Keep it on your server — never ship it to the browser.
1768        </div>
1769      </div>
1770      <div data-chr-auth-panel></div>
1771      <h3 style="margin-top: 24px">Update: Launch Churn Solution</h3>
1772      <p>
1773        Once your endpoint returns an auth key, pass it to the launch call you
1774        added in step 1:
1775      </p>
1776      <div class="chr-launch-diff">
1777        <div class="chr-launch-diff-side">
1778          <p class="chr-launch-diff-label">Before</p>
1779          <div class="chr-code">
1780            <div
1781              class="chr-copy-code"
1782              onclick="copyLink('chr-generate-hash-before')"
1783            >
1784              <img loading="lazy" decoding="async"
1785                id="chr-generate-hash-before-img"
1786                src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
1787                width="20"
1788                height="23"
1789                alt=""
1790              />
1791            </div>
1792            <pre><code class="language-javascript" id="chr-generate-hash-before">
1793window.churnSolution?.run({
1794    subscriptionId,
1795    appId: 'APP_ID',
1796});
1797            </code></pre>
1798          </div>
1799        </div>
1800        <div class="chr-launch-diff-arrow">&#8594;</div>
1801        <div class="chr-launch-diff-side">
1802          <p class="chr-launch-diff-label">After</p>
1803          <div class="chr-code">
1804            <div
1805              class="chr-copy-code"
1806              onclick="copyLink('chr-generate-hash-after')"
1807            >
1808              <img loading="lazy" decoding="async"
1809                id="chr-generate-hash-after-img"
1810                src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
1811                width="20"
1812                height="23"
1813                alt=""
1814              />
1815            </div>
1816            <pre><code class="language-javascript" id="chr-generate-hash-after">
1817window.churnSolution?.run({
1818    authKey, // hash generated by your server
1819    subscriptionId,
1820    appId: 'APP_ID',
1821});
1822            </code></pre>
1823          </div>
1824        </div>
1825      </div>
1826    </div>
1827    <h1
1828      id="chr-config-options"
1829      style="margin-top: 32px; margin-bottom: 24px !important"
1830    >
1831      Configuration Options
1832    </h1>
1833    <div id="chr-sdk-options" class="chr-docs-sub-section">
1834      <h2>SDK Options</h2>
1835      <p>
1836        Everything below goes in the <code class="highlighted">options</code>
1837        object of the launch call.
1838      </p>
1839      <div class="chr-docs-table-wrapper">
1840        <table class="chr-docs-table chr-docs-table-wrap">
1841          <thead>
1842            <tr>
1843              <th>Option</th>
1844              <th>Description</th>
1845              <th>Example</th>
1846            </tr>
1847          </thead>
1848          <tbody>
1849            <tr>
1850              <td><code class="highlighted">options.record</code></td>
1851              <td>
1852                Records the session. On by default. See
1853                <a href="#chr-session-recording">Session Recording</a>
1854              </td>
1855              <td><code class="highlighted">record: false</code></td>
1856            </tr>
1857            <tr>
1858              <td><code class="highlighted">options.email</code></td>
1859              <td>Email of the customer who started the flow</td>
1860              <td><code class="highlighted">email: '<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c7ada6a9a287a2bfa6aab7aba2e9a4a8aa">[email&#160;protected]</a>'</code></td>
1861            </tr>
1862            <tr>
1863              <td><code class="highlighted">options.font</code></td>
1864              <td>
1865                Font for the flow, overriding the design page. See
1866                <a href="#chr-session-font">Add Custom Fonts</a>
1867              </td>
1868              <td><code class="highlighted">font: 'Roboto'</code></td>
1869            </tr>
1870            <tr>
1871              <td><code class="highlighted">options.fontUrl</code></td>
1872              <td>Stylesheet URL that loads <code>font</code></td>
1873              <td>
1874                <code class="highlighted"
1875                  >fontUrl: 'https://fonts.googleapis.com/css2?family=Roboto'</code
1876                >
1877              </td>
1878            </tr>
1879            <tr>
1880              <td><code class="highlighted">options.customerAttributes</code></td>
1881              <td>
1882                Values for the custom attributes your audiences segment on. See
1883                <a href="#chr-customer-attributes">Custom Attributes</a>
1884              </td>
1885              <td>
1886                <code class="highlighted"
1887                  >customerAttributes: { Has_Extended_Free_Trial: true }</code
1888                >
1889              </td>
1890            </tr>
1891            <tr>
1892              <td><code class="highlighted">options.customTexts</code></td>
1893              <td>
1894                Replaces default texts in the flow. See
1895                <a href="#chr-custom-texts">Custom Texts</a>
1896              </td>
1897              <td>
1898                <code class="highlighted">customTexts: { 'Back': 'Retour' }</code>
1899              </td>
1900            </tr>
1901            <tr>
1902              <td><code class="highlighted">options.language</code></td>
1903              <td>
1904                Forces the flow language, taking priority over every other
1905                language source
1906              </td>
1907              <td><code class="highlighted">language: 'de'</code></td>
1908            </tr>
1909            <tr>
1910              <td><code class="highlighted">options.cancellationSettings</code></td>
1911              <td>
1912                Overrides the saved cancellation term for this session only. See
1913                <a href="#chr-cancellation-settings">Set Cancellation Term</a>
1914              </td>
1915              <td>
1916                <code class="highlighted"
1917                  >cancellationSettings: { settings: { CANCEL_TIME: {
1918                  cancellation_time_type: 'IMMEDIATE' } } }</code
1919                >
1920              </td>
1921            </tr>
1922            <tr>
1923              <td><code class="highlighted">options.pauseSettings</code></td>
1924              <td>
1925                Sets the earliest date a customer can pick to resume a pause:
1926                the day after <code>nextPaymentDate</code>
1927              </td>
1928              <td>
1929                <code class="highlighted"
1930                  >pauseSettings: { nextPaymentDate: '2026-10-15' }</code
1931                >
1932              </td>
1933            </tr>
1934            <tr>
1935              <td><code class="highlighted">options.handleCancel</code></td>
1936              <td>Called when the customer cancels</td>
1937              <td>Takes <code>(customer, cancelFlowInfo)</code></td>
1938            </tr>
1939            <tr>
1940              <td><code class="highlighted">options.handleAbandon</code></td>
1941              <td>Called when the customer leaves the flow before finishing it</td>
1942              <td>Takes <code>(customer, cancelFlowInfo)</code></td>
1943            </tr>
1944            <tr>
1945              <td><code class="highlighted">options.handleDone</code></td>
1946              <td>Called when the customer closes the success screen</td>
1947              <td>Takes <code>(customer, cancelFlowInfo)</code></td>
1948            </tr>
1949            <tr>
1950              <td><code class="highlighted">options.handleClose</code></td>
1951              <td>Called whenever the modal closes, for any reason</td>
1952              <td>Takes <code>(customer, cancelFlowInfo)</code></td>
1953            </tr>
1954            <tr>
1955              <td><code class="highlighted">options.handlePause</code></td>
1956              <td>Custom pause logic callback</td>
1957              <td>Takes <code>
1957({ pausePeriod }, customer, cancelFlowInfo)</code></td>
1958            </tr>
1959            <tr>
1960              <td><code class="highlighted">options.handleCoupon</code></td>
1961              <td>Custom coupon logic callback</td>
1962              <td>Takes <code>({ code }, customer, cancelFlowInfo)</code></td>
1963            </tr>
1964            <tr>
1965              <td><code class="highlighted">options.handleTrialExtension</code></td>
1966              <td>Custom trial extension logic callback</td>
1967              <td>
1968                Takes <code>({ trialExtensionDays }, customer, cancelFlowInfo)</code>
1969              </td>
1970            </tr>
1971            <tr>
1972              <td><code class="highlighted">options.handleSwitchPlan</code></td>
1973              <td>Custom switch-plan logic callback</td>
1974              <td>Takes <code>({ plan }, customer, cancelFlowInfo)</code></td>
1975            </tr>
1976            <tr>
1977              <td>
1978                <code class="highlighted">options.handleSwitchPlanWithCoupon</code>
1979              </td>
1980              <td>Custom switch-plan-with-coupon logic callback</td>
1981              <td>Takes <code>({ plan, code }, customer, cancelFlowInfo)</code></td>
1982            </tr>
1983            <tr>
1984              <td><code class="highlighted">options.handleSwitchProduct</code></td>
1985              <td>Custom switch-product logic callback</td>
1986              <td>Takes <code>({ product }, customer, cancelFlowInfo)</code></td>
1987            </tr>
1988            <tr>
1989              <td><code class="highlighted">options.autoCancel</code></td>
1990              <td>Auto-handle cancellation. On by default</td>
1991              <td><code class="highlighted">false</code> (to use custom handler)</td>
1992            </tr>
1993            <tr>
1994              <td><code class="highlighted">options.autoPause</code></td>
1995              <td>Auto-handle pausing. On by default</td>
1996              <td><code class="highlighted">false</code> (to use custom handler)</td>
1997            </tr>
1998            <tr>
1999              <td><code class="highlighted">options.autoCoupon</code></td>
2000              <td>Auto-handle coupons. On by default</td>
2001              <td><code class="highlighted">false</code> (to use custom handler)</td>
2002            </tr>
2003            <tr>
2004              <td><code class="highlighted">options.autoTrialExtension</code></td>
2005              <td>Auto-handle trial extensions. On by default</td>
2006              <td><code class="highlighted">false</code> (to use custom handler)</td>
2007            </tr>
2008            <tr>
2009              <td><code class="highlighted">options.autoSwitchPlan</code></td>
2010              <td>Auto-handle plan switching. On by default</td>
2011              <td><code class="highlighted">false</code> (to use custom handler)</td>
2012            </tr>
2013            <tr>
2014              <td>
2015                <code class="highlighted">options.autoSwitchPlanWithCoupon</code>
2016              </td>
2017              <td>Auto-handle plan switching with a coupon. On by default</td>
2018              <td><code class="highlighted">false</code> (to use custom handler)</td>
2019            </tr>
2020            <tr>
2021              <td><code class="highlighted">options.autoSwitchProduct</code></td>
2022              <td>Auto-handle product switching. On by default</td>
2023              <td><code class="highlighted">false</code> (to use custom handler)</td>
2024            </tr>
2025          </tbody>
2026        </table>
2027      </div>
2028      <h3>Full example</h3>
2029      <p>A launch call that sets every option:</p>
2030      <div class="chr-code">
2031        <div class="chr-copy-code" onclick="copyLink('chr-sdk-options-code')">
2032          <img loading="lazy" decoding="async"
2033            id="chr-sdk-options-code-img"
2034            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2035            width="20"
2036            height="23"
2037            alt=""
2038          />
2039        </div>
2040        <pre><code class="language-javascript" id="chr-sdk-options-code">
2041document.getElementById('cancel-button').addEventListener('click', function () {
2042    window.churnSolution?.run({
2043        authKey, // hash generated by your server
2044        subscriptionId, // your subscription ID from your payment provider
2045        appId: 'APP_ID', // your App ID
2046        options: {
2047            record: true, // default true, switch to false to turn off recording
2048            email: '<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="086269666d486d70696578646d266b6765">[email&#160;protected]</a>', // User email that initiates the cancel flow
2049            font: 'Roboto',
2050            fontUrl: 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap',
2051            language: 'de',
2052            customerAttributes: {
2053                Has_Extended_Free_Trial: false,
2054            },
2055            customTexts: {
2056                "Back": "Zurück",
2057                "Next": "Weiter",
2058            },
2059            cancellationSettings: {
2060                settings: {
2061                    CANCEL_TIME: {
2062                        cancellation_time_type: 'CUSTOM_DATE', // 'IMMEDIATE' | 'END_OF_BILLING_PERIOD' | 'CUSTOM_DATE' (Stripe only)
2063                        cancel_after_days: 7, // only used with 'CUSTOM_DATE'
2064                    },
2065                },
2066            },
2067            pauseSettings: {
2068                nextPaymentDate: '2026-10-15',
2069            },
2070            handleCancel: (customer, cancelFlowInfo) => {
2071                // cancel callback
2072            },
2073            handleAbandon: (customer, cancelFlowInfo) => {
2074                // abandon callback
2075            },
2076            handleDone: (customer, cancelFlowInfo) => {
2077                // success screen closed callback
2078            },
2079            handleClose: (customer, cancelFlowInfo) => {
2080                // modal closed callback
2081            },
2082            handlePause: ({pausePeriod}, customer, cancelFlowInfo) => {
2083                // pause callback
2084            },
2085            handleCoupon: ({code}, customer, cancelFlowInfo) => {
2086                // coupon/discount callback
2087            },
2088            handleTrialExtension: ({trialExtensionDays}, customer, cancelFlowInfo) => {
2089                // trial extension callback
2090            },
2091            handleSwitchPlan: ({plan}, customer, cancelFlowInfo) => {
2092                // switch plan callback
2093            },
2094            handleSwitchPlanWithCoupon: ({plan, code}, customer, cancelFlowInfo) => {
2095                // switch plan with coupon callback
2096            },
2097            handleSwitchProduct: ({product}, customer, cancelFlowInfo) => {
2098                // switch product callback
2099            },
2100            // Default true. Set any of these to false to make
2101            // the matching handler responsible for the action
2102            autoCancel: true,
2103            autoPause: true,
2104            autoCoupon: true,
2105            autoTrialExtension: true,
2106            autoSwitchPlan: true,
2107            autoSwitchPlanWithCoupon: true,
2108            autoSwitchProduct: true,
2109        },
2110    });
2111});
2112            </code></pre>
2113      </div>
2114    </div>
2115    <div id="chr-session-font" class="chr-docs-sub-section">
2116      <h2>Add Custom Fonts</h2>
2117      <p>
2118        By default, Churn Solution uses the font selected on the
2119        <a target="_blank" href="https://app.churnsolution.com/design"
2120          >design page</a
2121        >. However, you can override this with any font you prefer for your
2122        cancellation flow. To do this, you need to pass two parameters to the
2123        sessions API: font and fontUrl.
2124      </p>
2125      <p>Here’s an example of how to specify the font:</p>
2126      <div class="chr-code">
2127        <div class="chr-copy-code" onclick="copyLink('chr-font-code')">
2128          <img loading="lazy" decoding="async"
2129            id="chr-font-code-img"
2130            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2131            width="20"
2132            height="23"
2133            alt=""
2134          />
2135        </div>
2136        <pre><code class="language-javascript" id="chr-font-code">
2137document.getElementById('cancel-button').addEventListener('click', function () {
2138    window.churnSolution?.run({
2139        authKey, // hash generated by your server
2140        subscriptionId, // your subscription ID from your payment provider
2141        appId: 'APP_ID', // your App ID
2142        options: {
2143            record: true,
2144            email: '',
2145            font: 'Roboto', // Font example
2146            fontUrl: 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap', // Font URL example
2147        },
2148    });
2149});
2150            </code></pre>
2151      </div>
2152    </div>
2153    <div id="chr-session-recording" class="chr-docs-sub-section">
2154      <h2>Enable/Disable Session Recording</h2>
2155      <p>
2156        Session recording is enabled by default. You have the option to disable
2157        session recording by setting the record parameter to false in the
2158        options of
2159        <a href="#chr-insert-embed"
2160          >Step 1: Place the embed code and launch snippet</a
2161        >
2162        from the installing section.
2163      </p>
2164    </div>
2165    <div id="chr-cancellation-settings" class="chr-docs-sub-section">
2166      <h2>Set Cancellation Term</h2>
2167      <p>
2168        Learn how Churn Solution manages the cancellation of your customers'
2169        subscriptions. By default, each flow follows the option saved on the
2170        <a
2171          target="_blank"
2172          href="https://app.churnsolution.com/settings/configuration#Cancellation-Terms"
2173          >configuration page</a
2174        >.
2175      </p>
2176      <ul>
2177        <li>
2178          <strong>Immediate:</strong> Choose this option for instant
2179          subscription cancellation. The customer's subscription will be
2180          terminated immediately upon cancelling his subscription.
2181        </li>
2182        <li>
2183          <strong>End of billing period:</strong> Select this option to handle
2184          cancellations at the end of the current billing period. This allows
2185          customers to access services until the end of their paid subscription
2186          duration.
2187        </li>
2188        <li>
2189          <strong>Custom:</strong> Opt for this option for personalized
2190          cancellation processes. If chosen, specify a Cancellation Delay in
2191          terms of the number of days to define the precise termination
2192          timeline.
2193        </li>
2194      </ul>
2195      <img decoding="async"
2196        src="https://churnsolution.com/wp-content/uploads/2024/04/Animation.gif"
2197        alt="Cancellation Settings"
2198        style="border-radius: 12px"
2199      />
2200      <p>
2201        <b>Please Note:</b> Each flow follows the term saved on the
2202        configuration page, but you can override it for a single customer by
2203        passing <code class="highlighted">cancellationSettings</code> in the
2204        launch call. The override applies to that session only and does not
2205        change your saved configuration.
2206      </p>
2207      <div class="chr-code">
2208        <div
2209          class="chr-copy-code"
2210          onclick="copyLink('chr-cancellation-settings-code')"
2211        >
2212          <img loading="lazy" decoding="async"
2213            id="chr-cancellation-settings-code-img"
2214            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2215            width="20"
2216            height="23"
2217            alt=""
2218          />
2219        </div>
2220        <pre><code class="language-javascript" id="chr-cancellation-settings-code">
2221document.getElementById('cancel-button').addEventListener('click', function () {
2222    window.churnSolution?.run({
2223        authKey, // hash generated by your server
2224        subscriptionId, // your subscription ID from your payment provider
2225        appId: 'APP_ID', // your App ID
2226        options: {
2227            cancellationSettings: {
2228                settings: {
2229                    CANCEL_TIME: {
2230                        cancellation_time_type: 'IMMEDIATE',
2231                    },
2232                },
2233            },
2234        },
2235    });
2236});
2237            </code></pre>
2238      </div>
2239      <div class="chr-docs-table-wrapper">
2240        <table class="chr-docs-table">
2241          <thead>
2242            <tr>
2243              <th>Term on the configuration page</th>
2244              <th><code>cancellation_time_type</code></th>
2245              <th>Extra field</th>
2246            </tr>
2247          </thead>
2248          <tbody>
2249            <tr>
2250              <td>Immediate</td>
2251              <td><code class="highlighted">'IMMEDIATE'</code></td>
2252              <td>—</td>
2253            </tr>
2254            <tr>
2255              <td>End of billing period</td>
2256              <td><code class="highlighted">'END_OF_BILLING_PERIOD'</code></td>
2257              <td>—</td>
2258            </tr>
2259            <tr>
2260              <td>Custom</td>
2261              <td><code class="highlighted">'CUSTOM_DATE'</code></td>
2262              <td><code class="highlighted">cancel_after_days: 7</code></td>
2263            </tr>
2264          </tbody>
2265        </table>
2266      </div>
2267      <div class="chr-info">
2268        <svg
2269          width="21"
2270          height="23"
2271          viewBox="0 0 21 23"
2272          fill="none"
2273          xmlns="http://www.w3.org/2000/svg"
2274        >
2275          <g clip-path="url(#ujqm33ofja)" fill="#0F124D">
2276            <path
2277              d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z"
2278            />
2279            <path
2280              d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z"
2281            />
2282          </g>
2283          <defs>
2284            <clipPath id="ujqm33ofja">
2285              <path fill="#fff" d="M0 0h21v23H0z" />
2286            </clipPath>
2287          </defs>
2288        </svg>
2289
2290        <div>
2291          Values are case-sensitive. <b>Custom is supported on Stripe only.</b>
2292          On other payment providers, the cancellation fails. End of billing
2293          period is not supported on WooCommerce or Recurpay.
2294        </div>
2295      </div>
2296      <p>
2297        Example: cancel trial users immediately and everyone else at the end of
2298        the period:
2299      </p>
2300      <div class="chr-code">
2301        <div
2302          class="chr-copy-code"
2303          onclick="copyLink('chr-cancellation-settings-example-code')"
2304        >
2305          <img loading="lazy" decoding="async"
2306            id="chr-cancellation-settings-example-code-img"
2307            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2308            width="20"
2309            height="23"
2310            alt=""
2311          />
2312        </div>
2313        <pre><code class="language-javascript" id="chr-cancellation-settings-example-code">
2314options: {
2315    cancellationSettings: {
2316        settings: {
2317            CANCEL_TIME: {
2318                cancellation_time_type: isOnTrial ? 'IMMEDIATE' : 'END_OF_BILLING_PERIOD',
2319            },
2320        },
2321    },
2322},
2323            </code></pre>
2324      </div>
2325    </div>
2326    <div id="chr-renewal-settings" class="chr-docs-sub-section">
2327      <h2>Subscription Renewal Configuration</h2>
2328      <p>
2329        This feature allows you to win back customers who have cancelled their
2330        subscription, with the cancellation setting after a specified date or at
2331        the end of the billing period (cancellation has not happened yet). You
2332        can configure and display a call-to-action (CTA) to let your customers
2333        renew their subscription using these settings from the configuration
2334        page
2335      </p>
2336      <ul>
2337        <li>
2338          <b>Immediate Renewal:</b> Once the user clicks on the renew CTA, their
2339          subscription is cancelled directly.
2340        </li>
2341        <li>
2342          <b>Renew with Customer Confirmation:</b> The user has the option to
2343          set a headline, message, and CTA text for the pop-up that will be
2344          shown when the user clicks on the renew CTA.
2345        </li>
2346        <li>
2347          <b>Renew with Special Offer:</b> Here you have the option to add a
2348          headline, message, CTA text, and offer users a coupon that will be
2349          applied to their first payment.
2350        </li>
2351      </ul>
2352      <img decoding="async"
2353        src="https://churnsolution.com/wp-content/uploads/2024/07/uncancel.gif"
2354        alt="Renew Settings"
2355        style="border-radius: 12px"
2356      />
2357      <p>
2358        Once you've determined the desired configuration, you need to implement
2359        the renewal functionality on your site. Typically, you will attach an
2360        event listener to your <b>Renew Plan</b> button. The following code
2361        calls a function in Churn Solution side that handles the renewal
2362        process:
2363      </p>
2364      <div class="chr-code">
2365        <div
2366          class="chr-copy-code"
2367          onclick="copyLink('chr-renewal-settings-code')"
2368        >
2369          <img loading="lazy" decoding="async"
2370            id="chr-renewal-settings-code-img"
2371            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2372            width="20"
2373            height="23"
2374            alt=""
2375          />
2376        </div>
2377        <pre><code class="language-javascript" id="chr-renewal-settings-code">
2378document.getElementById('renew-button').addEventListener('click', function () {
2379    window.churnSolution?.renew({
2380        authKey, // hash generated by your server
2381        subscriptionId, // your subscription ID from your payment provider
2382        appId: 'APP_ID', // your App ID
2383        options: {
2384            record: true,
2385            email: '',
2386        },
2387    });
2388});
2389            </code></pre>
2390      </div>
2391    </div>
2392    <div id="chr-unpause-settings" class="chr-docs-sub-section">
2393      <h2>Resume Configuration</h2>
2394      <p>
2395        This feature enables you to offer your customers the option to resume
2396        their subscription after they have paused payment collection. You can
2397        configure and display a call-to-action (CTA) to let your customers
2398        resume their subscription using these settings from the configuration
2399        page
2400      </p>
2401      <ul>
2402        <li>
2403          <b>Immediate Resume:</b> Once the user clicks on the resume CTA, their
2404          subscription will be resumed directly.
2405        </li>
2406        <li>
2407          <b>Resume with Customer Confirmation:</b> You will have the option to
2408          set a headline, message, and CTA text for the pop-up that will be
2409          shown when the user clicks on the resume CTA.
2410        </li>
2411      </ul>
2412      <img decoding="async"
2413        src="https://churnsolution.com/wp-content/uploads/2024/07/unpause.gif"
2414        alt="Resume Settings"
2415        style="border-radius: 12px"
2416      />
2417      <p>
2418        Once you've determined the desired configuration, you need to implement
2419        the resume functionality on your site. Typically, you will attach an
2420        event listener to your <b>Resume Plan</b> button. The following code
2421        calls a function in Churn Solution side that handles the resume process:
2422      </p>
2423      <div class="chr-code">
2424        <div
2425          class="chr-copy-code"
2426          onclick="copyLink('chr-resume-settings-code')"
2427        >
2428          <img loading="lazy" decoding="async"
2429            id="chr-resume-settings-code-img"
2430            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2431            width="20"
2432            height="23"
2433            alt=""
2434          />
2435        </div>
2436        <pre><code class="language-javascript" id="chr-resume-settings-code">
2437document.getElementById('resume-button').addEventListener('click', function () {
2438    window.churnSolution?.resume({
2439        authKey, // hash generated by your server
2440        subscriptionId, // your subscription ID from your payment provider
2441        appId: 'APP_ID', // your App ID
2442        options: {
2443            record: true,
2444            email: '',
2445        },
2446    });
2447});
2448            </code></pre>
2449      </div>
2450    </div>
2451    <div id="chr-pause-flow" class="chr-docs-sub-section">
2452      <h2>Pause Flow</h2>
2453      <p>
2454        Launches the pause flow directly instead of the cancel flow. Available
2455        for WooCommerce and Paddle.
2456      </p>
2457      <div class="chr-code">
2458        <div class="chr-copy-code" onclick="copyLink('chr-pause-flow-code')">
2459          <img loading="lazy" decoding="async"
2460            id="chr-pause-flow-code-img"
2461            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2462            width="20"
2463            height="23"
2464            alt=""
2465          />
2466        </div>
2467        <pre><code class="language-javascript" id="chr-pause-flow-code">
2468document.getElementById('pause-button').addEventListener('click', function () {
2469    window.churnSolution?.pause({
2470        authKey, // hash generated by your server
2471        subscriptionId, // your subscription ID from your payment provider
2472        appId: 'APP_ID', // your App ID
2473        options: {
2474            record: true,
2475            email: '',
2476        },
2477    });
2478});
2479            </code></pre>
2480      </div>
2481      <p>
2482        To pause for one month immediately without showing a flow, call
2483        <code class="highlighted">window.churnSolution?.skip({...})</code> with
2484        the same arguments.
2485      </p>
2486    </div>
2487    <div id="chr-customer-attributes" class="chr-docs-sub-section">
2488      <h2>Custom Attributes</h2>
2489      <p>
2490        When configuring the cancel flow, you can define custom attributes to
2491        effectively segment your customers. Here's how to proceed:
2492      </p>
2493      <ul>
2494        <li>
2495          Within the
2496          <a
2497            target="_blank"
2498            href="https://app.churnsolution.com/settings/configuration"
2499            >Configuration Settings</a
2500          >
2501          tab or directly from the cancellation flow in the Audience page,
2502          create a custom attribute. For instance, you might create an attribute
2503          like <strong>Has_Extended_Free_Trial</strong> to segment users based
2504          on whether they've already extended their free trial.
2505        </li>
2506        <li>
2507          Use this custom attribute to apply flows for the specified segments
2508          within your cancel flow. For example, you could target customers who
2509          have use free trial and have already extended it.
2510        </li>
2511        <li>
2512          When invoking <i>window.churnSolution.run()</i>, ensure that you
2513          include <strong>Has_Extended_Free_Trial</strong> under
2514          <i>options.customerAttributes</i>.
2515        </li>
2516      </ul>
2517      <div class="chr-code">
2518        <div
2519          class="chr-copy-code"
2520          onclick="copyLink('chr-custom-attributes-code')"
2521        >
2522          <img loading="lazy" decoding="async"
2523            id="chr-custom-attributes-code-img"
2524            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2525            width="20"
2526            height="23"
2527            alt=""
2528          />
2529        </div>
2530        <pre><code class="language-javascript" id="chr-custom-attributes-code">
2531document.getElementById('cancel-button').addEventListener('click', function () {
2532    window.churnSolution?.run({
2533        authKey, // hash generated by your server
2534        subscriptionId, // your subscription ID from your payment provider
2535        appId: 'APP_ID', // your App ID
2536        options: {
2537            customerAttributes: {
2538                Has_Extended_Free_Trial: false // or true, based on user's status
2539            },
2540            record: true,
2541            email: '',
2542        },
2543    });
2544});
2545            </code></pre>
2546      </div>
2547      <div class="chr-video-embed-wrapper">
2548        <iframe
2549          class="chr-video-embed"
2550          src="https://www.youtube.com/embed/uBfVr978DQA"
2551          title="Segmentation &amp; Custom Attributes: Churn Solution"
2552          frameborder="0"
2553          allow="
2554            accelerometer;
2555            autoplay;
2556            clipboard-write;
2557            encrypted-media;
2558            gyroscope;
2559            picture-in-picture;
2560            web-share;
2561          "
2562          referrerpolicy="strict-origin-when-cross-origin"
2563          allowfullscreen
2564        ></iframe>
2565      </div>
2566    </div>
2567    <div id="chr-customer-attributes-meta" class="chr-docs-sub-section">
2568      <h2>Customer Segmentation based on Metadata</h2>
2569      <p>
2570        Suppose you already have a metadata field either from the customer
2571        metadata or subscription metadata and it's set for all your customers.
2572      </p>
2573      <p>
2574        In the
2575        <a
2576          target="_blank"
2577          href="https://app.churnsolution.com/settings/configuration"
2578          >Configuration Settings</a
2579        >
2580        tab or directly from the cancellation flow in the Audience page,
2581        establish a new custom attribute. Specify the fields used in your
2582        metadata and their respective data types.
2583      </p>
2584      <p>
2585        Employ this custom attribute to define segments within your cancel flow,
2586        similar to the previous example.
2587      </p>
2588      <p>
2589        Now, when a customer interacts with the Embed, we'll first prioritize
2590        the value of the entered key field, if provided during session creation.
2591        Subsequently, we'll search for the relevant data in both their customer
2592        and subscription metadata. If found, we'll use that value from the
2593        subscription metadata first, then from the customer metadata, to
2594        evaluate your segment conditions.
2595      </p>
2596    </div>
2597    <div id="chr-custom-callbacks" class="chr-docs-sub-section">
2598      <h2>Custom Callbacks</h2>
2599      <p>
2600        Handler callbacks are used when you want to manage actions to a
2601        customer's subscription by yourself, rather than letting Churn Solution
2602        do it automatically for you. When you define a handler callback for a
2603        specific event, like a subscription cancellation, and turn off its
2604        matching auto flag, Churn Solution will follow your instructions
2605        instead of doing its implementation for it.
2606      </p>
2607      <p>
2608        Most of these handler callbacks work like promises in JavaScript. When
2609        something happens, you have two options: resolve or reject. If
2610        everything goes well and you want Churn Solution to proceed as planned,
2611        you call resolve. You can even include a message to let the customer
2612        know what's happening. On the other hand, if there's an issue and you
2613        want Churn Solution to stop and handle it differently, you call reject.
2614      </p>
2615      <p>
2616        This object will contain the actions handlers with a flag for each
2617        action to specify whether the action handler is a replacement to Churn
2618        Solution handler or an extra functionality. If any of the below props is
2619        true its action will be handled from Churn Solution side and if you have
2620        callback for this event it will be called also when executing the action
2621        events from our side. Furthermore, you have the option to send the
2622        customer email who started the cancellation flow.
2623      </p>
2624      <div class="chr-code">
2625        <div class="chr-copy-code" onclick="copyLink('chr-options-code')">
2626          <img loading="lazy" decoding="async"
2627            id="chr-options-code-img"
2628            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2629            width="20"
2630            height="23"
2631            alt=""
2632          />
2633        </div>
2634        <pre><code class="language-javascript" id="chr-options-code">
2635{
2636    record: true, // default true, switch to false to turn off recording
2637    email: '', // User email that initiates the cancel flow
2638    handleCancel: (customer, cancelFlowInfo) => {
2639        // cancel callback
2640    },
2641    handleAbandon: (customer, cancelFlowInfo) => {
2642        // abandon callback
2643    },
2644    handleDone: (customer, cancelFlowInfo) => {
2645        // success screen closed callback
2646    },
2647    handleClose: (customer, cancelFlowInfo) => {
2648        // modal closed callback
2649    },
2650    handlePause: ({pausePeriod}, customer, cancelFlowInfo) => {
2651        // pause callback
2652    },
2653    handleTrialExtension: ({trialExtensionDays}, customer, cancelFlowInfo) => {
2654        // trial extension callback
2655    },
2656    handleCoupon: ({code}, customer, cancelFlowInfo) => {
2657        // coupon/discount callback
2658    },
2659    handleSwitchPlan: ({plan}, customer, cancelFlowInfo) => {
2660        // switch plan callback
2661    },
2662    handleSwitchPlanWithCoupon: ({plan, code}, customer, cancelFlowInfo) => {
2663        // switch plan with coupon callback
2664    },
2665    handleSwitchProduct: ({product}, customer, cancelFlowInfo) => {
2666        // switch product callback
2667    },
2668    // If any of the below props is true
2669    // its action will be handled from Churn Solution side
2670    autoCancel: false,
2671    autoPause: false,
2672    autoSwitchPlan: false,
2673    autoSwitchPlanWithCoupon: false,
2674    autoSwitchProduct: false,
2675    autoTrialExtension: false,
2676    autoCoupon: false,
2677}
2678            </code></pre>
2679      </div>
2680      <p>
2681        Every offer handler is called as
2682        <code class="highlighted">handler(offer, customer, cancelFlowInfo)</code>,
2683        where <code class="highlighted">offer</code> always carries
2684        <code class="highlighted">offerType</code> plus the fields below. The
2685        lifecycle callbacks (<code class="highlighted">handleAbandon</code>,
2686        <code class="highlighted">handleDone</code>,
2687        <code class="highlighted">handleClose</code>) and
2688        <code class="highlighted">handleCancel</code> receive only
2689        <code class="highlighted">(customer, cancelFlowInfo)</code>.
2690      </p>
2691      <div class="chr-docs-table-wrapper">
2692        <table class="chr-docs-table">
2693          <thead>
2694            <tr>
2695              <th>Handler</th>
2696              <th><code>offer</code> fields</th>
2697            </tr>
2698          </thead>
2699          <tbody>
2700            <tr>
2701              <td><code class="highlighted">handlePause</code></td>
2702              <td><code class="highlighted">pausePeriod</code></td>
2703            </tr>
2704            <tr>
2705              <td><code class="highlighted">handleCoupon</code></td>
2706              <td><code class="highlighted">code</code></td>
2707            </tr>
2708            <tr>
2709              <td><code class="highlighted">handleTrialExtension</code></td>
2710              <td><code class="highlighted">trialExtensionDays</code></td>
2711            </tr>
2712            <tr>
2713              <td><code class="highlighted">handleSwitchPlan</code></td>
2714              <td><code class="highlighted">plan</code></td>
2715            </tr>
2716            <tr>
2717              <td><code class="highlighted">handleSwitchPlanWithCoupon</code></td>
2718              <td>
2719                <code class="highlighted">plan</code>,
2720                <code class="highlighted">code</code>
2721              </td>
2722            </tr>
2723            <tr>
2724              <td><code class="highlighted">handleSwitchProduct</code></td>
2725              <td><code class="highlighted">product</code></td>
2726            </tr>
2727          </tbody>
2728        </table>
2729      </div>
2730      <p>
2731        A handler may return
2732        <code class="highlighted">{ title, message }</code> to replace the text
2733        on the success screen.
2734      </p>
2735      <div class="chr-info">
2736        <svg
2737          width="21"
2738          height="23"
2739          viewBox="0 0 21 23"
2740          fill="none"
2741          xmlns="http://www.w3.org/2000/svg"
2742        >
2743          <g clip-path="url(#ujqm33ofja)" fill="#0F124D">
2744            <path
2745              d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z"
2746            />
2747            <path
2748              d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z"
2749            />
2750          </g>
2751          <defs>
2752            <clipPath id="ujqm33ofja">
2753              <path fill="#fff" d="M0 0h21v23H0z" />
2754            </clipPath>
2755          </defs>
2756        </svg>
2757
2758        <div>
2759          A handler on its own does <b>not</b> stop Churn Solution from acting.
2760          With <code class="highlighted">autoCancel</code> left at its default
2761          (<code class="highlighted">true</code>),
2762          <code class="highlighted">handleCancel</code> is only a notification
2763          fired after we cancel. Set
2764          <code class="highlighted">autoCancel: false</code> to make your
2765          handler responsible for the cancellation. The same applies to every
2766          <code class="highlighted">autoX</code> /
2767          <code class="highlighted">handleX</code> pair.
2768        </div>
2769      </div>
2770    </div>
2771    <div id="chr-callbacks-example" class="chr-docs-sub-section">
2772      <h3>Example callbacks for custom cancel handling</h3>
2773      <p>
2774        If you want to customize and use your cancel logic rather than letting
2775        Churn Solution cancel through your payment provider, you can define the
2776        handleCancel option and set the autoCancel to false, similarly you can
2777        do it to all other actions. This callback is triggered when a customer
2778        selects to cancel his subscription. If you've defined this callback,
2779        Churn Solution won't automatically attempt to manage these actions
2780        through your payment provider. Instead, it will execute the logic you've
2781        specified within the respective callback.
2782      </p>
2783      <div class="chr-code">
2784        <div
2785          class="chr-copy-code"
2786          onclick="copyLink('chr-options-code-example')"
2787        >
2788          <img loading="lazy" decoding="async"
2789            id="chr-options-code-example-img"
2790            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2791            width="20"
2792            height="23"
2793            alt=""
2794          />
2795        </div>
2796        <pre><code class="language-javascript" id="chr-options-code-example">
2797window.churnSolution.run({
2798    authKey, // hash generated by your server
2799    subscriptionId, // your subscription ID from your payment provider
2800    appId: 'APP_ID', // your App ID
2801    options: {
2802        handleCancel: (customer, flowInfo) => {
2803            return new Promise(async (resolve, reject) => {
2804                try {
2805                    // handle cancel logic
2806
2807                    // You can pass a message that will be showed to user after cancelling
2808                    // if you don't pass a message, a generic message will be shown
2809                    resolve({ message: 'Your account has been canceled. You will not be billed again' });
2810                } catch (e) {
2811                    console.log(e);
2812                    reject({ message: 'Failed to cancel account. Please contact support.' });
2813                }
2814            });
2815        },
2816        handlePause: async ({pausePeriod}, customer, flowInfo) => {
2817            return new Promise(async (resolve, reject) => {
2818                try {
2819                    // handle pause logic
2820
2821                    // You can pass a message that will be showed to user after cancelling
2822                    // if you don't pass a message, a generic message will be shown
2823                    resolve({ message: `Your account has been paused ${pausePeriod} month${pausePeriod === 1 ? '' : 's'}. You will not be billed until resume` });
2824                } catch (e) {
2825                    console.log(e);
2826                    reject({ message: 'Failed to cancel account. Please contact support.' });
2827                }
2828            });
2829        },
2830        // If any of the below props is true
2831        // its action will be handled from Churn Solution side
2832        autoCancel: false,
2833        autoPause: false,
2834        autoSwitchPlan: false,
2835        autoSwitchPlanWithCoupon: false,
2836        autoTrialExtension: false,
2837        autoCoupon: false,
2838    },
2839});
2840            </code></pre>
2841      </div>
2842    </div>
2843    <div id="chr-custom-texts" class="chr-docs-sub-section">
2844      <h2>Custom Texts & Multi-language Support</h2>
2845      <p>
2846        Churn Solution gives you full flexibility to override any default text
2847        in the cancellation, resume, or renewal flows. This allows you to fully
2848        localize the experience into any language or customize the wording to
2849        match your brand tone.
2850      </p>
2851      <p>
2852        You can pass a <code><strong>customTexts</strong></code> object to
2853        <code><strong>window.churnSolution.run()</strong></code> with key-value
2854        pairs where:
2855      </p>
2856      <ul>
2857        <li>
2858          <p><strong>Key</strong> = the original system text</p>
2859        </li>
2860        <li>
2861          <p><strong>Value</strong> = the text you want to display instead</p>
2862        </li>
2863      </ul>
2864      <p>as below:</p>
2865      <div class="chr-code">
2866        <div class="chr-copy-code" onclick="copyLink('chr-custom-texts-code')">
2867          <img loading="lazy" decoding="async"
2868            id="chr-custom-texts-code-img"
2869            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2870            width="20"
2871            height="23"
2872            alt=""
2873          />
2874        </div>
2875        <pre><code class="language-javascript" id="chr-custom-texts-code">
2876{
2877    record: true, // default true, switch to false to turn off recording
2878    email: '', // User email that initiates the cancel flow
2879    customTexts: {
2880        "Back": "Back",
2881        "Next": "Next",
2882        "Decline Offer": "Decline Offer",
2883        "Done": "Done",
2884        "Cancel": "Cancel",
2885        "Cancel Subscription": "Cancel Subscription",
2886        "Close": "Close",
2887        "Yes, Leave": "Yes, Leave",
2888        "No, Back": "No, Back",
2889        "Powered by": "Powered by",
2890        "Cancellation Guaranteed by": "Cancellation Guaranteed by",
2891        "Offer Guaranteed by": "Offer Guaranteed by",
2892        "You are already paused": "You are already paused",
2893        "You won't be billed until your subscription resumes": "You won't be billed until your subscription resumes",
2894        "Subscription Cancelled.": "Subscription Cancelled.",
2895        "Subscription Uncancelled.": "Subscription Uncancelled.",
2896        "Subscription Resumed.": "Subscription Resumed.",
2897        "Subscription paused.": "Subscription paused.",
2898        "Subscription Activated.": "Subscription Activated.",
2899        "You can enjoy all our features again!": "You can enjoy all our features again!",
2900        "Something went wrong!": "Something went wrong!",
2901        "Please refresh your page and try again": "Please refresh your page and try again",
2902        "Offer applied": "Offer applied",
2903        "Successfully claimed offer": "Successfully claimed offer",
2904        "Switch Plan": "Switch Plan",
2905        "Successfully switched plan": "Successfully switched plan",
2906        "Successfully switched plan with a discount.": "Successfully switched plan with a discount.",
2907        "Extend Free Trial": "Extend Free Trial",
2908        "Successfully extended you free trial": "Successfully extended you free trial",
2909        "Unable to Recover Payment": "Unable to Recover Payment",
2910        "Unable to Switch Plan": "Unable to Switch Plan",
2911        "Please contact customer support for assistance": "Please contact customer support for assistance",
2912        "Submit the form to proceed with your cancellation": "Submit the form to proceed with your cancellation",
2913        "Go To Form": "Go To Form",
2914        "Write your answer...": "Write your answer...",
2915        "Answer...": "Answer...",
2916        "empty option": "empty option",
2917        "Minimum number of characters:": "Minimum number of characters:",
2918        "Day": "Day",
2919        "Days": "Days",
2920        "day": "day",
2921        "days": "days",
2922        "week": "week",
2923        "weeks": "weeks",
2924        "month": "month",
2925        "months": "months",
2926        "year": "year",
2927        "years": "years",
2928        "billing cycle": "billing cycle",
2929        "billing cycles": "billing cycles",
2930        "Choose offer type": "Choose offer type",
2931        "Pause Subscription": "Pause Subscription",
2932        "Accept": "Accept",
2933        "Accept Offer": "Accept Offer",
2934        "Claim your offer": "Claim your offer",
2935        "Switch and Claim Your Offer": "Switch and Claim Your Offer",
2936        "Discover a Better Plan for You": "Discover a Better Plan for You",
2937        "Claim Your Offer & Switch Plan": "Claim Your Offer & Switch Plan",
2938        "Extend Trial By": "Extend Trial By",
2939        "Chat on WhatsApp": "Chat on WhatsApp",
2940        "Send an Email": "Send an Email",
2941        "Choose how long you want to pause": "Choose how long you want to pause",
2942        "Loading...": "Loading...",
2943        "Waiting Submit...": "Waiting Submit...",
2944        "Limited time offer for": "Limited time offer for",
2945        "Enjoy This Discounted Price Forever": "Enjoy This Discounted Price Forever",
2946        "You subscription is successfully restored": "You subscription is successfully restored",
2947        "You subscription is successfully resumed": "You subscription is successfully resumed",
2948        "You won't be billed again.": "You won't be billed again.",
2949        "Your subscription is canceled and will end at the end of your current billing period.": "Your subscription is canceled and will end at the end of your current billing period.",
2950        "Your subscription is canceled and will end after": "Your subscription is canceled and will end after",
2951        "Your subscription is canceled and will end": "Your subscription is canceled and will end",
2952        "Today": "Today",
2953        "Can't Cancel": "Can't Cancel",
2954        "Success": "Success",
2955        "Your action has been successfully done": "Your action has been successfully done",
2956        "Cancellation Incomplete": "Cancellation Incomplete",
2957        "You've started the cancellation Process but haven't finished it. Are you sure you want to leave?": "You've started the cancellation Process but haven't finished it. Are you sure you want to leave?",
2958        "Oops! something went wrong!": "Oops! something went wrong!",
2959        "It seems you have already claimed this coupon": "It seems you have already claimed this coupon",
2960        "Offer Already Redeemed": "Offer Already Redeemed",
2961        "Off your next renewal": "Off your next renewal",
2962        "Off all of your next renewals": "Off all of your next renewals",
2963        "Off for": "Off for",
2964    },
2965}
2966            </code></pre>
2967      </div>
2968    </div>
2969    <div id="chr-custom-texts-example" class="chr-docs-sub-section">
2970      <h3>Example callbacks for custom texts handling</h3>
2971      <p>
2972        The following example shows how to override default texts and display
2973        the cancellation flow in French:
2974      </p>
2975      <div class="chr-code">
2976        <div
2977          class="chr-copy-code"
2978          onclick="copyLink('chr-custom-texts-example-code')"
2979        >
2980          <img loading="lazy" decoding="async"
2981            id="chr-custom-texts-example-code-img"
2982            src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
2983            width="20"
2984            height="23"
2985            alt=""
2986          />
2987        </div>
2988        <pre><code class="language-javascript" id="chr-custom-texts-example-code">
2989window.churnSolution?.run({
2990    authKey, // hash generated by your server
2991    subscriptionId, // your subscription ID from your payment provider
2992    appId: 'APP_ID', // your App ID
2993    options: {
2994        record: true,
2995        customTexts: {
2996            "Back": "Retour",
2997            "Next": "Suivant",
2998            "Decline Offer": "Refuser l'offre",
2999            "Accept Offer": "Accepter l'offre",
3000            "Done": "Terminé",
3001            "Pause Subscription": "Mettre l'abonnement en pause",
3002            "Cancel Subscription": "Annuler l'abonnement",
3003            "Extend Free Trial": "Prolonger l'essai gratuit",
3004            "Claim your offer": "Réclamez votre offre",
3005            "Switch Plan": "Changer de forfait",
3006            "No, Back": "Non, Retour",
3007            "Yes, Leave": "Oui, Quitter",
3008            "Chat on WhatsApp": "Discuter sur WhatsApp",
3009            "Send an Email": "Envoyer un e-mail",
3010            ...
3011        },
3012    },
3013});
3014            </code></pre>
3015      </div>
3016    </div>
3017    <div id="chr-google-form-configuration" class="chr-docs-sub-section">
3018      <h2>Integrating Google Form into Cancellation Confirmation</h2>
3019      <p>
3020        In the cancellation confirmation process, you have the option to include
3021        a Google Form for your customers. This form can be set as either
3022        required or optional.
3023      </p>
3024      <h3>Steps to Add Google Form:</h3>
3025      <ol>
3026        <li>
3027          Make the Form Public: Ensure that your Google Form is public, allowing
3028          customers to access it without restrictions.
3029        </li>
3030        <li>
3031          Enable the Google Form in Confirmation step:
3032          <ul>
3033            <li>
3034              In the cancellation confirmation settings, enable the option to
3035              show the Google Form button in the confirmation modal.
3036            </li>
3037            <li>
3038              Customize the button text that will appear to your customers and
3039              specify the link it will redirect to.
3040            </li>
3041          </ul>
3042        </li>
3043      </ol>
3044      <p>
3045        If you want customers to submit the form before proceeding with the
3046        cancellation, enable the option to require Google Form submission so
3047        that your customers will be blocked from cancelling the subscription
3048        until they submit the form.
3049      </p>
3050      <p>you have to follow these steps:</p>
3051      <ul>
3052        <li>
3053          Adding a Unique Field to the Google Form:
3054          <p>
3055            Create a new field titled <b>"Cancellation Bin Code"</b> as a
3056            <b>Short Answer</b> field in your Google Form. This field will be
3057            pre-filled with a unique value at runtime to validate form
3058            submissions.
3059          </p>
3060        </li>
3061      </ul>
3062      <img decoding="async"
3063        src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_field.png"
3064        alt="Cancellation Bin Code Field"
3065        height="auto"
3066        width="450"
3067        style="border-radius: 12px; margin-bottom: 24px; display: block"
3068      />
3069      <div class="chr-info">
3070        <svg
3071          width="21"
3072          height="23"
3073          viewBox="0 0 21 23"
3074          fill="none"
3075          xmlns="http://www.w3.org/2000/svg"
3076        >
3077          <g clip-path="url(#ujqm33ofja)" fill="#0F124D">
3078            <path
3079              d="M12.376 19.567h-3.72a.548.548 0 0 1-.409-.164.583.583 0 0 1-.17-.418.6.6 0 0 1 .17-.418.561.561 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.557.557 0 0 1-.39.177h.001zM12.376 21.32h-3.72a.548.548 0 0 1-.409-.166.585.585 0 0 1-.17-.417.6.6 0 0 1 .17-.418.563.563 0 0 1 .41-.165h3.719a.557.557 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176h.001zM11.543 23H9.49a.556.556 0 0 1-.39-.176.593.593 0 0 1 0-.813.556.556 0 0 1 .39-.176h2.053a.556.556 0 0 1 .389.176.593.593 0 0 1 0 .813.556.556 0 0 1-.39.176zM13.616 11.34a.555.555 0 0 1-.4-.171.593.593 0 0 1-.165-.412 2.388 2.388 0 0 0-.437-1.388 2.265 2.265 0 0 0-1.15-.85.559.559 0 0 1-.33-.286.6.6 0 0 1 .069-.644.548.548 0 0 1 .602-.18c.69.223 1.292.669 1.719 1.27.427.603.656 1.33.654 2.078 0 .154-.059.302-.164.411a.556.556 0 0 1-.398.171z"
3080            />
3081            <path
3082              d="M8.248 17.786a.554.554 0 0 1-.377-.15.588.588 0 0 1-.183-.371c-.05-.49-.439-.964-.931-1.564-.815-.995-1.936-2.359-1.936-4.683 0-3.242 2.554-5.88 5.693-5.88 3.14 0 5.694 2.64 5.694 5.88 0 2.324-1.12 3.688-1.936 4.683-.492.6-.881 1.074-.931 1.564a.597.597 0 0 1-.206.391.557.557 0 0 1-.414.127.55.55 0 0 1-.38-.213.59.59 0 0 1-.122-.428c.086-.847.623-1.501 1.192-2.194.782-.953 1.668-2.033 1.668-3.93 0-1.25-.48-2.45-1.337-3.333a4.493 4.493 0 0 0-3.228-1.381c-1.21 0-2.371.497-3.227 1.38a4.794 4.794 0 0 0-1.337 3.334c0 1.897.886 2.977 1.668 3.93.568.693 1.105 1.347 1.192 2.194a.6.6 0 0 1-.142.452.564.564 0 0 1-.42.192zM10.5 3.24a.555.555 0 0 1-.399-.17.592.592 0 0 1-.165-.413V.583c0-.155.06-.303.165-.412a.555.555 0 0 1 .798 0c.106.11.165.257.165.412v2.074a.6.6 0 0 1-.165.412.562.562 0 0 1-.399.17zM4.895 5.638a.549.549 0 0 1-.4-.17L3.075 4a.592.592 0 0 1 0-.824.555.555 0 0 1 .798 0l1.42 1.467a.6.6 0 0 1 .122.635.58.58 0 0 1-.207.262.552.552 0 0 1-.313.098zM17.526 18.683a.545.545 0 0 1-.399-.17l-1.42-1.467a.583.583 0 0 1-.176-.415.6.6 0 0 1 .166-.42.564.564 0 0 1 .406-.17.548.548 0 0 1 .402.18l1.42 1.468a.6.6 0 0 1 .122.635.579.579 0 0 1-.207.261.55.55 0 0 1-.314.098zM2.573 11.427H.564a.548.548 0 0 1-.409-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .409.165.584.584 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM20.436 11.427h-2.008a.548.548 0 0 1-.41-.165.585.585 0 0 1-.17-.418.6.6 0 0 1 .17-.417.561.561 0 0 1 .41-.165h2.008a.546.546 0 0 1 .41.165.585.585 0 0 1 .17.417.6.6 0 0 1-.17.418.563.563 0 0 1-.41.165zM3.474 18.683a.552.552 0 0 1-.313-.098.579.579 0 0 1-.208-.261.6.6 0 0 1 .122-.635l1.42-1.467a.555.555 0 0 1 .788.01.593.593 0 0 1 .01.814l-1.42 1.467a.563.563 0 0 1-.399.17zM16.105 5.638a.552.552 0 0 1-.313-.098.58.58 0 0 1-.208-.262.602.602 0 0 1 .123-.635l1.42-1.466a.555.555 0 0 1 .798 0 .592.592 0 0 1 0 .823l-1.42 1.468a.564.564 0 0 1-.4.17z"
3083            />
3084          </g>
3085          <defs>
3086            <clipPath id="ujqm33ofja">
3087              <path fill="#fff" d="M0 0h21v23H0z" />
3088            </clipPath>
3089          </defs>
3090        </svg>
3091
3092        <div>
3093          <b>Important:</b> Inform customers not to edit this field, as the
3094          unique value is essential for form validation.
3095        </div>
3096      </div>
3097      <ul>
3098        <li>Google Form Script Setup:</li>
3099      </ul>
3100      <ol>
3101        <li>
3102          Access Script Editor:
3103          <ul>
3104            <li>
3105              In the Google Form builder, click on the three dots in the upper
3106              right corner and select Script editor.
3107            </li>
3108          </ul>
3109          <img decoding="async"
3110            src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_menu-1.png"
3111            alt="Google Form Menu"
3112            height="auto"
3113            width="300"
3114            style="border-radius: 12px; display: block"
3115          />
3116        </li>
3117        <li>
3118          Add the Script:
3119          <ul>
3120            <li>Copy and paste the following code into the script editor</li>
3121            <div class="chr-code">
3122              <div
3123                class="chr-copy-code"
3124                onclick="copyLink('chr-google-form-code')"
3125              >
3126                <img loading="lazy" decoding="async"
3127                  id="chr-google-form-code-img"
3128                  src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"
3129                  width="20"
3130                  height="23"
3131                  alt=""
3132                />
3133              </div>
3134              <pre><code class="language-javascript" id="chr-google-form-code">
3135function onFormSubmit(e) {
3136  const CANCELLATION_BIN_CODE_FIELD = "Cancellation Bin Code";
3137  const API_URL = 'https://google-form.churnsolution.com/submit';
3138
3139  // Extract item responses
3140  const itemResponses = e.response.getItemResponses();
3141
3142  // Extract the value of the "Cancellation Bin Code" field
3143  const cancellationBinCode = itemResponses
3144    .find(item => item.getItem().getTitle() === CANCELLATION_BIN_CODE_FIELD)
3145    ?.getResponse();
3146
3147  // Validate the cancellationBinCode
3148  if (!cancellationBinCode) {
3149    Logger.log('Error: Cancellation Bin Code is empty. Aborting API call.');
3150    return;
3151  }
3152
3153  // Define API request options
3154  const options = {
3155    method: 'post',
3156    contentType: 'application/json',
3157    payload: JSON.stringify({ cancellationBinCode })
3158  };
3159
3160  // Send the HTTP request
3161  try {
3162    UrlFetchApp.fetch(API_URL, options);
3163  } catch (error) {
3164    // Catch and log errors during the HTTP request
3165    Logger.log('Error during API request: ' + error.message);
3166  }
3167}
3168            </code></pre>
3169            </div>
3170          </ul>
3171        </li>
3172        <li>
3173          Save the Script: After pasting the code, save the script.
3174          <img decoding="async"
3175            src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_code.png"
3176            alt="Google Form Code"
3177            height="auto"
3178            width="550"
3179            style="border-radius: 12px; display: block"
3180          />
3181        </li>
3182        <li>
3183          Set Up Triggers:
3184          <ul>
3185            <li>
3186              From the same page, click on triggers, add new trigger, and match
3187              these settings.
3188            </li>
3189          </ul>
3190          <img decoding="async"
3191            src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_trigger.png"
3192            alt="Google Form Trigger"
3193            height="auto"
3194            width="450"
3195            style="border-radius: 12px; display: block"
3196          />
3197        </li>
3198        <li>
3199          After setting it up, save the trigger to ensure it appears on the
3200          triggers page.
3201          <img decoding="async"
3202            src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_trigger_created.png"
3203            alt="Google Form Code"
3204            height="auto"
3205            width="auto"
3206            style="border-radius: 12px; display: block"
3207          />
3208        </li>
3209        <li>
3210          In the settings page, you can add a message for customers after they
3211          submit the form. Navigate to Form
3212          <b
3213            >settings -> Presentation -> After submission -> Confirmation
3214            message</b
3215          >, and edit the message to inform customers not to close the form. For
3216          example: "Your response has been recorded! Please keep this form open
3217          until we process your cancellation. We'll close it automatically when
3218          done. Thank you!"
3219          <img decoding="async"
3220            src="https://churnsolution.com/wp-content/uploads/2024/10/google_form_msg.png"
3221            alt="Google Form Code"
3222            height="auto"
3223            width="550"
3224            style="border-radius: 12px; display: block"
3225          />
3226        </li>
3227      </ol>
3228      <p>
3229        Now you can easily integrate this Google Form into your cancellation
3230        flow.
3231      </p>
3232    </div>
3233  </div>
3234</div>
3235<div class="alignright chr-docs-table-of-contents">
3236  <div class="chr-table-contents-container">
3237    <p class="chr-table-header">On This Page</p>
3238    <div class="chr-docs-table-content">
3239      <div>
3240        <a href="#chr-3-steps" class="chr-main-section"
3241          >2 Simple Steps to Get Started</a
3242        >
3243        <a href="#chr-insert-embed" class="chr-sub-section"
3244          >Step 1: Place the embed code
3245          <span style="display: block">and launch snippet</span></a
3246        >
3247        <a href="#chr-generate-hash" class="chr-sub-section"
3248          >Step 2: Generate Security
3249          <span style="display: inline-block">Token</span></a
3250        >
3251      </div>
3252      <hr />
3253      <div>
3254        <a href="#chr-config-options" class="chr-main-section"
3255          >Configuration Options</a
3256        >
3257        <a href="#chr-sdk-options" class="chr-sub-section">SDK Options</a>
3258        <a href="#chr-session-font" class="chr-sub-section">Add Custom Fonts</a>
3259        <a href="#chr-session-recording" class="chr-sub-section"
3260          >Enable/Disable Session
3261          <span style="display: block">Recording</span></a
3262        >
3263        <a href="#chr-cancellation-settings" class="chr-sub-section"
3264          >Set Cancellation Term</a
3265        >
3266        <a href="#chr-renewal-settings" class="chr-sub-section"
3267          >Subscription Renewal Configuration</a
3268        >
3269        <a href="#chr-unpause-settings" class="chr-sub-section"
3270          >Resume Configuration</a
3271        >
3272        <a href="#chr-pause-flow" class="chr-sub-section">Pause Flow</a>
3273        <a href="#chr-customer-attributes" class="chr-sub-section"
3274          >Customer Attributes</a
3275        >
3276        <a href="#chr-customer-attributes-meta" class="chr-sub-section"
3277          >Customer Segmentation based
3278          <span style="display: inline-block">on Metadata</span></a
3279        >
3280        <a href="#chr-custom-callbacks" class="chr-sub-section"
3281          >Custom Callbacks</a
3282        >
3283        <a href="#chr-custom-texts" class="chr-sub-section"
3284          >Custom Texts &
3285          <span style="display: block">Multi-language Support</span></a
3286        >
3287        <a href="#chr-google-form-configuration" class="chr-sub-section"
3288          >Integrating Google Form into Cancellation Confirmation</a
3289        >
3290      </div>
3291    </div>
3292  </div>
3293</div>
vendor: 110 bytes, lines 3293-3294
3293
3294<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
3294<script>
3295function copyLink(t){let c=document.getElementById(`${t}-img`),e=document.getElementById(t);navigator.clipboard.writeText(e.innerText),c.src="https://churnsolution.com/wp-content/uploads/2024/03/copied.png",setTimeout(()=>{c.src="https://churnsolution.com/wp-content/uploads/2024/03/copy-yellow.png"},3e3)}var addClassOnScroll=function(){var t=$(window).scrollTop();let c=[...document.querySelectorAll(".chr-docs-table-content a"),].map(t=>t.hash.replace(/#/g,""));$("div[id]").each(function(e,s){var a=$(s).offset().top,i=$(this).outerHeight(!0),l=$(s).attr("id");c.includes(l)&&t>a-80&&t<a+i&&($(".chr-docs-table-content a.active").removeClass("active"),$(".chr-docs-table-content a[href='#"+l+"']").addClass("active"),$(".chr-docs-table-content a.active").siblings(":first-child").addClass("active"))});let e=$(".chr-docs-table-content a.active");if(!e||e.length<1){let s=$(".chr-sub-section").first();s.addClass("active"),s.siblings(":first-child").addClass("active")}};$(function(){addClassOnScroll(),$(window).on("scroll",function(){addClassOnScroll()}),$(".chr-docs-table-content a").each(function(t,c){$(c).click(function(){setTimeout(()=>{$(this).siblings().each(function(t,c){$(c).removeClass("active")}),$(this).addClass("active"),$(this).siblings(":first-child").addClass("active")},600)})})});
3296</script>
3296
3297
3298
3299<style>
3300.chr-auth-panel-action,.chr-auth-panel-tab{font-weight:500;white-space:nowrap;cursor:pointer}.chr-step-optional{display:inline-block;margin-left:8px;padding:2px 8px;border-radius:6px;background-color:#e6f0f3;color:#9eb9c2;font-size:12px;font-weight:500;vertical-align:middle}.chr-auth-panel-action,.chr-auth-panel-tab{font-size:14px;color:#9eb9c2;background:0 0}.chr-auth-panel{margin:16px 0}.chr-auth-panel-controls{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.chr-auth-panel-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;min-width:200px;padding:9px 34px 9px 12px;border:1px solid #e6f0f3;border-radius:8px;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none'%3E%3Cpath d='M1 1.5 6 6.5l5-5' stroke='%230f124d' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center;color:#0f124d;font-size:14px;line-height:1.4;cursor:pointer}.chr-auth-panel-frame,.chr-auth-panel-select:hover{background-color:#f7fafb}.chr-auth-panel-select:focus{outline:0;border-color:#c9d7dc}.chr-auth-panel-frame{border:1px solid #e6f0f3;border-radius:12px;overflow:hidden}.chr-auth-panel-bar{display:flex;align-items:stretch;gap:8px;padding-right:4px;border-bottom:1px solid #e6f0f3;background-color:#fff}.chr-auth-panel-tabs{display:flex;flex:1;min-width:0;overflow-x:auto;-ms-overflow-style:none;scrollbar-width:none}.chr-auth-panel-tabs::-webkit-scrollbar{display:none}.chr-auth-panel-spacer{flex:1}.chr-auth-panel-tab{flex-shrink:0;padding:10px 12px;border:none;border-bottom:2px solid transparent;border-radius:0}.chr-auth-panel-tab:hover{color:#0f124d}.chr-auth-panel-tab.active{border-bottom-color:#0f124d;color:#0f124d;font-weight:700}.chr-auth-panel-actions{display:flex;flex-shrink:0;align-self:center;gap:4px}.chr-auth-panel-action{display:flex;align-items:center;gap:6px;padding:6px 8px;border:none;border-radius:6px}.chr-auth-panel-action:hover{background-color:#f7fafb;color:#0f124d}.chr-auth-panel-action:focus{outline:0}.chr-auth-panel-action svg{min-width:13px}.chr-auth-panel-body{padding:8px;overflow:auto;font-size:16px}.chr-auth-panel-body code[class*=language-],.chr-auth-panel-body pre[class*=language-]{margin:0;padding:0;background:0 0}.chr-launch-diff{display:flex;align-items:flex-start;gap:12px;margin:8px 0 16px}.chr-launch-diff-side{flex:1;min-width:0}.chr-docs-content .chr-launch-diff-label{margin:0 0 4px!important;color:#9eb9c2!important;font-size:11px!important;letter-spacing:.5px;text-transform:uppercase}.chr-launch-diff-arrow{padding-top:32px;color:#9eb9c2;font-size:18px}@media (max-width:768px){.chr-auth-panel-body{font-size:12px}.chr-launch-diff{flex-direction:column}.chr-launch-diff-arrow{align-self:center;padding-top:0;transform:rotate(90deg)}}@media (max-width:480px){.chr-auth-panel button{width:auto}.chr-auth-panel-select{width:100%;min-width:0}}
3301</style>
3302<script>
3303window.CHR_AUTH_LANGUAGES=[{label:"Node.js",frameworks:[{label:"Express",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\napp.post('/churnsolution/auth-key', (req, res) => {\n  const { subscriptionExternalId } = req.body;\n  const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n  res.json({ auth_key: authKey });\n});\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n  return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"Fastify",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\napp.post('/churnsolution/auth-key', async (request) => {\n  const { subscriptionExternalId } = request.body;\n  const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n  return { auth_key: authKey };\n});\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n  return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"NestJS",language:"typescript",extension:"ts",snippets:[{label:"",code:"private static readonly CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\n@Post('/churnsolution/auth-key')\ngenerateAuthKey(@Body('subscriptionExternalId') subscriptionExternalId: string) {\n  const authKey = ChurnSolutionController.getSha256HmacHash(\n    ChurnSolutionController.CHURNSOLUTION_SECRET_KEY,\n    subscriptionExternalId,\n  );\n\n  return { auth_key: authKey };\n}\n\nprivate static getSha256HmacHash(secretKey: string, subscriptionExternalId: string): string {\n  return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"Koa",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nrouter.post('/churnsolution/auth-key', (ctx) => {\n  const { subscriptionExternalId } = ctx.request.body;\n  const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n  ctx.body = { auth_key: authKey };\n});\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n  return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"Hapi",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nserver.route({\n  method: 'POST',\n  path: '/churnsolution/auth-key',\n  handler: (request) => {\n    const { subscriptionExternalId } = request.payload;\n    const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n    return { auth_key: authKey };\n  },\n});\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n  return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"Next.js",language:"typescript",extension:"ts",snippets:[{label:"App Router",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nexport async function POST(request: Request) {\n  const { subscriptionExternalId } = await request.json();\n  const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n  return NextResponse.json({ auth_key: authKey });\n}\n\nfunction getSha256HmacHash(secretKey: string, subscriptionExternalId: string): string {\n  return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},{label:"Pages Router",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nexport default function handler(req: NextApiRequest, res: NextApiResponse) {\n  const { subscriptionExternalId } = req.body;\n  const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n  res.status(200).json({ auth_key: authKey });\n}\n\nfunction getSha256HmacHash(secretKey: string, subscriptionExternalId: string): string {\n  return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"node:http",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nfunction handleAuthKey(req, res) {\n  let body = '';\n  req.on('data', (chunk) =>
3303 {\n    body += chunk;\n    if (body.length > 1e4) req.destroy();\n  });\n\n  req.on('end', () => {\n    const { subscriptionExternalId } = JSON.parse(body);\n    const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n    res.writeHead(200, { 'Content-Type': 'application/json' });\n    res.end(JSON.stringify({ auth_key: authKey }));\n  });\n}\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n  return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},]},{label:"Python",frameworks:[{label:"Flask",language:"python",extension:"py",snippets:[{label:"",code:'CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\n\[email protected]("/churnsolution/auth-key")\ndef generate_auth_key():\n    subscription_external_id = request.json["subscriptionExternalId"]\n    auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n    return jsonify(auth_key=auth_key)\n\n\ndef get_sha256_hmac_hash(secret_key: str, subscription_external_id: str) -> str:\n    return hmac.new(\n        secret_key.encode(),\n        subscription_external_id.encode(),\n        hashlib.sha256,\n    ).hexdigest()'},]},{label:"FastAPI",language:"python",extension:"py",snippets:[{label:"",code:'CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\n\[email protected]("/churnsolution/auth-key")\nasync def generate_auth_key(subscription_external_id: str = Body(alias="subscriptionExternalId")):\n    auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n    return {"auth_key": auth_key}\n\n\ndef get_sha256_hmac_hash(secret_key: str, subscription_external_id: str) -> str:\n    return hmac.new(\n        secret_key.encode(),\n        subscription_external_id.encode(),\n        hashlib.sha256,\n    ).hexdigest()'},]},{label:"Django",language:"python",extension:"py",snippets:[{label:"",code:'CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\n\n@require_POST\ndef generate_auth_key(request):\n    subscription_external_id = json.loads(request.body)["subscriptionExternalId"]\n    auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n    return JsonResponse({"auth_key": auth_key})\n\n\ndef get_sha256_hmac_hash(secret_key: str, subscription_external_id: str) -> str:\n    return hmac.new(\n        secret_key.encode(),\n        subscription_external_id.encode(),\n        hashlib.sha256,\n    ).hexdigest()'},]},{label:"Django REST Framework",language:"python",extension:"py",snippets:[{label:"",code:'CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\n\n@api_view(["POST"])\n@permission_classes([IsAuthenticated])\ndef generate_auth_key(request):\n    subscription_external_id = request.data["subscriptionExternalId"]\n    auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n    return Response({"auth_key": auth_key})\n\n\ndef get_sha256_hmac_hash(secret_key: str, subscription_external_id: str) -> str:\n    return hmac.new(\n        secret_key.encode(),\n        subscription_external_id.encode(),\n        hashlib.sha256,\n    ).hexdigest()'},]},{label:"Tornado",language:"python",extension:"py",snippets:[{label:"",code:'CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\n\nclass ChurnSolutionAuthKeyHandler(tornado.web.RequestHandler):\n    def post(self):\n        subscription_external_id = json.loads(self.request.body)["subscriptionExternalId"]\n        auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n        self.write({"auth_key": auth_key})\n\n\ndef get_sha256_hmac_hash(secret_key: str, subscription_external_id: str) -> str:\n    return hmac.new(\n        secret_key.encode(),\n        subscription_external_id.encode(),\n        hashlib.sha256,\n    ).hexdigest()'},]},]},{label:"PHP",frameworks:[{label:"Laravel",language:"php",extension:"php",snippets:[{label:"",code:"private const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\npublic function generateAuthKey(Request $request): JsonResponse\n{\n    $subscriptionExternalId = $request->input('subscriptionExternalId');\n    $authKey = self::getSha256HmacHash(self::CHURNSOLUTION_SECRET_KEY, $subscriptionExternalId);\n\n    return response()->json(['auth_key' => $authKey]);\n}\n\nprivate static function getSha256HmacHash(string $secretKey, string $subscriptionExternalId): string\n{\n    return hash_hmac('sha256', $subscriptionExternalId, $secretKey);\n}"},]},{label:"Symfony",language:"php",extension:"php",snippets:[{label:"",code:"private const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\n#[Route('/churnsolution/auth-key', methods: ['POST'])]\npublic function generateAuthKey(Request $request): JsonResponse\n{\n    $subscriptionExternalId = $request->getPayload()->getString('subscriptionExternalId');\n    $authKey = self::getSha256HmacHash(self::CHURNSOLUTION_SECRET_KEY, $subscriptionExternalId);\n\n    return $this->json(['auth_key' => $authKey]);\n}\n\nprivate static function getSha256HmacHash(string $secretKey, string $subscriptionExternalId): string\n{\n    return hash_hmac('sha256', $subscriptionExternalId, $secretKey);\n}"},]},{label:"Slim 4",language:"php",extension:"php",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\n$app->post('/churnsolution/auth-key', function (Request $request, Response $response): Response {\n    $body = (array) $request->getParsedBody();\n    $authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, $body['subscriptionExternalId']);\n\n    $response->getBody()->write(json_encode(['auth_key' =>
3303 $authKey], JSON_THROW_ON_ERROR));\n\n    return $response->withHeader('Content-Type', 'application/json');\n});\n\nfunction getSha256HmacHash(string $secretKey, string $subscriptionExternalId): string\n{\n    return hash_hmac('sha256', $subscriptionExternalId, $secretKey);\n}"},]},{label:"CodeIgniter 4",language:"php",extension:"php",snippets:[{label:"",code:"private const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\npublic function generateAuthKey()\n{\n    $subscriptionExternalId = $this->request->getJsonVar('subscriptionExternalId');\n    $authKey = self::getSha256HmacHash(self::CHURNSOLUTION_SECRET_KEY, $subscriptionExternalId);\n\n    return $this->respond(['auth_key' => $authKey]);\n}\n\nprivate static function getSha256HmacHash(string $secretKey, string $subscriptionExternalId): string\n{\n    return hash_hmac('sha256', $subscriptionExternalId, $secretKey);\n}"},]},{label:"WordPress",language:"php",extension:"php",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nfunction churnsolution_generate_auth_key(WP_REST_Request $request): array\n{\n    $subscription_external_id = $request->get_param('subscriptionExternalId');\n    $auth_key = churnsolution_get_sha256_hmac_hash(\n        CHURNSOLUTION_SECRET_KEY,\n        $subscription_external_id,\n    );\n\n    return ['auth_key' => $auth_key];\n}\n\nfunction churnsolution_get_sha256_hmac_hash(string $secret_key, string $subscription_external_id): string\n{\n    return hash_hmac('sha256', $subscription_external_id, $secret_key);\n}"},]},{label:"No framework",language:"php",extension:"php",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nheader('Content-Type: application/json');\n\n$body = json_decode(file_get_contents('php://input') ?: '{}', true);\n$authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, $body['subscriptionExternalId']);\n\necho json_encode(['auth_key' => $authKey], JSON_THROW_ON_ERROR);\n\nfunction getSha256HmacHash(string $secretKey, string $subscriptionExternalId): string\n{\n    return hash_hmac('sha256', $subscriptionExternalId, $secretKey);\n}"},]},]},{label:"Java",frameworks:[{label:"Spring Boot",language:"java",extension:"java",snippets:[{label:"",code:'private static final String CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\n@PostMapping("/churnsolution/auth-key")\npublic ResponseEntity<Map<String, String>> generateAuthKey(String subscriptionExternalId)\n        throws NoSuchAlgorithmException, InvalidKeyException {\n    String authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n    return ResponseEntity.ok(Map.of("auth_key", authKey));\n}\n\nprivate static String getSha256HmacHash(String secretKey, String subscriptionExternalId)\n        throws NoSuchAlgorithmException, InvalidKeyException {\n    Mac sha256HMAC = Mac.getInstance("HmacSHA256");\n    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");\n    sha256HMAC.init(secretKeySpec);\n\n    byte[] hash = (sha256HMAC.doFinal(subscriptionExternalId.getBytes()));\n    StringBuffer result = new StringBuffer();\n    for (byte b : hash) {\n        result.append(String.format("%02x", b));\n    }\n    return result.toString();\n}'},]},{label:"Jakarta EE / JAX-RS",language:"java",extension:"java",snippets:[{label:"",code:'private static final String CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\n@POST\n@Path("/churnsolution/auth-key")\n@Produces(MediaType.APPLICATION_JSON)\npublic Response generateAuthKey(@QueryParam("subscriptionExternalId") String subscriptionExternalId)\n        throws NoSuchAlgorithmException, InvalidKeyException {\n    String authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n    return Response.ok(Map.of("auth_key", authKey)).build();\n}\n\nprivate static String getSha256HmacHash(String secretKey, String subscriptionExternalId)\n        throws NoSuchAlgorithmException, InvalidKeyException {\n    Mac sha256HMAC = Mac.getInstance("HmacSHA256");\n    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");\n    sha256HMAC.init(secretKeySpec);\n\n    byte[] hash = (sha256HMAC.doFinal(subscriptionExternalId.getBytes()));\n    StringBuffer result = new StringBuffer();\n    for (byte b : hash) {\n        result.append(String.format("%02x", b));\n    }\n    return result.toString();\n}'},]},{label:"Micronaut",language:"java",extension:"java",snippets:[{label:"",code:'private static final Str
3303ing CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\n@Post("/churnsolution/auth-key")\npublic HttpResponse<Map<String, String>> generateAuthKey(@QueryValue String subscriptionExternalId)\n        throws NoSuchAlgorithmException, InvalidKeyException {\n    String authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n    return HttpResponse.ok(Map.of("auth_key", authKey));\n}\n\nprivate static String getSha256HmacHash(String secretKey, String subscriptionExternalId)\n        throws NoSuchAlgorithmException, InvalidKeyException {\n    Mac sha256HMAC = Mac.getInstance("HmacSHA256");\n    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");\n    sha256HMAC.init(secretKeySpec);\n\n    byte[] hash = (sha256HMAC.doFinal(subscriptionExternalId.getBytes()));\n    StringBuffer result = new StringBuffer();\n    for (byte b : hash) {\n        result.append(String.format("%02x", b));\n    }\n    return result.toString();\n}'},]},{label:"Javalin",language:"java",extension:"java",snippets:[{label:"",code:'private static final String CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\napp.post("/churnsolution/auth-key", ctx -> {\n    String subscriptionExternalId = ctx.formParam("subscriptionExternalId");\n    String authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n    ctx.json(Map.of("auth_key", authKey));\n});\n\nprivate static String getSha256HmacHash(String secretKey, String subscriptionExternalId)\n        throws NoSuchAlgorithmException, InvalidKeyException {\n    Mac sha256HMAC = Mac.getInstance("HmacSHA256");\n    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");\n    sha256HMAC.init(secretKeySpec);\n\n    byte[] hash = (sha256HMAC.doFinal(subscriptionExternalId.getBytes()));\n    StringBuffer result = new StringBuffer();\n    for (byte b : hash) {\n        result.append(String.format("%02x", b));\n    }\n    return result.toString();\n}'},]},{label:"Spark Java",language:"java",extension:"java",snippets:[{label:"",code:'private static final String CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\npost("/churnsolution/auth-key", (req, res) -> {\n    res.type("application/json");\n\n    String subscriptionExternalId = req.queryParams("subscriptionExternalId");\n    String authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n    return new Gson().toJson(Map.of("auth_key", authKey));\n});\n\nprivate static String getSha256HmacHash(String secretKey, String subscriptionExternalId)\n        throws NoSuchAlgorithmException, InvalidKeyException {\n    Mac sha256HMAC = Mac.getInstance("HmacSHA256");\n    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");\n    sha256HMAC.init(secretKeySpec);\n\n    byte[] hash = (sha256HMAC.doFinal(subscriptionExternalId.getBytes()));\n    StringBuffer result = new StringBuffer();\n    for (byte b : hash) {\n        result.append(String.format("%02x", b));\n    }\n    return result.toString();\n}'},]},]},{label:"Go",frameworks:[{label:"net/http",language:"go",extension:"go",snippets:[{label:"",code:'const churnsolutionSecretKey = "YOUR_SECRET_KEY"\n\nfunc generateAuthKey(w http.ResponseWriter, r *http.Request) {\n	var body struct {\n		SubscriptionExternalID string `json:"subscriptionExternalId"`\n	}\n	if err := json.NewDecoder(r.Body).Decode(&body); err != nil {\n		http.Error(w, `{"error":"invalid JSON body"}`, http.StatusBadRequest)\n		return\n	}\n\n	authKey := getSha256HmacHash(churnsolutionSecretKey, body.SubscriptionExternalID)\n\n	w.Header().Set("Content-Type", "application/json")\n	_ = json.NewEncoder(w).Encode(map[string]string{"auth_key": authKey})\n}\n\nfunc getSha256HmacHash(secretKey string, subscriptionExternalID string) string {\n	sha256HMAC := hmac.New(sha256.New, []byte(secretKey))\n	sha256HMAC.Write([]byte(subscriptionExternalID))\n\n	return hex.EncodeToString(sha256HMAC.Sum(nil))\n}'},]},{label:"Gin",language:"go",extension:"go",snippets:[{label:"",code:'const churnsolutionSecretKey = "YOUR_SECRET_KEY"\n\nfunc generateAuthKey(c *gin.Context) {\n	var body struct {\n		SubscriptionExternalID string `json:"subscriptionExternalId" binding:"required"`\n	}\n	if err := c.ShouldBindJSON(&body); err != nil {\n		c.JSON(http.StatusBadRequest, gin.H{"error": "subscriptionExternalId is required"})\n		return\n	}\n\n	authKey := getSha256HmacHash(churnsolutionSecretKey, body.SubscriptionExternalID)\n\n	c.JSON(http.StatusOK, gin.H{"auth_key": authKey})\n}\n\nfunc getSha256HmacHash(secretKey string, subscriptionExternalID string) string {\n	sha256HMAC := hmac.New(sha256.New, []byte(secretKey))\n	sha256HMAC.Write([]byte(subscriptionExternalID))\n\n	return hex.EncodeToString(sha256HMAC.Sum(nil))\n}'},]},{label:"Echo",language:"go",extension:"go",snippets:[{label:"",code:'const churnsolutionSecretKey = "YOUR_SECRET_KEY"\n\nfunc generateAuthKey(c echo.Context) error {\n	var body struct {\n		SubscriptionExternalID string `json:"subscriptionExternalId"`\n	}\n	if err := c.Bind(&body); err != nil {\n		return echo.NewHTTPError(http.StatusBadRequest, "invalid JSON body")\n	}\n\n	authKey := getSha256HmacHash(churnsolutionSecretKey, body.SubscriptionExternalID)\n\n	return c.JSON(http.StatusOK, map[string]string{"auth_key": authKey})\n}\n\nfunc getSha256HmacHash(secretKey string, subscriptionExternalID string) string {\n	sha256HMAC := hmac.New(sha256.New, []byte(secretKey))\n	sha256HMAC.Write([]byte(subscriptionExternalID))\n\n	return hex.EncodeToString(sha256HMAC.Sum(nil))\n}'},]},{label:"Fiber",language:"go",extension:"go",snippets:[{label:"",code:'const churnsolutionSecretKey = "YOUR_SECRET_KEY"\n\nfunc generateAuthKey(c *fiber.Ctx) error {\n	var body struct {\n		SubscriptionExternalID string `json:"subscriptionExternalId"`\n	}\n	if err := c.BodyParser(&body); err != nil {\n		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invali
3303d JSON body"})\n	}\n\n	authKey := getSha256HmacHash(churnsolutionSecretKey, body.SubscriptionExternalID)\n\n	return c.JSON(fiber.Map{"auth_key": authKey})\n}\n\nfunc getSha256HmacHash(secretKey string, subscriptionExternalID string) string {\n	sha256HMAC := hmac.New(sha256.New, []byte(secretKey))\n	sha256HMAC.Write([]byte(subscriptionExternalID))\n\n	return hex.EncodeToString(sha256HMAC.Sum(nil))\n}'},]},{label:"Chi",language:"go",extension:"go",snippets:[{label:"",code:'const churnsolutionSecretKey = "YOUR_SECRET_KEY"\n\nfunc generateAuthKey(w http.ResponseWriter, r *http.Request) {\n	var body struct {\n		SubscriptionExternalID string `json:"subscriptionExternalId"`\n	}\n	if err := json.NewDecoder(r.Body).Decode(&body); err != nil {\n		render.Status(r, http.StatusBadRequest)\n		render.JSON(w, r, map[string]string{"error": "invalid JSON body"})\n		return\n	}\n\n	authKey := getSha256HmacHash(churnsolutionSecretKey, body.SubscriptionExternalID)\n\n	render.JSON(w, r, map[string]string{"auth_key": authKey})\n}\n\nfunc getSha256HmacHash(secretKey string, subscriptionExternalID string) string {\n	sha256HMAC := hmac.New(sha256.New, []byte(secretKey))\n	sha256HMAC.Write([]byte(subscriptionExternalID))\n\n	return hex.EncodeToString(sha256HMAC.Sum(nil))\n}'},]},]},{label:"Ruby",frameworks:[{label:"Ruby on Rails",language:"ruby",extension:"rb",snippets:[{label:"",code:"CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY'.freeze\n\ndef generate_auth_key\n  subscription_external_id = params.require(:subscriptionExternalId)\n  auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n  render json: { auth_key: auth_key }\nend\n\nprivate\n\ndef get_sha256_hmac_hash(secret_key, subscription_external_id)\n  OpenSSL::HMAC.hexdigest('SHA256', secret_key, subscription_external_id)\nend"},]},{label:"Sinatra",language:"ruby",extension:"rb",snippets:[{label:"",code:"CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY'.freeze\n\npost '/churnsolution/auth-key' do\n  content_type :json\n\n  subscription_external_id = JSON.parse(request.body.read)['subscriptionExternalId']\n  auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, subscription_external_id)\n\n  { auth_key: auth_key }.to_json\nend\n\ndef get_sha256_hmac_hash(secret_key, subscription_external_id)\n  OpenSSL::HMAC.hexdigest('SHA256', secret_key, subscription_external_id)\nend"},]},{label:"Grape",language:"ruby",extension:"rb",snippets:[{label:"",code:"CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY'.freeze\n\nparams do\n  requires :subscriptionExternalId, type: String, allow_blank: false\nend\npost '/churnsolution/auth-key' do\n  auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, params[:subscriptionExternalId])\n\n  { auth_key: auth_key }\nend\n\nhelpers do\n  def get_sha256_hmac_hash(secret_key, subscription_external_id)\n    OpenSSL::HMAC.hexdigest('SHA256', secret_key, subscription_external_id)\n  end\nend"},]},]},{label:"C#",frameworks:[{label:"ASP.NET Core",language:"csharp",extension:"cs",snippets:[{label:"",code:'private const string ChurnsolutionSecretKey = "YOUR_SECRET_KEY";\n\n[HttpPost("/churnsolution/auth-key")]\npublic IActionResult GenerateAuthKey([FromBody] AuthKeyRequest body)\n{\n    string authKey = GetSha256HmacHash(ChurnsolutionSecretKey, body.SubscriptionExternalId);\n\n    return Ok(new { auth_key = authKey });\n}\n\nprivate static string GetSha256HmacHash(string secretKey, string subscriptionExternalId)\n{\n    using var sha256HMAC = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey));\n    byte[] hash = sha256HMAC.ComputeHash(Encoding.UTF8.GetBytes(subscriptionExternalId));\n\n    var result = new StringBuilder();\n    foreach (byte b in hash)\n    {\n        result.Append(b.ToString("x2"));\n    }\n    return result.ToString();\n}'},]},]},{label:"Kotlin",frameworks:[{label:"Ktor",language:"kotlin",extension:"kt",snippets:[{label:"",code:'const val CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY"\n\npost("/churnsolution/auth-key") {\n    val subscriptionExternalId = call.receiveParameters()["subscriptionExternalId"]!!\n    val authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId)\n\n    call.respond(mapOf("auth_key" to authKey))\n}\n\nfun getSha256HmacHash(secretKey: String, subscriptionExternalId: String): String {\n    val sha256HMAC = Mac.getInstance("HmacSHA256")\n    val secretKeySpec = SecretKeySpec(secretKey.toByteArray(), "HmacSHA256")\n    sha256HMAC.init(secretKeySpec)\n\n    val hash = sha256HMAC.doFinal(subscriptionExternalId.toByteArray())\n    val result = StringBuilder()\n    for (b in hash) {\n        result.append("%02x".format(b))\n    }\n    return result.toString()\n}'},]},]},{label:"Rust",frameworks:[{label:"Axum",language:"rust",extension:"rs",snippets:[{label:"",code:'const CHURNSOLUTION_SECRET_KEY: &str = "YOUR_SECRET_KEY";\n\nasync fn generate_auth_key(Json(body): Json<AuthKeyRequest>) -> Json<Value> {\n    let auth_key = get_sha256_hmac_hash(CHURNSOLUTION_SECRET_KEY, &body.subscription_external_id);\n\n    Json(json!({ "auth_key": auth_key }))\n}\n\nfn get_sha256_hmac_hash(secret_key: &str, subscription_external_id: &str) -> String {\n    let mut sha256_hmac = Hmac::<Sha256>::new_from_slice(secret_key.as_bytes())\n        .expect("HMAC accepts a key of any length");\n    sha256_hmac.update(subscription_external_id.as_bytes());\n\n    hex::encode(sha256_hmac.finalize().into_bytes())\n}'},]},]},{label:"Elixir",frameworks:[{label:"Phoenix",language:"elixir",extension:"ex",snippets:[{label:"",code:'@churnsolution_secret_key "YOUR_SECRET_KEY"\n\ndef generate_auth_key(conn, %{"
3303subscriptionExternalId" => subscription_external_id}) do\n  auth_key = get_sha256_hmac_hash(@churnsolution_secret_key, subscription_external_id)\n\n  json(conn, %{auth_key: auth_key})\nend\n\ndefp get_sha256_hmac_hash(secret_key, subscription_external_id) do\n  :crypto.mac(:hmac, :sha256, secret_key, subscription_external_id)\n  |> Base.encode16(case: :lower)\nend'},]},]},{label:"Serverless & Edge",frameworks:[{label:"AWS Lambda",language:"javascript",extension:"js",snippets:[{label:"",code:"const CHURNSOLUTION_SECRET_KEY = 'YOUR_SECRET_KEY';\n\nexport const handler = async (event) => {\n  const { subscriptionExternalId } = JSON.parse(event.body);\n  const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n  return {\n    statusCode: 200,\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ auth_key: authKey }),\n  };\n};\n\nfunction getSha256HmacHash(secretKey, subscriptionExternalId) {\n  return createHmac('sha256', secretKey).update(subscriptionExternalId).digest('hex');\n}"},]},{label:"Deno",language:"typescript",extension:"ts",snippets:[{label:"",code:'const CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\nasync function generateAuthKey(request: Request): Promise<Response> {\n  const { subscriptionExternalId } = await request.json();\n  const authKey = await getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n  return Response.json({ auth_key: authKey });\n}\n\nasync function getSha256HmacHash(\n  secretKey: string,\n  subscriptionExternalId: string,\n): Promise<string> {\n  const encoder = new TextEncoder();\n  const key = await crypto.subtle.importKey(\n    "raw",\n    encoder.encode(secretKey),\n    { name: "HMAC", hash: "SHA-256" },\n    false,\n    ["sign"],\n  );\n  const hash = await crypto.subtle.sign("HMAC", key, encoder.encode(subscriptionExternalId));\n\n  return Array.from(new Uint8Array(hash))\n    .map((b) => b.toString(16).padStart(2, "0"))\n    .join("");\n}'},]},{label:"Bun",language:"typescript",extension:"ts",snippets:[{label:"",code:'const CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\nasync function generateAuthKey(request: Request): Promise<Response> {\n  const { subscriptionExternalId } = await request.json();\n  const authKey = getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n  return Response.json({ auth_key: authKey });\n}\n\nfunction getSha256HmacHash(secretKey: string, subscriptionExternalId: string): string {\n  return createHmac("sha256", secretKey).update(subscriptionExternalId).digest("hex");\n}'},]},{label:"Cloudflare Workers",language:"typescript",extension:"ts",snippets:[{label:"",code:'const CHURNSOLUTION_SECRET_KEY = "YOUR_SECRET_KEY";\n\nasync function generateAuthKey(request: Request): Promise<Response> {\n  const { subscriptionExternalId } = await request.json<{ subscriptionExternalId: string }>();\n  const authKey = await getSha256HmacHash(CHURNSOLUTION_SECRET_KEY, subscriptionExternalId);\n\n  return Response.json({ auth_key: authKey });\n}\n\nasync function getSha256HmacHash(\n  secretKey: string,\n  subscriptionExternalId: string,\n): Promise<string> {\n  const encoder = new TextEncoder();\n  const key = await crypto.subtle.importKey(\n    "raw",\n    encoder.encode(secretKey),\n    { name: "HMAC", hash: "SHA-256" },\n    false,\n    ["sign"],\n  );\n  const hash = await crypto.subtle.sign("HMAC", key, encoder.encode(subscriptionExternalId));\n\n  return [...new Uint8Array(hash)].map((b) => b.toString(16).padStart(2, "0")).join("");\n}'},]},]},],function(){var e=window.CHR_AUTH_LANGUAGES;if(e){var n='<svg width="12" height="14" viewBox="0 0 12 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 0H1a1 1 0 0 0-1 1v9h1.5V1.5H8V0zm2.5 2.5h-7a1 1 0 0 0-1 1V13a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V3.5a1 1 0 0 0-1-1zM10 12.5H4V4h6v8.5z" fill="currentColor"/></svg>',t='<svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.5 0v8m0 0L3.5 5m3 3 3-3M1 10.5v1a1 1 0 0 0 1 1h9a1 1 0 0 0 1-1v-1" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>';"loading"===document.readyState?document.addEventListener("DOMContentLoaded",c):c()}function a(e,n){var t=document.createElement("option");return t.value=String(n),t.textContent=e,t}function s(e,n){e.innerHTML="";for(var t=0;t<n.length;t++)e.appendChild(a(n[t].label,t))}function r(e,n){var t=e.querySelector(".chr-auth-panel-action-label");if(t&&"1"!==e.dataset.flashing){var a=t.textContent;e.dataset.flashing="1",t.textContent=n,setTimeout(function(){t.textContent=a,e.dataset.flashing="0"},1e3)}}function i(e,n){var t=document.createElement("button");
3303return t.type="button",t.className="chr-auth-panel-action",t.title=e,t.setAttribute("aria-label",e),t.innerHTML=n+'<span class="chr-auth-panel-action-label">'+e+"</span>",t}function o(a){var o=0,c=0,u=0,h=document.createElement("select");h.className="chr-auth-panel-select",h.setAttribute("aria-label","Language"),s(h,e);var l=document.createElement("select");l.className="chr-auth-panel-select",l.setAttribute("aria-label","Framework");var p=document.createElement("div");p.className="chr-auth-panel-controls",p.appendChild(h),p.appendChild(l);var E=document.createElement("div");E.className="chr-auth-panel-tabs",E.setAttribute("role","tablist"),E.setAttribute("aria-label","Variants");var d=document.createElement("div");d.className="chr-auth-panel-spacer";var y=i("Copy",n),S=i("Download",t),g=document.createElement("div");g.className="chr-auth-panel-actions",g.appendChild(y),g.appendChild(S);var b=document.createElement("div");b.className="chr-auth-panel-bar",b.appendChild(E),b.appendChild(d),b.appendChild(g);var x=document.createElement("code"),H=document.createElement("pre");H.appendChild(x);var K=document.createElement("div");K.className="chr-auth-panel-body",K.appendChild(H);var R=document.createElement("div");function C(){return e[o].frameworks[c]}function m(){return C().snippets[u]}function I(){var e=C().snippets,n=e.length>1;E.innerHTML="",E.style.display=n?"":"none",d.style.display=n?"none":"",H.setAttribute("role",n?"tabpanel":"presentation"),n&&e.forEach(function(e,n){var t=document.createElement("button");t.type="button",t.className="chr-auth-panel-tab"+(n===u?" active":""),t.setAttribute("role","tab"),t.setAttribute("aria-selected",String(n===u)),t.textContent=e.label,t.addEventListener("click",function(){u=n,I(),O()}),E.appendChild(t)})}function O(){var e=C();x.className="language-"+e.language,x.textContent=m().code,setTimeout(()=>window.Prism?.highlightAll())}function T(){var n=e[o].frameworks;s(l,n),l.value=String(c),l.style.display=n.length>1?"":"none"}R.className="chr-auth-panel-frame",R.appendChild(b),R.appendChild(K),a.className="chr-auth-panel",a.innerHTML="",a.appendChild(p),a.appendChild(R),h.addEventListener("change",function(){o=Number(h.value),c=0,u=0,T(),I(),O()}),l.addEventListener("change",function(){c=Number(l.value),u=0,I(),O()}),y.addEventListener("click",function(){navigator.clipboard.writeText(m().code),r(y,"Copied")}),S.addEventListener("click",function(){var e,n,t,a;e=m().code,n="churnsolution-auth-key."+C().extension,t=URL.createObjectURL(new Blob([e],{type:"text/plain;charset=utf-8"})),(a=document.createElement("a")).href=t,a.download=n,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(t),r(S,"Downloaded")}),T(),I(),O()}function c(){for(var e=document.querySelectorAll("[data-chr-auth-panel]"),n=0;n<e.length;n++)o(e[n])}}();
3304</script>
3304
3305
3306
3307<style>code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}</style>
vendor: 6,291 bytes, line 3308
3308<script>var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(n,t){var r,i;switch(t=t||{},a.util.type(n)){case"Object":if(i=a.util.objId(n),t[i])return t[i];for(var l in r={},t[i]=r,n)n.hasOwnProperty(l)&&(r[l]=e(n[l],t));return r;case"Array":return i=a.util.objId(n),t[i]?t[i]:(r=[],t[i]=r,n.forEach((function(n,a){r[a]=e(n,t)})),r);default:return n}},getLanguage:function(e){for(;e;){var t=n.exec(e.className);if(t)return t[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,t){e.className=e.className.replace(RegExp(n,"gi"),""),e.classList.add("language-"+t)},currentScript:function(){if("undefined"==typeof document)return null;if(document.currentScript&&"SCRIPT"===document.currentScript.tagName)return document.currentScript;try{throw new Error}catch(r){var e=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(r.stack)||[])[1];if(e){var n=document.getElementsByTagName("script");for(var t in n)if(n[t].src==e)return n[t]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:r,plaintext:r,text:r,txt:r,extend:function(e,n){var t=a.util.clone(a.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(e,n,t,r){var i=(r=r||a.languages)[e],l={};for(var o in i)if(i.hasOwnProperty(o)){if(o==n)for(var s in t)t.hasOwnProperty(s)&&(l[s]=t[s]);t.hasOwnProperty(o)||(l[o]=i[o])}var u=r[e];return r[e]=l,a.languages.DFS(a.languages,(function(n,t){t===u&&n!=e&&(this[n]=l)})),l},DFS:function e(n,t,r,i){i=i||{};var l=a.util.objId;for(var o in n)if(n.hasOwnProperty(o)){t.call(n,o,n[o],r||o);var s=n[o],u=a.util.type(s);"Object"!==u||i[l(s)]?"Array"!==u||i[l(s)]||(i[l(s)]=!0,e(s,t,o,i)):(i[l(s)]=!0,e(s,t,null,i))}}},plugins:{},highlightAll:function(e,n){a.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};a.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),a.hooks.run("before-all-elements-highlight",r);for(var i,l=0;i=r.elements[l++];)a.highlightElement(i,!0===n,r.callback)},highlightElement:function(n,t,r){var i=a.util.getLanguage(n),l=a.languages[i];a.util.setLanguage(n,i);var o=n.parentElement;o&&"pre"===o.nodeName.toLowerCase()&&a.util.setLanguage(o,i);var s={element:n,language:i,grammar:l,code:n.textContent};function u(e){s.highlightedCode=e,a.hooks.run("before-insert",s),s.element.innerHTML=s.highlightedCode,a.hooks.run("after-highlight",s),a.hooks.run("complete",s),r&&r.call(s.element)}if(a.hooks.run("before-sanity-check",s),(o=s.element.parentElement)&&"pre"===o.nodeName.toLowerCase()&&!o.hasAttribute("tabindex")&&o.setAttribute("tabindex","0"),!s.code)return a.hooks.run("complete",s),void(r&&r.call(s.element));if(a.hooks.run("before-highlight",s),s.grammar)if(t&&e.Worker){var c=new Worker(a.filename);c.onmessage=function(e){u(e.data)},c.postMessage(JSON.stringify({language:s.language,code:s.code,immediateClose:!0}))}else u(a.highlight(s.code,s.grammar,s.language));else u(a.util.encode(s.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};if(a.hooks.run("before-tokenize",r),!r.grammar)throw new Error('The language "'+r.language+'" has no grammar.');return r.tokens=a.tokenize(r.code,r.grammar),a.hooks.run("after-tokenize",r),i.stringify(a.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new s;return u(a,a.head,e),o(e,a,n,a.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=a.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=a.hooks.all[e];if(t&&t.length)for(var r,i=0;r=t[i++];)r(n)}},Token:i};function i(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function l(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function o(e,n,t,r,s,g){for(var f in t)if(t.hasOwnProperty(f)&&t[f]){var h=t[f];h=Array.isArray(h)?h:[h];for(var d=0;d<h.length;++d){if(g&&g.cause==f+","+d)return;var v=h[d],p=v.inside,m=!!v.lookbehind,y=!!v.greedy,k=v.alias;if(y&&!v.pattern.global){var x=v.pattern.toString().match(/[imsuy]*$/)[0];v.pattern=RegExp(v.pattern.source,x+"g")}for(var b=v.pattern||v,w=r.next,A=s;w!==n.tail&&!(g&&A>=g.reach);A+=w.value.length,w=w.next){var P=w.value;if(n.length>e.length)return;if(!(P instanceof i)){var E,S=1;if(y){if(!(E=l(b,A,e,m))||E.index>=e.length)break;var L=E.index,O=E.index+E[0].length,C=A;for(C+=w.value.length;L>=C;)C+=(w=w.next).value.length;if(A=C-=w.value.length,w.value instanceof i)continue;for(var j=w;j!==n.tail&&(C<O||"string"==typeof j.value);j=j.next)S++,C+=j.value.length;S--,P=e.slice(A,C),E.index-=A}else if(!(E=l(b,0,P,m)))continue;L=E.index;var N=E[0],_=P.slice(0,L),M=P.slice(L+N.length),W=A+P.length;g&&W>g.reach&&(g.reach=W);var I=w.prev;if(_&&(I=u(n,I,_),A+=_.length),c(n,I,S),w=u(n,I,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),S>1){var T={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,T),g&&T.reach>g.reach&&(g.reach=T.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;n.next=r,r.prev=n,e.length-=a}if(e.Prism=a,i.stringify=function e(n,t){if("string"==typeof n)return n;if(Array.isArray(n)){var r="";
vendor: 4,184 bytes, lines 3308-3310
3308return n.forEach((function(n){r+=e(n,t)})),r}var i={type:n.type,content:e(n.content,t),tag:"span",classes:["token",n.type],attributes:{},language:t},l=n.alias;l&&(Array.isArray(l)?Array.prototype.push.apply(i.classes,l):i.classes.push(l)),a.hooks.run("wrap",i);var o="";for(var s in i.attributes)o+=" "+s+'="'+(i.attributes[s]||"").replace(/"/g,"&quot;")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'"'+o+">"+i.content+"</"+i.tag+">"},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
3309Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
3310Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}
vendor: 4,227 bytes, lines 3310-3311
3310],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
3311Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2}
3311)*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
3312!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_
3312CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>
3312&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i<s.length;i++)o[s[i]]=e.languages.bash[s[i]];e.languages.sh=e.languages.bash,e.languages.shell=e.languages.bash}(Prism);
3313!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s<n;s++)e=e.replace(/<<self>>/g,(function(){return"(?:"+e+")"}));return e.replace(/<<self>>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<<self>>)*>",2),b=a("\\((?:[^()]|<<self>>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<<self>>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>
3313)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<<self>>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<<self>>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism);
3314Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach((function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}));
3315Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"];
3316!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;
vendor: 5,667 bytes, lines 3316-3319
3316?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!<keyword>)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(/<keyword>/g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism);
3317!function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var e={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:e},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:e},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin}(Prism);
3318!function(e){function n(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(t,a,r,o){if(t.language===a){var c=t.tokenStack=[];t.code=t.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==t.code.indexOf(r=n(a,i));)++i;return c[i]=e,r})),t.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(t,a){if(t.language===a&&t.tokenStack){t.grammar=e.languages[a];var r=0,o=Object.keys(t.tokenStack);!function c(i){for(var u=0;u<i.length&&!(r>=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism);
3319!function(e){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0}
vendor: 4,534 bytes, line 3319
3319,/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;
3319|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(a){/<\?/.test(a.code)&&e.languages["markup-templating"].buildPlaceholders(a,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"php")}))}(Prism);
3320Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/};
3321Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python;
3322!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var n={pattern:/((?:^|[^\\])(?:\\{2}
3322)*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var t="(?:"+["([^a-zA-Z0-9\\s{(\\[<=])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^]|\\((?:[^()\\\\]|\\\\[^])*\\))*\\)","\\{(?:[^{}\\\\]|\\\\[^]|\\{(?:[^{}\\\\]|\\\\[^])*\\})*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^]|\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\])*\\]","<(?:[^<>\\\\]|\\\\[^]|<(?:[^<>\\\\]|\\\\[^])*>)*>"].join("|")+")",i='(?:"(?:\\\\.|[^"\\\\\r\n])*"|(?:\\b[a-zA-Z_]\\w*|[^\\s\0-\\x7F]+)[?!]?|\\$.)';e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp("%r"+t+"[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp("(^|[^:]):"+i),lookbehind:!0,greedy:!0},{pattern:RegExp("([\r\n{(,][ \t]*)"+i+"(?=:(?!:))"),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp("%[qQiIwWs]?"+t),greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp("%x"+t),greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism);
3323!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|<self>)*\\*/",t=0;t<2;t++)a=a.replace(/<self>/g,(function(){return a}));a=a.replace(/<self>/g,(function(){return"[^\\s\\S]"})),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"}
3323,constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism);
3324!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism);
3325!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism);
3326!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*".replace(/<PLAIN>/g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<<prop>>/g,(function(){return t})).replace(/<<value>>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<<prop>>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\\s*:\\s)".replace(/<<prop>>/g,(function(){return t})).replace(/<<key>>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism);</script>
3326
3327</div>
3328
3329	
3330	
3331</div><!-- .entry-content .clear -->
3332
3333	
3334	
3335</article><!-- #post-## -->
3336
3337			</main><!-- #main -->
3338			
3339		
3340	</div><!-- #primary -->
3341
3342
3343	</div> <!-- ast-container -->
3344	</div><!-- #content -->
3345<footer
3346class="site-footer" id="colophon" itemtype="https://schema.org/WPFooter" itemscope="itemscope" itemid="#colophon">
3347				</footer><!-- #colophon -->
3348	</div><!-- #page -->
3349<script type="speculationrules">
3350{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/astra-child/*","/wp-content/themes/astra/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
3351</script>
vendor: 1 bytes, line 3351
3351
3352<script type="text/javascript">
3353_linkedin_partner_id = "6342346";
3354window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
3355window._linkedin_data_partner_ids.push(_linkedin_partner_id);
3356</script>
3356<script type="text/javascript">
3357(function(l) {
3358if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
3359window.lintrk.q=[]}
3360var s = document.getElementsByTagName("script")[0];
3361var b = document.createElement("script");
3362b.type = "text/javascript";b.async = true;
3363b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
3364s.parentNode.insertBefore(b, s);})(window.lintrk);
3365</script>
3365
3366<noscript>
3367<img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=6342346&fmt=gif" />
3368</noscript><style>
3369.chr-chr-footer{display:flex;flex-direction:column;align-items:center;gap:24px;padding:32px;background-color:#0c0e3e;position:relative;overflow:hidden}.chr-chr-footer::after{content:"";position:absolute;top:-350px;right:-160px;width:572px;height:537px;background-image:url(https://wp-admin.churnsolution.online/wp-content/uploads/2023/10/footer-img-300x282.png);background-size:cover}.chr-chr-footer>*{position:relative;z-index:10}.chr-chr-footer-container{display:grid;align-items:flex-start;justify-content:space-between;grid-template-columns:minmax(0,0.8fr) auto minmax(0,1fr);width:100%;max-width:1400px;gap:32px}.chr-chr-footer-brand-section{display:flex;flex-direction:column;align-items:flex-start;gap:32px;max-width:300px}.chr-chr-footer-brand-content{display:flex;flex-direction:column;align-items:flex-start;gap:16px;color:#fff}.chr-chr-footer-logo{height:45px;aspect-ratio:191/35}.chr-chr-footer-tagline{font-weight:400;font-size:14px;letter-spacing:0;line-height:22.4px;margin:0}.chr-chr-footer-nav-heading,.chr-chr-footer-nav-link{letter-spacing:0;line-height:normal;white-space:nowrap}.chr-chr-footer-badge{width:100%;height:auto;object-fit:contain}.chr-chr-footer-navigation{display:flex;justify-content:center;align-items:start;gap:32px;max-width:100%}.chr-chr-footer-nav-column{display:flex;flex-direction:column;align-items:flex-start;max-width:fit-content;gap:24px}.chr-chr-footer-nav-heading{width:fit-content;margin:0;font-weight:500;color:#efc130;font-size:18px}.chr-chr-footer-nav-list{display:flex;flex-direction:column;align-items:flex-start;gap:12px;list-style:none;margin:0;padding:0}.chr-chr-footer-nav-list li{margin:0;padding:0}.chr-chr-footer-nav-link{display:block;font-weight:300!important;color:#fff!important;font-size:14px;text-decoration:none;cursor:pointer;transition:opacity .2s}.chr-chr-footer-copyright,.chr-chr-footer-stripe-text{margin:0;font-weight:400;font-size:14px;letter-spacing:0;line-height:21px}.chr-chr-footer-nav-link:hover,.chr-chr-footer-social-icon:hover{opacity:.8}.chr-chr-footer-social-group,.chr-chr-footer-social-section{display:flex;flex-direction:column;max-width:fit-content;align-items:flex-start;gap:16px}.chr-chr-footer-social-section{max-width:320px}.chr-chr-footer-stripe-text{color:#fff}.chr-chr-footer-stripe-badge{margin:0}.chr-chr-footer-social-links{display:flex;align-items:center;gap:16px;flex-wrap:wrap;width:100%}.chr-chr-footer-social-icon{width:24px;height:24px;display:inline-block;color:#fff!important;transition:opacity .2s}.chr-chr-footer-social-icon>svg{width:100%;margin-inline:auto}.chr-chr-footer-social-icon img{width:100%;height:100%;display:block}.chr-chr-footer-copyright{width:100%;color:#fff}@media (max-width:1400px){.chr-chr-footer-container{grid-template-columns:minmax(0,1fr);place-items:center}.chr-chr-footer-brand-content,.chr-chr-footer-brand-section,.chr-chr-footer-social-group{flex-direction:row;align-items:center}.chr-chr-footer-brand-section{max-width:none}.chr-chr-footer-social-section{align-items:center;text-align:center;max-width:none}.chr-chr-footer-nav-link{white-space:normal}.chr-chr-footer-brand-content{flex-wrap:wrap}.chr-chr-footer-social-links{justify-content:center}}@media (max-width:768px){.chr-chr-footer{padding:24px 16px}.chr-chr-footer-container{gap:32px}.chr-chr-footer-brand-section{max-width:none;min-width:100%;justify-content:space-between}.chr-chr-footer-brand-content{flex-direction:column;align-items:flex-start}.chr-chr-footer-logo{height:40px}.chr-chr-footer-navigation{gap:24px}.chr-chr-footer-nav-heading{font-size:16px}.chr-chr-footer-nav-link{font-size:12px}.chr-chr-footer-social-section{width:100%;max-width:100%}.chr-chr-footer-copyright{max-width:100%}}@media (max-width:640px){.chr-chr-footer-brand-section{flex-direction:column;align-items:center;text-align:center;min-width:0}.chr-chr-footer-brand-content{align-items:center}.chr-chr-footer-navigation{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.chr-chr-footer-nav-column,.chr-chr-footer-nav-list{align-items:center;text-align:center;margin-inline:auto}.chr-chr-footer-social-group{flex-direction:column}}@media (max-width:480px){.chr-chr-footer{padding:20px 16px}.chr-chr-footer-social-links{gap:12px}}
3370</style>
3371<footer class="chr-chr-footer">
3372  <div class="chr-chr-footer-container">
3373    <div class="chr-chr-footer-brand-section">
3374      <div class="chr-chr-footer-brand-content">
3375        <svg
3376          xmlns="http://www.w3.org/2000/svg"
3377          width="191"
3378          height="35"
3379          viewBox="0 0 191 35"
3380          fill="none"
3381          class="chr-chr-footer-logo"
3382        >
3383          <path
3384            d="M27.6906 25.7173L15.049 34.1841C14.749 34.3854 14.3947 34.4918 14.0327 34.4893C13.6708 34.4868 13.318 34.3756 13.0208 34.1701L0.772539 25.7187C0.534038 25.5543 0.339161 25.3348 0.204614 25.0791C0.070067 24.8234 -0.000140343 24.5391 2.10625e-07 24.2505V4.48388C-0.000130718 4.0875 0.13228 3.70232 0.376393 3.38898C0.620507 3.07565 0.962459 2.85194 1.34843 2.75308L10.2902 0.455122C12.5769 -0.132683 14.974 -0.151396 17.2697 0.40064L27.1147 2.76845C27.5069 2.86249 27.856 3.08501 28.1056 3.40021C28.3553 3.71541 28.4911 4.10497 28.4912 4.50623V24.2338C28.4911 24.5269 28.4186 24.8155 28.28 25.0742C28.1413 25.3329 27.9409 25.5538 27.6962 25.7173"
3385            fill="#EEBD23"
3386          ></path>
3387          <path
3388            d="M27.5474 10.6765H26.7313H26.0641V9.92776C26.0515 9.1371 26.0388 8.34643 26.022 7.55297C26.0091 7.46808 25.9792 7.38663 25.9341 7.31344C25.889 7.24025 25.8295 7.17682 25.7593 7.12691C18.9764 2.27256 9.5978 2.253 2.78401 7.06405C2.67423 7.12797 2.58397 7.22034 2.52287 7.3313C2.46176 7.44226 2.4321 7.56764 2.43707 7.69406C2.41319 10.4586 2.37105 13.2231 2.33594 15.9877C2.33594 16.1343 2.33594 16.2824 2.33594 16.4542H9.88293C9.91443 16.3982 9.9403 16.3393 9.96019 16.2782C10.1262 15.4969 10.5048 14.7759 11.0548 14.1941C11.6047 13.6122 12.3049 13.1918 13.0787 12.9787C13.8526 12.7656 14.6704 12.7681 15.443 12.9859C16.2155 13.2037 16.9131 13.6283 17.4594 14.2136C17.4774 14.233 17.4972 14.2508 17.5184 14.2666H19.9751C19.9091 14.1353 19.8571 14.0306 19.7981 13.9314C17.3077 9.6819 11.1176 9.71124 8.64828 13.9928C8.46989 14.3044 8.40809 14.4008 7.93473 14.4119C7.30547 14.4119 6.67058 14.4035 6.04552 14.4035H4.41757C4.41757 14.2164 4.41757 14.0976 4.41757 13.9775C4.44145 12.2676 4.47376 10.5578 4.47937 8.84653C4.46641 8.70508 4.49627 8.563 4.5651 8.43854C4.63392 8.31409 4.73858 8.21293 4.86564 8.14806C6.62968 7.0557 8.57865 6.29126 10.6175 5.89201C15.2092 5.01334 19.5326 5.7174 23.5597 8.11733C23.7018 8.18377 23.8203 8.29165 23.8993 8.42664C23.9783 8.56163 24.0142 8.71733 24.0021 8.87307C24.0021 9.46817 24.0059 10.0637 24.0134 10.6598H22.5568C22.4885 10.6597 22.4214 10.6775 22.3622 10.7113C22.303 10.7451 22.2537 10.7938 22.2193 10.8525C22.1849 10.9111 22.1666 10.9777 22.1662 11.0457C22.1657 11.1136 22.1832 11.1804 22.2169 11.2395L23.2001 12.9354L23.4628 13.3936L23.8659 14.092L24.7016 15.5462C24.7359 15.6051 24.7852 15.654 24.8445 15.6879C24.9038 15.7219 24.971 15.7398 25.0394 15.7398C25.1079 15.7398 25.1751 15.7219 25.2344 15.6879C25.2937 15.654 25.3429 15.6051 25.3772 15.5462L26.633 13.4019L26.9406 12.8767L27.6204 11.7172L27.8901 11.2576C27.9243 11.1988 27.9423 11.132 27.9424 11.0641C27.9425 10.9961 27.9247 10.9293 27.8907 10.8704C27.8567 10.8114 27.8078 10.7623 27.7488 10.7281C27.6898 10.6938 27.6227 10.6756 27.5544 10.6751"
3389            fill="#0F124D"
3390          ></path>
3391          <path
3392            d="M18.489 18.2004C17.5732 21.553 13.615 22.637 11.119 20.2231C11.0451 20.1454 10.9615 20.0774 10.8704 20.0206H8.48252C8.53168 20.1323 8.55977 20.2036 8.59629 20.272C9.23858 21.4309 10.2262 22.3633 11.4233 22.941C12.6204 23.5186 13.9681 23.713 15.2809 23.4975C17.3105 23.1427 18.8303 22.0573 19.8754 20.2958C19.9624 20.1491 20.0467 19.9605 20.2897 19.9605C21.5539 19.9605 22.8279 19.9451 24.2816 19.9451C24.1412 20.3558 24.0695 20.7107 23.8883 20.9705C21.5117 24.3846 18.3513 26.8614 14.5687 28.5698C14.3494 28.6537 14.1061 28.6507 13.8889 28.5614C10.7875 27.1561 8.08783 25.2367 5.89944 22.6747L6.62001 22.2738L7.08914 22.014C7.14915 21.9806 7.19927 21.9322 7.23448 21.8734C7.26969 21.8147 7.28876 21.7478 7.28975 21.6795C7.29075 21.6111 7.27364 21.5437 7.24016 21.484C7.20667 21.4243 7.15798 21.3744 7.09898 21.3393L6.39667 20.9202L5.10583 20.1533L4.9471 20.0597L2.79383 18.7815C2.73481 18.7464 2.66756 18.7274 2.59883 18.7264C2.5301 18.7254 2.46231 18.7423 2.40226 18.7756C2.34221 18.8089 2.292 18.8573 2.25669 18.9159C2.22138 18.9746 2.2022 19.0414 2.20108 19.1098L2.17158 21.0725V21.6033L2.15895 22.4135L2.13506 24.0982C2.13394 24.1665 2.15094 24.2339 2.18437 24.2936C2.21779 24.3532 2.26645 24.4031 2.32543 24.4381C2.38441 24.4731 2.45163 24.492 2.5203 24.4929C2.58898 24.4938 2.65668 24.4767 2.71658 24.4433L4.06922 23.6931C6.72394 26.8921 10.0655 29.232 13.9858 30.8426C14.1504 30.9027 14.3311 30.9027 14.4957 30.8426C18.739 29.0951 22.318 26.4842 25.123 22.834C25.5298 22.3338 25.8497 21.7696 26.0697 21.1647V17.8833H18.5944C18.5564 17.9936 18.5171 18.0928 18.489 18.1948"
3393            fill="#0F124D"
3394          ></path>
3395          <path
3396            d="M40.4875 18.0027C40.4875 16.6146 40.7975 15.3748 41.4174 14.2832C42.0508 13.1782 42.9065 12.3224 43.9846 11.716C45.0762 11.0961 46.2958 10.7861 47.6435 10.7861C49.2202 10.7861 50.6015 11.1904 51.7874 11.999C52.9733 12.8076 53.8021 13.9261 54.2738 15.3546H51.0193C50.6958 14.6808 50.2376 14.1754 49.6447 13.8385C49.0652 13.5016 48.3914 13.3332 47.6232 13.3332C46.8012 13.3332 46.0667 13.5286 45.4199 13.9194C44.7865 14.2967 44.2879 14.8358 43.924 
339615.5365C43.5736 16.2373 43.3984 17.0594 43.3984 18.0027C43.3984 18.9326 43.5736 19.7546 43.924 20.4689C44.2879 21.1696 44.7865 21.7154 45.4199 22.1062C46.0667 22.4836 46.8012 22.6722 47.6232 22.6722C48.3914 22.6722 49.0652 22.5038 49.6447 22.1669C50.2376 21.8165 50.6958 21.3044 51.0193 20.6306H54.2738C53.8021 22.0725 52.9733 23.1978 51.7874 24.0064C50.615 24.8015 49.2337 25.199 47.6435 25.199C46.2958 25.199 45.0762 24.8958 43.9846 24.2894C42.9065 23.6695 42.0508 22.8137 41.4174 21.7222C40.7975 20.6306 40.4875 19.3908 40.4875 18.0027Z"
3397            fill="currentColor"
3398          ></path>
3399          <path
3400            d="M62.9979 13.7172C63.8469 13.7172 64.6016 13.9059 65.2619 14.2832C65.9223 14.6471 66.4344 15.1929 66.7982 15.9206C67.1756 16.6348 67.3642 17.4973 67.3642 18.5081V25.0778H64.5342V18.8921C64.5342 18.0027 64.3118 17.3221 63.8671 16.8505C63.4224 16.3653 62.816 16.1227 62.0478 16.1227C61.2662 16.1227 60.6463 16.3653 60.1881 16.8505C59.7434 17.3221 59.521 18.0027 59.521 18.8921V25.0778H56.691V10.1191H59.521V15.2737C59.8849 14.7886 60.37 14.4113 60.9765 14.1417C61.5829 13.8587 62.2567 13.7172 62.9979 13.7172Z"
3401            fill="currentColor"
3402          ></path>
3403          <path
3404            d="M80.6276 13.8789V25.0778H77.7773V23.6627C77.4135 24.1479 76.9351 24.532 76.3421 24.815C75.7626 25.0845 75.1293 25.2193 74.442 25.2193C73.566 25.2193 72.7911 25.0373 72.1173 24.6735C71.4435 24.2961 70.9112 23.7503 70.5204 23.0361C70.143 22.3084 69.9544 21.4459 69.9544 20.4486V13.8789H72.7844V20.0444C72.7844 20.9338 73.0067 21.6211 73.4515 22.1062C73.8962 22.5779 74.5026 22.8137 75.2708 22.8137C76.0524 22.8137 76.6656 22.5779 77.1103 22.1062C77.555 21.6211 77.7773 20.9338 77.7773 20.0444V13.8789H80.6276Z"
3405            fill="currentColor"
3406          ></path>
3407          <path
3408            d="M86.2499 15.6174C86.6137 15.0244 87.0854 14.5595 87.6649 14.2226C88.2579 13.8857 88.9317 13.7172 89.6863 13.7172V16.6888H88.9384C88.049 16.6888 87.3752 16.8976 86.917 17.3154C86.4722 17.7332 86.2499 18.4609 86.2499 19.4986V25.0778H83.4199V13.8789H86.2499V15.6174Z"
3409            fill="currentColor"
3410          ></path>
3411          <path
3412            d="M97.7983 13.7172C99.1325 13.7172 100.211 14.1417 101.033 14.9907C101.855 15.8263 102.266 16.9987 102.266 18.5081V25.0778H99.4357V18.8921C99.4357 18.0027 99.2133 17.3221 98.7686 16.8505C98.3239 16.3653 97.7175 16.1227 96.9493 16.1227C96.1677 16.1227 95.5478 16.3653 95.0896 16.8505C94.6449 17.3221 94.4225 18.0027 94.4225 18.8921V25.0778H91.5925V13.8789H94.4225V15.2737C94.7999 14.7886 95.2783 14.4113 95.8577 14.1417C96.4507 13.8587 97.0976 13.7172 97.7983 13.7172Z"
3413            fill="currentColor"
3414          ></path>
3415          <path
3416            d="M114.645 25.2193C113.662 25.2193 112.772 25.0508 111.977 24.7139C111.195 24.377 110.575 23.8918 110.117 23.2585C109.659 22.6251 109.423 21.8771 109.41 21.0147H112.442C112.482 21.5941 112.685 22.0523 113.048 22.3892C113.426 22.7261 113.938 22.8946 114.585 22.8946C115.245 22.8946 115.764 22.7396 116.141 22.4297C116.519 22.1062 116.707 21.6885 116.707 21.1764C116.707 20.7586 116.579 20.415 116.323 20.1454C116.067 19.8759 115.744 19.667 115.353 19.5188C114.975 19.3571 114.45 19.1819 113.776 18.9932C112.86 18.7237 112.112 18.4609 111.532 18.2048C110.966 17.9353 110.474 17.5378 110.057 17.0122C109.652 16.4731 109.45 15.7589 109.45 14.8695C109.45 14.0339 109.659 13.3062 110.077 12.6863C110.495 12.0664 111.081 11.5947 111.836 11.2713C112.59 10.9344 113.453 10.7659 114.423 10.7659C115.878 10.7659 117.058 11.123 117.96 11.8373C118.877 12.538 119.382 13.5218 119.477 14.7886H116.364C116.337 14.3034 116.128 13.9059 115.737 13.5959C115.36 13.2725 114.854 13.1108 114.221 13.1108C113.668 13.1108 113.224 13.2523 112.887 13.5353C112.563 13.8183 112.402 14.2293 112.402 14.7684C112.402 15.1457 112.523 15.4624 112.765 15.7185C113.021 15.961 113.331 16.1632 113.695 16.3249C114.073 16.4731 114.598 16.6483 115.272 16.8505C116.188 17.12 116.936 17.3895 117.516 17.659C118.095 17.9286 118.594 18.3329 119.012 18.8719C119.429 19.411 119.638 20.1185 119.638 20.9944C119.638 21.7491 119.443 22.4499 119.052 23.0967C118.661 23.7436 118.089 24.2624 117.334 24.6533C116.579 25.0306 115.683 25.2193 114.645 25.2193Z"
3417            fill="currentColor"
3418          ></path>
3419          <path
3420            d="M127.065 25.2597C125.986 25.2597 125.016 25.0239 124.154 24.5522C123.291 24.067 122.611 23.3865 122.112 22.5105C121.627 21.6346 121.384 20.6238 121.384 19.4784C121.384 18.3329 121.634 17.3221 122.132 16.4462C122.644 15.5702 123.338 14.8964 124.214 14.4247C125.09 13.9396 126.067 13.697 127.145 13.697C128.224 13.697 129.201 13.9396 130.077 14.4247C130.952 14.8964 131.64 15.5702 132.138 16.4462C132.651 17.3221 132.907 18.3329 132.907 19.4784C132.907 20.6238 132.644 21.6346 132.118 22.5105C131.606 23.3865 130.905 24.067 130.016 24.5522C129.14 25.0239 128.156 25.2597 127.065 25.2597ZM127.065 22.7935C127.577 22.7935 128.055 22.6722 128.5 22.4297C128.958 22.1736 129.322 21.7963 129.591 21.2977C129.861 20.799 129.996 20.1926 129.996 19.4784C129.99
34206 18.4137 129.713 17.5984 129.147 17.0324C128.594 16.4529 127.914 16.1632 127.105 16.1632C126.296 16.1632 125.616 16.4529 125.063 17.0324C124.524 17.5984 124.255 18.4137 124.255 19.4784C124.255 20.543 124.518 21.365 125.043 21.9445C125.582 22.5105 126.256 22.7935 127.065 22.7935Z"
3421            fill="currentColor"
3422          ></path>
3423          <path
3424            d="M137.813 10.1191V25.0778H134.982V10.1191H137.813Z"
3425            fill="currentColor"
3426          ></path>
3427          <path
3428            d="M151.181 13.8789V25.0778H148.33V23.6627C147.967 24.1479 147.488 24.532 146.895 24.815C146.316 25.0845 145.682 25.2193 144.995 25.2193C144.119 25.2193 143.344 25.0373 142.67 24.6735C141.997 24.2961 141.464 23.7503 141.074 23.0361C140.696 22.3084 140.508 21.4459 140.508 20.4486V13.8789H143.338V20.0444C143.338 20.9338 143.56 21.6211 144.005 22.1062C144.449 22.5779 145.056 22.8137 145.824 22.8137C146.606 22.8137 147.219 22.5779 147.663 22.1062C148.108 21.6211 148.33 20.9338 148.33 20.0444V13.8789H151.181Z"
3429            fill="currentColor"
3430          ></path>
3431          <path
3432            d="M157.268 16.2036V21.6211C157.268 21.9984 157.356 22.2747 157.531 22.4499C157.719 22.6116 158.029 22.6925 158.461 22.6925H159.775V25.0778H157.996C155.61 25.0778 154.418 23.9188 154.418 21.6009V16.2036H153.084V13.8789H154.418V11.1096H157.268V13.8789H159.775V16.2036H157.268Z"
3433            fill="currentColor"
3434          ></path>
3435          <path
3436            d="M163.245 12.5448C162.747 12.5448 162.329 12.3898 161.992 12.0799C161.669 11.7564 161.507 11.3589 161.507 10.8872C161.507 10.4155 161.669 10.0247 161.992 9.71476C162.329 9.39133 162.747 9.22961 163.245 9.22961C163.744 9.22961 164.155 9.39133 164.478 9.71476C164.815 10.0247 164.984 10.4155 164.984 10.8872C164.984 11.3589 164.815 11.7564 164.478 12.0799C164.155 12.3898 163.744 12.5448 163.245 12.5448ZM164.64 13.8789V25.0778H161.81V13.8789H164.64Z"
3437            fill="currentColor"
3438          ></path>
3439          <path
3440            d="M172.409 25.2597C171.331 25.2597 170.36 25.0239 169.498 24.5522C168.636 24.067 167.955 23.3865 167.456 22.5105C166.971 21.6346 166.729 20.6238 166.729 19.4784C166.729 18.3329 166.978 17.3221 167.477 16.4462C167.989 15.5702 168.683 14.8964 169.559 14.4247C170.435 13.9396 171.412 13.697 172.49 13.697C173.568 13.697 174.545 13.9396 175.421 14.4247C176.297 14.8964 176.984 15.5702 177.483 16.4462C177.995 17.3221 178.251 18.3329 178.251 19.4784C178.251 20.6238 177.988 21.6346 177.463 22.5105C176.95 23.3865 176.25 24.067 175.36 24.5522C174.484 25.0239 173.5 25.2597 172.409 25.2597ZM172.409 22.7935C172.921 22.7935 173.399 22.6722 173.844 22.4297C174.302 22.1736 174.666 21.7963 174.936 21.2977C175.205 20.799 175.34 20.1926 175.34 19.4784C175.34 18.4137 175.057 17.5984 174.491 17.0324C173.938 16.4529 173.258 16.1632 172.449 16.1632C171.641 16.1632 170.96 16.4529 170.408 17.0324C169.869 17.5984 169.599 18.4137 169.599 19.4784C169.599 20.543 169.862 21.365 170.387 21.9445C170.927 22.5105 171.6 22.7935 172.409 22.7935Z"
3441            fill="currentColor"
3442          ></path>
3443          <path
3444            d="M186.533 13.7172C187.867 13.7172 188.945 14.1417 189.767 14.9907C190.589 15.8263 191 16.9987 191 18.5081V25.0778H188.17V18.8921C188.17 18.0027 187.948 17.3221 187.503 16.8505C187.058 16.3653 186.452 16.1227 185.684 16.1227C184.902 16.1227 184.282 16.3653 183.824 16.8505C183.379 17.3221 183.157 18.0027 183.157 18.8921V25.0778H180.327V13.8789H183.157V15.2737C183.534 14.7886 184.013 14.4113 184.592 14.1417C185.185 13.8587 185.832 13.7172 186.533 13.7172Z"
3445            fill="currentColor"
3446          ></path>
3447        </svg>
3448        <p class="chr-chr-footer-tagline">
3449          Reduce Churn and Retain more subscribers.
3450        </p>
3451      </div>
3452      <img
3453        decoding="async"
3454        src="https://churnsolution.com/wp-content/uploads/2024/03/[email protected]"
3455        alt="Stripe Verified Partner"
3456        class="chr-chr-footer-badge"
3457        style="width: auto; height: 34px"
3458      />
3459    </div>
3460    <nav class="chr-chr-footer-navigation" aria-label="Footer Navigation">
3461      <div class="chr-chr-footer-nav-column">
3462        <h2 class="chr-chr-footer-nav-heading">Products</h2>
3463        <ul class="chr-chr-footer-nav-list">
3464          <li>
3465            <a
3466              href="/products/cancellation-flows/"
3467              class="chr-chr-footer-nav-link"
3468            >
3469              Cancellation Flows
3470            </a>
3471          </li>
3472          <li>
3473            <a href="/products/reactivation/" class="chr-chr-footer-nav-link">
3474              Reactivation Campaigns
3475            </a>
3476          </li>
3477          <li>
3478            <a
3479              href="/products/payment-recovery/"
3480              class="chr-chr-footer-nav-link"
3481            >
3482              Dunning Email Automation
3483            </a>
3484          </li>
3485          <li>
3486            <a href="/products/churn-metrics/" class="chr-chr-footer-nav-link">
3487              Churn Metrics
3488            </a>
3489          </li>
3490          <li>
3491            <a
3492              href="/products/feedback-analysis/"
3493              class="chr-chr-footer-nav-link"
3494            >
3495              AI Feedback Analysis
3496            </a>
3497          </li>
3498          <li>
3499            <a
3500              href="/products/customer-portal/"
3501              class="chr-chr-footer-nav-link"
3502            >
3503              Customer Portal
3504            </a>
3505          </li>
3506          <li>
3507            <a href="/products/smart-retries/" class="chr-chr-footer-nav-link">
3508              Smart Retries
3509            </a>
3510          </li>
3511          <li>
3512            <a href="/products/mcp-server/" class="chr-chr-footer-nav-link">
3513              MCP Server
3514            </a>
3515          </li>
3516        </ul>
3517      </div>
3518      <div class="chr-chr-footer-nav-column">
3519        <h2 class="chr-chr-footer-nav-heading">Features</h2>
3520        <ul class="chr-chr-footer-nav-list">
3521          <li>
3522            <a href="/products/ab-experiments" class="chr-chr-footer-nav-link">
3523              A/B Experiments
3524            </a>
3525          </li>
3526          <li>
3527            <a
3528              href="/products/customer-segmentation/"
3529              class="chr-chr-footer-nav-link"
3530            >
3531              Customer Segmentation
3532            </a>
3533          </li>
3534          <li>
3535            <a href="/products/exit-surveys/" class="chr-chr-footer-nav-link">
3536              Exit Survey
3537            </a>
3538          </li>
3539          <li>
3540            <a
3541              href="/products/session-recording/"
3542              class="chr-chr-footer-nav-link"
3543            >
3544              Session Recording
3545            </a>
3546          </li>
3547          <li>
3548            <a href="/products/dynamic-offers/" class="chr-chr-footer-nav-link">
3549              Dynamic Offers
3550            </a>
3551          </li>
3552          <li>
3553            <a
3554              href="/products/custom-branding/"
3555              class="chr-chr-footer-nav-link"
3556            >
3557              Custom Branding
3558            </a>
3559          </li>
3560          <li>
3561            <a href="/products/easy-setup/" class="chr-chr-footer-nav-link">
3562              Easy Setup
3563            </a>
3564          </li>
3565          <li>
3566            <a href="/products/pause-wall/" class="chr-chr-footer-nav-link">
3567              Pause Wall
3568            </a>
3569          </li>
3570          <li>
3571            <a href="/products/payment-wall/" class="chr-chr-footer-nav-link">
3572              Payment Wall
3573            </a>
3574          </li>
3575        </ul>
3576      </div>
3577      <div class="chr-chr-footer-nav-column">
3578        <h2 class="chr-chr-footer-nav-heading">Learn</h2>
3579        <ul class="chr-chr-footer-nav-list">
3580          <li>
3581            <a
3582              href="/demo/"
3583              target="_blank"
3584              class="chr-chr-footer-nav-link"
3585              data-event-action="book_demo"
3586              data-event-category="cta"
3587              data-event-label="header_book_demo"
3588              data-event-from="WP-footer"
3589            >
3590              Get a demo
3591            </a>
3592          </li>
3593          <li>
3594            <a href="/docs/install/" class="chr-chr-footer-nav-link">
3595              Developer Docs
3596            </a>
3597          </li>
3598          <li>
3599            <a
3600              href="#"
3601              onclick="goToPage('contact-us')"
3602              class="chr-chr-footer-nav-link"
3603              data-event-action="navigate_to_app"
3604              data-event-category="navigation"
3605              data-event-label="contact-us"
3606              data-event-from="WP-footer"
3607            >
3608              Contact Us
3609            </a>
3610          </li>
3611          <li>
3612            <a href="/how-it-works/" class="chr-chr-footer-nav-link">
3613              How it works
3614            </a>
3615          </li>
3616          <li>
3617            <a href="/blog/" class="chr-chr-footer-nav-link">Blogs</a>
3618          </li>
3619        </ul>
3620        <h2 class="chr-chr-footer-nav-heading">Explore</h2>
3621        <ul class="chr-chr-footer-nav-list">
3622          <li>
3623            <a href="/pricing/" class="chr-chr-footer-nav-link">Pricing</a>
3624          </li>
3625          <li>
3626            <a href="/integrations/" class="chr-chr-footer-nav-link">
3627              Integrations
3628            </a>
3629          </li>
3630          <li>
3631            <a href="/calculator/" class="chr-chr-footer-nav-link">
3632              ROI Calculator
3633            </a>
3634          </li>
3635        </ul>
3636      </div>
3637      <div class="chr-chr-footer-nav-column">
3638        <h2 class="chr-chr-footer-nav-heading">Legal</h2>
3639        <ul class="chr-chr-footer-nav-list">
3640          <li>
3641            <a href="/terms-of-use/" class="chr-chr-footer-nav-link">
3642              Terms of use
3643            </a>
3644          </li>
3645          <li>
3646            <a href="/privacy-policy/" class="chr-chr-footer-nav-link">
3647              Privacy policy
3648            </a>
3649          </li>
3650          <li>
3651            <a href="/data-protection/" class="chr-chr-footer-nav-link">
3652              Data Protection & GDPR
3653            </a>
3654          </li>
3655        </ul>
3656        <h2 class="chr-chr-footer-nav-heading">Case Studies</h2>
3657        <ul class="chr-chr-footer-nav-list">
3658          <li>
3659            <a href="/case-studies/healthcare/" class="chr-chr-footer-nav-link">
3660              Healthcare
3661            </a>
3662          </li>
3663          <li>
3664            <a href="/case-studies/edutech/" class="chr-chr-footer-nav-link">
3665              EduTech
3666            </a>
3667          </li>
3668          <li>
3669            <a
3670              href="/case-studies/digital-marketplace/"
3671              class="chr-chr-footer-nav-link"
3672            >
3673              Digital Marketplace
3674            </a>
3675          </li>
3676        </ul>
3677      </div>
3678    </nav>
3679    <div class="chr-chr-footer-social-section">
3680      <div class="chr-chr-footer-social-group">
3681        <p class="chr-chr-footer-stripe-text">
3682          Our Stripe App tracks and reduces churn
3683        </p>
3684        <figure class="chr-chr-footer-stripe-badge">
3685          <a
3686            href="https://marketplace.stripe.com/apps/churn-solution"
3687            target="_blank"
3688            rel="noreferrer noopener"
3689            data-event-action="stripe_app_view"
3690            data-event-category="cta"
3691            data-event-label="stripe_app_marketplace"
3692            data-event-from="WP-footer"
3693          >
3694            <img
3695              decoding="async"
3696              src="https://churnsolution.com/wp-content/uploads/2024/03/stripe_app_marketplace.png"
3697              alt="Stripe App Marketplace"
3698              class="wp-image-2068"
3699              style="width: auto; height: 45px"
3700            />
3701          </a>
3702        </figure>
3703        <figure class="chr-chr-footer-stripe-badge">
3704          <a
3705            href="https://churntools.com/tools/churn-solution?utm_source=churnsolution.com&utm_medium=referral"
3706            target="_blank"
3707            data-event-action="featured"
3708            data-event-category="featured"
3709            data-event-label="featured"
3710            data-event-from="WP-footer"
3711          >
3712            <img
3713              src="https://churntools.com/badge/churn-solution.svg"
3714              alt="Churn Solution on ChurnTools"
3715            />
3716          </a>
3717        </figure>
3718      </div>
3719      <nav class="chr-chr-footer-social-links" aria-label="Social Media Links">
3720        <a
3721          href="https://www.facebook.com/churn.solution"
3722          target="_blank"
3723          class="chr-chr-footer-social-icon"
3724          aria-label="Facebook"
3725          data-event-action="social_facebook"
3726          data-event-category="cta"
3727          data-event-label="social_facebook"
3728          data-event-from="WP-footer"
3729        >
3730          <svg
3731            width="22"
3732            height="22"
3733            viewBox="0 0 22 22"
3734            fill="none"
3735            xmlns="http://www.w3.org/2000/svg"
3736          >
3737            <path
3738              fill-rule="evenodd"
3739              clip-rule="evenodd"
3740              d="M0 10.5675C0 15.7922 3.79457 20.1367 8.75737 21.0177V13.4277H6.13016V10.5088H8.75737V8.17326C8.75737 5.54605 10.4502 4.08707 12.8444 4.08707C13.6028 4.08707 14.4208 4.20354 15.1792 4.32001V7.0059H13.8367C12.5519 7.0059 12.2603 7.64781 12.2603 8.46575V10.5088H15.0627L14.5959 13.4277H12.2603V21.0177C17.2231 20.1367 21.0177 15.793 21.0177 10.5675C21.0177 4.75525 16.2887 0 10.5088 0C4.72898 0 0 4.75525 0 10.5675Z"
3741              fill="currentColor"
3742            />
3743          </svg>
3744        </a>
3745        <a
3746          href="https://www.instagram.com/churnsolution/"
3747          target="_blank"
3748          class="chr-chr-footer-social-icon"
3749          aria-label="Instagram"
3750          data-event-action="social_instagram"
3751          data-event-category="cta"
3752          data-event-label="social_instagram"
3753          data-event-from="WP-footer"
3754        >
3755          <svg
3756            width="22"
3757            height="22"
3758            viewBox="0 0 22 21"
3759            fill="none"
3760            xmlns="http://www.w3.org/2000/svg"
3761          >
3762            <path
3763              d="M10.997 6.99851C8.97722 6.99851 7.32888 8.57195 7.32888 10.5C7.32888 12.4281 8.97722 14.0015 10.997 14.0015C13.0169 14.0015 14.6652 12.4281 14.6652 10.5C14.6652 8.57195 13.0169 6.99851 10.997 6.99851ZM21.9988 10.5C21.9988 9.05002 22.0125 7.61317 21.9272 6.16582C21.8419 4.48469 21.4402 2.99268 20.1523 1.76335C18.8617 0.53139 17.3014 0.150507 15.5403 0.0690774C14.0213 -0.0123526 12.516 0.000781319 10.9998 0.000781319C9.4808 0.000781319 7.97556 -0.0123526 6.45931 0.0690774C4.69815 0.150507 3.13513 0.534016 1.84728 1.76335C0.556684 2.9953 0.157672 4.48469 0.0723655 6.16582C-0.0129406 7.6158 0.000818509 9.05265 0.000818509 10.5C0.000818509 11.9474 -0.0129406 13.3868 0.0723655 14.8342C0.157672 16.5153 0.559436 18.0073 1.84728 19.2367C3.13788 20.4686 4.69815 20.8495 6.45931 20.9309C7.97831 21.0124 9.48355 20.9992 10.9998 20.9992C12.5188 20.9992 14.024 21.0124 15.5403 20.9309C17.3014 20.8495 18.8645 20.466 20.1523 19.2367C21.4429 18.0047 21.8419 16.5153 21.9272 14.8342C22.0153 13.3868 21.9988 11.95 21.9988 10.5ZM10.997 15.8875C7.87374 15.8875 5.35309 13.4814 5.35309 10.5C5.35309 7.51861 7.87374 5.11248 10.997 5.11248C14.1203 5.11248 16.641 7.51861 16.641 10.5C16.641 13.4814 14.1203 15.8875 10.997 15.8875ZM16.8722 6.15006C16.1429 6.15006 15.554 5.58793 15.554 4.89184C15.554 4.19574 16.1429 3.63361 16.8722 3.63361C17.6014 3.63361 18.1903 4.19574 18.1903 4.89184C18.1905 5.05713 18.1565 5.22083 18.0904 5.37358C18.0242 5.52633 17.9271 5.66512 17.8047 5.782C17.6822 5.89888 17.5369 5.99155 17.3768 6.05471C17.2168 6.11787 17.0453 6.15027 16.8722 6.15006Z"
3764              fill="currentColor"
3765            />
3766          </svg>
3767        </a>
3768        <a
3769          href="https://www.linkedin.com/company/churn-solution"
3770          target="_blank"
3771          class="chr-chr-footer-social-icon"
3772          aria-label="linkedin"
3773          data-event-action="social_linkedin"
3774          data-event-category="cta"
3775          data-event-label="social_linkedin"
3776          data-event-from="WP-footer"
3777        >
3778          <svg
3779            width="24"
3780            height="24"
3781            viewBox="0 0 256 256"
3782            xmlns="http://www.w3.org/2000/svg"
3783            style="scale: 0.916666666667"
3784          >
3785            <path
3786              d="M0 18.338C0 8.216 8.474 0 18.92 0h218.16C247.53 0 256 8.216 256 18.338v219.327C256 247.79 247.53 256 237.08 256H18.92C8.475 256 0 247.791 0 237.668V18.335z"
3787              fill="currentColor"
3788            ></path>
3789            <path
3790              d="M77.796 214.238V98.986H39.488v115.252H77.8zM58.65 83.253c13.356 0 21.671-8.85 21.671-19.91-.25-11.312-8.315-19.915-21.417-19.915-13.111 0-21.674 8.603-21.674 19.914 0 11.06 8.312 19.91 21.169 19.91h.248zM99 214.238h38.305v-64.355c0-3.44.25-6.889 1.262-9.346 2.768-6.885 9.071-14.012 19.656-14.012 13.858 0 19.405 10.568 19.405 26.063v61.65h38.304v-66.082c0-35.399-18.896-51.872-44.099-51.872-20.663 0-29.738 11.549-34.78 19.415h.255V98.99H99.002c.5 10.812-.003 115.252-.003 115.252z"
3791              fill="#0F124D"
3792            ></path>
3793          </svg>
3794        </a>
3795        <a
3796          href="https://www.youtube.com/@ChurnSolution-com"
3797          target="_blank"
3798          class="chr-chr-footer-social-icon"
3799          aria-label="YouTube"
3800          data-event-action="social_youtube"
3801          data-event-category="cta"
3802          data-event-label="social_youtube"
3803          data-event-from="WP-footer"
3804        >
3805          <svg
3806            width="22"
3807            height="23"
3808            viewBox="0 0 22 22"
3809            fill="none"
3810            xmlns="http://www.w3.org/2000/svg"
3811          >
3812            <circle cx="10.7329" cy="11.0903" r="10.7329" fill="currentColor" />
3813            <path
3814              d="M15.784 10.0646L8.32603 7.07271C8.19085 7.01695 8.04247 6.99262 7.89433 7.00194C7.74618 7.01126 7.60292 7.05392 7.47751 7.12608C7.3521 7.19824 7.24848 7.29762 7.17602 7.41523C7.10356 7.53285 7.06455 7.66499 7.0625 7.79971V14.175C7.06501 14.3131 7.10506 14.4485 7.17911 14.5692C7.25315 14.6898 7.3589 14.7921 7.48696 14.8668C7.61502 14.9415 7.76143 14.9863 7.91318 14.9973C8.06493 15.0083 8.21733 14.9852 8.35685 14.9299L15.784 11.6584C15.9217 11.5932 16.0391 11.4975 16.1252 11.3802C16.2114 11.2629 16.2636 11.1278 16.2771 10.9873C16.2921 10.9134 16.2921 10.8376 16.2771 10.7636C16.288 10.6146 16.246 10.4663 16.1572 10.3405C16.0685 10.2147 15.9377 10.118 15.784 10.0646Z"
3815              fill="#0F124D"
3816            />
3817          </svg>
3818        </a>
3819        <a href="/cdn-cgi/l/email-protection#40292e262f00232835322e332f2c3534292f2e6e232f2d" class="chr-chr-footer-social-icon" aria-label="Email" data-event-action="social_email" data-event-category="cta" data-event-label="social_email" data-event-from="WP-footer">
3820          <svg
3821            width="22"
3822            height="23"
3823            viewBox="0 0 22 22"
3824            fill="none"
3825            xmlns="http://www.w3.org/2000/svg"
3826          >
3827            <circle cx="10.7329" cy="11.0903" r="10.7329" fill="white" />
3828            <g clip-path="url(#clip0_2766_7094)">
3829              <path
3830                d="M17.7279 7.00033C17.7279 6.26699 17.1279 5.66699 16.3945 5.66699H5.72786C4.99453 5.66699 4.39453 6.26699 4.39453 7.00033M17.7279 7.00033V15.0003C17.7279 15.7337 17.1279 16.3337 16.3945 16.3337H5.72786C4.99453 16.3337 4.39453 15.7337 4.39453 15.0003V7.00033M17.7279 7.00033L11.0612 11.667L4.39453 7.00033"
3831                stroke="#0F124D"
3832                stroke-linecap="round"
3833                stroke-linejoin="round"
3834              />
3835            </g>
3836            <defs>
3837              <clipPath id="clip0_2766_7094">
3838                <rect
3839                  width="16"
3840                  height="16"
3841                  fill="currentColor"
3842                  transform="translate(3.0625 3)"
3843                />
3844              </clipPath>
3845            </defs>
3846          </svg>
3847        </a>
3848      </nav>
3849      <p id="chrCopyright" class="chr-chr-footer-copyright"></p>
3850    </div>
3851  </div>
3852</footer>
vendor: 110 bytes, lines 3852-3853
3852
3853<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
3853<script>
3854(()=>{let e=document.getElementById("chrCopyright");e&&(e.innerText=`\xa9 ${new Date().getFullYear()} Churn Solution, LLC. All rights reserved`)})();
3855</script>
3855			
3855<script>
3856			/(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1);
3857			</script>
3857
3858			
3858<script id="essential-blocks-blocks-localize-js-extra">
3859var eb_conditional_localize = [];
3860var EssentialBlocksLocalize = {"eb_plugins_url":"https://churnsolution.com/wp-content/plugins/essential-blocks/","image_url":"https://churnsolution.com/wp-content/plugins/essential-blocks/assets/images","eb_wp_version":"7.1","eb_version":"6.0.8","eb_admin_url":"https://churnsolution.com/wp-admin/","rest_rootURL":"https://churnsolution.com/wp-json/","ajax_url":"https://churnsolution.com/wp-admin/admin-ajax.php","nft_nonce":"ec2293f230","post_grid_pagination_nonce":"a61f0de1c2","placeholder_image":"https://churnsolution.com/wp-content/plugins/essential-blocks/assets/images/placeholder.png","is_pro_active":"false","upgrade_pro_url":"https://essential-blocks.com/upgrade","responsiveBreakpoints":{"tablet":1024,"mobile":767},"wp_timezone":"+00:00","gmt_offset":"0"};
3861//# sourceURL=essential-blocks-blocks-localize-js-extra
3862</script>
vendor: 1 bytes, line 3862
3862
3863<script id="essential-blocks-blocks-localize-js" src="https://churnsolution.com/wp-content/plugins/essential-blocks/assets/js/eb-blocks-localize.js?ver=31d6cfe0d16ae931b73c"></script>
vendor: 1 bytes, line 3863
3863
3864<script id="astra-theme-js-js-extra">
3865var astra = {"break_point":"921","isRtl":"","is_scroll_to_id":"1","is_scroll_to_top":"","is_header_footer_builder_active":"1"};
3866//# sourceURL=astra-theme-js-js-extra
3867</script>
vendor: 1 bytes, line 3867
3867
3868<script id="astra-theme-js-js" src="https://churnsolution.com/wp-content/themes/astra/assets/js/minified/frontend.min.js?ver=4.3.0"></script>
3868
3869	</body>
3870</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.