@temple-wallet/extension-ads 8.1.1 → 9.0.0-dev.1

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/dist/index.d.ts CHANGED
@@ -96,6 +96,7 @@ interface RawAllAdsRules {
96
96
  permanentNativeAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
97
97
  adsReplaceUrlsBlacklist: string[];
98
98
  elementsToHideOrRemoveRules: Record<string, RawElementsToHideOrRemoveEntry[]>;
99
+ blacklistedHypelabCampaignsSlugs: string[];
99
100
  timestamp: number;
100
101
  }
101
102
 
@@ -119,6 +120,7 @@ interface InsertAdActionProps extends Pick<RawPermanentAdPlacesRule, 'wrapperSty
119
120
  originalWidth: number;
120
121
  originalHeight: number;
121
122
  shouldUseBlurredBackground?: boolean;
123
+ adCategories: string[];
122
124
  }
123
125
  interface ReplaceAllChildrenWithAdAction extends AdActionBase, InsertAdActionProps {
124
126
  type: AdActionType.ReplaceAllChildren;
@@ -177,6 +179,7 @@ interface AdsRules {
177
179
  parentDepth: number;
178
180
  }>;
179
181
  elementsToHideOrRemoveRules: ElementsToHideOrRemoveRule[];
182
+ blacklistedHypelabCampaignsSlugs: string[];
180
183
  timestamp: number;
181
184
  }
182
185
 
@@ -189,12 +192,13 @@ interface IAdsConfiguration {
189
192
  swapTkeyUrl: string;
190
193
  externalAdsActivityMessageType: string;
191
194
  personaIframePath: string;
192
- getAdsStackIframeURL: (id: string, adsMetadataIds: (number | AdMetadata)[], origin: string) => string;
195
+ getAdsStackIframeURL: (id: string, adsMetadataIds: (number | AdMetadata)[], origin: string, adCategories: string[]) => string;
193
196
  buildNativeAdsMeta: (containerWidth: number, containerHeight: number) => AdMetadata[];
194
197
  bannerAdsMeta: AdMetadata[];
195
198
  extVersion: string;
196
199
  templePassphrase: string;
197
200
  isMisesBrowser: boolean;
201
+ pickNextAdMetadata: (allAdsMetadata: AdMetadata[], currentAdMetadata: AdMetadata | undefined, validAdsCounter: number, pageHasPlacesRules: boolean, adCategories: string[]) => AdMetadata | undefined;
198
202
  }
199
203
  declare const configureAds: (config: IAdsConfiguration) => void;
200
204
 
@@ -205,9 +209,9 @@ declare const executeAdsActions: (adsActions: AdAction[]) => Promise<PromiseSett
205
209
  * in a dedicated iframe. Sends messages to the parent window on an attempt to render an ad, on successful rendering,
206
210
  * on ad resize, and on error.
207
211
  */
208
- declare const renderAdsStack: (adId: string, adsMetadata: (number | AdMetadata)[], origin: string) => Promise<void>;
212
+ declare const renderAdsStack: (adId: string, adsMetadata: (number | AdMetadata)[], origin: string, pageHasPlacesRules: boolean | undefined, adCategories: string[], hypelabBlacklistedCampaignsSlugs: string[]) => void;
209
213
 
210
- declare const transformRawRules: (location: Location, rules: RawAllAdsRules) => AdsRules;
214
+ declare const transformRawRules: (locationOrHref: Location | string, rules: RawAllAdsRules) => AdsRules;
211
215
 
