@thg-agentic/hyper-personalisation-web 3.22.2 → 3.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -1
- package/dist/hp.min.js +3 -3
- package/dist/onsite-answers.min.js +1 -0
- package/dist/onsite-render.min.js +178 -0
- package/dist/onsite-wheel.min.js +1 -0
- package/dist/onsite.min.js +1 -0
- package/dist/snippet.min.js +1 -1
- package/package.json +19 -3
- package/src/bootstrap.js +33 -2
- package/src/context.js +20 -7
- package/src/hp.js +2 -0
- package/src/index.js +96 -1
- package/src/onsite/answers-loader.js +6 -0
- package/src/onsite/answers.js +177 -0
- package/src/onsite/api.js +93 -0
- package/src/onsite/counters.js +144 -0
- package/src/onsite/index.js +446 -0
- package/src/onsite/pow.js +127 -0
- package/src/onsite/preview.js +97 -0
- package/src/onsite/render-loader.js +5 -0
- package/src/onsite/render.js +1234 -0
- package/src/onsite/rich-text.js +73 -0
- package/src/onsite/rules.js +237 -0
- package/src/onsite/styles.js +208 -0
- package/src/onsite/triggers.js +165 -0
- package/src/onsite/wheel-loader.js +5 -0
- package/src/onsite/wheel.js +148 -0
- package/src/onsite-facade.js +99 -0
- package/src/onsite-loader.js +5 -0
- package/src/settings.js +18 -0
- package/src/spec-version.js +1 -1
- package/src/storage-scope.js +5 -0
- package/src/version.js +1 -1
- package/types/bootstrap.d.ts +15 -1
- package/types/events.d.ts +68 -5
- package/types/hp.d.ts +4 -1
- package/types/index.d.ts +10 -0
- package/types/onsite-preview.d.ts +58 -0
- package/types/onsite-wheel.d.ts +11 -0
- package/types/onsite.d.ts +195 -0
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @thg-agentic/hyper-personalisation-web
|
|
2
2
|
|
|
3
3
|
The browser SDK for THG Hyper-Personalisation, a customer data platform. It implements the event
|
|
4
|
-
specification (spec 1.
|
|
4
|
+
specification (spec 1.18, stamped on every event as `context.spec.version`) for any storefront: it
|
|
5
5
|
sends events in the Segment wire format, applies consent strictly whichever CMP the site uses, reads
|
|
6
6
|
the GA4 `dataLayer` the site already pushes to, and has no runtime dependencies.
|
|
7
7
|
|
|
@@ -53,6 +53,7 @@ collects, is a settings change and never a deploy:
|
|
|
53
53
|
| `apiHost` | Where events go when the page set no `apiHost` (an `https://` host only). A page's own `apiHost` is a proxy and carries events too (since 3.20). |
|
|
54
54
|
| `plan.track` | Segment's tracking plan: an event with `enabled: false` is dropped at the source. The console's blocked events arrive here. |
|
|
55
55
|
| `sampleRate` | The share of visitors events are sent for, by a hash of the anonymous id (since 3.18). Absent: 1. |
|
|
56
|
+
| `onsite` | The live onsite forms (`{ forms, capture }`): triggers, pages, caps, consent texts (an SMS one for a form that collects texts), prize labels. Never creatives or odds. Used only by a page that passes `onsite`; see [Onsite forms](#onsite-forms). |
|
|
56
57
|
| `debug` | `{ enabled, tokenSha256 }`: console logging for everyone, or for a session opened with `?hp_debug=<token>` whose SHA-256 is `tokenSha256` (since 3.18). `?hp_debug=` ends it. |
|
|
57
58
|
|
|
58
59
|
**The page configures only what the page knows** (the second argument):
|
|
@@ -73,6 +74,7 @@ collects, is a settings change and never a deploy:
|
|
|
73
74
|
| `debug` | Log every event and delivery problem. Also on when the settings' `debug` says so. |
|
|
74
75
|
| `settings` | Development and tests only: use this settings response, never fetch or cache one. |
|
|
75
76
|
| `extend` | `createAnalytics` options that are functions, such as `getRecommendations` or `getExtensions`. |
|
|
77
|
+
| `onsite` | `true`, or the onsite options: start [onsite forms](#onsite-forms) when the settings have a live one. Absent: the runtime is never loaded. |
|
|
76
78
|
|
|
77
79
|
What `bootstrap` does:
|
|
78
80
|
|
|
@@ -483,6 +485,145 @@ const badges = await proof.forProducts(['123', '456']); // GET /v1/social-proof,
|
|
|
483
485
|
It sends the key and `hp-consent` itself; `propertyId` is needed only for a key scoped to several
|
|
484
486
|
properties.
|
|
485
487
|
|
|
488
|
+
## Onsite forms
|
|
489
|
+
|
|
490
|
+
Sign-up popups, sheets, bars, teasers, inline forms and spin-to-win
|
|
491
|
+
([ADR 0064](../../docs/architecture/decisions/0064-onsite-capture.md)). Built dark: nothing shows
|
|
492
|
+
until a form is set live in the console. One line on the host:
|
|
493
|
+
|
|
494
|
+
```js
|
|
495
|
+
const hp = await bootstrap({ writeKey: 'hp_pk_live_…' }, { consent: { provider: 'onetrust' }, onsite: true });
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
With `onsite` set and a live form in the settings' `hp.onsite`, bootstrap loads `./onsite` as a
|
|
499
|
+
separate chunk and starts it; otherwise it is never fetched. A page on `createAnalytics` starts it
|
|
500
|
+
itself: `import { startOnsite } from '@thg-agentic/hyper-personalisation-web/onsite'` then
|
|
501
|
+
`startOnsite(client, options)`. On the CDN, `hp.min.js` loads `onsite.min.js` (and that loads
|
|
502
|
+
`onsite-render.min.js` once a trigger fires, `onsite-wheel.min.js` for a wheel,
|
|
503
|
+
`onsite-answers.min.js` for a date or number question) from beside itself; a self-hosted copy keeps
|
|
504
|
+
all four beside `hp.min.js`. The runtime watches triggers, caps and consent and asks for the
|
|
505
|
+
decision; the renderer and its stylesheet are fetched only when a trigger fires, alongside the
|
|
506
|
+
decision request, so a page whose forms never fire never downloads them. If the renderer cannot
|
|
507
|
+
load, the form is not shown (`hp.onsite.debug()` says `the renderer did not load`) and the page goes
|
|
508
|
+
on. A bundler splits `./onsite`, the renderer, the wheel and the answers the same way.
|
|
509
|
+
|
|
510
|
+
**Layout stability.** A form moving to a shorter step (the thanks after a slow sign-up) keeps the
|
|
511
|
+
card's size, its content centred, so nothing on screen moves under the shopper; a taller step still
|
|
512
|
+
grows. An image with `widths` (the smaller copies the console's upload made, at `-<w>w.webp`) is a
|
|
513
|
+
`srcset` with the original at its `width`, and `sizes` for where it shows: the whole screen under
|
|
514
|
+
640px, else the card's width (46% of it beside a split).
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
**Questions.** A choice (`one`, `many`) shows as buttons, a list of radio buttons or checkboxes, or
|
|
518
|
+
a dropdown, as its question block's `display` says (a multiple choice is never a dropdown). A
|
|
519
|
+
`date` question is a birthday's day and month selects and, when asked, a year field, in the order
|
|
520
|
+
and month names of the form's `locale` (the page's `lang` when the form has none); or the browser's
|
|
521
|
+
own date field for any other date. A `number` question is a text field with a numeric keyboard and
|
|
522
|
+
its unit. A half-filled date, or a number out of the question's bounds or the gateway's limits (ten
|
|
523
|
+
digits, at most a billion either way), is the shopper's to correct before the step moves on; the
|
|
524
|
+
gateway checks every answer again. Answers are stored as option values, `YYYY-MM-DD` or `--MM-DD`,
|
|
525
|
+
and digits. A form that asks a date or a number loads their fields once, as it mounts; if they
|
|
526
|
+
cannot load, the question says it is not available and the form goes on without that answer (every
|
|
527
|
+
question is optional). A phone field's country code starts on the block's `country`, else the
|
|
528
|
+
region of the form's `locale`.
|
|
529
|
+
|
|
530
|
+
**How a form shows.** The browser judges the trigger; the server decides the rest. Each live form's
|
|
531
|
+
trigger is watched: `entry` (`delay_ms`), `exit`, `scroll` (`depth`), `time` and `idle`
|
|
532
|
+
(`seconds`), `inline` (rendered into `selector`) and `manual` (`hp.onsite.open(slot)`). Exit intent
|
|
533
|
+
on desktop arms after `delay_ms` (5 s) and once the pointer has been below the top tenth of the
|
|
534
|
+
viewport, and fires when it leaves through the top edge, moving up. On mobile it is a fast upward
|
|
535
|
+
flick (120px at 0.5 px/ms) after 30% of the page, or a return to the tab after 10 s away. Pages
|
|
536
|
+
(include/exclude globs on the path, `*` matching anything, in any case), devices (`mobile` is a coarse pointer
|
|
537
|
+
or under 768px), dates and caps are checked first; then `POST /v1/decisions` is asked for that one
|
|
538
|
+
slot. A held-out visitor, or no decision, sees nothing. One overlay per page view: of the forms that
|
|
539
|
+
fire within 50 ms, the highest `priority`. With the property's `overlay_gap_minutes`, no popup, sheet or full-screen form
|
|
540
|
+
shows until that long after the last one this session (1440 is once per session); bars, teasers and
|
|
541
|
+
inline forms are never held back. A form with `audiences` needs personalisation consent.
|
|
542
|
+
|
|
543
|
+
| Option | |
|
|
544
|
+
|---|---|
|
|
545
|
+
| `audiences()` | The visitor's session audiences, when the page evaluates them: a form targeting none of them is skipped. Without it the server decides. |
|
|
546
|
+
| `subscribed()` | True for a visitor the page knows is subscribed, for forms with `exclude_subscribed`. |
|
|
547
|
+
| `servingHost`, `gatewayHost` | Where decisions and claims go (default: the host the SDK was pointed at) and capture goes (default: where events go). |
|
|
548
|
+
| `debug` | Log why each form did or did not show. Also on with `?hp_debug=onsite`. |
|
|
549
|
+
| `settings` | Development and tests: these forms instead of the settings'. |
|
|
550
|
+
|
|
551
|
+
`hp.onsite.debug()` returns each form's state and reasons (`armed`, `not eligible: per_session cap`,
|
|
552
|
+
`held out`, `shown`, …).
|
|
553
|
+
|
|
554
|
+
| `hp.onsite` | |
|
|
555
|
+
|---|---|
|
|
556
|
+
| `open(slot)`, `show(slot)` | Show a form now, past its trigger; resolves with whether it showed. |
|
|
557
|
+
| `on(name, fn)` | `shown`, `submitted`, `apply` or `closed`, with `{ slot, arm, format }`; `submitted` and `apply` add `coupon` (`{ code, prize }` or `null`), `closed` adds `reason`. A form with prizes says `submitted` once, when its claim settles: with the code, or `null` if the claim failed. Returns a function that stops listening. A throwing listener is logged, never breaks the form. |
|
|
558
|
+
| `suppress(reason)`, `unsuppress(reason?)` | Take any form off the screen quietly (not a dismissal) and keep forms away while any reason holds; `unsuppress()` lifts all. |
|
|
559
|
+
|
|
560
|
+
**Formats.** A `teaser` is a tab (its first step) that opens the rest as a popup; the tab is kept on
|
|
561
|
+
the session's later pages until opened or dismissed, and never traps focus. A `bar` with a
|
|
562
|
+
`progress` block is a basket bar: free-delivery progress from the basket value the SDK keeps from
|
|
563
|
+
`cartUpdated`, not shown for an empty basket. A `code` block on a first step is a promo reminder,
|
|
564
|
+
shown only with a code to remind of (the decision's `offer.code`, or the code this browser claimed,
|
|
565
|
+
kept 14 days); its `apply` button emits `apply`. `inline` renders into the trigger's `selector`, a
|
|
566
|
+
tile among products. Steps take a `layout` template (`stack`, `split`, `overlay`, `image-only`) with
|
|
567
|
+
image or muted, looping video media; see ADR 0064.
|
|
568
|
+
|
|
569
|
+
**Preview.** `?hp_preview=<token>` asks `POST /v1/decisions` for the previewed version and counts
|
|
570
|
+
nothing. For an editor, `import { mountPreview } from
|
|
571
|
+
'@thg-agentic/hyper-personalisation-web/onsite/preview'`; `mountPreview(host, creative, { step,
|
|
572
|
+
device: 'desktop' | 'mobile', consentText, smsConsentText, questions, prizes, basketValue })` draws the creative
|
|
573
|
+
inside `host` with no request, event or counter, and returns `{ update(creative, options), destroy(),
|
|
574
|
+
step() }`. It is not part of the runtime chunk.
|
|
575
|
+
|
|
576
|
+
**Rendering.** A shadow root on an `<hp-onsite>` element. Popup and fullscreen are a native
|
|
577
|
+
`<dialog>` opened with `showModal()` (focus trap, inert page, Esc, focus restore); sheet, bar and
|
|
578
|
+
teaser are non-modal (focus stays on the page); inline renders into the page's element and never
|
|
579
|
+
takes focus or scrolls the page. The close button is always there, and every control is at least 44px
|
|
580
|
+
to touch. Button text is dark or white, whichever contrasts more with the accent.
|
|
581
|
+
Text is the creative's RichText, built with DOM APIs only (text, bold, italic, https links), never
|
|
582
|
+
`innerHTML`. Under 640px a popup is a bottom sheet with a drag handle (drag down to close) and a split stacks;
|
|
583
|
+
`prefers-reduced-motion` stops the animation, video autoplay and the wheel's spin; a video pauses
|
|
584
|
+
while the page is hidden.
|
|
585
|
+
|
|
586
|
+
**Capture.** On submit the form fetches `GET /v1/capture/challenge` (started on the field's first
|
|
587
|
+
focus), solves the ALTCHA proof of work in a Worker made from a Blob (the main thread, yielding,
|
|
588
|
+
where a CSP refuses one), and posts `POST /v1/capture` to the ingest gateway with the address, the
|
|
589
|
+
consent text's id and version (`sms_consent_text` for a phone number, `consent_text` otherwise; a
|
|
590
|
+
consent block shows the same one), any answers and the decision. The field is emptied; only the receipt
|
|
591
|
+
is kept, in memory, for a spin's `POST /v1/offers/claim` (with the decision id when there is one;
|
|
592
|
+
a 503 is retried twice, after 0.5 s and 1.5 s). A question answered on a later step is posted to
|
|
593
|
+
`POST /v1/capture/answers` with the email step's address and receipt, for the destinations and
|
|
594
|
+
`Preferences Stated`; the address and receipt are kept only while the form is open. When every prize's codes are gone the form shows the
|
|
595
|
+
creative's `fallback` step, else a plain thanks, with no countdown and nothing to copy. Allow `blob:` in `worker-src` for the
|
|
596
|
+
Worker.
|
|
597
|
+
|
|
598
|
+
**Events**, each only with analytics consent, and none while previewing:
|
|
599
|
+
|
|
600
|
+
| When | Event |
|
|
601
|
+
|---|---|
|
|
602
|
+
| The form renders, or a held-out visitor's trigger fires | `Personalisation Exposed` (surface `decisions`, from the decisions response) |
|
|
603
|
+
| A sign-up succeeds | `Slot Engaged` `{ engagement: 'submit', step }`. The gateway sends `Newsletter Subscribed`, and `Preferences Stated` for answers sent with it |
|
|
604
|
+
| A question is answered after the sign-up | Sent by the gateway with `POST /v1/capture/answers` after an email step; otherwise `Preferences Stated` `{ source: 'onsite' }` from the page |
|
|
605
|
+
| Closed, Esc or declined before a sign-up | `Slot Engaged` `{ engagement: 'dismiss', step }` |
|
|
606
|
+
| A link button is clicked | `Slot Engaged` `{ engagement: 'click' }` |
|
|
607
|
+
|
|
608
|
+
The sign-up itself is sent whatever the analytics answer: it is the visitor's marketing consent.
|
|
609
|
+
|
|
610
|
+
**Privacy.** No contact data is kept in the browser. The caps are opaque counters per slot under
|
|
611
|
+
`storageNames.onsite` (`thg_hp_onsite`): shows this session (sessionStorage), and shows ever, last
|
|
612
|
+
close and submitted, plus one subscribed flag and the last claimed code (localStorage), and a
|
|
613
|
+
kept teaser tab (sessionStorage).
|
|
614
|
+
|
|
615
|
+
**Budgets**, enforced by `tests/onsite-chunks.test.mjs`, each about 5% over its chunk:
|
|
616
|
+
`onsite.min.js` under 5.875 KiB gzipped (about 5.6 KiB), `onsite-render.min.js` under 14 KiB (about
|
|
617
|
+
13.7 KiB), so a page that shows a form loads about 19 KiB of onsite code and one whose forms never
|
|
618
|
+
fire about 5.6 KiB; `onsite-wheel.min.js` under 8 KiB (about 1.3 KiB), `onsite-answers.min.js` under
|
|
619
|
+
2 KiB (about 1.5 KiB). The core carries only the loader.
|
|
620
|
+
|
|
621
|
+
Try it locally: `node tools/local/serve.mjs`, then
|
|
622
|
+
`http://localhost:8099/onsite.html?hp_debug=onsite` (offline mocks by default, `?mode=live` for
|
|
623
|
+
the local gateway and public API). `?example=<name>` shows one example creative from
|
|
624
|
+
`tools/local/testpage/onsite-examples.js` (hero, split, gif, spin, teaser, bar, sheet, gate, sms,
|
|
625
|
+
exit, inline, basket, promo, fullscreen), with local images under `testpage/media/`.
|
|
626
|
+
|
|
486
627
|
## Consent
|
|
487
628
|
|
|
488
629
|
With a `consent` adapter the SDK is strict:
|
|
@@ -852,6 +993,7 @@ SDK per page.
|
|
|
852
993
|
| `session` | `thg_hp_session` | cookie, one per browser | the session id the SDK keeps when you name none, 30 minutes from the last event; only under a grant (3.15, see [Session ids](#session-ids)) |
|
|
853
994
|
| `preview` | `thg_hp_preview` | session cookie | a trader's preview token from `?hp_preview=` (3.15, see [Preview](#preview)) |
|
|
854
995
|
| `debug` | `thg_hp_debug` | sessionStorage | a developer's debug token from `?hp_debug=` (3.18), checked against the settings on every page |
|
|
996
|
+
| `onsite` | `thg_hp_onsite:<property>` | localStorage, sessionStorage | onsite forms' opaque counters per slot and a subscribed flag; never contact data (see [Onsite forms](#onsite-forms)) |
|
|
855
997
|
| — | `thg_hp_conformance_page_type` | sessionStorage | the previous page's type, only while the development-only conformance checker runs |
|
|
856
998
|
|
|
857
999
|
Keys are scoped by property because one origin can serve several tenants. The names the SDK used
|
package/dist/hp.min.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(()=>{var qt=e=>{throw TypeError(e)};var vr=(e,t,n)=>t.has(e)||qt("Cannot "+n);var Ft=(e,t,n)=>t.has(e)?qt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);var O=(e,t,n)=>(vr(e,t,"access private method"),n);var Se=[];for(let e=2;Se.length<64;e++)Se.every(t=>e%t!==0)&&Se.push(e);var Ht=e=>(e-Math.floor(e))*2**32>>>0,Cr=Se.slice(0,8).map(e=>Ht(Math.sqrt(e))),Pr=Se.map(e=>Ht(Math.cbrt(e))),W=(e,t)=>e>>>t|e<<32-t;function Kt(e){let t=new TextEncoder().encode(String(e)),n=new Uint32Array((t.length+8>>6)*16+16);t.forEach((s,i)=>{n[i>>2]|=s<<24-i%4*8}),n[t.length>>2]|=128<<24-t.length%4*8,n[n.length-2]=Math.floor(t.length/2**29),n[n.length-1]=t.length*8;let r=Uint32Array.from(Cr),o=new Uint32Array(64);for(let s=0;s<n.length;s+=16){for(let w=0;w<64;w++){if(w<16){o[w]=n[s+w];continue}let b=o[w-15],k=o[w-2],E=W(b,7)^W(b,18)^b>>>3,h=W(k,17)^W(k,19)^k>>>10;o[w]=o[w-16]+E+o[w-7]+h}let[i,a,u,d,f,p,g,x]=r;for(let w=0;w<64;w++){let b=W(f,6)^W(f,11)^W(f,25),k=x+b+(f&p^~f&g)+Pr[w]+o[w]|0,h=(W(i,2)^W(i,13)^W(i,22))+(i&a^i&u^a&u)|0;[x,g,p,f,d,u,a,i]=[g,p,f,d+k|0,u,a,i,k+h|0]}[i,a,u,d,f,p,g,x].forEach((w,b)=>{r[b]+=w})}return Array.from(r,s=>s.toString(16).padStart(8,"0")).join("")}var Qe=(e,t)=>e<<t|e>>>32-t;function Gt(e){let t=new Uint32Array((e.length+8>>6)*16+16);e.forEach((s,i)=>{t[i>>2]|=s<<24-i%4*8}),t[e.length>>2]|=128<<24-e.length%4*8,t[t.length-2]=Math.floor(e.length/2**29),t[t.length-1]=e.length*8;let n=Uint32Array.of(1732584193,4023233417,2562383102,271733878,3285377520),r=new Uint32Array(80);for(let s=0;s<t.length;s+=16){for(let p=0;p<80;p++)r[p]=p<16?t[s+p]:Qe(r[p-3]^r[p-8]^r[p-14]^r[p-16],1);let[i,a,u,d,f]=n;for(let p=0;p<80;p++){let g,x;p<20?(g=a&u|~a&d,x=1518500249):p<40?(g=a^u^d,x=1859775393):p<60?(g=a&u|a&d|u&d,x=2400959708):(g=a^u^d,x=3395469782);let w=Qe(i,5)+g+f+x+r[p]|0;[f,d,u,a,i]=[d,u,Qe(a,30),i,w]}[i,a,u,d,f].forEach((p,g)=>{n[g]+=p})}let o=new Uint8Array(20);return n.forEach((s,i)=>{o[i*4]=s>>>24,o[i*4+1]=s>>>16,o[i*4+2]=s>>>8,o[i*4+3]=s}),o}var Or="e28e8ada-5b76-4209-bba9-79b823a0af75",Lr=e=>Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");function zt(e,t){let n=Uint8Array.from(e.replace(/-/g,"").match(/../g),a=>Number.parseInt(a,16)),r=new TextEncoder().encode(t),o=new Uint8Array(16+r.length);o.set(n),o.set(r,16);let s=Gt(o).slice(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=Lr(s);return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20)}`}var re=(e,t)=>typeof e=="string"&&e!==""&&e.length<=t?e:null;function Oe(e,t){return re(e,64)??re(t,256)}function Wt({sessionId:e,slot:t,arm:n}={}){let r=re(e,256);return!r||!re(t,256)||!re(n,256)?null:zt(Or,`${r}:${t}:${n}`)}var Tr="4b1f2c7e-9a3d-4e58-b6c1-2d7f0a9e8c53";function Jt({sessionId:e,surface:t}={}){let n=re(e,256);return!n||!re(t,64)?null:zt(Tr,`${n}:${t}`)}var Nr=Array.from({length:11},(e,t)=>t/10);function Rr(e,t){if(!e.isIntersecting)return!1;let{intersectionRect:n,boundingClientRect:r,rootBounds:o}=e;if(!n||!r)return!0;let s=n.width*n.height,i=r.width*r.height,a=o?Math.min(i,o.width*o.height):i;return a>0&&s/a>=t}function X(e){let{selector:t,onViewable:n,visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=e,i=new Map,a=new WeakSet,u=new Set,d=h=>{i.has(h)||i.set(h,setTimeout(()=>{i.delete(h),n(h)&&(p?.unobserve(h),u.delete(h))},o))},f=h=>{clearTimeout(i.get(h)),i.delete(h)},p=typeof IntersectionObserver>"u"?null:new IntersectionObserver(h=>{for(let v of h){let S=v.target;if(!Rr(v,r)){u.delete(S),f(S);continue}u.add(S),g()&&d(S)}},{threshold:Nr}),g=()=>typeof document>"u"||document.visibilityState!=="hidden",x=()=>{if(g())for(let h of u)d(h);else for(let h of u)f(h)};document.addEventListener("visibilitychange",x);let w=()=>{for(let h of s.querySelectorAll(t))a.has(h)||(a.add(h),p?.observe(h))},b=typeof MutationObserver>"u"?null:new MutationObserver(()=>w()),k=()=>{w(),b?.observe(s===document?document.body:s,{childList:!0,subtree:!0})},E=s===document&&!document.body;return E?document.addEventListener("DOMContentLoaded",k,{once:!0}):k(),()=>{E&&document.removeEventListener("DOMContentLoaded",k),document.removeEventListener("visibilitychange",x),p?.disconnect(),b?.disconnect();for(let h of i.values())clearTimeout(h);i.clear(),u.clear()}}function et(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-exposure]",visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=t;return X({selector:n,root:s,visibleRatio:r,dwellMs:o,onViewable(i){let a=i.dataset?.hpExposure?.trim();return a&&e.surfaceViewed({surface:a}),!0}})}var Yt=e=>{try{return new URL(e,document.baseURI).toString()}catch{return e}};function tt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-list]",tileSelector:r="[data-hp-product]",visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,a=new Set,u=w=>w.closest?.(n)??null,d=w=>{let b=w.dataset.hpList?.trim();return b?{list_id:b,category:w.dataset.hpListCategory?.trim()||null}:null},f=w=>Array.from(w.querySelectorAll(r)).filter(b=>u(b)===w),p=(w,b)=>{try{let k=JSON.parse(w.dataset.hpProduct??"");return!k||typeof k!="object"||!k.product_id?null:{...k,position:k.position??b+1,...k.url?{url:Yt(k.url)}:{},...k.image_url?{image_url:Yt(k.image_url)}:{}}}catch{return null}},g=X({selector:`${n} ${r}`,root:i,visibleRatio:o,dwellMs:s,onViewable(w){let b=u(w);if(!b||b.dataset.hpListView==="manual")return!0;let k=d(b);if(!k||a.has(k.list_id))return!0;let E=new Set,h=f(b).map(p).filter(v=>!v||E.has(v.product_id)?!1:(E.add(v.product_id),!0));return h.length===0||(a.add(k.list_id),e.productListViewed({...k,products:h})),!0}}),x=w=>{let k=w.target?.closest?.("a[href]")?.closest(r);if(!k)return;let E=u(k),h=p(k,E?f(E).indexOf(k):0);h&&e.productClicked({list_id:E?d(E)?.list_id??null:null,products:[h]})};return document.addEventListener("click",x,!0),()=>{document.removeEventListener("click",x,!0),g()}}function N(e,...t){let n=e.dataset??{};for(let r of t){let o=n[r];if(typeof o=="string"&&o.trim()!=="")return o.trim()}return null}function Le(e,...t){let n=N(e,...t);if(n===null)return null;let r=Number(n);return Number.isFinite(r)?Math.trunc(r):null}function Dr(e,t){let n=N(e,"hpPromotion");return n?{promotion_id:n,name:N(e,"hpPromotionName"),creative:N(e,"hpPromotionCreative"),position:N(e,"hpPromotionSlot")??String(t+1)}:null}function nt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-promotion]",resolve:r=Dr,visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,a=new Set,u=p=>{let g=Array.from(i.querySelectorAll(n)),x=g.indexOf(p);try{return r(p,x<0?g.length:x)}catch{return null}},d=X({selector:n,root:i,visibleRatio:o,dwellMs:s,onViewable(p){let g=u(p);return!g||a.has(g.promotion_id)?!1:(a.add(g.promotion_id),e.promotionViewed(g),!0)}}),f=p=>{let g=p.target;if(!g||typeof g.closest!="function")return;let x=g.closest(n),w=g.closest("a[href]");if(!x||!w||!x.contains(w)&&!w.contains(x))return;let b=u(x);b&&e.promotionClicked({...b,href:w.getAttribute("href")})};return document.addEventListener("click",f,!0),()=>{document.removeEventListener("click",f,!0),d()}}function Mr(e){let t=N(e,"hpRecoRequest"),n=N(e,"hpRecoPlacement"),r=N(e,"hpRecoStrategy");if(!t||!n||!r)return null;let o=N(e,"hpRecoHoldout");return{recommendation_request_id:t,placement:n,strategy:r,recipe:N(e,"hpRecoRecipe"),algorithm_version:N(e,"hpRecoAlgorithmVersion"),experiment:N(e,"hpRecoExperiment"),variant:N(e,"hpRecoVariant"),holdout:o===null?null:o==="true",assignment_bucket:Le(e,"hpRecoBucket"),assignment_unit_kind:N(e,"hpRecoUnitKind"),candidate_set_fingerprint:N(e,"hpRecoFingerprint"),candidate_set_size:Le(e,"hpRecoCandidates"),ranked_by:N(e,"hpRecoRankedBy"),served_at:N(e,"hpRecoServedAt")}}function $r(e,t){let n=N(e,"hpRecoProduct");if(!n)return null;let r=N(e,"hpRecoPrice");return{product_id:n,sku:N(e,"hpRecoSku"),name:N(e,"hpRecoName"),brand:N(e,"hpRecoBrand"),price:r===null||Number.isNaN(Number(r))?null:Number(r),position:Le(e,"hpRecoPosition")??t+1}}function rt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-reco-request]",tileSelector:r="[data-hp-reco-product]",resolveRail:o=Mr,resolveTile:s=$r,visibleRatio:i=.5,dwellMs:a=1e3,root:u=document}=t,d=new Set,f=new Map,p=new Map,g=(h,...v)=>{try{return h(...v)}catch{return null}},x=h=>typeof h.closest=="function"?h.closest(n):null,w=h=>Array.from(h.querySelectorAll(r)),b=(h,v)=>{if(p.delete(v.recommendation_request_id),d.has(v.recommendation_request_id))return;let S=w(h).map((_,L)=>g(s,_,L)).filter(_=>_?.product_id);if(S.length===0)return;d.add(v.recommendation_request_id);let y=[...f.get(v.recommendation_request_id)?.values()??[]].sort((_,L)=>_.position-L.position);e.recommendationsViewed({...v,products:S,viewable:y})},k=X({selector:`${n} ${r}`,root:u,visibleRatio:i,dwellMs:a,onViewable(h){let v=x(h);if(!v)return!0;let S=g(o,v);if(!S)return!0;let y=S.recommendation_request_id,_=g(s,h,w(v).indexOf(h));if(_?.product_id){f.has(y)||f.set(y,new Map);let L=f.get(y);L.has(_.position)||L.set(_.position,{position:_.position,product_id:_.product_id,viewable_at:new Date().toISOString()})}return!d.has(y)&&!p.has(y)&&p.set(y,setTimeout(()=>b(v,S),0)),!0}}),E=h=>{let v=h.target;if(!v||typeof v.closest!="function")return;let S=v.closest(r);if(!S)return;let y=v.closest("[data-hp-reco-interaction]"),_=v.closest("a[href]"),L=_&&(S.contains(_)||_.contains(S));if(!(y&&S.contains(y))&&!L)return;let R=x(S);if(!R)return;let H=g(o,R);if(!H)return;let K=g(s,S,w(R).indexOf(S));if(!K?.product_id)return;let B=H.recommendation_request_id;d.has(B)||(clearTimeout(p.get(B)),b(R,H)),e.productClicked({recommendation_request_id:H.recommendation_request_id,interaction:N(y??S,"hpRecoInteraction")??"navigate",products:[K]})};return document.addEventListener("click",E,!0),()=>{document.removeEventListener("click",E,!0);for(let h of p.values())clearTimeout(h);p.clear(),k()}}var pe=new Set(["home","list","product","search","basket","checkout","order_confirmation","login","register","account","info","blog","other"]),Ur=new Set(["products"]),Xt=e=>e==null;function ot(e,t=new WeakSet){if(e instanceof Date)return e.toJSON();if(e===null||typeof e!="object"||t.has(e))return e;t.add(e);let n=Array.isArray(e)?e.map(r=>ot(r,t)):Object.fromEntries(Object.entries(e).filter(([,r])=>!Xt(r)).map(([r,o])=>[r,ot(o,t)]));return t.delete(e),n}function st(e){if(!e)return e;let t=ot(e);for(let n of Ur)n in e&&Xt(e[n])&&(t[n]=e[n]);return t}function Zt(){try{let e=performance.getEntriesByType("navigation")[0];return e?["navigate","reload","back_forward","prerender"].includes(e.type)?e.type:"navigate":null}catch{return null}}var Vr=new Set(["","unknown","undefined","null","none","nil","nan","anonymous","guest","0","-1"]);function q(e){if(e==null)return null;let t=String(e).trim();return Vr.has(t.toLowerCase())?null:t}function Z(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var Qt="1.16";function M(e){if(typeof document>"u")return null;try{let t=document.cookie.split(";").map(n=>n.trim()).find(n=>n.startsWith(`${e}=`));return t&&decodeURIComponent(t.slice(e.length+1))||null}catch{return null}}var Br={gclid:"gclid",fbclid:"fbclid",ttclid:"ttclid"},jr=/[a-z0-9._%+-]+@[a-z0-9-]+(\.[a-z0-9-]+)*\.[a-z]{2,}/i,qr=/\d(?:[ -]?\d){12,}/,Fr=new Set(["gclid","fbclid","ttclid","msclkid"]);function tn(e,t=""){if(typeof e!="string"||e==="")return!1;let n=[e];try{let o=decodeURIComponent(e.replace(/\+/g," "));o!==e&&n.push(o)}catch{}let r=!Fr.has(String(t).toLowerCase());return n.some(o=>jr.test(o)||r&&qr.test(o))}function Hr(e){if(!e)return null;let t=new URLSearchParams(e),n={},r={utm_source:"source",utm_medium:"medium",utm_campaign:"name",utm_term:"term",utm_content:"content"};for(let[o,s]of[...Object.entries(r),...Object.entries(Br)]){let i=t.get(o);i&&!tn(i,o)&&(n[s]=i)}return Object.keys(n).length?n:null}var Kr=["email","e-mail","password","pass","pwd","token","auth","code","uid","customer_id","postcode","zip","phone","applyCode"],Gr=["email","password","passwd","pwd","token","secret","auth","session","phone","postcode","zip","address","birth","card","cvv","iban","ssn","customerid","userid"],zr=["tel","uid","dob"],Wr=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","ttclid","msclkid"],Jr=new Set(Kr.map(e=>e.toLowerCase()));function Yr(e){let t=String(e).toLowerCase();if(Jr.has(t))return!0;let n=t.replace(/[-_.]/g,"");return Gr.some(o=>n.includes(o))?!0:String(e).replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).some(o=>zr.includes(o))}function it(e){return(e??[]).map(t=>{try{return new RegExp(`^${t}$`,"i")}catch{return{test:n=>n.toLowerCase()===String(t).toLowerCase()}}})}function nn(e,t={}){if(!e)return null;try{let n=new URLSearchParams(e),r=t.queryParamAllowlist?it([...t.queryParamAllowlist,...Wr]):null,o=it(t.queryParamBlocklist),s=it(t.sensitiveParamAllowlist);for(let a of new Set(n.keys()))(Yr(a)&&!s.some(d=>d.test(a))||n.getAll(a).some(d=>tn(d,a))||(r?!r.some(d=>d.test(a)):o.some(d=>d.test(a))))&&n.delete(a);let i=n.toString();return i?`?${i}`:""}catch{return""}}function rn(e,t,n={}){if(!e)return null;try{let r=new URL(e);return t&&r.origin===t?r.origin+r.pathname+(nn(r.search,n)??""):r.origin+r.pathname}catch{return null}}function on(e,t={}){if(typeof e!="string"||typeof location>"u")return null;try{let n=new URL(e,location.href);return n.protocol!=="https:"&&n.protocol!=="http:"?null:rn(n.href,location.origin,t)}catch{return null}}function at(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{3}$/.test(t)?t:null}function en(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{2}$/.test(t)?t:null}function Xr(e){if(typeof e!="string")return null;let t=e.trim().replace(/_/g,"-");if(!/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(t))return null;try{return Intl.getCanonicalLocales(t)[0]}catch{return null}}function D(e,t){if(typeof e=="function")try{let n=e();if(n!=null)return n}catch{}return t}function Zr(e){return{property_id:String(e.propertyId),channel:e.channel??null,market:e.market??null,environment:e.environment??null}}function Qr(e){let t=typeof window<"u"?window.location:null,n=t?nn(t.search,e):null;return{url:t?t.origin+t.pathname+(n??""):e.pageUrl??null,path:t?t.pathname:e.pagePath??null,search:n??null,referrer:typeof document<"u"?rn(document.referrer,t?.origin,e):null,title:typeof document<"u"&&document.title||null,type:e.pageType??null}}function sn(e,t={}){let n=typeof window<"u"?window.location:null,r={library:{name:e.libraryName,version:e.libraryVersion},spec:{version:Qt},source:Zr(e),session_id:D(e.getSessionId,null),identity_trust:q(D(e.getAnonymousId,null))?"device":"none",page:Qr(e),campaign:n?Hr(n.search):null,device:{user_agent:typeof navigator<"u"?navigator.userAgent:null,type:null,viewport_width:typeof window<"u"?window.innerWidth:null,viewport_height:typeof window<"u"?window.innerHeight:null},currency:at(D(e.getCurrency,e.currency)),locale:Xr(D(e.getLocale,e.locale)),timezone:(()=>{try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return null}})(),country:en(e.country),ship_to_country:en(D(e.getShipToCountry,e.shipToCountry)),ip:null,bot:null,consent:e.getConsent?.()??null,experiments:D(e.getExperiments,null),audiences:D(e.getAudiences,null),decisions:D(e.getDecisions,null),recommendations:D(e.getRecommendations,null),extensions:D(e.getExtensions,null)};return an(r,t)}function an(e,t){if(!t)return e;let n={...e};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&!Array.isArray(o)&&e[r]&&typeof e[r]=="object"&&!Array.isArray(e[r])?n[r]=an(e[r],o):o!==void 0&&(n[r]=o);return n}var ie=Object.freeze({consent:"thg_hp_consent",retry:"thg_hp_retry",sessionSignals:"thg_hp_session_signals",identified:"thg_hp_identified",previousPage:"thg_hp_prev_page",decisions:"thg_hp_decisions",settings:"thg_hp_settings",held:"thg_hp_held",carried:"thg_hp_carried",recommendationContext:"thg_hp_recommendation_context",anonymousId:"thg_hp_anonymous_id",session:"thg_hp_session",preview:"thg_hp_preview",debug:"thg_hp_debug"}),eo={retry:"cdp.retry",sessionSignals:"cdp_session_signals",identified:"cdp_identified",previousPage:"cdp_prev_page_message_id"},ct={...ie},cn=!1;function Te(e){let t={...ie};for(let[n,r]of Object.entries(e??{})){if(!(n in ie))throw new Error(`storageNames: unknown kind "${n}"`);if(typeof r!="string"||!/^[\w.-]+$/.test(r))throw new Error(`storageNames.${n} must be a non-empty cookie-safe name`);t[n]=r}ct=t}function T(e){return ct[e]}var to="_",un=e=>e==null||e===""?to:String(e);function F(e,t,n){let r=`${e}:${un(t)}`;return n==null||n===""?r:`${r}:${n}`}function ln(e,t){return`${e}:${un(t)}:`}function Ne(){if(!cn){cn=!0;for(let e of[()=>localStorage,()=>sessionStorage]){let t;try{if(t=e(),!t)continue;for(let n of Object.keys(t))for(let[r,o]of Object.entries(eo)){if(n!==o&&!n.startsWith(`${o}:`))continue;let s=ct[r]+n.slice(o.length);t.getItem(s)===null&&t.setItem(s,t.getItem(n)),t.removeItem(n)}}catch{}}}}var lt=1800*1e3,Re=()=>{try{return typeof sessionStorage>"u"?null:sessionStorage}catch{return null}},ut=()=>{try{return typeof localStorage>"u"?null:localStorage}catch{return null}};function dn(e,t=()=>Date.now()){return{read(){try{let n=Re()?.getItem(e),r=n?JSON.parse(n):null;return!r||t()-r.savedAt>lt?(r&&Re()?.removeItem(e),{items:[],anonymousId:null}):{items:Array.isArray(r.items)?r.items:[],anonymousId:typeof r.anonymousId=="string"?r.anonymousId:null}}catch{return{items:[],anonymousId:null}}},write(n,r=null){try{n.length===0?Re()?.removeItem(e):Re()?.setItem(e,JSON.stringify({savedAt:t(),items:n,anonymousId:r}))}catch{}}}}var no=400*24*60*60;function Q(e,t,n,r){if(typeof document>"u")return!1;try{let o=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",s=r?`; Domain=${r}`:"",i=n===null?"":`; Max-Age=${n}`;return document.cookie=`${e}=${encodeURIComponent(t)}; Path=/${i}; SameSite=Lax`+s+o,!0}catch{return!1}}function ro({name:e,domain:t=null,legacyKey:n,read:r,mint:o,mayStore:s,carried:i=null}){let a=null;try{a=ut()?.getItem(n)||null}catch{a=null}let u=r(e)??a??i,d=!1,f=()=>{if(!(d||u===null||!s())&&(d=Q(e,u,no,t),!(!d||a===null)))try{ut()?.removeItem(n),a=null}catch{}};return{get(){return u??(u=o()),f(),u},peek:()=>u,persist:f,forget(){Q(e,"",0,t),u=null,d=!1;try{ut()?.removeItem(n)}catch{}a=null}}}function fn(e,{carried:t=null,mayStore:n,orOwn:r=!1}){let o=e.anonymousIdSource,s=()=>ro({name:T("anonymousId"),domain:e.consentCookieDomain??null,legacyKey:F(T("anonymousId"),e.propertyId),read:M,mint:Z,mayStore:n,carried:t});if(o?.source==="hp_cookie"){let u=s();return e.getAnonymousId=()=>u.get(),u}if(o?.source==="site_cookie"&&o.cookie){let u=o.cookie;e.getAnonymousId=()=>M(u)}if(!r)return null;let i=e.getAnonymousId,a=s();return e.getAnonymousId=()=>q(D(i,null))??a.get(),a}var oo=200;function pn(e,t,n=()=>Date.now()){let r=()=>F(T("carried"),e),o=!1;function s(){try{let i=JSON.parse(sessionStorage.getItem(r())??"null");return!i||!(n()-i.savedAt<=lt)?[]:Array.isArray(i.calls)?i.calls:[]}catch{return[]}}return{take(){let i=s();try{sessionStorage.removeItem(r())}catch{}return i},save(i){try{return o||!t()?!1:(sessionStorage.setItem(r(),JSON.stringify({savedAt:n(),calls:[...s(),...i].slice(-oo)})),!0)}catch{return!1}},close(){o=!0}}}var wi=ie.consent,De=Object.freeze({visitor:"visitor",host:"host"}),mn=()=>({basis:De.host}),so="hp-consent",ae=["analytics","marketing","personalisation","ad_user_data","ad_personalization"],hn={analytics:"a",marketing:"m",personalisation:"p",ad_user_data:"aud",ad_personalization:"adp"},Y=()=>typeof window<"u",gn=()=>Y()&&typeof window.cookieStore?.addEventListener=="function",io=e=>e===!0?!0:e===!1?!1:null;function me(e){if(!e||typeof e!="object")return null;let t={};for(let n of ae)t[n]=io(e[n]);return t}function ft(e,t){return!e||!t?e===t:ae.every(n=>e[n]===t[n])}function pt(e){if(!e)return"";let t=[];for(let n of ae){let r=e[n];(r===!0||r===!1)&&t.push(`${hn[n]}=${r?1:0}`)}return t.join("&")}function yn(e){return{[so]:pt(me(e))}}function _e(e){let t=me({});if(e==null)return t;let n=String(e).trim();if(n.length>=2&&n.startsWith('"')&&n.endsWith('"')&&(n=n.slice(1,-1)),n.includes("%"))try{n=decodeURIComponent(n.replace(/\+/g," "))}catch{return t}let r=Object.fromEntries(Object.entries(hn).map(([s,i])=>[i,s])),o=new Set;for(let s of n.split("&")){let i=s.indexOf("=");if(i<=0)continue;let a=r[s.slice(0,i).trim()],u={1:!0,0:!1}[s.slice(i+1).trim()]??null;!a||u===null||o.has(a)||(t[a]===null?t[a]=u:t[a]!==u&&(t[a]=null,o.add(a)))}return t}function mt(e,t){if(!t)return e;let n=r=>{if(!r)return r;let o={...r};for(let s of ae)s!=="analytics"&&t[s]!==!0&&(o[s]=null);return o};return{name:e.name,basis:e.basis,read:()=>n(e.read()),subscribe:r=>e.subscribe(o=>r(n(o))),get observesChanges(){return e.observesChanges}}}function ht(e,t={}){return{...e,ad_user_data:t.ad_user_data??e.marketing,ad_personalization:t.ad_personalization??e.marketing}}function Me(e,t){let n=!0;return{notify:()=>{if(n)try{let o=e();o&&t(o)}catch{}},stop:()=>n=!1}}var ao={analytics:["analytics","measure_content_performance","audience_measurement"],marketing:["marketing","targeting","advertising","select_personalized_ads","create_ads_profile"],personalisation:["personalisation","personalization","select_personalized_content","create_content_profile"]};function co(e,t){if(!t?.length)return null;let n=!1;for(let[r,o]of Object.entries(e)){let s=String(o?.id??r).toLowerCase();if(t.some(a=>{let u=String(a).toLowerCase();return s===u||s.startsWith(`${u}-`)})&&(n=!0,o?.enabled===!0))return!0}return n?!1:null}function wn(e={}){let t={...ao,...e.purposes};function n(){let r=Y()?window.Didomi:void 0;if(!r?.getCurrentUserStatus||r.shouldUserStatusBeCollected?.()!==!1||r.isUserStatusPartial?.()===!0)return null;let o=r.getCurrentUserStatus()?.purposes;if(!o||typeof o!="object")return null;let s=i=>co(o,t[i]);return ht({analytics:s("analytics"),marketing:s("marketing"),personalisation:s("personalisation")},{ad_user_data:s("ad_user_data"),ad_personalization:s("ad_personalization")})}return{name:"didomi",read:n,observesChanges:!0,subscribe(r){if(!Y())return()=>{};let o=Me(n,r),s={event:"consent.changed",listener:o.notify};return window.didomiEventListeners=window.didomiEventListeners||[],window.didomiEventListeners.push(s),window.didomiOnReady=window.didomiOnReady||[],window.didomiOnReady.push(i=>{o.notify(),(i??window.Didomi)?.on?.("consent.changed",o.notify)}),window.Didomi?.on?.("consent.changed",o.notify),o.stop}}}function dt(e){let t={};if(!e)return t;for(let n of String(e).split("&")){let r=n.indexOf("=");if(r<=0)continue;let o=n.slice(r+1).replace(/\+/g," ");try{o=decodeURIComponent(o)}catch{}t[n.slice(0,r)]=o}return t}function Sn(e={}){let t={analytics:"C0002",personalisation:"C0003",marketing:"C0004",...e.groups},n=e.impliedConsent===!0;function r(){let i=dt(M("OptanonConsent"));if(i.groups){let d={};for(let f of i.groups.split(",")){let[p,g]=f.split(":");p?.trim()&&(d[p.trim()]=g==="1"?!0:g==="0"?!1:null)}return f=>d[f]??!1}let a=Y()?window.OnetrustActiveGroups:void 0;if(typeof a!="string"||!a.length)return null;let u=new Set(a.split(",").map(d=>d.trim()).filter(Boolean));return d=>u.has(d)}function o(){if(M("OptanonAlertBoxClosed"))return!0;try{if(Y()&&window.OneTrust?.IsAlertBoxClosed?.()===!0)return!0}catch{}return Number.parseInt(dt(M("OptanonConsent")).interactionCount,10)>0?!0:n&&Y()&&(!!window.OneTrust||typeof window.OnetrustActiveGroups=="string")}function s(){if(!o())return null;let i=r();if(!i)return null;let a=p=>t[p]?i(t[p]):null,u=ht({analytics:a("analytics"),marketing:a("marketing"),personalisation:a("personalisation")},{ad_user_data:a("ad_user_data"),ad_personalization:a("ad_personalization")}),d=dt(M("OptanonConsent"));return(typeof navigator<"u"&&navigator.globalPrivacyControl===!0||d.isGpcEnabled==="1")&&(u.marketing=!1,u.ad_user_data=!1,u.ad_personalization=!1),u}return{name:"onetrust",read:s,observesChanges:!0,subscribe(i){if(!Y())return()=>{};let a=Me(s,i),u=!1,d=()=>{u||!window.OneTrust?.OnConsentChanged||(u=!0,window.OneTrust.OnConsentChanged(a.notify))};window.addEventListener("OneTrustGroupsUpdated",a.notify);let f=window.OptanonWrapper;return window.OptanonWrapper=function(...g){try{typeof f=="function"&&f.apply(this,g)}finally{d(),a.notify()}},d(),()=>{a.stop(),window.removeEventListener("OneTrustGroupsUpdated",a.notify)}}}}function uo(e){let t=String(e).split(",").map(n=>n.trim()).filter(Boolean);return t.length?new Set(t):null}function _n(e){let{name:t,categories:n,parse:r=uo,refusedValue:o,source:s="native",changeEvent:i="thg_hp_consent_change"}=e??{};if(typeof t!="string"||t==="")throw new Error("cookieConsent: `name` (the cookie your banner writes) is required");if(!n||typeof n.analytics!="string")throw new Error("cookieConsent: `categories.analytics` (the category id that grants analytics) is required");function a(){let u=M(t);if(u==null)return null;let d;if(o!==void 0&&u===o)d=new Set;else try{d=r(u)}catch{d=null}if(!(d instanceof Set))return null;let f=p=>n[p]?d.has(n[p]):null;return ht({analytics:f("analytics"),marketing:f("marketing"),personalisation:f("personalisation")},{ad_user_data:f("ad_user_data"),ad_personalization:f("ad_personalization")})}return{name:s,read:a,get observesChanges(){return gn()},subscribe(u){if(!Y())return()=>{};let d=Me(a,u),f=p=>{[...p.changed??[],...p.deleted??[]].some(x=>x?.name===t)&&d.notify()};return window.addEventListener(i,d.notify),window.cookieStore?.addEventListener?.("change",f),()=>{d.stop(),window.removeEventListener(i,d.notify),window.cookieStore?.removeEventListener?.("change",f)}}}}function bn(e={}){let t=e.name??T("consent"),n=()=>{let r=M(t);if(r==null)return null;let o=_e(r);return o.analytics==null?null:o};return{name:"forwarded",read:n,get observesChanges(){return gn()},subscribe(r){if(!Y())return()=>{};let o=Me(n,r),s=i=>{[...i.changed??[],...i.deleted??[]].some(u=>u?.name===t)&&o.notify()};return window.cookieStore?.addEventListener?.("change",s),()=>{o.stop(),window.cookieStore?.removeEventListener?.("change",s)}}}}function xn(e){let t=me(e);return{name:"static",basis:De.host,read:()=>t?{...t}:null,observesChanges:!0,subscribe:()=>()=>{}}}function In(e){if(e==null)return null;let t=String(e).split("/").map(n=>n.trim()).filter(Boolean).join("/");return t===""?null:t}function lo(e){let t=e.item_category;if(t!=null&&String(t).includes("/"))return In(t);let n=[t,e.item_category2,e.item_category3,e.item_category4,e.item_category5].map(r=>r==null?"":String(r).trim()).filter(Boolean);return In(n.join("/"))}var fo=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t};function po(...e){for(let t of e){if(typeof t=="number"&&Number.isFinite(t))return String(t);if(typeof t=="string"&&t.trim()!=="")return t.trim()}return null}var $e=e=>po(e.item_group_id,e.item_id);function mo(e,t=$e){if(!e)return null;let n=a=>a==null||a===""||Number.isNaN(Number(a))?null:Number(a),r=a=>{let u=n(a);return u==null?null:Math.round(u*1e6)/1e6},o=a=>{let u=r(a);return u!=null&&u>=0?u:null},s=a=>{let u=n(a);return Number.isInteger(u)&&u>=0?u:null},i=fo;return{product_id:i(t(e)),sku:i(e.item_id),name:i(e.item_name),brand:i(e.item_brand),variant:i(e.item_variant)??i(e.variant),category:lo(e),price:r(e.price),discount:o(e.discount),quantity:s(e.quantity),coupon:i(e.coupon),position:s(e.index)!=null?s(e.index)+1:null,url:i(e.url)??i(e.item_url)??null,image_url:i(e.image_url)??i(e.image_link)??null,displayed_sku:i(e.displayed_sku)??i(e.displayed_variant_sku)}}function gt(e,t=$e){return(e??[]).map(n=>mo(n,t)).filter(n=>n?.product_id)}var ho=1e3,go={shipping:2,payment:3},yo=new Set(["password","google","apple","facebook","magic_link","sso","passkey","other"]),$=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t},wo=e=>{if(e==null||e===""||typeof e=="object")return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null},Ue=e=>e!==null&&typeof e=="object";function So(e){return Array.isArray(e.items)?e.items.filter(Ue):null}function kn(e){let t=$(e)?.toLowerCase().replace(/[\s-]+/g,"_");return t?yo.has(t)?t:t==="email"||t==="email_password"?"password":"other":null}function _o({ecommerce:e,items:t}){let n=s=>({promotion_id:$(s.promotion_id),name:$(s.promotion_name),creative:$(s.creative_name),position:$(s.creative_slot)}),r=new Set,o=[];for(let s of[n(e),...t.map(n)])!s.promotion_id||r.has(s.promotion_id)||(r.add(s.promotion_id),o.push(s));return o}var An=({ecommerce:e,items:t})=>$(e.item_list_id)??$(e.item_list_name)??$(t[0]?.item_list_id)??$(t[0]?.item_list_name),ce=(e,t)=>t.products?.length?{event:e,properties:t}:null,bo=new Set(["product","products","item","items"]);function xo({ecommerce:e}){let t=$(e.item_id),n=$(e.content_type)?.toLowerCase();return!t||n&&!bo.has(n)?null:{event:"Product Shared",properties:{share_via:$(e.method),products:[{product_id:t}]}}}function Io(e){let t=o=>ce("Product List Viewed",{list_id:An(o),products:o.products}),n=o=>{let s=$(o.ecommerce.search_term);return s?{event:"Products Searched",properties:{query:s,...o.products.length?{products:o.products}:{}}}:null},r=o=>s=>s.promotions.map(i=>({event:o,properties:i}));return{view_item:o=>ce("Product Viewed",{currency:o.currency,value:o.value,products:o.products.slice(0,1)}),view_item_list:t,view_search_results:o=>n(o)??t(o),search:n,select_item:o=>ce("Product Clicked",{list_id:An(o),products:o.products.slice(0,1)}),add_to_cart:o=>ce("Product Added",{cart_id:$(o.ecommerce.cart_id),products:o.products}),remove_from_cart:o=>ce("Product Removed",{cart_id:$(o.ecommerce.cart_id),products:o.products}),view_cart:o=>({event:"Cart Viewed",properties:{cart_id:$(o.ecommerce.cart_id),value:o.value,currency:o.currency,coupon:$(o.ecommerce.coupon),...o.itemsListed?{products:o.products}:{}}}),begin_checkout:o=>ce("Checkout Started",{value:o.value,currency:o.currency,coupon:$(o.ecommerce.coupon),products:o.products}),add_shipping_info:o=>({event:"Checkout Step Completed",properties:{step:e.shipping,step_name:"shipping",shipping_method:$(o.ecommerce.shipping_tier)}}),add_payment_info:o=>({event:"Payment Info Entered",properties:{step:e.payment,step_name:"payment",payment_method:$(o.ecommerce.payment_type)}}),view_promotion:r("Promotion Viewed"),select_promotion:r("Promotion Clicked"),add_to_wishlist:o=>ce("Product Added to Wishlist",{products:o.products}),share:xo,login:o=>({event:"Signed In",properties:{method:kn(o.ecommerce.method)}}),sign_up:o=>({event:"Signed Up",properties:{method:kn(o.ecommerce.method)}})}}var ko=e=>e.event;function Ao(e,t){if(!Ue(e))return null;if(typeof e.length=="number"&&e[0]==="event"&&typeof e[1]=="string"){let r=Ue(e[2])?e[2]:{};return{name:e[1],entry:r,ecommerce:r}}let n=$(t(e));return n?{name:n,entry:e,ecommerce:Ue(e.ecommerce)?e.ecommerce:e}:null}function yt(e){return Array.isArray(e)?`[${e.map(yt).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${yt(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function En(e,t={}){if(!e||typeof e.track!="function")throw new Error("connectDataLayer: analytics must have a track(event, properties, options) method");let n=t.dataLayer??(typeof window<"u"?window.dataLayer=window.dataLayer||[]:null);if(!Array.isArray(n))return()=>{};let r=Io({...go,...t.steps}),o=t.map??{},s=t.eventName??ko,i=t.productId??$e,a=new Set(["purchase","refund",...t.ignore??[]]),u=t.dedupeMs??ho,d=new Map,f=!0;function p(S,y,_){if(u<=0)return!1;let L=`${S}|${_??""}|${yt(y)}`,R=Date.now();for(let[H,K]of d)R-K>u&&d.delete(H);return d.has(L)?!0:(d.set(L,R),!1)}let g=null,x=new Set;function w(S,y){if(S!=="Product Viewed")return!1;let _=typeof location>"u"?"":location.pathname;_!==g&&(g=_,x.clear());let L=y.products?.[0]?.product_id;return L?x.has(L)?!0:(x.add(L),!1):!1}function b({event:S,properties:y={}},_){if(!S||p(S,y,_)||w(S,y))return;let L=_?{context:{currency:_}}:void 0;if(S==="Signed Out"&&typeof e.signedOut=="function"){e.signedOut(L);return}e.track(S,y,L)}function k(S){let y=t.transform?t.transform(S):S,_=Ao(y,s);if(!_||a.has(_.name))return;let L=Object.hasOwn(o,_.name),R=L?o[_.name]:r[_.name];if(typeof R!="function")return;let H=So(_.ecommerce),K=H??[],B={..._,items:K,itemsListed:H!==null,products:gt(K,i),currency:at(_.ecommerce.currency),value:wo(_.ecommerce.value)};B.promotions=_o(B);let te=L?R(y,{...B,toProducts:z=>gt(z,i)}):R(B);for(let z of[te].flat())z&&b(z,B.currency)}function E(S){if(f)try{k(S)}catch(y){try{t.onError?.(y,S)}catch{}}}for(let S of n.slice())E(S);let h=n.push;function v(...S){let y=h.apply(this,S);for(let _ of S)E(_);return y}return n.push=v,()=>{f=!1,n.push===v&&(n.push=h)}}var Eo="hp_debug",vo=256;function Co(){try{return new URLSearchParams(location.search).get(Eo)}catch{return null}}function vn(e,t){if(typeof location>"u")return!1;try{let n=Co();if(n!==null){let o=n.trim();o===""||o.length>vo?sessionStorage.removeItem(t):sessionStorage.setItem(t,o)}let r=sessionStorage.getItem(t);return!!(e&&r&&Kt(r)===e)}catch{return!1}}var he=class extends Error{},Po={inHoldout:()=>!0,personalisationGroup:()=>"excluded",servingHeaders:()=>({}),recommendationContext:()=>({}),flush:()=>Promise.resolve(),reset:()=>{}};function wt(e,t){let n=Po[e]??(()=>null),r=o=>(console.warn(`[hp] ${String(e)} failed; nothing was sent`,o),n());return function(...s){try{let i=t.apply(this,s);return typeof i?.then=="function"?Promise.resolve(i).catch(r):i}catch(i){if(i instanceof he)throw i;return r(i)}}}function Cn(e){for(let t of Reflect.ownKeys(e)){let{value:n}=Object.getOwnPropertyDescriptor(e,t)??{};typeof n=="function"&&(e[t]=wt(t,n))}return e}var be=Symbol("hp.identityOption");var Oo=4320*60*60,Lo=100,To=1e3,No=2e3,Pn=500,Ve=e=>(e?.unref?.(),e);function Ro(e,t){if(t?.analytics===!0&&e.analytics===!1)return"withdrawn";let n=ae.map(r=>e[r]).filter(r=>r!==null);return n.length&&n.every(Boolean)?"accept_all":n.length&&n.every(r=>!r)?"reject_all":"custom"}function Do(e,t,n=T("consent")){if(!(typeof document>"u"))try{let r=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",o=t?`; Domain=${t}`:"";document.cookie=`${n}=${pt(e)}; Path=/; Max-Age=${Oo}; SameSite=Lax`+o+r}catch{}}function Mo(e){let t=_e(M(e));return ae.some(n=>t[n]!==null)?t:null}function On(e){let{adapter:t,timeoutMs:n=5e3,cookieDomain:r=null,cookieName:o=T("consent"),release:s,announce:i}=e,a=e.discard??(()=>{}),u="pending",d=null,f=null,p=null,g=null,x=!1,w=null,b=[],k=m=>{u=m,e.onStatus?.(m)};function E(){try{return me(t.read())}catch{return null}}function h(){f&&clearInterval(f),p&&clearTimeout(p),f=null,p=null}let v=()=>typeof window<"u"&&typeof document<"u",S=()=>{try{return typeof t.subscribe=="function"&&t.observesChanges===!0}catch{return!1}};function y(){g&&clearInterval(g),g=null}function _(){x||g||d===null||S()||v()&&document.visibilityState==="hidden"||(g=Ve(setInterval(()=>B(E()),No)))}let L=()=>u==="pending"||u==="unknown",R=e.store??null,H=()=>{let m=b.splice(0);R?.write([]);for(let j of m)s(j)},K=()=>{let m=b.splice(0);R?.write([]);for(let j of m)a(j)};function B(m){let j=me(m);if(!j||j.analytics===null)return;let ve=d===null,J=ve?Mo(o):d;if(!ve&&ft(J,j))return;h(),d=j,_(),Do(j,r,o);let Ce=!ft(J,j);if(j.analytics){k("granted"),H(),Ce&&i({action:Ro(j,J),state:j,previous:J,withdrawal:!1});return}K(),J?.analytics===!0&&i({action:"withdrawn",state:j,previous:J,withdrawal:!0}),k("denied")}function te(){p=null,u==="pending"&&(k("unknown"),f&&clearInterval(f),f=Ve(setInterval(()=>B(E()),To)))}function z(m){L()&&(R||m?.type!=="visibilitychange"&&!m?.persisted&&K())}let ne=m=>{document.visibilityState==="hidden"?(y(),z(m)):_()},de=m=>{y(),z(m)},Ee=m=>{m?.persisted&&d!==null&&B(E()),_()};return{get status(){return u},get state(){return d?{...d}:null},stamp(){return d?{...d,source:t.name??null,basis:t.basis??De.visitor}:null},admits(){return u==="granted"},hold(m){return!L()||b.length>=Pn?(a(m),!1):(b.push(m),R?.write(b),!0)},onHidden:z,start(){x=!1;try{w=t.subscribe?.(m=>B(m))??null}catch(m){e.debug&&console.warn("[hp] consent adapter subscribe failed",m)}v()&&(window.addEventListener("pagehide",de),window.addEventListener("pageshow",Ee),document.addEventListener("visibilitychange",ne)),R&&b.length===0&&b.push(...R.read().slice(-Pn)),B(E()),!d&&(f=Ve(setInterval(()=>B(E()),Lo)),p=Ve(setTimeout(te,n)))},stop(){x=!0,h(),y(),typeof w=="function"&&w(),v()&&(window.removeEventListener("pagehide",de),window.removeEventListener("pageshow",Ee),document.removeEventListener("visibilitychange",ne))}}}var $o=["recommendation","search_rank","banner","offer","layout","copy","price","other"],Be=e=>typeof e=="string"&&e!=="";function Ln(e){return(Array.isArray(e?.decisions)?e.decisions:[]).filter(t=>Be(t?.slot)&&Be(t.decision_id)&&t.holdout!==!0).map(({decision_id:t,slot:n,arm:r,kind:o})=>({decision_id:t,slot:n,...Be(r)&&{arm:r},...$o.includes(o)&&{kind:o}}))}function Tn({key:e,mayStore:t}){let n,r=()=>{if(n)return n;try{let s=JSON.parse(sessionStorage.getItem(e));n=Array.isArray(s)?s.filter(i=>Be(i?.slot)):[]}catch{n=[]}return n},o=()=>{try{n?.length&&t()&&sessionStorage.setItem(e,JSON.stringify(n))}catch{}};return{persist:o,current:()=>r().length?n.map(s=>({...s})):null,remember(s){if(!s.length)return;let i=new Set(s.map(a=>a.slot));n=[...r().filter(a=>!i.has(a.slot)),...s],o()},forget(){n=[];try{sessionStorage.removeItem(e)}catch{}}}}function Uo(e){let t=2166136261,n=String(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t^=t>>>16,t=Math.imul(t,2246822507)>>>0,t^=t>>>13,t=Math.imul(t,3266489909)>>>0,t^=t>>>16,t>>>0}function je(e,t,n=1e4){return Uo(`${t}\0${e}`)%n}function St(e){let t=o=>Math.min(Math.max(Number(o)||0,0),1),n=t(e.share),r=1-n;return{holdout_share:n,personalised_share:e.ramp==null?r:Math.min(t(e.ramp),r)}}function _t(e,t){if(!e||typeof e.salt!="string")return{holdout:!1,bucket:null,group:"personalised"};let n=e.ramp!=null;if(t==null||t==="")return{holdout:!1,bucket:null,group:n?"excluded":"personalised"};let{holdout_share:r,personalised_share:o}=St(e),s=je(t,e.salt),i=u=>Math.round(u*1e4),a=r>0&&s<i(r)?"holdout":!n||s<i(r+o)?"personalised":"excluded";return{holdout:a==="holdout",bucket:s,group:a}}function Nn(e,t){return typeof e!="string"||e===""||t==null||t===""?null:je(t,`bandit-vs-default:${e}`)<1e4/2?"default":"bandit"}var Vo="hp_preview",Bo=256;function Rn(e,t=null){if(typeof location>"u")return M(e);let n=null;try{n=new URLSearchParams(location.search).get(Vo)}catch{n=null}if(n===null)return M(e);let r=n.trim();return r===""||r.length>Bo?(Q(e,"",0,t),null):(Q(e,r,null,t),r)}var jo=40,qo=128,Fo=5,Ho=60,Mn=e=>typeof e=="string"&&e!==""&&e.length<=qo&&!e.includes(","),Dn=e=>Array.isArray(e)?e.filter(Mn).slice(0,jo):[],Ko=e=>Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.replaceAll(","," ").trim()).filter(t=>t!=="").slice(0,Fo):[],Go=e=>Object.entries(e&&typeof e=="object"?e:{}).filter(([t,n])=>Mn(t)&&Number.isFinite(n)&&n>=1).sort(([,t],[,n])=>n-t).slice(0,Ho).map(([t,n])=>`${t}:${Math.floor(n)}`);function bt(e){let t={},n={viewed:Dn(e?.recentProducts),basket:Dn(e?.basketProducts),q:Ko(e?.recentSearches),impressed:Go(e?.impressions)};for(let[r,o]of Object.entries(n))o.length>0&&(t[r]=o.join(","));return t}var zo=1800*1e3;function $n(e,t=Date.now()){try{localStorage.setItem(T("recommendationContext"),JSON.stringify({context:e,until:t+zo}))}catch{}}function Un(){try{localStorage.removeItem(T("recommendationContext"))}catch{}}var Wo="hp_sample",Vn=1e4;function Bn(e,t){return!(typeof t=="number"&&t<1)||e==null||e===""?!0:je(e,Wo,Vn)<Math.round(t*Vn)}function ge(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var Jo=2,Yo=12;function xe(e,t=Jo){return e.split("/").slice(0,t).join("/")}function xt(e,t){if(typeof t!="string"||!t.trim())return null;let n=xe(ge(t));return n?(e.unshift(n),e.length=Math.min(e.length,Yo),n):null}var ue=()=>T("sessionSignals"),ye=null,It=()=>ye??ue();function jn(){try{return ye?localStorage:sessionStorage}catch{return}}function qn(e,t){let n=t==null?null:String(t),r=e?F(ue(),n,e):null;if(r===ye)return;let o=ye===null?Xo():null;if(ye=r,!!ye)try{let s=It(),i=ln(ue(),n);for(let a of Object.keys(localStorage))a.startsWith(i)&&a!==s&&localStorage.removeItem(a);o&&!localStorage.getItem(s)&&(localStorage.setItem(s,JSON.stringify(o)),sessionStorage.removeItem(ue()))}catch{}}function Xo(){try{let e=sessionStorage.getItem(ue());if(!e)return null;let t=JSON.parse(e);return t&&(t.productViews>0||t.listViews>0||t.basketValue!=null||t.recentProducts?.length||t.recentBrowse?.length)?t:null}catch{return null}}function qe(){return{productViews:0,listViews:0,cartAdds:0,searches:0,recentProducts:[],recentCategories:[],recentBrowse:[],basketProducts:[],basketValue:null,recentSearches:[],impressions:{},browsingCategory:null,recentBrowseCategories:[],browsingListing:null,listViewsByCategory:{},startedAt:0}}function kt(){let e=jn();if(!e)return qe();try{let t=e.getItem(It());return t?{...qe(),...JSON.parse(t)}:{...qe(),startedAt:Date.now()}}catch{return{...qe(),startedAt:Date.now()}}}function At(e){let t=jn();if(t)try{t.setItem(It(),JSON.stringify(e))}catch{}}function Fn(){return kt()}function Hn(){for(let e of[()=>sessionStorage,()=>localStorage])try{let t=e();t.removeItem(ue());for(let n of Object.keys(t))n.startsWith(`${ue()}:`)&&t.removeItem(n)}catch{}}var Kn=20,Gn=200,Zo=new Set(["Product Viewed","Product Clicked","Product Added","Product Added to Wishlist"]),Qo=new Set(["Product Viewed","Product Added"]),zn=50;function Fe(e,t){let n=xt(e.recentBrowse,t);return n?(e.recentBrowseCategories=[e.browsingListing?.category??null,...e.recentBrowseCategories].slice(0,e.recentBrowse.length),n):null}function es(e,t){let n=e.listViewsByCategory;n[t]=(n[t]??0)+1;let r=Object.keys(n);if(r.length>zn){let o={};for(let s of r.sort((i,a)=>n[a]-n[i]).slice(0,zn))o[s]=n[s];e.listViewsByCategory=o}}function Wn(e,t){let n=kt();n.startedAt||(n.startedAt=Date.now());let r=Array.isArray(t?.products)?t.products:[];switch(e){case"Product Viewed":n.productViews+=1,Fe(n,n.browsingCategory);break;case"Product List Viewed":{let i=t?.list_id,a=t?.category;if(!(typeof i=="string"&&i.includes("/")&&!i.startsWith("cdp-")))break;let d=typeof a=="string"&&xe(ge(a))||null,f=d?xe(ge(i)):"";if(!f){n.browsingCategory=null,n.browsingListing=null;break}n.browsingListing={key:f,category:d},Fe(n,f),n.browsingCategory=f,es(n,d),n.listViews+=1}break;case"Product List Filtered":{let i=t?.change,a=typeof t?.list_id=="string"?t.list_id:"",u=typeof i?.value=="string"?i.value:"",d=n.browsingListing;if(u&&i?.action!=="removed"&&d&&xe(ge(a))===d.key){let f=Fe(n,`${a}/${u}`);f&&(n.browsingCategory=f)}break}case"Product Added":{n.cartAdds+=1,Fe(n,n.browsingCategory);for(let i of r){let a=i.product_id;typeof a!="string"||!a||(n.basketProducts=[a,...n.basketProducts.filter(u=>u!==a)].slice(0,Kn))}break}case"Product Removed":{for(let i of r){let a=i.product_id;typeof a=="string"&&a&&(n.basketProducts=n.basketProducts.filter(u=>u!==a))}break}case"Products Searched":{n.searches+=1;let i=t?.query;if(typeof i=="string"&&i.trim()){let a=i.trim().toLowerCase().slice(0,64);n.recentSearches=[a,...n.recentSearches.filter(u=>u!==a)].slice(0,5)}break}case"Product Clicked":case"Product Added to Wishlist":break;case"Cart Updated":{let i=t?.value;return n.basketValue=typeof i=="number"&&Number.isFinite(i)&&i>=0?i:null,At(n),n}default:return n}let o=Zo.has(e);if(o)for(let i of r)typeof i.product_id=="string"&&i.product_id&&delete n.impressions[i.product_id];else{for(let a of r){let u=a.product_id;typeof u!="string"||!u||(n.impressions[u]=(n.impressions[u]??0)+1)}let i=Object.keys(n.impressions);if(i.length>Gn){let a={};for(let u of i.sort((d,f)=>n.impressions[f]-n.impressions[d]).slice(0,Gn))a[u]=n.impressions[u];n.impressions=a}}let s=new Set;for(let i of r){let a=i.product_id;if(o&&typeof a=="string"&&a&&(n.recentProducts=[a,...n.recentProducts.filter(u=>u!==a)].slice(0,Kn)),Qo.has(e)&&typeof i.category=="string"&&i.category){let u=ge(i.category);u&&!s.has(u)&&(s.add(u),xt(n.recentCategories,u))}}return At(n),n}var Jn=1800*1e3;function Yn({name:e,domain:t=null,mayStore:n,now:r=()=>Date.now(),mint:o=Z}){let s=null,i=0,a=()=>{s!==null&&n()&&Q(e,s,Jn/1e3,t)};return{get(){let u=r(),d=M(e);return d?s=d:(s===null||u-i>=Jn)&&(s=o()),i=u,a(),s},persist:a,forget(){Q(e,"",0,t),s=null}}}var G=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Xn=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),vt=Object.freeze({enabled:!1});function Zn(e,t){let n=e?.track;return G(n)?(Object.hasOwn(n,t)?n[t]:n.__default)?.enabled!==!1:!0}function ts(e,t){return`${le(e)}/v1/projects/${encodeURIComponent(t)}/settings`}var ns="https://hp.thgingenuity.com";function le(e){return e==null||e===""?ns:er(e)}function Qn(e,t){return e!=null&&e!==""?le(e):t?.startsWith("https://")?t:le(void 0)}function er(e){if(typeof e!="string")return null;let t=e.trim().replace(/\/+$/,"");return/^https?:\/\/[^/\s]+$/i.test(t)?t:/^[a-z0-9.-]+(:\d+)?$/i.test(t)?`https://${t}`:null}function rs(e){if(!G(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>typeof n=="boolean"));return Object.keys(t).length?t:null}var Et=e=>typeof e=="number"&&e>=0&&e<=1,os=/^[0-9a-f]{64}$/;function ss(e){return G(e)?{enabled:e.enabled===!0,tokenSha256:typeof e.tokenSha256=="string"&&os.test(e.tokenSha256)?e.tokenSha256:null}:{enabled:!1,tokenSha256:null}}function is(e){if(!G(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>G(n)&&Et(n.share)&&(n.ramp==null||Et(n.ramp))&&typeof n.salt=="string"&&n.salt!=="").map(([n,r])=>[n,{share:r.share,ramp:r.ramp??null,salt:r.salt,...Xn(r.readoutSlots)&&r.readoutSlots.length>0&&{readoutSlots:r.readoutSlots}}]));return Object.keys(t).length?t:null}var as=/^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,128}$/;function cs(e){return G(e)?e.source==="hp_cookie"?{source:"hp_cookie"}:e.source!=="site_cookie"?null:e.cookie==null?{source:"site_cookie",cookie:null}:typeof e.cookie=="string"&&as.test(e.cookie)?{source:"site_cookie",cookie:e.cookie}:null:null}function us(e){let t=G(e)?e.hp:null;return G(t)&&typeof t.enabled=="boolean"}function Ct(e){let t=G(e)?e.hp:null;return!G(t)||t.enabled!==!0?vt:{enabled:!0,propertyId:typeof t.propertyId=="string"&&t.propertyId!==""?t.propertyId:null,environment:typeof t.environment=="string"?t.environment:null,consentPurposes:rs(t.consent?.purposes),queryParamAllowlist:Xn(t.queryParamAllowlist)?t.queryParamAllowlist:null,anonymousId:cs(t.anonymousId),apiHost:er(t.apiHost),holdouts:is(t.holdouts),sampleRate:Et(t.sampleRate)?t.sampleRate:1,debug:ss(t.debug),plan:G(e.plan)&&G(e.plan.track)?{track:e.plan.track}:null}}async function tr(e,t,n=globalThis.fetch){try{let r=await n(ts(e,t),{credentials:"omit",headers:{accept:"application/json"}});if(!r.ok)return null;let o=await r.json();return us(o)?Ct(o):null}catch{return null}}var He=e=>F(T("settings"),e);function nr(e){try{let t=localStorage.getItem(He(e));if(!t)return null;let n=JSON.parse(t);return n?.enabled===!0?n:null}catch{return null}}function rr(e,t){try{t?.enabled===!0?localStorage.setItem(He(e),JSON.stringify(t)):localStorage.removeItem(He(e))}catch{}}function Pt(e){try{localStorage.removeItem(He(e))}catch{}}var ls={flushAt:20,flushIntervalMs:1e4,maxQueue:500,maxRetryAgeMs:1440*60*1e3,maxRetries:5,maxPersistedBatches:20,maxPersistedBytes:1024*1024,storageKey:ie.retry,beaconSafeBytes:56*1024,maxBatchEvents:100,maxBatchBytes:500*1024},Ke=()=>Date.now(),or=3e4,Mt=55*1024;function ds(e,t=Ke()){if(typeof e!="string")return 0;let n=e.trim();if(/^\d+$/.test(n))return Number(n)*1e3;if(n==="")return 0;let r=Date.parse(n);return Number.isNaN(r)?0:Math.max(0,r-t)}var ee=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:Buffer.byteLength(e),Ot=()=>typeof window<"u"&&typeof document<"u";function fs(){try{return!Ot()||!window.localStorage?null:(window.localStorage.getItem("thg_hp_probe"),window.localStorage)}catch{return null}}var I,Lt,Tt,Ge,Nt,Rt,sr,Ie,ke,Ae,ir,Dt,ar,ze,We=class{constructor(t){Ft(this,I);this.o={...ls,...t},this.queue=[],this.timer=null,this.storage=fs(),this.inflight=null,this.sending=new Set,this.epoch=0,this.sinceRefusal=new Set,this.wakers=new Set,this.replayAllowed=!this.o.deferReplay,this.draining=null,Ot()&&(window.addEventListener("pagehide",()=>this.flush({beacon:!0})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush()}),O(this,I,ze).call(this))}replayPersisted(){return this.replayAllowed=!0,O(this,I,ze).call(this)}clearPersisted(){if(this.replayAllowed=!1,!!this.storage)try{let t=O(this,I,Ae).call(this).filter(n=>this.sinceRefusal.has(n?.id));t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey)}catch{}}discardQueued(){this.queue=[],this.epoch+=1,this.sinceRefusal.clear(),O(this,I,Tt).call(this);for(let t of this.wakers)t()}enqueue(t){let n;try{n=JSON.parse(JSON.stringify(t))}catch(r){this.o.onError?.(`event ${t?.messageId??""} cannot be serialised; dropped`,r);return}this.queue.push(n),this.queue.length>this.o.maxQueue&&this.queue.splice(0,this.queue.length-this.o.maxQueue),this.queue.length>=this.o.flushAt?this.flush():O(this,I,Lt).call(this)}flush(t={}){if(O(this,I,Tt).call(this),this.queue.length===0)return Promise.resolve();if(t.beacon&&Ot()&&typeof navigator<"u"&&navigator.sendBeacon)return O(this,I,sr).call(this),Promise.resolve();if(this.inflight)return this.inflight;let n=O(this,I,Rt).call(this,this.queue,this.o.maxBatchEvents,this.o.maxBatchBytes).map(o=>{let s=O(this,I,Dt).call(this,o);return s&&(this.sending.add(s),this.sinceRefusal.add(s)),{batch:o,id:s}});this.queue=[];let r=this.epoch;return this.inflight=(async()=>{for(let{batch:o,id:s}of n){if(r!==this.epoch){O(this,I,ke).call(this,s);continue}await O(this,I,Ie).call(this,o,0,s,r)}})().finally(()=>{this.inflight=null,this.queue.length>=this.o.flushAt?this.flush():this.queue.length&&O(this,I,Lt).call(this)}),this.inflight}};I=new WeakSet,Lt=function(){this.timer||(this.timer=setTimeout(()=>this.flush(),this.o.flushIntervalMs),this.timer?.unref?.())},Tt=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},Ge=function(t){return JSON.stringify({batch:t,writeKey:this.o.writeKey,sentAt:new Date().toISOString()})},Nt=function(){return`${this.o.apiHost.replace(/\/$/,"")}/v1/batch`},Rt=function(t,n,r){let o=ee(O(this,I,Ge).call(this,[])),s=[],i=[],a=o;for(let u of t){let d=ee(JSON.stringify(u))+1;i.length&&(i.length>=n||a+d>r)&&(s.push(i),i=[],a=o),i.push(u),a+=d}return i.length&&s.push(i),s},sr=function(){let t=this.queue;this.queue=[];let n=O(this,I,Nt).call(this);for(let r of O(this,I,Rt).call(this,t,this.o.maxBatchEvents,this.o.beaconSafeBytes)){let o=O(this,I,Ge).call(this,r);if(ee(o)<=this.o.beaconSafeBytes){let s=!1;try{s=navigator.sendBeacon(n,new Blob([o],{type:"text/plain"}))}catch{s=!1}if(s)continue}O(this,I,Ie).call(this,r,0,O(this,I,Dt).call(this,r))}},Ie=async function(t,n,r=null,o=this.epoch){r&&this.sending.add(r);let s=O(this,I,Ge).call(this,t),i=0;try{let a=await fetch(O(this,I,Nt).call(this),{method:"POST",headers:{"Content-Type":"text/plain"},body:s,keepalive:ee(s)<=this.o.beaconSafeBytes});if(a.ok)return O(this,I,ke).call(this,r),O(this,I,ze).call(this),!0;let u=a.status===408||a.status===429||a.status>=500;if(u&&(i=ds(a.headers?.get?.("retry-after"))),!u)return O(this,I,ke).call(this,r),this.o.onError?.(`CDP ingest rejected batch (${a.status}); dropping ${t.length} events`),!0;throw new Error(`retryable ${a.status}`)}catch(a){if(n>=this.o.maxRetries){r&&this.sending.delete(r);let d=r?"kept for the next page":"dropped";return this.o.onError?.(`CDP ingest unreachable after ${n} attempts; ${d}: ${t.length} events`,a),!1}let u=Math.max(Math.min(1e3*2**n,or)*(.5+Math.random()),Math.min(i,or));return o===this.epoch&&await new Promise(d=>{let f=()=>{clearTimeout(p),this.wakers.delete(f),d()},p=setTimeout(f,u);this.wakers.add(f)}),o!==this.epoch?(O(this,I,ke).call(this,r),!1):O(this,I,Ie).call(this,t,n+1,r,o)}},ke=function(t){t&&(this.sending.delete(t),this.sinceRefusal.delete(t),O(this,I,ar).call(this,t))},Ae=function(){let t=JSON.parse(this.storage.getItem(this.o.storageKey)||"[]");return Array.isArray(t)?t:[]},ir=function(t,n){let r=i=>ee(JSON.stringify(i))+1,o=[...t,n].slice(-this.o.maxPersistedBatches),s=o.reduce((i,a)=>i+r(a),2);for(;o.length>1&&s>this.o.maxPersistedBytes;)s-=r(o[0]),o=o.slice(1);for(;o.length;)try{return this.storage.setItem(this.o.storageKey,JSON.stringify(o)),!0}catch{o=o.slice(1)}return!1},Dt=function(t){if(!this.storage||this.o.mayPersist&&!this.o.mayPersist())return null;try{let n={at:Ke(),id:`${Ke()}-${Math.random().toString(36).slice(2)}`,batch:t};return ee(JSON.stringify(n))+3>this.o.maxPersistedBytes?null:O(this,I,ir).call(this,O(this,I,Ae).call(this),n)?n.id:null}catch{return null}},ar=function(t){if(!(!t||!this.storage))try{let n=O(this,I,Ae).call(this).filter(r=>r.id!==t);n.length?this.storage.setItem(this.o.storageKey,JSON.stringify(n)):this.storage.removeItem(this.o.storageKey)}catch{}},ze=function(){if(!this.storage||!this.replayAllowed)return this.draining??Promise.resolve();if(this.draining)return this.draining;let t;try{let r=O(this,I,Ae).call(this);t=r.filter(o=>Array.isArray(o?.batch)&&Ke()-o.at<this.o.maxRetryAgeMs).map(o=>o.id?o:{...o,id:`${o.at}-${Math.random().toString(36).slice(2)}`}),(t.length!==r.length||t.some((o,s)=>o!==r[s]))&&(t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey))}catch{return Promise.resolve()}let n=t.filter(r=>!this.sending.has(r.id));return n.length?(this.draining=(async()=>{for(let r of n)if(!this.replayAllowed||!await O(this,I,Ie).call(this,r.batch,0,r.id))return})().finally(()=>{this.draining=null}),this.draining):Promise.resolve()};var cr="3.22.2",ur="@thg-agentic/hyper-personalisation-web";var ps=new Set(["audiences","decisions","recommendations"]);var ms=Symbol.for("@thg-agentic/hyper-personalisation-web.replay");function hs(e){let t={...e??{}},n=Array.isArray(t.products)?t.products:null;if(t.item_count==null&&n){let r=n.map(o=>o?.quantity);r.every(Number.isInteger)&&(t.item_count=r.reduce((o,s)=>o+s,0))}return t}var gs="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";function ys(e){if(/^[0-9a-fA-F]{64}$/.test(e))return e.toLowerCase();if(!/^[A-Za-z0-9+/_-]{43}=?$/.test(e))return null;try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(44,"="));return t.length!==32?null:Array.from(t,n=>n.charCodeAt(0).toString(16).padStart(2,"0")).join("")}catch{return null}}function Je(e){if(typeof e!="string")return null;let t=ys(e.trim());return t===gs?null:t}var lr=Object.freeze({email_sha256:"sha256",phone_sha256:"sha256",accepts_marketing:"boolean",gender:"string",created_at:"date-time"}),ws=/^\d{4}-\d{2}-\d{2}T([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/i;function Ss(e){if(typeof e!="string"||!ws.test(e))return!1;let[t,n,r]=e.slice(0,10).split("-").map(Number),o=new Date(Date.UTC(t,n-1,r));return o.getUTCMonth()===n-1&&o.getUTCDate()===r&&!Number.isNaN(Date.parse(e))}function _s(e,t){return t===null?null:e==="sha256"?Je(t)??void 0:e==="date-time"?t instanceof Date?Number.isNaN(t.getTime())?void 0:t.toISOString():Ss(t)?t:void 0:typeof t===e?t:void 0}function bs(e,t){let n={},r=[];for(let[o,s]of Object.entries(e)){let i=Object.hasOwn(lr,o)?lr[o]:null,a=i?_s(i,s):void 0;a===void 0?r.push(o):n[o]=a}return t&&r.length&&console.warn(`[hp] identify: not sent, not spec traits: ${r.join(", ")}`),n}var dr=!1,fr=!1;function xs(){fr||(fr=!0,console.warn("[hp] no consent adapter: events are sent under the host's lawful basis (basis 'host'). Pass `consent` to send only once the visitor allows analytics."))}function Is(e){!e||dr||(dr=!0,console.warn("[hp] mintAnonymousId is ignored since 3.6: where device ids come from is set per source in the console (the site\u2019s own cookie, or Hyper-Personalisation\u2019s)."))}function ks(e){try{return ee(JSON.stringify(e))}catch{return 0}}function pr(e){return e&&typeof e.context=="object"&&e.context!==null?e.context:e}function mr(e){let t=le(e?.apiHost);if(!t)throw new Error("createAnalytics: apiHost, when given, must be a host or an http(s) origin");if(!e?.propertyId)throw new Error("createAnalytics: propertyId is required");let n={libraryName:ur,libraryVersion:cr,writeKey:"web",queryParamBlocklist:[],debug:!1,validate:null,consentTimeoutMs:5e3,...e,apiHost:t};Te(n.storageNames),Ne();let r=!!n.consent;r||xs();let o=null;n.getConsent=()=>o?o.stamp():mn();let s=()=>!r||o?.status==="granted",i=r&&n.holdAcrossPages?dn(F(T("held"),n.propertyId)):null,a=i?.read()??{items:[],anonymousId:null};n.mintAnonymousId!==void 0&&Is(n.debug);let u=fn(n,{carried:a.anonymousId,mayStore:s,orOwn:!0}),d=Yn({name:T("session"),domain:n.consentCookieDomain??null,mayStore:s}),f=n.getSessionId;n.getSessionId=()=>q(D(f,null))??d.get();let p=Rn(T("preview"),n.consentCookieDomain??null),g=(c,l)=>n.debug&&console.warn("[hp]",c,l??""),x=n.transport??new We({apiHost:n.apiHost,writeKey:n.writeKey,storageKey:F(T("retry"),n.propertyId),mayPersist:r?()=>o?.status==="granted":void 0,deferReplay:r,onError:g}),w=F(T("previousPage"),n.propertyId),b=null,k=()=>{if(b)return b;try{return sessionStorage.getItem(w)||null}catch{return null}};typeof window<"u"&&window.addEventListener("pageshow",c=>{c.persisted&&(b=null)});let E=c=>{if(b=c||null,!(r&&o.status!=="granted"))try{sessionStorage.setItem(w,c)}catch{}},h=Tn({key:F(T("decisions"),n.propertyId),mayStore:s});n.getDecisions??(n.getDecisions=h.current);let v=q(D(n.getUserId,null)),S=null,y=null,_=null;function L(c,l,A=!1){try{return R(c,l,A)}catch(P){if(P instanceof he)throw P;return console.warn("[hp] the event was not sent",P),null}}function R(c,l,A){let P=_;_=null;let U=c.type==="track"?c.event:c.type;if(!A&&!Zn(n.plan,U))return null;let C={messageId:P?.messageId??Z(),timestamp:P?.timestamp??new Date().toISOString(),anonymousId:q(D(n.getAnonymousId,null)),userId:v??null,...c,context:sn(n,pr(l))};if(C.properties&&(C.properties=st(C.properties)),typeof C.properties?.href=="string"&&(C.properties.href=on(C.properties.href,n)),!A&&!Bn(C.anonymousId,n.sampleRate))return n.debug&&console.debug("[hp] not sent: outside the sample",C),null;if(n.beforeSend){let fe;try{fe=n.beforeSend(C)}catch(Er){return console.warn("[hp] beforeSend failed; the event was not sent",Er),null}if(!fe)return null;let{type:Pe,event:jt,messageId:kr,timestamp:Ar}=C;C={...fe,type:Pe,messageId:kr,timestamp:Ar,...jt?{event:jt}:{}}}if(n.validate){let fe=n.validate(C,{producer:"web"});if(!fe.valid){let Pe=`[hp] invalid ${C.event??C.type}:
|
|
2
|
-
${
|
|
3
|
-
`)}`;if(n.throwOnInvalid)throw new he(Pe);console.error(Pe)}}n.debug&&console.debug("[hp]",C.event??C.type,C);let Bt=ks(C);return Bt>Mt?(g(`${C.event??C.type} not sent: ${Bt} bytes, over the ${Mt}-byte limit for one event`),null):(Ee(C,A),C)}function H(c){if(c.type==="track"&&z(c),n.onEvent)try{n.onEvent(c)}catch(l){console.warn("[hp] onEvent observer failed",l)}}let K=()=>r&&o?.state?.personalisation===!0,B=()=>qn(D(n.getSessionId,null),n.propertyId),te=!1;function z(c){try{K()?(B(),$n(bt(Wn(c.event,c.properties))),te=!0):ne()}catch(l){n.debug&&console.warn("[hp] the visit was not recorded",l)}}function ne(c=!1){Un(),(c||te)&&Hn(),te=!1}function de(){d.forget(),h.forget(),j.clear(),u?.forget(),ne(!0)}function Ee(c,l){!r||l||o.admits()?(H(c),x.enqueue(c)):o.hold(c)}let m=(c,l,A)=>L({type:"track",event:c,properties:l??{}},A),j=new Set,ve=(c,l,A)=>c==="audiences"?{audiences:l?null:A.audiences??[]}:c==="decisions"?{decisions:(A.decisions??[]).map(P=>({slot:P.slot,decision_id:P.decision_id??null,arm:P.arm??null,...P.variant&&{variant:P.variant}}))}:{recommendation_request_id:A.recommendation_request_id??null};r&&(o=On({adapter:n.consent,timeoutMs:n.consentTimeoutMs,cookieDomain:n.consentCookieDomain,debug:n.debug,store:i&&{read:()=>a.items,write:c=>i.write(c,u?.peek()??null)},release(c){c.context&&(c.context.consent=o.stamp()),H(c),x.enqueue(c)},onStatus(c){if(c==="granted"&&(u?.persist(),d.persist(),b&&E(b),h.persist(),x.replayPersisted?.()),c==="denied"){x.clearPersisted?.(),u?.forget(),d.forget();try{sessionStorage.removeItem(w)}catch{}h.forget(),ne(!0)}try{n.onConsentStatus?.(c)}catch(l){console.warn("[hp] onConsentStatus observer failed",l)}},announce({action:c,state:l,previous:A,withdrawal:P}){l?.personalisation!==!0&&ne(A?.personalisation===!0),P&&x.discardQueued?.(),L({type:"track",event:"Consent Updated",properties:{action:c,state:l}},void 0,P),P&&x.flush()}}),o.start());let J=()=>n.holdout?St(n.holdout):null,Ce=()=>_t(n.holdout,q(D(n.getAnonymousId,null))).group;function Ir(c,l){if(!Array.isArray(c?.decisions))return c;let A=n.holdout?.readoutSlots??[],P=q(D(n.getAnonymousId,null));return{...c,decisions:c.decisions.map(U=>{let C=U?.variant==="bandit"||U?.variant==="default"?U.variant:!l&&U?.holdout!==!0&&A.includes(U?.slot)?Nn(U.slot,P):null;return C?C==="default"?{...U,variant:C,decision_id:null}:{...U,variant:C}:U})}}function Ut(c,l){if(p)return null;let A=c?.exposure,P=A?.holdout===!0,U=Ir(c,P);return h.remember(Ln(U)),!A?.token||j.has(A.token)?null:(j.add(A.token),m("Personalisation Exposed",{exposure_token:A.token,surface:A.surface,holdout:P,holdout_share:A.holdout_share??J()?.holdout_share??null,personalised_share:A.personalised_share??J()?.personalised_share??null,...ve(A.surface,P,U)},l))}function Vt(c){return v&&de(),v=null,S=null,y=null,c}return Cn({track:(c,l,A)=>c==="Signed Out"?Vt(m(c,l,A)):m(c,l,A),page(c,l){c??(c={});let A=n.pageType??null;c.type&&(pe.has(c.type)?(A=c.type,n.pageType=c.type):n.debug&&console.warn(`[hp] ignoring unknown page.type "${c.type}". Allowed: ${[...pe].join(", ")}`));let P=L({type:"page",properties:{name:c.name??null,navigation_trigger:c.navigation_trigger??Zt(),previous_message_id:k()}},{page:{type:A},...pr(l)??{}});return P&&E(P.messageId),P},identify(c,l,A){let{userId:P,...U}=c&&typeof c=="object"?c:{};if(P!==void 0){let C=q(P);A===be?y=C:S&&C&&C!==S?de():n.debug&&y&&C&&C!==y&&console.warn("[hp] identify names another userId than the identity option; using the new one"),v=C,C&&A!==be&&(S=C)}return L({type:"identify",traits:bs(U,n.debug)},l)},reset(){v&&de(),v=null,S=null,y=null,E("")},productViewed:(c,l)=>m("Product Viewed",c,l),productListViewed:(c,l)=>m("Product List Viewed",c,l),recommendationsViewed:(c,l)=>m("Recommendations Viewed",c,l),personalisationExposed:(c,l)=>m("Personalisation Exposed",c,l),recordExposure:Ut,surfaceViewed({surface:c}={},l){if(!ps.has(c)||!n.holdout||c!=="decisions"&&!K())return null;let A=q(D(n.getAnonymousId,null)),P=_t(n.holdout,A).group;if(P==="excluded")return null;let U=Jt({sessionId:Oe(D(n.getSessionId,null),A),surface:c});return U?Ut({exposure:{token:U,surface:c,holdout:P==="holdout"}},l):null},inHoldout:()=>Ce()!=="personalised",personalisationGroup:Ce,productClicked:(c,l)=>m("Product Clicked",c,l),productListFiltered:(c,l)=>m("Product List Filtered",c,l),productsSearched:(c,l)=>m("Products Searched",c,l),searchSuggestionsViewed:(c,l)=>m("Search Suggestions Viewed",c,l),productAdded:(c,l)=>m("Product Added",c,l),productRemoved:(c,l)=>m("Product Removed",c,l),cartUpdated:(c,l)=>m("Cart Updated",hs(c),l),identityLinked:(c,l)=>m("Identity Linked",c,l),slotEngaged:(c,l)=>p?null:m("Slot Engaged",c,l),productVariantSelected:(c,l)=>m("Product Variant Selected",c,l),cartViewed:(c,l)=>m("Cart Viewed",c,l),productAddedToWishlist:(c,l)=>m("Product Added to Wishlist",c,l),productRemovedFromWishlist:(c,l)=>m("Product Removed from Wishlist",c,l),wishlistProductAddedToCart:(c,l)=>m("Wishlist Product Added to Cart",c,l),productShared:(c,l)=>m("Product Shared",c,l),cartShared:(c,l)=>m("Cart Shared",c,l),couponEntered:(c,l)=>m("Coupon Entered",c,l),couponApplied:(c,l)=>m("Coupon Applied",c,l),couponDenied:(c,l)=>m("Coupon Denied",c,l),couponRemoved:(c,l)=>m("Coupon Removed",c,l),checkoutStarted:(c,l)=>m("Checkout Started",c,l),promotionViewed:(c,l)=>m("Promotion Viewed",c,l),promotionClicked:(c,l)=>m("Promotion Clicked",c,l),checkoutStepViewed:(c,l)=>m("Checkout Step Viewed",c,l),checkoutStepCompleted:(c,l)=>m("Checkout Step Completed",c,l),paymentInfoEntered:(c,l)=>m("Payment Info Entered",c,l),checkoutFailed:(c,l)=>m("Checkout Failed",c,l),signedIn:(c,l)=>m("Signed In",c,l),signedUp:(c,l)=>m("Signed Up",c,l),signedOut:c=>Vt(m("Signed Out",{},c)),newsletterSubscribed:(c,l)=>m("Newsletter Subscribed",c,l),newsletterUnsubscribed:(c,l)=>m("Newsletter Unsubscribed",c,l),backInStockSubscribed:(c,l)=>m("Back In Stock Subscribed",c,l),productReviewed:(c,l)=>m("Product Reviewed",c,l),consentUpdated:(c,l)=>m("Consent Updated",c,l),flush:c=>x.flush(c),recommendationContext(){if(!K())return{};try{return B(),bt(Fn())}catch{return{}}},get consent(){return o?o.state:null},servingHeaders:()=>yn(o?.state??null),get lastPageMessageId(){return k()},get anonymousId(){return q(D(n.getAnonymousId,null))},[ms](c,l,A){if(typeof this[c]=="function"){_=typeof A?.messageId=="string"&&typeof A?.timestamp=="string"?{messageId:A.messageId,timestamp:A.timestamp}:null;try{this[c](...Array.isArray(l)?l:[])}finally{_=null}}}})}var $t=Symbol.for("@thg-agentic/hyper-personalisation-web.bootstrap"),As=Symbol.for("@thg-agentic/hyper-personalisation-web.drain"),Es=Symbol.for("@thg-agentic/hyper-personalisation-web.carry"),hr=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),vs=Symbol.for("@thg-agentic/hyper-personalisation-web.assignment"),Cs=Symbol.for("@thg-agentic/hyper-personalisation-web.recommendation-context"),Ze=e=>e?()=>M(e):()=>null,wr={didomi:e=>wn({purposes:e.purposes}),onetrust:e=>Sn({groups:e.groups,impliedConsent:e.impliedConsent}),cookie:e=>_n({name:e.name,categories:e.categories,refusedValue:e.refusedValue,source:e.source,changeEvent:e.changeEvent}),forwarded:e=>bn({name:e.name}),static:e=>{if(!e.state||typeof e.state!="object")throw new Error('consent.state is required for provider "static"');return xn(e.state)}},gr=Object.keys(wr),we=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Ye=e=>typeof e=="string"&&e!=="",Ps=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),Sr=e=>we(e)&&typeof e.read=="function";function Os(e,t={}){let n=[];if(!we(e))return["config must be { writeKey, apiHost? }"];Ye(e.writeKey)||n.push("writeKey is required"),le(e.apiHost)||n.push("apiHost, when given, must be a host or an http(s) origin"),t.propertyId!==void 0&&!Ye(t.propertyId)&&n.push("propertyId must be a string");let{consent:r}=t;if(!Sr(r)&&!(we(r)&&gr.includes(r.provider))&&n.push(`consent must be a consent adapter or { provider: ${gr.join(" | ")} }`),t.autocapture!==void 0&&t.autocapture!==!1&&!we(t.autocapture)&&n.push("autocapture must be false or { promotions, productLists, recommendations }"),t.beforeSend!==void 0&&typeof t.beforeSend!="function"&&n.push("beforeSend must be a function"),t.identityCookies!==void 0)if(!we(t.identityCookies))n.push("identityCookies must be an object");else for(let o of["anonymousId","sessionId"]){let s=t.identityCookies[o];s!==void 0&&!Ye(s)&&n.push(`identityCookies.${o} must be a cookie name`)}for(let o of["getCurrency","getShipToCountry","getLocale"])t[o]!==void 0&&typeof t[o]!="function"&&n.push(`${o} must be a function`);return t.dataLayer!==void 0&&(we(t.dataLayer)?(t.dataLayer.name!==void 0&&!Ye(t.dataLayer.name)&&n.push("dataLayer.name must be a string"),t.dataLayer.ignore!==void 0&&!Ps(t.dataLayer.ignore)&&n.push("dataLayer.ignore must be an array of strings")):n.push("dataLayer must be an object")),n}function Ls(e,t,n){if(Sr(e))return mt(e,t.consentPurposes);let{provider:r,...o}=e,s=n?.consent?.[r]??wr[r];return mt(s(o),t.consentPurposes)}var _r=(e,t)=>`${e??""}|${t??""}`;function Ts(e,t){let n=q(t?.userId),r=Je(t?.emailSha256);if(!n&&!r)return null;try{let o=F(T("identified"),e);if(sessionStorage.getItem(o)===_r(n,r))return null}catch{}return{...n?{userId:n}:{},...r?{email_sha256:r}:{}}}async function Ns({writeKey:e,apiHost:t},n){if(n.settings!==void 0)return{settings:Ct(n.settings),revalidated:null};let r=tr(t,e),o=nr(e);if(o)return{settings:o,revalidated:r};let s=await r,i=s??vt;return{settings:i,revalidated:Promise.resolve(i),unreachable:s===null}}function br(e,t){let n=t??{},r=typeof window<"u"?window:null;if(r?.[$t])return r[$t];let o=pn(e?.writeKey,()=>{let{analytics:i}=_e(M(T("consent")));return i===!0||i===null&&n.holdAcrossPages===!0}),s=Ds(e,n,o);if(r){let i=n.extend?.getSessionId??Ze(n.identityCookies?.sessionId),a=Ze(n.identityCookies?.anonymousId);r[vs]=({slot:u,arm:d}={})=>Wt({sessionId:Oe(i(),a()),slot:u,arm:d}),r[$t]=s,r[Es]=o,r[As]?.(s)}return s}function Rs(){let e=globalThis.performance?.now?.();return new Date(Date.now()-(Number.isFinite(e)?e:0)).toISOString()}function yr(e,t){if(t===!1)return()=>{};let n={promotions:!0,productLists:!0,recommendations:!0,exposures:!0,...t},r=s=>s&&typeof s=="object"?s:{},o=[];try{n.promotions&&o.push(nt(e,r(n.promotions))),n.productLists&&o.push(tt(e,r(n.productLists))),n.recommendations&&o.push(rt(e,r(n.recommendations))),n.exposures&&o.push(et(e,r(n.exposures)))}catch(s){console.warn("[hp] autocapture not started:",s?.message??s)}return()=>{for(let s of o)s()}}function Xe(e){return e.close(),null}async function Ds(e,t,n){try{let r=Os(e,t);if(r.length)return console.warn(`[hp] not started, the configuration is invalid: ${r.join("; ")}`),Xe(n);Te(t.storageNames),Ne();let{writeKey:o}=e,[{settings:s,revalidated:i,unreachable:a},u]=await Promise.all([Ns(e,t),Promise.resolve(t.identity).catch(()=>null)]),d=i?s:null,f=!1,p=()=>f&&d&&rr(o,d);if(i?.then(y=>{y&&(d=y,y.enabled?p():Pt(o))}),a)return null;if(!s.enabled)return t.debug&&console.info("[hp] off: the settings for this write key do not enable it"),Xe(n);let g=t.propertyId??s.propertyId;if(!g)return console.warn("[hp] not started: this write key covers several properties, so propertyId is required"),Xe(n);let{preset:x}=t,w=Ts(g,u),b=t.debug===!0||s.debug?.enabled===!0||vn(s.debug?.tokenSha256??null,T("debug")),k=q(u?.userId),E=mr({apiHost:Qn(e.apiHost,s.apiHost),writeKey:o,propertyId:g,pageType:pe.has(t.pageType)?t.pageType:void 0,environment:s.environment,queryParamAllowlist:s.queryParamAllowlist??void 0,plan:s.plan,sampleRate:s.sampleRate??1,holdout:s.holdouts?.[g],getCurrency:t.getCurrency,getShipToCountry:t.getShipToCountry,getLocale:t.getLocale,consent:Ls(t.consent,s,x),consentCookieDomain:t.consentCookieDomain,storageNames:t.storageNames,holdAcrossPages:t.holdAcrossPages===!0,mintAnonymousId:t.mintAnonymousId,debug:b,anonymousIdSource:s.anonymousId??void 0,getAnonymousId:Ze(t.identityCookies?.anonymousId),getSessionId:t.identityCookies?.sessionId?Ze(t.identityCookies.sessionId):void 0,getUserId:()=>k,beforeSend:t.beforeSend,...t.extend,onConsentStatus(y){if(y==="granted"&&(f=!0,p()),y==="denied"){Pt(o);try{sessionStorage.removeItem(F(T("identified"),g))}catch{}}t.extend?.onConsentStatus?.(y)},onEvent(y){if(y.type==="identify"){let _=_r(q(y.userId),Je(y.traits?.email_sha256));try{sessionStorage.setItem(F(T("identified"),g),_)}catch{}}t.extend?.onEvent?.(y)}});typeof window<"u"&&(window[Cs]=()=>E.recommendationContext());for(let[y,_,L]of n.take())try{E[hr](y,_,L)}catch(R){console.warn(`[hp] carried ${y} failed`,R)}E[hr]("page",[t.pageType?{type:t.pageType}:{}],{messageId:Z(),timestamp:Rs()});let h=yr(E,t.autocapture),v=E.page;E.page=wt("page",(...y)=>{let _=v(...y);return h(),h=yr(E,t.autocapture),_});let S=typeof window<"u"?window:null;if(S?.addEventListener("pageshow",y=>{y.persisted&&E.page({navigation_trigger:"back_forward"})}),t.dataLayer&&S){let y=t.dataLayer.name??"dataLayer";S[y]=S[y]||[],En(E,{...x,dataLayer:S[y],ignore:[...x?.ignore??[],...t.dataLayer.ignore??[]],onError:_=>b&&console.warn("[hp] dataLayer mapping failed",_)})}return w&&E.identify(w,void 0,be),E}catch(r){return console.warn("[hp] not started:",r?.message??r),Xe(n)}}function xr(e){e.initialized=!0,br(e._config,e._options).then(t=>{let n=e.splice(0);if(!t){for(let r of e.methods??[])e[r]=()=>e;return}e.client=t;for(let[r,o]of Object.entries(t))typeof o=="function"&&(e[r]=o);for(let[r,...o]of n)try{t[r]?.(...o)}catch(s){console.warn(`[hp] queued ${r} failed`,s)}})}var V=window.hp=window.hp||[];V.servingHeaders??(V.servingHeaders=()=>({}));V.inHoldout??(V.inHoldout=()=>!0);V.personalisationGroup??(V.personalisationGroup=()=>"excluded");V.recommendationContext??(V.recommendationContext=()=>({}));V.initialized||(V._config?xr(V):V.load=(e,t)=>{V._config=e,V._options=t??{},xr(V)});})();
|
|
1
|
+
(()=>{var on=e=>{throw TypeError(e)};var Fr=(e,t,n)=>t.has(e)||on("Cannot "+n);var sn=(e,t,n)=>t.has(e)?on("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);var O=(e,t,n)=>(Fr(e,t,"access private method"),n);var ke=[];for(let e=2;ke.length<64;e++)ke.every(t=>e%t!==0)&&ke.push(e);var an=e=>(e-Math.floor(e))*2**32>>>0,Kr=ke.slice(0,8).map(e=>an(Math.sqrt(e))),Gr=ke.map(e=>an(Math.cbrt(e))),J=(e,t)=>e>>>t|e<<32-t;function cn(e){let t=new TextEncoder().encode(String(e)),n=new Uint32Array((t.length+8>>6)*16+16);t.forEach((s,i)=>{n[i>>2]|=s<<24-i%4*8}),n[t.length>>2]|=128<<24-t.length%4*8,n[n.length-2]=Math.floor(t.length/2**29),n[n.length-1]=t.length*8;let r=Uint32Array.from(Kr),o=new Uint32Array(64);for(let s=0;s<n.length;s+=16){for(let y=0;y<64;y++){if(y<16){o[y]=n[s+y];continue}let _=o[y-15],A=o[y-2],v=J(_,7)^J(_,18)^_>>>3,m=J(A,17)^J(A,19)^A>>>10;o[y]=o[y-16]+v+o[y-7]+m}let[i,c,u,d,f,p,h,b]=r;for(let y=0;y<64;y++){let _=J(f,6)^J(f,11)^J(f,25),A=b+_+(f&p^~f&h)+Gr[y]+o[y]|0,m=(J(i,2)^J(i,13)^J(i,22))+(i&c^i&u^c&u)|0;[b,h,p,f,d,u,c,i]=[h,p,f,d+A|0,u,c,i,A+m|0]}[i,c,u,d,f,p,h,b].forEach((y,_)=>{r[_]+=y})}return Array.from(r,s=>s.toString(16).padStart(8,"0")).join("")}var ut=(e,t)=>e<<t|e>>>32-t;function un(e){let t=new Uint32Array((e.length+8>>6)*16+16);e.forEach((s,i)=>{t[i>>2]|=s<<24-i%4*8}),t[e.length>>2]|=128<<24-e.length%4*8,t[t.length-2]=Math.floor(e.length/2**29),t[t.length-1]=e.length*8;let n=Uint32Array.of(1732584193,4023233417,2562383102,271733878,3285377520),r=new Uint32Array(80);for(let s=0;s<t.length;s+=16){for(let p=0;p<80;p++)r[p]=p<16?t[s+p]:ut(r[p-3]^r[p-8]^r[p-14]^r[p-16],1);let[i,c,u,d,f]=n;for(let p=0;p<80;p++){let h,b;p<20?(h=c&u|~c&d,b=1518500249):p<40?(h=c^u^d,b=1859775393):p<60?(h=c&u|c&d|u&d,b=2400959708):(h=c^u^d,b=3395469782);let y=ut(i,5)+h+f+b+r[p]|0;[f,d,u,c,i]=[d,u,ut(c,30),i,y]}[i,c,u,d,f].forEach((p,h)=>{n[h]+=p})}let o=new Uint8Array(20);return n.forEach((s,i)=>{o[i*4]=s>>>24,o[i*4+1]=s>>>16,o[i*4+2]=s>>>8,o[i*4+3]=s}),o}var zr="e28e8ada-5b76-4209-bba9-79b823a0af75",Wr=e=>Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");function ln(e,t){let n=Uint8Array.from(e.replace(/-/g,"").match(/../g),c=>Number.parseInt(c,16)),r=new TextEncoder().encode(t),o=new Uint8Array(16+r.length);o.set(n),o.set(r,16);let s=un(o).slice(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=Wr(s);return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20)}`}var oe=(e,t)=>typeof e=="string"&&e!==""&&e.length<=t?e:null;function Me(e,t){return oe(e,64)??oe(t,256)}function dn({sessionId:e,slot:t,arm:n}={}){let r=oe(e,256);return!r||!oe(t,256)||!oe(n,256)?null:ln(zr,`${r}:${t}:${n}`)}var Jr="4b1f2c7e-9a3d-4e58-b6c1-2d7f0a9e8c53";function fn({sessionId:e,surface:t}={}){let n=oe(e,256);return!n||!oe(t,64)?null:ln(Jr,`${n}:${t}`)}var Yr=Array.from({length:11},(e,t)=>t/10);function Xr(e,t){if(!e.isIntersecting)return!1;let{intersectionRect:n,boundingClientRect:r,rootBounds:o}=e;if(!n||!r)return!0;let s=n.width*n.height,i=r.width*r.height,c=o?Math.min(i,o.width*o.height):i;return c>0&&s/c>=t}function Z(e){let{selector:t,onViewable:n,visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=e,i=new Map,c=new WeakSet,u=new Set,d=m=>{i.has(m)||i.set(m,setTimeout(()=>{i.delete(m),n(m)&&(p?.unobserve(m),u.delete(m))},o))},f=m=>{clearTimeout(i.get(m)),i.delete(m)},p=typeof IntersectionObserver>"u"?null:new IntersectionObserver(m=>{for(let E of m){let w=E.target;if(!Xr(E,r)){u.delete(w),f(w);continue}u.add(w),h()&&d(w)}},{threshold:Yr}),h=()=>typeof document>"u"||document.visibilityState!=="hidden",b=()=>{if(h())for(let m of u)d(m);else for(let m of u)f(m)};document.addEventListener("visibilitychange",b);let y=()=>{for(let m of s.querySelectorAll(t))c.has(m)||(c.add(m),p?.observe(m))},_=typeof MutationObserver>"u"?null:new MutationObserver(()=>y()),A=()=>{y(),_?.observe(s===document?document.body:s,{childList:!0,subtree:!0})},v=s===document&&!document.body;return v?document.addEventListener("DOMContentLoaded",A,{once:!0}):A(),()=>{v&&document.removeEventListener("DOMContentLoaded",A),document.removeEventListener("visibilitychange",b),p?.disconnect(),_?.disconnect();for(let m of i.values())clearTimeout(m);i.clear(),u.clear()}}function lt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-exposure]",visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=t;return Z({selector:n,root:s,visibleRatio:r,dwellMs:o,onViewable(i){let c=i.dataset?.hpExposure?.trim();return c&&e.surfaceViewed({surface:c}),!0}})}var pn=e=>{try{return new URL(e,document.baseURI).toString()}catch{return e}};function dt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-list]",tileSelector:r="[data-hp-product]",visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,c=new Set,u=y=>y.closest?.(n)??null,d=y=>{let _=y.dataset.hpList?.trim();return _?{list_id:_,category:y.dataset.hpListCategory?.trim()||null}:null},f=y=>Array.from(y.querySelectorAll(r)).filter(_=>u(_)===y),p=(y,_)=>{try{let A=JSON.parse(y.dataset.hpProduct??"");return!A||typeof A!="object"||!A.product_id?null:{...A,position:A.position??_+1,...A.url?{url:pn(A.url)}:{},...A.image_url?{image_url:pn(A.image_url)}:{}}}catch{return null}},h=Z({selector:`${n} ${r}`,root:i,visibleRatio:o,dwellMs:s,onViewable(y){let _=u(y);if(!_||_.dataset.hpListView==="manual")return!0;let A=d(_);if(!A||c.has(A.list_id))return!0;let v=new Set,m=f(_).map(p).filter(E=>!E||v.has(E.product_id)?!1:(v.add(E.product_id),!0));return m.length===0||(c.add(A.list_id),e.productListViewed({...A,products:m})),!0}}),b=y=>{let A=y.target?.closest?.("a[href]")?.closest(r);if(!A)return;let v=u(A),m=p(A,v?f(v).indexOf(A):0);m&&e.productClicked({list_id:v?d(v)?.list_id??null:null,products:[m]})};return document.addEventListener("click",b,!0),()=>{document.removeEventListener("click",b,!0),h()}}function R(e,...t){let n=e.dataset??{};for(let r of t){let o=n[r];if(typeof o=="string"&&o.trim()!=="")return o.trim()}return null}function $e(e,...t){let n=R(e,...t);if(n===null)return null;let r=Number(n);return Number.isFinite(r)?Math.trunc(r):null}function Zr(e,t){let n=R(e,"hpPromotion");return n?{promotion_id:n,name:R(e,"hpPromotionName"),creative:R(e,"hpPromotionCreative"),position:R(e,"hpPromotionSlot")??String(t+1)}:null}function ft(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-promotion]",resolve:r=Zr,visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,c=new Set,u=p=>{let h=Array.from(i.querySelectorAll(n)),b=h.indexOf(p);try{return r(p,b<0?h.length:b)}catch{return null}},d=Z({selector:n,root:i,visibleRatio:o,dwellMs:s,onViewable(p){let h=u(p);return!h||c.has(h.promotion_id)?!1:(c.add(h.promotion_id),e.promotionViewed(h),!0)}}),f=p=>{let h=p.target;if(!h||typeof h.closest!="function")return;let b=h.closest(n),y=h.closest("a[href]");if(!b||!y||!b.contains(y)&&!y.contains(b))return;let _=u(b);_&&e.promotionClicked({..._,href:y.getAttribute("href")})};return document.addEventListener("click",f,!0),()=>{document.removeEventListener("click",f,!0),d()}}function Qr(e){let t=R(e,"hpRecoRequest"),n=R(e,"hpRecoPlacement"),r=R(e,"hpRecoStrategy");if(!t||!n||!r)return null;let o=R(e,"hpRecoHoldout");return{recommendation_request_id:t,placement:n,strategy:r,recipe:R(e,"hpRecoRecipe"),algorithm_version:R(e,"hpRecoAlgorithmVersion"),experiment:R(e,"hpRecoExperiment"),variant:R(e,"hpRecoVariant"),holdout:o===null?null:o==="true",assignment_bucket:$e(e,"hpRecoBucket"),assignment_unit_kind:R(e,"hpRecoUnitKind"),candidate_set_fingerprint:R(e,"hpRecoFingerprint"),candidate_set_size:$e(e,"hpRecoCandidates"),ranked_by:R(e,"hpRecoRankedBy"),served_at:R(e,"hpRecoServedAt")}}function eo(e,t){let n=R(e,"hpRecoProduct");if(!n)return null;let r=R(e,"hpRecoPrice");return{product_id:n,sku:R(e,"hpRecoSku"),name:R(e,"hpRecoName"),brand:R(e,"hpRecoBrand"),price:r===null||Number.isNaN(Number(r))?null:Number(r),position:$e(e,"hpRecoPosition")??t+1}}function pt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-reco-request]",tileSelector:r="[data-hp-reco-product]",resolveRail:o=Qr,resolveTile:s=eo,visibleRatio:i=.5,dwellMs:c=1e3,root:u=document}=t,d=new Set,f=new Map,p=new Map,h=(m,...E)=>{try{return m(...E)}catch{return null}},b=m=>typeof m.closest=="function"?m.closest(n):null,y=m=>Array.from(m.querySelectorAll(r)),_=(m,E)=>{if(p.delete(E.recommendation_request_id),d.has(E.recommendation_request_id))return;let w=y(m).map((S,N)=>h(s,S,N)).filter(S=>S?.product_id);if(w.length===0)return;d.add(E.recommendation_request_id);let g=[...f.get(E.recommendation_request_id)?.values()??[]].sort((S,N)=>S.position-N.position);e.recommendationsViewed({...E,products:w,viewable:g})},A=Z({selector:`${n} ${r}`,root:u,visibleRatio:i,dwellMs:c,onViewable(m){let E=b(m);if(!E)return!0;let w=h(o,E);if(!w)return!0;let g=w.recommendation_request_id,S=h(s,m,y(E).indexOf(m));if(S?.product_id){f.has(g)||f.set(g,new Map);let N=f.get(g);N.has(S.position)||N.set(S.position,{position:S.position,product_id:S.product_id,viewable_at:new Date().toISOString()})}return!d.has(g)&&!p.has(g)&&p.set(g,setTimeout(()=>_(E,w),0)),!0}}),v=m=>{let E=m.target;if(!E||typeof E.closest!="function")return;let w=E.closest(r);if(!w)return;let g=E.closest("[data-hp-reco-interaction]"),S=E.closest("a[href]"),N=S&&(w.contains(S)||S.contains(w));if(!(g&&w.contains(g))&&!N)return;let M=b(w);if(!M)return;let K=h(o,M);if(!K)return;let z=h(s,w,y(M).indexOf(w));if(!z?.product_id)return;let B=K.recommendation_request_id;d.has(B)||(clearTimeout(p.get(B)),_(M,K)),e.productClicked({recommendation_request_id:K.recommendation_request_id,interaction:R(g??w,"hpRecoInteraction")??"navigate",products:[z]})};return document.addEventListener("click",v,!0),()=>{document.removeEventListener("click",v,!0);for(let m of p.values())clearTimeout(m);p.clear(),A()}}var he=new Set(["home","list","product","search","basket","checkout","order_confirmation","login","register","account","info","blog","other"]),to=new Set(["products"]),mn=e=>e==null;function mt(e,t=new WeakSet){if(e instanceof Date)return e.toJSON();if(e===null||typeof e!="object"||t.has(e))return e;t.add(e);let n=Array.isArray(e)?e.map(r=>mt(r,t)):Object.fromEntries(Object.entries(e).filter(([,r])=>!mn(r)).map(([r,o])=>[r,mt(o,t)]));return t.delete(e),n}function ht(e){if(!e)return e;let t=mt(e);for(let n of to)n in e&&mn(e[n])&&(t[n]=e[n]);return t}function hn(){try{let e=performance.getEntriesByType("navigation")[0];return e?["navigate","reload","back_forward","prerender"].includes(e.type)?e.type:"navigate":null}catch{return null}}var no=new Set(["","unknown","undefined","null","none","nil","nan","anonymous","guest","0","-1"]);function q(e){if(e==null)return null;let t=String(e).trim();return no.has(t.toLowerCase())?null:t}function Q(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var gn="1.18";function U(e){if(typeof document>"u")return null;try{let t=document.cookie.split(";").map(n=>n.trim()).find(n=>n.startsWith(`${e}=`));return t&&decodeURIComponent(t.slice(e.length+1))||null}catch{return null}}var ro={gclid:"gclid",fbclid:"fbclid",ttclid:"ttclid"},oo=/[a-z0-9._%+-]+@[a-z0-9-]+(\.[a-z0-9-]+)*\.[a-z]{2,}/i,so=/\d(?:[ -]?\d){12,}/,io=new Set(["gclid","fbclid","ttclid","msclkid"]);function wn(e,t=""){if(typeof e!="string"||e==="")return!1;let n=[e];try{let o=decodeURIComponent(e.replace(/\+/g," "));o!==e&&n.push(o)}catch{}let r=!io.has(String(t).toLowerCase());return n.some(o=>oo.test(o)||r&&so.test(o))}function ao(e){if(!e)return null;let t=new URLSearchParams(e),n={},r={utm_source:"source",utm_medium:"medium",utm_campaign:"name",utm_term:"term",utm_content:"content"};for(let[o,s]of[...Object.entries(r),...Object.entries(ro)]){let i=t.get(o);i&&!wn(i,o)&&(n[s]=i)}return Object.keys(n).length?n:null}var co=["email","e-mail","password","pass","pwd","token","auth","code","uid","customer_id","postcode","zip","phone","applyCode"],uo=["email","password","passwd","pwd","token","secret","auth","session","phone","postcode","zip","address","birth","card","cvv","iban","ssn","customerid","userid"],lo=["tel","uid","dob"],fo=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","ttclid","msclkid"],po=new Set(co.map(e=>e.toLowerCase()));function mo(e){let t=String(e).toLowerCase();if(po.has(t))return!0;let n=t.replace(/[-_.]/g,"");return uo.some(o=>n.includes(o))?!0:String(e).replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).some(o=>lo.includes(o))}function gt(e){return(e??[]).map(t=>{try{return new RegExp(`^${t}$`,"i")}catch{return{test:n=>n.toLowerCase()===String(t).toLowerCase()}}})}function Sn(e,t={}){if(!e)return null;try{let n=new URLSearchParams(e),r=t.queryParamAllowlist?gt([...t.queryParamAllowlist,...fo]):null,o=gt(t.queryParamBlocklist),s=gt(t.sensitiveParamAllowlist);for(let c of new Set(n.keys()))(mo(c)&&!s.some(d=>d.test(c))||n.getAll(c).some(d=>wn(d,c))||(r?!r.some(d=>d.test(c)):o.some(d=>d.test(c))))&&n.delete(c);let i=n.toString();return i?`?${i}`:""}catch{return""}}function _n(e,t,n={}){if(!e)return null;try{let r=new URL(e);return t&&r.origin===t?r.origin+r.pathname+(Sn(r.search,n)??""):r.origin+r.pathname}catch{return null}}function yt(e,t={}){if(typeof e!="string"||typeof location>"u")return null;try{let n=new URL(e,location.href);return n.protocol!=="https:"&&n.protocol!=="http:"?null:_n(n.href,location.origin,t)}catch{return null}}function wt(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{3}$/.test(t)?t:null}function yn(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{2}$/.test(t)?t:null}function St(e){if(typeof e!="string")return null;let t=e.trim().replace(/_/g,"-");if(!/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(t))return null;try{return Intl.getCanonicalLocales(t)[0]}catch{return null}}function D(e,t){if(typeof e=="function")try{let n=e();if(n!=null)return n}catch{}return t}function ho(e){return{property_id:String(e.propertyId),channel:e.channel??null,market:e.market??null,environment:e.environment??null}}function go(e){let t=typeof window<"u"?window.location:null,n=t?Sn(t.search,e):null;return{url:t?t.origin+t.pathname+(n??""):e.pageUrl??null,path:t?t.pathname:e.pagePath??null,search:n??null,referrer:typeof document<"u"?_n(document.referrer,t?.origin,e):null,title:typeof document<"u"&&document.title||null,type:e.pageType??null}}var Ae;function yo(){if(Ae!==void 0)return Ae;try{Ae=globalThis.Temporal?.Now?.timeZoneId?.()||Intl.DateTimeFormat().resolvedOptions().timeZone||null}catch{Ae=null}return Ae}function bn(e,t={}){let n=typeof window<"u"?window.location:null,r={library:{name:e.libraryName,version:e.libraryVersion},spec:{version:gn},source:ho(e),session_id:D(e.getSessionId,null),identity_trust:q(D(e.getAnonymousId,null))?"device":"none",page:go(e),campaign:n?ao(n.search):null,device:{user_agent:typeof navigator<"u"?navigator.userAgent:null,type:null,viewport_width:typeof window<"u"?window.innerWidth:null,viewport_height:typeof window<"u"?window.innerHeight:null},currency:wt(D(e.getCurrency,e.currency)),locale:St(D(e.getLocale,e.locale)),timezone:yo(),country:yn(e.country),ship_to_country:yn(D(e.getShipToCountry,e.shipToCountry)),ip:null,bot:null,consent:e.getConsent?.()??null,experiments:D(e.getExperiments,null),audiences:D(e.getAudiences,null),decisions:D(e.getDecisions,null),recommendations:D(e.getRecommendations,null),extensions:D(e.getExtensions,null)};return xn(r,t)}function xn(e,t){if(!t)return e;let n={...e};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&!Array.isArray(o)&&e[r]&&typeof e[r]=="object"&&!Array.isArray(e[r])?n[r]=xn(e[r],o):o!==void 0&&(n[r]=o);return n}var ae=Object.freeze({consent:"thg_hp_consent",retry:"thg_hp_retry",sessionSignals:"thg_hp_session_signals",identified:"thg_hp_identified",previousPage:"thg_hp_prev_page",decisions:"thg_hp_decisions",settings:"thg_hp_settings",held:"thg_hp_held",carried:"thg_hp_carried",recommendationContext:"thg_hp_recommendation_context",anonymousId:"thg_hp_anonymous_id",session:"thg_hp_session",preview:"thg_hp_preview",debug:"thg_hp_debug",onsite:"thg_hp_onsite"}),wo={retry:"cdp.retry",sessionSignals:"cdp_session_signals",identified:"cdp_identified",previousPage:"cdp_prev_page_message_id"},_t={...ae},In=!1;function Ue(e){let t={...ae};for(let[n,r]of Object.entries(e??{})){if(!(n in ae))throw new Error(`storageNames: unknown kind "${n}"`);if(typeof r!="string"||!/^[\w.-]+$/.test(r))throw new Error(`storageNames.${n} must be a non-empty cookie-safe name`);t[n]=r}_t=t}function L(e){return _t[e]}var So="_",kn=e=>e==null||e===""?So:String(e);function F(e,t,n){let r=`${e}:${kn(t)}`;return n==null||n===""?r:`${r}:${n}`}function An(e,t){return`${e}:${kn(t)}:`}function Ve(){if(!In){In=!0;for(let e of[()=>localStorage,()=>sessionStorage]){let t;try{if(t=e(),!t)continue;for(let n of Object.keys(t))for(let[r,o]of Object.entries(wo)){if(n!==o&&!n.startsWith(`${o}:`))continue;let s=_t[r]+n.slice(o.length);t.getItem(s)===null&&t.setItem(s,t.getItem(n)),t.removeItem(n)}}catch{}}}}var xt=1800*1e3,Be=()=>{try{return typeof sessionStorage>"u"?null:sessionStorage}catch{return null}},bt=()=>{try{return typeof localStorage>"u"?null:localStorage}catch{return null}};function vn(e,t=()=>Date.now()){return{read(){try{let n=Be()?.getItem(e),r=n?JSON.parse(n):null;return!r||t()-r.savedAt>xt?(r&&Be()?.removeItem(e),{items:[],anonymousId:null}):{items:Array.isArray(r.items)?r.items:[],anonymousId:typeof r.anonymousId=="string"?r.anonymousId:null}}catch{return{items:[],anonymousId:null}}},write(n,r=null){try{n.length===0?Be()?.removeItem(e):Be()?.setItem(e,JSON.stringify({savedAt:t(),items:n,anonymousId:r}))}catch{}}}}var _o=400*24*60*60;function ee(e,t,n,r){if(typeof document>"u")return!1;try{let o=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",s=r?`; Domain=${r}`:"",i=n===null?"":`; Max-Age=${n}`;return document.cookie=`${e}=${encodeURIComponent(t)}; Path=/${i}; SameSite=Lax`+s+o,!0}catch{return!1}}function bo({name:e,domain:t=null,legacyKey:n,read:r,mint:o,mayStore:s,carried:i=null}){let c=null;try{c=bt()?.getItem(n)||null}catch{c=null}let u=r(e)??c??i,d=!1,f=()=>{if(!(d||u===null||!s())&&(d=ee(e,u,_o,t),!(!d||c===null)))try{bt()?.removeItem(n),c=null}catch{}};return{get(){return u??(u=o()),f(),u},peek:()=>u,persist:f,forget(){ee(e,"",0,t),u=null,d=!1;try{bt()?.removeItem(n)}catch{}c=null}}}function En(e,{carried:t=null,mayStore:n,orOwn:r=!1}){let o=e.anonymousIdSource,s=()=>bo({name:L("anonymousId"),domain:e.consentCookieDomain??null,legacyKey:F(L("anonymousId"),e.propertyId),read:U,mint:Q,mayStore:n,carried:t});if(o?.source==="hp_cookie"){let u=s();return e.getAnonymousId=()=>u.get(),u}if(o?.source==="site_cookie"&&o.cookie){let u=o.cookie;e.getAnonymousId=()=>U(u)}if(!r)return null;let i=e.getAnonymousId,c=s();return e.getAnonymousId=()=>q(D(i,null))??c.get(),c}var xo=200;function Cn(e,t,n=()=>Date.now()){let r=()=>F(L("carried"),e),o=!1;function s(){try{let i=JSON.parse(sessionStorage.getItem(r())??"null");return!i||!(n()-i.savedAt<=xt)?[]:Array.isArray(i.calls)?i.calls:[]}catch{return[]}}return{take(){let i=s();try{sessionStorage.removeItem(r())}catch{}return i},save(i){try{return o||!t()?!1:(sessionStorage.setItem(r(),JSON.stringify({savedAt:n(),calls:[...s(),...i].slice(-xo)})),!0)}catch{return!1}},close(){o=!0}}}var ji=ae.consent,je=Object.freeze({visitor:"visitor",host:"host"}),Pn=()=>({basis:je.host}),Io="hp-consent",ce=["analytics","marketing","personalisation","ad_user_data","ad_personalization"],On={analytics:"a",marketing:"m",personalisation:"p",ad_user_data:"aud",ad_personalization:"adp"},Y=()=>typeof window<"u",Ln=()=>Y()&&typeof window.cookieStore?.addEventListener=="function",ko=e=>e===!0?!0:e===!1?!1:null;function ge(e){if(!e||typeof e!="object")return null;let t={};for(let n of ce)t[n]=ko(e[n]);return t}function kt(e,t){return!e||!t?e===t:ce.every(n=>e[n]===t[n])}function At(e){if(!e)return"";let t=[];for(let n of ce){let r=e[n];(r===!0||r===!1)&&t.push(`${On[n]}=${r?1:0}`)}return t.join("&")}function vt(e){return{[Io]:At(ge(e))}}function ve(e){let t=ge({});if(e==null)return t;let n=String(e).trim();if(n.length>=2&&n.startsWith('"')&&n.endsWith('"')&&(n=n.slice(1,-1)),n.includes("%"))try{n=decodeURIComponent(n.replace(/\+/g," "))}catch{return t}let r=Object.fromEntries(Object.entries(On).map(([s,i])=>[i,s])),o=new Set;for(let s of n.split("&")){let i=s.indexOf("=");if(i<=0)continue;let c=r[s.slice(0,i).trim()],u={1:!0,0:!1}[s.slice(i+1).trim()]??null;!c||u===null||o.has(c)||(t[c]===null?t[c]=u:t[c]!==u&&(t[c]=null,o.add(c)))}return t}function Et(e,t){if(!t)return e;let n=r=>{if(!r)return r;let o={...r};for(let s of ce)s!=="analytics"&&t[s]!==!0&&(o[s]=null);return o};return{name:e.name,basis:e.basis,read:()=>n(e.read()),subscribe:r=>e.subscribe(o=>r(n(o))),get observesChanges(){return e.observesChanges}}}function Ct(e,t={}){return{...e,ad_user_data:t.ad_user_data??e.marketing,ad_personalization:t.ad_personalization??e.marketing}}function He(e,t){let n=!0;return{notify:()=>{if(n)try{let o=e();o&&t(o)}catch{}},stop:()=>n=!1}}var Ao={analytics:["analytics","measure_content_performance","audience_measurement"],marketing:["marketing","targeting","advertising","select_personalized_ads","create_ads_profile"],personalisation:["personalisation","personalization","select_personalized_content","create_content_profile"]};function vo(e,t){if(!t?.length)return null;let n=!1;for(let[r,o]of Object.entries(e)){let s=String(o?.id??r).toLowerCase();if(t.some(c=>{let u=String(c).toLowerCase();return s===u||s.startsWith(`${u}-`)})&&(n=!0,o?.enabled===!0))return!0}return n?!1:null}function Nn(e={}){let t={...Ao,...e.purposes};function n(){let r=Y()?window.Didomi:void 0;if(!r?.getCurrentUserStatus||r.shouldUserStatusBeCollected?.()!==!1||r.isUserStatusPartial?.()===!0)return null;let o=r.getCurrentUserStatus()?.purposes;if(!o||typeof o!="object")return null;let s=i=>vo(o,t[i]);return Ct({analytics:s("analytics"),marketing:s("marketing"),personalisation:s("personalisation")},{ad_user_data:s("ad_user_data"),ad_personalization:s("ad_personalization")})}return{name:"didomi",read:n,observesChanges:!0,subscribe(r){if(!Y())return()=>{};let o=He(n,r),s={event:"consent.changed",listener:o.notify};return window.didomiEventListeners=window.didomiEventListeners||[],window.didomiEventListeners.push(s),window.didomiOnReady=window.didomiOnReady||[],window.didomiOnReady.push(i=>{o.notify(),(i??window.Didomi)?.on?.("consent.changed",o.notify)}),window.Didomi?.on?.("consent.changed",o.notify),o.stop}}}function It(e){let t={};if(!e)return t;for(let n of String(e).split("&")){let r=n.indexOf("=");if(r<=0)continue;let o=n.slice(r+1).replace(/\+/g," ");try{o=decodeURIComponent(o)}catch{}t[n.slice(0,r)]=o}return t}function Tn(e={}){let t={analytics:"C0002",personalisation:"C0003",marketing:"C0004",...e.groups},n=e.impliedConsent===!0;function r(){let i=It(U("OptanonConsent"));if(i.groups){let d={};for(let f of i.groups.split(",")){let[p,h]=f.split(":");p?.trim()&&(d[p.trim()]=h==="1"?!0:h==="0"?!1:null)}return f=>d[f]??!1}let c=Y()?window.OnetrustActiveGroups:void 0;if(typeof c!="string"||!c.length)return null;let u=new Set(c.split(",").map(d=>d.trim()).filter(Boolean));return d=>u.has(d)}function o(){if(U("OptanonAlertBoxClosed"))return!0;try{if(Y()&&window.OneTrust?.IsAlertBoxClosed?.()===!0)return!0}catch{}return Number.parseInt(It(U("OptanonConsent")).interactionCount,10)>0?!0:n&&Y()&&(!!window.OneTrust||typeof window.OnetrustActiveGroups=="string")}function s(){if(!o())return null;let i=r();if(!i)return null;let c=p=>t[p]?i(t[p]):null,u=Ct({analytics:c("analytics"),marketing:c("marketing"),personalisation:c("personalisation")},{ad_user_data:c("ad_user_data"),ad_personalization:c("ad_personalization")}),d=It(U("OptanonConsent"));return(typeof navigator<"u"&&navigator.globalPrivacyControl===!0||d.isGpcEnabled==="1")&&(u.marketing=!1,u.ad_user_data=!1,u.ad_personalization=!1),u}return{name:"onetrust",read:s,observesChanges:!0,subscribe(i){if(!Y())return()=>{};let c=He(s,i),u=!1,d=()=>{u||!window.OneTrust?.OnConsentChanged||(u=!0,window.OneTrust.OnConsentChanged(c.notify))};window.addEventListener("OneTrustGroupsUpdated",c.notify);let f=window.OptanonWrapper;return window.OptanonWrapper=function(...h){try{typeof f=="function"&&f.apply(this,h)}finally{d(),c.notify()}},d(),()=>{c.stop(),window.removeEventListener("OneTrustGroupsUpdated",c.notify)}}}}function Eo(e){let t=String(e).split(",").map(n=>n.trim()).filter(Boolean);return t.length?new Set(t):null}function Rn(e){let{name:t,categories:n,parse:r=Eo,refusedValue:o,source:s="native",changeEvent:i="thg_hp_consent_change"}=e??{};if(typeof t!="string"||t==="")throw new Error("cookieConsent: `name` (the cookie your banner writes) is required");if(!n||typeof n.analytics!="string")throw new Error("cookieConsent: `categories.analytics` (the category id that grants analytics) is required");function c(){let u=U(t);if(u==null)return null;let d;if(o!==void 0&&u===o)d=new Set;else try{d=r(u)}catch{d=null}if(!(d instanceof Set))return null;let f=p=>n[p]?d.has(n[p]):null;return Ct({analytics:f("analytics"),marketing:f("marketing"),personalisation:f("personalisation")},{ad_user_data:f("ad_user_data"),ad_personalization:f("ad_personalization")})}return{name:s,read:c,get observesChanges(){return Ln()},subscribe(u){if(!Y())return()=>{};let d=He(c,u),f=p=>{[...p.changed??[],...p.deleted??[]].some(b=>b?.name===t)&&d.notify()};return window.addEventListener(i,d.notify),window.cookieStore?.addEventListener?.("change",f),()=>{d.stop(),window.removeEventListener(i,d.notify),window.cookieStore?.removeEventListener?.("change",f)}}}}function Dn(e={}){let t=e.name??L("consent"),n=()=>{let r=U(t);if(r==null)return null;let o=ve(r);return o.analytics==null?null:o};return{name:"forwarded",read:n,get observesChanges(){return Ln()},subscribe(r){if(!Y())return()=>{};let o=He(n,r),s=i=>{[...i.changed??[],...i.deleted??[]].some(u=>u?.name===t)&&o.notify()};return window.cookieStore?.addEventListener?.("change",s),()=>{o.stop(),window.cookieStore?.removeEventListener?.("change",s)}}}}function Mn(e){let t=ge(e);return{name:"static",basis:je.host,read:()=>t?{...t}:null,observesChanges:!0,subscribe:()=>()=>{}}}function $n(e){if(e==null)return null;let t=String(e).split("/").map(n=>n.trim()).filter(Boolean).join("/");return t===""?null:t}function Co(e){let t=e.item_category;if(t!=null&&String(t).includes("/"))return $n(t);let n=[t,e.item_category2,e.item_category3,e.item_category4,e.item_category5].map(r=>r==null?"":String(r).trim()).filter(Boolean);return $n(n.join("/"))}var Po=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t};function Oo(...e){for(let t of e){if(typeof t=="number"&&Number.isFinite(t))return String(t);if(typeof t=="string"&&t.trim()!=="")return t.trim()}return null}var qe=e=>Oo(e.item_group_id,e.item_id);function Lo(e,t=qe){if(!e)return null;let n=c=>c==null||c===""||Number.isNaN(Number(c))?null:Number(c),r=c=>{let u=n(c);return u==null?null:Math.round(u*1e6)/1e6},o=c=>{let u=r(c);return u!=null&&u>=0?u:null},s=c=>{let u=n(c);return Number.isInteger(u)&&u>=0?u:null},i=Po;return{product_id:i(t(e)),sku:i(e.item_id),name:i(e.item_name),brand:i(e.item_brand),variant:i(e.item_variant)??i(e.variant),category:Co(e),price:r(e.price),discount:o(e.discount),quantity:s(e.quantity),coupon:i(e.coupon),position:s(e.index)!=null?s(e.index)+1:null,url:i(e.url)??i(e.item_url)??null,image_url:i(e.image_url)??i(e.image_link)??null,displayed_sku:i(e.displayed_sku)??i(e.displayed_variant_sku)}}function Pt(e,t=qe){return(e??[]).map(n=>Lo(n,t)).filter(n=>n?.product_id)}var No=1e3,To={shipping:2,payment:3},Ro=new Set(["password","google","apple","facebook","magic_link","sso","passkey","other"]),V=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t},Do=e=>{if(e==null||e===""||typeof e=="object")return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null},Fe=e=>e!==null&&typeof e=="object";function Mo(e){return Array.isArray(e.items)?e.items.filter(Fe):null}function Un(e){let t=V(e)?.toLowerCase().replace(/[\s-]+/g,"_");return t?Ro.has(t)?t:t==="email"||t==="email_password"?"password":"other":null}function $o({ecommerce:e,items:t}){let n=s=>({promotion_id:V(s.promotion_id),name:V(s.promotion_name),creative:V(s.creative_name),position:V(s.creative_slot)}),r=new Set,o=[];for(let s of[n(e),...t.map(n)])!s.promotion_id||r.has(s.promotion_id)||(r.add(s.promotion_id),o.push(s));return o}var Vn=({ecommerce:e,items:t})=>V(e.item_list_id)??V(e.item_list_name)??V(t[0]?.item_list_id)??V(t[0]?.item_list_name),ue=(e,t)=>t.products?.length?{event:e,properties:t}:null,Uo=new Set(["product","products","item","items"]);function Vo({ecommerce:e}){let t=V(e.item_id),n=V(e.content_type)?.toLowerCase();return!t||n&&!Uo.has(n)?null:{event:"Product Shared",properties:{share_via:V(e.method),products:[{product_id:t}]}}}function Bo(e){let t=o=>ue("Product List Viewed",{list_id:Vn(o),products:o.products}),n=o=>{let s=V(o.ecommerce.search_term);return s?{event:"Products Searched",properties:{query:s,...o.products.length?{products:o.products}:{}}}:null},r=o=>s=>s.promotions.map(i=>({event:o,properties:i}));return{view_item:o=>ue("Product Viewed",{currency:o.currency,value:o.value,products:o.products.slice(0,1)}),view_item_list:t,view_search_results:o=>n(o)??t(o),search:n,select_item:o=>ue("Product Clicked",{list_id:Vn(o),products:o.products.slice(0,1)}),add_to_cart:o=>ue("Product Added",{cart_id:V(o.ecommerce.cart_id),products:o.products}),remove_from_cart:o=>ue("Product Removed",{cart_id:V(o.ecommerce.cart_id),products:o.products}),view_cart:o=>({event:"Cart Viewed",properties:{cart_id:V(o.ecommerce.cart_id),value:o.value,currency:o.currency,coupon:V(o.ecommerce.coupon),...o.itemsListed?{products:o.products}:{}}}),begin_checkout:o=>ue("Checkout Started",{value:o.value,currency:o.currency,coupon:V(o.ecommerce.coupon),products:o.products}),add_shipping_info:o=>({event:"Checkout Step Completed",properties:{step:e.shipping,step_name:"shipping",shipping_method:V(o.ecommerce.shipping_tier)}}),add_payment_info:o=>({event:"Payment Info Entered",properties:{step:e.payment,step_name:"payment",payment_method:V(o.ecommerce.payment_type)}}),view_promotion:r("Promotion Viewed"),select_promotion:r("Promotion Clicked"),add_to_wishlist:o=>ue("Product Added to Wishlist",{products:o.products}),share:Vo,login:o=>({event:"Signed In",properties:{method:Un(o.ecommerce.method)}}),sign_up:o=>({event:"Signed Up",properties:{method:Un(o.ecommerce.method)}})}}var jo=e=>e.event;function Ho(e,t){if(!Fe(e))return null;if(typeof e.length=="number"&&e[0]==="event"&&typeof e[1]=="string"){let r=Fe(e[2])?e[2]:{};return{name:e[1],entry:r,ecommerce:r}}let n=V(t(e));return n?{name:n,entry:e,ecommerce:Fe(e.ecommerce)?e.ecommerce:e}:null}function Ot(e){return Array.isArray(e)?`[${e.map(Ot).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ot(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Bn(e,t={}){if(!e||typeof e.track!="function")throw new Error("connectDataLayer: analytics must have a track(event, properties, options) method");let n=t.dataLayer??(typeof window<"u"?window.dataLayer=window.dataLayer||[]:null);if(!Array.isArray(n))return()=>{};let r=Bo({...To,...t.steps}),o=t.map??{},s=t.eventName??jo,i=t.productId??qe,c=new Set(["purchase","refund",...t.ignore??[]]),u=t.dedupeMs??No,d=new Map,f=!0;function p(w,g,S){if(u<=0)return!1;let N=`${w}|${S??""}|${Ot(g)}`,M=Date.now();for(let[K,z]of d)M-z>u&&d.delete(K);return d.has(N)?!0:(d.set(N,M),!1)}let h=null,b=new Set;function y(w,g){if(w!=="Product Viewed")return!1;let S=typeof location>"u"?"":location.pathname;S!==h&&(h=S,b.clear());let N=g.products?.[0]?.product_id;return N?b.has(N)?!0:(b.add(N),!1):!1}function _({event:w,properties:g={}},S){if(!w||p(w,g,S)||y(w,g))return;let N=S?{context:{currency:S}}:void 0;if(w==="Signed Out"&&typeof e.signedOut=="function"){e.signedOut(N);return}e.track(w,g,N)}function A(w){let g=t.transform?t.transform(w):w,S=Ho(g,s);if(!S||c.has(S.name))return;let N=Object.hasOwn(o,S.name),M=N?o[S.name]:r[S.name];if(typeof M!="function")return;let K=Mo(S.ecommerce),z=K??[],B={...S,items:z,itemsListed:K!==null,products:Pt(z,i),currency:wt(S.ecommerce.currency),value:Do(S.ecommerce.value)};B.promotions=$o(B);let xe=N?M(g,{...B,toProducts:W=>Pt(W,i)}):M(B);for(let W of[xe].flat())W&&_(W,B.currency)}function v(w){if(f)try{A(w)}catch(g){try{t.onError?.(g,w)}catch{}}}for(let w of n.slice())v(w);let m=n.push;function E(...w){let g=m.apply(this,w);for(let S of w)v(S);return g}return n.push=E,()=>{f=!1,n.push===E&&(n.push=m)}}var qo="hp_debug",Fo=256;function Ko(){try{return new URLSearchParams(location.search).get(qo)}catch{return null}}function jn(e,t){if(typeof location>"u")return!1;try{let n=Ko();if(n!==null){let o=n.trim();o===""||o.length>Fo?sessionStorage.removeItem(t):sessionStorage.setItem(t,o)}let r=sessionStorage.getItem(t);return!!(e&&r&&cn(r)===e)}catch{return!1}}var ye=class extends Error{},Go={inHoldout:()=>!0,personalisationGroup:()=>"excluded",servingHeaders:()=>({}),recommendationContext:()=>({}),flush:()=>Promise.resolve(),reset:()=>{}};function Lt(e,t){let n=Go[e]??(()=>null),r=o=>(console.warn(`[hp] ${String(e)} failed; nothing was sent`,o),n());return function(...s){try{let i=t.apply(this,s);return typeof i?.then=="function"?Promise.resolve(i).catch(r):i}catch(i){if(i instanceof ye)throw i;return r(i)}}}function Hn(e){for(let t of Reflect.ownKeys(e)){let{value:n}=Object.getOwnPropertyDescriptor(e,t)??{};typeof n=="function"&&(e[t]=Lt(t,n))}return e}var Ee=Symbol("hp.identityOption");var zo=4320*60*60,Wo=100,Jo=1e3,Yo=2e3,qn=500,Ke=e=>(e?.unref?.(),e);function Xo(e,t){if(t?.analytics===!0&&e.analytics===!1)return"withdrawn";let n=ce.map(r=>e[r]).filter(r=>r!==null);return n.length&&n.every(Boolean)?"accept_all":n.length&&n.every(r=>!r)?"reject_all":"custom"}function Zo(e,t,n=L("consent")){if(!(typeof document>"u"))try{let r=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",o=t?`; Domain=${t}`:"";document.cookie=`${n}=${At(e)}; Path=/; Max-Age=${zo}; SameSite=Lax`+o+r}catch{}}function Qo(e){let t=ve(U(e));return ce.some(n=>t[n]!==null)?t:null}function Fn(e){let{adapter:t,timeoutMs:n=5e3,cookieDomain:r=null,cookieName:o=L("consent"),release:s,announce:i}=e,c=e.discard??(()=>{}),u="pending",d=null,f=null,p=null,h=null,b=!1,y=null,_=[],A=T=>{u=T,e.onStatus?.(T)};function v(){try{return ge(t.read())}catch{return null}}function m(){f&&clearInterval(f),p&&clearTimeout(p),f=null,p=null}let E=()=>typeof window<"u"&&typeof document<"u",w=()=>{try{return typeof t.subscribe=="function"&&t.observesChanges===!0}catch{return!1}};function g(){h&&clearInterval(h),h=null}function S(){b||h||d===null||w()||E()&&document.visibilityState==="hidden"||(h=Ke(setInterval(()=>B(v()),Yo)))}let N=()=>u==="pending"||u==="unknown",M=e.store??null,K=()=>{let T=_.splice(0);M?.write([]);for(let j of T)s(j)},z=()=>{let T=_.splice(0);M?.write([]);for(let j of T)c(j)};function B(T){let j=ge(T);if(!j||j.analytics===null)return;let pe=d===null,X=pe?Qo(o):d;if(!pe&&kt(X,j))return;m(),d=j,S(),Zo(j,r,o);let k=!kt(X,j);if(j.analytics){A("granted"),K(),k&&i({action:Xo(j,X),state:j,previous:X,withdrawal:!1});return}z(),X?.analytics===!0&&i({action:"withdrawn",state:j,previous:X,withdrawal:!0}),A("denied")}function xe(){p=null,u==="pending"&&(A("unknown"),f&&clearInterval(f),f=Ke(setInterval(()=>B(v()),Jo)))}function W(T){N()&&(M||T?.type!=="visibilitychange"&&!T?.persisted&&z())}let re=T=>{document.visibilityState==="hidden"?(g(),W(T)):S()},Ie=T=>{g(),W(T)},fe=T=>{T?.persisted&&d!==null&&B(v()),S()};return{get status(){return u},get state(){return d?{...d}:null},stamp(){return d?{...d,source:t.name??null,basis:t.basis??je.visitor}:null},admits(){return u==="granted"},hold(T){return!N()||_.length>=qn?(c(T),!1):(_.push(T),M?.write(_),!0)},onHidden:W,start(){b=!1;try{y=t.subscribe?.(T=>B(T))??null}catch(T){e.debug&&console.warn("[hp] consent adapter subscribe failed",T)}E()&&(window.addEventListener("pagehide",Ie),window.addEventListener("pageshow",fe),document.addEventListener("visibilitychange",re)),M&&_.length===0&&_.push(...M.read().slice(-qn)),B(v()),!d&&(f=Ke(setInterval(()=>B(v()),Wo)),p=Ke(setTimeout(xe,n)))},stop(){b=!0,m(),g(),typeof y=="function"&&y(),E()&&(window.removeEventListener("pagehide",Ie),window.removeEventListener("pageshow",fe),document.removeEventListener("visibilitychange",re))}}}var es=["recommendation","search_rank","banner","offer","layout","copy","price","other"],Ge=e=>typeof e=="string"&&e!=="";function Kn(e){return(Array.isArray(e?.decisions)?e.decisions:[]).filter(t=>Ge(t?.slot)&&Ge(t.decision_id)&&t.holdout!==!0).map(({decision_id:t,slot:n,arm:r,kind:o})=>({decision_id:t,slot:n,...Ge(r)&&{arm:r},...es.includes(o)&&{kind:o}}))}function Gn({key:e,mayStore:t}){let n,r=()=>{if(n)return n;try{let s=JSON.parse(sessionStorage.getItem(e));n=Array.isArray(s)?s.filter(i=>Ge(i?.slot)):[]}catch{n=[]}return n},o=()=>{try{n?.length&&t()&&sessionStorage.setItem(e,JSON.stringify(n))}catch{}};return{persist:o,current:()=>r().length?n.map(s=>({...s})):null,remember(s){if(!s.length)return;let i=new Set(s.map(c=>c.slot));n=[...r().filter(c=>!i.has(c.slot)),...s],o()},forget(){n=[];try{sessionStorage.removeItem(e)}catch{}}}}function ts(e){let t=2166136261,n=String(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t^=t>>>16,t=Math.imul(t,2246822507)>>>0,t^=t>>>13,t=Math.imul(t,3266489909)>>>0,t^=t>>>16,t>>>0}function ze(e,t,n=1e4){return ts(`${t}\0${e}`)%n}function Nt(e){let t=o=>Math.min(Math.max(Number(o)||0,0),1),n=t(e.share),r=1-n;return{holdout_share:n,personalised_share:e.ramp==null?r:Math.min(t(e.ramp),r)}}function Tt(e,t){if(!e||typeof e.salt!="string")return{holdout:!1,bucket:null,group:"personalised"};let n=e.ramp!=null;if(t==null||t==="")return{holdout:!1,bucket:null,group:n?"excluded":"personalised"};let{holdout_share:r,personalised_share:o}=Nt(e),s=ze(t,e.salt),i=u=>Math.round(u*1e4),c=r>0&&s<i(r)?"holdout":!n||s<i(r+o)?"personalised":"excluded";return{holdout:c==="holdout",bucket:s,group:c}}function zn(e,t){return typeof e!="string"||e===""||t==null||t===""?null:ze(t,`bandit-vs-default:${e}`)<1e4/2?"default":"bandit"}var ns="hp_preview",rs=256;function Wn(e,t=null){if(typeof location>"u")return U(e);let n=null;try{n=new URLSearchParams(location.search).get(ns)}catch{n=null}if(n===null)return U(e);let r=n.trim();return r===""||r.length>rs?(ee(e,"",0,t),null):(ee(e,r,null,t),r)}var os=40,ss=128,is=5,as=60,Yn=e=>typeof e=="string"&&e!==""&&e.length<=ss&&!e.includes(","),Jn=e=>Array.isArray(e)?e.filter(Yn).slice(0,os):[],cs=e=>Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.replaceAll(","," ").trim()).filter(t=>t!=="").slice(0,is):[],us=e=>Object.entries(e&&typeof e=="object"?e:{}).filter(([t,n])=>Yn(t)&&Number.isFinite(n)&&n>=1).sort(([,t],[,n])=>n-t).slice(0,as).map(([t,n])=>`${t}:${Math.floor(n)}`);function Rt(e){let t={},n={viewed:Jn(e?.recentProducts),basket:Jn(e?.basketProducts),q:cs(e?.recentSearches),impressed:us(e?.impressions)};for(let[r,o]of Object.entries(n))o.length>0&&(t[r]=o.join(","));return t}var ls=1800*1e3;function Xn(e,t=Date.now()){try{localStorage.setItem(L("recommendationContext"),JSON.stringify({context:e,until:t+ls}))}catch{}}function Zn(){try{localStorage.removeItem(L("recommendationContext"))}catch{}}var ds="hp_sample",Qn=1e4;function er(e,t){return!(typeof t=="number"&&t<1)||e==null||e===""?!0:ze(e,ds,Qn)<Math.round(t*Qn)}function we(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var fs=2,ps=12;function Ce(e,t=fs){return e.split("/").slice(0,t).join("/")}function Dt(e,t){if(typeof t!="string"||!t.trim())return null;let n=Ce(we(t));return n?(e.unshift(n),e.length=Math.min(e.length,ps),n):null}var le=()=>L("sessionSignals"),Se=null,Mt=()=>Se??le();function tr(){try{return Se?localStorage:sessionStorage}catch{return}}function nr(e,t){let n=t==null?null:String(t),r=e?F(le(),n,e):null;if(r===Se)return;let o=Se===null?ms():null;if(Se=r,!!Se)try{let s=Mt(),i=An(le(),n);for(let c of Object.keys(localStorage))c.startsWith(i)&&c!==s&&localStorage.removeItem(c);o&&!localStorage.getItem(s)&&(localStorage.setItem(s,JSON.stringify(o)),sessionStorage.removeItem(le()))}catch{}}function ms(){try{let e=sessionStorage.getItem(le());if(!e)return null;let t=JSON.parse(e);return t&&(t.productViews>0||t.listViews>0||t.basketValue!=null||t.recentProducts?.length||t.recentBrowse?.length)?t:null}catch{return null}}function We(){return{productViews:0,listViews:0,cartAdds:0,searches:0,recentProducts:[],recentCategories:[],recentBrowse:[],basketProducts:[],basketValue:null,recentSearches:[],impressions:{},browsingCategory:null,recentBrowseCategories:[],browsingListing:null,listViewsByCategory:{},startedAt:0}}function $t(){let e=tr();if(!e)return We();try{let t=e.getItem(Mt());return t?{...We(),...JSON.parse(t)}:{...We(),startedAt:Date.now()}}catch{return{...We(),startedAt:Date.now()}}}function Ut(e){let t=tr();if(t)try{t.setItem(Mt(),JSON.stringify(e))}catch{}}function Vt(){return $t()}function rr(){for(let e of[()=>sessionStorage,()=>localStorage])try{let t=e();t.removeItem(le());for(let n of Object.keys(t))n.startsWith(`${le()}:`)&&t.removeItem(n)}catch{}}var or=20,sr=200,hs=new Set(["Product Viewed","Product Clicked","Product Added","Product Added to Wishlist"]),gs=new Set(["Product Viewed","Product Added"]),ir=50;function Je(e,t){let n=Dt(e.recentBrowse,t);return n?(e.recentBrowseCategories=[e.browsingListing?.category??null,...e.recentBrowseCategories].slice(0,e.recentBrowse.length),n):null}function ys(e,t){let n=e.listViewsByCategory;n[t]=(n[t]??0)+1;let r=Object.keys(n);if(r.length>ir){let o={};for(let s of r.sort((i,c)=>n[c]-n[i]).slice(0,ir))o[s]=n[s];e.listViewsByCategory=o}}function ar(e,t){let n=$t();n.startedAt||(n.startedAt=Date.now());let r=Array.isArray(t?.products)?t.products:[];switch(e){case"Product Viewed":n.productViews+=1,Je(n,n.browsingCategory);break;case"Product List Viewed":{let i=t?.list_id,c=t?.category;if(!(typeof i=="string"&&i.includes("/")&&!i.startsWith("cdp-")))break;let d=typeof c=="string"&&Ce(we(c))||null,f=d?Ce(we(i)):"";if(!f){n.browsingCategory=null,n.browsingListing=null;break}n.browsingListing={key:f,category:d},Je(n,f),n.browsingCategory=f,ys(n,d),n.listViews+=1}break;case"Product List Filtered":{let i=t?.change,c=typeof t?.list_id=="string"?t.list_id:"",u=typeof i?.value=="string"?i.value:"",d=n.browsingListing;if(u&&i?.action!=="removed"&&d&&Ce(we(c))===d.key){let f=Je(n,`${c}/${u}`);f&&(n.browsingCategory=f)}break}case"Product Added":{n.cartAdds+=1,Je(n,n.browsingCategory);for(let i of r){let c=i.product_id;typeof c!="string"||!c||(n.basketProducts=[c,...n.basketProducts.filter(u=>u!==c)].slice(0,or))}break}case"Product Removed":{for(let i of r){let c=i.product_id;typeof c=="string"&&c&&(n.basketProducts=n.basketProducts.filter(u=>u!==c))}break}case"Products Searched":{n.searches+=1;let i=t?.query;if(typeof i=="string"&&i.trim()){let c=i.trim().toLowerCase().slice(0,64);n.recentSearches=[c,...n.recentSearches.filter(u=>u!==c)].slice(0,5)}break}case"Product Clicked":case"Product Added to Wishlist":break;case"Cart Updated":{let i=t?.value;return n.basketValue=typeof i=="number"&&Number.isFinite(i)&&i>=0?i:null,Ut(n),n}default:return n}let o=hs.has(e);if(o)for(let i of r)typeof i.product_id=="string"&&i.product_id&&delete n.impressions[i.product_id];else{for(let c of r){let u=c.product_id;typeof u!="string"||!u||(n.impressions[u]=(n.impressions[u]??0)+1)}let i=Object.keys(n.impressions);if(i.length>sr){let c={};for(let u of i.sort((d,f)=>n.impressions[f]-n.impressions[d]).slice(0,sr))c[u]=n.impressions[u];n.impressions=c}}let s=new Set;for(let i of r){let c=i.product_id;if(o&&typeof c=="string"&&c&&(n.recentProducts=[c,...n.recentProducts.filter(u=>u!==c)].slice(0,or)),gs.has(e)&&typeof i.category=="string"&&i.category){let u=we(i.category);u&&!s.has(u)&&(s.add(u),Dt(n.recentCategories,u))}}return Ut(n),n}var cr=1800*1e3;function ur({name:e,domain:t=null,mayStore:n,now:r=()=>Date.now(),mint:o=Q}){let s=null,i=0,c=()=>{s!==null&&n()&&ee(e,s,cr/1e3,t)};return{get(){let u=r(),d=U(e);return d?s=d:(s===null||u-i>=cr)&&(s=o()),i=u,c(),s},persist:c,forget(){ee(e,"",0,t),s=null}}}var G=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),lr=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),jt=Object.freeze({enabled:!1});function dr(e,t){let n=e?.track;return G(n)?(Object.hasOwn(n,t)?n[t]:n.__default)?.enabled!==!1:!0}function ws(e,t){return`${te(e)}/v1/projects/${encodeURIComponent(t)}/settings`}var Ss="https://hp.thgingenuity.com";function te(e){return e==null||e===""?Ss:pr(e)}function fr(e,t){return e!=null&&e!==""?te(e):t?.startsWith("https://")?t:te(void 0)}function pr(e){if(typeof e!="string")return null;let t=e.trim().replace(/\/+$/,"");return/^https?:\/\/[^/\s]+$/i.test(t)?t:/^[a-z0-9.-]+(:\d+)?$/i.test(t)?`https://${t}`:null}function _s(e){if(!G(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>typeof n=="boolean"));return Object.keys(t).length?t:null}var Bt=e=>typeof e=="number"&&e>=0&&e<=1,bs=/^[0-9a-f]{64}$/;function xs(e){return G(e)?{enabled:e.enabled===!0,tokenSha256:typeof e.tokenSha256=="string"&&bs.test(e.tokenSha256)?e.tokenSha256:null}:{enabled:!1,tokenSha256:null}}function Is(e){if(!G(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>G(n)&&Bt(n.share)&&(n.ramp==null||Bt(n.ramp))&&typeof n.salt=="string"&&n.salt!=="").map(([n,r])=>[n,{share:r.share,ramp:r.ramp??null,salt:r.salt,...lr(r.readoutSlots)&&r.readoutSlots.length>0&&{readoutSlots:r.readoutSlots}}]));return Object.keys(t).length?t:null}var ks=/^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,128}$/;function As(e){return G(e)?e.source==="hp_cookie"?{source:"hp_cookie"}:e.source!=="site_cookie"?null:e.cookie==null?{source:"site_cookie",cookie:null}:typeof e.cookie=="string"&&ks.test(e.cookie)?{source:"site_cookie",cookie:e.cookie}:null:null}function vs(e){let t=Array.isArray(e?.forms)?e.forms.filter(G):[];return t.length===0?null:{forms:t,capture:G(e.capture)?e.capture:null,...Number.isInteger(e.overlay_gap_minutes)?{overlay_gap_minutes:e.overlay_gap_minutes}:{}}}function Es(e){let t=G(e)?e.hp:null;return G(t)&&typeof t.enabled=="boolean"}function Ht(e){let t=G(e)?e.hp:null;if(!G(t)||t.enabled!==!0)return jt;let n=vs(t.onsite);return{enabled:!0,propertyId:typeof t.propertyId=="string"&&t.propertyId!==""?t.propertyId:null,environment:typeof t.environment=="string"?t.environment:null,consentPurposes:_s(t.consent?.purposes),queryParamAllowlist:lr(t.queryParamAllowlist)?t.queryParamAllowlist:null,anonymousId:As(t.anonymousId),apiHost:pr(t.apiHost),holdouts:Is(t.holdouts),sampleRate:Bt(t.sampleRate)?t.sampleRate:1,debug:xs(t.debug),...n&&{onsite:n},plan:G(e.plan)&&G(e.plan.track)?{track:e.plan.track}:null}}async function mr(e,t,n=globalThis.fetch){try{let r=await n(ws(e,t),{credentials:"omit",headers:{accept:"application/json"}});if(!r.ok)return null;let o=await r.json();return Es(o)?Ht(o):null}catch{return null}}var Ye=e=>F(L("settings"),e);function hr(e){try{let t=localStorage.getItem(Ye(e));if(!t)return null;let n=JSON.parse(t);return n?.enabled===!0?n:null}catch{return null}}function gr(e,t){try{t?.enabled===!0?localStorage.setItem(Ye(e),JSON.stringify(t)):localStorage.removeItem(Ye(e))}catch{}}function qt(e){try{localStorage.removeItem(Ye(e))}catch{}}var Cs={flushAt:20,flushIntervalMs:1e4,maxQueue:500,maxRetryAgeMs:1440*60*1e3,maxRetries:5,maxPersistedBatches:20,maxPersistedBytes:1024*1024,storageKey:ae.retry,beaconSafeBytes:56*1024,maxBatchEvents:100,maxBatchBytes:500*1024},Xe=()=>Date.now(),yr=3e4,Yt=55*1024;function Ps(e,t=Xe()){if(typeof e!="string")return 0;let n=e.trim();if(/^\d+$/.test(n))return Number(n)*1e3;if(n==="")return 0;let r=Date.parse(n);return Number.isNaN(r)?0:Math.max(0,r-t)}var ne=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:Buffer.byteLength(e),Ft=()=>typeof window<"u"&&typeof document<"u";function Os(){try{return!Ft()||!window.localStorage?null:(window.localStorage.getItem("thg_hp_probe"),window.localStorage)}catch{return null}}var I,Kt,Gt,Ze,zt,Wt,wr,Pe,Oe,Le,Sr,Jt,_r,Qe,et=class{constructor(t){sn(this,I);this.o={...Cs,...t},this.queue=[],this.timer=null,this.storage=Os(),this.inflight=null,this.sending=new Set,this.epoch=0,this.sinceRefusal=new Set,this.wakers=new Set,this.replayAllowed=!this.o.deferReplay,this.draining=null,Ft()&&(window.addEventListener("pagehide",()=>this.flush({beacon:!0})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush()}),O(this,I,Qe).call(this))}replayPersisted(){return this.replayAllowed=!0,O(this,I,Qe).call(this)}clearPersisted(){if(this.replayAllowed=!1,!!this.storage)try{let t=O(this,I,Le).call(this).filter(n=>this.sinceRefusal.has(n?.id));t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey)}catch{}}discardQueued(){this.queue=[],this.epoch+=1,this.sinceRefusal.clear(),O(this,I,Gt).call(this);for(let t of this.wakers)t()}enqueue(t){let n;try{n=JSON.parse(JSON.stringify(t))}catch(r){this.o.onError?.(`event ${t?.messageId??""} cannot be serialised; dropped`,r);return}this.queue.push(n),this.queue.length>this.o.maxQueue&&this.queue.splice(0,this.queue.length-this.o.maxQueue),this.queue.length>=this.o.flushAt?this.flush():O(this,I,Kt).call(this)}flush(t={}){if(O(this,I,Gt).call(this),this.queue.length===0)return Promise.resolve();if(t.beacon&&Ft()&&typeof navigator<"u"&&navigator.sendBeacon)return O(this,I,wr).call(this),Promise.resolve();if(this.inflight)return this.inflight;let n=O(this,I,Wt).call(this,this.queue,this.o.maxBatchEvents,this.o.maxBatchBytes).map(o=>{let s=O(this,I,Jt).call(this,o);return s&&(this.sending.add(s),this.sinceRefusal.add(s)),{batch:o,id:s}});this.queue=[];let r=this.epoch;return this.inflight=(async()=>{for(let{batch:o,id:s}of n){if(r!==this.epoch){O(this,I,Oe).call(this,s);continue}await O(this,I,Pe).call(this,o,0,s,r)}})().finally(()=>{this.inflight=null,this.queue.length>=this.o.flushAt?this.flush():this.queue.length&&O(this,I,Kt).call(this)}),this.inflight}};I=new WeakSet,Kt=function(){this.timer||(this.timer=setTimeout(()=>this.flush(),this.o.flushIntervalMs),this.timer?.unref?.())},Gt=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},Ze=function(t){return JSON.stringify({batch:t,writeKey:this.o.writeKey,sentAt:new Date().toISOString()})},zt=function(){return`${this.o.apiHost.replace(/\/$/,"")}/v1/batch`},Wt=function(t,n,r){let o=ne(O(this,I,Ze).call(this,[])),s=[],i=[],c=o;for(let u of t){let d=ne(JSON.stringify(u))+1;i.length&&(i.length>=n||c+d>r)&&(s.push(i),i=[],c=o),i.push(u),c+=d}return i.length&&s.push(i),s},wr=function(){let t=this.queue;this.queue=[];let n=O(this,I,zt).call(this);for(let r of O(this,I,Wt).call(this,t,this.o.maxBatchEvents,this.o.beaconSafeBytes)){let o=O(this,I,Ze).call(this,r);if(ne(o)<=this.o.beaconSafeBytes){let s=!1;try{s=navigator.sendBeacon(n,new Blob([o],{type:"text/plain"}))}catch{s=!1}if(s)continue}O(this,I,Pe).call(this,r,0,O(this,I,Jt).call(this,r))}},Pe=async function(t,n,r=null,o=this.epoch){r&&this.sending.add(r);let s=O(this,I,Ze).call(this,t),i=0;try{let c=await fetch(O(this,I,zt).call(this),{method:"POST",headers:{"Content-Type":"text/plain"},body:s,keepalive:ne(s)<=this.o.beaconSafeBytes});if(c.ok)return O(this,I,Oe).call(this,r),O(this,I,Qe).call(this),!0;let u=c.status===408||c.status===429||c.status>=500;if(u&&(i=Ps(c.headers?.get?.("retry-after"))),!u)return O(this,I,Oe).call(this,r),this.o.onError?.(`CDP ingest rejected batch (${c.status}); dropping ${t.length} events`),!0;throw new Error(`retryable ${c.status}`)}catch(c){if(n>=this.o.maxRetries){r&&this.sending.delete(r);let d=r?"kept for the next page":"dropped";return this.o.onError?.(`CDP ingest unreachable after ${n} attempts; ${d}: ${t.length} events`,c),!1}let u=Math.max(Math.min(1e3*2**n,yr)*(.5+Math.random()),Math.min(i,yr));return o===this.epoch&&await new Promise(d=>{let f=()=>{clearTimeout(p),this.wakers.delete(f),d()},p=setTimeout(f,u);this.wakers.add(f)}),o!==this.epoch?(O(this,I,Oe).call(this,r),!1):O(this,I,Pe).call(this,t,n+1,r,o)}},Oe=function(t){t&&(this.sending.delete(t),this.sinceRefusal.delete(t),O(this,I,_r).call(this,t))},Le=function(){let t=JSON.parse(this.storage.getItem(this.o.storageKey)||"[]");return Array.isArray(t)?t:[]},Sr=function(t,n){let r=i=>ne(JSON.stringify(i))+1,o=[...t,n].slice(-this.o.maxPersistedBatches),s=o.reduce((i,c)=>i+r(c),2);for(;o.length>1&&s>this.o.maxPersistedBytes;)s-=r(o[0]),o=o.slice(1);for(;o.length;)try{return this.storage.setItem(this.o.storageKey,JSON.stringify(o)),!0}catch{o=o.slice(1)}return!1},Jt=function(t){if(!this.storage||this.o.mayPersist&&!this.o.mayPersist())return null;try{let n={at:Xe(),id:`${Xe()}-${Math.random().toString(36).slice(2)}`,batch:t};return ne(JSON.stringify(n))+3>this.o.maxPersistedBytes?null:O(this,I,Sr).call(this,O(this,I,Le).call(this),n)?n.id:null}catch{return null}},_r=function(t){if(!(!t||!this.storage))try{let n=O(this,I,Le).call(this).filter(r=>r.id!==t);n.length?this.storage.setItem(this.o.storageKey,JSON.stringify(n)):this.storage.removeItem(this.o.storageKey)}catch{}},Qe=function(){if(!this.storage||!this.replayAllowed)return this.draining??Promise.resolve();if(this.draining)return this.draining;let t;try{let r=O(this,I,Le).call(this);t=r.filter(o=>Array.isArray(o?.batch)&&Xe()-o.at<this.o.maxRetryAgeMs).map(o=>o.id?o:{...o,id:`${o.at}-${Math.random().toString(36).slice(2)}`}),(t.length!==r.length||t.some((o,s)=>o!==r[s]))&&(t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey))}catch{return Promise.resolve()}let n=t.filter(r=>!this.sending.has(r.id));return n.length?(this.draining=(async()=>{for(let r of n)if(!this.replayAllowed||!await O(this,I,Pe).call(this,r.batch,0,r.id))return})().finally(()=>{this.draining=null}),this.draining):Promise.resolve()};var br="3.23.0",xr="@thg-agentic/hyper-personalisation-web";var Ls=new Set(["audiences","decisions","recommendations"]);var Ns=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),Ts=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access");function Rs(e){let t={...e??{}},n=Array.isArray(t.products)?t.products:null;if(t.item_count==null&&n){let r=n.map(o=>o?.quantity);r.every(Number.isInteger)&&(t.item_count=r.reduce((o,s)=>o+s,0))}return t}var Ds="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";function Ms(e){if(/^[0-9a-fA-F]{64}$/.test(e))return e.toLowerCase();if(!/^[A-Za-z0-9+/_-]{43}=?$/.test(e))return null;try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(44,"="));return t.length!==32?null:Array.from(t,n=>n.charCodeAt(0).toString(16).padStart(2,"0")).join("")}catch{return null}}function tt(e){if(typeof e!="string")return null;let t=Ms(e.trim());return t===Ds?null:t}var Ir=Object.freeze({email_sha256:"sha256",phone_sha256:"sha256",accepts_marketing:"boolean",gender:"string",created_at:"date-time"}),$s=/^\d{4}-\d{2}-\d{2}T([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/i;function Us(e){if(typeof e!="string"||!$s.test(e))return!1;let[t,n,r]=e.slice(0,10).split("-").map(Number),o=new Date(Date.UTC(t,n-1,r));return o.getUTCMonth()===n-1&&o.getUTCDate()===r&&!Number.isNaN(Date.parse(e))}function Vs(e,t){return t===null?null:e==="sha256"?tt(t)??void 0:e==="date-time"?t instanceof Date?Number.isNaN(t.getTime())?void 0:t.toISOString():Us(t)?t:void 0:typeof t===e?t:void 0}function Bs(e,t){let n={},r=[];for(let[o,s]of Object.entries(e)){let i=Object.hasOwn(Ir,o)?Ir[o]:null,c=i?Vs(i,s):void 0;c===void 0?r.push(o):n[o]=c}return t&&r.length&&console.warn(`[hp] identify: not sent, not spec traits: ${r.join(", ")}`),n}var kr=!1,Ar=!1;function js(){Ar||(Ar=!0,console.warn("[hp] no consent adapter: events are sent under the host's lawful basis (basis 'host'). Pass `consent` to send only once the visitor allows analytics."))}function Hs(e){!e||kr||(kr=!0,console.warn("[hp] mintAnonymousId is ignored since 3.6: where device ids come from is set per source in the console (the site\u2019s own cookie, or Hyper-Personalisation\u2019s)."))}function qs(e){try{return ne(JSON.stringify(e))}catch{return 0}}function vr(e){return e&&typeof e.context=="object"&&e.context!==null?e.context:e}function Er(e){let t=te(e?.apiHost);if(!t)throw new Error("createAnalytics: apiHost, when given, must be a host or an http(s) origin");if(!e?.propertyId)throw new Error("createAnalytics: propertyId is required");let n={libraryName:xr,libraryVersion:br,writeKey:"web",queryParamBlocklist:[],debug:!1,validate:null,consentTimeoutMs:5e3,...e,apiHost:t};Ue(n.storageNames),Ve();let r=!!n.consent;r||js();let o=null;n.getConsent=()=>o?o.stamp():Pn();let s=()=>!r||o?.status==="granted",i=r&&n.holdAcrossPages?vn(F(L("held"),n.propertyId)):null,c=i?.read()??{items:[],anonymousId:null};n.mintAnonymousId!==void 0&&Hs(n.debug);let u=En(n,{carried:c.anonymousId,mayStore:s,orOwn:!0}),d=ur({name:L("session"),domain:n.consentCookieDomain??null,mayStore:s}),f=n.getSessionId;n.getSessionId=()=>q(D(f,null))??d.get();let p=Wn(L("preview"),n.consentCookieDomain??null),h=(a,l)=>n.debug&&console.warn("[hp]",a,l??""),b=n.transport??new et({apiHost:n.apiHost,writeKey:n.writeKey,storageKey:F(L("retry"),n.propertyId),mayPersist:r?()=>o?.status==="granted":void 0,deferReplay:r,onError:h}),y=F(L("previousPage"),n.propertyId),_=null,A=()=>{if(_)return _;try{return sessionStorage.getItem(y)||null}catch{return null}};typeof window<"u"&&window.addEventListener("pageshow",a=>{a.persisted&&(_=null)});let v=a=>{if(_=a||null,!(r&&o.status!=="granted"))try{sessionStorage.setItem(y,a)}catch{}},m=Gn({key:F(L("decisions"),n.propertyId),mayStore:s});n.getDecisions??(n.getDecisions=m.current);let E=q(D(n.getUserId,null)),w=null,g=null,S=null,N=null,M=new Set,K=new Set;function z(a){if(a.type!=="track"||a.event!=="Cart Updated")return;let l=a.properties?.value;N=typeof l=="number"&&Number.isFinite(l)&&l>=0?l:null;for(let x of M)try{x()}catch(P){console.warn("[hp] a basket listener failed",P)}}function B(a,l,x=!1){z(a);try{return xe(a,l,x)}catch(P){if(P instanceof ye)throw P;return console.warn("[hp] the event was not sent",P),null}}function xe(a,l,x){let P=S;S=null;let H=a.type==="track"?a.event:a.type;if(!x&&!dr(n.plan,H))return null;let C={messageId:P?.messageId??Q(),timestamp:P?.timestamp??new Date().toISOString(),anonymousId:q(D(n.getAnonymousId,null)),userId:E??null,...a,context:bn(n,vr(l))};if(C.properties&&(C.properties=ht(C.properties)),typeof C.properties?.href=="string"&&(C.properties.href=yt(C.properties.href,n)),!x&&!er(C.anonymousId,n.sampleRate))return n.debug&&console.debug("[hp] not sent: outside the sample",C),null;if(n.beforeSend){let me;try{me=n.beforeSend(C)}catch(qr){return console.warn("[hp] beforeSend failed; the event was not sent",qr),null}if(!me)return null;let{type:De,event:rn,messageId:jr,timestamp:Hr}=C;C={...me,type:De,messageId:jr,timestamp:Hr,...rn?{event:rn}:{}}}if(n.validate){let me=n.validate(C,{producer:"web"});if(!me.valid){let De=`[hp] invalid ${C.event??C.type}:
|
|
2
|
+
${me.errors.join(`
|
|
3
|
+
`)}`;if(n.throwOnInvalid)throw new ye(De);console.error(De)}}n.debug&&console.debug("[hp]",C.event??C.type,C);let nn=qs(C);return nn>Yt?(h(`${C.event??C.type} not sent: ${nn} bytes, over the ${Yt}-byte limit for one event`),null):(X(C,x),C)}function W(a){if(a.type==="track"&&T(a),n.onEvent)try{n.onEvent(a)}catch(l){console.warn("[hp] onEvent observer failed",l)}}let re=()=>r&&o?.state?.personalisation===!0,Ie=()=>nr(D(n.getSessionId,null),n.propertyId),fe=!1;function T(a){try{re()?(Ie(),Xn(Rt(ar(a.event,a.properties))),fe=!0):j()}catch(l){n.debug&&console.warn("[hp] the visit was not recorded",l)}}function j(a=!1){Zn(),(a||fe)&&rr(),fe=!1}function pe(){d.forget(),m.forget(),ct.clear(),u?.forget(),j(!0)}function X(a,l){!r||l||o.admits()?(W(a),b.enqueue(a)):o.hold(a)}let k=(a,l,x)=>B({type:"track",event:a,properties:l??{}},x),ct=new Set,Vr=(a,l,x)=>a==="audiences"?{audiences:l?null:x.audiences??[]}:a==="decisions"?{decisions:(x.decisions??[]).map(P=>({slot:P.slot,decision_id:P.decision_id??null,arm:P.arm??null,...P.variant&&{variant:P.variant}}))}:{recommendation_request_id:x.recommendation_request_id??null};r&&(o=Fn({adapter:n.consent,timeoutMs:n.consentTimeoutMs,cookieDomain:n.consentCookieDomain,debug:n.debug,store:i&&{read:()=>c.items,write:a=>i.write(a,u?.peek()??null)},release(a){a.context&&(a.context.consent=o.stamp()),W(a),b.enqueue(a)},onStatus(a){if(a==="granted"&&(u?.persist(),d.persist(),_&&v(_),m.persist(),b.replayPersisted?.()),a==="denied"){b.clearPersisted?.(),u?.forget(),d.forget();try{sessionStorage.removeItem(y)}catch{}m.forget(),j(!0)}try{n.onConsentStatus?.(a)}catch(l){console.warn("[hp] onConsentStatus observer failed",l)}if(a==="granted"||a==="denied")for(let l of K)try{l()}catch(x){console.warn("[hp] a consent listener failed",x)}},announce({action:a,state:l,previous:x,withdrawal:P}){l?.personalisation!==!0&&j(x?.personalisation===!0),P&&b.discardQueued?.(),B({type:"track",event:"Consent Updated",properties:{action:a,state:l}},void 0,P),P&&b.flush()}}),o.start());let Zt=()=>n.holdout?Nt(n.holdout):null,Qt=()=>Tt(n.holdout,q(D(n.getAnonymousId,null))).group;function Br(a,l){if(!Array.isArray(a?.decisions))return a;let x=n.holdout?.readoutSlots??[],P=q(D(n.getAnonymousId,null));return{...a,decisions:a.decisions.map(H=>{let C=H?.variant==="bandit"||H?.variant==="default"?H.variant:!l&&H?.holdout!==!0&&x.includes(H?.slot)?zn(H.slot,P):null;return C?C==="default"?{...H,variant:C,decision_id:null}:{...H,variant:C}:H})}}function en(a,l){if(p)return null;let x=a?.exposure,P=x?.holdout===!0,H=Br(a,P);return m.remember(Kn(H)),!x?.token||ct.has(x.token)?null:(ct.add(x.token),k("Personalisation Exposed",{exposure_token:x.token,surface:x.surface,holdout:P,holdout_share:x.holdout_share??Zt()?.holdout_share??null,personalised_share:x.personalised_share??Zt()?.personalised_share??null,...Vr(x.surface,P,H)},l))}function tn(a){return E&&pe(),E=null,w=null,g=null,a}return Hn({track:(a,l,x)=>a==="Signed Out"?tn(k(a,l,x)):k(a,l,x),page(a,l){a??(a={});let x=n.pageType??null;a.type&&(he.has(a.type)?(x=a.type,n.pageType=a.type):n.debug&&console.warn(`[hp] ignoring unknown page.type "${a.type}". Allowed: ${[...he].join(", ")}`));let P=B({type:"page",properties:{name:a.name??null,navigation_trigger:a.navigation_trigger??hn(),previous_message_id:A()}},{page:{type:x},...vr(l)??{}});return P&&v(P.messageId),P},identify(a,l,x){let{userId:P,...H}=a&&typeof a=="object"?a:{};if(P!==void 0){let C=q(P);x===Ee?g=C:w&&C&&C!==w?pe():n.debug&&g&&C&&C!==g&&console.warn("[hp] identify names another userId than the identity option; using the new one"),E=C,C&&x!==Ee&&(w=C)}return B({type:"identify",traits:Bs(H,n.debug)},l)},reset(){E&&pe(),E=null,w=null,g=null,v("")},productViewed:(a,l)=>k("Product Viewed",a,l),productListViewed:(a,l)=>k("Product List Viewed",a,l),recommendationsViewed:(a,l)=>k("Recommendations Viewed",a,l),personalisationExposed:(a,l)=>k("Personalisation Exposed",a,l),recordExposure:en,surfaceViewed({surface:a}={},l){if(!Ls.has(a)||!n.holdout||a!=="decisions"&&!re())return null;let x=q(D(n.getAnonymousId,null)),P=Tt(n.holdout,x).group;if(P==="excluded")return null;let H=fn({sessionId:Me(D(n.getSessionId,null),x),surface:a});return H?en({exposure:{token:H,surface:a,holdout:P==="holdout"}},l):null},inHoldout:()=>Qt()!=="personalised",personalisationGroup:Qt,productClicked:(a,l)=>k("Product Clicked",a,l),productListFiltered:(a,l)=>k("Product List Filtered",a,l),productsSearched:(a,l)=>k("Products Searched",a,l),searchSuggestionsViewed:(a,l)=>k("Search Suggestions Viewed",a,l),productAdded:(a,l)=>k("Product Added",a,l),productRemoved:(a,l)=>k("Product Removed",a,l),cartUpdated:(a,l)=>k("Cart Updated",Rs(a),l),identityLinked:(a,l)=>k("Identity Linked",a,l),slotEngaged:(a,l)=>p?null:k("Slot Engaged",a,l),productVariantSelected:(a,l)=>k("Product Variant Selected",a,l),cartViewed:(a,l)=>k("Cart Viewed",a,l),productAddedToWishlist:(a,l)=>k("Product Added to Wishlist",a,l),productRemovedFromWishlist:(a,l)=>k("Product Removed from Wishlist",a,l),wishlistProductAddedToCart:(a,l)=>k("Wishlist Product Added to Cart",a,l),productShared:(a,l)=>k("Product Shared",a,l),cartShared:(a,l)=>k("Cart Shared",a,l),couponEntered:(a,l)=>k("Coupon Entered",a,l),couponApplied:(a,l)=>k("Coupon Applied",a,l),couponDenied:(a,l)=>k("Coupon Denied",a,l),couponRemoved:(a,l)=>k("Coupon Removed",a,l),checkoutStarted:(a,l)=>k("Checkout Started",a,l),promotionViewed:(a,l)=>k("Promotion Viewed",a,l),promotionClicked:(a,l)=>k("Promotion Clicked",a,l),checkoutStepViewed:(a,l)=>k("Checkout Step Viewed",a,l),checkoutStepCompleted:(a,l)=>k("Checkout Step Completed",a,l),paymentInfoEntered:(a,l)=>k("Payment Info Entered",a,l),checkoutFailed:(a,l)=>k("Checkout Failed",a,l),signedIn:(a,l)=>k("Signed In",a,l),signedUp:(a,l)=>k("Signed Up",a,l),signedOut:a=>tn(k("Signed Out",{},a)),newsletterSubscribed:(a,l)=>k("Newsletter Subscribed",a,l),newsletterUnsubscribed:(a,l)=>k("Newsletter Unsubscribed",a,l),preferencesStated:(a,l)=>k("Preferences Stated",a,l),backInStockSubscribed:(a,l)=>k("Back In Stock Subscribed",a,l),productReviewed:(a,l)=>k("Product Reviewed",a,l),consentUpdated:(a,l)=>k("Consent Updated",a,l),flush:a=>b.flush(a),recommendationContext(){if(!re())return{};try{return Ie(),Rt(Vt())}catch{return{}}},get consent(){return o?o.state:null},servingHeaders:()=>vt(o?.state??null),get lastPageMessageId(){return A()},get anonymousId(){return q(D(n.getAnonymousId,null))},[Ts](){return{writeKey:n.writeKey,storageKey:F(L("onsite"),n.propertyId),gatewayHost:n.apiHost,servingHost:n.servingHost??n.apiHost,settings:n.onsite??null,debug:n.debug===!0,preview:p,anonymousId:()=>q(D(n.getAnonymousId,null)),sessionId:()=>q(D(n.getSessionId,null)),analytics:s,personalisation:re,consent:()=>n.getConsent(),headers:()=>vt(o?.state??null),pageUrl:()=>typeof location>"u"?null:yt(location.href,n),locale:()=>St(D(n.getLocale,n.locale)),basketValue:()=>{let a=Vt().basketValue;return N??(Number.isFinite(a)?a:null)},onBasket:a=>(M.add(a),()=>M.delete(a)),consentAnswered:()=>!o||o.status==="granted"||o.status==="denied",onConsentAnswered:a=>(K.add(a),()=>K.delete(a))}},[Ns](a,l,x){if(typeof this[a]=="function"){S=typeof x?.messageId=="string"&&typeof x?.timestamp=="string"?{messageId:x.messageId,timestamp:x.timestamp}:null;try{this[a](...Array.isArray(l)?l:[])}finally{S=null}}}})}var nt=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),_e=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),Ne=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),rt=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),Fs=["shown","submitted","apply","closed"],Ks=10,be=()=>typeof window>"u"?null:window;function Te(){try{for(let{resolve:e}of be()?.[_e]?.splice(0)??[])e(!1)}catch{}}var Re=Object.freeze({open(e){try{let t=be();if(!t||typeof e!="string")return Promise.resolve(!1);if(t[nt])return t[nt].open(e);if(t[_e]??(t[_e]=[]),t[_e].length<Ks)return new Promise(n=>t[_e].push({slot:e,resolve:n}))}catch{}return Promise.resolve(!1)},show(e){return Re.open(e)},on(e,t){var n;try{let r=be();return!r||!Fs.includes(e)||typeof t!="function"?()=>{}:(r[Ne]??(r[Ne]={}),((n=r[Ne])[e]??(n[e]=new Set)).add(t),()=>r[Ne][e].delete(t))}catch{return()=>{}}},suppress(e="page"){try{let t=be();if(!t)return;(t[rt]??(t[rt]=new Set)).add(String(e)),t[nt]?.suppress()}catch{}},unsuppress(e){try{let t=be()?.[rt];e===void 0?t?.clear():t?.delete(String(e))}catch{}},debug(){try{return be()?.[nt]?.debug()??[]}catch{return[]}}});function Cr(e){let t=typeof document>"u"?null:document.currentScript?.src;return t?new URL(e,t).href:null}var ot=new Map;function Pr(e,t){return window[t]?Promise.resolve(window[t]):e?(ot.has(t)||ot.set(t,new Promise((n,r)=>{let o=document.createElement("script");o.src=e,o.async=!0,o.onload=()=>window[t]?n(window[t]):r(new Error(`${e} did not register`)),o.onerror=()=>r(new Error(`${e} did not load`)),document.head.append(o)}).finally(()=>ot.delete(t))),ot.get(t)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var Gs=Cr("onsite.min.js"),Or=()=>Pr(Gs,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module"));var Xt=Symbol.for("@thg-agentic/hyper-personalisation-web.bootstrap"),zs=Symbol.for("@thg-agentic/hyper-personalisation-web.drain"),Ws=Symbol.for("@thg-agentic/hyper-personalisation-web.carry"),Lr=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),Js=Symbol.for("@thg-agentic/hyper-personalisation-web.assignment"),Ys=Symbol.for("@thg-agentic/hyper-personalisation-web.recommendation-context"),at=e=>e?()=>U(e):()=>null,Rr={didomi:e=>Nn({purposes:e.purposes}),onetrust:e=>Tn({groups:e.groups,impliedConsent:e.impliedConsent}),cookie:e=>Rn({name:e.name,categories:e.categories,refusedValue:e.refusedValue,source:e.source,changeEvent:e.changeEvent}),forwarded:e=>Dn({name:e.name}),static:e=>{if(!e.state||typeof e.state!="object")throw new Error('consent.state is required for provider "static"');return Mn(e.state)}},Nr=Object.keys(Rr),de=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),st=e=>typeof e=="string"&&e!=="",Xs=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),Dr=e=>de(e)&&typeof e.read=="function";function Zs(e,t={}){let n=[];if(!de(e))return["config must be { writeKey, apiHost? }"];st(e.writeKey)||n.push("writeKey is required"),te(e.apiHost)||n.push("apiHost, when given, must be a host or an http(s) origin"),t.propertyId!==void 0&&!st(t.propertyId)&&n.push("propertyId must be a string");let{consent:r}=t;if(!Dr(r)&&!(de(r)&&Nr.includes(r.provider))&&n.push(`consent must be a consent adapter or { provider: ${Nr.join(" | ")} }`),t.autocapture!==void 0&&t.autocapture!==!1&&!de(t.autocapture)&&n.push("autocapture must be false or { promotions, productLists, recommendations }"),t.onsite!==void 0&&typeof t.onsite!="boolean"&&!de(t.onsite)&&n.push("onsite must be true, false or the onsite options"),t.beforeSend!==void 0&&typeof t.beforeSend!="function"&&n.push("beforeSend must be a function"),t.identityCookies!==void 0)if(!de(t.identityCookies))n.push("identityCookies must be an object");else for(let o of["anonymousId","sessionId"]){let s=t.identityCookies[o];s!==void 0&&!st(s)&&n.push(`identityCookies.${o} must be a cookie name`)}for(let o of["getCurrency","getShipToCountry","getLocale"])t[o]!==void 0&&typeof t[o]!="function"&&n.push(`${o} must be a function`);return t.dataLayer!==void 0&&(de(t.dataLayer)?(t.dataLayer.name!==void 0&&!st(t.dataLayer.name)&&n.push("dataLayer.name must be a string"),t.dataLayer.ignore!==void 0&&!Xs(t.dataLayer.ignore)&&n.push("dataLayer.ignore must be an array of strings")):n.push("dataLayer must be an object")),n}function Qs(e,t,n){if(Dr(e))return Et(e,t.consentPurposes);let{provider:r,...o}=e,s=n?.consent?.[r]??Rr[r];return Et(s(o),t.consentPurposes)}var Mr=(e,t)=>`${e??""}|${t??""}`;function ei(e,t){let n=q(t?.userId),r=tt(t?.emailSha256);if(!n&&!r)return null;try{let o=F(L("identified"),e);if(sessionStorage.getItem(o)===Mr(n,r))return null}catch{}return{...n?{userId:n}:{},...r?{email_sha256:r}:{}}}async function ti({writeKey:e,apiHost:t},n){if(n.settings!==void 0)return{settings:Ht(n.settings),revalidated:null};let r=mr(t,e),o=hr(e);if(o)return{settings:o,revalidated:r};let s=await r,i=s??jt;return{settings:i,revalidated:Promise.resolve(i),unreachable:s===null}}function $r(e,t){let n=t??{},r=typeof window<"u"?window:null;if(r?.[Xt])return r[Xt];let o=Cn(e?.writeKey,()=>{let{analytics:i}=ve(U(L("consent")));return i===!0||i===null&&n.holdAcrossPages===!0}),s=oi(e,n,o);if(r){let i=n.extend?.getSessionId??at(n.identityCookies?.sessionId),c=at(n.identityCookies?.anonymousId);r[Js]=({slot:u,arm:d}={})=>dn({sessionId:Me(i(),c()),slot:u,arm:d}),r[Xt]=s,r[Ws]=o,r[zs]?.(s)}return s}function ni(){let e=globalThis.performance?.now?.();return new Date(Date.now()-(Number.isFinite(e)?e:0)).toISOString()}function Tr(e,t){if(t===!1)return()=>{};let n={promotions:!0,productLists:!0,recommendations:!0,exposures:!0,...t},r=s=>s&&typeof s=="object"?s:{},o=[];try{n.promotions&&o.push(ft(e,r(n.promotions))),n.productLists&&o.push(dt(e,r(n.productLists))),n.recommendations&&o.push(pt(e,r(n.recommendations))),n.exposures&&o.push(lt(e,r(n.exposures)))}catch(s){console.warn("[hp] autocapture not started:",s?.message??s)}return()=>{for(let s of o)s()}}function ri(e,t,n){if(!t||!n.onsite)return Te();Or().then(r=>r.startOnsite(e,t===!0?{}:t)).catch(r=>{Te(),console.warn("[hp] onsite not started:",r?.message??r)})}function it(e){return e.close(),Te(),null}async function oi(e,t,n){try{let r=Zs(e,t);if(r.length)return console.warn(`[hp] not started, the configuration is invalid: ${r.join("; ")}`),it(n);Ue(t.storageNames),Ve();let{writeKey:o}=e,[{settings:s,revalidated:i,unreachable:c},u]=await Promise.all([ti(e,t),Promise.resolve(t.identity).catch(()=>null)]),d=i?s:null,f=!1,p=()=>f&&d&&gr(o,d);if(i?.then(g=>{g&&(d=g,g.enabled?p():qt(o))}),c)return Te(),null;if(!s.enabled)return t.debug&&console.info("[hp] off: the settings for this write key do not enable it"),it(n);let h=t.propertyId??s.propertyId;if(!h)return console.warn("[hp] not started: this write key covers several properties, so propertyId is required"),it(n);let{preset:b}=t,y=ei(h,u),_=t.debug===!0||s.debug?.enabled===!0||jn(s.debug?.tokenSha256??null,L("debug")),A=q(u?.userId),v=Er({apiHost:fr(e.apiHost,s.apiHost),servingHost:te(e.apiHost),onsite:s.onsite??null,writeKey:o,propertyId:h,pageType:he.has(t.pageType)?t.pageType:void 0,environment:s.environment,queryParamAllowlist:s.queryParamAllowlist??void 0,plan:s.plan,sampleRate:s.sampleRate??1,holdout:s.holdouts?.[h],getCurrency:t.getCurrency,getShipToCountry:t.getShipToCountry,getLocale:t.getLocale,consent:Qs(t.consent,s,b),consentCookieDomain:t.consentCookieDomain,storageNames:t.storageNames,holdAcrossPages:t.holdAcrossPages===!0,mintAnonymousId:t.mintAnonymousId,debug:_,anonymousIdSource:s.anonymousId??void 0,getAnonymousId:at(t.identityCookies?.anonymousId),getSessionId:t.identityCookies?.sessionId?at(t.identityCookies.sessionId):void 0,getUserId:()=>A,beforeSend:t.beforeSend,...t.extend,onConsentStatus(g){if(g==="granted"&&(f=!0,p()),g==="denied"){qt(o);try{sessionStorage.removeItem(F(L("identified"),h))}catch{}}t.extend?.onConsentStatus?.(g)},onEvent(g){if(g.type==="identify"){let S=Mr(q(g.userId),tt(g.traits?.email_sha256));try{sessionStorage.setItem(F(L("identified"),h),S)}catch{}}t.extend?.onEvent?.(g)}});typeof window<"u"&&(window[Ys]=()=>v.recommendationContext());for(let[g,S,N]of n.take())try{v[Lr](g,S,N)}catch(M){console.warn(`[hp] carried ${g} failed`,M)}v[Lr]("page",[t.pageType?{type:t.pageType}:{}],{messageId:Q(),timestamp:ni()});let m=Tr(v,t.autocapture),E=v.page;v.page=Lt("page",(...g)=>{let S=E(...g);return m(),m=Tr(v,t.autocapture),S});let w=typeof window<"u"?window:null;if(w?.addEventListener?.("pageshow",g=>{g.persisted&&v.page({navigation_trigger:"back_forward"})}),t.dataLayer&&w){let g=t.dataLayer.name??"dataLayer";w[g]=w[g]||[],Bn(v,{...b,dataLayer:w[g],ignore:[...b?.ignore??[],...t.dataLayer.ignore??[]],onError:S=>_&&console.warn("[hp] dataLayer mapping failed",S)})}return y&&v.identify(y,void 0,Ee),v.onsite=Re,ri(v,t.onsite,s),v}catch(r){return console.warn("[hp] not started:",r?.message??r),it(n)}}function Ur(e){e.initialized=!0,$r(e._config,e._options).then(t=>{let n=e.splice(0);if(!t){for(let r of e.methods??[])e[r]=()=>e;return}e.client=t;for(let[r,o]of Object.entries(t))typeof o=="function"&&(e[r]=o);for(let[r,...o]of n)try{t[r]?.(...o)}catch(s){console.warn(`[hp] queued ${r} failed`,s)}})}var $=window.hp=window.hp||[];$.servingHeaders??($.servingHeaders=()=>({}));$.inHoldout??($.inHoldout=()=>!0);$.personalisationGroup??($.personalisationGroup=()=>"excluded");$.recommendationContext??($.recommendationContext=()=>({}));$.onsite??($.onsite=Re);$.initialized||($._config?Ur($):$.load=(e,t)=>{$._config=e,$._options=t??{},Ur($)});})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{function x(r,e,t,i,o){let n=r("select","i");n.setAttribute("aria-label",e);for(let[a,s]of[["",t],...i]){let c=r("option","",s);c.value=a,c.selected=a===o,n.append(c)}return n}var T=r=>String(r).padStart(2,"0"),D=120,I=/^-?\d{1,10}(?:\.(\d{1,10}))?$/,O=1e9;function N(r){try{let e=new Intl.DateTimeFormat(r,{month:"long",timeZone:"UTC"});return{name:t=>e.format(Date.UTC(2016,t-1,1)),monthFirst:new Intl.DateTimeFormat(r,{month:"numeric",day:"numeric"}).formatToParts(0).find(t=>t.type!=="literal")?.type==="month"}}catch{return{name:String,monthFirst:!1}}}var _=(r,e,t,i,o,n)=>{let a=x(r,t,t,Array.from({length:i},(s,c)=>[T(c+1),o(c+1)]),n);return a.name=e,a};function g(r,e,t,i,o){let n=r("input","i");return n.name=e,n.inputMode=i,n.setAttribute("aria-label",t),n.value=o??"",n}function A(r,e,t,i,o){let n=e.format??{},a=t("div",n.kind==="birthday"?"ph bd":"ph");if(e.type==="number")a.append(g(t,"hp_v",e.label,n.decimals?"decimal":"numeric",i)),n.unit&&a.append(t("span","u",n.unit));else if(n.kind==="birthday"){let[,s,c,f]=/^(\d{4}|-)-(\d\d)-(\d\d)$/.exec(i??"")??[],u=N(o||void 0),p=_(t,"hp_d","Day",31,String,f),m=_(t,"hp_m","Month",12,u.name,c);if(a.append(...u.monthFirst?[m,p]:[p,m]),n.year!=="none"){let d=g(t,"hp_y","Year","numeric",s==="-"?"":s);d.placeholder=n.year==="required"?"Year":"Year (optional)",d.autocomplete="bday-year",d.maxLength=4,a.append(d)}}else{let s=g(t,"hp_v",e.label,"none",i);s.type="date",s.min="1900-01-01",s.max="2100-12-31",a.append(s)}r.append(a)}function v(r,e){try{return new Intl.NumberFormat(e||void 0).format(r)}catch{return String(r)}}var $=(r,e,t)=>{let i=new Date(Date.UTC(r,e-1,t));return i.getUTCMonth()===e-1&&i.getUTCDate()===t};function w(r){let e=r.replace(/\s/g,""),t=e.lastIndexOf(","),i=e.lastIndexOf(".");return t>=0&&i>=0?t>i?e.replace(/\./g,"").replace(",","."):e.replace(/,/g,""):/^-?\d{1,3}(?:,\d{3})+$/.test(e)?e.replace(/,/g,""):e.replace(",",".")}function S(r,e,t=Date.now(),i=void 0){let o=e.format??{},n=l=>r.querySelector(`[name=${l}]`);if(e.type==="number"){let l=n("hp_v"),y=w(l.value);if(!y)return{value:null};let h=Number(y),b=I.exec(y);return b&&(b[1]?.replace(/0+$/,"").length??0)<=(o.decimals?2:0)&&Math.abs(h)<=O&&!(h<o.min||h>o.max)?{value:String(h===0?0:h)}:{error:`Enter a ${o.decimals?"":"whole "}number${o.min!=null&&o.max!=null?` from ${v(o.min,i)} to ${v(o.max,i)}`:""}.`,input:l}}let a=l=>({error:"Enter a real date.",input:l});if(o.kind!=="birthday"){let l=n("hp_v");return l.value?l.value>=l.min&&l.value<=l.max?{value:l.value}:a(l):{value:null}}let[s,c,f]=["hp_d","hp_m","hp_y"].map(n),u=f?.value.trim()??"";if(!s.value&&!c.value&&!u)return{value:null};if(!s.value||!c.value)return a(s.value?c:s);if(!u)return o.year==="required"||!$(2016,+c.value,+s.value)?a(f??s):{value:`--${c.value}-${s.value}`};let p=`${u}-${c.value}-${s.value}`,m=new Date(t).toISOString().slice(0,10),d=new Date(t+864e5).toISOString().slice(0,10),E=`${+m.slice(0,4)-D}${m.slice(4)}`;return/^\d{4}$/.test(u)&&$(+u,+c.value,+s.value)&&p<=d&&p>=E?{value:p}:a(f)}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.answers")]={answerFields:A,answerOf:S};})();
|