PageSourceSearch

https://dreamcatchers.com/cart

html dreamcatchers.com collected 2026-09-25 00:03:11 UTC 355,341 bytes, 3,198 lines download raw bytes

1<!doctype html>
2<html class="no-js" lang="en" dir="ltr">
3<head>
4<!-- Start of Shoplift scripts -->
5<!-- 2026-05-07T22:32:16.2176336Z -->
6<style>.shoplift-hide { opacity: 0 !important; }</style>
7<style id="sl-preview-bar-hide">#preview-bar-iframe, #PBarNextFrameWrapper { display: none !important; }</style>
8<script type="text/javascript">(function(rootPath, template, themeRole, themeId, isThemePreview){ /* Generated on 2026-09-24T23:30:01.3235126Z */(function(){"use strict";var te=document.createElement("style");te.textContent=`#shoplift-preview-control{position:fixed;max-width:332px;height:56px;background-color:#141414;z-index:9999;bottom:20px;display:flex;border-radius:8px;box-shadow:13px 22px 7px #0000,9px 14px 7px #00000003,5px 8px 6px #0000000d,2px 4px 4px #00000017,1px 1px 2px #0000001a,0 0 #0000001a;align-items:center;margin:0 auto;left:16px;right:16px;opacity:0;transform:translateY(20px);visibility:hidden;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s .4s}#shoplift-preview-control.visible{opacity:1;transform:translateY(0);visibility:visible;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s 0s}#shoplift-preview-control *{font-family:Inter,sans-serif;color:#fff;box-sizing:border-box;font-size:16px}#shoplift-preview-variant-title{font-weight:400;line-height:140%;font-size:16px;text-align:start;letter-spacing:-.16px;flex-grow:1;text-wrap:nowrap;overflow:hidden;text-overflow:ellipsis}#shoplift-preview-variant-selector{position:relative;display:block;padding:6px 0;height:100%;min-width:0;flex:1 1 auto}#shoplift-preview-variant-menu-trigger{border:none;cursor:pointer;width:100%;background-color:transparent;padding:0 16px;border-left:1px solid #333;border-right:1px solid #333;height:100%;display:flex;align-items:center;justify-content:start;gap:8px}#shoplift-preview-variant-selector .menu-variant-label{width:24px;height:24px;border-radius:50%;padding:6px;display:flex;justify-content:center;align-items:center;font-size:12px;font-style:normal;font-weight:600;line-height:100%;letter-spacing:-.12px;flex-shrink:0}#shoplift-preview-variant-selector .preview-variant-menu{position:absolute;bottom:110%;transform:translate3d(0,20px,0);visibility:hidden;pointer-events:none;opacity:0;cursor:pointer;background-color:#141414;border:1px solid #141414;border-radius:6px;width:100%;max-height:156px;overflow-y:auto;box-shadow:0 8px 16px #0003;z-index:1;transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s .3s}#shoplift-preview-variant-selector .preview-variant-menu.preview-variant-menu__visible{visibility:visible;pointer-events:auto;opacity:100;transform:translateZ(0);transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s 0s}@media screen and (max-width:400px){#shoplift-preview-variant-selector .preview-variant-menu{position:fixed;left:0;right:0;width:auto;bottom:110%}}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item{padding:12px 16px;display:flex;overflow:hidden}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item .menu-variant-label{margin-right:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item span{overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;color:#f6f6f6;font-size:14px;font-style:normal;font-weight:500}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:hover{background-color:#545454}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:last-of-type{border-bottom-left-radius:6px;border-bottom-right-radius:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:first-of-type{border-top-left-radius:6px;border-top-right-radius:6px}#shoplift-preview-control div:has(#shoplift-exit-preview-button){padding:0 16px}#shoplift-exit-preview-button{padding:6px 8px;font-weight:500;line-height:75%;border-radius:4px;background-color:transparent;border:none;text-decoration:none}#shoplift-exit-preview-button:hover{cursor:pointer;background-color:#333}#shoplift-preview-subscription-warning{position:relative;display:flex;align-items:center;gap:6px;padding:6px 10px;margin:0 4px;border-left:1px solid #333;cursor:help;outline:none}#shoplift-preview-subscription-warning__icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background-color:#f59e0b;color:#141414!important;font-weight:700;font-size:12px!important;line-height:1;flex-shrink:0}#shoplift-preview-subscription-warning__label{font-size:13px!important;font-weight:500;color:#fbbf24!important;text-wrap:nowrap;white-space:nowrap}#shoplift-preview-subscription-warning__tooltip{position:absolute;bottom:calc(100% + 8px);right:0;max-width:320px;width:max-content;padding:10px 12px;border-radius:6px;background-color:#1f1f1f;color:#fff!important;font-size:12px!important;line-height:1.4!important;box-shadow:0 8px 16px #0000004d;z-index:10000;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s .2s;pointer-events:none}#shoplift-preview-subscription-warning__tooltip.shoplift-preview-subscription-warning__tooltip--visible{opacity:1;visibility:visible;transform:translateY(0);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s 0s}#shoplift-preview-subscription-warning:focus-visible{box-shadow:inset 0 0 0 2px #f59e0b;border-radius:4px}#shoplift-preview-control:has(#shoplift-preview-subscription-warning){max-width:480px}/*$vite$:1*/`,document.head.appendChild(te);var fe=" daum[ /]| deusu/|(?:^|[^g])news(?!sapphire)|(?<! channel/|google/)google(?!(?:wv|app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!cam)scan|(?<!lib)http|24x
87|;\\s\\w+;$|@[a-z][\\w-]+\\.|\\(\\)|\\.com\\b|\\b\\w+/1\\.0;|\\bbw/|\\bdlc\\b|\\bort/|\\bperl\\b|\\btime/|\\||^[<\\(;]|^[\\w \\.\\-\\(?:\\):%]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[\\w\\-]+/[\\w]+$|^[^ ]{50,}$|^\\d+\\b|^\\w*search\\b|^\\w+/[\\w\\(\\)]*$|^\\w+/\\d\\.\\d\\s\\([\\w@]+\\)$|^active|^ad muncher|^amaya|^apache/|^avsdevicesdk/|^azure|^biglotron|^blackbox exporter|^bot|^clamav[ /]|^claude-code/|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^email|^exodusmovement|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^igetter/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d\\s[\\w\\.-]+$|^mozilla/\\d\\.\\d\\s\\((?:compatible;)?(?:\\s?[\\w\\d-.]+\\/\\d+\\.\\d+)?\\)$|^navermailapp|^netsurf|^offline|^openai/|^owler|^php|^postman|^ps_daily/|^python|^rank|^read|^reed|^remove\\.bg/|^rest|^rss|^snapchat|^sora |^space bison|^stape/|^svn|^swcd |^taringa|^thumbor/|^track|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|abuse|advisor|agent\\b|analyzer|archive|ask jeeves/teoma|attracta|audit|bluecoat drtr|browsex|burpcollaborator|capture|catch|check\\b|checker|chrome-lighthouse|chromeframe|classifier|cloudflare|collapsify\\b|convertify|cookiehubverify/|crawl|cursor/|cypress/|dareboost|datanyze|dejaclick|detect|discovery|dmbrowser|download|exaleadcloudview|feed|firephp|foregenix|functionize|grab|hardenize\\b|headless|hotjar|httrack|hubspot marketing grader|ibisbrowser|infrawatch|insight|inspect|iplabel|java(?!;)|library|linkcheck|linktiger|mail\\.ru/|manager|manus-user/|marketgoo/|measure|monitor\\b|neustar wpm|node\\b|nutch|offbyone|openvas|optimize|pageburst|pagespeed|parser|phantomjs|pingdom|playwright|powermarks|preview|productfinder|prospectingstudio|proxy|ptst[ /]\\d|radar|readable/|retriever|rexx;|rigor|rss\\b|scrape|securityheaders|selenium|server|silktide|sindup/|sogou|sparkler/|speedcurve|spider|splash|statuscake|supercleaner|synapse|synthetic|testlocally|tools|torrent|transcoder|url|validator|virtuoso|wappalyzer|watchtowr|webglance|webkit2png|whatcms/|xtate/",ge=/bot|crawl|http|lighthouse|scan|search|spider/i,z;function me(){if(z instanceof RegExp)return z;try{z=new RegExp(fe,"i")}catch{z=ge}return z}var ye=a=>typeof a=="string"&&a!=="";function ve(a){return ye(a)&&me().test(a)}var we=ve;class X{timestamp;constructor(){this.timestamp=new Date}}class be extends X{type;testId;hypothesisId;constructor(e,t,i){super(),this.type=3,this.testId=e,this.hypothesisId=t,this.timestamp=i}}class Se extends X{type;path;constructor(e){super(),this.type=4,this.path=e}}class Ce extends X{type;cart;constructor(e){super(),this.type=5,this.cart=e}}class ie extends Error{isBot;constructor(){super(),this.isBot=!0}}function Te(a,e,t){for(const i of e.selectors){const s=a.querySelectorAll(i.cssSelector);for(let r=0;r<s.length;r++)t(e.testId,e.hypothesisId)}re(a,e,(i,s,r,o,n)=>n(s,r),t)}function U(a,e,t){for(const i of e.selectors)ne(a,e.testId,e.hypothesisId,i,t??(()=>{}));re(a,e,ne,t??(()=>{}))}function se(a){return a.urlPatterns.reduce((e,t)=>{switch(t.operator){case"contains":return e+`.*${t}.*`;case"endsWith":return e+`.*${t}`;case"startsWith":return e+`${t}.*`}},"")}function re(a,e,t,i){new MutationObserver(()=>{for(const r of e.selectors)t(a,e.testId,e.hypothesisId,r,i)}).observe(a.documentElement,{childList:!0,subtree:!0})}function ne(a,e,t,i,s){const r=a.querySelectorAll(i.cssSelector);for(let o=0;o<r.length;o++){let n=r.item(o);if(n instanceof HTMLElement&&n.dataset.shoplift!==""){n.dataset.shoplift="";for(const l of i.actions.sort(Re))n=Ie(a,i.cssSelector,n,l)}}return r.length>0&&s?(s(e,t),!0):!1}function Ie(a,e,t,i){switch(i.type){case"innerHtml":t.innerHTML=i.value;break;case"attribute":Pe(t,i.scope,i.value);break;case"css":Ae(a,e,i.value);break;case"js":ke(a,t,i);break;case"copy":return Ee(t);case"remove":xe(t);break;case"move":_e(t,parseInt(i.value));break}return t}function Pe(a,e,t){a.setAttribute(e,t)}function Ae(a,e,t){const i=a.createElement("style");i.innerHTML=`${e} { ${t} }`,a.getElementsByTagName("head")[0]?.appendChild(i)}function ke(a,e,t){Function("document","element",`"use strict"; ${t.value}`)(a,e)}function Ee(a){const e=a.cloneNode(!0);if(!a.parentNode)throw"Can't copy node outside of DOM";return a.parentNode.insertBefore(e,a.nextSibling),e}function xe(a){a.remove()}function _e(a,e){if(e===0)return;const t=Array.prototype.slice.call(a.parentElement.children).indexOf(a),i=Math.min(Math.max(t+e,0),a.parentElement.children.length-1);a.parentElement.children.item(i).insertAdjacentElement(e>0?"afterend":"beforebegin",a)}function Re(a,e){return oe(a)-oe(e)}function oe(a){return a.type==="copy"||a.type==="remove"?0:1}
8const M={Template:0,UrlRedirect:2,Script:3,Price:5},De="data:image/svg+xml,%3csvg%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M9.96001%207.90004C9.86501%207.90004%209.77001%207.86504%209.69501%207.79004L6.43501%204.53004C6.19501%204.29004%205.80501%204.29004%205.56501%204.53004L2.30501%207.79004C2.16001%207.93504%201.92001%207.93504%201.77501%207.79004C1.63001%207.64504%201.63001%207.40504%201.77501%207.26004L5.03501%204.00004C5.56501%203.47004%206.43001%203.47004%206.96501%204.00004L10.225%207.26004C10.37%207.40504%2010.37%207.64504%2010.225%207.79004C10.15%207.86004%2010.055%207.90004%209.96001%207.90004Z'%20fill='white'/%3e%3c/svg%3e",Ve="data:image/svg+xml,%3csvg%20width='14'%20height='24'%20viewBox='0%200%2014%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M12.3976%2014.5255C12.2833%2013.8788%2012.0498%2013.3024%2011.6952%2012.7961C11.3416%2012.2898%2010.9209%2011.8353%2010.4353%2011.4317C9.94868%2011.0291%209.43546%2010.6488%208.89565%2010.292C8.48487%2010.049%208.09577%209.78565%207.72637%209.50402C7.35697%209.2224%207.08016%208.89503%206.89694%208.51987C6.71273%208.14471%206.67826%207.69533%206.79055%207.1697C6.86345%206.83216%206.97476%206.54647%207.12351%206.31162C7.27324%206.07778%207.47124%205.89986%207.7175%205.77684C7.96377%205.65483%208.21989%205.59383%208.48389%205.59383C8.88087%205.59383%209.17639%205.7016%209.3734%205.91714C9.56943%206.13268%209.68271%206.42345%209.71424%206.78946C9.74576%207.15547%209.72015%207.55401%209.63839%207.98509C9.55663%208.41617%209.43645%208.84724%209.27687%209.27934L13.5127%208.80149C13.9638%207.52656%2014.1017%206.42447%2013.9264%205.49725C13.751%204.56901%2013.2664%203.85122%2012.4724%203.34491C12.239%203.19648%2011.9779%203.07041%2011.6893%202.96569L12.0026%201.50979L9.86397%200L7.3875%201.50979L7.11169%202.78878C6.65166%202.8874%206.21724%203.01957%205.8114%203.19038C4.85292%203.594%204.06684%204.15115%203.45117%204.86385C2.83452%205.57655%202.42571%206.40108%202.22378%207.33847C2.06616%208.06947%202.04942%208.70796%202.17551%209.25087C2.30061%209.7948%202.52028%2010.2828%202.8355%2010.7139C3.14974%2011.145%203.51816%2011.5344%203.93977%2011.881C4.36039%2012.2288%204.782%2012.5521%205.20164%2012.851C5.68334%2013.1702%206.13844%2013.5169%206.56497%2013.8921C6.99052%2014.2672%207.31954%2014.7125%207.55004%2015.228C7.78055%2015.7445%207.81502%2016.3769%207.65347%2017.1262C7.56482%2017.5389%207.43676%2017.8765%207.27028%2018.1388C7.10381%2018.4011%206.89596%2018.5983%206.64772%2018.7295C6.3985%2018.8606%206.12071%2018.9267%205.8114%2018.9267C5.21641%2018.9267%204.79776%2018.6034%204.62833%2018.1632C4.4589%2017.7229%204.47367%2017.2583%204.60075%2016.5639C4.72782%2015.8705%205.05092%2015.1395%205.37107%2014.3699H1.17665C1.17665%2014.3699%200.207341%2016.1115%200.0310135%2017.6762C-0.0655232%2018.5302%200.0635208%2019.2653%200.41519%2019.8844C0.76686%2020.5036%201.33032%2020.9814%202.10655%2021.319C2.39222%2021.443%202.7104%2021.5447%203.05813%2021.623L2.54589%2024H7.17473L7.7047%2021.5386C8.08493%2021.442%208.43857%2021.3231%208.76562%2021.1787C9.73985%2020.7476%2010.52%2020.1427%2011.1071%2019.3649C11.6932%2018.5871%2012.0873%2017.7291%2012.2892%2016.7917C12.4744%2015.9295%2012.5099%2015.1741%2012.3966%2014.5275L12.3976%2014.5255Z'%20fill='white'/%3e%3c/svg%3e";async function Oe(a){let e=a.replace(/-/g,"+").replace(/_/g,"/");for(;e.length%4;)e+="=";const t=atob(e),i=Uint8Array.from(t,o=>
8o.charCodeAt(0)),s=new Blob([i]).stream().pipeThrough(new DecompressionStream("gzip")),r=await new Response(s).text();return JSON.parse(r)}function F(a,e){return typeof e=="string"&&/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+(?:Z|[+-]\d+)/.test(e)?new Date(e):e}function ee(a,e){return e}function q(a,e=!1,t=!1,i=","){const s=a/100;if(t){const o=Math.round(s).toLocaleString("en-US");return i!==","?o.replace(/,/g,i):o}else{const r=e?",":".",o=s.toFixed(2).split("."),n=parseInt(o[0],10),l=o[1]??"00",c=n.toLocaleString("en-US");return i!==","?`${c.replace(/,/g,i)}${r}${l}`:e?`${c.replace(/,/g,".")}${r}${l}`:`${c}${r}${l}`}}function H(a,e,t,i){const s=e.replace("{{amount}}",q(a,!1,!1)).replace("{{amount_no_decimals}}",q(a,!1,!0)).replace("{{amount_with_comma_separator}}",q(a,!0,!1)).replace("{{amount_no_decimals_with_comma_separator}}",q(a,!0,!0)).replace("{{amount_with_space_separator}}",q(a,!1,!1," ")).replace("{{amount_no_decimals_with_space_separator}}",q(a,!1,!0," ")).replace("{{amount_with_apostrophe_separator}}",q(a,!1,!1,"'")).replace("{{amount_no_decimals_with_apostrophe_separator}}",q(a,!1,!0,"'")).replace("{{amount_with_period_and_space_separator}}",q(a,!1,!1,". ")).replace("{{amount_no_decimals_with_period_and_space_separator}}",q(a,!1,!0,". "));return i?`${s} ${t}`:s}function ae(a){return a.replace(/[^\d.,\s-]/g,"").trim()}function j(a){const e=new Map;for(const[t,i,s]of a.variants)e.set(t,{priceInCents:i,compareAtPriceInCents:s});return e}function Le(a,e,t,i){const{priceInCents:s,compareAtPriceInCents:r}=t,{moneyFormat:o,currency:n,currencyCodeEnabled:l}=i;if(a.getAttribute("data-sl-attribute-p")===e)a.innerHTML=H(s,o,n,l);else if(a.getAttribute("data-sl-attribute-cap")===e)r<=0||r<=s?a.remove():a.innerHTML=H(r,o,n,l);else if(a.getAttribute("data-sl-attribute-discount")===e&&!(r<=0||r<=s)){const d=Math.round((r-s)/r*100),u=ae(H(r-s,o,n,!1)),h=a.getAttribute("data-sl-format")||"percent";h==="percent"?a.textContent=`-${d}%`:h==="amount"?a.textContent=`-${u}`:h==="both"&&(a.textContent=`-${d}% (-${u})`)}}function $e(a){const e=[],t={id:"url-pattern",operator:"contains",value:"/"};for(const[i,s,r]of a.variants){e.push({id:`p-${i}`,cssSelector:`[data-sl-attribute-p="${i}"]`,urlPatterns:[t],actions:[{id:`p-action-${i}`,type:"innerHtml",scope:"price",value:H(s,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]});const o=r<=0||r<=s;if(e.push({id:`cap-${i}`,cssSelector:`[data-sl-attribute-cap="${i}"]`,urlPatterns:[t],actions:[{id:`cap-action-${i}`,type:o?"remove":"innerHtml",scope:"compare-at-price",value:o?"":H(r,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]}),!o&&r>s){const n=Math.round((r-s)/r*100),l=ae(H(r-s,a.moneyFormat,a.currency,!1));e.push({id:`d-${i}`,cssSelector:`[data-sl-attribute-discount="${i}"]`,urlPatterns:[t],actions:[{id:`d-action-${i}`,type:"js",scope:null,value:`var format = element.getAttribute('data-sl-format') || 'percent';                    if (format === 'percent') {                      element.textContent = '-${n}%';                    } else if (format === 'amount') {                      element.textContent = '-${l}';                    } else if (format === 'both') {                      element.textContent = '-${n}% (-${l})';                    }`}]})}}return e}const Me=a=>{let e=5381;for(let t=0;t<a.length;t++)e=(e*33^a.charCodeAt(t))>>>0;return e.toString(36)},qe=()=>Math.random().toString(36).slice(2,10)+Date.now().toString(36).slice(-4),He=a=>btoa(JSON.stringify(a)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""),K=a=>a.replace(/#slr-[a-z0-9]+$/,""),tt="modulepreload",it=function(a){return"/"+a},st={},Ne=function(e,t,i){let s=Promise.resolve();function r(o){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=o,window.dispatchEvent(n),!n.defaultPrevented)throw o}return s.then(o=>{for(const n of o||[])n.status==="rejected"&&r(n.reason);return e().catch(r)})};function le(a,e,t){const i=t?a.plans.filter(c=>!c.variantId||c.variantId===t):a.plans,s=[],r=[];for(const c of i)c.direction==="decrease"?(s.push(c.existingShopifyPlanId),r.push(c.createdShopifyPlanId)):(s.push(c.createdShopifyPlanId),r.push(c.existingShopifyPlanId));const o=e?s:r,n=e?r:s;if(t)for(const c of a.plans)for(const d of[c.existingShopifyPlanId,c.createdShopifyPlanId])d&&!o.includes(d)&&!n.includes(d)&&n.push(d);const l={};for(let c=0;c<n.length;c++){const d=n[c],u=o[c];d&&u&&(l[d]=u)}return{showPlanIds:o,hidePlanIds:n,swapMap:l}}function ce(a,e,t){const i=e?a.plans.find(r=>r.variantId===e):void 0;if(i)return i.direction;if(t){const r=a.plans.find(o=>o.productId===t);if(r)return r.direction}return a.plans.find(r=>!r.variantId)?.direction??null}function J(a,e){const t=e?a.plans.filter(r=>!r.productId||r.productId===e):a.plans,i={};for(const r of t)i[r.existingShopifyPlanId]=r.existingDiscountAmount,i[r.createdShopifyPlanId]=r.existingDiscountAmount;
8const s=Math.max(...Object.values(i),0);return{discountMap:i,maxDiscount:s}}function W(a){const e=document.querySelector('form[action*="/cart/add"] input[name="product-id"]')?.value;if(e)return e;if(a){for(const r of Array.from(document.querySelectorAll("[data-sl-attribute-p]"))){const o=r.getAttribute("data-sl-attribute-p");if(!o)continue;const n=a.variants.find(l=>l[0]===o);if(n?.[3])return n[3]}const s=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(s){const r=a.variants.find(o=>o[0]===s);if(r?.[3])return r[3]}}const t=window,i=t.ShopifyAnalytics?.meta?.product?.id??t.meta?.product?.id;return i!=null?String(i):null}function D(a,e){return a.widget.selectors[e]??[]}function N(a,e){return a.replace(/[\d.]+%/,`${e}%`)}function $(a,e){const t=document.createTreeWalker(a,NodeFilter.SHOW_TEXT);let i=t.nextNode();for(;i;){if(i.nodeValue!==null){const s=e(i.nodeValue);if(s!==i.nodeValue){i.nodeValue=s;return}}i=t.nextNode()}}function de(a,e){return a===null?!1:a==="decrease"?!e:e}async function Ue(a){if(a.subscriptionSwapDone)return;const e=a.getActiveAssignment();if(!e)return;const t=a.getHypothesis(e.hypothesisId);if(!t?.subscriptionData)return;a.subscriptionSwapDone=!0;const i=t.subscriptionData,s=t.isControl,r=[...new Set(i.plans.map(d=>d.direction))].join(",");a.log(`[SUB-SWAP] ${s?"A":"B"} side, directions=${r}`);const o=i.plans.some(d=>d.variantId);let n=!1,l=!1;function c(){if(!l){l=!0;try{const d=o?document.querySelector("select[name='id'], input[name='id']")?.value:void 0,{showPlanIds:u,hidePlanIds:h,swapMap:p}=le(i,s,d);a.swapMap=p;const b=D(i,"widgetParent"),E=D(i,"subscriptionPlans"),S=D(i,"subscriptionInput");if(!b.length||!E.length||!S.length)return;const C=document.querySelector(b[0].selector);if(!C?.shadowRoot)return;const _=C.shadowRoot.querySelector(E[0].selector);if(!_?.shadowRoot)return;const T=S[0].selector;let m=null;if(i.widget.widgetType==="buttons"||i.widget.widgetType==="radio"){const y=Array.from(_.shadowRoot.querySelectorAll(T));if(!y.length)return;for(const v of y){const g=v.closest("label");g&&(u.includes(v.value)?g.style.display="":h.includes(v.value)&&(g.style.display="none"))}const w=y.some(v=>u.includes(v.value)&&v.checked),I=y.some(v=>h.includes(v.value)&&v.checked);if((w||I)&&(n=!1),!w&&!n){n=!0;for(const v of y)if(u.includes(v.value)){v.closest("label")?.click(),v.dispatchEvent(new Event("change",{bubbles:!0}));break}}const f=y.find(v=>v.checked);m=f&&u.includes(f.value)?f.value:u[0]??null}else if(i.widget.widgetType==="dropdown"){const y=_.shadowRoot.querySelector("select");if(!y)return;for(const w of Array.from(y.options))h.includes(w.value)&&(w.style.display="none",w.disabled=!0);if(h.includes(y.value)){const w=Array.from(y.options).find(I=>u.includes(I.value));w&&(y.value=w.value,y.dispatchEvent(new Event("change",{bubbles:!0})))}m=u.includes(y.value)?y.value:u[0]??null}if(m){const y=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const w of y)w.value!==m&&(w.value=m)}}finally{l=!1}}}if(a.subscriptionHideWrongPlans=c,a.swapMap=le(i,s).swapMap,c(),o){const d=document.querySelector("select[name='id'], input[name='id']");d&&d.addEventListener("change",c)}}function B(a){const e=D(a,"widgetParent");return e.length?document.querySelector(e[0].selector)?.shadowRoot??null:null}function Y(a,e){const t=D(a,"subscriptionPlans");return t.length?e.querySelector(t[0].selector)?.shadowRoot??null:null}function Z(a,e){const t=new URLSearchParams(window.location.search).get("variant");if(t)return t;{const i=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(i)return i}return a.size>0?[...a.keys()][0]:void 0}function G(a,e){return H(a,e.moneyFormat,e.currency,e.currencyCodeEnabled)}function Fe({originalFetch:a,swapMap:e,slptValue:t,getSelectedPlanId:i,log:s}){if(window.fetch.__shoplift_intercepted)return s("[SUB-INTERCEPT] already installed — skipping"),()=>{};function r(n){if(i){const l=i();if(l)return e[l]??l}return e[n]??n}const o=function(n,l){if((typeof n=="string"?n:n instanceof URL?n.href:n.url).includes("/cart/add")&&l?.body)try{if(l.body instanceof FormData){const d=l.body.get("selling_plan");d?l.body.set("selling_plan",r(String(d))):(!d||d==="")&&t&&l.body.set("properties[_slpt]",t)}
8else if(typeof l.body=="string"){const d=JSON.parse(l.body);if(d.items)for(const u of d.items){const h=String(u.selling_plan??"");h?u.selling_plan=r(h):!u.selling_plan&&t&&(u.properties||(u.properties={}),u.properties._slpt=t)}else if(d.id){const u=String(d.selling_plan??"");u?d.selling_plan=r(u):!d.selling_plan&&t&&(d.properties||(d.properties={}),d.properties._slpt=t)}l.body=JSON.stringify(d)}}catch(d){s("[SUB-INTERCEPT] body parse failed; cart-add proceeds with un-swapped plan",d)}return a.call(window,n,l)};return o.__shoplift_intercepted=!0,window.fetch=o,function(){window.fetch===o&&(window.fetch=a)}}function Be({log:a}){if(window.fetch.__shoplift_intercepted)return a("[SUB-PREVIEW-BLOCK] already installed — skipping"),()=>{};const e=window.fetch,t=function(i,s){const r=typeof i=="string"?i:i instanceof URL?i.href:i.url;return r.includes("/cart/add")?(a("[SUB-PREVIEW-BLOCK] cart-add blocked in preview mode",{url:r}),Promise.resolve(new Response(JSON.stringify({id:0,properties:{},quantity:0,variant_id:0,key:"preview",title:"Preview — cart-add blocked",price:0,original_price:0,line_price:0,original_line_price:0,total_discount:0,discounts:[],preview:!0}),{status:200,headers:{"Content-Type":"application/json"}}))):e.call(window,i,s)};return t.__shoplift_intercepted=!0,window.fetch=t,function(){window.fetch===t&&(window.fetch=e)}}function pe({data:a,runUpdates:e,debounceMs:t=150}){let i=null;function s(){i&&clearTimeout(i),e(),i=setTimeout(e,t)}let r=null;const o=[],n={childList:!0,subtree:!0,characterData:!0,attributes:!0};function l(h){for(const p of o)p.disconnect();o.length=0;for(const p of Array.from(h.querySelectorAll("*")))if(p.shadowRoot){const b=new MutationObserver(s);b.observe(p.shadowRoot,n),o.push(b)}}function c(){const h=B(a);return h?(r&&r.disconnect(),l(h),r=new MutationObserver(p=>{p.some(b=>b.type==="childList"&&b.addedNodes.length>0)&&l(h),s()}),r.observe(h,n),!0):!1}const d=document.body||document.documentElement,u=new MutationObserver(()=>{c()&&s()});return u.observe(d,{childList:!0,subtree:!0}),c()&&s(),e(),function(){i&&(clearTimeout(i),i=null),u.disconnect(),r&&(r.disconnect(),r=null);for(const p of o)p.disconnect();o.length=0}}async function ze(a){if(a.subscriptionPriceDone)return;const e=a.getActiveAssignment(),t=e?a.getHypothesis(e.hypothesisId):void 0,i=t?.subscriptionData?null:a.findActiveSubscriptionTestControl(),s=t?.subscriptionData?t:i?.hypothesis;if(!s?.subscriptionData)return;const r=t?.subscriptionData?e.testId:i.testId;a.subscriptionPriceDone=!0;const o=s.subscriptionData,n=s.isControl,l=s.priceData,c=o.widget.widgetType;let d=W(l),u=J(o,d),h=u.discountMap,p=u.maxDiscount;function b(){const g=W(l);g!==d&&(d=g,u=J(o,d),h=u.discountMap,p=u.maxDiscount,a.log(`[SUB-PRICE] scope refreshed side=${n?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${p}`))}a.log(`[SUB-PRICE] side=${n?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${p}`),a.updatePriceTestHiddenInputs(r,n?"control":"variant",!1);function E(){if(!l)return null;const g=j(l),P=Z(g),A=ce(o,P,d);if(!de(A,n))return null;const k=P?g.get(P):void 0;return k?{formattedVariantPrice:G(k.priceInCents,l),formattedDiscounted:G(k.priceInCents*(1-p/100),l)}:null}Fe({originalFetch:a.fetch,swapMap:a.swapMap??{},slptValue:a.slptValue??void 0,log:a.log,getSelectedPlanId:()=>{const g=B(o);if(!g)return null;const P=Y(o,g);if(!P)return null;const A=D(o,"subscriptionInput"),k=A.length?A[0].selector:'input[name="rc_plan"]';return P.querySelector(`${k}:checked`)?.value??null}});function S(g){const P=D(o,"subscriptionDiscount");for(const A of P)if(A.selector.includes("badge")||A.selector.includes("__badge")){const k=g.querySelector(A.selector);k?.textContent&&!k.textContent.includes(`${p}%`)&&$(k,x=>N(x,p))}}function C(g){const P=E();if(!P)return;const A=D(o,"subscriptionCompareAt");for(const k of A){const x=g.querySelector(k.selector)||g.querySelector(`[part~="${k.selector}"]`);x?.textContent&&!x.textContent.includes(P.formattedVariantPrice)&&$(x,R=>/\d/.test(R)?P.formattedVariantPrice:R)}}function _(g,P){const A=D(o,"subscriptionCompareAt"),k=P===0?"none":"";for(const x of A){const R=g.querySelector(x.selector)||g.querySelector(`[part~="${x.selector}"]`);R&&(k==="none"?R.style.display!=="none"&&(R.style.display="none"):R.style.display==="none"&&(R.style.display=""))}}function T(g){const P=D(o,"subscriptionInput"),A=P.length?P[0].selector:'input[name="rc_plan"]',k=D(o,"subscriptionPlanDiscount"),x=k.length?k[0].selector:".rc-plans-button__discount";for(const R of Array.from(g.querySelectorAll("label"))){const O=R.querySelector(A),V=R.querySelector(x);
8if(O&&V){const L=h[O.value];if(L!==void 0){if(L===0)V.style.display!=="none"&&(V.style.display="none");else if(V.style.display==="none"&&(V.style.display=""),V.textContent){const Q=V.textContent.match(/[\d.]+%/)?.[0];Q&&Q!==`${L}%`&&$(V,et=>N(et,L))}}}}}function m(g){const P=g.querySelector("select");if(P)for(const A of Array.from(P.options)){const k=h[A.value];if(k!==void 0&&A.textContent){const x=A.textContent.match(/[\d.]+%/)?.[0];x&&x!==`${k}%`&&(A.textContent=N(A.textContent,k))}}}function y(g,P){const k=D(o,"subscriptionDiscount").filter(x=>x.selector.includes("benefit")||x.selector==="rc-benefits");for(const x of k){const R=g.querySelector(x.selector);if(R?.shadowRoot){for(const O of Array.from(R.shadowRoot.querySelectorAll("li")))if(O.textContent?.includes("Save")){const V=O;if(P===0)V.style.display!=="none"&&(V.style.display="none");else{V.style.display==="none"&&(V.style.display="");const L=O.textContent.match(/[\d.]+%/)?.[0];L&&L!==`${P}%`&&$(O,Q=>N(Q,P))}}}}}let w=!1;function I(){if(!w){w=!0;try{if(b(),d!==null&&Object.keys(h).length===0)return;const g=B(o);if(!g)return;S(g),l&&C(g);const P=Y(o,g);let A=p;if(P){const k=D(o,"subscriptionInput"),x=k.length?k[0].selector:'input[name="rc_plan"]',R=P.querySelector(`${x}:checked`);if(R){const O=h[R.value];O!==void 0&&(A=O)}c==="buttons"||c==="radio"?T(P):m(P)}_(g,A),y(g,A)}finally{w=!1}}}function f(){const g=E();if(!g)return;const P=B(o);if(!P)return;const A=D(o,"onetimeToggle"),k=A.length?A[0].selector:'input[value="onetime"]';if(!P.querySelector(k)?.checked)return;const R=D(o,"subscriptionPrice");for(const O of R){const V=P.querySelector(O.selector)||P.querySelector(`[part~="${O.selector}"]`);V?.textContent&&!V.textContent.includes(g.formattedDiscounted)&&$(V,L=>/\d/.test(L)?g.formattedDiscounted:L)}}function v(){a.subscriptionHideWrongPlans&&a.subscriptionHideWrongPlans(),I(),a.subscriptionUpdateOneTime&&a.subscriptionUpdateOneTime(),f()}pe({data:o,runUpdates:v})}async function We(a){if(a.subscriptionOneTimeDone)return;const e=a.getActiveAssignment(),t=e?a.getHypothesis(e.hypothesisId):void 0,i=!!(t?.subscriptionData&&t.priceData),s=i?null:a.findActiveSubscriptionTestControl(),r=i?t:s?.hypothesis;if(!r?.subscriptionData||!r.priceData)return;const o=i?e.testId:s.testId;a.subscriptionOneTimeDone=!0;const n=r.subscriptionData,l=r.priceData,c=j(l),d=r.isControl,u=d?"control":"variant";a.slptValue=`${o}:${u}:f`,a.updatePriceTestHiddenInputs(o,u,!1);function h(){const p=B(n);if(!p)return;const b=Z(c);if(!b)return;const E=W(l),S=ce(n,b,E);if(!de(S,d))return;const C=c.get(b);if(!C)return;const _=H(C.priceInCents,l.moneyFormat,l.currency,l.currencyCodeEnabled),T=D(n,"onetimePrice");if(!T.length)return;const m=D(n,"onetimeContainer"),y=m.length?m[0].selector:'[part~="rc-purchase-option__onetime"]',I=p.querySelector(y)??p;for(const f of T){let v=null;try{v=I.querySelector(f.selector)}catch{v=null}v??=I.querySelector(`[part~="${f.selector}"]`),v&&v.textContent&&!v.textContent.includes(_)&&$(v,g=>/\d/.test(g)?_:g)}}a.subscriptionUpdateOneTime=h,h()}async function Ge(a,e){const{subscriptionPreviewRender:t}=await Ne(async()=>{const{subscriptionPreviewRender:i}=await Promise.resolve().then(()=>Xe);return{subscriptionPreviewRender:i}},void 0);return t(a.subscriptionData,a.priceData,a.isControl,e)}function je(a,e){const t=a.widget.selectors.widgetParent??[],i=a.widget.selectors.subscriptionPlans??[],s=a.widget.selectors.subscriptionInput??[];if(!t.length||!i.length||!s.length){e("[SUB-GLOBAL-HIDE] Missing required selectors — skipping");return}const r=t[0].selector,o=i[0].selector,n=s[0].selector;let l=!1,c=null,d=!1;function u(){if(!d){d=!0;try{h()}finally{d=!1}}}function h(){const C=document.querySelector(r);if(!C?.shadowRoot)return;const _=C.shadowRoot.querySelector(o);if(!_?.shadowRoot)return;_.shadowRoot!==c&&(c=_.shadowRoot,l=!1);let T=0;if(a.widget.widgetType==="buttons"||a.widget.widgetType==="radio"){const m=Array.from(_.shadowRoot.querySelectorAll(n));for(const f of m)if(a.planIds.includes(f.value)){f.disabled||(f.disabled=!0);const v=f.closest("label");v&&v.style.display!=="none"&&(v.style.display="none",T++)}const y=m.filter(f=>!a.planIds.includes(f.value));if(!y.some(f=>f.checked)&&!l&&y.length>0){l=!0;const f=y[0];f.closest("label")?.click(),f.dispatchEvent(new Event("change",{bubbles:!0})),e(`[SUB-GLOBAL-HIDE] Preselected first visible plan input=${f.value}`)}const I=y.find(f=>f.checked)??y[0];
8if(I){const f=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const v of f)v.value!==I.value&&(v.value=I.value,e(`[SUB-GLOBAL-HIDE] Mirrored plan id ${I.value} to form selling_plan input`))}}else if(a.widget.widgetType==="dropdown"){const m=_.shadowRoot.querySelector("select");if(!m)return;for(const I of Array.from(m.options))a.planIds.includes(I.value)&&(I.style.display!=="none"&&(I.style.display="none"),I.disabled||(I.disabled=!0),T++);const y=Array.from(m.options).filter(I=>!a.planIds.includes(I.value)),w=y.some(I=>I.value===m.value);y.length>0&&!w&&!l&&(l=!0,m.value=y[0].value,m.dispatchEvent(new Event("change",{bubbles:!0})),e(`[SUB-GLOBAL-HIDE] Preselected first visible option=${y[0].value}`))}T>0&&e(`[SUB-GLOBAL-HIDE] Hidden ${T} B-side plan buttons`)}const p={childList:!0,subtree:!0,characterData:!0};let b=null;function E(C){b?.disconnect(),b=new MutationObserver(()=>u()),b.observe(C,p)}function S(){const C=document.querySelector(r);if(!C?.shadowRoot)return!1;u(),new MutationObserver(()=>{u();const m=C.shadowRoot.querySelector(o);m?.shadowRoot&&E(m.shadowRoot)}).observe(C.shadowRoot,p);const T=C.shadowRoot.querySelector(o);return T?.shadowRoot&&E(T.shadowRoot),!0}if(!S()){e("[SUB-GLOBAL-HIDE] Widget not in DOM yet — waiting via MutationObserver");const C=new MutationObserver(()=>{S()&&C.disconnect()});C.observe(document.body??document.documentElement,{childList:!0,subtree:!0})}}const ue="Limited preview",Ke="Add-to-cart and checkout prices won't reflect this test until it launches — test selling plans are not created in your subscription app until after a test is launched.",Je=5e3;function Ye(){const a=document.createElement("div");a.id="shoplift-preview-subscription-warning";const e=document.createElement("span");e.id="shoplift-preview-subscription-warning__icon",e.setAttribute("aria-hidden","true"),e.textContent="!";const t=document.createElement("span");t.id="shoplift-preview-subscription-warning__label",t.textContent=ue;const i=document.createElement("div");i.id="shoplift-preview-subscription-warning__tooltip",i.setAttribute("role","tooltip"),i.textContent=Ke,a.appendChild(e),a.appendChild(t),a.appendChild(i),a.setAttribute("tabindex","0"),a.setAttribute("aria-describedby",i.id),a.setAttribute("aria-label",ue);let s=null;function r(){s!==null&&(clearTimeout(s),s=null)}function o(){i.classList.add("shoplift-preview-subscription-warning__tooltip--visible")}function n(){i.classList.remove("shoplift-preview-subscription-warning__tooltip--visible")}function l(){o(),r(),s=setTimeout(()=>{n(),s=null},Je)}function c(){r(),o()}function d(){s===null&&n()}a.addEventListener("mouseenter",c),a.addEventListener("mouseleave",d),a.addEventListener("focus",c),a.addEventListener("blur",d);function u(p){try{const b=p.target;if(!(b instanceof Element))return;(b.closest('form[action*="/cart/add"] button[type="submit"], form[action*="/cart/add"] input[type="submit"]')!==null||b.closest('[name="add"], button[name="add"], [data-add-to-cart], button[data-add-to-cart]')!==null)&&l()}catch{}}document.addEventListener("click",u,!0);function h(){r(),document.removeEventListener("click",u,!0),a.removeEventListener("mouseenter",c),a.removeEventListener("mouseleave",d),a.removeEventListener("focus",c),a.removeEventListener("blur",d),a.remove()}return{root:a,tooltip:i,cleanup:h}}let he=!1;class Ze{DATA_SL_ATTRIBUTE_P="data-sl-attribute-p";DATA_SL_TEST_ID="data-sl-test-id";VIEWPORT_TRACK_THRESHOLD=.5;temporarySessionKey="Shoplift_Session";essentialSessionKey="Shoplift_Essential";analyticsSessionKey="Shoplift_Analytics";priceSelectorsSessionKey="Shoplift_PriceSelectors_v2";shop;host;eventHost;disableReferrerOverride;legacySessionKey;cssHideClass;testConfigs;inactiveTestConfigs;hiddenSubscriptionPlans;testsFilteredByAudience;sendPageView;shopliftDebug;gaConfig;telemetryEnabled;getCountryTimeout;geoViaShopify;resolvedRegion=null;state;subscriptionPreviewWarningCleanup=null;shopifyAnalyticsId;cookie=document.cookie;isSyncing=!1;isSyncingGA=!1;fetch;localStorageSet;localStorageGet;sessionStorageSet=window.sessionStorage.setItem.bind(window.sessionStorage);sessionStorageGet=window.sessionStorage.getItem.bind(window.sessionStorage);
8urlParams=new URLSearchParams(window.location.search);device;logHistory;activeViewportObservers=new Map;clientIdRetryCount=0;constructor(e,t,i,s,r,o,n,l,c,d,u,h,p,b=!1){this.shop=e,this.host=t,this.eventHost=i,this.disableReferrerOverride=l,this.logHistory=[],this.legacySessionKey=`SHOPLIFT_SESSION_${this.shop}`,this.cssHideClass=s?"shoplift-hide":"",this.testConfigs=u.map(S=>({...S,startAt:new Date(S.startAt),statusHistory:S.statusHistory.map(C=>({...C,createdAt:new Date(C.createdAt)}))})),this.inactiveTestConfigs=h,this.hiddenSubscriptionPlans=p,this.sendPageView=!!r,this.shopliftDebug=o===!0,this.telemetryEnabled=c===!0,this.geoViaShopify=b===!0,this.gaConfig=n!=={"sendEvents":false,"mode":"gtag"}?n:{sendEvents:!1},this.fetch=window.fetch.bind(window),this.localStorageSet=window.localStorage.setItem.bind(window.localStorage),this.localStorageGet=window.localStorage.getItem.bind(window.localStorage);const E=this.getDeviceType();this.device=E!=="tablet"?E:"mobile",this.state=this.loadState(),this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.testsFilteredByAudience=u.filter(S=>
8S.status=="active"),this.getCountryTimeout=d===1000?1e3:d,window.__slReadCookie=S=>{const C=this.getCookie(S);if(C===null)return null;try{return decodeURIComponent(C)}catch{return C}},this.log("State Loaded",JSON.stringify(this.state))}deriveCategoryFromExistingTests(){if(!this.state.temporary.testCategory&&this.state.essential.visitorTests.length>0){const e=this.state.essential.visitorTests.some(t=>{if(!t.hypothesisId)return!1;const i=this.getHypothesis(t.hypothesisId);return i&&["theme","basicScript","price"].includes(i.type)});this.state.temporary.testCategory=e?"global":"conditional",this.persistTemporaryState(),this.log("Derived test category from existing visitorTests: %s",this.state.temporary.testCategory)}}async init(){try{if(this.log("Shoplift script initializing"),window.Shopify&&window.Shopify.designMode){this.log("Skipping script for design mode");return}if(window.location.href.includes("slScreenshot=true")){this.log("Skipping script for screenshot");return}if(window.location.hostname.endsWith(".edgemesh.com")){this.log("Skipping script for preview");return}if(window.location.href.includes("isShopliftMerchant")){const o=this.urlParams.get("isShopliftMerchant")==="true";this.log("Setting merchant session to %s",o),this.state.temporary.isMerchant=o,this.persistTemporaryState()}if(this.state.temporary.isMerchant){this.log("Setting up preview for merchant"),typeof window.shoplift!="object"&&this.setShopliftStub(),this.state.temporary.previewConfig||this.hidePage(),await this.initPreview(),document.querySelector("#sl-preview-bar-hide")?.remove();return}if(this.state.temporary.previewConfig=void 0,we(navigator.userAgent))return;const e=Date.now(),t=!this.state.temporary.lastSeen||e-this.state.temporary.lastSeen>1800*1e3;(!this.state.temporary.entryPage||t)&&(this.state.temporary.entryPage=K(window.location.href)),this.state.temporary.lastSeen=e,this.persistTemporaryState(),window.__slEntryPage=this.state.temporary.entryPage??"";const i=this.state.essential.visitorTests.filter(o=>o.hypothesisId&&+o.createdAt>Date.now()-6e4);if(i.length===0)this.sendDiagnosticTelemetry("page-landed",null);else for(const o of i)this.sendDiagnosticTelemetry("page-landed",o.testId,{hypothesisId:o.hypothesisId,isControl:o.assignedTo==="control",testType:o.testType??"unknown"});if(navigator.userAgent.includes("Chrome/118")){this.log("Random: %o",[Math.random(),Math.random(),Math.random()]);const o=await this.makeRequest({url:`${this.eventHost}/api/v0/events/ip`,method:"get"}).then(n=>n?.json());this.log(`IP: ${o}`),this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify(this.debugState(),ee)}).catch()}if(this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.monitorConsentChange(),this.checkForThemePreview())return;if(!this.disableReferrerOverride&&this.state.temporary.originalReferrer!=null){this.log(`Overriding referrer from '${document.referrer}' to '${this.state.temporary.originalReferrer}'`);const o=this.state.temporary.originalReferrer;delete this.state.temporary.originalReferrer,this.persistTemporaryState(),Object.defineProperty(document,"referrer",{get:()=>o,enumerable:!0,configurable:!0})}if(await this.refreshVisitor(this.shopifyAnalyticsId),await this.handleVisitorTest()){this.log("Redirecting for visitor test");return}this.setShoplift(),this.showPage(),this.ensureCartAttributesForExistingPriceTests(!1);const r=this.state.essential.visitorTests.some(o=>(o.hypothesisId?this.getHypothesis(o.hypothesisId):void 0)?.subscriptionData!=null)||Object.values(this.state.temporary.testReservations??{}).some(o=>this.getHypothesis(o.hypothesisId)?.subscriptionData!=null);this.hiddenSubscriptionPlans&&!r&&(this.log(`[SUB-GLOBAL] Visitor not in subscription test — hiding ${this.hiddenSubscriptionPlans.planIds.length} B-side plans`),je(this.hiddenSubscriptionPlans,o=>this.log(o))),await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange(),await this.finalize(),console.log("SHOPLIFT SCRIPT INITIALIZED!")}catch(e){if(e instanceof ie)return;throw e}finally{typeof window.shoplift!="object"&&this.setShopliftStub()}}getVariantColor(e){switch(e){case"a":return{text:"#141414",bg:"#E2E2E2"};case"b":return{text:"rgba(255, 255, 255, 1)",bg:"rgba(37, 99, 235, 1)"}}}getDefaultVariantTitle(e){return e.title?e.title:e.type==="price"?e.isControl?"Original prices":"Variant prices":e.isControl?"Original":"Untitled variant "+e.label.toUpperCase()}
8async initPreview(){const e=this.urlParams.get("previewConfig");if(e){this.state.temporary.previewConfig=void 0,this.log("Setting up the preview"),this.log("Found preview config, writing to temporary state");const t=await Oe(e);if(this.state.temporary.previewConfig=t,this.state.temporary.previewConfig.testTypeCategory===M.Price){this.hidePage(!0);const s=this.state.temporary.previewConfig;let r=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/${s.isDraft||!1}`;s.shopifyProductId&&(r+=`?productId=${s.shopifyProductId}`);const o=await this.makeJsonRequest({method:"get",url:r}).catch(n=>(this.log("Error getting domSelectors",n),null));if(s.variants.forEach(n=>n.domSelectors=o[n.id]?.domSelectors),s.isDraft){const n=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/subscription-preview`,l=await this.makeJsonRequest({method:"get",url:n}).catch(c=>(this.log("No subscription preview data for draft (test may not have a subscription widget)",c),null));l?.subscriptionData&&s.variants.forEach(c=>{c.subscriptionData=l.subscriptionData,c.priceData=l.priceData})}}this.persistTemporaryState();const i=new URL(window.location.toString());i.searchParams.delete("previewConfig"),this.queueRedirect(i)}else if(this.state.temporary.previewConfig){this.showPage();const t=this.state.temporary.previewConfig;if(t.testTypeCategory===M.Template&&this.handleTemplatePreview(t)&&this.initPreviewControls(t),t.testTypeCategory===M.UrlRedirect&&this.handleUrlPreview(t)&&this.initPreviewControls(t),t.testTypeCategory===M.Script&&this.handleScriptPreview(t)&&this.initPreviewControls(t),t.testTypeCategory===M.Price){const i=await this.handlePricePreview(t);t.isDraft?await this.handleSubscriptionPricePreview(t):await this.handleSubscriptionLivePreview(t),i&&this.initPreviewControls(t)}}}initPreviewControls(e){document.addEventListener("DOMContentLoaded",()=>{const t=e.variants.find(b=>b.id===e.currentVariant),i=t?.label||"a",s=e.variants,r=document.createElement("div");r.id="shoplift-preview-control";const o=document.createElement("div"),n=document.createElement("img");n.src=Ve,n.height=24,n.width=14,o.style.padding="0 16px",o.style.lineHeight="100%",o.appendChild(n),r.appendChild(o);const l=document.createElement("div");l.id="shoplift-preview-variant-selector";const c=document.createElement("button");c.id="shoplift-preview-variant-menu-trigger";const d=document.createElement("div");d.className="menu-variant-label",d.style.backgroundColor=this.getVariantColor(i).bg,d.style.color=this.getVariantColor(i).text,d.innerText=i.toUpperCase(),c.appendChild(d);const u=document.createElement("span");if(u.id="shoplift-preview-variant-title",u.innerText=t?this.getDefaultVariantTitle(t):"Untitled variant "+i.toUpperCase(),c.appendChild(u),s.length>1){const b=document.createElement("img");b.src=De,b.width=12,b.height=12,b.style.height="12px",b.style.width="12px",c.appendChild(b);const E=document.createElement("div");E.className="preview-variant-menu";for(const S of e.variants.filter(C=>C.id!==e.currentVariant)){const C=document.createElement("div");C.className="preview-variant-menu--item";const _=document.createElement("div");_.className="menu-variant-label",_.style.backgroundColor=this.getVariantColor(S.label).bg,_.style.color=this.getVariantColor(S.label).text,_.style.flexShrink="0",_.innerText=S.label.toUpperCase(),C.appendChild(_);const T=document.createElement("span");T.innerText=this.getDefaultVariantTitle(S),C.appendChild(T),C.addEventListener("click",()=>{this.pickVariant(S.id)}),E.appendChild(C)}l.appendChild(E),c.addEventListener("click",()=>{E.className!=="preview-variant-menu preview-variant-menu__visible"?E.classList.add("preview-variant-menu__visible"):E.classList.remove("preview-variant-menu__visible")}),document.addEventListener("click",S=>{S.target instanceof Element&&!c.contains(S.target)&&E.className==="preview-variant-menu preview-variant-menu__visible"&&E.classList.remove("preview-variant-menu__visible")})}else c.style.pointerEvents="none",d.style.margin="0";if(l.appendChild(c),r.appendChild(l),e.hasSubscription){this.subscriptionPreviewWarningCleanup?.();const b=Ye();r.appendChild(b.root),this.subscriptionPreviewWarningCleanup=b.cleanup}const h=document.createElement("div"),p=document.createElement("button");p.id="shoplift-exit-preview-button",p.innerText="Exit",h.appendChild(p),p.addEventListener("click",()=>{this.exitPreview()}),r.appendChild(h),document.body.appendChild(r),requestAnimationFrame(()=>{r.classList.add("visible")})}),this.ensureCartAttributesForExistingPriceTests(!0)}pickVariant(e){if(this.state.temporary.previewConfig){const t=this.state.temporary.previewConfig,i=new URL(window.location.toString());if(t.testTypeCategory===M.UrlRedirect){const s=t.variants.find(r=>r.id===t.currentVariant)?.redirectUrl;if(i.pathname===s){const r=t.variants.find(o=>o.id===e)?.redirectUrl;r&&(i.pathname=r)}}if(t.testTypeCategory===M.Template){const s=t.variants.find(r=>r.id===t.currentVariant)?.pathName;if(s&&i.pathname===s){const r=t.variants.find(o=>o.id===e)?.pathName;r&&r!==s&&(i.pathname=r)}}t.currentVariant=e,this.persistTemporaryState(),this.queueRedirect(i)}}exitPreview(){const e=new URL(window.location.toString());if(this.state.temporary.previewConfig?.testTypeCategory===M.Template&&e.searchParams.delete("view"),this.state.temporary.previewConfig?.testTypeCategory===M.Script&&e.searchParams.delete("slVariant"),this.state.temporary.previewConfig?.testTypeCategory===M.UrlRedirect){const i=this.state.temporary.previewConfig.variants.filter(r=>!r.isControl&&r.redirectUrl!==null).map(r=>r.redirectUrl),s=this.state.temporary.previewConfig.variants.find(r=>r.label==="a")?.redirectUrl;i.includes(e.pathname)&&s&&(e.pathname=s)}this.state.temporary.isMerchant=!1,e.searchParams.delete("isShopliftMerchant"),this.state.temporary.previewConfig=void 0,this.persistTemporaryState(),this.subscriptionPreviewWarningCleanup?.(),this.subscriptionPreviewWarningCleanup=null,this.hidePage(),this.queueRedirect(e)}handleTemplatePreview(e){const t=e.currentVariant,i=e.variants.find(l=>l.id===t);if(!i)return!1;const s=e.variants.find(l=>l.isControl);if(!s)return!1;this.log("Setting up template preview for type",s.type);
8const r=new URL(window.location.toString()),o=r.searchParams.get("view"),n=i.type===s.type;return!n&&!i.isControl&&template.suffix===s.affix&&this.typeFromTemplate()===s.type&&i.pathName!==null?(this.log("Hit control template type, redirecting to the variant url"),this.hidePage(),r.pathname=i.pathName,this.queueRedirect(r),!0):(!i.isControl&&this.typeFromTemplate()==i.type&&template.suffix===s.affix&&n&&o!==(i.affix||"__DEFAULT__")&&(this.log("Template type and affix match control, updating the view param"),r.searchParams.delete("view"),this.log("Setting the new viewParam to",i.affix||"__DEFAULT__"),this.hidePage(),r.searchParams.set("view",i.affix||"__DEFAULT__"),this.queueRedirect(r)),o!==null&&o!==(i.affix||"__DEFAULT__")&&(r.searchParams.delete("view"),this.hidePage(),this.queueRedirect(r)),!0)}handleUrlPreview(e){const t=e.currentVariant,i=e.variants.find(o=>o.id===t),s=e.variants.find(o=>o.isControl)?.redirectUrl;if(!i)return!1;this.log("Setting up URL redirect preview");const r=new URL(window.location.toString());return r.pathname===s&&!i.isControl&&i.redirectUrl!==null&&(this.log("Url matches control, redirecting"),this.hidePage(),r.pathname=i.redirectUrl,this.queueRedirect(r)),!0}handleScriptPreview(e){const t=e.currentVariant,i=e.variants.find(o=>o.id===t);if(!i)return!1;this.log("Setting up script preview");const s=new URL(window.location.toString());return s.searchParams.get("slVariant")!==i.id&&(this.log("current id doesn't match the variant, redirecting"),s.searchParams.delete("slVariant"),this.log("Setting the new slVariantParam"),this.hidePage(),s.searchParams.set("slVariant",i.id),this.queueRedirect(s)),!0}async handlePricePreview(e){const t=e.currentVariant,i=e.variants.find(s=>s.id===t);return i?(this.log("Setting up price preview"),i.domSelectors&&i.domSelectors.length>0&&(U(document,{testId:e.testId,hypothesisId:i.id,selectors:i.domSelectors}),this.ensureCartAttributesForExistingPriceTests(!0)),!0):!1}async handleSubscriptionPricePreview(e){const t=e.variants.find(i=>i.id===e.currentVariant);t?.subscriptionData&&(this.log("Setting up subscription price preview"),await Ge({id:t.id,isControl:t.isControl,subscriptionData:t.subscriptionData,priceData:t.priceData},(i,...s)=>this.log(i,...s)))}async handleSubscriptionLivePreview(e){this.testConfigs.find(s=>s.id===e.testId)?.hypotheses.find(s=>s.id===e.currentVariant)?.subscriptionData&&(this.log("Setting up subscription live preview"),this.subscriptionSwapDone=!1,this.subscriptionOneTimeDone=!1,this.subscriptionPriceDone=!1,await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange())}async finalize(){const e=await this.getCartState();e!==null&&this.queueCartUpdate(e),this.pruneStateAndSave(),await this.syncAllEvents()}setShoplift(){this.log("Setting up public API");const t=this.urlParams.get("slVariant")==="true",i=t?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:async s=>{if(this.log("Script checking variant for hypothesis '%s'",s),t)return this.log("Forcing variant for hypothesis '%s'",s),!0;if(i!==null)return this.log("Forcing hypothesis '%s'",i),s===i;const r=this.testConfigs.find(n=>n.hypotheses.some(l=>l.id===s));if(!r)return this.log("No test found for hypothesis '%s'",s),!1;const o=this.state.essential.visitorTests.find(n=>n.testId===r.id);return o?(this.log("Active visitor test found",s),o.hypothesisId===s):(await this.manuallySplitVisitor(r),this.testConfigs.some(n=>n.hypotheses.some(l=>l.id===s&&this.state.essential.visitorTests.some(c=>c.hypothesisId===l.id))))},setAnalyticsConsent:async s=>{await this.onConsentChange(s,!0)},getVisitorData:()=>({visitor:this.state.analytics.visitor,visitorTests:this.state.essential.visitorTests.filter(s=>!s.isInvalid).map(s=>{const{shouldSendToGa:r,savedAt:o,...n}=s;return n})})}}setShopliftStub(){this.log("Setting up stubbed public API");const t=this.urlParams.get("slVariant")==="true",i=t?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:s=>Promise.resolve(t||s===i),setAnalyticsConsent:()=>Promise.resolve(),getVisitorData:()=>({visitor:null,visitorTests:[]})}}async manuallySplitVisitor(e){this.log("Starting manual split for test '%s'",e.id),await this.handleVisitorTest([e]);const t=this.getReservationForTest(e.id);t&&!t.isRealized&&t.entryCriteriaKey&&(this.log("Realizing manual API reservation for test '%s'",e.id),this.realizeReservationForCriteria(t.entryCriteriaKey)),this.saveState(),this.syncAllEvents()}async handleVisitorTest(e){await this.filterTestsByAudience(this.testConfigs,this.state.analytics.visitor??this.buildBaseVisitor(),this.state.essential.visitorTests),this.pruneStaleVisitorTests(),this.deriveC
8ategoryFromExistingTests(),this.clearStaleReservations();let t=e?e.filter(i=>this.testsFilteredByAudience.some(s=>s.id===i.id)):[...this.testsForUrl(this.testsFilteredByAudience),...this.domTestsForUrl(this.testsFilteredByAudience)];try{if(t.length===0)return this.log("No tests found"),!1;this.log("Checking for existing visitor test on page");const i=this.getCurrentVisitorHypothesis(t);if(i){this.log("Found current visitor test");const l=this.considerRedirect(i);return l&&(this.log("Redirecting for current visitor test"),this.redirect(i)),l}const s=this.getReservationForCurrentPage();if(s){this.log("Found matching reservation for current page: %s",s.testId);const l=this.getHypothesis(s.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(s.entryCriteriaKey);const c=this.considerRedirect(l);return c&&this.redirect(l),c}}this.log("No active test relation for test page");const r=this.testsForUrl(this.inactiveTestConfigs.filter(l=>this.testIsPaused(l)&&l.hypotheses.some(c=>this.state.essential.visitorTests.some(d=>d.hypothesisId===c.id)))).map(l=>l.id);if(r.length>0)return this.log("Visitor has paused tests for test page, skipping test assignment: %o",r),!1;if(!this.state.temporary.testCategory){const l=this.testsFilteredByAudience.filter(d=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d))),c=this.testsFilteredByAudience.filter(d=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d)));if(this.log("Category dice roll - global tests: %o, conditional tests: %o",l.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)})),c.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)}))),l.length>0&&c.length>0){const d=l.length,u=c.length,h=d+u,p=Math.random()*h;this.state.temporary.testCategory=p<d?"global":"conditional",this.log("Category dice roll: rolled %.2f of %d (global weight: %d, conditional weight: %d), selected '%s'",p,h,d,u,this.state.temporary.testCategory)}else l.length>0?(this.state.temporary.testCategory="global",this.log("Only global tests available, setting category to global")):(this.state.temporary.testCategory="conditional",this.log("Only conditional tests available, setting category to conditional"));this.persistTemporaryState()}const o=this.state.temporary.testCategory;if(this.log("Visitor test category: %s",o),o==="global"){const l=this.testsFilteredByAudience.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:global");t=t.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}else{const l=this.testsFilteredByAudience.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:conditional");t=t.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}if(t.length===0)return this.log("No tests remaining after category filter"),!1;this.createReservations(t);const n=this.getReservationForCurrentPage();if(n&&!n.isRealized){const l=this.getHypothesis(n.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(n.entryCriteriaKey);const c=this.considerRedirect(l);return c&&(this.log("Redirecting for new test"),this.redirect(l)),c}}return!1}finally{this.includeInDomTests(),this.saveState()}}includeInDomTests(){this.applyControlForAudienceFilteredPriceTests();const e=this.getDomTestsForCurrentUrl(),t=this.getVisitorDomHypothesis(e);for(const i of e){this.log("Evaluating dom test '%s'",i.id);const s=i.hypotheses.some(p=>p.type==="price");if(this.state.essential.visitorTests.find(p=>p.testId===i.id&&p.isInvalid&&!p.hypothesisId)){if(this.log("Visitor is blocked from test '%s', applying control prices if price test",i.id),s){const p=i.hypotheses.find(b=>b.isControl);p?.priceData&&(this.applyPriceTestWithMapLookup(i.id,p,[p],()=>{this.log("Control prices applied for blocked visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1))}continue}const o=this.getReservationForTest(i.id);let n=null,l=!1;const c=t.find(p=>i.hypotheses.some(b=>p.id===b.id));if(o)n=this.getHypothesis(o.hypothesisId)??null,this.log("Using reserved hypothesis '%s' for test '%s'",o.hypothesisId,i.id);else if(c)n=c,this.log("Using existing hypothesis assignment for test '%s'",i.id);else if(s){const p=this.visitorActiveTestTypeWithReservations();p?(l=!0,this.log("Visitor already in test type '%s', treating as non-test for price test '%s'",p,i.id)):n=this.pickHypothesis(i)}else n=this.pickHypothesis(i);if(l&&s){const p=i.hypotheses.find(b=>b.isControl);p?.priceData&&(this.log("Applying control prices for non-test visitor on price test '%s' (Map-based)",i.id),this.applyPriceTestWithMapLookup(i.id,p,[p],()=>{this.log("Control prices applied for non-test visitor, no metrics tracked")}
8),this.updatePriceTestHiddenInputs(i.id,"control",!1));continue}if(!n){this.log("Failed to pick hypothesis for test");continue}this.sendDiagnosticTelemetry("assignment",i.id,{hypothesisId:n.id,isControl:n.isControl,testType:n.type});const d=i.bayesianRevision??4,u=n.type==="price",h=d>=5;if(u&&h){if(this.log(`Price test with Map-based lookup (v${d}): ${i.id}`),!n.priceData){this.log("No price data for hypothesis '%s', skipping",n.id);continue}const p=n.isControl?"control":"variant";this.log(`Setting up Map-based price test for ${p} (test: ${i.id})`),this.applyPriceTestWithMapLookup(i.id,n,i.hypotheses,b=>{const E=this.getReservationForTest(b);E&&!E.isRealized&&E.entryCriteriaKey?this.realizeReservationForCriteria(E.entryCriteriaKey):this.queueAddVisitorToTest(b,n),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(u&&!h){this.log(`Price test without viewport tracking (v${d}): ${i.id}`);const p=this.getDomSelectorsForHypothesis(n);if(p.length===0)continue;U(document,{testId:i.id,hypothesisId:n.id,selectors:p},b=>{this.queueAddVisitorToTest(b,n),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(!n.domSelectors||n.domSelectors.length===0){this.log("No selectors found, skipping hypothesis");continue}U(document,{testId:i.id,hypothesisId:n.id,selectors:n.domSelectors},p=>{this.queueAddVisitorToTest(p,n),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()})}}considerRedirect(e){if(this.log("Considering redirect for hypothesis '%s'",e.id),e.isControl)return this.log("Skipping redirect for control"),!1;if(e.type==="basicScript"||e.type==="manualScript")return this.log("Skipping redirect for script test"),!1;const t=this.state.essential.visitorTests.find(o=>o.hypothesisId===e.id),i=new URL(window.location.toString()),r=new URLSearchParams(window.location.search).get("view");if(e.type==="theme"){if(!(e.themeId===themeId)){if(this.log("Theme id '%s' is not hypothesis theme ID '%s'",e.themeId,themeId),this.isAppProxyPath())return this.log("On App Proxy path, skipping theme redirect to avoid infinite loop"),!1;if(t&&t.themeId!==e.themeId&&(t.themeId===themeId||!this.isThemePreview()))this.log("On old theme, redirecting and updating local visitor"),t.themeId=e.themeId;else if(this.isThemePreview())return this.log("On non-test theme, skipping redirect"),!1;return this.log("Hiding page to redirect for theme test"),this.hidePage(),!0}return!1}else if(e.type!=="dom"&&e.type!=="price"&&e.affix!==template.suffix&&e.affix!==r||e.redirectPath&&!i.pathname.endsWith(e.redirectPath))return this.log("Hiding page to redirect for template test"),this.hidePage(),!0;return this.log("Not redirecting"),!1}redirect(e){if(this.log("Redirecting to hypothesis '%s'",e.id),e.isControl)return;const t=new URL(window.location.toString());if(t.searchParams.delete("view"),e.redirectPath){const n=RegExp("^(/w{2}-w{2})/").exec(t.pathname);if(n&&n.length>1){const l=n[1];t.pathname=`${l}${e.redirectPath}`}else t.pathname=e.redirectPath}else e.type==="theme"?(t.searchParams.set("_ab","0"),t.searchParams.set("_fd","0"),t.searchParams.set("_sc","1"),t.searchParams.set("preview_theme_id",e.themeId.toString())):e.type!=="urlRedirect"&&t.searchParams.set("view",e.affix);const i=this.state.essential.visitorTests.find(n=>n.hypothesisId===e.id)?.testId,s=t.pathname+t.search,r=window.location.pathname+window.location.search,o=K(t.hash);if(i&&s!==r&&!o){const n=qe(),l=He({v:2,t:i,n,fh:Me(window.location.pathname+window.location.search)});t.hash=`slr-${n}`;const c=new Date(Date.now()+3e4).toUTCString();document.cookie=`shoplift_redirect=${l};domain=.${window.location.hostname};path=/;SameSite=Strict;expires=${c}`}s===r&&this.showPage(),this.queueRedirect(t)}async refreshVisitor(e){if(e===null||!this.state.essential.isFirstLoad||!this.testConfigs.some(i=>i.visitorOption!=="all"))return;this.log("Refreshing visitor"),this.hidePage();const t=await this.getVisitor(e);t&&t.id&&this.updateLocalVisitor(t)}buildBaseVisitor(){return{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.device,country:null,...this.state.essential.initialState}}getInitialState(){const e=this.getUTMValue("utm_source")??"",t=this.getUTMValue("utm_medium")??"",i=this.getUTMValue("utm_campaign")??"",s=this.getUTMValue("utm_content")??"",r=window.document.referrer,o=this.device;return{createdAt:new Date,utmSource:e,utmMedium:t,utmCampaign:i,utmContent:s,referrer:r,device:o}}checkForThemePreview(){return this.log("Checking for theme preview"),window.location.hostname.endsWith(".shopifypreview.com")?(this.log("on shopify preview domain"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!1):this.isThemePreview()?this.state.essential.visitorTests.some(e=>e.isThemeTest&&e.hypothesisId!=null&&this.getHypothesis(e.hypothesisId)&&e.themeId===themeId)?(this.log("On active theme test, remov
8ing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):this.state.essential.visitorTests.some(e=>e.isThemeTest&&e.hypothesisId!=null&&!this.getHypothesis(e.hypothesisId)&&e.themeId===themeId)?(this.log("Visitor is on an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.state.essential.isFirstLoad?(this.log("No visitor found on theme preview, redirecting to main theme"),this.redirectToMainTheme(),!0):this.inactiveTestConfigs.some(e=>e.hypotheses.some(t=>t.themeId===themeId))?(this.log("Current theme is an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.testConfigs.some(e=>e.hypotheses.some(t=>t.themeId===themeId))?(this.log("Falling back to clearing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):(this.log("No tests on current theme, skipping script"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!0):(this.log("Not on theme preview"),this.clearThemeBar(!0,!1,this.state),!1)}redirectToMainTheme(){this.hidePage();const e=new URL(window.location.toString());e.searchParams.set("preview_theme_id",""),this.queueRedirect(e)}testsForUrl(e){const t=new URL(window.location.href),i=this.typeFromTemplate();return e.filter(s=>s.hypotheses.some(r=>r.type!=="dom"&&r.type!=="price"&&(r.isControl&&r.type===i&&r.affix===template.suffix||r.type==="theme"||r.isControl&&r.type==="urlRedirect"&&r.redirectPath&&t.pathname.endsWith(r.redirectPath)||r.type==="basicScript"))&&(s.ignoreTestViewParameterEnforcement||!t.searchParams.has("view")||s.hypotheses.map(r=>r.affix).includes(t.searchParams.get("view")??"")))}domTestsForUrl(e){const t=new URL(window.location.href);return e.filter(i=>i.hypotheses.some(s=>s.type!=="dom"&&s.type!=="price"?!1:s.type==="price"&&s.priceData&&s.priceData.variants.length>0?!0:s.domSelectors&&s.domSelectors.some(r=>new RegExp(se(r)).test(K(t.toString())))))}async filterTestsByAudience(e,t,i){const s=[],r=e.some(n=>(n.requiresRegion||this.geoViaShopify&&n.requiresCountry)&&!i.some(l=>l.testId===n.id));this.resolvedRegion===null&&r&&(this.log("Hiding page to wait for Shopify region resolution"),this.hidePage(),await this.waitForResolvedRegion()),window.__slRegion=this.resolvedRegion??"";let o=t.country;this.geoViaShopify?o=this.resolvedRegion?this.resolvedRegion.slice(0,2):o:!o&&e.some(n=>n.requiresCountry&&!i.some(l=>l.testId===n.id))&&(this.log("Hiding page to check geoip"),this.hidePage(),o=await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/get-country`,signal:AbortSignal.timeout(this.getCountryTimeout)}).catch(n=>(this.log("Error getting country",n),null)));for(const n of e){if(this.log("Checking audience for test '%s'",n.id),this.state.essential.visitorTests.some(d=>d.testId===n.id&&d.hypothesisId==null)){console.log(`Skipping blocked test '${n.id}'`);continue}const l=this.visitorCreatedDuringTestActive(n.statusHistory);(i.some(d=>d.testId===n.id&&(n.device==="all"||n.device===t.device&&n.device===this.device))||this.isTargetAudience(n,t,l,o))&&(this.log("Visitor is in audience for test '%s'",n.id),s.push(n))}this.testsFilteredByAudience=s}async waitForResolvedRegion(e=1500,t=50){const i=Date.now();for(;this.resolvedRegion===null&&Date.now()-i<e;)await new Promise(s=>window.setTimeout(s,t))}isTargetAudience(e,t,i,s){const r=this.getChannel(t);return(e.device==="all"||e.device===t.device&&e.device===this.device)&&(e.visitorOption==="all"||e.visitorOption==="new"&&i||e.visitorOption==="returning"&&!i)&&(e.targetAudiences.length===0||e.targetAudiences.reduce((o,n)=>o||n.reduce((l,c)=>l&&c(t,i,r,s),!0),!1))}visitorCreatedDuringTestActive(e){let t="";for(const i of e){if(this.state.analytics.visitor!==null&&this.state.analytics.visitor.createdAt<i.createdAt||this.state.essential.initialState.createdAt<i.createdAt)break;t=i.status}return t==="active"}getDomTestsForCurrentUrl(){return this.domTestsForUrl(this.testsFilteredByAudience)}getCurrentVisitorHypothesis(e){return e.flatMap(t=>t.hypotheses).find(t=>t.type!=="dom"&&t.type!=="price"&&this.state.essential.visitorTests.some(i=>i.hypothesisId===t.id))}getVisitorDomHypothesis(e){return e.flatMap(t=>t.hypotheses).filter(t=>(t.type==="dom"||t.type==="price")&&this.state.essential.visitorTests.some(i=>i.hypothesisId===t.id))}getHypothesis(e){return this.testConfigs.filter(t=>t.hypotheses.some(i=>i.id===e)).map(t=>t.hypotheses.find(i=>i.id===e))[0]}getActiveAssignment(){if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const t=this.state.temporary.previewConfig;return t.currentVariant&&t.testId?{testId:t.testId,hypothesisId:t.currentVariant}:null}const e=this.state.essential.visitorTests.find(t=>t.hypothesisId);return e?.hypothesisId?{testId:e.testId,hypothesisId:e.hypothesisId}:null}findActiveSubscriptionTestControl(){for(const e of this.testConfigs){const t=e.hypotheses.find(i=>i.isControl);if(t?.subscriptionData)return{testId:e.id,hypothesis:t}}return null}getDomSelectorsForHypothesis(e){if(!e)return[];if(e.domSelectors&&e.domSelectors.length>0)return e.domSelectors;if(e.priceData){const t=`${this.priceSelectorsSessionKey}_${e.id}`;try{const s=sessionStorage.getItem(t);if(s){const r=JSON.parse(s);return e.domSelectors=r,this.log("Loaded %d price selectors from cache for hypothesis '%s'",r.length,e.id),r}}catch{}const i=$e(e.priceData);e.domSelectors=i;try{sessionStorage.setItem(t,JSON.stringify(i)),this.log("Generated and cached %d price selectors for hypothesis '%s'",i.length,e.id)}catch{this.log("Generated %d price selectors for hypothesis '%s' (cache unavailable)",i.length,e.id)}return i}return[]}hasThemeTest(e){return e.some(t=>t.hypotheses.some(i=>i.type==="theme"))}hasTestThatIsNotThemeTest(e){return e.some(t=>t.hypotheses.some(i=>i.type!=="theme"&&i.type!=="dom"&&i.type!=="price"))}hasThemeAndOtherTestTypes(e){return this.hasThemeTest(e)&&this.hasTestThatIsNotThemeTest(e)}testIsPaused(e){return e.status==="paused"||e.status==="incompatible"||e.status==="suspended"}visitorActiveTestType(){const e=this.state.essential.visitorTests.filter(t=>this.testConfigs.some(i=>i.hypotheses.some(s=>s.id==t.hypothesisId)));return e.length===0?null:e.some(t=>t.isThemeTest)?"theme":"templateOrUrlRedirect"}getReservationType(e){return e==="price"||this.isTemplateTestType(e)?"deferred":"immediate"}isTemplateTestType(e){return["product","collection","landing","index","cart","search","blog","article","collectionList"].includes(e)}getEntryCriteriaKey(e){const t=e.hypotheses.find(i=>i.isControl);if(!t)return`unknown:${e.id}`;switch(t.type){case"theme":return"global:theme";case"basicScript":return"global:autoApi";case"price":return"global:price";case"manualScript":return`conditional:manualApi:${e.id}`;case"urlRedirect":return`conditional:url:${t.redirectPath||"unknown"}`;default:return`conditional:template:${t.type}`}}isGlobalEntryCriteria(e){return e.startsWith("global:")}groupTestsByEntryCriteria(e){const t=new Map;for(const i of e){const s=this.getEntryCriteriaKey(i),r=t.get(s)||[];r.push(i),t.set(s,r)}return t}doesCurrentPageMatchEntryCriteria(e){if(this.isGlobalEntryCriteria(e))return!0;
8if(e==="conditional:manualApi")return!1;if(e.startsWith("conditional:url:")){const t=e.replace("conditional:url:","");return window.location.pathname.endsWith(t)}if(e.startsWith("conditional:template:")){const t=e.replace("conditional:template:","");return this.typeFromTemplate()===t}return!1}hasActiveReservation(){const e=this.getActiveReservations();return Object.values(e).some(t=>!t.isRealized)}getActiveReservation(){const e=this.getActiveReservations();return Object.values(e).find(t=>!t.isRealized)??null}clearStaleReservations(){const e=this.state.temporary.testReservations;if(!e)return;let t=!1;for(const[i,s]of Object.entries(e)){const r=this.testConfigs.find(n=>n.id===s.testId);if(!r){this.log("Test '%s' no longer in config, clearing reservation for criteria '%s'",s.testId,i),delete e[i],t=!0;continue}if(r.status!=="active"){this.log("Test '%s' status is '%s', clearing reservation for criteria '%s'",s.testId,r.status,i),delete e[i],t=!0;continue}this.testsFilteredByAudience.some(n=>n.id===s.testId)||(this.log("Visitor no longer passes audience for test '%s', clearing reservation for criteria '%s'",s.testId,i),delete e[i],t=!0)}t&&this.persistTemporaryState()}createReservations(e){if(this.state.temporary.testReservations||(this.state.temporary.testReservations={}),this.state.temporary.rolledEntryCriteria||(this.state.temporary.rolledEntryCriteria=[]),this.state.temporary.testCategory==="global"){this.createSingleReservation(e,"global");return}const i=e.filter(n=>this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(n))),s=e.filter(n=>!this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(n)));this.log("Conditional tests split - matching current page: %d, not matching: %d",i.length,s.length),i.length>0&&this.log("Tests matching current page (same pool): %o",i.map(n=>({id:n.id,title:n.title,criteria:this.getEntryCriteriaKey(n)})));const r=`conditional:current-page:${this.typeFromTemplate()}`;if(i.length>0&&!this.state.temporary.rolledEntryCriteria.includes(r)){this.createSingleReservation(i,r);for(const n of i){const l=this.getEntryCriteriaKey(n);this.state.temporary.rolledEntryCriteria.includes(l)||this.state.temporary.rolledEntryCriteria.push(l)}}const o=this.groupTestsByEntryCriteria(s);for(const[n,l]of o){if(this.state.temporary.rolledEntryCriteria.includes(n)){this.log("Already rolled for criteria '%s', skipping",n);continue}if(l.some(S=>this.state.essential.visitorTests.some(C=>C.testId===S.id))){this.log("Visitor already has VT for criteria '%s', skipping",n),this.state.temporary.rolledEntryCriteria.push(n);continue}const d=[...l].sort((S,C)=>S.id.localeCompare(C.id));this.log("Test dice roll for criteria '%s' - available tests: %o",n,d.map(S=>({id:S.id,title:S.title})));const u=Math.floor(Math.random()*d.length),h=d[u];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",u+1,l.length,h.id,h.title);const p=this.pickHypothesis(h);if(!p){this.log("No hypothesis picked for test '%s'",h.id);continue}this.sendDiagnosticTelemetry("assignment",h.id,{hypothesisId:p.id,isControl:p.isControl,testType:p.type});const b=this.getReservationType(p.type),E={testId:h.id,hypothesisId:p.id,testType:p.type,reservationType:b,isThemeTest:p.type==="theme",themeId:p.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:n};this.state.temporary.testReservations[n]=E,this.state.temporary.rolledEntryCriteria.push(n),this.log("Created %s reservation for test '%s' (criteria: %s)",b,h.id,n);for(const S of l)S.id!==h.id&&this.markTestAsBlocked(S,n)}this.persistTemporaryState()}createSingleReservation(e,t){if(this.state.temporary.rolledEntryCriteria.includes(t)){this.log("Already rolled for pool '%s', skipping",t);return}if(e.some(u=>this.state.essential.visitorTests.some(h=>h.testId===u.id&&!h.isInvalid))){this.log("Visitor already has VT for pool '%s', skipping",t),this.state.temporary.rolledEntryCriteria.push(t);return}if(e.length===0){this.log("No tests in pool '%s'",t);return}const s=[...e].sort((u,h)=>u.id.localeCompare(h.id));this.log("Test dice roll for pool '%s' - available tests: %o",t,s.map(u=>({id:u.id,title:u.title,criteria:this.getEntryCriteriaKey(u)})));const r=Math.floor(Math.random()*s.length),o=s[r];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",r,e.length,o.id,o.title);const n=this.pickHypothesis(o);if(!n){this.log("No hypothesis picked for test '%s'",o.id);return}this.sendDiagnosticTelemetry("assignment",o.id,{hypothesisId:n.id,isControl:n.isControl,testType:n.type});const l=this.getReservationType(n.type),c=this.getEntryCriteriaKey(o),d={testId:o.id,hypothesisId:n.id,testType:n.type,reservationType:l,isThemeTest:n.type==="theme",themeId:n.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:c};this.state.temporary.testReservations[c]=d,this.state.temporary.rolledEntryCriteria.push(t),this.log("Created %s reservation for test '%s' from pool '%s' (criteria: %s)",l,o.id,t,c);for(const u of e)u.id!==o.id&&this.markTestAsBlocked(u,`pool:${t}`);this.persistTemporaryState()}markTestAsBlocked(e,t){this.state.essential.visitorTests.some(i=>i.testId===e.id)||(this.log("Blocking visitor from test '%s' (reason: %s)",e.id,t),this.state.essential.visitorTests.push({createdAt:new Date,testId:e.id,hypothesisId:null,isThemeTest:e.hypotheses.some(i=>
8i.type==="theme"),shouldSendToGa:!1,isSaved:!0,isInvalid:!0,themeId:void 0}))}realizeReservationForCriteria(e){const t=this.state.temporary.testReservations?.[e];if(!t)return this.log("No reservation found for criteria '%s'",e),!1;if(t.isRealized)return this.log("Reservation already realized for criteria '%s'",e),!1;if(this.state.essential.visitorTests.some(s=>s.testId===t.testId&&!s.isInvalid))return this.log("Visitor already assigned to test '%s'",t.testId),!1;const i=this.getHypothesis(t.hypothesisId);return i?(t.isRealized=!0,this.persistTemporaryState(),this.queueAddVisitorToTest(t.testId,i),this.saveState(),this.log("Realized reservation for test '%s' (criteria: %s)",t.testId,e),!0):(this.log("Hypothesis '%s' not found",t.hypothesisId),!1)}getActiveReservations(){return this.state.temporary.testReservations??{}}getReservationForCurrentPage(){const e=this.getActiveReservations();for(const[t,i]of Object.entries(e)){if(i.isRealized)continue;const s=this.testConfigs.find(r=>r.id===i.testId);if(!(!s||s.status!=="active")&&this.doesCurrentPageMatchEntryCriteria(t))return i}return null}getReservationForTest(e){const t=this.getActiveReservations();return Object.values(t).find(i=>i.testId===e)??null}getReservationTestType(){const e=this.getActiveReservations(),t=Object.values(e);if(t.length===0)return null;for(const i of t)if(i.isThemeTest)return"theme";for(const i of t)if(i.testType==="price")return"price";return t.some(i=>!i.isRealized)?"templateOrUrlRedirect":null}hasPriceTests(e){return e.some(t=>t.hypotheses.some(i=>i.type==="price"))}_priceTestProductIds=null;getPriceTestProductIds(){if(this._priceTestProductIds)return this._priceTestProductIds;const e=new Set;for(const t of this.testConfigs)for(const i of t.hypotheses)if(i.type==="price"){for(const s of i.domSelectors||[]){const r=s.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);r?.[1]&&e.add(r[1])}if(i.priceData?.variants)for(const[s]of i.priceData.variants)e.add(s)}return this._priceTestProductIds=e,this.log("Built price test product ID cache with %d products",e.size),e}isProductInAnyPriceTest(e){return this.getPriceTestProductIds().has(e)}visitorActiveTestTypeWithReservations(){const e=this.getActiveReservations();for(const r of Object.values(e)){if(r.isThemeTest)return"theme";if(r.testType==="price")return"price"}if(Object.values(e).some(r=>!r.isRealized)){if(this.state.temporary.testCategory==="global")for(const o of Object.values(e)){if(o.testType==="theme")return"theme";if(o.testType==="price")return"price";if(o.testType==="basicScript")return"theme"}return"templateOrUrlRedirect"}const i=this.state.essential.visitorTests.filter(r=>!r.isInvalid&&this.testConfigs.some(o=>o.hypotheses.some(n=>n.id===r.hypothesisId)));return i.length===0?null:i.some(r=>this.getHypothesis(r.hypothesisId)?.type==="price")?"price":i.some(r=>r.isThemeTest)?"theme":"templateOrUrlRedirect"}applyControlForAudienceFilteredPriceTests(){const e=this.testConfigs.filter(s=>s.status==="active"&&s.hypotheses.some(r=>r.type==="price"));if(e.length===0)return;const t=this.testsFilteredByAudience.filter(s=>s.hypotheses.some(r=>r.type==="price")),i=e.filter(s=>!t.some(r=>r.id===s.id));if(i.length!==0){this.log("Found %d price tests filtered by audience, applying control selectors",i.length);for(const s of i){const r=s.hypotheses.find(c=>c.isControl),o=this.getDomSelectorsForHypothesis(r);if(o.length===0){this.log("No control selectors for audience-filtered price test '%s'",s.id);continue}const n=new URL(window.location.href);o.some(c=>{try{return new RegExp(se(c)).test(K(n.toString()))}catch{return!1}})&&(this.log("Applying control selectors for audience-filtered price test '%s'",s.id),U(document,{testId:s.id,hypothesisId:r.id,selectors:o},()=>{}),this.updatePriceTestHiddenInputs(s.id,"control",!1))}}}pickHypothesis(e){let t=Math.random();const i=e.hypotheses.reduce((r,o)=>r+o.visitorCount,0);return e.hypotheses.sort((r,o)=>r.isControl?o.isControl?0:-1:o.isControl?1:0).reduce((r,o)=>{if(r!==null)return r;const l=e.hypotheses.reduce((c,d)=>c&&d.visitorCount>20,!0)?o.visitorCount/i-o.trafficPercentage:0;return t<=o.trafficPercentage-l?o:(t-=o.trafficPercentage-l,null)},null)}typeFromTemplate(){switch(template.type){case"list-collections":return"collectionList";case"page":return"landing";case"article":case"blog":case"cart":case"collection":case"index":case"product":case"search":return template.type;default:return null}}queueRedirect(e){this.saveState(),this.disableReferrerOverride||(this.log(`Saving temporary referrer override '${document.referrer}'`),this.state.temporary.originalReferrer=document.referrer,this.persistTemporaryState()),window.setTimeout(()=>window.location.assign(e),0),window.setTimeout(()=>{this.syncAllEvents()},2e3)}scheduleRetrySync(){this.clientIdRetryCount>=5||(this.clientIdRetryCount++,window.setTimeout(()=>{this.syncAllEvents()},500))}async syncAllEvents(){const e=async()=>
8{if(this.isSyncing){window.setTimeout(()=>{(async()=>await e())()},500);return}try{if(this.isSyncing=!0,this.syncGAEvents(),this.shopifyAnalyticsId||(this.shopifyAnalyticsId=this.getShopifyAnalyticsId()),!this.shopifyAnalyticsId){this.scheduleRetrySync();return}await this.syncEvents()}finally{this.isSyncing=!1}};await e()}async syncEvents(){if(!this.state.essential.consentApproved||!this.shopifyAnalyticsId||this.state.analytics.queue.length===0)return;const e=this.state.analytics.queue.length,t=this.state.analytics.queue.splice(0,e);this.log("Syncing %s events",e);try{const i={shop:this.shop,visitorDetails:{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.state.analytics.visitor?.device??this.device,country:this.state.analytics.visitor?.country??null,...this.state.essential.initialState},events:this.state.essential.visitorTests.filter(r=>!r.isInvalid&&!r.isSaved&&r.hypothesisId!=null).map(r=>new be(r.testId,r.hypothesisId,r.createdAt)).concat(t)};await this.sendEvents(i);for(const r of this.state.essential.visitorTests.filter(o=>!o.isInvalid&&!o.isSaved&&o.hypothesisId!=null))this.sendDiagnosticTelemetry("event-delivered",r.testId,{hypothesisId:r.hypothesisId,isControl:r.assignedTo==="control",testType:r.testType??"unknown"});const s=await this.getVisitor(this.shopifyAnalyticsId);s!==null&&this.updateLocalVisitor(s);for(const r of this.state.essential.visitorTests.filter(o=>!o.isInvalid&&!o.isSaved))r.isSaved=!0,r.savedAt=Date.now()}catch{this.state.analytics.queue.splice(0,0,...t)}finally{this.saveState()}}syncGAEvents(){if(!this.gaConfig.sendEvents){if(he)return;he=!0,this.log("UseGtag is false — skipping GA Events");return}if(this.isSyncingGA){this.log("Already syncing GA - skipping GA events");return}const e=this.state.essential.visitorTests.filter(t=>t.shouldSendToGa);e.length!==0&&(this.isSyncingGA=!0,this.log("Syncing %s GA Events",e.length),Promise.allSettled(e.map(t=>this.sendGAEvent(t))).then(()=>this.log("All gtag events sent")).finally(()=>this.isSyncingGA=!1))}sendGAEvent(e){return new Promise(t=>{this.log("Sending GA Event for test %s, hypothesis %s",e.testId,e.hypothesisId);const i=()=>{this.log("GA acknowledged event for hypothesis %s",e.hypothesisId),e.shouldSendToGa=!1,this.persistEssentialState(),t()},s={exp_variant_string:`SL-${e.testId}-${e.hypothesisId}`};
8this.shopliftDebug&&Object.assign(s,{debug_mode:!0});function r(o,n,l){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}this.gaConfig.mode==="gtag"?r("event","experience_impression",{...s,event_callback:i}):(window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"experience_impression",...s,eventCallback:i}))})}updateLocalVisitor(e){let t;({visitorTests:t,...this.state.analytics.visitor}=e),this.log("updateLocalVisitor - server returned %d tests: %o",t.length,t.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isInvalid:s.isInvalid}))),this.log("updateLocalVisitor - local has %d tests: %o",this.state.essential.visitorTests.length,this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid})));const i=300*1e3;for(const s of this.state.essential.visitorTests.filter(r=>r.isSaved&&(!r.savedAt||Date.now()-r.savedAt>i)&&!t.some(o=>o.testId===r.testId)))this.log("updateLocalVisitor - marking LOCAL test as INVALID (isSaved && not in server): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),s.isInvalid=!0;for(const s of t){const r=this.state.essential.visitorTests.findIndex(n=>n.testId===s.testId);if(!(r!==-1))this.log("updateLocalVisitor - ADDING server test (not found locally): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),this.state.essential.visitorTests.push(s);else{const n=this.state.essential.visitorTests.at(r);this.log("updateLocalVisitor - REPLACING local test with server test: testId=%s, local hypothesisId=%s -> server hypothesisId=%s, local isInvalid=%s -> false",s.testId,n?.hypothesisId,s.hypothesisId,n?.isInvalid),s.isInvalid=!1,s.shouldSendToGa=n?.shouldSe
8ndToGa??!1,s.testType=n?.testType,s.assignedTo=n?.assignedTo,s.testTitle=n?.testTitle,this.state.essential.visitorTests.splice(r,1,s)}}this.log("updateLocalVisitor - FINAL local tests: %o",this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid}))),this.state.analytics.visitor.storedAt=new Date}async getVisitor(e){try{return await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/by-key/${this.shop}/${e}`})}catch{return null}}async sendEvents(e){await this.makeRequest({method:"post",url:`${this.eventHost}/api/v0/events`,data:JSON.stringify(e)})}sendDiagnosticTelemetry(e,t,i){if(!this.telemetryEnabled||!navigator.sendBeacon)return;const s=this.state.essential.consentApproved,r=JSON.stringify({shop:this.shop,testId:t,checkpoint:e,device:this.device,...s?{visitorId:this.shopifyAnalyticsId??"unknown"}:{},clientTimestamp:Date.now(),consentApproved:s,hasConsentInteraction:this.state.essential.hasConsentInteraction,...i});navigator.sendBeacon(`${this.eventHost}/api/v0/telemetry`,new Blob([r],{type:"text/plain"}))}getUTMValue(e){const i=decodeURIComponent(window.location.search.substring(1)).split("&");for(let s=0;s<i.length;s++){const r=i[s].split("=");if(r[0]===e)return r[1]||null}return null}hidePage(e){this.log("Hiding page"),this.cssHideClass&&!window.document.documentElement.classList.contains(this.cssHideClass)&&(window.document.documentElement.classList.add(this.cssHideClass),e||setTimeout(this.removeAsyncHide(this.cssHideClass),2e3))}showPage(){this.cssHideClass&&this.removeAsyncHide(this.cssHideClass)()}getDeviceType(){function e(){let i=!1;return(function(s){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}function t(){let i=!1;return(function(s){(/android|ipad|playbook|silk/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|
8sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}return e()?"mobile":t()?"tablet":"desktop"}removeAsyncHide(e){return()=>{e&&window.document.documentElement.classList.remove(e)}}async getCartState(){try{let e=await this.makeJsonRequest({method:"get",url:`${window.location.origin}/cart.js`});return e===null||(e.note===null&&(e=await this.makeJsonRequest({method:"post",url:`${window.location.origin}/cart/update.js`,data:JSON.stringify({note:""})})),e==null)?null:{token:e.token,total_price:e.total_price,total_discount:e.total_discount,currency:e.currency,items_subtotal_price:e.items_subtotal_price,items:e.items.map(t=>({quantity:t.quantity,variant_id:t.variant_id,key:t.key,price:t.price,final_line_price:t.final_line_price,sku:t.sku,product_id:t.product_id}))}}catch(e){return this.log("Error sending cart info",e),null}}ensureCartAttributesForExistingPriceTests(e){try{if(this.log("Checking visitor assignments for active price tests"),e&&this.state.temporary.previewConfig){const t=this.state.temporary.previewConfig;this.log("Using preview config for merchant:",t.testId);let i="variant";if(t.variants&&t.variants.length>0){const s=t.variants.find(r=>r.id===t.currentVariant);s&&s.isControl&&(i="control")}this.log("Merchant preview - updating hidden inputs:",t.testId,i),this.updatePriceTestHiddenInputs(t.testId,i,!0);return}for(const t of this.state.essential.visitorTests){const i=this.testConfigs.find(o=>o.id===t.testId);if(!i){this.log("Test config not found:",t.testId);continue}const s=i.hypotheses.find(o=>o.id===t.hypothesisId);if(!s||s.type!=="price")continue;const r=s.isControl?"control":"variant";this.log("Updating hidden inputs for price test:",t.testId,r),this.updatePriceTestHiddenInputs(t.testId,r,e)}}catch(t){this.log("Error ensuring cart attributes for existing price tests:",t)}}subscriptionSwapDone=!1;subscriptionHideWrongPlans=null;subscriptionPriceDone=!1;subscriptionUpdateOneTime=null;subscriptionOneTimeDone=!1;swapMap=null;slptValue=null;async subscriptionSwap(){await Ue(this)}async subscriptionPriceChange(){await ze(this)}async subscriptionOneTimePrice(){await We(this)}updatePriceTestHiddenInputs(e,t,i){try{this.cleanupPriceTestObservers();const s=`${e}:${t}:${i?"t":"f"}`,r=T=>{const m=T.getAttribute("data-sl-pid");if(!m)return!0;if(i&&this.state.temporary.previewConfig){const w=this.state.temporary.previewConfig,I=t==="control"?"a":"b",f=w.variants.find(v=>v.label===I);if(!f)return!1;for(const v of f.domSelectors||[]){const g=v.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(g){const P=g[1];if(this.log(`Extracted ID from selector: ${P}, comparing to: ${m}`),P===m)return this.log("Product ID match found in preview config:",m,"variant:",f.label),!0}else this.log(`Could not extract ID from selector: ${v.cssSelector}`)}return this.log("No product ID match in preview config for:",m,"variant:",I),!1}const y=this.testConfigs.find(w=>w.id===e);if(!y)return this.log("Test config not found for testId:",e),!1;for(const w of y.hypotheses||[]){for(const I of w.domSelectors||[]){const f=I.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(f&&f[1]===m)return this.log("Product ID match found in domSelectors:",m,"for test:",e),!0}if(w.priceData?.variants){for(const I of w.priceData.variants)if(I[0]===m)return this.log("Product ID match found in priceData:",m,"for test:",e),!0}}return this.log("No product ID match for:",m,"in test:",e),!1},o=new Set;let n=!1,l=null;const c=(T,m)=>{if(document.querySelectorAll("[data-sl-attribute-p]").forEach(w=>{if(w instanceof Element&&w.nodeType===Node.ELEMENT_NODE&&w.isConnected&&document.contains(w))try{T.observe(w,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(I){this.log(`Failed to observe element (${m}):`,I)}}),document.body&&document.body.isConnected)try{T.observe(document.body,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(w){this.log(`Failed to observe document.body (${m}):`,w)}},d=(T,m,y,w)=>{const I=T.filter(f=>{const v=f.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);return v&&v[1]===w});this.log(`Applying ${y} DOM selectors, total: ${T.length}, filtered: ${I.length}`),I.length>0&&U(document,{testId:e,hypothesisId:m,selectors:I})},u=(T,m)=>{this.log(`Applying DOM selector changes for product ID: ${T}`),m.disconnect(),n=!0;try{if(i&&this.state.temporary.previewConfig){const y=t==="control"?"a":"b",w=this.state.temporary.previewConfig.variants.find(I=>I.label===y);if(!w?.domSelectors){this.log(`No DOM selectors found for preview variant: ${y}`);return}d(w.domSelectors,w.id,"preview config",T)}else{const y=this.testConfigs.find(I=>I.id===e);if(!y){this.log(`No test config found for testId: ${e}`);return}const w=y.hypotheses.find(I=>t==="control"?I.isControl:!I.isControl);if(!w?.domSelectors){this.log(`No DOM selectors found for assignment: ${t}`);return}d(w.domSelectors,w.id,"live config",T)}}finally{l!==null&&clearTimeout(l),l=window.setTimeout(()=>{n=!1,l=null,c(m,"reconnection"),this.log("Re-established innerHTML observer after DOM changes")}
8,50)}},h=new MutationObserver(T=>{if(!n)for(const m of T){if(m.type!=="childList"&&m.type!=="characterData")continue;let y=m.target;m.type==="characterData"&&(y=m.target.parentElement||m.target.parentNode);let w=y,I=w.getAttribute("data-sl-attribute-p");for(;!I&&w.parentElement;)w=w.parentElement,I=w.getAttribute("data-sl-attribute-p");if(!I)continue;const f=w.innerHTML||w.textContent||"";let v="";m.type==="characterData"&&m.oldValue!==null&&(v=m.oldValue),this.log(`innerHTML changed on element with data-sl-attribute-p="${I}"`),v&&this.log(`Previous content: "${v}"`),this.log(`Current content: "${f}"`),u(I,h)}});c(h,"initial setup"),o.add(h);const p=new MutationObserver(T=>{T.forEach(m=>{m.addedNodes.forEach(y=>{if(y.nodeType===Node.ELEMENT_NODE){const w=y;E(w);const I=w.matches('input[name="properties[_slpt]"]')?[w]:w.querySelectorAll('input[name="properties[_slpt]"]');I.length>0&&this.log(`MutationObserver found ${I.length} new hidden input(s)`),I.forEach(f=>{const v=f.getAttribute("data-sl-pid");if(this.log(`MutationObserver checking new input with data-sl-pid="${v}"`),r(f))f.value!==s&&(f.value=s,this.log("Updated newly added hidden input:",s)),S(f);else{const g=f.getAttribute("data-sl-pid");g&&this.isProductInAnyPriceTest(g)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",g):(f.remove(),this.log("Removed newly added non-matching hidden input for product ID:",g))}})}})})});o.add(p);const b=new MutationObserver(T=>{T.forEach(m=>{if(m.type==="attributes"&&m.attributeName==="data-sl-pid"){const y=m.target;if(this.log("AttributeObserver detected data-sl-pid attribute change on:",y.tagName),y.matches('input[name="properties[_slpt]"]')){const w=y,I=m.oldValue,f=w.getAttribute("data-sl-pid");this.log(`data-sl-pid changed from "${I}" to "${f}" - triggering payment placement updates`),r(w)?(w.value!==s&&(w.value=s,this.log("Updated hidden input after data-sl-pid change:",s)),f&&u(f,h),this.log("Re-running payment placement updates after variant change"),E(document.body)):f&&this.isProductInAnyPriceTest(f)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",f):(w.remove(),this.log("Removed non-matching hidden input after data-sl-pid change:",f))}}})});o.add(b);const E=T=>{T.tagName==="SHOPIFY-PAYMENT-TERMS"&&(this.log("MutationObserver found new shopify-payment-terms element"),this.updateShopifyPaymentTerms(e,t));const m=T.querySelectorAll("shopify-payment-terms");m.length>0&&(this.log(`MutationObserver found ${m.length} shopify-payment-terms in added node`),this.updateShopifyPaymentTerms(e,t)),T.tagName==="AFTERPAY-PLACEMENT"&&(this.log("MutationObserver found new afterpay-placement element"),this.updateAfterpayPlacements(e,t,"afterpay"));const y=T.querySelectorAll("afterpay-placement");y.length>0&&(this.log(`MutationObserver found ${y.length} afterpay-placement in added node`),this.updateAfterpayPlacements(e,t,"afterpay")),T.tagName==="SQUARE-PLACEMENT"&&(this.log("MutationObserver found new square-placement element"),this.updateAfterpayPlacements(e,t,"square"));const w=T.querySelectorAll("square-placement");w.length>0&&(this.log(`MutationObserver found ${w.length} square-placement in added node`),this.updateAfterpayPlacements(e,t,"square")),T.tagName==="KLARNA-PLACEMENT"&&(this.log("MutationObserver found new klarna-placement element"),this.updateKlarnaPlacements(e,t));const I=T.querySelectorAll("klarna-placement");I.length>0&&(this.log(`MutationObserver found ${I.length} klarna-placement in added node`),this.updateKlarnaPlacements(e,t))},S=T=>{b.observe(T,{attributes:!0,attributeFilter:["data-sl-pid"],attributeOldValue:!0,subtree:!1});const m=T.getAttribute("data-sl-pid");this.log(`Started AttributeObserver on specific input with data-sl-pid="${m}"`)},C=()=>{const T=document.querySelectorAll('input[name="properties[_slpt]"]');this.log(`Found ${T.length} existing hidden inputs to check`),T.forEach(m=>{const y=m.getAttribute("data-sl-pid");this.log(`Checking existing input with data-sl-pid="${y}"`),r(m)?(m.value=s,this.log("Updated existing hidden input:",s),y&&(this.log("Applying initial DOM selector changes for existing product"),u(y,h)),S(m)):y&&this.isProductInAnyPriceTest(y)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",
8y):(m.remove(),this.log("Removed non-matching hidden input for product ID:",y))})},_=()=>{document.body?(p.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver on document.body"),C(),E(document.body)):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{document.body&&(p.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver after DOMContentLoaded"),C(),E(document.body))}):(this.log("Set timeout on observer"),setTimeout(_,10))};_(),window.__shopliftPriceTestObservers=o,window.__shopliftPriceTestValue=s,this.log("Set up DOM observer for price test hidden inputs")}catch(s){this.log("Error updating price test hidden inputs:",s)}}updateKlarnaPlacements(e,t){this.updatePlacementElements(e,t,"klarna-placement",(i,s)=>{i.setAttribute("data-purchase-amount",s.toString())})}cleanupPriceTestObservers(){const e=window.__shopliftPriceTestObservers;e&&(e.forEach(t=>{t.disconnect()}),e.clear(),this.log("Cleaned up existing price test observers")),delete window.__shopliftPriceTestObservers,delete window.__shopliftPriceTestValue}updateAfterpayPlacements(e,t,i="afterpay"){const s=i==="square"?"square-placement":"afterpay-placement";if(document.querySelectorAll(s).length===0){this.log(`No ${s} elements found on page - early return`);return}this.updatePlacementElements(e,t,s,(o,n)=>{if(i==="afterpay"){const l=(n/100).toFixed(2);o.setAttribute("data-amount",l)}else o.setAttribute("data-amount",n.toString())}),this.log("updateAfterpayPlacements completed")}updatePlacementElements(e,t,i,s){const r=document.querySelectorAll(i);if(r.length===0){this.log(`No ${i} elements found - early return`);return}let o;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const l=t==="control"?"a":"b",c=this.state.temporary.previewConfig.variants.find(d=>d.label===l);if(!c?.domSelectors){this.log(`No variant found for label ${l} in preview config for ${i}`);return}o=c.domSelectors,this.log(`Using preview config for ${i} in merchant mode, variant: ${l}`)}else{const l=this.testConfigs.find(d=>d.id===e);if(!l){this.log(`No testConfig found for id: ${e} - early return`);return}
8const c=l.hypotheses.find(d=>t==="control"?d.isControl:!d.isControl);if(!c?.domSelectors){this.log(`No hypothesis or domSelectors found for assignment: ${t} - early return`);return}o=c.domSelectors}const n=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);r.forEach(l=>{let c=null;const d=l.parentElement;if(d&&(c=d.querySelector('input[name="properties[_slpt]"]')),c||(c=l.querySelector('input[name="properties[_slpt]"]')),!c){this.log(`No hidden input found for ${i} element`);return}const u=c.getAttribute("data-sl-pid");if(!u){this.log("Hidden input has no data-sl-pid attribute - skipping");return}const h=o.find(S=>{const C=S.cssSelector.match(n);return C&&C[1]===u});if(!h){this.log(`No matching selector found for productId: ${u} - skipping element`);return}const p=h.actions.find(S=>S.scope==="price");if(!p?.value){this.log("No price action or value found - skipping element");return}const b=parseFloat(p.value.replace(/[^0-9.]/g,""));if(Number.isNaN(b)){this.log(`Invalid price "${p.value}" for product ${u} - skipping`);return}const E=Math.round(b*100);s(l,E)}),this.log(`updatePlacementElements completed for ${i}`)}updateShopifyPaymentTerms(e,t){const i=document.querySelectorAll("shopify-payment-terms");if(i.length===0)return;this.log("Store using shopify payments");let s;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const o=t==="control"?"a":"b",n=this.state.temporary.previewConfig.variants.find(l=>l.label===o);if(!n||!n.domSelectors){this.log(`No variant found for label ${o} in preview config`);return}s=n.domSelectors,this.log(`Using preview config for shopify-payment-terms in merchant mode, variant: ${o}`)}else{const o=this.testConfigs.find(l=>l.id===e);if(!o)return;const n=o.hypotheses.find(l=>t==="control"?l.isControl===!0:l.isControl===!1);if(!n||!n.domSelectors)return;s=n.domSelectors}const r=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);i.forEach(o=>{const n=o.getAttribute("variant-id");if(!n)return;const l=s.find(c=>{const d=c.cssSelector.match(r);return d&&d[1]===n});if(l){const c=l.actions.find(d=>d.scope==="price");if(c&&c.value){const d=o.getAttribute("shopify-meta");if(d)try{const u=JSON.parse(d);if(u.variants&&Array.isArray(u.variants)){const h=u.variants.find(p=>p.id?.toString()===n);if(h){h.full_price=c.value;const p=parseFloat(c.value.replace(/[^0-9.]/g,""));if(h.number_of_payment_terms&&h.number_of_payment_terms>1){const b=p/h.number_of_payment_terms;h.price_per_term=`$${b.toFixed(2)}`}o.setAttribute("shopify-meta",JSON.stringify(u))}}}catch(u){this.log("Error parsing/updating shoplift-meta:",u)}}}})}async makeJsonRequest(e){const t=await this.makeRequest(e);return t===null?null:JSON.parse(await t.text(),F)}async makeRequest(e){const{url:t,method:i,headers:s,data:r,signal:o}=e,n=new Headers;if(s)for(const c in s)n.append(c,s[c]);(!s||!s.Accept)&&n.append("Accept","application/json"),(!s||!s["Content-Type"])&&n.append("Content-Type","application/json"),(this.eventHost.includes("ngrok.io")||this.eventHost.includes("ngrok-free.app"))&&n.append("ngrok-skip-browser-warning","1234");const l=await this.fetch(t,{method:i,headers:n,body:r,signal:o});if(!l.ok){if(l.status===204)return null;if(l.status===422){const c=await l.json();if(typeof c<"u"&&c.isBot)throw new ie}throw new Error(`Error sending shoplift request ${l.status}`)}return l}queueAddVisitorToTest(e,t){if(this.state.essential.visitorTests.some(s=>s.testId===e))return;const i=this.testConfigs.find(s=>s.id===e);if(this.state.essential.visitorTests.push({createdAt:new Date,testId:e,hypothesisId:t.id,isThemeTest:t.type==="theme",themeId:t.themeId,isSaved:!1,isInvalid:!1,shouldSendToGa:!0,testType:t.type,assignedTo:t.isControl?"control":"variant",testTitle:i?.title}),t.type==="price"){const s=t.isControl?"control":"variant";this.log("Price test assignment detected, updating cart attributes:",e,s),this.updatePriceTestHiddenInputs(e,s,!1)}}queueCartUpdate(e){this.queueEvent(new Ce(e))}queuePageView(e){this.queueEvent(new Se(e))}queueEvent(e){!this.state.essential.consentApproved&&this.state.essential.hasConsentInteraction||this.state.analytics.queue.length>10||this.state.analytics.queue.push(e)}legacyGetLocalStorageVisitor(){const e=this.localStorageGet(this.legacySessionKey);if(e)try{return JSON.parse(e,F)}catch{}return null}pruneStaleVisitorTests(){this.state.essential.visitorTests=this.state.essential.visitorTests.filter(e=>this.testConfigs.some(t=>t.id==e.testId)||this.inactiveTestConfigs.filter(t=>this.testIsPaused(t)).some(t=>t.id===e.testId))}pruneStateAndSave(){this.pruneStaleVisitorTests(),this.saveState()}saveState(){this.persistEssentialState(),this.persistAnalyticsState()}loadState(){const e=this.loadAnalyticsState(),t={analytics:e,essential:this.loadEssentialState(e),temporary:this.loadTemporaryState()},i=this.legacyGetLocalStorageVisitor(),s=this.legacyGetCookieVisitor(),r=[i,s].filter(o=>o!==null).sort((o,n)=>+n.storedAt-+o.storedAt)[0];return t.analytics.visitor===null&&r&&({visitorTests:t.essential.visitorTests,...t.analytics.visitor}=r,t.essential.isFirstLoad=!1,t.essential.initialState={createdAt:r.createdAt,referrer:r.referrer,utmCampaign:r.utmCampaign,utmContent:r.utmContent,utmMedium:r.utmMedium,utmSource:r.utmSource,device:r.device},this.deleteCookie("SHOPLIFT"),this.deleteLocalStorage(this.legacySessionKey)),!t.essential.consentApproved&&t.essential.hasConsentInteraction&&this.deleteLocalStorage(this.analyticsSessionKey),t}loadEssentialState(e){const t=this.loadLocalStorage(this.essentialSessionKey),i=this.loadCookie(this.essentialSessionKey),s=this.getInitialState();e.visitor?.device&&(s.device=e.visitor.device);const r={timestamp:new Date,consentApproved:!1,hasConsentInteraction:!1,debugMode:!1,initialState:s,visitorTests:[],isFirstLoad:!0},o=[t,i].filter(n=>n!==null).sort((n,l)=>+l.timestamp-+n.timestamp)[0]??r;return o.initialState||(e.visitor!==null?o.initialState=e.visitor:(o.initialState=s,o.initialState.createdAt=o.timestamp)),o}loadAnalyticsState(){const e=this.loadLocalStorage(this.analyticsSessionKey),t=this.loadCookie(this.analyticsSessionKey),i={timestamp:new Date,visitor:null,queue:[]},s=[e,t].filter(r=>r!==null).sort((r,o)=>+o.timestamp-+r.timestamp)[0]??i;return s.queue.length===0&&e&&e.queue.length>1&&(s.queue=e.queue),s}loadTemporaryState(){const e=this.sessionStorageGet(this.temporarySessionKey),t=e?JSON.parse(e,F):null,i=this.loadCookie(this.temporarySessionKey);return t??i??{isMerchant:!1,timestamp:new Date}}persistEssentialState(){this.log("Persisting essential state"),this.state.essential.isFirstLoad=!1,this.state.essential.timestamp=new Date,this.persistLocalStorageState(this.essentialSessionKey,this.state.essential),this.persist
8CookieState(this.essentialSessionKey,this.state.essential)}persistAnalyticsState(){this.log("Persisting analytics state"),this.state.essential.consentApproved&&(this.state.analytics.timestamp=new Date,this.persistLocalStorageState(this.analyticsSessionKey,this.state.analytics),this.persistCookieState(this.analyticsSessionKey,{...this.state.analytics,queue:[]}))}persistTemporaryState(){this.log("Setting temporary session state"),this.state.temporary.timestamp=new Date,this.sessionStorageSet(this.temporarySessionKey,JSON.stringify(this.state.temporary)),this.persistCookieState(this.temporarySessionKey,this.state.temporary,!0)}loadLocalStorage(e){const t=this.localStorageGet(e);if(t===null)return null;try{return JSON.parse(t,F)}catch{return null}}loadCookie(e){const t=this.getCookie(e);if(t===null)return null;try{return JSON.parse(t,F)}catch{return null}}persistLocalStorageState(e,t){this.localStorageSet(e,JSON.stringify(t))}persistCookieState(e,t,i=!1){const s=JSON.stringify(t),r=i?"":`expires=${new Date(new Date().getTime()+864e5*365).toUTCString()};`;document.cookie=`${e}=${s};domain=.${window.location.hostname};path=/;SameSite=Strict;${r}`}deleteCookie(e){const t=new Date(0).toUTCString();document.cookie=`${e}=;domain=.${window.location.hostname};path=/;expires=${t};`}deleteLocalStorage(e){window.localStorage.removeItem(e)}getChannel(e){return[{"name":"cross-network","test":(v) => new RegExp(".*cross-network.*", "i").test(v.utmCampaign)},{"name":"direct","test":(v) => v.utmSource === "" && v.utmMedium === ""},{"name":"paid-shopping","test":(v) => (new RegExp("^(?:Google|IGShopping|aax-us-east\.amazon-adsystem\.com|aax\.amazon-adsystem\.com|alibaba|alibaba\.com|amazon|amazon\.co\.uk|amazon\.com|apps\.shopify\.com|checkout\.shopify\.com|checkout\.stripe\.com|cr\.shopping\.naver\.com|cr2\.shopping\.naver\.com|ebay|ebay\.co\.uk|ebay\.com|ebay\.com\.au|ebay\.de|etsy|etsy\.com|m\.alibaba\.com|m\.shopping\.naver\.com|mercadolibre|mercadolibre\.com|mercadolibre\.com\.ar|mercadolibre\.com\.mx|message\.alibaba\.com|msearch\.shopping\.naver\.com|nl\.shopping\.net|no\.shopping\.net|offer\.alibaba\.com|one\.walmart\.com|order\.shopping\.yahoo\.co\.jp|partners\.shopify\.com|s3\.amazonaws\.com|se\.shopping\.net|shop\.app|shopify|shopify\.com|shopping\.naver\.com|shopping\.yahoo\.co\.jp|shopping\.yahoo\.com|shopzilla|shopzilla\.com|simplycodes\.com|store\.shopping\.yahoo\.co\.jp|stripe|stripe\.com|uk\.shopping\.net|walmart|walmart\.com)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|y
8andex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.o
8pera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"display","test":(v) => new RegExp("^(?:display|banner|expandable|interstitial|cpm)$", "i").test(v.utmMedium)},{"name":"paid-other","test":(v) => new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)}
8,{"name":"organic-shopping","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)},{"name":"organic-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|k
8akao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) || new RegExp("^(?:social|social-network|social-media|sm|social network|social media)$", "i").test(v.utmMedium)},{"name":"organic-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) || new RegExp("^(.*video.*)$", "i").test(v.utmMedium)},{"name":"organic-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|y
8andex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || v.utmMedium.toLowerCase() === "organic"},{"name":"referral","test":(v) => new RegExp("^(?:referral|app|link)$", "i").test(v.utmMedium)},{"name":"email","test":(v) => new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmMedium) || new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmSource)},{"name":"affiliate","test":(v) => v.utmMedium.toLowerCase() === "affiliate"},{"name":"audio","test":(v) => v.utmMedium.toLowerCase() === "audio"},{"name":"sms","test":(v) => v.utmSource.toLowerCase() === "sms" || v.utmMedium.toLowerCase() === "sms"},{"name":"mobile-push-notification","test":(v) => v.utmSource.toLowerCase() === "firebase" || new RegExp("(?:.*mobile.*|.*notification.*|push$)", "i").test(v.utmMedium)}].find(i=>i.test(e))?.name??"other"}getShopifyAnalyticsId(){const e=this.getCookie("_shopify_y");if(e)return e;try{const t=this.localStorageGet("Shoplift_ClientId");if(t)return t}catch{}return null}legacyGetCookieVisitor(){const e=this.getCookie("SHOPLIFT");return e===null?null:JSON.parse(e,F)}getCookie(e){const t=this.cookie.split("; ").filter(i=>i.split("=").at(0)===e).at(0);return t===void 0?null:t.split("=").slice(1).join("=")}monitorConsentChange(){document.addEventListener("visitorConsentCollected",e=>{(async()=>await this.onConsentChange(e.detail.analyticsAllowed,!0))()}),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.loadShopifyConsentApiWithRetry()):this.loadShopifyConsentApiWithRetry()}loadShopifyConsentApiWithRetry(){let e=0;const t=()=>{this.loadShopifyConsentApi()||e++<10&&window.setTimeout(t,100)};t()}loadShopifyConsentApi(){if(window.Shopify){this.log("Loading Shopify features");const e=async()=>{if(!window.Shopify){this.log("Shopify object missing... suddenly?");return}if(window.Shopify.customerPrivacy===void 0){this.log("Shopify CustomerPrivacy api still missing, trying again in 1000ms"),t=window.setTimeout(()=>{(async()=>await e())()},1e3);return}if(this.geoViaShopify){const s=window.Shopify.customerPrivacy.getRegion?.();this.resolvedRegion=typeof s=="string"?s.replace(/-/g,""):""}const i=window.Shopify.customerPrivacy.getTrackingConsent();await this.onConsentChange(window.Shopify.customerPrivacy.analyticsProcessingAllowed(),i==="yes")};let t=window.setTimeout(()=>{(async()=>await e())()},5e3);return window.Shopify.loadFeatures([{name:"consent-tracking-api",version:"0.1"}],i=>{(async()=>{if(window.clearTimeout(t),i){this.log("Error loading consent tracking",i);return}await e()})()}),!0}return!1}async onConsentChange(e,t){try{if(this.log("Consent change detected",e,t),this.state.essential.consentApproved=e,this.state.essential.hasConsentInteraction=t,!this.state.essential.consentApproved){this.state.essential.hasConsentInteraction&&(this.state.analytics.queue.length=0),this.saveState();return}this.cookie=document.cookie,this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.saveState(),await this.syncAllEvents()}catch(i){this.log("Error syncing on consent change",i)}}isThemePreview(){return isThemePreview||themeRole!=="main"}isAppProxyPath(){const e=["/apps/","/tools/","/a/"],t=window.location.pathname;return e.some(i=>t.startsWith(i))}clearThemeBar(e,t,i){const s=structuredClone(i);this.log("Looking for theme bar"),this.waitForElement(null,"body").then(r=>this.waitForElement(r,"#preview-bar-iframe, #PBarNextFrameWrapper").then(o=>(this.log("Found theme bar"),t&&(this.log("Removing theme bar"),o.remove()),e?this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify({...this.debugState(),stateAtEvaluation:s},ee)}):Promise.resolve(null)))).catch(r=>console.error(r))}waitForElement(e,t){return new Promise(i=>{const s=document.querySelector(t);if(s){i(s);return}const r=new MutationObserver(o=>{const n=document.querySelector(t);if(n){r.disconnect(),i(n);return}});r.observe(e??document.documentElement,{childList:!0})})}setDebug(e){this.state.essential.debugMode=e,this.saveState()}log(e,...t){let i=0;const s=e.replace(/%[sdoOfF]/g,r=>{if(i>=t.length)return r;const o=t[i++];return r==="%o"||r==="%O"?JSON.stringify(o):String(o)});this.logHistory.push(`[${new Date().toISOString()}][SL] ${s}`),!(!this.state.essential.debugMode&&!this.shopliftDebug)&&console.debug(`[SL] ${e}`,...t)}debugState(){return{state:this.state,storage:{essential:this.loadLocalStorage(this.essentialSessionKey),analytics:this.loadLocalStorage(this.analyticsSessionKey)},params:{shop:this.shop,host:this.host,eventHost:this.eventHost,cssHideClass:this.cssHideClass,testConfigs:this.testConfigs,inactiveTestConfigs:this.inactiveTestConfigs,sendPageView:this.sendPageView,isShopifyMerchantCookie
8:this.getCookie("is_shopify_merchant"),themeId,url:window.location.href,isThemePreview,themeRole,gaConfig:this.gaConfig},logHistory:this.logHistory}}createViewportObserver(e,t={}){const{threshold:i=this.VIEWPORT_TRACK_THRESHOLD,triggerOnce:s=!0}=t,r=new Set;return new IntersectionObserver(o=>{o.forEach(n=>{if(n.isIntersecting&&!r.has(n.target)){const l=n.target,c=l.getAttribute(this.DATA_SL_TEST_ID);c&&(e(c,l),s&&r.add(l))}})},{threshold:i})}applyChangesWithViewport(e,t,i,s){const r=t.selectorsForViewportTracking??t.selectors,o=n=>{if(this.state.essential.visitorTests.some(h=>h.testId===n)||this.activeViewportObservers.has(n))return;const l=[];if(r.forEach(h=>{e.querySelectorAll(h.cssSelector).forEach(b=>l.push(b))}),l.length===0)return;let c=!1;const d=()=>{c||(c=!0,i(n),u.disconnect(),this.activeViewportObservers.delete(n))},u=this.createViewportObserver(()=>{d()},{triggerOnce:!0,...s});this.activeViewportObservers.set(n,u),this.log(`Created viewport observer for test ${n}, observing ${l.length} elements`),l.forEach(h=>{h.setAttribute(this.DATA_SL_TEST_ID,String(n)),u.observe(h)}),setTimeout(()=>{c||l.forEach(h=>{const p=h.getBoundingClientRect(),b=s?.threshold??this.VIEWPORT_TRACK_THRESHOLD,E=Math.min(p.bottom,window.innerHeight)-Math.max(p.top,0),S=Math.min(p.right,window.innerWidth)-Math.max(p.left,0);p.top<window.innerHeight&&p.bottom>0&&p.left<window.innerWidth&&p.right>0&&E>0&&S>0&&E>=p.height*b&&(this.log(`Price element already visible in viewport for test ${n}:`,h),d())})},100)};t.selectors.length>0&&U(e,t,()=>{}),Te(e,{testId:t.testId,hypothesisId:t.hypothesisId,selectors:r},n=>{o(n)})}applyPriceTestWithMapLookup(e,t,i,s){if(!t.priceData){this.log("No price data for hypothesis '%s'",t.id);return}this.log("Hypothesis '%s' isControl=%s, priceData has %d variants",t.id,t.isControl,t.priceData.variants.length);const r=t.priceData.variants.slice(0,3);for(const[S,C,_]of r)this.log("  Sample priceData: variant=%s, price=%d, compareAt=%d",S,C,_);const o=j(t.priceData),n=new Set;for(const S of i)if(S.priceData)for(const[C]of S.priceData.variants)n.add(C);this.log("Price test Map lookup: %d products in hypothesis, %d total products to track",o.size,n.size);const l=t.priceData,c=new WeakSet;let d=!1;const u="[data-sl-attribute-p], [data-sl-attribute-cap], [data-sl-attribute-discount]",h=S=>{if(c.has(S))return;const C=S.getAttribute("data-sl-attribute-p"),_=S.getAttribute("data-sl-attribute-cap"),T=S.getAttribute("data-sl-attribute-discount"),m=C||_||T;if(!m||!n.has(m))return;c.add(S);const y=o.get(m);y&&(this.log("Applying price for product %s: %d cents (compare at: %d cents)",m,y.priceInCents,y.compareAtPriceInCents),Le(S,m,y,l),this.log("Applied price to element for product %s",m)),!d&&!this.state.essential.visitorTests.some(w=>w.testId===e)&&(S.setAttribute(this.DATA_SL_TEST_ID,String(e)),this.setupElementViewportTracking(S,e,()=>{d||(d=!0,s(e))}))},p=()=>{const S=document.querySelectorAll(u);this.log("Scanning for price elements, found: %d",S.length),S.forEach(h)},b=new MutationObserver(S=>{for(const C of S)C.type==="childList"&&C.addedNodes.forEach(_=>{if(_.nodeType===Node.ELEMENT_NODE){const T=_;(T.hasAttribute("data-sl-attribute-p")||T.hasAttribute("data-sl-attribute-cap")||T.hasAttribute("data-sl-attribute-discount"))&&h(T),T.querySelectorAll(u).forEach(h)}}),C.type==="attributes"&&C.target instanceof Element&&h(C.target)}),E=document.body||document.documentElement;b.observe(E,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-sl-attribute-p","data-sl-attribute-cap","data-sl-attribute-discount"]}),this.log("MutationObserver started for price elements"),p(),document.readyState==="loading"&&document.addEventListener("DOMContentLoaded",()=>{this.log("DOMContentLoaded - rescanning for price elements"),p()}),setTimeout(()=>{this.log("Delayed rescan for price elements"),p()},100),setTimeout(()=>{this.log("Final rescan for price elements"),p()},500)}setupElementViewportTracking(e,t,i){const s=this.VIEWPORT_TRACK_THRESHOLD,r=e.getBoundingClientRect(),o=Math.min(r.bottom,window.innerHeight)-Math.max(r.top,0),n=Math.min(r.right,window.innerWidth)-Math.max(r.left,0);if(r.top<window.innerHeight&&r.bottom>0&&r.left<window.innerWidth&&r.right>0&&o>0&&n>0&&o>=r.height*s){this.log("Price element already visible for test %s",t),i();return}const c=new IntersectionObserver(d=>{for(const u of d)if(u.isIntersecting&&u.intersectionRatio>=s){this.log("Price element entered viewport for test %s",t),c.disconnect(),i();break}},{threshold:s});c.observe(e)}debug(){const e=this.debugState();console.log(JSON.stringify(e,ee,2))}}(async function(){window.shopliftInstance||(window.shopliftInstance=new Ze("sm-dream.myshopify.com","https://app.shoplift.ai","https://events.shoplift.ai",false,false,false,{"sendEvents":false,"mode":"gtag"},false,false,1000,[],[{"id":"019ce92a-3699-71a5-9b4d-700fefb24674","bayesianRevision":5,"status":"paused","hypotheses":[{"id":"019ce929-eb35-7287-bd37-09aee8198957","type":"urlRedirect","themeId":157360161014,"affix":"","isControl":true,"redirectPath":"/pages/4-in-1-certification"},{"id":"019ce92a-117f-7c67-8b3e-277b3da3f99b","type":"urlRedirect","themeId":157360161014,"affix":"","isControl":false,"redirectPath":"/pages/dreamlights-4-in-1-bundle-save"}],"ignoreTestViewParameterEnforcement":false},{"id":"019d2027-4981-7f98-af4f-33321978574f","bayesianRevision":5,"status":"paused","hypotheses":[{"id":"019d2026-7b29-76f3-83fa-57730ea671bd","type":"urlRedirect","themeId":157360161014,"affix":"","isControl":true,"redirectPath":"/pages/4-in-1-certification"},{"id":"019d2026-a93e-7b30-8d44-121c72abdffe","type":"urlRedirect","themeId":157360161014,"affix":"","isControl":false,"redirectPath":"/pages/4-in-1-certification-program-2026"}],"ignoreTestViewParameterEnforcement":false}
8],null,false),await window.shopliftInstance.init())})();async function Qe(a,e,t,i){const s=Be({log:i});if(t)return i("[SUB-PREVIEW] A side — no overlay applied; widget renders naturally"),s;const r=a.widget.widgetType,o=e?j(e):null;let n=W(e),l=J(a,n),c=l.discountMap,d=l.maxDiscount;function u(){const f=W(e);f!==n&&(n=f,l=J(a,n),c=l.discountMap,d=l.maxDiscount,i(`[SUB-PREVIEW] scope refreshed currentProductId=${n??"n/a"}, maxDiscount=${d}`))}i(`[SUB-PREVIEW] side=B, currentProductId=${n??"n/a"}, maxDiscount=${d}`);function h(f){if(!e||!o)return null;const v=Z(o),g=v?o.get(v):void 0;return g?{formattedVariantPrice:G(g.priceInCents,e),formattedDiscounted:G(g.priceInCents*(1-f/100),e)}:null}function p(f){const v=Y(a,f);if(!v)return d;const g=D(a,"subscriptionInput"),P=g.length?g[0].selector:'input[name="rc_plan"]',A=v.querySelector(`${P}:checked`);if(A){const k=c[A.value];if(k!==void 0)return k}return d}function b(f){const v=D(a,"subscriptionDiscount");for(const g of v)if(g.selector.includes("badge")||g.selector.includes("__badge")){const P=f.querySelector(g.selector);P?.textContent&&!P.textContent.includes(`${d}%`)&&$(P,A=>N(A,d))}}function E(f,v){const g=h(v);if(!g)return;const P=D(a,"subscriptionCompareAt");for(const A of P){const k=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);k?.textContent&&!k.textContent.includes(g.formattedVariantPrice)&&$(k,x=>/\d/.test(x)?g.formattedVariantPrice:x)}}function S(f,v){const g=h(v);if(!g)return;const P=D(a,"subscriptionPrice");for(const A of P){const k=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);k?.textContent&&!k.textContent.includes(g.formattedDiscounted)&&$(k,x=>/\d/.test(x)?g.formattedDiscounted:x)}}function C(f){const v=D(a,"subscriptionInput"),g=v.length?v[0].selector:'input[name="rc_plan"]',P=D(a,"subscriptionPlanDiscount"),A=P.length?P[0].selector:".rc-plans-button__discount";for(const k of Array.from(f.querySelectorAll("label"))){const x=k.querySelector(g),R=k.querySelector(A);if(x&&R?.textContent){const O=c[x.value];if(O!==void 0){const V=R.textContent.match(/[\d.]+%/)?.[0];V&&V!==`${O}%`&&$(R,L=>N(L,O))}}}}function _(f){const v=f.querySelector("select");if(v)for(const g of Array.from(v.options)){const P=c[g.value];if(P!==void 0&&g.textContent){const A=g.textContent.match(/[\d.]+%/)?.[0];A&&A!==`${P}%`&&(g.textContent=N(g.textContent,P))}}}function T(f){const v=D(a,"onetimePrice");if(!v.length||!e||!o)return;const g=Z(o),P=g?o.get(g):void 0;if(!P)return;const A=G(P.priceInCents,e),k=D(a,"onetimeContainer"),x=k.length?k[0].selector:'[part~="rc-purchase-option__onetime"]',R=f.querySelector(x);if(R)for(const O of v){const V=R.querySelector(`[part~="${O.selector}"]`);V?.textContent&&!V.textContent.includes(A)&&$(V,L=>/\d/.test(L)?A:L)}}function m(f,v){const P=D(a,"subscriptionDiscount").filter(A=>A.selector.includes("benefit")||A.selector==="rc-benefits");for(const A of P){const k=f.querySelector(A.selector);if(k?.shadowRoot){for(const x of Array.from(k.shadowRoot.querySelectorAll("li")))if(x.textContent?.includes("Save")){const R=x.textContent.match(/[\d.]+%/)?.[0];R&&R!==`${v}%`&&$(x,O=>N(O,v))}}}}let y=!1;function w(){if(!y){y=!0;try{u();const f=B(a);if(!f)return;const v=p(f);b(f),E(f,v),S(f,v),T(f);const g=Y(a,f);g&&(r==="buttons"||r==="radio"?C(g):_(g)),m(f,v)}finally{y=!1}}}const I=pe({data:a,runUpdates:w});return function(){I(),s()}}const Xe=Object.freeze(Object.defineProperty({__proto__:null,subscriptionPreviewRender:Qe},Symbol.toStringTag,{value:"Module"}))})(); })("/", { suffix: "", type: "cart" }, "main", 157360161014, false)</script>
8
9<!-- End of Shoplift scripts -->
10
11  <meta charset="utf-8">
12  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
13  <meta name="viewport" content="width=device-width,initial-scale=1">
14  <meta name="theme-color" content="#201f23">
15  <link rel="canonical" href="https://dreamcatchers.com/cart">
16  <link rel="preconnect" href="https://cdn.shopify.com" crossorigin>
17  <link rel="preconnect" href="https://fonts.shopifycdn.com" crossorigin>
18  <link rel="dns-prefetch" href="https://productreviews.shopifycdn.com">
19  <link rel="dns-prefetch" href="https://ajax.googleapis.com">
20  <link rel="dns-prefetch" href="https://maps.googleapis.com">
21  <link rel="dns-prefetch" href="https://maps.gstatic.com">
22
23  
23<script async="async" src="https://240.1.2.3/js/mm_242bbe2e-e0ba-4cc8-ab9a-967b65cfdfa9-98079944.js"></script>
23
24
25  <!-- IDKF data layer -->
26  
26<script>
27    window.dataLayer = window.dataLayer || [];
28
29    
30    
31    
32    
33    
34    
35    
36    
37
38    
39
40    dataLayer.push({
41      "event": "idkf_cart",
42      "idkf_ecommerce": {
43        "contentCategory": "cart",
44        "contentId": "",
45        "contentName": "",
46        "searchString": "",
47        "numItems": "0",
48        "value": "0.00",
49        "currency": "USD"
50      }
51    });
52  </script>
52<link rel="shortcut icon" href="//dreamcatchers.com/cdn/shop/files/fav-icon-dreamcatchers4_32x32.png?v=1613183303" type="image/png" /><title>Your Shopping Cart
53&ndash; DreamCatchers Hair Extensions
54</title>
55<meta property="og:site_name" content="DreamCatchers Hair Extensions">
56  <meta property="og:url" content="https://dreamcatchers.com/cart">
57  <meta property="og:title" content="Your Shopping Cart">
58  <meta property="og:type" content="website">
59  <meta property="og:description" content="Full Cuticle Remy Hair Extensions that last for over 1 year. I-Tip, Tape, K-tip & Weft Professional Hair Extensions. Get Certified now ONLY FOR $499!"><meta name="twitter:site" content="@">
60  <meta name="twitter:card" content="summary_large_image">
61  <meta name="twitter:title" content="Your Shopping Cart">
62  <meta name="twitter:description" content="Full Cuticle Remy Hair Extensions that last for over 1 year. I-Tip, Tape, K-tip & Weft Professional Hair Extensions. Get Certified now ONLY FOR $499!">
63<script async crossorigin fetchpriority="high" src="/cdn/shopifycloud/importmap-polyfill/es-modules-shim.2.4.0.js"></script>
vendor: 1 bytes, line 63
63
64<script type="importmap">
65{
66  "imports": {
67    "element.base-media": "//dreamcatchers.com/cdn/shop/t/373/assets/element.base-media.js?v=61305152781971747521773243247",
68    "element.image.parallax": "//dreamcatchers.com/cdn/shop/t/373/assets/element.image.parallax.js?v=59188309605188605141773243247",
69    "element.model": "//dreamcatchers.com/cdn/shop/t/373/assets/element.model.js?v=104979259955732717291773243248",
70    "element.quantity-selector": "//dreamcatchers.com/cdn/shop/t/373/assets/element.quantity-selector.js?v=68208048201360514121773243244",
71    "element.text.rte": "//dreamcatchers.com/cdn/shop/t/373/assets/element.text.rte.js?v=28194737298593644281773243245",
72    "element.video": "//dreamcatchers.com/cdn/shop/t/373/assets/element.video.js?v=110560105447302630031773243245",
73    "is-land": "//dreamcatchers.com/cdn/shop/t/373/assets/is-land.min.js?v=92343381495565747271773243245",
74    "util.misc": "//dreamcatchers.com/cdn/shop/t/373/assets/util.misc.js?v=117964846174238173191773243247",
75    "util.product-loader": "//dreamcatchers.com/cdn/shop/t/373/assets/util.product-loader.js?v=71947287259713254281773243248",
76    "util.resource-loader": "//dreamcatchers.com/cdn/shop/t/373/assets/util.resource-loader.js?v=81301169148003274841773243239",
77    "vendor.in-view": "//dreamcatchers.com/cdn/shop/t/373/assets/vendor.in-view.js?v=126891093837844970591773243240"
78  }
79}
80</script>
80<script type="module" src="//dreamcatchers.com/cdn/shop/t/373/assets/is-land.min.js?v=92343381495565747271773243245"></script>
80
81<style data-shopify>@font-face {
82  font-family: Baskervville;
83  font-weight: 700;
84  font-style: normal;
85  font-display: swap;
86  src: url("//dreamcatchers.com/cdn/fonts/baskervville/baskervville_n7.88f1ff04750507625f4dc43c30db1758681daca7.woff2") format("woff2"),
87       url("//dreamcatchers.com/cdn/fonts/baskervville/baskervville_n7.88ae461fce98fbd95493e26387a50fa6c2225da6.woff") format("woff");
88}
89
90  @font-face {
91  font-family: Lato;
92  font-weight: 500;
93  font-style: normal;
94  font-display: swap;
95  src: url("//dreamcatchers.com/cdn/fonts/lato/lato_n5.b2fec044fbe05725e71d90882e5f3b21dae2efbd.woff2") format("woff2"),
96       url("//dreamcatchers.com/cdn/fonts/lato/lato_n5.f25a9a5c73ff9372e69074488f99e8ac702b5447.woff") format("woff");
97}
98
99
100  @font-face {
101  font-family: Lato;
102  font-weight: 600;
103  font-style: normal;
104  font-display: swap;
105  src: url("//dreamcatchers.com/cdn/fonts/lato/lato_n6.38d0e3b23b74a60f769c51d1df73fac96c580d59.woff2") format("woff2"),
106       url("//dreamcatchers.com/cdn/fonts/lato/lato_n6.3365366161bdcc36a3f97cfbb23954d8c4bf4079.woff") format("woff");
107}
108
109  @font-face {
110  font-family: Lato;
111  font-weight: 500;
112  font-style: italic;
113  font-display: swap;
114  src: url("//dreamcatchers.com/cdn/fonts/lato/lato_i5.9501f9e8a9e09e142687495e156dec167f6a3ea3.woff2") format("woff2"),
115       url("//dreamcatchers.com/cdn/fonts/lato/lato_i5.eca6cbf1aa9c70cc6dbfed0353a2f57e5065c864.woff") format("woff");
116}
117
118  @font-face {
119  font-family: Lato;
120  font-weight: 600;
121  font-style: italic;
122  font-display: swap;
123  src: url("//dreamcatchers.com/cdn/fonts/lato/lato_i6.ab357ee5069e0603c2899b31e2b8ae84c4a42a48.woff2") format("woff2"),
124       url("//dreamcatchers.com/cdn/fonts/lato/lato_i6.3164fed79d7d987c1390528781c7c2f59ac7a746.woff") format("woff");
125}
126
127</style><link href="//dreamcatchers.com/cdn/shop/t/373/assets/theme.css?v=37696360019941915281778874607" rel="stylesheet" type="text/css" media="all" />
128  <link href="//dreamcatchers.com/cdn/shop/t/373/assets/custom.css?v=22735155668512623811787942998" rel="stylesheet" type="text/css" media="all" />
129
130  <!-- Global site tag (gtag.js) - Google Ads: 858231023 -->
vendor: 66 bytes, lines 130-131
130
131  <script async src="https://www.googletagmanager.com/gtag/js?id=
131AW-858231023
vendor: 14 bytes, lines 131-132
131"></script>
132  
132<script>
133    
vendor: 140 bytes, lines 133-137
133window.dataLayer = window.dataLayer || [];
134    function gtag(){dataLayer.push(arguments);}
135    gtag('js', new Date());
136
137    gtag('config', '
137AW-858231023
vendor: 6 bytes, lines 137-138
137');
138  
138</script>
138
139
140  <!-- Hotjar Tracking Code for https://new.dreamcatchers.com -->
141  
141<script>
vendor: 131 bytes, lines 141-144
141
142      (function(h,o,t,j,a,r){
143          h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
144          h._hjSettings={hjid:
1441431299
vendor: 270 bytes, lines 144-150
144,hjsv:6};
145          a=o.getElementsByTagName('head')[0];
146          r=o.createElement('script');r.async=1;
147          r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
148          a.appendChild(r);
149      })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
150  
150</script>
150
151
152
153  <!-- Microsoft Clarity Tracking Code -->
154  
154<script type="text/javascript">
155    (function(c,l,a,r,i,t,y){
156        c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
157        t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
158        y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
159    })(window, document, "clarity", "script", "utbu58j1ae");
160  </script>
160
161
162  <!-- Anti-flickering script -->
163  
163<script>
164    var  timeout = 3000; // Timeout value to remove the flicker (in milliseconds)
165    !function(h,i,d,e){var  t,n=h.createElement("style");n.id=e,n.innerHTML="body{opacity:0}",h.head.appendChild(n),t=d,i.rmfk=function(){var  t=h.getElementById(e);t&&t.parentNode.removeChild(t)},setTimeout(i.rmfk,t)}(document,window,timeout,"abhide");
166  </script>
166
167
168  <!-- Mida A/B Testing Script -->
169  
169<script type="text/javascript" async src="https://cdn.mida.so/js/optimize.js?key=qEMjJ14gRlzJ7d36Lwx5Pn"></script>
169
170
171  
171<script>
172    (function(w,d,t,r,u)
173    {
174        var f,n,i;
175        w[u]=w[u]||[],f=function()
176        {
177            var o={ti:"137031807", tm:"shpfy_ui"};
178            o.q=w[u],w[u]=new UET(o),w[u].push("pageLoad")
179        },
180        n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function()
181        {
182            var s=this.readyState;
183            s&&s!=="loaded"&&s!=="complete"||(f(),n.onload=n.onreadystatechange=null)
184        },
185        i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i)
186    })
187    (window,document,"script","//bat.bing.com/bat.js","uetq");
188  </script>
188
189  
190  
191  <style>
192    .home-text-columns-bg:after {
193      background: url(//dreamcatchers.com/cdn/shop/files/product-font-bg.png?v=3939887857610253762) no-repeat center center;
194    }
195    .site-footer .grid > div:last-of-type:after {
196      background: url(//dreamcatchers.com/cdn/shop/files/product-font-bg.png?v=3939887857610253762) no-repeat center top;
197    }
198    .template-product .page-content--product .page-width {
199      background: url(//dreamcatchers.com/cdn/shop/files/product-font-bg.png?v=3939887857610253762) no-repeat center 0;
200      overflow-x: clip;
201      padding-top: 10px;
202    }
203
204    .article-page-wrapper:before,
205    .article-page-wrapper:after {
206      background: url(//dreamcatchers.com/cdn/shop/files/dc-logo-bg_1.svg?v=4639564146134599212) no-repeat center center;
207    }
208
209    .page-sign-up .contact-wrapper {
210      background: url(//dreamcatchers.com/cdn/shop/files/contacts-bg_ae37ad8c-eef0-446d-bdde-647155c20c8d.png?v=61769120282912641) no-repeat center 220px;
211      overflow-x: hidden;
212    }
213
214    .page-warranty-returns-exchanges main, .page-shipping-delivery main, .page-privacy-policy main {
215      background-image: linear-gradient(to top, rgb(249, 243, 246), #fff);
216    }
217    .page-warranty-returns-exchanges .page-content, .page-shipping-delivery .page-content, .page-privacy-policy .page-content {
218      background: url(//dreamcatchers.com/cdn/shop/files/product-font-bg.png?v=3939887857610253762) no-repeat center 50px;
219      padding-top: 90px;
220      overflow-x: hidden;
221    }
222
223    .certification-column-lists ul li:before {
224      background: #ff84b0 url(//dreamcatchers.com/cdn/shop/files/clp-chek-icon-white.png?v=4983170332385884852) center center / 11px auto no-repeat;
225    }
226    .testimonials__info:before {
227      background: #ff84b0 url(//dreamcatchers.com/cdn/shop/files/clp-chek-icon-white.png?v=4983170332385884852) 49% center / 9px auto no-repeat;
228    }
229
230    .sm--product-certification .sm--product-certification-wrapper:before {
231      background: url(//dreamcatchers.com/cdn/shop/files/DC-logo-pink.png?v=2548795024169153878) no-repeat center center;
232    }
233
234    .template-customers-login main .page-content {
235      background: url(//dreamcatchers.com/cdn/shop/files/login-bg_89ed7b0f-acf7-4f41-b0f3-d8e2907fc63c.png?v=10800524747913366757) no-repeat center 280px;
236    }
237    .template-customers-register main .page-content {
238      background: url(//dreamcatchers.com/cdn/shop/files/register-bg.png?v=9691449102054024494) center center no-repeat;
239    }
240    .account-video-text ul li:before {
241      background: #ff84b0 url(//dreamcatchers.com/cdn/shop/files/clp-chek-icon-white.png?v=4983170332385884852) center center / 11px auto no-repeat;
242    } 
243  </style><style data-shopify>:root {
244    --typeHeaderPrimary: Baskervville;
245    --typeHeaderFallback: serif;
246    --typeHeaderSize: 60px;
247    --typeHeaderWeight: 700;
248    --typeHeaderLineHeight: 1.1;
249    --typeHeaderSpacing: 0.0em;
250
251    --typeBasePrimary:Lato;
252    --typeBaseFallback:sans-serif;
253    --typeBaseSize: 14px;
254    --typeBaseWeight: 500;
255    --typeBaseSpacing: 0.025em;
256    --typeBaseLineHeight: 1.6;
257    --typeBaselineHeightMinus01: 1.5;
258
259    --typeCollectionTitle: 20px;
260
261    --iconWeight: 4px;
262    --iconLinecaps: miter;
263
264    
265        --buttonRadius: 0;
266    
267
268    --colorGridOverlayOpacity: 0.12;
269    --colorAnnouncement: #1e1e1e;
270    --colorAnnouncementText: #ffffff;
271
272    --colorBody: #ffffff;
273    --colorBodyAlpha05: rgba(255, 255, 255, 0.05);
274    --colorBodyDim: #f2f2f2;
275    --colorBodyLightDim: #fafafa;
276    --colorBodyMediumDim: #f5f5f5;
277
278
279    --colorBorder: #f0f0f0;
280
281    --colorBtnPrimary: #201f23;
282    --colorBtnPrimaryLight: #39373e;
283    --colorBtnPrimaryDim: #141315;
284    --colorBtnPrimaryText: #ffffff;
285
286    --colorCartDot: #ff79b3;
287
288    --colorDrawers: #ffffff;
289    --colorDrawersDim: #f2f2f2;
290    --colorDrawerBorder: #e8e8e1;
291    --colorDrawerText: #2d2d2d;
292    --colorDrawerTextDark: #070707;
293    --colorDrawerButton: #201f23;
294    --colorDrawerButtonText: #ffffff;
295
296    --colorFooter: #ffffff;
297    --colorFooterText: #2d2d2d;
298    --colorFooterTextAlpha01: #2d2d2d;
299
300    --colorGridOverlay: #000000;
301    --colorGridOverlayOpacity: 0.1;
302
303    --colorHeaderTextAlpha01: rgba(68, 68, 68, 0.1);
304
305    --colorHeroText: #ffffff;
306
307    --colorSmallImageBg: #ffffff;
308    --colorLargeImageBg: #ffffff;
309
310    --colorImageOverlay: #15071a;
311    --colorImageOverlayOpacity: 0.0;
312    --colorImageOverlayTextShadow: 0.0;
313
314    --colorLink: #2d2d2d;
315
316    --colorModalBg: rgba(52, 45, 58, 0.6);
317
318    --colorNav: #ffffff;
319    --colorNavText: #444444;
320
321    --colorPrice: #1e1e1e;
322
323    --colorSaleTag: #ff79b3;
324    --colorSaleTagText: #ffffff;
325
326    --colorTextBody: #2d2d2d;
327    --colorTextBodyAlpha015: rgba(45, 45, 45, 0.15);
328    --colorTextBodyAlpha005: rgba(45, 45, 45, 0.05);
329    --colorTextBodyAlpha008: rgba(45, 45, 45, 0.08);
330    --colorTextSavings: #ff79b3;
331
332    --urlIcoSelect: url(//dreamcatchers.com/cdn/shop/t/373/assets/ico-select.svg);
333    --urlIcoSelectFooter: url(//dreamcatchers.com/cdn/shop/t/373/assets/ico-select-footer.svg);
334    --urlIcoSelectWhite: url(//dreamcatchers.com/cdn/shop/t/373/assets/ico-select-white.svg);
335
336    --grid-gutter: 17px;
337    --drawer-gutter: 20px;
338
339    --sizeChartMargin: 25px 0;
340    --sizeChartIconMargin: 5px;
341
342    --newsletterReminderPadding: 40px;
343
344    /*Shop Pay Installments*/
345    --color-body-text: #2d2d2d;
346    --color-body: #ffffff;
347    --color-bg: #ffffff;
348    }
349
350    .placeholder-content {
351    background-image: linear-gradient(100deg, #ffffff 40%, #f7f7f7 63%, #ffffff 79%);
352    }</style>
352<script src="//code.jquery.com/jquery-3.1.0.min.js" type="text/javascript"></script>
352
353
354  
354<script src="//dreamcatchers.com/cdn/shop/t/373/assets/custom.js?v=175531458647149482531784841737" type="text/javascript"></script>
354
355
356  
356<script>
357    document.documentElement.className = document.documentElement.className.replace('no-js', 'js');
358
359    window.theme = window.theme || {};
360    theme.routes = {
361      home: "/",
362      cart: "/cart.js",
363      cartPage: "/cart",
364      cartAdd: "/cart/add.js",
365      cartChange: "/cart/change.js",
366      search: "/search",
367      predictiveSearch: "/search/suggest"
368    };
369    theme.strings = {
370      soldOut: "Temporarily out of stock",
371      unavailable: "Unavailable",
372      inStockLabel: "In stock, ready to ship",
373      oneStockLabel: "Low stock - [count] item left",
374      otherStockLabel: "Low stock - [count] items left",
375      willNotShipUntil: "Ready to ship [date]",
376      willBeInStockAfter: "Back in stock [date]",
377      waitingForStock: "Backordered, shipping soon",
378      savePrice: "Save [saved_amount]",
379      cartEmpty: "Your cart is currently empty.",
380      cartTermsConfirmation: "You must agree with the terms and conditions of sales to check out",
381      searchCollections: "Collections",
382      searchPages: "Pages",
383      searchArticles: "Articles",
384      productFrom: "from ",
385      maxQuantity: "You can only have [quantity] of [title] in your cart."
386    };
387    theme.settings = {
388      cartType: "drawer",
389      isCustomerTemplate: false,
390      moneyFormat: "${{amount}}",
391      saveType: "dollar",
392      productImageSize: "natural",
393      productImageCover: true,
394      predictiveSearch: true,
395      predictiveSearchType: null,
396      predictiveSearchVendor: false,
397      predictiveSearchPrice: false,
398      quickView: false,
399      themeName: 'Impulse',
400      themeVersion: "8.1.0"
401    };
402  </script>
402
403
404  
404<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
404<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/13094256699/digital_wallets/dialog">
405<meta id="in-context-paypal-metadata" data-shop-id="13094256699" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="USD">
406<link rel="ucp" href="/.well-known/ucp" version="2026-08-25">
406<script async="async" src="/checkouts/internal/preloads.js?locale=en-US&default_configuration_id=2215117046"></script>
406
407<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
408<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-US&default_configuration_id=2215117046&shop_id=13094256699" crossorigin="anonymous"></script>
vendor: 1 bytes, line 408
408
409<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":13094256699,"countryCode":"US","currencyCode":"USD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/13094256699","merchantName":"DreamCatchers Hair Extensions","requiredBillingContactFields":["postalAddress","email","phone"],"requiredShippingContactFields":["postalAddress","email","phone"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex","discover","elo","jcb"],"total":{"type":"pending","label":"DreamCatchers Hair Extensions","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 409
409
410<script id="shopify-features" type="application/json">{"accessToken":"ca77d7b057cd7b0e7738faa8247d61fd","betas":["rich-media-storefront-analytics"],"domain":"dreamcatchers.com","predictiveSearch":true,"shopId":13094256699,"locale":"en"}</script>
vendor: 1 bytes, line 410
410
411<script>var Shopify = Shopify || {};
412Shopify.shop = "sm-dream.myshopify.com";
413Shopify.locale = "en";
414Shopify.currency = {"active":"USD","rate":"1.0"};
415Shopify.country = "US";
416Shopify.theme = {"name":"dreamcatchers-main-theme\/main","id":157360161014,"schema_name":"Impulse","schema_version":"8.1.0","theme_store_id":null,"role":"main"};
417Shopify.theme.handle = "null";
418Shopify.theme.style = {"id":null,"handle":null};
419Shopify.cdnHost = "dreamcatchers.com/cdn";
420Shopify.routes = Shopify.routes || {};
421Shopify.routes.root = "/";
422Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js";
423Shopify.SignInWithShop = Shopify.SignInWithShop || {};
424Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {};
425Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 425
425
426<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 426
426
427<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 1 bytes, line 427
427
428<script>
429  window.ShopifyPay = window.ShopifyPay || {};
430  window.ShopifyPay.apiHost = "shop.app\/pay";
431  window.ShopifyPay.redirectState = null;
432</script>
vendor: 1 bytes, line 432
432
433<script>
434  window.Shopify = window.Shopify || {};
435  window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {};
436  window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 };
437  window.Shopify.SignInWithShop.eligible = true;
438</script>
vendor: 1 bytes, line 438
438
439<script id="shop-js-analytics" type="application/json">{"pageType":"cart"}</script>
vendor: 1 bytes, line 439
439
440<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
vendor: 1 bytes, line 440
440
441<script type="module">
442  await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js");
443
444  window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true});
445
446</script>
vendor: 1 bytes, line 446
446
447<script>
448  window.Shopify = window.Shopify || {};
449  if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {};
450  window.Shopify.featureAssets['shop-js'] = {"avatar":["modules/v2/loader.avatar.en.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.en.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.en.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.en.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.en.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.en.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.en.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.en.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.en.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.en.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.en.esm.js"],"listener":["modules/v2/loader.listener.en.esm.js"],"pay-button":["modules/v2/loader.pay-button.en.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.en.esm.js"],"shop-button":["modules/v2/loader.shop-button.en.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.en.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.en.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.en.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.en.esm.js"],"shop-login":["modules/v2/loader.shop-login.en.esm.js"],"shop-toast-manager":["modules/v2/loader.shop-toast-manager.en.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.en.esm.js"]};
451</script>
vendor: 1 bytes, line 451
451
452<script>(function() {
453  var isLoaded = false;
454  function asyncLoad() {
455    if (isLoaded) return;
456    isLoaded = true;
457    var urls = ["\/\/www.powr.io\/powr.js?powr-token=sm-dream.myshopify.com\u0026external-type=shopify\u0026shop=sm-dream.myshopify.com","https:\/\/cdn.shopify.com\/s\/files\/1\/0130\/9425\/6699\/t\/253\/assets\/affirmShopify.js?v=1733343539\u0026shop=sm-dream.myshopify.com"];
458    for (var i = 0; i < urls.length; i++) {
459      var s = document.createElement('script');
460      s.type = 'text/javascript';
461      s.async = true;
462      s.src = urls[i];
463      var x = document.getElementsByTagName('script')[0];
464      x.parentNode.insertBefore(s, x);
465    }
466  };
467  if(window.attachEvent) {
468    window.attachEvent('onload', asyncLoad);
469  } else {
470    window.addEventListener('load', asyncLoad, false);
471  }
472})();</script>
vendor: 1 bytes, line 472
472
473<script id="__st">var __st={"a":13094256699,"offset":-18000,"reqid":"89fe3673-d7e6-4088-91b5-64cbdcef44a2-1790294590","pageurl":"dreamcatchers.com\/cart","u":"314c3d3249c4","p":"cart"};</script>
vendor: 1 bytes, line 473
473
474<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 474
474
475<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.3.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
vendor: 1 bytes, line 475
475
476<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//dreamcatchers.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 476
476
477<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion < 126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion < 150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion < 27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//dreamcatchers.com/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
477<script crossorigin="anonymous" defer="defer" src="//dreamcatchers.com/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 477
477
478<script id="shopify-origin-trials" async="async" integrity="sha256-qJbe/jEZBHtr5W/BlA2cKAz3vkXu6vJQyLjgvgCC86g=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-318ab40a.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
vendor: 1 bytes, line 478
478
479<script>
480  window.Shopify = window.Shopify || {};
481  window.Shopify.MCP = window.Shopify.MCP || {};
482  window.Shopify.MCP.enabled = true;
483  window.Shopify.MCP.shop = "sm-dream.myshopify.com";
484  window.Shopify.MCP.mcpEndpoint = "https:\/\/dreamcatchers.com\/api\/mcp";
485  window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n  - What is your return policy?\n  - What is your shipping policy?\n  - What is your phone number?\n  - What are your hours of operation?\"\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."}},"required":["query"]}}];
486</script>
vendor: 1 bytes, line 486
486
487<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("DOMContentLoaded",i,{once:!0})}p()?i():m()}s("\/\/dreamcatchers.com\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})();
488</script>
vendor: 1 bytes, line 488
488
489<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://dreamcatchers.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}};
490</script>
vendor: 1 bytes, line 490
490
491<script data-source-attribution="shopify.dynamic_checkout.buyer_consent">
492  function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent);
493</script>
vendor: 1 bytes, line 493
493
494<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("DOMContentLoaded",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}}));
495</script>
495
496<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://dreamcatchers.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous">
497<style id="shopify-accelerated-checkout-cart">
498        #shopify-buyer-consent {
499  margin-top: 1em;
500  display: inline-block;
501  width: 100%;
502}
503
504#shopify-buyer-consent.hidden {
505  display: none;
506}
507
508#shopify-subscription-policy-button {
509  background: none;
510  border: none;
511  padding: 0;
512  text-decoration: underline;
513  font-size: inherit;
514  cursor: pointer;
515}
516
517#shopify-subscription-policy-button::before {
518  box-shadow: none;
519}
520
521      </style>
522
523<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
523
524
525  <style data-shopify>
526    :root {
527      /* Root Variables */
528      /* ========================= */
529      --root-color-primary: #2d2d2d;
530      --color-primary: #2d2d2d;
531      --root-color-secondary: #ffffff;
532      --color-secondary: #ffffff;
533      --color-sale-tag: #ff79b3;
534      --color-sale-tag-text: #ffffff;
535      --layout-section-padding-block: 3rem;
536      --layout-section-padding-inline--md: 40px;
537      --layout-section-max-inline-size: 1420px; 
538
539
540      /* Text */
541      /* ========================= */
542      
543      /* Body Font Styles */
544      --element-text-font-family--body: Lato;
545      --element-text-font-family-fallback--body: sans-serif;
546      --element-text-font-weight--body: 500;
547      --element-text-letter-spacing--body: 0.025em;
548      --element-text-text-transform--body: none;
549
550      /* Body Font Sizes */
551      --element-text-font-size--body: initial;
552      --element-text-font-size--body-xs: 10px;
553      --element-text-font-size--body-sm: 12px;
554      --element-text-font-size--body-md: 14px;
555      --element-text-font-size--body-lg: 16px;
556      
557      /* Body Line Heights */
558      --element-text-line-height--body: 1.6;
559
560      /* Heading Font Styles */
561      --element-text-font-family--heading: Baskervville;
562      --element-text-font-family-fallback--heading: serif;
563      --element-text-font-weight--heading: 700;
564      --element-text-letter-spacing--heading: 0.0em;
565      
566       
567      
568      
569      /* Heading Font Sizes */
570      --element-text-font-size--heading-2xl: 76px;
571      --element-text-font-size--heading-xl: 60px;
572      --element-text-font-size--heading-lg: 54px;
573      --element-text-font-size--heading-md: 52px;
574      --element-text-font-size--heading-sm: 46px;
575      --element-text-font-size--heading-xs: 44px;
576      
577      /* Heading Line Heights */
578      --element-text-line-height--heading: 1.1;
579
580      /* Buttons */
581      /* ========================= */
582      
583          --element-button-radius: 0;
584      
585
586      --element-button-padding-block: 12px;
587      --element-button-text-transform: uppercase;
588      --element-button-font-weight: 800;
589      --element-button-font-size: max(calc(var(--typeBaseSize) - 4px), 13px);
590      --element-button-letter-spacing: .3em;
591
592      /* Base Color Variables */
593      --element-button-color-primary: #201f23;
594      --element-button-color-secondary: #ffffff;
595      --element-button-shade-border: 100%;
596
597      /* Hover State Variables */
598      --element-button-shade-background--hover: 0%;
599      --element-button-shade-border--hover: 100%;
600
601      /* Focus State Variables */
602      --element-button-color-focus: var(--color-focus);
603
604      /* Inputs */
605      /* ========================= */
606      
607          --element-icon-radius: 0;
608      
609
610      --element-input-font-size: var(--element-text-font-size--body-sm);
611      --element-input-box-shadow-shade: 100%;
612
613      /* Hover State Variables */
614      --element-input-background-shade--hover: 0%;
615      --element-input-box-shadow-spread-radius--hover: 1px;
616    }
617
618    @media only screen and (max-width: 768px) {
619      :root {
620        --element-button-font-size: max(calc(var(--typeBaseSize) - 5px), 11px);
621      }
622    }
623
624    .element-radio {
625        &:has(input[type='radio']:checked) {
626          --element-button-color: var(--element-button-color-secondary);
627        }
628    }
629
630    /* ATC Button Overrides */
631    /* ========================= */
632
633    .element-button[type="submit"],
634    .element-button[type="submit"] .element-text,
635    .element-button--shopify-payment-wrapper button {
636      --element-button-padding-block: 13px;
637      --element-button-padding-inline: 20px;
638      --element-button-line-height: 1.42;
639      --_font-size--body-md: var(--element-button-font-size);
640
641      line-height: 1.42 !important;
642    }
643
644    /* When dynamic checkout is enabled */
645    product-form:has(.element-button--shopify-payment-wrapper) {
646      --element-button-color: #2d2d2d;
647
648      .element-button[type="submit"],
649      .element-button--shopify-payment-wrapper button {
650        min-height: 50px !important;
651      }
652
653      .shopify-payment-button {
654        margin: 0;
655      }
656    }
657
658    /* Hover animation for non-angled buttons */
659    body:not([data-button_style='angled']) .element-button[type="submit"] {
660      position: relative;
661      overflow: hidden;
662
663      &:after {
664        content: '';
665        position: absolute;
666        top: 0;
667        left: 150%;
668        width: 200%;
669        height: 100%;
670        transform: skewX(-20deg);
671        background-image: linear-gradient(to right,transparent, rgba(255,255,255,.25),transparent);
672      }
673
674      &:hover:after {
675        animation: shine 0.75s cubic-bezier(0.01, 0.56, 1, 1);
676      }
677    }
678
679    /* ANGLED STYLE - ATC Button Overrides */
680    /* ========================= */
681    
682    [data-button_style='angled'] {
683      --element-button-shade-background--active: var(--element-button-shade-background);
684      --element-button-shade-border--active: var(--element-button-shade-border);
685
686      .element-button[type="submit"] {
687        --_box-shadow: none;
688
689        position: relative;
690        max-width: 94%;
691        border-top: 1px solid #201f23;
692        border-bottom: 1px solid #201f23;
693        
694        &:before,
695        &:after {
696          content: '';
697          position: absolute;
698          display: block;
699          top: -1px;
700          bottom: -1px;
701          width: 20px;
702          transform: skewX(-12deg);
703          background-color: #201f23;
704        }
705        
706        &:before {
707          left: -6px;
708        }
709        
710        &:after {
711          right: -6px;
712        }
713      }
714
715      /* When dynamic checkout is enabled */
716      product-form:has(.element-button--shopify-payment-wrapper) {
717        .element-button[type="submit"]:before,
718        .element-button[type="submit"]:after {
719          background-color: color-mix(in srgb,var(--_color-text) var(--_shade-background),var(--_color-background));
720          border-top: 1px solid #201f23;
721          border-bottom: 1px solid #201f23;
722        }
723
724        .element-button[type="submit"]:before {
725          border-left: 1px solid #201f23;
726        }
727        
728        .element-button[type="submit"]:after {
729          border-right: 1px solid #201f23;
730        }
731      }
732
733      .element-button--shopify-payment-wrapper {
734        --_color-background: #201f23;
735
736        button:hover,
737        button:before,
738        button:after {
739          background-color: color-mix(in srgb,var(--_color-text) var(--_shade-background),var(--_color-background)) !important;
740        }
741
742        button:not(button:focus-visible) {
743          box-shadow: none !important;
744        }
745      }
746    }
747  </style>
748
749  
749<script src="//dreamcatchers.com/cdn/shop/t/373/assets/vendor-scripts-v11.js" defer="defer"></script>
749<link rel="stylesheet" href="//dreamcatchers.com/cdn/shop/t/373/assets/country-flags.css">
749<script src="//dreamcatchers.com/cdn/shop/t/373/assets/theme.js?v=112788892713901450091787942998" defer="defer"></script>
749
750
751  <!-- YotPo -->
752  
752<script type="text/javascript">(function e(){var e=document.createElement("script");e.type="text/javascript",e.async=true,e.src="//staticw2.yotpo.com/t0tIiMhnh7iDygQ7Fbur1JxFPMMlKHXAakbOzh1U/widget.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})();</script>
752
753
754  
754<script type="text/javascript">
755    (function(c,l,a,r,i,t,y){
756        c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
757        t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
758        y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
759    })(window, document, "clarity", "script", "lwk281zko2");
760  </script>
760
761
762
763
764<!-- BEGIN app block: shopify://apps/eg-auto-add-to-cart/blocks/app-embed/0f7d4f74-1e89-4820-aec4-6564d7e535d2 -->
765
766
767
768
769
770
771
772
773
774
775
776  
777    
777<script
778      async
779      type="text/javascript"
780      src="https://cdn.506.io/eg/script.js?shop=sm-dream.myshopify.com&v=12"
781    ></script>
781
782  
783
784
785
786  <meta id="easygift-shop" itemid="c2hvcF8kXzE3OTAyOTQ1OTA=" content="{&quot;isInstalled&quot;:true,&quot;installedOn&quot;:&quot;2025-11-24T22:53:46.379Z&quot;,&quot;appVersion&quot;:&quot;3.0&quot;,&quot;subscriptionName&quot;:&quot;Unlimited&quot;,&quot;cartAnalytics&quot;:true,&quot;freeTrialEndsOn&quot;:null,&quot;settings&quot;:{&quot;reminderBannerStyle&quot;:{&quot;position&quot;:{&quot;horizontal&quot;:&quot;right&quot;,&quot;vertical&quot;:&quot;bottom&quot;},&quot;backgroundColor&quot;:&quot;#FFFFFF&quot;,&quot;borderRadius&quot;:null,&quot;padding&quot;:null,&quot;headerFontSize&quot;:null,&quot;subHeaderFontSize&quot;:null,&quot;fontFamily&quot;:null,&quot;closingMode&quot;:&quot;doNotAutoClose&quot;,&quot;cssStyles&quot;:&quot;&quot;,&quot;displayAfter&quot;:5,&quot;headerText&quot;:&quot;&quot;,&quot;imageUrl&quot;:null,&quot;primaryColor&quot;:&quot;#000000&quot;,&quot;reshowBannerAfter&quot;:&quot;everyNewSession&quot;,&quot;selfcloseAfter&quot;:5,&quot;showImage&quot;:false,&quot;subHeaderText&quot;:&quot;&quot;},&quot;addedItemIdentifier&quot;:&quot;_Gifted&quot;,&quot;ignoreOtherAppLineItems&quot;:null,&quot;customVariantsInfoLifetimeMins&quot;:1440,&quot;redirectPath&quot;:null,&quot;ignoreNonStandardCartRequests&quot;:false,&quot;bannerStyle&quot;:{&quot;position&quot;:{&quot;horizontal&quot;:&quot;right&quot;,&quot;vertical&quot;:&quot;bottom&quot;},&quot;backgroundColor&quot;:&quot;#FFFFFF&quot;,&quot;borderRadius&quot;:null,&quot;padding&quot;:null,&quot;headerFontSize&quot;:null,&quot;subHeaderFontSize&quot;:null,&quot;fontFamily&quot;:null,&quot;cssStyles&quot;:null,&quot;primaryColor&quot;:&quot;#000000&quot;},&quot;themePresetId&quot;:null,&quot;notificationStyle&quot;:{&quot;position&quot;:{&quot;horizontal&quot;:null,&quot;vertical&quot;:null},&quot;backgroundColor&quot;:&quot;#FFFFFF&quot;,&quot;borderRadius&quot;:null,&quot;headerFontSize&quot;:null,&quot;subHeaderFontSize&quot;:null,&quot;padding&quot;:null,&quot;fontFamily&quot;:null,&quot;cssStyles&quot;:null,&quot;duration&quot;:null,&quot;hasCustomizations&quot;:false,&quot;primaryColor&quot;:null},&quot;fetchCartData&quot;:true,&quot;useLocalStorage&quot;:{&quot;enabled&quot;:false,&quot;expiryMinutes&quot;:null},&quot;popupStyle&quot;:{&quot;buttonTextColor&quot;:null,&quot;backgroundColor&quot;:&quot;#FFFFFF&quot;,&quot;borderRadius&quot;:null,&quot;padding&quot;:null,&quot;headerFontSize&quot;:null,&quot;subHeaderFontSize&quot;:null,&quot;bodyColor&quot;:null,&quot;bodyFontSize&quot;:null,&quot;headerFontFamily&quot;:null,&quot;bodyFontFamily&quot;:null,&quot;closeModalOutsideClick&quot;:true,&quot;priceShowZeroDecimals&quot;:true,&quot;addButtonText&quot;:null,&quot;cssStyles&quot;:null,&quot;dismissButtonText&quot;:null,&quot;hasCustomizations&quot;:false,&quot;imageUrl&quot;:null,&quot;outOfStockButtonText&quot;:null,&quot;primaryColor&quot;:null,&quot;secondaryColor&quot;:null,&quot;showProductLink&quot;:false,&quot;subscriptionLabel&quot;:null},&quot;refreshAfterBannerClick&quot;:false,&quot;disableReapplyRules&quot;:false,&quot;disableReloadOnFailedAddition&quot;:true,&quot;autoReloadCartPage&quot;:false,&quot;ajaxRedirectPath&quot;:null,&quot;allowSimultaneousRequests&quot;:false,&quot;applyRulesOnCheckout&quot;:false,&quot;enableCartCtrlOverrides&quot;:true,&quot;customRedirectFromCart&quot;:null,&quot;scriptSettings&quot;:{&quot;branding&quot;:{&quot;removalRequestSent&quot;:null,&quot;show&quot;:false},&quot;productPageRedirection&quot;:{&quot;enabled&quot;:false,&quot;products&quot;:[],&quot;redirectionURL&quot;:&quot;\/&quot;},&quot;debugging&quot;:{&quot;enabled&quot;:true,&quot;enabledOn&quot;:&quot;2025-12-22T06:52:35.783Z&quot;,&quot;stringifyObj&quot;:true},&quot;reApplyValueBasedRulesInCart&quot;:false,&quot;disableRedirectAfterFormSubmit&quot;:false,&quot;useFinalPriceGetEntireCart&quot;:true,&quot;customCSS&quot;:null,&quot;decodePayload&quot;:false,&quot;delayUpdates&quot;:2000,&quot;enableBuyNowInterceptions&quot;:false,&quot;fetchCartDataBeforeRequest&quot;:true,&quot;fetchProductInfoFromSavedDomain&quot;:false,&quot;hideAlertsOnFrontend&quot;:false,&quot;hideGiftedPropertyText&quot;:false,&quot;removeEGPropertyFromSplitActionLineItems&quot;:false,&quot;removeProductsAddedFromExpiredRules&quot;:true,&quot;useFinalPrice&quot;:true},&quot;promoCodeMessageStyle&quot;:{&quot;message&quot;:&quot;Free gift added!&quot;},&quot;egDiscount&quot;:{&quot;cartValueStopCollectionCheck&quot;:false},&quot;accessToEnterprise&quot;:true},&quot;translations&quot;:null,&quot;defaultLocale&quot;:&quot;en&quot;,&quot;shopDomain&quot;:&quot;dreamcatchers.com&quot;}">
787
788
789<script defer>
790  (async function() {
791    try {
792
793      const blockVersion = "v3"
794      if (blockVersion != "v3") {
795        return
796      }
797
798      let metaErrorFlag = false;
799      if (metaErrorFlag) {
800        return
801      }
802
803      // Parse metafields as JSON
804      const metafields = {"easygift-rule-692d7c50093eaff63625053b":{"schedule":{"enabled":false,"starts":null,"ends":null},"trigger":{"productTags":{"targets":[],"sellingPlan":null},"hybrid":null,"promoCode":null,"promoCodeDiscount":null,"type":"collection","minCartValue":null,"upperCartValue":null,"products":[],"collections":[{"gid":"gid:\/\/shopify\/Collection\/171760025659"}],"condition":null,"conditionMin":null,"conditionMax":null,"collectionSellingPlanType":null,"cartValueExcludedVariants":[]},"action":{"notification":{"enabled":false,"headerText":null,"subHeaderText":null,"showImage":false,"imageUrl":""},"discount":{"easygiftAppDiscount":false,"type":null,"id":null,"title":null,"createdByEasyGift":false,"code":null,"issue":null,"discountType":null,"value":null},"popupOptions":{"headline":null,"subHeadline":null,"showItemsPrice":false,"showVariantsSeparately":false,"popupDismissable":false,"imageUrl":null,"persistPopup":false,"rewardQuantity":1,"showDiscountedPrice":false,"hideOOSItems":false},"banner":{"enabled":false,"headerText":null,"subHeaderText":null,"showImage":false,"imageUrl":null,"displayAfter":"5","closingMode":"doNotAutoClose","selfcloseAfter":"5","reshowBannerAfter":"everyNewSession","redirectLink":null},"showPromoCodeMessage":false,"type":"addAutomatically","products":[{"variantId":"40314164871318","quantity":1}],"limit":1,"preventProductRemoval":true,"addAvailableProducts":false},"targeting":{"link":{"destination":null,"data":null,"cookieLifetime":14},"additionalCriteria":{"geo":{"include":[],"exclude":[]},"type":null,"customerTags":[],"customerTagsExcluded":[],"customerId":[],"orderCount":null,"hasOrderCountMax":false,"orderCountMax":null,"totalSpent":null,"hasTotalSpentMax":false,"totalSpentMax":null},"type":"all"},"settings":{"worksInReverse":true,"runsOncePerSession":false,"preventAddedItemPurchase":false,"showReminderBanner":false},"testMode":false,"_id":"692d7c50093eaff63625053b","name":"FREE Online Certification Training","active":true,"translations":null},"easygift-rule-699c89d6830f9a5b529b0d93":{"schedule":{"enabled":false,"starts":null,"ends":null},"trigger":{"productTags":{"targets":[],"sellingPlan":null},"hybrid":null,"type":"collection","promoCode":null,"promoCodeDiscount":null,"minCartValue":null,"upperCartValue":null,"products":[],"collections":[{"gid":"gid:\/\/shopify\/Collection\/481245004022"},{"gid":"gid:\/\/shopify\/Collection\/482717303030"}],"condition":null,"conditionMin":null,"conditionMax":null,"collectionSellingPlanType":null,"cartValueExcludedVariants":[]},"action":{"notification":{"enabled":false,"headerText":null,"subHeaderText":null,"showImage":false,"imageUrl":""},"discount":{"easygiftAppDiscount":false,"type":null,"id":null,"title":null,"createdByEasyGift":false,"code":null,"issue":null,"discountType":null,"value":null},"popupOptions":{"headline":null,"subHeadline":null,"showItemsPrice":false,"showVariantsSeparately":false,"popupDismissable":false,"imageUrl":null,"persistPopup":false,"rewardQuantity":1,"showDiscountedPrice":false,"hideOOSItems":false},"banner":{"enabled":false,"headerText":null,"subHeaderText":null,"showImage":false,"imageUrl":null,"displayAfter":"5","closingMode":"doNotAutoClose","selfcloseAfter":"5","reshowBannerAfter":"everyNewSession","redirectLink":null},"showPromoCodeMessage":false,"type":"addAutomatically","products":[{"variantId":"50024410120438","quantity":1,"alerts":[]}],"limit":1,"preventProductRemoval":false,"addAvailableProducts":false},"targeting":{"link":{"destination":null,"data":null,"cookieLifetime":14},"additionalCriteria":{"geo":{"include":[],"exclude":[]},"type":null,"customerTags":[],"customerTagsExcluded":[],"customerId":[],"orderCount":null,"hasOrderCountMax":false,"orderCountMax":null,"totalSpent":null,"hasTotalSpentMax":false,"totalSpentMax":null},"type":"all"},"settings":{"worksInReverse":true,"runsOncePerSession":false,"preventAddedItemPurchase":false,"showReminderBanner":false},"testMode":false,"_id":"699c89d6830f9a5b529b0d93","name":"FREE DreamLights Online Certification Training","active":true,"translations":null},"easygift-rule-6a47f93e1a0b0e5f8fc58841":{"schedule":{"enabled":false,"starts":null,"ends":null},"trigger":{"productTags":{"targets":[],"sellingPlan":null},"hybrid":null,"type":"productsInclude","promoCode":null,"promoCodeDiscount":null,"minCartValue":null,"upperCartValue":null,"products":[{"variantId":48666901381366,"sellingPlans":[]},{"variantId":48666901414134,"sellingPlans":[]},{"variantId":48666901446902,"sellingPlans":[]},{"variantId":48666901479670,"sellingPlans":[]},{"variantId":48666901512438,"sellingPlans":[]},{"variantId":48666905510134,"sellingPlans":[]},{"variantId":48666901545206,"sellingPlans":[]},{"variantId":48666901577974,"sellingPlans":[]},{"variantId":48666901610742,"sellingPlans":[]},{"variantId":48666901676278,"sellingPlans":[]},{"variantId":48666901709046,"sellingPlans":[]},{"variantId":51128595513590,"sellingPlans":[]}],"cartValueExcludedVariants":[],"collections":[],"condition":"quantity","conditionMin":1,"conditionMax":null,"collectionSellingPlanType":null},"action":{"notification":{"enabled":false,"headerText":null,"subHeaderText":null,"showImage":false,"imageUrl":""},"discount":{"type":null,"title":null,"code":null,"id":null,"createdByEasyGift":false,"issue":null,"value":null,"discountType":null,"easygiftAppDiscount":false},"popupOptions":{"headline":null,"subHeadline":null,"showItemsPrice":false,"popupDismissable":false,"imageUrl":null,"persistPopup":false,"rewardQuantity":1,"showDiscountedPrice"
804:false,"hideOOSItems":false,"showVariantsSeparately":false},"banner":{"enabled":false,"headerText":null,"imageUrl":null,"subHeaderText":null,"showImage":false,"displayAfter":"5","closingMode":"doNotAutoClose","selfcloseAfter":"5","reshowBannerAfter":"everyNewSession","redirectLink":null},"type":"addAutomatically","products":[{"variantId":"51162114883830","quantity":1,"alerts":[{"type":"outOfStock","triggered":false}]}],"limit":1,"preventProductRemoval":false,"addAvailableProducts":false,"showPromoCodeMessage":false},"targeting":{"link":{"destination":null,"data":null,"cookieLifetime":14},"additionalCriteria":{"geo":{"include":[],"exclude":[]},"type":null,"customerTags":[],"customerTagsExcluded":[],"customerId":[],"orderCount":null,"hasOrderCountMax":false,"orderCountMax":null,"totalSpent":null,"hasTotalSpentMax":false,"totalSpentMax":null},"type":"all"},"settings":{"worksInReverse":true,"runsOncePerSession":false,"preventAddedItemPurchase":true,"showReminderBanner":false},"_id":"6a47f93e1a0b0e5f8fc58841","name":"Free DreamCatchers Snaggle Twist Brush","active":true,"translations":null,"testMode":false}};
805
806      // Process metafields in JavaScript
807      let savedRulesArray = [];
808      for (const [key, value] of Object.entries(metafields)) {
809        if (value) {
810          for (const prop in value) {
811            // avoiding Object.Keys for performance gain -- no need to make an array of keys.
812            savedRulesArray.push(value);
813            break;
814          }
815        }
816      }
817
818      const metaTag = document.createElement('meta');
819      metaTag.id = 'easygift-rules';
820      metaTag.content = JSON.stringify(savedRulesArray);
821      metaTag.setAttribute('itemid', 'cnVsZXNfJF8xNzkwMjk0NTkw');
822
823      document.head.appendChild(metaTag);
824      } catch (err) {
825        
826      }
827  })();
828</script>
828
829
830
831  
831<script
832    type="text/javascript"
833    defer
834  >
835
836    (function () {
837      try {
838        window.EG_INFO = window.EG_INFO || {};
839        var shopInfo = {"isInstalled":true,"installedOn":"2025-11-24T22:53:46.379Z","appVersion":"3.0","subscriptionName":"Unlimited","cartAnalytics":true,"freeTrialEndsOn":null,"settings":{"reminderBannerStyle":{"position":{"horizontal":"right","vertical":"bottom"},"backgroundColor":"#FFFFFF","borderRadius":null,"padding":null,"headerFontSize":null,"subHeaderFontSize":null,"fontFamily":null,"closingMode":"doNotAutoClose","cssStyles":"","displayAfter":5,"headerText":"","imageUrl":null,"primaryColor":"#000000","reshowBannerAfter":"everyNewSession","selfcloseAfter":5,"showImage":false,"subHeaderText":""},"addedItemIdentifier":"_Gifted","ignoreOtherAppLineItems":null,"customVariantsInfoLifetimeMins":1440,"redirectPath":null,"ignoreNonStandardCartRequests":false,"bannerStyle":{"position":{"horizontal":"right","vertical":"bottom"},"backgroundColor":"#FFFFFF","borderRadius":null,"padding":null,"headerFontSize":null,"subHeaderFontSize":null,"fontFamily":null,"cssStyles":null,"primaryColor":"#000000"},"themePresetId":null,"notificationStyle":{"position":{"horizontal":null,"vertical":null},"backgroundColor":"#FFFFFF","borderRadius":null,"headerFontSize":null,"subHeaderFontSize":null,"padding":null,"fontFamily":null,"cssStyles":null,"duration":null,"hasCustomizations":false,"primaryColor":null},"fetchCartData":true,"useLocalStorage":{"enabled":false,"expiryMinutes":null},"popupStyle":{"buttonTextColor":null,"backgroundColor":"#FFFFFF","borderRadius":null,"padding":null,"headerFontSize":null,"subHeaderFontSize":null,"bodyColor":null,"bodyFontSize":null,"headerFontFamily":null,"bodyFontFamily":null,"closeModalOutsideClick":true,"priceShowZeroDecimals":true,"addButtonText":null,"cssStyles":null,"dismissButtonText":null,"hasCustomizations":false,"imageUrl":null,"outOfStockButtonText":null,"primaryColor":null,"secondaryColor":null,"showProductLink":false,"subscriptionLabel":null},"refreshAfterBannerClick":false,"disableReapplyRules":false,"disableReloadOnFailedAddition":true,"autoReloadCartPage":false,"ajaxRedirectPath":null,"allowSimultaneousRequests":false,"applyRulesOnCheckout":false,"enableCartCtrlOverrides":true,"customRedirectFromCart":null,"scriptSettings":{"branding":{"removalRequestSent":null,"show":false},"productPageRedirection":{"enabled":false,"products":[],"redirectionURL":"\/"},"debugging":{"enabled":true,"enabledOn":"2025-12-22T06:52:35.783Z","stringifyObj":true},"reApplyValueBasedRulesInCart":false,"disableRedirectAfterFormSubmit":false,"useFinalPriceGetEntireCart":true,"customCSS":null,"decodePayload":false,"delayUpdates":2000,"enableBuyNowInterceptions":false,"fetchCartDataBeforeRequest":true,"fetchProductInfoFromSavedDomain":false,"hideAlertsOnFrontend":false,"hideGiftedPropertyText":false,"removeEGPropertyFromSplitActionLineItems":false,"removeProductsAddedFromExpiredRules":true,"useFinalPrice":true},"promoCodeMessageStyle":{"message":"Free gift added!"},"egDiscount":{"cartValueStopCollectionCheck":false},"accessToEnterprise":true},"translations":null,"defaultLocale":"en","shopDomain":"dreamcatchers.com"};
840        var productRedirectionEnabled = shopInfo.settings.scriptSettings.productPageRedirection.enabled;
841        if (["Unlimited", "Enterprise"].includes(shopInfo.subscriptionName) && productRedirectionEnabled) {
842          var products = shopInfo.settings.scriptSettings.productPageRedirection.products;
843          if (products.length > 0) {
844            var productIds = products.map(function(prod) {
845              var productGid = prod.id;
846              var productIdNumber = parseInt(productGid.split('/').pop());
847              return productIdNumber;
848            });
849            var productInfo = null;
850            var isProductInList = productIds.includes(productInfo.id);
851            if (isProductInList) {
852              var redirectionURL = shopInfo.settings.scriptSettings.productPageRedirection.redirectionURL;
853              if (redirectionURL) {
854                window.location = redirectionURL;
855              }
856            }
857          }
858        }
859
860        
861      } catch(err) {
862      return
863    }}
863)()
864  </script>
864
865
866
867
868<!-- END app block --><!-- BEGIN app block: shopify://apps/microsoft-clarity/blocks/clarity_js/31c3d126-8116-4b4a-8ba1-baeda7c4aeea -->
869<script type="text/javascript">
870  (function (c, l, a, r, i, t, y) {
871    c[a] = c[a] || function () { (c[a].q = c[a].q || []).push(arguments); };
872    t = l.createElement(r); t.async = 1; t.src = "https://www.clarity.ms/tag/" + i + "?ref=shopify";
873    y = l.getElementsByTagName(r)[0]; y.parentNode.insertBefore(t, y);
874
875    c.Shopify.loadFeatures([{ name: "consent-tracking-api", version: "0.1" }], error => {
876      if (error) {
877        console.error("Error loading Shopify features:", error);
878        return;
879      }
880
881      c[a]('consentv2', {
882        ad_Storage: c.Shopify.customerPrivacy.marketingAllowed() ? "granted" : "denied",
883        analytics_Storage: c.Shopify.customerPrivacy.analyticsProcessingAllowed() ? "granted" : "denied",
884        source: 101,
885      });
886    });
887
888    l.addEventListener("visitorConsentCollected", function (e) {
889      c[a]('consentv2', {
890        ad_Storage: e.detail.marketingAllowed ? "granted" : "denied",
891        analytics_Storage: e.detail.analyticsAllowed ? "granted" : "denied",
892        source: 101,
893      });
894    });
895  })(window, document, "clarity", "script", "utbu58j1ae");
896</script>
896
897
898
899
900<!-- END app block --><!-- BEGIN app block: shopify://apps/thoughtmetric/blocks/tm/5a9f9e10-3a9f-41b1-8250-d2eab3bd19a4 -->
900<script>
901  !function(t,e,i){if(!t.thoughtmetric){t.thoughtmetricQueue=t.thoughtmetricQueue||[],t.thoughtmetric=t.thoughtmetric||function(){t.thoughtmetricQueue.push(arguments)};var u=e.createElement("script");u.async=!0,u.src="/apps/data/init.js";var h=e.getElementsByTagName("script")[0];h.parentNode.insertBefore(u,h)}}(window,document);
902  thoughtmetric("init","ID-fc32e7caa6cdd3ef");  thoughtmetric("pageview");
903</script>
903
904
905
906
907<!-- END app block --><!-- BEGIN app block: shopify://apps/candy-rack/blocks/head/cb9c657f-334f-4905-80c2-f69cca01460c -->
907<script src="https://cdn.shopify.com/extensions/01a0d31b-101d-739a-9ef9-4af26e65e564/candyrack-633/assets/main.js?shop=sm-dream.myshopify.com" async></script>
907
908
909
910
911
912<!-- END app block --><!-- BEGIN app block: shopify://apps/klaviyo-email-marketing-sms/blocks/klaviyo-onsite-embed/2632fe16-c075-4321-a88b-50b567f42507 -->
913
914
915
916
917
918
919
920
921
922
923
924
925  
925<script async src="https://static.klaviyo.com/onsite/js/M9YDBm/klaviyo.js?company_id=M9YDBm"></script>
925
926  
926<script>!function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return"push"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t="function"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();</script>
926
927
928  
929
930
931
932
933  
933<script>
934    window.klaviyoReviewsProductDesignMode = false
935  </script>
935
936
937
938
939
940
941
942
943
944
945<!-- END app block --><!-- BEGIN app block: shopify://apps/microsoft-clarity/blocks/brandAgents_js/31c3d126-8116-4b4a-8ba1-baeda7c4aeea -->
946
947
948
949<script type="text/javascript">
950  (function(d){
951      var s = d.createElement('script');
952      s.async = true;
953      s.src = "https://adsagentclientafd-b7hqhjdrf3fpeqh2.b01.azurefd.net/frontendInjection.js";
954      var firstScript = d.getElementsByTagName('script')[0];
955      firstScript.parentNode.insertBefore(s, firstScript);
956  })(document);
957</script>
957
958
959
960
961<!-- END app block --><!-- BEGIN app block: shopify://apps/yotpo-product-reviews/blocks/settings/eb7dfd7d-db44-4334-bc49-c893b51b36cf -->
962
963
964  
964<script type="text/javascript" src="https://cdn-widgetsrepository.yotpo.com/v1/loader/t0tIiMhnh7iDygQ7Fbur1JxFPMMlKHXAakbOzh1U?languageCode=en" async></script>
964
965
966
967
968  
969<!-- END app block --><!-- BEGIN app block: shopify://apps/triplewhale/blocks/triple_pixel_snippet/483d496b-3f1a-4609-aea7-8eee3b6b7a2a --><link rel='preconnect dns-prefetch' href='https://api.config-security.com/' crossorigin />
970<link rel='preconnect dns-prefetch' href='https://conf.config-security.com/' crossorigin />
971<script>
972/* >> TriplePixel :: start*/
973window.TriplePixelData={TripleName:"sm-dream.myshopify.com",ver:"2.16",plat:"SHOPIFY",isHeadless:false,src:'SHOPIFY_EXT',product:{id:"",name:``,price:"",variant:"",av:{  }},search:"",collection:"",cart:"drawer",template:"cart",curr:"USD" || "USD", market:"85754102"},function(W,H,A,L,E,_,B,N){function O(U,T,P,H,R){void 0===R&&(R=!1),H=new XMLHttpRequest,P?(H.open("POST",U,!0),H.setRequestHeader("Content-Type","text/plain")):H.open("GET",U,!0),H.send(JSON.stringify(P||{})),H.onreadystatechange=function(){4===H.readyState&&200===H.status?(R=H.responseText,U.includes("/first")?eval(R):P||(N[B]=R)):(299<H.status||H.status<200)&&T&&!R&&(R=!0,O(U,T-1,P))}}if(N=window,!N[H+"sn"]){N[H+"sn"]=1,L=function(){return Date.now().toString(36)+"_"+Math.random().toString(36)};try{A.setItem(H,1+(0|A.getItem(H)||0)),(E=JSON.parse(A.getItem(H+"U")||"[]")).push({u:location.href,r:document.referrer,t:Date.now(),id:L()}),A.setItem(H+"U",JSON.stringify(E))}catch(e){}var i,m,p;A.getItem('"!nC`')||(_=A,A=N,A[H]||(E=A[H]=function(t,e,i){return void 0===i&&(i=[]),"State"==t?E.s:(W=L(),(E._q=E._q||[]).push([W,t,e].concat(i)),W)},E.s="Installed",E._q=[],E.ch=W,B="configSecurityConfModel",N[B]=1,O("https://conf.config-security.com/model",5),i=L(),m=A[atob("c2NyZWVu")],_.setItem("di_pmt_wt",i),p={id:i,action:"profile",avatar:_.getItem("auth-security_rand_salt_"),time:m[atob("d2lkdGg=")]+":"+m[atob("aGVpZ2h0")],host:A.TriplePixelData.TripleName,plat:A.TriplePixelData.plat,url:window.location.href.slice(0,500),ref:document.referrer,ver:A.TriplePixelData.ver},O("https://api.config-security.com/event",5,p),O("https://api.config-security.com/first?host=".concat(p.host,"&plat=").concat(p.plat),5)))}}("","TriplePixel",localStorage);
974/* << TriplePixel :: end*/
975</script>
975
976
977
978
979<!-- END app block --><!-- BEGIN app block: shopify://apps/pagefly-ai-page-builder/blocks/app-embed/83e179f7-59a0-4589-8c66-c0dddf959200 -->
980
981<!-- BEGIN app snippet: pagefly-cro-ab-testing-main -->
982
983
984
985
986
987
988
989<script>
990  ;(function () {
991    const url = new URL(window.location)
992    const viewParam = url.searchParams.get('view')
993    if (viewParam && viewParam.includes('variant-pf-')) {
994      url.searchParams.set('pf_v', viewParam)
995      url.searchParams.delete('view')
996      window.history.replaceState({}, '', url)
997    }
998  })()
999</script>
999
1000
1001
1002
1003<script type='module'>
1004  
1005  window.PAGEFLY_CRO = window.PAGEFLY_CRO || {}
1006
1007  window.PAGEFLY_CRO['data_debug'] = {
1008    original_template_suffix: "",
1009    allow_ab_test: false,
1010    ab_test_start_time: 0,
1011    ab_test_end_time: 0,
1012    today_date_time: 1790294590000,
1013  }
1014  window.PAGEFLY_CRO['GA4'] = { enabled: false}
1015</script>
1015
1016
1017<!-- END app snippet -->
1018
1019
1020
1021
1022
1023
1024
1025
1026  
1026<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-helper.js' defer='defer'></script>
1026
1027
1028  
1028<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-general-helper.js' defer='defer'></script>
1028
1029
1030  
1030<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-snap-slider.js' defer='defer'></script>
1030
1031
1032  
1032<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-slideshow-v3.js' defer='defer'></script>
1032
1033
1034  
1034<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-slideshow-v4.js' defer='defer'></script>
1034
1035
1036  
1036<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-glider.js' defer='defer'></script>
1036
1037
1038  
1038<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-slideshow-v1-v2.js' defer='defer'></script>
1038
1039
1040  
1040<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-product-media.js' defer='defer'></script>
1040
1041
1042  
1042<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-product.js' defer='defer'></script>
1042
1043
1044
1045<script id='pagefly-helper-data' type='application/json'>
1046  {
1047    "page_optimization": {
1048      "assets_prefetching": false
1049    },
1050    "elements_asset_mapper": {
1051      "Accordion": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-accordion.js",
1052      "Accordion3": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-accordion3.js",
1053      "CountDown": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-countdown.js",
1054      "GMap1": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-gmap.js",
1055      "GMap2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-gmap.js",
1056      "GMapBasicV2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-gmap.js",
1057      "GMapAdvancedV2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-gmap.js",
1058      "HTML.Video": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-htmlvideo.js",
1059      "HTML.Video2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-htmlvideo2.js",
1060      "HTML.Video3": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-htmlvideo2.js",
1061      "BackgroundVideo": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-htmlvideo2.js",
1062      "Instagram": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-instagram.js",
1063      "Instagram2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-instagram.js",
1064      "Insta3": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-instagram3.js",
1065      "Tabs": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-tab.js",
1066      "Tabs3": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-tab3.js",
1067      "ProductBox": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-cart.js",
1068      "FBPageBox2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-facebook.js",
1069      "FBLikeButton2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-facebook.js",
1070      "TwitterFeed2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-twitter.js",
1071      "Paragraph4": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-paragraph4.js",
1072
1073      "AliReviews": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1074      "BackInStock": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1075      "GloboBackInStock": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1076      "GrowaveWishlist": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1077      "InfiniteOptionsShopPad": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1078      "InkybayProductPersonalizer": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder
1078-358/assets/pagefly-3rd-elements.js",
1079      "LimeSpot": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1080      "Loox": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1081      "Opinew": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1082      "Powr": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1083      "ProductReviews": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1084      "PushOwl": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1085      "ReCharge": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1086      "Rivyo": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1087      "TrackingMore": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1088      "Vitals": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js",
1089      "Wiser": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js"
1090    },
1091    "custom_elements_mapper": {
1092      "pf-click-action-element": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-click-action-element.js",
1093      "pf-dialog-element": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-dialog-element.js"
1094    }
1095  }
1096</script>
1096
1097
1098<script id='pagefly-heatmap-config' type='application/json'>
1099  {}
1100</script>
vendor: 1 bytes, line 1100
1100
1101<script>
1102  (function () {
1103    var el = document.getElementById('pagefly-heatmap-config')
1104    if (!el) { window.__pagefly_heatmap_config__ = {}; return }
1105    try {
1106      window.__pagefly_heatmap_config__ = JSON.parse(el.textContent || '{}') || {}
1107    } catch (e) {
1108      window.__pagefly_heatmap_config__ = {}
1109    }
1110  })()
1111</script>
vendor: 1 bytes, line 1111
1111
1112<script>
1113  // Heatmap overlay loader. Three gates, all of them cheap, none of them trusting the URL:
1114  // the visitor must have arrived on a pf_heatmap link, the SERVER must have published an
1115  // overlay path in the metafield, and this page must already be one the merchant enabled
1116  // tracking for. The last gate is what stops a crafted link pulling the asset onto an
1117  // arbitrary storefront page. Everything else is decided inside the asset, and by the server.
1118  (function () {
1119    var cfg = window.__pagefly_heatmap_config__ || {}
1120    var id = (window.__pagefly_page_setting__ || {}).pageId
1121    if (!/[#&]pf_heatmap=/.test(window.location.hash || '')) return
1122    if (!cfg.overlay_data_path || !Array.isArray(cfg.enabled_page_ids)) return
1123    if (!id || cfg.enabled_page_ids.indexOf(id) === -1) return
1124    var s = document.createElement('script')
1125    s.src = 'https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-heatmap-overlay.js'
1126    s.defer = true
1127    document.head.appendChild(s)
1128  })()
1129</script>
1129
1130
1131<!-- BEGIN app snippet: pf-ai-schema -->
1132<!-- END app snippet -->
1133
1134
1135<!-- END app block --><!-- BEGIN app block: shopify://apps/crisp-live-chat-chatbot/blocks/app-embed/5c3cfd5f-01d4-496a-891b-f98ecf27ff08 -->
1135<script>
1136  if ("7e1928bf-65c7-4e39-b25d-5b53b428d2b3") {
1137    let _locale = "";
1138
1139    window.CRISP_READY_TRIGGER = function () {
1140      window.CRISP_SESSION_ID = $crisp.get("session:identifier");
1141      postCart();
1142      postCustomerID();
1143
1144      // Set session segment (only after first message is sent)
1145      $crisp.push(["on", "message:sent", () => {
1146        $crisp.push(["set", "session:segments", [["shopify"]]]);
1147        $crisp.push(["off", "message:sent"]);
1148      }])
1149    };
1150
1151    if (window?.Weglot?.getCurrentLang && typeof(typeof(Weglot?.getCurrentLang) === "function")) {
1152      _locale = Weglot?.getCurrentLang();
1153    } else if (Shopify?.locale) {
1154      _locale = Shopify.locale;
1155    }
1156
1157    if (_locale) {
1158      CRISP_RUNTIME_CONFIG = {
1159        locale : _locale
1160      };
1161    }
1162
1163    window.$crisp=[];
1164    window.CRISP_WEBSITE_ID="7e1928bf-65c7-4e39-b25d-5b53b428d2b3";
1165    (function(){d=document;s=d.createElement("script");
1166      s.src="https://client.crisp.chat/l.js";
1167      s.async=1;
1168      d.getElementsByTagName("head")[0].appendChild(s);
1169    })();
1170  }
1171</script>
1171
1172
1173<!-- END app block --><!-- BEGIN app block: shopify://apps/elevar-conversion-tracking/blocks/dataLayerEmbed/bc30ab68-b15c-4311-811f-8ef485877ad6 -->
1174
1175
1176
1177<script type="module" dynamic>
1178  const configUrl = "/a/elevar/static/configs/2b6de5be4eac7c6181eceea5742003305d682126/config.js";
1179  const config = (await import(configUrl)).default;
1180  const scriptUrl = config.script_src_app_theme_embed;
1181
1182  if (scriptUrl) {
1183    const { handler } = await import(scriptUrl);
1184
1185    await handler(
1186      config,
1187      {
1188        cartData: {
1189  marketId: "85754102",
1190  localeCountryCode:"US",
1191  attributes:{},
1192  cartTotal: "0.0",
1193  currencyCode:"USD",
1194  items: []
1195}
1196,
1197        user: {
1198  cartTotal: "0.0",
1199  currencyCode:"USD",
1200  customer: {},
1201}
1202,
1203        isOnCartPage:true,
1204        collectionView:null,
1205        searchResultsView:null,
1206        productView:null,
1207      }
1208    );
1209  }
1210</script>
1210
1211
1212
1213<!-- END app block -->
1213<script src="https://cdn.shopify.com/extensions/019b03f2-1cc6-73dd-a349-2821a944dacf/crisp-chatbox-14/assets/crisp.js" type="text/javascript" defer="defer"></script>
1213
1214<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
1215<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 13094256699,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "cart"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 1215
1215
1216<script>
1217  window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || [];
1218</script>
vendor: 1 bytes, line 1218
1218
1219<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,t=/bytedance/i;function i(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var t=0,i=e.split(";");t<i.length;t++){var n=i[t],r=n.indexOf("=");if(-1!==r){var o=n.slice(0,r).trim();if(o){var a=void 0;try{a=decodeURIComponent(o)}catch(e){a=o}if("_shopify_s"===a){var d=n.slice(r+1).trim();try{return decodeURIComponent(d)}catch(e){return d}}}}}return}catch(e){return}}function n(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}function r(e,t){return"string"==typeof e&&e.length>0&&e.length<=t?e:void 0}function o(e){var t;switch(null==(t=null==e?void 0:e.navigation)?void 0:t.type){case 0:return"navigate";case 1:return"reload";case 2:return"back_forward";default:return}}function a(){var e,t,i;try{var n=null==(i=null==(t=null==(e=self.ShopifyAnalytics)?void 0:e.lib)?void 0:t.trekkie)?void 0:i.state;return"awaiting-consent"===n||"initialized"===n?n:void 0}catch(e){return}}return function(d,s,u,l){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};try{var p=c.trekkieShim;!0!==p&&"true"!==p||null!=window.__TREKKIE_SHIM_QUEUE||(window.__TREKKIE_SHIM_QUEUE=[])}catch(e){}var f,v,h,y,g=(v=(f={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,h=f.legacy,(y=navigator.userAgent).match(e)?"bot":y.match(v)?"modern":y.match(h)?"legacy":y.match(t)?"bot":"unknown"),m=function(e){var t,i,n=r(e,128);try{var a=window.performance,d=null==(t=null==a?void 0:a.getEntriesByType)?void 0:t.call(a,"navigation")[0];if(!d)return{requestId:n,navigationType:o(a)};var s="type"in d?r(d.type,64):void 0,u="serverTiming"in d&&Array.isArray(d.serverTiming)?d.serverTiming:[];return{requestId:null!=n?n:r(null==(i=u.find(function(e){return"requestID"===e.name}))?void 0:i.description,128),navigationType:s}}catch(e){return{requestId:n}}}(c.requestId),w=function(e){var t=e.version,r=e.browserTarget,o=e.surface,a=e.shopId,d=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var u=e.status,l=e.errorMsg,c=e.failureReason,p=e.useKeepaliveFallback,f=void 0!==p&&p,v=e.navigationType,h=e.pagehidePersisted,y=e.requestId,g=e.trekkieState;if(d){var m,w;try{var b=(new Date).getTime();m=JSON.stringify({metadata:{event_sent_at_ms:b},events:[{schema_id:"web_pixels_manager_load/3.3",payload:{version:t,bundle_target:r,page_url:s,status:u,surface:o,error_msg:l,failure_reason:c,navigation_type:v,pagehide_persisted:h,request_id:y,trekkie_state:g,shop_id:a,visit_token:i()},metadata:{event_created_at_ms:b}}]})}catch(e){return}try{if("function"==typeof window.navigator.sendBeacon&&-1===(w=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===w.indexOf("iPad; CPU OS 12_")&&-1===w.indexOf("iPod touch; CPU iPhone OS 12_")&&window.navigator.sendBeacon.bind(window.navigator)(d,m))return}catch(e){}if(f)try{"function"==typeof window.fetch&&window.fetch(d,{method:"POST",headers:{"Content-Type":"text/plain"},body:m,keepalive:!0}
1219).catch(function(){})}catch(e){}else try{var _=new XMLHttpRequest;_.open("POST",d,!0),_.setRequestHeader("Content-Type","text/plain"),_.send(m)}catch(e){n("[Web Pixels Manager] Got an unhandled error while logging to Monorail.")}}else n("[Web Pixels Manager] No Monorail endpoint provided, skipping logging.")}}}({version:u,browserTarget:g,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});if(Boolean(null==(_=null==(b=window.Shopify)?void 0:b.analytics)?void 0:_.replayQueue))w.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var b,_;w.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var S=window.Shopify;S.analytics=S.analytics||{};var P=S.analytics;P.replayQueue=[],P.publish=function(e,t,i){return P.replayQueue.push([e,t,i]),!0};try{self.performance.mark("wpm:start")}catch(e){}var k,C="modern"===g?"modern":"legacy",E=(null!=l?l:{modern:"",legacy:""})[C],I=[(k={baseUrl:s,hashVersion:u,buildTarget:C}).baseUrl,"/wpm","/b",k.hashVersion,"modern"===k.buildTarget?"m":"l",".js"].join(""),O=!1,T=!1;try{c.browserTarget=g,function(){O=!0;try{window.addEventListener("pagehide",M)}catch(e){O=!1}}(),R(function(){try{R(x)}catch(e){D(e)}}),w.emit({status:"loading",requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()})}catch(e){D(e)}}function U(){var e;if(q(),!function(){var e,t;return Boolean(null==(t=null==(e=window.Shopify)?void 0:e.analytics)?void 0:t.initialized)}()){var t,i,n;try{if("function"!=typeof(null==(e=window.webPixelsManager)?void 0:e.init))return void A();if(!(null!==(n=i=t=window.webPixelsManager.init(d))&&"function"!=typeof n&&Object(n)===n&&"publish"in i&&"function"==typeof i.publish&&"publishCustomEvent"in i&&"function"==typeof i.publishCustomEvent&&"visitor"in i&&"function"==typeof i.visitor))return void A()}catch(e){return void A(e)}var r=window.Shopify.analytics;r.replayQueue.forEach(function(e){var i=e[0],n=e[1],r=e[2];t.publishCustomEvent(i,n,r)}),r.replayQueue=[],r.publish=t.publishCustomEvent,r.visitor=t.visitor,r.initialized=!0}}function A(e){B("manager_api_unavailable",void 0===e?void 0:Q(e))}function x(){B("script_load_failed","".concat(I," has failed to load"))}function B(e,t){T||(T=!0,q(),w.emit({status:"failed",errorMsg:t,failureReason:e,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function M(e){O&&(q(),w.emit({status:"pagehide-while-loading",useKeepaliveFallback:!0,pagehidePersisted:e.persisted,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function q(){O=!1;try{window.removeEventListener("pagehide",M)}catch(e){}}function R(e){var t;!function(e){var t=e.src,i=e.async,n=void 0===i||i,r=e.onload,o=e.onerror,a=e.sri,d=e.scriptDataAttributes,s=void 0===d?{}:d,u=document.createElement("script"),l=document.querySelector("head"),c=document.querySelector("body");if(u.async=n,u.src=t,a&&(u.integrity=a,u.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{u.dataset[p]=String(s[p])}catch(e){}if(r&&u.addEventListener("load",r),o&&u.addEventListener("error",o),l)l.appendChild(u);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(u)}}({src:I,async:!0,onload:U,onerror:e,sri:(t=E,"string"==typeof t&&/^sha384-[A-Za-z0-9+/=]+$/.test(t)?E:""),scriptDataAttributes:c})}function D(e){B("script_append_failed",Q(e))}function Q(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 13094256699,storefrontBaseUrl: "https://dreamcatchers.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://dreamcatchers.com/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["16072cab","8450a54b"],webPixelsConfigList: [{"id":"1959624950","configuration":"{\"projectId\":\"utbu58j1ae\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"d8a2bb2ccbb513dc8e8b6937f4b8033e","type":"APP","apiClientId":240074326017,"privacyPurposes":[],"capabilities":["advanced_dom_events"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]}
1219,"dataSharingState":"unrestricted"},{"id":"1945305334","configuration":"{\"shop\":\"sm-dream.myshopify.com\", \"shopliftUrl\":\"https:\/\/events.shoplift.ai\/api\/events\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"dabcda9558be25394b12ce3ce899568b","type":"APP","apiClientId":7521861633,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"1780678902","configuration":"{\"shopId\":\"sm-dream.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"7093dff47f098f6de2afb75b62011ebe","type":"APP","apiClientId":2753413,"privacyPurposes":["ANALYTICS","MARKETING"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"1680244982","configuration":"{\"appProxyPath\":\"\/apps\/pagefly\",\"analyticsEndpoint\":\"undefined\/analytics-v2\/events\",\"focusDuration\":\"3\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"cc510d1a3167776ef03f2a6c403db7ae","type":"APP","apiClientId":1743893,"privacyPurposes":["ANALYTICS","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"1629192438","configuration":"{\"pixelCode\":\"D4P0QGRC77U162S62MI0\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"22e92c2ad45662f435e4801458fb78cc","type":"APP","apiClientId":4383523,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"1575911670","configuration":"{\"accountID\":\"M9YDBm\",\"webPixelConfig\":\"eyJlbmFibGVBZGRlZFRvQ2FydEV2ZW50cyI6IHRydWV9\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"c63c5b72c8d77be5f2d27d14c081da38","type":"APP","apiClientId":123074,"privacyPurposes":["ANALYTICS","MARKETING"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"833487094","configuration":"{\"config_url\": \"https:\/\/shopify-gtm-suite.getelevar.com\/configs\/2b6de5be4eac7c6181eceea5742003305d682126\/config.js\"}","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"7ae63d00911d5ee26809bf1e3232d852","type":"APP","apiClientId":2509311,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"96338166","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":[],"name":"Elevar - Checkout Tracking"},{"id":"124485878","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"2","type":"CUSTOM","privacyPurposes":[],"name":"ThoughtMetric"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"DreamCatchers Hair Extensions","paymentSettings":{"currencyCode":"USD"},"myshopifyDomain":"sm-dream.myshopify.com","countryCode":"US","storefrontUrl":"https:\/\/dreamcatchers.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[{"id":"6775689052310","handle":"k-tip-20-straight","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869155049622","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6775739121814","handle":"k-tip-20-wavy","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869308633238","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6690747842710","handle":"drawing-board","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42042681786614","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7444269662454","handle":"heat-shield-protectors","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42043016380662","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8460776767734","handle":"k-tip-heat-tool","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"46270905450742","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8983408247030","handle":"dc-crown-n-glory","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47852587581686","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6775789093014","handle":"weft-20-straight","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869475979414","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6775816650902","handle":"weft-20-wavy","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869542891670","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6775828086934","handle":"weft-24-straight","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869579460758","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6775843881110","handle":"weft-24-wavy","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869615472790","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6944976928918","handle":"pop-release-tool","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42042678509814","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6893267681430","handle":"weft-cylinders","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"40183881367702","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7952901013750","handle":"weft-cylinder-tower","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"44835285827830","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6893106331798","handle":"dreamcatchers-nylon-thread","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"40183558144150","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8891442954486","handle":"i-tip-20-inch-straight-100-full-cut
1219icle-hair-extensions-full-point","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47434805018870","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8891462222070","handle":"i-tip-20-inch-wavy-100-full-cuticle-hair-extensions-full-point","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47434842308854","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8891438924022","handle":"i-tip-20-inch-straight-100-full-cuticle-hair-extensions-half-point","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47434786341110","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8891472937206","handle":"i-tip-20-inch-wavy-100-full-cuticle-hair-extensions-half-point","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47434861150454","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6772712964246","handle":"i-tip-24-straight","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39861460893846","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6772719583382","handle":"i-tip-24-wavy","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39861475803286","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296384618555","handle":"i-tip-hair-cylinders","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230419836987","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296386945083","handle":"i-tip-cylinder-tower","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230426226747","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6772894761110","handle":"tape-20-straight","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39861717565590","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6772900626582","handle":"tape-20-wavy","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39861734375574","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296388911163","handle":"dreamcatchers-tape-release","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230432124987","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2001849811003","handle":"dreamcatchers-tape-cleanser","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"19754124640315","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296387567675","handle":"double-sided-tape-tabs","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230427340859","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"4339725205563","handle":"single-sided-tape-tabs","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"31120587620411","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8049201414390","handle":"l-shaped-press-tool","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"45222401704182","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2001891295291","handle":"dc-color-swatch","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230435631163","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296391041083","handle":"i-tip-cylinder-threader","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230441300027","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296391335995","handle":"dreamcatchers-toolkit","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230441627707","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296391827515","handle":"dreamcatchers-comb","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230442872891","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296392220731","handle":"clip-catchers","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230443659323","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7944981774582","handle":"dc-blending-razor-comb","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"44780823150838","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"4313316589627","handle":"dreamcatchers-snaggle-twist","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"51162265846006","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"4604821831739","handle":"velcro-separators","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"32488255848507","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"4604823601211","handle":"dreamcatchers-selfie-stick","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"32488274034747","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9461058535670","handle":"ring-light-pop-socket","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"51264360841462","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8033966031094","handle":"dreamcatchers-insulated-water-bottle","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"45176963105014","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6711331684502","handle":"dreamcatchers-apron","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39724363055254","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6711335977110","handle":"dreamcatchers-cape","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39724376883350","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8842119807222","handle":"free-marketing-flyers","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47233519288566","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8870325977334","handle":"free-marketing-poster","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47342137901302","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8911784607990","handle":"flyers-refill","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47520248234230","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8460777554166","handle":"crimping-tool-1","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"46270910267638","
1219image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8460780044534","handle":"c-needle","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"46270928879862","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9400136466678","handle":"3-pack-wand-brush-1","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"50723966812406","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9400138137846","handle":"removal-solution-1","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"50723973595382","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9400138924278","handle":"blue-light-heat-shields-1","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"50723976184054","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9400136827126","handle":"uv-glue-clear-20g","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"50723967795446","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9400136794358","handle":"uv-glue-black-20g","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"50723967762678","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597127926006","handle":"5x11-pop-up-star-struck-silver500ct","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735447048438","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597130973430","handle":"dreamweaver-comb-set-pastel","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735496528118","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597140377846","handle":"pink-paws-nitrile-gloves-medium-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735724757238","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597126713590","handle":"color-killer-wipes","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735399502070","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597119701238","handle":"5x11-pop-up-party-animal-500-sheets","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735357919478","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597120061686","handle":"backward-bibs","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735360311542","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597117833462","handle":"embossed-roll-medium-star-stuck-silver-330-ft","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735345139958","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597119373558","handle":"5x11-pop-up-etheral-500ct","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735356281078","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]}
1219,{"id":"7597129990390","handle":"big-daddy-brush-set","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735487877366","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597117276406","handle":"big-poppa-pop-ups-star-struck-silver-250-sheets","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735314305270","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597137625334","handle":"classic-color-brush","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735629664502","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597127303414","handle":"myst-assist-pink","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735419916534","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597118849270","handle":"5x11-pop-up-rose-all-day500ct","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735353495798","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597134086390","handle":"pink-paws-nitrile-gloves-small-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735552561398","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597129597174","handle":"family-pack-brush-set","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735484371190","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597130252534","handle":"power-painter-brush-set","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735489057014","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597121994998","handle":"dye-defender-100ml","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735372402934","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597137887478","handle":"midnight-mitts-nitrile-gloves-medium-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735637823734","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597122814198","handle":"2-pack-coloring-color-bowls-black-clear","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735379710198","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597130449142","handle":"gator-grips-pink4pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735493513462","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597137527030","handle":"pink-paws-nitrile-gloves-large-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735627075830","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597130711286","handle":"gator-grips-black4pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735495643382","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597131137270","handle":"midnight-mitts-nitrile-gloves-small-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735497183478","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597133398262","handle":"midnight-mitts-nitrile-gloves-large-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735526543606","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9109438202102","handle":"dreamluxe-toppers","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"48666901381366","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]}],"purchasingCompany":null},},"https://dreamcatchers.com/cdn","c8540278we853e1abpb62b2c4amde256306",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"false","themeId":"157360161014","themePublished":"true","eventMetadataId":"076793f2-1666-4f98-b8fe-b87ad4e41e14","pageType":"cart","shopId":"13094256699","storefrontBaseUrl":"https:\/\/dreamcatchers.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"16072cab\", \"8450a54b\"]","isMerchantRequest":"false","hashVersion":"c8540278we853e1abpb62b2c4amde256306","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
1219<script>
1220  window.ShopifyAnalytics = window.ShopifyAnalytics || {};
1221  window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {};
1222  window.ShopifyAnalytics.meta.currency = 'USD';
1223  var meta = {"page":{"pageType":"cart","requestId":"89fe3673-d7e6-4088-91b5-64cbdcef44a2-1790294590"}};
1224  for (var attr in meta) {
1225    window.ShopifyAnalytics.meta[attr] = meta[attr];
1226  }
1227</script>
vendor: 1 bytes, line 1227
1227
1228<script class="analytics">
1229  (function () {
1230    var customDocumentWrite = function(content) {
1231      var jquery = null;
1232
1233      if (window.jQuery) {
1234        jquery = window.jQuery;
1235      } else if (window.Checkout && window.Checkout.$) {
1236        jquery = window.Checkout.$;
1237      }
1238
1239      if (jquery) {
1240        jquery('body').append(content);
1241      }
1242    };
1243
1244    var hasLoggedConversion = function(token) {
1245      if (token) {
1246        return document.cookie.indexOf('loggedConversion=' + token) !== -1;
1247      }
1248      return false;
1249    }
1250
1251    var setCookieIfConversion = function(token) {
1252      if (token) {
1253        var twoMonthsFromNow = new Date(Date.now());
1254        twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2);
1255
1256        document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow;
1257      }
1258    }
1259
1260    var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || [];
1261    window.ShopifyAnalytics.lib.trekkie = window.trekkie;
1262    if (trekkie.integrations) {
1263      return;
1264    }
1265    trekkie.methods = [
1266      'identify',
1267      'page',
1268      'ready',
1269      'track',
1270      'trackForm',
1271      'trackLink'
1272    ];
1273    trekkie.factory = function(method) {
1274      return function() {
1275        var args = Array.prototype.slice.call(arguments);
1276        args.unshift(method);
1277        trekkie.push(args);
1278        if (method == 'track' || method == 'page') {
1279          var pageUrl;
1280          try {
1281            pageUrl = window.location.href;
1282          } catch (e) {}
1283          var pageReferrer;
1284          try {
1285            pageReferrer = document.referrer;
1286          } catch (e) {}
1287          try {
1288            if (window.__TREKKIE_SHIM_QUEUE == null) {
1289              window.__TREKKIE_SHIM_QUEUE = [];
1290            }
1291            window.__TREKKIE_SHIM_QUEUE.push({
1292              from: 'trekkie-stub',
1293              method: method,
1294              args: args.slice(1),
1295              pageContext: {
1296                url: pageUrl,
1297                referrer: pageReferrer
1298              }
1299            });
1300          } catch (e) {
1301            // no-op
1302          }
1303        }
1304        return trekkie;
1305      };
1306    };
1307    for (var i = 0; i < trekkie.methods.length; i++) {
1308      var key = trekkie.methods[i];
1309      trekkie[key] = trekkie.factory(key);
1310    }
1311    trekkie.load = function(config) {
1312      trekkie.config = config || {};
1313      trekkie.config.initialDocumentCookie = document.cookie;
1314      var first = document.getElementsByTagName('script')[0];
1315var script = document.createElement('script');
1316script.type = 'text/javascript';
1317script.onerror = function(e) {
1318  var scriptFallback = document.createElement('script');
1319  scriptFallback.type = 'text/javascript';
1320  scriptFallback.onerror = function(error) {
1321          var Monorail = {
1322      produce: function produce(monorailDomain, schemaId, payload) {
1323        var currentMs = new Date().getTime();
1324        var event = {
1325          schema_id: schemaId,
1326          payload: payload,
1327          metadata: {
1328            event_created_at_ms: currentMs,
1329            event_sent_at_ms: currentMs
1330          }
1331        };
1332        return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event));
1333      },
1334      sendRequest: function sendRequest(endpointUrl, payload) {
1335        // Try the sendBeacon API
1336        if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) {
1337          var blobData = new window.Blob([payload], {
1338            type: 'text/plain'
1339          });
1340
1341          if (window.navigator.sendBeacon(endpointUrl, blobData)) {
1342            return true;
1343          } // sendBeacon was not successful
1344
1345        } // XHR beacon
1346
1347        var xhr = new XMLHttpRequest();
1348
1349        try {
1350          xhr.open('POST', endpointUrl);
1351          xhr.setRequestHeader('Content-Type', 'text/plain');
1352          xhr.send(payload);
1353        } catch (e) {
1354          console.log(e);
1355        }
1356
1357        return false;
1358      },
1359      isIos12: function isIos12() {
1360        return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1;
1361      }
1362    };
1363    Monorail.produce('monorail-edge.shopifysvc.com',
1364      'trekkie_storefront_load_errors/1.1',
1365      {shop_id: 13094256699,
1366      theme_id: 157360161014,
1367      app_name: "storefront",
1368      context_url: window.location.href,
1369      source_url: "//dreamcatchers.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js"});
1370
1371  };
1372  scriptFallback.async = true;
1373  scriptFallback.src = '//dreamcatchers.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js';
1374  first.parentNode.insertBefore(scriptFallback, first);
1375};
1376script.async = true;
1377script.src = '//dreamcatchers.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js';
1378first.parentNode.insertBefore(script, first);
1379
1380    };
1381    trekkie.load(
1382      {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":13094256699,"isMerchantRequest":null,"themeId":157360161014,"themeCityHash":"5636356023363602709","contentLanguage":"en","currency":"USD","eventMetadataId":"076793f2-1666-4f98-b8fe-b87ad4e41e14"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":false,"source":"trekkie-storefront-renderer","apiClientId":580111}}
1383    );
1384
1385    var loaded = false;
1386    trekkie.ready(function() {
1387      if (loaded) return;
1388      loaded = true;
1389
1390      window.ShopifyAnalytics.lib = window.trekkie;
1391
1392      var originalDocumentWrite = document.write;
1393      document.write = customDocumentWrite;
1394      try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {};
1395      document.write = originalDocumentWrite;
1396
1397      var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/)
1398      var token = match? match[1]: undefined;
1399      if (!hasLoggedConversion(token)) {
1400        setCookieIfConversion(token);
1401        
1402      }
1403    });
1404
1405    window.ShopifyAnalytics.lib.page(null,{"pageType":"cart","requestId":"89fe3673-d7e6-4088-91b5-64cbdcef44a2-1790294590","shopifyEmitted":true});
1406
1407    var eventsListenerScript = document.createElement('script');
1408    eventsListenerScript.async = true;
1409    eventsListenerScript.src = "//dreamcatchers.com/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js";
1410    document.getElementsByTagName('head')[0].appendChild(eventsListenerScript);
1411})();</script>
1411
1412  
1412<script>
1413  if (!window.ga || (window.ga && typeof window.ga !== 'function')) {
1414    window.ga = function ga() {
1415      (window.ga.q = window.ga.q || []).push(arguments);
1416      if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') {
1417        window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"});
1418      }
1419      console.error("Shopify's Google Analytics stub called with:", Array.from(arguments), "\nSee https://help.shopify.com/manual/promoting-marketing/pixels/pixel-migration#google for more information.");
1420    };
1421    if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') {
1422      window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"});
1423    }
1424  }
1425</script>
vendor: 1 bytes, line 1425
1425
1426<script
1427  defer
1428  src="https://dreamcatchers.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js"
1429  data-application="storefront-renderer"
1430  data-shop-id="13094256699"
1431  data-render-region="gcp-us-central1"
1432  data-page-type="cart"
1433  data-theme-instance-id="157360161014"
1434  data-theme-name="Impulse"
1435  data-theme-version="8.1.0"
1436  data-monorail-region="shop_domain"
1437  data-resource-timing-sampling-rate="10"
1438  data-shs="true"
1439  data-shs-beacon="true"
1440  data-shs-export-with-fetch="true"
1441  data-shs-logs-sample-rate="1"
1442  data-shs-beacon-endpoint="https://dreamcatchers.com/api/collect"
1443></script>
1443
1444<meta name="shopify-y" content="71f8bc77-d83b-458b-be40-c872dc6fbe7b" data-expiration="1821852190000"><meta name="shopify-s" content="3bf95f92-776f-4cf2-a250-a464613a0917" data-expiration="1790296390000"><meta name="new-cookie-storage-activated" content="t">
1445</head>
1446
1447<body class="template-cart" data-center-text="true" data-button_style="square" data-type_header_capitalize="false" data-type_headers_align_text="true" data-type_product_capitalize="false" data-swatch_style="square" >
1448
1449  <a class="in-page-link visually-hidden skip-link" href="#MainContent">Skip to content</a>
1450
1451  
1452
1453  <div id="PageContainer" class="page-container page-">
1454    <div class="transition-body"><!-- BEGIN sections: header-group -->
1455<div id="shopify-section-sections--21273656393974__cart-drawer" class="shopify-section shopify-section-group-header-group"><div id="CartDrawer" class="drawer drawer--right">
1456    <form id="CartDrawerForm" action="/cart" method="post" novalidate class="drawer__contents" data-location="cart-drawer">
1457      <div class="drawer__fixed-header">
1458        <div class="drawer__header appear-animation appear-delay-1">
1459          <div class="h2 drawer__title">
1460            <span class="drawer__title-inner">
1461              <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-bag" viewBox="0 0 64 64"><g fill="none" stroke="#000" stroke-width="2"><path d="M25 26c0-15.79 3.57-20 8-20s8 4.21 8 20"></path><path d="M14.74 18h36.51l3.59 36.73h-43.7z"></path></g></svg>
1462              <span class="drawer__title-text">Your Cart</span>
1463              <span class="drawer__cart-count" data-cart-drawer-count aria-label="Cart">0</span>
1464            </span>
1465          </div>
1466          <div class="drawer__close">
1467            <button type="button" class="drawer__close-button js-drawer-close">
1468              <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg>
1469              <span class="icon__fallback-text">Close cart</span>
1470            </button>
1471          </div>
1472        </div>
1473      </div>
1474
1475      <div class="drawer__inner">
1476        <div class="drawer__scrollable">
1477          <div class="sm--wave-signature appear-animation appear-delay-2">
1478            <input type="checkbox" name="wave_signature" id="WaveSignature" >
1479            <label for="WaveSignature" class="sm--wave-disclaimer">
1480              <span class="sm--wave-disclaimer__title">Yes, I want to wave my delivery signature.</span>
1481              <span class="sm--wave-disclaimer__note">(Waving the signature releases us from liability of the package)</span>
1482            </label>
1483          </div>
1484
1485          <div data-products class="appear-animation appear-delay-2"></div>
1486
1487          
1488            <div class="appear-animation appear-delay-3">
1489              <label for="CartNoteDrawer">Order note</label>
1490              <textarea name="note" class="input-full cart-notes" id="CartNoteDrawer"></textarea>
1491            </div>
1492          
1493        </div>
1494
1495        <div class="drawer__footer appear-animation appear-delay-4">
1496          <div data-discounts>
1497            
1498          </div>
1499
1500          <div class="cart__item-sub cart__item-row cart__item--subtotal">
1501            <div class="ajaxcart__subtotal">Subtotal</div>
1502            <div data-subtotal>$0.00</div>
1503          </div>
1504
1505          <div class="cart__item-row cart__drawer-note">
1506            <small>
1507              Shipping, taxes, and discount codes calculated at checkout.<br />
1508            </small>
1509          </div>
1510
1511          
1512
1513          
1514
1515          <div class="cart__checkout-wrapper">
1516            <button type="submit" name="checkout" data-terms-required="false" class="btn cart__checkout">
1517              Check out
1518            </button>
1519
1520            
1521          </div>
1522        </div>
1523      </div>
1524
1525      <div class="drawer__cart-empty appear-animation appear-delay-2">
1526        <div class="drawer__scrollable">
1527          Your cart is currently empty.
1528        </div>
1529      </div>
1530    </form>
1531  </div></div><div id="shopify-section-sections--21273656393974__header" class="shopify-section shopify-section-group-header-group">
1532
1533<div id="NavDrawer" class="drawer drawer--left">
1534  <div class="drawer__contents">
1535    <div class="drawer__fixed-header">
1536      <div class="drawer__header appear-animation appear-delay-1">
1537        <div class="h2 drawer__title"><a
1538                  href="/"
1539                  class="drawer__logo-link"
1540                  style="width: 80px;">
1541
1542
1543
1544<image-element data-aos="image-fade-in" data-aos-offset="150">
1545
1546
1547  
1548<img src="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=160" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=80 80w, //dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=160 160w" width="80" height="33.56643356643357" loading="eager" class=" image-element" sizes="80px">
1549  
1550
1551
1552</image-element>
1553</a></div>
1554        <div class="drawer__close">
1555          <button type="button" class="drawer__close-button js-drawer-close">
1556            <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg>
1557            <span class="icon__fallback-text">Close menu</span>
1558          </button>
1559        </div>
1560      </div>
1561    </div>
1562    <div class="drawer__scrollable">
1563      <ul class="mobile-nav" role="navigation" aria-label="Primary"><li class="mobile-nav__item appear-animation appear-delay-2"><div class="mobile-nav__has-sublist"><a href="/pages/4-in-1-certification"
1564                    class="mobile-nav__link mobile-nav__link--top-level"
1565                    id="Label-pages-4-in-1-certification1"
1566                    >
1567                    Get Certified
1568                  </a>
1569                  <div class="mobile-nav__toggle">
1570                    <button type="button"
1571                      aria-controls="Linklist-pages-4-in-1-certification1"
1572                      aria-labelledby="Label-pages-4-in-1-certification1"
1573                      class="collapsible-trigger collapsible--auto-height"><span class="collapsible-trigger__icon collapsible-trigger__icon--open" role="presentation">
1574  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1575</span>
1576</button>
1577                  </div></div><div id="Linklist-pages-4-in-1-certification1"
1578                class="mobile-nav__sublist collapsible-content collapsible-content--all"
1579                >
1580                <div class="collapsible-content__inner">
1581                  <ul class="mobile-nav__sublist"><li class="mobile-nav__item">
1582                        <div class="mobile-nav__child-item"><a href="/collections/hands-on-trainings"
1583                              class="mobile-nav__link"
1584                              id="Sublabel-collections-hands-on-trainings1"
1585                              >
1586                              4-in-1 Hands-on Trainings
1587                            </a><button type="button"
1588                              aria-controls="Sublinklist-pages-4-in-1-certification1-collections-hands-on-trainings1"
1589                              aria-labelledby="Sublabel-collections-hands-on-trainings1"
1590                              class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation">
1591  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1592</span>
1593</button></div><div
1594                            id="Sublinklist-pages-4-in-1-certification1-collections-hands-on-trainings1"
1595                            aria-labelledby="Sublabel-collections-hands-on-trainings1"
1596                            class="mobile-nav__sublist collapsible-content collapsible-content--all"
1597                            >
1598                            <div class="collapsible-content__inner">
1599                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1600                                    <a href="/collections/hands-on-trainings" class="mobile-nav__link">
1601                                      View
1602                                    </a>
1603                                  </li></ul>
1604                            </div>
1605                          </div></li><li class="mobile-nav__item">
1606                        <div class="mobile-nav__child-item"><a href="/pages/4-in-1-certification"
1607                              class="mobile-nav__link"
1608                              id="Sublabel-pages-4-in-1-certification2"
1609                              >
1610                              4-in-1 Online Certification
1611                            </a><button type="button"
1612                              aria-controls="Sublinklist-pages-4-in-1-certification1-pages-4-in-1-certification2"
1613                              aria-labelledby="Sublabel-pages-4-in-1-certification2"
1614                              class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation">
1615  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewB
1615ox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1616</span>
1617</button></div><div
1618                            id="Sublinklist-pages-4-in-1-certification1-pages-4-in-1-certification2"
1619                            aria-labelledby="Sublabel-pages-4-in-1-certification2"
1620                            class="mobile-nav__sublist collapsible-content collapsible-content--all"
1621                            >
1622                            <div class="collapsible-content__inner">
1623                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1624                                    <a href="/pages/4-in-1-certification" class="mobile-nav__link">
1625                                      View
1626                                    </a>
1627                                  </li></ul>
1628                            </div>
1629                          </div></li><li class="mobile-nav__item">
1630                        <div class="mobile-nav__child-item"><a href="/pages/dreamlights"
1631                              class="mobile-nav__link"
1632                              id="Sublabel-pages-dreamlights3"
1633                              >
1634                              DreamLights 
1635                            </a><button type="button"
1636                              aria-controls="Sublinklist-pages-4-in-1-certification1-pages-dreamlights3"
1637                              aria-labelledby="Sublabel-pages-dreamlights3"
1638                              class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation">
1639  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1640</span>
1641</button></div><div
1642                            id="Sublinklist-pages-4-in-1-certification1-pages-dreamlights3"
1643                            aria-labelledby="Sublabel-pages-dreamlights3"
1644                            class="mobile-nav__sublist collapsible-content collapsible-content--all"
1645                            >
1646                            <div class="collapsible-content__inner">
1647                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1648                                    <a href="/pages/dreamlights" class="mobile-nav__link">
1649                                      View
1650                                    </a>
1651                                  </li></ul>
1652                            </div>
1653                          </div></li></ul>
1654                </div>
1655              </div></li><li class="mobile-nav__item appear-animation appear-delay-3"><div class="mobile-nav__has-sublist"><a href="/collections/all-products"
1656                    class="mobile-nav__link mobile-nav__link--top-level"
1657                    id="Label-collections-all-products2"
1658                    >
1659                    Shop
1660                  </a>
1661                  <div class="mobile-nav__toggle">
1662                    <button type="button"
1663                      aria-controls="Linklist-collections-all-products2"
1664                      aria-labelledby="Label-collections-all-products2"
1665                      class="collapsible-trigger collapsible--auto-height"><span class="collapsible-trigger__icon collapsible-trigger__icon--open" role="presentation">
1666  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1667</span>
1668</button>
1669                  </div></div><div id="Linklist-collections-all-products2"
1670                class="mobile-nav__sublist collapsible-content collapsible-content--all"
1671                >
1672                <div class="collapsible-content__inner">
1673                  <ul class="mobile-nav__sublist"><li class="mobile-nav__item">
1674                        <div class="mobile-nav__child-item"><a href="/collections/i-tip"
1675                              class="mobile-nav__link"
1676                              id="Sublabel-collections-i-tip1"
1677                              >
1678                              I-Tip
1679                            </a><button type="button"
1680                              aria-controls="Sublinklist-collections-all-products2-collections-i-tip1"
1681                              aria-labelledby="Sublabel-collections-i-tip1"
1682                              class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation">
1683  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewB
1683ox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1684</span>
1685</button></div><div
1686                            id="Sublinklist-collections-all-products2-collections-i-tip1"
1687                            aria-labelledby="Sublabel-collections-i-tip1"
1688                            class="mobile-nav__sublist collapsible-content collapsible-content--all"
1689                            >
1690                            <div class="collapsible-content__inner">
1691                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1692                                    <a href="/collections/i-tip" class="mobile-nav__link">
1693                                      View
1694                                    </a>
1695                                  </li></ul>
1696                            </div>
1697                          </div></li><li class="mobile-nav__item">
1698                        <div class="mobile-nav__child-item"><a href="/collections/weft"
1699                              class="mobile-nav__link"
1700                              id="Sublabel-collections-weft2"
1701                              >
1702                              Weft
1703                            </a><button type="button"
1704                              aria-controls="Sublinklist-collections-all-products2-collections-weft2"
1705                              aria-labelledby="Sublabel-collections-weft2"
1706                              class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation">
1707  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1708</span>
1709</button></div><div
1710                            id="Sublinklist-collections-all-products2-collections-weft2"
1711                            aria-labelledby="Sublabel-collections-weft2"
1712                            class="mobile-nav__sublist collapsible-content collapsible-content--all"
1713                            >
1714                            <div class="collapsible-content__inner">
1715                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1716                                    <a href="/collections/weft" class="mobile-nav__link">
1717                                      View
1718                                    </a>
1719                                  </li></ul>
1720                            </div>
1721                          </div></li><li class="mobile-nav__item">
1722                        <div class="mobile-nav__child-item"><a href="/collections/k-tip"
1723                              class="mobile-nav__link"
1724                              id="Sublabel-collections-k-tip3"
1725                              >
1726                              K-Tip
1727                            </a><button type="button"
1728                              aria-controls="Sublinklist-collections-all-products2-collections-k-tip3"
1729                              aria-labelledby="Sublabel-collections-k-tip3"
1730                              class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation">
1731  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1732</span>
1733</button></div><div
1734                            id="Sublinklist-collections-all-products2-collections-k-tip3"
1735                            aria-labelledby="Sublabel-collections-k-tip3"
1736                            class="mobile-nav__sublist collapsible-content collapsible-content--all"
1737                            >
1738                            <div class="collapsible-content__inner">
1739                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1740                                    <a href="/collections/k-tip" class="mobile-nav__link">
1741                                      View
1742                                    </a>
1743                                  </li></ul>
1744                            </div>
1745                          </div></li><li class="mobile-nav__item">
1746                        <div class="mobile-nav__child-item"><a href="/collections/tape-in"
1747                              class="mobile-nav__link"
1748                              id="Sublabel-collections-tape-in4"
1749                              >
1750                              Tape In
1751                            </a><button type="button"
1752                              aria-controls="Sublinklist-collections-all-products2-collections-tape-in4"
1753                              aria-labelledby="Sublabel-collections-tape-in4"
1754                              class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation">
1755  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewB
1755ox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1756</span>
1757</button></div><div
1758                            id="Sublinklist-collections-all-products2-collections-tape-in4"
1759                            aria-labelledby="Sublabel-collections-tape-in4"
1760                            class="mobile-nav__sublist collapsible-content collapsible-content--all"
1761                            >
1762                            <div class="collapsible-content__inner">
1763                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1764                                    <a href="/collections/tape-in" class="mobile-nav__link">
1765                                      View
1766                                    </a>
1767                                  </li></ul>
1768                            </div>
1769                          </div></li><li class="mobile-nav__item">
1770                        <div class="mobile-nav__child-item"><a href="/pages/toppers-landing-page"
1771                              class="mobile-nav__link"
1772                              id="Sublabel-collections-dreamluxe-toppers5"
1773                              >
1774                              Toppers
1775                            </a><button type="button"
1776                              aria-controls="Sublinklist-collections-all-products2-collections-dreamluxe-toppers5"
1777                              aria-labelledby="Sublabel-collections-dreamluxe-toppers5"
1778                              class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation">
1779  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1780</span>
1781</button></div><div
1782                            id="Sublinklist-collections-all-products2-collections-dreamluxe-toppers5"
1783                            aria-labelledby="Sublabel-collections-dreamluxe-toppers5"
1784                            class="mobile-nav__sublist collapsible-content collapsible-content--all"
1785                            >
1786                            <div class="collapsible-content__inner">
1787                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1788                                    <a href="/pages/toppers-landing-page" class="mobile-nav__link">
1789                                      View 
1790                                    </a>
1791                                  </li></ul>
1792                            </div>
1793                          </div></li><li class="mobile-nav__item">
1794                        <div class="mobile-nav__child-item"><a href="/collections/accessories"
1795                              class="mobile-nav__link"
1796                              id="Sublabel-collections-accessories6"
1797                              >
1798                              Accessories
1799                            </a><button type="button"
1800                              aria-controls="Sublinklist-collections-all-products2-collections-accessories6"
1801                              aria-labelledby="Sublabel-collections-accessories6"
1802                              class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation">
1803  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1804</span>
1805</button></div><div
1806                            id="Sublinklist-collections-all-products2-collections-accessories6"
1807                            aria-labelledby="Sublabel-collections-accessories6"
1808                            class="mobile-nav__sublist collapsible-content collapsible-content--all"
1809                            >
1810                            <div class="collapsible-content__inner">
1811                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1812                                    <a href="/collections/accessories" class="mobile-nav__link">
1813                                      View
1814                                    </a>
1815                                  </li></ul>
1816                            </div>
1817                          </div></li><li class="mobile-nav__item">
1818                        <div class="mobile-nav__child-item"><a href="/collections/framar"
1819                              class="mobile-nav__link"
1820                              id="Sublabel-collections-framar7"
1821                              >
1822                              Framar
1823                            </a><button type="button"
1824                              aria-controls="Sublinklist-collections-all-products2-collections-framar7"
1825                              aria-labelledby="Sublabel-collections-framar7"
1826                              class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation">
1827  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewB
1827ox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1828</span>
1829</button></div><div
1830                            id="Sublinklist-collections-all-products2-collections-framar7"
1831                            aria-labelledby="Sublabel-collections-framar7"
1832                            class="mobile-nav__sublist collapsible-content collapsible-content--all"
1833                            >
1834                            <div class="collapsible-content__inner">
1835                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1836                                    <a href="/collections/framar" class="mobile-nav__link">
1837                                      View
1838                                    </a>
1839                                  </li></ul>
1840                            </div>
1841                          </div></li></ul>
1842                </div>
1843              </div></li><li class="mobile-nav__item appear-animation appear-delay-4"><div class="mobile-nav__has-sublist"><button type="button"
1844                    aria-controls="Linklist-3"
1845                    class="mobile-nav__link--button mobile-nav__link--top-level collapsible-trigger collapsible--auto-height">
1846                    <span class="mobile-nav__faux-link">
1847                      About The Hair
1848                    </span>
1849                    <div class="mobile-nav__toggle">
1850                      <span class="faux-button"><span class="collapsible-trigger__icon collapsible-trigger__icon--open" role="presentation">
1851  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1852</span>
1853</span>
1854                    </div>
1855                  </button></div><div id="Linklist-3"
1856                class="mobile-nav__sublist collapsible-content collapsible-content--all"
1857                >
1858                <div class="collapsible-content__inner">
1859                  <ul class="mobile-nav__sublist"><li class="mobile-nav__item">
1860                        <div class="mobile-nav__child-item"><a href="/pages/dreamcatchers"
1861                              class="mobile-nav__link"
1862                              id="Sublabel-pages-dreamcatchers1"
1863                              >
1864                              About DreamCatchers
1865                            </a></div></li><li class="mobile-nav__item">
1866                        <div class="mobile-nav__child-item"><a href="/pages/production-process"
1867                              class="mobile-nav__link"
1868                              id="Sublabel-pages-production-process2"
1869                              >
1870                              Production Process
1871                            </a></div></li><li class="mobile-nav__item">
1872                        <div class="mobile-nav__child-item"><a href="/pages/color-styles"
1873                              class="mobile-nav__link"
1874                              id="Sublabel-pages-color-styles3"
1875                              >
1876                              Colors &amp; Styles
1877                            </a></div></li><li class="mobile-nav__item">
1878                        <div class="mobile-nav__child-item"><a href="/apps/help-center"
1879                              class="mobile-nav__link"
1880                              id="Sublabel-apps-help-center4"
1881                              >
1882                              FAQ’s
1883                            </a></div></li></ul>
1884                </div>
1885              </div></li><li class="mobile-nav__item appear-animation appear-delay-5"><a href="https://portal.dreamcatchers.com/" class="mobile-nav__link mobile-nav__link--top-level">Education Hub</a></li><li class="mobile-nav__item appear-animation appear-delay-6"><a href="/pages/yotpo-reviews" class="mobile-nav__link mobile-nav__link--top-level">Reviews</a></li><li class="mobile-nav__item appear-animation appear-delay-7"><a href="/blogs/dreamcatchers-hair-blog" class="mobile-nav__link mobile-nav__link--top-level">Blog</a></li><li class="mobile-nav__item appear-animation appear-delay-8"><a href="https://dreamcatchers.com/pages/dc-media-library" class="mobile-nav__link mobile-nav__link--top-level">DC Media Library</a></li><li class="mobile-nav__item mobile-nav__item--secondary">
1886            <div class="grid"><div class="grid__item one-half appear-animation appear-delay-9">
1887                  <a href="/account" class="mobile-nav__link">Log in
1888</a>
1889                </div></div>
1890          </li></ul><div class="mobile-nav__phone appear-animation appear-delay-10">
1891        <a href="tel:1-855-373-2683">1-855-373-2683</a>
1892      </div><ul class="mobile-nav__social appear-animation appear-delay-11">
1892<li class="mobile-nav__social-item">
1893            <a target="_blank" rel="noopener" href="https://www.instagram.com/dreamcatchershair/" title="DreamCatchers Hair Extensions on Instagram">
1894              <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-instagram" viewBox="0 0 32 32"><title>instagram</title><path fill="#444" d="M16 3.094c4.206 0 4.7.019 6.363.094 1.538.069 2.369.325 2.925.544.738.287 1.262.625 1.813 1.175s.894 1.075 1.175 1.813c.212.556.475 1.387.544 2.925.075 1.662.094 2.156.094 6.363s-.019 4.7-.094 6.363c-.069 1.538-.325 2.369-.544 2.925-.288.738-.625 1.262-1.175 1.813s-1.075.894-1.813 1.175c-.556.212-1.387.475-2.925.544-1.663.075-2.156.094-6.363.094s-4.7-.019-6.363-.094c-1.537-.069-2.369-.325-2.925-.544-.737-.288-1.263-.625-1.813-1.175s-.894-1.075-1.175-1.813c-.212-.556-.475-1.387-.544-2.925-.075-1.663-.094-2.156-.094-6.363s.019-4.7.094-6.363c.069-1.537.325-2.369.544-2.925.287-.737.625-1.263 1.175-1.813s1.075-.894 1.813-1.175c.556-.212 1.388-.475 2.925-.544 1.662-.081 2.156-.094 6.363-.094zm0-2.838c-4.275 0-4.813.019-6.494.094-1.675.075-2.819.344-3.819.731-1.037.4-1.913.944-2.788 1.819S1.486 4.656 1.08 5.688c-.387 1-.656 2.144-.731 3.825-.075 1.675-.094 2.213-.094 6.488s.019 4.813.094 6.494c.075 1.675.344 2.819.731 3.825.4 1.038.944 1.913 1.819 2.788s1.756 1.413 2.788 1.819c1 .387 2.144.656 3.825.731s2.213.094 6.494.094 4.813-.019 6.494-.094c1.675-.075 2.819-.344 3.825-.731 1.038-.4 1.913-.944 2.788-1.819s1.413-1.756 1.819-2.788c.387-1 .656-2.144.731-3.825s.094-2.212.094-6.494-.019-4.813-.094-6.494c-.075-1.675-.344-2.819-.731-3.825-.4-1.038-.944-1.913-1.819-2.788s-1.756-1.413-2.788-1.819c-1-.387-2.144-.656-3.825-.731C20.812.275 20.275.256 16 .256z"/><path fill="#444" d="M16 7.912a8.088 8.088 0 0 0 0 16.175c4.463 0 8.087-3.625 8.087-8.088s-3.625-8.088-8.088-8.088zm0 13.338a5.25 5.25 0 1 1 0-10.5 5.25 5.25 0 1 1 0 10.5zM26.294 7.594a1.887 1.887 0 1 1-3.774.002 1.887 1.887 0 0 1 3.774-.003z"/></svg>
1895              <span class="icon__fallback-text">Instagram</span>
1896            </a>
1897          </li><li class="mobile-nav__social-item">
1898            <a target="_blank" rel="noopener" href="https://www.facebook.com/dreamcatchersHair" title="DreamCatchers Hair Extensions on Facebook">
1899              <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-facebook" viewBox="0 0 14222 14222"><path d="M14222 7112c0 3549.352-2600.418 6491.344-6000 7024.72V9168h1657l315-2056H8222V5778c0-562 275-1111 1159-1111h897V2917s-814-139-1592-139c-1624 0-2686 984-2686 2767v1567H4194v2056h1806v4968.72C2600.418 13603.344 0 10661.352 0 7112 0 3184.703 3183.703 1 7111 1s7111 3183.703 7111 7111Zm-8222 7025c362 57 733 86 1111 86-377.945 0-749.003-29.485-1111-86.28Zm2222 0v-.28a7107.458 7107.458 0 0 1-167.717 24.267A7407.158 7407.158 0 0 0 8222 14137Zm-167.717 23.987C7745.664 14201.89 7430.797 14223 7111 14223c319.843 0 634.675-21.479 943.283-62.013Z"/></svg>
1900              <span class="icon__fallback-text">Facebook</span>
1901            </a>
1902          </li><li class="mobile-nav__social-item">
1903            <a target="_blank" rel="noopener" href="https://www.youtube.com/channel/UC9x1egq6PNyY2wI1lvkqkvA" title="DreamCatchers Hair Extensions on YouTube">
1904              <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-youtube" viewBox="0 0 21 20"><path fill="#444" d="M-.196 15.803q0 1.23.812 2.092t1.977.861h14.946q1.165 0 1.977-.861t.812-2.092V3.909q0-1.23-.82-2.116T17.539.907H2.593q-1.148 0-1.969.886t-.82 2.116v11.894zm7.465-2.149V6.058q0-.115.066-.18.049-.016.082-.016l.082.016 7.153 3.806q.066.066.066.164 0 .066-.066.131l-7.153 3.806q-.033.033-.066.033-.066 0-.098-.033-.066-.066-.066-.131z"/></svg>
1905              <span class="icon__fallback-text">YouTube</span>
1906            </a>
1907          </li><li class="mobile-nav__social-item">
1908            <a target="_blank" rel="noopener" href="https://www.tiktok.com/@dreamcatchershair" title="DreamCatchers Hair Extensions on TickTok">
1909              <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-tiktok" viewB
1909ox="0 0 2859 3333"><path d="M2081 0c55 473 319 755 778 785v532c-266 26-499-61-770-225v995c0 1264-1378 1659-1932 753-356-583-138-1606 1004-1647v561c-87 14-180 36-265 65-254 86-398 247-358 531 77 544 1075 705 992-358V1h551z"/></svg>
1910              <span class="icon__fallback-text">TikTok</span>
1911            </a>
1912          </li></ul>
1913    </div>
1914  </div>
1915</div>
1916
1917
1918<style>
1919  .site-nav__link,
1920  .site-nav__dropdown-link:not(.site-nav__dropdown-link--top-level) {
1921    font-size: 13px;
1922  }
1923  
1924    .site-nav__link, .mobile-nav__link--top-level {
1925      text-transform: uppercase;
1926      letter-spacing: 0.2em;
1927    }
1928    .mobile-nav__link--top-level {
1929      font-size: 1.1em;
1930    }
1931  
1932
1933  
1934
1935  
1936.site-header {
1937      box-shadow: 0 0 1px rgba(0,0,0,0.2);
1938    }
1939
1940    .toolbar + .header-sticky-wrapper .site-header {
1941      border-top: 0;
1942    }/* Promo Banner Styles */
1943  .promo-banner-wrapper {
1944    display: block;
1945    width: 100%;
1946  }
1947
1948  .promo-banner {
1949    width: 100%;
1950    height: 52px;
1951    display: flex;
1952    align-items: center;
1953    justify-content: center;
1954    background-size: 100% 100%;
1955    background-position: center;
1956    background-repeat: no-repeat;
1957    transition: all 0.3s ease;
1958  }
1959
1960  @media (max-width: 767px) {
1961    .promo-banner {
1962      height: 30px;
1963    }
1964  }
1965
1966  /* Clickable state indicator */
1967  .promo-banner--clickable {
1968    cursor: pointer;
1969  }
1970
1971  .promo-banner__text {
1972    color: #fff;
1973    font-size: 14px;
1974    font-weight: 400;
1975    text-align: center;
1976    padding: 0 20px;
1977    line-height: 1.4;
1978    transition: transform 0.2s ease;
1979  }
1980
1981  .promo-banner-link {
1982    display: block;
1983    text-decoration: none;
1984    transition: opacity 0.3s ease, transform 0.2s ease;
1985    width: 100%;
1986  }
1987
1988  .promo-banner-link:hover {
1989    opacity: 0.95;
1990  }
1991
1992  .promo-banner-link:hover .promo-banner {
1993    transform: scale(1.002);
1994  }
1995
1996  .promo-banner-link:hover .promo-banner__text {
1997    transform: scale(1.02);
1998  }
1999
2000  .promo-banner-link:focus {
2001    outline: 3px solid rgba(239, 131, 173, 0.6);
2002    outline-offset: 2px;
2003  }
2004
2005  .promo-banner-link:active {
2006    transform: scale(0.998);
2007  }
2008
2009  /* Responsive image display */
2010  .promo-banner--desktop {
2011    display: flex;
2012  }
2013
2014  .promo-banner--mobile {
2015    display: none;
2016  }
2017
2018  @media (max-width: 767px) {
2019    .promo-banner--desktop {
2020      display: none;
2021    }
2022
2023    .promo-banner--mobile {
2024      display: flex;
2025    }
2026  }
2027
2028  /* Accessibility: Reduce motion for users who prefer it */
2029  @media (prefers-reduced-motion: reduce) {
2030    .promo-banner,
2031    .promo-banner__text,
2032    .promo-banner-link {
2033      transition: none;
2034      transform: none !important;
2035    }
2036  }</style>
2037
2038<div data-section-id="sections--21273656393974__header" data-section-type="header"><div class="header-sticky-wrapper">
2039    <div id="HeaderWrapper" class="header-wrapper"><header
2040        id="SiteHeader"
2041        class="site-header"
2042        data-sticky="true"
2043        data-overlay="false">
2044        <div class="page-width">
2045          <div
2046            class="header-layout header-layout--center-split"
2047            data-logo-align="center"><div class="header-item header-item--left header-item--navigation"><div class="site-nav small--hide">
2048                      <a href="/search" class="site-nav__link site-nav__link--icon js-search-header">
2049                        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-search" viewBox="0 0 64 64"><title>icon-search</title><path d="M47.16 28.58A18.58 18.58 0 1 1 28.58 10a18.58 18.58 0 0 1 18.58 18.58ZM54 54 41.94 42"/></svg>
2050                        <span class="icon__fallback-text">Search</span>
2051                      </a>
2052                    </div><span class="sm-nav__phone" style=""> 
2053                    <img src="//dreamcatchers.com/cdn/shop/files/headphones.png?v=9928122979393222900" alt="Call icon">
2054                    1-855-373-2683 
2055                  </span><div class="site-nav medium-up--hide">
2056                  <button
2057                    type="button"
2058                    class="site-nav__link site-nav__link--icon js-drawer-open-nav"
2059                    aria-controls="NavDrawer">
2060                    <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-hamburger" viewBox="0 0 64 64"><title>icon-hamburger</title><path d="M7 15h51M7 32h43M7 49h51"/></svg>
2061                    <span class="icon__fallback-text">Site navigation</span>
2062                  </button>
2063                </div>
2064              </div><div class="header-item header-item--logo-split" role="navigation" aria-label="Primary">
2065  <div class="header-item header-item--split-left"><ul
2066  class="site-nav site-navigation small--hide"
2067><li class="site-nav__item site-nav__expanded-item site-nav--has-dropdown site-nav--is-megamenu">
2068      
2069        <details
2070          data-hover="true"
2071          id="site-nav-item--1"
2072          class="site-nav__details"
2073        >
2074          <summary
2075            data-link="/pages/4-in-1-certification"
2076            aria-expanded="false"
2077            aria-controls="site-nav-item--1"
2078            class="site-nav__link site-nav__link--underline site-nav__link--has-dropdown"
2079          >
2080            Get Certified <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
2081          </summary>
2082      
2083
2084<div class="site-nav__dropdown megamenu text-left">
2085            <div class="page-width">
2086              <div class="grid grid--center certified-menu-grid">
2087                <div class="grid__item medium-up--one-fifth appear-animation appear-delay-1 certified-menu-grid-class"><!-- Added by SM -->
2088                    <!-- Change the education portal link to the course page if not purchased -->
2089                    
2090                    
2091
2092
2093                      
2094              				 <a
2095                        href="/collections/hands-on-trainings"
2096                        class="megamenu__colection-image tester"
2097                        style="background-image: url(//dreamcatchers.com/cdn/shop/collections/hands-on-trainings_400x.png?v=1583230711)"></a>
2098                      
2099                    
2100
2101
2102                  <div class="h5">
2103                    
2104                    <a href="/collections/hands-on-trainings" class="site-nav__dropdown-link">4-in-1 Hands-on Trainings</a>
2105                    
2106                  </div>
2107
2108                  
2109
2110                  
2111
2112                    
2113                    
2114
2115                    
2116
2117              		<div>
2118                        
2119                          <p><span>Visit one of our awesome Hands-On Trainings and learn from our certified professional educators</span></p>
2120                        
2121                    </div>
2122                    <div class="view-more">
2123                      
2124                        <a href="/collections/hands-on-trainings" class="site-nav__dropdown-link">
2125                          View
2126                        </a>
2127                      
2128                    </div>
2129                  
2130<!-- Added by SM -->
2131                    <!-- Change the education portal link to the course page if not purchased -->
2132                    
2133                    
2134</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-2 certified-menu-grid-class">
2135<a
2136                        href="/pages/4-in-1-certification"
2137                        class="megamenu__colection-image"
2138                        style="background-image: url('https://cdn.shopify.com/s/files/1/0130/9425/6699/files/all-4-systems.png?v=1679906930')"></a>
2139                  
2140
2141                  <div class="h5">
2142                    
2143                    <a href="/pages/4-in-1-certification" class="site-nav__dropdown-link">4-in-1 Online Certification</a>
2144                    
2145                  </div>
2146
2147                  
2148
2149                  
2150
2151                    
2152                    
2153
2154                    
2155
2156              		<div>
2157                        
2158                          <p><span>Online certification for I-Tip, Tape, K-Tip & Weft systems. Learn everything from installation to maintenance & removal. Accessible 24/7 at your own pace</span></p>
2159                        
2160                    </div>
2161                    <div class="view-more">
2162                      
2163                        <a href="/pages/4-in-1-certification" class="site-nav__dropdown-link">
2164                          View
2165                        </a>
2166                      
2167                    </div>
2168                  
2169<!-- Added by SM -->
2170                    <!-- Change the education portal link to the course page if not purchased -->
2171                    
2172                    
2173</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-3 certified-menu-grid-class">
2174
2175
2176                      <a
2177                        href="https://dreamcatchers.com/pages/dreamlights"
2178                        class="megamenu__colection-image megamenu__colection-image--new-label"
2179                        style="background-image: url('https://cdn.shopify.com/s/files/1/0130/9425/6699/files/ElevenLabs_image_nano-banana-pro_remove_the_b..._2026-04-20T21_33_05.png?v=1776721373')">
2180                        <span class="megamenu__image-label">New</span>
2181                      </a>
2182                  
2183
2184                  <div class="h5">
2185                    
2186                    <a href="https://dreamcatchers.com/pages/dreamlights" class="site-nav__dropdown-link">DreamLights </a>
2187                    
2188                  </div>
2189
2190                  
2191
2192                  
2193
2194                    
2195                    
2196
2197                    
2198
2199              		<div>
2200                        
2201                          <p><span>Get certified in DreamLights, the latest UV technology in hair extensions, with hands-on training or online certification.</span></p>
2202                        
2203                    </div>
2204                    <div class="view-more">
2205                      
2206                        <a href="https://dreamcatchers.com/pages/dreamlights" class="site-nav__dropdown-link">
2207                          View
2208                        </a>
2209                      
2210                    </div>
2211                  
2212</div>
2213              </div>
2214            </div>
2215          </div>
2216        </details>
2217      
2218    </li><li class="site-nav__item site-nav__expanded-item site-nav--has-dropdown site-nav--is-megamenu">
2219      
2220        <details
2221          data-hover="true"
2222          id="site-nav-item--2"
2223          class="site-nav__details"
2224        >
2225          <summary
2226            data-link="/collections/all-products"
2227            aria-expanded="false"
2228            aria-controls="site-nav-item--2"
2229            class="site-nav__link site-nav__link--underline site-nav__link--has-dropdown"
2230          >
2231            Shop <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
2232          </summary>
2233      
2234
2235<div class="site-nav__dropdown megamenu text-left">
2236            <div class="page-width">
2237              <div class="grid grid--center">
2238                <div class="grid__item medium-up--one-fifth appear-animation appear-delay-1 "><!-- Added by SM -->
2239                    <!-- Change the education portal link to the course page if not purchased -->
2240                    
2241                    
2242
2243
2244                      
2245              				 <a
2246                        href="/collections/i-tip"
2247                        class="megamenu__colection-image tester"
2248                        style="background-image: url(//dreamcatchers.com/cdn/shop/collections/Untitled-67ee_540x_43a39d89-4f73-459f-a066-72d18f2c6ee4_400x.png?v=1781558628)"></a>
2249                      
2250                    
2251
2252
2253                  <div class="h5">
2254                    
2255                    <a href="/collections/i-tip" class="site-nav__dropdown-link">I-Tip</a>
2256                    
2257                  </div>
2258
2259                  
2260
2261                  
2262
2263                    
2264                    
2265
2266                    
2267
2268              		<div>
2269                        
2270                          <span>Our I-Tip system uses a patented rubberized tip that allows the hair to lay flat against your head.</span>
2271                        
2272                    </div>
2273                    <div class="view-more">
2274                      
2275                        <a href="/collections/i-tip" class="site-nav__dropdown-link">
2276                          View
2277                        </a>
2278                      
2279                    </div>
2280                  
2281<!-- Added by SM -->
2282                    <!-- Change the education portal link to the course page if not purchased -->
2283                    
2284                    
2285</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-2 ">
2286
2287                      
2288              				 <a
2289                        href="/collections/weft"
2290                        class="megamenu__colection-image tester"
2291                        style="background-image: url(//dreamcatchers.com/cdn/shop/collections/weft-menu_400x.png?v=1781558725)"></a>
2292                      
2293                    
2294
2295
2296                  <div class="h5">
2297                    
2298                    <a href="/collections/weft" class="site-nav__dropdown-link">Weft</a>
2299                    
2300                  </div>
2301
2302                  
2303
2304                  
2305
2306                    
2307                    
2308
2309                    
2310
2311              		<div>
2312                        
2313                          <span>Our wefting system is a single weft of hair that is sewn in through a beaded foundation.</span>
2314                        
2315                    </div>
2316                    <div class="view-more">
2317                      
2318                        <a href="/collections/weft" class="site-nav__dropdown-link">
2319                          View
2320                        </a>
2321                      
2322                    </div>
2323                  
2324<!-- Added by SM -->
2325                    <!-- Change the education portal link to the course page if not purchased -->
2326                    
2327                    
2328</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-3 ">
2329
2330                      
2331              				 <a
2332                        href="/collections/k-tip"
2333                        class="megamenu__colection-image tester"
2334                        style="background-image: url(//dreamcatchers.com/cdn/shop/collections/k-tip-menu_400x.png?v=1781559286)"></a>
2335                      
2336                    
2337
2338
2339                  <div class="h5">
2340                    
2341                    <a href="/collections/k-tip" class="site-nav__dropdown-link">K-Tip</a>
2342                    
2343                  </div>
2344
2345                  
2346
2347                  
2348
2349                    
2350                    
2351
2352                    
2353
2354              		<div>
2355                        
2356                          <span data-mce-fragment="1">Keratin Tip Extensions, also known as K-tip, is an individual extension that is applied using a heating tool.</span>
2357                        
2358                    </div>
2359                    <div class="view-more">
2360                      
2361                        <a href="/collections/k-tip" class="site-nav__dropdown-link">
2362                          View
2363                        </a>
2364                      
2365                    </div>
2366                  
2367<!-- Added by SM -->
2368                    <!-- Change the education portal link to the course page if not purchased -->
2369                    
2370                    
2371</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-4 ">
2372
2373                      
2374              				 <a
2375                        href="/collections/tape-in"
2376                        class="megamenu__colection-image tester"
2377                        style="background-image: url(//dreamcatchers.com/cdn/shop/collections/Untitled-5ee_540x_d55ccc16-a25e-4dc9-88d7-0318446a0459_400x.png?v=1781559319)"></a>
2378                      
2379                    
2380
2381
2382                  <div class="h5">
2383                    
2384                    <a href="/collections/tape-in" class="site-nav__dropdown-link">Tape In</a>
2385                    
2386                  </div>
2387
2388                  
2389
2390                  
2391
2392                    
2393                    
2394
2395                    
2396
2397              		<div>
2398                        
2399                          <span>Our Tape In system quickly allows you to add more volume in areas you need it the most.</span>
2400                        
2401                    </div>
2402                    <div class="view-more">
2403                      
2404                        <a href="/collections/tape-in" class="site-nav__dropdown-link">
2405                          View
2406                        </a>
2407                      
2408                    </div>
2409                  
2410<!-- Added by SM -->
2411                    <!-- Change the education portal link to the course page if not purchased -->
2412                    
2413                    
2414</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-5 ">
2415
2416                      
2417                        <a
2418                        href="/pages/toppers-landing-page"
2419                        class="megamenu__colection-image megamenu__colection-image--new-label"
2420                        style="background-image: url(//dreamcatchers.com/cdn/shop/collections/i-tip_9c55480b-5ae0-41fe-85a7-6c9b879eea04_400x.png?v=1781635850)">
2421                          <span class="megamenu__image-label">New</span>
2422                        </a>
2423              		  
2424                    
2425
2426
2427                  <div class="h5">
2428                    
2429                    <a href="/pages/toppers-landing-page" class="site-nav__dropdown-link">Toppers</a>
2430                    
2431                  </div>
2432
2433                  
2434
2435                  
2436
2437                    
2438                    
2439
2440                    
2441
2442              		<div>
2443                        
2444                          <p>DreamLuxe toppers give instant volume and coverage with a lightweight, hand-crafter design that looks and feels natural.</p>
2445                        
2446                    </div>
2447                    <div class="view-more">
2448                      
2449                        <a href="/pages/toppers-landing-page" class="site-nav__dropdown-link">
2450                          View 
2451                        </a>
2452                      
2453                    </div>
2454                  
2455<!-- Added by SM -->
2456                    <!-- Change the education portal link to the course page if not purchased -->
2457                    
2458                    
2459</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-6 ">
2460
2461                      
2462              				 <a
2463                        href="/collections/accessories"
2464                        class="megamenu__colection-image tester"
2465                        style="background-image: url(//dreamcatchers.com/cdn/shop/collections/Untitled-58ee_540x_474c4005-70fc-4cea-9aab-85d5c728a56c_400x.png?v=1781638789)"></a>
2466                      
2467                    
2468
2469
2470                  <div class="h5">
2471                    
2472                    <a href="/collections/accessories" class="site-nav__dropdown-link">Accessories</a>
2473                    
2474                  </div>
2475
2476                  
2477
2478                  
2479
2480                    
2481                    
2482
2483                    
2484
2485              		<div>
2486                        
2487                          <span>Practically everything you need is in your stylist kit you get as a gift from us! Check out here for other supplements to restock.</span>
2488                        
2489                    </div>
2490                    <div class="view-more">
2491                      
2492                        <a href="/collections/accessories" class="site-nav__dropdown-link">
2493                          View
2494                        </a>
2495                      
2496                    </div>
2497                  
2498<!-- Added by SM -->
2499                    <!-- Change the education portal link to the course page if not purchased -->
2500                    
2501                    
2502</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-7 ">
2503
2504                      
2505              				 <a
2506                        href="/collections/framar"
2507                        class="megamenu__colection-image tester"
2508                        style="background-image: url(//dreamcatchers.com/cdn/shop/collections/framar-products_400x.png?v=1648801092)"></a>
2509                      
2510                    
2511
2512
2513                  <div class="h5">
2514                    
2515                    <a href="/collections/framar" class="site-nav__dropdown-link">Framar</a>
2516                    
2517                  </div>
2518
2519                  
2520
2521                  
2522
2523                    
2524                    
2525
2526                    
2527
2528              		<div>
2529                        
2530                          <span data-mce-fragment="1">We are excited to be offering this exclusive deal to all our amazing stylists.</span>
2531                        
2532                    </div>
2533                    <div class="view-more">
2534                      
2535                        <a href="/collections/framar" class="site-nav__dropdown-link">
2536                          View
2537                        </a>
2538                      
2539                    </div>
2540                  
2541</div>
2542              </div>
2543            </div>
2544          </div>
2545        </details>
2546      
2547    </li><li class="site-nav__item site-nav__expanded-item site-nav--has-dropdown">
2548      
2549        <details
2550          data-hover="true"
2551          id="site-nav-item--3"
2552          class="site-nav__details"
2553        >
2554          <summary
2555            data-link="#"
2556            aria-expanded="false"
2557            aria-controls="site-nav-item--3"
2558            class="site-nav__link site-nav__link--underline site-nav__link--has-dropdown"
2559          >
2560            About The Hair <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
2561          </summary>
2562      
2563<ul class="site-nav__dropdown text-left"><li class="">
2564                <a href="/pages/dreamcatchers" class="site-nav__dropdown-link site-nav__dropdown-link--second-level">
2565                  About DreamCatchers
2566</a></li><li class="">
2567                <a href="/pages/production-process" class="site-nav__dropdown-link site-nav__dropdown-link--second-level">
2568                  Production Process
2569</a></li><li class="">
2570                <a href="/pages/color-styles" class="site-nav__dropdown-link site-nav__dropdown-link--second-level">
2571                  Colors &amp; Styles
2572</a></li><li class="">
2573                <a href="/apps/help-center" class="site-nav__dropdown-link site-nav__dropdown-link--second-level">
2574                  FAQ’s
2575</a></li></ul>
2576        </details>
2577      
2578    </li></ul>
2579</div>
2580  <div class="header-item header-item--logo"><style data-shopify>.header-item--logo,
2581    .header-layout--left-center .header-item--logo,
2582    .header-layout--left-center .header-item--icons {
2583      -webkit-box-flex: 0 1 80px;
2584      -ms-flex: 0 1 80px;
2585      flex: 0 1 80px;
2586    }
2587
2588    @media only screen and (min-width: 769px) {
2589      .header-item--logo,
2590      .header-layout--left-center .header-item--logo,
2591      .header-layout--left-center .header-item--icons {
2592        -webkit-box-flex: 0 0 80px;
2593        -ms-flex: 0 0 80px;
2594        flex: 0 0 80px;
2595      }
2596    }
2597
2598    .site-header__logo a {
2599      width: 80px;
2600    }
2601    .is-light .site-header__logo .logo--inverted {
2602      width: 80px;
2603    }
2604    @media only screen and (min-width: 769px) {
2605      .site-header__logo a {
2606        width: 80px;
2607      }
2608
2609      .is-light .site-header__logo .logo--inverted {
2610        width: 80px;
2611      }
2612    }</style><div class="h1 site-header__logo" itemscope itemtype="http://schema.org/Organization" >
2613      <a
2614        href="/"
2615        itemprop="url"
2616        class="site-header__logo-link logo--has-inverted"
2617        style="padding-top: 41.95804195804196%">
2618
2619        
2620
2621
2622
2623
2624
2625<image-element data-aos="image-fade-in" data-aos-offset="150">
2626
2627
2628  
2629<img src="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=160" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=80 80w, //dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=160 160w" width="80" height="33.56643356643357" loading="eager" class="small--hide image-element" sizes="80px" itemprop="logo">
2630  
2631
2632
2633</image-element>
2634
2635
2636
2637
2638<image-element data-aos="image-fade-in" data-aos-offset="150">
2639
2640
2641  
2642<img src="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=160" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=80 80w, //dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=160 160w" width="80" height="33.56643356643357" loading="eager" class="medium-up--hide image-element" sizes="80px">
2643  
2644
2645
2646</image-element>
2647</a><a
2648          href="/"
2649          itemprop="url"
2650          class="site-header__logo-link logo--inverted"
2651          style="padding-top: 39.40677966101695%">
2652
2653          
2654
2655
2656
2657
2658
2659<image-element data-aos="image-fade-in" data-aos-offset="150">
2660
2661
2662  
2663<img src="//dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&amp;width=160" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&amp;width=80 80w, //dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&amp;width=160 160w" width="80" height="31.52542372881356" loading="eager" class="small--hide image-element" sizes="80px" itemprop="logo">
2664  
2665
2666
2667</image-element>
2668
2669
2670
2671
2672<image-element data-aos="image-fade-in" data-aos-offset="150">
2673
2674
2675  
2676<img src="//dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&amp;width=160" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&amp;width=80 80w, //dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&amp;width=160 160w" width="80" height="31.52542372881356" loading="eager" class="medium-up--hide image-element" sizes="80px">
2677  
2678
2679
2680</image-element>
2681</a></div></div>
2682  <div class="header-item header-item--split-right"><ul
2683  class="site-nav site-navigation small--hide"
2684><li class="site-nav__item site-nav__expanded-item">
2685      
2686        <a
2687          href="https://portal.dreamcatchers.com/"
2688          class="site-nav__link site-nav__link--underline"
2689        >
2690          Education Hub
2691        </a>
2692      
2693
2694    </li><li class="site-nav__item site-nav__expanded-item">
2695      
2696        <a
2697          href="/pages/yotpo-reviews"
2698          class="site-nav__link site-nav__link--underline"
2699        >
2700          Reviews
2701        </a>
2702      
2703
2704    </li><li class="site-nav__item site-nav__expanded-item">
2705      
2706        <a
2707          href="/blogs/dreamcatchers-hair-blog"
2708          class="site-nav__link site-nav__link--underline"
2709        >
2710          Blog
2711        </a>
2712      
2713
2714    </li><li class="site-nav__item site-nav__expanded-item">
2715      
2716        <a
2717          href="https://dreamcatchers.com/pages/dc-media-library"
2718          class="site-nav__link site-nav__link--underline"
2719        >
2720          DC Media Library
2721        </a>
2722      
2723
2724    </li></ul>
2725</div>
2726</div>
2727<div class="header-item header-item--icons"><div class="site-nav">
2728  <div class="site-nav__icons"><a class="site-nav__link site-nav__link--icon small--hide" href="/account">
2729        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-user" viewBox="0 0 64 64"><title>account</title><path d="M35 39.84v-2.53c3.3-1.91 6-6.66 6-11.41 0-7.63 0-13.82-9-13.82s-9 6.19-9 13.82c0 4.75 2.7 9.51 6 11.41v2.53c-10.18.85-18 6-18 12.16h42c0-6.19-7.82-11.31-18-12.16Z"/></svg>
2730        <span class="icon__fallback-text">Log in
2731</span>
2732      </a><a href="/search" class="site-nav__link site-nav__link--icon js-search-header medium-up--hide">
2733        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-search" viewBox="0 0 64 64"><title>icon-search</title><path d="M47.16 28.58A18.58 18.58 0 1 1 28.58 10a18.58 18.58 0 0 1 18.58 18.58ZM54 54 41.94 42"/></svg>
2734        <span class="icon__fallback-text">Search</span>
2735      </a><a href="/cart" class="site-nav__link site-nav__link--icon js-drawer-open-cart" aria-controls="CartDrawer" data-icon="bag">
2736      <span class="cart-link"><svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-bag" viewBox="0 0 64 64"><g fill="none" stroke="#000" stroke-width="2"><path d="M25 26c0-15.79 3.57-20 8-20s8 4.21 8 20"/><path d="M14.74 18h36.51l3.59 36.73h-43.7z"/></g></svg><span class="icon__fallback-text">Cart</span>
2737        <span class="cart-link__bubble"></span>
2738      </span>
2739    </a>
2740  </div>
2741</div>
2742</div>
2743          </div></div>
2744        <div class="site-header__search-container">
2745          <div class="site-header__search">
2746            <div class="page-width">
2747              <predictive-search data-context="header" data-enabled="true" data-dark="false">
2748  <div class="predictive__screen" data-screen></div>
2749  <form action="/search" method="get" role="search">
2750    <label for="Search" class="hidden-label">Search</label>
2751    <div class="search__input-wrap">
2752      <input
2753        class="search__input"
2754        id="Search"
2755        type="search"
2756        name="q"
2757        value=""
2758        role="combobox"
2759        aria-expanded="false"
2760        aria-owns="predictive-search-results"
2761        aria-controls="predictive-search-results"
2762        aria-haspopup="listbox"
2763        aria-autocomplete="list"
2764        autocorrect="off"
2765        autocomplete="off"
2766        autocapitalize="off"
2767        spellcheck="false"
2768        placeholder="Search"
2769        tabindex="0"
2770      >
2771      <input name="options[prefix]" type="hidden" value="last">
2772      <button class="btn--search" type="submit">
2773        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-search" viewBox="0 0 64 64"><defs><style>.cls-1{fill:none;stroke:#000;stroke-miterlimit:10;stroke-width:2px}</style></defs><path class="cls-1" d="M47.16 28.58A18.58 18.58 0 1 1 28.58 10a18.58 18.58 0 0 1 18.58 18.58zM54 54L41.94 42"/></svg>
2774        <span class="icon__fallback-text">Search</span>
2775      </button>
2776    </div>
2777
2778    <button class="btn--close-search">
2779      <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><defs><style>.cls-1{fill:none;stroke:#000;stroke-miterlimit:10;stroke-width:2px}</style></defs><path class="cls-1" d="M19 17.61l27.12 27.13m0-27.13L19 44.74"/></svg>
2780    </button>
2781    <div id="predictive-search" class="search__results" tabindex="-1"></div>
2782  </form>
2783</predictive-search>
2784
2785            </div>
2786          </div>
2787        </div>
2788      </header></div>
2789  </div>
2790</div>
2791
2792</div>
2793<!-- END sections: header-group --><!-- BEGIN sections: popup-group -->
2794
2795<!-- END sections: popup-group -->
2796
2797    
2798
2799      <main class="main-content " id="MainContent">
2800        
2801        <div id="shopify-section-template--21273657442550__main" class="shopify-section"><div class="page-width page-content">
2802<header class="section-header text-center section-header--404">
2803    <h1 class="section-header__title">Cart</h1>
2804    <div class="rte text-spacing"><p>Your cart is currently empty.</p><p><a href='/collections/all'>Continue shopping</a></p>
2805    </div>
2806  </header></div>
2807
2808
2809</div><div id="shopify-section-template--21273657442550__recently-viewed" class="shopify-section"><div
2810  data-subsection
2811  data-section-id="template--21273657442550__recently-viewed"
2812  data-section-type="recently-viewed"
2813  data-product-handle=""
2814  data-recent-count="5"
2815  data-grid-item-class="small--one-half medium-up--one-fifth"
2816  data-row-of="5"
2817  data-image-sizes="(min-width: 769px) 20vw, 39vw"
2818>
2819  <hr class="hr--large">
2820  <div class="index-section index-section--small">
2821    <div class="page-width">
2822      <header class="section-header">
2823        <h3 class="section-header__title">Recently viewed</h3>
2824      </header>
2825    </div>
2826
2827    <div class="page-width page-width--flush-small">
2828      <div class="grid-overflow-wrapper">
2829        <div id="RecentlyViewed-template--21273657442550__recently-viewed" class="grid grid--uniform" data-aos="overflow__animation"></div>
2830      </div>
2831    </div>
2832  </div>
2833</div>
2834
2835
2836</div>
2837        
2838      </main><!-- BEGIN sections: footer-group -->
2839<div id="shopify-section-sections--21273656361206__footer" class="shopify-section shopify-section-group-footer-group"><style data-shopify>.site-footer {
2840      border-top: 1px solid #f0f0f0;
2841    }</style><footer class="site-footer" data-section-id="sections--21273656361206__footer" data-section-type="footer-section">
2842  <div class="page-width">
2843
2844    <div class="grid"><div  class="grid__item footer__item--logo_social_CUTq6Y" data-type="logo_social"><style data-shopify>@media only screen and (min-width: 769px) and (max-width: 959px) {
2845              .footer__item--logo_social_CUTq6Y {
2846                width: 50%;
2847                padding-top: 40px;
2848              }
2849              .footer__item--logo_social_CUTq6Y:nth-child(2n + 1) {
2850                clear: left;
2851              }
2852            }
2853            @media only screen and (min-width: 960px) {
2854              .footer__item--logo_social_CUTq6Y {
2855                width: 95%;
2856              }
2857
2858            }</style><style data-shopify>.footer__logo a {
2859      height: 60px;
2860    }</style><div class="footer__logo">
2861    <a href="/">
2862
2863
2864
2865<image-element data-aos="image-fade-in" data-aos-offset="150">
2866
2867
2868  
2869<img src="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=286" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=143 143w, //dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&amp;width=286 286w" width="286.0" height="120.0" loading="lazy" class=" image-element" sizes="143.0px" style="max-width: 143.0px;max-height: 60px;">
2870  
2871
2872
2873</image-element>
2874</a>
2875  </div></div><div class="footer__clear small--hide"></div><div  class="grid__item footer__item--menu-2" data-type="menu"><style data-shopify>@media only screen and (min-width: 769px) and (max-width: 959px) {
2876              .footer__item--menu-2 {
2877                width: 50%;
2878                padding-top: 40px;
2879              }
2880              .footer__item--menu-2:nth-child(2n + 1) {
2881                clear: left;
2882              }
2883            }
2884            @media only screen and (min-width: 960px) {
2885              .footer__item--menu-2 {
2886                width: 95%;
2887              }
2888
2889            }</style><div
2890    >
2891    <div class="collapsible-content__inner">
2892      <div class="footer__collapsible footer_collapsible--disabled">
2893        <ul class="no-bullets site-footer__linklist footer-menu-custom"><li>
2894              <a href="/collections/all-products">SHOP</a>
2895              
2896              <ul class="child">
2897                  
2898                <li><a href= "/pages/4-in-1-certification">Online Certification</a>
2899                   
2900                </li>
2901                  
2902                <li><a href= "/collections/i-tip">I-Tip Hair Extensions</a>
2903                   
2904                </li>
2905                  
2906                <li><a href= "/collections/tape-in">Tape In Hair Extensions</a>
2907                   
2908                </li>
2909                  
2910                <li><a href= "/collections/weft">Weft Hair Extensions</a>
2911                   
2912                </li>
2913                  
2914                <li><a href= "/collections/k-tip">K-Tip Hair Extensions</a>
2915                   
2916                </li>
2917                  
2918                <li><a href= "/pages/toppers-landing-page">Toppers </a>
2919                   
2920                </li>
2921                  
2922                <li><a href= "https://dreamcatchers.com/collections/all-products/products/dc-crown-n-glory?">Crown-N-Glory Hair Extensions</a>
2923                   
2924                </li>
2925                  
2926                <li><a href= "/collections/accessories">Accessories</a>
2927                   
2928                </li>
2929                
2930              </ul> 
2931             
2932            </li><li>
2933              <a href="/pages/dreamcatchers">THE HAIR</a>
2934              
2935              <ul class="child">
2936                  
2937                <li><a href= "/pages/color-styles">Colors & Styles</a>
2938                   
2939                </li>
2940                  
2941                <li><a href= "/pages/dreamcatchers">About DreamCatchers</a>
2942                   
2943                </li>
2944                  
2945                <li><a href= "/pages/production-process">Production Process</a>
2946                   
2947                </li>
2948                  
2949                <li><a href= "/pages/dc-media-library">Media Library</a>
2950                   
2951                </li>
2952                  
2953                <li><a href= "/pages/yotpo-reviews">Reviews</a>
2954                   
2955                </li>
2956                  
2957                <li><a href= "https://dreamcatchers.com/blogs/dreamcatchers-hair-blog/">Blog</a>
2958                   
2959                </li>
2960                
2961              </ul> 
2962             
2963            </li><li>
2964              <a href="/collections/hands-on-trainings">GET CERTIFIED</a>
2965              
2966              <ul class="child">
2967                  
2968                <li><a href= "/pages/sign-up">Become Certified</a>
2969                   
2970                </li>
2971                  
2972                <li><a href= "/collections/hands-on-trainings">Hands-On Trainings</a>
2973                   
2974                </li>
2975                  
2976                <li><a href= "/apps/help-center">FAQ's</a>
2977                   
2978                </li>
2979                  
2980                <li><a href= "/pages/sign-up">Contact Us</a>
2981                   
2982                </li>
2983                
2984              </ul> 
2985             
2986            </li><li>
2987              <a href="https://dreamcatchers.com/pages/refund-return-policy">Terms of Service</a>
2988              
2989              <ul class="child">
2990                  
2991                <li><a href= "/policies/terms-of-service">Terms of Service</a>
2992                   
2993                </li>
2994                  
2995                <li><a href= "/pages/warranty-returns-exchanges">Warranty & Returns</a>
2996                
2997                  <ul class="grandchild">
2998                    
2999                    <li><a href= "http://returns.dreamcatchers.com/return">Start a Return or Exchange (855-373-2683)</a></li>
3000                  
3001                  </ul>
3002                   
3003                </li>
3004                  
3005                <li><a href= "/pages/shipping-delivery">Shipping & Delivery</a>
3006                   
3007                </li>
3008                  
3009                <li><a href= "/policies/refund-policy">Refund & Return policy</a>
3010                   
3011                </li>
3012                  
3013                <li><a href= "/pages/privacy-policy">Privacy Policy</a>
3014                   
3015                </li>
3016                
3017              </ul> 
3018             
3019            </li></ul>
3020      </div>
3021    </div>
3022  </div></div></div>
3023
3024    <div class="footer--social">
3025      <ul class="no-bullets social-icons footer__social"><li>
3026      <a target="_blank" rel="noopener" href="https://www.instagram.com/dreamcatchershair/" title="DreamCatchers Hair Extensions on Instagram">
3027        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-instagram" viewBox="0 0 32 32"><title>instagram</title><path fill="#444" d="M16 3.094c4.206 0 4.7.019 6.363.094 1.538.069 2.369.325 2.925.544.738.287 1.262.625 1.813 1.175s.894 1.075 1.175 1.813c.212.556.475 1.387.544 2.925.075 1.662.094 2.156.094 6.363s-.019 4.7-.094 6.363c-.069 1.538-.325 2.369-.544 2.925-.288.738-.625 1.262-1.175 1.813s-1.075.894-1.813 1.175c-.556.212-1.387.475-2.925.544-1.663.075-2.156.094-6.363.094s-4.7-.019-6.363-.094c-1.537-.069-2.369-.325-2.925-.544-.737-.288-1.263-.625-1.813-1.175s-.894-1.075-1.175-1.813c-.212-.556-.475-1.387-.544-2.925-.075-1.663-.094-2.156-.094-6.363s.019-4.7.094-6.363c.069-1.537.325-2.369.544-2.925.287-.737.625-1.263 1.175-1.813s1.075-.894 1.813-1.175c.556-.212 1.388-.475 2.925-.544 1.662-.081 2.156-.094 6.363-.094zm0-2.838c-4.275 0-4.813.019-6.494.094-1.675.075-2.819.344-3.819.731-1.037.4-1.913.944-2.788 1.819S1.486 4.656 1.08 5.688c-.387 1-.656 2.144-.731 3.825-.
3027075 1.675-.094 2.213-.094 6.488s.019 4.813.094 6.494c.075 1.675.344 2.819.731 3.825.4 1.038.944 1.913 1.819 2.788s1.756 1.413 2.788 1.819c1 .387 2.144.656 3.825.731s2.213.094 6.494.094 4.813-.019 6.494-.094c1.675-.075 2.819-.344 3.825-.731 1.038-.4 1.913-.944 2.788-1.819s1.413-1.756 1.819-2.788c.387-1 .656-2.144.731-3.825s.094-2.212.094-6.494-.019-4.813-.094-6.494c-.075-1.675-.344-2.819-.731-3.825-.4-1.038-.944-1.913-1.819-2.788s-1.756-1.413-2.788-1.819c-1-.387-2.144-.656-3.825-.731C20.812.275 20.275.256 16 .256z"/><path fill="#444" d="M16 7.912a8.088 8.088 0 0 0 0 16.175c4.463 0 8.087-3.625 8.087-8.088s-3.625-8.088-8.088-8.088zm0 13.338a5.25 5.25 0 1 1 0-10.5 5.25 5.25 0 1 1 0 10.5zM26.294 7.594a1.887 1.887 0 1 1-3.774.002 1.887 1.887 0 0 1 3.774-.003z"/></svg>
3028        <span class="icon__fallback-text">Instagram</span>
3029      </a>
3030    </li><li>
3031      <a target="_blank" rel="noopener" href="https://www.facebook.com/dreamcatchersHair" title="DreamCatchers Hair Extensions on Facebook">
3032        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-facebook" viewBox="0 0 14222 14222"><path d="M14222 7112c0 3549.352-2600.418 6491.344-6000 7024.72V9168h1657l315-2056H8222V5778c0-562 275-1111 1159-1111h897V2917s-814-139-1592-139c-1624 0-2686 984-2686 2767v1567H4194v2056h1806v4968.72C2600.418 13603.344 0 10661.352 0 7112 0 3184.703 3183.703 1 7111 1s7111 3183.703 7111 7111Zm-8222 7025c362 57 733 86 1111 86-377.945 0-749.003-29.485-1111-86.28Zm2222 0v-.28a7107.458 7107.458 0 0 1-167.717 24.267A7407.158 7407.158 0 0 0 8222 14137Zm-167.717 23.987C7745.664 14201.89 7430.797 14223 7111 14223c319.843 0 634.675-21.479 943.283-62.013Z"/></svg>
3033        <span class="icon__fallback-text">Facebook</span>
3034      </a>
3035    </li><li>
3036      <a target="_blank" rel="noopener" href="https://www.youtube.com/channel/UC9x1egq6PNyY2wI1lvkqkvA" title="DreamCatchers Hair Extensions on YouTube">
3037        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-youtube" viewBox="0 0 21 20"><path fill="#444" d="M-.196 15.803q0 1.23.812 2.092t1.977.861h14.946q1.165 0 1.977-.861t.812-2.092V3.909q0-1.23-.82-2.116T17.539.907H2.593q-1.148 0-1.969.886t-.82 2.116v11.894zm7.465-2.149V6.058q0-.115.066-.18.049-.016.082-.016l.082.016 7.153 3.806q.066.066.066.164 0 .066-.066.131l-7.153 3.806q-.033.033-.066.033-.066 0-.098-.033-.066-.066-.066-.131z"/></svg>
3038        <span class="icon__fallback-text">YouTube</span>
3039      </a>
3040    </li><li>
3041      <a target="_blank" rel="noopener" href="https://www.tiktok.com/@dreamcatchershair" title="DreamCatchers Hair Extensions on TikTok">
3042        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-tiktok" viewBox="0 0 2859 3333"><path d="M2081 0c55 473 319 755 778 785v532c-266 26-499-61-770-225v995c0 1264-1378 1659-1932 753-356-583-138-1606 1004-1647v561c-87 14-180 36-265 65-254 86-398 247-358 531 77 544 1075 705 992-358V1h551z"/></svg>
3043        <span class="icon__fallback-text">TikTok</span>
3044      </a>
3045    </li></ul>
3046
3047      <p class="footer__small-text phone-footer">Call us <strong>1-855-DREAM-TEAM</strong></p>
3048    </div></div><p class="footer__small-text footer__copyright">
3049      &copy; 2026 DreamCatchers Hair Extensions
3050      
3051        All Rights Reserved
3052      
3053    </p></footer>
3054
3055
3056</div>
3057<!-- END sections: footer-group --></div>
3058  </div><div id="VideoModal" class="modal modal--solid">
3059  <div class="modal__inner">
3060    <div class="modal__centered page-width text-center">
3061      <div class="modal__centered-content">
3062        <div class="video-wrapper video-wrapper--modal">
3063          <div id="VideoHolder"></div>
3064        </div>
3065      </div>
3066    </div>
3067  </div>
3068
3069  <button type="button" class="modal__close js-modal-close text-link">
3070    <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg>
3071    <span class="icon__fallback-text">"Close (esc)"</span>
3072  </button>
3073</div>
3074<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
3075  <div class="pswp__bg"></div>
3076  <div class="pswp__scroll-wrap">
3077    <div class="pswp__container">
3078      <div class="pswp__item"></div>
3079      <div class="pswp__item"></div>
3080      <div class="pswp__item"></div>
3081    </div>
3082
3083    <div class="pswp__ui pswp__ui--hidden">
3084      <button class="btn btn--body btn--circle pswp__button pswp__button--arrow--left" title="Previous">
3085        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-left" viewBox="0 0 284.49 498.98"><path d="M249.49 0a35 35 0 0 1 24.75 59.75L84.49 249.49l189.75 189.74a35.002 35.002 0 1 1-49.5 49.5L10.25 274.24a35 35 0 0 1 0-49.5L224.74 10.25A34.89 34.89 0 0 1 249.49 0Z"/></svg>
3086      </button>
3087
3088      <button class="btn btn--body btn--circle btn--large pswp__button pswp__button--close" title="Close (esc)">
3089        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg>
3090      </button>
3091
3092      <button class="btn btn--body btn--circle pswp__button pswp__button--arrow--right" title="Next">
3093        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-right" viewBox="0 0 284.49 498.98"><title>icon-chevron</title><path d="M35 498.98a35 35 0 0 1-24.75-59.75l189.74-189.74L10.25 59.75a35.002 35.002 0 0 1 49.5-49.5l214.49 214.49a35 35 0 0 1 0 49.5L59.75 488.73A34.89 34.89 0 0 1 35 498.98Z"/></svg>
3094      </button>
3095    </div>
3096  </div>
3097</div>
3098<tool-tip data-tool-tip="">
3099  <div class="tool-tip__inner" data-tool-tip-inner>
3100    <button class="tool-tip__close" data-tool-tip-close=""><svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg></button>
3101    <div data-tool-tip-title>Your Shopping Cart</div>
3102    <div class="tool-tip__content" data-tool-tip-content>
3103    </div>
3104  </div>
3105</tool-tip>
3106
3107  <template id="naturalImageMarkup">
3108    <div class="image-wrap" style="height: 0;">
3109      <image-element data-aos="image-fade-in" data-aos-offset="150">
3110        <img class="grid-product__image image-element" width height src srcset loading="lazy" alt>
3111      </image-element>
3112    </div>
3113  </template>
3114  <template id="fixedRatioImageMarkup">
3115    <div class="grid__image-ratio">
3116      <image-element data-aos="image-fade-in" data-aos-offset="150">
3117        <img class="image-element" width height src srcset loading="lazy" alt>
3118      </image-element>
3119    </div>
3120  </template>
3120<script>
3121(function() {
3122  'use strict';
3123
3124  var AUTO_ADD_VARIANT = 48539324743926;
3125  var QUALIFYING = new Set([6775689052310,6775739121814,6690747842710,7444269662454,8460776767734,8983408247030,6775789093014,6775816650902,6775828086934,6775843881110,6944976928918,6893267681430,7952901013750,6893106331798,6690747842710,8983408247030,8891442954486,8891462222070,8891438924022,8891472937206,6772712964246,6772719583382,6944976928918,2296384618555,2296386945083,6690747842710,8983408247030,6772894761110,6772900626582,2296388911163,2001849811003,2296387567675,4339725205563,6690747842710,8049201414390,8983408247030,8983408247030,6944976928918,2001891295291,2296384618555,6893267681430,2296386945083,2296391041083,2296391335995,2296391827515,2296392220731,7944981774582,4313316589627,4604821831739,4604823601211,6690747842710,9461058535670,8033966031094,6711331684502,6711335977110,6893106331798,7444269662454,2001849811003,2296388911163,4339725205563,2296387567675,7952901013750,8049201414390,8842119807222,8870325977334,8460776767734,8911784607990,8460777554166,8460780044534,9400136466678,9400138137846,9400138924278,9400136827126,9400136794358,7597127926006,7597130973430,7597140377846,7597126713590,7597119701238,7597120061686,7597117833462,7597119373558,7597129990390,7597117276406,7597137625334,7597127303414,7597118849270,7597134086390,7597129597174,7597130252534,7597121994998,7597137887478,7597122814198,7597130449142,7597137527030,7597130711286,7597131137270,7597133398262,9109438202102,0]);
3126  QUALIFYING.delete(0);
3127
3128  if (!QUALIFYING.size) return;
3129
3130  var _native = window.fetch;
3131  var _busy = false;
3132
3133  window.fetch = function(resource, init) {
3134    var url = typeof resource === 'string'
3135      ? resource
3136      : (resource instanceof Request ? resource.url : '');
3137
3138    if (url.indexOf('cart/add') !== -1) {
3139      return _native.apply(this, arguments).then(function(response) {
3140        if (response.ok && !_busy) {
3141          response.clone().json().then(function(data) {
3142            var ids = Array.isArray(data.items)
3143              ? data.items.map(function(i) { return i.product_id; })
3144              : data.product_id ? [data.product_id] : [];
3145
3146            if (ids.some(function(id) { return QUALIFYING.has(id); })) {
3147              addReturnProduct();
3148            }
3149          }).catch(function() {});
3150        }
3151        return response;
3152      });
3153    }
3154
3155    return _native.apply(this, arguments);
3156  };
3157
3158  function addReturnProduct() {
3159    _busy = true;
3160
3161    _native('/cart.js', { credentials: 'same-origin' })
3162      .then(function(r) { return r.json(); })
3163      .then(function(cart) {
3164        var alreadyInCart = cart.items.some(function(item) {
3165          return item.variant_id === AUTO_ADD_VARIANT;
3166        });
3167        if (alreadyInCart) return null;
3168
3169        return _native('/cart/add.js', {
3170          method: 'POST',
3171          headers: { 'Content-Type': 'application/json' },
3172          body: JSON.stringify({ id: AUTO_ADD_VARIANT, quantity: 1 })
3173        });
3174      })
3175      .then(function(response) {
3176        _busy = false;
3177        if (response && response.ok) {
3178          document.dispatchEvent(new CustomEvent('cart:build'));
3179        }
3180      })
3181      .catch(function() {
3182        _busy = false;
3183      });
3184  }
3185})();
3186</script>
3186
3187<div id="shopify-block-AVEtGd2tPMlM0RmlGM__14017166734719355524" class="shopify-block shopify-app-block"><div id="hc-widget" style="display: block"></div>
3188
3189<script>
3190    window.HCAppData = {extShopId: 13094256699}
3191</script>
3191
3192
3193<script type="text/javascript" async="" src="https://s3.helpcenterapp.com/cdn/widget/mount-widget.js"></script>
3193
3194
3195</div><div id="shopify-block-ANURKWnVhaGhFZlo5N__14054365922915784782" class="shopify-block shopify-app-block">
3195<script type="text/javascript" async="" src="https://helpcenter.eoscity.com/app-extension/13094256699/tabs.js"></script>
3195
3196</div>
3196<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
3196
3197</body>
3198</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.