diff --git a/.gitignore b/.gitignore index 305ea5a2..830c3f73 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,5 @@ .tags .envrc -build/ node_modules/ yarn-error.log .DS_Store -src/mousetrap*.js -src/mousetrap-global-bind*.js -src/browser-polyfill*.js -src/webext-dynamic-content-scripts.js diff --git a/build/userscript/main.user.js b/build/userscript/main.user.js new file mode 100644 index 00000000..d570ec40 --- /dev/null +++ b/build/userscript/main.user.js @@ -0,0 +1,3142 @@ +// ==UserScript== +// @name Web Search Navigator +// @version 0.5.2 +// @description Keyboard shortcuts for Google search, YouTube, Startpage, Brave Search, Google Scholar, Github, Gitlab, and Amazon. +// @author Web Search Navigator +// @iconURL data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4goDFzU3zLh1KgAABfpJREFUSMe1lWtQVecZhZ/32/scDgdB4HiFgKihgjbiddC2RKI1GkOisbYkRpPaasOUJJ2AbVqNQ7zGCxoTpY4TMwaimEQNNYmoVWtHra2tiUxVIt7QAt4KgnDg3PbeX3/UzFhn+jPPv3dmrZn1412zhAc49PThxMPnwF/mX9W5CDLJzMycAa4JrslmHmBgYAAa/T9GQQCIJVbiwC9+f8cNqNxYOaryPPSY7ivosRDmN8yfUXzsftsDaK211rjvneHzc+pyL6S5lnk2eyo8n5hBGmmkka/RD0SQ/0aQbLIZQ8adta0LWgusycNfGLYq67NIzj2VKSIigvWNzXwwQPuFjnP+GsJ2ib3Qfj19U8qvU0pTPnkrSnbJUanr+QtChAhpxf9jF2HqeC9xtq/Cd+LOntrA1/r8j97w+Tb7dvmO1LY8KDdHuZb0bG0C3aLPsBuMrUbIXALaq706Or3GWG28bZQ9U8IHVMiHKoIfv+4EIkSIABYOgEyVLBSoIlkiw0B9Kn9jCTlGvmpU+7b39Q72XvROqm0Z+fvFz98pAhkn70k/UJ5cb1vseBh6MK0mZhrUjGz6WH4Oxg4p4qSTKRMlWo7Z09RClU0DKFG71TNgrDUGq7+A0WzMUcfB8joT1Xo4MeBKMgKnZzes1nH29M7doUa72PnhX+fV/1RiYWhT2ve69QTPeG8wdiqYkfGWsgeWbrh85vZYfT4qo3jF7hjJc9qnZQ+db1zqH/tq9/GGzjKelRFMcSJgtpgVZhaYe43exhsg63meFvD3Dd3SJfDFxDNJdibYUZZhj1Gjne3hlQmD57lPjrtRZubl7nCfNb7rXFS+SK4d0b1D7TJ50zsfB7tr/eKvRq8JzIZrG1s9xvuQubb3IKcNJszIrHe1A8d1NYdx6CMPkY6iNz3wAeNIR8BqszfyL6hva5muM9D4nSN2EKlrun44sA6uprev834O/RYlBO1JUP72P34b/Qcw9Sy2E0+5VencYBYvyl226cUQHGwVql6ghqovzcmgKlSq7EXpL3SjvnvfF1k4aDBzzIdJgSFDkmfKKMR5yVlvL4bLhbeqg1+B2ij5eg9YW5wSOkHPopI/809l9leH9V7sxOXeKXoiZO1JMqyzcHbm9X2SAV2XQqkRQJ6gSl8GeVMK5CnAg4EDxN6r7Bzmyqugd7Bb/xGuj7rzSPhl6LbB/Utb4NH4Ad0jFZBwKrpB/xjMNHVIV2ObkWX2EnkZmk7ePaBKIfKsfULyobM4fJR3YNftU/GhQ5Ce1uuVsA9GlqStiqoGz2NR/cwI4OcWFyBgBbqCxXCqo35/MBv2J9UmymJIvpyYEj0JkssjzcyBttOBJimFyDJ7qRSC6S4zkvQCGOjzTba3wqWC5jHGu/D4dwZFhYfD9eXtHmMpdL0Qmms9BKeX1//dPxdi5nluKgOcsfZOOxE6hgQuWp+BP8/qcH8I5uaoKZ6BkBuX/v1gC8gUdvIUNH/QWaXOgXuT0VcvADMkVop8BOdib8aYLrh5qmOnaobO6+EOaYC2wkCs6gH/XufvUGlglKlSvRzo1Id0CrCIz81yoEnKo2eBle8Mk/UQeC28QsbCyaRrta4MCL1lbZAQSJF8RQuElPW6fARmVKk5Qufxs6Fm0mprJnjTmvsZClLjE35nm3DzaPtKtRXi90e/q9+EAat8T9qPghPWB5kBPEwM1aCUTOA1uHKsJWyMgqRtcbkyFfqkxvZxjsO1La0pRiukp/bE3gwHV9cNd+9luOTcXFMV7LqaP6ip16f2Slecvyv0tKRywmu51+oECNZGfiPHwFVgiC6Bbk+6H9d3QT/HNuLvm4JKZtEGnX8KH5E4CK+0u2QpeIa5SvUPoCsQfkXaoFvfqAP6KmPqkm/nG4sjKTLi0vKc0GP9CttvB0fKHLPK9ZIqokyft/KcuzwHhkdVsQ8cRzcwDKwaZxfzgBwGEL6vjse4ghvMR9R0toCKkv6cBjvgTOMJMA+oBHZAZIOzhkLJiOvl+VK/b/1ERusVdjAMYopXEr+ZRL5dBLSlu3QL/AeVQYYk5qYwaQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0xMC0wM1QyMDo1Mzo1NSswMzowMPz2q7oAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMTAtMDNUMjA6NTM6NTUrMDM6MDCNqxMGAAAAAElFTkSuQmCC +// @match *://www.google.com/search* +// @match *://www.google.ad/search* +// @match *://www.google.ae/search* +// @match *://www.google.com.af/search* +// @match *://www.google.com.ag/search* +// @match *://www.google.com.ai/search* +// @match *://www.google.al/search* +// @match *://www.google.am/search* +// @match *://www.google.co.ao/search* +// @match *://www.google.com.ar/search* +// @match *://www.google.as/search* +// @match *://www.google.at/search* +// @match *://www.google.com.au/search* +// @match *://www.google.az/search* +// @match *://www.google.ba/search* +// @match *://www.google.com.bd/search* +// @match *://www.google.be/search* +// @match *://www.google.bf/search* +// @match *://www.google.bg/search* +// @match *://www.google.com.bh/search* +// @match *://www.google.bi/search* +// @match *://www.google.bj/search* +// @match *://www.google.com.bn/search* +// @match *://www.google.com.bo/search* +// @match *://www.google.com.br/search* +// @match *://www.google.bs/search* +// @match *://www.google.bt/search* +// @match *://www.google.co.bw/search* +// @match *://www.google.by/search* +// @match *://www.google.com.bz/search* +// @match *://www.google.ca/search* +// @match *://www.google.cd/search* +// @match *://www.google.cf/search* +// @match *://www.google.cg/search* +// @match *://www.google.ch/search* +// @match *://www.google.ci/search* +// @match *://www.google.co.ck/search* +// @match *://www.google.cl/search* +// @match *://www.google.cm/search* +// @match *://www.google.cn/search* +// @match *://www.google.com.co/search* +// @match *://www.google.co.cr/search* +// @match *://www.google.com.cu/search* +// @match *://www.google.cv/search* +// @match *://www.google.com.cy/search* +// @match *://www.google.cz/search* +// @match *://www.google.de/search* +// @match *://www.google.dj/search* +// @match *://www.google.dk/search* +// @match *://www.google.dm/search* +// @match *://www.google.com.do/search* +// @match *://www.google.dz/search* +// @match *://www.google.com.ec/search* +// @match *://www.google.ee/search* +// @match *://www.google.com.eg/search* +// @match *://www.google.es/search* +// @match *://www.google.com.et/search* +// @match *://www.google.fi/search* +// @match *://www.google.com.fj/search* +// @match *://www.google.fm/search* +// @match *://www.google.fr/search* +// @match *://www.google.ga/search* +// @match *://www.google.ge/search* +// @match *://www.google.gg/search* +// @match *://www.google.com.gh/search* +// @match *://www.google.com.gi/search* +// @match *://www.google.gl/search* +// @match *://www.google.gm/search* +// @match *://www.google.gp/search* +// @match *://www.google.gr/search* +// @match *://www.google.com.gt/search* +// @match *://www.google.gy/search* +// @match *://www.google.com.hk/search* +// @match *://www.google.hn/search* +// @match *://www.google.hr/search* +// @match *://www.google.ht/search* +// @match *://www.google.hu/search* +// @match *://www.google.co.id/search* +// @match *://www.google.ie/search* +// @match *://www.google.co.il/search* +// @match *://www.google.im/search* +// @match *://www.google.co.in/search* +// @match *://www.google.iq/search* +// @match *://www.google.is/search* +// @match *://www.google.it/search* +// @match *://www.google.je/search* +// @match *://www.google.com.jm/search* +// @match *://www.google.jo/search* +// @match *://www.google.co.jp/search* +// @match *://www.google.co.ke/search* +// @match *://www.google.com.kh/search* +// @match *://www.google.ki/search* +// @match *://www.google.kg/search* +// @match *://www.google.co.kr/search* +// @match *://www.google.com.kw/search* +// @match *://www.google.kz/search* +// @match *://www.google.la/search* +// @match *://www.google.com.lb/search* +// @match *://www.google.li/search* +// @match *://www.google.lk/search* +// @match *://www.google.co.ls/search* +// @match *://www.google.lt/search* +// @match *://www.google.lu/search* +// @match *://www.google.lv/search* +// @match *://www.google.com.ly/search* +// @match *://www.google.co.ma/search* +// @match *://www.google.md/search* +// @match *://www.google.me/search* +// @match *://www.google.mg/search* +// @match *://www.google.mk/search* +// @match *://www.google.ml/search* +// @match *://www.google.com.mm/search* +// @match *://www.google.mn/search* +// @match *://www.google.ms/search* +// @match *://www.google.com.mt/search* +// @match *://www.google.mu/search* +// @match *://www.google.mv/search* +// @match *://www.google.mw/search* +// @match *://www.google.com.mx/search* +// @match *://www.google.com.my/search* +// @match *://www.google.co.mz/search* +// @match *://www.google.com.na/search* +// @match *://www.google.com.nf/search* +// @match *://www.google.com.ng/search* +// @match *://www.google.com.ni/search* +// @match *://www.google.ne/search* +// @match *://www.google.nl/search* +// @match *://www.google.no/search* +// @match *://www.google.com.np/search* +// @match *://www.google.nr/search* +// @match *://www.google.nu/search* +// @match *://www.google.co.nz/search* +// @match *://www.google.com.om/search* +// @match *://www.google.com.pa/search* +// @match *://www.google.com.pe/search* +// @match *://www.google.com.pg/search* +// @match *://www.google.com.ph/search* +// @match *://www.google.com.pk/search* +// @match *://www.google.pl/search* +// @match *://www.google.pn/search* +// @match *://www.google.com.pr/search* +// @match *://www.google.ps/search* +// @match *://www.google.pt/search* +// @match *://www.google.com.py/search* +// @match *://www.google.com.qa/search* +// @match *://www.google.ro/search* +// @match *://www.google.ru/search* +// @match *://www.google.rw/search* +// @match *://www.google.com.sa/search* +// @match *://www.google.com.sb/search* +// @match *://www.google.sc/search* +// @match *://www.google.se/search* +// @match *://www.google.com.sg/search* +// @match *://www.google.sh/search* +// @match *://www.google.si/search* +// @match *://www.google.sk/search* +// @match *://www.google.com.sl/search* +// @match *://www.google.sn/search* +// @match *://www.google.so/search* +// @match *://www.google.sm/search* +// @match *://www.google.sr/search* +// @match *://www.google.st/search* +// @match *://www.google.com.sv/search* +// @match *://www.google.td/search* +// @match *://www.google.tg/search* +// @match *://www.google.co.th/search* +// @match *://www.google.com.tj/search* +// @match *://www.google.tk/search* +// @match *://www.google.tl/search* +// @match *://www.google.tm/search* +// @match *://www.google.tn/search* +// @match *://www.google.to/search* +// @match *://www.google.com.tr/search* +// @match *://www.google.tt/search* +// @match *://www.google.com.tw/search* +// @match *://www.google.co.tz/search* +// @match *://www.google.com.ua/search* +// @match *://www.google.co.ug/search* +// @match *://www.google.co.uk/search* +// @match *://www.google.com.uy/search* +// @match *://www.google.co.uz/search* +// @match *://www.google.com.vc/search* +// @match *://www.google.co.ve/search* +// @match *://www.google.vg/search* +// @match *://www.google.co.vi/search* +// @match *://www.google.com.vn/search* +// @match *://www.google.vu/search* +// @match *://www.google.ws/search* +// @match *://www.google.rs/search* +// @match *://www.google.co.za/search* +// @match *://www.google.co.zm/search* +// @match *://www.google.co.zw/search* +// @match *://www.google.cat/search* +// @match https://*/* +// @match https://search.brave.com/* +// @match https://startpage.com/* +// @match https://www.startpage.com/* +// @match https://www.youtube.com/* +// @match https://github.com/* +// @match https://gitlab.com/* +// @match https://www.github.com/* +// @match https://www.amazon.com/* +// @match https://www.amazon.cn/* +// @match https://www.amazon.in/* +// @match https://www.amazon.co.jp/* +// @match https://www.amazon.co.uk/* +// @match https://www.amazon.ca/* +// @match https://www.amazon.fr/* +// @match https://www.amazon.de/* +// @match https://www.amazon.it/* +// @match https://www.amazon.es/* +// @match https://www.amazon.com.au/* +// @match https://www.amazon.com.mx/* +// @match https://www.amazon.com.br/* +// @match https://www.amazon.nl/* +// @match https://scholar.google.ad/* +// @match https://scholar.google.ae/* +// @match https://scholar.google.al/* +// @match https://scholar.google.am/* +// @match https://scholar.google.as/* +// @match https://scholar.google.at/* +// @match https://scholar.google.az/* +// @match https://scholar.google.ba/* +// @match https://scholar.google.be/* +// @match https://scholar.google.bf/* +// @match https://scholar.google.bg/* +// @match https://scholar.google.bi/* +// @match https://scholar.google.bj/* +// @match https://scholar.google.bs/* +// @match https://scholar.google.bt/* +// @match https://scholar.google.by/* +// @match https://scholar.google.ca/* +// @match https://scholar.google.cat/* +// @match https://scholar.google.cd/* +// @match https://scholar.google.cf/* +// @match https://scholar.google.cg/* +// @match https://scholar.google.ch/* +// @match https://scholar.google.ci/* +// @match https://scholar.google.cl/* +// @match https://scholar.google.cm/* +// @match https://scholar.google.cn/* +// @match https://scholar.google.co.ao/* +// @match https://scholar.google.co.bw/* +// @match https://scholar.google.co.ck/* +// @match https://scholar.google.co.cr/* +// @match https://scholar.google.co.id/* +// @match https://scholar.google.co.il/* +// @match https://scholar.google.co.in/* +// @match https://scholar.google.co.jp/* +// @match https://scholar.google.co.ke/* +// @match https://scholar.google.co.kr/* +// @match https://scholar.google.co.ls/* +// @match https://scholar.google.co.ma/* +// @match https://scholar.google.co.mz/* +// @match https://scholar.google.co.nz/* +// @match https://scholar.google.co.th/* +// @match https://scholar.google.co.tz/* +// @match https://scholar.google.co.ug/* +// @match https://scholar.google.co.uk/* +// @match https://scholar.google.co.uz/* +// @match https://scholar.google.co.ve/* +// @match https://scholar.google.co.vi/* +// @match https://scholar.google.co.za/* +// @match https://scholar.google.co.zm/* +// @match https://scholar.google.co.zw/* +// @match https://scholar.google.com.af/* +// @match https://scholar.google.com.ag/* +// @match https://scholar.google.com.ai/* +// @match https://scholar.google.com.ar/* +// @match https://scholar.google.com.au/* +// @match https://scholar.google.com.bd/* +// @match https://scholar.google.com.bh/* +// @match https://scholar.google.com.bn/* +// @match https://scholar.google.com.bo/* +// @match https://scholar.google.com.br/* +// @match https://scholar.google.com.bz/* +// @match https://scholar.google.com.co/* +// @match https://scholar.google.com.cu/* +// @match https://scholar.google.com.cy/* +// @match https://scholar.google.com.do/* +// @match https://scholar.google.com.ec/* +// @match https://scholar.google.com.eg/* +// @match https://scholar.google.com.et/* +// @match https://scholar.google.com.fj/* +// @match https://scholar.google.com.gh/* +// @match https://scholar.google.com.gi/* +// @match https://scholar.google.com.gt/* +// @match https://scholar.google.com.hk/* +// @match https://scholar.google.com.jm/* +// @match https://scholar.google.com.kh/* +// @match https://scholar.google.com.kw/* +// @match https://scholar.google.com.lb/* +// @match https://scholar.google.com.ly/* +// @match https://scholar.google.com.mm/* +// @match https://scholar.google.com.mt/* +// @match https://scholar.google.com.mx/* +// @match https://scholar.google.com.my/* +// @match https://scholar.google.com.na/* +// @match https://scholar.google.com.nf/* +// @match https://scholar.google.com.ng/* +// @match https://scholar.google.com.ni/* +// @match https://scholar.google.com.np/* +// @match https://scholar.google.com.om/* +// @match https://scholar.google.com.pa/* +// @match https://scholar.google.com.pe/* +// @match https://scholar.google.com.pg/* +// @match https://scholar.google.com.ph/* +// @match https://scholar.google.com.pk/* +// @match https://scholar.google.com.pr/* +// @match https://scholar.google.com.py/* +// @match https://scholar.google.com.qa/* +// @match https://scholar.google.com.sa/* +// @match https://scholar.google.com.sb/* +// @match https://scholar.google.com.sg/* +// @match https://scholar.google.com.sl/* +// @match https://scholar.google.com.sv/* +// @match https://scholar.google.com.tj/* +// @match https://scholar.google.com.tr/* +// @match https://scholar.google.com.tw/* +// @match https://scholar.google.com.ua/* +// @match https://scholar.google.com.uy/* +// @match https://scholar.google.com.vc/* +// @match https://scholar.google.com.vn/* +// @match https://scholar.google.com/* +// @match https://scholar.google.cv/* +// @match https://scholar.google.cz/* +// @match https://scholar.google.de/* +// @match https://scholar.google.dj/* +// @match https://scholar.google.dk/* +// @match https://scholar.google.dm/* +// @match https://scholar.google.dz/* +// @match https://scholar.google.ee/* +// @match https://scholar.google.es/* +// @match https://scholar.google.fi/* +// @match https://scholar.google.fm/* +// @match https://scholar.google.fr/* +// @match https://scholar.google.ga/* +// @match https://scholar.google.ge/* +// @match https://scholar.google.gg/* +// @match https://scholar.google.gl/* +// @match https://scholar.google.gm/* +// @match https://scholar.google.gp/* +// @match https://scholar.google.gr/* +// @match https://scholar.google.gy/* +// @match https://scholar.google.hn/* +// @match https://scholar.google.hr/* +// @match https://scholar.google.ht/* +// @match https://scholar.google.hu/* +// @match https://scholar.google.ie/* +// @match https://scholar.google.im/* +// @match https://scholar.google.iq/* +// @match https://scholar.google.is/* +// @match https://scholar.google.it/* +// @match https://scholar.google.je/* +// @match https://scholar.google.jo/* +// @match https://scholar.google.kg/* +// @match https://scholar.google.ki/* +// @match https://scholar.google.kz/* +// @match https://scholar.google.la/* +// @match https://scholar.google.li/* +// @match https://scholar.google.lk/* +// @match https://scholar.google.lt/* +// @match https://scholar.google.lu/* +// @match https://scholar.google.lv/* +// @match https://scholar.google.md/* +// @match https://scholar.google.me/* +// @match https://scholar.google.mg/* +// @match https://scholar.google.mk/* +// @match https://scholar.google.ml/* +// @match https://scholar.google.mn/* +// @match https://scholar.google.ms/* +// @match https://scholar.google.mu/* +// @match https://scholar.google.mv/* +// @match https://scholar.google.mw/* +// @match https://scholar.google.ne/* +// @match https://scholar.google.nl/* +// @match https://scholar.google.no/* +// @match https://scholar.google.nr/* +// @match https://scholar.google.nu/* +// @match https://scholar.google.pl/* +// @match https://scholar.google.pn/* +// @match https://scholar.google.ps/* +// @match https://scholar.google.pt/* +// @match https://scholar.google.ro/* +// @match https://scholar.google.rs/* +// @match https://scholar.google.ru/* +// @match https://scholar.google.rw/* +// @match https://scholar.google.sc/* +// @match https://scholar.google.se/* +// @match https://scholar.google.sh/* +// @match https://scholar.google.si/* +// @match https://scholar.google.sk/* +// @match https://scholar.google.sm/* +// @match https://scholar.google.sn/* +// @match https://scholar.google.so/* +// @match https://scholar.google.sr/* +// @match https://scholar.google.st/* +// @match https://scholar.google.td/* +// @match https://scholar.google.tg/* +// @match https://scholar.google.tk/* +// @match https://scholar.google.tl/* +// @match https://scholar.google.tm/* +// @match https://scholar.google.tn/* +// @match https://scholar.google.to/* +// @match https://scholar.google.tt/* +// @match https://scholar.google.vg/* +// @match https://scholar.google.vu/* +// @match https://scholar.google.ws/* +// ==/UserScript== +globalThis.IS_USERSCRIPT = true; + +const USE_GM = false; +const PREFIX = 'userscript-polyfill'; + +globalThis._localStorage_browser_polyfill = { + get: async (...args) => { + args = args.filter(Boolean); + debugger; + console.log('[localStorage] Get: ', ...args); + const out = {}; + for (const k of args) { + out[k] = USE_GM ? GM_getValue(k) : localStorage[`${PREFIX}_${k}`]; + } + return out; + }, + set: async (...args) => { + debugger; + console.log('[localStorage] Set: ', ...args); + }, + clear: async () => { + debugger; + console.log('[localStorage] Clear'); + }, +}; + +globalThis._browser_userscript_polyfill = { + runtime: { + sendMessage: (msg) => { + if (msg.type === 'tabsCreate') { + window.open(msg.options.url, '_blank'); + } + }, + id: '093889f3-43be-45e3-bc5a-e257e75b466d', + }, + storage: {sync: globalThis._localStorage_browser_polyfill, local: globalThis._localStorage_browser_polyfill}, + permissions: { + remove: () => {}, + add: () => {}, + request: () => {}, + getAll: () => ({}), + }, +}; +console.log(globalThis.browser, _browser_userscript_polyfill); +Object.assign(globalThis, {browser: globalThis._browser_userscript_polyfill, chrome: globalThis._browser_userscript_polyfill}); +(function(a,b){if("function"==typeof define&&define.amd)define("webextension-polyfill",["module"],b);else if("undefined"!=typeof exports)b(module);else{var c={exports:{}};b(c),a.browser=c.exports}})("undefined"==typeof globalThis?"undefined"==typeof self?this:self:globalThis,function(a){"use strict";if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(!(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)){a.exports=(a=>{const b={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(b).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class c extends WeakMap{constructor(a,b=void 0){super(b),this.createItem=a}get(a){return this.has(a)||this.set(a,this.createItem(a)),super.get(a)}}const d=a=>a&&"object"==typeof a&&"function"==typeof a.then,e=(b,c)=>(...d)=>{a.runtime.lastError?b.reject(new Error(a.runtime.lastError.message)):c.singleCallbackArg||1>=d.length&&!1!==c.singleCallbackArg?b.resolve(d[0]):b.resolve(d)},f=a=>1==a?"argument":"arguments",g=(a,b)=>function(c,...d){if(d.lengthb.maxArgs)throw new Error(`Expected at most ${b.maxArgs} ${f(b.maxArgs)} for ${a}(), got ${d.length}`);return new Promise((f,g)=>{if(b.fallbackToNoCallback)try{c[a](...d,e({resolve:f,reject:g},b))}catch(e){console.warn(`${a} API method doesn't seem to support the callback parameter, `+"falling back to call it without a callback: ",e),c[a](...d),b.fallbackToNoCallback=!1,b.noCallback=!0,f()}else b.noCallback?(c[a](...d),f()):c[a](...d,e({resolve:f,reject:g},b))})},h=(a,b,c)=>new Proxy(b,{apply(b,d,e){return c.call(d,a,...e)}});let i=Function.call.bind(Object.prototype.hasOwnProperty);const j=(a,b={},c={})=>{let d=Object.create(null),e=Object.create(a);return new Proxy(e,{has(b,c){return c in a||c in d},get(e,f){if(f in d)return d[f];if(!(f in a))return;let k=a[f];if("function"==typeof k){if("function"==typeof b[f])k=h(a,a[f],b[f]);else if(i(c,f)){let b=g(f,c[f]);k=h(a,a[f],b)}else k=k.bind(a);}else if("object"==typeof k&&null!==k&&(i(b,f)||i(c,f)))k=j(k,b[f],c[f]);else if(i(c,"*"))k=j(k,b[f],c["*"]);else return Object.defineProperty(d,f,{configurable:!0,enumerable:!0,get(){return a[f]},set(b){a[f]=b}}),k;return d[f]=k,k},set(b,c,e){return c in d?d[c]=e:a[c]=e,!0},defineProperty(a,b,c){return Reflect.defineProperty(d,b,c)},deleteProperty(a,b){return Reflect.deleteProperty(d,b)}})},k=a=>({addListener(b,c,...d){b.addListener(a.get(c),...d)},hasListener(b,c){return b.hasListener(a.get(c))},removeListener(b,c){b.removeListener(a.get(c))}}),l=new c(a=>"function"==typeof a?function(b){const c=j(b,{},{getContent:{minArgs:0,maxArgs:0}});a(c)}:a),m=new c(a=>"function"==typeof a?function(b,c,e){let f,g,h=!1,i=new Promise(a=>{f=function(b){h=!0,a(b)}});try{g=a(b,c,f)}catch(a){g=Promise.reject(a)}const j=!0!==g&&d(g);if(!0!==g&&!j&&!h)return!1;const k=a=>{a.then(a=>{e(a)},a=>{let b;b=a&&(a instanceof Error||"string"==typeof a.message)?a.message:"An unexpected error occurred",e({__mozWebExtensionPolyfillReject__:!0,message:b})}).catch(a=>{console.error("Failed to send onMessage rejected reply",a)})};return j?k(g):k(i),!0}:a),n=({reject:b,resolve:c},d)=>{a.runtime.lastError?a.runtime.lastError.message==="The message port closed before a response was received."?c():b(new Error(a.runtime.lastError.message)):d&&d.__mozWebExtensionPolyfillReject__?b(new Error(d.message)):c(d)},o=(a,b,c,...d)=>{if(d.lengthb.maxArgs)throw new Error(`Expected at most ${b.maxArgs} ${f(b.maxArgs)} for ${a}(), got ${d.length}`);return new Promise((a,b)=>{const e=n.bind(null,{resolve:a,reject:b});d.push(e),c.sendMessage(...d)})},p={devtools:{network:{onRequestFinished:k(l)}},runtime:{onMessage:k(m),onMessageExternal:k(m),sendMessage:o.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:o.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},q={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return b.privacy={network:{"*":q},services:{"*":q},websites:{"*":q}},j(a,p,b)})(chrome)}else a.exports=globalThis.browser}); +//# sourceMappingURL=browser-polyfill.min.js.map + +// webextension-polyfill v.0.12.0 (https://github.com/mozilla/webextension-polyfill) + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +/* mousetrap v1.6.5 craig.is/killing/mice */ +(function(q,u,c){function v(a,b,g){a.addEventListener?a.addEventListener(b,g,!1):a.attachEvent("on"+b,g)}function z(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);a.shiftKey||(b=b.toLowerCase());return b}return n[a.which]?n[a.which]:r[a.which]?r[a.which]:String.fromCharCode(a.which).toLowerCase()}function F(a){var b=[];a.shiftKey&&b.push("shift");a.altKey&&b.push("alt");a.ctrlKey&&b.push("ctrl");a.metaKey&&b.push("meta");return b}function w(a){return"shift"==a||"ctrl"==a||"alt"==a|| +"meta"==a}function A(a,b){var g,d=[];var e=a;"+"===e?e=["+"]:(e=e.replace(/\+{2}/g,"+plus"),e=e.split("+"));for(g=0;gc||n.hasOwnProperty(c)&&(p[n[c]]=c)}g=p[e]?"keydown":"keypress"}"keypress"==g&&d.length&&(g="keydown");return{key:m,modifiers:d,action:g}}function D(a,b){return null===a||a===u?!1:a===b?!0:D(a.parentNode,b)}function d(a){function b(a){a= +a||{};var b=!1,l;for(l in p)a[l]?b=!0:p[l]=0;b||(x=!1)}function g(a,b,t,f,g,d){var l,E=[],h=t.type;if(!k._callbacks[a])return[];"keyup"==h&&w(a)&&(b=[a]);for(l=0;l":".","?":"/","|":"\\"},B={option:"alt",command:"meta","return":"enter", +escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},p;for(c=1;20>c;++c)n[111+c]="f"+c;for(c=0;9>=c;++c)n[c+96]=c.toString();d.prototype.bind=function(a,b,c){a=a instanceof Array?a:[a];this._bindMultiple.call(this,a,b,c);return this};d.prototype.unbind=function(a,b){return this.bind.call(this,a,function(){},b)};d.prototype.trigger=function(a,b){if(this._directMap[a+":"+b])this._directMap[a+":"+b]({},a);return this};d.prototype.reset=function(){this._callbacks={}; +this._directMap={};return this};d.prototype.stopCallback=function(a,b){if(-1<(" "+b.className+" ").indexOf(" mousetrap ")||D(b,this.target))return!1;if("composedPath"in a&&"function"===typeof a.composedPath){var c=a.composedPath()[0];c!==a.target&&(b=c)}return"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable};d.prototype.handleKey=function(){return this._handleKey.apply(this,arguments)};d.addKeycodes=function(a){for(var b in a)a.hasOwnProperty(b)&&(n[b]=a[b]);p=null}; +d.init=function(){var a=d(u),b;for(b in a)"_"!==b.charAt(0)&&(d[b]=function(b){return function(){return a[b].apply(a,arguments)}}(b))};d.init();q.Mousetrap=d;"undefined"!==typeof module&&module.exports&&(module.exports=d);"function"===typeof define&&define.amd&&define(function(){return d})}})("undefined"!==typeof window?window:null,"undefined"!==typeof window?document:null); +(function(a){var c={},d=a.prototype.stopCallback;a.prototype.stopCallback=function(e,b,a,f){return this.paused?!0:c[a]||c[f]?!1:d.call(this,e,b,a)};a.prototype.bindGlobal=function(a,b,d){this.bind(a,b,d);if(a instanceof Array)for(b=0;b { + // Alternative: kb.split(/, */); + return kb.split(',').map((t) => t.trim()); +}; + +// eslint-disable-next-line no-unused-vars +const keybindingArrayToString = (kb) => { + return kb.join(', '); +}; + +/** + * @param {StorageArea} storage The storage area to which this section will + * write. + * @param {Object} defaultValues The default options. + * @constructor + */ +class BrowserStorage { + constructor(storage, defaultValues) { + this.storage = storage; + this.values = {}; + this.defaultValues = defaultValues; + } + load() { + // this.storage.get(null) returns all the data stored: + // https://developer.chrome.com/extensions/storage#method-StorageArea-get + return this.storage.get(null).then((values) => { + this.values = values; + // Prior to versions 0.4.* the keybindings were stored as strings, so we + // migrate them to arrays if needed. + let migrated = false; + for (const [key, value] of Object.entries(this.values)) { + if (!(key in DEFAULT_KEYBINDINGS) || Array.isArray(value)) { + continue; + } + migrated = true; + this.values[key] = keybindingStringToArray(value); + } + if (migrated) { + return this.save(); + } + }); + } + save() { + return this.storage.set(this.values); + } + get(key) { + const value = this.values[key]; + if (value != null) { + return value; + } + return this.defaultValues[key]; + } + set(key, value) { + this.values[key] = value; + } + clear() { + return this.storage.clear().then(() => { + this.values = {}; + }); + } + getAll() { + // Merge options from storage with defaults. + return { ...this.defaultValues, ...this.values }; + } +} + +const STORAGE_KEY = 'webSearchNavigator'; + +class LocalStorage { + constructor(defaultValues) { + this.values = {}; + this.defaultValues = defaultValues; + this.load(); + } + + load() { + const storedData = localStorage.getItem(STORAGE_KEY); + + if (storedData) { + this.values = JSON.parse(storedData); + } else { + this.values = { ...this.defaultValues }; + this.save(); + } + } + + save() { + localStorage.setItem(STORAGE_KEY, JSON.stringify(this.values)); + } + + get(key) { + const value = this.values[key]; + if (value != null) { + return value; + } + return this.defaultValues[key]; + } + + set(key, value) { + this.values[key] = value; + this.save(); + } + + clear() { + localStorage.removeItem(STORAGE_KEY); + this.values = { ...this.defaultValues }; + } + + getAll() { + // Merge options from storage with defaults. + return { ...this.defaultValues, ...this.values }; + } +} + +const createSyncedOptions = () => { + if (globalThis.IS_USERSCRIPT) { + console.log('Create LocalStorage options'); + return new LocalStorage(DEFAULT_OPTIONS); + } + return new BrowserStorage(browser.storage.sync, DEFAULT_OPTIONS); +}; + +// eslint-disable-next-line no-unused-vars +class ExtensionOptions { + constructor() { + this.sync = createSyncedOptions(); + if (globalThis.IS_USERSCRIPT) { + this.local = createSyncedOptions(); + return; + } + this.local = new BrowserStorage(browser.storage.local, { + lastQueryUrl: null, + lastFocusedIndex: 0, + }); + } + + load() { + return Promise.all([this.local.load(), this.sync.load()]); + } +} +/** + * This file contains search engine specific logic via search engine objects. + * + * A search engine object must provide the following: + * - {regex} urlPattern + * - {CSS selector} searchBoxSelector + * - {SearchResult[]} getSearchResults() + * + * Optional functions/properties: + * - {Array} tabs + * Default: {} + * - {int} getTopMargin: used if top results are not entirely visible + * Default: 0 + * - {int} getBottomMargin: used if bottom results are not entirely visible. + * Relevant for some search engines, since Firefox and Chrome show a tooltip + * with the URL of focused links at the bottom and can hide some of the + * search result at the bottom. + * Default: getDefaultBottomMargin() + * - {Function} onChangedResults: function for registering a callback on + * changed search results. The callback gets a single boolean parameter that + * is set to true if the only change is newly appended results. + * Default: null (meaning there's no support for such events) + * - {None} changeTools(period) + * + * Every SearchResult must provide the element and highlightClass properties and + * optionally the following: + * - {Callback} anchorSelector: callback for getting the anchor + * Default: the element itself + * - {Callback} highlightedElementSelector: callback for getting the + * highlighted element + * Default: the element itself + * - {Callback} containerSelector: callback for getting the container that + * needs to be visible when an element is selected. + * Default: the element itself + */ + +class SearchResult { + // We must declare the private class fields. + #element; + #anchorSelector; + #highlightedElementSelector; + #containerSelector; + + /** + * @param {Element} element + * @param {function|null} anchorSelector + * @param {string} highlightClass + * @param {function|null} highlightedElementSelector + * @param {function|null} containerSelector + */ + constructor( + element, + anchorSelector, + highlightClass, + highlightedElementSelector, + containerSelector, + ) { + this.#element = element; + this.#anchorSelector = anchorSelector; + this.highlightClass = highlightClass; + this.#highlightedElementSelector = highlightedElementSelector; + this.#containerSelector = containerSelector; + } + get anchor() { + if (!this.#anchorSelector) { + return this.#element; + } + return this.#anchorSelector(this.#element); + } + get container() { + if (!this.#containerSelector) { + return this.#element; + } + return this.#containerSelector(this.#element); + } + get highlightedElement() { + if (!this.#highlightedElementSelector) { + return this.#element; + } + return this.#highlightedElementSelector(this.#element); + } +} + +// eslint-disable-next-line +/** + * @param {Array} includedSearchResults An array of + * tuples. Each tuple contains collection of the search results optionally + * accompanied with their container selector. + * @constructor + */ +const getSortedSearchResults = ( + includedSearchResults, + excludedNodeList = [], +) => { + const excludedResultsSet = new Set(); + for (const node of excludedNodeList) { + excludedResultsSet.add(node); + } + const searchResults = []; + for (const results of includedSearchResults) { + for (const node of results.nodes) { + const searchResult = new SearchResult( + node, + results.anchorSelector, + results.highlightClass, + results.highlightedElementSelector, + results.containerSelector, + ); + const anchor = searchResult.anchor; + // Use offsetParent to exclude hidden elements, see: + // https://stackoverflow.com/a/21696585/1014208 + if ( + anchor != null && + !excludedResultsSet.has(anchor) && + anchor.offsetParent !== null + ) { + // Prevent adding the same node multiple times. + excludedResultsSet.add(anchor); + searchResults.push(searchResult); + } + } + } + // Sort searchResults by their document position. + searchResults.sort((a, b) => { + const position = a.anchor.compareDocumentPosition(b.anchor); + if (position & Node.DOCUMENT_POSITION_FOLLOWING) { + return -1; + } else if (position & Node.DOCUMENT_POSITION_PRECEDING) { + return 1; + } else { + return 0; + } + }); + return searchResults; +}; + +const getFixedSearchBoxTopMargin = (searchBoxContainer, element) => { + // When scrolling down, the search box can have a fixed position and can hide + // search results, so we try to compensate for it. + if (!searchBoxContainer || searchBoxContainer.contains(element)) { + return 0; + } + return searchBoxContainer.getBoundingClientRect().height; +}; + +// https://stackoverflow.com/a/7000222/2870889 +// eslint-disable-next-line no-unused-vars +const isFirefox = () => { + return navigator.userAgent.toLowerCase().indexOf('firefox') >= 0; +}; + +// eslint-disable-next-line no-unused-vars +const getDefaultBottomMargin = (element) => { + return 28; +}; + +const selectorElementGetter = (selector) => { + return () => { + return document.querySelector(selector); + }; +}; + +const nParent = (element, n) => { + while (n > 0 && element) { + element = element.parentElement; + n--; + } + return element; +}; + +const debounce = (callback, delayMs) => { + let timeoutId; + return (...args) => { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => { + return callback(...args); + }, delayMs); + }; +}; + +class GoogleSearch { + constructor(options) { + this.options = options; + } + get urlPattern() { + return /^https:\/\/(www\.)?google\./; + } + get searchBoxSelector() { + // Must match search engine search box + // NOTE: we used '#searchform input[name=q]' before 2020-06-05 but that + // doesn't work in the images search tab. Another option is to use + // 'input[role="combobox"]' but this doesn't work when there's also a + // dictionary search box. + // return '#searchform input[name=q]', + return 'form[role=search] [name=q]'; + } + getTopMargin(element) { + return getFixedSearchBoxTopMargin( + document.querySelector('#searchform.minidiv'), + element, + ); + } + getBottomMargin(element) { + return isFirefox() ? 0 : getDefaultBottomMargin(); + } + onChangedResults(callback) { + if (GoogleSearch.#isImagesTab()) { + return GoogleSearch.#onImageSearchResults(callback); + } + if (this.options.googleIncludeMemex) { + return GoogleSearch.#onMemexResults(callback); + } + // https://github.com/infokiller/web-search-navigator/issues/464 + const container = document.querySelector('#rcnt'); + if (!container) { + return; + } + const observer = new MutationObserver( + debounce((mutationsList, observer) => { + callback(true); + }, 50), + ); + observer.observe(container, { + attributes: false, + childList: true, + subtree: true, + }); + } + + static #isImagesTab() { + const searchParams = new URLSearchParams(window.location.search); + return searchParams.get('tbm') === 'isch'; + } + + static #getImagesTabResults() { + const includedElements = [ + // Image links + { + nodes: document.querySelectorAll('.islrc a[data-nav="1"]'), + highlightClass: 'wsn-google-focused-image', + }, + // Show more results button + { + nodes: document.querySelectorAll('#islmp [type="button"]'), + highlightClass: 'wsn-google-focused-image', + }, + ]; + return getSortedSearchResults(includedElements, []); + } + + static #regularResults() { + return [ + { + nodes: document.querySelectorAll('#search .r > a:first-of-type'), + highlightClass: 'wsn-google-focused-link', + containerSelector: (n) => n.parentElement.parentElement, + }, + { + nodes: document.querySelectorAll('#search .r g-link > a:first-of-type'), + highlightClass: 'wsn-google-focused-link', + containerSelector: (n) => n.parentElement.parentElement, + }, + // More results button in continous loading + // https://imgur.com/a/X9zyJ24 + { + nodes: document.querySelectorAll( + '#botstuff a[href^="/search"][href*="start="] h3', + ), + highlightClass: 'wsn-google-focused-link', + anchorSelector: (n) => n.closest('a'), + }, + // Continuously loaded results are *sometimes* in the #botstuff container + // https://imgur.com/a/s6ow0La + { + nodes: document.querySelectorAll('#botstuff a h3'), + highlightClass: 'wsn-google-focused-link', + containerSelector: (n) => nParent(n, 5), + highlightedElementSelector: (n) => nParent(n, 5), + anchorSelector: (n) => n.closest('a'), + }, + // Sometimes featured snippets are not contained in #search (possibly when + // there are large images?): https://imgur.com/a/VluRKIQ + { + nodes: document.querySelectorAll('.xpdopen .g a'), + highlightClass: 'wsn-google-focused-link', + highlightedElementSelector: (n) => n.querySelector('h3'), + }, + // Large YouTube video as top result: https://imgur.com/a/JIe62QV + { + nodes: document.querySelectorAll('h3 a[href*="youtube.com"]'), + highlightClass: 'wsn-google-focused-link', + highlightedElementSelector: (n) => n.closest('h3'), + }, + // Sub-results: https://imgur.com/a/CJePYJM + { + nodes: document.querySelectorAll('#search h3 a:first-of-type'), + highlightClass: 'wsn-google-focused-link', + highlightedElementSelector: (n) => n.closest('h3'), + containerSelector: (n) => n.closest('tr'), + }, + // Shopping results: https://imgur.com/a/wccM2iq + { + nodes: document.querySelectorAll('#rso a h4'), + anchorSelector: (n) => n.closest('a'), + highlightClass: 'wsn-google-focused-card', + highlightedElementSelector: (n) => n.closest('.sh-dgr__content'), + }, + // News tab: https://imgur.com/a/MR9q31f + { + nodes: document.querySelectorAll('#search g-card a'), + highlightClass: 'wsn-google-focused-link', + }, + // Jobs heading for the jobs cards section. Clicking on it takes you + // to Google's job search. + // As of 2023-05-28, the Google's jobs search URLs seem to contain two + // query string params which seem relevant: + // - ibp=htl;jobs + // - htivrt=jobs + // The first one matches the jobs heading, but also buttons in the + // jobs UI such as filtering by WFH/in-office. Therefore, we use the + // second one for specific jobs, but the first one to detect the jobs + // heading (otherwise it would be matched later in vaccines). + // eslint-disable-next-line max-len + // const jobsSelector = '#search a:is([href*="ibp=htl;jobs"], [href*="htivrt=jobs"])'; + // NOTE: this must be added to the included elements before: + // - vaccines + // - vertical maps + // - books and featured snippets + // TODO: add screenshot + { + nodes: document.querySelectorAll( + // eslint-disable-next-line max-len + '#search a:is([href*="ibp=htl;jobs"],[href*="htivrt=jobs"]) [role=heading][aria-level="2"]', + ), + anchorSelector: (n) => n.closest('a'), + // highlightedElementSelector: (n) => n.closest('li'), + highlightClass: 'wsn-google-focused-job-card', + }, + // Same as above, but for specific job results. + // TODO: add screenshot + // Jobs cards + { + // nodes: document.querySelectorAll('#search a[href*="htivrt=jobs"]'), + // eslint-disable-next-line max-len + nodes: document.querySelectorAll('#search li a[href*="htivrt=jobs"]'), + highlightedElementSelector: (n) => n.closest('li'), + highlightClass: 'wsn-google-focused-job-card', + }, + // Books tab: https://imgur.com/a/QSBIOb6 + // NOTE: This is required for matching "features snippets" in the general + // search tab, and also matches other results. + { + nodes: document.querySelectorAll('#search [data-hveid] a h3'), + anchorSelector: (n) => n.closest('a'), + containerSelector: (n) => n.closest('[data-hveid]'), + highlightedElementSelector: (n) => n.closest('[data-hveid]'), + highlightClass: 'wsn-google-focused-link', + }, + // Next/previous results page + { + nodes: document.querySelectorAll('#pnprev, #pnnext'), + highlightClass: 'wsn-google-card-item', + }, + ]; + } + + static #cardResults() { + const nearestChildOrSiblingOrParentAnchor = (element) => { + const childAnchor = element.querySelector('a'); + if (childAnchor && childAnchor.href) { + return childAnchor; + } + const siblingAnchor = element.parentElement.querySelector('a'); + if (siblingAnchor && siblingAnchor.href) { + return siblingAnchor; + } + return element.closest('a'); + }; + const nearestCardContainer = (element) => { + return element.closest('g-inner-card'); + }; + return [ + // Twitter: https://imgur.com/a/fdI75JG + { + nodes: document.querySelectorAll( + '#search [data-init-vis=true] [role=heading]', + ), + anchorSelector: nearestChildOrSiblingOrParentAnchor, + highlightedElementSelector: nearestCardContainer, + highlightClass: 'wsn-google-focused-card', + }, + // Vertical "Top stories" results + { + nodes: document.querySelectorAll('#search [role=text] [role=heading]'), + anchorSelector: nearestChildOrSiblingOrParentAnchor, + highlightClass: 'wsn-google-focused-link', + }, + // Vertical video results: https://imgur.com/a/GyKhwrx + // Vertical video results: https://imgur.com/a/8fbPnvT + { + nodes: document.querySelectorAll( + '#search video-voyager a [role=heading]', + ), + anchorSelector: nearestChildOrSiblingOrParentAnchor, + containerSelector: nearestChildOrSiblingOrParentAnchor, + highlightedElementSelector: nearestChildOrSiblingOrParentAnchor, + highlightClass: 'wsn-google-focused-link', + }, + // Horizontal video results: https://imgur.com/a/gRGJ7l9 + // People also search for: https://imgur.com/a/QpCHKt0 + { + nodes: document.querySelectorAll( + '#search g-scrolling-carousel g-inner-card a [role=heading]', + ), + anchorSelector: nearestChildOrSiblingOrParentAnchor, + containerSelector: nearestCardContainer, + highlightedElementSelector: nearestCardContainer, + highlightClass: 'wsn-google-card-item', + }, + // Vaccines: https://imgur.com/a/325qJzE + { + nodes: document.querySelectorAll( + '#search a.a-no-hover-decoration [role=heading]', + ), + anchorSelector: nearestChildOrSiblingOrParentAnchor, + containerSelector: nearestChildOrSiblingOrParentAnchor, + highlightedElementSelector: nearestChildOrSiblingOrParentAnchor, + highlightClass: 'wsn-google-focused-link', + }, + // Things to do in X: https://imgur.com/a/ibXwiuT + { + nodes: document.querySelectorAll('td a [role=heading]'), + anchorSelector: nearestChildOrSiblingOrParentAnchor, + containerSelector: (n) => n.closest('td'), + highlightedElementSelector: (n) => n.closest('td'), + highlightClass: 'wsn-google-card-item', + }, + // Vertical Maps/Places: https://imgur.com/a/JXrxBCj + // Vertical recipes: https://imgur.com/a/3r7klHk + // Top stories grid: https://imgur.com/a/mY93YRF + // TODO: fix the small movements in recipes item selection. + { + nodes: document.querySelectorAll('a [role=heading]'), + anchorSelector: nearestChildOrSiblingOrParentAnchor, + containerSelector: nearestChildOrSiblingOrParentAnchor, + highlightedElementSelector: nearestChildOrSiblingOrParentAnchor, + highlightClass: 'wsn-google-card-item', + }, + ]; + } + + static #placesResults() { + const nodes = document.querySelectorAll('.vk_c a'); + // The first node is usually the map image which needs to be styled + // differently. + let map; + let links = nodes; + if (nodes[0] != null && nodes[0].querySelector('img')) { + map = nodes[0]; + links = Array.from(nodes).slice(1); + } + const results = []; + if (map != null) { + results.push({ + nodes: [map], + highlightedElementSelector: (n) => n.parentElement, + highlightClass: 'wsn-google-focused-map', + }); + } + results.push({ + nodes: links, + highlightClass: 'wsn-google-focused-link', + }); + return results; + } + + static #memexResults() { + return [ + { + nodes: document.querySelectorAll( + '#memexResults ._3d3zwUrsb4CVi1Li4H6CBw a', + ), + highlightClass: 'wsn-google-focused-memex-result', + }, + ]; + } + + getSearchResults() { + if (GoogleSearch.#isImagesTab()) { + return GoogleSearch.#getImagesTabResults(); + } + const includedElements = GoogleSearch.#regularResults(); + if (this.options.googleIncludeCards) { + includedElements.push(...GoogleSearch.#cardResults()); + } + if (this.options.googleIncludePlaces) { + includedElements.push(...GoogleSearch.#placesResults()); + } + if (this.options.googleIncludeMemex) { + includedElements.push(...GoogleSearch.#memexResults()); + } + const excludedElements = document.querySelectorAll( + [ + // People also ask. Each one of the used selectors should be + // sufficient, but we use both to be more robust to upstream DOM + // changes. + '.related-question-pair a', + '#search .kp-blk:not(.c2xzTb) .r > a:first-of-type', + // Right hand sidebar. We exclude it because it is after all the + // results in the document order (as determined by + // Node.DOCUMENT_POSITION_FOLLOWING used in getSortedSearchResults), + // and it's confusing. + '#rhs a', + ].join(', '), + ); + return getSortedSearchResults(includedElements, excludedElements); + } + + static #onImageSearchResults(callback) { + const container = document.querySelector('.islrc'); + if (!container) { + return; + } + const observer = new MutationObserver( + debounce((mutationsList, observer) => { + callback(true); + }, 50), + ); + observer.observe(container, { + attributes: false, + childList: true, + subtree: false, + }); + } + + static #onMemexResults(callback) { + const container = document.querySelector('#rhs'); + if (!container) { + return; + } + const observer = new MutationObserver( + debounce((mutationsList, observer) => { + if (document.querySelector('#memexResults') != null) { + callback(true); + } + }, 50), + ); + observer.observe(container, { + attributes: false, + childList: true, + subtree: true, + }); + } + + static #imageSearchTabs() { + const visibleTabs = document.querySelectorAll('.T47uwc > a'); + // NOTE: The order of the tabs after the first two is dependent on the + // query. For example: + // - "cats": videos, news, maps + // - "trump": news, videos, maps + // - "california": maps, news, videos + return { + navigateSearchTab: visibleTabs[0], + navigateMapsTab: selectorElementGetter( + '.T47uwc > a[href*="maps.google."]', + ), + navigateVideosTab: selectorElementGetter('.T47uwc > a[href*="&tbm=vid"]'), + navigateNewsTab: selectorElementGetter('.T47uwc > a[href*="&tbm=nws"]'), + navigateShoppingTab: selectorElementGetter( + 'a[role="menuitem"][href*="&tbm=shop"]', + ), + navigateBooksTab: selectorElementGetter( + 'a[role="menuitem"][href*="&tbm=bks"]', + ), + navigateFlightsTab: selectorElementGetter( + 'a[role="menuitem"][href*="&tbm=flm"]', + ), + navigateFinancialTab: selectorElementGetter( + 'a[role="menuitem"][href*="/finance?"]', + ), + // TODO: Disable image search's default keybindings to avoid confusing the + // user, because the default keybindings can cause an indenepdent + // navigation of the image results with another outline. The code below + // doesn't work because the key event is captured by the image search + // code, since Moustrap is bound on document, instead of a more specific + // container. The following does work, but the code needs some changes to + // support binding on a specific container per search engine: + // + // Mousetrap(document.querySelector('.islrc')).bind ... + // Mousetrap(document.querySelector('#Sva75c')).bind ... + // + // navigatePreviousResultPage: null, + // navigateNextResultPage: null, + }; + } + + // Array storing tuples of tabs navigation keybindings and their corresponding + // CSS selector + get previousPageButton() { + if (GoogleSearch.#isImagesTab()) { + return null; + } + return selectorElementGetter('#pnprev'); + } + + get nextPageButton() { + if (GoogleSearch.#isImagesTab()) { + return null; + } + return selectorElementGetter('#pnnext'); + } + get tabs() { + if (GoogleSearch.#isImagesTab()) { + return GoogleSearch.#imageSearchTabs(); + } + return { + navigateSearchTab: selectorElementGetter( + // eslint-disable-next-line max-len + 'a[href*="/search?q="]:not([href*="&tbm="]):not([href*="maps.google."])', + ), + navigateImagesTab: selectorElementGetter('a[href*="&tbm=isch"]'), + navigateVideosTab: selectorElementGetter('a[href*="&tbm=vid"]'), + navigateMapsTab: selectorElementGetter('a[href*="maps.google."]'), + navigateNewsTab: selectorElementGetter('a[href*="&tbm=nws"]'), + navigateShoppingTab: selectorElementGetter('a[href*="&tbm=shop"]'), + navigateBooksTab: selectorElementGetter('a[href*="&tbm=bks"]'), + navigateFlightsTab: selectorElementGetter('a[href*="&tbm=flm"]'), + navigateFinancialTab: selectorElementGetter('[href*="/finance?"]'), + }; + } + + /** + * Filter the results based on special properties + * @param {*} period, filter identifier. Accepted filter are : + * 'a' : all results + * 'h' : last hour + * 'd' : last day + * 'w' : last week + * 'm' : last month + * 'y' : last year + * 'v' : verbatim search + * null : toggle sort + */ + // TODO: Refactor this function to get enums after migrating to typescript. + changeTools(period) { + const searchParams = new URLSearchParams(window.location.search); + // Use the last value of the tbs param in case there are multiple ones, + // since the last one overrides the previous ones. + const allTbsValues = searchParams.getAll('tbs'); + const lastTbsValue = allTbsValues[allTbsValues.length - 1] || ''; + const match = /(qdr:.|li:1)(,sbd:.)?/.exec(lastTbsValue); + const currentPeriod = (match && match[1]) || ''; + const currentSort = (match && match[2]) || ''; + if (period === 'a') { + searchParams.delete('tbs'); + } else if (period) { + let newTbs = ''; + if (period === 'v') { + if (currentPeriod === 'li:1') { + newTbs = ''; + } else { + newTbs = 'li:1'; + } + } else { + newTbs = `qdr:${period}`; + } + searchParams.set('tbs', `${newTbs}${currentSort}`); + // Can't apply sort when not using period. + } else if (currentPeriod) { + searchParams.set( + 'tbs', + `${currentPeriod}` + (currentSort ? '' : ',sbd:1'), + ); + } + const newSearchString = '?' + searchParams.toString(); + if (newSearchString !== window.location.search) { + window.location.search = newSearchString; + } + return false; + } + + changeImageSize(size) { + const sizeOptions = { + LARGE: {value: 0, name: 'Large', code: 'l'}, + MEDIUM: {value: 1, name: 'Medium', code: 'e'}, + ICON: {value: 2, name: 'Icon', code: 'i'}, + }; + const openTool = document.querySelector( + '[class="PNyWAd ZXJQ7c"][jsname="I4bIT"]', + ); + if (openTool != null) { + openTool.click(); + } + const openSizeDropDown = document.querySelector('[aria-label="Size"]'); + if (openSizeDropDown != null) { + openSizeDropDown.click(); + } + const dropDownWithSize = document.querySelector( + '[class="xFo9P r9PaP Fmo8N"][jsname="wLFV5d"]', + ); + const getButton = (selector) => { + let button; + if (document.querySelector(selector) != null) { + button = document.querySelector(selector); + } else { + button = null; + } + return button; + }; + const setImageSize = (dropDownWithSize, buttonSelector) => { + let button = getButton(buttonSelector); + if (dropDownWithSize == null && button != null) { + button.click(); + } else if (dropDownWithSize != null && button == null) { + dropDownWithSize.click(); + button = getButton(buttonSelector); + button.click(); + } else if (dropDownWithSize != null && button != null) { + button.click(); + } + }; + switch (size) { + case sizeOptions.LARGE.code: + if ( + dropDownWithSize == null || + dropDownWithSize.getAttribute('aria-label') != sizeOptions.LARGE.name + ) { + setImageSize( + dropDownWithSize, + '[class="MfLWbb"][aria-label="Large"]', + ); + } + break; + case sizeOptions.MEDIUM.code: + if ( + dropDownWithSize == null || + dropDownWithSize.getAttribute('aria-label') != sizeOptions.MEDIUM.name + ) { + setImageSize( + dropDownWithSize, + '[class="MfLWbb"][aria-label="Medium"]', + ); + } + break; + case sizeOptions.ICON.code: + if ( + dropDownWithSize == null || + dropDownWithSize.getAttribute('aria-label') != sizeOptions.ICON.name + ) { + setImageSize(dropDownWithSize, '[class="MfLWbb"][aria-label="Icon"]'); + } + break; + default: + break; + } + } +} + +class BraveSearch { + constructor(options) { + this.options = options; + } + + get urlPattern() { + return /^https:\/\/search\.brave\.com/; + } + + get searchBoxSelector() { + return '.form-input, input[id=searchbox]'; + } + + getTopMargin(element) { + return getFixedSearchBoxTopMargin( + document.querySelector('header.navbar'), + element, + ); + } + + onChangedResults(callback) { + const containers = document.querySelectorAll('#results'); + const observer = new MutationObserver( + debounce((mutationsList, observer) => { + callback(true); + }, 50), + ); + for (const container of containers) { + observer.observe(container, { + attributes: false, + childList: true, + subtree: true, + }); + } + } + + static #getNewsTabResults() { + const includedElements = [ + { + nodes: document.querySelectorAll('.snippet a'), + highlightClass: 'wsn-brave-search-focused-news', + containerSelector: (n) => n.parentElement, + }, + ]; + return getSortedSearchResults(includedElements); + } + + static #getVideosTabResults() { + const includedElements = [ + { + nodes: document.querySelectorAll('.card a'), + highlightClass: 'wsn-brave-search-focused-card', + highlightedElementSelector: (n) => n.closest('.card'), + containerSelector: (n) => n.parentElement, + }, + ]; + return getSortedSearchResults(includedElements); + } + + getSearchResults() { + if (BraveSearch.#isTabActive(this.tabs.navigateNewsTab)) { + return BraveSearch.#getNewsTabResults(); + } else if (BraveSearch.#isTabActive(this.tabs.navigateVideosTab)) { + return BraveSearch.#getVideosTabResults(); + } + + const includedElements = [ + { + nodes: document.querySelectorAll('.snippet.fdb > a'), + highlightClass: 'wsn-brave-search-focused-link', + containerSelector: (n) => n.parentElement, + }, + // News cards + { + nodes: document.querySelectorAll( + '.card[data-type="news"]:nth-child(-n+3)', + ), + highlightClass: 'wsn-brave-search-focused-card', + }, + // Video cards + { + nodes: document.querySelectorAll( + '.card[data-type="videos"]:nth-child(-n+3)', + ), + highlightClass: 'wsn-brave-search-focused-card', + }, + ]; + + return getSortedSearchResults(includedElements); + } + + static #isTabActive(tab) { + return tab && tab.parentElement.classList.contains('active'); + } + + get tabs() { + return { + navigateSearchTab: document.querySelector('a[href*="/search?q="]'), + navigateImagesTab: document.querySelector( + '#tab-images > a:first-of-type', + ), + navigateNewsTab: document.querySelector('a[href*="/news?q="]'), + navigateVideosTab: document.querySelector( + '#tab-videos > a:first-of-type', + ), + }; + } +} + +class StartPage { + constructor(options) { + this.options = options; + } + get urlPattern() { + return /^https:\/\/(www\.)?startpage\./; + } + get searchBoxSelector() { + return '#q'; + } + getTopMargin(element) { + return getFixedSearchBoxTopMargin( + document.querySelector('div.layout-web__header'), + element, + ); + } + getBottomMargin(element) { + // Startpage in Firefox has an issue where trying to scroll can result in + // window.scrollY being updated for a brief time although no scrolling is + // done, which confuses the scrollToElement function, which can lead to + // being stuck focused on a search result. + return isFirefox() ? 0 : getDefaultBottomMargin(); + } + + static #isSearchTab() { + return document.querySelector('div.layout-web') != null; + } + static #isImagesTab() { + return document.querySelector('div.layout-images') != null; + } + + getSearchResults() { + // Don't initialize results navigation on image search, since it doesn't + // work there. + if (StartPage.#isImagesTab()) { + return []; + } + const containerSelector = (element) => { + if (StartPage.#isSearchTab()) { + return element.closest('.w-gl__result'); + } + return element; + }; + const includedElements = [ + { + nodes: document.querySelectorAll('a.w-gl__result-url'), + highlightedElementSelector: containerSelector, + highlightClass: 'wsn-startpage-focused-link', + containerSelector: containerSelector, + }, + { + nodes: document.querySelectorAll('.pagination--desktop button'), + highlightClass: 'wsn-startpage-focused-link', + }, + // As of 2020-06-20, this doesn't seem to match anything. + { + nodes: document.querySelectorAll( + '.vo-sp.vo-sp--default > a.vo-sp__link', + ), + highlightedElementSelector: containerSelector, + highlightClass: 'wsn-startpage-focused-link', + }, + ]; + const excludedElements = document.querySelectorAll('button[disabled]'); + return getSortedSearchResults(includedElements, excludedElements); + } + + get previousPageButton() { + const menuLinks = document.querySelectorAll('.inline-nav-menu__link'); + if (!menuLinks || menuLinks.length < 4) { + return null; + } + + return document.querySelector( + 'form.pagination__form.next-prev-form--desktop:first-of-type', + ); + } + + get nextPageButton() { + const menuLinks = document.querySelectorAll('.inline-nav-menu__link'); + if (!menuLinks || menuLinks.length < 4) { + return null; + } + + return document.querySelector( + 'form.pagination__form.next-prev-form--desktop:last-of-type', + ); + } + + get tabs() { + const menuLinks = document.querySelectorAll('.inline-nav-menu__link'); + if (!menuLinks || menuLinks.length < 4) { + return {}; + } + return { + navigateSearchTab: menuLinks[0], + navigateImagesTab: menuLinks[1], + navigateVideosTab: menuLinks[2], + navigateNewsTab: menuLinks[3], + }; + } + + changeTools(period) { + const forms = document.forms; + let timeForm; + + for (let i = 0; i < forms.length; i++) { + if (forms[i].className === 'search-filter-time__form') { + timeForm = forms[i]; + } + } + + switch (period) { + case 'd': + timeForm.elements['with_date'][1].click(); + break; + case 'w': + timeForm.elements['with_date'][2].click(); + break; + case 'm': + timeForm.elements['with_date'][3].click(); + break; + case 'y': + timeForm.elements['with_date'][4].click(); + break; + default: + break; + } + } +} + +class YouTube { + constructor(options) { + this.options = options; + this.gridNavigation = false; + } + get urlPattern() { + return /^https:\/\/(www)\.youtube\./; + } + get searchBoxSelector() { + return 'input#search'; + } + getTopMargin(element) { + return getFixedSearchBoxTopMargin( + document.querySelector('#masthead-container'), + element, + ); + } + + onChangedResults(callback) { + // The ytd-section-list-renderer element may not exist yet when this code + // runs, so we look for changes in the higher level elements until we find + // ytd-section-list-renderer. + const YT_CONTAINER_SELECTOR = [ + 'ytd-section-list-renderer', + '.ytd-section-list-renderer', + 'ytd-rich-grid-renderer', + 'ytd-shelf-renderer', + ].join(','); + const resultsObserver = new MutationObserver( + debounce((mutationsList, observer) => { + callback(true); + }, 50), + ); + let lastLoadedURL = null; + const pageObserverCallback = (mutationsList, observer) => { + const url = window.location.pathname + window.location.search; + if (url === lastLoadedURL) { + return; + } else { + resultsObserver.disconnect(); + } + const containers = document.querySelectorAll(YT_CONTAINER_SELECTOR); + if (containers.length == 0) { + return; + } + lastLoadedURL = url; + callback(false); + for (const container of containers) { + resultsObserver.observe(container, { + attributes: false, + childList: true, + subtree: true, + }); + } + }; + // TODO: the observer callback is triggered many times because of the broad + // changes that the observer tracks. I tried to use other observation specs + // to limit it, but then it failed to detect URL changes without page load + // (which is what happened in issue #337 [1]). + // [1] https://github.com/infokiller/web-search-navigator/issues/337 + const pageObserver = new MutationObserver( + debounce(pageObserverCallback, 50), + ); + pageObserver.observe(document.querySelector('#page-manager'), { + attributes: false, + childList: true, + subtree: true, + }); + } + + getSearchResults() { + const includedElements = [ + // Videos in vertical search results: https://imgur.com/a/Z8KV5Oe + { + nodes: document.querySelectorAll('a#video-title.ytd-video-renderer'), + highlightClass: 'wsn-youtube-focused-video', + highlightedElementSelector: (n) => n.closest('ytd-video-renderer'), + containerSelector: (n) => n.closest('ytd-video-renderer'), + }, + // Playlist results in vertical search results: https://imgur.com/a/nPjGd9H + { + nodes: document.querySelectorAll( + 'ytd-playlist-renderer a[href*="/playlist"]', + ), + highlightClass: 'wsn-youtube-focused-video', + highlightedElementSelector: (n) => n.closest('ytd-playlist-renderer'), + containerSelector: (n) => n.closest('ytd-playlist-renderer'), + }, + // Playlists + { + nodes: document.querySelectorAll('a.ytd-playlist-video-renderer'), + highlightClass: 'wsn-youtube-focused-video', + highlightedElementSelector: (n) => + n.closest('ytd-playlist-video-renderer'), + containerSelector: (n) => n.closest('ytd-playlist-video-renderer'), + }, + // Mixes + { + nodes: document.querySelectorAll('div#content a.ytd-radio-renderer'), + highlightClass: 'wsn-youtube-focused-video', + }, + // Channels + { + nodes: document.querySelectorAll( + 'ytd-grid-video-renderer a#video-title:not([aria-hidden="true"])', + ), + highlightClass: 'wsn-youtube-focused-grid-video', + highlightedElementSelector: (n) => n.closest('ytd-grid-video-renderer'), + containerSelector: (n) => n.closest('ytd-grid-video-renderer'), + }, + ]; + // checking if homepage results are present + const homePageElements = { + nodes: document.querySelectorAll( + 'ytd-rich-item-renderer a#video-title-link', + ), + highlightClass: 'wsn-youtube-focused-video', + highlightedElementSelector: (n) => n.closest('ytd-rich-item-renderer'), + containerSelector: (n) => n.closest('ytd-rich-item-renderer'), + }; + const results = getSortedSearchResults( + [...includedElements, homePageElements], + [], + ); + // When navigating away from the home page, the home page elements are still + // in the DOM but they are not visible, so we must check if they are + // visible (using offsetParent), not just if they are present. + const isHomePage = Array.from(homePageElements.nodes).some( + (n) => n.offsetParent != null, + ); + const gridRow = document.querySelector('ytd-rich-grid-row'); + if (isHomePage && gridRow != null) { + results.itemsPerRow = gridRow.getElementsByTagName( + 'ytd-rich-item-renderer', + ).length; + results.gridNavigation = results.itemsPerRow > 0; + } + return results; + } + + changeTools(period) { + if (!document.querySelector('div#collapse-content')) { + const toggleButton = document.querySelectorAll( + 'a.ytd-toggle-button-renderer', + )[0]; + // Toggling the buttons ensures that div#collapse-content is loaded + toggleButton.click(); + toggleButton.click(); + } + const forms = document.querySelectorAll( + 'div#collapse-content > *:first-of-type ytd-search-filter-renderer', + ); + let neededForm = null; + switch (period) { + case 'h': + neededForm = forms[0]; + break; + case 'd': + neededForm = forms[1]; + break; + case 'w': + neededForm = forms[2]; + break; + case 'm': + neededForm = forms[3]; + break; + case 'y': + neededForm = forms[4]; + break; + } + if (neededForm) { + neededForm.childNodes[1].click(); + } + } +} + +class GoogleScholar { + constructor(options) { + this.options = options; + } + get urlPattern() { + return /^https:\/\/scholar\.google\./; + } + get searchBoxSelector() { + return '#gs_hdr_tsi'; + } + + getSearchResults() { + const includedElements = [ + { + nodes: document.querySelectorAll('.gs_rt a'), + highlightClass: 'wsn-google-focused-link', + highlightedElementSelector: (n) => n.closest('.gs_rt'), + containerSelector: (n) => n.parentElement.parentElement, + }, + { + nodes: document.querySelectorAll( + '.gs_ico_nav_previous, .gs_ico_nav_next', + ), + anchorSelector: (n) => n.parentElement, + highlightClass: 'wsn-google-scholar-next-page', + highlightedElementSelector: (n) => n.parentElement.children[1], + containerSelector: (n) => n.parentElement.children[1], + }, + ]; + return getSortedSearchResults(includedElements, []); + } + + get previousPageButton() { + const previousPageElement = document.querySelector('.gs_ico_nav_previous'); + if (previousPageElement !== null) { + return previousPageElement.parentElement; + } + + return null; + } + + get nextPageButton() { + const nextPageElement = document.querySelector('.gs_ico_nav_next'); + if (nextPageElement !== null) { + return nextPageElement.parentElement; + } + return null; + } +} + +class Amazon { + constructor(options) { + this.options = options; + } + get urlPattern() { + return /^https:\/\/(www\.)?amazon\./; + } + get searchBoxSelector() { + return '#twotabsearchtextbox'; + } + onChangedResults(callback) { + const container = document.querySelector('.s-main-slot'); + if (!container) { + return; + } + const observer = new MutationObserver( + debounce((mutationsList, observer) => { + callback(false); + }, 50), + ); + observer.observe(container, { + attributes: false, + childList: true, + subtree: false, + }); + } + + getSearchResults() { + const includedElements = [ + // Carousel items + { + nodes: document.querySelectorAll( + '.s-main-slot .a-carousel-card h2 .a-link-normal.a-text-normal', + ), + highlightedElementSelector: (n) => n.closest('.a-carousel-card'), + highlightClass: 'wsn-amazon-focused-carousel-item', + containerSelector: (n) => n.closest('.a-carousel-card'), + }, + // Regular items. + // NOTE: Must appear after the carousel items because this selector is + // more general. + { + nodes: document.querySelectorAll( + '.s-main-slot h2 .a-link-normal.a-text-normal', + ), + // highlightedElementSelector: (n) => n.parentElement.children[1], + highlightedElementSelector: (n) => + n.closest('.a-section').parentElement.closest('.a-section'), + highlightClass: 'wsn-amazon-focused-item', + containerSelector: (n) => + n.closest('.a-section').parentElement.closest('.a-section'), + }, + // Next/previous and page numbers. + { + nodes: document.querySelectorAll('a.s-pagination-item'), + highlightClass: 'wsn-amazon-focused-item', + }, + // Shopping card items + { + nodes: document.querySelectorAll( + '.sc-list-item-content .a-list-item .a-link-normal', + ), + highlightClass: 'wsn-amazon-focused-cart-item', + highlightedElementSelector: (n) => n.closest('.sc-list-item-content'), + containerSelector: (n) => n.closest('.sc-list-item-content'), + }, + ]; + // Exclude active page number and hidden carousel elements. + // TODO: The hidden carousel elements do not match at page load because + // they don't yet have the aria-hidden property set. + const excludedElements = document.querySelectorAll( + '.a-pagination .a-selected a, .a-carousel-card[aria-hidden="true"] a', + ); + return getSortedSearchResults(includedElements, excludedElements); + } + + get previousPageButton() { + return document.querySelector('a.s-pagination-previous'); + } + + get nextPageButton() { + return document.querySelector('a.s-pagination-next'); + } +} + +class Github { + constructor(options) { + this.options = options; + } + get urlPattern() { + return /^https:\/\/(www\.)?github\.com/; + } + get searchBoxSelector() { + // TODO: With the escape key, this only works the first time the keybinding + // is used, Since Github seem to capture this as well, which causes it to + // leave the search box. + return 'input[name="q"]'; + } + + static #getCommitSearchLinks() { + const commitsContainers = document.querySelectorAll( + '#commit_search_results .text-normal', + ); + const commits = []; + for (const con of commitsContainers) { + const links = con.querySelectorAll('a'); + if (links.length === 0) { + continue; + } + if (links.length === 1) { + commits.push(links[0]); + } else { + const prLink = con.querySelector( + 'a[data-hovercard-type="pull_request"]', + ); + if (prLink != null) { + commits.push(prLink); + } + } + } + return commits; + } + + getSearchResults() { + const includedElements = [ + // Repos + { + nodes: document.querySelectorAll('.repo-list a'), + highlightClass: 'wsn-github-focused-item', + containerSelector: (n) => n.closest('.mt-n1'), + }, + // Code + { + nodes: document.querySelectorAll('#code_search_results .text-normal a'), + highlightClass: 'wsn-github-focused-item', + }, + // Commits/PRs + { + nodes: Github.#getCommitSearchLinks(), + highlightClass: 'wsn-github-focused-item', + }, + // Issues + { + nodes: document.querySelectorAll( + '#issue_search_results .text-normal a', + ), + highlightClass: 'wsn-github-focused-item', + }, + // Marketplace + { + nodes: document.querySelectorAll( + '#marketplace_search_results .text-normal a', + ), + highlightClass: 'wsn-github-focused-item', + }, + // Topics + { + nodes: document.querySelectorAll( + '#topic_search_results .text-normal a', + ), + highlightClass: 'wsn-github-focused-item', + }, + // Wikis + { + nodes: document.querySelectorAll('#wiki_search_results .text-normal a'), + highlightClass: 'wsn-github-focused-item', + }, + // Users + { + nodes: document.querySelectorAll('#user_search_results .text-normal a'), + highlightClass: 'wsn-github-focused-item', + }, + // Pinned repos in user profile + { + nodes: document.querySelectorAll( + '.pinned-item-list-item-content span.repo', + ), + highlightClass: 'wsn-github-focused-item', + highlightedElementSelector: (n) => n.closest('a'), + containerSelector: (n) => n.closest('a'), + anchorSelector: (n) => n.closest('a'), + }, + // Personal repos list in user profile + { + nodes: document.querySelectorAll( + '#user-repositories-list a[itemprop*="codeRepository"]', + ), + highlightClass: 'wsn-github-focused-item', + containerSelector: (n) => n.closest('li') || n, + }, + // Next/previous and page numbers. + { + nodes: document.querySelectorAll('.paginate-container a'), + highlightClass: 'wsn-github-focused-pagination', + }, + ]; + const searchParams = new URLSearchParams(window.location.search); + // Starred repos of user + if (searchParams.get('tab') === 'stars') { + includedElements.push({ + nodes: document.querySelectorAll('h3 a'), + highlightClass: 'wsn-github-focused-item', + }); + } + const excludedElements = [ + // Exclude small links + ...document.querySelectorAll('.muted-link, .Link--muted'), + // Exclude topic tags + ...document.querySelectorAll('.topic-tag'), + // Exclude small links in commits + // ...document.querySelectorAll( + // '#commit_search_results .text-normal a.message'), + ]; + return getSortedSearchResults(includedElements, excludedElements); + } + + onChangedResults(callback) { + const container = document.querySelector('body'); + if (!container) { + return; + } + // Store the last URL to detect page navigations (for example going to the + // next page of results). + let lastURL = window.location.href; + const observer = new MutationObserver( + debounce((mutationsList, observer) => { + let appendOnly = true; + if (window.location.href !== lastURL) { + lastURL = window.location.href; + appendOnly = false; + } + callback(appendOnly); + }, 50), + ); + observer.observe(container, { + attributes: false, + childList: true, + subtree: false, + }); + } + + // Github already has built-in support for tabs: + // https://docs.github.com/en/github/getting-started-with-github/keyboard-shortcuts + get tabs() { + return {}; + } +} + +class Gitlab { + constructor(options) { + this.options = options; + } + + get urlPattern() { + return /^https:\/\/(www\.)?gitlab\.com/; + } + + get searchBoxSelector() { + return '.form-input, input[id=search]'; + } + + getTopMargin(element) { + return getFixedSearchBoxTopMargin( + document.querySelector('header.navbar'), + element, + ); + } + + onChangedResults(callback) { + const containers = document.querySelectorAll( + '.projects-list, .groups-list, #content-body', + ); + const observer = new MutationObserver(async (mutationsList, observer) => { + callback(true); + }); + for (const container of containers) { + observer.observe(container, { + attributes: false, + childList: true, + subtree: true, + }); + } + } + + getSearchResults() { + const includedElements = [ + { + nodes: document.querySelectorAll('li.project-row h2 a'), + containerSelector: (n) => n.closest('li.project-row'), + highlightedElementSelector: (n) => n.closest('li.project-row'), + highlightClass: 'wsn-gitlab-focused-group-row', + }, + // Org subgroups, for example: + // https://gitlab.archlinux.org/archlinux + { + nodes: document.querySelectorAll( + 'ul.groups-list li.group-row a[aria-label]', + ), + containerSelector: (n) => n.closest('li.group-row'), + highlightedElementSelector: (n) => n.closest('li.group-row'), + highlightClass: 'wsn-gitlab-focused-group-row', + }, + // Prev/next page + { + nodes: document.querySelectorAll('li.page-item a.page-link'), + containerSelector: (n) => n.closest('li.page-item'), + highlightedElementSelector: (n) => n.closest('li.group-row'), + highlightClass: 'wsn-gitlab-focused-group-row', + }, + ]; + return getSortedSearchResults(includedElements); + } +} + +class CustomGitlab extends Gitlab { + get urlPattern() { + return new RegExp(this.options.customGitlabUrl); + } +} + +// Get search engine object matching the current url +/* eslint-disable-next-line no-unused-vars */ +const getSearchEngine = (options) => { + const searchEngines = [ + new GoogleSearch(options), + new BraveSearch(options), + new StartPage(options), + new YouTube(options), + new GoogleScholar(options), + new Amazon(options), + new Github(options), + new Gitlab(options), + new CustomGitlab(options), + ]; + // Switch over all compatible search engines + const href = window.location.href; + for (let i = 0; i < searchEngines.length; i++) { + if (href.match(searchEngines[i].urlPattern)) { + return searchEngines[i]; + } + } + return null; +}; +/* global ExtensionOptions, getSearchEngine, Mousetrap */ +/* global getDefaultBottomMargin */ + +// TODO: Replace with enums when switching to typescript. +const FOCUS_SCROLL_OFF = 0; +const FOCUS_SCROLL_ON = 1; +const FOCUS_SCROLL_ONLY = 2; + +// Returns true if scrolling was done. +const scrollToElement = (searchEngine, element) => { + if (element == null) { + console.error('Cannot scroll to null element'); + return; + } + let topMargin = 0; + if (searchEngine.getTopMargin) { + topMargin = searchEngine.getTopMargin(element); + } + let bottomMargin = getDefaultBottomMargin(); + if (searchEngine.getBottomMargin) { + bottomMargin = searchEngine.getBottomMargin(element); + } + const elementBounds = element.getBoundingClientRect(); + const scrollY = window.scrollY; + if (elementBounds.top < topMargin) { + // scroll element to top + element.scrollIntoView(true); + window.scrollBy(0, -topMargin); + } else if (elementBounds.bottom + bottomMargin > window.innerHeight) { + // scroll element to bottom + element.scrollIntoView(false); + window.scrollBy(0, bottomMargin); + } + return Math.abs(window.scrollY - scrollY) > 0.01; +}; + +const bindKeys = (bindings, toggle) => { + // NOTE: Mousetrap calls the handler even if there's a larger sequence that + // ends with the same key. For example, if the user binds both 'a b' and + // 'b', when pressing the sequence 'a b' both handlers will be called, which + // is not the desired behavior for this extension. Therefore, we first sort + // all keybindings by their sequence length, so that handlers of larger + // sequences will be called before the shorter ones. Then, we only call + // other handlers if the previous handler returned true. + bindings.sort((a, b) => { + return b[0].split(' ').length - a[0].split(' ').length; + }); + let lastEvent; + let lastHandlerResult; + for (const [shortcut, element, global, callback] of bindings) { + const wrappedCallback = (event) => { + if (!toggle['active']) { + return true; + } + if (event === lastEvent && !lastHandlerResult) { + return; + } + lastEvent = event; + lastHandlerResult = callback(event); + return lastHandlerResult; + }; + if (global) { + /* eslint-disable-next-line new-cap */ + Mousetrap(element).bindGlobal(shortcut, wrappedCallback); + } else { + /* eslint-disable-next-line new-cap */ + Mousetrap(element).bind(shortcut, wrappedCallback); + } + } +}; + +class SearchResultsManager { + constructor(searchEngine, options) { + this.searchEngine = searchEngine; + this.options = options; + this.focusedIndex = -1; + this.isInitialFocusSet = false; + } + + reloadSearchResults() { + this.searchResults = this.searchEngine.getSearchResults(); + if (!this.isInitialFocusSet) { + this.setInitialFocus(); + } + } + + setInitialFocus() { + if (this.searchResults.length === 0) { + return; + } + const lastNavigation = this.options.local.values; + if ( + location.href === lastNavigation.lastQueryUrl && + lastNavigation.lastFocusedIndex >= 0 && + lastNavigation.lastFocusedIndex < this.searchResults.length + ) { + this.focus(lastNavigation.lastFocusedIndex, FOCUS_SCROLL_ON); + } else if (this.options.sync.get('autoSelectFirst')) { + // Highlight the first result when the page is loaded, but don't scroll to + // it because there may be KP cards such as stock graphs. + this.focus(0, FOCUS_SCROLL_OFF); + } + } + + /** + * Returns the element to click on upon navigation. The focused element in the + * document is preferred (if there is one) over the highlighted result. Note + * that the focused element does not have to be an anchor element. + * + * @param {boolean} linkOnly If true the focused element is preferred only + * when it is a link with "href" attribute. + * @return {Element} + */ + getElementToNavigate(linkOnly = false) { + const focusedElement = document.activeElement; + // StartPage seems to still focus and change it to body when the page loads. + if (focusedElement == null || focusedElement.localName === 'body') { + if ( + this.focusedIndex < 0 || + this.focusedIndex >= this.searchResults.length + ) { + return null; + } + return this.searchResults[this.focusedIndex].anchor; + } + const isLink = + focusedElement.localName === 'a' && focusedElement.hasAttribute('href'); + if (!linkOnly || isLink) { + return focusedElement; + } + } + + highlight(searchResult) { + const highlighted = searchResult.highlightedElement; + if (highlighted == null) { + console.error('No element to highlight: %o', highlighted); + return; + } + highlighted.classList.add(searchResult.highlightClass); + if ( + this.options.sync.get('hideOutline') || + searchResult.anchor !== highlighted + ) { + searchResult.anchor.classList.add('wsn-no-outline'); + } + } + + unhighlight(searchResult) { + const highlighted = searchResult.highlightedElement; + if (highlighted == null) { + console.error('No element to unhighlight: %o', highlighted); + return; + } + highlighted.classList.remove(searchResult.highlightClass); + highlighted.classList.remove('wsn-no-outline'); + } + + focus(index, scroll = FOCUS_SCROLL_ONLY) { + if (this.focusedIndex >= 0) { + const searchResult = this.searchResults[this.focusedIndex]; + // If the current result is outside the viewport and FOCUS_SCROLL_ONLY was + // requested, scroll to the current hidden result, but don't focus on the + // new result. + // This behavior is intended to handle cases where the user scrolls away + // from the currently focused result and then presses the keybindings to + // focus on the previous/next result. In this case, since the user + // doesn't see the current result, it's more intuitive to only scroll to + // the current result, and then on the next keypress they can focus on the + // previous/next result and actually see on what result they want to focus + // on. + if ( + scroll === FOCUS_SCROLL_ONLY && + scrollToElement(this.searchEngine, searchResult.container) + ) { + return; + } + // Remove highlighting from previous item. + this.unhighlight(searchResult); + } + const searchResult = this.searchResults[index]; + if (!searchResult) { + this.focusedIndex = -1; + return; + } + this.highlight(searchResult); + // We already scroll below, so no need for focus to scroll. The scrolling + // behavior of `focus` also seems less predictable and caused an issue, see: + // https://github.com/infokiller/web-search-navigator/issues/35 + searchResult.anchor.focus({preventScroll: true}); + // Ensure whole search result container is visible in the viewport, not only + // the search result link. + if (scroll !== FOCUS_SCROLL_OFF) { + scrollToElement(this.searchEngine, searchResult.container); + } + this.focusedIndex = index; + this.isInitialFocusSet = true; + } + + focusNext(shouldWrap) { + if (this.focusedIndex < this.searchResults.length - 1) { + this.focus(this.focusedIndex + 1); + } else if (shouldWrap) { + this.focus(0); + } + } + + focusPrevious(shouldWrap) { + if (this.focusedIndex > 0) { + this.focus(this.focusedIndex - 1); + } else if (shouldWrap) { + this.focus(this.searchResults.length - 1); + } else { + window.scrollTo(window.scrollX, 0); + } + } + + focusDown(shouldWrap) { + if ( + this.focusedIndex + this.searchResults.itemsPerRow < + this.searchResults.length + ) { + this.focus(this.focusedIndex + this.searchResults.itemsPerRow); + } else if (shouldWrap) { + const focusedRowIndex = + this.focusedIndex % this.searchResults.itemsPerRow; + this.focus(focusedRowIndex); + } + } + + focusUp(shouldWrap) { + if (this.focusedIndex - this.searchResults.itemsPerRow >= 0) { + this.focus(this.focusedIndex - this.searchResults.itemsPerRow); + } else if (shouldWrap) { + const focusedRowIndex = + this.focusedIndex % this.searchResults.itemsPerRow; + this.focus( + this.searchResults - + 1 - + this.searchResults.itemsPerRow + + focusedRowIndex, + ); + } else { + window.scrollTo(window.scrollY, 0); + } + } +} + +class WebSearchNavigator { + constructor() { + this.bindings = []; + this.bindingsToggle = {active: true}; + } + + async init() { + this.options = new ExtensionOptions(); + await this.options.load(); + this.searchEngine = await getSearchEngine(this.options.sync.getAll()); + if (this.searchEngine == null) { + return; + } + const sleep = (milliseconds) => { + return new Promise((resolve) => setTimeout(resolve, milliseconds)); + }; + await sleep(this.options.sync.get('delay')); + this.injectCSS(); + this.initKeybindings(); + } + + injectCSS() { + const style = document.createElement('style'); + style.textContent = this.options.sync.get('customCSS'); + document.head.append(style); + } + + initKeybindings() { + this.bindingsToggle['active'] = false; + for (const [shortcut, element, ,] of this.bindings) { + /* eslint-disable-next-line new-cap */ + const ms = Mousetrap(element); + ms.unbind(shortcut); + ms.reset(); + } + const isFirstCall = this.bindings.length === 0; + this.bindings = []; + // UGLY WORKAROUND: Results navigation breaks YouTube space keybinding for + // pausing/resuming a video. A workaround is to click on an element on the + // page (except the video), but for now I'm disabling results navigation + // when watching a video. + // TODO: Find a proper fix. + if (!window.location.href.match(/^https:\/\/(www)\.youtube\.com\/watch/)) { + this.initResultsNavigation(isFirstCall); + } + this.initTabsNavigation(); + this.initChangeToolsNavigation(); + this.initSearchInputNavigation(); + this.bindingsToggle = {active: true}; + bindKeys(this.bindings, this.bindingsToggle); + } + + initSearchInputNavigation() { + let searchInput = document.querySelector( + this.searchEngine.searchBoxSelector, + ); + if (searchInput == null) { + return; + } + // Only apply the extension logic if the key is not something the user may + // have wanted to type into the searchbox, so that we don't interfere with + // regular typing. + const shouldHandleSearchInputKey = (event) => { + return event.ctrlKey || event.metaKey || event.key === 'Escape'; + }; + // In Github, the search input element changes while in the page, so we + // redetect it if it's not visible. + const detectSearchInput = () => { + if (searchInput != null && searchInput.offsetParent != null) { + return true; + } + searchInput = document.querySelector(this.searchEngine.searchBoxSelector); + return searchInput != null && searchInput.offsetParent != null; + }; + // If insideSearchboxHandler returns true, outsideSearchboxHandler will also + // be called (because it's defined on document, hence has lower priority), + // in which case we don't want to handle the event. Therefore, we store the + // last event handled in insideSearchboxHandler, and only handle the event + // in outsideSearchboxHandler if it's not the same one. + let lastEvent; + const outsideSearchboxHandler = (event) => { + if (!detectSearchInput()) { + return; + } + if (event === lastEvent) { + return !shouldHandleSearchInputKey(event); + } + const element = document.activeElement; + if ( + element.isContentEditable || + ['textarea', 'input'].includes(element.tagName.toLowerCase()) + ) { + return true; + } + // Scroll to the search box in case it's outside the viewport so that it's + // clear to the user that it has focus. + scrollToElement(this.searchEngine, searchInput); + searchInput.select(); + // searchInput.click(); + return false; + }; + const insideSearchboxHandler = (event) => { + if (!detectSearchInput()) { + return; + } + lastEvent = event; + if (!shouldHandleSearchInputKey(event)) { + return true; + } + // Everything is selected; deselect all. + if ( + searchInput.selectionStart === 0 && + searchInput.selectionEnd === searchInput.value.length + ) { + // Scroll to the search box in case it's outside the viewport so that + // it's clear to the user that it has focus. + scrollToElement(this.searchEngine, searchInput); + searchInput.setSelectionRange( + searchInput.value.length, + searchInput.value.length, + ); + return false; + } + // Closing search suggestions via document.body.click() or + // searchInput.blur() breaks the state of google's controller. + // The suggestion box is closed, yet it won't re-appear on the next + // search box focus event. + + // Input can be blurred only when the suggestion box is already + // closed, hence the blur event is queued. + window.setTimeout(() => searchInput.blur()); + // Invoke the default handler which will close-up search suggestions + // properly (google's controller won't break), but it won't remove the + // focus. + return true; + }; + this.register( + this.options.sync.get('focusSearchInput'), + outsideSearchboxHandler, + ); + // Bind globally, otherwise Mousetrap ignores keypresses inside inputs. + // We must bind it separately to the search box element, or otherwise the + // key event won't always be captured (for example this is the case on + // Google Search as of 2020-06-22), presumably because the javascript in the + // page will disable further processing. + this.register( + this.options.sync.get('focusSearchInput'), + insideSearchboxHandler, + searchInput, + true, + ); + } + + registerObject(obj) { + for (const [optionName, elementOrGetter] of Object.entries(obj)) { + this.register(this.options.sync.get(optionName), () => { + if (elementOrGetter == null) { + return true; + } + let element; + if (elementOrGetter instanceof HTMLElement) { + element = elementOrGetter; + } else { + element = elementOrGetter(); + } + if (element == null) { + return true; + } + // Some search engines use forms instead of links for navigation + if (element.tagName == 'FORM') { + element.submit(); + } else { + element.click(); + } + return false; + }); + } + } + + initTabsNavigation() { + const tabs = this.searchEngine.tabs || {}; + this.registerObject(tabs); + } + + initResultsNavigation(isFirstCall) { + this.registerObject({ + navigatePreviousResultPage: this.searchEngine.previousPageButton, + navigateNextResultPage: this.searchEngine.nextPageButton, + }); + this.resetResultsManager(); + let gridNavigation = this.resultsManager.searchResults.gridNavigation; + this.registerResultsNavigationKeybindings(gridNavigation); + // NOTE: we must not call onChangedResults multiple times, otherwise the + // URL change detection logic (which exists in YouTube) will break. + if (!isFirstCall || !this.searchEngine.onChangedResults) { + return; + } + this.searchEngine.onChangedResults((appendedOnly) => { + if (appendedOnly) { + this.resultsManager.reloadSearchResults(); + } else { + this.resetResultsManager(); + } + // In YouTube, the initial load does not always detect the grid navigation + // (because it can happen before results are actually loaded to the page). + // In this case, we must rebind the navigation keys after the results are + // loaded. + if (gridNavigation != this.resultsManager.searchResults.gridNavigation) { + gridNavigation = this.resultsManager.searchResults.gridNavigation; + this.initKeybindings(); + } + }); + } + + resetResultsManager() { + if (this.resultsManager != null && this.resultsManager.focusedIndex >= 0) { + const searchResult = + this.resultsManager.searchResults[this.resultsManager.focusedIndex]; + // NOTE: it seems that search results can become undefined when the DOM + // elements are removed (for example when the results change). + if (searchResult != null) { + this.resultsManager.unhighlight(searchResult); + } + } + this.resultsManager = new SearchResultsManager( + this.searchEngine, + this.options, + ); + this.resultsManager.reloadSearchResults(); + } + + registerResultsNavigationKeybindings(gridNavigation) { + const getOpt = (key) => { + return this.options.sync.get(key); + }; + const onFocusChange = (callback) => { + return () => { + if (!this.resultsManager.isInitialFocusSet) { + this.resultsManager.focus(0); + } else { + const _callback = callback.bind(this.resultsManager); + _callback(getOpt('wrapNavigation')); + } + return false; + }; + }; + + if (!gridNavigation) { + this.register( + getOpt('nextKey'), + onFocusChange(this.resultsManager.focusNext), + ); + this.register( + getOpt('previousKey'), + onFocusChange(this.resultsManager.focusPrevious), + ); + } else { + this.register( + getOpt('nextKey'), + onFocusChange(this.resultsManager.focusDown), + ); + this.register( + getOpt('previousKey'), + onFocusChange(this.resultsManager.focusUp), + ); + // Left + this.register( + getOpt('navigatePreviousResultPage'), + onFocusChange(this.resultsManager.focusPrevious), + ); + // Right + this.register( + getOpt('navigateNextResultPage'), + onFocusChange(this.resultsManager.focusNext), + ); + } + this.register(getOpt('navigateKey'), () => { + const link = this.resultsManager.getElementToNavigate(); + if (link == null) { + return true; + } + const lastNavigation = this.options.local.values; + lastNavigation.lastQueryUrl = location.href; + lastNavigation.lastFocusedIndex = this.resultsManager.focusedIndex; + this.options.local.save(); + // If the element is a link, use the href to directly navigate, since some + // websites will open it in a new tab. + if (link.localName === 'a' && link.href) { + window.location.href = link.href; + } else { + link.click(); + } + return false; + }); + this.register(getOpt('navigateNewTabKey'), () => { + const link = this.resultsManager.getElementToNavigate(true); + if (link == null) { + return true; + } + browser.runtime.sendMessage({ + type: 'tabsCreate', + options: { + url: link.href, + active: true, + }, + }); + return false; + }); + this.register(getOpt('navigateNewTabBackgroundKey'), () => { + const link = this.resultsManager.getElementToNavigate(true); + if (link == null) { + return true; + } + if (getOpt('simulateMiddleClick')) { + const mouseEventParams = { + bubbles: true, + cancelable: false, + view: window, + button: 1, + which: 2, + buttons: 0, + clientX: link.getBoundingClientRect().x, + clientY: link.getBoundingClientRect().y, + }; + const middleClickMousedown = new MouseEvent( + 'mousedown', + mouseEventParams, + ); + link.dispatchEvent(middleClickMousedown); + const middleClickMouseup = new MouseEvent('mouseup', mouseEventParams); + link.dispatchEvent(middleClickMouseup); + } + browser.runtime.sendMessage({ + type: 'tabsCreate', + options: { + url: link.href, + active: false, + }, + }); + return false; + }); + this.register(getOpt('copyUrlKey'), () => { + const link = this.resultsManager.getElementToNavigate(); + if ( + link == null || link.localName !== 'a' || !link.href || + !navigator.clipboard + ) { + return true; + } + navigator.clipboard.writeText(link.href).then( + () => false, + (err) => true, + ); + }); + } + + initChangeToolsNavigation() { + if (this.searchEngine.changeTools == null) { + return; + } + const getOpt = (key) => { + return this.options.sync.get(key); + }; + this.register(getOpt('navigateShowAll'), () => + this.searchEngine.changeTools('a'), + ); + this.register(getOpt('navigateShowHour'), () => + this.searchEngine.changeTools('h'), + ); + this.register(getOpt('navigateShowDay'), () => + this.searchEngine.changeTools('d'), + ); + this.register(getOpt('navigateShowWeek'), () => + this.searchEngine.changeTools('w'), + ); + this.register(getOpt('navigateShowMonth'), () => + this.searchEngine.changeTools('m'), + ); + this.register(getOpt('navigateShowYear'), () => + this.searchEngine.changeTools('y'), + ); + this.register(getOpt('toggleVerbatimSearch'), () => + this.searchEngine.changeTools('v'), + ); + this.register(getOpt('toggleSort'), () => + this.searchEngine.changeTools(null), + ); + this.register(getOpt('showImagesLarge'), () => + this.searchEngine.changeImageSize('l'), + ); + this.register(getOpt('showImagesMedium'), () => + this.searchEngine.changeImageSize('e'), + ); + this.register(getOpt('showImagesIcon'), () => + this.searchEngine.changeImageSize('i'), + ); + } + + register(shortcuts, callback, element = document, global = false) { + for (const shortcut of shortcuts) { + this.bindings.push([shortcut, element, global, callback]); + } + } +} + +const extension = new WebSearchNavigator(); +extension.init(); + + + +// Some weird escaping things going on +const NEWLINE = String.fromCharCode(10); + +const OPTIONS_HTML = atob( + ` + +PCFET0NUWVBFIGh0bWw+CjxodG1sPgoKPGhlYWQ+CiAgICA8dGl0bGU+T3B0aW9ucyBmb3IgV2ViIFNlYXJjaCBOYXZpZ2F0b3I8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJvcHRpb25zX3BhZ2UuY3NzIj4KPC9oZWFkPgoKPGJvZHk+CiAgICA8c2VjdGlvbiBpZD0iZ2VuZXJhbC1zZXR0aW5ncy1jb250YWluZXIiPgogICAgICAgIDxoMj5HZW5lcmFsIHNldHRpbmdzPC9oMj4KICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJ3cmFwLW5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0id3JhcC1uYXZpZ2F0aW9uIj4gV3JhcCBhcm91bmQgd2hlbiBuYXZpZ2F0aW5nIGJlZm9yZS9hZnRlciB0aGUgZmlyc3QvbGFzdCBzZWFyY2ggcmVzdWx0CiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iYXV0by1zZWxlY3QtZmlyc3QiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iYXV0by1zZWxlY3QtZmlyc3QiPiBGb2N1cyBvbiBmaXJzdCBzZWFyY2ggcmVzdWx0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIHBhZ2UgbG9hZHMKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgIDwvc2VjdGlvbj4KICAgIDxzZWN0aW9uIGlkPSJnb29nbGUtc2V0dGluZ3MtY29udGFpbmVyIj4KICAgICAgICA8aDI+R29vZ2xlIHNwZWNpZmljIHNldHRpbmdzPC9oMj4KICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJnb29nbGUtaW5jbHVkZS1jYXJkcyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJnb29nbGUtaW5jbHVkZS1jYXJkcyI+IEluY2x1ZGUgY2FyZHMgKHRvcCBzdG9yaWVzLCB0d2l0dGVyLCB2aWRlb3MpIGluIHJlZ3VsYXIgR29vZ2xlIHNlYXJjaCBwYWdlCiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iZ29vZ2xlLWluY2x1ZGUtcGxhY2VzIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9Imdvb2dsZS1pbmNsdWRlLXBsYWNlcyI+IEluY2x1ZGUgUGxhY2VzIGluIHJlZ3VsYXIgR29vZ2xlIHNlYXJjaCBwYWdlCiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iZ29vZ2xlLWluY2x1ZGUtbWVtZXgiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iZ29vZ2xlLWluY2x1ZGUtbWVtZXgiPiBJbmNsdWRlIFdvcmxkQnJhaW4ncyBNZW1leCBleHRlbnNpb24gcmVzdWx0cyBpbiBHb29nbGUgc2VhcmNoIHBhZ2UKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgIDwvc2VjdGlvbj4KICAgIDxzZWN0aW9uIGlkPSJrZXliaW5kaW5ncy1jb250YWluZXIiPgogICAgICAgIDxoMj5LZXliaW5kaW5nczwvaDI+CiAgICAgICAgPGRldGFpbHM+CiAgICAgICAgICAgIDxzdW1tYXJ5PjxoMz5IZWxwPC9oMz48L3N1bW1hcnk+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlbHAiPgogICAgICAgICAgICAgICAgQWxsIGtleWJpbmRpbmdzIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jY2FtcGJlbGwvbW91c2V0cmFwIiB0YXJnZXQ9Il9ibGFuayI+TW91c2V0cmFwPC9hPiBmb3JtYXQuIEV4YW1wbGVzOgogICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGtiZCBjbGFzcz0ia2V5YmluZGluZyI+YTwva2JkPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8a2JkIGNsYXNzPSJrZXliaW5kaW5nIj56IHk8L2tiZD4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGtiZCBjbGFzcz0ia2V5YmluZGluZyI+Y3RybCthPC9rYmQ+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxrYmQgY2xhc3M9ImtleWJpbmRpbmciPmNvbW1hbmQrYTwva2JkPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8a2JkIGNsYXNzPSJrZXliaW5kaW5nIj5hLCBjdHJsK2IsIHogeSwgY29tbWFuZCtjPC9rYmQ+IC0gbXVsdGlwbGUgc2hvcnRjdXRzIHRoYXQgd2lsbCBiZSB0cmVhdGVkIGVxdWl2YWxlbnRseTwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgU3BlY2lhbCBrZXlzIG5hbWVzOiBiYWNrc3BhY2UsIHRhYiwgY2xlYXIsIGVudGVyLCByZXR1cm4sIGVzYywgZXNjYXBlLCBzcGFjZSwgdXAsIGRvd24sIGxlZnQsIHJpZ2h0LCBob21lLCBlbmQsIHBhZ2V1cCwgcGFnZWRvd24sCiAgICAgICAgICAgICAgICBkZWwsIGRlbGV0ZSwgYW5kIGYxIHRocm91Z2ggZjE5LiBJbiBvcmRlciB0byBkaXNhYmxlIGEga2V5YmluZGluZywgZGVsZXRlIGl0cyBrZXliaW5kaW5nIGluIHRoZSB0ZXh0Ym94LgoKICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBub3QgYWxsIHNlYXJjaCBlbmdpbmVzIHN1cHBvcnQgYWxsIHRoZSBrZXliaW5kaW5ncy4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kZXRhaWxzPgogICAgICAgIDxkZXRhaWxzPgogICAgICAgICAgICA8c3VtbWFyeT48aDM+Q29tbW9uIGFjdGlvbnM8L2gzPjwvc3VtbWFyeT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Im5leHQta2V5IiBjbGFzcz0ib3B0aW9uLWRlc2MiPk5leHQgc2VhcmNoIHJlc3VsdDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im5leHQta2V5IiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9ImRvd24sIGoiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InByZXZpb3VzLWtleSIgY2xhc3M9Im9wdGlvbi1kZXNjIj5QcmV2aW91cyBzZWFyY2ggcmVzdWx0PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0icHJldmlvdXMta2V5IiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9InVwLCBrIj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJuYXZpZ2F0ZS1rZXkiIGNsYXNzPSJvcHRpb24tZGVzYyI+T3BlbjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im5hdmlnYXRlLWtleSIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSJyZXR1cm4sIHNwYWNlIj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJuYXZpZ2F0ZS1uZXctdGFiLWJhY2tncm91bmQta2V5IiBjbGFzcz0ib3B0aW9uLWRlc2MiPk9wZW4gaW4gYSBuZXcgYmFja2dyb3VuZCB0YWI8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IGlkPSJuYXZpZ2F0ZS1uZXctdGFiLWJhY2tncm91bmQta2V5IiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9ImN0cmwrc2hpZnQrcmV0dXJuLCBjb21tYW5kK3NoaWZ0K3JldHVybiwgY3RybCtzaGlmdCtzcGFjZSI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibmF2aWdhdGUtbmV3LXRhYi1rZXkiIGNsYXNzPSJvcHRpb24tZGVzYyI+T3BlbiBpbiBhIG5ldyB3aW5kb3cvdGFiPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibmF2aWdhdGUtbmV3LXRhYi1rZXkiIGNsYXNzPSJpbnB1dC1rZXliaW5kaW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iY3RybCtyZXR1cm4sIGNvbW1hbmQrcmV0dXJuLCBjdHJsK3NwYWNlIj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJmb2N1cy1zZWFyY2gtaW5wdXQiIGNsYXNzPSJvcHRpb24tZGVzYyI+Rm9jdXMgc2VhcmNoIGJveDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImZvY3VzLXNlYXJjaC1pbnB1dCIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSIvLCBlc2NhcGUiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Im5hdmlnYXRlLW5leHQtcmVzdWx0LXBhZ2UiIGNsYXNzPSJvcHRpb24tZGVzYyI+TmV4dCBwYWdlPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibmF2aWdhdGUtbmV4dC1yZXN1bHQtcGFnZSIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSJyaWdodCI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibmF2aWdhdGUtcHJldmlvdXMtcmVzdWx0LXBhZ2UiIGNsYXNzPSJvcHRpb24tZGVzYyI+UHJldmlvdXMgcGFnZTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im5hdmlnYXRlLXByZXZpb3VzLXJlc3VsdC1wYWdlIiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9ImxlZnQiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb3B5LXVybC1rZXkiIGNsYXNzPSJvcHRpb24tZGVzYyI+Q29weSBVUkwgb2YgZm9jdXM8L2xhYmVsPgogICAgICAgICAgICAgIDxpbnB1dCBpZD0iY29weS11cmwta2V5IiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9IiI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGV0YWlscz4KICAgICAgICA8ZGV0YWlscz4KICAgICAgICAgICAgPHN1bW1hcnk+PGgzPlJlc3VsdHMgZmlsdGVyaW5nPC9oMz48L3N1bW1hcnk+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJuYXZpZ2F0ZS1zaG93LWFsbCIgY2xhc3M9Im9wdGlvbi1kZXNjIj5UdXJuIG9mZiBmaWx0ZXIgKHNob3cgYWxsIHJlc3VsdHMpPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibmF2aWdhdGUtc2hvdy1hbGwiIGNsYXNzPSJpbnB1dC1rZXliaW5kaW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0ieiB6LCBjdHJsLXNoaWZ0LWEiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Im5hdmlnYXRlLXNob3ctaG91ciIgY2xhc3M9Im9wdGlvbi1kZXNjIj5GaWx0ZXIgcmVzdWx0cyBieSBwYXN0IGhvdXI8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IGlkPSJuYXZpZ2F0ZS1zaG93LWhvdXIiIGNsYXNzPSJpbnB1dC1rZXliaW5kaW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0ieiBoLCBjdHJsLXNoaWZ0LWgiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Im5hdmlnYXRlLXNob3ctZGF5IiBjbGFzcz0ib3B0aW9uLWRlc2MiPkZpbHRlciByZXN1bHRzIGJ5IHBhc3QgMjQgaG91cnM8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IGlkPSJuYXZpZ2F0ZS1zaG93LWRheSIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSJ6IGQsIGN0cmwtc2hpZnQtZCI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibmF2aWdhdGUtc2hvdy13ZWVrIiBjbGFzcz0ib3B0aW9uLWRlc2MiPkZpbHRlciByZXN1bHRzIGJ5IHBhc3Qgd2VlazwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im5hdmlnYXRlLXNob3ctd2VlayIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSJ6IHcsIGN0cmwtc2hpZnQtdyI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibmF2aWdhdGUtc2hvdy1tb250aCIgY2xhc3M9Im9wdGlvbi1kZXNjIj5GaWx0ZXIgcmVzdWx0cyBieSBwYXN0IG1vbnRoPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibmF2aWdhdGUtc2hvdy1tb250aCIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSJ6IG0sIGN0cmwtc2hpZnQtbSI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibmF2aWdhdGUtc2hvdy15ZWFyIiBjbGFzcz0ib3B0aW9uLWRlc2MiPkZpbHRlciByZXN1bHRzIGJ5IHBhc3QgeWVhcjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im5hdmlnYXRlLXNob3cteWVhciIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSJ6IHksIGN0cmwtc2hpZnQteSI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idG9nZ2xlLXNvcnQiIGNsYXNzPSJvcHRpb24tZGVzYyI+VG9nZ2xlIHNvcnQgYnkgZGF0ZS9yZWxldmFuY2U8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IGlkPSJ0b2dnbGUtc29ydCIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSJ6IHMsIGN0cmwtc2hpZnQtcyI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idG9nZ2xlLXZlcmJhdGltLXNlYXJjaCIgY2xhc3M9Im9wdGlvbi1kZXNjIj5Ub2dnbGUgdmVyYmF0aW0gc2VhcmNoPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0idG9nZ2xlLXZlcmJhdGltLXNlYXJjaCIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSJ6IHYsIGN0cmwtc2hpZnQtdiI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2hvdy1pbWFnZXMtbGFyZ2UiIGNsYXNzPSJvcHRpb24tZGVzYyI+RmlsdGVyIGltYWdlIHJlc3VsdHMgYnkgbGFyZ2Ugc2l6ZTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNob3ctaW1hZ2VzLWxhcmdlIiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9InogbCI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2hvdy1pbWFnZXMtbWVkaXVtIiBjbGFzcz0ib3B0aW9uLWRlc2MiPkZpbHRlciBpbWFnZSByZXN1bHRzIGJ5IG1lZGl1bSBzaXplPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ic2hvdy1pbWFnZXMtbWVkaXVtIiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9InogZSI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2hvdy1pbWFnZXMtaWNvbiIgY2xhc3M9Im9wdGlvbi1kZXNjIj5GaWx0ZXIgaW1hZ2UgcmVzdWx0cyBieSBpY29uIHNpemU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzaG93LWltYWdlcy1pY29uIiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9InogaSI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGV0YWlscz4KICAgICAgICA8ZGV0YWlscz4KICAgICAgICAgICAgPHN1bW1hcnk+PGgzPkdvb2dsZSBhbmQgU3RhcnRwYWdlPC9oMz48L3N1bW1hcnk+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJuYXZpZ2F0ZS1zZWFyY2gtdGFiIiBjbGFzcz0ib3B0aW9uLWRlc2MiPkdvIHRvIEFsbCAoPSBkZWZhdWx0IHNlYXJjaCB0YWIpPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibmF2aWdhdGUtc2VhcmNoLXRhYiIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSJhLCBzIj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJuYXZpZ2F0ZS1pbWFnZXMtdGFiIiBjbGFzcz0ib3B0aW9uLWRlc2MiPkdvIHRvIEltYWdlczwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im5hdmlnYXRlLWltYWdlcy10YWIiIGNsYXNzPSJpbnB1dC1rZXliaW5kaW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iaSI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibmF2aWdhdGUtdmlkZW9zLXRhYiIgY2xhc3M9Im9wdGlvbi1kZXNjIj5HbyB0byBWaWRlb3M8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IGlkPSJuYXZpZ2F0ZS12aWRlb3MtdGFiIiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9InYiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Im5hdmlnYXRlLW1hcHMtdGFiIiBjbGFzcz0ib3B0aW9uLWRlc2MiPkdvIHRvIE1hcHM8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IGlkPSJuYXZpZ2F0ZS1tYXBzLXRhYiIgY2xhc3M9ImlucHV0LWtleWJpbmRpbmciIHR5cGU9InRleHQiIHZhbHVlPSJtIj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJuYXZpZ2F0ZS1uZXdzLXRhYiIgY2xhc3M9Im9wdGlvbi1kZXNjIj5HbyB0byBOZXdzPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibmF2aWdhdGUtbmV3cy10YWIiIGNsYXNzPSJpbnB1dC1rZXliaW5kaW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0ibiI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibmF2aWdhdGUtc2hvcHBpbmctdGFiIiBjbGFzcz0ib3B0aW9uLWRlc2MiPkdvIHRvIFNob3BwaW5nPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibmF2aWdhdGUtc2hvcHBpbmctdGFiIiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9ImFsdCtuIj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJuYXZpZ2F0ZS1ib29rcy10YWIiIGNsYXNzPSJvcHRpb24tZGVzYyI+R28gdG8gQm9va3M8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IGlkPSJuYXZpZ2F0ZS1ib29rcy10YWIiIGNsYXNzPSJpbnB1dC1rZXliaW5kaW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iYiI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibmF2aWdhdGUtZmxpZ2h0cy10YWIiIGNsYXNzPSJvcHRpb24tZGVzYyI+R28gdG8gRmxpZ2h0czwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im5hdmlnYXRlLWZsaWdodHMtdGFiIiBjbGFzcz0iaW5wdXQta2V5YmluZGluZyIgdHlwZT0idGV4dCIgdmFsdWU9ImFsdCtsIj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJuYXZpZ2F0ZS1maW5hbmNpYWwtdGFiIiBjbGFzcz0ib3B0aW9uLWRlc2MiPkdvIHRvIEZpbmFuY2lhbDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im5hdmlnYXRlLWZpbmFuY2lhbC10YWIiIGNsYXNzPSJpbnB1dC1rZXliaW5kaW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iZiI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGV0YWlscz4KICAgIDwvc2VjdGlvbj4KICAgIDxzZWN0aW9uIGlkPSJzZWFyY2gtZW5naW5lcy1jb250YWluZXIiPgogICAgICAgIDxoMj5FWFBFUklNRU5UQUw6IEFsdGVybmF0aXZlIHNlYXJjaCBlbmdpbmVzPC9oMj4KICAgICAgICA8ZGV0YWlscyBjbGFzcz0iaGVscCI+CiAgICAgICAgICAgIDxzdW1tYXJ5PjxoMz5IZWxwPC9oMz48L3N1bW1hcnk+CiAgICAgICAgICAgIFRoZXJlIGlzIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB1c2luZyB0aGlzIGV4dGVuc2lvbiBpbiB0aGUgd2Vic2l0ZXMgYmVsb3cuCiAgICAgICAgICAgIE5vdGUgdGhhdCBzb21lIGZlYXR1cmVzIGFyZSBzdGlsbCBidWdneSBpbiBjZXJ0YWluIHdlYnNpdGVzLgogICAgICAgICAgICBZb3UgY2FuIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBleHRlbnNpb24gb2YgdGhlc2Ugd2Vic2l0ZXMgYXQgYW55IHRpbWUgYnkgY2xpY2tpbmcgb24gdGhlIGNoZWNrYm94ZXMuCiAgICAgICAgICAgIFdoZW4geW91IGVuYWJsZSBhIHdlYnNpdGUsIHRoZSBicm93c2VyIHdpbGwgcHJvbXB0IHlvdSBmb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyB3aGljaCBhcmUgbmVlZGVkIHRvIGJlIGFibGUgdG8gcnVuIHRoaXMgZXh0ZW5zaW9uIG9uIHRoYXQgd2Vic2l0ZS4KICAgICAgICA8L2RldGFpbHM+CiAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iYnJhdmUtc2VhcmNoIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImJyYXZlLXNlYXJjaCI+IEVuYWJsZSBvbiBCcmF2ZSBTZWFyY2gKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJzdGFydHBhZ2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0ic3RhcnRwYWdlIj4gRW5hYmxlIG9uIFN0YXJ0cGFnZQogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9InlvdXR1YmUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0ieW91dHViZSI+IEVuYWJsZSBvbiBZb3VUdWJlCiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iZ29vZ2xlLXNjaG9sYXIiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iZ29vZ2xlLXNjaG9sYXIiPiBFbmFibGUgb24gR29vZ2xlIFNjaG9sYXIKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJhbWF6b24iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iYW1hem9uIj4gRW5hYmxlIG9uIEFtYXpvbgogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9ImdpdGh1YiI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJnaXRodWIiPiBFbmFibGUgb24gR2l0aHViCiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iZ2l0bGFiIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImdpdGxhYiI+IEVuYWJsZSBvbiBHaXRsYWIKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJjdXN0b20tZ2l0bGFiIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImN1c3RvbS1naXRsYWIiPiBFbmFibGUgb24gY3VzdG9tIEdpdGxhYgogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgIDwvZGl2PgogICAgPC9zZWN0aW9uPgogICAgPHNlY3Rpb24gaWQ9ImFwcGVhcmFuY2UtY29udGFpbmVyIj4KICAgICAgICA8aDI+QXBwZWFyYW5jZTwvaDI+CiAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iaGlkZS1vdXRsaW5lIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImhpZGUtb3V0bGluZSI+IEhpZGUgb3V0bGluZSBvbiBzZWxlY3RlZCBzZWFyY2ggcmVzdWx0CiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgPGgzPkVYUEVSSU1FTlRBTDogQ3VzdG9tIENTUzwvaDM+CiAgICAgICAgICAgIFlvdSBjYW4gc2V0IGN1c3RvbSBDU1MgcnVsZXMgdG8gY2hhbmdlIGhvdyB0aGUgZm9jdXNlZCBzZWFyY2ggcmVzdWx0cyBhcmUgaGlnaGxpZ2h0ZWQuIFRoZSB0ZXh0YXJlYSBiZWxvdyBjb250YWlucyB0aGUgZGVmYXVsdCBDU1MgcnVsZXMuCiAgICAgICAgICAgIElmIHlvdSB3YW50IHRvIHJlc2V0IHRoZSBDU1MgdG8gdGhlIGRlZmF1bHRzLCBzZXQgdGhlIHRleHRhcmVhIGNvbnRlbnQgdG8gYW4gZW1wdHkgc3RyaW5nIGFuZCBzYXZlLgogICAgICAgICAgICA8ZGV0YWlscz4KICAgICAgICAgICAgICAgIDxzdW1tYXJ5PjxoMz5FZGl0IENTUyBydWxlczwvaDM+PC9zdW1tYXJ5PgogICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9ImN1c3RvbS1jc3MtdGV4dGFyZWEiIGlkPSJjdXN0b20tY3NzLXRleHRhcmVhIj48L3RleHRhcmVhPgogICAgICAgICAgICA8L2RldGFpbHM+CiAgICAgICAgPC9kaXY+CiAgICA8L3NlY3Rpb24+CiAgICA8c2VjdGlvbiBpZD0iYWR2YW5jZWQtc2V0dGluZ3MtY29udGFpbmVyIj4KICAgICAgICA8ZGV0YWlscz4KICAgICAgICAgICAgPHN1bW1hcnk+PGgyPkFkdmFuY2VkPC9oMj48L3N1bW1hcnk+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwIj4KICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBhcyBhIHdvcmthcm91bmQgZm9yIHNvbWUgd2Vic2l0ZXMuCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRlbGF5LWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZGVsYXkiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iZGVsYXkiPkRlbGF5IGV4dGVuc2lvbiBpbml0aWFsaXphdGlvbiBpbiBtaWxsaXNlY29uZHMKICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24iPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2ltdWxhdGUtbWlkZGxlLWNsaWNrIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJzaW11bGF0ZS1taWRkbGUtY2xpY2siPiBTaW11bGF0ZSBtaWRkbGUgY2xpY2sgd2hlbiBvcGVuaW5nIGluIGEgbmV3IGJhY2tncm91bmQgdGFiCiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uIj4KICAgICAgICAgICAgICAgIDxoMz5DdXN0b20gR2l0bGFiIFVSTCByZWdleDwvaDM+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwIj4KICAgICAgICAgICAgICAgICAgICBEZWZpbmUgcHJpdmF0ZSBHaXRsYWIgVVJMIHJlZ2V4LiBEZWZhdWx0IGlzIF5odHRwczovLyh3d3dcLik/LipnaXQuKlwuIAogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjdXN0b20tZ2l0bGFiLXVybC1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImN1c3RvbS1naXRsYWItdXJsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJjdXN0b20tZ2l0bGFiLXVybCI+CiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2RldGFpbHM+CiAgICA8L3NlY3Rpb24+CgogICAgPGRpdiBpZD0ic3RhdHVzIj48L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMtY29udGFpbmVyIj4KICAgICAgICA8YnV0dG9uIGlkPSJzYXZlIj5TYXZlPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBpZD0icmVzZXQiPlJlc2V0IHRvIGRlZmF1bHRzPC9idXR0b24+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0IHNyYz0iYnJvd3Nlci1wb2x5ZmlsbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ib3B0aW9ucy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ib3B0aW9uc19wYWdlLmpzIj48L3NjcmlwdD4KPC9ib2R5PgoKPC9odG1sPgo= + +`.replaceAll(NEWLINE, ''), +); + +const OPTIONS_CSS = atob( + ` + +Ym9keSB7CiAgd2lkdGg6IDQwMHB4Owp9CgpzZWN0aW9uIHsKICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgpoMiB7CiAgZm9udC1zaXplOiAxLjRlbTsKICBmb250LXdlaWdodDogNTUwOwogIG1hcmdpbi10b3A6IDEwcHg7CiAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKaDMgewogIGZvbnQtc2l6ZTogMS4yZW07CiAgZm9udC13ZWlnaHQ6IDQ1MDsKICBtYXJnaW4tdG9wOiAxMHB4OwogIG1hcmdpbi1ib3R0b206IDVweDsKfQoKc3VtbWFyeSB7CiAgbWFyZ2luLXRvcDogNXB4OwogIG1hcmdpbi1ib3R0b206IDVweDsKfQoKZGV0YWlscyB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9CgpzdW1tYXJ5IGgzLApzdW1tYXJ5IGgyIHsKICBkaXNwbGF5OiBpbmxpbmU7Cn0KCi5vcHRpb24gewogIG1hcmdpbi1ib3R0b206IDVweDsKfQoKLm9wdGlvbi1kZXNjIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgd2lkdGg6IDQ4JTsKfQoKLmlucHV0LWtleWJpbmRpbmcgewogIG1hcmdpbi1sZWZ0OiBhdXRvOwogIG1hcmdpbi1yaWdodDogMDsKICB3aWR0aDogNDglOwp9CgouaGVscCB7CiAgZm9udC13ZWlnaHQ6IDM1MDsKfQoKI2N1c3RvbS1jc3MtdGV4dGFyZWEgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogNDAwcHg7Cn0KCi5zZWFyY2gtZW5naW5lLWNoZWNrYm94IHsKICBkaXNwbGF5OiBibG9jazsKfQoKI2RlbGF5LWNvbnRhaW5lciB7CiAgbWFyZ2luLXRvcDogNXB4Owp9CgojZGVsYXkgewogIHdpZHRoOiA3NXB4OwogIG1hcmdpbi1yaWdodDogNXB4Owp9Cgojc3RhdHVzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKI2J1dHRvbnMtY29udGFpbmVyIGJ1dHRvbiB7CiAgbWFyZ2luLXRvcDogNXB4OwogIG1hcmdpbi1ib3R0b206IDVweDsKfQoKLyogRmlyZWZveCBzcGVjaWZpYyBvdmVycmlkZXMgKi8KQC1tb3otZG9jdW1lbnQgdXJsLXByZWZpeCgiIikgewogIGJvZHkgewogICAgd2lkdGg6IDYwMHB4OwogICAgLyogV2l0aG91dCB0aGlzLCB0aGUgRmlyZWZveCBvcHRpb25zIHBhZ2UgYm9keSBpcyBjbG9zZSB0byB0aGUgYm9yZGVyICovCiAgICBtYXJnaW4tbGVmdDogMTBweDsKICB9CgogIC5vcHRpb24tZGVzYyB7CiAgICB3aWR0aDogMjgwcHg7CiAgfQoKICAjY3VzdG9tLWNzcy10ZXh0YXJlYSB7CiAgICB3aWR0aDogNjAwcHg7CiAgICBoZWlnaHQ6IDYwMHB4OwogIH0KfQo= + +`.replaceAll(NEWLINE, ''), +); + +const OPTIONS_JS = atob( + ` + +Y29uc3QgREVGQVVMVF9DU1MgPSBgLyogTk9URToKICoKICogLSBVc2luZyAhaW1wb3J0YW50IGlzIG5lZWRlZCBmb3Igc29tZSBzdHlsZXMgYmVjYXVzZSBvdGhlcndpc2UgdGhleSBnZXQKICogICBvdmVycmlkZW4gYnkgdGhlIHNlYXJjaCBlbmdpbmUgc3R5bGVzaGVldHMKICogLSBVc2luZyBvdXRsaW5lIHdvcmtzIGJldHRlciB0aGFuIGJvcmRlciBzb21ldGltZXMgYmVjYXVzZSBjcmVhdGluZyB0aGUKICogICBib3JkZXIgY2FuIG1vdmUgb3RoZXIgZWxlbWVudHMsIGZvciBleGFtcGxlIHRoZSBwYWdlIG51bWJlcnMgYXJlIG1vdmVkIGluCiAqICAgR29vZ2xlIFNjaG9sYXIgd2hlbiBoaWdobGlnaHRpbmcgdGhlIHByZXYvbmV4dCBidXR0b25zLgogKi8KCjpyb290IHsKICAtLXJlc3VsdC1vdXRsaW5lOiAxcHggc29saWQgYmxhY2s7Cn0KCkBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKICA6cm9vdCB7CiAgICAtLXJlc3VsdC1vdXRsaW5lOiAxcHggc29saWQgI2FhYWFhYTsKICB9Cn0KCmh0bWxbZGFya10sIFtkYXJrXSB7CiAgLS1yZXN1bHQtb3V0bGluZTogMXB4IHNvbGlkICNhYWFhYWE7Cn0KCi53c24tZ29vZ2xlLWZvY3VzZWQtbGluayB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAvKiBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgYXJyb3cgdG8gYXBwZWFyIHdoZW4gbmF2aWdhdGluZyBzdWItcmVzdWx0cywgc2VlCiAgICAgKiBhbHNvOiBodHRwczovL2dpdGh1Yi5jb20vaW5mb2tpbGxlci93ZWItc2VhcmNoLW5hdmlnYXRvci9pc3N1ZXMvMzU3ICovCiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50Owp9Cgoud3NuLWdvb2dsZS1mb2N1c2VkLWxpbms6OmJlZm9yZSwKLndzbi1nb29nbGUtZm9jdXNlZC1tYXA6OmJlZm9yZSwKLndzbi1naXRsYWItZm9jdXNlZC1saW5rOjpiZWZvcmUsCi53c24tYnJhdmUtc2VhcmNoLWZvY3VzZWQtbGluazo6YmVmb3JlLAoud3NuLXN0YXJ0cGFnZS1mb2N1c2VkLWxpbms6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiXHUyNUJBIjsKICAgIG1hcmdpbi1yaWdodDogMjVweDsKICAgIGxlZnQ6IC0yNXB4OwogICAgcG9zaXRpb246IGFic29sdXRlOwp9Cgoud3NuLWJyYXZlLXNlYXJjaC1mb2N1c2VkLW5ld3MgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLndzbi1icmF2ZS1zZWFyY2gtZm9jdXNlZC1uZXdzOjpiZWZvcmUgewogIGNvbnRlbnQ6ICJcdTI1QkEiOwogIHRvcDogNXB4OwogIGxlZnQ6IC00NXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLndzbi1nb29nbGUtZm9jdXNlZC1pbWFnZSB7CiAgICBvdXRsaW5lOiB2YXIoLS1yZXN1bHQtb3V0bGluZSkgIWltcG9ydGFudDsKICAgIC8qIEltYWdlcyBhcmUgbGVzcyB2aXNpYmxlIHdpdGggYSB0aGluIG91dGxpbmUgKi8KICAgIG91dGxpbmUtd2lkdGg6IDJweDsKfQoKLndzbi1nb29nbGUtZm9jdXNlZC1jYXJkLAoud3NuLWJyYXZlLXNlYXJjaC1mb2N1c2VkLWNhcmQsCi53c24tZ29vZ2xlLWZvY3VzZWQtam9iLWNhcmQgewogICAgYm9yZGVyOiB2YXIoLS1yZXN1bHQtb3V0bGluZSkgIWltcG9ydGFudDsKfQoKLndzbi1nb29nbGUtZm9jdXNlZC1tYXAsCi53c24tZ29vZ2xlLWNhcmQtaXRlbSwKLndzbi1naXRsYWItZm9jdXNlZC1ncm91cC1yb3cgewogICAgb3V0bGluZTogdmFyKC0tcmVzdWx0LW91dGxpbmUpICFpbXBvcnRhbnQ7Cn0KCi53c24tZ29vZ2xlLWZvY3VzZWQtbWVtZXgtcmVzdWx0IHsKICAgIGJvcmRlcjogdmFyKC0tcmVzdWx0LW91dGxpbmUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgovKiBTdGFydHBhZ2UgaGFzIGRhcmsgdGhlbWVzIHdoZXJlIGEgYmxhY2sgb3V0bGluZSB3b24ndCBiZSB2aXNpYmxlICovCi53c24tc3RhcnRwYWdlLWZvY3VzZWQtbGluayB7CiAgICBvdXRsaW5lOiAxcHggc29saWQgIzQzNWE2OSAhaW1wb3J0YW50OwogICAgb3V0bGluZS1vZmZzZXQ6IDNweDsKfQoKLndzbi15b3V0dWJlLWZvY3VzZWQtdmlkZW8gewogICAgb3V0bGluZTogdmFyKC0tcmVzdWx0LW91dGxpbmUpICFpbXBvcnRhbnQ7CiAgICBvdXRsaW5lLW9mZnNldDogMXB4Owp9Cgoud3NuLXlvdXR1YmUtZm9jdXNlZC1ncmlkLXZpZGVvIHsKICAgIGJvcmRlcjogdmFyKC0tcmVzdWx0LW91dGxpbmUpICFpbXBvcnRhbnQ7Cn0KCi53c24tZ29vZ2xlLXNjaG9sYXItbmV4dC1wYWdlIHsKICAgIC8qIFVzaW5nIG91dGxpbmUgd29ya3MgYmV0dGVyIHRoYW4gYm9yZGVyIGZvciB0aGUgU2Nob2xhciBwcmV2aW91cy9uZXh0CiAgICAgKiBidXR0b25zIGJlY2F1c2UgYm9yZGVyIG1vdmVzIHRoZSBwYWdlIG51bWJlcnMgYSBiaXQuICovCiAgICBvdXRsaW5lOiB2YXIoLS1yZXN1bHQtb3V0bGluZSkgIWltcG9ydGFudDsKfQoKLndzbi1hbWF6b24tZm9jdXNlZC1pdGVtIHsKICAgIG91dGxpbmU6IHZhcigtLXJlc3VsdC1vdXRsaW5lKSAhaW1wb3J0YW50OwogICAgb3V0bGluZS1vZmZzZXQ6IDNweDsKfQoKLndzbi1hbWF6b24tZm9jdXNlZC1jYXJ0LWl0ZW0sCi53c24tYW1hem9uLWZvY3VzZWQtY2Fyb3VzZWwtaXRlbSB7CiAgICBib3JkZXI6IHZhcigtLXJlc3VsdC1vdXRsaW5lKSAhaW1wb3J0YW50Owp9Cgoud3NuLWdpdGh1Yi1mb2N1c2VkLWl0ZW0sCi53c24tZ2l0aHViLWZvY3VzZWQtcGFnaW5hdGlvbiB7CiAgICBvdXRsaW5lOiB2YXIoLS1yZXN1bHQtb3V0bGluZSkgIWltcG9ydGFudDsKICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7Cn0KCi8qIFRoaXMgcnVsZSBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgImhpZGUgb3V0bGluZSIgb3B0aW9uIGlzIGVuYWJsZWQsIGFuZCBpcyB1c2VkCiAqIHRvIGRpc2FibGUgdGhlIHdlYnNpdGUncyBkZWZhdWx0IHNlYXJjaCByZXN1bHQgb3V0bGluaW5nICovCi53c24tbm8tb3V0bGluZSwKLndzbi1uby1vdXRsaW5lOmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7Cn1gOwoKY29uc3QgREVGQVVMVF9LRVlCSU5ESU5HUyA9IHsKICBuZXh0S2V5OiBbJ2Rvd24nLCAnaiddLAogIHByZXZpb3VzS2V5OiBbJ3VwJywgJ2snXSwKICBuYXZpZ2F0ZVByZXZpb3VzUmVzdWx0UGFnZTogWydsZWZ0JywgJ2gnXSwKICBuYXZpZ2F0ZU5leHRSZXN1bHRQYWdlOiBbJ3JpZ2h0JywgJ2wnXSwKICBuYXZpZ2F0ZUtleTogWydyZXR1cm4nLCAnc3BhY2UnXSwKICBuYXZpZ2F0ZU5ld1RhYkJhY2tncm91bmRLZXk6IFsnY3RybCtyZXR1cm4nLCAnY29tbWFuZCtyZXR1cm4nLCAnY3RybCtzcGFjZSddLAogIG5hdmlnYXRlTmV3VGFiS2V5OiBbCiAgICAnY3RybCtzaGlmdCtyZXR1cm4nLAogICAgJ2NvbW1hbmQrc2hpZnQrcmV0dXJuJywKICAgICdjdHJsK3NoaWZ0K3NwYWNlJywKICBdLAogIG5hdmlnYXRlU2VhcmNoVGFiOiBbJ2EnLCAncyddLAogIG5hdmlnYXRlSW1hZ2VzVGFiOiBbJ2knXSwKICBuYXZpZ2F0ZVZpZGVvc1RhYjogWyd2J10sCiAgbmF2aWdhdGVNYXBzVGFiOiBbJ20nXSwKICBuYXZpZ2F0ZU5ld3NUYWI6IFsnbiddLAogIG5hdmlnYXRlU2hvcHBpbmdUYWI6IFsnYWx0K3MnXSwKICBuYXZpZ2F0ZUJvb2tzVGFiOiBbJ2InXSwKICBuYXZpZ2F0ZUZsaWdodHNUYWI6IFsnYWx0K2wnXSwKICBuYXZpZ2F0ZUZpbmFuY2lhbFRhYjogWydmJ10sCiAgZm9jdXNTZWFyY2hJbnB1dDogWycvJywgJ2VzY2FwZSddLAogIG5hdmlnYXRlU2hvd0FsbDogWyd6IHonXSwKICBuYXZpZ2F0ZVNob3dIb3VyOiBbJ3ogaCddLAogIG5hdmlnYXRlU2hvd0RheTogWyd6IGQnXSwKICBuYXZpZ2F0ZVNob3dXZWVrOiBbJ3ogdyddLAogIG5hdmlnYXRlU2hvd01vbnRoOiBbJ3ogbSddLAogIG5hdmlnYXRlU2hvd1llYXI6IFsneiB5J10sCiAgdG9nZ2xlU29ydDogWyd6IHMnXSwKICB0b2dnbGVWZXJiYXRpbVNlYXJjaDogWyd6IHYnXSwKICBzaG93SW1hZ2VzTGFyZ2U6IFsneiBsJ10sCiAgc2hvd0ltYWdlc01lZGl1bTogWyd6IGUnXSwKICBzaG93SW1hZ2VzSWNvbjogWyd6IGknXSwKICBjb3B5VXJsS2V5OiBbXSwKfTsKCmNvbnN0IERFRkFVTFRfT1BUSU9OUyA9IHsKICAuLi5ERUZBVUxUX0tFWUJJTkRJTkdTLAogIHdyYXBOYXZpZ2F0aW9uOiBmYWxzZSwKICBhdXRvU2VsZWN0Rmlyc3Q6IHRydWUsCiAgaGlkZU91dGxpbmU6IGZhbHNlLAogIGRlbGF5OiAwLAogIGdvb2dsZUluY2x1ZGVDYXJkczogdHJ1ZSwKICBnb29nbGVJbmNsdWRlTWVtZXg6IGZhbHNlLAogIGdvb2dsZUluY2x1ZGVQbGFjZXM6IHRydWUsCiAgY3VzdG9tQ1NTOiBERUZBVUxUX0NTUywKICBzaW11bGF0ZU1pZGRsZUNsaWNrOiBmYWxzZSwKICBjdXN0b21HaXRsYWJVcmw6ICdeaHR0cHM6Ly8od3d3Lik/XFwuKmdpdC4qXFwuJywKfTsKCmNvbnN0IGtleWJpbmRpbmdTdHJpbmdUb0FycmF5ID0gKGtiKSA9PiB7CiAgLy8gQWx0ZXJuYXRpdmU6IGtiLnNwbGl0KC8sICovKTsKICByZXR1cm4ga2Iuc3BsaXQoJywnKS5tYXAoKHQpID0+IHQudHJpbSgpKTsKfTsKCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycwpjb25zdCBrZXliaW5kaW5nQXJyYXlUb1N0cmluZyA9IChrYikgPT4gewogIHJldHVybiBrYi5qb2luKCcsICcpOwp9OwoKLyoqCiAqIEBwYXJhbSB7U3RvcmFnZUFyZWF9IHN0b3JhZ2UgVGhlIHN0b3JhZ2UgYXJlYSB0byB3aGljaCB0aGlzIHNlY3Rpb24gd2lsbAogKiAgd3JpdGUuCiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0VmFsdWVzIFRoZSBkZWZhdWx0IG9wdGlvbnMuCiAqIEBjb25zdHJ1Y3RvcgogKi8KY2xhc3MgQnJvd3NlclN0b3JhZ2UgewogIGNvbnN0cnVjdG9yKHN0b3JhZ2UsIGRlZmF1bHRWYWx1ZXMpIHsKICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2U7CiAgICB0aGlzLnZhbHVlcyA9IHt9OwogICAgdGhpcy5kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlczsKICB9CiAgbG9hZCgpIHsKICAgIC8vIHRoaXMuc3RvcmFnZS5nZXQobnVsbCkgcmV0dXJucyBhbGwgdGhlIGRhdGEgc3RvcmVkOgogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL3N0b3JhZ2UjbWV0aG9kLVN0b3JhZ2VBcmVhLWdldAogICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXQobnVsbCkudGhlbigodmFsdWVzKSA9PiB7CiAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOwogICAgICAvLyBQcmlvciB0byB2ZXJzaW9ucyAwLjQuKiB0aGUga2V5YmluZGluZ3Mgd2VyZSBzdG9yZWQgYXMgc3RyaW5ncywgc28gd2UKICAgICAgLy8gbWlncmF0ZSB0aGVtIHRvIGFycmF5cyBpZiBuZWVkZWQuCiAgICAgIGxldCBtaWdyYXRlZCA9IGZhbHNlOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnZhbHVlcykpIHsKICAgICAgICBpZiAoIShrZXkgaW4gREVGQVVMVF9LRVlCSU5ESU5HUykgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBtaWdyYXRlZCA9IHRydWU7CiAgICAgICAgdGhpcy52YWx1ZXNba2V5XSA9IGtleWJpbmRpbmdTdHJpbmdUb0FycmF5KHZhbHVlKTsKICAgICAgfQogICAgICBpZiAobWlncmF0ZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5zYXZlKCk7CiAgICAgIH0KICAgIH0pOwogIH0KICBzYXZlKCkgewogICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5zZXQodGhpcy52YWx1ZXMpOwogIH0KICBnZXQoa2V5KSB7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVzW2tleV07CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVzW2tleV07CiAgfQogIHNldChrZXksIHZhbHVlKSB7CiAgICB0aGlzLnZhbHVlc1trZXldID0gdmFsdWU7CiAgfQogIGNsZWFyKCkgewogICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5jbGVhcigpLnRoZW4oKCkgPT4gewogICAgICB0aGlzLnZhbHVlcyA9IHt9OwogICAgfSk7CiAgfQogIGdldEFsbCgpIHsKICAgIC8vIE1lcmdlIG9wdGlvbnMgZnJvbSBzdG9yYWdlIHdpdGggZGVmYXVsdHMuCiAgICByZXR1cm4geyAuLi50aGlzLmRlZmF1bHRWYWx1ZXMsIC4uLnRoaXMudmFsdWVzIH07CiAgfQp9Cgpjb25zdCBTVE9SQUdFX0tFWSA9ICd3ZWJTZWFyY2hOYXZpZ2F0b3InOwoKY2xhc3MgTG9jYWxTdG9yYWdlIHsKICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWVzKSB7CiAgICB0aGlzLnZhbHVlcyA9IHt9OwogICAgdGhpcy5kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlczsKICAgIHRoaXMubG9hZCgpOwogIH0KCiAgbG9hZCgpIHsKICAgIGNvbnN0IHN0b3JlZERhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSk7CgogICAgaWYgKHN0b3JlZERhdGEpIHsKICAgICAgdGhpcy52YWx1ZXMgPSBKU09OLnBhcnNlKHN0b3JlZERhdGEpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy52YWx1ZXMgPSB7IC4uLnRoaXMuZGVmYXVsdFZhbHVlcyB9OwogICAgICB0aGlzLnNhdmUoKTsKICAgIH0KICB9CgogIHNhdmUoKSB7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXMpKTsKICB9CgogIGdldChrZXkpIHsKICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZXNba2V5XTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZXNba2V5XTsKICB9CgogIHNldChrZXksIHZhbHVlKSB7CiAgICB0aGlzLnZhbHVlc1trZXldID0gdmFsdWU7CiAgICB0aGlzLnNhdmUoKTsKICB9CgogIGNsZWFyKCkgewogICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVkpOwogICAgdGhpcy52YWx1ZXMgPSB7IC4uLnRoaXMuZGVmYXVsdFZhbHVlcyB9OwogIH0KCiAgZ2V0QWxsKCkgewogICAgLy8gTWVyZ2Ugb3B0aW9ucyBmcm9tIHN0b3JhZ2Ugd2l0aCBkZWZhdWx0cy4KICAgIHJldHVybiB7IC4uLnRoaXMuZGVmYXVsdFZhbHVlcywgLi4udGhpcy52YWx1ZXMgfTsKICB9Cn0KCmNvbnN0IGNyZWF0ZVN5bmNlZE9wdGlvbnMgPSAoKSA9PiB7CiAgaWYgKGdsb2JhbFRoaXMuSVNfVVNFUlNDUklQVCkgewogICAgY29uc29sZS5sb2coJ0NyZWF0ZSBMb2NhbFN0b3JhZ2Ugb3B0aW9ucycpOwogICAgcmV0dXJuIG5ldyBMb2NhbFN0b3JhZ2UoREVGQVVMVF9PUFRJT05TKTsKICB9CiAgcmV0dXJuIG5ldyBCcm93c2VyU3RvcmFnZShicm93c2VyLnN0b3JhZ2Uuc3luYywgREVGQVVMVF9PUFRJT05TKTsKfTsKCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycwpjbGFzcyBFeHRlbnNpb25PcHRpb25zIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuc3luYyA9IGNyZWF0ZVN5bmNlZE9wdGlvbnMoKTsKICAgIGlmIChnbG9iYWxUaGlzLklTX1VTRVJTQ1JJUFQpIHsKICAgICAgdGhpcy5sb2NhbCA9IGNyZWF0ZVN5bmNlZE9wdGlvbnMoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5sb2NhbCA9IG5ldyBCcm93c2VyU3RvcmFnZShicm93c2VyLnN0b3JhZ2UubG9jYWwsIHsKICAgICAgbGFzdFF1ZXJ5VXJsOiBudWxsLAogICAgICBsYXN0Rm9jdXNlZEluZGV4OiAwLAogICAgfSk7CiAgfQoKICBsb2FkKCkgewogICAgcmV0dXJuIFByb21pc2UuYWxsKFt0aGlzLmxvY2FsLmxvYWQoKSwgdGhpcy5zeW5jLmxvYWQoKV0pOwogIH0KfQo= + +`.replaceAll(NEWLINE, ''), +); + +const OPTIONS_PAGE_JS = atob( + ` + +Ly8gQmFzZWQgb24gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL29wdGlvbnNWMgoKLyogZ2xvYmFsIGtleWJpbmRpbmdTdHJpbmdUb0FycmF5LCBrZXliaW5kaW5nQXJyYXlUb1N0cmluZyAqLwovKiBnbG9iYWwgY3JlYXRlU3luY2VkT3B0aW9ucywgREVGQVVMVF9DU1MgKi8KCmNvbnN0IEdPT0dMRV9ET01BSU5TID0gWwogICdhZCcsICdhZScsICdhbCcsICdhbScsICdhcycsICdhdCcsICdheicsICdiYScsICdiZScsICdiZicsICdiZycsICdiaScsICdiaicsCiAgJ2JzJywgJ2J0JywgJ2J5JywgJ2NhJywgJ2NhdCcsICdjZCcsICdjZicsICdjZycsICdjaCcsICdjaScsICdjbCcsICdjbScsICdjbicsCiAgJ2NvLmFvJywgJ2NvLmJ3JywgJ2NvLmNrJywgJ2NvLmNyJywgJ2NvLmlkJywgJ2NvLmlsJywgJ2NvLmluJywgJ2NvLmpwJywKICAnY28ua2UnLCAnY28ua3InLCAnY28ubHMnLCAnY28ubWEnLCAnY28ubXonLCAnY28ubnonLCAnY28udGgnLCAnY28udHonLAogICdjby51ZycsICdjby51aycsICdjby51eicsICdjby52ZScsICdjby52aScsICdjby56YScsICdjby56bScsICdjby56dycsICdjb20nLAogICdjb20uYWYnLCAnY29tLmFnJywgJ2NvbS5haScsICdjb20uYXInLCAnY29tLmF1JywgJ2NvbS5iZCcsICdjb20uYmgnLAogICdjb20uYm4nLCAnY29tLmJvJywgJ2NvbS5icicsICdjb20uYnonLCAnY29tLmNvJywgJ2NvbS5jdScsICdjb20uY3knLAogICdjb20uZG8nLCAnY29tLmVjJywgJ2NvbS5lZycsICdjb20uZXQnLCAnY29tLmZqJywgJ2NvbS5naCcsICdjb20uZ2knLAogICdjb20uZ3QnLCAnY29tLmhrJywgJ2NvbS5qbScsICdjb20ua2gnLCAnY29tLmt3JywgJ2NvbS5sYicsICdjb20ubHknLAogICdjb20ubW0nLCAnY29tLm10JywgJ2NvbS5teCcsICdjb20ubXknLCAnY29tLm5hJywgJ2NvbS5uZicsICdjb20ubmcnLAogICdjb20ubmknLCAnY29tLm5wJywgJ2NvbS5vbScsICdjb20ucGEnLCAnY29tLnBlJywgJ2NvbS5wZycsICdjb20ucGgnLAogICdjb20ucGsnLCAnY29tLnByJywgJ2NvbS5weScsICdjb20ucWEnLCAnY29tLnNhJywgJ2NvbS5zYicsICdjb20uc2cnLAogICdjb20uc2wnLCAnY29tLnN2JywgJ2NvbS50aicsICdjb20udHInLCAnY29tLnR3JywgJ2NvbS51YScsICdjb20udXknLAogICdjb20udmMnLCAnY29tLnZuJywgJ2N2JywgJ2N6JywgJ2RlJywgJ2RqJywgJ2RrJywgJ2RtJywgJ2R6JywgJ2VlJywgJ2VzJywKICAnZmknLCAnZm0nLCAnZnInLCAnZ2EnLCAnZ2UnLCAnZ2cnLCAnZ2wnLCAnZ20nLCAnZ3AnLCAnZ3InLCAnZ3knLCAnaG4nLCAnaHInLAogICdodCcsICdodScsICdpZScsICdpbScsICdpcScsICdpcycsICdpdCcsICdqZScsICdqbycsICdrZycsICdraScsICdreicsICdsYScsCiAgJ2xpJywgJ2xrJywgJ2x0JywgJ2x1JywgJ2x2JywgJ21kJywgJ21lJywgJ21nJywgJ21rJywgJ21sJywgJ21uJywgJ21zJywgJ211JywKICAnbXYnLCAnbXcnLCAnbmUnLCAnbmwnLCAnbm8nLCAnbnInLCAnbnUnLCAncGwnLCAncG4nLCAncHMnLCAncHQnLCAncm8nLCAncnMnLAogICdydScsICdydycsICdzYycsICdzZScsICdzaCcsICdzaScsICdzaycsICdzbScsICdzbicsICdzbycsICdzcicsICdzdCcsICd0ZCcsCiAgJ3RnJywgJ3RrJywgJ3RsJywgJ3RtJywgJ3RuJywgJ3RvJywgJ3R0JywgJ3ZnJywgJ3Z1JywgJ3dzJywKXTsKCmNvbnN0IEFNQVpPTl9ET01BSU5TID0gWwogICdjYScsCiAgJ2NuJywKICAnY28uanAnLAogICdjby51aycsCiAgJ2NvbScsCiAgJ2NvbS5hdScsCiAgJ2NvbS5icicsCiAgJ2NvbS5teCcsCiAgJ2RlJywKICAnZXMnLAogICdmcicsCiAgJ2luJywKICAnaXQnLAogICdubCcsCl07Cgpjb25zdCBnZW5lcmF0ZVVSTFBhdHRlcm5zID0gKHByZWZpeCwgZG9tYWlucywgc3VmZml4KSA9PiB7CiAgY29uc3QgdXJscyA9IFtdOwogIGZvciAoY29uc3QgZG9tYWluIG9mIGRvbWFpbnMpIHsKICAgIHVybHMucHVzaChgJHtwcmVmaXh9LiR7ZG9tYWlufSR7c3VmZml4fWApOwogIH0KICByZXR1cm4gdXJsczsKfTsKCi8vIEF1dGhvcml6ZWQgdXJscyBmb3IgY29tcGF0aWJsZSBzZWFyY2ggZW5naW5lcwpjb25zdCBPUFRJT05BTF9QRVJNSVNTSU9OU19VUkxTID0gewogICdicmF2ZS1zZWFyY2gnOiBbJ2h0dHBzOi8vc2VhcmNoLmJyYXZlLmNvbS8qJ10sCiAgJ3N0YXJ0cGFnZSc6IFsKICAgIC8vIEl0IHVzZWQgdG8gYmUgJ2h0dHBzOi8vd3d3LnN0YXJ0cGFnZS5jb20vKi8qc2VhcmNoKicgYnV0IHdoZW4gcmVxdWVzdGluZwogICAgLy8gdGhpcyBVUkwgY2hyb21lIGFjdHVhbGx5IGdyYW50cyBwZXJtaXNzaW9uIHRvIHRoZSBVUkwgYmVsb3cuIFRoaXMKICAgIC8vIGRpc2NyZXBhbmN5IGNhdXNlcyB0aGUgb3B0aW9ucyBwYWdlIHRvIHRoaW5rIHRoYXQgd2UgZG9uJ3QgaGF2ZQogICAgLy8gcGVybWlzc2lvbiBmb3Igc3RhcnRwYWdlLgogICAgJ2h0dHBzOi8vd3d3LnN0YXJ0cGFnZS5jb20vKicsCiAgICAnaHR0cHM6Ly9zdGFydHBhZ2UuY29tLyonLAogIF0sCiAgJ3lvdXR1YmUnOiBbJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tLyonXSwKICAnZ29vZ2xlLXNjaG9sYXInOiBnZW5lcmF0ZVVSTFBhdHRlcm5zKAogICAgICAnaHR0cHM6Ly9zY2hvbGFyLmdvb2dsZScsCiAgICAgIEdPT0dMRV9ET01BSU5TLAogICAgICAnLyonLAogICksCiAgJ2dpdGh1Yic6IFsnaHR0cHM6Ly9naXRodWIuY29tLyonXSwKICAnYW1hem9uJzogZ2VuZXJhdGVVUkxQYXR0ZXJucygnaHR0cHM6Ly93d3cuYW1hem9uJywgQU1BWk9OX0RPTUFJTlMsICcvKicpLAogICdnaXRsYWInOiBbJ2h0dHBzOi8vZ2l0bGFiLmNvbS8qJ10sCiAgJ2N1c3RvbS1naXRsYWInOiBbJ2h0dHBzOi8vKi8qJ10sCn07CgpnbG9iYWxUaGlzLl9icm93c2VyX3VzZXJzY3JpcHRfcG9seWZpbGwucGVybWlzc2lvbnMuZ2V0QWxsID0gKCkgPT4gKHsKICBvcmlnaW5zOiBPYmplY3QudmFsdWVzKE9QVElPTkFMX1BFUk1JU1NJT05TX1VSTFMpLmZsYXQoKSwKfSkKCmNvbnN0IEtFWUJJTkRJTkdfVE9fRElWID0gewogIG5leHRLZXk6ICduZXh0LWtleScsCiAgcHJldmlvdXNLZXk6ICdwcmV2aW91cy1rZXknLAogIG5hdmlnYXRlUHJldmlvdXNSZXN1bHRQYWdlOiAnbmF2aWdhdGUtcHJldmlvdXMtcmVzdWx0LXBhZ2UnLAogIG5hdmlnYXRlTmV4dFJlc3VsdFBhZ2U6ICduYXZpZ2F0ZS1uZXh0LXJlc3VsdC1wYWdlJywKICBuYXZpZ2F0ZUtleTogJ25hdmlnYXRlLWtleScsCiAgbmF2aWdhdGVOZXdUYWJLZXk6ICduYXZpZ2F0ZS1uZXctdGFiLWtleScsCiAgbmF2aWdhdGVOZXdUYWJCYWNrZ3JvdW5kS2V5OiAnbmF2aWdhdGUtbmV3LXRhYi1iYWNrZ3JvdW5kLWtleScsCiAgbmF2aWdhdGVTZWFyY2hUYWI6ICduYXZpZ2F0ZS1zZWFyY2gtdGFiJywKICBuYXZpZ2F0ZUltYWdlc1RhYjogJ25hdmlnYXRlLWltYWdlcy10YWInLAogIG5hdmlnYXRlVmlkZW9zVGFiOiAnbmF2aWdhdGUtdmlkZW9zLXRhYicsCiAgbmF2aWdhdGVNYXBzVGFiOiAnbmF2aWdhdGUtbWFwcy10YWInLAogIG5hdmlnYXRlTmV3c1RhYjogJ25hdmlnYXRlLW5ld3MtdGFiJywKICBuYXZpZ2F0ZVNob3BwaW5nVGFiOiAnbmF2aWdhdGUtc2hvcHBpbmctdGFiJywKICBuYXZpZ2F0ZUJvb2tzVGFiOiAnbmF2aWdhdGUtYm9va3MtdGFiJywKICBuYXZpZ2F0ZUZsaWdodHNUYWI6ICduYXZpZ2F0ZS1mbGlnaHRzLXRhYicsCiAgbmF2aWdhdGVGaW5hbmNpYWxUYWI6ICduYXZpZ2F0ZS1maW5hbmNpYWwtdGFiJywKICBmb2N1c1NlYXJjaElucHV0OiAnZm9jdXMtc2VhcmNoLWlucHV0JywKICBuYXZpZ2F0ZVNob3dBbGw6ICduYXZpZ2F0ZS1zaG93LWFsbCcsCiAgbmF2aWdhdGVTaG93SG91cjogJ25hdmlnYXRlLXNob3ctaG91cicsCiAgbmF2aWdhdGVTaG93RGF5OiAnbmF2aWdhdGUtc2hvdy1kYXknLAogIG5hdmlnYXRlU2hvd1dlZWs6ICduYXZpZ2F0ZS1zaG93LXdlZWsnLAogIG5hdmlnYXRlU2hvd01vbnRoOiAnbmF2aWdhdGUtc2hvdy1tb250aCcsCiAgbmF2aWdhdGVTaG93WWVhcjogJ25hdmlnYXRlLXNob3cteWVhcicsCiAgdG9nZ2xlU29ydDogJ3RvZ2dsZS1zb3J0JywKICB0b2dnbGVWZXJiYXRpbVNlYXJjaDogJ3RvZ2dsZS12ZXJiYXRpbS1zZWFyY2gnLAogIHNob3dJbWFnZXNMYXJnZTogJ3Nob3ctaW1hZ2VzLWxhcmdlJywKICBzaG93SW1hZ2VzTWVkaXVtOiAnc2hvdy1pbWFnZXMtbWVkaXVtJywKICBzaG93SW1hZ2VzSWNvbjogJ3Nob3ctaW1hZ2VzLWljb24nLAogIGNvcHlVcmxLZXk6ICdjb3B5LXVybC1rZXknLAp9OwoKLyoqCiAqIEFkZCBvdGhlciBzZWFyY2ggZW5naW5lcyBkb21haW4gb24gdXNlciBpbnB1dAogKiBAcGFyYW0ge0VsZW1lbnR9IGNoZWNrYm94CiAqLwpjb25zdCBzZXRTZWFyY2hFbmdpbmVQZXJtaXNzaW9uXyA9IGFzeW5jIChjaGVja2JveCkgPT4gewogIGNvbnN0IHVybHMgPSBPUFRJT05BTF9QRVJNSVNTSU9OU19VUkxTW2NoZWNrYm94LmlkXTsKICBpZiAoY2hlY2tib3guY2hlY2tlZCkgewogICAgY2hlY2tib3guY2hlY2tlZCA9IGZhbHNlOwogICAgY29uc3QgZ3JhbnRlZCA9IGF3YWl0IGJyb3dzZXIucGVybWlzc2lvbnMucmVxdWVzdCh7b3JpZ2luczogdXJsc30pOwogICAgY2hlY2tib3guY2hlY2tlZCA9IGdyYW50ZWQ7CiAgfSBlbHNlIHsKICAgIGJyb3dzZXIucGVybWlzc2lvbnMucmVtb3ZlKHtvcmlnaW5zOiB1cmxzfSk7CiAgfQp9OwoKY2xhc3MgT3B0aW9uc1BhZ2VNYW5hZ2VyIHsKICBhc3luYyBpbml0KCkgewogICAgYXdhaXQgdGhpcy5sb2FkT3B0aW9ucygpOwogICAgY29uc3QgYnJhdmVTZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJhdmUtc2VhcmNoJyk7CiAgICBicmF2ZVNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgIHNldFNlYXJjaEVuZ2luZVBlcm1pc3Npb25fKGJyYXZlU2VhcmNoKTsKICAgIH0pOwogICAgY29uc3Qgc3RhcnRwYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXJ0cGFnZScpOwogICAgc3RhcnRwYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgc2V0U2VhcmNoRW5naW5lUGVybWlzc2lvbl8oc3RhcnRwYWdlKTsKICAgIH0pOwogICAgY29uc3QgeW91dHViZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd5b3V0dWJlJyk7CiAgICB5b3V0dWJlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgc2V0U2VhcmNoRW5naW5lUGVybWlzc2lvbl8oeW91dHViZSk7CiAgICB9KTsKICAgIGNvbnN0IGdvb2dsZVNjaG9sYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29vZ2xlLXNjaG9sYXInKTsKICAgIGdvb2dsZVNjaG9sYXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gewogICAgICBzZXRTZWFyY2hFbmdpbmVQZXJtaXNzaW9uXyhnb29nbGVTY2hvbGFyKTsKICAgIH0pOwogICAgY29uc3QgZ2l0aHViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dpdGh1YicpOwogICAgZ2l0aHViLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgc2V0U2VhcmNoRW5naW5lUGVybWlzc2lvbl8oZ2l0aHViKTsKICAgIH0pOwogICAgY29uc3QgYW1hem9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FtYXpvbicpOwogICAgYW1hem9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgc2V0U2VhcmNoRW5naW5lUGVybWlzc2lvbl8oYW1hem9uKTsKICAgIH0pOwogICAgY29uc3QgZ2l0bGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dpdGxhYicpOwogICAgZ2l0bGFiLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgc2V0U2VhcmNoRW5naW5lUGVybWlzc2lvbl8oZ2l0bGFiKTsKICAgIH0pOwogICAgY29uc3QgY3VzdG9tR2l0bGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1c3RvbS1naXRsYWInKTsKICAgIGN1c3RvbUdpdGxhYi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgIHNldFNlYXJjaEVuZ2luZVBlcm1pc3Npb25fKGN1c3RvbUdpdGxhYik7CiAgICB9KTsKICAgIC8vIE5PVEU6IHRoaXMuc2F2ZU9wdGlvbnMgYW5kIHRoaXMucmVzZXRUb0RlZmF1bHRzIGNhbm5vdCBiZSBwYXNzZWQgZGlyZWN0bHkKICAgIC8vIG9yIG90aGVyd2lzZSBgdGhpc2Agd29uJ3QgYmUgYm91bmQgdG8gdGhlIG9iamVjdC4KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgIHRoaXMuc2F2ZU9wdGlvbnMoKTsKICAgIH0pOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgIHRoaXMucmVzZXRUb0RlZmF1bHRzKCk7CiAgICB9KTsKICB9CgogIC8vIFNhdmVzIG9wdGlvbnMgZnJvbSB0aGUgRE9NIHRvIGJyb3dzZXIuc3RvcmFnZS5zeW5jLgogIGFzeW5jIHNhdmVPcHRpb25zKCkgewogICAgY29uc3QgZ2V0T3B0ID0gKGtleSkgPT4gewogICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmdldChrZXkpOwogICAgfTsKICAgIGNvbnN0IHNldE9wdCA9IChrZXksIHZhbHVlKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCdTZXQnLCBrZXksIHZhbHVlLCB0aGlzLm9wdGlvbnMuc3RvcmFnZSwgdGhpcy5vcHRpb25zKTsKICAgICAgdGhpcy5vcHRpb25zLnNldChrZXksIHZhbHVlKTsKICAgIH07CiAgICAvLyBIYW5kbGUgbm9uLWtleWJpbmRpbmdzIHNldHRpbmdzIGZpcnN0CiAgICBzZXRPcHQoCiAgICAgICAgJ3dyYXBOYXZpZ2F0aW9uJywKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd3JhcC1uYXZpZ2F0aW9uJykuY2hlY2tlZCwKICAgICk7CiAgICBzZXRPcHQoCiAgICAgICAgJ2F1dG9TZWxlY3RGaXJzdCcsCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dG8tc2VsZWN0LWZpcnN0JykuY2hlY2tlZCwKICAgICk7CiAgICBzZXRPcHQoJ2hpZGVPdXRsaW5lJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZGUtb3V0bGluZScpLmNoZWNrZWQpOwogICAgc2V0T3B0KCdkZWxheScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxheScpLnZhbHVlKTsKICAgIHNldE9wdCgKICAgICAgICAnZ29vZ2xlSW5jbHVkZUNhcmRzJywKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29vZ2xlLWluY2x1ZGUtY2FyZHMnKS5jaGVja2VkLAogICAgKTsKICAgIHNldE9wdCgKICAgICAgICAnZ29vZ2xlSW5jbHVkZU1lbWV4JywKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29vZ2xlLWluY2x1ZGUtbWVtZXgnKS5jaGVja2VkLAogICAgKTsKICAgIHNldE9wdCgKICAgICAgICAnZ29vZ2xlSW5jbHVkZVBsYWNlcycsCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvb2dsZS1pbmNsdWRlLXBsYWNlcycpLmNoZWNrZWQsCiAgICApOwogICAgLy8gSGFuZGxlIGtleWJpbmRpbmcgb3B0aW9ucwogICAgZm9yIChjb25zdCBba2V5LCBvcHROYW1lXSBvZiBPYmplY3QuZW50cmllcyhLRVlCSU5ESU5HX1RPX0RJVikpIHsKICAgICAgLy8gS2V5YmluZGluZ3MgYXJlIHN0b3JlZCBpbnRlcm5hbGx5IGFzIGFycmF5cywgYnV0IGVkaXRlZCBieSB1c2VycyBhcwogICAgICAvLyBjb21tYW4gZGVsaW1pdGVkIHN0cmluZ3MuCiAgICAgIHNldE9wdCgKICAgICAgICAgIGtleSwKICAgICAgICAgIGtleWJpbmRpbmdTdHJpbmdUb0FycmF5KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdE5hbWUpLnZhbHVlKSwKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IGN1c3RvbUNTUyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20tY3NzLXRleHRhcmVhJykudmFsdWU7CiAgICBpZiAoZ2V0T3B0KCdjdXN0b21DU1MnKSAhPT0gREVGQVVMVF9DU1MgfHwgY3VzdG9tQ1NTICE9PSBERUZBVUxUX0NTUykgewogICAgICBpZiAoY3VzdG9tQ1NTLnRyaW0oKSkgewogICAgICAgIHNldE9wdCgnY3VzdG9tQ1NTJywgY3VzdG9tQ1NTKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXRPcHQoJ2N1c3RvbUNTUycsIERFRkFVTFRfQ1NTKTsKICAgICAgfQogICAgfQogICAgc2V0T3B0KAogICAgICAgICdzaW11bGF0ZU1pZGRsZUNsaWNrJywKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltdWxhdGUtbWlkZGxlLWNsaWNrJykuY2hlY2tlZCwKICAgICk7CiAgICBjb25zdCBnaXRsYWJVUkxSZWdleCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20tZ2l0bGFiLXVybCcpLnZhbHVlOwogICAgdHJ5IHsKICAgICAgbmV3IFJlZ0V4cChnaXRsYWJVUkxSZWdleCk7CiAgICAgIHNldE9wdCgKICAgICAgICAgICdjdXN0b21HaXRsYWJVcmwnLAogICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1c3RvbS1naXRsYWItdXJsJykudmFsdWUsCiAgICAgICk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMnKTsKICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gYEludmFsaWQgZ2l0bGFiIFVSTCByZWdleDogJHtlLm1lc3NhZ2V9YDsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLnNhdmUoKTsKICAgICAgdGhpcy5mbGFzaE1lc3NhZ2UoJ09wdGlvbnMgc2F2ZWQnKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhpcy5mbGFzaE1lc3NhZ2UoJ0Vycm9yIHdoZW4gc2F2aW5nIG9wdGlvbnMnKTsKICAgIH0KICB9CgogIGxvYWRTZWFyY2hFbmdpbmVQZXJtaXNzaW9uc18ocGVybWlzc2lvbnMpIHsKICAgIC8vIENoZWNrIHdoYXQgVVJMcyB3ZSBoYXZlIHBlcm1pc3Npb24gZm9yLgogICAgY29uc3QgYnJhdmVTZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJhdmUtc2VhcmNoJyk7CiAgICBicmF2ZVNlYXJjaC5jaGVja2VkID0gT1BUSU9OQUxfUEVSTUlTU0lPTlNfVVJMU1snYnJhdmUtc2VhcmNoJ10uZXZlcnkoCiAgICAgICAgKHVybCkgPT4gewogICAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLm9yaWdpbnMuaW5jbHVkZXModXJsKTsKICAgICAgICB9LAogICAgKTsKICAgIGNvbnN0IHN0YXJ0cGFnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGFydHBhZ2UnKTsKICAgIHN0YXJ0cGFnZS5jaGVja2VkID0gT1BUSU9OQUxfUEVSTUlTU0lPTlNfVVJMU1snc3RhcnRwYWdlJ10uZXZlcnkoKHVybCkgPT4gewogICAgICByZXR1cm4gcGVybWlzc2lvbnMub3JpZ2lucy5pbmNsdWRlcyh1cmwpOwogICAgfSk7CiAgICBjb25zdCB5b3V0dWJlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3lvdXR1YmUnKTsKICAgIHlvdXR1YmUuY2hlY2tlZCA9IE9QVElPTkFMX1BFUk1JU1NJT05TX1VSTFNbJ3lvdXR1YmUnXS5ldmVyeSgodXJsKSA9PiB7CiAgICAgIHJldHVybiBwZXJtaXNzaW9ucy5vcmlnaW5zLmluY2x1ZGVzKHVybCk7CiAgICB9KTsKICAgIGNvbnN0IGdvb2dsZVNjaG9sYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29vZ2xlLXNjaG9sYXInKTsKICAgIGdvb2dsZVNjaG9sYXIuY2hlY2tlZCA9IE9QVElPTkFMX1BFUk1JU1NJT05TX1VSTFNbJ2dvb2dsZS1zY2hvbGFyJ10uZXZlcnkoCiAgICAgICAgKHVybCkgPT4gewogICAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLm9yaWdpbnMuaW5jbHVkZXModXJsKTsKICAgICAgICB9LAogICAgKTsKICAgIGNvbnN0IGFtYXpvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbWF6b24nKTsKICAgIGFtYXpvbi5jaGVja2VkID0gT1BUSU9OQUxfUEVSTUlTU0lPTlNfVVJMU1snYW1hem9uJ10uZXZlcnkoKHVybCkgPT4gewogICAgICByZXR1cm4gcGVybWlzc2lvbnMub3JpZ2lucy5pbmNsdWRlcyh1cmwpOwogICAgfSk7CiAgICBjb25zdCBnaXRodWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2l0aHViJyk7CiAgICBnaXRodWIuY2hlY2tlZCA9IE9QVElPTkFMX1BFUk1JU1NJT05TX1VSTFNbJ2dpdGh1YiddLmV2ZXJ5KCh1cmwpID0+IHsKICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLm9yaWdpbnMuaW5jbHVkZXModXJsKTsKICAgIH0pOwogICAgY29uc3QgZ2l0bGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dpdGxhYicpOwogICAgZ2l0bGFiLmNoZWNrZWQgPSBPUFRJT05BTF9QRVJNSVNTSU9OU19VUkxTWydnaXRsYWInXS5ldmVyeSgodXJsKSA9PiB7CiAgICAgIHJldHVybiBwZXJtaXNzaW9ucy5vcmlnaW5zLmluY2x1ZGVzKHVybCk7CiAgICB9KTsKICAgIGNvbnN0IGN1c3RvbUdpdGxhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20tZ2l0bGFiJyk7CiAgICBjdXN0b21HaXRsYWIuY2hlY2tlZCA9IE9QVElPTkFMX1BFUk1JU1NJT05TX1VSTFNbJ2N1c3RvbS1naXRsYWInXS5ldmVyeSgKICAgICAgICAodXJsKSA9PiB7CiAgICAgICAgICByZXR1cm4gcGVybWlzc2lvbnMub3JpZ2lucy5pbmNsdWRlcyh1cmwpOwogICAgICAgIH0sCiAgICApOwogIH0KCiAgLy8gTG9hZCBvcHRpb25zIGZyb20gYnJvd3Nlci5zdG9yYWdlLnN5bmMgdG8gdGhlIERPTS4KICBhc3luYyBsb2FkT3B0aW9ucygpIHsKICAgIHRoaXMub3B0aW9ucyA9IGNyZWF0ZVN5bmNlZE9wdGlvbnMoKTsKICAgIGNvbnN0IFssIHBlcm1pc3Npb25zXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgdGhpcy5vcHRpb25zLmxvYWQoKSwKICAgICAgYnJvd3Nlci5wZXJtaXNzaW9ucy5nZXRBbGwoKSwKICAgIF0pOwogICAgdGhpcy5sb2FkU2VhcmNoRW5naW5lUGVybWlzc2lvbnNfKHBlcm1pc3Npb25zKTsKICAgIGNvbnN0IGdldE9wdCA9IChrZXkpID0+IHsKICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXQoa2V5KTsKICAgIH07CiAgICAvLyBIYW5kbGUgY2hlY2tzIHNlcGFyYXRlbHkuCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd3JhcC1uYXZpZ2F0aW9uJykuY2hlY2tlZCA9CiAgICAgIGdldE9wdCgnd3JhcE5hdmlnYXRpb24nKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRvLXNlbGVjdC1maXJzdCcpLmNoZWNrZWQgPQogICAgICBnZXRPcHQoJ2F1dG9TZWxlY3RGaXJzdCcpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZGUtb3V0bGluZScpLmNoZWNrZWQgPSBnZXRPcHQoJ2hpZGVPdXRsaW5lJyk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsYXknKS52YWx1ZSA9IGdldE9wdCgnZGVsYXknKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20tZ2l0bGFiLXVybCcpLnZhbHVlID0KICAgICAgZ2V0T3B0KCdjdXN0b21HaXRsYWJVcmwnKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb29nbGUtaW5jbHVkZS1jYXJkcycpLmNoZWNrZWQgPQogICAgICBnZXRPcHQoJ2dvb2dsZUluY2x1ZGVDYXJkcycpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvb2dsZS1pbmNsdWRlLW1lbWV4JykuY2hlY2tlZCA9CiAgICAgIGdldE9wdCgnZ29vZ2xlSW5jbHVkZU1lbWV4Jyk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29vZ2xlLWluY2x1ZGUtcGxhY2VzJykuY2hlY2tlZCA9IGdldE9wdCgKICAgICAgICAnZ29vZ2xlSW5jbHVkZVBsYWNlcycsCiAgICApOwogICAgLy8gUmVzdG9yZSBvcHRpb25zIGZyb20gZGl2cy4KICAgIGZvciAoY29uc3QgW2tleSwgb3B0TmFtZV0gb2YgT2JqZWN0LmVudHJpZXMoS0VZQklORElOR19UT19ESVYpKSB7CiAgICAgIC8vIEtleWJpbmRpbmdzIGFyZSBzdG9yZWQgaW50ZXJuYWxseSBhcyBhcnJheXMsIGJ1dCBlZGl0ZWQgYnkgdXNlcnMgYXMKICAgICAgLy8gY29tbWFuIGRlbGltaXRlZCBzdHJpbmdzLgogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcHROYW1lKS52YWx1ZSA9IGtleWJpbmRpbmdBcnJheVRvU3RyaW5nKAogICAgICAgICAgZ2V0T3B0KGtleSksCiAgICAgICk7CiAgICB9CiAgICAvLyBMb2FkIGN1c3RvbSBDU1MKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20tY3NzLXRleHRhcmVhJykudmFsdWUgPSBnZXRPcHQoJ2N1c3RvbUNTUycpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpbXVsYXRlLW1pZGRsZS1jbGljaycpLmNoZWNrZWQgPSBnZXRPcHQoCiAgICAgICAgJ3NpbXVsYXRlTWlkZGxlQ2xpY2snLAogICAgKTsKICB9CgogIGFzeW5jIHJlc2V0VG9EZWZhdWx0cygpIHsKICAgIHRyeSB7CiAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5jbGVhcigpOwogICAgICBhd2FpdCB0aGlzLmxvYWRPcHRpb25zKCk7CiAgICAgIHRoaXMuZmxhc2hNZXNzYWdlKCdPcHRpb25zIHNldCB0byBkZWZhdWx0cycpOwogICAgfSBjYXRjaCAoZSkgewogICAgICB0aGlzLmZsYXNoTWVzc2FnZSgnRXJyb3Igd2hlbiBzZXR0aW5nIG9wdGlvbnMgdG8gZGVmYXVsdHMnKTsKICAgIH0KICB9CgogIGZsYXNoTWVzc2FnZShtZXNzYWdlKSB7CiAgICAvLyBVcGRhdGUgc3RhdHVzIHRvIGxldCB1c2VyIGtub3cuCiAgICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzJyk7CiAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICcnOwogICAgfSwgMzAwMCk7CiAgfQp9Cgpjb25zdCBtYW5hZ2VyID0gbmV3IE9wdGlvbnNQYWdlTWFuYWdlcigpOwovLyBOT1RFOiBtYW5hZ2VyLmluaXQgY2Fubm90IGJlIHBhc3NlZCBkaXJlY3RseSBvciBvdGhlcndpc2UgYHRoaXNgIHdvbid0IGJlCi8vIGJvdW5kIHRvIHRoZSBvYmplY3QuCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7CiAgbWFuYWdlci5pbml0KCk7Cn0pOwo= + +`.replaceAll(NEWLINE, ''), +); + +const BROWSER_POLYFILL_JS = atob( + ` + +Z2xvYmFsVGhpcy5JU19VU0VSU0NSSVBUID0gdHJ1ZTsKCmNvbnN0IFVTRV9HTSA9IGZhbHNlOwpjb25zdCBQUkVGSVggPSAndXNlcnNjcmlwdC1wb2x5ZmlsbCc7CgpnbG9iYWxUaGlzLl9sb2NhbFN0b3JhZ2VfYnJvd3Nlcl9wb2x5ZmlsbCA9IHsKICBnZXQ6IGFzeW5jICguLi5hcmdzKSA9PiB7CiAgICBhcmdzID0gYXJncy5maWx0ZXIoQm9vbGVhbik7CiAgICBkZWJ1Z2dlcjsKICAgIGNvbnNvbGUubG9nKCdbbG9jYWxTdG9yYWdlXSBHZXQ6ICcsIC4uLmFyZ3MpOwogICAgY29uc3Qgb3V0ID0ge307CiAgICBmb3IgKGNvbnN0IGsgb2YgYXJncykgewogICAgICBvdXRba10gPSBVU0VfR00gPyBHTV9nZXRWYWx1ZShrKSA6IGxvY2FsU3RvcmFnZVtgJHtQUkVGSVh9XyR7a31gXTsKICAgIH0KICAgIHJldHVybiBvdXQ7CiAgfSwKICBzZXQ6IGFzeW5jICguLi5hcmdzKSA9PiB7CiAgICBkZWJ1Z2dlcjsKICAgIGNvbnNvbGUubG9nKCdbbG9jYWxTdG9yYWdlXSBTZXQ6ICcsIC4uLmFyZ3MpOwogIH0sCiAgY2xlYXI6IGFzeW5jICgpID0+IHsKICAgIGRlYnVnZ2VyOwogICAgY29uc29sZS5sb2coJ1tsb2NhbFN0b3JhZ2VdIENsZWFyJyk7CiAgfSwKfTsKCmdsb2JhbFRoaXMuX2Jyb3dzZXJfdXNlcnNjcmlwdF9wb2x5ZmlsbCA9IHsKICBydW50aW1lOiB7CiAgICBzZW5kTWVzc2FnZTogKG1zZykgPT4gewogICAgICBpZiAobXNnLnR5cGUgPT09ICd0YWJzQ3JlYXRlJykgewogICAgICAgIHdpbmRvdy5vcGVuKG1zZy5vcHRpb25zLnVybCwgJ19ibGFuaycpOwogICAgICB9CiAgICB9LAogICAgaWQ6ICcwOTM4ODlmMy00M2JlLTQ1ZTMtYmM1YS1lMjU3ZTc1YjQ2NmQnLAogIH0sCiAgc3RvcmFnZToge3N5bmM6IGdsb2JhbFRoaXMuX2xvY2FsU3RvcmFnZV9icm93c2VyX3BvbHlmaWxsLCBsb2NhbDogZ2xvYmFsVGhpcy5fbG9jYWxTdG9yYWdlX2Jyb3dzZXJfcG9seWZpbGx9LAogIHBlcm1pc3Npb25zOiB7CiAgICByZW1vdmU6ICgpID0+IHt9LAogICAgYWRkOiAoKSA9PiB7fSwKICAgIHJlcXVlc3Q6ICgpID0+IHt9LAogICAgZ2V0QWxsOiAoKSA9PiAoe30pLAogIH0sCn07CmNvbnNvbGUubG9nKGdsb2JhbFRoaXMuYnJvd3NlciwgX2Jyb3dzZXJfdXNlcnNjcmlwdF9wb2x5ZmlsbCk7Ck9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge2Jyb3dzZXI6IGdsb2JhbFRoaXMuX2Jyb3dzZXJfdXNlcnNjcmlwdF9wb2x5ZmlsbCwgY2hyb21lOiBnbG9iYWxUaGlzLl9icm93c2VyX3VzZXJzY3JpcHRfcG9seWZpbGx9KTsKKGZ1bmN0aW9uKGEsYil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoIndlYmV4dGVuc2lvbi1wb2x5ZmlsbCIsWyJtb2R1bGUiXSxiKTtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cyliKG1vZHVsZSk7ZWxzZXt2YXIgYz17ZXhwb3J0czp7fX07YihjKSxhLmJyb3dzZXI9Yy5leHBvcnRzfX0pKCJ1bmRlZmluZWQiPT10eXBlb2YgZ2xvYmFsVGhpcz8idW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/dGhpczpzZWxmOmdsb2JhbFRoaXMsZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2lmKCEoZ2xvYmFsVGhpcy5jaHJvbWUmJmdsb2JhbFRoaXMuY2hyb21lLnJ1bnRpbWUmJmdsb2JhbFRoaXMuY2hyb21lLnJ1bnRpbWUuaWQpKXRocm93IG5ldyBFcnJvcigiVGhpcyBzY3JpcHQgc2hvdWxkIG9ubHkgYmUgbG9hZGVkIGluIGEgYnJvd3NlciBleHRlbnNpb24uIik7aWYoIShnbG9iYWxUaGlzLmJyb3dzZXImJmdsb2JhbFRoaXMuYnJvd3Nlci5ydW50aW1lJiZnbG9iYWxUaGlzLmJyb3dzZXIucnVudGltZS5pZCkpe2EuZXhwb3J0cz0oYT0+e2NvbnN0IGI9e2FsYXJtczp7Y2xlYXI6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LGNsZWFyQWxsOnttaW5BcmdzOjAsbWF4QXJnczowfSxnZXQ6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LGdldEFsbDp7bWluQXJnczowLG1heEFyZ3M6MH19LGJvb2ttYXJrczp7Y3JlYXRlOnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXQ6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGdldENoaWxkcmVuOnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRSZWNlbnQ6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGdldFN1YlRyZWU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGdldFRyZWU6e21pbkFyZ3M6MCxtYXhBcmdzOjB9LG1vdmU6e21pbkFyZ3M6MixtYXhBcmdzOjJ9LHJlbW92ZTp7bWluQXJnczoxLG1heEFyZ3M6MX0scmVtb3ZlVHJlZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sc2VhcmNoOnttaW5BcmdzOjEsbWF4QXJnczoxfSx1cGRhdGU6e21pbkFyZ3M6MixtYXhBcmdzOjJ9fSxicm93c2VyQWN0aW9uOntkaXNhYmxlOnttaW5BcmdzOjAsbWF4QXJnczoxLGZhbGxiYWNrVG9Ob0NhbGxiYWNrOiEwfSxlbmFibGU6e21pbkFyZ3M6MCxtYXhBcmdzOjEsZmFsbGJhY2tUb05vQ2FsbGJhY2s6ITB9LGdldEJhZGdlQmFja2dyb3VuZENvbG9yOnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRCYWRnZVRleHQ6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGdldFBvcHVwOnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRUaXRsZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sb3BlblBvcHVwOnttaW5BcmdzOjAsbWF4QXJnczowfSxzZXRCYWRnZUJhY2tncm91bmRDb2xvcjp7bWluQXJnczoxLG1heEFyZ3M6MSxmYWxsYmFja1RvTm9DYWxsYmFjazohMH0sc2V0QmFkZ2VUZXh0OnttaW5BcmdzOjEsbWF4QXJnczoxLGZhbGxiYWNrVG9Ob0NhbGxiYWNrOiEwfSxzZXRJY29uOnttaW5BcmdzOjEsbWF4QXJnczoxfSxzZXRQb3B1cDp7bWluQXJnczoxLG1heEFyZ3M6MSxmYWxsYmFja1RvTm9DYWxsYmFjazohMH0sc2V0VGl0bGU6e21pbkFyZ3M6MSxtYXhBcmdzOjEsZmFsbGJhY2tUb05vQ2FsbGJhY2s6ITB9fSxicm93c2luZ0RhdGE6e3JlbW92ZTp7bWluQXJnczoyLG1heEFyZ3M6Mn0scmVtb3ZlQ2FjaGU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlbW92ZUNvb2tpZXM6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlbW92ZURvd25sb2Fkczp7bWluQXJnczoxLG1heEFyZ3M6MX0scmVtb3ZlRm9ybURhdGE6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlbW92ZUhpc3Rvcnk6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlbW92ZUxvY2FsU3RvcmFnZTp7bWluQXJnczoxLG1heEFyZ3M6MX0scmVtb3ZlUGFzc3dvcmRzOnttaW5BcmdzOjEsbWF4QXJnczoxfSxyZW1vdmVQbHVnaW5EYXRhOnttaW5BcmdzOjEsbWF4QXJnczoxfSxzZXR0aW5nczp7bWluQXJnczowLG1heEFyZ3M6MH19LGNvbW1hbmRzOntnZXRBbGw6e21pbkFyZ3M6MCxtYXhBcmdzOjB9fSxjb250ZXh0TWVudXM6e3JlbW92ZTp7bWluQXJnczoxLG1heEFyZ3M6MX0scmVtb3ZlQWxsOnttaW5BcmdzOjAsbWF4QXJnczowfSx1cGRhdGU6e21pbkFyZ3M6MixtYXhBcmdzOjJ9fSxjb29raWVzOntnZXQ6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGdldEFsbDp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0QWxsQ29va2llU3RvcmVzOnttaW5BcmdzOjAsbWF4QXJnczowfSxyZW1vdmU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHNldDp7bWluQXJnczoxLG1heEFyZ3M6MX19LGRldnRvb2xzOntpbnNwZWN0ZWRXaW5kb3c6e2V2YWw6e21pbkFyZ3M6MSxtYXhBcmdzOjIsc2luZ2xlQ2FsbGJhY2tBcmc6ITF9fSxwYW5lbHM6e2NyZWF0ZTp7bWluQXJnczozLG1heEFyZ3M6MyxzaW5nbGVDYWxsYmFja0FyZzohMH0sZWxlbWVudHM6e2NyZWF0ZVNpZGViYXJQYW5lOnttaW5BcmdzOjEsbWF4QXJnczoxfX19fSxkb3dubG9hZHM6e2NhbmNlbDp7bWluQXJnczoxLG1heEFyZ3M6MX0sZG93bmxvYWQ6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGVyYXNlOnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRGaWxlSWNvbjp7bWluQXJnczoxLG1heEFyZ3M6Mn0sb3Blbjp7bWluQXJnczoxLG1heEFyZ3M6MSxmYWxsYmFja1RvTm9DYWxsYmFjazohMH0scGF1c2U6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlbW92ZUZpbGU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlc3VtZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sc2VhcmNoOnttaW5BcmdzOjEsbWF4QXJnczoxfSxzaG93OnttaW5BcmdzOjEsbWF4QXJnczoxLGZhbGxiYWNrVG9Ob0NhbGxiYWNrOiEwfX0sZXh0ZW5zaW9uOntpc0FsbG93ZWRGaWxlU2NoZW1lQWNjZXNzOnttaW5BcmdzOjAsbWF4QXJnczowfSxpc0FsbG93ZWRJbmNvZ25pdG9BY2Nlc3M6e21pbkFyZ3M6MCxtYXhBcmdzOjB9fSxoaXN0b3J5OnthZGRVcmw6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGRlbGV0ZUFsbDp7bWluQXJnczowLG1heEFyZ3M6MH0sZGVsZXRlUmFuZ2U6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGRlbGV0ZVVybDp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0VmlzaXRzOnttaW5BcmdzOjEsbWF4QXJnczoxfSxzZWFyY2g6e21pbkFyZ3M6MSxtYXhBcmdzOjF9fSxpMThuOntkZXRlY3RMYW5ndWFnZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0QWNjZXB0TGFuZ3VhZ2VzOnttaW5BcmdzOjAsbWF4QXJnczowfX0saWRlbnRpdHk6e2xhdW5jaFdlYkF1dGhGbG93OnttaW5BcmdzOjEsbWF4QXJnczoxfX0saWRsZTp7cXVlcnlTdGF0ZTp7bWluQXJnczoxLG1heEFyZ3M6MX19LG1hbmFnZW1lbnQ6e2dldDp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0QWxsOnttaW5BcmdzOjAsbWF4QXJnczowfSxnZXRTZWxmOnttaW5BcmdzOjAsbWF4QXJnczowfSxzZXRFbmFibGVkOnttaW5BcmdzOjIsbWF4QXJnczoyfSx1bmluc3RhbGxTZWxmOnttaW5BcmdzOjAsbWF4QXJnczoxfX0sbm90aWZpY2F0aW9uczp7Y2xlYXI6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGNyZWF0ZTp7bWluQXJnczoxLG1heEFyZ3M6Mn0sZ2V0QWxsOnttaW5BcmdzOjAsbWF4QXJnczowfSxnZXRQZXJtaXNzaW9uTGV2ZWw6e21pbkFyZ3M6MCxtYXhBcmdzOjB9LHVwZGF0ZTp7bWluQXJnczoyLG1heEFyZ3M6Mn19LHBhZ2VBY3Rpb246e2dldFBvcHVwOnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRUaXRsZTp7bWluQXJnczoxLG1heEFyZ3M6MX0saGlkZTp7bWluQXJnczoxLG1heEFyZ3M6MSxmYWxsYmFja1RvTm9DYWxsYmFjazohMH0sc2V0SWNvbjp7bWluQXJnczoxLG1heEFyZ3M6MX0sc2V0UG9wdXA6e21pbkFyZ3M6MSxtYXhBcmdzOjEsZmFsbGJhY2tUb05vQ2FsbGJhY2s6ITB9LHNldFRpdGxlOnttaW5BcmdzOjEsbWF4QXJnczoxLGZhbGxiYWNrVG9Ob0NhbGxiYWNrOiEwfSxzaG93OnttaW5BcmdzOjEsbWF4QXJnczoxLGZhbGxiYWNrVG9Ob0NhbGxiYWNrOiEwfX0scGVybWlzc2lvbnM6e2NvbnRhaW5zOnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRBbGw6e21pbkFyZ3M6MCxtYXhBcmdzOjB9LHJlbW92ZTp7bWluQXJnczoxLG1heEFyZ3M6MX0scmVxdWVzdDp7bWluQXJnczoxLG1heEFyZ3M6MX19LHJ1bnRpbWU6e2dldEJhY2tncm91bmRQYWdlOnttaW5BcmdzOjAsbWF4QXJnczowfSxnZXRQbGF0Zm9ybUluZm86e21pbkFyZ3M6MCxtYXhBcmdzOjB9LG9wZW5PcHRpb25zUGFnZTp7bWluQXJnczowLG1heEFyZ3M6MH0scmVxdWVzdFVwZGF0ZUNoZWNrOnttaW5BcmdzOjAsbWF4QXJnczowfSxzZW5kTWVzc2FnZTp7bWluQXJnczoxLG1heEFyZ3M6M30sc2VuZE5hdGl2ZU1lc3NhZ2U6e21pbkFyZ3M6MixtYXhBcmdzOjJ9LHNldFVuaW5zdGFsbFVSTDp7bWluQXJnczoxLG1heEFyZ3M6MX19LHNlc3Npb25zOntnZXREZXZpY2VzOnttaW5BcmdzOjAsbWF4QXJnczoxfSxnZXRSZWNlbnRseUNsb3NlZDp7bWluQXJnczowLG1heEFyZ3M6MX0scmVzdG9yZTp7bWluQXJnczowLG1heEFyZ3M6MX19LHN0b3JhZ2U6e2xvY2FsOntjbGVhcjp7bWluQXJnczowLG1heEFyZ3M6MH0sZ2V0OnttaW5BcmdzOjAsbWF4QXJnczoxfSxnZXRCeXRlc0luVXNlOnttaW5BcmdzOjAsbWF4QXJnczoxfSxyZW1vdmU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHNldDp7bWluQXJnczoxLG1heEFyZ3M6MX19LG1hbmFnZWQ6e2dldDp7bWluQXJnczowLG1heEFyZ3M6MX0sZ2V0Qnl0ZXNJblVzZTp7bWluQXJnczowLG1heEFyZ3M6MX19LHN5bmM6e2NsZWFyOnttaW5BcmdzOjAsbWF4QXJnczowfSxnZXQ6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LGdldEJ5dGVzSW5Vc2U6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LHJlbW92ZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sc2V0OnttaW5BcmdzOjEsbWF4QXJnczoxfX19LHRhYnM6e2NhcHR1cmVWaXNpYmxlVGFiOnttaW5BcmdzOjAsbWF4QXJnczoyfSxjcmVhdGU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGRldGVjdExhbmd1YWdlOnttaW5BcmdzOjAsbWF4QXJnczoxfSxkaXNjYXJkOnttaW5BcmdzOjAsbWF4QXJnczoxfSxkdXBsaWNhdGU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGV4ZWN1dGVTY3JpcHQ6e21pbkFyZ3M6MSxtYXhBcmdzOjJ9LGdldDp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0Q3VycmVudDp7bWluQXJnczowLG1heEFyZ3M6MH0sZ2V0Wm9vbTp7bWluQXJnczowLG1heEFyZ3M6MX0sZ2V0Wm9vbVNldHRpbmdzOnttaW5BcmdzOjAsbWF4QXJnczoxfSxnb0JhY2s6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LGdvRm9yd2FyZDp7bWluQXJnczowLG1heEFyZ3M6MX0saGlnaGxpZ2h0OnttaW5BcmdzOjEsbWF4QXJnczoxfSxpbnNlcnRDU1M6e21pbkFyZ3M6MSxtYXhBcmdzOjJ9LG1vdmU6e21pbkFyZ3M6MixtYXhBcmdzOjJ9LHF1ZXJ5OnttaW5BcmdzOjEsbWF4QXJnczoxfSxyZWxvYWQ6e21pbkFyZ3M6MCxtYXhBcmdzOjJ9LHJlbW92ZTp7bWluQXJnczoxLG1heEFyZ3M6MX0scmVtb3ZlQ1NTOnttaW5BcmdzOjEsbWF4QXJnczoyfSxzZW5kTWVzc2FnZTp7bWluQXJnczoyLG1heEFyZ3M6M30sc2V0Wm9vbTp7bWluQXJnczoxLG1heEFyZ3M6Mn0sc2V0Wm9vbVNldHRpbmdzOnttaW5BcmdzOjEsbWF4QXJnczoyfSx1cGRhdGU6e21pbkFyZ3M6MSxtYXhBcmdzOjJ9fSx0b3BTaXRlczp7Z2V0OnttaW5BcmdzOjAsbWF4QXJnczowfX0sd2ViTmF2aWdhdGlvbjp7Z2V0QWxsRnJhbWVzOnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRGcmFtZTp7bWluQXJnczoxLG1heEFyZ3M6MX19LHdlYlJlcXVlc3Q6e2hhbmRsZXJCZWhhdmlvckNoYW5nZWQ6e21pbkFyZ3M6MCxtYXhBcmdzOjB9fSx3aW5kb3dzOntjcmVhdGU6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LGdldDp7bWluQXJnczoxLG1heEFyZ3M6Mn0sZ2V0QWxsOnttaW5BcmdzOjAsbWF4QXJnczoxfSxnZXRDdXJyZW50OnttaW5BcmdzOjAsbWF4QXJnczoxfSxnZXRMYXN0Rm9jdXNlZDp7bWluQXJnczowLG1heEFyZ3M6MX0scmVtb3ZlOnttaW5BcmdzOjEsbWF4QXJnczoxfSx1cGRhdGU6e21pbkFyZ3M6MixtYXhBcmdzOjJ9fX07aWYoMD09PU9iamVjdC5rZXlzKGIpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImFwaS1tZXRhZGF0YS5qc29uIGhhcyBub3QgYmVlbiBpbmNsdWRlZCBpbiBicm93c2VyLXBvbHlmaWxsIik7Y2xhc3MgYyBleHRlbmRzIFdlYWtNYXB7Y29uc3RydWN0b3IoYSxiPXZvaWQgMCl7c3VwZXIoYiksdGhpcy5jcmVhdGVJdGVtPWF9Z2V0KGEpe3JldHVybiB0aGlzLmhhcyhhKXx8dGhpcy5zZXQoYSx0aGlzLmNyZWF0ZUl0ZW0oYSkpLHN1cGVyLmdldChhKX19Y29uc3QgZD1hPT5hJiYib2JqZWN0Ij09dHlwZW9mIGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnRoZW4sZT0oYixjKT0+KC4uLmQpPT57YS5ydW50aW1lLmxhc3RFcnJvcj9iLnJlamVjdChuZXcgRXJyb3IoYS5ydW50aW1lLmxhc3RFcnJvci5tZXNzYWdlKSk6Yy5zaW5nbGVDYWxsYmFja0FyZ3x8MT49ZC5sZW5ndGgmJiExIT09Yy5zaW5nbGVDYWxsYmFja0FyZz9iLnJlc29sdmUoZFswXSk6Yi5yZXNvbHZlKGQpfSxmPWE9PjE9PWE/ImFyZ3VtZW50IjoiYXJndW1lbnRzIixnPShhLGIpPT5mdW5jdGlvbihjLC4uLmQpe2lmKGQubGVuZ3RoPGIubWluQXJncyl0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0ICR7Yi5taW5BcmdzfSAke2YoYi5taW5BcmdzKX0gZm9yICR7YX0oKSwgZ290ICR7ZC5sZW5ndGh9YCk7aWYoZC5sZW5ndGg+Yi5tYXhBcmdzKXRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbW9zdCAke2IubWF4QXJnc30gJHtmKGIubWF4QXJncyl9IGZvciAke2F9KCksIGdvdCAke2QubGVuZ3RofWApO3JldHVybiBuZXcgUHJvbWlzZSgoZixnKT0+e2lmKGIuZmFsbGJhY2tUb05vQ2FsbGJhY2spdHJ5e2NbYV0oLi4uZCxlKHtyZXNvbHZlOmYscmVqZWN0Omd9LGIpKX1jYXRjaChlKXtjb25zb2xlLndhcm4oYCR7YX0gQVBJIG1ldGhvZCBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCB0aGUgY2FsbGJhY2sgcGFyYW1ldGVyLCBgKyJmYWxsaW5nIGJhY2sgdG8gY2FsbCBpdCB3aXRob3V0IGEgY2FsbGJhY2s6ICIsZSksY1thXSguLi5kKSxiLmZhbGxiYWNrVG9Ob0NhbGxiYWNrPSExLGIubm9DYWxsYmFjaz0hMCxmKCl9ZWxzZSBiLm5vQ2FsbGJhY2s/KGNbYV0oLi4uZCksZigpKTpjW2FdKC4uLmQsZSh7cmVzb2x2ZTpmLHJlamVjdDpnfSxiKSl9KX0saD0oYSxiLGMpPT5uZXcgUHJveHkoYix7YXBwbHkoYixkLGUpe3JldHVybiBjLmNhbGwoZCxhLC4uLmUpfX0pO2xldCBpPUZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtjb25zdCBqPShhLGI9e30sYz17fSk9PntsZXQgZD1PYmplY3QuY3JlYXRlKG51bGwpLGU9T2JqZWN0LmNyZWF0ZShhKTtyZXR1cm4gbmV3IFByb3h5KGUse2hhcyhiLGMpe3JldHVybiBjIGluIGF8fGMgaW4gZH0sZ2V0KGUsZil7aWYoZiBpbiBkKXJldHVybiBkW2ZdO2lmKCEoZiBpbiBhKSlyZXR1cm47bGV0IGs9YVtmXTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygayl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGJbZl0paz1oKGEsYVtmXSxiW2ZdKTtlbHNlIGlmKGkoYyxmKSl7bGV0IGI9ZyhmLGNbZl0pO2s9aChhLGFbZl0sYil9ZWxzZSBrPWsuYmluZChhKTt9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGsmJm51bGwhPT1rJiYoaShiLGYpfHxpKGMsZikpKWs9aihrLGJbZl0sY1tmXSk7ZWxzZSBpZihpKGMsIioiKSlrPWooayxiW2ZdLGNbIioiXSk7ZWxzZSByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsZix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGFbZl19LHNldChiKXthW2ZdPWJ9fSksaztyZXR1cm4gZFtmXT1rLGt9LHNldChiLGMsZSl7cmV0dXJuIGMgaW4gZD9kW2NdPWU6YVtjXT1lLCEwfSxkZWZpbmVQcm9wZXJ0eShhLGIsYyl7cmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZCxiLGMpfSxkZWxldGVQcm9wZXJ0eShhLGIpe3JldHVybiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGQsYil9fSl9LGs9YT0+KHthZGRMaXN0ZW5lcihiLGMsLi4uZCl7Yi5hZGRMaXN0ZW5lcihhLmdldChjKSwuLi5kKX0saGFzTGlzdGVuZXIoYixjKXtyZXR1cm4gYi5oYXNMaXN0ZW5lcihhLmdldChjKSl9LHJlbW92ZUxpc3RlbmVyKGIsYyl7Yi5yZW1vdmVMaXN0ZW5lcihhLmdldChjKSl9fSksbD1uZXcgYyhhPT4iZnVuY3Rpb24iPT10eXBlb2YgYT9mdW5jdGlvbihiKXtjb25zdCBjPWooYix7fSx7Z2V0Q29udGVudDp7bWluQXJnczowLG1heEFyZ3M6MH19KTthKGMpfTphKSxtPW5ldyBjKGE9PiJmdW5jdGlvbiI9PXR5cGVvZiBhP2Z1bmN0aW9uKGIsYyxlKXtsZXQgZixnLGg9ITEsaT1uZXcgUHJvbWlzZShhPT57Zj1mdW5jdGlvbihiKXtoPSEwLGEoYil9fSk7dHJ5e2c9YShiLGMsZil9Y2F0Y2goYSl7Zz1Qcm9taXNlLnJlamVjdChhKX1jb25zdCBqPSEwIT09ZyYmZChnKTtpZighMCE9PWcmJiFqJiYhaClyZXR1cm4hMTtjb25zdCBrPWE9PnthLnRoZW4oYT0+e2UoYSl9LGE9PntsZXQgYjtiPWEmJihhIGluc3RhbmNlb2YgRXJyb3J8fCJzdHJpbmciPT10eXBlb2YgYS5tZXNzYWdlKT9hLm1lc3NhZ2U6IkFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQiLGUoe19fbW96V2ViRXh0ZW5zaW9uUG9seWZpbGxSZWplY3RfXzohMCxtZXNzYWdlOmJ9KX0pLmNhdGNoKGE9Pntjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gc2VuZCBvbk1lc3NhZ2UgcmVqZWN0ZWQgcmVwbHkiLGEpfSl9O3JldHVybiBqP2soZyk6ayhpKSwhMH06YSksbj0oe3JlamVjdDpiLHJlc29sdmU6Y30sZCk9PnthLnJ1bnRpbWUubGFzdEVycm9yP2EucnVudGltZS5sYXN0RXJyb3IubWVzc2FnZT09PSJUaGUgbWVzc2FnZSBwb3J0IGNsb3NlZCBiZWZvcmUgYSByZXNwb25zZSB3YXMgcmVjZWl2ZWQuIj9jKCk6YihuZXcgRXJyb3IoYS5ydW50aW1lLmxhc3RFcnJvci5tZXNzYWdlKSk6ZCYmZC5fX21veldlYkV4dGVuc2lvblBvbHlmaWxsUmVqZWN0X18/YihuZXcgRXJyb3IoZC5tZXNzYWdlKSk6YyhkKX0sbz0oYSxiLGMsLi4uZCk9PntpZihkLmxlbmd0aDxiLm1pbkFyZ3MpdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAke2IubWluQXJnc30gJHtmKGIubWluQXJncyl9IGZvciAke2F9KCksIGdvdCAke2QubGVuZ3RofWApO2lmKGQubGVuZ3RoPmIubWF4QXJncyl0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IG1vc3QgJHtiLm1heEFyZ3N9ICR7ZihiLm1heEFyZ3MpfSBmb3IgJHthfSgpLCBnb3QgJHtkLmxlbmd0aH1gKTtyZXR1cm4gbmV3IFByb21pc2UoKGEsYik9Pntjb25zdCBlPW4uYmluZChudWxsLHtyZXNvbHZlOmEscmVqZWN0OmJ9KTtkLnB1c2goZSksYy5zZW5kTWVzc2FnZSguLi5kKX0pfSxwPXtkZXZ0b29sczp7bmV0d29yazp7b25SZXF1ZXN0RmluaXNoZWQ6ayhsKX19LHJ1bnRpbWU6e29uTWVzc2FnZTprKG0pLG9uTWVzc2FnZUV4dGVybmFsOmsobSksc2VuZE1lc3NhZ2U6by5iaW5kKG51bGwsInNlbmRNZXNzYWdlIix7bWluQXJnczoxLG1heEFyZ3M6M30pfSx0YWJzOntzZW5kTWVzc2FnZTpvLmJpbmQobnVsbCwic2VuZE1lc3NhZ2UiLHttaW5BcmdzOjIsbWF4QXJnczozfSl9fSxxPXtjbGVhcjp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0OnttaW5BcmdzOjEsbWF4QXJnczoxfSxzZXQ6e21pbkFyZ3M6MSxtYXhBcmdzOjF9fTtyZXR1cm4gYi5wcml2YWN5PXtuZXR3b3JrOnsiKiI6cX0sc2VydmljZXM6eyIqIjpxfSx3ZWJzaXRlczp7IioiOnF9fSxqKGEscCxiKX0pKGNocm9tZSl9ZWxzZSBhLmV4cG9ydHM9Z2xvYmFsVGhpcy5icm93c2VyfSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWJyb3dzZXItcG9seWZpbGwubWluLmpzLm1hcAoKLy8gd2ViZXh0ZW5zaW9uLXBvbHlmaWxsIHYuMC4xMi4wIChodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS93ZWJleHRlbnNpb24tcG9seWZpbGwpCgovKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMKICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4gKi8K + +`.replaceAll(NEWLINE, ''), +); + +function showOptions() { + const CONTAINER_ID = 'webNavigatorIframe'; + if (document.getElementById(CONTAINER_ID)) { + document.getElementById(CONTAINER_ID).remove(); + } + const iframe = document.createElement('iframe'); + const iframe_container = document.createElement('div'); + + iframe_container.id = CONTAINER_ID; + iframe_container.onclick = () => { + iframe_container?.remove(); + }; + iframe.onclick = (e) => { + e.stopPropagation(); + }; + + const BETTER_STYLES = ` + + body {padding: 30px; max-width: 600px; margin: 0 auto;} + * {box-sizing: border-box; padding: 0; margin: 0; font-family: sans-serif;} + h1, h2, h3 {font-weight: 100;} + + `; + const OUT_HTML = OPTIONS_HTML.replaceAll( + ``, + ``, + ) + .replaceAll( + ``, + ``, + ) + .replaceAll( + ``, + ``, + ) + .replaceAll( + ``, + ``, + ); + + console.log({ OUT_HTML }); + iframe.srcdoc = OUT_HTML; + Object.assign(iframe_container.style, { + position: 'fixed', + display: 'grid', + cursor: 'pointer', + placeItems: 'center', + inset: 0, + backgroundColor: '#0003', + zIndex: 100000, + }); + iframe_container.appendChild(iframe); + Object.assign(iframe.style, { + width: '80vw', + height: '80vh', + border: 'none', + borderRadius: '3px', + overflow: 'hidden', + background: '#fff', + }); + document.body.appendChild(iframe_container); + return { el: iframe, container: iframe_container }; +} +globalThis.showOptions = showOptions; +// console.log(showOptions); +// setTimeout(() => showOptions(), 4000); + +// TODO: Make the options page use postMessage to parent and localStorage to utilize settings + +function blobToDataURL(blob) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = function (e) { + resolve(reader.result); + }; + reader.onerror = function (e) { + reject(reader.error); + }; + reader.onabort = function (e) { + reject(new Error('Read aborted')); + }; + reader.readAsDataURL(blob); + }); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..47953b10 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7886 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + bl: ^1.2.3 + node-forge: ^0.10.0 + +importers: + + .: + dependencies: + mousetrap: + specifier: ^1.6.5 + version: 1.6.5 + webextension-polyfill: + specifier: ^0.10.0 + version: 0.10.0 + devDependencies: + '@typescript-eslint/eslint-plugin': + specifier: ^4.33.0 + version: 4.33.0(@typescript-eslint/parser@4.33.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^4.33.0 + version: 4.33.0(eslint@8.57.0)(typescript@4.9.5) + eslint: + specifier: ^8.51.0 + version: 8.57.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.57.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + gulp: + specifier: ^4.0.2 + version: 4.0.2 + gulp-if: + specifier: ^3.0.0 + version: 3.0.0 + gulp-terser: + specifier: ^2.1.0 + version: 2.1.0 + markdownlint-cli: + specifier: ^0.37.0 + version: 0.37.0 + minimist: + specifier: ^1.2.8 + version: 1.2.8 + prettier: + specifier: 3.0.3 + version: 3.0.3 + prettier-eslint-cli: + specifier: ^7.1.0 + version: 7.1.0(prettier-eslint@15.0.1) + set-value: + specifier: ^4.1.0 + version: 4.1.0 + shellcheck: + specifier: ^2.2.0 + version: 2.2.0 + stylelint: + specifier: ^15.10.3 + version: 15.11.0(typescript@4.9.5) + stylelint-config-standard: + specifier: ^34.0.0 + version: 34.0.0(stylelint@15.11.0(typescript@4.9.5)) + web-ext: + specifier: ^7.8.0 + version: 7.12.0 + +packages: + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.21.0': + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + engines: {node: '>=6.9.0'} + + '@csstools/css-parser-algorithms@2.7.1': + resolution: {integrity: sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-tokenizer': ^2.4.1 + + '@csstools/css-tokenizer@2.4.1': + resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==} + engines: {node: ^14 || ^16 || >=18} + + '@csstools/media-query-list-parser@2.1.13': + resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.7.1 + '@csstools/css-tokenizer': ^2.4.1 + + '@csstools/selector-specificity@3.1.1': + resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.13 + + '@devicefarmer/adbkit-logcat@2.1.3': + resolution: {integrity: sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw==} + engines: {node: '>= 4'} + + '@devicefarmer/adbkit-monkey@1.2.1': + resolution: {integrity: sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==} + engines: {node: '>= 0.10.4'} + + '@devicefarmer/adbkit@3.2.3': + resolution: {integrity: sha512-wK9rVrabs4QU0oK8Jnwi+HRBEm+s1x/o63kgthUe0y7K1bfcYmgLuQf41/adsj/5enddlSxzkJavl2EwOu+r1g==} + engines: {node: '>= 0.10.4'} + hasBin: true + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fluent/syntax@0.19.0': + resolution: {integrity: sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==} + engines: {node: '>=14.0.0', npm: '>=7.0.0'} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@mdn/browser-compat-data@5.5.29': + resolution: {integrity: sha512-NHdG3QOiAsxh8ygBSKMa/WaNJwpNt87uVqW+S2RlnSqgeRdk+L3foNWTX6qd0I3NHSlCFb47rgopeNCJtRDY5A==} + + '@messageformat/core@3.3.0': + resolution: {integrity: sha512-YcXd3remTDdeMxAlbvW6oV9d/01/DZ8DHUFwSttO3LMzIZj3iO0NRw+u1xlsNNORFI+u0EQzD52ZX3+Udi0T3g==} + + '@messageformat/date-skeleton@1.0.1': + resolution: {integrity: sha512-jPXy8fg+WMPIgmGjxSlnGJn68h/2InfT0TNSkVx0IGXgp4ynnvYkbZ51dGWmGySEK+pBiYUttbQdu5XEqX5CRg==} + + '@messageformat/number-skeleton@1.2.0': + resolution: {integrity: sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg==} + + '@messageformat/parser@5.1.0': + resolution: {integrity: sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==} + + '@messageformat/runtime@3.0.1': + resolution: {integrity: sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.2.2': + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@types/eslint@8.56.11': + resolution: {integrity: sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@22.0.2': + resolution: {integrity: sha512-yPL6DyFwY5PiMVEwymNeqUTKsDczQBJ/5T7W/46RwLU/VH+AA8aT5TZkvBviLKLbbm0hlfftEkGrNzfRk/fofQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@4.33.0': + resolution: {integrity: sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + '@typescript-eslint/parser': ^4.0.0 + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/experimental-utils@4.33.0': + resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: '*' + + '@typescript-eslint/parser@4.33.0': + resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@4.33.0': + resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@4.33.0': + resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@4.33.0': + resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/visitor-keys@4.33.0': + resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + addons-linter@6.28.0: + resolution: {integrity: sha512-fCTjXL/yG4hwq74JG8tQdrvEu0OvGrEN9yU+Df0020RDtHl3g/tTCyMeC4G1uyk8IuyMzp4myCBNnOGC7MWSQQ==} + engines: {node: '>=16.0.0'} + hasBin: true + + addons-moz-compare@1.3.0: + resolution: {integrity: sha512-/rXpQeaY0nOKhNx00pmZXdk5Mu+KhVlL3/pSBuAYwrxRrNiTvI/9xfQI8Lmm7DMMl+PDhtfAHY/0ibTpdeoQQQ==} + + addons-scanner-utils@9.10.1: + resolution: {integrity: sha512-Tz9OUQx9Ja0TyQ+H2GakB9KlJ50myI6ESBGRlA8N80nHBzMjjPRFGm0APADSaCd5NP74SrFtEvL4TRpDwZXETA==} + peerDependencies: + body-parser: 1.20.2 + express: 4.18.3 + node-fetch: 2.6.11 + safe-compare: 1.1.4 + peerDependenciesMeta: + body-parser: + optional: true + express: + optional: true + node-fetch: + optional: true + safe-compare: + optional: true + + adm-zip@0.5.14: + resolution: {integrity: sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==} + engines: {node: '>=12.0'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@1.1.0: + resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} + engines: {node: '>=0.10.0'} + + ansi-gray@0.1.1: + resolution: {integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==} + engines: {node: '>=0.10.0'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + ansi-wrap@0.1.0: + resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} + engines: {node: '>=0.10.0'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + + append-buffer@1.0.2: + resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} + engines: {node: '>=0.10.0'} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-filter@1.1.2: + resolution: {integrity: sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-map@2.0.2: + resolution: {integrity: sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-differ@4.0.0: + resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + array-each@1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} + engines: {node: '>=0.10.0'} + + array-initial@1.1.0: + resolution: {integrity: sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==} + engines: {node: '>=0.10.0'} + + array-last@1.3.0: + resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} + engines: {node: '>=0.10.0'} + + array-slice@1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + + array-sort@1.0.0: + resolution: {integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==} + engines: {node: '>=0.10.0'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-union@3.0.1: + resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} + engines: {node: '>=12'} + + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-done@1.3.2: + resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} + engines: {node: '>= 0.10'} + + async-each@1.0.6: + resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} + + async-settle@1.0.0: + resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} + engines: {node: '>= 0.10'} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.0: + resolution: {integrity: sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==} + + bach@1.2.0: + resolution: {integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==} + engines: {node: '>= 0.10'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + binary-extensions@1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + + boolify@1.0.1: + resolution: {integrity: sha512-ma2q0Tc760dW54CdOyJjhrg/a54317o1zYADQJFgperNGKIKgAUGIcKnuMiff8z57+yGlrGNEt4lPgZfCgTJgA==} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bunyan@1.8.15: + resolution: {integrity: sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==} + engines: {'0': node >=0.10.0} + hasBin: true + + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@7.0.2: + resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} + engines: {node: '>=12'} + + camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + chokidar@2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + + chrome-launcher@0.15.1: + resolution: {integrity: sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==} + engines: {node: '>=12.13.0'} + hasBin: true + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + + cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-buffer@1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} + engines: {node: '>= 0.10'} + + clone-stats@1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + cloneable-readable@1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + collection-map@1.0.0: + resolution: {integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==} + engines: {node: '>=0.10.0'} + + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + columnify@1.6.0: + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} + engines: {node: '>=8.0.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@2.9.0: + resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==} + engines: {node: '>= 0.6.x'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + copy-props@2.0.5: + resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==} + + core-js@3.29.0: + resolution: {integrity: sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==} + + core-js@3.37.1: + resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + css-functions-list@3.2.2: + resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==} + engines: {node: '>=12 || >=16'} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decamelize@5.0.1: + resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} + engines: {node: '>=10'} + + decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + + decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + + decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + + decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + + decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepcopy@2.1.0: + resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-compare@1.0.0: + resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==} + engines: {node: '>=0.10.0'} + + default-resolution@2.0.0: + resolution: {integrity: sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==} + engines: {node: '>= 0.10'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + dtrace-provider@0.8.8: + resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} + engines: {node: '>=0.10'} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + each-props@1.3.2: + resolution: {integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-promisify@7.0.0: + resolution: {integrity: sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==} + engines: {node: '>=6'} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-google@0.14.0: + resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} + engines: {node: '>=0.10.0'} + peerDependencies: + eslint: '>=5.16.0' + + eslint-plugin-json@3.1.0: + resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} + engines: {node: '>=12.0'} + + eslint-plugin-no-unsanitized@4.0.2: + resolution: {integrity: sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ==} + peerDependencies: + eslint: ^6 || ^7 || ^8 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@10.0.1: + resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fancy-log@1.3.3: + resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} + engines: {node: '>= 0.10'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-patch@3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@1.1.4: + resolution: {integrity: sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-entry-cache@7.0.2: + resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==} + engines: {node: '>=12.0.0'} + + file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + + file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + + file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + findup-sync@2.0.0: + resolution: {integrity: sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==} + engines: {node: '>= 0.10'} + + findup-sync@3.0.0: + resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} + engines: {node: '>= 0.10'} + + fined@1.2.0: + resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} + engines: {node: '>= 0.10'} + + firefox-profile@4.3.2: + resolution: {integrity: sha512-/C+Eqa0YgIsQT2p66p7Ygzqe7NlE/GNTbhw2SBCm5V3OsWDPITNdTPEcH2Q2fe7eMpYYNPKdUcuVioZBZiR6kA==} + hasBin: true + + first-chunk-stream@3.0.0: + resolution: {integrity: sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw==} + engines: {node: '>=8'} + + flagged-respawn@1.0.1: + resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} + engines: {node: '>= 0.10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + flush-write-stream@1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + for-own@1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} + engines: {node: '>=0.10.0'} + + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + fork-stream@0.0.4: + resolution: {integrity: sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA==} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + + fs-extra@9.0.1: + resolution: {integrity: sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==} + engines: {node: '>=10'} + + fs-mkdirp-stream@1.0.0: + resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} + engines: {node: '>= 0.10'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + fx-runner@1.4.0: + resolution: {integrity: sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg==} + hasBin: true + + get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-stream@6.1.0: + resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==} + engines: {node: '>= 0.10'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob-watcher@5.0.5: + resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==} + engines: {node: '>= 0.10'} + + glob@10.3.16: + resolution: {integrity: sha512-JDKXl1DiuuHJ6fVS2FXjownaavciiHNUU4mOvV/B793RLh05vZL1rcPnCSaOgv1hDT6RDlY7AB7ZUvFYAtPgAw==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + + glob@10.4.1: + resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + + glob@6.0.4: + resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + glogg@1.0.2: + resolution: {integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==} + engines: {node: '>= 0.10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graceful-readlink@1.0.1: + resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + growly@1.3.0: + resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + + gulp-cli@2.3.0: + resolution: {integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==} + engines: {node: '>= 0.10'} + hasBin: true + + gulp-if@3.0.0: + resolution: {integrity: sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==} + + gulp-match@1.1.0: + resolution: {integrity: sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==} + + gulp-terser@2.1.0: + resolution: {integrity: sha512-lQ3+JUdHDVISAlUIUSZ/G9Dz/rBQHxOiYDQ70IVWFQeh4b33TC1MCIU+K18w07PS3rq/CVc34aQO4SUbdaNMPQ==} + engines: {node: '>=10'} + + gulp@4.0.2: + resolution: {integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==} + engines: {node: '>= 0.10'} + hasBin: true + + gulplog@1.0.0: + resolution: {integrity: sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==} + engines: {node: '>= 0.10'} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + + has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} + hasBin: true + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + + invert-kv@3.0.1: + resolution: {integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==} + engines: {node: '>=8'} + + is-absolute@0.1.7: + resolution: {integrity: sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==} + engines: {node: '>=0.10.0'} + + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-mergeable-object@1.1.1: + resolution: {integrity: sha512-CPduJfuGg8h8vW74WOxHtHmtQutyQBzR+3MjQ6iDHIYdbOnm1YC7jv43SqCoU8OPGTJD4nibmiryA4kmogbGrA==} + + is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + + is-negated-glob@1.0.0: + resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} + engines: {node: '>=0.10.0'} + + is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + + is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-primitive@3.0.1: + resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} + engines: {node: '>=0.10.0'} + + is-relative@0.1.3: + resolution: {integrity: sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==} + engines: {node: '>=0.10.0'} + + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-valid-glob@1.0.0: + resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} + engines: {node: '>=0.10.0'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@1.1.2: + resolution: {integrity: sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jed@1.1.1: + resolution: {integrity: sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA==} + + jose@4.13.1: + resolution: {integrity: sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-merge-patch@1.0.2: + resolution: {integrity: sha512-M6Vp2GN9L7cfuMXiWOmHj9bEFbeC250iVtcKQbqVgEsDVYnIsrNsbU+h/Y/PkbBQCtEa4Bez+Ebv0zfbC8ObLg==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonwebtoken@9.0.0: + resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} + engines: {node: '>=12', npm: '>=6'} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + just-debounce@1.1.0: + resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + + kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + known-css-properties@0.29.0: + resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} + + last-run@1.1.1: + resolution: {integrity: sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==} + engines: {node: '>= 0.10'} + + latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + + lcid@3.1.1: + resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==} + engines: {node: '>=8'} + + lead@1.0.0: + resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} + engines: {node: '>= 0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + liftoff@3.1.0: + resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} + engines: {node: '>= 0.8'} + + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + linkify-it@4.0.1: + resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + + load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loglevel-colored-level-prefix@1.0.0: + resolution: {integrity: sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==} + + loglevel@1.9.1: + resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} + engines: {node: '>= 0.6.0'} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + make-iterator@1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + + make-plural@7.4.0: + resolution: {integrity: sha512-4/gC9KVNTV6pvYg2gFeQYTW3mWaoJt7WZE5vrp1KnQDgW92JtYZnzmZT81oj/dUTqAIu0ufI2x3dkgu3bB1tYg==} + + map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + + markdown-it@13.0.1: + resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==} + hasBin: true + + markdownlint-cli@0.37.0: + resolution: {integrity: sha512-hNKAc0bWBBuVhJbSWbUhRzavstiB4o1jh3JeSpwC4/dt6eJ54lRfYHRxVdzVp4qGWBKbeE6Pg490PFEfrKjqSg==} + engines: {node: '>=16'} + hasBin: true + + markdownlint-micromark@0.1.7: + resolution: {integrity: sha512-BbRPTC72fl5vlSKv37v/xIENSRDYL/7X/XoFzZ740FGEbs9vZerLrIkFRY0rv7slQKxDczToYuMmqQFN61fi4Q==} + engines: {node: '>=16'} + + markdownlint@0.31.1: + resolution: {integrity: sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==} + engines: {node: '>=16'} + + marky@1.2.5: + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + + matchdep@2.0.0: + resolution: {integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==} + engines: {node: '>= 0.10.0'} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + mem@5.1.1: + resolution: {integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==} + engines: {node: '>=8'} + + meow@10.1.5: + resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + moo@0.5.2: + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + + mousetrap@1.6.5: + resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multimatch@6.0.0: + resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + mute-stdout@1.0.1: + resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} + engines: {node: '>= 0.10'} + + mv@2.1.1: + resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} + engines: {node: '>=0.8.0'} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nan@2.20.0: + resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + ncp@2.0.0: + resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} + hasBin: true + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@3.3.1: + resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@0.10.0: + resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} + engines: {node: '>= 6.0.0'} + + node-notifier@10.0.1: + resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + + now-and-later@2.0.1: + resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} + engines: {node: '>= 0.10'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.defaults@1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + engines: {node: '>=0.10.0'} + + object.map@1.0.1: + resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} + engines: {node: '>=0.10.0'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + object.reduce@1.0.1: + resolution: {integrity: sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==} + engines: {node: '>=0.10.0'} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ordered-read-streams@1.0.1: + resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} + + os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + + os-locale@5.0.0: + resolution: {integrity: sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==} + engines: {node: '>=10'} + + os-shim@0.1.3: + resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==} + engines: {node: '>= 0.4.0'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + + p-is-promise@2.1.0: + resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==} + engines: {node: '>=6'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + + parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-json@6.0.2: + resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + + path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + + path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino@8.20.0: + resolution: {integrity: sha512-uhIfMj5TVp+WynVASaVEJFTncTUe4dHBq6CWplu/vBgvGHhvBvQfxz+vcOrnnBQdORH3izaGEurLfNlq3YxdFQ==} + hasBin: true + + plugin-error@1.0.1: + resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} + engines: {node: '>= 0.10'} + + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + postcss-resolve-nested-selector@0.1.4: + resolution: {integrity: sha512-R6vHqZWgVnTAPq0C+xjyHfEZqfIYboCBVSy24MjxEDm+tIh1BU4O6o7DP7AA7kHzf136d+Qc5duI4tlpHjixDw==} + + postcss-safe-parser@6.0.0: + resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + + postcss-selector-parser@6.1.1: + resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.40: + resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-eslint-cli@7.1.0: + resolution: {integrity: sha512-kMMvV7Mt6VqdJSb25aCkOA7HTIxy5mii2tzBb1vCSmzlIECOzTP2wRPIeAtBky6WdpfN0n1Zxa4E37Atp1IksA==} + engines: {node: '>=12.22'} + hasBin: true + peerDependencies: + prettier-eslint: '*' + peerDependenciesMeta: + prettier-eslint: + optional: true + + prettier-eslint@15.0.1: + resolution: {integrity: sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg==} + engines: {node: '>=10.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@23.6.0: + resolution: {integrity: sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==} + + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + promise-toolbox@0.21.0: + resolution: {integrity: sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==} + engines: {node: '>=6'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + + read-pkg-up@8.0.0: + resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} + engines: {node: '>=12'} + + read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + + read-pkg@6.0.0: + resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} + engines: {node: '>=12'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdirp@2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + redent@4.0.0: + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + relaxed-json@1.0.3: + resolution: {integrity: sha512-b7wGPo7o2KE/g7SqkJDDbav6zmrEeP4TK2VpITU72J/M949TLe/23y/ZHJo+pskcGM52xIfFoT9hydwmgr1AEg==} + engines: {node: '>= 0.10.0'} + hasBin: true + + remove-bom-buffer@3.0.0: + resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} + engines: {node: '>=0.10.0'} + + remove-bom-stream@1.2.0: + resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==} + engines: {node: '>= 0.10'} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + + replace-homedir@1.0.0: + resolution: {integrity: sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==} + engines: {node: '>= 0.10'} + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + require-relative@0.8.7: + resolution: {integrity: sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-options@1.1.0: + resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==} + engines: {node: '>= 0.10'} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@2.4.5: + resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + run-con@1.3.2: + resolution: {integrity: sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-identifier@0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + + safe-json-stringify@1.2.0: + resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + + semver-greatest-satisfied-range@1.1.0: + resolution: {integrity: sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==} + engines: {node: '>= 0.10'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + set-value@4.1.0: + resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==} + engines: {node: '>=11.0'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.7.3: + resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} + + shellcheck@2.2.0: + resolution: {integrity: sha512-rMt0WhmeqRrKMUqyTlkL6pd0zY27FRQMQWjQhpHMQETwG2ykc8gz+QGGtxHym4R2np646QgQAcq04sAEo3SWhA==} + engines: {node: '>=18.4.0 || >=16.17.0'} + hasBin: true + + shellwords@0.1.1: + resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} + + sign-addon@5.3.0: + resolution: {integrity: sha512-7nHlCzhQgVMLBNiXVEgbG/raq48awOW0lYMN5uo1BaB3mp0+k8M8pvDwbfTlr3apcxZJsk9HQsAW1POwoJugpQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + + sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sparkles@1.0.1: + resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} + engines: {node: '>= 0.10'} + + spawn-sync@1.0.15: + resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + + stream-exhaust@1.0.2: + resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + + stream-to-promise@3.0.0: + resolution: {integrity: sha512-h+7wLeFiYegOdgTfTxjRsrT7/Op7grnKEIHWgaO1RTHwcwk7xRreMr3S8XpDfDMesSxzgM2V4CxNCFAGo6ssnA==} + engines: {node: '>= 10'} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-buf@2.0.0: + resolution: {integrity: sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==} + engines: {node: '>=8'} + + strip-bom-stream@4.0.0: + resolution: {integrity: sha512-0ApK3iAkHv6WbgLICw/J4nhwHeDZsBxIIsOD+gHgZICL6SeJ0S9f/WZqemka9cjkTyMN5geId6e8U5WGFAn3cQ==} + engines: {node: '>=8'} + + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + + strip-bom@5.0.0: + resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} + engines: {node: '>=12'} + + strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-json-comments@5.0.0: + resolution: {integrity: sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==} + engines: {node: '>=14.16'} + + style-search@0.1.0: + resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + + stylelint-config-recommended@13.0.0: + resolution: {integrity: sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + stylelint: ^15.10.0 + + stylelint-config-standard@34.0.0: + resolution: {integrity: sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + stylelint: ^15.10.0 + + stylelint@15.11.0: + resolution: {integrity: sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@3.0.0: + resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + sver-compat@1.5.0: + resolution: {integrity: sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + + tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + + ternary-stream@3.0.0: + resolution: {integrity: sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==} + + terser@5.31.3: + resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==} + engines: {node: '>=10'} + hasBin: true + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@2.7.0: + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + + through2-filter@3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + time-stamp@1.1.0: + resolution: {integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==} + engines: {node: '>=0.10.0'} + + tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + + to-absolute-glob@2.0.2: + resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} + engines: {node: '>=0.10.0'} + + to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + to-through@2.0.0: + resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==} + engines: {node: '>= 0.10'} + + tosource@1.0.0: + resolution: {integrity: sha512-N6g8eQ1eerw6Y1pBhdgkubWIiPFwXa2POSUrlL8jth5CyyEWNWzoGKRkO3CaO7Jx27hlJP54muB3btIAbx4MPg==} + engines: {node: '>=0.4.0'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + trim-newlines@4.1.1: + resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} + engines: {node: '>=12'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + undertaker-registry@1.0.1: + resolution: {integrity: sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==} + engines: {node: '>= 0.10'} + + undertaker@1.3.0: + resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==} + engines: {node: '>= 0.10'} + + undici-types@6.11.1: + resolution: {integrity: sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + unique-stream@2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + universalify@1.0.0: + resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} + engines: {node: '>= 10.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + + update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + v8flags@3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} + engines: {node: '>= 0.10'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + value-or-function@3.0.0: + resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==} + engines: {node: '>= 0.10'} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + vinyl-fs@3.0.3: + resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} + engines: {node: '>= 0.10'} + + vinyl-sourcemap@1.1.0: + resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==} + engines: {node: '>= 0.10'} + + vinyl-sourcemaps-apply@0.2.1: + resolution: {integrity: sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==} + + vinyl@2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} + + vscode-json-languageservice@4.2.1: + resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vue-eslint-parser@8.3.0: + resolution: {integrity: sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-ext@7.12.0: + resolution: {integrity: sha512-h+uWOYBlHlPKy5CqxuZKocgOdL8J7I4ctMw/rAGbQl7jq7tr+NmY/Lhh2FPMSlJ1Y0T2VeUqwBVighK0MM1+zA==} + engines: {node: '>=14.0.0', npm: '>=6.9.0'} + hasBin: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + + when@3.7.7: + resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==} + + which-module@1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which@1.2.4: + resolution: {integrity: sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==} + hasBin: true + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + winreg@0.0.12: + resolution: {integrity: sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + + wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-parser@5.0.1: + resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} + + yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + + yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yargs@7.1.2: + resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zip-dir@2.0.0: + resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} + +snapshots: + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/runtime@7.21.0': + dependencies: + regenerator-runtime: 0.13.11 + + '@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/css-tokenizer@2.4.1': {} + + '@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.1)': + dependencies: + postcss-selector-parser: 6.1.1 + + '@devicefarmer/adbkit-logcat@2.1.3': {} + + '@devicefarmer/adbkit-monkey@1.2.1': {} + + '@devicefarmer/adbkit@3.2.3': + dependencies: + '@devicefarmer/adbkit-logcat': 2.1.3 + '@devicefarmer/adbkit-monkey': 1.2.1 + bluebird: 3.7.2 + commander: 9.5.0 + debug: 4.3.6 + node-forge: 0.10.0 + split: 1.0.1 + transitivePeerDependencies: + - supports-color + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.6 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@fluent/syntax@0.19.0': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.6 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@mdn/browser-compat-data@5.5.29': {} + + '@messageformat/core@3.3.0': + dependencies: + '@messageformat/date-skeleton': 1.0.1 + '@messageformat/number-skeleton': 1.2.0 + '@messageformat/parser': 5.1.0 + '@messageformat/runtime': 3.0.1 + make-plural: 7.4.0 + safe-identifier: 0.4.2 + + '@messageformat/date-skeleton@1.0.1': {} + + '@messageformat/number-skeleton@1.2.0': {} + + '@messageformat/parser@5.1.0': + dependencies: + moo: 0.5.2 + + '@messageformat/runtime@3.0.1': + dependencies: + make-plural: 7.4.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.2.2': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@sindresorhus/is@5.6.0': {} + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@types/eslint@8.56.11': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.5': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/minimatch@3.0.5': {} + + '@types/minimist@1.2.5': {} + + '@types/node@22.0.2': + dependencies: + undici-types: 6.11.1 + + '@types/normalize-package-data@2.4.4': {} + + '@types/prettier@2.7.3': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.0.2 + + '@typescript-eslint/eslint-plugin@4.33.0(@typescript-eslint/parser@4.33.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5)': + dependencies: + '@typescript-eslint/experimental-utils': 4.33.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/parser': 4.33.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 4.33.0 + debug: 4.3.6 + eslint: 8.57.0 + functional-red-black-tree: 1.0.1 + ignore: 5.3.1 + regexpp: 3.2.0 + semver: 7.6.3 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/experimental-utils@4.33.0(eslint@8.57.0)(typescript@4.9.5)': + dependencies: + '@types/json-schema': 7.0.15 + '@typescript-eslint/scope-manager': 4.33.0 + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/typescript-estree': 4.33.0(typescript@4.9.5) + eslint: 8.57.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/parser@4.33.0(eslint@8.57.0)(typescript@4.9.5)': + dependencies: + '@typescript-eslint/scope-manager': 4.33.0 + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/typescript-estree': 4.33.0(typescript@4.9.5) + debug: 4.3.6 + eslint: 8.57.0 + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.5)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + debug: 4.3.6 + eslint: 8.57.0 + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@4.33.0': + dependencies: + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/visitor-keys': 4.33.0 + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/types@4.33.0': {} + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@4.33.0(typescript@4.9.5)': + dependencies: + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/visitor-keys': 4.33.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@4.33.0': + dependencies: + '@typescript-eslint/types': 4.33.0 + eslint-visitor-keys: 2.1.0 + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + addons-linter@6.28.0(node-fetch@3.3.1): + dependencies: + '@fluent/syntax': 0.19.0 + '@mdn/browser-compat-data': 5.5.29 + addons-moz-compare: 1.3.0 + addons-scanner-utils: 9.10.1(node-fetch@3.3.1) + ajv: 8.13.0 + chalk: 4.1.2 + cheerio: 1.0.0-rc.12 + columnify: 1.6.0 + common-tags: 1.8.2 + deepmerge: 4.3.1 + eslint: 8.57.0 + eslint-plugin-no-unsanitized: 4.0.2(eslint@8.57.0) + eslint-visitor-keys: 4.0.0 + espree: 10.0.1 + esprima: 4.0.1 + fast-json-patch: 3.1.1 + glob: 10.4.1 + image-size: 1.1.1 + is-mergeable-object: 1.1.1 + jed: 1.1.1 + json-merge-patch: 1.0.2 + os-locale: 5.0.0 + pino: 8.20.0 + relaxed-json: 1.0.3 + semver: 7.6.2 + sha.js: 2.4.11 + source-map-support: 0.5.21 + tosource: 1.0.0 + upath: 2.0.1 + yargs: 17.7.2 + yauzl: 2.10.0 + transitivePeerDependencies: + - body-parser + - express + - node-fetch + - safe-compare + - supports-color + + addons-moz-compare@1.3.0: {} + + addons-scanner-utils@9.10.1(node-fetch@3.3.1): + dependencies: + '@types/yauzl': 2.10.3 + common-tags: 1.8.2 + first-chunk-stream: 3.0.0 + strip-bom-stream: 4.0.0 + upath: 2.0.1 + yauzl: 2.10.0 + optionalDependencies: + node-fetch: 3.3.1 + + adm-zip@0.5.14: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.13.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@1.1.0: + dependencies: + ansi-wrap: 0.1.0 + + ansi-gray@0.1.1: + dependencies: + ansi-wrap: 0.1.0 + + ansi-regex@2.1.1: {} + + ansi-regex@3.0.1: {} + + ansi-regex@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@2.2.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + ansi-wrap@0.1.0: {} + + any-promise@1.3.0: {} + + anymatch@2.0.0: + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + + append-buffer@1.0.2: + dependencies: + buffer-equal: 1.0.1 + + archy@1.0.0: {} + + argparse@2.0.1: {} + + arr-diff@4.0.0: {} + + arr-filter@1.1.2: + dependencies: + make-iterator: 1.0.1 + + arr-flatten@1.1.0: {} + + arr-map@2.0.2: + dependencies: + make-iterator: 1.0.1 + + arr-union@3.1.0: {} + + array-differ@4.0.0: {} + + array-each@1.0.1: {} + + array-initial@1.1.0: + dependencies: + array-slice: 1.1.0 + is-number: 4.0.0 + + array-last@1.3.0: + dependencies: + is-number: 4.0.0 + + array-slice@1.1.0: {} + + array-sort@1.0.0: + dependencies: + default-compare: 1.0.0 + get-value: 2.0.6 + kind-of: 5.1.0 + + array-union@2.1.0: {} + + array-union@3.0.1: {} + + array-unique@0.3.2: {} + + arrify@1.0.1: {} + + arrify@2.0.1: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + assign-symbols@1.0.0: {} + + astral-regex@2.0.0: {} + + async-done@1.3.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + process-nextick-args: 2.0.1 + stream-exhaust: 1.0.2 + + async-each@1.0.6: {} + + async-settle@1.0.0: + dependencies: + async-done: 1.3.2 + + async@3.2.5: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + atob@2.1.2: {} + + atomic-sleep@1.0.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.0: {} + + bach@1.2.0: + dependencies: + arr-filter: 1.1.2 + arr-flatten: 1.1.0 + arr-map: 2.0.2 + array-each: 1.0.1 + array-initial: 1.1.0 + array-last: 1.3.0 + async-done: 1.3.2 + async-settle: 1.0.0 + now-and-later: 2.0.1 + + balanced-match@1.0.2: {} + + balanced-match@2.0.0: {} + + base64-js@1.5.1: {} + + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + binary-extensions@1.13.1: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + optional: true + + bl@1.2.3: + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + bluebird@3.7.2: {} + + boolbase@1.0.0: {} + + boolean@3.2.0: {} + + boolify@1.0.1: {} + + boxen@7.1.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + + buffer-crc32@0.2.13: {} + + buffer-equal-constant-time@1.0.1: {} + + buffer-equal@1.0.1: {} + + buffer-fill@1.0.0: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bunyan@1.8.15: + optionalDependencies: + dtrace-provider: 0.8.8 + moment: 2.30.1 + mv: 2.1.1 + safe-json-stringify: 1.2.0 + + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.1 + responselike: 3.0.0 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camelcase-keys@7.0.2: + dependencies: + camelcase: 6.3.0 + map-obj: 4.3.0 + quick-lru: 5.1.1 + type-fest: 1.4.0 + + camelcase@3.0.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + camelcase@7.0.1: {} + + caseless@0.12.0: {} + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + + cheerio@1.0.0-rc.12: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + + chokidar@2.1.8: + dependencies: + anymatch: 2.0.0 + async-each: 1.0.6 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + + chrome-launcher@0.15.1: + dependencies: + '@types/node': 22.0.2 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + ci-info@3.9.0: {} + + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + cli-boxes@3.0.0: {} + + cliui@3.2.0: + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + + cliui@5.0.0: + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-buffer@1.0.0: {} + + clone-stats@1.0.0: {} + + clone@1.0.4: {} + + clone@2.1.2: {} + + cloneable-readable@1.1.3: + dependencies: + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.8 + + code-point-at@1.1.0: {} + + collection-map@1.0.0: + dependencies: + arr-map: 2.0.2 + for-own: 1.0.0 + make-iterator: 1.0.1 + + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-support@1.1.3: {} + + colord@2.9.3: {} + + columnify@1.6.0: + dependencies: + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@11.0.0: {} + + commander@2.20.3: {} + + commander@2.9.0: + dependencies: + graceful-readlink: 1.0.1 + + commander@9.5.0: {} + + common-tags@1.8.2: {} + + component-emitter@1.3.1: {} + + concat-map@0.0.1: {} + + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@6.0.0: + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.11 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + + convert-source-map@1.9.0: {} + + copy-descriptor@0.1.1: {} + + copy-props@2.0.5: + dependencies: + each-props: 1.3.2 + is-plain-object: 5.0.0 + + core-js@3.29.0: {} + + core-js@3.37.1: {} + + core-util-is@1.0.2: {} + + core-util-is@1.0.3: {} + + cosmiconfig@8.3.6(typescript@4.9.5): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 4.9.5 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + + css-functions-list@3.2.2: {} + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-uri-to-buffer@4.0.1: {} + + debounce@1.2.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decamelize@5.0.1: {} + + decamelize@6.0.0: {} + + decode-uri-component@0.2.2: {} + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + decompress-tar@4.1.1: + dependencies: + file-type: 5.2.0 + is-stream: 1.1.0 + tar-stream: 1.6.2 + + decompress-tarbz2@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 6.2.0 + is-stream: 1.1.0 + seek-bzip: 1.0.6 + unbzip2-stream: 1.4.3 + + decompress-targz@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 5.2.0 + is-stream: 1.1.0 + + decompress-unzip@4.0.1: + dependencies: + file-type: 3.9.0 + get-stream: 2.3.1 + pify: 2.3.0 + yauzl: 2.10.0 + + decompress@4.2.1: + dependencies: + decompress-tar: 4.1.1 + decompress-tarbz2: 4.1.1 + decompress-targz: 4.1.1 + decompress-unzip: 4.0.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + pify: 2.3.0 + strip-dirs: 2.1.0 + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + deepcopy@2.1.0: + dependencies: + type-detect: 4.1.0 + + deepmerge@4.3.1: {} + + default-compare@1.0.0: + dependencies: + kind-of: 5.1.0 + + default-resolution@2.0.0: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + delayed-stream@1.0.0: {} + + detect-file@1.0.0: {} + + detect-node@2.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + + dtrace-provider@0.8.8: + dependencies: + nan: 2.20.0 + optional: true + + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + each-props@1.3.2: + dependencies: + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + emoji-regex@7.0.3: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + entities@3.0.1: {} + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-error@4.1.1: {} + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-promisify@7.0.0: {} + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + es6-weak-map@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + + escalade@3.1.2: {} + + escape-goat@4.0.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-google@0.14.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-json@3.1.0: + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + + eslint-plugin-no-unsanitized@4.0.2(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@3.0.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.0.0: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.6 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + espree@10.0.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 + + espree@9.6.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + execa@4.1.0: + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + expand-brackets@2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + expand-tilde@2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + + ext@1.7.0: + dependencies: + type: 2.7.3 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extend@3.0.2: {} + + extglob@2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + extsprintf@1.3.0: {} + + fancy-log@1.3.3: + dependencies: + ansi-gray: 0.1.1 + color-support: 1.1.3 + parse-node-version: 1.0.1 + time-stamp: 1.1.0 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-patch@3.1.1: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@1.1.4: {} + + fast-levenshtein@2.0.6: {} + + fast-redact@3.5.0: {} + + fast-uri@3.0.1: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-entry-cache@7.0.2: + dependencies: + flat-cache: 3.2.0 + + file-type@3.9.0: {} + + file-type@5.2.0: {} + + file-type@6.2.0: {} + + file-uri-to-path@1.0.0: + optional: true + + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@1.1.2: + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + findup-sync@2.0.0: + dependencies: + detect-file: 1.0.0 + is-glob: 3.1.0 + micromatch: 3.1.10 + resolve-dir: 1.0.1 + transitivePeerDependencies: + - supports-color + + findup-sync@3.0.0: + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 3.1.10 + resolve-dir: 1.0.1 + transitivePeerDependencies: + - supports-color + + fined@1.2.0: + dependencies: + expand-tilde: 2.0.2 + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + + firefox-profile@4.3.2: + dependencies: + adm-zip: 0.5.14 + fs-extra: 9.0.1 + ini: 2.0.0 + minimist: 1.2.8 + xml2js: 0.5.0 + + first-chunk-stream@3.0.0: {} + + flagged-respawn@1.0.1: {} + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + flush-write-stream@1.1.1: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + for-in@1.0.2: {} + + for-own@1.0.0: + dependencies: + for-in: 1.0.2 + + foreground-child@3.2.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + fork-stream@0.0.4: {} + + form-data-encoder@2.1.4: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + + fs-constants@1.0.0: {} + + fs-extra@11.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@9.0.1: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 1.0.0 + + fs-mkdirp-stream@1.0.0: + dependencies: + graceful-fs: 4.2.11 + through2: 2.0.5 + + fs.realpath@1.0.0: {} + + fsevents@1.2.13: + dependencies: + bindings: 1.5.0 + nan: 2.20.0 + optional: true + + function-bind@1.1.2: {} + + functional-red-black-tree@1.0.1: {} + + fx-runner@1.4.0: + dependencies: + commander: 2.9.0 + shell-quote: 1.7.3 + spawn-sync: 1.0.15 + when: 3.7.7 + which: 1.2.4 + winreg: 0.0.12 + + get-caller-file@1.0.3: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-stdin@8.0.0: {} + + get-stdin@9.0.0: {} + + get-stream@2.3.1: + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.0 + + get-stream@6.0.1: {} + + get-value@2.0.6: {} + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + glob-parent@3.1.0: + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-stream@6.1.0: + dependencies: + extend: 3.0.2 + glob: 7.2.3 + glob-parent: 3.1.0 + is-negated-glob: 1.0.0 + ordered-read-streams: 1.0.1 + pumpify: 1.5.1 + readable-stream: 2.3.8 + remove-trailing-separator: 1.1.0 + to-absolute-glob: 2.0.2 + unique-stream: 2.3.1 + + glob-to-regexp@0.4.1: {} + + glob-watcher@5.0.5: + dependencies: + anymatch: 2.0.0 + async-done: 1.3.2 + chokidar: 2.1.8 + is-negated-glob: 1.0.0 + just-debounce: 1.1.0 + normalize-path: 3.0.0 + object.defaults: 1.1.0 + transitivePeerDependencies: + - supports-color + + glob@10.3.16: + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + path-scurry: 1.11.1 + + glob@10.4.1: + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + path-scurry: 1.11.1 + + glob@6.0.4: + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + optional: true + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.6.3 + serialize-error: 7.0.1 + + global-dirs@3.0.1: + dependencies: + ini: 2.0.0 + + global-modules@1.0.0: + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@1.0.2: + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + globjoin@0.1.4: {} + + glogg@1.0.2: + dependencies: + sparkles: 1.0.1 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + graceful-readlink@1.0.1: {} + + graphemer@1.4.0: {} + + growly@1.3.0: {} + + gulp-cli@2.3.0: + dependencies: + ansi-colors: 1.1.0 + archy: 1.0.0 + array-sort: 1.0.0 + color-support: 1.1.3 + concat-stream: 1.6.2 + copy-props: 2.0.5 + fancy-log: 1.3.3 + gulplog: 1.0.0 + interpret: 1.4.0 + isobject: 3.0.1 + liftoff: 3.1.0 + matchdep: 2.0.0 + mute-stdout: 1.0.1 + pretty-hrtime: 1.0.3 + replace-homedir: 1.0.0 + semver-greatest-satisfied-range: 1.1.0 + v8flags: 3.2.0 + yargs: 7.1.2 + transitivePeerDependencies: + - supports-color + + gulp-if@3.0.0: + dependencies: + gulp-match: 1.1.0 + ternary-stream: 3.0.0 + through2: 3.0.2 + + gulp-match@1.1.0: + dependencies: + minimatch: 3.1.2 + + gulp-terser@2.1.0: + dependencies: + plugin-error: 1.0.1 + terser: 5.31.3 + through2: 4.0.2 + vinyl-sourcemaps-apply: 0.2.1 + + gulp@4.0.2: + dependencies: + glob-watcher: 5.0.5 + gulp-cli: 2.3.0 + undertaker: 1.3.0 + vinyl-fs: 3.0.3 + transitivePeerDependencies: + - supports-color + + gulplog@1.0.0: + dependencies: + glogg: 1.0.2 + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + hard-rejection@2.1.0: {} + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + has-yarn@3.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + homedir-polyfill@1.0.3: + dependencies: + parse-passwd: 1.0.0 + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + html-tags@3.3.1: {} + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + http-cache-semantics@4.1.1: {} + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + human-signals@1.1.1: {} + + ieee754@1.2.1: {} + + ignore@5.2.4: {} + + ignore@5.3.1: {} + + image-size@1.1.1: + dependencies: + queue: 6.0.2 + + immediate@3.0.6: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + indent-string@5.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@2.0.0: {} + + ini@4.1.3: {} + + interpret@1.4.0: {} + + invert-kv@1.0.0: {} + + invert-kv@3.0.1: {} + + is-absolute@0.1.7: + dependencies: + is-relative: 0.1.3 + + is-absolute@1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-arrayish@0.2.1: {} + + is-binary-path@1.0.1: + dependencies: + binary-extensions: 1.13.1 + + is-buffer@1.1.6: {} + + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 + + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-docker@2.2.1: {} + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@1.0.0: + dependencies: + number-is-nan: 1.0.1 + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@3.1.0: + dependencies: + is-extglob: 2.1.1 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-installed-globally@0.4.0: + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + + is-mergeable-object@1.1.1: {} + + is-natural-number@4.0.1: {} + + is-negated-glob@1.0.0: {} + + is-npm@6.0.0: {} + + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + + is-number@4.0.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@1.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-plain-object@5.0.0: {} + + is-primitive@3.0.1: {} + + is-relative@0.1.3: {} + + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + + is-stream@1.1.0: {} + + is-stream@2.0.1: {} + + is-typedarray@1.0.0: {} + + is-unc-path@1.0.0: + dependencies: + unc-path-regex: 0.1.2 + + is-utf8@0.2.1: {} + + is-valid-glob@1.0.0: {} + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-yarn-global@0.4.1: {} + + isarray@1.0.0: {} + + isexe@1.1.2: {} + + isexe@2.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + isobject@3.0.1: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jed@1.1.1: {} + + jose@4.13.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@0.1.1: {} + + json-buffer@3.0.1: {} + + json-merge-patch@1.0.2: + dependencies: + fast-deep-equal: 3.1.3 + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: {} + + jsonc-parser@3.2.1: {} + + jsonc-parser@3.3.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonwebtoken@9.0.0: + dependencies: + jws: 3.2.2 + lodash: 4.17.21 + ms: 2.1.3 + semver: 7.6.3 + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + just-debounce@1.1.0: {} + + jwa@1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + + kind-of@5.1.0: {} + + kind-of@6.0.3: {} + + known-css-properties@0.29.0: {} + + last-run@1.1.1: + dependencies: + default-resolution: 2.0.0 + es6-weak-map: 2.0.3 + + latest-version@7.0.0: + dependencies: + package-json: 8.1.1 + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + lcid@1.0.0: + dependencies: + invert-kv: 1.0.0 + + lcid@3.1.1: + dependencies: + invert-kv: 3.0.1 + + lead@1.0.0: + dependencies: + flush-write-stream: 1.1.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + liftoff@3.1.0: + dependencies: + extend: 3.0.2 + findup-sync: 3.0.0 + fined: 1.2.0 + flagged-respawn: 1.0.1 + is-plain-object: 2.0.4 + object.map: 1.0.1 + rechoir: 0.6.2 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.2.5 + transitivePeerDependencies: + - supports-color + + lines-and-columns@1.2.4: {} + + lines-and-columns@2.0.4: {} + + linkify-it@4.0.1: + dependencies: + uc.micro: 1.0.6 + + load-json-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.truncate@4.4.2: {} + + lodash@4.17.21: {} + + loglevel-colored-level-prefix@1.0.0: + dependencies: + chalk: 1.1.3 + loglevel: 1.9.1 + + loglevel@1.9.1: {} + + lowercase-keys@3.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + make-dir@1.3.0: + dependencies: + pify: 3.0.0 + + make-error@1.3.6: {} + + make-iterator@1.0.1: + dependencies: + kind-of: 6.0.3 + + make-plural@7.4.0: {} + + map-age-cleaner@0.1.3: + dependencies: + p-defer: 1.0.0 + + map-cache@0.2.2: {} + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + + markdown-it@13.0.1: + dependencies: + argparse: 2.0.1 + entities: 3.0.1 + linkify-it: 4.0.1 + mdurl: 1.0.1 + uc.micro: 1.0.6 + + markdownlint-cli@0.37.0: + dependencies: + commander: 11.0.0 + get-stdin: 9.0.0 + glob: 10.3.16 + ignore: 5.2.4 + js-yaml: 4.1.0 + jsonc-parser: 3.2.1 + markdownlint: 0.31.1 + minimatch: 9.0.5 + run-con: 1.3.2 + + markdownlint-micromark@0.1.7: {} + + markdownlint@0.31.1: + dependencies: + markdown-it: 13.0.1 + markdownlint-micromark: 0.1.7 + + marky@1.2.5: {} + + matchdep@2.0.0: + dependencies: + findup-sync: 2.0.0 + micromatch: 3.1.10 + resolve: 1.22.8 + stack-trace: 0.0.10 + transitivePeerDependencies: + - supports-color + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + + mathml-tag-names@2.1.3: {} + + mdn-data@2.0.30: {} + + mdurl@1.0.1: {} + + mem@5.1.1: + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 2.1.0 + p-is-promise: 2.1.0 + + meow@10.1.5: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 7.0.2 + decamelize: 5.0.1 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 8.0.0 + redent: 4.0.0 + trim-newlines: 4.1.1 + type-fest: 1.4.0 + yargs-parser: 20.2.9 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@3.1.10: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + optional: true + + mkdirp@1.0.4: {} + + moment@2.30.1: + optional: true + + moo@0.5.2: {} + + mousetrap@1.6.5: {} + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + multimatch@6.0.0: + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 4.0.0 + array-union: 3.0.1 + minimatch: 3.1.2 + + mute-stdout@1.0.1: {} + + mv@2.1.1: + dependencies: + mkdirp: 0.5.6 + ncp: 2.0.0 + rimraf: 2.4.5 + optional: true + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nan@2.20.0: + optional: true + + nanoid@3.3.7: {} + + nanomatch@1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + natural-compare@1.4.0: {} + + ncp@2.0.0: + optional: true + + next-tick@1.1.0: {} + + node-domexception@1.0.0: {} + + node-fetch@3.3.1: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-forge@0.10.0: {} + + node-notifier@10.0.1: + dependencies: + growly: 1.3.0 + is-wsl: 2.2.0 + semver: 7.6.3 + shellwords: 0.1.1 + uuid: 8.3.2 + which: 2.0.2 + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.15.0 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + + normalize-path@2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + + normalize-path@3.0.0: {} + + normalize-url@8.0.1: {} + + now-and-later@2.0.1: + dependencies: + once: 1.4.0 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + number-is-nan@1.0.1: {} + + oauth-sign@0.9.0: {} + + object-assign@4.1.1: {} + + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + object-keys@1.1.1: {} + + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.defaults@1.1.0: + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + + object.map@1.0.1: + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + object.reduce@1.0.1: + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + + on-exit-leak-free@2.1.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ordered-read-streams@1.0.1: + dependencies: + readable-stream: 2.3.8 + + os-locale@1.4.0: + dependencies: + lcid: 1.0.0 + + os-locale@5.0.0: + dependencies: + execa: 4.1.0 + lcid: 3.1.1 + mem: 5.1.1 + + os-shim@0.1.3: {} + + p-cancelable@3.0.0: {} + + p-defer@1.0.0: {} + + p-is-promise@2.1.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-json@8.1.1: + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.6.3 + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-filepath@1.0.2: + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + + parse-json@2.2.0: + dependencies: + error-ex: 1.3.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-json@6.0.2: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 2.0.4 + + parse-node-version@1.0.1: {} + + parse-passwd@1.0.0: {} + + parse5-htmlparser2-tree-adapter@7.0.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + pascalcase@0.1.1: {} + + path-dirname@1.0.2: {} + + path-exists@2.1.0: + dependencies: + pinkie-promise: 2.0.1 + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-root-regex@0.1.2: {} + + path-root@0.1.1: + dependencies: + path-root-regex: 0.1.2 + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@1.1.0: + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + + path-type@4.0.0: {} + + pend@1.2.0: {} + + performance-now@2.1.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pify@3.0.0: {} + + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + + pino-std-serializers@6.2.2: {} + + pino@8.20.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 6.2.2 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.8.1 + thread-stream: 2.7.0 + + plugin-error@1.0.1: + dependencies: + ansi-colors: 1.1.0 + arr-diff: 4.0.0 + arr-union: 3.1.0 + extend-shallow: 3.0.2 + + posix-character-classes@0.1.1: {} + + postcss-resolve-nested-selector@0.1.4: {} + + postcss-safe-parser@6.0.0(postcss@8.4.40): + dependencies: + postcss: 8.4.40 + + postcss-selector-parser@6.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.40: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + prettier-eslint-cli@7.1.0(prettier-eslint@15.0.1): + dependencies: + '@messageformat/core': 3.3.0 + '@prettier/eslint': prettier-eslint@15.0.1 + arrify: 2.0.1 + boolify: 1.0.1 + camelcase-keys: 7.0.2 + chalk: 4.1.2 + common-tags: 1.8.2 + core-js: 3.37.1 + eslint: 8.57.0 + find-up: 5.0.0 + get-stdin: 8.0.0 + glob: 7.2.3 + ignore: 5.3.1 + indent-string: 4.0.0 + lodash.memoize: 4.1.2 + loglevel-colored-level-prefix: 1.0.0 + rxjs: 7.8.1 + yargs: 13.3.2 + optionalDependencies: + prettier-eslint: 15.0.1 + transitivePeerDependencies: + - supports-color + + prettier-eslint@15.0.1: + dependencies: + '@types/eslint': 8.56.11 + '@types/prettier': 2.7.3 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + common-tags: 1.8.2 + dlv: 1.1.3 + eslint: 8.57.0 + indent-string: 4.0.0 + lodash.merge: 4.6.2 + loglevel-colored-level-prefix: 1.0.0 + prettier: 2.8.8 + pretty-format: 23.6.0 + require-relative: 0.8.7 + typescript: 4.9.5 + vue-eslint-parser: 8.3.0(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + prettier@2.8.8: {} + + prettier@3.0.3: {} + + pretty-format@23.6.0: + dependencies: + ansi-regex: 3.0.1 + ansi-styles: 3.2.1 + + pretty-hrtime@1.0.3: {} + + process-nextick-args@2.0.1: {} + + process-warning@3.0.0: {} + + process@0.11.10: {} + + promise-toolbox@0.21.0: + dependencies: + make-error: 1.3.6 + + proto-list@1.2.4: {} + + psl@1.9.0: {} + + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + + punycode@2.3.1: {} + + pupa@3.1.0: + dependencies: + escape-goat: 4.0.0 + + qs@6.5.3: {} + + queue-microtask@1.2.3: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + quick-format-unescaped@4.0.4: {} + + quick-lru@5.1.1: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + read-pkg-up@1.0.1: + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + + read-pkg-up@8.0.0: + dependencies: + find-up: 5.0.0 + read-pkg: 6.0.0 + type-fest: 1.4.0 + + read-pkg@1.1.0: + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + + read-pkg@6.0.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 3.0.3 + parse-json: 5.2.0 + type-fest: 1.4.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdirp@2.2.1: + dependencies: + graceful-fs: 4.2.11 + micromatch: 3.1.10 + readable-stream: 2.3.8 + transitivePeerDependencies: + - supports-color + + real-require@0.2.0: {} + + rechoir@0.6.2: + dependencies: + resolve: 1.22.8 + + redent@4.0.0: + dependencies: + indent-string: 5.0.0 + strip-indent: 4.0.0 + + regenerator-runtime@0.13.11: {} + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regexpp@3.2.0: {} + + registry-auth-token@5.0.2: + dependencies: + '@pnpm/npm-conf': 2.2.2 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + relaxed-json@1.0.3: + dependencies: + chalk: 2.4.2 + commander: 2.20.3 + + remove-bom-buffer@3.0.0: + dependencies: + is-buffer: 1.1.6 + is-utf8: 0.2.1 + + remove-bom-stream@1.2.0: + dependencies: + remove-bom-buffer: 3.0.0 + safe-buffer: 5.2.1 + through2: 2.0.5 + + remove-trailing-separator@1.1.0: {} + + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + + replace-ext@1.0.1: {} + + replace-homedir@1.0.0: + dependencies: + homedir-polyfill: 1.0.3 + is-absolute: 1.0.0 + remove-trailing-separator: 1.1.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-main-filename@1.0.1: {} + + require-main-filename@2.0.0: {} + + require-relative@0.8.7: {} + + resolve-alpn@1.2.1: {} + + resolve-dir@1.0.1: + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-options@1.1.0: + dependencies: + value-or-function: 3.0.0 + + resolve-url@0.2.1: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + ret@0.1.15: {} + + reusify@1.0.4: {} + + rimraf@2.4.5: + dependencies: + glob: 6.0.4 + optional: true + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + + run-con@1.3.2: + dependencies: + deep-extend: 0.6.0 + ini: 4.1.3 + minimist: 1.2.8 + strip-json-comments: 3.1.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-identifier@0.4.2: {} + + safe-json-stringify@1.2.0: + optional: true + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + safe-stable-stringify@2.4.3: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + seek-bzip@1.0.6: + dependencies: + commander: 2.20.3 + + semver-compare@1.0.0: {} + + semver-diff@4.0.0: + dependencies: + semver: 7.6.3 + + semver-greatest-satisfied-range@1.1.0: + dependencies: + sver-compat: 1.5.0 + + semver@5.7.2: {} + + semver@7.6.2: {} + + semver@7.6.3: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + set-value@4.1.0: + dependencies: + is-plain-object: 2.0.4 + is-primitive: 3.0.1 + + setimmediate@1.0.5: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.7.3: {} + + shellcheck@2.2.0: + dependencies: + decompress: 4.2.1 + global-agent: 3.0.0 + + shellwords@0.1.1: {} + + sign-addon@5.3.0: + dependencies: + common-tags: 1.8.2 + core-js: 3.29.0 + deepcopy: 2.1.0 + es6-error: 4.1.1 + es6-promisify: 7.0.0 + jsonwebtoken: 9.0.0 + mz: 2.7.0 + request: 2.88.2 + source-map-support: 0.5.21 + stream-to-promise: 3.0.0 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + sonic-boom@3.8.1: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.0: {} + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-url@0.4.1: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + sparkles@1.0.1: {} + + spawn-sync@1.0.15: + dependencies: + concat-stream: 1.6.2 + os-shim: 0.1.3 + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.18 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.18 + + spdx-license-ids@3.0.18: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + split2@4.2.0: {} + + split@1.0.1: + dependencies: + through: 2.3.8 + + sprintf-js@1.1.3: {} + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + stack-trace@0.0.10: {} + + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + stream-exhaust@1.0.2: {} + + stream-shift@1.0.3: {} + + stream-to-array@2.3.0: + dependencies: + any-promise: 1.3.0 + + stream-to-promise@3.0.0: + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.4.4 + stream-to-array: 2.3.0 + + string-width@1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + + string-width@3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom-buf@2.0.0: + dependencies: + is-utf8: 0.2.1 + + strip-bom-stream@4.0.0: + dependencies: + first-chunk-stream: 3.0.0 + strip-bom-buf: 2.0.0 + + strip-bom@2.0.0: + dependencies: + is-utf8: 0.2.1 + + strip-bom@5.0.0: {} + + strip-dirs@2.1.0: + dependencies: + is-natural-number: 4.0.1 + + strip-final-newline@2.0.0: {} + + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + strip-json-comments@5.0.0: {} + + style-search@0.1.0: {} + + stylelint-config-recommended@13.0.0(stylelint@15.11.0(typescript@4.9.5)): + dependencies: + stylelint: 15.11.0(typescript@4.9.5) + + stylelint-config-standard@34.0.0(stylelint@15.11.0(typescript@4.9.5)): + dependencies: + stylelint: 15.11.0(typescript@4.9.5) + stylelint-config-recommended: 13.0.0(stylelint@15.11.0(typescript@4.9.5)) + + stylelint@15.11.0(typescript@4.9.5): + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.1) + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 8.3.6(typescript@4.9.5) + css-functions-list: 3.2.2 + css-tree: 2.3.1 + debug: 4.3.6 + fast-glob: 3.3.2 + fastest-levenshtein: 1.0.16 + file-entry-cache: 7.0.2 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.3.1 + import-lazy: 4.0.0 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.29.0 + mathml-tag-names: 2.1.3 + meow: 10.1.5 + micromatch: 4.0.7 + normalize-path: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.40 + postcss-resolve-nested-selector: 0.1.4 + postcss-safe-parser: 6.0.0(postcss@8.4.40) + postcss-selector-parser: 6.1.1 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + style-search: 0.1.0 + supports-hyperlinks: 3.0.0 + svg-tags: 1.0.0 + table: 6.8.2 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + + supports-color@2.0.0: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@3.0.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + sver-compat@1.5.0: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + + svg-tags@1.0.0: {} + + table@6.8.2: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tar-stream@1.6.2: + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.1.1 + xtend: 4.0.2 + + ternary-stream@3.0.0: + dependencies: + duplexify: 4.1.3 + fork-stream: 0.0.4 + merge-stream: 2.0.0 + through2: 3.0.2 + + terser@5.31.3: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thread-stream@2.7.0: + dependencies: + real-require: 0.2.0 + + through2-filter@3.0.0: + dependencies: + through2: 2.0.5 + xtend: 4.0.2 + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through2@3.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + through@2.3.8: {} + + time-stamp@1.1.0: {} + + tmp@0.2.1: + dependencies: + rimraf: 3.0.2 + + to-absolute-glob@2.0.2: + dependencies: + is-absolute: 1.0.0 + is-negated-glob: 1.0.0 + + to-buffer@1.1.1: {} + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + to-through@2.0.0: + dependencies: + through2: 2.0.5 + + tosource@1.0.0: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + + trim-newlines@4.1.1: {} + + tslib@1.14.1: {} + + tslib@2.6.3: {} + + tsutils@3.21.0(typescript@4.9.5): + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.1.0: {} + + type-fest@0.13.1: {} + + type-fest@0.20.2: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + + type@2.7.3: {} + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typedarray@0.0.6: {} + + typescript@4.9.5: {} + + uc.micro@1.0.6: {} + + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + + unc-path-regex@0.1.2: {} + + undertaker-registry@1.0.1: {} + + undertaker@1.3.0: + dependencies: + arr-flatten: 1.1.0 + arr-map: 2.0.2 + bach: 1.2.0 + collection-map: 1.0.0 + es6-weak-map: 2.0.3 + fast-levenshtein: 1.1.4 + last-run: 1.1.1 + object.defaults: 1.1.0 + object.reduce: 1.0.1 + undertaker-registry: 1.0.1 + + undici-types@6.11.1: {} + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + unique-stream@2.3.1: + dependencies: + json-stable-stringify-without-jsonify: 1.0.1 + through2-filter: 3.0.0 + + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + + universalify@1.0.0: {} + + universalify@2.0.1: {} + + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + upath@1.2.0: {} + + upath@2.0.1: {} + + update-notifier@6.0.2: + dependencies: + boxen: 7.1.1 + chalk: 5.3.0 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.0.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.1.0 + semver: 7.6.3 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urix@0.1.0: {} + + use@3.1.1: {} + + util-deprecate@1.0.2: {} + + uuid@3.4.0: {} + + uuid@8.3.2: {} + + v8flags@3.2.0: + dependencies: + homedir-polyfill: 1.0.3 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + value-or-function@3.0.0: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + vinyl-fs@3.0.3: + dependencies: + fs-mkdirp-stream: 1.0.0 + glob-stream: 6.1.0 + graceful-fs: 4.2.11 + is-valid-glob: 1.0.0 + lazystream: 1.0.1 + lead: 1.0.0 + object.assign: 4.1.5 + pumpify: 1.5.1 + readable-stream: 2.3.8 + remove-bom-buffer: 3.0.0 + remove-bom-stream: 1.2.0 + resolve-options: 1.1.0 + through2: 2.0.5 + to-through: 2.0.0 + value-or-function: 3.0.0 + vinyl: 2.2.1 + vinyl-sourcemap: 1.1.0 + + vinyl-sourcemap@1.1.0: + dependencies: + append-buffer: 1.0.2 + convert-source-map: 1.9.0 + graceful-fs: 4.2.11 + normalize-path: 2.1.1 + now-and-later: 2.0.1 + remove-bom-buffer: 3.0.0 + vinyl: 2.2.1 + + vinyl-sourcemaps-apply@0.2.1: + dependencies: + source-map: 0.5.7 + + vinyl@2.2.1: + dependencies: + clone: 2.1.2 + clone-buffer: 1.0.0 + clone-stats: 1.0.0 + cloneable-readable: 1.1.3 + remove-trailing-separator: 1.1.0 + replace-ext: 1.0.1 + + vscode-json-languageservice@4.2.1: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-nls@5.2.0: {} + + vscode-uri@3.0.8: {} + + vue-eslint-parser@8.3.0(eslint@8.57.0): + dependencies: + debug: 4.3.6 + eslint: 8.57.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + watchpack@2.4.0: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-ext@7.12.0: + dependencies: + '@babel/runtime': 7.21.0 + '@devicefarmer/adbkit': 3.2.3 + addons-linter: 6.28.0(node-fetch@3.3.1) + bunyan: 1.8.15 + camelcase: 7.0.1 + chrome-launcher: 0.15.1 + debounce: 1.2.1 + decamelize: 6.0.0 + es6-error: 4.1.1 + firefox-profile: 4.3.2 + fs-extra: 11.1.0 + fx-runner: 1.4.0 + import-fresh: 3.3.0 + jose: 4.13.1 + mkdirp: 1.0.4 + multimatch: 6.0.0 + mz: 2.7.0 + node-fetch: 3.3.1 + node-notifier: 10.0.1 + open: 8.4.2 + parse-json: 6.0.2 + promise-toolbox: 0.21.0 + sign-addon: 5.3.0 + source-map-support: 0.5.21 + strip-bom: 5.0.0 + strip-json-comments: 5.0.0 + tmp: 0.2.1 + update-notifier: 6.0.2 + watchpack: 2.4.0 + ws: 8.13.0 + yargs: 17.7.1 + zip-dir: 2.0.0 + transitivePeerDependencies: + - body-parser + - bufferutil + - express + - safe-compare + - supports-color + - utf-8-validate + + web-streams-polyfill@3.3.3: {} + + webextension-polyfill@0.10.0: {} + + when@3.7.7: {} + + which-module@1.0.0: {} + + which-module@2.0.1: {} + + which@1.2.4: + dependencies: + is-absolute: 0.1.7 + isexe: 1.1.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@4.0.1: + dependencies: + string-width: 5.1.2 + + winreg@0.0.12: {} + + word-wrap@1.2.5: {} + + wrap-ansi@2.1.0: + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + + wrap-ansi@5.1.0: + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + ws@8.13.0: {} + + xdg-basedir@5.1.0: {} + + xml2js@0.5.0: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + xtend@4.0.2: {} + + y18n@3.2.2: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yargs-parser@13.1.2: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs-parser@5.0.1: + dependencies: + camelcase: 3.0.0 + object.assign: 4.1.5 + + yargs@13.3.2: + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 13.1.2 + + yargs@17.7.1: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yargs@7.1.2: + dependencies: + camelcase: 3.0.0 + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.3 + os-locale: 1.4.0 + read-pkg-up: 1.0.1 + require-directory: 2.1.1 + require-main-filename: 1.0.1 + set-blocking: 2.0.0 + string-width: 1.0.2 + which-module: 1.0.0 + y18n: 3.2.2 + yargs-parser: 5.0.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} + + zip-dir@2.0.0: + dependencies: + async: 3.2.5 + jszip: 3.10.1 diff --git a/src/browser-polyfill.js b/src/browser-polyfill.js new file mode 100644 index 00000000..0758a1e9 --- /dev/null +++ b/src/browser-polyfill.js @@ -0,0 +1,8 @@ +(function(a,b){if("function"==typeof define&&define.amd)define("webextension-polyfill",["module"],b);else if("undefined"!=typeof exports)b(module);else{var c={exports:{}};b(c),a.browser=c.exports}})("undefined"==typeof globalThis?"undefined"==typeof self?this:self:globalThis,function(a){"use strict";if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(!(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)){a.exports=(a=>{const b={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(b).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class c extends WeakMap{constructor(a,b=void 0){super(b),this.createItem=a}get(a){return this.has(a)||this.set(a,this.createItem(a)),super.get(a)}}const d=a=>a&&"object"==typeof a&&"function"==typeof a.then,e=(b,c)=>(...d)=>{a.runtime.lastError?b.reject(new Error(a.runtime.lastError.message)):c.singleCallbackArg||1>=d.length&&!1!==c.singleCallbackArg?b.resolve(d[0]):b.resolve(d)},f=a=>1==a?"argument":"arguments",g=(a,b)=>function(c,...d){if(d.lengthb.maxArgs)throw new Error(`Expected at most ${b.maxArgs} ${f(b.maxArgs)} for ${a}(), got ${d.length}`);return new Promise((f,g)=>{if(b.fallbackToNoCallback)try{c[a](...d,e({resolve:f,reject:g},b))}catch(e){console.warn(`${a} API method doesn't seem to support the callback parameter, `+"falling back to call it without a callback: ",e),c[a](...d),b.fallbackToNoCallback=!1,b.noCallback=!0,f()}else b.noCallback?(c[a](...d),f()):c[a](...d,e({resolve:f,reject:g},b))})},h=(a,b,c)=>new Proxy(b,{apply(b,d,e){return c.call(d,a,...e)}});let i=Function.call.bind(Object.prototype.hasOwnProperty);const j=(a,b={},c={})=>{let d=Object.create(null),e=Object.create(a);return new Proxy(e,{has(b,c){return c in a||c in d},get(e,f){if(f in d)return d[f];if(!(f in a))return;let k=a[f];if("function"==typeof k){if("function"==typeof b[f])k=h(a,a[f],b[f]);else if(i(c,f)){let b=g(f,c[f]);k=h(a,a[f],b)}else k=k.bind(a);}else if("object"==typeof k&&null!==k&&(i(b,f)||i(c,f)))k=j(k,b[f],c[f]);else if(i(c,"*"))k=j(k,b[f],c["*"]);else return Object.defineProperty(d,f,{configurable:!0,enumerable:!0,get(){return a[f]},set(b){a[f]=b}}),k;return d[f]=k,k},set(b,c,e){return c in d?d[c]=e:a[c]=e,!0},defineProperty(a,b,c){return Reflect.defineProperty(d,b,c)},deleteProperty(a,b){return Reflect.deleteProperty(d,b)}})},k=a=>({addListener(b,c,...d){b.addListener(a.get(c),...d)},hasListener(b,c){return b.hasListener(a.get(c))},removeListener(b,c){b.removeListener(a.get(c))}}),l=new c(a=>"function"==typeof a?function(b){const c=j(b,{},{getContent:{minArgs:0,maxArgs:0}});a(c)}:a),m=new c(a=>"function"==typeof a?function(b,c,e){let f,g,h=!1,i=new Promise(a=>{f=function(b){h=!0,a(b)}});try{g=a(b,c,f)}catch(a){g=Promise.reject(a)}const j=!0!==g&&d(g);if(!0!==g&&!j&&!h)return!1;const k=a=>{a.then(a=>{e(a)},a=>{let b;b=a&&(a instanceof Error||"string"==typeof a.message)?a.message:"An unexpected error occurred",e({__mozWebExtensionPolyfillReject__:!0,message:b})}).catch(a=>{console.error("Failed to send onMessage rejected reply",a)})};return j?k(g):k(i),!0}:a),n=({reject:b,resolve:c},d)=>{a.runtime.lastError?a.runtime.lastError.message==="The message port closed before a response was received."?c():b(new Error(a.runtime.lastError.message)):d&&d.__mozWebExtensionPolyfillReject__?b(new Error(d.message)):c(d)},o=(a,b,c,...d)=>{if(d.lengthb.maxArgs)throw new Error(`Expected at most ${b.maxArgs} ${f(b.maxArgs)} for ${a}(), got ${d.length}`);return new Promise((a,b)=>{const e=n.bind(null,{resolve:a,reject:b});d.push(e),c.sendMessage(...d)})},p={devtools:{network:{onRequestFinished:k(l)}},runtime:{onMessage:k(m),onMessageExternal:k(m),sendMessage:o.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:o.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},q={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return b.privacy={network:{"*":q},services:{"*":q},websites:{"*":q}},j(a,p,b)})(chrome)}else a.exports=globalThis.browser}); +//# sourceMappingURL=browser-polyfill.min.js.map + +// webextension-polyfill v.0.12.0 (https://github.com/mozilla/webextension-polyfill) + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ diff --git a/src/manifest.json b/src/manifest.json index a26ca079..c9b17b15 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -31,6 +31,7 @@ "content_scripts": [ { "js": [ + "userscript-polyfill.js", "browser-polyfill.js", "mousetrap.js", "mousetrap-global-bind.js", diff --git a/src/mousetrap-global-bind.js b/src/mousetrap-global-bind.js new file mode 100644 index 00000000..073ce670 --- /dev/null +++ b/src/mousetrap-global-bind.js @@ -0,0 +1 @@ +(function(a){var c={},d=a.prototype.stopCallback;a.prototype.stopCallback=function(e,b,a,f){return this.paused?!0:c[a]||c[f]?!1:d.call(this,e,b,a)};a.prototype.bindGlobal=function(a,b,d){this.bind(a,b,d);if(a instanceof Array)for(b=0;bc||n.hasOwnProperty(c)&&(p[n[c]]=c)}g=p[e]?"keydown":"keypress"}"keypress"==g&&d.length&&(g="keydown");return{key:m,modifiers:d,action:g}}function D(a,b){return null===a||a===u?!1:a===b?!0:D(a.parentNode,b)}function d(a){function b(a){a= +a||{};var b=!1,l;for(l in p)a[l]?b=!0:p[l]=0;b||(x=!1)}function g(a,b,t,f,g,d){var l,E=[],h=t.type;if(!k._callbacks[a])return[];"keyup"==h&&w(a)&&(b=[a]);for(l=0;l":".","?":"/","|":"\\"},B={option:"alt",command:"meta","return":"enter", +escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},p;for(c=1;20>c;++c)n[111+c]="f"+c;for(c=0;9>=c;++c)n[c+96]=c.toString();d.prototype.bind=function(a,b,c){a=a instanceof Array?a:[a];this._bindMultiple.call(this,a,b,c);return this};d.prototype.unbind=function(a,b){return this.bind.call(this,a,function(){},b)};d.prototype.trigger=function(a,b){if(this._directMap[a+":"+b])this._directMap[a+":"+b]({},a);return this};d.prototype.reset=function(){this._callbacks={}; +this._directMap={};return this};d.prototype.stopCallback=function(a,b){if(-1<(" "+b.className+" ").indexOf(" mousetrap ")||D(b,this.target))return!1;if("composedPath"in a&&"function"===typeof a.composedPath){var c=a.composedPath()[0];c!==a.target&&(b=c)}return"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable};d.prototype.handleKey=function(){return this._handleKey.apply(this,arguments)};d.addKeycodes=function(a){for(var b in a)a.hasOwnProperty(b)&&(n[b]=a[b]);p=null}; +d.init=function(){var a=d(u),b;for(b in a)"_"!==b.charAt(0)&&(d[b]=function(b){return function(){return a[b].apply(a,arguments)}}(b))};d.init();q.Mousetrap=d;"undefined"!==typeof module&&module.exports&&(module.exports=d);"function"===typeof define&&define.amd&&define(function(){return d})}})("undefined"!==typeof window?window:null,"undefined"!==typeof window?document:null); diff --git a/src/options.js b/src/options.js index 999a1d3b..0899d9a6 100644 --- a/src/options.js +++ b/src/options.js @@ -231,11 +231,63 @@ class BrowserStorage { } getAll() { // Merge options from storage with defaults. - return {...this.defaultValues, ...this.values}; + return { ...this.defaultValues, ...this.values }; + } +} + +const STORAGE_KEY = 'webSearchNavigator'; + +class LocalStorage { + constructor(defaultValues) { + this.values = {}; + this.defaultValues = defaultValues; + this.load(); + } + + load() { + const storedData = localStorage.getItem(STORAGE_KEY); + + if (storedData) { + this.values = JSON.parse(storedData); + } else { + this.values = { ...this.defaultValues }; + this.save(); + } + } + + save() { + localStorage.setItem(STORAGE_KEY, JSON.stringify(this.values)); + } + + get(key) { + const value = this.values[key]; + if (value != null) { + return value; + } + return this.defaultValues[key]; + } + + set(key, value) { + this.values[key] = value; + this.save(); + } + + clear() { + localStorage.removeItem(STORAGE_KEY); + this.values = { ...this.defaultValues }; + } + + getAll() { + // Merge options from storage with defaults. + return { ...this.defaultValues, ...this.values }; } } const createSyncedOptions = () => { + if (globalThis.IS_USERSCRIPT) { + console.log('Create LocalStorage options'); + return new LocalStorage(DEFAULT_OPTIONS); + } return new BrowserStorage(browser.storage.sync, DEFAULT_OPTIONS); }; @@ -243,6 +295,10 @@ const createSyncedOptions = () => { class ExtensionOptions { constructor() { this.sync = createSyncedOptions(); + if (globalThis.IS_USERSCRIPT) { + this.local = createSyncedOptions(); + return; + } this.local = new BrowserStorage(browser.storage.local, { lastQueryUrl: null, lastFocusedIndex: 0, diff --git a/src/options_page.js b/src/options_page.js index b35290e5..bc9b3b6b 100644 --- a/src/options_page.js +++ b/src/options_page.js @@ -74,6 +74,10 @@ const OPTIONAL_PERMISSIONS_URLS = { 'custom-gitlab': ['https://*/*'], }; +globalThis._browser_userscript_polyfill.permissions.getAll = () => ({ + origins: Object.values(OPTIONAL_PERMISSIONS_URLS).flat(), +}) + const KEYBINDING_TO_DIV = { nextKey: 'next-key', previousKey: 'previous-key', @@ -172,6 +176,7 @@ class OptionsPageManager { return this.options.get(key); }; const setOpt = (key, value) => { + console.log('Set', key, value, this.options.storage, this.options); this.options.set(key, value); }; // Handle non-keybindings settings first diff --git a/src/userscript-options.js b/src/userscript-options.js new file mode 100644 index 00000000..2d1591e6 --- /dev/null +++ b/src/userscript-options.js @@ -0,0 +1,127 @@ +// Some weird escaping things going on +const NEWLINE = String.fromCharCode(10); + +const OPTIONS_HTML = atob( + ` + +__OPTIONS_HTML__ + +`.replaceAll(NEWLINE, ''), +); + +const OPTIONS_CSS = atob( + ` + +__OPTIONS_CSS__ + +`.replaceAll(NEWLINE, ''), +); + +const OPTIONS_JS = atob( + ` + +__OPTIONS_JS__ + +`.replaceAll(NEWLINE, ''), +); + +const OPTIONS_PAGE_JS = atob( + ` + +__OPTIONS_PAGE_JS__ + +`.replaceAll(NEWLINE, ''), +); + +const BROWSER_POLYFILL_JS = atob( + ` + +__BROWSER_POLYFILL_JS__ + +`.replaceAll(NEWLINE, ''), +); + +function showOptions() { + const CONTAINER_ID = 'webNavigatorIframe'; + if (document.getElementById(CONTAINER_ID)) { + document.getElementById(CONTAINER_ID).remove(); + } + const iframe = document.createElement('iframe'); + const iframe_container = document.createElement('div'); + + iframe_container.id = CONTAINER_ID; + iframe_container.onclick = () => { + iframe_container?.remove(); + }; + iframe.onclick = (e) => { + e.stopPropagation(); + }; + + const BETTER_STYLES = ` + + body {padding: 30px; max-width: 600px; margin: 0 auto;} + * {box-sizing: border-box; padding: 0; margin: 0; font-family: sans-serif;} + h1, h2, h3 {font-weight: 100;} + + `; + const OUT_HTML = OPTIONS_HTML.replaceAll( + ``, + ``, + ) + .replaceAll( + ``, + ``, + ) + .replaceAll( + ``, + ``, + ) + .replaceAll( + ``, + ``, + ); + + console.log({ OUT_HTML }); + iframe.srcdoc = OUT_HTML; + Object.assign(iframe_container.style, { + position: 'fixed', + display: 'grid', + cursor: 'pointer', + placeItems: 'center', + inset: 0, + backgroundColor: '#0003', + zIndex: 100000, + }); + iframe_container.appendChild(iframe); + Object.assign(iframe.style, { + width: '80vw', + height: '80vh', + border: 'none', + borderRadius: '3px', + overflow: 'hidden', + background: '#fff', + }); + document.body.appendChild(iframe_container); + return { el: iframe, container: iframe_container }; +} +globalThis.showOptions = showOptions; +// console.log(showOptions); +// setTimeout(() => showOptions(), 4000); + +// TODO: Make the options page use postMessage to parent and localStorage to utilize settings + +function blobToDataURL(blob) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = function (e) { + resolve(reader.result); + }; + reader.onerror = function (e) { + reject(reader.error); + }; + reader.onabort = function (e) { + reject(new Error('Read aborted')); + }; + reader.readAsDataURL(blob); + }); +} diff --git a/src/userscript-polyfill.js b/src/userscript-polyfill.js new file mode 100644 index 00000000..89d9b821 --- /dev/null +++ b/src/userscript-polyfill.js @@ -0,0 +1,45 @@ +globalThis.IS_USERSCRIPT = true; + +const USE_GM = false; +const PREFIX = 'userscript-polyfill'; + +globalThis._localStorage_browser_polyfill = { + get: async (...args) => { + args = args.filter(Boolean); + debugger; + console.log('[localStorage] Get: ', ...args); + const out = {}; + for (const k of args) { + out[k] = USE_GM ? GM_getValue(k) : localStorage[`${PREFIX}_${k}`]; + } + return out; + }, + set: async (...args) => { + debugger; + console.log('[localStorage] Set: ', ...args); + }, + clear: async () => { + debugger; + console.log('[localStorage] Clear'); + }, +}; + +globalThis._browser_userscript_polyfill = { + runtime: { + sendMessage: (msg) => { + if (msg.type === 'tabsCreate') { + window.open(msg.options.url, '_blank'); + } + }, + id: '093889f3-43be-45e3-bc5a-e257e75b466d', + }, + storage: {sync: globalThis._localStorage_browser_polyfill, local: globalThis._localStorage_browser_polyfill}, + permissions: { + remove: () => {}, + add: () => {}, + request: () => {}, + getAll: () => ({}), + }, +}; +console.log(globalThis.browser, _browser_userscript_polyfill); +Object.assign(globalThis, {browser: globalThis._browser_userscript_polyfill, chrome: globalThis._browser_userscript_polyfill}); diff --git a/src/webext-dynamic-content-scripts.js b/src/webext-dynamic-content-scripts.js new file mode 100644 index 00000000..8599ba3a --- /dev/null +++ b/src/webext-dynamic-content-scripts.js @@ -0,0 +1,412 @@ +/* https://github.com/fregante/webext-dynamic-content-scripts @ v8.1.1 */ + +(function () { + 'use strict'; + + function NestedProxy$1(target) { + return new Proxy(target, { + get(target, prop) { + if (typeof target[prop] !== 'function') { + return new NestedProxy$1(target[prop]); + } + return (...arguments_) => + new Promise((resolve, reject) => { + target[prop](...arguments_, result => { + if (chrome.runtime.lastError) { + reject(new Error(chrome.runtime.lastError.message)); + } else { + resolve(result); + } + }); + }); + } + }); + } + const chromeP$1 = globalThis.chrome && new NestedProxy$1(globalThis.chrome); + + const gotScripting = typeof chrome === 'object' && 'scripting' in chrome; + function castTarget(target) { + return typeof target === 'object' ? target : { + tabId: target, + frameId: 0, + }; + } + function castArray(possibleArray) { + if (Array.isArray(possibleArray)) { + return possibleArray; + } + return [possibleArray]; + } + async function executeFunction(target, function_, ...args) { + const { frameId, tabId } = castTarget(target); + if (gotScripting) { + const [injection] = await chrome.scripting.executeScript({ + target: { + tabId, + frameIds: [frameId], + }, + func: function_, + args, + }); + return injection === null || injection === void 0 ? void 0 : injection.result; + } + const [result] = await chromeP$1.tabs.executeScript(tabId, { + code: `(${function_.toString()})(...${JSON.stringify(args)})`, + frameId, + }); + return result; + } + function arrayOrUndefined(value) { + return typeof value === 'undefined' ? undefined : [value]; + } + function insertCSS({ tabId, frameId, files, allFrames, matchAboutBlank, runAt, }) { + for (let content of files) { + if (typeof content === 'string') { + content = { file: content }; + } + if (gotScripting) { + void chrome.scripting.insertCSS({ + target: { + tabId, + frameIds: arrayOrUndefined(frameId), + allFrames, + }, + files: 'file' in content ? [content.file] : undefined, + css: 'code' in content ? content.code : undefined, + }); + } + else { + void chromeP$1.tabs.insertCSS(tabId, { + ...content, + matchAboutBlank, + allFrames, + frameId, + runAt: runAt !== null && runAt !== void 0 ? runAt : 'document_start', + }); + } + } + } + async function executeScript({ tabId, frameId, files, allFrames, matchAboutBlank, runAt, }) { + let lastInjection; + for (let content of files) { + if (typeof content === 'string') { + content = { file: content }; + } + if (gotScripting) { + if ('code' in content) { + throw new Error('chrome.scripting does not support injecting strings of `code`'); + } + void chrome.scripting.executeScript({ + target: { + tabId, + frameIds: arrayOrUndefined(frameId), + allFrames, + }, + files: [content.file], + }); + } + else { + if ('code' in content) { + await lastInjection; + } + lastInjection = chromeP$1.tabs.executeScript(tabId, { + ...content, + matchAboutBlank, + allFrames, + frameId, + runAt, + }); + } + } + } + async function injectContentScript(target, scripts) { + var _a, _b, _c, _d, _e, _f; + const { frameId, tabId } = typeof target === 'object' ? target : { + tabId: target, + frameId: 0, + }; + const injections = []; + for (const script of castArray(scripts)) { + insertCSS({ + tabId, + frameId, + files: (_a = script.css) !== null && _a !== void 0 ? _a : [], + matchAboutBlank: (_b = script.matchAboutBlank) !== null && _b !== void 0 ? _b : script.match_about_blank, + runAt: (_c = script.runAt) !== null && _c !== void 0 ? _c : script.run_at, + }); + void executeScript({ + tabId, + frameId, + files: (_d = script.js) !== null && _d !== void 0 ? _d : [], + matchAboutBlank: (_e = script.matchAboutBlank) !== null && _e !== void 0 ? _e : script.match_about_blank, + runAt: (_f = script.runAt) !== null && _f !== void 0 ? _f : script.run_at, + }); + } + await Promise.all(injections); + } + + function NestedProxy(target) { + return new Proxy(target, { + get(target, prop) { + if (typeof target[prop] !== 'function') { + return new NestedProxy(target[prop]); + } + return (...arguments_) => + new Promise((resolve, reject) => { + target[prop](...arguments_, result => { + if (chrome.runtime.lastError) { + reject(new Error(chrome.runtime.lastError.message)); + } else { + resolve(result); + } + }); + }); + } + }); + } + const chromeP = globalThis.chrome && new NestedProxy(globalThis.chrome); + + const patternValidationRegex = /^(https?|wss?|file|ftp|\*):\/\/(\*|\*\.[^*/]+|[^*/]+)\/.*$|^file:\/\/\/.*$|^resource:\/\/(\*|\*\.[^*/]+|[^*/]+)\/.*$|^about:/; + const isFirefox = typeof navigator === 'object' && navigator.userAgent.includes('Firefox/'); + const allStarsRegex = isFirefox ? /^(https?|wss?):[/][/][^/]+([/].*)?$/ : /^https?:[/][/][^/]+([/].*)?$/; + const allUrlsRegex = /^(https?|file|ftp):[/]+/; + function getRawRegex(matchPattern) { + if (!patternValidationRegex.test(matchPattern)) { + throw new Error(matchPattern + ' is an invalid pattern, it must match ' + String(patternValidationRegex)); + } + let [, protocol, host, pathname] = matchPattern.split(/(^[^:]+:[/][/])([^/]+)?/); + protocol = protocol + .replace('*', isFirefox ? '(https?|wss?)' : 'https?') + .replace(/[/]/g, '[/]'); + host = (host !== null && host !== void 0 ? host : '') + .replace(/^[*][.]/, '([^/]+.)*') + .replace(/^[*]$/, '[^/]+') + .replace(/[.]/g, '[.]') + .replace(/[*]$/g, '[^.]+'); + pathname = pathname + .replace(/[/]/g, '[/]') + .replace(/[.]/g, '[.]') + .replace(/[*]/g, '.*'); + return '^' + protocol + host + '(' + pathname + ')?$'; + } + function patternToRegex(...matchPatterns) { + if (matchPatterns.length === 0) { + return /$./; + } + if (matchPatterns.includes('')) { + return allUrlsRegex; + } + if (matchPatterns.includes('*://*/*')) { + return allStarsRegex; + } + return new RegExp(matchPatterns.map(x => getRawRegex(x)).join('|')); + } + + const gotNavigation = typeof chrome === 'object' && 'webNavigation' in chrome; + async function isOriginPermitted(url) { + return chromeP.permissions.contains({ + origins: [new URL(url).origin + '/*'], + }); + } + async function wasPreviouslyLoaded(target, assets) { + const loadCheck = (key) => { + const wasLoaded = document[key]; + document[key] = true; + return wasLoaded; + }; + return executeFunction(target, loadCheck, JSON.stringify(assets)); + } + async function registerContentScript$1(contentScriptOptions, callback) { + const { js = [], css = [], matchAboutBlank, matches, excludeMatches, runAt, } = contentScriptOptions; + let { allFrames } = contentScriptOptions; + if (gotNavigation) { + allFrames = false; + } + else if (allFrames) { + console.warn('`allFrames: true` requires the `webNavigation` permission to work correctly: https://github.com/fregante/content-scripts-register-polyfill#permissions'); + } + const matchesRegex = patternToRegex(...matches); + const excludeMatchesRegex = patternToRegex(...excludeMatches !== null && excludeMatches !== void 0 ? excludeMatches : []); + const inject = async (url, tabId, frameId = 0) => { + if (!matchesRegex.test(url) + || excludeMatchesRegex.test(url) + || !await isOriginPermitted(url) + || await wasPreviouslyLoaded({ tabId, frameId }, { js, css }) + ) { + return; + } + insertCSS({ + tabId, + frameId, + files: css, + matchAboutBlank, + runAt, + }); + await executeScript({ + tabId, + frameId, + files: js, + matchAboutBlank, + runAt, + }); + }; + const tabListener = async (tabId, { status }, { url }) => { + if (status && url) { + void inject(url, tabId); + } + }; + const navListener = async ({ tabId, frameId, url, }) => { + void inject(url, tabId, frameId); + }; + if (gotNavigation) { + chrome.webNavigation.onCommitted.addListener(navListener); + } + else { + chrome.tabs.onUpdated.addListener(tabListener); + } + const registeredContentScript = { + async unregister() { + if (gotNavigation) { + chrome.webNavigation.onCommitted.removeListener(navListener); + } + else { + chrome.tabs.onUpdated.removeListener(tabListener); + } + }, + }; + if (typeof callback === 'function') { + callback(registeredContentScript); + } + return registeredContentScript; + } + + function getManifestPermissionsSync() { + return _getManifestPermissionsSync(chrome.runtime.getManifest()); + } + function _getManifestPermissionsSync(manifest) { + var _a, _b, _c; + const manifestPermissions = { + origins: [], + permissions: [], + }; + const list = new Set([ + ...((_a = manifest.permissions) !== null && _a !== void 0 ? _a : []), + ...((_b = manifest.content_scripts) !== null && _b !== void 0 ? _b : []).flatMap(config => { var _a; return (_a = config.matches) !== null && _a !== void 0 ? _a : []; }), + ]); + if (manifest.devtools_page + && !((_c = manifest.optional_permissions) === null || _c === void 0 ? void 0 : _c.includes('devtools'))) { + list.add('devtools'); + } + for (const permission of list) { + if (permission.includes('://')) { + manifestPermissions.origins.push(permission); + } + else { + manifestPermissions.permissions.push(permission); + } + } + return manifestPermissions; + } + const hostRegex = /:[/][/][*.]*([^/]+)/; + function parseDomain(origin) { + return origin.split(hostRegex)[1]; + } + async function getAdditionalPermissions(options) { + return new Promise(resolve => { + chrome.permissions.getAll(currentPermissions => { + const manifestPermissions = getManifestPermissionsSync(); + resolve(_getAdditionalPermissions(manifestPermissions, currentPermissions, options)); + }); + }); + } + function _getAdditionalPermissions(manifestPermissions, currentPermissions, { strictOrigins = true } = {}) { + var _a, _b; + const additionalPermissions = { + origins: [], + permissions: [], + }; + for (const origin of (_a = currentPermissions.origins) !== null && _a !== void 0 ? _a : []) { + if (manifestPermissions.origins.includes(origin)) { + continue; + } + if (!strictOrigins) { + const domain = parseDomain(origin); + const isDomainInManifest = manifestPermissions.origins + .some(manifestOrigin => parseDomain(manifestOrigin) === domain); + if (isDomainInManifest) { + continue; + } + } + additionalPermissions.origins.push(origin); + } + for (const permission of (_b = currentPermissions.permissions) !== null && _b !== void 0 ? _b : []) { + if (!manifestPermissions.permissions.includes(permission)) { + additionalPermissions.permissions.push(permission); + } + } + return additionalPermissions; + } + + var _a, _b, _c; + const registeredScripts = new Map(); + const registerContentScript = (_c = (_b = (_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.browser) === null || _a === void 0 ? void 0 : _a.contentScripts) === null || _b === void 0 ? void 0 : _b.register) !== null && _c !== void 0 ? _c : registerContentScript$1; + function convertPath(file) { + const url = new URL(file, location.origin); + return { file: url.pathname }; + } + function injectOnExistingTabs(origins, scripts) { + if (origins.length === 0) { + return; + } + chrome.tabs.query({ + url: origins, + }, tabs => { + for (const tab of tabs) { + if (tab.id) { + void injectContentScript(tab.id, scripts); + } + } + }); + } + async function registerOnOrigins({ origins: newOrigins, }) { + const manifest = chrome.runtime.getManifest().content_scripts; + if (!manifest) { + throw new Error('webext-dynamic-content-scripts tried to register scripts on th new host permissions, but no content scripts were found in the manifest.'); + } + for (const origin of newOrigins || []) { + for (const config of manifest) { + const registeredScript = registerContentScript({ + js: (config.js || []).map(file => convertPath(file)), + css: (config.css || []).map(file => convertPath(file)), + allFrames: config.all_frames, + matches: [origin], + excludeMatches: config.matches, + runAt: config.run_at, + }); + registeredScripts.set(origin, registeredScript); + } + } + injectOnExistingTabs(newOrigins || [], manifest); + } + (async () => { + void registerOnOrigins(await getAdditionalPermissions({ + strictOrigins: false, + })); + })(); + chrome.permissions.onAdded.addListener(permissions => { + if (permissions.origins && permissions.origins.length > 0) { + void registerOnOrigins(permissions); + } + }); + chrome.permissions.onRemoved.addListener(async ({ origins }) => { + if (!origins || origins.length === 0) { + return; + } + for (const [origin, script] of registeredScripts) { + if (origins.includes(origin)) { + void (await script).unregister(); + } + } + }); + +}()); diff --git a/tools/make-userscript.sh b/tools/make-userscript.sh new file mode 100755 index 00000000..2a0e7509 --- /dev/null +++ b/tools/make-userscript.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +OUTDIR="../build/userscript" +mkdir -p $OUTDIR +OUTDIR=$(realpath $OUTDIR) +PTH=$(realpath ../src) + +# Get libraries for some reason that are gitignored +curl https://raw.githubusercontent.com/ccampbell/mousetrap/master/mousetrap.min.js > $PTH/mousetrap.js +curl https://unpkg.com/webextension-polyfill@0.12.0/dist/browser-polyfill.min.js > $PTH/browser-polyfill.js +curl https://raw.githubusercontent.com/ccampbell/mousetrap/master/plugins/global-bind/mousetrap-global-bind.min.js > $PTH/mousetrap-global-bind.js +cp "../vendor/webext-dynamic-content-scripts.js" $PTH/webext-dynamic-content-scripts.js + +if ! command -v uglifyjs &> /dev/null +then + echo "uglify-js could not be found, installing" + pnpm i -g uglify-js +fi + +key(){ + cat ../src/manifest.json | jq -r "$1" +} + +ICONPATH="$PTH/$(key '.icons["16"]')" +mimetype=$(file -bN --mime-type $ICONPATH) +content=$(cat $ICONPATH | base64 -w0) +DATAURL="data:$mimetype;base64,$content" + +US=$OUTDIR/main.user.js +echo "// ==UserScript==" > $US +echo "// @name $(key '.name')" >> $US +echo "// @version $(key '.version')" >> $US +echo "// @description $(key '.description')" >> $US +echo "// @author $(key '.author')" >> $US +echo "// @iconURL $DATAURL" >> $US +key ".content_scripts[0].matches | map(\"// @match \"+.) | .[]" >> $US +key ".optional_permissions | map(\"// @match \"+.) | .[]" >> $US +echo "// ==/UserScript==" >> $US +# | uglifyjs -c +cat $(key ".content_scripts[0].js | map(\"$PTH/\"+.) | .[]") >> $US + +USERSCRIPT_OPTIONS=$(cat "$PTH/userscript-options.js") + +OPTIONS_HTML=$(cat "$PTH/options_page.html" | base64) +OPTIONS_CSS=$(cat "$PTH/options_page.css" | base64) +OPTIONS_PAGE_JS=$(cat "$PTH/options_page.js" | base64) +OPTIONS_JS=$(cat "$PTH/options.js" | base64) +BROWSER_POLYFILL_JS=$(cat "$PTH/userscript-polyfill.js" "$PTH/browser-polyfill.js" | base64) + +FINAL=$(echo "${USERSCRIPT_OPTIONS//__OPTIONS_HTML__/$OPTIONS_HTML}") +FINAL=$(echo "${FINAL//__OPTIONS_CSS__/$OPTIONS_CSS}") +FINAL=$(echo "${FINAL//__OPTIONS_JS__/$OPTIONS_JS}") +FINAL=$(echo "${FINAL//__OPTIONS_PAGE_JS__/$OPTIONS_PAGE_JS}") +FINAL=$(echo "${FINAL//__BROWSER_POLYFILL_JS__/$BROWSER_POLYFILL_JS}") + +# echo "$FINAL" > "$OUTDIR/userscript-options.js" +echo "" >> $US +echo "" >> $US +echo "" >> $US +echo "$FINAL" >> $US