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 2050 additions and 584 deletions
File moved
File moved
File moved
File moved
{
"manifest_version": 2,
"manifest_version": 3,
"name": "Decentraleyes",
"version": "2.0.8",
"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": {
"16": "icons/action/icon16-default.png",
"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,8 +7,9 @@ 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 {
......@@ -27,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;
}
/**
......@@ -42,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');
}
......@@ -50,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');
}
......@@ -58,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');
}
......@@ -70,6 +78,7 @@ body {
align-items: center;
display: flex;
font-weight: 600;
user-select: none;
}
/**
......@@ -77,7 +86,7 @@ body {
*/
.input-checkbox {
margin: 0 4px 0 0;
margin: 0 5px 0 0;
outline: 0;
}
......@@ -86,6 +95,14 @@ body {
max-width: 320px;
}
.text-label {
padding: 0 2px;
}
.input-checkbox:focus + .text-label {
outline: 1px dotted #000;
}
/**
* Icons
*/
......@@ -99,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;
......@@ -118,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 {
......@@ -156,7 +190,7 @@ body {
*/
.description-option {
color: #777;
color: #757575;
font-style: italic;
padding-left: 29px;
}
......@@ -171,7 +205,9 @@ body {
}
.badge-warning {
background-color: #ffa500;
background-color: #ffd90f;
border: 1px solid #f0c600;
color: #463a02;
}
.hidden {
......@@ -220,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,347 +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) => {
/**
* Event Handlers
*/
chrome.tabs.query({'active': true, 'currentWindow': true}, function (tabs) {
const _onTestingUtilityLinkClicked = (event) => {
popup._targetTab = tabs[0];
popup._domain = helpers.extractDomainFromUrl(tabs[0].url, true);
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,43 +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 (url.startsWith(Address.CHROME)) {
extractedDomain = null;
}
i18nElements.forEach((i18nElement) => {
if (extractedDomain === '') {
extractedDomain = null;
}
const i18nMessageName = i18nElement.getAttribute('data-i18n-title');
if (extractedDomain !== null && normalize === true) {
extractedDomain = helpers.normalizeDomain(extractedDomain);
}
i18nElement.setAttribute('title', chrome.i18n.getMessage(i18nMessageName));
i18nElement.setAttribute('dir', scriptDirection);
});
};
return extractedDomain;
const unhideDocumentContents = (document) => {
document.getElementById('wrapper').classList.remove('hidden');
};
helpers.extractFilenameFromPath = function (path) {
const extractFilenameFromPath = (path) => {
let pathSegments, filename;
......@@ -123,63 +175,16 @@ helpers.extractFilenameFromPath = function (path) {
return filename;
};
helpers.generateRandomHexString = function (length) {
let randomValues, randomHexString;
randomValues = crypto.getRandomValues(new Uint8Array(length));
randomHexString = '';
const enterOrSpaceKeyPressed = (event) => {
for (let value of randomValues) {
// eslint-disable-next-line no-bitwise
let hexValue = (0 ^ value & 15 >> 0 / 4).toString(16);
randomHexString += hexValue;
if (! event.isComposing && event.keyCode !== 229) {
return event.keyCode === 13 || event.keyCode === 32;
}
return randomHexString;
return false;
};
helpers.determineCdnName = function (domainName) {
switch (domainName) {
case 'ajax.googleapis.com':
return 'Google Hosted Libraries';
case 'ajax.aspnetcdn.com':
return 'Microsoft Ajax CDN';
case 'ajax.microsoft.com':
return 'Microsoft Ajax CDN [Deprecated]';
case 'cdnjs.cloudflare.com':
return 'CDNJS (Cloudflare)';
case 'code.jquery.com':
return 'jQuery CDN (MaxCDN)';
case 'cdn.jsdelivr.net':
return 'jsDelivr (MaxCDN)';
case 'yastatic.net':
return 'Yandex CDN';
case 'yandex.st':
return 'Yandex CDN [Deprecated]';
case '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 'cdn.bootcss.com':
return 'BootCDN';
case 'sdn.geekzu.org':
return 'Geekzu Public Service [Mirror]';
case 'ajax.proxy.ustclug.org':
return 'USTC Linux User Group [Mirror]';
default:
return 'Unknown';
}
};
helpers.determineResourceName = function (filename) {
const determineResourceName = (filename) => {
switch (filename) {
......@@ -216,33 +221,82 @@ helpers.determineResourceName = function (filename) {
}
};
helpers.determineScriptDirection = function (language) {
const determineCdnName = (domainName) => {
let rightToLeftLanguages, scriptDirection;
switch (domainName) {
rightToLeftLanguages = ['ar', 'he'];
case 'ajax.googleapis.com':
return 'Google Hosted Libraries';
case 'ajax.aspnetcdn.com':
return 'Microsoft Ajax CDN';
case 'ajax.microsoft.com':
return 'Microsoft Ajax CDN [Deprecated]';
case 'cdnjs.cloudflare.com':
return 'CDNJS (Cloudflare)';
case 'code.jquery.com':
return 'jQuery CDN (Fastly)';
case 'cdn.jsdelivr.net':
return 'jsDelivr (Cloudflare, Fastly)';
case 'yastatic.net':
return 'Yandex CDN';
case 'yandex.st':
return 'Yandex CDN [Deprecated]';
case 'apps.bdimg.com':
return 'Baidu CDN';
case 'libs.baidu.com':
return 'Baidu CDN [Deprecated]';
case 'lib.sinaapp.com':
return 'Sina Public Resources';
case 'upcdn.b0.upaiyun.com':
return 'UpYun Library';
case 'mat1.gtimg.com':
return 'Tencent Cloud CDN';
case 'cdn.bootcss.com':
return 'BootCDN [Dissolved]';
case 'sdn.geekzu.org':
return 'Geekzu Public Service [Mirror]';
case 'ajax.proxy.ustclug.org':
return 'USTC Linux User Group [Mirror]';
default:
return 'Unknown';
}
};
if (rightToLeftLanguages.indexOf(language) === -1) {
scriptDirection = 'ltr';
const determineVersion = () => {
const version = chrome.runtime.getManifest().version;
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
};