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