212
216
  declare class TempleWalletApi {
213
217
  private api;
@@ -229,6 +233,7 @@ declare class TempleWalletApi {
229
233
  getPermanentNativeAdPlacesRulesForAllDomains: () => Promise<Record<string, RawPermanentAdPlacesRule[]>>;
230
234
  getAdsReplaceUrlsBlacklist: () => Promise<string[]>;
231
235
  getElementsToHideOrRemoveRules: () => Promise<Record<string, RawElementsToHideOrRemoveEntry[]>>;
236
+ getBlacklistedHypelabCampaignsSlugs: () => Promise<string[]>;
232
237
  getAllRules: () => Promise<RawAllAdsRules>;
233
238
  }
234
239
 
package/dist/index.js CHANGED
@@ -3,20 +3,20 @@
3
3
  var semver = require('semver');
4
4
  var lodash = require('lodash');
5
5
  var nanoid = require('nanoid');
6
- var mt = require('webextension-polyfill');
6
+ var ct = require('webextension-polyfill');
7
7
  var cryptoJs = require('crypto-js');
8
- var It = require('axios');
8
+ var Mt = require('axios');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
12
- var mt__default = /*#__PURE__*/_interopDefault(mt);
13
- var It__default = /*#__PURE__*/_interopDefault(It);
12
+ var ct__default = /*#__PURE__*/_interopDefault(ct);
13
+ var Mt__default = /*#__PURE__*/_interopDefault(Mt);
14
14
 
15
- var je=Object.defineProperty,Je=Object.defineProperties;var Ze=Object.getOwnPropertyDescriptors;var oe=Object.getOwnPropertySymbols;var Me=Object.prototype.hasOwnProperty,_e=Object.prototype.propertyIsEnumerable;var xe=(e,t,r)=>t in e?je(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,x=(e,t)=>{for(var r in t||(t={}))Me.call(t,r)&&xe(e,r,t[r]);if(oe)for(var r of oe(t))_e.call(t,r)&&xe(e,r,t[r]);return e},L=(e,t)=>Je(e,Ze(t));var _=(e,t)=>{var r={};for(var s in e)Me.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&oe)for(var s of oe(e))t.indexOf(s)<0&&_e.call(e,s)&&(r[s]=e[s]);return r};var T=(e,t,r)=>new Promise((s,l)=>{var o=i=>{try{n(r.next(i));}catch(d){l(d);}},a=i=>{try{n(r.throw(i));}catch(d){l(d);}},n=i=>i.done?s(i.value):Promise.resolve(i.value).then(o,a);n((r=r.apply(e,t)).next());});process&&process.env&&process.env.NODE_ENV==="development";navigator.userAgent.includes("Macintosh");var be=e=>!!e,et=300,N=(e=et)=>new Promise(t=>setTimeout(t,e));var g=class{};g.IS_MISES_BROWSER=!1,g.ADS_TW_WINDOW_URL="",g.TKEY_INPAGE_AD_URL="",g.SMALL_TKEY_INPAGE_AD_URL="",g.SWAP_TKEY_URL="",g.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE="",g.personaIframePath="",g.getAdsStackIframeURL=()=>"",g.buildNativeAdsMeta=()=>[],g.bannerAdsMeta=[];var tt=e=>{let{adsTwWindowUrl:t,tkeyInpageAdUrl:r,smallTkeyInpageAdUrl:s,swapTkeyUrl:l,externalAdsActivityMessageType:o,personaIframePath:a,getAdsStackIframeURL:n,buildNativeAdsMeta:i,bannerAdsMeta:d,extVersion:m,templePassphrase:A,isMisesBrowser:p}=e;s&&(g.SMALL_TKEY_INPAGE_AD_URL=s),g.ADS_TW_WINDOW_URL=t,g.TKEY_INPAGE_AD_URL=r,g.SWAP_TKEY_URL=l,g.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=o,g.personaIframePath=a,g.getAdsStackIframeURL=n,g.buildNativeAdsMeta=i,g.bannerAdsMeta=d,g.EXTENSION_VERSION=m,g.TEMPLE_PASSPHRASE=A,g.IS_MISES_BROWSER=p;};var Y="twa",z="twa-native",G="twa-sibling-replacement";var le="adRenderStart",ae="resize",K="ready",re="error",de="accelerometer; gyroscope",k="crypto",me="background";var q=/[\d.]+(px)?$/,X=`[${Y}]`,Le=`[${Y}]:not([${z}])`,De=`[${z}]`,Ae=(e,t)=>{let r=parseInt(e,10);return isNaN(r)||!q.test(e)?t:r},U=(e,t,r)=>{e.style[t]=`${Math.max(Ae(e.style[t],0),r)}px`;},Q=e=>e.reduce((t,r)=>t+Ae(r,0),0),j=e=>!!e.closest(X),ce=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute(G))},ne=e=>{let t=getComputedStyle(e),{x:r,right:s,width:l,height:o}=e.getBoundingClientRect(),a={width:l,height:o},n=["width","height"];for(let i of n){let d=t[i],m=e.getAttribute(i),A=Math.max(...[d,m].map(p=>Ae(p!=null?p:"",-1)));A!==-1&&(a[i]=A),i==="width"&&r<0?a.width+=r:i==="width"&&s>window.innerWidth&&(a.width=window.innerWidth-r);}return a},D=(e,t,r=document)=>e?t?[...r.querySelectorAll(e)]:[r.querySelector(e)].filter(s=>!!s):[],O=(e,t)=>{let r=e;for(let s=0;s<t;s++){let l=r.parentElement;if(!l)return null;r=l;}return r},He=(e,t,r,s,l)=>{if(e<2&&t<2)return [];if(s)return g.buildNativeAdsMeta(e,t);let o=r==="permanent"||r==="slot-replacement"?g.bannerAdsMeta.filter(({source:i})=>i.shouldNotUseStrictContainerLimits):[],a=Math.max(e,...o.map(({dimensions:i})=>i.width)),n=Math.max(t,...o.map(({dimensions:i})=>i.height));return g.bannerAdsMeta.reduce((i,{dimensions:d,source:m},A)=>{let{shouldNotUseStrictContainerLimits:p=!1,categories:c=[k]}=m;if(c.every(v=>!l.includes(v)))return i;let{minContainerWidth:u,minContainerHeight:E,width:f,maxContainerWidth:h,maxContainerHeight:S}=d,R=!1;switch(r){case"permanent":R=p||a>=f&&(n>=E||n<2);break;case"slot-replacement":R=p||a>=u&&(n>=E||n<2);break;default:R=e>=u&&t>=E&&e<=h&&t<=S;}return R&&i.push(A),i},[])},rt=e=>{let{x:t,y:r,width:s,height:l}=e.getBoundingClientRect();return t!==0||r!==0||s!==0||l!==0},ue=e=>{let{display:t}=window.getComputedStyle(e);switch(t){case"none":return !0;case"contents":return Array.from(e.children).every(r=>ue(r));default:return !rt(e)}};var Ne=(e,t)=>{let{shouldHide:r,cssString:s,parentDepth:l,isMultiple:o}=e;D(s,o).forEach(a=>{let n=O(a,l);if(!n)return;let i=window.getComputedStyle(n);i.display!=="none"&&i.visibility!=="hidden"&&t.push({type:r?"hide-element":"remove-element",element:n});});};var Oe=(e,t,r)=>T(void 0,null,function*(){let{parentSelector:s,displayWidth:l}=e,{isMultiple:o,cssString:a,parentDepth:n}=s;if(l&&!semver.satisfies(semver.coerce(window.innerWidth),l))return [];let i=D(a,o).map(d=>O(d,n)).filter(d=>!!d);return yield Promise.all(i.map(d=>T(void 0,null,function*(){yield N(0),it(d,e,t,r);}))),i}),he=(e,t)=>{var r,s;return e?{width:(r=document.querySelector(e.width))!=null?r:t,height:(s=document.querySelector(e.height))!=null?s:t}:{width:t,height:t}},it=(e,t,r,s)=>{var ve;let Te=t,{shouldUseDivWrapper:l,divWrapperStyle:o,wrapperStyle:a,elementStyle:n,adSelector:i,insertionIndex:d,insertBeforeSelector:m,insertAfterSelector:A,insertionsCount:p=1,elementsToMeasureSelectors:c,stylesOverrides:u,shouldHideOriginal:E=!1,isNative:f,urlRegexes:h,parentSelector:S}=Te,R=_(Te,["shouldUseDivWrapper","divWrapperStyle","wrapperStyle","elementStyle","adSelector","insertionIndex","insertBeforeSelector","insertAfterSelector","insertionsCount","elementsToMeasureSelectors","stylesOverrides","shouldHideOriginal","isNative","urlRegexes","parentSelector"]),v=R.wrapperType?a:l?o:{display:"contents"},{isMultiple:I,cssString:P,parentDepth:w}=i,M=D(f?De:Le,!0,e).reduce((y,B)=>y.some($=>$.contains(B))?y:[...y.filter($=>!B.contains($)),B],[]),b=M.filter(ue),F=M.length-b.length,W=p-F;if(D(P,I,e).map(y=>O(y,w)).filter(y=>be(y)&&!j(y)).forEach(y=>{var $;let B=window.getComputedStyle(y).display==="none";if(W<=0)(!E||!B)&&s.push({type:E?"hide-element":"remove-element",element:y});else {let qe=he(c,(($=y.parentElement)==null?void 0:$.children.length)===1?y.parentElement:y),Xe=x({type:"replace-element",element:y,wrapperStyle:v,elementStyle:n,stylesOverrides:u},R),Pe={type:"hide-element",element:y},Qe=x({type:"simple-insert-ad",wrapperStyle:v,elementStyle:n,parent:y.parentElement,insertionIndex:Array.from(y.parentElement.children).indexOf(y),isSiblingReplacement:!0,stylesOverrides:u},R),te=[],Ie=ce(y);E&&Ie&&!B?te=[Pe]:E&&!Ie?te=[Pe,Qe]:E||(te=[Xe]),te.length>0&&r(qe,"permanent",f,[k],...te)&&W--;}}),W<=0)return;let H=-1,V=e,ee={width:e,height:e},we=m||A;if(we){let y=e.querySelector(we),B=y==null?void 0:y.parentElement;y&&B&&(V=B,H=Array.from(e.children).indexOf(y)+(m?0:1),ee=he(c,y));}else {let y=d!=null?d:0;H=y<0?Math.max(e.children.length+y,0):Math.min(y,e.children.length),ee=he(c,(ve=e.children[H])!=null?ve:e);}if(H!==-1){let y=x({type:"simple-insert-ad",wrapperStyle:v,elementStyle:n,parent:V,insertionIndex:H,isSiblingReplacement:!1,stylesOverrides:u},R);r(ee,"permanent",f,[k],...Array(W).fill(y));}};var lt=["align-items","align-self","bottom","display","flex","flex-grow","flex-shrink","float","justify-content","justify-self","left","margin","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","padding","position","right","top","vertical-align","z-index"],at=lodash.memoize(e=>e.reduce((t,{dimensions:r})=>{let s=t.filter(({width:l,height:o})=>l<r.width||o<r.height);return (s.length===0||s.some(({width:l,height:o})=>l>r.width||o>r.height))&&s.push(r),s},[])),Ce=(e,t,r,s)=>T(void 0,null,function*(){let l=at(g.bannerAdsMeta),o=e.map(({selector:n,parentDepth:i,categories:d})=>D(n,!0).reduce((m,A)=>{var P;let p=(P=O(A,i))!=null?P:A,c=m.findIndex(({element:w})=>w.contains(p)),u=p.parentElement&&window.getComputedStyle(p.parentElement),{width:E,height:f}=ne(p),h=s.some(w=>{var M;return w.type==="replace-all-children"||w.type==="simple-insert-ad"?w.parent.contains(p)||p.contains(w.parent):((M=w.element.parentElement)==null?void 0:M.contains(p))||p.contains(w.element)}),S=(u==null?void 0:u.display)==="none"||(u==null?void 0:u.visibility)==="hidden",R=c>=0&&m[c]instanceof HTMLAnchorElement,v=l.some(({width:w,height:M})=>E>=w&&f>=M);if(h||!v||S||R)return m;let I={element:p,categories:d};return c>=0?m.splice(c,1,I):m.some(({element:w})=>w.contains(p))||m.push(I),m},[])).flat(),a=t.map(({selector:n,parentDepth:i})=>D(n,!0).map(d=>O(d,i)).filter(d=>!!d)).flat();o=o.filter(({element:n})=>!a.includes(n)),yield Promise.all(o.map(d=>T(void 0,[d],function*({element:n,categories:i}){var u,E,f,h,S,R,v,I;yield N(0);let m=n.parentElement,{width:A,height:p}=window.getComputedStyle(n),c=q.test(A)&&q.test(p)?n:(E=(u=m==null?void 0:m.closest("div, article, aside, footer, header"))!=null?u:(m==null?void 0:m.tagName.toLowerCase())==="body"?void 0:m)!=null?E:n;if(!j(n)&&!n.querySelector(X)&&!s.some(P=>P.type==="simple-insert-ad"?!1:P.type==="replace-all-children"?P.parent.contains(n):P.element===n)){let P=(f=n.getAttribute("style"))!=null?f:"",w=Object.fromEntries(P.split(";").filter(Boolean).map(V=>V.split(":").map(ee=>ee.trim())));if((h=w.width)!=null&&h.match(/^0[a-z]/)||(S=w.height)!=null&&S.match(/^0[a-z]/))return;let M=window.getComputedStyle(n),b=x(x({},Object.fromEntries(lt.map(V=>[V,M.getPropertyValue(V)]))),w),F={type:"hide-element",element:n},W={type:"simple-insert-ad",wrapperStyle:b,parent:(R=n.parentElement)!=null?R:document.body,insertionIndex:Array.from((I=(v=n.parentElement)==null?void 0:v.children)!=null?I:[]).indexOf(n),isSiblingReplacement:!0,shouldUseBlurredBackground:!0},Z,H=n.closest(`[${G}] + *`);H&&H!==n?Z=[{type:"remove-element",element:H.previousElementSibling},F,W]:H?Z=window.getComputedStyle(n).display==="none"?[]:[F]:Z=[F,W],r({width:c,height:c},"provider-replacement",!1,i,...Z);}})));});var We=(e,t,r)=>T(void 0,null,function*(){let{cssString:s,isMultiple:l}=e.selector,o=D(s,l);yield Promise.all(o.map(a=>T(void 0,null,function*(){yield N(0),dt(a,e,t,r);})));}),dt=(e,t,r,s)=>{let{selector:{shouldUseDivWrapper:l,parentDepth:o,divWrapperStyle:a},stylesOverrides:n,shouldHideOriginal:i,isNative:d=!1}=t,m=O(e,o);if(!m||r.some(c=>c.contains(m))||j(m)||m.querySelector(X))return;let A={shouldUseDivWrapper:l,wrapperStyle:a},p;if(l&&i){let c=m.parentElement,u=window.getComputedStyle(m).display==="none",E=x({type:"simple-insert-ad",parent:c,insertionIndex:Array.from(c.children).indexOf(m),stylesOverrides:n==null?void 0:n.map(S=>{var R=S,{parentDepth:f}=R,h=_(R,["parentDepth"]);return L(x({},h),{parentDepth:f-1})}),isSiblingReplacement:!0},A);p=[],u||p.push({type:"hide-element",element:m}),ce(m)||p.push(E);}else if(l)p=[x({type:"replace-element",element:m,stylesOverrides:n==null?void 0:n.map(f=>{var h=f,{parentDepth:u}=h,E=_(h,["parentDepth"]);return L(x({},E),{parentDepth:u-1})})},A)];else if(i){let c={type:"simple-insert-ad",parent:m,insertionIndex:0,stylesOverrides:n,isSiblingReplacement:!0,wrapperStyle:{display:"contents"}};p=Array.from(m.children).filter(u=>window.getComputedStyle(u).display!=="none").map(u=>({type:"hide-element",element:u})),m.querySelector(X)||p.push(c);}else p=[{type:"replace-all-children",parent:m,stylesOverrides:n,wrapperStyle:{display:"contents"}}];p.length>0&&s({width:m,height:m},"slot-replacement",d,[k],...p);};var ct=o=>T(void 0,[o],function*({providersSelectors:e,providersNegativeSelectors:t,adPlacesRules:r,permanentAdPlacesRules:s,elementsToHideOrRemoveRules:l}){let a=[],n=(d,m,A,p,...c)=>{if(c.length>0&&c.every(b=>b.type==="hide-element"||b.type==="remove-element"))return a.push(...c),!0;let{width:u}=ne(d.width),{height:E}=ne(d.height),{paddingLeft:f,paddingRight:h}=window.getComputedStyle(d.width),{paddingTop:S,paddingBottom:R}=window.getComputedStyle(d.height),v=Q([f,h]),I=v===u?u:u-v,P=Q([S,R]),w=P===E?E:E-P,M=He(I,w,m,A,p);return M.length?(a.push(...c.map(b=>b.type==="hide-element"||b.type==="remove-element"?b:L(x({},b),{adsMetadata:M,originalWidth:I,originalHeight:w}))),!0):!1},i=[];return yield Promise.all(l.map(d=>T(void 0,null,function*(){yield N(0),Ne(d,a);}))),yield Promise.all(s.map(d=>T(void 0,null,function*(){yield N(0),i=i.concat(yield Oe(d,n,a));}))),yield Promise.all(r.map(d=>T(void 0,null,function*(){yield N(0),yield We(d,i,n);}))),yield Ce(e,t,n,a),a});var Ee=(o=>(o.Optimal="Optimal",o.SmartyAds="SmartyAds",o.HypeLab="HypeLab",o.Persona="Persona",o.Temple="Temple Wallet",o))(Ee||{});var ge=new Set,Be=new Set,ke=new Set,Fe=e=>T(void 0,null,function*(){let t=e.id;if(!ge.has(t))return ge.add(t),new Promise((r,s)=>{let l=!1,o=a=>{var n,i;if(a.source===e.contentWindow)try{let d=typeof a.data=="string"?JSON.parse(a.data):a.data;if(d.id!==t)return;let m=e.offsetWidth-e.clientWidth,A=e.offsetHeight-e.clientHeight;switch(d.type){case K:r(d.adMetadata.source.providerName);break;case re:window.removeEventListener("message",o),e.style.display="none",s(new Error((n=d.reason)!=null?n:"Unknown error"));break;case le:let{dimensions:p,source:c}=d.adMetadata;l=(i=c.native)!=null?i:!1;let{width:u,height:E}=p;u>0&&E>0&&(c.native?e.style.height=`${E}px`:(U(e,"width",u),U(e,"height",E)));break;case ae:let{width:f,height:h}=d;l?e.style.height=`${h+A}px`:(U(e,"width",f+m),U(e,"height",h+A));}}catch(d){console.error("Observing error:",d);}};window.addEventListener("message",o);}).then(r=>{if(Be.has(t))return;Be.add(t),At(e)?Ve(t,r):pt(e,r);}).catch(r=>{throw console.error(r),r}).finally(()=>void ge.delete(t))}),pt=(e,t)=>{let r=new IntersectionObserver(s=>{s.some(l=>l.isIntersecting)&&(Ve(e.id,t),r.disconnect());},{threshold:.5});r.observe(e);},Ve=(e,t)=>{if(ke.has(e))return;ke.add(e);let r=window.parent.location.href;mt__default.default.runtime.sendMessage({type:g.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:r,provider:Ee[t]}).catch(s=>void console.error(s));},At=e=>{let t=e.getBoundingClientRect(),r=window.visualViewport;if(!r)return !1;let s=Math.min(Math.max(0,t.x),r.width),l=Math.min(Math.max(0,t.x+t.width),r.width),o=Math.min(Math.max(0,t.y),r.height),a=Math.min(Math.max(0,t.y+t.height),r.height),n=t.width*t.height;return (l-s)*(a-o)/n>=.5};var se=(e,t)=>{for(let r in t)e.style.setProperty(r,t[r]);};var ht=(e,t)=>{["width","height"].forEach(s=>{var o;let l=(o=e.style[s])!=null?o:"";q.test(l)&&parseInt(l,10)<t[s]&&e.style.removeProperty(s);});},Et=(e,t,r,s)=>T(void 0,null,function*(){let{elementStyle:l={},stylesOverrides:o=[],adsMetadata:a,wrapperType:n,originalHeight:i,originalWidth:d,shouldUseBlurredBackground:m}=e;o.sort((S,R)=>S.parentDepth-R.parentDepth);let A,p=nanoid.nanoid(),c=document.createElement("iframe");c.loading="lazy",c.src=g.getAdsStackIframeURL(p,a,window.location.href),c.id=p,c.allow=de;let u=a[0],{dimensions:E}=typeof u=="number"?g.bannerAdsMeta[u]:u,f={width:m?Math.max(d,E.width):E.width,height:m?Math.max(i,E.height):E.height};c.style.width=n==="tbody"?"100%":`${f.width}px`,c.style.height=`${f.height}px`,c.style.border="none";for(let S in l)c.style.setProperty(S,l[S]);switch(c.setAttribute(Y,"true"),ht(t,f),r.appendChild(c),e.type){case"replace-all-children":A=e.parent,e.parent.innerHTML="",e.parent.appendChild(t);break;case"replace-element":A=e.element.parentElement,e.element.replaceWith(t);break;default:let S=e.parent.children[e.insertionIndex];if(e.isSiblingReplacement){t.setAttribute(G,"true");let R=new MutationObserver(v=>{v.some(P=>Array.from(P.removedNodes).includes(S))&&(t.remove(),R.disconnect());});R.observe(e.parent,{childList:!0});}A=e.parent,e.parent.insertBefore(t,S);break}if(n!=="tbody"){let{borderLeftWidth:S,borderRightWidth:R,borderTopWidth:v,borderBottomWidth:I}=window.getComputedStyle(c),{borderLeftWidth:P,borderRightWidth:w,borderTopWidth:M,borderBottomWidth:b}=window.getComputedStyle(t),F=Q([S,R,P,w]),W=Q([v,I,M,b]);c.style.width=`${f.width-F}px`,c.style.height=`${f.height-W}px`;}Fe(c).catch(s);let h=0;o.forEach(({parentDepth:S,style:R})=>{for(;S>h&&A;)A=A.parentElement,h++;A&&se(A,R);});}),Ye=e=>T(void 0,null,function*(){let{wrapperStyle:t={},adsMetadata:r,wrapperType:s="div",colsAfter:l=0,colsBefore:o=0,colspan:a=1}=e,n=r.every(A=>typeof A=="object"),i,d;if(s==="div")i=document.createElement("div"),d=i;else {i=document.createElement("tbody");let A=document.createElement("tr");i.appendChild(A);for(let c=0;c<o;c++)A.appendChild(document.createElement("td"));let p=document.createElement("td");p.colSpan=a,A.appendChild(p),d=p;for(let c=0;c<l;c++)A.appendChild(document.createElement("td"));}i.setAttribute(Y,"true"),n&&i.setAttribute(z,"true"),se(i,t);let m=()=>{let A=document.createElement("div");A.setAttribute(Y,"true"),n&&A.setAttribute(z,"true"),e.type==="simple-insert-ad"&&e.isSiblingReplacement&&A.setAttribute(G,"true"),A.style.display="none",i.replaceWith(A);};yield Et(e,i,d,A=>{console.error("Failed to render ads",A),m();}).catch(A=>{throw console.error("Inserting an ad attempt error:",A),m(),A});});var gt=e=>Promise.allSettled(e.map(t=>T(void 0,null,function*(){t.type==="remove-element"?t.element.remove():t.type==="hide-element"?t.element.style.setProperty("display","none","important"):yield Ye(t);})));var fe=(e,t,r=!1)=>{let s=document.createElement("div");s.style.width=`${e}px`,s.style.height=`${t}px`;let l=document.createElement("div");if(l.style.width=`${e}px`,l.style.height=`${t}px`,s.appendChild(l),r){let n=document.createElement("a");return n.href=g.SWAP_TKEY_URL,n.target="_blank",n.rel="noopener noreferrer",n.style.width=`${e}px`,n.style.height=`${t}px`,n.style.overflow="hidden",n.style.textOverflow="ellipsis",n.appendChild(document.createTextNode("TODO: Native TKEY ad")),l.appendChild(n),{element:s}}let o=document.createElement("a");o.href=g.SWAP_TKEY_URL,o.target="_blank",o.rel="noopener noreferrer",o.style.width="100%",o.style.height="100%",l.appendChild(o);let a=document.createElement("img");return a.src=e<=320?g.SMALL_TKEY_INPAGE_AD_URL:g.TKEY_INPAGE_AD_URL,a.style.width="100%",a.style.height="100%",o.appendChild(a),{element:s,creativeSet:{image:{url:a.src}}}};var Re=(e,t,{width:r,height:s},l)=>{let o=document.createElement("iframe");return o.id=e,o.src=Rt(t,l,r,s,o.id),o.style.width=t.native?"100%":`${r}px`,o.style.height=`${s}px`,o.style.border="none",o.allow=de,{element:o}},Rt=(e,t,r,s,l)=>{let{providerName:o,slug:a,native:n}=e,i=new URL(g.ADS_TW_WINDOW_URL);return i.searchParams.set("ap",o.toLowerCase()),n?i.searchParams.set("vh",String(s)):i.searchParams.set("w",String(r)),i.searchParams.set("h",String(s)),i.searchParams.set("p",a),i.searchParams.set("o",yt(t)),l&&i.searchParams.set("id",l),i.toString()},yt=e=>cryptoJs.AES.encrypt(e,g.TEMPLE_PASSPHRASE).toString();var ye=(e,t,{width:r,height:s})=>{let l=document.createElement("iframe"),o="";switch(t.providerName){case"Persona":o=g.personaIframePath;break;default:throw new Error(`Ads from ${t.providerName} are unavailable via extension iframe`)}let a=new URL(o);return a.searchParams.set("id",e),a.searchParams.set("slug",t.slug),l.src=a.toString(),l.id=e,l.style.width=`${r}px`,l.style.height=`${s}px`,l.style.border="none",{element:l}};var ie=e=>window.parent.postMessage(JSON.stringify(e),"*"),Ge=(e,t,r)=>T(void 0,null,function*(){if(t.length===0){ie({id:e,type:re,reason:"No more ads to render"});return}let[s,...l]=t,o=typeof s=="number"?g.bannerAdsMeta[s]:s;ie({id:e,type:le,adMetadata:o}),document.body.style.backgroundColor=o.source.native?"transparent":"#F2F2F2";let{source:a,dimensions:n}=o,i;switch(a.providerName){case"Temple":i=fe(n.width,n.height,a.native);break;case"HypeLab":case"SmartyAds":i=Re(e,a,n,r);break;default:i=ye(e,a,n);}let{element:d}=i,m=document.getElementById("root"),A=document.getElementById("temple-label");m.replaceChildren(d),a.native?A.removeAttribute("active"):A.setAttribute("active","");let p=(c={})=>{let u=document.getElementById(me);if(a.native&&u&&m.removeChild(u),!a.native)try{let{image:E,video:f}=c,h;if(E?(h=document.createElement("img"),h.src=E.url,h.alt=""):f&&(h=document.createElement("video"),h.src=f.url,h.autoplay=!0,h.preload="auto",h.playsInline=!0,h.muted=!0,h.loop=!0),!h&&u&&m.removeChild(u),!h)return;h.id=me,h.style.zIndex="-1",se(h,{position:"absolute",top:"0px",left:"0px",right:"0px",bottom:"0px",width:"100%",height:"100%","object-fit":"cover",filter:"blur(12px)"}),u?m.replaceChild(h,u):m.prepend(h);}catch(E){console.error(E);}};if(d instanceof HTMLIFrameElement)return new Promise((c,u)=>{let E=setTimeout(()=>{window.removeEventListener("message",h),u(new Error(`Timeout exceeded for ${e}, ad source: ${JSON.stringify(a)}`));},(l.length===0?2e4:1e4)*(g.IS_MISES_BROWSER?2:1)),f=!1,h=S=>{var R,v;if(S.source===d.contentWindow)try{let I=typeof S.data=="string"?JSON.parse(S.data):S.data;switch(I.type){case K:f||(f=!0,ie({id:e,type:K,adMetadata:o}),clearTimeout(E),c()),p((R=I.ad)==null?void 0:R.creative_set);break;case re:f||(window.removeEventListener("message",h),clearTimeout(E),u(new Error((v=I.reason)!=null?v:"Unknown error")));break;case ae:let{width:P,height:w}=I;P>0&&w>0&&(o.source.native?d.style.height=`${w}px`:(U(d,"width",P),U(d,"height",w)),ie(L(x({},I),{id:e})));}}catch(I){console.error("Observing error:",I);}};window.addEventListener("message",h);}).catch(c=>(console.error(c),Ge(e,l,r)));p(i.creativeSet),ie({id:e,type:K,adMetadata:o});});var St=(e,t)=>{let{adPlacesRulesForAllDomains:r,providersRulesForAllDomains:s,providersSelectors:l,providersNegativeSelectors:o={},providersToReplaceAtAllSites:a,permanentAdPlacesRulesForAllDomains:n,permanentNativeAdPlacesRulesForAllDomains:i={},adsReplaceUrlsBlacklist:d=[],elementsToHideOrRemoveRules:m={},providersCategories:A={},timestamp:p}=t,{hostname:c,href:u}=e;if(d.some(h=>new RegExp(h).test(u)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],providersNegativeSelectors:[],elementsToHideOrRemoveRules:[],timestamp:p};let E=u.replace(/#.*$/,""),f=h=>{let S=h.source.includes("#")?u:E;return h.test(S)};return {adPlacesRules:Tt(c,f,r),permanentAdPlacesRules:vt(c,f,n,i),providersSelectors:Ke(c,f,s,l,a,A),providersNegativeSelectors:Ke(c,f,s,o,a,A),elementsToHideOrRemoveRules:wt(c,f,m),timestamp:p}},wt=(e,t,r)=>{var s;return ((s=r[e])!=null?s:[]).map(a=>{var n=a,{urlRegexes:l}=n,o=_(n,["urlRegexes"]);return L(x({},o),{urlRegexes:l.map(i=>new RegExp(i))})}).filter(({urlRegexes:l})=>l.some(t))},Tt=(e,t,r)=>{var o;return ((o=r[e])!=null?o:[]).map(i=>{var d=i,{urlRegexes:a}=d,n=_(d,["urlRegexes"]);return L(x({},n),{urlRegexes:a.map(m=>new RegExp(m))})}).reduce((a,m)=>{var A=m,{urlRegexes:n,selector:i}=A,d=_(A,["urlRegexes","selector"]);if(!n.some(t))return a;let E=i,{cssString:p}=E,c=_(E,["cssString"]),u=a.findIndex(S=>{var R=S,{selector:f}=R,h=_(R,["selector"]);let P=f,I=_(P,["cssString"]);return lodash.isEqual(c,I)&&lodash.isEqual(d,h)});return u===-1?a.push(x({selector:i},d)):a[u].selector.cssString+=", ".concat(p),a},[])},ze=e=>o=>{var a=o,{urlRegexes:t,elementToMeasureSelector:r,elementsToMeasureSelectors:s}=a,l=_(a,["urlRegexes","elementToMeasureSelector","elementsToMeasureSelectors"]);return L(x({},l),{urlRegexes:t.map(n=>new RegExp(n)),isNative:e,elementsToMeasureSelectors:s!=null?s:r?{width:r,height:r}:void 0})},vt=(e,t,r,s={})=>{var n,i;let l=(n=r[e])!=null?n:[],o=(i=s[e])!=null?i:[];return l.map(ze(!1)).concat(o.map(ze(!0))).filter(({urlRegexes:d})=>d.some(t))};function Pt(e){let t="";return e.forEach(r=>{t+=r+", ";}),t&&(t=t.slice(0,-2)),t}var Ke=(e,t,r,s,l,o)=>{var A;let n=((A=r[e])!=null?A:[]).map(u=>{var E=u,{urlRegexes:p}=E,c=_(E,["urlRegexes"]);return L(x({},c),{urlRegexes:p.map(f=>new RegExp(f))})}).filter(({urlRegexes:p})=>p.some(t)),i=new Set,d={},m=p=>{var E,f;if(i.has(p))return;let c=((E=o[p])!=null?E:[k]).join("|");((f=s[p])!=null?f:[]).forEach(h=>{let{selector:S,parentDepth:R}=typeof h=="string"?{selector:h,parentDepth:0}:h;d[c]||(d[c]={});let v=d[c];v[R]||(v[R]=new Set),v[R].add(S);}),i.add(p);};return l.forEach(m),n.forEach(({providers:p})=>p.forEach(m)),Object.entries(d).map(([p,c])=>Object.entries(c).map(([u,E])=>({parentDepth:Number(u),selector:Pt(E),categories:p.split("|")}))).flat()};var C=e=>(...t)=>T(void 0,null,function*(){let{data:r}=yield e(...t);return r}),Se=class{constructor(t){this.getAdPlacesRulesForAllDomains=C(()=>this.api.get("/slise-ad-rules/ad-places",this.getAdVersionRequestConfig()));this.getProvidersToReplaceAtAllSites=C(()=>this.api.get("/slise-ad-rules/providers/all-sites"));this.getProvidersCategories=C(()=>this.api.get("/slise-ad-rules/providers/categories"));this.getProvidersRulesForAllDomains=C(()=>this.api.get("/slise-ad-rules/providers/by-sites"));this.getSelectorsForAllProviders=C(()=>this.api.get("/slise-ad-rules/providers",this.getAdVersionRequestConfig()));this.getNegativeSelectorsForAllProviders=C(()=>this.api.get("/slise-ad-rules/providers/negative-selectors",this.getAdVersionRequestConfig()));this.getPermanentAdPlacesRulesForAllDomains=C(()=>this.api.get("/slise-ad-rules/ad-places/permanent",this.getAdVersionRequestConfig()));this.getPermanentNativeAdPlacesRulesForAllDomains=C(()=>this.api.get("/slise-ad-rules/ad-places/permanent-native",this.getAdVersionRequestConfig()));this.getAdsReplaceUrlsBlacklist=C(()=>this.api.get("/slise-ad-rules/replace-urls-blacklist",this.getAdVersionRequestConfig()));this.getElementsToHideOrRemoveRules=C(()=>this.api.get("/slise-ad-rules/elements-to-hide-or-remove",this.getAdVersionRequestConfig()));this.getAllRules=()=>T(this,null,function*(){let[t,r,s,l,o,a,n,i,d,m]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist(),this.getNegativeSelectorsForAllProviders(),this.getElementsToHideOrRemoveRules(),this.getProvidersCategories()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:r,providersSelectors:s,providersToReplaceAtAllSites:l,permanentAdPlacesRulesForAllDomains:o,permanentNativeAdPlacesRulesForAllDomains:a,adsReplaceUrlsBlacklist:n,providersNegativeSelectors:i,elementsToHideOrRemoveRules:d,providersCategories:m,timestamp:Date.now()}});this.api=It__default.default.create({baseURL:new URL("/api",t).href,adapter:"fetch"});}getAdVersionRequestConfig(){return {params:{extVersion:g.EXTENSION_VERSION,isMisesBrowser:g.IS_MISES_BROWSER}}}};
15
+ var Qe=Object.defineProperty,je=Object.defineProperties;var Je=Object.getOwnPropertyDescriptors;var ie=Object.getOwnPropertySymbols;var xe=Object.prototype.hasOwnProperty,be=Object.prototype.propertyIsEnumerable;var Ie=(e,t,r)=>t in e?Qe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,w=(e,t)=>{for(var r in t||(t={}))xe.call(t,r)&&Ie(e,r,t[r]);if(ie)for(var r of ie(t))be.call(t,r)&&Ie(e,r,t[r]);return e},C=(e,t)=>je(e,Je(t));var _=(e,t)=>{var r={};for(var s in e)xe.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&ie)for(var s of ie(e))t.indexOf(s)<0&&be.call(e,s)&&(r[s]=e[s]);return r};var T=(e,t,r)=>new Promise((s,o)=>{var a=l=>{try{i(r.next(l));}catch(d){o(d);}},n=l=>{try{i(r.throw(l));}catch(d){o(d);}},i=l=>l.done?s(l.value):Promise.resolve(l.value).then(a,n);i((r=r.apply(e,t)).next());});process&&process.env&&process.env.NODE_ENV==="development";navigator.userAgent.includes("Macintosh");var _e=e=>!!e,Ze=300,O=(e=Ze)=>new Promise(t=>setTimeout(t,e));var A=class{};A.IS_MISES_BROWSER=!1,A.ADS_TW_WINDOW_URL="",A.TKEY_INPAGE_AD_URL="",A.SMALL_TKEY_INPAGE_AD_URL="",A.SWAP_TKEY_URL="",A.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE="",A.personaIframePath="",A.getAdsStackIframeURL=()=>"",A.buildNativeAdsMeta=()=>[],A.pickNextAdMetadata=()=>{},A.bannerAdsMeta=[];var et=e=>{let{adsTwWindowUrl:t,tkeyInpageAdUrl:r,smallTkeyInpageAdUrl:s,swapTkeyUrl:o,externalAdsActivityMessageType:a,personaIframePath:n,getAdsStackIframeURL:i,buildNativeAdsMeta:l,bannerAdsMeta:d,extVersion:m,templePassphrase:h,isMisesBrowser:c,pickNextAdMetadata:u}=e;s&&(A.SMALL_TKEY_INPAGE_AD_URL=s),A.ADS_TW_WINDOW_URL=t,A.TKEY_INPAGE_AD_URL=r,A.SWAP_TKEY_URL=o,A.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE=a,A.personaIframePath=n,A.getAdsStackIframeURL=i,A.buildNativeAdsMeta=l,A.pickNextAdMetadata=u,A.bannerAdsMeta=d,A.EXTENSION_VERSION=m,A.TEMPLE_PASSPHRASE=h,A.IS_MISES_BROWSER=c;};var G="twa",K="twa-native",$="twa-sibling-replacement";var oe="adRenderStart",ae="resize",te="ready",re="error",le="accelerometer; gyroscope",x="crypto",ce="background";var q=/[\d.]+(px)?$/,X=`[${G}]`,Le=`[${G}]:not([${K}])`,Ce=`[${K}]`,pe=(e,t)=>{let r=parseInt(e,10);return isNaN(r)||!q.test(e)?t:r},U=(e,t,r)=>{e.style[t]=`${Math.max(pe(e.style[t],0),r)}px`;},Q=e=>e.reduce((t,r)=>t+pe(r,0),0),j=e=>!!e.closest(X),de=e=>{var t;return !!((t=e.previousElementSibling)!=null&&t.getAttribute($))},se=e=>{let t=getComputedStyle(e),{x:r,right:s,width:o,height:a}=e.getBoundingClientRect(),n={width:o,height:a},i=["width","height"];for(let l of i){let d=t[l],m=e.getAttribute(l),h=Math.max(...[d,m].map(c=>pe(c!=null?c:"",-1)));h!==-1&&(n[l]=h),l==="width"&&r<0?n.width+=r:l==="width"&&s>window.innerWidth&&(n.width=window.innerWidth-r);}return n},H=(e,t,r=document)=>e?t?[...r.querySelectorAll(e)]:[r.querySelector(e)].filter(s=>!!s):[],B=(e,t)=>{let r=e;for(let s=0;s<t;s++){let o=r.parentElement;if(!o)return null;r=o;}return r},He=(e,t,r,s,o)=>{if(e<2&&t<2)return [];if(s)return A.buildNativeAdsMeta(e,t);let a=r==="permanent"||r==="slot-replacement"?A.bannerAdsMeta.filter(({source:l})=>l.shouldNotUseStrictContainerLimits):[],n=Math.max(e,...a.map(({dimensions:l})=>l.width)),i=Math.max(t,...a.map(({dimensions:l})=>l.height));return A.bannerAdsMeta.reduce((l,{dimensions:d,source:m},h)=>{let{shouldNotUseStrictContainerLimits:c=!1,categories:u=[x]}=m;if(u.every(S=>!o.includes(S)))return l;let{minContainerWidth:p,minContainerHeight:g,width:y,maxContainerWidth:f,maxContainerHeight:P}=d,E=!1;switch(r){case"permanent":E=c||n>=y&&(i>=g||i<2);break;case"slot-replacement":E=c||n>=p&&(i>=g||i<2);break;default:E=e>=p&&t>=g&&e<=f&&t<=P;}return E&&l.push(h),l},[])},tt=e=>{let{x:t,y:r,width:s,height:o}=e.getBoundingClientRect();return t!==0||r!==0||s!==0||o!==0},Ae=e=>{let{display:t}=window.getComputedStyle(e);switch(t){case"none":return !0;case"contents":return Array.from(e.children).every(r=>Ae(r));default:return !tt(e)}};var Ne=(e,t)=>{let{shouldHide:r,cssString:s,parentDepth:o,isMultiple:a}=e;H(s,a).forEach(n=>{let i=B(n,o);if(!i)return;let l=window.getComputedStyle(i);l.display!=="none"&&l.visibility!=="hidden"&&t.push({type:r?"hide-element":"remove-element",element:i});});};var De=(e,t,r)=>T(void 0,null,function*(){let{parentSelector:s,displayWidth:o}=e,{isMultiple:a,cssString:n,parentDepth:i}=s;if(o&&!semver.satisfies(semver.coerce(window.innerWidth),o))return [];let l=H(n,a).map(d=>B(d,i)).filter(d=>!!d);return yield Promise.all(l.map(d=>T(void 0,null,function*(){yield O(0),nt(d,e,t,r);}))),l}),ue=(e,t)=>{var r,s;return e?{width:(r=document.querySelector(e.width))!=null?r:t,height:(s=document.querySelector(e.height))!=null?s:t}:{width:t,height:t}},nt=(e,t,r,s)=>{var we;let Te=t,{shouldUseDivWrapper:o,divWrapperStyle:a,wrapperStyle:n,elementStyle:i,adSelector:l,insertionIndex:d,insertBeforeSelector:m,insertAfterSelector:h,insertionsCount:c=1,elementsToMeasureSelectors:u,stylesOverrides:p,shouldHideOriginal:g=!1,isNative:y,urlRegexes:f,parentSelector:P}=Te,E=_(Te,["shouldUseDivWrapper","divWrapperStyle","wrapperStyle","elementStyle","adSelector","insertionIndex","insertBeforeSelector","insertAfterSelector","insertionsCount","elementsToMeasureSelectors","stylesOverrides","shouldHideOriginal","isNative","urlRegexes","parentSelector"]),S=E.wrapperType?n:o?a:{display:"contents"},{isMultiple:I,cssString:M,parentDepth:v}=l,b=H(y?Ce:Le,!0,e).reduce((R,k)=>R.some(z=>z.contains(k))?R:[...R.filter(z=>!k.contains(z)),k],[]),L=b.filter(Ae),F=b.length-L.length,W=c-F;if(H(M,I,e).map(R=>B(R,v)).filter(R=>_e(R)&&!j(R)).forEach(R=>{var z;let k=window.getComputedStyle(R).display==="none";if(W<=0)(!g||!k)&&s.push({type:g?"hide-element":"remove-element",element:R});else {let Ke=ue(u,((z=R.parentElement)==null?void 0:z.children.length)===1?R.parentElement:R),qe=w({type:"replace-element",element:R,wrapperStyle:S,elementStyle:i,stylesOverrides:p,adCategories:[x]},E),Pe={type:"hide-element",element:R},Xe=w({type:"simple-insert-ad",wrapperStyle:S,elementStyle:i,parent:R.parentElement,insertionIndex:Array.from(R.parentElement.children).indexOf(R),isSiblingReplacement:!0,stylesOverrides:p,adCategories:[x]},E),ee=[],Me=de(R);g&&Me&&!k?ee=[Pe]:g&&!Me?ee=[Pe,Xe]:g||(ee=[qe]),ee.length>0&&r(Ke,"permanent",y,[x],...ee)&&W--;}}),W<=0)return;let D=-1,Y=e,Z={width:e,height:e},ve=m||h;if(ve){let R=e.querySelector(ve),k=R==null?void 0:R.parentElement;R&&k&&(Y=k,D=Array.from(e.children).indexOf(R)+(m?0:1),Z=ue(u,R));}else {let R=d!=null?d:0;D=R<0?Math.max(e.children.length+R,0):Math.min(R,e.children.length),Z=ue(u,(we=e.children[D])!=null?we:e);}if(D!==-1){let R=w({type:"simple-insert-ad",wrapperStyle:S,elementStyle:i,parent:Y,insertionIndex:D,isSiblingReplacement:!1,stylesOverrides:p,adCategories:[x]},E);r(Z,"permanent",y,[x],...Array(W).fill(R));}};var ot=["align-items","align-self","bottom","display","flex","flex-grow","flex-shrink","float","justify-content","justify-self","left","margin","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","padding","position","right","top","vertical-align","z-index"],at=lodash.memoize(e=>e.reduce((t,{dimensions:r})=>{let s=t.filter(({width:o,height:a})=>o<r.width||a<r.height);return (s.length===0||s.some(({width:o,height:a})=>o>r.width||a>r.height))&&s.push(r),s},[])),Oe=(e,t,r,s)=>T(void 0,null,function*(){let o=at(A.bannerAdsMeta),a=e.map(({selector:i,parentDepth:l,categories:d})=>H(i,!0).reduce((m,h)=>{var M;let c=(M=B(h,l))!=null?M:h,u=m.findIndex(({element:v})=>v.contains(c)),p=c.parentElement&&window.getComputedStyle(c.parentElement),{width:g,height:y}=se(c),f=s.some(v=>{var b;return v.type==="replace-all-children"||v.type==="simple-insert-ad"?v.parent.contains(c)||c.contains(v.parent):((b=v.element.parentElement)==null?void 0:b.contains(c))||c.contains(v.element)}),P=(p==null?void 0:p.display)==="none"||(p==null?void 0:p.visibility)==="hidden",E=u>=0&&m[u]instanceof HTMLAnchorElement,S=o.some(({width:v,height:b})=>g>=v&&y>=b);if(f||!S||P||E)return m;let I={element:c,categories:d};return u>=0?m.splice(u,1,I):m.some(({element:v})=>v.contains(c))||m.push(I),m},[])).flat(),n=t.map(({selector:i,parentDepth:l})=>H(i,!0).map(d=>B(d,l)).filter(d=>!!d)).flat();a=a.filter(({element:i})=>!n.includes(i)),yield Promise.all(a.map(d=>T(void 0,[d],function*({element:i,categories:l}){var p,g,y,f,P,E,S,I;yield O(0);let m=i.parentElement,{width:h,height:c}=window.getComputedStyle(i),u=q.test(h)&&q.test(c)?i:(g=(p=m==null?void 0:m.closest("div, article, aside, footer, header"))!=null?p:(m==null?void 0:m.tagName.toLowerCase())==="body"?void 0:m)!=null?g:i;if(!j(i)&&!i.querySelector(X)&&!s.some(M=>M.type==="simple-insert-ad"?!1:M.type==="replace-all-children"?M.parent.contains(i):M.element===i)){let M=(y=i.getAttribute("style"))!=null?y:"",v=Object.fromEntries(M.split(";").filter(Boolean).map(Y=>Y.split(":").map(Z=>Z.trim())));if((f=v.width)!=null&&f.match(/^0[a-z]/)||(P=v.height)!=null&&P.match(/^0[a-z]/))return;let b=window.getComputedStyle(i),L=w(w({},Object.fromEntries(ot.map(Y=>[Y,b.getPropertyValue(Y)]))),v),F={type:"hide-element",element:i},W={type:"simple-insert-ad",wrapperStyle:L,parent:(E=i.parentElement)!=null?E:document.body,insertionIndex:Array.from((I=(S=i.parentElement)==null?void 0:S.children)!=null?I:[]).indexOf(i),isSiblingReplacement:!0,shouldUseBlurredBackground:!0,adCategories:l},V,D=i.closest(`[${$}] + *`);D&&D!==i?V=[{type:"remove-element",element:D.previousElementSibling},F,W]:D?V=window.getComputedStyle(i).display==="none"?[]:[F]:V=[F,W],r({width:u,height:u},"provider-replacement",!1,l,...V);}})));});var Be=(e,t,r)=>T(void 0,null,function*(){let{cssString:s,isMultiple:o}=e.selector,a=H(s,o);yield Promise.all(a.map(n=>T(void 0,null,function*(){yield O(0),lt(n,e,t,r);})));}),lt=(e,t,r,s)=>{let{selector:{shouldUseDivWrapper:o,parentDepth:a,divWrapperStyle:n},stylesOverrides:i,shouldHideOriginal:l,isNative:d=!1}=t,m=B(e,a);if(!m||r.some(u=>u.contains(m))||j(m)||m.querySelector(X))return;let h={shouldUseDivWrapper:o,wrapperStyle:n},c;if(o&&l){let u=m.parentElement,p=window.getComputedStyle(m).display==="none",g=w({type:"simple-insert-ad",parent:u,insertionIndex:Array.from(u.children).indexOf(m),stylesOverrides:i==null?void 0:i.map(P=>{var E=P,{parentDepth:y}=E,f=_(E,["parentDepth"]);return C(w({},f),{parentDepth:y-1})}),isSiblingReplacement:!0,adCategories:[x]},h);c=[],p||c.push({type:"hide-element",element:m}),de(m)||c.push(g);}else if(o)c=[w({type:"replace-element",element:m,stylesOverrides:i==null?void 0:i.map(y=>{var f=y,{parentDepth:p}=f,g=_(f,["parentDepth"]);return C(w({},g),{parentDepth:p-1})}),adCategories:[x]},h)];else if(l){let u={type:"simple-insert-ad",parent:m,insertionIndex:0,stylesOverrides:i,isSiblingReplacement:!0,adCategories:[x],wrapperStyle:{display:"contents"}};c=Array.from(m.children).filter(p=>window.getComputedStyle(p).display!=="none").map(p=>({type:"hide-element",element:p})),m.querySelector(X)||c.push(u);}else c=[{type:"replace-all-children",parent:m,stylesOverrides:i,adCategories:[x],wrapperStyle:{display:"contents"}}];c.length>0&&s({width:m,height:m},"slot-replacement",d,[x],...c);};var dt=a=>T(void 0,[a],function*({providersSelectors:e,providersNegativeSelectors:t,adPlacesRules:r,permanentAdPlacesRules:s,elementsToHideOrRemoveRules:o}){let n=[],i=(d,m,h,c,...u)=>{if(u.length>0&&u.every(L=>L.type==="hide-element"||L.type==="remove-element"))return n.push(...u),!0;let{width:p}=se(d.width),{height:g}=se(d.height),{paddingLeft:y,paddingRight:f}=window.getComputedStyle(d.width),{paddingTop:P,paddingBottom:E}=window.getComputedStyle(d.height),S=Q([y,f]),I=S===p?p:p-S,M=Q([P,E]),v=M===g?g:g-M,b=He(I,v,m,h,c);return b.length?(n.push(...u.map(L=>L.type==="hide-element"||L.type==="remove-element"?L:C(w({},L),{adsMetadata:b,originalWidth:I,originalHeight:v}))),!0):!1},l=[];return yield Promise.all(o.map(d=>T(void 0,null,function*(){yield O(0),Ne(d,n);}))),yield Promise.all(s.map(d=>T(void 0,null,function*(){yield O(0),l=l.concat(yield De(d,i,n));}))),yield Promise.all(r.map(d=>T(void 0,null,function*(){yield O(0),yield Be(d,l,i);}))),yield Oe(e,t,i,n),n});var he=(a=>(a.Optimal="Optimal",a.SmartyAds="SmartyAds",a.HypeLab="HypeLab",a.Persona="Persona",a.Temple="Temple Wallet",a))(he||{});var ge=new Set,We=new Set,ke=new Set,Fe=e=>T(void 0,null,function*(){let t=e.id;if(!ge.has(t))return ge.add(t),new Promise((r,s)=>{let o=!1,a=n=>{var i,l;if(n.source===e.contentWindow)try{let d=typeof n.data=="string"?JSON.parse(n.data):n.data;if(d.id!==t)return;let m=e.offsetWidth-e.clientWidth,h=e.offsetHeight-e.clientHeight;switch(d.type){case te:r(d.adMetadata.source.providerName);break;case re:window.removeEventListener("message",a),e.style.display="none",s(new Error((i=d.reason)!=null?i:"Unknown error"));break;case oe:let{dimensions:c,source:u}=d.adMetadata;o=(l=u.native)!=null?l:!1;let{width:p,height:g}=c;p>0&&g>0&&(u.native?e.style.height=`${g}px`:(U(e,"width",p),U(e,"height",g)));break;case ae:let{width:y,height:f}=d;o?e.style.height=`${f+h}px`:(U(e,"width",y+m),U(e,"height",f+h));}}catch(d){console.error("Observing error:",d);}};window.addEventListener("message",a);}).then(r=>{if(We.has(t))return;We.add(t),pt(e)?Ve(t,r):mt(e,r);}).catch(r=>{throw console.error(r),r}).finally(()=>void ge.delete(t))}),mt=(e,t)=>{let r=new IntersectionObserver(s=>{s.some(o=>o.isIntersecting)&&(Ve(e.id,t),r.disconnect());},{threshold:.5});r.observe(e);},Ve=(e,t)=>{if(ke.has(e))return;ke.add(e);let r=window.parent.location.href;ct__default.default.runtime.sendMessage({type:A.EXTERNAL_ADS_ACTIVITY_MESSAGE_TYPE,url:r,provider:he[t]}).catch(s=>void console.error(s));},pt=e=>{let t=e.getBoundingClientRect(),r=window.visualViewport;if(!r)return !1;let s=Math.min(Math.max(0,t.x),r.width),o=Math.min(Math.max(0,t.x+t.width),r.width),a=Math.min(Math.max(0,t.y),r.height),n=Math.min(Math.max(0,t.y+t.height),r.height),i=t.width*t.height;return (o-s)*(n-a)/i>=.5};var ne=(e,t)=>{for(let r in t)e.style.setProperty(r,t[r]);};var ut=(e,t)=>{["width","height"].forEach(s=>{var a;let o=(a=e.style[s])!=null?a:"";q.test(o)&&parseInt(o,10)<t[s]&&e.style.removeProperty(s);});},ht=(e,t,r,s)=>T(void 0,null,function*(){let{elementStyle:o={},stylesOverrides:a=[],adsMetadata:n,wrapperType:i,originalHeight:l,originalWidth:d,shouldUseBlurredBackground:m,adCategories:h}=e;a.sort((E,S)=>E.parentDepth-S.parentDepth);let c,u=nanoid.nanoid(),p=document.createElement("iframe");p.loading="lazy",p.src=A.getAdsStackIframeURL(u,n,window.location.href,h),p.id=u,p.allow=le;let g=n[0],{dimensions:y}=typeof g=="number"?A.bannerAdsMeta[g]:g,f={width:m?Math.max(d,y.width):y.width,height:m?Math.max(l,y.height):y.height};p.style.width=i==="tbody"?"100%":`${f.width}px`,p.style.height=`${f.height}px`,p.style.border="none";for(let E in o)p.style.setProperty(E,o[E]);switch(p.setAttribute(G,"true"),ut(t,f),r.appendChild(p),e.type){case"replace-all-children":c=e.parent,e.parent.innerHTML="",e.parent.appendChild(t);break;case"replace-element":c=e.element.parentElement,e.element.replaceWith(t);break;default:let E=e.parent.children[e.insertionIndex];if(e.isSiblingReplacement){t.setAttribute($,"true");let S=new MutationObserver(I=>{I.some(v=>Array.from(v.removedNodes).includes(E))&&(t.remove(),S.disconnect());});S.observe(e.parent,{childList:!0});}c=e.parent,e.parent.insertBefore(t,E);break}if(i!=="tbody"){let{borderLeftWidth:E,borderRightWidth:S,borderTopWidth:I,borderBottomWidth:M}=window.getComputedStyle(p),{borderLeftWidth:v,borderRightWidth:b,borderTopWidth:L,borderBottomWidth:F}=window.getComputedStyle(t),W=Q([E,S,v,b]),V=Q([I,M,L,F]);p.style.width=`${f.width-W}px`,p.style.height=`${f.height-V}px`;}Fe(p).catch(s);let P=0;a.forEach(({parentDepth:E,style:S})=>{for(;E>P&&c;)c=c.parentElement,P++;c&&ne(c,S);});}),Ye=e=>T(void 0,null,function*(){let{wrapperStyle:t={},adsMetadata:r,wrapperType:s="div",colsAfter:o=0,colsBefore:a=0,colspan:n=1}=e,i=r.every(h=>typeof h=="object"),l,d;if(s==="div")l=document.createElement("div"),d=l;else {l=document.createElement("tbody");let h=document.createElement("tr");l.appendChild(h);for(let u=0;u<a;u++)h.appendChild(document.createElement("td"));let c=document.createElement("td");c.colSpan=n,h.appendChild(c),d=c;for(let u=0;u<o;u++)h.appendChild(document.createElement("td"));}l.setAttribute(G,"true"),i&&l.setAttribute(K,"true"),ne(l,t);let m=()=>{let h=document.createElement("div");h.setAttribute(G,"true"),i&&h.setAttribute(K,"true"),e.type==="simple-insert-ad"&&e.isSiblingReplacement&&h.setAttribute($,"true"),h.style.display="none",l.replaceWith(h);};yield ht(e,l,d,h=>{console.error("Failed to render ads",h),m();}).catch(h=>{throw console.error("Inserting an ad attempt error:",h),m(),h});});var gt=e=>Promise.allSettled(e.map(t=>T(void 0,null,function*(){t.type==="remove-element"?t.element.remove():t.type==="hide-element"?t.element.style.setProperty("display","none","important"):yield Ye(t);})));var Ee=(e,t,r=!1)=>{let s=document.createElement("div");s.style.width=`${e}px`,s.style.height=`${t}px`;let o=document.createElement("div");if(o.style.width=`${e}px`,o.style.height=`${t}px`,s.appendChild(o),r){let i=document.createElement("a");return i.href=A.SWAP_TKEY_URL,i.target="_blank",i.rel="noopener noreferrer",i.style.width=`${e}px`,i.style.height=`${t}px`,i.style.overflow="hidden",i.style.textOverflow="ellipsis",i.appendChild(document.createTextNode("TODO: Native TKEY ad")),o.appendChild(i),{element:s}}let a=document.createElement("a");a.href=A.SWAP_TKEY_URL,a.target="_blank",a.rel="noopener noreferrer",a.style.width="100%",a.style.height="100%",o.appendChild(a);let n=document.createElement("img");return n.src=e<=320?A.SMALL_TKEY_INPAGE_AD_URL:A.TKEY_INPAGE_AD_URL,n.style.width="100%",n.style.height="100%",a.appendChild(n),{element:s,creativeSet:{image:{url:n.src}}}};var fe=(e,t,{width:r,height:s},o)=>{let a=document.createElement("iframe");return a.id=e,a.src=ft(t,o,r,s,a.id),a.style.width=t.native?"100%":`${r}px`,a.style.height=`${s}px`,a.style.border="none",a.allow=le,{element:a}},ft=(e,t,r,s,o)=>{let{providerName:a,slug:n,native:i}=e,l=new URL(A.ADS_TW_WINDOW_URL);return l.searchParams.set("ap",a.toLowerCase()),i?l.searchParams.set("vh",String(s)):l.searchParams.set("w",String(r)),l.searchParams.set("h",String(s)),l.searchParams.set("p",n),l.searchParams.set("o",Rt(t)),o&&l.searchParams.set("id",o),l.toString()},Rt=e=>cryptoJs.AES.encrypt(e,A.TEMPLE_PASSPHRASE).toString();var Re=(e,t,{width:r,height:s})=>{let o=document.createElement("iframe"),a="";switch(t.providerName){case"Persona":a=A.personaIframePath;break;default:throw new Error(`Ads from ${t.providerName} are unavailable via extension iframe`)}let n=new URL(a);return n.searchParams.set("id",e),n.searchParams.set("slug",t.slug),o.src=n.toString(),o.id=e,o.style.width=`${r}px`,o.style.height=`${s}px`,o.style.border="none",{element:o}};var ye=class{constructor(t,r,s,o,a,n){this.id=t;this.origin=s;this.pageHasPlacesRules=o;this.adCategories=a;this.hypelabBlacklistedCampaignsSlugs=n;this.wasReady=!1;this.rootElement=document.getElementById("root");this.validAdsCounter=0;this.adsMetadata=r.map(i=>typeof i=="number"?A.bannerAdsMeta[i]:i);}startRendering(){if(this.adsMetadata.length===0){this.broadcastNoMoreAds();return}this.currentAdMetadata=A.pickNextAdMetadata(this.adsMetadata,this.currentAdMetadata,this.validAdsCounter,this.pageHasPlacesRules,this.adCategories);let t=this.currentAdMetadata;if(!t){this.broadcastNoMoreAds();return}this.broadcastMessage({id:this.id,type:oe,adMetadata:this.currentAdMetadata});let{element:r,creativeSet:s}=this.placeNewAd(t);r instanceof HTMLIFrameElement?this.listenToIframeMessages(r,t):this.handleValidAd({ad:{creative_set:s}});}listenToIframeMessages(t,r){let s=A.pickNextAdMetadata(this.adsMetadata,r,this.validAdsCounter,this.pageHasPlacesRules,this.adCategories);this.responseTimeout=setTimeout(()=>{console.error(`Timeout exceeded for ${this.id}, ad source: ${JSON.stringify(r.source)}`),this.handleInvalidAd();},(s?1e4:2e4)*(A.IS_MISES_BROWSER?2:1)),this.messageListener=o=>{var a;if(o.source===t.contentWindow)try{let n=typeof o.data=="string"?JSON.parse(o.data):o.data;switch(n.type){case te:if(r.source.providerName==="HypeLab"&&this.hypelabBlacklistedCampaignsSlugs.includes((a=n.ad)==null?void 0:a.campaign_slug)&&s){this.handleInvalidAd();break}this.handleValidAd(n);break;case re:this.wasReady||this.handleInvalidAd();break;case ae:let{width:i,height:l}=n;i>0&&l>0&&(r.source.native?t.style.height=`${l}px`:(U(t,"width",i),U(t,"height",l)),this.broadcastMessage(C(w({},n),{id:this.id})));}}catch(n){console.error("Message handling error:",n);}},window.addEventListener("message",this.messageListener);}handleInvalidAd(){this.removeMessageListener(),this.clearResponseTimeout(),this.startRendering(),this.validAdsCounter=0;}removeMessageListener(){this.messageListener&&(window.removeEventListener("message",this.messageListener),this.messageListener=void 0);}placeNewAd(t){document.body.style.backgroundColor=t.source.native?"transparent":"#F2F2F2";let{source:r,dimensions:s}=t,o;switch(r.providerName){case"Temple":o=Ee(s.width,s.height,r.native);break;case"HypeLab":case"SmartyAds":o=fe(this.id,r,s,this.origin);break;default:o=Re(this.id,r,s);}let{element:a}=o,n=document.getElementById("temple-label");return this.rootElement.replaceChildren(a),r.native?n.removeAttribute("active"):n.setAttribute("active",""),o}updateBackground(t,r={}){let s=document.getElementById(ce);if(t.native&&s&&this.rootElement.removeChild(s),!t.native)try{let{image:o,video:a}=r,n;if(o?(n=document.createElement("img"),n.src=o.url,n.alt=""):a&&(n=document.createElement("video"),n.src=a.url,n.autoplay=!0,n.preload="auto",n.playsInline=!0,n.muted=!0,n.loop=!0),!n&&s&&this.rootElement.removeChild(s),!n)return;n.id=ce,n.style.zIndex="-1",ne(n,{position:"absolute",top:"0px",left:"0px",right:"0px",bottom:"0px",width:"100%",height:"100%","object-fit":"cover",filter:"blur(12px)"}),s?this.rootElement.replaceChild(n,s):this.rootElement.prepend(n);}catch(o){console.error(o);}}broadcastMessage(t){window.parent.postMessage(JSON.stringify(t),"*");}broadcastNoMoreAds(){this.broadcastMessage({id:this.id,type:re,reason:"No more ads to render"});}clearResponseTimeout(){this.responseTimeout!==void 0&&(clearTimeout(this.responseTimeout),this.responseTimeout=void 0);}handleValidAd(t){var s;let r=this.currentAdMetadata;r&&(this.wasReady||(this.wasReady=!0,this.broadcastMessage({id:this.id,type:te,adMetadata:r})),this.validAdsCounter++,this.clearResponseTimeout(),this.updateBackground(r.source,(s=t.ad)==null?void 0:s.creative_set));}},yt=(e,t,r,s=!1,o,a)=>{try{new ye(e,t,r,s,o,a).startRendering();}catch(n){console.error("Error while rendering ads stack:",n);}};var St=(e,t)=>{let{adPlacesRulesForAllDomains:r,providersRulesForAllDomains:s,providersSelectors:o,providersNegativeSelectors:a={},providersToReplaceAtAllSites:n,permanentAdPlacesRulesForAllDomains:i,permanentNativeAdPlacesRulesForAllDomains:l={},adsReplaceUrlsBlacklist:d=[],elementsToHideOrRemoveRules:m={},providersCategories:h={},blacklistedHypelabCampaignsSlugs:c=[],timestamp:u}=t,p=typeof e=="string"?e:e.href,{hostname:g}=new URL(p);if(d.some(P=>new RegExp(P).test(p)))return {adPlacesRules:[],permanentAdPlacesRules:[],providersSelectors:[],providersNegativeSelectors:[],elementsToHideOrRemoveRules:[],blacklistedHypelabCampaignsSlugs:c,timestamp:u};let y=p.replace(/#.*$/,""),f=P=>{let E=P.source.includes("#")?p:y;return P.test(E)};return {adPlacesRules:Tt(g,f,r),permanentAdPlacesRules:wt(g,f,i,l),providersSelectors:ze(g,f,s,o,n,h),providersNegativeSelectors:ze(g,f,s,a,n,h),elementsToHideOrRemoveRules:vt(g,f,m),blacklistedHypelabCampaignsSlugs:c,timestamp:u}},vt=(e,t,r)=>{var s;return ((s=r[e])!=null?s:[]).map(n=>{var i=n,{urlRegexes:o}=i,a=_(i,["urlRegexes"]);return C(w({},a),{urlRegexes:o.map(l=>new RegExp(l))})}).filter(({urlRegexes:o})=>o.some(t))},Tt=(e,t,r)=>{var a;return ((a=r[e])!=null?a:[]).map(l=>{var d=l,{urlRegexes:n}=d,i=_(d,["urlRegexes"]);return C(w({},i),{urlRegexes:n.map(m=>new RegExp(m))})}).reduce((n,m)=>{var h=m,{urlRegexes:i,selector:l}=h,d=_(h,["urlRegexes","selector"]);if(!i.some(t))return n;let g=l,{cssString:c}=g,u=_(g,["cssString"]),p=n.findIndex(P=>{var E=P,{selector:y}=E,f=_(E,["selector"]);let M=y,I=_(M,["cssString"]);return lodash.isEqual(u,I)&&lodash.isEqual(d,f)});return p===-1?n.push(w({selector:l},d)):n[p].selector.cssString+=", ".concat(c),n},[])},$e=e=>a=>{var n=a,{urlRegexes:t,elementToMeasureSelector:r,elementsToMeasureSelectors:s}=n,o=_(n,["urlRegexes","elementToMeasureSelector","elementsToMeasureSelectors"]);return C(w({},o),{urlRegexes:t.map(i=>new RegExp(i)),isNative:e,elementsToMeasureSelectors:s!=null?s:r?{width:r,height:r}:void 0})},wt=(e,t,r,s={})=>{var i,l;let o=(i=r[e])!=null?i:[],a=(l=s[e])!=null?l:[];return o.map($e(!1)).concat(a.map($e(!0))).filter(({urlRegexes:d})=>d.some(t))};function Pt(e){let t="";return e.forEach(r=>{t+=r+", ";}),t&&(t=t.slice(0,-2)),t}var ze=(e,t,r,s,o,a)=>{var h;let i=((h=r[e])!=null?h:[]).map(p=>{var g=p,{urlRegexes:c}=g,u=_(g,["urlRegexes"]);return C(w({},u),{urlRegexes:c.map(y=>new RegExp(y))})}).filter(({urlRegexes:c})=>c.some(t)),l=new Set,d={},m=c=>{var g,y;if(l.has(c))return;let u=((g=a[c])!=null?g:[x]).join("|");((y=s[c])!=null?y:[]).forEach(f=>{let{selector:P,parentDepth:E}=typeof f=="string"?{selector:f,parentDepth:0}:f;d[u]||(d[u]={});let S=d[u];S[E]||(S[E]=new Set),S[E].add(P);}),l.add(c);};return o.forEach(m),i.forEach(({providers:c})=>c.forEach(m)),Object.entries(d).map(([c,u])=>Object.entries(u).map(([p,g])=>({parentDepth:Number(p),selector:Pt(g),categories:c.split("|")}))).flat()};var N=e=>(...t)=>T(void 0,null,function*(){let{data:r}=yield e(...t);return r}),Se=class{constructor(t){this.getAdPlacesRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/ad-places",this.getAdVersionRequestConfig()));this.getProvidersToReplaceAtAllSites=N(()=>this.api.get("/slise-ad-rules/providers/all-sites"));this.getProvidersCategories=N(()=>this.api.get("/slise-ad-rules/providers/categories"));this.getProvidersRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/providers/by-sites"));this.getSelectorsForAllProviders=N(()=>this.api.get("/slise-ad-rules/providers",this.getAdVersionRequestConfig()));this.getNegativeSelectorsForAllProviders=N(()=>this.api.get("/slise-ad-rules/providers/negative-selectors",this.getAdVersionRequestConfig()));this.getPermanentAdPlacesRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/ad-places/permanent",this.getAdVersionRequestConfig()));this.getPermanentNativeAdPlacesRulesForAllDomains=N(()=>this.api.get("/slise-ad-rules/ad-places/permanent-native",this.getAdVersionRequestConfig()));this.getAdsReplaceUrlsBlacklist=N(()=>this.api.get("/slise-ad-rules/replace-urls-blacklist",this.getAdVersionRequestConfig()));this.getElementsToHideOrRemoveRules=N(()=>this.api.get("/slise-ad-rules/elements-to-hide-or-remove",this.getAdVersionRequestConfig()));this.getBlacklistedHypelabCampaignsSlugs=N(()=>this.api.get("/temple-wallet-ads/hypelab-campaigns-blacklist"));this.getAllRules=()=>T(this,null,function*(){let[t,r,s,o,a,n,i,l,d,m,h]=yield Promise.all([this.getAdPlacesRulesForAllDomains(),this.getProvidersRulesForAllDomains(),this.getSelectorsForAllProviders(),this.getProvidersToReplaceAtAllSites(),this.getPermanentAdPlacesRulesForAllDomains(),this.getPermanentNativeAdPlacesRulesForAllDomains(),this.getAdsReplaceUrlsBlacklist(),this.getNegativeSelectorsForAllProviders(),this.getElementsToHideOrRemoveRules(),this.getProvidersCategories(),this.getBlacklistedHypelabCampaignsSlugs()]);return {adPlacesRulesForAllDomains:t,providersRulesForAllDomains:r,providersSelectors:s,providersToReplaceAtAllSites:o,permanentAdPlacesRulesForAllDomains:a,permanentNativeAdPlacesRulesForAllDomains:n,adsReplaceUrlsBlacklist:i,providersNegativeSelectors:l,elementsToHideOrRemoveRules:d,providersCategories:m,blacklistedHypelabCampaignsSlugs:h,timestamp:Date.now()}});this.api=Mt__default.default.create({baseURL:new URL("/api",t).href,adapter:"fetch"});}getAdVersionRequestConfig(){return {params:{extVersion:A.EXTENSION_VERSION,isMisesBrowser:A.IS_MISES_BROWSER}}}};
16
16
 
17
17
  exports.TempleWalletApi = Se;
18
- exports.configureAds = tt;
18
+ exports.configureAds = et;
19
19
  exports.executeAdsActions = gt;
20
- exports.getAdsActions = ct;
21
- exports.renderAdsStack = Ge;
20
+ exports.getAdsActions = dt;
21
+ exports.renderAdsStack = yt;
22
22
  exports.transformRawRules = St;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@temple-wallet/extension-ads",
3
- "version": "8.1.1",
3
+ "version": "9.0.0-dev.1",
4
4
  "main": "dist/index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -147,6 +147,7 @@ const processPermanentAdsParent = (
147
147
  wrapperStyle,
148
148
  elementStyle,
149
149
  stylesOverrides,
150
+ adCategories: [CRYPTO_CATEGORY_NAME],
150
151
  ...restProps
151
152
  };
152
153
  const hideActionBase: HideElementAction = {
@@ -161,6 +162,7 @@ const processPermanentAdsParent = (
161
162
  insertionIndex: Array.from(banner.parentElement!.children).indexOf(banner),
162
163
  isSiblingReplacement: true,
163
164
  stylesOverrides,
165
+ adCategories: [CRYPTO_CATEGORY_NAME],
164
166
  ...restProps
165
167
  };
166
168
 
@@ -229,6 +231,7 @@ const processPermanentAdsParent = (
229
231
  insertionIndex: normalizedInsertionIndex,
230
232
  isSiblingReplacement: false,
231
233
  stylesOverrides,
234
+ adCategories: [CRYPTO_CATEGORY_NAME],
232
235
  ...restProps
233
236
  };
234
237
 
@@ -181,7 +181,8 @@ export const processProvidersAds = async (
181
181
  parent: banner.parentElement ?? document.body,
182
182
  insertionIndex: Array.from(banner.parentElement?.children ?? []).indexOf(banner),
183
183
  isSiblingReplacement: true,
184
- shouldUseBlurredBackground: true
184
+ shouldUseBlurredBackground: true,
185
+ adCategories: categories
185
186
  };
186
187
 
187
188
  let actions: (InsertAdActionWithoutMeta | HideElementAction | RemoveElementAction)[];
@@ -82,6 +82,7 @@ const processSelectedElement = (
82
82
  parentDepth: parentDepth - 1
83
83
  })),
84
84
  isSiblingReplacement: true,
85
+ adCategories: [CRYPTO_CATEGORY_NAME],
85
86
  ...actionBaseCommonProps
86
87
  };
