Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • Synzvato/decentraleyes
  • gkrishnaks/decentraleyes
  • ExE-Boss/decentraleyes
  • whtsky/decentraleyes
  • grtgarrett/decentraleyes
  • An_dz/decentraleyes
  • Alaska/decentraleyes
  • finn/decentraleyes
  • klippy/decentraleyes
9 results
Show changes
Showing
with 2253 additions and 446 deletions
File moved
File moved
{
"manifest_version": 2,
"manifest_version": 3,
"name": "Decentraleyes",
"version": "2.0.1",
"version": "3.0.0",
"author": "Thomas Rientjes",
"default_locale": "en_US",
"description": "__MSG_extensionDescription__",
"icons": {
"16": "icons/icon16.png",
"48": "icons/icon48.png",
"96": "icons/icon96.png",
"128": "icons/icon128.png"
"16": "images/icons/extension/16.png",
"48": "images/icons/extension/48.png",
"96": "images/icons/extension/96.png",
"128": "images/icons/extension/128.png"
},
"permissions": [
"*://*/*",
"privacy",
"storage",
"unlimitedStorage",
"tabs",
"webNavigation",
"webRequestBlocking",
"webRequest",
"webRequestBlocking"
"unlimitedStorage",
"storage",
"tabs"
],
"host_permissions": [
"*://*/*"
],
"background": {
"page": "pages/background/background.html"
"scripts": ["code/main.js"],
"type": "module"
},
"browser_action": {
"action": {
"default_icon": {
"18": "icons/action/icon18.png",
"19": "icons/action/icon19.png",
"32": "icons/action/icon32.png",
"36": "icons/action/icon36.png",
"38": "icons/action/icon38.png",
"64": "icons/action/icon64.png"
"16": "images/icons/action/default/16.png",
"18": "images/icons/action/default/18.png",
"19": "images/icons/action/default/19.png",
"32": "images/icons/action/default/32.png",
"36": "images/icons/action/default/36.png",
"38": "images/icons/action/default/38.png",
"64": "images/icons/action/default/64.png"
},
"default_popup": "pages/popup/popup.html",
"browser_style": false
"default_popup": "pages/popup/popup.html"
},
"options_ui": {
"page": "pages/options/options.html"
},
"applications": {
"browser_specific_settings": {
"gecko": {
"id": "jid1-BoFifL9Vbdl2zQ@jetpack",
"strict_min_version": "56.0a1"
"id": "jid1-BoFifL9Vbdl2zQ@jetpack",
"strict_min_version": "115.0"
},
"gecko_android": {
"strict_min_version": "115.0"
}
},
"web_accessible_resources": [
"resources/*"
]
"web_accessible_resources": [{
"resources": ["resources/*"],
"matches": ["<all_urls>"]
}]
}
/*!
* Font Awesome Free 5.0.1 by @fontawesome - http://fontawesome.com
* License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
!function(){"use strict";function t(t){var e=Object.keys(ht);Object.keys(t).forEach(function(n){~e.indexOf(n)&&(ht[n]=t[n])})}function e(t){return~st.indexOf(t)}function n(t){if(t&&void 0!==K.createElement){var e=K.createElement("style");e.setAttribute("type","text/css"),e.innerHTML=t;for(var n=K.head.childNodes,r=null,i=n.length-1;i>-1;i--){var a=n[i],o=(a.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(o)>-1&&(r=a)}return K.head.insertBefore(e,r),t}}function r(){return++bt}function i(t){for(var e=[],n=(t||[]).length>>>0;n--;)e[n]=t[n];return e}function a(t){return t.classList?i(t.classList):(t.getAttribute("class")||"").split(" ").filter(function(t){return t})}function o(t,n){var r=n.split("-"),i=r[0],a=r.slice(1).join("-");return i!==t||""===a||e(a)?null:a}function s(t){return(""+t).replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function f(t){return Object.keys(t||{}).reduce(function(e,n){return e+(n+'="')+s(t[n])+'" '},"").trim()}function l(t){return Object.keys(t||{}).reduce(function(e,n){return e+(n+": ")+t[n]+";"},"")}function c(t){return t.size!==vt.size||t.x!==vt.x||t.y!==vt.y||t.rotate!==vt.rotate||t.flipX||t.flipY}function u(t){var e=t.transform,n=t.containerWidth,r=t.iconWidth;return{outer:{transform:"translate("+n/2+" 256)"},inner:{transform:"translate("+32*e.x+", "+32*e.y+") "+" "+("scale("+e.size/16*(e.flipX?-1:1)+", "+e.size/16*(e.flipY?-1:1)+") ")+" "+("rotate("+e.rotate+" 0 0)")},path:{transform:"translate("+r/2*-1+" -256)"}}}function m(t){var e=t.transform,n=t.width,r=void 0===n?$:n,i=t.height,a=void 0===i?$:i,o=t.startCentered,s=void 0!==o&&o,f="";return f+=s&&Z?"translate("+(e.x/pt-r/2)+"em, "+(e.y/pt-a/2)+"em) ":s?"translate(calc(-50% + "+e.x/pt+"em), calc(-50% + "+e.y/pt+"em)) ":"translate("+e.x/pt+"em, "+e.y/pt+"em) ",f+="scale("+e.size/pt*(e.flipX?-1:1)+", "+e.size/pt*(e.flipY?-1:1)+") ",f+="rotate("+e.rotate+"deg) "}function d(t){var e,n=t.icons,i=n.main,a=n.mask,o=t.prefix,s=t.iconName,f=t.transform,l=t.symbol,c=t.title,u=t.extra,m=a.found?a:i,d=m.width,g=m.height,h="fa-w-"+Math.ceil(d/g*16),p=[ht.replacementClass,s?ht.familyPrefix+"-"+s:"",h].concat(u.classes).join(" "),v={children:[],attributes:ut({},u.attributes,(e={},ct(e,tt,""),ct(e,"data-prefix",o),ct(e,"data-icon",s),ct(e,"class",p),ct(e,"role","img"),ct(e,"xmlns","http://www.w3.org/2000/svg"),ct(e,"viewBox","0 0 "+d+" "+g),e))};c&&v.children.push({tag:"title",attributes:{id:v.attributes["aria-labelledby"]||"title-"+r()},children:[c]});var b=ut({},v,{prefix:o,iconName:s,main:i,mask:a,transform:f,symbol:l,styles:u.styles}),y=a.found&&i.found?wt(b):xt(b),w=y.children,x=y.attributes;return b.children=w,b.attributes=x,l?_t(b):kt(b)}function g(t){var e,n=t.content,r=t.width,i=t.height,a=t.transform,o=t.title,s=t.extra,f=ut({},s.attributes,o?{title:o}:{},(e={},ct(e,tt,""),ct(e,"class",s.classes.join(" ")),e)),u=ut({},s.styles);c(a)&&(u.transform=m({transform:a,startCentered:!0,width:r,height:i}),u["-webkit-transform"]=u.transform);var d=l(u);d.length>0&&(f.style=d);var g=[];return g.push({tag:"span",attributes:f,children:[n]}),o&&g.push({tag:"span",attributes:{class:"sr-only"},children:[o]}),g}function h(t,e){return Tt[t][e]}function p(t,e){return Pt[t][e]}function v(t){return Ft[t]||{prefix:null,iconName:null}}function b(t){return t.reduce(function(t,e){var n=o(ht.familyPrefix,e);if(Rt[e])t.prefix=e;else if(n){var r="fa"===t.prefix?v(n):{};t.iconName=r.iconName||n,t.prefix=r.prefix||t.prefix}else e!==ht.replacementClass&&0!==e.indexOf("fa-w-")&&t.rest.push(e);return t},Ht())}function y(t,e,n){if(t&&t[e]&&t[e][n])return{prefix:e,iconName:n,icon:t[e][n]}}function w(t){var e=t.tag,n=t.attributes,r=void 0===n?{}:n,i=t.children,a=void 0===i?[]:i;return"string"==typeof t?s(t):"<"+e+" "+f(r)+">"+a.map(w).join("")+"</"+e+">"}function x(t){var e=t.getAttribute?t.getAttribute("class"):null;return!!e&&(!!~e.toString().indexOf(ht.replacementClass)||~e.toString().indexOf("fa-layers-text"))}function k(){return!0===ht.autoReplaceSvg?Bt.replace:Bt[ht.autoReplaceSvg]||Bt.replace}function _(t,e){var n="function"==typeof e?e:It;0===t.length?n():(q.requestAnimationFrame||function(t){return t()})(function(){var e=k(),r=Ct.begin("mutate");t.map(e),r(),n()})}function O(t){Xt=!0,t(),Xt=!1}function A(t){if(G){var e=t.treeCallback,n=t.nodeCallback,r=t.pseudoElementsCallback,o=new G(function(t){Xt||i(t).forEach(function(t){if("childList"===t.type&&t.addedNodes.length>0&&!x(t.addedNodes[0])&&(ht.searchPseudoElements&&r(t.target),e(t.target)),"attributes"===t.type&&"class"===t.attributeName&&t.target.parentNode&&ht.searchPseudoElements&&r(t.target.parentNode),"attributes"===t.type&&x(t.target)&&~ot.indexOf(t.attributeName))if("class"===t.attributeName){var i=b(a(t.target)),o=i.prefix,s=i.iconName;o&&t.target.setAttribute("data-prefix",o),s&&t.target.setAttribute("data-icon",s)}else n(t.target)})});K.getElementsByTagName&&o.observe(K.getElementsByTagName("body")[0],{childList:!0,attributes:!0,characterData:!0,subtree:!0})}}function N(t){for(var e="",n=0;n<t.length;n++)e+=("000"+t.charCodeAt(n).toString(16)).slice(-4);return e}function M(t){var e=Dt(t),n=e.iconName,r=e.prefix,i=e.rest,a=Yt(t),o=Vt(t),s=qt(t),f=Kt(t),l=Gt(t);return{iconName:n,title:t.getAttribute("title"),prefix:r,transform:o,symbol:s,mask:l,extra:{classes:i,styles:a,attributes:f}}}function E(t){this.name="MissingIcon",this.message=t||"Icon unavailable",this.stack=(new Error).stack}function C(t,e){var n={found:!1,width:512,height:512,icon:te};if(t&&e&&ee[e]&&ee[e][t]){var r=ee[e][t];n={found:!0,width:r[0],height:r[1],icon:{tag:"path",attributes:{fill:"currentColor",d:r.slice(4)[0]}}}}else if(t&&e&&!ht.showMissingIcons)throw new E("Icon is missing for prefix "+e+" with icon name "+t);return n}function z(t,e){var n=e.iconName,r=e.title,i=e.prefix,a=e.transform,o=e.symbol,s=e.mask,f=e.extra;return[t,d({icons:{main:C(n,i),mask:C(s.iconName,s.prefix)},prefix:i,iconName:n,transform:a,symbol:o,mask:s,title:r,extra:f})]}function S(t,e){var n=e.title,r=e.transform,i=e.extra,a=null,o=null;if(Z){var s=parseInt(getComputedStyle(t).fontSize,10),f=t.getBoundingClientRect();a=f.width/s,o=f.height/s}return ht.autoA11y&&!n&&(i.attributes["aria-hidden"]="true"),[t,g({content:t.innerHTML,width:a,height:o,transform:r,title:n,extra:i})]}function L(t){var e=M(t);return~e.extra.classes.indexOf(ne)?S(t,e):z(t,e)}function j(t){var e=Ct.begin("searchPseudoElements");O(function(){i(t.querySelectorAll("*")).forEach(function(t){[":before",":after"].forEach(function(e){var n=q.getComputedStyle(t,e),r=n.getPropertyValue("font-family").match(re),a=i(t.children).filter(function(t){return t.getAttribute(et)===e})[0];if(!r&&a&&a.remove(),r&&!a){var o=n.getPropertyValue("content"),s=K.createElement("i");s.setAttribute("class",""+ie[r[1]]),s.setAttribute(et,e),s.innerText=3===o.length?o.substr(1,1):o,":before"===e?t.insertBefore(s,t.firstChild):t.appendChild(s)}})})}),e()}function T(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=K.documentElement.classList,r=function(t){return n.add(nt+"-"+t)},a=function(t){return n.remove(nt+"-"+t)},o=Object.keys(ee),s=["."+ne+":not(["+tt+"])"].concat(o.map(function(t){return"."+t+":not(["+tt+"])"})).join(", ");if(0!==s.length){var f=i(t.querySelectorAll(s));if(f.length>0){r("pending"),a("complete");var l=Ct.begin("onTree"),c=f.reduce(function(t,e){try{var n=L(e);n&&t.push(n)}catch(t){rt||t instanceof E&&console.error(t)}return t},[]);l(),_(c,function(){r("active"),r("complete"),a("pending"),"function"==typeof e&&e()})}}}function P(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=L(t);n&&_([n],e)}function F(t){return{found:!0,width:t[0],height:t[1],icon:{tag:"path",attributes:{fill:"currentColor",d:t.slice(4)[0]}}}}function W(){ht.autoAddCss&&(le||n(fe()),le=!0)}function R(t,e){return Object.defineProperty(t,"abstract",{get:e}),Object.defineProperty(t,"html",{get:function(){return t.abstract.map(function(t){return w(t)})}}),Object.defineProperty(t,"node",{get:function(){if(K.createElement){var e=K.createElement("div");return e.innerHTML=t.html,e.children}}}),t}function H(t){var e=t.prefix,n=void 0===e?"fa":e,r=t.iconName;if(r)return y(ce.definitions,n,r)||y(At.styles,n,r)}var I=function(){},B={},X={},Y=null,D={mark:I,measure:I};try{"undefined"!=typeof window&&(B=window),"undefined"!=typeof document&&(X=document),"undefined"!=typeof MutationObserver&&(Y=MutationObserver),"undefined"!=typeof performance&&(D=performance)}catch(t){}var U=(B.navigator||{}).userAgent,V=void 0===U?"":U,q=B,K=X,G=Y,J=D,Q=!!q.document,Z=~V.indexOf("MSIE")||~V.indexOf("Trident/"),$=16,tt="data-fa-processed",et="data-fa-pseudo-element",nt="fontawesome-i2svg",rt=function(){try{return!0}catch(t){return!1}}(),it=[1,2,3,4,5,6,7,8,9,10],at=it.concat([11,12,13,14,15,16,17,18,19,20]),ot=["class","data-prefix","data-icon","data-fa-transform","data-fa-mask"],st=["xs","sm","lg","fw","ul","li","border","pull-left","pull-right","spin","pulse","rotate-90","rotate-180","rotate-270","flip-horizontal","flip-vertical","stack","stack-1x","stack-2x","inverse","layers","layers-text","layers-counter"].concat(it.map(function(t){return t+"x"})).concat(at.map(function(t){return"w-"+t})),ft=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},lt=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),ct=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t},ut=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},mt=function(t,e){var n={};for(var r in t)e.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},dt=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e<t.length;e++)n[e]=t[e];return n}return Array.from(t)},gt=ut({familyPrefix:"fa",replacementClass:"svg-inline--fa",autoReplaceSvg:!0,autoAddCss:!0,autoA11y:!0,searchPseudoElements:!1,observeMutations:!0,keepOriginalSource:!0,measurePerformance:!1,showMissingIcons:!0},q.FontAwesomeConfig||{});gt.autoReplaceSvg||(gt.observeMutations=!1);var ht=ut({},gt);q.FontAwesomeConfig=ht;var pt=$,vt={size:16,x:0,y:0,rotate:0,flipX:!1,flipY:!1},bt=0,yt={x:0,y:0,width:"100%",height:"100%"},wt=function(t){var e=t.children,n=t.attributes,i=t.main,a=t.mask,o=t.transform,s=i.width,f=i.icon,l=a.width,c=a.icon,m=u({transform:o,containerWidth:l,iconWidth:s}),d={tag:"rect",attributes:ut({},yt,{fill:"white"})},g={tag:"g",attributes:ut({},m.inner),children:[{tag:"path",attributes:ut({},f.attributes,m.path,{fill:"black"})}]},h={tag:"g",attributes:ut({},m.outer),children:[g]},p="mask-"+r(),v="clip-"+r(),b={tag:"defs",children:[{tag:"clipPath",attributes:{id:v},children:[c]},{tag:"mask",attributes:ut({},yt,{id:p,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse"}),children:[d,h]}]};return e.push(b,{tag:"rect",attributes:ut({fill:"currentColor","clip-path":"url(#"+v+")",mask:"url(#"+p+")"},yt)}),{children:e,attributes:n}},xt=function(t){var e=t.children,n=t.attributes,r=t.main,i=t.transform,a=l(t.styles);if(a.length>0&&(n.style=a),c(i)){var o=u({transform:i,containerWidth:r.width,iconWidth:r.width});e.push({tag:"g",attributes:ut({},o.outer),children:[{tag:"g",attributes:ut({},o.inner),children:[{tag:r.icon.tag,children:r.icon.children,attributes:ut({},r.icon.attributes,o.path)}]}]})}else e.push(r.icon);return{children:e,attributes:n}},kt=function(t){var e=t.children,n=t.main,r=t.mask,i=t.attributes,a=t.styles,o=t.transform;if(c(o)&&n.found&&!r.found){var s={x:n.width/n.height/2,y:.5};i.style=l(ut({},a,{"transform-origin":s.x+o.x/16+"em "+(s.y+o.y/16)+"em"}))}return[{tag:"svg",attributes:i,children:e}]},_t=function(t){var e=t.prefix,n=t.iconName,r=t.children,i=t.attributes,a=t.symbol,o=!0===a?e+"-"+ht.familyPrefix+"-"+n:a;return[{tag:"svg",attributes:{style:"display: none;"},children:[{tag:"symbol",attributes:ut({},i,{id:o}),children:r}]}]},Ot=q||{};Ot.___FONT_AWESOME___||(Ot.___FONT_AWESOME___={}),Ot.___FONT_AWESOME___.styles||(Ot.___FONT_AWESOME___.styles={}),Ot.___FONT_AWESOME___.hooks||(Ot.___FONT_AWESOME___.hooks={}),Ot.___FONT_AWESOME___.shims||(Ot.___FONT_AWESOME___.shims=[]);var At=Ot.___FONT_AWESOME___,Nt=function(){},Mt=ht.measurePerformance&&J&&J.mark&&J.measure?J:{mark:Nt,measure:Nt},Et=function(t){Mt.mark('FA "5.0.1" '+t+" ends"),Mt.measure('FA "5.0.1" '+t,'FA "5.0.1" '+t+" begins",'FA "5.0.1" '+t+" ends")},Ct={begin:function(t){return Mt.mark('FA "5.0.1" '+t+" begins"),function(){return Et(t)}},end:Et},zt=function(t,e){return function(n,r,i,a){return t.call(e,n,r,i,a)}},St=function(t,e,n,r){var i,a,o,s=Object.keys(t),f=s.length,l=void 0!==r?zt(e,r):e;for(void 0===n?(i=1,o=t[s[0]]):(i=0,o=n);i<f;i++)o=l(o,t[a=s[i]],a,t);return o},Lt=At.styles,jt=At.shims,Tt={},Pt={},Ft={},Wt=function(){var t=function(t){return St(Lt,function(e,n,r){return e[r]=St(n,t,{}),e},{})};Tt=t(function(t,e,n){return t[e[3]]=n,t}),Pt=t(function(t,e,n){var r=e[2];return t[n]=n,r.forEach(function(e){t[e]=n}),t});var e="far"in Lt;Ft=St(jt,function(t,n){var r=n[0],i=n[1],a=n[2];return"far"!==i||e||(i="fas"),t[r]={prefix:i,iconName:a},t},{})};Wt();var Rt=At.styles,Ht=function(){return{prefix:null,iconName:null,rest:[]}},It=function(){},Bt={replace:function(t){var e=t[0],n=t[1].map(function(t){return w(t)}).join("\n");if(e.parentNode&&e.outerHTML)e.outerHTML=n+(ht.keepOriginalSource&&"svg"!==e.tagName.toLowerCase()?"\x3c!-- "+e.outerHTML+" --\x3e":"");else if(e.parentNode){var r=document.createElement("span");e.parentNode.replaceChild(r,e),r.outerHTML=n}},nest:function(t){var e=t[0],n=t[1];if(~a(e).indexOf(ht.replacementClass))return Bt.replace(t);var r=new RegExp(ht.familyPrefix+"-.*");delete n[0].attributes.style;var i=n[0].attributes.class.split(" ").reduce(function(t,e){return e===ht.replacementClass||e.match(r)?t.toSvg.push(e):t.toNode.push(e),t},{toNode:[],toSvg:[]});n[0].attributes.class=i.toSvg.join(" ");var o=n.map(function(t){return w(t)}).join("\n");e.setAttribute("class",i.toNode.join(" ")),e.setAttribute(tt,""),e.innerHTML=o}},Xt=!1,Yt=function(t){var e=t.getAttribute("style"),n=[];return e&&(n=e.split(";").reduce(function(t,e){var n=e.split(":"),r=n[0],i=n.slice(1);return r&&i.length>0&&(t[r]=i.join(":").trim()),t},{})),n},Dt=function(t){var e=t.getAttribute("data-prefix"),n=t.getAttribute("data-icon"),r=void 0!==t.innerText?t.innerText.trim():"",i=b(a(t));return e&&n&&(i.prefix=e,i.iconName=n),i.prefix&&r.length>1?i.iconName=p(i.prefix,t.innerText):i.prefix&&1===r.length&&(i.iconName=h(i.prefix,N(t.innerText))),i},Ut=function(t){var e={size:16,x:0,y:0,flipX:!1,flipY:!1,rotate:0};return t?t.toLowerCase().split(" ").reduce(function(t,e){var n=e.toLowerCase().split("-"),r=n[0],i=n.slice(1).join("-");if(r&&"h"===i)return t.flipX=!0,t;if(r&&"v"===i)return t.flipY=!0,t;if(i=parseFloat(i),isNaN(i))return t;switch(r){case"grow":t.size=t.size+i;break;case"shrink":t.size=t.size-i;break;case"left":t.x=t.x-i;break;case"right":t.x=t.x+i;break;case"up":t.y=t.y-i;break;case"down":t.y=t.y+i;break;case"rotate":t.rotate=t.rotate+i}return t},e):e},Vt=function(t){return Ut(t.getAttribute("data-fa-transform"))},qt=function(t){var e=t.getAttribute("data-fa-symbol");return null!==e&&(""===e||e)},Kt=function(t){var e=i(t.attributes).reduce(function(t,e){return"class"!==t.name&&"style"!==t.name&&(t[e.name]=e.value),t},{}),n=t.getAttribute("title");return ht.autoA11y&&(n?e["aria-labelledby"]=ht.replacementClass+"-title-"+r():e["aria-hidden"]="true"),e},Gt=function(t){var e=t.getAttribute("data-fa-mask");return e?b(e.split(" ").map(function(t){return t.trim()})):Ht()};E.prototype=Object.create(Error.prototype),E.prototype.constructor=E;var Jt={fill:"currentColor"},Qt={attributeType:"XML",repeatCount:"indefinite",dur:"2s"},Zt={tag:"path",attributes:ut({},Jt,{d:"M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z"})},$t=ut({},Qt,{attributeName:"opacity"}),te={tag:"g",children:[Zt,{tag:"circle",attributes:ut({},Jt,{cx:"256",cy:"364",r:"28"}),children:[{tag:"animate",attributes:ut({},Qt,{attributeName:"r",values:"28;14;28;28;14;28;"})},{tag:"animate",attributes:ut({},$t,{values:"1;0;1;1;0;1;"})}]},{tag:"path",attributes:ut({},Jt,{opacity:"1",d:"M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z"}),children:[{tag:"animate",attributes:ut({},$t,{values:"1;0;0;0;0;1;"})}]},{tag:"path",attributes:ut({},Jt,{opacity:"0",d:"M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z"}),children:[{tag:"animate",attributes:ut({},$t,{values:"0;0;1;1;0;0;"})}]}]},ee=At.styles,ne="fa-layers-text",re=/Font Awesome 5 (Solid|Regular|Light|Brands)/,ie={Solid:"fas",Regular:"far",Light:"fal",Brands:"fab"},ae=[],oe=(K.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(K.readyState);oe||K.addEventListener("DOMContentLoaded",function t(){K.removeEventListener("DOMContentLoaded",t),oe=1,ae.map(function(t){return t()})});var se=function(t){K&&(oe?setTimeout(t,0):ae.push(t))},fe=function(){var t="svg-inline--fa",e=ht.familyPrefix,n=ht.replacementClass,r="svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-12.5%;width:1em}.fa-layers svg.svg-inline--fa{-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom right;transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom left;transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top left;transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1em}.svg-inline--fa.fa-stack-2x{height:2em;width:2em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}";if("fa"!==e||n!==t){var i=new RegExp("\\.fa\\-","g"),a=new RegExp("\\."+t,"g");r=r.replace(i,"."+e+"-").replace(a,"."+n)}return r},le=!1,ce=new(function(){function t(){ft(this,t),this.definitions={}}return lt(t,[{key:"add",value:function(){for(var t=this,e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];var i=n.reduce(this._pullDefinitions,{});Object.keys(i).forEach(function(e){t.definitions[e]=ut({},t.definitions[e]||{},i[e])})}},{key:"reset",value:function(){this.definitions={}}},{key:"_pullDefinitions",value:function(t,e){var n=e.prefix&&e.iconName&&e.icon?{0:e}:e;return Object.keys(n).map(function(e){var r=n[e],i=r.prefix,a=r.iconName,o=r.icon;t[i]||(t[i]={}),t[i][a]=o}),t}}]),t}()),ue={dom:{i2svg:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};W();var e=t.node,n=void 0===e?K:e,r=t.callback,i=void 0===r?function(){}:r;ht.searchPseudoElements&&j(n),T(n,i)},css:fe,insertCss:function(){n(fe())}},library:ce,parse:{transform:function(t){return Ut(t)}},findIconDefinition:H,icon:function(t){return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=(e||{}).icon?e:H(e||{}),i=n.mask;return i&&(i=(i||{}).icon?i:H(i||{})),t(r,ut({},n,{mask:i}))}}(function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.transform,i=void 0===n?vt:n,a=e.symbol,o=void 0!==a&&a,s=e.mask,f=void 0===s?null:s,l=e.title,c=void 0===l?null:l,u=e.classes,m=void 0===u?[]:u,g=e.attributes,h=void 0===g?{}:g,p=e.styles,v=void 0===p?{}:p;if(t){var b=t.prefix,y=t.iconName,w=t.icon;return R(ut({type:"icon"},t),function(){return W(),ht.autoA11y&&(c?h["aria-labelledby"]=ht.replacementClass+"-title-"+r():h["aria-hidden"]="true"),d({icons:{main:F(w),mask:f?F(f.icon):{found:!1,width:null,height:null,icon:{}}},prefix:b,iconName:y,transform:ut({},vt,i),symbol:o,title:c,extra:{attributes:h,styles:v,classes:m}})})}}),text:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.transform,r=void 0===n?vt:n,i=e.title,a=void 0===i?null:i,o=e.classes,s=void 0===o?[]:o,f=e.attributes,l=void 0===f?{}:f,c=e.styles,u=void 0===c?{}:c;return R({type:"text",content:t},function(){return W(),g({content:t,transform:ut({},vt,r),title:a,extra:{attributes:l,styles:u,classes:[ht.familyPrefix+"-layers-text"].concat(dt(s))}})})},layer:function(t){return R({type:"layer"},function(){W();var e=[];return t(function(t){e=Array.isArray(t)?t.map(function(t){e=e.concat(t.abstract)}):e.concat(t.abstract)}),[{tag:"span",attributes:{class:ht.familyPrefix+"-layers"},children:e}]})}};Object.defineProperty(ue,"config",{get:function(){ht.autoReplaceSvg,ht.observeMutations,ht.showMissingIcons;return mt(ht,["autoReplaceSvg","observeMutations","showMissingIcons"])},set:function(e){t(e)}}),function(t){try{t()}catch(t){}}(function(){var t=function(){ht.autoReplaceSvg&&ue.dom.i2svg({node:K})};Q&&(q.FontAwesome||(q.FontAwesome=ue),se(function(){Object.keys(At.styles).length>0&&t(),ht.observeMutations&&"function"==typeof MutationObserver&&A({treeCallback:T,nodeCallback:P,pseudoElementsCallback:j})})),At.hooks=ut({},At.hooks,{addPack:function(e,n){At.styles[e]=ut({},At.styles[e]||{},n),Wt(),t()},addShims:function(e){var n;(n=At.shims).push.apply(n,dt(e)),Wt(),t()}})})}();
\ No newline at end of file
/*!
* Font Awesome Free 5.0.1 by @fontawesome - http://fontawesome.com
* License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
!function(){"use strict";function c(c){"function"==typeof m.hooks.addPack?m.hooks.addPack(c,a):m.styles[c]=s({},m.styles[c]||{},a)}var h={};try{"undefined"!=typeof window&&(h=window)}catch(c){}var v=(h.navigator||{}).userAgent,l=void 0===v?"":v,z=h,H=(~l.indexOf("MSIE")||l.indexOf("Trident/"),[1,2,3,4,5,6,7,8,9,10]),M=H.concat([11,12,13,14,15,16,17,18,19,20]),a=(["xs","sm","lg","fw","ul","li","border","pull-left","pull-right","spin","pulse","rotate-90","rotate-180","rotate-270","flip-horizontal","flip-vertical","stack","stack-1x","stack-2x","inverse","layers","layers-text","layers-counter"].concat(H.map(function(c){return c+"x"})).concat(M.map(function(c){return"w-"+c})),{btc:[384,512,[],"f15a","M310.204 242.638c27.73-14.18 45.377-39.39 41.28-81.3-5.358-57.351-52.458-76.573-114.85-81.929V0h-48.528v77.203c-12.605 0-25.525.315-38.444.63V0h-48.528v79.409c-17.842.539-38.622.276-97.37 0v51.678c38.314-.678 58.417-3.14 63.023 21.427v217.429c-2.925 19.492-18.524 16.685-53.255 16.071L3.765 443.68c88.481 0 97.37.315 97.37.315V512h48.528v-67.06c13.234.315 26.154.315 38.444.315V512h48.528v-68.005c81.299-4.412 135.647-24.894 142.895-101.467 5.671-61.446-23.32-88.862-69.326-99.89zM150.608 134.553c27.415 0 113.126-8.507 113.126 48.528 0 54.515-85.71 48.212-113.126 48.212v-96.74zm0 251.776V279.821c32.772 0 133.127-9.138 133.127 53.255-.001 60.186-100.355 53.253-133.127 53.253z"],cog:[512,512,[],"f013","M444.788 291.1l42.616 24.599c4.867 2.809 7.126 8.618 5.459 13.985-11.07 35.642-29.97 67.842-54.689 94.586a12.016 12.016 0 0 1-14.832 2.254l-42.584-24.595a191.577 191.577 0 0 1-60.759 35.13v49.182a12.01 12.01 0 0 1-9.377 11.718c-34.956 7.85-72.499 8.256-109.219.007-5.49-1.233-9.403-6.096-9.403-11.723v-49.184a191.555 191.555 0 0 1-60.759-35.13l-42.584 24.595a12.016 12.016 0 0 1-14.832-2.254c-24.718-26.744-43.619-58.944-54.689-94.586-1.667-5.366.592-11.175 5.459-13.985L67.212 291.1a193.48 193.48 0 0 1 0-70.199l-42.616-24.599c-4.867-2.809-7.126-8.618-5.459-13.985 11.07-35.642 29.97-67.842 54.689-94.586a12.016 12.016 0 0 1 14.832-2.254l42.584 24.595a191.577 191.577 0 0 1 60.759-35.13V25.759a12.01 12.01 0 0 1 9.377-11.718c34.956-7.85 72.499-8.256 109.219-.007 5.49 1.233 9.403 6.096 9.403 11.723v49.184a191.555 191.555 0 0 1 60.759 35.13l42.584-24.595a12.016 12.016 0 0 1 14.832 2.254c24.718 26.744 43.619 58.944 54.689 94.586 1.667 5.366-.592 11.175-5.459 13.985L444.788 220.9a193.485 193.485 0 0 1 0 70.2zM336 256c0-44.112-35.888-80-80-80s-80 35.888-80 80 35.888 80 80 80 80-35.888 80-80z"],cube:[512,512,[],"f1b2","M239.1 6.3l-208 78c-18.7 7-31.1 25-31.1 45v225.1c0 18.2 10.3 34.8 26.5 42.9l208 104c13.5 6.8 29.4 6.8 42.9 0l208-104c16.3-8.1 26.5-24.8 26.5-42.9V129.3c0-20-12.4-37.9-31.1-44.9l-208-78C262 2.2 250 2.2 239.1 6.3zM256 68.4l192 72v1.1l-192 78-192-78v-1.1l192-72zm32 356V275.5l160-65v133.9l-160 80z"],"exclamation-triangle":[576,512,[],"f071","M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"],"github-alt":[480,512,[],"f113","M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"],globe:[512,512,[],"f0ac","M364.215 192h131.43c5.439 20.419 8.354 41.868 8.354 64s-2.915 43.581-8.354 64h-131.43c5.154-43.049 4.939-86.746 0-128zM185.214 352c10.678 53.68 33.173 112.514 70.125 151.992.221.001.44.008.661.008s.44-.008.661-.008c37.012-39.543 59.467-98.414 70.125-151.992H185.214zm174.13-192h125.385C452.802 84.024 384.128 27.305 300.95 12.075c30.238 43.12 48.821 96.332 58.394 147.925zm-27.35 32H180.006c-5.339 41.914-5.345 86.037 0 128h151.989c5.339-41.915 5.345-86.037-.001-128zM152.656 352H27.271c31.926 75.976 100.6 132.695 183.778 147.925-30.246-43.136-48.823-96.35-58.393-147.925zm206.688 0c-9.575 51.605-28.163 104.814-58.394 147.925 83.178-15.23 151.852-71.949 183.778-147.925H359.344zm-32.558-192c-10.678-53.68-33.174-112.514-70.125-151.992-.221 0-.44-.008-.661-.008s-.44.008-.661.008C218.327 47.551 195.872 106.422 185.214 160h141.572zM16.355 192C10.915 212.419 8 233.868 8 256s2.915 43.581 8.355 64h131.43c-4.939-41.254-5.154-84.951 0-128H16.355zm136.301-32c9.575-51.602 28.161-104.81 58.394-147.925C127.872 27.305 59.198 84.024 27.271 160h125.385z"],monero:[496,512,[],"f3d0","M352 384h108.4C417 455.9 338.1 504 248 504S79 455.9 35.6 384H144V256.2L248 361l104-105v128zM88 336V128l159.4 159.4L408 128v208h74.8c8.5-25.1 13.2-52 13.2-80C496 119 385 8 248 8S0 119 0 256c0 28 4.6 54.9 13.2 80H88z"],"power-off":[512,512,[],"f011","M400 54.1c63 45 104 118.6 104 201.9 0 136.8-110.8 247.7-247.5 248C120 504.3 8.2 393 8 256.4 7.9 173.1 48.9 99.3 111.8 54.2c11.7-8.3 28-4.8 35 7.7L162.6 90c5.9 10.5 3.1 23.8-6.6 31-41.5 30.8-68 79.6-68 134.9-.1 92.3 74.5 168.1 168 168.1 91.6 0 168.6-74.2 168-169.1-.3-51.8-24.7-101.8-68.1-134-9.7-7.2-12.4-20.5-6.5-30.9l15.8-28.1c7-12.4 23.2-16.1 34.8-7.8zM296 264V24c0-13.3-10.7-24-24-24h-32c-13.3 0-24 10.7-24 24v240c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24z"],"shield-alt":[512,512,[],"f3ed","M496 128c0 221.282-135.934 344.645-221.539 380.308a48 48 0 0 1-36.923 0C130.495 463.713 16 326.487 16 128a48 48 0 0 1 29.539-44.308l192-80a48 48 0 0 1 36.923 0l192 80A48 48 0 0 1 496 128zM256 446.313l.066.034c93.735-46.689 172.497-156.308 175.817-307.729L256 65.333v380.98z"],"window-restore":[512,512,[],"f2d2","M512 48v288c0 26.5-21.5 48-48 48h-48V176c0-44.1-35.9-80-80-80H128V48c0-26.5 21.5-48 48-48h288c26.5 0 48 21.5 48 48zM384 176v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48h288c26.5 0 48 21.5 48 48zm-68 28c0-6.6-5.4-12-12-12H76c-6.6 0-12 5.4-12 12v52h252v-52z"]}),V=z||{};V.___FONT_AWESOME___||(V.___FONT_AWESOME___={}),V.___FONT_AWESOME___.styles||(V.___FONT_AWESOME___.styles={}),V.___FONT_AWESOME___.hooks||(V.___FONT_AWESOME___.hooks={}),V.___FONT_AWESOME___.shims||(V.___FONT_AWESOME___.shims=[]);var m=V.___FONT_AWESOME___,s=Object.assign||function(c){for(var h=1;h<arguments.length;h++){var v=arguments[h];for(var l in v)Object.prototype.hasOwnProperty.call(v,l)&&(c[l]=v[l])}return c};!function(c){try{c()}catch(c){}}(function(){c("fai"),c("fa")})}();
{
"name": "decentraleyes",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "decentraleyes",
"license": "MPL-2.0",
"devDependencies": {
"@eslint/eslintrc": "^3.1.0",
"@eslint/js": "^9.12.0",
"eslint": "^9.12.0",
"eslint-plugin-no-unsanitized": "^4.1.2",
"globals": "^15.10.0"
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
"integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
"dev": true,
"dependencies": {
"eslint-visitor-keys": "^3.4.3"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
},
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/@eslint-community/regexpp": {
"version": "4.12.1",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
"integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
"node_modules/@eslint/config-array": {
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz",
"integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==",
"dev": true,
"dependencies": {
"@eslint/object-schema": "^2.1.4",
"debug": "^4.3.1",
"minimatch": "^3.1.2"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/core": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz",
"integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/eslintrc": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
"integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^10.0.1",
"globals": "^14.0.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/@eslint/eslintrc/node_modules/globals": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
"dev": true,
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@eslint/js": {
"version": "9.15.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz",
"integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/object-schema": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
"integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/plugin-kit": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz",
"integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==",
"dev": true,
"dependencies": {
"levn": "^0.4.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@humanfs/core": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
"integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
"dev": true,
"engines": {
"node": ">=18.18.0"
}
},
"node_modules/@humanfs/node": {
"version": "0.16.6",
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
"integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
"dev": true,
"dependencies": {
"@humanfs/core": "^0.19.1",
"@humanwhocodes/retry": "^0.3.0"
},
"engines": {
"node": ">=18.18.0"
}
},
"node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
"integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
"dev": true,
"engines": {
"node": ">=18.18"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/nzakas"
}
},
"node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
"engines": {
"node": ">=12.22"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/nzakas"
}
},
"node_modules/@humanwhocodes/retry": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
"integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
"dev": true,
"engines": {
"node": ">=18.18"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/nzakas"
}
},
"node_modules/@types/estree": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
"dev": true
},
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true
},
"node_modules/acorn": {
"version": "8.14.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
"integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/debug": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"dev": true,
"dependencies": {
"ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint": {
"version": "9.15.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz",
"integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.19.0",
"@eslint/core": "^0.9.0",
"@eslint/eslintrc": "^3.2.0",
"@eslint/js": "9.15.0",
"@eslint/plugin-kit": "^0.2.3",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.1",
"@types/estree": "^1.0.6",
"@types/json-schema": "^7.0.15",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.5",
"debug": "^4.3.2",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^8.2.0",
"eslint-visitor-keys": "^4.2.0",
"espree": "^10.3.0",
"esquery": "^1.5.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^8.0.0",
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
"ignore": "^5.2.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.3"
},
"bin": {
"eslint": "bin/eslint.js"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://eslint.org/donate"
},
"peerDependencies": {
"jiti": "*"
},
"peerDependenciesMeta": {
"jiti": {
"optional": true
}
}
},
"node_modules/eslint-plugin-no-unsanitized": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.2.tgz",
"integrity": "sha512-ydF3PMFKEIkP71ZbLHFvu6/FW8SvRv6VV/gECfrQkqyD5+5oCAtPz8ZHy0GRuMDtNe2jsNdPCQXX4LSbkapAVQ==",
"dev": true,
"peerDependencies": {
"eslint": "^8 || ^9"
}
},
"node_modules/eslint-scope": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
"integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
"dev": true,
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-visitor-keys": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
"integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/espree": {
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
"integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
"dev": true,
"dependencies": {
"acorn": "^8.14.0",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^4.2.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/esquery": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"dev": true,
"dependencies": {
"estraverse": "^5.1.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"dependencies": {
"estraverse": "^5.2.0"
},
"engines": {
"node": ">=4.0"
}
},
"node_modules/estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
"engines": {
"node": ">=4.0"
}
},
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"dev": true
},
"node_modules/file-entry-cache": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
"integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
"dev": true,
"dependencies": {
"flat-cache": "^4.0.0"
},
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"dependencies": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/flat-cache": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
"integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
"dev": true,
"dependencies": {
"flatted": "^3.2.9",
"keyv": "^4.5.4"
},
"engines": {
"node": ">=16"
}
},
"node_modules/flatted": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
"integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
"dev": true
},
"node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.3"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/globals": {
"version": "15.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz",
"integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==",
"dev": true,
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"engines": {
"node": ">= 4"
}
},
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
"engines": {
"node": ">=0.8.19"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"dev": true
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true
},
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dev": true,
"dependencies": {
"json-buffer": "3.0.1"
}
},
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"dependencies": {
"p-locate": "^5.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
"node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
"node_modules/optionator": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
"dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
"word-wrap": "^1.2.5"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"dependencies": {
"yocto-queue": "^0.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"dependencies": {
"p-limit": "^3.0.2"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"dependencies": {
"callsites": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"dependencies": {
"shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"dependencies": {
"prelude-ls": "^1.2.1"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
}
}
}
{
"name": "decentraleyes",
"repository": "https://git.synz.io/Synzvato/decentraleyes",
"license": "MPL-2.0",
"devDependencies": {
"@eslint/eslintrc": "^3.1.0",
"@eslint/js": "^9.12.0",
"eslint": "^9.12.0",
"eslint-plugin-no-unsanitized": "^4.1.2",
"globals": "^15.10.0"
}
}
<!DOCTYPE html>
<html>
<head>
<title>Decentraleyes Background</title>
<meta charset="utf-8" />
</head>
<body>
<script src="../../modules/internal/wrappers.js"></script>
<script src="../../modules/internal/helpers.js"></script>
<script src="../../core/constants.js"></script>
<script src="../../core/files.js"></script>
<script src="../../core/resources.js"></script>
<script src="../../core/mappings.js"></script>
<script src="../../core/state-manager.js"></script>
<script src="../../core/request-analyzer.js"></script>
<script src="../../core/interceptor.js"></script>
<script src="../../core/main.js"></script>
</body>
</html>
......@@ -7,15 +7,39 @@ body {
cursor: default;
font-family: 'Noto Sans', Arial, sans-serif !important;
font-size: 12px;
padding: 10px !important;
margin-bottom: 5px;
margin-top: -15px;
padding: 10px 2px !important;
}
.option {
margin-bottom: 22px;
display: flex;
flex-direction: column;
margin-top: 25px;
}
.notice {
margin-top: 12px;
border-radius: 3px;
box-sizing: border-box;
margin-top: 25px;
max-width: 470px;
padding: 14px 16px;
}
.notice-default {
background-color: #f1f1f1;
border: 1px solid #d2d2d2;
color: #282828;
}
.notice-warning {
background-color: #ffd90f;
border: 1px solid #d2b115;
color: #463a02;
}
.notice-secondary {
margin-top: 50px;
}
/**
......@@ -26,7 +50,7 @@ body {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: url('../../modules/noto-sans/noto-sans.woff2')
src: url('../shared/resources/fonts/noto-sans/regular.woff2')
format('woff2');
}
......@@ -34,7 +58,7 @@ body {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 600;
src: url('../../modules/noto-sans/noto-sans-bold.woff2')
src: url('../shared/resources/fonts/noto-sans/bold.woff2')
format('woff2');
}
......@@ -42,7 +66,7 @@ body {
font-family: 'Noto Sans';
font-style: italic;
font-weight: 400;
src: url('../../modules/noto-sans/noto-sans-italic.woff2')
src: url('../shared/resources/fonts/noto-sans/italic.woff2')
format('woff2');
}
......@@ -54,6 +78,7 @@ body {
align-items: center;
display: flex;
font-weight: 600;
user-select: none;
}
/**
......@@ -61,12 +86,21 @@ body {
*/
.input-checkbox {
margin: 0 4px 0 0;
margin: 0 5px 0 0;
outline: 0;
}
.input-text {
margin-left: 29px;
max-width: 320px;
}
.text-label {
padding: 0 2px;
}
.input-checkbox:focus + .text-label {
outline: 1px dotted #000;
}
/**
......@@ -74,10 +108,75 @@ body {
*/
.icon {
color: #777;
margin-right: 3px;
}
/**
* Buttons
*/
.button {
background-color: #f5f5f5;
border-color: #cfcfcf;
border-radius: 2px;
border-style: solid;
border-width: 1px 1px 2px 1px;
color: #282828;
cursor: pointer;
float: right;
font-size: 12px;
outline: 0;
padding: 5px 22px;
text-decoration: none;
user-select: none;
white-space: nowrap;
}
.button:hover {
background-color: #fff;
}
.button:focus {
background-color: #fff;
border-color: #9a9a9a;
color: #000;
}
.button:active {
background-color: #dedede;
border-bottom-width: 1px;
margin-top: 1px;
}
.button-warning {
background-color: #ffef95;
border-color: #ae920d;
color: #1a1500;
}
.button-warning:hover {
background-color: #fffbde;
border-color: #a48b14;
color: #000;
}
.button-warning:focus {
background-color: #fff9d8;
border-color: #91790a;
color: #000;
}
.button-warning:active {
background-color: #d7b002;
border-color: #a48900;
color: #292100;
}
.button-notice {
margin-left: auto;
padding: 5px 9px;
}
/**
* Links
*/
......@@ -91,7 +190,7 @@ body {
*/
.description-option {
color: #777;
color: #757575;
font-style: italic;
padding-left: 29px;
}
......@@ -106,7 +205,9 @@ body {
}
.badge-warning {
background-color: #ffa500;
background-color: #ffd90f;
border: 1px solid #f0c600;
color: #463a02;
}
.hidden {
......@@ -118,14 +219,19 @@ body {
display: flex;
}
.notice-head {
font-weight: 600;
margin-bottom: 6px;
}
.notice-body {
background-color: #fbfbfb;
border-radius: 3px;
border: 1px solid #e7e7e7;
color: #595959;
display: inline-block;
font-size: 11px;
padding: 8px 10px;
align-items: center;
display: flex;
}
.notice-message {
line-height: 1.3;
margin-right: 14px;
}
/**
......@@ -150,3 +256,23 @@ body[dir="rtl"] .input-text {
margin-left: 0;
margin-right: 29px;
}
/**
* Compatibility
*/
@media (prefers-color-scheme: dark) {
body {
background-color: #23222b;
color: #f9f9fa;
}
.description-option {
color: #b1b1b3;
}
.input-checkbox:focus + .text-label {
outline: 1px dotted #f9f9fa;
}
}
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<title>Decentraleyes Options</title>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8">
<link rel="shortcut icon" href="../shared/resources/images/icons/extension/favicon.ico" type="image/x-icon">
<link rel="icon" href="../shared/resources/images/icons/extension/favicon.ico" type="image/x-icon">
<link rel="stylesheet" type="text/css" href="options.css">
<script defer src="../../modules/fontawesome/icon-bundle.min.js"></script>
<script defer src="../../modules/fontawesome/fontawesome.min.js"></script>
<script defer type="module" src="../shared/resources/images/icons/default.js"></script>
<script defer src="../shared/resources/scripts/fontawesome.min.js"></script>
</head>
<body>
<script src="../../core/constants.js"></script>
<script src="../../modules/internal/helpers.js"></script>
<script type="module" src="options.js"></script>
<script src="options.js"></script>
<div id="wrapper" class="hidden">
<section class="option">
<section class="option">
<div class="title-option">
<div class="title-option">
<label class="label-checkbox">
<label class="label-checkbox">
<input class="input-checkbox" data-option="showIconBadge" type="checkbox">
<span data-i18n-content="showIconBadgeTitle"></span>
<input class="input-checkbox" data-option="showIconBadge" type="checkbox">
<span class="text-label" data-i18n-content="showIconBadgeTitle"></span>
</label>
</label>
</div>
</div>
<div class="description-option" data-i18n-content="showIconBadgeDescription"></div>
<div class="description-option" data-i18n-content="showIconBadgeDescription"></div>
</section>
</section>
<section class="option">
<section class="option">
<div class="title-option">
<div class="title-option">
<label class="label-checkbox">
<label class="label-checkbox">
<input class="input-checkbox" data-option="blockMissing" type="checkbox">
<span data-i18n-content="blockMissingTitle"></span>
<input class="input-checkbox" data-option="stripMetadata" type="checkbox">
<span class="text-label" data-i18n-content="stripMetadataTitle"></span>
</label>
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
</div>
<div class="description-option" data-i18n-content="stripMetadataDescription"></div>
</section>
<section class="option">
</label>
<div class="title-option">
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
<label class="label-checkbox">
</div>
<input class="input-checkbox" data-option="disablePrefetch" type="checkbox">
<span class="text-label" data-i18n-content="disablePrefetchTitle"></span>
<div class="description-option" data-i18n-content="blockMissingDescription"></div>
</label>
</section>
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
<section class="option">
</div>
<div class="title-option">
<div class="description-option" data-i18n-content="disablePrefetchDescription"></div>
<label class="label-checkbox">
</section>
<input class="input-checkbox" data-option="disablePrefetch" type="checkbox">
<span data-i18n-content="disablePrefetchTitle"></span>
<section class="option">
</label>
<div class="title-option">
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
<label class="label-checkbox">
</div>
<input class="input-checkbox" data-option="blockMissing" type="checkbox">
<span class="text-label" data-i18n-content="blockMissingTitle"></span>
<div class="description-option" data-i18n-content="disablePrefetchDescription"></div>
</label>
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
</div>
<div class="description-option" data-i18n-content="blockMissingDescription"></div>
</section>
<section class="notice notice-warning hidden" id="notice-block-missing">
<div class="notice-head">
<i class="fa fa-exclamation-triangle icon"></i>
<span data-i18n-content="blockMissingTitle"></span>
</section>
</div>
<section class="option">
<div class="notice-body" dir="ltr">
<div class="title-option">
<div class="notice-message">
This feature breaks websites. Do not leave it enabled, unless you are prepared to manually whitelist any affected domains.
</div>
<label class="label-checkbox">
<div class="button button-notice button-warning" id="button-block-missing" tabindex="0">
Disable
</div>
<input class="input-checkbox" data-option="stripMetadata" type="checkbox">
<span data-i18n-content="stripMetadataTitle"></span>
</div>
</label>
</section>
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
<section class="option">
</div>
<label for="input-domains" class="title-option" data-i18n-content="whitelistedDomainsTitle"></label>
<input id="input-domains" class="input-text" data-option="whitelistedDomains" type="text">
<div class="description-option" data-i18n-content="whitelistedDomainsDescription"></div>
<div class="description-option" data-i18n-content="stripMetadataDescription"></div>
</section>
</section>
<section class="notice notice-default notice-secondary hidden" id="notice-locale">
<section class="option">
<div class="notice-body" dir="ltr">
<div class="title-option" data-i18n-content="whitelistedDomainsTitle"></div>
<input class="input-text" data-option="whitelistedDomains" type="text">
<div class="description-option" data-i18n-content="whitelistedDomainsDescription"></div>
<div class="notice-message">
</section>
<i class="fa fa-exclamation-triangle icon"></i>
Your preferred language is not yet fully supported.
<section class="notice hidden" id="notice-locale">
</div>
<div class="notice-body" dir="ltr">
<a class="button button-notice" id="button-help-translate" tabindex="0">
Help Translate
</a>
<i class="fai fa-exclamation-triangle icon"></i>
Your preferred language is not yet fully supported.
<a class="link-text" href="https://crowdin.com/project/decentraleyes" target="_blank">
Help Translate
</a>
</div>
</div>
</section>
</section>
</div>
</body>
......
/**
* Main Options Page
* Options Page
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
......@@ -11,132 +11,215 @@
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
'use strict';
import Helpers from '../shared/code/helpers.js';
/**
* Options
* Private Constants
*/
var options = {};
const _whitelistTrimExpression = /^;+|;+$/g;
const _whitelistValueSeparator = ';';
const _timeouts = {
'whitelistedDomains': null
};
/**
* Private Methods
* Private Functions
*/
options._getOptionElement = function (optionKey) {
return document.querySelector(`[data-option=${optionKey}]`);
const _getOptionElement = (key) => {
return document.querySelector(`[data-option=${key}]`);
};
function _normalizeDomain (domain) {
const _getOptionElements = () => {
return document.querySelectorAll('[data-option]');
};
const _renderLocaleNotice = () => {
const localeNoticeElement = document.getElementById('notice-locale');
localeNoticeElement.classList.remove('hidden');
};
const _serializeWhitelistedDomains = (whitelistedDomains) => {
const domainWhitelist = Object.keys(whitelistedDomains).join(_whitelistValueSeparator);
return domainWhitelist.replace(_whitelistTrimExpression, '');
};
domain = domain.toLowerCase().trim();
const _parseDomainWhitelist = async (domainWhitelist) => {
if (domain.startsWith(Address.WWW_PREFIX)) {
domain = domain.slice(Address.WWW_PREFIX_LENGTH);
const whitelistedDomains = {};
domainWhitelist = domainWhitelist.split(_whitelistValueSeparator);
for (const domain of domainWhitelist) {
const normalizedDomain = await Helpers.delegateAction('domain:normalize', domain);
if (normalizedDomain !== '') {
whitelistedDomains[normalizedDomain] = true;
}
}
return domain;
}
return whitelistedDomains;
};
/**
* Initializations
*/
const _onHelpTranslate = () => {
document.addEventListener('DOMContentLoaded', function () {
chrome.tabs.create({
'url': 'https://crowdin.com/project/decentraleyes'
});
};
let scriptDirection, languageSupported, optionElements;
const _setBlockMissingNoticeVisibility = (visible) => {
scriptDirection = helpers.determineScriptDirection(navigator.language);
document.body.setAttribute('dir', scriptDirection);
const blockMissingNoticeElement = document.getElementById('notice-block-missing');
languageSupported = helpers.languageIsFullySupported(navigator.language);
if (visible) {
blockMissingNoticeElement.classList.remove('hidden');
} else {
blockMissingNoticeElement.classList.add('hidden');
}
};
if (languageSupported === false) {
const _getOptionElementValue = (optionElement) => {
let localeNoticeElement = document.getElementById('notice-locale');
localeNoticeElement.setAttribute('class', 'notice');
if (optionElement.getAttribute('type') === 'checkbox') {
return optionElement.checked;
} else {
return optionElement.value;
}
};
helpers.insertI18nContentIntoDocument(document);
const _onOptionChanged = async ({target}) => {
optionElements = {
'showIconBadge': options._getOptionElement(Setting.SHOW_ICON_BADGE),
'blockMissing': options._getOptionElement(Setting.BLOCK_MISSING),
'disablePrefetch': options._getOptionElement(Setting.DISABLE_PREFETCH),
'stripMetadata': options._getOptionElement(Setting.STRIP_METADATA),
'whitelistedDomains': options._getOptionElement(Setting.WHITELISTED_DOMAINS)
};
let optionKey, optionValue;
chrome.storage.local.get(Object.keys(optionElements), function (items) {
optionKey = target.getAttribute('data-option');
optionValue = _getOptionElementValue(target);
let whitelistedDomains, domainWhitelist;
if (optionKey === 'whitelistedDomains') {
whitelistedDomains = items.whitelistedDomains;
domainWhitelist = '';
clearTimeout(_timeouts.whitelistedDomains);
Object.keys(whitelistedDomains).forEach(function (domain) {
domainWhitelist = `${domainWhitelist}${domain};`;
});
_timeouts.whitelistedDomains = await setTimeout(async () => {
Helpers.delegateAction('whitelisted-domains:update', await _parseDomainWhitelist(optionValue));
}, 100);
domainWhitelist = domainWhitelist.slice(0, -1);
domainWhitelist = domainWhitelist.replace(Whitelist.TRIM_EXPRESSION, '');
return;
}
optionElements.showIconBadge.checked = items.showIconBadge;
optionElements.blockMissing.checked = items.blockMissing;
optionElements.disablePrefetch.checked = items.disablePrefetch;
optionElements.stripMetadata.checked = items.stripMetadata;
optionElements.whitelistedDomains.value = domainWhitelist;
});
if (optionKey === 'blockMissing') {
_setBlockMissingNoticeVisibility(optionValue);
}
let optionChangedHandler = function ({target}) {
Helpers.delegateAction('setting:update', {
'key': optionKey, 'value': optionValue
});
};
let optionKey, optionType, optionValue;
const _registerOptionChangedEventListeners = (optionElements) => {
optionKey = target.getAttribute('data-option');
optionType = target.getAttribute('type');
for (const optionElement of Object.values(optionElements)) {
switch (optionType) {
case 'checkbox':
optionValue = target.checked;
break;
default:
optionValue = target.value;
if (optionElement.getAttribute('type') === 'checkbox') {
optionElement.addEventListener('change', _onOptionChanged);
} else {
optionElement.addEventListener('keyup', _onOptionChanged);
}
}
};
if (optionKey === Setting.DISABLE_PREFETCH) {
const _initializeOptionElements = (settings) => {
if (optionValue === false) {
const optionElements = _getOptionElements();
// Restore default values of related preference values.
chrome.privacy.network.networkPredictionEnabled.clear({});
for (const optionElement of optionElements) {
} else {
const optionKey = optionElement.getAttribute('data-option');
chrome.privacy.network.networkPredictionEnabled.set({
'value': false
});
}
if (optionElement.getAttribute('type') === 'checkbox') {
optionElement.checked = settings[optionKey].value;
} else if (optionKey === 'whitelistedDomains') {
optionElement.value = _serializeWhitelistedDomains(settings[optionKey].value);
}
}
_registerOptionChangedEventListeners(optionElements);
};
if (optionKey === Setting.WHITELISTED_DOMAINS) {
const _onDisableBlockMissing = () => {
let domainWhitelist = optionValue;
const blockMissingElement = _getOptionElement('blockMissing');
optionValue = {};
blockMissingElement.checked = false;
blockMissingElement.dispatchEvent(new Event('change'));
};
const _registerMiscellaneousEventListeners = () => {
let blockMissingButtonElement, helpTranslateButtonElement;
blockMissingButtonElement = document.getElementById('button-block-missing');
helpTranslateButtonElement = document.getElementById('button-help-translate');
blockMissingButtonElement.addEventListener('click', _onDisableBlockMissing);
helpTranslateButtonElement.addEventListener('click', _onHelpTranslate);
domainWhitelist.split(Whitelist.VALUE_SEPARATOR).forEach(function (domain) {
optionValue[_normalizeDomain(domain)] = true;
});
blockMissingButtonElement.addEventListener('keydown', (event) => {
if (Helpers.enterOrSpaceKeyPressed(event)) {
_onDisableBlockMissing();
}
});
chrome.storage.local.set({
[optionKey]: optionValue
});
};
helpTranslateButtonElement.addEventListener('keydown', (event) => {
optionElements.showIconBadge.addEventListener('change', optionChangedHandler);
optionElements.blockMissing.addEventListener('change', optionChangedHandler);
optionElements.disablePrefetch.addEventListener('change', optionChangedHandler);
optionElements.stripMetadata.addEventListener('change', optionChangedHandler);
optionElements.whitelistedDomains.addEventListener('keyup', optionChangedHandler);
if (Helpers.enterOrSpaceKeyPressed(event)) {
_onHelpTranslate();
}
});
};
const _renderContents = async () => {
const settings = await Helpers.delegateAction('settings:get', {'concise': false});
_registerMiscellaneousEventListeners();
_initializeOptionElements(settings);
_setBlockMissingNoticeVisibility(settings.blockMissing.value);
if (! Helpers.languageIsFullySupported()) {
_renderLocaleNotice();
}
};
const _onDocumentLoaded = async () => {
document.body.setAttribute('dir', Helpers.determineScriptDirection());
Helpers.applyI18nContentToDocument(document);
await _renderContents();
Helpers.unhideDocumentContents(document);
};
/**
* Event Handlers
*/
chrome.runtime.onMessage.addListener((message) => {
if (message.topic === 'domain:added-to-whitelist' || message.topic === 'domain:removed-from-whitelist') {
_getOptionElement('whitelistedDomains').value = _serializeWhitelistedDomains(message.value);
}
});
/**
* Initializations
*/
document.addEventListener('DOMContentLoaded', _onDocumentLoaded);
/**
* Sections
*/
* Sections
*/
body {
background-color: #f0f0f0;
......@@ -9,9 +9,9 @@ body {
font-family: 'Noto Sans', Arial, sans-serif !important;
font-size: 75%;
margin: 0 auto;
max-width: 348px;
overflow: hidden;
padding: 0;
max-width: 348px;
}
header {
......@@ -30,8 +30,8 @@ header {
border-bottom: 1px solid #d8d8d8;
}
.subpanel {
overflow: hidden;
.sub-panel {
padding-bottom: 6px;
}
footer {
......@@ -47,7 +47,7 @@ footer {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: url('../../modules/noto-sans/noto-sans.woff2')
src: url('../shared/resources/fonts/noto-sans/regular.woff2')
format('woff2');
}
......@@ -55,7 +55,7 @@ footer {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 600;
src: url('../../modules/noto-sans/noto-sans-bold.woff2')
src: url('../shared/resources/fonts/noto-sans/bold.woff2')
format('woff2');
}
......@@ -63,7 +63,7 @@ footer {
font-family: 'Noto Sans';
font-style: italic;
font-weight: 400;
src: url('../../modules/noto-sans/noto-sans-italic.woff2')
src: url('../shared/resources/fonts/noto-sans/italic.woff2')
format('woff2');
}
......@@ -95,7 +95,7 @@ footer {
.list-item {
background-color: #f7f7f7;
border: 1px solid #e4e4e4;
color: #737373;
color: #555;
font-weight: 600;
list-style: none;
margin: 0;
......@@ -106,9 +106,8 @@ footer {
align-items: center;
background-color: #ececec;
border: 1px solid #e0e0e0;
box-shadow: inset 0px 2px 10px #e2e2e2;
box-shadow: inset 0 2px 10px #e2e2e2;
list-style: none;
padding-left: 8px;
padding: 0;
}
......@@ -118,7 +117,7 @@ footer {
.sublist-item {
border-bottom: 1px solid #e0e0e0;
color: #737373;
color: #555;
font-weight: 600;
padding: 10px;
}
......@@ -135,7 +134,7 @@ footer {
margin-right: 6px;
}
.icon-logo {
.icon-symbolic {
height: 26px;
padding: 14px 6px 14px 8px;
width: 26px;
......@@ -146,7 +145,6 @@ footer {
*/
.button {
-moz-user-select: none;
background-color: #f5f5f5;
border-radius: 2px;
border: 1px solid #cfcfcf;
......@@ -154,18 +152,11 @@ footer {
cursor: pointer;
float: right;
font-size: 12px;
overflow: hidden;
padding: 5px 22px;
user-select: none;
}
.button:hover {
background-color: #fff;
}
.button:active {
background-color: #dedede;
}
.button-toggle {
border-color: #d8d8d8;
color: #bbb;
......@@ -176,22 +167,44 @@ footer {
color: #339a6f;
}
.button:hover {
background-color: #fff;
}
.button:focus {
background-color: #f9f9f9;
border: 1px solid #bbb;
box-shadow: 0 0 4px #b9b9b9;
outline: 0;
}
.button:active {
background-color: #dedede;
}
/**
* Links
*/
* Links
*/
.link-text {
color: #bdbdbd;
color: #6d6d6d;
cursor: pointer;
float: left;
font-size: 13px;
padding-left: 4px;
padding-top: 5px;
line-height: 1;
margin: 6px 0 0 2px;
padding: 1px 2px 4px;
text-decoration: none;
}
.link-text:hover {
color: #777;
color: #555;
text-decoration: underline;
}
.link-text:focus {
color: #555;
outline-color: #555;
text-decoration: underline;
}
......@@ -200,14 +213,15 @@ footer {
*/
.badge {
background-color: #6bb798;
background: #fbfbfb;
border-radius: 10px;
color: #fff;
border: 2px solid #7db69f;
color: #4a7767;
font-family: monospace;
font-size: 13px;
font-weight: 600;
margin-right: 8px;
padding: 3px 15px;
margin-right: 7px;
padding: 0 13px;
}
.counter {
......@@ -218,23 +232,25 @@ footer {
}
.description {
color: #777;
color: #6d6d6d;
font-style: italic;
margin: 0 6px;
text-align: center;
}
.hidden {
display: none;
max-height: 0 !important;
padding: 0 !important;
visibility: hidden !important;
}
.label-version {
color: #6aac91;
color: #457763;
font-size: 9px;
}
.label-domain {
color: #bbb;
color: #6d6d6d;
display: flex;
font-style: italic;
overflow: hidden;
......@@ -243,7 +259,140 @@ footer {
}
.side-note {
color: #a5a5a5;
color: #646464;
font-style: italic;
font-weight: 400;
}
/**
* Compatibility
*/
@media screen and (-webkit-min-device-pixel-ratio: 0) {
body {
width: 348px;
}
}
@media (prefers-color-scheme: dark) {
/**
* Sections
*/
body {
background-color: #404040;
color: #f9f9fa;
}
header {
border-bottom-color: #292929;
}
/**
* Lists
*/
.list-item {
background-color: #484848;
border-color: #292929;
color: #f0f0f0;
}
.sublist {
background-color: #323232;
border-color: #292929;
box-shadow: inset 0 2px 10px #292929;
}
.sublist:last-child {
border-bottom-color: #292929;
}
.sublist-item {
border-bottom-color: #2c2c2c;
color: #f0f0f0;
}
/**
* Buttons
*/
.button {
background-color: #3c3c3c;
border-color: #292929;
color: #dadada;
}
.button:hover {
background-color: #434343;
}
.button:focus {
background-color: #434343;
border-color: #292929;
box-shadow: 0 0 4px #323232;
}
.button:active {
background-color: #393939;
}
.button-toggle {
border-color: #363636;
color: #636363;
}
.button-toggle.active {
border-color: #292929;
color: #3dbb87;
}
/**
* Links
*/
.link-text {
color: #dadada;
}
.link-text:hover {
color: #f9f9fa;
}
.link-text:focus {
color: #f9f9fa;
outline-color: #dadada;
}
/**
* Miscellaneous
*/
.badge {
background-color: #323232;
border-color: #4a826c;
color: #f9f9fa;
}
.description {
color: #dadada;
}
.label-version {
color: #93d7bc;
}
.label-domain {
color: #dadada;
}
.panel:not(:last-child) {
border-bottom-color: #292929;
}
.side-note {
color: #dadada;
}
}
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<title>Decentraleyes Popup</title>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8">
<link rel="shortcut icon" href="../shared/resources/images/icons/extension/favicon.ico" type="image/x-icon">
<link rel="icon" href="../shared/resources/images/icons/extension/favicon.ico" type="image/x-icon">
<link rel="stylesheet" type="text/css" href="popup.css">
<script defer src="../../modules/fontawesome/icon-bundle.min.js"></script>
<script defer src="../../modules/fontawesome/fontawesome.min.js"></script>
<script defer type="module" src="../shared/resources/images/icons/default.js"></script>
<script defer src="../shared/resources/scripts/fontawesome.min.js"></script>
</head>
<body>
<script src="../../core/constants.js"></script>
<script src="../../modules/internal/helpers.js"></script>
<script type="module" src="popup.js"></script>
<script src="popup.js"></script>
<div id="wrapper" class="hidden">
<header>
<header>
<img class="icon-logo" src="icon.svg" alt="Extension Icon">
<div class="heading">Decentraleyes <sup id="version-label" class="label-version"></sup></div>
<img class="icon-symbolic" src="../shared/resources/images/icons/extension/symbolic.svg" alt="Symbolic Icon">
<div class="heading">Decentraleyes <sup id="version-label" class="label-version"></sup></div>
</header>
</header>
<section class="content">
<section class="content">
<div id="website-context" class="panel hidden">
<div id="website-context" class="panel hidden">
<div class="subpanel">
<div class="sub-panel">
<div id="protection-toggle-button" class="button button-toggle active">
<i class="fai fa-power-off" data-fa-transform="grow-2 down-.5"></i>
</div>
<div id="protection-toggle-button" class="button button-toggle active" tabindex="0">
<i class="fa fa-power-off" data-fa-transform="grow-2 down-.5"></i>
</div>
<div class="label-domain">
<i class="icon fa fa-globe fa-lg" data-fa-transform="down-1"></i>
<span id="domain-indicator"></span>
</div>
<div class="label-domain">
<i class="icon fai fa-globe fa-lg" data-fa-transform="down-1"></i>
<span id="domain-indicator"></span>
</div>
</div>
</div>
<div id="extension-context" class="panel">
<div id="extension-context" class="panel">
<div id="injection-counter" class="counter">0</div>
<div id="injection-counter" class="counter">0</div>
<div class="subheading" data-i18n-content="amountInjectedTitle"></div>
<div class="description" data-i18n-content="amountInjectedDescription"></div>
<div class="subheading" data-i18n-content="amountInjectedTitle"></div>
<div class="description" data-i18n-content="amountInjectedDescription"></div>
</div>
</div>
</section>
</section>
<footer>
<footer>
<span id="testing-utility-link" class="link-text" tabindex="0">decentraleyes.org/test</span>
<span id="testing-utility-link" class="link-text">decentraleyes.org/test</span>
<div id="options-button" class="button" data-i18n-title="optionsTitle" tabindex="0">
<i class="fa fa-cog" data-fa-transform="grow-2 down-.5"></i>
</div>
<div id="options-button" class="button" data-i18n-title="optionsTitle">
<i class="fai fa-cog" data-fa-transform="grow-2 down-.5"></i>
</div>
</footer>
</footer>
</div>
</body>
......
/**
* Main Popup Page
* Popup Page
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
......@@ -11,242 +11,331 @@
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
'use strict';
import Helpers from '../shared/code/helpers.js';
/**
* Popup
* Private Functions
*/
var popup = {};
const _groupResourceInjections = (injections) => {
/**
* Initializations
*/
return Object.values(injections).reduce((accumulator, injection) => {
document.addEventListener('DOMContentLoaded', function () {
accumulator[injection.source] = accumulator[injection.source] ?? [];
accumulator[injection.source].push(injection);
let version, optionsButtonElement, scriptDirection;
return accumulator;
version = helpers.formatVersion(chrome.runtime.getManifest().version);
document.getElementById('version-label').innerText = version;
scriptDirection = helpers.determineScriptDirection(navigator.language);
optionsButtonElement = document.getElementById('options-button');
}, {});
};
helpers.insertI18nContentIntoDocument(document);
helpers.insertI18nTitlesIntoDocument(document);
const _createInjectionGroupHeaderElement = (source, injections) => {
chrome.storage.local.get('amountInjected', function (items) {
let injectionGroupHeaderElement, badgeElement, badgeTextNode, cdnNameTextNode;
let amountInjected = items.amountInjected || 0;
document.getElementById('injection-counter').innerText = amountInjected;
injectionGroupHeaderElement = document.createElement('li');
injectionGroupHeaderElement.setAttribute('class', 'list-item');
chrome.tabs.query({'active': true, 'currentWindow': true}, function (tabs) {
badgeElement = document.createElement('span');
badgeElement.setAttribute('class', 'badge');
chrome.runtime.getBackgroundPage(function (backgroundPage) {
badgeTextNode = document.createTextNode(injections.length);
badgeElement.appendChild(badgeTextNode);
if (backgroundPage === null) {
return;
}
cdnNameTextNode = document.createTextNode(Helpers.determineCdnName(source));
popup.backgroundPage = backgroundPage;
injectionGroupHeaderElement.appendChild(badgeElement);
injectionGroupHeaderElement.appendChild(cdnNameTextNode);
if (backgroundPage.main.operatingSystem === chrome.runtime.PlatformOs.ANDROID) {
return injectionGroupHeaderElement;
};
browser.tabs.getCurrent().then(function (tab) {
const _createInjectionElement = (injection) => {
browser.tabs.update(tab.id, {
'active': true
});
});
}
let injectionElement, filename, name, nameTextNode, noteElement, noteTextNode;
let injections, injectionOverview, domain;
injectionElement = document.createElement('li');
injectionElement.setAttribute('class', 'sublist-item');
injections = backgroundPage.stateManager.tabs[tabs[0].id].injections;
injectionOverview = {};
filename = Helpers.extractFilenameFromPath(injection.path);
name = Helpers.determineResourceName(filename);
domain = helpers.extractDomainFromUrl(tabs[0].url);
nameTextNode = document.createTextNode(`- ${name}`);
injectionElement.appendChild(nameTextNode);
if (domain !== null) {
noteElement = document.createElement('span');
noteElement.setAttribute('class', 'side-note');
let websiteContextElement, protectionToggleElement, domainIndicatorElement;
noteTextNode = document.createTextNode(` v${injection.version}`);
websiteContextElement = document.getElementById('website-context');
protectionToggleElement = document.getElementById('protection-toggle-button');
domainIndicatorElement = document.getElementById('domain-indicator');
noteElement.appendChild(noteTextNode);
injectionElement.appendChild(noteElement);
if (domain.startsWith(Address.WWW_PREFIX)) {
domain = domain.slice(Address.WWW_PREFIX_LENGTH);
}
return injectionElement;
};
domainIndicatorElement.innerText = domain;
const _createInjectionGroupElement = (source, injections) => {
if (backgroundPage.requestAnalyzer.whitelistedDomains[domain]) {
let injectionGroupElement;
protectionToggleElement.setAttribute('class', 'button button-toggle');
injectionGroupElement = document.createElement('ul');
injectionGroupElement.setAttribute('class', 'sublist');
let enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle');
protectionToggleElement.setAttribute('title', enableProtectionTitle);
for (const injection of injections) {
protectionToggleElement.addEventListener('click', function () {
const injectionElement = _createInjectionElement(injection);
injectionGroupElement.appendChild(injectionElement);
}
backgroundPage.stateManager.deleteDomainFromWhitelist(domain).then(function () {
return injectionGroupElement;
};
chrome.tabs.reload(tabs[0].id);
const _createInjectionOverviewElement = (groupedInjections) => {
if (backgroundPage.main.operatingSystem === chrome.runtime.PlatformOs.ANDROID) {
const injectionOverviewElement = document.createElement('ul');
injectionOverviewElement.setAttribute('class', 'list');
return browser.tabs.getCurrent().then(function (tab) {
browser.tabs.remove(tab.id);
});
}
for (const [source, injections] of Object.entries(groupedInjections)) {
return window.close();
});
});
let injectionGroupHeaderElement, injectionGroupElement;
} else {
injectionGroupHeaderElement = _createInjectionGroupHeaderElement(source, injections);
injectionGroupElement = _createInjectionGroupElement(source, injections);
protectionToggleElement.setAttribute('class', 'button button-toggle active');
injectionOverviewElement.appendChild(injectionGroupHeaderElement);
injectionOverviewElement.appendChild(injectionGroupElement);
}
let disableProtectionTitle = chrome.i18n.getMessage('disableProtectionTitle');
return injectionOverviewElement;
};
protectionToggleElement.setAttribute('title', disableProtectionTitle);
protectionToggleElement.setAttribute('dir', scriptDirection);
const _renderInjectionPanel = (groupedInjections) => {
protectionToggleElement.addEventListener('click', function () {
let websiteContextElement, injectionOverviewElement;
backgroundPage.stateManager.addDomainToWhitelist(domain).then(function () {
websiteContextElement = document.getElementById('website-context');
injectionOverviewElement = _createInjectionOverviewElement(groupedInjections);
chrome.tabs.reload(tabs[0].id);
websiteContextElement.append(injectionOverviewElement);
};
if (backgroundPage.main.operatingSystem === chrome.runtime.PlatformOs.ANDROID) {
const _close = async () => {
return browser.tabs.getCurrent().then(function (tab) {
browser.tabs.remove(tab.id);
});
}
const platform = await chrome.runtime.getPlatformInfo();
return window.close();
});
});
}
if (platform.os === chrome.runtime.PlatformOs.ANDROID) {
websiteContextElement.setAttribute('class', 'panel');
}
const activeTab = await chrome.tabs.getCurrent();
for (let injection in injections) {
if (activeTab) {
chrome.tabs.remove(activeTab.id);
} else {
window.close();
}
injection = injections[injection];
} else {
window.close();
}
};
let injectionSource = injection.source;
injectionOverview[injectionSource] = injectionOverview[injectionSource] || [];
/**
* Event Handlers
*/
injectionOverview[injectionSource].push({
'path': injection.path,
'version': injection.version,
'source': injection.source
});
}
const _onTestingUtilityLinkClicked = (event) => {
let listElement = document.createElement('ul');
listElement.setAttribute('class', 'list');
if (event.button === 0 || event.button === 1) {
for (let injectionSource in injectionOverview) {
chrome.tabs.create({
'url': 'https://decentraleyes.org/test',
'active': (event.button === 0)
});
}
let cdn, listItemElement, badgeElement, badgeTextNode, cdnName, cdnNameTextNode, subListElement;
if (event.button === 0) {
window.close();
}
};
cdn = injectionOverview[injectionSource];
const _onOptionsButtonClicked = async () => {
listItemElement = document.createElement('li');
listItemElement.setAttribute('class', 'list-item');
const platform = await chrome.runtime.getPlatformInfo();
badgeElement = document.createElement('span');
badgeElement.setAttribute('class', 'badge');
if (platform.os === chrome.runtime.PlatformOs.ANDROID) {
badgeTextNode = document.createTextNode(cdn.length);
badgeElement.appendChild(badgeTextNode);
chrome.tabs.create({
'url': chrome.runtime.getURL('pages/options/options.html'),
'active': true
});
cdnName = helpers.determineCdnName(injectionSource);
return window.close();
cdnNameTextNode = document.createTextNode(cdnName);
} else {
listItemElement.appendChild(badgeElement);
listItemElement.appendChild(cdnNameTextNode);
chrome.runtime.openOptionsPage();
return window.close();
}
};
listElement.appendChild(listItemElement);
const _renderNonContextualContents = async () => {
subListElement = document.createElement('ul');
subListElement.setAttribute('class', 'sublist');
let versionLabelElement, counterElement, testingUtilityLinkElement, optionsButtonElement, amountInjected;
listElement.appendChild(subListElement);
versionLabelElement = document.getElementById('version-label');
counterElement = document.getElementById('injection-counter');
testingUtilityLinkElement = document.getElementById('testing-utility-link');
optionsButtonElement = document.getElementById('options-button');
for (let injection of cdn) {
versionLabelElement.innerText = Helpers.determineVersion();
let subListItemElement, resourcePathDetails, resourceFilename, resourceName,
resourceNameTextNode, sideNoteElement, sideNoteTextNode;
amountInjected = await Helpers.delegateAction('statistics:get-amount-injected');
counterElement.innerText = Helpers.formatNumber(amountInjected.value);
subListItemElement = document.createElement('li');
subListItemElement.setAttribute('class', 'sublist-item');
testingUtilityLinkElement.addEventListener('mouseup', _onTestingUtilityLinkClicked);
optionsButtonElement.addEventListener('mouseup', _onOptionsButtonClicked);
resourcePathDetails = injection.path.split('/');
resourceFilename = resourcePathDetails[resourcePathDetails.length - 1];
testingUtilityLinkElement.addEventListener('keydown', (event) => {
resourceName = helpers.determineResourceName(resourceFilename);
const enterOrSpaceKeyPressed = Helpers.enterOrSpaceKeyPressed(event);
resourceNameTextNode = document.createTextNode(`- ${resourceName}`);
subListItemElement.appendChild(resourceNameTextNode);
if (enterOrSpaceKeyPressed) {
sideNoteElement = document.createElement('span');
sideNoteElement.setAttribute('class', 'side-note');
chrome.tabs.create({
'url': 'https://decentraleyes.org/test'
});
sideNoteTextNode = document.createTextNode(` v${injection.version}`);
window.close();
}
});
sideNoteElement.appendChild(sideNoteTextNode);
subListItemElement.appendChild(sideNoteElement);
optionsButtonElement.addEventListener('keydown', (event) => {
subListElement.appendChild(subListItemElement);
}
}
const enterOrSpaceKeyPressed = Helpers.enterOrSpaceKeyPressed(event);
if (Object.keys(injectionOverview).length > 0) {
if (enterOrSpaceKeyPressed) {
let websiteContextElement = document.getElementById('website-context');
websiteContextElement.append(listElement);
}
});
});
chrome.runtime.openOptionsPage();
return window.close();
}
});
};
const _onProtectionToggled = async () => {
let bypassCache, activeTab;
bypassCache = (typeof browser === 'undefined');
activeTab = await Helpers.determineActiveTab();
chrome.tabs.reload(activeTab.id, {bypassCache});
_close();
};
const _enableProtection = async () => {
let activeTab, tabDomain;
activeTab = await Helpers.determineActiveTab();
tabDomain = await Helpers.delegateAction('domain:extract-from-url', activeTab.url);
await Helpers.delegateAction('domain:remove-from-whitelist', tabDomain);
_onProtectionToggled();
};
const _disableProtection = async () => {
let activeTab, tabDomain;
activeTab = await Helpers.determineActiveTab();
tabDomain = await Helpers.delegateAction('domain:extract-from-url', activeTab.url);
await Helpers.delegateAction('domain:add-to-whitelist', tabDomain);
_onProtectionToggled();
};
const _renderDomainWhitelistPanel = async (domain) => {
chrome.runtime.getPlatformInfo(function (information) {
let websiteContextElement, protectionToggleElement, domainIndicatorElement, domainIsWhitelisted;
optionsButtonElement.addEventListener('mouseup', function () {
websiteContextElement = document.getElementById('website-context');
protectionToggleElement = document.getElementById('protection-toggle-button');
domainIndicatorElement = document.getElementById('domain-indicator');
if (information.os === chrome.runtime.PlatformOs.ANDROID) {
protectionToggleElement.setAttribute('dir', Helpers.determineScriptDirection());
domainIndicatorElement.innerText = domain;
return chrome.tabs.create({
'url': chrome.extension.getURL('pages/options/options.html')
});
domainIsWhitelisted = await Helpers.delegateAction('domain:is-whitelisted', domain);
if (domainIsWhitelisted === true) {
const enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle');
protectionToggleElement.setAttribute('class', 'button button-toggle');
protectionToggleElement.addEventListener('click', _enableProtection);
protectionToggleElement.setAttribute('title', enableProtectionTitle);
protectionToggleElement.addEventListener('keydown', (event) => {
const enterOrSpaceKeyPressed = Helpers.enterOrSpaceKeyPressed(event);
if (enterOrSpaceKeyPressed) {
_enableProtection();
}
});
chrome.runtime.openOptionsPage();
return window.close();
} else {
const disableProtectionTitle = chrome.i18n.getMessage('disableProtectionTitle');
protectionToggleElement.setAttribute('class', 'button button-toggle active');
protectionToggleElement.addEventListener('click', _disableProtection);
protectionToggleElement.setAttribute('title', disableProtectionTitle);
protectionToggleElement.addEventListener('keydown', (event) => {
const enterOrSpaceKeyPressed = Helpers.enterOrSpaceKeyPressed(event);
if (enterOrSpaceKeyPressed) {
_disableProtection();
}
});
});
}
document.getElementById('testing-utility-link').addEventListener('mouseup', function (event) {
websiteContextElement.classList.remove('hidden');
};
if (event.button === 0 || event.button === 1) {
const _renderContextualContents = async () => {
chrome.tabs.create({
'url': 'https://decentraleyes.org/test',
'active': (event.button === 0)
});
}
let activeTab, tabDomain, tabContext, groupedInjections;
if (event.button === 0) {
window.close();
}
});
});
activeTab = await Helpers.determineActiveTab();
tabDomain = await Helpers.delegateAction('domain:extract-from-url', activeTab.url);
if (tabDomain !== null) {
await _renderDomainWhitelistPanel(tabDomain);
}
tabContext = await Helpers.delegateAction('tab-context:get', activeTab.id);
groupedInjections = _groupResourceInjections(tabContext.injections);
if (Object.keys(groupedInjections).length > 0) {
_renderInjectionPanel(groupedInjections);
}
};
const _onDocumentLoaded = async () => {
Helpers.applyI18nContentToDocument(document);
Helpers.applyI18nTitlesToDocument(document);
await _renderNonContextualContents();
await _renderContextualContents();
Helpers.unhideDocumentContents(document);
};
/**
* Initializations
*/
document.addEventListener('DOMContentLoaded', _onDocumentLoaded);
/**
* Internal Helper Module
* Page Helpers
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2017-10-26
* @license MPL 2.0
* @since 2024-10-10
* @license MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
'use strict';
/**
* Helpers
* Public Functions
*/
var helpers = {};
const awaitInitialization = () => {
/**
* Public Methods
*/
return new Promise((resolve, reject) => {
helpers.insertI18nContentIntoDocument = function (document) {
let request, intervalIdentifier, timeoutIdentifier;
let scriptDirection, i18nElements;
request = {'topic': 'extension:is-initialized'};
scriptDirection = helpers.determineScriptDirection(navigator.language);
i18nElements = document.querySelectorAll('[data-i18n-content]');
intervalIdentifier = setInterval(() => {
i18nElements.forEach(function (i18nElement) {
chrome.runtime.sendMessage(request, (response) => {
let i18nMessageName = i18nElement.getAttribute('data-i18n-content');
if (response?.value === true) {
i18nElement.innerText = chrome.i18n.getMessage(i18nMessageName);
i18nElement.setAttribute('dir', scriptDirection);
clearInterval(intervalIdentifier);
clearTimeout(timeoutIdentifier);
resolve();
}
});
}, 100);
timeoutIdentifier = setTimeout(() => {
clearInterval(intervalIdentifier);
reject(new Error('The extension failed to initialize.'));
}, 10000);
});
};
helpers.insertI18nTitlesIntoDocument = function (document) {
const delegateAction = (identifier, payload, persist = true) => {
let scriptDirection, i18nElements;
return new Promise((resolve, reject) => {
scriptDirection = helpers.determineScriptDirection(navigator.language);
i18nElements = document.querySelectorAll('[data-i18n-title]');
const request = {'topic': identifier, 'value': payload};
i18nElements.forEach(function (i18nElement) {
chrome.runtime.sendMessage(request, (response) => {
let i18nMessageName = i18nElement.getAttribute('data-i18n-title');
if (response) {
resolve(response.value);
} else {
i18nElement.setAttribute('title', chrome.i18n.getMessage(i18nMessageName));
i18nElement.setAttribute('dir', scriptDirection);
if (persist === true) {
awaitInitialization().then(() => {
delegateAction(identifier, payload, false).then(resolve).catch(reject);
}).catch(reject);
} else {
reject(new Error(`Action "${identifier}" failed to complete.`));
}
}
});
});
};
helpers.languageIsFullySupported = function (language) {
const determineActiveTab = async () => {
let languageSupported, supportedLanguages;
let queryParameters, tabs;
languageSupported = false;
queryParameters = {'active': true, 'currentWindow': true};
tabs = await chrome.tabs.query(queryParameters);
if (tabs[0]) {
return tabs[0];
}
queryParameters = {'active': true};
tabs = await chrome.tabs.query(queryParameters);
return tabs[0];
};
const determineScriptDirection = (language) => {
let rightToLeftLanguages, scriptDirection;
rightToLeftLanguages = ['ar', 'he'];
language ??= navigator.language;
if (rightToLeftLanguages.indexOf(language) === -1) {
scriptDirection = 'ltr';
} else {
scriptDirection = 'rtl';
}
return scriptDirection;
};
const languageIsFullySupported = (language) => {
let supportedLanguages, languageSupported;
supportedLanguages = [
'ar', 'bg', 'zh', 'da', 'nl', 'en', 'et', 'fi', 'fr', 'de', 'el', 'is',
'id', 'it', 'ja', 'ko', 'pl', 'pt', 'ro', 'ru', 'es', 'sv', 'tr'
'ar', 'bg', 'bn', 'cs', 'da', 'de', 'el', 'en', 'eo', 'es', 'et',
'fi', 'fr', 'he', 'hr', 'hu', 'id', 'is', 'it', 'ja', 'ko', 'nb',
'nl', 'pl', 'pt', 'ro', 'ru', 'si', 'sq', 'sv', 'tr', 'uk', 'zh'
];
for (let supportedLanguage of supportedLanguages) {
language ??= navigator.language;
languageSupported = false;
for (const supportedLanguage of supportedLanguages) {
if (language.search(supportedLanguage) !== -1) {
languageSupported = true;
......@@ -76,122 +129,142 @@ helpers.languageIsFullySupported = function (language) {
return languageSupported;
};
helpers.normalizeDomain = function (domain) {
const applyI18nContentToDocument = (document) => {
domain = domain.toLowerCase().trim();
let i18nElements, scriptDirection;
if (domain.startsWith(Address.WWW_PREFIX)) {
domain = domain.slice(Address.WWW_PREFIX.length);
}
i18nElements = document.querySelectorAll('[data-i18n-content]');
scriptDirection = determineScriptDirection();
i18nElements.forEach((i18nElement) => {
const i18nMessageName = i18nElement.getAttribute('data-i18n-content');
return domain;
i18nElement.innerText = chrome.i18n.getMessage(i18nMessageName);
i18nElement.setAttribute('dir', scriptDirection);
});
};
helpers.extractDomainFromUrl = function (url, normalize) {
const applyI18nTitlesToDocument = (document) => {
let extractedDomain;
let i18nElements, scriptDirection;
try {
extractedDomain = new URL(url).host;
} catch (exception) {
extractedDomain = null;
}
i18nElements = document.querySelectorAll('[data-i18n-title]');
scriptDirection = determineScriptDirection();
if (extractedDomain === '') {
extractedDomain = null;
}
i18nElements.forEach((i18nElement) => {
if (extractedDomain !== null && normalize === true) {
extractedDomain = helpers.normalizeDomain(extractedDomain);
}
const i18nMessageName = i18nElement.getAttribute('data-i18n-title');
return extractedDomain;
i18nElement.setAttribute('title', chrome.i18n.getMessage(i18nMessageName));
i18nElement.setAttribute('dir', scriptDirection);
});
};
helpers.determineCdnName = function (domainName) {
const unhideDocumentContents = (document) => {
document.getElementById('wrapper').classList.remove('hidden');
};
switch (domainName) {
const extractFilenameFromPath = (path) => {
case 'ajax.googleapis.com':
return 'Google Hosted Libraries';
case 'ajax.aspnetcdn.com':
return 'Microsoft Ajax CDN';
case 'ajax.microsoft.com':
return 'Microsoft Ajax CDN [Deprecated]';
case 'cdnjs.cloudflare.com':
return 'CDNJS (Cloudflare)';
case 'code.jquery.com':
return 'jQuery CDN (MaxCDN)';
case 'cdn.jsdelivr.net':
return 'jsDelivr (MaxCDN)';
case 'yastatic.net':
return 'Yandex CDN';
case 'yandex.st':
return 'Yandex CDN [Deprecated]';
case 'libs.baidu.com':
return 'Baidu CDN';
case 'lib.sinaapp.com':
return 'Sina Public Resources';
case 'upcdn.b0.upaiyun.com':
return 'UpYun Library';
default:
return 'Unknown';
let pathSegments, filename;
pathSegments = path.split('/');
filename = pathSegments[pathSegments.length - 1];
return filename;
};
const enterOrSpaceKeyPressed = (event) => {
if (! event.isComposing && event.keyCode !== 229) {
return event.keyCode === 13 || event.keyCode === 32;
}
return false;
};
helpers.determineResourceName = function (filename) {
const determineResourceName = (filename) => {
switch (filename) {
case 'angular.min.js.dec':
case 'angular.min.jsm':
return 'AngularJS';
case 'backbone-min.js.dec':
case 'backbone-min.jsm':
return 'Backbone.js';
case 'dojo.js.dec':
case 'dojo.jsm':
return 'Dojo';
case 'ember.min.js.dec':
case 'ember.min.jsm':
return 'Ember.js';
case 'ext-core.js.dec':
case 'ext-core.jsm':
return 'Ext Core';
case 'jquery.min.js.dec':
case 'jquery.min.jsm':
return 'jQuery';
case 'jquery-ui.min.js.dec':
case 'jquery-ui.min.jsm':
return 'jQuery UI';
case 'modernizr.min.js.dec':
case 'modernizr.min.jsm':
return 'Modernizr';
case 'mootools-yui-compressed.js.dec':
case 'mootools-yui-compressed.jsm':
return 'MooTools';
case 'prototype.js.dec':
case 'prototype.jsm':
return 'Prototype';
case 'scriptaculous.js.dec':
case 'scriptaculous.jsm':
return 'Scriptaculous';
case 'swfobject.js.dec':
case 'swfobject.jsm':
return 'SWFObject';
case 'underscore-min.js.dec':
case 'underscore-min.jsm':
return 'Underscore.js';
case 'webfont.js.dec':
case 'webfont.jsm':
return 'Web Font Loader';
default:
return 'Unknown';
}
};
helpers.determineScriptDirection = function (language) {
let rightToLeftLanguages, scriptDirection;
const determineCdnName = (domainName) => {
rightToLeftLanguages = ['ar', 'he'];
switch (domainName) {
if (rightToLeftLanguages.indexOf(language) === -1) {
scriptDirection = 'ltr';
} else {
scriptDirection = 'rtl';
case 'ajax.googleapis.com':
return 'Google Hosted Libraries';
case 'ajax.aspnetcdn.com':
return 'Microsoft Ajax CDN';
case 'ajax.microsoft.com':
return 'Microsoft Ajax CDN [Deprecated]';
case 'cdnjs.cloudflare.com':
return 'CDNJS (Cloudflare)';
case 'code.jquery.com':
return 'jQuery CDN (Fastly)';
case 'cdn.jsdelivr.net':
return 'jsDelivr (Cloudflare, Fastly)';
case 'yastatic.net':
return 'Yandex CDN';
case 'yandex.st':
return 'Yandex CDN [Deprecated]';
case 'apps.bdimg.com':
return 'Baidu CDN';
case 'libs.baidu.com':
return 'Baidu CDN [Deprecated]';
case 'lib.sinaapp.com':
return 'Sina Public Resources';
case 'upcdn.b0.upaiyun.com':
return 'UpYun Library';
case 'mat1.gtimg.com':
return 'Tencent Cloud CDN';
case 'cdn.bootcss.com':
return 'BootCDN [Dissolved]';
case 'sdn.geekzu.org':
return 'Geekzu Public Service [Mirror]';
case 'ajax.proxy.ustclug.org':
return 'USTC Linux User Group [Mirror]';
default:
return 'Unknown';
}
return scriptDirection;
};
helpers.formatVersion = function (version) {
const determineVersion = () => {
const version = chrome.runtime.getManifest().version;
if (version.indexOf('beta') === -1) {
return version;
......@@ -199,3 +272,31 @@ helpers.formatVersion = function (version) {
return 'BETA';
}
};
const formatNumber = (number) => {
if (typeof number === 'number') {
return number.toLocaleString();
}
};
/**
* Exports
*/
export default {
awaitInitialization,
delegateAction,
determineActiveTab,
determineScriptDirection,
languageIsFullySupported,
applyI18nContentToDocument,
applyI18nTitlesToDocument,
unhideDocumentContents,
extractFilenameFromPath,
enterOrSpaceKeyPressed,
determineResourceName,
determineCdnName,
determineVersion,
formatNumber
};
/**
* Default Icons
*
* @author Icons: Font Awesome
* @since 2019-05-17 (originally "icons")
* @license Icons: CC BY 4.0
*/
/**
* Private Constants
*/
const _icons = {
'battery-three-quarters': [640, 512, [], 'f241', 'M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-144 96H96v128h320V192z'],
'cog': [512, 512, [], 'f013', 'M444.788 291.1l42.616 24.599c4.867 2.809 7.126 8.618 5.459 13.985-11.07 35.642-29.97 67.842-54.689 94.586a12.016 12.016 0 0 1-14.832 2.254l-42.584-24.595a191.577 191.577 0 0 1-60.759 35.13v49.182a12.01 12.01 0 0 1-9.377 11.718c-34.956 7.85-72.499 8.256-109.219.007-5.49-1.233-9.403-6.096-9.403-11.723v-49.184a191.555 191.555 0 0 1-60.759-35.13l-42.584 24.595a12.016 12.016 0 0 1-14.832-2.254c-24.718-26.744-43.619-58.944-54.689-94.586-1.667-5.366.592-11.175 5.459-13.985L67.212 291.1a193.48 193.48 0 0 1 0-70.199l-42.616-24.599c-4.867-2.809-7.126-8.618-5.459-13.985 11.07-35.642 29.97-67.842 54.689-94.586a12.016 12.016 0 0 1 14.832-2.254l42.584 24.595a191.577 191.577 0 0 1 60.759-35.13V25.759a12.01 12.01 0 0 1 9.377-11.718c34.956-7.85 72.499-8.256 109.219-.007 5.49 1.233 9.403 6.096 9.403 11.723v49.184a191.555 191.555 0 0 1 60.759 35.13l42.584-24.595a12.016 12.016 0 0 1 14.832 2.254c24.718 26.744 43.619 58.944 54.689 94.586 1.667 5.366-.592 11.175-5.459 13.985L444.788 220.9a193.485 193.485 0 0 1 0 70.2zM336 256c0-44.112-35.888-80-80-80s-80 35.888-80 80 35.888 80 80 80 80-35.888 80-80z'],
'cube': [512, 512, [], 'f1b2', 'M239.1 6.3l-208 78c-18.7 7-31.1 25-31.1 45v225.1c0 18.2 10.3 34.8 26.5 42.9l208 104c13.5 6.8 29.4 6.8 42.9 0l208-104c16.3-8.1 26.5-24.8 26.5-42.9V129.3c0-20-12.4-37.9-31.1-44.9l-208-78C262 2.2 250 2.2 239.1 6.3zM256 68.4l192 72v1.1l-192 78-192-78v-1.1l192-72zm32 356V275.5l160-65v133.9l-160 80z'],
'donate': [512, 512, [], 'f4b9', 'M256 416c114.9 0 208-93.1 208-208S370.9 0 256 0 48 93.1 48 208s93.1 208 208 208zM233.8 97.4V80.6c0-9.2 7.4-16.6 16.6-16.6h11.1c9.2 0 16.6 7.4 16.6 16.6v17c15.5.8 30.5 6.1 43 15.4 5.6 4.1 6.2 12.3 1.2 17.1L306 145.6c-3.8 3.7-9.5 3.8-14 1-5.4-3.4-11.4-5.1-17.8-5.1h-38.9c-9 0-16.3 8.2-16.3 18.3 0 8.2 5 15.5 12.1 17.6l62.3 18.7c25.7 7.7 43.7 32.4 43.7 60.1 0 34-26.4 61.5-59.1 62.4v16.8c0 9.2-7.4 16.6-16.6 16.6h-11.1c-9.2 0-16.6-7.4-16.6-16.6v-17c-15.5-.8-30.5-6.1-43-15.4-5.6-4.1-6.2-12.3-1.2-17.1l16.3-15.5c3.8-3.7 9.5-3.8 14-1 5.4 3.4 11.4 5.1 17.8 5.1h38.9c9 0 16.3-8.2 16.3-18.3 0-8.2-5-15.5-12.1-17.6l-62.3-18.7c-25.7-7.7-43.7-32.4-43.7-60.1.1-34 26.4-61.5 59.1-62.4zM480 352h-32.5c-19.6 26-44.6 47.7-73 64h63.8c5.3 0 9.6 3.6 9.6 8v16c0 4.4-4.3 8-9.6 8H73.6c-5.3 0-9.6-3.6-9.6-8v-16c0-4.4 4.3-8 9.6-8h63.8c-28.4-16.3-53.3-38-73-64H32c-17.7 0-32 14.3-32 32v96c0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32v-96c0-17.7-14.3-32-32-32z'],
'exclamation-triangle': [576, 512, [], 'f071', 'M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z'],
'gitlab': [512, 512, [], 'f296', 'M29.782 199.732L256 493.714 8.074 309.699c-6.856-5.142-9.712-13.996-7.141-21.993l28.849-87.974zm75.405-174.806c-3.142-8.854-15.709-8.854-18.851 0L29.782 199.732h131.961L105.187 24.926zm56.556 174.806L256 493.714l94.257-293.982H161.743zm349.324 87.974l-28.849-87.974L256 493.714l247.926-184.015c6.855-5.142 9.711-13.996 7.141-21.993zm-85.404-262.78c-3.142-8.854-15.709-8.854-18.851 0l-56.555 174.806h131.961L425.663 24.926z'],
'globe': [512, 512, [], 'f0ac', 'M364.215 192h131.43c5.439 20.419 8.354 41.868 8.354 64s-2.915 43.581-8.354 64h-131.43c5.154-43.049 4.939-86.746 0-128zM185.214 352c10.678 53.68 33.173 112.514 70.125 151.992.221.001.44.008.661.008s.44-.008.661-.008c37.012-39.543 59.467-98.414 70.125-151.992H185.214zm174.13-192h125.385C452.802 84.024 384.128 27.305 300.95 12.075c30.238 43.12 48.821 96.332 58.394 147.925zm-27.35 32H180.006c-5.339 41.914-5.345 86.037 0 128h151.989c5.339-41.915 5.345-86.037-.001-128zM152.656 352H27.271c31.926 75.976 100.6 132.695 183.778 147.925-30.246-43.136-48.823-96.35-58.393-147.925zm206.688 0c-9.575 51.605-28.163 104.814-58.394 147.925 83.178-15.23 151.852-71.949 183.778-147.925H359.344zm-32.558-192c-10.678-53.68-33.174-112.514-70.125-151.992-.221 0-.44-.008-.661-.008s-.44.008-.661.008C218.327 47.551 195.872 106.422 185.214 160h141.572zM16.355 192C10.915 212.419 8 233.868 8 256s2.915 43.581 8.355 64h131.43c-4.939-41.254-5.154-84.951 0-128H16.355zm136.301-32c9.575-51.602 28.161-104.81 58.394-147.925C127.872 27.305 59.198 84.024 27.271 160h125.385z'],
'power-off': [512, 512, [], 'f011', 'M400 54.1c63 45 104 118.6 104 201.9 0 136.8-110.8 247.7-247.5 248C120 504.3 8.2 393 8 256.4 7.9 173.1 48.9 99.3 111.8 54.2c11.7-8.3 28-4.8 35 7.7L162.6 90c5.9 10.5 3.1 23.8-6.6 31-41.5 30.8-68 79.6-68 134.9-.1 92.3 74.5 168.1 168 168.1 91.6 0 168.6-74.2 168-169.1-.3-51.8-24.7-101.8-68.1-134-9.7-7.2-12.4-20.5-6.5-30.9l15.8-28.1c7-12.4 23.2-16.1 34.8-7.8zM296 264V24c0-13.3-10.7-24-24-24h-32c-13.3 0-24 10.7-24 24v240c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24z'],
'shield-alt': [512, 512, [], 'f3ed', 'M496 128c0 221.282-135.934 344.645-221.539 380.308a48 48 0 0 1-36.923 0C130.495 463.713 16 326.487 16 128a48 48 0 0 1 29.539-44.308l192-80a48 48 0 0 1 36.923 0l192 80A48 48 0 0 1 496 128zM256 446.313l.066.034c93.735-46.689 172.497-156.308 175.817-307.729L256 65.333v380.98z'],
'user-circle': [496, 512, [], 'f2bd', 'M248 104c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96zm0 144c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-240C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-49.7 0-95.1-18.3-130.1-48.4 14.9-23 40.4-38.6 69.6-39.5 20.8 6.4 40.6 9.6 60.5 9.6s39.7-3.1 60.5-9.6c29.2 1 54.7 16.5 69.6 39.5-35 30.1-80.4 48.4-130.1 48.4zm162.7-84.1c-24.4-31.4-62.1-51.9-105.1-51.9-10.2 0-26 9.6-57.6 9.6-31.5 0-47.4-9.6-57.6-9.6-42.9 0-80.6 20.5-105.1 51.9C61.9 339.2 48 299.2 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 43.2-13.9 83.2-37.3 115.9z']
};
/**
* Initializations
*/
window.___FONT_AWESOME___ = {'hooks': {}, 'shims': [], 'styles': {'fa': _icons}};