{"title":"Best Seller","description":"\u003cp\u003eShop our best-selling body oils, face elixirs, and hair serums loved by customers across Australia. Trusted, natural, and beautifully effective.\u003c\/p\u003e","products":[{"product_id":"unwind-body-and-massage-oil","title":"Unwind","description":"\u003cstyle data-omelette-injected\u003ehtml,body{background:transparent}\u003c\/style\u003e\u003cscript data-omelette-injected\u003e(()=\u003e{{const n=new URLSearchParams(location.search).get(\"theme\");if(n===\"light\"||n===\"dark\"){document.documentElement.dataset.theme=n}}{if(new URLSearchParams(location.search).get(\"_omthumb\")===\"1\"){const n=(f)=\u003e{const g=f.focus;if(!g)return;f.focus=function(h){g.call(this,{...h,preventScroll:true})}};n(HTMLElement.prototype);n(SVGElement.prototype);if(typeof MathMLElement!==\"undefined\"){n(MathMLElement.prototype)}const d=(f)=\u003e{f.removeAttribute(\"autofocus\");f.inert=true;if(!(f instanceof HTMLElement))f.removeAttribute(\"tabindex\")};const p=(f)=\u003e{if(f.hasAttribute(\"autofocus\"))d(f);for(const g of f.querySelectorAll(\"[autofocus]\")){d(g)}};p(document.documentElement);new MutationObserver((f)=\u003e{for(const g of f){for(const h of g.addedNodes){if(h.nodeType===1)p(h)}}}).observe(document,{childList:true,subtree:true})}}{const n=()=\u003e{try{if(document.querySelector('meta[name=\"color-scheme\"]'))return;const d=getComputedStyle(document.documentElement).getPropertyValue(\"color-scheme\").trim();if(d\u0026\u0026d!==\"normal\")return;const p=(y)=\u003e{if(!y)return null;const m=getComputedStyle(y).backgroundColor.match(\/^rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)(?:[,\\s\/]+([\\d.]+%?))?\\s*\\)$\/);if(!m)return null;const w=m[4]==null?1:parseFloat(m[4])\/(m[4].endsWith(\"%\")?100:1);if(w\u003c0.99)return null;return[+m[1],+m[2],+m[3]]};const f=p(document.body)||p(document.documentElement);if(!f)return;const g=(y)=\u003e{const m=y\/255;return m\u003c=0.04045?m\/12.92:((m+0.055)\/1.055)**2.4};const h=0.2126*g(f[0])+0.7152*g(f[1])+0.0722*g(f[2]);document.documentElement.style.setProperty(\"color-scheme\",h\u003c0.4?\"dark\":\"light\")}catch{}};if(document.readyState===\"complete\")n();else window.addEventListener(\"load\",n)}var I=[\"https:\/\/claude.ai\",\"https:\/\/preview.claude.ai\",\"https:\/\/38380527-3032-478f-ab8c-9c463b248443.claudeusercontent.com\"];var B=true;var K=false;var C=()=\u003e{};if(K===true){try{const n=setTimeout.bind(window);const d=1e4;const p=15;const f=1e4;const g=120000;const h=200;const y=(o)=\u003e{try{let r;if(typeof o===\"string\")r=o;else if(o instanceof URL)r=o.href;else if(typeof Request!==\"undefined\"\u0026\u0026o instanceof Request)r=o.url;else return null;if(!r)return null;const l=document.baseURI;const i=new URL(r,l);if(i.protocol!==\"http:\"\u0026\u0026i.protocol!==\"https:\")return null;if(i.origin!==new URL(l).origin)return null;return i.origin+i.pathname}catch{return null}};const m=new Map;const w=(o)=\u003e{let r=m.get(o);if(!r){if(m.size\u003e=h){const l=m.keys().next().value;if(l!==undefined)m.delete(l)}r={fails:[],until:0,cooldown:f,hard:false};m.set(o,r)}return r};const R=(o)=\u003e{const r=m.get(o);return r!==undefined\u0026\u0026r.until\u003eDate.now()};const O=(o,r)=\u003e{const l=Date.now();const i=w(o);if(r)i.hard=true;if(i.until\u003el)return;i.fails.push(l);while(i.fails.length\u003e0\u0026\u0026i.fails[0]\u003c=l-d)i.fails.shift();if(i.fails.length\u003e=p){i.until=l+i.cooldown;if(i.hard)i.cooldown=Math.min(i.cooldown*2,g);i.fails.length=0;try{n(()=\u003e{try{S(true)}catch{}},i.until-l+100)}catch{}console.warn(\"[omelette] asset circuit breaker: pausing requests to \"+o+\" for \"+Math.round((i.until-l)\/1000)+\"s after \"+p+\" failures in \"+d\/1000+\"s\")}};const e=(o)=\u003e{m.delete(o)};const t=100;const a=new WeakMap;const u=new Set;let s=null;const S=(o)=\u003e{for(const r of Array.from(u)){try{const l=a.get(r);if(l===undefined){u.delete(r);continue}if(o){const i=y(l);if(i!==null\u0026\u0026R(i))continue}a.delete(r);u.delete(r);if(s!==null)s.call(r,l)}catch{}}};C=()=\u003e{try{m.clear();S(false)}catch{}};document.addEventListener(\"visibilitychange\",()=\u003e{if(document.visibilityState===\"visible\")C()});const _=window.fetch;if(typeof _===\"function\"){const o=function(...r){let l=null;try{l=y(r[0])}catch{}if(l!==null\u0026\u0026R(l)){let c;try{if(r[1]\u0026\u0026r[1].signal!==undefined){c=r[1].signal||undefined}else if(typeof Request!==\"undefined\"\u0026\u0026r[0]instanceof Request){c=r[0].signal||undefined}}catch{c=undefined}return new Promise((k,b)=\u003e{const E=()=\u003e{try{return c.reason!==undefined?c.reason:new DOMException(\"The operation was aborted.\",\"AbortError\")}catch{return new DOMException(\"The operation was aborted.\",\"AbortError\")}};try{if(c\u0026\u0026c.aborted){b(E());return}}catch{}let T=false;const j=()=\u003e{if(T)return;T=true;b(E())};try{if(c)c.addEventListener(\"abort\",j,{once:true})}catch{}n(()=\u003e{if(T)return;T=true;try{if(c)c.removeEventListener(\"abort\",j)}catch{}let L;try{L=new Response(null,{status:429,statusText:\"Too Many Requests\",headers:{\"Retry-After\":\"10\"}})}catch{L={ok:false,status:429}}k(L)},250)})}const i=_.apply(window,r);if(l!==null){const c=l;i.then((k)=\u003e{try{if(k.ok)e(c);else if(k.status===401||k.status===403||k.status===404||k.status===429){O(c,k.status!==404)}}catch{}},()=\u003e{})}return i};window.fetch=o}const v=Object.getOwnPropertyDescriptor(HTMLImageElement.prototype,\"src\");if(v!==undefined\u0026\u0026v.set!==undefined\u0026\u0026v.get!==undefined){const o=v.set;s=o;Object.defineProperty(HTMLImageElement.prototype,\"src\",{configurable:true,enumerable:v.enumerable,get:v.get,set(r){const l=`${r}`;try{const i=y(l);if(i!==null\u0026\u0026R(i)){a.set(this,l);if(u.size\u003ct)u.add(this);return}}catch{}try{a.delete(this);u.delete(this)}catch{}o.call(this,l)}})}try{const o=HTMLImageElement.prototype.setAttribute;HTMLImageElement.prototype.setAttribute=function(r,l){if(arguments.length\u003c2){o.apply(this,arguments);return}if(typeof r===\"string\"\u0026\u0026r.toLowerCase()===\"src\"){const i=`${l}`;try{const c=y(i);if(c!==null\u0026\u0026R(c)){a.set(this,i);if(u.size\u003ct)u.add(this);return}a.delete(this);u.delete(this)}catch{}o.call(this,r,i);return}o.call(this,r,l)}}catch{}window.addEventListener(\"error\",(o)=\u003e{try{const r=o.target;if(r instanceof HTMLImageElement){const l=y(r.currentSrc||r.src||\"\");if(l!==null)O(l,true)}}catch{}},true);window.addEventListener(\"load\",(o)=\u003e{try{const r=o.target;if(r instanceof HTMLImageElement){const l=y(r.currentSrc||r.src||\"\");if(l!==null)e(l);const i=a.get(r);if(i!==undefined){let c=false;try{c=new URL(i,document.baseURI).href===new URL(r.currentSrc||r.src||\"\",document.baseURI).href}catch{c=false}if(c){a.delete(r);u.delete(r)}}}}catch{}},true)}catch{}}var J=30000;var G=3000;document.addEventListener(\"DOMContentLoaded\",()=\u003e{const n=window.Babel;const d=\"om-src-id\";if(n\u0026\u0026n.registerPlugin\u0026\u0026!(n.availablePlugins\u0026\u0026n.availablePlugins[d])){n.registerPlugin(d,({types:h})=\u003e({visitor:{JSXOpeningElement(y,m){const w=y.node;if(w.name\u0026\u0026w.name.type===\"JSXMemberExpression\")return;for(let t=0;t\u003cw.attributes.length;t++){const a=w.attributes[t];if(a.type===\"JSXAttribute\"\u0026\u0026a.name\u0026\u0026a.name.name===\"data-om-id\")return}const R=m.file\u0026\u0026m.file.opts\u0026\u0026m.file.opts.filename||\"?\";const O=w.loc\u0026\u0026w.loc.start;const e=`jsx:${R}:${w.start??0}:${O?O.line:0}:${O?O.column+1:0}`;w.attributes.push(h.jsxAttribute(h.jsxIdentifier(\"data-om-id\"),h.stringLiteral(e)))}}}))}const p=\"om-text-extract\";let f=false;if(B\u0026\u0026n\u0026\u0026n.registerPlugin\u0026\u0026!(n.availablePlugins\u0026\u0026n.availablePlugins[p])){const h=window.React;if(h\u0026\u0026h.useSyncExternalStore\u0026\u0026h.createElement){f=true;const y={};const m=new Set;let w=0;window.__omTextO=y;window.__omTextSet=(e)=\u003e{for(const t in e){const a=e[t];if(a==null)delete y[t];else y[t]=a}w++;m.forEach((t)=\u003et())};const R=(e)=\u003e{m.add(e);return()=\u003em.delete(e)};const O=()=\u003ew;window.__OmT=function e(t){h.useSyncExternalStore(R,O,O);return h.createElement(\"span\",{\"data-om-text\":t.i,className:\"__om-t\"},t.i in y?y[t.i]:t.children)};n.registerPlugin(p,({types:e})=\u003e{const t={style:1,script:1,noscript:1,textarea:1,title:1,option:1,text:1,tspan:1,textPath:1};const a={placeholder:1,alt:1,title:1,label:1,\"aria-label\":1,\"aria-description\":1,\"aria-placeholder\":1};const u=(o,r)=\u003ee.logicalExpression(\"??\",e.memberExpression(e.logicalExpression(\"||\",e.memberExpression(e.identifier(\"window\"),e.identifier(\"__omTextO\")),e.objectExpression([])),e.stringLiteral(o),true),r);const s=(o)=\u003eo.file\u0026\u0026o.file.opts\u0026\u0026o.file.opts.filename||\"?\";const S=(o)=\u003eo.file\u0026\u0026o.file.code||\"\";const _=(o,r)=\u003e{const l=(c)=\u003ec\u0026\u0026c.start!=null\u0026\u0026c.end!=null\u0026\u0026(c.type===\"StringLiteral\"||c.type===\"TemplateLiteral\"\u0026\u0026c.expressions.length===0)?[c.start,c.end]:null;const i=l(r);if(i)return i;if(r\u0026\u0026r.type===\"Identifier\"){const c=o.scope.getBinding(r.name);if(c\u0026\u0026c.constant\u0026\u0026c.path.node.type===\"VariableDeclarator\"){return l(c.path.node.init)}}return null};const v=(o,r,l)=\u003e{const i=o.node;let c=false;const k=(E,T)=\u003e{c=true;return e.jsxElement(e.jsxOpeningElement(e.jsxIdentifier(\"__OmT\"),[e.jsxAttribute(e.jsxIdentifier(\"i\"),e.stringLiteral(E))],false),e.jsxClosingElement(e.jsxIdentifier(\"__OmT\")),[T],false)};const b=i.children.map((E)=\u003e{if(E.type===\"JSXText\"){if(E.start==null||E.end==null)return E;const T=l.slice(E.start,E.end);const j=T.length-T.trimStart().length;const L=T.length-T.trimEnd().length;if(j+L\u003e=T.length)return E;return k(`txt:${r}:${E.start+j}:${E.end-L}`,E)}if(E.type===\"JSXExpressionContainer\"){const T=_(o,E.expression);if(T)return k(`str:${r}:${T[0]}:${T[1]}`,E)}return E});if(c)i.children=b};return{visitor:{JSXOpeningElement(o,r){const l=o.node;const i=s(r);const c={};for(let k=0;k\u003cl.attributes.length;k++){const b=l.attributes[k];if(b.type!==\"JSXAttribute\"||!b.name)continue;const E=b.name.name;if(!a[E])continue;if(!b.value||b.value.type!==\"StringLiteral\")continue;if(b.value.start==null||b.value.end==null)continue;const T=`txt:${i}:${b.value.start}:${b.value.end}`;c[E]=T;b.value=e.jsxExpressionContainer(u(T,e.stringLiteral(b.value.value)))}if(Object.keys(c).length){l.attributes.push(e.jsxAttribute(e.jsxIdentifier(\"data-om-text-attrs\"),e.stringLiteral(JSON.stringify(c))))}},JSXElement(o,r){const l=o.node.openingElement;const i=l\u0026\u0026l.name\u0026\u0026l.name.name;if(i===\"__OmT\")return;if(typeof i===\"string\"\u0026\u0026t[i])return;v(o,s(r),S(r))},JSXFragment(o,r){v(o,s(r),S(r))}}}})}}const g=f?[\"transform-react-jsx-source\",d,p]:[\"transform-react-jsx-source\",d];document.querySelectorAll('script[type=\"text\/babel\"],script[type=\"text\/jsx\"]').forEach((h,y)=\u003e{const m=h.getAttribute(\"data-plugins\")||\"\";const w=g.filter((R)=\u003em.indexOf(R)\u003c0);if(w.length){h.setAttribute(\"data-plugins\",m?`${m},${w.join(\",\")}`:w.join(\",\"))}if(!h.hasAttribute(\"data-filename\")){h.setAttribute(\"data-filename\",h.getAttribute(\"src\")||`inline-${y}`)}})});var A=window.parent;var U=\"not editable here — open the project in the Claude Design editor to save\";var W=()=\u003ePromise.resolve({persisted:false,noHost:true,reason:U});var H=W;var M=\"data\/storage.json\";var z=()=\u003e{try{const n=new URL(document.baseURI);const d=n.pathname.match(\/\\\/projects\\\/([^\/]+)\\\/serve\\\/\/);if(d)return d[1];return n.hostname.split(\".\")[0]||\"\"}catch{return location.hostname.split(\".\")[0]||\"\"}};var Z=()=\u003e{try{const n=new URL(document.baseURI);const d=n.pathname.indexOf(\"\/serve\/\");if(d\u003e=0)return n.origin+n.pathname.slice(0,d+\"\/serve\/\".length)+M}catch{}return\".\/\"+M};var x=null;var N=()=\u003e{if(!x){x=fetch(Z(),{cache:\"no-store\"}).then((n)=\u003e{if(n.ok)return n.text();return n.status===404?\"\":null}).catch(()=\u003enull).then((n)=\u003e{if(n===null){x=null;return null}const d=new Map;if(!n)return d;let p;try{p=JSON.parse(n)}catch{console.warn(\"[omelette.storage] \"+M+\" is not valid JSON; treating the store as unreadable so a save cannot overwrite the \"+\"hand-edited bytes. Fix the JSON (or delete the file) to re-enable persistence.\");x=null;return null}if(p===null||typeof p!==\"object\"||Array.isArray(p)){console.warn(\"[omelette.storage] \"+M+\" doesn't hold a JSON object; treating the store as unreadable so a save cannot \"+\"overwrite the hand-edited bytes. Make the top level a JSON object to re-enable persistence.\");x=null;return null}const f=p;if(\"data\"in f){const g=f.data;if(g===null||typeof g!==\"object\"||Array.isArray(g)){console.warn(\"[omelette.storage] \"+M+' has a \"data\" field that is not a JSON object; treating the store as unreadable so a '+'save cannot overwrite the hand-edited bytes. Make \"data\" a JSON object to re-enable persistence.');x=null;return null}const h=f._meta;const y=h!==null\u0026\u0026typeof h===\"object\"?h.project:undefined;if(typeof y===\"string\"\u0026\u0026y!==\"\"\u0026\u0026y!==z())return d;for(const m of Object.keys(g))d.set(m,g[m]);return d}for(const g of Object.keys(f)){if(g!==\"_meta\")d.set(g,f[g])}return d})}return x};var F=(n)=\u003eH(M,JSON.stringify({_meta:{project:z(),version:1},data:Object.fromEntries(n)},null,2));var D=Promise.resolve();var $=(n)=\u003e{const d=D.then(n);D=d.then(()=\u003e{return},()=\u003e{return});return d};var V=\/sk-(?:ant-)?[A-Za-z0-9_-]{16,}|AKIA[0-9A-Z]{16}|gh[pousr]_[A-Za-z0-9]{20,}|xox[a-z]-[A-Za-z0-9][A-Za-z0-9-]{9,}|AIza[0-9A-Za-z_-]{30,}|-----BEGIN [A-Z ]*PRIVATE KEY-----\/;var Y=\/password|passwd|secret|api[_-]?key|access[_-]?token|auth[_-]?token|credential\/i;var Q=(n,d,p)=\u003e{if(V.test(d)||Y.test(n)\u0026\u0026typeof p===\"string\"\u0026\u0026p.length\u003e=8){console.warn('[omelette.storage] the value for \"'+n+'\" looks like a credential. The storage file is a plaintext project file — visible to '+\"everyone with project access and copied when the project is duplicated. Do not store secrets here.\")}};var q={persisted:false,reason:\"could not load the existing store — not overwriting it\"};var X={persisted:false,reason:\"stored value changed since a failed read — re-read this key before saving\"};var P=new Set;var ee={get:(n)=\u003e{if(typeof n!==\"string\"){return Promise.reject(new TypeError(\"storage.get: key must be a string\"))}return $(N).then((d)=\u003e{if(d===null){P.add(n);return null}P.delete(n);if(!d.has(n))return null;const p=d.get(n);return p==null?null:JSON.parse(JSON.stringify(p))})},set:(n,d)=\u003e{if(typeof n!==\"string\"){return Promise.reject(new TypeError(\"storage.set: key must be a string\"))}let p;try{p=JSON.stringify(d)}catch(g){return Promise.reject(new TypeError(\"storage.set: value must be JSON-serializable (\"+String(g)+\")\"))}if(p===undefined){return Promise.reject(new TypeError(\"storage.set: value must be JSON-serializable\"))}Q(n,p,d);const f=JSON.parse(p);return $(()=\u003eN().then((g)=\u003e{if(g===null)return q;if(P.has(n)){if(g.has(n))return X;P.delete(n)}g.set(n,f);return F(g)}))},delete:(n)=\u003e{if(typeof n!==\"string\"){return Promise.reject(new TypeError(\"storage.delete: key must be a string\"))}return $(()=\u003eN().then((d)=\u003e{if(d===null)return q;if(P.has(n)){if(d.has(n))return X;P.delete(n)}d.delete(n);return F(d)}))},keys:()=\u003e$(N).then((n)=\u003en===null?[]:Array.from(n.keys()))};window.omelette={writeFile:(n,d)=\u003eH(n,d).then((p)=\u003e{if(!p.persisted\u0026\u0026!p.noHost){throw new Error(p.reason||\"write failed\")}}),storage:ee};if(A\u0026\u0026A!==window){const n=(e,t)=\u003e{try{A.postMessage({__omelette_log:true,type:e,data:t},\"*\")}catch{}};[\"log\",\"warn\",\"error\"].forEach((e)=\u003e{const t=console[e];console[e]=(...a)=\u003e{const u=a.map((s)=\u003e{try{return typeof s===\"object\"?JSON.stringify(s):String(s)}catch{try{return String(s)}catch{return\"[unstringifiable]\"}}}).join(\" \");n(e,u);t.apply(console,a)}});window.addEventListener(\"error\",(e)=\u003e{const t=e.target;if(t\u0026\u0026t!==window\u0026\u0026t.tagName){const a=t.src||t.href||\"\";n(\"resource_error\",`${t.tagName} failed to load: ${a}`)}else{n(\"error\",`${e.message||\"Unknown error\"} at ${e.filename||\"?\"}:${e.lineno||0}:${e.colno||0}`)}},true);window.addEventListener(\"unhandledrejection\",(e)=\u003e{const t=e.reason;const a=t instanceof Error?`${t.message} ${t.stack}`:String(t);n(\"error\",`Unhandled rejection: ${a}`)});window.addEventListener(\"click\",(e)=\u003e{if(e.defaultPrevented||e.button!==0)return;if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;const t=e.composedPath?e.composedPath():[];const a=[\"button\",\"input\",\"select\",\"textarea\",\"summary\",\"label\"];let u=null;for(const v of t){if(!(v instanceof Element))continue;if(v.localName===\"a\"){if(!(v instanceof HTMLAnchorElement))return;u=v;break}if(a.indexOf(v.localName)!==-1)return}if(!u)return;if(u.isContentEditable)return;const s=u.closest(\"[contenteditable]\");if(s\u0026\u0026s.getAttribute(\"contenteditable\")!==\"false\")return;const S=(u.getAttribute(\"target\")||\"_self\").toLowerCase();if(S!==\"_self\"\u0026\u0026S!==\"_top\"\u0026\u0026S!==\"_parent\")return;let _;try{_=new URL(u.href)}catch{return}if(_.protocol!==\"http:\"\u0026\u0026_.protocol!==\"https:\")return;if(location.origin===\"null\")return;if(_.origin===location.origin)return;e.preventDefault();window.open(_.href,\"_blank\",\"noopener,noreferrer\")});const d=()=\u003e{try{A.postMessage({type:\"omelette:height\",height:document.documentElement.scrollHeight},\"*\")}catch{}};if(window.ResizeObserver)new ResizeObserver(d).observe(document.documentElement);const p=()=\u003e{d();if(!document.querySelector('script[type=\"text\/babel\"],script[type=\"text\/jsx\"]'))return;const e=()=\u003edocument.getElementById(\"root\")||document.querySelector(\"body \u003e div[id]\");const t=e()?.firstElementChild??null;let a=0;const u=()=\u003e{const s=e();if(s\u0026\u0026s.firstElementChild!==t||++a\u003e30){d();return}setTimeout(u,100)};setTimeout(u,100)};if(document.readyState===\"complete\")p();else window.addEventListener(\"load\",p);const f={};let g=0;const h=(e)=\u003enew Promise((t,a)=\u003e{if(!I.length){a(new Error(\"claude.complete: no parent origin\"));return}const u=`c${++g}`;const s=()=\u003esetTimeout(()=\u003e{delete f[u];a(new Error(`claude.complete: no data for ${J\/1000}s`))},J);const S=s();f[u]={resolve:t,reject:a,text:\"\",t:S,arm:s};try{for(const _ of I){A.postMessage({__om_api:true,id:u,body:e},_)}}catch(_){clearTimeout(S);delete f[u];a(_)}});const y=8;const m=async(e,t)=\u003e{if(!Array.isArray(e.messages)){throw new Error(\"claude.complete: tools require a messages array\")}const a=e.messages.slice();const u={...e,tools:e.tools.map((_)=\u003e{if(_===null||typeof _!==\"object\")return _;const v={};for(const o of Object.keys(_)){if(typeof _[o]!==\"function\")v[o]=_[o]}return v})};const s=u.tool_choice;const S=s!=null\u0026\u0026(s.type===\"any\"||s.type===\"tool\")?{...u,tool_choice:s.disable_parallel_tool_use!==undefined?{type:\"auto\",disable_parallel_tool_use:s.disable_parallel_tool_use}:{type:\"auto\"}}:u;for(let _=0;_\u003cy;_++){const v=await h({..._===0?u:S,messages:a});const o=v.message;const r=o\u0026\u0026Array.isArray(o.content)?o.content:null;const l=r?r.filter((c)=\u003ec?.type===\"tool_use\"):[];if(o?.stop_reason!==\"tool_use\"||l.length===0){return v.text}const i=[];for(const c of l){const k=t.get(c.name);if(!k){i.push({type:\"tool_result\",tool_use_id:c.id,content:`no handler for tool \"${c.name}\"`,is_error:true});continue}try{const b=await k(c.input);const E=typeof b===\"string\"?b:O(b)??\"\";i.push({type:\"tool_result\",tool_use_id:c.id,content:E})}catch(b){i.push({type:\"tool_result\",tool_use_id:c.id,content:String(b?.message??b??\"tool handler failed\"),is_error:true})}}a.push({role:\"assistant\",content:r},{role:\"user\",content:i})}throw new Error(`claude.complete: exceeded ${y} tool turns`)};window.claude={complete(e){const t=e;if(t!==null\u0026\u0026typeof t===\"object\"\u0026\u0026Array.isArray(t.tools)\u0026\u0026t.tools.some((a)=\u003ea!==null\u0026\u0026typeof a===\"object\"\u0026\u0026typeof a.run===\"function\")){const a=new Map;for(const u of t.tools){if(u!==null\u0026\u0026typeof u===\"object\"\u0026\u0026typeof u.run===\"function\"){a.set(String(u.name),u.run)}}return m(t,a)}return h(e).then((a)=\u003ea.text)}};const w={};let R=0;H=(e,t)=\u003enew Promise((a)=\u003e{if(!I.length){a({persisted:false,noHost:true,reason:U});return}const u=`f${++R}`;const s=setTimeout(()=\u003e{delete w[u];a({persisted:false,noHost:true,reason:U})},G);w[u]={settle:a,t:s};try{for(const S of I){A.postMessage({__om_file:true,id:u,op:\"write\",path:e,content:t},S)}}catch{clearTimeout(s);delete w[u];a({persisted:false,noHost:true,reason:U})}});const O=(e)=\u003e{try{return JSON.stringify(e)}catch{return JSON.stringify(String(e))}};window.addEventListener(\"message\",(e)=\u003e{if(I.indexOf(e.origin)\u003c0)return;if(e.source!==A)return;const t=e.data;if(!t)return;if(t.type===\"omelette-preview-refresh\"){if(typeof t.token!==\"string\"||!\/^[0-9a-f.-]+(\\.(rc|pr-[0-9]+))?(\\.[0-9]+\\.[0-9a-f]{16})?$\/.test(t.token))return;const s=Math.max(1,Math.floor((t.expiresAt||0)-Date.now()\/1000));document.cookie=\"__Host-omelette-preview=\"+t.token+\"; Path=\/; Secure; SameSite=None; Partitioned; Max-Age=\"+s;C();return}if(t.__om_file_r){const s=w[t.id];if(!s)return;clearTimeout(s.t);delete w[t.id];s.settle(t.ok?{persisted:true}:{persisted:false,reason:t.error||\"write failed\"});return}if(t.__om_api_r){const s=f[t.id];if(!s)return;if(t.error!=null){clearTimeout(s.t);delete f[t.id];s.reject(new Error(t.error));return}if(t.chunk!=null){clearTimeout(s.t);s.t=s.arm();s.text+=t.chunk;return}if(t.done){clearTimeout(s.t);delete f[t.id];s.resolve({text:t.text!=null?t.text:s.text,message:t.message});return}return}if(!t.__om_eval)return;const a=t;const u=(s)=\u003e{e.source.postMessage({...s,__om_eval_r:1,id:a.id},e.origin)};try{const s=(0,eval)(a.code);if(s\u0026\u0026typeof s.then===\"function\"){s.then((S)=\u003eu({ok:1,v:O(S)}),(S)=\u003eu({ok:0,e:String(S)}))}else{u({ok:1,v:O(s)})}}catch(s){u({ok:0,e:String(s)})}})}})();\n\u003c\/script\u003e\n\u003cp\u003e\u003cstrong\u003eThe Quiet One\u003c\/strong\u003e · Calming body oil · 100 mL\u003c\/p\u003e\n\u003ch2\u003eFor nights you need to slow down.\u003c\/h2\u003e\n\u003cp\u003eWarm lavender and soft chamomile, with a little mandarin. It feels like the lights going down. It absorbs completely, so you can go straight to bed with nothing left on your sheets.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c\/strong\u003e Evening · after a bath or shower\u003c\/p\u003e\n\u003ch3\u003eBenefits\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eHelps you switch off.\u003c\/strong\u003e A calming scent that tells your body the day is done.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSofter skin by morning.\u003c\/strong\u003e Apricot kernel and olive oil sink in overnight.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eNever greasy.\u003c\/strong\u003e Absorbs fully into damp skin in under a minute.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eGentle on sensitive skin.\u003c\/strong\u003e Calendula is a classic for skin that needs comfort.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\"I love these oils! The calming body oil smells delightful - very lavender.\"\u003c\/p\u003e\n\u003cp\u003e★★★★★ Verified customer\u003c\/p\u003e\n\u003c\/blockquote\u003e\n\u003ch3\u003eYour ritual\u003c\/h3\u003e\n\u003col\u003e\n  \u003cli\u003eRun a warm bath or shower and dim the lights.\u003c\/li\u003e\n  \u003cli\u003eWarm a little oil between your palms. Cup your hands to your face and take three slow breaths.\u003c\/li\u003e\n  \u003cli\u003ePress into damp skin, from feet to shoulders. Go slowly.\u003c\/li\u003e\n\u003c\/ol\u003e\n\u003cp\u003e\u003cstrong\u003eTip:\u003c\/strong\u003e Use it on the same nights each week, so your body learns it means rest.\u003c\/p\u003e\n\u003ch3\u003eKey ingredients\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eLavender\u003c\/strong\u003e: calming, familiar, the scent of sleep\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eChamomile\u003c\/strong\u003e: soft and comforting\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCalendula\u003c\/strong\u003e: for skin that needs a little care\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eApricot kernel\u003c\/strong\u003e: light and fast-absorbing\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3\u003eWhy Nourish\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePlant oils, essential oils and certified-organic ingredients.\u003c\/strong\u003e No water and no fillers. Every ingredient is listed below.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eHand-poured in small batches\u003c\/strong\u003e in the Illawarra, NSW. Australian Made.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eMade to absorb.\u003c\/strong\u003e Pressed into damp skin, it sinks in fully. No greasy towels.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eEvery bottle creates work.\u003c\/strong\u003e We're on our way to 5,000 bottles and paid jobs for local women.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFree shipping on orders over $70.\u003c\/strong\u003e Hand-poured and posted from Wollongong, NSW.\u003c\/p\u003e\n\u003ch3\u003eFull ingredients\u003c\/h3\u003e\n\u003cp\u003ePrunus Armeniaca (Apricot) Kernel Oil, Helianthus Annuus (Sunflower) Seed Oil*, Olea Europaea (Olive) Oil, Citrus Nobilis Peel Oil, Matricaria Recutita (Chamomile) Flower Oil, Lavandula Angustifolia (Lavender) Oil, Calendula Officinalis Flower Extract, Tocopherol. *Organic\u003c\/p\u003e\n\u003ch3\u003eCaution\u003c\/h3\u003e\n\u003cp\u003eExternal use only. Patch test first. Avoid eyes. Stop if irritation occurs. Keep out of reach of children. Contains nut oil.\u003c\/p\u003e\n\u003cp\u003e\u003cem\u003eCare that goes deeper than your skin.\u003c\/em\u003e\u003c\/p\u003e\n","brand":"Nourish Oils","offers":[{"title":"Default Title","offer_id":41301872083040,"sku":"100","price":37.0,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0588\/4716\/6560\/files\/Unwind_Chamomile_BodyOil_2.jpg?v=1787638336"},{"product_id":"heal-body-and-massage-oil","title":"Heal","description":"\u003cstyle data-omelette-injected\u003ehtml,body{background:transparent}\u003c\/style\u003e\u003cscript data-omelette-injected\u003e(()=\u003e{{const n=new URLSearchParams(location.search).get(\"theme\");if(n===\"light\"||n===\"dark\"){document.documentElement.dataset.theme=n}}{if(new URLSearchParams(location.search).get(\"_omthumb\")===\"1\"){const n=(f)=\u003e{const g=f.focus;if(!g)return;f.focus=function(h){g.call(this,{...h,preventScroll:true})}};n(HTMLElement.prototype);n(SVGElement.prototype);if(typeof MathMLElement!==\"undefined\"){n(MathMLElement.prototype)}const d=(f)=\u003e{f.removeAttribute(\"autofocus\");f.inert=true;if(!(f instanceof HTMLElement))f.removeAttribute(\"tabindex\")};const p=(f)=\u003e{if(f.hasAttribute(\"autofocus\"))d(f);for(const g of f.querySelectorAll(\"[autofocus]\")){d(g)}};p(document.documentElement);new MutationObserver((f)=\u003e{for(const g of f){for(const h of g.addedNodes){if(h.nodeType===1)p(h)}}}).observe(document,{childList:true,subtree:true})}}{const n=()=\u003e{try{if(document.querySelector('meta[name=\"color-scheme\"]'))return;const d=getComputedStyle(document.documentElement).getPropertyValue(\"color-scheme\").trim();if(d\u0026\u0026d!==\"normal\")return;const p=(y)=\u003e{if(!y)return null;const m=getComputedStyle(y).backgroundColor.match(\/^rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)(?:[,\\s\/]+([\\d.]+%?))?\\s*\\)$\/);if(!m)return null;const w=m[4]==null?1:parseFloat(m[4])\/(m[4].endsWith(\"%\")?100:1);if(w\u003c0.99)return null;return[+m[1],+m[2],+m[3]]};const f=p(document.body)||p(document.documentElement);if(!f)return;const g=(y)=\u003e{const m=y\/255;return m\u003c=0.04045?m\/12.92:((m+0.055)\/1.055)**2.4};const h=0.2126*g(f[0])+0.7152*g(f[1])+0.0722*g(f[2]);document.documentElement.style.setProperty(\"color-scheme\",h\u003c0.4?\"dark\":\"light\")}catch{}};if(document.readyState===\"complete\")n();else window.addEventListener(\"load\",n)}var I=[\"https:\/\/claude.ai\",\"https:\/\/preview.claude.ai\",\"https:\/\/38380527-3032-478f-ab8c-9c463b248443.claudeusercontent.com\"];var B=true;var K=false;var C=()=\u003e{};if(K===true){try{const n=setTimeout.bind(window);const d=1e4;const p=15;const f=1e4;const g=120000;const h=200;const y=(o)=\u003e{try{let r;if(typeof o===\"string\")r=o;else if(o instanceof URL)r=o.href;else if(typeof Request!==\"undefined\"\u0026\u0026o instanceof Request)r=o.url;else return null;if(!r)return null;const l=document.baseURI;const i=new URL(r,l);if(i.protocol!==\"http:\"\u0026\u0026i.protocol!==\"https:\")return null;if(i.origin!==new URL(l).origin)return null;return i.origin+i.pathname}catch{return null}};const m=new Map;const w=(o)=\u003e{let r=m.get(o);if(!r){if(m.size\u003e=h){const l=m.keys().next().value;if(l!==undefined)m.delete(l)}r={fails:[],until:0,cooldown:f,hard:false};m.set(o,r)}return r};const R=(o)=\u003e{const r=m.get(o);return r!==undefined\u0026\u0026r.until\u003eDate.now()};const O=(o,r)=\u003e{const l=Date.now();const i=w(o);if(r)i.hard=true;if(i.until\u003el)return;i.fails.push(l);while(i.fails.length\u003e0\u0026\u0026i.fails[0]\u003c=l-d)i.fails.shift();if(i.fails.length\u003e=p){i.until=l+i.cooldown;if(i.hard)i.cooldown=Math.min(i.cooldown*2,g);i.fails.length=0;try{n(()=\u003e{try{S(true)}catch{}},i.until-l+100)}catch{}console.warn(\"[omelette] asset circuit breaker: pausing requests to \"+o+\" for \"+Math.round((i.until-l)\/1000)+\"s after \"+p+\" failures in \"+d\/1000+\"s\")}};const e=(o)=\u003e{m.delete(o)};const t=100;const a=new WeakMap;const u=new Set;let s=null;const S=(o)=\u003e{for(const r of Array.from(u)){try{const l=a.get(r);if(l===undefined){u.delete(r);continue}if(o){const i=y(l);if(i!==null\u0026\u0026R(i))continue}a.delete(r);u.delete(r);if(s!==null)s.call(r,l)}catch{}}};C=()=\u003e{try{m.clear();S(false)}catch{}};document.addEventListener(\"visibilitychange\",()=\u003e{if(document.visibilityState===\"visible\")C()});const _=window.fetch;if(typeof _===\"function\"){const o=function(...r){let l=null;try{l=y(r[0])}catch{}if(l!==null\u0026\u0026R(l)){let c;try{if(r[1]\u0026\u0026r[1].signal!==undefined){c=r[1].signal||undefined}else if(typeof Request!==\"undefined\"\u0026\u0026r[0]instanceof Request){c=r[0].signal||undefined}}catch{c=undefined}return new Promise((k,b)=\u003e{const E=()=\u003e{try{return c.reason!==undefined?c.reason:new DOMException(\"The operation was aborted.\",\"AbortError\")}catch{return new DOMException(\"The operation was aborted.\",\"AbortError\")}};try{if(c\u0026\u0026c.aborted){b(E());return}}catch{}let T=false;const j=()=\u003e{if(T)return;T=true;b(E())};try{if(c)c.addEventListener(\"abort\",j,{once:true})}catch{}n(()=\u003e{if(T)return;T=true;try{if(c)c.removeEventListener(\"abort\",j)}catch{}let L;try{L=new Response(null,{status:429,statusText:\"Too Many Requests\",headers:{\"Retry-After\":\"10\"}})}catch{L={ok:false,status:429}}k(L)},250)})}const i=_.apply(window,r);if(l!==null){const c=l;i.then((k)=\u003e{try{if(k.ok)e(c);else if(k.status===401||k.status===403||k.status===404||k.status===429){O(c,k.status!==404)}}catch{}},()=\u003e{})}return i};window.fetch=o}const v=Object.getOwnPropertyDescriptor(HTMLImageElement.prototype,\"src\");if(v!==undefined\u0026\u0026v.set!==undefined\u0026\u0026v.get!==undefined){const o=v.set;s=o;Object.defineProperty(HTMLImageElement.prototype,\"src\",{configurable:true,enumerable:v.enumerable,get:v.get,set(r){const l=`${r}`;try{const i=y(l);if(i!==null\u0026\u0026R(i)){a.set(this,l);if(u.size\u003ct)u.add(this);return}}catch{}try{a.delete(this);u.delete(this)}catch{}o.call(this,l)}})}try{const o=HTMLImageElement.prototype.setAttribute;HTMLImageElement.prototype.setAttribute=function(r,l){if(arguments.length\u003c2){o.apply(this,arguments);return}if(typeof r===\"string\"\u0026\u0026r.toLowerCase()===\"src\"){const i=`${l}`;try{const c=y(i);if(c!==null\u0026\u0026R(c)){a.set(this,i);if(u.size\u003ct)u.add(this);return}a.delete(this);u.delete(this)}catch{}o.call(this,r,i);return}o.call(this,r,l)}}catch{}window.addEventListener(\"error\",(o)=\u003e{try{const r=o.target;if(r instanceof HTMLImageElement){const l=y(r.currentSrc||r.src||\"\");if(l!==null)O(l,true)}}catch{}},true);window.addEventListener(\"load\",(o)=\u003e{try{const r=o.target;if(r instanceof HTMLImageElement){const l=y(r.currentSrc||r.src||\"\");if(l!==null)e(l);const i=a.get(r);if(i!==undefined){let c=false;try{c=new URL(i,document.baseURI).href===new URL(r.currentSrc||r.src||\"\",document.baseURI).href}catch{c=false}if(c){a.delete(r);u.delete(r)}}}}catch{}},true)}catch{}}var J=30000;var G=3000;document.addEventListener(\"DOMContentLoaded\",()=\u003e{const n=window.Babel;const d=\"om-src-id\";if(n\u0026\u0026n.registerPlugin\u0026\u0026!(n.availablePlugins\u0026\u0026n.availablePlugins[d])){n.registerPlugin(d,({types:h})=\u003e({visitor:{JSXOpeningElement(y,m){const w=y.node;if(w.name\u0026\u0026w.name.type===\"JSXMemberExpression\")return;for(let t=0;t\u003cw.attributes.length;t++){const a=w.attributes[t];if(a.type===\"JSXAttribute\"\u0026\u0026a.name\u0026\u0026a.name.name===\"data-om-id\")return}const R=m.file\u0026\u0026m.file.opts\u0026\u0026m.file.opts.filename||\"?\";const O=w.loc\u0026\u0026w.loc.start;const e=`jsx:${R}:${w.start??0}:${O?O.line:0}:${O?O.column+1:0}`;w.attributes.push(h.jsxAttribute(h.jsxIdentifier(\"data-om-id\"),h.stringLiteral(e)))}}}))}const p=\"om-text-extract\";let f=false;if(B\u0026\u0026n\u0026\u0026n.registerPlugin\u0026\u0026!(n.availablePlugins\u0026\u0026n.availablePlugins[p])){const h=window.React;if(h\u0026\u0026h.useSyncExternalStore\u0026\u0026h.createElement){f=true;const y={};const m=new Set;let w=0;window.__omTextO=y;window.__omTextSet=(e)=\u003e{for(const t in e){const a=e[t];if(a==null)delete y[t];else y[t]=a}w++;m.forEach((t)=\u003et())};const R=(e)=\u003e{m.add(e);return()=\u003em.delete(e)};const O=()=\u003ew;window.__OmT=function e(t){h.useSyncExternalStore(R,O,O);return h.createElement(\"span\",{\"data-om-text\":t.i,className:\"__om-t\"},t.i in y?y[t.i]:t.children)};n.registerPlugin(p,({types:e})=\u003e{const t={style:1,script:1,noscript:1,textarea:1,title:1,option:1,text:1,tspan:1,textPath:1};const a={placeholder:1,alt:1,title:1,label:1,\"aria-label\":1,\"aria-description\":1,\"aria-placeholder\":1};const u=(o,r)=\u003ee.logicalExpression(\"??\",e.memberExpression(e.logicalExpression(\"||\",e.memberExpression(e.identifier(\"window\"),e.identifier(\"__omTextO\")),e.objectExpression([])),e.stringLiteral(o),true),r);const s=(o)=\u003eo.file\u0026\u0026o.file.opts\u0026\u0026o.file.opts.filename||\"?\";const S=(o)=\u003eo.file\u0026\u0026o.file.code||\"\";const _=(o,r)=\u003e{const l=(c)=\u003ec\u0026\u0026c.start!=null\u0026\u0026c.end!=null\u0026\u0026(c.type===\"StringLiteral\"||c.type===\"TemplateLiteral\"\u0026\u0026c.expressions.length===0)?[c.start,c.end]:null;const i=l(r);if(i)return i;if(r\u0026\u0026r.type===\"Identifier\"){const c=o.scope.getBinding(r.name);if(c\u0026\u0026c.constant\u0026\u0026c.path.node.type===\"VariableDeclarator\"){return l(c.path.node.init)}}return null};const v=(o,r,l)=\u003e{const i=o.node;let c=false;const k=(E,T)=\u003e{c=true;return e.jsxElement(e.jsxOpeningElement(e.jsxIdentifier(\"__OmT\"),[e.jsxAttribute(e.jsxIdentifier(\"i\"),e.stringLiteral(E))],false),e.jsxClosingElement(e.jsxIdentifier(\"__OmT\")),[T],false)};const b=i.children.map((E)=\u003e{if(E.type===\"JSXText\"){if(E.start==null||E.end==null)return E;const T=l.slice(E.start,E.end);const j=T.length-T.trimStart().length;const L=T.length-T.trimEnd().length;if(j+L\u003e=T.length)return E;return k(`txt:${r}:${E.start+j}:${E.end-L}`,E)}if(E.type===\"JSXExpressionContainer\"){const T=_(o,E.expression);if(T)return k(`str:${r}:${T[0]}:${T[1]}`,E)}return E});if(c)i.children=b};return{visitor:{JSXOpeningElement(o,r){const l=o.node;const i=s(r);const c={};for(let k=0;k\u003cl.attributes.length;k++){const b=l.attributes[k];if(b.type!==\"JSXAttribute\"||!b.name)continue;const E=b.name.name;if(!a[E])continue;if(!b.value||b.value.type!==\"StringLiteral\")continue;if(b.value.start==null||b.value.end==null)continue;const T=`txt:${i}:${b.value.start}:${b.value.end}`;c[E]=T;b.value=e.jsxExpressionContainer(u(T,e.stringLiteral(b.value.value)))}if(Object.keys(c).length){l.attributes.push(e.jsxAttribute(e.jsxIdentifier(\"data-om-text-attrs\"),e.stringLiteral(JSON.stringify(c))))}},JSXElement(o,r){const l=o.node.openingElement;const i=l\u0026\u0026l.name\u0026\u0026l.name.name;if(i===\"__OmT\")return;if(typeof i===\"string\"\u0026\u0026t[i])return;v(o,s(r),S(r))},JSXFragment(o,r){v(o,s(r),S(r))}}}})}}const g=f?[\"transform-react-jsx-source\",d,p]:[\"transform-react-jsx-source\",d];document.querySelectorAll('script[type=\"text\/babel\"],script[type=\"text\/jsx\"]').forEach((h,y)=\u003e{const m=h.getAttribute(\"data-plugins\")||\"\";const w=g.filter((R)=\u003em.indexOf(R)\u003c0);if(w.length){h.setAttribute(\"data-plugins\",m?`${m},${w.join(\",\")}`:w.join(\",\"))}if(!h.hasAttribute(\"data-filename\")){h.setAttribute(\"data-filename\",h.getAttribute(\"src\")||`inline-${y}`)}})});var A=window.parent;var U=\"not editable here — open the project in the Claude Design editor to save\";var W=()=\u003ePromise.resolve({persisted:false,noHost:true,reason:U});var H=W;var M=\"data\/storage.json\";var z=()=\u003e{try{const n=new URL(document.baseURI);const d=n.pathname.match(\/\\\/projects\\\/([^\/]+)\\\/serve\\\/\/);if(d)return d[1];return n.hostname.split(\".\")[0]||\"\"}catch{return location.hostname.split(\".\")[0]||\"\"}};var Z=()=\u003e{try{const n=new URL(document.baseURI);const d=n.pathname.indexOf(\"\/serve\/\");if(d\u003e=0)return n.origin+n.pathname.slice(0,d+\"\/serve\/\".length)+M}catch{}return\".\/\"+M};var x=null;var N=()=\u003e{if(!x){x=fetch(Z(),{cache:\"no-store\"}).then((n)=\u003e{if(n.ok)return n.text();return n.status===404?\"\":null}).catch(()=\u003enull).then((n)=\u003e{if(n===null){x=null;return null}const d=new Map;if(!n)return d;let p;try{p=JSON.parse(n)}catch{console.warn(\"[omelette.storage] \"+M+\" is not valid JSON; treating the store as unreadable so a save cannot overwrite the \"+\"hand-edited bytes. Fix the JSON (or delete the file) to re-enable persistence.\");x=null;return null}if(p===null||typeof p!==\"object\"||Array.isArray(p)){console.warn(\"[omelette.storage] \"+M+\" doesn't hold a JSON object; treating the store as unreadable so a save cannot \"+\"overwrite the hand-edited bytes. Make the top level a JSON object to re-enable persistence.\");x=null;return null}const f=p;if(\"data\"in f){const g=f.data;if(g===null||typeof g!==\"object\"||Array.isArray(g)){console.warn(\"[omelette.storage] \"+M+' has a \"data\" field that is not a JSON object; treating the store as unreadable so a '+'save cannot overwrite the hand-edited bytes. Make \"data\" a JSON object to re-enable persistence.');x=null;return null}const h=f._meta;const y=h!==null\u0026\u0026typeof h===\"object\"?h.project:undefined;if(typeof y===\"string\"\u0026\u0026y!==\"\"\u0026\u0026y!==z())return d;for(const m of Object.keys(g))d.set(m,g[m]);return d}for(const g of Object.keys(f)){if(g!==\"_meta\")d.set(g,f[g])}return d})}return x};var F=(n)=\u003eH(M,JSON.stringify({_meta:{project:z(),version:1},data:Object.fromEntries(n)},null,2));var D=Promise.resolve();var $=(n)=\u003e{const d=D.then(n);D=d.then(()=\u003e{return},()=\u003e{return});return d};var V=\/sk-(?:ant-)?[A-Za-z0-9_-]{16,}|AKIA[0-9A-Z]{16}|gh[pousr]_[A-Za-z0-9]{20,}|xox[a-z]-[A-Za-z0-9][A-Za-z0-9-]{9,}|AIza[0-9A-Za-z_-]{30,}|-----BEGIN [A-Z ]*PRIVATE KEY-----\/;var Y=\/password|passwd|secret|api[_-]?key|access[_-]?token|auth[_-]?token|credential\/i;var Q=(n,d,p)=\u003e{if(V.test(d)||Y.test(n)\u0026\u0026typeof p===\"string\"\u0026\u0026p.length\u003e=8){console.warn('[omelette.storage] the value for \"'+n+'\" looks like a credential. The storage file is a plaintext project file — visible to '+\"everyone with project access and copied when the project is duplicated. Do not store secrets here.\")}};var q={persisted:false,reason:\"could not load the existing store — not overwriting it\"};var X={persisted:false,reason:\"stored value changed since a failed read — re-read this key before saving\"};var P=new Set;var ee={get:(n)=\u003e{if(typeof n!==\"string\"){return Promise.reject(new TypeError(\"storage.get: key must be a string\"))}return $(N).then((d)=\u003e{if(d===null){P.add(n);return null}P.delete(n);if(!d.has(n))return null;const p=d.get(n);return p==null?null:JSON.parse(JSON.stringify(p))})},set:(n,d)=\u003e{if(typeof n!==\"string\"){return Promise.reject(new TypeError(\"storage.set: key must be a string\"))}let p;try{p=JSON.stringify(d)}catch(g){return Promise.reject(new TypeError(\"storage.set: value must be JSON-serializable (\"+String(g)+\")\"))}if(p===undefined){return Promise.reject(new TypeError(\"storage.set: value must be JSON-serializable\"))}Q(n,p,d);const f=JSON.parse(p);return $(()=\u003eN().then((g)=\u003e{if(g===null)return q;if(P.has(n)){if(g.has(n))return X;P.delete(n)}g.set(n,f);return F(g)}))},delete:(n)=\u003e{if(typeof n!==\"string\"){return Promise.reject(new TypeError(\"storage.delete: key must be a string\"))}return $(()=\u003eN().then((d)=\u003e{if(d===null)return q;if(P.has(n)){if(d.has(n))return X;P.delete(n)}d.delete(n);return F(d)}))},keys:()=\u003e$(N).then((n)=\u003en===null?[]:Array.from(n.keys()))};window.omelette={writeFile:(n,d)=\u003eH(n,d).then((p)=\u003e{if(!p.persisted\u0026\u0026!p.noHost){throw new Error(p.reason||\"write failed\")}}),storage:ee};if(A\u0026\u0026A!==window){const n=(e,t)=\u003e{try{A.postMessage({__omelette_log:true,type:e,data:t},\"*\")}catch{}};[\"log\",\"warn\",\"error\"].forEach((e)=\u003e{const t=console[e];console[e]=(...a)=\u003e{const u=a.map((s)=\u003e{try{return typeof s===\"object\"?JSON.stringify(s):String(s)}catch{try{return String(s)}catch{return\"[unstringifiable]\"}}}).join(\" \");n(e,u);t.apply(console,a)}});window.addEventListener(\"error\",(e)=\u003e{const t=e.target;if(t\u0026\u0026t!==window\u0026\u0026t.tagName){const a=t.src||t.href||\"\";n(\"resource_error\",`${t.tagName} failed to load: ${a}`)}else{n(\"error\",`${e.message||\"Unknown error\"} at ${e.filename||\"?\"}:${e.lineno||0}:${e.colno||0}`)}},true);window.addEventListener(\"unhandledrejection\",(e)=\u003e{const t=e.reason;const a=t instanceof Error?`${t.message} ${t.stack}`:String(t);n(\"error\",`Unhandled rejection: ${a}`)});window.addEventListener(\"click\",(e)=\u003e{if(e.defaultPrevented||e.button!==0)return;if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;const t=e.composedPath?e.composedPath():[];const a=[\"button\",\"input\",\"select\",\"textarea\",\"summary\",\"label\"];let u=null;for(const v of t){if(!(v instanceof Element))continue;if(v.localName===\"a\"){if(!(v instanceof HTMLAnchorElement))return;u=v;break}if(a.indexOf(v.localName)!==-1)return}if(!u)return;if(u.isContentEditable)return;const s=u.closest(\"[contenteditable]\");if(s\u0026\u0026s.getAttribute(\"contenteditable\")!==\"false\")return;const S=(u.getAttribute(\"target\")||\"_self\").toLowerCase();if(S!==\"_self\"\u0026\u0026S!==\"_top\"\u0026\u0026S!==\"_parent\")return;let _;try{_=new URL(u.href)}catch{return}if(_.protocol!==\"http:\"\u0026\u0026_.protocol!==\"https:\")return;if(location.origin===\"null\")return;if(_.origin===location.origin)return;e.preventDefault();window.open(_.href,\"_blank\",\"noopener,noreferrer\")});const d=()=\u003e{try{A.postMessage({type:\"omelette:height\",height:document.documentElement.scrollHeight},\"*\")}catch{}};if(window.ResizeObserver)new ResizeObserver(d).observe(document.documentElement);const p=()=\u003e{d();if(!document.querySelector('script[type=\"text\/babel\"],script[type=\"text\/jsx\"]'))return;const e=()=\u003edocument.getElementById(\"root\")||document.querySelector(\"body \u003e div[id]\");const t=e()?.firstElementChild??null;let a=0;const u=()=\u003e{const s=e();if(s\u0026\u0026s.firstElementChild!==t||++a\u003e30){d();return}setTimeout(u,100)};setTimeout(u,100)};if(document.readyState===\"complete\")p();else window.addEventListener(\"load\",p);const f={};let g=0;const h=(e)=\u003enew Promise((t,a)=\u003e{if(!I.length){a(new Error(\"claude.complete: no parent origin\"));return}const u=`c${++g}`;const s=()=\u003esetTimeout(()=\u003e{delete f[u];a(new Error(`claude.complete: no data for ${J\/1000}s`))},J);const S=s();f[u]={resolve:t,reject:a,text:\"\",t:S,arm:s};try{for(const _ of I){A.postMessage({__om_api:true,id:u,body:e},_)}}catch(_){clearTimeout(S);delete f[u];a(_)}});const y=8;const m=async(e,t)=\u003e{if(!Array.isArray(e.messages)){throw new Error(\"claude.complete: tools require a messages array\")}const a=e.messages.slice();const u={...e,tools:e.tools.map((_)=\u003e{if(_===null||typeof _!==\"object\")return _;const v={};for(const o of Object.keys(_)){if(typeof _[o]!==\"function\")v[o]=_[o]}return v})};const s=u.tool_choice;const S=s!=null\u0026\u0026(s.type===\"any\"||s.type===\"tool\")?{...u,tool_choice:s.disable_parallel_tool_use!==undefined?{type:\"auto\",disable_parallel_tool_use:s.disable_parallel_tool_use}:{type:\"auto\"}}:u;for(let _=0;_\u003cy;_++){const v=await h({..._===0?u:S,messages:a});const o=v.message;const r=o\u0026\u0026Array.isArray(o.content)?o.content:null;const l=r?r.filter((c)=\u003ec?.type===\"tool_use\"):[];if(o?.stop_reason!==\"tool_use\"||l.length===0){return v.text}const i=[];for(const c of l){const k=t.get(c.name);if(!k){i.push({type:\"tool_result\",tool_use_id:c.id,content:`no handler for tool \"${c.name}\"`,is_error:true});continue}try{const b=await k(c.input);const E=typeof b===\"string\"?b:O(b)??\"\";i.push({type:\"tool_result\",tool_use_id:c.id,content:E})}catch(b){i.push({type:\"tool_result\",tool_use_id:c.id,content:String(b?.message??b??\"tool handler failed\"),is_error:true})}}a.push({role:\"assistant\",content:r},{role:\"user\",content:i})}throw new Error(`claude.complete: exceeded ${y} tool turns`)};window.claude={complete(e){const t=e;if(t!==null\u0026\u0026typeof t===\"object\"\u0026\u0026Array.isArray(t.tools)\u0026\u0026t.tools.some((a)=\u003ea!==null\u0026\u0026typeof a===\"object\"\u0026\u0026typeof a.run===\"function\")){const a=new Map;for(const u of t.tools){if(u!==null\u0026\u0026typeof u===\"object\"\u0026\u0026typeof u.run===\"function\"){a.set(String(u.name),u.run)}}return m(t,a)}return h(e).then((a)=\u003ea.text)}};const w={};let R=0;H=(e,t)=\u003enew Promise((a)=\u003e{if(!I.length){a({persisted:false,noHost:true,reason:U});return}const u=`f${++R}`;const s=setTimeout(()=\u003e{delete w[u];a({persisted:false,noHost:true,reason:U})},G);w[u]={settle:a,t:s};try{for(const S of I){A.postMessage({__om_file:true,id:u,op:\"write\",path:e,content:t},S)}}catch{clearTimeout(s);delete w[u];a({persisted:false,noHost:true,reason:U})}});const O=(e)=\u003e{try{return JSON.stringify(e)}catch{return JSON.stringify(String(e))}};window.addEventListener(\"message\",(e)=\u003e{if(I.indexOf(e.origin)\u003c0)return;if(e.source!==A)return;const t=e.data;if(!t)return;if(t.type===\"omelette-preview-refresh\"){if(typeof t.token!==\"string\"||!\/^[0-9a-f.-]+(\\.(rc|pr-[0-9]+))?(\\.[0-9]+\\.[0-9a-f]{16})?$\/.test(t.token))return;const s=Math.max(1,Math.floor((t.expiresAt||0)-Date.now()\/1000));document.cookie=\"__Host-omelette-preview=\"+t.token+\"; Path=\/; Secure; SameSite=None; Partitioned; Max-Age=\"+s;C();return}if(t.__om_file_r){const s=w[t.id];if(!s)return;clearTimeout(s.t);delete w[t.id];s.settle(t.ok?{persisted:true}:{persisted:false,reason:t.error||\"write failed\"});return}if(t.__om_api_r){const s=f[t.id];if(!s)return;if(t.error!=null){clearTimeout(s.t);delete f[t.id];s.reject(new Error(t.error));return}if(t.chunk!=null){clearTimeout(s.t);s.t=s.arm();s.text+=t.chunk;return}if(t.done){clearTimeout(s.t);delete f[t.id];s.resolve({text:t.text!=null?t.text:s.text,message:t.message});return}return}if(!t.__om_eval)return;const a=t;const u=(s)=\u003e{e.source.postMessage({...s,__om_eval_r:1,id:a.id},e.origin)};try{const s=(0,eval)(a.code);if(s\u0026\u0026typeof s.then===\"function\"){s.then((S)=\u003eu({ok:1,v:O(S)}),(S)=\u003eu({ok:0,e:String(S)}))}else{u({ok:1,v:O(s)})}}catch(s){u({ok:0,e:String(s)})}})}})();\n\u003c\/script\u003e\n\u003cp\u003e\u003cstrong\u003eThe Steady One\u003c\/strong\u003e · Recovery body oil · 100 mL\u003c\/p\u003e\n\u003ch2\u003eFor muscles that carried the day.\u003c\/h2\u003e\n\u003cp\u003eGreen and herbal, with eucalyptus, peppermint and Australian kunzea. You feel the cool tingle as soon as it goes on. Made for nurses, tradies, mums and anyone on their feet all day.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c\/strong\u003e After training or a long shift\u003c\/p\u003e\n\u003ch3\u003eBenefits\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eComfort for tired muscles.\u003c\/strong\u003e Arnica has been used in massage for generations.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eA cooling feel.\u003c\/strong\u003e Peppermint and eucalyptus you notice straight away.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eMade with Australian natives.\u003c\/strong\u003e Kunzea grows wild along the NSW coast.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eA proper massage oil.\u003c\/strong\u003e Enough slip to work into shoulders, backs and calves.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3\u003eYour ritual\u003c\/h3\u003e\n\u003col\u003e\n  \u003cli\u003eWarm a few pumps between your palms.\u003c\/li\u003e\n  \u003cli\u003eMassage firmly into shoulders, neck, back or calves, in slow circles.\u003c\/li\u003e\n  \u003cli\u003eBreathe in the eucalyptus and keep going until it has absorbed.\u003c\/li\u003e\n\u003c\/ol\u003e\n\u003cp\u003e\u003cstrong\u003eTip:\u003c\/strong\u003e Use it after training or a long shift, while your muscles are still warm.\u003c\/p\u003e\n\u003ch3\u003eKey ingredients\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eArnica\u003c\/strong\u003e: a classic massage ingredient\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eKunzea\u003c\/strong\u003e: Australian native, fresh and herbal\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eEucalyptus and peppermint\u003c\/strong\u003e: cool and clearing\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eHemp seed\u003c\/strong\u003e: rich and nourishing\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3\u003eWhy Nourish\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePlant oils, essential oils and certified-organic ingredients.\u003c\/strong\u003e No water and no fillers. Every ingredient is listed below.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eHand-poured in small batches\u003c\/strong\u003e in the Illawarra, NSW. Australian Made.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eMade to absorb.\u003c\/strong\u003e Pressed into damp skin, it sinks in fully. No greasy towels.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eEvery bottle creates work.\u003c\/strong\u003e We're on our way to 5,000 bottles and paid jobs for local women.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFree shipping on orders over $70.\u003c\/strong\u003e Hand-poured and posted from Wollongong, NSW.\u003c\/p\u003e\n\u003ch3\u003eFull ingredients\u003c\/h3\u003e\n\u003cp\u003eHelianthus Annuus (Sunflower) Seed Oil, Simmondsia Chinensis (Jojoba) Seed Oil, Cannabis Sativa (Hemp) Seed Oil, Arnica Montana Flower Extract, Eucalyptus Globulus Leaf Oil, Mentha Piperita (Peppermint) Oil, Helichrysum Italicum Flower Oil, Caprylic\/Capric Triglyceride, Prunus Amygdalus Dulcis (Sweet Almond) Oil, Kunzea Ambigua Leaf Oil, Tocopherol.\u003c\/p\u003e\n\u003ch3\u003eCaution\u003c\/h3\u003e\n\u003cp\u003eExternal use only. Patch test first. Avoid eyes. Stop if irritation occurs. Keep out of reach of children. Do not apply to broken skin. Contains nut oil.\u003c\/p\u003e\n\u003cp\u003e\u003cem\u003eCare that goes deeper than your skin.\u003c\/em\u003e\u003c\/p\u003e\n","brand":"Nourish Oils","offers":[{"title":"Default Title","offer_id":42688098762848,"sku":"100","price":37.0,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0588\/4716\/6560\/files\/heal-body-and-massage-oil_7d435ff4-e3f4-4e7d-b84b-dc10d0088e13.jpg?v=1756950141"},{"product_id":"super-anti-ageing-face-elixir","title":"Super Face Elixir","description":"\u003cstyle data-omelette-injected\u003ehtml,body{background:transparent}\u003c\/style\u003e\u003cscript data-omelette-injected\u003e(()=\u003e{{const n=new URLSearchParams(location.search).get(\"theme\");if(n===\"light\"||n===\"dark\"){document.documentElement.dataset.theme=n}}{if(new URLSearchParams(location.search).get(\"_omthumb\")===\"1\"){const n=(f)=\u003e{const g=f.focus;if(!g)return;f.focus=function(h){g.call(this,{...h,preventScroll:true})}};n(HTMLElement.prototype);n(SVGElement.prototype);if(typeof MathMLElement!==\"undefined\"){n(MathMLElement.prototype)}const d=(f)=\u003e{f.removeAttribute(\"autofocus\");f.inert=true;if(!(f instanceof HTMLElement))f.removeAttribute(\"tabindex\")};const p=(f)=\u003e{if(f.hasAttribute(\"autofocus\"))d(f);for(const g of f.querySelectorAll(\"[autofocus]\")){d(g)}};p(document.documentElement);new MutationObserver((f)=\u003e{for(const g of f){for(const h of g.addedNodes){if(h.nodeType===1)p(h)}}}).observe(document,{childList:true,subtree:true})}}{const n=()=\u003e{try{if(document.querySelector('meta[name=\"color-scheme\"]'))return;const d=getComputedStyle(document.documentElement).getPropertyValue(\"color-scheme\").trim();if(d\u0026\u0026d!==\"normal\")return;const p=(y)=\u003e{if(!y)return null;const m=getComputedStyle(y).backgroundColor.match(\/^rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)(?:[,\\s\/]+([\\d.]+%?))?\\s*\\)$\/);if(!m)return null;const w=m[4]==null?1:parseFloat(m[4])\/(m[4].endsWith(\"%\")?100:1);if(w\u003c0.99)return null;return[+m[1],+m[2],+m[3]]};const f=p(document.body)||p(document.documentElement);if(!f)return;const g=(y)=\u003e{const m=y\/255;return m\u003c=0.04045?m\/12.92:((m+0.055)\/1.055)**2.4};const h=0.2126*g(f[0])+0.7152*g(f[1])+0.0722*g(f[2]);document.documentElement.style.setProperty(\"color-scheme\",h\u003c0.4?\"dark\":\"light\")}catch{}};if(document.readyState===\"complete\")n();else window.addEventListener(\"load\",n)}var I=[\"https:\/\/claude.ai\",\"https:\/\/preview.claude.ai\",\"https:\/\/38380527-3032-478f-ab8c-9c463b248443.claudeusercontent.com\"];var B=true;var K=false;var C=()=\u003e{};if(K===true){try{const n=setTimeout.bind(window);const d=1e4;const p=15;const f=1e4;const g=120000;const h=200;const y=(o)=\u003e{try{let r;if(typeof o===\"string\")r=o;else if(o instanceof URL)r=o.href;else if(typeof Request!==\"undefined\"\u0026\u0026o instanceof Request)r=o.url;else return null;if(!r)return null;const l=document.baseURI;const i=new URL(r,l);if(i.protocol!==\"http:\"\u0026\u0026i.protocol!==\"https:\")return null;if(i.origin!==new URL(l).origin)return null;return i.origin+i.pathname}catch{return null}};const m=new Map;const w=(o)=\u003e{let r=m.get(o);if(!r){if(m.size\u003e=h){const l=m.keys().next().value;if(l!==undefined)m.delete(l)}r={fails:[],until:0,cooldown:f,hard:false};m.set(o,r)}return r};const R=(o)=\u003e{const r=m.get(o);return r!==undefined\u0026\u0026r.until\u003eDate.now()};const O=(o,r)=\u003e{const l=Date.now();const i=w(o);if(r)i.hard=true;if(i.until\u003el)return;i.fails.push(l);while(i.fails.length\u003e0\u0026\u0026i.fails[0]\u003c=l-d)i.fails.shift();if(i.fails.length\u003e=p){i.until=l+i.cooldown;if(i.hard)i.cooldown=Math.min(i.cooldown*2,g);i.fails.length=0;try{n(()=\u003e{try{S(true)}catch{}},i.until-l+100)}catch{}console.warn(\"[omelette] asset circuit breaker: pausing requests to \"+o+\" for \"+Math.round((i.until-l)\/1000)+\"s after \"+p+\" failures in \"+d\/1000+\"s\")}};const e=(o)=\u003e{m.delete(o)};const t=100;const a=new WeakMap;const u=new Set;let s=null;const S=(o)=\u003e{for(const r of Array.from(u)){try{const l=a.get(r);if(l===undefined){u.delete(r);continue}if(o){const i=y(l);if(i!==null\u0026\u0026R(i))continue}a.delete(r);u.delete(r);if(s!==null)s.call(r,l)}catch{}}};C=()=\u003e{try{m.clear();S(false)}catch{}};document.addEventListener(\"visibilitychange\",()=\u003e{if(document.visibilityState===\"visible\")C()});const _=window.fetch;if(typeof _===\"function\"){const o=function(...r){let l=null;try{l=y(r[0])}catch{}if(l!==null\u0026\u0026R(l)){let c;try{if(r[1]\u0026\u0026r[1].signal!==undefined){c=r[1].signal||undefined}else if(typeof Request!==\"undefined\"\u0026\u0026r[0]instanceof Request){c=r[0].signal||undefined}}catch{c=undefined}return new Promise((k,b)=\u003e{const E=()=\u003e{try{return c.reason!==undefined?c.reason:new DOMException(\"The operation was aborted.\",\"AbortError\")}catch{return new DOMException(\"The operation was aborted.\",\"AbortError\")}};try{if(c\u0026\u0026c.aborted){b(E());return}}catch{}let T=false;const j=()=\u003e{if(T)return;T=true;b(E())};try{if(c)c.addEventListener(\"abort\",j,{once:true})}catch{}n(()=\u003e{if(T)return;T=true;try{if(c)c.removeEventListener(\"abort\",j)}catch{}let L;try{L=new Response(null,{status:429,statusText:\"Too Many Requests\",headers:{\"Retry-After\":\"10\"}})}catch{L={ok:false,status:429}}k(L)},250)})}const i=_.apply(window,r);if(l!==null){const c=l;i.then((k)=\u003e{try{if(k.ok)e(c);else if(k.status===401||k.status===403||k.status===404||k.status===429){O(c,k.status!==404)}}catch{}},()=\u003e{})}return i};window.fetch=o}const v=Object.getOwnPropertyDescriptor(HTMLImageElement.prototype,\"src\");if(v!==undefined\u0026\u0026v.set!==undefined\u0026\u0026v.get!==undefined){const o=v.set;s=o;Object.defineProperty(HTMLImageElement.prototype,\"src\",{configurable:true,enumerable:v.enumerable,get:v.get,set(r){const l=`${r}`;try{const i=y(l);if(i!==null\u0026\u0026R(i)){a.set(this,l);if(u.size\u003ct)u.add(this);return}}catch{}try{a.delete(this);u.delete(this)}catch{}o.call(this,l)}})}try{const o=HTMLImageElement.prototype.setAttribute;HTMLImageElement.prototype.setAttribute=function(r,l){if(arguments.length\u003c2){o.apply(this,arguments);return}if(typeof r===\"string\"\u0026\u0026r.toLowerCase()===\"src\"){const i=`${l}`;try{const c=y(i);if(c!==null\u0026\u0026R(c)){a.set(this,i);if(u.size\u003ct)u.add(this);return}a.delete(this);u.delete(this)}catch{}o.call(this,r,i);return}o.call(this,r,l)}}catch{}window.addEventListener(\"error\",(o)=\u003e{try{const r=o.target;if(r instanceof HTMLImageElement){const l=y(r.currentSrc||r.src||\"\");if(l!==null)O(l,true)}}catch{}},true);window.addEventListener(\"load\",(o)=\u003e{try{const r=o.target;if(r instanceof HTMLImageElement){const l=y(r.currentSrc||r.src||\"\");if(l!==null)e(l);const i=a.get(r);if(i!==undefined){let c=false;try{c=new URL(i,document.baseURI).href===new URL(r.currentSrc||r.src||\"\",document.baseURI).href}catch{c=false}if(c){a.delete(r);u.delete(r)}}}}catch{}},true)}catch{}}var J=30000;var G=3000;document.addEventListener(\"DOMContentLoaded\",()=\u003e{const n=window.Babel;const d=\"om-src-id\";if(n\u0026\u0026n.registerPlugin\u0026\u0026!(n.availablePlugins\u0026\u0026n.availablePlugins[d])){n.registerPlugin(d,({types:h})=\u003e({visitor:{JSXOpeningElement(y,m){const w=y.node;if(w.name\u0026\u0026w.name.type===\"JSXMemberExpression\")return;for(let t=0;t\u003cw.attributes.length;t++){const a=w.attributes[t];if(a.type===\"JSXAttribute\"\u0026\u0026a.name\u0026\u0026a.name.name===\"data-om-id\")return}const R=m.file\u0026\u0026m.file.opts\u0026\u0026m.file.opts.filename||\"?\";const O=w.loc\u0026\u0026w.loc.start;const e=`jsx:${R}:${w.start??0}:${O?O.line:0}:${O?O.column+1:0}`;w.attributes.push(h.jsxAttribute(h.jsxIdentifier(\"data-om-id\"),h.stringLiteral(e)))}}}))}const p=\"om-text-extract\";let f=false;if(B\u0026\u0026n\u0026\u0026n.registerPlugin\u0026\u0026!(n.availablePlugins\u0026\u0026n.availablePlugins[p])){const h=window.React;if(h\u0026\u0026h.useSyncExternalStore\u0026\u0026h.createElement){f=true;const y={};const m=new Set;let w=0;window.__omTextO=y;window.__omTextSet=(e)=\u003e{for(const t in e){const a=e[t];if(a==null)delete y[t];else y[t]=a}w++;m.forEach((t)=\u003et())};const R=(e)=\u003e{m.add(e);return()=\u003em.delete(e)};const O=()=\u003ew;window.__OmT=function e(t){h.useSyncExternalStore(R,O,O);return h.createElement(\"span\",{\"data-om-text\":t.i,className:\"__om-t\"},t.i in y?y[t.i]:t.children)};n.registerPlugin(p,({types:e})=\u003e{const t={style:1,script:1,noscript:1,textarea:1,title:1,option:1,text:1,tspan:1,textPath:1};const a={placeholder:1,alt:1,title:1,label:1,\"aria-label\":1,\"aria-description\":1,\"aria-placeholder\":1};const u=(o,r)=\u003ee.logicalExpression(\"??\",e.memberExpression(e.logicalExpression(\"||\",e.memberExpression(e.identifier(\"window\"),e.identifier(\"__omTextO\")),e.objectExpression([])),e.stringLiteral(o),true),r);const s=(o)=\u003eo.file\u0026\u0026o.file.opts\u0026\u0026o.file.opts.filename||\"?\";const S=(o)=\u003eo.file\u0026\u0026o.file.code||\"\";const _=(o,r)=\u003e{const l=(c)=\u003ec\u0026\u0026c.start!=null\u0026\u0026c.end!=null\u0026\u0026(c.type===\"StringLiteral\"||c.type===\"TemplateLiteral\"\u0026\u0026c.expressions.length===0)?[c.start,c.end]:null;const i=l(r);if(i)return i;if(r\u0026\u0026r.type===\"Identifier\"){const c=o.scope.getBinding(r.name);if(c\u0026\u0026c.constant\u0026\u0026c.path.node.type===\"VariableDeclarator\"){return l(c.path.node.init)}}return null};const v=(o,r,l)=\u003e{const i=o.node;let c=false;const k=(E,T)=\u003e{c=true;return e.jsxElement(e.jsxOpeningElement(e.jsxIdentifier(\"__OmT\"),[e.jsxAttribute(e.jsxIdentifier(\"i\"),e.stringLiteral(E))],false),e.jsxClosingElement(e.jsxIdentifier(\"__OmT\")),[T],false)};const b=i.children.map((E)=\u003e{if(E.type===\"JSXText\"){if(E.start==null||E.end==null)return E;const T=l.slice(E.start,E.end);const j=T.length-T.trimStart().length;const L=T.length-T.trimEnd().length;if(j+L\u003e=T.length)return E;return k(`txt:${r}:${E.start+j}:${E.end-L}`,E)}if(E.type===\"JSXExpressionContainer\"){const T=_(o,E.expression);if(T)return k(`str:${r}:${T[0]}:${T[1]}`,E)}return E});if(c)i.children=b};return{visitor:{JSXOpeningElement(o,r){const l=o.node;const i=s(r);const c={};for(let k=0;k\u003cl.attributes.length;k++){const b=l.attributes[k];if(b.type!==\"JSXAttribute\"||!b.name)continue;const E=b.name.name;if(!a[E])continue;if(!b.value||b.value.type!==\"StringLiteral\")continue;if(b.value.start==null||b.value.end==null)continue;const T=`txt:${i}:${b.value.start}:${b.value.end}`;c[E]=T;b.value=e.jsxExpressionContainer(u(T,e.stringLiteral(b.value.value)))}if(Object.keys(c).length){l.attributes.push(e.jsxAttribute(e.jsxIdentifier(\"data-om-text-attrs\"),e.stringLiteral(JSON.stringify(c))))}},JSXElement(o,r){const l=o.node.openingElement;const i=l\u0026\u0026l.name\u0026\u0026l.name.name;if(i===\"__OmT\")return;if(typeof i===\"string\"\u0026\u0026t[i])return;v(o,s(r),S(r))},JSXFragment(o,r){v(o,s(r),S(r))}}}})}}const g=f?[\"transform-react-jsx-source\",d,p]:[\"transform-react-jsx-source\",d];document.querySelectorAll('script[type=\"text\/babel\"],script[type=\"text\/jsx\"]').forEach((h,y)=\u003e{const m=h.getAttribute(\"data-plugins\")||\"\";const w=g.filter((R)=\u003em.indexOf(R)\u003c0);if(w.length){h.setAttribute(\"data-plugins\",m?`${m},${w.join(\",\")}`:w.join(\",\"))}if(!h.hasAttribute(\"data-filename\")){h.setAttribute(\"data-filename\",h.getAttribute(\"src\")||`inline-${y}`)}})});var A=window.parent;var U=\"not editable here — open the project in the Claude Design editor to save\";var W=()=\u003ePromise.resolve({persisted:false,noHost:true,reason:U});var H=W;var M=\"data\/storage.json\";var z=()=\u003e{try{const n=new URL(document.baseURI);const d=n.pathname.match(\/\\\/projects\\\/([^\/]+)\\\/serve\\\/\/);if(d)return d[1];return n.hostname.split(\".\")[0]||\"\"}catch{return location.hostname.split(\".\")[0]||\"\"}};var Z=()=\u003e{try{const n=new URL(document.baseURI);const d=n.pathname.indexOf(\"\/serve\/\");if(d\u003e=0)return n.origin+n.pathname.slice(0,d+\"\/serve\/\".length)+M}catch{}return\".\/\"+M};var x=null;var N=()=\u003e{if(!x){x=fetch(Z(),{cache:\"no-store\"}).then((n)=\u003e{if(n.ok)return n.text();return n.status===404?\"\":null}).catch(()=\u003enull).then((n)=\u003e{if(n===null){x=null;return null}const d=new Map;if(!n)return d;let p;try{p=JSON.parse(n)}catch{console.warn(\"[omelette.storage] \"+M+\" is not valid JSON; treating the store as unreadable so a save cannot overwrite the \"+\"hand-edited bytes. Fix the JSON (or delete the file) to re-enable persistence.\");x=null;return null}if(p===null||typeof p!==\"object\"||Array.isArray(p)){console.warn(\"[omelette.storage] \"+M+\" doesn't hold a JSON object; treating the store as unreadable so a save cannot \"+\"overwrite the hand-edited bytes. Make the top level a JSON object to re-enable persistence.\");x=null;return null}const f=p;if(\"data\"in f){const g=f.data;if(g===null||typeof g!==\"object\"||Array.isArray(g)){console.warn(\"[omelette.storage] \"+M+' has a \"data\" field that is not a JSON object; treating the store as unreadable so a '+'save cannot overwrite the hand-edited bytes. Make \"data\" a JSON object to re-enable persistence.');x=null;return null}const h=f._meta;const y=h!==null\u0026\u0026typeof h===\"object\"?h.project:undefined;if(typeof y===\"string\"\u0026\u0026y!==\"\"\u0026\u0026y!==z())return d;for(const m of Object.keys(g))d.set(m,g[m]);return d}for(const g of Object.keys(f)){if(g!==\"_meta\")d.set(g,f[g])}return d})}return x};var F=(n)=\u003eH(M,JSON.stringify({_meta:{project:z(),version:1},data:Object.fromEntries(n)},null,2));var D=Promise.resolve();var $=(n)=\u003e{const d=D.then(n);D=d.then(()=\u003e{return},()=\u003e{return});return d};var V=\/sk-(?:ant-)?[A-Za-z0-9_-]{16,}|AKIA[0-9A-Z]{16}|gh[pousr]_[A-Za-z0-9]{20,}|xox[a-z]-[A-Za-z0-9][A-Za-z0-9-]{9,}|AIza[0-9A-Za-z_-]{30,}|-----BEGIN [A-Z ]*PRIVATE KEY-----\/;var Y=\/password|passwd|secret|api[_-]?key|access[_-]?token|auth[_-]?token|credential\/i;var Q=(n,d,p)=\u003e{if(V.test(d)||Y.test(n)\u0026\u0026typeof p===\"string\"\u0026\u0026p.length\u003e=8){console.warn('[omelette.storage] the value for \"'+n+'\" looks like a credential. The storage file is a plaintext project file — visible to '+\"everyone with project access and copied when the project is duplicated. Do not store secrets here.\")}};var q={persisted:false,reason:\"could not load the existing store — not overwriting it\"};var X={persisted:false,reason:\"stored value changed since a failed read — re-read this key before saving\"};var P=new Set;var ee={get:(n)=\u003e{if(typeof n!==\"string\"){return Promise.reject(new TypeError(\"storage.get: key must be a string\"))}return $(N).then((d)=\u003e{if(d===null){P.add(n);return null}P.delete(n);if(!d.has(n))return null;const p=d.get(n);return p==null?null:JSON.parse(JSON.stringify(p))})},set:(n,d)=\u003e{if(typeof n!==\"string\"){return Promise.reject(new TypeError(\"storage.set: key must be a string\"))}let p;try{p=JSON.stringify(d)}catch(g){return Promise.reject(new TypeError(\"storage.set: value must be JSON-serializable (\"+String(g)+\")\"))}if(p===undefined){return Promise.reject(new TypeError(\"storage.set: value must be JSON-serializable\"))}Q(n,p,d);const f=JSON.parse(p);return $(()=\u003eN().then((g)=\u003e{if(g===null)return q;if(P.has(n)){if(g.has(n))return X;P.delete(n)}g.set(n,f);return F(g)}))},delete:(n)=\u003e{if(typeof n!==\"string\"){return Promise.reject(new TypeError(\"storage.delete: key must be a string\"))}return $(()=\u003eN().then((d)=\u003e{if(d===null)return q;if(P.has(n)){if(d.has(n))return X;P.delete(n)}d.delete(n);return F(d)}))},keys:()=\u003e$(N).then((n)=\u003en===null?[]:Array.from(n.keys()))};window.omelette={writeFile:(n,d)=\u003eH(n,d).then((p)=\u003e{if(!p.persisted\u0026\u0026!p.noHost){throw new Error(p.reason||\"write failed\")}}),storage:ee};if(A\u0026\u0026A!==window){const n=(e,t)=\u003e{try{A.postMessage({__omelette_log:true,type:e,data:t},\"*\")}catch{}};[\"log\",\"warn\",\"error\"].forEach((e)=\u003e{const t=console[e];console[e]=(...a)=\u003e{const u=a.map((s)=\u003e{try{return typeof s===\"object\"?JSON.stringify(s):String(s)}catch{try{return String(s)}catch{return\"[unstringifiable]\"}}}).join(\" \");n(e,u);t.apply(console,a)}});window.addEventListener(\"error\",(e)=\u003e{const t=e.target;if(t\u0026\u0026t!==window\u0026\u0026t.tagName){const a=t.src||t.href||\"\";n(\"resource_error\",`${t.tagName} failed to load: ${a}`)}else{n(\"error\",`${e.message||\"Unknown error\"} at ${e.filename||\"?\"}:${e.lineno||0}:${e.colno||0}`)}},true);window.addEventListener(\"unhandledrejection\",(e)=\u003e{const t=e.reason;const a=t instanceof Error?`${t.message} ${t.stack}`:String(t);n(\"error\",`Unhandled rejection: ${a}`)});window.addEventListener(\"click\",(e)=\u003e{if(e.defaultPrevented||e.button!==0)return;if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;const t=e.composedPath?e.composedPath():[];const a=[\"button\",\"input\",\"select\",\"textarea\",\"summary\",\"label\"];let u=null;for(const v of t){if(!(v instanceof Element))continue;if(v.localName===\"a\"){if(!(v instanceof HTMLAnchorElement))return;u=v;break}if(a.indexOf(v.localName)!==-1)return}if(!u)return;if(u.isContentEditable)return;const s=u.closest(\"[contenteditable]\");if(s\u0026\u0026s.getAttribute(\"contenteditable\")!==\"false\")return;const S=(u.getAttribute(\"target\")||\"_self\").toLowerCase();if(S!==\"_self\"\u0026\u0026S!==\"_top\"\u0026\u0026S!==\"_parent\")return;let _;try{_=new URL(u.href)}catch{return}if(_.protocol!==\"http:\"\u0026\u0026_.protocol!==\"https:\")return;if(location.origin===\"null\")return;if(_.origin===location.origin)return;e.preventDefault();window.open(_.href,\"_blank\",\"noopener,noreferrer\")});const d=()=\u003e{try{A.postMessage({type:\"omelette:height\",height:document.documentElement.scrollHeight},\"*\")}catch{}};if(window.ResizeObserver)new ResizeObserver(d).observe(document.documentElement);const p=()=\u003e{d();if(!document.querySelector('script[type=\"text\/babel\"],script[type=\"text\/jsx\"]'))return;const e=()=\u003edocument.getElementById(\"root\")||document.querySelector(\"body \u003e div[id]\");const t=e()?.firstElementChild??null;let a=0;const u=()=\u003e{const s=e();if(s\u0026\u0026s.firstElementChild!==t||++a\u003e30){d();return}setTimeout(u,100)};setTimeout(u,100)};if(document.readyState===\"complete\")p();else window.addEventListener(\"load\",p);const f={};let g=0;const h=(e)=\u003enew Promise((t,a)=\u003e{if(!I.length){a(new Error(\"claude.complete: no parent origin\"));return}const u=`c${++g}`;const s=()=\u003esetTimeout(()=\u003e{delete f[u];a(new Error(`claude.complete: no data for ${J\/1000}s`))},J);const S=s();f[u]={resolve:t,reject:a,text:\"\",t:S,arm:s};try{for(const _ of I){A.postMessage({__om_api:true,id:u,body:e},_)}}catch(_){clearTimeout(S);delete f[u];a(_)}});const y=8;const m=async(e,t)=\u003e{if(!Array.isArray(e.messages)){throw new Error(\"claude.complete: tools require a messages array\")}const a=e.messages.slice();const u={...e,tools:e.tools.map((_)=\u003e{if(_===null||typeof _!==\"object\")return _;const v={};for(const o of Object.keys(_)){if(typeof _[o]!==\"function\")v[o]=_[o]}return v})};const s=u.tool_choice;const S=s!=null\u0026\u0026(s.type===\"any\"||s.type===\"tool\")?{...u,tool_choice:s.disable_parallel_tool_use!==undefined?{type:\"auto\",disable_parallel_tool_use:s.disable_parallel_tool_use}:{type:\"auto\"}}:u;for(let _=0;_\u003cy;_++){const v=await h({..._===0?u:S,messages:a});const o=v.message;const r=o\u0026\u0026Array.isArray(o.content)?o.content:null;const l=r?r.filter((c)=\u003ec?.type===\"tool_use\"):[];if(o?.stop_reason!==\"tool_use\"||l.length===0){return v.text}const i=[];for(const c of l){const k=t.get(c.name);if(!k){i.push({type:\"tool_result\",tool_use_id:c.id,content:`no handler for tool \"${c.name}\"`,is_error:true});continue}try{const b=await k(c.input);const E=typeof b===\"string\"?b:O(b)??\"\";i.push({type:\"tool_result\",tool_use_id:c.id,content:E})}catch(b){i.push({type:\"tool_result\",tool_use_id:c.id,content:String(b?.message??b??\"tool handler failed\"),is_error:true})}}a.push({role:\"assistant\",content:r},{role:\"user\",content:i})}throw new Error(`claude.complete: exceeded ${y} tool turns`)};window.claude={complete(e){const t=e;if(t!==null\u0026\u0026typeof t===\"object\"\u0026\u0026Array.isArray(t.tools)\u0026\u0026t.tools.some((a)=\u003ea!==null\u0026\u0026typeof a===\"object\"\u0026\u0026typeof a.run===\"function\")){const a=new Map;for(const u of t.tools){if(u!==null\u0026\u0026typeof u===\"object\"\u0026\u0026typeof u.run===\"function\"){a.set(String(u.name),u.run)}}return m(t,a)}return h(e).then((a)=\u003ea.text)}};const w={};let R=0;H=(e,t)=\u003enew Promise((a)=\u003e{if(!I.length){a({persisted:false,noHost:true,reason:U});return}const u=`f${++R}`;const s=setTimeout(()=\u003e{delete w[u];a({persisted:false,noHost:true,reason:U})},G);w[u]={settle:a,t:s};try{for(const S of I){A.postMessage({__om_file:true,id:u,op:\"write\",path:e,content:t},S)}}catch{clearTimeout(s);delete w[u];a({persisted:false,noHost:true,reason:U})}});const O=(e)=\u003e{try{return JSON.stringify(e)}catch{return JSON.stringify(String(e))}};window.addEventListener(\"message\",(e)=\u003e{if(I.indexOf(e.origin)\u003c0)return;if(e.source!==A)return;const t=e.data;if(!t)return;if(t.type===\"omelette-preview-refresh\"){if(typeof t.token!==\"string\"||!\/^[0-9a-f.-]+(\\.(rc|pr-[0-9]+))?(\\.[0-9]+\\.[0-9a-f]{16})?$\/.test(t.token))return;const s=Math.max(1,Math.floor((t.expiresAt||0)-Date.now()\/1000));document.cookie=\"__Host-omelette-preview=\"+t.token+\"; Path=\/; Secure; SameSite=None; Partitioned; Max-Age=\"+s;C();return}if(t.__om_file_r){const s=w[t.id];if(!s)return;clearTimeout(s.t);delete w[t.id];s.settle(t.ok?{persisted:true}:{persisted:false,reason:t.error||\"write failed\"});return}if(t.__om_api_r){const s=f[t.id];if(!s)return;if(t.error!=null){clearTimeout(s.t);delete f[t.id];s.reject(new Error(t.error));return}if(t.chunk!=null){clearTimeout(s.t);s.t=s.arm();s.text+=t.chunk;return}if(t.done){clearTimeout(s.t);delete f[t.id];s.resolve({text:t.text!=null?t.text:s.text,message:t.message});return}return}if(!t.__om_eval)return;const a=t;const u=(s)=\u003e{e.source.postMessage({...s,__om_eval_r:1,id:a.id},e.origin)};try{const s=(0,eval)(a.code);if(s\u0026\u0026typeof s.then===\"function\"){s.then((S)=\u003eu({ok:1,v:O(S)}),(S)=\u003eu({ok:0,e:String(S)}))}else{u({ok:1,v:O(s)})}}catch(s){u({ok:0,e:String(s)})}})}})();\n\u003c\/script\u003e\n\u003cp\u003e\u003cstrong\u003eThe Radiant One\u003c\/strong\u003e · Super Face Elixir · 30 mL\u003c\/p\u003e\n\u003ch2\u003eFor a glow that looks like you.\u003c\/h2\u003e\n\u003cp\u003eA golden face oil with sea buckthorn, neroli and immortelle. Three drops sink in fast, so it sits happily under makeup or on its own at night.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhen:\u003c\/strong\u003e Morning and night\u003c\/p\u003e\n\u003ch3\u003eBenefits\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSkin that looks rested.\u003c\/strong\u003e Sea buckthorn gives it its golden colour.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eLightweight.\u003c\/strong\u003e Camellia and jojoba absorb fast, with no shine.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eUnder makeup or on its own.\u003c\/strong\u003e Morning or night.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eLasts for months.\u003c\/strong\u003e Three drops is all you need.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3\u003eYour ritual\u003c\/h3\u003e\n\u003col\u003e\n  \u003cli\u003eCleanse and pat your face dry.\u003c\/li\u003e\n  \u003cli\u003eWarm 2–3 drops between your fingertips and breathe in the neroli.\u003c\/li\u003e\n  \u003cli\u003ePress gently into face and neck. Press; don't rub.\u003c\/li\u003e\n\u003c\/ol\u003e\n\u003cp\u003e\u003cstrong\u003eTip:\u003c\/strong\u003e A little goes a long way. Three drops covers your face and neck.\u003c\/p\u003e\n\u003ch3\u003eKey ingredients\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSea buckthorn\u003c\/strong\u003e: golden and rich in natural vitamins\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eNeroli\u003c\/strong\u003e: fresh orange blossom\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eImmortelle\u003c\/strong\u003e: a favourite in face care\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCamellia\u003c\/strong\u003e: light and silky\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3\u003eWhy Nourish\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePlant oils, essential oils and certified-organic ingredients.\u003c\/strong\u003e No water and no fillers. Every ingredient is listed below.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eHand-poured in small batches\u003c\/strong\u003e in the Illawarra, NSW. Australian Made.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eMade to absorb.\u003c\/strong\u003e Pressed into damp skin, it sinks in fully. No greasy towels.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eEvery bottle creates work.\u003c\/strong\u003e We're on our way to 5,000 bottles and paid jobs for local women.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFree shipping on orders over $70.\u003c\/strong\u003e Hand-poured and posted from Wollongong, NSW.\u003c\/p\u003e\n\u003ch3\u003eFull ingredients\u003c\/h3\u003e\n\u003cp\u003eHippophae Rhamnoides (Sea Buckthorn) Fruit Oil, Helichrysum Italicum Flower Oil, Citrus Aurantium Amara (Neroli) Flower Oil, Camellia Oleifera Seed Oil, Simmondsia Chinensis (Jojoba) Seed Oil, Tocopherol.\u003c\/p\u003e\n\u003ch3\u003eCaution\u003c\/h3\u003e\n\u003cp\u003eExternal use only. Patch test first. Avoid eyes. Stop if irritation occurs. Keep out of reach of children.\u003c\/p\u003e\n\u003cp\u003e\u003cem\u003eCare that goes deeper than your skin.\u003c\/em\u003e\u003c\/p\u003e\n","brand":"Nourish Oils","offers":[{"title":"Default Title","offer_id":41429858844768,"sku":"100","price":39.0,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0588\/4716\/6560\/files\/NourishOils_FfaceSerum.jpg?v=1786529000"}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0588\/4716\/6560\/collections\/Nourish_Oils.Unwind.Australian_bodyoils.6.jpg?v=1782217143","url":"https:\/\/www.nourishoils.com.au\/collections\/bestsellers.oembed","provider":"Nourish Oils","version":"1.0","type":"link"}