87
88
 
@@ -100,6 +101,7 @@ const processSelectedElement = (
100
101
  ...restProps,
101
102
  parentDepth: parentDepth - 1
102
103
  })),
104
+ adCategories: [CRYPTO_CATEGORY_NAME],
103
105
  ...actionBaseCommonProps
104
106
  };
105
107
  actionsBases = [replaceElementActionBase];
@@ -110,6 +112,7 @@ const processSelectedElement = (
110
112
  insertionIndex: 0,
111
113
  stylesOverrides,
112
114
  isSiblingReplacement: true,
115
+ adCategories: [CRYPTO_CATEGORY_NAME],
113
116
  wrapperStyle: { display: 'contents' }
114
117
  };
115
118
 
@@ -124,6 +127,7 @@ const processSelectedElement = (
124
127
  type: AdActionType.ReplaceAllChildren,
125
128
  parent: banner,
126
129
  stylesOverrides,
130
+ adCategories: [CRYPTO_CATEGORY_NAME],
127
131
  wrapperStyle: { display: 'contents' }
128
132
  };
129
133
  actionsBases = [replaceAllChildrenActionBase];
@@ -7,12 +7,24 @@ interface IAdsConfiguration {
7
7
  swapTkeyUrl: string;
8
8
  externalAdsActivityMessageType: string;
9
9
  personaIframePath: string;
10
- getAdsStackIframeURL: (id: string, adsMetadataIds: (number | AdMetadata)[], origin: string) => string;
10
+ getAdsStackIframeURL: (
11
+ id: string,
12
+ adsMetadataIds: (number | AdMetadata)[],
13
+ origin: string,
14
+ adCategories: string[]
15
+ ) => string;
11
16
  buildNativeAdsMeta: (containerWidth: number, containerHeight: number) => AdMetadata[];
12
17
  bannerAdsMeta: AdMetadata[];
13
18
  extVersion: string;
14
19
  templePassphrase: string;
15
20
  isMisesBrowser: boolean;
21
+ pickNextAdMetadata: (
22
+ allAdsMetadata: AdMetadata[],
23
+ currentAdMetadata: AdMetadata | undefined,
24
+ validAdsCounter: number,
25
+ pageHasPlacesRules: boolean,
26
+ adCategories: string[]
27
+ ) => AdMetadata | undefined;
16
28
  }
