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 2053 additions and 587 deletions
images/icons/action/disabled/64.png

1.88 KiB

File moved
images/icons/extension/16.png

608 B

File moved
File moved
{
"manifest_version": 2,
"manifest_version": 3,
"name": "Decentraleyes",
"version": "2.0.4",
"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-default.png",
"19": "icons/action/icon19-default.png",
"32": "icons/action/icon32-default.png",
"36": "icons/action/icon36-default.png",
"38": "icons/action/icon38-default.png",
"64": "icons/action/icon64-default.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"
"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"],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"],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 lang="en">
<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/shorthands.js"></script>
<script src="../../core/request-sanitizer.js"></script>
<script src="../../core/state-manager.js"></script>
<script src="../../core/request-analyzer.js"></script>
<script src="../../core/file-guard.js"></script>
<script src="../../core/messenger.js"></script>
<script src="../../core/interceptor.js"></script>
<script src="../../core/main.js"></script>
</body>
</html>
......@@ -7,11 +7,14 @@ body {
cursor: default;
font-family: 'Noto Sans', Arial, sans-serif !important;
font-size: 12px;
margin-bottom: 5px;
margin-top: -15px;
padding: 10px !important;
padding: 10px 2px !important;
}
.option {
display: flex;
flex-direction: column;
margin-top: 25px;
}
......@@ -25,11 +28,18 @@ body {
.notice-default {
background-color: #f1f1f1;
border: 1px solid #d2d2d2;
color: #282828;
}
.notice-warning {
background-color: #ffa500;
color: #fff;
background-color: #ffd90f;
border: 1px solid #d2b115;
color: #463a02;
}
.notice-secondary {
margin-top: 50px;
}
/**
......@@ -40,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');
}
......@@ -48,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');
}
......@@ -56,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');
}
......@@ -68,6 +78,7 @@ body {
align-items: center;
display: flex;
font-weight: 600;
user-select: none;
}
/**
......@@ -75,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;
}
/**
......@@ -96,11 +116,12 @@ body {
*/
.button {
-moz-user-select: none;
background-color: #f5f5f5;
border-color: #cfcfcf;
border-radius: 2px;
border: 1px solid #cfcfcf;
color: #5f5f5f;
border-style: solid;
border-width: 1px 1px 2px 1px;
color: #282828;
cursor: pointer;
float: right;
font-size: 12px;
......@@ -115,24 +136,40 @@ body {
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: #ea9700;
border: 1px solid #d88c00;
color: #fff;
background-color: #ffef95;
border-color: #ae920d;
color: #1a1500;
}
.button-warning:hover {
background-color: #d88c00;
border-color: #c98200;
background-color: #fffbde;
border-color: #a48b14;
color: #000;
}
.button-warning:focus {
background-color: #fff9d8;
border-color: #91790a;
color: #000;
}
.button-warning:active {
background-color: #c07c00;
border-color: #b47400;
background-color: #d7b002;
border-color: #a48900;
color: #292100;
}
.button-notice {
......@@ -153,7 +190,7 @@ body {
*/
.description-option {
color: #777;
color: #757575;
font-style: italic;
padding-left: 29px;
}
......@@ -168,7 +205,9 @@ body {
}
.badge-warning {
background-color: #ffa500;
background-color: #ffd90f;
border: 1px solid #f0c600;
color: #463a02;
}
.hidden {
......@@ -217,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, initial-scale=1.0">
<meta charset="utf-8" />
<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="notice notice-warning hidden" id="notice-block-missing">
<section class="option">
<div class="notice-head">
<div class="title-option">
<i class="fai fa-exclamation-triangle icon"></i>
<span data-i18n-content="blockMissingTitle"></span>
<label class="label-checkbox">
</div>
<input class="input-checkbox" data-option="showIconBadge" type="checkbox">
<span class="text-label" data-i18n-content="showIconBadgeTitle"></span>
<div class="notice-body" dir="ltr">
</label>
<div class="notice-message">
This feature breaks websites. Do not leave it enabled, unless you are prepared to manually whitelist any affected domains.
</div>
<div class="button button-notice button-warning" id="button-block-missing">
Disable
</div>
</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="stripMetadata" type="checkbox">
<span class="text-label" data-i18n-content="stripMetadataTitle"></span>
<input class="input-checkbox" data-option="showIconBadge" type="checkbox">
<span data-i18n-content="showIconBadgeTitle"></span>
</label>
</label>
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
</div>
</div>
<div class="description-option" data-i18n-content="showIconBadgeDescription"></div>
<div class="description-option" data-i18n-content="stripMetadataDescription"></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="disablePrefetch" type="checkbox">
<span class="text-label" data-i18n-content="disablePrefetchTitle"></span>
</label>
</label>
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
</div>
<div class="description-option" data-i18n-content="disablePrefetchDescription"></div>
</div>
</section>
<div class="description-option" data-i18n-content="blockMissingDescription"></div>
<section class="option">
</section>
<div class="title-option">
<section class="option">
<label class="label-checkbox">
<div class="title-option">
<input class="input-checkbox" data-option="blockMissing" type="checkbox">
<span class="text-label" data-i18n-content="blockMissingTitle"></span>
<label class="label-checkbox">
</label>
<input class="input-checkbox" data-option="disablePrefetch" type="checkbox">
<span data-i18n-content="disablePrefetchTitle"></span>
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
</label>
</div>
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
<div class="description-option" data-i18n-content="blockMissingDescription"></div>
</div>
</section>
<div class="description-option" data-i18n-content="disablePrefetchDescription"></div>
<section class="notice notice-warning hidden" id="notice-block-missing">
</section>
<div class="notice-head">
<section class="option">
<i class="fa fa-exclamation-triangle icon"></i>
<span data-i18n-content="blockMissingTitle"></span>
<div class="title-option">
</div>
<label class="label-checkbox">
<div class="notice-body" dir="ltr">
<input class="input-checkbox" data-option="stripMetadata" type="checkbox">
<span data-i18n-content="stripMetadataTitle"></span>
<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>
<div class="button button-notice button-warning" id="button-block-missing" tabindex="0">
Disable
</div>
<span class="badge badge-warning" data-i18n-content="advancedLabel"></span>
</div>
</div>
</section>
<div class="description-option" data-i18n-content="stripMetadataDescription"></div>
<section class="option">
</section>
<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>
<section class="option">
</section>
<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>
<section class="notice notice-default notice-secondary hidden" id="notice-locale">
</section>
<div class="notice-body" dir="ltr">
<section class="notice notice-default hidden" id="notice-locale">
<div class="notice-message">
<div class="notice-body" dir="ltr">
<i class="fa fa-exclamation-triangle icon"></i>
Your preferred language is not yet fully supported.
<div class="notice-message">
</div>
<i class="fai fa-exclamation-triangle icon"></i>
Your preferred language is not yet fully supported.
<a class="button button-notice" id="button-help-translate" tabindex="0">
Help Translate
</a>
</div>
<a class="button button-notice" href="https://crowdin.com/project/decentraleyes" target="_blank">
Help Translate
</a>
</div>
</section>
</section>
</div>
</body>
......
/**
* Main Options Page
* Options Page
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
......@@ -11,222 +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._renderContents = function () {
const _getOptionElement = (key) => {
return document.querySelector(`[data-option=${key}]`);
};
document.body.setAttribute('dir', options._scriptDirection);
helpers.insertI18nContentIntoDocument(document);
const _getOptionElements = () => {
return document.querySelectorAll('[data-option]');
};
options._determineOptionValues()
.then(options._renderOptionsPanel);
const _renderLocaleNotice = () => {
const localeNoticeElement = document.getElementById('notice-locale');
localeNoticeElement.classList.remove('hidden');
};
options._renderOptionsPanel = function () {
const _serializeWhitelistedDomains = (whitelistedDomains) => {
let whitelistedDomains, domainWhitelist, elements;
const domainWhitelist = Object.keys(whitelistedDomains).join(_whitelistValueSeparator);
return domainWhitelist.replace(_whitelistTrimExpression, '');
};
whitelistedDomains = options._optionValues.whitelistedDomains;
domainWhitelist = options._serializeWhitelistedDomains(whitelistedDomains);
const _parseDomainWhitelist = async (domainWhitelist) => {
elements = options._optionElements;
const whitelistedDomains = {};
elements.showIconBadge.checked = options._optionValues.showIconBadge;
elements.blockMissing.checked = options._optionValues.blockMissing;
elements.disablePrefetch.checked = options._optionValues.disablePrefetch;
elements.stripMetadata.checked = options._optionValues.stripMetadata;
elements.whitelistedDomains.value = domainWhitelist;
domainWhitelist = domainWhitelist.split(_whitelistValueSeparator);
options._registerOptionChangedEventListeners(elements);
options._registerMiscellaneousEventListeners();
for (const domain of domainWhitelist) {
if (options._optionValues.blockMissing === true) {
options._renderBlockMissingNotice();
}
const normalizedDomain = await Helpers.delegateAction('domain:normalize', domain);
if (options._languageSupported === false) {
options._renderLocaleNotice();
if (normalizedDomain !== '') {
whitelistedDomains[normalizedDomain] = true;
}
}
};
options._renderBlockMissingNotice = function () {
let blockMissingNoticeElement = document.getElementById('notice-block-missing');
blockMissingNoticeElement.setAttribute('class', 'notice notice-warning');
return whitelistedDomains;
};
options._hideBlockMissingNotice = function () {
const _onHelpTranslate = () => {
let blockMissingNoticeElement = document.getElementById('notice-block-missing');
blockMissingNoticeElement.setAttribute('class', 'notice notice-warning hidden');
chrome.tabs.create({
'url': 'https://crowdin.com/project/decentraleyes'
});
};
options._renderLocaleNotice = function () {
const _setBlockMissingNoticeVisibility = (visible) => {
const blockMissingNoticeElement = document.getElementById('notice-block-missing');
let localeNoticeElement = document.getElementById('notice-locale');
localeNoticeElement.setAttribute('class', 'notice notice-default');
if (visible) {
blockMissingNoticeElement.classList.remove('hidden');
} else {
blockMissingNoticeElement.classList.add('hidden');
}
};
options._registerOptionChangedEventListeners = function (elements) {
const _getOptionElementValue = (optionElement) => {
elements.showIconBadge.addEventListener('change', options._onOptionChanged);
elements.blockMissing.addEventListener('change', options._onOptionChanged);
elements.disablePrefetch.addEventListener('change', options._onOptionChanged);
elements.stripMetadata.addEventListener('change', options._onOptionChanged);
elements.whitelistedDomains.addEventListener('keyup', options._onOptionChanged);
if (optionElement.getAttribute('type') === 'checkbox') {
return optionElement.checked;
} else {
return optionElement.value;
}
};
options._registerMiscellaneousEventListeners = function () {
let blockMissingButtonElement = document.getElementById('button-block-missing');
const _onOptionChanged = async ({target}) => {
blockMissingButtonElement.addEventListener('click', function () {
let optionKey, optionValue;
let changeEvent = new Event('change');
optionKey = target.getAttribute('data-option');
optionValue = _getOptionElementValue(target);
options._optionElements.blockMissing.checked = false;
options._optionElements.blockMissing.dispatchEvent(changeEvent);
});
};
if (optionKey === 'whitelistedDomains') {
options._determineOptionValues = function () {
clearTimeout(_timeouts.whitelistedDomains);
return new Promise((resolve) => {
_timeouts.whitelistedDomains = await setTimeout(async () => {
Helpers.delegateAction('whitelisted-domains:update', await _parseDomainWhitelist(optionValue));
}, 100);
let optionKeys = Object.keys(options._optionElements);
return;
}
chrome.storage.local.get(optionKeys, function (items) {
if (optionKey === 'blockMissing') {
_setBlockMissingNoticeVisibility(optionValue);
}
options._optionValues = items;
resolve();
});
Helpers.delegateAction('setting:update', {
'key': optionKey, 'value': optionValue
});
};
options._getOptionElement = function (optionKey) {
return document.querySelector(`[data-option=${optionKey}]`);
};
options._getOptionElements = function () {
const _registerOptionChangedEventListeners = (optionElements) => {
let optionElements = {
[Setting.SHOW_ICON_BADGE]: options._getOptionElement(Setting.SHOW_ICON_BADGE),
[Setting.BLOCK_MISSING]: options._getOptionElement(Setting.BLOCK_MISSING),
[Setting.DISABLE_PREFETCH]: options._getOptionElement(Setting.DISABLE_PREFETCH),
[Setting.STRIP_METADATA]: options._getOptionElement(Setting.STRIP_METADATA),
[Setting.WHITELISTED_DOMAINS]: options._getOptionElement(Setting.WHITELISTED_DOMAINS)
};
for (const optionElement of Object.values(optionElements)) {
return optionElements;
if (optionElement.getAttribute('type') === 'checkbox') {
optionElement.addEventListener('change', _onOptionChanged);
} else {
optionElement.addEventListener('keyup', _onOptionChanged);
}
}
};
options._configureLinkPrefetching = function (value) {
const _initializeOptionElements = (settings) => {
if (value === 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);
};
options._serializeWhitelistedDomains = function (whitelistedDomains) {
const _onDisableBlockMissing = () => {
let domainWhitelist, whitelistedDomainKeys;
const blockMissingElement = _getOptionElement('blockMissing');
whitelistedDomainKeys = Object.keys(whitelistedDomains);
domainWhitelist = '';
blockMissingElement.checked = false;
blockMissingElement.dispatchEvent(new Event('change'));
};
whitelistedDomainKeys.forEach(function (domain) {
domainWhitelist = `${domainWhitelist}${domain};`;
});
const _registerMiscellaneousEventListeners = () => {
domainWhitelist = domainWhitelist.slice(0, -1);
domainWhitelist = domainWhitelist.replace(Whitelist.TRIM_EXPRESSION, '');
let blockMissingButtonElement, helpTranslateButtonElement;
return domainWhitelist;
};
blockMissingButtonElement = document.getElementById('button-block-missing');
helpTranslateButtonElement = document.getElementById('button-help-translate');
options._parseDomainWhitelist = function (domainWhitelist) {
blockMissingButtonElement.addEventListener('click', _onDisableBlockMissing);
helpTranslateButtonElement.addEventListener('click', _onHelpTranslate);
let whitelistedDomains = {};
blockMissingButtonElement.addEventListener('keydown', (event) => {
domainWhitelist.split(Whitelist.VALUE_SEPARATOR).forEach(function (domain) {
whitelistedDomains[helpers.normalizeDomain(domain)] = true;
if (Helpers.enterOrSpaceKeyPressed(event)) {
_onDisableBlockMissing();
}
});
return whitelistedDomains;
helpTranslateButtonElement.addEventListener('keydown', (event) => {
if (Helpers.enterOrSpaceKeyPressed(event)) {
_onHelpTranslate();
}
});
};
/**
* Event Handlers
*/
const _renderContents = async () => {
options._onDocumentLoaded = function () {
const settings = await Helpers.delegateAction('settings:get', {'concise': false});
let language = navigator.language;
_registerMiscellaneousEventListeners();
_initializeOptionElements(settings);
options._optionElements = options._getOptionElements();
options._languageSupported = helpers.languageIsFullySupported(language);
options._scriptDirection = helpers.determineScriptDirection(language);
_setBlockMissingNoticeVisibility(settings.blockMissing.value);
options._renderContents();
if (! Helpers.languageIsFullySupported()) {
_renderLocaleNotice();
}
};
options._onOptionChanged = function ({target}) {
const _onDocumentLoaded = async () => {
let optionKey, optionType, optionValue;
document.body.setAttribute('dir', Helpers.determineScriptDirection());
Helpers.applyI18nContentToDocument(document);
optionKey = target.getAttribute('data-option');
optionType = target.getAttribute('type');
switch (optionType) {
case 'checkbox':
optionValue = target.checked;
break;
default:
optionValue = target.value;
}
await _renderContents();
if (optionKey === Setting.BLOCK_MISSING) {
Helpers.unhideDocumentContents(document);
};
if (optionValue === true) {
options._renderBlockMissingNotice();
} else {
options._hideBlockMissingNotice();
}
}
/**
* Event Handlers
*/
if (optionKey === Setting.DISABLE_PREFETCH) {
options._configureLinkPrefetching(optionValue);
}
chrome.runtime.onMessage.addListener((message) => {
if (optionKey === Setting.WHITELISTED_DOMAINS) {
optionValue = options._parseDomainWhitelist(optionValue);
if (message.topic === 'domain:added-to-whitelist' || message.topic === 'domain:removed-from-whitelist') {
_getOptionElement('whitelistedDomains').value = _serializeWhitelistedDomains(message.value);
}
chrome.storage.local.set({
[optionKey]: optionValue
});
};
});
/**
* Initializations
*/
document.addEventListener('DOMContentLoaded', options._onDocumentLoaded);
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,7 @@ footer {
}
.side-note {
color: #a5a5a5;
color: #646464;
font-style: italic;
font-weight: 400;
}
......@@ -258,3 +274,125 @@ footer {
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, initial-scale=1.0">
<meta charset="utf-8" />
<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,351 +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) => {
/**
* Private Methods
*/
popup._renderContents = function () {
return Object.values(injections).reduce((accumulator, injection) => {
helpers.insertI18nContentIntoDocument(document);
helpers.insertI18nTitlesIntoDocument(document);
accumulator[injection.source] = accumulator[injection.source] ?? [];
accumulator[injection.source].push(injection);
popup._renderNonContextualContents();
return accumulator;
popup._determineTargetTab()
.then(popup._determineDomainWhitelistStatus)
.then(popup._determineResourceInjections)
.then(popup._renderContextualContents);
}, {});
};
popup._renderNonContextualContents = function () {
const _createInjectionGroupHeaderElement = (source, injections) => {
let versionLabelElement, counterElement, testingUtilityLinkElement, optionsButtonElement;
let injectionGroupHeaderElement, badgeElement, badgeTextNode, cdnNameTextNode;
versionLabelElement = document.getElementById('version-label');
counterElement = document.getElementById('injection-counter');
testingUtilityLinkElement = document.getElementById('testing-utility-link');
optionsButtonElement = document.getElementById('options-button');
injectionGroupHeaderElement = document.createElement('li');
injectionGroupHeaderElement.setAttribute('class', 'list-item');
versionLabelElement.innerText = popup._version;
counterElement.innerText = helpers.formatNumber(popup._amountInjected);
badgeElement = document.createElement('span');
badgeElement.setAttribute('class', 'badge');
testingUtilityLinkElement.addEventListener('mouseup', popup._onTestingUtilityLinkClicked);
optionsButtonElement.addEventListener('mouseup', popup._onOptionsButtonClicked);
};
badgeTextNode = document.createTextNode(injections.length);
badgeElement.appendChild(badgeTextNode);
popup._renderContextualContents = function () {
cdnNameTextNode = document.createTextNode(Helpers.determineCdnName(source));
if (popup._domain !== null) {
popup._renderDomainWhitelistPanel();
}
injectionGroupHeaderElement.appendChild(badgeElement);
injectionGroupHeaderElement.appendChild(cdnNameTextNode);
if (Object.keys(popup._resourceInjections).length > 0) {
popup._renderInjectionPanel(popup._resourceInjections);
}
return injectionGroupHeaderElement;
};
popup._renderDomainWhitelistPanel = function () {
const _createInjectionElement = (injection) => {
let websiteContextElement, protectionToggleElement, domainIndicatorElement;
let injectionElement, filename, name, nameTextNode, noteElement, noteTextNode;
websiteContextElement = document.getElementById('website-context');
protectionToggleElement = document.getElementById('protection-toggle-button');
domainIndicatorElement = document.getElementById('domain-indicator');
injectionElement = document.createElement('li');
injectionElement.setAttribute('class', 'sublist-item');
protectionToggleElement.setAttribute('dir', popup._scriptDirection);
domainIndicatorElement.innerText = popup._domain;
filename = Helpers.extractFilenameFromPath(injection.path);
name = Helpers.determineResourceName(filename);
if (popup._domainIsWhitelisted === true) {
nameTextNode = document.createTextNode(`- ${name}`);
injectionElement.appendChild(nameTextNode);
let enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle');
noteElement = document.createElement('span');
noteElement.setAttribute('class', 'side-note');
protectionToggleElement.setAttribute('class', 'button button-toggle');
protectionToggleElement.addEventListener('click', popup._enableProtection);
protectionToggleElement.setAttribute('title', enableProtectionTitle);
noteTextNode = document.createTextNode(` v${injection.version}`);
} else {
noteElement.appendChild(noteTextNode);
injectionElement.appendChild(noteElement);
let disableProtectionTitle = chrome.i18n.getMessage('disableProtectionTitle');
return injectionElement;
};
protectionToggleElement.setAttribute('class', 'button button-toggle active');
protectionToggleElement.addEventListener('click', popup._disableProtection);
protectionToggleElement.setAttribute('title', disableProtectionTitle);
}
const _createInjectionGroupElement = (source, injections) => {
websiteContextElement.setAttribute('class', 'panel');
};
let injectionGroupElement;
popup._renderInjectionPanel = function (groupedInjections) {
injectionGroupElement = document.createElement('ul');
injectionGroupElement.setAttribute('class', 'sublist');
let websiteContextElement, injectionOverviewElement;
for (const injection of injections) {
websiteContextElement = document.getElementById('website-context');
injectionOverviewElement = popup._createInjectionOverviewElement(groupedInjections);
const injectionElement = _createInjectionElement(injection);
injectionGroupElement.appendChild(injectionElement);
}
websiteContextElement.append(injectionOverviewElement);
return injectionGroupElement;
};
popup._enableProtection = function () {
const _createInjectionOverviewElement = (groupedInjections) => {
let message = {
'topic': 'whitelist:remove-domain',
'value': popup._domain
};
const injectionOverviewElement = document.createElement('ul');
injectionOverviewElement.setAttribute('class', 'list');
chrome.runtime.sendMessage(message, function () {
popup._onProtectionToggled();
});
};
for (const [source, injections] of Object.entries(groupedInjections)) {
popup._disableProtection = function () {
let injectionGroupHeaderElement, injectionGroupElement;
let message = {
'topic': 'whitelist:add-domain',
'value': popup._domain
};
injectionGroupHeaderElement = _createInjectionGroupHeaderElement(source, injections);
injectionGroupElement = _createInjectionGroupElement(source, injections);
chrome.runtime.sendMessage(message, function () {
popup._onProtectionToggled();
});
};
injectionOverviewElement.appendChild(injectionGroupHeaderElement);
injectionOverviewElement.appendChild(injectionGroupElement);
}
popup._determineDomainWhitelistStatus = function () {
return injectionOverviewElement;
};
return new Promise((resolve) => {
const _renderInjectionPanel = (groupedInjections) => {
let message = {
'topic': 'domain:fetch-is-whitelisted',
'value': popup._domain
};
let websiteContextElement, injectionOverviewElement;
chrome.runtime.sendMessage(message, function (response) {
websiteContextElement = document.getElementById('website-context');
injectionOverviewElement = _createInjectionOverviewElement(groupedInjections);
popup._domainIsWhitelisted = response.value;
resolve();
});
});
websiteContextElement.append(injectionOverviewElement);
};
popup._determineResourceInjections = function () {
const _close = async () => {
return new Promise((resolve) => {
const platform = await chrome.runtime.getPlatformInfo();
let message = {
'topic': 'tab:fetch-injections',
'value': popup._targetTab.id
};
if (platform.os === chrome.runtime.PlatformOs.ANDROID) {
chrome.runtime.sendMessage(message, function (response) {
const activeTab = await chrome.tabs.getCurrent();
let groupedInjections = popup._groupResourceInjections(response.value);
popup._resourceInjections = groupedInjections;
if (activeTab) {
chrome.tabs.remove(activeTab.id);
} else {
window.close();
}
resolve();
});
});
} else {
window.close();
}
};
popup._determineTargetTab = function () {
return new Promise((resolve) => {
chrome.tabs.query({'active': true, 'currentWindow': true}, function (tabs) {
/**
* Event Handlers
*/
popup._targetTab = tabs[0];
popup._domain = helpers.extractDomainFromUrl(tabs[0].url);
const _onTestingUtilityLinkClicked = (event) => {
if (popup._domain !== null) {
popup._domain = helpers.normalizeDomain(popup._domain);
}
if (event.button === 0 || event.button === 1) {
resolve();
chrome.tabs.create({
'url': 'https://decentraleyes.org/test',
'active': (event.button === 0)
});
});
}
if (event.button === 0) {
window.close();
}
};
popup._determineAmountInjected = function () {
const _onOptionsButtonClicked = async () => {
return new Promise((resolve) => {
const platform = await chrome.runtime.getPlatformInfo();
chrome.storage.local.get(Setting.AMOUNT_INJECTED, function (items) {
if (platform.os === chrome.runtime.PlatformOs.ANDROID) {
popup._amountInjected = items.amountInjected || 0;
resolve();
chrome.tabs.create({
'url': chrome.runtime.getURL('pages/options/options.html'),
'active': true
});
});
};
popup._groupResourceInjections = function (injections) {
return window.close();
let groupedInjections = {};
} else {
for (let index in injections) {
chrome.runtime.openOptionsPage();
return window.close();
}
};
let {source} = injections[index];
const _renderNonContextualContents = async () => {
groupedInjections[source] = groupedInjections[source] || [];
groupedInjections[source].push(injections[index]);
}
let versionLabelElement, counterElement, testingUtilityLinkElement, optionsButtonElement, amountInjected;
return groupedInjections;
};
versionLabelElement = document.getElementById('version-label');
counterElement = document.getElementById('injection-counter');
testingUtilityLinkElement = document.getElementById('testing-utility-link');
optionsButtonElement = document.getElementById('options-button');
popup._createInjectionOverviewElement = function (groupedInjections) {
versionLabelElement.innerText = Helpers.determineVersion();
let injectionOverviewElement = document.createElement('ul');
injectionOverviewElement.setAttribute('class', 'list');
amountInjected = await Helpers.delegateAction('statistics:get-amount-injected');
counterElement.innerText = Helpers.formatNumber(amountInjected.value);
for (let source in groupedInjections) {
testingUtilityLinkElement.addEventListener('mouseup', _onTestingUtilityLinkClicked);
optionsButtonElement.addEventListener('mouseup', _onOptionsButtonClicked);
let injectionGroupHeaderElement, injectionGroupElement, cdn;
testingUtilityLinkElement.addEventListener('keydown', (event) => {
cdn = groupedInjections[source];
const enterOrSpaceKeyPressed = Helpers.enterOrSpaceKeyPressed(event);
injectionGroupHeaderElement = popup._createInjectionGroupHeaderElement(source, cdn);
injectionGroupElement = popup._createInjectionGroupElement(source, cdn);
if (enterOrSpaceKeyPressed) {
injectionOverviewElement.appendChild(injectionGroupHeaderElement);
injectionOverviewElement.appendChild(injectionGroupElement);
}
chrome.tabs.create({
'url': 'https://decentraleyes.org/test'
});
return injectionOverviewElement;
};
window.close();
}
});
popup._createInjectionGroupHeaderElement = function (source, cdn) {
optionsButtonElement.addEventListener('keydown', (event) => {
let injectionGroupHeaderElement, badgeElement, badgeTextNode, cdnNameTextNode;
const enterOrSpaceKeyPressed = Helpers.enterOrSpaceKeyPressed(event);
injectionGroupHeaderElement = document.createElement('li');
injectionGroupHeaderElement.setAttribute('class', 'list-item');
if (enterOrSpaceKeyPressed) {
badgeElement = document.createElement('span');
badgeElement.setAttribute('class', 'badge');
chrome.runtime.openOptionsPage();
return window.close();
}
});
};
badgeTextNode = document.createTextNode(cdn.length);
badgeElement.appendChild(badgeTextNode);
const _onProtectionToggled = async () => {
cdnNameTextNode = document.createTextNode(helpers.determineCdnName(source));
let bypassCache, activeTab;
injectionGroupHeaderElement.appendChild(badgeElement);
injectionGroupHeaderElement.appendChild(cdnNameTextNode);
bypassCache = (typeof browser === 'undefined');
activeTab = await Helpers.determineActiveTab();
return injectionGroupHeaderElement;
chrome.tabs.reload(activeTab.id, {bypassCache});
_close();
};
popup._createInjectionGroupElement = function (source, cdn) {
const _enableProtection = async () => {
let injectionGroupElement;
let activeTab, tabDomain;
injectionGroupElement = document.createElement('ul');
injectionGroupElement.setAttribute('class', 'sublist');
activeTab = await Helpers.determineActiveTab();
tabDomain = await Helpers.delegateAction('domain:extract-from-url', activeTab.url);
for (let injection of cdn) {
await Helpers.delegateAction('domain:remove-from-whitelist', tabDomain);
_onProtectionToggled();
};
let injectionElement = popup._createInjectionElement(injection);
injectionGroupElement.appendChild(injectionElement);
}
const _disableProtection = async () => {
return injectionGroupElement;
};
let activeTab, tabDomain;
popup._createInjectionElement = function (injection) {
activeTab = await Helpers.determineActiveTab();
tabDomain = await Helpers.delegateAction('domain:extract-from-url', activeTab.url);
let injectionElement, filename, name, nameTextNode, noteElement, noteTextNode;
await Helpers.delegateAction('domain:add-to-whitelist', tabDomain);
_onProtectionToggled();
};
injectionElement = document.createElement('li');
injectionElement.setAttribute('class', 'sublist-item');
const _renderDomainWhitelistPanel = async (domain) => {
filename = helpers.extractFilenameFromPath(injection.path);
name = helpers.determineResourceName(filename);
let websiteContextElement, protectionToggleElement, domainIndicatorElement, domainIsWhitelisted;
nameTextNode = document.createTextNode(`- ${name}`);
injectionElement.appendChild(nameTextNode);
websiteContextElement = document.getElementById('website-context');
protectionToggleElement = document.getElementById('protection-toggle-button');
domainIndicatorElement = document.getElementById('domain-indicator');
noteElement = document.createElement('span');
noteElement.setAttribute('class', 'side-note');
protectionToggleElement.setAttribute('dir', Helpers.determineScriptDirection());
domainIndicatorElement.innerText = domain;
noteTextNode = document.createTextNode(` v${injection.version}`);
domainIsWhitelisted = await Helpers.delegateAction('domain:is-whitelisted', domain);
noteElement.appendChild(noteTextNode);
injectionElement.appendChild(noteElement);
if (domainIsWhitelisted === true) {
return injectionElement;
};
const enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle');
popup._close = function () {
protectionToggleElement.setAttribute('class', 'button button-toggle');
protectionToggleElement.addEventListener('click', _enableProtection);
protectionToggleElement.setAttribute('title', enableProtectionTitle);
chrome.runtime.getPlatformInfo(function (information) {
protectionToggleElement.addEventListener('keydown', (event) => {
if (information.os === chrome.runtime.PlatformOs.ANDROID) {
const enterOrSpaceKeyPressed = Helpers.enterOrSpaceKeyPressed(event);
chrome.tabs.getCurrent(function (tab) {
chrome.tabs.remove(tab.id);
});
if (enterOrSpaceKeyPressed) {
_enableProtection();
}
});
} else {
window.close();
}
});
};
} else {
/**
* Event Handlers
*/
const disableProtectionTitle = chrome.i18n.getMessage('disableProtectionTitle');
popup._onDocumentLoaded = function () {
protectionToggleElement.setAttribute('class', 'button button-toggle active');
protectionToggleElement.addEventListener('click', _disableProtection);
protectionToggleElement.setAttribute('title', disableProtectionTitle);
let manifest, language;
protectionToggleElement.addEventListener('keydown', (event) => {
manifest = chrome.runtime.getManifest();
language = navigator.language;
const enterOrSpaceKeyPressed = Helpers.enterOrSpaceKeyPressed(event);
popup._version = helpers.formatVersion(manifest.version);
popup._scriptDirection = helpers.determineScriptDirection(language);
if (enterOrSpaceKeyPressed) {
_disableProtection();
}
});
}
popup._determineAmountInjected()
.then(popup._renderContents);
websiteContextElement.classList.remove('hidden');
};
popup._onTestingUtilityLinkClicked = function (event) {
const _renderContextualContents = async () => {
if (event.button === 0 || event.button === 1) {
let activeTab, tabDomain, tabContext, groupedInjections;
chrome.tabs.create({
'url': 'https://decentraleyes.org/test',
'active': (event.button === 0)
});
}
activeTab = await Helpers.determineActiveTab();
tabDomain = await Helpers.delegateAction('domain:extract-from-url', activeTab.url);
if (event.button === 0) {
window.close();
if (tabDomain !== null) {
await _renderDomainWhitelistPanel(tabDomain);
}
};
popup._onOptionsButtonClicked = function () {
tabContext = await Helpers.delegateAction('tab-context:get', activeTab.id);
groupedInjections = _groupResourceInjections(tabContext.injections);
chrome.runtime.openOptionsPage();
return window.close();
if (Object.keys(groupedInjections).length > 0) {
_renderInjectionPanel(groupedInjections);
}
};
popup._onProtectionToggled = function () {
const _onDocumentLoaded = async () => {
Helpers.applyI18nContentToDocument(document);
Helpers.applyI18nTitlesToDocument(document);
let bypassCache = (typeof browser === 'undefined');
await _renderNonContextualContents();
await _renderContextualContents();
chrome.tabs.reload(popup._targetTab.id, {bypassCache});
popup._close();
Helpers.unhideDocumentContents(document);
};
/**
* Initializations
*/
document.addEventListener('DOMContentLoaded', popup._onDocumentLoaded);
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', 'cs', 'da', 'nl', 'en', 'et', 'fi',
'fr', 'de', 'el', 'is', 'id', 'it', 'ja', 'ko', 'lb',
'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;
......@@ -77,39 +129,43 @@ 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();
return domain;
i18nElements.forEach((i18nElement) => {
const i18nMessageName = i18nElement.getAttribute('data-i18n-content');
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);
});
};
const unhideDocumentContents = (document) => {
document.getElementById('wrapper').classList.remove('hidden');
};
helpers.extractFilenameFromPath = function (path) {
const extractFilenameFromPath = (path) => {
let pathSegments, filename;
......@@ -119,24 +175,53 @@ helpers.extractFilenameFromPath = function (path) {
return filename;
};
helpers.generateRandomHexString = function (length) {
const enterOrSpaceKeyPressed = (event) => {
let randomValues, randomHexString;
if (! event.isComposing && event.keyCode !== 229) {
return event.keyCode === 13 || event.keyCode === 32;
}
randomValues = crypto.getRandomValues(new Uint8Array(length));
randomHexString = '';
return false;
};
for (let value of randomValues) {
const determineResourceName = (filename) => {
// eslint-disable-next-line no-bitwise
let hexValue = (0 ^ value & 15 >> 0 / 4).toString(16);
randomHexString += hexValue;
}
switch (filename) {
return randomHexString;
case 'angular.min.jsm':
return 'AngularJS';
case 'backbone-min.jsm':
return 'Backbone.js';
case 'dojo.jsm':
return 'Dojo';
case 'ember.min.jsm':
return 'Ember.js';
case 'ext-core.jsm':
return 'Ext Core';
case 'jquery.min.jsm':
return 'jQuery';
case 'jquery-ui.min.jsm':
return 'jQuery UI';
case 'modernizr.min.jsm':
return 'Modernizr';
case 'mootools-yui-compressed.jsm':
return 'MooTools';
case 'prototype.jsm':
return 'Prototype';
case 'scriptaculous.jsm':
return 'Scriptaculous';
case 'swfobject.jsm':
return 'SWFObject';
case 'underscore-min.jsm':
return 'Underscore.js';
case 'webfont.jsm':
return 'Web Font Loader';
default:
return 'Unknown';
}
};
helpers.determineCdnName = function (domainName) {
const determineCdnName = (domainName) => {
switch (domainName) {
......@@ -149,21 +234,25 @@ helpers.determineCdnName = function (domainName) {
case 'cdnjs.cloudflare.com':
return 'CDNJS (Cloudflare)';
case 'code.jquery.com':
return 'jQuery CDN (MaxCDN)';
return 'jQuery CDN (Fastly)';
case 'cdn.jsdelivr.net':
return 'jsDelivr (MaxCDN)';
return 'jsDelivr (Cloudflare, Fastly)';
case 'yastatic.net':
return 'Yandex CDN';
case 'yandex.st':
return 'Yandex CDN [Deprecated]';
case 'libs.baidu.com':
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';
return 'BootCDN [Dissolved]';
case 'sdn.geekzu.org':
return 'Geekzu Public Service [Mirror]';
case 'ajax.proxy.ustclug.org':
......@@ -173,70 +262,41 @@ helpers.determineCdnName = function (domainName) {
}
};
helpers.determineResourceName = function (filename) {
const determineVersion = () => {
switch (filename) {
const version = chrome.runtime.getManifest().version;
case 'angular.min.js.dec':
return 'AngularJS';
case 'backbone-min.js.dec':
return 'Backbone.js';
case 'dojo.js.dec':
return 'Dojo';
case 'ember.min.js.dec':
return 'Ember.js';
case 'ext-core.js.dec':
return 'Ext Core';
case 'jquery.min.js.dec':
return 'jQuery';
case 'jquery-ui.min.js.dec':
return 'jQuery UI';
case 'modernizr.min.js.dec':
return 'Modernizr';
case 'mootools-yui-compressed.js.dec':
return 'MooTools';
case 'prototype.js.dec':
return 'Prototype';
case 'scriptaculous.js.dec':
return 'Scriptaculous';
case 'swfobject.js.dec':
return 'SWFObject';
case 'underscore-min.js.dec':
return 'Underscore.js';
case 'webfont.js.dec':
return 'Web Font Loader';
default:
return 'Unknown';
}
};
helpers.determineScriptDirection = function (language) {
let rightToLeftLanguages, scriptDirection;
rightToLeftLanguages = ['ar', 'he'];
if (rightToLeftLanguages.indexOf(language) === -1) {
scriptDirection = 'ltr';
if (version.indexOf('beta') === -1) {
return version;
} else {
scriptDirection = 'rtl';
return 'BETA';
}
return scriptDirection;
};
helpers.formatNumber = function (number) {
const formatNumber = (number) => {
if (typeof number === 'number') {
return number.toLocaleString();
}
};
helpers.formatVersion = function (version) {
/**
* Exports
*/
if (version.indexOf('beta') === -1) {
return version;
} else {
return 'BETA';
}
export default {
awaitInitialization,
delegateAction,
determineActiveTab,
determineScriptDirection,
languageIsFullySupported,
applyI18nContentToDocument,
applyI18nTitlesToDocument,
unhideDocumentContents,
extractFilenameFromPath,
enterOrSpaceKeyPressed,
determineResourceName,
determineCdnName,
determineVersion,
formatNumber
};