17
29
 
18
30
  export class AdsConfiguration {
@@ -25,6 +37,7 @@ export class AdsConfiguration {
25
37
  static personaIframePath: IAdsConfiguration['personaIframePath'] = '';
26
38
  static getAdsStackIframeURL: IAdsConfiguration['getAdsStackIframeURL'] = () => '';
27
39
  static buildNativeAdsMeta: IAdsConfiguration['buildNativeAdsMeta'] = () => [];
40
+ static pickNextAdMetadata: IAdsConfiguration['pickNextAdMetadata'] = () => undefined;
28
41
  static bannerAdsMeta: AdMetadata[] = [];
29
42
  static EXTENSION_VERSION: string | undefined;
30
43
  static TEMPLE_PASSPHRASE: string;
@@ -43,7 +56,8 @@ export const configureAds = (config: IAdsConfiguration) => {
43
56
  bannerAdsMeta,
44
57
  extVersion,
45
58
  templePassphrase,
46
- isMisesBrowser
59
+ isMisesBrowser,
60
+ pickNextAdMetadata
47
61
  } = config;
48
62
 
49
63
  if (smallTkeyInpageAdUrl) {
@@ -57,6 +71,7 @@ export const configureAds = (config: IAdsConfiguration) => {
57
71
  AdsConfiguration.personaIframePath = personaIframePath;
58
72
  AdsConfiguration.getAdsStackIframeURL = getAdsStackIframeURL;
59
73
  AdsConfiguration.buildNativeAdsMeta = buildNativeAdsMeta;
74
+ AdsConfiguration.pickNextAdMetadata = pickNextAdMetadata;
60
75
  AdsConfiguration.bannerAdsMeta = bannerAdsMeta;
61
76
  AdsConfiguration.EXTENSION_VERSION = extVersion;
62
77
  AdsConfiguration.TEMPLE_PASSPHRASE = templePassphrase;
@@ -40,7 +40,8 @@ const processInsertAdActionOnce = async (
40
40
  wrapperType,
41
41
  originalHeight,
42
42
  originalWidth,
43
- shouldUseBlurredBackground
43
+ shouldUseBlurredBackground,
44
+ adCategories
44
45
  } = action;
45
46
 
46
47
  stylesOverrides.sort((a, b) => a.parentDepth - b.parentDepth);
@@ -50,7 +51,7 @@ const processInsertAdActionOnce = async (
50
51
  const adId = nanoid();
51
52
  const adElement = document.createElement('iframe');
52
53
  adElement.loading = 'lazy';
53
- adElement.src = AdsConfiguration.getAdsStackIframeURL(adId, adsMetadata, window.location.href);
54
+ adElement.src = AdsConfiguration.getAdsStackIframeURL(adId, adsMetadata, window.location.href, adCategories);
54
55
  adElement.id = adId;
55
56
  adElement.allow = IFRAME_ALLOWANCE;
56
57
  const firstAdMetadataOrId = adsMetadata[0];
@@ -10,59 +10,170 @@ import {
10
10
  import { makeAdsTwView, makeExtensionIframeView, makeTKeyAdView } from './execute-ads-actions/ads-views';
11
11
  import { overrideElementStyles } from './execute-ads-actions/override-element-styles';
12
12
  import { AdView, CreativeSet } from './types/ad-view';
13
- import { AdMetadata } from './types/ads-meta';
13
+ import { AdMetadata, AdSource } from './types/ads-meta';
14
14
 
15
- const broadcastMessage = (content: unknown) => window.parent.postMessage(JSON.stringify(content), '*');
15
+ class AdsStack {
16
+ private wasReady = false;
17
+ private messageListener: ((event: MessageEvent<any>) => void) | undefined;
18
+ private responseTimeout: NodeJS.Timeout | undefined;
19
+ private rootElement: HTMLElement = document.getElementById('root')!;
20
+ private validAdsCounter = 0;
21
+ private readonly adsMetadata: AdMetadata[];
22
+ private currentAdMetadata: AdMetadata | undefined;
16
23
 
17
- /**
18
- * Tries to render specified ads one-by-one until one of them is loaded or loading of all of them failed. Use it
19
- * in a dedicated iframe. Sends messages to the parent window on an attempt to render an ad, on successful rendering,
20
- * on ad resize, and on error.
21
- */
22
- export const renderAdsStack = async (
23
- adId: string,
24
- adsMetadata: (number | AdMetadata)[],
25
- origin: string
26
- ): Promise<void> => {
27
- if (adsMetadata.length === 0) {
28
- broadcastMessage({ id: adId, type: AD_ERROR_MESSAGE_TYPE, reason: 'No more ads to render' });
24
+ constructor(
25
+ private readonly id: string,
26
+ initialAdsMetadata: (number | AdMetadata)[],
27
+ private readonly origin: string,
28
+ private readonly pageHasPlacesRules: boolean,
29
+ private readonly adCategories: string[],
30
+ private readonly hypelabBlacklistedCampaignsSlugs: string[]
31
+ ) {
32
+ this.adsMetadata = initialAdsMetadata.map(adMetadataOrId =>
33
+ typeof adMetadataOrId === 'number' ? AdsConfiguration.bannerAdsMeta[adMetadataOrId] : adMetadataOrId
34
+ );
35
+ }
36
+
37
+ startRendering() {
38
+ if (this.adsMetadata.length === 0) {
39
+ this.broadcastNoMoreAds();
40
+
41
+ return;
42
+ }
43
+
44
+ this.currentAdMetadata = AdsConfiguration.pickNextAdMetadata(
45
+ this.adsMetadata,
46
+ this.currentAdMetadata,
47
+ this.validAdsCounter,
48
+ this.pageHasPlacesRules,
49
+ this.adCategories
50
+ );
51
+ const adMetadata = this.currentAdMetadata;
52
+
53
+ if (!adMetadata) {
54
+ this.broadcastNoMoreAds();
55
+
56
+ return;
57
+ }
58
+
59
+ this.broadcastMessage({ id: this.id, type: AD_RENDER_START_MESSAGE_TYPE, adMetadata: this.currentAdMetadata });
60
+
61
+ const { element, creativeSet: initialCreativeSet } = this.placeNewAd(adMetadata);
62
+
63
+ if (element instanceof HTMLIFrameElement) {
64
+ this.listenToIframeMessages(element, adMetadata);
65
+ } else {
66
+ this.handleValidAd({ ad: { creative_set: initialCreativeSet } });
67
+ }
68
+ }
69
+
70
+ private listenToIframeMessages(element: HTMLIFrameElement, adMetadata: AdMetadata) {
71
+ const nextAdMetadata = AdsConfiguration.pickNextAdMetadata(
72
+ this.adsMetadata,
73
+ adMetadata,
74
+ this.validAdsCounter,
75
+ this.pageHasPlacesRules,
76
+ this.adCategories
77
+ );
78
+ this.responseTimeout = setTimeout(
79
+ () => {
80
+ console.error(`Timeout exceeded for ${this.id}, ad source: ${JSON.stringify(adMetadata.source)}`);
81
+ this.handleInvalidAd();
82
+ },
83
+ (nextAdMetadata ? 10_000 : 20_000) * (AdsConfiguration.IS_MISES_BROWSER ? 2 : 1)
84
+ );
85
+
86
+ this.messageListener = (event: MessageEvent<any>) => {
87
+ if (event.source !== element.contentWindow) {
88
+ return;
89
+ }
90
+
91
+ try {
92
+ const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;
93
+
94
+ switch (data.type) {
95
+ case AD_READY_MESSAGE_TYPE:
96
+ if (
97
+ adMetadata.source.providerName === 'HypeLab' &&
98
+ this.hypelabBlacklistedCampaignsSlugs.includes(data.ad?.campaign_slug) &&
99
+ nextAdMetadata
100
+ ) {
101
+ this.handleInvalidAd();
102
+ break;
103
+ }
104
+
105
+ this.handleValidAd(data);
106
+ break;
107
+ case AD_ERROR_MESSAGE_TYPE:
108
+ if (!this.wasReady) {
109
+ this.handleInvalidAd();
110
+ }
111
+ break;
112
+ case AD_RESIZE_MESSAGE_TYPE:
113
+ const { width, height } = data;
114
+ if (width > 0 && height > 0) {
115
+ if (adMetadata.source.native) {
116
+ element.style.height = `${height}px`;
117
+ } else {
118
+ extendOrKeepDimension(element, 'width', width);
119
+ extendOrKeepDimension(element, 'height', height);
120
+ }
121
+ this.broadcastMessage({ ...data, id: this.id });
122
+ }
123
+ }
124
+ } catch (error) {
125
+ console.error('Message handling error:', error);
126
+ }
127
+ };
128
+
129
+ window.addEventListener('message', this.messageListener);
130
+ }
29
131
 
30
- return;
132
+ private handleInvalidAd() {
133
+ this.removeMessageListener();
134
+ this.clearResponseTimeout();
135
+ this.startRendering();
136
+ this.validAdsCounter = 0;
31
137
  }
32
138
 
33
- const [adMetadataOrId, ...rest] = adsMetadata;
34
- const adMetadata =
35
- typeof adMetadataOrId === 'number' ? AdsConfiguration.bannerAdsMeta[adMetadataOrId] : adMetadataOrId;
36
- broadcastMessage({ id: adId, type: AD_RENDER_START_MESSAGE_TYPE, adMetadata });
37
-
38
- document.body.style.backgroundColor = adMetadata.source.native ? 'transparent' : '#F2F2F2';
39
-
40
- const { source, dimensions } = adMetadata;
41
- let adView: AdView;
42
- switch (source.providerName) {
43
- case 'Temple':
44
- adView = makeTKeyAdView(dimensions.width, dimensions.height, source.native);
45
- break;
46
- case 'HypeLab':
47
- case 'SmartyAds':
48
- adView = makeAdsTwView(adId, source, dimensions, origin);
49
- break;
50
- default:
51
- adView = makeExtensionIframeView(adId, source, dimensions);
139
+ private removeMessageListener() {
140
+ if (!this.messageListener) return;
141
+
142
+ window.removeEventListener('message', this.messageListener);
143
+ this.messageListener = undefined;
52
144
  }
53
145
 
54
- const { element } = adView;
55
- const rootElement = document.getElementById('root')!;
56
- const templeLabelElement = document.getElementById('temple-label')!;
57
- rootElement.replaceChildren(element);
146
+ private placeNewAd(adMetadata: AdMetadata) {
147
+ document.body.style.backgroundColor = adMetadata.source.native ? 'transparent' : '#F2F2F2';
148
+
149
+ const { source, dimensions } = adMetadata;
150
+ let adView: AdView;
151
+ switch (source.providerName) {
152
+ case 'Temple':
153
+ adView = makeTKeyAdView(dimensions.width, dimensions.height, source.native);
154
+ break;
155
+ case 'HypeLab':
156
+ case 'SmartyAds':
157
+ adView = makeAdsTwView(this.id, source, dimensions, this.origin);
158
+ break;
159
+ default:
160
+ adView = makeExtensionIframeView(this.id, source, dimensions);
161
+ }
162
+
163
+ const { element } = adView;
164
+ const templeLabelElement = document.getElementById('temple-label')!;
165
+ this.rootElement.replaceChildren(element);
58
166
 
59
- if (!source.native) templeLabelElement.setAttribute('active', '');
60
- else templeLabelElement.removeAttribute('active');
167
+ if (!source.native) templeLabelElement.setAttribute('active', '');
168
+ else templeLabelElement.removeAttribute('active');
61
169
 
62
- const updateBackground = (creativeSet: CreativeSet = {}) => {
170
+ return adView;
171
+ }
172
+
173
+ private updateBackground(source: AdSource, creativeSet: CreativeSet = {}) {
63
174
  const prevBackgroundElement = document.getElementById(BACKGROUND_ELEMENT_ID);
64
175
  if (source.native && prevBackgroundElement) {
65
- rootElement.removeChild(prevBackgroundElement);
176
+ this.rootElement.removeChild(prevBackgroundElement);
66
177
  }
67
178
 
68
179
  if (source.native) {
@@ -87,7 +198,7 @@ export const renderAdsStack = async (
87
198
  }
88
199
 
89
200
  if (!backgroundElement && prevBackgroundElement) {
90
- rootElement.removeChild(prevBackgroundElement);
201
+ this.rootElement.removeChild(prevBackgroundElement);
91
202
  }
92
203
 
93
204
  if (!backgroundElement) return;
@@ -106,76 +217,71 @@ export const renderAdsStack = async (
106
217
  filter: 'blur(12px)'
107
218
  });
108
219
  if (prevBackgroundElement) {
109
- rootElement.replaceChild(backgroundElement, prevBackgroundElement);
220
+ this.rootElement.replaceChild(backgroundElement, prevBackgroundElement);
110
221
  } else {
111
- rootElement.prepend(backgroundElement);
222
+ this.rootElement.prepend(backgroundElement);
112
223
  }
113
224
  } catch (e) {
114
225
  console.error(e);
115
226
  }
116
- };
117
-
118
- if (element instanceof HTMLIFrameElement) {
119
- return new Promise<void>((resolve, reject) => {
120
- const responseTimeout = setTimeout(
121
- () => {
122
- window.removeEventListener('message', messageListener);
123
- reject(new Error(`Timeout exceeded for ${adId}, ad source: ${JSON.stringify(source)}`));
124
- },
125
- (rest.length === 0 ? 20_000 : 10_000) * (AdsConfiguration.IS_MISES_BROWSER ? 2 : 1)
126
- );
127
-
128
- let wasReady = false;
129
- const messageListener = (event: MessageEvent<any>) => {
130
- if (event.source !== element.contentWindow) {
131
- return;
132
- }
227
+ }
133
228
 
134
- try {
135
- const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;
229
+ private broadcastMessage(content: unknown) {
230
+ window.parent.postMessage(JSON.stringify(content), '*');
231
+ }
136
232
 
137
- switch (data.type) {
138
- case AD_READY_MESSAGE_TYPE:
139
- if (!wasReady) {
140
- wasReady = true;
141
- broadcastMessage({ id: adId, type: AD_READY_MESSAGE_TYPE, adMetadata });
142
- clearTimeout(responseTimeout);
143
- resolve();
144
- }
145
- updateBackground(data.ad?.creative_set);
146
- break;
147
- case AD_ERROR_MESSAGE_TYPE:
148
- if (!wasReady) {
149
- window.removeEventListener('message', messageListener);
150
- clearTimeout(responseTimeout);
151
- reject(new Error(data.reason ?? 'Unknown error'));
152
- }
153
- break;
154
- case AD_RESIZE_MESSAGE_TYPE:
155
- const { width, height } = data;
156
- if (width > 0 && height > 0) {
157
- if (adMetadata.source.native) {
158
- element.style.height = `${height}px`;
159
- } else {
160
- extendOrKeepDimension(element, 'width', width);
161
- extendOrKeepDimension(element, 'height', height);
162
- }
163
- broadcastMessage({ ...data, id: adId });
164
- }
165
- }
166
- } catch (error) {
167
- console.error('Observing error:', error);
168
- }
169
- };
233
+ private broadcastNoMoreAds() {
234
+ this.broadcastMessage({ id: this.id, type: AD_ERROR_MESSAGE_TYPE, reason: 'No more ads to render' });
235
+ }
170
236
 
171
- window.addEventListener('message', messageListener);
172
- }).catch(e => {
173
- console.error(e);
237
+ private clearResponseTimeout() {
238
+ if (this.responseTimeout !== undefined) {
239
+ clearTimeout(this.responseTimeout);
240
+ this.responseTimeout = undefined;
241
+ }
242
+ }
243
+
244
+ private handleValidAd(data: any) {
245
+ const adMetadata = this.currentAdMetadata;
174
246
 
175
- return renderAdsStack(adId, rest, origin);
176
- });
247
+ if (!adMetadata) {
248
+ return;
249
+ }
250
+
251
+ if (!this.wasReady) {
252
+ this.wasReady = true;
253
+ this.broadcastMessage({ id: this.id, type: AD_READY_MESSAGE_TYPE, adMetadata });
254
+ }
255
+ this.validAdsCounter++;
256
+ this.clearResponseTimeout();
257
+ this.updateBackground(adMetadata.source, data.ad?.creative_set);
177
258
  }
259
+ }
178
260
 
179
- updateBackground(adView.creativeSet);
180
- broadcastMessage({ id: adId, type: AD_READY_MESSAGE_TYPE, adMetadata });
261
+ /**
262
+ * Tries to render specified ads one-by-one until one of them is loaded or loading of all of them failed. Use it
263
+ * in a dedicated iframe. Sends messages to the parent window on an attempt to render an ad, on successful rendering,
264
+ * on ad resize, and on error.
265
+ */
266
+ export const renderAdsStack = (
267
+ adId: string,
268
+ adsMetadata: (number | AdMetadata)[],
269
+ origin: string,
270
+ pageHasPlacesRules = false,
271
+ adCategories: string[],
272
+ hypelabBlacklistedCampaignsSlugs: string[]
273
+ ) => {
274
+ try {
275
+ const adsStack = new AdsStack(
276
+ adId,
277
+ adsMetadata,
278
+ origin,
279
+ pageHasPlacesRules,
280
+ adCategories,
281
+ hypelabBlacklistedCampaignsSlugs
282
+ );
283
+ adsStack.startRendering();
284
+ } catch (error) {
285
+ console.error('Error while rendering ads stack:', error);
286
+ }
181
287
  };
@@ -86,6 +86,10 @@ export class TempleWalletApi {
86
86
  )
87
87
  );
88
88
 
89
+ getBlacklistedHypelabCampaignsSlugs = withFetchDataExtraction(() =>
90
+ this.api.get<string[]>('/temple-wallet-ads/hypelab-campaigns-blacklist')
91
+ );
92
+
89
93
  getAllRules = async (): Promise<RawAllAdsRules> => {
90
94
  const [
91
95
  adPlacesRulesForAllDomains,
@@ -97,7 +101,8 @@ export class TempleWalletApi {
97
101
  adsReplaceUrlsBlacklist,
98
102
  providersNegativeSelectors,
99
103
  elementsToHideOrRemoveRules,
100
- providersCategories
104
+ providersCategories,
105
+ blacklistedHypelabCampaignsSlugs
101
106
  ] = await Promise.all([
102
107
  this.getAdPlacesRulesForAllDomains(),
103
108
  this.getProvidersRulesForAllDomains(),
@@ -108,7 +113,8 @@ export class TempleWalletApi {
108
113
  this.getAdsReplaceUrlsBlacklist(),
109
114
  this.getNegativeSelectorsForAllProviders(),
110
115
  this.getElementsToHideOrRemoveRules(),
111
- this.getProvidersCategories()
116
+ this.getProvidersCategories(),
117
+ this.getBlacklistedHypelabCampaignsSlugs()
112
118
  ]);
113
119
 
114
120
  return {
@@ -122,6 +128,7 @@ export class TempleWalletApi {
122
128
  providersNegativeSelectors,
123
129
  elementsToHideOrRemoveRules,
124
130
  providersCategories,
131
+ blacklistedHypelabCampaignsSlugs,
125
132
  timestamp: Date.now()
126
133
  };
127
134
  };
@@ -5,7 +5,7 @@ import { RawAllAdsRules, RawPermanentAdPlacesRule } from 'src/types/temple-walle
5
5
 
6
6
  import { CRYPTO_CATEGORY_NAME } from './constants';
7
7
 
8
- export const transformRawRules = (location: Location, rules: RawAllAdsRules): AdsRules => {
8
+ export const transformRawRules = (locationOrHref: Location | string, rules: RawAllAdsRules): AdsRules => {
9
9
  const {
10
10
  adPlacesRulesForAllDomains,
11
11
  providersRulesForAllDomains,
@@ -17,9 +17,11 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
17
17
  adsReplaceUrlsBlacklist = [],
18
18
  elementsToHideOrRemoveRules = {},
19
19
  providersCategories = {},
20
+ blacklistedHypelabCampaignsSlugs = [],
20
21
  timestamp
21
22
  } = rules;
22
- const { hostname, href } = location;
23
+ const href = typeof locationOrHref === 'string' ? locationOrHref : locationOrHref.href;
24
+ const { hostname } = new URL(href);
23
25
 
24
26
  if (adsReplaceUrlsBlacklist.some(regex => new RegExp(regex).test(href))) {
25
27
  return {
@@ -28,6 +30,7 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
28
30
  providersSelectors: [],
29
31
  providersNegativeSelectors: [],
30
32
  elementsToHideOrRemoveRules: [],
33
+ blacklistedHypelabCampaignsSlugs,
31
34
  timestamp
32
35
  };
33
36
  }
@@ -69,6 +72,7 @@ export const transformRawRules = (location: Location, rules: RawAllAdsRules): Ad
69
72
  hrefMatchPredicate,
70
73
  elementsToHideOrRemoveRules
71
74
  ),
75
+ blacklistedHypelabCampaignsSlugs,
72
76
  timestamp
73
77
  };
74
78
  };
@@ -32,6 +32,7 @@ interface InsertAdActionProps
32
32
  originalWidth: number;
33
33
  originalHeight: number;
34
34
  shouldUseBlurredBackground?: boolean;
35
+ adCategories: string[];
35
36
  }
36
37
 
37
38
  export interface ReplaceAllChildrenWithAdAction extends AdActionBase, InsertAdActionProps {
@@ -20,5 +20,6 @@ export interface AdsRules {
20
20
  providersSelectors: Array<{ selector: string; parentDepth: number; categories: string[] }>;
21
21
  providersNegativeSelectors: Array<{ selector: string; parentDepth: number }>;
22
22
  elementsToHideOrRemoveRules: ElementsToHideOrRemoveRule[];
23
+ blacklistedHypelabCampaignsSlugs: string[];
23
24
  timestamp: number;
24
25
  }
@@ -74,5 +74,6 @@ export interface RawAllAdsRules {
74
74
  permanentNativeAdPlacesRulesForAllDomains: Record<string, RawPermanentAdPlacesRule[]>;
75
75
  adsReplaceUrlsBlacklist: string[];
76
76
  elementsToHideOrRemoveRules: Record<string, RawElementsToHideOrRemoveEntry[]>;
77
+ blacklistedHypelabCampaignsSlugs: string[];
77
78
  timestamp: number;
78
79
  }
@@ -1,24 +0,0 @@
1
- export const stripDimentionsLimits = (wrapperElement: HTMLDivElement, width: number, height: number) => {
2
- const predefinedStyles = wrapperElement.style;
3
- // If needed in future, try `getComputedStyle(wrapperElement)` - though would have to not remove but override
4
-
5
- stripOneDimensionLimit(predefinedStyles, width, ['width']);
6
- stripOneDimensionLimit(predefinedStyles, height, ['height', 'maxHeight']);
7
- };
8
-
9
- const stripOneDimensionLimit = (
10
- predefinedStyles: CSSStyleDeclaration,
11
- value: number,
12
- dimensionNames: ('width' | 'height' | 'maxWidth' | 'maxHeight')[]
13
- ) => {
14
- for (const dimensionName of dimensionNames) {
15
- const predefinedStyleValue = predefinedStyles[dimensionName] ?? '';
16
-
17
- if (/^\d+(px)?$/.test(predefinedStyleValue)) {
18
- const predefinedSize = parseInt(predefinedStyleValue, 10);
19
- if (predefinedSize < value) {
20
- predefinedStyles.removeProperty(dimensionName);
21
- }
22
- }
23
- }
24
- };